exempi-2.2.1/0000775000175000017500000000000012163706253010013 500000000000000exempi-2.2.1/missing0000755000175000017500000002623311657666561011354 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; tar*) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar*) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: exempi-2.2.1/autogen.sh0000775000175000017500000000146212144603625011735 00000000000000#!/bin/sh # # part of libopenraw # topsrcdir=`dirname $0` if test x$topsrcdir = x ; then topsrcdir=. fi builddir=`pwd` AUTOCONF=autoconf if test -x /usr/bin/glibtool ; then LIBTOOL=glibtool else LIBTOOL=libtool fi if test -x /usr/bin/glibtoolize ; then LIBTOOLIZE=glibtoolize else LIBTOOLIZE=libtoolize fi AUTOMAKE=automake ACLOCAL=aclocal cd $topsrcdir rm -f autogen.err $LIBTOOLIZE --force $ACLOCAL -I m4 >> autogen.err 2>&1 #autoheader --force $AUTOMAKE --add-missing --copy --foreign $AUTOCONF cd $builddir if test -z "$*"; then echo "I am going to run ./configure with --enable-maintainer-mode" echo "If you wish to pass any to it, please specify them on " echo "the $0 command line." fi echo "Running configure..." $topsrcdir/configure --enable-maintainer-mode "$@" exempi-2.2.1/public/0000775000175000017500000000000012163706253011271 500000000000000exempi-2.2.1/public/Makefile.in0000664000175000017500000004705412150231001013244 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = public SUBDIRS = DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ DIST_SUBDIRS = include all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign public/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign public/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ cscopelist cscopelist-recursive ctags ctags-recursive \ distclean distclean-generic distclean-libtool distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/public/Makefile.am0000664000175000017500000000306112144603625013243 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # DIST_SUBDIRS = includeexempi-2.2.1/public/include/0000775000175000017500000000000012163706253012714 500000000000000exempi-2.2.1/public/include/TXMPIterator.hpp0000664000175000017500000003021511745673651015662 00000000000000#ifndef __TXMPIterator_hpp__ #define __TXMPIterator_hpp__ 1 #if ( ! __XMP_hpp__ ) #error "Do not directly include, use XMP.hpp" #endif // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // ================================================================================================= /// \file TXMPIterator.hpp /// \brief API for access to the XMP Toolkit iteration services. /// /// \c TXMPIterator is the template class providing iteration services for the XMP Toolkit. It must /// be instantiated with a string class such as \c std::string. See the instructions in XMP.hpp, and /// the Overview for a discussion of the overall architecture of the XMP API. // ================================================================================================= // ================================================================================================= /// \class TXMPIterator TXMPIterator.hpp /// @brief API for access to the XMP Toolkit iteration services. /// /// \c TXMPIterator provides a uniform means to iterate over the schema and properties within an XMP /// object. \c TXMPIterator is a template class which must be instantiated with a string class such /// as \c std::string. See the instructions in XMP.hpp, and the Overview for a discussion of the /// overall architecture of the XMP API. Access these functions through the concrete class, /// \c SXMPIterator. /// /// @note Only XMP object iteration is currently available. Future development may include iteration /// over global tables, such as registered namespaces. /// /// To understand how iteration works, you should have a thorough understanding of the XMP data /// tree, as described in the XMP Specification Part 1. You might also find it helpful to create /// some complex XMP and examine the output of \c TXMPMeta::DumpObject(). /// /// \li The top of the XMP data tree is a single root node. This does not explicitly appear in the /// dump and is never visited by an iterator; that is, it is never returned from /// \c TXMPIterator::Next(). /// /// \li Beneath the root are schema nodes; these collect the top-level properties in the same /// namespace. They are created and destroyed implicitly. /// /// \li Beneath the schema nodes are the property nodes. The nodes below a property node depend on /// its type (simple, struct, or array) and whether it has qualifiers. /// /// A \c TXMPIterator constructor defines a starting point for the iteration, and options that /// control how it proceeds. By default, iteration starts at the root and visits all nodes beneath /// it in a depth-first manner. The root node iteself is not visited; the first visited node is a /// schema node. You can provide a schema name or property path to select a different starting node. /// By default, this visits the named root node first then all nodes beneath it in a depth-first /// manner. /// /// The function \c TXMPIterator::Next() delivers the schema URI, path, and option flags for the /// node being visited. If the node is simple, it also delivers the value. Qualifiers for this node /// are visited next. The fields of a struct or items of an array are visited after the qualifiers /// of the parent. /// /// You can specify options when contructing the iteration object to control how the iteration is /// performed. /// /// \li \c #kXMP_IterJustChildren - Visit just the immediate children of the root. Skip the root /// itself and all nodes below the immediate children. This omits the qualifiers of the immediate /// children, the qualifier nodes being below what they qualify. /// \li \c #kXMP_IterJustLeafNodes - Visit just the leaf property nodes and their qualifiers. /// \li \c #kXMP_IterJustLeafName - Return just the leaf component of the node names. The default /// is to return the full path name. /// \li \c #kXMP_IterOmitQualifiers - Do not visit the qualifiers of a node. // ================================================================================================= #include "client-glue/WXMPIterator.hpp" template class TXMPIterator { public: // --------------------------------------------------------------------------------------------- /// @brief Assignment operator, assigns the internal ref and increments the ref count. /// /// Assigns the internal reference from an existing object and increments the reference count on /// the underlying internal XMP iterator. /// /// @param rhs An existing iteration object. void operator= ( const TXMPIterator & rhs ); // --------------------------------------------------------------------------------------------- /// @brief Copy constructor, creates a client object refering to the same internal object. /// /// Creates a new client iterator that refers to the same underlying iterator as an existing object. /// /// @param original An existing iteration object to copy. TXMPIterator ( const TXMPIterator & original ); // --------------------------------------------------------------------------------------------- /// @brief Constructs an iterator for properties within a schema in an XMP object. /// /// See the class description for the general operation of an XMP object iterator. /// Overloaded forms are provided to iterate the entire data tree, /// a subtree rooted at a specific node, or properties within a specific schema. /// /// @param xmpObj The XMP object over which to iterate. /// /// @param schemaNS Optional schema namespace URI to restrict the iteration. To visit all of the /// schema, pass 0 or the empty string "". /// /// @param propName Optional property name to restrict the iteration. May be an arbitrary path /// expression. If provided, a schema URI must also be provided. To visit all properties, pass 0 /// or the empty string "". /// /// @param options Option flags to control the iteration. A logical OR of these bit flag constants: /// \li \c #kXMP_IterJustChildren - Visit only the immediate children of the root; default visits subtrees. /// \li \c #kXMP_IterJustLeafNodes - Visit only the leaf nodes; default visits all nodes. /// \li \c #kXMP_IterJustLeafName - Return just the leaf part of the path; default returns the full path. /// \li \c #kXMP_IterOmitQualifiers - Omit all qualifiers. /// /// @return The new TXMPIterator object. TXMPIterator ( const TXMPMeta & xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief Constructs an iterator for a subtree of properties within an XMP object. /// /// See the class description for the general operation of an XMP object iterator. Overloaded /// forms are provided to iterate the entire data tree, a subtree rooted at a specific node, or /// properties within a specific schema. /// /// @param xmpObj The XMP object over which to iterate. /// /// @param schemaNS Optional schema namespace URI to restrict the iteration. To visit all of the /// schema, pass 0 or the empty string "". /// /// @param options Option flags to control the iteration. A logical OR of these bit flag constants: /// \li \c #kXMP_IterJustChildren - Visit only the immediate children of the root; default visits subtrees. /// \li \c #kXMP_IterJustLeafNodes - Visit only the leaf nodes; default visits all nodes. /// \li \c #kXMP_IterJustLeafName - Return just the leaf part of the path; default returns the full path. /// \li \c #kXMP_IterOmitQualifiers - Omit all qualifiers. /// /// @return The new TXMPIterator object. TXMPIterator ( const TXMPMeta & xmpObj, XMP_StringPtr schemaNS, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief Constructs an iterator for the entire data tree within an XMP object. /// /// See the class description for the general operation of an XMP object iterator. Overloaded /// forms are provided to iterate the entire data tree, a subtree rooted at a specific node, or /// properties within a specific schema. /// /// @param xmpObj The XMP object over which to iterate. /// /// @param options Option flags to control the iteration. A logical OR of these bit flag constants: /// \li \c #kXMP_IterJustChildren - Visit only the immediate children of the root; default visits subtrees. /// \li \c #kXMP_IterJustLeafNodes - Visit only the leaf nodes; default visits all nodes. /// \li \c #kXMP_IterJustLeafName - Return just the leaf part of the path; default returns the full path. /// \li \c #kXMP_IterOmitQualifiers - Omit all qualifiers. /// /// @return The new \c TXMPIterator object. TXMPIterator ( const TXMPMeta & xmpObj, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief Constructs an iterator for the global tables of the XMP toolkit. Not implemented. TXMPIterator ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options ); // --------------------------------------------------------------------------------------------- /// @brief Destructor, typical virtual destructor. virtual ~TXMPIterator() throw(); // --------------------------------------------------------------------------------------------- /// @brief \c Next() visits the next node in the iteration. /// /// Proceeds to the next node according to the options specified on creation of this object, and /// delivers the schema URI, path, and option flags for the node being visited. If the node is /// simple, it also delivers the value. /// /// @param schemaNS [out] A string object in which to return the assigned the schema namespace /// URI of the current property. Can be null if the value is not wanted. /// /// @param propPath [out] A string object in which to return the XPath name of the current /// property. Can be null if the value is not wanted. /// /// @param propValue [out] A string object in which to return the value of the current /// property. Can be null if the value is not wanted. /// /// @param options [out] A buffer in which to return the flags describing the current property, /// which are a logical OR of \c #XMP_OptionBits bit-flag constants. /// /// @return True if there was another node to visit, false if the iteration is complete. bool Next ( tStringObj * schemaNS = 0, tStringObj * propPath = 0, tStringObj * propValue = 0, XMP_OptionBits * options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c Skip() skips some portion of the remaining iterations. /// /// @param options Option flags to control the iteration, a logical OR of these bit-flag /// constants: /// \li \c #kXMP_IterSkipSubtree - Skip the subtree below the current node. /// \li \c #kXMP_IterSkipSiblings - Skip the subtree below and remaining siblings of the current node. void Skip ( XMP_OptionBits options ); private: XMPIteratorRef iterRef; TXMPIterator(); // ! Hidden, must choose property or table iteration. static void SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen ); }; // class TXMPIterator // ================================================================================================= #endif // __TXMPIterator_hpp__ exempi-2.2.1/public/include/TXMPUtils.hpp0000664000175000017500000014131211745673651015172 00000000000000#ifndef __TXMPUtils_hpp__ #define __TXMPUtils_hpp__ 1 #if ( ! __XMP_hpp__ ) #error "Do not directly include, use XMP.hpp" #endif // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // ================================================================================================= /// \file TXMPUtils.hpp /// \brief API for access to the XMP Toolkit utility services. /// /// \c TXMPUtils is the template class providing utility services for the XMP Toolkit. It must be /// instantiated with a string class such as \c std::string. See the instructions in XMP.hpp, and /// the Overview for a discussion of the overall architecture of the XMP API. // ================================================================================================= // ================================================================================================= /// \class TXMPUtils TXMPUtils.hpp /// @brief API for access to the XMP Toolkit utility services. /// /// \c TXMPUtils is a template class which must be instantiated with a string class such as /// \c std::string. See the instructions in XMP.hpp, and the Overview for a discussion of the overall /// architecture of the XMP API. /// /// This class defines helper functions that support the basic metadata manipulation provided by /// \c TXMPMeta. All of the functions are static; that is, you call them directly from the concrete /// class (\c SXMPUtils), which is never itself instantiated. /// /// General categories of utilities include: /// /// \li Composing complex path expressions, which you can then pass to the property access /// functions in \c TXMPMeta /// \li Converting between binary and string forms of property values /// \li Manipulating date/time values /// \li Encoding and decoding base-64 strings /// \li JPEG file handling /// \li Editing aids for creating a user interface for the XMP Toolkit // ================================================================================================= template class TXMPUtils { public: // ============================================================================================= // No constructors or destructor declared or needed // ================================================ // ============================================================================================ /// \name Path composition /// @{ /// /// These functions provide support for composing path expressions to deeply nested properties. /// The functions in \c TXMPMeta such as \c TXMPMeta::GetProperty(), /// \c TXMPMeta::GetArrayItem(), and \c TXMPMeta::GetStructField() provide easy access to top level /// simple properties, items in top level arrays, and fields of top level structs. They are /// not as convenient for more complex things, such as fields several levels deep in a complex /// struct, or fields within an array of structs, or items of an array that is a field of a /// struct. You can use these utility functions to compose these paths, which you can then pass /// to the property access functions. You can also compose paths to top-level array items or /// struct fields so that you can use the binary accessors such as /// \c TXMPMeta::GetProperty_Int(). /// /// You can use these functions is to compose a complete path expression, or all but the last /// component. For example, suppose you have a property that is an array of integers within a /// struct. You can access one of the array items like this: /// ///
    ///   SXMPUtils::ComposeStructFieldPath ( schemaNS, "Struct", fieldNS, "Array", &path );
    ///   SXMPUtils::ComposeArrayItemPath ( schemaNS, path, index, &path );
    ///   exists = xmpObj.GetProperty_Int ( schemaNS, path, &value, &options );
    /// 
/// /// You could also use this code if you want the string form of the integer: /// ///
    ///   SXMPUtils::ComposeStructFieldPath ( schemaNS, "Struct", fieldNS, "Array", &path );
    ///   xmpObj.GetArrayItem ( schemaNS, path, index, &value, &options );
    /// 
/// /// \note It might look confusing that the \c schemaNS is passed in all of the calls above. This /// is because the XMP Toolkit keeps the top-level "schema" namespace separate from the rest of /// the path expression. // --------------------------------------------------------------------------------------------- /// @brief \c ComposeArrayItemPath() composes the path expression for an item in an array. /// /// The returned string is in the form ns:arrayName[i], where "ns" is the prefix for /// the specified namespace, and "i" is the decimal representation of specified item index. /// If the last item was specified, the path is ns:arrayName[last()]. /// /// @param schemaNS The namespace URI for the array; see \c GetProperty(). /// /// @param arrayName The name of the array. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param itemIndex The 1-based index of the desired item. Use the macro /// \c #kXMP_ArrayLastItem to specify the last existing array item. /// /// @param fullPath [out] A string in which to return the composed path. static void ComposeArrayItemPath ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, tStringObj * fullPath ); // --------------------------------------------------------------------------------------------- /// @brief \c ComposeStructFieldPath() composes the path expression for a field in a struct. /// /// The returned string is in the form ns:structName/fNS:fieldName, where "ns" is the /// prefix for the schema namespace, and "fNS" is the prefix for field namespace. /// /// @param schemaNS The namespace URI for the struct; see \c GetProperty(). /// /// @param structName The name of the struct. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param fieldNS The namespace URI for the field. Same URI and prefix usage as the /// \c schemaNS and \c structName parameters. /// /// @param fieldName The name of the field. Must be a single XML name, must not be null or the /// empty string. Same URI and prefix usage as the \c schemaNS and \c structName parameters. /// /// @param fullPath [out] A string in which to return the composed path. static void ComposeStructFieldPath ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, tStringObj * fullPath ); // --------------------------------------------------------------------------------------------- /// @brief \c ComposeQualifierPath() composes the path expression for a qualifier. /// /// The returned string is in the form ns:propName/?qNS:qualName, where "ns" is the /// prefix for the schema namespace, and "qNS" is the prefix for the qualifier namespace. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property to which the qualifier is attached. Can be a /// general path expression, must not be null or the empty string; see \c GetProperty() for /// namespace prefix usage. /// /// @param qualNS The namespace URI for the qualifier. Same URI and prefix usage as the /// \c schemaNS and \c propName parameters. /// /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or the /// empty string. Same URI and prefix usage as the \c schemaNS and \c propName parameters. /// /// @param fullPath [out] A string in which to return the composed path. static void ComposeQualifierPath ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, tStringObj * fullPath ); // --------------------------------------------------------------------------------------------- /// @brief \c ComposeLangSelector() composes the path expression to select an alternate item by language. /// /// Path syntax allows two forms of "content addressing" to select an item in an array of /// alternatives. The form used in this function lets you select an item in an alt-text array /// based on the value of its \c xml:lang qualifier. The other form of content addressing is /// shown in \c ComposeFieldSelector(). /// /// The returned string is in the form ns:arrayName[\@xml:lang='langName'], where /// "ns" is the prefix for the schema namespace /// /// This function provides a path expression that is explicitly and only for a specific /// language. In most cases, \c TXMPMeta::SetLocalizedText() and \c TXMPMeta::GetLocalizedText() /// are preferred, because they provide extra logic to choose the appropriate language and /// maintain consistency with the 'x-default' value. /// /// @param schemaNS The namespace URI for the array; see \c GetProperty(). /// /// @param arrayName The name of the array. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param langName The RFC 3066 code for the desired language, as a null-terminated UTF-8 string. /// /// @param fullPath [out] A string in which to return the composed path. static void ComposeLangSelector ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr langName, tStringObj * fullPath ); // --------------------------------------------------------------------------------------------- /// @brief \c ComposeLangSelector() composes a path expression to select an alternate item by language. /// /// Path syntax allows two forms of "content addressing" to select an item in an array of /// alternatives. The form used in this function lets you select an item in an alt-text array /// based on the value of its \c xml:lang qualifier. The other form of content addressing is /// shown in \c ComposeFieldSelector(). /// /// The returned string is in the form ns:arrayName[\@xml:lang='langName'], where /// "ns" is the prefix for the schema namespace /// /// This function provides a path expression that is explicitly and only for a specific /// language. In most cases, \c TXMPMeta::SetLocalizedText() and \c TXMPMeta::GetLocalizedText() /// are preferred, because they provide extra logic to choose the appropriate language and /// maintain consistency with the 'x-default' value. /// /// @param schemaNS The namespace URI for the array; see \c GetProperty(). /// /// @param arrayName The name of the array. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param langName The RFC 3066 code for the desired language, as a string object. /// /// @param fullPath [out] A string in which to return the composed path. static void ComposeLangSelector ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, const tStringObj & langName, tStringObj * fullPath ); // --------------------------------------------------------------------------------------------- /// @brief \c ComposeFieldSelector() composes a path expression to select an alternate item by a field's value. /// /// Path syntax allows two forms of "content addressing" to select an item in an array of /// alternatives. The form used in this function lets you select an item in an array of structs /// based on the value of one of the fields in the structs. The other form of content addressing /// is shown in \c ComposeLangSelector(). /// /// For example, consider a simple struct that has two fields, the name of a city and the URI of /// an FTP site in that city. Use this to create an array of download alternatives. You can show /// the user a popup built from the values of the city fields, then get the corresponding URI as /// follows: ///
    ///   ComposeFieldSelector ( schemaNS, "Downloads", fieldNS, "City", chosenCity, &path );
    ///   exists = GetStructField ( schemaNS, path, fieldNS, "URI", &uri );
    /// 
/// /// The returned string is in the form ns:arrayName[fNS:fieldName='fieldValue'], where /// "ns" is the prefix for the schema namespace and "fNS" is the prefix for the field namespace. /// /// @param schemaNS The namespace URI for the array; see \c GetProperty(). /// /// @param arrayName The name of the array. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param fieldNS The namespace URI for the field used as the selector. Same URI and prefix /// usage as the \c schemaNS and \c arrayName parameters. /// /// @param fieldName The name of the field used as the selector. Must be a single XML name, must /// not be null or the empty string. It must be the name of a field that is itself simple. /// /// @param fieldValue The desired value of the field, specified as a null-terminated UTF-8 string. /// /// @param fullPath [out] A string in which to return the composed path. static void ComposeFieldSelector ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, tStringObj * fullPath ); // --------------------------------------------------------------------------------------------- /// @brief \c ComposeFieldSelector() composes a path expression to select an alternate item by a field's value. /// /// Path syntax allows two forms of "content addressing" to select an item in an array of /// alternatives. The form used in this function lets you select an item in an array of structs /// based on the value of one of the fields in the structs. The other form of content addressing /// is shown in \c ComposeLangSelector(). /// /// For example, consider a simple struct that has two fields, the name of a city and the URI of /// an FTP site in that city. Use this to create an array of download alternatives. You can show /// the user a popup built from the values of the city fields, then get the corresponding URI as /// follows: ///
    ///   ComposeFieldSelector ( schemaNS, "Downloads", fieldNS, "City", chosenCity, &path );
    ///   exists = GetStructField ( schemaNS, path, fieldNS, "URI", &uri );
    /// 
/// /// The returned string is in the form ns:arrayName[fNS:fieldName='fieldValue'], where /// "ns" is the prefix for the schema namespace and "fNS" is the prefix for the field namespace. /// /// @param schemaNS The namespace URI for the array; see \c GetProperty(). /// /// @param arrayName The name of the array. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param fieldNS The namespace URI for the field used as the selector. Same URI and prefix /// usage as the \c schemaNS and \c arrayName parameters. /// /// @param fieldName The name of the field used as the selector. Must be a single XML name, must /// not be null or the empty string. It must be the name of a field that is itself simple. /// /// @param fieldValue The desired value of the field, specified as a string object. /// /// @param fullPath [out] A string in which to return the composed path. static void ComposeFieldSelector ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, const tStringObj & fieldValue, tStringObj * fullPath ); /// @} // ============================================================================================= /// \name Conversion between binary types and strings /// @{ /// /// The main accessors in \c TXMPMeta set and retrieve property values as strings. additional /// functions, such as \c TXMPMeta::SetPropertyInt(), set and retrieve property values as /// explicit binary data types. Use these functions to convert between binary and string /// values. /// /// Strings can be specified as null-terminated UTF-8 (\c #XMP_StringPtr), or as string /// objects (\c tStringObj) of the type declared when instantiating the XMP classes; see /// \c XMP.hpp. Alternate forms of each conversion function allow either type of string. // --------------------------------------------------------------------------------------------- /// @brief \c ConvertFromBool() converts a Boolean value to a string. /// /// The string values of Booleans are returned by the macros \c #kXMP_TrueStr and /// \c #kXMP_FalseStr in \c XMP_Const.h. /// /// @param binValue The Boolean value to be converted. /// /// @param strValue [out] A buffer in which to return the string representation of the value. static void ConvertFromBool ( bool binValue, tStringObj * strValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertFromInt() converts a 32-bit integer value to a string. /// /// @param binValue The integer value to be converted. /// /// @param format Optional. A C \c sprintf format for the conversion. Default is "%d". /// /// @param strValue [out] A buffer in which to return the string representation of the value. static void ConvertFromInt ( long binValue, XMP_StringPtr format, tStringObj * strValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertFromInt64() converts a 64-bit integer value to a string. /// /// @param binValue The integer value to be converted. /// /// @param format Optional. A C \c sprintf format for the conversion. Default is "%d". /// /// @param strValue [out] A buffer in which to return the string representation of the value. static void ConvertFromInt64 ( long long binValue, XMP_StringPtr format, tStringObj * strValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertFromFloat() converts a floating-point value to a string. /// /// @param binValue The floating-point value to be converted. /// /// @param format Optional. A C \c sprintf format for the conversion. Default is "%d". /// /// @param strValue [out] A buffer in which to return the string representation of the value. static void ConvertFromFloat ( double binValue, XMP_StringPtr format, tStringObj * strValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertFromDate() converts a date/time value to a string. /// /// Formats a date according to the ISO 8601 profile in http://www.w3.org/TR/NOTE-datetime: ///
    ///   YYYY
    ///   YYYY-MM
    ///   YYYY-MM-DD
    ///   YYYY-MM-DDThh:mmTZD
    ///   YYYY-MM-DDThh:mm:ssTZD
    ///   YYYY-MM-DDThh:mm:ss.sTZD
    /// 
/// /// \c YYYY = four-digit year, formatted as "%.4d"
/// \c MM = two-digit month (01=January)
/// \c DD = two-digit day of month (01 through 31)
/// \c hh = two digits of hour (00 through 23)
/// \c mm = two digits of minute (00 through 59)
/// \c ss = two digits of second (00 through 59)
/// \c s = one or more digits representing a decimal fraction of a second
/// \c TZD = time zone designator (Z or +hh:mm or -hh:mm) /// /// Time-only input is allowed where the year, month, and day are all zero. This is output as /// "0000-00-00...". /// /// @note ISO 8601 does not allow years less than 1000 or greater than 9999. This API allows /// any year, even negative ones. The W3C profile also requires a time zone designator if a time /// is present, this API treats the time zone designator as optional. The XMP_DateTime type has /// an explicit notion of zone-less time. /// /// @param binValue The date/time value to be converted. /// /// @param strValue [out] A buffer in which to return the ISO 8601 string representation of the date/time. static void ConvertFromDate ( const XMP_DateTime & binValue, tStringObj * strValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertToBool() converts a string to a Boolean value. /// /// The preferred strings are those returned by the macros \c #kXMP_TrueStr and \c #kXMP_FalseStr. /// If these do not match, the function does a case insensitive comparison, then simply 't' or 'f', /// and finally non-zero and zero integer representations. /// /// @param strValue The string representation of the value, specified as a null-terminated UTF-8 string. /// /// @return The appropriate C++ bool value for the string. static bool ConvertToBool ( XMP_StringPtr strValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertToBool() converts a string to a Boolean value. /// /// Overloads the basic form of the function, allowing you to pass a string object, /// rather than a const * char. It is otherwise identical; see details in the canonical form. /// /// @param strValue The string representation of the value, specified as a string object. /// /// @return The appropriate C++ bool value for the string. static bool ConvertToBool ( const tStringObj & strValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertToInt() converts a string to a 32-bit integer value. /// /// @param strValue The string representation of the value, specified as a null-terminated UTF-8 string. /// /// @return The 32-bit integer value. static long ConvertToInt ( XMP_StringPtr strValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertToInt() converts a string to a 32-bit integer value. /// /// Overloads the basic form of the function, allowing you to pass a string object, /// rather than a const * char. It is otherwise identical. /// /// @param strValue The string representation of the value, specified as a string object. /// /// @return The 32-bit integer value. static long ConvertToInt ( const tStringObj & strValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertToInt64() converts a string to a 64-bit integer value. /// /// @param strValue The string representation of the value, specified as a null-terminated UTF-8 string. /// /// @return The 64-bit integer value. static long long ConvertToInt64 ( XMP_StringPtr strValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertToInt64() converts a string to a 64-bit integer value. /// /// Overloads the basic form of the function, allowing you to pass a string object, /// rather than a const * char. It is otherwise identical. /// /// @param strValue The string representation of the value, specified as a string object. /// /// @return The 64-bit integer value. static long long ConvertToInt64 ( const tStringObj & strValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertToFloat() converts a string to a floating-point value. /// /// @param strValue The string representation of the value, specified as a null-terminated UTF-8 string. /// /// @return The floating-point value. static double ConvertToFloat ( XMP_StringPtr strValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertToFloat() converts a string to a floating-point value. /// /// Overloads the basic form of the function, allowing you to pass a string object, /// rather than a const * char. It is otherwise identical. /// /// @param strValue The string representation of the value, specified as a string object. /// /// @return The floating-point value. static double ConvertToFloat ( const tStringObj & strValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertToDate() converts a string to a date/time value. /// /// Parses a date according to the ISO 8601 profile in http://www.w3.org/TR/NOTE-datetime: ///
    ///   YYYY
    ///   YYYY-MM
    ///   YYYY-MM-DD
    ///   YYYY-MM-DDThh:mmTZD
    ///   YYYY-MM-DDThh:mm:ssTZD
    ///   YYYY-MM-DDThh:mm:ss.sTZD
    /// 
/// /// \c YYYY = four-digit year, formatted as "%.4d"
/// \c MM = two-digit month (01=January)
/// \c DD = two-digit day of month (01 through 31)
/// \c hh = two digits of hour (00 through 23)
/// \c mm = two digits of minute (00 through 59)
/// \c ss = two digits of second (00 through 59)
/// \c s = one or more digits representing a decimal fraction of a second
/// \c TZD = time zone designator (Z or +hh:mm or -hh:mm) /// /// A missing date portion or missing TZD are tolerated. A missing date value can begin with /// "Thh:" or "hh:"; the year, month, and day are all set to zero in the \c #XMP_DateTime value. /// A missing TZD is assumed to be UTC. /// /// @note ISO 8601 does not allow years less than 1000 or greater than 9999. This API allows /// any year, even negative ones. The W3C profile also requires a time zone designator if a time /// is present, this API treats the time zone designator as optional. The XMP_DateTime type has /// an explicit notion of zone-less time. /// /// @param strValue The ISO 8601 string representation of the date/time, specified as a /// null-terminated UTF-8 string. /// /// @param binValue [out] A buffer in which to return the binary date/time value. static void ConvertToDate ( XMP_StringPtr strValue, XMP_DateTime * binValue ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertToDate() converts a string to a date/time value. /// /// Overloads the basic form of the function, allowing you to pass a string object, /// rather than a const * char. It is otherwise identical. /// See details for the canonical form. /// /// /// @param strValue The ISO 8601 string representation of the date/time, specified as a string /// object. /// /// @param binValue [out] A buffer in which to return the binary date/time value. static void ConvertToDate ( const tStringObj & strValue, XMP_DateTime * binValue ); /// @} // ============================================================================================= /// \name Date-time manipulation /// @{ /// /// In addition to the type-conversion functions that convert between strings and binary /// date-time values, these functions create, manipulate, and compare date-time values. // --------------------------------------------------------------------------------------------- /// @brief \c CurrentDateTime() obtains the current date and time. /// /// Creates and returns a binary \c #XMP_DateTime value. The returned time is UTC, properly /// adjusted for the local time zone. The resolution of the time is not guaranteed to be finer /// than seconds. /// /// @param time [out] A buffer in which to return the date/time value. static void CurrentDateTime ( XMP_DateTime * time ); // --------------------------------------------------------------------------------------------- /// @brief \c SetTimeZone() sets the time zone in a date/time value to the local time zone. /// /// Any existing time zone value is replaced. The other date/time fields are not adjusted in any way. /// /// @param time A pointer to the date-time value, which is modified in place. static void SetTimeZone ( XMP_DateTime * time ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertToUTCTime() ensures that a time is UTC. /// /// If the time zone is not UTC, the time is adjusted and the time zone set to be UTC. The value /// is not modified if the time zone is already UTC or if the value has no time zone. /// /// @param time A pointer to the date-time value, which is modified in place. static void ConvertToUTCTime ( XMP_DateTime * time ); // --------------------------------------------------------------------------------------------- /// @brief \c ConvertToLocalTime() ensures that a time is local. /// /// If the time zone is not the local zone, the time is adjusted and the time zone set to be local. /// The value is not modified if the time zone is already the local zone or if the value has no /// time zone. /// /// @param time A pointer to the date-time value, which is modified in place. static void ConvertToLocalTime ( XMP_DateTime * time ); // --------------------------------------------------------------------------------------------- /// @brief \c CompareDateTime() compares the order of two date/time values. /// /// Both values are treated as in the same time zone if either has no time zone. /// /// @param left The left-side date/time value. /// /// @param right The right-side date/time value. /// /// @return An integer indicating the order: /// \li -1 if left is earlier than right /// \li 0 if left matches right /// \li +1 if left is later than right static int CompareDateTime ( const XMP_DateTime & left, const XMP_DateTime & right ); /// @} // ============================================================================================= /// \name Base64 encoding and decoding /// @{ /// /// These functions convert between raw data values and Base64-encoded strings. // --------------------------------------------------------------------------------------------- /// @brief \c EncodeToBase64() converts a raw data value to a Base64-encoded string. /// /// @param rawStr An \c #XMP_StringPtr (char *) string containing the raw data to be converted. /// /// @param rawLen The number of characters of raw data to be converted. /// /// @param encodedStr [out] A string object in which to return the encoded string. static void EncodeToBase64 ( XMP_StringPtr rawStr, XMP_StringLen rawLen, tStringObj * encodedStr ); // --------------------------------------------------------------------------------------------- /// @brief \c EncodeToBase64() converts a raw data value passed in a string object to a Base64-encoded string. /// /// Overloads the basic form of the function, allowing you to pass a string object as input. /// It is otherwise identical. /// /// @param rawStr A string object containing the raw data to be converted. /// /// @param encodedStr [out] A string object in which to return the encoded string. static void EncodeToBase64 ( const tStringObj & rawStr, tStringObj * encodedStr ); // --------------------------------------------------------------------------------------------- /// @brief \c DecodeFromBase64() Decodes a Base64-encoded string to raw data. /// /// @param encodedStr An \c #XMP_StringPtr (char *) string containing the encoded data to be converted. /// /// @param encodedLen The number of characters of raw data to be converted. /// /// @param rawStr [out] A string object in which to return the decoded data. static void DecodeFromBase64 ( XMP_StringPtr encodedStr, XMP_StringLen encodedLen, tStringObj * rawStr ); // --------------------------------------------------------------------------------------------- /// @brief \c DecodeFromBase64() Decodes a Base64-encoded string, passed as a string object, to raw data. /// /// Overloads the basic form of the function, allowing you to pass a string object as input. /// It is otherwise identical. /// /// @param encodedStr An string object containing the encoded data to be converted. /// /// @param rawStr [out] A string object in which to return the decoded data. static void DecodeFromBase64 ( const tStringObj & encodedStr, tStringObj * rawStr ); /// @} // ============================================================================================= // ============================================================================================= /// \name JPEG file handling /// @{ /// /// These functions support the partitioning of XMP in JPEG files into standard and extended /// portions in order to work around the 64KB size limit of JPEG marker segments. /// /// @note (Doc note) Add detail about how to write out and read back extended data // --------------------------------------------------------------------------------------------- /// @brief \c PackageForJPEG() creates XMP serializations appropriate for a JPEG file. /// /// The standard XMP in a JPEG file is limited to 64K bytes. This function serializes the XMP /// metadata in an XMP object into a string of RDF (see \c TXMPMeta::SerializeToBuffer()). If /// the data does not fit into the 64K byte limit, it creates a second packet string with the /// extended data. /// /// @param xmpObj The XMP object containing the metadata. /// /// @param standardXMP [out] A string object in which to return the full standard XMP packet. /// /// @param extendedXMP [out] A string object in which to return the serialized extended XMP, /// empty if not needed. /// /// @param extendedDigest [out] A string object in which to return an MD5 digest of the serialized /// extended XMP, empty if not needed. /// /// @see \c MergeFromJPEG() static void PackageForJPEG ( const TXMPMeta & xmpObj, tStringObj * standardXMP, tStringObj * extendedXMP, tStringObj * extendedDigest ); // --------------------------------------------------------------------------------------------- /// @brief \c MergeFromJPEG() merges standard and extended XMP retrieved from a JPEG file. /// /// When an extended partition stores properties that do not fit into the JPEG file limitation /// of 64K bytes, this function integrates those properties back into the same XMP object with /// those from the standard XMP packet. /// /// @param fullXMP [in, out] An XMP object which the caller has initialized from the standard /// XMP packet in a JPEG file. The extended XMP is added to this object. /// /// @param extendedXMP An XMP object which the caller has initialized from the extended XMP /// packet in a JPEG file. /// /// @see \c PackageForJPEG() static void MergeFromJPEG ( TXMPMeta * fullXMP, const TXMPMeta & extendedXMP ); /// @} // ============================================================================================= /// \name Editing utilities /// @{ /// /// These functions are useful in implementing a user interface for editing XMP. They /// convert sets of property values to and from displayable and manipulable strings, and perform /// operations on sets of metadata, such as those available from the File Info dialog box. // --------------------------------------------------------------------------------------------- /// @brief \c CatenateArrayItems() creates a single edit string from a set of array item values. /// /// Collects the values of all items in an array into a single string, using a specified /// separation string. Each item in the specified array must be a simple string value. /// /// @param xmpObj The XMP object containing the array to be catenated. /// /// @param schemaNS The schema namespace URI for the array. Must not be null or the empty string. /// /// @param arrayName The name of the array. May be a general path expression, must not be null /// or the empty string. /// /// @param separator The string with which to separate the items in the catenated string. /// Defaults to "; ", ASCII semicolon and space (U+003B, U+0020). /// /// @param quotes The character or characters to use as quotes around array items that contain a /// separator. Defaults to the double-quote character ("), ASCII quote (U+0022). /// /// @param options Option flags to control the catenation. <> /// /// @param catedStr [out] A string object in which to return the catenated array items. /// /// @see \c SeparateArrayItems() static void CatenateArrayItems ( const TXMPMeta & xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr separator, XMP_StringPtr quotes, XMP_OptionBits options, tStringObj * catedStr ); // --------------------------------------------------------------------------------------------- /// @brief \c SeparateArrayItems() updates an array from a concatenated edit string of values. /// /// This reverses the action of \c CatenateArrayItems(), separating out individual array items /// from the edit string and updating the array with the new values. Each item in the array must /// be a simple string value. /// /// @param xmpObj The XMP object containing the array to be updated. /// /// @param schemaNS The schema namespace URI for the array. Must not be null or the empty string. /// /// @param arrayName The name of the array. May be a general path expression, must not be null /// or the empty string. /// /// @param options Option flags to control the separation. <> /// /// @param catedStr The concatenated array items, as created by \c CatenateArrayItems(), /// specified as a null-terminated UTF-8 string. static void SeparateArrayItems ( TXMPMeta * xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, XMP_StringPtr catedStr ); // --------------------------------------------------------------------------------------------- /// @brief \c SeparateArrayItems() updates an array from a concatenated edit string of values. /// /// Overloads the basic form of the function, allowing you to pass a string object in which /// to return the concatenated string. It is otherwise identical; see details for the canonical form. /// static void SeparateArrayItems ( TXMPMeta * xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, const tStringObj & catedStr ); /// @brief \c ApplyTemplate() modifies a working XMP object according to a template object. /// /// The XMP template can be used to add, replace or delete properties from the working XMP object. /// This function replaces the previous \c AppendProperties() function, which is no longer available. /// The actions that you specify determine how the template is applied. Each action can be applied /// individually or combined; if you do not specify any actions, the properties and values in the working /// XMP object do not change. /// /// These actions are available: /// \li Clear (\c #kXMPTemplate_ClearUnnamedProperties): Deletes top-level properties. /// Any top-level property that is present in the template (even with empty value) /// is retained. All other top-level properties in the working object are deleted. /// /// \li Add (\c #kXMPTemplate_AddNewProperties): Adds new properties to the working object if the /// template properties have values. See additional detail below. /// /// \li Replace (\c #kXMPTemplate_ReplaceExistingProperties): Replaces the values of existing top-level /// properties in the working XMP if the value forms match those in the template. Properties /// with empty values in the template are ignored. If combined with Clear or Add actions, /// those take precedence; values are cleared or added, rather than replaced. /// /// \li Replace/Delete empty (\c #kXMPTemplate_ReplaceWithDeleteEmpty): Replaces values in the same way /// as the simple Replace action, and also deletes properties if the value in the template is empty. /// If combined with Clear or Add actions, those take precedence; values are cleared or added, /// rather than replaced. /// /// \li Include internal (\c #kXMPTemplate_IncludeInternalProperties): Performs specified action /// on internal properties as well as external properties. By default, internal properties /// are ignored for all actions. /// /// The Add behavior depends on the type of property: ///
    ///
  • If a top-level property is not in the working XMP, and has a value in the template, /// the property and value are added. Empty properties are not added.
  • ///
  • If a property is in both the working XMP and template, the value forms must match, otherwise /// the template is ignored for that property.
  • ///
  • If a struct is present in both the working XMP and template, the individual fields of the /// template struct are added as appropriate; that is, the logic is recursively applied to the fields. /// Struct values are equivalent if they have the same fields with equivalent values.
  • ///
  • If an array is present in both the working XMP and template, items from the template are /// added if the value forms match. Array values match if they have sets of equivalent items, /// regardless of order.
  • ///
  • Alt-text arrays use the \c xml:lang qualifier as a key, adding languages that are missing.
  • ///
/// Array item checking is n-squared; this can be time-intensive if the Replace option is /// not specified. Each source item is checked to see if it already exists in the destination, /// without regard to order or duplicates. Simple items are compared by value and \c xml:lang /// qualifier; other qualifiers are ignored. Structs are recursively compared by field names, /// without regard to field order. Arrays are compared by recursively comparing all items. /// @param workingXMP The destination XMP object. /// /// @param templateXMP The template to apply to the destination XMP object. /// /// @param actions Option flags to control the copying. If none are specified, the properties and values /// in the working XMP do not change. A logical OR of these bit-flag constants: /// \li \c #kXMPTemplate_ClearUnnamedProperties -- Delete anything that is not in the template /// \li \c #kXMPTemplate_AddNewProperties -- Add properties; see detailed description. /// \li \c #kXMPTemplate_ReplaceExistingProperties -- Replace the values of existing properties. /// \li \c #kXMPTemplate_ReplaceWithDeleteEmpty -- Replace the values of existing properties /// and delete properties if the new value is empty. /// \li \c #kXMPTemplate_IncludeInternalProperties -- Operate on internal properties as well as /// external properties. /// static void ApplyTemplate ( TXMPMeta * workingXMP, const TXMPMeta & templateXMP, XMP_OptionBits actions ); // --------------------------------------------------------------------------------------------- /// @brief \c RemoveProperties() removes multiple properties from an XMP object. /// /// The operation depends on how the namespace and property are specified: /// /// \li Non-empty \c schemaNS and \c propName - The named property is removed if it is an /// external property, or if the \c #kXMPUtil_DoAllProperties option flag is set. It does not /// matter whether the named property is an actual property or an alias. /// /// \li Non-empty \c schemaNS and empty \c propName - All external properties in the named /// schema are removed. Internal properties are also removed if the /// \c #kXMPUtil_DoAllProperties option flag is set. In addition, aliases from the named schema /// are removed if the \c #kXMPUtil_IncludeAliases option flag is set. /// /// \li Empty \c schemaNS and empty \c propName - All external properties in all schemas are /// removed. Internal properties are also removed if the \c #kXMPUtil_DoAllProperties option /// flag is set. Aliases are handled implicitly, because the associated actuals are removed or /// not. /// /// \li It is an error to pass an empty \c schemaNS and non-empty \c propName. /// /// @param xmpObj The XMP object containing the properties to be removed. /// /// @param schemaNS Optional schema namespace URI for the properties to be removed. /// /// @param propName Optional path expression for the property to be removed. /// /// @param options Option flags to control the deletion operation. A logical OR of these /// bit-flag constants: /// \li \c #kXMPUtil_DoAllProperties - Delete internal properties in addition to external properties. /// \li \c #kXMPUtil_IncludeAliases - Include aliases if the schema is explicitly specified. static void RemoveProperties ( TXMPMeta * xmpObj, XMP_StringPtr schemaNS = 0, XMP_StringPtr propName = 0, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c DuplicateSubtree() replicates a subtree from one XMP object into another. /// /// The destination can be a different namespace and root location in the same object, or the /// same or a different location in another XMP object. /// /// @param source The source XMP object. /// /// @param dest The destination XMP object. /// /// @param sourceNS The schema namespace URI for the source subtree. /// /// @param sourceRoot The root location for the source subtree. Can be a general path expression, /// must not be null or the empty string. /// /// @param destNS The schema namespace URI for the destination. Defaults to the source namespace. /// /// @param destRoot The root location for the destination. Can be a general path expression. /// Defaults to the source location. /// /// @param options Option flags to control the operation. <> static void DuplicateSubtree ( const TXMPMeta & source, TXMPMeta * dest, XMP_StringPtr sourceNS, XMP_StringPtr sourceRoot, XMP_StringPtr destNS = 0, XMP_StringPtr destRoot = 0, XMP_OptionBits options = 0 ); /// @} // ============================================================================================= private: static void SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen ); }; // class TXMPUtils // ================================================================================================= #endif // __TXMPUtils_hpp__ exempi-2.2.1/public/include/XMP_UnixEndian.h0000664000175000017500000000113512144603625015571 00000000000000// Endian check for Unix, refactored because examples needs it. // #ifdef CHECKED_ENDIANNESS # if defined(WORDS_BIGENDIAN) # define kBigEndianHost 1 # else # define kBigEndianHost 0 # endif #else # if __sun # include # ifdef _LITTLE_ENDIAN # define kBigEndianHost 0 # else # define kBigEndianHost 1 # endif # else # include # if BYTE_ORDER == BIG_ENDIAN # define kBigEndianHost 1 # elif BYTE_ORDER == LITTLE_ENDIAN # define kBigEndianHost 0 # else # error "Neither BIG_ENDIAN nor LITTLE_ENDIAN is set" # endif # endif #endif // CHECKED_ENDIANNESS exempi-2.2.1/public/include/XMP_Environment.h0000664000175000017500000000750711745673651016060 00000000000000#ifndef __XMP_Environment_h__ #define __XMP_Environment_h__ 1 // ================================================================================================= // XMP_Environment.h - Build environment flags for the XMP toolkit. // ================================================================ // // This header is just C preprocessor macro definitions to set up the XMP toolkit build environment. // It must be the first #include in any chain since it might affect things in other #includes. // // ================================================================================================= // ================================================================================================= // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // ================================================================================================= // Determine the Platform // ====================== // One of MAC_ENV, WIN_ENV, or UNIX_ENV must be defined by the client. Since some other code // requires these to be defined without values, they are only used here to define XMP-specific // macros with 0 or 1 values. // ! Tempting though it might be to have a standard macro for big or little endian, there seems to // ! be no decent way to do that on our own in UNIX. Forcing it on the client isn't acceptable. #if defined ( MAC_ENV ) #if 0 // ! maybe someday - ! MAC_ENV #error "MAC_ENV must be defined so that \"#if MAC_ENV\" is true" #endif #if defined ( WIN_ENV ) || defined ( UNIX_ENV ) #error "XMP environment error - must define only one of MAC_ENV, WIN_ENV, or UNIX_ENV" #endif #define XMP_MacBuild 1 #define XMP_WinBuild 0 #define XMP_UNIXBuild 0 #elif defined ( WIN_ENV ) #if 0 // ! maybe someday - ! WIN_ENV #error "WIN_ENV must be defined so that \"#if WIN_ENV\" is true" #endif #if defined ( UNIX_ENV ) #error "XMP environment error - must define only one of MAC_ENV, WIN_ENV, or UNIX_ENV" #endif #define XMP_MacBuild 0 #define XMP_WinBuild 1 #define XMP_UNIXBuild 0 #elif defined ( UNIX_ENV ) #if 0 // ! maybe someday - ! UNIX_ENV #error "UNIX_ENV must be defined so that \"#if UNIX_ENV\" is true" #endif #define XMP_MacBuild 0 #define XMP_WinBuild 0 #define XMP_UNIXBuild 1 #else #error "XMP environment error - must define one of MAC_ENV, WIN_ENV, or UNIX_ENV" #endif // ================================================================================================= // Common Macros // ============= #if defined ( DEBUG ) #if defined ( NDEBUG ) #error "XMP environment error - both DEBUG and NDEBUG are defined" #endif #define XMP_DebugBuild 1 #endif #if defined ( NDEBUG ) #define XMP_DebugBuild 0 #endif #ifndef XMP_DebugBuild #define XMP_DebugBuild 0 #endif #if XMP_DebugBuild #include // The assert macro needs printf. #endif #ifndef XMP_64 #if _WIN64 || defined(_LP64) #define XMP_64 1 #else #define XMP_64 0 #endif #endif // ================================================================================================= // Macintosh Specific Settings // =========================== // ================================================================================================= // Windows Specific Settings // ========================= // ================================================================================================= // UNIX Specific Settings // ====================== // ================================================================================================= #endif // __XMP_Environment_h__ exempi-2.2.1/public/include/XMP_Version.h0000664000175000017500000000400412150230672015145 00000000000000#ifndef __XMP_Version_h__ #define __XMP_Version_h__ 1 /* --------------------------------------------------------------------------------------------- */ /* ** IMPORTANT ** This file must be usable by strict ANSI C compilers. No "//" comments, etc. */ /* --------------------------------------------------------------------------------------------- */ /* // ================================================================================================= // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= */ /* ============================================================================================= */ /** XMP Toolkit Version Information Version information for the XMP toolkit is stored in the executable and available through a runtime call, SXMPMeta::GetVersionInfo. In addition a static version number is defined in this header. The information in the executable or returned by SXMPMeta::GetVersionInfo is about the implementation internals, it is runtime version information. The values defined in this header describe the version of the API used at client compile time. They do not necessarily relate to the runtime version. Important: Do not display the static values defined here to users as the version of XMP in use. Do not base runtime decisions on just this static version. It is OK to compare the static and runtime versions. */ /* ============================================================================================= */ #define XMP_API_VERSION_MAJOR 5 #define XMP_API_VERSION_MINOR 1 #define XMP_API_VERSION_MICRO 2 #define XMP_API_VERSION 5.1.2 #define XMP_API_VERSION_STRING "5.1.2" /* ============================================================================================= */ #endif /* __XMP_Version_h__ */ exempi-2.2.1/public/include/TXMPMeta.hpp0000664000175000017500000025064311745673651014770 00000000000000#ifndef __TXMPMeta_hpp__ #define __TXMPMeta_hpp__ 1 #if ( ! __XMP_hpp__ ) #error "Do not directly include, use XMP.hpp" #endif // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // ================================================================================================= /// \file TXMPMeta.hpp /// \brief API for access to the XMP Toolkit core services. /// /// \c TXMPMeta is the template class providing the core services of the XMP Toolkit. It must be /// instantiated with a string class such as \c std::string. Read the Toolkit Overview for /// information about the overall architecture of the XMP API, and the documentation for \c XMP.hpp /// for specific instantiation instructions. Please that you MUST NOT derive a class from this class, /// consider this class FINAL, use it directly. [1279031] /// /// Access these functions through the concrete class, \c SXMPMeta. // ================================================================================================= // ================================================================================================= /// \class TXMPMeta TXMPMeta.hpp /// \brief API for access to the XMP Toolkit core services. /// /// \c TXMPMeta is the template class providing the core services of the XMP Toolkit. It should be /// instantiated with a string class such as \c std::string. Read the Toolkit Overview for /// information about the overall architecture of the XMP API, and the documentation for \c XMP.hpp /// for specific instantiation instructions. /// /// Access these functions through the concrete class, \c SXMPMeta. /// /// You can create \c TXMPMeta objects (also called XMP objects) from metadata that you construct, /// or that you obtain from files using the XMP Toolkit's XMPFiles component; see \c TXMPFiles.hpp. // ================================================================================================= template class TXMPIterator; template class TXMPUtils; // ------------------------------------------------------------------------------------------------- template class TXMPMeta { public: // ============================================================================================= // Initialization and termination // ============================== // --------------------------------------------------------------------------------------------- /// \name Initialization and termination /// /// @{ // --------------------------------------------------------------------------------------------- /// @brief \c GetVersionInfo() retrieves runtime version information. /// /// The header \c XMPVersion.hpp defines a static version number for the XMP Toolkit, which /// describes the version of the API used at client compile time. It is not necessarily the same /// as the runtime version. Do not base runtime decisions on the static version alone; you can, /// however, compare the runtime and static versions. /// /// This function is static; make the call directly from the concrete class (\c SXMPMeta). The /// function can be called before calling \c TXMPMeta::Initialize(). /// /// @param info [out] A buffer in which to return the version information. static void GetVersionInfo ( XMP_VersionInfo * info ); // --------------------------------------------------------------------------------------------- /// @brief \c Initialize() explicitly initializes the XMP Toolkit before use. */ /// Initializes the XMP Toolkit. /// /// Call this function before making any other calls to the \c TXMPMeta functions, except /// \c TXMPMeta::GetVersionInfo(). /// /// This function is static; make the call directly from the concrete class (\c SXMPMeta). /// /// @return True on success. */ static bool Initialize(); // --------------------------------------------------------------------------------------------- /// @brief \c Terminate() explicitly terminates usage of the XMP Toolkit. /// /// Frees structures created on initialization. /// /// This function is static; make the call directly from the concrete class (\c SXMPMeta). static void Terminate(); /// @} // ============================================================================================= // Constuctors and destructor // ========================= // --------------------------------------------------------------------------------------------- /// \name Constructors and destructor /// @{ // --------------------------------------------------------------------------------------------- /// @brief Default constructor, creates an empty object. /// /// The default constructor creates a new empty \c TXMPMeta object. /// /// @return The new object. */ TXMPMeta(); // --------------------------------------------------------------------------------------------- /// @brief Copy constructor, creates a client object refering to the same internal object. /// /// The copy constructor creates a new \c TXMPMeta object that refers to the same internal XMP /// object. as an existing \c TXMPMeta object. /// /// @param original The object to copy. /// /// @return The new object. */ TXMPMeta ( const TXMPMeta & original ); // --------------------------------------------------------------------------------------------- /// @brief Assignment operator, assigns the internal reference and increments the reference count. /// /// The assignment operator assigns the internal ref from the rhs object and increments the /// reference count on the underlying internal XMP object. void operator= ( const TXMPMeta & rhs ); // --------------------------------------------------------------------------------------------- /// @brief Reconstructs an XMP object from an internal reference. /// /// This constructor creates a new \c TXMPMeta object that refers to the underlying reference object /// of an existing \c TXMPMeta object. Use to safely pass XMP objects across DLL boundaries. /// /// @param xmpRef The underlying reference object, obtained from some other XMP object with /// \c TXMPMeta::GetInternalRef(). /// /// @return The new object. TXMPMeta ( XMPMetaRef xmpRef ); // --------------------------------------------------------------------------------------------- /// @brief Constructs an object and parse one buffer of RDF into it. /// /// This constructor creates a new \c TXMPMeta object and populates it with metadata from a /// buffer containing serialized RDF. This buffer must be a complete RDF parse stream. /// /// The result of passing serialized data to this function is identical to creating an empty /// object then calling \c TXMPMeta::ParseFromBuffer(). To use the constructor, however, the RDF /// must be complete. If you need to parse data from multiple buffers, create an empty object /// and use \c TXMPMeta::ParseFromBuffer(). /// /// @param buffer A pointer to the buffer of RDF to be parsed. Can be null if the length is 0; /// in this case, the function creates an empty object. /// /// @param xmpSize The length in bytes of the buffer. /// /// @return The new object. TXMPMeta ( XMP_StringPtr buffer, XMP_StringLen xmpSize ); // --------------------------------------------------------------------------------------------- /// @brief Destructor, typical virtual destructor. */ virtual ~TXMPMeta() throw(); /// @} // ============================================================================================= // Global state functions // ====================== // --------------------------------------------------------------------------------------------- /// \name Global option flags /// @{ /// Global option flags affect the overall behavior of the XMP Toolkit. The available options /// will be declared in \c XMP_Const.h. There are none in this version of the Toolkit. // --------------------------------------------------------------------------------------------- /// @brief \c GetGlobalOptions() retrieves the set of global option flags. There are none in /// this version of the Toolkit. /// /// This function is static; you can make the call from the class without instantiating it. /// /// @return A logical OR of global option bit-flag constants. static XMP_OptionBits GetGlobalOptions(); // --------------------------------------------------------------------------------------------- /// @brief \c SetGlobalOptions() updates the set of global option flags. There are none in this /// version of the Toolkit. /// /// The entire set is replaced with the new values. If only one flag is to be modified, use /// \c TXMPMeta::GetGlobalOptions() to obtain the current set, modify the desired flag, then use /// this function to reset the value. /// /// This function is static; you can make the call from the class without instantiating it. /// /// @param options A logical OR of global option bit-flag constants. static void SetGlobalOptions ( XMP_OptionBits options ); /// @} // --------------------------------------------------------------------------------------------- /// \name Internal data structure dump utilities /// @{ /// /// These are debugging utilities that dump internal data structures, to be handled by /// client-defined callback described in \c XMP_Const.h. /// /// @see Member function \c TXMPMeta::DumpObject() // --------------------------------------------------------------------------------------------- /// @brief \c DumpNamespaces() sends the list of registered namespace URIs and prefixes to a handler. /// /// For debugging. Invokes a client-defined callback for each line of output. /// /// This function is static; make the call directly from the concrete class (\c SXMPMeta). /// /// @param outProc The client-defined procedure to handle each line of output. /// /// @param clientData A pointer to client-defined data to pass to the handler. /// /// @return A success-fail status value, returned from the handler. Zero is success, failure /// values are client-defined. static XMP_Status DumpNamespaces ( XMP_TextOutputProc outProc, void * clientData ); /// @} // --------------------------------------------------------------------------------------------- /// \name Namespace Functions /// @{ /// /// Namespaces must be registered before use in namespace URI parameters or path expressions. /// Within the XMP Toolkit the registered namespace URIs and prefixes must be unique. Additional /// namespaces encountered when parsing RDF are automatically registered. /// /// The namespace URI should always end in an XML name separator such as '/' or '#'. This is /// because some forms of RDF shorthand catenate a namespace URI with an element name to form a /// new URI. // --------------------------------------------------------------------------------------------- /// @brief \c RegisterNamespace() registers a namespace URI with a suggested prefix. /// /// If the URI is not registered but the suggested prefix is in use, a unique prefix is created /// from the suggested one. The actual registered prefix is returned. The function result tells /// if the registered prefix is the suggested one. It is not an error if the URI is already /// registered, regardless of the prefix. /// /// This function is static; make the call directly from the concrete class (\c SXMPMeta). /// /// @param namespaceURI The URI for the namespace. Must be a valid XML URI. /// /// @param suggestedPrefix The suggested prefix to be used if the URI is not yet registered. /// Must be a valid XML name. /// /// @param registeredPrefix [out] A string object in which to return the prefix actually /// registered for this URI. /// /// @return True if the registered prefix matches the suggested prefix. /// /// @note No checking is done on either the URI or the prefix. */ static bool RegisterNamespace ( XMP_StringPtr namespaceURI, XMP_StringPtr suggestedPrefix, tStringObj * registeredPrefix ); // --------------------------------------------------------------------------------------------- /// @brief \c GetNamespacePrefix() obtains the prefix for a registered namespace URI, and /// reports whether the URI is registered. /// /// This function is static; make the call directly from the concrete class (\c SXMPMeta). /// /// @param namespaceURI The URI for the namespace. Must not be null or the empty string. It is /// not an error if the namespace URI is not registered. /// /// @param namespacePrefix [out] A string object in which to return the prefix registered for /// this URI, with a terminating colon character, ':'. If the namespace is not registered, this /// string is not modified. /// /// @return True if the namespace URI is registered. static bool GetNamespacePrefix ( XMP_StringPtr namespaceURI, tStringObj * namespacePrefix ); // --------------------------------------------------------------------------------------------- /// @brief \c GetNamespaceURI() obtains the URI for a registered namespace prefix, and reports /// whether the prefix is registered. /// /// This function is static; make the call directly from the concrete class (\c SXMPMeta). /// /// @param namespacePrefix The prefix for the namespace. Must not be null or the empty string. /// It is not an error if the namespace prefix is not registered. /// /// @param namespaceURI [out] A string object in which to return the URI registered for this /// prefix. If the prefix is not registered, this string is not modified. /// /// @return True if the namespace prefix is registered. static bool GetNamespaceURI ( XMP_StringPtr namespacePrefix, tStringObj * namespaceURI ); // --------------------------------------------------------------------------------------------- /// @brief Not implemented. /// /// Deletes a namespace from the registry. Does nothing if the URI is not registered, or if the /// parameter is null or the empty string. /// /// This function is static; make the call directly from the concrete class (\c SXMPMeta). /// /// @param namespaceURI The URI for the namespace. static void DeleteNamespace ( XMP_StringPtr namespaceURI ); /// @} // ============================================================================================= // Basic property manipulation functions // ===================================== // *** Should add discussion of schemaNS and propName prefix usage. // --------------------------------------------------------------------------------------------- /// \name Accessing property values /// @{ /// /// The property value accessors all take a property specification; the top level namespace URI /// (the "schema" namespace) and the basic name of the property being referenced. See the /// introductory discussion of path expression usage for more information. /// /// The accessor functions return true if the specified property exists. If it does, output /// parameters return the value (if any) and option flags describing the property. The option /// bit-flag constants that describe properties are \c kXMP_PropXx and /// \c kXMP_ArrayIsXx. See \c #kXMP_PropValueIsURI and following, and macros \c #XMP_PropIsSimple /// and following in \c XMP_Const.h. If the property exists and has a value, it is returned as a /// Unicode string in UTF-8 encoding. Arrays and the non-leaf levels of structs do not have /// values. // --------------------------------------------------------------------------------------------- /// @brief \c GetProperty() reports whether a property exists, and retrieves its value. /// /// This is the simplest property accessor. Use this to retrieve the values of top-level simple /// properties, or after using the path composition functions in \c TXMPUtils. /// /// When specifying a namespace and path (in this and all other accessors): /// \li If a namespace URI is specified, it must be for a registered namespace. /// \li If the namespace is specified only by a prefix in the property name path, /// it must be a registered prefix. /// \li If both a URI and path prefix are present, they must be corresponding /// parts of a registered namespace. /// /// @param schemaNS The namespace URI for the property. The URI must be for a registered /// namespace. Must not be null or the empty string. /// /// @param propName The name of the property. Can be a general path expression, must not be null /// or the empty string. The first component can be a namespace prefix; if present without a /// \c schemaNS value, the prefix specifies the namespace. The prefix must be for a registered /// namespace, and if a namespace URI is specified, must match the registered prefix for that /// namespace. /// /// @param propValue [out] A string object in which to return the value of the property, if the /// property exists and has a value. Arrays and non-leaf levels of structs do not have values. /// Can be null if the value is not wanted. /// /// @param options A buffer in which to return option flags describing the property. Can be null /// if the flags are not wanted. /// /// @return True if the property exists. bool GetProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName, tStringObj * propValue, XMP_OptionBits * options ) const; // --------------------------------------------------------------------------------------------- /// @brief \c GetArrayItem() provides access to items within an array. /// /// Reports whether the item exists; if it does, and if it has a value, the function retrieves /// the value. Items are accessed by an integer index, where the first item has index 1. /// /// @param schemaNS The namespace URI for the array; see \c GetProperty(). /// /// @param arrayName The name of the array. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param itemIndex The 1-based index of the desired item. Use the macro \c #kXMP_ArrayLastItem /// to specify the last existing array item. /// /// @param itemValue [out] A string object in which to return the value of the array item, if it /// has a value. Arrays and non-leaf levels of structs do not have values. Can be null if the /// value is not wanted. /// /// @param options [out] A buffer in which to return the option flags describing the array item. /// Can be null if the flags are not wanted. /// /// @return True if the array item exists. bool GetArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, tStringObj * itemValue, XMP_OptionBits * options ) const; // --------------------------------------------------------------------------------------------- /// @brief \c GetStructField() provides access to fields within a nested structure. /// /// Reports whether the field exists; if it does, and if it has a value, the function retrieves /// the value. /// /// @param schemaNS The namespace URI for the struct; see \c GetProperty(). /// /// @param structName The name of the struct. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param fieldNS The namespace URI for the field. Same URI and prefix usage as the \c schemaNS /// and \c structName parameters. /// /// @param fieldName The name of the field. Must be a single XML name, must not be null or the /// empty string. Same URI and prefix usage as the \c schemaNS and \c structName parameters. /// /// @param fieldValue [out] A string object in which to return the value of the field, if the /// field has a value. Arrays and non-leaf levels of structs do not have values. Can be null if /// the value is not wanted. /// /// @param options [out] A buffer in which to return the option flags describing the field. Can /// be null if the flags are not wanted. /// /// @return True if the field exists. bool GetStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, tStringObj * fieldValue, XMP_OptionBits * options ) const; // --------------------------------------------------------------------------------------------- /// @brief \c GetQualifier() provides access to a qualifier attached to a property. /// /// @note In this version of the Toolkit, qualifiers are supported only for simple leaf properties. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property to which the qualifier is attached. Can be a /// general path expression, must not be null or the empty string; see \c GetProperty() for /// namespace prefix usage. /// /// @param qualNS The namespace URI for the qualifier. Same URI and prefix usage as the /// \c schemaNS and \c propName parameters. /// /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or /// the empty string. Same URI and prefix usage as the \c schemaNS and \c propName parameters. /// /// @param qualValue [out] A string object in which to return the value of the qualifier, if the /// qualifier has a value. Arrays and non-leaf levels of structs do not have values. Can be null /// if the value is not wanted. /// /// @param options [out] A buffer in which to return the option flags describing the qualifier. /// Can be null if the flags are not wanted. /// /// @return True if the qualifier exists. bool GetQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, tStringObj * qualValue, XMP_OptionBits * options ) const; /// @} // ============================================================================================= // --------------------------------------------------------------------------------------------- /// \name Creating properties and setting their values /// @{ /// /// These functions all take a property specification; the top level namespace URI (the "schema" /// namespace) and the basic name of the property being referenced. See the introductory /// discussion of path expression usage for more information. /// /// All of the functions take a UTF-8 encoded Unicode string for the property value. Arrays and /// non-leaf levels of structs do not have values. The value can be passed as an /// \c #XMP_StringPtr (a pointer to a null-terminated string), or as a string object /// (\c tStringObj). /// Each function takes an options flag that describes the property. You can use these functions /// to create empty arrays and structs by setting appropriate option flags. When you assign a /// value, all levels of a struct that are implicit in the assignment are created if necessary. /// \c TXMPMeta::AppendArrayItem() implicitly creates the named array if necessary. /// /// The allowed option bit-flags include: /// \li \c #kXMP_PropValueIsStruct - Can be used to create an empty struct. /// A struct is implicitly created when the first field is set. /// \li \c #kXMP_PropValueIsArray - By default, a general unordered array (bag). /// \li \c #kXMP_PropArrayIsOrdered - An ordered array. /// \li \c #kXMP_PropArrayIsAlternate - An alternative array. /// \li \c #kXMP_PropArrayIsAltText - An alt-text array. Each array element must /// be a simple property with an \c xml:lang attribute. // --------------------------------------------------------------------------------------------- /// @brief \c SetProperty() creates or sets a property value. /// /// This is the simplest property setter. Use it for top-level simple properties, or after using /// the path composition functions in \c TXMPUtils. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param propValue The new value, a pointer to a null terminated UTF-8 string. Must be null /// for arrays and non-leaf levels of structs that do not have values. /// /// @param options Option flags describing the property; a logical OR of allowed bit-flag /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property /// that already exists. void SetProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr propValue, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SetProperty() creates or sets a property value using a string object. /// /// Overloads the basic form of the function, allowing you to pass a string object /// for the item value. It is otherwise identical; see details in the canonical form. void SetProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName, const tStringObj & propValue, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SetArrayItem() creates or sets the value of an item within an array. /// /// Items are accessed by an integer index, where the first item has index 1. This function /// creates the item if necessary, but the array itself must already exist Use /// \c AppendArrayItem() to create arrays. A new item is automatically appended if the index is the /// array size plus 1. To insert a new item before or after an existing item, use option flags. /// /// Use \c TXMPUtils::ComposeArrayItemPath() to create a complex path. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param arrayName The name of the array. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param itemIndex The 1-based index of the desired item. Use the macro \c #kXMP_ArrayLastItem /// to specify the last existing array item. /// /// @param itemValue The new item value, a null-terminated UTF-8 string, if the array item has a /// value. /// /// @param options Option flags describing the array type and insertion location for a new item; /// a logical OR of allowed bit-flag constants. The type, if specified, must match the existing /// array type, \c #kXMP_PropArrayIsOrdered, \c #kXMP_PropArrayIsAlternate, or /// \c #kXMP_PropArrayIsAltText. Default (0 or \c #kXMP_NoOptions) matches the existing array type. /// /// To insert a new item before or after the specified index, set flag \c #kXMP_InsertBeforeItem /// or \c #kXMP_InsertAfterItem. void SetArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, XMP_StringPtr itemValue, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SetArrayItem() creates or sets the value of an item within an array using a string object. /// /// Overloads the basic form of the function, allowing you to pass a string object in which to /// return the item value. It is otherwise identical; see details in the canonical form. void SetArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, const tStringObj & itemValue, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c AppendArrayItem() adds an item to an array, creating the array if necessary. /// /// This function simplifies construction of an array by not requiring that you pre-create an /// empty array. The array that is assigned is created automatically if it does not yet exist. /// If the array exists, it must have the form specified by the options. Each call appends a new /// item to the array. /// /// Use \c TXMPUtils::ComposeArrayItemPath() to create a complex path. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param arrayName The name of the array. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param arrayOptions Option flags describing the array type to create; a logical OR of /// allowed bit-flag constants, \c #kXMP_PropArrayIsOrdered, \c #kXMP_PropArrayIsAlternate, or /// \c #kXMP_PropArrayIsAltText. If the array exists, must match the existing array type or be /// null (0 or \c #kXMP_NoOptions). /// /// @param itemValue The new item value, a null-terminated UTF-8 string, if the array item has a /// value. /// /// @param itemOptions Option flags describing the item type to create; one of the bit-flag /// constants \c #kXMP_PropValueIsArray or \c #kXMP_PropValueIsStruct to create a complex array /// item. void AppendArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, XMP_StringPtr itemValue, XMP_OptionBits itemOptions = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c AppendArrayItem() adds an item to an array using a string object value, creating /// the array if necessary. /// /// Overloads the basic form of the function, allowing you to pass a string object in which to /// return the item value. It is otherwise identical; see details in the canonical form. void AppendArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, const tStringObj & itemValue, XMP_OptionBits itemOptions = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SetStructField() creates or sets the value of a field within a nested structure. /// /// Use this to set a value within an existing structure, create a new field within an existing /// structure, or create an empty structure of any depth. If you set a field in a structure that /// does not exist, the structure is automatically created. /// /// Use \c TXMPUtils::ComposeStructFieldPath() to create a complex path. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param structName The name of the struct. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param fieldNS The namespace URI for the field. Same namespace and prefix usage as /// \c GetProperty(). /// /// @param fieldName The name of the field. Must be a single XML name, must not be null or the /// empty string. Same namespace and prefix usage as \c GetProperty(). /// /// @param fieldValue The new value, a null-terminated UTF-8 string, if the field has a value. /// Null to create a new, empty struct or empty field in an existing struct. /// /// @param options Option flags describing the property, in which the bit-flag /// \c #kXMP_PropValueIsStruct must be set to create a struct. void SetStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SetStructField() creates or sets the value of a field within a nested structure, /// using a string object. /// /// Overloads the basic form of the function, allowing you to pass a string object in which to /// return the field value. It is otherwise identical; see details in the canonical form. void SetStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, const tStringObj & fieldValue, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SetQualifier() creates or sets a qualifier attached to a property. /// /// Use this to set a value for an existing qualifier, or create a new qualifier. <> Use /// \c TXMPUtils::ComposeQualifierPath() to create a complex path. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property to which the qualifier is attached. Can be a /// general path expression, must not be null or the empty string; see \c GetProperty() for /// namespace prefix usage. /// /// @param qualNS The namespace URI for the qualifier. Same namespace and prefix usage as /// \c GetProperty(). /// /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or /// the empty string. Same namespace and prefix usage as \c GetProperty(). /// /// @param qualValue The new value, a null-terminated UTF-8 string, if the qualifier has a /// value. Null to create a new, empty qualifier. /// /// @param options Option flags describing the <>, a logical OR /// of property-type bit-flag constants. Use the macro \c #XMP_PropIsQualifier to create a /// qualifier. <> void SetQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, XMP_StringPtr qualValue, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SetQualifier() creates or sets a qualifier attached to a property using a string object. /// /// Overloads the basic form of the function, allowing you to pass a string object /// for the qualifier value. It is otherwise identical; see details in the canonical form. void SetQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, const tStringObj & qualValue, XMP_OptionBits options = 0 ); /// @} // ============================================================================================= // --------------------------------------------------------------------------------------------- /// \name Detecting and deleting properties. /// @{ /// /// The namespace URI and prefix usage for property specifiers in these functions is the same as /// for \c TXMPMeta::GetProperty(). // --------------------------------------------------------------------------------------------- /// @brief \c DeleteProperty() deletes an XMP subtree rooted at a given property. /// /// It is not an error if the property does not exist. /// /// @param schemaNS The namespace URI for the property; see \c GetProperty(). /// /// @param propName The name of the property; see \c GetProperty(). void DeleteProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName ); // --------------------------------------------------------------------------------------------- /// @brief \c DeleteArrayItem() deletes an XMP subtree rooted at a given array item. /// /// It is not an error if the array item does not exist. Use /// \c TXMPUtils::ComposeArrayItemPath() to create a complex path. /// /// @param schemaNS The namespace URI for the array; see \c GetProperty(). /// /// @param arrayName The name of the array. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param itemIndex The 1-based index of the desired item. Use the macro \c #kXMP_ArrayLastItem /// to specify the last existing array item. void DeleteArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex ); // --------------------------------------------------------------------------------------------- /// @brief \c DeleteStructField() deletes an XMP subtree rooted at a given struct field. /// /// It is not an error if the field does not exist. /// /// @param schemaNS The namespace URI for the struct; see \c GetProperty(). /// /// @param structName The name of the struct. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param fieldNS The namespace URI for the field. Same namespace and prefix usage as /// \c GetProperty(). /// /// @param fieldName The name of the field. Must be a single XML name, must not be null or the /// empty string. Same namespace and prefix usage as \c GetProperty(). void DeleteStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName ); // --------------------------------------------------------------------------------------------- /// @brief \c DeleteQualifier() deletes an XMP subtree rooted at a given qualifier. /// /// It is not an error if the qualifier does not exist. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property to which the qualifier is attached. Can be a /// general path expression, must not be null or the empty string; see \c GetProperty() for /// namespace prefix usage. /// /// @param qualNS The namespace URI for the qualifier. Same namespace and prefix usage as /// \c GetProperty(). /// /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or /// the empty string. Same namespace and prefix usage as \c GetProperty(). void DeleteQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName ); // --------------------------------------------------------------------------------------------- /// @brief \c DoesPropertyExist() reports whether a property currently exists. /// /// @param schemaNS The namespace URI for the property; see \c GetProperty(). /// /// @param propName The name of the property; see \c GetProperty(). /// /// @return True if the property exists. bool DoesPropertyExist ( XMP_StringPtr schemaNS, XMP_StringPtr propName ) const; // --------------------------------------------------------------------------------------------- /// @brief \c DoesArrayItemExist() reports whether an array item currently exists. /// /// Use \c TXMPUtils::ComposeArrayItemPath() to create a complex path. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param arrayName The name of the array. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param itemIndex The 1-based index of the desired item. Use the macro \c #kXMP_ArrayLastItem /// to specify the last existing array item. /// /// @return True if the array item exists. bool DoesArrayItemExist ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex ) const; // --------------------------------------------------------------------------------------------- /// @brief \c DoesStructFieldExist() reports whether a struct field currently exists. /// /// Use \c TXMPUtils::ComposeStructFieldPath() to create a complex path. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param structName The name of the struct. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param fieldNS The namespace URI for the field. Same namespace and prefix usage as /// \c GetProperty(). /// /// @param fieldName The name of the field. Must be a single XML name, must not be null or the /// empty string. Same namespace and prefix usage as \c GetProperty(). /// /// @return True if the field exists. bool DoesStructFieldExist ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName ) const; // --------------------------------------------------------------------------------------------- /// @brief \c DoesQualifierExist() reports whether a qualifier currently exists. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property to which the qualifier is attached. Can be a /// general path expression, must not be null or the empty string; see \c GetProperty() for /// namespace prefix usage. /// /// @param qualNS The namespace URI for the qualifier. Same namespace and prefix usage as /// \c GetProperty(). /// /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or /// the empty string. Same namespace and prefix usage as \c GetProperty(). /// /// @return True if the qualifier exists. bool DoesQualifierExist ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName ) const; /// @} // ============================================================================================= // Specialized Get and Set functions // ============================================================================================= // --------------------------------------------------------------------------------------------- /// \name Accessing properties as binary values. /// @{ /// /// These are very similar to \c TXMPMeta::GetProperty() and \c TXMPMeta::SetProperty(), except /// that the value is returned or provided in binary form instead of as a UTF-8 string. /// \c TXMPUtils provides functions for converting between binary and string values. /// Use the path composition functions in \c TXMPUtils to compose complex path expressions /// for fields or items in nested structures or arrays, or for qualifiers. // --------------------------------------------------------------------------------------------- /// @brief \c GetProperty_Bool() retrieves the value of a Boolean property as a C++ bool. /// /// Reports whether a property exists, and retrieves its binary value and property type information. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param propValue [out] A buffer in which to return the binary value. Can be null if the /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have /// values. /// /// @param options [out] A buffer in which to return the option flags describing the property, a /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can /// be null if flags are not wanted. /// /// @return True if the property exists. bool GetProperty_Bool ( XMP_StringPtr schemaNS, XMP_StringPtr propName, bool * propValue, XMP_OptionBits * options ) const; // --------------------------------------------------------------------------------------------- /// @brief \c GetProperty_Int() retrieves the value of an integer property as a C long integer. /// /// Reports whether a property exists, and retrieves its binary value and property type information. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param propValue [out] A buffer in which to return the binary value. Can be null if the /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have /// values. /// /// @param options [out] A buffer in which to return the option flags describing the property, a /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can /// be null if flags are not wanted. /// /// @return True if the property exists. bool GetProperty_Int ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int32 * propValue, XMP_OptionBits * options ) const; // --------------------------------------------------------------------------------------------- /// @brief \c GetProperty_Int64() retrieves the value of an integer property as a C long long integer. /// /// Reports whether a property exists, and retrieves its binary value and property type information. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param propValue [out] A buffer in which to return the binary value. Can be null if the /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have /// values. /// /// @param options [out] A buffer in which to return the option flags describing the property, a /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can /// be null if flags are not wanted. /// /// @return True if the property exists. bool GetProperty_Int64 ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int64 * propValue, XMP_OptionBits * options ) const; // --------------------------------------------------------------------------------------------- /// @brief \c GetProperty_Float() retrieves the value of a floating-point property as a C double float. /// /// Reports whether a property exists, and retrieves its binary value and property type information. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param propValue [out] A buffer in which to return the binary value. Can be null if the /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have /// values. /// /// @param options [out] A buffer in which to return the option flags describing the property, a /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can /// be null if flags are not wanted. /// /// @return True if the property exists. bool GetProperty_Float ( XMP_StringPtr schemaNS, XMP_StringPtr propName, double * propValue, XMP_OptionBits * options ) const; // --------------------------------------------------------------------------------------------- /// @brief \c GetProperty_Date() retrieves the value of a date-time property as an \c #XMP_DateTime structure. /// /// Reports whether a property exists, and retrieves its binary value and property type information. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param propValue [out] A buffer in which to return the binary value. Can be null if the /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have /// values. /// /// @param options [out] A buffer in which to return the option flags describing the property, a /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can /// be null if flags are not wanted. /// /// @return True if the property exists. bool GetProperty_Date ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_DateTime * propValue, XMP_OptionBits * options ) const; // --------------------------------------------------------------------------------------------- /// @brief \c SetProperty_Bool() sets the value of a Boolean property using a C++ bool. /// /// Sets a property with a binary value, creating it if necessary. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param propValue The new binary value. Can be null if creating the property. Must be null /// for arrays and non-leaf levels of structs that do not have values. /// /// @param options Option flags describing the property; a logical OR of allowed bit-flag /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property /// that already exists. void SetProperty_Bool ( XMP_StringPtr schemaNS, XMP_StringPtr propName, bool propValue, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SetProperty_Int() sets the value of an integer property using a C long integer. /// /// Sets a property with a binary value, creating it if necessary. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param propValue The new binary value. Can be null if creating the property. Must be null /// for arrays and non-leaf levels of structs that do not have values. /// /// @param options Option flags describing the property; a logical OR of allowed bit-flag /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property /// that already exists. void SetProperty_Int ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int32 propValue, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SetProperty_Int64() sets the value of an integer property using a C long long integer. /// /// Sets a property with a binary value, creating it if necessary. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param propValue The new binary value. Can be null if creating the property. Must be null /// for arrays and non-leaf levels of structs that do not have values. /// /// @param options Option flags describing the property; a logical OR of allowed bit-flag /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property /// that already exists. void SetProperty_Int64 ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int64 propValue, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SetProperty_Float() sets the value of a floating-point property using a C double float. /// /// Sets a property with a binary value, creating it if necessary. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param propValue The new binary value. Can be null if creating the property. Must be null /// for arrays and non-leaf levels of structs that do not have values. /// /// @param options Option flags describing the property; a logical OR of allowed bit-flag /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property /// that already exists. void SetProperty_Float ( XMP_StringPtr schemaNS, XMP_StringPtr propName, double propValue, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SetProperty_Date() sets the value of a date/time property using an \c #XMP_DateTime structure. /// /// Sets a property with a binary value, creating it if necessary. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param propName The name of the property. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param propValue The new binary value. Can be null if creating the property. Must be null /// for arrays and non-leaf levels of structs that do not have values. /// /// @param options Option flags describing the property; a logical OR of allowed bit-flag /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property /// that already exists. void SetProperty_Date ( XMP_StringPtr schemaNS, XMP_StringPtr propName, const XMP_DateTime & propValue, XMP_OptionBits options = 0 ); /// @} // ============================================================================================= /// \name Accessing localized text (alt-text) properties. /// @{ /// /// Localized text properties are stored in alt-text arrays. They allow multiple concurrent /// localizations of a property value, for example a document title or copyright in several /// languages. /// /// These functions provide convenient support for localized text properties, including a /// number of special and obscure aspects. The most important aspect of these functions is that /// they select an appropriate array item based on one or two RFC 3066 language tags. One of /// these languages, the "specific" language, is preferred and selected if there is an exact /// match. For many languages it is also possible to define a "generic" language that can be /// used if there is no specific language match. The generic language must be a valid RFC 3066 /// primary subtag, or the empty string. /// /// For example, a specific language of "en-US" should be used in the US, and a specific /// language of "en-UK" should be used in England. It is also appropriate to use "en" as the /// generic language in each case. If a US document goes to England, the "en-US" title is /// selected by using the "en" generic language and the "en-UK" specific language. /// /// It is considered poor practice, but allowed, to pass a specific language that is just an /// RFC 3066 primary tag. For example "en" is not a good specific language, it should only be /// used as a generic language. Passing "i" or "x" as the generic language is also considered /// poor practice but allowed. /// /// Advice from the W3C about the use of RFC 3066 language tags can be found at: /// \li http://www.w3.org/International/articles/language-tags/ /// /// \note RFC 3066 language tags must be treated in a case insensitive manner. The XMP toolkit /// does this by normalizing their capitalization: /// \li The primary subtag is lower case, the suggested practice of ISO 639. /// \li All 2 letter secondary subtags are upper case, the suggested practice of ISO 3166. /// \li All other subtags are lower case. /// /// The XMP specification defines an artificial language, "x-default", that is used to /// explicitly denote a default item in an alt-text array. The XMP toolkit normalizes alt-text /// arrays such that the x-default item is the first item. The \c SetLocalizedText() function /// has several special features related to the x-default item, see its description for details. // --------------------------------------------------------------------------------------------- /// @brief \c GetLocalizedText() retrieves information about a selected item in an alt-text array. /// /// The array item is selected according to these rules: /// \li Look for an exact match with the specific language. /// \li If a generic language is given, look for a partial match. /// \li Look for an x-default item. /// \li Choose the first item. /// /// A partial match with the generic language is where the start of the item's language matches /// the generic string and the next character is '-'. An exact match is also recognized as a /// degenerate case. /// /// You can pass "x-default" as the specific language. In this case, selection of an /// \c x-default item is an exact match by the first rule, not a selection by the 3rd rule. The /// last 2 rules are fallbacks used when the specific and generic languages fail to produce a /// match. /// /// The return value reports whether a match was successfully made. /// /// @param schemaNS The namespace URI for the alt-text array; see \c GetProperty(). /// /// @param altTextName The name of the alt-text array. Can be a general path expression, must /// not be null or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param genericLang The name of the generic language as an RFC 3066 primary subtag. Can be /// null or the empty string if no generic language is wanted. /// /// @param specificLang The name of the specific language as an RFC 3066 tag, or "x-default". /// Must not be null or the empty string. /// /// @param actualLang [out] A string object in which to return the language of the selected /// array item, if an appropriate array item is found. Can be null if the language is not wanted. /// /// @param itemValue [out] A string object in which to return the value of the array item, if an /// appropriate array item is found. Can be null if the value is not wanted. /// /// @param options A buffer in which to return the option flags that describe the array item, if /// an appropriate array item is found. Can be null if the flags are not wanted. /// /// @return True if an appropriate array item exists. bool GetLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, tStringObj * actualLang, tStringObj * itemValue, XMP_OptionBits * options ) const; // --------------------------------------------------------------------------------------------- /// @brief \c SetLocalizedText() modifies the value of a selected item in an alt-text array. /// /// Creates an appropriate array item if necessary, and handles special cases for the x-default /// item. /// /// The array item is selected according to these rules: /// \li Look for an exact match with the specific language. /// \li If a generic language is given, look for a partial match. /// \li Look for an x-default item. /// \li Choose the first item. /// /// A partial match with the generic language is where the start of the item's language matches /// the generic string and the next character is '-'. An exact match is also recognized as a /// degenerate case. /// /// You can pass "x-default" as the specific language. In this case, selection of an /// \c x-default item is an exact match by the first rule, not a selection by the 3rd rule. The /// last 2 rules are fallbacks used when the specific and generic languages fail to produce a /// match. /// /// Item values are modified according to these rules: /// /// \li If the selected item is from a match with the specific language, the value of that /// item is modified. If the existing value of that item matches the existing value of the /// x-default item, the x-default item is also modified. If the array only has 1 existing item /// (which is not x-default), an x-default item is added with the given value. /// /// \li If the selected item is from a match with the generic language and there are no other /// generic matches, the value of that item is modified. If the existing value of that item /// matches the existing value of the x-default item, the x-default item is also modified. If /// the array only has 1 existing item (which is not x-default), an x-default item is added /// with the given value. /// /// \li If the selected item is from a partial match with the generic language and there are /// other partial matches, a new item is created for the specific language. The x-default item /// is not modified. /// /// \li If the selected item is from the last 2 rules then a new item is created for the /// specific language. If the array only had an x-default item, the x-default item is also /// modified. If the array was empty, items are created for the specific language and /// x-default. /// /// @param schemaNS The namespace URI for the alt-text array; see \c GetProperty(). /// /// @param altTextName The name of the alt-text array. Can be a general path expression, must /// not be null or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param genericLang The name of the generic language as an RFC 3066 primary subtag. Can be /// null or the empty string if no generic language is wanted. /// /// @param specificLang The name of the specific language as an RFC 3066 tag, or "x-default". /// Must not be null or the empty string. /// /// @param itemValue The new value for the matching array item, specified as a null-terminated /// UTF-8 string. /// /// @param options Option flags, none currently defined. void SetLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, XMP_StringPtr itemValue, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SetLocalizedText() modifies the value of a selected item in an alt-text array using /// a string object. /// /// Creates an appropriate array item if necessary, and handles special cases for the x-default /// item. /// /// The array item is selected according to these rules: /// \li Look for an exact match with the specific language. /// \li If a generic language is given, look for a partial match. /// \li Look for an x-default item. /// \li Choose the first item. /// /// A partial match with the generic language is where the start of the item's language matches /// the generic string and the next character is '-'. An exact match is also recognized as a /// degenerate case. /// /// You can pass "x-default" as the specific language. In this case, selection of an \c x-default /// item is an exact match by the first rule, not a selection by the 3rd rule. The last 2 rules /// are fallbacks used when the specific and generic languages fail to produce a match. /// /// Item values are modified according to these rules: /// /// \li If the selected item is from a match with the specific language, the value of that /// item is modified. If the existing value of that item matches the existing value of the /// x-default item, the x-default item is also modified. If the array only has 1 existing item /// (which is not x-default), an x-default item is added with the given value. /// /// \li If the selected item is from a match with the generic language and there are no other /// generic matches, the value of that item is modified. If the existing value of that item /// matches the existing value of the x-default item, the x-default item is also modified. If /// the array only has 1 existing item (which is not x-default), an x-default item is added /// with the given value. /// /// \li If the selected item is from a partial match with the generic language and there are /// other partial matches, a new item is created for the specific language. The x-default item /// is not modified. /// /// \li If the selected item is from the last 2 rules then a new item is created for the /// specific language. If the array only had an x-default item, the x-default item is also /// modified. If the array was empty, items are created for the specific language and /// x-default. /// /// @param schemaNS The namespace URI for the alt-text array; see \c GetProperty(). /// /// @param altTextName The name of the alt-text array. Can be a general path expression, must /// not be null or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @param genericLang The name of the generic language as an RFC 3066 primary subtag. Can be /// null or the empty string if no generic language is wanted. /// /// @param specificLang The name of the specific language as an RFC 3066 tag, or "x-default". /// Must not be null or the empty string. /// /// @param itemValue The new value for the matching array item, specified as a string object. /// /// @param options Option flags, none currently defined. void SetLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, const tStringObj & itemValue, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c DeleteLocalizedText() deletes specific language alternatives from an alt-text array. /// /// The rules for finding the language value to delete are similar to those for \c #SetLocalizedText(). /// /// @param schemaNS The namespace URI for the alt-text array; see \c #GetProperty(). /// /// @param altTextName The name of the alt-text array. Can be a general path expression, must /// not be null or the empty string; see \c #GetProperty() for namespace prefix usage. /// /// @param genericLang The name of the generic language as an RFC 3066 primary subtag. Can be /// null or the empty string if no generic language is wanted. /// /// @param specificLang The name of the specific language as an RFC 3066 tag, or "x-default". /// Must not be null or the empty string. /// void DeleteLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang ); /// @} // ============================================================================================= /// \name Creating and reading serialized RDF. /// @{ /// /// The metadata contained in an XMP object must be serialized as RDF for storage in an XMP /// packet and output to a file. Similarly, metadata in the form of serialized RDF (such as /// metadata read from a file using \c TXMPFiles) must be parsed into an XMP object for /// manipulation with the XMP Toolkit. /// /// These functions support parsing serialized RDF into an XMP object, and serializing an XMP /// object into RDF. The input for parsing can be any valid Unicode encoding. ISO Latin-1 is /// also recognized, but its use is strongly discouraged. Serialization is always as UTF-8. // --------------------------------------------------------------------------------------------- /// @brief \c ParseFromBuffer() parses RDF from a series of input buffers into this XMP object. /// /// Use this to convert metadata from serialized RDF form (as, for example, read from an XMP /// packet embedded in a file) into an XMP object that you can manipulate with the XMP Toolkit. /// If this XMP object is empty and the input buffer contains a complete XMP packet, this is the /// same as creating a new XMP object from that buffer with the constructor. /// /// You can use this function to combine multiple buffers into a single metadata tree. To /// terminate an input loop conveniently, pass the option \c #kXMP_ParseMoreBuffers for all /// real input, then make a final call with a zero length and \c #kXMP_NoOptions. The buffers /// can be any length. The buffer boundaries need not respect XML tokens or even Unicode /// characters. /// /// @param buffer A pointer to a buffer of input. Can be null if \c bufferSize is 0. /// /// @param bufferSize The length of the input buffer in bytes. Zero is a valid value. /// /// @param options An options flag that controls how the parse operation is performed. A logical /// OR of these bit-flag constants: /// \li \c #kXMP_ParseMoreBuffers - This is not the last buffer of input, more calls follow. /// \li \c #kXMP_RequireXMPMeta - The \c x:xmpmeta XML element is required around \c rdf:RDF. /// /// @see \c TXMPFiles::GetXMP() void ParseFromBuffer ( XMP_StringPtr buffer, XMP_StringLen bufferSize, XMP_OptionBits options = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SerializeToBuffer() serializes metadata in this XMP object into a string as RDF. /// /// Use this to prepare metadata for storage as an XMP packet embedded in a file. See \c TXMPFiles::PutXMP(). /// /// @param rdfString [out] A string object in which to return the serialized RDF. Must not be null. /// /// @param options An options flag that controls how the serialization operation is performed. /// The specified options must be logically consistent; an exception is thrown if they are not. /// A logical OR of these bit-flag constants: /// \li \c kXMP_OmitPacketWrapper - Do not include an XML packet wrapper. This cannot be /// specified together with \c #kXMP_ReadOnlyPacket, \c #kXMP_IncludeThumbnailPad, or /// \c #kXMP_ExactPacketLength. /// \li \c kXMP_ReadOnlyPacket - Create a read-only XML packet wapper. Cannot be specified /// together with \c kXMP_OmitPacketWrapper. /// \li \c kXMP_UseCompactFormat - Use a highly compact RDF syntax and layout. /// \li \c kXMP_IncludeThumbnailPad - Include typical space for a JPEG thumbnail in the /// padding if no \c xmp:Thumbnails property is present. Cannot be specified together with /// \c kXMP_OmitPacketWrapper. /// \li \c kXMP_ExactPacketLength - The padding parameter provides the overall packet length. /// The actual amount of padding is computed. An exception is thrown if the packet exceeds /// this length with no padding. Cannot be specified together with /// \c kXMP_OmitPacketWrapper. /// /// In addition to the above options, you can include one of the following encoding options: /// \li \c #kXMP_EncodeUTF8 - Encode as UTF-8, the default. /// \li \c #kXMP_EncodeUTF16Big - Encode as big-endian UTF-16. /// \li \c #kXMP_EncodeUTF16Little - Encode as little-endian UTF-16. /// \li \c #kXMP_EncodeUTF32Big - Encode as big-endian UTF-32. /// \li \c #kXMP_EncodeUTF32Little - Encode as little-endian UTF-32. /// /// @param padding The amount of padding to be added if a writeable XML packet is created. If /// zero (the default) an appropriate amount of padding is computed. /// /// @param newline The string to be used as a line terminator. If empty, defaults to linefeed, /// U+000A, the standard XML newline. /// /// @param indent The string to be used for each level of indentation in the serialized RDF. If /// empty, defaults to two ASCII spaces, U+0020. /// /// @param baseIndent The number of levels of indentation to be used for the outermost XML /// element in the serialized RDF. This is convenient when embedding the RDF in other text. void SerializeToBuffer ( tStringObj * rdfString, XMP_OptionBits options, XMP_StringLen padding, XMP_StringPtr newline, XMP_StringPtr indent = "", XMP_Index baseIndent = 0 ) const; // --------------------------------------------------------------------------------------------- /// @brief \c SerializeToBuffer() serializes metadata in this XMP object into a string as RDF. /// /// This simpler form of the function uses default values for the \c newline, \c indent, and /// \c baseIndent parameters. /// /// @param rdfString [out] A string object in which to return the serialized RDF. Must not be null. /// /// @param options An options flag that controls how the serialization operation is performed. /// The specified options must be logically consistent; an exception is thrown if they are not. /// A logical OR of these bit-flag constants: /// \li \c kXMP_OmitPacketWrapper - Do not include an XML packet wrapper. This cannot be /// specified together with \c #kXMP_ReadOnlyPacket, \c #kXMP_IncludeThumbnailPad, or /// \c #kXMP_ExactPacketLength. /// \li \c kXMP_ReadOnlyPacket - Create a read-only XML packet wapper. Cannot be specified /// together with \c kXMP_OmitPacketWrapper. /// \li \c kXMP_UseCompactFormat - Use a highly compact RDF syntax and layout. /// \li \c kXMP_IncludeThumbnailPad - Include typical space for a JPEG thumbnail in the /// padding if no \c xmp:Thumbnails property is present. Cannot be specified together with /// \c kXMP_OmitPacketWrapper. /// \li \c kXMP_ExactPacketLength - The padding parameter provides the overall packet length. /// The actual amount of padding is computed. An exception is thrown if the packet exceeds /// this length with no padding. Cannot be specified together with /// \c kXMP_OmitPacketWrapper. /// /// In addition to the above options, you can include one of the following encoding options: /// \li \c #kXMP_EncodeUTF8 - Encode as UTF-8, the default. /// \li \c #kXMP_EncodeUTF16Big - Encode as big-endian UTF-16. /// \li \c #kXMP_EncodeUTF16Little - Encode as little-endian UTF-16. /// \li \c #kXMP_EncodeUTF32Big - Encode as big-endian UTF-32. /// \li \c #kXMP_EncodeUTF32Little - Encode as little-endian UTF-32. /// /// @param padding The amount of padding to be added if a writeable XML packet is created. /// If zero (the default) an appropriate amount of padding is computed. void SerializeToBuffer ( tStringObj * rdfString, XMP_OptionBits options = 0, XMP_StringLen padding = 0 ) const; /// @} // ============================================================================================= // Miscellaneous Member Functions // ============================== // --------------------------------------------------------------------------------------------- /// \name Helper functions. /// @{ // --------------------------------------------------------------------------------------------- /// @brief Retrieves an internal reference that can be safely passed across DLL boundaries and /// reconstructed. /// /// The \c TXMPMeta class is a normal C++ template, it is instantiated and local to each client /// executable, as are the other \c TXMP* classes. Different clients might not use the same /// string type to instantiate \c TXMPMeta. /// /// Because of this you should not pass \c SXMPMeta objects, or pointers to \c SXMPMeta objects, /// across DLL boundaries. Use this function to obtain a safe internal reference that you can /// pass, then construct a local object on the callee side. This construction does not create a /// cloned XMP tree, it is the same underlying XMP object safely wrapped in each client's /// \c SXMPMeta object. /// /// Use this function and the associated constructor like this: /// \li The callee's header contains: ///
    /// CalleeMethod ( XMPMetaRef xmpRef );
    /// 
/// /// \li The caller's code contains: ///
    /// SXMPMeta callerXMP;
    /// CalleeMethod ( callerXMP.GetInternalRef() );
    /// 
/// /// \li The callee's code contains: ///
    /// SXMPMeta calleeXMP ( xmpRef );
    /// 
/// /// @return The reference object. XMPMetaRef GetInternalRef() const; // --------------------------------------------------------------------------------------------- /// @brief \c GetObjectName() retrieves the client-assigned name of this XMP object. /// /// Assign this name with \c SetObjectName(). /// /// @param name [out] A string object in which to return the name. void GetObjectName ( tStringObj * name ) const; // --------------------------------------------------------------------------------------------- /// @brief \c SetObjectName() assigns a name to this XMP object. /// /// Retrieve this client-assigned name with \c GetObjectName(). /// /// @param name The name as a null-terminated UTF-8 string. void SetObjectName ( XMP_StringPtr name ); // --------------------------------------------------------------------------------------------- /// @brief \c SetObjectName() assigns a name to this XMP object. /// /// Retrieve this client-assigned name with \c GetObjectName(). /// /// @param name The name as a string object. void SetObjectName ( tStringObj name ); // --------------------------------------------------------------------------------------------- /// @brief \c Sort() sorts the data model tree of an XMP object. /// /// Use this function to sort the data model of an XMP object into a canonical order. This can /// be convenient when comparing data models, (e.g. by text comparison of DumpObject output). /// /// At the top level the namespaces are sorted by their prefixes. Within a namespace, the top /// level properties are sorted by name. Within a struct, the fields are sorted by their /// qualified name, i.e. their XML prefix:local form. Unordered arrays of simple items are /// sorted by value. Language Alternative arrays are sorted by the xml:lang qualifiers, with /// the "x-default" item placed first. void Sort(); // --------------------------------------------------------------------------------------------- /// @brief \c Erase() restores the object to a "just constructed" state. void Erase(); // --------------------------------------------------------------------------------------------- /// @brief \c Clone() creates a deep copy of an XMP object. /// /// Use this function to copy an entire XMP metadata tree. Assignment and copy constructors only /// increment a reference count, they do not do a deep copy. This function returns an object, /// not a pointer. The following shows correct usage: /// ///
    /// SXMPMeta * clone1 = new SXMPMeta ( sourceXMP.Clone() );  // This works.
    /// SXMPMeta   clone2 ( sourceXMP.Clone );  	// This works also. (Not a pointer.)
    /// 
/// The \c clone2 example does not use an explicit pointer. /// This is good for local usage, protecting against memory leaks. /// /// This is an example of incorrect usage: ///
    /// SXMPMeta * clone3 = &sourceXMP.Clone();		// ! This does not work!
    /// 
/// The assignment to \c clone3 creates a temporary object, initializes it with the clone, /// assigns the address of the temporary to \c clone3, then deletes the temporary. /// /// @param options Option flags, not currently defined.. /// /// @return An XMP object cloned from the original. TXMPMeta Clone ( XMP_OptionBits options = 0 ) const; // --------------------------------------------------------------------------------------------- /// @brief \c CountArrayItems() reports the number of items currently defined in an array. /// /// @param schemaNS The namespace URI; see \c GetProperty(). /// /// @param arrayName The name of the array. Can be a general path expression, must not be null /// or the empty string; see \c GetProperty() for namespace prefix usage. /// /// @return The number of items. XMP_Index CountArrayItems ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName ) const; // --------------------------------------------------------------------------------------------- /// @brief \c DumpObject() outputs the content of an XMP object to a callback handler for debugging. /// /// Invokes a client-defined callback for each line of output. /// /// @param outProc The client-defined procedure to handle each line of output. /// /// @param clientData A pointer to client-defined data to pass to the handler. /// /// @return A success-fail status value, returned from the handler. Zero is success, failure /// values are client-defined. /// /// @see Static function \c DumpNamespaces() XMP_Status DumpObject ( XMP_TextOutputProc outProc, void * clientData ) const; // --------------------------------------------------------------------------------------------- /// @brief Not implemented XMP_OptionBits GetObjectOptions() const; // --------------------------------------------------------------------------------------------- /// \brief Not implemented void SetObjectOptions ( XMP_OptionBits options ); /// @} // ============================================================================================= XMPMetaRef xmpRef; // *** Should be private, see below. private: #if 0 // *** VS.Net and gcc seem to not handle the friend declarations properly. friend class TXMPIterator ; friend class TXMPUtils ; #endif static void SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen ); }; // class TXMPMeta #endif // __TXMPMeta_hpp__ exempi-2.2.1/public/include/Makefile.in0000664000175000017500000005402112150231001014657 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = public/include SUBDIRS = DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(xmp_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(xmpdir)" HEADERS = $(noinst_HEADERS) $(xmp_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ DIST_SUBDIRS = client-glue xmpdir = $(includedir)/@EXEMPI_INCLUDE_BASE@ xmp_HEADERS = noinst_HEADERS = TXMPFiles.hpp TXMPIterator.hpp \ TXMPMeta.hpp TXMPUtils.hpp \ XMP.hpp XMP_Version.h\ XMP.incl_cpp\ XMP_Const.h XMP_Environment.h \ XMP_UnixEndian.h \ $(NULL) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign public/include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign public/include/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-xmpHEADERS: $(xmp_HEADERS) @$(NORMAL_INSTALL) @list='$(xmp_HEADERS)'; test -n "$(xmpdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(xmpdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(xmpdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(xmpdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(xmpdir)" || exit $$?; \ done uninstall-xmpHEADERS: @$(NORMAL_UNINSTALL) @list='$(xmp_HEADERS)'; test -n "$(xmpdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(xmpdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(xmpdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-xmpHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-xmpHEADERS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ cscopelist cscopelist-recursive ctags ctags-recursive \ distclean distclean-generic distclean-libtool distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-xmpHEADERS installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-xmpHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/public/include/XMP.hpp0000664000175000017500000001012711745673651014024 00000000000000#ifndef __XMP_hpp__ #define __XMP_hpp__ 1 // ================================================================================================= // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // ================================================================================================ /// \file XMP.hpp /// \brief Overall header file for the XMP Toolkit /// /// This is an overall header file, the only one that C++ clients should include. /// /// The full client API is in the \c TXMPMeta.hpp, \c TXMPIterator.hpp, \c TXMPUtils.hpp headers. /// Read these for information, but do not include them directly. The \c TXMP... classes are C++ /// template classes that must be instantiated with a string class such as \c std::string. The /// string class is used to return text strings for property values, serialized XMP, and so on. /// Clients must also compile \c XMP.incl_cpp to ensure that all client-side glue code is generated. /// This should be done by including it in exactly one client source file. /// /// There are two C preprocessor macros that simplify use of the templates: /// /// \li \c TXMP_STRING_TYPE - Define this as the string class to use with the template. You will get /// the template headers included and typedefs (\c SXMPMeta, and so on) to use in your code. /// /// \li \c TXMP_EXPAND_INLINE - Define this as 1 if you want to have the template functions expanded /// inline in your code. Leave it undefined, or defined as 0, to use out-of-line instantiations of /// the template functions. Compiling \c XMP.incl_cpp generates explicit out-of-line /// instantiations if \c TXMP_EXPAND_INLINE is off. /// /// The template parameter, class \c tStringObj, must have the following member functions (which /// match those for \c std::string): /// ///
///  tStringObj& assign ( const char * str, size_t len )
///  size_t size() const
///  const char * c_str() const
/// 
/// /// The string class must be suitable for at least UTF-8. This is the encoding used for all general /// values, and is the default encoding for serialized XMP. The string type must also be suitable /// for UTF-16 or UTF-32 if those serialization encodings are used. This mainly means tolerating /// embedded 0 bytes, which \c std::string does. // ================================================================================================ /// /c XMP_Environment.h must be the first included header. #include "XMP_Environment.h" #include "XMP_Version.h" #include "XMP_Const.h" #if XMP_WinBuild #if XMP_DebugBuild #pragma warning ( push, 4 ) #else #pragma warning ( push, 3 ) #endif #pragma warning ( disable : 4702 ) // unreachable code #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #endif #if defined ( TXMP_STRING_TYPE ) #include "TXMPMeta.hpp" #include "TXMPIterator.hpp" #include "TXMPUtils.hpp" typedef class TXMPMeta SXMPMeta; // For client convenience. typedef class TXMPIterator SXMPIterator; typedef class TXMPUtils SXMPUtils; #if TXMP_EXPAND_INLINE #error "TXMP_EXPAND_INLINE is not working at present. Please don't use it." #include "client-glue/TXMPMeta.incl_cpp" #include "client-glue/TXMPIterator.incl_cpp" #include "client-glue/TXMPUtils.incl_cpp" #include "client-glue/TXMPFiles.incl_cpp" #endif #if XMP_INCLUDE_XMPFILES #include "TXMPFiles.hpp" // ! Needs typedef for SXMPMeta. typedef class TXMPFiles SXMPFiles; #if TXMP_EXPAND_INLINE #include "client-glue/TXMPFiles.incl_cpp" #endif #endif #endif // TXMP_STRING_TYPE #if XMP_WinBuild #pragma warning ( pop ) #endif // ================================================================================================= #endif // __XMP_hpp__ exempi-2.2.1/public/include/TXMPFiles.hpp0000664000175000017500000007447712150230672015134 00000000000000#ifndef __TXMPFiles_hpp__ #define __TXMPFiles_hpp__ 1 #if ( ! __XMP_hpp__ ) #error "Do not directly include, use XMP.hpp" #endif // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // ================================================================================================= /// \file TXMPFiles.hpp /// \brief API for access to the main (document-level) metadata in a file_. /// /// The Adobe XMP Toolkit's file handling component, XMPFiles, is a front end to a set of /// format-specific file handlers that support file I/O for XMP. The file handlers implement smart, /// efficient support for those file formats for which the means to embed XMP is defined in the XMP /// Specification. Where possible, this support allows: /// \li Injection of XMP where none currently exists /// \li Expansion of XMP without regard to existing padding /// \li Reconciliation of the XMP and other legacy forms of metadata. /// /// \c TXMPFiles is designed for use by clients interested in the metadata and not in the primary /// file content; the Adobe Bridge application is a typical example. \c TXMPFiles is not intended to /// be appropriate for files authored by an application; that is, those files for which the /// application has explicit knowledge of the file format. // ================================================================================================= // ================================================================================================= /// \class TXMPFiles TXMPFiles.hpp /// \brief API for access to the main (document-level) metadata in a file. /// /// \c TXMPFiles is a template class that provides the API for the Adobe XMP Toolkit's XMPFiles /// component. This provides convenient access to the main, or document level, XMP for a file. Use /// it to obtain metadata from a file, which you can then manipulate with the XMP Core component /// (the classes \c TXMPMeta, \c TXMPUtils, and \c TXMPIterator); and to write new or changed /// metadata back out to a file. /// /// The functions allow you to open a file, read and write the metadata, then close the file. /// While open, portions of the file might be maintained in RAM data structures. Memory /// usage can vary considerably depending onfile format and access options. /// /// A file can be opened for read-only or read-write access, with typical exclusion for both /// modes. Errors result in the throw of an \c XMPError exception. /// /// \c TXMPFiles is the template class. It must be instantiated with a string class such as /// \c std::string. Read the Toolkit Overview for information about the overall architecture of the XMP /// API, and the documentation for \c XMP.hpp for specific instantiation instructions. /// /// Access these functions through the concrete class, \c SXMPFiles. // ================================================================================================= template class TXMPFiles { public: // ============================================================================================= /// \name Initialization and termination /// @{ /// /// A \c TXMPFiles object must be initialized before use and can be terminated when done. // --------------------------------------------------------------------------------------------- /// @brief \c GetVersionInfo() retrieves version information for the XMPFiles component. /// /// Can be called before \c #Initialize(). This function is static; make the call directly from /// the concrete class (\c SXMPFiles). /// /// @param versionInfo [out] A buffer in which to return the version information. static void GetVersionInfo ( XMP_VersionInfo * versionInfo ); // --------------------------------------------------------------------------------------------- /// @brief Initializes the XMPFiles library; must be called before creating an \c SXMPFiles object. /// /// The main action is to activate the available smart file handlers. Must be called before /// using any methods except \c GetVersionInfo(). /// /// This function is static; make the call directly from the concrete class (\c SXMPFiles). /// /// @return True on success. static bool Initialize(); // --------------------------------------------------------------------------------------------- /// @brief Initializes the XMPFiles library; must be called before creating an \c SXMPFiles object. /// /// This overload of TXMPFiles::Initialize() accepts option bits to customize the initialization /// actions. At this time no option is defined. /// /// The main action is to activate the available smart file handlers. Must be called before /// using any methods except \c GetVersionInfo(). /// /// This function is static; make the call directly from the concrete class (\c SXMPFiles). /// /// @param options Option flags to control the initialization actions. /// /// @return True on success. static bool Initialize ( XMP_OptionBits options ); // --------------------------------------------------------------------------------------------- /// @brief Terminates use of the XMPFiles library. /// /// Optional. Deallocates global data structures created by intialization. Its main action is to /// deallocate heap-allocated global storage, for the benefit of client leak checkers. /// /// This function is static; make the call directly from the concrete class (\c SXMPFiles). static void Terminate(); /// @} // ============================================================================================= /// \name Constructors and destructor /// @{ /// /// The default constructor initializes an object that is associated with no file. The alternate /// constructors call \c OpenFile(). // --------------------------------------------------------------------------------------------- /// @brief Default constructor initializes an object that is associated with no file. TXMPFiles(); // --------------------------------------------------------------------------------------------- /// @brief Destructor; typical virtual destructor. /// /// The destructor does not call \c CloseFile(); pending updates are lost when the destructor is run. /// /// @see \c OpenFile(), \c CloseFile() virtual ~TXMPFiles() throw(); // --------------------------------------------------------------------------------------------- /// @brief Alternate constructor associates the new \c XMPFiles object with a specific file. /// /// Calls \c OpenFile() to open the specified file after performing a default construct. /// /// @param filePath The path for the file, specified as a nul-terminated UTF-8 string. /// /// @param format A format hint for the file, if known. /// /// @param openFlags Options for how the file is to be opened (for read or read/write, for /// example). Use a logical OR of these bit-flag constants: /// /// \li \c #kXMPFiles_OpenForRead /// \li \c #kXMPFiles_OpenForUpdate /// \li \c #kXMPFiles_OpenOnlyXMP /// \li \c #kXMPFiles_OpenStrictly /// \li \c #kXMPFiles_OpenUseSmartHandler /// \li \c #kXMPFiles_OpenUsePacketScanning /// \li \c #kXMPFiles_OpenLimitedScanning /// /// @return The new \c TXMPFiles object. TXMPFiles ( XMP_StringPtr filePath, XMP_FileFormat format = kXMP_UnknownFile, XMP_OptionBits openFlags = 0 ); // --------------------------------------------------------------------------------------------- /// @brief Alternate constructor associates the new \c XMPFiles object with a specific file, /// using a string object. /// /// Overloads the basic form of the function, allowing you to pass a string object /// for the file path. It is otherwise identical; see details in the canonical form. TXMPFiles ( const tStringObj & filePath, XMP_FileFormat format = kXMP_UnknownFile, XMP_OptionBits openFlags = 0 ); // --------------------------------------------------------------------------------------------- /// @brief Copy constructor /// /// Increments an internal reference count but does not perform a deep copy. /// /// @param original The existing \c TXMPFiles object to copy. /// /// @return The new \c TXMPFiles object. TXMPFiles ( const TXMPFiles & original ); // --------------------------------------------------------------------------------------------- /// @brief Assignment operator /// /// Increments an internal reference count but does not perform a deep copy. /// /// @param rhs The existing \c TXMPFiles object. void operator= ( const TXMPFiles & rhs ); // --------------------------------------------------------------------------------------------- /// @brief Reconstructs a \c TXMPFiles object from an internal reference. /// /// This constructor creates a new \c TXMPFiles object that refers to the underlying reference /// object of an existing \c TXMPFiles object. Use to safely pass \c SXMPFiles references across /// DLL boundaries. /// /// @param xmpFilesObj The underlying reference object, obtained from some other XMP object /// with \c TXMPFiles::GetInternalRef(). /// /// @return The new object. TXMPFiles ( XMPFilesRef xmpFilesObj ); // --------------------------------------------------------------------------------------------- /// @brief GetInternalRef() retrieves an internal reference that can be safely passed across DLL /// boundaries and reconstructed. /// /// Use with the reconstruction constructor to safely pass \c SXMPFiles references across DLL /// boundaries where the clients might have used different string types when instantiating /// \c TXMPFiles. /// /// @return The internal reference. /// /// @see \c TXMPMeta::GetInternalRef() for usage. XMPFilesRef GetInternalRef(); /// @} // ============================================================================================= /// \name File handler information /// @{ /// /// Call this static function from the concrete class, \c SXMPFiles, to obtain information about /// the file handlers for the XMPFiles component. // --------------------------------------------------------------------------------------------- /// @brief GetFormatInfo() reports what features are supported for a specific file format. /// /// The file handlers for different file formats vary considerably in what features they /// support. Support depends on both the general capabilities of the format and the /// implementation of the handler for that format. /// ///This function is static; make the call directly from the concrete class (\c SXMPFiles). /// /// @param format The file format whose support flags are desired. /// /// @param handlerFlags [out] A buffer in which to return a logical OR of option bit flags. /// The following constants are defined: /// /// \li \c #kXMPFiles_CanInjectXMP - Can inject first-time XMP into an existing file. /// \li \c #kXMPFiles_CanExpand - Can expand XMP or other metadata in an existing file. /// \li \c #kXMPFiles_CanRewrite - Can copy one file to another, writing new metadata (as in SaveAs) /// \li \c #kXMPFiles_CanReconcile - Supports reconciliation between XMP and other forms. /// \li \c #kXMPFiles_AllowsOnlyXMP - Allows access to just the XMP, ignoring other forms. /// This is only meaningful if \c #kXMPFiles_CanReconcile is set. /// \li \c #kXMPFiles_ReturnsRawPacket - File handler returns raw XMP packet information and string. /// /// Even if \c #kXMPFiles_ReturnsRawPacket is set, the returned packet information might have an /// offset of -1 to indicate an unknown offset. While all file handlers should be able to return /// the raw packet, some might not know the offset of the packet within the file. This is /// typical in cases where external libraries are used. These cases might not even allow return /// of the raw packet. /// /// @return True if the format has explicit "smart" support, false if the format is handled by /// the default packet scanning plus heuristics. */ static bool GetFormatInfo ( XMP_FileFormat format, XMP_OptionBits * handlerFlags = 0 ); /// @} // ============================================================================================= /// \name File operations /// @{ /// /// These functions allow you to open, close, and query files. // --------------------------------------------------------------------------------------------- /// @brief \c CheckFileFormat() tries to determine the format of a file. /// /// Tries to determine the format of a file, returning an \c #XMP_FileFormat value. Uses the /// same logic as \c OpenFile() to select a smart handler. /// /// @param filePath The path for the file, appropriate for the local operating system. Passed as /// a nul-terminated UTF-8 string. The path is the same as would be passed to \c OpenFile. /// /// @return The file's format if a smart handler would be selected by \c OpenFile(), otherwise /// \c #kXMP_UnknownFile. static XMP_FileFormat CheckFileFormat ( XMP_StringPtr filePath ); // --------------------------------------------------------------------------------------------- /// @brief \c CheckPackageFormat() tries to determine the format of a "package" folder. /// /// Tries to determine the format of a package, given the name of the top-level folder. Returns /// an \c #XMP_FileFormat value. Examples of recognized packages include the video formats P2, /// XDCAM, or Sony HDV. These packages contain collections of "clips", stored as multiple files /// in specific subfolders. /// /// @param folderPath The path for the top-level folder, appropriate for the local operating /// system. Passed as a nul-terminated UTF-8 string. This is not the same path you would pass to /// \c OpenFile(). For example, the top-level path for a package might be ".../MyMovie", while /// the path to a file you wish to open would be ".../MyMovie/SomeClip". /// /// @return The package's format if it can be determined, otherwise \c #kXMP_UnknownFile. static XMP_FileFormat CheckPackageFormat ( XMP_StringPtr folderPath ); // --------------------------------------------------------------------------------------------- /// @brief \c OpenFile() opens a file for metadata access. /// /// Opens a file for the requested forms of metadata access. Opening the file at a minimum /// causes the raw XMP packet to be read from the file. If the file handler supports legacy /// metadata reconciliation then legacy metadata is also read, unless \c #kXMPFiles_OpenOnlyXMP /// is passed. /// /// If the file is opened for read-only access (passing \c #kXMPFiles_OpenForRead), the disk /// file is closed immediately after reading the data from it; the \c XMPFiles object, however, /// remains in the open state. You must call \c CloseFile() when finished using it. Other /// methods, such as \c GetXMP(), can only be used between the \c OpenFile() and \c CloseFile() /// calls. The \c XMPFiles destructor does not call \c CloseFile(); if you call it without /// closing, any pending updates are lost. /// /// If the file is opened for update (passing \c #kXMPFiles_OpenForUpdate), the disk file /// remains open until \c CloseFile() is called. The disk file is only updated once, when /// \c CloseFile() is called, regardless of how many calls are made to \c PutXMP(). /// /// Typically, the XMP is not parsed and legacy reconciliation is not performed until \c GetXMP() /// is called, but this is not guaranteed. Specific file handlers might do earlier parsing of /// the XMP. Delayed parsing and early disk file close for read-only access are optimizations /// to help clients implementing file browsers, so that they can access the file briefly /// and possibly display a thumbnail, then postpone more expensive XMP processing until later. /// /// @param filePath The path for the file, appropriate for the local operating system. Passed as /// a nul-terminated UTF-8 string. /// /// @param format The format of the file. If the format is unknown (\c #kXMP_UnknownFile) the /// format is determined from the file content. The first handler to check is guessed from the /// file's extension. Passing a specific format value is generally just a hint about what file /// handler to try first (instead of the one based on the extension). If /// \c #kXMPFiles_OpenStrictly is set, then any format other than \c #kXMP_UnknownFile requires /// that the file actually be that format; otherwise an exception is thrown. /// /// @param openFlags A set of option flags that describe the desired access. By default (zero) /// the file is opened for read-only access and the format handler decides on the level of /// reconciliation that will be performed. A logical OR of these bit-flag constants: /// /// \li \c #kXMPFiles_OpenForRead - Open for read-only access. /// \li \c #kXMPFiles_OpenForUpdate - Open for reading and writing. /// \li \c #kXMPFiles_OpenOnlyXMP - Only the XMP is wanted, no reconciliation. /// \li \c #kXMPFiles_OpenStrictly - Be strict about locating XMP and reconciling with other /// forms. By default, a best effort is made to locate the correct XMP and to reconcile XMP /// with other forms (if reconciliation is done). This option forces stricter rules, resulting /// in exceptions for errors. The definition of strictness is specific to each handler, there /// might be no difference. /// \li \c #kXMPFiles_OpenUseSmartHandler - Require the use of a smart handler. /// \li \c #kXMPFiles_OpenUsePacketScanning - Force packet scanning, do not use a smart handler. /// /// @return True if the file is succesfully opened and attached to a file handler. False for /// anticipated problems, such as passing \c #kXMPFiles_OpenUseSmartHandler but not having an /// appropriate smart handler. Throws an exception for serious problems. bool OpenFile ( XMP_StringPtr filePath, XMP_FileFormat format = kXMP_UnknownFile, XMP_OptionBits openFlags = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c OpenFile() opens a file for metadata access, using a string object /// /// Overloads the basic form of the function, allowing you to pass a string object /// for the file path. It is otherwise identical; see details in the canonical form. bool OpenFile ( const tStringObj & filePath, XMP_FileFormat format = kXMP_UnknownFile, XMP_OptionBits openFlags = 0 ); // --------------------------------------------------------------------------------------------- /// @brief CloseFile() explicitly closes an opened file. /// /// Performs any necessary output to the file and closes it. Files that are opened for update /// are written to only when closing. /// /// If the file is opened for read-only access (passing \c #kXMPFiles_OpenForRead), the disk /// file is closed immediately after reading the data from it; the \c XMPFiles object, however, /// remains in the open state. You must call \c CloseFile() when finished using it. Other /// methods, such as \c GetXMP(), can only be used between the \c OpenFile() and \c CloseFile() /// calls. The \c XMPFiles destructor does not call \c CloseFile(); if you call it without closing, /// any pending updates are lost. /// /// If the file is opened for update (passing \c #kXMPFiles_OpenForUpdate), the disk file remains /// open until \c CloseFile() is called. The disk file is only updated once, when \c CloseFile() /// is called, regardless of how many calls are made to \c PutXMP(). /// /// @param closeFlags Option flags for optional closing actions. This bit-flag constant is /// defined: /// /// \li \c #kXMPFiles_UpdateSafely - Write into a temporary file then swap for crash safety. void CloseFile ( XMP_OptionBits closeFlags = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c GetFileInfo() retrieves basic information about an opened file. /// /// @param filePath [out] A buffer in which to return the path passed to \c OpenFile(). Can be /// null if value is not wanted. /// /// @param openFlags [out] A buffer in which to return the option flags passed to /// \c OpenFile(). Can be null if value is not wanted. /// /// @param format [out] A buffer in which to return the file format. Can be null if value is not /// wanted. /// @param handlerFlags [out] A buffer in which to return the handler's capability flags. Can /// be null if value is not wanted. /// /// @return True if the file object is in the open state; that is, \c OpenFile() has been called /// but \c CloseFile() has not. False otherwise. Even if the file object is open, the actual /// disk file might be closed in the host file-system sense; see \c OpenFile(). bool GetFileInfo ( tStringObj * filePath = 0, XMP_OptionBits * openFlags = 0, XMP_FileFormat * format = 0, XMP_OptionBits * handlerFlags = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c SetAbortProc() registers a callback function used to check for a user-signaled abort. /// /// The specified procedure is called periodically to allow a user to cancel time-consuming /// operations. The callback function should return true to signal an abort, which results in an /// exception being thrown. /// /// @param abortProc The callback function. /// /// @param abortArg A pointer to caller-defined data to pass to the callback function. void SetAbortProc ( XMP_AbortProc abortProc, void * abortArg ); /// @} // ============================================================================================= /// \name Accessing metadata /// @{ /// /// These functions allow you to retrieve XMP metadata from open files, so that you can use the /// \c TXMPMeta API to manipulate it. The \c PutXMP() functions update the XMP packet in memory. /// Changed XMP is not actually written out to the file until the file is closed. // --------------------------------------------------------------------------------------------- /// @brief \c GetXMP() retrieves the XMP metadata from an open file. /// /// The function reports whether XMP is present in the file; you can choose to retrieve any or /// all of the parsed XMP, the raw XMP packet,or information about the raw XMP packet. The /// options provided when the file was opened determine if reconciliation is done with other /// forms of metadata. /// /// @param xmpObj [out] An XMP object in which to return the parsed XMP metadata. Can be null. /// /// @param xmpPacket [out] An string object in which to return the raw XMP packet as stored in /// the file. Can be null. The encoding of the packet is given in the \c packetInfo. Returns an /// empty string if the low level file handler does not provide the raw packet. /// /// @param packetInfo [out] An string object in which to return the location and form of the raw /// XMP in the file. \c #XMP_PacketInfo::charForm and \c #XMP_PacketInfo::writeable reflect the /// raw XMP in the file. The parsed XMP property values are always UTF-8. The writeable flag is /// taken from the packet trailer; it applies only to "format ignorant" writing. The /// \c #XMP_PacketInfo structure always reflects the state of the XMP in the file. The offset, /// length, and character form do not change as a result of calling \c PutXMP() unless the file /// is also written. Some file handlers might not return location or contents of the raw packet /// string. To determine whether one does, check the \c #kXMPFiles_ReturnsRawPacket bit returned /// by \c GetFormatInfo(). If the low-level file handler does not provide the raw packet /// location, \c #XMP_PacketInfo::offset and \c #XMP_PacketInfo::length are both 0, /// \c #XMP_PacketInfo::charForm is UTF-8, and \c #XMP_PacketInfo::writeable is false. /// /// @return True if the file has XMP, false otherwise. bool GetXMP ( SXMPMeta * xmpObj = 0, tStringObj * xmpPacket = 0, XMP_PacketInfo * packetInfo = 0 ); // --------------------------------------------------------------------------------------------- /// @brief \c PutXMP() updates the XMP metadata in this object without writing out the file. /// /// This function supplies new XMP for the file. However, the disk file is not written until the /// object is closed with \c CloseFile(). The options provided when the file was opened /// determine if reconciliation is done with other forms of metadata. /// /// @param xmpObj The new metadata as an XMP object. void PutXMP ( const SXMPMeta & xmpObj ); // --------------------------------------------------------------------------------------------- /// @brief \c PutXMP() updates the XMP metadata in this object without writing out the file, /// using a string object for input. /// /// Overloads the basic form of the function, allowing you to pass the metadata as a string object /// instead of an XMP object. It is otherwise identical; see details in the canonical form. /// /// @param xmpPacket The new metadata as a string object containing a complete XMP packet. void PutXMP ( const tStringObj & xmpPacket ); // --------------------------------------------------------------------------------------------- /// @brief \c PutXMP() updates the XMP metadata in this object without writing out the file, /// using a string object and optional length. /// /// Overloads the basic form of the function, allowing you to pass the metadata as a string object /// instead of an XMP object. It is otherwise identical; see details in the canonical form. /// /// @param xmpPacket The new metadata as a const char * string containing an XMP packet. /// /// @param xmpLength Optional. The number of bytes in the string. If not supplied, the string is /// assumed to be nul-terminated. void PutXMP ( XMP_StringPtr xmpPacket, XMP_StringLen xmpLength = kXMP_UseNullTermination ); // --------------------------------------------------------------------------------------------- /// @brief \c CanPutXMP() reports whether this file can be updated with a specific XMP packet. /// /// Use to determine if the file can probably be updated with a given set of XMP metadata. This /// depends on the size of the packet, the options with which the file was opened, and the /// capabilities of the handler for the file format. The function obtains the length of the /// serialized packet for the provided XMP, but does not keep it or modify it, and does not /// cause the file to be written when closed. This is implemented roughly as follows: /// ///
    /// bool CanPutXMP ( XMP_StringPtr xmpPacket )
    /// {
    ///    XMP_FileFormat format;
    ///    this->GetFileInfo ( 0, &format, 0 );
    ///
    ///    XMP_OptionBits formatFlags;
    ///    GetFormatInfo ( format, &formatFlags );
    ///
    ///    if ( (formatFlags & kXMPFiles_CanInjectXMP) && (formatFlags & kXMPFiles_CanExpand) ) return true;
    ///
    ///    XMP_PacketInfo packetInfo;
    ///    bool hasXMP = this->GetXMP ( 0, 0, &packetInfo );
    ///
    ///    if ( ! hasXMP ) {
    ///       if ( formatFlags & kXMPFiles_CanInjectXMP ) return true;
    ///    } else {
    ///       if ( (formatFlags & kXMPFiles_CanExpand) ||
    ///            (packetInfo.length >= strlen(xmpPacket)) ) return true;
    ///    }
    ///    return false;
    /// }
    /// 
/// /// @param xmpObj The proposed new metadata as an XMP object. bool CanPutXMP ( const SXMPMeta & xmpObj ); // --------------------------------------------------------------------------------------------- /// @brief \c CanPutXMP() reports whether this file can be updated with a specific XMP packet, /// passed in a string object. /// /// Overloads the basic form of the function, allowing you to pass the metadata as a string object /// instead of an XMP object. It is otherwise identical; see details in the canonical form. /// /// @param xmpPacket The proposed new metadata as a string object containing an XMP packet. bool CanPutXMP ( const tStringObj & xmpPacket ); // --------------------------------------------------------------------------------------------- /// @brief \c CanPutXMP() reports whether this file can be updated with a specific XMP packet, /// passed in a string object. /// /// Overloads the basic form of the function, allowing you to pass the metadata as a string object /// instead of an XMP object. It is otherwise identical; see details in the canonical form. /// /// @param xmpPacket The proposed new metadata as a const char * string containing an XMP packet. /// /// @param xmpLength Optional. The number of bytes in the string. If not supplied, the string /// is assumed to be nul-terminated. bool CanPutXMP ( XMP_StringPtr xmpPacket, XMP_StringLen xmpLength = kXMP_UseNullTermination ); /// @} // ============================================================================================= private: XMPFilesRef xmpFilesRef; static void SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen ); }; // class TXMPFiles // ================================================================================================= #endif // __TXMPFiles_hpp__ exempi-2.2.1/public/include/XMP.incl_cpp0000664000175000017500000000462611745673651015033 00000000000000#ifndef __XMP_incl_cpp__ #define __XMP_incl_cpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // ================================================================================================ /// \file XMP.incl_cpp /// \brief Overall client glue file for the XMP toolkit. /// /// This is an overall client source file of XMP toolkit glue, the only XMP-specific one that /// clients should build in projects. This ensures that all of the client-side glue code for the /// XMP toolkit gets compiled. /// /// You cannot compile this file directly, because the template's string type must be declared and /// only the client can do that. Instead, include this in some other source file. For example, /// to use std::string you only need these two lines: /// /// \code /// #include /// #include "XMP.incl_cpp" /// \endcode #include "XMP.hpp" // ! This must be the first include! #define XMP_ClientBuild 1 #if XMP_WinBuild #if XMP_DebugBuild #pragma warning ( push, 4 ) #else #pragma warning ( push, 3 ) #endif #pragma warning ( disable : 4127 ) // conditional expression is constant #pragma warning ( disable : 4189 ) // local variable is initialized but not referenced #pragma warning ( disable : 4702 ) // unreachable code #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #endif #if defined ( TXMP_STRING_TYPE ) && (! TXMP_EXPAND_INLINE) // We're using a single out of line instantiation. Do it here. #include "client-glue/TXMPMeta.incl_cpp" #include "client-glue/TXMPIterator.incl_cpp" #include "client-glue/TXMPUtils.incl_cpp" template class TXMPMeta ; template class TXMPIterator ; template class TXMPUtils ; #if XMP_INCLUDE_XMPFILES #include "client-glue/TXMPFiles.incl_cpp" template class TXMPFiles ; #endif #endif #if XMP_WinBuild #pragma warning ( pop ) #endif #endif // __XMP_incl_cpp__ exempi-2.2.1/public/include/client-glue/0000775000175000017500000000000012163706253015124 500000000000000exempi-2.2.1/public/include/client-glue/WXMPIterator.hpp0000664000175000017500000000517111745673651020100 00000000000000#if ! __WXMPIterator_hpp__ #define __WXMPIterator_hpp__ 1 // ================================================================================================= // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "client-glue/WXMP_Common.hpp" #if __cplusplus extern "C" { #endif // ================================================================================================= #define zXMPIterator_PropCTor_1(xmpRef,schemaNS,propName,options) \ WXMPIterator_PropCTor_1 ( xmpRef, schemaNS, propName, options, &wResult ); #define zXMPIterator_TableCTor_1(schemaNS,propName,options) \ WXMPIterator_TableCTor_1 ( schemaNS, propName, options, &wResult ); #define zXMPIterator_Next_1(schemaNS,propPath,propValue,options,SetClientString) \ WXMPIterator_Next_1 ( this->iterRef, schemaNS, propPath, propValue, options, SetClientString, &wResult ); #define zXMPIterator_Skip_1(options) \ WXMPIterator_Skip_1 ( this->iterRef, options, &wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPIterator_PropCTor_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPIterator_TableCTor_1 ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPIterator_IncrementRefCount_1 ( XMPIteratorRef iterRef ); extern void WXMPIterator_DecrementRefCount_1 ( XMPIteratorRef iterRef ); extern void WXMPIterator_Next_1 ( XMPIteratorRef iterRef, void * schemaNS, void * propPath, void * propValue, XMP_OptionBits * options, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPIterator_Skip_1 ( XMPIteratorRef iterRef, XMP_OptionBits options, WXMP_Result * wResult ); // ================================================================================================= #if __cplusplus } /* extern "C" */ #endif #endif // __WXMPIterator_hpp__ exempi-2.2.1/public/include/client-glue/WXMPUtils.hpp0000664000175000017500000003322311745673651017406 00000000000000#if ! __WXMPUtils_hpp__ #define __WXMPUtils_hpp__ 1 // ================================================================================================= // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "client-glue/WXMP_Common.hpp" #if __cplusplus extern "C" { #endif // ================================================================================================= #define zXMPUtils_ComposeArrayItemPath_1(schemaNS,arrayName,itemIndex,itemPath,SetClientString) \ WXMPUtils_ComposeArrayItemPath_1 ( schemaNS, arrayName, itemIndex, itemPath, SetClientString, &wResult ); #define zXMPUtils_ComposeStructFieldPath_1(schemaNS,structName,fieldNS,fieldName,fieldPath,SetClientString) \ WXMPUtils_ComposeStructFieldPath_1 ( schemaNS, structName, fieldNS, fieldName, fieldPath, SetClientString, &wResult ); #define zXMPUtils_ComposeQualifierPath_1(schemaNS,propName,qualNS,qualName,qualPath,SetClientString) \ WXMPUtils_ComposeQualifierPath_1 ( schemaNS, propName, qualNS, qualName, qualPath, SetClientString, &wResult ); #define zXMPUtils_ComposeLangSelector_1(schemaNS,arrayName,langName,selPath,SetClientString) \ WXMPUtils_ComposeLangSelector_1 ( schemaNS, arrayName, langName, selPath, SetClientString, &wResult ); #define zXMPUtils_ComposeFieldSelector_1(schemaNS,arrayName,fieldNS,fieldName,fieldValue,selPath,SetClientString) \ WXMPUtils_ComposeFieldSelector_1 ( schemaNS, arrayName, fieldNS, fieldName, fieldValue, selPath, SetClientString, &wResult ); #define zXMPUtils_ConvertFromBool_1(binValue,strValue,SetClientString) \ WXMPUtils_ConvertFromBool_1 ( binValue, strValue, SetClientString, &wResult ); #define zXMPUtils_ConvertFromInt_1(binValue,format,strValue,SetClientString) \ WXMPUtils_ConvertFromInt_1 ( binValue, format, strValue, SetClientString, &wResult ); #define zXMPUtils_ConvertFromInt64_1(binValue,format,strValue,SetClientString) \ WXMPUtils_ConvertFromInt64_1 ( binValue, format, strValue, SetClientString, &wResult ); #define zXMPUtils_ConvertFromFloat_1(binValue,format,strValue,SetClientString) \ WXMPUtils_ConvertFromFloat_1 ( binValue, format, strValue, SetClientString, &wResult ); #define zXMPUtils_ConvertFromDate_1(binValue,strValue,SetClientString) \ WXMPUtils_ConvertFromDate_1 ( binValue, strValue, SetClientString, &wResult ); #define zXMPUtils_ConvertToBool_1(strValue) \ WXMPUtils_ConvertToBool_1 ( strValue, &wResult ); #define zXMPUtils_ConvertToInt_1(strValue) \ WXMPUtils_ConvertToInt_1 ( strValue, &wResult ); #define zXMPUtils_ConvertToInt64_1(strValue) \ WXMPUtils_ConvertToInt64_1 ( strValue, &wResult ); #define zXMPUtils_ConvertToFloat_1(strValue) \ WXMPUtils_ConvertToFloat_1 ( strValue, &wResult ); #define zXMPUtils_ConvertToDate_1(strValue,binValue) \ WXMPUtils_ConvertToDate_1 ( strValue, binValue, &wResult ); #define zXMPUtils_CurrentDateTime_1(time) \ WXMPUtils_CurrentDateTime_1 ( time, &wResult ); #define zXMPUtils_SetTimeZone_1(time) \ WXMPUtils_SetTimeZone_1 ( time, &wResult ); #define zXMPUtils_ConvertToUTCTime_1(time) \ WXMPUtils_ConvertToUTCTime_1 ( time, &wResult ); #define zXMPUtils_ConvertToLocalTime_1(time) \ WXMPUtils_ConvertToLocalTime_1 ( time, &wResult ); #define zXMPUtils_CompareDateTime_1(left,right) \ WXMPUtils_CompareDateTime_1 ( left, right, &wResult ); #define zXMPUtils_EncodeToBase64_1(rawStr,rawLen,encodedStr,SetClientString) \ WXMPUtils_EncodeToBase64_1 ( rawStr, rawLen, encodedStr, SetClientString, &wResult ); #define zXMPUtils_DecodeFromBase64_1(encodedStr,encodedLen,rawStr,SetClientString) \ WXMPUtils_DecodeFromBase64_1 ( encodedStr, encodedLen, rawStr, SetClientString, &wResult ); #define zXMPUtils_PackageForJPEG_1(xmpObj,stdStr,extStr,digestStr,SetClientString) \ WXMPUtils_PackageForJPEG_1 ( xmpObj, stdStr, extStr, digestStr, SetClientString, &wResult ); #define zXMPUtils_MergeFromJPEG_1(fullXMP,extendedXMP) \ WXMPUtils_MergeFromJPEG_1 ( fullXMP, extendedXMP, &wResult ); #define zXMPUtils_CatenateArrayItems_1(xmpObj,schemaNS,arrayName,separator,quotes,options,catedStr,SetClientString) \ WXMPUtils_CatenateArrayItems_1 ( xmpObj, schemaNS, arrayName, separator, quotes, options, catedStr, SetClientString, &wResult ); #define zXMPUtils_SeparateArrayItems_1(xmpObj,schemaNS,arrayName,options,catedStr) \ WXMPUtils_SeparateArrayItems_1 ( xmpObj, schemaNS, arrayName, options, catedStr, &wResult ); #define zXMPUtils_ApplyTemplate_1(workingXMP,templateXMP,actions) \ WXMPUtils_ApplyTemplate_1 ( workingXMP, templateXMP, actions, &wResult ); #define zXMPUtils_RemoveProperties_1(xmpObj,schemaNS,propName,options) \ WXMPUtils_RemoveProperties_1 ( xmpObj, schemaNS, propName, options, &wResult ); #define zXMPUtils_DuplicateSubtree_1(source,dest,sourceNS,sourceRoot,destNS,destRoot,options) \ WXMPUtils_DuplicateSubtree_1 ( source, dest, sourceNS, sourceRoot, destNS, destRoot, options, &wResult ); // ================================================================================================= extern void WXMPUtils_ComposeArrayItemPath_1 ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, void * itemPath, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPUtils_ComposeStructFieldPath_1 ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, void * fieldPath, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPUtils_ComposeQualifierPath_1 ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, void * qualPath, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPUtils_ComposeLangSelector_1 ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr langName, void * selPath, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPUtils_ComposeFieldSelector_1 ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, void * selPath, SetClientStringProc SetClientString, WXMP_Result * wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPUtils_ConvertFromBool_1 ( XMP_Bool binValue, void * strValue, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPUtils_ConvertFromInt_1 ( XMP_Int32 binValue, XMP_StringPtr format, void * strValue, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPUtils_ConvertFromInt64_1 ( XMP_Int64 binValue, XMP_StringPtr format, void * strValue, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPUtils_ConvertFromFloat_1 ( double binValue, XMP_StringPtr format, void * strValue, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPUtils_ConvertFromDate_1 ( const XMP_DateTime & binValue, void * strValue, SetClientStringProc SetClientString, WXMP_Result * wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPUtils_ConvertToBool_1 ( XMP_StringPtr strValue, WXMP_Result * wResult ); extern void WXMPUtils_ConvertToInt_1 ( XMP_StringPtr strValue, WXMP_Result * wResult ); extern void WXMPUtils_ConvertToInt64_1 ( XMP_StringPtr strValue, WXMP_Result * wResult ); extern void WXMPUtils_ConvertToFloat_1 ( XMP_StringPtr strValue, WXMP_Result * wResult ); extern void WXMPUtils_ConvertToDate_1 ( XMP_StringPtr strValue, XMP_DateTime * binValue, WXMP_Result * wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPUtils_CurrentDateTime_1 ( XMP_DateTime * time, WXMP_Result * wResult ); extern void WXMPUtils_SetTimeZone_1 ( XMP_DateTime * time, WXMP_Result * wResult ); extern void WXMPUtils_ConvertToUTCTime_1 ( XMP_DateTime * time, WXMP_Result * wResult ); extern void WXMPUtils_ConvertToLocalTime_1 ( XMP_DateTime * time, WXMP_Result * wResult ); extern void WXMPUtils_CompareDateTime_1 ( const XMP_DateTime & left, const XMP_DateTime & right, WXMP_Result * wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPUtils_EncodeToBase64_1 ( XMP_StringPtr rawStr, XMP_StringLen rawLen, void * encodedStr, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPUtils_DecodeFromBase64_1 ( XMP_StringPtr encodedStr, XMP_StringLen encodedLen, void * rawStr, SetClientStringProc SetClientString, WXMP_Result * wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPUtils_PackageForJPEG_1 ( XMPMetaRef xmpObj, void * stdStr, void * extStr, void * digestStr, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPUtils_MergeFromJPEG_1 ( XMPMetaRef fullXMP, XMPMetaRef extendedXMP, WXMP_Result * wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPUtils_CatenateArrayItems_1 ( XMPMetaRef xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr separator, XMP_StringPtr quotes, XMP_OptionBits options, void * catedStr, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPUtils_SeparateArrayItems_1 ( XMPMetaRef xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, XMP_StringPtr catedStr, WXMP_Result * wResult ); extern void WXMPUtils_ApplyTemplate_1 ( XMPMetaRef workingXMP, XMPMetaRef templateXMP, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPUtils_RemoveProperties_1 ( XMPMetaRef xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPUtils_DuplicateSubtree_1 ( XMPMetaRef source, XMPMetaRef dest, XMP_StringPtr sourceNS, XMP_StringPtr sourceRoot, XMP_StringPtr destNS, XMP_StringPtr destRoot, XMP_OptionBits options, WXMP_Result * wResult ); // ================================================================================================= #if __cplusplus } /* extern "C" */ #endif #endif // __WXMPUtils_hpp__ exempi-2.2.1/public/include/client-glue/TXMPMeta.incl_cpp0000664000175000017500000007274711745673651020207 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // ================================================================================================ /// \file TXMPMeta.incl_cpp /// \brief The implementation of the TXMPMeta template class. #include "XMP.hpp" #include "client-glue/WXMP_Common.hpp" #include "client-glue/WXMPMeta.hpp" // ================================================================================================= // Implementation Guidelines // ========================= // // The implementations of the template functions are very stylized. ... // // ================================================================================================= #ifndef XMP_TraceCTorDTor #define XMP_TraceCTorDTor 0 #endif #if XMP_TraceCTorDTor class XMPeek { // Hack to peek at the client ref count in the internal object. public: XMPeek(); virtual ~XMPeek(); XMP_Int32 clientRefs; }; #endif // ================================================================================================= // Local utilities // =============== class TOPW_Info { public: XMP_TextOutputProc clientProc; void * clientRefCon; TOPW_Info ( XMP_TextOutputProc proc, void * refCon ) : clientProc(proc), clientRefCon(refCon) {}; private: TOPW_Info() {}; // ! Hide default constructor. }; static XMP_Status TextOutputProcWrapper ( void * refCon, XMP_StringPtr buffer, XMP_StringLen bufferSize ) { try { // Don't let client callback exceptions propagate across DLL boundaries. TOPW_Info * info = (TOPW_Info*)refCon; return info->clientProc ( info->clientRefCon, buffer, bufferSize ); } catch ( ... ) { return -1; } } // ================================================================================================= // Initialization and termination // ============================== XMP_MethodIntro(TXMPMeta,void):: SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen ) { tStringObj * clientStr = (tStringObj*) clientPtr; clientStr->assign ( valuePtr, valueLen ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: GetVersionInfo ( XMP_VersionInfo * info ) { WrapNoCheckVoid ( zXMPMeta_GetVersionInfo_1 ( info ) ); } // ------------------------------------------------------------------------------------------------- #if XMP_TraceClientCalls FILE * xmpClientLog = stderr; #endif #ifndef XMP_TypeCheck #if ! XMP_DebugBuild #define XMP_TypeCheck(e,msg) /* nothing */ #else #define XMP_TypeCheck(e,msg) if ( ! (e) ) throw XMP_Error ( kXMPErr_AssertFailure, msg ); #endif #endif XMP_MethodIntro(TXMPMeta,bool):: Initialize() { // Verify critical type sizes. XMP_TypeCheck ( (sizeof(XMP_Int8) == 1), "Size wrong for critical type XMP_Int8" ); XMP_TypeCheck ( (sizeof(XMP_Int16) == 2), "Size wrong for critical type XMP_Int16" ); XMP_TypeCheck ( (sizeof(XMP_Int32) == 4), "Size wrong for critical type XMP_Int32" ); XMP_TypeCheck ( (sizeof(XMP_Int64) == 8), "Size wrong for critical type XMP_Int64" ); XMP_TypeCheck ( (sizeof(XMP_Uns8) == 1), "Size wrong for critical type XMP_Uns8" ); XMP_TypeCheck ( (sizeof(XMP_Uns16) == 2), "Size wrong for critical type XMP_Uns16" ); XMP_TypeCheck ( (sizeof(XMP_Uns32) == 4), "Size wrong for critical type XMP_Uns32" ); XMP_TypeCheck ( (sizeof(XMP_Uns64) == 8), "Size wrong for critical type XMP_Uns64" ); #if XMP_TraceClientCallsToFile xmpClientLog = fopen ( "XMPClientLog.txt", "w" ); if ( xmpClientLog == 0 ) xmpClientLog = stderr; #endif WrapCheckBool ( ok, zXMPMeta_Initialize_1() ); return ok; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: Terminate() { WrapNoCheckVoid ( zXMPMeta_Terminate_1() ); #if XMP_TraceClientCallsToFile if ( xmpClientLog != stderr ) fclose ( xmpClientLog ); xmpClientLog = stderr; #endif } // ================================================================================================= // Constuctors, destructor, operators // ================================== static XMPMetaRef DefaultCTor() { WrapCheckMetaRef ( newRef, zXMPMeta_CTor_1() ); return newRef; } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPMeta):: TXMPMeta() : xmpRef(DefaultCTor()) { #if XMP_TraceCTorDTor XMPeek* xmPtr = (XMPeek*)this->xmpRef; printf ( "Default construct TXMPMeta @ %.8X, ref = %.8X, count = %d\n", this, xmPtr, xmPtr->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPMeta):: TXMPMeta ( const TXMPMeta & original ) : xmpRef(original.xmpRef) { WXMPMeta_IncrementRefCount_1 ( this->xmpRef ); #if XMP_TraceCTorDTor XMPeek* xmPtr = (XMPeek*)this->xmpRef; printf ( "Copy construct TXMPMeta @ %.8X, ref = %.8X, count = %d\n", this, xmPtr, xmPtr->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: operator= ( const TXMPMeta & rhs ) { #if XMP_TraceCTorDTor XMPeek* xmLHS = (XMPeek*)this->xmpRef; XMPeek* xmRHS = (XMPeek*)rhs.xmpRef; printf ( "Assign TXMPMeta, lhs @ %.8X, rhs @ %.8X\n", this, &rhs ); printf ( " original lhs ref = %.8X, count = %d\n", xmLHS, xmLHS->clientRefs ); printf ( " original rhs ref = %.8X, count = %d\n", xmRHS, xmRHS->clientRefs ); #endif XMPMetaRef oldRef = this->xmpRef; // ! Decrement last so errors leave client object OK. this->xmpRef = rhs.xmpRef; WXMPMeta_IncrementRefCount_1 ( this->xmpRef ); // Increment the count on the new ref. WXMPMeta_DecrementRefCount_1 ( oldRef ); // Decrement the count on the old ref. #if XMP_TraceCTorDTor printf ( " result lhs ref = %.8X, count = %d\n", xmLHS, xmLHS->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPMeta):: TXMPMeta ( XMPMetaRef _xmpRef ) : xmpRef(_xmpRef) { WXMPMeta_IncrementRefCount_1 ( this->xmpRef ); #if XMP_TraceCTorDTor XMPeek* xmPtr = (XMPeek*)this->xmpRef; printf ( "Ref construct TXMPMeta @ %.8X, ref = %.8X, count = %d\n", this, xmPtr, xmPtr->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPMeta):: TXMPMeta ( XMP_StringPtr buffer, XMP_StringLen xmpSize ) : xmpRef(DefaultCTor()) { #if XMP_TraceCTorDTor XMPeek* xmPtr = (XMPeek*)this->xmpRef; printf ( "Parse construct TXMPMeta @ %.8X, ref = %.8X, count = %d\n", this, xmPtr, xmPtr->clientRefs ); #endif try { this->ParseFromBuffer ( buffer, xmpSize ); } catch ( ... ) { WXMPMeta_DecrementRefCount_1 ( this->xmpRef ); this->xmpRef = 0; throw; } } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPMeta):: ~TXMPMeta() throw() { #if XMP_TraceCTorDTor XMPeek* xmPtr = (XMPeek*)this->xmpRef; printf ( "Destruct TXMPMeta @ %.8X, ref = %.8X, count = %d\n", this, xmPtr, xmPtr->clientRefs ); #endif WXMPMeta_DecrementRefCount_1 ( this->xmpRef ); this->xmpRef = 0; } // ~TXMPMeta () // ================================================================================================= // Global state functions // ====================== XMP_MethodIntro(TXMPMeta,XMP_OptionBits):: GetGlobalOptions() { WrapCheckOptions ( options, zXMPMeta_GetGlobalOptions_1() ); return options; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetGlobalOptions ( XMP_OptionBits options ) { WrapCheckVoid ( zXMPMeta_SetGlobalOptions_1 ( options ) ); } // ------------------------------------------------------------------------------------------------- // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,XMP_Status):: DumpNamespaces ( XMP_TextOutputProc outProc, void * refCon ) { TOPW_Info info ( outProc, refCon ); WrapCheckStatus ( status, zXMPMeta_DumpNamespaces_1 ( TextOutputProcWrapper, &info ) ); return status; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: RegisterNamespace ( XMP_StringPtr namespaceURI, XMP_StringPtr suggestedPrefix, tStringObj * registeredPrefix ) { WrapCheckBool ( prefixMatch, zXMPMeta_RegisterNamespace_1 ( namespaceURI, suggestedPrefix, registeredPrefix, SetClientString ) ); return prefixMatch; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: GetNamespacePrefix ( XMP_StringPtr namespaceURI, tStringObj * namespacePrefix ) { WrapCheckBool ( found, zXMPMeta_GetNamespacePrefix_1 ( namespaceURI, namespacePrefix, SetClientString ) ); return found; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: GetNamespaceURI ( XMP_StringPtr namespacePrefix, tStringObj * namespaceURI ) { WrapCheckBool ( found, zXMPMeta_GetNamespaceURI_1 ( namespacePrefix, namespaceURI, SetClientString ) ); return found; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: DeleteNamespace ( XMP_StringPtr namespaceURI ) { WrapCheckVoid ( zXMPMeta_DeleteNamespace_1 ( namespaceURI ) ); } // ================================================================================================= // Basic property manipulation functions // ===================================== XMP_MethodIntro(TXMPMeta,bool):: GetProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName, tStringObj * propValue, XMP_OptionBits * options ) const { WrapCheckBool ( found, zXMPMeta_GetProperty_1 ( schemaNS, propName, propValue, options, SetClientString ) ); return found; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: GetArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, tStringObj * itemValue, XMP_OptionBits * options ) const { WrapCheckBool ( found, zXMPMeta_GetArrayItem_1 ( schemaNS, arrayName, itemIndex, itemValue, options, SetClientString ) ); return found; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: GetStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, tStringObj * fieldValue, XMP_OptionBits * options ) const { WrapCheckBool ( found, zXMPMeta_GetStructField_1 ( schemaNS, structName, fieldNS, fieldName, fieldValue, options, SetClientString ) ); return found; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: GetQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, tStringObj * qualValue, XMP_OptionBits * options ) const { WrapCheckBool ( found, zXMPMeta_GetQualifier_1 ( schemaNS, propName, qualNS, qualName, qualValue, options, SetClientString ) ); return found; } //GetQualifier () // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr propValue, XMP_OptionBits options /* = 0 */ ) { WrapCheckVoid ( zXMPMeta_SetProperty_1 ( schemaNS, propName, propValue, options ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName, const tStringObj & propValue, XMP_OptionBits options /* = 0 */ ) { this->SetProperty ( schemaNS, propName, propValue.c_str(), options ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, XMP_StringPtr itemValue, XMP_OptionBits options /* = 0 */ ) { WrapCheckVoid ( zXMPMeta_SetArrayItem_1 ( schemaNS, arrayName, itemIndex, itemValue, options ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, const tStringObj & itemValue, XMP_OptionBits options /* = 0 */ ) { this->SetArrayItem ( schemaNS, arrayName, itemIndex, itemValue.c_str(), options ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: AppendArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, XMP_StringPtr itemValue, XMP_OptionBits options /* = 0 */ ) { WrapCheckVoid ( zXMPMeta_AppendArrayItem_1 ( schemaNS, arrayName, arrayOptions, itemValue, options ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: AppendArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, const tStringObj & itemValue, XMP_OptionBits options /* = 0 */ ) { this->AppendArrayItem ( schemaNS, arrayName, arrayOptions, itemValue.c_str(), options ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, XMP_OptionBits options /* = 0 */ ) { WrapCheckVoid ( zXMPMeta_SetStructField_1 ( schemaNS, structName, fieldNS, fieldName, fieldValue, options ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, const tStringObj & fieldValue, XMP_OptionBits options /* = 0 */ ) { this->SetStructField ( schemaNS, structName, fieldNS, fieldName, fieldValue.c_str(), options ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, XMP_StringPtr qualValue, XMP_OptionBits options /* = 0 */ ) { WrapCheckVoid ( zXMPMeta_SetQualifier_1 ( schemaNS, propName, qualNS, qualName, qualValue, options ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, const tStringObj & qualValue, XMP_OptionBits options /* = 0 */ ) { this->SetQualifier ( schemaNS, propName, qualNS, qualName, qualValue.c_str(), options ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: DeleteProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName ) { WrapCheckVoid ( zXMPMeta_DeleteProperty_1 ( schemaNS, propName ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: DeleteArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex ) { WrapCheckVoid ( zXMPMeta_DeleteArrayItem_1 ( schemaNS, arrayName, itemIndex ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: DeleteStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName ) { WrapCheckVoid ( zXMPMeta_DeleteStructField_1 ( schemaNS, structName, fieldNS, fieldName ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: DeleteQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName ) { WrapCheckVoid ( zXMPMeta_DeleteQualifier_1 ( schemaNS, propName, qualNS, qualName ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: DoesPropertyExist ( XMP_StringPtr schemaNS, XMP_StringPtr propName ) const { WrapCheckBool ( exists, zXMPMeta_DoesPropertyExist_1 ( schemaNS, propName ) ); return exists; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: DoesArrayItemExist ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex ) const { WrapCheckBool ( exists, zXMPMeta_DoesArrayItemExist_1 ( schemaNS, arrayName, itemIndex ) ); return exists; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: DoesStructFieldExist ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName ) const { WrapCheckBool ( exists, zXMPMeta_DoesStructFieldExist_1 ( schemaNS, structName, fieldNS, fieldName ) ); return exists; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: DoesQualifierExist ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName ) const { WrapCheckBool ( exists, zXMPMeta_DoesQualifierExist_1 ( schemaNS, propName, qualNS, qualName ) ); return exists; } // ================================================================================================= // Specialized Get and Set functions // ================================= XMP_MethodIntro(TXMPMeta,bool):: GetLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, tStringObj * actualLang, tStringObj * itemValue, XMP_OptionBits * options ) const { WrapCheckBool ( found, zXMPMeta_GetLocalizedText_1 ( schemaNS, altTextName, genericLang, specificLang, actualLang, itemValue, options, SetClientString ) ); return found; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, XMP_StringPtr itemValue, XMP_OptionBits options /* = 0 */ ) { WrapCheckVoid ( zXMPMeta_SetLocalizedText_1 ( schemaNS, altTextName, genericLang, specificLang, itemValue, options ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, const tStringObj & itemValue, XMP_OptionBits options /* = 0 */ ) { this->SetLocalizedText ( schemaNS, altTextName, genericLang, specificLang, itemValue.c_str(), options ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: DeleteLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang ) { WrapCheckVoid ( zXMPMeta_DeleteLocalizedText_1 ( schemaNS, altTextName, genericLang, specificLang ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: GetProperty_Bool ( XMP_StringPtr schemaNS, XMP_StringPtr propName, bool * propValue, XMP_OptionBits * options ) const { XMP_Bool binValue; WrapCheckBool ( found, zXMPMeta_GetProperty_Bool_1 ( schemaNS, propName, &binValue, options ) ); if ( found && (propValue != 0) ) *propValue = binValue; return found; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: GetProperty_Int ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int32 * propValue, XMP_OptionBits * options ) const { WrapCheckBool ( found, zXMPMeta_GetProperty_Int_1 ( schemaNS, propName, propValue, options ) ); return found; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: GetProperty_Int64 ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int64 * propValue, XMP_OptionBits * options ) const { WrapCheckBool ( found, zXMPMeta_GetProperty_Int64_1 ( schemaNS, propName, propValue, options ) ); return found; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: GetProperty_Float ( XMP_StringPtr schemaNS, XMP_StringPtr propName, double * propValue, XMP_OptionBits * options ) const { WrapCheckBool ( found, zXMPMeta_GetProperty_Float_1 ( schemaNS, propName, propValue, options ) ); return found; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,bool):: GetProperty_Date ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_DateTime * propValue, XMP_OptionBits * options ) const { WrapCheckBool ( found, zXMPMeta_GetProperty_Date_1 ( schemaNS, propName, propValue, options ) ); return found; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetProperty_Bool ( XMP_StringPtr schemaNS, XMP_StringPtr propName, bool propValue, XMP_OptionBits options /* = 0 */ ) { WrapCheckVoid ( zXMPMeta_SetProperty_Bool_1 ( schemaNS, propName, propValue, options ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetProperty_Int ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int32 propValue, XMP_OptionBits options /* = 0 */ ) { WrapCheckVoid ( zXMPMeta_SetProperty_Int_1 ( schemaNS, propName, propValue, options ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetProperty_Int64 ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int64 propValue, XMP_OptionBits options /* = 0 */ ) { WrapCheckVoid ( zXMPMeta_SetProperty_Int64_1 ( schemaNS, propName, propValue, options ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetProperty_Float ( XMP_StringPtr schemaNS, XMP_StringPtr propName, double propValue, XMP_OptionBits options /* = 0 */ ) { WrapCheckVoid ( zXMPMeta_SetProperty_Float_1 ( schemaNS, propName, propValue, options ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetProperty_Date ( XMP_StringPtr schemaNS, XMP_StringPtr propName, const XMP_DateTime & propValue, XMP_OptionBits options /* = 0 */ ) { WrapCheckVoid ( zXMPMeta_SetProperty_Date_1 ( schemaNS, propName, propValue, options ) ); } // ================================================================================================= // Miscellaneous Member Functions // ============================== XMP_MethodIntro(TXMPMeta,XMPMetaRef):: GetInternalRef() const { return this->xmpRef; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: GetObjectName ( tStringObj * nameStr ) const { WrapCheckVoid ( zXMPMeta_GetObjectName_1 ( nameStr, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetObjectName ( XMP_StringPtr name ) { WrapCheckVoid ( zXMPMeta_SetObjectName_1 ( name ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetObjectName ( tStringObj name ) { this->SetObjectName ( name.c_str() ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,XMP_OptionBits):: GetObjectOptions() const { WrapCheckOptions ( options, zXMPMeta_GetObjectOptions_1() ); return options; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SetObjectOptions ( XMP_OptionBits options ) { WrapCheckVoid ( zXMPMeta_SetObjectOptions_1 ( options ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: Sort() { WrapCheckVoid ( zXMPMeta_Sort_1() ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: Erase() { WrapCheckVoid ( zXMPMeta_Erase_1() ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,TXMPMeta):: Clone ( XMP_OptionBits options ) const { WrapCheckMetaRef ( cloneRef, zXMPMeta_Clone_1 ( options ) ); return TXMPMeta ( cloneRef ); // Ref construct will increment the clientRefs. } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,XMP_Index):: CountArrayItems ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName ) const { WrapCheckIndex ( count, zXMPMeta_CountArrayItems_1 ( schemaNS, arrayName ) ); return count; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,XMP_Status):: DumpObject ( XMP_TextOutputProc outProc, void * refCon ) const { TOPW_Info info ( outProc, refCon ); WrapCheckStatus ( status, zXMPMeta_DumpObject_1 ( TextOutputProcWrapper, &info ) ); return status; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: ParseFromBuffer ( XMP_StringPtr buffer, XMP_StringLen bufferSize, XMP_OptionBits options /* = 0 */ ) { WrapCheckVoid ( zXMPMeta_ParseFromBuffer_1 ( buffer, bufferSize, options ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SerializeToBuffer ( tStringObj * pktString, XMP_OptionBits options, XMP_StringLen padding, XMP_StringPtr newline, XMP_StringPtr indent, XMP_Index baseIndent /* = 0 */ ) const { WrapCheckVoid ( zXMPMeta_SerializeToBuffer_1 ( pktString, options, padding, newline, indent, baseIndent, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPMeta,void):: SerializeToBuffer ( tStringObj * pktString, XMP_OptionBits options /* = 0 */, XMP_StringLen padding /* = 0 */ ) const { this->SerializeToBuffer ( pktString, options, padding, "", "", 0 ); } // ------------------------------------------------------------------------------------------------- // ================================================================================================= exempi-2.2.1/public/include/client-glue/TXMPUtils.incl_cpp0000664000175000017500000003720111745673651020403 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // ================================================================================================ /// \file TXMPUtils.incl_cpp /// \brief The implementation of the TXMPUtils template class. #include "XMP.hpp" #include "client-glue/WXMP_Common.hpp" #include "client-glue/WXMPUtils.hpp" // ================================================================================================= // Implementation Guidelines // ========================= // // The implementations of the template functions are very stylized. ... // // ================================================================================================= XMP_MethodIntro(TXMPUtils,void):: SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen ) { tStringObj * clientStr = (tStringObj*) clientPtr; clientStr->assign ( valuePtr, valueLen ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ComposeArrayItemPath ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, tStringObj * fullPath ) { WrapCheckVoid ( zXMPUtils_ComposeArrayItemPath_1 ( schemaNS, arrayName, itemIndex, fullPath, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ComposeStructFieldPath ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, tStringObj * fullPath ) { WrapCheckVoid ( zXMPUtils_ComposeStructFieldPath_1 ( schemaNS, structName, fieldNS, fieldName, fullPath, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ComposeQualifierPath ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, tStringObj * fullPath ) { WrapCheckVoid ( zXMPUtils_ComposeQualifierPath_1 ( schemaNS, propName, qualNS, qualName, fullPath, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ComposeLangSelector ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr langName, tStringObj * fullPath ) { WrapCheckVoid ( zXMPUtils_ComposeLangSelector_1 ( schemaNS, arrayName, langName, fullPath, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ComposeLangSelector ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, const tStringObj & langName, tStringObj * fullPath ) { TXMPUtils::ComposeLangSelector ( schemaNS, arrayName, langName.c_str(), fullPath ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ComposeFieldSelector ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, tStringObj * fullPath ) { WrapCheckVoid ( zXMPUtils_ComposeFieldSelector_1 ( schemaNS, arrayName, fieldNS, fieldName, fieldValue, fullPath, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ComposeFieldSelector ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, const tStringObj & fieldValue, tStringObj * fullPath ) { TXMPUtils::ComposeFieldSelector ( schemaNS, arrayName, fieldNS, fieldName, fieldValue.c_str(), fullPath ); } // ------------------------------------------------------------------------------------------------- // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ConvertFromBool ( bool binValue, tStringObj * strValue ) { WrapCheckVoid ( zXMPUtils_ConvertFromBool_1 ( binValue, strValue, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ConvertFromInt ( long binValue, XMP_StringPtr format, tStringObj * strValue ) { WrapCheckVoid ( zXMPUtils_ConvertFromInt_1 ( binValue, format, strValue, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ConvertFromInt64 ( long long binValue, XMP_StringPtr format, tStringObj * strValue ) { WrapCheckVoid ( zXMPUtils_ConvertFromInt64_1 ( binValue, format, strValue, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ConvertFromFloat ( double binValue, XMP_StringPtr format, tStringObj * strValue ) { WrapCheckVoid ( zXMPUtils_ConvertFromFloat_1 ( binValue, format, strValue, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ConvertFromDate ( const XMP_DateTime & binValue, tStringObj * strValue ) { WrapCheckVoid ( zXMPUtils_ConvertFromDate_1 ( binValue, strValue, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,bool):: ConvertToBool ( XMP_StringPtr strValue ) { WrapCheckBool ( value, zXMPUtils_ConvertToBool_1 ( strValue ) ); return value; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,bool):: ConvertToBool ( const tStringObj & strValue ) { return TXMPUtils::ConvertToBool ( strValue.c_str() ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,long):: ConvertToInt ( XMP_StringPtr strValue ) { WrapCheckInt32 ( value, zXMPUtils_ConvertToInt_1 ( strValue ) ); return value; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,long):: ConvertToInt ( const tStringObj & strValue ) { return TXMPUtils::ConvertToInt ( strValue.c_str() ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,long long):: ConvertToInt64 ( XMP_StringPtr strValue ) { WrapCheckInt64 ( value, zXMPUtils_ConvertToInt64_1 ( strValue ) ); return value; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,long long):: ConvertToInt64 ( const tStringObj & strValue ) { return TXMPUtils::ConvertToInt64 ( strValue.c_str() ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,double):: ConvertToFloat ( XMP_StringPtr strValue ) { WrapCheckFloat ( value, zXMPUtils_ConvertToFloat_1 ( strValue ) ); return value; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,double):: ConvertToFloat ( const tStringObj & strValue ) { return TXMPUtils::ConvertToFloat ( strValue.c_str() ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ConvertToDate ( XMP_StringPtr strValue, XMP_DateTime * binValue ) { WrapCheckVoid ( zXMPUtils_ConvertToDate_1 ( strValue, binValue ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ConvertToDate ( const tStringObj & strValue, XMP_DateTime * binValue ) { TXMPUtils::ConvertToDate ( strValue.c_str(), binValue ); } // ------------------------------------------------------------------------------------------------- // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: CurrentDateTime ( XMP_DateTime * time ) { WrapCheckVoid ( zXMPUtils_CurrentDateTime_1 ( time ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: SetTimeZone ( XMP_DateTime * time ) { WrapCheckVoid ( zXMPUtils_SetTimeZone_1 ( time ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ConvertToUTCTime ( XMP_DateTime * time ) { WrapCheckVoid ( zXMPUtils_ConvertToUTCTime_1 ( time ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ConvertToLocalTime ( XMP_DateTime * time ) { WrapCheckVoid ( zXMPUtils_ConvertToLocalTime_1 ( time ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,int):: CompareDateTime ( const XMP_DateTime & left, const XMP_DateTime & right ) { WrapCheckInt32 ( result, zXMPUtils_CompareDateTime_1 ( left, right ) ); return result; } // ------------------------------------------------------------------------------------------------- // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: EncodeToBase64 ( XMP_StringPtr rawStr, XMP_StringLen rawLen, tStringObj * encodedStr ) { WrapCheckVoid ( zXMPUtils_EncodeToBase64_1 ( rawStr, rawLen, encodedStr, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: EncodeToBase64 ( const tStringObj & rawStr, tStringObj * encodedStr ) { TXMPUtils::EncodeToBase64 ( rawStr.c_str(), (XMP_StringLen)rawStr.size(), encodedStr ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: DecodeFromBase64 ( XMP_StringPtr encodedStr, XMP_StringLen encodedLen, tStringObj * rawStr ) { WrapCheckVoid ( zXMPUtils_DecodeFromBase64_1 ( encodedStr, encodedLen, rawStr, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: DecodeFromBase64 ( const tStringObj & encodedStr, tStringObj * rawStr ) { TXMPUtils::DecodeFromBase64 ( encodedStr.c_str(), (XMP_StringLen)encodedStr.size(), rawStr ); } // ------------------------------------------------------------------------------------------------- // ------------------------------------------------------------------------------------------------- // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: PackageForJPEG ( const TXMPMeta & xmpObj, tStringObj * standardXMP, tStringObj * extendedXMP, tStringObj * extendedDigest ) { WrapCheckVoid ( zXMPUtils_PackageForJPEG_1 ( xmpObj.GetInternalRef(), standardXMP, extendedXMP, extendedDigest, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: MergeFromJPEG ( TXMPMeta * fullXMP, const TXMPMeta & extendedXMP ) { WrapCheckVoid ( zXMPUtils_MergeFromJPEG_1 ( fullXMP->GetInternalRef(), extendedXMP.GetInternalRef() ) ); } // ------------------------------------------------------------------------------------------------- // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: CatenateArrayItems ( const TXMPMeta & xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr separator, XMP_StringPtr quotes, XMP_OptionBits options, tStringObj * catedStr ) { WrapCheckVoid ( zXMPUtils_CatenateArrayItems_1 ( xmpObj.GetInternalRef(), schemaNS, arrayName, separator, quotes, options, catedStr, SetClientString ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: SeparateArrayItems ( TXMPMeta * xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, XMP_StringPtr catedStr ) { if ( xmpObj == 0 ) throw XMP_Error ( kXMPErr_BadParam, "Null output SXMPMeta pointer" ); WrapCheckVoid ( zXMPUtils_SeparateArrayItems_1 ( xmpObj->GetInternalRef(), schemaNS, arrayName, options, catedStr ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: SeparateArrayItems ( TXMPMeta * xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, const tStringObj & catedStr ) { TXMPUtils::SeparateArrayItems ( xmpObj, schemaNS, arrayName, options, catedStr.c_str() ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: ApplyTemplate ( TXMPMeta * workingXMP, const TXMPMeta & templateXMP, XMP_OptionBits actions ) { if ( workingXMP == 0 ) throw XMP_Error ( kXMPErr_BadParam, "Null working SXMPMeta pointer" ); WrapCheckVoid ( zXMPUtils_ApplyTemplate_1 ( workingXMP->GetInternalRef(), templateXMP.GetInternalRef(), actions ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: RemoveProperties ( TXMPMeta * xmpObj, XMP_StringPtr schemaNS /* = 0 */, XMP_StringPtr propName /* = 0 */, XMP_OptionBits options /* = 0 */ ) { if ( xmpObj == 0 ) throw XMP_Error ( kXMPErr_BadParam, "Null output SXMPMeta pointer" ); WrapCheckVoid ( zXMPUtils_RemoveProperties_1 ( xmpObj->GetInternalRef(), schemaNS, propName, options ) ); } // ------------------------------------------------------------------------------------------------- // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPUtils,void):: DuplicateSubtree ( const TXMPMeta & source, TXMPMeta * dest, XMP_StringPtr sourceNS, XMP_StringPtr sourceRoot, XMP_StringPtr destNS /*= 0 */, XMP_StringPtr destRoot /* = 0 */, XMP_OptionBits options /* = 0 */ ) { if ( dest == 0 ) throw XMP_Error ( kXMPErr_BadParam, "Null output SXMPMeta pointer" ); WrapCheckVoid ( zXMPUtils_DuplicateSubtree_1 ( source.GetInternalRef(), dest->GetInternalRef(), sourceNS, sourceRoot, destNS, destRoot, options ) ); } // ================================================================================================= // ================================================================================================= exempi-2.2.1/public/include/client-glue/WXMPMeta.hpp0000664000175000017500000006220611745673651017177 00000000000000#if ! __WXMPMeta_hpp__ #define __WXMPMeta_hpp__ 1 // ================================================================================================= // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "client-glue/WXMP_Common.hpp" #if __cplusplus extern "C" { #endif #define zXMPMeta_GetVersionInfo_1(info) \ WXMPMeta_GetVersionInfo_1 ( info /* no wResult */ ) #define zXMPMeta_Initialize_1() \ WXMPMeta_Initialize_1 ( &wResult ) #define zXMPMeta_Terminate_1() \ WXMPMeta_Terminate_1 ( /* no wResult */ ) #define zXMPMeta_CTor_1() \ WXMPMeta_CTor_1 ( &wResult ) #define zXMPMeta_GetGlobalOptions_1() \ WXMPMeta_GetGlobalOptions_1 ( &wResult ) #define zXMPMeta_SetGlobalOptions_1(options) \ WXMPMeta_SetGlobalOptions_1 ( options, &wResult ) #define zXMPMeta_DumpNamespaces_1(outProc,refCon) \ WXMPMeta_DumpNamespaces_1 ( outProc, refCon, &wResult ) #define zXMPMeta_RegisterNamespace_1(namespaceURI,suggestedPrefix,actualPrefix,SetClientString) \ WXMPMeta_RegisterNamespace_1 ( namespaceURI, suggestedPrefix, actualPrefix, SetClientString, &wResult ) #define zXMPMeta_GetNamespacePrefix_1(namespaceURI,namespacePrefix,SetClientString) \ WXMPMeta_GetNamespacePrefix_1 ( namespaceURI, namespacePrefix, SetClientString, &wResult ) #define zXMPMeta_GetNamespaceURI_1(namespacePrefix,namespaceURI,SetClientString) \ WXMPMeta_GetNamespaceURI_1 ( namespacePrefix, namespaceURI, SetClientString, &wResult ) #define zXMPMeta_DeleteNamespace_1(namespaceURI) \ WXMPMeta_DeleteNamespace_1 ( namespaceURI, &wResult ) #define zXMPMeta_GetProperty_1(schemaNS,propName,propValue,options,SetClientString) \ WXMPMeta_GetProperty_1 ( this->xmpRef, schemaNS, propName, propValue, options, SetClientString, &wResult ) #define zXMPMeta_GetArrayItem_1(schemaNS,arrayName,itemIndex,itemValue,options,SetClientString) \ WXMPMeta_GetArrayItem_1 ( this->xmpRef, schemaNS, arrayName, itemIndex, itemValue, options, SetClientString, &wResult ) #define zXMPMeta_GetStructField_1(schemaNS,structName,fieldNS,fieldName,fieldValue,options,SetClientString) \ WXMPMeta_GetStructField_1 ( this->xmpRef, schemaNS, structName, fieldNS, fieldName, fieldValue, options, SetClientString, &wResult ) #define zXMPMeta_GetQualifier_1(schemaNS,propName,qualNS,qualName,qualValue,options,SetClientString) \ WXMPMeta_GetQualifier_1 ( this->xmpRef, schemaNS, propName, qualNS, qualName, qualValue, options, SetClientString, &wResult ) #define zXMPMeta_SetProperty_1(schemaNS,propName,propValue,options) \ WXMPMeta_SetProperty_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult ) #define zXMPMeta_SetArrayItem_1(schemaNS,arrayName,itemIndex,itemValue,options) \ WXMPMeta_SetArrayItem_1 ( this->xmpRef, schemaNS, arrayName, itemIndex, itemValue, options, &wResult ) #define zXMPMeta_AppendArrayItem_1(schemaNS,arrayName,arrayOptions,itemValue,options) \ WXMPMeta_AppendArrayItem_1 ( this->xmpRef, schemaNS, arrayName, arrayOptions, itemValue, options, &wResult ) #define zXMPMeta_SetStructField_1(schemaNS,structName,fieldNS,fieldName,fieldValue,options) \ WXMPMeta_SetStructField_1 ( this->xmpRef, schemaNS, structName, fieldNS, fieldName, fieldValue, options, &wResult ) #define zXMPMeta_SetQualifier_1(schemaNS,propName,qualNS,qualName,qualValue,options) \ WXMPMeta_SetQualifier_1 ( this->xmpRef, schemaNS, propName, qualNS, qualName, qualValue, options, &wResult ) #define zXMPMeta_DeleteProperty_1(schemaNS,propName) \ WXMPMeta_DeleteProperty_1 ( this->xmpRef, schemaNS, propName, &wResult ) #define zXMPMeta_DeleteArrayItem_1(schemaNS,arrayName,itemIndex) \ WXMPMeta_DeleteArrayItem_1 ( this->xmpRef, schemaNS, arrayName, itemIndex, &wResult ) #define zXMPMeta_DeleteStructField_1(schemaNS,structName,fieldNS,fieldName) \ WXMPMeta_DeleteStructField_1 ( this->xmpRef, schemaNS, structName, fieldNS, fieldName, &wResult ) #define zXMPMeta_DeleteQualifier_1(schemaNS,propName,qualNS,qualName) \ WXMPMeta_DeleteQualifier_1 ( this->xmpRef, schemaNS, propName, qualNS, qualName, &wResult ) #define zXMPMeta_DoesPropertyExist_1(schemaNS,propName) \ WXMPMeta_DoesPropertyExist_1 ( this->xmpRef, schemaNS, propName, &wResult ) #define zXMPMeta_DoesArrayItemExist_1(schemaNS,arrayName,itemIndex) \ WXMPMeta_DoesArrayItemExist_1 ( this->xmpRef, schemaNS, arrayName, itemIndex, &wResult ) #define zXMPMeta_DoesStructFieldExist_1(schemaNS,structName,fieldNS,fieldName) \ WXMPMeta_DoesStructFieldExist_1 ( this->xmpRef, schemaNS, structName, fieldNS, fieldName, &wResult ) #define zXMPMeta_DoesQualifierExist_1(schemaNS,propName,qualNS,qualName) \ WXMPMeta_DoesQualifierExist_1 ( this->xmpRef, schemaNS, propName, qualNS, qualName, &wResult ) #define zXMPMeta_GetLocalizedText_1(schemaNS,altTextName,genericLang,specificLang,clientLang,clientValue,options,SetClientString) \ WXMPMeta_GetLocalizedText_1 ( this->xmpRef, schemaNS, altTextName, genericLang, specificLang, clientLang, clientValue, options, SetClientString, &wResult ) #define zXMPMeta_SetLocalizedText_1(schemaNS,altTextName,genericLang,specificLang,itemValue,options) \ WXMPMeta_SetLocalizedText_1 ( this->xmpRef, schemaNS, altTextName, genericLang, specificLang, itemValue, options, &wResult ) #define zXMPMeta_DeleteLocalizedText_1(schemaNS,altTextName,genericLang,specificLang) \ WXMPMeta_DeleteLocalizedText_1 ( this->xmpRef, schemaNS, altTextName, genericLang, specificLang, &wResult ) #define zXMPMeta_GetProperty_Bool_1(schemaNS,propName,propValue,options) \ WXMPMeta_GetProperty_Bool_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult ) #define zXMPMeta_GetProperty_Int_1(schemaNS,propName,propValue,options) \ WXMPMeta_GetProperty_Int_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult ) #define zXMPMeta_GetProperty_Int64_1(schemaNS,propName,propValue,options) \ WXMPMeta_GetProperty_Int64_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult ) #define zXMPMeta_GetProperty_Float_1(schemaNS,propName,propValue,options) \ WXMPMeta_GetProperty_Float_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult ) #define zXMPMeta_GetProperty_Date_1(schemaNS,propName,propValue,options) \ WXMPMeta_GetProperty_Date_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult ) #define zXMPMeta_SetProperty_Bool_1(schemaNS,propName,propValue,options) \ WXMPMeta_SetProperty_Bool_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult ) #define zXMPMeta_SetProperty_Int_1(schemaNS,propName,propValue,options) \ WXMPMeta_SetProperty_Int_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult ) #define zXMPMeta_SetProperty_Int64_1(schemaNS,propName,propValue,options) \ WXMPMeta_SetProperty_Int64_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult ) #define zXMPMeta_SetProperty_Float_1(schemaNS,propName,propValue,options) \ WXMPMeta_SetProperty_Float_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult ) #define zXMPMeta_SetProperty_Date_1(schemaNS,propName,propValue,options) \ WXMPMeta_SetProperty_Date_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult ) #define zXMPMeta_GetObjectName_1(objName,SetClientString) \ WXMPMeta_GetObjectName_1 ( this->xmpRef, objName, SetClientString, &wResult ) #define zXMPMeta_SetObjectName_1(name) \ WXMPMeta_SetObjectName_1 ( this->xmpRef, name, &wResult ) #define zXMPMeta_GetObjectOptions_1() \ WXMPMeta_GetObjectOptions_1 ( this->xmpRef, &wResult ) #define zXMPMeta_SetObjectOptions_1(options) \ WXMPMeta_SetObjectOptions_1 ( this->xmpRef, options, &wResult ) #define zXMPMeta_Sort_1() \ WXMPMeta_Sort_1 ( this->xmpRef, &wResult ) #define zXMPMeta_Erase_1() \ WXMPMeta_Erase_1 ( this->xmpRef, &wResult ) #define zXMPMeta_Clone_1(options) \ WXMPMeta_Clone_1 ( this->xmpRef, options, &wResult ) #define zXMPMeta_CountArrayItems_1(schemaNS,arrayName) \ WXMPMeta_CountArrayItems_1 ( this->xmpRef, schemaNS, arrayName, &wResult ) #define zXMPMeta_DumpObject_1(outProc,refCon) \ WXMPMeta_DumpObject_1 ( this->xmpRef, outProc, refCon, &wResult ) #define zXMPMeta_ParseFromBuffer_1(buffer,bufferSize,options) \ WXMPMeta_ParseFromBuffer_1 ( this->xmpRef, buffer, bufferSize, options, &wResult ) #define zXMPMeta_SerializeToBuffer_1(pktString,options,padding,newline,indent,baseIndent,SetClientString) \ WXMPMeta_SerializeToBuffer_1 ( this->xmpRef, pktString, options, padding, newline, indent, baseIndent, SetClientString, &wResult ) // ================================================================================================= extern void WXMPMeta_GetVersionInfo_1 ( XMP_VersionInfo * info ); extern void WXMPMeta_Initialize_1 ( WXMP_Result * wResult ); extern void WXMPMeta_Terminate_1(); // ------------------------------------------------------------------------------------------------- extern void WXMPMeta_CTor_1 ( WXMP_Result * wResult ); extern void WXMPMeta_IncrementRefCount_1 ( XMPMetaRef xmpRef ); extern void WXMPMeta_DecrementRefCount_1 ( XMPMetaRef xmpRef ); // ------------------------------------------------------------------------------------------------- extern void WXMPMeta_GetGlobalOptions_1 ( WXMP_Result * wResult ); extern void WXMPMeta_SetGlobalOptions_1 ( XMP_OptionBits options, WXMP_Result * wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPMeta_DumpNamespaces_1 ( XMP_TextOutputProc outProc, void * refCon, WXMP_Result * wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPMeta_RegisterNamespace_1 ( XMP_StringPtr namespaceURI, XMP_StringPtr suggestedPrefix, void * actualPrefix, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPMeta_GetNamespacePrefix_1 ( XMP_StringPtr namespaceURI, void * namespacePrefix, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPMeta_GetNamespaceURI_1 ( XMP_StringPtr namespacePrefix, void * namespaceURI, SetClientStringProc SetClientString, WXMP_Result * wResult ); extern void WXMPMeta_DeleteNamespace_1 ( XMP_StringPtr namespaceURI, WXMP_Result * wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPMeta_GetProperty_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, void * propValue, XMP_OptionBits * options, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_GetArrayItem_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, void * itemValue, XMP_OptionBits * options, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_GetStructField_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, void * fieldValue, XMP_OptionBits * options, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_GetQualifier_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, void * qualValue, XMP_OptionBits * options, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ ; // ------------------------------------------------------------------------------------------------- extern void WXMPMeta_SetProperty_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr propValue, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPMeta_SetArrayItem_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, XMP_StringPtr itemValue, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPMeta_AppendArrayItem_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, XMP_StringPtr itemValue, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPMeta_SetStructField_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPMeta_SetQualifier_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, XMP_StringPtr qualValue, XMP_OptionBits options, WXMP_Result * wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPMeta_DeleteProperty_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, WXMP_Result * wResult ); extern void WXMPMeta_DeleteArrayItem_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, WXMP_Result * wResult ); extern void WXMPMeta_DeleteStructField_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, WXMP_Result * wResult ); extern void WXMPMeta_DeleteQualifier_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, WXMP_Result * wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPMeta_DoesPropertyExist_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_DoesArrayItemExist_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_DoesStructFieldExist_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_DoesQualifierExist_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, WXMP_Result * wResult ) /* const */ ; // ------------------------------------------------------------------------------------------------- extern void WXMPMeta_GetLocalizedText_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, void * clientLang, void * clientValue, XMP_OptionBits * options, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_SetLocalizedText_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, XMP_StringPtr itemValue, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPMeta_DeleteLocalizedText_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, WXMP_Result * wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPMeta_GetProperty_Bool_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Bool * propValue, XMP_OptionBits * options, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_GetProperty_Int_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int32 * propValue, XMP_OptionBits * options, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_GetProperty_Int64_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int64 * propValue, XMP_OptionBits * options, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_GetProperty_Float_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, double * propValue, XMP_OptionBits * options, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_GetProperty_Date_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_DateTime * propValue, XMP_OptionBits * options, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_SetProperty_Bool_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Bool propValue, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPMeta_SetProperty_Int_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int32 propValue, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPMeta_SetProperty_Int64_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int64 propValue, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPMeta_SetProperty_Float_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, double propValue, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPMeta_SetProperty_Date_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, const XMP_DateTime & propValue, XMP_OptionBits options, WXMP_Result * wResult ); // ------------------------------------------------------------------------------------------------- extern void WXMPMeta_GetObjectName_1 ( XMPMetaRef xmpRef, void * objName, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_SetObjectName_1 ( XMPMetaRef xmpRef, XMP_StringPtr name, WXMP_Result * wResult ); extern void WXMPMeta_GetObjectOptions_1 ( XMPMetaRef xmpRef, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_SetObjectOptions_1 ( XMPMetaRef xmpRef, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPMeta_Sort_1 ( XMPMetaRef xmpRef, WXMP_Result * wResult ); extern void WXMPMeta_Erase_1 ( XMPMetaRef xmpRef, WXMP_Result * wResult ); extern void WXMPMeta_Clone_1 ( XMPMetaRef xmpRef, XMP_OptionBits options, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_CountArrayItems_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, WXMP_Result * wResult ) /* const */ ; extern void WXMPMeta_DumpObject_1 ( XMPMetaRef xmpRef, XMP_TextOutputProc outProc, void * refCon, WXMP_Result * wResult ) /* const */ ; // ------------------------------------------------------------------------------------------------- extern void WXMPMeta_ParseFromBuffer_1 ( XMPMetaRef xmpRef, XMP_StringPtr buffer, XMP_StringLen bufferSize, XMP_OptionBits options, WXMP_Result * wResult ); extern void WXMPMeta_SerializeToBuffer_1 ( XMPMetaRef xmpRef, void * pktString, XMP_OptionBits options, XMP_StringLen padding, XMP_StringPtr newline, XMP_StringPtr indent, XMP_Index baseIndent, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ ; // ================================================================================================= #if __cplusplus } /* extern "C" */ #endif #endif // __WXMPMeta_hpp__ exempi-2.2.1/public/include/client-glue/Makefile.in0000664000175000017500000003603212150231001017071 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = public/include/client-glue DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_HEADERS = TXMPFiles.incl_cpp TXMPMeta.incl_cpp WXMP_Common.hpp \ WXMPIterator.hpp WXMPUtils.hpp\ TXMPIterator.incl_cpp TXMPUtils.incl_cpp WXMPFiles.hpp WXMPMeta.hpp all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign public/include/client-glue/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign public/include/client-glue/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool cscopelist ctags distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/public/include/client-glue/TXMPIterator.incl_cpp0000664000175000017500000002125111745673651021072 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // ================================================================================================ /// \file TXMPIterator.incl_cpp /// \brief The implementation of the TXMPIterator template class. #include "XMP.hpp" #include "client-glue/WXMP_Common.hpp" #include "client-glue/WXMPIterator.hpp" // ================================================================================================= // Implementation Guidelines // ========================= // // The implementations of the template functions are very stylized. The jobs done in this code are: // // 1. Set up the xmpIter template data member in the constructors. // 2. Call through to the appropriate WXMPIterator function. // 3. Copy returned strings and release the threading lock. // // The various kinds of functions follow similar patterns, first assuming no returned string: // // Constructors - Use an initializer for the xmpIter data member to call the WXMPIterator constructor. // Destructor - Let the WXMPIterator destructor be implicitly called for the xmpIter data member. // Static function - Simply call the corresponding WXMPIterator static function. // Non-static function - Simply call the corresponding WXMPIterator function using xmpIter. // // If a member function has returned strings the code looks roughly like this: // // <<>> // <<>> // if ( <<>> ) { // if ( outStr != 0 ) outStr->assign ( outPtr, outLen ); // <<>> // } // return result; // // The <<>> is the call to the wrapper, and <<>> is the check and throw // if the wrapper reports failure. The <<>> check is used to determine if the string // should actually be assigned. For example, GetProperty can't assign the value if the property // does not exist. There is no <<>> check if it isn't, well, appropriate. Outputs are // always passed as explicit pointers, and null can be passed if the string is not wanted. The // inner implementation holds the threading lock if an output string is returned, regardless of // whether the client wants it or not (which the implementation does not know). // // ================================================================================================= #ifndef XMP_TraceCTorDTor #define XMP_TraceCTorDTor 0 #endif #if XMP_TraceCTorDTor class XIPeek { // Hack to peek at the client ref count in the internal object. public: XIPeek(); virtual ~XIPeek(); XMP_Int32 clientRefs; }; #endif // ------------------------------------------------------------------------------------------------- #define PropIterCTor(xmpRef,schemaNS,propName,options) \ WrapCheckIterRef ( newRef, zXMPIterator_PropCTor_1 ( xmpRef, schemaNS, propName, options ) ); \ this->iterRef = newRef // ------------------------------------------------------------------------------------------------- #define TableIterCTor(schemaNS,propName,options) \ WrapCheckIterRef ( newRef, zXMPIterator_TableCTor_1 ( schemaNS, propName, options ) ); \ this->iterRef = newRef // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPIterator,void):: SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen ) { tStringObj * clientStr = (tStringObj*) clientPtr; clientStr->assign ( valuePtr, valueLen ); } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPIterator):: TXMPIterator ( const TXMPIterator & original ) : iterRef(original.iterRef) { WXMPIterator_IncrementRefCount_1 ( this->iterRef ); #if XMP_TraceCTorDTor XIPeek* xiPtr = (XIPeek*)this->iterRef; printf ( "Copy construct TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPIterator,void):: operator= ( const TXMPIterator & rhs ) { #if XMP_TraceCTorDTor XIPeek* xiLHS = (XIPeek*)this->iterRef; XIPeek* xiRHS = (XIPeek*)rhs.iterRef; printf ( "Assign TXMPIterator, lhs @ %.8X, rhs @ %.8X\n", this, &rhs ); printf ( " original lhs ref = %.8X, count = %d\n", xiLHS, xiLHS->clientRefs ); printf ( " original rhs ref = %.8X, count = %d\n", xiRHS, xiRHS->clientRefs ); #endif XMPIteratorRef oldRef = this->iterRef; // ! Decrement last so errors leave client object OK. this->iterRef = rhs.iterRef; WXMPIterator_IncrementRefCount_1 ( this->iterRef ); WXMPIterator_DecrementRefCount_1 ( oldRef ); #if XMP_TraceCTorDTor printf ( " result lhs ref = %.8X, count = %d\n", xiLHS, xiLHS->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPIterator):: TXMPIterator() : iterRef(0) { throw XMP_Error ( kXMPErr_Unavailable, "No default construction for XMP iterators" ); #if XMP_TraceCTorDTor XIPeek* xiPtr = (XIPeek*)this->iterRef; printf ( "Default construct TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPIterator):: TXMPIterator ( const TXMPMeta & xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options /* = 0 */ ) : iterRef(0) { PropIterCTor ( xmpObj.GetInternalRef(), schemaNS, propName, options ); #if XMP_TraceCTorDTor XIPeek* xiPtr = (XIPeek*)this->iterRef; printf ( "Construct property TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPIterator):: TXMPIterator ( const TXMPMeta & xmpObj, XMP_StringPtr schemaNS, XMP_OptionBits options /* = 0 */ ) : iterRef(0) { PropIterCTor ( xmpObj.GetInternalRef(), schemaNS, "", options ); #if XMP_TraceCTorDTor XIPeek* xiPtr = (XIPeek*)this->iterRef; printf ( "Construct schema TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPIterator):: TXMPIterator ( const TXMPMeta & xmpObj, XMP_OptionBits options /* = 0 */ ) : iterRef(0) { PropIterCTor ( xmpObj.GetInternalRef(), "", "", options ); #if XMP_TraceCTorDTor XIPeek* xiPtr = (XIPeek*)this->iterRef; printf ( "Construct tree TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPIterator):: TXMPIterator ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options ) : iterRef(0) { TableIterCTor ( schemaNS, propName, options ); #if XMP_TraceCTorDTor XIPeek* xiPtr = (XIPeek*)this->iterRef; printf ( "Construct table TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPIterator):: ~TXMPIterator () throw() { #if XMP_TraceCTorDTor XIPeek* xiPtr = (XIPeek*)this->iterRef; printf ( "Destruct TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs ); #endif WXMPIterator_DecrementRefCount_1 ( this->iterRef ); this->iterRef = 0; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPIterator,bool):: Next ( tStringObj * schemaNS /* = 0 */, tStringObj * propPath /* = 0 */, tStringObj * propValue /* = 0 */, XMP_OptionBits * options /* = 0 */ ) { WrapCheckBool ( found, zXMPIterator_Next_1 ( schemaNS, propPath, propValue, options, SetClientString ) ); return found; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPIterator,void):: Skip ( XMP_OptionBits options ) { WrapCheckVoid ( zXMPIterator_Skip_1 ( options ) ); } // ================================================================================================= exempi-2.2.1/public/include/client-glue/TXMPFiles.incl_cpp0000664000175000017500000002755412150230672020336 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // ================================================================================================ /// \file TXMPFiles.incl_cpp /// \brief The implementation of the TXMPFiles template class. #if XMP_WinBuild #pragma warning ( disable : 4003 ) // not enough actual parameters for macro #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #endif #include "client-glue/WXMP_Common.hpp" #include "client-glue/WXMPFiles.hpp" // ================================================================================================= // Implementation Guidelines // ========================= // // The implementations of the template functions are very stylized. The jobs done in this code are: // // 1. ... // // ================================================================================================= #ifndef XMPFiles_TraceCTorDTor #define XMPFiles_TraceCTorDTor 0 #endif #if XMPFiles_TraceCTorDTor class XFPeek { // Hack to peek at the client ref count in the internal object. public: XFPeek(); virtual ~XFPeek(); XMP_Int32 clientRefs; }; #endif // ================================================================================================= XMP_MethodIntro(TXMPFiles,void):: SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen ) { tStringObj * clientStr = (tStringObj*) clientPtr; clientStr->assign ( valuePtr, valueLen ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,void):: GetVersionInfo ( XMP_VersionInfo * versionInfo ) { WrapNoCheckVoid ( zXMPFiles_GetVersionInfo_1 ( versionInfo ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,bool):: Initialize() { WrapCheckBool ( ok, zXMPFiles_Initialize_1 ( 0 ) ); return ok; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,bool):: Initialize ( XMP_OptionBits options ) { WrapCheckBool ( ok, zXMPFiles_Initialize_1 ( options ) ); return ok; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,void):: Terminate() { WrapNoCheckVoid ( zXMPFiles_Terminate_1() ); } // ================================================================================================= static XMPFilesRef Default_CTor() { WrapCheckXMPFilesRef ( newRef, zXMPFiles_CTor_1() ); return newRef; } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPFiles):: TXMPFiles() : xmpFilesRef(Default_CTor()) { #if XMPFiles_TraceCTorDTor XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef; printf ( "Default construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPFiles):: TXMPFiles ( const TXMPFiles & original ) : xmpFilesRef(original.xmpFilesRef) { WXMPFiles_IncrementRefCount_1 ( this->xmpFilesRef ); #if XMPFiles_TraceCTorDTor XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef; printf ( "Copy construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,void):: operator= ( const TXMPFiles & rhs ) { #if XMPFiles_TraceCTorDTor XFPeek* xfLHS = (XFPeek*)this->xmpFilesRef; XFPeek* xfRHS = (XFPeek*)rhs.xmpFilesRef; printf ( "Assign TXMPFiles, lhs @ %.8X, rhs @ %.8X\n", this, &rhs ); printf ( " original lhs ref = %.8X, count = %d\n", xfLHS, xfLHS->clientRefs ); printf ( " original rhs ref = %.8X, count = %d\n", xfRHS, xfRHS->clientRefs ); #endif XMPFilesRef oldRef = this->xmpFilesRef; // ! Decrement last so errors leave client object OK. this->xmpFilesRef = rhs.xmpFilesRef; WXMPFiles_IncrementRefCount_1 ( this->xmpFilesRef ); // Increment the count on the new ref. WXMPFiles_DecrementRefCount_1 ( oldRef ); // Decrement the count on the old ref. #if XMPFiles_TraceCTorDTor printf ( " result lhs ref = %.8X, count = %d\n", xfLHS, xfLHS->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPFiles):: TXMPFiles ( XMPFilesRef _xmpFilesRef ) : xmpFilesRef(_xmpFilesRef) { WXMPFiles_IncrementRefCount_1 ( this->xmpFilesRef ); #if XMPFiles_TraceCTorDTor XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef; printf ( "Ref construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs ); #endif } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPFiles):: TXMPFiles ( XMP_StringPtr filePath, XMP_FileFormat format /* = kXMP_UnknownFile */, XMP_OptionBits openFlags /* = 0 */ ) : xmpFilesRef(Default_CTor()) { #if XMPFiles_TraceCTorDTor XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef; printf ( "File construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs ); #endif bool ok = this->OpenFile ( filePath, format, openFlags ); if ( ! ok ) throw XMP_Error ( kXMPErr_NoFileHandler, "OpenFile returned false" ); } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPFiles):: TXMPFiles ( const tStringObj & filePath, XMP_FileFormat format /* = kXMP_UnknownFile */, XMP_OptionBits openFlags /* = 0 */ ) : xmpFilesRef(Default_CTor()) { #if XMPFiles_TraceCTorDTor XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef; printf ( "File construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs ); #endif bool ok = this->OpenFile ( filePath.c_str(), format, openFlags ); if ( ! ok ) throw XMP_Error ( kXMPErr_NoFileHandler, "OpenFile returned false" ); } // ------------------------------------------------------------------------------------------------- XMP_CTorDTorIntro(TXMPFiles):: ~TXMPFiles () throw() { #if XMPFiles_TraceCTorDTor XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef; printf ( "Destruct TXMPFiles @ %.8X, ref= %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs ); #endif WXMPFiles_DecrementRefCount_1 ( this->xmpFilesRef ); this->xmpFilesRef = 0; } // ================================================================================================= XMP_MethodIntro(TXMPFiles,bool):: GetFormatInfo ( XMP_FileFormat format, XMP_OptionBits * flags ) { WrapCheckBool ( found, zXMPFiles_GetFormatInfo_1 ( format, flags ) ); return found; } // ================================================================================================= XMP_MethodIntro(TXMPFiles,XMPFilesRef):: GetInternalRef() { return this->xmpFilesRef; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,XMP_FileFormat):: CheckFileFormat ( XMP_StringPtr filePath ) { WrapCheckFormat ( format, zXMPFiles_CheckFileFormat_1 ( filePath ) ); return format; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,XMP_FileFormat):: CheckPackageFormat ( XMP_StringPtr folderPath ) { WrapCheckFormat ( format, zXMPFiles_CheckPackageFormat_1 ( folderPath ) ); return format; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,bool):: OpenFile ( XMP_StringPtr filePath, XMP_FileFormat format /* = kXMP_UnknownFile */, XMP_OptionBits openFlags /* =0 */ ) { WrapCheckBool ( ok, zXMPFiles_OpenFile_1 ( filePath, format, openFlags ) ); return ok; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,bool):: OpenFile ( const tStringObj & filePath, XMP_FileFormat format /* = kXMP_UnknownFile */, XMP_OptionBits openFlags /* =0 */ ) { return this->OpenFile ( filePath.c_str(), format, openFlags ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,void):: CloseFile ( XMP_OptionBits closeFlags /* =0 */ ) { WrapCheckVoid ( zXMPFiles_CloseFile_1 ( closeFlags ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,bool):: GetFileInfo ( tStringObj * filePath /* = 0 */, XMP_OptionBits * openFlags /* =0 */, XMP_FileFormat * format /* = 0 */, XMP_OptionBits * handlerFlags /* =0 */ ) { WrapCheckBool ( isOpen, zXMPFiles_GetFileInfo_1 ( filePath, openFlags, format, handlerFlags, SetClientString ) ); return isOpen; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,void):: SetAbortProc ( XMP_AbortProc abortProc, void * abortArg ) { WrapCheckVoid ( zXMPFiles_SetAbortProc_1 ( abortProc, abortArg ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,bool):: GetXMP ( SXMPMeta * xmpObj /* = 0 */, tStringObj * xmpPacket /* = 0 */, XMP_PacketInfo * packetInfo /* =0 */ ) { XMPMetaRef xmpRef = 0; if ( xmpObj != 0 ) { SXMPUtils::RemoveProperties ( xmpObj, 0, 0, kXMPUtil_DoAllProperties ); // *** Need an SXMPMeta::Clear method: xmpRef = xmpObj->GetInternalRef(); } WrapCheckBool ( hasXMP, zXMPFiles_GetXMP_1 ( xmpRef, xmpPacket, packetInfo, SetClientString ) ); return hasXMP; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,void):: PutXMP ( const SXMPMeta & xmpObj ) { WrapCheckVoid ( zXMPFiles_PutXMP_1 ( xmpObj.GetInternalRef(), 0, 0 ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,void):: PutXMP ( XMP_StringPtr xmpPacket, XMP_StringLen xmpLength /* = kXMP_UseNullTermination */ ) { WrapCheckVoid ( zXMPFiles_PutXMP_1 ( 0, xmpPacket, xmpLength ) ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,void):: PutXMP ( const tStringObj & xmpPacket ) { this->PutXMP ( xmpPacket.c_str(), (XMP_StringLen)xmpPacket.size() ); } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,bool):: CanPutXMP ( const SXMPMeta & xmpObj ) { WrapCheckBool ( canPut, zXMPFiles_CanPutXMP_1 ( xmpObj.GetInternalRef(), 0, 0 ) ); return canPut; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,bool):: CanPutXMP ( XMP_StringPtr xmpPacket, XMP_StringLen xmpLength /* = kXMP_UseNullTermination */ ) { WrapCheckBool ( canPut, zXMPFiles_CanPutXMP_1 ( 0, xmpPacket, xmpLength ) ); return canPut; } // ------------------------------------------------------------------------------------------------- XMP_MethodIntro(TXMPFiles,bool):: CanPutXMP ( const tStringObj & xmpPacket ) { return this->CanPutXMP ( xmpPacket.c_str(), (XMP_StringLen)xmpPacket.size() ); } // ================================================================================================= exempi-2.2.1/public/include/client-glue/WXMP_Common.hpp0000664000175000017500000001115111745673651017671 00000000000000#if ! __WXMP_Common_hpp__ #define __WXMP_Common_hpp__ 1 // ================================================================================================= // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #ifndef XMP_Inline #if TXMP_EXPAND_INLINE #define XMP_Inline inline #else #define XMP_Inline /* not inline */ #endif #endif #define XMP_CTorDTorIntro(Class) template XMP_Inline Class #define XMP_MethodIntro(Class,ResultType) template XMP_Inline ResultType Class typedef void (* SetClientStringProc) ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen ); struct WXMP_Result { XMP_StringPtr errMessage; void * ptrResult; double floatResult; XMP_Uns64 int64Result; XMP_Uns32 int32Result; WXMP_Result() : errMessage(0) {}; }; #if __cplusplus extern "C" { #endif #define PropagateException(res) \ if ( res.errMessage != 0 ) throw XMP_Error ( res.int32Result, res.errMessage ); #ifndef XMP_TraceClientCalls #define XMP_TraceClientCalls 0 #define XMP_TraceClientCallsToFile 0 #endif #if ! XMP_TraceClientCalls #define InvokeCheck(WCallProto) \ WXMP_Result wResult; \ WCallProto; \ PropagateException ( wResult ) #else extern FILE * xmpClientLog; #define InvokeCheck(WCallProto) \ WXMP_Result wResult; \ fprintf ( xmpClientLog, "WXMP calling: %s\n", #WCallProto ); fflush ( xmpClientLog ); \ WCallProto; \ if ( wResult.errMessage == 0 ) { \ fprintf ( xmpClientLog, "WXMP back, no error\n" ); fflush ( xmpClientLog ); \ } else { \ fprintf ( xmpClientLog, "WXMP back, error: %s\n", wResult.errMessage ); fflush ( xmpClientLog ); \ } \ PropagateException ( wResult ) #endif // ================================================================================================= #define WrapNoCheckVoid(WCallProto) \ WCallProto; #define WrapCheckVoid(WCallProto) \ InvokeCheck(WCallProto); #define WrapCheckMetaRef(result,WCallProto) \ InvokeCheck(WCallProto); \ XMPMetaRef result = XMPMetaRef(wResult.ptrResult) #define WrapCheckIterRef(result,WCallProto) \ InvokeCheck(WCallProto); \ XMPIteratorRef result = XMPIteratorRef(wResult.ptrResult) #define WrapCheckDocOpsRef(result,WCallProto) \ InvokeCheck(WCallProto); \ XMPDocOpsRef result = XMPDocOpsRef(wResult.ptrResult) #define WrapCheckBool(result,WCallProto) \ InvokeCheck(WCallProto); \ bool result = bool(wResult.int32Result) #define WrapCheckTriState(result,WCallProto) \ InvokeCheck(WCallProto); \ XMP_TriState result = XMP_TriState(wResult.int32Result) #define WrapCheckOptions(result,WCallProto) \ InvokeCheck(WCallProto); \ XMP_OptionBits result = XMP_OptionBits(wResult.int32Result) #define WrapCheckStatus(result,WCallProto) \ InvokeCheck(WCallProto); \ XMP_Status result = XMP_Status(wResult.int32Result) #define WrapCheckIndex(result,WCallProto) \ InvokeCheck(WCallProto); \ XMP_Index result = XMP_Index(wResult.int32Result) #define WrapCheckInt32(result,WCallProto) \ InvokeCheck(WCallProto); \ XMP_Int32 result = wResult.int32Result #define WrapCheckInt64(result,WCallProto) \ InvokeCheck(WCallProto); \ XMP_Int64 result = wResult.int64Result #define WrapCheckFloat(result,WCallProto) \ InvokeCheck(WCallProto); \ double result = wResult.floatResult #define WrapCheckFormat(result,WCallProto) \ InvokeCheck(WCallProto); \ XMP_FileFormat result = wResult.int32Result // ================================================================================================= #if __cplusplus } // extern "C" #endif #endif // __WXMP_Common_hpp__ exempi-2.2.1/public/include/client-glue/Makefile.am0000664000175000017500000000332312144603625017077 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # noinst_HEADERS=TXMPFiles.incl_cpp TXMPMeta.incl_cpp WXMP_Common.hpp \ WXMPIterator.hpp WXMPUtils.hpp\ TXMPIterator.incl_cpp TXMPUtils.incl_cpp WXMPFiles.hpp WXMPMeta.hppexempi-2.2.1/public/include/client-glue/WXMPFiles.hpp0000664000175000017500000001471412150230672017333 00000000000000#ifndef __WXMPFiles_hpp__ #define __WXMPFiles_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "client-glue/WXMP_Common.hpp" #if __cplusplus extern "C" { #endif // ================================================================================================= /// \file WXMPFiles.h /// \brief High level support to access metadata in files of interest to Adobe applications. /// /// This header ... /// // ================================================================================================= // ================================================================================================= #define WrapCheckXMPFilesRef(result,WCallProto) \ WXMP_Result wResult; \ WCallProto; \ PropagateException ( wResult ); \ XMPFilesRef result = XMPFilesRef(wResult.ptrResult) // ================================================================================================= #define zXMPFiles_GetVersionInfo_1(versionInfo) \ WXMPFiles_GetVersionInfo_1 ( versionInfo /* no wResult */ ) #define zXMPFiles_Initialize_1(options) \ WXMPFiles_Initialize_1 ( options, &wResult ) #define zXMPFiles_Terminate_1() \ WXMPFiles_Terminate_1 ( /* no wResult */ ) #define zXMPFiles_CTor_1() \ WXMPFiles_CTor_1 ( &wResult ) #define zXMPFiles_GetFormatInfo_1(format,flags) \ WXMPFiles_GetFormatInfo_1 ( format, flags, &wResult ) #define zXMPFiles_CheckFileFormat_1(filePath) \ WXMPFiles_CheckFileFormat_1 ( filePath, &wResult ) #define zXMPFiles_CheckPackageFormat_1(folderPath) \ WXMPFiles_CheckPackageFormat_1 ( folderPath, &wResult ) #define zXMPFiles_OpenFile_1(filePath,format,openFlags) \ WXMPFiles_OpenFile_1 ( this->xmpFilesRef, filePath, format, openFlags, &wResult ) #define zXMPFiles_CloseFile_1(closeFlags) \ WXMPFiles_CloseFile_1 ( this->xmpFilesRef, closeFlags, &wResult ) #define zXMPFiles_GetFileInfo_1(clientPath,openFlags,format,handlerFlags,SetClientString) \ WXMPFiles_GetFileInfo_1 ( this->xmpFilesRef, clientPath, openFlags, format, handlerFlags, SetClientString, &wResult ) #define zXMPFiles_SetAbortProc_1(abortProc,abortArg) \ WXMPFiles_SetAbortProc_1 ( this->xmpFilesRef, abortProc, abortArg, &wResult ) #define zXMPFiles_GetXMP_1(xmpRef,clientPacket,packetInfo,SetClientString) \ WXMPFiles_GetXMP_1 ( this->xmpFilesRef, xmpRef, clientPacket, packetInfo, SetClientString, &wResult ) #define zXMPFiles_PutXMP_1(xmpRef,xmpPacket,xmpPacketLen) \ WXMPFiles_PutXMP_1 ( this->xmpFilesRef, xmpRef, xmpPacket, xmpPacketLen, &wResult ) #define zXMPFiles_CanPutXMP_1(xmpRef,xmpPacket,xmpPacketLen) \ WXMPFiles_CanPutXMP_1 ( this->xmpFilesRef, xmpRef, xmpPacket, xmpPacketLen, &wResult ) // ================================================================================================= extern void WXMPFiles_GetVersionInfo_1 ( XMP_VersionInfo * versionInfo ); extern void WXMPFiles_Initialize_1 ( XMP_OptionBits options, WXMP_Result * result ); extern void WXMPFiles_Terminate_1(); extern void WXMPFiles_CTor_1 ( WXMP_Result * result ); extern void WXMPFiles_IncrementRefCount_1 ( XMPFilesRef xmpFilesRef ); extern void WXMPFiles_DecrementRefCount_1 ( XMPFilesRef xmpFilesRef ); extern void WXMPFiles_GetFormatInfo_1 ( XMP_FileFormat format, XMP_OptionBits * flags, // ! Can be null. WXMP_Result * result ); extern void WXMPFiles_CheckFileFormat_1 ( XMP_StringPtr filePath, WXMP_Result * result ); extern void WXMPFiles_CheckPackageFormat_1 ( XMP_StringPtr folderPath, WXMP_Result * result ); extern void WXMPFiles_OpenFile_1 ( XMPFilesRef xmpFilesRef, XMP_StringPtr filePath, XMP_FileFormat format, XMP_OptionBits openFlags, WXMP_Result * result ); extern void WXMPFiles_CloseFile_1 ( XMPFilesRef xmpFilesRef, XMP_OptionBits closeFlags, WXMP_Result * result ); extern void WXMPFiles_GetFileInfo_1 ( XMPFilesRef xmpFilesRef, void * clientPath, XMP_OptionBits * openFlags, // ! Can be null. XMP_FileFormat * format, // ! Can be null. XMP_OptionBits * handlerFlags, // ! Can be null. SetClientStringProc SetClientString, WXMP_Result * result ); extern void WXMPFiles_SetAbortProc_1 ( XMPFilesRef xmpFilesRef, XMP_AbortProc abortProc, void * abortArg, WXMP_Result * result ); extern void WXMPFiles_GetXMP_1 ( XMPFilesRef xmpFilesRef, XMPMetaRef xmpRef, // ! Can be null. void * clientPacket, XMP_PacketInfo * packetInfo, // ! Can be null. SetClientStringProc SetClientString, WXMP_Result * result ); extern void WXMPFiles_PutXMP_1 ( XMPFilesRef xmpFilesRef, XMPMetaRef xmpRef, // ! Only one of the XMP object or packet are passed. XMP_StringPtr xmpPacket, XMP_StringLen xmpPacketLen, WXMP_Result * result ); extern void WXMPFiles_CanPutXMP_1 ( XMPFilesRef xmpFilesRef, XMPMetaRef xmpRef, // ! Only one of the XMP object or packet are passed. XMP_StringPtr xmpPacket, XMP_StringLen xmpPacketLen, WXMP_Result * result ); // ================================================================================================= #if __cplusplus } #endif #endif // __WXMPFiles_hpp__ exempi-2.2.1/public/include/Makefile.am0000664000175000017500000000345412150230672014667 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # DIST_SUBDIRS = client-glue xmpdir = $(includedir)/@EXEMPI_INCLUDE_BASE@ xmp_HEADERS = noinst_HEADERS = TXMPFiles.hpp TXMPIterator.hpp \ TXMPMeta.hpp TXMPUtils.hpp \ XMP.hpp XMP_Version.h\ XMP.incl_cpp\ XMP_Const.h XMP_Environment.h \ XMP_UnixEndian.h \ $(NULL) exempi-2.2.1/public/include/XMP_Const.h0000664000175000017500000013714712150230672014625 00000000000000#ifndef __XMP_Const_h__ #define __XMP_Const_h__ 1 // ================================================================================================= // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" #include #if XMP_MacBuild // ! No stdint.h on Windows and some UNIXes. #include #endif #if XMP_UNIXBuild // hopefully an inttypes.h on all UNIXes... #include #endif #if __cplusplus extern "C" { #endif // ================================================================================================= /// \file XMP_Const.h /// \brief Common C/C++ types and constants for the XMP toolkit. // ================================================================================================= // ================================================================================================= // Basic types and constants // ========================= // The XMP_... types are used on the off chance that the ..._t types present a problem. In that // case only the declarations of the XMP_... types needs to change, not all of the uses. These // types are used where fixed sizes are required in order to have a known ABI for a DLL build. #if XMP_MacBuild || defined(HAVE_STDINT_H) typedef int8_t XMP_Int8; typedef int16_t XMP_Int16; typedef int32_t XMP_Int32; typedef int64_t XMP_Int64; typedef uint8_t XMP_Uns8; typedef uint16_t XMP_Uns16; typedef uint32_t XMP_Uns32; typedef uint64_t XMP_Uns64; #elif XMP_WinBuild typedef signed char XMP_Int8; typedef signed short XMP_Int16; typedef signed long XMP_Int32; typedef signed long long XMP_Int64; typedef unsigned char XMP_Uns8; typedef unsigned short XMP_Uns16; typedef unsigned long XMP_Uns32; typedef unsigned long long XMP_Uns64; #elif XMP_UNIXBuild #if ! XMP_64 typedef signed char XMP_Int8; typedef signed short XMP_Int16; typedef signed long XMP_Int32; typedef signed long long XMP_Int64; typedef unsigned char XMP_Uns8; typedef unsigned short XMP_Uns16; typedef unsigned long XMP_Uns32; typedef unsigned long long XMP_Uns64; #else typedef signed char XMP_Int8; typedef signed short XMP_Int16; typedef signed int XMP_Int32; typedef signed long long XMP_Int64; typedef unsigned char XMP_Uns8; typedef unsigned short XMP_Uns16; typedef unsigned int XMP_Uns32; typedef unsigned long long XMP_Uns64; #endif #else #error "XMP environment error - must define one of XMP_MacBuild, XMP_WinBuild, or XMP_UNIXBuild" #endif typedef XMP_Uns8 XMP_Bool; /// An "ABI safe" pointer to the internal part of an XMP object. Use to pass an XMP object across /// client DLL boundaries. See \c TXMPMeta::GetInternalRef(). typedef struct __XMPMeta__ * XMPMetaRef; /// An "ABI safe" pointer to the internal part of an XMP iteration object. Use to pass an XMP /// iteration object across client DLL boundaries. See \c TXMPIterator. typedef struct __XMPIterator__ * XMPIteratorRef; /// An "ABI safe" pointer to the internal part of an XMP document operations object. Use to pass an /// XMP document operations object across client DLL boundaries. See \c TXMPDocOps. typedef struct __XMPDocOps__ * XMPDocOpsRef; /// An "ABI safe" pointer to the internal part of an XMP file-handling object. Use to pass an XMP /// file-handling object across client DLL boundaries. See \c TXMPFiles. typedef struct __XMPFiles__ * XMPFilesRef; // ================================================================================================= /// \name General scalar types and constants /// @{ /// \typedef XMP_StringPtr /// \brief The type for input string parameters. A const char *, a null-terminated UTF-8 /// string. /// \typedef XMP_StringLen /// \brief The type for string length parameters. A 32-bit unsigned integer, as big as will be /// practically needed. /// \typedef XMP_Index /// \brief The type for offsets and indices. A 32-bit signed integer. It is signed to allow -1 for /// loop termination. /// \typedef XMP_OptionBits /// \brief The type for a collection of 32 flag bits. Individual flags are defined as enum value bit /// masks; see \c #kXMP_PropValueIsURI and following. A number of macros provide common set or set /// operations, such as \c XMP_PropIsSimple. For other tests use an expression like options & /// kXMP_. When passing multiple option flags use the bitwise-OR operator. '|', /// not the arithmatic plus, '+'. typedef const char * XMP_StringPtr; // Points to a null terminated UTF-8 string. typedef XMP_Uns32 XMP_StringLen; typedef XMP_Int32 XMP_Index; // Signed, sometimes -1 is handy. typedef XMP_Uns32 XMP_OptionBits; // Used as 32 individual bits. /// \def kXMP_TrueStr /// \brief The canonical true string value for Booleans in serialized XMP. /// /// Code that converts from string to bool should be case insensitive, and also allow "1". /// \def kXMP_FalseStr /// \brief The canonical false string value for Booleans in serialized XMP. /// /// Code that converts from string to bool should be case insensitive, and also allow "0". #define kXMP_TrueStr "True" // Serialized XMP spellings, not for the type bool. #define kXMP_FalseStr "False" /// Type for yes/no/maybe answers. The values are picked to allow Boolean-like usage. The yes and /// values are true (non-zero), the no value is false (zero). enum { /// The part or parts have definitely changed. kXMPTS_Yes = 1, /// The part or parts have definitely not changed. kXMPTS_No = 0, /// The part or parts might, or might not, have changed. kXMPTS_Maybe = -1 }; typedef XMP_Int8 XMP_TriState; /// @} // ================================================================================================= /// \struct XMP_DateTime /// \brief The expanded type for a date and time. /// /// Dates and time in the serialized XMP are ISO 8601 strings. The \c XMP_DateTime struct allows /// easy conversion with other formats. /// /// All of the fields are 32 bit, even though most could be 8 bit. This avoids overflow when doing /// carries for arithmetic or normalization. All fields have signed values for the same reasons. /// /// Date-time values are occasionally used with only a date or only a time component. A date without /// a time has zeros in the \c XMP_DateTime struct for all time fields. A time without a date has /// zeros for all date fields (year, month, and day). /// /// \c TXMPUtils provides utility functions for manipulating date-time values. /// /// @see \c TXMPUtils::ConvertToDate(), \c TXMPUtils::ConvertFromDate(), /// \c TXMPUtils::CompareDateTime(), \c TXMPUtils::ConvertToLocalTime(), /// \c TXMPUtils::ConvertToUTCTime(), \c TXMPUtils::CurrentDateTime(), /// \c TXMPUtils::SetTimeZone() struct XMP_DateTime { /// The year, can be negative. XMP_Int32 year; /// The month in the range 1..12. XMP_Int32 month; /// The day of the month in the range 1..31. XMP_Int32 day; /// The hour in the range 0..23. XMP_Int32 hour; /// The minute in the range 0..59. XMP_Int32 minute; /// The second in the range 0..59. XMP_Int32 second; /// Is the date portion meaningful? XMP_Bool hasDate; /// Is the time portion meaningful? XMP_Bool hasTime; /// Is the time zone meaningful? XMP_Bool hasTimeZone; /// The "sign" of the time zone, \c #kXMP_TimeIsUTC (0) means UTC, \c #kXMP_TimeWestOfUTC (-1) /// is west, \c #kXMP_TimeEastOfUTC (+1) is east. XMP_Int8 tzSign; /// The time zone hour in the range 0..23. XMP_Int32 tzHour; /// The time zone minute in the range 0..59. XMP_Int32 tzMinute; /// Nanoseconds within a second, often left as zero. XMP_Int32 nanoSecond; #if __cplusplus XMP_DateTime() : year(0), month(0), day(0), hour(0), minute(0), second(0), hasDate(false), hasTime(false), hasTimeZone(false), tzSign(0), tzHour(0), tzMinute(0), nanoSecond(0) {}; #endif }; /// Constant values for \c XMP_DateTime::tzSign field. enum { /// Time zone is west of UTC. kXMP_TimeWestOfUTC = -1, /// UTC time. kXMP_TimeIsUTC = 0, /// Time zone is east of UTC. kXMP_TimeEastOfUTC = +1 }; #define XMPDateTime_IsDateOnly(dt) ((dt).hasDate & (! (dt).hasTime)) #define XMPDateTime_IsTimeOnly(dt) ((dt).hasTime & (! (dt).hasDate)) #define XMPDateTime_ClearTimeZone(dt) { (dt).hasTimeZone = (dt).tzSign = (dt).tzHour = (dt).tzMinute = 0; } // ================================================================================================= // Standard namespace URI constants // ================================ /// \name XML namespace constants for standard XMP schema. /// @{ /// /// \def kXMP_NS_XMP /// \brief The XML namespace for the XMP "basic" schema. /// /// \def kXMP_NS_XMP_Rights /// \brief The XML namespace for the XMP copyright schema. /// /// \def kXMP_NS_XMP_MM /// \brief The XML namespace for the XMP digital asset management schema. /// /// \def kXMP_NS_XMP_BJ /// \brief The XML namespace for the job management schema. /// /// \def kXMP_NS_XMP_T /// \brief The XML namespace for the XMP text document schema. /// /// \def kXMP_NS_XMP_T_PG /// \brief The XML namespace for the XMP paged document schema. /// /// \def kXMP_NS_PDF /// \brief The XML namespace for the PDF schema. /// /// \def kXMP_NS_Photoshop /// \brief The XML namespace for the Photoshop custom schema. /// /// \def kXMP_NS_EXIF /// \brief The XML namespace for Adobe's EXIF schema. /// /// \def kXMP_NS_TIFF /// \brief The XML namespace for Adobe's TIFF schema. /// /// @} #define kXMP_NS_XMP "http://ns.adobe.com/xap/1.0/" #define kXMP_NS_XMP_Rights "http://ns.adobe.com/xap/1.0/rights/" #define kXMP_NS_XMP_MM "http://ns.adobe.com/xap/1.0/mm/" #define kXMP_NS_XMP_BJ "http://ns.adobe.com/xap/1.0/bj/" #define kXMP_NS_PDF "http://ns.adobe.com/pdf/1.3/" #define kXMP_NS_Photoshop "http://ns.adobe.com/photoshop/1.0/" #define kXMP_NS_PSAlbum "http://ns.adobe.com/album/1.0/" #define kXMP_NS_EXIF "http://ns.adobe.com/exif/1.0/" #define kXMP_NS_EXIF_Aux "http://ns.adobe.com/exif/1.0/aux/" #define kXMP_NS_TIFF "http://ns.adobe.com/tiff/1.0/" #define kXMP_NS_PNG "http://ns.adobe.com/png/1.0/" #define kXMP_NS_SWF "http://ns.adobe.com/swf/1.0/" #define kXMP_NS_JPEG "http://ns.adobe.com/jpeg/1.0/" #define kXMP_NS_JP2K "http://ns.adobe.com/jp2k/1.0/" #define kXMP_NS_CameraRaw "http://ns.adobe.com/camera-raw-settings/1.0/" #define kXMP_NS_DM "http://ns.adobe.com/xmp/1.0/DynamicMedia/" #define kXMP_NS_Script "http://ns.adobe.com/xmp/1.0/Script/" #define kXMP_NS_ASF "http://ns.adobe.com/asf/1.0/" #define kXMP_NS_WAV "http://ns.adobe.com/xmp/wav/1.0/" #define kXMP_NS_BWF "http://ns.adobe.com/bwf/bext/1.0/" #define kXMP_NS_XMP_Note "http://ns.adobe.com/xmp/note/" #define kXMP_NS_AdobeStockPhoto "http://ns.adobe.com/StockPhoto/1.0/" #define kXMP_NS_CreatorAtom "http://ns.adobe.com/creatorAtom/1.0/" /// \name XML namespace constants for qualifiers and structured property fields. /// @{ /// /// \def kXMP_NS_XMP_IdentifierQual /// \brief The XML namespace for qualifiers of the xmp:Identifier property. /// /// \def kXMP_NS_XMP_Dimensions /// \brief The XML namespace for fields of the Dimensions type. /// /// \def kXMP_NS_XMP_Image /// \brief The XML namespace for fields of a graphical image. Used for the Thumbnail type. /// /// \def kXMP_NS_XMP_ResourceEvent /// \brief The XML namespace for fields of the ResourceEvent type. /// /// \def kXMP_NS_XMP_ResourceRef /// \brief The XML namespace for fields of the ResourceRef type. /// /// \def kXMP_NS_XMP_ST_Version /// \brief The XML namespace for fields of the Version type. /// /// \def kXMP_NS_XMP_ST_Job /// \brief The XML namespace for fields of the JobRef type. /// /// @} #define kXMP_NS_XMP_IdentifierQual "http://ns.adobe.com/xmp/Identifier/qual/1.0/" #define kXMP_NS_XMP_Dimensions "http://ns.adobe.com/xap/1.0/sType/Dimensions#" #define kXMP_NS_XMP_Text "http://ns.adobe.com/xap/1.0/t/" #define kXMP_NS_XMP_PagedFile "http://ns.adobe.com/xap/1.0/t/pg/" #define kXMP_NS_XMP_Graphics "http://ns.adobe.com/xap/1.0/g/" #define kXMP_NS_XMP_Image "http://ns.adobe.com/xap/1.0/g/img/" #define kXMP_NS_XMP_Font "http://ns.adobe.com/xap/1.0/sType/Font#" #define kXMP_NS_XMP_ResourceEvent "http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" #define kXMP_NS_XMP_ResourceRef "http://ns.adobe.com/xap/1.0/sType/ResourceRef#" #define kXMP_NS_XMP_ST_Version "http://ns.adobe.com/xap/1.0/sType/Version#" #define kXMP_NS_XMP_ST_Job "http://ns.adobe.com/xap/1.0/sType/Job#" #define kXMP_NS_XMP_ManifestItem "http://ns.adobe.com/xap/1.0/sType/ManifestItem#" // Deprecated XML namespace constants #define kXMP_NS_XMP_T "http://ns.adobe.com/xap/1.0/t/" #define kXMP_NS_XMP_T_PG "http://ns.adobe.com/xap/1.0/t/pg/" #define kXMP_NS_XMP_G_IMG "http://ns.adobe.com/xap/1.0/g/img/" /// \name XML namespace constants from outside Adobe. /// @{ /// /// \def kXMP_NS_DC /// \brief The XML namespace for the Dublin Core schema. /// /// \def kXMP_NS_IPTCCore /// \brief The XML namespace for the IPTC Core schema. /// /// \def kXMP_NS_RDF /// \brief The XML namespace for RDF. /// /// \def kXMP_NS_XML /// \brief The XML namespace for XML. /// /// @} #define kXMP_NS_DC "http://purl.org/dc/elements/1.1/" #define kXMP_NS_IPTCCore "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/" #define kXMP_NS_DICOM "http://ns.adobe.com/DICOM/" #define kXMP_NS_PDFA_Schema "http://www.aiim.org/pdfa/ns/schema#" #define kXMP_NS_PDFA_Property "http://www.aiim.org/pdfa/ns/property#" #define kXMP_NS_PDFA_Type "http://www.aiim.org/pdfa/ns/type#" #define kXMP_NS_PDFA_Field "http://www.aiim.org/pdfa/ns/field#" #define kXMP_NS_PDFA_ID "http://www.aiim.org/pdfa/ns/id/" #define kXMP_NS_PDFA_Extension "http://www.aiim.org/pdfa/ns/extension/" #define kXMP_NS_PDFX "http://ns.adobe.com/pdfx/1.3/" #define kXMP_NS_PDFX_ID "http://www.npes.org/pdfx/ns/id/" #define kXMP_NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#" #define kXMP_NS_XML "http://www.w3.org/XML/1998/namespace" // ================================================================================================= // Enums and macros used for option bits // ===================================== /// \name Macros for standard option selections. /// @{ /// /// \def kXMP_ArrayLastItem /// \brief Options macro accesses last array item. /// /// \def kXMP_UseNullTermination /// \brief Options macro sets string style. /// /// \def kXMP_NoOptions /// \brief Options macro clears all property-type bits. /// /// @} #define kXMP_ArrayLastItem ((XMP_Index)(-1L)) #define kXMP_UseNullTermination ((XMP_StringLen)(~0UL)) #define kXMP_NoOptions ((XMP_OptionBits)0UL) /// \name Macros for setting and testing general option bits. /// @{ /// /// \def XMP_SetOption /// \brief Macro sets an option flag bit. /// \param var A variable storing an options flag. /// \param opt The bit-flag constant to set. /// /// \def XMP_ClearOption /// \brief Macro clears an option flag bit. /// \param var A variable storing an options flag. /// \param opt The bit-flag constant to clear. /// /// \def XMP_TestOption /// \brief Macro reports whether an option flag bit is set. /// \param var A variable storing an options flag. /// \param opt The bit-flag constant to test. /// \return True if the bit is set. /// /// \def XMP_OptionIsSet /// \brief Macro reports whether an option flag bit is set. /// \param var A variable storing an options flag. /// \param opt The bit-flag constant to test. /// \return True if the bit is set. /// /// \def XMP_OptionIsClear /// \brief Macro reports whether an option flag bit is clear. /// \param var A variable storing an options flag. /// \param opt The bit-flag constant to test. /// \return True if the bit is clear. /// /// @} #define XMP_SetOption(var,opt) var |= (opt) #define XMP_ClearOption(var,opt) var &= ~(opt) #define XMP_TestOption(var,opt) (((var) & (opt)) != 0) #define XMP_OptionIsSet(var,opt) (((var) & (opt)) != 0) #define XMP_OptionIsClear(var,opt) (((var) & (opt)) == 0) /// \name Macros for setting and testing specific option bits. /// @{ /// /// \def XMP_PropIsSimple /// \brief Macro reports the property type specified by an options flag. /// \param opt The options flag to check. /// /// \def XMP_PropIsStruct /// \brief Macro reports the property type specified by an options flag. /// \param opt The options flag to check. /// /// \def XMP_PropIsArray /// \brief Macro reports the property type specified by an options flag. /// \param opt The options flag to check. /// /// \def XMP_ArrayIsUnordered /// \brief Macro reports the property type specified by an options flag. /// \param opt The options flag to check. /// /// \def XMP_ArrayIsOrdered /// \brief Macro reports the property type specified by an options flag. /// \param opt The options flag to check. /// /// \def XMP_ArrayIsAlternate /// \brief Macro reports the property type specified by an options flag. /// \param opt The options flag to check. /// /// \def XMP_ArrayIsAltText /// \brief Macro reports the property type specified by an options flag. /// \param opt The options flag to check. /// /// \def XMP_PropHasQualifiers /// \brief Macro reports the property type specified by an options flag. /// \param opt The options flag to check. /// /// \def XMP_PropIsQualifier /// \brief Macro reports the property type specified by an options flag. /// \param opt The options flag to check. /// /// \def XMP_PropHasLang /// \brief Macro reports the property type specified by an options flag. /// \param opt The options flag to check. /// /// \def XMP_NodeIsSchema /// \brief Macro reports the property type specified by an options flag. /// \param opt The options flag to check. /// /// \def XMP_PropIsAlias /// \brief Macro reports the property type specified by an options flag. /// \param opt The options flag to check. /// /// @} #define XMP_PropIsSimple(opt) (((opt) & kXMP_PropCompositeMask) == 0) #define XMP_PropIsStruct(opt) (((opt) & kXMP_PropValueIsStruct) != 0) #define XMP_PropIsArray(opt) (((opt) & kXMP_PropValueIsArray) != 0) #define XMP_ArrayIsUnordered(opt) (((opt) & kXMP_PropArrayIsOrdered) == 0) #define XMP_ArrayIsOrdered(opt) (((opt) & kXMP_PropArrayIsOrdered) != 0) #define XMP_ArrayIsAlternate(opt) (((opt) & kXMP_PropArrayIsAlternate) != 0) #define XMP_ArrayIsAltText(opt) (((opt) & kXMP_PropArrayIsAltText) != 0) #define XMP_PropHasQualifiers(opt) (((opt) & kXMP_PropHasQualifiers) != 0) #define XMP_PropIsQualifier(opt) (((opt) & kXMP_PropIsQualifier) != 0) #define XMP_PropHasLang(opt) (((opt) & kXMP_PropHasLang) != 0) #define XMP_NodeIsSchema(opt) (((opt) & kXMP_SchemaNode) != 0) #define XMP_PropIsAlias(opt) (((opt) & kXMP_PropIsAlias) != 0) // ------------------------------------------------------------------------------------------------- /// Option bit flags for the \c TXMPMeta property accessor functions. enum { /// The XML string form of the property value is a URI, use rdf:resource attribute. DISCOURAGED kXMP_PropValueIsURI = 0x00000002UL, // ------------------------------------------------------ // Options relating to qualifiers attached to a property. /// The property has qualifiers, includes \c rdf:type and \c xml:lang. kXMP_PropHasQualifiers = 0x00000010UL, /// This is a qualifier for some other property, includes \c rdf:type and \c xml:lang. /// Qualifiers can have arbitrary structure, and can themselves have qualifiers. If the /// qualifier itself has a structured value, this flag is only set for the top node of the /// qualifier's subtree. kXMP_PropIsQualifier = 0x00000020UL, /// Implies \c #kXMP_PropHasQualifiers, property has \c xml:lang. kXMP_PropHasLang = 0x00000040UL, /// Implies \c #kXMP_PropHasQualifiers, property has \c rdf:type. kXMP_PropHasType = 0x00000080UL, // -------------------------------------------- // Options relating to the data structure form. /// The value is a structure with nested fields. kXMP_PropValueIsStruct = 0x00000100UL, /// The value is an array (RDF alt/bag/seq). The "ArrayIs..." flags identify specific types /// of array; default is a general unordered array, serialized using an \c rdf:Bag container. kXMP_PropValueIsArray = 0x00000200UL, /// The item order does not matter. kXMP_PropArrayIsUnordered = kXMP_PropValueIsArray, /// Implies \c #kXMP_PropValueIsArray, item order matters. It is serialized using an \c rdf:Seq container. kXMP_PropArrayIsOrdered = 0x00000400UL, /// Implies \c #kXMP_PropArrayIsOrdered, items are alternates. It is serialized using an \c rdf:Alt container. kXMP_PropArrayIsAlternate = 0x00000800UL, // ------------------------------------ // Additional struct and array options. /// Implies \c #kXMP_PropArrayIsAlternate, items are localized text. Each array element is a /// simple property with an \c xml:lang attribute. kXMP_PropArrayIsAltText = 0x00001000UL, // kXMP_InsertBeforeItem = 0x00004000UL, ! Used by SetXyz functions. // kXMP_InsertAfterItem = 0x00008000UL, ! Used by SetXyz functions. // ---------------------------- // Other miscellaneous options. /// This property is an alias name for another property. This is only returned by /// \c TXMPMeta::GetProperty() and then only if the property name is simple, not an path expression. kXMP_PropIsAlias = 0x00010000UL, /// This property is the base value (actual) for a set of aliases.This is only returned by /// \c TXMPMeta::GetProperty() and then only if the property name is simple, not an path expression. kXMP_PropHasAliases = 0x00020000UL, /// The value of this property is "owned" by the application, and should not generally be editable in a UI. kXMP_PropIsInternal = 0x00040000UL, /// The value of this property is not derived from the document content. kXMP_PropIsStable = 0x00100000UL, /// The value of this property is derived from the document content. kXMP_PropIsDerived = 0x00200000UL, // kXMPUtil_AllowCommas = 0x10000000UL, ! Used by TXMPUtils::CatenateArrayItems and ::SeparateArrayItems. // kXMP_DeleteExisting = 0x20000000UL, ! Used by TXMPMeta::SetXyz functions to delete any pre-existing property. // kXMP_SchemaNode = 0x80000000UL, ! Returned by iterators - #define to avoid warnings // ------------------------------ // Masks that are multiple flags. /// Property type bit-flag mask for all array types kXMP_PropArrayFormMask = kXMP_PropValueIsArray | kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate | kXMP_PropArrayIsAltText, /// Property type bit-flag mask for composite types (array and struct) kXMP_PropCompositeMask = kXMP_PropValueIsStruct | kXMP_PropArrayFormMask, /// Mask for bits that are reserved for transient use by the implementation. kXMP_ImplReservedMask = 0x70000000L }; #define kXMP_SchemaNode ((XMP_OptionBits)0x80000000UL) /// Option bit flags for the \c TXMPMeta property setting functions. These option bits are shared /// with the accessor functions: /// \li \c #kXMP_PropValueIsURI /// \li \c #kXMP_PropValueIsStruct /// \li \c #kXMP_PropValueIsArray /// \li \c #kXMP_PropArrayIsOrdered /// \li \c #kXMP_PropArrayIsAlternate /// \li \c #kXMP_PropArrayIsAltText enum { /// Option for array item location: Insert a new item before the given index. kXMP_InsertBeforeItem = 0x00004000UL, /// Option for array item location: Insert a new item after the given index. kXMP_InsertAfterItem = 0x00008000UL, /// Delete any pre-existing property. kXMP_DeleteExisting = 0x20000000UL, /// Bit-flag mask for property-value option bits kXMP_PropValueOptionsMask = kXMP_PropValueIsURI, /// Bit-flag mask for array-item location bits kXMP_PropArrayLocationMask = kXMP_InsertBeforeItem | kXMP_InsertAfterItem }; // ------------------------------------------------------------------------------------------------- /// Option bit flags for \c TXMPMeta::ParseFromBuffer(). enum { /// Require a surrounding \c x:xmpmeta element. kXMP_RequireXMPMeta = 0x0001UL, /// This is the not last input buffer for this parse stream. kXMP_ParseMoreBuffers = 0x0002UL, /// Do not reconcile alias differences, throw an exception. kXMP_StrictAliasing = 0x0004UL }; /// Option bit flags for \c TXMPMeta::SerializeToBuffer(). enum { // *** Option to remove empty struct/array, or leaf with empty value? /// Omit the XML packet wrapper. kXMP_OmitPacketWrapper = 0x0010UL, /// Default is a writeable packet. kXMP_ReadOnlyPacket = 0x0020UL, /// Use a compact form of RDF. kXMP_UseCompactFormat = 0x0040UL, /// Include a padding allowance for a thumbnail image. kXMP_IncludeThumbnailPad = 0x0100UL, /// The padding parameter is the overall packet length. kXMP_ExactPacketLength = 0x0200UL, /// Omit all formatting whitespace. kXMP_OmitAllFormatting = 0x0800UL, /// Omit the x:xmpmeta element surrounding the rdf:RDF element. kXMP_OmitXMPMetaElement = 0x1000UL, _XMP_LittleEndian_Bit = 0x0001UL, // ! Don't use directly, see the combined values below! _XMP_UTF16_Bit = 0x0002UL, _XMP_UTF32_Bit = 0x0004UL, /// Bit-flag mask for encoding-type bits kXMP_EncodingMask = 0x0007UL, /// Use UTF8 encoding kXMP_EncodeUTF8 = 0UL, /// Use UTF16 big-endian encoding kXMP_EncodeUTF16Big = _XMP_UTF16_Bit, /// Use UTF16 little-endian encoding kXMP_EncodeUTF16Little = _XMP_UTF16_Bit | _XMP_LittleEndian_Bit, /// Use UTF32 big-endian encoding kXMP_EncodeUTF32Big = _XMP_UTF32_Bit, /// Use UTF13 little-endian encoding kXMP_EncodeUTF32Little = _XMP_UTF32_Bit | _XMP_LittleEndian_Bit }; // ------------------------------------------------------------------------------------------------- /// Option bit flags for \c TXMPIterator construction. enum { /// The low 8 bits are an enum of what data structure to iterate. kXMP_IterClassMask = 0x00FFUL, /// Iterate the property tree of a TXMPMeta object. kXMP_IterProperties = 0x0000UL, /// Iterate the global alias table. kXMP_IterAliases = 0x0001UL, /// Iterate the global namespace table. kXMP_IterNamespaces = 0x0002UL, /// Just do the immediate children of the root, default is subtree. kXMP_IterJustChildren = 0x0100UL, /// Just do the leaf nodes, default is all nodes in the subtree. kXMP_IterJustLeafNodes = 0x0200UL, /// Return just the leaf part of the path, default is the full path. kXMP_IterJustLeafName = 0x0400UL, /// Omit all qualifiers. kXMP_IterOmitQualifiers = 0x1000UL }; /// Option bit flags for \c TXMPIterator::Skip(). enum { /// Skip the subtree below the current node. kXMP_IterSkipSubtree = 0x0001UL, /// Skip the subtree below and remaining siblings of the current node. kXMP_IterSkipSiblings = 0x0002UL }; // ------------------------------------------------------------------------------------------------- /// Option bit flags for \c TXMPUtils::CatenateArrayItems() and \c TXMPUtils::SeparateArrayItems(). /// These option bits are shared with the accessor functions: /// \li \c #kXMP_PropValueIsArray, /// \li \c #kXMP_PropArrayIsOrdered, /// \li \c #kXMP_PropArrayIsAlternate, /// \li \c #kXMP_PropArrayIsAltText enum { /// Allow commas in item values, default is separator. kXMPUtil_AllowCommas = 0x10000000UL }; /// Option bit flags for \c TXMPUtils::ApplyTemplate(). enum { /// Do all properties, default is just external properties. kXMPTemplate_IncludeInternalProperties = 0x0001UL, /// Perform a Replace operation, add new properties and modify existing ones. kXMPTemplate_ReplaceExistingProperties = 0x0002UL, /// Similar to Replace, also delete if the template has an empty value. kXMPTemplate_ReplaceWithDeleteEmpty = 0x0004UL, /// Perform an Add operation, add properties if they don't already exist. kXMPTemplate_AddNewProperties = 0x0008UL, /// Perform a Clear operation, keep named properties and delete everything else. kXMPTemplate_ClearUnnamedProperties = 0x0010UL }; /// Option bit flags for \c TXMPUtils::RemoveProperties() and \c TXMPUtils::AppendProperties(). enum { /// Do all properties, default is just external properties. kXMPUtil_DoAllProperties = 0x0001UL, /// Replace existing values, default is to leave them. kXMPUtil_ReplaceOldValues = 0x0002UL, /// Delete properties if the new value is empty. kXMPUtil_DeleteEmptyValues = 0x0004UL, /// Include aliases, default is just actual properties. kXMPUtil_IncludeAliases = 0x0800UL }; // ================================================================================================= // Types and Constants for XMPFiles // ================================ /// File format constants for use with XMPFiles. enum { // ! Hex used to avoid gcc warnings. Leave the constants so the text reads big endian. There // ! seems to be no decent way on UNIX to determine the target endianness at compile time. // ! Forcing it on the client isn't acceptable. // -------------------- // Public file formats. /// Public file format constant: 'PDF ' kXMP_PDFFile = 0x50444620UL, /// Public file format constant: 'PS ', general PostScript following DSC conventions kXMP_PostScriptFile = 0x50532020UL, /// Public file format constant: 'EPS ', encapsulated PostScript kXMP_EPSFile = 0x45505320UL, /// Public file format constant: 'JPEG' kXMP_JPEGFile = 0x4A504547UL, /// Public file format constant: 'JPX ', JPEG 2000, ISO 15444-1 kXMP_JPEG2KFile = 0x4A505820UL, /// Public file format constant: 'TIFF' kXMP_TIFFFile = 0x54494646UL, /// Public file format constant: 'GIF ' kXMP_GIFFile = 0x47494620UL, /// Public file format constant: 'PNG ' kXMP_PNGFile = 0x504E4720UL, /// Public file format constant: 'SWF ' kXMP_SWFFile = 0x53574620UL, /// Public file format constant: 'FLA ' kXMP_FLAFile = 0x464C4120UL, /// Public file format constant: 'FLV ' kXMP_FLVFile = 0x464C5620UL, /// Public file format constant: 'MOV ', Quicktime kXMP_MOVFile = 0x4D4F5620UL, /// Public file format constant: 'AVI ' kXMP_AVIFile = 0x41564920UL, /// Public file format constant: 'CIN ', Cineon kXMP_CINFile = 0x43494E20UL, /// Public file format constant: 'WAV ' kXMP_WAVFile = 0x57415620UL, /// Public file format constant: 'MP3 ' kXMP_MP3File = 0x4D503320UL, /// Public file format constant: 'SES ', Audition session kXMP_SESFile = 0x53455320UL, /// Public file format constant: 'CEL ', Audition loop kXMP_CELFile = 0x43454C20UL, /// Public file format constant: 'MPEG' kXMP_MPEGFile = 0x4D504547UL, /// Public file format constant: 'MP2 ' kXMP_MPEG2File = 0x4D503220UL, /// Public file format constant: 'MP4 ', ISO 14494-12 and -14 kXMP_MPEG4File = 0x4D503420UL, /// Public file format constant: 'WMAV', Windows Media Audio and Video kXMP_WMAVFile = 0x574D4156UL, /// Public file format constant: 'AIFF' kXMP_AIFFFile = 0x41494646UL, /// Public file format constant: 'P2 ', a collection not really a single file kXMP_P2File = 0x50322020UL, /// Public file format constant: 'XDCF', a collection not really a single file kXMP_XDCAM_FAMFile = 0x58444346UL, /// Public file format constant: 'XDCS', a collection not really a single file kXMP_XDCAM_SAMFile = 0x58444353UL, /// Public file format constant: 'XDCX', a collection not really a single file kXMP_XDCAM_EXFile = 0x58444358UL, /// Public file format constant: 'AVHD', a collection not really a single file kXMP_AVCHDFile = 0x41564844UL, /// Public file format constant: 'SHDV', a collection not really a single file kXMP_SonyHDVFile = 0x53484456UL, /// Public file format constant: 'HTML' kXMP_HTMLFile = 0x48544D4CUL, /// Public file format constant: 'XML ' kXMP_XMLFile = 0x584D4C20UL, /// Public file format constant: 'text' kXMP_TextFile = 0x74657874UL, // ------------------------------- // Adobe application file formats. /// Adobe application file format constant: 'PSD ' kXMP_PhotoshopFile = 0x50534420UL, /// Adobe application file format constant: 'AI ' kXMP_IllustratorFile = 0x41492020UL, /// Adobe application file format constant: 'INDD' kXMP_InDesignFile = 0x494E4444UL, /// Adobe application file format constant: 'AEP ' kXMP_AEProjectFile = 0x41455020UL, /// Adobe application file format constant: 'AET ', After Effects Project Template kXMP_AEProjTemplateFile = 0x41455420UL, /// Adobe application file format constant: 'FFX ' kXMP_AEFilterPresetFile = 0x46465820UL, /// Adobe application file format constant: 'NCOR' kXMP_EncoreProjectFile = 0x4E434F52UL, /// Adobe application file format constant: 'PRPJ' kXMP_PremiereProjectFile = 0x5052504AUL, /// Adobe application file format constant: 'PRTL' kXMP_PremiereTitleFile = 0x5052544CUL, /// Adobe application file format constant: 'UCF ', Universal Container Format kXMP_UCFFile = 0x55434620UL, // ------- // Others. /// Unknown file format constant: ' ' kXMP_UnknownFile = 0x20202020UL }; /// Type for file format identification constants. See \c #kXMP_PDFFile and following. typedef XMP_Uns32 XMP_FileFormat; // ------------------------------------------------------------------------------------------------- /// Byte-order masks, do not use directly enum { kXMP_CharLittleEndianMask = 1, kXMP_Char16BitMask = 2, kXMP_Char32BitMask = 4 }; /// Constants to allow easy testing for 16/32 bit and big/little endian. enum { /// 8-bit kXMP_Char8Bit = 0, /// 16-bit big-endian kXMP_Char16BitBig = kXMP_Char16BitMask, /// 16-bit little-endian kXMP_Char16BitLittle = kXMP_Char16BitMask | kXMP_CharLittleEndianMask, /// 32-bit big-endian kXMP_Char32BitBig = kXMP_Char32BitMask, /// 32-bit little-endian kXMP_Char32BitLittle = kXMP_Char32BitMask | kXMP_CharLittleEndianMask, /// Variable or not-yet-known cases kXMP_CharUnknown = 1 }; /// \name Macros to test components of the character form mask /// @{ /// /// \def XMP_CharFormIs16Bit /// \brief Macro reports the encoding of a character. /// \param f The character to check. /// /// \def XMP_CharFormIs32Bit /// \brief Macro reports the encoding of a character. /// \param f The character to check. /// /// \def XMP_CharFormIsBigEndian /// \brief Macro reports the byte-order of a character. /// \param f The character to check. /// /// \def XMP_CharFormIsLittleEndian /// \brief Macro reports the byte-order of a character. /// \param f The character to check. /// /// \def XMP_GetCharSize /// \brief Macro reports the byte-size of a character. /// \param f The character to check. /// /// \def XMP_CharToSerializeForm /// \brief Macro converts \c XMP_Uns8 to \c XMP_OptionBits. /// \param cf The character to convert. /// /// \def XMP_CharFromSerializeForm /// \brief Macro converts \c XMP_OptionBits to \c XMP_Uns8. /// \param sf The character to convert. /// /// @} #define XMP_CharFormIs16Bit(f) ( ((int)(f) & kXMP_Char16BitMask) != 0 ) #define XMP_CharFormIs32Bit(f) ( ((int)(f) & kXMP_Char32BitMask) != 0 ) #define XMP_CharFormIsBigEndian(f) ( ((int)(f) & kXMP_CharLittleEndianMask) == 0 ) #define XMP_CharFormIsLittleEndian(f) ( ((int)(f) & kXMP_CharLittleEndianMask) != 0 ) #define XMP_GetCharSize(f) ( ((int)(f)&6) == 0 ? 1 : (int)(f)&6 ) #define XMP_CharToSerializeForm(cf) ( (XMP_OptionBits)(cf) ) #define XMP_CharFromSerializeForm(sf) ( (XMP_Uns8)(sf) ) /// \def kXMPFiles_UnknownOffset /// \brief Constant for an unknown packet offset within a file. #define kXMPFiles_UnknownOffset ((XMP_Int64)-1) /// \def kXMPFiles_UnknownLength /// \brief Constant for an unknown packet length within a file. #define kXMPFiles_UnknownLength ((XMP_Int32)-1) /// XMP packet description struct XMP_PacketInfo { /// Packet offset in the file in bytes, -1 if unknown. XMP_Int64 offset; /// Packet length in the file in bytes, -1 if unknown. XMP_Int32 length; /// Packet padding size in bytes, zero if unknown. XMP_Int32 padSize; // Zero if unknown. /// Character format using the values \c kXMP_Char8Bit, \c kXMP_Char16BitBig, etc. XMP_Uns8 charForm; /// True if there is a packet wrapper and the trailer says writeable by dumb packet scanners. XMP_Bool writeable; /// True if there is a packet wrapper, the "" XML processing instructions. XMP_Bool hasWrapper; /// Padding to make the struct's size be a multiple 4. XMP_Uns8 pad; /// Default constructor. XMP_PacketInfo() : offset(kXMPFiles_UnknownOffset), length(kXMPFiles_UnknownLength), padSize(0), charForm(0), writeable(0), hasWrapper(0), pad(0) {}; }; /// Version of the XMP_PacketInfo type enum { /// Version of the XMP_PacketInfo type kXMP_PacketInfoVersion = 3 }; // ------------------------------------------------------------------------------------------------- /// Option bit flags for \c TXMPFiles::Initialize(). enum { /// Ignore non-XMP text that uses an undefined "local" encoding. kXMPFiles_IgnoreLocalText = 0x0002, /// Combination of flags necessary for server products using XMPFiles. kXMPFiles_ServerMode = kXMPFiles_IgnoreLocalText }; /// Option bit flags for \c TXMPFiles::GetFormatInfo(). enum { /// Can inject first-time XMP into an existing file. kXMPFiles_CanInjectXMP = 0x00000001, /// Can expand XMP or other metadata in an existing file. kXMPFiles_CanExpand = 0x00000002, /// Can copy one file to another, writing new metadata. kXMPFiles_CanRewrite = 0x00000004, /// Can expand, but prefers in-place update. kXMPFiles_PrefersInPlace = 0x00000008, /// Supports reconciliation between XMP and other forms. kXMPFiles_CanReconcile = 0x00000010, /// Allows access to just the XMP, ignoring other forms. kXMPFiles_AllowsOnlyXMP = 0x00000020, /// File handler returns raw XMP packet information. kXMPFiles_ReturnsRawPacket = 0x00000040, /// The file handler does the file open and close. kXMPFiles_HandlerOwnsFile = 0x00000100, /// The file handler allows crash-safe file updates. kXMPFiles_AllowsSafeUpdate = 0x00000200, /// The file format needs the XMP packet to be read-only. kXMPFiles_NeedsReadOnlyPacket = 0x00000400, /// The file handler uses a "sidecar" file for the XMP. kXMPFiles_UsesSidecarXMP = 0x00000800, /// The format is folder oriented, for example the P2 video format. kXMPFiles_FolderBasedFormat = 0x00001000 }; /// Option bit flags for \c TXMPFiles::OpenFile(). enum { /// Open for read-only access. kXMPFiles_OpenForRead = 0x00000001, /// Open for reading and writing. kXMPFiles_OpenForUpdate = 0x00000002, /// Only the XMP is wanted, allows space/time optimizations. kXMPFiles_OpenOnlyXMP = 0x00000004, /// Be strict about only attempting to use the designated file handler, no fallback to other handlers. kXMPFiles_OpenStrictly = 0x00000010, /// Require the use of a smart handler. kXMPFiles_OpenUseSmartHandler = 0x00000020, /// Force packet scanning, do not use a smart handler. kXMPFiles_OpenUsePacketScanning = 0x00000040, /// Only packet scan files "known" to need scanning. kXMPFiles_OpenLimitedScanning = 0x00000080, /// Attempt to repair a file opened for update, default is to not open (throw an exception). kXMPFiles_OpenRepairFile = 0x00000100 }; /// Option bit flags for \c TXMPFiles::CloseFile(). enum { /// Write into a temporary file and swap for crash safety. kXMPFiles_UpdateSafely = 0x0001 }; // ================================================================================================= // Exception codes // =============== /// \name Errors Exception handling /// @{ /// /// XMP Tookit errors result in throwing an \c XMP_Error exception. Any exception thrown within the /// XMP Toolkit is caught in the toolkit and rethrown as an \c XMP_Error. /// /// The \c XMP_Error class contains a numeric code and an English explanation. New numeric codes may /// be added at any time. There are typically many possible explanations for each numeric code. The /// explanations try to be precise about the specific circumstances causing the error. /// /// \note The explanation string is for debugging use only. It must not be shown to users in a /// final product. It is written for developers not users, and never localized. /// /// XMP Toolkit error, associates an error code with a descriptive error string. class XMP_Error { public: /// @brief Constructor for an XMP_Error. /// /// @param _id The numeric code. /// /// @param _errMsg The descriptive string, for debugging use only. It must not be shown to users /// in a final product. It is written for developers, not users, and never localized. XMP_Error ( XMP_Int32 _id, XMP_StringPtr _errMsg ) : id(_id), errMsg(_errMsg) {}; /// Retrieves the numeric code from an XMP_Error. inline XMP_Int32 GetID() const { return id; }; /// Retrieves the descriptive string from an XMP_Error. inline XMP_StringPtr GetErrMsg() const { return errMsg; }; private: /// Exception code. See constants \c #kXMPErr_Unknown and following. XMP_Int32 id; /// Descriptive string, for debugging use only. It must not be shown to users in a final /// product. It is written for developers, not users, and never localized. XMP_StringPtr errMsg; }; /// Exception code constants enum { // -------------------- // Generic error codes. /// Generic unknown error kXMPErr_Unknown = 0, /// Generic undefined error kXMPErr_TBD = 1, /// Generic unavailable error kXMPErr_Unavailable = 2, /// Generic bad object error kXMPErr_BadObject = 3, /// Generic bad parameter error kXMPErr_BadParam = 4, /// Generic bad value error kXMPErr_BadValue = 5, /// Generic assertion failure kXMPErr_AssertFailure = 6, /// Generic enforcement failure kXMPErr_EnforceFailure = 7, /// Generic unimplemented error kXMPErr_Unimplemented = 8, /// Generic internal failure kXMPErr_InternalFailure = 9, /// Generic deprecated error kXMPErr_Deprecated = 10, /// Generic external failure kXMPErr_ExternalFailure = 11, /// Generic user abort error kXMPErr_UserAbort = 12, /// Generic standard exception kXMPErr_StdException = 13, /// Generic unknown exception kXMPErr_UnknownException = 14, /// Generic out-of-memory error kXMPErr_NoMemory = 15, // ------------------------------------ // More specific parameter error codes. /// Bad schema parameter kXMPErr_BadSchema = 101, /// Bad XPath parameter kXMPErr_BadXPath = 102, /// Bad options parameter kXMPErr_BadOptions = 103, /// Bad index parameter kXMPErr_BadIndex = 104, /// Bad iteration position kXMPErr_BadIterPosition = 105, /// XML parsing error kXMPErr_BadParse = 106, /// Serialization error kXMPErr_BadSerialize = 107, /// File format error kXMPErr_BadFileFormat = 108, /// No file handler found for format kXMPErr_NoFileHandler = 109, /// Data too large for JPEG file format kXMPErr_TooLargeForJPEG = 110, // ----------------------------------------------- // File format and internal structure error codes. /// XML format error kXMPErr_BadXML = 201, /// RDF format error kXMPErr_BadRDF = 202, /// XMP format error kXMPErr_BadXMP = 203, /// Empty iterator kXMPErr_EmptyIterator = 204, /// Unicode error kXMPErr_BadUnicode = 205, /// TIFF format error kXMPErr_BadTIFF = 206, /// JPEG format error kXMPErr_BadJPEG = 207, /// PSD format error kXMPErr_BadPSD = 208, /// PSIR format error kXMPErr_BadPSIR = 209, /// IPTC format error kXMPErr_BadIPTC = 210, /// MPEG format error kXMPErr_BadMPEG = 211 }; /// @} // ================================================================================================= // Client callbacks // ================ // ------------------------------------------------------------------------------------------------- /// \name Special purpose callback functions /// @{ /// A signed 32-bit integer used as a status result for the output callback routine, /// \c XMP_TextOutputProc. Zero means no error, all other values except -1 are private to the callback. /// The callback is wrapped to prevent exceptions being thrown across DLL boundaries. Any exceptions /// thrown out of the callback cause a return status of -1. typedef XMP_Int32 XMP_Status; // ------------------------------------------------------------------------------------------------- /// The signature of a client-defined callback for text output from XMP Toolkit debugging /// operations. The callback is invoked one or more times for each line of output. The end of a line /// is signaled by a '\\n' character at the end of the buffer. Formatting newlines are never present /// in the middle of a buffer, but values of properties might contain any UTF-8 characters. /// /// @param refCon A pointer to client-defined data passed to the TextOutputProc. /// /// @param buffer A string containing one line of output. /// /// @param bufferSize The number of characters in the output buffer. /// /// @return A success/fail status value. Any failure result aborts the output. /// /// @see \c TXMPMeta::DumpObject() typedef XMP_Status (* XMP_TextOutputProc) ( void * refCon, XMP_StringPtr buffer, XMP_StringLen bufferSize ); // ------------------------------------------------------------------------------------------------- /// The signature of a client-defined callback to check for a user request to abort a time-consuming /// operation within XMPFiles. /// /// @param arg A pointer to caller-defined data passed from the registration call. /// /// @return True to abort the current operation, which results in an exception being thrown. /// /// @see \c TXMPFiles::SetAbortProc() typedef bool (* XMP_AbortProc) ( void * arg ); // Used by . /// @} // ================================================================================================= // Stuff with no better place to be // ================================ /// XMP Toolkit version information typedef struct XMP_VersionInfo { /// The primary release number, the "1" in version "1.2.3". XMP_Uns8 major; /// The secondary release number, the "2" in version "1.2.3". XMP_Uns8 minor; /// The tertiary release number, the "3" in version "1.2.3". XMP_Uns8 micro; /// A 0/1 boolean value, true if this is a debug build. XMP_Bool isDebug; /// A rolling build number, monotonically increasing in a release. XMP_Uns32 build; /// Individual feature implementation flags. XMP_Uns32 flags; /// A comprehensive version information string. XMP_StringPtr message; } XMP_VersionInfo; // ================================================================================================= #if __cplusplus } // extern "C" #endif #endif // __XMP_Const_h__ exempi-2.2.1/config.guess0000755000175000017500000012761511657666561012303 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. timestamp='2009-11-20' # This file 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 of the License, 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. # # 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: exempi-2.2.1/samples/0000775000175000017500000000000012163706253011457 500000000000000exempi-2.2.1/samples/testfiles/0000775000175000017500000000000012163706253013461 500000000000000exempi-2.2.1/samples/testfiles/BlueSquare.tif0000664000175000017500000077247011745673651016210 00000000000000MM*þhØ.X4eøØ@Œ”(1œ2º¼®΃»1|†I, @‡iAL‡s HAv“\8M¾XMPFiles BlueSquare test file, created in Photoshop CS2, saved as .psd, .jpg, and .tif. ü€' ü€'Adobe Photoshop CS2 Macintosh2005:09:07 15:09:20 Blue Square Test File - .tif XMPFiles BlueSquare test file, created in Photoshop CS2, saved as .psd, .jpg, and .tif. XMP Blue Square test file Photoshop .tif 8 8 8 xWXMPFiles BlueSquare test file, created in Photoshop CS2, saved as .psd, .jpg, and .tif.Blue Square Test File - .tifXMP Blue Square test file Photoshop.tif8BIMéxHHÞ@ÿîÿîRg(üHHØ(dÿh 8BIMê° com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMíHH8BIMó 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM8BIM8BIM@@8BIM 8BIM Π`à´²ÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ` "ÿÝ ÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’I%)$’IJI$’R’I$”¤’I%)$’IJI$’R’I$”¤’I%)$’IOÿÐõT’I%)$’INGXúÛõ¢d·©åýž÷°ZÖzv>XK˜4×c~•oT?ñÈú—ÿ–?ø ÿúAqãÿX¿øMŸù÷!p«§ä>Êó®,ÓžQ,‘⌡Ãôý[ ²ÈHŠ>ãÿŽGÔ¿ü±ÿÀoÿÒ ã‘õ/ÿ,ðÿô‚ð䕯ù1ÉœÍþ6?ýT·Þ—`ûþ9RÿòÇÿ¿ÿH%ÿŽGÔ¿ü±ÿÀoÿÒ Ã’KþLr_ç3ÿU+Þ—`ûþ9RÿòÇÿ¿ÿH%ÿŽGÔ¿ü±ÿÀoÿÒ Ã’KþLr_ç3ÿU+Þ—`ûþ9RÿòÇÿ¿ÿH%ÿŽGÔ¿ü±ÿÀoÿÒ Ã’KþLr_ç3ÿU+Þ—`ûþ9RÿòÇÿ¿ÿH+]7ë·ÕŽ©›^o­•vïN¿JÖÎÖº×û쩌ú wç/]7ø·ÿŧNÿ¯ç‹Ô<×ü]å1rù²ÆyŒ±ãžHñK!Ä8¿V˜æ‘ PÔ¾â’I.QI$’JÿÑõT’I%)$’IO‘ÿüQbÿá6ç܅®ëüoÿâ‹ÿ ³ÿ>ä.wÿÿµü¿÷?kW'ÎT’I+ë’I$¥$’I)I$’JRé¿Å¿þ-:wý{ÿ<^¹•Ó‹üZtïú÷þx½Uø‡û‹™ÿc—ÿIÉt>hù‡ÜRI%çmµ$’I)ÿÒõT’I%)$’IO‘ÿüQbÿá6ç܅®ëüoÿâ‹ÿ ³ÿ>ä.wÿÿµü¿÷?kW'ÎT’I+ë’I$¥$’I)I$’JRé¿Å¿þ-:wý{ÿ<^¹•Ó‹üZtïú÷þx½Uø‡û‹™ÿc—ÿIÉt>hù‡ÜRI%çmµ$’I)ÿÓõT’I%)$’IOžÿŒ?©Ýw¯uš2úuL²šñ›S‹žÖÁö¾6»ù65rßø×ýoÿ¸õÛ¬þõíi-n_ãÜÞ 0ÃãàÆ8cÅqÓc8¢M›ÕñOükþ·ÿÜz¿íÖz_ø×ýoÿ¸õÛ¬þõíi)¿å/=û¸¿Å—ýú=˜ø¾)ÿÖÿûWýºÏïKÿÿ­ÿ÷¯ûuŸÞ½­$¿å/=û¸¿Å—ýú½˜ø¾)ÿÖÿûWýºÏïKÿÿ­ÿ÷¯ûuŸÞ½­$¿å/=û¸¿Å—ýú½˜ø¾)ÿÖÿûWýºÏïKÿÿ­ÿ÷¯ûuŸÞ½­$¿å/=û¸¿Å—ýú½˜ø¾)ÿÖÿûWýºÏï[S>¡ýcéYpú†m,f5>¯¨æØ×º«joµ§÷Þ½A%oøÁÎeÅ€5{Yc ¡8BIM&?€8BIM( ?ð8BIM-8BIM08BIM ømaniIRFRì8BIMAnDsÌnullAFStlongFrInVlLsObjcnullFrIDlongs‹«çFStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslongs‹«çLCntlong8BIMRoll8BIM¡mfri8BIM'   h Ø HLinomntrRGB XYZ Î 1acspMSFTIEC sRGBöÖÓ-HP cprtP3desc„lwtptðbkptrXYZgXYZ,bXYZ@dmndTpdmddĈvuedL†viewÔ$lumiømeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ óQÌXYZ XYZ o¢8õXYZ b™·…ÚXYZ $ „¶ÏdescIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view¤þ_.ÏíÌ \žXYZ L VPWçmeassig CRT curv #(-27;@EJOTY^chmrw|†‹•šŸ¤©®²·¼ÁÆËÐÕÛàåëðöû %+28>ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿAdobe Photoshop Document Data Block8BIMLayrÞØhÂÂÂ8BIMnormÿ ð(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Background8BIMluni Background8BIMlnsrbgnd8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrpÿÿ8BIMnormÿ0(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿShape 18BIMSoCopnullClr ObjcRGBCRd doubGrn doubBl doub@oà8BIMvmskÀ;°8G„;°8G„;°8G„;°ÉŒ™;°ÉŒ™;°ÉŒ™¹™šÉŒ™¹™šÉŒ™¹™šÉŒ™¹™š8G„¹™š8G„¹™š8G„8BIMluniShape 18BIMlnsrshap8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrpÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿÿÿ™ÿ8BIMLMskÿÿ2€8BIMPattÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÕÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿÌÌÿêêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ--ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ––ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿffÿÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿexempi-2.2.1/samples/testfiles/BlueSquare.png0000664000175000017500000001355611745673651016203 00000000000000‰PNG  IHDRhØI:îC *iTXtXML:com.adobe.xmp Blue Square Test File - .psd XMPFiles BlueSquare test file, created in Photoshop CS2, saved as .psd, .jpg, and .tif. XMP Blue Square test file Photoshop .psd 8 8 8 WÍÒ pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFSIDATxÚì×1 €0@Ñ+Á+ºã V$ ]è{®×üäJfÀƒ'„@8á„@8á„@8„@8á„@8á„@8á@8á„á„@8á@8á„á„@8á„@8á„@8^]M{]qß–NCóÓôÿ1Kfö³ÔZã<ým:ŽØw§ €p €p €p  €p €p  €p €p €p €p€p €p €p  €p €p  €p €p €p €p€p €p €p€p €p €p  €p €pÂðCcWÓn[¬«¥Óвt1fÉLËœ*€p  €p €p  €p€p €p €p€p €p €p  €p €p  €p ÀgÿÿᜌIEND®B`‚exempi-2.2.1/samples/testfiles/BlueSquare.eps0000664000175000017500000131530711745673651016206 00000000000000%!PS-Adobe-3.1 EPSF-3.0 %ADO_DSC_Encoding: MacOS Roman %%Title: BlueSquare.eps %%Creator: Adobe Illustrator(R) 12 %%AI8_CreatorVersion: 12.0.0 %AI9_PrintingDataBegin %%For: Alan Lillich %%CreationDate: 9/7/05 %%BoundingBox: 0 0 289 361 %%HiResBoundingBox: 0 0 288.9996 361 %%CropBox: 0 0 288.9996 361 %%LanguageLevel: 2 %%DocumentData: Clean7Bit %%Pages: 1 %%DocumentNeededResources: %%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0 %%+ procset Adobe_CoolType_Utility_T42 1.0 0 %%+ procset Adobe_CoolType_Utility_MAKEOCF 1.19 0 %%+ procset Adobe_CoolType_Core 2.23 0 %%+ procset Adobe_AGM_Core 2.0 0 %%+ procset Adobe_AGM_Utils 1.0 0 %%DocumentFonts: %%DocumentNeededFonts: %%DocumentNeededFeatures: %%DocumentSuppliedFeatures: %%DocumentProcessColors: Cyan Magenta Black %%DocumentCustomColors: %%CMYKCustomColor: %%RGBCustomColor: %ADO_BuildNumber: Adobe Illustrator(R) 12.0.0 x5199 R agm 4.3861 ct 5.530 %ADO_ContainsXMP: MainFirst %AI7_Thumbnail: 104 128 8 %%BeginData: 29100 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %522853285328532853285328532853285328532853285328532853285328 %532853285328532853285328532853285328532853285328532853285328 %532853285328532853285328532853285328532853285328532853285328 %5328532853285328532853287DFF28290629062906290629062906290629 %062906290629062906290629062906290629062906290629062906290629 %062906290629062906290629062906290629062906290629062906290629 %062906290629062906290629062906290629062906290629062953FF5307 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929287DFF282906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062929290629292906292929062929290629062953FF53072F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F287EFF2829282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292928292929282929292829292953FF532929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F287DFF28292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062953FF53292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F297DFF282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %28292929282929292829292928292929062959FF53072F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29287DFF2829062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629292906292929062929290629062953FF53072F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F28 %7EFF28292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292953FF532929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F287DFF %282929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %29290629292906292929062953FF53292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F297DFF2829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292928292929062959FF53072F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929287DFF28290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629062953FF53072F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F287EFF282928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %29292829292953FF532929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F287DFF2829292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062953FF53292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F297DFF28292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %062959FF53072F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929287DFF282906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906290629 %53FF53072F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F287EFF2829282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292928292929282929292829292928292929282929292829292953FF %532929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F287DFF28292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062953FF5329 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F297DFF282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %29292829292928292929282929292829292928292929062959FF53072F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929287DFF2829062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062929290629292906292929062929290629062953FF53072F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F287EFF28292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292953FF532929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F287DFF282929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062929290629292906292929062953FF53292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F297DFF2829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292928292929062959FF53072F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292928 %7DFF28290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629062953FF53072F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F287EFF %282928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %28292929282929292829292953FF532929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F287DFF2829 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629292906292929062953FF53292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F297DFF28292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929062959FF53072F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929287DFF282906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %29290629062953FF53072F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F287EFF2829282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292953FF532929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F287DFF28292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062953FF53292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F297DFF282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929290629 %59FF53072F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929287DFF2829062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629292906292929062929290629292906292929062929290629062953FF %53072F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F287EFF28292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292953FF5329 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F287DFF282929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %29290629292906292929062929290629292906292929062953FF53292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F297DFF2829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292928292929282929292829292928292929062959FF53072F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929287DFF28290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629062953FF53072F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F287EFF282928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %29292829292928292929282929292829292953FF532929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F287DFF2829292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062929290629292906292929062953FF53292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %7DFF28292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929062959FF53072F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929287DFF %282906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062929290629062953FF53072F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F287EFF2829 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292953FF532929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F287DFF28292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062953FF53292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F297DFF282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %28292929062959FF53072F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929287DFF2829062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629062953FF53072F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F287EFF28292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292953FF532929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F287DFF282929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %53FF53292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F297DFF2829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292928292929282929292829292928292929062959FF %53072F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929287DFF28290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629062953FF5307 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F287EFF282928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %28292929282929292829292928292929282929292829292953FF53292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F287DFF2829292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629292906292929062929290629292906292929062953FF53292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F297DFF28292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929062959FF53072F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929287DFF282906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %29290629292906292929062929290629062953FF53072F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F287EFF2829282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292928292929282929292829292953FF532929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F28 %7DFF28292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062953FF53292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F297DFF %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %29292829292928292929062959FF53072F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929287DFF2829 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062929290629062953FF53072F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F287EFF28292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292953FF532929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F287DFF282929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062953FF53292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F297DFF2829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929062959FF53072F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929287DFF28290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %062953FF53072F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F287EFF282928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %53FF532929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F287DFF2829292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062929290629292906292929062929290629292906292929062953FF %53292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F297DFF28292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929062959FF5307 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929287DFF282906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062929290629292906292929062929290629062953FF53072F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F287EFF2829282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292928292929282929292829292953FF530729072929 %290729292907292929072929290729292907292929072929290729292907 %292929072929290729292907292929072929290729292907292929072929 %290729292907292929072929290729292907292929072929290729292907 %2929290729297DFF27532828285228282852282828522828285228282852 %282828522828285228282852282828522828285228282852282828522828 %285228282852282828522828285228282852282828522828285228282852 %282828522828285228282852282828522828282853FF %%EndData %%EndComments %%BeginDefaults %%ViewingOrientation: 1 0 0 1 %%EndDefaults %%BeginProlog %%BeginResource: procset Adobe_AGM_Utils 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Utils 70 dict dup begin put /bdf { bind def } bind def /nd{ null def }bdf /xdf { exch def }bdf /ldf { load def }bdf /ddf { put }bdf /xddf { 3 -1 roll put }bdf /xpt { exch put }bdf /ndf { exch dup where{ pop pop pop }{ xdf }ifelse }def /cdndf { exch dup currentdict exch known{ pop pop }{ exch def }ifelse }def /ps_level /languagelevel where{ pop systemdict /languagelevel get exec }{ 1 }ifelse def /level2 ps_level 2 ge def /level3 ps_level 3 ge def /ps_version {version cvr} stopped { -1 }if def /set_gvm { currentglobal exch setglobal }bdf /reset_gvm { setglobal }bdf /makereadonlyarray { /packedarray where{ pop packedarray }{ array astore readonly }ifelse }bdf /map_reserved_ink_name { dup type /stringtype eq{ dup /Red eq{ pop (_Red_) }{ dup /Green eq{ pop (_Green_) }{ dup /Blue eq{ pop (_Blue_) }{ dup () cvn eq{ pop (Process) }if }ifelse }ifelse }ifelse }if }bdf /AGMUTIL_GSTATE 22 dict def /get_gstate { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_clr_spc currentcolorspace def /AGMUTIL_GSTATE_clr_indx 0 def /AGMUTIL_GSTATE_clr_comps 12 array def mark currentcolor counttomark {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def} repeat pop /AGMUTIL_GSTATE_fnt rootfont def /AGMUTIL_GSTATE_lw currentlinewidth def /AGMUTIL_GSTATE_lc currentlinecap def /AGMUTIL_GSTATE_lj currentlinejoin def /AGMUTIL_GSTATE_ml currentmiterlimit def currentdash /AGMUTIL_GSTATE_do xdf /AGMUTIL_GSTATE_da xdf /AGMUTIL_GSTATE_sa currentstrokeadjust def /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def /AGMUTIL_GSTATE_op currentoverprint def /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def currentcolortransfer cvlit /AGMUTIL_GSTATE_gy_xfer xdf cvlit /AGMUTIL_GSTATE_b_xfer xdf cvlit /AGMUTIL_GSTATE_g_xfer xdf cvlit /AGMUTIL_GSTATE_r_xfer xdf /AGMUTIL_GSTATE_ht currenthalftone def /AGMUTIL_GSTATE_flt currentflat def end }def /set_gstate { AGMUTIL_GSTATE begin AGMUTIL_GSTATE_clr_spc setcolorspace AGMUTIL_GSTATE_clr_indx {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def} repeat setcolor AGMUTIL_GSTATE_fnt setfont AGMUTIL_GSTATE_lw setlinewidth AGMUTIL_GSTATE_lc setlinecap AGMUTIL_GSTATE_lj setlinejoin AGMUTIL_GSTATE_ml setmiterlimit AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash AGMUTIL_GSTATE_sa setstrokeadjust AGMUTIL_GSTATE_clr_rnd setcolorrendering AGMUTIL_GSTATE_op setoverprint AGMUTIL_GSTATE_bg cvx setblackgeneration AGMUTIL_GSTATE_ucr cvx setundercolorremoval AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer AGMUTIL_GSTATE_ht /HalftoneType get dup 9 eq exch 100 eq or { currenthalftone /HalftoneType get AGMUTIL_GSTATE_ht /HalftoneType get ne { mark AGMUTIL_GSTATE_ht {sethalftone} stopped cleartomark } if }{ AGMUTIL_GSTATE_ht sethalftone } ifelse AGMUTIL_GSTATE_flt setflat end }def /get_gstate_and_matrix { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_ctm matrix currentmatrix def end get_gstate }def /set_gstate_and_matrix { set_gstate AGMUTIL_GSTATE begin AGMUTIL_GSTATE_ctm setmatrix end }def /AGMUTIL_str256 256 string def /AGMUTIL_src256 256 string def /AGMUTIL_dst64 64 string def /AGMUTIL_srcLen nd /AGMUTIL_ndx nd /thold_halftone { level3 {sethalftone currenthalftone} { dup /HalftoneType get 3 eq { sethalftone currenthalftone } { begin Width Height mul { Thresholds read {pop} if } repeat end currenthalftone } ifelse }ifelse } def /rdcmntline { currentfile AGMUTIL_str256 readline pop (%) anchorsearch {pop} if } bdf /filter_cmyk { dup type /filetype ne{ exch () /SubFileDecode filter } { exch pop } ifelse [ exch { AGMUTIL_src256 readstring pop dup length /AGMUTIL_srcLen exch def /AGMUTIL_ndx 0 def AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ 1 index exch get AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put /AGMUTIL_ndx AGMUTIL_ndx 1 add def }for pop AGMUTIL_dst64 0 AGMUTIL_ndx getinterval } bind /exec cvx ] cvx } bdf /filter_indexed_devn { cvi Names length mul names_index add Lookup exch get } bdf /filter_devn { 4 dict begin /srcStr xdf /dstStr xdf dup type /filetype ne{ 0 () /SubFileDecode filter }if [ exch [ /devicen_colorspace_dict /AGMCORE_gget cvx /begin cvx currentdict /srcStr get /readstring cvx /pop cvx /dup cvx /length cvx 0 /gt cvx [ Adobe_AGM_Utils /AGMUTIL_ndx 0 /ddf cvx names_index Names length currentdict /srcStr get length 1 sub { 1 /index cvx /exch cvx /get cvx currentdict /dstStr get /AGMUTIL_ndx /load cvx 3 -1 /roll cvx /put cvx Adobe_AGM_Utils /AGMUTIL_ndx /AGMUTIL_ndx /load cvx 1 /add cvx /ddf cvx } for currentdict /dstStr get 0 /AGMUTIL_ndx /load cvx /getinterval cvx ] cvx /if cvx /end cvx ] cvx bind /exec cvx ] cvx end } bdf /AGMUTIL_imagefile nd /read_image_file { AGMUTIL_imagefile 0 setfileposition 10 dict begin /imageDict xdf /imbufLen Width BitsPerComponent mul 7 add 8 idiv def /imbufIdx 0 def /origDataSource imageDict /DataSource get def /origMultipleDataSources imageDict /MultipleDataSources get def /origDecode imageDict /Decode get def /dstDataStr imageDict /Width get colorSpaceElemCnt mul string def imageDict /MultipleDataSources known {MultipleDataSources}{false} ifelse { /imbufCnt imageDict /DataSource get length def /imbufs imbufCnt array def 0 1 imbufCnt 1 sub { /imbufIdx xdf imbufs imbufIdx imbufLen string put imageDict /DataSource get imbufIdx [ AGMUTIL_imagefile imbufs imbufIdx get /readstring cvx /pop cvx ] cvx put } for DeviceN_PS2 { imageDict begin /DataSource [ DataSource /devn_sep_datasource cvx ] cvx def /MultipleDataSources false def /Decode [0 1] def end } if }{ /imbuf imbufLen string def Indexed_DeviceN level3 not and DeviceN_NoneName or { /srcDataStrs [ imageDict begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi string } repeat end ] def imageDict begin /DataSource [AGMUTIL_imagefile Decode BitsPerComponent false 1 /filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource /exec cvx] cvx def /Decode [0 1] def end }{ imageDict /DataSource [1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx /pop cvx names_index /get cvx /put cvx] cvx put imageDict /Decode [0 1] put } ifelse } ifelse imageDict exch load exec imageDict /DataSource origDataSource put imageDict /MultipleDataSources origMultipleDataSources put imageDict /Decode origDecode put end } bdf /write_image_file { begin { (AGMUTIL_imagefile) (w+) file } stopped{ false }{ Adobe_AGM_Utils/AGMUTIL_imagefile xddf 2 dict begin /imbufLen Width BitsPerComponent mul 7 add 8 idiv def MultipleDataSources {DataSource 0 get}{DataSource}ifelse type /filetype eq { /imbuf imbufLen string def }if 1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{ pop MultipleDataSources { 0 1 DataSource length 1 sub { DataSource type dup /arraytype eq { pop DataSource exch get exec }{ /filetype eq { DataSource exch get imbuf readstring pop }{ DataSource exch get } ifelse } ifelse AGMUTIL_imagefile exch writestring } for }{ DataSource type dup /arraytype eq { pop DataSource exec }{ /filetype eq { DataSource imbuf readstring pop }{ DataSource } ifelse } ifelse AGMUTIL_imagefile exch writestring } ifelse }for end true }ifelse end } bdf /close_image_file { AGMUTIL_imagefile closefile (AGMUTIL_imagefile) deletefile }def statusdict /product known userdict /AGMP_current_show known not and{ /pstr statusdict /product get def pstr (HP LaserJet 2200) eq pstr (HP LaserJet 4000 Series) eq or pstr (HP LaserJet 4050 Series ) eq or pstr (HP LaserJet 8000 Series) eq or pstr (HP LaserJet 8100 Series) eq or pstr (HP LaserJet 8150 Series) eq or pstr (HP LaserJet 5000 Series) eq or pstr (HP LaserJet 5100 Series) eq or pstr (HP Color LaserJet 4500) eq or pstr (HP Color LaserJet 4600) eq or pstr (HP LaserJet 5Si) eq or pstr (HP LaserJet 1200 Series) eq or pstr (HP LaserJet 1300 Series) eq or pstr (HP LaserJet 4100 Series) eq or { userdict /AGMP_current_show /show load put userdict /show { currentcolorspace 0 get /Pattern eq {false charpath f} {AGMP_current_show} ifelse } put }if currentdict /pstr undef } if /consumeimagedata { begin currentdict /MultipleDataSources known not {/MultipleDataSources false def} if MultipleDataSources { DataSource 0 get type dup /filetype eq { 1 dict begin /flushbuffer Width cvi string def 1 1 Height cvi { pop 0 1 DataSource length 1 sub { DataSource exch get flushbuffer readstring pop pop }for }for end }if dup /arraytype eq exch /packedarraytype eq or DataSource 0 get xcheck and { Width Height mul cvi { 0 1 DataSource length 1 sub {dup DataSource exch get exec length exch 0 ne {pop}if}for dup 0 eq {pop exit}if sub dup 0 le {exit}if }loop pop }if } { /DataSource load type dup /filetype eq { 1 dict begin /flushbuffer Width Decode length 2 idiv mul cvi string def 1 1 Height { pop DataSource flushbuffer readstring pop pop} for end }if dup /arraytype eq exch /packedarraytype eq or /DataSource load xcheck and { Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul { DataSource length dup 0 eq {pop exit}if sub dup 0 le {exit}if }loop pop }if }ifelse end }bdf /addprocs { 2{/exec load}repeat 3 1 roll [ 5 1 roll ] bind cvx }def /modify_halftone_xfer { currenthalftone dup length dict copy begin currentdict 2 index known{ 1 index load dup length dict copy begin currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end def currentdict end sethalftone }{ currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end sethalftone pop }ifelse }def /clonearray { dup xcheck exch dup length array exch Adobe_AGM_Core/AGMCORE_tmp -1 ddf { Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf dup type /dicttype eq { Adobe_AGM_Core/AGMCORE_tmp get exch clonedict Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if dup type /arraytype eq { Adobe_AGM_Core/AGMCORE_tmp get exch clonearray Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if exch dup Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put }forall exch {cvx} if }bdf /clonedict { dup length dict begin { dup type /dicttype eq { clonedict } if dup type /arraytype eq { clonearray } if def }forall currentdict end }bdf /DeviceN_PS2 { /currentcolorspace AGMCORE_gget 0 get /DeviceN eq level3 not and } bdf /Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget dup null ne { dup /CSDBase known { /CSDBase get /CSD get_res /Names known }{ pop false }ifelse }{ pop false } ifelse } bdf /DeviceN_NoneName { /Names where { pop false Names { (None) eq or } forall }{ false }ifelse } bdf /DeviceN_PS2_inRip_seps { /AGMCORE_in_rip_sep where { pop dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /DeviceN eq level3 not and AGMCORE_in_rip_sep and { /currentcolorspace exch AGMCORE_gput false } { true }ifelse } { true } ifelse } { true } ifelse } bdf /base_colorspace_type { dup type /arraytype eq {0 get} if } bdf /currentdistillerparams where { pop currentdistillerparams /CoreDistVersion get 5000 lt}{true}ifelse { /pdfmark_5 {cleartomark} bind def }{ /pdfmark_5 {pdfmark} bind def }ifelse /ReadBypdfmark_5 { 2 dict begin /makerString exch def string /tmpString exch def { currentfile tmpString readline pop makerString anchorsearch { pop pop cleartomark exit }{ 3 copy /PUT pdfmark_5 pop 2 copy (\n) /PUT pdfmark_5 } ifelse }loop end } bdf /doc_setup{ Adobe_AGM_Utils begin }bdf /doc_trailer{ currentdict Adobe_AGM_Utils eq{ end }if }bdf systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_AGM_Core 2.0 0 %%Version: 2.0 0 %%Copyright: Copyright (C) 1997-2005 Adobe Systems, Inc. All Rights Reserved. %% Note: This procset assumes Adobe_AGM_Utils is opened on the stack below it, for %% definitions of some fundamental procedures. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Core 201 dict dup begin put /Adobe_AGM_Core_Id /Adobe_AGM_Core_2.0_0 def /AGMCORE_str256 256 string def /AGMCORE_save nd /AGMCORE_graphicsave nd /AGMCORE_c 0 def /AGMCORE_m 0 def /AGMCORE_y 0 def /AGMCORE_k 0 def /AGMCORE_cmykbuf 4 array def /AGMCORE_screen [currentscreen] cvx def /AGMCORE_tmp 0 def /AGMCORE_&setgray nd /AGMCORE_&setcolor nd /AGMCORE_&setcolorspace nd /AGMCORE_&setcmykcolor nd /AGMCORE_cyan_plate nd /AGMCORE_magenta_plate nd /AGMCORE_yellow_plate nd /AGMCORE_black_plate nd /AGMCORE_plate_ndx nd /AGMCORE_get_ink_data nd /AGMCORE_is_cmyk_sep nd /AGMCORE_host_sep nd /AGMCORE_avoid_L2_sep_space nd /AGMCORE_distilling nd /AGMCORE_composite_job nd /AGMCORE_producing_seps nd /AGMCORE_ps_level -1 def /AGMCORE_ps_version -1 def /AGMCORE_environ_ok nd /AGMCORE_CSD_cache 0 dict def /AGMCORE_currentoverprint false def /AGMCORE_deltaX nd /AGMCORE_deltaY nd /AGMCORE_name nd /AGMCORE_sep_special nd /AGMCORE_err_strings 4 dict def /AGMCORE_cur_err nd /AGMCORE_current_spot_alias false def /AGMCORE_inverting false def /AGMCORE_feature_dictCount nd /AGMCORE_feature_opCount nd /AGMCORE_feature_ctm nd /AGMCORE_ConvertToProcess false def /AGMCORE_Default_CTM matrix def /AGMCORE_Default_PageSize nd /AGMCORE_currentbg nd /AGMCORE_currentucr nd /AGMCORE_in_pattern false def /AGMCORE_currentpagedevice nd /knockout_unitsq nd currentglobal true setglobal [/CSA /Gradient /Procedure] { /Generic /Category findresource dup length dict copy /Category defineresource pop } forall setglobal /AGMCORE_key_known { where{ /Adobe_AGM_Core_Id known }{ false }ifelse }ndf /flushinput { save 2 dict begin /CompareBuffer 3 -1 roll def /readbuffer 256 string def mark { currentfile readbuffer {readline} stopped {cleartomark mark} { not {pop exit} if CompareBuffer eq {exit} if }ifelse }loop cleartomark end restore }bdf /getspotfunction { AGMCORE_screen exch pop exch pop dup type /dicttype eq{ dup /HalftoneType get 1 eq{ /SpotFunction get }{ dup /HalftoneType get 2 eq{ /GraySpotFunction get }{ pop { abs exch abs 2 copy add 1 gt{ 1 sub dup mul exch 1 sub dup mul add 1 sub }{ dup mul exch dup mul add 1 exch sub }ifelse }bind }ifelse }ifelse }if } def /clp_npth { clip newpath } def /eoclp_npth { eoclip newpath } def /npth_clp { newpath clip } def /graphic_setup { /AGMCORE_graphicsave save def concat 0 setgray 0 setlinecap 0 setlinejoin 1 setlinewidth [] 0 setdash 10 setmiterlimit newpath false setoverprint false setstrokeadjust //Adobe_AGM_Core/spot_alias get exec /Adobe_AGM_Image where { pop Adobe_AGM_Image/spot_alias 2 copy known{ get exec }{ pop pop }ifelse } if 100 dict begin /dictstackcount countdictstack def /showpage {} def mark } def /graphic_cleanup { cleartomark dictstackcount 1 countdictstack 1 sub {end}for end AGMCORE_graphicsave restore } def /compose_error_msg { grestoreall initgraphics /Helvetica findfont 10 scalefont setfont /AGMCORE_deltaY 100 def /AGMCORE_deltaX 310 def clippath pathbbox newpath pop pop 36 add exch 36 add exch moveto 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath 0 AGMCORE_&setgray gsave 1 AGMCORE_&setgray fill grestore 1 setlinewidth gsave stroke grestore currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto /AGMCORE_deltaY 12 def /AGMCORE_tmp 0 def AGMCORE_err_strings exch get { dup 32 eq { pop AGMCORE_str256 0 AGMCORE_tmp getinterval stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt { currentpoint AGMCORE_deltaY sub exch pop clippath pathbbox pop pop pop 44 add exch moveto } if AGMCORE_str256 0 AGMCORE_tmp getinterval show ( ) show 0 1 AGMCORE_str256 length 1 sub { AGMCORE_str256 exch 0 put }for /AGMCORE_tmp 0 def } { AGMCORE_str256 exch AGMCORE_tmp xpt /AGMCORE_tmp AGMCORE_tmp 1 add def } ifelse } forall } bdf /doc_setup{ Adobe_AGM_Core begin /AGMCORE_ps_version xdf /AGMCORE_ps_level xdf errordict /AGM_handleerror known not{ errordict /AGM_handleerror errordict /handleerror get put errordict /handleerror { Adobe_AGM_Core begin $error /newerror get AGMCORE_cur_err null ne and{ $error /newerror false put AGMCORE_cur_err compose_error_msg }if $error /newerror true put end errordict /AGM_handleerror get exec } bind put }if /AGMCORE_environ_ok ps_level AGMCORE_ps_level ge ps_version AGMCORE_ps_version ge and AGMCORE_ps_level -1 eq or def AGMCORE_environ_ok not {/AGMCORE_cur_err /AGMCORE_bad_environ def} if /AGMCORE_&setgray systemdict/setgray get def level2{ /AGMCORE_&setcolor systemdict/setcolor get def /AGMCORE_&setcolorspace systemdict/setcolorspace get def }if /AGMCORE_currentbg currentblackgeneration def /AGMCORE_currentucr currentundercolorremoval def /AGMCORE_distilling /product where{ pop systemdict/setdistillerparams known product (Adobe PostScript Parser) ne and }{ false }ifelse def /AGMCORE_GSTATE AGMCORE_key_known not{ /AGMCORE_GSTATE 21 dict def /AGMCORE_tmpmatrix matrix def /AGMCORE_gstack 32 array def /AGMCORE_gstackptr 0 def /AGMCORE_gstacksaveptr 0 def /AGMCORE_gstackframekeys 10 def /AGMCORE_&gsave /gsave ldf /AGMCORE_&grestore /grestore ldf /AGMCORE_&grestoreall /grestoreall ldf /AGMCORE_&save /save ldf /AGMCORE_&setoverprint /setoverprint ldf /AGMCORE_gdictcopy { begin { def } forall end }def /AGMCORE_gput { AGMCORE_gstack AGMCORE_gstackptr get 3 1 roll put }def /AGMCORE_gget { AGMCORE_gstack AGMCORE_gstackptr get exch get }def /gsave { AGMCORE_&gsave AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if /AGMCORE_gstackptr exch store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /grestore { AGMCORE_&grestore AGMCORE_gstackptr 1 sub dup AGMCORE_gstacksaveptr lt {1 add} if dup AGMCORE_gstack exch get dup /AGMCORE_currentoverprint known {/AGMCORE_currentoverprint get setoverprint}{pop}ifelse /AGMCORE_gstackptr exch store }def /grestoreall { AGMCORE_&grestoreall /AGMCORE_gstackptr AGMCORE_gstacksaveptr store }def /save { AGMCORE_&save AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if /AGMCORE_gstackptr exch store /AGMCORE_gstacksaveptr AGMCORE_gstackptr store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /setoverprint{ dup /AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint }def 0 1 AGMCORE_gstack length 1 sub { AGMCORE_gstack exch AGMCORE_gstackframekeys dict put } for }if level3 /AGMCORE_&sysshfill AGMCORE_key_known not and { /AGMCORE_&sysshfill systemdict/shfill get def /AGMCORE_&sysmakepattern systemdict/makepattern get def /AGMCORE_&usrmakepattern /makepattern load def }if /currentcmykcolor [0 0 0 0] AGMCORE_gput /currentstrokeadjust false AGMCORE_gput /currentcolorspace [/DeviceGray] AGMCORE_gput /sep_tint 0 AGMCORE_gput /devicen_tints [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] AGMCORE_gput /sep_colorspace_dict null AGMCORE_gput /devicen_colorspace_dict null AGMCORE_gput /indexed_colorspace_dict null AGMCORE_gput /currentcolor_intent () AGMCORE_gput /customcolor_tint 1 AGMCORE_gput << /MaxPatternItem currentsystemparams /MaxPatternCache get >> setuserparams end }def /page_setup { /setcmykcolor where{ pop Adobe_AGM_Core/AGMCORE_&setcmykcolor /setcmykcolor load put }if Adobe_AGM_Core begin /setcmykcolor { 4 copy AGMCORE_cmykbuf astore /currentcmykcolor exch AGMCORE_gput 1 sub 4 1 roll 3 { 3 index add neg dup 0 lt { pop 0 } if 3 1 roll } repeat setrgbcolor pop }ndf /currentcmykcolor { /currentcmykcolor AGMCORE_gget aload pop }ndf /setoverprint { pop }ndf /currentoverprint { false }ndf /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def /AGMCORE_plate_ndx AGMCORE_cyan_plate{ 0 }{ AGMCORE_magenta_plate{ 1 }{ AGMCORE_yellow_plate{ 2 }{ AGMCORE_black_plate{ 3 }{ 4 }ifelse }ifelse }ifelse }ifelse def /AGMCORE_have_reported_unsupported_color_space false def /AGMCORE_report_unsupported_color_space { AGMCORE_have_reported_unsupported_color_space false eq { (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.) == Adobe_AGM_Core /AGMCORE_have_reported_unsupported_color_space true ddf } if }def /AGMCORE_composite_job AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def /AGMCORE_in_rip_sep /AGMCORE_in_rip_sep where{ pop AGMCORE_in_rip_sep }{ AGMCORE_distilling { false }{ userdict/Adobe_AGM_OnHost_Seps known{ false }{ level2{ currentpagedevice/Separations 2 copy known{ get }{ pop pop false }ifelse }{ false }ifelse }ifelse }ifelse }ifelse def /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def /AGM_preserve_spots /AGM_preserve_spots where{ pop AGM_preserve_spots }{ AGMCORE_distilling AGMCORE_producing_seps or }ifelse def /AGM_is_distiller_preserving_spotimages { currentdistillerparams/PreserveOverprintSettings known { currentdistillerparams/PreserveOverprintSettings get { currentdistillerparams/ColorConversionStrategy known { currentdistillerparams/ColorConversionStrategy get /sRGB ne }{ true }ifelse }{ false }ifelse }{ false }ifelse }def /convert_spot_to_process where {pop}{ /convert_spot_to_process { //Adobe_AGM_Core begin dup map_alias { /Name get exch pop } if dup dup (None) eq exch (All) eq or { pop false }{ AGMCORE_host_sep { gsave 1 0 0 0 setcmykcolor currentgray 1 exch sub 0 1 0 0 setcmykcolor currentgray 1 exch sub 0 0 1 0 setcmykcolor currentgray 1 exch sub 0 0 0 1 setcmykcolor currentgray 1 exch sub add add add 0 eq { pop false }{ false setoverprint current_spot_alias false set_spot_alias 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor set_spot_alias currentgray 1 ne }ifelse grestore }{ AGMCORE_distilling { pop AGM_is_distiller_preserving_spotimages not }{ //Adobe_AGM_Core/AGMCORE_name xddf false //Adobe_AGM_Core/AGMCORE_in_pattern known {//Adobe_AGM_Core/AGMCORE_in_pattern get}{false} ifelse not AGMCORE_currentpagedevice/OverrideSeparations known and { AGMCORE_currentpagedevice/OverrideSeparations get { /HqnSpots /ProcSet resourcestatus { pop pop pop true }if }if }if { AGMCORE_name /HqnSpots /ProcSet findresource /TestSpot get exec not }{ gsave [/Separation AGMCORE_name /DeviceGray {}]AGMCORE_&setcolorspace false AGMCORE_currentpagedevice/SeparationColorNames 2 copy known { get { AGMCORE_name eq or}forall not }{ pop pop pop true }ifelse grestore }ifelse }ifelse }ifelse }ifelse end }def }ifelse /convert_to_process where {pop}{ /convert_to_process { dup length 0 eq { pop false }{ AGMCORE_host_sep { dup true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process and}ifelse } forall { true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch (Black) eq or and }forall not }{pop false}ifelse }{ false exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process or}ifelse } forall }ifelse }ifelse }def }ifelse /AGMCORE_avoid_L2_sep_space version cvr 2012 lt level2 and AGMCORE_producing_seps not and def /AGMCORE_is_cmyk_sep AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or def /AGM_avoid_0_cmyk where{ pop AGM_avoid_0_cmyk }{ AGM_preserve_spots userdict/Adobe_AGM_OnHost_Seps known userdict/Adobe_AGM_InRip_Seps known or not and }ifelse { /setcmykcolor[ { 4 copy add add add 0 eq currentoverprint and{ pop 0.0005 }if }/exec cvx /AGMCORE_&setcmykcolor load dup type/operatortype ne{ /exec cvx }if ]cvx def }if /AGMCORE_IsSeparationAProcessColor { dup (Cyan) eq exch dup (Magenta) eq exch dup (Yellow) eq exch (Black) eq or or or }def AGMCORE_host_sep{ /setcolortransfer { AGMCORE_cyan_plate{ pop pop pop }{ AGMCORE_magenta_plate{ 4 3 roll pop pop pop }{ AGMCORE_yellow_plate{ 4 2 roll pop pop pop }{ 4 1 roll pop pop pop }ifelse }ifelse }ifelse settransfer } def /AGMCORE_get_ink_data AGMCORE_cyan_plate{ {pop pop pop} }{ AGMCORE_magenta_plate{ {4 3 roll pop pop pop} }{ AGMCORE_yellow_plate{ {4 2 roll pop pop pop} }{ {4 1 roll pop pop pop} }ifelse }ifelse }ifelse def /AGMCORE_RemoveProcessColorNames { 1 dict begin /filtername { dup /Cyan eq 1 index (Cyan) eq or {pop (_cyan_)}if dup /Magenta eq 1 index (Magenta) eq or {pop (_magenta_)}if dup /Yellow eq 1 index (Yellow) eq or {pop (_yellow_)}if dup /Black eq 1 index (Black) eq or {pop (_black_)}if }def dup type /arraytype eq {[exch {filtername}forall]} {filtername}ifelse end }def level3 { /AGMCORE_IsCurrentColor { dup AGMCORE_IsSeparationAProcessColor { AGMCORE_plate_ndx 0 eq {dup (Cyan) eq exch /Cyan eq or}if AGMCORE_plate_ndx 1 eq {dup (Magenta) eq exch /Magenta eq or}if AGMCORE_plate_ndx 2 eq {dup (Yellow) eq exch /Yellow eq or}if AGMCORE_plate_ndx 3 eq {dup (Black) eq exch /Black eq or}if AGMCORE_plate_ndx 4 eq {pop false}if }{ gsave false setoverprint current_spot_alias false set_spot_alias 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor set_spot_alias currentgray 1 ne grestore }ifelse }def /AGMCORE_filter_functiondatasource { 5 dict begin /data_in xdf data_in type /stringtype eq { /ncomp xdf /comp xdf /string_out data_in length ncomp idiv string def 0 ncomp data_in length 1 sub { string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put }for string_out }{ string /string_in xdf /string_out 1 string def /component xdf [ data_in string_in /readstring cvx [component /get cvx 255 /exch cvx /sub cvx string_out /exch cvx 0 /exch cvx /put cvx string_out]cvx [/pop cvx ()]cvx /ifelse cvx ]cvx /ReusableStreamDecode filter }ifelse end }def /AGMCORE_separateShadingFunction { 2 dict begin /paint? xdf /channel xdf dup type /dicttype eq { begin FunctionType 0 eq { /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def currentdict /Decode known {/Decode Decode channel 2 mul 2 getinterval def}if paint? not {/Decode [1 1]def}if }if FunctionType 2 eq { paint? { /C0 [C0 channel get 1 exch sub] def /C1 [C1 channel get 1 exch sub] def }{ /C0 [1] def /C1 [1] def }ifelse }if FunctionType 3 eq { /Functions [Functions {channel paint? AGMCORE_separateShadingFunction} forall] def }if currentdict /Range known {/Range [0 1] def}if currentdict end}{ channel get 0 paint? AGMCORE_separateShadingFunction }ifelse end }def /AGMCORE_separateShading { 3 -1 roll begin currentdict /Function known { currentdict /Background known {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if Function 3 1 roll AGMCORE_separateShadingFunction /Function xdf /ColorSpace [/DeviceGray] def }{ ColorSpace dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def }{ ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put }ifelse ColorSpace 0 get /Separation eq { { [1 /exch cvx /sub cvx]cvx }{ [/pop cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll put pop }{ { [exch ColorSpace 1 get length 1 sub exch sub /index cvx 1 /exch cvx /sub cvx ColorSpace 1 get length 1 add 1 /roll cvx ColorSpace 1 get length{/pop cvx} repeat]cvx }{ pop [ColorSpace 1 get length {/pop cvx} repeat cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll bind put }ifelse ColorSpace 2 /DeviceGray put }ifelse end }def /AGMCORE_separateShadingDict { dup /ColorSpace get dup type /arraytype ne {[exch]}if dup 0 get /DeviceCMYK eq { exch begin currentdict AGMCORE_cyan_plate {0 true}if AGMCORE_magenta_plate {1 true}if AGMCORE_yellow_plate {2 true}if AGMCORE_black_plate {3 true}if AGMCORE_plate_ndx 4 eq {0 false}if dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading currentdict end exch }if dup 0 get /Separation eq { exch begin ColorSpace 1 get dup /None ne exch /All ne and { ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /Separation ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading }if }ifelse }{ currentdict ColorSpace 1 get AGMCORE_IsCurrentColor 0 exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse }if currentdict end exch }if dup 0 get /DeviceN eq { exch begin ColorSpace 1 get convert_to_process { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /DeviceN ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading /ColorSpace [/DeviceGray] def }if }ifelse }{ currentdict false -1 ColorSpace 1 get { AGMCORE_IsCurrentColor { 1 add exch pop true exch exit }if 1 add }forall exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse currentdict end exch }if dup 0 get dup /DeviceCMYK eq exch dup /Separation eq exch /DeviceN eq or or not { exch begin ColorSpace dup type /arraytype eq {0 get}if /DeviceGray ne { AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { ColorSpace 0 get /CIEBasedA eq { /ColorSpace [/Separation /_ciebaseda_ /DeviceGray {}] def }if ColorSpace 0 get dup /CIEBasedABC eq exch dup /CIEBasedDEF eq exch /DeviceRGB eq or or { /ColorSpace [/DeviceN [/_red_ /_green_ /_blue_] /DeviceRGB {}] def }if ColorSpace 0 get /CIEBasedDEFG eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def }if currentdict 0 false AGMCORE_separateShading }if }if currentdict end exch }if pop dup /AGMCORE_ignoreshade known { begin /ColorSpace [/Separation (None) /DeviceGray {}] def currentdict end }if }def /shfill { AGMCORE_separateShadingDict dup /AGMCORE_ignoreshade known {pop} {AGMCORE_&sysshfill}ifelse }def /makepattern { exch dup /PatternType get 2 eq { clonedict begin /Shading Shading AGMCORE_separateShadingDict def Shading /AGMCORE_ignoreshade known currentdict end exch {pop <>}if exch AGMCORE_&sysmakepattern }{ exch AGMCORE_&usrmakepattern }ifelse }def }if }if AGMCORE_in_rip_sep{ /setcustomcolor { exch aload pop dup 7 1 roll inRip_spot_has_ink not { 4 {4 index mul 4 1 roll} repeat /DeviceCMYK setcolorspace 6 -2 roll pop pop }{ //Adobe_AGM_Core begin /AGMCORE_k xdf /AGMCORE_y xdf /AGMCORE_m xdf /AGMCORE_c xdf end [/Separation 4 -1 roll /DeviceCMYK {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} ] setcolorspace }ifelse setcolor }ndf /setseparationgray { [/Separation (All) /DeviceGray {}] setcolorspace_opt 1 exch sub setcolor }ndf }{ /setseparationgray { AGMCORE_&setgray }ndf }ifelse /findcmykcustomcolor { 5 makereadonlyarray }ndf /setcustomcolor { exch aload pop pop 4 {4 index mul 4 1 roll} repeat setcmykcolor pop }ndf /has_color /colorimage where{ AGMCORE_producing_seps{ pop true }{ systemdict eq }ifelse }{ false }ifelse def /map_index { 1 index mul exch getinterval {255 div} forall } bdf /map_indexed_devn { Lookup Names length 3 -1 roll cvi map_index } bdf /n_color_components { base_colorspace_type dup /DeviceGray eq{ pop 1 }{ /DeviceCMYK eq{ 4 }{ 3 }ifelse }ifelse }bdf level2{ /mo /moveto ldf /li /lineto ldf /cv /curveto ldf /knockout_unitsq { 1 setgray 0 0 1 1 rectfill }def level2 /setcolorspace AGMCORE_key_known not and{ /AGMCORE_&&&setcolorspace /setcolorspace ldf /AGMCORE_ReplaceMappedColor { dup type dup /arraytype eq exch /packedarraytype eq or { /AGMCORE_SpotAliasAry2 where { begin dup 0 get dup /Separation eq { pop dup length array copy dup dup 1 get current_spot_alias { dup map_alias { false set_spot_alias dup 1 exch setsepcolorspace true set_spot_alias begin /sep_colorspace_dict currentdict AGMCORE_gput pop pop pop [ /Separation Name CSA map_csa MappedCSA /sep_colorspace_proc load ] dup Name end }if }if map_reserved_ink_name 1 xpt }{ /DeviceN eq { dup length array copy dup dup 1 get [ exch { current_spot_alias{ dup map_alias{ /Name get exch pop }if }if map_reserved_ink_name } forall ] 1 xpt }if }ifelse end } if }if }def /setcolorspace { dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /Indexed eq { AGMCORE_distilling { /PhotoshopDuotoneList where { pop false }{ true }ifelse }{ true }ifelse { aload pop 3 -1 roll AGMCORE_ReplaceMappedColor 3 1 roll 4 array astore }if }{ AGMCORE_ReplaceMappedColor }ifelse }if DeviceN_PS2_inRip_seps {AGMCORE_&&&setcolorspace} if }def }if }{ /adj { currentstrokeadjust{ transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }if }def /mo{ adj moveto }def /li{ adj lineto }def /cv{ 6 2 roll adj 6 2 roll adj 6 2 roll adj curveto }def /knockout_unitsq { 1 setgray 8 8 1 [8 0 0 8 0 0] {} image }def /currentstrokeadjust{ /currentstrokeadjust AGMCORE_gget }def /setstrokeadjust{ /currentstrokeadjust exch AGMCORE_gput }def /setcolorspace { /currentcolorspace exch AGMCORE_gput } def /currentcolorspace { /currentcolorspace AGMCORE_gget } def /setcolor_devicecolor { base_colorspace_type dup /DeviceGray eq{ pop setgray }{ /DeviceCMYK eq{ setcmykcolor }{ setrgbcolor }ifelse }ifelse }def /setcolor { currentcolorspace 0 get dup /DeviceGray ne{ dup /DeviceCMYK ne{ dup /DeviceRGB ne{ dup /Separation eq{ pop currentcolorspace 3 get exec currentcolorspace 2 get }{ dup /Indexed eq{ pop currentcolorspace 3 get dup type /stringtype eq{ currentcolorspace 1 get n_color_components 3 -1 roll map_index }{ exec }ifelse currentcolorspace 1 get }{ /AGMCORE_cur_err /AGMCORE_invalid_color_space def AGMCORE_invalid_color_space }ifelse }ifelse }if }if }if setcolor_devicecolor } def }ifelse /sop /setoverprint ldf /lw /setlinewidth ldf /lc /setlinecap ldf /lj /setlinejoin ldf /ml /setmiterlimit ldf /dsh /setdash ldf /sadj /setstrokeadjust ldf /gry /setgray ldf /rgb /setrgbcolor ldf /cmyk /setcmykcolor ldf /sep /setsepcolor ldf /devn /setdevicencolor ldf /idx /setindexedcolor ldf /colr /setcolor ldf /csacrd /set_csa_crd ldf /sepcs /setsepcolorspace ldf /devncs /setdevicencolorspace ldf /idxcs /setindexedcolorspace ldf /cp /closepath ldf /clp /clp_npth ldf /eclp /eoclp_npth ldf /f /fill ldf /ef /eofill ldf /@ /stroke ldf /nclp /npth_clp ldf /gset /graphic_setup ldf /gcln /graphic_cleanup ldf /AGMCORE_def_ht currenthalftone def /clonedict Adobe_AGM_Utils begin /clonedict load end def /clonearray Adobe_AGM_Utils begin /clonearray load end def currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and { bind }if def }forall /getrampcolor { /indx exch def 0 1 NumComp 1 sub { dup Samples exch get dup type /stringtype eq {indx get} if exch Scaling exch get aload pop 3 1 roll mul add } for ColorSpaceFamily /Separation eq {sep} { ColorSpaceFamily /DeviceN eq {devn} {setcolor}ifelse }ifelse } bdf /sssetbackground {aload pop setcolor} bdf /RadialShade { 40 dict begin /ColorSpaceFamily xdf /background xdf /ext1 xdf /ext0 xdf /BBox xdf /r2 xdf /c2y xdf /c2x xdf /r1 xdf /c1y xdf /c1x xdf /rampdict xdf /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if c1x c2x eq { c1y c2y lt {/theta 90 def}{/theta 270 def} ifelse } { /slope c2y c1y sub c2x c1x sub div def /theta slope 1 atan def c2x c1x lt c2y c1y ge and { /theta theta 180 sub def} if c2x c1x lt c2y c1y lt and { /theta theta 180 add def} if } ifelse gsave clippath c1x c1y translate theta rotate -90 rotate { pathbbox } stopped { 0 0 0 0 } if /yMax xdf /xMax xdf /yMin xdf /xMin xdf grestore xMax xMin eq yMax yMin eq or { grestore end } { /max { 2 copy gt { pop } {exch pop} ifelse } bdf /min { 2 copy lt { pop } {exch pop} ifelse } bdf rampdict begin 40 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave c1x c1y translate theta rotate -90 rotate /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def /c1y 0 def /c1x 0 def /c2x 0 def ext0 { 0 getrampcolor c2y r2 add r1 sub 0.0001 lt { c1x c1y r1 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2y r1 add r2 le { c1x c1y r1 0 360 arc fill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r1 neg def /p1y c1y def /p2x r1 def /p2y c1y def p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto fill } { /AA r2 r1 sub c2y div def AA -1 eq { /theta 89.99 def} { /theta AA 1 AA dup mul sub sqrt div 1 atan def} ifelse /SS1 90 theta add dup sin exch cos div def /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y p1x SS1 div neg def /SS2 90 theta sub dup sin exch cos div def /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y p2x SS2 div neg def r1 r2 gt { /L1maxX p1x yMin p1y sub SS1 div add def /L2maxX p2x yMin p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def } ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if c1x c2x sub dup mul c1y c2y sub dup mul add 0.5 exp 0 dtransform dup mul exch dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop /hires xdf hires mul /numpix xdf /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if /xInc c2x c1x sub numsteps div def /yInc c2y c1y sub numsteps div def /rInc r2 r1 sub numsteps div def /cx c1x def /cy c1y def /radius r1 def newpath xInc 0 eq yInc 0 eq rInc 0 eq and and { 0 getrampcolor cx cy radius 0 360 arc stroke NumSamples 1 sub getrampcolor cx cy radius 72 hires div add 0 360 arc 0 setlinewidth stroke } { 0 numsteps { dup subsampling { round cvi } if getrampcolor cx cy radius 0 360 arc /cx cx xInc add def /cy cy yInc add def /radius radius rInc add def cx cy radius 360 0 arcn eofill rampIndxInc add } repeat pop } ifelse ext1 { c2y r2 add r1 lt { c2x c2y r2 0 360 arc fill } { c2y r1 add r2 sub 0.0001 le { c2x c2y r2 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r2 neg def /p1y c2y def /p2x r2 def /p2y c2y def p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto fill } { /AA r2 r1 sub c2y div def AA -1 eq { /theta 89.99 def} { /theta AA 1 AA dup mul sub sqrt div 1 atan def} ifelse /SS1 90 theta add dup sin exch cos div def /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y c2y p1x SS1 div sub def /SS2 90 theta sub dup sin exch cos div def /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y c2y p2x SS2 div sub def r1 r2 lt { /L1maxX p1x yMax p1y sub SS1 div add def /L2maxX p2x yMax p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def }ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if grestore grestore end end end } ifelse } bdf /GenStrips { 40 dict begin /ColorSpaceFamily xdf /background xdf /ext1 xdf /ext0 xdf /BBox xdf /y2 xdf /x2 xdf /y1 xdf /x1 xdf /rampdict xdf /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if x1 x2 eq { y1 y2 lt {/theta 90 def}{/theta 270 def} ifelse } { /slope y2 y1 sub x2 x1 sub div def /theta slope 1 atan def x2 x1 lt y2 y1 ge and { /theta theta 180 sub def} if x2 x1 lt y2 y1 lt and { /theta theta 180 add def} if } ifelse gsave clippath x1 y1 translate theta rotate { pathbbox } stopped { 0 0 0 0 } if /yMax exch def /xMax exch def /yMin exch def /xMin exch def grestore xMax xMin eq yMax yMin eq or { grestore end } { rampdict begin 20 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave x1 y1 translate theta rotate /xStart 0 def /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def /ySpan yMax yMin sub def /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def xStart 0 transform xEnd 0 transform 3 -1 roll sub dup mul 3 1 roll sub dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop mul /numpix xdf numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if ext0 { 0 getrampcolor xMin xStart lt { xMin yMin xMin neg ySpan rectfill } if } if /xInc xEnd xStart sub numsteps div def /x xStart def 0 numsteps { dup subsampling { round cvi } if getrampcolor x yMin xInc ySpan rectfill /x x xInc add def rampIndxInc add } repeat pop ext1 { xMax xEnd gt { xEnd yMin xMax xEnd sub ySpan rectfill } if } if grestore grestore end end end } ifelse } bdf }def /page_trailer { end }def /doc_trailer{ }def /capture_currentpagedevice { //Adobe_AGM_Core/AGMCORE_currentpagedevice currentpagedevice ddf } def systemdict /findcolorrendering known{ /findcolorrendering systemdict /findcolorrendering get def }if systemdict /setcolorrendering known{ /setcolorrendering systemdict /setcolorrendering get def }if /test_cmyk_color_plate { gsave setcmykcolor currentgray 1 ne grestore }def /inRip_spot_has_ink { dup //Adobe_AGM_Core/AGMCORE_name xddf convert_spot_to_process not }def /map255_to_range { 1 index sub 3 -1 roll 255 div mul add }def /set_csa_crd { /sep_colorspace_dict null AGMCORE_gput begin CSA get_csa_by_name setcolorspace_opt set_crd end } def /map_csa { currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse {pop}{get_csa_by_name /MappedCSA xdf}ifelse } def /setsepcolor { /sep_colorspace_dict AGMCORE_gget begin dup /sep_tint exch AGMCORE_gput TintProc end } def /setdevicencolor { /devicen_colorspace_dict AGMCORE_gget begin Names length copy Names length 1 sub -1 0 { /devicen_tints AGMCORE_gget 3 1 roll xpt } for TintProc end } def /sep_colorspace_proc { /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin currentdict/Components known{ Components aload pop TintMethod/Lab eq{ 2 {AGMCORE_tmp mul NComponents 1 roll} repeat LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll }{ TintMethod/Subtractive eq{ NComponents{ AGMCORE_tmp mul NComponents 1 roll }repeat }{ NComponents{ 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll } repeat }ifelse }ifelse }{ ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get aload pop }ifelse end } def /sep_colorspace_gray_proc { /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get end } def /sep_proc_name { dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or level2 not and has_color not and{ pop [/DeviceGray] /sep_colorspace_gray_proc }{ /sep_colorspace_proc }ifelse } def /setsepcolorspace { current_spot_alias{ dup begin Name map_alias{ exch pop }if end }if dup /sep_colorspace_dict exch AGMCORE_gput begin CSA map_csa /AGMCORE_sep_special Name dup () eq exch (All) eq or store AGMCORE_avoid_L2_sep_space{ [/Indexed MappedCSA sep_proc_name 255 exch { 255 div } /exec cvx 3 -1 roll [ 4 1 roll load /exec cvx ] cvx ] setcolorspace_opt /TintProc { 255 mul round cvi setcolor }bdf }{ MappedCSA 0 get /DeviceCMYK eq currentdict/Components known and AGMCORE_sep_special not and{ /TintProc [ Components aload pop Name findcmykcustomcolor /exch cvx /setcustomcolor cvx ] cvx bdf }{ AGMCORE_host_sep Name (All) eq and{ /TintProc { 1 exch sub setseparationgray }bdf }{ AGMCORE_in_rip_sep MappedCSA 0 get /DeviceCMYK eq and AGMCORE_host_sep or Name () eq and{ /TintProc [ MappedCSA sep_proc_name exch 0 get /DeviceCMYK eq{ cvx /setcmykcolor cvx }{ cvx /setgray cvx }ifelse ] cvx bdf }{ AGMCORE_producing_seps MappedCSA 0 get dup /DeviceCMYK eq exch /DeviceGray eq or and AGMCORE_sep_special not and{ /TintProc [ /dup cvx MappedCSA sep_proc_name cvx exch 0 get /DeviceGray eq{ 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx }if /Name cvx /findcmykcustomcolor cvx /exch cvx AGMCORE_host_sep{ AGMCORE_is_cmyk_sep /Name cvx /AGMCORE_IsSeparationAProcessColor load /exec cvx /not cvx /and cvx }{ Name inRip_spot_has_ink not }ifelse [ /pop cvx 1 ] cvx /if cvx /setcustomcolor cvx ] cvx bdf }{ /TintProc {setcolor} bdf [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt }ifelse }ifelse }ifelse }ifelse }ifelse set_crd setsepcolor end } def /additive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 0 1 numarrays 1 sub { 1 exch add /index cvx c1 /get cvx /mul cvx }for numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /subtractive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 1 0 1 numarrays 1 sub { 1 3 3 -1 roll add /index cvx c1 /get cvx /sub cvx /mul cvx }for /sub cvx numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /exec_tint_transform { /TintProc [ /TintTransform cvx /setcolor cvx ] cvx bdf MappedCSA setcolorspace_opt } bdf /devn_makecustomcolor { 2 dict begin /names_index xdf /Names xdf 1 1 1 1 Names names_index get findcmykcustomcolor /devicen_tints AGMCORE_gget names_index get setcustomcolor Names length {pop} repeat end } bdf /setdevicencolorspace { dup /AliasedColorants known {false}{true}ifelse current_spot_alias and { 7 dict begin /names_index 0 def dup /names_len exch /Names get length def /new_names names_len array def /new_LookupTables names_len array def /alias_cnt 0 def dup /Names get { dup map_alias { exch pop dup /ColorLookup known { dup begin new_LookupTables names_index ColorLookup put end }{ dup /Components known { dup begin new_LookupTables names_index Components put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse new_names names_index 3 -1 roll /Name get put /alias_cnt alias_cnt 1 add def }{ /name xdf new_names names_index name put dup /LookupTables known { dup begin new_LookupTables names_index LookupTables names_index get put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse /names_index names_index 1 add def } forall alias_cnt 0 gt { /AliasedColorants true def /lut_entry_len new_LookupTables 0 get dup length 256 ge {0 get length}{length}ifelse def 0 1 names_len 1 sub { /names_index xdf new_LookupTables names_index get dup length 256 ge {0 get length}{length}ifelse lut_entry_len ne { /AliasedColorants false def exit } { new_LookupTables names_index get 0 get null eq { dup /Names get names_index get /name xdf name (Cyan) eq name (Magenta) eq name (Yellow) eq name (Black) eq or or or not { /AliasedColorants false def exit } if } if } ifelse } for lut_entry_len 1 eq { /AliasedColorants false def } if AliasedColorants { dup begin /Names new_names def /LookupTables new_LookupTables def /AliasedColorants true def /NComponents lut_entry_len def /TintMethod NComponents 4 eq {/Subtractive}{/Additive}ifelse def /MappedCSA TintMethod /Additive eq {/DeviceRGB}{/DeviceCMYK}ifelse def currentdict /TTTablesIdx known not { /TTTablesIdx -1 def } if end } if }if end } if dup /devicen_colorspace_dict exch AGMCORE_gput begin currentdict /AliasedColorants known { AliasedColorants }{ false } ifelse dup not { CSA map_csa } if /TintTransform load type /nulltype eq or { /TintTransform [ 0 1 Names length 1 sub { /TTTablesIdx TTTablesIdx 1 add def dup LookupTables exch get dup 0 get null eq { 1 index Names exch get dup (Cyan) eq { pop exch LookupTables length exch sub /index cvx 0 0 0 } { dup (Magenta) eq { pop exch LookupTables length exch sub /index cvx 0 /exch cvx 0 0 } { (Yellow) eq { exch LookupTables length exch sub /index cvx 0 0 3 -1 /roll cvx 0 } { exch LookupTables length exch sub /index cvx 0 0 0 4 -1 /roll cvx } ifelse } ifelse } ifelse 5 -1 /roll cvx /astore cvx } { dup length 1 sub LookupTables length 4 -1 roll sub 1 add /index cvx /mul cvx /round cvx /cvi cvx /get cvx } ifelse Names length TTTablesIdx add 1 add 1 /roll cvx } for Names length [/pop cvx] cvx /repeat cvx NComponents Names length TintMethod /Subtractive eq { subtractive_blend } { additive_blend } ifelse ] cvx bdf } if AGMCORE_host_sep { Names convert_to_process { exec_tint_transform } { currentdict /AliasedColorants known { AliasedColorants not }{ false } ifelse 5 dict begin /AvoidAliasedColorants xdf /painted? false def /names_index 0 def /names_len Names length def AvoidAliasedColorants { /currentspotalias current_spot_alias def false set_spot_alias } if Names { AGMCORE_is_cmyk_sep { dup (Cyan) eq AGMCORE_cyan_plate and exch dup (Magenta) eq AGMCORE_magenta_plate and exch dup (Yellow) eq AGMCORE_yellow_plate and exch (Black) eq AGMCORE_black_plate and or or or { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def } if painted? {exit} if }{ 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def exit } if } ifelse /names_index names_index 1 add def } forall AvoidAliasedColorants { currentspotalias set_spot_alias } if painted? { /devicen_colorspace_dict AGMCORE_gget /names_index names_index put }{ /devicen_colorspace_dict AGMCORE_gget /TintProc [ names_len [/pop cvx] cvx /repeat cvx 1 /setseparationgray cvx 0 0 0 0 /setcmykcolor cvx ] cvx ddf } ifelse end } ifelse } { AGMCORE_in_rip_sep { Names convert_to_process not }{ level3 } ifelse { [/DeviceN Names MappedCSA /TintTransform load] setcolorspace_opt /TintProc level3 not AGMCORE_in_rip_sep and { [ Names /length cvx [/pop cvx] cvx /repeat cvx ] cvx bdf }{ {setcolor} bdf } ifelse }{ exec_tint_transform } ifelse } ifelse set_crd /AliasedColorants false def end } def /setindexedcolorspace { dup /indexed_colorspace_dict exch AGMCORE_gput begin currentdict /CSDBase known { CSDBase /CSD get_res begin currentdict /Names known { currentdict devncs }{ 1 currentdict sepcs } ifelse AGMCORE_host_sep{ 4 dict begin /compCnt /Names where {pop Names length}{1}ifelse def /NewLookup HiVal 1 add string def 0 1 HiVal { /tableIndex xdf Lookup dup type /stringtype eq { compCnt tableIndex map_index }{ exec } ifelse /Names where { pop setdevicencolor }{ setsepcolor } ifelse currentgray tableIndex exch HiVal mul cvi NewLookup 3 1 roll put } for [/Indexed currentcolorspace HiVal NewLookup] setcolorspace_opt end }{ level3 { currentdict /Names known { [/Indexed [/DeviceN Names MappedCSA /TintTransform load] HiVal Lookup] setcolorspace_opt }{ [/Indexed [/Separation Name MappedCSA sep_proc_name load] HiVal Lookup] setcolorspace_opt } ifelse }{ [/Indexed MappedCSA HiVal [ currentdict /Names known { Lookup dup type /stringtype eq {/exch cvx CSDBase /CSD get_res /Names get length dup /mul cvx exch /getinterval cvx {255 div} /forall cvx} {/exec cvx}ifelse /TintTransform load /exec cvx }{ Lookup dup type /stringtype eq {/exch cvx /get cvx 255 /div cvx} {/exec cvx}ifelse CSDBase /CSD get_res /MappedCSA get sep_proc_name exch pop /load cvx /exec cvx } ifelse ]cvx ]setcolorspace_opt }ifelse } ifelse end set_crd } { CSA map_csa AGMCORE_host_sep level2 not and{ 0 0 0 0 setcmykcolor }{ [/Indexed MappedCSA level2 not has_color not and{ dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or{ pop [/DeviceGray] }if HiVal GrayLookup }{ HiVal currentdict/RangeArray known{ { /indexed_colorspace_dict AGMCORE_gget begin Lookup exch dup HiVal gt{ pop HiVal }if NComponents mul NComponents getinterval {} forall NComponents 1 sub -1 0{ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range NComponents 1 roll }for end } bind }{ Lookup }ifelse }ifelse ] setcolorspace_opt set_crd }ifelse }ifelse end }def /setindexedcolor { AGMCORE_host_sep { /indexed_colorspace_dict AGMCORE_gget dup /CSDBase known { begin CSDBase /CSD get_res begin currentdict /Names known{ map_indexed_devn devn } { Lookup 1 3 -1 roll map_index sep }ifelse end end }{ /Lookup get 4 3 -1 roll map_index setcmykcolor } ifelse }{ level3 not AGMCORE_in_rip_sep and /indexed_colorspace_dict AGMCORE_gget /CSDBase known and { /indexed_colorspace_dict AGMCORE_gget /CSDBase get /CSD get_res begin map_indexed_devn devn end } { setcolor } ifelse }ifelse } def /ignoreimagedata { currentoverprint not{ gsave dup clonedict begin 1 setgray /Decode [0 1] def /DataSource def /MultipleDataSources false def /BitsPerComponent 8 def currentdict end systemdict /image get exec grestore }if consumeimagedata }def /add_res { dup /CSD eq { pop //Adobe_AGM_Core begin /AGMCORE_CSD_cache load 3 1 roll put end }{ defineresource pop } ifelse }def /del_res { { aload pop exch dup /CSD eq { pop { //Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef }forall }{ exch { 1 index undefineresource }forall pop } ifelse } forall }def /get_res { dup /CSD eq { pop dup type dup /nametype eq exch /stringtype eq or { AGMCORE_CSD_cache exch get } if }{ findresource } ifelse }def /get_csa_by_name { dup type dup /nametype eq exch /stringtype eq or{ /CSA get_res } if }def /pattern_buf_init { /count get 0 0 put } def /pattern_buf_next { dup /count get dup 0 get dup 3 1 roll 1 add 0 xpt get } def /cachepattern_compress { 5 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def /string_size 16000 def /readbuffer string_size string def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal /LZWFilter { exch dup length 0 eq { pop }{ patarray dup length 1 sub 3 -1 roll put } ifelse {string_size}{0}ifelse string } /LZWEncode filter def { ReadFilter readbuffer readstring exch LZWFilter exch writestring not {exit} if } loop LZWFilter closefile patarray end }def /cachepattern { 2 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal { ReadFilter 16000 string readstring exch patarray dup length 1 sub 3 -1 roll put not {exit} if } loop patarray dup dup length 1 sub () put end }def /wrap_paintproc { statusdict /currentfilenameextend known{ clonedict begin /OldPaintProc /PaintProc load def /PaintProc { mark exch dup /OldPaintProc get stopped {closefile restore end} if cleartomark } def end } {pop} ifelse } def /make_pattern { exch clonedict exch dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform exch 3 index /XStep get 1 index exch 2 copy div cvi mul sub sub exch 3 index /YStep get 1 index exch 2 copy div cvi mul sub sub matrix translate exch matrix concatmatrix 1 index begin BBox 0 get XStep div cvi XStep mul /xshift exch neg def BBox 1 get YStep div cvi YStep mul /yshift exch neg def BBox 0 get xshift add BBox 1 get yshift add BBox 2 get xshift add BBox 3 get yshift add 4 array astore /BBox exch def [ xshift yshift /translate load null /exec load ] dup 3 /PaintProc load put cvx /PaintProc exch def end 1 index dup /ID get exch /Pattern add_res gsave 0 setgray makepattern grestore }def /set_pattern { dup /PatternType get 1 eq{ dup /PaintType get 1 eq{ currentoverprint sop [/DeviceGray] setcolorspace 0 setgray }if }if setpattern }def /setcolorspace_opt { dup currentcolorspace eq{ pop }{ setcolorspace }ifelse }def /updatecolorrendering { currentcolorrendering/RenderingIntent known{ currentcolorrendering/RenderingIntent get }{null}ifelse Intent ne { Intent /ColorRendering {findresource} stopped { pop pop systemdict /findcolorrendering known { Intent findcolorrendering pop /ColorRendering findresource true } {false} ifelse } {true} ifelse { dup begin currentdict /TransformPQR known { currentdict /TransformPQR get aload pop 3 {{} eq 3 1 roll} repeat or or } {true} ifelse currentdict /MatrixPQR known { currentdict /MatrixPQR get aload pop 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq and and and and and and and and } {true} ifelse end or { clonedict begin /TransformPQR [ {4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div 3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add} bind {4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div 3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add} bind {4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div 3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add} bind ] def /MatrixPQR [ 0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] def /RangePQR [-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392] def currentdict end } if setcolorrendering_opt } if }if } def /set_crd { AGMCORE_host_sep not level2 and{ currentdict /ColorRendering known{ ColorRendering /ColorRendering {findresource} stopped not {setcolorrendering_opt} if }{ currentdict/Intent known{ updatecolorrendering }if }ifelse currentcolorspace dup type /arraytype eq {0 get}if /DeviceRGB eq { currentdict/UCR known {/UCR}{/AGMCORE_currentucr}ifelse load setundercolorremoval currentdict/BG known {/BG}{/AGMCORE_currentbg}ifelse load setblackgeneration }if }if }def /setcolorrendering_opt { dup currentcolorrendering eq{ pop }{ clonedict begin /Intent Intent def currentdict end setcolorrendering }ifelse }def /cpaint_gcomp { convert_to_process //Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf //Adobe_AGM_Core/AGMCORE_ConvertToProcess get not { (%end_cpaint_gcomp) flushinput }if }def /cpaint_gsep { //Adobe_AGM_Core/AGMCORE_ConvertToProcess get { (%end_cpaint_gsep) flushinput }if }def /cpaint_gend { newpath }def /set_spot_alias_ary { dup inherit_aliases //Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf }def /set_spot_normalization_ary { dup inherit_aliases dup length /AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add} if array //Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf /AGMCORE_SpotAliasAry where{ pop AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval AGMCORE_SpotAliasAry length }{0} ifelse AGMCORE_SpotAliasAry2 3 1 roll exch putinterval true set_spot_alias }def /inherit_aliases { {dup /Name get map_alias {/CSD put}{pop} ifelse} forall }def /set_spot_alias { /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias 3 -1 roll put }{ pop }ifelse }def /current_spot_alias { /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias get }{ false }ifelse }def /map_alias { /AGMCORE_SpotAliasAry2 where{ begin /AGMCORE_name xdf false AGMCORE_SpotAliasAry2{ dup/Name get AGMCORE_name eq{ /CSD get /CSD get_res exch pop true exit }{ pop }ifelse }forall end }{ pop false }ifelse }bdf /spot_alias { true set_spot_alias /AGMCORE_&setcustomcolor AGMCORE_key_known not { //Adobe_AGM_Core/AGMCORE_&setcustomcolor /setcustomcolor load put } if /customcolor_tint 1 AGMCORE_gput //Adobe_AGM_Core begin /setcustomcolor { currentdict/TintProc known currentdict/CSA known and 3 1 roll //Adobe_AGM_Core begin dup /customcolor_tint exch AGMCORE_gput 1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not current_spot_alias and{1 index 4 get map_alias}{false}ifelse { false set_spot_alias 4 -1 roll{ exch pop /sep_tint AGMCORE_gget exch }if mark 3 1 roll setsepcolorspace counttomark 0 ne{ setsepcolor }if pop pop true set_spot_alias }{ AGMCORE_&setcustomcolor pop }ifelse end }bdf end }def /begin_feature { Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if }def /end_feature { 2 dict begin /spd /setpagedevice load def /setpagedevice { get_gstate spd set_gstate } def stopped{$error/newerror false put}if end count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if }def /set_negative { //Adobe_AGM_Core begin /AGMCORE_inverting exch def level2{ currentpagedevice/NegativePrint known{ currentpagedevice/NegativePrint get //Adobe_AGM_Core/AGMCORE_inverting get ne{ true begin_feature true{ << /NegativePrint //Adobe_AGM_Core/AGMCORE_inverting get >> setpagedevice }end_feature }if /AGMCORE_inverting false def }if }if AGMCORE_inverting{ [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer gsave newpath clippath 1 /setseparationgray where{pop setseparationgray}{setgray}ifelse /AGMIRS_&fill where {pop AGMIRS_&fill}{fill} ifelse grestore }if end }def /lw_save_restore_override { /md where { pop md begin initializepage /initializepage{}def /pmSVsetup{} def /endp{}def /pse{}def /psb{}def /orig_showpage where {pop} {/orig_showpage /showpage load def} ifelse /showpage {orig_showpage gR} def end }if }def /pscript_showpage_override { /NTPSOct95 where { begin showpage save /showpage /restore load def /restore {exch pop}def end }if }def /driver_media_override { /md where { pop md /initializepage known { md /initializepage {} put } if md /rC known { md /rC {4{pop}repeat} put } if }if /mysetup where { /mysetup [1 0 0 1 0 0] put }if Adobe_AGM_Core /AGMCORE_Default_CTM matrix currentmatrix put level2 {Adobe_AGM_Core /AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if }def /driver_check_media_override { /PrepsDict where {pop} { Adobe_AGM_Core /AGMCORE_Default_CTM get matrix currentmatrix ne Adobe_AGM_Core /AGMCORE_Default_PageSize get type /arraytype eq { Adobe_AGM_Core /AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and Adobe_AGM_Core /AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and }if { Adobe_AGM_Core /AGMCORE_Default_CTM get setmatrix }if }ifelse }def AGMCORE_err_strings begin /AGMCORE_bad_environ (Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. ) def /AGMCORE_color_space_onhost_seps (This job contains colors that will not separate with on-host methods. ) def /AGMCORE_invalid_color_space (This job contains an invalid color space. ) def end /set_def_ht { AGMCORE_def_ht sethalftone } def end systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_CoolType_Core 2.25 0 %%Copyright: Copyright 1997-2005 Adobe Systems Incorporated. All Rights Reserved. %%Version: 2.25 0 10 dict begin /Adobe_CoolType_Passthru currentdict def /Adobe_CoolType_Core_Defined userdict /Adobe_CoolType_Core known def Adobe_CoolType_Core_Defined { /Adobe_CoolType_Core userdict /Adobe_CoolType_Core get def } if userdict /Adobe_CoolType_Core 60 dict dup begin put /Adobe_CoolType_Version 2.25 def /Level2? systemdict /languagelevel known dup { pop systemdict /languagelevel get 2 ge } if def Level2? not { /currentglobal false def /setglobal /pop load def /gcheck { pop false } bind def /currentpacking false def /setpacking /pop load def /SharedFontDirectory 0 dict def } if currentpacking true setpacking currentglobal false setglobal userdict /Adobe_CoolType_Data 2 copy known not { 2 copy 10 dict put } if get begin /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def end setglobal /@_SaveStackLevels { Adobe_CoolType_Data begin /@vmState currentglobal def false setglobal @opStackCountByLevel @opStackLevel 2 copy known not { 2 copy 3 dict dup /args 7 index 5 add array put put get } { get dup /args get dup length 3 index lt { dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch /args exch put } { pop } ifelse } ifelse begin count 1 sub 1 index lt { pop count } if dup /argCount exch def dup 0 gt { args exch 0 exch getinterval astore pop } { pop } ifelse count /restCount exch def end /@opStackLevel @opStackLevel 1 add def countdictstack 1 sub @dictStackCountByLevel exch @dictStackLevel exch put /@dictStackLevel @dictStackLevel 1 add def @vmState setglobal end } bind def /@_RestoreStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def @opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt { { pop } repeat } { pop } ifelse args 0 argCount getinterval {} forall end /@dictStackLevel @dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end countdictstack exch sub dup 0 gt { { end } repeat } { pop } ifelse } bind def /@_PopStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def /@dictStackLevel @dictStackLevel 1 sub def end } bind def /@Raise { exch cvx exch errordict exch get exec stop } bind def /@ReRaise { cvx $error /errorname get errordict exch get exec stop } bind def /@Stopped { 0 @#Stopped } bind def /@#Stopped { @_SaveStackLevels stopped { @_RestoreStackLevels true } { @_PopStackLevels false } ifelse } bind def /@Arg { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 1 sub get begin args exch argCount 1 sub exch sub get end end } bind def currentglobal true setglobal /CTHasResourceForAllBug Level2? { 1 dict dup /@shouldNotDisappearDictValue true def Adobe_CoolType_Data exch /@shouldNotDisappearDict exch put begin count @_SaveStackLevels { (*) { pop stop } 128 string /Category resourceforall } stopped pop @_RestoreStackLevels currentdict Adobe_CoolType_Data /@shouldNotDisappearDict get ne dup { /@shouldNotDisappearDictValue known { { end currentdict 1 index eq { pop exit } if } loop } if } if end } { false } ifelse def true setglobal /CTHasResourceStatusBug Level2? { mark { /steveamerige /Category resourcestatus } stopped { cleartomark true } { cleartomark currentglobal not } ifelse } { false } ifelse def setglobal /CTResourceStatus { mark 3 1 roll /Category findresource begin ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse end } bind def /CTWorkAroundBugs { Level2? { /cid_PreLoad /ProcSet resourcestatus { pop pop currentglobal mark { (*) { dup /CMap CTHasResourceStatusBug { CTResourceStatus } { resourcestatus } ifelse { pop dup 0 eq exch 1 eq or { dup /CMap findresource gcheck setglobal /CMap undefineresource } { pop CTHasResourceForAllBug { exit } { stop } ifelse } ifelse } { pop } ifelse } 128 string /CMap resourceforall } stopped { cleartomark } stopped pop setglobal } if } if } bind def /doc_setup { Adobe_CoolType_Core begin CTWorkAroundBugs /mov /moveto load def /nfnt /newencodedfont load def /mfnt /makefont load def /sfnt /setfont load def /ufnt /undefinefont load def /chp /charpath load def /awsh /awidthshow load def /wsh /widthshow load def /ash /ashow load def /sh /show load def end currentglobal false setglobal userdict /Adobe_CoolType_Data 2 copy known not { 2 copy 10 dict put } if get begin /AddWidths? false def /CC 0 def /charcode 2 string def /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def /InVMFontsByCMap 10 dict def /InVMDeepCopiedFonts 10 dict def end setglobal } bind def /doc_trailer { currentdict Adobe_CoolType_Core eq { end } if } bind def /page_setup { Adobe_CoolType_Core begin } bind def /page_trailer { end } bind def /unload { systemdict /languagelevel known { systemdict/languagelevel get 2 ge { userdict/Adobe_CoolType_Core 2 copy known { undef } { pop pop } ifelse } if } if } bind def /ndf { 1 index where { pop pop pop } { dup xcheck { bind } if def } ifelse } def /findfont systemdict begin userdict begin /globaldict where { /globaldict get begin } if dup where pop exch get /globaldict where { pop end } if end end Adobe_CoolType_Core_Defined { /systemfindfont exch def } { /findfont 1 index def /systemfindfont exch def } ifelse /undefinefont { pop } ndf /copyfont { currentglobal 3 1 roll 1 index gcheck setglobal dup null eq { 0 } { dup length } ifelse 2 index length add 1 add dict begin exch { 1 index /FID eq { pop pop } { def } ifelse } forall dup null eq { pop } { { def } forall } ifelse currentdict end exch setglobal } bind def /copyarray { currentglobal exch dup gcheck setglobal dup length array copy exch setglobal } bind def /newencodedfont { currentglobal { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } { FontDirectory 3 index known { FontDirectory 3 index get /FontReferenced known } { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } ifelse } ifelse dup { 3 index findfont /FontReferenced get 2 index dup type /nametype eq {findfont} if ne { pop false } if } if { pop 1 index findfont /Encoding get exch 0 1 255 { 2 copy get 3 index 3 1 roll put } for pop pop pop } { dup type /nametype eq { findfont } if dup dup maxlength 2 add dict begin exch { 1 index /FID ne {def} {pop pop} ifelse } forall /FontReferenced exch def /Encoding exch dup length array copy def /FontName 1 index dup type /stringtype eq { cvn } if def dup currentdict end definefont def } ifelse } bind def /SetSubstituteStrategy { $SubstituteFont begin dup type /dicttype ne { 0 dict } if currentdict /$Strategies known { exch $Strategies exch 2 copy known { get 2 copy maxlength exch maxlength add dict begin { def } forall { def } forall currentdict dup /$Init known { dup /$Init get exec } if end /$Strategy exch def } { pop pop pop } ifelse } { pop pop } ifelse end } bind def /scff { $SubstituteFont begin dup type /stringtype eq { dup length exch } { null } ifelse /$sname exch def /$slen exch def /$inVMIndex $sname null eq { 1 index $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse def end { findfont } @Stopped { dup length 8 add string exch 1 index 0 (BadFont:) putinterval 1 index exch 8 exch dup length string cvs putinterval cvn { findfont } @Stopped { pop /Courier findfont } if } if $SubstituteFont begin /$sname null def /$slen 0 def /$inVMIndex null def end } bind def /isWidthsOnlyFont { dup /WidthsOnly known { pop pop true } { dup /FDepVector known { /FDepVector get { isWidthsOnlyFont dup { exit } if } forall } { dup /FDArray known { /FDArray get { isWidthsOnlyFont dup { exit } if } forall } { pop } ifelse } ifelse } ifelse } bind def /?str1 256 string def /?set { $SubstituteFont begin /$substituteFound false def /$fontname 4 index def /$doSmartSub false def end 3 index currentglobal false setglobal exch /CompatibleFonts /ProcSet resourcestatus { pop pop /CompatibleFonts /ProcSet findresource begin dup /CompatibleFont currentexception 1 index /CompatibleFont true setexception 1 index /Font resourcestatus { pop pop 3 2 roll setglobal end exch dup findfont /CompatibleFonts /ProcSet findresource begin 3 1 roll exch /CompatibleFont exch setexception end } { 3 2 roll setglobal 1 index exch /CompatibleFont exch setexception end findfont $SubstituteFont /$substituteFound true put } ifelse } { exch setglobal findfont } ifelse $SubstituteFont begin $substituteFound { false (%%[Using embedded font ) print 5 index ?str1 cvs print ( to avoid the font substitution problem noted earlier.]%%\n) print } { dup /FontName known { dup /FontName get $fontname eq 1 index /DistillerFauxFont known not and /currentdistillerparams where { pop false 2 index isWidthsOnlyFont not and } if } { false } ifelse } ifelse exch pop /$doSmartSub true def end { exch pop exch pop exch 2 dict dup /Found 3 index put exch findfont exch } { exch exec exch dup findfont dup /FontType get 3 eq { exch ?str1 cvs dup length 1 sub -1 0 { exch dup 2 index get 42 eq { exch 0 exch getinterval cvn 4 1 roll 3 2 roll pop exit } {exch pop} ifelse }for } { exch pop } ifelse 2 dict dup /Downloaded 6 5 roll put } ifelse dup /FontName 4 index put copyfont definefont pop } bind def /?str2 256 string def /?add { 1 index type /integertype eq { exch true 4 2 } { false 3 1 } ifelse roll 1 index findfont dup /Widths known { Adobe_CoolType_Data /AddWidths? true put gsave dup 1000 scalefont setfont } if /Downloaded known { exec exch { exch ?str2 cvs exch findfont /Downloaded get 1 dict begin /Downloaded 1 index def ?str1 cvs length ?str1 1 index 1 add 3 index putinterval exch length 1 add 1 index add ?str1 2 index (*) putinterval ?str1 0 2 index getinterval cvn findfont ?str1 3 index (+) putinterval 2 dict dup /FontName ?str1 0 6 index getinterval cvn put dup /Downloaded Downloaded put end copyfont dup /FontName get exch definefont pop pop pop } { pop } ifelse } { pop exch { findfont dup /Found get dup length exch ?str1 cvs pop ?str1 1 index (+) putinterval ?str1 1 index 1 add 4 index ?str2 cvs putinterval ?str1 exch 0 exch 5 4 roll ?str2 cvs length 1 add add getinterval cvn 1 dict exch 1 index exch /FontName exch put copyfont dup /FontName get exch definefont pop } { pop } ifelse } ifelse Adobe_CoolType_Data /AddWidths? get { grestore Adobe_CoolType_Data /AddWidths? false put } if } bind def /?sh { currentfont /Downloaded known { exch } if pop } bind def /?chp { currentfont /Downloaded known { pop } { false chp } ifelse } bind def /?mv { currentfont /Downloaded known { moveto pop pop } { pop pop moveto } ifelse } bind def setpacking userdict /$SubstituteFont 25 dict put 1 dict begin /SubstituteFont dup $error exch 2 copy known { get } { pop pop { pop /Courier } bind } ifelse def /currentdistillerparams where dup { pop pop currentdistillerparams /CannotEmbedFontPolicy 2 copy known { get /Error eq } { pop pop false } ifelse } if not { countdictstack array dictstack 0 get begin userdict begin $SubstituteFont begin /$str 128 string def /$fontpat 128 string def /$slen 0 def /$sname null def /$match false def /$fontname null def /$substituteFound false def /$inVMIndex null def /$doSmartSub true def /$depth 0 def /$fontname null def /$italicangle 26.5 def /$dstack null def /$Strategies 10 dict dup begin /$Type3Underprint { currentglobal exch false setglobal 11 dict begin /UseFont exch $WMode 0 ne { dup length dict copy dup /WMode $WMode put /UseFont exch definefont } if def /FontName $fontname dup type /stringtype eq { cvn } if def /FontType 3 def /FontMatrix [ .001 0 0 .001 0 0 ] def /Encoding 256 array dup 0 1 255 { /.notdef put dup } for pop def /FontBBox [ 0 0 0 0 ] def /CCInfo 7 dict dup begin /cc null def /x 0 def /y 0 def end def /BuildChar { exch begin CCInfo begin 1 string dup 0 3 index put exch pop /cc exch def UseFont 1000 scalefont setfont cc stringwidth /y exch def /x exch def x y setcharwidth $SubstituteFont /$Strategy get /$Underprint get exec 0 0 moveto cc show x y moveto end end } bind def currentdict end exch setglobal } bind def /$GetaTint 2 dict dup begin /$BuildFont { dup /WMode known { dup /WMode get } { 0 } ifelse /$WMode exch def $fontname exch dup /FontName known { dup /FontName get dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse exch Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index /FontName get known { pop Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index get null copyfont } { $deepcopyfont } ifelse exch 1 index exch /FontBasedOn exch put dup /FontName $fontname dup type /stringtype eq { cvn } if put definefont Adobe_CoolType_Data /InVMDeepCopiedFonts get begin dup /FontBasedOn get 1 index def end } bind def /$Underprint { gsave x abs y abs gt { /y 1000 def } { /x -1000 def 500 120 translate } ifelse Level2? { [ /Separation (All) /DeviceCMYK { 0 0 0 1 pop } ] setcolorspace } { 0 setgray } ifelse 10 setlinewidth x .8 mul [ 7 3 ] { y mul 8 div 120 sub x 10 div exch moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave Level2? { .2 setcolor } { .8 setgray } ifelse fill grestore stroke } forall pop grestore } bind def end def /$Oblique 1 dict dup begin /$BuildFont { currentglobal exch dup gcheck setglobal null copyfont begin /FontBasedOn currentdict /FontName known { FontName dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse def /FontName $fontname dup type /stringtype eq { cvn } if def /currentdistillerparams where { pop } { /FontInfo currentdict /FontInfo known { FontInfo null copyfont } { 2 dict } ifelse dup begin /ItalicAngle $italicangle def /FontMatrix FontMatrix [ 1 0 ItalicAngle dup sin exch cos div 1 0 0 ] matrix concatmatrix readonly end 4 2 roll def def } ifelse FontName currentdict end definefont exch setglobal } bind def end def /$None 1 dict dup begin /$BuildFont {} bind def end def end def /$Oblique SetSubstituteStrategy /$findfontByEnum { dup type /stringtype eq { cvn } if dup /$fontname exch def $sname null eq { $str cvs dup length $slen sub $slen getinterval } { pop $sname } ifelse $fontpat dup 0 (fonts/*) putinterval exch 7 exch putinterval /$match false def $SubstituteFont /$dstack countdictstack array dictstack put mark { $fontpat 0 $slen 7 add getinterval { /$match exch def exit } $str filenameforall } stopped { cleardictstack currentdict true $SubstituteFont /$dstack get { exch { 1 index eq { pop false } { true } ifelse } { begin false } ifelse } forall pop } if cleartomark /$slen 0 def $match false ne { $match (fonts/) anchorsearch pop pop cvn } { /Courier } ifelse } bind def /$ROS 1 dict dup begin /Adobe 4 dict dup begin /Japan1 [ /Ryumin-Light /HeiseiMin-W3 /GothicBBB-Medium /HeiseiKakuGo-W5 /HeiseiMaruGo-W4 /Jun101-Light ] def /Korea1 [ /HYSMyeongJo-Medium /HYGoThic-Medium ] def /GB1 [ /STSong-Light /STHeiti-Regular ] def /CNS1 [ /MKai-Medium /MHei-Medium ] def end def end def /$cmapname null def /$deepcopyfont { dup /FontType get 0 eq { 1 dict dup /FontName /copied put copyfont begin /FDepVector FDepVector copyarray 0 1 2 index length 1 sub { 2 copy get $deepcopyfont dup /FontName /copied put /copied exch definefont 3 copy put pop pop } for def currentdict end } { $Strategies /$Type3Underprint get exec } ifelse } bind def /$buildfontname { dup /CIDFont findresource /CIDSystemInfo get begin Registry length Ordering length Supplement 8 string cvs 3 copy length 2 add add add string dup 5 1 roll dup 0 Registry putinterval dup 4 index (-) putinterval dup 4 index 1 add Ordering putinterval 4 2 roll add 1 add 2 copy (-) putinterval end 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch anchorsearch { pop pop 3 2 roll putinterval cvn /$cmapname exch def } { pop pop pop pop pop } ifelse length $str 1 index (-) putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname length add $str exch 0 exch getinterval cvn } bind def /$findfontByROS { /$fontname exch def $ROS Registry 2 copy known { get Ordering 2 copy known { get } { pop pop [] } ifelse } { pop pop [] } ifelse false exch { dup /CIDFont resourcestatus { pop pop save 1 index /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get } { false } ifelse exch pop exch restore { pop } { exch pop true exit } ifelse } { pop } ifelse } forall { $str cvs $buildfontname } { false (*) { save exch dup /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get not } { true } ifelse exch /CIDSystemInfo get dup /Registry get Registry eq exch /Ordering get Ordering eq and and { exch restore exch pop true exit } { pop restore } ifelse } $str /CIDFont resourceforall { $buildfontname } { $fontname $findfontByEnum } ifelse } ifelse } bind def end end currentdict /$error known currentdict /languagelevel known and dup { pop $error /SubstituteFont known } if dup { $error } { Adobe_CoolType_Core } ifelse begin { /SubstituteFont /CMap /Category resourcestatus { pop pop { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $sname null eq { dup $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse Adobe_CoolType_Data /InVMFontsByCMap get 1 index 2 copy known { get false exch { pop currentglobal { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } { FontDirectory 1 index known { exch pop true exit } { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } ifelse } ifelse } forall } { pop pop false } ifelse { exch pop exch pop } { dup /CMap resourcestatus { pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS } { 128 string cvs dup (-) search { 3 1 roll search { 3 1 roll pop { dup cvi } stopped { pop pop pop pop pop $findfontByEnum } { 4 2 roll pop pop exch length exch 2 index length 2 index sub exch 1 sub -1 0 { $str cvs dup length 4 index 0 4 index 4 3 roll add getinterval exch 1 index exch 3 index exch putinterval dup /CMap resourcestatus { pop pop 4 1 roll pop pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS true exit } { pop } ifelse } for dup type /booleantype eq { pop } { pop pop pop $findfontByEnum } ifelse } ifelse } { pop pop pop $findfontByEnum } ifelse } { pop pop $findfontByEnum } ifelse } ifelse } ifelse } { //SubstituteFont exec } ifelse /$slen 0 def end } } { { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $findfontByEnum } { //SubstituteFont exec } ifelse end } } ifelse bind readonly def Adobe_CoolType_Core /scfindfont /systemfindfont load put } { /scfindfont { $SubstituteFont begin dup systemfindfont dup /FontName known { dup /FontName get dup 3 index ne } { /noname true } ifelse dup { /$origfontnamefound 2 index def /$origfontname 4 index def /$substituteFound true def } if exch pop { $slen 0 gt $sname null ne 3 index length $slen gt or and { pop dup $findfontByEnum findfont dup maxlength 1 add dict begin { 1 index /FID eq { pop pop } { def } ifelse } forall currentdict end definefont dup /FontName known { dup /FontName get } { null } ifelse $origfontnamefound ne { $origfontname $str cvs print ( substitution revised, using ) print dup /FontName known { dup /FontName get } { (unspecified font) } ifelse $str cvs print (.\n) print } if } { exch pop } ifelse } { exch pop } ifelse end } bind def } ifelse end end Adobe_CoolType_Core_Defined not { Adobe_CoolType_Core /findfont { $SubstituteFont begin $depth 0 eq { /$fontname 1 index dup type /stringtype ne { $str cvs } if def /$substituteFound false def } if /$depth $depth 1 add def end scfindfont $SubstituteFont begin /$depth $depth 1 sub def $substituteFound $depth 0 eq and { $inVMIndex null ne { dup $inVMIndex $AddInVMFont } if $doSmartSub { currentdict /$Strategy known { $Strategy /$BuildFont get exec } if } if } if end } bind put } if } if end /$AddInVMFont { exch /FontName 2 copy known { get 1 dict dup begin exch 1 index gcheck def end exch Adobe_CoolType_Data /InVMFontsByCMap get exch $DictAdd } { pop pop pop } ifelse } bind def /$DictAdd { 2 copy known not { 2 copy 4 index length dict put } if Level2? not { 2 copy get dup maxlength exch length 4 index length add lt 2 copy get dup length 4 index length add exch maxlength 1 index lt { 2 mul dict begin 2 copy get { forall } def 2 copy currentdict put end } { pop } ifelse } if get begin { def } forall end } bind def end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.21 0 %%Copyright: Copyright 1987-2005 Adobe Systems Incorporated. %%Version: 1.21 0 systemdict /languagelevel known dup { currentglobal false setglobal } { false } ifelse exch userdict /Adobe_CoolType_Utility 2 copy known { 2 copy get dup maxlength 27 add dict copy } { 27 dict } ifelse put Adobe_CoolType_Utility begin /@eexecStartData def /@recognizeCIDFont null def /ct_Level2? exch def /ct_Clone? 1183615869 internaldict dup /CCRun known not exch /eCCRun known not ct_Level2? and or def ct_Level2? { globaldict begin currentglobal true setglobal } if /ct_AddStdCIDMap ct_Level2? { { mark Adobe_CoolType_Utility /@recognizeCIDFont currentdict put { ((Hex) 57 StartData 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 cc36 74f4 1144 b13b 77) 0 () /SubFileDecode filter cvx exec } stopped { cleartomark Adobe_CoolType_Utility /@recognizeCIDFont get countdictstack dup array dictstack exch 1 sub -1 0 { 2 copy get 3 index eq { 1 index length exch sub 1 sub { end } repeat exit } { pop } ifelse } for pop pop Adobe_CoolType_Utility /@eexecStartData get eexec } { cleartomark } ifelse } } { { Adobe_CoolType_Utility /@eexecStartData get eexec } } ifelse bind def userdict /cid_extensions known dup { cid_extensions /cid_UpdateDB known and } if { cid_extensions begin /cid_GetCIDSystemInfo { 1 index type /stringtype eq { exch cvn exch } if cid_extensions begin dup load 2 index known { 2 copy cid_GetStatusInfo dup null ne { 1 index load 3 index get dup null eq { pop pop cid_UpdateDB } { exch 1 index /Created get eq { exch pop exch pop } { pop cid_UpdateDB } ifelse } ifelse } { pop cid_UpdateDB } ifelse } { cid_UpdateDB } ifelse end } bind def end } if ct_Level2? { end setglobal } if /ct_UseNativeCapability? systemdict /composefont known def /ct_MakeOCF 35 dict def /ct_Vars 25 dict def /ct_GlyphDirProcs 6 dict def /ct_BuildCharDict 15 dict dup begin /charcode 2 string def /dst_string 1500 string def /nullstring () def /usewidths? true def end def ct_Level2? { setglobal } { pop } ifelse ct_GlyphDirProcs begin /GetGlyphDirectory { systemdict /languagelevel known { pop /CIDFont findresource /GlyphDirectory get } { 1 index /CIDFont findresource /GlyphDirectory get dup type /dicttype eq { dup dup maxlength exch length sub 2 index lt { dup length 2 index add dict copy 2 index /CIDFont findresource/GlyphDirectory 2 index put } if } if exch pop exch pop } ifelse + } def /+ { systemdict /languagelevel known { currentglobal false setglobal 3 dict begin /vm exch def } { 1 dict begin } ifelse /$ exch def systemdict /languagelevel known { vm setglobal /gvm currentglobal def $ gcheck setglobal } if ? { $ begin } if } def /? { $ type /dicttype eq } def /| { userdict /Adobe_CoolType_Data known { Adobe_CoolType_Data /AddWidths? known { currentdict Adobe_CoolType_Data begin begin AddWidths? { Adobe_CoolType_Data /CC 3 index put ? { def } { $ 3 1 roll put } ifelse CC charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore currentfont /Widths get exch CC exch put } { ? { def } { $ 3 1 roll put } ifelse } ifelse end end } { ? { def } { $ 3 1 roll put } ifelse } ifelse } { ? { def } { $ 3 1 roll put } ifelse } ifelse } def /! { ? { end } if systemdict /languagelevel known { gvm setglobal } if end } def /: { string currentfile exch readstring pop } executeonly def end ct_MakeOCF begin /ct_cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def /ct_CID_STR_SIZE 8000 def /ct_mkocfStr100 100 string def /ct_defaultFontMtx [.001 0 0 .001 0 0] def /ct_1000Mtx [1000 0 0 1000 0 0] def /ct_raise {exch cvx exch errordict exch get exec stop} bind def /ct_reraise { cvx $error /errorname get (Error: ) print dup ( ) cvs print errordict exch get exec stop } bind def /ct_cvnsi { 1 index add 1 sub 1 exch 0 4 1 roll { 2 index exch get exch 8 bitshift add } for exch pop } bind def /ct_GetInterval { Adobe_CoolType_Utility /ct_BuildCharDict get begin /dst_index 0 def dup dst_string length gt { dup string /dst_string exch def } if 1 index ct_CID_STR_SIZE idiv /arrayIndex exch def 2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub { dup 3 index add 2 index length le { 2 index getinterval dst_string dst_index 2 index putinterval length dst_index add /dst_index exch def exit } { 1 index length 1 index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval pop dup dst_index add /dst_index exch def sub /arrayIndex arrayIndex 1 add def 2 index dup length arrayIndex gt { arrayIndex get } { pop exit } ifelse 0 } ifelse } loop pop pop pop dst_string 0 dst_index getinterval end } bind def ct_Level2? { /ct_resourcestatus currentglobal mark true setglobal { /unknowninstancename /Category resourcestatus } stopped { cleartomark setglobal true } { cleartomark currentglobal not exch setglobal } ifelse { { mark 3 1 roll /Category findresource begin ct_Vars /vm currentglobal put ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse ct_Vars /vm get setglobal end } } { { resourcestatus } } ifelse bind def /CIDFont /Category ct_resourcestatus { pop pop } { currentglobal true setglobal /Generic /Category findresource dup length dict copy dup /InstanceType /dicttype put /CIDFont exch /Category defineresource pop setglobal } ifelse ct_UseNativeCapability? { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def /CMapName /Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } if } { /ct_Category 2 dict begin /CIDFont 10 dict def /ProcSet 2 dict def currentdict end def /defineresource { ct_Category 1 index 2 copy known { get dup dup maxlength exch length eq { dup length 10 add dict copy ct_Category 2 index 2 index put } if 3 index 3 index put pop exch pop } { pop pop /defineresource /undefined ct_raise } ifelse } bind def /findresource { ct_Category 1 index 2 copy known { get 2 index 2 copy known { get 3 1 roll pop pop} { pop pop /findresource /undefinedresource ct_raise } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /resourcestatus { ct_Category 1 index 2 copy known { get 2 index known exch pop exch pop { 0 -1 true } { false } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /ct_resourcestatus /resourcestatus load def } ifelse /ct_CIDInit 2 dict begin /ct_cidfont_stream_init { { dup (Binary) eq { pop null currentfile ct_Level2? { { cid_BYTE_COUNT () /SubFileDecode filter } stopped { pop pop pop } if } if /readstring load exit } if dup (Hex) eq { pop currentfile ct_Level2? { { null exch /ASCIIHexDecode filter /readstring } stopped { pop exch pop (>) exch /readhexstring } if } { (>) exch /readhexstring } ifelse load exit } if /StartData /typecheck ct_raise } loop cid_BYTE_COUNT ct_CID_STR_SIZE le { 2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put } { cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1 exch { 2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop } for 2 index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch 1 index length 1 sub exch put } ifelse cid_CIDFONT exch /GlyphData exch put 2 index null eq { pop pop pop } { pop /readstring load 1 string exch { 3 copy exec pop dup length 0 eq { pop pop pop pop pop true exit } if 4 index eq { pop pop pop pop false exit } if } loop pop } ifelse } bind def /StartData { mark { currentdict dup /FDArray get 0 get /FontMatrix get 0 get 0.001 eq { dup /CDevProc known not { /CDevProc 1183615869 internaldict /stdCDevProc 2 copy known { get } { pop pop { pop pop pop pop pop 0 -1000 7 index 2 div 880 } } ifelse def } if } { /CDevProc { pop pop pop pop pop 0 1 cid_temp /cid_CIDFONT get /FDArray get 0 get /FontMatrix get 0 get div 7 index 2 div 1 index 0.88 mul } def } ifelse /cid_temp 15 dict def cid_temp begin /cid_CIDFONT exch def 3 copy pop dup /cid_BYTE_COUNT exch def 0 gt { ct_cidfont_stream_init FDArray { /Private get dup /SubrMapOffset known { begin /Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2? { currentdict dup /SubrMapOffset undef dup /SubrCount undef /SDBytes undef } if end /cid_SD_BYTES exch def /cid_SUBR_COUNT exch def /cid_SUBR_MAP_OFFSET exch def /cid_SUBRS exch def cid_SUBR_COUNT 0 gt { GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub { exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put } for pop } if } { pop } ifelse } forall } if cleartomark pop pop end CIDFontName currentdict /CIDFont defineresource pop end end } stopped { cleartomark /StartData ct_reraise } if } bind def currentdict end def /ct_saveCIDInit { /CIDInit /ProcSet ct_resourcestatus { true } { /CIDInitC /ProcSet ct_resourcestatus } ifelse { pop pop /CIDInit /ProcSet findresource ct_UseNativeCapability? { pop null } { /CIDInit ct_CIDInit /ProcSet defineresource pop } ifelse } { /CIDInit ct_CIDInit /ProcSet defineresource pop null } ifelse ct_Vars exch /ct_oldCIDInit exch put } bind def /ct_restoreCIDInit { ct_Vars /ct_oldCIDInit get dup null ne { /CIDInit exch /ProcSet defineresource pop } { pop } ifelse } bind def /ct_BuildCharSetUp { 1 index begin CIDFont begin Adobe_CoolType_Utility /ct_BuildCharDict get begin /ct_dfCharCode exch def /ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge { pop 0 } if /cid exch def { GlyphDirectory cid 2 copy known { get } { pop pop nullstring } ifelse dup length FDBytes sub 0 gt { dup FDBytes 0 ne { 0 FDBytes ct_cvnsi } { pop 0 } ifelse /fdIndex exch def dup length FDBytes sub FDBytes exch getinterval /charstring exch def exit } { pop cid 0 eq { /charstring nullstring def exit } if /cid 0 def } ifelse } loop } def /ct_SetCacheDevice { 0 0 moveto dup stringwidth 3 -1 roll true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto } def /ct_CloneSetCacheProc { 1 eq { stringwidth pop -2 div -880 0 -1000 setcharwidth moveto } { usewidths? { currentfont /Widths get cid 2 copy known { get exch pop aload pop } { pop pop stringwidth } ifelse } { stringwidth } ifelse setcharwidth 0 0 moveto } ifelse } def /ct_Type3ShowCharString { ct_FDDict fdIndex 2 copy known { get } { currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup maxlength dict copy begin FDArray fdIndex get dup /FontMatrix 2 copy known { get } { pop pop ct_defaultFontMtx } ifelse /FontMatrix exch dup length array copy def /Private get /Private exch def /Widths rootfont /Widths get def /CharStrings 1 dict dup /.notdef dup length string copy put def currentdict end /ct_Type1Font exch definefont dup 5 1 roll put setglobal } ifelse dup /CharStrings get 1 index /Encoding get ct_dfCharCode get charstring put rootfont /WMode 2 copy known { get } { pop pop 0 } ifelse exch 1000 scalefont setfont ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold { currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth setlinewidth stroke } { ct_str1 show } ifelse } def /ct_Type4ShowCharString { ct_dfDict ct_dfCharCode charstring FDArray fdIndex get dup /FontMatrix get dup ct_defaultFontMtx ct_matrixeq not { ct_1000Mtx matrix concatmatrix concat } { pop } ifelse /Private get Adobe_CoolType_Utility /ct_Level2? get not { ct_dfDict /Private 3 -1 roll { put } 1183615869 internaldict /superexec get exec } if 1183615869 internaldict Adobe_CoolType_Utility /ct_Level2? get { 1 index } { 3 index /Private get mark 6 1 roll } ifelse dup /RunInt known { /RunInt get } { pop /CCRun } ifelse get exec Adobe_CoolType_Utility /ct_Level2? get not { cleartomark } if } bind def /ct_BuildCharIncremental { { Adobe_CoolType_Utility /ct_MakeOCF get begin ct_BuildCharSetUp ct_ShowCharString } stopped { stop } if end end end end } bind def /BaseFontNameStr (BF00) def /ct_Type1FontTemplate 14 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /PaintType 0 def currentdict end def /BaseFontTemplate 11 dict begin /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /BuildChar /ct_BuildCharIncremental load def ct_Clone? { /FontType 3 def /ct_ShowCharString /ct_Type3ShowCharString load def /ct_dfSetCacheProc /ct_CloneSetCacheProc load def /ct_SyntheticBold false def /ct_StrokeWidth 1 def } { /FontType 4 def /Private 1 dict dup /lenIV 4 put def /CharStrings 1 dict dup /.notdef put def /PaintType 0 def /ct_ShowCharString /ct_Type4ShowCharString load def } ifelse /ct_str1 1 string def currentdict end def /BaseFontDictSize BaseFontTemplate length 5 add def /ct_matrixeq { true 0 1 5 { dup 4 index exch get exch 3 index exch get eq and dup not { exit } if } for exch pop exch pop } bind def /ct_makeocf { 15 dict begin exch /WMode exch def exch /FontName exch def /FontType 0 def /FMapType 2 def dup /FontMatrix known { dup /FontMatrix get /FontMatrix exch def } { /FontMatrix matrix def } ifelse /bfCount 1 index /CIDCount get 256 idiv 1 add dup 256 gt { pop 256} if def /Encoding 256 array 0 1 bfCount 1 sub { 2 copy dup put pop } for bfCount 1 255 { 2 copy bfCount put pop } for def /FDepVector bfCount dup 256 lt { 1 add } if array def BaseFontTemplate BaseFontDictSize dict copy begin /CIDFont exch def CIDFont /FontBBox known { CIDFont /FontBBox get /FontBBox exch def } if CIDFont /CDevProc known { CIDFont /CDevProc get /CDevProc exch def } if currentdict end BaseFontNameStr 3 (0) putinterval 0 1 bfCount dup 256 eq { 1 sub } if { FDepVector exch 2 index BaseFontDictSize dict copy begin dup /CIDFirstByte exch 256 mul def FontType 3 eq { /ct_FDDict 2 dict def } if currentdict end 1 index 16 BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put } for ct_Clone? { /Widths 1 index /CIDFont get /GlyphDirectory get length dict def } if FontName currentdict end definefont ct_Clone? { gsave dup 1000 scalefont setfont ct_BuildCharDict begin /usewidths? false def currentfont /Widths get begin exch /CIDFont get /GlyphDirectory get { pop dup charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore def } forall end /usewidths? true def end grestore } { exch pop } ifelse } bind def /ct_ComposeFont { ct_UseNativeCapability? { 2 index /CMap ct_resourcestatus { pop pop exch pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 3 index def /CMapVersion 1.000 def /CMapType 1 def exch /WMode exch def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity)} ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { 3 2 roll pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def /ct_MakeIdentity { ct_UseNativeCapability? { 1 index /CMap ct_resourcestatus { pop pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 2 index def /CMapVersion 1.000 def /CMapType 1 def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity) } ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { exch pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def currentdict readonly pop end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 %%Copyright: Copyright 1987-2004 Adobe Systems Incorporated. %%Version: 1.0 0 userdict /ct_T42Dict 15 dict put ct_T42Dict begin /Is2015? { version cvi 2015 ge } bind def /AllocGlyphStorage { Is2015? { pop } { {string} forall } ifelse } bind def /Type42DictBegin { 25 dict begin /FontName exch def /CharStrings 256 dict begin /.notdef 0 def currentdict end def /Encoding exch def /PaintType 0 def /FontType 42 def /FontMatrix [1 0 0 1 0 0] def 4 array astore cvx /FontBBox exch def /sfnts } bind def /Type42DictEnd { currentdict dup /FontName get exch definefont end ct_T42Dict exch dup /FontName get exch put } bind def /RD {string currentfile exch readstring pop} executeonly def /PrepFor2015 { Is2015? { /GlyphDirectory 16 dict def sfnts 0 get dup 2 index (glyx) putinterval 2 index (locx) putinterval pop pop } { pop pop } ifelse } bind def /AddT42Char { Is2015? { /GlyphDirectory get begin def end pop pop } { /sfnts get 4 index get 3 index 2 index putinterval pop pop pop pop } ifelse } bind def /T0AddT42Mtx2 { /CIDFont findresource /Metrics2 get begin def end }bind def end %%EndResource Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end %%BeginResource: procset Adobe_AGM_Image 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Image 75 dict dup begin put /Adobe_AGM_Image_Id /Adobe_AGM_Image_1.0_0 def /nd{ null def }bind def /AGMIMG_&image nd /AGMIMG_&colorimage nd /AGMIMG_&imagemask nd /AGMIMG_mbuf () def /AGMIMG_ybuf () def /AGMIMG_kbuf () def /AGMIMG_c 0 def /AGMIMG_m 0 def /AGMIMG_y 0 def /AGMIMG_k 0 def /AGMIMG_tmp nd /AGMIMG_imagestring0 nd /AGMIMG_imagestring1 nd /AGMIMG_imagestring2 nd /AGMIMG_imagestring3 nd /AGMIMG_imagestring4 nd /AGMIMG_imagestring5 nd /AGMIMG_cnt nd /AGMIMG_fsave nd /AGMIMG_colorAry nd /AGMIMG_override nd /AGMIMG_name nd /AGMIMG_maskSource nd /AGMIMG_flushfilters nd /invert_image_samples nd /knockout_image_samples nd /img nd /sepimg nd /devnimg nd /idximg nd /doc_setup { Adobe_AGM_Core begin Adobe_AGM_Image begin /AGMIMG_&image systemdict/image get def /AGMIMG_&imagemask systemdict/imagemask get def /colorimage where{ pop /AGMIMG_&colorimage /colorimage ldf }if end end }def /page_setup { Adobe_AGM_Image begin /AGMIMG_ccimage_exists {/customcolorimage where { pop /Adobe_AGM_OnHost_Seps where { pop false }{ /Adobe_AGM_InRip_Seps where { pop false }{ true }ifelse }ifelse }{ false }ifelse }bdf level2{ /invert_image_samples { Adobe_AGM_Image/AGMIMG_tmp Decode length ddf /Decode [ Decode 1 get Decode 0 get] def }def /knockout_image_samples { Operator/imagemask ne{ /Decode [1 1] def }if }def }{ /invert_image_samples { {1 exch sub} currenttransfer addprocs settransfer }def /knockout_image_samples { { pop 1 } currenttransfer addprocs settransfer }def }ifelse /img /imageormask ldf /sepimg /sep_imageormask ldf /devnimg /devn_imageormask ldf /idximg /indexed_imageormask ldf /_ctype 7 def currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and{ bind }if def }forall }def /page_trailer { end }def /doc_trailer { }def /AGMIMG_flushfilters { dup type /arraytype ne {1 array astore}if aload length { dup type /filetype eq { dup status 1 index currentfile ne and {dup flushfile closefile} {pop} ifelse }{pop}ifelse } repeat }def /imageormask_sys { begin save mark level2{ currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load AGMIMG_&imagemask }{ BitsPerComponent ImageMatrix /DataSource load AGMIMG_&image }ifelse }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if cleartomark restore end }def /overprint_plate { currentoverprint { 0 get dup type /nametype eq { dup /DeviceGray eq{ pop AGMCORE_black_plate not }{ /DeviceCMYK eq{ AGMCORE_is_cmyk_sep not }if }ifelse }{ false exch { AGMOHS_sepink eq or } forall not } ifelse }{ pop false }ifelse }def /process_mask_L3 { dup begin /ImageType 1 def end 4 dict begin /DataDict exch def /ImageType 3 def /InterleaveType 3 def /MaskDict 9 dict begin /ImageType 1 def /Width DataDict dup /MaskWidth known {/MaskWidth}{/Width} ifelse get def /Height DataDict dup /MaskHeight known {/MaskHeight}{/Height} ifelse get def /ImageMatrix [Width 0 0 Height neg 0 Height] def /NComponents 1 def /BitsPerComponent 1 def /Decode [0 1] def /DataSource AGMIMG_maskSource def currentdict end def currentdict end }def /use_mask { dup type /dicttype eq { dup /Mask known { dup /Mask get { level3 {true} { dup /MaskWidth known {dup /MaskWidth get 1 index /Width get eq}{true}ifelse exch dup /MaskHeight known {dup /MaskHeight get 1 index /Height get eq}{true}ifelse 3 -1 roll and } ifelse } {false} ifelse } {false} ifelse } {false} ifelse }def /make_line_source { begin MultipleDataSources { [ Decode length 2 div cvi {Width string} repeat ] }{ Width Decode length 2 div mul cvi string }ifelse end }def /datasource_to_str { exch dup type dup /filetype eq { pop exch readstring }{ /arraytype eq { exec exch copy }{ pop }ifelse }ifelse pop }def /masked_image_simulation { 3 dict begin dup make_line_source /line_source xdf /mask_source AGMIMG_maskSource /LZWDecode filter def dup /Width get 8 div ceiling cvi string /mask_str xdf begin gsave 0 1 translate 1 -1 Height div scale 1 1 Height { pop gsave MultipleDataSources { 0 1 DataSource length 1 sub { dup DataSource exch get exch line_source exch get datasource_to_str } for }{ DataSource line_source datasource_to_str } ifelse << /PatternType 1 /PaintProc [ /pop cvx << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1.0 sub 1 matrix scale 0.5 0 matrix translate matrix concatmatrix /MultipleDataSources MultipleDataSources /DataSource line_source /BitsPerComponent BitsPerComponent /Decode Decode >> /image cvx ] cvx /BBox [0 0 Width 1] /XStep Width /YStep 1 /PaintType 1 /TilingType 2 >> matrix makepattern set_pattern << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1 matrix scale /MultipleDataSources false /DataSource mask_source mask_str readstring pop /BitsPerComponent 1 /Decode [0 1] >> imagemask grestore 0 1 translate } for grestore end end }def /imageormask { begin SkipImageProc { currentdict consumeimagedata } { save mark level2 AGMCORE_host_sep not and{ currentdict Operator /imagemask eq DeviceN_PS2 not and { imagemask }{ AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get /DeviceGray eq and{ [/Separation /Black /DeviceGray {}] setcolorspace /Decode [ Decode 1 get Decode 0 get ] def }if use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and { Names convert_to_process not { 2 dict begin /imageDict xdf /names_index 0 def gsave imageDict write_image_file { Names { dup (None) ne { [/Separation 3 -1 roll /DeviceGray {1 exch sub}] setcolorspace Operator imageDict read_image_file names_index 0 eq {true setoverprint} if /names_index names_index 1 add def }{ pop } ifelse } forall close_image_file } if grestore end }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load /Adobe_AGM_OnHost_Seps where { pop imagemask }{ currentgray 1 ne{ currentdict imageormask_sys }{ currentoverprint not{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }ifelse }{ BitsPerComponent ImageMatrix MultipleDataSources{ 0 1 NComponents 1 sub{ DataSource exch get }for }{ /DataSource load }ifelse Operator /colorimage eq{ AGMCORE_host_sep{ MultipleDataSources level2 or NComponents 4 eq and{ AGMCORE_is_cmyk_sep{ MultipleDataSources{ /DataSource [ DataSource 0 get /exec cvx DataSource 1 get /exec cvx DataSource 2 get /exec cvx DataSource 3 get /exec cvx /AGMCORE_get_ink_data cvx ] cvx def }{ /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul /DataSource load filter_cmyk 0 () /SubFileDecode filter def }ifelse /Decode [ Decode 0 get Decode 1 get ] def /MultipleDataSources false def /NComponents 1 def /Operator /image def invert_image_samples 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }{ MultipleDataSources NComponents AGMIMG_&colorimage }ifelse }{ true NComponents colorimage }ifelse }{ Operator /image eq{ AGMCORE_host_sep{ /DoImage true def HostSepColorImage{ invert_image_samples }{ AGMCORE_black_plate not Operator/imagemask ne and{ /DoImage false def currentdict ignoreimagedata }if }ifelse 1 AGMCORE_&setgray DoImage {currentdict imageormask_sys} if }{ use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ image }ifelse }ifelse }{ Operator/knockout eq{ pop pop pop pop pop currentcolorspace overprint_plate not{ knockout_unitsq }if }if }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end }def /sep_imageormask { /sep_colorspace_dict AGMCORE_gget begin CSA map_csa begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_avoid_L2_sep_space{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def }if AGMIMG_ccimage_exists MappedCSA 0 get /DeviceCMYK eq and currentdict/Components known and Name () ne and Name (All) ne and Operator /image eq and AGMCORE_producing_seps not and level2 not and { Width Height BitsPerComponent ImageMatrix [ /DataSource load /exec cvx { 0 1 2 index length 1 sub{ 1 index exch 2 copy get 255 xor put }for } /exec cvx ] cvx bind MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Name findcmykcustomcolor customcolorimage }{ AGMCORE_producing_seps not{ level2{ AGMCORE_avoid_L2_sep_space not currentcolorspace 0 get /Separation ne and{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentdict imageormask }{ currentdict Operator /imagemask eq{ imageormask }{ sep_imageormask_lev1 }ifelse }ifelse }{ AGMCORE_host_sep{ Operator/knockout eq{ currentdict/ImageMatrix get concat knockout_unitsq }{ currentgray 1 ne{ AGMCORE_is_cmyk_sep Name (All) ne and{ level2{ Name AGMCORE_IsSeparationAProcessColor { Operator /imagemask eq{ /sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor }{ invert_image_samples }ifelse }{ [ /Separation Name [/DeviceGray] { sep_colorspace_proc AGMCORE_get_ink_data 1 exch sub } bind ] AGMCORE_&setcolorspace /sep_tint AGMCORE_gget AGMCORE_&setcolor }ifelse currentdict imageormask_sys }{ currentdict Operator /imagemask eq{ imageormask_sys }{ sep_image_lev1_sep }ifelse }ifelse }{ Operator/imagemask ne{ invert_image_samples }if currentdict imageormask_sys }ifelse }{ currentoverprint not Name (All) eq or Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentcolorspace 0 get /Separation ne{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentoverprint MappedCSA 0 get /DeviceCMYK eq and Name AGMCORE_IsSeparationAProcessColor not and Name inRip_spot_has_ink not and Name (All) ne and { imageormask_l2_overprint }{ currentdict imageormask }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end end }def /decode_image_sample { 4 1 roll exch dup 5 1 roll sub 2 4 -1 roll exp 1 sub div mul add } bdf /colorSpaceElemCnt { mark currentcolor counttomark dup 2 add 1 roll cleartomark } bdf /devn_sep_datasource { 1 dict begin /dataSource xdf [ 0 1 dataSource length 1 sub { dup currentdict /dataSource get /exch cvx /get cvx /exec cvx /exch cvx names_index /ne cvx [ /pop cvx ] cvx /if cvx } for ] cvx bind end } bdf /devn_alt_datasource { 11 dict begin /convProc xdf /origcolorSpaceElemCnt xdf /origMultipleDataSources xdf /origBitsPerComponent xdf /origDecode xdf /origDataSource xdf /dsCnt origMultipleDataSources {origDataSource length}{1}ifelse def /DataSource origMultipleDataSources { [ BitsPerComponent 8 idiv origDecode length 2 idiv mul string 0 1 origDecode length 2 idiv 1 sub { dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch origDataSource exch get 0 () /SubFileDecode filter BitsPerComponent 8 idiv string /readstring cvx /pop cvx /putinterval cvx }for ]bind cvx }{origDataSource}ifelse 0 () /SubFileDecode filter def [ origcolorSpaceElemCnt string 0 2 origDecode length 2 sub { dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div 1 BitsPerComponent 8 idiv {DataSource /read cvx /not cvx{0}/if cvx /mul cvx}repeat /mul cvx /add cvx }for /convProc load /exec cvx origcolorSpaceElemCnt 1 sub -1 0 { /dup cvx 2 /add cvx /index cvx 3 1 /roll cvx /exch cvx 255 /mul cvx /cvi cvx /put cvx }for ]bind cvx 0 () /SubFileDecode filter end } bdf /devn_imageormask { /devicen_colorspace_dict AGMCORE_gget begin CSA map_csa 2 dict begin dup /srcDataStrs [ 3 -1 roll begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi { dup 65535 gt {1 add 2 div cvi}{exit}ifelse } loop string } repeat end ] def /dstDataStr srcDataStrs 0 get length string def begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_producing_seps not { level3 not { Operator /imagemask ne { /DataSource [ [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse colorSpaceElemCnt /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource 1 /string cvx /readstring cvx /pop cvx] cvx colorSpaceElemCnt 1 sub{dup}repeat] def /MultipleDataSources true def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def } if }if currentdict imageormask }{ AGMCORE_host_sep{ Names convert_to_process { CSA get_csa_by_name 0 get /DeviceCMYK eq { /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse 4 /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource filter_cmyk 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode [1 0] def /DeviceGray setcolorspace currentdict imageormask_sys }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate { /DataSource DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse CSA get_csa_by_name 0 get /DeviceRGB eq{3}{1}ifelse /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource /MultipleDataSources false def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def currentdict imageormask_sys } { gsave knockout_unitsq grestore currentdict consumeimagedata } ifelse } ifelse } { /devicen_colorspace_dict AGMCORE_gget /names_index known { Operator/imagemask ne{ MultipleDataSources { /DataSource [ DataSource devn_sep_datasource /exec cvx ] cvx def /MultipleDataSources false def }{ /DataSource /DataSource load dstDataStr srcDataStrs 0 get filter_devn def } ifelse invert_image_samples } if currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentdict imageormask }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end end end }def /imageormask_l2_overprint { currentdict currentcmykcolor add add add 0 eq{ currentdict consumeimagedata }{ level3{ currentcmykcolor /AGMIMG_k xdf /AGMIMG_y xdf /AGMIMG_m xdf /AGMIMG_c xdf Operator/imagemask eq{ [/DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK {}] setcolorspace AGMIMG_c 0 ne {AGMIMG_c} if AGMIMG_m 0 ne {AGMIMG_m} if AGMIMG_y 0 ne {AGMIMG_y} if AGMIMG_k 0 ne {AGMIMG_k} if setcolor }{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def [/Indexed [ /DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK { AGMIMG_k 0 eq {0} if AGMIMG_y 0 eq {0 exch} if AGMIMG_m 0 eq {0 3 1 roll} if AGMIMG_c 0 eq {0 4 1 roll} if } ] 255 { 255 div mark exch dup dup dup AGMIMG_k 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_y 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_m 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_c 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop counttomark 1 roll }{ pop }ifelse counttomark 1 add -1 roll pop } ] setcolorspace }ifelse imageormask_sys }{ write_image_file{ currentcmykcolor 0 ne{ [/Separation /Black /DeviceGray {}] setcolorspace gsave /Black [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 1 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Yellow /DeviceGray {}] setcolorspace gsave /Yellow [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 2 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Magenta /DeviceGray {}] setcolorspace gsave /Magenta [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 3 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Cyan /DeviceGray {}] setcolorspace gsave /Cyan [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore } if close_image_file }{ imageormask }ifelse }ifelse }ifelse } def /indexed_imageormask { begin save mark currentdict AGMCORE_host_sep{ Operator/knockout eq{ /indexed_colorspace_dict AGMCORE_gget dup /CSA known { /CSA get get_csa_by_name }{ /Names get } ifelse overprint_plate not{ knockout_unitsq }if }{ Indexed_DeviceN { /devicen_colorspace_dict AGMCORE_gget /names_index known { indexed_image_lev2_sep }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata } ifelse }{ AGMCORE_is_cmyk_sep{ Operator /imagemask eq{ imageormask_sys }{ level2{ indexed_image_lev2_sep }{ indexed_image_lev1_sep }ifelse }ifelse }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ level2{ Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget begin }{ /indexed_colorspace_dict AGMCORE_gget begin CSA get_csa_by_name 0 get /DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and { [/Indexed [/DeviceN [/Cyan /Magenta /Yellow /Black] /DeviceCMYK {}] HiVal Lookup] setcolorspace } if end } ifelse imageormask Indexed_DeviceN { end } if }{ Operator /imagemask eq{ imageormask }{ indexed_imageormask_lev1 }ifelse }ifelse }ifelse cleartomark restore currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end }def /indexed_image_lev2_sep { /indexed_colorspace_dict AGMCORE_gget begin begin Indexed_DeviceN not { currentcolorspace dup 1 /DeviceGray put dup 3 currentcolorspace 2 get 1 add string 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub { dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put }for put setcolorspace } if currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse end end }def /OPIimage { dup type /dicttype ne{ 10 dict begin /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /ImageType 1 def /Decode [0 1 def] currentdict end }if dup begin /NComponents 1 cdndf /MultipleDataSources false cdndf /SkipImageProc {false} cdndf /HostSepColorImage false cdndf /Decode [ 0 currentcolorspace 0 get /Indexed eq{ 2 BitsPerComponent exp 1 sub }{ 1 }ifelse ] cdndf /Operator /image cdndf end /sep_colorspace_dict AGMCORE_gget null eq{ imageormask }{ gsave dup begin invert_image_samples end sep_imageormask grestore }ifelse }def /cachemask_level2 { 3 dict begin /LZWEncode filter /WriteFilter xdf /readBuffer 256 string def /ReadFilter currentfile 0 (%EndMask) /SubFileDecode filter /ASCII85Decode filter /RunLengthDecode filter def { ReadFilter readBuffer readstring exch WriteFilter exch writestring not {exit} if }loop WriteFilter closefile end }def /cachemask_level3 { currentfile << /Filter [ /SubFileDecode /ASCII85Decode /RunLengthDecode ] /DecodeParms [ << /EODCount 0 /EODString (%EndMask) >> null null ] /Intent 1 >> /ReusableStreamDecode filter }def /spot_alias { /mapto_sep_imageormask { dup type /dicttype ne{ 12 dict begin /ImageType 1 def /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /MultipleDataSources false def }{ begin }ifelse /Decode [/customcolor_tint AGMCORE_gget 0] def /Operator /image def /HostSepColorImage false def /SkipImageProc {false} def currentdict end sep_imageormask }bdf /customcolorimage { Adobe_AGM_Image/AGMIMG_colorAry xddf /customcolor_tint AGMCORE_gget << /Name AGMIMG_colorAry 4 get /CSA [ /DeviceCMYK ] /TintMethod /Subtractive /TintProc null /MappedCSA null /NComponents 4 /Components [ AGMIMG_colorAry aload pop pop ] >> setsepcolorspace mapto_sep_imageormask }ndf Adobe_AGM_Image/AGMIMG_&customcolorimage /customcolorimage load put /customcolorimage { Adobe_AGM_Image/AGMIMG_override false put current_spot_alias{dup 4 get map_alias}{false}ifelse { false set_spot_alias /customcolor_tint AGMCORE_gget exch setsepcolorspace pop mapto_sep_imageormask true set_spot_alias }{ AGMIMG_&customcolorimage }ifelse }bdf }def /snap_to_device { 6 dict begin matrix currentmatrix dup 0 get 0 eq 1 index 3 get 0 eq and 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop { 1 1 dtransform 0 gt exch 0 gt /AGMIMG_xSign? exch def /AGMIMG_ySign? exch def 0 0 transform AGMIMG_ySign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch AGMIMG_xSign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch itransform /AGMIMG_llY exch def /AGMIMG_llX exch def 1 1 transform AGMIMG_ySign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch AGMIMG_xSign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch itransform /AGMIMG_urY exch def /AGMIMG_urX exch def [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY] concat }{ }ifelse end } def level2 not{ /colorbuf { 0 1 2 index length 1 sub{ dup 2 index exch get 255 exch sub 2 index 3 1 roll put }for }def /tint_image_to_color { begin Width Height BitsPerComponent ImageMatrix /DataSource load end Adobe_AGM_Image begin /AGMIMG_mbuf 0 string def /AGMIMG_ybuf 0 string def /AGMIMG_kbuf 0 string def { colorbuf dup length AGMIMG_mbuf length ne { dup length dup dup /AGMIMG_mbuf exch string def /AGMIMG_ybuf exch string def /AGMIMG_kbuf exch string def } if dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop } addprocs {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf} true 4 colorimage end } def /sep_imageormask_lev1 { begin MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ { 255 mul round cvi GrayLookup exch get } currenttransfer addprocs settransfer currentdict imageormask }{ /sep_colorspace_dict AGMCORE_gget/Components known{ MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ {AGMIMG_k mul 1 exch sub} currenttransfer addprocs settransfer currentdict imageormask }{ currentcolortransfer {AGMIMG_k mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_y mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_m mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_c mul 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }{ MappedCSA 0 get /DeviceGray eq { {255 mul round cvi ColorLookup exch get 0 get} currenttransfer addprocs settransfer currentdict imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }ifelse }ifelse }ifelse end }def /sep_image_lev1_sep { begin /sep_colorspace_dict AGMCORE_gget/Components known{ Components aload pop Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf {AGMIMG_c mul 1 exch sub} {AGMIMG_m mul 1 exch sub} {AGMIMG_y mul 1 exch sub} {AGMIMG_k mul 1 exch sub} }{ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} }ifelse AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end }def /indexed_imageormask_lev1 { /indexed_colorspace_dict AGMCORE_gget begin begin currentdict MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ {HiVal mul round cvi GrayLookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceGray eq { {HiVal mul round cvi Lookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi Lookup exch get HiVal div} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }ifelse }ifelse }ifelse end end }def /indexed_image_lev1_sep { /indexed_colorspace_dict AGMCORE_gget begin begin {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end end }def }if end systemdict /setpacking known { setpacking } if %%EndResource currentdict Adobe_AGM_Utils eq {end} if %%EndProlog %%BeginSetup Adobe_AGM_Utils begin 2 2010 Adobe_AGM_Core/doc_setup get exec Adobe_CoolType_Core/doc_setup get exec Adobe_AGM_Image/doc_setup get exec currentdict Adobe_AGM_Utils eq {end} if %%EndSetup %%Page: (Page 1) 1 %%EndPageComments %%BeginPageSetup /currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse { userdict /AI11_PDFMark5 /cleartomark load put userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put} { userdict /AI11_PDFMark5 /pdfmark load put userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse [/NamespacePush AI11_PDFMark5 [/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5 [{ai_metadata_stream_123} currentfile 0 (% &&end XMP packet marker&&) /SubFileDecode filter AI11_ReadMetadata_PDFMark5 Blue Square Test File - .eps XMPFiles BlueSquare test file, created in Illustrator CS2, saved as .ai and .eps. XMP Blue Square test file Illustrator .eps 8 8 8 % &&end XMP packet marker&& [{ai_metadata_stream_123} <> /PUT AI11_PDFMark5 [/Document 1 dict begin /Metadata {ai_metadata_stream_123} def currentdict end /BDC AI11_PDFMark5 %AI12_RMC_Transparency: Balance=75 RasterRes=300 GradRes=150 Text=0 Stroke=1 Clip=1 OP=0 Adobe_AGM_Utils begin Adobe_AGM_Core/page_setup get exec Adobe_AGM_Core/capture_currentpagedevice get exec Adobe_CoolType_Core/page_setup get exec Adobe_AGM_Image/page_setup get exec %%EndPageSetup Adobe_AGM_Core/AGMCORE_save save ddf 1 -1 scale 0 -361 translate [1 0 0 1 0 0 ] concat % page clip gsave newpath gsave % PSGState 0 0 mo 0 361 li 289 361 li 289 0 li cp clp [1 0 0 1 0 0 ] concat 288.5 360.5 mo 0.5 360.5 li 0.5 0.5 li 288.5 0.5 li 288.5 360.5 li cp false sop /0 [/DeviceCMYK] /CSA add_res 0.882353 0.768627 0 0 cmyk f 1 lw 0 lc 0 lj 4 ml [] 0 dsh true sadj 288.5 360.5 mo 0.5 360.5 li 0.5 0.5 li 288.5 0.5 li 288.5 360.5 li cp 0 0 0 1 cmyk @ %ADOBeginClientInjection: EndPageContent "AI11EPS" userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse %ADOEndClientInjection: EndPageContent "AI11EPS" % page clip grestore grestore % PSGState Adobe_AGM_Core/AGMCORE_save get restore %%PageTrailer [/EMC AI11_PDFMark5 [/NamespacePop AI11_PDFMark5 [ [/CSA [/0 ]] ] del_res Adobe_AGM_Image/page_trailer get exec Adobe_CoolType_Core/page_trailer get exec Adobe_AGM_Core/page_trailer get exec currentdict Adobe_AGM_Utils eq {end} if %%Trailer Adobe_AGM_Image/doc_trailer get exec Adobe_CoolType_Core/doc_trailer get exec Adobe_AGM_Core/doc_trailer get exec %%EOF %AI9_PrintingDataEnd userdict /AI9_read_buffer 256 string put userdict begin /ai9_skip_data { mark { currentfile AI9_read_buffer { readline } stopped { } { not { exit } if (%AI9_PrivateDataEnd) eq { exit } if } ifelse } loop cleartomark } def end userdict /ai9_skip_data get exec %AI9_PrivateDataBegin %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 12.0 %%AI8_CreatorVersion: 12.0.0 %%For: (Alan Lillich) (Adobe Systems) %%Title: (BlueSquare.eps) %%CreationDate: 9/7/05 3:18 PM %AI9_DataStream %Gb"-6rK8/2OXKo,q%!3rRn7t-g5*PRDJdXuMPPE==u.r,k]Xtc`nDh!>N1H-C>%t$lCS"Qk8ss4!`bMRCoN?%@WY[OH3/&@_r5QY %3"TGEEV'2,GMg&YpUcphs82!"ft69"LSK(](fEDBn\p!-oBY#cojt;C1^+T+6ICL9L(pfm'n>rVeb=9khgPFQL\IuYJ+qddqmZ#Y %I/!6mm@Rb"49"g4n*$7-a.'Ok?iAsQ`V&,BY@"qfqte;/%sKZk*qRnbfXuT[oDP/fhu(CdGJAS)iTJ68QNF\oRbR\`GLQo+LVF#j %GOJkOrVi;<^S42)J+Il.o_!G',(7^cJ+`Zu7j=HoR#/E/?iJ7+hgYU]a7jf5!!2cgahRiOp$^abp[Q/EO)NmiqmW24fsV\pGbX@K %^NfYT[kHV[T=o^Pa5^7)d@p#9UWWUZS?=U^R%$FWq!e.Q48DchY@%7nq[]lu1Kq8ga^>(klaLfis2bVlRf^?RrCsCc6dU;Tec5LF %j`eK>WGq'n?Jk_OmE:QoH1]l["*J\h6eD7<-##>LN8mp.-:4'&67MFAW/R>qIn[si\RIq3NqVf=Gk:c-5GoZRp#b)NpYYpU7dF,o %?HG06J,&fhS,\fZ0$_WpPsq@\rr2f,nQ$J`%XMq"if2^&NSLg7KtB?\L>KA'1#50jjb:*.0clo.h>QaETi?gJqAWAfMjT/#><.JS18CJa3`gGsZI*56Pj^4#MQ[A?o_-l!sj`J@DHU/[()?$)rhHi?pg_8,.q,KMU#OHA%pS %2gtjd4oqR#;t-OrqLtOioATp]2Emd=GV!)60&`_XPb&9U6G(SkfKm'-Od2#X.#%ZZ-X)ZFP[;OW11L$<;Wsa4Y]*%rU4;rp:["@. %5CNt$JD_eITmuhdUF9"aHklRpBJKS19n$p&KKe?U8dXC60@Fp8*g@%(TY[ADLG/c(6p-meGDrWuAr/q0N' %H?]/$,hqIAE)&*CFIN].XI-AGEfh&u"e-;dVS[PN::Mp$Kl7`>-M[%ijoQe&"IHnYMQEg`=>bqeFu)en77rtG36B=lYRHss@( %SQWt1HD!;1%DZd;&:l?>3JUcL]!Sn6<9ZXT+ST^0,s/5O[_*qHNq>^'I"IlYlTcP'gScbJ0S/ %F3]M%lbDb$q.BRWs))`8oD2\j*PQdl9H`Y>q=jftHsVA'U7\E7_Y.S1(ptbuo'ImQ+NIFd?97],e#O3(qQ;c(e9>9t8t+WFu81d:_[bldk7*NqM_he!q^#r(jc\3U9`Gqrt7n %rOUPZrm>B#,rKs[X^$3fZfH/^UNPl/c&rHMRiZsgZfHMh&$9&3A7'3fR;W-e!VNFj$%,3qN5C3A[iiS[[tJi3VU#45%i^JD!'BF;8UY#*=KOCHHs+Ps*g-sfL\rWcYji1HM2#sXJnCufFr]ifAQmB^uFQG;uA\K(@bgNlc(j>,M'mqrI"VnS2IkA+ %^NHX20=ap!Q1D]>/@c2`a\fq$CE71lXX?,%0!'IrPjn9Ha%"q:PFEkbiBB=.ropUrpN]t=CR/4)qs<.@cXS!-ceEb$ZfEms([Z*' %rH7HMDsL!=Opc&4]"=g!r<1`WdCT#3B#u>VS+@q%FdAPYqn@4=C!DeKC=Q>MC!MmbEM"-qr2eJS]\P5dC9uuAguh'35G'seY?F_? %QCO$5P]c:^SgB`^*dV$dCR1KOqp]cSZ^YJ!HRO$?8ia*m4?f$g4#O*Oqor[^(=VQF%HI`Vc!rZp+# %PG3`&f/hKc>#0@.>ZCU].,j?sNjYq=PFNqciBAbaq"_"$rMoPOB$#b7c]&Q$rH7HjDsL!>P07fOFMlSV?H4,X[[tbq\Z#3j]3EHc %BpN"aq]TnD8^*>j>0,IsP,C320$!pX\+QNBP)F'mn)J_OZfHMhpT7Zun'>klCX/8/eQHoVmYBAqV_UmtWkDQCT&)$/*;;Hj_Tug7 %gNd"!CR/4cqqNUYk:t"HhU^/E-0O;PFku>45P]Hg?>o/ob`_R;TGQ)nG'$pn)(kZSU=N=k&7t[rUKbLb,[#fo@O$3Sk?bCLDNK&rdhi+?iTEYp[luh5.pppO+6olg\6Jq>^uAE\$(k- %HMR+*a.'QAhgP+P:QGjHO%608cnF;Sa(p63]mTFlT0Coa5CL>Z6%=+Va5?mnlW51-Z3&Ul^A@iRa4HA2o[PJ)'D'-3k/6rNrVlRf %n)(m^oPM@CA1Et?./u,Cr/*#;qoLiJST08h\j728;oCXb#]_pn$C"o7%J&7ZB %of'ou;sV3;9::!cj)du8Rr8f:HMF\!(GB)WkN<^G\+JJ&F%oH(-e":CM=^ps4?\]G1-8gdoLsM>3rV:;kP"ECpA#.^fCTc'1-LJd %85Go!oAf%;kaD77Skm\"#.26cKY6F0k4%_lSniWZ5FJ+]:ZNnMj8!]m/H!`i9[BS?maUWFI^m?!rK)Lfr*8hloZ@"VIA/nk+0UaS %B>JZI?ZYg4m;qkcT#6%&G3:=#]OJJ=F3$)6S9)g(q1d6[,?DK+;jka&E5e#j&PFUaP]C&ILcG&,H$OBm?-h-G[Cc.aiG]g@dl#[j %/pQb1p#I"\rPd#Lc[<(S\/To2DB_7.-Jt&WCOQ`U/[=sDbmUCe-JBJ_$/LNKl+m6N`/u#$d5,5N0p#Kt1LhF[)D$q+!#UU16Z^/8 %I7>GO,=l=$&RBX7rIK\anB`Nu"c1)S$ODLJ)+tH2&Bb\s$F0gQK<.B$+FB29a=WV_Yh-37%9FJ&Lc3T)&0#f/Fc]1[uOT %9V%Kk9n!FJSC3Y"10kQkDFmTp'6_#dFd_(Pk:jq:c$:r5omFYeqM`#X@[WO-=VeLA,qSSj,dpaWQQ$QfB-bYR*4>3H[lEQ`$SK$O %Z7G@sh6=OS,EBG+PFqg5SbG>C85Jg0(Otgj%O>6(G]LG&;jbH8>bEhqKG[V.TnI3-DJ5i;d51oCVDuUB3j]MeN%ma6WEA.;7QfNK %BS&?Z##8l-6uI%%d%uhu]\#*(I&6-s_SPgBN9;XW4`/lmJd]s`iJ%%nJ0Dc@il&$Q/M,$Ujr9m^cWI!8o?^2_fJB#6`0(5E2^B@u %%Om1'B7@bg2,!fU:IgQBk88E+HH85p+0lFApL"5#!).rccrj3+"ggB.0H2\fT!QAVSA;5A]YMb,gp#I_q10E83Pr,`_!9kr:R1)o %Cbf:.T'hUdND5n`g-TCH@=hhpQaVPK[U$^IYZo8Mh4rdY[bgS4;P)AE'$\1ET0),>#Kpa^8]s9Z4'r %1h='@37fFhR:]BnH0&ap/Mu'+iokG%elrciCQe0\;_ui9oe]efR^COpf`%D\rg"i!R\iBJ)'3LhH^aO6c2EKRjuLQ(/P51a9pJED %2NfibUc9,f+;54AF-<5$P2pDI:\d8e-Bc[EUjEm*5nf7JEtYia')-28X4%\QD0]#d$`UCfjPW$)j"3u^CRUWY'OE'(k=G\,U^1]. %^VHS&'o]"2Z%OrG,gAoZ8W2RceGlXN&Ft!Zf!*N+d'D$)U1p<:7GE^6'ocui=1#-p?.HTCWdLF=jkHeB;S];^>7E,EfJN(e#9PY_ %G=pN;E)jcVK:d9IGc60()[1'C=-W0UBO96$Y3OfDqGq^?kh5u^!3=l_I@faLp5GCXXK``q5$.N1(/FcqIKDatOuqT]k/7AC!?N9m %b^&?4Qq4\;))j)ef/<7'.=n!WQ5)pujM`/3S`2F.LILB[Qu+rF[k'oY,7%1U@=gHb*mMJejb4=(J,ql";T*rn+aYQ5&rRZ]Xg#Sd %(:hLq`&qMV>?K)r(;P21_226m'B\C$1UEX>LJ)7ASug!)jh2S=f9rWr&#(u8&rp`,Woe,>VeJrUT;FoF>-"Ad=cXV'Q&7=3FXd_u %<9h=.kCcidp$+>>>]3TR(1);#lWDQ?rkO].Yd0gF87/UDIEkL^/M#Zs?L"_>dEenG'`ba9os/AgN`'lWXg%?#M/)3q"hM_=h88&4k'6Ig(3p@>M8f'_fV0\E@-HWU7YjTQ?&7f.H9Zs%UXU3hq'gE;%qDYcu31"RV9DV %1P&d`0)YC'#bgVeM/\:n)#>_jCG %8b@5/\c7P%gcVX?\[g@&YPYA]Y@#%-hZ!=&LC2,emJtaAg%a?P1S=YY5##WOZ+2LDn-_/%(H0QIQtNkIDqGPL/f(tIqB>29p?4=M %EB#`mdD[<^&)2a\%UBcXNBsWXLc,/CfnH`Y!s]l(ll\S!nrXD#EO`8e"$8niL*Xj%f`/L"R3WCY2N6AtkC^'cP%5V%1g:Y5hX86C %D97tC&;0Ji0`"&#mpR&\(kj$>2Xe*GjMe)na>U$:CcAtq"\ %?;DT.cSL'"oBtGX]@Yp[J#ArLEF]02T[^2)6\t]_a.E5o[s@oJ*8"m5)BFneeOPSnU(9=5l2aNt?i8pH&k1^aflUVe3cdPp@Ahgp %=inV=QbRmj_2QJqb>j)Z^V%3g]SZt&T7ceVN-Q=+B0R-i#`K(^h'1++#=(F_)buCii'e;cG01kLLW7J %q,JNGHi3"4RjU*iP38KXV6&&jH`l[UUX-Ljo1Ye>&q?(ba?7\QL83gL)OBs,+pSQQ8VekdqODhj/fa_tjrha)D?=h-lG,+e$+W\' %as;:uh,RQO865gLiAAAuEI_;c5<:1iq[5@XY^Du5*%n>&h"UFBH-W`4?@!+Z"/DX=YtodSfQ10pCrC&f4K^kJD'&E);e<48TWJPq %9f/Y^rD^`3K[&`>8Ggp6QL9D6bpldh"Xgh4Z"5E,RT6J2%]^W*JgRkT"l_q6^Um9ID2F53O> %>"&[4O$s#+c@[t+!siY<\@N-R^b'Br!d$AOpB0"*6T?jFKac/*3CcIJaWXqL.S!P3gfs-CP\$n;??29Timg/H7,O.^50\m7_C-f/ %[l4&,;/UAF"W2<gU_JAPFider1r>EAkDln-1*XWZl1'^kGEOU*#6_[frd0t %,''V4a4=&n4%!RmVUS:qg!&T2`[#$$QreW;D<5L]]3THq?t\o3$WZ8&)n3)0H_M79fheT7&tSiE(tu-`e_1kB]tq9;"fP=X`\@\?S.%U`*:-d)=8eZH2[sV`I#Z%;[c)oB?MEgoF1G\l;QF"cj]:>'>C%.mBkbGI[5W(^pG)LOaGFO %*iJn^R#>1Pqt`T/;-'P1IlU/=R1=)hW]/^:e#bRc:>Vm4XB+,QG2+;Xh.GC5AmK?'o`e];%^j='Aip$c0g.FHg>VhV5\M5E4k)a\ %7:FQVq07-8$n;)($m-3maJg+Sl]bW'sX3_L)iGo9`4-^5?=>&E"W2^Kf$dh:4`l34Bl[T@jGBgln-j\L%#t%-SAJT4:1ecelM5q"d2sDr/3Uo`m7C2]ml0bMTbes3KJNH>FQ" %jDCklgF?q!nb?l$^O4d-WBlZ*ni("US$7p,oc[ak9T\]XeoQiod5Oh7dDL5TgqWXRk*tE.G=VQXWSW#U1A?Uha=g_YQ:ZRg49*:O %heO-rA=ibkTD@OITKiIIJ:BWVj"HJnqJXjQ)i"CaYL2H+K6Jh6)a/XATIl`NUkQS=[04Q47e;\HF1NV=36#NZbe?d'm/7$QqR&'q %eGm35CWAZAXh&`lOgWdPki]#5At`fH=!Zs;"'^ld[`"r1Y?^@#r-OG*_^;j^2mSXWW%B.=XTk2n27R8U>I(Fq)DdX_[fWf"H_-/1=j_?4`8;GYb@9IPR[d<*#VQ5m.L+O-U_j1`Xb(I3/-*iP7:lj(=dFK1< %M"_4_a\*#JeeqTqA"qs`?0J0F4'Ipj@r1d@`i-h_ %9JDSH8T2e>&M5Ig/Z?^)e+60NL"2).4(_q0q('[E"1[;DDFaMaVLZ!d:o>q=Mi%Dqo*iVReFm7 %T`0DPTDjm+V57`K5m'DO:eStskHqO(En)pWUEp-9GI0u%(,H+[9$:7==q%I=['U7>j^?5i(5D\kWMO/jaW#LcPqC59\'^,@+D)H.l@l@DH0/3sMBG7QY^oZVBR %EhD0n$qN@;+5MkY-.uRd1U=Ik[Z%`BrH.-Vo]XHPsRs)A]*?6Yt8k(/7Lk*GMMAdqVRcTSp$l6C>/H[5<\o/<'/XA_YUFG,('^PPCk^2G^QqE[4\[NtWl?Ju0VoNVl %F67"ks'@df`I=Fj\-tnfM%Q<,CSp1`O^e">^a)7$7g)o*CRR3a<@dkZYZ8@+MRQ^-fA`>5^)ZD$&;.'+41P5YsTO.*2^[(![tj>Zhi1 %]7&.PpGDiJjGL;YRR@f9E5="*BiuXc-6Om,0,"L$SB.OuUUutB.RFl4Yb[[D=7B:4R`b.P.h*,Bj>'$clQldeOtOkEg7:f]JcW,X %iR/H-@9P-ed>T52hHdZ'Zl"pr@j01Ojf;r&=eW1]nX8Ic=]t*=@&^%bKdMU4>A+YRnG'%`JeGZ\e6?Jl&3;^N,,UM!jAanpW]Pud %9pMM[869]Oe4;!N"(])NJj\5eC5e3C$ktbX< %UdAk=9j005KJ4Pm)@64FV#Ca^GqMG=Xr#YPkbM29hC_24.GR!6*FgP=P"=SF),-JT&Jj"]d]GJDWY'M)ITOMVqft'+PCc1ckQ.kB %6+fWHRX$&:5ujl=16GC.Zlm[uOt6k[&XMg\#_#s^F/FX(6j6E2,rGOj7gkkA.cni3XoISrN/MoI1`3)c`kC%QUT7h"B %kt:7g/c&6=#oUXVA>D78BRTHc@/>tt#,a8"(/_p'-qQq!RbF%L&EH]<86(LSS`5@A(#N.`F5?]#nP_*(e,2nE=C0.5*OJE+V-Y;`hooaGV\s^X7RiR!us^4r>T`mc@t=l.HW5IV>2S %;@0HmG)l]]>mno25WZdiP#W8OLdVfpA#2cV:S@5%jcUC_[JTsQNY45+_9a?6>D`pQ!bom"qCIQJ(@VfUfrr$Bm-j)GoDeoXSnZNj[j7=P'(e!6QCIgi_gNF^,snA/Ai`k]QAk#!u_8"]-3fBA%aXd %GSpj&6*sF&/=FBJe*L5MQQV6aeOnDD"VP+J+>%pDb7MoI?9riX3#N=tFdd\4I4_c=1F>iA<)nrNOk6E]_8qA>E+h`(p9$W&%AAV4 %AX7#$?#!3ILrJ!i%:RPZ4"&\1-oilZc`'\d6b,0%#>?>;+k%^TEWr#-lU\rZEgLI0U+0?`6Sk&#($R.+N3bqY\$'ho&9Z*Gedp+9 %UiE8:(GL$=-\nO(qF!q$(>M[c+^@uR6*kP$"0%a.9Hca@dhSEo9/[H81__V; %cq:X$,`+_1os&8T`TBNaUBbk2<,/g,19Du6FjVPcY#fCg]e&0UOLV$N+-g17@jIo1Z7[(uVb:G9,Xt8hRnp-G*TiN.R$KttO/$VM %5HVti0oRs1[)>QTfrpE;'@P-@2rZSc$Y2G060UQSU^JAspg/s$nhEDj5][_NO!F05\/T6VtAXf]%/G%5A=Q!:3gIs#jsFBE2uL!.p3J%b#V;@4+KJ6PY@e)Z=N^XTMkM3;KnC%CaN'S)q2Rf:c05sSC&5X %AP06V^,Mb+KT33THo5MLF935^BJpiqj7+C#7-hPY'&!c3M:JNfJr59;(QX@Q)2Y]Q4?T!1Nho6_KL21SA^<[POIp&3,D=W\/&ieO %Z-_d'pYDe(bL17UTknGu8Qg<:W1RpX,h64?Jf8Ok(Uh\CLed?h5ndbn?Se)92(8$3?b-9.^FPjB3iD` %iCm&sW'Xh%/PNu4$b,@p+2I5o)?<@iqC-UI=+Ks65lTg2W(47r7Af8W"3=3BLf.ql`PG;RFY/DeNuU3FUiCJ,.oCD]cXoW(FiJFV %U^d_(:cS^VdoE\c?CIh_=`k8&+%).DeOrD.Tj@^m0^=WF+GbIoZa=oSBfd5hC)Z\7Y(l=f'XIIAI.HXP*YhJWO2R)22C6J_i-!DR %lb06dE+?M/uSE0Kin(@b#M:XM_8>F"X?/X:[A@M%m_')otX&`"OrM>G&NF<24ADYFR"-L&lEE7G/B-d51*a_T9$n %%I8$LQj"Z7HP-nj)qW:S@0UF#@Ec$gfIZ\jXtg>FkDG<\";k>M$[0hkajHV5*bH@&:53]Z:&.StbbMX.^;c>sh;MAr`N!q;d)iQl3>2^#O^eDX$ %AE15d:W!HkGpS#a-;B>Y=brKQ\oNCWf43D=/ms\7_YaaUPmSI$:8^ZWr9CAh)4\W;UU=MbL9\2Jk`31_`*-'_1BWhE+`Jsk/GruG %=F9357g,,m9fk84/HZS[mUaG-JRZ/S5@o#6qD7+d-Mj %%QjoGN.B!2)+6Zo(f8%b$T6pS"QunalB*8=RB\aA<7>4k6?61TTnLk"U=jYOA80us>b$(`_l"EL+a;+fM,;G.oP_UL$FH8$,]I3a %0KS"Shgo>PFsb*P6La]q33?V(>^MN./^4@V8=:f34#f[g$^JpN40]t50RWRGbFn#"gpfC%?%5V8Ld`+UEogt2HqejSGblO@?rCU# %dP$=+PTh%V!7KlL_^Fc<%MbBI;aN%je(6%:5Z+X+lWLVX30_9a_6'4qF^2.+>L44i$/AH^GEq,Q_DO,&J``s)*BIIQY`qF2_5)u) %l$%-0-*r?;Bh_];%O4dj]Zt/kXjfP<\B]2rk?+hG5*s6CC1?mm%?n,dcr;)*`ZoG'B+^PiE-m5(\YtI+_D7Pc0s*!:4\aS00'`:S %W^LCm`/FDt)BjZ5J0b5iZmD^-NMn70D++83N^So=$S[ig(!/b_kHJJnE@QcK#"3ZLP[R*=OSY2mH\/WgdRRV4J;&q?SXI+N5I&6/ %OuR^,^d\4a)'36&6sY:;(5JUb3dA6-RMAR?TS.1K=ZmA:5amPIY)(f_E'!7I=98^\X!s7;V+O+8:7"Q.^C3gE6ZG`!6]1YeMOoI7 %2(h9l(KP3!kIiq0"bY#=K+6g@Nc>o%E7abtf:UMl`$-6IP`Z@,I+(ZrJNTHPeP3s_%aAueEYWK"Q(^k6ft;e#TO;Z"ks0&l2j[X- %+OlTL/D.dli#o8E>A"!HZ;Z?Ii1_2.dVJf+$aATj`F+l=6Q4KX+uRM1NbqJE7a+bSeP9t%Z%/$X@?[W/t/o31_'s.ENrQ,GQ91Y %SU+ii,X_b83['s6K%;%RTPKOMq]^S35bg!p&9Jqn4be=#.hah!D.h9eFZcolOkjcCca`mkNl9k$?G"FlJ)J6(/aeKM)+'q$ljXhL %=St1(K+68Nab""P#/3ok7eZ %Ji?nL+9a,oiDA85.HAF>$r6Kj`ZN+(c!.KSj+Xm%F4T\eR1HVBIgAG:^+)F/1aD"MF`d`rYf5_ee`uV8EN8PoMQhd]+$3bu/-2@s %o9-q!b2"G894WgBQQ:fLjIdK.(pV_J>m4UrJ]QH>+WFaiNBkdYX]+ab70dLYCRP:)YEI0 %EO+Od@7p]<6:T["4cKU1!K1s7/63EEgNn`/mpQ,](868=?&GetA.2-Li@'aKQRp16*0LTNN)re2&BSs8\3h!g4U/6]iKge&c&#VH %$@,30&p8$%%@J.:F]Df9]*7DV;Zq]#(Cibsbac$<:G2c--d5u+N>?=V!X[!CjK#aHGtH%$*DsLKN]^bI@++B_185KBB?NI],iZFE %ns$F,d]k+@I_Vpt4C1Ka$94MF3dE(WsWCb+HRi&jQ%-4XhYS@S%>sjg+.Mq2] %WdCit'i:*f3drOm95.@Ehj]gp7-,Pm(KVh`.M<6-2"M8X,Y1uAgH8Aj+SBQ/7[44fk/OA_?r"bE1eaGWGf`SEUu6"*-'eTlC.h8t %m(./A$q+p@([TMOH([nf=7X"9JU7#-3!XEI!F=bc$=^(pf!OSe+@X'1Xr2!a@6j[GAUn6n**Z@_ridtPlou:kE=l7MaK]i-$M1VO %IkJ)4OBIq5-M+S0`5s6bBKV^93NZGX;$-E9=`Zo$Z#`Mc!]"O\.'8+Y02l3K5ol7U+pf-O(7q<&pE[mq?Mu3=307T=.b1Bunm&EF %JMl*B(Vde<]MO414A`sS@'?IZf\c,nY]fu`9OMZYZ"(5a2WSiP0&;Vj,pXIJndTjhYtm>i`r_)aD8II_d!`pmN)ZWZas!r^IEiuM %S=I*+P7Fj(V$3Q`:"J:+?e*LLKS-p)/4I1h6WhNqUdqh\LER((&!:l"^>YifPA3`puDbS@`/m %A7XYXKJo:FS*l+/Cr6#+T6de[4J-l3-7.0/-c]b@&UbqPm6^XldL#q31&X];]=1*)Y%MB_N)0_M,(`7>J$lF'7qN%W``Y_-#@;-1 %/[?o=1Uc-al$R1#`a-M>g%gQmkX0&B%cbddgDc1c]cFVAAaD4i^14"FFW*i:bfeRQ`:1r)]@Lg-8>AQGC#_.h>iqQONT19VmJOsZ %E#^$*YU*K!OUYkU]lb?`*I8]DQ*@taVjdpTA0l0\!uqe;='Gb-K?[iDNJ2nILsABoIUFDY?fceRLEJ?:)*to %XAk^!$+^S^pGWWe#s&YqF'!*;L+FC%*6]>(-\3P7#74qpo'cBh0F@-XXE2N/"G&sLbSZhb32OVT-QZlQHC_^d+=a[O*jA+RaHJ%C %M]iV4bSZ_F=Rg2hFL""OE`i,'&E9b5$!(MhcUlA.?"AA&&eAWP9kl.c[q'+5/5[E&W'`c.^o?S@7^%S[G]u^m%LJ&(b'CIBHT4;J %_'";um<&Fq5QXH==jllh0T8A\SC'>9E7::T"X5/3K?-*l&G)6P`4c)nb1[=e@3qA:`(ilYf-G>r)1m$pMDd@h30asCG%V+d5uW]' %9UN1;O[I&"<`U)pRNI.tA%&K7aeGOerM"2J7*Wna=$$,6B%rrAjaleX=N7l7RWN%&(4]Xri34@njr>X.+g^!FrG>(MVgiBCQjF8t %l&:UnnMAPC$W`<"P/nGBf*ltK'\G)f2?,mQ`&QBZT.@felq0rU/^.L5c8H7kYg,GE=U;HEJ6bZXd:h8f=Jj(VW;?`h.'!r&ZR2.Q %@'a-X[Dj0NDSb,nA_ScW9m3u4'd2;sZQ[c!!c77)4/(t:2%qO0c=[d^,[0"P5jnEImWG.P>i03VD0;B[8\!d:org[`+.4YIiU!P+.e,YNDfPZ&d!_F$J2G*t+HZQ(eg;I8s!dnUc %dfDGR@6n'q!JmN#r5u/]B.Eu-1WXPls#Gb/qpRV+iDuEOC""0LrTn9rXlOph,AWKmd:3pGaY2Lg485'g);F;f*VsR75/]:[a,W(6 %Yl9iG_e0l21IuuQ/U?#E`S0X1Y&"F'-g\QUc)KqVKJ[tr#9\l+^]g^0]T18&<]8">3RL,ab".R`ckB8T3t.@EatkC,''l+kgKpPo %[[8k66mpYcNJjX"FhKe8aDo!Q#>$gXZJ'lN@cD5jfH&hW8]Xig*EJVg,UD'S/-hB#k\/_#.8+,(\kKi7QK5GL&jC7@U&fNq!K:-D %7:r+O-#i]e=t1b!U1ZLa[W3qDN',@NJ^nu.A9fi76p`Ve]%l8'#Yco;/_Qgelu0[!,hV*5-@tbC#[cM7Y8ms<;A>uI+)nRYY$%(e %jB%I4\jFga(6VkQ7CQo-Cm#.a"ZrDH6S&CR[69^OC'MSa';p]g@>m!FSI%Blf(iJ>r*\N^<:e+SK&K^R`T4;&eK?gj/pKgnV`89.M=).S;[jW1TC98-g,/DdVSleqN.3-F_1qAJHs %r3QqtX=(qoau]=+\`K`3n<'c-oH@bqeYC1MS)YdH[$K`_;o!5=eNe2Y8`J:D16?HSG>#T%*0IO;@h0Vh9+ClsNIB]BPK/.'/4kN[ %3Ci+)3m3r/7JFI6N9!oW"X,%q9=+,Cdr$bU,<$l5?d0A0.<:1K/qPJu%lj)H3Y&c[FqBRUJT.nKM'6:*6DP>&Ce_2k]KcP#-s?&^sHfuMB:OYc&VWZ7tQXV2jX+D9;mgiOW0.#:@3\k58/&75[`NmSJkM%=RVe7Da*WGogS4,S[d_=Op.b7%o.AKHWL %i*@^**dte:c4",OJr&:?)9BhZ,>\!6@hrqIijq@2**&p["?LV,=_P=>+6T:V"b^j:<:7ON@]cM+3+7(2.X6\gt%D1f.B!eNr&#U3sCf2\Z4E^h(2;K>hZeS.aS((sk_0.VA9AnVE@\.%n %ZDkj2&HlJLGZmfahK';CG`e1u!f`Af5.AYB;-;d.^SAXBo*$d.VZFm7$HO>,T!;a\*EtDH<<;1[OBjoVsdo?N%?nN3j:uL %(g[GE^eG'j-9H)j642.or?fcs6G1q?NR'Qrh&'G=Qq!Qg=tnT?"&iAZ,D1a(!@6RI)4k]#:,Wbu4+0scjl9)TitFsCBp!N'%1XpI %Qm\u#Y0LY9Jk#$!?+0$_^i`1s2'6IU[/cAaX$@8^$$eM(>1p2'3H;.1>1p1s"F52]AJh;^'\>ag^,mhaB&$e9Q`6bS&<1/Np5+Up %9S*#U2h02K6R&^J-:nt7S7K^d:25k=9AgK*P-_"&6E;as=:*T[r6WR=fc8$6,["80Xl3=38ZFfj %,3tps5%uX^?TI;?N*Yprc=GP+1ZcQ?2/OW(3HDK`fIiRo3SCPBFU@aRCeh=p&5$P5V_4RnKu-h9V)]:Pe.>%ARU%+ijU1bM[&+N1 %V:Z:&ld\S>RZXt.'&+bLU'%#-#+u.XqHf\.@;)r$?]j>Q[dO$\%t&q`lciD5Y5o#SjUMfl:q)bMK-M\EpY]FNJDF'6VpL]s@!PL` %FCn1s6,-eai!pU%o#6A76Jh2KM\Vu2(l;Md^Y!_i>TlY^^*Kb=0Hl8]@'dk#%![PhJZ("4%"m5lX/3HHj01!U"#6ll"-X-K&0!,$ %ndHClH?#*f'J^5B!\(=?b;&St4^*e5!1U"N9QkhD<<@[_XG]N14LFQ.!!ph=UI+l/hB>\&UI#e%40BP)@8V'RPqX9Z(cRe/nG"7' %?"I.0ZEZ&nf4SO[@/QG-WUc%h5NXG<>p%?3I71(O\YL^0U)D^LT)<_(Z\+Te&]a,Yn*22rI!F#_let_%1ZO>s51^V9IR)oi!ZWs* %1_RFajr1N8c*53!;Ri&./b0(I=u,&o7&FV%r:sJoE#amMX$Z3#F/g?.]*f99s.ZB%d_f/%i/A%tciE)ug!q=:Z0f$L: %DejG`[X[WBng'R2/2[HiF#$:3@_l=ttGiOf/N94@K$!tIuX"c[]`c?6'F*@]ScLUr*H/3O08I^S1a_[rj %4-^D(!ODOY]^^o6C/M[c249iegtQMq1G6jh_]`+9^pRrMEnE;#b>mV`N5G,%28@:L2B/9+9WO)s3uo_P\(Q2:(@/LTAe+MlJNB%g %$AqQ%:*+dhoD!u&,2G9dGh\CBe0hkH%iK;UnA@2_/iBtdeM6W/KUO&c+?k($5qQ8bnC!ajp'8eH^V:a@3eO"C2N"H=/Vlr*@g\ %_lPgj=IZ\`A=,B`,#>a%LtgdV53oP.\9J?l2%4J[+Q!QW3F,S+UYKrBkA8@&8t*)G0N=$R+L[Bn9`J#:hIO=9H!-1Sj$\c8@c:c: %b;%')7D,J^RKJjEm_@d"B6i.9W`5QrPH1tFD23l;*aqH#9900q0j)M&Z?uM?Z4GOf_N@?a$B3UL/4Uq7\0"3N',gXJB+i(3!HOhSH\gcY36-^]aNh*0MkTJ'7 %EiK.LBbZ(r%D^-8Y?>Sd!&;ZnC][NEJG$cRF"N4/eQCB*.];k[MQSeP(7tQ*4\O2sAiTa7)hCI'nQqCP=DqD;9nEmGKJhGP*MkJmPO9"j&f;El(R#=8?[M?itZ)k(Z/F^q0oW2V,Z`-B7c\HYdMj`aqP%Zr.I4p=253ig@.(9Is$p`)J[o&)4 %R<37c=Vc"Y#8HIN!PU%8JgGFjr.1Y1O4B>bXsOdF.o*EWPl#UHRAA[ZfQ_GL17`3S354Z:VhTRXPQ6]SjrXG1R,/D %U4H#Kf^meUKjOlPV;,mr0a,5hhsh1RZ1H+HAs3f]]u_nc>V$\>>5,/:U73T\=YH_niLUb&*$E\9Q(6ekZJglr`8:6#1upnA %(0OP1L4Vd@)b+lp/i#=jOb177W[MBu_5:7-H%C$"ajs?^lNW2JL]H.W]ZAi7S8?BN2glkNHBQI*;SC9%X_h+d#Ce)T;R9JAhkAN$ %HbD6O$dW?tPap'Vq^oM;fSetD";b]R,IS2U%:$Slh:cC<(J2)I2:#^q,%Q:H]k3OMXK(bJCV:];l?`n`gNffr4o#1HMe-Whk8!=a %05J,4)l#\hR"g#Jh.TXjPOjV^SUdL\P?+>*NY-doEU9LX"&?5#N"D!I_`&G+I6cPQQj]]<*)N>e'BQDD!j':\'N3^_0+&6\LnJV"fSpN2k$0+gMfI4P,i3W %]f+Z1@b)='%<0lIYDZ5GjaQR_f0pl8ZIM7[Or_D1Zc!5m\?[D8/X!A3PZ4KKoLb%S"qCH)N(+m+EUk5"nGr!a*_q,oh"`%-8(mj` %CPF(HS1'&1:7S;%X>\b80-S2)Kb]YVdI,2aaF8#+2;TC+n2*U7,8bfU:n,o;#OF]>FUi3\>2P1#LO%9/F>su#orNt^p7ZF.BhdtD %HJ]%gE$a%]>\2dnn%nO;M:/2d(6Uk]pKuiDaXdV/q/OK2S9X'6-dG_MnbF8`i_>VSQlr#=ZB1A4El]Pt2>EH]Ok]PA1upXh`9.\D %^L"j2RXD:ZRObdm%U!!K24H'l\)lEan0selK3Pq2K]O^ATofnlbIR1P%^Y"e&7!HhN.jWcS.&=6Z*kNkjTKL21@f5in,(QBs!&n& %]]p:T\M&.ICgO'h#XTYoaN#2+YDi=d3ViU<^uoZBVd6nY^Vr%+!J=&T<0Cl6BfN`E4A_Zs:S8[o[SO`r:V/)b. %Ufp2Q8I/SU86[XeYcMqKM/pC:^>,fA@fP2pamqIDG5AMR=`ldAV %OhA`QQfSBZ5maSnd_PWp/rPJPMf+U72BVp)5P+)`)2qb=GA[+,*j&p+ra"7a*M1X90j<-`gGZnicaP[+"eO;LC5(Vo!a1FY087;4 %V^MX)T\o?ReL*\YQ#U(KDMuOLQbqB)X)4XB:MTA9/Sgbk)h*j'2:/-Pf(!N?/'J5\(XWoM_[SkjN*M1d=0j<-`gGZnicaTVV\Gm_Sj&oeO[rKq`Oj8Q'p_8M&6M3iIo0A- %(N.@hFk@+1eRY]2;PA"Vm'56e'=g9e^9*r4JX'>4r(0Q5S[>b73,)kSjna/U(7S;;TJL&Z*S4eB*K-=4f:`Fd;X'8U %Tl2+@Y^EK`%teLAmVW-DQF,\39fXIWF0;Q&ioHjQ6?7jTQ>h6[DM*YD1n_Y=[^D*?Me-e1-ll>tf0YP;h?-s=TTe_rV[\ST!>'OS %2YKfaJ"Ecq[YAQUfr:u_ii\QV_.C#2=>e3&XR4s*cPDjpI\d_c4_pJ"Q*eG?Dt"KCG%pWu$8nA09cDql9^bZdn5kFE8m<+cEr3;R %33?eHMG@=/>';ll/P`.EQCE)8p&/,U@!]'aWGR/*>i8P'nnK0OQiS>@ZAGU'=YPrmPhJ('_.WEjO@'FN9Ro9-<2Ya@["U_qY9;T[12Y]0BUCH29OPf)^3UTipGhXk$[i/>@d#4rQ=G:.N!"(ga %DZH2ORQ&TZl5Np8poId*$GC4J994"*n5ZKiPhS(VpA"D(,/*QAm<8qJC3/"m]VqQ@3hJ %A)Tj&Qg3,NW*h7.o/b>#GAL=HYft+Ai)BA\p!WcRp;8WZ+JN(QI#J9k^h1%Fr$A54,Vs %,dnAoe'opG%8a$([[(BE..^)Gl-LSW9;Po]BoC=&O;hn"_BWG5*!%HT`:o9Eh?J\)Dj-h)QO\%E)mo!RB@YYD:o %>>)N@*Oj""eQ2+Z+)^JS@q3E[h-Nen^NS@(oaU^[54Opdo-.9%]7l*t4;IHX`Nl(mH*+.?4k44:/[KAl`FZF[b=neAQ>YFEeBX)4c"Vj&B[C/r@=A"37l&ZO!hnm%D_J\mQi+B0+"_o/?bgs;l %"GPM7BXWi9CdbG&G3s+NBse;4YZu#mp"7[sS'kiDQG/p(DpA9KZo@5=bZtHYFGEOreiDu<9[kb?"mCD:Wf\ad,jX0(*B($#JQ_`h %;@V8qZ%WBdV.hO3[F=lP$%V4rDZ_*sA-!7p6_7m!4O!Nt)?>nJkfElK>ml+67B7hM%=i+2b8*_i!)YeY7+XcX@GuX"XKeBEK%[rl %?GJ/%*'_lm,equ;^9;\[a/+2tbA>p(>2bG?e>Y*N%1m %;JKs7>pDF)ZF4LCHu:j)>+f!084dA7VZcW(`^*[+MO*d\,CYPB.odG@HaT,ag1$LPZa!E7QK]:oHVAUR2CEb@*T#XZ=1:MYL03LI\MssIS.G2%fOAD/nk,I2KPTg1 %jncE_%]@jYd',(AVQ"-^EbSBOdV?>'DlW9f.c>+(lS\2pReI3j_`3gWCA+M91 %UT#]m[8ZeO^/^-_G3^ikqb%Ybfq)%"Z[;c&/Y$??R]W/,a87dVp.]C$>0RDV>=.&p]YcaJE=-Ef=PbpcpTeOQ$S!a=8\&SdI&l53 %fRAU$l*Kc6Ua@$q[XF@I<7fFN@FJs+aLBR"mGo\"rFOK55V"<6#)_>3n9bB8"JJ]khCR"Mhb5%8j*RupUCEmcf %BH;^sWf=GaVCeCf8qr*lM:lOJq&suWR;Em\Mb!(M9N$_KNOcq_2gC8s/*"6"r#QBlD;5@E)]7%ki\j&i_EL5AfBBXDaqVEF %_EMqk^mN-q7d9D!+c/gLQ&/ccnX]_,a*/:_HI-1`X?b$,R+/4:g[L#[/>WD-8?-sG#"-V3D5I&uRQ:N!/aM+[l4GoNhCCT\WD,1\ %DH6L4?Sf-GnQ)%!*]oZ-`tu:ToEstcY1*o[AX9KYAW'(E(sG`a8K4hMj#6KsBN`MpgMhL%R]X7XL$r1^G-='$%-3`aApma6abkLY %e^++iTe4a&Yqrp0(t2O?QodG%#*7-*Y_ITufp_VZFIk,U*f>e]b^J*ZGkW@MH/Ss7E&dB`93)%bFjeC&>AKY0Og)g#Pq%`RS?K'= %*N",$<2n8#Z#:oU0kopR6n8AJeJE/7Y6s@(GKqsIJt+BM."ig.)E#/[]G-mVlmB$M6N[j4[2lOei7b--8b2I62l'G$>:N %HD>p>!QohsQ!gqo#5?lO<4;k];S.*1fJZq?Q?g0Pdr/L0DW=&sZ;M.^gT?,ERqs"^2(,SN\cE/C:/u`s"LoCQdfCEB5SoKi<7amt %@^BeRe<:Nr:?\s"/.nYVQAU)PEK,H'\lnS$DCYZA*5/4qX:"S%$3F/u2LKhf8eeiF+B%of/imBdk'AqU!QodF4Mf5t)RG>34pNUpVor]>QEL%,A@>g_JdJ*Z/IH_2Y %A(9s_Sp&[hd$le=)]LnCa'`re`nGAP*k/s1ZriaO[?:3.Gj@b]r_aEJBOJKKE1X,CK8:mR:o?'+&I_th8EafVd'XIoGdNLIpigR" %GBb#2XO=D?fsVLeGdsA'#qsg\U';k^4LWSGn1hgW1]HZ*`0u!Y9C,hqZ"OjUA_l:DD<*:7ggEu?Ur;&t0^l6=Mn_875C@JLGOFe[ %n%SVJbE!`PIspd6a\\3\uXZ+oMW05J*O%sGng %R9SN/DM4[3<2,N(fapl,:I?sF7b7'3?e&RbmA"Vf58gZ+ %Wj4CuQHt:b5t7'gD+NLh_+NM=P9K?FIQjV8VS(j;Sc%S<[7om.45I,u!2?6]d5J/oA't*-CPN]Q1ts+r\@'eQ %BYlC&B?]CM-6JJW>#!\Am17m7&8_'s(F*OsWsU>YS$B.rh)te=cJd]0'>J)5OGUg*5GGir=Ka+J6_3:YYht0Ra4BN_4(YXV3o4W* %N-bH$1ueqML1WZX7)SD/3:,FT`V*/r@@rca<`M.Om5Ac=V"SBTZFM-(1\`J?G>Et'ZhX>f'0f8>"M)g%!j$n9d-#*r"Ah:A&Ccb5 %F:&t]e'\lbC-2QcZIGnTmc:Z^_e6$]C>jonL=Er]>Z:SY.FUmEmO`"fH.EH2.\dccp*N54X4W38)io_\'!h&^r#O9\5h#+S/%XU96KqNm:>J!g;\og4;l6h%QIH*"IFt*N3Jn(S$tl?iSh/K=r;(UL$0^Xkf_IOuPBg[i00B[B/Yn3u_,!.b;,g1:>l@foXpS %EQdL!jPCA_7fR06G8GBA[;,YMRBo$ZE+02APdYl%ZkdQo@JWX/scC!OP(XSKDA58Z@902pq2GTju+LL[up<"+FOnnhaC9m!Z.*I:&OY<_s%X?U*OM-CBu5&(>ap)DL,GML@)inn_gD6VChQM %;KKXRg;g%t($`pS2gnt'?9J]VW[BnC0/fTSW %qHrqVDKMmIgR8'/iE7tGHW^U"58n\8lSJXT$.)WZ$4'Q"*Z>gk"phAE'[XKc325:&chSc]u`ti2:S'Ka. %fW%*8;VgD;W9\9.C!\=L"dqiZG-g'c^\+AV.NESVF6i`"FY[$P;sS9%2B,`R>WntlVfC54R=d36f3VK^h/*j$`>LVJX<68!iE5#H %C:i0-Ypp`oC*0?SiDb:RDYgr-I'-SKVPUN!56c(!"],[[3`FF(D'a.e%3epOZn %rC5b5q-N*2P:<$AHuIbA'i#2=UeTVfD*3hnFk/m=a)RunBf]HMO0hbDX_)B1>DOgMJ9NCjc+t++7hrRZ,B3ISq%r:r+5ZR+ub1QF75#o5HD0h"mrD"XfaAi&L;+\=K %8ETH\9g;^"0&Dh[)ju8L2]Z2G[>nR^KB*4s8FECrE4,JX5P`5L^DN8dVg,]s %/#dCSY("q;,rW-LZ@PT\0=uBYK1WbCm5mRG0Iu`V?\.[b5qX>Am&_iV#K?4FlOL"5fS*d_,C=cQ(b$d"2%Ou#Z"?5)__b/><.jf/s,"'Ac7mP(&5^SuLf!]1ae^#"3a!:Rof%K)63]Zrt/Dm[!MJE,LC`i:t& %#cW$B1Vu8NQ<);&NuKDsRYTdP16b43Dnq/LdJJCc6lEJB-1?!s1+Ck)H3dHmYaLH6!'\Y6hidE#!>j=7,u.SYlln*\C.*g6q\;&[ %i0WckZiT,rA(X>fW1SDTp\h$hYc67%ALuT9KY%JY'=K%bQNX/^e9&Wt*.[I>6sDF[a;nRh39)kp?#g'j^o%WO#QQEGFjbA`,-^WFDJJoN=PSkQ(rb.WR1u0h3oe2P;8A'^$n#o/#?Kd$/-'*ldJ*"DMbBP\sbEE %('A?`-5ZlcQE82/`E3Z)H/!MYe5"a'dlT/#f$4IHUi!]XB@;-[>G5d(X(T+TgWm/+?aBsID4/_-`(DeJK)I%A]Z*[acA6R]>Ps85g0krnT`n*3mEH2I%1MUAG[?gDd3(l![)P %nPNn@CDBS:dp>c)V\Ro()ob1.f.$0.k+fYUXYD5,[-UCO2=*$d@A?js5$I's@c#S>Vg"s&XEbQV0DBRZ4%&>fh"7XNVG5*)3OCq* %*RaZ!6tHH6;;!X7calD4XCBZ7Oes+4e4OXX\*rY*.q^T+qF@@71M=.d+;95AYiY;E-4OOEHDL1&$H%,!,i0"M<:.G\h,``\?E@mU=IuOgT)En=`m/5Spo#Z+?D7G4]W/RX)N)7VNlN"+cjI@U8E2TTdku %g[=mgX=>=[:"X,Elh$P(0'n_h#om[$%\^/PjK`?%Kf(t1E,IpGhqF)L-i':4WES/;1uUu8R\ji3Bgf@f*>*V4]X0OXif&pf7*EUX %CR@$>m>..D]q1Fc3MV#Smi(TCp0a]8L>#BM?!GppDj`GVIalQgd!Rq5gtb,14r!)3.#jA_<*23pUCl6oc]`rMVP75p*icLNo_2k$ %0]ID>G?p@ZUH91V0d(dX>,p7XR?#&5=Xk&lR#+bA!gCKNcc*ck:PYLeFE\S4KD58%&'':q!MfOe8hIWf+89!-2.VbAOnk[!-eTT* %LUAd_+MEr(!-=2kGA3iJM`@khJ(T$9mGrT3m2L;*&,;6I7"bbqUOgbbgWe(LfDlJ8qPr=?$rD`:QFn-H`>G=cqYS1U$bU9I6UT!E %7Pfk%4:m!f`2+H!SpUK:]5M;oQQ8(dI(hZNXmCTj5&rgSpJ;of=q"jZ,K!i#J;4ScNcQTQ4gVjtipN6@fM'[-]3*$A %!d[5HSH4fI$6u2&+lD=bBZ;Ic0ldtW],ffZ#T4i$RgG:4!#GGmDIm2mPSjW]"qcEKF8h77s-OlaoQLLgOg76r"MVlLPX1Gheof`p %o_(dUje6:&3sF>/_SAJVfMM`toDu;k&U/HW'TXe7)g`?.BR/.m=_1u&oVNM+WFa6qpUmt!gPq?9*5@VgplH`rQo-t2H:QP+-i4Dn %"/i,KhDMr-N*WfG>e.nVae@8\J9AHnfa"Z1fPp*SDB/$3`h+;b]Q^8Arf*u+E!s5WjH'+UaY%Mhl\F%h %)EJFV9u`To"7:n*8Pe;,\`_'_;j\e$T![TGC1IaYRU6P.CCJhl-R%Zoc[.DUf&FWkDsr=d8Gi*]6;D$KeLu8iW/j$i,?WVt;msX> %!Uou;pMRco2rK/BhT=Q6"7F21pVVOY@DMiU]lU_+pY:f3mY:i;_k-aFbl'BVIN!/i%_*Sch!`uZRJUR2rA*;[*cO=S\DOc>0)*P\ %qdmSA4Q(\FF2*[EO#QUr(!e_b4\2[;t,?Pe]\32"uWAli`EIOS,7PHbtEpau#(C"%q %%Q)lF('[t1liDop!Jl@/#_N-`K)t2j]2ZtaJXZ04Pr=6)JY)04+:SMt%0dpb"s=B[TPs:872H/c/e4-"#SmW%ma;+aK)mBQ!Q]lo %aFaNWgY:u(0[b)`T[uZ;0[b)lf1e?gJZ][W2Mu>Oaobq90@b2jT^,dOeQ*U(nj(go#rtf5`IY0b"2-UE`IY1MpZT1Ncuj1Ih15NC %0E?NJBC!,kcugqg0Go,6Et!-p6uI=%=G\iA&ZBqX'IYW1!P %r;]gAPXi<&UMiU_BV^=X((F8D-sW`md\Ke(V2^"+qo_9`L+*Td`=\t$_A!3AqA'N=).4p=9R2:?%l!Z.Y(BT9qI\Ia/%/$t*!"@! %,S"t@\maZE_l0k@,j"GJG/a.?!GGm!2BW-H7WFWq%aF/#8R2UK6:YAJ-tZ<;C#F,O8bG:RWHh;)aMf)YfPs]%*g<%A&5q\::MYYI %k)YfkZ$gt!#5[90A`WQIUK1X;?8`%]a5Tpt_"o-@@,4(W+*.HQ;6s-TVNoh1UUH4VZpOYW^GLg'NT(q[fR=aHihR@6%d#b:q-N9[n#Gu8CAPN)Bak=,]SkjNKL:PhnTQRn7KVB!Q1d]nCW3+?r[&Q#R2D1(mb%C %fPWAsIP;$PQlD".I=YQ\(`P[VLCq`>#3XifU`0c(*t6*ok!nC;6Y/R/_#U>1BFI.G0L5Adh;VgmdU4auYW*Jmqk?`'0L0>+(aE-& %%+)[RPW0SS1`2/`/<0pJLWUrE'6'mrXc4pb6lj(scpHXH::E**r!8?&+`[ZYI>^/jf3h2q9Q>_7%P[Q-m^6 %f^Zc><1qd&iC[Ig<*NV1OMp5L7RDBA#U=j,oO[uKHXPTI;oY8VJaVd3I5[,@2J?hC7!Rf/+E#*,e)KW8FJNgOEbf.>%FN=l27^#) %%belc%>T9sg0r;n'&W3Dn$9#8*-JbE;s?nUF.r-+i\:0Y5EUqNgCg]Dda^+T?(!SV[bpIC*:WRSe)`,36pP&_Ed$/>)6:Np=`%"? %04^f\2BV%b:eU/`JCQRJZ-P!hqD*:sF,1?bEaP]AEmp"(H"csWP%Zt"k%CK9Jp1S:*UB*?,T2og%q]LD['Qo]\>#T'FL:>]7OfT#7@%5pgfT^VRDI:D4&*qq;mE5K8S0&CC^.:cY[OZ!r;:/Z!Po[8V/'*H* %bu[h]2"6SS>o=kZV+j0l,dJp5$@P?qrfH48ANE-_N'DrUrORLH6IUkE>luki\[0bb6GO.6ZJY;[02r6V:/tf"j^qku@XMS1qD(-I %#8?5.L71`nOXs.:W58;kUm'\I2:V'd$JFH!jD>"k4NsqR4>N3;PBnSUFjkX(>:+kKM&>P1F6M3FMQ:@+][H %qgC=DBV(N8CnC<2`#t3=;q#aphbc8hi<*j0=)n.lc+X5b"h_* %O"L7P"8B4X0rQcHAhu^U_k&71n#N"PJi30dqD)f4gaCt5msFn#9Y\@ufo'9uak!;]k_*h?ZE8[m;J7a'if2o$QE"_)MYf/o/Zj8s+)I/R\e0XMd]F6 %eC(r\:e_B6[?9_$QSJ*n+gLLZm)\P)EhS>r(WV_K#*:'kS\&+ZPd%3&T+8QZ[1?!YQf6Sc)NK$6`tNB@_Jh&AStnGFdm33_oS)+ %b>bJ[Ge\:mARt29(8ah'g[@3".d\%T+t`+5M*CL5rWT;/Pnp0Fu=GtBEd=ijk>kAK3a[Z,@VaIU5>HO1ZFnXh<* %5L_=I-*`ID1tH&>0A3Eh57lBuFY3?a<[TkmkTK %SUYUVDS-ZJ,+81q/.21Mofp*=pT"gChL0eCmWUnmR=P+K;>\>k+9%(7Z@$`biVW(mDsc&L7h!?;Un8^*j#-f8c[S!'J(U8E)P8YA %ZUI)O3P2>JeM7A=ZKLrdr[ao*i)%$#qW/K]n9/*++^],V\-H9nG^$s[%e^S/,uJa>P;Pmn4LIDHKaCg2dlL86e#9c*0Q@)*^)!-Q %\A00$RD^Qi!V6(?5ju%F,f25p!a\LGZIHTgO,Ag31-nlse*;0&J6']p&Y`ebUXrS=[7Isd*I5<]!Y.enMBs%LCP[:Bb2TPn]tb+&WlVHLaR8VIoFgq5V#269rX=o5YK %(#oAhfk]9K)fnX&-k390^.i=D:BS<]l=a-3(hRQjU]1S[NP!?\,fK6M;$=I.m$Ap'd3Pi8i'Dmb.]j5j`(X68bK`VVTrXETAuui%]Ig6&Pdcc)i]17Zd$RqBZXM:9sR[f6]=Ie.G>mqd>7O\16t>Y %`4#"1?\>[n2D($'1"JdWke'O`m$66MUrle@foR6Ih.Bg^BgoCr>6%q8s.aP1JJ1Gr6;-:Zt$B1iS"-mF0b>8G%85;!2;QEg4a/`=annp?cSnoMTS0fWM/L5uu9<7D2!sj=pL(f(_HTF>f %Ada5iR?^m@N2kgC^>l"*!P72V(#9^3('81>ZGjm8Ls:*G$5QMrb1=(Y^.kHnb68SRn=ot`V#XV"?NR_gITEVe:9t.*r:6Jk&+3B\R&Eh5#+!IKIhr\TT4s4KtC#1.gg0%ZJLlnVqSq\qMrRFSs+?L01g_j3JB"fE_9#/ %&pDa+E\XR#7'bh.U1L)U9uRn9OP`:d=L&bN+699O!aaoG5]SD)8RC0gs[=4CjM;eD"0NBhYfoW20e;@[J %j;@E%X.N'l[%j\n7I!5e@A8l>:SLNp:D&u+\#p,@FA#0UJ.>0a%CE9IYI&j9c.8dql-,YqXt4S3J5PJ5Xc:H%3C)L:NIhj3e?UnO %X_\PqJq0\Ng!&I0I0-cqn`e]%<=gFFf+R:0J %p[/X@>0EFWN3u:q;%tl<!+i=Ck-/C$dG&!G,MS9@WOm[IW"J>,*\I_$mUNabI1R3$??5b+ %03^fnrNQPKfsr."TY:--pt,eb2eqtEhX-%c(ieO6Yi]"(JPSpSj7huDF"`)I@6%;m=a=qe'Si[p%?8!hVY[sR^O84fFESrZDO4f1 %nHEJDPp9O%I8F'Rh<"n;7CP"3hfbtX]lHuRXq.h+M_!s&\f9$YDaBU+2Y`(KC27J0b'SH==u[+odmp+^9F\0VH>-(lf((;CpZ(lB %;F[0!:"Ja]5J-NsfkX=oGGp>+='HNMcOdJ'mBa]6E+,T#[B7k'`HCZ.?a63do7hkG11!tPRo%^@$=E'CDH$j7M&_oKR1jqO_YAM3 %ce)_/Xgc7Yi((Fs=5eb3A]C_eV4l;B)n[#jG+B"e_2eV\e:_]7&S.G,d:h$l`05PmUSK_(Yh,P.\!l'Njtc0U$/#_mY#SiQdZDt` %1_Z.RQF<]Y9WJN>]_i`1n)_*-4YUT*gOqXe8[HQKp\\*/Rqjk5ciA/%(VX]NPp_X1rfAb?b4!Sq>\@0I!pd"!I= %k**[d(;e3*6B6AlB\/3I&E76nEIn(OGdE=V!\]]U'- %dF]3b]b.S7,Q%4[[O*I]<"gm.Dt:cQIk]aMS=)?aD!%kUB=MOj\4PO:08_gRBgB8`UE3rnfJel65Q!J3f%=,S$t7l+P<6-h`O)^2"!?_u3Z@8@$7qceo+M't;T]DP0;l-Zn;pl%^2>!=)^X$UMp]t2D]&\@]e1tgi3K*h.n&0@b5ZAmSkDK1_i %$WFu_T4`MC&3e,>o[ZNF.Vcb/)(nD2d"KbC*oS0*Xk"Ain2UC_)^G3!/='3rL2M`hjC22I324TZ\jCPs2-r6$%ZMf9g:r%VHZNTF %o=DUb)L0c)VKR1Ff=CUj?9BSCQ1`/ck`M3A%>QUP7qX4ClT)1+3b-*M5FUp1UYLPR%%nB]F0l8j7=1=d`UB-BA!D]MefJ+bA$C:F %R,;%^j%AP,1b_FR\7Ic`&gnm2[=3J7^s(hTs'Q%Q*7'\s<"N2XUlQ[Sl1*LR!$3RgV\ko2q[nU,BT&\LE0@-gB#P1>khAiE#)mKT %0R?FJV\TS&fii7O&?s'`2[H*FR;d54fs;u=:X&#g[Kn\p@TCM)-ut`&HIMs)O8m0g(X,N:N^H@Dm2=!ekfttl"8EF3XY!S*q:o\V %$e/j7okp5Rl[%'0@5CQO@H"E5Aa?ighf2DC0ei_bsbO1MjICor?1HK#1!.^01#>%q`iZ#Ml8'N6gI$X.ZKh>69FIi1_I\@g$Z4GPiPjt7&%jUZOqqe**5O7<$7rWNcC %XBSVd$hgBQCQ*o3cCss>cEO*Yg$mgdYc`Fhc=(!C_cJaKoT+DAQ]m8m!r@_'4I.u(@*YNd=Z!H@h$ru^LKk>6k"k[^K4+5NmB-tU=$W&;K6rtoXUBT>)#O"S48jFG]4\`km6U:-BQo-G*iOb/[lpWg8MC^JrA!iNR4#Vn34e"E#P7(i %oOq3'0l:O<'rg[QS8W#TaY7Z=$D4+qF$E_I4@1>FmLV$9#8[h].,45\II@.Pe;1WYnHjV1$l.*)Eq='cG^<'q[tL.gnRpLR3IGSF %mIGt]>SA?jliq,7;Jc.l0uEU,_6m+m9c+>g0?47/kJ.;r"6`,33\E.@md^')bdUF9k/):_J384a0:Z5diKk(m#PZ7(I9dq2dQfT? %*G7"Ce2KDO*oWk`a_fPt_>`eg'SjD>_EQ"5"(+-?N`?H/`=8!I)<3l\47E`@3(I*J"(J8?R5h<=7Z\iiN=`6*Z^/KTp(P2jFBq!J %2st2G77>C3RKs"g1cCeI6J8tcK%S\!9Q6.-R^E71M7A20("pJTf2;a*>\O+B9Q1>-fr(qP"a"mg4C8c+8*`GKO@I&6\1ck%rUbKU]\-E[KZbO.rVT6,b>;R$3VO]ek0o,nGnZT4F'ZOtpZHg1)URG:On]mao>kQL>pZ.f %p''EfobR9#m9R']834gG&'4<4HF=oVk1t=VPe-(=$T75:g%4O9h%ZE3,Pt?K$4>@Ld6CM*kcsA./ogVBoF\TUHW=d9W":K4LO'k&M>7%*Ldt"p %[-hNPL#_&_h$j",+NAL`)bccq8A_h3J9YH:%d=WImYD\r+;pa_gkjMA2@9]_bd[m=6:f))90kEY^,64WDa0#kAf](thip#Eg@446LEZ-e,730@ksdFMOk&,bqL02/Cb=>9Kf#RCs% %ra2V1'5oAHAqp:>/Ck>BZOZ!b*#oFXQ%N1Q1K9*OUS+*-DA8aHK6P`rrOu.]J4#l4b`K^eb_*/R.M'cJk);%&TqD(bn6LK4LTlbt %H]"l5/NVG+^_;%.m>+]Zqk86.'Nd.UYi/mXq%'m[cG6Qgob!8/#V&ld?ko_r#9!t(2*P\g&/T--"kSRB*mm6D&2GHn&cK[QW"VMF %/c21`JD)d9jXPDoGc]Ck;<)\dp[.VGdY+(>dtMab37B7oS+4*n$:i;BFKpoc(3d(*5$+("=^9"DQd,1<\sE`pSm5WR,^JbX0DZ=, %o_?-$S?.Wg9,Qf?EfZPBq.tRT^HJ!-RMIQ4"#3iONI.+^%BTQLPArb?)eZKbj]ZSPHi!h6pZn3W'Y"A4IW2cA==[>E,CVj+!PfDd %`LrNLp3?YfW^+tcdM"Qf(6&7IX%#SNa3Pne5h.2!,(c]o'c)]V_;XnS$0U($X*,RXY55R^)9_C/1Z6r.1trLN5uWlaKon+Z:+qJ,Dc@+1#.ngJ""(I_5D:@QnotQM4sMJUPZMO?VGk[h-5!IqAAr4oWKZ?=psI\VmFS^@#b50WZ2oc4uSp7mSA]JfX-ftH9,jd+0B(UM7()C]F^i, %6VdnR%cc>u@pWop?KVCH]K^G5GEJh6]2U\$f$u,'+,`WROSu>JeZDX2eC@$d&s@(d\3.sq=ibQ`WOm3"C1+Uq:ur`d;dp'5H+mkJ %g"Hd>jpjcHYQOQdqYdmOLE"U)'CB,`H(Pe3!r&gp[R04L'%Vj\S$;BQkf47,f=?5c!'e]Z#/9cGcAI,AceaPIlPgnP@42"$`-isT %Z5Teo'BV0NV8U's$rYdQGE&C5HB_I\VL!n?iWj)^btV7b_"H92j7B_$Tt*1(Y&Zs3Co^#o`I3L5mJ/p?_`\#_KA$X@\gKUjk`3*h %W**S0@2E;g2G87.:k*itdZp55X8LgN&"_)?8bHct+9)U>j#-67H@?^j89Ts:6+:Kh?KtAu]F&gf0dBb,JBS%@FJf')d2IR<$j!G# %lY8Ku^fu]7$\U2+m>ZDC@HH^^YD_A9?,&AumSCs^CUoRFmg$G@`fsW$`0[sc:Ef)?U?h/i+]:Uq&KW_?ZO%eL*kH;,`0gqn %GjPO]i%gS8G^FEPEEsG62gLUF)>ehf:SS4AF.IC8[9^MNE8f,jjfXq:Kk\D`n,[M>Q]4Kc6FA72=Ha_2^UNSS^:pMXg?&S\9_4c@ %OI8(j3FpQ=2"AGE:80L\oRLg6iF#p:/aK%t?O-PL#\a:J5_A2I`KfoppoAImMpu=E-4(8'XKaGb&`*MX0m@R5KqYltN`,BXIcGfRXCaB_Rn'u/rYDdqiF$a;O`N@0%Mo;d %:"]7V)ijC=*rK!h>2E@^Nd+s`E9E^8`5PQ]E`$#MJ0BlHei$:^h>GtZ`hGZ+9:lL]%E7M1!QkIaKGjZ;(t[n$b$'.\fP'%/k&E]# %[`^pRU3#/AU"MN"&ApLgCZpllL82kDJEPJt2]H5ke:_TMm+4Qd*KLh,pncAV*T0[G$A6VH3;J5pJc/0s',P+\9JWDs0_QN?5M8;Y %'6Qb]kMuO,51C*N.N"C\5>k7l:k`dq-ntD57T=E2%cOG(YL/o5,C5IS:]`)MD'e0L?[r+HIS?:uZWG!fZA(Rm`V=POKr"kWm.+0p %2EW^ja;m<0B(s+u-b?o`-j8'?U%Z0AJ2>fEl>7S`1I-4O*g`\\HtKU)4A42'&MQV]RAVkaJ&7hC&Ia_Q^T?[2EIGLa_MLVuR4()J6TuseM+ItlkaQN(Eog/_&7X[hE2Ji)YnQY54>OU$_([gX %6=,#S;9OPm)VJ6OV2K$*$IiXEO+%JjKGG+lXV"fOr+XOd^N:icOPI9M:cSVUL?2r=c).*-8cmohcalB*::/_5)tg!oQPHA<4)QlU %Pb5j_mokS%'"eM\n4_?b)XUuMDsDO,bWP>/T&d_L_W)PqnOiF4!G#P)Ba*9gVrYpe6E5SoGf'6%a3]SS0Yo>]rQ/L_Q<+chFWTic^7Uh1W]u3fHC-a/e]F]2VK5k,)BUS$c%Kl1BOt'gdB+S71TLE-?[;4\>Y:Cp/m@iSE^a%^9S'ekTnE %AugAQ]IK2qn.3'Kc`_)b$)_n"-Dd]\"V9]Or-ThbPo=G>c8Rnr#E=2@97aapB]>ZjX"Ysj55F='f<`7,36LBm\$)\V?'QK:"P+s> %S!Ofe;8j=r4o9CJr&pWo@YYKsM"9Z\;'KEHqD.c=o57^h&,:N*rh)6Tj#D[&tE$24SA73/ig6fH> %s,[md0q_WHTHQZ2*jfrC/=&2g$'fLD2*s#fl/I:=m'Ru5DgeBBBK;987>(Tn0tIX6fF]X4NK=JYq9^IJ&D<&jeqgknBuE+(*EKE+ %Um&q1^!t`O.Pn%7g5f0NRFJcgE$bZop8mHqV%G=L7?+bWk.NLR<&0bcPjp+biNrt5cP]Od#qb?XI=u*fmZUh,O$P)t$f]A'BFtau %=cg)+F[a*0@t&l&B1>'5i=u@-GS5N\:djmKmW44TAP[ZZ,c>WGaH']Q0Z3t[/qs>J8L-(Z36@%[)k!8Xdjm1D\ok(^:rkO)lIU1N %;[_sHqVVFU6A'FaHa:FJ:?XS^gf5=g;uK$BcD5CdH"Xl(_S'6Jd5)A4H0PSmCHe^E8X\$S<$!Xm2o^U%W&FHVrf.1TbaW5iM\O@p %XCtujWV($;Lnn^8AC`[QDbE@dNW]2L`5397Ld8IqI#N]!k^QpXN8)Uk30]@'uOl,lL+5]/GbH:]j:K6kq'(JPo9]nmc;nVG@Y3mUE^K::D#!0X"j![BjBTXRH[H69G@Ci=*JX>YaqgXFRt]_4e9t %:L!p6J2$M@+cc6'#>ggMCW_lhdl!rQF%ohG582H''RnB9=FbX]L@!!%r!\XX`j_*>hnP_doo[CI`&enBQRY %dN[?$)2Km7D/]mD5#*L9==!=Z%l=Z'IGZ_[*O7s.Vr6J@$An\lhfH,/W`*t#2Zo`G%_+k3pb<='GZc7Zek`\e2aoK@`%;i.:/(RB0Mk,Q57,D-mQ!)Q,LKQq?X)gEU2,pXJu'm_8mkm? %V,E3FGchaE]ElA'J[3>"';8Jig$69_Y=Gdu97bh1No#!rTh^A6"Z4S4'n3Jh:9(QX!'n<3\=O$BNX4?H+iJ*T'J<(92";il1Vu1q %$@H-d46d.]bPI)EZY/ASp+(gL=Nl:DG8HXs:a.VYKJY;S&8h?`ct9)3e[u8VY4tt6j%tGRLlAbNO8X+DY$X5\\$PJ5jB&i`'NeO#dVb[,c)P!EfJh.%I?dd3]uBH)2Mhn.\3AY %!UFNO0%kcMWag'WQIgT]$3q1d]n,($.tg.%(5HbX%lcpA^YipI8^$111W;$G2goCG\q5q^2I2Y)PCII2^gcFu.M6m2cjP?dO[F!gIK.LXK:Vsgt?]1gP92KEca3m`;$0b'#j;E %"7aAO6+k[.5;t))fnA>OnF?kL1r(q3$c'VP4N,a9_?p\0M$4o,eB,m)EOF3i>g%s9L#,\NX$Jp_GJ3n[cH-?JQr^>Cd-_#OO=-Ai %]4)pSqW"-5Ra14d!R_WDX+M\a`X@BWpG.QtE-:OVRMo+jK"W1K0&=.9Dr^6iY+.H*)N7/JOZ,\UR>1Z?G32Bd!6nq]FJTi;)6U>6g"A>-c`I)JNH8tnas%NfMA7c$epUH'l=7cSZ)DB'HZ=piTB_n[f'cb^;FMQIc9k\r^=\u)P6:f3+un!n"^n3^gie7`scMeOV7V&1H$r?I+[79JZ=g`K;( %f`ZbE-[.CT(aRB-]ffC19&i?ATF$aZQS8=CGF3F*3/I&+ijF#:32njUa"cO$6],S^0[n::Z^Vo6T\tCs`!_j3.ef7B9F8%5-$)TR %W3TMT>@!NYZEES.'J^o@I4[We4&'H:Whk(*0*8Poh'mRO/'rEikNb:>"SpS@b<"L!Zg..V1Ra^ba'_G]q(4l2?"]-$bbh)U_k9u? %Xb[s1lVr[1V/6p]\&G`AH;XnOU>ci0ZVQU/GO%bp/A)_RG"pf:O12Tq?6:O-fq@la\hY1iZJf(0c %^cd>urK!*!PTgSY6Ijg_XEq-Jr!:/7,Kf]?J&&B]>&\O/Hk5JupIp$.l!fA@RlN/q(0'Z\UNU:ZlCutVF8G_rQ4Q-)3ntr5`LIm24'VNQ5WVm%u?8S"pm^F">nJL(SI8,_b88n'=2FV4`EWl5Sg]Y,%8q5#Dg_XRK\o'B33m"4BW":-@`29,>N*tG7"c7 %@$(8]N1,jk7QKm1'/P!6Lb[Bt&:em9T4k[\VMC=0?LIo:#263Yqo04LOgp`:YljUE'eG_1?4*h))Ko2>$+mjbfu\$h608=3!7+*? %?2g&3$B6IF7L1Xji+jmEYroG5aA@0@dajdq'UeCjprTd]PG?3&7@gO %r6lVCYgYo*k!GI7'!U%MZ""S@or*;7HnD(.8t[dhN$O2D*DW2PpUC^Q;kO]5UZ!^s2In]hTk?+>V(i %Q"7l_%#@>/#]A%0g_K3`VkA[GQc3E1QFQ_+M\;\u)>b4o:Ea+m:]kCY(uRFGjKotQAmpFHPH*PDLHVA_+k23ZT$IGrk_@c564fuH %+p*37@iAtC\ie8eKhiL[$(:F7,R8[J6SsONW5UT''\P3M+=DG_rA[,^D,om'4K\JZB*/:.c@GkJ&>Wp0L"?8n+r`.8X'K;JM(UKT %[77q?E!N*JK+KY2L-Ta?EDjNSqpL>6F&oo.$rf="n7J/BT[1(bCEWnC%,43h;.t+UKd_Vib`>]?a9Q@^=;Sh\Xp.QGIjD!%T^A.1 %^aWG\8/LP=h5>#H2$P#4!>I?nKohObc5c;h]"1n;[7[UnlXmG1J2l#*l"=!#kY-Q.,/jeLSc9`IgKb]4e%s.)?Y@NmXp,YOQ_N>j %>4!SkNkN&hk+#5VQpE5d8llTT):iGNb20"ea31+s=NV0[EPrtQ:CUlpg-OK?17?EO+3MF19b$m4ArRHZ%RAUTXeADX>c]/!aVp$0 %;`W8XP,^inl6on[P^f)eSjRq7Ks3J]Alb=5,W3!dP%<2lq';%\S22`(?(>L?`YMrM(ZM6)F;4P_-Aef/8]c>s$PUBVTQse5"i#lJ %24@".D>_2i(2:fm)<(U#?T8J0L)>i,XCer!ckpTlBrk");Vp%$KH=HL2F,Lj`2"BAg)?FD4Ar%UQ[YtK@$nE&_gF9O,_+$5jI+o; %M-4HGG>n"8IU)/UqM28t>Ld)cU]q/KVqRHQPZ@QXI`>9Q8*eZB4Th?U5JipQBks-.>CIXQ"7+; %:!@F7(=j)q9$#$@kM*GFA%%1edK]q4KG2G-!Vc]/IS$@PZ(ap/O!kN%G-H4UL?cOWg,#ClG2[$Cl0*FXDtcVPBl6Pmbro+Te>Cqd%k7t`ho)FfC[t)td7?Ofc=ERUTYpa#=0gPZ>7J9!/J;)u;EX:M3YE%0g8=V:/.?-7OH %F*4d_aD$kbVe^OJfRY%;N/:(L_r#"(W_pE,@d0YEM[!G8d5#m0L"2k.QZ0&_#[ah_8jp`eR)G*i9g,6G4b#\]X9tsEA,L(La64t& %NhkV4-Goj%XmL7`\ejs"X^di*:QDGOIs$r8V]W_\XQ\%5j$5=q%^'XNN_ikX_X?t4M7r`;rrsl4L^N\dSZ9P0`=6MPr,>124D_J) %ag5[/c?n$&"s4D/GB5ZW4siBqAP&+@HNp7dAsoG*a@?NpXZmdi=\rGnPlMh1W@(]%]IXQSqktAfcgLRF*i`IJQ"+A79\/fT%3%W9 %JgGqgJ'\:fe13UhbTC+;>-=M][A+T;RJ*/0Qa!&OL9f]",\g"@QU\<2&"CU\e<7;`up>0eA %iRpgXkM,F__:&WcFo-UJ?r&K6BPgck8e)EMb"upq5PS_nfANm'6m!rDWM?UM*pD6'%6-3kS!rj(cBHn!KgHTTaeYruEM^?1jIa]& %l;.fE'L>sYq^";IVeHSUl$EWRg=3Q1[!G8#/R]m.(IcA+$55ldDK:hU/m?s/2,4qdS@-B%.EsuO;cHUW5!j#3jiWFg$K!7-&$B\s %ma`Ob5]LJQ[7$QMo4+\9Z?kM@f'ZZuVcHT"9\X]l=*(pT8leWbn3#aUI0uoEhSbZ28TF$Kn&r1\AT@>(C'Oa0(i;*>MOl(,pI)/) %k-^F![CM/<3")Cu:LF]HGo\C4XH]J_KK?NT*`H:qFSjic.t`'7-FN=oU&iBV!%t0WM^?6$dCDN+El`$MYV.aM0X&,/=.#&liqglt %8lUsGP30:!nYM@;2IW\#$K0UZatC#,"fC!SIHF&-8Y)k0>KFf6E6`?r'G;+%e^[Q_@3j[K(ECSt'd:H#_m&&3FXhgU;@\/d!2!C/ %/"AG+&=?T&nNVpK7e7$o%Yo^$i@lVZ+i)W62YVHIAnd`+LY_X6FGrR?d:Q!%:aU#A&p$Cj4h;I[oVmuD[&t9feFs2;]YLVpibYs_ %*MC'5"gkVlJT[?@BAE4dnq'NqQA!W\AtYAg6>R57F0CX$`e>_ED;.AZ/4DGQg(!W/EigE@X41@S!u[4EIrgfjhaeU9O&p8uKE0sNPDR[PS)9ugB:4%kn!&/FG_YSj^IO[)C`XFiFO29Knum%Y&4ei4Y'5XpX7 %`jf4]:<.(H1I@bA?W!@pnoS5,:,ZR#L6O)Wn0:+ %V(k9ZDC,DM8lNFg.M,rQlInXK,!;b2>6KoA.s\^V5qJR<+IocO1*)!J20Q3Qh\i50K8u?1a/_aQW?o_%g6qf=+TgVK@_@h?6PGGO %XC\55cGn,c1,g^!]&6sg4;6&adr5G0q5GCIbMS%M%2=r:T %GmjWYqL9fq!"8(Q-;GHL.a@_+"I:[b]S?`J_Zf$H&()rj-IG0Gb/X,EVHtKoF\fFPo6)G-joX"j.N5;/]1c/NuWIIR=ql@R-#f;o'8C!N_.[63T%. %o(AOlGY\DhHEJ4`cln;igNe7;>bO2UC:XZr3>",S?9'>B>Rf28'HFf_a.e$Uf-Y)#>]um=s_P%f0^+3HY#fn/'c. %Fq2Un_3,cbS9/kCMAjL$Y95='Kr(eeoa94bMl"]PX?Lh3nb6/r$*H.$!4]sf*CM#>pc>KDd*AB@H+PFOPphDIoDYSWEmcp0;3P2_ %Q2ZUK(OI#4lKs7#;WEe'589RlPZEJ@&iThX3jse$Ak=I>=gjR7I)(?J$^\;8E<*s@pF-DXt^%UeE\5Fn%54VM:_[^T3\0dl?`qugrj$c(U[HbE9c+U."RqBOB"',8"=co`L'ac=Cn1^:fmGnrs %6O8N?8a\V&JL',L15!K/D1uq-0,p9kr:PC1-A#SL!.VV0q8rmo]BQN3kTpQ8Xs:,rhI+$(M3Lm+G%ORK5fM8+>M+6:'GIfXV+g7a(,6YOBaCa:"<7>\'-d)'Xt.]J3sM\2=fnZH'&K*)8*-HQ6I7?20b`^`^$8OsK0dPX#Y.%No-QtV %*BM.)PltiKE[M'`;5VpR:+#UgKL4]s^JBO5G&O5Bl7OaXh?'n!_:R25/Ql)7a#Re$S/Mf_eoPh3"_m:"[]@'":'nk\3V@/^]G+?j %43Y8Y-3Z;\o0VtILQcC+$%JNLEYB47iHbEYU4Te"2m&gCQrR3lf)cGT/#V.IHeCi,b_2X#,G;P^Q;h:#K*F:W69 %k8@VBGk+TE9B1o`;M]K@2:npg6TE6CgMQ24+So(dcEk_%&u+)A3@sRIB$DmQc3V3]1scgIDkSZ[L]U>8"T[?*&l6paX/D8E;po50 %/f*hj=a$Io[?NNk[r,8RbEl,\70[r>"j,VfaZD41aJOmWk,8Q5HfZg4+.IECZFglJQ.Z/"b!j-9'*:=%6>OPJ(Fk-Aj/<3:Q_T&i %#A6_JHrdOJQWK&Q4VPsEk@$a'32?Mr-$(t*\YPYOgld]T*)HesE)(OV=?NCk8]@6[JIj/9]'^++4l#TVN.F9J$id$f5JgB&Y=RSY %?\_S!O\fGu+bqZ;RS5n/jJ'nHfCI5(L1H!s:*DCEB!gRD(S(91X\BDEF+]lWeFE1[1aL(,;_n94Bgf]O%:HZP5pk_TNNB]@8@Ll\h+ %L`dj8.^\=1)6'\Y+pBJ!LcQn3=rbjp]`,"H^1>=?N&+63N'lsb2QC06A/N`-[iXuXIl4ts&36DIOX2]F=:KY_NQgdsO!;bO:V9XCcuf"4p=23>/``is35?Z^Gb-Nd@J4RRE]EaA?"@gZbY2<"b&P0Oe7;#uiVP(f=X@JRO6J%67:,)4PV/+YJ3G %K7=-`(gfr9P(bL?C_:]>%'K<,5mrA'pSg#iVS^Oj1m?8,]1=FamQJTJ=>A9$V$0s,Z`0`M-8MjrpQWIXuga8o>:s.cQ^OV6X+'M'^_g %Jc#Cr7D`fOcmW`[&p_0>PN^2F+8j\ofBccUZgFeEC1@[t$I():O$dZIiX7L![+K`:1=jn31";C0kGJ\Nh'm98ZM'INPP)^Z-In1? %^EHCo+0AP?Me^]'WdtaSW102B_upD6q[)1>O\>E]L3L:ENme"]TGCUW4A1IeTd8r,/ts+!]56C.MEL6d#%/0iBi_pGITaG@-N2FU %4BO29Fl0]e.q%Vt_k2m`Sd)2[GK1$:Rf_tOpODY[>4;%#I0^tDR8Nt]/R4NGQOgh=1< %,TTtA#!8j\`=c#BTl55V>*p-KBU45G-D]fq=63bQ65k^I3t.O_>N[D*5k^3hn7RsT22XYK,!mb0']!],;K3%uo8P=-*fZ=aDD/.U?1"b:9\#;@SU`Hg?GV_o*[&EZ\R8JE(1X2c:*q&8;jG %6pX=CEPSaSBs\7h\WA@$)B$i&;>JF+(VoVB!eqHXA&t&l^gSVl$?otsH(:,S/p,A`4HK[IMoS_i&0T!?^`k;-]r]Sm5*gRV4X`DC %fZGc2%'DcL`ln3idZ,=U3]>FI0euMPaXQOnG%aa9.&&2g9If!T$_ZR8Cp2IVd"&>9c20gkCQZ^_&uHl7Zm4\W]U&i+np(,Pj^sN97FhHaoP&+!]Y-^p[iP])B\ZMBnJH4g$rjL8erX.V[nS$OR?T9o.a(AmDdqQ]Yf2DmbC2X9*'H!o0'4o!BiYL>Hka/-\lES!2,EU_0S1E3.5Sg*1b_OZYEH&=N3TpIKkJJiKfFFb0C8oVi\3Dk`u"/c(- %>cgq)"IuN%i&!.],SVEe7-Y]>#@b>5Tf+D\1+S/G%Zd]r2?U*ELeD!N2XFiE;AUNf0eQk@S"XB2knUBDsVO)ekYF,PNKn_H?Csdt+qjj*+FHm`3N6snV/NDrJ1*T_CX@@SZ#[MjB4#VP;b1_fQ?Y.)(20OelgT"$l %R;6,?ad:.EgU%!mkIg;[EbR+CcR%.OUO<_PE#h+\d/J][OiAiaEj'u6+ZT#!c[O?J?N8.EE@&tk#_jD(QeZhH]q1+hW %^+Y6T\Vg=Kk(=r2@RW&!'Cb]GF9[a_.A2^SA))1+<(J3*HZk3u$C[XpEM;b-P-FLG43#?n/W?JdB1I1r?l`J&4'p9a)]0Y0WsL$j %0AV+..I,tO?Q-JcCiB63bmA?gZa@\&)ESLN/skRqIVEX1Bq6Z(hbW;R$W=b$G7+`"(g4(kR`QChOoqTQ23Et0a:POrbS"qQVbB(h %kE^6+''HsGJdN[]M-JnV5M*GH:&uD7]c(ON&d>[6=LMIWCQ0QW*j_2BF`dj(DA/6:/pZu.UcRkU(\"Unou0PK^^3't-ma=5)b %#7'SYpPRQRN-i_3iZ7'^%m%SQZr]PQgfJg6]kjY<*00jBFet\K1&=mUF/dlSC&XYB_.W+eikc=E3;l>\e^IFHOs(lB"]mk\U)Qq6LN@J\-*RFid5$)b\dU+c09S]bIh`:bGh/oLP>._&Y %([*kC@/c]AQ.5*Z3+nO$)rkVaqrAKNXJiuGJ5ceM^Db8hfTS@+%SugiTmT96!8n_d@Iu.5A4ngMi# %ASEb\KgO6\XfSI&,qAE*@DWa>.['gIUu@9WajH^C$&'#8f0 %Aeu-)%a[m)51@k=Hb0Pdl&b?`4c1nhhiT2\8PZF)'fJO/Tcl>7s9[m'"57EDRWRK.-Eb:kh#o%Q1I!*no49o"(K^Y %D'c0N;`_2IM^sr6m$2[i-dpc`/!%rWgs:H-kbf2k2is\@) %&7W/BWk>o^$sNm#!8!8ZQg+e$'5:gEn+Z&,#?l7e,/il+`hJ'uX&4B_9Z?qE#p"gtV`T2hQ#K!aLrF';m43Z5DKb:^-G9&@t% %]C""ah8r=#*R\bErL/\Q@FCiWMeI'q^9n6+BToq"@,]//kF-4b#kOFl4^+i,He'VJIXN52>k.0`@^[;Bi[mKTGh]qU,>B#`IHn#E9.SA2^FB*Y %(YD='mFdUpr(6FH1>nm#LudnYAaAislq7X?EFROuaK6,NEeEB=qgX)VQ@Je`eqhk6K0hZ[LA?LiE/lA3YQZ%R/s74\5r?hJRc+_i(r5sB%FiI/T[t1XlVMNWg)MJnUq5fD;b2K8%GEtde`&- %D#G_4Z_Akn$B(6Xf)a<*Vllf65ZHC&)"'a7[(b[FHu&K:XR5-an+=uZ$q.Yj`%$9amR0W!W$fW3EAV1GEc!;I)'D@3$fFVipY\qX %=)/L?g'U9-^Ln[<.DfMAeTK,qT%=LgOj]DEW$$cUQa'0WP'ae.0H*96BL(CT7,oiG8or[PqX6oXEM[A]I)nclYk::L^T]Cu4,+e< %*1@VY4I>RO@N;S#EHZr^$"2XA=m]d"Go;'&d5[u?Bj"QS;oEg%33,Dkkt^6219n9N8s<#HMXGG^5q&!N.ID(&jn[Vf,P!%nIDBnj %g`)Zr7g4fDcSAV;mR!^X3RiQB/hEpcCu*TRQl@bZ\1@e[![$-q]8?L?-QiskTmVP"&1SJ&\c-aJY0ELE[3&W"B&e>,I#NR--E..* %I]R3"W)h?EOYOKhf#-O@>`lUPGKG3JMoces$h"EENbIA?GqN+B[IQ8Gk8>q&UEg$?^^diU2;j^dNOIb:F#QS29VVj8k,EH4X.pZ' %;Y[$=V&ERQZKeO/R^H<^+q+^,no\>iT$o96"[$Ca3M-jMT6Fp(g!cGlOsdAYBL>Bp/hXK]GYZ=3@_Tm\#3FcGonWG=!FDK7,$eEsG%.%NG %Rdm[c%(4pWAY?taNa,F4U>R&qKOrceWTd#E>KV?$Qc[dh %Og^^5nr!-p#"aHtR/Bcgrj&f.(:D?&H&!tuOc%qIe?`1$]10Cg@YX4B"/L'b"I]+P:25sr.&MI.V(,BBZjoddKZK$jRB1A=d)1M4!,6k`Y+t\BH,S,GC!2IQ3t3ZP7_@e:Zn3UX)q"*3@B>AU(VdN-O_0uXQGF2l-cKiRWKAF7]IJ2N*nl,glLT"?ThZ#96ibTKY+4:;H&,J+E_XQQWgcG?Nm_]ZJ-*+$,)b&W4`6jS %"[a1?+d29>X^GN,LoZ#@7o5=clg(1EBYpp%G$)@"Ur)VGHiqKB`Je)XEQB73%8@Ai2?iu2Fep;rr>9XFu&R4kVGX_Nm %KYgb-j^R9HBOnFi+qC5;,d8Y-MNl!r4-eX/_H81p@:(j`)W1VPLEX]M@:q*kgFQcs?c=ZbZ[DfP^[g&^R/3;=A\]"GnpUF_l%S5e %SlMMG@B+"V*J8SSSPgf)1_sd*\o9r[&k7k>'"_c@%a$9XDep+=]o,F1Z>3hA<>j!Y]K0[`UR&p2s"%" %8R,K\,7u023>H9&GYt#FTF,;>%l\7:MUuDB_=FSZ@i+*4Z_^9<*#q_gbalZLl&4WSp`Hh#"7`qf@cfK:VL+S*:Fi&sV/`5n\VY]O %8(?[FmNrVj9SD;7-'3?g%u5#bG';?)ag>]F6U$M?/5/ui'NE//nmf!ifM1N:]a?n& %Q-'SER!R*sidKPC-QM$;8:lWTmh%pD#BUY;Iu`@8:h6`06i1YSW.+bue)cUqW's@rXpDoqX@Y)=X_;hm%_QPZ?:"&!t=Fi\_lni[cf,6[q;ajs;JMC'a]W3#gfg %o4mH@ml %lkg[EPX$l/#38JdE?3V8)j\=oV^Hq3@Mh$M@,2oSqDsF4H"s3TB%Bcp^QVq["XTa9,/2H=?&fF2rCO4AR5OAJFeg1/J+Hgm^icAK!%.8:j1lUAE1_oS&]mX9`n;!k7u4Na0'0qp`OC;.#EZQ-Vt.)Z %MJ@M[O0a])m\%R-K,Bl]<[+'dl)P1M65!R4UApCq-op8"nZ3PGYJgXKR;"<#!`\"+Yn!aJh*`-kn\nO#B!W#G=lO-LpL.;h-ClC8FTl;okJ_^6>/O5 %+_EQ"bl%&]5*96I6B0i=12bASUJ[Kf-uo_?,@Zii\;ta1jGl@.MZ@-uR`0=',?bs>tFX:9a526kL26U26^c)b$Y%ZNp%F@CF]#C56r.M@(b:k?qaFI).*b-f]T%B:O;^rMHK %_M6sg5%9H=W*C5EF#E5kS\@Ecq9jB?PQ!YXCakN'ORZM\f'\iH;Tn0&4;O*>6C,rcFZj#8l!-[%D&:(S=e_rUi?m:-Y@G"64SH$J %C1d.o\O=PKP;A&D^Qq3P%s)Lg3o)-t/-37cP9_];[-?1L%=B'%.&TXTW %WqiKtJEiQ)@bpl'?9G6)nlT=j`2HC1.$pcNCd4m"2`P;3DV<0*"U`B]>c*.l8/Ts`42f7QYOIdK3O-bY4/S"S'1"Zg]Nj?-tE::mWYYUARb+*?2PCV%A(0Oe?Zb(h?O?Igug\H!>Q$#e]#rW6r5ss7J.h>(G=e,gn61tM!o#aF)H"L?-@a6<((^*bl %6K]#Y4,(l$KHMlC,%S=q5!-2GHHCHR2!:.`!ZFS((gV/kb_tl`"Pm'W@hKaGLAg'erHc05E/^XScPl)g-cLkl)d8%*&*_d[We/b= %GCPpkkd=Ii5-*(+G-s[aE73cQqdj`,J+7`467lU[0pnlb->%,KH0Pll;_Wk4[5SJQ&9iu&@`DsKS4)Ug7HUED.[CKmks/nphLllt %7Lm_(0p-S_i@k()iEBt.EOFZ/36aRmQMtHg1.O10')5VJ?MD:bEu:7i)!Q$'8]K:8dJGjM.o*RSt[JZgi/.@?#+qjM?EeA(6*(8B3BRA:?IW3 %D0&0W*KlTLPN#/+:[3mn5Y,EHhLN%;l-@/W*@JD;Sh2K^_.69X)P"Z[KbZJ[FTB"VZNIH^JWH2es!qG4.RHV-A.pSs7*]u^M;CbJ %_V8\m^9gmmZj.d$YR2/<-ca1/^I)0@o`k4S/E5>SO`>,q,e2"qURdKHaP3`U*9o(L[qIAk3)3eCq#4[+!):l@Cb&sB+G %_bXm,`6&Dl?35^39LY2!>L?+klIJ%=8p9,2&Z22h42r?9+L;E=?V!ooI`2'G?3@e';eL+3p<@?5&f$AoZU#qH%HS1:N'%IBO[dRlq\ln6\='qrgW$HOW6]WLaeWC'k!#8Q6&1\\IRd'Y2a(SqTsr %8L03>Je("='HE/b05*k"#!fO2Yh`!uE8MPnV'N;"iPpSUBnDMBcFiUhOG>6q]*Zg7(JeT`/c"a>6b[;#YuR7Zr\B2[ON`lA7s48r %5&kLma\VJHSt\QWhQ!I1\"PrmM'8%&O)bg`OUg=uJB(\B7bi0-$<:MU!H/7%TITefC)Ktcl-6+[SORa)&.&p./,?W'JOh`t!KdfEYn[/T:&N`@L7[ %/QMahAdsWT8eA^afO*QfC:_,4B\L1`Hcbqr_F!0+LZ+T&2'r[$'Q4X;L8-^%`CgGblI=`._h-gG!@K8F-<=++iDTeg'5P+u+mRdG %b/YXJgEoZH-"SL@flm5n]/-^He-(.IBkWgikojpfI3IGHg %*r5`/f@f,E<*Q3*4N4;$64!@%]:?SMf?T9#9Z(LIOW6EA@Bu=,:td+]:sAqeb*+Ff96286W1bBRs4+USpAGtf_oGe%AGcaRNA0Wc %K_g\S(FN'`m]J&O>q):R9=eS;_J'D!P6. %@_fZ$FoB[g(53[>$$nB]k+4Z\1=N.7E6kO1>be$(#VWLJIV#[GTmTucq'S3gG[uX:8I1aJ"U%B'b,@kAnpX8[b4(SN1+>+],,G,] %aCdS-L`Zkkjk5QkSdYl6/.i8d82l3W`;0k23?rX6A^B)Eb2AN5.'(_Un36I<6Y\5:9'pR/B'Kb@X%\C"S)\&J1J&`sV7rF,0OA]J %X'aflni^5KiB%\`cr5,;"t$["*+Q!3$+$46Xk5,?l:b'1Qjo/',p-URbc?.=\H+A`;3UAFF+o.Y0-;q+S:k]S)+U:R^KS,TK+ZJ[\R*-ISb7L\HKX`S%4:=/9ESeK% %$H@ee5m#YN@A:@K5scf78[N,\FLud/F8.rP.VX]r&0-,A#F/9jdTBf_GN29k2P(^^b'1?sqj&J680\sCeMBg&2XCI(`hJ?&eptoD %HRoXnD#LsU6/TiEYE8qV_`;-*&=mjBS=NrFGPJi)&,R8$Z6!,[tg'#=,iG(2S^;Xk[EPE3G%MZs3:=io3l!uA>MkOBA-D; %E^,*P)?_Z %VS$08^M(#ifj>CiY:;i6Gd)'[QM)%tC+h=M8l0Pim:BAMh9igCKq3I*_\.;r#,&]DhM%Ra03+s1?7rk4<'H*E+$EnPhUXgPD&k)` %LJY]D>4-V5i\LK@[M4p__I`?7LBkoI?8#[p*U,%58tq61gU %'q@1J)HD.J7o`s2<^%7k?b6]Jmj_V+*,PXH.CAVD9=&K;^F\0cY:oTVIE#=887\8oO)`o%Ac'.4l_jT;F3B0BMsa1&>MR('>,W,A %-$T3Rrpd]7lG/ff+r?./Hr>ZXjElMMJi1AD709j3*,HlnKrD*sN2l+OSN3j:>,c7P=U]TGpYT4QbC]i) %d)Z#QnC=;Q!aGduHr@&=N!RP[6qF:C>nS7p.3^C9'!R"=#Hb=6*f,GFt,HLA.ur\Z,RWjT(e,1ice"edPdGp:I6W`'Rjnc>tII=b>6gKWOBWgGnX_*Sjg60Yo8>HpZ%nlJq.J %>Ki!O0#nN0Hn4?+R)a]MA8qAZUPh%k_qG>6A\PbZF5d9d^;aAuA(=Bm>DM-O^ %:cef2cLXO:R*6qrE&Oi$32lAb7S0-#7E/ucJ8d$@I]-9C;NbW0pSma=lC>m:Il\Eo\a]M@f](NF%5^#'Z,qnneU9erS?IEfl8qrQRht4@jup %-9E$,W2H8F$o$po'X:i5kLbM!em_ %/VbX@5`(tsB$$HE/dggb-*bBW\WWs=X`ALW,-Soc%7659HL^=-+PH6b7C<.hBi?mR?<*KN*dO=\e0Ok/eF %)ApN6OU9*7p#ZY'mF2F#Z"dE4S]*hOiOom"h@7D1rq(DaqX=FFs1&'SJ+M9Ar)`p_TDtO5s1eQFs88Mhks,,(K`C>0ric@kf.Z.` %rpTj_f73Pj:]L3Z97M<,^QniX:[,?C!Erg,kJoCG3B\)dSb\,YpgJ,ZA/O8o(hrKlEqDu]EIs82hYIeuW^npg8&H`(@;VgV%e %NMtk'<2hGjuARKiT\G:o/6WJe:J9G"JqV %XUC3K$od&Nf@6;XEg/K(oBc$>KAU+jVj/.JiNA'=p'Lo:SRL58d?U'im(\8cAN'!2'3a5$R[qh=Yn0qU[[aR,Dcd3k`21? %2]m"Qlta62YZc/o+o>9S^.OfA@]iJ38b`>d$#p^OKW@`f&@Y.&C8KB)ARo^)VKoM%\%S-D5"RrN'fj=hZg!m[No>9N %f?)E+T[EIrPPY[ho?/cA^F?6,1O/aU`Fr*e!j-[`#$e[V$M%H0C5[T$K5]HIK*(`4_#"1oDG?CdDH[d&qIb.LeAt,L'JqeFAS+V!dCsW %B-qUg?ln1;mH!4HE0XX+9Z3Eg_te+=-K91b"QA6[m.C)-$e]$%S"rlPq82;? %cdtL<:oXG(meNmod2qVT2puoB>!af'hS+pr^X04ob_&RRa%IX>En\Jj\[Jg1N8TP,ls2!!eHSprK3=91>8sL18,;6hRQK^Hi[O:j %<+hc6X43qZQmGf5e%fEq'%\C&26h6mO==A3_2i\Ea^&6Qs8IRH<8`RNHn@Q]AB#]i/jOLM3It-h1sQG2/H))_.?VMZl_qp@9/o]L %\[+EK*0iZXg8(m"^\r\T3m(;%_cE:i"n=#0QkQZRN'jqdK0&XhR/.V%b.`jJBs-2G%% %`L5'3C9?aI0,iM0'*P-mrh'LW`Pg'1H+r2ro,7IjSeu\WA^>^WNBCURurh[fA/5VbB*_IXV0LUQ6[Z0 %:`bjd^*FuqXnRA.&u`8*=`/Z*GZAe#0);*QFl;o94Xk@kZ;cpDEQKV3_S'NM9H2KWbdol=a^_AaoGW/R4TejKR$bYd[%9A.GId2M %9+O&gc10@2HiRqpH)m2Z_+oS)H`uY)j?Z]tqf:+n5sJn?\fS6P(i)'dro26)]QBdBI#-[7p"$u@r+>r=[+kZZ>l^JEj0_qMB@mA? %0e2%H!'=$4K0d_-_X"eTr%>)GoqiOlOgF8DFp.K=Ocp&tFo=Y)e&@IBd`@49[%WYo6h)*/#>p"W\iFW8^)Cp,pEk:#DhPWH"..!h %m?-fN3-EU[X<,c>%u?idL6r-U9Sdr/,OE5#^U-XAI$R./8(uiJ`JD>'^h\Eb9HBj_o,C$OP$KJdf6.ZbbALV8ieZV4@sCkDZE-a> %EEFXOB1+ln@oqa]Q49,T'>K%bFO&JVA5-8%V+;5_70N9MR`F031%X%9!;-*gkK=\Sm/\HkQSCC-pabp])cJ6YPGT=$@nL#95U@dIHJ@l0_Ut&&AMYOlBpWT8 %.FbMr&+]C]1a#VOV%;0S8b1J68]s"_F*N$n]SoZ]9VDHp,T647P_Vd%W?)M6:F9(=)KuA$\-)Y?,+N:7LY!UFe36+h^P_-?p__;0 %n[B\U3K*COKS^blXHHi>Y.2JS8Ap0]"Sm=7ppC>H[Di*h9Bm,c^Nj!0BDu="A"]9pk.(Dub1iT/kmC6/#iD\ac.F'2S.UrI#:-uglS/Du@mVdSuo%=@V0l&X1XY]jd'S/CCKp[>Vf3u-Tl"j:D %-Vu6=*[P;EG#dc4>)\O%PPY:=(UbVZQ9dR?f@N#OoKTD?[qXqPF5o@]QllPATcHc`_qM`.`/0GEjL1@GVj%6]f\i %d@?T-;AQf1*hsFm1bBeQGmq %=HW!TKJ\SiF5uC.:)/:KHR)]^"*T"\0RU5=dUk1pftFuP&("hUgi+)8Ih/-7"_,O`LlW4da[mpnTWLYS-)it&]tn_sQrMMYN5?4( %a2:J4W2X,;@:J@=3M)1/,7,O+F&Z_&dI'urCU;O$WAj-qgJdP\#Z1A'r1H7\:0,-?m5d+?2Msk;OZ,P`"!SW/4^DN=]nH"d&\Z.3;;-6oI %ohjfI(O9>,*3]J?BoOra+4c%,\\8EW7>ip")?G44Ut+3E?lSK6=dDcDIsBKRZjOO\;+\Xi)IbpI$=Jb]XLu&"?-!,0ld2Z\="8u@ %E66elL0l1!HJ&&<1eqRe3&:RfJ9n5r%]GUB8:?,#Eqi,gS,qU@E1C-4r%V5B:i%VTtE>(hhnBb17X#QcZ7#A=\kj7N&q:;0[:(o*A%%E7q&mH*6KFq %b^$(0Y$XS$@gO.+%m@lEi3.tDDHKc*8Y[d,Q5N0'c"C/dF_hp[/OFn0ClOq]OL^esdI.jUk=Apc,EgN[_9m1XEJl?%kC[j6AXtjK %Ut]a"@kI6p8VY%MFXJJk'2IY-]kLg'bER4n?YuR">JniWJ2*-^uMp2OMgEgcFgpd'ZX+73"(eW6_0>O7KYBd6J]k%A5P`(O<$iiakGdHnLr\:6I[hVc9\Y %/5?m45gI\h-aUcGORPl$E.qo'-]OO*+f9tE1q"/f %D7nPJh\7j8C-.1Yf.2Pmh2Cd2[7g)A\1Z`WpPKu=;^E((`JN1M]k6tE_5>g]5\\#j!4AZQ2"q_^2qNk96;j1Y1I'T*n-4"!3rjA5ElC`[c"5H/F:qI7-8jub7(dKi^6"O@iaE2&se%TZ&a6u$7h %b)6:!V^@5+4YK,.Ag>8g!T_kl"haT"i'eW":!_D1O^SU1h]ieuOGLJe3h"UH/nmMiNb[Q.h?@ta=@8+d`I!Y"54b2"Jp+XJMXNEu.4TQb]GXeIo[0rmpA4#,n<\bVp\bfP]EjEPY],]aElR%>AlV[:QZ#S5D!BN\k+6VUKpXB4bCp@$?Wk?o!# %S6b9uA]!i/c.7h$K^2'nhIt?&;Lif/"ZB?Xg.R#og`(h$^g4Q+8N9#*:eC#b;!XT3FPS.`,Q4#d>RJ0r86>Ih:5eG-/p!f33m;sW %L-(II]N8bPS#W$+8RFBk,LF60rN\&5WjFNsh0B\+E)LnZP[*#r=2FD]as#1oHO#!XpUCl+8OoVF?((N.Qd&r<(X-%-LOG>?XG=2_Y:K#(DaC[_4k:l0\(S.IkG6:JkpN&+Q:n$W^UXM/W-V.K-TE)=j\3rRFM6Dq*AnVf@jGQ:Do&4]mp3tf79M7]`RG_Xf %6;SR:5Bpb.)2V26]:HL[Oc0l7hE8Td>WI5p#C)P*T&5iF,kI1;R<57f=CZ`hbpWT7a3SKp6&+RHerkk7YaMr@UM;8HYUXkA3iqB5 %_ElNTgZG=k!7'_hMbt5^VP[s7c(_P?,LcaAZ2eW#:KsVl,_*]u\Hj'fZ.MQiikspP>.D %p/]WhR"Mp?*7[+&J;:F2!1a,faNEhnKRB7C'qImTOGfD-&'q!;Ce=0=_p7*)hIdmcZZE@%VW*u]GLV$e64p$a#Z$)Vb'"I9W@LR_a&knNYhoh16AKXTnoocIJcMZ/,FX.9Y6iY;@uu9(jK_oeR0aj %e-W8-H0$).mYKC?dc,-G,hQj+e1+95/s1HRb4=^oaE_%D&e:1eB"R!sruZUV\fBCCS;TQ3hdQLD_KHck\mNZgd`?J(*9\$0m-PfT %:+/@9-t3Q$ckq]eqWUf;jiaY.)Ot]6*&PI>6deZR>1L%3WliK-QX:Z'"pok21qM"Hjh@N9\p^e+c2`iEO;\!EE0sQH0^/ks8ZF59 %UBmb8YHT8a#L,2)%bpi_6t=L2."pPk)6MW#$#M7*-6eT_UlD>c9"/8(jY_r^l-[fKT,OU3.b@s2$h-GiLXh9.H"\I0Feb8;lqqi_3*n!(8eH.N1%[RI`6^(i&h%#o>p(ZP@XBF"6F,3WlEdo3;n0 %"R3i\4kC!Z,Y\'SOoGQhqN;_JHnV(cCHb6-3RLGm8q$j:4YBJ64#nn[PW %3NT]GCHG;FT'^t/a\TB-\:lP+Mn$eH!_Ft,Jf5TBgJREO<>::F"c,s?,fT/?)&pjBbI>Gl9'/&/[X\FQpkLPI32fr:KYVJN<>l\s %>Q%GulnaV>;9b8gSX'I6!:FBTp9RMSN`lspG3i6_WTW_;YVualZW+23hq)JP=^-$@0\j9Chsg%Rg1*kj-LSu'j48qG6-4V$J-$W7 %1sst\,1gV\KN#>qLQ?=# %f>R'<0;6`78)0ilS1Ycdb5A\^K+D!::aA!=J.kP==Bq[ZK-kjPQ!1%I&g$"Ftn5aD#r2MA$(&bB[na':k %'PWuds+^Q75bK-!*Y^N__8:AI'-qa=a"^1S^Y"o)tkKaZ1?joD*oo8g2,A%]@K0V@f6$& %N7&rX549#j&=UG&)sYXDM=`d9H'VFmACliiA`3CdE'5tE:0?.[J.49CU9tbSU!eg(+iqqE]bem6"t3NnX6H#*XjpFX:,aF":P9mb7TrZA,]qG>*lSuj-qF?Y>EOF]S45&upGmhO_bO^N)?]U=GM85sGPW0u(^??3nf@=c^s^CD+3[kdGP]4fhVJrT %6jBHe'5*u/TJVKV$aAWuV7XIoJ;m[B.94-q/p'rmf(&A6#md]6.tCQ!YI1Y@6`l,t*#!8lB3dfj;)QWV#?iLS1;gc)6U@.i5Dk#8 %oSqA'9/LJ#YYu@^@RTdoolUorVeD#)D*D2+_1%:U.nA;T)5F`'8>NqY:]ZQa8:,!fD5W"^^Jtj*eXeoJ7\D$ZWU5l!L`"_JC\heR %biUjpBF]/=(S=[<1G7)+0`W[HrGq8R`9bG&qKaZbZZJko6=an\YRq0 %4[#l^1WtmYG7I.G3la%j%>ajdZ(MT7[*\*$a^Pf-&W?bKas>_"Fb-o?.pN\_M%HL.mV.iYFUV)-TM&S`\L5pf!Dr)N6GkW=1Xm)ioJlOp9>*jI%VtgiaP9<[Y&V=0::QI677_]M@F;T4#csu]D+&_i`iGFd!>L)3ZPS$F^hPb-M^RF'n6k:L`W4-="b\9kf2FmkH8:M/EY$\J8Chj;SAT/6Ho#5& %XKhe9cp45Ae86^DO[b=$&/m1@k@H$Y%NV/-ZTPKumrZPnMB(CMjXbC]Ko %\6>%1VGO'4LU&J8qdGn'3Dg.,pl)ne[D5F779e1l&M&YP>#%BhYW0E,^+Z_WAdrQ)5j&.6o>r1WIG$aHVf4odQ&-U`qT12:*Cc+bV4`3!&SeI6"T76GNHF^irMf-oa?.jfTh8QKkr_SD7=_hic121=CVh.Zt@lgcrF$NY+\'Csg*2=cbZn+QW@!\O#-57uVcXtj,<@o%P1Wm7.L)7b9DLfj?&9YdPc]NO`Q]U"L?'rE$+.[8Og#\>IV=h9q+kqV %Lc"&o?HcaOXU\qZ+&UDsH^rc!7^gF8MI^!Jbm@'n/Bko!ZSR.5@\8Xj1]pFH`2%`%$4-AsZ_1L5I5^es$_U\EK4^/q3e^hr^++pK]F %"SYb%Mr"iLi+(TN_(7OQ`hN.ZjDkG2C;jidi@Htt+=7(KbnKRX?^jWgob]DU?(FZiiV\S\)SoQBFl^sq)oX9c`g'_lb)e"+NRGj`7MoQpXS=)QJ=gHHbrfVFk>YdrET@.`>LjBYj9Vm=R[3%k!(;Kb"_BFZH/&TJ.jnY# %Eon;V8\Brm$(9#E\@B:$\%6OV3j3-&*?QgeMFKgS;>=qt`ooqu@'o)`^bo>W^uWF&PI9X/#$M80cOrYBXY"U*a/ %7,FS-D"iUf[ij0O9:`l9h_CpEWR)V'X;\qo^_D;Cq1n;c6qcR)>/d29#qJ(k+`cTn]H.NT`%K9OWiHTF$Ij']!d`V8`Zp5UM7.n& %d:X8ik_BfO:S0F[Q%]/->/`9G)\TX^Vs.gsK[)7h8W)nDq*]XJdoNA44!k0(n_jU9TbJmM:fK(dtih9&&F#"L$OS[.@a$t$1@e07;,)VWh<>#cm*_Z0sYHHUXh?R-1@GWGN\ %^FWFR"qT?77qJl(N0'mC'X>6?KWG_mga--h\C"]&)4#aC+9*?.X[USSi!$\_'J[j71CN1$Zb(;L>qQD52//ea8I3?DjY.3XYRjI] %&S[32+pJ2m-b`QI@4%\bD(GEX>'I+r1=?</*3"i<.K`Bo%"<*;jJ6$)N%'1a>`)e=B:K\,$ZlZ>TIk2M+B=0W(6dT %pT^=sNt53[mmbmj(750dpaqcfJ-83h3!g&FU(mAbmNs1ra`).u[&>:;DJDIme+_h6AePVUr_Y(2N'cDHqM/C#L!WF_Q;q_%0cVq[ %VTrLk`)RA16UO9n;r+@OW>7qM0aGJEG=SH$[`f*mmK,1_!\1T1JDIjCmOIj$&J,jp$PMi(#Xq%!Torfa\/MNX)`.ZIB7O>_N9KE; %r(bod2DIorT!8/WA\5N/lWr`cN7&MNJ,$ms/)1n\Iba'Z'TUbaW-&p@5* %19s6#&K!F'639VKj$)7F9O]iSm]D9LS.G@DJ%dWk]uIH/)Y)ftNA2.54%_0?,8f@?`S?)#-Ac=e%`IDY]:2&4#*IgPUg['KET0q? %J48=I4M=btUs*(T[;5qrOGm*Y0l(IaA5,\RV9,mLr%3RO[L.A`h.9E0;Bi(juKg3'6a\3q*AA^E4 %J=3)@2+eT=1a5PIj-%`63!_]I2D\\hk.sk&C9esnl_b:EMl@Y$oLhLc^u>!+L/YcVZH!gTB-12EL>^Ano3XLaP?)102d-'*,d-Q(fHF %b3.ZiMIT"+3HiU<&Vec=4V_DeLP*B_BObV(,)a,t)4`#=l5:KS].GWXkkHR>R4!8_>6*g*LW)A,14YG\Z(PWTKVnLb4Lfu*%8ABU %@a%JYP53kG\NYcI^\8"Pm+LfdN+[cWk(9;f],?Ap6de%MPB-f5(m5D*\n`^\K[%@RaJEd"1*L:*$QP?bHe0`BhR]gfM@m35Z`ckT %QFhp)SD*2Wj65O=+\&Y`G#,.]cTm2=_$O:K.YEM)c#90c'MU1c.E^;EmgWkB-S<(qa%JV+?^F>/dF).L*1P`?GWm).ffh2C_V-?@)5sj0QLW0/uB[ %3fO%b@*csQo]Ba`1KPs6>AbK[*C?OZ\E-IrXs:IabI8Ap5dH,$9oK<;S7ZQ0^4c?q[#,ScD6cncg-.'`7_BaL[5-H+T"#nH8bE5k %:,-d31)uAseK/]MP-C0fp2pQr:qN8FDg/Rs95-G=AH.16DV3*K%Zm`>i/F&I9[G,!JJso/P]0?/5.HCc"RM^DT:4<^j@F+YkdfcCIa2N)+.D2*nl#:nfXkinq@Fd)_m>LR_4/<58"iN/2NqLu7?#79F= %)EKenQQR2cIoPDJ>-]4DUTSU.a]*uD-gb!)#Z%s\agc-m:>-:51!h2^TT*<`+i@#`DkFgtK>i0\nnjP\1u'B9T%0`u#b`N!YWM"M %JGdUp'TYp^M/g).@p@DN'L[d[8Ke$(6&q:T%g,;Hus#u1"ak#kcPm6c+)'G*%G-,Z`oLXO&h^d:!OSm6sT\3pi3\>t?s=pc]L'SiL0G]-SV&2Z(9UamcL/1eFL@mLAqQF`%/)dn(m:U3STd@+bD;V$Jh0ne@*69lr];f8Lmp>dB%?ms+=CZ^ln %J3H6o3<4SD!;r&oJH]tRp[hWl2+]]K[fNN9C=jm^5ZA/ennc&DlRBXFi]/A(+:*V'D@H[U`dn$)puDCVf.t=BShrJ\"YZ&kfVYrj %4hnWEm0teKI+3GhCR&16Sj$RG5oJI1!P/k[!WissPfi5'd(4JAcQft,URo8Q'3Cm'qum&ciVk>Q2CIG1K(1W$6>:OX(b`[`OKJLq %AqLt:\8ct+J.b-:aAm;3+>WD`QiUCO5X3hNC""\m4Dm$7`>_Q(91A-cH-[$ib@RVt6t!t@XP[P9,7%b5TaCSZ:_m52YI#=D)IcW" %H%mK$`ceI92F<]&WVU@oVP@,L-N0=Zg@cddPigD19ITOnJ` %QgeaqI^!F8qCDaU\::qbE/JoaA>1+3?IR;q):+2W3+W)afaS]'O@imnHK:*gnOT"^PR8!/B#l-%QU<9'VA6(\0=ta',f.O_-&N8Q %.[9SMhM.St')$%-&4kfTDg1bR@Q!T[*'eFLRpG[;S6BeXhbNlM.[MZT`MAhKhY %@EtPVQuI$On!h-##&[C*:8,`id$9D9&.*!Y(44I*Dai\GdW0&iQkjoY0[@rNR+*i]#u? %P@r=eP1U*cZlgqMLH'ceY^@'ecEM%QKM>?+0UkL+@lBM@4>Ej=ReF09@nSS0AQ8!T&<")XL,Y'9I4.^I=[MCoYF/%'FumlKb8oi; %krO/&'U-l\YcI"_RZluYu&7DJ9iV:=-q&+6bpP=KhUf3 %5>*0`L5+U4!f6o8WNL/*K[*A0+C8oMR[L^I6jPiT@Qk"DV02"^E'bc$@[6\h]3aA(*MBjJ %5rD]FKetdj!#2mC54;Y'og`5lsDM-=ps@6CMs>TVhjU0'c%n##RFQ %`TIl-1NO$S$"jC;H(h%3q[L%BX>Q]CCu^(@Q&q(J/#HI!N\nlD[HZ"oOqbo9GDi\<49:cL)ecJY*!eTM&pcB0C/NP5UD%WY2on<0 %E[3_I'7c#I3>Q*<+n!>-EMfH*4Ga([at(,e)2(s0H_<879a!m6[d0S459V639G^ %(N%o<$rE)fVDJiMfat2cj\2Ua6aUm=bT>[f:24tg/%_R(84,oV]tR$Njtn0N(cRkXZ#IaLDTu:)!-p+aM3g(I"14mTG-Z9!9Ju]T %kHuVA#9`sVL'TT6R#h::>*.jke]dPo&]P=RBoTEfnXSYD'URN_H/`5)3ET!dePI(\PQ`$A'SlMDj`!RBSUm>5-sl$RfS3)kra`.+ %@(?mTY_/JUdru'6PasfWe>:J9TMW&CJqPl3dH85=m$4i]89DiU0]154CL,Y42F@\,0F"2[Qc7UZ(-!8N)E/0p34Q"45XMde=Fo0+ %hN7JScF-r`?mY!0Ba#pN)4)<%g"QPbX.)DXjUWQ:c>:7/+Dc'.]q*%M'.A#2o@^(W'Od)ml()FrNg8JfXDMPjlPUA^1Y3u.bg'R% %i=$[p17W=*##do)BI9IGYe#!%6tEMmW.tVNAr@BP#5IT=/\qFKHt9):e&;cc1coIjSgEhPI,$N<3*0S_dSrsgIaQU4OhpHHC0:>AW$OchhUs@h>!`H`Y[4?t_u85ZLd1!/iO\:-k$Tft)UGq,>CaTICU=Y$1&-!b[0WfZ %6t3Q"MY26<@Bf*FYjR@Pl&4U=AH7H0i,,6UT,R)J9H(8aUA'Dl3tp)d!4:2EYnL7$HU0?=P8#LJ(*1KIV6ELc=C%@b@6_@(,u&Vq %iibWn__r<&/V7WmHmhlb$Ku4jf7os8OO2+21LK]Y/I+b3g0(tn63Ms()\eli %(3U))R#90hXF'grFBDdKL(W9>Mo.YoK9!Bo^t9H@9-uEsQ'5()#b/aAQhoD/0KR[[?CS2X$&$Q%"pfl67cl+Qr"E*)kgITV.)ShkfO/6aMtHg]o+S0SOb]YBKB&On^R9:=Hodf(H3h\Km@7C_Lgn-b3Vn@eu)fco/62Ub0l]A %Hq,^!"i#I++hFnbL8iI,q*cDNqO`oIP%4rW %\:ZAsI]ce!:3@J7M]>R%Ahjd1@Nh*)^3TX"JohjaN(;osl,_2""%DfAncStFC2u4\VG:[\Hl0;Y1&``k&.>6#KeO9ER^V"MGh?iU %)!Cg0mp6]oQ>C6));(^uLIMq2%n3'T2f`q$WJW8.$criN_iB1YhP8T=;2n(8D&&bB2&\q-pb+?"nZX'.ndW[BWW-36YUR3 %c*)jDmN$HUqUdAaN*o^im=6(LeN>Vm,Yl_Y"iM^`/QOp<+4QouQB>d+Wa`_#P;:q!'Au9#kU*"rC52"f %QBX&>_2.uXK:an2^84K?+k\p/,u)[!rUS[nC&!t0$=U%g1\Dtkr[i!4JT4s\'J+!DP((Uj2!c8%f1nDGU&#pm"e,a=3Rf+Wg@H)L %(qQCV6+pY+cs[W(8m*RY3"N['1;jF?P-(BcblO1?aP3$Xa&17/$nNDT`47F3l%/O#0[**3,SHSRbHa/UOL:ihN%l`7@MS] %0LZs5n>rWG88ms>k)ShXIifheu'fL]=Ja0>m.16MYFfWhpd+"4^[ha%&ag+;&f*S^7kscmVi2CM, %?4^:7,)J9ckh:nbH-i3\SWmA^[$M%s1rOqsn]FPqd.ti0=hSr].[FtUe3Yt#q&/;n?nnA:MhT-giFo7t&Qd^h1,Dm9N'Y,]l+Eb5 %6[PC/988^cOK+&sP?BQi@#=#$444b!%USH0POJRLW>'YVUNNB&Hb:hL9Ja]j")ouSg-,s1B3)]p6$[LCt))$0)Ap$,2Xl42(A+n&+>O-=pbR!DD,87%m.j>DYNk"4+^^Q'2$]372%I4QS.CqE@JX?56 %,jZ;hZ2T(!)8+3BP@X,r[]SFgj`QE3cOOD@K8eHJP.9'\D4H[f&pgALB5^W3/3_B3%=6N=YgEbHV(6C-b\B!&6Cr$7n1g9ndmg %DN\LcE"28,*s2T^iLu&/)[*IQCkE[d(u8',W"Zb$"?"p'ag=1I<[9T]'REP5^XV9:N>Cr\Ms@NpQsKb0hkCDai`n0h*!W6t&1M7G %O37O>C7TITBPK_nB2KPY\bOl<@)]&)?Kl&gRl9?YmAM8iGg`RKk;q\>M2;\)N!^[Sg,0<;m+:)Ekj3Z5U89'pLfZLXOh&R8.[/5b %Pkd16LS][rbghNDNFi?+1ot,`!6:p>EsnuK@a!R!W$Y@k$+r!o0[L:\YAr-&E.P]"&Nc6T[qPQ(AG",'"3h/bg06ZRVMdj)*IGd# %^&VCbKPHlr_+2C>S>cjuQ,-gVI8lMpVVn%\?I&Tr:n[eT`@b&2-7+CW922JmNToB0\=N %pbC\VW/`j15)dZ2<2\q-YY$2u/t,F+KYc:\Mh:hq[]#ORD2;3'enP?@Vc@0A^'2Q1[$Ito!2'Wck:uce4b9*rop0/<`EOqcB37d`^G1[tp'Z[$=Y@W+m.@BAR %cs?guW\k/YX^"F-339sO;(`$&%s]8R#3aOf`rHOAR%Qfl)QM(3W0j8+BA!?A7]dnmibXC3 %4!0AWpBUq=NP&d'T.&dd5tQ^U'nrj!%P8T=)o]od`nO+O[%(AA>-`W%H'nfphbq'4r&"E:MYSK=Deo[@PU.Eo`\$`u6>'cF2G1\"F6g##-UJo9;%Up&SgEf"e.4\b_ %^9=Ne)+4JeQ)MW6"?5h;5b&sQE?X&\1d;!OW2kc<[ldZ1;'&MZ?HqGmY^mTorIV*gFqIp'.F4:udF].S?M4hs0^!7@C2kR[Z50gi %rTZu:A7=7I@16"ZPKQoW+cphZ2Il=j+d7-9Db5m17uVIG<>ma^Q+J3TM*(dg>'RPKCP %T&1slgdaj\Znf?>UY]M]B1;'K7sbO)_1L4RW&X.UYjc%"qZsD:P2\Fm*=CAX$qBRcZPq7C&lIKcUDo3Vecl+>MA@k*6B<6U['br& %MD:PM)^fXlUc+$Bn!s#caR>U>80I2Nm/b4E_JiSX,#HT!7;]?M=k9.5`#Y8,9W1kK_IE%l;bb#/nOm4/;SD:E2ZGGF3gl-6`&`nk4)B8Df8k$<:$"\WFb7;$&Vb.sH<-+MOfN=E$]%+f@1-i0tdl;,C\-3=B %+a@/]3\*:m@Tp3gZEbSe,"LnE+;Z4((F;A!qb[l"qd0h6&dC0MK:TW=5fG$?5n)oWgk4O]MTJHnPL7@g[![L/gIh->)%FB_3[ks; %2pQFa1/jij3R]P^`3kq/5fMC(UIF3*0cEX*_TtYKbp:5]OY"eR6'SJ*$!5s!",^^V';&ogBjnWF.Q&`"LN\O8RU9h3`5^OGPp=@T8N)p/!a33[DNdB2Eop,$kg?=g<$H\Q=B]YM %Hn[rk=:-^kf9h];Bl;K`6\beslr+QXop3Gr'R/@aggC9i,]%-%"=&d.BVnJZdV'KrP(Nl^:*EA?&EN`o`5,Sl"u+#=,>k28'ot?t %HOpsFg*st"`@teX0j"b/U6S"V2,6Sq`*$]gI8I27[Dsm50.-=Je536N;VD-7[Edj)&N5t"2i&Kq>;*\tG+_EqUcLgHLeAC+p!C1P %%fM.pKS:^s&10[[RjrHlo';Ai9;k*O?+ol@!Vj#%A_9TDE:\uB-%uR"FmS=I1Jm)88l-'d7["IuL3QV_.RK]d^BRHaWKAk:(uo4k %[9D%L,5"h])tDYhjA%3hB9O=d0 %)P"9KUh"(-!Nofkd6ph[&E;cLam?TJ2-;^RK"i/JmGS3)fZ`9<.4tc[K,%lE8;[KdS2Y3+W(K\pl.T9u-]':J)3De,mCE[,]l!^r %9T49I"454ui#6'cM(.D0V%Ri[9J*g<%E2FUf*PA0k^\4a %1([&`MCN/BE;=.3J!!bODmmjs[!6$DO"jec;cqe*1j#QAYu*#jK]$tL+K%\7%q;^n2AE+UU"X-"B64Lc9u3=H=kIbi'\8*UV7YT8 %k'e)J,+\II!r@mC>jCV,0Y`@P)g;G8.\OO[CP^bc`927>+K%F,V-j5YP^ZG^74E=o/IN&Z`M]27i\[Z#m^MSHH0`W37r]08nZ0gL %3L4,WaQPY%b8N&f0FoZ(B8)mhKh0I%ZCK+T=%d#eW0W?a[@=.>W\`#g-5CmsnXnPS<%MK/[rJtcDn/PB=j,!)"A]RS8\,].[h,=/ %kas[faka&9C'?J_MTRI-$hmuD3K`tJVW/E?A'f^dWAl+doU1a\Wk$1/d`gI*MEquN`ZZNB=%_C3bMST(;_IBiVb5M1>(+p0cV-[e %YMad7DcS?F[rNIKPm8<039uk1(8\nIaWnAWH0Iu+\L&^R-R>>;$+fD*A*?OlQTYnZ'Gdmb8#]Zc/NO5]$^a(=0m!s-DpjJ&F_eNZ %"/rHW8^n>:U70T]An^'.7"VFU'mi^o=NOXB,R&Pc!*UmE(!G2$R\$QFN+-et1GZ!9C9aLh;Kguha<\heHHpntp;1;#q]i8hV;K>rW[T%p7c*B>2\>'[A-%+[!.=6=3^:e,paXcB'03*i5KN$P)@80+/,K_\* %qs*ad\t-+u\C1$P@4)KAKEe%a_FtKH8&3!7Z#\4NauV9_kM]%__l5=fM>i(1@h#O"V8+[c1[IS5n`EgWN_Dd)9+6AjC0%E0#]N@= %e2SshWYeo=BP*7U(j=/i9hc!G'#iG`SItK_pMs]D7hHo%KSn:5&(u7k&qW8']ta@K[/4lnDKl6OS-l#u+Rj,Ge$ZDQ82YGsU2$(W %6u!+*)Mg(&+RYSRJY3ZD(6j<-]ckNW'b=_(Hq74g*!9S;i`(&NVA,0j_:Yt:Tp!Q>_#^&%,U@$_*&E]'!p.)E$KUIV,B%eCC90l]&i8Ei_5&s660DjiqPtJ(lj:;!$HE)5s7.MF+]_m3[sLY$m;(e>_L(*r*eT?9#,FQU,XY!Sr2!1,=_$ %ob"]>\=mVg&W#Klj@@oWa$s9E\p(hL4mi?X/@LdU. %.7dT$PK51NPhol"(Au'c26=clk5655n7GHB.oE(n,)$$h!$T2Jd9J.--PXr`YF4T-)q)CQe0cVp6*%5oZH-1_Pmu).5u3LkqD"t> %UJ)6#XFSMqc8.F_\V4Z.lRt9#g1lF1(2m#lWlC.K6eY/=C9+&C[TiC2+>>o9!)BEBIL6&-^ %!.0?P.8c7adCHr8gMu'eeL?Os(fO1FZrdC1_pi'rZ)./O,];pYgL9ujX'1u\"n^eSNE>)+ONjoD,gmS,$F=_lfuB@ %_eGNqe'.lFN);Mkd:th)U[$0prlHi@$Ct#Qbu>6m;3*mg%,/reX:S[(KLj+WOL&=#'rm#0>8GT2&1_.OHcJZdPW70_[L((6#G<3K %nT)-mQLAgfr>bbgn!;V-s.-4]-,s1=i2@*7.FKXWF34o*ZZN&mAikU6=;I1dqN5$B/et"`LWL8Ag1S7MU1rTPm:PH/Zr71m@]>/L %VZhN;TGu@-//6P@^TGcb*=0OUS`mC;9#n\7KC+/CkL-nJch5VBMT=Vm[ %/6TMrPJ&S-RB-Kk0emKI/0P/cRP9#TQjCo3bmTj$e'N68U['e."YK!ikcfK7FgDk>%/$X'0r;rKR,J]^n8aT:jY5$u#rPN(eb\2\ %KQhN\qLXm`\/%?VlP9IIGL4X4b2k1IQ)ljX`)L*KO0-$E0OHFcE+]2)bB"G1`fd %[d'A7qt#rP]PYhVU)_8FAN`@#mkk7bXZ2>qFQ,C&Lg##2-7k1J`85'@!_AL$Kd2e8H4WZFS2W`M95oR4q@[n4QIZ6kOOm+')U5Y: %]C9k'L6Wi^E3<=]#j(U0XQ(n.)&T)^XuKN13C]t5*`d?R%'"Du'ntuU8msq&?V:EX?i9&V5U-&`OLkJuWH'f_pAe78C %QCE0\amAer2N$+1e^[gN0ZJUe%h:/,(4XJ'"Z'M2F4>,ca@mr#h]AF4ETGZEV:Ui(SVn?=Cs12tpM,8(:a@6?(8@iW+r@ %j(MrE*[]c6")JBGi$D(IaHfZpMH=7A8g6fi$WA%15,0Vq!/#E:Z5dEUX%aq5#oWOc'e8S!FJTRi"_f#e,ToO(Xu8#[Z>-I@eEKD: %GfhSCG@#k(r*ml"kB8^\jiQLi"1WksQ#-*OBt@`2LbZ3SC.&$=/Jd2D>B$Y!pkXp?eJ`kcEntKl5.$(eZ(8AYfip'!8$)HeQMspW %i">utX08eY.s]'cg#D@7onjf1TXO]#O*G5?4h(ji3BCNon'F&ekTJ8tM7:'jW(g:R!USI:;aDjmI6\YM#t'A/[I)K!HGFD]MB=je %\"3"m9n>gYL92fBc+L._i?QA&<^ZJ.CqadEMB=RG\(TJ>NUfRJparrRUcW_.[,>-k8Gq6-Z+4/bDMj9^(ajokNTssmQ>gT!-a"EZ^mlO.=p.:\_'C^fJ)+&K>5L3V&!^ZH^DBC(G0j %S0"r@[T[3GD7<%%]WF*NXV&ra %/t.5hHAThQEorHdU&<$`h'0k8VN*C`$r\J!5QP1rI4A\:pL<+oclhfr:>2@q*P>+Fe/9GZQ`73kjFUbEJS?&5^K.?b.Kc6Hdg2/-`1 %ekt[;("@qI?dWTkL]^U:!O"m?)m(c84'Pqn6[^[66_A%F?4C"E9+h^5L$38m]Kp,*%k;\SR#mAV!,F0YRS@$$U+h0N\LE`]F %lEu<[W>_mIOpIB[qJ_H'3[A2d8JT?6p0`F$7c:fM6unV\bs>"*/u]ENP!WIhToodur2Gs8B)cSe#iuQjOhg?*\P$Dc:IZnj>uJ06 %3\N2^U1>\!WnKW?oLC7T&pd/,5\(-jTJe#4C4c4+kU(k%A?/_W"qeAq=]rPmFSnS>.0)j&$[U/Q]\1f07p-i1g:KnDJ=LVW;Ga30 %@31OR=J8p*g.!9<:bFZSf!>6(2d&tF&t`($khPIYls1-'1iA4@%8!E'kenM:*pF5OkU&e/)K2-d0BarU;fYVLiq![>dkd-N'C %WVL;)ndi5"`a5;-rHh-G5gCqgn.A[27B:<-^tU^=,>.os"(:FlZ1V5PH3A(JXL93egCM,;VrdW)Fo*?[k]+7f,Zi^Hb*9pEh6TS/We5E2+,m'l\-Z-uB,TV8C[qsl&gU?#b %gNEDEhPp]";&G?BQ`Y"9S''HbhR4rO8!N-orOP]85GGNaQ(QR9eX7h\Y9^`o2Od\pn;+&i,JlS%?B7>eJ6-jf"'W#c#%5_/FLtLV %W&E*9gmYPabVgUqZ-='=0.AU@$TH?H[568W=s8Dji6".8LJ%S%m&2CV?j':Mj,%D6LPsY]k/l"=YpTj1E<1B< %cqD\13i0JH&BHi,M`3g2,.&0$ZD=J.ZBPsd7L!!).F'Q53,apdWhg9N2LVB(0s$BaYk[_1cj\MekXC_XV/CbQ<\&*h7C^lkI)O=c %As7,??6?Fo[p$c*mHnmmf]k[`k%ef+9-3p_gDq<.m*nagBHckL/.C64jIpbNcsc4#4^;NLnU+k5DHXQ3/G#uJ %@b^$jA>=#!PZtWcp8u&//SnK2O!pL"MJ9*uHUQ[i5RaW5nDr(tB#ILS2b'9;,(ju^juO$).$[,@+DHZ56[PS[>L9p`>0?p25&+m] %"R[l>^1`_>Lq8p]9PA8K0\uA+9cu4pXu@[IMWfoql6]95U>1q`(`-&KWAY6/d7[N";fT`%BDk_!fPrKH;UP:lM+*)]r[6[RmooPI"Sc2CZ7KXQc^mki\`8%(CJ8r33EKkb](0d %8=9@OBVEdu$(<,>-9Om9CQ?XYXX4mCQJnI?5HK"!AN$H\hCiU]H?j$u@aluoh(5G(DYFiO<@S\[NDYbP+:MF5 %/@7Th/jjC3Tda,g*OQkTQB,r?Y/_;IWotb?_@/EdId+JIG_(.ah:u=A!6bj[$fj %c;hB1?1@'c=^=*TrY$4n[>Q+(NYs7CMS+MunI7du5T@cK5W;Ilq>lYMecqC8.4lXd[X\sH'-AUg\Y;)o>c==em"lX?e:DD05Xe`H %$t=?%+tc&=fA"""gPD/jC%iibN-%pE3>&!r9Nolir;5E"oU7KX0AG.F5XnLOh$.W48[H@+o=W?``QEinE*ZTqd&)nn^Be\ncn!YX %iDJ/Bj9DRZ9oLVj-^iE!V6eEOhJQM81W$U=lp!aDDuH:Cp8V3Z+qAk)m[Fgr6;`Z@=hOW._KW,I]\\ND\L)oVD;#%>9$PdgSW:\a`UB:qjf-etPoWH`:O+9>ILNXN/>Nk.O<(4Er2L#8#f\:?a1[d;'J0Qd[-BI3@\! %)oP`[i)#9/_H'cS1nZ)?U>Wl6@3,k'Mb+epY#RU`XFhAYiIbo7fNX9We6m3(7AprS^k$Y?`=NT%U">h+8$7#EA>a,>X"%2&_A;Ij %N8`RCF_O\^iF=/U0<3jWM"=GE/7<.VU5/k9=\3[*>po4Wk%AEOL88gY'bYl6_*uR6/4Vj"nRJdYLD#Wj\1/1;H[Y:^O@+N[-hIK# %&*+>ga+W]a5/D:>K26kP4h\*n"`\HQA+LF*.D*9BnEDjF^N6YE=ND!W3OPLPr3Lk47gUTB>gcAfhq'=f7Hia$EQV2n+"s.G?BPI9 %<)IS/&\kM$6dMNl[T90GDXQA,KAr=L%cn)I&Li?Db>*K%fQcZ2$4tjeseZ5*OlMf*iM3H)WJHXX43b@W44?!T\I?Reqi8G'q^sC&uNs(HPm8R))#0<-e$8`Gc %=?3\i$[8LJ7t;b,,#g$gb'U*41Y3(iFKAHF_nfD'3XI6lI*PA`F*_AX.`g;#X.oqS/%YggR]_IJ'P\/^p6lnmN_4?k0V`1MYI;0N %2]p_b>[pkM--@)Q]OW/!FG6#ZP9bBuKJ_B>QetEtRF+Y@GEmQ/4?H=& %pIkrB4q1=cC:[Z^jfLalLMo(MfDR]bnZTW3Mei\ZmPt3^n]o"(7Bn95*Y((D(NX2cQQKgSo.SPJ+ZAq %=:MRc4)XQW$FRF'.dT)T5VB#h.f2W^bV@pPCdhPah:Jc.(^_u?WhgPjRCC[OiG`(M0S=YQ5/Jbg9jY$3Sr4Qldb+iL %rY=EHkrOIMAUBit%"g665YuS0]&&52(@!Z+17\\&-kq*3i`$'kkCc2$FRr^5-YsuW6M&IYPNEX3@P23V3ZZ'u3ca-rj=&U7C1H%Y %T@5G`T&&b.7hM_dmu;.eSu-,T(J`[J@(Q-@l/KV$@*1#'qR"^pVG(3?+a=@PDDOSeoQJ`"B<]:N]Lq$m<`sJR)0S)!XM< %&u]).!'&2,-=eZ`)Zd2LEs.DUcW3,`/'H?n_g?LZ,'"+Rp@6W9%Z[7ad2\*8MUhm-m@]JrF2YU\,2#oDdWX]^W/*\I*/_/$N]Ir0 %/22-.&-Ir5gkMZs)YsDG!9H$T,>XV&G#I]JU9ir*X@l>YB0FV_S'n`&6eF!+ %JMlN0rotEaS$Y.-!@:*.(0MNQ.TXTC)r"JCKt=J?1jWa%3WOC"_78bE'A&C*L2pDuF;!nR=4cXUQSfF9J"W81gkkCh(JboL=?=R?H;1KjV*#Y(e&W[T6piY\2_mmX)Vo\N_La!f1/Dfg+H;Ab+Pk>_0W %pb.8-2'>r;OVD"HY#7eg@Bp<23YN=sjP4#I`j %#?bh,9I8Y.5=%;!^V@L1ZEX7?0#E1.gh+_h/lS%h!CX4'Hgk*=h?>14EW[Tb\EX4'I-U!hDe;+cZT=2JDUSoC-nGLXFt %Q,nE]"B1T+4k4Pm_tdlX&&qU*TB]:<\Rfn?EW\dh',Sa4BTjiL.RFikD;;=#@a4h99=6O,A?%k[R4]9M`d:R?-R&PTa<]Ha?!8IM %[T]-7Cq`t[,QjkR2dI&i2O/hd[.VVB3C1ZDI^(HcB\+0fY3J8`UVEMt[lt[,.KD]5[V&Vn08.K#;VG+7[O+?.nO_E8N;M/NA\&Z[ %Zusa.jD#O.6shi#9-WXX'7!bZRaIr="2TEqg/=7GNQ,PqWOgS,j_2&(FX]An9_4fDbY;5944\3og;18g6OXBJF)SL-s2.uR5'=$(NF0Pu %_?*V;-5D3bicK5nP[L=SbgFK!%Fku'lB;k+/Lr;]FurF)Y/s6KPS;?iW;T%O7:$X'R9DN7W!gV1OE[4.,]KN%ocf'g(+W,A/S6h- %!EunbM+(*7*k3-1H;Kp\DJY`YAc9*Fu %0kr49OL#9+8Lgsjohpo0B`h#u.-i@11,'C_Lq)2leSq,:^%Q?q&6W(4n*_c:9?9[giLhW1sF-JATcr)@28+qdh?%W-itOF %3#gF;2]o*%m:rMmd:T5"Mqt/$P&YqI.f<;Br(p%UQQ\-9.]>lkpp`=s]<"2PajQcE_Fk4^8*,JK]\UW-0!4BA>&7D>*oW6>/9JXGIZQoDCo %ULG;*FSj_JS]mhJ4*Hp2V!n/2(gTNB<@Zpc\!fsNjqB%5g?[#$!RN/A^q*d0"G4!0=2nucU`_,)p#t9Me8,'Ei=kFP+XUhb?e!<1 %]<)Y1!(sih/2J.FW-'ORB^jSV?n)310>(&)!QojJaq(&gQK^r*^In_aL\pk"\/$Fo9h>0"@WGsEc:eSP2 %j/EHg#B2b5VXQ2nWGb_GX %&]eW"6,B=A'D#`>Q%ATb$JR6%p6F=$1eB55iBpk;8p+B %2M>K%h[oA!H(tJ;OAm2oD:@'5\n,'3Y;RcjXVLKGSbKBf3m^X%b1Y!UCp1)iEq@I8_bP2cbB2@n,E*gTASN(o()_Ho&ec]mC0:uH&2J!6rIRGs21n0I;sIXqY-E;ijAs0G\p(j(HRqWm`e)`/33eg*13E7<;>AO+B7UY!O90u@*VQi]BO9`j[mlX[LEQK[3:$o%t_";1ecnDM1C6F_]7'm!ZNtXeAOa:Z'IYi*1=aiVA %4UZ#4.\]=Q<(8GGEA6"T`BZc1)l:ucRWjoH=A]_uZW.6c1/kK=C7;hI1f)4fdfn;AZ%PZ3BLN\Z"K][m=[3`,F)[lZ<42In%NlAuj`9C.YAaRiHKJi5 %)%2gX^@J>&]ToU+o^na%AT"NGF^s5Y`O>E:kC(eoR=K1DbQ3k`pBq.^1p#cW,5TAZ7P:@V"+eLsH2nr$83-(_@rqFa.!csASh,@G8$/:-L8->Nt"hU,*PRdZ[0=9.qF5sdfp#FXk=SRm1iQR[8*CaDBN%59lJgV %9_5.MGc1'7HL;,bW-B#4O=TlX`G9.$B%Vc>u?8XkR`=q5VU5C.5q_hX:S %UgmT-,$g#_g[+)g;?r,Rc_&Y'0j%V>KgdAcjF"`=Tkp`G7a;N'3;JqJd4X5>)"e+nR>?1)@A*_k6[1aOWj&N[MU[*B\S\`[@pP<) %o-m9TMF.C[.I"_,A;f.=QQOMu,u698CqB`8mO0QK!HsRG'-66C^8oCkqEn!pH2"p*`n_Koj@$rQe#`T=fl+TuJ+6;5 %l&5T:f3_fiNF>$JRJh,!m:ZIpldObH]Y0t&DTqq(J,&rlhuE*?lJ;65P;02ob:c*8?+d)GO2nst]6D6if9]QWD_Ln=_Q0=-gUk)n %DtIC\hgTW4s7Z3D\\B)ek25'%Se!R4d!Fq`cE9@P[=>l;Hh[2W?VJ`b>s"pX=9$_m5LJ(!Q[el.DWaO,je)I=G(66)GCGotTAV_I %^AP_^kBF\Nq=*h>R+a32rjM-&IDu(q>^H-nk6KePkEA-qci&0J&D;8pN-p7:#:<. %rURkV`Ok`"?!i<@]&VP\msOC24"Tc)TBFD(pD:TU^%ecAj!F&pAFA:Hae/(YbnkSjGNU&.[H:E%kH"W%H$-C(T%UX:PeWo&]P`c%k'FMgrE' %qr[4foA(L(O/I;UL\f[$k*+SJF)cPMGB:Cfo?8/FCtH>1\c1aRrT2ifS*%bY!8E\ZrU$6Uo&?]OT-(b[_gA,Q[s.K"L=pqHS"%Uq0?i>.3>caXpC>[.gKD92h7]SqGBES>mbZ@Iq['l]l,C2[HT]\sEVE5F96'`](\EWD^Kb#lnb(SiS%l[f %bh#%Nk/DX6EceU6qbdpL0<[Qej='p,N6O`_%,TmTrT2"*/f"8hZe)P?oOKkr^Rfjus8MTUh(Rgk4r7FLTCmBkHY;Map3(Y>q"AW% %n/sYsIJ*U!mMA*!9Ich:M7)`Ko-hrM_fnUE40HToPu4Na8Pk,7sC %pNW#(hYC=Rq[%,$hq_PO]0"Q)dSn(/0>:7GFK-_?1U;eM*8?m!M"2o)A1I]oT*>qN/J+ %\Gak[]uant"RUO9]u4jZj%\G;)>_(fY!57-ScNA8O(UN?T]]+O7c_h=c.+Ib0/!6Nk=j@`6DO+s/+A@RH9P[8gWQY(h=I;calD:S %'0R.5J+khpG5!lg'WT*dhO2=?p?_2.LYW\//q5otpu_:>YA^R]rq,S6E_VS:m,4/^O'aAZW"3uLAk-G+j".86=(Yh-*"dZYH[`^2 %OTXJ4-V),B;t'=E>I2*9H#g">J*\&F[Ut""4a5gsd*=>pkJf^TjmGUmF#dKLI\OLdf-`VBSgB<3*hVEL@88IGO+$g9bfDTqmQ3Y\ %U"e!W5KNa#C)g(*n;/7MpH*"ZhL'bFmbPk4(Dg-hkPKq+*o?\V;d2=2,JW\75.pF-cCnTO^Am?\m/5l>in`Focb=ZoLXGeJ(i&4B %lZ;QUp/$*kIO+;#6?kCYdXGGW#CIejQ(iWulG4S@`ZKDQ@fFjE^(DuI6E&tqc0_^.5+[\HgLCC.\ou`Zo6rUO@HT"!FR?;ZRJ!I$ %?9+8+pXNS8Vlq_VY4_m:>s6#j^:J]9EOIZLH8lo-^V5!*]+$W9q"0-NO.8X3!ome[nMPshi@1:ZSJB?(c0j`]bonU'YAS9]GMbK0 %nY`S.gfaHtkH^`[%8VJo#J>94VoN@SrUoO3SbLSmJFCd$pH#P?qG7)q[hnE)melV3^:h1kr6$/=c#.cX*7VUVT8S"#IeYn,BRR2J %Q;?t^m(=%IUje$0k7-P<-ZVf(hHaH[4W--DZfRm-.K7]iMZ^l`r^;P0&"U'P)!8qGYEoTN3ArGDI*1W-L=nrA*V^eb48%BMK>X4o %3&o.M:NV9-*6)VNGWrs#E*9Npc5L0SZZc<.'=*ZpU2ggXeJU='PNaLbc6[8Nn5JiI?JLC0h,o7-Yt0:D+fO8FXEI\?3(TtH*r8]1OJ %3K/+l3ko3sS>/RNDN.\W)XXKNSr#qkH*&,Fg.tS@rQFR>*)3dVVpI'[]=p[]G-oVVqWt!RltE%4p";.KB1MjcW6`1FT<1\U5OOl? %Ipm)/kD0'Djm\;bAs[@5J'-MXkD)9>S"KJaq.[6"qVC8j0!9YIFnY2EpFC8H7!M@JYO]uK2L4o/hZMT@h!pmkhsJDUc,WHTT,6,& %qeq;XA_/;U:0]IOQ2`tV=$D]FG-Ao84s,7qs82WeLK?]$@e5f8ke/*NRiU&$F!jepI/!?oX35^R]-iGQ0>=tV]DL\2+)ndNP<[re %+@]\TOW_Z8lpq]Z6TYUd'>tlJ%J9e78Ue3?Zgm41eDKGW%NVU"$s4L\3nQO%FQc`rHYoAW=)T1Mht,'TS_m\%F7Xi_hnT-Z&U"!R %..8P3$#fYMBce>+3qtmsmEjD#g$RnWf@Lg_];t>^WZGId$fB5?o]P$het8RD?g[h8*s$Yh%hbMO45K]u54Ze\KD:(JOH3r0 %f*=mnr="*<.?e69_9.O"'." %$Mg&Ur_=!sJFc4U--CI++WjY(#Ihtg>S"K\r9C7Cs)`U-na?!gb[5aHqBd0.H8[rgSi;Tu(_4"W%*$kI#MWK_6YXmHd'MnHo,II@p(;rq=U@$bjY[c5WCk8Gbqcn-&sNNcCOu %guc/fD)=j0E>oAHE;8Q4[lMHFNcCOugu]H_3Q>orELR'7WijkGIh?Dj@h@oBK_f"rpd/9@B,H>KOlc/k,91ji&[n#tU@B\mL/4V; %Sg0$1^2U]:5>qb5q)If.8Iot38^^A.QkmEK!fN;c8l7hZor"eLE"\MG\gYp02RNW("^bK`gKhgXX"=Q*M7H\)L5qQqX:uf*bK\\lC0rT)2a6k[\EJU(](t:ML2%DLB %nIot!n':XBn@cbVo2iD6kBCQ?^U^o1]j='DhXMQFQTd8Jlh/Ok-=<@X^\H@H`IEiipQC*r$+MHeRPATs)<7k %#E?^B4eMWYc[S&.f"lAl^&)dIgT_k#ZH#I=Du'%_B]o0GF7FHtJ"jX"d@\aaE$RMk5%I/:M=JX"hRV%Uh9G@7aN\-4+CEs]>joCV %pu5'kmG?Yi3`7^"EkEElR""ftlU]"e:HngodusopG,Hth;1_8epi-,lLT@-'SmNK-KlO<_@=KB/fCt+M=.Uhc]2*k-1"cF2A0Y;glEN3Ij3qGkjBIK]=6*94$%aZL[XHr %D-J&OL[XHr*?@=dpi\QpNt1(+3d`RsQaS\C^sV1(9TO,T%s[aANZR**j#_R78!!*dlga'QkOIs07*ij447Ph5mlC5ls6Jh0m@S:B %G#uNclgX;J!ai%PpEH*.]L8'A]pK'8]P$-IcJ4QPilH@aV"+@30OEOb+QB;qi-m`b*M47t]MJ:mkH[\QHDj3g,@=^c:I;Y:s7;RY %BBOdDr0<(U^,\9i]_hDppP@P<^\d_>pFLu(rFDD^=7hm+BJ9<[#]1&70Y6/-3cKH/AbMUAq8Ua-VVQXkUMBO9&C*HRIJ8n0TKTmg %5F3CsDmSI+[tXhXocAh5=5'nXA;@L,H*I1TIJPM7IZ*]Ro`HMb'l74EGVU6(Q^=cf:,VS='W?R;#?F[!HH7).]dL)Y^.0:2k@3uK %I)P"bm!Zl;]^Z<$rVJe?^\mJgRs,\+j!j/N7r.j407@;Vl"D[ic)%&>\b(SjiFcgW]h!PCpFr*Ih%kC+aad0$i>tAK5?^2Ci"a+e %`'p9R?J^*YIBa%Src:sH=-n-G41kEX/+ia%hjr#s5OZ=crqmIWCA.u/#^t5!+RtP'&V'f$Q0X(tKDm&:J`q,^;\Fog@;(9gF.e(UFs)7du8ToMurmU<#&=5VTUN^j%qeL#`kFs\;i2QU:9A5C?+,@In5"X,] %;j05T(p8qW^A)a#PFZ";,"Sf=?S4 %lC,]V[?!bq,SaGjTe2Ug0_q;.R)YB9q=agA\Or2HqKEaqV9P:WcFZ&h[CgBedR30ol^Sl#3$,oH`qQqR?FT8`M>cb/H_Y@D*ku&3 %$0e't@UXUh>Y4cbIJhM4*h^169ua<=>B='TW0)cs]_:BH.SRQg''@e+\"Y\2&Bhu^$t<[SI@Z#:YQ"9/X15Z1DaSuT^+Ps_6#l:7 %.ZJp/qU`EmnHd*pk=T6mr*tlG#7ob5cPDpc)SbT"$d3=X'$h]@nIFf)'d$eD2,N@R=e&O_<[#dIO4fiAEsSs*IAJ)Hi8cukisp'Od6m8-6,l\nZ?^rmG(1A#H\;1t^P$scL6`ni %)Y8U=n*[UXV.-U!+*N$/+*-4_Wp\;;a!'8c"+>PohoAf%hcBL3g*.WdhJ44*DJY3CHiog'%qF4NrO)04HQ9NV&iNcVO-TEb`ekY[ %`A>"Ojpeaf80>LBnWt*h`_,T3bdP^([5C%"[_DRX8F0hgp;/8:j7p4"Deu>C_X!Fqg=UX5NP-?Q\@5%D>jpmA0,qL#np4Q+2n"02 %I>m:VX,1.rlL`?!7d5%Da2#$MWi+IMgLeu6,k\>4%>@9gZ-`'Aq+-flcc_$P^[RCpZ!LO"nKNf%^Kk+p,4i@d,3CV[2F'6k0iT(N8$4W3EUUK*8^Re>Z(\4'(ZfK@,*sPWLk;;mpT1A.SRnfr`[f4b-4tUf$XYu5F2!R(bN%4eSN%&!piO.ClCk^Jr*4B=XMtL%bA"f@Z.m:@Pd`VqH?LUW %B5j^:l\]5GA1ui`]<8=a3`Y*[j>D6S3Ufr)PMFVQY<(XY3hSo.VU%4t&jQ!7k1rI/+N#BCDmehIGE)")16`X%/<<$7l=F%Xo@^Sq %_QgP]m&@7RADN>Na<;og>`r_G5*Y-\U:_qq?IhKB'N.$GoL^^gMZt$1^r,_7M=m^CXj441[O7QjF_l`te]q[dmZT&WPWETAZ0c=< %$[->)W/@jpa2d4Y6Q.FRSNnGVW/8#brf/7_^*U%)S;S6"[B?A;lOTE"R!0%O7u$ITYCQU#"p1?ZZ19sr<_sLb.u\])FU$mBHP8co %]e4%eO098(XO.7,CV5VrD7aVS'W^N,+`>1QQ)BTn28-H=MM4:Gf0/(PdRbNg!#;t_:jN!o=sdAeA(+;q<*Lqh8YhYO[uW0\4Mqlj*7NcWI'YU!<: %SW79XV\Mo%Z$D,E&+W`F;]232p?VLR-.Zf5p]QXtS53G(Rdk"W"%9edjLlA'X$P@f=92p(nHp+6aZ)t9[NY6kUJY%O$k:ikQdWlH %2?D5NCnHZ/am2IRu`5!:<0P#T7'h0O<>(1o:hfWR%H;^gO0ni0b^!:#5 %@.iHt$A*"0b::nT-/ie[TGhK$MIKu*SJTh\T>o!BAHk?frHW'X>u]i0=)TrrdRX-8fLt2D,&sQ1&X./NH]BTni`sL/TrL+l;Th%(r\IPakuh(Q=!JhE/9h,S$D)iZ*Wscf(gUNLqF;DCiSM1SajE %rJ0USo^qS.j7YauZ\cc,7R&Mn0u:j%24hYt/,X2\-$[hDD%u.\b:o\H408@&Z`#&[F$'OH?%h7IYWS?W8]Wq3#!g1#nl>YSEW5Wj %2:pN-K@&1^-UY$*f:fT'#Bcr:XeB[7H4ij.@rmEagIffdFqYn"dFZWk[g;.,S\hq(jepb[R(L)]Zt"ZA+MUr`4"aC"ThNB2I1^7fgdWhJolX]h0c+Rj3F7VAD2iu`a];&%Du3cm:1F58fI82sp\ %>)sYdeKcN1Ska4rl1qQTBA'8Aa&;CGk8k!Er,k.G=]f*`8D9bW()&=mV2 %bR)u?A%AKHdpjrI75q0-6AmF.V[J;n,n%&90rr;i?kk\,`M"XdbbX/UKc;Ah,+dp57=\:UVbrXmr05O4h)FUIgfni*m6@&@"G.CV %O`j4X\_f=qfsQu&h)%AgJ'gpG0NH02`8i#-[6m'`8%WC8B6F/2N9*0<+82`o$u:anA.Bk97Q)E^W8mY#9n-8O8 %`2H/'\[q]R`X+aigU?&V;rGEF#R>ZlX:6>#D2AnUZ/$\0\iB5Edm+c$gP-ca2>g\g/sK?24[qKm`>DpU$Y8ioV]cU;-B$'gk\.nd %X=GsWPKl)"mcS#O)_fW:`Uml`A&WU/_QYT%BLFKBE3Tq>Hq64*9!9YYL_BHXenr"pqnHrCa %"Xg/RlZdTN,TUHYm]l=M($CO-N*Sd3d:+2.("O458['\_;Np/C/W&++RhWkXQ=Gr8H-PE/;1"4,QKn+'mYSo/,,''mIQ9/)O:W'[ %/W6dje$5nT#>Z`Wd4*R;hh6"k%3IGpT19_EPR?B/TjO7J"\P3lCKULH>'I*iQgRVDlR_2&XGOCnOUrJ?\/2EFXGUtjL? %l9,kBV@"OCPRhOL$`"Mr'j*J+_/YVmm3I/(p`cDbTU%>'#V<,b9k0OOpg^!;Q%!4nAcj=>_arM(_b3)blS<-qn\G@lW,9XdZDjl* %:qD=;m'52N/%sbc"_@'1'cP]571oP4jVuoh-&5uXqS%=Y$)^\nhJ[jH$E*`NXJd`QMPiL:)A^Q$@DtOd'MF&/T9^PL'^tJX`1<"5W8,CRj`:9]S,6\hf5(mG81sV*'Cr\aS&Ip$R %='2:5A^so2YX@(i+B(oqh+H@12LOcFE_(aUmmL"S8W+#]lIg'MJ8`B#nRCE6-Qt>Rm;%*(U<'^0A;(MO^9cWd+]SCKFC[sb@iV]4 %-fEG`bLmM.7Dk,g^IYH-F15g"V0iW*-k#/8";>3IJuh-Wi/JXQZ0/cF/U`B3mYs8nN9%i7B94RA`K@>a>E4coNMdu$A=-g(hAbD% %VFtOLhA.,J_eW!4CSd9J=@;W8(SLB*MYfHL?Yh[G#>RAf[Rgm+($a<:1)Q%GX8Sm%IS<**M0U+<3o_$Markp/bJM_+]ar1EhW#6XDIP@]^@#mC?:)dCQ%/@hip$ %8Vll@`!RWLP!i>CQHcWEL[siRC@T]mUCJ<$Ulq<&HjqK)nJfb%ZZ9S%8LMmdYY2=>ffV!>b+j4`04`g:*a2FL;Go&KBTp6`_c.3S>!%4)i`_cqc[hj"%A42*+Y1T %Zb\$lQ4TTlEeApBSL.oOQWum(,Z2G,fD,:goE7sqqc,[^gCu,dCT(r#B7JDs.=mR?B%dNNegrCR.j(W.`iA=0ED2P_$-V68j/*V% %@s&1/e!Z@N@MK!.25*@KLS3UU;Q0u#-;s+Sp)V]p@Q6`r^+S^]Nk*7?L:Yp&*ufsUMcGc5"^G(?GSheq;W2T*2/lt>2!9/FeW2kb %1`o0u5`[R]FCT;u5kC>eB4T-LfP\9"Z)37T5taR[\J*D7i\a38k&e3TC`G0(d@Nk5.23b"ZbB6C>0NJC3\*c[CC=oEN`,[I;e8<. %A:4J58$c>*KO'Zgc#J^)>Ve_'G>4\UjJ4OWm5;=gl=Teug%)>cisE:+9:Y@(eBHfL.k2rM>f: %OKgM@A<315!/oS%X9*"*;iWXD9Y*48"[IWi?l6I(W]G.,X=?-InFk@c)[H$EKXb"3$01&5P%(eaSYe/%]Ir'?f9K>a]d6OFZ0s`$ %MJi27(.0ajQVJMfdVZgN*G!,ma75XiB_#T>\]Bm\b$/Pj3!Nc98P@'$/M/l>Y9oakMu>mCE.j3%!a8)&E&I6VpgbaLe"(93JO)!pnJ$[O3;s$Hrm]nPft&Ur\1?FjHqIZYu^I&1(K]4SMYPU#Z%Y7lBeh`=/g0 %jc;]bji)u;gTd8(dR&duV9?Fpf=P#'Cl)%\4\+,.RcSfD7[t<14kDip%g8o@mL^(m%C`m?33UlE?T6gk>P@8)T)2Z>96(ZRo=N3c %>(ZZVA;8+0%3$4>?;!niD#s$Bn5.N`!u+Wq9#)nCMNi**SH'QBs7oL %;!lU']BV/j0tDuA_96HJQY_E>Z.&L$-k_Nop`r^q88d7 %Y78C@!fK(W9dbJ]W,-r9mK.eI0>>Qn>'+CB]]k/m_]MU.L#2/Mmc4>nhO>q7q.*aSSGhbM;,4c>,[.?BZ:Afhh7tC %ebRn)R-jq(76I6>BdU4-p6L$?65BrEpPe9C+19.8>LR]P#Ctj4M$&:SZm8f,bR^p>Tq.Eu$SA_^MLi3+g&LGTdA(`\pD7ZMY$=]KBd1j)Km9P>hCZFot@b>o-::qqebUL*(/$rD< %9P,9-lk5`&.3,.Y#&Zb8N*`&OjoqS+Cq>mldat]`9t/VUZ!s/n*)3m*#ql9fa@h!;L@CO*U6+5h(*M!EZZQ$>Ykb!W=_u"e)ddg90[cbi4TP;H[`Z794GBpSr^Zgeb$-#KU+&_P#aY%`,KNQU9*6/IGscFI!!304sW=0;P+[m:8O: %mHDfg7^$^_+W%&SaE.J.a=teYHEI-!W,(WPPj.R1=-2[JU_qeLQ;*ZeHLT:A1[QqY\8p.3!6f)HhU>G`0G:T5F'l*a@0DB0'&IP6 %B2U0IYA1FqMDT(X5[qs_1`R'.$*0S>$O4@2XPjk"K,+,tq+7JG=mu5K5iPIGKED[5tk;38IGdeudD01L_r43!S[]@-\-<3rR/mWsaUM):c."R8'7N(Gg9kiqARO*:ZYiidmW&16ZdRD4aVJ5lU+g0dg[ao+5R8[pVA" %,'*s:PLA\:PBNnE`UW*3*]TbUG5+$$\*F+R1JJ??M:gnPMcscGM$Zu[^\+kHF5Rj1!O"BeB1M>gXcNnLJ@ltH;6dZ5'I4-[i2Pfn %aprDf>XcT!8lJMD[bR9ZkkkmAM^\9'V'bu1T!P-rbg](d!h,;1%*+?84\fY$8HpcHSce7>/9WdL%`!?h?.39gl/9jj8HoO9ET\((`^b4E:1n.#gCG=GF=G5Q %/a/m$&*s<4"Bjg8qhT,qmt)A,rtemkoHkWCf9nsl\c\57.g8$aJe"^QNL*"09Kj20-+II[_-O0;@WWoTrAl._(VsOK+tN&U1CPZ8b6h4GSRA'h%j*"qdm:--2R/+P-+6W`cU5/?F*RnniAG&7AKP %@&8B!G17,P8;R])])TfTIgcs5-uJ))G#T!G`n0-#Sb %,;fa1N_X@Y#YY=Ln\8$(]cGS09E;nDAZ8uXL%$p!23>uK)3WsSk?[R%Y %\fI_!97n$b)]oDa?B>?>ROt;?M!==sK7sDK'PEEeYZ@fJX]Q0%*/[420Ddlb9"YVLF1%Y:o&__VO2LrX^5b1daF2GG=+PdiB(8n_H %m8F5JR:T^_MEVjn!mN4JfI/^ABZS;!(VI9Wa7EkA/'1>7^]L]m5@am8FfI,j0GHC`;'9kC]sUCUcb@[uF_%0;5&LhTp#>kK`3ZA% %?57;7gfHE]U?MI%lSZ4K+K(\t*aKIAj/85(bos;.OkG2pH$lYre`BA0-Y)kd>WbcJ3=;X6P@NmMI(gFid#\f`qkAfJI0a]b8Zo>R %_C;_!ck[=AVE5H1/:*RkE:)06T5%S8P-^h#G&k[/drt=MjU5pu#&(2_ %LHZnP\MlmGSY17\i;B1qV]-O,_eiVte7n!/l2SPgLCAC,n?\'BS0'NA&Q)P<&PnmTPQbZYF:fqtgn^=olrD9=JpfMMl3!A\\E%)< %,>XPg]i?u`;l9fgm2o`fN0\CX$< %Wp7Id&!G0i`NWOuUbg8=Ps8&,dnp+6S,ZmH/S&2?UqLC&[n?HVi_B`2&eaY9r=:Z65u>D(_Bu+%5eu:mc0'nX(UM;"XZ)/b-!`I# %,G$E"6a0]U;pr\`*:Z]o2kN!dk=TOlT-KpVkn_]s#SKemjX&Be^7k<&jrF.FNWG[ph*-(kpFj9ZMK3BX2pPYTL=5?TqF2ZlfY%bm/[].s[@[$Mc]*WhE\GsNJc2*@S %K^F5nPP2#gBmbrNqo(G;qMX/dmXDF)c;_9pI?(i7`APp7`S9Z1Ic$YU7rL*\;M,F!&A6VGcJ0nE$M")*\Blf8@AciA3T?psd=n2= %7)btC!Tj0>RM"n"-GD\\(CE"B\AXbtF2UcZhmN7A5/2&.Z\.fL-#qc`bf/%1@)=FQP!U_G&OX\=c+;XVe5q,2],tXgOD:3YregJt %og)M#CXdu6-S%%P?q&jp4@/^no?S#LP5C_k\#i3EcW]%Zqmn^DkDB(b=kDJ5lM7tGD^c8YMU,m8pJ*hdBiB&4Gbq81_7ZU=gc)52 %k]u/j9@n:GCghubhdHa?ia,?gR*H<3[e4R_.8#\Mg\-glJkgBc(:pHQ6lqtkW=KW%\OWK_SU)^]heZbiO%o-?On7<^-UU0YRoi/VMhUQZ-cS<*96\3>&t/iFHJX(IFoc?>he=L9W5; %F,.3"!'T^_7+%.,7U^-c'!6,*Xj,!bR)qq]Z3nQ,6sA8&+po_N_.a>iQ9po%!B$g[G8#UaE4pg8KApksN,s=57kfoNM%Bn9AO-(0 %=2p%c!WWLQLGM7Y'TRo^S8cGC7S]-s"DeYc-/4$udF=M_=om^4"SDs,ifMn()?a#[CWU`F:JO9P6:*_%"^&V %QB`'Gm4i4D%On+=m/3hb32(q;7\!X-$lUEZc3o7O:6uut(h8@o:p*_UGdnGEgm,[9:4$LS=Y%Ms35_Ldb>g'SL!u9>dkG1M;-Ir$ %-]2;G+h!:\]iZ(ZfZ]*PmP:.B2#0Vj\2UC`E:;k.V4"/>(GQ8O"6!2,Kt!;(F+^uQ-t:f+$Ad2.tL7RtIVK72c.deM"W %;1d9E$-D.@)O)q+].>Fc+?*4H&QjF:$`4:$0B$R&0hc*[Pf%s3p]+/f1'^*BLlM*FBpD5QU`N`.bD9`#`($I\WlL4t62N"6O$b@0 %(nA@9]ADc)qFnhO>$#2,aVnOqO!P+G49KX@/];+T6VIR,Ol+UVKGeY1hbSLh25>[EPjS!mV^&NuAmNK:DnmPh %a_?:*9d'l@p:<@V56/)AQrtK17O(J1QD@FZ&H\aniWCW%*[=5%MP@qoag['^,qG^6=&6?jFjo7PX!Qf)X!O4hSR7^$*49gOP>J3? %"^N4>:oJH!0U"dgP_1g_R1/AE;:o4]XdlUPS'7VnH"m^Q1bCkErmA&DY-e+H[,>2WHB[KT.-*U_.U]b,:d8crd,\<9Y+q3fMVldn/TljRsn6W(!NjMMQPog1.9\`0\rPR^D(nWo/bobc/RCn?f %?MRT8o2#'JUYFaf^6]"Q`Y\;I^gNls(MF-`aFf0KIYn.,Qp&U59Y;aa3>0Gi`5Cc>W&P:4EJ##X$()Q%8RX7UV8D0[*8LcfUXl0& %_OaPM^lWF$N-a4g`dGrd_RM-!kp&S$G(JbJTmPolSBc:Jn8JGFl5p3kjQO)mVYa8Kc/^0"H[,9%]9be&.E>m0C@j.cQ#hk:$)]V$ %o0E/oSa&BkdW*9NE*D'Ntcr?r=WN3Sh;^1V\r.]A)e,m$EW %jCjl+$VtaCD4-hdnC0V4BbAYS%!DYZ*96*ReA9[64d3Q$IsT!M#,f%@8Kbd-RqLn,\UdjQHVH+Df*0FG='/T%h5Vm_u]5& %:$ZV^>1q;HHK-#aNYYAJ]jupFQNBCj2.=*@HCPheLMFG1'+`A+@b+tFpOP$0\5%huk\G3F2J$B='*RW+(g@u00=Ek!;!L:Y.o.,k"!0.@;fl6#$Ddq/]Nfm<_,>R_H[j7m*7bB!9anb\:?u_K %>1q+PEPAdiV^k=UD*r,Kh#>DVAT)\Grb6Hf*\].`5\N9$?^?(m+g5SHKj4^RjsC:NH`'lI"S3P1&2b;oTqR`gmHV']oYIBM(Lj\lNsU %-h2JT#rP^I02(PJL2fXt)2&6@pA8Aic"K@D;COH70R$T&l@oR>l#07Y[S(eo$OPg!@D4&_$Dt'_'_jRTQo+OUt=\BGk`%G\s2aY`\GaaW]!Rd_#sebdG`L))ee2 %(l>@UXiV4$F>Zl<"p23'Q#5o?f(D5:r"5-085arUA346u)np,Y9PR'k[Nd-l7ng?9-FY3HgTcmq&^q-",Gl:3&X2UoM]FOYOuPA24#C8+bQq<)Y-JK,"69SduGJoSFO-j`R$je-kar77*Yp1T> %7gtU\eZ`'ik=3<#1R#3kAgYM06V@$-8Tr$kU.JT'g(D5.i;1>mKmIP\4(;g=G/SL^BL`JjN#j_$NXZmoF8**fL(f08\5jA89XH%! %K\etjm>,J_.(1?IgCY+RZ'"F0M>\$M]>`WlD9%AO0hn&3,Gl:3&X2U<8aV>UG/U3ULrjhYUis[e4(;)L2Yu7*4(>K9#$onma$sf6 %9J>amQsOT!9WtkYUK7)p9,o[ga&@K+oO9mkEjoc;&X0g9^)\pb6gQM2ZGhi`:2;M!8'FYCLI'CXgTf.@OS^9"eTP!%[EGq[otdJc %(rAsmF0-&QpAr4c%'hT2YqRj_U[WQ/:f3XNkL74C$8]kb%l@;5A!/iCBj>7:-4\e@[OTj-p\\4rLd9/Yc/?%[$%Z^Z6V)!(6YN@' %##rh/'amQ[6S.fbYEr74rOLKkB:IGEH8M>=:Yn?rB\,r1qHtZ4?m6>GGj@,&<.CooGQr^<@4B2s%3u@[:&):U5hY)RRdk5apBK!I %XO9+Qk(uj3[*qju`$r).mf=8jkq'&>R6-m@)7Q[PTO7og^U$j&(n9bpB[GD"f]gsDFc/;`]f?1/$qJoR\M/ae<52HlN\HJ9EuRWT %Br_H]C"Q-(ju,Waq.]Q'd\7WS#^)M$l@`7E2*h8cVQ.9^r*tW(RL)"G.24VDU(Uu[2+p\B=Z)8j8<,7&ABd6jYS+U]KaWHb_%^9- %$&oIN"":j6/Qu<%lV!EAOQBe>-Q0YUUpZ4r!0ke&Vj4s^q]@IsIqr6CK/GACXZ>@*+Y/fCL^)I8b*@o'iqoZj/))r)PcjbrjUW/:fEsSA/-.6JB05QDYmM02pMdVT7!O6'Q@1>hctd5!2gU]/LQ$C$Q$k:o7M7Tm %><3C-.:ddX?A'^<6(,!u%_G%VdR&d@AI5p6b0$+e4$4oe3GAO4'N/6fWtZe"XU(tqeUTD(U'Y+.i=DEcWu#r-0GEJ'VJECV,i2uB %1uB:#1MDA0(j%AL&rqK"3o0@0Qr>A#%I+56U6SGF2]K`lg\j8@T<`jR(W/C2$56\$S?H7K]FK+>j9D#*%_d2+SgDQ[a.$Z+<"lQE %`qn$"88UtoU50:tJN>W>)6OSf630EKB4\adJHhTiJf"SM1?J(_ee]OKg(T %0]srj-i]G,.@N!.ZG\K=D"IfX3ihR%m)RP;L%VT]g %qkWP2QqN7PR["mN,@[RY(E+lK0-:!u&SN0oAD#F?li;lJD7d*U?(KQS5.LLk';t(n1e`kQ'aNA1K060)=YWeW!AGbN/HqL#Xd(CW %$S1J59fH2HRj>,u6k=#bR0bk]%Q^qQYpuIkpg(MO`%LV@ZDe5OtM$(M'X+qjl0+;G@$CiY8j-_]B"?->m-lnPV/WBdnu\1:4"N"iA+Qg'R/* %oWG9[V4.i:Xl-^]#rtb[h/XW-a8dk>"G.s0#c=Gg#&OF\A(Vf5a;CDTP[SbU,eNu%.oDu\dMdWn/*eLH?lmO.3"n1m?mg+ae2l2B %gRqS*ZV-fAXi$\l6P%bf_-W7iS"1o_k,0`\Z>MP;*ncm=)S=n+CdS)GI(tMH.INE]b>cpg^'a8)=Kk8sCu8:B]%-m`3aC_a6<0$= %HAS*j_8JC2"Se:OooPr%UIH"($R[,%Jl!f!U29Ub.*70@MdPh)C$]a*9t[',OuB;5]=NaL$13*PKQ:FcJ-D]KX0aJ1AOLl#8C'0u %_3WBiC3&1AQm"AIGl2dB@N<2/<*t+BL[0\i6L>CndI8b\,(SK0]0N<]/UnY+&#Lr/f_. %@pU\O"Ep:lBu[0WAQS?=*$gF\5jN6E>1q1RFhFBf'?>hKXGm<0:Y%8lR,M2C>FB9C>39ZAaK61lbLa1^%NPR?&B1oXQ.nkNm3 %9_Z1$W<7HjQ0l`fNA[i=4Wp`V42N\cP2!s\%+Q2:r]n]=\)MQ/KhMZYNVq %m/!@k"'n/YNA#,3!rAlOK+Xa_#kDfq!`C_rJ-6FX#n:0*"?d*VS-_[!'(2b)UY%+OAX!4h>#J"qI:E4%Y2E %TIn-kb(_OAC#auU;Dqb;AuE$Q2KZc/$lhO1[35ac)YE6FY-t[BX^.fHXUd&_KVE9*#lpM3jB9Tr*CD2T@7"jN"F8R3GjX,eH#f2_ %#CpW7a.(#R/\Bf<(;AHWt6dAeDS;RDpMZ4M?taCoqN]FnH#b"*!XnTF %Es8Mj&E_YV@isjdMfZ?l)PG$c4B!?\jgm([dF"5=7[?$BfR+SJJ=Ki2B/bl@$hL0N3$Qf$P!DOD&rtd8OHs"&K!+H^G=E%k8iRKm %0[H.(%\q_kVBX6JI`dbu/^0F$(*(I&o-C"jo:q"WcM!G;k"-Gn'(uth45r-Dd-3Db]D^'o#kOSNm.RBCrTk.e9^D0"KmCt^E';cc %X?4fr2_DqV$14B"UA_eW*L%[/0s/-nKmCt^#frNM7Him8"te&?b1/^>/Of>_/WR&Oe5\N&/$X\&i#!roRSrud&Z!%g)+5+9;g(`\jFpqIq8[Dc^da-)5G;kpRH==!D%=i>8=SKf9t:dH^iT8O.,NLQT/>E %(KSV;bC_Zl!e2ueZF8FhD&@:_AQagtW+DeNnM:SIX5Z0$q_8Po:<&JkO63^Y:+-Ihp='F$Duq0==j`!s1gam=6Ob4=MD[7BLJP&fPs=$`+%A;h@3;ZF#/P-L(YGRZN0QT`F)l8jljB %h#[7FDAPS3\[F2pW=/4jd&Rn8Zl!)C@7k1L(:hhNN>sd!d!ah#BbVfE"uTP]Lo7p7YEd)EFL;"8-;69J4$E7;k7P4+R+E"LLm#c` %fbp"h,f;+IF1X)n*!54&GFf,9SZO\fdVpl!O`dZ;]]*`4!V.aRpu(4>KtuO]O[#]""Bg-#bL2l%0s'G>R; %BOY>r<[aMU:+I::,m&!gDb%?2*NT\O-us%7!bUT%TWeo3Ya.;B<&dpXNb`4d!+<*HD8Oq2nn)@kaDG,@9m+[&'o3mtD6%G&fsfL2 %Y'%PAT`rQbO>Lq7VI=B&d<4FflBB0kgc;iI?$o6RF+bDK)q[@uK2IYpr-0QI*Fbs=F"t[I(_^@G81&CSWR1Rs6`hkMVaWedp&a#O %mb[l3l$,k9+$9W'>#F31B0)6[j+cGE*Y%>UeqsZ6X*S4@?t2oG.)0R\]/3J(_/q*8P#ofS %_\)&MLHNk9UR].sd)8J@bt1V\C`^=agnFc$9k@%tJ8iO1icr*TRuqA2A5Zr;TS](L?b=Lk?U;4iK;^_pSt:`$j@>u/De2E`4#Y;I %"\K\u&<`%FZY8\3n\(%fJ>eSQ(P_`-HK\WrDlmj%%Lff,R4ra@MC'A:IDtM#Js$_F(6!JY-aVc1lju'Eq.(NuJlm@N6u4/!D!6i* %Xd/S4iuA."Yntsq\SC+nQ.p#DD,;aPfd2.PXi$nVg^huU_#Wc]OMh:b45$@S*M$O@AOL5+9/u6*AhDSY)DVL/3a+#g<6t_F2M)J*pu4:G4>!7?iPRfq=WU<9!5pQpupoV3iT!+5QBn(4g]s_LC.?i %b7?N_hOjf:bp:CMg$Tdb!PE;=^2hZr[J=2RK&dfVQjX9RXA8k-i.Z&s@F*2OIOT^u1,S+A/E[/Fu%d-0uRg]Js31H@2IoQYNDgK.f %&p+"Zh#'IpN$V[G^aqeDhO7(scXEfl==D.b7TVbr(0NeClg %UYKSr)[`DKPdEXdhnM&g?hueD(a>$9,i;@Vf8pOFI!6i9)3;U#rZsa$W?2hc=!HiiBMoQO,Ua74DsCQ!7VeE`d"O(f)&[-YUphd@ %cV^d[Em(/MN&j(cN(^H%;Ynto7RHW-PT=PTA5&9%N5W@8L8eJrlqTJQB8NQ:!=>#@d8Cj/^4oApH`K(D;elAEpDT0*+Vi(uF6G/. %Es"aNC_:;M?e3S;IYDVePLttc,`SY%M+k$>6RPj!Z$T\jf0=N%**/G\Wrcq+)9$&OqB<:m"k9:op`G8Y_3fSh3?R]qj^_]H=,jFoT=qqH[ %]\W3Jj#_N)n5:WR(A't^(-K-c=90e5k7&U>Za5T0eS1\@4-nOC]&D`PsO^BrS)@T%Lj>9E\ %;'&l1$!bBn\6YjPQAO^D"RSE..i*Y5/`Bn&KD*Jb's9e66fMAs._OJ;WUn1iA`?sIT6dWST*ZQ[H@+$i]UDi*1M9CbEA%Hs(ml6* %S=Qg;e"^E+k;\KDW$PLr1Ktk'MT`m$o%2ekCj;Pi[-7`BW0Ch)&lul;^nK$:&(,-8bc76Ad;-I74u?EAO/%8!#X:0QadSD4"N$9? %DA%0XoqH!S&I$#?;4O,6($+NL*F4LG`64;T'XU_56@*E-THY656'*nFB@-D@mK9MQMi=b5mcY_Y6)`?E.Jb()SQ^4uTJHR_Tc*PJU:cU&VXLg=u^8Wq('7,4qiXWeU#((MC02;6c^>F$NC6sa5D?a2T0 %$tm[=af(a44\l05KpYB@Ug:bq4TsY#8N\$Z85R."^I^sl3_S8E-ItaZ1VC.)(HSWb_"EIa+QJq^aL)a+j8,RI+%KP;dI@nl]I'f@ %`#Ss9l4R[o(d1c5<1^jedKkd`-NUii=?=G&5K/[Y(:&u96Ee8i;R533a@r0`0qb\GlHQu%hU5./r;BQVjiEWaYF'B,@gsQa!u'k0RZsIMolpan5\=R=i_7Y^?PjWb2OUDGg[rG9NYD4<>h^3Onr$OEE6@q_h2_M %a+`!_mPLsam$f8bDB`L/nbW[e@qg+Lqo7#&L25#Dfm#/K26!^e3_IaY<`(QlNMk2?8`AS_eOT#S/9bkFd\TgTT>c&pdc+f1 %*0KU0_KP2Ki.<9?nemr%3`JVX3Spc\r)>2QZkk.j)+d@]q#XHa_6+$p]6Q0m%X`kCG,XWg&9@CsKT0/'-D`ErB'<(.Hb0deT8XJ;:(N39:8S1W=Nr]YjIOq %C=Z?J*=@R(E72404E+ut<_R&fHLO\99K%;j"UAJXdK1fdF4g+&1sU;P9d%Xe'&-`[D&B/\j(RP;>jX^PKqO.=A!Zale'>/d>p;FU %%W;\;Neqe(^qM`uMIZI1?!R%"Lh;.c,MEUD4!VVYB(mG2[8`g_(.B0u<`Ln!OsnC;7ceGk-F#`@-n2jT/19dPr(O?.f^&7N$,MJ5 %#2eTSb%a/j`C14*_JrE>7H9V]9M3mqmGoa7:qNOWj%8J#W.rP.;H4mp[R=5ZjiM5n.8bVZLHs$SKmZC8VIbrHgD>,EC(1m==+h%@ %WE)\FHMk&gogm[2FWmi9bml>SWBnPC^1DU6@:qbnJ^&p#A)!>nm=8Rnk>HLO(b?+D[MU[M^`nmM.B/C^E\''4&fF347`I19e(1aY %+m[mm9"MMVYpA2g2H$^,$cXRm4pQRqbKkP%"N;1mQ!-eo.Lm)6!:)BI'gQ?T9u&\K96[#&?-!:)&HDoQ<`U8WD"SkoKXtR4V(t3f %9gOU?YY2Oj7KQuoBL=aUGQ@M@VTfsieqhl$e6Xm8kYCHZZ;Q+oLDL@)d38Us.3LTr"@cI!(*%Ro"A/Mt7V>5Ld@n_l8C3cC:EI@C %//)b20A@h3@oY.412,mk#Wi"u]8cNAQ<.&Hgq:1k[H4-u\\1L]n;`Y8<&+X/#R+`.)V&!2'MQ=kB,Z&uU-_s26W$.B]4Rh:!N.#0 %R+dHUaF9oCWX9jX\5`e:P>e13UP[I@innM_G:AH`g5Ba.pi$uaB5-XH8h,c8b;3EqK1+f+R0P4+[nZG')NmqkpnTi\..Hf=R`*\S %;7.rRFD0>9@uR#$<75TWeQKb(-[nAoH %nWP&=Yt.IuZ&'5>P*j2<`dlJJa\bi;;aeJMB'5>cNa6D!+Q:h7VC*V7S=WYNT2k_\@O+T]@"jJ0lqH %iZ7^_E52cU![-\6h*$HY^mjMVS/ij3CnVRN3'N\JC(=WEn%`4r`b&?!17XN6]9K08bD?3[]_RU#<_Dl;,V4b8+8QnSAXtBFMBXSh %LE]/h_m#\O!FinNo7[b*%$V9;;.+Hj&0?_I5\cSSb>Gul]^eW<.-:=l:%MMlE4hP,dA0*78-Re3,3CJL2_Np4`EEa$)'?3i7FIXJ %^?;R*LkQe<84`;H?5I]U[Id3]em[fJ,L/>h`#RdkOB;$hXHk==AnBleV3La9@V3D7PK@DcX9b'd+b@^Z*#Lb+>>B(_.m6\*n+3*% %KOiIE[K_'CA`RICH?V,!7DT67,V>CZ8\?oi81GRD2Kk;iS8<*]R@(;:dq-BHKgYPnBZZ':*,&iMKo(N?m$F,=J#O9ncKsX>,"k;t %7q/c=qdVCM?O*>qEjh++/3#rP>mu1EE<1qs7b0h+M5L`<#7";0Wr5XNEn@h(:ff`,R4ouP%Qc^ja!nLU[->E?P_,Q%=\-=Mq0ETK %(e`gYU=1H$h4BUc1Z86ICC`B3\D"r;l\2o@*>Z$0H3eY?V6.7>co2AJf4Ar"((Fn,G-HOo1J!IaM/tV+^;1*hZ&G@i"gR'Y&F!%; %F#3*&Om>'!Oh-lKoh=XZTKI@L]_6F_.?hh\eT,+6Zl7TP84eCKl,Vj#8IbD,6q9Ha&$//p61%%.,q5h#"pK[).r'ef&rHufVIm1i %:nm"bg*@[-A4T"X,!#pS9q[GWL3%?8JRDSjRROfQ:kErtE^d[rdj1p6_*g[:*]oT8+PYGF$7`WKDH1(cBl7,R1!le>1EIK/ZE8Y[ %GWtA#@#mE>j^a0?B]r$u#1LVEE2IcFjR/+J_N.#c1^WPZ"Ps,2>i*4u(rH@QBZr@id2EkR_&Go(U4cXf7]XBQ;YZ;NZAM@E'Tges %.Cf\L!HW5&_imb?ZG"ZY&c?4bilqKj?nK;:TNs2\8h+FU*di/h0/`lq=Q_rHa+FN?1,@YUO=KOT"*oFDj"jjQ0_SUU4^Ke])5^5" %:Zd6c&Sui*@3[&B!;m\l$/c4cEj\]3 %ohN^iU[=p"Y9j>=kRB3pa#.(_&4/fY2O]\SLqsc>2>)XBiABIb;`^@H15Rb]M%C:%+E,_0P/Er(3HMlue_:=[7eCgi-,iQnE!F*2 %BeT$K`C4:Xl"goDFW"cVf!flRU;M% %SoX\G,]d7A-q]a=UCBp5T9^m]l7-:COn'X8;-g<"5`HC>7ujFdd!@M8!Es!FqC-R6WscKfg-@^Z6f4Y,h,j+"Q4JoE`uOE:dW7?st0s_:*0DAfR]3 %X]ACRLLb_^:fW)b6q4eOON`pP(e%0GK3=g[D7Bk+VX&khehQ$IbgZs?fU-2rB4@FQB&a2 %<^\McLSmQ-DA=4*(QVt./^e5r$15=&gD4p?[-oel!.Q*f;c6A)(?2@6=,N_:5;`S&Bn0VePu^X"H9R'L4hr$RMX*$4jY-`"EhSLj %Z>T7Emr$l_f[jZ8E*KM"-BOS3CFIV]e]L+0R&_@/;oJF(0KTVBn09&jF_i3PJlX--+_C_N192#V]j`EgFg-dY7m>DrRBl]* %Z[;;59Cu]$4k5FHVeS'['k`(4QWP&3k$aRV8hu4gO$4k*K)^l"7)Ek9:+c"nEDdVJ82NUc3R@21nu<."!s(`M %0]pl*I2"C[P-5@sP"#3Dab(GH5[B&q:V=T)&\k8SNI@2:.`llhnTPItX/%6g>A'o\?V%[Qb#g4c6*N'(L:+\2 %KJr"QPf,HjM`tALi\;YP"8Ih[-`&I_A'O#5QS$XcBG+cR8[q0LK7I*&(Uu_5j;<(sV"Wrm\ihee7I:t7Fll=V$*u@Q-,h>>asDB' %;Mki7%IG(YL)@qd%!5($m5<)qQpEVTh@WmL81N?tJ&%IZ\sH4poP%tS)5`[qadL5bV)0bj244UBdnCC]Qa$:@`9LF`9nQ5/Wu\ %!bO/]f`m#A'eBcODiiJ'kt["QWSjNY")tbegMlOd9+-k8OPC*!dk8Le_EnIW@"/aa(fla*Z'C]PP)Lq)Bi>W[k5gHU;:>WO/i8Q. %/#tlm[YR^e6[6dF+cH>+$9kCFETSmNX93sMk`sH\_.tApJ2-R-GPLiHnr')D3e&YTm23(S06%E-[;=/DIjCah;nt@QRqPaVkQ7P_E?%s %N[-RB?od&]S]tB/c4,XBQQ:e]$[CZ.7`[lWJD"Vd3D3l14`XMh3G3Xi$9G7'W)$/O>u\#\D6%W&nhF#7AjamP-X*9I2/ij6ZN>uq %oYPXVUr*GdTI?eR@#OB";k0DdPVs#n\JsfGRDB6u(%b-'.,\A)r&PrT:4s5o"%+H4Jd+dp3"&2r=l'Yr@aO.JYW"S;nj`l)_&,jJ %&hsI<58_R4QQr=L,[]$Y1kL8&^9g4lG?bn+?03k9!A_6l6:h+WbbaJfK$FsD]E:eA2>dr*5B#:OO;kb4.sXIoHYWl,&Q$k@Lsrii1k6)eG$@Q %[mk]kas2HFVTph)35RjNL(eL^ %]hpFli]%AiP#++[9g*IA'LO,o!#'"QD!:3eBq^W)d8Bs866meG>9edUE),rP6JTCrZI=3D3f(;f(-S4![*m_ar1W&/s*p/qAQ5]9V`SWQN3]>;3\%W&o:n@P:Z3$-\KDq_I:kBFsmRM,W*?Zp:q$TG18"-StA:e/=3IL]8jueAgW4+Ta"MZ %5bhK\3:#r+a[BN+E2-a>PpW(bPIQo6VUc/O'67:aB0bc&L57%a;U5djR;N70'B-^^p"_.Yu*$`FDF,"c/`glu#c7&],U3 %XG#A]22eWH7`IC&fMB4R@(Z^=$J6^i!cats"D`,ho#(B]/;>a3Y6tML;.!,,H.lPnaOPFid$,I2-p`YoEHHo]H)N$5E%X5RAOQ"X %BjYrjE9F]Zkg<?5s)s5kkh?.hAD'T*(i7+t00YZT^D1qan]73mL&%e#?`t:f%CL3\/9%gn9K58Xp!TZ5Pko$Ii.q'T]+klqKh$Q:=g27o1Pu %=;0,)FJ'FL&j6`g8RRa80:&lG$0'[uQ6D,7lCk-#2JH\`pHVkpRr&2"jVhZg'+BPWH6p5XF,AA23[NkHh6p*J#W-9hJ<7c#KdsrJ0mifPIJJiQhTI73VVH^tKh$F)C(+U*> %qp:U6qSc^XA6hA#SSP98]pI--'q%Qc4^518B8uDfPSGb1I4t-2#hr4!$c./Mmmm?"Qi4k(kbc0'B/Ro!$Y.DGh4>-u_Md1u_FI2hlT&.78Yg"hR&V_Zt=JQG_e-ieTnqNK1aFH/si%2^m@ql>je0W!^6^:]+1Oa35pNii(64AH"2Y-QOt9n`)]E&340GnXu/BNbbWM,[%pmrL;?Cll"-g:`lST_KNL&=&=^U2#>:(8[&?qeJ9#GPW#u)]a=VIhYYnrJWe`SMTHMOqir_s!O28hm!HjYrdnYbD2HcV]MI7"HfLUK%k`2sP2ML<=F;1-OJCjHi+Y_N%97iK4tVD1f@@"PGL0!hqDN"9E3Gn;--L %]S_^M@7V$(0q`o'"&74DZCM%(e>C(B2*uj\bfPgHcm"(,bK[+<-ic4HJF[Op&^/KWF/aeKR^J* /&WG&Fl0*iKp5lkq*3@U_m,LA%L^.3sRu!8Loc7&c>F %=:Nj7K.nKh7[0qMb-[XFigi %(i8HP]4pJTg:W$B=2Udh@/f?EK#KjFe`?P-QHG1.I03qc'gf5j@*b2m&KFV[cWNsA*UA3YZ2QQN,(@7Q/V*ogX0_%tU@aoR]5\b% %r7*e@!?YQq.^4Z.9a4X<[HZ%QETmcQ.]tTS7)bEmWfD:AM93"^I>n:RD![c3Ro %MSnkQDqg/hjq'pJrQ/#*lr^)ik/=N#`gL8`3^UrA+\W,mcJq2"J4W,B">20b84-=u+3BM_6<\ %__&u'5U$906#OVW8.Z5iS`J-\\_DG(W7]:bOR`.C>)>6?A>k+3$ZL+pllRIT8OL+co[bA`hupa6QQ5Lg(;)6)!abEqB"0G3k5*5B\bH4!hjO2qRJ,WPg80kV%FYm/k7o><*.CtXMQGf0 %P>O/ABf\jJXu%;ALgPI#MLqm&9$qUCBaG4bS!`dLr7po;d\jULTLMhK]02D\o]:Wcbs\EW3R@q`W%lmKcSY']l5^)]klIUA0%C5& %-CPLlN"\NY]da>1JF6_"2qI70%)s8K1:7+)*,Hp3`+$&Ih.Zi1@ca*ur;^.O^l78IP>SJZZtZKHe2K-&!?NW-)B/Of8mXda_GY;7 %e%Jd*h*[Zu=hOrEc,6(8.02SgS"ao=dR.:rhpAMKo:NH%,<2OSWq^U-"jIb%H"o$@'V"U3&QG'*jsD`r-K/bi#6lRf='h5;e0>[+ %.!OiQS@BKO8AQSU3!7!3O>0^KZ'sp.4VJt&@9<8,1^M!Hmm1Xh(bF>pabZ4OT\D%oCG8B1-j6n9`6g5H+KgMJ*@*_!^d-RI"To5C %dSVbo49[-!3>I1cGZ,P0-q,][8H0S2F!./5B##Rp]$)"i,bdRaV.ebB`_W?16Hnp2gNu`0o#,hT>Y=VYQBpoTD:(WMSA3am=R.42 %9W*II%s$6)?n)0,Qd,/(/V'q4p>u@^T-9<827H^+Z^Pem$sc$KC-IUi3\'2q6#DsfEA0--V>B!TTZ>".(R=RAFi97"6l3ISi_o!gP-M:($#lbBHo=4Mk7$L$R-[D`fuE_^=E-"[n_(G%]j&g%R@'>k(i6LTuiB %)M)>pKV;Ar'T7Tq:P*">aN=e>=4"==k+a,e[piU!#R+OaB2idQeB87]:e48o!Q?=e2PV!"6a-Y%Pbnh>ZBR?W&Bma$A.EAu"Q;/l %./76TrUj8K]\#8,po-A`L),"C3:E@uJ_T)s\9#a#)FdZP&aD,27(t;oZcp$-E&eQ>acZ*\*%$Gh!r!--.Z2S%48m0a[3O %k=h\ZnST"K7>WU<]f'Fh:(lP\7Q9kF8T1gV.s*Y;H&MXi6F`4F-7S`f6%NaFab521H"flcZrK-mJ>nE&UGN:/#%[IYn7.&/qOo>< %&2>%c56Z*9hMqG@[9*NA20s9:=p'H-KFBd>YlT^-,8L]l%eOh)286E&JX2m>Co+J14oaScl:'d-e1C3EIiUdS0dui4!ICJA!f][= %`,CK0X^GPh:=Zks#j#co=R&6uJ=s0->2YKFr'OA7.b(A$YokG5\sA;t:`(bV4P_5Eq#,q^:?RT2G'Z5` %N[aBejF:a,Pio3)m'(j+(%\s@T9I?Dl12Xrn=B(6lL(Z2c@QLUn2Zs"M+JWkjf:Wend)-'6$C%*'CgTXCCm>4d!?G%o&ZJVgM>d'gh*ceIMJluONa>''%ess?+>TXNo$OFCnrRhQQ7#i+b6=, %00,F)5!+231#!6Jk#Jn@l-eo#G+Y&9>(*Vnb^o<[>Op?KVf^:0q#s>1^9H$%UNMY?]aD#sBXe\_K;c9]\H_V*%1hZl_ %;EWUun %[hi6H"PrSpb0$g(3f!Hs4B8DGFZ/$!kPrHY"VNaM@a:`B4BJG8&d%,U.%!"^$ %*\mYXS<']b%t`_L*"=m9L(Ub`=@8p:c$6se;:MTaG7TG!S=0S+u%;j`Aq/!62a`C4H6^9B(oLr]^IHj(u5S$A;,1Vpr?!hBWUO=Lm2i"3I$V$U++J^ahZ`[fE) %5fFIo9`Xt!!jr>6>b9^R%a-BLRtuqP&Y+Z7.oDhpU3?d('3t0-5SSf?Pk-"FP5*[o+-X%-"Jt_JE#.4DBnK/!O]!H!N'P1B"rCr" %27A!g6%p;Io]Y&Wln'sDs*TeA)'ptjdslS5>59]e8lLV^b> %]cK#:0t_*]'F/;.ZD)ZA=b2-\Bi^r\]q/iT%=3E2=i"QcoIWP=1:gl1<(o7rH>.N31t>5tEG;_FLWMm=)Z;[^3I(E8(E.rtC:iM,QVkW0C8Pc&>$>E:)`>'#X6GXC7T8JLUqkti+6MO %oDrr2RLt2DZ*L($QigTH6)h29OP5d+!H+I.\HE.H)1VaN/LBS5>Y@GYRF.ct0o7TD=^`3\bS5dcU:UaUkI4DZP"7bpVlB?VUVTHB %OO3W-u.P@4:.QM?7_j.O]MMeIq[1s-Pa_WIGY*@[A<*Ula/ZZBhIbQN_oL1RkRdSA^\A\tb+j2Gu %l10+;d>gk4\j[>dTBd72/t_MH'D;e/DP?%s)/ld'YE8>k.^"m+(;&36o%qMY9JKY$80lN:=H[o`8N%:?Bpe0CiWD,S %l00(hCAD.U@hY\3;rMN-#Ip"/KS0r^,-kE"&<[T6?RWcZ"^SG;AJ&h><#^oB[!3N#`_n1D7c5j:8()o$PJJmVM&V5GLmTkUkT(BN %i['Jq]5^jK+G7_1AmV8+"0gT#nc_D"6M=keES:9/H:te8#%M>V64RM\00 %_6Z;V*)];%-cs`::u#a94q_V:fXB8#>*uJ?Eja5I6c&Y8NR6$IpiZGNNC8UB8/4S47LI.0>`B\9*F\V->&0"<GI+ek_hje?jfC=2(>^8="5jO2pH!i[V#_($N31<;2#h,IF0j9YGl]%(DWJtSkDUR4^tDHeB]b_YSJk,F86)Vik0 %644)1$*lY9>=L'goI`*+!.YnL2n%[a*VZMh<7m;3BObsE6r$L:5^AAR6$Fe`Y4NFWl^>B8a*kANh593&ft3s;$Mh>`!-*+jT*SH9>i>*,0$>K/$Z_2l"qA-Di[^<3hi^k\q;+;ZI5W[M;.E1Vq,)Qo0\ %*%Igqa3+^F[jK-n"LIU)NBdSmNgm71@qraK#fl'[!]+_PZ6eCm6RCB9em*6AO\RK,-4)7q[kTFPaGCBA=3-7/'j0gTf]#jY\!eo_ %/Hr6j2aTrcH?(j#%*0Pi_?o_po\rj;$fr %;(9c0$.eDVT0gCc.]&g3STWshYlj3Jm:?R)A%MN.9$Ru-Q78b#MD`UO^RUX7(LB;-[9OH+]o0AG-Y0"pE:e??63-%uOiS&!S"X3H]ai %/Mq&`[6,k%[CYn$,\Mtc#:&W3]7E'm.%Ud^JncCjqY!TnZ,j61&!2$i-B:4,]B`H8XD/[OhpoSU$Wu?N#;*K?f?dImM1DWoCnQ'B %2[Pi$W_Wjpf8Dcmn/PWLYt`j&NJI)jE6Q^c,ee"p93o>u"4\oU^P7JfV(-1*6Aq9LiU9@5O[7@I-cW?cd@O/H@AKWW#qCNNpE`I% %6jE=a)c2d+l;035FAJ,3&C3^[GC%$T\=4EUI3djHY"YQU*Y@4%_Nr[%foP[B@EVXFd;h>5UPj*C&okt/ %!\h'[bbF^;$U#ahp/mUS:jl1\*#"M+'-c6DrK4u#3#bGECughm*8&7qD.%/sgrOQAO>EVr@nV,04CSfs!Vh]M6kOKE]5Y*u.Vm6g %>O7dc=KWZ"A^G^ql0@NS-k=2=c!"#V\XgFeU?U?Gcu8Hh:uu!"3@`Z;[\+5hY+;?0=+$*L@]!#h42Eh9:&2Ol_o?M$)tSr(a?_.& %BXb!V4+_$t386s-;.-/l^utbViXSLJ+%YUMOC.3/MHW.k9gmAWbeaKi`XC5+U2\C1V'nT1$td#pL'?Fub72)6LfA:_=t!8\Fg9)?f-GKLna3_D-.C@%'++1tW%9N<.E>Io$JL!FqBS?l,kr=GWY[d-rI/qiJb3'*0s<+_nGT,sWB)Tkso3 %^p(?AhVm_YqX+%4Yh1rsG]InL\@X_G]_uBO3&oVt^9W!#.eUgRn+=rhY>5,VZL4LTe'mFKiJ2'Dqg4+AHUl*eSfDZ5>98"M_0k`- %l2Ku(_qbRD%NZ\Yleh.^^YV%Oan61*^V782HG"ZR]"##t3]]B.m[P==^N+0nga5Y'IpP4Kp7!k3QXg$)n&#G^>LY>dNE9ZUJ:j7l %W-F2qr@$b"$b@9[9&'H:-c1mTRoNdKU(f7b:_9qLJ9+OG8>@LLrY5=]8OYW/=S5n0ZOKE`J28-<*p#,Ien*oY^ofIA8n*HPbI!g%I9kCr)ns_k98!!1g-dmW] %g)MZPp5dLB:M/'Gk0D$!-k=6/R36.?)$ogMM-=lgL\ZUDdtDc):8l<46k"FB&s3E2Q7OFm7`B!C@SX*0%HRZgF68ipV(U\FoIZoL %R79KY:rpLC(:flUpJJ+J'4m'gKCC@!PbD_(>=ke-n$ADQ$g8Y1FV)K\mr>5aRi\nP-rG.Af'Bsui-8NZ/(e?K=k/h?GKn^H3tI1l %n]uuGgBYpX`Ri/b]6h_8e#D@Xgte6AhW_nSs5*SJg5Tf[kl9GTB6cJb_h)>Eo`K@>65nX'I67GEXupJ2k-;-9]$((O,:LeqHt`$[g_LJDWs?&-OSTRh_!EQJa9:n?'4+)LBm[``;79IO> %`SN\HlMZBScKFM''ib$^mGi,_WH*X2s6I_OYJ=f*PKo_or?EflM)8a]kM*tX2oT-HUL&Yskl0(RCDD'E<:c3]pSo.1;%3E()H-flA5>[QuI`FZ8*VMP/ %DGYCm>d2I+EZo7&T2XS.Rhj82Bns\c6:t![>.@cEr'/Gh>79jZGND86I]ZXo`cGqXJ$PNjp3U\b`ZMZn[*bLIQW=cG;%e7"HbQ/" %#+jHhDTT0^_cF-+C"HnQTI^dV0\IlUp"S"(Dfk._f30>E_4]2+cK+7AQ[pl,GYAC3?t;SBcl %I[RG_5'h=V4JeJ?p_@[8qndLON'=h`^%Z%UH^SMFJYgYDla*ePqIK&:J,*A5kLCLKc/In#C>ZP2p$m(VKWcKami@MJ7Y^!fdE1Wu %?*MbG#H,U4h_(PU!M9>(s5C5KrN6`u@Vq(GYW"`$.rW(O2VUn@9R8dT#PDKQS6^N762b0\s+qnN/X2Vm:e^0M[njQ[ebc$U+Us>?iO;g\]1OJ+_4[G\;;H %g>=t%cORCDT'S%)Ap`A(o$RGYC&XWp+h!1;Nh2Dse!&HbkEq@VbHL+f4B54%#1i``n*m*I4o)dZP#".cqLdOX]13*Qs#8hU:XN^l %iGYgY(Gka>dSIWh\'<:r^,UU_J+$4&]%T0:p7:5EqJE*Hf'9ljYE,$n+3WC8UFh^m%TU(W4"pX0$.d8FiO#Bp5@MB=,kO<96"E%7 %(N=tL%^#?KclBgd$k;*BL:Ynke6Uu@rRp*.IU&66^]3]\pY3^n7u,D+>=\SfgKuU`%bHX=^7el[dIDf1?5=KQ-hG335%jgas8U\' %7c;J/P99`lp4JhrI!kHWoj;Li_ggaWL]@!T:]Hj#rZAo1o7,i2QQL2!s8B-d!]RjlO0e5m+.!ZRrL\>:Uj'5EjK\l7lI*1E1I**# %RtrSEOE^AYeBF&\0Q8hko:"qC`L@a%qLk=%>cd*Ie,MZM`uh:GM,IT!/&QEH).""Rm\do-&R,pX1@a-_VjZS'C#csi.I_p0o>;"9 %J)7U3a4e*Q>[FllGQ+P(q*2`GXFlkYJ,3aNjERnQn7:FJ*350WO7dGS6A.;I %gZ^6^UM3dhm4-">NUIqV[ZJMtN/RUIH[e&hZag\j4hTo6ipuqQ5Ft&%3B^tDW@qs:5!QTd._YQ':=kftT0;$m?$8OY':X;kH5cH& %ah@=`MaO(a7#8A=^Z0S2R3kO066G#IGs%8p&jA:Bp'hV?"4<=iN1=PQiI/!Ui5Q+KUKB;Xsrbh`Z/(]h( %/@W6`[/sTY*_@OU=Df35md-Pt;$Jh?)nko\Hi@UPm.]97gtpdiq;P-Gplg3q&P'^ue+r1[$;>C5PfX%jPb-ZR8'p"00\%fH?j`b1\M=Kr5dlGD'@)FJHahsfnaW^+?lHD %;:U26i6L@_AIF6,m!fP:pdV=>K@Aq&Ii:S(+Q6ij=4Kq%VM-u)l+$M5g,:%9O8c\)<_JVt%/,Vt%#47pT2W#qPM=).[?^PaUZZ#Kj`Tl(+\!"&fD-=*DhjZ3-rr8BU?De`lX'Q+!d!rV8BSW#N. %^CO>[rTOaWch_cKp::QN%8"#06/6GiXI\JNS!Tg/QnpacRfAHDS@0Ll:]>@B>hiFT+&';fn_Ob>bl%J(lt"4#(QYEqn,!"Ep7k^7 %k7M"YKj:;PP92m$db:gIO*8eYVX"1H)l=dGI1gi;OgZG*a.4Ht.0pIh25`ViPaikPfQIS=L!bMAaWu[soA400k"g %C?P-DrpK;SBg!'FK2:_rVpCq_Sa?#V*M.ZOFLlG(dF!U?7A"Jh!o^F15<5V]\R:XlFFf%IrQFr\_eIq$9m%99S>d/D/5Q;eh=05` %e4#[.>kJRs\l';"=c!rtSc,T%j)LNU,Hp_u8[c-N84LjA3G8GKrrYNt-W;V>d[*MnT,^_Mt=b(SAi7gcTu_ %A=LdEFQQ;%a$lod&&'Zn])7Meo'`eT:EKK+B7(Wt`67(LIrFLWI4mMBo6H=CG]Z"6e+]2i:-UktS*mm))I(7;cf>3?+(QY0`/h2K/n:a\A*Iep"B&jbJctA:X5Q5S/M6YO,fPSbN#MD`@&k/4^G_4]6Cjb %E,U6p'J"-6d@%o>J/KbG,Jt^NZG!l^nf&rPN`n;/[(X5PZT_k.mQT=9.ADW3T;2?pC[g`c(:VUbNtrgUT:@Np2/KGEa:1G5/G;i! %p:!haMhbh2SU,=jgi'r/(E@,_A:#6.SS*kaaio$>8mPM9qtTgBdJ!+uJuM/GJtCC%SQBF^Vk:r,IV7'3`C,!FZH%1pVauZMc7S:l %$@HL6Xod5TqS@2rn*FHPnT*p01NgCaADB#PLna]eH+5u&8T_OW7Yl,?k1df<5u17GYE+`\3jt\pWoF?FNPIfcYHP!h::Oa+N=X?1 %T1g`,s.-;ZFn'#>a].Mg]ng6[0bbBMh@p>2/)]RFnmi75HC]mP"lqX8SL?$hu$le^O6qXEk>UG"jTGP9qIs8;O[G93Ao %4jJOsZgRVcYO:hgqu:p(c/8Ns1XS!Yq./f0?iTM,qU;YIEVI0&pO7,F7eu25[iaCMktp[7q=a70[?p2?7cBC"0!^:1L4qp!lf^AlXA2g0AQ^SO0^^&%/lqiBj*h/I-k+7K1!n#u3YmJYj&q_/!Cf/J^srL^FNpE0=u+&r8A %hKe/[a5Paql&AKRI-:4^cE@abIHuMEDWQNNH##(r>:5KKmGjc3goK>HmS)Zdh=j]/S[pEQHC6u*_sZi;>IV&=nT>qdFoB5H(\_9cBC!5i?i'-Ff4mF9`oXnKVO-/b>=X0ip!$9Vs8'+'sBmm<;q/GCTM_>H6km\))LB %pR=DHNCVDH4R)b4:=NX=$Jg!b.e%#MJ@kg3a&H_4Z7Q"7cJ>\6X7%Z:IQOFAUi1EoIrb:Q=78>aonS%0]=n1/?f"?bs88cRIt.3n %[r6ceGj"_m8&*jTi:\N^9V[)!J,.&Vds$!8o'Y[js6Z4sOj)P42#Z1<9j-/aH2N!tfG@&%+$FjmQhti%]D]mQDnkqaB/2fLq:a$\ %IcXo7oZm7-qtJr-5("XS2\+LGP%(-/?-5Snf+dHFa!`?h0jK[GX&o+rTACBT'1G]4Zn&R %NDE=LhsF4r5b*A+UqAf\[N,LhBC6eQPCcbB)ta\=[Z$a?8lR1*J+93RKZP?t@7ZhBdfNOJjf %p"\S?rgkadC/N,T+&1t9ACX2e;e?H\q.2PY/CY\(1fCOQ9#mHb[)$,NXdD9fb6uK-OD6)8KF(J]q"*XT[F0)*nB#f$Db[!/baA`# %82ud2mPhJhHp8-/C$C(^qX*E[7Hd`\)S]L-Q2G0Je*GkYWkHtCU>PE)NWm3s9>aUj$mr#[qlc`6C_e9U?R6bpqsg?I8Qgq;"R:T-=-RD3>_KJmW2A((_OoU7c(W/>gns`@p0-AZb_5]1]H1C]MH,_o9W^[F6CEI %O,k2"9@e7WN?=LPZda?$E!jR(=.J@R;bZcR:Vl8$cV$LAgccUcg1^FG&#N,,HOBT^cTR]C&%!o([[5dP=g4:.^U*Gsar0sA9#es$a!:j9EAe4('M@j*>[2B2q\4TW$YfB?/r<,m6(WlX^aZTK%.+r2m1I,Je^$%9Vp8nhtH%tnI1(b3BfP^-jUptsL^T>^)(H6ms`oA-5hD.'=3@k$Z#L*8kO17r57;=#g- %,!Rg3VaWu&.q,HJbZR>fa=N)'GnE-B5.=*W'sGa]/^3:>DK>2"TD0l]Xe@%^3\;\9lH:sC,-Z\`*E@i<"hosB8q*`nI#"o%pdN$C %8m3'[VHV6Gei7"JbL6lb-N=Q?nCTg>m_puZ+e$k?D"J)tm77.SS*pPrqu^GdA:F5B7dh?9e]7%E@!To&Nu!p]@;LH?^UJo(=/?Y9 %qLBG_oDWPW@B*B).mQu#.#n[h'em5j$_Vb-+j@Xh`IN;4c\JX<:p[VbUSLgM3cUF?Qg4^RD`A0IHV(`XP^:;j*:NhKm=SXDkR+nO %dXFoJ3^fCB4f]#_R,VZ0pn3P==20D\,k9T]F.o\E>HHK.k$5UW?AkBbho!',V4C>l,GnqpBb#t^52][4"&!IH!k/_R9RcV>S2s7O %;,8oV_[.`e]-\ %Fn.%S(XFq`+Viirk@Z4.)Jd^r.dt@8])2u=g'(dQ!Dfp?Nqk-]k)P>sR&>H^iNRsDO//?NWle^X.r0h0FL(Q,i@Pk,Z?rFu\UmgM %%$jHY@p1P2>5PaPhL*MQM[&l9i&A=uqhpoU`TLUd,I;HcCK[l-#dKe;h6e/=T=UB.Go'N]t$h0eLPn?nXA?PP>j(-'7r0Z %GY)5-ClWfl9qpZDWjWaFr*Kb#'0`8PPLYftdaD2aJkKf`FX#L,]l*s9c&[u/rAa;0QBoa)Y$IXsJiT.Nq6O@:N*.:+>OPe=G4\R] %HZ_8W*q5@6q8badXUl/XI8V.H6"L[9ONP.9TOtGqPmncSqj-$t2IFQ2O*Sn2lL+I*qr%QroBe=M9@VeqK+@(3VS==;Nak]3.]*@, %[`=dQ`IB(fZG@_Tqq@:.(1V$a;c4NEn\6^#KqER!gmKc*#,8[lp&*h+H0\-_B>P"7_\)[f0Dm8onA&Gj,9QpEeC])g0;j)&@;^J! %!g/pi'rfr[>\UkG]0i>*qq]5)qK#]Cd^`Bn#l&FunT-+.3-WD8kEf?nGX8*lp\sD?#AXh-Z+e[)POic?IfhHkBjA=d2k\%P5aD!] %>LK"/QIUmPK_=.%(#I..Pmd8][)Q]hfu"Vp2a8tn]G84C&)Vl-IKLof47H7Of/JQ'f-2:>k!]!L=<0J-i4"`-[09\'Y/9oDm0;^@bnP"B[]cNi %Qhgp;`Q7p;O$A">k+trg`L_\O.iZ=)S:"rKo"G5<7fd\QD=iLX %?/s+Zd0CuHnQE#$-Ph;&Wo60\_LGHofs]7["^$]-\(Z1CS@K"BlW%FVf!PA'fmU!mbJmpm$$/.c$?O[5QsGI:&njX]l]TO&G*Bf? %PO6W+GrW`HgcAuH!om2XLtKDO;!"H%[Sb_/O3[@7dO4GNk$!US$YBOJK,Cp0C]!64XR36iCam+0EpIai812SERnsi0O1hf^c83S^ %Ibo-=Y_\53\Yi3r&%B4)Q?e&Og2Q*smtj@hrqn^949kr:>UR!@R<&;Ri\)CZLOl"d>?;eoFHR^6Z,r/(K`c/!YW-9'U9F$[=d#c, %:QVg6"PPR.cA"9e047eg/=WkjmHX3'<%=!qoJ2>@1;/+WFhRHYBk.YbMtDNDYj\8KjpSD@22dEjN9N4*4/e'I0;b^9G4$nAJ2&35b4\r_t5TW.Vbm(1uT2#M[+i<)-d*fJq< %pHEO[Cu`r'Ces2lFDW=lqh]%=5;(OT].ZF8c_:04P3;:HuLC"Y28[Ee/k]f>N&->V-1lM2,Zg,r#"uL'B%EVlol:K4S.o!R47,$X8e[g-^;!DNo2I&oG!,77/%9N7 %(Nocl@dbpMX3gk9k*O&$o$[^e9XFEg!3Dpm4g+Ed\J6e.So7b5K&)B5c*^'r)7(XM:JJHq2m?[Y`_Rse-9e@?!udR`*#ZaaHHSb_ %#1.9]KC*3(\:^gb1oFRHB)#bj'+LGFo.*c3(\UCbscD#lDbW*M3%';R6aff@C*:q$4\`XFK$+7jMT8t5WK*e9-(kaLt9iP.+,M@fg9nkq;l?)'q7BC3R`cP %9CpGsaurom9($Y/_oTCDPAu?pPF0A04a%2n>jFH2m8l*a`Kgh!p15XM`b=NU8C[afc0r%QZi(!8GD'sM!NgE=>M3?ib1#>!Z9ZA)BAd&Zq %f;,JIe]TW%^.u4'fRAZG(am"A_8WHR7Tcp8(oYEjJ%f#&DDG,cho5F-;Q1IJ0C>hh51k7BFM:AUV!Ie>&#]FIM:/nF:PiPFW(=m# %(QUSd.J\nsmOmW@koLZ.&WK!$[$8I]6s0*G=L\U.1:P'Y>-h7e\43h@MtPfE+-MS787X6AIhlEk@@E7D%tBejan+>a-/r2n&!ong %p`1b^"MYiE(j*&C.6/JRGJMhS:&#!2(p`E1qCeDpF7D=+2T6HbhaTM5>!6q"pWf_SH%'_B6Q.OTC##>p-&0a8hkIUPCS=DKV[=c7 %9@1Ksk8rrS+n?e=["Q:P>+?S=^"aqn$VLjdc/B^&n$86mkB7j]l4s^G/>.6%!o$l1/r0rdF+",k[s*?\CtUKp55N-J %".!W(qpA%HB="R:^L6_&U9.-oU:Wke\6lSa9`@T;GLa!("jojf<<8!?c3*3`]+7r=.%VK7HfEW)ph6,:V^_4pmsc>OV&:kNO5dlN %D>)3]8s_ac:eo6#A`16'Dl_4ie*A7(rd&A^IFg'`!GV+ka26[3j1u.GDX"V%\a]OtYsqrUoQp")r:p8apr6H6/]g>\^B/;[c,TE& %*IbF3]e:BZ;]1bY?pK4";`\;"pTtImcb4:rM7tK![a(Drpu=#."8DfSm9?*L)Om^fZ/G*PCV6sN*Hi6\r'9\_33u3.A6h7O1@e%uf\(JUXbN\Ad\M2oU%:ueFCFG1ORQHssQ_(;iSd@(O-B\s&/[O9X2Z/,*;R-1? %Zp0?W9T.W5#CPLVWle_2j %eg<#gT@UtSrSQ0N3hM>!-seVU7&AE"\/m./5#[2!/'UcgRr\,I42^`["&&tjTMJ07k\K`kN)q&d,hT]"[ccdu3k?bVL'JiYhehcDa6(#4 %k!+=V(4g5/]?P0+S!KF7tBcB>W/S'H^+@\U+#h>@*[d %>2Iq-i*\+fRN&Z*BWdkn$2baJ&o5*XSM78V9:]'W5/40q"6D6/A0aVqKd.4Y@?8($"6JYq?pe>Uee_=:b:D=D/E@*eQc52+,SEp( %N@S3JhSY[J_W8)\Z%Q9@69)._WnO,IbGph!MOc@T=:.?eaCTfZ,;:55oC)?K=c^@MBMj^j8>0ca9V*Yu)t$5f_eQ-C:gd.tN)\i: %$m'dn=VHa\4--[E"\Wg'EP#)RX'eNUa2B8nrW#m6Yq:NNooV?I %TEQI>9.[R5)ie/RPqqCU7UZIq,$Q19kO?JEj^L=C1X"K`/,\OnD]WU,m>Lb:QK)u`_`Q^V_jr1,nI'(ZMLO=jF1Os+_M>-pihT?GChlJcsTA=*:Q(ps-L1lOh>NAd.Nd*&^6AUZ@Z>4[q2AF6-cHgJf=qBdh"k/ld#HVse^pEmdi=$:4?d;%dN,]RnKXoLm58r*o*a0.@ZRA@\ %Xsbga3nOTMCu[ij[Dm?>ak&_eVa?[SSBB8.Mb(aabVAWEPqn:@;_X7%"%-ao<"LlFbP>6`Y0=T-h+s.ik[5aPXn)Yeapm;(c/E;] %_hL3i^eB;<_X;@Aq3eC(p;?nqJM^Whi&UjAg,Ho4r)pP6J@j4GEs&AW.`#J3AcHY.2d;rpi=3q..&]GVO>Knl2pA6U(D1]D!+Pl, %CVZU4_Zj-rT&.]=k03=,3W']MSh]#CG5r_d(7Iq+@"c@*7kRc4M[^p*05=8Xg739cZ,U0Su8@? %I/8oTWUQ]5)#]DT8&9iCH47;1R1V_Zq@B([Jm;;^HZ5F3Q_%Ap=X)#2Mhu`AJ@@?R*ZDqGV`S`MA$JT*#_4qWE_08LqAJ)l-51m4 %8Vh$dBXj?sI@)mj(=];V!LW&fh*g6P.-NgJ)c$aQ=2)gFIN(buSs"+]j1qok/cL/pN[9Q_NUkXG;%m\LAZSLSTe5LQdpR_T?6ho! %-taakeQ8,;A#\0PU*YO#g_(is$c=Q;j40[+Qh9_t8^ohHcM0,]5G1!0g;adFWm1D0"P;3bK.BV&\Qp-/*X4;"5=J.mic?2dcCcF=Xp*\BP6MJ*dUNpEiL8LS=$I^FdQV&<0)#S]pg4#Um'kX?O_U_40BdL! %#t996iUS[/mK2`7JaST8b2T^HaG)Ki6^pfl9=:)\4YR@!m)uE6F1rIa,1RUk`uCbi:Q"83?WZJ7 %fntp;!A*:V\('qK*u&!hHk,)i:har8gglBb$tu';IVB&)WfqY8S,OE35Do#bAN/]?#)VK8)Ip^d::W4#m0IFcN*e@4.W`slcTsQo %->Ks4h34Y^'JCEeRORJ$WN@of6PO/,G]Qi)=7Iapc^#AJ>a?4,)54?KHR]e`g=Ss\P!4?Z[":rfXXZ3]L\4e[ %Z[LPp.?]j/Z<3iP8U)o.]SLRMhniH7<_.5'f#\5uOHuToP0.Q+^e?Cp-qJ#r.hjJctrtt-S9$6Ak>+^c!oHJ"V9RV&YlfY`oYeV>o:S8:%+&Z;N %9AntE88mn;/SK0A`AW#:P\34/eM='V*q);b#D!+KabP33-o>]5^Aj2pb0ct?>rLOCp\t+S=)G;aGYXW= %i+mTEhX),i4u`2I?"3iFqa`Oc.;uG-6Z#7[!>U?*g%QP8q.[?LM10j8.n$+?s0($F,!+G+HC`B4MO5qfoHA-3GIPbM*7;Iq1Rog) %Xe]0`F\b=<;F+iGp(q@Nr-0kbFEdY?gDlNTnOnlj78oU"JS<\`)bnOcBI:pp2;!DVkYAiL2KdW=rcD_.Q2Q@90/CD2d-L%MG&d`hGY6%j(?XND( %A(?IX'J%rO0rF;1rP(6(-4-j:/ZK>fc+*Qhij']0o5"UYlbSIg3Cg&=0.03LOs[?D/E`]&;^96:be %#Xj5;L1DmB2\Vt/rV=12.M`Rk<9`AD%#MPkFm=VVFra+1!R\bMb2-%\f7SmrENtd6&lE>53*E3p\;_OJqohZdXiX2kr'Ghp4@korRi%]FPZEF:eMqY\T,[f0lqtsDkuHbAl3/GsS+dtuo4s/k2#57N%D %4,N%WQ,GEW^1jt.CCfX.hjUuR`(tGD:F2KBSk:<$s0+=,K=,(F.H"=Emg8%:>2J8h#)L!dXoHfqAj*NUG` %Bch32Rj*Eq1\n/PVOLF-d*KP(4AIa*"9"aLKI@fV6oN\I6"FP`RcoTp8/1k["JW]="b+`.\&\!P#5_a77*G!87W`ZpB,6:Il^oOC %5X^a$`%i05rs=^!Gq!4,abCH<[Vl>D^`W2oLd[BuO4e"D8RJ1as"7)(fRG+Y"mfOj,t&1XSAE#;-PD-as+Ed^8gYI)JG8IFqhf1s %!mtZbg(XW%d?\<:%2SEf*-\Xs5bH\s*^:Njq/QcNjVY&%TrH&)]ucLKUkQPq('fL\$^X$Y:YY_Hi$0MbV`_9D(u`@%<`nlpT<%:! %nUKD7B,tq113JMYVD%*NYt3tkUV)Jb?/ua-GsVH/F4J1rJ'8?kDO?>=QfdQK*;hhER*a\5LZ>1rW*Zf6WKD@KShJ[L!V5Lai40dq<=*$"L]GrO30"4=9QpU %4[ab,D#]qnp&:XL:Qk5]H$j9.JXq0A2hLi"%?:q$nVg6gf=qbZ_uVJ#UHX9_r["'Qk,1M`/;;5OQV;S*0?eMkpUAbB=k(Z.l3hup %C]Ae-oCQ!_N^3cRW!f!#'h>F@4<'.H!L-ko&HR@;knH;-jp0]j@oZpQISBCdn'J_3k?Ztf:i6`C?dKm\G:7D[_n4?DcU\]'nuIpn %Ch-QmpsiGa>hCpC=jf0V>XYZjVG5AWZ^W)TA^K8q9"e;M9Ws,`Lo:,_M43iKc^0[Bt=uJZX.bih_ft+9dP-s5TKMoA(]$-iCk?SI%ZmGeGcq %Ti_YZ.Wa]gCm4@33Jm-tAd-L"]Dlp*c,Z-?'rEf5_7u0W=[[J4=(q>&?Iij+4ePk0H]hQA/4P7\d:O*4[k*fE;RN;W]!sBtMGMC/ %iN9M."m]k71CCHi[)7eV.lFW3::WsLT7;jNjI=)s#6#4c$b9,HU952b:3lb>RicTkEN;$doBF["n$rk($F5+UMM;u-ZGQR2`*P;J2_9ak+k/oh*+t'$LhZc;3T+h9gS'&RSXPQ7,HgV:!rC:&0&JZ!Ps7G %K-u,M%Dg'GZmj/@?KrEJs5XpE+h`Z3P,Rj1HucSG.6_:\^#;FT'#N=p28<-6"bn>B#`437+fOB"fWS;,)?u&n+>&]4Wg_V7e0NgB %!f]7.Y9EtH&ck8gpU(9Whl9]X?r2\*q*,?aWud*LgE`S%^e@S0'r81%[H46k2Ie6YI#e+X/a4?.r8/Wf4> %ma_5DV=6t42YKX4r(;YC#K_:l!@kdBL(5(PEhe?5*JnX85OOa*eW0,]$nfrRA5#NGegHH.&0a"i`H[B4.)7#9#)guucGZ1WM(p$l %F=eD_M.BOg=>/F?fU+jXGF>V[,1d_u7B[o:9.aTJ)1ehSid0;/`JX/tY,1K`C]'d6%]L^17&p/UoA!_NR-F.,;69T=l]Q,pQA?9DLJd>K&/jpGr/Y?g3+t4p/?>0V'G=\E;#YuBPs %"^@k.kp*s`a7oRT>UFZD9fl4>q5GXeJE%9J1GehmTE9S%CG=g+8@5NBd7E;l7ABH5=s]V`"Xgom4o)W'q:2=HD%.8'9#:WJY&9 %)UFHnC;ZaEm$-ePTrEV=1npqV?>]J=p%4B0`s7$olU8)+9EpbfbJ&K+PLG4@0j*Oojtj!T>dS4MU$;O`=q&n)h6B#MSh$OTHS4Y9h2+7@i1m5niM]4ARpQq`(FH(P'5`5WrPrL?R8_^.jM36Z/jNB\d(;k %QEFo8O?")jNcPLrZKKeY8rXs\?PGlZb`(IUF_YZU`Yid%\Cef5RZkscoDgQF?Ear64=lc.#X`3Uuc/)3b8Gb %J/5d+6UrI1&TgFJTM>od14i7`qWDAPPS&""Npf:CSMGeWM3(u&Ti4G-@Je,(:X>Gc*%p[A(3pagkdZZ8q'9#Ve1\t.;fhsQE-&Z$,O-GW;6#ub %q'MXV+/PGeW_=cu8Nh*j^aHCgd0,k!3N&Zi_L@em*q.OK!KpdE2GY\1a_s[tdgO^])$:Lh#G[+gcAti\3qA18^k`SC"KM2(:%h2A$Em'a5@9>S5$NGuW?cH>n7H[[.(,>)A[n3Wj:p %9o0u0%ApKg$0cf&ZgD4JR)+Xm;e+j'eMpB5A@&_:#M\PmF-T5r2s;km.$Ci+euW[3STsPU<;7?=("k.,/"eb,#B+j&kATaIg/!aTs5)[QBMQX6UdeeXBN %eMK[)e4utHDWA1[M^'uNCqOr!K7'`R'i#a4o5`/9'i]?n4P\U;<-@0Y'MbT5&J'(G %,#o!l:,?)C,!6hla"Tp:[IJ4gRB+W$:^rh(.)j*_?BT3)L1WQ<5o(%[*LBFhE;WDl0`VasV]-/EZKmG/`@f^k:qb!E)97YL4qe5P %;h`"]bcnN %W9s'X(^@>QYu@3+,-+\9(i5^Le'V^lT;Il@\lM:XZ-qegb)WIF_$9kh3.q]Hj#1:EcXk:]X+ai4Qe^DJlI"Zc/)PK%lHsM''+K:X %_XpU+Qr1J49'LF"kas,T`T"kD]$uTI28gV#ahekdag(#E,#Y&:LIcj-%O1TEmja,mT?2Kr6n5.u$A_Y`b;Bj1Yb#VQ;B^K`gGR@K %kV_m\$3%?fY,M2R-0[0)lqS&b_;G#V8@m>VgG77cKbJ5V,$O.r.%E7X$Lqp3$RhP)4n)O*_J.^q]GM!2qj"&a8Zi5N_l2e1VHt>Y %cCj:=P4P>cQskf`=/'Cgg+2r23c9U`1icrLU$uX'\qTc'`09"9NMidaAUhkW5?R]JMiAAOaKVt&#'We*%F^YM1486H!Wujmh8#/` %9hX_o?7=%2$7_+0*/M(-<_5(R_FE1gbW+Z2WQbK_1:PjZ#.rP&^huk"L%C[!S[#^bpX\(.ScDb!G-d0GT,%RbRJgD??/2>^XS4#K[s[t55W!9m_4m`5[nfGG %?.g'XlRSG4\\.8"7&=!:L!4C*j+eI]-%UTSZ;2<7$.pi7loku:L41,qB?-l-&.s9;%jCaXKouM2/?n=P::Eo*N0hFSfH_5e[70Sa[MPPRIX<4a_;_UX%D3:.ttWLWYn;PkP?f),)>b] %<#+h&C.KPH\UWTHO_*s3QQ44Nkb%Kl33c%KFB#5:WeW#\1^Q`H[JY$uq:#\ab;G.&/1H)(oaE[J>RN8SlBT_<"HHb*9daS5P&kW7 %Ml)^(g<$H8(Sg6UY]Rh^b-TK;\r_tcUZo!kihObb7'5RuFE5Y32Nt=tVGfV]I2+RZ8L%RY9rB:PI6!`k%SMTRE`Fre_V(M2U?PFN %c_RXu'0ck!-`93(HPN]@^1#WFS&1=3]S`3KBBZjRSIbu`0&nlT]tOAFJQ!fkG.:ehVm"=VUL(!]E4Ns%SM"+ %a&I*Bki8%B1n?bLY)TTss#&2GEYTEBf1+62X_f4BH7^tE*0s@Y-43Wc.VLlR$H*S>)JD/l/=eW\j5jr83@p_7m9^#k-O7C0 %gd4A=LHYr>El4T\6g(6/,Yd8<5^eGfYlbj#T7D-%79L9kI,[mGOH,R&P)(iU[4\Io\LJol-YGMNZdm0$(Dl26P=n`L2/e(m^,dRa %)R_;"b"69Snqk#HAT'S-i0.pL=kP-m8f5pRn/3EKI(Mr-2R`)^rXaj5PB]Kn %kE!!'_2)gnFIe.I43a<)roGuaSZ_R?U9:b8mOj?%BMW]iTE\@.h-CSN@FEq:Hp1\3RQH-KK]/bAmU0'BeO4U"0=)t&\Wb[#7(./Q'BLGWL4)5;G>g%t9K0#+^iZn6QqPgV[O"opu1i8('+Eo#BY$NFZ %.mXm&:*!o5S*kYm-aJu6_guX(1VLT,TJSQSp1Ypco3^f?'LMh,H;5J)+"prJnDLu8Ln2#p2:SB;;_*WP!qffggQec"FT%bo-W,Af %8VK9`f)aI.Sct'1fM6t)^JgE2,jhh>h^PB2?`@r%_9*`c@7JHt5s2^0?>F!rmRB7Vq-Kn1W-bFH]'qZ75R&G/.=:6HTdP]njRLs)$,nM4(fE2PKjhO,8LA?sF8EnooZ$p+O5UF/lm]@2/2=#jrF%]K`O %E5!:o`gmG^>qg?LmN%"HBu7_:RQ4WC+&j#gfQ@5MT#tLqF<_n#!c.U6Tk9V4,AEIBjJ.p`qf^XQ4)lXQZdtIP>X;qY=&Xrl(c@9#rL[Nd"o[km3lutPkiKaZ3eREr_mH_PP=eg')WBjWn!FbjfJO\uAo9&Jec!rtpTP;$Oca(I?V`53V %aWHQUdbL8Y$l1#qDg2-M\FI*Q:32coJ!2\68TO-JE=nn_?BqaE^HNi=MOlua6K; %VuLX9Hs\1E3'/"2#M>LiB:K(!:WFjrp+L6rI9QG28KbYV,s9sH.'f$_fY=`XX%+FMS_>8P,S6Q&8CV#JA/eQY?[)Bbg.3K(b^R&` %U+r4Y3:c8H3t)=O^$n'cBdd]q4Kd88jhg/pcdL"3U`@"9+=\9*@HSZ3-6[9i4XVsF\VQ2]FeUq]j%^eYnGO.heIgi[@V\tU2s@@l %GAQi_/7qU,9aEJq7S"LeS,]Uhmq-QD0,/ZE3' %#:n8C:.qjAZM@eIV[&J0DRrSWJL1t+S-da+kZXHTn@W%>]d1Z(>BtnXl026kG\L\+@K<5@G+P3Ee]&Gs=#Q6%0I>^=/WK;*XiTe.I/-P3G"2Hq[4na!#rAB\ %k9H#h-KQQl2",b.R,GNA?-1k*%@Eu2)8:ieSKt)
  • &Z:nV"rPZMlE,:<:fA< %iKsZhm0#%8Zjt1p5gbVB=WW\@$m:$1a]U#WXVa;f&=OFHOJ=%NW_uQC% %Cl%Gf,blEDr+Dc)AND(E)^>1#>#9`)Q:Y/\=3r"P!"]&68bn$uD#_\SHqI8GlQtX;7cCM=Pg?"*BW,;F(!VrkS](Os;Ef*7V#OFm %4q2_8>p1Yhar0t)-07Mi.uT/jP4FI!1mM@[N(hMPm88K?/*-A%p2W%G%AbMWT/r/$)L;8u,hM_WL6BmKVt7:_RUam1=0]">fc@bn533Ssa8Q'Z%]X61\f8j9!Z<@.%G7^=7f2!9U_SjJIcg-AN/f@]1j)Sj?5NStq*+J-[]RBo]9$VNC"-ob3 %B/r%?hR:q+f2"E-h\F^+b3Ps:\,,[.I`f&(q=lS_4cm#Hl-ICo:3(5$Rc?6.htabeiFZ]t41b+F*gF#-Oo6)EH2T?cV.n';VejZM %LnP4JqMErQobPlX`b"cUQ.G(:;+5]*%:f7[i@k&'EX^Dc^][jGIfT)#dtlA_a]RH=?nS,etC<<5@MIu+ta*1hmo->F8`HPM-AG,PP4hgOZqT8(RBt-61DdGZi\/#m3^GN-d*9Kg^Md;_% %:XVgkgFdQneQI1rPhgN#Q1Fc#mq-#K]-skTBI$BZqC26*"MlCRfC.MDKDP08.3"##QZRLZ5:+3d["i:?YE@EiXdIWLGnsK&l_hC* %K<4SnjRlI,0SATCX5rqH.q\Gfmj4Nsf8gX1,i.6r?=#j:PMi]n@^]YB8RJACqi'_taZ1YeP8VW)f\sUHL'N)96 %KD-#2U1c`-,r$r)36d'5%uSEhbIPW\J7&F@"DVUR(Kc-,Q*IM%VM3hYrA;iH&'8##(O^2uX_C]G'nL$JLumkXLHD9mh0EXdTcg-' %ZgqVuUjdC17/AS!9I?A-cH^gBTh;.g03.jka!nUV.T5nNhOr#nR%%hi*sP\S2>a6lQd[%VI348BSa*jXFn\*VW^e)fWpG/2NmtDI %B;8d=>s%^61-JO-T.`!8n.[iY?\'"DolY1gm<6+)GIN(Z,^)]8]!ja2U:.`mEX*&*VZT>1>2AdAjg"@fRq6pgYMVgiS`Q\n)bhl7 %eRrU)bI+sSKuIS[Gopkbjk*H?`pOm<^G!R%K7a4DO03?hie,r[@6qe0S6l %_XcZ)YP:MlXb:pLehobjn=5$(EG)X+++ctkf@kk5gS45H)"eeQp1tND<\ld@V?__W!cK1=UQ!Tk$VZM^qj32fnRi&S*WAL\3DCUS %I_4JDjlW\k;=Gk=o:ab@HSrkk)TEd9*4k4GO+L0pXj?\=SHb^4Ir(XInh*TWoQK.N[Q76Lc/V6"Thr,$T73[Jn4psJV!FORs.&SZ %PPlE/\`$UKqm@#H.f`K*:`;"d@ZX3\9''*C`]dIRIf9=Fi"0B;RZ?$S#C$d-.4=gsG[!^Y%gm45JNs1gc(G<'9"O:&*Wb$]43,&+ %ki3b4JcW2/.;q6.&:VMGQO>G4!CjV)ocRQ)EWB,5mKE3MmJ`1Fmh%[.ntE7<9\0Qa2R>a+"(WU-he3fWiW(n11lnF='SK=+9,g_N %NZQ$P2BTUdZKsoho'[@lcpcJGR)/;NhZD[3p*'LnmJusMP@jU>#mbcVPdfN])"Y^Dq#UX?IWZI?_rP,$HYr/ua\qUES&lWiZi&7g %*ETc\1OgXha\@J(-']B")QMmE/?79-Mmd*B17bgJ42pK<9iDAppYt4FEl[W"\h$A*s)+Yb7s"$4VVM'8H9M)a1bUZWr$s %OYupfoqE`45.se,;57k2TAFsSp$3WHqU;^L+,noe(dO_gVuj"%$b4Ueo*H35r;+nd!0ZhM%K=J"[?'C!lYlYK0*%gDF1le%CGsb9 %!$[m!`oGR"efmr!D$T>h&fL3D,0g5Gf7/P?rsh`jRj>FDbdO2;_DrEi7\Fu!r/nUJ`b&^ %j%G"hG2>t(d9cY,#`oJMjFbp5Ri>b[#&V_CpJ;Nm/^CKY39l7C=8Ik'\_j\F1rmheVKhq>5L:HF5^_ogMu;#1VL>UaJL]66)sUBD %!8!\X3Zo,a^`J"]o"g/P9t\B%X;#?a$:C:XD2%#ABKCpE0fnagS]#nAk(GP@/kr:$AR4*Y;WBjD%>0V%A=[_5:iUuY1C=Hn)#=]= %pV#aipc>D43,8EnjVL'8ad_a*rAE!e%eQeVeR*;#_nIY4!!1C!@)%P"&_bU[$3Ja:Tn51h;j]EY!DhVV@M^+LYkmafHj%_kS$2bc %9u/i,B7Cm"3S<4)-79eJOL*G`WPGd-M"hJC53OfLqo:?tEJbA>%tO_&d``^D:^<^"G$F*GM&EKF=Y4]!6uh,H01CCoQt%Hd__Gu) %M6S]0igV*-gpi$^[ui'8K5CBn2?b@:%!/fZCP;aE-eZEie<,4_oa;bZj&\-hFi]_&DM30hf0,\5>EZ;G`D;pEa4i4#ibZ08:LY]H %"=:!lW!^g@8g[S7S:+ptJIfs[=eGZ^JC\&0eHQCKQ5p7'LH#ir9]nZT*=0b@Yl6hm,Ko!B_,p/X=##0:Q`C2B9>W_BWdr>A:2C)4 %"hY<5Ou=FF1-`-YZDj#--$NZNV)V&F.;[#DIW(O[4q@*$`oBb%d1BK6hShK%IbVk3H[%a9qn=QR("J;&&n%be=]LdQ#N`T$W;#u]$2V=IY*#% %!SRB3r<3(*K#+2=:XJPV+O0Ha?!^a?Y5qRkn^rVo)NldLIUY>d!CH%H/HO&?JYa0#@A]`$AOXM%$tH5fg-Kmf`GL+[]#qV3F[pCN2M/-J>4:jG?;6oO,U5=b1459KR5k)f^@MR- %*PYVbn18_<0(@NVMB,N#6?O[TCVpJ1I[sX=51aFXb"8-bW$9Zj'YY?n#o)\u``@<@eS6p?S;oOll&A?#\.T1`MLpP5 %Ho)BD^P5gn8bX%7M*)$Aa_i?6>Ti(] %]']F3n6-!MN@[QN@.IoOq<>?8^`WE3Bud_6ifGZ)q*KI0Z6+ocN-*]M3#5lckmM6MiM6>C&q26&9INN%p$O16K8#>R(X:BL %2Xm,ZD623Zf.ZU'9%Z*idou7+dIt/t\VS&U\b_rR38^nCBunWp0AqU<4fn+pUgm#PqX!SA*c03%*$!UR(%PJ;:Hf`'mb)`A/W]04 %q6&p3OIpGQjL0*4d9\(Z&=!TV:LWQ"Y:6;(I`Oa89_pLD^l:S:VE_C`]_J7=iL>>;LHR'Ks.FO`E8\KRD'OLh\F9a\_$U.W"/u8. %!4]F>MNKq72[u%iK9'/qQ-9p>g;<.sI6/Tb>:ueopbiatN="P,1FmJ3:-kMQj[G:5+S*R@.[7Iq[b>`%MlI4o.]>,T=dY"uh&V.m %U#X,rF=*L8BDb\Wl1oM`Rc@PG=K`Xt'UBf(5CQ`HDaDJc"j-Z/'fr=!Xe\jI78pUr7S6dTTgSEp>5ic+IcoG*gNi%+d\L:NI)8SN %IiL\ZXIe[+#/GQDZr@TH689/4Vp."B0`Ask!D;'Y0.VWAc_0^R#<^E2m,Jf#1Q",.i26SH8T`TW'Z:bRfUMs"f;B)Z&H@"1fLjKc %H_?8fp>rF`KL*,202\=dW;tj&$nD=ZCs4pV[3D)rlUGs5Y/Q_2A$D\5>@`:Oi/=R[a4m86:;(oi[tci66:!].)GBO%pbhL#695jJ %TLZg;4ZGbC&)+7Bi$f0l3l"EAIsN5ZWT#4?ErsJ!9ti]*DLaT[K/i'ZT8Qm&na"iDC;#4Q?`nOI?dPu^j;6E2\.n^5H+?1?K;(]- %H:C@FKYcaHIUn*u]"^Ndd`u+b-TVI.)R)WYq;adf2u6406jUCIF`Ud`%.UToQK43(']e&]nSll8>!Ij&*Gg):MWSWca\ha7/%HB2 %e_3"D!b:YF/21[oo`Lr(=P.GsjDTrCD!e$M]GIWa8&(::(j%jc`mn"9)q%L@@T?G&lc+N\TSbDhc;JhH1A#&qh*/LS %PohP54?5^aT!Xps-a3^#=,;0r<.`g.68AtN(5'GG4'0C(nOqeL41GVoa70M`[<$)F2]0qd?IB&A;T*FTbIUR?\\`".hoEUD7TA(SaX*it?Xf-u1O/hFI`:dVZq>2rGs=@&k+a-%oRncC8]Va%7&:_%Y,ONcK]ba5[>+,XE7?sX]M %qE'\p9Pjo2pt*i.#4IZH-R.[i[>s6R)pSTcoeVcJ^OE*/XAK%8FXEabRjmMH5RF4;:XJPVTP\G7IY*#%6.S%snItPA$%RnN5=*&N %!$mM@5=*&NJ2jFT:XJPV(bGO^"T;X.Yf:h_$2V=<%[*R,:OjoJUh`mHD-!0C.pmX%)6M&FD<5PO.^L)8P&9;rD^qNMI'TmPhm=P8 %Ye\W8TX:+'EVW.nCP\$?peLDI.j$6&8qYhDKdMSa+sJ&4l$!_ %'8Jfcgc)gpi_B?*.6@N@'/qhr)JT7EK1C)%$QFU3%Lgi]%fH(l%j7IuJkqF3aqKd2"/3L>jb\Yc@=JEfB*"Se)(;q1FT]Uk'>42q %peh29I_eh[g]VQ`Dr*[VRgH1iaUemUDu@?=c-"rP#!E[iI*gK"n21o2?XYtR'2rFPB]L$X!LBF^\D?Xng[KRDfa[+;^pBk %iHi0t$kLf=G]NDhS*gfVh=P=ZZhXk*!aaiC"6MhrLAqL@P;(S~> %AI9_PrivateDataEnd exempi-2.2.1/samples/testfiles/BlueSquare.avi0000664000175000017500000040224611745673651016174 00000000000000RIFFžAVI LISTÀhdrlavih8V‚ZÀÔÐàLISTtstrlstrh8vidsé0uZÒstrf((ÐàdvsdÀÔPrmL` ð C:\Documents and Settings\alillich\Desktop\BS.prproj8¨aJ  6à5ë²aJÿÿÿÿˆ¯ëLÿ`8`Vê Ä5ëÀ5ëZà5ëÀÙ¡Èh:´û`8²†“|Lÿ`8¯Þ4@Pšã¡.)5ã¡ žv#Üû`8²†“|Lÿ`8Ù4 Oš žv#Pg: žv# µcJøÃu! žv#㡊a]¬Lÿ`8¡SLhü`8iÕyÿÿÿÿLÿCr8rT¾ïÊþTPrMrCRPr.prprojèû`8/L @@ üú`8Adobe Premiere Pro 2.0ÀÀ5ë¡PrmAPARfˆÐLIST˜Tdattc_OQâù`8cR¡ jâtc_A@4¥`ùI¡rn_O(ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌrn_A(ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌJUNQ¶LIST”×movi00dcÀÔ?hxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÿÿÿa3ÈüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCC&CCC&CC§&¨&|&CC&CCC&CC§&¨& |& CC&C CC&C C§& ¨&|&ÿÿÿÿÿCC&CiŒ¿o¿ðÖÏñJXkCkkC&CC§&¨&|&ý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoñÃxá¼pÞ8&`iŒ¿o¿ðÖÏñJXkCkkC&CC§&¨&|&kokokoko8&iŒ¿o¿ðÖÏñJXkCkkC&CC§&¨&|&ÿÿÿÿÿkokokoko8&iŒ¿o¿ðÖÏñJXkCkkC&C C§&!¨&"|&#ý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoñÃxá¼pÞ8&`$iŒ¿o¿ðÖÏñJXkCkkC&C%C§&&¨&'|&(oooo8&)iŒ¿o¿ðÖÏñJXkCkkC&C*C§&+¨&,|&PØàÀ-oooo8&.kkCkkC&C/C§&0¨&1|&2oooo8&3kkCkkC&C4C§&5¨&6|&7oooo8&8kkCkkC&C9C§&:¨&;|&Q?Ï ÿ<oooo8&=kkCkkC&C>C§&?¨&@|&Aoooo8&BkkCkkC&CCC§&D¨&E|&Foooo8&GkkCkkC&CHC§&I¨&J|&ÿÿÿÿÿKoooo8&LkkCkkC&CMC§&N¨&O|&Pý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoñÃxá¼pÞ8&`QkkCkkC&CRC§&S¨&T|&Ukokokoko8&VkkCkkC&CWC§&X¨&Y|&ÿÿÿÿÿZkokokoko8&[kkCkkC&C\C§&]¨&^|&_ý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoñÃxá¼pÞ8&``kkCkkC&CaC§&b¨&c|&d$ëJI¡${¡¡ÀPÐðtˆ,oo8&ekCY~¾¼9B˜PÏjŠÿ Z†F++¿ûrg×çFÉæ‘º7DÅ^Y)ÿZÿCÎs˜þkþ[°JÅ`-d«¸¤'( T\ fC§&g¨&h|&ÿÿÿÿÿi‘oäžïã"ßÉ=߯E¿’{¿Œ‹€oo8&jY¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈þ®¿·òOwñ¿¾v>»rïÄJkC§&l¨&m|&nÆoo8&okˆkˆkˆkˆñ&JpC§&q¨&r|&sÆoo8&tkˆkˆkˆkˆñ&JuC§&v¨&w|&ÿÿÿÿÿxÆoo8&ykˆkˆkˆkˆñ&JzC§&{¨&||&}Æoo8&~kˆkˆkˆkˆñ&JC§&€¨&|&‚Æoo8&ƒkˆkˆkˆkˆñ&J„C§&…¨&†|&?hxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_`ÿÿÿa3Èüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPØàÀkÆkkoko8&ˆˆˆˆñ&JC§&¨&|&kÆkkoko8&ˆˆˆˆñ&JC§&¨& |& kÆkkoko8& ˆˆˆˆñ&J C§& ¨&|&Q?Ï ÿkÆkkoko8&ˆˆˆˆñ&JC§&¨&|& 6¯ÿùþkõßÎ]OÄ6¯ÿùþkõßÎ]OÄ6¯ÿùþkõßÎ]OÄ6¯ÿùþkõßÎ]OÄü?R:ˆÅcñ?üÿüõÝß›¬Wö?ºÅcñ›¬Wö?ºØ›-üb0ˆˆñ&JC§&¨&|&«¨‡×[â/V«¨‡×[â/V«¨‡×[â/V«¨‡×[â/Vð¯”<•â–ñk¯Gë¥ø¨~1›0ˆˆñ&JC§&¨&|&ÿÿÿÿÿ«¨‡×[â/V«¨‡×[â/V«¨‡×[â/V«¨‡×[â/Vð¯”<•â–ñk¯Gë¥ø¨~1›0ˆˆñ&J C§&!¨&"|&# 6¯ýýý7õßÇ~#Ý6¯ýýý7õßÇ~#Ý6¯ýýý7õßÇ~#Ý6¯ýýý7õßÇ~#Ýü?R-µøË[kñ?üÿüõÙþ$ý5ÿ‚y'ç>á$ýgòý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüováÿŽ[Ç-&ã–ñËK[kñ%–¶×ã-lËâ0C§&&¨&'|&(kÝkÝkÝkÝñ&þ)iŒ¿o¿ðÖÏñJXkokoko-&ñ*C§&+¨&,|&ÿÿÿÿÿ-kÝkÝkÝkÝñ&þ.kkokoko-&ñ/C§&0¨&1|&2kÝkÝkÝkÝñ&þ3ý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoñËxå¼rÞ9&`4C§&5¨&6|&7kÝkÝkÝkÝñ&þ8oooo9&9C§&:¨&;|&ÿÿÿÿÿ<kÝkÝkÝkÝñ&þ=oooo9&>C§&?¨&@|&AkÝkÝkÝkÝñ&þBoooo9&CC§&D¨&E|&FkÝkÝkÝkÝñ&þGoooo9&HC§&I¨&J|&ÿÿÿÿÿKkÝkÝkÝkÝñ&þLoooo9&MC§&N¨&O|&P 6¯ÿùþkõßÎ]OÄ6¯ÿùþkõßÎ]OÄ6¯ÿùþkõßÎ]OÄ6¯ÿùþkõßÎ]OÄü?R:ˆÅcñ?üÿüõÝßQ›¬Wö?ºÅcñ›¬Wö?ºØ›-üb0oo9&RC§&S¨&T|&U«¨‡×[â/V«¨‡×[â/V«¨‡×[â/V«¨‡×[â/Vð¯”<•â–ñk¯Gë¥ø¨~1V›0oo9&WC§&X¨&Y|&ÿÿÿÿÿZ«¨‡×[â/V«¨‡×[â/V«¨‡×[â/V«¨‡×[â/Vð¯”<•â–ñk¯Gë¥ø¨~1[›0oo9&\C§&]¨&^|&_ 6¯ýýý7õßÇ~#Ý6¯ýýý7õßÇ~#Ý6¯ýýý7õßÇ~#Ý6¯ýýý7õßÇ~#Ýü?R-µøË[kñ?üÿüõÙþ`ý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoñËxå¼rÞ9&ikm~2ÖÚüae­™|FC§&b¨&c|&dkÝkÝkÝkÝñ&þekokokoko9&üfC§&g¨&h|&ÿÿÿÿÿikÝkÝkÝkÝñ&þjkokokoko9&ükC§&l¨&m|&nkÝkÝkÝkÝñ&þoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoñËxå¼rÞ9&`pC§&q¨&r|&skÝkÝkÝkÝñ&þtoooo9&uC§&v¨&w|&ÿÿÿÿÿxkÝkÝkÝkÝñ&þyoooo9&zC§&{¨&||&}kÝkÝkÝkÝñ&þ~oooo9&C§&€¨&|&‚kÝkÝkÝkÝñ&þƒoooo9&„C§&…¨&†|&'?hxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÿÿÿa3Èüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿÿÿÿÿ'©‡Ý©‡Ý©‡3©‡Ýíšô¸ìm:Ç‘Ç`'oooo9&'C§&'¨&'|&'©Ý©Ý©©Ýîo&'oooo9&'C§&'¨&' |&' ©Ý©Ý©©Ýîo&' oooo9&' C§&' ¨&'|&'ÿÿÿÿÿ'©Ý©Ý©©Ýîo&'oooo9&'C§&'¨&'|&'©Ý©Ý©©Ýîo&'oooo9&'C§&'¨&'|&'©Ý©Ý©©Ýîo&'oooo9&'C§&'¨&'|&'ÿÿÿÿÿ'©Ý©Ý©©Ýîo&'oooo9&' C§&'!¨&'"|&'#©Ý©Ý©©Ýîo&'$oooo9&'%C§&'&¨&''|&'(©Ý©Ý©©Ýîo&')oooo9&'*C§&'+¨&',|&'PØàÀ'-©Ý©Ý©©Ýîo&'.oooo9&'/C§&'0¨&'1|&'2©Ý©Ý©©Ýîo&'3oooo9&'4C§&'5¨&'6|&'7©‡3©‡Ý©‡©‡3íšô˜m:Ç‘Ç`'8oooo9&'9C§&':¨&';|&'Q?Ï ÿ'<©‡©‡3©‡©‡íšô¸ìm:Ç‘Ç`'=oooo9&'>C§&'?¨&'@|&'A©©©©îo&'Boooo9&'CC§&'D¨&'E|&'F©©©©îo&'Goooo9&'HC§&'I¨&'J|&'ÿÿÿÿÿ'K©©©©îo&'Loooo9&'MC§&'N¨&'O|&'P©©©©îo&'Qoooo9&'RC§&'S¨&'T|&'U©©©©îo&'Voooo9&'WC§&'X¨&'Y|&'ÿÿÿÿÿ'Z©©©©îo&'[oooo9&'\C§&']¨&'^|&'_©©©©îo&'`oooo9&'aC§&'b¨&'c|&'d©©©©îo&'eoooo9&'fC§&'g¨&'h|&'ÿÿÿÿÿ'i©©©©îo&'joooo9&'kC§&'l¨&'m|&'n©©©©îo&'ooooo9&'pC§&'q¨&'r|&'s©‡3©‡©‡3©‡íšô˜m:Ç‘Ç`'toooo9&'uC§&'v¨&'w|&'ÿÿÿÿÿ'x©‡©‡3©‡©‡3íšô˜m:Ç‘Ç`'yoooo9&'zC§&'{¨&'||&'}©©©©îo&'~oooo9&'C§&'€¨&'|&'‚©©©©îo&'ƒoooo9&'„C§&'…¨&'†|&7?hxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_7`ÿÿÿa3Èüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7PØàÀ7©©©©îo&7oooo9&7C§&7¨&7|&7©©©©îo&7oooo9&7C§&7¨&7 |&7 ©©©©îo&7 oooo9&7 C§&7 ¨&7|&7Q?Ï ÿ7©©©©îo&7oooo9&7C§&7¨&7|&7ª Ÿ+ŽÀª Ÿ+ŽÀª Ÿ+ŽÀª Ÿ+ŽÀî_Ç`l>”ô8ãÅ`7oooo9&7C§&7¨&7|&7¬ŠìúëGâ%?Æ##¬ŠìúëGâ%?Æ#¬ŠìúëGâ%?Æ#¬ŠìúëGâ%?Æ#í¾Š0e¿½nýu–ý‘|7oooo9&7C§&7¨&7|&7ÿÿÿÿÿ7¬ŠìúëGâ%?Æ##¬ŠìúëGâ%?Æ#¬ŠìúëGâ%?Æ#¬ŠìúëGâ%?Æ#í¾Š0e¿½nýu–ý‘|7oooo9&7 C§&7!¨&7"|&7#ª Ÿ+ŽÀª Ÿ+ŽÀª Ÿ+ŽÀª Ÿ+ŽÀî_Ç`l>”ô8ãÅ`7$oooo9&7%C§&7&¨&7'|&7(©©©©îo&7)oooo9&7*C§&7+¨&7,|&7ÿÿÿÿÿ7-©©©©îo&7.oooo9&7/C§&70¨&71|&72©©©©îo&73oooo9&74C§&75¨&76|&77©©©©îo&78oooo9&79C§&7:¨&7;|&7ÿÿÿÿÿ7<©©©©îo&7=oooo9&7>C§&7?¨&7@|&7A©©©©îo&7Boooo9&7CC§&7D¨&7E|&7F©©©©îo&7Goooo9&7HC§&7I¨&7J|&7ÿÿÿÿÿ7K©©©©îo&7Loooo9&7MC§&7N¨&7O|&7Pª Ÿ+ŽÀª Ÿ+ŽÀª Ÿ+ŽÀª Ÿ+ŽÀî_Ç`l>”ô8ãÅ`7Qoooo9&7RC§&7S¨&7T|&7U¬ŠìúëGâ%?Æ##¬ŠìúëGâ%?Æ#¬ŠìúëGâ%?Æ#¬ŠìúëGâ%?Æ#í¾Š0e¿½nýu–ý‘|7Voooo9&7WC§&7X¨&7Y|&7ÿÿÿÿÿ7Z¬ŠìúëGâ%?Æ##¬ŠìúëGâ%?Æ#¬ŠìúëGâ%?Æ#¬ŠìúëGâ%?Æ#í¾Š0e¿½nýu–ý‘|7[oooo9&7\C§&7]¨&7^|&7_ª Ÿ+ŽÀª Ÿ+ŽÀª Ÿ+ŽÀª Ÿ+ŽÀî_Ç`l>”ô8ãÅ`7`oooo9&7aC§&7b¨&7c|&7d©©©©îo&7eoooo9&7fC§&7g¨&7h|&7ÿÿÿÿÿ7i©©©©îo&7joooo9&7kC§&7l¨&7m|&7n©©©©îo&7ooooo9&7pC§&7q¨&7r|&7s©©©©îo&7toooo9&7uC§&7v¨&7w|&7ÿÿÿÿÿ7x©©©©îo&7yoooo9&7zC§&7{¨&7||&7}©©©©îo&7~oooo9&7C§&7€¨&7|&7‚©©©©îo&7ƒoooo9&7„C§&7…¨&7†|&G?hxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?Gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?Gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_Gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_Gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_Gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÿÿÿa3ÈüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿGY¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈þ®¿·òOwñ¿¾v>»rïÄJG‘oäžïã"ßÉ=߯E¿’{¿Œ‹€oo9&GC§&G¨&G|&Gkˆkˆkˆkˆñ&JGÆoo9&Gý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoñÃxá¼pÞ8&`G¨&G |&G kˆkˆkˆkˆñ&JG Æoo9&G kokokoko8&G ¨&G|&GÿÿÿÿÿGkˆkˆkˆkˆñ&JGÆoo9&Gkokokoko8&G¨&G|&Gkˆkˆkˆkˆñ&JGÆoo9&Gý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoñÃxá¼pÞ8&`G¨&G|&Gkˆkˆkˆkˆñ&JGÆoo9&Goooo8&G¨&G|&GÿÿÿÿÿGkˆkˆkˆkˆñ&JGÆoo9&G oooo8&G!¨&G"|&G#kˆkˆkˆkˆñ&JG$Æoo9&G%oooo8&G&¨&G'|&G(kˆkˆkˆkˆñ&JG)Æoo9&G*oooo8&G+¨&G,|&GPØàÀG-kˆkˆkˆkˆñ&JG.Æoo9&G/oooo8&G0¨&G1|&G2kˆkˆkˆkˆñ&JG3Æoo9&G4oooo8&G5¨&G6|&G7Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈þ®¿·òOwñ¿¾v>»rïÄJG8‘oäžïã"ßÉ=߯E¿’{¿Œ‹€oo9&G9oooo8&G:¨&G;|&GQ?Ï ÿG<Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈þ®¿·òOwñ¿¾v>»rïÄJG=‘oäžïã"ßÉ=߯E¿’{¿Œ‹€oo9&G>oooo8&G?¨&G@|&GAkˆkˆkˆkˆñ&JGBÆoo9&GCý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoñÃxá¼pÞ8&`GD¨&GE|&GFkˆkˆkˆkˆñ&JGGÆoo9&GHkokokoko8&GI¨&GJ|&GÿÿÿÿÿGKkˆkˆkˆkˆñ&JGLÆoo9&GMkokokoko8&GN¨&GO|&GPkˆkˆkˆkˆñ&JGQÆoo9&GRý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoñÃxá¼pÞ8&`GS¨&GT|&GUkˆkˆkˆkˆñ&JGVÆoo9&GWoooo8&GX¨&GY|&GÿÿÿÿÿGZkˆkˆkˆkˆñ&JG[Æoo9&G\oooo8&G]¨&G^|&G_kˆkˆkˆkˆñ&JG`Æoo9&Gaoooo8&Gb¨&Gc|&Gdkˆkˆkˆkˆñ&JGeÆoo9&Gfoooo8&Gg¨&Gh|&GÿÿÿÿÿGikˆkˆkˆkˆñ&JGjÆoo9&Gkoooo8&Gl¨&Gm|&Gnkˆkˆkˆkˆñ&JGoÆoo9&Gpoooo8&Gq¨&Gr|&GsY¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈þ®¿·òOwñ¿¾v>»rïÄJGt‘oäžïã"ßÉ=߯E¿’{¿Œ‹€oo9&Guoooo8&Gv¨&Gw|&GÿÿÿÿÿGxY¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈Y¯ý_ýõßÎ?̈þ®¿·òOwñ¿¾v>»rïÄJGy‘oäžïã"ßÉ=߯E¿’{¿Œ‹€oo9&Gzoooo8&G{¨&G||&G}kˆkˆkˆkˆñ&JG~Æoo9&Gý¿ÿ õÿÏŸ‰þOüoý1ÿòÎþ|Â@úÏäñÃãŽo8&G€¨&G|&G‚kˆkˆkˆkˆñ&JGƒÆoo9&G„koiŒŸKgá§Å(`o8&G…¨&G†|&W?hxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?Wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?Wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_W`ÿÿÿa3Èüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_Wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWPØàÀWkˆkˆkˆkˆñ&JWÆoo9&Wkokkko8&W¨&W|&Wý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoñËxå¼rÞ9&ikm~2ÖÚüWe­™|Foo9&W 6¯ýýý7õßÇ~#Ý6¯ýýý7õßÇ~#Ý6¯ýýý7õßÇ~#Ý6¯ýýý7õßÇ~#Ýü?R-µøË[kñ?üÿüõÙþW¨&W |&W oooo9&üW oo9&W «¨‡×[â/VÝ«¨‡×[â/VÝ«¨‡×[â/VÝ«¨‡×[â/VÝð¯”<•â–ñk¯Gë¥ø¨~1W ¨&W|&WQ?Ï ÿWK{ÚüTÑ€ooo9&üWoo9&W«¨‡×[â/V«y¡«ÔAH¿(:"õŒ×竉îs"}]×Ô¿[záw ¿ñ¿CùŸ4Pš;YYò­û·/q%ãZ¿åO¬þ?÷‚ŠW¨&W|&WäïÆ{¬ûŒÝoö{ËÆM²§€'oæ[“­Ý['U!c²‚™]Ì’„²î®ºß|®„CŒÔ Â&Woo9&W6¯ÿùþkõßÎ]OÄ61þý6K¾wñÅ߈÷3¿þ ý2)?Æ—0üR¯éßí/åëãôþDû¿µ*š¢Å=ïæŸä®[²W@¨&W|&W{[™|Â&Woo9&Wkk÷kükD&²W@¨&W|&WÿÿÿÿÿW{[™|Â&Woo9&W kk÷kükD&²W!@¨&W"|&W#{[™|Â&W$oo9&W%kk÷kükD&²W&@¨&W'|&W({[™|Â&W)oo9&W*kk÷kükD&²W+@¨&W,|&WÿÿÿÿÿW-{[™|Â&W.oo9&W/kk÷kükD&²W0@¨&W1|&W2ý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoñËxå¼rÞ9&`W3oo9&W4kk÷kükD&²W5@¨&W6|&W7kokokoko9&W8oo9&W9kk÷kükD&²W:@¨&W;|&WÿÿÿÿÿW<kokokoko9&W=oo9&W>kk÷kükD&²W?@¨&W@|&WAý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoñËxå¼rÞ9&`WBoo9&WCk),ð Úa€k÷kükD0ÿ¥*„5 RàWD@¨&WE|&WFoooo9&WGoo9&WHk„ðXk÷kükDÿ¥)%ÜàWI@¨&WJ|&WÿÿÿÿÿWKoooo9&WLoo9&WMkk÷kükD&àWN@¨&WO|&WPoooo9&WQoo9&WRkk÷kükD&àWS@¨&WT|&WUoooo9&WVoo9&WWkk÷kükD&àWX@¨&WY|&WÿÿÿÿÿWZoooo9&W[oo9&W\kk÷kükD&àW]@¨&W^|&W_oooo9&W`oo9&Wakk÷kükD&àWb@¨&Wc|&Wdoooo9&Weoo9&Wfkk÷kükD&àWg@¨&Wh|&WÿÿÿÿÿWioooo9&Wjoo9&WkkiŒŸKgá§Å(`üD&àWl@¨&Wm|&Wný¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoñËxå¼rÞ9&`Wooo9&WpkiŒŸKgá§Å(`üD&àWq@¨&Wr|&Wskokokoko9&Wtoo9&WukiŒŸKgá§Å(`üD&àWv@¨&Ww|&WÿÿÿÿÿWxkokokoko9&Wyoo9&WzkiŒŸKgá§Å(`üD&àW{@¨&W||&W}ý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoñËxå¼rÞ9&`W~oo9&WkiŒŸKgá§Å(`üD&àW€@¨&W|&W‚oooo9&Wƒoo9&W„kiŒŸKgá§Å(`üD&àW…@¨&W†|&g?hxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÿÿÿa3Èüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgÿÿÿÿÿgoooo9&goo9&g©©©ü©Dîo&àg@¨&g|&goooo9&goo9&g©©©ü©Dîo&àg@¨&g |&g oooo9&g oo9&g ©©©ü©Dîo&àg @¨&g|&gÿÿÿÿÿgoooo9&giŒ¿o¿ðÖÏñJXkkoko9&g©ÛÚüTÑ€©ˆòá°¬…Çö6ü ¿ò?¬þ]³ðݬžï¬ÿY›oðÙ"À]¿åo¬þ?÷¿ g@¨&g|&goooo9&gý5ÿƒq#ç>`$}gòý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüo~‡áÿŽÇ &ã†ñÃg©ÛÚüTÑ€©ˆòá°¬…Çö6ü ¿ò?¬þ]³ðݬžï¬ÿY›oðÙ"À]¿åo¬þ?÷¿ g@¨&g|&goooo9&gòooo &g©ÛÚüTÑ€©ˆòá°¬…Çö6ü ¿ò?¬þ]³ðݬžï¬ÿY›oðÙ"À]¿åo¬þ?÷¿ g@¨&g|&gÿÿÿÿÿgoooo9&gòooo &g ©ÛÚüTÑ€©ˆòá°¬…Çö6ü ¿ò?¬þ]³ðݬžï¬ÿY›oðÙ"À]¿åo¬þ?÷¿ g!@¨&g"|&g#oooo9&g$òooo &g%©ÛÚüTÑ€©ˆòá°¬…Çö6ü ¿ò?¬þ]³ðݬžï¬ÿY›oðÙ"À]¿åo¬þ?÷¿ g&@¨&g'|&g(oooo9&g)òooo &g*©‡çöö¿4`©ƒ@'A€ªˆß¨R¬ ‡¿I€ ¿ò?¬þ_³ðݬžð;ÅrŽ’À[¿åHüÿã¿pg+@¨&g,|&gPØàÀg-oooo9&g.òooo &g/k„°kkkÿ¥ž `g0@¨&g1|&g2oooo9&g3òooo &g4k„°kkkÿ¥ä¯ø,g5@¨&g6|&g7oooo9&g8òooo &g9k„°kkkÿ¥ä¯ø,g:@¨&g;|&gQ?Ï ÿg<oooo9&g=òooo &g>k„°kkkÿ¥ä¯ø,g?@¨&g@|&gAoooo9&gBý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoñÃxá¼pÞ8&`gCk„°kkkÿ¥ä¯ø,gD@¨&gE|&gFoooo9&gGkokokoko8&gHk„°kkkÿ¥ä¯ø,gI@¨&gJ|&gÿÿÿÿÿgKoooo9&gLkokokoko8&gMkkkk&gN@¨&gO|&gPoooo9&gQý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoñÃxá¼pÞ8&`gRkkkk&gS@¨&gT|&gUoooo9&gVoooo8&gWkkkk&gX@¨&gY|&gÿÿÿÿÿgZoooo9&g[oooo8&g\kkkk&g]@¨&g^|&g_oooo9&g`oooo8&gakkkk&gb@¨&gc|&gdoooo9&geoooo8&gfkkkk&gg@¨&gh|&gÿÿÿÿÿgioooo9&gjoooo8&gkkiŒŸKgá§Å(`&gl@¨&gm|&gnoooo9&gooooo8&gpkiŒŸKgá§Å(`&gq@¨&gr|&gsoooo9&gtoooo8&gukiŒŸKgá§Å(`&gv@¨&gw|&gÿÿÿÿÿgxoooo9&gyoooo8&gzkiŒŸKgá§Å(`&g{@¨&g||&g}oooo9&g~ý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoý¿ÿ õÿÏŸ‰þOüoñÃxá¼pÞ8&`gkiŒŸKgá§Å(`&g€@¨&g|&g‚oooo9&gƒkokokoko8&g„kiŒŸKgá§Å(`&g…@¨&g†|&w?hxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_w`ÿÿÿa3Èüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwPØàÀwoooo9&woooo8&w©©©©îo&w@¨&w|&woooo9&woooo8&wª Ÿ+ŽÀª Ÿ+ŽÀª Ÿ+ŽÀª Ÿ+ŽÀî_Ç`l>”ô8ãÅ`w@¨&w |&w oooo9&w oooo8&w ¬ŠìúëGâ%?Æ##¬ŠìúëGâ%?Æ#¬ŠìúëGâ%?Æ#¬ŠìúëGâ%?Æ#í¾Š0e¿½nýu–ý‘|w @¨&w|&wQ?Ï ÿw³¸¦•ià´Ê!!׸’ Ž^›oo9&wiŒ¿o¿ðÖÏñJXkokoko8&w¬ŠìúëGâ%?Æ#@X˜¬€·c´;ðÒŸã„@¬…ŒªQ ¡ZAD䄺 ?ñr‘þe³eJC꤆ñ<÷Žr¹¡S@U¿åÖì?Ž}©w@¨&w|&w!oo9&wiŒ¿o¿ðÖÏñJXkokoko8&wª Ÿ+ŽÎ>GÝÍÆˆ,ª…ž¡£›¬ƒª s¨> ?ò?¬þa°}k'„Àï+ÑûYߨùq[¿å),?‹Ÿw@¨&w|&w!oo9&wiŒ¿o¿ðÖÏñJXkokoko8&w©ÛÚüTÑ€©ˆòá°¬…Çö6 ¿ò?¬þ]³ðݬžï¬ÿY›oðÙ"À]¿åo¬þ?÷¿ w@¨&w|&wÿÿÿÿÿw!oo9&wiŒ¿o¿ðÖÏñJXkokoko8&w ©ÛÚüTÑ€©ˆòá°¬…Çö6 ¿ò?¬þ]³ðݬžï¬ÿY›oðÙ"À]¿åo¬þ?÷¿ w!@¨&w"|&w#!oo9&w$iŒ¿o¿ðÖÏñJXkokoko8&w%©ÛÚüTÑ€©ˆòá°¬…Çö6 ¿ò?¬þ]³ðݬžï¬ÿY›oðÙ"À]¿åo¬þ?÷¿ w&@¨&w'|&w(!oo9&w)iŒ¿o¿ðÖÏñJXkokoko8&w*©ÛÚüTÑ€©ˆòá°¬…Çö6 ¿ò?¬þ]³ðݬžï¬ÿY›oðÙ"À]¿åo¬þ?÷¿ w+@¨&w,|&wÿÿÿÿÿw-!oo9&w.kkokoko8&w/k„°kkkÀÿ¥ä¯ø,w0@¨&w1|&w2!oo9&w3kkokoko8&w4k„°kkkÀÿ¥ä¯ø,w5@¨&w6|&w7!oo9&w8kkokoko8&w9k„°kkkÀÿ¥ä¯ø,w:@¨&w;|&wÿÿÿÿÿw<!oo9&w=kkokoko8&w>k„°kkkÀÿ¥ä¯ø,w?@¨&w@|&wA!oo9&wBkkokoko8&wCk),kkkK#I'D–wD@¨&wE|&wF!oo9&wGkkokoko8&wHk„°kkk,4°wI@¨&wJ|&wÿÿÿÿÿwKÔ(y`Ù⢌oo9&wLk…»Ï+î°/À_…„j„ð™3ª,JÔB``äMÕ—ñßñÅ®zÝß®ŽçYÝŽ°ž{ã1½´#ý<öÀi²^B<?æñóÿ•¿‹ÿwMkkkk&wN@¨&wO|&wP›K~iŠîµs_í‹rȤM“2}QAd·c%¹«‰©ç¸RÀ9&wQk2:6›g°Ñ8)j€”³ð5 [µ–?ÉÈfŒÝéíîÙ¹"«<·Ùv6¡ÿåþGxï3ngÜÿ™@Î)*\¾ÎþNöõ½}ØwRkkkk&wS@¨&wT|&wUrdR9&wVk)kÈkvkÜ&ØwWkkkk&wX@¨&wY|&wÿÿÿÿÿwZrdR9&w[k)kÈkvkÜ&Øw\kkkk&w]@¨&w^|&w_rdR9&w`k)kÈkvkÜ&Øwakkkk&wb@¨&wc|&wdrdR9&wek)kÈkvkÜ&Øwfkkkk&wg@¨&wh|&wÿÿÿÿÿwirdR9&wjk)kÈkvkÜ&ØwkkiŒŸKgá§Å(`&wl@¨&wm|&wnrdR9&wok)kÈkvkÜ&ØwpkiŒŸKgá§Å(`&wq@¨&wr|&wsrdR9&wtk)kÈkvkÜ&ØwukiŒŸKgá§Å(`&wv@¨&ww|&wÿÿÿÿÿwxrdR9&wyk)kÈkvkÜ&ØwzkiŒŸKgá§Å(`&w{@¨&w||&w}›¬Wö?ºÅcñ›¬Wö?ºØ›-üb0R9&w~ 6¯ÿùþkõßÎ]OÄ6¯ÿùþkõßÎ]OÄ6¯ÿùþkõßÎ]OÄ6¯ÿùþkõßÎ]OÄü?R:ˆÅcñ?üÿüõÝßwkiŒŸKgá§Å(`&w€@¨&w|&w‚›0R9&wƒ«¨‡×[â/V«¨‡×[â/V«¨‡×[â/V«¨‡×[â/Vð¯”<•â–ñk¯Gë¥ø¨~1w„kiŒŸKgá§Å(`&w…@¨&w†|&‡?hxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`ÿÿÿa3Èüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡ÿÿÿÿÿ‡›0R9&‡ñ&‡kkkk&‡@¨&‡|&‡›0R9&‡ñ&‡kkkk&‡@¨&‡ |&‡ ›0R9&‡ ñ&‡ kkkk&‡ @¨&‡|&‡ÿÿÿÿÿ‡›0R9&‡iŒ¿o¿ðÖÏñJXkkkñ&‡kkkk&‡@¨&‡|&‡›0R9&‡iŒ¿o¿ðÖÏñJXkkkñ&‡kkkk&‡@¨&‡|&‡›0R9&‡iŒ¿o¿ðÖÏñJXkkkñ&‡kkkk&‡@¨&‡|&‡ÿÿÿÿÿ‡›0R9&‡iŒ¿o¿ðÖÏñJXkkkñ&‡ kkkk&‡!@¨&‡"|&‡#›0R9&‡$iŒ¿o¿ðÖÏñJXkkkñ&‡%kkkk&‡&@¨&‡'|&‡(þIîþ2-äžÿ…0xì<ä~éh¶ÄpA-ö}}ò*L½~Êç(žAƒøŠ“í*X("&0hQ…€‡)iŒ¿o¿ðÖÏñJXkkkñ&‡*Y¯ý_ýõßÎ?̈Y¡ý_ýúœ˜Èü7Y!ýgý ùÿÍËäc/ãäŸoùõÝþ3îþ£–+(ÉI5»´ìu¢ËE‡+@¨&‡,|&‡PØàÀ‡-xL&‡.kkkkñ&‡/kˆk7kkî*4¤À‡0@¨&‡1|&‡2xL&‡3kkkkñ&‡4kˆk7kkî&‡5@¨&‡6|&‡7xL&‡8kkkkñ&‡9kˆk7kkî&‡:@¨&‡;|&‡Q?Ï ÿ‡<xL&‡=kkkkñ&‡>kˆk7kkî&‡?@¨&‡@|&‡AxL&‡Bkkkkñ&‡Ckˆk7kkî&‡D@¨&‡E|&‡FxL&‡Gkkkkñ&‡Hkˆk7kkî&‡I@¨&‡J|&‡ÿÿÿÿÿ‡KxL&‡LkVܘه⦌já†bãï¬þ1þ.ü7¯Øü«Ž·Öu7¿ µ“ñV#ü¼ßK/°°¿ç?¬þTþ1ü‡Mkˆk7kkî&‡N@¨&‡O|&‡PxL&‡QkVܘه⦌já†bãï¬þ1þ.ü7¯Øü«Ž·Öu7¿ µ“ñV#ü¼ßK/°°¿ç?¬þTþ1ü‡Rkˆk7kkî&‡S@¨&‡T|&‡UxL&‡VkVܘه⦌já†bãï¬þ1þ.ü7¯Øü«Ž·Öu7¿ µ“ñV#ü¼ßK/°°¿ç?¬þTþ1ü‡Wkˆk7kkî&‡X@¨&‡Y|&‡ÿÿÿÿÿ‡ZxL&‡[kVܘه⦌já†bãï¬þ1þ.ü7¯Øü«Ž·Öu7¿ µ“ñV#ü¼ßK/°°¿ç?¬þTþ1ü‡\kˆk7kkî&‡]@¨&‡^|&‡_xL&‡`kVܘه⦌já†bãï¬þ1þ.ü7¯Øü«Ž·Öu7¿ µ“ñV#ü¼ßK/°°¿ç?¬þTþ1ü‡akˆk7kkî&‡b@¨&‡c|&‡dxL&‡ek·&fŠŠ0j€ià°bãÁóÿŒ‹¿ ëö?«Ž ûÆå?[µ“ñV#ü½¯·Ëì,¿çïåoãÇfkˆk7kkî&‡g@¨&‡h|&‡ÿÿÿÿÿ‡ixL&‡j©‡©‡3©‡?©‡3íšô˜m:Ç‘Ç`‡kkˆiŒŸKgá§Å(`î&‡l@¨&‡m|&‡nxL&‡o©©©?©îo&‡pkˆiŒŸKgá§Å(`î&‡q@¨&‡r|&‡sxL&‡t©©©?©îo&‡ukˆiŒŸKgá§Å(`î&‡v@¨&‡w|&‡ÿÿÿÿÿ‡xxL&‡y©©©?©îo&‡zkˆiŒŸKgá§Å(`î&‡{@¨&‡||&‡}xL&‡~©©©?©îo&‡kˆiŒŸKgá§Å(`î&‡€@¨&‡|&‡‚xL&‡ƒ©©©?©îo&‡„kˆiŒŸKgá§Å(`î&‡…@¨&‡†|&—?hxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_—`ÿÿÿa3Èüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ—PØàÀ—xL&—?&—ˆî&—@¨&—|&—xL&—?&—ˆî&—@¨&— |&— xL&— ?&— ˆî&— @¨&—|&—Q?Ï ÿ—xL&—iŒ¿o¿ðÖÏñJXkk?k&—ˆî&—@¨&—|&—xL&—iŒ¿o¿ðÖÏñJXkk?k&—ˆî&—@¨&—|&—xL&—iŒ¿o¿ðÖÏñJXkk?k&—ˆî&—@¨&—|&—ÿÿÿÿÿ—xL&—iŒ¿o¿ðÖÏñJXkk?k&— ˆî&—!@¨&—"|&—#xL&—$iŒ¿o¿ðÖÏñJXkk?k&—%ý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoñËxå¼rÞ9&`—&@¨&—'|&—(xL&—)iŒ¿o¿ðÖÏñJXkk?k&—*kokokoko9&—+@¨&—,|&—ÿÿÿÿÿ—-xL&—.kkk?k&—/kokokoko9&—0@¨&—1|&—2xL&—3kkk?k&—4ý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoñËxå¼rÞ9&`—5@¨&—6|&—7xL&—8kkk?k&—9oooo9&—:@¨&—;|&—ÿÿÿÿÿ—<xL&—=kkk?k&—>oooo9&—?@¨&—@|&—AxL&—Bkkk?k&—Coooo9&—D@¨&—E|&—FxL&—Gkkk?k&—Hoooo9&—I@¨&—J|&—ÿÿÿÿÿ—KÌUr8‡’ŒL&—Lj…z;ëvä Âpöj‹– $(¡À‡^aŸã¨BÅÿÅÅ#ƒÙóG{r6eIÊ;Yü½¢ì²>_„É¿æXÿ(Á—Moooo9&—N@¨&—O|&—PL&—QkÛ“uÙ¿`j‡0bŸãƒWññ‡á½~×⬎´þñ¹F × :@Àý<ßK/°°¿æØþTþ1—Roooo9&—S@¨&—T|&—UL&—VkVܘه⦌já†bãï¬þ1þ.ü7¯Øü«Ž·Öu7¿ µ“ñV#ü¼ßK/°°¿ç?¬þTþ1ü—Woooo9&—X@¨&—Y|&—ÿÿÿÿÿ—ZL&—[kVܘه⦌já†bãï¬þ1þ.ü7¯Øü«Ž·Öu7¿ µ“ñV#ü¼ßK/°°¿ç?¬þTþ1ü—\oooo9&—]@¨&—^|&—_L&—`kVܘه⦌já†bãï¬þ1þ.ü7¯Øü«Ž·Öu7¿ µ“ñV#ü¼ßK/°°¿ç?¬þTþ1ü—aý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoý¿ÿ õÿÏ¿‰þNüoñËxå¼rÞ9&`—b@¨&—c|&—dL&—ekVܘه⦌já†bãï¬þ1þ.ü7¯Øü«Ž·Öu7¿ µ“ñV#ü¼ßK/°°¿ç?¬þTþ1ü—fkokokoko9&—g@¨&—h|&—ÿÿÿÿÿ—iL&—j©©©ü©îo&ü—kkoiŒŸKgá§Å(`oo9&—l@¨&—m|&—nL&—o©©©ü©îo&ü—pý¿ÿ õÿÏ¿‰þNüoý1ÿâÎþ}ÀAúÏäñËwãŽXo9&—q@¨&—r|&—sL&—t©©©ü©îo&ü—uoäo9&—v@¨&—w|&—ÿÿÿÿÿ—xL&—y©©©ü©îo&ü—zoäo9&—{@¨&—||&—}L&—~ª Ÿ+ŽÀª Ÿ+ŽÀª Ÿ+ŽÀª Ÿ+ŽÀî_Ç`l>”ô8ãÅ`—oäo9&—€@¨&—|&—‚L&—ƒ¬ŠìúëGâ%?Æ##¬ŠìúëGâ%?Æ#¬ŠìúëGâ%?Æ#¬ŠìúëGâ%?Æ#í¾Š0e¿½nýu–ý‘|—„oäo9&—…@¨&—†|&00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dc00dcidx1 00dcÀÔ00dcÌÔ00dcÔÔ00dcÜÔ00dcäÔ00dcìÔ00dcôÔ00dcüÔ00dcÕ00dc Õ00dcÕ00dcÕ00dc$Õ00dc,Õ00dc4Õ00dc<Õ00dcDÕ00dcLÕ00dcTÕ00dc\Õ00dcdÕ00dclÕ00dctÕ00dc|Õ00dc„Õ00dcŒÕ00dc”Õ00dcœÕ00dc¤Õ00dc¬Õ00dc´Õ00dc¼Õ00dcÄÕ00dcÌÕ00dcÔÕ00dcÜÕ00dcäÕ00dcìÕ00dcôÕ00dcüÕ00dcÖ00dc Ö00dcÖ00dcÖ00dc$Ö00dc,Ö00dc4Ö00dc<Ö00dcDÖ00dcLÖ00dcTÖ00dc\Ö00dcdÖ00dclÖ00dctÖ00dc|Ö00dc„Ö00dcŒÖ00dc”Ö00dcœÖ00dc¤Ö00dc¬Ö00dc´Ö00dc¼Ö00dcÄÖ00dcÌÖ00dcÔÖ00dcÜÖ00dcäÖ00dcìÖ00dcôÖ00dcüÖ00dc×00dc ×00dc×00dc×00dc$×00dc,×00dc4×00dc<×00dcD×00dcL×00dcT×00dc\×00dcd×00dcl×00dct×00dc|×00dc„×00dcŒ×JUNQb JUNQî Blue Square test file _PMX. Blue Square Test File - .avi XMPFiles BlueSquare test file, created in Premiere Pro, saved as .avi, .mov, .mp3, and .wav XMP Blue Square test file Premiere .avi exempi-2.2.1/samples/testfiles/BlueSquare.indd0000664000175000017500000271000011745673651016323 00000000000000íõØFå½1ïçþt·DOCUMENTp‹Ë¶és §‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ R»;f‡íõØFå½1ïçþt·DOCUMENTp‹Ë¶és §‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ R»9f¶gÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm|U¨Ê~ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÃÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿw|,,Íÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Š‹±² Ç}³Ì’<ppš pppppp_‹Ž  Œ ª © ¬1ª±«¶¶ ¶ ¸ ¹ · &&&&&&&& &!&"&#&$&%&&&'&(&)&*& +&!,&"-&#.&$/&%0&&1&'2&3&4&5&6&7&8&9&:& ;& <& =Ï >" ?3@GA/B?C=D+E'F)G'H5I-J+K)L'MCN=O-P/Q+ R+!S1"T7#UA$V)%W1&X-'Y+(Z7)[)*\/+]6,^+-_+.`A/aE0bpbá1c?dWe¬fqg.h[iUj[kƒ l mG nÇoËpÉ q?rÏ s` tQ u` vØ wq xÞ y z1 {h |’ }2 ~2 2 €" 2 ‚f ƒ  „ …2 †2 ‡, ˆ3 ‰( Šp ‹1 Œ# ; Žo p!p"p#p$p%p&p'p( p) p* p+ p, p-p.p/p0p1p2p3p4p5p6p7p8p9p:p;p<p=p>p? p@!pA"pB#pC$pD%pE&pF'pG(pH)pI*pJ+pK,pL-pM.pN/pO0pP1pQ2pR3pS4pT5pU6pV7pW8pX9pY:pZ;p[<p\=p]>p^?p_@p`ApaBpbCpcDpdEpeFpfGpgHphIpiJpjKpkLplMpmNpnOpoPppQpqRprSpsTptUpuVpvWpwXpxYpyZpz[p{\p|]p}^p~_p`p€apbp‚cpƒdp„ep…fp†gp‡hpˆip‰½ ïI»ÔÕV"      n !"#$%&'()*+,-./0123456789:;<=>>-?-@-A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z-[-\-]-^-_-`-a-bcdeÖfÖgnhiUjk3UlÍm¹n¹o¹p¹q>r>stËuËv>wËxËyËzË{Ë|}6~54€£‚¸ƒ¿„% …~†‡ʈʉÊŠ a‹(aŒ¿?¶Ž}}}‘}’}“}”|•n–—˜2 ™2 š›œžŸ L¡¢£¤¥¦§¨¾©ÖªÖ«Ö¬Ö­b®°3±3²3³3´3µ3¶3·3¸3¹3º3»3¼Ö€Àž~´Í N˜¾¨¡L lššd(À“ À}@@“ @}@@R— –—¤C @Unknown User Name5¿|" |>Øn * @ 4.0.0.611¥ųý*ÂÇœ * @ 4.0.0.611¥ųÿÖä4& €5@64ªe¬e  nn¶¶nn·¶¸¶¹ ,nn¶S¶¹¶nnº¶¶U¶»¶¶V¶¼¶¿ ¿½¶([¾¶Á¶¶nnÍÍö¶]¶nn¿¿¶^¶ĶÍͶ_¶Ŷ¹n¶`¶ƶîǶ||¶b¶ȶb¶c¶ɶ¤3¤ʶ¤4¤¤5¤¶g¶\a&aa'a¿!¿<b¹$,¶m¶ÍͶr¶¶s¶"+,¹+,¶t¶#¹,,¶u¶¶v¶¹.,¶w¶||¶x¶¿/¿¶y¶¿1¿¦B¤BÍ%Í.B¥B¶€¶¶/0¶¶¶Qb¶‚¶ ¶Í(Ͷƒ¶ ¶}| ¶Tb¶…¶ ¶&&¶†¶ ¶¶‡¶¶} |¶ˆ¶¶Í.Ͷ‰¶¶Í/Í¶Š¶¶¶‹¶¶[bÍ2ÍZ6Z¶Œ¶¶¶¶¶¶Ž¶¶¤C¤¹F,¶¶¶?¶¶¶¶‘¶¶³³33¶’¶¶UUc2a¶cUU¶¹M,¶7h7¶c¶¶™¶ ¶¿O¿aVa¶š¶!¶ cBÀB"¶ c#¶BÂB$¶¹U,%¶ c c&¶'¶(¶|D|c)¶*¶7v7BÉB+¶7w7,¶c-¶|K|œ3¶ ncnŒŒ¢ndn£-bnen¤a¶²¶9¶--¥b¶³¶ngn¦nhn§c/c¿k¿$c¨=¶>¶¼ ¿BÝB?¶¶¸¶@¶¤ˆ¤¬BßBA¶­nnn¯w&w°¶¾¶E¶±¶¿¶²¶À¶U1U³¶Á¶U2U0cµ¶¶Ä¶ÊζŶ¸Ê϶ƶM¶ L ¶Ç¶¶È¶»¶É¶ŒŒ¶Ê¶½¶Ë¶¶Ì¶¶Í¶…÷…  ¶Î¶¶Ï¶¶Ð¶¶Ñ¶€ X ¶Ò¶Œ$Œ¶Ó¶Bc¶Ô¶¶Õ¶È¶Ö¶¶×¶¶Ø¶¨b¶Ù¶¶Ú¶¶Û¶(¶Ü¶(¶Þ¶,],¶ß¶¶à¶¶á¶ g  h × k 3¸b»cB2B,k,B3B y{{ i @ Process Cyan?ã…¸Që…@Q€@RÀ?æVVVVVV?í}}}}}}” y{{ l@Process Magenta?èQë…¸R@Q€@.?ì\\\\\\?ßßßßßßà” y{{ k@Process Yellow?ÄzáG®{@Q€?ï???????îžžžžžŸ y{{ j @ Process Black?û333333@Q€@F€Èÿÿÿÿ D °  Œ 쬘 Ô È 9øhæ‘(r@Adobe InDesign(a@AppFramework.framework &@Metadata.framework¶@Table Model.frameworkL@Sections.framework@Spread.framework¤@InCopyShared.framework@Transparency.frameworkÍ@CJKGrid.frameworkŒ@Links.framework`@ObjectModelLib.rsrc¾@Assignments.framework @Print.frameworkn@Graphics.framework3@Guides.framework-@Linguistics.frameworkb@Spline.framework0@Indexing.framework@Text Attributes.framework>@Font Manager.framework@Layer.framework,@Generic Page Item.framework!Ë@CompFontMgr.framework5@Hyperlinks.framework @Paragraph Composer.framework¿ @ XML.frameworkU@Gradient Fill.framework@Master Page.framework³@Path Type.framework…@InBooklet SE.4x.pln.framework7@Text Wrap.framework@Text.framework¤@BNCore.frameworkZ@Stroke and Fill.frameworkc@Document Framework.framework @ TOC.frameworkB@CJK Text Attributes.frameworkw@Scripting.framework3@XMedia UI.frameworkb@Utilities.framework|@Color Management.framework0||ÊUUU$U  ÊÊÊU3Unnnnn cnn % cccndnnennfnngnnhnninnjnnknnlnnmnnnnnonnpnnqnnrnnsnnxnn‰nnŠnn‹nnŒn55}|}|5I5ËËË˶ ¶¶ ¶¶¶¶¶ ¶ ¶33 ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶+¶¶¶,¶¶¶-¶¶¶.¶ ¶¶/¶!¶¶0¶"¶¶1¶#¶$¶¶4¶¶5¶'¶(¶¶7¶)¶¶8¶*¶¶9¶+¶,¶-¶.¶¶=¶/¶¶>¶0¶¶?¶1¶¶@¶2¶¶A¶3¶4¶5¶¶E¶¶F¶8¶¶G¶Z)Z9¶¶H¶:¶¶I¶;¶¶J¶<¶LL¶K¶=¶¶L¶>¶¶M¶?¶¶N¶@¶¶O¶A¶¶P¶¶S¶Z5Z¶T¶¶U¶¶V¶¶W¶¶X¶¶Y¶¶Z¶L¶¶[¶¶\¶¶]¶¹,¶^¶¶_¶LL¶`¶¶b¶¶c¶¶e¶,?,¶n¶¶o¶¶u¶¶v¶¶w¶¶x¶>>¶{¶¶|¶¶}¶¶~¶¶¶¶€¶¶¶¶‚¶¶ƒ¶¶„¶¶…¶Ô`¶†¶Õ`¶‡¶Ö`¶ˆ¶¶‰¶¶Š¶¶‹¶¶Œ¶¶¶¶Ž¶¶¶¶¶¶‘¶¶’¶¶“¶¶•¶¶–¶¶—¶¶˜¶–`õ¶Ÿ¶¤¤¶¡¶¤¤ ¤¤!¤¤"¤¤#¤¤$%¶¨¶¶©¶¤ ¤¶ª¶¶«¶¶¬¶¶­¶¶®¶¶¯¶¶°¶¶±¶¤¤¶²¶¤¤¶³¶¶´¶¤¤¤¤¶µ¶¶¶¶¶·¶¶¸¶¶¹¶7 ¶º¶¶»¶¶¼¶¶½¶¶¾¶¶¿¶¶À¶¶Á¶¶Â¶¶Ã¶¶Ä¶¶Å¶¶Æ¶¶Ç¶¶È¶¶É¶¶Ê¶¶Ë¶¶Ì¶J¶Í¶K¶Î¶L"c¶Ò¶¶Ó¶#¶Õ¶¶Ö¶¶×¶¶Ø¶¶Ù¶>d>¶Ú¶¶Û¶¶Ü¶¶Þ¶¶ß¶¶à¶¶á¶¶â¶¶ã¶¶ä¶4¶å¶56     ¶ù¶a a¶ú¶¶û¶¶ü¶ !"#$BB%bb&'B!B)B"B*B#B+B$B,B%B-B&B.B'B/B(B012¤w¤3B,B4a(aB-B5B.B6B/B7B0B8B1B9B2B:B3BB4B;B5B<B6B=B7B>B8B?B9B@B:BAB;BBB<BCB=BDB>BEB?BFB@BGBABHBBBIBCBJBDBK~BEBLBFBMBGBNBHBOBIBP--BJBQBKBRBLBSBMBTUBOBVBPBWBQBXBRBYBSBZ[\]BWB^BXB_BYB`BZBaB[BbB\BcB]BB^BeB_BB`BBaBhBbBBcBjBdBkBeBlBfBmBgBnBhBo£BiB¤BjBqBkBrBlBsuwx3]3yzc{|c}~BxBByBBzBB{BƒB}B¸B~BBBcB€BBBˆ‰ŠŒŽ‘’“”BŽB•BB–BB—˜™šB”B›B•BœB–BB—BžBŸBB£BB¤BB¦BB­B00B®BB±BB²BB³BÊ…÷…040 2 Í;¾¿¿¿¿c¿/¿¿4¿UUµB4BB5BB6B¶ð¶B7BB8B¶ò¶ y B9B?¿«¿ 3‡3  ËË00E ËËÊ$Ëã˶¶ËË( ¶¶c¾¾Øc¿¿¿¶¾¾¿À¿‘¶’¶“¶ÿ ”¶!Z"#—¶(4$˜¶5`%™¶6`&š¶7`_›¶(œ¶)+Ÿ¶d>>, ¶->>¡¶¢¶>>/¶=¶£¶0¤¶1¥¶2¦¶§¶l¨¶©¶ª¶«¶¤¤¶F¶¬¶b¤¤¶G¶­¶LLc¶H¶LL¶I¶c°¶±¶²¶³¶ ÊW¶N¶´¶¹,ÊX¶O¶µ¶¹,UÊwh»l@™@’À@W@@R@˜°@’¼?õj+õ¨?õj+õ¨@mkxÁ5!Ï@y®ÚSI??©™™™™™š¦_$@(@B?è g ˜™3v@ƒ @ˆÀn ••|D off prespdil|K”|.Ž’Ž’³ ¶]øÅ¶ ¶@¶ ¶?ð¶¶+¶F@¶,¶G@¶-¶H@¶.¶I@¶/¶0 ¶N¶1 ¶O¶e¶4¶U?ð¶5 ¶V ¶7¶_?ð¶8 ¶` ¶9 -¶= ¶b¶>¶c@Y¶@¶A¶E¶r?ð¶F¶s?ð¶G¶t?ð¶H¶u?ð¶I ¶v ¶J ¶w ¶K ¶x ¶L ¶y ¶M¶€Z)¶N¶Z)¶O¶‚Z)¶P¶ƒZ)¶S¶?ð¶T ¶‰ ¶U¶…Z)¶V¶Ž?ð¶W ¶Š ¶X¶†Z)¶Y¶?ð¶Z ¶‹ ¶[¶‡Z)¶\¶?ð¶] ¶Œ ¶^¶ˆZ)¶_¶‘Z)¶`¶’Z)¶b¶™@¶c¶šÀ¶n¶²@¶o¶³@‚À¶u¶¾¶v ¶¿¶w ¶À¶x¶Á¶{ ¶Ä ¶| ¶Å¶} ¶Æ¶~ ¶Ç¶ ¶È ¶€ ¶É¶ ¶Ê¶‚ ¶Ë¶ƒ ¶Ì¶„ ¶Í ¶… ¶Î ¶† ¶Ï¶‡ ¶Ð¶ˆ¶ÑZ)¶‰¶ÒZ)¶Š ¶Ó ¶‹ ¶Ô ¶Œ ¶Õ¶ ¶Ö¶Ž¶×Z)¶¶ØZ)¶¶Ù?ð¶‘¶Ú?ж’¶Û?ð¶“¶Ü?ж• ¶Þ¶– ¶ß¶— ¶à¶˜ ¶á¶Ÿ ¶ð¶¡ ¶ò¶¨@Y¶©@Y¶ª @Y¶« @Y¶¬ @Y¶­ @Y¶® @Y¶¯@Y¶°@4¶±@Y¶²@4¶³@Y¶´@Y¶µ@Y¶¶@Y¶·@Y¶¸@Y¶¹@Y¶º ¶» ¶¼ ¶½ ¶¾ ¶¿  ¶À !¶Á "¶Â #¶Ã $¶Ä %¶Å &¶Æ '¶Ç (¶È )¶É *¶Ê +¶Ë ,¶Ì ¶S¶Í830?ð¶Î830?ð¶Ò9¶Ó ¶Õ ¶Ö ¶× ¶Ø??ð¶Ù=Z)¶Ú > ¶Û@@Y¶Ü A¶Þ E¶ß¶^¶à¶^¶á M¶â ¶=¶ã ¶=¶ä ¶=¶å ¶=¶ù ¶¸¶ú ¶¸¶û ¶¸¶ü ¶¸  ‘ ’ “ ” —˜@Y™@Yš@Y›@Yœ@YŸ@Y @Y¡@Y¢@Y£@Y¤@Y¥@Y¦@Y§@Y¨@Y ©! ª" «# ¬$ ­' °( ±) ²* aÄhij+ ´, µ- ¶. ·/ ¸0 ¹1 º2 »3 ¼4 ½5 ¾8 Á9 Â: Ã; Ä< Å= Æ> Ç? È@ ÉA ÊL w&¶m ÿÿÿÿ¿O/@Story+@Table(@Cell/¼ ¿k¿«¿!ŒË tÿÿÿÿ sÿÿÿÿ0K04@kIndexGroup_Symbol@kIndexGroup_Symbol@@kIndexSection_Symbol@kIndexGroup_Alphabet@kIndexGroup_Alphabet@A@kIndexSection_A@B@kIndexSection_B@C@kIndexSection_C@D@kIndexSection_D@E@kIndexSection_E@F@kIndexSection_F@G@kIndexSection_G@H@kIndexSection_H@I@kIndexSection_I@J@kIndexSection_J@K@kIndexSection_K@L@kIndexSection_L@M@kIndexSection_M@N@kIndexSection_N@O@kIndexSection_O@P@kIndexSection_P@Q@kIndexSection_Q@R@kIndexSection_R@S@kIndexSection_S@T@kIndexSection_T@U@kIndexSection_U@V@kIndexSection_V@W@kIndexSection_W@X@kIndexSection_X@Y@kIndexSection_Y@Z@kIndexSection_Z3‡@i @i¤ˆr "*%Ê»q@Regularvr@Regular¹mnopÍ2lÍ% lÿÿÿÿÍ ÿÿÿÿ ?à;Í.Z=@Regular@"lÙ³fÍ›@£F4h?ð?ð@"lÙ³fÍ›Í/N=@Regular@"lÙ³fÍ›@£F4h?ð?ðnnngî@(#(>( çcdÊ@ Z) ?ð@Y@Y@RZ) ?ð@Y@Y@r(4@(7h€®@Q€@M&fffff@M&fffff@@¦fffff@@¦fffff@(@b@@?”záG®{/ cÿÿÿÿ.bd-$>@Neutral? @ English: UK@@Portuguese: BrazilianA @ BulgarianB@English: CanadianC@French: CanadianD@CatalanE@CzechF@DanishG@DutchH @ English: USAI@EstonianJ@FinnishK@FrenchL@GreekM@German: TraditionalN@German: ReformedO@CroatianP @ HungarianQ@ItalianR@LatvianS @ LithuanianT@Norwegian: BokmalU@Norwegian: NynorskV@PolishW @ PortugueseX@RomanianY@RussianZ @ German: Swiss[@Slovak\ @ Slovenian]@Spanish: Castilian^@Swedish_@Turkish`@English: USA Legala@English: USA MedicalH>=qrv? ö  (@(-?ð >d   /?ð ×   £  )   %A—ׄ °-?𨨯8³‹¥?ó333333¬¿ð H   ²! ²" # ³$ %0@B&¨'¨)  * + =, µ-­?ð.1?õG®záH/2?é™™™™™š0§1§2§3¦?ð4¦?ð5¦?ð6¯7 #8 9 ¢: ¤; ¤< = > \? @ A±¿ðB±¿ðC D E,F,G¿ðH¿ðI"J"K+L M/?ðN±¿ðO¯P¯Q¯R $S T?ðU±¿ðV¯W¯X¯Y $Z [ \ ] ^&_`?ðab?ðc e¯h j #k l m n o qÈZ)rÈZ)s œu ¸w x±¿ðy z  { |±¿ð} ~  ƒ ½ˆ ‰ Š Œ  Ž  ±¿ð‘ÿÀÇ€’ “±¿ð”ÿÀÇ€•ÈZ)– — ˜ ™±¿ðšÿÀÇ€› œ±¿ðÈZ)žÿÀÇ€Ê BB! B"¿ðB#¿ðB$ B% B2B& BÀB' B( B, B- B. !B/¿ðB0B1 B3B2 B3 B4B5 B5B6?ðB7?ðB8B9B: B; B< B4B= B> B?B9?å¸Që…B@ BA±¿ðBB »ÿÿBC BD±¿ðBE »ÿÿBF¶¿ðBG  BH¿ðBI?ðBJ BKBL?ðBM?ðBOBP B8BQ BR  BS  BW BX±¿ðBY »ÿÿBZ B[±¿ðB\ »ÿÿB]¶¿ðB^ B_B`Ba  Bb Bc  Bd  Be Bf B6BgBh Bi Bj Bk Bl BxB¤ByB¥@F€Bz B{ B} B~ B?àB€B B7BŽ B B B” B• B– B— BÂBŸ BÉB£ B¤ B¦ B­ BÝB® BßB±  B² B³ 0 5 Ý*½5I ¤ ¤¤¤5¿ð¤ ¤¤3 "¤ ¤ ¤4.¤ ¤¤w¤ ¤¤ ¤…÷…÷ ˜% !"#$%&'()*+,-./0123456789:;< L:í8CRBNMPgF° com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 (‰ä; com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticÊÌket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket MPSt. com.apple.print.DocumentTicket.PMSpoolFormat com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.DocumentTicket.PMSpoolFormat application/pdf com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.JobInfo.PMJobName com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.JobInfo.PMJobName Untitled com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PSInjectionData com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PSInjectionData com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMColorSyncProfileID com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMColorSyncProfileID 3473 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMCopies com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMCopies 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMCopyCollate com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMCopyCollate com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMFirstPage com.apple.print.ticket.creator com.apple.printingmanager com.apple.pP v~rint.ticket.itemArray com.apple.print.PrintSettings.PMFirstPage 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMLastPage com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMLastPage 2147483647 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMPageRange com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMPageRange 1 2147483647 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T21:40:11Z com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PrintSettingsTicket MPVwMPrtHollister-XRXN32-E12603@kPrSt_DefaultName@Hollister-XRXN32-E12603@Generic PostScript Printer)@)Tralfamador:private:var:tmp:431f5e3b08e65@R@ƒ @ˆÀ@0™™ @2™˜@‚›3@@ˆ+3@ÿÿÿý @ US Letter¿ð¿ð@F€@Q€@kDefault@kDefault@Y@Y@[@@Q€@RÀ@Q€@.@Q€@Q€@F€@Q€@F€@kFlSt_MediumDefaultNameLetter  8@(@(?ð@Rx  hjik® E$@R@R2Z @7Ï 0°B{{$ ¿ð  &?ð@Black °B{{$ ¿ð  &?ð@Cyan°B{{$ ¿ð  &?ð@Magenta8B{{0@None °B{{$ ¿ð  &@Paper¸B{{$ ¿ð  &?ð?ð?ð?ð# @ Registration °B{{$ ¿ð  &?ð@Yellow¼B{{$ ¿ð  &?ð(@C=0 M=0 Y=100 K=0¼ B{{$ ¿ð  &?ð(@C=0 M=100 Y=0 K=0¼ B{{$ ¿ð  &?ð(@C=100 M=0 Y=0 K=0¼ B{{$ ¿ð  &?ð?ìÌÌÌÌÌÍ?¹™™™™™š*@C=100 M=90 Y=10 K=0À B{{$ ¿ð  &?Ã333333?ð?ð+@C=15 M=100 Y=100 K=0¼ B{{$ ¿ð  &?è?©™™™™™š?ð)@C=75 M=5 Y=100 K=0,?Ó× =p£×?ã333333?ð,?ð,?Ó× =p£×?ð?Ó× =p£×,?ð,?ð?ð?Ó× =p£×,?ð?Ó× =p£×?ð,?ð?ð,?à?à?à,,?ð?Ù™™™™™š,?Õ¸Që…,?ã333333?ã333333,?é™™™™™š?ã333333?Ù™™™™™š,?ã333333?É™™™™™š,?ã333333?É™™™™™š?ð,?ð?ã333333,?àõÂ\(ö,?ð?ã333333?é™™™™™š, ?ã333333?ã333333?ð,!?ã333333,"?Ù™™™™™š?Ù™™™™™š,#?ð?ã333333?ã333333,$?ã333333?É™™™™™š,%?ã333333?é™™™™™š,&?ã333333?Ù™™™™™š,'?Ù™™™™™š?Ù™™™™™šØÿÿÿÿ0/.-,+*) ì À ” h <  ä ¸ Œ ` 4  Ü ° „ X , Ô ¨ | P $ øÌP”Ø`°øH`°0'(D Ø kTëU,?ç\(õÂ\?ç\(õÂ\?ç\(õÂ\,?åp£× =q?äzáG®{?æ¸Që…¸,?Þ¸Që…¸?ç\(õÂ\?ë333333,?ð?æ¸Që…¸?ÚáG®zá,?ï =p£× ?Öffffff?ÚáG®zá,?á™™™™™š?äÌÌÌÌÌÍ?ÚáG®zá,?éë…¸Qì?àQë…¸R?æ¸Që…¸,?àQë…¸R?éë…¸Qì?èQë…¸R, ?éë…¸Qì?éë…¸Qì?àQë…¸R, ?ã…¸Që…?ë× =p£×?ã…¸Që…, ?ð?ð?ðÔ >Ç@Times@Times@Regular @ Times-Roman @ Times Roman@Regular @ Times Roman@5.0d10e1@Italic @ Times-Italic @ Times Italic@Italic @ Times Italic@5.0d10e1@Bold @ Times-Bold @ Times Bold@Bold @ Times Bold@5.0d10e1 @ Bold Italic@Times-BoldItalic@Times Bold Italic @ Bold Italic@Times Bold Italic@5.0d10e1( -@Neutral8-+ @ English: UK@English@UK L-?@Portuguese: Brazilian @ Portuguese @ Brazilian 4-' @ Bulgarian @ BulgarianD-7@English: Canadian@English@Canadian D-5@French: Canadian@French@Canadian0-#@Catalan@Catalan,-@Czech@Czech 0-!@Danish@Danish ,-@Dutch@Dutch <-- @ English: USA@English@USA 4-%@Estonian@Estonian0-#@Finnish@Finnish0-!@French@French,-@Greek@GreekH-;@German: Traditional@German @ TraditionalD-5@German: Reformed@German@Reformed4-%@Croatian@Croatian 4-' @ Hungarian @ Hungarian0 -#@Italian@Italian0!-#@Latvian@Latvian8"-) @ Lithuanian @ Lithuanian<#-/@Norwegian: Bokmal @ NorwegianH$-9@Norwegian: Nynorsk @ Norwegian@Nynorsk0%-!@Polish@Polish8&-) @ Portuguese @ Portuguese 4'-%@Romanian@Romanian!0(-#@Russian@Russian"<)-/ @ German: Swiss@German@Swiss0*-!@Slovak@Slovak#4+-' @ Slovenian @ Slovenian$<,-.@Spanish: Castilian@Spanish&0--#@Swedish@Swedish'0.-#@Turkish@Turkish)H/-9@English: USA Legal@English @ USA Legal L0-=@English: USA Medical@English @ USA Medical è1€Bz B{ B} B~ B?àB€B B7BŽ B B B” B• B– B— BÂBŸ BÉB£ B¤ B¦ B­ BÝB® BßB±  B² B³ 0 5 5I ¤ ¤¤¤5¿ð¤ ¤¤3 "¤ ¤ ¤4.¤ ¤¤w¤ ¤¤ ¤…÷…÷ 07@[No paragraph style]tÿÿÿÿ@?>=<;:9876543€ 4 ì ¼ Œ P  ì ° € L  äœ`(øÈ”`Ô¨xHج|P ܘdà¸ä¸Œ`4ܰ„X,@12ht \•éá? ö  (@(-?ð >d   /?ð ×   £  )   %A—ׄ °-?𨨯¥?ó333333¬¿ð H   ²! ²" # ³$ %0@B&¨'¨)  * + =, µ-­?ð.1?õG®záH/2?é™™™™™š0§1§2§3¦?ð4¦?ð5¦?ð6¯7 #8 9 ¢: ¤; ¤< = > \? @ A±¿ðB±¿ðC D E,F,G¿ðH¿ðI"J"K+L M/?ðN±¿ðO¯P¯Q¯R $S T?ðU±¿ðV¯W¯X¯Y $Z [ \ ] ^&_`?ðab?ðc e¯h j #k l m n o qÈZ)rÈZ)s œu ¸w x±¿ðy z  { |±¿ð} ~  ƒ ½ˆ ‰ Š Œ  Ž  ±¿ð‘ÿÀÇ€’ “±¿ð”ÿÀÇ€•ÈZ)– — ˜ ™±¿ðšÿÀÇ€› œ±¿ðÈZ)žÿÀÇ€Ê BB! B"¿ðB#¿ðB$ B% B2B& BÀB' B( B, B- B. !B/¿ðB0B1 B3B2 B3 B4B5 B5B6?ðB7?ðB8B9B: B; B< B4B= B> B?B9?å¸Që…B@ BA±¿ðBB »ÿÿBC BD±¿ðBE »ÿÿBF¶¿ðBG  BH¿ðBI?ðBJ BKBL?ðBM?ðBOBP B8BQ BR  BS  BW BX±¿ðBY »ÿÿBZ B[±¿ðB\ »ÿÿB]¶¿ðB^ B_B`Ba  Bb Bc  Bd  Be Bf B6BgBh Bi Bj Bk Bl BxB¤ByB¥@Fß!D07@[No character style]\ÊÎ{{?07b@NormalParagraphStyle°7¤©–"| ßð îðk –ÿl ÿ› 8 øsÜ fñ€ ˜¨ZþCì Îø¨/ Öæ € ›ÿrQC ÿjË ñ U ðäö öÜ4 ø0 Ò ø ô' ù:Yÿy~ ´  äè øÇ1ø Ñ/ HÔx7i««i ? %á Ž=Š\ÿKâYkÈ)æüZd(Šþý<‰ ·œ™ÿY”< %á Ž=Š\ÿKâYkÇjK$Šþý<‰·œ™ÿqHZ˜‡ ŠÿJ°€™ ÿ_H™†û¸‰ í™ÿo;™ª-É™ÿKÒ= ÇÎ ÿ5, ÊïŠ\ÿ5ŠÈĉ$ÿ€š ÿ_ÿ5= *щ\Õ/(ñŠÕŠ“ÿ™ÚB™ÿ%¾™€ÚB‰ák¥)æü鉟_+ŠhëÕˆ=™ÿYërŠoÿ&{ ‰ˆôŠ|ÿBýÈ4ôÙ*ÿC1Z^ÅÊþ¡;ÀÏ ÈnÊÿ7’ Ènÿ7’ Ènÿ7’ Ènÿ7’Ê^ň0øÑšÿ|ÿÝ ò ™•”ó`˜ÿ^˜œï`‰úi€™ÿZû˜™—þþX€0€ä€0‰õ1­‰äá)ðô4nün h UiiU3kkn n+UnhncU$nhncZ5*Z6@(ncndncnenh?ðncnfnh¿ðncngnencnhncninh¿ðncnjnencnkngncnlngncnmnh@ncnn"ndZ)ncnondncnpnh@(ncnqndncnrndncnsnencnxnencn‰ncnŠnh¿ðncn‹nencnŒngncnh@Yncngncnencnencngncnh@ncnh@ncnh@RÀncngnc nh@nc!ngnc"nh@"nc#nhnc$nh@Ync%ngnc7ncJnhncKnhncLnhncn n hhUiiU3kkn nn"ki®` &?ð\B{{U.j ?ð?à?àU ` &ˆ B{{U2\?ð?ð?ðU1 $ Í( @ [Page Grid]Ø €(>([@(#¹+ÔUnhncU$nhncndncnenh?ðncnfnh¿ðncngnencnhncninh¿ðncnjnencnkngncnlngncnmnh@ncnn"ndZ)ncnondncnpnh@(ncnqndncnrndncnsnencnxnencn‰ Ä    ¸ \ ü ÈP D ÿÿÿÿ ÜÐP@€ncnŠnh¿ðncn‹nencnŒngnc¹$h@b@(@(¹, nh@Yncngncnencnencngncnh@ncnh@ncnh@RÀncngnc nh@nc!ngnc"nh@"nc%ngnc7ncJnhncKnhncLnhnc¹.H¹?¹7¹8¹9¹>­È¹3¹4¹5¹6¹:¹2¹@Ê/7È7ɹB¹@[None]̹U¹M¹F¹.( ¹7¹8¹9¹3¹4¹5¹6¹:¹2¹.m@[Normal Graphics Frame]ųýÚ·4Í2¹ {{7w@ ÿÿ7v((>([@(#¹+ÔUnhncU$nhncnd ncnenh?ðncnfnh¿ðncngnencnhncninh¿ðncnjnencnkngncnlngncnmnh@ncnn"ndZ)ncnondncnpnh@(ncnqndncnrndncnsnencnxnencn‰ncnŠnh¿ðncn‹nencnŒngnc¹$h@b@(@(¹, nh@Yncngncnencnencngncnh@ncnh@ncnh@RÀncngnc nh@nc!ngnc"nh@"nc%ngnc7ncJnhncKnhncLnhncP€ ¹U¹M¹F¹.0 ¹7¹8¹9¹>­È¹3¹4¹5¹6¹:¹2¹*m@[Normal Text Frame]ųýÚ·4Í2¹ {{7w@ ÿÿ7v((>([@(#¹+ÔUnhncU$nhncndncnenh?ðncnfnh¿ðncngnencnhncninh¿ðncnjnencnkngncnlngncnmnh@ncnn"ndZ)ncnondncnpnh@(ncnqndncnrndncnsnencnxnencn‰ncnŠnh¿ðncn‹nencnŒngnc¹$h@b@(@(¹, nh@Yncngncnencnencngnc L €ÿÿÿÿ öV æŒnh@ncnh@ncnh@RÀncngnc nh@nc!ngnc"nh@"nc%ngnc7ncJnhncKnhncLnhncйU¹M¹F¹.4 ¹7¹8¹9¹>­È¹3¹4¹5¹6¹:¹2¹@¹$m @ [Normal Grid]ųýÚ·4Í2¹ {{7w@ ÿÿ7v((>([@(#¹+ÔUnhncU$nhncndncnenh?ðncnfnh¿ðncngnencnhncninh¿ðncnjnencnkngncnlngncnmnh@ncnn"ndZ)ncnondncnpnh@(ncnqndncnrndncnsnencnxnencn‰ncnŠnh¿ðncn‹nencnŒngnc¹$h@b@(@(¹, nh@Yncngncnencnencngncnh@ncnh@ncnh@RÀncngnc nh@nc!ngnc"nh@"nc%ngnc7ncJnhncKnhncLnhncÔ>Ç@Adobe Jenson Pro@Adobe Jenson Pro@Light @ AJensonPro-Lt@Adobe Jenson Pro Light@Light@Adobe Jenson Pro Light2@2OTF 1.013;PS 001.000;Core 1.0.27;makeotf.lib(1.11) @ Light Italic@AJensonPro-LtIt@Adobe Jenson Pro Light Italic @ Light Italic@Adobe Jenson Pro Light Italic2@2OTF 1.013;PS 001.000;Core 1.0.27;makeotf.lib(1.11)@Regular@AJensonPro-Regular@Adobe Jenson Pro@Regular@Adobe Jenson Pro2@2OTF 1.013;PS 001.000;Core 1.0.27;makeotf.lib(1.11)@Italic @ AJensonPro-It@Adobe Jenson Pro Italic@Italic@Adobe Jenson Pro Italic2@2OTF 1.013;PS 001.000;Core 1.0.27;makeotf.lib(1.11)@Semibold@AJensonPro-Semibold@Adobe Jenson Pro Semibold@Semibold@Adobe Jenson Pro Semibold2@2OTF 1.013;PS 001.000;Core 1.0.27;makeotf.lib(1.11)@Semibold Italic@AJensonPro-SemiboldIt @ Adobe Jenson Pro Semibold Italic@Semibold Italic @ Adobe Jenson Pro Semibold Italic2@2OTF 1.013;PS 001.000;Core 1.0.27;makeotf.lib(1.11)@Bold@AJensonPro-Bold@Adobe Jenson Pro Bold@Bold@Adobe Jenson Pro Bold2@2OTF 1.013;PS 001.000;Core 1.0.27;makeotf.lib(1.11) @ Bold Italic@AJensonPro-BoldIt@Adobe Jenson Pro Bold Italic @ Bold Italic@Adobe Jenson Pro Bold Italic2@2OTF 1.013;PS 001.000;Core 1.0.27;makeotf.lib(1.11)lÿÿÿÿ \Œ0l ”,?~>7 @ Myriad Pro @ Myriad Pro @Light Condensed@MyriadPro-LightCond@Myriad Pro Light Condensed@Light Condensed@Myriad Pro Light Condensed8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Light Condensed Italic@MyriadPro-LightCondIt!@!Myriad Pro Light Condensed Italic@Light Condensed Italic!@!Myriad Pro Light Condensed Italic8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565 @ Condensed@MyriadPro-Cond@Myriad Pro Condensed @ Condensed@Myriad Pro Condensed8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Condensed Italic@MyriadPro-CondIt@Myriad Pro Condensed Italic@Condensed Italic@Myriad Pro Condensed Italic8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Semibold Condensed@MyriadPro-SemiboldCond@Myriad Pro Semibold Condensed@Semibold Condensed@Myriad Pro Semibold Condensed8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Semibold Condensed Italic@MyriadPro-SemiboldCondIt$@$Myriad Pro Semibold Condensed Italic@Semibold Condensed Italic$@$Myriad Pro Semibold Condensed Italic8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Bold Condensed@MyriadPro-BoldCond@Myriad Pro Bold Condensed@Bold Condensed@Myriad Pro Bold Condensed8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Bold Condensed Italic@MyriadPro-BoldCondIt @ Myriad Pro Bold Condensed Italic@Bold Condensed Italic @ Myriad Pro Bold Condensed Italic8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Black Condensed@MyriadPro-BlackCond@Myriad Pro Black Condensed@Black Condensed@Myriad Pro Black Condensed8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Black Condensed Italic@MyriadPro-BlackCondIt!@!Myriad Pro Black Condensed Italic@Black Condensed Italic!@!Myriad Pro Black Condensed Italic8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Light@MyriadPro-Light@Myriad Pro Light@Light@Myriad Pro Light8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565 @ Light Italic@MyriadPro-LightIt@Myriad Pro Light Italic @ Light Italic@Myriad Pro Light Italic8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Regular@MyriadPro-Regular @ Myriad Pro@Regular @ Myriad Pro8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Italic @ MyriadPro-It@Myriad Pro Italic@Italic@Myriad Pro Italic8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Semibold@MyriadPro-Semibold@Myriad Pro Semibold@Semibold@Myriad Pro Semibold8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Semibold Italic@MyriadPro-SemiboldIt@Myriad Pro Semibold Italic@Semibold Italic@Myriad Pro Semibold Italic8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Bold@MyriadPro-Bold@Myriad Pro Bold@Bold@Myriad Pro Bold8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565 @ Bold Italic@MyriadPro-BoldIt@Myriad Pro Bold Italic @ Bold Italic@Myriad Pro Bold Italic8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565@Black@MyriadPro-Black@Myriad Pro Black@Black@Myriad Pro Black8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565 @ Black Italic@MyriadPro-BlackIt@Myriad Pro Black Italic @ Black Italic@Myriad Pro Black Italic8@8Version 2.006;PS 002.000;Core 1.0.38;makeotf.lib1.6.6565»?Ãd {{Œ>@DefaultTOCStyleNameb@ContentsXËI@[No composite font]uwxyz{dËJ@Kanjiv@R@Y@Y@YÿÿËã{{Ü>Ð@Kozuka Mincho Pro€\XZfg@ Proÿÿ@EL@KozMinPro-ExtraLight@Kozuka Mincho Pro EL@EL €\XZfg@ Pro EL6@6Version 1.014;PS 1.012;Core 1.0.35;makeotf.lib1.5.4492@L@KozMinPro-Light@Kozuka Mincho Pro L@L €\XZfg@ Pro L6@6Version 1.014;PS 1.012;Core 1.0.35;makeotf.lib1.5.4492@R@KozMinPro-Regular@Kozuka Mincho Pro R@R €\XZfg@ Pro R6@6Version 1.014;PS 1.012;Core 1.0.35;makeotf.lib1.5.4492@M@KozMinPro-Medium@Kozuka Mincho Pro M@M €\XZfg@ Pro M6@6Version 1.014;PS 1.012;Core 1.0.35;makeotf.lib1.5.4492@B@KozMinPro-Bold@Kozuka Mincho Pro B@B €\XZfg@ Pro B6@6Version 1.014;PS 1.012;Core 1.0.35;makeotf.lib1.5.4492@H@KozMinPro-Heavy@Kozuka Mincho Pro H@H €\XZfg@ Pro H6@6Version 1.014;PS 1.012;Core 1.0.35;makeotf.lib1.5.4492xË[@Kanav@R@Y@Y@Y0A0–0A00ž00¡0ú0¡0ü0þ0üËã{{äËÈ @ Punctuationv@R@Y@Y@Y          % & % 2 3 2"%"%"%0000000000000û0û0ûÿÿÿÿÿ ÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿ;ÿ;ÿ;ÿ=ÿ=ÿ=ÿ[ÿ[ÿ[ÿ]ÿ^ÿ]Ëã{{ Ëð@Symbolsv@R@Y@Y@YG¢£¢§¨§¬¬¬°±°´´´¶¶¶×××÷÷÷‘¡‘£©£±Á±ÃÉÃOQQQ    ! 0 0 0 ; ; ;!!!!+!+!+!!“!!Ò!Ò!Ò!Ô!Ô!Ô"""""""""" " " """""""""" " " "'","'"4"5"4"="="="R"R"R"`"a"`"f"g"f"j"k"j"‚"ƒ"‚"†"‡"†"¥"¥"¥###% %¡% %²%³%²%¼%½%¼%Æ%Ç%Æ%Ë%Ë%Ë%Î%Ï%Î%ï%ï%ï&&&&@&@&@&B&B&B&j&j&j&m&m&m&o&o&o0000000000›0œ0›ÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿ ÿ:ÿ ÿ<ÿ<ÿ<ÿ>ÿZÿ>ÿ\ÿ\ÿ\ÿàÿãÿàÿåÿåÿåËã{{8Ë @ Alphabetic=@Regular@Y@Y@Y" / :: ¡ ¤¦¤©«©­¯­²³²µµµ·Ö·ØöØøÿø111RSR`a`xxx}~}’’’ÆÇÆØÝØ          " " " 9 : 9 D D D ¬ ¬ ¬!"!"!"""""""""""H"H"H"d"e"d%Ê%Ê%ÊûûûËã{{l ËR@Numbers=@Regular@Y@Y@Y090Ëã{{˜ a&ŠŠ‹Œ$ î@(##.}~€‚ƒ„8 a †Êφ†|8 a ‡Êχ‡|8 a ˆÊψˆ|(a ‰‰|8a …ÊÏ…Ê$…|lÊWRÊX|¿1| 8b*¤|8b*}d0b$~ c8b+€þÿþÿþÿþÿ@ ,b  €ta'h|¿/°¿|¿Àc/¿ 8ÿÿÿÿ||¿¿ ÿÿÿÿ2ŒŒ$ ¿4ˆŒ$ Œ2¿¿ ÿÿÿÿ¿ 0Œÿÿÿÿ||c/¬ÿÿÿÿ <  Ø ¨ p 8 $  ¨ p H  Ø    œ dXtü ¼d °¬ ƒ¢z8aV)ŠŠ(¿/@Roott} < @U.S. Web Coated (SWOP) v2|l} ‘<@sRGB IEC61966-2.1|d} “<@Lab D50|Ä} ¸´´ADBEspacLab Lab ÏacspAPPLnoneöÖÓ,ADBEcprtÀ2descôbwtptXA2B0lHB2A0lHtextCopyright 1999 Adobe Systems IncorporateddescLab D50XYZ öÖÓ,mft1  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ”n @ [No Style]nh+UnhncU$nhncZ5*Z6@(ncndncnenh?ðncnfnh¿ðncngnencnhncninh¿ðncnjnencnkngncnlngncnmnh@ncnn"ndZ)ncnondncnpnh@(ncnqndncnrndncnsnencnxnencn‰ncnŠnh¿ðncn‹nencnŒngncnh@Yncngncnencnencngncnh@ncnh@ncnh@RÀncngnc nh@nc!ngnc"nh@"nc#nhnc$nh@Ync%ngnc7ncJnhncKnhncLnhnc ÿÿÿÿ h ¤@Ô`8ü  sÙp¸03@[No table style]¶gøÅ¶ ¶@¶ ¶?ð¶¶+¶F@¶,¶G@¶-¶H@¶.¶I@¶/¶0 ¶N¶1 ¶O¶e¶4¶U?ð¶5 ¶V ¶7¶_?ð¶8 ¶` ¶9 -¶= ¶b¶>¶c@Y¶@¶A¶E¶r?ð¶F¶s?ð¶G¶t?ð¶H¶u?ð¶I ¶v ¶J ¶w ¶K ¶x ¶L ¶y ¶M¶€Z)¶N¶Z)¶O¶‚Z)¶P¶ƒZ)¶S¶?ð¶T ¶‰ ¶U¶…Z)¶V¶Ž?ð¶W ¶Š ¶X¶†Z)¶Y¶?ð¶Z ¶‹ ¶[¶‡Z)¶\¶?ð¶] ¶Œ ¶^¶ˆZ)¶_¶‘Z)¶`¶’Z)¶b¶™@¶c¶šÀ¶n¶²@¶o¶³@‚À¶u¶¾¶v ¶¿¶w ¶À¶x¶Á¶{ ¶Ä ¶| ¶Å¶} ¶Æ¶~ ¶Ç¶ ¶È ¶€ ¶É¶ ¶Ê¶‚ ¶Ë¶ƒ ¶Ì¶„ ¶Í ¶… ¶Î ¶† ¶Ï¶‡ ¶Ð¶ˆ¶ÑZ)¶‰¶ÒZ)¶Š ¶Ó ¶‹ ¶Ô ¶Œ ¶Õ¶ ¶Ö¶Ž¶×Z)¶¶ØZ)¶¶Ù?ð¶‘¶Ú?ж’¶Û?ð¶“¶Ü?ж• ¶Þ¶– ¶ß¶— ¶à¶˜ ¶á¶Ÿ ¶ð¶¡ ¶ò¶¨@Y¶©@Y¶ª @Y¶« @Y¶¬ @Y¶­ @Y¶® @Y¶¯@Y¶°@4¶±@Y¶²@4¶³@Y¶´@Y¶µ@Y¶¶@Y¶·@Y¶¸@Y¶¹@Y¶º ¶» ¶¼ ¶½ ¶¾ ¶¿  ¶À !¶Á "¶Â #¶Ã $¶Ä %¶Å &¶Æ '¶Ç (¶È )¶É *¶Ê +¶Ë ,¶Ì ¶S¶Í830?ð¶Î830?ð¶Ò9¶Ó ¶Õ ¶Ö ¶× ¶Ø??ð¶Ù=Z)¶Ú > ¶Û@@Y¶Ü A¶Þ E¶ß¶^¶à¶^¶á M¶â ¶=¶ã ¶=¶ä ¶=¶å ¶=¶ù ¶¸¶ú ¶¸¶û ¶¸¶ü ¶¸  ‘ ’ “ ” —˜@Y™@Yš@Y›@Yœ@YŸ@Y @Y¡@Y¢@Y£@Y¤@Y¥@Y¦@Y§@Y¨@Y ©! ª" «# ¬$ ­' °( ±) ²* ³+ ´, µ- ¶. ·/ ¸0 ¹1 º2 »3 ¼4 ½5 ¾8 Á9 Â: Ã; Ä< Å= Æ> Ç? È@ ÉA ÊL w&ê²½ } €t€p€pADBEprtrCMYKLab Ð)5acspAPPLADBEöÖÓ-ADBE descütcprtp+wtptœA2B0°¢A2B2°¢A2B1£¸¢B2A0EÀ8´B2A1~t8´B2A2·(8´gamtïÜ‘descU.S. Web Coated (SWOP) v2textCopyright 2000 Adobe Systems, Inc.XYZ µZ¼g’0mft2 $ÚiÙ 6 … Ç ÿ1^‹·â 2Wy˜µÒï%Y ‡!²"Ú#ÿ%#&D'f(†)§*Ç+è-.(/H0i1‰2¦3Â4Þ5û7859Q:m;‰<¥=Â>Þ?øAB)CBD\EuFG©HÃIÝJ÷LM,NCOYPoQ†RœS²TÉUßVöX Y#Z:[Q\f]x^Š_›`­a¾bÏcàdñfgh#i3jBkRl^mgnqozpƒqŒr”sœt£uªv±w·x½yÃzÈ{Í|Î}Í~ÌË€Éǂф¿…»†·‡³ˆ®‰©Š¤‹žŒ˜‘ކ{p‘d’X“L”@•3–&—˜ ˜ÿ™òšä›ÖœÈ»ž­ŸŸ Ž¡|¢j£W¤E¥3¦ §§ü¨ê©×ªÅ«³¬¡­®}¯k°Y±G²6³$´µµí¶Ú·È¸µ¹£º»~¼k½Y¾G¿5À"ÁÁþÂìÃÚÄÇŵƣǑÈ~ÉlÊYËDÌ.ÍÎÎëÏÕоѧÒÓyÔaÕIÖ1×ØØæÙÍÚ²Û˜Ü}ÝbÞGß,ààôáØâ»ãžä{åWæ3ççèèÁéšêqëHììðíÃî–ïvðUñ3òòêóÃôœõsöI÷÷óøÆù•úaû)ûëü§ý\þ þ´ÿZÿÿè§,„¿ç     üóæØÌÖÞááßÛÖ Ñ!Ë"Ä#¾$¸%³&®'ª(¦)¢* +ž,-š.•/‘01‰2†3ƒ45678€9‚:;~<|=|>|?}@A‚B…C‰DE’F˜GšH›IJŸK£L¦MªN¯O´PºQÀRÇSÎTÕU×VÙWÛXÞYàZã[ç\ê]í^ñ_õ`øaücdeeÿfügúhøiõjókðlîmënèoåpáqÞrÚsÖtÍuÃv¹w¯x¥y›z{…|z}o~dX€MA‚5ƒ)„……þ†í‡ÛˆÊ‰¸Š¦‹•ŒƒqŽ`N=‘,’“ “ú”é•Ù–É—º˜§™“š€›mœZHž6Ÿ% ¡¡õ¢æ£Ø¤Ê¥½¦±§¦¨›©‘ª‡«¬w­o®g¯`°Z±T²O³L´IµF¶E·D¸E¹FºH»J¼N½R¾W¿]ÀcÁjÂrÃ{ĄŊÆÇ–Èɥʭ˶̿ÍÈÎÒÏÜÐæÑñÒûÔÕÖ×*Ø7ÙDÚQÛ^ÜkÝyކߔàœá¢â¨ã­ä²å¶æºç½èÀéÃêÔëåìõîïð ñ,ò8óCôNõYöc÷jønùoúlûdüVýDþ/ÿÿÿØhÆ 2 R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$ù%î&ã'Ø(Ì)Á*¶+«,Ÿ-“.‡/|0p1d2Y3M4A566+7!89 ::ö;í<ã=Û>Ó?Ë@ÄA½B·C²D¬E¦F¡GœH—I”JKŽL‹MŠN‰OˆPˆQ‰RˆSˆTˆUˆV‰WŠX‹YZ[‘\“]–^˜_›`aŸb c¡d£e¤f¦g§h¨i©jªkªl«m«n«o«p©q¨r¥s£t uv™w•x‘yŒz‡{‚||}v~oi€aZ‚QƒH„>…5†+‡!ˆ‰ ŠŠ÷‹íŒâØŽÍù‘¯’¥“œ”’•‰–€—x˜p™jšc›^œYUžRŸP O¡O¢P£R¤U¥Y¦_§f¨n©xª‚«Ž¬œ­«®»¯Ì°ß±ó³ ´ µ8¶Q·l¸‡¹¤ºÂ»á½¾!¿CÀeÁ‡ÂªÃÎÄñÆÇ9È^ɂʦËÊÌíÎÏ2ÐTÑtÒ”Ó²ÔÏÕëרÙ6ÚLÛaÜt݇ޘߧà³á¾âÇãÍäÑåÒæÐçÌèÄéºê¬ë›ì‡íoîXï\ð[ñVòLó=ô*õõööÖ÷³øùbú/úôû±üfýý³þMþáÿqÿÿÙ T– ¡ ¤ Ÿ “ ‚p_L7! ðÖ»Ÿƒ}tfUA, ê!Ó"½#¦$%z&d'N(9)%**ý+ê,×-Ä.±/ž0Œ1y2g3U4D526"788ñ9â:Ó;Ä<µ=¦>˜?Š@}AoBbCUDIE~% ô€Û‚¨ƒ„r…W†;‡ ˆˆê‰Ïг‹˜Œ}bŽG-ø‘Þ’Ä“ª”‘•x–`—G˜/™ššê›Ôœ¿ªž–Ÿƒ q¡_¢O£?¤0¥"¦§§ý¨ó©êªâ«Û¬Õ­Ð®Ë¯Ç°Ä±Â²Á³Á´ÂµÅ¶È·Í¸Ó¹Ûºã»í¼ø¾¿À Á0Â@ÃRÄfÅzÆÇ¦È¾ÉÖÊñÌ Í*ÎGÏcЀџҿÓàÕÖ'×LØsÙ›ÚÄÛïÝÞFßsà¡áÏãäM噿çè6é†êØì+í€î×ð1ñòïôMõª÷øZù«úöü:ý{þ»ÿÿÿ€€å´ÍTÌ?¥~òŒ”~i˜ž~L}ãÁ~cbAþ~’Da€dþ€ü¸~t‹yä~W‰²ÊÛ~Oˆ±>~\†´—/~‚…›|“~¾„º`éƒôC–ƒx¢€äƒßú£}%—âH}”1ÉX}%‘z¯Î}K•Ö}† {N}׋<_´~7‰‰AË~Àˆ-ψø¿|¢°à‚|žÉDz|+›®E|[—£”s|«”¦z} ‘æ^•}wO@¶}ÿ-Œ~Ä‹É÷ {G®uÞÚ{D©zÆ{]¤Ä¬Ò{– f“{êœZxÚ|[˜»]ˆ|Ï•M?¹}R’‹<}ÆŽðõ…zªº]ÝYzŸ´Hħz³®‹«|zð©=‘â{L¤Nw²{ÀŸº\‹|=›>Ó|¼˜v|ÛIô8z/ÆrÜ z¿;Ãbz'¸sªMzd²6ßzɬqvÒ{D§[®{À¢0> |;Ÿ| óyÑÒÈÚñy´ÊaÂIy¸Â©?yð»açzY´ÎvzÝ®Æ[{^©‡=c{ФÓI{Rò*yŒß„ÙýyfÕÓÁUy`Ìî¨Vy”Äâyþ½’uKz†·Zi{ ±Ü<Ú{z©%žzÈŽíí‰~+Ö~ˆ}±¾Í‡}W¦µ†0}3Ž…„}HtЄü}ŒZk„›}è=Ž„Ÿ~‹‹†z€ëɇ®‰Õ†£‡}½…¹†!¥~„ø…ŒÐ„d„*s}ƒôƒˆYƒ¨ƒ<9ƒ¸‚àù…w„éû†p“øÓS…w‘u¼„œ¤ƒõ‹‰ƒu‹VrUƒ‰ÕWÿ‚؈|;,‚뇔ˆ„{‡¨èR…sžøÑ²„ƒ›ºƒ²˜;¢¡ƒ•:Š8‚ ’¡q)‚PCV÷‚Ž:4‚.Œ–8ƒ‰ŠÉæÈ„ªªÐ2ƒ»¥­¹‚ñ¡‚¡?‚U¤ˆîãšp £–çVu“ÿ9S†’ ‚šŒçåc„ µbÎÖƒ°·µ‚Rªê ¹¦.‡ÕN¡Æný ¼U€ãš38‰€ó˜8¼ŒAä/ƒ‹ÀÚͬ‚œº‚¶’δzžô6®ß†è€Ó©°n1€“¤íT\€e Ø7Ý€tžXT‹·ã)ƒ$̯̕‚6Å;µ˜e¾Cž€Ê·Ë† €i±Ýmw€3¬SÆ€¨V7M€ £\®€l‹GâN‚ÐØ»ËÚæÐN´ÄÈa5€tÁ…N€ºzlÕß´ÍS<º°H6Ѽ¥*ôŠîÝ<’a|˜Çkz|C±V޲|šÇ|ƒ—‹·|IkžŠ‚|±Ru‰ˆ}26މ'~2‹ÖÞÛF‘-†ËÆB…„°*ƒ„o™²‹üƒ‚ƒŠ­‚òjŒ‰‚ˆQ^ˆ£‚@5zˆI‚`Š˜ƒ†Ù³‘$ÄŽ"Ží®ýŒcŒß˜€Šñ‹&U‰³‰²ijˆ¦ˆ|PJ‡Ë‡v4v‡y‡ú‰V†»ØG›’Ã.2˜{­‹†•——Š’ý€ˆè¾hS‡æŽ¼O[‡Œÿ3†ÂŒˆ(‰„ÖéŽJ¦ÁÑŒx¢&¬$ŠÔžs•Ò‰h› ~æˆ2—êgK‡>•-N}†o’Ì2Ù†‘Á N‡%ˆÿÕ§±°ÇÀ›‹â¬ªöŠ>§w”´ˆÖ£A}⇤Ÿ\fX†§›ÚMµ…ݘù2,…Š—ò ¨†KˆÔ3»¥¿’‹g¶©ò‰Â°¦“¾ˆ[«¤} ‡0§ež†6¢çM …_Ÿ¯1… ? …—ˆ1Ó£ŒËÆÇ¾³‹ÀI©‰^º’ç‡ô´I|B†Ì¯dö…ܪwL‡…§e1$„¢¡: ®…‡æÒàŒrc8"ÒW½ûаÊñ¨]‰ Ãá’1‡£½S{†z·|di…‹²ÇL „½®g0·„\ ð U„އ©Ìû›ò{[¸“™G{!£ö–¸{ ŽÞ”`{&y’E{xbie{ùJrŽÚ|“/cŽ5}~ ~ÀË:šâ„ý·f˜#ƒç£•™‚üú“M‚Kx+‘CØa|ušI~÷.yWã ÏŽ›ƒÉәߎ­¶—%ŒÂ¡å”˜ŠøŒá’[‰‰w!^ˆT`ƒŽž‡^H˜*† -§ŒŒ† 5G…èȨ˜ç˜Ž´ã–=•Π§“½“4‹»‘rív†Žÿ_ÒRG±Œf‹û,ދ̋ͯŒ…ßÇ|˜,¢†³Æ•„žúŸ{“ ›¬Š„Ò˜ªtìŽÙ•ô^1“ Fî‹Å‘Ä,;‹'‘¾<‹!…‘Æ_—›¬¥²²”õ¨Yžl’~¤J‰„J tŽS#]¸Œš'FA‹4—÷+®Š”—;ÛŠL…PÅf—&¶ì±É”€±Þ‰’­ˆªÕ¨šs@å¤]Œ0¡E±Š´žÓ+:Š›È‹‰›…Ä’–ÃÁx±”»¥œÉ‘§¶‡îr°îr…¬U\}‹Ú¨™E>Š\¦A*Ù‰¨œùJ‰ „îÃâ–nÌy°g“ÊÅØœ(‘V¿…‡N#¹³qþ6´ª\‹±DÕŠ¬B*|‰iœºˆ™„˽?¥Ðzzª¢hzM–ÑŸzEƒœzrn™8zÔY,–²{dBS”¢| 'ó“ó|ýª“¦»³¤âƒ”©*¡Z‚œ–ž Ђ`šý>mÛ˜:€ëXc•€ÎA‚“¼€Û'4“ uh’‚šºˆ£ëŒÂ¨ h‹•$‰nkšˆ)lñ—]‡'WŠ”ï†f@¼’î…è&Ž’8†[/´‚Ô¹|£•õ¦ýŸ£“z“ÿœY‘9€_™N3kõ–‘V­”4Œ1@’4‹9%ù‘w‹Ùý’‚²¸–¢UŸh¦ žéœ3’þ›ª™?V˜¦–‹k•Ø”.UÙ“|’??R‘~ì%n¿‘VÓŽ™‚–·£¡È©¥5žU¥’.›¡k~‚˜žj9•V›"U"’똬>Ãì—?%'– ¯È‚}¶Ë¡W²½¤mᮑlš©Æ}Ê— ¥Ñi–”ë¢RT–’€Ÿƒ>OlžT$¬ ˜Ì‘‚i¶ þ¼¶£Æ‚·aÊš=²\},—?­Ìi”Ž©àT’-§ =ï¤Ã$e0˜›yŒ‚Yµq ¯Ç,£<-ÁA™ê»_|¥–ð¶?hˆ”@²S³‘à¯G=›Ò©¨$Žô˜leŒ‚L®¯þyäœ)«Þy¶Š§Þy²wФyædG ˜zPOùszæ:šö{ )š˜|q•Óʬί(‚ƒ›hªä™‰~¦Ú€àvû£€cc¨Ÿ›€&OSœ€#9tš€L¡™–”Ž€«ß®=‹.šŠ©þ‰ˆ½¥íˆv1¢0†ûbäž¼† NŸ›¦…Ž8Õ™,…K.˜«†F“p€«­j“癪©7‘š‡Ì¥0„uP¡h½büŒQMèšè‹88A˜jŠ¢ʗ׋³’x€ªA¬Êœ´˜Ú¨˜™Â†ó¤”—tu Ï”ÀaMK’°MBš=‘(7¿—¸ku—a ‘’€©¬,¥Ì˜/§ü¢1†H£ùžâsÊ 5›ï`ªœ²™\L¯™—k7M— –å(–_”XÄ€¨â«¹¯—¢§}ª¸…£r¦Ãs@Ÿ¬£C`)œ6 OLA™ž;6ö–€}ó•È”@(€¨B«a¸t—§³{…C£ ®çrÈŸHªä_»›Ö§©Ká˜Å¥ã6°–#¢ëÌ•O”&3€"§¹«Â^–¦¦Ä¼«„Ö¢¶·qrbžö²ú_c›†¯ºKœ˜u­6{•ݤÖ§• ” < €(Ÿ°º„ytŽÕµ«y:}Ѱüy2ld¬‹ygZ8¨dyÔF冷zj1ë¡æ{ð¢r{¾‘(€ž¦¹¶¤ŽB´Â€½}b°€ k󫌞Y¸§drFl£®ƒ1l ÞÁ°¡;€ºn€÷¸Ë‰Õš³ÞˆI|ϯ†îkUª£…íY¦z…4Eá¢Æ„Ì0úŸì„Ä †Ë€h·ó’Œø³ç|®Rûjª©ÎŒcX}¥«‹-EY¡öŠW0•ŸŠ,\Ÿа>€œÕ·FšiŒb²a—¦{{­¦•4j©$“Wí¤ð‘]Dá¡?50>žR*>ž6ޏŽÄ€œ;¶¿¢î‹Ù±ÑŸ’zú­œi‹¨™øWy¤Z—ÖD} ’–p/øž–¤'g¨Ž^€›È¶6« ‹p±D§¥z˜¬‚¤i/¨¡W%£Ôž—D9 I/Äœðœ'œ¨›Ž €›Jµ×´Œ‹"°Ô¯ÛzW¬««hé§y¨1VߣK¥°CüŸ•¤ž/œœ† 1œ›Å€šÙµ†½ëŠË°t¸ƒz«¡³¶h¬§¯ãV²¢ï­ Cߟ8ª§/‘œ/ )›¶¢Ž€‘óÅcy‚¿ÒxËrº|x¹a£µixêPq°§yS> ¬syä)¦©–zjf«Y{ C€‘7Ä‹€æ¶¾óøq¹JaJ´m~âP ¯ž~Ä=­«_~å)]¨f2…©Ã€DŒþ€ÍÃ’ˆ¨G¾‡'q^¸ž…Ü`Û³u„óO¡®Ÿ„Y=RªZ„)#§J„N¯¨O„îŒÁ€Â©k€è½#Ž_pé·¼Œ•`k²†‹&O:­²Š%=©j‰“(ö¦H‰ãÚ§‰ŒŒ€,Áè˜O€”¼[•µp’¶ð“t` ±»‘•Nè¬Ö&<è’i(×¥c¥áŠÔŒ^€ÇÁP b€B»µ7pM¶@šs_ϱ ˜,N®¬&–q<•§Ð•²(¤–•¼+¤ãŠîŒ8€fÀÕ¨”ü»*¤Ðpµª¡‡_¢°ožßN‰«“<}§:œ¬(¸£àšnN¤‹Œ€&ÀQ°õ̺¡¬“oöµ¨Ë_¯ã¥ØNw« ¤—}g€Ôu~_€Ûîjx&t×hx¬ŽQ¿×y7ŒQ§’yÌŠŸŽ¼zi‰%u7{‡ÕZ‘{º†•=v|k…‰ö|ï…ì˜vøœÕŸw…˜Ó¾ x•Ѧx¼“ Ryo¦sõz'ŽkYuzÛŒM¯1—<}ª €#}¥oha}?¡'O|}gŒ3¸}™›f Ø}É\Ø}…ÅYÂë}¿¬ò|ȸזP|™²ãD| ­mg|˨•NÚ|÷¤Ù3,} X S}(‰×d}5ÑÂ<|ÐÉç¬0|nÂÆ•‚|4»÷~„|8µÍf÷|e°—NT|—¬–2º|·¢L è|­ˆºÑÁQv’½µ‹ëw©5Å\…Š©w~“~‰Žx }1ˆ—x²f‡ÅyzMž‡(zI28‡%{1 Ö‰$|yÐ<‹ñ€Ç¼|Š™€>§Ú‰cÎ’hˆU~|‡nWdû†®QL”†\15†˜ 쇋€ZÎ⊩‹»!‰_‰œ¦¬ˆ+ˆ7‘/‡0‡ zò†X†câ…©…FK…&„–0D…!„D †$ƒÂÍ~‰•u¹±ˆI“¥&‡%Ú͆.ŽÏy±…l bDŽ̋vJœ„QŠ/n„F‰Y k„솷Ì&ˆ°ŸÚ¸W‡lœ«£Î†N™žŽ…]–Âx„„˜”a„‘ÑIÀƒ“Ð.¯ƒ~Žñ ҃ᆤÊöˆªh·/†½¦j¢ª…ž¢ˆh„°žÚw‚ƒï›o`ÓƒX˜^Hû‚ê•ã.‚Е Qƒ†LÉù‡rµ¶7†1°N¡±…«—Œu„ §v§ƒf¢÷`‚ÒŸGHU‚Xœu-{‚8šIæ‚F†É,‡¿ÿµm…źg ß„Ÿ´Þ‹¡ƒ©¯’uÞ‚ïªÂ_g‚f¦¤GÇí£ù-ºžp®…ÉÈ‘†®Ë=´Í…tÄØ /„I¾zŠêƒK¸hu5‚޳^Õ‚®µGJ“ªÖ,—^ž&J5…›Â–½u„¯Y”Šv œ ’ƒv—‡ð®w6røwó]”xËE¹Œry¦+ŒNzŒ©Œÿ|œÀ¼•},®S“P~Ë›‘S~~‡ˆ~Sr í~O\Œˆ~mD΋o~™*'‹C~ú,‹l€¿Ž”WˆØ­’4‡™û6†u…äŽx…‰pÿŒê„Æ[(‹’„/CñŠƒº)cŠMƒ¹¾Š ƒ&¾o“A’§«ä‘(™˜¹7Ž¡„ÈpŒãoë‹ô‹fZ0ЍŠC‰ž‰(ª‰eˆç_ˆ×ƒ¡½G’gœ…ªÏN™²—™Ža—ƒ•Œª”…nÙ‹(’AY@‰ëRBSˆäŽÇ(ˆ ŽÊ ‡Ðƒj¼<‘¿¦†©Å©¢ø–¼Ÿ‡‚—ŒœJmðŠ‡™QXm‰@–»A§ˆ<”ß'|‡ð”;Ȇóƒ<»[‘9°§¨é%¬_•´5¨,À‹~¤4m,Š ˜Wƈ½ƒA‡©›•' ‡U˜¾†<ƒº¤Ï»¨6޽¶”ùŒÊ±‹¬^ly‰”¨0W(ˆW¤×@‡@¢Ü&ª†Öš$`…¦‚öº|ź§§ŽmÀ”[ŒxºR€`ж´òkâ‰7°NV§‡û­@-†ì¨Ä&H†™â;…/‚ݲàztáHˆuN<šÇuâ|h˜=vŒh±•éwSSè“Úx2=¡’Ey #g’IyÔJY|º±°Ÿ`}æ }œk}˜Ž|™¬}c{ª—$}Qgì”Ø}fS$’Ò}<Û‘@}á"¹‘3~T,ŽÌݰ»žF‡Ÿy›\…ô˜›„ùz¶– „3g“݃œRP‘áƒ1<S‚î"5ƒ;o€¹¯¼S1žhšmŽ`Œn—´Œ¶y·•0‹3f’ú‰úQ~‘ˆó;nxˆ9!•Jˆ³úŒ@€©®Õœp™Šv™“—‹r–â”§x³”e’se1’‚P¶3Žî:ÊŽ§Ü!ŽmŽ/æ‹=€œ­ó›Ì£œ¬˜îŸÑŠ©–8œ¾wà“¼™ådc‘}—WOÿŠ•=:8þ” ©·’àÖŠc€‘­2›M¬ ›ì˜o¨Á‰è•·¤þw%“:¡~cºÿžfOn ›ñ9Âj› U•Üȉ®€‡¬šë¶j›P˜ ±ã‰H•Q­uv…’ΩVc “¥ËN控£J9Y¡[ Œ•«½‰€€¬šœÀšÓ—¾»oˆ¾•¶Vu÷’x±¢bŸ9­ÍNzŽL«]8üŒ®¦e¾Œ>•v´ˆ¥€z¤ ª‘t9“Ÿ¦ìt¼‚±£|uOq Euü^sJvÅJ¼š¨w¢5W˜¾xk@™kx잣0©–|ã“ ¥ç|›‚$¢p|spvŸ4|p]Úœ9|—J"™›|Þ4¿—­}-И5}˜Œl€¢s¨Š…ˆ’?¤ä„…l¡fƒ¤o²ž1‚þ]›<‚ˆIy˜£‚D4,–²‚+m—‚Æ‹`€¡°§•Ž/‘c£öŒƒ€} €ŠþnÛD‰²\UšYˆ«H˗Ňá3¡•чx–ˆ8Šw€ ã¦Ô–æ—£5”š©ŸÂ’nœˆŸ[œ™‰ŽöH,–ý¿3&•/È•-Œí‰¯€ :¦"ŸÞí¢‰œó~üŸš5mV›Ú—¶Zø˜Ú•†G –9“å2»”;“‰„”VꉀŸ¥¡¨òg¢¥g~wžŠ¢lÈ›FžóZn˜Nœ[G*•²š“2b“šP“¢‘ˆ|€Ÿ¥C²4Žæ¡¤®}ôž#ªlHšÚ¦zYõ—ࣔF¾•L¢2“.Ÿt&“‘ˆ €žª¤ù»ÞŽ}¡T·!}„в‹kךƒ®zY—†«ƒFl”ï©B1Î’Ø¡¬÷’µá‡°€•ñµsĆ}°¸t7v¬¢tÂeï¨ÅulTg¥+v1A¢¢w,ðŸøw¬n¢w¬‰~€•U´"|†¯Å{´v4«ž{eާ²{–Sû¤{ÈA8 é|,žÉ|iT |¯ˆÄ€”Õ³„,…Œ®Ãƒ4u°ª“‚edü¦©ØSo£@½Ÿà[,/´g?Ÿ?‚ ˆ!€”N²ŒS„ì­ÏŠÂtû©¤‰`dY¥±ˆ?RÖ¢‡h@=žò†Ø+Òœº†Á+ž†Ê‡“€“»±S”’„T­’ptY¨Üˆc²¤éŽßRJ¡@„?ÈžŒ¡+›ÛŒ¨œîŠâ‡€“*°·œùƒË¬fšKsÔ¨8—Õc/¤A•­QΠ”“å?fY’Ã+@› “›òŒ6†³€’¾°%¥…ƒ`«Õ¢Ksh§¥ŸJbÆ£­œ§Qn šŽ?œ¿™z+šF˜” › Œ2†^€’S¯Å®Eƒ«lªxs&§,¦ãbx££ÉQŸm¡>Μ= º*ڙʜùš]Œ1†€‘û¯z·l‚Ê«³rզЮñb*¢¿«|PÜŸ ©s>ž›Ô¦Í*¼™dœå™æŒ0… v¿åsQyáºõs­jÙ¶Ct+['±ÊtÌJŠ­žu‡8“ªvF$R¨+v· Xªw† €ˆ¿{.y¹ºzÔj®µ¼ ’`x¥·bi„²AަYÀ­ž3I?©NŒ7¥¬‹–#×£VŒ> J£¹‡¢„ñ€†ß»bšSxP¶g—Öi5±ˆ•œYu¬ß“½Hù¨Œ’U7]¤Ó‘Æ#âk‘è t¢”‡¿„€†‡ºÞ¢_x µÚŸdhõ°ïœ®Y9¬>škH§ì˜Û79¤,˜ª#º¡˜–£ œ¡”‡Ù„š€†Mºbª•wÕµZ§hưk£öY«³¡eHš§^Ÿå7£¦Ÿ #ª ü˜ À ´‡ò„{€† º³>wÀ´ø¯9h·¯ó«ƒXõ«#¨¨Hˆ¦½§97¢ý¤# `˜- ñ ˆ„a€{nË1rým™Å¶s7_XÀsšPs»‚t'@ž¶ßtË/E³!ud±øuko°Mw‰ƒ$€{hÊ@zˆm«ÄÂz_^¿kyÙPpºIyÚ@™µ‡z /R±¨zVG°1z_ ®/|Fƒ"€{rÉÙm—Þ€Ø_G¾=€PN¹  @}´:m/P°Gw}®’«—¬I€uƒ!€{pÇè‰m}Âs‡ž_½†gP%·Ô……@^³…/J¯„ß­­…„ª›ƒnƒ€{[ÆìemeÁpŽ€^þ¼ŒèP¶Â‹¥@O±ßŠÏ/P­ÜЬ߫Ћ0©$ƒ¹ƒ€{9Æ%—ämTÀš•^÷»“ŽPµÕ‘ö@O°îì/a¬Ò‘ª¦ ä§áƒûƒ€{Å„ŸumG¿êœ³^÷º`šGP µ ˜f@[°%—]/y¬—yK©£“!;¦Î„7ƒ€zöŧ0m?¿[£ý^ü¹Á¡,P´aŸ@g¯užY/«VœÓx¨à“@‡¥ë„jƒ€zÜį>m>¾á«“_ ¹8¨[P*³Ì¦3@…®×¤Î/¹ª° E³¨1“gÈ¥F„–ƒ€ævpsÐwKsñ¹€xtÌ¢*xêu¯Š$y²v¡qczw£W†{OxŸ;/|1y–}!yèät‡~hÎku‰~·úv|}å Ëwe}ʈÝxK}Íp.y3}äV[z}ù:zï~ {T}Áâ1rð‰ÒÌštˆd¶_u ‡ŸFv …ý‡~w…nóx„BU>xöƒy8ùyÄ‚ÄÄyÕ‚ àiq“•8ÊÍr®’¿´œsÀl±tÑŽL†uæŒvm²vöŠÂT*wò‰!7þx²‡·”x‹…ìÞÉpu É2q’/³r«™çœ+sÅ–Õ„®t哸l|v‘iS#w Žú7w»Œþwq‰?Ýlo˜¬ ÇÙp´§º±ªqË£šÛrèŸzƒwt›´kXu5˜3R.vA•6Bvá’Å´v„‹KÜNnë·ŒÆÁp²[°‹q­1™¾r0¨<‚rs]£šjrtŠŸLQZu”›u5v%™%þu¿ŠÐÛonmÃÅåo½¯£pˆ·˜Ëq›±#…rÉ«¬i¤sý¦¶P¯u ¢{4ôu…žµjuŠlÚËnÎÆÅDo)Çä®ëp!Àó—ÿq'º6€»rO³ühësƒ®}P tŽªI4ctý£(ôtŸŠÖq¶ÁårʬôsÏ—5tÑ€uVuÝhîˆvöP1Ïx4š€YyXòy<ÔŒ}Q|À²}s|z«Î}—||•þ}À|7‘LS}ó|¹gÓ~7|÷O~}43}rA€H}ƒÓ{Ò‡P¿|†BªA|3…D”|q„o}þ|»ƒ½f¢}ƒ&N }v‚˜2“}í‚% L~ÒƒÑnz†’½ez¼¨¡z÷Ž0“ {@Œi|ª{¡ŠÝex| ‰rM |vˆ!1­|Þ‡ x}„üÏóyrœé»ïyªš §-yí—A‘¤z?”˜{fz¥’d[{"çL{“á0Ü{êŒ Â|w‡óγx›§Òº³xÔ¤¥òy qryjœæzJyÖ™‘cVzS–„K>zÌ“æ0!{’‚ ){‡‹Í®wñ²Ó¹°x*®N¤êxe©¿lx¹¥TyZy,¡4b…y®qJ„z!šK/ƒz\˜r ªzˇ6Ìäws½ñ¸ãwª¸ ¤wܳ5Ž‹x'­ëxx›© aÄy'¤·Iåyœ¡k.üyÁN Bz-†ðÌUwÉ>¸JwQÃ#£_ww¼àËwµ¶ÂwÈx$±/a x°¬{ITy'¨ò.}yAŸo ðy¯†¸Æ~ˆpгü‡3q¾ ’†rrÚŒ…Ñsîv·…Gu `\„Üv5H´„žwU-Å„ôxR܆Oy`ÅF†€z¸²ê…»zêŸs… {‹„u{Wuªƒù{§_[ƒœ| Gºƒh|i,؃²|À/„ª}uÄ…„ù±¨„\„1ž_ƒ³ƒr‰Ùƒ,‚Òt‡‚º‚T^Q‚kóFÇ‚DŸ+û‚…n˜ƒ9 ­ƒÇ*°1ƒœÉ‚|‹÷ˆq‚Š|sB¨‰6]5kˆEÕJ‡+,x†~ø„(ÁT‚½™a®Ø‚ –ý›uz”‡)’Qr€°-\5€„ŽTE€hŒ¼*x€„Œ £€æ„}À0í£¾­¸@ –šW€«d†€8šEqç—Z[Q¶”ÂDD¡’´)×°’Dþ„=¿DI®7¬Ë€ŸªN™d€¦K… Ž¢[p=Dž¸Z’›‚C¦~ö™")Q~ø—Bö?„¾€Î¸Ú¬€&´2˜™„¯`„NªŸos~·¦NYØ~•¢©C ~w p(ß~^›‚¶~£ƒÜ¾€xÃÁ«‚Ó¾c—ì$¸Áƒ“~“³5nÆ~@®IYE~ ªsB“~§0(y}æ›^ƒ~&ƒº·\‘Wo±¦5žpí”!Žr€ôŒÉs.lË‹˜tTW“Š•u†@ï‰àv¤&Š;w*Š$y½¶XáyS¥CŽGyž“ŒÔyéù‹‡z?kÖŠ_z©Vª‰f{$@ ˆµ{˜%²ˆú{ôÛˆ„}iµIŽ‹‚ê¤ ‚]’‹’Ó~׊Sij̉7U»ˆJ€ã?6‡ž€º$ú‡Î€¸•‡€¢´,MŒ•¢Ô‹Ë‹>¶Šj‰è}¹‰*ˆ´i½ˆ‡¬T·>†Ç>k†˜† $P†¶…æY…Ù–³ŒK–I¡ÂŠË”8œ‰o’-|‹ˆ:7h°‡1ŽkS߆aŒå=¥…½‹¯#³…Ä‹¹%„Ês²‹…  ¾Š YŽ˜ˆ¬š{’‡y—Úgʆq•[S…˜“1<þ„÷‘®#,„ì‘!ùƒåV±5ŠéªŸë‰q¦–Àˆ£ z¼†ÙŸg…Õœ{Rj„ý™Ô"À„0•Õƒ'=°’Šr´'Ÿ@ˆþ° ‡–«¾z†V§—fQ…P£áQÆ„ƒ ô;ðƒÎŸ_"aƒ”—?¸‚)° о‹ž¼ˆª¹ÂŒn‡;´Æy]…ï¯îe¹„â«ÀQD„¨æ;ƒd¥1!ÿƒ"–ü ‚¨›šéo˜Ž˜spA‡¥–„€ƒ(€—~ |݈C|BxGš¡½gt—÷ŒXUÑ•‹Bü“{Š5.l’ ‰ÑÊ“‰@‚l€–ן°™«‡—œ¹—zw—™ß•WfÉ—/“SU/”·‘B{’›@. ‘'’’F΀–FŸ¢‡œ(ŸÏw™D f9–ŠštT”˜AAÿ‘ü–É-´m–…a‘8ÈK€•Ξ±«—†›½¨Nv’˜Ò¤ùe¶–¡×T“•ŸQA‡‘‚ž-Xé›à9„¬€à€•užb´ð†;›k±)v"˜x­FeA•ª©®S´“*§A/‘¥:-}žv ‡€‹€Œœ¯4n~W«{oo]¨p/_y¤ÀqKNŒ¡»rh‰°SU©7ˆ­Ct¥†‡ð21¢“‡ž¡4ˆ+ñŸú„±€€}ð´þ”pO°­’@b¬q—S¨b&C%¤ªŽ1þ¡µ #à!ž£„Ò€€}Ÿ´i›æp °™¶aƫɗ™R¾§¯•ÄBâ£ö”‚1Ò Þ”z~Ÿ.’§Nx„ñ€€}j³é£åoØ¯Ž¡Pa«=žÍR†§œ©B¬£\›p1œ Jšâfž|”yœv…€€}6³›¬GoЯ+©Va„ªÁ¦]Rd¦‚£ëB¢­¢Ã1”ŸŸóvÉ”™ ›Å…(€€r¯ÅHlÞe¥À¬m´X¼9nŸIÓ·ìo•:u´p)S±4q-–±ép¸«)t{€€r¢Äwtpeÿ±t‹X:»tÕIñ¶†u@:–²vu¿)¯v!¯Äu»©éx瀀r£Ã:{¸eª¾r{EX&¹µzýIÖµ$z÷:ˆ±{)ž­ò{8n­Þ{£§Ó}.€€r•Áí‚Úe€½&øWç¸jBI¨³Ò€Ì:f¯­€–)œ¬Š€¯¬0€Ì!¥ø€Ä€€rvÀÒŠ e_¼ˆÈWÀ·E‡¶Iu²¨†Ú:Q®s†Q)ž«G†Iíª¯†‘¤U€€rQ¿ù‘heJ»ËW²¶NŽTIg±¨":A­lŒ^)¨ª!Œ…'©X‹ƒñ¢êP€€r0¿P˜Óe?ºb–àW®µ• Ic°Ï“:?¬’Â)¶©8“`¨-!G¡´Š€€r¾Ó `e=¹ÌžW±´Õ›îId°š:::«Ò™¶)·¨}˜y…§M: ³º€€qþ¾v¨6eC¹P¥¢W»´C£(Ik¯w¡k:E«) Q)ЧʜE¨¦RºŸóØ€€ÙµqlªÅr×n7¯¿to·™›uIq-‚¬vkr£jëwŠtRx u‚6zy vÀzyv­×·oWwÞÃppÜxG®IrAx·˜Ksy4ttÒy¾iÇvzQPëw4zÖ5hx!{>ÎxÂz­Õâm„ƒÁ¤o‚g¬µp™Â–ÌrI€s^€êh“t²œdºr€œOÙuå€J4lv¼ïÀwA"ÔkêŽJ¿ÕmŽŒªîoŠð•:p—‰u~°rˆ1gWsv‡NÌt´…â3€ur„ÛÖuóƒ0Òzj”™o¾;l@–Ì©TmÖ”?“®o^‘Õ}Rpâ”f%r^‘MÎs¤‹¨2¥tGŠtÔ†¨Ñ&iФ¼ëk8¡#¨lϪ’an\šQ|oè—*e qh”?Lãr¶‘¦1às?Î esã‰Ðh¹¯Ô»Ýjg«Š¦ëkù§+‘Im…¢ç{ožæd&pŸ›3Lqè—ï1:rZ– Ùsˆ°ÏGh»»i˶¦ kS°Ã^lÖ«˜z/nj¦ÆcWoø¢mKpqCžÈ0ªq—› gryˆbιg¼Æ`º€iaÀ}¥ajÚºcœlM´`ymmÚ®Ïb§oh©ïJÎp®¦P0pëŸî q÷ˆ%ÊZyäk‹·}zdmK£Ázænë{hptyU{îqúbµ||sJÒ}tî/á}Ðv 9dv7Èéwèv<¶Wx‘v䢤y-wƒìyÄx"xBz]xÊa¯zÿyzIÙ{¢z.õ|Iz k}±z¨Çev*€ä´®v怇¡w•€,ŒsxCèvòxõ¹`…y­˜HÏzZs.zå@ ¶|3~ÖÅÓt¥‹z³ ukŠ3Ÿxv'ˆò‹vä‡Äu¢w®†¿__xx…ÐGÕy-„ï-0yœ„4 zè‚wÄ[s]–±—t*“öžtð‘Ù‰—u·Ítev‰á^HwfŒ-Fíx Š,lxr‰Š“yÌ…“Ã$r[ Â°bs,לÎsòšÞˆht¾—ôsJu—•3]Kvt’®Fw4‹+½wkz"xÝ…€Â+q«~¯fra§Ì›Ís#£ù‡hsî 3r]tÏœ¬\}u±™vEjvi–Ñ+,v‡•WÄx…@Ánpø¶M®¤qDZٚúr­1†ŽsD¨“q‡t&¤M[½u ŒDÎuÉÀ*®uÇš#xwv… Àðp”Á6®q^¼šRr ¶‰…Ör¾±pÕs™¬+[t„¨D;u;¥**u#œ‚;vö„ä»n‚”jœª1‚8lx—ëùn*„yÑo¿oü¹qMZp¸rÙC€ÝtG)‚uS<ƒ»vºL€½t³©€u–³€evVƒO€Kwnå€BwÝYp€Px¦B“€xyZ(.€üyÈÈ‚ zÒ¹~ͧÂ~ù~·•˜~ß~œ‚$~Ø~†mÏ~Ü~ƒXy~ø~Aº'~’'nŽ~|b€‘~’·¼}”ˆÕ¦\}†‡î”}|†þ€É}†l}Ÿ…LWa}Ì„˜@Ì}ÿƒö&¨~Dƒ„ HÔ¶m|Y’ᥠ|P‘8’¿|P„|]Èkw|€Œ-Vh|¾ŠÇ?þ|ô‰%ÿ}‰¾~/‚ˆµU{b £ó{^𣑍{^˜~u{n•›jy{•“¬{>•Æ$ì{*” I|}‚9³Ìz ± ¢Xz ­Æøyÿ©¯|Âz¥™hÜz1¡ÝTzyžº>z£œä$zj˜R{Ý‚³\y§¼ ¡Òy§·˜Vy²¾|yƒ­éh9y¨©—SŒyî¦A=—z£|$ y͘_ü{^‚¬Ø‹½iÚœùŠ€k»‹ý‰~mpyÀˆ©ofi‡ñp˜Qì‡br$;è‡ s…!±‡õtN‡w$«óŠseœˆøtUŠîˆ u2x¹‡?veq†vâQ†w¼;…Àxx ö†jxÇ…•{ªðˆj|ÛšÕ‡{|ù‰Ù†˜} w…Ú}!dq…4}FP)„¸}u:Q„r}™ U„ô}ƒæ~Š©Ñ†ö†Z™¤†…·ˆ…>…v‹„†„ScyƒíƒÃO\ƒyƒI9¦ƒ8‚ãƃ˜‚¸‚o€¨¥…ÃÛ˜˜„àŽŠ‡ƒ„"ubƒg‹¶bo‚ÖŠdNk‚u‰J8á‚2ˆn2‚fˆ{.€§«„×™~—–ƒú—~†ƒ0•\to‚€“3aŒñ‘0Mª†x8EEŽRµXÝ€ €¦â„£2–ȃE ˆ…­‚v¬s™ÂšÊ`Ä7˜&M€Í•ò7Ç€v”ºQ€l’W€€¦Jƒ­–#‚¾©º„øç¦&rá&¢Œ`€—ŸVLS€9œÙ77ß›µø§”D€€¥ãƒ-·•¤‚`³3„^|®ër<€©ª _|€¦ïKׯ¤z6ÍX¡yž ”€€ž¦•iNÔ“&k#î‘ylÔnÌnj\ްoöIqt3Ör²‡Ž¢röƒz¼ì“”rZ‘ÈsM't3múެu[ÄXuùHUŒEvÙ3(‹­wŠýwƒ¡~’{NŽb{}~!ŽÆ{§mX{ØZàŒ |GŽ‹|_2~Šc|‘~‹||l€Z€œ·„+Œý ƒ³|ö~ƒ5l Œ‚¸YúŠÖ‚XFΉӂ 1å‰0ÍŠÙ€€›&„,ŒâŒ{øŒ^ŠékŠö‰¿Y-‰µˆ²Fˆ¾‡Ü1Yˆ‡P°ˆÆ‡X€€šRŽ –Q‹?”˜{7‹~’Äj5ŠðX^ˆÕFEm‡Ôñ0ˇ)MI‡¬Œ€€™¤ïŸ‚ЇŒZ0zyŠÍšµiz‰^˜=W­ˆ!– DÕ‡”[0^†W“ôÿ†²€€™h¨Ì‰õ‹Ø¥éyÜŠD¢Íh܈ɟ·W‡ˆD@†‹›I/æ…½š)¾…áa€€˜½²V‰„‹{®ñyV‰Ü«9hNˆR§V‘‡¤”CÕ†¢ö/†…8Ÿk…H(€€ØžáĥלLjsßšl4cÄ—ïmÅR‡– oI?씆p±+J“èq³l–Þq/€}Ð@qc‚H›rQs<˜Ãs:c&–£t"Qð”¶u ?e“*ué*Ó’uvz8”õuò€€˜œ!yÙu™ºzr}—mzMb`•Sz•Q=“jzé>Ë‘á{@*Y‘{q“/{%€€ŽÏšÌ‚=€’˜nÛq„–-ya”&P{’7€ê>*³€Â)Þ
Ò‘’€ª€€Ž™´Š¨Æ—Y‰¹p´•ˆÇ`´“‡ÞOÖ‘‡ =› †z)wŽÁ†>­…{€€U˜Æ“G–x‘Ëp”<@` ’ŽºO33`=%ŽŸŒj)"¶Œ]‹ŽÀ‰‘€€ŒÆ˜›÷~š•Ï™øo‚“‰—Ô_z‘`•¹Nžu“ñ<¥â’Í(όؒÅiŠk€€ŒU—™¤¿~"•R¢Co“Ÿ“^öÍœñNŽÜšÔ<&O™Ü(kŒ8˜KŒ¬ŠW€€Œ—=­Ä}ÔôªÜn‘’š§¨^‚V¤‘M´Ž[¢Q;όƠõ(‹¯›!‹ùŠ7€€ƒ‰©h7v<¥öiàh£kxXâ xlþH‹žnr6²œ5o·"^›ãpZX¯p €€ƒ§òpguÞ¤ÖqGg­¡çr,XŸ'sH0œ«sþ6gšÃtË"+šGu€›tu1€€‚–¦–xhu?£ˆx¢g" “xåWïÒy=G°›Ty 6™gyþ!ë˜Ìz™gz§€€‚¥B€Pt¢:€f_ŸN¶WNœŒ‚Gši5‹˜)_!¡—uX®—‹“€€d¤%ˆGsð¡$‡xeµž<†­VŸ›y…ñF–˜ú…\5—…!Z–B…¼•߃р€€Ø£K_sh Ne.aËVš˜ŒF˜‹ˆ4È–Šñ!+•$‹bÌ”`…ó€€€m¢˜‡r÷Ÿ™–Îd¸œ¨•U™Ú“ME¦—Q‘ò4w•<‘[!”èⓆ€€€¢ Órßž¹d~œœmUQ™,š8EP–•˜¦4”Ž˜a Æ“o•è’†€€Ñ¡¼©\r}ž·¦ìd.›¦¤2Tú˜­¡¥E–  -3Ù“üž| ™’Ø– ã‘;†€€v´³Ágiõ°8i\€¬åjŒN©¼l>‡¦âm\-=¤ënk¹¥—nl‰¢ªp€€vZ²ÐoRiʯ(p\W«¦pùMù¨TqÝ>p¥^r¼-:£Isj㣧sFþ 7ua€€v ±|vèi`­Øw\ªGw`M ¦ëwÃ>(£ìx--¡Çx„î¡éxT^ùzX€€u¬°~]hé¬}~[w¨ó}ÝM4¥”}Ã=Ç¢™}Æ,Рj}Ñç Z}¼¬›ú~¯€€uD®ô…áh«X….[§Ï„‡L·¤mƒó=r¡dƒ,Ÿ2ƒkÙž÷ƒ¿íš;û€€t䮊h(ªuŒrZ¯¦ã‹XL_£yŠX= h‰š,_ž‰hÒ¶‰ƒ#˜¶‚€€t”­e•=gæ©Á“ÊZn¦#’CL¢­Þ<ÔŸšî,0;Úœ•ŽYV—j‚B€€t]¬×g±©-›;Z2¥†™VKØ¢—£<”žì–µ+뜓–v»›Æ¹‰–S‚d€€t.¬~¥g´¨¾£Z.¤ü ÐK¸¡]žÉ<{ž)ó+뛾›“ÑšòȬ•Œ‚|€€j2¿f´]λ@hPã·–ipC#´jÆ4*°èkô#¯>l¢!±HkãŸs°€€ií¾=n2]Ϻ9nØPõ¶BoœCE²wpn4[¯.q1#s­Jqœµ®èpæÀx)€€iͼçud]¸Úu€PÕ´Ïu¸C&°ív4Q­v|#‘«ˆv®¬Èv&œ‰|"€€i¨»r|k]a·f|P‡³]{éBò¯w{Þ4-¬{ð#“©ò{øgªâ{Øì>—<›h¡€€izº1ƒ]5¶#‚ÚPV²‚KB´®+×4ª·š#”¨…ž©©0®šl€€€iN¹<Š»]µ‰ÉPD±ˆÜBž­ ˆ3ü©‘‡’#§:‡Àæ§«†¸™€€€i)¸‘þ]´GÈP?°‚B”¬Žl3ñ¨›á#§¦2ŽE"¦YŠé˜ß€€€i ·ó™Y]³ž—æPD¯Y–UB’«M•3ä§Ç”¶#œ¥^“Ì?¥YŠü˜H€€€hú· ë]#³ŸIPQ®µ|B–ª›œ%3é§ ›n#±¤”˜"V¤ƒ‹ —²€€€ÍPlmfD¹çn0hu¥ÓoØjàqcl”{rßndUtOp}Llu¤rP1­v©sÖ Çx1s¶Ë\iîqT¸Xkçrg¤mm¶swŸogt†yãqu—c>r–v¥Kasúw›0±tÜxU ævtwåɈgÉ|`¶‘iÜ|\¢ákË|_Ž&m™|}x‘oV|ªbpÿ|ÞJYro}/Æs+} !tî|ƒÇ»eâ‡P´Âh †P¡j …`Œškò„‡w*m̓Ó`ÛoŒƒ/ITq‚.éq™ë vs›€¸ÆdF’4³)f|TŸƒhŽ~‹jƒŒ»u×ln‹_²nC‰¢H`oˆA.p+‡ ärx„RÄÅc!±Ýe?špž8gU—µ‰ÊiS• t¦kG’…^¥m!3G‚n¦Ž)-inæŒÅ hq„‡ öaý¨°Ôd@¤—*fU úˆ»hTks©jRš]Èl3–ÿFÇm±”T,ÒmË’ó p¹†ÄÂía<³ ° c®ÄœSeªL‡Ûg…¥ÛrÊi„¡¸\ÿkmžF$lêšý,OlÙ˜\ ¯p†ŒÂj`»½þ¯…bú¸ç›²dø³“‡%fâ®NrhÚ©s\]jÂ¥>E‹l7¢>+Ælœ¨ mp†_¾¯tŽe`­u‚g¾šlvqiwZkýrxBmû\Zy,oîESzq»+zßs€}s}½Fr=oð«ésfq;™Zturp…¶uvs˜qvst½[jwqußDvx]vä*8ywõ{[x»Àp.zkª>qrz¶—Óršzù„?s¶{BoÁtÏ{•ZDuä{ìCsvÖ|2)XwN|?zyÖ|lº)n]„ʨšo²„3–1p샖‚×r‚þnxsO‚€Y'tx‚B…unŸ(‘u·.x…€1¸®lÑ)§'n2Ô¿o|ŒPlp¸ŠßmFq÷‰„Xs4ˆRA¨t-‡;'ÞtD†y´wdƒl·xk–™š¥ôlÿ—m“nM•#€Co‘’Úl0pÙ¯W)rŽ·@âs'>rûŒVgvÞƒ§¶‚j›¤¤ül¡$’’mTžInššækGoë—ùV`q.•V@>r“8&¼qÞ’#'wJƒ|µËiß®—¤>kLªç‘Ål‘¦ø~vmÏ£jwo"ŸaU£pnœ7?¦q]™ó&Ipê–âôw¡ƒYµVib¹$£¸jÉ´·‘#kþ¯ø}Æm/«>iÏnz¦òUoÅ£g?p®¡ %Çp™‹Êwçƒ=°p|ÿd¬ M}g}TiW|–}œkghþ}ñmeTD~VoS>~Õq$«r&÷gt¯SzÑn Ÿ3{'pß{zqh{u{Õr©gó|:sãSS|¯u=8},v#C}ÉvŸ¶®xq®xÕx‘àyMyŒ¾y¶y‘zKz&zfäzœzvRf{zí¹²–ô*ð:–F²‹÷€€Ž¾…Eª÷€—„e¨Wqcƒb¥Ea?‚b¢!PX—Ÿ˜>V že*›€Ž›5q€E‹Ë€€‡|˜czi–˜eYlD”ãgx\á“dirLI’kM:6‘ lõ%Ù‘8n <“•mt€}F†Õ–ýkŠyÏ•mk™“ing\E‘Ûo¿K¼{q9¾r'%xvrÈ .‘rE€€† •HsÛxt¥jÒ‘Ùud[{QvK ŽõvÔ9.úwt%Ôw» ŽÈw}€€…H“°|wþ‘ü|LiÌ]|sZ¦ŽÚ|—JKŒ|À8‘Œ”|å$œŒX|æ Œ¼} €€„o’]„Yw*±„høƒ¡YÆšƒ1I¨ŒA‚É8‹Q‚‡$8Šþ‚g íŠñƒº‘GŒÈvr¨‹ïh?ŽŠôYŒ‰‰ëI‹.ˆý7œŠ%ˆ[#ë‰Àˆk Ù‰g†€€ƒ&t•DuñŽÝ“ðg¼;’bX†‹¨ÅHkŠMh7‰BŽ˜#žˆ²ŽÆ ƈ‡I€€‚±ÖÎuvŽBœg:Œ—™ïXŠö—ÌGꉓ–6ˆŒ•k#4‡é” ¶‡‡>€€‚Zd¦„uΤ[fËŒ¡ÇW‘ŠgŸ/G„ˆ÷R6<‡åœp"î‡9—ž •†F‡(€€z¢¥bpn &d•`«îf R ›çhŠBXšjN0â˜þkÙÁl?ߘ¡l¾€Ðyü¡Aj{m žÌkâ`4œmAQ¹š]n•B˜€oÒ0£—JpÔf—Ïq –qÒ€€ykŸ¢rXlîBs!_šôsæQ!˜Ñt¬A‚–òuh0D•±uþ6–uûR“ÅwM€€xÄžzl2›»za^Í™xzœP|—XzÜ@ì•{/Ó”<{O÷”g{1t‘À|L€€xœ¿ïkˆšr¹^˜5vOÈ–-@h”4€ø/d’ï€Üµ’õ€ØŽý€€€w†›º‰ßjú™s‰8]“—0ˆuO:• ‡­?â“"‡/‘¹†±‘‡¨Žvƒ&€€wšÝ‘×j€˜žÄ]–X†Nº”+ŽH?m’@N.ÄÊŒô†eŒ¤Ç)ƒ;€€v³šE™ëjK˜˜ƒ\Ý•®–ËNs“a• ?‘e“Ö.cû“Ò0Œ‘=ÕŒƒE€€vk™Ö¢+j— {\‹•'ž\N’ÌœD>ÒÄ›.'K™ðŽÍ’FØ‹RƒF€€n­9a“bª]c’U:§·eƒGi¥;gW8M£h÷'6¢j*¤i§˜Ónb€€mƒ¬i?aº©jTý¦FkáG@£ m*87¡`nS'? 1oq¢-nŠ—-si€€mªp³a9§“qsT˜¤´r7FÞ¢s7ퟹsº'žrt.’ s˜• x0€€l¡¨êx`¯¦xSSý£,xœFj zxï7‰ž3yA&ÝœÜyl—ž2xõ”0|c€€l(§l`8¤¯PS¡Ù+EãŸ&71œÐ~ô&›p~ò’œ†~ã’耀€ÿûÑük½¦‡†ò_Ù£¥†wS% Ç…äE…ž …P6Ø›«„å&oš(„Õ’›„¸‘Æ€€€kd¥·Ž}_‘¢Ò¯Rߟ猲E:‹»6†š¼‹&;™%‹J¥™¨‰¡Û€€€k$¥–_T¢&”õRœŸ3“ŸDóœ_’Y6@™ô‘³%é˜a‘¼‚˜­Œƒ'€€€jð¤¡ã_V¡¤œ¨R™ž˜š÷DØ›¢™V63™˜Ï%ü—j–窗©Œž Š€€€a³¸|`‰Uôµ|bRI¡²de`ˆ"m$gîsinøji]·p¹lÑFÇrEo,Ïs&pÝ v*q¿ d%jÑ­KfŠl…šŽh¿n,†èjÒoËrFlÏq`\¨n±rëEÉpItS+èpñu] mthuk½Ia•u§«†d vN™f}vó…sh³w¥pøjÒx\[lÐyDÊnpy¯+nÙz érÜz-»w_K€]©¸aõ€—CdlȃîfÁo—iiZRkMCÏl¾)*Blä~ívq³~†¹Ì]U‹¨ `‰Ü•²b¦ˆµ‚ie ‡—nRgb†ŽY5i…§Bçk9„Í)‰k„rY‚?¸q[À•³¦Ô^’“»”pa-‘µ1c¢¶m-fÔX·\Zy c¥Ì]Vž“j_õšº€1bp—Þl=dÞ•1Wjg’ÀAqh»¯(`hÊ|sY…¶ŽY«¥\b§|’œ^þ£¾_av knc眙V­f,™@ÖgÉ—''ìfâ•"Ds¸„ê¶ XÔµ¬¤~[µ±?’^D¬¥~º`±¨!jÏc¤Ve` ~@Mfðž'neÈ™_t„̳7nì_G¢™pOb1‘q§dé~hrögwj´t?iíUéulM?¼v¤nw&wZoü2{ q±Âl,i«¡{mÏkŒoPmP}kp½nÿiÃr pŸUsxr2>øt sš%Wutxáyruɰ1iµsôŸÍk~tߎ{m u¸{ön­vŒhzp0w`Síq¡x.=þrÉxÜ$‡ræy&™yëzF®’g‚~ž&if~-ŒÚk!~.z•lÇ~)g8ni~0RÙoî~;=q~<#Òpá~[zS~+­eŸˆGœ³g˜‡‹‹lii†ºy.k …áflÑ…Q×nl„gøoŒ÷nÍp,‹\½qEŠUIrL‰64ÛròˆcïqˈK€€žmk€™UÜH‚ûH;ŽÊ‚¡9„†‚V)0Œ¾‚7vd‚hà‰'€—€€m¬’O‹'aõÕ&ÛOŠ¡UTE‰äG³¿‰9Œvˆv(Ï‹ˆQu‹ãˆ‡ß€¯€€mB‘‹“ a±’5UŽy‘GiŒÓ±8¼‹tŽÓ(pŠžŠÇŒ †Ñ€¾€€lïø›a_}™øT¹Ô˜_GŒ –±8rб•Ñ(9‰Å•'ü‰ÉŽ0'†€È€€eb¦W[°Z¤^Mð¢#`e@« [b1òŸdh çŸeŠ û¡»e”mÒ€€d³¤Ìc'Y¦¢ŽdñM“ mf°@lž{hV1Òœÿi¿ óœÕjŠ Ožúiý‹ûrÌ€€d+¢èjuY  ¸k¸Mž”lñ?øœšn1›o КÁo• }œloŠ{w¢€€c¡q«XkžârzLhœÉsã™?yì0´—©z' M—-z1 Ž˜z*‡Ñœ€€bž,€VWqœ€aKu™ø€H>|—ó€0U–Nú %•¢ø •–€†´€€€b&-‡¿W›‡yK$˜ð†ø>(–܆f/ú•2†æ”m†D ¬”t… …΀€€aÕœ^+VÌšJŽ›JÓ˜¾=Ø•ýŒÛ/®”DŒv‹“~Œ¯ ‰“%ˆz…!€€€a•›Ë–ÍV¿™®–$JÅ—l”ï=½•(“¬/«“J“g±’[‘ï ¿‘숟„œ€€€Y#±­ZdN¯R\Bd­^ª5œ«`ž',©ãb#“«abhE©¶cZˆçqý€€Xp°ga}Mº­âcB#«jd¹5©.f:':§½g`ê¨ÏgpÒ¦¿hQ‡ v²€€X®’hhMJ¬ iAЩ‰j´58§8kÎ'¥¬lš ¦sl|9£ómx†gzÝ€€W®¬§o:Lߪ&oýAW§¨p¹4ç¥Uqm&ߣ¼qì ¤Nq«„¡\rü…A~Š€€WRªývLЍ‚vŠA¥ÿvê4Š£¦w3&º¡õwm ¢]w)Ÿxá„>€€€Vÿ©­}#LP§*}J@Õ¤}N4^¢7}?&’ t}3 —}ÿœï~ƒ^€€€Vº¨ „-L)¦„@¹£uƒÇ4A¡ƒl&tŸ4ƒGŸ-ƒ‡>›!‚z‚­€€€V…§Ò‹CL¥2Šý@ª¢ƒŠg42Ÿþ‰Ï&]ž!‰Êÿž‰6M™«ƒ–‚€€€Vb§4’~L ¤z’"@§¡º‘U4.Ÿ#¤&g/™&œöäj˜pƒ©€€€€µ&aSY²£þcÑ]’6f/`7†hqcLkÞjŸfFW(l®i%A*nbkÏ'ënÚmݹt£nų*]Îda¢q`šf¬Ôc6hæ~Ke®kjºh m(Vj@o.@5küq'lr^cu5sA±NZ±o ª]³pJM`ƒqŒ|Öc&rÎine¬t TûgþuC?>i»vV&Qiew uµx"¯tWåyžÝ[yÜŒ^ z9{Y`Òz—hc{SÔeê{k>Ng¨{Ä%—fÝ{ëÕv$|š­¾UxƒòFX΃uŒ[ã‚öyÞ^Å‚yfâaŒ‚RÈd¯=veÊX$òd„vƒ€m¬RSvŽf›÷VéŠÌZ‹Àx¸] ŠjeÎ_ä‰(Qçbpˆ <¾d%‡$bbu†nvÓƒ¦«-QϘ՚êUX–¶‰ÐX‘”ƒwÊ[˜’Ydï^€TQ$aŽ…<)b¸ #ð`ÈŒ¢Fwƒ‘ªPP„£6šT C‰ WZ7w Zdš;d7]T—€Px_ñ•;œaŠ“V#Ž_l‘ì&wLƒ{©ÁO˜­u™’S4© ˆxVl¥¹vyYp¡øc°\^ž™P^ú›Å;(`š#"^E– wwƒj¨hÛYI˜cj©\¯‡Ïlk_æv%nbðceoÊeÜOq_h§:"r¯k* èrñlÌL}Ïnó¦eˆcw—4g¥e䆽išh1u-kvjcb€mBl}N³nñn9tp>pE [pqL.~sǤÞbˆmŽ•dÙo…7fûpxs¸hÿqÔa8jïs&M–l¸ti8mýu|m.uù~-xe£4_×wˆ“ÕbPx0ƒ–d”xÇr_f¸yQ_þhÍyÜLŒjªzc7«kæzÏújzáý~T|f¡¨]}’``]‚-b|&pþd¸€â^èfဤK—hÔ€w6èj€Kkht€ê~uÔ c[‹{‘+^BŠ– `¸‰’oéc ˆƒ]æe@‡‚JÉg5†£6ChX…øîf«…ÚÙ~‘€“Ÿ_Yù•t2\¼“Ì€_>‘ûoa›$]câŽoJeÜŒó5¿få‹áe3‹ŒÌ~¨€ŠžX»Ÿas[ˆœ÷Y^ š[nJ`l—¿\Zb¸•aIhd¹“i57e²’7:d6Á~º€‚žWØ©6ŽêZ¥¦ ~Ã]#¢§m²_{ŸN[ÐaÄœXHõcš4Ãd¢˜åËc “x¸~É€|›6p²X÷ŒÕqÌ\`}grñ_l¼tbŒZáuDedGÁvgh2òwhj`^wÍkZ€r™ám‡b‹£nîe|1pAgik£qŒi¡YårÑk¾Fætmº28tõo`ÒtÉoÜ€vȘ…j¡l Š?l@mÇ{m½oUj…o&pÆXîpƒr(FqÉst1™r¥t|cr&t“€zâ—hu™ˆÁiËv~yƒkgwFi:lìwùW¾nlx£EoÂyA0Çp‰y·ÊoìyŒ€~q• eƇgg¦Ýy•lÓ*ŸzGn@ˆ{…mö€zŒsjµ~½t lyp{tãn`åu»o¢P2vq>w]r]* wísE=yrË€}µŠÕp“s²}kq¨tÀo)r¡u­_èsv‡OOtzwK=guOwû)Žu½xivìwð€€‰“nk|®|Po™}n p©}W^¸q¥}zN]rž}š<Šs}}º(ÝsÆ}áu%}ž€€ˆ‰l¤…¶{Gmã…zmnÿ… ]Çp „‚Mqƒÿ;ãqÛƒ™([qÿƒeZs¡‚ú€€‡²k,ŽºzulyÞlAmœŒÃ]n«‹‘LÆo°Š{;Hp~‰¦'úpp‰i.rY‡p€€‡ j—¹yÍkX–Dk•l|”\]m‰’©L#nŽ‘:ªo[ö'€o'ìqPŠ%€€†—i$ ³yOjž´k kžœQ[Ðl¡™ÞK§m—Ò:En_–®'n •e§p‘‰è€€×‹X]uXX[—gÆZ^¡Xì}awHÁ¸d7‚'fq"уgø焤g߀ys€Ë~¶`âth~Êc_fÔ~íeµXgçH `iò6pÊk¹"g€„lÉßélš€}º| i]s9|Vk)eÍ|—lØW|ÜnfG2}-oØ5¾}–q!æ~q¶Å†q›€€~˜y¦qÊrz r÷d–zhtV.z»t÷F[{ uÓ5{‡vˆ!t{Ôvв}pw €€}€w‰zKpùx zÜcŒxy{IU,xÚ{™E´y?{á4‹y©|!yÀ| ª{¡|–€€|uׂÞp,vk‚ßbÍvá‚­T_wF‚\Dåw¬‚3òxß ŸwãÕƒz\€€{Ëtq‹jofuŠÞb u‰ŠS¥uñ‰(D4vXˆ]3\v ‡Ù Jv;ˆrxØ…U€€{1sR“ðnÎsû’àasts‘StÕC£u9ŽÌ2ËuzŽ+ÜtàŽ cwÎ…«€€z¾rxœ|nWs'šý`ós›™R“sò—C5tI•2ttz•s¶’Ö,w …†€€uNŠ·WÚi€‰ûZð\²‰|]ÞN¤‰'`›?4ˆþc-ó‰Je)ŠùeóõŠg€|_tXˆ_çh³‡™bS[è‡.džMø†ÙfÅ>©†«h¹-ކâjKOˆ0j»,‡lkú€ƒsj…‘gçg¬…>i³[ „ékfM#„¡lù=ø„xnd-„¡o}…™o N…q6€€rpƒ?oßf¡ƒqYö‚Çr8LJ‚Œs>=4‚pt#,m‚ŽtÊœƒ6t²]ƒ vÍ€€q}Bwàe¹x‘Y€êy"K]€·y˜<™€“yü+耩zBH€ÿznD{À€€p¦òdï€#XRU€'Jµ!€ <~øð+³~éå3~óè½ø€€oö~9ˆ da~:‡ÆWÏ~ ‡=J+}ʆ”;r}›† +)}}…Ô÷}*†–~vÀ€€oi}&$c×}/rWE}ŽgIªɺÅ5|µ<:õ||Œ`*¤|QŒ<{´‹[Ÿ}jÆ€€ný|S˜Kcj|`—BVÓ|,•¿I;{Ö”":—{“*[{I’ÿQzu| ¼€€i”W ]ГHY÷Q®’U\ÅDQ‘•_b5y‘%a°$r‘¢cUO”Œc'ˆ iš€~Ôh’#^¨]‘`ýQ !c8CÌQeN5ŽÌg$>h[i‘mgú†"nd€€gQ¶f7\@ŽÌgýPPçi­Ck=4Œ‘l•#âŒÂmn^Ž‚lé„^s§€€f~qm¼[^ŒžnÿOb‹Ép*Be‹q<3슀r #oŠ˜r7‹Ïr‚¼xš€€e¯‹}uLZ–мvN›‰ñvÂAž‰.wP3fˆŸwÈ#ˆ¢wý ‰Sw”N|倀d÷‰â|ðYî‰0}KNˆg}{A ‡Ÿ}2Þ‡}™"Ù†Ì}£ ‡}µ€€€€dZˆˆ„‹YR‡æ„wMh‡ „/@v†TƒÐ2Z…°ƒŠ"€…Xƒ‰3…!ƒG€€€€cÞ‡€ŒEY †ï‹åM/†‹$@?…,Š;2/„g‰°"6„Š僠‡ò€€€€c|†±”X­†!“|LË…M’S?á„O‘1ãƒsn"‚í*Û‚]Š €€€€\àžñUßRBYXŸFÀœ[E9ùšû]¸+‰š}_¾I›Í`¸„œJaƒ£mI€€\œÝ]Q¬›Y_UF7™ôay9•˜Àcr+Q˜e P™e´ߘÝeã‚r1€€[_š…dCPõ™eüEŸ—½g¢9–„i&*ê•ÅjV&–‡jµ•œj䀗w€€Z¶˜@kZP8–çlžDÑ•—mÎ8j”anã*j“Ÿo±Ý”3oÎ.’±p#€{e€€Z –LrO’•s[D0“·t7Æ’|t·*‘«u-”’u!1*uÞ€.€€Ys”·yÈO“}zCC±’.z•7QézÃ)˜zßq-zÌ;ø{Ñ€€€€Xð“kN–’>;CLê#6í—€ì).Ž¥€Î Ž©€ëPŒ€à€€€€Xˆ’\ˆ`N/‘:ˆ;Bçæ‡Ä6ކ‡6(Ü~‡·s‡G+Š£„Ù€€€€X7‘ŽåN r£BÃŽÎ6oÛ(âŒWÂùŒŒ¡r‰T… €€€€P¦ªaTMFb¨˜VÒ;M§ Y=.ì¥ä[i †¥Ù\÷—¨£] `|€q.€€Oƨ”[*EĦÌ]7:¿¥_2.…£Á`÷ [£mb+Ç¥²ble€uø€€O=¦SaïE-¤–cŽ:A¢ëe.¡~fy ¡gVÑ¢ág šÞiî€z<€€NǤ h§D£¢YiÞ9¤ ¶k-¡ŸIlÀž¿l‘Æ ?l(˜wo+€}ÿ€€NK¢ oqD+ kpN93žÅq-+Lq¤Œœ¥qöÀÙqŽ5–u €€€€M× jv`CÊžÓvð8ä(wU,뛞w‘Xš×wœØ›©w^q“ÚzT€€€€MsŸ}UCƒ}¢8«›Ï}°,·š7}ž&™]}ŒÑ™å}µ°’ ~΀€€€M$ž„YCJœs„q8š¶„2,™™ƒß ˜ƒäª˜wƒ{µ™€{€€€€Lñ)‹C(›”‹†8d™Ð‹,†˜ŠŽ–óНÙ—ˆDÝg€–€€€€©ÎZêS©™­]ÇW|ˆó`†[5wPc,^Ìd¨eºbCPáhe•;ÂiÝh£#%ipjéçygl˧ÂV£^ ˜Yà`þ‡‡\îcÆv _Øfxc€bŸiOÖe"k:ÓfçmÐ"eeØolÈyœqg¥ÜRÌh–GVUjs…ûY§lLt•\Ænb2_»oßN¶b^q9åds!±b±t­yÊvb£ùOSrÝ”zS sÚ„| X_ê|VEŽb(|¤1­c|å°cD|dQ‚„µ‡Gg{Q*Ðgh{4jz{o€€ŠY ‚|Ò\j‚n¢^òß_eaF O'cgd=e ;*Me$,æh÷;€€‰W™‹O{çZ}ŠžmÅ]‰¼^–_ˆÈNda®‡í<úcK‡B)éc'†ÿ³g°†C€€ˆ\Uö”‚{1Xí“'m[•‘Ž]ì^êM¿`6Ž{<[aÎq)oanI‚fªŠb€€‡ÙTº™zªW½›Ÿl‚Zg™V]^\Ò—ME_•;ú`“Ó) _ï“h$eï‹—€€…0q’S@xjr–Vój¥s³Zx[¥tØ]ÉK^u÷`ç9—wc»%™wùe× ºzÄf€uƒÇmÒ\w7o0_ip„aÎZ¥qÍdsJ‚sfí8át"i$% tÈj¶ w÷jª€yá‚pj]dÝuÒlghXmƒi2Ynîk)I˜p@lÿ8#q^nž$‚q¼o² eu‚oŠ€}€g3m°tpi o7gj¶p¡X•l@qòH½m®s"7}nÌt+$nátË Ns^t³€€ºdrv€sHfswceÜh>x"W`iÝxÁGÏkZyT6¤lxyÓ#ml9z q›ze€€~ bYr7d9šdÜf­VpgУFôiT˜6j_˜"÷iÊ£ ßpÇ€€}¼`(ˆ&q^bZ‡ÊddL‡4U®f ††F=g˜…ë5ph“…‚"¤g¤…Š ËnÏ„C€€} ^‘åp³`ÔöcdbÐŽ»U d”kEŸfŒP4Ôg ‹¥".eØ‹é ³mê‡<€€|‹]W™’p2_¨˜ bÛa¥–JT„cd”aE)då’Ö4xe¾’!Édb‘Q knd‡ €€xýyîRþmzbV` {YöQ×{°])BG|h`0ÿ}Ab®â~ld#„€édí€y w³v`[Hkõw(^/_wò`ïPÿx¸c…A”y}eæ0tzGgêˆ{hñ›~)i²€|Àv}s c—j°teÔ]üu góOüuêië@¹v¿k¸/Åw}m5wËmÖœ{Ån¹€ïuDpkßisq:m}\ºrOnþOsEp`?ât.qš/!tßr–¦tºrâŸy±t(€€tmWt7hKn°u:[¢oÞvNpçvÞ?joÎ}œ.pR}½áoˆ}˜x<~‚€€r:i3„ùf¡j¾„äZl „‘Lxm%„"=ºnƒÄ-nnuƒ—˜mˆƒÞšx8‚ƒ€€q’g§FfiCŒ±Yxj–‹ÍKäk°ŠÎ=(l“Š,Ül߉º+kö‰Ì™x:ƒ€€qfq•e„h”ŽX÷ip“"Kejƒ‘ž<½kX€‚dù8,Šk…_Ðj´Žˆlx‡‚ý€€lÅ‚ÙR{a‚‚ÍUçUH‚ôY,G˃9\=8Öƒ¡_'Ù„xa,ô†»a•ƒ:e®€|k–„ZN`Á]!Tf€_ÐG€UbS8C€¹d'tkfDׂûf_ jb€6j„|Sb#_o|Ëd^Sv}2f|F.}hn7‹}øj'&ê~Škg”‰k?€oz€€imyfiø^Nzk¡RQz…m-EKz÷n˜6¿{hoÎ&L{Ûp¡9|pH€tþ€€hcvÕqÓ]TwrõQ]x%sõDQx¢tÑ6#y u%Èy`võyøuž€y gst yÅ\puxzbPˆvzÕCšv{%5vÿ{d%}w{’×w¹{`€~ €€f®rȳ[Ës½ÛOötkÅC tãŒ4éu9c$÷u/d©uÚ‰€€€€fqI‰š[4rM‰UObsˆ½B‚stˆ4gs»‡‹$rs‰‡›Ktj†Á€€€€e˜p‘†Z¾q(êNëqàÛBrK޳4 r~Ž$/r!Ž6s?Šð€€€€`¦ŒoQ˜V‹íTÜJw‹©Wý=œ‹•Zä/‹×]e)^ú €Žj_)€ii€~p_‰RXþU+‰[»IªˆÞ^U<õˆÄ`¼.¡ˆîbÆɉùcø ¤Š¨cý€n)€€^Ÿ†A`cT-†1b˜H׆d¯Å’§\]2ˆ’D^›$g’ˆ`OØ”ç`™Ô‘ bi€qø€€RË‘ ^?HÜy`g> ìbm1؇d9#ä¯e‡›‘¤eŽËgg€v䀀RŽBe@HÈfñ=(Kh1/Œéiá#TjÐJŽ“jŠðl¤€{<€€Q9‹ÈlUGD‹im–ß¡Œ;MÀd¹|ïQœg"lŠUAi{[ X¨k¾H[Šmè4š\óoÚ]Jq$š}Ktâ˜èEE÷RÞ€C2‘S €X«W)€¨º}€å” :–Šq†J@‰ˆw±Eˆ§hI‰‡ÔW;M“‡E\P­†{2.Q5†!gUʆ’Â}0’õ8”?…e=À’vvùBíÄgnG˜5V¹K»ÖDÜNÔŒ¶1ÃOŒ1T¯‹ËÈ|ý4’36´„¾;ò›vqAB˜†gF –KVlJ?”cD¥MY’ã1‰M^’P÷SÏðÍ|õ8“ƒZ¾Mî…C]aR v[_ýV9f}bŠZ/Udù]ûC=ga/Oh@d±ªiufT€mÒ‘yU™W™ƒÕX»Zþu-[¶^Je^avT£a1dxB€cjgJ.¹d]i·Nf`jÚ€r°šPäaI‚Tmc×s™W¹fPdZÏh¯SV]¥jòAc_ñm-Ñ`nÚ±càoŠ€wbÊL“jë€GPsl§qõTnVb´WRoòR)ZYqx@j\¯rç-] t8a¸ts€{vŒH®t†~ÅLÛu{p’P­vca`T,wôW~Ô+õVÀ ‡^dX€€‰ˆB[‡ž|~G‡ n—KD†m_žO…ÍO”R~…C>XTÔ„ß+›TL„ÄU]¢„ú€€ˆ¡?ðÿ{²DÊ­mâI0ŽJ_M&ŒóOP•‹Ð=ËRÜŠù+-RGŠÆ*]뉛€€‡ÿ>š{C ˜mVGŠ•õ^†K’“òN O ’E=‚QE‘*áP­‘ß^i@€€ˆaìN zÃdRl±f&V]›h9YìMVj.]‘;¤kÚ`ï'òl˜c©“pëdh€q´†'\ùWyH_‹Zwkcaþ]¶\{dQ`ÓLYfrcÃ:Ìh)fu'Bh‡h”Cnhÿ€vh„nXb`Fw´[[bßj-^ec[\`£gÅKibèj: d¡l &¹d’m™k‡mÅ€z‹‚»T0iivWykBh•Ztm Z]0nºJ?_ pJ9aUq´%ù`Èr½ ¸ixrÏ€~#2PkrˆtªSôsªgAW)t¹XÔZu²I\\Ÿv8L^Kwq%g]ƒx ~i1x:€€ëM!{§s€Pá|f6TG|oWßWV|µH{Yö|ù7²[}C$öZÌ}‰ Ri|~ €€~áJM„´rŽN<„xe[QÊ„WTøƒ°GÀW¥ƒY7Y&ƒ)$¦X‘ƒD ˜YaÒ.ŠY”y@[žtÓ„y€€pÑqsMâer“Q¤XxsÍUUJÑuXÞ;Ív-\ *çwC^Ùx0g3Ì`§~æbZ€xÚolëUÜc»njYW_oÜ\.Iéq6_!; rjaÐ*RsZdCt d×Î~¤g!€|„m–h§]÷bRjx`‘V6l#cHØmei:&nÝgˆ)šoŸi7Çp}i­à~†l*€¼l5d´f`øfÄhTâhœi÷GÞj6k½9Fk„mM(ðln‚]mnn©ó~eq–€€jãa#nF_¸cfo¤S»edpíFÊgr8£hns"(mhÃsçjÉsÚ~.w€€iÅ^v€^È`vwPRçb–wÿEôd\x7Íe£y'Ùeªyx®hšyg~0{ô€€hÜ[K~«]í]ã~ôR` E6aò 7c+'GbÞ/qf»f$~ú€€h%Y†À]D[»†Qy^ †D _ã…‰6‰a…)&´`a…&eT…D0}þ€Î€€gžW-ŽÆ\ÅZŽ3P÷\^6D"^2Œ"6 _?‹j&g^a‹‰°d8‰ó~5€¸€€dãz MZYÜz¸PøN{ˆT‚A|dWÝ2t}LZÛ!”~€] Ì€ ]x€e€{´cEuÂTßX¨vÁXLýwº[@*x¤]Ø1Èy‚`S!zgb ´|¬b=€jH€~ôañq§\ƒW]rî_Kîta?/uc×0úuæeÐ vxg |yAg€oV€€`°mÕd2VoQf4J°p—h>7q¬iß0r~kYÕr³l? 0vXl €tÑ€€_„j\kèUlm_I¤min¼=,n‹oó/xoOpùKoqˆ þsÐqn€y²€€^vgFs²Tit¤H¾jœut†ª€€€€Xóƒ\L`N«ƒ–OÝC„„S>7 „šVa(¼…€YV‡‰Z\q‡Õ[¢€i5€~WxNS|M„ÕVŠBy€`Yq6,€ñ\(±^Iñƒ3_C„`n€mñ€€VH{ZZ³LT|]@A{|É_ª5>}_a×'S~c‘k~ûd/Š€¶eV€s$€€U+w¢aõK1x’cý@VyUeä4Xy÷gš&ˆzhæÓzøi/s}Üjo€x €€Tt9iGJ)uRjÎ?Uv/l63bvÐml%âw7nXGw„n^Z{ioã€|r€€S&q,p«ICroq»>„sdr¦2¡tsg%7t=sët‡sÓbyCu߀€€€RQnwx Hsoçx©=Äpöy1õq–yk$¡q›yŸ¢r&y€xJ{s€€€€Q¦l'tGïm̸=Xn÷±1¨o‰$eoR‰Bp:°\x¢€'€€€€Q%j?†òGol†é<ÜmA†x19mÎ…ó$md…Ûn¤…¸Qxµ‚뀀€€Lï J×C`jN68ÕƒQi,½ÿTDU_VW €‘ÝVö‰Š\4€l­€€K“‰ËQ”B8‰æT‹7µŠWP+ÅŠY¾™‹˜[l 9[Ö†N`߀qŽ€€J……úXgA†KZé6¼†”]<*׆ó_;܇Ô`„ 䈞`¿ƒTeº€vˆ€€I‚T_G@‚ÈaO5«ƒ#c+*ƒd¿ „1e« ˆ„·e€ªjÞ€z뀀H›~ñfM|°np3þ}6oh(q}}p"û}¦pl ~†p‡€vU€€€€Føy1t]=•z-u3\zËu§'æ{vrzçv Ô|6vl€{G€€€€FOvÐ{l<ëx{Ð2½x¼{ø']xí|úx„{û mzo|­€x€€€€EÓtÛ‚¼<‡vD‚à2ow ‚Ÿ':w9‚K$vr‚[ Îxµ‚€€€€€€@™™EH«7²˜­Kå-£˜”NÔ!ª™QQ;yœ2RSR™¾T`„²_Š€p €€?7•¼O6T•ŽQÙ,,•™Tb K–@Vfn˜¡W/ •Y?®d@€u€€>A’Ux5:’Wá+’>Z:’×[  ”Ã\ÒÏ^.€i#€yt€€=oŽ}[ý4PŽŸ]ö*ŽÕ_©gd`èÿ×a*ªc:€nV€}X€€<š‹bš3t‹id&)D‹­et™Œ"fK§fg™‰Åh‡€t€€€€;ˇòi]2¦ˆ‡j(ˆåkk‰Bkñ?‰¤kÖ¦‡n0€y;€€€€;…)p)1ô…þpï'ø†wqy†¿q´熮q†–„ÅtS€}˜€€€€:|‚»w 1]ƒÏw|'v„ew®.„—w¨£„Iw’nƒz+€€€€€€: €ª~'0çö~O' ‚¬~1ã‚Ì~‘‚\~.‰ˆ~ÿ€€€€€€ÿÿÿÿÿÿmft2 $ÚiÙ 6 … Ç ÿ1^‹·â 2Wy˜µÒï%Y ‡!²"Ú#ÿ%#&D'f(†)§*Ç+è-.(/H0i1‰2¦3Â4Þ5û7859Q:m;‰<¥=Â>Þ?øAB)CBD\EuFG©HÃIÝJ÷LM,NCOYPoQ†RœS²TÉUßVöX Y#Z:[Q\f]x^Š_›`­a¾bÏcàdñfgh#i3jBkRl^mgnqozpƒqŒr”sœt£uªv±w·x½yÃzÈ{Í|Î}Í~ÌË€Éǂф¿…»†·‡³ˆ®‰©Š¤‹žŒ˜‘ކ{p‘d’X“L”@•3–&—˜ ˜ÿ™òšä›ÖœÈ»ž­ŸŸ Ž¡|¢j£W¤E¥3¦ §§ü¨ê©×ªÅ«³¬¡­®}¯k°Y±G²6³$´µµí¶Ú·È¸µ¹£º»~¼k½Y¾G¿5À"ÁÁþÂìÃÚÄÇŵƣǑÈ~ÉlÊYËDÌ.ÍÎÎëÏÕоѧÒÓyÔaÕIÖ1×ØØæÙÍÚ²Û˜Ü}ÝbÞGß,ààôáØâ»ãžä{åWæ3ççèèÁéšêqëHììðíÃî–ïvðUñ3òòêóÃôœõsöI÷÷óøÆù•úaû)ûëü§ý\þ þ´ÿZÿÿè§,„¿ç     üóæØÌÖÞááßÛÖ Ñ!Ë"Ä#¾$¸%³&®'ª(¦)¢* +ž,-š.•/‘01‰2†3ƒ45678€9‚:;~<|=|>|?}@A‚B…C‰DE’F˜GšH›IJŸK£L¦MªN¯O´PºQÀRÇSÎTÕU×VÙWÛXÞYàZã[ç\ê]í^ñ_õ`øaücdeeÿfügúhøiõjókðlîmënèoåpáqÞrÚsÖtÍuÃv¹w¯x¥y›z{…|z}o~dX€MA‚5ƒ)„……þ†í‡ÛˆÊ‰¸Š¦‹•ŒƒqŽ`N=‘,’“ “ú”é•Ù–É—º˜§™“š€›mœZHž6Ÿ% ¡¡õ¢æ£Ø¤Ê¥½¦±§¦¨›©‘ª‡«¬w­o®g¯`°Z±T²O³L´IµF¶E·D¸E¹FºH»J¼N½R¾W¿]ÀcÁjÂrÃ{ĄŊÆÇ–Èɥʭ˶̿ÍÈÎÒÏÜÐæÑñÒûÔÕÖ×*Ø7ÙDÚQÛ^ÜkÝyކߔàœá¢â¨ã­ä²å¶æºç½èÀéÃêÔëåìõîïð ñ,ò8óCôNõYöc÷jønùoúlûdüVýDþ/ÿÿÿØhÆ 2 R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$ù%î&ã'Ø(Ì)Á*¶+«,Ÿ-“.‡/|0p1d2Y3M4A566+7!89 ::ö;í<ã=Û>Ó?Ë@ÄA½B·C²D¬E¦F¡GœH—I”JKŽL‹MŠN‰OˆPˆQ‰RˆSˆTˆUˆV‰WŠX‹YZ[‘\“]–^˜_›`aŸb c¡d£e¤f¦g§h¨i©jªkªl«m«n«o«p©q¨r¥s£t uv™w•x‘yŒz‡{‚||}v~oi€aZ‚QƒH„>…5†+‡!ˆ‰ ŠŠ÷‹íŒâØŽÍù‘¯’¥“œ”’•‰–€—x˜p™jšc›^œYUžRŸP O¡O¢P£R¤U¥Y¦_§f¨n©xª‚«Ž¬œ­«®»¯Ì°ß±ó³ ´ µ8¶Q·l¸‡¹¤ºÂ»á½¾!¿CÀeÁ‡ÂªÃÎÄñÆÇ9È^ɂʦËÊÌíÎÏ2ÐTÑtÒ”Ó²ÔÏÕëרÙ6ÚLÛaÜt݇ޘߧà³á¾âÇãÍäÑåÒæÐçÌèÄéºê¬ë›ì‡íoîXï\ð[ä€VyñVòLó=ô*õõööÖ÷³øùbú/úôû±üfýý³þMþáÿqÿÿÙ T– ¡ ¤ Ÿ “ ‚p_L7! ðÖ»Ÿƒ}tfUA, ê!Ó"½#¦$%z&d'N(9)%**ý+ê,×-Ä.±/ž0Œ1y2g3U4D526"788ñ9â:Ó;Ä<µ=¦>˜?Š@}AoBbCUDIE~% ô€Û‚¨ƒ„r…W†;‡ ˆˆê‰Ïг‹˜Œ}bŽG-ø‘Þ’Ä“ª”‘•x–`—G˜/™ššê›Ôœ¿ªž–Ÿƒ q¡_¢O£?¤0¥"¦§§ý¨ó©êªâ«Û¬Õ­Ð®Ë¯Ç°Ä±Â²Á³Á´ÂµÅ¶È·Í¸Ó¹Ûºã»í¼ø¾¿À Á0Â@ÃRÄfÅzÆÇ¦È¾ÉÖÊñÌ Í*ÎGÏcЀџҿÓàÕÖ'×LØsÙ›ÚÄÛïÝÞFßsà¡áÏãäM噿çè6é†êØì+í€î×ð1ñòïôMõª÷øZù«úöü:ý{þ»ÿÿÿ€€æOÎXÍ™¨~Í´Ú™~yœ£~eƒLÆ~…j…þ~ÀQ¿€c=9€üÅ~|‹4äµ~c‰lÌ@~]‡Ì³š~n†fšØ~˜…C‚~Ù„OiZ/ƒgP®¯‚¡8€væú¼}6–qâû}0“’ÊË}>ϲ:}iŽ^™“}¬Œ,€ï~Š"hN~uˆOÁ †7A胬øã|.¡·áA|3¿É3|M™ð°Â|…–W˜E|ß“Ë}OógV}ÑŒµNï~|‰M6‡g…\÷7{c­ߥ{f§ëǪ{‡£ ¯`{Éži–ø|+™ø~²|¯•·fn}C‘AN.}ýŒ{5å~ô†ïõ¼zʸUÞ/zDzÆCz䬮{,¦a•Ü{™ Ú}¤|$›Ye•|È•¨M‚}‘5[~‘ˆ_ôwzRêÜìzF¼2Å z]µ ¬ùz§®;”é{§›|Ù{¶ èdØ|`™ÝLí}5’P4è~=‰§ócy÷ÏÛØyãÆ@Ãúyò½ä«÷z:µì”z¸®$| {[¦@dH|åLo|ê”ã4‰}÷ŠÅòuy´ÚZÚëy—Ð2ÃyŸÆ”«yã½j“;zd´j{w{ «@cÂ{Ì¡–L |¯—34=}¾‹¶îSˆÛ~6׆‡Ä}ÂÀŸ†Ã}p©Œ…æ}U’R…*}u{„†}Æcăñ~5Lƒx~é5’ƒ(€ì=‡}ˆËÖ†p‡@¿k…ƒ…ã¨c„»„Á‘„ƒßyÔƒ”ƒ-bœƒ‚K’‚Â4Ø‚Áêz†G“eÔt…MÚ½ü„oŽs§ ƒÄŒXíƒ9Šwxʂʈ½a¶‚i‡JÍ‚&…L43‚ƒoèÛ…OþÒà„_št¼zƒŽ—¥«‚ç“莴‚r‘ w»‚ŽA`ÖÇ‹dJ—ˆh3¢‹…ç\„‹¨ Ñlƒ¤»‚ÔŸº¤[‚7›”€Â—•vºx“»`9²Iu‹e3$†{æƒñ³KЃ­º¹Í‚:¨X£2££-Œ{6ž uÈ€î™_J€¾“ÛH䀯Ž:2¹€Á‡ÏäÕƒs½øÎú‚‡·V¸µ¼°â¢/&ª¨‹Ÿ€Ä¤Šu€ƒžU^§€T—ÑHi€SÙ2`€rˆûãփȥ΂$Àâ·ÆW¹S¡J€¿±úŠÐ€aª»tk€.£\^)€›•H€“;2€0‰þソÓTÍ7ÖÊY¶úÁš ˆ€n¹Š#€°¢sÚâ¨]·ÆžýG«ЕV1ÜûŠ×Þ‘â|°Èîñ|c³±Ž|:ž;Œh|GˆŠÞ|rʼni} ]‡ü}¨G{†™~“2Q…9ñÜ*´†—Ç”ŽÁ…R²’Œô„<6‹Wƒ[‡Ž‰ä‚¶qÒˆˆ‚=\+‡3ØF¹…é¢1Ë„¢Ú£Ž•Æ9¨ŽW±r‹ÝŒ>œŠWŠp†xˆøˆÙpЇµ‡h[H†w…üF…F„Ÿ1T„ƒ4ÙBŽ›š—ÄØŒ¿—l°‹”kšÈ‰‚‘¤…Rˆ9oÙ‡Œ¨Zƒ…ØŠ&Eo„º‡0샠„¯×îᤔÇŒ  ®ºŠ[œ›™ˆÞ˜ä„:‡•Onð†k‘ÕYÎ…JŽ4Dè„=Š[0‘ƒ5† ÖµK®œÂ\‹w©­™‰Ê¤Ä˜‚ˆR ƒL‡›~n…á–âY+„Î’DsƒÐŒÿ0E‚Ú‡DÕ§ŒÐ¸£Á\Šÿ²°¬¡‰Q¬Ú—›‡Ý§*‚††›¡Šmw…z›ÐX¡„b•ÐDƒsl0‚ˆVÔÂŒj¦À†Š»²«Ïˆñ´Ô–ч{®Ά=§[lã…) ‚X6„™NCÁƒ'‘œ/Ñ‚N‰AԌ̩¿ÕŠMÄ «ˆ£¼¥–'‡-´¾7…ñ¬Þlg„à¤ÕWÔƒÙœmCx‚ô“…/§‚ŠÎO›{€º¢˜Y{Q¦ï•¬{F“ “'{s~èÆ{Új¨Žu|wVˆŒ"}9B–‰Â~P/B‡BâÌš„Ò¹—<ƒ¾¦”—‚Õ’4’ ‚$~Ó­iÚ˜cUÆ‹Y1Aü‰7.zËB™Ž!¸D–EŒ.¤ù“ŠZ‘.‘7ˆÕ} Žú‡}iŒÑ†JUŠ¥…Atˆp„ .¥†‚úÊ!˜—Ž·•c”¹£Ë’É’WŒ|Ž-Qh Œ‹)TX‰ùˆù@ò‡Û†Á.e…Ÿ„^Èÿ—f ö¶”­D¢¯’™¿Žú½–i{ ‰“3gQ‹S¾‰mŒÍ@Ї]‰a..…4…¡Çì–Øª`´þ”"¥×¡®‘’¡pŽ 91zL ™f—Šø”ÎS6ˆðt@0†ï‹Ó-ÿ„؆ÁÆû–d³¿´ “®®V ×‘©AŽÈ£ÑyžŒ¡ž§f Š“™cRƈ‚“â?熎 -Ø„Œ‡»Æ.–½³e“N¶Ä !À°|Œ’ŽiªDxþŒF¤e‰ŠDºRkˆ6—?ª†A -¸„LˆÅ…•¯Æq²Í’ü¿Ÿ‰r·Æ‹þްwx{‹û©(e ‰þ¡²R‡ý™ì?p†‘Â-Ÿ„‰@¿ ¤‡z­¬É úzš|z–ˆšzØur–Þ{Vb´“¥| P*[|é=áŒî~ ,j‰;Ó½¢£œƒp«âŸò‚|™Îœsµ‡n™%tÅ•ï€Òb ’Ç€®O‰€¦=nŒ5€Ü,Iˆ—Y¼ƒ¢©Œ6ªÜŸŠn˜ì›…ˆÏ†Œ˜A‡usó•†PaR’…PNóŽÙ„[= ‹ƒ…,,ˆ‚Ä»‚¡Ý”ì©ÐžD’[—ÙšÌù…•—~Âs”d‹Í`˜‘T‰æNfŽ4‡ú<²Šû†,‡„„º¥¡è鎚e–çš!—4„¡–Ú”&r<“©‘?_橎kMᔋ}›Ù¹Þ”V˜j³‚)•0¬Jp’ ¥‰^*ž¤L™Œ —;Ÿ‰+Å…ôˆ‰°®(z&ŸŠ©Íz ŽŽ¥~z}€¡HzjlJ!zø[˜ð{ÀJ ” |±9j}ÿ)Ћį\­R‚fžÔ¨Ù‚ޤ„€Ð|þ P€Zk¿œ2€"Z}˜€I“Ê€69!K€“)àŠk9®w¬kŠŸž§÷ˆ÷R£‡{|GŸs†Gk›]…HYé—E„sI“ ƒ®8䎛ƒ)î‰Ï‚‘­´«›’Ï.§4jŒs¢ãŽ2{{ž±Œ5j\š£ŠpYT–’ˆÁH°’`‡8¯þ…n)ú‰GƒÉ¬íªýšõœj¦–—Ô‹ª¢I”çz´ž’,i°™ùƒXÍ•òŒøHT‘ÅŠV8‚q‡¥*ˆÑ„à¬Dªb£7›É¥ýŸR‹ ¡°›™z„˜i#™f”…XV•Q‘H‘0k8ZŒð‰¯* ˆn…Ô«ž©ï«^›D¥€¦¨ŠŽ¡-¢y¯h³˜ï™TWý”æ”åGÅ»M8>Œˆ‹‡*ˆ†¥«©—³hšÃ¥­ÚŠ Ê¨ly1œž£hT˜“ÛW°”•˜|G“j’ì8*Œ5%*‡Ø‡Tªƒ©L»dšW¤É´è‰´ u®…xÕœM¨Ah˜F¢ Wx”K›µGn/•38ŒŽ‚*‡£‡ã¢á·üyÇ“²Ìy£ƒ<­ªy¸su¨–zc™£}z¬S¿žH{ƒDF˜ß|†5J“}ç'ŒÙ¶¡ä·-’w±è€°‚Ö¬¼€ s§£¨c+¢Œ‡SX]žCñ—úÖ5,’D€U'¼Œ¡?¶F‰B‘Û± ‡°‚O«Ø†Mr„¦Â…9b¨¡®„\R뜆ƒ®C¥—*ƒ5‘ƒ‚¨'ò‹p‚b ·µræ‘D°>Ž¥©«Œ•qì¥òŠÄb  ç‰-R›Æ‡±C`–q†:5Ù„Ú(!ŠÞƒˆ ,´Ç˜‡·¯’•”ªi’Ùq[¥LOa¦ 3éR#›‹›C'•Ή@4øC†ä(HŠa„Ÿ›´B %7¯œy€£©Ö™p•¼aDŸ¤’‰QÕš~UBù•8Œ4í¿ˆÁ(i‰÷…nŸ.³º§°Ö®z£@€I©LŸpœ¤5šò`ýŸ%–îQ¡š’ÛBÖ”«Žª4åFŠf(…‰ †/ž·³\¯® ©Í€¨Ò¤´p^£±ŸÍ`ž¥šúQq™š–B¼”T‘4åŽî‹Ú(›‰Y†ÏžM³ ¶g<­®°4˨sª0p(£W¤d`œžPž´Q[™H˜ïB´”“ 4ꎶ(­‰ ’üü‡Q•ìÁýy‡2»òyPx‘µøybiü¯ÿyÂ[g©ëzhL죡{O>ë|b1…–}Ó%tŽo©•<Á&€Ø†Ñ»ùxEµ\i®¯[¨ó~üL¦¢§,>½œ€1“•€%Ü”ÙÀ2ˆ†kº3†‹wë´+…;iM®"„AZ¼¨ƒ„Lb¡¼‚ú>š›-‚‰1¥”@‚K&6Œæ‚8”‘¿P.†¹Tw‚³O‹hí­<‰mZh§%ˆL% å†µ>~š_…t1¸“„„S&„ŒHƒN”B¾“–H…Ƹ’“yw3²Šêh™¬zŽ“Z%¦XŒeKø 'ŠT>k™¬ˆ<1Ë’â†3&Nj„B“ä½ý]…{·ð™Üvõ±á–›hf«Ò“’Yö¥µ¥KÖŸ}Á>_™ ŠÓ1Ý’U‡æ&þ‹R…“‰½ƒ¤N…:·h vıQœh?«A˜KYØ¥/”¢KÄžüñ>X˜ƒ-1ì‘܉e',Šõ…Æ“M½«…¶å¦ v§°Í¡Fh,ª¿œ¿Yɤ³˜RKºž‘“Õ>U˜D1ú‘qН'QŠ©†Z“¼¢±µ„ò¶t«¿vŸ°Q¦h'ª9 ¹Y̤,›ŽKÇž–W>n—º‘2‘0‹Æ'oŠn†Ñ‰•Ì$yp{õÅ6y(nf¾hy/`ì·ŽyS°xzND~Ù}46Ëé~}ð²y¹„ÏÚ-z4ƒÊÃ*z³‚è«Ï{;‚2”4{Ъ|ˆ|vBdá}.€ãMU~€Ÿ6:€hîÌxYØjxåÚÁŸyx‹Òª^zŠ’êzɈ}{d{‹‡cä|_…†L}}[ƒþ5L~›‚?íw3›1Ö®wÈ—ï¿øxh”بày‘ò‘˜yáTzAz»ŒÃbò{§ŠK¸|¹‡G4­~ ƒýëivG¦UÕvÞ¢¾rw…Þ§wxA™ìMy–y(z’rb {Ž–K|,Šo4$}…êu“±oÓ¿v'¬½vͦצ7w¡Ï/xnœæxyi—ýa9z|’ëJ_{²m3¯}‡èÚu¼{Òu•¶»ÿv7¯º¥$vû©”Ž=wä£wQxês`z— IÔ{K33M|ˆhççtœÇqѰu'¿î»u¸{¤7v‚±+`wq©øv›xƒ¢®_òyªšüI^zö’»2ü|t‰Œç'tUÒAÐötÙÉ›ºLujÀÿ£nv$¸€Œ¢w°uôx+§ˆ_jy[žŽHùz±”ú2¼|6Šâ™„x̓…xx¸ƒxá¢8‚«ydŒ ‚\z u¼‚zÙ_€ð{ÃIUâ|ì3|‚~uàႎ‚©Ì\‚æ·³?¡(e€ÁŠé+€kt  €9^s€þ€Hu€2àZ€IßQAAÊÁ€Ù‹nµ–€‚‰¸ŸÅ€Mˆ>‰²€.†ðs”€)…¾]€5„ŠGº€dƒX2V€¿‚Ý¿€(—ÅÉ%Ç”ô´|’Bž\P¹ˆtKnr‡\‹1\·ˆãGņt1Ý€4ƒ¬ÜDB¢Adz~âž{²š~ šÒ~€—J‡A~‚“Ýq‰~ª“[ï~à F{9‰m1tº…0Úú~¬¾Æt~1¨±c}î£X›ã}Ӟņ=}ßšHpž~ •Ð[9~V‘6Eô~ÂŒ;1Q†ŽÙè~·2Ål}¤±~°\}^«Çšä}C¦!…^}Z ‘oæ}’šòZž}á•E~\ŽÑ0Ð~ù‡ÃÙ }—Á˜Ä–}:ºâ¯|í´š|Í­M„‘|禛o9}-Ÿ×Z}‡˜ÃE!~‘+0“~¯ˆÎØf}JËîÃî|îÄ'®Å|˜¼5™D|o´;ƒà|ˆ¬Xn¦|Õ¤`Y¬};œDÓ}È“=0c~t‰­ÒïŒëvÙ¿’‹|wW«½Š-wÝ—_ˆþx|‚©‡æyCmцÞz4Y…Þ{FD{„ñ|¡0Z„~kÑu‹”€Á¾dŠ5€<ª£ˆôÑ–Z‡Õ†¯†Òelè…ãgX@„ý{CÌ„,º/îƒn€*Ð&ŠTй½‰‰5©ƒ‡É‡Ê•4†¿†“€›…Ð…ƒkñ„ù„‘Wm„,ƒ¢C+ƒw‚¿/‚ÔÒÎΉB”¥»´‡ø’7¨†Îâ“é…˳v„õ‹´jú„3‰ÂVªƒ|‡ÃB‚Û…¯/9‚Kƒ]͈iž„ºh‡"›4¦É†—ú’²…”Ù~d„1‘Îjƒ…ŽÚUú‚Þ‹ÄB‚Pˆy.ñÓ„ÆÌ[‡¾¨i¹L†z¤6¥´…W  ‘¬„b›í}yƒ•—ßiG‚é“ÎU]‚TœA²Ø‹.³l† Ëf‡3²D¸^…ò­'¤Ç„ΧÿɃڢß|²ƒÊh¤‚s˜ TÙÝ“=AWr~.€‡'Ê †Ç¼·œ…椄c¯Õƒj©¡{ü‚ª£wh ‚2Ti‡–¥A §.V€ÎˆÊ †uÅÍ·…<¾À£Y„·}Yƒ°%{b‚Q¨ÔgÀ¡hT?™°@ŀᑈ.4€•ˆäû•øuޱʓ²vrŸo‘wŒ”‘wÉy\©xªeþ‹Ëy¸Rˉëzê?Ĉ |k-i†$~`Â|”Á4°Ð’ƒ~Øž„m~“‹¶Žz~rx…Œ¢~ye5ŠÙ~¥R‰~ç?;‡G[-+…t€ ÁY“¢ˆ¯¢‘o‡@{Z†Нw…w–‹°„Dde‰üƒŠQhˆF‚×>Á†”‚6,ô„×ÀE’“‘Ø®|lºœKŽeª‰§Œ}‹ÇvžŠÌŠ c‘‰)ˆbP‡‡†¯>P…ï„ò,Å„Kƒ¿'‘¾›&­t˜˜1›<—•Qˆ‹‹À’‰u¨Š×bň€5P)†íŠv=í…d‡,œƒÒ„b¾'‘¤s¬vŽø «šBŒøœè‡¡‹%™5t׉x•‹b‡ç‘ÜO¦†bŽ=™„ë‰þ,yƒk…޽N˜­®«¥Žx© ™sŒv¤`†ÚФŸ¶t(ˆþ›a…‡s–XO9…é‘l=U„‚Œ5,\ƒ†’¼Ÿ1¶ÙªúޱW˜ÃŒ«µ†-Š9¦sˆˆ– Z`ÿ‡š”NÛ…””Ž=„,Ž.,E‚·p¼ß¿÷ªrƹ†˜.‹À²Û…–‰å¬sˆA¥S`“†ÆžtN†…O—U<áƒóß,2‚•ˆ'µŸ=u2¤cœ(uΓb™7vzñ–ewEp,“£x:^Fáy^LŽz¨;6‹,|D*­ˆ~T´ž)}ü££›}·’®˜'}ŽD•[}Šo~’¤}²]£ò~L 2~j:ÔŠ` *‡e¼¢­š … ‘Ñ— „ €d”bƒÑn²‘¹ƒ)\ó‚ŸK~Œi‚:}‰©»*†Ák²)œ)b¡ª™%–A‹¼{“~ŠmÝ䈜\EŽQ‡-Jý‹±…¼:1‰„J*ƒ†1‚ȱL›K˜ Å˜Q•tוv’â~’»bmû[ ”‹¥J…‹‰89ìˆl†²*y…´„°tš« Ú —°e”Ò™ú}Î’–¡lb€“R[ ŒüÿJŠwŒ‘9°‡ïˆò*p…J…¯»š.©yŸQ—5¥:Ži”U ó}%‘œ²kÎ ˜uZ“Œ‰”&Iʼný¬9‚‡„Šù*i„ò†¯!™Î±þž½–Ô¬ëÔ“ò§¾|“‘6¢ˆkHޤTZ#Œ.˜Iz‰¥’‡9[‡+ŒÄ*c„ª†Ò®ª™ºvžF–ˆ´T“£®Y|ã¨j׎P¡áYˋݛŽI6‰a• 90†òŽI*^„p‡x§¨ºtÁ—~¤Üu[‡¸¡v w›uvâg9™ÎwæVÄ–yF¡’Ezx6àŽD|*(/‰þ~H¦2§Ä} –ó£à|χ6 |·wœs|Éfµ˜Ñ} VI•'}xF7‘^~6¨m~È(K‰8Ñ¥¦¿…=–3¢ä„:†ŸƒXvj›|‚¬f—ã‚*UÁ”GÊEÑŒz6xŒ«L(dˆŠ;¤Æ¥Ï[•f¡ü‹ž…±ž>Šuªš™ˆŽeg—‡FU7“}†EqЄÛ6L‹ÿƒ¯(z‡ò‚…¤¥•j”¦¡?’ø„î…¥tç™ãŽqdÈ–JŒJT¹’ÈŠ;E%ˆ6(‹d…ê(‡pƒ«£c¤c” ˜š`„OœÞ—CtN™<”9d<•¦‘7TJ’Ž8DÔŽƒ‹'6ŠÙ‡õ(œ‡„¬¢Ï£å¥–“Š ¡¤ƒÔœV´sϘ¯™ÎcÆ•"•òS푟’ D—ŽŽ5ïŠg‰Ï(©†¦…‰¢N£ˆ­z“Ÿ·¨Àƒ]›ò£õs]˜FŸ+c_”ºšgS˜‘A•D`§–5ÛŠ ‹n(´†[†B¡è£?µH’®Ÿj¯¸‚ö›¡©ÿrø—ò¤>c ”ež‡SWD3_’×5ĉόÊ(¼††Ù™¬²lti‹<­Çtú|©:u­m¾¤³vŒ^° wO¢›`xâ@þ–vzO2Ü‘D|%ö‹·~<™±‹|<ŠåY࡬Ü||J¨B{ômi£±|^VŸ|rOQšc|û@¿•€}£2Ñ[~Œ&<Šã¶˜¡°‰ƒêŠ]«â‚ö{Ò§B‚*l袴]áž >Nó™w@‚”Ÿ€â2ÇŠ€ç&zŠ)˜"¯–‹{‰Éªô‰Û{.¦ZˆblY¡Ç‡]b?†N’˜¡…@G“Ô„2¿ŽÒƒ&¯‰ˆ‚G—˜®Î“‰<ª/ºzœ¥—Ž—kÇ¡Œ–\íœuбN:—äˆá@“!‡2¸Ž.…/&܈þƒ[—®5š†ˆ¾©“—z#¤÷”´kU e‘ô\‡›ÔBMð—5Œ‘?ê’}‰Ø2³ž‡'ˆŠ„K–«­¥¡ðˆZ©žEy¤jš¨jùŸØ—\8›J“™M¸–® ?Í‘æŒj2°ˆº'!ˆ*…–G­F©7ˆ¨ ¤Ìy†£õ YjµŸQ›ñ[õšÂ—™M~–:“8?«‘ƒŽÁ2¯Œ»Š2';‡Ü…•ô¬ü°a‡Ð¨M«)y=£œ¥Ôjqžõ †[¿še›QMZ•Þ–?˜‘4Ç2¯Œy‹l'O‡†L¼Rt¢¶ãt r±„uQdd¬v7Vœ¦wTHë ®x«;¼š˜z*/0”#|$I~0Œ¿»x{‚}¶{Bqð°{;d9« {oVm¥l{ßHÆŸ|…;«™‹}L/R“#~W$nŒdžŒ„ºn‚².´ÿÇq©¯„ c骀šV&¤c€]H”žœ€M;˜˜•€T/p’?€Œ$Í‹€éŒA¹l‰¾~Õ´ˆ5q?®Š†ÚcŽ©…ºU×£n„ÐH_²„;…—·ƒ?/Š‘u‚œ%Šñ‚‹ï¸•¾~‚³*Ž˜pç­²Œ c2¨+ŠÒU”¢‰(H1œã‡˜;v–ô†/¢Æ„ƒ%dŠ_ƒ‹—·ñ—¸~4²”ðp¡­’Kbó§xÉU[¡Þ^Hœ)Šÿ;j–Gˆœ/¶-†<%Ÿ‰äƒö‹E·pžŒ}ó±÷›pi¬o—¾b¿¦à”U0¡L‘VGô›œŽ+;e•¯Š÷/Ȩ‡Ã%Ή„´‹¶ö¥2}ű|¡p?«ñœöb›¦_˜óU Í•GÚ›)‘ ;\•</Ù5‰%õ‰-…RŠÔ¶¦«½}±±¦Óp1«¡Úb…¥ÛœúU ?˜CGÙš¡“;j”ÓŽÞ/ðŽëŠ/&ˆë…Ñ ÆdsötŠÀ4tdgþºu [i³¬uóNÜ­wB‚¦ x6Þ´z+Ê–å{õ"E޶~%Åzùt™¿Oz§h¹zž[g²‘zÛNØ«Ü{^B‹¤Ü|6ã‡},•É~*"×À‡Ä`°t‡¾;€Ágð·ì€ [J±m±Nê¶B‰£¾¥6þœtÖ,`”Í€;#UŒê€ÅÃDˆ7tp½ †ºgƶ҅t[)°P„tN¬©¢ƒ´B…¢·ƒ7›}‚Š,ž“ð‚%#ÀŒ3߀ûÂSޝt[¼*Œ£g°µ×ŠÏ[ ¯V‰-N ¨¦‡¹B‰¡Í†e7/š¤…,Ö“0ƒæ$‹˜‚Ö€ÜÁ”•tK»`’~gªµ [ ®ÂN §Ö‹˜B” ü‰ƒ7J™æ‡u-’Œ…{$h‹ƒª€½Àù›bt@ºº˜#gª´S•[­Î’N©§+5B¤ ZŒd7e™C‰—-3’†Ý$§Š¬„\€ŸÀ~¡rt9º3Œg¯³Â™»[­5–N³¦—’B²Ÿ×Žú7|˜Ê‹y-X‘ˆ$ÚŠU„À§Pt8¹À¢³gº³Dž[-¬²™´Nɦ•rBÏŸ]‘=7š˜c-x‘=‰%Š…eæ·v±shÑUw“tK»†xpu4¥:yHv*Ž¡z$w9wï{xeaO|yªJÏ}={(4¯~»|ÿäµt×~sϳuá~+ºvà}ú£íwÛ}çpxÛ}ôvÚyê~`S{~JI÷|_~–4}û~üâåsM‰ŠÍñtiˆ¸…u†Ä¢}v•…¨Œ+w³„¯u¿xâƒË_dz&‚âI4{•õ3p}L€äá(qü”Ì3s#’¶ÔtF¥ ýuqkŠØv¬‹jt w÷‰s^}yW‡iH€zá…<2ì|¯‚²ß”pèŸzʦr›óµKsA˜ˆŸŒtx•B‰uÄ’s‹w* ]¢x¢‹ÕGÛzCˆ_2z|$„^ÞApªUÉYq?¥×´rn¡ažNs¬ˆpu˜Àr‡vw”|\×xGFy¼‹V2{­…ãÝ+omµÈJp˜¯¥²ïqª As¤©‡teŸGq»uæ™Õ\'w”%FÈyJŽ1É{G‡;ÜRnó¿ºÇvp¹M²q>²¶œ\ry¬†¤s᥎qupžò[šw˜F\xë”1†zóˆfÛ³n¥Ê#ÆÚoÆÂ²±apÝ»›œr³;…êsu«~p`u £§[v½›wE÷xœ’Æ1Qz¯‰a× rÚs9¯€(tNšÉ@uh…ªdv—pb–wå[3ØyNF€>zõ1~€Þ|ýÕ£}f|™Âr}‹|š®h}³|£™¸}â|Á„ž~|ûoi~m}OZQ~Ñ}²Ef]~71€!~äÔ#{ó‡À×|(†¬í|`…˜R|©„(ƒe}ƒkn\}p‚ÂYq}ñ‚D¸~˜p0‘u€´Òžz²‘t¿Dzïi«`{5n–õ{Œ‹Œ‚.|‰ÔmU|‰ˆ%XŸ}%†fD}ç„‹0/~Ü‚gÑ.y¨›Æ½Ýyê˜Í©þz9•Ý•¢z’ü{-l[{ÀtWÝ|sŠ—C}L‡/Ú~Uƒ÷ÏùxÙ¦¼¬y¢0¨ÒymžB”ƒyØšZ€zd–}kw{’œW-{ÙŽžC|ÈŠI/’}â…aÎýx5°L»³xz«}§×xǦŒ“Žy4¡”'yËœ¦jÁz„—¥V˜{V’mB«|WŒÙ/W}†ŸÎ9w¼ºhºïx´ª§xG®®’¼x¯¨›~ayK¢ŽjzœmVzñ–BR{ú)/&}0‡±Í¯wjÄ^º\w¬½¦¦_wè¶”’xE¯Z}¹xà¨$i‰y¯ ÖU¤zš™·^‹- † Àd€Æµ*®¦€%° œ-‹ª¡‰6¥ v2~ÙŸxcG~Ì™×P¸~Ò”>pÂ,ðQ‡¿í€t¾¡®Õ¸˜›Š1²ˆ‰~¯«_u–~o¤¯bÊ~iòP[~}–ü>2~»,ׇչw®pF©Žæq’—øLrІ‹ÔtsÑŠiunaZ‰vòO‡¥x›=†Pz+¦…|ó¸~Dy•¨,œyê—ŒzC…7Чz®r÷‰J{6`•‡ü{ÝNl†°|š<‰…u}ˆ+~„C~²·zù‚˧Œc‚?•ûŠá¶„,‰…Kr ˆ;€ù_͇€¾M̅ЀŒ<„®€j+Zƒ“€T¶hŒÅŒ¥Û‹9Š”Ã‰È‰6ƒ&ˆp‡éq‡=†¶_†…M4„ÿ„b;»ƒùƒ,+:‚ù×µN‹Ì•&¤×ŠC’ö“»ˆÙÁ‚‡Žp,†dŒh^>…[ŠOL „Rˆ;aƒ^…È+ ‚sƒ6´Z‹ žI£à‰‰›M’Ȉ ˜9-†Û•o`…¶’]”„­ŽáL$ƒ·‹©;‚Ùˆ4+ ‚„m³’Šv§U£ˆ÷£‡‘ÿ‡ŒŸŒ€j†F›|n²…)—j] „)“FK¿ƒ2Žú:Ø‚fŠh*ö¡…|²öаH¢wˆˆ«¤‘T‡¦¹À…Ì¡¦n„±œ‘\€ƒÀ—gK]‚Ò’ :¢‚Œ^*çR†b²ˆ‰®¹!¡úˆ8³ŸÂ†Â­³)…l§mŽ„N¡j\ƒa›0K ‚”Ä:kÄŽ *Ú‡«Z™Ào»œ#—+q ŒN”ÇrQ{Ò’s¢jëCuYߎv©I‹¶xf8š‰dzs)‡|쪓˜x›q–xç‹“§yX{‘eyÞj:/z„YAŒþ{KH”ŠÂ|,8Hˆ„}B)†5~™©Ã—C,𔨀¾Š²’‚€^z:O€irŽ)óX™Œ åH‰ãâ7þ‡ºù)…€'¨Õ–+‰´™€“ň‡‰¥‘z‡ey[H†Oh§6…YW÷‹*„kGž‰ƒ}7¿‡‚Ž) „ß“§ö•+’K˜›’Ð]ˆ½ŽqxtŽfŒ„gïŒOЦW`ŠYˆÕG5ˆX†ò7ˆ†]„ù) „U‚ܧ*”ršß—å’˜1ˆ וpw·°’©g<‹£äVЉ­Fχ¼ŠA7Q…Ô‡8) ƒàƒþ¦“á£S—6‘Ÿã‡ZIœIw ˜f§‹”îVX‰)‘1F~‡5R7(…^‰>) ƒ„÷¥÷“t«¥–ª‘%§l†ÇŽÛ¢òv}Œ«žTf Ц™²UåˆÁ”üF/†Ò 7„ý‹) ƒ/…Ê¥•“#³Þ–<×®Ö†Iއ©juüŒN£Êe¯ŠDž'Uˆb˜sE높™6Û„¹Œ‹) ‚ï†wÍ£ o[¥Ÿµp£€ùœ‹qîq™ssJb4–StÇR‘“#vpCJØx>4hŒqz_&¢ˆá|ä6¡ôw£'žªx€p›}xq<˜`y'a³•ByæR’zËBïŽÝ{Ì4A‹†}&ˈ~€œ™ ÉÄŽjŽiÇš`"w»¢ópŽ—La”:~ÿQ¢‘$B•öF4в’&ð‡Hû›âŸ²‡Æœ~†·~ê™[…¸oÕ–I„Ô`s“H„Q CƒXB>&‚¤3û‰õû'†¡T›"žÏ´Œá›žù~,˜€ŒHo•sŠ£_ß’k‰P«x‡xAôŒi…Þ3à‰L„9'*†‚‰š…ž—±ŒBšâ•D}—Æ’În~”·T_W‘²ÝPHޏ‹hAµ‹ºˆç3Ɉµ†H'@…˜ƒ—™üyŸ‹ÌšVœn}—2™)mÿ”•Ô^Ý‘’ƒOéŽ.)A|‹,‹¸3´ˆ9ˆ#'S…3„~™Œ§D‹Z™ï£i|Ÿ–ÅŸPm‹“¦›^s¨–äOŽÂ’¢AAŠÅŽG3¢‡Ô‰Ä'b„á…@™8œÄ®ÚŠÿ™Ÿª<|9–n¥@m$“H ^FšõOJa•ÆAŠq‚3‹‡Ž‹!'n„ …ßoƒ·¨~pBv¤qŽh šrôYÚœŠtK˜˜Wv9=Ê“ùx0ƒezN$Š™|Û…«›vÚƒl§‰wCuÊ£‡wËgÉŸ…xxYŠ›qyPKW—DzR=’ï{r0ˆŽj|Ð$Љ±~hªy~y‚æ¦r~)uU¢k}ögMžl}óYš`~K–A~Z=m‘ú~²0‹ˆ3%ˆæÓš©`…ð‚P¥^„ût¯¡_„fÄaƒdX¦™e‚ÏJ¬•T‚M=;‘Õ0ŠŒ¿q%Qˆ6¨vX¤y‹Ãt Š?f1œƒˆÍX7˜ƒ‡qJY”ƒ†%=Y„Ô0ŠŒƒ†%„‡Ÿ‚=ŽŽ§Ã”¹G£É’ƒs¤ŸËKe½›ÍŽWЗ͋òJ“‰Ì<즇£0Œ‹r…l%®‡!ƒ:Ž-§$›û€â£0™s>Ÿ1–+e[›2“2W|—5:IÝ“-<<׊30Šç‡%Ò†¸„צ½£€­¢ÇŸ‘sž¸›Òeš¢—ûW7– ”.I’¬_<¯Ž•Œ†0Š|ˆ˜%î†c„Å“¦rª€j¢r¥Õr¾žY¡?dΚ=œ‡Vú–7—ßIq’D“7<–Ž:ŽŠ0ŒŠ1‰Ô&†…W„»¶Fnªxa±ƒoÚkƬÈq&^é§ïr–Që¢ßt1E“uÿ8§˜ wõ,ô’8z="¢Œ'|Ò„µnvxJ°™vxk««¾w^ͦÍwÇQС³x¸DõœkyÙ8¬–ë{-%‘'|#‹0~S„L´M};wú¯}|ñkhªš|Î^…¥¥|èQ” }/DЛU}ž8¦•â~&-N3~Û#xŠX¯„³(„.w›®\ƒMjù©~‚^-¤‹üQJŸƒ˜D¢šVM8›”ô-o[€ò#͉ž€çƒ­²0‹wC­h‰žjœ¨ˆF]Ì£š‡Qž…çDv™t„Þ8” ƒØ-ŒŽž‚à$ˆÿûƒY±u‘ìv÷¬«æjS§Êå]†¢Ô‹óPËËŠDS˜©ˆ@8ˆ“d†o-¤ø„¡$Rˆz‚胰嘞vº¬–j§+“P]N¢/¢P—*ŽD6˜ ‹h8‡’¿ˆÌ-ºi†/$„ˆ ƒ²‚Þ°iŸvŒ«˜›ái릧˜|] ¡¦• Pnœ ‘ªD—ŽF8z’BŠæ-ό$­‡´„Y‚®°¥‚v…«;¡ ià¦5i]¡™PXœ ”ëD –ýÊ8ƒ‘ÏŒµ-⌛ˆ¦$͇m„áyÀ0nem}ºËo€aεJpÇV ¯€r=JG©\sæ>¸¢áuÉ3ÊœwÔ)¨”íz1 ú‘|Éy¿iuom—¹äuÁaç´3vQV"®GwJ_¨x'>Û¡›yg4šØzË*“Â|q!Œˆ~>y¾>|m¸¹{ÏaÖ²ÿ{µV ­ {éJU¦Ø|R>æ j|ì4(™µ}£*U’¹~‹" ‹£Žy½‚m\·¹a¡±ÉUç«×€¢J<¥±€m>åŸR€X4E˜°€Y*˜‘Ï€~"yŠß€¹xç»õˆím?¶s‡•a€°º†aU¿ªÉ…QJ-¤¥„k>æžYƒ¦4`—É‚ê*Ò‘‚H"ÖŠ8¿xÆ»&Dm-µ™gat¯Ø‹™U´©å‰ãJ"£ÅˆG>ìy†Ã4z–ý…K+Rƒå##‰¬‚ x¨º…•lm$´é“ap¯–U°©%Ž2J £ ‹å>ôœÊ‰¦4“–N‡q+2½…Q#b‰:ƒ]xŽº ›am"´]˜jas®•PU±¨ƒ’6J¢n4>õœ;Œ?4¤•ɉY+VB†‰#•ˆÝƒúx{¹´¡&m'³ê‘a|­þ™ÀU¶§ø•èJ$¡ã’/?›¸Ž‰4´•YŠ÷+mŽè‡‰#¾ˆ“„yÚ¥qðm*ƦsQnIJ+t¤pW uêq釴w0s‰r&x…uB\µyówGm{”y#2­}Š{“ضoÛxÅqkx‰°Ærãy›ätOy’†”u¾z4q"w=zë[ÌxÔ{¯F­zž|”2%|¹}¤ÖïnƒÃ[o¿‚Q¯DqT®š{rÞ5…Wto€×pv€ŠZêwÑ€=Eýy¿ô1­{ûÕ4lÏÁnEŒ ­’oìŠc™q‘ˆÖ„ sC‡unûu †Zvé„¶EZxøƒ81D{QzÓ¢kG˜}Àm•Ŭ n½“—Œpr…‚Èr;Žmít!‹œY?v‰DÅxJ†X0éz¼ƒ2ÒXjI£¾ÏlŸvªÈmɛȖToˆ˜#«q_”ŒlôsVöX€uoGD?wµ‰J0œz;„ÁÑPi­—½ËkI© ©¿m¤X•MnÅŸ€¾pªšîl-r²–2WÝtÚ‘CCÏw6Œ0[yφ"Јhï·ì½j¶²w¨ëlh¬¹”qn'¦Þép¡ kxr+›-WUtd•CovÎŽ{0'yu‡SÏþh¼|jS»”¨Hk÷´Ä“»m­­Ç8o˜¦ÍjÞq¸Ÿ¿VÒsý˜gCvv¢/ýy,ˆSËÄzl$¹—zžmò¦½{(o¨“,{¶qT"|Ls jê|ñtßVÖ}«vÐBé~y/š·{˜Ê`x/v‹¸}xàw<¥­yˆwé’'z0x~(zâydj{©zBV|‰{2BN}—|I/9~ç}“Èèv‚€Ý¶åwI€¤9x€*ÇxÌê|öyŸ¿iz‹¦U:{A²|¼ƒ.ã~+sÇdu ‹ µSuቼ¢«v°ˆppw‰‡0{Åx}†hy‡„öTtz©ƒÓA&{ù‚.˜}„5ÅùsÓ•'³ðt°’ò¡Ku޶ŽvwŽ}z¦w{ŒOgx¤Š1S½yá‡÷@©{M….X|ò‚ÒÄÎrÜŸ9²Çs¿œ$ &t¡˜ñu”•¶y§v§’~f:wÝCSy5‹ð@:zºˆU.!|u„FÃÝr©2±×s¥:Ÿ3sá¡ ŒtØœÇxÑuø˜„e‰w>”0RŽx¢®?Þz>Šà-ô| …Ã'q‰³±ro®(žksK¨ø‹Lt?£ŸxufžFdåv½˜ÚRx1“1?yØ*-Î{´†¦Â®q*¼¥°–r ¶ÙÍrܰœŠ¡sƪ'wotí£®d]vL!Q¢wΖS?=y…$-±{n‡½`‚{kR¬Ý‚m?›‰Üo ‰^®pÈv­Œr”cÈxtQrv‹>‡xÝ,³Ø{›¼I€¶u«É€‡všc€_vÚˆK€Fw¶u²€;x¢bî€Dy§P[€]zÁ>€š|,y}€»&~ÙªŒ~Æ™X~ñ~°‡6~ï~£t¹~û~«b ~ÅO´Z~æ=¼,F€II¹Ó}­ˆt©6}¥‡…—æ}¤†Š…÷}´…‘s}ᄯa0~%ƒÔNÿ~{‚ô=~ú‚,¢€ò¸’|‘ü§ö|9–«|‹Ž`„Ì|ªŒ{r¢|䊜`^}EˆÈNb}µ†Þ<¶~O„Ì+ò‚v·†{“›¦ì{š˜ê•¦{©–'ƒÒ{ГOqÁ|s_£|€’MØ} Š›<]}¼‡c+Ò~•ƒÐ¶¯zؤî¦zä¡”ÉzòÍ‚û{™÷q{n–_{æ’1Me|xŽ<}@‰Â+·~-„þ¶ zK®8¥fzZ©í”zd¥D‚Czˆ fpSzᛂ^p{k–ŠLö| ‘`;Ö|Û‹à+ }׆µ¡yì·W¤æyü²*“zyú¬}¤z¦ŒoÂzk ”]ùzûšˆL–{ª”F;“|‹±+}“†×¯f‹;j² N‰ôl¨Yˆàn~ƒ‡îpGn)‡r#\ †)t#KW…QvI:@„x»)ûƒì{œ®Š‰’sêŸjˆté]‡„uÜ~”†ŸvÔmO…Èwá[ã…y J¹„AzJ9Ùƒ{»)çƒ}m­“ˆ |ÿžH‡}#Ž[†%}>}‘…V}blo„”}™[,ƒæ}åJ-ƒD~;9‚‚¿~¤)Ö‚R ¬‚†¥† (…º…`)„á„¡|˜„ƒçk–ƒqƒDZ„‚Û‚©I±‚X‚ 95öi)ƨ€±«c…Žþœ,„š”Œ/ƒÍŒ {ŒƒŠqj­‚zˆÜY¿‚‡UI#–…¼8æJ„)¹‚ªv„—ñ›9ƒÀ•À‹?‚õ“^z¯‚CÝi豎XY">‹ÓH³€é‰=8¤€¶†o)®€˜ƒ_©¶ƒê ÇšvƒÍŠ{‚HšŠyî——i9“£X˜€§"HY€TŒƒ8o€8ˆ¢)¥€0„w©%ƒd©€™Û‚•¥¸‰ÔáŠyH hŸ€ƒ˜ªX €.”(Góé†8AÒŠ—)žÛ…e¨Äƒ²™d‚<­}‰E`¨Ux³€˜¢Üh€bW¨¾—ÝG¨‰’48ƒŒC)˜–†)¡å”jN“ï’l?…--nuœŽvoìe—ŒÁqÕUm‹ sæE–‰Lv6 ‡—x¦'v…é{›¡5’šs“>µt„eŽîu tà:vdê‹w?TÚ‰æx…Eˆ=yæ5džŸ{~'ˆ…}Y l‘){’I`{ц£{þt‹ÿ|Ed(Šd|£T<ˆÕ}Dª‡D}œ5Œ…À~<'—„@~÷ŸzÛƒï‘HŽƒr‚tŒn‚îs$ŠÒ‚jcd‰P5±¦ÕûS¥‡Ø–DC†_45Y„÷€Õ'¤ƒ‘€rž•Ž´ŒX\Œÿ‹#‹‹_‰Ûr@‰Ïˆ…bµˆP‡6S†ñ…óCä…‘„¤5,„CƒC'°‚úÈÍÚ”¿¨Œ.’Ó€ÚŠŽ½q…‰ŽŽb‡‹Œ\R†0Š*C…„ä‡ê4ýƒ¬…‚'º‚z‚õ)/Žü‹Šš[€-‰è—rpÞˆY”bap†ì‘LR…™Ž+C<„MŠò4Ûƒ+‡‰'‚ƒøœ©Œ¯¥Žu‹¡¶‰hôpR‡Ñ™ù`í†f•õQ¦…"‘âBìƒß¶4¾‚Á‰S'ȹ„ÓœOŒS­Ž Š·¨ì#‰¤AoÕ‡eŸL`…ôšQQS„´•IB­ƒ€&4˜‚sŠÖ'Ís…‡”ã$iý‡Ûš]käz-—Èm¿kוCož] ’²q–NUs¸?ñ[v1ùŠ™x›%+‡É{—”U›Ýr3‡X™0s=y™–œtNkM”up\¤‘ƒv¯MïŽíx?¦ŒFy’1≗{L%a†Û}E“·šz8†•—ëz‚xî•[zÓj ’Ü{;\[{¾M|Ù|\?Z‹G} 1̈¯}ß%† ~Ð’û™:‚…Ä–®µx ”-Si둵€ÿ[pJ€ÀMŒÝ€‘? Ša€h1µ‡à€L%¹…T€8’:˜,‰à… •¦ˆÚwR“-‡Êi,½†¶ZèŽP…¦L˜‹ù„¦>͉‘ƒž1¤‡(‚%Û„·y‘š—H‘³„g”Ðv±’YŽ4h˜éŒPZcŠkLA‹'ˆŠ>™ˆÔ†¢1•††„¢%ù„3‚“‘–¡™cƒõ”0— v?‘²”th:‘¹YéŒÙŽýK⊋Œ=>gˆ8‰o1†…þ†€&ƒÆƒ„«–' æƒ†“¸ßuÊ‘4š|gªŽ²–äY€ŒR“JK„Ч>)‡Ä‹ö1y…ˆ"&$ƒl„O]•Ψ?ƒ/“^¤†ugÑ KgFŽE›ËY*‹à—IKD‰¡’Á=û‡cŽ-1c…@‰€&4ƒ%„ôˆ€¦li§|Q¢øko£Ÿ¥m]bvœIoGU˜ÊqPG••)s…:¡‘fuâ.;x#!‰€{“ˆ¥Wql{ü¡èrsoGž‚sb#›tÃT¼—”vG_“ûw:„Cy>.OŒo{#yˆ„}1‡ ¤ xò{k ªyEnÌDy«a¨™Ýz2TW–fzÙG’Þ{¢:`8|€.\‹z}‡#Ƈ¨~¬‡¢Ä€JzÍŸl€n œ¿a ˜²–Sâ•MˆFÆ‘Ø:7ŽG£.eŠ Ë$†é€†…¡³‡‘z<žc†¯m‹›…Ë`Œ—³„ëSy”Q„Fwðƒ^:q‚ .l‰àæ$@†F2† áŽÎy—TmšA‹Ã`–äŠ(S“ƒˆF=†þ9÷Œ¯…m.s‰8ƒÒ$o…¼‚;…¢ -•æy\œë“Ïl¬™”‘‰_³–6*R¼’ÙŒÉFxŠe9ꌇý.~ˆ¥…ˆ$–…Kƒ…PŸ¶œ×y,œtš)lz™— _t•˜“åRz’6°EÃŽé9¿‹…ŠM.ˆ0‡$µ„ïƒÙ…Ÿa£œxKl4˜£œw_+•$˜bR=‘¾”WE˜ŽsR9§‹ŒO.~‡ÛˆF$΄¥„r|¾¯ëi?qK«×k e‹§ÂlèY|£‚nßMHŸpüA/šLsI5§•cu¿*ÎDx„!W‹ {|m¯pq%ªØqeh¦rÁYb¢Bt M7»uA-™ w%5»”,xë+ zî!Ί}|%­¿w¬pÈ©™xe¥Xx|Y üy$Mœ}yòA—Üzè5À“{ù+=Ž}5"6‰~‹{άq~„p^¨Q~Md¨¤~*XŸÄ~,L¹›U~S@é–Æ~“5½’ ~å+f2T"ˆPÒ{p«U…Ip§<„ŠdG£ƒÓX]ž¶ƒ'LzšJ‚˜@À•Ï‚5·‘)¬+‡ŒgI"Û‡¥€ó{ª~Œo³¦eоcþ¢,‰dX؈ L;™o†»@¡”ò…}5³^„E+£‹¶ƒ#‡ízЩג–oy¥»ÃcÆ¡zŽÁWÜŒ­L˜»Š£@ƒ”Eˆ¢5·¬†¥+½‹„¦#N†¡‚ÁzŸ©O˜ïoK¥/–Šc“ è“ÝW©œˆ‘ KÕ˜$ŽB@W“¼‹|5¨%ˆÀ+׊œ†#x†Aƒqzt¨ùŸ&oM¤Éœ9c l˜ÇWŽ›ò•Kׂ‘‚@V“Ž5³Ž¨Š‘+éŠ@‡)#š…õ„q¹£hÜf«µj’[Ű1lmPʪÿnpEÐ¥ip¢; Ÿs 0ò™Xuœ'£’éxzÂŒr{‡qD¸äo×f«´pÈ[Ô¯qñP䩪sNEñ¤tã;=ž%v¬15˜x™( ‘®zÄ W‹W} q(·¢vsf€²ÊvÉ[º­°wLP̨OxE뢳y ;NœÞz11c–Ò{v(_•|è ׊b~mq¶C|ÏfL±o|¢[y¬[|™P£§|ÃEÒ¡t};O›²}›1…•¼~/(¦~ä!E‰§pÞµƒf&°B‚p[Q«/àPt¥ÛgEÁ S;Pš¦€è1£”Æ€Ã(ãŽÄ€·!£ˆÞ€ºp¸´,‰Rf¯Oˆ6[Bª5‡Pc¤á…õE°Ÿ`„ð;U™·„1¾“ëƒ*)Ž‚^!ðˆH§p—³y`f ®‹È[>©fŒ P[¤ŠAE©ž—ˆŒ;Z˜ø†é1Ù“0…U)FjƒÒ"0‡Î‚op~²õ•7f ­ð“![B¨¼ÀPY£_ŽEEŸé‹Ü;T˜\‰…1æ’ ‡C)kŒç…"d‡jƒpm²–šÙf­r˜=[M¨,•1P\¢Ç‘üE£SŽÜ;`—ЋÔ1ð’'ˆå)}Œ„†"‡ƒ›Î¡mfú»ènìi=¨µp­kq”êr^mœ€µtoÎlVuÚrX w¿tDyßw'0É|Yz>̾j´qźjlÁrä§`n­t“¾p‹u0¤rnvgkbtgw³WIv~yCtxÏz›0b{x|bÊùh§|~¸´jÒ|¥èlä|’^næ|¶~ppò|ój\s}AVtu[}–B×wÚ}û0z¬~lÉ;fׇ ¶øi† ¤9kD…ëmh„5})oœƒviNqê‚¿U¥tX‚BEvÿ=/·y÷€VǧeP‘{µqg¦‹¢¶iåž|l‹»{õno‰èhLpãˆ(Tâsu†SAÁv@„Z/ryX‚Æ_d›Ö´2f}™¡}hÆ–ŽMk“/zámtLgdoþjT3r²ŠxAKuœ‡I/8xσ´Å[c&¦³5e¢[ }gÜžrQj.šxyýl¥–†f¥oD’ˆSŸr Žd@êu‰þ/x\…Ä™bp° ²vdÜ«Ÿ²g%¦”Œ€iw¡„y3køœyeøn¬—bSq‰’@—t Œo.àwý†UÄa÷¹ë±ôd`´RŸfŸ®W‹Øhè¨-x‘kk¢emn)›ÐR§q•\@?t@ŽŒ.Àw°‡ZÀ‚tÿf4¯uþh¦åvÿjõ‹xxm0xŠyosekz.qÐR|{itP?Ä|Öw-Ó~zK¿'rÈp{®sÿqÔœãu#sŠ„vFtgw£wtu½dx¾w*QÏz%x®?E{Äzb-Ž}¯|X½¯pÑzŸ¬êr'zò›ssj{@‰(t¯{™vxv|c£wy|Qy }>ºzÓ}œ-R|ä~H¼(o„™«Yp‚ƒþ™éq݃^‡Ûs=‚ÁuPtº‚;b°vS¼PPx <>Ayû€¶-|0€º»mŸŽ{©øo˜p‹‹z†r‰èt?s“ˆ^aÌuQ†âO¦w+…T=Ôy>ƒ¨,ï{“¹’lu˜S¨Ômü–—oou“†…{púùsGr Žlatq‹ÝOvk‰?=tx†j,É{ ƒ@¸¦kˆ¢ §èmžÜ–‚n’›l„–p—ÝrxqØ”M`Ws¼¯N“uÈŒï=&xˆñ,©z„·÷j׫˜§4lg§ˆ•ÁmᣃÔomž‚q¿q0™å_¹s*•9N uI_<âw¥‹6,z@…¯·†ja´è¦³kí¯í•)m\ª|ƒ2nà¤Ïq)p¥Ÿ _|2s§o„|­u]Ê}@v¬LO}êxT;"~Âz-*æÕ|L°œy(xá¡*y«yr‘ z$yù€z«z~n•{D{]{ú{¼Kº|Ë|r:Ã}Í}?*È ~%¯Fwz‚KŸÐx‚¡x¥®~ÏyDQm…z\'zÝ€¼K{Ò€w:^|ø€0*®~TÛ®v‹¡žvºŠŽŽfw`‰\}¤xˆl•xä†Õ[^yá…œJƒzõ„V:|<‚ö*—}·k¬útø”ðˆu¨“fvVø|°wŽÆk¸wøŒŽZ°yŠRJz7ˆ9¼{›…Œ*„}1‚Ь&tžœ±tÌ›kŒu}˜l{ávD•Ejþw7’ZxUŽØIy”‹|9€{‡ç*u|Á„«‡sh§$œ t$£™‹ÝtÓŸ«{2u™›…jYv–—VY‹wÉ“I7yŽ®9Kz¤Š*h|e…«rò¯ñ›Žs®«‰‹MtT¦¢zœu¡uiÒvœ>YwK–öHÛx­‘‚9 zL‹Ì*^|…쥋…|e;—„ÈgȈ„Dj,x¶ƒÞl{hQƒƒnØW½ƒ3qWGr‚ðsþ7r‚Ìvô(j‚Ôz\¤¯ƒˆnS–•ƒo‚¯qtwÆ‚\rög~‚tˆW åv4FêÁwü7#Àyù(kè|>£°ÀwE•hpx †#x»vÀ€éyofŸ€¿z/VZ€­{Fh€ª{æ6Û€Í|ä(k~¢›€€#”H߀ …S®€u܇âeÚzËUdž¾F¦µ6¦ñ¬(k€^ ¡~ˆï“K~–ˆ/„Y~s‡ItÌ~]†Jdú~d…MU ~’„XE}M… A~σY6_5‚G(k¿ –}²‘³’\}‘1ƒq}uŽvsô}jŒ—d9}~бTv}·ˆÇE~†Ñ6(~“„±(k8‚eŸÙ|ÙšR‘ž|˜ ‚µ|§•vs>| ’±c•|ÂàSõ} DÅ}kŠ 5þ~ †â(k~ǃ†ŸJ|4¢È‘|$Ÿ»‚|œCr¢{ü˜Œc|$”ÈSs|€òDj|ñ5Ø}˜ˆÔ(k~k„{žè{À« ‘{³§4Ž{¢Ñr{yžb{¡™_S|”ŽD|‡ž5§}BŠy(k~!…E˜Ž1dé‹©Œ®gl}Ý‹hiÐo:ŠAl(`‰n‘PÞ‡ùq Aú†×sÙ3r…Évæ%ÿ„Õza—èŒjmyŠð‹!o}‰òp®nˆÓrE_z‡¼sïPY†¯u¹A˜…¨w¡3F„¸yÅ&!ƒà|0—Š´u߉õ‰’v¹|1ˆtwŠm¦‡kx_^ÆkyFOË…zzDA6„‘{U3ƒÁ|‡&>ƒ}Ý–"‰#~ˆùˆ~G{&‡ ~_lÙ†~q^….~OJ„[~¸@惑~ê2ý‚ã%&X‚If•5‡Ë†Wˆ†È…ÒzG…Ò…+l„å„n]|„ ƒ±NÛƒVƒ@ž‚«‚P2à‚“&n¦€È”k†Éއc…ÑZy „Þ‹ìkIƒöŠV\σ)ˆ¼NZ‚|‡)@Gê…Ž2¹yƒÔ&€‚“Ç…û–Ÿ†·… ”¶xõ„’zj¦ƒ3 \7‚q“MãЋ@Cˆ2 €ì…Ý&€©ƒ “G…_ž†2„y›âxhƒ˜Ój‚“•~[¹Ô’!MnF޼?¸€Æ‹J2Š€x‡©&œ€Kƒï’ì„ï¦:…É„¢åwïƒ ž÷i¥‚š¯[SO–dM#€Ç’?ƒ€Yµ2m€‰-&¦€„©Œ(—d­€”Ðg sY’ÔiƒeßèkãXŽënWJŒápö< ŠÍsÀ/œˆ¼vß#̆·zc‹Ž•xl‘“nn`rÁ‘woýeY‡q¦W’sgI‹—uL‰c{å"Œ†r}œ~ž›µz›sI™zóg‡–h{L[p“°{µOò|4BàŽ+|É7;‹S}o,Oˆx~0"Õ…¤~ÿ~švÁr±—àˆfï•=BZÜ’€öN³Ù€»B–*€7Ši€j,\‡©€P#„õ€;}}™~ˆÝr4–ñˆfx”O‡"Zh‘ †NMŽð…BeŒ@„(7‰—ƒ8,i†õ‚A#F„aN}˜®ÎqÇ–*Žlf “‰ŒÍZÛ‹ MõŽ2‰HB-‹Œ‡†7ˆß…Ç,y†Yƒý#pƒç‚9|½˜–•q—•ž”¨eÛ’ï’NYÆ*µMº}"AîŠíŠ˜6؈Uˆ,€…Û…#’ƒ„‚ý||—´(qW•,š¦e•’s—ŒY¦”!MŒö¾AÇŠje6ÇâŠ,…}†Ã#®ƒ5ƒtë©PcèjO¥ãf=_`¢rh¡TžÐkH¹šîm¾=o–Ùp2¾’ŸsŒ(ÀŽHvÙ "‰øzbtu¨5k#j¤¸lº_-¡$nnSÿjpDH©™ƒrB=t•ytn2Ý‘Ov½)yL žˆÛ|t¦¼riŸ£Is ^ÙŸµtS±›ýuSHt˜#v­=_”.x02ëyÎ)B‹ö{›! ‡â}~s¬¥Ùt(‚o.wþº]^”«©©`c’—˜CcHl†Vf+Ž;t)i0Œaèld‰çOþȯµ>tsw…[-òwn‚¿¹w\-ž¦¨®_A›®—Mb0˜‰…ke#•SsShA’!a7k‘ŽçO|o‹’>#rሠ-Ðvö„0¸±[D¨n§ð^a¤Œ–‹aS h„ªdLœ%r›g{—ç`˜j哟On‚-=ÜrfŠv-µv’…m¸3Z¤±ê§p]­ •û`®§Ü„c¤¢r fØC` jR—ëNŸn’b=‘qþŒŽ-ŸvB†wµ~o®`^¥£q&cc•rfBƒÇti qõu£kÚ_ôwInÅN1yqØ<¸{u8,-}py´mjy¤”nÎlp”ptnR‚Þrp/qsÏr_;u¨tMžw§v2uŠŽË6£x‰ü)Gz³…›è_ÑŽÃzb〾ƒeÌqÚ©hŸbmÞk~RÖ€$nC—€q±4¹u7&øÄy7šú}Gh¿Ó}kjé¿}Ÿlúpó}âoa¦~8qR7~¥sTC#*u«4€ÞxA' €Æ{*™ð{&q‡Œ¤{{rà~¼{Ît&oú|2ug`Ù|«v´Q˜}AxB¸}ñy4N~Ò{.'å|û˜Ïy6z?‹wy­zÓ}Œz!{LozŸ{Á`{?|9Q{ü|ÀBZ|Õ}R4%}ã}õ',~¦—¯w˜‚ÝŠ|x%‚º|’x±‚nnyH‚ _Jz¦P]zæLAæ{å€ñ3î}€’'9~u€)–¿vN‹o‰‹vêŠ{ªwƒ‰qm9x+ˆ2^Šxø†ìOÒyñ…§Aˆ{„^3Á|f‚ü'C}䀕ÿuA“؈Ìuê’5zñvŠElŠw>Ž&]íx‹ýOXy,‰ÌABz\‡3£{Ð…+'L}l‚©•ltqœˆ5u#™©zUuÅ–Þköv{“×]cwhÅNÞx¦@ðyÒŠv3…{U‡'S} ƒ¥•sÚ¤‡Át’ ÞyÔu01kvuâ™:\övÒ•8N‹x‘*@©y\3Wz÷ˆ½'Y|º„u—‡ï_©ƒw‡b¯vˆ†ie–hÍ…ÛhoZ˜…RkXLE„Ïni>[„Wq¦0åƒýu<$¥ƒËyBŽË…Éh‚²….j@u¸„¦l^h„,n{YÿƒºpªKуXrú>ƒul0ЂÑx $Ö‚Ã{!éƒÀpQ¬ƒVqÀtÕ‚ës!g<‚tYM‚;uñKKýwy=ºÏy0¶Äzå%Ú|ÜŒíïxp€¢žy.sÁPyØfjzyX˜€Ú{%JÆ€Á{Þ=i€¸|¦0œ€Ô}ƒ%'~r‹ú€P€»€€”rå e•³€^X”€;Jm €!=9¼€ 0“ÿõ%F€_ß‹(ˆ~ò‡õr:~Ç#dé~›†+Wl~‘….Ið~®„8<æ~èƒ@0sL‚6%aË Š~n~Z}ÿ%q”}Ô‹dN}µ‹ÁVÝ}»‰îIƒ}éˆ<°~1†90c~²„?%wP‚5‰ú}T˜}Õ}B–q}“¸cÐ|ø‘Vh}ŽbI}L‹ª"‰…¯yK‚펭gXw¼Oi„kÇŒk­_EЏmßRe‰kp'Eˆ$r”9†ßu&-J…°wý"Ö„›{‚1Œ¾ovå‹‹pkŠTr ^›‰!s‰Qà‡ïuE"†ÈvÏ8è…¦x-P„›zš#ƒ¨|¿`Šöv®v‰Ûwˆj/ˆ¾xV]ô‡ y'QT†zDÄ…Šzñ8¹„Œ{ò-Sƒ¦}#U‚Õ~A€“‰q~0uQˆh~riƒ‡\~™]B†R~®Pí…M~ÇDz„k~ò8—ƒŽ"-Z‚Ì\#‡‚ ™Þˆ9…­t¦‡C…Lhá†?„½\º…8„ Py„BƒXDKƒh‚µ8‚¬‚-]‚r#°ˆ€ÇL‡Ft5†^Œ hw…ZŠ¿\?„O‰@Oýƒg‡ÁCé‚¡†N8Zï„ß-ZqƒW#Ó Ê~؆Œ”'sÁ…«’h„¥…[Ôƒ—Ž4Oœ‚³‹æC‹‚‰ž8 ^‡^-Y€î…#‚£~†›se…"˜ägŸ„–[uƒ’æOO‚ÁCWqŒ¥8€à‰-S€ˆ†f$€QƒUx3™f_)m¿—2bbÁ•!déW:“gÖKoÄjÞ?¯Žln4}Œq})鉪u= ª‡hyPwŽ—¸fŸmF•¥hÅbN“j÷Vâ‘mm͉/}Ä4<‡F~=*f…n~È!þƒ±Zu‘~‚üj¹¾‚Ï_éã‚{TÅ‹ö‚I™Šª>¢ˆ/U4+†d *u„®€À"5ƒ€wt›†‰ÊjCŽÔ‰ _wŒýˆ TY‹†çI=‰6…Ã>g‡g„ª4+…Ÿƒ›*ˆ„ ‚"c‚’jt<ÑljŽ)(_?ŒJtTŠO‹}I ˆo‰’>-†·‡¶4……é*”ƒ„ "ˆ‚(‚5sòI–ÖiÁž•^õ‹¹’šSÙ‰¹×HÓ‡Ø"> †%Š3ö„†‡ì*›ƒ…R"¦Ó‚ÛmB¢o^°cxŸ¤a€YZœÖdcNæ™ÚgbDL–¢j‡9Ñ“Amâ/õÉqi&ÏŒKuBˆòyTl© üe½cž4gâY›Pj#N¶˜DlƒD6• o 9Ø‘¼qÁ0Ž[tž'Šûw¾ˆ‡Â{l1Ÿ:lb™œ…nX¬™¬oÂN^–©q‰Cþ“…sp9ÅOu01 w±'a‰Ïz÷†¹|Škµ|s0bšØt9X˜uLMü•"vwC´’w¾9¢y#09‹Þz '•ˆÅ|A W…Õ}êk8œyÃaœ™lzJW­–¯zÌM“Ë{PCvÓ{î9~Ú|¥09ŠÕ}j'½‡Þ~E ©…"jÊšÖ€Ka=˜L€RWX•’€:M@’²€C6Äü9hŒÓü0<‰ë€'Þ‡€ í„p€0jm™é†¤`ó—f†,W”ª…tM‘É„žBùŽåƒÓ9FŒƒ0G‰!‚n'þ†k¿!%ƒéj'™*Œ¿`²–¬‹ÃVÖ“ðŠiLÆ‘ ˆßBÇŽ-‡^9‹]…ë07ˆ„„Ž(…݃+!Rƒ|Ôi’²`§–"‘IVË“Y;L²`ŒÜBÅuŠ™9*Š­ˆs0P‡ô†g(6…o„Z!vƒ%‚pb¬«Ê^Y}¨s`×P7¤ãc½FÑ ñfÐ=iœ¥j48˜m+µ“wqM#úŽÇuE•ŠTyUbªdÁY/§"fáP£gi0F½Ÿ\k¯=q› nb4_–ŽqK+ü‘ûtZ$hhw£-‰zøa½¨Þk$XÔ¥tl¼OÅ¡ÀnxF‹¸pj=]™wr‡4m•tÕ,1œw@$ÅŒ,yÙ°ˆ|sap§qVX}£¼rsOi s©FSœ#u =;—úv’4m“µx=,W_z%‹{æ ‡}Åa#¥’wxX8¢Ax!O)ž¢xÓFš¹y”=%–¥z~4l’}{†,vŽG|%QŠ#}ʆK~ï`ݤ]}’X ¡}ÊOq}íEô™~= •„~J4u‘i~¤,•Q%ˆ‰R‚Ï…£ð`££fƒzWê ƒANðœu‚ÑEà˜”‚O<û”–á4u‹‰,´Œ~E%¹ˆ¢ …€Ê`v¢¨‰*WØŸOˆ€N囨‡xE֗ĆJ<î“Ì…/4hׄ*,¼‹Ûƒ>%àˆ‚W D„¨`Y¢ޤWÓž¯‡Nâšÿ‹áEÓ—Š<ó“!ˆ44y7†ƒ,Ê‹P„í%õ‡Ÿƒi n„N‚·Yb·Zé¦÷e^^X–+göa¹„Îje rþm:hgap kÛOFs oy=Üv[sh-qz wãµr_jeT¥~bdg¹”àeCjƒ¬hluqûknÛ`n-q[NŒqxsû=]uvà-Fyz,³©\o¤£Î_¹q“qbÕr\‚VeësÅpÓiu<_+lzvÈMÒp xl<çsíz@-!x+|U±äYéyÆ¢]Vz+‘Í`¡z•€ùcë{o¢gZ{^6jö|#MnÆ|Åp?†|sk2}üvŸ%ϳz0xtkã„umÇwvo›iVw(qh[3xVsCL÷y«u7?){#wI1å|Ùy%ð~Ã|Eq´tr‚Þríu•uïtv¡h{uUw¨Zyvµx³LrxÜyé{1Ë{Ö|U& }ñ}ÆŽo½|çÛq}Stðrh}gtsÄ}ÐY³uH~KÎw~M>oxà~š1Ÿzù~ó&%}=T"n!…H€éo“„út pü„yf¤ruƒØXÿtƒ4KSu> wõÿ1z:^&9|£€³ŒZlÎ|€)nTŒrsVoÍ‹!eûqZ‰§Xisˆ(Jáu†§=åw-…$1ky—ƒ&J|$ä‹Ák•vmW“¯r½nÚ‘Šempr/WårFŒÏJntYŠl=›v’ˆ1Wy…{&X{¼‚æ‹Tjú&l™š¦rAn—¨dôo»”gWq—‘"J$s¼Ú=[vІ1/x¬‡&c{iƒ»†ðmZ„{‚8]üo\2a\b~DdµU/^h GΈk¶:áÇo~.€‚2s¦#l‚ÏxA…ù~Ðb¸z©~èein‡h aÉAj®TŸ‚mcGfÚp=:¦€Js@.|€êvŽ#¬µz.„þ|`jÒy—|³lÈm }n´`ó}\pSó}Èr™Fé~Qt±:^~ôvè.pÅyU#〽{öƒóz.rËx‰z¨tl{uM`.{˜v~SK|4wºFt|ìy :}¿zn.g~Á{õ$ä}—‚òxDz½wxà{Yk¦yu{Ø_Uz|ERÈzÇ|ºF{®};9í|­}È.c}Ý~f$<*‚v¼‚žvØwq‚‘kx‚S^©xÉõR&yœ˜E©zF9ª{Àù.P}€ª$_~€XauzŠNv&vA‰•jWvöˆ”^w¸‡jQœx£†ô@3Pï5i„õ+UÝü"µ€M€v§~h‡"la~s†´a~[†VP~<…"K~A„G?Ü~oƒy5L~µ‚³+Z3á"ÜÇ v)}rŽkè}‹a}z‹¢Ué}b‰úJ¥}tˆW?‰}º†½5~…,+_~§ƒ‹"üZìuÈ|¶”Ëkˆ|ד/`¸|Ê‘U|´ŽJ`|ËŒ?[}‰´5}އU+W~;„î#‚£pu’^Zf¬Ú]p\ms`ÊQ³Žd6F¹ŒzgÄ;ÏŠãk†1z‰Mox'Ù‡ËsÅ™†qxZo©4a`fŽàd [ä‰fÆQLŒ$i’FtŠ®l};±‰9o—1†‡ÈrÙ(†pve …>z#nöþh€eUŒ×j’[L‹œl¬PÄŠQnØFˆýq;|‡¯sŒ1†gv(B…;xâ j„1{Æn;‹ðo‚d“ŠæqZ‰‰ÉrP7ˆt E¥‡ou©;:†Jwd1o…-y9(b„+{5 ¾ƒH}@m…Š,vpcè‰=w^Yæˆ6xAOŸ‡y EI† z:ý…{1\„|0(}ƒ=}_!‚~‘l䈺}McY‡â}¯Yh†é}ïO-…á~Dì„á~U:æƒñ~¢1\ƒ~ü(—‚nZ!@Ú¶lZ‡…ƒòbԆƒÀXì…׃YN½„Ú‚ÖD’ƒì‚X:³ƒæ1n‚Fƒ(²½!qQ€°kŠubš…ì‰ÄX¾…ˆªN”ƒô‡UDuƒ†:Š‚I„ç1KžƒÒ(Ã*‚«!™€à‚k˜…á¿bI…9ŠXm„SºNMƒH‹œDA‚[‰˜:m¦‡­1F…×(Ñ€¸ƒö!¸€‡‚-eÞ›1Y¡\ç™\åS™–ç`AI픟c¿@’"gh6f‰kL-WŒço_%ŠWsLJüxbe"™G`}\k—?c)S.•eñI¥’ÌhÚ?õXké6jÙo+-„‹Wr—%[ˆîvJŒ†»zd”—'g,[Ô•?iLR·“3k€I=ùmÖ?´Ž¡pJ6VŒDrê-Ÿ‰éu¬%¤‡¬x¦…£{°d•m·[8“KoPR‘Yp÷HÍ=rµ?d tŽ62ŠÕv‡-ªˆ¤xš%܆‘zØc„²}cs“Wt3Z°‘¢uIQšÀv`HX¶wz?$‹ x°6‰‘z-¬‡‡{d&…œ|â·ƒä~[bð‘êz¥Z=K{:Q7Žu{¸HŒw|+>âŠp|°5ÿˆr}T-°†‹~&(„È~¿ýƒ8rb‚Á€éYâ5Pég€ßG¾‹m€¦>¡‰v€~5؇€n-»…³€n&H„€i 7‚©€_b*φðYŽŽS†„P›ŒŽ…ÁG}Š˜„×>nˆ¨„5¦†Õƒ=-©… ‚’&hƒ}Ý f‚6$aåŒÓYo§‹øP‹ãŠ„Gf‰ÝˆË>r‡ä‡85Ɔ…Ç-Ì„l„q&…ƒƒ ‹ÚÅ[“¤\XùSP¡”\1J垦_‘BH›ic&9œ—àfø1'”,k )_koL"^Œ½sÓ¥‰^xhZÚ¢¬_pRÔŸôbJ}œödúB™«h9…– kG1=’|nÀ)¤ŽÓr`"Ï‹Gv:>ˆzZk ¢eµR^ýgæJ!›j8A¸—Öl¾9^”dom1AàrM)×ZuK#-‰øxw†ì{œZ ž–kÕQóœm‹I¯™1o[Ap–qR91’Âsq1Â&ƒÙ€Xµ™/ƒzPç–çƒ[HÞ”8‚î@Å‘=‚e8ÐŽ1õ10‹8ž*_ˆK_$J…¥[ƒc€ÑX‹˜oˆõPÍ–)ˆaHÉ“~‡S@¹…†8Öz„ü1EŠƒý*t‡¶ƒ$c…,‚4…ƒi¬\ãU+2_ýY&…c]}Lf0`ûlŸitdç[ÄlêhïK;p•m(;t™q»,xúv媋Xí_a›°\ob`Œ3_ßeW|'cWhLkœfôkIZèjÆnaJŒnÐq¢:¥s4u4+÷wòy>¨½Ugi€™ýY>k€ŠÄ\ÿm~zÑ`Ãoƒjxd¯q–YühÕsÁIÞm7v :@qõx–+êw{v¦òR=ss˜KVct‚‰&Zdu”y€^lv«iSb¦wÒYgy I:kÎz]9åpÞ{Ù+Þv7}ˆ¥BOw}B–ËSà}n‡ÅX"}™x4\d}Äh[`Ü}øXIe›~>H«j–~Ž9–oì~ô+Óuƒn£ÔM †ñ•‹Q†=†¯V8…w=Z±„»g}_]ƒûW¨dQƒEH8i‚’9To Ý+Êté"¢©K)s”‰OûŽ×…ÏT›*vzY@‹ufÍ^‰ÄWcCˆGÞh­†V9"nt„‡+Ãti‚¡¡ÄI—™°“ÂNŽ—$…!SM”‚uâX‘ÚfD]7VŸbeŒG„gû‰Ï8ùmæ†ë+½tƒé¡+Hp¢“7M{ž÷„ Ç(€vRK›\upW!—Åeç\;”8VXaªGDgbŒä8Êmrˆú+¹s«„û ÕcóU5’ÔfiY:„Ihç]'ukxaeqn,dîU¢qhùF/t(m77+w•qÖ)[{Xw Ÿ+`0^å‘£caûƒEeàetc0ˆQ•g®†Cnll…05Çq€ƒ³)|v·‚#—bQ…–1ŠMU°”"|•Y·‘ÞnM]Ѓ_³b,,QfÖŠÓCk½ˆp5§pó…î)vMƒU–ÝPjž‰ÊT§›£|X½˜smÓ\ç•*_OaZ‘êPÐf!ަBÙk)‹O5zpƒ‡Ô)uù„R•[k5UVˆ”mYV{'nê]=mpça^gsdûO©uLiASwÄmI3vzqñ&Ù}¢w+“æg£^j‡bi×azl d£lnLg°]™p±jÉOsIn@ãvqk3Fy/u'&ø|yQ’dagx† fêiÆxþialkkänB\ÓnpŠNuqprî@ˆtˆut3#wòx<'{˜{S‘atpa„Ÿd@qãw”fôsWiùi´tÂ[Ül¨v5M·oÓw¿@ s4yb2ëvã{1'*zÁ}.­^éy.ƒ[aêyëvfdÕzhãgÌ{%[j÷{ÀMng|l?¤r }&2Ãuõ}ø'>z~ÞŽ\Æä‚R_òÛuwc ¬h f1gZYiŒ"L™m+€é?Rq€¹2 u)€‹'Oyk€]©ZþŠi{^M‰˜t±a†ˆ‘gWdÔ‡mYºh]†IL!l(…)?p*„ 2Št}‚â']x諌ùY’¬€Ô\ú‘t`L/fÄcµ'Y3g`‹!K«kU‰>Éo}‡2tsï„õ'ix}‚ÆŒX|š•€Y[ù˜7s_Y•vfJbÒ’†XÐf’›Kdj¢Œ²>Šnì‰À2Ks‚†¶'rx'ƒ±Šr¶U€~LsÞYqqçu)]OdÐvŽa#WFx eI¦y¬i‚Or£7²‚)tð.Ì‚wY&§‚yìß‚=|ˆeÇ€Çq,\ñ€ãr S€àt JW€Êuz@߀¾w7s€Ëxž.»€æzN&Å | *l}áe~õwò\M5xÖS3Oy£IÙXzf@{j{77R”|.·Ü}&á€E~ i€¼ dv}d~}[»}Ë~ÒR²~~ûIm~!@$~P07(~˜_.Ð~ôŸ'‰Ü €+€cû|(„ß[j|´„¯Rq|û„*I>}ƒ{@}U‚á7}¿‚[.´~=ê'~ïk ǵ€åcš{*‹[{ÊŠOR|#‰Hù|Q‡¬?Û|•†U6ð}….±}¦ƒê'$~x‚· èW”^㓈TÙVž’X“N ª\fE%`a<~dŽ3‹Èhú*ËŠm˜#Mˆr…&‡w^û[ƒU÷Æ^·MwŽvbD±ep;È‹yi 3 ‰êlØ*öˆdpÒ#ª†þu ¯…ËyU]XŽgbUEddÃLëŒ=gƒD:Šïjb;}‰md2ðˆ.p•+†Ùsç#õ…§wl&„¥zò\±‹ûh’T›‹ j¸LCŠlëCȈûo6;+‡Èq¡2̆›t.+…zvÖ$0„{y£ƒ¨|e\ ‰ÚoT‰&p¢K·ˆErECK‡Asñ:ë†5u¾2«…8w§+$„Fy $aƒw{°ã‚Ð}®[uˆ uaS{‡~v|KG†ºwˆBï…Ðx•:¦„ày¶2Ÿƒÿzö+1ƒ7|@$‰‚—}+‚~ÌZò†‡{S †|'Jí…s|˜B©„›|þ:nƒÃ}w2…‚þ~+G‚M~§$°Ø<g…¿Z‡…FpR¥„ýJ„hTB\ƒ¢:4‚Ý€å2P‚7€Ê+?“€Ä$Û2€°— €ŠZ3„H‡HR„'†ëJyƒ¦† B_‚Ï„ô:bû„2 ZƒM+|€ß‚¥$ý€²ê½€¬/TÜœ†T#M‹šZW×Eû˜ [¯>•®_À6&’þd.`5h±'Emm| ïŠÌrŠÒˆ~wšTš‡Éo‘R†ÑaX1…ÜRƒ^•„êDteAƒ÷6ólC‚ü*ìsJþ–ß>’³Š9DzÆ|ýJ–ŽàoP«`¢Vú‹+R]™‰LD,d}‡b6Øk­…^*ïrÞƒK–(f—9k'„y7oÔƒ-}t²‚ $ºys­yT´JnÖXíŽýcþ]EX¾a@‹`MUe«‰‰Bj]‡Á7`o7†-ct@„>$Îy‚ŠwlsQlñtWU+buÌYdVÕwU]±KBxðb?²z±f½4¯|˜k˜*W~Äpà!dv™uØoX½kÏpÕ\La.rž_âVtsc…J¶vbgC?Vx~k04†zÁoO*l}DsË!½Úxt‡kq`‚j”m’cj`4o­fVUAqÑiKJtlX>ãv†oŒ4Oy!rì*u{òv–" ~Èz{sLhh9igj’ju_lùlµT|odnûIlqüqS>{tÂsË4!w®ve*zÉy8"M}Ù|/re)oãhRgåqs^ jsS¢mBt‹Höpv)>*s2wá4vfy°*yÄ{©"…} }·q!bœwvg‚e—xa]phy7RúkpzH^n‰zÞ=ÑqØ{Ò3ÕuK|Ø*xæ}ò"µ|`pS`k~ÒfÅcœ\Çf¹5Reià@Gßm1W=ypµ‚3ºtW½*™x(ý"Ü{Ñ€8o°^™…åf4a÷…\AeA„ïQðh“„3Gxlƒ„=!oÉ‚ç3s•‚Y* wŠÇ"ü{]2o9]$ŒªeÇ`ª‹¿[ÖdŠeQŽgˆˆÛG.k%‡`<óo…ù3grø„Ÿ*ŽwƒF#{ÿlÒzÍQcJ{‡U.Ym|bY`O)}E]¯D¤~-b%:0-fÕ0U€Jk¾'8šq€ƒv²khwXUbDx<[åX•y^_ƒN„z‚c5D/{³g 9î}k0J~roG'h€sÖì¿x¢j@s§_ a-ub—W»v‹e˜MÆwôh¨C¥ypkÖ9š{o/00|Ðr²'Š~¹v{ I€¡zki(pzfß`r=i8V»sík—M užnCwhp‰9=yWs10 {auú'¡}xø ™ª| h$m¤n _3o©oÆUäq™q‚LFsŒsCB¤u•u8ówÎw/özy'º|†{H Þ~×}|g;k*u&^_mmvDU-o™wTK·qÄxaB5ty}8Ívrz¹/òxú|'Ô{ }f!~%~Áf|i|]Ãk‡|˜T«mç|øKFpA}KAÎrµ}°8„uT~./äx~¾'çzÞO!F}’×eäg=‚¹]9iT/l|‚\JÞnþòAvqœœ8:tj\/ÀwB.'õz?€û!l}€Áereˉ\Ðh¤ˆƒSËkX‡€J‡mû†SA8p·…;8s¥„;/©v¥ƒL'ñyÈ‚_!‹|º€b„‚ÜPáYô‚ñT÷Qƒ Y*GÓƒK]ƒ>[ƒnb 5ƒ›fÖ,MƒÛkØ$b„Cq5Õ„ÄvÇaCjW·YÝ[OPG€J^ûG6€ªbÄ=ôf¶4Õ{jß,[‚o8$ª‚±sÞRƒqx¥`C|^X |áažO„}d¹F~.gì=€~ÐkC4˜ŒnÉ,Z€\rv$âOva¾‚Iz[_Tye^W"zgÙN¥{j_Eð{älú=|Îo²4T}Òr‘,N~éu% €x»I{ç^pvOlVNw˜nMãxÁoóEFyÜqê<¥{t4|Nv6,B}£x%0zêk€n}G]¥särËU—ult!MGvÎunDÂx!vÁ†âb.8†XfH0…×jž(¿…fo "5…sâí„ñx§V˜„Õ]IO;„Ø`uGœ„¸c³?¨„vg7¯„(jœ/êƒènX(Õƒ¹r6"ƒ¯vFgƒ¾zLUÒÝc¯Nv‚fSFÜ‚7i?#‚4kØ7P‚(nÏ/¿‚,qì(à‚?u%"¾‚rxЂ¶{ÇU)j MÁ«l&F9þnL>—€1p‚7 €ará/›€¤u_(è€ôwî"ñ`z‘)Ô}T_|Äp[M}ŠqêE±~sz>-~|u6¾~ÜvÍ/ˆMx§(óÒz‹#€t|ts~;SÅz³vyL”{¸w€EB|{xt=Ù} yn6{}—zƒ/k~2{²)~Ö|î#Dª~!°€{3SAxç|YLz/|ÖDÕ{&}-=†{à}‚6@|Œ}ò/:}R~x)~#o~ÿ–áý€Ràwq‚KÌxö‚D z¿=qzíX6U{£/h||€ø)'}c€è#Š~~€Î˜€¬NØ“ýO£HJ’„SÒAq‘X:=…\¤2áÙav+»Œ#f“%AŠzk䔈öqo‡´vçMÌúU¹GRíY}@€Ž¯]_9}?aq2l‹­eÁ+–Šâì3’jO%lˆŸo ‡Rs嵆Gx§Mø[ËFŒ,_?ÕŒ)b„8êŠèf2‰‰iã+yˆ1mà%†íq÷ […Ýv/;… z>Lx‹aÐEêŠ|d¤?1‰¯g8{ˆ¬jŸ1ɇ‰mà+e†oqF%¯…jtÀ ¨„—xM¯ƒø{ªKÚˆ^gÎESˆj!>®‡{lˆ8†¨o1¢…¿q¹+\„âtŠ%Ï„wb ìƒ}zAƒ|ìKA…ïmÇDÆ…ño•>@…™qn7Ä„ös^1s„9up+cƒ‰w¤%ð‚ñyÚ!&‚Œ| a‚N~J¼ƒÐs“DL„ tÜ=ä„v"7†ƒ‹w{1L‚õxò+Z‚mz‚&÷|![À}œ¤®~ïJL‚y/Cç‚—yò=•‚¯zŸ7V‚^{X1-ê|2+E‹} &2~!„~ùÚ,´Iû€|~¥C—R~Û=U~æ71l~ù1$0+T€Ê|&(€–Ñ!š€ž€€Ä€Tÿÿÿÿÿÿmft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢EJý¡L`ò¥Kqæ©JƒÚªM•Ï©V¥È¨a°ÅªkµÂ¬uº¾«}¿ºªƒÅ¶¨‡Ê²¦‡Ð«¢‡Ö¤ž‰Üššáššáššáššáššáššáššáššáššáššáššáššáššáššáššáššáššáÿ¦82ÿ£EJý¢K`ò¦IqæªH‚Û­J“ЬR£É¬]¯Æ¯g³Ã±q¸¿³y½¸¯Ä²ª‡Ë¬¦†Ð¥£†ÕŸ†Ú“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þÿ§82ÿ£EJý¢J_ò§Hpç¬FܯG’Ò°N¡Ê±W­È¶b°Åºlµº³x¾²®Å­ª‡Ë§§…Ï ¤„Ó˜¡…ןˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚÿ§82ÿ£DKþ£I_ó©Foè®D€Ý³CÓ¶HŸÌ·QªÊÀ\¬½¸l·³²xÀ­®Æ©ª†Ê¢¨„Λ¥„Ñ”£„ÔŒ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×¥ÐŒ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×ÿ§72ÿ£DKþ¥G^óªDné±A߸>ŽÖ½B›ÏÃJ¤Â¾\¯¶·l¹®±xÁ©®Æ¥«…Éž©„̘§ƒÏ‘¥„ÒŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†Ôÿ¨72ÿ¤DKþ¦F^ô­Bmê´>}á½;‹ÚÆ<–ÊÆH¤¹¼\²¯¶m»©±yÁ¥®‚Å¡¬„È›ªƒË•©ƒÍ§„ω¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñÿ¨72ÿ¤CKÿ¨C]õ¯?lì¸:zäÃ7‡ÝÓ5ÁÄI§±º^µ©µn¼¤±zÀ¢¯‚Ä­„ǘ¬„É’ª„Ë©…͈¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îÿ©62ÿ¥BKÿªA\ö²;jî½6wèË3€ÐÒ3“¸ÃK¨ª¹`¶¤µp¼¡²{Àž°ƒÃš®„Å•­„Ǭ„É‹«…ʇª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ìÿ©52ÿ¥BKÿ¬=Zø·7gñÄ1qß×,{ÅÐ5•°ÂN©¤¸c·Ÿµr¼³|¿›±ƒÁ—¯„Ã’®„ÅŽ­…ÆŠ¬†È‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡Éÿª42ÿ¦@Kÿ°9Xù½1bçÎ-iÐà$¹Ï7—§ÂR©žºfµšµs»˜³}¾—²ƒÀ”±…Á°…ï…ĉ®†Å†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æÿ«32ÿª;Iÿ¶2SðÇ*ZØÞ!fÂß$‚­Î<˜ŸÃV§™¼h²–·u¸”´}½“³ƒ¾‘²…¿Ž²†À‹±†Áˆ°‡Â†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃÿ­12ÿ°3EøÀ)LßÖ#MÇè j³Þ&„¡ÏA–—ÆY¤“Àj¬¼u²¹}¶·ƒ¸Œ¶„ºŠµ…¼ˆ´†½†³‡¾„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿ÿ¯/2ÿ¹)?èÎ?ÌæR·î!m¥Þ,ƒ—ÒE’Ë[ŒÅk¥‹ÂuªŠ¿|­‡¾°„¼€±ƒ¼‚²»ƒ³º„´~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µÿ²*2ñÆ3Ñâ:¼óV¨î&m˜á5ŽØJŒˆÐ]•†Ìk›„Ét Çx£~Å{¥|Ä}¦{Ä~§yÀ¨x‚©wƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªú¾(ÖÝ#Àð?¬ýWœð-jå>y†ÞNƒØ_‹ÔkzÑp”wÏt—uÎw˜sÍyšrÍ{›qÌ}›pËœoË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€ÙÒ Äí)°ýAŸÿ$U‘ô5e‡ëFpåTy{áavÝh„rÛn‡oÙq‰mØt‹kØwŒjÖyiÖzŽhÕ|ŽgÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~ÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿžOTú¡Ndï¤Ouå¦Q…Ú¥X•Ñ¢b£ÉŸm¯ÅŸwµÂž€¹¿ˆ¾¼™‰Ã¹”‹Ç¶Ë³ŠÏ±†–Ô®ƒ ×§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õÿ£9*ÿ F@ÿžNTú¢Mdð¥Ntå¨O„Û§U”Ò¥_¡Ê£i­Å¢t´Â¡}¹¿ …¾»ˆÃ¸˜‰Èµ“‹Í±ŽŽÓ®‰–ا…Ú¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Öÿ£9*ÿ F@ÿŸMTû£Ldð§Ltæ©NƒÜªS’Ò©[ Ë¦f«Æ¥p³Ã¥z¸¿¤‚½»¢‡Ã¸‡É³˜‰Ï°”ŽÕ«’—Ú ŠœÜ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØÿ£8*ÿ E@ÿ LTû¤Kcñ¨Ksæ«LƒÝ­P‘Ô¬XžÌªb©Çªl±Äªv¶Àª~¼¼¨„¸¤†É³¡ˆÏ¬œÕ£–”Úš‘œÜ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØÿ¤8*ÿ E@ÿ KSû¥Jcñ©Irç­JÞ°MÕ°UœÎ°^§É°h¯Æ²s³Ã²|¸½°€Á¶¬‚É®§…Ï¥¡ŠÕœœ‘Ú•™œÜ‘”žÙ,—SÑ”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙÿ¤8*ÿ E@ÿ¡JSû¦Hbò«Hqè¯H€ß³JŽÖµQšÐ¶Z¤Ì¸e«Ê½q®Á¹{¶·²€À®¬„Ȧ¨…Τ‡Ô” ŽØŽŸ™ÛŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙÿ¤8*ÿ¡E@ÿ¢ISü§Gaò­Fpé²Fà·GŒÙ»N—Ó¿WŸÐÅc¤ÅÀp­º¸y·°²€À©­…Ç ¨„Í—¥…ÒŽ¡‰×‡ ’Ù‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØÿ¤7*ÿ¡D@ÿ£HRü©Eaó®DoêµC}â¼D‰ÜÂJ“ØÊT™ÊÆb¤¼½n°²¶x¹ª±€Á¤­…Ç›©„Ì“¦„Њ£‡Ôƒ¢ŽÖ‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Öÿ¥7*ÿ¡DAÿ¤FRýªD`ô±Bnë¸A{äÁB†ßÌFÓÏR—ÁÄa§³»m³«µx»¥±€ÁŸ®„Ƙ«„ʨ„Έ¦†Ñ‚¤ŒÓ€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Óÿ¥7*ÿ¡DAÿ¥EQþ¬B_õ´?lí¼>xçÇ@àÖF‡ÉÍQš¸Â`ª¬ºmµ¥µx¼ ±€Á›®„Å•¬„ÈŽª„ˇ¨†Î‚§‹Ï¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ðÿ¥6*ÿ¢CAÿ§CPÿ®?]÷·Ž³ÉR §Àc­Ÿ¹p¶šµz¼˜²¿”±…¯…Ä‹®†Å†­‡Ç‚¬ŠÈ«É«É«É«É«É«É«É«É«É«É«É«É«É«É«Éÿ§5*ÿ£BAÿ¬?ÿ±7Jù¾0RçÏ/UÑâ,hÀá0­ÒB“ ÈW¡˜Ág«”¼s²’¸|·¶‚ºŽ´…¼‹³†¾ˆ²‡À…±‰Áƒ±ŠÁ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂÿ©2*ÿ«8=ÿ¸/EîÈ)HÖß%RÃì)l±ß1‚¡ÒE’—ÊZŸ‘Ãi§Ž¿t­¼|±‹º´ˆ¹ƒ¶…¸„¸ƒ·†¹¶‡ºµ‰»~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼ÿ«0*ÿ±/8öÂ&<ÜÚ;Æë#W³ì*o£ß5‚–ÔJÍ]š‹Èk¡‰Äu¦†Â{ªƒÀ~¬¿€®¾‚°}½ƒ±{¼…²z»‡³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³ÿ­.*þ»%0ãÒ-ÉèA¶÷#Z¥ì.o–á<ŒØO‹‡Ò_“„Íl™Êtž~Èx¡{Ç{£yÆ}¤xÅ¥vĦuçtĨs†©s†©s†©s†©s†©s†©s†©s†©s†©s†©s†©s†©s†©s†©s†©ÿ´$%ìÊ#Íå,¹öF§ú&[˜î5lŒåDz„ÞSƒ€ÙbŠ|ÕlxÒq“uÐu•sÏx—qÎz˜pÍ|™oÍ~šnÌ€›mÌ‚œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œõÁÑß ¼ó1ªÿGšü,YŽò]ù½?fîÈCmãÖMoÕÝNÄÓY‘µÉfŸ©Áq« »y³™¶€º”²…ÀŒ¯†Ä†­ˆÇ€«ŒÉ|ª’Êz«œÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊÿ£5"ÿ B7ÿ¦AEÿ¯=Pþ¸;YóÄ6ÿ­9Aÿ¸4HðÆ3MßÙ6PÍå6g¾ä;{­×HŒ ÍX™—Æg¤’Ár«Ž½{°Œº´ˆ¸ƒ·„·…¹‚µˆ»´Š½|³¾z³‘¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿ÿ¦2"ÿ¦:4ÿ²3=÷À.BäÒ/AÏä.U¿ï3k¯á;~ ÖJ–Î[™Èi¡ŒÃs¨‰À{¬†¾¯‚¼²€»„³}º†µ{¹ˆ¶y¸‹·w·¸w·¹w·¹w·¹w·¹w·¹w·¹w·¹w·¹w·¹w·¹w·¹w·¹w·¹ÿ§1"ÿ¬31ÿ¹+6êÌ&6Òá&AÁï,Z°í3n¡á=•×MŒÐ^–‰Ëk†Çt¢ƒÄz¦Ã}©|Á€«zÀ‚¬y¿„­w¾†¯u¾‰°s½Œ±s½±s½±s½±s½±s½±s½±s½±s½±s½±s½±s½±s½±s½±ÿ©.!ÿ³*+òÅ",ÖÞ-Ãí#G²ù+]¢ì6o•âB}‹ÚRˆ…Ô`‚Ðl–~Ìs›{ÊwžxÉ{ vÈ~¢tÇ€£sÆ‚¤qÅ„¥pć¦nÄŠ§n˧n˧n˧n˧n˧n˧n˧n˧n˧n˧n˧n˧n˧ÿ¬* ú½"ÜÙÅë3´ú#J£ù.^•îÿ¤FJÿªFVü®Hbô³Kmî¸Owè½UáÁ^†ÖÀlŽÈ·q½®wª²§}´©¡‚»¡œˆÁš˜Æ”––É”ŸËŒ’¨ÌŠªÉŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆÿŸ6ÿœC.ÿŸF>ÿ¥EJÿ«EUü°Faö¶Ikð¼NtçÂU{ßÈa€ÑÃjĺp¸²u©­«{³£¥€»›¡†Á”ÅŽ›”ÈŠ™Ê†™¨Ë†”ªÉ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«ÆÿŸ5ÿB.ÿ E=ÿ§DIÿ­CTþ³D_÷ºGhïÁMpåÉVuÜÎdzÌÆi¾¾nœ²¶t¨§°y²ž«~º•¦„ÀŽ£‹Äˆ¡’Ç„ŸšÉ€Ÿ§ÊšªÈ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æÿ 5ÿB.ÿ¡D=ÿ¨BHÿ¯ASÿ¶B]÷¾FeìÇMkãÒXmÖÓazÇÊgŒ¹Âm›¬¼r§¡¶w±˜±}¹­‚¾ˆª‰Ã‚¨Æ}§™Èz§¥É{¢«È}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æÿ 5ÿB.ÿ¢B<ÿª@Gÿ²>Qýº@YóÃD`èÏNcßÜYgÏØ`yÀÏfвÈkš¦Âp¦›¼v¯‘¸{·‰µ¼‚²‡À}°ŽÃx®–Åv­¡Æu¬¬Æw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åÿ 4ÿžA.ÿ¤@;ÿ¬=Eÿµ;N÷¿>UìËDYáÚOZÔßQlÆÚZ}¸Ób‹«Îi˜ŸÆq¤•Àw­Ž»~´‡·ƒ¹´‡½|²Œ¿y±“Áv°›Ât°¦Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âÿ¡3ÿžA/ÿ§=:ÿ°:Cýº8JðÆ;OãÕENÕáF_ÈâKqºÝR¬Õ[ŸÌf›–Æp¤Àx«Š¼±„¹ƒµ€·‡¸|¶‹»y´¼w´—½v´¡½t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾ÿ¢3ÿ >.ÿª97ÿ´5?öÀ5DçÏ9E×ßÿ«BHÿ±DRú·HZð½NaæÄVgÞÉbmÎÁgÁ¹m޶±r›«ªx¦¢¥~®™ „µ’‹ºŒš“¾‡˜›À„—¤Â‚–¯Âƒ“°À„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾ÿ›3ÿšA&ÿŸB3ÿ¦@=ÿ­@Gÿ´BO÷»GWíÃM]äÌX`ÙÍ`lÉÅf~¼½k°µqš¥¯v¥œª|­“¦‚´Œ¢‰¹† ½ž™¿}ž¢Á{ž¯Á}™°À–²¾–²¾–²¾–²¾–²¾–²¾–²¾–²¾–²¾–²¾–²¾ÿœ3ÿšA&ÿ A2ÿ¨?<ÿ°>Eÿ·AMôÀESêÉNVâÕZWÒÑ^kÄÉd}¶ÁjŒª»o™Ÿµt¤–°z¬¬€²†©‡·§Ž»z¦–¾w¥ ¿t¦­¿w¡±¿z²¾z²¾z²¾z²¾z²¾z²¾z²¾z²¾z²¾z²¾z²¾ÿ3ÿ›A&ÿ¢?1ÿª<:ÿ³IðÆDMæÒOMÜÜWVÌÕ]j¾Íc{°Çh‹¤Ám—™¼s¢¸xª†´~°²…µy°Œ¸t¯•»q®Ÿ¼n¯«½qª³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼ÿ3ÿ›@&ÿ¤<0ÿ­98ÿ¶9?õÁ%ÿ§9.ÿ±65û¼6:íÉ:<àÚD:ÒâGLÇâM^¹ÞTn¬Ù[|ŸÔbˆ”Ðh“ŠÌo›‚Çw¢|Ã~¨vÀ„¬r¾Š¯o¼‘±m¼˜²k»¡³j»­²gº¶´gº¶´gº¶´gº¶´gº¶´gº¶´gº¶´gº¶´gº¶´gº¶´gº¶´ÿŸ2ÿ :$ÿª4,ÿµ21óÃ23ãÔ80ÓáW¬éEgžçKu’àS€‰Ù^‰‚Ôh‘|Ðq–xÌw›tÊ}žpÈ‚¡nLJ£kÅ‹¥iĦhÄ–§fÞ¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨ÿ¡/ÿ¨/ÿµ*"ðÆ$!ØÝ# Èé-5ºò5I¬ñžÿ4N’ú?\ˆòJfìUoyè^uräd{nák~jßphÞu„eÜy…cÛ}‡bÚˆ`Ú„‰_Ù‡Š]Ø‹‹\׌[Ö”[Ö”[Ö”[Ö”[Ö”[Ö”[Ö”[Ö”[Ö”[Ö”[Ö”ÿ° íÆÍÛ »ó¬ÿ!.žÿ,?’ÿ7M‡ýDXöOaxñYhqí_mjëdqgèjtdçowbåty`äxz_ã{{]ã~|\â}[á„~ZáˆYàŒ€XàXàXàXàXàXàXàXàXàXàXàó½ ÌÏ ½å ¬ÿžÿ$/’ÿ/=‡ÿ=IÿIRxüTZpøZ_iô_ddòegaðji^ïnk\îrm[ívnZìyoXì|pWë~pVëqUê„rTêˆsSé‹tSé‹tSé‹tSé‹tSé‹tSé‹tSé‹tSé‹tSé‹tSé‹tSé‹tÌÆ½Ô­õŸÿ“ÿ'-ˆÿ49~ÿBCwÿMJnÿSPgÿYUbü^X^ûd[[ùh]Yøl^W÷p`V÷saUövbTõxbSõ{cRô}dQô€dPóƒeOó†fOó†fOó†fOó†fOó†fOó†fOó†fOó†fOó†fOó†fOó†f½Ë®ÛŸÿ“ÿˆÿ*(~ÿ82vÿD:mÿKAeÿQF_ÿWI[ÿ]LXÿbNUÿfPSÿjQRÿmRPÿpSOÿrTNÿuTMÿwUMÿyULþ{VKþ~WJýWJýWJýWJýWJýWJýWJýWJýWJýWJýWJýWÿ-ÿŒ>ÿŠL.ÿ’S;ÿ”WHÿ•\Tý“b`õ‘jkïrvé‰|ä…„†à€‹Ü|‘’Úy—–Øvœ™Õs ›Ôq¥Óo©ŸÒn® Òm³¡Ñl¹¢ÑkÀ£ÍlÅ£ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÿ-ÿŒ>ÿŠL.ÿ’S;ÿ”WHÿ•\Tý“b`õ‘jkïrvé‰|ä…„†à€‹Ü|‘’Úy—–Øvœ™Õs ›Ôq¥Óo©ŸÒn® Òm³¡Ñl¹¢ÑkÀ£ÍlÅ£ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÿ-ÿŒ>ÿŠL.ÿ’S;ÿ”WHÿ•\Tý“b`õ‘jkïrvé‰|ä…„†à€‹Ü|‘’Úy—–Øvœ™Õs ›Ôq¥Óo©ŸÒn® Òm³¡Ñl¹¢ÑkÀ£ÍlÅ£ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÿ-ÿŒ>ÿŠL.ÿ’S;ÿ”WHÿ•\Tý“b`õ‘jkïrvé‰|ä…„†à€‹Ü|‘’Úy—–Øvœ™Õs ›Ôq¥Óo©ŸÒn® Òm³¡Ñl¹¢ÑkÀ£ÍlÅ£ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÿ-ÿŒ>ÿŠL.ÿ’S;ÿ”WHÿ•\Tý“b`õ‘jkïrvé‰|ä…„†à€‹Ü|‘’Úy—–Øvœ™Õs ›Ôq¥Óo©ŸÒn® Òm³¡Ñl¹¢ÑkÀ£ÍlÅ£ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÿ-ÿ>ÿŒL.ÿ”S;ÿ•VGÿ–[Tý•a`ö’hkïpué‹z䇃‡wwäß‚ŠÜ~’Ùz–—Öw›šÕt Ór¥ŸÒp©¡Ñn®¢Ðm´£Ðlº¤Ðl¤ÊnĤÄoĤÄoĤÄoĤÄoĤÄoĤÄoĤÄoĤÄoĤÄoĤÄoĤÿŽ-ÿŽ>ÿŽK.ÿ•Q:ÿ˜TGÿ˜XSþ˜^_ö•djï’luéŽv~䊀‡ß…‡ŽÛ€Ž”Ø|”˜ÕyšœÓvŸŸÑs¤¢Ðqª¤Ïo¯¥În¶¦Îm½§Ên§Ãp§½q§½q§½q§½q§½q§½q§½q§½q§½q§½q§ÿ-ÿŽ>ÿJ-ÿ—O:ÿ™QFÿ›VRþš[^÷˜aið•htê‘q~äŽ|†ß‰„ŽÛƒ‹”×’šÔ{˜žÒwž¡Ðt¤¤Îrª¦Íp±¨Ío¹©ËoÁ©ÃqÁ©¼rÀª·sÀª·sÀª·sÀª·sÀª·sÀª·sÀª·sÀª·sÀª·sÀª·sÀªÿ-ÿ>ÿ’J-ÿ˜M9ÿ›OEÿSQÿX\ø›^hñ™erê•m|ä‘w†ßŒŽÛ‡‰•ÖšÓ}–ŸÐy£Îu£¦Ír«©Ìp³ªËo½«År¿«½s¿¬¶t¾¬±u¾­±u¾­±u¾­±u¾­±u¾­±u¾­±u¾­±u¾­±u¾­±u¾­ÿ-ÿ>ÿ“I-ÿ™L9ÿNDÿŸQPÿŸV[ùž\fòœbqë˜i{å”s„à}ÛŠ†”Ö„›Ò• Ïzœ¥Ív£¨Ës««Êqµ­Æq¾­¾t½®¶u½®°v½®¬w½®¬w½®¬w½®¬w½®¬w½®¬w½®¬w½®¬w½®¬w½®¬w½®ÿ-ÿ>ÿ•I,ÿ›J8ÿžLCÿ¡OOÿ¢TZú¡Yeó _oìfyæ˜oƒà“yŒÛŽ‚“Ö‡Š›Ò’¡Ï|š¦Êx¢ªÇu«­Ãs´¯¿s¼°·u¼°°w»°ªx»°§y¼°§y¼°§y¼°§y¼°§y¼°§y¼°§y¼°§y¼°§y¼°§y¼°ÿ‘-ÿ‘>ÿ–H,ÿœH7ÿ JBÿ£MMÿ¤RXû¥Wcô¤]mî¡cwèžk€â˜u‰Ü’~’ÓŒ‡šÌ†¡Æ€—§Á|ž¬½y¦¯¹v¯±·vº²¯wº²ªyº²¥zº²¢{»±¢{»±¢{»±¢{»±¢{»±¢{»±¢{»±¢{»±¢{»±¢{»±ÿ‘-ÿ‘>ÿ˜G,ÿG7ÿ¡HAÿ¥KLÿ§PVü¨Uaõ¨[kí§atå¤i~ÞŸs‡Ô˜}Ë‘„šÄŠŒ¢¾„“¨¸€š­´|¢°°z«³­yµ´¨z¹´¤{¹´ }¹³}º³}º³}º³}º³}º³}º³}º³}º³}º³}º³ÿ’-ÿ’>ÿ˜F+ÿžF6ÿ£GAÿ§IKÿªNUú«S^ò¬Yhé¬`qâ©hzÙ¥sƒÍœzÅ•š½Žˆ¢·ˆ©±„—®¬€Ÿ±¨~§´¥}±µ¡}¸¶~¸µš¹´™€º³™€º³™€º³™€º³™€º³™€º³™€º³™€º³™€º³™€º³ÿ’-ÿ’>ÿ™E+ÿŸD5ÿ¤E@ÿ©HIÿ¬LSø®R\ï°Xeæ±_mÞ°ivÒ©q‚È x¿˜~š·’…¢°ŒŒ©ªˆ”®¤…œ² ‚¤µ®¶š€··—·¶•‚¹´”‚¹³”‚¹³”‚¹³”‚¹³”‚¹³”‚¹³”‚¹³”‚¹³”‚¹³”‚¹³ÿ“-ÿ’=ÿšD*ÿ C5ÿ¦D>ÿ«FHÿ®KQõ²PYìµWaä·^iÚ´isͬo‚¤v¹œ|™±–ƒ¢ª‘Š©£Œ‘®ž‰™²™‡¡µ–…«·“…¶·‘„··…¸µ…¹´…¹´…¹´…¹´…¹´…¹´…¹´…¹´…¹´…¹´ÿ“-ÿ“=ÿ›C*ÿ¢B4ÿ¨B=ÿ­EFü±JOòµOVéºV]á½`dÔ¸grȯm½§tŽ´ z™«š€¢¤•‡©‘Ž®—Ž–²’‹ŸµŠ¨·ŒŠ³¸‹‰··‹ˆ¸µ‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´ÿ“-ÿ“=ÿœA*ÿ£@3ÿ©A<ÿ¯DEú´HLðºNSç¿VYÞÂ``Ï»fqól¸«rŽ®¤x˜¥ž~¡žš„¨—–Œ®‘“”²Œ‘œµˆ¦·…±¸…޶·†¸¶‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µÿ”,ÿ”=ÿ@)ÿ¤>2ÿ«?;ÿ±BBø¸GIí¾NOåÆWSÚÆ^_˾dq¾¶j€³¯p©©v˜ £|¡˜Ÿ‚¨‘›‰­Š™’²…–𵕤·•®·~”··‘·¶‚¸µ‚¸µ‚¸µ‚¸µ‚¸µ‚¸µ‚¸µ‚¸µ‚¸µ‚¸µÿ”,ÿ”=ÿž?(ÿ¦=1ÿ­>9ÿ´A@ô¼FEëÄMIâÎXKÓÊ\^ÆÂcp¹ºh®´nŒ£®t—š©zŸ’¥€§Š¡‡¬„Ÿ±—´{œ¡¶x›¬·w›·¶z—¸µ|•¹´|•¹´|•¹´|•¹´|•¹´|•¹´|•¹´|•¹´|•¹´|•¹´ÿ•,ÿ•=ÿ ='ÿ¨;0ÿ°<7ý¸?<ñÁD@èËNBÞÓUJÎÍ[]ÀÆan´¿g~¨¹mŠ´r•”¯xž‹«~¥„¨…ª}¦Œ¯x¤•²t£Ÿ´q£ªµp£¸µsž¹´v›¹³v›¹³v›¹³v›¹³v›¹³v›¹³v›¹³v›¹³v›¹³v›¹³ÿ–,ÿ—<ÿ¢:&ÿª9.ÿ³:4ù½<8îÈC9ãÕP7×ÚRHÈÒY\ºË_m­Åe|¡Àk‰—ºp“¶vœ„³|¢}°ƒ¨w®Š¬r­“¯n¬±k¬¨²i­¶²l¨»±o£»±o£»±o£»±o£»±o£»±o£»±o£»±o£»±o£»±o£»±ÿ—,ÿš;ÿ¤7%ÿ­6+ÿ·70óÃ:1æÐC0ÜßJ5ÏßRGÁØXZ³Ñ^k¦ËczšÇi†Ân†¿t˜}¼zŸvº¤p¸‰¨k·’«h·œ­e·§®d·´®e³½®h­½®h­½®h­½®h­½®h­½®h­½®h­½®h­½®h­½®h­½®ÿ˜,ÿ9ÿ§4#ÿ±3(ù½2*êË7)ÜÝ>)ÐãF:ÅâMK¸ÞUZ¬Ù\hžÓbw’Ïg‚ˆËmŒ~És”vÇyšpÅŸjĉ¢fÃ’¥bܧ`æ¨_ô¨_Á¨aºÁ©aºÁ©aºÁ©aºÁ©aºÁ©aºÁ©aºÁ©aºÁ©aºÁ©aºÁ©ÿ™,ÿ 5ÿª1 ÿ¶.#ðÅ-"ߨ3Ðã:.ÄèB@¸åIP«áN_žÞUl’Û\w‡Øc~Õj‰vÔqoÑy”k΀˜g̈›dÊbɘŸ`É¡ _É« _ɹŸ\Èâ\Èâ\Èâ\Èâ\Èâ\Èâ\Èâ\Èâ\Èâ\Èâÿ›,ÿ¤0ÿ¯,ø¾'äÑ&Ñâ- Äë73·ë>EªéETžçLb’åRn†ãXx}à`vÜi†pØq‹kÕxhÓ’eц”bÏ–`Δ˜^Λ™]Í£š\Í­š[Í·š[Í·š[Í·š[Í·š[Í·š[Í·š[Í·š[Í·š[Í·š[Í·šÿ,ÿ¨+ÿ·$ëÊÓàÄë+&·ñ48ªðÿ>K†þGV}øQ^vóYenð_jhíendêkraéqt_çvv]æ{x[åyYä„zXãˆ|WãŒ}Vâ‘~Tá—SáœSáœSáœSáœSáœSáœSáœSáœSáœSáœÿ±ÔÇ ÆÖ ¶÷¨ÿ ›ÿ+0ÿ6=…ÿ@H}ÿKQuýTXmùZ]gö`bcófe_òkg\ðpiZïtkXîxlWí|nUì€oTì„pSëˆqRëŒqQê‘rPé•sPé•sPé•sPé•sPé•sPé•sPé•sPé•sPé•sPé•sÖ¾ÅË·Û ¨ÿ›ÿ"!ÿ..…ÿ9:|ÿDCtÿNJlÿTPeÿZT`ý_X]ûeZZúj\Wùn^Uør_T÷v`RöyaQö}bPõ€cOô„dNô‡dMóŒeLófLófLófLófLófLófLófLófLófLófÄÂ¶Ñ¨í ›ÿÿ%…ÿ1*|ÿ<4sÿF;jÿLAcÿSF^ÿYIZÿ^LVÿcNTÿhPRÿlQPÿoROÿrSNÿvTLÿyUKÿ|UJþVIþ‚WHý†XGýŠXGýŠXGýŠXGýŠXGýŠXGýŠXGýŠXGýŠXGýŠXGýŠX¶É¨Ù›ÿÿ…ÿ'{ÿ3$qÿ<,hÿC2aÿJ7[ÿP;VÿV=Sÿ\@Pÿ`ANÿdCLÿhDJÿkEIÿnFHÿqFGÿtGFÿvHEÿyHDÿ|ICÿ€IBÿƒJBÿƒJBÿƒJBÿƒJBÿƒJBÿƒJBÿƒJBÿƒJBÿƒJBÿƒJÿ‚( ÿ‚9ÿH%ÿŠO1ÿŽV=ÿ\IÿŽcTþŠj^ø…qhò€zpî|ƒwêx‹}çt’‚äq˜…âoˆám¢‹àk§ßi¬ŽÞh±Ýg·‘Ýf½‘ÜeÅ’ÜeÍ’ÔfÑ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÿ‚( ÿ‚9ÿH%ÿŠO1ÿŽV=ÿ\IÿŽcTþŠj^ø…qhò€zpî|ƒwêx‹}çt’‚äq˜…âoˆám¢‹àk§ßi¬ŽÞh±Ýg·‘Ýf½‘ÜeÅ’ÜeÍ’ÔfÑ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÿ‚( ÿ‚9ÿH%ÿŠO1ÿŽV=ÿ\IÿŽcTþŠj^ø…qhñ¥Æò€zpî|ƒwêx‹}çt’‚äq˜…âoˆám¢‹àk§ßi¬ŽÞh±Ýg·‘Ýf½‘ÜeÅ’ÜeÍ’ÔfÑ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÿ‚( ÿ‚9ÿH%ÿŠO1ÿŽV=ÿ\IÿŽcTþŠj^ø…qhò€zpî|ƒwêx‹}çt’‚äq˜…âoˆám¢‹àk§ßi¬ŽÞh±Ýg·‘Ýf½‘ÜeÅ’ÜeÍ’ÔfÑ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÿ‚( ÿƒ9ÿƒG%ÿŒN1ÿU=ÿ‘[HÿaSþh^øˆohòƒxpí~‚xézŠ~æv‘ƒäs—‡âpŠàn¢Œßk§ŽÝj¬Ýh²‘Üg¸“Ûf¿“ÛfÇ”ÙfДÏhГËiДËiДËiДËiДËiДËiДËiДËiДËiДÿƒ( ÿƒ9ÿ†F$ÿŽM0ÿ“T<ÿ”XGÿ’^Sÿe]øŒmgò†upíxé}‡~åy„âu•ˆàr›ŒÞo¡Ýl§‘Ük¬“Ûi³”Úhº–ÙgÖÙfÍ—ÐiΖÈjΗÄkÍ—ÄkÍ—ÄkÍ—ÄkÍ—ÄkÍ—ÄkÍ—ÄkÍ—ÄkÍ—ÄkÍ—ÿ„( ÿ„9ÿˆE$ÿ‘L0ÿ•Q;ÿ–VGÿ•\Rÿ“b\ùjfóŠrpí…{x逄å{Œ…âw“ŠßsšŽÝp ‘Ûm¦”Úk­–Ùi´—Øh½˜ØgÈ™ÑiÌ™ÉkÌ™ÂlÌš½mËš½mËš½mËš½mËš½mËš½mËš½mËš½mËš½mËšÿ…( ÿ…9ÿŠD$ÿ“K/ÿ—O:ÿ˜TFÿ—YPÿ–`[ù’geóŽooî‰xwéƒä~Š…áy‘‹Þu˜ÜqŸ“Ún¦–Øl®˜×j¶šÖhÁ›ÓiË›ÊkË›ÂmÊœ»nʸoʸoʸoʸoʸoʸoʸoʸoʸoÊÿ…( ÿ†9ÿŒD#ÿ•J/ÿ™M:ÿšQDÿšVOÿ™]Zú–ddô’knîtvé‡~~䇅à|‹Ýw—Ûsž•Øo¦˜Öl¯šÕj¹œÔiÆËlÉÃmÉž¼oÈŸµpÈŸ²qÈŸ²qÈŸ²qÈŸ²qÈŸ²qÈŸ²qÈŸ²qÈŸ²qÈŸ²qÈŸÿ†' ÿ†9ÿŽC#ÿ—I.ÿšK9ÿœOCÿTNÿœZXûš`bõ–hlï‘ouê‹y~å…ƒ…àŒŒÝy•‘Ùt–Ôp¥šÐn®Íl·ŸËkàÃnÇ »oÇ¡µqÆ¡¯rÆ¡¬sÆ¡¬sÆ¡¬sÆ¡¬sÆ¡¬sÆ¡¬sÆ¡¬sÆ¡¬sÆ¡¬sÆ¡ÿ‡' ÿ‡9ÿB#ÿ˜G-ÿœI8ÿŸLBÿ QLÿ WVûž^`ô›ejí–lsçv|ኀ„Û„‰‹Ó~‘’Îx™˜Ét¡œÆq©ŸÂp²¢Ào½£ºpÅ£³rŤ®sŤ©tÅ£¦uÅ£¦uÅ£¦uÅ£¦uÅ£¦uÅ£¦uÅ£¦uÅ£¦uÅ£¦uÅ£ÿ‡' ÿˆ8ÿ‘A"ÿšE,ÿžG6ÿ¡J@ÿ£PJþ£UTö¢\]ï bgèœipá–tyÚ}‚щ†‹Ê‚“Å}•™Àyž¼v¥¡¸s­¤µr¸¥²ræ¬tæ§væ£wÄ¥¡xÄ¥¡xÄ¥¡xÄ¥¡xÄ¥¡xÄ¥¡xÄ¥¡xÄ¥¡xÄ¥¡xÄ¥ÿˆ' ÿˆ8ÿ“A"ÿ›D,ÿ E5ÿ£I?ÿ¥NHû§TQó¦Z[ë¥`dã¢hmÜsvÑ•z‚É‚‹Â‡Š“¼‚‘š·}™Ÿ²z¡£¯w©¦«v³§©vÀ¨¤w¨¡y§zç›zæ›zæ›zæ›zæ›zæ›zæ›zæ›zæ›zæÿˆ' ÿ‰8ÿ•@!ÿB+ÿ¢D4ÿ¥H=ÿ¨LFøªROï«XWç«_`à¨iiÔ¡puË™xÂ’‹»‹†”µ†Žš¯‚• ª~¤¦{¦§£z°© y¼ªzÁ©š|Á©˜}¨–}§–}§–}§–}§–}§–}§–}§–}§–}§ÿ‰' ÿ‰8ÿ–?!ÿžA*ÿ£B3ÿ§F;þ«KDõ®QLì°WTä±^\Û­hfÏ¥nuÅu¼–|‹µƒ”®Š‹›¨†’ £‚š¥ž€¢¨›~¬ª˜~¸«–~À«”Àª“€Á¨’€Â¨’€Â¨’€Â¨’€Â¨’€Â¨’€Â¨’€Â¨’€Â¨’€Â¨ÿ‰' ÿŠ8ÿ˜? ÿŸ?)ÿ¥A2ÿªE:ü®IAò±OIéµVPá·_WÕ±eeʨltÀ¡s€·šz‹¯””¨ˆ›¢Š œ‡—¥—„ ¨”‚©ª‘‚µ«‚¿«ŽƒÀªƒÁ©ƒÁ¨ƒÁ¨ƒÁ¨ƒÁ¨ƒÁ¨ƒÁ¨ƒÁ¨ƒÁ¨ƒÁ¨ÿŠ' ÿ‹8ÿ™> ÿ¡>(ÿ¦@0ÿ¬C8ù±H?ðµNEçºUKÞ»^TдdeŬks»¤q€±žxŠ©˜~“¢“…š› –Œ•¥‘‰¨‡§«Š‡²¬ˆ‡¿¬ˆ‡À«ˆ†À©ˆ†Á¨ˆ†Á¨ˆ†Á¨ˆ†Á¨ˆ†Á¨ˆ†Á¨ˆ†Á¨ˆ†Á¨ˆ†Á¨ÿŠ' ÿŒ7ÿ›=ÿ¢='ÿ¨?/ÿ®B6÷´G<íºMAäÀVFÙ¿\SË·cdÀ¯is¶¨o¬¢uФœ|“œ˜ƒš•”Š ‘’¥ŠŽ›¨†¤«ƒŒ¯¬½¬‚Œ¿«ƒŠÀ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ÿ‹' ÿŽ7ÿœ<ÿ£;&ÿª=-ÿ±@3ô¸E8ê¿L<âÇU@ÓÂZRǺac»³gr°­m~§§s‰ž¡z’–€™šˆŸ‰—¤„”˜¨“¢ª|’­«z’º¬{‘À«}Á©~ŽÁ¨~ŽÁ¨~ŽÁ¨~ŽÁ¨~ŽÁ¨~ŽÁ¨~ŽÁ¨~ŽÁ¨~ŽÁ¨ÿŒ' ÿ6ÿ:ÿ¥:%ÿ­;+ü´>0ñ¼C4çÅL6ÞËR?ÎÆYQ¾`b¶¸fp«±l}¡¬rˆ˜§x‘£~˜‰ …ž‚£}›–§x™Ÿ©u˜ªªs™·«t˜Àªw”Á©x“¨x“¨x“¨x“¨x“¨x“¨x“¨x“¨x“¨ÿŒ' ÿ‘5ÿŸ8ÿ§8#ÿ¯9(ù¸<,îÂB.åÍL-ØÐO=ÉÉWP¼Ã^`°¼do¥·j|›²p†’­vŠ©|–‚¦ƒœ|¤‹¡v¢“¥r¡§o ¨©m µ©m Á¨p›Â§r™Â§r™Â§r™Â§r™Â§r™Â§r™Â§r™Â§r™Â§r™Â§ÿ& ÿ”4ÿ¡6ÿª6!ÿ³6%õ¾9'êÉ@&àÖI(ÑÕN<ÃÎVN¶È\_ªÂcmŸ½hz”¸n„‹´tƒ±z”|®šu¬ˆžp«‘¢k©›¤h©¦¦f©³¦fªÃ¥i¤Ä¥k¡Ä¥k¡Ä¥k¡Ä¥k¡Ä¥k¡Ä¥k¡Ä¥k¡Ä¥k¡Ä¥k¡Ä¥ÿŽ& ÿ—3ÿ£4ÿ­3þ¸2 ðÅ5 ãÓ?ØÞE&ÊÛM:½ÓTL°Î[]£Éak˜ÄgwÀl„½r‰|ºxu¸–o¶‡šjµe´š b³¥¡a´±¢`µÂ¡b¯Æ¢d«Æ¢d«Æ¢d«Æ¢d«Æ¢d«Æ¢d«Æ¢d«Æ¢d«Æ¢d«Æ¢ÿ& ÿ›1ÿ¦1ÿ±.÷¾-çÎ1ÙÞ9ÍãD(ÂàM8µÛSJ¨ÕYZœÐ_hÌes†Ék}}Æq…uÄw‹nÃ~iÁ†”dÀ—`Àšš]À¥›[À±›ZÁÁ›[¼Êœ]·Ê]·Ê]·Ê]·Ê]·Ê]·Ê]·Ê]·Ê]·Êÿ‘& ÿŸ/ÿª-ÿ·(íÈ&ÚÜ)Ìä6Áæ@.¶ãH>ªàNLžÝVY’Ú]eˆÖco~ÔjxvÒpnÐw…hωc·_Î[Íš’YÍ¥“Wβ“VÏ“VËДWÅÏ•WÅÏ•WÅÏ•WÅÏ•WÅÏ•WÅÏ•WÅÏ•WÅÏ•WÅÏ•ÿ“& ÿ£,ÿ°&õÀ ßÕÍä'Áë4#µê=3©çEBåKP‘ãR\†âXf|à_ntßfulÞmzfÞuaÝ}‚]܆…ZÛˆXÙ˜ŠVØ¡‹Tج‹TØ·ŒSØÉ‹SÖÖ‹SÖÖ‹SÖÖ‹SÖÖ‹SÖÖ‹SÖÖ‹SÖÖ‹SÖÖ‹SÖÖ‹ÿ—$ ÿ©& þ¸ æÎÎãÀî&´ð2(¨î;8œíCF‘ìKR†ìR\|ëYdsë^kjêdpeèluaætx^ä|{[âƒ}Yà‹Vß’UÞšƒSÞ¢ƒRݪ„Qݶ„QÝ¿„QÝ¿„QÝ¿„QÝ¿„QÝ¿„QÝ¿„QÝ¿„QÝ¿„QÝ¿„ÿŸ!ÿ°éÅ ÐÙ Àî ³ö&§õ1,›õ;:õDG…õLQ|õSZsõY`kó_feðfjaímm]ëtpZêzsXètVç‡vTæxSå”yQä›zPä¡{Oãª|Nã°|Nã°|Nã°|Nã°|Nã°|Nã°|Nã°|Nã°|Nã°|ÿ¨ë¼ ÍÌ Áà ²ú¥ü' šý2.ý=;…þEE{ÿMNrÿTUkûZZdø`_`ögb\ômeYòrgWñxiUð~jSïƒlQî‰mPínNì”oMëšpLë¡qKê¦rKê¦rKê¦rKê¦rKê¦rKê¦rKê¦rKê¦rKê¦r÷³ Ìÿѱï¤ÿ™ÿ)!Žÿ4.„ÿ?9{ÿGAqÿNHjÿTNcÿZR^þ`VZüfXWûlZUúq\Sùv^Qøz_O÷`Nö„aLõ‰bKõŽcJô”dIóšeHóžfHóžfHóžfHóžfHóžfHóžfHóžfHóžfHóžfÍ»½Ç±Ø£ÿ˜ÿÿ, ƒÿ7+zÿA4pÿG;hÿMAaÿTE\ÿZIXÿ_KUÿeMRÿjOPÿnQNÿrRLÿwSKÿ{TIÿUHþ„VGþˆWFýWDý“XDü–YDü–YDü–YDü–YDü–YDü–YDü–YDü–YDü–Y½¿°Î¢à—ÿŒÿ"ƒÿ.yÿ8%nÿ>-fÿE2_ÿL7YÿR;UÿX>Qÿ]@OÿbBLÿfCJÿjDIÿnEGÿrFFÿvGEÿzHCÿ~HBÿ‚IAÿ†J@ÿ‹K?ÿK?ÿK?ÿK?ÿK?ÿK?ÿK?ÿK?ÿK?ÿK¯Æ¢Ö–÷ ‹ÿ‚ÿ$wÿ-lÿ3ìÎÆ‘cÿ:$\ÿB(VÿI,QÿO/NÿU1KÿZ3Hÿ^5Fÿb6Dÿf7Cÿi8Aÿl8@ÿp9?ÿs:>ÿw:=ÿ{;<ÿ~<:ÿƒ<:ÿ†=:ÿ†=:ÿ†=:ÿ†=:ÿ†=:ÿ†=:ÿ†=:ÿ†=:ÿ†=ÿu$ÿv5ÿwCÿ€J'ÿ…R3ÿ†Y>ÿ…`HÿhRÿ|oZüwyb÷sƒhôoŒnñl“rïjšuíg xìe¥zëdª|êb¯}éaµ~è`»è_Àç_Ëæ^Õà`Û×bÞÔcßÔcßÔcßÔcßÔcßÔcßÔcßÔcßÿu$ÿv5ÿwCÿ€J'ÿ…R3ÿ†Y>ÿ…`HÿhRÿ|oZüwyb÷sƒhôoŒnñl“rïjšuíg xìe¥zëdª|êb¯}éaµ~è`»è_Àç_Ëæ^Õà`Û×bÞÔcßÔcßÔcßÔcßÔcßÔcßÔcßÔcßÿu$ÿv5ÿwCÿ€J'ÿ…R3ÿ†Y>ÿ…`HÿhRÿ|oZüwyb÷sƒhôoŒnñl“rïjšuíg xìe¥zëdª|êb¯}éaµ~è`»è_Àç_Ëæ^Õà`Û×bÞÔcßÔcßÔcßÔcßÔcßÔcßÔcßÔcßÿv$ÿw5ÿyBÿ‚I'ÿ‡Q2ÿˆX=ÿ‡_HÿƒfQÿ~nZûywb÷u‚iôqŠnñm’sîk™vìhŸyëf¤{êdª}éc¯èbµ€ça¼ç`Ä‚æ_΂ã_׃ÜaÛƒÒc݃Ïd݃Ïd݃Ïd݃Ïd݃Ïd݃Ïd݃Ïd݃Ïd݃ÿw$ÿx5ÿ|Aÿ…H'ÿŠO2ÿŒV=ÿ‹]Gÿ‡dQÿ‚lZû|tb÷xiótˆoðptíl—xëjž{ég¤~èfª€çd°‚æb¶ƒåa¾„å`Ç…å`Ó…ÝbÙ…ÓdÜ…ÌeÛ†ÉeÛ†ÉeÛ†ÉeÛ†ÉeÛ†ÉeÛ†ÉeÛ†ÉeÛ†ÉeÛ†ÿx$ÿx5ÿ~@ÿˆG&ÿN1ÿU<ÿŽ[Fÿ‹bPÿ†iYü€qb÷{{ióv…pïrŽuìn•yêkœ}èi£€çf©‚åe°„äc·…äbÀ‡ãaˇßbÕ‡ÕdÚ‡ÍeÙˆÆgÙ‰Äg؉Äg؉Äg؉Äg؉Äg؉Äg؉Äg؉Äg؉ÿy#ÿy4ÿ€?ÿŠF&ÿM0ÿ’S;ÿ‘ZEÿ`OÿŠgYü„na÷~xiòy‚pït‹vëp“{ém›çj¢‚åg©„äe°†ãd¹ˆâbÉâbЊØdØŠÎfØŠÇg׋ÀhÖŒ¾iÖŒ¾iÖŒ¾iÖŒ¾iÖŒ¾iÖŒ¾iÖŒ¾iÖŒ¾iÖŒÿy#ÿz4ÿƒ>ÿE%ÿ“L/ÿ•Q:ÿ”WDÿ’]NÿŽeXüˆka÷‚tiò|pîwˆvës‘|èo™€æk¡„äh©‡âf±‰ád»‹àcÇŒÜcÔŒÏfÖŒÇhÕÀiÔŽºjÔŽ¸kÔŽ¸kÔŽ¸kÔŽ¸kÔŽ¸kÔŽ¸kÔŽ¸kÔŽ¸kÔŽÿz#ÿ{4ÿ…=ÿD$ÿ–J.ÿ—N8ÿ—TBÿ•ZLÿ’aVüŽi_ö‡phòzpí{…wêvŽ|æq—ãmŸ†àj¨‰Ýg°ŒÚf»ÖeÇŽÑfÔÇhÓ¿jÓ¹kÒ‘³lÒ‘²mÒ‘²mÒ‘²mÒ‘²mÒ‘²mÒ‘²mÒ‘²mÒ‘²mÒ‘ÿ{#ÿ|4ÿˆ<ÿ’C$ÿ˜H-ÿšL7ÿšRAÿ™XJü—_Tö“f]ðnfë‡woæ€vá{‹}Üu“ƒ×qœ‡Òn¤‹Ïk¬ŽÌiµ‘ÉhÀ’ÇhÏ“¿kÑ“¸lГ²mД­oГ«oÑ“«oÑ“«oÑ“«oÑ“«oÑ“«oÑ“«oÑ“«oÑ“ÿ|#ÿ}4ÿŠ;ÿ”A#ÿšF,ÿœK5ÿP?ÿVHø›]Qñ˜c[ë“kdäumÞ†~uØ€‡|ÑzƒÌv—‰ÇrŸÄo§‘Àm°“¾l»•»kÈ–¶mÏ–°oΖ«pÏ–¦qÏ•¥rÏ•¥rÏ•¥rÏ•¥rÏ•¥rÏ•¥rÏ•¥rÏ•¥rÏ•ÿ|#ÿ}4ÿŒ:ÿ—@"ÿœE+ÿŸI4ÿ N<û¡TEô ZNìaXå™iaÞ“sjÕŒ{tÎ…ƒ}È‹„Âz“оv›ºs£“¶q«–³o¶˜±o˜­p͘¨r͘¤s͘ tΗŸtΗŸtΗŸtΗŸtΗŸtΗŸtΗŸtΗŸtΗÿ}#ÿ3ÿŽ9ÿ™?!ÿžC)ÿ¡G2ÿ£L:ø¥RCð¤XKè£_TáŸh]טphΑxtÆŠ€}À„ˆ…º‹µ{—±wŸ”­u§—ªs±™§s½›¥sË› uËšvÌššwÍ™™w͘™w͘™w͘™w͘™w͘™w͘™w͘™w͘ÿ~"ÿ€2ÿ8ÿ›? ÿ B(ÿ¤F0þ¦K8ô¨P@ì©WGä©]PÜ¥fZÐnhÇ•us¿Ž}}¹‰„…³ƒŒŒ­“‘©|›•¤y¤™¡w­›žw¹œœwÈœ™xÊœ—yË›•zÌš”zÌ™”zÌ™”zÌ™”zÌ™”zÌ™”zÌ™”zÌ™”zÌ™ÿ~"ÿ‚2ÿ’7ÿœ=ÿ¡@'ÿ¦D.û©I5ñ¬O<é®UCá¯]KÕ¨dYË¡kg™ss¹“z}²…¬ˆ‰Œ¦„‘¡€˜–} š™|ªœ–{¶”{Äž’|Ê‘}Êœ}Ë›}Ìš}Ìš}Ìš}Ìš}Ìš}Ìš}Ìš}Ìšÿ"ÿ„1ÿ“6ÿž<ÿ£?%ÿ¨B,ø­G2ï°M9æ´T?ݳ[IЬbYƤjf¼qr´—w|¬‘~…¦Œ†Œ ˆ‘š…•––‚žš’€§²ž€ÁžŒ€Éž‹€ÊŠ€Ë›Š€Ë›Š€Ë›Š€Ë›Š€Ë›Š€Ë›Š€Ë›Š€Ë›Š€Ë›ÿ"ÿ…0ÿ•6ÿŸ;ÿ¥=$ÿ«A*õ°E/ìµL4ãºT9Ø·YH˯aXÁ¨hf·¡or¯›u|§•|„ ‘ƒ‹š‹‘”Š“–‡›š‹…¥ˆ„°Ÿ†„¾Ÿ……Éž…„É…„Êœ…„Ë›…„Ë›…„Ë›…„Ë›…„Ë›…„Ë›…„Ë›…„Ë›ÿ€"ÿ‡/ÿ—5ÿ :ÿ§<"þ­?'ó³D,éºK0á¿R5ÓºXGdz_W¼¬fe²¥mq©Ÿs{¡šz„š–‹”’ˆ‘Ž–‰Œ™š„ТЭŸŠ»Ÿ~ŠÈž‰É€ˆÊœ€ˆË›€ˆË›€ˆË›€ˆË›€ˆË›€ˆË›€ˆË›€ˆË›ÿ"ÿ‰.ÿ™5ÿ¢8ÿ©: û°=$ð¸B(æ¿J*ÝÃO4νVF¶^V·°ed­©kp¤¤qzœŸxƒ”›~ŠŽ—†ˆ•Ž•‚’–™~ œz«žx¸ŸwÉžyŽÊzŒË›{ŒË›{ŒË›{ŒË›{ŒË›{ŒË›{ŒË›{ŒË›{ŒË›ÿ"ÿ‹-ÿ›4ÿ¤7ÿ¬8ø´:!í½@#äÆI#×ÇL3ÉÁUE½º\U²´cc¨®ioŸ©oy–¥v‚Ž¡|‰‡ƒ›‹”|˜”˜w—›s–¨q–µžp–Ær”Êœt’Ë›u‘Ëšu‘Ëšu‘Ëšu‘Ëšu‘Ëšu‘Ëšu‘Ëšu‘Ëšÿ‚"ÿ, ÿ4ÿ¦4ÿ¯5ô¸7éÃ>àÍEÑËK2ÄÅTC¸¿[S­¹aa¢´hm™¯nw«t€ˆ§z‡¤{¢‰’u ‘–pž›™m¦›j³œižÃœkœË›n˜Ìšo—Ì™o—Ì™o—Ì™o—Ì™o—Ì™o—Ì™o—Ì™o—Ì™ÿƒ!ÿ+ ÿ 3ÿ©2ý³1ð¾4åË;ÚÔ?ËÏI0¾ÉRB²ÄYQ§¿`_œºfk’¶lu‰²r~¯x…z¬‹tª‡o¨“j§™–g¦¤˜d¦±™c§Á™d¥Í˜g Í˜hŸÍ—hŸÍ—hŸÍ—hŸÍ—hŸÍ—hŸÍ—hŸÍ—hŸÍ—ÿ„!ÿ“) ÿ¢0ÿ­.ø¸,ëÆ/àÕ8 ÒÚ=ÅÔH.¸ÏP@¬ÊXO Å^]•Ádh‹½jrƒºpz{·vtµ}‡n³…‹h²Žd±˜’a°£”^°°•]±¿•]±Ð”`ªÐ”a¨Ð”a¨Ð”a¨Ð”a¨Ð”a¨Ð”a¨Ð”a¨Ð”a¨Ð”ÿ†!ÿ—( ÿ¦, ÿ±(òÀ& ãÐ(Ôß2 Éß>½ÛG,±ÖO=¤ÑVL™Í\YŽÉbe„Æhn{ÄovtÁu|mÀ|‚h¾„†c½‰_¼—Œ[¼¢ŽY¼¯X½¾ŽW¾ÔŽY¶ÓZ´ÓZ´ÓZ´ÓZ´ÓZ´ÓZ´ÓZ´ÓZ´Óÿˆ!ÿœ'ÿª' ü¸! éÊÕÞ Éå0¾ã=´áF,¨ÞN:œÚUH‘Ö[U†Óa`|ÐgitÎnpmÍuvgË|{bË„~^Ê‚ZÊ—„WÊ£†Uʯ†T˾†SÌÕ†TÄÙˆUÁÙ‰UÁÙ‰UÁÙ‰UÁÙ‰UÁÙ‰UÁÙ‰UÁÙ‰UÁÙ‰ÿÿ¢%ÿ°òÂÙÛÉæ ½è/²ç:"§åC1›ãJ>áPJ†ßWT|Þ^]tÝedlÛljfÛtoaÚ|s\Ù„vYÙŽyUÙ˜{SÚ£|QÚ°}PÛ¾}PÜÓ|PÔà~QÐàQÐàQÐàQÐàQÐàQÐàQÐàQÐàÿ•ÿ©ûºÔÍ Éæ¼í °í.¥ì9'šëB5êIA…éPK{èWSrè]Zjçc`dçje_çri[çzlWç‚nSç‹qPç•rNèŸtLèªuKèµvJçÃvJèÝvKäàuKäàuKäàuKäàuKäàuKäàuKäàuKäàuÿÿ±Óà ÇÑ »ò¯ó!£ó.™ó9*ŽóB6„óJA{óRIróWPió\VcócZ]ói^YópaUówcRófOò‡gMðiKï˜kJï lIî©mHî³mGíÀnFíÇnFíÇnFíÇnFíÇnFíÇnFíÇnFíÇnFíÇnÿ§ÓºÅÇºÖ ­ú¢ú"—ú/û:+ƒüC5zýL>qýQEhýVKaþ[O\þbSWþhVTýoXQûuZNú|\Lùƒ]JøŠ_H÷‘`Gö™aFö bEõ§cDô±dCôµdCôµdCôµdCôµdCôµdCôµdCôµdCôµdÖ²ľ·Ì¬Ü  ÿ²)Š•ÿ%‹ÿ2‚ÿ<)yÿE2oÿJ9gÿO?_ÿUCZÿ[GUÿaJRÿgLOÿlNMÿrOKÿxQIÿ~RGÿ„SEÿ‹TCÿ‘UBþ˜VAýžW@ý¦X@ü©X@ü©X@ü©X@ü©X@ü©X@ü©X@ü©X@ü©XƸ¶ÄªÓžò ”ÿ Šÿ(ÿ4wÿ<%mÿB,eÿG2]ÿM6WÿS:SÿY=Oÿ_?LÿdAJÿiCHÿnDFÿsEDÿyFBÿ~GAÿ„H?ÿŠI>ÿJ=ÿ•K<ÿœL<ÿŸL<ÿŸL<ÿŸL<ÿŸL<ÿŸL<ÿŸL<ÿŸL<ÿŸL·¼©ËœÛ’ÿ‰ÿ€ÿ*uÿ1kÿ8bÿ>$[ÿD)TÿJ,PÿQ/LÿW2Iÿ\3Fÿ`5Dÿe6Bÿi7Aÿn8?ÿs9=ÿw:<ÿ|;;ÿ‚<9ÿ‡=8ÿŒ=7ÿ“>6ÿ•>6ÿ•>6ÿ•>6ÿ•>6ÿ•>6ÿ•>6ÿ•>6ÿ•>ªÄœÒç†ÿ|ÿqÿ$ hÿ+_ÿ2Wÿ9Qÿ?LÿF!HÿM#EÿR%BÿW'@ÿ[(>ÿ_)<ÿc*:ÿg+9ÿk,7ÿo,6ÿt-5ÿx.4ÿ}.2ÿ‚/1ÿˆ01ÿŠ01ÿŠ01ÿŠ01ÿŠ01ÿŠ01ÿŠ01ÿŠ01ÿŠ0ÿj$ÿi2 ÿl>ÿvFÿ{M)ÿ|U3ÿz]=ÿvfFÿqnMÿmyTÿj„Zþf_ûc•bùaœeø_¢h÷^¨jö\­kõ[³lôZ¹nóYÁnóXÉoòXÔpïXàpéYäpãZæpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÿj$ÿi2 ÿl>ÿvFÿ{M)ÿ|U3ÿz]=ÿvfFÿqnMÿmyTÿj„Zþf_ûc•bùaœeø_¢h÷^¨jö\­kõ[³lôZ¹nóYÁnóXÉoòXÔpïXàpéYäpãZæpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÿj#ÿi1 ÿn>ÿwEÿ|M(ÿ~T3ÿ|\<ÿydEÿsmNÿoxUÿk‚Zýh‹_ûe”cùb›f÷`¡iö^§kõ]­lô\³nóZºoòYÁpòYÊqñXØqìYáqæZäqà\çqØ]èqØ^èqØ^èqØ^èqØ^èqØ^èqØ^èqØ^èqÿk#ÿj1 ÿq<ÿzCÿ€K(ÿS2ÿ€Z<ÿ|bEÿwjNÿqtUÿn[ýj‰`úf’død™höa kõ_§mó^­oò\³pò[ºqñZÃrðYÍsîYÝsèZâtá\åsÙ^æsÐ_çtÐ_çtÐ_çtÐ_çtÐ_çtÐ_çtÐ_çtÐ_çtÿl#ÿk1 ÿs;ÿ}Bÿ‚J'ÿ„Q2ÿƒY;ÿ€`Eÿ{hMÿtqUÿp|[ül‡aùhf÷e˜iõcŸlóa¦oò_¬qñ]³rð\»tï[ÅuïZÐuêZßvâ\âvÛ_åuÑ`ævÊaåwÊaåwÊaåwÊaåwÊaåwÊaåwÊaåwÊaåwÿm"ÿl1 ÿv:ÿ€Aÿ…H'ÿˆO1ÿ‡W;ÿ„^DÿfMÿxnUÿsy\ün„bùjgög–kôdžnòb¥qñ`¬sï^´uî]¼vî[Çwí[Öxå\àxÜ_ãxÒ`äxËaäyÄcãzÄcãzÄcãzÄcãzÄcãzÄcãzÄcãzÄcãzÿn"ÿm1 ÿx8ÿƒ?ÿ‰G&ÿ‹N0ÿ‹U9ÿˆ\CÿƒcLÿ}kTÿvu\ür€bømŠgõi”lófœpñc¤sïa¬uî_´wí]¾yì\Ëzè\ÜzÞ_ázÒaã{Êbâ|Äcâ}¾eá}½eá}½eá}½eá}½eá}½eá}½eá}½eá}ÿn"ÿn0 ÿ{7ÿ†>ÿŒE%ÿL.ÿS8ÿZAÿˆaKÿƒiSú|q[÷v|bóq‡hðmmíi™qêf¡uèc©xæa²zä`»{â_Ç|à_Ú}Ôbá}Êcà~Ãdà½f߀·g߀·g߀·g߀·g߀·g߀·g߀·g߀·g߀ÿo!ÿo0 ÿ~6ÿ‰<ÿD$ÿ“L-ÿ“R6ÿ’Y@ÿŽ`IùˆfRô‚nZï|yaëwƒhçrŒnäm•sàjwÝg¦zÚe®|Öc¸~ÓbÀÑbÓÊdßÁeÞ‚»gÝ‚µh݃°i݃°i݃°i݃°i݃°i݃°i݃°i݃°i݃ÿp!ÿr/ ÿ4ÿŒ;ÿ“C"ÿ—K+ÿ—Q4ÿ–W=ú“]FóŽdOîˆkXè‚u`ã|hÞw‰nÙr‘tÓn™yÐk¡}Ìh©€Éf²‚Çe½ƒÅeË„ÁfÜ„¹hÛ…³iÛ…®kÛ…©lÛ…©lÛ…©lÛ…©lÛ…©lÛ…©lÛ…©lÛ…©lÛ…ÿq!ÿt. ÿ„3ÿ:ÿ–C!ÿšI)ÿšN2üšT;õ˜[Dî”bMçiUá‰s^Û‚|fÓ|…oÍwuÉr•zÅoÁl¥‚¾j­…»i¸‡¹iĈ·i؈°kÙˆ«lÙˆ§mÙˆ£oÚ‡£oÚ‡£oÚ‡£oÚ‡£oÚ‡£oÚ‡£oÚ‡£oÚ‡ÿq ÿv, ÿ†2ÿ’:ÿ™B ÿœG'ÿžL/øžR8ðX@éš_Iâ•gRÚp\чxfÊoÅ|‰vÀw|»t˜€·q „´o©‡±m³‰®l¿Š¬lÏ‹¨n׋¤oØŠ pØŠqÙ‰qÙ‰qÙ‰qÙ‰qÙ‰qÙ‰qÙ‰qÙ‰ÿr ÿx+ ÿˆ0ÿ”9ÿ›AÿŸE%ý¡J-ô¢P4ì¢V<ä \EÜ›eOÒ“m\ÊŒufÆ}o½…v·|}³x”®uœ†«s¥‰§q®‹¥pº£pÉ qÕœsÖŒštÖ‹—tØŠ—tØŠ—tØŠ—tØŠ—tØŠ—tØŠ—tØŠ—tØŠÿs ÿz* ÿ‹/ÿ–9ÿ?ÿ¡C#ú¤H*ñ¦N1è§T8á§\@ÕŸbN˘k[Ñrf¼‹zo¶…‚w°‰}«}‘‚¦y™†¢w¡ŠŸu«œt¶ŽštŘuÔŽ•vÕ“wÕ’wÖ‹’wÖ‹’wÖ‹’wÖ‹’wÖ‹’wÖ‹’wÖ‹’wÖ‹ÿs ÿ|) ÿ/ÿ˜8ÿŸ=ÿ¤A!÷¨F'í«L-å­R3ܪY?УaMÆœiZ¾•pe¶wo¯Šv©…†}¤Ž‚Ÿ~–‡›{ž‹—y¨Ž”x³’xÁyÓzÔŽzÕŒ{ÖŒŒ{ÖŒŒ{ÖŒŒ{ÖŒŒ{ÖŒŒ{ÖŒŒ{ÖŒŒ{ÖŒÿtÿ~( ÿŽ.ÿ›8ÿ¡<ÿ§?ô«D$ê¯J)â³Q.Ö®W>˧_MÁ gZ¹™ne±“unªŽ|v£Šƒ}ž†‹‚™ƒ“‡”€›‹~¥Ž}°Š}½‘‰~Бˆ~Óˆ~ÔŽ‡~Õ‡~Õ‡~Õ‡~Õ‡~Õ‡~Õ‡~Õ‡~Õÿtÿ€'ÿ.ÿ7ÿ£:ü©=ñ¯B ç´H$ß·N,ѱU=Ǫ^L½£eY´ld«—sn¤“zvžŽ|˜‹ˆ‚’‡‡Ž…™‹‰ƒ¢Ž†‚­ƒ‚»‘‚‚Ì‘‚‚Ó‚‚Ô‚Õ‚Õ‚Õ‚Õ‚Õ‚Õ‚Õ‚Õÿuÿ‚&ÿ’- ÿŸ6ÿ¥8ù¬;î³?å¹FÚ»K+Í´T<®\K¸§cX¯¡jc¦œqmŸ—wu˜“~|’†‚ŒŽ‡‡Š–‹ƒˆ Ž‡«}‡¸‘{‡É‘|‡Ó|†Ô}…Õ}…Õ}…Õ}…Õ}…Õ}…Õ}…Õ}…Õÿuÿ„%ÿ”- ÿ 5ÿ¨6ö¯8ë·=â¿EÕ¾I*ȸS;½±[J³«bWª¦hb¡¡ol™œut’˜|{Œ•ƒ†’‹†”‹|ŽžŽy¨vŒµ‘tÆ‘uÓv‹Ôx‰Õx‰Õx‰Õx‰Õx‰Õx‰Õx‰Õx‰Õÿvÿ†$ÿ—, ÿ¢2ÿ«3ò³5è¼:ÞÅ?ÐÁH)Ä»Q9¹µYH®°`U¥ªgaœ¦mk”¢tsžzz†›€€˜‰…{–’‰v”›r“¦o“³n“Ãn“Óp‘ÔŽrŽÕrŽÕrŽÕrŽÕrŽÕrŽÕrŽÕrŽÕÿwÿ‰"ÿ™, ÿ¥0 ü®/ï¸1äÃ7 ÙÊ;ËÅF'¿¿P8³ºXG©µ_TŸ°e_–¬kiލrq†¥xx€¢~zŸ‡ƒtˆo›™‹lš¤iš°Žg›ÀŽg›ÕŽi˜Õl”ÖŒl”ÖŒl”ÖŒl”ÖŒl”ÖŒl”ÖŒl”ÖŒl”ÖŒÿxÿŒ!ÿ+ÿ¨, ø³* ê¿+ àÌ2ÑÎ9ÅÉE%¹ÄN6®¿VE£»]R™¶c]²ig‡¯po€¬vvy©}|s§„n¥…i¤—ˆe£¢Šc£®Œa£¾Œ`¤Ò‹c ×‹eœØŠeœØŠeœØŠeœØŠeœØŠeœØŠeœØŠeœØŠÿzÿ ÿ )ÿ¬'ò¸$åÇ$ÙÕ'ËÓ7¿ÎC#³ÊL4§ÅTBœÁ[O’½bZ‰ºhd·nly´trs²{xm°ƒ}h¯‹c®•„_­ †]­­‡[­¼‡Z®Ð‡\ªÚ‡_¥Ú‡_¥Ú‡_¥Ú‡_¥Ú‡_¥Ú‡_¥Ú‡_¥Ú‡_¥Ú‡ÿ~ÿ”ÿ¥&ý± ìÁßÓÐÜ%ÄÙ5¸ÕA!¬ÐK1 ÌR?•ÉYL‹Å`W‚Ãf`zÀlgs¾sml¼zsg»‚wbºŠ{^¹”~Z¸Ÿ€X¸¬V¹»UºÏV¶Þ‚X°Ý‚X¯Ý‚X¯Ý‚X¯Ý‚X¯Ý‚X¯Ý‚X¯Ý‚X¯Ý‚ÿ„ÿ™ÿªõ¹ÞÍ ÐßÅà&»ß6°Ý@¤ÙI-˜ÕQ;ÑXHƒÏ^R{ÌeZsËkalÉrgfÈylaÇp]ÆŠtYÆ”vVÅŸxSƬyRÆ»zQÇÏyQÄãzS¼â|S¼â|S¼â|S¼â|S¼â|S¼â|S¼â|S¼â|ÿŠÿŸÿ°ØÃ ÎÑ Äå¹ä&®ä4¤â? ™àG-ÞO9…ÜVD{Ú]LsÙdTl×kZfÖr_aÕyd\Ô‚gXÔ‹jUÔ•mRÔ nPÔ­oNÕ¼pMÖÐoMÕèpNÌérNÌérNÌérNÌérNÌérNÌérNÌérNÌérÿ’ÿ§ع f˜ËÆÂÕ ·ê¬ê' ¢é4˜è>$çG0ƒæN:zåTCqäZJiäaPdãhU_ãpYZãx\Vã€_Sã‰bPã“dMäeKä©gJå¶gIåÆgHæßgJàìgJßìgJßìgJßìgJßìgJßìgJßìgJßìgÿœ Û±ʽ¿ÊµÚ ªï ð(–ð5Œð?&‚ðG1yðN9pïT@hïZFaï`K]ïgOXïnRTïuUQð}WNð…YKð[Hñ™\Fñ£^Dò¯_Cò»_BóÌ`Aóç`Aóè`Aóè`Aóè`Aóè`Aóè`Aóè`Aóè`Þ§˶½Á²Ï§ê ÷”ø+Šø6ù@&xúH/oúM6gúS<`úX@[û_DVûeGRûlIOürKKüyMHüOEýŠQCý“RAþœS?þ¦T=ÿ±U=þ¼V<þÍV<þÎV<þÎV<þÎV<þÎV<þÎV<þÎV<þÎVΰ½º±Ç¥Ö›ý‘ÿ ˆÿ-€ÿ9vÿ?#mÿE*eÿK0^ÿQ5XÿW8Sÿ];Oÿc>Lÿh@IÿnAFÿuCCÿ|D@ÿ„F=ÿŒG<ÿ”H;ÿI:ÿ¥J9ÿ­K8ÿ¹K8ÿ¹K8ÿ¹K8ÿ¹K8ÿ¹K8ÿ¹K8ÿ¹K8ÿ¹K¾µ°À¤Î—Þÿ†ÿ#}ÿ.sÿ5jÿ<bÿB$[ÿH(UÿN,PÿT/LÿZ1Hÿ_3Eÿd5Bÿj6?ÿp7=ÿv9;ÿ|:9ÿƒ;8ÿ‹<6ÿ“=5ÿš>4ÿ¡>3ÿª?3ÿª?3ÿª?3ÿª?3ÿª?3ÿª?3ÿª?3ÿª?±º£È–Ö‹ô ƒÿyÿ oÿ( gÿ0_ÿ7Xÿ>RÿDLÿJ"HÿP$DÿU&AÿZ'>ÿ_);ÿd*:ÿi+8ÿn,6ÿt-4ÿz.3ÿ/1ÿˆ00ÿ0.ÿ–1-ÿž2-ÿž2-ÿž2-ÿž2-ÿž2-ÿž2-ÿž2-ÿž2¤Â–ψ߀ÿ uÿjÿbÿ!Zÿ) Sÿ1Mÿ8Hÿ>CÿD?ÿJ<ÿO9ÿS7ÿX5ÿ\3ÿa1ÿe0ÿj .ÿp -ÿv!+ÿ|"*ÿ‚#(ÿˆ#'ÿ$'ÿ$'ÿ$'ÿ$'ÿ$'ÿ$'ÿ$'ÿ$ÿ`%ÿ[0ÿa: ÿjAÿoJÿqR)ÿo[2ÿkd:ÿgnAÿdzGÿ`„Lÿ]ŽPÿZ–SÿXžVÿW¥XÿU«ZÿT±[ÿS·\ÿR¾]þQÇ^üQÑ_ûPà_øPé_óQí_îSð_èTñ_äVò_äVò_äVò_äVò_äVò_äVò_äVò_ÿ`%ÿ[0ÿb9 ÿl@ÿqIÿrQ)ÿqZ2ÿmc:ÿhmAÿexGÿaƒMÿ^Qÿ[–TÿYWÿW¤YÿVª[ÿU±\ÿT·]þS¿^ýRÇ_üQÓ`úPâ`öQé`ñRî`ëTï`åVñ`áWò`áWò`áWò`áWò`áWò`áWò`áWò`ÿa%ÿ\0ÿe8 ÿn?ÿtGÿuP(ÿtX1ÿpa:ÿkjAÿgvHÿcMÿ`‹Rÿ]”UÿZœXÿX£ZÿWª\þV°^ýT·_ýS¿`üSÉaúRÖbøQäbóRêbíTîbæVïbàXðbÛXñcÛXñcÛXñcÛXñcÛXñcÛXñcÛXñcÿb%ÿ]/ÿg6 ÿq>ÿwFÿxN(ÿwV1ÿt_:ÿnhAÿjsHÿf~Nÿb‰Sÿ_’Vÿ\›ZÿZ¢\þX©^ýW°`üU·aûTÀbûSÊcùSÚdõRædïTëdèVîdáXïdÙYðeÓZðfÓZðfÓZðfÓZðfÓZðfÓZðfÓZðfÿb$ÿ^/ÿj5 ÿt<ÿzDÿ|L'ÿ{T0ÿw\9ÿreAÿloHÿh{Nÿd†Sÿ`Xÿ]™[þ[¡^ýY¨`üX°bûV¸cúUÁdùTÍe÷SÞfòTçfêVëfâYîfÚZîgÑ[ïhÌ\ðhÌ\ðhÌ\ðhÌ\ðhÌ\ðhÌ\ðhÌ\ðhÿc$ÿ_.ÿm3 ÿw:ÿ}Bÿ€J&ÿR0ÿ|[8ÿwcAÿplHÿlwOÿg‚TÿcYý`–\ü]Ÿ_ú[§bøY®d÷X¶fõWÀgôVËhñUÝhíVéiãYìhÚ[íiÐ\îjÉ]îkÅ^îkÅ^îkÅ^îkÅ^îkÅ^îkÅ^îkÅ^îkÿd#ÿa-ÿp2 ÿ{8ÿ@ÿ„I%ÿ„Q.ÿY7ÿ|a@ÿviHÿpsOûlUøh‰Zöd’^óa›añ_£dð]«fî[³hìZ¼jêYÇkèYØkäYèkÚ[ëlÏ]ímÈ^ìnÂ_ìn¾`ìo¾`ìo¾`ìo¾`ìo¾`ìo¾`ìo¾`ìoÿe#ÿd+ÿs0 ÿ~6ÿ…?ÿ‰H$ÿ‰O-ÿ†W6ÿ‚^>ü|fFøvpNôq{Uðm…ZíiŽ_êe—cèbŸfæ`§iã^¯ká]¹là\ÄmÞ\ÓnÙ]ænÎ^ëoÆ_êq¿aêqºbér¶cér¶cér¶cér¶cér¶cér¶cér¶cérÿf#ÿg)ÿw. ÿ‚5ÿ‰>ÿG"ÿN+ÿŒU3üˆ\<öƒdEñ|lMìwwTèrZänŠ`áj“dÝf›hÚd£kÖb¬nÓ`µpÐ_¿qÎ_ÍrË_âsÄaès½bèt·dçt²eçt¯fçt¯fçt¯fçt¯fçt¯fçt¯fçt¯fçtÿg"ÿj'ÿz, ÿ†4ÿ=ÿ‘E ÿ’M(ý‘S1öŽZ:ð‰aBêƒiKå~tSàx}ZÚs†`ÔnfÐk—jÌhŸnÉf§qÇd¯sÄc¹uÂbÆvÀbÚwºdæw³eåw®fåwªhåw¨hæw¨hæw¨hæw¨hæw¨hæw¨hæw¨hæwÿg"ÿm&ÿ}* ÿ‰4ÿ‘<ÿ•Dÿ—K&ø–R.ñ”X6ê^?äŠgHÝ„qPÕ}yZÏx‚aÊsŠgÆo’lÂlšp¿j¢s¼hªv¹g´x¶fÀy´fÐz±gãz«hãz§jãz£käy¡käy¡käy¡käy¡käy¡käy¡käy¡käyÿh!ÿo$ÿ€) ÿŒ3ÿ”;ÿ™Cý›I#ô›O*ì™U3å–\;Þ‘eEÔ‰mP̃vZÇ}~aÁx†h½tŽm¸q–rµnu±l¦x®k¯{¬j»|ªiÊ}¨já}£lâ|Ÿmâ|œnâ{šnã{šnã{šnã{šnã{šnã{šnã{šnã{ÿi!ÿq#ÿ‚( ÿ2ÿ—;ÿœBùžF ðŸL'èŸR.àZ6Ö•aDÍŽjOƈrY¿‚zb¹}‚h´yŠn°v’s¬sšw¨p¢z¥o«}¢n¶~ mÅžnÛ›oà~˜pá~–qá}”qâ|”qâ|”qâ|”qâ|”qâ|”qâ|”qâ|ÿi!ÿt"ÿ…(ÿ‘1 ÿš:ÿŸ?õ¢Dì¤J#ä¤P)Û¡W5Ïš_CÇ“hO¿ŒpY¸‡wa²‚h­~†n©zŽs¤w–x už{s¨~šr³€—qÀ–rÓ“s߀‘tàtà~tá}tá}tá}tá}tá}tá}tá}ÿj!ÿv ÿ‡'ÿ”0 ÿ9ý¢=ò¥Aé¨GàªM%Ô¤T4Ê]BÁ—eNº‘mX²‹ua¬†|h§‚ƒn¢‹t|“x™y›|•w¥’v¯v½‚Žv΂wÞ‹w߀ŠxàŠxà~Šxà~Šxà~Šxà~Šxà~Šxà~Šxà~ÿj ÿxÿ‰&ÿ–0 ÿŸ7ú¤:ï©?æ­EÜ®J$ϨS3Æ¡\A½›dM´•kX­r`§‹yh¡‡n›ƒˆt—€x’~™|Ž|¢‹z­‚ˆzºƒ‡z˃†{Þ‚…{Þ…{߀…{à…{à…{à…{à…{à…{à…{àÿk ÿzÿ‹&ÿ˜/ ÿ¡5 ÷§8ì­<ã²B×±G#Ë«R2Á¥Z@¸ŸbL°™iW¨”p`¡wg›‹~n–ˆ†s‘…ŽxŒ‚–|ˆ€Ÿ€„ª‚·ƒ€È„€ÝƒÞ߀€~à€~à€~à€~à€~à€~à€~àÿl ÿ|ÿ%ÿš. ÿ£3 ôª4 é±9ß·?Ò´F"Ç®P1½¨Y?³¢`K«gV£˜n_œ”ug–|mƒs‹Š‹x†ˆ”|†€~„¨‚{„µƒy„Å„x…݃y„Þzƒß€z‚àz‚àz‚àz‚àz‚àz‚àz‚àÿmÿ~ÿ$ÿ,þ¦0 ð®1 å¶5 Û¼9ηE òO0¸¬W>¯§_J¦¡eUžl^—™sf•zlŠ’r…‰w€‘|{‹›wŠ¥‚t‰²ƒr‰ÂƒrŠÚƒs‰Þt‡ß€u†àu†àu†àu†àu†àu†àu†àÿoÿ€ÿ’#ÿ +ú©,í²,â¼1ÕÀ6É»C¾¶M.´°V<ª«]I¡¦dT™¢j]‘žqeŠ›xk„˜q–†vy“zu‘˜~q£n¯‚l¿ƒk‘Õ‚mÞo߀p‹àp‹àp‹àp‹àp‹àp‹àp‹àÿqÿƒÿ•!ÿ£)ö­'è·&ÞÃ*ÐÃ5Ä¿A¹ºL-®µT;¥°[G›¬bR“¨i[‹¥oc…¢vj~Ÿ|oxœ„tsšŒyo™–|k—¡h—­€f—¼e˜Ñ€f–ßh“à~j‘á~j‘á~j‘á~j‘á~j‘á~j‘á~j‘á~ÿuÿ‡ÿ˜ ÿ¦%ò² ä¾×É"ÊÇ3 ¾Ã@³¿J+©ºS9Ÿ¶ZE–²aP¯gY…¬m`~©tgx¦zmr¤‚rm¢Švh¡”yd Ÿ|aŸ«~_ º~_ Î~_Ÿá}b›á}c˜â|c˜â|c˜â|c˜â|c˜â|c˜â|c˜â|ÿxÿ‹ÿý«ì¸ÞÈÏÍÄÌ0 ¸È>­ÅH(£ÁQ6˜½XB¹_M†¶eV³k]x±rdr¯yil­€ng¬‰rbª’u_©x\©ªzZ©¹zYªÌzX©äz[¤äz]¡äy]¡äy]¡äy]¡äy]¡äy]¡äy]¡äyÿ}e'M1ÿÿ¡ö±ÙÁ ÒÏ ÈÒ¼Ñ. ±Î;¦ËF%œÈO3‘ÄV?ˆÁ]I€¿cRx¼jYqºp_k¹wdf·ia¶‡m]µ‘pYµœrV´©tT´¸tSµËtSµätT°çuV¬çuV¬çuV¬çuV¬çuV¬çuV¬çuV¬çuÿƒÿ–ÿ¨Ù¸ ÎÄ ÇÒ ¿Ù´Ø+©Ö9ŸÓD"”ÐM/ŠÍT;Ê[DxÈbMqÇiSkÅoYeÄv^`Ã~b\‡fXÁ‘hUÁœkRÁ¨lPÁ·mOÂÊmOÂälO½ìnP¹ìoP¹ìoP¹ìoP¹ìoP¹ìoP¹ìoP¹ìoÿ‰ÿگͻÄÇ¼Ö ³ßªß+ Þ9–ÝCŒÚK*‚ØS5yÕZ?qÓaFjÒhLeÑoR`ÐvV[Ð~ZWχ]SÏ‘_PÏœaNÏ©cLϸcKÐËcLÐåbJÎòeKÈòfKÈòfKÈòfKÈòfKÈòfKÈòfKÈòfÿ’ Þ¦δ¿¹Ì°Ý §åžå- ”å9ŠäB ãJ*wâP3oáX;ià_AcàfF^ßnJZßuNVß}QR߆SOßVMß›WKà§XIàµYHáÆYHáßYGßðYFÜõ[FÜõ[FÜõ[FÜõ[FÜõ[FÜõ[FÜõ[íœÑ­¸·Ã­Ñ¤í›í ’í.‰ì:€ìC!vìJ*nìP1fëV7`ë\<[ëd@WëkCSërFPëzIMìƒKJìŒMHì–NEí¡PCí®QBî¼QAïÌRAïåR@íñQ@íñQ@íñQ@íñQ@íñQ@íñQ@íñQԥIJ¶¼«É Ø—ôõ$‡õ1~ö;töB löH'eöO-^÷U1Y÷[5U÷b8Q÷h;Møo=Jøv?Gø~ADù‡CBù‘E@ú›F>ú¦G<û±H;û¾I:üÏI9üãI9üãI9üãI9üãI9üãI9üãI9üãIÇ­··ªÃžÐ“ã Œý„þ'{ÿ1rÿ8iÿ@bÿF"\ÿM&VÿS*RÿY-Nÿ_0Jÿe2Gÿk4Dÿq5Aÿy7?ÿ8<ÿŠ::ÿ“;8ÿ<6ÿ§=5ÿ±>4ÿ¾>3ÿÊ?3ÿÊ?3ÿÊ?3ÿÊ?3ÿÊ?3ÿÊ?3ÿÊ?¸²ª½Ê‘؈û ÿvÿ$nÿ- fÿ5_ÿ<XÿCSÿINÿO!JÿU$Fÿ[&Cÿ`'@ÿf)>ÿk*;ÿr+9ÿy-6ÿ.4ÿŠ/1ÿ”00ÿœ1.ÿ¥2-ÿ¯3,ÿ·3,ÿ·3,ÿ·3,ÿ·3,ÿ·3,ÿ·3,ÿ·3«¸žÅÒƒà}ÿrÿhÿaÿ'Zÿ/ Tÿ7Nÿ>IÿDEÿJAÿO>ÿU;ÿY9ÿ_6ÿd4ÿi2ÿp /ÿw!-ÿ"+ÿ‡#(ÿ$'ÿ™%&ÿ¡&%ÿ§&%ÿ§&%ÿ§&%ÿ§&%ÿ§&%ÿ§&%ÿ§&ŸÀ‘̓Ûxöoÿ dÿ\ÿTÿ Nÿ'Hÿ/Cÿ6 ?ÿ< <ÿB8ÿG5ÿL3ÿQ0ÿV.ÿZ,ÿ_*ÿe(ÿk&ÿq#ÿy"ÿ ÿ‰ÿ‘ÿ—ÿ—ÿ—ÿ—ÿ—ÿ—ÿ—ÿV'ÿQ2ÿV5ÿ_=ÿdEÿfNÿdX'ÿab/ÿ^n5ÿZy;ÿW„?ÿTCÿQ˜FÿO HÿN§JÿM®KÿLµLÿK¼MÿJÄNÿIÎOÿIÞOÿHéPÿHòPüIöP÷KùPñLúOëNûPêOûPêOûPêOûPêOûPêOûPêOûPÿV'ÿQ2ÿX4ÿb;ÿgDÿiMÿgV'ÿc`/ÿ`k5ÿ\w;ÿX‚@ÿUDÿS–GÿPŸIÿO¦KÿN­MÿM´NÿL¼OÿKÅPÿJÏQÿIàQÿIëQþIòRùK÷RóMùQíOúQæPúRåPúRåPúRåPúRåPúRåPúRåPúRÿW'ÿR1ÿZ2ÿd:ÿjBÿlKÿjT'ÿg^/ÿbh6ÿ^t<ÿZ€AÿW‹EÿT•HÿRJÿP¥LÿO­NÿN´OÿM¼QÿLÅQÿKÑRÿJâSÿIíSûKóSõL÷SîOøSèPùSáRúTàRúUàRúUàRúUàRúUàRúUàRúUÿX&ÿT0ÿ]1ÿg8ÿm@ÿoIÿnR'ÿj\/ÿef6ÿaq<ÿ]}AÿYˆFÿV’IÿTœLÿR¤NÿP«PÿO³QÿN»RÿMÄSÿMÏTþLàUûLëUøLôUðO÷UéQøUâRøVÛTùWÙTùWÙTùWÙTùWÙTùWÙTùWÙTùWÿY&ÿW.ÿ`/ÿj6 ÿq>ÿsHÿrQ&ÿoZ.ÿjc6ÿen<ÿazBÿ]…GÿZJÿW˜MÿU PÿT¨RþR¯SýQ·UüPÀVúOËVøOÜWõOéWòOóWêRöWáS÷XÚUøYÑVøZÏVøZÏVøZÏVøZÏVøZÏVøZÏVøZÿY&ÿZ,ÿd-ÿn3 ÿu=ÿxFÿwO%ÿtX-ÿp`5ÿjj<ÿfvBÿbGþ^‹Kû[”OùYRøW¤TöV¬VõT´WóS¼XòSÇYðRÕZìRæZéSòYáTõ[×Vö\ÏW÷]ÈYø]ÇYø]ÇYø]ÇYø]ÇYø]ÇYø]ÇYø]ÿZ%ÿ]*ÿg*ÿr2 ÿy;ÿ|Eÿ|M$ÿzU,ÿu^4ÿog<üjrBùf}Höc‡Ló_Pñ]™Sï[¡VíY¨XëX°ZêW¹[èVÃ\æVÑ\ãVä\ßVð]ÕWõ_ÌYö`ÆZö`À[öa¾\öa¾\öa¾\öa¾\öa¾\öa¾\öaÿ[%ÿ`(ÿk(ÿw0 ÿ~:ÿCÿ‚K"ÿS*ÿ{[3ùvd:õpnAñlyHíhƒMêdŒQça•Uå_Xã]¥Zá[­\ÞZ¶^ÜYÀ_ÚYÎ`ÕYâ`ÑYïaÊZôbÂ\ôc¼]ôd·^ód¶_ód¶_ód¶_ód¶_ód¶_ód¶_ódÿ\$ÿc&ÿo&ÿ{/ ÿ‚9ÿ†Aÿ‡I ÿ…Q(ø‚Y0ò}`8íwj@èruGänMáiˆRÝf‘WÙc™ZÕ`¡]Ò_¨`Ï]±bÍ\»cË\ÇdÉ\ÛeÅ]ëe¿]òf¸_ñg³`ñg¯añg®bñg®bñg®bñg®bñg®bñg®bñgÿ]$ÿf$ÿr$ÿ~. ÿ‡7ÿ‹?ÿŒGù‹O%òˆV-ìƒ]6æ~g>àxqFÛs{MÕnƒSÐjŒXÌg”]Éeœ`Æc£cÃa¬eÁ`µg¿_Áh½_Ðiº`æiµaïj¯bïj«cïj§dïi¦eði¦eði¦eði¦eði¦eði¦eðiÿ^#ÿi"ÿv#ÿ‚, ÿ‹6ÿ>ý‘Eô‘L"íŽS*æŠZ2ß…e;×~mEÐxvMËtTÆp‡ZÂl^¿i—b»gŸe¸e§h¶d°j³c»k±cÊl¯cál«dím¦fíl£gíl hîkŸhîkŸhîkŸhîkŸhîkŸhîkŸhîkÿ_#ÿk ÿy"ÿ…+ÿŽ4 ÿ“<ø–Cï–Jç•P&à‘X.׊a:΄jEÈ~sMÂy{U¾uƒ[¹q‹`µn’d²lšg¯j£j¬h¬l©g¶n§gÄo¥gÚo¢hëožiìo›jìn™kím˜kím˜kím˜kím˜kím˜kím˜kímÿ_#ÿnÿ{!ÿˆ*ÿ‘2 ÿ—:ôšAë›Gã›M!Ú–U-Ï^9ȉgDÁƒoM»~wU¶y[±v‡`­se©p–h¦nŸl£l¨n k²pkÀqœkÒršléq—mêp”mëp’nìo’nìn’nìn’nìn’nìn’nìn’nìnÿa!ÿpÿ~ ÿ‹)ÿ•1 û›8 ðž>ç Dß JÓšR+Ê“\8ÂdC»‡mM´‚tT¯~|[ªz„a¦w‹e¢t“ižr›mšp¤p—o¯r•o¼s“oÍs’pæspérŽqêqqëpŒqëpŒqëpŒqëpŒqëpŒqëpŒqëpÿc ÿrÿ€ÿŽ'ÿ—/øž6 í¢;ä¥@Ú¤FΞQ*Å—Z7½‘bBµŒjL¯‡rT©‚y[¤€`Ÿ|ˆe›yj—w˜m“u¡ps¬ss¸t‹sÉuŠtât‰tèsˆuér‡uêq‡uêp‡uêp‡uêp‡uêp‡uêp‡uêpÿeÿtÿƒÿ&ÿš-ô¡4 é¦7 àª=Ô§DÉ¡O)À›X6¸•`B°hK©‹oS£‡vZžƒ~`™€…e”}j{–nŒyŸq‰x©s†wµu„wÅvƒxßuƒxèt‚xés‚xêq‚xêq‚xêq‚xêq‚xêq‚xêq‚xêqÿgÿwÿ…ÿ“$ÿ+ñ¤0æª3Ü®7 ϪCÅ¥N(¼ŸW5³™_A«”fJ¤mSž‹tZ˜ˆ{`“…ƒeŽ‚‹jŠ€“n†~œq‚}§t|³u}|Ãv|}Ûv|}èt}|ès}|ér}|êq}|êq}|êq}|êq}|êq}|êqÿiÿyÿ‡ÿ•#û )î¨,ã¯/ײ4 Ë­AÁ¨L'·£U4¯]@§™dIŸ”kR™rY“y_ŽŠ€d‰‡ˆi„…‘m€ƒšq|‚¤ty±vwÀvvÖvvçtwèsx€érxêqxêqxêqxêqxêqxêqÿkÿ{ÿŠÿ˜!ø£&ê¬'ß´)Òµ2 ǰ@¼¬K&³§S3ª¢[>¢cHš™iQ”•pXŽ’w^ˆ~dƒ†i~ŠŽmz‰˜qv‡¢ss†®uq†½vo‡Òvp‡ètq…èsr„érs„êqs„êqs„êqs„êqs„êqs„êqÿmÿ~ÿÿ›ô§"æ° Úº!͸1 ´>¸°I$®«R1¥¦Z=¢aG•žhOŽ›nWˆ˜u]‚•|c}“„hxŒlt•pp rmŒ¬tjŒ»uiÎuiètk‹ésm‰êqmˆêqmˆêqmˆêqmˆêqmˆêq¤ç¹mˆêqÿpÿÿÿžð«â¶Ó½È»/½¸<³´G#©°P0 «X;˜¨_E¤fN‰¡lU‚žs[}œzaw™fr—Šjn–“nj”žqf”ªsd“¸sc”Ësc”ære’êqgêpgŽêpgŽêpgŽêpgŽêpgŽêpgŽêpÿsÿ…ÿ”ü£ê°Ù¾ ÍÁÂÀ-¸½:®¹F!¤µO-š±V9’®^CŠ«dLƒ¨jS|¥qYv£x_q¡clŸ‡hhž‘kdœn`œ¨p^œ¶q]œÉq]œäp^šëp`–ëoa•ìoa•ìoa•ìoa•ìoa•ìoa•ìoÿwÿ‰ÿ™ó¨×µ ÏÁ ÆÅ¼Ä*²Â8§¿Dž»M+”¸U6‹µ\@„²bI|¯iPv­oVp«v[kª}`f¨†db§g^¦šj[¥¦lX¥µmW¦ÇmW¦âlW¤ílZŸílZžílZžílZžílZžílZžílZžílÿ|ÿŽöž Ø­ ͸ ÇľʵÊ'«È6¡ÅA—ÂK(¿S3…½Z<}ºaEv¸gKp·mQjµtVe´|[`²„_\±ŽbX±™eU°¥fS°³gR±ÆgR±ágQ¯ñhSªðhT©ðhT©ðhT©ðhT©ðhT©ðhT©ðhÿ‚ÿ” Û¥αÅ»½ÇµÐ¬Ð#£Ï3 ™Í?ÊH$†ÈQ.}ÆX8vÄ_?oÂfFiÁlKdÀsP_¿{T[¾„XW½[T½˜]Q¼¤_O¼³`M½Å`M½à_L¼ðaM·õbM¶õbM¶õbM¶õbM¶õbM¶õbM¶õbÿ‰ áœЪŵ»¿²Ë«Ø £Ù šØ/ Ö<‡ÔF~ÒO)vÐV2oÏ^9hÍd?cÌkD^ÌsIZËzLVʃORÊROʘTMÊ¥VKʳWJËÅWIËàVIÉðXGÇúYHÅûZHÅûZHÅûZHÅûZHÅûZHÅûZ÷‘Ô¢ǯº¹°Ä§Ð Ÿá˜á!à0 †à;}ßDuÞM$nÝU+gÜ\2bÛd7]Ûk;YÚr?UÚzCRÚƒENÚHLÚ˜JIÚ¥KHÛ³LGÜÄLFÜÞLFÚíLDØùOCØûOCØûOCØûOCØûOCØûOCØûOۚʩ»³°½¥É›Ö ”èŒé%„è3 {è<sèDkèK"dçR(^çY-Yç`2Uçh5Rço8Oçw;Lç€=Iç‰?Gè”ADèŸBBé¬CAéºD@êÍD@êäD@èõD@çøC@çøC@çøC@çøC@çøC@çøCÍ£½®°¸¤Ä™Ðá ‰ññ(xò2 pò;iòCbòJ\óP#VóW'Ró^+Oóe-Lôl0Iôs2Fô{4Cô„6AõŽ7>õ™9=ö¤:;ö°;:÷¿<9øÏ<8÷è<8÷ì<8÷ì<8÷ì<8÷ì<8÷ì<8÷ì<¿ª±³¤¿˜ÊŒØ„ú|ûtû&lü0 eü8^ý@XþGSþMOÿT KÿZ"Hÿa%Eÿg&Bÿm(@ÿu*=ÿ}+:ÿ†-8ÿ‘.6ÿ›/4ÿ¦03ÿ²12ÿ¾21ÿÐ21ÿÖ21ÿÖ21ÿÖ21ÿÖ21ÿÖ21ÿÖ2²¯¥º˜Æ‹Òßyÿoÿgÿ"`ÿ,Zÿ4 Tÿ<OÿCJÿIGÿOCÿU@ÿ[>ÿa;ÿf9ÿm6ÿt 4ÿ}!1ÿ†#/ÿ‘$-ÿ›%,ÿ¥&+ÿ¯&*ÿ»')ÿ¾')ÿ¾')ÿ¾')ÿ¾')ÿ¾')ÿ¾'¦¶˜Â‹Î~Ûuùkÿbÿ[ÿTÿ&Nÿ.Iÿ5Eÿ< AÿC >ÿH;ÿN8ÿS5ÿX3ÿ^1ÿd.ÿj,ÿr*ÿz'ÿƒ%ÿŽ$ÿ˜#ÿ "ÿª!ÿ­!ÿ­!ÿ­!ÿ­!ÿ­!ÿ­š¾‹Ê~×pãgÿ^ÿ VÿOÿIÿ Cÿ'?ÿ.:ÿ47ÿ:3ÿ?0ÿD.ÿI ,ÿN )ÿS 'ÿX %ÿ^ #ÿd !ÿl ÿt ÿ}ÿ‡ÿÿ™ÿ›ÿ›ÿ›ÿ›ÿ›ÿ›ÿL*ÿH3ÿO4ÿT7ÿZAÿ\JÿZTÿW`$ÿTk*ÿPx/ÿM„3ÿJ6ÿG™9ÿF¡;ÿE©<ÿD°>ÿC·?ÿBÀ?ÿBÉ@ÿAÕAÿAäAÿAîBÿAöBÿAýBÿBÿAùDÿAôFÿBïGÿBïGÿBïGÿBïGÿBïGÿBïGÿBÿM)ÿJ2ÿQ2ÿW6ÿ\?ÿ^Iÿ]SÿZ^$ÿWi*ÿSu/ÿP4ÿM7ÿJ—:ÿHŸ<ÿG§=ÿF®?ÿEµ@ÿD½AÿDÆBÿCÑBÿCâCÿCìCÿCõCÿCüCüDÿCõGÿCïHÿDëIÿDëIÿDëIÿDëIÿDëIÿDëIÿDÿM)ÿL0ÿT1ÿY4ÿ_=ÿaGÿ`Rÿ]\$ÿZg+ÿVs0ÿS4ÿOŠ8ÿM”;ÿK=ÿJ¤?ÿH¬@ÿH³AÿG»BÿFÃCÿFÎDÿEßDÿEêEýEóEûEûE÷FÿDðIÿEêJÿFåKÿGåKÿGåKÿGåKÿGåKÿGåKÿGÿN)ÿO.ÿW.ÿ]2ÿc;ÿeFÿePÿaY$ÿ]d+ÿZp0ÿV|5ÿS‡9ÿP‘<ÿNš?ÿM¢@ÿK©BÿJ°CÿJ·DÿIÀEÿHÊFýHÛFúHçGøHòGõHúFñIÿGêKÿHãLÿIÞMÿJÞMÿJÞMÿJÞMÿJÞMÿJÞMÿJÿO(ÿR,ÿZ,ÿa/ÿg:ÿjDÿjNÿgW$ÿba+ÿ^m1ÿ[x6ÿWƒ:ÿT=ÿR–@ÿPžBþO¥DüN­EûM´GúL¼HùLÇHöKÔIóKåIðKðIíLùHéLÿJáNÿKÚOÿLÓPÿMÓPÿMÓPÿMÓPÿMÓPÿMÓPÿMÿP(ÿU*ÿ])ÿe-ÿl8 ÿoBÿoKÿlU#ÿh^*ÿci1ÿ_t6ý\;ûY‰?ùV’B÷TšDõS¢FôR©HòQ±IñP¹JïOÃKîOÏKëOâKçOîKäOøMßOþNÕQÿOÎRÿPÉSÿPÉSÿPÉSÿPÉSÿPÉSÿPÉSÿPÿQ'ÿX'ÿa'ÿj,ÿq6 ÿt@ÿtIÿrR"ÿn[)ýhd0ùep6öa{;ó^…@ð[ŽCîY–FìWžHêU¦JèT­LçSµMåS¿NãSÌNáSßNÝSíOØR÷QÑSýRÊTþSÄVÿS¿WÿS¿WÿS¿WÿS¿WÿS¿WÿS¿WÿSÿR'ÿ[%ÿe$ÿn*ÿv4 ÿz=ÿzFÿxO ûtX(öoa/ñkl6ígv<éc€@æ`ŠEä]’Há[šJßY¢MÝXªOÚW²PØV¼QÕUÈRÒUÛSÎVëSËVöUÆVýV¿XýVºYýW¶ZýW¶ZýW¶ZýW¶ZýW¶ZýW¶ZýWÿS&ÿ_"ÿi!ÿs(ÿ{2 ÿ;ÿ€Dû~Lô{T%îv]-éqh4ämr;ài|AÜe…FØbŽJÔ_–MÑ]PÎ\¥RÌZ­TÉY¶VÇYÂWÆYÐWÂYæX¿YóY»ZûYµ[ûZ°]ûZ­]ûY­]ûY­]ûY­]ûY­]ûY­]ûYÿV$ÿb ÿm ÿw&ÿ0ÿ„9 ý†Aõ…Iî‚Q"ç}Z*áxd2Üsn:ÔnwAÐj€GÌf‰LÈd‘PÅb˜SÃ` UÀ^¨X¾]±Y»]¼[¹\É\·\à\´]ï\°^ù]«_ù]¨`ù\¥aù\¥aù\¥aù\¥aù\¥aù\¥aù\ÿX"ÿeÿqÿ{$ÿ„.ÿ‰6 ø‹>ï‹FèˆNá„W&Ù~a1Ñxj:ËssBÆo|HÂl„M¾iŒQ»f“U¸d›Xµc£Z³a¬\°`·^®`Ä_¬`Ø_©aë_§a÷_¢c÷_Ÿd÷_dø^dø^dø^dø^dø^dø^ÿ[ ÿhÿtÿ~#ÿˆ+ý4 ó;êCâJÚŠT%Ѓ]0É~g:ÃxoB¾txH¹q€NµnˆR²kV¯i—Z¬gŸ\©e¨_¦d²a¤d¿b¢dÐb dçbžeõbšfõa˜gö`–hö`–hö`–hö`–hö`–hö`–hö`ÿ]ÿjÿwÿ‚!ÿ‹)ù‘1ï•8 æ–?Ý”GÒŽQ$ʈ[/ƒd9¼~lA·ytH²u|N®r„Sªo‹W¦m“[£k›^ j¤`h®c›hºd™hËe—hãd•iód“jôc‘kõbkõakõakõakõakõakõaÿ_ÿmÿzÿ…ÿŽ'õ•.ë™5áœ; Ö˜CÌ“O"ÄX.½‡a8¶‚iA°~qH«zyN§w€S£tˆXŸq[›o˜_˜n¡b•m«d’l·flÆflßfŽmñeŒnód‹nôcŠnôbŠnôbŠnôbŠnôbŠnôbŠnôbÿaÿoÿ|ÿˆÿ‘$ò™+çž1Ý 6 ÑœAÇ—M!¿‘V-·Œ_7±‡g@«‚nH¥~vN {}Sœx…X˜v\”t•_‘ržbŽq¨e‹p´g‰pÃh‡pÛg†qîf†ròe…ród„rôc„rôc„rôc„rôc„rôc„rôcÿcÿqÿÿŠü”!îœ'ã¢,ؤ2ÌŸ@ÚK º•U,³]7¬‹e?¥‡lG ƒsM›€{S–}‚W’zŠ\Žx’`Šv›c‡u¥f„t±g‚tÀh€tÕh€uìgvòfuóeuóduóduóduóduóduódÿeÿtÿÿù—ë #ߦ&Ò§0È£>¿žI¶™S+®”[6§c? ‹jF›‡qM•„xRWŒ‡\ˆ}`„{™c€z£f~y¯h{y½izyÑiyzêhzzòfzyòezyódzyódzyód¤Ã´zyódzyódzyódÿgÿvÿ„ÿõ›ç¤Û«Ϊ/Ħ=º¡H²Q*ª˜Y4¢”a>œhE–ŒoL‰vR‹†}W†„…[‚‚_~€—cz¡fw~¬hu}»is~Îis~èht~ñft}òeu|ódu|ódu|ódu|ódu|ódu|ódÿiÿxÿ‡ÿ“ñžã¨Õ®Ê­-À©;¶¥F­¡P)¥œX3ž˜_<—”fD‘mK‹ŽtQ†Œ{V‰ƒ[|‡‹_x†”bt„Ÿeqƒªgoƒ¸imƒËimƒæhnƒòfo‚òepódpódpódpódpódpódÿkÿ{ÿŠÿ–í¢Þ­бŰ+»­9²©D©¥N' ¡V2™^;’šdC‹—kJ†”rP€’yU{€Zw‰^rŒ’anŠœdk‰¨gi‰¶hg‰Èhg‰ãgh‰òfi‡óej†ódj†ódj†ódj†ódj†ódj†ódÿnÿ~ÿ÷šÛ§ Ó° Ê´À´)¶±7­®C¤ªL%›¦U0“£\9Œ cA†iH€špN{˜wSv–~Xq”†\l’`h‘šce¦ec´faÆfaáfaòecŽóddŒôcdŒôcdŒôcdŒôcdŒôcdŒôcÿqÿ‚ÿ‘ ÞŸ Óª ̳ ĸº¸&±¶5 §³Až¯J#–¬S.Ž©Z7‡¦a?€¤gFz¡nLuŸuQp|Ukœ„ZfšŽ]c™˜`_˜¤b]˜²d[˜Ãd[˜Þc[˜ðc\•õb^“õb^“õb^“õb^“õb^“õb^“õbÿuÿ† ë–գ̭Ŷ½¼´½#«»2 ¡¹?˜¶H ³Q+ˆ°X4€®_b»pC^ºwGZ¹€KV¹‰NS¸”PP¸ RM¸®TL¸¿TK¹ØTK·íTJ¶ùUJ³þVJ³þVJ³þVJ³þVJ³þVJ³þVú‡֘ɥ½¯³¸©Â¡ÍšÐ’Ð(ŠÏ6 ÎAyÌJrËR&lÊZ-fÉa2aÈh7\ÇoqØHj×PdÖX%_Õ_*[Ôg/WÔn3SÓv6PÓ9LÓˆ;JÓ”>GÓ ?EÔ®@DÔ¿ACÕØ@DÓì@BÒöBAÑþDAÑþDAÑþDAÑþDAÑþDAÑþDјåµ®©¸žÃ”ÍŠÙ „ã}ä&uä2nã<gãEaãM\ãU Wã]$Tãd'Pâk*Mâs-Jã|0Hã†2Eã4Cãœ5Aä©6@ä¸7?åË7?åä7?ãó6=âû8=âû8=âû8=âû8=âû8=âû8Æ¡·«ª´ž¾“ɈÔîyíqí'jî2dî; ^îCXîKSîRPïYLï` Iïg#Gïo%Dðw'Að€)?ðŠ*=ñ•,;ñ¡-9ò®.8ò¾/7óÐ/7óç/6ñó/6ñó/6ñó/6ñó/6ñó/6ñó/¹§«°Ÿ»’ƆÐ{Ýt÷m÷fø&_ø/Zù8 Tù@PúGLúNHûUEû[Bûb@üh=üp:ýx8ý‚ 6ý"4þ˜#2þ¤$1ÿ±%0ÿ¿&/ÿÏ&.ÿã&.ÿã&.ÿã&.ÿã&.ÿã&.ÿã&­­Ÿ·’†ÍyÚpòhÿaÿZÿ#Tÿ+Oÿ3Jÿ;FÿB CÿI @ÿO=ÿU:ÿ[8ÿa5ÿh3ÿo0ÿx.ÿ‚,ÿ*ÿ™)ÿ¤(ÿ¯'ÿº&ÿÇ&ÿÇ&ÿÇ&ÿÇ&ÿÇ&ÿÇ¡´“¿†ÊxÖlâcü\ÿUÿOÿIÿ&Dÿ.@ÿ4<ÿ;9ÿA6ÿF3ÿL1ÿQ .ÿW ,ÿ] *ÿd (ÿl %ÿu #ÿ!ÿŠ ÿ•ÿ ÿ¨ÿ±ÿ±ÿ±ÿ±ÿ±ÿ±•¼†ÇyÓkà^íVÿOÿ IÿCÿ>ÿ 9ÿ'5ÿ-2ÿ3.ÿ8+ÿ=(ÿB&ÿG$ÿL"ÿQ ÿWÿ^ÿeÿnÿxÿƒÿ ÿ– ÿž ÿž ÿž ÿž ÿž ÿž ÿB-ÿB2ÿH2ÿL6ÿN<ÿPGÿPRÿN_ÿKkÿHw$ÿEƒ'ÿBŽ*ÿA—,ÿ? .ÿ?§/ÿ>®0ÿ=µ1ÿ=¼2ÿ<Å2ÿ<Î3ÿ;ß3ÿ;ê4ÿ;ó4ÿ;û4ÿ<ÿ3þ<ÿ3ü=ÿ4ö?ÿ5õ?ÿ5õ?ÿ5õ?ÿ5õ?ÿ5õ?ÿ5ÿC,ÿD0ÿJ0ÿN4ÿQ:ÿSFÿRQÿQ]ÿNi ÿKt$ÿH€(ÿE‹+ÿC•-ÿB/ÿA¥0ÿ@¬1ÿ?³2ÿ?º3ÿ>Â4ÿ>Ì4ÿ>Ü5ÿ=è5ÿ=ñ5ÿ>ú5ý>ÿ5û?ÿ4ø?ÿ6òAÿ7ðAÿ7ðAÿ7ðAÿ7ðAÿ7ðAÿ7ÿD,ÿG.ÿM.ÿQ2ÿT9ÿWDÿVOÿTZÿQf ÿNr%ÿK})ÿHˆ,ÿF’.ÿE›0ÿD¢2ÿC©3ÿB°4ÿB·5ÿA¿6ÿAÉ6ÿ@×7ÿ@å7ý@ð7ú@ø7÷Aÿ6öAÿ7òAÿ8ìCÿ9êDÿ9êDÿ9êDÿ9êDÿ9êDÿ9ÿE+ÿI,ÿP,ÿU/ÿY7ÿ\Bÿ[MÿXWÿVc ÿRo%ÿOz*ÿL…-ÿJ0ÿH˜2ÿGŸ4ÿF¦5ÿE­6ÿE´7ÿD¼8þDÆ8üDÒ9ùCâ9öDî9óD÷9ñDÿ9ïDÿ:ëEÿ;äFÿ<ãFÿ<ãFÿ<ãFÿ<ãFÿ<ãFÿ<ÿF+ÿM)ÿT)ÿY,ÿ^5ÿa@ ÿaJÿ^TÿZ_ ÿWk&ÿTv*ÿQ.ÿN‹1þL”4üKœ5ûJ£7úIª8øH±9÷H¹:öGÂ;õGÍ;òGß;îGì;ëHö;éGÿ=çGÿ>áHÿ?ÚJÿ@ØJÿ@ØJÿ@ØJÿ@ØJÿ@ØJÿ@ÿG*ÿP'ÿX&ÿ^*ÿc3ÿf= ÿfGÿdQÿ`[ ÿ\g&ýYr+úV}/øS‡3öQ5ôP˜7òNŸ9ñM¦;ïL­<îLµ=ìK¾=ëKÊ>éKÜ>åLê=âKõ?ßKþAÜJÿBÔLÿCÍMÿCËNÿCËNÿCËNÿCËNÿCËNÿCÿJ(ÿT$ÿ\#ÿc(ÿh0ÿl; ÿlDÿjNþfXùab%õ^m+ò[x0ïX‚4ìV‹7êT”9èS›;æQ£=åQª>ãP²?áO»@àOÇ@ÞOØAÙOèAÔOôCÐNþEÎNÿFÈPÿFÂQÿGÀQÿGÀQÿGÀQÿGÀQÿGÀQÿGÿM%ÿW!ÿ` ÿh&ÿn.ÿr8 ÿrAýpK÷mTòh^$ídi*éat0å^~4â[‡8àY;ÝW—>ÛUŸ@ØT¦BÕS®CÒR·DÐRÂEÎRÐFËRåFÈRòHÅRýIÂRÿJ¼TÿJ·UÿJ¶UÿJ¶UÿJ¶UÿJ¶UÿJ¶UÿJÿP#ÿ[ÿdÿm$ÿs+ÿw5þx>öwGðtPêoZ"äke)àgo/Ûcy5Ö`‚:Ò]Š>Ï[’AÌYšCÊX¡EÈW©GÆV²IÄV¼JÂUÉK¿UßK¼VîL¹VúM·VÿM²XÿM®YÿM¬YÿM¬YÿM¬YÿM¬YÿM¬YÿMÿS ÿ^ÿhÿq"ÿx(ÿ|1ø~: ð}CézLâvWÜra(Ômk/Ïit6Ëe};Çb…@Ä`CÁ^•F¿]œH¼[¤KºZ­L¸Y·N¶YÃO´YÕO±ZêP®Z÷P¬ZÿP¨[ÿP¤\ÿP¤]ÿO¤]ÿO¤]ÿO¤]ÿO¤]ÿOÿVÿaÿlÿu ÿ|%ý.ó„7 ê„?âHÛ}SÑw]'Ërg0Ænp7Âjx<¾g€AºeˆE·cH´a˜K²_ŸM¯^¨O­]²Q«]¾R©]ÎS¦]åS¤^ôS¢^ÿSŸ_ÿRœ`ÿR›`ÿR›`ÿR›`ÿR›`ÿR›`ÿRÿXÿdÿpÿyÿ€#ø†*í‰2äŠ; ܈EÑ‚PÊ}Z&Äxc/¾sl7¹ot=µl|B²j„F®gŒJ«e“M¨d›O¥b¤R£a®T¡a¹UŸaÈVaáV›bñU™býU—cÿT•dÿT”dÿS”dÿS”dÿS”dÿS”dÿSÿZÿgÿsÿ}ÿ„ óŠ&èŽ.ß6ÔŒAˇMÄ‚W&½}`/·xi6²tq=®qxBªn€G¦lˆJ£jN h˜Qg SšfªU˜eµW•eÄX”eÛX’fïW‘füWgþVŽgþUhþUhþUhþUhþUhþUÿ\ÿiÿvÿ€ýˆïŽ"ä“)Ú”1Î?Æ‹K¾†U%·^.±}f6¬yn<§vuB£s}GŸp„KœnŒN˜l”R•kT’j§Wi²YiÀZŒiÕZŠjìYŠjúX‰kýW‡kýVÐ]ŇkþV‡kþV‡kþV‡kþV‡kþVÿ^ÿlÿxÿƒù‹ë’à˜#Ó˜/Ê”=ÁI¹ŠS$²†[-¬d5¦~k<¡zrBwzG™uK•s‰O‘q‘RŽošU‹n¤Xˆm¯Z†m½[„mÐ[ƒnéZƒnøY‚oüX‚oýW‚oýW‚oýW‚oýW‚oýW‚oýWÿ`ÿnÿ{ÿ†öç–ۜϛ-Å—; ¼“G´ŽQ#­ŠY,§†a4¡‚i;œpA—|wF“y~Kw†O‹uŽRˆs—U„r¡X‚q¬Zqº\~qÌ\}rç[}röZ|rüY|rüW|rýW|rýW|rýW|rýW|rýWÿbÿqÿ}ÿˆò’ãšÕŸÊž+Á›9 ¸—E°’O"©ŽX+¢Š_3œ†g:—ƒn@’€uE~|J‰|„N…zŒR‚x•V~wŸX{vª[yu¸\wuÊ\wvå\wwõZwvûYwvüXwvüWwvüWwvüWwvüWwvüWÿdÿsÿ€ÿ‹ï•ßž ТÆ¡)½ž7 ´šC¬–M ¤’V*Ž^2—‹e9’ˆl@…sEˆƒzJ„€N€ŠR|}“Ux|Xu{¨[sz¶\qzÇ\qzâ\q{óZq{ûYrzüXrzüXrzüXrzüXrzüXrzüXÿgÿuÿƒôŽ Û™ Ô¡ ̤¤'¸¢6 °žB§šL —T)™“\1“c8j?ˆŠqDƒˆxI~†Mz„ˆQv‚‘Us›Xo€¦Zm´\kÅ\k€ß\k€òZk€ûYl~üXm~üXm~üXm~üXm~üXm~üXÿiÿxÿ… â’Õ› Σ Ǩ½¨%´¦4 «¢@£ŸJ››R'”˜Z0Ž•a7ˆ’h=‚oC~ŽvHyŒ}LuŠ…PqˆŽTm‡™Wj†¤Yg…±[e…Â[e…Ü[e…ðZf…ûYgƒüXgƒüWgƒüWgƒüWgƒüWgƒüWÿlÿ{ ò‰ Ù•ÏžɦÁ«¸«"¯ª2¦§>ž¤H–¡Q%žX.ˆ›_5‚™f<}–mAx”tFs’{KoƒOkŒRgŽ–Ud¢XaŒ¯Y_ŒÀZ_ŒÙY_ŒîY_ŒûXaŠýWa‰ýWa‰ýWa‰ýWa‰ýWa‰ýWÿo ÿ ßҘʢ©º¯²° ©®/¡¬<˜©F‘§O#‰¤V,ƒ¢]3}Ÿd9wk?r›qDnšyHi˜Le—ŠPa•”S^• U[”­WZ”½XY”ÔWY”ìWY“ùV[‘þU[þU[þU[þU[þU[þUÿs õ„̜ؑå»­³³ «µ£´,›²9’°DŠ­M ƒ«T)}©\0w§b6q¥i|½Hu¼P!oºX'j¹_-e¸e2`·l6\¶t:Xµ|>U´…AQ´DN³œFL³©HJ³¹HI´ÎHI³éHH±öIH°ÿJH°ÿJH°ÿJH°ÿJH°ÿJH°ÿJâ†Î”¡¶©«±¡º˜ÃÉŠÉ ƒÉ/{È; tÇEnÆNhÅV!cÄ]'^Ãd+ZÂk/VÁr3SÁ{6OÀ„9LÀGÀ¨?FÀ¸@EÀÍ@EÀè?D¾öAC½ÿBC¼ÿCC¼ÿCC¼ÿCC¼ÿCC¼ÿCÖÆ›¸¥­®¢¶˜¿ÈƒÑ ÒyÒ*rÒ7lÑBfÑKaÐS\Ï[XÏb#TÎi'QÎq*MÎz-J΃0HÎŽ2EΚ4CΨ5Bθ6AÏÍ5AÎè5@Íõ7?Ëþ9>Ëÿ9>Ëÿ9>Ëÿ9>Ëÿ9>Ëÿ9Ê–¼¢¯ª£³˜¼Æ‚ÏxÙ sÞnÞ&hÞ3bÞ> ]ÞHYÞPUÞXQÞ`NÞgKÝo HÞx#FÞ%CÞŒ'AÞ˜)?Þ¦*>ßµ*=àÈ*=ßã*<Ýñ+;Üû-:Üý.:Üý.:Üý.:Üý.:Üý.ÀŸ±§¤°˜ºÃÍv×nèiècè'^é2Xé;TéD OêLLêSIê[FêbDëjAër?ë{<ë†:ì‘ 8ìž!7í¬"6í»#5îÏ#4îæ#4ëõ#4ëø#4ëø#4ëø#4ëø#4ëø#³¥¦­™·Á€ËuÕiádó^óYô&Tô0Oõ8Kõ@GöG DöN A÷U?÷\<÷c:øj7øs5ø}3ùˆ1ù”/ú¡.ú¯-û¾,ûÏ+ûç+ûë+ûë+ûë+ûë+ûë¨ªš´¿€ÉtÓgÞ^òYþSÿNÿ#Iÿ+Eÿ3Aÿ:>ÿA;ÿG8ÿN5ÿT 3ÿZ 1ÿa /ÿi ,ÿr *ÿ} (ÿˆ&ÿ•%ÿ¡$ÿ®#ÿº"ÿÊ"ÿÐ"ÿÐ"ÿÐ"ÿÐ"ÿМ²Ž¼ÇsÑgÝYãSýMÿHÿCÿ?ÿ&:ÿ-7ÿ33ÿ90ÿ?.ÿD+ÿJ)ÿP'ÿV$ÿ]"ÿe ÿnÿyÿ…ÿ’ ÿž ÿ¨ ÿ³ ÿ· ÿ· ÿ· ÿ· ÿ· º‚ÅtÐgÜXãMðGÿBÿ <ÿ8ÿ4ÿ0ÿ%,ÿ+)ÿ0%ÿ5#ÿ: ÿ?ÿDÿIÿOÿVÿ^ÿhÿrÿ~ÿŠÿ” ÿž ÿ¢ ÿ¢ ÿ¢ ÿ¢ ÿ¢ÿ9/ÿ<0ÿA1ÿD4ÿD:ÿDEÿEQ ÿC]ÿAiÿ>vÿ<ÿ:Œÿ9– ÿ8ž!ÿ7¥#ÿ7«#ÿ6²$ÿ6¹%ÿ6À%ÿ5Ê&ÿ5×&ÿ5å&ÿ5ï&ÿ5ø&ÿ6ÿ&þ6ÿ&ü6ÿ&ü6ÿ'ú6ÿ(ú6ÿ(ú6ÿ(ú6ÿ(ú6ÿ(ÿ9/ÿ>/ÿD/ÿF2ÿH8ÿHCÿHO ÿG[ÿDgÿBsÿ?ÿ=Šÿ<“!ÿ;›#ÿ:¢$ÿ9©%ÿ9°&ÿ8¶&ÿ8¾'ÿ8Ç'ÿ8Ó(ÿ8ã(ÿ8í(þ8÷(û8þ'ù9ÿ'ø8ÿ)ø8ÿ*ö8ÿ*ö8ÿ*ö8ÿ*ö8ÿ*ö8ÿ*ÿ:/ÿA,ÿF,ÿJ/ÿL7ÿMAÿLL ÿKXÿHdÿFpÿC|ÿA‡ ÿ?#ÿ>˜$ÿ= %ÿ=¦&ÿ<­'ÿ<´(ÿ;»)ÿ;Ä)ÿ;Ï)þ;à*û;ë*ø;õ)ö<þ)ô<ÿ*ó;ÿ+ò;ÿ,ï;ÿ-ï;ÿ-ï;ÿ-ï;ÿ-ï;ÿ-ÿ<-ÿD)ÿJ)ÿN,ÿQ4ÿR>ÿRJ ÿPUÿMaÿJmÿHxÿEƒ"ÿC$ÿB•&ÿA'ÿ@£(ÿ@ª)þ?±*ý?¸+ü?Á+ú?Ë+÷?Ü,õ?é,ñ?ô+ï?ý,í?ÿ-ì>ÿ/ë>ÿ0ç?ÿ0ç?ÿ0ç?ÿ0ç?ÿ0ç?ÿ0ÿ@*ÿH&ÿN&ÿR)ÿV2ÿW<ÿWG ÿUQÿR]ÿPiÿMt ÿJ#ýH‰&ûG‘(úF™)øE *÷D§+õD­,ôCµ-óC½-òCÈ.ðC×.ìCç.éDó-æCü0äBÿ1ãBÿ2áBÿ3ÜCÿ4ÜCÿ4ÜCÿ4ÜCÿ4ÜCÿ4ÿC'ÿK#ÿR"ÿX'ÿ\/ÿ]9ÿ^C ÿ[NÿXXþUdúRo ÷Pz$ôM„'òL)ðJ•+ïIœ-íI£.ìHª/êG±/éGº0çGÅ0æGÒ0âHå0ßGò2ÛGû4ØFÿ5ÕFÿ6ÒFÿ7ÍHÿ7ÍHÿ7ÍHÿ7ÍHÿ7ÍHÿ7ÿF$ÿO ÿVÿ]$ÿa,ÿc5ÿd@ ÿbJú^Tõ[_ñXk îUu%ëS(èQˆ+æO‘-äN˜/âM 0áL§1ßL®2ÝK·3ÛKÂ4ÙJÏ5ÕKä5ÐKð6ÍJû8ÊJÿ:ÈJÿ:ÆKÿ;ÁLÿ;ÁLÿ;ÁLÿ;ÁLÿ;ÁLÿ;ÿJ!ÿSÿ[ÿb"ÿg)ÿi2ÿj< ùhFòePía[è^f ä[q%áX{)ÞV„,ÛTŒ/ØR”2ÔQ›4ÒP£5ÐOª7ÎN²8ÌN¼9ÊNÉ:ÈNÝ:ÄOí;ÁNù=¾Nÿ=¼Nÿ>ºOÿ>¶Pÿ>¶Pÿ>¶Pÿ>¶Pÿ>¶Pÿ>ÿMÿVÿ_ÿg ÿl&ÿo.ùp8òoB ëlKåiWßebÚal%Ô]v*Ð[~/ÍY‡2ÊW5ÈV–7ÆT9ÄS¥;ÁS­<¿R·>½RÃ?¼RÓ?¹Rè?µRöA³RÿA±SÿA¯SÿA¬TÿA¬TÿA¬TÿA¬TÿA¬TÿAÿPÿZÿdÿlÿq#ýu*óv3ëv= ãsGÜoSÔk^Îfg&Êcq+Æ`y0Â^4¿\‰7½Z‘:ºY˜<¸X >¶W¨@´V²B²V½C°UÌC­VãD«VóD¨WþD§WÿD¥XÿD¢XÿD¢XÿD¢XÿD¢XÿD¢XÿDÿSÿ]ÿhÿpÿv ÷z&í|.ä|8ÜzD ÒuOËpZÆlc&Áhl,½fu1¹c}5¶a„9³_Œ<°]”?®\›A«[¤C©Z­E§Z¸F¥YÇG£ZÞG¡ZïGŸ[üGIt´[ÿG›\ÿFš\ÿFš\ÿFš\ÿFš\ÿFš\ÿFÿUÿ`ÿkÿtÿzò"ç)Þ‚3Ó@ ËzLÄvV¾q`%¹nh,´kq2±hy6­f€:ªdˆ=§b@¥`—C¢_ EŸ^©G^´I›]ÂJ™]ÖJ—^ìJ–_úI•_ÿI“`ÿH’`ÿG’`ÿG’`ÿG’`ÿG’`ÿGÿXÿcÿnÿwû~íƒâ‡#Ö‡.̃= ÅI½{S·v]%²se,­om2©mu7¦j|;¢h„>ŸfŒAœe”D™cœG—b¦I”b°K’a¾LaÐLbèLŽcøKcÿJŒdÿI‹dÿI‹dÿI‹dÿI‹dÿI‹dÿIÿZÿfÿqÿz÷‚è‡Ý‹Ћ,Lj; ¿„G¸Q±{Z$¬wb+§tj1£qr6Ÿoy;›m€?˜kˆB•iE’h™Hf¢JŒf­LŠeºMˆeÌN‡fæN†göL†gÿK…hÿK„hÿJ„hÿJ„hÿJ„hÿJ„hÿJÿ\ÿhÿtÿ}ó…ä‹ÖËŽ*ÂŒ8 ºˆD³„O¬X#§|`+¡xh1uo6™sv;•q}?’o…BŽmE‹l–Hˆk K…jªMƒi·NiÈO€jãO€kôNkÿLkÿKkÿKkÿKkÿKkÿKkÿKÿ^ÿkÿvû€ êˆ Û Ð’Ç’'¾6¶ŒB®ˆM¨„V"¢€^*œ}e0—zl5“ws:u{>Œs‚Bˆr‹F…p“I‚oLn¨N}nµO{mÆPznàPyoòNyoþMyoÿLyoÿKyoÿKyoÿKyoÿKyoÿKÿ`ÿm ÿy îƒ Û‹ Ô‘ Ì••%¹“4±AªŒK£ˆT!„\)—c/’~j5Ž|q9Šzx=†x€BƒvˆEu‘I|s›Lyr¦Nvr³PurÃPsrÝPtsðOtsýMtsÿLtsÿLtsÿLtsÿLtsÿLtsÿLÿbÿo ü{ Þ†ÕŽÏ” ǘ¾˜#µ–2­“?¦IŸŒR ˜‰Z(“†a.Žƒh4‰o9…v=}~A}{†EzyIvx™Lsw¤Nqw±PovÁPnwÙPnwïOnwüNnwÿMowÿLowÿLowÿLowÿLowÿLÿd ÿr ð~ÚˆÐÊ—›¹›!±š0©—=¡”Gš‘P”X'Ž‹_-‰ˆf3„†m8€„t={‚{Ax€„EtHq}—Km|¢Nk|¯Oi{¾Ph|ÕPh|íOi|ûNi|ÿMj{ÿLj{ÿLj{ÿLj{ÿLj{ÿLÿf ÿuáԋ˓Ě½žµŸ¬ž.¤›; ˜E–•N“V%‰],„Žd2‹k7zŠrmBi‹ˆFeŠ’Ib‰žK_ˆªM^ˆºN\ˆÎN]ˆéM]‡øL]‡ÿK^†ÿK^†ÿK^†ÿK^†ÿK^†ÿKÿmê|ՈʒÁš¹ ±¦ ©§¢§)š¥6 ’£A‹¡J„ŸR!~Z(y›`.t™g3o—n8k–uQ£˜@O£¥BM£´CL£ÈCL£äCK¡ôCK ÿDK ÿDK ÿDK ÿDK ÿDK ÿDã}ϋ–·Ÿ­¦£­™µ¹‹º„º-}¹9 w¸Cq¶LkµSf´Z"b³a&^²h+Z±o.V°w2S°5O¯‹8L¯—:J®¤E«ÿ?E«ÿ?E«ÿ?E«ÿ?E«ÿ?ڃǑ»œ¯¤¥«š²º†Á Â{Â(uÂ5oÁ@ iÀId¿Q_¾X[¾_ W½f$T¼n'Q¼v*M»-J»Š0H»–2E»£4C»²4B»Å5C»â4B¹ó5A¸ý7@·ÿ7@·ÿ7@·ÿ7@·ÿ7@·ÿ7΋¿˜²¡§©œ°‘¸†À{ÈtËpÌ"kË0fË<aËE \ÊNXÊVTÊ]QÉdNÉlKÉt"HÈ~$EȈ'CÈ•(AÈ¢*?ȱ+>ÉÄ+>Éá*>Çò+=Æü-<Åÿ.<Åÿ.<Åÿ.<Åÿ.<Åÿ.Ä“¶Ÿ©¦®’·†¿{ÇpÏgÖ d×`Ø*\Ø6XØATØJ PØR MØZJ×bG×iE×rB×|@؇=Ø“<Ø¡:Ù° 9Ùà 9Ùß 9×ï 8Õù"7Ôÿ#7Ôÿ#7Ôÿ#7Ôÿ#7Ôÿ#¹œ«¤Ÿ¬“µ‡¾{ÆpÎeÖ]ãZãVã'Rä2Nä<JäDGåMEåU Bå\ @åd>æl;æv9æ€7çŒ5ç™4ç¨2è¸2èÌ1èå1æô1åü1åü1åü1åü1åü®¢¡ª”³ˆ½{ÆoÎcÖXÞTîQïMï&Ið/Eð8Añ?>ñG<òN:òU7ò\5ód 3óm 1ôw /ô‚ -ô+õ*ö«)ö¼(öÎ'÷æ'õñ'õñ'õñ'õñ'õñ£¨–²ˆ»{ÅoÎb×VÞNðJúFûBû"?ü*;ý28ý95þ?2þF0ÿL.ÿS+ÿZ)ÿb'ÿk$ÿv#ÿ‚!ÿ ÿ ÿ« ÿº ÿÉ ÿÝ ÿÝ ÿÝ ÿÝ ÿÝ ˜°Šº|ÄoÍbØUÞIäDû?ÿ;ÿ8ÿ4ÿ$1ÿ+-ÿ1*ÿ6'ÿ<%ÿB#ÿH ÿNÿUÿ]ÿgÿrÿÿŒÿšÿ¦ÿ²ÿ¼ÿ¼ÿ¼ÿ¼ÿ¼Œ¸}ÂoÌbØTßGå>ñ9ÿ4ÿ 0ÿ,ÿ)ÿ&ÿ""ÿ'ÿ,ÿ1ÿ6ÿ<ÿAÿHÿOÿW ÿa ÿl ÿy ÿ†ÿ’ÿÿ¥ÿ¥ÿ¥ÿ¥ÿ¥ÿ11ÿ6.ÿ:/ÿ;2ÿ;9ÿ;Cÿ9Oÿ8\ ÿ6h ÿ4tÿ2€ÿ1‹ÿ0”ÿ0›ÿ/¢ÿ/¨ÿ.¯ÿ.µÿ.¼ÿ.Åÿ.Ïÿ.àÿ.ëÿ.ôÿ.üü/ÿû/ÿú.ÿú.ÿú.ÿú.ÿú.ÿú.ÿÿ3/ÿ9,ÿ=-ÿ>0ÿ?6ÿ?Aÿ=Mÿ€ÿ<Šÿ<’ÿ;šý: ü:§û9­ú9´ù9¼ø9Æö9Óò9äï9ðì:úê9ÿ!é9ÿ#è9ÿ$ç9ÿ$ç9ÿ%ç9ÿ%ç9ÿ%ç9ÿ%ÿ<'ÿC#ÿH"ÿL&ÿO/ÿP9ÿNCÿLO ÿJ[ÿHfÿEqüC|úB†øAŽö@–õ?ó?£ ò>ª ñ>±!ð>¹!î>Ã!í>Ï!ê>â!æ?ï!ã>ù#á=ÿ%ß=ÿ'Þ=ÿ(Ü=ÿ(Ü=ÿ(Ü=ÿ(Ü=ÿ(Ü=ÿ(ÿ?#ÿG ÿLÿQ$ÿU,ÿV5ÿU?ÿSJ þPVúNböKmóIwðGîFŠìE’ ëD™!éC "èC§#æC®#åB¶$äBÀ$âCÌ$ßCà$ÛCí%ÖBø(ÓBÿ*ÑBÿ+ÏAÿ+ÎAÿ,ÎAÿ,ÎAÿ,ÎAÿ,ÎAÿ,ÿC ÿJÿPÿW!ÿ[(ÿ\2ÿ[;üYF öVQñT]íQhéOræM|äK… âJŽ!àI•#ÞHœ$ÜG£&ÚG«'ØF³(ÕF¼(ÓFÈ)ÑFÜ*ÍGì*ÉF÷,ÇFÿ.ÄFÿ/ÃFÿ/ÂFÿ/ÁFÿ/ÁFÿ/ÁFÿ/ÁFÿ/ÿFÿNÿVÿ\ÿ`%ÿb-üb7ô`Aî]L èZXãXcßUnÛRwØP€"ÔO‰$ÑM'ÏL—(ÍLž*ËK¦+ÉJ­,ÇJ·-ÆJÂ.ÄJÑ/ÁKç/wÉ;’½Jô1»Jÿ2¸Jÿ2·Kÿ3¶Kÿ3¶Kÿ3¶Kÿ3¶Kÿ3¶Kÿ3ÿJÿRÿZÿaÿf!þh)ôh2ìg<ådH ßaTÙ^^Ò[iÎXr ËV{$ÈTƒ'ÅR‹*ÃQ’,ÁP™.¿O¡/½O¨1»N±2¹N¼3·NÊ4µNá4²Nñ5¯Oý6­Oÿ6¬Oÿ6«Oÿ6«Oÿ6«Oÿ6«Oÿ6«Oÿ6ÿMÿUÿ_ÿfÿkøm$ín,åm6ÝkCÔgOÍdZÈ`dÄ]m"Á[v&½Y~)»W…,¸V/¶U”1´Tœ3²S¤4°R­6­R·7¬RÅ8ªRÚ8§Rí9¥Sú9£Sÿ9¢Sÿ9¡Tÿ8¡Tÿ8¡Tÿ8¡Tÿ8¡Tÿ8ÿOÿYÿcÿjÿoòræt&Ýt1Óq?ËmKÅiVÀf`»ci"·`q'´^y+±\€.®[ˆ1¬Y3ªX—5§WŸ7¥W¨9£V³:¡VÀ;ŸVÒ–ZÌ?”Zå?’[õ>‘[ÿ>\ÿ=\ÿ<\ÿ<\ÿ<\ÿ<\ÿ<ÿUÿ_ ÿiÿqõwæ{Ù}Î}*Å{9¾wE·tP±pY­mb"¨ji'¥hq,¡fx/žd€3›b‡6˜a8–`˜;“_¡=‘^«?^¸@^ÈA‹^áAŠ_ó@‰_ÿ?‰`ÿ>ˆ`ÿ>ˆ`ÿ=ˆ`ÿ=ˆ`ÿ=ˆ`ÿ=ÿWÿb ÿl øt éz Þ~ ÒÈ'À6¸|B ²xM¬uV§r_"¢of'žln,›ju0—h|3”g„6‘eŒ9Žd•<Œcž>‰b¨@‡bµB…bÅB„bÞCƒcñB‚cýA‚dÿ@‚dÿ?‚dÿ?‚dÿ?‚dÿ?‚dÿ?ÿYÿd ÿn êwÛ}Ô‚ ̄Å$»ƒ4³€@ ­|K¦yT¡v\!œsd&˜qk+”or/‘my3Žk6‹j‰9ˆh’<…g›?‚f¦A€f²C~fÁD}fÙD|gïC|güA|hÿ@|hÿ@|hÿ?|hÿ?|hÿ?|hÿ?ÿ[ ÿg ÷qÞzԀ΅ LJ¾ˆ"¶‡1¯„> ¨I¢}RœzZ —wa&“uh+so/‹qw3ˆo~6…n†:‚m=k™?|k£Byj°Cxj¿DvjÔEvkíCvkûBvkÿAvlÿ@vlÿ@vlÿ@vlÿ@vlÿ@ÿ] ÿiìtÚ|ЃɈʺ‹ ²Š/«ˆ< ¤…GP˜~X“|_%Žyf*Šwm.†ut2‚t|6r„9|q=yp–@vo¡Btn®Drn½EpnÑEpoëDpoúCqoÿAqoÿ@qpÿ@qpÿ@qpÿ@qpÿ@ÿ_ÿkávԈŋ¾ µ®Ž-¦Œ: Ÿ‰E™†N“ƒVŽ€]$‰~d)…|k-zr2}xy5zw‚9wv‹f~›Ac~¨Ca}¶D`}ÉD_}åC`}öB`}ÿAa}ÿ@a}ÿ@a}ÿ@a}ÿ@a}ÿ@ÿgãtÒLj¾¶•®˜¦šŸš&˜™3‘—? ‹•H…“P‘X z_%ve*r‹l.nŠs2jˆ{6f‡„9c†Ž<`…™?]„¦A[„´BZ„ÇCZ„ãBZƒôA[ƒÿ@[ƒÿ@[ƒÿ?[ƒÿ?[ƒÿ?[ƒÿ?ÿjÞx̓Œ¹“°˜§ Ÿ™Ÿ#“ž1Œ< …›F™Nz—Vu–]#p”c(l’j,h‘q0ey4aŽ‚7^Œ:ZŒ—=XŒ¤?V‹²@T‹Å@T‹á@TŠó?UŠþ?U‰ÿ>U‰ÿ>U‰ÿ>U‰ÿ>U‰ÿ>ïoÖ|ȇ½‘´˜ªœ ¢™¤“¥ Œ¤.…£9 ¢Cy LtŸSoZ jœa%fšh)c™o-_˜w0[—€4X–Š7U••9R•¢;P”°=O”Ã=O”ß³ú,=²ÿ-=±ÿ-=±ÿ-=±ÿ-=±ÿ-lj¹•¬¡¤–«Š²¸s¿jÄ gÅcÅ(_Å5[Å?WÅH TÄP PÄXMÄ_JÃfHÃnEÃxBÂ@ÃŽ>Ü<ë ;ü!:ÃÕ!;Âî!9Àù"8¿ÿ$8¿ÿ$8¿ÿ$8¿ÿ$8¿ÿ$½‘°›¤¢˜ªŒ±€¹u¿jÆ^ÌYÏWÐ!UÐ.QÐ9NÐCKÐLIÐSFÐ[ CÐc AÐk>Ðu<Ñ€:ÑŒ8Ñš6Ñ©5Ñ»4ÒÒ5Ðì4Ï÷3Îÿ3Îÿ3Îÿ3Îÿ3Îÿ³™¦¡š©Ž±¹uÀjÇ^ÍTÔLÝ JÝHÞ&FÞ2Dß<BßE?ßM=àU;à]9àf7ào 5áz 3ᆠ1á” 0â£.â³.ãÇ-ãã-àò,ßû,ßý,ßý,ßý,ßý¨ œ§°ƒ¸vÁjÉ^ÏSÕIÜEéBé@ê$=ê.:ë68ì>6ìF3íM1íU/î]-îe+îp)ï{(ï‰&ð—%ð§$ñ¸#ñÌ"òå"ðó"ïõ"ïõ"ïõ"ïõž¦‘¯„¸wÁjÉ]ÐQ×FÝ?ê<ö9ö6÷ 3÷(1ø0.ù6+ù=)úD'úJ%ûR#ûZ ücüný{þ‰þ˜ÿ¨ÿ·ÿÈÿàÿäÿäÿäÿä“®…·xÀjÉ]ÒPÙDß:ä5÷2ÿ .ÿ+ÿ(ÿ!&ÿ'#ÿ- ÿ3ÿ9ÿ?ÿEÿMÿUÿ_ÿjÿxÿ‡ÿ– ÿ¤ ÿ° ÿ¾ ÿ ÿ ÿ ÿ‡¶y¿kÉ^ÓPÛCà8å/ð+ÿ'ÿ$ÿ!ÿÿÿÿ#ÿ(ÿ-ÿ2ÿ8ÿ? ÿF ÿOÿYÿeÿrÿÿÿ›ÿ§ÿ©ÿ©ÿ©ÿ©ÿ,/ÿ0,ÿ2,ÿ30ÿ16ÿ0Aÿ/Mÿ-Zÿ+fÿ)sÿ(~ ÿ'ˆ ÿ'‘ ÿ'™ ÿ&Ÿ ÿ&¥ÿ&«ÿ&±ÿ&¸ÿ&Àÿ&Éÿ&×ÿ&æÿ&ðþ&ùû'ÿù'ÿù&ÿø&ÿø&ÿø&ÿø&ÿø&ÿÿ.,ÿ3)ÿ5*ÿ6-ÿ64ÿ5?ÿ3Kÿ2Wÿ0dÿ.p ÿ,{ ÿ,… ÿ+Ž ÿ+–ÿ*ÿ*£ÿ*©ÿ*¯ÿ)¶ÿ)½ÿ)Çÿ)Óþ)ãû*ïø*øö+ÿô*ÿô*ÿó*ÿó)ÿó)ÿó)ÿó)ÿÿ1)ÿ6&ÿ9&ÿ:)ÿ;2ÿ;=ÿ9Hÿ7Tÿ5`ÿ3l ÿ2w ÿ0‚ ÿ0‹ÿ/“ÿ/šÿ. ÿ.¦ÿ.¬ÿ.³þ.ºý.Äû.Ïø.áõ.íñ/÷ï/ÿî.ÿí.ÿì.ÿì.ÿì.ÿì.ÿì.ÿÿ4&ÿ9#ÿ=#ÿ>&ÿA/ÿA9ÿ?Eÿ=Pÿ;\ÿ9h ÿ7s ÿ6~ÿ5‡ý4ü4–ú3ù3£ø3©÷3°ö3·ô3Àó3Ìð3Þí3ëé4öç3ÿæ3ÿä2ÿä3ÿã2ÿã2ÿã2ÿã2ÿÿ8#ÿ= ÿAÿE#ÿG,ÿG6ÿF@ÿDLÿAXÿ?d û>où–å>œã=£â=ªà=²ß=»Ý=ÆÛ=ØÖ=éÒ=õÎ=þÌ<ÿ Ë<ÿ!É<ÿ!É<ÿ!É<ÿ!É<ÿ!É<ÿ!ÿ?ÿEÿKÿPÿS$ÿT-ÿS7÷QBñNMìLZ èJeåHoâGyßE‚ÝDŠÚC‘ØB™ÕBŸÓA¦ÑA®ÏA·ÎAÁÌAÐÉBåÅBó!ÂAþ#ÀAÿ$¾Aÿ$½Aÿ%½Aÿ%½Aÿ%½Aÿ%½Aÿ%ÿBÿIÿPÿVÿY ÿZ(÷Z2ïX=èUIãSU ÞQ`ÙNjÔLtÐK|ÎI„ÌHŒÊG“ÈGšÆF¡!ÄF©"ÂE±#ÁE¼#¿EÉ$½Fß%¹Fï&¶Fû'´Fÿ(³Fÿ(²Fÿ(±Fÿ(±Fÿ(±Fÿ(±Fÿ(ÿFÿMÿUÿ[ÿ^ù`#ï`,æ^6ß\DØYP ÑW[ÌTeÈRnÅPwÃOÀN†¾MŽ!¼L•#ºKœ$¸J¤&¶J¬'´J¶(³IÃ)±IÖ)®Jê*«Jø+©Jÿ+¨Kÿ+§Kÿ+§Kÿ+§Kÿ+§Kÿ+§Kÿ+ÿIÿPÿYÿ_ÿcòeçe%Þd1Ôb?Í`K Ç]VÂZ`¾Xi»Vq¸Ty¶S"³Rˆ$±P&¯P—(­OŸ)«N¨+©N²,§N¾-¦NÎ.£Næ.¡Oõ.ŸOÿ.žOÿ.Oÿ.Pÿ.Pÿ.Pÿ.Pÿ.ÿLÿT ÿ]ÿcùgëißjÓj,Ëh;ÅeG ¿bRº`\¶]e²[m¯Yu!¬X|#ªVƒ&§U‹(¥T“*£S›,¡S£.ŸR­/R¹0›RÉ1™Râ1—Sò1–Sÿ1•Tÿ1”Tÿ0”Tÿ0”Tÿ0”Tÿ0”Tÿ0ÿOÿX ÿ` ûf ðk ämÖnÌo(Äm7½kD ·hO²eX®baª`i§^p!¤]x%¡['ŸZ‡*œYŽ,šX—.˜W 0•Vª2“Vµ3‘VÅ4VÝ4ŽWð4Wý3ŒXÿ3ŒXÿ2ŒXÿ1ŒXÿ1ŒXÿ1ŒXÿ1ÿQ ÿ[ ÿcëjÝnØq ÏrÆs%¾r4·pA±mL¬jU§g^£ee cm"œat%š`{(—^ƒ+”]‹-’\“0[œ2Z¦4‹Z²5‰ZÁ6‡ZÖ6†[í6…[û5…\ÿ4„\ÿ3„\ÿ3„\ÿ3„\ÿ3„\ÿ3ÿS ÿ]õfßmÕrÐu ÉvÀw"¸v1±t>«qI¦nR¡l[ib™gj"–fq%“dx(c+a‡.Š`0ˆ_™3…_£5ƒ^¯6^¾8€^Ñ8_ê7~_ú6~`ÿ5~`ÿ4~`ÿ4~`ÿ4~`ÿ4~`ÿ4ÿUÿ`èiÚpÐuÊxÃz»{³z/¬x<¦uF ¡sPœpX—n`“kg!jn%hu(Šg|+‡f„.„d1c–4c¡6|b­7zb»9ybÎ9xcè8xcø7xdÿ6xdÿ5xdÿ5xdÿ5xdÿ5xdÿ5ÿWÿbálÔsËxÅ{¾} ¶~¯~,¨|9¡yD œwN—tV’r]Žpd Šnk$‡lr(„kz+j‚.~iŠ1{h”4xgŸ6vfª8tf¹9sfË:rfæ9rg÷8rgÿ7rhÿ6rhÿ5rhÿ5rhÿ5rhÿ5ÿYöeÝnÏvÇ{À¹€ ±‚ª‚*£€7}B —{K’xTv[‰tb …ri$qp'~ow+{n.xmˆ1vl’4skœ6pj¨8nj·:mjÉ:ljä:mkõ8mkÿ7mkÿ6mkÿ6mkÿ6mkÿ6mkÿ6ÿ[ëgÙqÌyÃ~»‚´„ ­…¦…(Ÿ„5™‚@ “I}R‰{Y„y`€wg#|un'ytu*vs}.sr†1pq4mp›6ko§8ioµ:hoÇ:goâ:goô8hoÿ7hoÿ6hoÿ6hoÿ6hoÿ6hoÿ6ÿ^äjÓtÈ|¿·…¯‡¨‰¡‰%›ˆ3”†> Ž„G‰P„W~^{|e"xzl&tys*qx{-nw„0kvŽ3hu™6ft¥8ds³9bsÄ:bsà:bsó8csÿ7csÿ6csÿ6csÿ6csÿ6csÿ6ÿaàmÏwÄ»…³‰ª‹£Œœ#–Œ0‹<ЉE„‡N…U{ƒ\w‚c!s€j%oq)l}y,i|‚/f{‹2cz—5`y£7^y±8]yÂ9\yÝ9]yñ8]xþ7^xÿ6^xÿ5^xÿ5^xÿ5^xÿ5õdÜpÊzÀƒ¶‰®¤‘—’ ‘‘.Š9„ŽC Lz‹Su‰Zqˆa n†h#j…o'g„w+cƒ.`‚‰1]”3[€¡6Y¯7WÀ8WÚ7Wð7X~ý6X~ÿ5X~ÿ5X~ÿ5X~ÿ5X~ÿ5éhÔtÆ~»‡²¨‘ž”––‘—‹—+…–7”A y“It’QpXl_hŽf!eŒm%a‹t(^Š},[‰‡/Xˆ’1U‡Ÿ3S‡­5R‡¾5Q‡Ö5Q†î5R…û4R…ÿ4R…ÿ3R…ÿ3R…ÿ3R…ÿ3ãlÎyÁƒ¶‹¬‘¢•—™› Š„'~œ4y›>sšG o™Oj˜Vf—]c•c_”j"\“r%Y’{(U‘…+R‘.P0N«1L¼2LÓ2Lí2LŽú2Lÿ1LŒÿ1LŒÿ1LŒÿ1LŒÿ1ÜqÈ~»ˆ±‘¦–œšŸ‡¢£|¤#w¤0r£;m¢D h¡Ld T`ŸZ]žaYhVp!Sœy$P›ƒ'MšŽ)Jš›,Hš©-G™º-FšÐ-F˜ë-F—ù.F–ÿ.F–ÿ.F–ÿ.F–ÿ.F–ÿ.ÑwÁ„¶Žª• ›•ŸŠ¤}©w«s«o¬,j«7e«AaªI ]©QZ©XW¨_S§fP§nM¦vJ¥!H¥Œ$E¥™&C¤¨'B¤¸(A¤Î'A£ê'@¢ø(@¡ÿ)@ ÿ)@ ÿ)@ ÿ)@ ÿ)É~º‹¯”£š˜ ¥‚ªu°l³ i´e´'a´3^´=Z´FV³N S³U P³\M²cJ²kG±tE±~B°Š@°—>°¦ <°· <°Ì <¯è ;®÷!:­ÿ":¬ÿ#:¬ÿ#:¬ÿ#:¬ÿ#À†³’§™œŸ¦„¬y±m·a¼]½Z¾ X¾-T¾8Q¾BN¾JL¾RI¾Y F¾` D¾hA½q?½|<½ˆ:½•8½¤7½µ6½Ê7¼ç5»ö5ºÿ4¹ÿ4¹ÿ4¹ÿ4¹ÿ¸ª˜ŸŸ“¦‡¬{³o¹c¾XÄPÈ MÈLÉ%JÊ1GÊ;EÊDCÊLAÊT>Ê\<Êd:Ën 8Ëx 6Ë… 4Ë’ 2Ë¢1˲0ÌÇ0Ëå/Éõ.Èý.Çÿ.Çÿ.Çÿ.Çÿ®—¡ž•¥‰­|´p»dÁYÆNËEÐ>Õ=Õ<Ö&;×19Ø;8ÙE6ÙM5ÙV3Ú^1Úh0Ûs.Û,Û*Ü)Ü­(ÝÁ(ÝÞ'Ûï&Ùù&Øþ &Øþ &Øþ &Øþ ¤˜¥‹­~´q¼eÃYÉMÍCÓ:Ù5ä 3ä1ä 0å*.æ3-æ<+çD*çL(èT'è]%ég#és"ê ê‘ë¡ë²ìÇìáêñéùéùéùéù𤬵r½eÅYËLÐAÕ8Ü/á-ñ +ñ(ò&ò$$ó+"ô2!ô9õAõIöQ÷Z÷eørùù’ú¢ú³ûÆûÝûéûéûéûé«´s½fÆYÍKÓ@Ù5Þ,ã&ñ$þ !ÿÿÿÿ"ÿ(ÿ.ÿ5ÿ<ÿCÿL ÿV ÿb ÿoÿÿÿ ÿ®ÿ¼ÿÇÿÇÿÇÿǃ´u½gÆZÏKÕ?Ü3á)å!ìýÿÿ ÿÿÿÿ ÿ# ÿ(ÿ.ÿ5ÿ=ÿFÿQÿ]ÿkÿ{ÿ‹ÿ™ÿ¥ÿ¬ÿ¬ÿ¬ÿ¬ÿ',ÿ**ÿ+*ÿ*.ÿ&4ÿ%?ÿ#Kÿ!Xÿ dÿpÿ{ÿ…ÿŽÿ–ÿœÿ¢ÿ¨ÿ®ÿ´ÿ»ÿÃÿÎÿßÿëüõùþ÷ÿ÷ÿöÿ öÿ öÿ öÿ öÿ ÿ)*ÿ,'ÿ.'ÿ-*ÿ,2ÿ+=ÿ)Iÿ'Uÿ%aÿ#mÿ"xÿ"‚ÿ!‹ÿ!“ÿ!šÿ! ÿ!¥ÿ!«ÿ!±ÿ!¸ô/Ë«ÿ!Áÿ!Ëü!Üù!éö!ôó"ýò"ÿ ñ"ÿ ñ!ÿ ð!ÿ ð!ÿ ð!ÿ ð!ÿ ÿ,&ÿ0$ÿ1#ÿ1&ÿ2/ÿ1:ÿ/Fÿ-Rÿ+^ÿ)iÿ(uÿ'ÿ'ˆÿ&ÿ&–ÿ&þ&£ ý&© ü&¯ û&¶ ú&¾ ø&È ö&Ù ò&è ï'ó í'ý ë&ÿ ê&ÿ é&ÿ è&ÿè&ÿè&ÿè&ÿÿ/#ÿ3 ÿ5ÿ7#ÿ8,ÿ87ÿ6Bÿ4Nÿ2Zÿ0eÿ.pþ-{ü-„ú,Œ ø,“ ÷,™ ö+  ô+¦ ó+¬ ò+³ ñ+» ï+Æ î,Ô ê,æ æ,ò ä,ü â,ÿá,ÿà,ÿß,ÿß,ÿß,ÿß,ÿÿ3ÿ7ÿ:ÿ= ÿ?(ÿ?2ÿ=>ÿ;Iÿ9Uû7a÷5lõ4vò3 ð2‡ ï2 í2– ì1œ ê1¢ é1© è1° æ1¹ å1à ã2Ñ ß2å Ü2ñØ1üÕ1ÿÒ1ÿÑ1ÿÐ1ÿÐ1ÿÐ1ÿÐ1ÿÿ7ÿ;ÿ?ÿCÿF$ÿF.ÿD9üBDö?Pñ=\íìFJçDVãCbßAl Ü@u Ù?~ Õ>†Ó=Ñ=”Ï<›Í<¢Ì<©Ê;±È;»Ç;ÈÅ<ÜÁ<í¾<ù»<ÿº<ÿ¹<ÿ¸<ÿ¸<ÿ¸<ÿ¸<ÿÿ>ÿDÿJÿOÿQûR#ñQ-éO8âMEÜKQÖI\ÑGf ÎFpËExÈD€ÆC‡ÄBŽÃB•ÁAœ¿A¤½@¬¼@¶º@¸@ÒµAè²Aö°Aÿ®Aÿ­Aÿ¬Aÿ¬Aÿ¬Aÿ¬AÿÿBÿG ÿOÿSÿVóWèV%àU1×S?ÏRLÊPW ÆNa ÃLjÀJr½Iz»H‚¹G‰·GµF—³FŸ±E§°E±®E¼¬E̪Eã §Fó!¥Fÿ!£Fÿ"¢Fÿ!¢Fÿ!¢Fÿ!¢Fÿ!¢Fÿ!ÿEÿK ÿS ÿW ùZë[ßZÔZ+ÌZ;ÆXHÁVS ¼T\ ¹ReµPm³Ou°N|®M„¬L‹ªK’¨Jš¦J£!¤I¬"£I¸#¡IÆ$ŸJÞ$Jð$›Jý%™Kÿ$™Kÿ$˜Kÿ$˜Kÿ$˜Kÿ$˜Kÿ$ÿH ÿOÿVõ[ é^ ä^ Õ_Ë`'Ä_6¾^C¸[N ´YX°Wa¬UiªTp§Sx¥R¢Q† PŽ žO–"œNŸ#šN¨%˜N³&—NÂ'•NÖ'“Nì'‘Oû'Oÿ'Pÿ&Pÿ&Pÿ&Pÿ&Pÿ&ÿJ ÿSøZâ_ÚbÔc ÍcÄe#¼e2¶c@±aK ¬^T¨\]¥[e¡YlŸXsœVzšU‚ ˜TŠ"•T’$“S›&‘R¥'R°)R¾*ŒRÐ*ŠSé*‰Sù)ˆTÿ)‡Tÿ(‡Tÿ(‡Tÿ(‡Tÿ(‡Tÿ(ÿLÿVé]ÜcÑgÌhÆh½j ¶i/°h<ªeG ¥cQ ¡aZ_aš^i—\p•[w’Z~!Y†#XŽ%‹W—'‰W¡)†V­+…Vº,ƒVÌ,‚Wæ,W÷+€Xÿ*€Xÿ*€Xÿ)€Xÿ)€Xÿ)€Xÿ)ÿOýYâ`ÕgÌjÆlÀl·m°n,ªl9¥jD hN ›fW—d^”be‘`lŽ_s‹^{!‰]‚$†\‹&„[”([ž*Zª,}Z·-|ZÉ.zZã.z[õ-z\ÿ,y\ÿ+z\ÿ*z\ÿ*z\ÿ*z\ÿ*ÿQò[ÞdÏjÇnÀpºp ²q«q)¥p7ŸnBšlK –jT’h\Žfc‹eiˆcp…bx!‚a$€`ˆ&}_‘){_œ+x^§-v^µ.u^Æ/t^á/t_ó.t_ÿ,t`ÿ+t`ÿ+t`ÿ+t`ÿ+t`ÿ+ÿSè^ÙgËmÃq»sµs ­u§u'¡t4›r?•pI ‘nRŒlY‰j`…ig‚hnfu!}e}$zd…&wd)ucš+rb¥-pb³/obÄ/nbÞ/ncò.ncþ-ncÿ,ncÿ+ncÿ+ncÿ+ncÿ+ÿUå`ÓiÈp¿t·w°w¨x¢y$œx2–v=‘tG ŒrOˆpW„o^€md}lkzks wjz#tiƒ&rh)og—,mg£.kf±/ifÁ0ifÛ0igð/igý-igÿ,jgÿ+jgÿ+jgÿ+jgÿ+þXácÏlÄs»x³z«z¤{ž|"˜|/’z;ŒxE ‡wMƒuUs\{rbxpiuop rnx#om&ml‹)jl–+hk¡.fk¯/dj¿0ckØ0ckï/dkü-dkÿ-ekÿ,ekÿ,ekÿ,ekÿ,ô[ÝfËoÀv·{¯~¦~Ÿ™€“€-9ˆ}C ƒ{K ~zSzxZvwasugptnmsv"jr&hq‰(ep”+bp -`o­/_o½/^oÔ/^oí/_oû-_oÿ,`oÿ,`oÿ,`oÿ,`oÿ,ë^ØiÇr¼y³«‚¡‚™ƒ”„Ž„+ˆƒ6ƒ‚@~€I yQu}Xr|_n{ekzlhyt"ex}%bw‡'`v’*]už,[u«.Zt»/YuÑ/Ytì.Ytú-Ztÿ,Ztÿ+Ztÿ+Ztÿ+Ztÿ+æaÑmÃv¹}¯ƒ¦†œ†”ˆ މ‰‰(ƒ‰4~‡>y†G t…Op„Vm‚]icf€jcr `~z#]}„&Z|)X{œ+V{©,T{¹-S{Î-Tzê-Tzù,Tyÿ+Uyÿ*Uyÿ*Uyÿ*Uyÿ*áeÌq¿z´‚«‡¡Š•‹ ‡Ž‚$}1xŽ;sD oŒL kŠTg‰Zdˆaa‡h^†p[…x!X„‚$U„&Rƒš)P‚§*O‚·+N‚Ì+N‚è+Nø*O€ÿ*O€ÿ)O€ÿ)O€ÿ)O€ÿ)ÛjÇuº°‡¦Œœ‘†“€”{•!w•-r•8m”Bi“J e’Qb‘X^_[fXŽmUŽvR€!OŒ‹#M‹˜%K‹¥'I‹µ(H‹Ê(HŠç'I‰÷(Iˆÿ'I‡ÿ'I‡ÿ'I‡ÿ'I‡ÿ'ÑoÁ{µ„«Œ •”‰—~šw›sœo)kœ5fœ?b›G_šO \šVX™\U˜cS˜kP—sM–}J•‰G••!E•¤#D”³#C”È#C”å#C’õ$C‘ÿ$Cÿ$Cÿ$Cÿ$Cÿ$Êu»°‹¤‘š•™ƒt¢n£ j¤f¥%c¥1_¤;[¤DX¤KU£S R£Z O¢aM¢hJ¡qG {D †BŸ“@Ÿ¢>Ÿ²=ŸÆ=Ÿã=ô=œÿ<›ÿ<›ÿ <›ÿ <›ÿ Â|µˆ©ž–“›‡Ÿ{¤o¨c¬_­\­Z®+W®6T®@Q­HN­OK­W I­^ F¬f D¬nA¬x?«„<«‘:« 9«°8«Ã8ªá7©ó7§þ6¦ÿ6¦ÿ6¦ÿ6¦ÿº„®¢–—›‹¡¦s«g¯Z´S¶ Q·O·$M¸0J¸:H¸CF¸KD¸RA¸Z?¸b=¸k :¸u 8· 6·Ž4·3·­2·Á1·Þ1¶ò0´ü0³ÿ0³ÿ0³ÿ0³ÿ²Ž¥•š›Ž¢‚¨u­i³^·S»GÀCÂBÂ@Ã'?Ã2>Ä<<ÄD:ÄM8ÄU6Ä]5Äf3Åp1Å|/ÅŠ-Åš+Ū*ž*ÅÚ*Äð)Âû (Áÿ (Áÿ (Áÿ (Áÿ ¨•›‘¢„©x¯kµ_»T¿IÃ?È6Í 3Î2Ï1Ï'0Ð1/Ð:.ÑC-ÑL+ÒU*Ò_(Ói'Óv%Ó„$Ô”"Ô¦!Õ¹!ÕÒ Óë ÒöÑÿÑÿÑÿÑÿŸ›”¢‡©y±m¸`¾TÃIÇ>Ë5Ð-Õ%Û $Þ#Þ"ß%!à. à7á@áJâSã^ãjäxäˆå𿬿ÀçÝåïãúãúãúãú–¢‰©{±n¹aÀTÆHÊ=Ï3Ó*Ù"Þë ìííî&î-ï5ð=ðFñPò[òi óx ôŠ õœ õ® ö öÙõíõíõíõí‹©}²oºbÂUÉGÎ;Ò1Ø'Ýáèøú ûüü ý# ý)Mþ þ0ÿ8ÿAÿLÿXÿfÿwÿ‰ÿ›ÿ«ÿ»ÿÎÿÏÿÏÿϲqºcÃVËHÑ:Ö/Ý%áåé÷ÿ ÿ ÿ ÿÿÿÿÿ#ÿ*ÿ2ÿ<ÿGÿTÿcÿsÿ…ÿ—ÿ¤ÿ²ÿ²ÿ²ÿ²ÿ")ÿ#'ÿ#(ÿ +ÿ1ÿ=ÿIÿVÿbÿnÿxÿ‚ÿ‹ÿ’ÿ™ÿžÿ¤ÿ©ÿ¯ÿ¶ÿ½ÿÇÿÔýåúñ÷úõÿôÿôÿôÿôÿôÿôÿÿ$'ÿ&$ÿ&$ÿ$'ÿ"/ÿ :ÿFÿSÿ_ÿjÿuÿÿˆÿÿ–ÿœÿ¡ÿ§ÿ­ÿ³þ»ýÅúÑ÷äôïñúïÿîÿîÿíÿíÿíÿíÿÿ'#ÿ) ÿ) ÿ(#ÿ)-ÿ'7ÿ%Cÿ#Oÿ![ÿfÿqÿ{ÿ„ÿŒþ“ü™ûŸú¤ùª÷±ö¹õÂóÎðáìîéùèÿæÿåÿåÿåÿåÿåÿÿ+ÿ-ÿ-ÿ. ÿ/)ÿ/4ÿ,?ÿ*Kÿ(Wÿ&bý%mú$wø#€ö#ˆõ#ó#•ò#›ñ#¡ï#¨î#®í#¶ë#¿ê#Ìç#àã$íà$ùÞ$ÿÜ$ÿÛ$ÿ Ú$ÿ Ú$ÿ Ú$ÿ Ú$ÿ ÿ.ÿ1ÿ2ÿ5ÿ6%ÿ6/ÿ4:ÿ1Fû/R÷-]ó,hð+rî*{ì*„ê*‹è*’ç)˜æ)žä)¥ã)¬á)´à*½Þ*ÊÛ*ÞÖ*íÒ*ø Ï+ÿ Í*ÿ Ì*ÿ Ë*ÿ Ë*ÿ Ë*ÿ Ë*ÿ ÿ2ÿ5ÿ8ÿ;ÿ= ÿ<*þ;5÷9Añ6Mì4Xè3cå2mã2và1Þ1‡Ü0ŽÚ0•Ø0›Ö/¢Ô/©Ò/±Ð/º Ï0Æ Í0Ø É1ê Æ1÷ Ã1ÿÁ1ÿÀ1ÿ¿1ÿ¿1ÿ¿1ÿ¿1ÿÿ6ÿ9ÿ>ÿAÿCÿB#õA.í>:ç=Fát Ã={ Á=ƒ ¿<Š ½<»<—º;Ÿ¸;§¶;°µ;»³;ɱ;à®<ñ«<ý©<ÿ¨<ÿ¨<ÿ§<ÿ§<ÿ§<ÿÿ= ÿBÿH ÿK úLìLáJÖJ,ÎK;ÉJHÄHSÀG]¼Ff ºDn ·Cv µC}³B„±A‹°A’®@š¬@¢ª@«©@¶§@Ħ@Ù£Aí AûŸAÿžAÿAÿBÿBÿBÿÿ@ ÿFÿLñOæP ãO ÕOÌQ'ÅQ6¿PCºON¶MX³La °Ji ­Ip«Hx©G§G†¥F£F•¡EžŸE§žE²œE¿šEјEé–Fø•Fÿ”Fÿ“Fÿ“Gÿ“Gÿ“GÿÿBÿJòPáTÙVÓU ÌUÃV"¼W2·V?²TJ­STªQ] §Pd¤Nl¢MsŸLzL›K‰™J‘—J™•I£“I®’I»IÌŽJåJö‹Kÿ‹KÿŠKÿŠKÿŠKÿŠKÿÿEÿMåTÙYÏ[Ê[ÄZ»[µ\.¯[;ªZF¦XP¢VY ŸU`œSh™Ro—Qv•P}“P„OŽN–ŒNŸŠNªˆN· ‡NÈ!…Nâ!„Oó ƒOÿ ƒOÿ‚Pÿ‚Pÿ‚Pÿ‚PÿÿGóQßXÑ]É`Ã`½^ µ`®a*©`7¤^CŸ]M›[U ˜Y]•Xd’WkVrUy‹TˆS‰†S’„Rœ‚R§!€R´"RÄ#}RÞ#|Sñ"|Sþ!{Tÿ!{Tÿ {Tÿ {Tÿ {Tÿ ÿJéTÚ\ÌaÃd¼d¶c ¯d©e'£d4žc@™aJ•_R ‘^ZŽ]a‹[h‰Zo†Yv„X}X†W}V™ {V¤"yV±#wVÁ$vVÚ$uWï$uWý#uXÿ"uXÿ!uXÿ!uXÿ!uXÿ!ÿMåWÓ_Èd¿g·h±g©h£i$žh2™g=”eGdO ŒbW ˆa^…_eƒ^l€]s}]z{\ƒy[Œv[—!tZ¢#rZ¯$qZ¿%pZÕ%o[í%o[ü#o[ÿ"o[ÿ"o[ÿ!o[ÿ!o[ÿ!úOáZÏbÄg»k³l¬j¤kžl!™l/”k:iDŠhM †fU ƒe\€db}bizbpxaxu`€s_Šp_”!n^ #l^­%k^¼&j^Ñ&i^ì%j_û$j_ÿ#j_ÿ"j_ÿ"j_ÿ"j_ÿ"ðRÝ]ËeÀk·n¯o§n ošp”p,o8ŠmB†lK ‚jR ~iY{h`wffufnreupd~mcˆkc’"ibž$gb«%ebº&dbÏ&dbê&ebú$ecÿ#ecÿ"ecÿ"ecÿ"ecÿ"ëUØ`Èh¼n³q«s¢q›r•st*Šs6…r@pH}oP ymWvl^skdpjlmiski|hh†fg!dgœ#bf©%`f¹&_fÍ&_fè&`fù$`fÿ#`fÿ#afÿ"afÿ"afÿ"èXÓcÄk¹q°u§wžu–v w‹x'†w3v=|uFxsN urUqq\npckojinqfnzcmƒalŽ!_kš#]k§%[k·&ZkÊ&Zkç%[k÷$[jÿ#\jÿ"\jÿ"\jÿ"\jÿ"ã[ÎfÀn¶t¬y£{˜yz Š{…|$|1|{;wzDsyL pxS lwZivaguhdtoasx^r\qŒ Zq˜"Xp¦$Vpµ%UpÈ%Upå%Upö$Voÿ#Voÿ"Woÿ"Woÿ"Woÿ"ß_Êi¼r²x©}Ÿ’~Š„€€!{.w€9r€BnJk~Q h}Xd|_b{f_zm\yuYxWxŠTw–!Rv¤"Qv³#PvÆ$Pvã#Puõ#Quÿ"Qtÿ!Qtÿ!Qtÿ!Qtÿ!ØcÅm¸v®}¥‚šƒƒ„„}…y†u‡+q‡6m†?i…Ge„O bƒV _ƒ\\‚cZkW€sT}QˆO~”M~¢ K}±!J}Ä"J}á!K|ô!K{ÿ K{ÿ K{ÿ K{ÿ K{ÿ ÐgÀr´{ª‚ †•ˆ‡ˆ|ŠvŒrnŽ'jŽ2f<cD`ŒL\‹S Z‹Z WŠaT‰hQˆqOˆzL‡…J†’H† F†¯E…ÂE…ßE„òEƒþE‚ÿE‚ÿE‚ÿE‚ÿÊmºx¯¥‡š‹Žt‘n“ i”f•"c•.`•8\•AY”IV”PT“W Q“^ N’fL’nI‘xFƒDBž@­?À?Ü?ñ?Œý?‹ÿ?‹ÿ?‹ÿ?‹ÿÂsµ~ª‡ŸŒ”ˆ“{•l™e›`œ][ž)Xž4Už=REPMMTKœ[ Hœc Fœk C›uA›€>š<š›:š«9š½9šÙ9˜ï9—ü8–ÿ8•ÿ8•ÿ8•ÿ»z¯…¤Œ˜‘•šuh [¤V¥ S¦Q§#O§/L§8J§AH§IF§PC§XA§_?¦h=¦r :¦} 8¦Š 6¥™4¥©3¥»3¥Ô3¤î2¢û2¡ÿ2¡ÿ2¡ÿ2¡ÿ´‚¨Œ’’—†œy¡m¥a©U¬K¯G°E°D±'B±2A²;?²C=²K;²S9²[7²d5²n3²y1²‡/±–.²¦-²¸ ,²Ð,°ì +¯ù +®ÿ *­ÿ *­ÿ *­ÿ ­‹ ’•˜‰}£q¨d­Y±M´B¸;º 8»7¼5¼)4½23½;2½D1¾L/¾U.¾^,¾h*¾t)¾‚'¿‘&¿¢$¿´#¿Ë#¾è#¼÷"»ÿ"»ÿ"»ÿ"»ÿ¤’˜˜Œž€¥s«g°[µO¹D¼:À0Ä*Ç (È'É&É'%É0Ä¡·$Ê9#ÊB"ËK!ËU Ì_ÌlÍzÍŠÍœήÎÅÍäÌôÊüÊÿÊÿÊÿ›™Ÿ‚¦u­h³\¹P½DÁ9Ä0È(Ì ÐÕ ×ØÙ"Ù+Ú4Ú=ÛHÜSÝ_ÝmÞ~ß‘ठภàÒ ßí Þ÷ Ýû Ýû Ýû’Ÿ…§w®jµ]¼PÁDÅ8É.Í%ÑÕÚÞç ç è è! é) ê1 ê;ëEëQë^ënë€ê”ê§ë¼ëÒëéìïìïìy¯k·^¾QÅCÉ7Í-Ñ#ÖÛßã î ö öööõõ%õ.õ7öBöNö]önöö•÷§÷·øÇøÐøÐøÐ{¯m¸`ÀRÈDÍ7Ñ+×!Üàä çïúÿÿÿ þþÿÿ!ÿ)ÿ3ÿ>ÿKÿ[ÿlÿ€ÿ’ÿ¡ÿ­ÿ³ÿ³ÿ³ÿ&ÿ$ÿ%ÿ'ÿ.ÿ:ÿGÿ Sÿ _ÿ kÿ uÿ ÿ ‡ÿ Žÿ •ÿ ›ÿ  ÿ ¥ÿ «ÿ ±ÿ ¸ÿ Áþ Ìü Þù ëõ öó ÿò ÿñ ÿñ ÿñ ÿñ ÿñ ÿÿ#ÿ!ÿ!ÿ$ÿ,ÿ7ÿDÿPÿ\ÿgÿrÿ{ÿ„ÿ‹ÿ’ÿ˜ÿÿ£þ¨ü®ûµú¾øÉõÛòêîõìÿëÿêÿêÿéÿéÿéÿÿ"ÿ"ÿ!ÿ ÿ)ÿ4ÿ@ÿLÿXÿcÿnÿwþ€üˆúŽù•øšö õ¦ô¬ó³ñ¼ðÇíØéèæõäÿâÿáÿáÿàÿàÿàÿÿ%ÿ&ÿ$ÿ%ÿ&%ÿ$0ÿ!;ÿHÿTý_ùi÷sô|ò„ñ‹ï‘î—ìë£éªè±çºåÅãÕßèÜõØÿÕÿÔÿÓÿÒÿÒÿÒÿÿ)ÿ*ÿ)ÿ,ÿ,!ÿ,+ÿ)7ý'C÷%Oó#Zï"dì!né!wç!å!†ä!â ”á šß  Þ §Ü!¯Ú!¸Ø!ÃÕ!ÓÑ"çÍ"ôÊ#ÿÈ#ÿÇ#ÿÆ#ÿÆ#ÿÆ#ÿÆ#ÿÿ,ÿ.ÿ0ÿ3ÿ3ÿ2%ú00ò.<ì,Iç*Uã*_à)iÝ)rÚ(z×(‚Õ(‰Ó(Ñ(–Ï(œÎ(£Ì(«Ê(³É(¾Ç(ÌÅ)âÁ*ñ¾*þ¼*ÿº*ÿº*ÿ¹*ÿ ¹*ÿ ¹*ÿ ÿ0ÿ2 ÿ6 ÿ8ÿ9ù7ï5(ç35à2BÛ2OÕ1ZÐ1dÍ0mË0uÉ0|Ç/ƒÅ/ŠÄ/‘Â/—Á/ž¿/¦½/¯¼/¹º/Ǹ0ݵ0î ²0û °0ÿ ®0ÿ ®0ÿ ­0ÿ ­0ÿ ­0ÿ ÿ3 ÿ6ÿ< ÿ> ý=ï<ä9Û9-Ò:<Í:IÈ9TÄ9^Á8g¿7o½7v»6}¹6„·6‹¶5’´5š ³5¡ ±5ª ¯5´ ®5Á ¬5Ô ©6ê ¦6ø ¥6ÿ£7ÿ¢7ÿ¢7ÿ¢7ÿ¢7ÿÿ7ÿ;ÿ@òBéB å?Ø>Î@'ÇA6ÂAD½AO¹@Y¶?a´>i±=q¯=x®< ¬<† ª; ©;• §; ¥;¦ £:°¢;¼ ;Íž;æ›<õš<ÿ™<ÿ˜<ÿ˜<ÿ˜<ÿ˜<ÿÿ:ÿ@ïEáHÙHÓF ÌEÄG"½H1¸H?³GJ°FT¬E]ªDd§Cl¥Bs £Bz ¡A  Aˆ ž@œ@˜š@¡˜@¬—@¸•@È“@á‘AóAÿAÿŽBÿŽBÿŽBÿŽBÿÿ<ùDäJØNÎOÉMÃK»MµN-¯N:«MF§LO¤KX¡J`žIg œHn šGu ˜F|–Fƒ”E‹’E”EŽE¨ŒE´‹EÄŠE܈Fð†Fý†Fÿ…Gÿ…Gÿ…Gÿ…Gÿÿ?ìHÝOÏSÆUÀS»Q ³R­S)¨S6£RBŸQKœPT™O\–Nc ”Mj ‘LqKxK‹J‡‰J‡Iš…I¥ƒI±‚IÀJÖJí~Kü~Kÿ}Kÿ}Kÿ}Kÿ}KÿÿCæLÖSÉXÀYºX´V ¬W¦X%¡X2W>˜VH•UQ’TXR_ ŒRf ŠQmˆPt…O{ƒO„NN—}N¡{M®zN½xNÑwNëwOúvOÿvOÿvOÿvOÿvOÿøFâPÐWÄ\»^´]®Z¦[ \"›\/—[;’ZEYM‹XUˆW\ †Vc ƒUjTq~Tx|S€zR‰xR”vRŸtR«rRºqRÍpRèpSùpSÿpSÿpSÿpSÿpSÿïIÝSËZÀ_·b¯a¨^¡_›`–`,‘`8^B‰]K…\R‚[Y €Z` }Yg{XnxXuvW}tW‡rV‘oVœnV©lV¸kVËjVæjW÷jWÿjWÿkWÿkWÿkWÿëLØVÈ^¼b³e«e£bœb–c‘d)Œc5ˆb?„aH€`P}_W z^] w]d u\ks\rp[{n[„lZjZšhZ§fZ¶eZÈeZäeZöeZÿeZÿeZÿeZÿeZÿèOÓYÄa¹f°h§iže—f ‘gŒh'‡g2ƒf=eF{dMxcT ub[ raa paim`pk_yi_‚g^e^˜c^¥a^´`^Ç`^ã`^õ`^ÿ`^ÿa^ÿa^ÿa^ÿäRÏ\Àd¶i¬l£l™i’j Œj‡k$‚k0~j:ziCvhKsgRpgY mf` kefhdnfdvdc€bc‹`b—^b¤\b²[bÅ[bá[bô[bÿ\bÿ\bÿ\bÿ\bÿàUË_½g²l©pŸo”lŒm†n‚o!}o-yo8unArmInlPkkW ik^ fjedilait_h~]g‰[g•Yf¢Wf°VfÃVfßVfóWfÿWfÿWfÿWfÿWfÿÛYÇbºj¯p¦sšsp‡qr|sxs*ts5ps?mrGjqNgqU dp\ boc_oj]nrZm|Xm†Vl“Tl Rk¯QkÁQkÜQkñRkþRjÿRjÿRjÿRjÿÔ\Ãf¶n¬t¢w–v‰uvzwvxry'oy2kx<hxDewLbwS_vZ ]ua ZuhXtpUsySs„QrOržMq­Lq¿KqÙLqðLpýMpÿMoÿMoÿMoÿÎ`¾j²r¨x{z„zz{t| o~l~$i/f9bB_~I]}PZ}W W|^ U|e R{nPzwNz‚KyŽIyœHx«Fx½FxÕFwïGvüGvÿGuÿGuÿGuÿÉeºo®w¤}˜‹~slƒ h„e… b†,_†6\†?Y…FW…NT…UR„\ Oƒc Mƒk K‚tH‚FŒDšB€©A€º@€ÒAíA~ûA}ÿA}ÿA}ÿA}ÿÂjµuª}Ÿ‚’ƒ…„y…j‰dŠ`Œ][Ž'XŽ2UŽ;SŽCPŽJNRLYIŒ`GŒh E‹r B‹}@Љ>Š˜<Ч;Џ:ŠÏ;ˆë;‡ú;†ÿ;†ÿ;†ÿ;†ÿ¼q¯{¥ƒ™‡Œˆ‰sŒe\“W• T–R–"P—-M—6K—?I—GG—NE–UC–]A–e>•o<•z :•‡ 8•• 6”¥ 5”¶4”Ì 4“é 4’ø4ÿ4ÿ4ÿ4ÿµxª‚žˆ“†Žym“a—U›MžIŸGŸF &D 0ñynÑC¡:A¡B?¡I=¡Q;¡Y9¡a7 k5 v3 ƒ1 ’0 ¢. ³. É.Ÿç-÷ -œÿ -›ÿ -›ÿ -›ÿ ¯€£‰—Ž“•r˜fœ[ O¤E§>© <ª:ª9ª)8«27«;5«C4¬K2¬S1¬\/¬f-¬q+¬*¬Ž(¬ž'¬°&¬Å&«ä%©õ%¨ÿ%§ÿ%§ÿ%§ÿ§‰›‘”„™xžk¢_¦SªH­=°4³/µ-µ,µ +¶)*¶2)·:(·C'·L&¸U$¸_#¸k"¸x ¸ˆ¸™¹«¹À¸ß¶òµü´ÿ´ÿ´ÿŸ”•ˆ›{¡n¦b«V°J³?¶5¹,¼$¿ ÂÂÃ&Ã/Ä8ÄAÄJÅUÅaÆoÆÆ‘ǤǹÇÔÆîÄúÃÿÃÿÃÿ—–‹œ~¢q©d¯X´K¸@»5¾+Á#ÅÉÌÐ Ñ Ñ Ñ! Ñ* Ñ4 Ò> ÒI ÓU ÓbÓrÔ„Ô˜Ô«ÕÀÕÜÕíÕöÕöÕöŽ€¤s«f±Y¸L½?À4Ã*Ç!ÊÎÒ Ö ÛÜ ÜÝÞ Þ(ß1à<áGâTãcãtäˆä›å®åÁåÕæçæçæçƒ¤u¬h³Z»MÁ@Ä3È(ÌÐÔÙ Ýáäåæ çèéê%ë.í9ïEðSñdñvòŠóœó­ô»ôÈôÈôÈw­jµ\½OÄ@É3Í'ÑÖÜàãæêîîïð ñóôö ø*ú5ýCþRÿcÿvÿ‰ÿšÿ¦ÿ°ÿ°ÿ°ÿ#ÿ!ÿ!ÿ $ÿ +ÿ7ÿDÿQÿ]ÿhÿrÿ{ÿƒÿŠÿ‘ÿ–ÿœÿ¡ý¦û¬ù³÷»õÅóÑòäññïúîÿîÿíÿíÿíÿíÿÿ ÿÿÿÿ)ÿ 4ÿ AÿMÿYÿdÿnÿwÿ€ÿ‡ÿý“û™ùž÷¤õªó°ñ¸ïÂíÏëãêïèûçÿæÿæÿæÿæÿæÿÿÿÿÿÿ%ÿ0ÿ=ÿIÿ Uÿ `ÿ jý sû |ù ƒ÷ Šõ ô –ó ›ñ ¡ï §í ®ë ¶è Àæ Íä ââ ðß ûÞ ÿÜ ÿÜ ÿÛ ÿÛ ÿÛ ÿÿÿÿÿÿ"ÿ,ÿ8ÿDþPù[õfóoðwîì†êŒé’è˜æžå¥ã¬á´à¾ÞÌÚáÕðÒûÏÿÎÿÍÿÍÿÌÿÌÿÿ"ÿ"ÿ!ÿ"ÿ"ÿ 'ÿ2ø>òKîVê`çjärâzà‚ÞˆÜە֢ٛԩұлÎÉÌÞÈîÅûÃÿÁÿÀÿÀÿÀÿÀÿÿ&ÿ% ÿ( ÿ)ÿ(þ& ô$+ì!8æ DáPÝ[ÙeÕmÒuÐ}΃̊ËɗȞƥŠ­à ·Á ÄÀ!Ö¼"ê¹"ø¶"ÿµ#ÿ´#ÿ³#ÿ³#ÿ³#ÿÿ) ÿ*ÿ.ÿ/ ÿ-ó+è("à&/Ù&=Ò'JÍ'UÊ(_Ç(hÅ(oÃ'wÁ'~¿'„¾'‹¼'’»'™¹' ·'©¶(³´(¿³(ϰ)æ­)ö«*ÿ©*ÿ¨*ÿ¨*ÿ¨*ÿ¨*ÿÿ-ÿ0ÿ3ö4ï2 è.Ü,Ñ.(Ë/7Æ0DÁ0O¾0Y»0b¸0j¶/qµ/x³/±/†°/®.”­.œ«.¤©/®¨/º¦/ʤ0â¡0óŸ0ÿž1ÿ1ÿœ1ÿœ1ÿœ1ÿÿ0ÿ5ï8â:Û9Ö5 Î4Æ6"¿81º8?¶8J³8T°7]­7d«6l©6s¨6y¦5€¤5‡£5¡5—Ÿ5 ž5ªœ5¶›5Å ™5Ý –6ï ”6ý “7ÿ ’7ÿ ’7ÿ ’7ÿ ’7ÿ ÿ3ö:ä?ØBÎBÉ>Ä;»>µ?,±?:­?E©?O¦>X£=_¡=gŸ^qF\pMYpTWp[UobSoj Pns Nn~LmŠJm˜Il§Hl¸GlÍGlêHkúHkÿHjÿHjÿHjÿÇ^¸g¬n¡r“r‡qzqqrktfucv`w(^w3[x<YwCVwKTwRRvYPv`NuhKuq It| GtˆEs–Cs¥Bs¶AsËBrèBrøBqÿCpÿCpÿCpÿÁc³l¨s›vŽuvuvixcz^|\}Y~$õ2œ·W/U8S@PHN~OL~VJ~]H}eF}nC|y A|† ?{” >{£<{³<{È…v;…ƒ9…‘ 8„  6„± 6„Æ 6ƒä 6‚ö 6ÿ 6€ÿ 6€ÿ 6€ÿ ¶oªxŸ~ƒw€k‚^‡UŠNŒJŽHG%E/D8B@@G?O=V;_9h7s5€3Ž1ž0ޝ/ŽÃ/Žá/Œô/‹ÿ/Šÿ/Šÿ /Šÿ °v¥˜„Š„}…p‡eŠZŽO’F•A˜ >˜=™;™(:š19š:7šB6šJ5šR3šZ1šd/šo-š{,šŠ*šš)š¬(šÀ'™Þ'—ò'–ý'•ÿ'•ÿ'•ÿ©~ž…’‰„ŠvŒj^“T—I›@Ÿ7¢2£1£0¤!.¤*-¤2,¥:+¥C*¥K)¥T(¥^&¥i%¥v#¥…"¥– ¦¨¥»¥×¤ï¢û¡ÿ¡ÿ¡ÿ¢†—Œ‹}‘o”c˜WM¡C¥8¨0«(®$¯#¯!¯! °)°1°:±B±L±V±a²o²~²²¢²¶²Î±ë¯ù®ÿ®ÿ®ÿš’„—ušhŸ[£P¨E¬;°1²'µ ¸º¼¼¼½&½.½7¾A¾L¾W ¾e ¿t ¿† ¾™¾¬¾Â¾ß¾ð½ú½ü½ü“”‡™zŸl¥`ªS¯G³<¶1¸'»¾ÁÄ ÈÉÉÉÉ$Ê,Ê6Ê@ËLËYËhËy̌˟˳ËÈÌâÌïÌñÌñŠš|¡o§b­U³H¸;»0¾&ÁÄÈË ÎÒÓ ÓÔÕÖ"×*Ù4Ú?ÜKÜZÝjÝ}ݑݤ޶ÞÈÞÞÞâÞâ¢q©d°V·I¼<À/Ä$ÇËÏ ÒÖÛÞßà áâãåæ'è1ê=ìKìZílî€î”î¥î´îÂîÆîÆtªf²X¹KÀ=Å/É$ÍÑÖ ÛÞáåèéêëí ïðòô#÷.ù;ûJü[ýmý€þ“þ¢þ­þ¯þ¯ÿÿÿ ÿ ÿ(ÿ5ÿAÿNÿZÿeÿnÿwÿþ†üŒû’ù—øœ÷¢ö§õ­óµò½ñÉïÜîëí÷ìÿëÿêÿêÿêÿêÿÿÿÿ ÿÿ%ÿ1ÿ>ÿJÿVÿaÿkýsú{÷ƒõ‰ôò”ñ™ðŸî¤í«ì²êºèÆçÖåèäõãþâÿáÿáÿáÿáÿÿÿÿÿ ÿ "ÿ-ÿ9ÿFÿQþ\úföoòwï~í…ë‹ê‘è–çœæ¡ä¨ã¯á¸ßÃÝÑÛæÙó×ýÕÿÔÿÔÿÔÿÔÿÿÿÿÿÿÿ(ÿ 4ÿ AùLõWñaíjéræzäâ‡àߒݘ۞٥׭ԵÒÀÐÏÎåÌ ôÊ ÿÈ ÿÇ ÿÇ ÿÆ ÿÆ ÿÿÿ ÿ ÿÿÿ"û.ó:íFè Rå \á eÞ mÛ uØ |Õ ‚Ó ‰Ñ Ð •Î œÍ£Ë«É´ÈÀÆÏÃæÀõ½ÿ¼ÿ»ÿºÿºÿºÿÿ ÿÿÿ ÿøî&æ3à?ÚKÔVÐ_ÎhËoÉwÇ}ƄĊÑÁ˜ÀŸ¾§¼°»¼¹Ë·â³ò±ÿ¯ÿ®ÿ®ÿ­ÿ­ÿÿ"ÿ"ÿ%ü$÷! ìáØ*Ð8ËEÇPÃZÀb¾j¼qºx¹~·…¶Œ´“³š± £° ¬® ·¬!Æ«!ݧ"ï¥"ý£#ÿ¢#ÿ¢#ÿ¡#ÿ¡#ÿÿ%ÿ(ò*å+ß(Ü! Ò!É$$Ã%2¾&?º'J·'T´']²'d°'l®'r­'y«'ª'†¨'ާ'–¥'ž£(¨¢(³ (ÁŸ(Õœ)ìš*ú˜*ÿ—*ÿ—*ÿ–*ÿ–*ÿÿ(õ.å3Ú5Ð3Ì-Æ*¾-¸.,³/:¯/E¬0O©/X§/_¥/f£/m¡/s .zž..‰›.‘™.š˜.¤–/¯•/½“/Ï‘0è0ø1ÿ1ÿŒ1ÿŒ1ÿŒ1ÿÿ-ê5Ü:Î=Æ<À7»3 ³4®6'©74¥7@¢7JŸ7S6Z›6a™6h—5o•5u”5|’5„55–5 ‹5«Š5¹ˆ5ʇ6å…6ö„7ÿƒ7ÿƒ7ÿ‚7ÿ‚7ÿô2ã;ÒAÆD½C·?±; ª;¥<" =0=;™=E–=N”kÿ >kÿ º`­i n‘m„mxmlnap[rVt RuPvNw'Lw1Kx9IxAHxIFxPDwWBw_@wh>ws³<¬8§3¢24™5*•55’5@5I5P‹5W‰5^‡5d…4k„4r‚4y€4‚~4‹}4–{5¡y5®x5¾w6Ôv6ít7üt7ÿt7ÿt7ÿt7ÿç5Ò=ÃB¸D¬B¤>Ÿ9š8”::&;1Š;;‡;D„;L‚;S€:Z~:`}:g{:ny:uw:~v:ˆt:“r:žq:«o;»n;Ïm;êm<úl<ÿl<ÿl<ÿl<ÿâ9ÌB¾G±H¥FC—?’> ?‰?!…@-‚@7@@}@H{@Oy@Vw?]u?cs?jq?rp?zn?„l?k?œi?©h?¸g@Ìf@èf@ùe@ÿe@ÿe@ÿe@ÿÜ>ÇF¹K¬L J—G‘C‹C†C‚D~D){E4yE=vEEtDLrDSpDYnD`lCgkCoiCwgCfCdC™bC§aD¶`DÊ`Dæ_Eø_Eÿ`Eÿ`Dÿ`DÿÖAÃI¶N§O›M’KŒG…G€G|HxH&uI0sI:pIBnIIlHPjHVhH]fHdeHlcHuaG`GŠ^H—]H¥[H´[HÇ ZHäZIöZIÿZHÿZHÿZHÿÑE¿L²R£Q—PN†J€JzKvLrL#oL-mM6jL?hLFfLMdLSbLZaLa_Li^Lr\L|ZLˆYL•WL£VL²ULÆ ULâ ULõULÿULÿVLÿVLÿÌH¼P¯U T“S‰QMzNS²L8uO pOmP jP*gP3eP<cPCaPJ_PQ]PX\P_ZPgYPpWPzUP†TP“RP¡QP± PPÄ PPá PPôQPÿQOÿQOÿQOÿÉK¹S«WœVU…T|PuQpR kShTeT'bT1`T9^TA\THZTOYTVWT]VTeTTnRTxQT„OT‘NT LT¯LT KTß LTóLSÿLSÿMSÿMSÿÅN¶V§Z˜Y‹XWwTpUjVfWbW`X$]X.[Y7YY?WYFVYMTYTSY[QYcOXlNXvLX‚JXIXžHX®GXÀGXÝGXòGWÿHWÿHWÿHWÿÁQ²Y£\”[‡[}ZrXkYeZ`[]\Z\!X]+V]4T^<S^DQ^KP^RN^YL^aK]jI]tG]€E]D]œC]¬B]¾B]ÚB\ñB\þC[ÿC[ÿC[ÿ½U¯]Ÿ_^ƒ^x]m\e]__Z` WaUbRb(Qc1Oc9NcALcHKcOIcVGc^EcgDcqBc}@b‹?bš>bª=b¼`ÿ>`ÿ>`ÿ¹Y«aša‹aataia_bYdTf QgNgLh$Ki-Ii6Hi>FjEEjLCjTBj\@ie>io¬=¡:š7•31 Œ1‡2 „3+353>}3F{3My3Tw3Zv3at3gr4oq4wo4n4Œl4˜j5¥i5³h5Æg6âf6õf6ÿf6ÿf6ÿf6ÿØ7Ä>µB¦A›?“<8ˆ6„7€7|8'z81w9:u9Bs9Iq9Pp9Wn9]l9dk9ki9th9~f9‰d9•c:¢b:±a:Ã`;à_;ó_;ÿ_;ÿ_;ÿ_;ÿÑ;ÀB°E¡D•C@½túˆ‡=‚;};y<u=#s=-p=6n=?l=Fk=Mi=Sg=Zf=ad=hc=qa>{_>†^>“\> [?¯Z?ÁZ?ÝY?òY?ÿY?ÿY?ÿY?ÿÌ?¼F«HœG‘FˆD‚@|?w@ s@oA lA*jA3hA;fBCdBJcAPaAW`B^^Be]Bn[BxZB„XBWBžVC­UC¿TCÚTCñTCþTCÿTCÿTCÿÈB¸I§K˜JIƒG}CvCqD mDjEgE'dE0bE8`E?_EG]EM[ETZF[YFcWFlVFvTFSFŽRGœPG«PG½OGÖOGïOGýOGÿOGÿPGÿÄEµM£M•L‰KJxFqGlGhHdHaI$_I-]I5[I=YIDWIJVIQUJYTJaRJiQJtOJNJŒMJ›LKªKK¼JKÓJKîKKýKJÿKJÿKJÿÁH²P O‘O…N{MsIlJgKbL_L\M!ZM*XM2VM:TMASNHRNOPNWON_NNgLNrKN}IN‹HN™GO¨FOºFOÑFOíFNüFNÿGNÿGNÿ½L®RœQQQwPnLgNbO]P ZPWQUQ'SQ0QR8PR?NRFMRMLSUJS]ISeHSoFS{ES‰CS—BS§AS¸ASÏASìARûBRÿBRÿBQÿºOªT˜T‰T}SsSiQbR\SXT TURUOV$NV-LW5KW<JWDHWKGXRFXZDXcCXmAXy@X†>X•=X¥c>=cEg”4™*ž!¢¦© ¬¯²³³ ³´´µ"¶+·5·@¸N¸]¸n¸‚¸—¸ª·¾·Ò·æ·êvˆg‹ZN–Bœ7¢,§"«¯³ ¶¹¼¾¾¿À ÁÂÃÄ Å)Ç4ÈBÉQÉbÉuɊɟʱÊÁÉÑÉÙn“`˜SžF¤:«/°$µ¸¼ ¿ÁÄÈÊÊÌÍÎÐ ÑÓÖÚ(Ý4ÞCßTßgà|à‘à¤à²à¾àÃfŸY¦L­?´2¸$¼¿ÃÇÊÍÑÕØÙÛÝßáã åçêí'ð5ñFòXókó€ô”ô£ô®ô²ÿÿÿÿÿÿ,ÿ9ÿEÿPÿZþcûkùr÷xõ~ô„ò‰ñŽð“î™íŸì¦ê®è¸æÅåÛãíâûâÿáÿáÿáÿáÿÿÿÿ ÿÿÿ(ÿ4þAûL÷Vô_ñfïmìtêzéç…æŠåã•á›à¢ÞªÛ´ÙÀÖÐÓèÒ÷ÑÿÑÿÐÿÐÿÐÿÿ ÿ ÿ ÿÿû"÷/ô;ðGíQéZåbâiàoÞuÜzڀ؅ՋӑїϞͦ˯ɺÇÉÅâÄòÃþÂÿÁÿÂÿÂÿÿÿÿÿ ùñë)ç6ãAßKÛTÕ\ÒcÏjÍpËuÉ{ȀƆŌÓÁš¿¢½«»¶¹Ä·Ú¶í´ú´ÿ´ÿ´ÿ´ÿÿÿÿÿì åÞ"×/Ñ;ÍEÊNÆWÄ^Ád¿j½p¼uº{¹·‡µŽ³•²ž°§®²¬¿ªÑ¨è¨÷§ÿ§ÿ¦ÿ¦ÿÿÿñèáÕÍÇ'Ã3¿>¼H¹Q¶X´_²e°j¯p­v¬|ª‚©‰§‘¥š£¤¡® »žÍæœô›ÿšÿšÿ™ÿÿ ñäÙÎ È Â¼·,³7°B­JªR¨Y¦_¥e£k¢q wŸ~…› Žš —˜ ¡– ¬• º“ Ì’ å öÿŽÿŽÿÿöæÖǾ¹· ± ¬ $¨0¥;¢DŸLS›Zš`˜f—l•r“y’Š”Ÿ‹ªŠ¸ˆˆæ…÷ƒÿƒÿ‚ÿ‚ÿíÜ!Ê%»"±«©¥ œ*™5–>”G’NUŽ[Œa‹g‰mˆt†|…†ƒ›€§~µ}Ç|âzõyÿxÿxÿxÿå"Ð)¿,°*§' #š•‘$Ž/Œ9‰A‡I…PƒV‚\€bi} p| xz y!Œw!—u"¤t"²s#Ãr#ßp$óo$ÿo$ÿn$ÿn$ÿÝ)È0·2¨027{ž.—*“'# Œ#ˆ$„%*‚%4€&=}&D|&Kz&Rx&Xw&^u&et'lr'tq'}o(ˆn(”l(¡k)¯j)Ài*Ûg*ñg+ÿf+ÿf*ÿf*ÿÔ/Â6¯6¡5–40Š-‡*ƒ)*|+%y+/w,8u,@s,Gq,Mp,Tn,Zm,ak-hj-ph-zg.…e.‘d.žb/¬a/½a0Õ`0ï_0ý_0ÿ_0ÿ_0ÿÍ4¼;©:›:8‰5ƒ20{/w0t0!q1+o14m1<k1Cj1Jh2Pg2We2]d2eb2ma3w_3‚^3Ž]4œ[4ªZ5»Z5ÒY5íY5üX5ÿX5ÿY5ÿÈ8·>¤>–=‹<ƒ:}7x4t4 p5m5j5'h60f68d6?c6Fa6M`6S^7Z]7b\7jZ8tY8W8ŒV9™U9¨T9¹S:ÏS:ëS:ûS:ÿS9ÿS9ÿÄ<²A @’@†?~=x:s8n9j9g9d:$b:,`:4^:<];C[;JZ;PX;WW;_V·N>ÍN>éM>úN>ÿN=ÿN=ÿÀ?®CœCŽC‚Bz@s=m<h=d=a>^>!\>)Z>1X>9W>@U?FT?MS?UR@\P@eO@oNAzMA‡KA–JA¥IBµIBËIBèIBùIAÿIAÿIAÿ½CªE˜EŠEEvCo@h@cA_A \AYBWB&UB.SB6QB=OBCOCKNCRMDZLDcJDmIExHE…GE”EE£EF´DFÉDFçDEøDEÿEEÿEEÿºF¦H”H†H{GrFjBcC^DZE VETFQF#OF+NF3LG:KGAJGIIHPHHXGHaFIkDIvCIƒBI’AI¢@I³?JÇ?Jå?I÷@Iÿ@Hÿ@Hÿ¶I¢J‘JƒJwJnIeE^GYHUIQJOJLJ!JK)IK1GK8FL?ELFDLNCMVBM_AMh@Mt>M=MQS=R\U+=V24\F3]N1]W0]a/]l.]z,]‰+]š*]«*]¿)]Þ*\ò*[þ+[ÿ+Zÿ£UUUrUgV^VTWLYE[?]:_6` 4a2b1b#0b+/c2.c:-cB,cJ*dS)d](di'dv&d†%d—$d©#d½"dÚ#cñ#bý$aÿ$aÿœX‰XzYnYcYZZP\H^A`:c4f/h ,i*i)j(j&'j.&k5%k=$kF#kO"lY lelrl‚l”l¦kºkÔjîiühÿhÿ•\ƒ\u\i]_]V^LaCdk7n0q)u"x{}}}~"~*~1~:~DNZh x Š ~ ~° }Æ }ä |ô {ý zÿ†ewejeafVhLkBo9s1w*z#~„‡ ‰ ‰ ‰ ‰# ‰+ ‰3‰=‰H‰T‰a‰q‰ƒ‰–ˆ©‡¾‡Ú†ì†õ†ú~jqjgk[lPpFtíQîeïzïðŸð«ð³ÿÿÿÿÿÿ)ÿ5ÿAÿMþVû_øfömôtòyñð„î‰íë•ê›è¢æªå³ãÀáÒàêßùÝÿÝÿÝÿÞÿÞÿÿ ÿ ÿ ÿÿÿ$þ1û=øHôRðZíbëiéoçuåzãâ…àŠÞÜ–ÚØ¥Õ¯ÒºÐÊÎãÍôËÿËÿËÿËÿËÿÿÿÿÿ ü÷ò+ï7ëBçLäUà]ÝdÚjØpÕuÒzЀυ͋˒əǡŪõÁÿھî½ü¼ÿ¼ÿ¼ÿ¼ÿÿÿÿùñêä%ß1Û<×GÒPÎWË^ÉeÆjÅpÃuÁzÀ€¾†¼º”¹œ·¥µ°³½±Ï¯è®ø®ÿ­ÿ­ÿ­ÿÿÿýîã ÚÑÌ+È6Å@ÂJ¿R¼Yº_¸e¶j´o³u±z°®ˆ­«˜©¡§«¥¸£È¢â¡ó þ ÿ ÿ ÿÿöêàÓɽ$¹/¶:´C±L®S¬Yª_©d§j¦o¤u£{¡‚ Šž“œš§˜´–Õܔï“û“ÿ“ÿ’ÿùê Ü Ë Â¼ ¶±®(ª3§=¤E¢M SžYœ_›dšj˜p—v•~“†’™Ž¤Œ±‹À‰Öˆíˆú‡ÿ†ÿ†ÿïÞú4ŽÊ¼³® « §¢ Ÿ,œ6™?— G• N“ T‘ Z _Ž e k‹ rŠ yˆ ‚‡ Œ… —ƒ ¢ °€ À Ø}ï|ý{ÿ{ÿ{ÿæÑ½¯¦¡ž ˜”%‘/9ŒAŠHˆO‡U…[„a‚g€nu}~|ˆz”x w®u¾tÕsîqýqÿqÿpÿÜÆ%³%¥#œ!–’‘ ‰†)ƒ3<€C~J|PzVy\wbvitqszq„onl«k»jÐiìhûhÿgÿgÿÑ&½*«**“(%ˆ"†ƒ|$z.w6v>tErKqQoXn^lek mi vh!f!e"šc"¨b#¸a#Í`$é`$ú_$ÿ_$ÿ_$ÿÊ,¶/¤/–/Œ-…*€(}$z" v#s# q$)o$2m$:k%Aj%Gh%Mf%Te%Zd&ab&ia&r_'}^'Š](—[)¥Z)µZ*ÊY*çX*øX*ÿX*ÿX*ÿÅ1¯3ž33†2/y-u*r( o(k)i)%g*-e*5c*=b*C`*J_+P^+W\+^[,fY,oX-zW-‡V.•T.£S/³S/ÇR/åR/÷R/ÿR/ÿR/ÿÁ6ª6™6‹65y3s1o/k.h-d.b.!`/*^/1\/9[/@Y/FX/MW0SV0[T1cS1lR2wQ2„O3’N3¡M3±M4ÅL4ãL4öL4ÿL4ÿL3ÿ»9¦9•9‡9|9t7n4i3e2a2 ^2\3Z3&X3.V35U4<S4CR4JQ4PP5XN5`M6jL6uK7‚J7I8ŸH8°G8ÃG8áG8õG8ÿG8ÿG8ÿ·;¢<‘<ƒ<x<p:j7d6`6\6 Y7V7T7#R7+P72O89M8@L8GK8NJ9UI9^H:hG:sF;€E;ŽD<žC<®B<ÂB=ßB<óB<ÿB<ÿB;ÿ³=ž>>>u>l=f:`9[:W:S;Q;N; L;(K;/I<6G<=G\C>fB?qA?~@??@œ>@­=@À=@Ý=@ò=@ÿ>?ÿ>?ÿ®@š@‰A|AqAh@a<[=V>R>N?L?I?G@%F@,D@3C@:BABAAI@AQ?BZ>Bc=CoE8=E?*VF)VO(WY'Wd&Wr%W$W’#W¤"W·"WÏ"Wì#Vú#Uÿ$Uÿ–M„NuNiN_OVOMPER?S9V3X/Z+[*[(\'\$&\+%\3$]:#]C"]L!]V ^a^n^~^^¡^´]Ì]é\ù[ÿ[ÿQ~QpQdR[RRSJTAW;Y5[.^(`$b "c!cd d'd.d6e>eGeQe]ejeze‹eže±eÈdçc÷bÿbÿ‰TxUkU`VWVOWFY=\6_0b)d#gjllmm!m)m0m9nBnLnXnenu n‡ nš m­ m là kó ký jÿ‚YrYfY\ZTZJ\A_9c1f*i$loru www w# w* w3 w< wGwRw_wow€w”v§v»uÕtëtötü{]m]b^Y^N`Ec¬M¬]¬p¬…¬›«¯«Ã«ÙªèduWyK~?„4Š)–›Ÿ £§ª®°°±²´µ ¶·¹»&¼3½A½R½d¾y¾½¤½·½Æ½×\P…D‹8’,™!Ÿ¤© ®²¶¹½¿¿ÀÁÃÄÆ ÇÉËÎ&Ð5ÑEÒWÒkÓ‚Ó—Ó©Ò¸ÒÄUŒI“=š0¢%¨®´ ¹½ÁÄÈËÍÍÏÐÒÔØÚÝ àãæ'ç8èJé]êrëˆë›ì¨ì²ÿ ÿ ÿ ÿÿÿ&ÿ2ÿ=ÿHûRøZöbóiñoðuîzìë„éŠèæ–äâ¥á¯ß»ÝËÛæÙ÷ØÿØÿ×ÿ×ÿÔÿÿÿÿÿ ÿþ!ú,÷8ôCðMíUê]çdäjâpàuÞzÝۅًՑәѠϪ͵ËÄÉÝÈñÇÿÆÿÆÿÆÿÇÿÿÿÿÿ øñì'é2æ=âGÝPÙXÕ_ÒeÐjÎpÌuÊzÉDžŌÔÁœ¿¥½°»½ºÐ¸ë·û¶ÿ¶ÿ¶ÿ¶ÿÿÿýóéáÛ!Õ-Ñ7ÎAÊJÇRÄYÂ_Àe¾j¼o»t¹z·€¶‡´Ž²—° ®ª­·«È©ã¨õ§ÿ§ÿ§ÿ¦ÿ¹¶¸Cÿþñå× ÍÇÂ&¿1¼;ºD·L´S²Y±_¯d­i¬oªt©z§¦‰¤‘¢› ¥ž²Á›Úšï™ý˜ÿ˜ÿ˜ÿýðáÑÆ½ ·³ °+­5«>¨F¦M¤T£Y¡_ džin›uš{˜ƒ–Œ•–“¡‘­»ÏŒé‹øŒÿŒÿŒÿóâÌ¿·±«§¤$ .ž7œ@šG˜N–T•Y“^’diov‹~Šˆˆ’†…©ƒ¸Ê€å€õÿÿÿè о±¨ £  œ˜•'’19ŽAŒHŠN‰T‡Y†_„dƒkr€z~„}Ž{šy§xµvÈuãu ôt ÿs ÿs ÿÝı¥œ–” “ Ž‹ ˆ *… 3ƒ ; B€ I~ O} T{ Zz `x gw nu vt €r Œp ™o¦mµlÉkæj÷iÿiÿiÿй¨›’‹ˆ‡…~${-y6w=vDtJsPqVp\nbmjksi}h‰f–e£c³bÆbãaö`ÿ`ÿ`ÿÇ"°#Ÿ$’#‰"‚ ~|z wtq(o0n8l?kEiKhQfXe^cfbo`y_…]’\¡[°ZÃYàXôXÿXÿXÿ¿'©(™(‹(‚'{%v#s q nki#g,e3c:bA`G_M^T\[[bY kX vV!‚U!T"žS"®R#ÀQ#ÝQ$òQ$ÿQ$ÿQ#ÿ¹+£,“,†-|,t*o(k%i"f!c"a"_#']#/\#6Z#=Y$CW$JV$PU$WS%_R%hQ&sO&N'M(œL(¬K)¾K)ÚJ)ñJ)ÿK)ÿK)ÿ³.ž/Ž00w/o.j+e*c'_' \'Z'X($V(+U(2S(9R)@P)FO)MN)TM*\L*eJ+pI+|H,‹G-šF-ªE.¼E.ÖE.ïE.þE.ÿE-ÿ®1š2‰3|3r3k1e/`-],Y, V,T,R, P,(N-/M-6L-<J-CI-JH.QG.YF/cE0mC0zB1‰A1˜A2¨@2»?2Ó?2î@2ý@2ÿ@2ÿª3–5†5y6n5f5a2\0W0T0Q0N0L1J1%H1,G12F19D1@C2GB2OA3W@3`?4k>5x=5‡<6–;6§;6¹:6Ñ:6í;6ü;6ÿ;6ÿ¦6’7‚8u8k8c7]6W3S4O4K4 I4F5E5"C5)A5/@56?6=>6D=7L<7U;8^:8i99v89…7:•7:¥6:¸5:Ï6:ì6:û69ÿ79ÿ¢8Ž9~:r;h;_:Y9S6N7J8F8 D9A9?9>9&<9-;:4::;9;B8;J7;S6<\5“2>¤1>¶1>Í1>ê1>ú2=ÿ2=ÿž;‹<{<n=d=\=U<N:I;E<A=>=<=:>9>#7>*6?15?84?@3@H2@P1@Z0Ae/Ar.B-B‘-B¢,Bµ+BË,Bé,Bù-Aÿ-Aÿ™=‡>w?k?a@Y?R?I>D?@@K9L3N.P(S$T "U UVV$V,V3W;WDWNWYXfXuX‡XšW¬WÂWáVôUÿUÿ„ItJfK\KSKKLDM[6_.b&fjmps vx xyyyz&z/z9zDzPz_zpzƒz˜z¬yÂxßxïw÷j[_[V[L\B`9c0h(l ptw{ ~‚ƒ ƒ„…† †(‡1‡<‡I‡W‡h‡{‡†¥…º…Ó„ê„ôe`\`QaFdÌPÌdÍz͑ͤʹÍÀMƒAŠ5‘)™ ¦ ¬±¶º¾ÂÆÈÈÊËÍÎÐÒÕÙÝá!â1äCåVækæ‚ç–ç¥æ°ÿ ÿÿÿÿÿ!ÿ-ÿ8ýCùMõUò]ðcîiìoêtézçæ…ä‹ã‘á™ß¡ÜªÚ¶×ÆÕáÓôÒÿÑÿÑÿSdñÏÿÊÿÿÿÿÿ ÿúö(ó3ð>ìHèPåXâ^ßdÝjÛoÙtÖzÔ҅ЌΓ̜ɥǰƾÄÔÂîÁþÀÿÀÿ¿ÿ¾ÿÿÿÿúñëæ#â.à8ÛBÕKÑRÎYË_ÉeÇjÆoÄtÂzÁ€¿†½Ž»–¹ ·ª¶·´Ê²æ±ø°ÿ¯ÿ¯ÿ°ÿÿÿ÷êá ×ÐÌ(É2Æ<ÂE¿M¼SºY¸_·dµi´n²t±z¯€­ˆ¬‘ªš¨¥¦±¤Á£Ü¡ò¡ÿ ÿ ÿ¡ÿÿ÷èÙËý¹"¶,´6²?¯G¬M«T©Y§^¦c¥h£n¢t zž‚œ‹›•™Ÿ˜¬–º”Ï“ë’û’ÿ’ÿ‘ÿ÷çÓÆ»³ ­ª§&¤0£8 @žGœNšS™X—]–c•h“n’t|…‹šŠ§ˆµ†Ç…ä„õ„ÿƒÿƒÿìÓÁ´¬¦ š —)•2“:‘AHMŒS‹X‰]ˆc‡i…oƒw‚€€Š~–}£{°zÂyÝxñwýxÿxÿÞ Ä ² ¦ ™• ‘Ž‹#‰,‡4…;ƒB‚H€NS}X|^{dyjxrv{t†s’qŸp­n¾mÖmílúlÿlÿη¦š‘‹‰ ‡ „~%|.z6x<wCuHtNsTqYp_nfmnkxjƒhg e ¬d ¼c Ôc ìb úb ÿb ÿí‡}|| x u r (p 0o 7m >l Dk Ji Oh Ug \e cckbu`_Ž]œ\«[½ZÖYðYýYÿYÿ¹¥”ˆ~xtqq oli"g*f2d9c?bE`K_Q]X\_ZhYrW}V‹T™S©RºQÒQíQýQÿQÿ² ž"Ž"#w"p!ligfca_&]-\4Z;YAXGVMUTS\RdQnOzNˆM—K¦J¸JÏIëIûIÿJÿ¬$˜%ˆ&{'q&j%f#b!`^ [YW"U)T0S7Q=PCOJMQLXKaIkH wG …F!”D"¤D"¶C"ÌC#éC#úC#ÿC"ÿ¦'“)ƒ*v*m*e)`'\%Y#W!U!R!P!N!%M",L"3J"9I"@H"FG#ME#UD$^C$iB%u@&ƒ?&’>'£>'´='Ê=(è=(ù='ÿ>'ÿ¢*Ž+-r-h-a,\+X(T&Q&N% L%J&H&"G&)E&/D&6C'<A'C@'K?(S>)\=)f<*r;*:+9+¡8,²7,È7,æ8,ø8,ÿ8,ÿ,Š.{/o0e0]/X.S+P*L*I* F*D*B*A*%?*,>+3=+9<+@;,H:,P9-Y8.d7.p6/5/40Ÿ30±20Ç20å30÷30ÿ4/ÿ™/‡1w2k2b2Z2T1O/K-G.D.A.?.=.;."9/)8//7/660>50F51N41W32b22n13}03/4ž.4°-4Å-4ã.4ö/3ÿ/3ÿ•1ƒ3t4h5^5W4Q4K2F1B2?2<2 938363 43&33-24414;05C05L/6U.6`-7l,7{+7‹*8œ)8®(8Ã(8â)8õ*7ÿ*7ÿ’45q6e7[7T7M6G6B5=6:677 472718/8$.8+-92,99+9A*:I*:S);^(;j';y&<‰%<›$<­#<Â#<à$<ô%;ÿ%;ÿ6|8m9b9X:Q9J9D9=99:5;2;/<-=,=*=!)=((>/'>6&>>%?G$?P#@["@h!@v @‡A™A«AÀAÞ@ó@þ ?ÿ‰9x:i;^<U<M<G<@<8=4>0@-A*B 'B&C$C#C%"C,!D3 D;DDENEYEeEtE…F—F©F¾EÜEñDýDÿ„<s=f>[?R?J?D?=@6A1C,D'F$G !H III"I)J0J8JAJKKUKbKqK‚K”K§K¼KÙJðJüIÿ?o@aAWBNBGBAB:C2E-G(I#KMO PPPP%P,Q4Q=QGQRQ_RmR~ Q‘ Q¤ Q¸ QÑ Pì PúOÿyCjD]DSEKEDE>F6H/J)L$OQSV WXXX X( X0 X9 XC XN XZXhXyXŒXŸX³WÊWæWóVüsFdGYHPHHHAI:J2M+P%R UXZ] ` ` ```#`+`4`=`I`U`c`s`†_š_®_Ä^â^ð^ølJ_KUKLLEL=N5P.S'V Y\_b eg ghhhi&i.i8iCiOi]imi€i”h©h¿gÜfîf÷fOZOQOJOAQ8T0W([!^beh knp p qqrs!s(s1s<tHsVsfsysŽs£r¹qÒqëpôaSVSOSEU;X2\*`"dhlo rvyzz {|}~"€*€5€A€O€_€q€†€²~Ê~å}ñ\XTXIZ?]5a,e#josw {‚„††ˆ ‰ Š‹ŒŽ",8FVh~•Ž«ÁÜŒëY]N_Cb8f.l$qw|…‰’“”–—˜ š›Ÿ# . < L ^ tŸŒŸ¢Ÿ·žËžàSdGhd™²˜±¬²¿±ÎLn@s5z*ˆŽ•šŸ¤¨¬¯±±³µ¶¸º¼¾ ÀÃÅ&Å7ÆIÆ]ÇrNJȟȯȼFz9.‰"˜Ÿ¥ª¯³·¼¿ÁÂÄÅÇÉËÍÏÒ ÖÜÝ*Þ<ßPàeá{á‘â¢â­ÿÿÿÿ ÿÿÿ(þ3û>÷HóPðWí^ëdèiçoåtãyâà…ތܓٜ֦ӱÑÀÏÚÎñÌÿËÿËÿÆÿÁÿÿÿÿÿûöò$ï.í9èBãKàRÝYÙ_ÖdÓiÑnÏtÎyÌʆȎƖĠ«À¹¾Í¼ê»üºÿºÿºÿ¶ÿÿÿþôë äßÛ)Ø3Ó=ÎEÊMÇSÅYÃ_Ád¿i½n»sºy¸€¶ˆ´²š±¥¯²­Ä¬á«öªÿªÿªÿªÿÿýîâÕ ÍÇÄ#Á-¿7»?·GµN²S°Y¯^­c¬h«m©s¨z¦¤Š£”¡ŸŸ¬ž»œÒ›îšÿšÿ™ÿ™ÿþîÞËÁ¹ ´±®'«0ª9§A¤H¢M¡SŸXž]b›gšm˜s—{•„”Ž’™¦Ž´ÈŒæ‹ùŠÿŠÿ‹ÿðÛǺ°¨ ¤ !›*š3˜;–A”H’M‘RWŽ\Œa‹gŠnˆu‡~…ˆƒ”‚ €¯À~Ý}ò}ÿ}ÿ}ÿàÆµª¢›• ’$‹-Š4ˆ;†B…GƒM‚RW\~b}h{pzyxƒvuœtªrºqÑpìpûpÿpÿÍ·§›“ŽŠ†„'}.|6z<yBwGvLuRsWr]qcokntl~kŠi˜h¦g¶fËeçe÷eÿeÿÀ « ›† ~| ywu!s)q0o6n<lBkGjMiRhXf_egcpbz`‡_•^£\³\Ç[ä[ô[þ[ÿµ¡‘…|vsr q nli#g*f1d7c=bCaI_N^U]\[ cZ mX xW …V “T ¢S ³R ÇR äQ õQ ÿQ ÿ­™‰}tmjggf c a _ %] ,\ 3[ 9Z ?X EW KVQUYSaRkPvNƒM’L¢K²JÈIåI÷IÿIÿ¥’ƒvmfb_^^ [YW U'T.S4Q;PAOGNNLUK^IgHsF€EDŸC°BÅBãBöBÿBÿŸŒ }!q"h"a!\YWUTQON#L*K0J7I=GCFJERCZBdAp?}>=<®;Ã;á;õ;ÿ<ÿš!‡#x$l%c%\$W#S QOM KHG E&D-C3B9@@?G>O=X<b:m9{8 ‹7!›6!­5!Á5!ß5!ó6!ÿ6!ÿ–#ƒ&t'h(_(X'S&O$L"I G DB@ ? #> )< /;!6:!=9!D8"L7"U6#_4#k3$y2%‰1%š0%«0&¿/&Ü0&ò0&ÿ1%ÿ‘&(q*e*\*U*O)K(H%D$A$?$ =$;$9$7$&6$,5%34%:3&A2&J1'S0']/(i.)w-)‡,)˜+*ª**½**Ú+*ñ+*þ,)ÿ(|*m,b-Y-Q-L,G+C(?(<(9( 7(5(3(2(#0()/)0/*7.*?-+G,+Q+,[*,g)-u(-…'-—&.¨%.¼%.Ø&.ð&.ý'-ÿŠ+x-j._/V/N/H.C-?,;,7,4, 2,0-.--- +-'*.-*.5)/=(/E'0N&0Y%1e$1s#1ƒ"2•!2§!2» 2Ô!2ï"1ü"1ÿ†-u/g0\1S1K1E1@0;0603001-1 +1)2(2'2$%3+%32$3:#4C"4L!5W 5c5q66“6¥6¹6Ò6í6û5ÿ‚0q2c3Y4P4I4B3=37314.5+5(6 %7$7"7!8" 8(80879@9I:T:`:n:;‘;¤;·;Ð:ì:ú9ÿ}2m4`5U6M6F6@6:646.8*9&:#; <===>%>->4>=?G?Q?^?l@|@@¢@¶@Î?ë?ù>ÿy5i7\8R9J9C9=9791:+<'="?AB CCDD"D)D1D:ECENE[EiEy EŒ EŸ E² EÉ Eå Dö Dÿt9e:X;O;G<@<:<4<.>(@#BDFHJ JJKK% K- K6 K@ KJ KV KdKtK‡KšK®JÄJàJðIún<`=T>K>D>=>7?1@*B$EGILNQ Q Q QQ"Q)Q2R;RFRRR_RoRQ–Q©Q¿PÜPîP÷h@[APAHAAA;B4C-E&H KMPSU X XXYYY%Y-Y6YAYMZZZiY|YY¥XºXÕWìWöcDVEMEEE?E7G/I(L"ORUX Z ]_ ` `aab b'b1b;bGbUcdbvb‹b a¶aÏ`ê`õ]HRIJHCH:J2M*P#SWZ] `cfgh ijklm"m*m4m@mNm]mom„lšl°kÈkæjóXMNMHL>N5Q,T$X\`d gknprrs uvwxy#z-z9zGzVyhð $Sz|y”xªxÁwßwïTQLQBR8U/Y&^bgk oswz|~€ ƒ „†ˆ‰%Š0Š>‰M‰_‰sˆ‹ˆ¢‡¹‡Ñ†èRVGWr2x'€ˆ —£¨­²¶¹»¼¾ÀÂÄÆÈËÎÑ Ö×#Ø5ÙIÚ^Ûuیܟܫÿÿÿÿ ÿÿþ$ü/ù9ôCðKíRêYç_ädâiànÞsÜyÚ׆Ԏіϡ̬ʻÈÒÆîÆÿÅÿÅÿ¿ÿºÿÿÿÿþ÷òîë*é4ã=ÞEÙMÔSÑYÎ^ÌcÊhÉmÇsÅyÀÁˆ¿½›»¦¹´·È¶æµû´ÿ´ÿ³ÿ®ÿÿÿøíå Ý×Ò$Ï.Ë7Ç@ÃGÀN¾S¼Yº^¸c¶hµm³s±y¯­Š«”© ¨­¦¾¥Û¤ô¤ÿ£ÿ£ÿ¢ÿÿöæ×Ëľ»¹(·1´:°A­H«N©S§X¦\¤a£g¡l sžzƒ›Ž™™—¦–¶•Ì”ë“ý“ÿ“ÿ“ÿ÷äÐÁ·¯ «§¥"£+¢3Ÿ;œB›H™M—R–W•[“a’fmt}Œ‡Š“ˆ ‡¯…Â…â„÷„ÿ„ÿ„ÿåͼ¯¦žš–”’%‘-5<ŒBŠGˆL‡Q†V„[ƒ`g€n~w}{zšx©wºvÓvïvþuÿuÿл«Ÿ—‹ ˆ†„ ‚'/5}<|A{FyKxPwUv[tasiqqp{n‡m•k£j´jÉièiùiÿiÿÀ¬œˆƒ{ ywv"t)s0q6p<oAmFlKkPjVh\gdeldvc‚a`Ÿ_¯^Ã^á^ô]ÿ]ÿ´  „ | wtq omki#h*g1e6d<cAbF`L_R^X]_[hZrX~WŒV›U«T¾TÚSïTûTÿ© –‡zrli g f db`^%]+\1Z7Y<XBWGVNUTS\ReQoO{NŠM™L©K¼JÔJíJùJÿ¡Ž~sjd`^] ] ZXV U'S-R3Q8P>O DN JL QK YJ bH mG zF ˆD ˜C ©B ¼B ÕB îB ûB ÿš‡xlc]YVTTS Q O M "L (K .J 4I :GAFGEODWBaAl?y>ˆ=˜;©;¼:Ö:ð:ý;ÿ“sg^XSPNLL JHFE$D*B0A7@=?D=L<T;^9i8v7…6–4§4º3Ó3î4ü4ÿŽ|nc Z S NJHFECA?> =';-:39:8A7I5Q4[3f2s0ƒ/”.¥-¸-Ð-ì.û.ÿŠx j"_#V#O"J!F CA?= ;976#5)40361>0F/O.Y-d,q+*’)¤( ·' Î' ë( ú)ÿ† t#g$\%S%L%G$B#?!=:7 5310 /&.--3, ;+ C*!L)!V("b&"o%#$###¢"$µ"$Ì"$é#$ù$#ÿ‚#q%c&Y'P(I'C'?&;$8"5"2"0" .","*")"#(#*'#1&$8%%A$%J#&T"&`!'m '}'(¡(´(Ê(è(ø'ÿ~%n'`)V)M*F*A)<(7'4&0&-&+' ('''%'$'!#('"(.!)6 )>*H*R+^+k+{,,Ÿ,²,É,ç+÷+ÿz'j*]+S,J,C,>+9+4*0*+*)+&+#,", ,,-%-,-3.<.E/P/\/i0y0‹0ž0±0Ç0å0ö/ÿv*g,Z-P.H.A.;.6-1-,-'/$/!01 1222"2)31393C4M4Y4g5w5‰5œ5°5Æ4ä4õ4ÿr,c.W0M0E0>08030/0)1$2!356 77888&8.969@9K9W:d :t :† :™ 9¬ 9Á 9Þ 9ñ 8ün/_1S2J3B3;36312,3'4!689;= >>>># >* >3 >< ?G ?R?`?o??”?¨>¼>×>ì>÷i3[4P5G5?59545.5)7#8;<?AC D D DD D'D/D8EBENE[EjE|ED¤D¹DÑDêCõd6W7L8C8<87818+9%; =@BDG I J KKKK#K+K4K>LILWLfLwKŒK¡KµJÎJéJõ_:R;H;@;:;4;.<'>"ACFIK NPQ QRSSS&S/S9SESR ôW^SaSrS‡RœR±QÊQçQôY>N>E>>>8>0@)B#DGJMP SUWX YZZ[\!\*\4\?\M\[\l\[—[­ZÅZäYóTBJBBB^2c'jpx …‹‘–›Ÿ¢¤¥§©«­°²µ· »¾¾&¾8¾K½a¼z»”º©º¹7j+p x€ ˆ–œ¢§¬°³¶·¹»½¿ÂÅÈÊÎÒÕÕ,Ô@ÔWÓnÔ†Ô›Ó«ÿÿÿÿÿÿü ù*ö4ñ=íFéMæSäYá^ÞcÜhÙnÕsÓyЀΈˑɜƧķÂÌÀì¿ÿ¾ÿ½ÿ·ÿ²ÿÿÿÿúó íèå%ä.ß8Ø@ÒGÎNËTÈYÆ^ÄcÂgÀm¿s½z»¹‹¶•´¡²¯°Â®ã®ú¬ÿ­ÿ©ÿ¦ÿÿÿòæÝÒÍÊ È)Å2À:¼B¹H·NµS³X±]°b®g¬lªs©{§„¥Ž£š¡¨Ÿ¹žÒòœÿÿœÿ™ÿüîÝÌÁº ¶²°#¯,­4©<¦B¤H¢M RžW[œ`šf™l—t•}“‡‘“¡Ž±ÆŒè‹ýŒÿŒÿŒÿíØÅ·¬¦¡Ÿ›&š.—5•<“B‘GLŽQU‹ZŠ`‰f‡m…v„€‚Œ€š©}¼|Ü|õ|ÿ|ÿ|ÿÙÁ±¤œ” ‹‰ ‰(‡/…6ƒ<‚A€FK}O|T{Zy`xgvpuzs†q“p¢o´nÌnínþnÿnÿį ”Œ†~|{y"x)w0u6t;r@qEpJoOmTl[kbijhtf€eŽcb­aÂaäaøaÿaÿ´ ‘†~yuq omlk$k*i0h6f;e@dEcJaO`V_]]e\oZzYˆX˜W¨V»VØVñVÿVÿ¨”…zrligd ca`_%^+]0[6Z;Y@XEWKVQUXSaRjPvO„N“M¤L¶LÍLëLúLÿ ‹ | p h b _ ]\ ZXWV U&S+R1Q6P;OANGMMKUJ]IgGsF€ED¡C²CÈCæCõCÿ• ƒti`ZVT S S QONL!K'J,I2H7G=ECDJCQBZ@d?p>~=Ž<Ÿ;±:Æ:ã:ó:üŽ|nbZTPMKK J IGED#B(A .@ 3? 9> @= G< O: X9 c8 o6 ~5 Ž4 Ÿ3 ±2 Ç2 ã2 ô2 þˆwi^UOJGECCB @ ? = < $; *9 0877=6E5M3W2b1n/}.Ž- ,²+È+æ+ö,ÿƒrdYQKFB?><; :875!4'3-230:/B.K-T+_*l){(Œ'ž&°%Æ%ä%ö&ÿ~n`VMGB>:8754 20/-#,*+0*7)?(H'R&]$j#y"Š!œ ¯Äâ ô ÿzj]S J D >:7420. ,*)' &&%-$5#="F!P [hwˆ›­Ãàóÿwg Z!P"H"A";"7!3 0-+(&%#!!$ *2:C M!Y!f!u"‡"™"¬"Á"ß!ò!þs d"W#M$E%>$9$4#0",")!&!$!"! !!""!"(#/#8$A$K%W%d&s&…&˜&«&À&Ý%ñ%ýp"a$T&J&B'<&6&1%-%)$&$"%%& &''''%(-(5)>)I)U*b*q*ƒ*–*© *½ *× *î)ûl$]&Q(H(@)9(4(/(+'''"()*++ ,,,-#-*-2.<.F .R ._ /n / /’ /¥ .¹.Ð .é .÷h'Z)N*E+=+7+1*-*)*$* +-./1 222 2 2' 2/ 38 3B 3N3[4j4{3Ž3¢3¶3Í3ç2ód*V,K-B-:-4-/,+,&,"-/1246 8 8 888$8,848>ÕÅ…–9J9W9e9w9‹8Ÿ8³8Ê8æ7ò_-R.H/?08/2/-/)/$013579 ;= >>>>!>(>1?;?F?S?a?s?‡>œ>°=Ç=ä=òZ0N2D2<25201+1&2 468;= ?AC CDEEE$E-F6FBFNF]FnE‚E˜D­DÄCãCòU4J5A59534.4(5"7:<?A DFHI J KLMN N(N2M=NJNXMiM}L”LªKÁKáJòP8F8=87817*9$;=@CF IKNPQR STUVW#W,W8WDWRVcVwVŽU¥T½SÝSðK<B<;;5;-<&?BEHK OQTWXZ[\ ]_`bb&b1b>aLa]ap`ˆ` _·^Ô]îG@??:?1@)C!FJNQ UX[^acdegh jlno o*o6nEnUnhmm˜l°kÊjèDD>C5D+G#KOTX\`dgkmoprtuw y|~".=~M}a}w|{¨zÀyßCG9I/L%PU[`ejnrvy|~ƒ…‡ŠŒ ’’%’3’D‘Wm†ŽŸµŒÍ=N2Q(V\bhnty~‚†‰ŒŽ’”–˜›ž¡ ¤¦¦)¦:¥M¥b¤{£”¡«¡¿6W,\!bipw~„Š”˜›žŸ¢¤¦¨«­°³· »»»0»CºX¹p·‹·¡·³0b%ipx €ˆ–›¡¦ª®°±´¶¸»½ÀÃÇËÏ ÓÒ%Ò8ÑNÐeÏ~Í–Ì©ÿÿÿÿÿ üù÷%ó/î8é@æHâNßTÜYÙ^ÕcÓhÐmÎsËzȂƌ×À£¾²¼Èºê¹ÿ¸ÿ±ÿªÿ§ÿÿÿûöíçâß Þ)Ù3Ñ;ÌBÈHÅNÂSÀX¾]¼bºg¹m·tµ{²…°®œ¬ª©½§Þ¦ù¥ÿ£ÿÿ›ÿýöëßÑÊ ÅÃÀ$¾,¹5¶<³C°H®N¬R«W©\§a¦g¤m¢t }žˆœ•š£˜´–Í•ñ”ÿ•ÿÿŽÿóæÑ¸±­ª¨¨'¦/¢6Ÿ<B›G™L—Q–U”Z“`‘fnŽvŒŠˆ›†¬…Á„æƒý„ÿƒÿÿä˺¬¢œ˜ –”“!’(06‹<‰AˆF†K…O„T‚Z`g~o|zz†x”w¤u·tÔsôtÿtÿtÿ˶¦š’Іƒ€#*}0{6z;x@wEuItNsTqZpanimskihg®fÇeêfÿfÿgÿ¸¤•Š|vt rqpp$n*m0k5j:i?hDgIeNdTc[ac`m^y]‡[–Z¨Y½YßYøZÿZÿ¨•‡{snjgedccb%a*_0^5]:\>[DYIXOWVV^ThSsQP‘O¢NµNÐNðNÿOÿœ‰{phb_][ YXWW V%U*S0R4Q9P?ODNKMRKZJcIoG|FŒEE°DÇDèDúEÿ’€q f ^ Y UTRP ONML K&J+I0H5G:F@EFCNBVA_@k>x=ˆ<™<«<Á;à;ô;ÿ‰ x j_WQM K JI H FEDC!B&A+?1>6=<<C;J:R9\8h6u5…4–4¨3¼3Ø3ï3û‚ qdYQKGDB A A ?><;:"9(8-72695?4G3P1Z0f/s.ƒ-•,§+º+Ò+ë+÷}l_TLFB><:: : 8 654 2 $1 )0 // 6. =- E, N+ Y) e( s' ƒ& •% §$ »# Ò# ë# ÷xh[QHB=975332 0 / - , !+ '* -)4(;'D%N$Y#e!s „–©½ØîùsdWME?:520.-, +)(&%$$*#1"9!B KVcq‚•§»Ôîúp`TJB<62/,*(&% #" !'.6?ITap“¦ºÒìúl]QG?94/+(&$"  $,4=GR_n’¥¹ÐêøiZNE= 61-)%#  ")1:EP ] l | ¢ µ Ê å ôeWL!B!:!4!/!* &#    !!"""&#/c—c#7 #A $M $Y $g $x$‹$ž$±$Ç#ã#ñbT!I#@#8#2#,#("$!!!!!#$%& ' ' ' '# '+ (4(>(I(U)d)t)‡)›(¯(Å(á'ð^"Q$F%=%5%/%*$&$"##$%&() , ,,,,!,(-0-:-E-R.`.q-„-™-­,Â,à,ðZ$M&C':'3'-'(&$&!&&')+, . 0 11222%2-263B3N3]3m32–2«1Á1ß1ðV'J)?*7*0*+)'(#()*,.0 1 45 67888"8*939>9J9Y9i9}8“8¨7¿7Þ6ðQ+F,<,4,.,*+%+ ,-/13 5 7:; < =>?@@%@/@:@F@T@e?x?>¦>½=Ü=ðM.B/9/2/-.(."/0257 : <>ABC D FGHH!H*H5HAHOH`GsGŠF¢E¹EÙDðH2>26201+1%2469< ?BDFHJKL NOQRR%R0R<QJQZQmP„ONµMÒMîC6;645/4'5!8;>A DGJMOQSTUW Y[]]]*]6\D\T[g[~Z—Y¯XËWê?98938+9#<?CG JNQTWZ\]_`bd fhkk#j.j<jMi_hugf¨eÂdã==7<.=%@DIM QUZ]`cfhjkmoqt vy{{'z5yExYxmw†vŸu·tÒ_C^H]N[UZ]XgWrUT‘S£R¸QÜQùRÿRÿ‹|qid`^\ [[ZZY%W*V/U4T8S=RCPIOPNXMbKmJzI‹HG±GÌFðGÿGÿ~pf^YVSRP OONN M%L*J.I3H8G>FDEKDSC]Ah@u?…>—=«=Ã=æ=û>ÿ‡uh]UPLJIG FEEDC B%A*@/?4>:=@;G:O9Y8d7q65“4¦4»4Ý4õ5ÿ~m ` V N H D B@?> =<;;:!9%7*60554<3C2L1U0`/m.}-,¢,¶,Ð,î,üw g ZPIC> ; 9 8 76 54321"0'/,.2-8,@+I*R)](k'z&Œ%Ÿ%²%Ê%è%÷r bVLD>9631 0 0 / .,+*)#()'/&5%=$F#P"\!i y‹°Æãóm^RH@:51.,** ) ( ' %$# " &! , 3 ; D O [ i y ‹ ž ° Å á ðiZNE=71-*(&$## "     # * 2:DP\j{ ³ÉäòeWKB:4/*'$"   !gk›ó(09CNZiyŒž ± Å á ñbTI?71,($! &-6ALW e u ‡ š ­ÁÝ î_QF=5/*%"  # * 3 < G S aqƒ—ª¿Úì\NC:3,'#      '/9CP^n€•©½ØìXKA80*%!   !!!$","5"@#M#Z#k#~#“"§"¼!×!íUH> 5 . ( #   " $ % %&&&!')'2'='I(W(g'{''¥&»&Ö%íQ E!;"2","&!"!   "# % &( ) +,,,,&-/-9-F-T-d-w,,¤+º+Ö*îM"A$8$0$)$$#!"""#$& ( *,. / 02333"3+363B3P3`3s2Š2¡1¸0Ö0ïI%>&4'-'(&#%$%&(* , .0245 7 8::::':2:>:L:\:o9†8ž8¶7Ô6ïD):)1)+)&("'()+. 0 2579;<> ? ACCC#C.C9CGBWBjA@š?²>Ï>ï?,6,/,*+%*+-/2 58:<?ACEFH JLMMM(M4LBLQKdK{J”I­HÊGì;03/-/(-"/147 :=@CFHJLNOQS UXYX"X.W<WKV^VsUT§RÂRæ8312,1%258< @DGJMPSUWYZ\^a dfgf'f4eDdWdkb…aŸ`¹^Ü5705(7 :=B FJOSVY\_adegilnq tww v-v=uOtcs{r•p¯oÉ5:+;"?CH MRW\`dhknqsuwz|‚† ŠŒ‹$Š3‰E‡[†r…‹ƒ¥‚¼/@%DIN TZafkoty}€ƒ…‡ŠŒ’–™ž ¢¢¡) ;ŸPgšš™™¯)INT[bipw}‚†‹“•—𠣦ª®²· »º¹0·Eµ\´t±Ž¯¤"T[bjs{‚‰•šŸ£¦¨«®°³¶º½ÂÇÌÓ ÔÓ&Ñ:ÐQÍhËÊ–üöòñóô òðí%è.â6Þ>ÙDÔJÑOÎTËYÉ^ÆcÄiÁp¾x¼¹¶š³«±À¯æ®ÿ¥ÿšÿ”ÿÿôìèçßÙ ÒÏÏ Ì(Æ0À7¼>¹D·IµN³S±W¯]­b«i©q§z¥…¢“ ¢¶›Ô™ù–ÿÿˆÿ„ÿèßÙÉ¿¸µ ³±°"­*©1¦8¤=¢C HžLœQ›V™\—b•i“r‘}‹š‹¬‰Åˆî†ÿÿzÿxÿÙÍ»®¥Ÿœ ™™™˜$”+‘1Ž7Œ<‹A‰FˆK†P…Uƒ[‚b€k~u|‚z’x£w¹vàuÿrÿnÿlÿǵ¥™‰…„ ‚‚‚€%~+|1z6y;w@vDuIsOrUp\odmnlzjŠh›g¯fÌeõdÿaÿ`ÿ´ …}wspoooom%k*i0h4g9f>eCcHbNaU_^^g\s[‚Y“X¦W¿WêWÿVÿTÿ¡Žulhda` ____]%\*[/Y3X8W=VCUISPRXQaPmN{MŒLŸKµJÜJúJÿJÿ’€rg_ZWUSR RRRQO$N)M.L3K8J=ICHJFRE\DgCuB†A˜@®@Ë?ò@ÿ@ÿ…tg]UOLJHG G FFFED$C)B-A3?8>>=E<N;W:b9o8€7“6§6À6è6þ6ÿ|k^TMGCA?>= =<<<:9$8)7.635:4A3I2S1^0k/{.Ž-¢-¸-Ý-ø.ÿsdWMF@;87654 44321 0$/)./-6,=+E*O)Z(g'w&‰&%³%Ï%ð&ÿm^ R H @ : 6 2 0..- , ,+*)( '%&+%2$9#B"K"W!d s…™®Çéúh Y M C<61 - * ( ' && %$$"5-'"       "*3>JXgzŽ£·ÏéRF;2+%!   '0;GUdwŒ¢·ÏêOC90)#    $-8DRbuŠ ¶ÐëL@6-&!      !!"!*!5"A"O"_"r!ˆ!Ÿ ¶ÑíH=3+$   !" $ &&&''''2'>'K'\'n&…&%´$Ñ#îD90(#  !"$&(* + ----$...:.H-X-j-,š+²*Ð)ï@ 6!-!&!! ! " $&(+-/0 2 4555 5*565C5S4f4|3–2¯1Í0ï<#2$*$$# "!!#% ' )+.02468: < >>>>&>1>?=N=a@BD F IIH!H,G:GIF[EqD‹C¥BÃAè4*,*'("'(*- 0 369<>ACFHJLNP STTS'S4SCRUQjPƒOžM¹Là0-+,&+,.2 59=@CFILNQSUWY\_ bccb,a<`N_b^{\–[°YÏ/0*/"037;?DHLORUX[]`bdfimp tts%r4rEpYoqm‹k¦jÀ.3%58<AGLQUY]aehkmortwz~‚† Љˆ+†=„Rƒg›~²): =BHNTZ`dinrvz}€‚…ˆ‹Ž’–›  ¢ !Ÿ3Gš^˜w—•§#CHN U\cjqv{€†ŠŽ‘“–™œ £§«°¶¼ º¹(·<´R²j¯…­œNT \dlt|ƒ‰”šŸ¢¤§ª®±´¸¼ÁÇÍÔØÕÓ1ÐHÍ_ËvÈŽ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿmft1!  !"#$%&'()*+,-./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬,‚à­®°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïñòóôõö÷øùúûüýþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÙË çÎ 9èÍ`ÜÉ ’Ë»0«Æ¸O´À³g½»®{ĵ©ˆË²¦‡Ñ¯£‡Õ­ ˆÙ«ž‰Ü©œŠÞ§›Œà¥™ã¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜äÙË äÎ 9çÎ`ÚÊ ’˼.«Å¹M´À´f½º®zŵ©‡Ë±¦‡Ñ®£‡Õ¬ ˆÙªž‰Ü§œŠÞ¥›‹à¢šâž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãØË áÏ 9åÏ`ÙÊ ‘˾,«Å¹Lµ¾´g½¹®{Å´ª‡Ì°¦‡Ñ­£‡Õ« ˆÙ¨žˆÛ¥‰Ý£œŠßŸš‹á›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™ŽâØË ÜÐ 9ãÐ `ØË ‘Ë¿+«ÄºLµ½³g¾¸®{Å´©‡Ì°¦‡Ñ¬£‡Õ© ‡Ø¦ŸˆÛ£ˆÝ œ‰Þ›Šà˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá×Ì ÚÑ 8ÞÑ _ÖË ‘ËÀ)¬Â¹M¶¼³h¾·®{Ƴ©‡Ì¯¦‡Ñª£†Õ§¡‡Ø¤Ÿ‡Ú¡ž‡ÜžˆÝšœ‰Þ•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›ŒàÖÌ ÙÑ 8ÚÓ _ÔÌ ‘ÉÀ)­À¹N¶º³i¿µ®|Ʋ©‡Ì­¦†Ñ©£†Ô¥¡†×¢ †ÙŸŸ†Ú›ž‡Ü—ˆÝ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹ÞÕÌ ØÒ 7ØÓ ^ÒÌ “Ç¿+­¾¸P·¹²j¿´­|ư©‡Ì«¦†Ð§¤…Ô£¢…ÖŸ¡…Øœ …Ù˜Ÿ†Ú”ž‡ÜŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝÔÍ ÖÒ 7ÖÔ ^ÐË •ľ-®¼¸Q¸·²jÀ³­|Æ®©‡Ì©¦†Ð¥¤…Ó £„Õ¢„Ö™¡…Ø• …Ù‘Ÿ‡ÚŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛÓÍ ÕÓ 6ÔÔ _ÎË —Á¾0¯º·S¸µ²lÀ°­}Ǭª†Ë§§…Ï¢¥„Ñž¤„Óš£„Õ–¢„Ö“¡…×\·Ù †Ø‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰ÙÒÎ ÓÔ 5ÑÓ bËÌ ™¾½3±··U¹²±mÁ­­}ƪª†Ë¤¨„Ο§„Л¥ƒÒ—¤ƒÓ“£„Ô£…ÕŒ¢†Ö‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×ÐÏ ÑÔ 7ÎÓ eÆÊ ¹¼8²´¶Xº­±nÁª®}Ƨ«…É¡©„Ìœ¨ƒÎ—§ƒÏ“¦ƒÑ¥„Ò¥…ÓŠ¤†Ó‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔÎÐ ÎÔ :ÊÓ hÀÈ¡µ»>´­µ[»©±oÁ¦¯}Ä£­„Ç«ƒÊ˜ªƒË“©ƒÍ¨„Χ„ÏŠ§…χ¦‡Ð…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑÌÐ ÊÔ >ÅÓ m¸Å¥®¹Dµ§µ^»£²pÀ¡°}ß®„Å™­ƒÇ”¬„É«„ʪ…ËŠª…ˈ©†Ì…©‡Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰ÍÈÑ ÅÕ B¿Ó r±Ä§¥¹I¶¡¶`»ž³p¾±}Á›°„Õ¯„Ä‘®„Æ­…ÇŠ­†Çˆ¬†È†¬‡È„«‰É‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉÄÒ ÀÖ H¸Ô x©Ï˜ž¾G®š¶bº˜µq¼—³|¾—²„À’±…°…ʯ†Äˆ¯‡Ä†¯ˆÅ„®‰Åƒ®ŠÅ®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å¿Ô%º× N®Ú p Û‡—Í9š’ÃX¨‘¼l²‘·z¹’´ƒ½Ž³†¿‹²‡Àˆ±‡À†±ˆÁ„±‰Áƒ±ŠÁ‚±‹Â€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ0ù½ Sê¸'|̨D«Æ¥]´Â¤pº¾¢¿¼ ˆÃ¹›ˆÇ·˜ˆÊµ•‰Î³’ŠÐ±‹Ó°Õ¯Š×­ˆ“Ù­†˜Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú÷Á÷Á0ø¾Sê¸&|Ë©C«Æ¦\´Â¤oº¾¢~¿» ˆÃ¹‡È¶š‡Ì³—ˆÏ±”‰Ò°’ŠÕ®Œ×­ŽÙ¬Š’Ü«‰™Ý§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛöÁ÷Á0ø¿Sê¹%|Ë©B«Æ§[³Â¥nº¾£~¿»¡ˆÄ¸ž‡Éµœ‡Í²™‡Ñ°–ˆÔ®”‰×­’‹Ú«Ü©’ߨšß£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜöÁöÂ0÷¿Sêº$|Ë©A¬Æ§Z³Â¥mº¾£}¿»£ˆÄ· ‡É´‡Î±›‡Ó¯™ˆÖ­—‰Ú«•ŠÜ©“ß§’‘⤑™à ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜõÂõÂ0öÀSêº#|˪A¬Æ¨Y³Â¦mº¾¤}¿º¤‡Å·¡‡Ê³Ÿ‡Ï°‡Ô®›ˆØ«™‰Ü©˜‹ß§˜Žâ¥—’æ –™àœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýô õÃ0öÀSê»"|ʪ@¬Æ¨X³Â¦lº¾¤|¿º¥…Ŷ£‡Ë³¡‡Ð°Ÿ‡Õ­ˆÚªŠÝ§›Œà¤šŽâŸ˜ãš˜á™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ýòà ôÃ0õÁSê¼!|Ê«?­Æ©W³Â§kº¾¥{¿º¦„Ŷ¥‡Ë²£‡Ñ¯¡‡Ö«ŸˆÚ§‰Ý¤œŠß ›‹à›šâ—š“á—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þðà ôÄ/õÂRê½ |Ê«>¬ÆªV³Â¨kº¾§y¿º¨ƒÅ¶§‡Ì²¥‡Ñ¬¢‡Ö¨ ‡Ù¤žˆÜ¡ˆÝœœ‰Þ—›‹à“›à’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—ÞíÄ óÅ/ôÂRê½|ʬ<¬Æ«U³Â¨j¹¾©w¿ºª€Åµ©‡Ì¯¥‡Òª¢‡Ö¥ †Ø¡Ÿ†Úž‡Û™‡Ý”‰ÞœÞŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝêÅ òÅ/óÃRê¾|Ë­:¬Æ¬T³Â©i¹¾¬s¿º­~Ų©‡Ì¬¥†Ñ§£†Õ¢¡…מ …Øš …Ú–Ÿ†Û‘žˆÜž‹Ü‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜæÅ ñÆ/òÄRêÀ|˯8¬Æ­R²Â«f¹¿°o¾·­~ư©‡Íª¦†Ñ¤¤…ÓŸ£„Õ«Ã8¡›¢„Ö—¡…Ø“ …Ù ‡Ù‹ŸŠÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚáÆ ðÇ.ðÆQêÁ|˰5«Ç¯O²Ã°`¸¼²l¿²­~Ç­©†Ì§§…Ï¡¥„Òœ¤„Ó˜£„Ô”£„Õ¢…Ö¡†×‰¡ˆØ‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹ØÛÇ îÉ.îÈQëÄ|̳0«Ç±L±Ä¸V·¶±nÁ®­Ç©ª†Ë£¨„Ξ§ƒÏ™¦ƒÑ•¥ƒÒ‘¤„ÓŽ¤…Ô‹£†Ôˆ£ˆÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕÚÈ ëË -ëÊPëÇ|̶*ªÈ·D°º¶Yº¯±pª­Ǧ«…Ê ª„Ìš¨ƒÍ–¨ƒÎ’§ƒÏ¦„ÐŒ¦…щ¥†Ñ‡¥‡Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰ÒØÉ ßÍ ,çÍOèË{ͼ"¨Â¼<±±µ^¼©±r¦®Å¢­„Çœ«ƒÉ—ªƒÊ“ª„Ë©„Ì©„Í‹¨…͈¨†Î†§‡Î„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰ÏÕÉ ØÏ +ÚÓ NØÐ zÍ賺Fµ©´b½¤±tÁ¡°Þ®„Å™­„Ç”¬„È«„ÉŽ«„Ê‹ª…ˉª†Ë‡©‡Ì…©ˆÌƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰ÌÒË ÔÑ )ÕÕ LÐÐ ~¸¿%®¨¸O¸¡´f¼ž²u¿±Á›°„Ö®„Å‘®„ÆŽ­…Ç‹¬…lj¬†È‡¬‡É†«‡É„«‰É‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊÏÌ ÐÒ (ÎÔ RÅÑ ƒªÃ-¨ž·W¸›µh»š´u¾™²¿—±„Á“°…¯…ÃŒ¯…ÄŠ®†Åˆ®‡Å†®ˆÆ„­ˆÆƒ­ŠÆ­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹ÇÌÍ ËÓ -ÇÔ Y²Ø €žÍ+š˜ÁP«–¸g·•µu¼”´~¾”³…¿²…ÀŒ±†Áб‡Âˆ°‡Â†°ˆÂ…°‰Ãƒ°ŠÃ‚¯‹Ã¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃÇÏÅÔ 4¸Ù [¢çv—Ú%‰ÏE˜ŽÇ]£Án«½y±Œº´‰¸ƒ·†·…¹„¶†ºƒµ‡»‚µˆ¼´‰½€´Š½´‹¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾ÂѽÖ:§ñU›ñh‘æ-x‰Ý@……ÕVƒÏg—‚Ës~Èx¡{Æ|¤yĦw¨u„©tÂ…ªsÁ‡«rÁˆ«rÀЬqÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬ÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿµ)F÷°5iÞ¨AÇœa±Äœq¶Â›~¹¿†½½š‰Á»—‰Ä¹“ŠÇ·ŒÊµŒŽÌ´‰Î³‡’в„•Ò±‚™Ó±žÔ®€¢Ô¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Òÿ¹ÿ¹'ÿ¶(F÷°4jݨ@Ç`±Äœq¶Âœ|º¿ž…¾¼œˆÂº™ˆÅ¸•‰É¶‘ŠÌ´ŽŒÏ²‹ŽÑ±ˆ‘Ó°†”Õ¯„™Ö¯ƒŸ×ª‚¡Õ§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Óÿ¹ÿ¹'ÿ¶(F÷±3jÝ©?‘Ç`±Äp¶Âž{º¿Ÿƒ¾¼žˆÂ¹›ˆÇ·—ˆÊµ”‰Î³‹Ñ±Ó¯ŠÖ®ˆ“Ø­†™Ùª…žÙ¥„¡Õ¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ôÿºÿº'ÿ·'F÷±2jÝ©>‘Çž_±Äo¶ÁŸyº¾ ‚¿» ˆÃ¸œ‡È¶™ˆÌ³–ˆÐ±’ŠÓ¯ŒÖ®ŒŽØ¬Š“Û«‰™Ü¦‡Ú¢† Ö †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ôÿºÿº&ÿ·&Fö²1jݪ=‘Çž^±Äo¶Á xº¾¡¿»¡ˆÄ¸ž‡Éµ›‡Í²˜ˆÑ°•‰Õ®’‹Ø¬Ûª’Þ¨Œšß¢ŠÚž‰ Öœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôþºÿ»&ÿ¸&Fö²0jݪ<‘Çž]±Äžn¶Á¡vº¾¢¿»£ˆÄ· ‡Ê´‡Ï±š‡Ó®˜ˆ×¬•ŠÛª“Þ¨‘’⤙àžÛšŒ ×™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õþ»þ»&ÿ¸%Fö³0jÜ«;’ÇŸ]±ÄŸl¶Á¢tº¾¤~¿º¤‡Å·¢‡Ê³Ÿ‡Ð°œ‡Õ­šˆÙª™ŠÞ¨˜Žâ¥—“柕™àš‘œÛ—Ÿ×–ޡՖޡՖޡՖޡՖޡՖޡՖޡՖޡՖޡՖޡՖޡՖޡՖޡÕý»þ»&ÿ¹%Fö³/jÜ«:’ÇŸ\±Ä j¶Á£sº¾¥|Àº¥…Ŷ£‡Ë³¡‡Ñ¯Ÿ‡Ö¬ž‰Û¨œ‹ß¤šáŸ™ãœš˜á—–œÜ”“ŸØ“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Öý» ý¼&þ¹$Fö´.jÜ«:’Ç \±Ä¡h¶Á¥qº¾§zÀº§„Ŷ¦‡Ì²¤‡Ñ®¢‡×©ŸˆÛ¤‰Þ ›ŠàššŒá–›“á•››Ý’—žØ‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×ü¼ ý¼&þº#Fö´-jܬ9’Ç [±Ä£fµÁ¦nº¾©xÀº©‚Ŷ¨ˆÌ_¦øæ°¥‡Òª¢‡×¦Ÿ‡Ú¡ž‡Ü›ˆÞ–œŠß‘›ß‘™Ý›žÙ™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×ü¼ ü¼&ýº"Eöµ,jÜ­7“Ç¡Z±Å¥cµÂ©kº¾¬u¿º­ų©‡Ì­¥†Ò§¢†Ö¢¡†ØŸ†Ú˜ž‡Û’‰ÝŽÝŒž”Ü žÙŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×û½ û½%ý»"Eö¶+jÛ­6“Ç¢Y±Å§_µÂ­f¹¿±p¾·­~ư©‡Íª¦†Ñ¤¤…Ôž¢…Ö™¡…Ø” †ÙŸ‡Ú‹Ÿ‹ÛˆŸÛˆ ˜Øˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ú½ ú¾%ü¼ Eö·*jÛ¯4”ȤU±Æ«X´Ã³_·»²n¿²­~Ǭ©†Ì¦§…Р¥„Ò›¤„Ô–£„Õ‘¢…Ö¡†×‰¡‰Ø†¡Ø„¡“ׄ¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Öù¾ ù¿%ú½Eö¸'jÛ°1”ȨM¯Ç²N²Á¸X¸´±pÁ­­Ç©ª…Ë¢¨„ΧƒÐ—¦ƒÑ’¥„ÒŽ¤…Ó‹£†Ôˆ£ˆÕ„£‹Õ‚£Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“ÕôÀ ÷À$ù¿Döº%jÚ².•ʯ@­È½=¯·¶]º®±r©­Æ¥«…ÉŸªƒË™©ƒÍ”¨ƒÎ§„ÏŒ¦…Љ¦†Ñ†¥‡Ò„¥ŠÒ¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥ÒìÁ õÂ$öÁD÷½!jÚ´)–ͼ(©»»C³®µa¼¨±sÁ¥®Å¡­„Ç›¬ƒÉ–«ƒÊ‘ª„ËŽ©„Ì‹©…͈¨†Î†¨‡Îƒ¨‰Î§ŒÏ€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§ÏßÄ òÅ#óÄCôÁiÞÂÁÀ#¬¯¹L¶¦´e½¢²uÀ °€Ã®„Å—­„Æ“­„Ǭ„ÈŒ«…ɉ«†Ê‡«†Ê…ªˆÊƒª‰Ëª‹Ë€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒËÚÅ ëÉ "îÈBïÆhÐÒ ‡±¾/®¥¸T¸Ÿµh¼³v¿›±Á™°„”¯„ï…Ä®…ÅŠ®†Æˆ­†Æ‡­‡Æ…­ˆÇƒ­‰Ç­‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹ÇÕÆ ÙÌ åÏ @ØÕ _½Ö ˆ¥Ä4¦œ·Z¸™µk»—´w½–³¾•²…À‘±…Áޱ…Á‹°†Â‰°‡Âˆ°‡Ã†°ˆÃ…¯‰Ãƒ¯ŠÄ‚¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹ÄÒÈÓÏ ÕÔ =ÂÙ c«Þƒ›Î3™”ÄS¦‘¾g¯ºt´·}¹‘µ„¼Ž³†¾Œ²†¿Š²‡Àˆ²ˆÀ†±ˆÁ…±‰Á„±ŠÁ‚±‹Á±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂÎÊÎÑ Æ× A¯êaæxÚ2ˆ‹ÒL”‰Ë_œˆÆn£ˆÃx¨…À|«ƒ¿®€½°¼ƒ±}¼„²|»†³{»‡´zºˆ´yº‰µx¹‹µx¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶ÉËÈÒ "³ß B üZ“ð(j‹æ9w„ßI‚Ø[‹€Ói‘|Ðq–yÍvšvËztÊ}žrÉ qÈ¡pǃ¢oÇ…£nƆ£mƈ¤lÅŠ¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥ÄÎ ·Ù&£û=–ÿNú/[†ò?g€ëNq{å[yvàe€qÝl„nÚrˆkÙw‹i×zgÖ~ŽfÕ€eÔ‚dÔ„‘cÓ†‘bÓ‰’aÒ‹“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“ÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ²"ÿ®0:ÿ©=Yì£JyØ›[˜Ç•r±Å—{µÃ˜ƒ¸Á™Š»¿•‹¾½‘ŒÁ»ŽŽÃºŠÅ¹‡’Ǹ„•É·‚˜Ê¶€›Ë¶~žÌµ}£Ì³|§Í¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ëÿ² ÿ²!ÿ¯/:ÿª}Ö¨D›É¨O¯Ç°S²Å¸Yµ¹³m¿±­}Ƭª†Ë¥§…ÏŸ¦„ј¤„Ó’£„ÕŒ¢†×ˆ¡Š×…¡Ž×ƒ¢–Ö„¤ŸÔ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñÿ·ÿ¸ÿ¶%9ÿ±1Zê«<~׬;™Ê­D­É¹E®½¸Y¸²²oÀ¬®~ƨ«…Ê¡©„Í›§ƒÏ•¦ƒÐ¥„ÒŠ¤†Ó†£ˆÔƒ£ŒÔ£‘Ô€¤™Ó€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñÿ¸ÿ¹ÿ·$9ÿ³/Zé­9~Ù´/–̸2©Â½@°³¶]º¬±qÁ§®~Ť¬…È«ƒÊ—©ƒÌ’¨„Χ„ω§†Ð…¦ˆÐ‚¦‹Ñ€¦ŽÑ~¦”Ð}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏÿ¹ÿºÿ¹"9ÿµ-Zì³0zÝÀÉÃ!¨µºH´«µb¼¦²sÀ£¯~஄ƙ¬ƒÈ”«„ɪ„Ê‹ª…ˈ©†Ì…©ˆÍ‚¨ŠÍ€¨Î~¨‘Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Íü»ü¼þ»8ÿ·)Zð½$tßÓ†¹Á*ªª¹O¶¤µe¼ ²t¿ž±›¯„Ö®„Å‘­„Æ­…ÇŠ¬†È‡¬‡É…«ˆÉ‚«ŠÊ€«ŒÊ~«Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Êñ½ ù¾ú¾7üº%ZçÎhÈÙ ‰­Ã2§¡¸V¸µh»›³u¾™²À˜±„Á“°…¯…ÃŒ¯†Ä‰®†Å†®‡Å„®ˆÆƒ­ŠÆ­‹Æ­ŽÇ}­Ç}­Ç}­Ç}­Ç}­Ç}­Ç}­Ç}­Ç}­Ç}­Ç}­Ç}­ÇßÀõÂöÂ6îÈPÍÜ fµÚˆ¢É6 š¾V°—·j¹•µv¼”´~¾”³„¿²…À±†Áб†Áˆ±‡Â†°ˆÂ„°‰Âƒ°ŠÃ°‹Ã€¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯ÃÙÂäÇ ïÈ4ÑÚ Eºéh¦Þ‚˜Ñ7•‘ÈS¡Âe©Ž¾r®¼{²Œºµ‰¸‚·‡¸„¸…·…¹ƒ¶†º‚¶‡ºµˆ»€µ‰»~µŠ¼}´Œ¼|´½|´½|´½|´½|´½|´½|´½|´½|´½|´½|´½|´½ÔÄÖË ÓÔ '½â I©ôe™æ%xŽÜ9†ˆÔO†Ï`—„ÌmœƒÉu Çx¢}Æ{¤zÅ}¦yÄ€§wèvƒ©u„ªtÁ†«sÁ‡«rÀ‰¬q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­ÏÆÐÍ ÀÙ ,¬÷H›ú\ï1k†çBv€âP~~Ý_…{ÙiŠwÕntÓs’qÑw”pÐz–nÏ}—mΙlÍ™k̓šjÌ…›i̇œhˉgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒÊÈÂÒ®æ -ÿA‘ÿ(P‡ú9\óHf|íTnwè^uqäezmák~jßphÞu„fÜx…eÛ{‡cÚ~ˆbÚ‰aÙƒŠ`Ù…Š`؇‹^ØŠŒ^Ö^Ö^Ö^Ö^Ö^Ö^Ö^Ö^Ö^Ö^Ö^ÖÄʱڟÿ (’ÿ7‰ÿ.C‚ÿ=N|ýKWwøV_oó]ehðbjdíinaëoq_éss]èwu\ç{v[æ~wZæ€xYåƒyXå…zXäˆzWä‹{VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|ÿªÿª'ÿ§6/ÿ¢DJúReê—_~Ü“n“Ï’x¥Æ’‚´Ä’‰¶Ã‘ޏÁŽºÀŠ’¼¿‡”½¾„–¿¾‚™À½€›Á½~žÁ¼}¡Â¼{¤Â¼z¨Ã¼y­Ã¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Âÿªÿª'ÿ§6/ÿ¢DJúReê—_~Ü“n“Ï’x¥Æ’‚´Ä’‰¶Ã‘ޏÁŽºÀŠ’¼¿‡”½¾„–¿¾‚™À½€›Á½~žÁ¼}¡Â¼{¤Â¼z¨Ã¼y­Ã¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Âÿªÿª'ÿ§6/ÿ¢DJúReê—_~Ü“n“Ï’x¥Æ’‚´Ä’‰¶Ã‘ޏÁŽºÀŠ’¼¿‡”½¾„–¿¾‚™À½€›Á½~žÁ¼}¡Â¼{¤Â¼z¨Ã¼y­Ã¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Âÿªÿª'ÿ§6/ÿ¢DJúReê—_~Ü“n“Ï’x¥Æ’‚´Ä’‰¶Ã‘ޏÁŽºÀŠ’¼¿‡”½¾„–¿¾‚™À½€›Á½~žÁ¼}¡Â¼{¤Â¼z¨Ã¼y­Ã¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Âÿªÿª'ÿ§6/ÿ¢DJúReê—_~Ü“n“Ï’x¥Æ’‚´Ä’‰¶Ã‘ޏÁŽºÀŠ’¼¿‡”½¾„–¿¾‚™À½€›Á½~žÁ¼}¡Â¼{¤Â¼z¨Ã¼y­Ã¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Âÿªÿª'ÿ§6/ÿ¢DJúReê—_~Ü“n“Ï’x¥Æ’‚´Ä’‰¶Ã‘ޏÁŽºÀŠ’¼¿‡”½¾„–¿¾‚™À½€›Á½~žÁ¼}¡Â¼{¤Â¼z¨Ã¼y­Ã¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Âÿªÿª'ÿ§5/ÿ£DJúQeé—^~Û”m”Ï’w¦Å’´Ä“ˆ¶Ã’¸ÁºÀ‹‘¼¿ˆ“¾¾…–¿½‚˜Á¼€›Â¼~žÂ¼}¡Ã»{¤Ä»z©Äºy­Äµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãÿ«ÿ«&ÿ¨4/ÿ¤CJùžPeé˜]Ú•i•Í”t¨Å”~´Ä•†¶Â•Œ¹Á‘Ž»¿½¾‰’¿½†”Á¼ƒ—ûšÄº~ź}¡Æº{¥Æ¹zªÆµz¬Æ±z­Ä±z­Ä±z­Ä±z­Ä±z­Ä±z­Ä±z­Ä±z­Ä±z­Ä±z­Ä±z­Äÿ«ÿ«%ÿ©4/ÿ¤BJùŸOfè™\€Ú–f–Ì•q©Å•|´Ä–ƒ·Â—‹ºÀ“Œ¼¾Ž¿½‹Á¼‡“ú„–Ź™Æ¹Ǹ}¡È¸|¦ÉµzªÉ°{«Ç¬{­Å¬{­Å¬{­Å¬{­Å¬{­Å¬{­Å¬{­Å¬{­Å¬{­Å¬{­Å¬{­Åÿ¬ÿ¬$ÿ©3/ÿ¥AJùŸOfè™[Ù˜c–Ì–oªÅ–y´Ã—·Á˜‰º¿•‹½¾‘À¼Âºˆ’Ź…•Ǹ‚˜É·ʶ}¢Ë¶|¨Ë°{©Ê¬|ªÈ¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Åÿ¬ÿ¬$ÿª2/ÿ¥AKù NgçšYÙ™a—Ë—m«Å—w´Ã™·Áš‡»¿—о½“ŒÁ»ŽŽÄ¹ŠÇ¸†“ɶ‚˜ËµÍ´~£Î±|¦Î¬}¨Ë¨}ªÉ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æÿ¬ÿ­#ÿª2/ÿ¦@Kø MgçœWÙš^—˘j¬Å™t´Ãš}·Á›…»¾™‰¿¼•ŠÂºŒÅ¸ŒÈ¶‡’Ë´ƒ—γ€Ð²¤Ñ¬~¥Ï¨~§Ì¤©É¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æÿ­ÿ­#ÿ«1/ÿ¦?Kø MgçUÙœ\—Ê™h¬Åšr´Ãœz¸Àœƒ»¾œ‰¿»—‰Ã¹“‹Ç·ŽË´‰Î²„–ѱӬ€¢Ó§€¥Ð¤€§Í ©Êž«Æž«Æž«Æž«Æž«Æž«Æž«Æž«Æž«Æž«Æž«Æÿ­ÿ­"ÿ«1/ÿ§?Kø¡LgçžSÙY—,sÔÊ›e¬Åœo´Ãx¸Àž¼½žˆÀ»šˆÄ¸•‰Éµ‹Í²‹Ñ°†•Õ®„ž×§‚¡Ô£‚¤ÑŸ‚§Íœƒ©Êšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çÿ­ÿ®"ÿ«0/ÿ§>Kø¡KhçŸQÙŸV—Êœb¬Ål´ÃŸu¸À ~¼½ ‡ÁºˆÆ·˜ˆË³“‰Ï°ŽÔ­‰”Ù¨†Ú¢…¡Õž…¤Ñ›…¦Î™…©Ê—…«Ç—…«Ç—…«Ç—…«Ç—…«Ç—…«Ç—…«Ç—…«Ç—…«Ç—…«Ç—…«Çÿ®ÿ®"ÿ¬0/ÿ§>Kø¢Khè¡OÙ S—Êž_¬ÆŸi´Ã¡r¸À¢|¼½¢„Á¹ ‡Çµœ‡Í²—ˆÒ®“‹ØªŽ“ߢ‹œÜœ‰ Ö™ˆ£Ò—ˆ¦Î•ˆ©Ê”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Çÿ®ÿ®!ÿ¬//ÿ¨=Kø¢Jhè¢M€Ù¢P—Ë \¬Æ¡e³Ã¤n·À¥x¼¼¥‚¸¤‡È´ ‡Î°ˆÕ«™ŠÝ¥—“曑›Ý– ×”£Ó’Œ¦Ï‘‹¨ËŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«Èÿ®ÿ¯!ÿ­//ÿ¨ÿPU÷ŸQhë S{à WÔž_žÊ›k¬Å›u´Ã›~¸À›‡¼½—ŠÀº‘ŒÅ·ŠÊ´„—ϲ€£Ò¨¥Ï£€¨Ë €«Ç­Å›¯Â™‚±¿™‚±¿™‚±¿™‚±¿™‚±¿™‚±¿™‚±¿™‚±¿™‚±¿™‚±¿ÿ¦ÿ§%ÿ¥4%ÿ¡C>ÿžNUø¡Nhì¢Pzà£RŒÕ¡[Ëžf¬Æq´Ãžz¸Àž„¼¼›ˆÂ¹•ŠÇµÎ°†–Ô©‚ Ö¡‚¤Ð‚¨ËšƒªÈ™ƒ­Å—„¯Â–„°À–„°À–„°À–„°À–„°À–„°À–„°À–„°À–„°À–„°Àÿ¦ÿ§%ÿ¥4%ÿ¡B>ÿŸLUø¢Lgì¥Myá¦N‹Õ¤VœÌ¡aªÆ¡l³Ã¢v·À¢€½¼ ‡Ã·šˆÊ²“ŠÒ¬‹”Û ‡ŸØš†¤Ñ—†§Ì•†ªÈ”‡¬Å“‡®Ã’‡°À’‡°À’‡°À’‡°À’‡°À’‡°À’‡°À’‡°À’‡°À’‡°Àÿ§ÿ¨$ÿ¦3%ÿ¢B>ÿ JTù¤Jfí§Jxâ©KŠÖ¨QšÍ¦[©Ç¥e²Ä§p¶À§z¼¼¦ƒÃ¶¢‡Ë¯ˆÖ¥—•æ—žÚ“£Ò‘‹§Í‹ªÉŠ¬ÆŠ®Ã‰°Á‰°Á‰°Á‰°Á‰°Á‰°Á‰°Á‰°Á‰°Á‰°Áÿ§ÿ¨$ÿ¦3%ÿ¢A>ÿ¢HTù¦GfîªGwã­GˆÙ­K˜Ï¬T¦È¬^¯Æ¯h³Â±s¹¾²}À²ª‡Ë¥¢†Õ”œ‹ÞšÚ•¢ÓŒ’¦Î‹©Ê‹Ž«Ç‹­ÄŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯Áÿ¨ÿ©$ÿ§2%ÿ£A>ÿ¤FSú©Ddï­Cuä±B…Û´D”ÒµJ¡Ë·S«Ê¾_­½·n¸²°|©ª†Ëœ¥„Ò ‡Ø† —Ù‡ž¢Ó‡˜¥Ï‡•¨Ë‡“ªÈˆ‘­Åˆ¯Âˆ¯Âˆ¯Âˆ¯Âˆ¯Âˆ¯Âˆ¯Âˆ¯Âˆ¯Âˆ¯Âÿ¨ÿ©#ÿ§2%ÿ£@>ÿ¦CRû«Acð±?sç·=‚Þ¾;ÖÄ?šÌÅJ¦¼¼]²±µo»ª°}ã«„É–§ƒÎФ†Ó£Õ¥ŸÒ‚¡¥Ï‚œ¨Ìƒ™ªÉ„–¬Æ…”®Ã…”®Ã…”®Ã…”®Ã…”®Ã…”®Ã…”®Ã…”®Ã…”®Ã…”®Ãÿ©ÿª#ÿ¨1%ÿ¤?>ÿ¨@Qü¯>ÿ«;Oÿ´7]ö½3jëÊ1uÜÚ)‚ÄÎ8™²ÁO«§¸c·¡´s¼ž±Á˜¯„Ĭ„ȇª‡Ê€©ŒÌ|©“ÌzªœËy«¦Êz§ªÈ|¢«Ç}ž­Ä}ž­Ä}ž­Ä}ž­Ä}ž­Ä}ž­Ä}ž­Ä}ž­Ä}ž­Ä}ž­Äÿªÿ«!ÿ©.%ÿ§<>ÿ°6Lüº0YïÈ,bÞÙ'mËÜ&†¶Ì<›¨ÁT«Ÿ¹f¶›µt¼™²¿•°„¯…Ć­‡Æ¬‹È}¬È{¬˜Èy­ŸÇw­§Çwª¬Æy¥­Äy¥­Äy¥­Äy¥­Äy¥­Äy¥­Äy¥­Äy¥­Äy¥­Äy¥­Äÿ«ÿ¬ ÿ«-$ÿ«6;ÿ¶/HóÄ(QàÖ&VÌä"q»Ú(ˆªÌA›ŸÃW©™¼i²–·v¹”´€½‘²…À‹±†Á†°ˆÃ¯‹Ä~®Å{®”Åz¯šÄx¯ Äu¯§Ät­®Ãt­®Ãt­®Ãt­®Ãt­®Ãt­®Ãt­®Ãt­®Ãt­®Ãt­®Ãÿ¬ÿ­ÿ¬+$ÿ°/7ú¿%AäÑ EÎä[½é"t­Ú,‰ŸÎE™—ÆZ¤“Àj­‘»v³¸·¶„»‰´†½…²ˆ¿‚±‹Á±ŽÁ|±’Âz±–Áy±›Áx²¡Àt±§Át±§Át±§Át±§Át±§Át±§Át±§Át±§Át±§Át±§Áÿ®ÿ¯ ÿ®($ÿ¸$1êË5ÐâC¿ð^¯è%u Û1‡–ÑH”Ê\žÅj¥‹Ávª‰¾}¯…¼€²‚ºƒ´~¹†¶|¸‰·y·Œ¸w·¹v¶“ºu¶—ºt¶ºs·¤¹s·¤¹s·¤¹s·¤¹s·¤¹s·¤¹s·¤¹s·¤¹s·¤¹s·¤¹ÿ°ÿ± ÿ±%#óÄ'Ôß+ÁïH°÷ `¡ê+s•ß9‚×LˆÑ]•†Ìj›„Ét €Æy¤}Ä}¦z€©wÁƒªuÀ†¬s¿Š­q¿®o¾¯n¾”¯l¾™¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯ÿ³ÿ´ ü¼ÖÖ Ãí0²üJ¢ù%^–í3nŒåAz…ÞOƒÙ^ŠÕjzÒp“vÏu—sÎy™qÌ}›oË€mÊ„žkɇŸiÉŠ hÈŽ¡gÇ’¢eÇ–¢dÇœ£dÇœ£dÇœ£dÇœ£dÇœ£dÇœ£dÇœ£dÇœ£dÇœ£dÇœ£ô¶ ÿ¸ ÕÌ ÄÛ ²ü3£ÿH–ü,XŒó;e„ìIo~çUvzã`|ußgqÝm„mÛr‡jÙv‰hØz‹f×}dÖŽcÕ„aÔˆ`Ó‹‘_Ó’^Ò”’\Ò™“\Ò™“\Ò™“\Ò™“\Ò™“\Ò™“\Ò™“\Ò™“\Ò™“\Ò™“Ü»ØÃÄÑ³è £ÿ1–ÿ$CŒÿ4P„ûBZ}öObxñZhqî_mkëdqgéitdçnvbæsx`åwy_äz{]ã~|\â}[â…~ZáˆYà‹€Wà€Vß•Vß•Vß•Vß•Vß•Vß•Vß•Vß•Vß•VߕԽÄÈ´Ù £þ –ÿ,‹ÿ+:ƒÿ:D|ÿHMuÿRSnýWXgú]\c÷b_`ögb]ôkd[óoeYòsgWñwhVñziUð}jTï€kSï„kRî‡lPî‹mOínOínOínOínOínOínOínOínOínOínÆÀ´Ð£ã –ÿ‹ÿ $‚ÿ0/zÿ?7rÿH>jÿNCdÿTH^ÿYL[ÿ_OXÿdRUÿiTSÿmURþqWPýtXOüxYNû{ZMû[Lúƒ\Kù†]Iù‹^Hø_Hø_Hø_Hø_Hø_Hø_Hø_Hø_Hø_Hø_µÇ¤Ú–ÿŠÿÿ$yÿ3"pÿ;*hÿB1aÿJ6\ÿQ;WÿW?Sÿ]BPÿbDNÿgFLÿlHJÿpIIÿtJHÿwKFÿ{LEÿMDÿƒNCÿ‡NBÿ‹OAÿ‘PAÿ‘PAÿ‘PAÿ‘PAÿ‘PAÿ‘PAÿ‘PAÿ‘PAÿ‘PAÿ‘Pÿ‘ÿ•' ÿ•;ÿ“K/ÿYCÿŒdTûŒkcòŠrqêˆ|}ㆄ‡Þ‚ŠÚ–Ö}”›Óz˜ŸÑxœ¢ÐwŸ¤Îu¢¦Ít¦¨Ír©©Ìq­ªÌp²«Ëp¶«Ëo¼«ÈpÀ«ÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÿ‘ÿ•' ÿ•;ÿ“K/ÿYCÿŒdTûŒkcòŠrqêˆ|}ㆄ‡Þ‚ŠÚ–Ö}”›Óz˜ŸÑxœ¢ÐwŸ¤Îu¢¦Ít¦¨Ír©©Ìq­ªÌp²«Ëp¶«Ëo¼«ÈpÀ«ÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÿ‘ÿ•' ÿ•;ÿ“K/ÿYCÿŒdTûŒkcòŠrqêˆ|}ㆄ‡Þ‚ŠÚ–Ö}”›Óz˜ŸÑxœ¢ÐwŸ¤Îu¢¦Ít¦¨Ír©©Ìq­ªÌp²«Ëp¶«Ëo¼«ÈpÀ«ÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÿ‘ÿ•' ÿ•;ÿ“K/ÿYCÿŒdTûŒkcòŠrqêˆ|}ㆄ‡Þ‚ŠÚ–Ö}”›Óz˜ŸÑxœ¢ÐwŸ¤Îu¢¦Ít¦¨Ír©©Ìq­ªÌp²«Ëp¶«Ëo¼«ÈpÀ«ÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÿ’ÿ–' ÿ–;ÿ”K0ÿYCÿcTúŽidñpré‹z~≂‰Ü…‰’Ø‚Ž™Ô“žÑ}—¢Ï{›¦Íyž¨Ìw¢ªËv¥¬Êt©­És­®Ér²¯Éq·¯Èq¼¯Âs½®¾t½¯¾t½¯¾t½¯¾t½¯¾t½¯¾t½¯¾t½¯¾t½¯¾t½¯ÿ“ÿ—' ÿ˜;ÿ•K0ÿ‘YDÿ‘`Uúfdðmsèw€áŒ€‹Ûˆ‡”Õ…œÒ‚‘¡Ï–¦Ì}™©Ë{¬Éy¡®Èw¥°Çv©±Æu­²Æt²³Æs¹³Âuº³¼uº³¸vº³¸vº³¸vº³¸vº³¸vº³¸vº³¸vº³¸vº³¸vº³ÿ”ÿ˜' ÿ™;ÿ–K0ÿ’YDÿ’^Uú’deð‘jtçsàŽ}ŒÙ‹…–Ôˆ‹žÐ…¤Í‚”©Ê˜­È}œ°Ç{ ²Æy¤´Åx¨µÄv®¶Äu´¶Áv·¶¼w·¶·w·¶³x·¶³x·¶³x·¶³x·¶³x·¶³x·¶³x·¶³x·¶³x·¶ÿ•ÿ™' ÿ™;9%–ÿ—J0ÿ“XDÿ”\Uú”aeð“gtç‘p‚ßzŽØƒ˜Ò‹Š Î‡§Ë„“¬È—°Æ›³Ä}ŸµÃ{¤·Ây©¹Âw¯¹Âvµ¹¼x¶¸¸x¶¸³x¶·°y··°y··°y··°y··°y··°y··°y··°y··°y··ÿ–ÿš' ÿš;ÿ—J1ÿ”UDÿ–YUú–^eð•dtç“l‚Þ‘vŽØ™Ñˆ¢ÍŠŽ©É‡’®Æ„–³Äš¶Â~Ÿ¹Â{¤ºÁyªºÁw±º½xµº·xµ¹³yµ¹¯y¶¸¬z¶·¬z¶·¬z¶·¬z¶·¬z¶·¬z¶·¬z¶·¬z¶·¬z¶·ÿ—ÿ›& ÿ›;ÿ˜I1ÿ–SDÿ˜WUú˜[eð—atç–h‚Þ“rÖ‘{šÐ„£ËŒ«ÇŠ‘±Ä†•¶Ãƒ™¸ÁžºÁ{¤»Ày«¼¿w³¼¸x³»²y´»®yµº«zµ¹¨{¶¸¨{¶¸¨{¶¸¨{¶¸¨{¶¸¨{¶¸¨{¶¸¨{¶¸¨{¶¸ÿ—ÿ›& ÿœ:ÿ˜I1ÿ˜QDÿšTTú›Xdðš]tç˜c‚Þ–mÖ“wšÐ‘€¤Ê‰¬Æ³Ã‰”·Â„˜ºÀž¼¿{¥¾¿y®¾¹x²¾²y²½­z³¼©{´º¦{µ¹¤|¶¸¤|¶¸¤|¶¸¤|¶¸¤|¶¸¤|¶¸¤|¶¸¤|¶¸¤|¶¸ÿ˜ÿœ& ÿœ9ÿ™H1ÿ™ODÿœRTûUcñZsç›_Þ™iÖ–ršÏ“|¥Ê‘…­Å´Ã‹’¸Á…–»¿€¾½{¥Á»y¯Á²z°À¬{±¾¨{³½¥|´»¢}µ¹ }¶¸ }¶¸ }¶¸ }¶¸ }¶¸ }¶¸ }¶¸ }¶¸ }¶¸ÿ™ÿ& ÿ9ÿ™G1ÿ›MCÿžOSûŸRcñ VrèŸ[€ßdŽ×šmšÐ—w¤Ê”­Å’ŠµÂŽ¹¿‡•½½€œÁ»{§Ä³z­Ä«{¯Â¦|±¿£}²½ ~´»žµ¹œ¶¸œ¶¸œ¶¸œ¶¸œ¶¸œ¶¸œ¶¸œ¶¸œ¶¸ÿ™ÿž& ÿ8ÿšG1ÿœKBÿ MRü¢Pbò£Sqé£Wà¡^ŒØžg˜Ð›q£Ê˜{­Å•…´Â’º¾Š’¿º›Å·|©É«|«Ç¤}®Ã ~°À²½›€³»™µº˜¶¸˜¶¸˜¶¸˜¶¸˜¶¸˜¶¸˜¶¸˜¶¸˜¶¸ÿšÿž& ÿž8ÿšF2ÿžIBÿ¢JQý¤M`ó¦Poê§T}á¦XŠÚ¤b–Ò¡k¡Ëu«Æš€³Â˜Šº¼ŽÂ¶ƒ™Ë¬}¦Î¢ªÉ€­Äš°À˜‚²¾—ƒ³¼•ƒµº”ƒ¶¸”ƒ¶¸”ƒ¶¸”ƒ¶¸”ƒ¶¸”ƒ¶¸”ƒ¶¸”ƒ¶¸”ƒ¶¸ÿšÿŸ& ÿž7ÿ›F2ÿŸGAÿ¤HPþ§J_ô©Lmë«P{ã¬T‡Ü«\“Ô©eΦo§È£z°ÃŸ„¸»–‹Ä°Œ™Î ƒ¤Ñ™„©Ê–…­Å”…¯Á“…±¾’…³¼‘…´º‘…µ¹‘…µ¹‘…µ¹‘…µ¹‘…µ¹‘…µ¹‘…µ¹‘…µ¹‘…µ¹ÿ›ÿŸ& ÿŸ7ÿ›E2ÿ¡E@ÿ¦FOÿªG]ö­Ikí°Lxæ³Oƒß´UŽÙµ_—Óµi Îµv§Á«|¶°Ÿ…Ä¡•’Î”Ž£Ò‹¨ËŠ¬ÆŽŠ¯ÂŽ‰±¿Ž‰²½Žˆ´»Žˆµ¹Žˆµ¹Žˆµ¹Žˆµ¹Žˆµ¹Žˆµ¹Žˆµ¹Žˆµ¹Žˆµ¹ÿ›ÿ & ÿŸ6ÿœD1ÿ£C?ÿ¨CNÿ­D[ø±Ehð¶Hté»L~ãÀQ‡ßÆ[ŽÖÈk”ƽq¦µ³xµ¥¨Ã”ŸÍ‰œ¢Ò‡”§Ìˆ‘«Ç‰®Ã‰Ž°À‰²¾ŠŒ³¼Š‹´ºŠ‹´ºŠ‹´ºŠ‹´ºŠ‹´ºŠ‹´ºŠ‹´ºŠ‹´ºŠ‹´ºÿœÿ¡& ÿ 6ÿžB1ÿ¥@>ÿ«@Lÿ±@Yú·Adó½DoîÅIwåÎR|ÝÖbÌÎh’¼Ån¤«»v´š±ÁŠªŠË§Ï€Ÿ¨Ì‚™«Çƒ•­Ä„“¯Á…‘±¿†³½‡Ž´»‡Ž´»‡Ž´»‡Ž´»‡Ž´»‡Ž´»‡Ž´»‡Ž´»‡Ž´»ÿÿ¢& ÿ 5ÿ ?0ÿ§==ÿ®hÿOCbÿUG]ÿZKYÿ`MVÿePSÿjQQÿnSOÿrTNÿvULþ{VKýWIý„XHüˆYGûZFû“[Eú˜\Eú˜\Eú˜\Eú˜\Eú˜\Eú˜\Eú˜\Eú˜\Eú˜\½½­Ížß’ÿ ‡ÿ~ÿ)uÿ5#lÿ<*dÿC/^ÿJ4XÿP7TÿV:Qÿ[Kÿd@JÿhAHÿlBFÿpCEÿtDDÿxEBÿ}FAÿG@ÿ†H?ÿŒI=ÿ‘J=ÿ‘J=ÿ‘J=ÿ‘J=ÿ‘J=ÿ‘J=ÿ‘J=ÿ‘J=ÿ‘J®Åž×õ†ÿ|ÿ qÿ$gÿ,_ÿ5Yÿ=!TÿE&OÿK)LÿR,HÿW/Fÿ]0Dÿa2Bÿf3@ÿj5?ÿn6=ÿs7<ÿw8;ÿ|9:ÿ:8ÿ†:7ÿŒ;6ÿ’<6ÿ’<6ÿ’<6ÿ’<6ÿ’<6ÿ’<6ÿ’<6ÿ’<6ÿ’<ÿƒÿ„"ÿ…5ÿƒF$ÿU4ÿ^BÿfPÿn\ù|wfóz€oîwˆwêu}çr•‚äpš…ãnžˆál¢‹àk§ßi«ŽÞh¯Ýg´‘Ýfº‘ÜeÁ’ÜeÉ’ÛeÐ’ÒgÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÿƒÿ„"ÿ…5ÿƒF$ÿU4ÿ^BÿfPÿn\ù|wfóz€oîwˆwêu}çr•‚äpš…ãnžˆál¢‹àk§ßi«ŽÞh¯Ýg´‘Ýfº‘ÜeÁ’ÜeÉ’ÛeÐ’ÒgÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÿƒÿ„"ÿ…5ÿƒF$ÿU4ÿ^BÿfPÿn\ù|wfóz€oîwˆwêu}çr•‚äpš…ãnžˆál¢‹àk§ßi«ŽÞh¯Ýg´‘Ýfº‘ÜeÁ’ÜeÉ’ÛeÐ’ÒgÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÿ„ÿ…"ÿ†5ÿ„F$ÿ€U4ÿ„]Cÿ…ePÿƒm]ø€uhò}~qìz†yèwåu“…âr˜‰àpŒßn¢ŽÝl¦Ük«’Ûi¯”Úhµ•Úg»•ÚfÖÚfÌ–ÓhÏ–ÌiÏ•ÈjÏ–ÈjÏ–ÈjÏ–ÈjÏ–ÈjÏ–ÈjÏ–ÈjÏ–ÈjÏ–ÿ…_õÒÿ‡"ÿ‡5ÿ…F$ÿ„T5ÿˆ\CÿˆdQþ‡k^÷ƒriñ€|së}…{çzŒ‚ãw’‡àt—ŒÞrœÜp¡’Ûn¦”Ùlª–Ùj°˜Øi¶™×h½™×hÆšÓhÌšÌjÌ™ÆkÌšÂlÌšÂlÌšÂlÌšÂlÌšÂlÌšÂlÌšÂlÌšÂlÌšÿ†ÿˆ!ÿˆ5ÿ†F%ÿ‡S5ÿ‹[CÿŒbQþŠj^ö‡qjð„ztꀃ}å}Š„âzŠÞv–Üt›’Úq •Øo¥˜Öm«šÕk°›Õj·œÔi¿ÔiÉÌkÊÆlÉÀmɽnɽnɽnɽnɽnɽnɽnɽnÉÿ‡ÿ‰!ÿŠ5ÿˆF%ÿŠR5ÿŽZCÿaQþŽh^ö‹ojï‡xué„~䀈†à|ŒÝy”‘Úvš•ØsŸ™Õp¥›ÔnªžÓm±ŸÒk¸ Òk¡ÍlÇ¡ÆnÇ¡ÀnÇ¡»oÇ¡¸pÇ¡¸pÇ¡¸pÇ¡¸pÇ¡¸pÇ¡¸pÇ¡¸pÇ¡¸pÇ¡ÿˆÿŠ!ÿ‹5ÿ‰F%ÿQ5ÿ’XCÿ’^Qþe^öŽlkï‹uvè‡~€ã„†ˆÞÛ{“”Øx™™ÕužœÓr¤ŸÑpª¢Ðn²£Ðmº¤ÎlÄ¥ÆoĤ¿pÄ¥ºqÄ¥µqÄ¥²rĤ²rĤ²rĤ²rĤ²rĤ²rĤ²rĤ²rĤÿ‰ÿ‹!ÿŒ4ÿŠF%ÿO4ÿ”VCÿ”[Qþ“a^ö‘hkîŽpvè‹{€â‡ƒ‰ÝƒŠ‘Ù~‘—Õz—œÓw Ðt¤£Ïqª¦Îo³§Ín½¨Çp¨¾qÁ©¸rÁ©´sÁ©¯t¨­t§­t§­t§­t§­t§­t§­t§­t§ÿŠÿŒ!ÿ4ÿ‹F&ÿ“N4ÿ–SBÿ—XPþ–^^ö”djî’lvçvጀŠÜ‡ˆ’Ø‚™Ó}•ŸÐyœ£Îu£§Ìr«ªËp´«Èp¿¬¿s¾¬·t¾­²u¾¬®v¿¬ªv¿«¨wÀª¨wÀª¨wÀª¨wÀª¨wÀª¨wÀª¨wÀª¨wÀªÿ‹ÿ ÿŽ4ÿE&ÿ–M3ÿ™PAÿšUOÿšZ]÷˜`iï•huè’p€á{ŠÜ‹„“Ö†ŒšÒ€“¡Î{š¦Ìw¢ªÊt«®Èr¸¯Àt¼¯·u¼°°v¼°«w¼¯¨x½¯¥y¾­£y¾­£y¾­£y¾­£y¾­£y¾­£y¾­£y¾­£y¾­ÿ‹ÿŽ ÿ4ÿD%ÿ˜J3ÿ›M@ÿQNÿW[øœ\hðšctè—jâ“uŠÜ€“ÖŠ‰›Ñ„£Í~˜©Éy¢®Çu­±Ätº³·v¹³¯x¹³ªyº³¦zº²£{»± {¼°Ÿ|½®Ÿ|½®Ÿ|½®Ÿ|½®Ÿ|½®Ÿ|½®Ÿ|½®Ÿ|½®ÿŒÿ ÿ4ÿ’C%ÿšH2ÿJ?ÿŸNMÿ SZù XfñŸ_rêœe}ã˜oˆÜ“z’Ö„›Ðˆ£Ë–«Ç{¡±Åv°µºw·¶¯y·¶¨z¸¶£|¸´ |¹³ž}º²œ~»±›~¼°›~¼°›~¼°›~¼°›~¼°›~¼°›~¼°›~¼°ÿÿ ÿ‘4ÿ”C$ÿ›F1ÿ H>ÿ¢KKÿ¤PXú¤Udó¤Zpë¢a{äŸi…Þšsו~™ÐŽˆ£Ê…“¬Ä} ´½x°¹¯yµ¹¦{¶¸¡}·¶~¸µ›¹´™º³˜€º²—€»±—€»±—€»±—€»±—€»±—€»±—€»±—€»±ÿÿ ÿ‘4ÿ—B$ÿC0ÿ¢E=ÿ¥HIÿ¨LUü©QaõªWlî©]wç¨cá¤m‹Öžy–Ë•ƒ¢À‹Ž­¶ƒš¶®~ª»¤|³¼ž~µºš€··˜¸µ–¹´•‚º³”‚º²“‚»±“‚»±“‚»±“‚»±“‚»±“‚»±“‚»±“‚»±ÿŽÿ‘ ÿ’4ÿ™A#ÿŸA/ÿ¤B;ÿ¨EGÿ¬ISþ®N^õ°Shì²Zrä³a{Û¯n„̦v”Àœ~¢´’ˆ®©Š”· …¤½™‚±¾•ƒ´»“„¶¸’„¸¶‘„¹´„¹³„º²„º²„º²„º²„º²„º²„º²„º²„º²ÿÿ’ ÿ“4ÿš?"ÿ¡?.ÿ§@:ÿ¬BEÿ°FPù³KZð·Rcè»Ykß½drѶl‚Ĭs“¶£z¡ª™ƒ®ž’·”Ÿ¾Ž‹±¿Œ‰³¼Œ‰µ¹Œˆ·¶Œˆ¸µŒ‡¹´Œ‡º³Œ‡º²Œ‡º²Œ‡º²Œ‡º²Œ‡º²Œ‡º²Œ‡º²Œ‡º²ÿÿ’ÿ”4ÿœ=!ÿ£<-ÿª=8ÿ¯@Bÿ´DLõºIUì¿Q\äÆZaØÅboɼi»²p’­ªw  ¡€­“›‹·‰–›½ƒ•¯¿„‘³¼†Žµ¹‡¶·‡Œ·¶ˆ‹¸µ‰Š¹´‰Šº²‰Šº²‰Šº²‰Šº²‰Šº²‰Šº²‰Šº²‰Šº²ÿÿ“ÿ•4ÿž; ÿ¥9+ÿ¬:5ÿ³=?ûºBGñÁHNèÉQRßÑ[YÏÊ`mÁÂg€²¹m¤±tŸ—ª}«Š¤ˆµ —»xŸ¬¾|𳼕´º’¶¸ƒ··„¸µ„¹³…º²…º²…º²…º²…º²…º²…º²…º²ÿ‘ÿ”ÿ–3ÿ 8ÿ¨6)ÿ°82ÿ¸:;öÀ?AìÊGEãÖTEÖÙWXÇÐ^k¸Èd~ªÁkŽœºrœŽ´z¨€®…²v«”¸o«©ºr¥µºwµ¹z™¶·}–·¶~“¹´‘º²€»±€»±€»±€»±€»±€»±€»±€»±ÿ’ÿ•ÿ—3ÿ¢5ÿ«3'ÿ´4/ù¾65íÉ=8âÖH8ÙàMEÍßVV¿Ø\i°Ðb{¡Éh‹“Ão™…¾w¤xºƒ­n¸“³h¸¨¶i²¸¶o§·¶s¡¸µvœ¹´x™º³z–»±{•¼°{•¼°{•¼°{•¼°{•¼°{•¼°{•¼°{•¼°ÿ“ÿ–ÿ™3ÿ¥0ÿ¯0#ýº/)ðÆ2-ãÔ;,Öà@:ËåHLÀáN\³ÝVl¥Ø]z˜ÒeˆŠÎm”}ÉvŸsă§lÀ‘¬g¾¡¯e¾¶¯f´»±k«»±n¥»±q ¼°s½¯tš½®tš½®tš½®tš½®tš½®tš½®tš½®tš½®ÿ”ÿ˜ÿ1ÿ©-ÿ´*õÂ)"äÑ-!Õà3,ÉèX—ñFe‹ëOpåXzzßd‚sÚmˆmÖvhÓ’dЈ•`Ï’˜^Ι\Í©š[ι™YÍÈšZÅÊœ\½É^¸Éž^¸Éž^¸Éž^¸Éž^¸Éž^¸Éž^¸Éž^¸Éžÿš ÿŸÿ¬ø¾ØÖ Èèºô"'®ú-9¢ú6J–ú?X‹õHc‚îRmzè\uräd{màm€hÝu…dÚ~ˆ`؆‹]ÖZÕ˜XÔ¢WÔ®‘VÔ¼VÔÍVÍÑ’WÈÑ“WÈÑ“WÈÑ“WÈÑ“WÈÑ“WÈÑ“WÈÑ“WÈÑ“ÿœ ÿ£ÿµÔÉ ÈÚ ¹ô¬ÿ#*¡ÿ.;•ÿ8I‹ÿBU‚øL_zòVgsî^mkêdrfçlwbätz_â|}\áƒZß‹‚WÞ“ƒUÝœ…TÜ¥†Rܯ†RÜ»†QÜÌ…RÚÚ…RÚÚ…RÚÚ…RÚÚ…RÚÚ…RÚÚ…RÚÚ…RÚÚ…ÿ  ÿ­ÔÀÆÎ¹ã «ÿŸÿ$*”ÿ09Šÿ:EÿFOzýQXrøX^kõ^ceòeh`ïlk]írnZëypWê€rUé‡tSçvQæ–wPæžxNå§yMå¯zMä»zLäÅzLäÅzLäÅzLäÅzLäÅzLäÅzLäÅzLäÅzÿ¤ظÄÄ·Óªó žÿ“ÿ'(‰ÿ35€ÿ??yÿJGpÿQNiÿWSbý]W^ûd[Zùj^W÷p`TövbRô|dPóƒeNòŠgLñ‘hKð˜iJðŸjIï§kHï°lGî·lGî·lGî·lGî·lGî·lGî·lGî·lGî·lݯżµÊ¨Ûœÿ ‘ÿ‡ÿ*#~ÿ6-vÿA6mÿHÿk2<ÿp3:ÿu49ÿz57ÿ€66ÿ†75ÿŒ83ÿ”83ÿ˜93ÿ˜93ÿ˜93ÿ˜93ÿ˜93ÿ˜93ÿ˜93ÿ˜9§Ã—Ôˆä€ÿ rÿgÿ_ÿ Wÿ& Qÿ/Lÿ7Gÿ>CÿE@ÿK=ÿP;ÿU9ÿY7ÿ^!5ÿb"4ÿg#2ÿl$1ÿr%/ÿw&.ÿ}'-ÿ„(+ÿ‹)+ÿ‘)+ÿ‘)+ÿ‘)+ÿ‘)+ÿ‘)+ÿ‘)+ÿ‘)+ÿ‘)ÿvÿs ÿr1 ÿqCÿqP&ÿuY3ÿub?ÿsjIÿptSÿn~[ük‡aùigög–kôeœnòc¡qñb¦sïa«uî`°vî^µwí^»xì]Ãyì\Ëzë[Øzæ]Þzß^áyØ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÿ¼GœÕ`ãyÿvÿs ÿr1 ÿqCÿqP&ÿuY3ÿub?ÿsjIÿptSÿn~[ük‡aùigög–kôeœnòc¡qñb¦sïa«uî`°vî^µwí^»xì]Ãyì\Ëzë[Øzæ]Þzß^áyØ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÿvÿsÿt1 ÿrBÿtO'ÿxX3ÿy`?ÿwiJÿsqTÿq|\ûn†c÷kŽiôi”mòg›qðe tïd¥víbªxìa°yë`µ{ë_¼|ê^Ä}ê]Í}ç]Ù}á_Þ}Ú`à|Ñbá}Ïbá}Ïbá}Ïbá}Ïbá}Ïbá}Ïbá}Ïbá}ÿwÿtÿu1 ÿsBÿwM'ÿ{V4ÿ|_@ÿzgKÿwoUþsz^úqƒeönŒkók“pði™sîgŸwìe¥yëdª{êb¯}éaµ~è`½è_Å€è^Ðâ_Ú€ÛaÞ€Òb߀ËcßÊdßÊdßÊdßÊdßÊdßÊdßÊdßÿxÿuÿv1 ÿtBÿzL'ÿU4ÿ€]@ÿ~eLÿznVþvw_ùtfõpŠmñm‘rîk˜vìižyëg¤|ée©~èc¯€çb¶‚æa½ƒæ`Ç„å_Ó„ÝaÚ„Óc݃ÌdÜ„ÆeÜ„ÅeÜ„ÅeÜ„ÅeÜ„ÅeÜ„ÅeÜ„ÅeÜ„ÅeÜ„ÿyÿvÿw0 ÿvBÿ~K'ÿ‚S4ÿƒ\@ÿ‚dLÿlVýzt`øwhósˆoðptím–yêk|èh£çf©‚åe¯„äc¶…äb¿‡ãaɇàaÕ‡ÕdÚ‡ÍeÚˆÇfÙˆÁgÙˆ¿gÙˆ¿gÙˆ¿gÙˆ¿gÙˆ¿gÙˆ¿gÙˆ¿gÙˆÿzÿxÿy0 ÿxAÿI'ÿ†R3ÿˆZ@ÿ‡bLÿƒiWü~qa÷{{iòw…qîswëp”|èm›€æj¢ƒäh¨†ãf¯ˆâd·ŠácÁ‹áb΋ØdÖ‹ÍfÖ‹ÆgÖŒÀhÖŒ»iÖŒºiÖŒºiÖŒºiÖŒºiÖŒºiÖŒºiÖŒºiÖŒÿ{ÿyÿz0 ÿ|?ÿ…H&ÿŠP3ÿŒX@ÿ‹_LÿˆgWü„naöxjñ{‚ríwŠyés’~æo™ƒäl¡‡âj¨Šàg¯Œße¸ŽÞdÄÛdÒÎgÓÆhÓ¿jÓºkÓµlÓ´lÓ´lÓ´lÓ´lÓ´lÓ´lÓ´lÓÿ|ÿzÿ{0 ÿ>ÿ‰F&ÿN2ÿ‘V?ÿ]KÿŽdVü‰kaö„skð~sì{‡zèvär—†ánŸŠßk§ŽÝh°Üf»’ÛeÊ“ÐhÑ“ÆjД¾kД¸lД³mД¯nÑ“®nÑ“®nÑ“®nÑ“®nÑ“®nÑ“®nÑ“®nÑ“ÿ}ÿ{ÿ|/ ÿƒ<ÿE%ÿ“M1ÿ•S>ÿ”YJÿ’`Uýh`öŠpjð„ytëƒ|æzŒƒâu•ˆßqžÝm§‘Ûi±”Ùg¿–ÔgΗÇk͘½l͘¶n͘°o͘¬pΗ©qΖ¨qÏ–¨qÏ–¨qÏ–¨qÏ–¨qÏ–¨qÏ–¨qÏ–ÿ~ÿ|ÿ~/ ÿ†;ÿ‘C$ÿ–K0ÿ˜P<ÿ˜UHÿ–\Tý“c_÷kiðŠtsë„|æ~‰„áx’‹ÝsœÚn¦•Øj³™ÖhÅ›ÉkË›½nÊœ´oÊœ®qÊœªrË›¦sËš£sÌ™¢t͘¢t͘¢t͘¢t͘¢t͘¢t͘¢t͘ÿÿ}ÿ/ ÿ‰:ÿ”B#ÿ™G/ÿ›L;ÿœRFÿ›XRÿ™_]ø•fhñnrëŠy{僄„à|ŒÜvš“Øo¦™ÒkµÎjÈŸ¾nÈŸ³qÇ ¬rÇ §tÈŸ£uÉž vÊžvË›vËšvËšvËšvËšvËšvËšvËšÿ€ÿ~ÿ€/ ÿŒ8ÿ—@"ÿœD-ÿŸI9ÿ NDÿ UOüž[Zõœbeî—joè‘tyáŠƒÙƒŠŒÏ{••Èu œÃp®¡¾o¿£³rÅ£ªtÅ£¤vÅ£ wÆ¡xÇ ›xÈž™yʘyÊœ˜yÊœ˜yÊœ˜yÊœ˜yÊœ˜yÊœ˜yÊœÿ€ÿÿ/ ÿ7ÿš?!ÿŸB,ÿ¢F7ÿ¤LBÿ¤RL÷¤XWï£_aç fkàšquÕ“|ËŠ…–»{šžµv§¤°t¸§¨v§¡xæyÄ¥šzÅ£˜{Æ¢–{Ç ”{Éž”|É”|É”|É”|É”|É”|É”|Éÿÿ€ÿ‚.ÿ‘6ÿœ< ÿ¡@*ÿ¥D4ÿ¨J?ú©PIòªVRêª]\â©ff×¢orË™xÁ¸ˆŠ—¯• ¨|¢¦£z²©žzÁ©™|Á¨–}æ”~Ĥ’~Å£‘~Ç¡~ÈŸ~Éž~Éž~Éž~Éž~Éž~Éž~Éžÿ‚ÿÿ„. ÿ”5ÿž:ÿ¤>(ÿ¨B2ÿ¬G;ö¯MDí±TMå³[UܰeaΨlqßt€¸–|®†˜¥ˆ‘¡ƒ§—€­«“€¿«‘Á©Â§ŽÃ¥Å£Æ¢ŒÈŸŒÈŸŒÈŸŒÈŸŒÈŸŒÈŸŒÈŸŒÈŸÿ‚ÿÿ†- ÿ–4ÿ 9ÿ¦<&ÿ«@/û°E8ò´K?é¹SFá½\MÓ¶b`Æ­ip»¥q°yŒ¥•‚—›¡“Š™§Œ‡©«ˆ‡¿¬ˆ‡Àªˆ†Â¨ˆ…戅Ťˆ„Æ¢ˆ„È ˆ„ÈŸˆ„ÈŸˆ„ÈŸˆ„ÈŸˆ„ÈŸˆ„ÈŸˆ„ÈŸÿƒÿ‚ÿˆ+ ÿ™2ÿ¢7ÿ©9$ÿ¯=,÷µB3í»I9åÂR>ÚÂXL̺`_¿²go³«n~¨£v‹œ~—’—‰ ‰’–§‚¥«~º¬€Àª‹Â¨‚ŠÃ¦ƒ‰Å¤ƒˆÆ¢„‡È „‡ÈŸ„‡ÈŸ„‡ÈŸ„‡ÈŸ„‡ÈŸ„‡ÈŸ„‡ÈŸÿ„ÿƒÿ‹* ÿœ1ÿ¥4ÿ¬6!þ³:(ó»@-éÃH1áËQ7ÒÇVKÅÀ^]¸¸en¬±l} ªsŠ”¤{•ŠŸ†ž€›’¥y˜¢ªt˜·«w•Á©z‘§|Ã¥}Å£~ŒÆ¡ŠÈŸŠÈŸŠÈŸŠÈŸŠÈŸŠÈŸŠÈŸŠÈŸÿ…ÿ„ÿŽ( ÿŸ1ÿ§2ÿ°3ù¹6"îÂ=&æÍG&ÛÓL5ËÌTI¾Å\[±¾cl¤¸jz˜²q‡Œ¬y“¨‚œw¤£p¢Ÿ§l¢´¨nŸÂ§r™Ã¦u•Ĥw’Æ¢xÇ¡zŽÈŸzŽÉžzŽÉžzŽÉžzŽÉžzŽÉžzŽÉžzŽÉžÿ†ÿ…ÿ‘& ÿ¡/ÿ«.ÿµ/ô¿2éË:ßÙDÑÚJ3ÄÒRG·ËZY©ÆaiœÀgxºn„„¶vy²€˜o¯Ÿh­£d­²¤eªÅ¤j¢Å£mÆ¢p™Ç¡r–ÈŸt“Éu“Êu“Êu“Êu“Êu“Êu“Êu“Êÿ‡ÿ‡ÿ•$ ÿ¤+ ÿ¯)ú»)ìÈ,ÞØ7ÓáAÉßI0¼ÚQD¯ÓXV¡Í_f”ÈetˆÄl€|ÀtŠq½“i»Œ™b¹œ^º±ž]¸Éžb®ÈŸf¦ÈŸi¡ÉžkÊnšË›n™Ë›n™Ë›n™Ë›n™Ë›n™Ë›n™Ë›n™Ë›ÿˆÿ‰ÿš#ÿ¨' ÿµ" ñÄ àÕ$ Ñá0Çæ=$½ãF4²àND¦ÜVR™×]aŒÒco€ÏkztÌs„kÊ~‹bÈŒ‘\Èœ•Yȱ–WÈΖ[»Í˜^²Ì™a«Ì™d¦Í™g¢Í˜g Í—g Í—g Í—g Í—g Í—g Í—g Í—ÿŠÿ‹ÿŸ!ÿ® ø½ãÑÐá Åê.ºé:)°çC9¤äJH˜âPVŒàWb€Ý_lvÛhulÚr}cØ~ƒ\ØŒˆWØ‹T×°TØÍŒUËÓWÀÒ‘Z¸Ñ“\²Ñ“_¬Ñ“`ªÑ“`ªÑ“`ªÑ“`ªÑ“`ªÑ“`ªÑ“`ªÑ“ÿŒÿÿ¥ÿµÚÊ ÐáÄë ¸ï,­î7.¢ì@=—ëHJŒéOVèV`vç^ilçepdæpw^ã||Yà‰€VÞ—ƒSݦ„Qܸ…QÝÔ„SÐÚ‡TÆØ‰V¿×ŠX¸Ö‹Y¶Ö‹Y¶Ö‹Y¶Ö‹Y¶Ö‹Y¶Ö‹Y¶Ö‹Y¶Ö‹ÿŽ ÿ—ÿ­Ù¿ ÌÎ Ãë¶õ«õ,!¡ô70–ó@>‹óHJóPTwóW]mó]deðfj_ípnZêzrVç…vSå‘yQäž{Oã¬|Mã½|MãÙ|PØà|QÎàRÆÞSÄÞSÄÞSÄÞSÄÞSÄÞSÄÞSÄÞÿ’ ÿ  Û·ÊÃÀÒ µô©ûŸü,#”ü71ŠüA=ýIGxýQPnýWWeú^\`öfa[ôoeVñxhSï‚kPîŒmNì—oLë£qJê°rIêÁrHêØrKãärNØæsNÕçtNÕçtNÕçtNÕçtNÕçtNÕçtNÕçtÿ– Þ¬˺½Ç²Ø§ÿœÿ!’ÿ.#‰ÿ9/€ÿB9wÿJBmÿPIeÿVN_ÿ^SZþeVUümZRúu\Oø~_L÷‡aJõ‘bHôœdFó¦eEò³fDòÁgCòÔgEîçgFëègFëègFëègFëègFëègFëègFëègî¢Í´¼¾¯Í¤Þšÿ ÿ$‡ÿ0 ~ÿ;*tÿB2kÿH9cÿN?]ÿUCXÿ]GSÿdJPÿkMMÿrOJÿyQGÿ‚SEÿ‹TCþ”VAýžW@ý¨X?ü³Y>ü¿Z>ûÑZ=ûÛZ=ûÛZ=ûÛZ=ûÛZ=ûÛZ=ûÛZ=ûÛZÒ­½¸®Å¡Õ–÷ ÿ„ÿ&|ÿ1qÿ8"hÿ>)`ÿE/ZÿL3TÿS7PÿZ:Lÿ`Fÿm@DÿtBAÿ{C?ÿƒE=ÿŒF;ÿ•G:ÿžI9ÿ§J8ÿ±J7ÿ¾K7ÿÂK7ÿÂK7ÿÂK7ÿÂK7ÿÂK7ÿÂK7ÿÂK¿³®¾ Í’Þ‰ÿ ÿwÿ# mÿ*dÿ1\ÿ8Uÿ@"PÿH&LÿO)HÿU+Dÿ[-Bÿa/?ÿg1=ÿm2;ÿs39ÿz57ÿ‚65ÿ‹73ÿ”82ÿœ91ÿ¤:0ÿ¯;0ÿ²;0ÿ²;0ÿ²;0ÿ²;¬¢ª0ÿ²;0ÿ²;0ÿ²;°¸ Ç‘Ø„ï|ÿ oÿfÿ^ÿ! Vÿ)Pÿ2Kÿ:FÿABÿH?ÿN<ÿS9ÿY 7ÿ^!5ÿd"3ÿi#1ÿp$/ÿw%-ÿ~&,ÿ‡'*ÿ()ÿ—)(ÿ *(ÿ£*(ÿ£*(ÿ£*(ÿ£*(ÿ£*(ÿ£*(ÿ£*¡Â‘Ñ‚áxÿlÿ`ÿ WÿOÿHÿ Cÿ)?ÿ1 ;ÿ8 8ÿ>5ÿD2ÿI0ÿN.ÿS,ÿX*ÿ])ÿc'ÿi%ÿo$ÿw"ÿ~!ÿ…ÿÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿhÿd#ÿ_/ÿ^@ÿcKÿgT%ÿh]/ÿfg9ÿdrAÿb}Hÿ`‡Nÿ]Rÿ[˜VÿZžYÿX¤[ÿWª]þV°_ýUµ`üT¼aüTÄbûSÍcùRÜcöRæcñSêcìTícæVïbàWðcàWðcàWðcàWðcàWðcàWðcàWðcÿiÿe#ÿ`.ÿ_@ÿfIÿjS%ÿk\0ÿie:ÿgpBÿd{Iÿb…Oÿ_ŽTÿ]–Xÿ[[ÿZ£]ýX©_üW¯aûVµbúU¼dúUÄeùTÎe÷SÝfóSæfîUêfçVíeáXîeÛYïfÛYïfÛYïfÛYïfÛYïfÛYïfÛYïfÿjÿf"ÿa.ÿ`?ÿiHÿmQ&ÿn[0ÿld:ÿinCÿgyKÿdƒQÿaŒVÿ_•Zÿ]œ]ý[¢`ûZ©búY¯dùXµeùW¼gøVÅh÷UÏhõTàiðUæiéWêhâYìhÛZíiÓ[îiÓ[îiÓ[îiÓ[îiÓ[îiÓ[îiÓ[îiÿjÿg"ÿb.ÿc>ÿlFÿqP&ÿrY1ÿpb;ÿlkDÿivLÿgRÿd‹Xÿa“\ý_›`û]¡bú[¨eùZ®gøYµh÷X¼iöWÆjõVÑkòUálìWçläYékÜ[ëkÔ\ìlÍ]ílÍ]ílÍ]ílÍ]ílÍ]ílÍ]ílÍ]ílÿkÿh!ÿc-ÿg<ÿpEÿtN&ÿvW1ÿt`;ÿpiEÿmsMÿj~TÿfˆZþc‘^ûa™bù_ eø]§hö\­jõZ´lôY½môXÇnòWÔoîWâoæYæoÝ\énÓ]êoÍ^ëpÇ_ëpÇ_ëpÇ_ëpÇ_ëpÇ_ëpÇ_ëpÇ_ëpÿlÿi!ÿe-ÿk:ÿtCÿyL&ÿzU1ÿy]<ÿufEÿppNÿm{Vÿj…\üfaúd—e÷aŸhö_¦kô]­mó\´oòZ½qñYÉrïXÚsèZãsÞ]ærÓ^èsË_ètÆ`ètÁaètÁaètÁaètÁaètÁaètÁaètÁaètÿmÿj ÿf-ÿo8ÿxAÿ}J%ÿR1ÿ~[<ÿ{cFÿvlOÿqwWþm‚^ûjŒcøf•hõdlóa¤oò_¬qð]´sï\¿uî[Ëvê[Ýwà]ãvÓ`åwÊaåxÄbåx¾cåxºdåxºdåxºdåxºdåxºdåxºdåxºdåxÿnÿk ÿh,ÿs6ÿ}?ÿ‚G%ÿ„P0ÿ„X;ÿ`Eÿ|iOÿvrWþq}_ùmˆeöj’jóf›oñc£rïa«uí_µxì]Áyì\Ðzã]ß{Ôaâ{Êbâ|Âdá}¼eá}·fâ|³gâ|³gâ|³gâ|³gâ|³gâ|³gâ|³gâ|ÿpÿlÿi,ÿw4ÿ<ÿ‡E$ÿŠM/ÿ‰U:ÿ‡]Eÿ‚eOÿ|nXývx`ør„gõmŽmñi˜rïf¡vìc«yë`¶|é^Ä~ç^ØØaß~Êc߀ÁeÞ¹gÞ´hÞ°i߀¬i߬i߬i߬i߬i߬i߬ißÿqÿmÿk+ÿ{2ÿ†:ÿŒC"ÿK-ÿS8ÿZCÿ‰bMÿƒiWý|r`øvgôqŠnðl•tíhŸyêdª}èa·€æ_È‚ÝaÛƒÌdÜ„ÀfÜ…¸hÛ…±jÛ…­kÜ„©l݃¦lÝ‚¦lÝ‚¦lÝ‚¦lÝ‚¦lÝ‚¦lÝ‚¦lÝ‚ÿrÿoÿo)ÿ0ÿŠ8ÿ‘A!ÿ”J,ÿ•Q6ÿ“XAÿ`Kû‹gUõ„o_ð}zgëw…oçrvãm›|Þh¦Úe³„ÕcĆÏdÚ‡ÁgÙˆ·i؉¯k؉ªmÙˆ¦nÚ‡£nÚ† oÛ… oÛ… oÛ… oÛ… oÛ… oÛ… oÛ…ÿrÿpÿr(ÿ‚. ÿŽ6ÿ•@ÿ™H)ÿ™O4ÿ˜U>ú–\Iô’dSíŒk]ç…vfáoÛxŒwÓr–~Ím¡„Éj­‰Åh»‹ÁhÐŒ¶kÕ®mÕ§oÖŒ£pÖ‹ŸqØŠqÙ‰›rÚ‡›rÚ‡›rÚ‡›rÚ‡›rÚ‡›rÚ‡›rÚ‡ÿsÿpÿu&ÿ†, ÿ‘6ÿ™@ÿœF'ÿL1üR;ôœYEí™`Oæ”hYߎscÕ†}n͇xÆx‘€Às›‡»o§Œ¶m´³lÈ‘¬nÒ‘¥pÓ rÔœsÕ™tÖŒ—tØŠ–uÙ‰–uÙ‰–uÙ‰–uÙ‰–uÙ‰–uÙ‰–uÙ‰ÿtÿqÿx$ÿ‰+ ÿ•5ÿœ>ÿ C$ÿ¢I.÷£P7ï¢VAç¡]JßgTÔ•obËxnÃ…‚y»Œ‚µy–‰¯u¡Žªr¯’¦qÁ”¡sДœtÑ’˜vÒ‘–wÓ”wÕ’wÖŒ‘xØŠ‘xØŠ‘xØŠ‘xØŠ‘xØŠ‘xØŠ‘xØŠÿuÿrÿ{#ÿŒ) ÿ˜4ÿŸ<ÿ£A"û¦F*ò¨M3ê©T<â©[D×£cSÌšlb“unº‹~y²…‡ƒª‘Ф{œžxª”šv»–—wÏ–”yД‘zÑ’zÓŽzÔzÕŒz׋Œz׋Œz׋Œz׋Œz׋Œz׋Œz׋ÿuÿsÿ}!ÿŽ) ÿ›4ÿ¢9ÿ¦>÷ªD&î®J.å±R5ܯYAϨaRÅ ia»˜rn±‘zy©‹ƒƒ¡…‹š˜‘”~¥–|¶˜}Í—Œ~Ï•Š~ГŠ~Ò‘‰~Ó‰}Õˆ}Ö‹ˆ}Ö‹ˆ}Ö‹ˆ}Ö‹ˆ}Ö‹ˆ}Ö‹ˆ}Ö‹ÿvÿtÿ€ ÿ‘( ÿž3ÿ¤7þª;ó¯A"ê´H(â¹P.Ô´V@É­_Q¾¥g`´žomª—wx¡‘€‚™ŒŠ‹‘‡•‘‹„¢–†ƒ²™ƒ„˘„ƒÎ–„ƒÐ”„‚Ò’„Ó„ÔŽ„€ÖŒ„€ÖŒ„€ÖŒ„€ÖŒ„€ÖŒ„€ÖŒ„€ÖŒÿwÿtÿ‚ÿ”'ÿ 2 ÿ§4ú®8ïµ=æ¼F!Ü¿L,ιT?ñ]P·ªe_­¤ll£tw™˜|‘“†Š‰’‘‚ŒŸ–}Н˜z‹Ç˜|‰Î–}ˆÐ”~†Ò’…Ó„ÔŽ€ƒÖŒ€ƒÖŒ€ƒÖŒ€ƒÖŒ€ƒÖŒ€ƒÖŒ€ƒÖŒÿxÿuÿ…ÿ—&ÿ£/ ÿ«0õ³4ë»:âÄDÕÄH+ȽS=¼¶[N±°c]¦ªjjœ¤qv’Ÿz€‰šƒ‰–Žy“œ•t’¬—q’Øs‘Ï–vŽÐ”x‹Ò‘yŠÓzˆÕŽ{‡ÖŒ{‡ÖŒ{‡ÖŒ{‡ÖŒ{‡ÖŒ{‡ÖŒ{‡ÖŒÿxÿvÿˆÿš%ÿ¦+ þ¯, ñ¹/æÃ6ÝÍ<ÎÈG)ÂÂQ;¶¼YLª¶a[Ÿ°hh•«ot‹¦w~¢€†yŸ‹qœ™’l›©•i›¿–k™Ð”n”Ñ’q‘Ò‘sÔuÕv‹Ö‹v‹Ö‹v‹Ö‹v‹Ö‹v‹Ö‹v‹Ö‹v‹Ö‹ÿyÿxÿŒÿž#ÿª&ø´%ëÀ(áÍ0ÔÒ7ÈÍE'»ÈO9¯ÂWJ£½_X˜¸fe³mqƒ¯u{z«~ƒq¨‰Šj¦–e¥§’b¦½’c£Ò‘gÓj˜Ôm•Õn’ÖŒpØŠpØŠpØŠpØŠpØŠpØŠpØŠÿ{ÿ|ÿÿ¢!ÿ® ò»åÊÚÛ$ÌÙ5ÀÓC$´ÎM6¨ÉUGœÄ]U‘Àdb†¼km{¸svrµ|~j³‡…c±•Š^°¥Œ[±¼[¯Õ_§Õc¡ÖŒfœ×‹h™ØŠj–Ùˆj–Ùˆj–Ùˆj–Ùˆj–Ùˆj–Ùˆj–Ùˆÿ|ÿÿ•ÿ§üµëÆÚÛÍà%Ãß6¸ÛA!¬ÕK3 ÑSC”ÍZQ‰Éb]~ÆigtÃqpkÁ{xd¿†~]¾”‚X½¥…V¾»†U½Û†X³Ú‡\«Ú‡_¦Ú‡a¡Û†cÛ…cÛ…cÛ…cÛ…cÛ…cÛ…cÛ…ÿ~ÿ‡ÿšÿ­Ú¾ ÑÍ ËäÁä%·ã5­á@!£ÞI/—ÛR>‹×YK€Ô`WvÑhamÏpieÍzp^̆uXÌ•yȚ{Qͼ|PÌâ|SÁàU·ß€X±ÞZ«Þ\¦ß\¦ß\¦ß\¦ß\¦ß\¦ß\¦ßÿ€ÿŽÿ¢ ÛµÎÁÆÐ ¾é´é% ªè3 æ>%–åG2‹ãN?€áUIvà]SmÞf[eÝoa^ÝzgX܆kSÜ•oPݦqMÞ»rMßáqNÑçtPÆæwR¾äxS¸äyU²ãzU²ãzU²ãzU²ãzU²ãzU²ãzU²ãzÿƒÿ– Ý«͸ÂÄºÔ ±ï§î% žî3”í='ŠìF3€ëN>vëUGlê[NdêcU]êmZXêw^SêƒbNê‘eJë¡gGì³iFíÐiHæèiKÙëjLÏìmNÇëoOÀêpOÀêpOÀêpOÀêpOÀêpOÀêpOÀêpÿ‰ é бÁ¼·É®Ú ¤õ›õ'’õ4ˆö>'öG2vöN;löTBdöZH]öbMWökQRöuUM÷€XHøZEø›\Bø«^A÷¾_@÷ß`Cîì`Gãñ_HÛñaIÒòcIÒòcIÒòcIÒòcIÒòcIÒòcIÒòcþ•ԩµµÁªÏ ç ˜ýþ)†ÿ5~ÿ@%tÿF-kÿL5cÿR:\ÿY?Vÿ`CPÿhGLÿqJGÿ{LCÿ‡N@ÿ”P>ÿ¡R=ÿ°T;ÿÃU;þáU<ùðU@ðôUCç÷TCç÷T]RÊÈCç÷TCç÷TCç÷TCç÷TCç÷Tۡ۵º¨ÇÖ“ü‹ÿƒÿ+zÿ5qÿ<hÿB&`ÿI,YÿO1SÿV5Nÿ]8Iÿe;Eÿm=Aÿv?>ÿ€A;ÿ‹C9ÿ˜E8ÿ¤F6ÿ²G5ÿÄH5ÿÝI4ÿðI7þøI7þøI7þøI7þøI7þøI7þøI7þøIÉ«¶´¨Á›ÏŽß‡ÿ~ÿuÿ' lÿ/dÿ7\ÿ>VÿE"PÿK%KÿR(FÿX+Aÿ_->ÿg/;ÿo18ÿx36ÿ‚43ÿ61ÿ™70ÿ¥8/ÿ²:.ÿÀ;.ÿÓ;-ÿë<-ÿë<-ÿë<-ÿë<-ÿë<-ÿë<-ÿë<¸°¨¼šÉŒÙõyÿnÿeÿ^ÿ' Wÿ0Qÿ7Kÿ>FÿEAÿL=ÿR9ÿX6ÿ_!4ÿf"1ÿn$/ÿw%-ÿ€&+ÿŒ()ÿ—)(ÿ¢*'ÿ­+&ÿ¹,&ÿÉ-&ÿÉ-&ÿÉ-&ÿÉ-&ÿÉ-&ÿÉ-&ÿÉ-ª·šÅ‹Ó}âuÿiÿ _ÿWÿPÿIÿ&Dÿ. ?ÿ6 ;ÿ= 7ÿC3ÿI0ÿO.ÿU,ÿ[*ÿb'ÿi%ÿr#ÿ{!ÿ†ÿ‘ÿœÿ¥ÿ°ÿ°ÿ°ÿ°ÿ°ÿ°ÿ°œÀŒÎ|ÞpõeÿZÿQÿ IÿCÿ=ÿ8ÿ&4ÿ-0ÿ3-ÿ9*ÿ>'ÿC%ÿI #ÿN !ÿT ÿZ ÿa ÿi ÿr ÿ| ÿ† ÿÿšÿšÿšÿšÿšÿšÿšÿ\ÿW&ÿQ2ÿN<ÿWEÿ[Nÿ\X"ÿ[c+ÿYo2ÿWz8ÿT…=ÿRAÿP™EÿO GÿN§IÿM®KÿL´LÿK»MÿJÃNÿIÍOÿIÝPÿHéPÿHòPûIöPöKùPðMûOêOûPçOüPçOüPçOüPçOüPçOüPçOüPÿ\ÿX&ÿR2ÿQ:ÿZCÿ_Mÿ_W#ÿ^a+ÿ\m3ÿYy:ÿW„?ÿTŽCÿR—GÿPŸIÿO¦KÿN­MÿM´OÿL»PÿKÃQÿKÎRÿJßRÿIêSýJòSøKöSñMøRëOúRåPúSâQúSâQúSâQúSâQúSâQúSâQúSÿ]ÿY&ÿS1ÿT9ÿ]BÿbKÿbU#ÿ`_,ÿ_k4ÿ\w;ÿY‚@ÿVŒEÿT•HÿRžKÿQ¥NÿP¬OÿO³QÿN»RÿMÄSÿLÏTÿKàUÿKëUúLòUôMöUìPøTæQøUßRùVÜSùVÜSùVÜSùVÜSùVÜSùVÜSùVÿ^ÿZ%ÿT1ÿX7ÿa@ÿeIÿfS#ÿd]-ÿbh5ÿ_t<ÿ\BÿYŠGÿV“KÿTœNÿS¤PÿQ«RÿP³TÿOºUÿNÄVÿMÐWÿMâXüLíXöNòXîPõXæSöXßT÷Y×UøYÓUøYÓUøYÓUøYÓUøYÓUøYÓUøYÿ_ÿ[%ÿU0ÿ\4ÿe=ÿjGÿkQ$ÿiZ-ÿfd6ÿcp=ÿ_|Cÿ\‡IÿY‘MÿWšPÿU¢SÿSªUÿR²WÿQºYÿPÅZÿOÒ[üNä[øOí\ðQò[çTô[ÞUõ\ÕVö]ÎX÷]ËX÷]ËX÷]ËX÷]ËX÷]ËX÷]ËX÷]ÿ`ÿ\$ÿV/ÿ`2ÿj;ÿoDÿpN#ÿoW-ÿka6ÿgl>ÿcxEÿ`ƒKÿ\ŽOÿZ˜SÿW VÿV©YÿT±[ÿSº\þQÆ^üPÖ_ùPç_òRî_çUñ_ÝWò`ÒXóaËYõbÅ[õbÃ[õbÃ[õbÃ[õbÃ[õbÃ[õbÃ[õbÿaÿ]#ÿZ-ÿe/ÿo8ÿtAÿvK#ÿuT-ÿq]6ÿlg?ÿhsFÿdLÿ`ŠRÿ]•VÿZžYÿX§\þV°_ýTº`üSÇbùRÜcóSècéUîcÞXðdÐZñeÈ\òfÂ]òf½^òf»^òf»^òf»^òf»^òf»^òf»^òfÿbÿ^#ÿ^*ÿi-ÿt5ÿz>ÿ|H"ÿ{Q,ÿxZ6ÿsc?ÿmmGÿizNÿd†Tÿ`‘Xÿ]œ\ýZ¥`ûX°búV»eøUÊfõTàgìVêgßZígÐ\ïiÆ]ïj¿_ïj¹`ïjµaïj³aïj³aïj³aïj³aïj³aïj³aïjÿcÿ`"ÿb'ÿn*ÿy2ÿ<ÿ‚F!ÿ‚O+ÿX5ÿ{`>ÿuiGÿotNûjUøfŒ[õb—_ó_¡cð\«fîZ¶iìYÄjéXÚkáZêkÐ]ìmÅ_ìn¼aëo¶bìo±cìn­dìn«dím«dím«dím«dím«dím«dímÿdÿa"ÿf%ÿr'ÿ~0 ÿ…;ÿˆEÿˆM)ÿ†U3ÿ‚^=û}fFövpNòr|Uîm‡\êh’bædœfãa¦jà_²mÝ]¿oÚ]ÓpÒ^êpÄ`érºbès³dès­eés©fér¦gêq¤gêp¤gêp¤gêp¤gêp¤gêp¤gêpÿeÿb!ÿi#ÿw%ÿ‚/ ÿŠ9ÿŽCÿL&ÿS0ùŠ[:ó…cDílMèywUãt‚]ÞncÙi—iÓf¡nÏc¬qËa¹tÈaÊuÅaåv¹dæw°fåwªhæw¥iæv¢jçuŸjèsžkésžkésžkésžkésžkésžkésÿfÿc!ÿm ÿ{#ÿ‡. ÿ8ÿ“Aÿ•J#ú”Q-ó‘Y7ì`Aå‡iJßtSÖz~]ÏtˆeÊo‘lÅk›qÁh¦u½f²xºeÂz·eÝ{®hã{§jã{¢käzžlåx›måw™mçv˜nçu˜nçu˜nçu˜nçu˜nçu˜nçuÿgÿd ÿpÿ~"ÿ‹, ÿ“7ÿ˜@ýšH ôšN)ì˜U3å•]<ÝfGÓˆoSËy^Å{ƒf¿uŒn¹q–tµn¡x°k¬|­j»~ªjÒ¤là~žmá}šoâ|—pãz•päy“påw“qæw“qæw“qæw“qæw“qæw“qæwÿhÿd ÿsÿ ÿŽ+ÿ—5ÿ>øŸDï K%çŸR-ßZ7Ó•cFÊŽlSÇu^»~gµ{ˆo¯w‘uªsœz¥p¨~¡o¶žoÊ‚›pÞ–q߀“rá~‘sâ|sãzŽsäyŽsåxŽsåxŽsåxŽsåxŽsåxŽsåxÿiÿfÿvÿ„ÿ’*ÿ›4 þ ;ó£Aê¦H â§O'Ø¢V6Ìš`EÓiR»r^³†zg¬„o¦}v y˜|›v£€—t±ƒ”tÅ„‘u݃vÞvà‹wá}Šwâ{‰väz‰väy‰väy‰väy‰väy‰väy‰väyÿiÿiÿxÿ‡ÿ•(ÿž2 ú¤7ï¨=æ¬DÝ­K$ЦT5ÆŸ^D¼™fR´’o]¬Œwg¤‡€ož‚Šw˜~”}’{ z­„ŠyÀ…ˆzÜ„‡zÝ‚†z߀†zà~…zâ|…yãz…yäy…yäy…yäy…yäy…yäy…yäyÿjÿkÿ{ÿŠÿ˜&ÿ¢0õ¨3 ë®9â³AÖ±G#Ê«R4À¤\C¶ždQ­˜l\¥’tf}o–ˆ†v…‘}Š‚œ‚…€ª…¼†€€Û…€€Ýƒ€Þ€~à€}á}€}ã{€|äz€|äz€|äz€|äz€|äz€|äzÿkÿmÿ~ÿÿ›$þ¥,ñ¬/ç³4 ݺ:еF!ůQ2º©ZB°£bO§j[ž˜re–“znƒvˆ‹Ž|‚ˆ™|†§…y†¹†w‡×…x…݃zƒÞz‚à{á}|€ã{|ãz|ãz|ãz|ãz|ãz|ãzÿkÿpÿÿÿŸ"ú©&í±)âº/Ö¿6ʺD ¿´O1´®X@ª¨`N¡£gZ˜žodšwmˆ–€u€’‹{z–€tޤ„q¶…oŽÑ…q‹Ýƒs‰ßu‡à~v…á}w„ã{wƒäzwƒäzwƒäzwƒäzwƒäzwƒäzÿlÿsÿ…ÿ”ÿ¢õ­ ç¸!ÝÃ&ÐÃ4 ľB¹¹M/®³V>¤®^Lš©eW‘¥mb‰¡uk€~ryšˆyr—”~m–¢‚i•³„g–̓i“Þ‚l߀oŒá~pŠâ|rˆãzr‡äyr‡äyr‡äyr‡äyr‡äyr‡äyÿmÿvÿˆÿ˜ÿ§ï³âÀÕÊÉÇ2 ¾Ã@³¾K,¨ºT<žµ\I”°cUЬk_©rhy¥{or£…vk ‘{fŸŸbŸ±`ŸÊ€bœàe—á~h“â|jã{läymŒåxmŒåxmŒåxmŒåxmŒåxmŒåxÿnÿ{ÿÿú¬Ú» ÕÉ ÍÎÂÌ/ ·É=¬ÅI)¡ÀR8—¼ZF¸aQƒµh[z²pdr¯ykk¬ƒqd«v_©žz[©¯|YªÉ|Z§â{^ ã{a›ãzc—äyf”åwf’æwf’æwf’æwf’æwf’æwf’æwÿpÿ€ÿ’ò£ Ù³ Ͼ ËÌ ÄÓºÒ,°Ï;¥ÌF&šÈP5ÄXA…Á_M|¾gVs¼o^k¹wed¸‚k^¶ŽpYµsUµ®uT¶ÈuS³çvW«ævZ¤æv\ çu_œçt`šèt`šèt`šèt`šèt`šèt`šètÿrÿ† û˜ Ù©εÆÁÀÏ ºÛ±Ú)§Ø7œÔD!’ÑM0‡ÎU<}Ë]GtÉePlÇmWeÅv^^ÄcYÃŽhTÃkQîlOÄÈmNÂímP¸ëoS°ëpU«êpX¦ëpY£ëpY£ëpY£ëpY£ëpY£ëpY£ëpÿwÿÞ Ï®Ĺ»ÅµÓ ®á¦á)à7“ÞB‰ÜL)ÚT5u×\?mÕdHeÓlO_ÒvTYÒYTÑŽ]PÑ`MÒ°bKÓÉbJÒíbKÈòfM¿ñhO¸ðiëøÍ>Q²ðiR¯ïiR¯ïiR¯ïiR¯ïiR¯ïiR¯ïiÿ í–Ò¦IJ¹¼°É©Ø ¡ç™ç* ç7‡æB}åJ)täQ3kãY:dâaA^âkGXâuKSá€OOâSKâ›UIã¬WGäÄWFãéWFÝöYGÐ÷\IÈ÷^JÁö`K½ö`K½ö`K½ö`K½ö`K½ö`K½ö`ÿ‰ÙžÇ¬¹¶®Á¥Îœä •ïï, …ï9|ïAsïI'jîP/bîW5\î_:Vîh?RîqBMï|FIï‰IFð–KCð¦M@ñ¹N?òÛO>ð÷NBæûOCÝûQDÔüSEÏüTEÏüTEÏüTEÏüTEÏüTEÏüTá•˦»°®»¢È˜Õø‰ø ‚ø. yù7pù?hùF"`úM(ZúT-Tú\1Oûe5Kûm8Güw;Cüƒ=?ý?<ýŸA:þ¯C8ÿÆD7ÿêE6üýE;òÿD>êÿD>æÿF>æÿF>æÿF>æÿF>æÿF>æÿFП½¬®µ¢Â•ÏŠÝ„ÿ{ÿtÿ* lÿ3dÿ;]ÿCWÿJ QÿQ$LÿX'Hÿ`*Dÿh,@ÿq.<ÿ{19ÿˆ25ÿ–43ÿ¤61ÿ¶7/ÿÐ8.ÿï9-ÿÿ91ÿÿ93üÿ93üÿ93üÿ93üÿ93üÿ93üÿ9Á¨¯±¢½”ʇØ}óvÿmÿeÿ$^ÿ- Xÿ6Rÿ=LÿEHÿLCÿS?ÿZ<ÿa 8ÿi!5ÿr#1ÿ}%.ÿŠ&+ÿ™()ÿ§)'ÿ¹+&ÿÒ,%ÿï,$ÿÿ-$ÿÿ-$ÿÿ-$ÿÿ-$ÿÿ-$ÿÿ-$ÿÿ-±®£¹”ƆÓyáqÿgÿ_ÿWÿQÿ&Kÿ.Fÿ6 Aÿ= =ÿD9ÿK6ÿQ2ÿX/ÿ_,ÿg)ÿq&ÿ|#ÿ‰ ÿ˜ÿ¦ÿ·ÿÊÿæÿðÿðÿðÿðÿðÿ𤵕†ÏwÞkôbÿYÿ QÿJÿDÿ?ÿ&:ÿ-6ÿ42ÿ:.ÿ@+ÿF(ÿL %ÿR "ÿY ÿb ÿk ÿv ÿ„ÿ’ÿ ÿ­ÿºÿÃÿÃÿÃÿÃÿÃÿ×¾†ÌwÛiç\ýTÿKÿCÿ =ÿ7ÿ2ÿ.ÿ$*ÿ*%ÿ/"ÿ5ÿ:ÿ?ÿEÿKÿRÿZÿbÿlÿw ÿ„ ÿ ÿœ ÿ¢ ÿ¢ ÿ¢ ÿ¢ ÿ¢ ÿ¢ÿP ÿK*ÿD6ÿG:ÿJ?ÿNIÿOTÿO`ÿMl$ÿJy*ÿH….ÿF2ÿDš4ÿC¢7ÿBª8ÿA±:ÿ@¹;ÿ@Á<ÿ?Ë=ÿ>Ü>ÿ>è>ÿ=ó>ÿ=û?ÿ>ÿ>ÿ@ÿ>úCÿ=ôDÿ>îFÿ?îFÿ?îFÿ?îFÿ?îFÿ?îFÿ?ÿP ÿK*ÿE5ÿJ8ÿM=ÿQHÿRRÿQ^ÿOj%ÿMw+ÿJƒ/ÿHŽ3ÿF˜6ÿD¡8ÿC©:ÿB°<ÿB¸=ÿAÁ>ÿ@Ë?ÿ@Ü@ÿ?é@ÿ?ô@ÿ>ýAÿ@ÿ@ýBÿ@öEÿ@ðFÿAéHÿAéHÿAéHÿAéHÿAéHÿAéHÿAÿQÿL)ÿG4ÿM6ÿQ;ÿUFÿVPÿU\ÿRh&ÿPt,ÿM€1ÿJŒ5ÿH—8ÿF ;ÿE¨<ÿD°>ÿC¸?ÿCÁAÿBÌAÿAÞBÿAëCÿ@õCÿ@ýCÿCÿCøFÿBðHÿCêIÿDãJÿEãJÿEãJÿEãJÿEãJÿEãJÿEÿRÿM)ÿJ2ÿP3ÿU9ÿYCÿZMÿYX ÿVd'ÿSq-ÿP}3ÿM‰7ÿK”:ÿIž=ÿG¦?ÿF®AÿE·BÿDÁDÿDÌEÿCßEÿBíFÿB÷FÿCýFùFÿFðIÿFéKÿGâLÿHÛMÿHÛMÿHÛMÿHÛMÿHÛMÿHÛMÿHÿSÿN(ÿN/ÿT0ÿZ6ÿ^@ÿ`Jÿ^U ÿ[`(ÿXm/ÿTy4ÿQ…9ÿN‘=ÿL›@ÿJ¤BÿI­DÿH¶FÿGÁGÿFÍHÿEáIÿDïJÿEøJûGýJñJÿIèMÿKßNÿL×OÿLÏQÿLÏQÿLÏQÿLÏQÿLÏQÿLÏQÿLÿTÿP'ÿR,ÿY-ÿ_2ÿd<ÿfGÿdR ÿa\(ÿ]h0ÿZu6ÿV;ÿR?ÿO˜CÿM¢EÿL«HÿJµIÿI¿KÿHÌLÿHáMÿHîMüHùNòKüMçNýOÝPýPÒRþPÌSÿQÆTÿQÆTÿQÆTÿQÆTÿQÆTÿQÆTÿQÿUÿQ'ÿV)ÿ^*ÿd/ÿj:ÿlEÿlO ÿhY(ÿdc0ÿ`p7ÿ\|=ÿXˆBÿU“FÿSIÿQ¦KÿO°MÿNºOýMÆPúMÙQöLêQòM÷QçPúRÛRûTÎTüUÇVýUÁWþU¼XþU¼XþU¼XþU¼XþU¼XþU¼XþUÿWÿR&ÿZ&ÿb&ÿj,ÿq7ÿsBÿsLÿpV(ÿk`0ÿfk8ÿcw>þ_ƒDû[ŽHùX˜L÷V¡OõU«QóSµSñRÁTïQÐUëQçUæRöVÚTùXÌVúYÃXûZ¼ZûZ·[ûY³\ûY³\ûY³\ûY³\ûY³\ûY³\ûYÿXÿS%ÿ^#ÿg#ÿp*ÿw5 ÿz@ÿzJÿxS&ÿs\/ünf7øir?ôe~Eña‰Jî^“Në\RèY¦UæX°WäW¼XâVÌYÞVäYØVô[ÊX÷]ÀZø^¸\ø^³]ø^®^ø]«_ù\«_ù\«_ù\«_ù\«_ù\«_ù\ÿYÿV#ÿb ÿl ÿu(ÿ}3 ÿ€=ÿGÿP$ù{Y-ôvb6îqm>êlyEæh„KâdŽQÞa˜UÛ^¢YÖ\¬[Ó[¸^ÐZÆ_ÍZß`ÈZòa¾\õbµ^ôb®`õbªaõa¦böa£c÷_£c÷_£c÷_£c÷_£c÷_£c÷_ÿZÿY!ÿfÿpÿz&ÿ‚1 ÿ†;ÿˆDù†M!òƒV+ë~^4åyi=àttEÚoLÓj‰SÏf’XËcœ]Ça¦`Ä_±cÁ^¿d¾^Òeº_ìf²`òf«bòf¥dòe¡eódŸeôcœfõbœfõbœfõbœfõbœfõbœfõbÿ[ÿ\ÿiÿuÿ~$ÿ‡.ÿŒ8ûŽBòŽJë‹R'ä‡[0Ýf:ÓzpEÍuzNÈpƒUÃl[¾i–`ºf d·d«g´c¸i±bÊj®cæj¨dïj¢fïigðhšhñg˜iòf–iód–iód–iód–iód–iód–iódÿ[ÿ_ÿlÿyÿƒ!ÿŒ,ÿ‘6 õ”?ì•Gä“O"ÜŽX-Ò‡b:ÊlEÃ{uN¾vV¸rˆ]´n‘b¯k›f«i¦j¨g³l¥gÃn¢gànžiím™jîl–kïj“lði’lñglòflòflòflòflòflòfÿ\ÿbÿpÿ|ÿ†ÿ)ú–3 ðš<ç›DßšKÓ”U,Ê_9‡iE»qOµ|{W¯x„^ªtc¥q—h¡n¢ll®ošl¾p˜lÙq•mëo‘nìnoíloïjŒoði‹oñg‹oñg‹oñg‹oñg‹oñg‹oñgÿ]ÿdÿrÿÿŠÿ”&ö›0ëŸ8 â¢?ØŸGÍ™R+Ä’]9»ŒfD´‡nN­‚wW§}€^¢y‰dv“i˜sžm”qªqqºrŽqÑsŒrêqŠsëoˆsím‡sîk‡sïj†rðh†rðh†rðh†rðh†rðh†rðhÿ^ÿgÿuÿƒÿŽþ˜#ñŸ,ç¥3ݨ9 Ñ£EÇP*¾—Z8µ’cD­ŒlN¦‡tW ƒ|^š†d•|jyšn‹w¦rˆv¶t…vÌt„wérƒwêp‚wìn‚víl‚vïjvðivðivðivðivðivðiÿ^ÿiÿxÿ†ÿ‘úœí¤'âª,Ö¬4 ˧CÁ¢N)¸œX6¯—aC§‘iM qV™ˆy^“…‚dŒjˆ—oƒ}¤r|³t}|Èu|}ès||êq|{ìo}zím}yîk}yði}yði}yði}yði}yði}yðiÿ_ÿkÿ{ÿ‰ÿ•õ è© ݰ$а2 ƬA¼¦L'³¡V5ªœ_A¢—gLš’oU“Žw]Œ‹€d†ˆŠi…•n|ƒ¡rw‚°tu‚Åutƒçsuêqvëow~ímx}îkx|ðix|ðix|ðix|ðix|ðix|ðiÿ`ÿnÿ~ÿŒÿ™ñ¤ã®Ö¶Ë´0Á°?·«K%­¦T3¤¡]@œeJ”˜lSŒ•t[†‘}bއhyŒ’mtŠžqpˆ­tmˆÁtm‰äso‡êqp„ìorƒímsîkt€ðit€ðit€ðit€ðit€ðit€ðiÿaÿqÿ‚ÿõ ã© Ùµ ϹŸ.»´=±°I#§«R1ž§[>–£cHŽŸjQ†›rY˜z`x•„fr“lm‘œoiªrf¾se‘árhŽëpjŠìnlˆílm†ïkn„ðin„ðin„ðin„ðin„ðin„ðiÿcÿuÿ† ø” Ü¢Ô­ ϸ ɽ¿¼+µ¹;«¶G!¡±P/˜­Y;ªaF‡¦hO£pWx x^rždk›Œifš™mb™¨o_™¼p^™ßo`–ìnc‘ímfŽîkg‹ïji‰ðhi‰ðhi‰ðhi‰ðhi‰ðhi‰ðhÿgÿy ÿŠ ßšÓ¦̱Ç»Á¸Â(®¿8¥¼D›¸N,‘µW8ˆ±^B€®fKx«mSq©vZk§`e¥Šd`£—h[£¦kY£ºlX£ÜkY îkJ°º\šïj_–ðia’ñhcñfcñfcñfcñfcñfcñfÿkÿ~ ñÖž̪Ä´¾¾¸È°È$§Æ5 ÃB“ÀL(нT3º\>y·dFqµkNk³tTd±~Z_°‰_Z¯–bV®¥eS®¹fR¯ÛeR«òfU¤òfXŸòfZ›óe\—ód\—ód\—ód\—ód\—ód\—ódÿp ÿ„ݖΣÄ®»·´Â®Í §Î žÍ1 •Ë>‹ÈI#‚ÆR.zÃZ8rÁb@kÀjGd¾sM^½|SY¼ˆWT»•[P»¥]N»¹^M¼Û]K¹÷_N±ö`Qªö`S¥ö`U¡ö`U¡ö`U¡ö`U¡ö`U¡ö`U¡ö`ÿwëŒÓ›Æ¨»±²»ªÇ¢Ó Ö•Ö,ŒÔ:ƒÒFzÐO'rÎX1jÍ`8dËh?^ÊrEXÊ|ITɈMOÉ•QLÉ¥SJɹTIÊÜSGÈ÷UHÀüXJ¸ûYL²ûZN­úZN­úZN­úZN­úZN­úZN­úZÿܓʢ¼¬±µ¨ÀŸË–Ù ‘àŠß,‚ß9yÞCqÝM jÜV(cÛ_/]Úg5XÙq:SÙ{>OÙˆBKÙ–EHÙ¦GFÚºHEÛÛGDØôIBÓÿMDÉÿOEÂÿPG»ÿRG»ÿRG»ÿRG»ÿRG»ÿRG»ÿRæŠÏ›¿§²°§»œÆ“Ñ‹ê…è~è-vè8nèAfçJ_çR#Yç[)Uçd-Pçm1Lçx5Iç„8Fè‘:Cè <@é²>?êË>>èï>=æÿ?=àÿB?×ÿD@ÎÿF@ÎÿF@ÎÿF@ÎÿF@ÎÿF@ÎÿFÖ“Ä£´¬§¶›Á̆ـòyòqò+jò6 có?]óGWóORóW!Mô`$Iôi(Fôs*Bõ~-?õ‹/<ö™1:ö©38÷¾46øá56õù55óÿ47ìÿ69åÿ89åÿ89åÿ89åÿ89åÿ89åÿ8Èž¶©¨²›½ÈƒÔyèsükýdý'^þ1Xþ; SÿCMÿKIÿSEÿZAÿc>ÿl;ÿv!7ÿ‚#4ÿ%2ÿŸ'0ÿ°(.ÿÈ)-ÿê*,ÿÿ*,ÿÿ*/ùÿ*/ùÿ*/ùÿ*/ùÿ*/ùÿ*/ùÿ*¹¦ª®œ¹ŽÅÑuÞmú eÿ^ÿWÿ#Rÿ,Lÿ4Hÿ< CÿD ?ÿL<ÿS8ÿ[5ÿc2ÿl/ÿw,ÿ„)ÿ“'ÿ¢%ÿ´$ÿÌ#ÿí"ÿý"ÿÿ"ÿÿ"ÿÿ"ÿÿ"ÿÿ"ÿÿ¬«¶Â€ÎsÜgé_ÿXÿQÿKÿFÿ&Aÿ-<ÿ58ÿ<4ÿB1ÿI.ÿP +ÿW (ÿ_ %ÿi #ÿt ÿ‚ÿ’ÿ¢ÿ²ÿÈÿåÿúÿúÿúÿúÿúÿúŸ³¿€ÌrÚdäXõQÿJÿ Dÿ>ÿ9ÿ4ÿ%0ÿ,,ÿ2(ÿ8%ÿ>"ÿDÿJÿQÿYÿcÿnÿ|ÿŒÿœÿ¬ ÿ» ÿÓ ÿÓ ÿÓ ÿÓ ÿÓ ÿÓ ‘¼Ér×däTëKÿDÿ=ÿ7ÿ 1ÿ,ÿ(ÿ$ÿ" ÿ'ÿ,ÿ1ÿ6ÿ<ÿBÿI ÿQ ÿZ ÿfÿsÿÿÿœÿ«ÿ«ÿ«ÿ«ÿ«ÿ«ÿD$ÿ?.ÿ<6ÿ@8ÿA=ÿAEÿAQ ÿ@]ÿ?jÿ4ÿB6ÿD;ÿDCÿEO ÿD[ÿAhÿ?uÿ<‚!ÿ:$ÿ8š'ÿ7£)ÿ6¬*ÿ6´,ÿ5½-ÿ4È.ÿ4Ö.ÿ3æ/ÿ3ò/ÿ2ü0ÿ2ÿ0ÿ3ÿ/ÿ6ÿ/ÿ9ÿ/ù;ÿ0ô=ÿ1ñ=ÿ1ñ=ÿ1ñ=ÿ1ñ=ÿ1ñ=ÿ1ÿF#ÿ@-ÿA2ÿF3ÿH8ÿH@ÿILÿHXÿEeÿBrÿ@#ÿ=Œ&ÿ;˜)ÿ:¡+ÿ9ª-ÿ8³.ÿ7½/ÿ6Ç0ÿ6Õ1ÿ6æ2ÿ5ñ2ÿ5û2ÿ5ÿ2ÿ6ÿ2ÿ:ÿ1ú=ÿ3ó>ÿ4í@ÿ4êAÿ4êAÿ4êAÿ4êAÿ4êAÿ4ÿG"ÿA,ÿE/ÿI0ÿL5ÿM=ÿNHÿMTÿKaÿHn ÿE{%ÿBˆ(ÿ?”+ÿ>ž.ÿ=§/ÿ<¯1ÿ<¸2ÿ;Ã3ÿ:Ï4ÿ:á5ÿ:î5ÿ:ø5ÿ:ÿ5ÿ:ÿ5û>ÿ5òAÿ7ëBÿ8åDÿ8áEÿ8áEÿ8áEÿ8áEÿ8áEÿ8ÿH"ÿC,ÿH,ÿN-ÿQ1ÿS9ÿUEÿSQÿQ]ÿNj!ÿKw&ÿHƒ+ÿE.ÿD™0ÿB¢3ÿA«4ÿA´6ÿ@½7ÿ?É8ÿ?Û8ÿ?ê9ÿ?õ9ÿ?ÿ9û@ÿ8ñCÿ:èEÿ<áGÿ<ÚHÿ=ÕIÿ=ÕIÿ=ÕIÿ=ÕIÿ=ÕIÿ=ÿI!ÿD*ÿM(ÿS)ÿW-ÿY6ÿ\Bÿ[NÿXYÿUe"ÿRr(ÿO~-ÿLŠ0ÿJ”3ÿHž6ÿG¦8ÿF¯9ÿE¸;ÿEÄ<ÿDÒ<üDå=øDò=õEþ<ñEÿ>æHÿ@ÜJÿAÒKÿAÌMÿAÉMÿAÉMÿAÉMÿAÉMÿAÉMÿAÿJ ÿH'ÿQ%ÿX%ÿ]*ÿ`3ÿc?ÿbJÿ`Uÿ\a#ÿYm)ÿUy.ÿR„3ÿP6ýN™9ûL¢;úKª=øJ´?÷J¾@õIÌ@ñIáAíJðAêJüBäJÿDØLÿEÌOÿFÆPÿFÀQÿF¾QÿF¾QÿF¾QÿF¾QÿF¾QÿFÿL ÿL$ÿU!ÿ]!ÿc'ÿg1ÿj< ÿjGÿgRÿc\#ÿ_h*û\t0÷Y5õVŠ9òT”<ðR?îQ¦AìP¯CêOºDèNÇDæOÝEáOîEÝNûHÔOÿIÈQÿJÀSÿJºTÿJ¶UÿJ´VÿJ´VÿJ´VÿJ´VÿJ´VÿJÿMÿP!ÿZÿbÿi%ÿm-ÿq9 ÿqDÿoNûkX"õfc)ñco0í`z6é\…;æZ?äX˜BáV¢DßU«FÜS¶HÚRÃJÖRØJÑSìKÌSúMÅTÿN¼VÿOµWÿO°XÿN¬YÿMªZÿMªZÿMªZÿMªZÿMªZÿMÿNÿSÿ^ÿgÿn"ÿs*ÿw5 ÿx@ùwJòsT ìo^(çkj0âgu6Þc€<Ù_ŠAÔ]“FÑ[IÎY¦LËX°NÈW¼PÆVÍQÃWæQ¾W÷R¸XÿS°ZÿS«\ÿR§]ÿR£]ÿQ¢]ÿP¢]ÿP¢]ÿP¢]ÿP¢]ÿPÿOÿWÿbÿlÿt ÿy'ÿ~2ù€< ñFê{Päw[&Ýsf.Õmp7Ðiz>Ëe„DÇbŽIÄ`—MÀ^ P½]ªS»[¶U¸[ÅVµ[ßV²\óW¬]ýW¦^ýV¡`þUž`ÿTœaÿSšaÿSšaÿSšaÿSšaÿSšaÿSÿPÿZÿeÿpÿxÿ$ý„.ó†8 ê†Bã„KÛW#Ñyb/Ëtl8Åov@ÀlF¼hˆK¸f‘Pµc›S±a¥V®`°Y«_¿Z©_Ô[¦`ï[¢aúZcûY™düX–dýW•eþU”eþU”eþU”eþU”eþU”eþUÿPÿ]ÿiÿtÿ}ÿ„!÷‰*í4ä= Ü‹HÑ…T#É^.Âzh8¼uq@·qzG²n„M®kRªh–V§f Y£e«\ d¹^ždÍ^›dê^˜fø]”gù\’hûZhüYŽhýWŽhýVŽhýVŽhýVŽhýVŽhýVÿRÿ_ÿlÿxÿÿˆò%ç“/Þ•8 ÓEÊ‹Q"Â…[.»€e8´{nA¯wwHªtN¥pˆS¡n’Wkœ[™j§^–iµ`”hÈa’iæ`j÷_kø]‹kù\‰lûZˆlüXˆküXˆküXˆküXˆküXˆküXÿTÿbÿoÿ{ÿ…úí“â™(Ø™3Ì•BÄN!¼‹Y-´…b7®k@¨|sH¢y|Nv…T™sŽX•q˜\‘o¤`n±b‹mÃc‰nâb‡oöa†o÷_…où]„oú[ƒoûYƒoüXƒoüXƒoüXƒoüXƒoüXÿVÿdÿrÿ~ÿˆõ‘è˜Ýž Ñž1Çš@¾•L ¶V,®‹`7§†h@¡‚pHœ~yN–{‚T’x‹Yv•]‰t a…s®c‚r¿d€sÞd€tõbtö`sø^~sù\~rúZ~rûY~rûY~rûY~rûY~rûYÿXÿgÿuÿÿŒñ•ã֣ˡ/ž>¹™J°”T+©]6¢‹f?›‡nG•„vN€T‹~ˆY†{’]yža}x«dzx¼eyxÙexyôbyxö`ywø^yvù\yuúZyuûZyuûZyuûZyuûZyuûZÿZÿiÿx ÿ„ ï Ýš Ù¢ ЦÆ¥,½¢<´žH«™R)£•[4œ‘c>•kF‰sM‰†|S„„…X]z›av~¨ds}¹eq~Óeq~òcr}ö`s{÷^tzù\tyú[uyûZuyûZuyûZuyûZuyûZÿ]ÿl ÿ{ öˆ Ü“Õ Ñ¥ ʪÁ©*·¦:®¢F¦žP(žšY3––a<“iD‰qLƒyR}ŠƒWxˆ\s†™`o„¦cl„·dKb"Žj„Ïdj„ðbl‚ö`m€÷^où\o}ú[p|ûZp|ûZp|ûZp|ûZp|ûZÿ_ÿo ÿ~ãŒÖ—Ï ʨÄ®»­'²«7 ©§D ¤N&˜ W1‘œ_:Š™gCƒ–oJ}“wPw‘€VrŠZm–^h‹£ae‹´cc‹Ìcc‹îae‰÷_g†ø^i„ù\j‚úZkûZkûZkûZkûZkûZÿbÿrø‚ÛϚɣ콲µ²$¬°5 £­B›ªL#’¦U.Š£]8ƒ e@}lGv›tMp™}Sk–ˆXf•”\b”¡__“²`]“É`]“í_^ø^aŒù\cŠú[d‡ûZe†ûYe†ûYe†ûYe†ûYe†ûYÿf ÿwã‡Ó“Êž§»¯µ¶ ®·!¥¶2 ³?”°J Œ­S+„ª[4}¨c]¶xCXµ‚GT´KP´NM³®PK´ÅPK³êPJ±ÿQL«ÿRN¥ÿRP¡ÿRQžÿQQžÿQQžÿQQžÿQQžÿQÿv݉ʗ¾¢³ª©³ ¼˜Æ‘Ì‹Ì%„Ë4 |É@uÈJmÇS#gÅ\*aÄd0\Ãm6WÂv:SÂ?OÁŽBKÁEHÁ®FGÁÅFGÁêFD¾ÿIE¹ÿJG³ÿKI­ÿLJ«ÿLJ«ÿLJ«ÿLJ«ÿLJ«ÿLéÑžµ§ª¯ ¸–ÁŒË„Õ €ÕyÕ.rÔ< lÓGeÒP_ÑY!ZÑb'UÐk,QÐu0MÏ4IÏŽ7FÏ9DЮ;BÐÆ;CÐê:@Íý>>Ëÿ@@ÃÿBA½ÿCB¹ÿDB¹ÿDB¹ÿDB¹ÿDB¹ÿD݈ǘ¸£«« ´•¾‹È€Ñxá táná+hà7aàB\àMWàVSà_Oài"Kàs%Gà~(Dà‹+Bàš-?á«/>âÁ/>âå/<ßú19Þÿ49Ùÿ6:Ðÿ8;Ìÿ9;Ìÿ9;Ìÿ9;Ìÿ9;Ìÿ9Í’¼ ­¨¡±•»‰Å~ÏtÚnëhëbë*]ì5Wì? RìHMìQJíZFícCím@íx=î…!:î“#8ï£$6ð¶&5ñÒ&4ïó&4ìÿ&2ëÿ(2çÿ+3äÿ,3äÿ,3äÿ,3äÿ,3äÿ,Áœ°¦£®–¸‰Ã}ÍqØgæbö\÷W÷'R÷1Mø:HùB DùK AúT>ú\;ûe8ûo5û{2ü‰0ý˜.ýª,þ¿+ÿã*üú*úÿ*÷ÿ*÷ÿ*÷ÿ*÷ÿ*÷ÿ*÷ÿ³£¤«—¶‰Á{ËoÖcß[õUÿPÿKÿ#Fÿ,Bÿ4>ÿ<:ÿC7ÿK4ÿS1ÿ[ .ÿd +ÿo (ÿ| &ÿ‹$ÿœ"ÿ®!ÿÅ ÿéÿüÿÿÿÿÿÿÿÿÿÿÿÿ¦©˜³Š¿{ÊnÕ`ßTçNÿIÿCÿ?ÿ:ÿ%6ÿ,2ÿ3/ÿ:+ÿA(ÿH%ÿO"ÿW ÿ`ÿlÿyÿŠÿ›ÿ­ ÿà ÿã ÿø ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ 𱋽|ÈmÔ_àQæGõAÿ<ÿ 7ÿ2ÿ.ÿ*ÿ#&ÿ)"ÿ/ÿ5ÿ;ÿBÿIÿQÿZÿf ÿt ÿ… ÿ– ÿ¨ÿ¹ÿÐÿãÿãÿãÿãÿãº}ÇmÓ_àPçBí:ÿ5ÿ/ÿ*ÿ &ÿ"ÿÿÿÿ#ÿ(ÿ-ÿ3 ÿ9 ÿAÿIÿSÿ^ÿlÿ|ÿÿÿ¬ÿµÿµÿµÿµÿµÿ9'ÿ32ÿ54ÿ86ÿ8;ÿ6Cÿ3Nÿ1[ ÿ/h ÿ-vÿ+„ÿ)‘ÿ)›ÿ(¤ÿ(­ÿ(µÿ'¾ÿ'Èÿ'Ôÿ'äÿ'ïÿ'ùÿ'ÿÿ'ÿÿ'ÿÿ(ÿÿ+ÿÿ-ÿü/ÿü/ÿü/ÿü/ÿü/ÿÿ:'ÿ41ÿ81ÿ;4ÿ;9ÿ:Aÿ7Kÿ5X ÿ3eÿ1sÿ/ÿ-Žÿ-˜ÿ,¡ÿ,ªÿ+²ÿ+»ÿ+Äÿ+Ðÿ*á ÿ*í ÿ*÷ ÿ*ÿ ÿ+ÿ ÿ+ÿÿ,ÿÿ/ÿ!ü1ÿ"÷3ÿ"÷3ÿ"÷3ÿ"÷3ÿ"÷3ÿ"ÿ;&ÿ50ÿ;/ÿ>1ÿ?6ÿ>=ÿkÿ;xÿ9…ÿ7ÿ7š ÿ6£!ÿ5«"ÿ5³#ÿ4¼$ÿ4Æ%ÿ4Ô%ÿ4æ&ÿ4ñ&ÿ4û&ÿ5ÿ%þ5ÿ&ú6ÿ(ó8ÿ)ì:ÿ)æ<ÿ*æ<ÿ*æ<ÿ*æ<ÿ*æ<ÿ*ÿ=%ÿ=*ÿC(ÿG)ÿI-ÿJ6ÿJAÿIM ÿGZÿEgÿBtÿ@€ÿ>Œ ÿ=•"ÿ<ž$ÿ;¦&ÿ;®'ÿ:·(ÿ:Á(ÿ:Í)ÿ:á)þ:î)û:ù)÷;ÿ)ö:ÿ+ð;ÿ-è=ÿ.á?ÿ.ÛAÿ.ÛAÿ.ÛAÿ.ÛAÿ.ÛAÿ.ÿ>%ÿA&ÿH$ÿL%ÿO)ÿR3ÿQ>ÿQI ÿOVÿLbÿJoÿG{ ÿE†#ÿC‘%ÿBš'ÿA¢)ÿAª*ý@²+ü@¼,û?È-ø?Û-ô@ë-ð@÷-í@ÿ/ë?ÿ1äAÿ2ÛCÿ3ÑDÿ3ËFÿ3ËFÿ3ËFÿ3ËFÿ3ËFÿ3ÿ@$ÿE#ÿL ÿR!ÿV&ÿY/ÿY:ÿYF ÿVQÿT]ÿQjþNu!üL%ùJ‹(÷I•+õG,óG¦.òF®/ðE¸0ïEÄ1íEÓ1èFè1åFö2âEÿ5ßDÿ6ÓGÿ7ÊHÿ8ÄJÿ8¿Kÿ7¿Kÿ7¿Kÿ7¿Kÿ7¿Kÿ7ÿA#ÿIÿQÿWÿ\#ÿ`,ÿ`6ÿ`A ÿ^Mý[XøXdôUp#ñS|'îP†+ëO.éM™0çL¡2åLª3ãK´4âKÀ5àKÏ5ÛKæ6ÕJô8ÑJÿ:ÎJÿ<ÄLÿ<½Mÿ<¸Oÿ<´Oÿ;´Oÿ;´Oÿ;´Oÿ;´Oÿ;ÿB"ÿLÿUÿ\ÿc ÿf(ÿh2ÿh= úfHôcSî`_ê]k#æZv(âW-ßU‹0ÜS”3ÙQ6ÕP¦8ÓO¯:ÐO»;ÎNÉ<ËOá=ÇOò>ÃOÿ@ÀOÿA·QÿA±Rÿ@­Sÿ@ªTÿ?ªTÿ?ªTÿ?ªTÿ?ªTÿ?ÿFÿPÿYÿbÿhÿl$ÿo.ùo8ñnDëkNåh[ßdg#Ú`q*Ô]{/Ð[…4ÌXŽ8ÉW—;ÇU =ÄT©?ÂS´A¿SÂB½SÖC¹SíD¶SýE³TÿE¬VÿD§WÿD¤XÿC¡XÿB¡XÿB¡XÿB¡XÿB¡XÿBÿHÿSÿ]ÿfÿmÿr!ûu)òv3év> âsJÛoWÒkb#Ígl+Èdv1Äa7À^‰;½\’>º[šA·Y¤DµX®F²W»G°WÍH­XèHªXúI§YÿH¡ZÿH[ÿG›\ÿF™\ÿE™\ÿE™\ÿE™\ÿE™\ÿEÿKÿWÿaÿkÿrÿxõ{$ë}-â~9Ù{FÐvSÉq^$Ãmh,¾jq3ºg{8¶dƒ=²bŒA¯`•E¬^ŸG©]©J¦\¶K¤\ÇL¢\âMŸ]÷Lœ^ÿL˜_ÿJ•`ÿI“`ÿH‘`ÿG‘`ÿG‘`ÿG‘`ÿG‘`ÿGÿNÿZÿdÿoÿvü}ïä„'Û„4ÐCÈ|OÁxZ#»sd,µpm3±lv:­j?©gˆC¥e‘G¢c›JŸb¥Mœa±O™`ÁP—`ÜP•aóO“bÿNcÿLŽdÿKŒdÿJ‹dÿH‹dÿH‹dÿH‹dÿH‹dÿHÿPÿ\ÿh ÿrÿzöé†ÞŠ ÒŠ0Ɇ@Á‚Mº}W#´ya,®uj4©rr:¤o{@ l„DjH™h—L•g¡O’f­Qe½RŽeÔSŒfðQ‹gÿPˆgÿN‡hÿL†hÿK…gÿI…gÿI…gÿI…gÿI…gÿIÿRÿ_ÿk ÿu ù~ ð…ã‹ÖÌŽ.Ë= »‡J´ƒU"­~^+§{g3¢wo:tx@™r€E•o‰I‘m“MlžPŠjªS‡j¹T…jÏT„kîSƒlÿQ‚lÿOkÿM€kÿL€kÿJ€kÿJ€kÿJ€kÿJ€kÿJÿTÿa ÿn ýx è‚܉ Ø Ð“Æ“+¾; ¶ŒH®ˆR!§„\+¡€d3œ|m:—yu@’w}EŽu†JŠrN†q›QÖÕN‚o§To¶U}oËV|oëT|pÿR{pÿP{oÿN{oÿM{nÿK{nÿK{nÿK{nÿK{nÿKÿWÿc ÿpð|Ü…ÔŒГ Ê–Á—)¹”9 ±F©P ¢‰Z*œ…b2–‚j9‘r?Œ|zE‡zƒJƒxNv˜Q{u¤Txt³VvtÈVutèUuuýSutÿQusÿOvrÿMvqÿLvqÿLvqÿLvqÿLvqÿLÿYÿfÿsáÖˆÏÊ–Äš¼›&´˜7 ¬•D¤‘NŽW(–Š`1‡h8‹„p?†‚xDI}}‹Mx{–Qtz¢Tqy±VoyÅVnzæUnzüSoyÿQpwÿOqvÿMquÿLquÿLquÿLquÿLquÿLÿ[ÿiöw݂ЋÉ“Ä™¾ž¶Ÿ$®4¦šAŸ–L˜“U'‘^/‹e7…Šm=€ˆuC{…~HvƒˆLr‚“Pn€ Sk®UhÂVgãUh€úSi~ÿQj|ÿOk{ÿMlyÿLlyÿLlyÿLlyÿLlyÿLÿ^ ÿlæzÖ†ËÄ—¾¸¢±£!©¢2¡Ÿ?™œJ’™S%‹–\-…“c5‘k;zŽsAuŒ|FpŠ…Kkˆ‘Og‡Rd†¬Tb†¿Ua†áTa†ùRc„ÿPeÿOfÿMg~ÿLg~ÿLg~ÿLg~ÿLg~ÿLÿa ÿoà~ЉƓ¿›¸¡±¦ ª¨£§/›¥=”¢HŒŸQ"…œY+ša2y˜i9t•q?o“yDj’ƒHeŽLa›O^ŽªR[޽RZŽÞR[øP\‹ÿO^ˆÿN`…ÿLaƒÿKaƒÿKaƒÿKaƒÿKaƒÿKÿdõtÚ‚ËŽÁ—¸ž±¥©«£­œ¬,•«: ¨E†¦O¤W(y¢_/s f5mžn;hœw@cšE_™ŒI[˜™LW—¨NU—»OT—ÜNT–öNU”ÿMXÿLYÿK[ŠÿJ[ŠÿJ[ŠÿJ[ŠÿJ[ŠÿJÿhåyчŒ»œ±¢©©¡±›³•³(޲6 †°B®Lx¬T#rª\*l¨d1g§l6b¥u;]¤@Y£ŠCU¢—GQ¡§IO¡ºJN¢ÙIN õINŸÿIP™ÿIR–ÿHT’ÿGT’ÿGT’ÿGT’ÿGT’ÿGÿnÞʾ˜³ ª§¡®—¶‘ºŒº#…¹2~¸>w¶IqµRk³Z%e²b+`±j0[°s5W¯}9S®‰=O­–@L­¥BJ­¹CI®ØBH«õCGªÿDI¥ÿDK ÿDMœÿDMœÿDMœÿDMœÿDMœÿDêu҆Ó·¬¤¢«˜³Ž»…Á Â{Â-uÁ: oÀEi¿Oc¾W^½_#Y¼h(U»q-Q»{0Mº‡4Jº•7Gº¥9Eº¸:Dº×9C¸õ;B¶ÿ=B³ÿ>D®ÿ>E©ÿ>E©ÿ>E©ÿ>E©ÿ>E©ÿ>à}ɻ𮢣©˜±Ž¹„ÁyÉtËpÌ&kË5eË@ `ÊK[ÊTWÉ]RÉeNÈo#KÈz&GȆ)DÈ”,BȤ.@ȸ/?É×/?Çõ0=Äÿ3;Ãÿ5<¾ÿ6=¸ÿ7=¸ÿ7=¸ÿ7=¸ÿ7=¸ÿ7цÀ•²Ÿ¥§š¯Ž·ƒ¿xÇnÏe× cØ`Ø-[Ø:WØF SØP OØYK×bG×lD×wAׄ>Ø“ <Ø£!;Ù·":ÚÕ":Öò#7Ôÿ'6Òÿ)4Ñÿ+6Êÿ-6Êÿ-6Êÿ-6Êÿ-6Êÿ-Ŷ¨¥œ­¶ƒ¾wÇlÏbÖZäXäTä)Pä5Lå?HåIEåS Bæ\ ?æf<æq:ç~7çŒ5çœ3è®2éÆ2èê1åþ/äÿ.äÿ-âÿ -âÿ -âÿ -âÿ -âÿ ºšª£«´ƒ½wÆkÏ_ÖTÞQðMðJð&Fñ0Bò:>òC;óK8óT6ô]3ôh 0õt .õ ,ö‘*ö¢(÷·'øÖ'öô&óÿ&ñÿ%ñÿ%ñÿ%ñÿ%ñÿ%ñÿ­¡ ©’³„¼vÆiÏ]ØQßIîFüBý>þ!;þ*7ÿ34ÿ:0ÿB-ÿJ+ÿS(ÿ\%ÿf"ÿs ÿƒÿ”ÿ¦ÿ¼ÿâ ÿù ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ¢§“±…»vÆiÐ[ÚNàCå>û:ÿ 6ÿ2ÿ/ÿ#+ÿ*(ÿ1$ÿ7!ÿ?ÿFÿNÿXÿcÿpÿÿ“ÿ§ÿ½ÿàÿöÿÿÿÿÿÿÿÿÿÿ•¯†ºwÅhÐZÛLá@ç7ó2ÿ.ÿ*ÿ&ÿ#ÿÿ ÿ&ÿ+ÿ2ÿ8ÿ@ÿH ÿR ÿ]ÿkÿ}ÿÿ£ÿ¶ÿÍÿìÿìÿìÿìÿ숹xÄiÐ[ÝKã>é2î+ÿ&ÿ!ÿÿÿ ÿÿÿÿ ÿ$ ÿ*ÿ0ÿ7ÿ@ÿJÿVÿdÿuÿˆÿšÿªÿ»ÿ»ÿ»ÿ»ÿ»ÿ/+ÿ+2ÿ/1ÿ04ÿ/9ÿ+Aÿ'Lÿ#Xÿ!fÿ tÿ‚ ÿŽ ÿ˜ ÿ¡ ÿ©ÿ°ÿ¸ÿÁÿËÿÛÿèÿòÿüÿÿÿÿÿÿÿÿÿÿÿ!ÿÿ"ÿÿ"ÿÿ"ÿÿ"ÿÿ/+ÿ.0ÿ2/ÿ31ÿ26ÿ/>ÿ+Iÿ)Vÿ'cÿ%qÿ$~ ÿ#Š ÿ#•ÿ"žÿ"¦ÿ"­ÿ"µÿ"½ÿ"Çÿ"Ôÿ"åÿ"ðÿ"úÿ"ÿÿ#ÿÿ#ÿÿ#ÿÿ$ÿþ&ÿü'ÿü'ÿü'ÿü'ÿÿ0*ÿ1-ÿ5+ÿ7-ÿ62ÿ4:ÿ2Eÿ/Rÿ-`ÿ,m ÿ*z ÿ)†ÿ(‘ÿ(šÿ(¢ÿ'ªÿ'±ÿ'¹ÿ'Ãÿ'Ïÿ'áÿ'íÿ'øÿ(ÿÿ(ÿÿ(ÿÿ'ÿü)ÿö+ÿô,ÿô,ÿô,ÿô,ÿÿ1)ÿ4)ÿ9(ÿ;*ÿ<.ÿ:6ÿ9Bÿ7Oÿ5\ÿ3i ÿ1vÿ0‚ÿ/ÿ.–ÿ.žÿ-¦ÿ-­ÿ-µÿ-¾ÿ-Êÿ-Üÿ-êÿ-õý.ÿú.ÿù-ÿù-ÿó/ÿí1ÿê2ÿê2ÿê2ÿê2ÿÿ3)ÿ8&ÿ=$ÿ@%ÿA)ÿB3ÿA>ÿ?Jÿ=W ÿ;d ÿ9pÿ7}ÿ6ˆÿ5‘ÿ5šÿ4¢ÿ4©ÿ3±ÿ3ºÿ3Åý3Óú3æ÷4óó5þñ4ÿð3ÿî3ÿ ç6ÿ!á7ÿ!Þ8ÿ!Þ8ÿ!Þ8ÿ!Þ8ÿ!ÿ5'ÿ="ÿB ÿF ÿH%ÿJ/ÿI:ÿGFÿER ÿC_ ÿAkÿ?wÿ=‚þ<Œü<•û;ù;¥ø:­ö:¶õ:Àó:Îð:ãë;ñè:ý!æ:ÿ#ä:ÿ%á:ÿ%Ø<ÿ&Ð=ÿ&Í>ÿ&Í>ÿ&Í>ÿ&Í>ÿ&ÿ9$ÿAÿGÿKÿO"ÿQ+ÿQ6ÿOAÿLM ÿKZüIføGrõE}óC‡ñB‘ïB™íA¡ ìA©!ê@²"è@¼"ç@Ê#äAß#àAï$Ü@ü'Ø@ÿ)Ô?ÿ*Ï@ÿ*ÇBÿ*ÂCÿ*ÀCÿ*ÀCÿ*ÀCÿ*ÀCÿ*ÿ< ÿEÿKÿQÿVÿX'ÿX1ÿW<üUH öRTòPaîNmêLxçJ‚åIŒ âH•"àG$ÞG¥%ÜF®&ÚE¹'ØEÆ(ÔEÜ)ÏFî*ËEû-ÈEÿ.ÅEÿ/ÀFÿ/ºHÿ/µIÿ.´Iÿ.´Iÿ.´Iÿ.´Iÿ.ÿ@ÿIÿPÿVÿ\ÿ_#ÿ`,ú_7ó]BíZO çX\âVhÞSrÚQ} ÖO†$ÒN'ÐM˜)ÍL +ËK©-ÉJ³.ÇJ¿/ÅJÐ0ÂKè0½Kø2ºJÿ3¸Kÿ3³Lÿ3®Mÿ3ªNÿ2©Nÿ2©Nÿ2©Nÿ2©Nÿ2ÿCÿLÿTÿ\ÿaÿeûf'òf1êe=ãcJ Ü`WÕ]bÐZmÌWw#ÈU€'ÅT‰+ÂR’.ÀQš0¾P£2»O­4¹O¹5·OÈ6´Oâ6±Oô7®Pÿ8¬Pÿ8§Qÿ7£Rÿ6 Sÿ5ŸSÿ5ŸSÿ5ŸSÿ5ŸSÿ5ÿFÿPÿX ÿ`ÿfÿjôl!êm+ál7ÙjE ÐgRÊc^Å`h Á^r&½\{*ºZ„.·XŒ1´W•4±Už6¯T¨8­T³:ªSÂ;¨SÚ;¥Tð<¢Uÿ<¡Uÿ;Vÿ:šWÿ9—Wÿ8—Wÿ7—Wÿ7—Wÿ7—Wÿ7ÿIÿSÿ\ ÿe ÿkúoìrât#Øs2ÎqB ÇmOÁjZ»gd!·dm'³bv,¯_0¬^‡4©\7§[™:¤Y£<¡Y®>ŸX½?XÑ@šYì?˜Yþ?—Zÿ>”[ÿ<‘[ÿ;[ÿ:[ÿ:[ÿ:[ÿ:[ÿ:ÿLÿV ÿ` ÿh úo ósåwÚyÏy.Çw> ¿tK¹pV³m`!¯ji(ªgr-§ez2£cƒ6 aŒ9vÁŸ@`•<š^Ÿ?—]ªA•]¸B“]ËC]èC^üAŽ_ÿ@‹_ÿ>Š_ÿ=ˆ_ÿ<ˆ_ÿ;ˆ_ÿ;ˆ_ÿ;ˆ_ÿ;ÿNÿX ÿcúlçsÝxÚ{ Ñ~È~+À|;¹yH²vS¬r]!§of(£mn.Ÿjw3›h7˜fˆ;•e‘>‘c›AŽb§CŒa´E‰aÇEˆbåE†búC†cÿB„cÿ@ƒcÿ>‚cÿ=‚cÿ<‚cÿ<‚cÿ<‚cÿ<ÿPÿ[ÿfìoÜvÔ|Ñ€ Ê‚ƒ(º9³~F¬{Q¦wZ!¡tc(œrk.˜os3”m|7‘k„;jŽ?Šh˜B†g£D„f±FfÃGfáGgøE~hÿC~hÿA}gÿ?|gÿ>|gÿ=|gÿ=|gÿ=|gÿ=ÿRÿ]ýiárÖzÎʃņ¼‡&µ†6®ƒC§€N¡|X ›y`'–wi-’tp3Žry7Šp<†n‹?ƒm•Cl¡E|k®Gzk¿HxkÝHxlöFxlÿDwlÿBwkÿ@wjÿ?wjÿ>wjÿ>wjÿ>wjÿ>ÿT ÿ_òlÝvÐ}Ƀć¿Š·Œ#°Š4©ˆA¢…LœU–^&‘|f-Œyn2ˆwv7„u;€tˆ?|r’CxqžFup¬Hso½IqpÙIqpôGqqÿDrpÿBroÿArnÿ?rnÿ>rnÿ>rnÿ>rnÿ>ÿV ÿbæo×yÌŇ¿‹¹Ž² «1¤Œ? ŠJ–‡S‘„\%‹d,†k1‚}s6~{|;zy†?vwBrvœEou©HluºIkuÔIkuòGkuÿEluÿCmsÿAmrÿ?mrÿ?mrÿ?mrÿ?mrÿ?ÿYÿeârÑ|Ç„Àй³’ ¬”¦“/ž‘< ˜H‘ŒQ‹‰Z$†‡b*…i0|‚q5xz:tƒ>p}ŽBl|šEi{§Gfz¸Hd{ÐHd{ðGe{ÿDfzÿCgxÿAhvÿ?hvÿ?hvÿ?hvÿ?hvÿ?ÿ[÷iÝv̀È»Ž´“­— §˜ ˜,™–: ’”EŒ’O†W"€_({‹g.v‰o3r‡w8m…_Š•A\‰£DZ‰´EX‰ËEXˆíDXˆÿCY†ÿA[ƒÿ@]ÿ>]€ÿ>]€ÿ>]€ÿ>]€ÿ>ÿbäqÏ~ȹ‘°—§›ž¡˜£“£%¢4†¡@ €ŸJySt›Z#o™b(j˜j.f–r2a•|7]”†:Y’“>V’¡@S‘²AR’ÉBR‘ëARÿ@Rÿ?U‹ÿ>Vˆÿ=W‡ÿ=W‡ÿ=W‡ÿ=W‡ÿ=ùgÝvɃ½³•©›  –§©‹ª!…©0¨< x§Gs¥Pm£Xh¢`$d¡g)_ p.[žy2W„6Sœ‘9PœŸ;N›°=LœÇ=L›ê­ÿ2@¨ÿ2A¦ÿ2A¦ÿ2A¦ÿ2A¦ÿ2Õ|е–¨£’ª‡±|·p¾hÂfÃcÃ-^Ã9ZÃDVÂN RÂWOÁ_KÁiHÁsEÀ~BÀŒ ?À›"=À­#<ÁÄ#<Àé#:¾þ&8¼ÿ(7»ÿ)8¸ÿ*8¶ÿ+8¶ÿ+8¶ÿ+8¶ÿ+É…¹“¬œ ¢”ªˆ±|¸q¾fÅ[ËWÍVÎ#SÎ2PÎ>MÏHIÏRFÏ[ CÏe@Ïo>Ï{;ω9Ï™7Ï«6ÐÃ6Ïè4Íû2Ëÿ1Êÿ0Éÿ!/Èÿ!/Èÿ!/Èÿ!/Èÿ!¾¯š¢¡–©Š°}¸q¿fÆ[ÌPÒGÚ FÜEÜ'DÝ5AÝ@?ÞK=ÞU:ß_8ßi5ßv 3à„ 1à” /ᦠ.á¼-âà-Þø+Ýÿ*Üÿ)Úÿ(Úÿ(Úÿ(Úÿ(Úÿ³˜¥ ™§‹°~¸qÀeÈYÎNÓDÛ?é =é;ê#9ê.6ë84ëB1ìK/íU-í_*îk(îx&ïˆ%ïš#ð®"ñÈ"ðí!ìÿ!ëÿ ëÿ êÿ êÿ êÿ êÿ ¨Ÿ›¦¯¸qÁdÊXÐLÖAÝ8ä5ö 3÷0÷.ø'+ù0(ù8&ú@#ûI!ûRü]ýiýyþ‹ÿžÿ³ÿÓþôüÿúÿùÿùÿùÿùÿ¥®€¸rÂdËVÓIÚ>ß4ä.ô+ÿ (ÿ%ÿ"ÿÿ&ÿ-ÿ4ÿ<ÿDÿNÿYÿg ÿw ÿŠ ÿŸ ÿµÿÕÿôÿÿÿÿÿÿÿÿÿÿ‘­‚¸sÂdÌVÕHÝ;â0ç'î#ÿ ÿÿ ÿÿÿÿ!ÿ' ÿ. ÿ6ÿ>ÿHÿTÿbÿsÿ‡ÿÿ²ÿÊÿêÿóÿóÿóÿó„·tÁeÌVØGß9å-ê#îýÿÿÿÿ ÿ ÿÿÿÿ ÿ&ÿ.ÿ7ÿAÿMÿ\ÿmÿ‚ÿ–ÿ¨ÿºÿÃÿÃÿÃÿÃÿ$/ÿ%/ÿ(/ÿ'1ÿ$6ÿ >ÿIÿVÿdÿrÿÿŠÿ”ÿÿ¤ÿ¬ÿ³ÿºÿÃÿÎÿßÿëÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿ%.ÿ)-ÿ+,ÿ+.ÿ)3ÿ$;ÿFÿSÿaÿnÿ{ÿ‡ÿ‘ÿšÿ¡ÿ©ÿ°ÿ·ÿÀÿÊÿÛÿèÿôÿýÿÿÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿ&-ÿ,)ÿ.(ÿ/*ÿ-/ÿ)7ÿ'Cÿ$Pÿ"]ÿ jÿwÿƒÿÿ–ÿžÿ¥ ÿ¬ ÿ³ ÿ¼ ÿÆ ÿÓ ÿå ÿñ ÿü þÿ ýÿ üÿ üÿ üÿ÷!ÿ÷!ÿ÷!ÿ÷!ÿÿ**ÿ/&ÿ2$ÿ3%ÿ2*ÿ14ÿ/?ÿ-Lÿ*Yÿ(fÿ&rÿ%~ÿ%‰ÿ%’ ÿ%š ÿ%¡ ÿ%¨ ÿ$° ÿ$¸ ÿ%Á ÿ%Î ÿ%á ü%ï ù&ú ö&ÿ õ&ÿô%ÿô%ÿò&ÿí'ÿí'ÿí'ÿí'ÿÿ.&ÿ4"ÿ7 ÿ9!ÿ8%ÿ9/ÿ8;ÿ5Gÿ3Tÿ1aÿ/mÿ.y ÿ-„ ÿ- ÿ,– ÿ, ÿ,¥ý,¬ü,´û,½ù,Éö,Ýó-ìï-øí-ÿë,ÿê,ÿé,ÿå-ÿà.ÿà.ÿà.ÿà.ÿÿ2#ÿ8ÿ<ÿ>ÿ@"ÿA+ÿ@6ÿ>Bÿ ŸxJšuS•s\‘qd"ol'‰mt+…l|/‚j…2i5|h›8yg§:vf¶;tfÌ­¹#=­Ø"=«õ#<©ÿ%;§ÿ&;¦ÿ&;¤ÿ&;¤ÿ&;¤ÿ&;¤ÿ&Ìz»ˆ®’¢™—žŒ¤€ªu¯i´^¹[ºY»$V»1S»=P»GM»PJºY Gºb DºlAºw>¹„<¹“9¹£8¹·7ºÖ7¸ô5¶ÿ4´ÿ3³ÿ3²ÿ 3²ÿ 3²ÿ 3²ÿ Áƒ´‘¦˜›ž¥‚«v±k¶_¼TÁLÅ KÅIÆ(HÆ5EÇ@CÇJ@ÇS>Ç];Çg9Çs 7Ç€ 4Ç 2Ç¡1ȵ0ÈÓ0Æô.Äÿ-Âÿ,Áÿ+Àÿ+Àÿ+Àÿ+Àÿ¸ª—žž‘¥„¬x²k¹`¿TÃJÈ@Í:Ò9Ò8Ó(7Ó56Ô@4ÕK3ÕU1Ö`/Öl-×z+Ø‹*Ø(Ù±'ÚÍ'×ï&Ôÿ %Òÿ $Ñÿ #Ðÿ #Ðÿ #Ðÿ #Ðÿ ®– ”¤†¬y´l»`ÂTÆHË>Ð5Õ-Ý ,á+â)ã*(ä5'ä?&åJ$æU#æa!çn ç~èé¤é¼êâæüåÿäÿãÿãÿãÿãÿ£–¤ˆ¬zµl½_ÄSÊGÎ<Ó2Ú*ß%î #ð!ññ"ò+ó4ô>ôHõRö_ön÷€ø”ùªùÆùí öÿ ôÿ óÿ óÿ óÿ óÿ™£‹¬|µm¾_ÆRÍEÒ9Ø/Þ&âêûÿÿÿÿ!ÿ(ÿ0 ÿ9 ÿC ÿNÿ\ÿlÿ€ÿ–ÿ­ÿÊÿðÿÿÿÿÿÿÿÿÿÿ«}µn¿`ÈRÐC×7Ý+â"æêùÿÿÿ ÿ ÿÿÿ"ÿ*ÿ3ÿ=ÿIÿWÿiÿ~ÿ•ÿ¬ÿÇÿèÿúÿúÿúÿú€µp¿aÉRÓCÛ5á)æêîøÿ ÿÿÿÿ ÿÿÿÿÿ#ÿ+ÿ6ÿCÿSÿeÿzÿ‘ÿ¦ÿ¸ÿÏÿÏÿÏÿÏÿ/ÿ ,ÿ!,ÿ.ÿ3ÿ<ÿFÿ Tÿ aÿ oÿ {ÿ †ÿ ÿ ™ÿ  ÿ §ÿ ­ÿ ´ÿ ¼ÿ Åÿ Ñÿ ãÿ ïÿ ùÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ-ÿ#)ÿ$)ÿ"+ÿ0ÿ8ÿCÿPÿ^ÿkÿwÿƒÿÿ•ÿÿ¤ÿªÿ±ÿ¹ÿÁÿÍÿßÿìÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#*ÿ&&ÿ(%ÿ''ÿ#+ÿ3ÿ@ÿMÿZÿgÿsÿ~ÿ‰ÿ‘ÿ™ÿ ÿ§ÿ®ÿµÿ¾ÿÉÿÚÿéþöûÿùÿùÿøÿøÿøÿøÿøÿøÿÿ&&ÿ*"ÿ, ÿ+"ÿ(&ÿ'0ÿ$<ÿ"IÿUÿbÿnÿzÿ„ÿÿ•ÿœÿ£ÿªÿ²ÿºÿÅüÓùçõôòÿñÿðÿïÿïÿ ïÿ îÿ îÿ îÿ ÿ*"ÿ.ÿ0ÿ0ÿ0"ÿ0,ÿ.7ÿ+Dÿ(Qÿ&]ÿ$iÿ#uÿ#þ#ˆý#‘û#˜ú# ø#§÷#®õ#·ô#Áò$Ïî$äê%òè%þæ$ÿ ä%ÿ ã%ÿ ã$ÿ â$ÿ á$ÿ á$ÿ á$ÿ ÿ.ÿ3ÿ5ÿ5ÿ8ÿ8'ÿ73ÿ4?ÿ2Kÿ/Xû.dø-oõ,zó,ƒñ,Œï,”í,œì,£ê,«é,³ç,¾ æ,Ì â-âÞ-ñ Û,þ Ö-ÿÔ,ÿÒ,ÿÑ,ÿÏ,ÿÎ-ÿÎ-ÿÎ-ÿÿ2ÿ7ÿ:ÿ<ÿ?ÿ@"ÿ>-ÿ<9ú:Eô8Rð7^ì6jé5tæ5~ aä4‡â4 à4˜ Þ4Ÿ Ü3§ Ú3° Ø3» Õ3É Ò4ß Î4ðÊ4ýÇ4ÿÅ4ÿÃ4ÿÃ3ÿÀ4ÿ¿4ÿ¿4ÿ¿4ÿÿ6ÿ;ÿ> ÿCÿFÿFÿF&öD2ïB?é@Lä?Yß>dÛ=oØ„}H |Q{zYwy`swhovp!lux%it‚(fsŽ+crš.`q¨/^qº0]qÔ0]qò.^qÿ,^pÿ+_pÿ)`oÿ(`nÿ(`nÿ(`nÿ(ñUÞbÊm½u³{«€¢‚˜‘ƒ…ˆ….ƒ„;~ƒE zNu€Vq^n}fj|m g{v#cz€'`y‹*]x˜,Zw¦.Xw¸/WwÑ/Wwñ.Xvÿ,Xvÿ*Yuÿ)Ztÿ(Ztÿ'Ztÿ'Ztÿ'íY×fÅq¹z¯€¦„†‘‡Š‰ †Š‚‹+}Š8x‰BtˆL o‡Tl…[h„cdƒka‚t!]}$Z€‰(W–*U~¤,R~¶-Q~Î-Q}ï,R}ÿ+R|ÿ)S{ÿ(Tzÿ'Tzÿ'Tzÿ'Tzÿ'è^ÐkÀv´~«…¡‰—‹‰ƒ~{‘'v‘4r?mI iŽQeYbŒ`^‹h[ŠqW‰{!Tˆ†$Q‡”'O†¢)M†´*K†Ì*K…î)L„ÿ)Lƒÿ(Lƒÿ'Mÿ&Nÿ&Nÿ&Nÿ&ácÉp»{°„¦Š›Ž‘‘„“z•u—r˜"o˜0j—;f—Eb–N _•V[”]X“eU“nQ’xN‘„ K‘#I¡$G²&EÊ&Eí%Eÿ%EŒÿ%F‹ÿ$FŠÿ$FŠÿ$FŠÿ$FŠÿ$ØiÃvµ«ŠŸ•“Š–~špkŸhŸf *b 7_ŸA[ŸJXžR TžZQbNœkKœuH›E›BšŸ@š° ?šÈ ?™ë?˜ÿ >–ÿ!>•ÿ!?”ÿ!?”ÿ!?”ÿ!?”ÿ!Íp¼}°ˆ¤™”Ž˜ƒw i¤`§]¨[©$Y©1V©<S©EP¨NM¨W J¨_ G§hD§sA¦>¦<¦:¦¯9¦Ç9¥ê8£ÿ7¡ÿ7 ÿ7Ÿÿ7Ÿÿ7Ÿÿ7ŸÿÄxµ…©•’š†Ÿz£n¨b¬U°P²N²M³(K³5I³?F³ID³RA³[?³d<³o :³{ 7³Š5²š3³­2³Å2²é1°þ0®ÿ/­ÿ/¬ÿ/¬ÿ/¬ÿ/¬ÿ»®Ž¡•–š‰ }¦q«e¯Y´N·C¼@½?½>¾+<¾6;¿A9¿K7¿T5À_3Àj1Àw/À†-À—+Àª*ÁÂ*Àç)½ý (¼ÿ 'ºÿ '¹ÿ'¹ÿ'¹ÿ'¹ÿ²Œ¥”™š¡§r­f³Z¸O»D¿:Ä0É.Ê-Ê,Ë)+Ë5+Ì@*ÍJ(ÍV'Îa&Îo$Î#Ï‘!Ï¥ н ÏäÍúËÿÊÿÉÿÉÿÉÿÉÿ¨”œš¡‚¨t¯g¶[¼NÀCÃ9Ç/Ì'ÐÖ ÚÛÛ&Ü1Ý<ÝHÞUßbàrà…ášâ±ãÏàôÞÿÝÿÛÿÛÿÛÿÛÿžš’¡„©v±h¸[¿NÄBÈ7Ì-Ð$ÕÛßéêëë&ì0í: îF îS ïb ðtñ‰ò òºñäñýïÿíÿíÿíÿíÿ•¡†©x²iº[ÂMÈ@Ì4Ñ*Ö!Ûàäð ù ú ûûü$ü,ü7üBüPüaýuüŒü¤üÁüëüÿýÿýÿýÿýÿ‰©y²j»\ÄNÌ?Ñ2×'Ýáåè ñýÿÿ ÿÿÿÿÿ'ÿ1ÿ>ÿMÿ_ÿuÿÿ¦ÿÂÿçÿüÿÿÿÿÿÿ|³l¼]ÆNÏ?Ö1Ý%âæê îòÿÿÿÿÿÿ ÿÿÿÿ!ÿ+ÿ9ÿJÿ]ÿsÿŒÿ¤ÿ¹ÿÔÿÞÿÞÿÞÿ,ÿ)ÿ(ÿ+ÿ0ÿ 8ÿDÿQÿ^ÿlÿxÿ‚ÿŒÿ”ÿœÿ¢ÿ¨ÿ¯ÿ¶ÿ¾ÿÈÿ×ÿçÿóÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)ÿ&ÿ%ÿ'ÿ,ÿ4ÿ @ÿNÿ[ÿhÿtÿÿˆÿ‘ÿ˜ÿŸÿ¥ÿ¬ÿ²ÿºÿÄÿÑÿäÿñÿüüÿüÿüÿüÿüÿüÿüÿüÿÿ&ÿ!"ÿ !ÿ#ÿ'ÿ0ÿ<ÿJÿ Wÿ cÿ oÿ zÿ „ÿ ÿ ”ÿ ›ÿ ¢ÿ ¨ÿ ¯ÿ ·ÿ Àÿ Ìÿ àû ï÷ úõ ÿõ ÿô ÿô ÿô ÿô ÿô ÿô ÿÿ""ÿ$ÿ$ÿ"ÿ"ÿ,ÿ8ÿEÿRÿ^ÿjÿu¢Óÿÿˆÿÿ—ÿžÿ¥ý¬ü³ú½ùÉõÝñíîùìÿëÿêÿéÿéÿéÿéÿéÿÿ&ÿ(ÿ(ÿ&ÿ&ÿ&(ÿ#4ÿ @ÿMÿYÿeþpüzùƒ÷Œö“ôšó¡ñ¨ð°îºíÆêÙæëâùàÿÞÿÝÿÜÿÜÿÛÿÛÿÛÿÿ*ÿ-ÿ-ÿ-ÿ.ÿ-"ÿ,.ÿ):ÿ&Gú$Tö#`ò"kï"uí"~ë"‡é"ç"–å"žä"¥â"­á#·ß#ÃÝ#ÖØ$êÒ$ùÏ%ÿÍ%ÿË%ÿÊ%ÿÊ$ÿÊ$ÿÊ$ÿÊ$ÿÿ.ÿ1ÿ2 ÿ4ÿ5ÿ5ÿ3'ú14ó/Aî-Né,Zå,eâ,pß+yÝ+‚Ú+‹Ø+’Õ+šÓ+¢Ñ+ªÏ+³Í+¿Ì,ÏÈ-çÄ-÷ Á-ÿ ¿-ÿ ½-ÿ ¼-ÿ ¼,ÿ »,ÿ »,ÿ »,ÿ ÿ1ÿ5 ÿ6ÿ: ÿ<ÿ;ø9ï7+ç69á5GÜ5TÕ5`Ñ5jÎ4sÌ4|Ê4…È4Æ3”Ä3œ Â3¥ Á3® ¿3¹ ½3È »4á ·4ó ´4ÿ±4ÿ°4ÿ¯4ÿ®4ÿ®4ÿ®4ÿ®4ÿÿ5ÿ8ÿ<ÿ@ÿA úAí?ã<"Ú=1Ò>AÌ>OÈ>ZÄ=dÁ=n¿ÿCëKÝQÑTÊTÆRÁQ¹S"³U3®TAªTL¦SV¢Q_ ŸPgOošNw˜N–Mˆ“L‘‘L›K¦K³‹KʼnKâ‡L÷†Lÿ…Lÿ…Mÿ…Lÿ…Lÿ…Lÿ…Lÿÿ@üGåPÕVÊYÂZ½X¸W±Y¬Z/§Z=¢YIžXS ›W[ —Vd•Uk’TsS{R„‹QˆQ—†P£„P° ‚PÁ!€PÝ!~Qô }Qÿ}Qÿ}Qÿ}Qÿ}Qÿ}Qÿ}QÿÿBðJßTÎZÄ^¼_¶^±\ «^¥`+ `:œ_E—^P ”\X [`Zh‹YpˆXw…W€ƒV‰€V”~UŸ!{U­"yT½#xU×#wUò"vVÿ vVÿvVÿvVÿvVÿvVÿvVÿÿEìNÚXÉ^¿b·d±c«a¤cŸd(še7–dC‘cMŽaU Š`]‡_e„^l]t~\}|[†yZ‘ wZ"tYª$rYº%qYÒ%pZð#oZÿ"oZÿ pZÿpZÿpZÿpZÿpZÿÿHçRÓ[Åb»f³h¬h¥fŸgši%•i4h@ŒgJˆfS „e[db~cj{brxazv`„s_Ž!p^š#n^¨%l]¸%j^Î&i^î$i^ÿ"j^ÿ j^ÿj^ÿj^ÿj^ÿj^ÿùJãUÏ_Áe·j¯l§lŸj™k”m"n1‹m=‡lGƒkP jX|h`xggvgosfxpemdŒ!jc˜#hb¦%fb¶&dbÌ&dbì%dbÿ#dbÿ!ebÿebÿebÿebÿebÿòLßXÊb½i³n«p¢p™n“prŠr.†r;‚qE}pN znVvm^slepkmmjujigiŠ!eh–#bg¤%`g´&_gÉ&^gê%^gþ#_gÿ!_fÿ`fÿ`fÿ`fÿ`fÿïOÚ\Æeºm°r§ut”st ‰v…w+w8|vCxuL ttT qs[nrckqkhpseo|bn‡ _m”"]l¢$Zl²%YlÇ%Xlè%Ylý#Ykÿ!Zkÿ[kÿ[jÿ[jÿ[jÿëSÓ`Âi¶q¬v£y™yw‡y ƒ{|({|5w{@szIoyQ lxYhwaevhbup_tz\t…Zs‘!Wr #Ur°$SrÅ$Srç$Sqü"Tqÿ TpÿUpÿUoÿUoÿUoÿåWÍd¾m²u¨{Ÿ~“}‡}€|€x$u‚2q=m€Fi€O fV c~^`}f]|nZ{wWz‚TzQy!Oy®"NyÃ"Mxå"Mwû!NwÿNvÿOuÿOuÿOuÿOuÿß\Èh¹r®z¥€š‚Ž‚€ƒy…t†qˆ nˆ.jˆ9g‡Cc‡L`†S ]…[Z„cW„kTƒuQ‚€NK›I¬H€Á G€ãGúH~ÿH}ÿI|ÿI|ÿI|ÿI|ÿÖaÂn´xª€Ÿ…”‡ˆ‡{‰pŒkŽ hf)b5_?\HYŽPVŽX S`PŒhMŒrJ‹}HŠŠEŠ™CŠªBŠ¿AŠáAˆùA†ÿA…ÿB…ÿB„ÿB„ÿB„ÿÍg¼t¯~¥†šŠŽŒ‚ug”a•^—\—#Z˜/W˜:T˜DR—LO—TL—\ I–e G–oD•zA•ˆ?”—=”¨;”½;”ß:’ø:ÿ:ÿ:Žÿ:Žÿ:Žÿ:ŽÿÅn¶{ª…ž‹”ˆ’{”n—b›WžR Q O¡(M¡4K¡>I¡GG¡PD¡XB¡a? k = w : … 8 ”6 ¦5 »4 Ý4÷3œÿ3šÿ3™ÿ3™ÿ3™ÿ3™ÿ½w¯ƒ£‹˜‘•™sœgŸ[¢O¦G©DªCªA«+@«7?¬A=¬J;¬S9¬\7¬g5¬s2¬0¬‘.¬£-¬¸ ,¬Ù,ªõ +¨ÿ *¦ÿ *¥ÿ *¥ÿ *¥ÿ *¥ÿ µ€¨‹œ‘‘–…œx k¥_¨S¬H¯=²6µ 4µ3¶!2¶,1·70·A/¸K.¸U,¸`*¸m)¹{'¹%¹Ÿ$¹´#¹Ò#·ô"µÿ!´ÿ!³ÿ!²ÿ!²ÿ!²ÿ­Š ‘•—ˆ{£n¨a­U±J´?·4»+¾$ "Â"Ã!Ã* Ä4Ä?ÅJÆVÆcÇsDžǙȮÈËÆñÄÿÃÿÁÿÁÿÁÿÁÿ£‘˜˜‹ž}¥p«b±V¶J¹>½4À*Ä"ÈÌÐ ÒÒÓ%Ó0Ô<ÔH ÕV Õe Öx Ö Ø¤ ؾ Ùæ Öþ Ôÿ Òÿ Òÿ Òÿ Òÿš˜ŽŸ€¦r­d´WºI¿=Â2Æ(ÉÍÑÖ ÛÞ ßßà$á.â:ãGäVägå{æ’æªçÈçðèÿèÿèÿèÿèÿ‘Ÿ‚§t¯e·W¾IÃ<Ç0Ë%ÏÔÙÝ áåéé éêë!í+ï7ñEòVóhó~ô—õ°öÐ÷ó÷ÿ÷ÿ÷ÿ÷ÿ…§v°f¸XÁJÈ;Ì.Ñ#ÖÜà ãçêõôõõ ööøú'ü4ÿCÿUÿiÿÿšÿ²ÿÏÿíÿùÿùÿùx°hºYÃKË;Ñ-Ø!Ýâæêíðøÿÿÿÿÿÿ ÿÿÿ"ÿ0ÿ@ÿSÿiÿÿ™ÿ¯ÿÃÿÕÿÕÿÕÿ(ÿ%ÿ%ÿ 'ÿ-ÿ5ÿAÿOÿ\ÿiœ‰I_ÿtÿ~ÿˆÿÿ—ÿÿ¤ÿªÿ°ÿ·ÿÀÿÌÿßÿìÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%ÿ"ÿ!ÿ#ÿ (ÿ0ÿ=ÿKÿXÿdÿpÿzÿ„ÿŒÿ“ÿšÿ ÿ¦ÿ­ÿ´ÿ¼þÈýÙûéúöùÿøÿøÿøÿøÿùÿùÿùÿÿ"ÿÿÿÿ"ÿ ,ÿ9ÿFÿSÿ`ÿkÿvÿÿˆÿÿ–ÿÿ£þ©ü°ú¹÷ÄõÒóæòôñÿðÿïÿïÿïÿðÿðÿðÿÿÿÿÿÿÿ(ÿ4ÿ Aÿ Nÿ[ÿfÿqÿzÿƒþ‹ü’ú™øŸö¦ô­òµðÀíÎëäéóæÿå ÿä ÿä ÿä ÿä ÿä ÿä ÿÿ!ÿ!ÿ ÿÿÿ$ÿ/ÿ<ÿIÿUüaùköuô~ò†ðŽî•í›ë¢êªè³æ½åÌáãÝóÙÿÖÿÔÿÓÿÒÿÒÿÒÿÒÿÿ%ÿ%ÿ$ ÿ#ÿ#ÿ"ÿ)ÿ5ùCôOï[ìfépæyäâ‰à‘ߘݟۧٱֻÔÊÐáÌóÉÿÆÿÄÿÃÿÃÿÃÿÃÿÃÿÿ(ÿ) ÿ(ÿ+ ÿ+ÿ)ý&"ô#.ì!;æ Iâ UÞ `Ú!jÖ!tÓ!|Ð!„Ï"ŒÍ"“Ë"›É"£È#¬Æ#¶Ä#ÄÂ$Û¾%î»%þ¸%ÿ¶%ÿµ%ÿµ%ÿµ%ÿµ%ÿµ%ÿÿ, ÿ-ÿ.ÿ1ÿ1 ý/ñ+ç)%ß(3Ø(BÑ*OÍ+ZÉ+eÇ+nÄ,vÂ,~À,†¾,޽,–»,ž¹,§¸,±¶,¿µ-ѱ-ê®.û«.ÿ©.ÿ¨.ÿ¨-ÿ¨-ÿ¨-ÿ¨-ÿÿ/ÿ1ÿ5ö7ê6ç3ä/Ù.Ï1,É3<Ä4IÀ5U¼5_º5h·5pµ4x³4€±4ˆ°4®4™¬4¢«4¬ ©4¹ §4Ê ¥5å ¡5ø Ÿ5ÿ 5ÿ 5ÿ œ5ÿ œ5ÿ œ5ÿ œ5ÿ ÿ3ÿ5ö:å>Ü@Ô=Ò7 Ë8Ã:&½=6¸>D´>P±=Z®=c¬=k©èGÕPÆV¼X´Y­V§S¡TœV%˜W4”W@WJVSŠU[ ‡Tc „Tj‚Sr€Rz}Rƒ{QŽxP™vP¦tPµsPÉqPèpQüpQÿpQÿpQÿqPÿqPÿqPÿõ@äKÏTÁZ·]¯^§[¡X›Y–["’\1Ž\=Š\G‡[PƒZX Y` ~Yg{XoyWwvV€tV‹rU–oU£mT²lTÆjUæjUûjUÿjUÿjUÿkUÿkUÿkUÿòCßOËX½]³a«b¢`›\•^`Œa.ˆa:„`E`N~_V {^] x]ev\ls\tp[}nZˆkZ”iY¡gY°eYÃdYãdYúdYÿdYÿeYÿeYÿeYÿeYÿïFÚRÆ[ºa°e¦fc•ab‹d‡e+ƒe7eB|dKxcSuc[ sbbpajm`rk`{h_†f^‘c^Ÿa]®`]Á_]á_]ø_]ÿ_]ÿ`]ÿ`]ÿ`]ÿ`]ÿëJÔVÃ^¶e¬i¢i˜ge‰f …hi(~j5zi?viIshQpgY mg` kfghepedycdƒ`c^b\b¬Zb¿YbßYb÷ZbÿZaÿ[aÿ[aÿ[aÿ[aÿçMÏY¿b³h©mžm“k‰iƒk m|n%xn2un=qnFnmOklV hl^ ekecjm`iv]i[hXg›VgªUg½TgÜTgöTfÿUfÿUeÿVeÿVeÿVeÿâQÊ]»f¯l¦q™pŽoƒn}pxrus!rs/os:lsDirLfrTcq[ `pc ]pk[otXnUn‹Sm™Qm¨Om»NmÙNlôOkÿOkÿPjÿPjÿPjÿPjÿÝUÅa·j¬q¢u”t‰t|svuqwoxly+iy7fy@cyI`xQ]wX [w` XvhUuqRu|PtˆMt—Ks¦Is¹HsÕIróIqÿJqÿJpÿKpÿKpÿKpÿÔZÀf³o¨vyx„xwyo|j} g~d&b€2_€=\€FZNWUT~] R}e O}oL|yJ|†G{”E{¤D{·C{ÒCzòCyÿCxÿDwÿDvÿDvÿDvÿÍ_»k®t¤|—~Š}~rfƒa„^†\‡!Z‡.X‡8U‡BS‡JP‡RN†ZK†b I…l F…w C„ƒA„’?„¢=„µ<„Ï<‚ð<ÿ=€ÿ=ÿ=~ÿ=~ÿ=~ÿÅfµqª{Ÿ‚’‚…‚yƒm†_ŠXTŽRP'O3M=KEINFVD_Bh?s =Ž€ :Ž 8Ž  7޳6ŽÌ6ï5‹ÿ5‰ÿ5ˆÿ6‡ÿ6‡ÿ6‡ÿ¾m°y¥‚™‡ŒˆˆrŠfZ‘P•I— G˜E˜ D™+C™6Aš@@šH>šQ<šZ:šd7šo5™}3™Œ1™/™°.™Ê.˜í.–ÿ -”ÿ -“ÿ -’ÿ -’ÿ -’ÿ ¶uªžˆ“†Žxk’_•T™I@ :¢ 8£7£"6¤-5¤74¤A3¥K1¥T0¥^.¥j,¥x*¥ˆ(¥š'¥­&¥Æ&¤ë%¢ÿ% ÿ$Ÿÿ$žÿ$žÿ$žÿ¯~£ˆ—Ž“~•p˜c›WŸL¢B¦8©/¬*®)®(¯#'¯-&°7%°A$°K#±V"±c!±q±‚²”²©²Á±ç¯þ­ÿ¬ÿ«ÿ«ÿ«ÿ¨ˆ›‘”„švŸh¢[¥O©D­9°/³&¶¹»»¼ ¼*½5½@¾K¾X¾g¿x¿ŒÀ¢ÀºÀá½û¼ÿºÿºÿºÿºÿŸ”•‡›y¡k§^¬R±E´:¶/¹%¼¿ÃÆ Ê ÊÊÊ'Ê2Ë>ËKÌZÌjÌ~̫̔ÍÈÌíÌÿËÿÊÿÊÿÊÿ—–Šœ|£nª`°R¶E¹9¼.¿#ÃÆÊ ÍÑÔ ÔÕÖØ'Ù1Û>ÜKÝ[ÞnބߛߴÞÙß÷ßÿßÿßÿßÿ¥p¬a³SºE¿8Â,ÆZcÿa!ÉÍÑ ÕÚÞàá âäåç$é/ë<íKî]îqï‰ð¢ð¼ðãïùðÿðÿðÿ¥r­cµT½FÄ7È*ÌÐÕÚÞâæéêìîï ñóõ ø+û9ýJþ^ÿtÿÿ¦ÿÀÿáÿõÿõÿõt®e·VÀGÈ8Í*ÒØÝ âæéìðóôöøúýÿ ÿÿÿ(ÿ7ÿJÿ^ÿvÿÿ¦ÿºÿÑÿÑÿÑÿ$ÿ"ÿ !ÿ$ÿ)ÿ2ÿ>ÿLÿYÿeÿpÿzÿ„ÿŒÿ’ÿ™ÿŸÿ¥ÿ«ÿ²ÿºÿÅÿÓÿçÿôÿÿþÿÿÿþÿþÿþÿþÿþÿÿ!ÿÿ ÿÿ#ÿ-ÿ:ÿHÿUÿaÿlÿvÿÿ‡ÿŽÿ•ÿ›ÿ¡ÿ§þ®ý¶üÀûÍùâøð÷üöÿõÿõÿõÿõÿõÿõÿÿÿÿÿ ÿÿ)ÿ6ÿCÿPÿ\ÿgÿqÿzþƒüŠú‘ù—ø÷£õªô²ò»ñÈïÜîìíúëÿêÿêÿêÿêÿêÿêÿÿÿÿÿÿ ÿ$ÿ0ÿ>ÿKÿWÿbüløuõ~ò…ñŒï“î™ì ë¦é®ç·æÃäÔâéá÷ßÿÝÿÝÿÝÿÝÿÝÿÝÿÿÿÿÿÿÿÿ +ÿ 8ÿEûQ÷\òfîpêxç€æ‡äŽâ•áœß£Ý«Û´ØÀÖÐÓçÐøÎ ÿÌ ÿË ÿË ÿË ÿË ÿË ÿÿÿ ÿÿ ÿÿÿ$ú0ó>î Jé Vå aâ jÞ sÛ {Ù ƒÖ ŠÔ ‘Ò ™Ð Ï©Í³Ë¿ÊÐÆéÂù¿ÿ½ÿ¼ÿ¼ÿ¼ÿ»ÿ»ÿÿ" ÿ!ÿ ÿ!ÿ ÿöì(å6ßCÙOÓZÐdÍmËuÉ}DžŌĔœÀ¥¾¯½»»˸å´ö²ÿ°ÿ¯ÿ®ÿ®ÿ®ÿ®ÿÿ&ÿ%ÿ&û'ñ%ð! èÞÔ-Í<ÈIÅ UÁ!_¿"h¼"pº#x¹#·#‡µ#´$—²$ ±$ª¯$¶­%Æ«%ߨ&ó¥&ÿ£&ÿ¢&ÿ¡&ÿ¡&ÿ¡&ÿ¡&ÿÿ)ÿ(ö-ç0ß/Ù+Ö" Î#Æ&'À(6»*D¸+Oµ,Y²,b°,j®-r¬-zª-©-Ч-’¥-›¤-¥¢-± -ÀŸ-Øœ.ï™.ÿ—/ÿ–/ÿ•.ÿ•.ÿ•.ÿ•.ÿÿ,ÿ.ê5Ý9Ñ9Ê6Ç/Á-º0!´21°4>¬5J©5T§5]¤5e¢5m 5tŸ5|5„›5š4—˜4¡–4­”5»“5Ð5ìŽ6þŒ6ÿ‹6ÿ‹6ÿŠ5ÿŠ5ÿŠ5ÿÿ/ò4â<ÒAÇBÀ@»:¶6°9ª;,¦<:£=FŸ=P=Yš=a˜=h– ¦@¢B'žC5šDB—DL”DU‘C]CdCk‹Bs‰B{‡B„ …AŽ ƒA™ A¥ A³~AÆ|AäzBù yBÿ xBÿ xBÿ xBÿ xAÿ xAÿ ö6æ@ÑHÃM¹N±M©I¤EŸFšH#–I2’J>JHŒJQŠIY‡I`…IhƒHoHw G€ }GŠ zG•xF¢vF°uFÂsFàrG÷qGÿqGÿ qGÿ qGÿ qFÿ qFÿ ó9àDÌL¾Q´SªR¢NJ—K“M O.ŒO:ˆOE…ONƒOV€N]~Nd|Ml yMt wL} uL‡sL’qKŸoK­mK¿lKÜkLõjLÿjLÿjKÿ jKÿ jKÿ jKÿ ð=ÛHÇPºU°X¥VœS—O‘PŒR‰T+…T7‚TBTK|TSzSZxSbuRi sRq qQz nQ„lPjPœhP«fP¼ePØdPódPÿdPÿdPÿeOÿ eOÿ eOÿ ìAÔLÃT¶Y¬\ Z—W‘T‹U †WƒX'€Y4}Y?zYHwXPtXXrW_oWf mVn kVw hUfUdTšbT©`Tº_TÓ^Tò^Tÿ_Tÿ_Tÿ_Sÿ _Sÿ _Sÿ çDÏP¿X³]¨_œ]’[‹X…Z [}\$z]1w]<t]Fq]No\Ul\]j\d h[l eZu cZaY‹^Y˜\X§[X¸YYÐYXðYXÿZXÿZXÿZWÿ ZWÿ ZWÿ ãHËS»[°a¤b—aŽ_…\^{_xa!ub.rb9obClaKjaSgaZe`b c`j `_s ^^}[^‰Y]–W]¥U]¶T]ÎT]îT]ÿU\ÿU\ÿU[ÿV[ÿ V[ÿ ÞLÇV¸_­d e“d‰caybudreof+lg7jg@gfIefQbeX`e`]dg [dp Yc{Vc†Tb”Rb£Pb´ObÌObíOaÿOaÿP`ÿP`ÿP`ÿ P`ÿ ÙOÃZ´c©i›hg„gyesgoiljik(gl4dl=blF_kN]kVZj]Xje Vin Six Qh„Nh’Lg¡Kg²IgÉIgëIfÿJfÿJeÿKeÿ Kdÿ Kdÿ ÑT¾^±g¦m—lŠkkskmmhn epbq$`q0^q:\qCYqKWqSUpZRpbPpk Nou Ko‚ InGnŸEn°DnÇCmêDlÿDkÿEkÿ Ejÿ Ejÿ Ejÿ ËXºc­l¡q’p…ozonpes`u]v[wYx+Wx6Ux?SxHQxOOwWLw_JwhHvs Ev Cu Au?u®>uÅ=uè>sý >rÿ >qÿ ?qÿ ?pÿ ?pÿ Å^µi©qœut€tutiv^yX|T}R~Q&O1M€;L€CJ€KHTF\CeAp?~|<~Š :~š 9~¬ 7~à 7}æ 7{ü 7zÿ 7yÿ 8xÿ 8xÿ 8xÿ ¾d°o¥x–y‡y{ypzd|X€PƒK… H†G‡ Eˆ+Dˆ5Cˆ>A‰G@‰O>ˆX<ˆa:ˆl7ˆx5ˆ‡3ˆ˜2‡ª0ˆÀ0‡ä0…û0ƒÿ0‚ÿ0ÿ0ÿ0ÿ·kªv ~‚~vj€^ƒS‡J‹AŽ=;:‘#9‘-8’77’@6’I4“R3“\1“g/“t-’ƒ+’”*’§(’½(’á'ú'Žÿ'ÿ'Œÿ'Œÿ'Œÿ±t¥~™…Š„}„o…cˆX‹MC“:—2š.›-›,œ$+œ.*8)A(K'žU&ža%žn#ž~"ž ž£ž¹žÝœøšÿ™ÿ—ÿ—ÿ—ÿª}ž…“‹…Šu‹hŽ[‘P•F™;2 *£"¦ §§¨$¨-¨7©A©L©Xªfªvª‰ªž«´«Ó¨õ§ÿ¥ÿ¥ÿ¤ÿ¤ÿ£†—Œ‘}’m•`˜ÞY¦TœH >¤4§*«!®±³µµµ! µ+ µ6 ¶A ¶N ¶\ ¶l¶¶”¶ª¶Å¶êµÿ´ÿ³ÿ ²ÿ ²ÿš“„˜tœe W¤K¨@¬5°*³!µ¸» ¾À ÀÁÁ"Â+Â6ÃBÃPÄ_ÄqćÄĵÄÚÄöÃÿÃÿÃÿÃÿ“”‡šx j¦\¬O±Aµ5·)º½Àà ÆÊÌÌ ÍÎÎ!Ð*Ñ5ÓCÔRÔcÕxÕÕ§ÖÂÖéÖýÖÿÖÿÖÿŠ›{¢l©^°P¶Bº4½(ÁÄÇ ËÎÒ×ÙÚÜ Ýßáã'å3çBèTègé~é—ê¯êÎëïëþëÿëÿ}£n«_²QºBÀ4Ã'ÇËÏ ÓØÝáäåçéëí ïñô$÷1ùAúUújû„ûü¶üÒýíýôýôq¬aµR½DÄ4É&ÍÒØÝáåèìïñóõ÷ùûþÿÿ!ÿ/ÿAÿVÿmÿ‡ÿ ÿ¶ÿÊÿÔÿÔÿ ÿÿÿ ÿ%ÿ.ÿ;ÿIÿVÿbÿmÿvÿÿ‡ÿŽÿ”ÿšÿ ÿ¦ÿ­ÿµÿ¾ÿËÿáÿðþýýÿýÿýÿýÿüÿùÿùÿÿ ÿ ÿÿÿÿ*ÿ7ÿEÿQÿ^ÿhÿrÿzÿ‚ÿ‰ÿÿ–ÿœþ¢ü©û°ù¹øÆöÙõëôùóÿòÿóÿóÿóÿóÿóÿÿÿÿÿÿÿ%ÿ2ÿ@ÿLÿYÿcþmüuú}ù„÷‹ö‘ô—óžò¤ð¬î´íÀëÏéæèõæÿçÿæÿåÿåÿåÿåÿÿÿÿ ÿÿÿ ÿ,ÿ:ÿGúS÷^ôgñpïxíë†êŒè“ç™å ã§á°ßºÝÉÛàØð×þÕÿÔÿÓÿÓÿÓÿÓÿÿÿ ÿ ÿ ÿ ÿÿ&ý3ô@ïMëXèaåjâràzހ܇ڎؕԜңЬζÌÄÊÙÈíÇûÅÿÄÿÃÿÄÿÄÿÄÿÿ ÿÿÿÿ ÿ üñ+ç9âFÞQÚ[ÕdÒlÏtÍ{Ë‚Ê‰ÈÆ˜Ä Â©Á´¿Á½Õ» ì¸ ý¶ ÿµ ÿ´ ÿ´ ÿ´ ÿ´ ÿÿÿÿÿûúî ã "Ú 0Ó >Î JÊ UÇ ^Å gÂoÁv¿~½…¼º•¸·§µ²³À²Õ®î«þ©ÿ§ÿ§ÿ¦ÿ¦ÿ¦ÿÿÿúëãßÞ ÓË(Å7ÀD¼O¹Y·a´i³q±x¯€®ˆ¬«™©£§®¦¼¤Ï¡êžüœÿ›ÿšÿšÿ™ÿ™ÿÿ"ÿ!ì'à*Ô)Í$ÊĽ"·1³ >¯!I­"Sª#\¨$d¦$l¤$s£$z¡%‚ %‹ž%”%ž›&ª™&·˜&É•'æ’'ù(ÿ(ÿŽ'ÿŽ'ÿŽ'ÿŽ'ÿÿ&ò)ã1Ò4È4À0»)¸#±&¬(+¨*8¤+D¡,NŸ-W-_›-g™-n˜.u–.}”.†“.‘.š.¦.³Œ.ÅŠ/á‡/ö…/ÿ„/ÿ„/ÿƒ/ÿƒ/ÿƒ/ÿû)ë1Ù8É<¿<¶9°2¬- §/¢1&ž34š4@˜5J•5S“5[‘5b5i5qŒ5yŠ5‚ˆ5‹†5–„5¢‚5¯5À6Ü}6ô{6ÿ{6ÿz6ÿz6ÿz5ÿz5ÿõ-ä7Ð?ÂC·D­@§:£67™9"•:/’<;hÞ >g÷ >fÿ?eÿ?eÿ?dÿ?dÿÃW³a§i–h‡g{gqgeh\jXlTnRoPo$Np.Mp8KqAJqIHqQFqYDpbBpl@px>p†¹xumuawWzL~C;…5ˆ 2‰1‰0‰%/Š/.Š8-‹A,‹J*‹T)‹_(‹k&‹z$‹‹#‹ž"‹³!ŒÎ!Šñ ˆÿ †ÿ …ÿ!…ÿ!…ÿ«r¡|{€zszf|[P‚F†<Š4,‘&“ $”#”"•&!•/ •8–B–L–X–d—t—†—™—®—É•î“ÿ’ÿ‘ÿÿÿ¥{™ƒ‰{€l‚_„TˆI‹?5”-—%šž  ¡¡¡%¡.¢8¢C¢O¢\£k £} £’ £§ ¢À ¢æ  þ Ÿÿ žÿ ÿ ÿž„’‰ƒˆsˆe‹XŽL’A—7›.ž$¢¥¨« ® ­­­$®.®9®E®R®a®s®‡®®´®Õ­ô­ÿ¬ÿ«ÿ«ÿ–‹Œ{k’]–PšDŸ9£/§%«®±´ ·¸ ¸¹¹º%º/»:¼G¼V¼g¼{¼‘¼©¼Ä¼ë»þ»ÿ»ÿ»ÿ’ƒ˜s›cŸU£G¨;­0±%´·º ½¿ÃÄÅ ÅÆÇÈ$Ê.Ì:ÍIÍYÍl΃Λ͵ÎÚÎöÍÿÍÿÍÿ†™w i¦Z¬L²>¶0¹$¼¿ ÅÉÌÐÑÒÓÕ ×ÚÜ!ß,á:âJã]ärä‹å¥åÀåæåøåÿåÿz¡k©\¯M¶?¼0¿#ÃÇÊÎÑÖÜßàâäæè éìîñ+ô:õMöa÷yø“ø­ùÆùäùóùómª^²Oº@Á1Å"ÉÎ ÒØÝáäèëíïñóöøú ýÿÿ)ÿ;ÿOÿfÿÿ™ÿ¯ÿÃÿÖÿÖÿÿÿÿÿ"ÿ+ÿ8ÿFÿSÿ^ÿiÿrÿzÿ‚ÿ‰ÿÿ•ÿ›ÿ¡ÿ¨ÿ¯ÿ¹ÿÅÿÙþìýûûÿûÿûÿúÿôÿðÿðÿÿÿÿÿÿÿ&ÿ4ÿBÿNÿZÿdÿmÿuÿ}ÿ„ÿŠýü–úù£ø«÷´õ¿ôÎóæñöðÿïÿïÿîÿîÿêÿêÿÿ ÿÿÿÿÿ"ÿ.ÿ<ÿIÿTþ_ûhùp÷xõó…ò‹ð’ï˜íŸì¦ê®è¹çÇåÞãðâþàÿàÿáÿáÿáÿáÿÿ ÿ ÿ ÿ ÿÿÿ(ü6ùCöNòYïbìkêrèyæ€ä†âŒá“ߚݡ۪شÕÀÒÓÐêÎúÍÿÍÿÍÿÌÿÌÿÌÿÿ ÿ ÿÿÿÿö"ð/ì<éHåSá\ÞeÛl×sÔzҀЇΎ̕ÊȥƯĻÂËÀå¾õ½ÿ¼ÿ¼ÿ¼ÿ¼ÿ¼ÿÿÿÿ ÿÿ øéã(Þ5ÙAÓLÏVË_ÉfÆnÄtÂ{Á‚¿‰½¼˜º¡¸«¶·´Ç²à±ò¯ÿ®ÿ­ÿ­ÿ­ÿ­ÿÿÿÿò ê é ÝÔÍ-È:ÄEÀP½Y»a¹h·oµv´}²„±Œ¯•­ ž« ¨ª µ¨ Ŧ ߤ ô¢ÿ ÿŸÿŸÿŸÿŸÿÿÿïäÛÒÏ ÈÁ $¼ 2· >´I±S¯[­c«j©q¨x¦€¥ˆ£‘¡› ¦ž³œÛÞ—ô•ÿ”ÿ“ÿ’ÿ’ÿ’ÿÿôå#Õ%Ê$¾»´¯+«8§C¥M¢V ]žel›sš{˜ƒ—•—“¢’¯¿ØŒ ñ‰ ÿˆ ÿ‡ ÿ‡ ÿ† ÿ† ÿúë&Ú-Ê0¾.µ(°"® ¨£&Ÿ!3œ">™#H—$Q•$Y“%`’%g&nŽ&v&‹&ˆŠ'“ˆ'ž†'«„'»ƒ(Ñ€(î~)ÿ})ÿ|(ÿ|(ÿ|(ÿ|(ÿõ$ã.Ï5Á8´6«1¥,¢&ž&™(!•*.’+9,D-L‹-T‰.\‡.c†.j„.r‚.z/„/}/š{/§z/·x/Ìv0êu0þs0ÿs0ÿs/ÿs/ÿs/ÿð*Ü5Ç;º?¬<¢8œ3˜/•.0Œ2)‰35†4?„5I‚5Q€5X~5_}5f{6ny5vx5€v5‹t5—r6¤p6´o6Èm6çl6ük6ÿk6ÿj6ÿj5ÿj5ÿê0Ó:ÂA³C¥A›>•:6Œ5 ˆ7„8%:1;<|;Ez"z?.x@8uABsAJrAQpAYnA`lAgjAphAygA„eA‘cAŸaA®`AÂ^Aâ^Aù]Aÿ]@ÿ]@ÿ]@ÿ]@ÿß9ÈC¹J©K›IGˆDƒA~AzBvCtE*qE5oF?mFGkFOjFVhF]fFedFmbFv`F‚^FŽ\Eœ[E¬YF¿XFßXF÷WEÿWEÿWDÿXDÿXDÿÚ=ÄGµN¤N–L‹KƒI}ExFtGpHnI'kJ2jK<hKDfKLdKSbKZ`Kb_Kj]Kt[JYJŒWJšUJªTJ½SJÜRJöRJÿRIÿRIÿRHÿSHÿÔAÀK²Q P’O‡N~LxHrJnK kMhN$fN/dO9bOBaPI_PQ]PX[O`YOhWOrUO}SOŠRN˜PN¨NN»MNÙMNõMNÿMMÿMMÿNLÿNLÿÎD¼N®TœSŽRƒQzPrMlOhP eQcR!aS,_S6]T?[TGZTNXTVVT]TTfRSoPS{NSˆLS—KS§ISºHSÕHRóHRÿHQÿIQÿIPÿIPÿÊH¹RªW˜VŠUTvSlQgSbT_V]W[W)YX3XX<VYDUYLSYSQY[OXdMXmKXxIX†GW•EW¥DW¸CXÒCWòCVÿCUÿDUÿDTÿDTÿÆLµV¥Z”Y†X{XqWfVaX]YYZW[U\&S]0R]9Q^AO^IM^QL^XJ^aH]kF]vD]ƒB]’@]£?]¶>]Ð=\ñ>[ÿ>Zÿ>Zÿ>Yÿ?YÿÁP±Z¡]\‚[v[m[a[[]V^R` PaNb"Mb,Lc5Jc>IcFGcNFcVDc^Bch@cs>co=o"ÿJÿVÿ`ÿhÿpÿxý~ü…ú‹ù‘ø˜÷žõ¦ô®ò¹ñÇïàîòìÿìÿìÿëÿåÿàÿÞÿÿÿÿ ÿ ÿÿÿ+ÿ8ÿEþPûZøcõkórñyïî†ìŒê’é™ç æ©ä³áÀàÓÞëÜûÛÿÚÿÚÿÙÿÔÿÒÿÿ ÿ ÿÿ ÿÿû%ø2õ?òJíTê]çeälâsàzހ܆ÚהԛҤϭ͹ËÉÉäÈöÆÿÅÿÆÿÇÿÇÿÇÿÿ ÿÿÿÿ ôïê,å8âCÝNÙWÔ_ÑgÎmÌtÊzȀƇŎÖÁž¿¨½³ºÂ¹Û·ðµÿ¶ÿµÿµÿµÿµÿÿ ÿÿþöè àÙ$Ñ1Í<ÊGÆQÃYÀ`¾g¼nºt¹{·‚µ‰³‘²š°¤®¯¬½ªÐ¨ë§û¦ÿ¦ÿ¥ÿ¥ÿ¥ÿÿ ÿô ê âÚÏÈÂ)¾5»@·J´S²[°b®h¬o«u©}¨„¦¤–£ ¡«Ÿ¹Ìœèšù™ÿ˜ÿ—ÿ—ÿ—ÿÿ÷èÜÎÆ  ¼·!².®:«D¨M¦U¤ \¢ c  jŸ q xœ €š ‰™ “— ž• ª” ¸’ ÌêŽüŒÿ‹ÿ‹ÿ‹ÿŠÿûíÝ Ì!¿·³² « §&£3Ÿ>GšP˜W–^•e“l’s|…‹šŠ§ˆµ†É„ç‚û€ÿÿÿÿÿõä#Ï)À*³&ª"¥¤ ›!—-”8‘BKR‹Y‰`ˆg†o…wƒ€‚‹€—~ £} ²{ Åy!äw"ùv"ÿu"ÿt!ÿt!ÿt!ÿï!Û+Ç1¶1©. *›&˜!• !(‰#3‡$=…$Fƒ%N&U&\~&c|'k{'sy'|x(‡v(“t( r(¯q)Áo)àm)÷l)ÿk)ÿk)ÿk(ÿk(ÿè(Ð2À8®7¡5˜2’-Ž)‹' ‡(ƒ*#€+/~,9|,Bz-Jx.Qw.Xu.`s/gr/op/yo/ƒm/k/i/¬h0¾g0Ûe0õd0ÿc0ÿc/ÿc/ÿc/ÿâ.Ê8º=¨<š:‘7Š3†0ƒ. /{0x2+v35t3>r4Fp4No5Um5\l5dj5lh5ug5€e5Œc5ša6©`6»_6Ö]6ó]6ÿ\6ÿ\5ÿ\5ÿ\4ÿÜ3Å<´A¢@•>‹<„96{4w5t7q8'o92m9;k:Cj:Kh;Rg;Ye;ac;ib;r`;}^;Š\;—[;§Y;¸X;ÒW;ñV;ÿV;ÿV:ÿV:ÿV9ÿÔ7ÀA¯DCB…@~>y;t:q:m<k=$i>/g?8e?@d@Hb@Oa@W_@^]@f\@oZ@zX@‡V@•T@¤S@¶R@ÏQ@ïP@ÿP?ÿP?ÿQ>ÿQ>ÿÏ;½EªG™F‹EDyBt>o?k@ gAeB!cC+aC5_D>^DE]EM[ETYE\XEdVEmTExRE…QD“OD£ME´LEÌKEíKDÿKDÿKCÿLBÿLBÿÊ?¹H¦J•I‡H}GuEnBiCeD bE_F]G(\H2ZH;YICWIJVIRTIYSIaQIkOIvMI‚KI‘JI¡HI³GIÊFIìFHÿFHÿGGÿGFÿGFÿÆC¶L¢L‘L„KyJpIiFdG_I\JZKXL%VL/UM8SM@RMHQNOONWNN_LNiJNsHM€FMEMŸCM±BMÈAMêALÿALÿBKÿBJÿBJÿ¶gåÉÂG³OžON€NuMlLcJ^LZMVNTORP"QQ,OQ5NR=MRELRMJRTIR]GRfERqCR~AR?R>R¯=RÆW{?\F>]O=]W;]a:]l8]y6]ˆ4]™3]«1]Â1\å1[ü1Zÿ1Yÿ2Yÿ2Xÿ¶T¤YX€XsWiW`XTYN[H]C_@`>a=a ;b):b29b:8cB7cK6cT4c]3ch1cv/c….c–,c©+c¿*cã*bû*`ÿ+_ÿ+_ÿ+^ÿ±Yž\‹\{[o[e[\\Q^I`Cb“K“Y“i“{’’¦‘¿‘åúÿÿÿw}uptbuUxI|?€4„+‰"‘”— ›žž"Ÿ+Ÿ5 B P _ q ‡ŸŸµžÚöÿœÿœÿ†}x|i|[NƒAˆ6Œ,‘#–šž ¡¤§©© ª«¬­"®+¯7¯E¯T¯f¯{®”®«®É®ï­ÿ­ÿ­ÿ„q„a‡S‹F9–.›# ¤¨ ¬¯²¶··¸¹ º»½!¾+À8ÀHÀZÁnÁ†Á ÁºÁãÀùÀÿÀÿyhY”Kš= 1¥%«¯³ ¸»¾ÁÄÅÆÇÈÊ ÌÎÐÓ+Õ:ÕLÖ`ØwؒجÙÉÙìÙûØÿp™`žQ¤Cª5°(¶º¾ ÁÅÈËÏÒÓÖØÛÝßâ åèì*í<íQîgïïœð·ðÓðìðôg¦X­I´:º*¾ÂÆÊÎÒÖÜàãäæèëíïòõ øüÿ,ÿ?ÿUÿnÿŠÿ¤ÿºÿÑÿáÿÿÿÿÿÿ%ÿ2ÿ?ÿKÿVÿ`ÿhÿpÿxÿÿ…ÿ‹ÿ‘ÿ˜ÿžþ¦ý®ü¹úÈùâøô÷ÿöÿöÿïÿçÿâÿÞÿÿÿÿÿÿÿ ÿ-ÿ:ÿFÿQÿ[ÿcþküsúyù€÷†öŒõ’ó™ò ð©î³íÁëÖêîéþçÿçÿåÿÝÿÕÿÑÿÿ ÿ ÿÿ ÿÿÿ(ÿ5ÿ@úKöUó^ñfîmìtëzé€ç†æä“â›à£Þ­Ü¹ÚÊ×æÔøÒÿÒÿÒÿÎÿÉÿÆÿÿÿÿÿÿ ü÷"ó.ï:ìEèOäXá`ÞgÛmÙtÕzӀчώ͕˞ɧdzÅÂÃÜÁñ¿ÿ¿ÿ¾ÿ¾ÿ½ÿ»ÿÿÿÿÿöîçá'Ý3Ù>ÓIÏRËYÈaÆgÄmÂsÀz¿€½ˆ»¹˜¸¢µ­³»±Î°ê¯ü­ÿ­ÿ®ÿ®ÿ®ÿÿÿýòèÞ ÓÌ!È,Ä8ÁB½KºS¸Z¶a´g²m°t¯z­‚¬Šª“¨¦¨¤µ¢Æ¡ãŸöžÿžÿžÿžÿžÿÿûîâÕËý¸%´1±;®E¬M©U§[¥b¤h¢n¡uŸ|ž…œŽš˜˜¤–°•Á“Ü’ò‘ÿÿÿÿÿý ðáΠ»· ±¬¨)¥4¢>ŸGO›V™\—c–i”p“x‘€ŠŽ•Œ¡Š®‰¾‡؆ ð„ ÿƒ ÿƒ ÿƒ ÿƒ ÿöæÒÀ³¬¨ ¦ ¢"™ .– 8” A’ J QŽ XŒ ^‹ e‰ lˆt†}…‡ƒ“Ÿ€­~¾}ÛzôxÿwÿwÿwÿwÿïÛ!Æ$´#¨  ›™˜“'Œ2‰<‡D…LƒSZ€`~h}o{xyƒxvœtªs»rÔoñnÿmÿmÿmÿmÿç Ð)¼+«*ž(–$ Œ ˆ„"-~7|@zHyOwUv\tcskq tp n!‹l!˜k!§i"¸h"Ïf"îe#ÿd#ÿd"ÿd"ÿd!ÿà&È/´1£0–.+‡(„$‚ ~ {"x#)u$3s%<q%Cp&Kn&Rm'Yk'`j'hi(qg({e(ˆd)•b)¤`)µ_)Ë^*ì\*ÿ\)ÿ\)ÿ\)ÿ\(ÿØ,Ã5­543†1€-|+y(v'r)p*%m+/k,8j,@h-Gg-Ne.Ud.]c.ea/n_/x^/„\/’Z/¡Y/²X0ÈV0éU0þU/ÿU/ÿU.ÿU.ÿÐ1½:¨9—8Š7€6z2u0r.n. k/i0!f1+d24c2=a3D`3K_4R]4Z\4bZ4kY5uW5‚U5T5ŸR5°Q5ÆP5çO5ýO5ÿO4ÿO4ÿO3ÿË6¸=£<’<…;{:t7o5l3h4 e5b6`7(^71]8:[8AZ9HY9PW9WV:_T:hS:sQ:O:N:L:®K:ÃJ:åI:üI9ÿI9ÿ.æ|I8ÿJ8ÿÇ:³@ž?Ž?>w=p;j8f8b9_:\;Z;%Y<.W=7V=>T>FS>MR>UQ>]O?fM?pL?}J?‹H?›G?¬E?ÁD?ãD>ûD>ÿD=ÿD=ÿE<ÿÃ>¯CšBŠB}As@k?e<`<\>Y>W?U@"SA+RA4PB<OBCNBKMCRKCZJCdHCnGC{EC‰CC™BC«@CÀ?Cá?Cù?Bÿ?Aÿ@Aÿ@@ÿ¿AªE–E†EyDoDgB`?[AWBTC QDOENE(LF1KF9JGAIGHHGPFGXEGaCHlBHx@H‡>H—CKFBLMALV@L_>LjPC%cG#cQ"d\!didydŠdžd³dÎcñaÿ`ÿ`ÿ_ÿ¡YŒX{XmXbXYXPYG[>^7`1c*f$i !j jj k(k0k9kBlLlXleltl†lšl¯lÊkïiÿhÿhÿgÿ™]…]u\h\^\U\K^Ba9d2g+j$mps ttt!u)u2u;uFuRu_ un u u• uªtà tç sý qÿ qÿ pÿ‘bapadaZaObEe‡2'’—œ ¤¨«®¯°±³ ´µ¶¸$º1º@ºR»e»}º—º±ºÒºó¹ÿ¹ÿoƒ_†Q‹C6—*¢§ ¬°´·»¾¿ÀÁÃÄÅ ÇÊÍ$Î3ÏDÐXÐnшФÐÁÑæÑøÑÿgW”Iš;¡.§!­³¸¼ÀÃÆËÍÎÐÑÔÖÚÜ ßãæ$ç6èIé_êxë”ë¯ëÌìèìö_žP¤B«4²&¹¾ÂÅÊÍÑØÛßàâäæéëîñõ ùü%ý9þOÿgÿ‚ÿÿµÿËÿäÿÿÿÿÿÿ"ÿ/ÿ;ÿGÿRÿ[ÿdÿlÿsÿzÿ€ÿ†ÿŒþ“ý™û¡ú©ø´÷ÂöÚõñôÿóÿóÿéÿàÿØÿÓÿÿÿ ÿ ÿ ÿÿÿ*ÿ6ÿAÿLÿVþ_ûfùm÷tõzô€ò†ðï”í›ì¤ê®éºçÍåéäûãÿâÿÞÿÑÿÌÿÈÿÿ ÿÿÿÿÿÿ$ý0û;÷FóPïYì`êgçnætäzâ€à‡ÞŽÜ•ÚžÖ¨Ô³ÑÃÏßÎôÌÿËÿËÿÅÿ¿ÿ¼ÿÿÿÿÿý ÷ñí*ê5ç@âJÝRÙZÕaÒgÐmÎsÌzʀȇÆÄ˜Â¡À­¾»¼Ðºí¹þ¸ÿ¸ÿ·ÿ³ÿ°ÿÿÿÿùîåÞØ#Ò.Ï9ËCÇLÄTÁ[¿a¼g»m¹s·zµ´‰²’°›¯§¬´«Æ©ä§ø¦ÿ¦ÿ¥ÿ¥ÿ¤ÿÿÿõêÞРȾ(»3¹=µF²M°U­[¬aªg¨m§s¥z¤‚¢Œ –Ÿ¡®›¾™Ø—ñ–ÿ–ÿ—ÿ—ÿ—ÿÿõçÔÉÀ¸³¯!«,¨6¦?£G¡OŸU[›ašg˜n—u•}”†’‘œŽ©Œ¸‹Í‰ëˆýˆÿˆÿˆÿˆÿùé Ôà · °« ¦¢ž%›0˜9–A”I’PVŽ\b‹iŠpˆx‡…Œ„˜‚¥€´~È}ç|ù{ÿ{ÿ{ÿ{ÿñÞÅ´©¡ž › —“)3Š<ˆC†K…QƒW‚^€dl}t|~z ‰x –w £u ³s Çr æp ûp ÿo ÿo ÿo ÿèй©•Ž ‰ † #ƒ -€ 6~>|F{MySxZvauhsqq{p‡n”l¢k²iÇhçfýeÿeÿeÿeÿ߯$°$ #”!‹†ƒ‚|y(v1t:rAqHoOnVl]kdimhwfƒdcŸa¯`Ä^ä]û\ÿ\ÿ\ÿ\ÿÕ%½*¨)˜)Œ(ƒ%}"yxvro#m-k5i=hDfKeRc Yb aa i_!s]!\!Z"œY"¬W"ÀV#áU#ùëöNT#ÿT"ÿT"ÿT"ÿÍ+¶.¢.’.…-|+v(r&o#m! j"g#e$)c$1b%9`&A_&H]&O\'V[']Y'fX(pV(|T(ŠS)™Q)ªP)¾O)ÞN)÷M)ÿM)ÿM(ÿN(ÿÈ0°2œ2Œ2€1v0p-k+h)f( c(`)^*%\+.[+6Y,=X,DW-LU-ST-[S-cQ.nP.zN.ˆL/—K/¨I/»H/ÛH/öG/ÿG.ÿG-ÿH-ÿÄ4«5—5‡5{5r4k2f/b._-\.Z/X0"V0+U13S1:R2BQ2IP2PN3XM3aK3kJ3wH4…G4•E4¦C4¹B4ÖB4ôB4ÿB3ÿB2ÿB2ÿÀ8§8“8ƒ8w8m7f6a3]2Y2W3 T4R5Q5(O60N68L7?K7FJ7NI8VG8_F8iD8uC8ƒA9“@9¤>9¸=9Ó<9ó<8ÿ=7ÿ=7ÿ=6ÿ»;¢;;;s;j:b9]7X6T7Q8 O9M9K:%J:-H;5G;<F=<=‘:=£9=¶8=Ñ7=ò7<ÿ8;ÿ8;ÿ8:ÿ¶=ž>‹>|>o>f=^=X;S:O;L<I=G>F?"D?*C?2B@:A@A@@I>AQ=AZÿ±@š@‡@xAlAb@[@T?N?J@FADBBC@C?D'>D/:EF9EN8FX6Fb5Fn3F|1F0FŸ.F³-FÌ-Fï-Eÿ.Dÿ.Cÿ.Cÿ¬C–CƒCtChC_CWCPCHCDEAF>G nJnWnenvnŠmŸm¶lÖlókÿjÿjÿ…ZtZfZ\YSYHZ?]6`.c&gjmqt w wwww$x-x7xCxPx^xox„x™w°vÍuðuÿtÿtÿ~_n_b^Y^M_Bb9e0h'lptw {~€ ‚ƒƒ&„0„;„H„W„h„|„“ƒª‚Åëþ€ÿ€ÿweid_cRdGgÀG¼NºU·[µa³g²m°s®z¬‚ª‹¨•§ ¥­£¾¡Û ôŸÿžÿŸÿÿ›ÿÿüîàО¹µ#³.°7­@ªH¨O¥U£[¢` fŸls›{š„˜Ž–š•§“·‘ÌìÿŽÿŽÿŽÿÿüïÛɽµ® ©¥¢' 1:šB˜I–O”U“[‘`gŽmu‹~‰‰ˆ•†¢…±ƒÄä€ùÿ€ÿ€ÿ€ÿôà Ç·¬¦ ›˜•!’*3<‹C‰I‡P†U„[ƒah€p~y|„{yx¬v¾uÝsôsÿsÿsÿsÿé Ϲ©ž— “ Œ‰†$ƒ.6>}D|KzQyWw]vdtlsuq€onšlªk»†ÀˆWiÖhñhÿgÿgÿgÿßîž“‹†„ ƒ €|y(w0u8s @r Fp Lo Sm Yl aj ii rg ~f ‹d ™b ©a »` Ø^ó]ÿ]ÿ]ÿ]ÿÔ¹¤•‰{xxw sp"n+l3j;iBgIfOdVc]af`o^{\ˆ[—Y§WºVÕUóTÿTÿTÿTÿÊ"°"##"y!sonm jge'c/a7`>^E]K\RZZYbWlVwT…R”Q¤O·NÐMñLÿLÿMÿMÿÃ&ª'–'‡({'r&l$h!fdb_]#[+Z3X:WAV HT OS WQ!_P!iN!tM!‚K"‘I"¢H"´G"ÍF#ïE#ÿE"ÿF"ÿF!ÿ¼*¤+‘+‚,v+m*f)b&_$]"[!X"V#T$(S$0R%7P%>O&EN&LL&TK'\I'fH'qF'E(C( A(²@(Ë?(í?(ÿ?(ÿ@'ÿ@'ÿ·-Ÿ.Œ/}/q/h.a-]+Z(W'T' R(P)N)%M*,K*4J+;I+BH,IF,QE,ZD,dB-o@-}?-=-ž<-°:-È:-ë:-ÿ:-ÿ:,ÿ:,ÿ²0›1ˆ2y2m2d2]1X/U,Q,O- L-J.I/"G/*F01E08C0?B1GA1O@1W>1a=2m;2{92‹82œ62¯52Ç42é42ÿ51ÿ51ÿ50ÿ­3–4„5u5i5`5Y4T3P0L1I1G2E3C3B4'@4.?56>5==5D<6L:6U96_76k66x47‰27š17­/7Å/7è/6þ05ÿ05ÿ04ÿ©6’6€7r8f8]7V7P6K4G5D6A7 ?8>8<9$;9,:939::8:B6:J5:S4;]2;h0;v/;‡-;™,;¬*;Ã);æ*:ý*:ÿ+9ÿ,8ÿ¤8Ž9|:n:c:Z:S:M:F8B:?;<< :<8=7=!6>)4>03>72??1?G0?P.?Z-@f+@t)@„(@—&@ª%@Á$@å$?ü%>ÿ&=ÿ&=ÿŸ;Š<x=j=_=V=O=I=B=<>9?6A4A2B1B/C%.C--C4,D<+DD*DM(DX'Ec%Eq#E‚"E• E¨E¿DãDûCÿ Bÿ!Aÿš>…?t@g@\@S@L@F@>A8C4E0F-G +H*H)H"(I)'I1%I9$IA#JJ"JU JaJoJJ’J¦J½JàIúHÿGÿGÿ•B€BpCcCXCPCICBD;E5G0I+K&M $N"N!O O%O,O5O=PGPQP]PkP|PP¤PºPÞOøNÿMÿMÿE{FkF_GUGMGFG?G7J1L+N&P SU VVV V'V0V9WBWMWYWhWyWŒ W  W¶ VÔ Vô Uÿ TÿSÿˆIvJgJ[JQJJJCJ;L3N,Q&T!VY\^ ^^^"^* ^3 ^= ^H ^T^b^s^†^›^±]Ì]î\ÿ[ÿ[ÿNpNbNWNNNGN>O6Q.T'W!Z]`c f gggg$g-g7gBgNg\gmg€f•f¬eÇeëdüdÿcÿzRjS]RTRKRBS9U0X([!_beh kn ooopp'q0q;qHqVqfqyqp§oÁoçnümÿmÿsXeWZWQVFWÿHÿRÿZÿbÿiÿoÿuþ{üûˆù÷—õ óªò·ïÉíæìûëÿëÿÝÿÎÿÆÿÂÿÿÿÿÿÿ ÿÿ!ÿ,ÿ8ÿCýLùT÷\ôcòiðoîuì{ê‚è‰ç‘äšâ¤à°ÝÀÚÜØôÕÿÓÿËÿÁÿ»ÿ·ÿÿÿÿÿÿ ýùö'ô2ð<ìFèNäVá\ÞcÜhÙnÕtÒ{Ð‚ÍŠË“ÈÆ¨Ä·ÁÌÀë¾ÿ½ÿ½ÿ´ÿ®ÿ«ÿÿÿÿúòêåà!Ý+Û6Ó?ÎHÊOÇVÄ\ÂaÀg¾m¼sºz¸‚¶‹´–²¡°¯®Á­à«÷ªÿ©ÿ¦ÿ¡ÿŸÿÿÿ÷èÜÐ ÊÅÂ%¿/¼8¸AµH²O°U®[¬aªf¨l§s¥{£„¡ŽŸš§›¸šÐ™ï˜ÿ—ÿ–ÿ”ÿ’ÿÿöäÒÅ»µ°¬ª)¨2¥:¢B IžOœUšZ˜`–f•l“t’}‡Ž“Œ¡ „~J‹°ŠÅˆæ‡û†ÿ‡ÿ‡ÿ†ÿøåͽ³ª£ Ÿ›™#—,•4’<CŽIŒOŠT‰Z‡`†f„nƒw~›|ª{¼zÛxõxÿxÿxÿxÿíÑ»¬¢›–‘ ‹ˆ&†.„6‚=€C~I}O|Uz[yawiuqt|rˆq–o¥n¶mÎlîkÿkÿkÿkÿß Â ® ž “ Œˆ… | z(x0v8t>sDqJpPnVm]ldjmhwg„e’d¡c²aÉ`é`ü`ÿ`ÿ`ÿж¢“ˆ€| y x usp#n+l3j9i@gFfLeRcYba`j_t]\ZŸY°WÆV çV ûU ÿU ÿV ÿÆ­™Švqnm m j g e &c .b 5` <_ B^ H\ O[ VY ^XhVsU€SQŸP±NÈMêMýMÿMÿMÿ¼¥’ƒwoifddb_]![)Z1X8W>VETLSSQ[PeNpL}KŒIœG®FÅEèEþEÿEÿEÿµž!‹"|"q"h!b_\[Z WUT%R-Q4O;NBMHKPJXHbGmEzC‰Bš@¬?Â>å=ü>ÿ>ÿ>ÿ¯#˜$†%w&l&c%]$Y"VTS QNM"K)J1I7G>F EE MC UB _@!j?!w=!‡;!˜9!ª8"À7"ã7"û7"ÿ8!ÿ8!ÿª&”')s)g)_)X(T&Q#O"L"J"H"G#E$&D$.B$4A%;@%C?%J=&S<&\:&g9&u7'„5'–4'¨2'¾1'á1'ù2&ÿ2&ÿ3%ÿ¥)*},o,d-[,U+P*L(J&G'D' B(A(?)#>)+=)2<*9;*@9*H8+P6+Z5+e3+r1+‚0,”.,§,,¼+,Þ,,ø,+ÿ-*ÿ-*ÿ¡,‹-y.k/`/X/Q.L.H,E+A+?, =,;-:.!9.(7./6/65/>4/E3/N10X00c.0p,0€*0’)0¥'0º&0Ü&0÷'/ÿ(/ÿ(.ÿœ.‡0v1h2]2U2N1H1D0@/<0:1 71625233%23,13304;/4C-4L,4V*5a)5n'5~%5#5£"5¹!5Ù!4ö"4ÿ#3ÿ#2ÿ˜1ƒ3r4e4Z5Q5K4E4@4:374452607/7.7"-8)+81*88)9@(9I&9S%9_#9l!:| :Ž:¢:·9Õ9õ8ÿ8ÿ7ÿ“46n7a7W7N7H7B7<75829/:,; *<)<(=&=&%=.$=5#>=">F >P>\?i?y?Œ? ?µ>Ò>ó=ÿ<ÿ<ÿŽ7z8j9^:S:K:E:?:9:2<.>)@&A$B"B!B C#C*C2C:DCDMDYDgDwDŠDžD³DÐCòBÿBÿAÿ‰;v<f=Z=P=H=B=<=6>/@*B%D!FH IIII&I.J6J@JJJVJdJtJ‡ J› J° JÊ Iì Hÿ Gÿ Gÿƒ>q?b@V@M@E@?@9A2B+E&G!IKNPPPP!P)P1 P; QF QQ Q_ QoPP–P«PÅOèOûNÿMÿ}BkC]DRDJDCCüGøOôWñ]îcìiêoèuæ|äƒâ‹ß•ÜŸÙ«Õ»ÒÔÏòÍÿÌÿÅÿºÿ´ÿ°ÿÿÿÿÿÿùõó"ñ-í7ç@âIßPÛW×]ÔcÑhÏnÌuÊ|ȄŘy7âfÀ¤½²»Æ¹è¸ý·ÿ¶ÿ­ÿ§ÿ£ÿÿÿÿõëä ÞÙÓ&Ñ0Ì:ÈBÄJÀP½V»\¹a·gµm³t±|¯…­ªœ¨ª¦»¥Ú£õ£ÿ¢ÿžÿšÿ—ÿÿþïßÐÇÁ¼¹ ·*µ3°;­C«I¨O¦U¤Z£`¡fŸmtœ}šˆ˜”–¢”²’É‘ë‘ÿÿÿŒÿŠÿüìÙǺ±« §¤¡$ ,ž5›<˜C–I”O’TZ_f‹m‰vˆ€†Œ„š‚ª¾€à€ùÿÿÿ~ÿñØÂ³¨ ™•’Ž&.Š6‡=…C„I‚NTY~`|gzoyzw†u”t£rµrÏqñpÿpÿpÿqÿáİ¢—‘‹† ƒ!})|0y7x=vCtIsNrTpZobmjktj€hŽge¯eÆdèdýcÿcÿdÿ϶£”‰‚~{wurq#o+m2l8j>iDgIfOeVc]be`o_{]‰\™[ªY¿YáXøXÿXÿYÿ ª —‰}v q om kige&c-a3`9_?]E\K[RZYXbWlUxS†R–Q§P»OÛNôNÿNÿNÿ¸¡Žtlgec c a^\![(Y/X5V;UBTHSOQVP _N iM vK „I ”H ¦G ºF ØE óE ÿE ÿE ÿ°™‡xme_\ZZZ W U S $R +P 1O8N>MEKMJUH^GhEuC„A•@¦>»=Ü=ö=ÿ=ÿ>ÿ©’rg_YUSRR PNL J'I.H4G;EBDICRA[?e>r<:’8¤7¹5Ø5õ6ÿ6ÿ7ÿ£{ m!b!Z!TPMLKIGED$B*A1@8??=F<O:X9c7o5~32¢0·/Ó/ó/ÿ0ÿ0ÿˆ"w#i$^$V$P#K"H FEC A?>!<';.:59<7D6L4 V3 `1 m/ |-!Ž,! *!µ)!Ð)!ò)!ÿ* ÿ+ ÿ™"„%s&e'['S'L&G%D$B!?!=! ;!9"8"6#%5#+4$23$92$A0$J/%S-%^+%k*%z(%Œ&%Ÿ$%³#%Î#%ð$%ÿ%$ÿ%$ÿ”%€'o)b*W*O*I)D(@'=&:%7&5&4'2'1("0()/(0-)7,)?+)G))Q(*\&*i$*x#*Š!**²*Ì*ï)ÿ )ÿ!(ÿ(|*l+_,T,L,F,A+<+8*5*2+0+ .,-,,,*-&)--(-4'.<&.E$.O#.Z!/g/v/ˆ/›/°/Ê.í.ÿ-ÿ-ÿŒ+x-h.[/Q/I/C/>.9.4.0.-/+0 )1'1&1%2#$2*#21!39 3B3L3W3d4t4†4š3®3È3ì3ÿ2ÿ1ÿ‡.t/e1X1N2F2@1;16111+3(4%5#6 !6 77 7'8.868?8I9U9b9q9„9˜9­8Ç8ë8ÿ7ÿ6ÿƒ1p2a4U4K4D4=48434-5(7$9 :; <===#=+>3><>F>R>_>o> >• >© >Á =ä =û <ÿ ;ÿ}4k6]7Q7H7A7;75707*9%; =?AC CCCD'D/D9 DC DN D[ DjD|DC¥C½CàCöBÿAÿx8g9Y:N:E:>:8:3:-;'=!@BDFI J J J J#J+J4J>JIJVJeJwJ‹J¡I¹IÝIõHÿHÿr<b=U>J>B=<=6=/>)@#BEGJL O P QQQQ&Q/Q9QDRQR`QrQ‡QQµPØPõOÿOÿl@]AQAGA@@9@2A*C$FHKNQ SVW XXYZ!Z)Z3Z?ZLZZZlZY™Y±XÑXôWÿWÿeEXEMEED>D5E-G%JMPSV Y\^_ ` abcd#d-d8dEdTdfd{c“c­bÌaòaÿ`ÿ_JSJJICH9I/L'ORUY ]`cfhij k mnpq&q1p>pNp_psoo§nÆmïlÿlÿZOPNHM=N3Q)T X\` dhkortuwx z |}€(€5€EVk„~ }¾|é{ÿzÿVTNSBT7V,Z"_ch mrvz}€ƒ„†‡‰‹ ’’,’;’M‘b‘z—´ŽáŒûŒÿUYHZ;]/a$flr w}‚†‹Ž‘“•—™›Ÿ ¢¤¦!¦1¦C¥W¤p£Ž£«¡Ð õŸÿNa@d3i'nu| ƒ‰Ž“˜¡¤¥§©«­°²µ¸¼¼%¼7»Lºd¹·¢·À·ê·üFk9p+w† Ž•›¡¦«°³··º¼¿ÁÄÇÊÍÑÔÔ+Ô@ÓXÓtÓ’Ò°ÒÓÒò>y1€#ˆ‘ ™ §®³¸½ÂÆÊÊÍÏÒÕÙÝGíÝâßãçëìí3îKïdï‚ðŸñ¹ñØÿÿÿÿ ÿÿÿÿ)ÿ4ÿ?ÿHÿPÿXÿ^ÿeýkûqùwø~ö…óñ—î¢ë¯èÀæàãøâÿÛÿËÿÁÿ¹ÿ´ÿÿÿÿÿÿ ÿÿÿ#ÿ.ý9ùBõJòRîXë^édæjäpâvß}݆Ù՚ѧζËÎÉðÇÿÅÿ»ÿ´ÿ­ÿ©ÿÿÿÿÿûö ñíì(é2ã;ÝDØKÓQÐXÍ]ËcÉhÆoÄvÂ~¿‡¼’ºŸ·­µÁ²ä±ý¯ÿ¬ÿ¥ÿ ÿœÿÿÿûîäÜÓÏË"É+Æ4Á=½DºK·QµV²\°a®g¬nªv¨¦Š£–¡¥Ÿ¶Ñœó›ÿœÿ–ÿ“ÿÿÿöçÓÆ½¸ ³±¯%®.©6¦=£D¡JŸOU›Zš`˜f–n”w’ŽŽœŒ­ŠÃ‰èˆÿ‰ÿ‡ÿ…ÿ‚ÿóã̼°§¡ž›™˜'–/“7‘=ŽCŒI‹N‰T‡Y…`„g‚o€z~†|”z¤y¸xØw÷xÿxÿwÿuÿæË·¨ž–‹ ˆ‡…!„)‚07}=|CzHyMwSvYtariqsomlj¯iÈhíiÿiÿiÿiÿÒ¸¥—†|ywvt#s+q1o7n=lCkHjNhTg[eccmbx`‡_–]¨]¾\ä\û\ÿ\ÿ\ÿª˜‰xtpm kihf%e,c2b8`=_C^I\O[VZ^XhWsUT‘R£Q·QÖQõQÿQÿRÿ¶Ÿ ~ s l heca _]\!['Y-X3V9U?TESKQRPZOdMoL}JIŸH²GÌGïFÿGÿGÿ¬ •ƒukc^[ Z Y WUSR#Q)O/N5M;LAJHIOHWFaEmCzB‹@œ?¯>È=ê=ü=ÿ>ÿ¤Ž|nd\VSQP P OMKI%H +G 1F 8D >C EB M@ U? _= k< y: Š8 œ7 ¯5 Ç5 é5 ý5 ÿ6 ÿ‡vi^VPMJIIH F D C!B(@.?5><=C;K:T8^6k4y2Š1œ/°-É-ì-ÿ.ÿ/ÿ—‚qdYQLGDCBA @><;%:+82796@4H3Q1\0h.w,ˆ*š(®'Ç&ê'ÿ(ÿ)ÿ‘}m`VNHC@>=;9865"3(2/160=.F-O+Y*f(t&†$™"­!Å è!þ"ÿ#ÿyi!\"R"J"D!?!< 9854 20/.%-,+3*;)C'M&W$d"r „—«Ãçýÿÿ‰ u"e#Y$O%G%A$<#8#5"3 0 .! ,!+!*"("#'")�%#8##A"$J!$U$a$p$‚$•$ª$Á$å$ü#ÿ#ÿ…"q$b&V'L'D'>'9&5&1%.$+%)%'&%&$'#' "''!(. (6(>(H)S)_)n)€)”)¨)À(ä(û(ÿ'ÿ€%n'_(S)I*B);)6)2(.(*(&)$*"+ +,,,$-+-3-<-E.P.].l.~.’.§ -½ -ß -ù,ÿ,ÿ|(j*[+P,F,?,9,4+/+++&,"./0 1112!2(20293C3N3[3i 3z 3Ž 3¢2¹2Ù2ô 1ÿ 1ÿw+f-X.M/C/<.6.1.-.).#02356 7778$8,85 8? 8J 8W 8e8v8Š8Ÿ7µ7Ó7ñ6ÿ6ÿs.b0T1I1A19141/0+0%2 368:< = = = =! =)=1>;>F>R>a>r>†=œ=²=Ð<ð<ÿ<ÿm2]3P4F4>47423-3'4"68:=? A C DDDD$D-D6DADND\DmDD˜C¯CÍBðBÿBÿh6X7L8C8;75606)7#9;=@B EGI IJKK K(K2K=LILWKhK}K”J¬JÊIïIÿIÿb:T;I;@;9:39,:%<?ADG ILOP P QRTT#T,T7TDTRTcTwTS¨RÆRíQÿQÿ\?O?E?>>7=/>'@ CFIL ORTWXY Z[]^_&_1^=^L^]^q]‰]£\Á[ëZÿZÿVDKCCBÑFÍLÊRÈXÅ]ÃcÀi¾p¼x¹·´š±©®¼¬áªü¨ÿ ÿ™ÿ–ÿ”ÿÿùòçÛÑÊ ÇÄÂ&¿/»7·?´E±K®Q¬Vª\¨a¦h£p¡yŸ„‘š ˜±–Ì•ñ”ÿ‘ÿ‹ÿˆÿ†ÿ÷ìÞɼ´¯ «©¨ §(¢0Ÿ8œ>šD˜J–O”U“Z‘ahq‹{‰ˆ‡—…¨ƒ¾ä€ÿ€ÿ|ÿ{ÿyÿé×Á±¦—” ’"Ž*‹1‰8‡>…CƒHNT~Z|azixsvuŽsŸq³pÐoöoÿoÿmÿlÿÚ¿¬ž“Œ…‚ ~}|$z+w1u7t=rBqHoMnSlZkbilgxf†d—bªaÂ`ëaÿaÿaÿ`ÿÅ­›ƒ|wrp nllk%i,g1f7d=cBbH`N_U]]\fZrY€WV£U¹TÞTûTÿUÿUÿ¶Ÿunifc a`_^ ]&[,Z2X7W=VCUISPRXQaOlNzLŠKœJ±IÎIóIÿIÿJÿª”‚tjc^[YW VTSR"Q(P-N3M8L>KEJLHTG]FhDuC…A˜@«@Å?ê?ÿ@ÿ@ÿ Š y l a Z U R PON LKJI#G)F/E4D:BAAH@P>Z=d<r:‚9”8§7¾6ã6ù6ÿ7ÿ˜ ƒre[SNJH G G EDBA @%>+=1<7;>:E9N7W6b4p2€1’0¥/».Ý.õ-ÿ.ÿ‘}l_UNHDA@@ @ > < ; 9 "8 (7 .6 55 ;3 C2 L0 V/ a- o+ * ’( ¥' »% Ý% õ& ÿ' ÿ‹wg[QIC?<:998 7542%1,02/:-B,K*U(a&o$€#“!§½à÷ÿ ÿ†scWME@;85432 1/-,"+)*0(7'?&H$S"_ m~‘¥»Þøÿÿ‚o_SJB<741/.,+)(' %&$-#4"= FQ]k|£ºÛöÿÿ}k\P G ? 941-+)'% $"! #*2:DN[iz¢¸ØõÿÿzgY!M"D"<"6"2!.!* ' $"  !!!"!"'"/"8#A#L#X#g#x#‹ #Ÿ #´ #Ð "ð "ÿ !ÿvd"V#K$A$:$4$/#+#(#$# #$%& &&''%','5(?(J(V (d (t (‡ (›'±'Ì'ì&þ&ÿq"`$S&H'?'7&1&-&)%%%"%'(*+ ,,,,",)-2 -; -F -R-`-p-ƒ-˜,®,É,ë+ü+ÿm%]'O(E)<)5)/(+(''#'(*,.01 1 1 1 1&2.272B2N2\2l22•1¬1Ç0ê0ü0ÿh)X*L+A,9,2+-+)*%* +,.024 7 7777"7*838>8J8X8h8|7’7©6Å6ê6ý5ÿc,T.H/>/6.0.+-'-"-/1357 :; <=>>>&>/>:>F>T>d>w>=§=Ã<é<ý;ÿ^0P1D2;241.0)/$02469 ; =@A B CDEF"F+F5FAFOF_FsEŠE¤DÀCèCþBÿX4K5A59524-3&4 58:= @ BEGHJ KLNOO%O/O<OJOZNmN…M L¼KçKþJÿS9G9>97817)7!9<?B EHJMOQRT UWYZY)Y6YDYTXgXWšV·UãTýTÿN=C=<<5;,<$>ADH KNQTWY[]Éž-^` bdgg"f.f<fMe`ewd“c±aÝ`ü_ÿIBAA:?0@&CFJN RVZ]`cegikmo ruwv&v5uFtYtos‹r©pÍo÷nÿFF@E5F*H LQV Z_chkoruwy{}€ƒ† ‰ŠŠ+‰<ˆO†f…„ ‚ÂðÿFK:L.O#SX^ diotx|„‡ˆ‹Ž“–™ ¡ ! 1žD[œv™–™µ–å•þ?R2U&Z`g mt{†‹”—™œŸ¡¤§ª­±µ ¸·&¶9µP´j²‰°ª®Ï­õ7\+ahp x€‡Ž•šŸ¤¨¬­°³µ¸»¿ÃÇËÑÑÐ.ÏEÍ_Ë~ɞȾÅé/i#py ‹“›¢¨®´¸½ÀÂÅÈËÎÑÖÛßäèëê#ê:éTçrå“ã³ãÔÿÿÿÿÿ ÿÿÿ!ÿ+ÿ5ÿ>ÿGÿNÿUü[úaøfömôsò{ï„íŽê™æ§ã¹ßÕÛ÷ÖÿÀÿ²ÿªÿ¥ÿ¢ÿÿÿþüüþ ÿÿý$ù.ô8ð@ìHéNæTâZß_ÜeØkÔrÐ{ͅʑǞîÀŽë»ÿ°ÿ¤ÿœÿ˜ÿ•ÿÿúôñòêçâáá(Ø1Ð9Ë@ÈGÅMÂS¿X½^»d¹k¶s´|±ˆ®•«¤¨¸¦Ü£ûŸÿ•ÿÿ‹ÿ‰ÿùïçßÏÈÁ ¿¼»!¹*´2±:®@«F¨L¦Q£V¡\Ÿcj›s™~–Œ”›’­ÇŽðÿ†ÿ€ÿ}ÿ|ÿíàÑ¿³ª¦¢ ¡ Ÿ#›+˜2•9“?‘DJŽOŒUŠ[ˆc†k„v‚‚€’~£|ºzáyÿwÿrÿpÿoÿÝ˶§”Ž‹ ‰ˆ‡‡%„,‚28}={CyHxNvTu[scqnozm‰lšj®iÌhögÿeÿdÿcÿÊ´¡“‰‚{xv utsr%p,n2l7j<iBhHfNeUc]bf`r^€]’[¥Z¾YéYÿYÿXÿXÿ¹¢ƒyqmif edcc a&`,^1\7[<ZBXHWOVWT`SlQyPŠOžN´MÚMûMÿMÿMÿª”‚ukd`]ZX WVVU!S'R,Q1O7N=MCLJJRI[HfFsE„D—C¬BÉBñBÿCÿCÿž‰xjaZURPN M LKJI"H'G-E2D8C>BEAM?V>a=n;~:‘9¦8¿8è8ÿ9ÿ9ÿ•€o b X Q LIGFD CBAA?#>)=.;4::9A8I7R6]4j3z2Œ1¡0¸/Þ/ù/ÿ0ÿŒ x h \RKE A ? >=< ;:98 6%5+40372>1F/P.Z-g+w*‰)(³'Ñ'ò'ÿ'ÿ† rcVME@<97 6 6 54210"/(..-4+<*D)N'Y&e$u#‡"› ° Ëíþÿ€m^RHA;74200 0 / - , * ) %( +' 2& :$ C# M! X e u ˆ œ ± Ê ë ü ÿ{iZNE=830-+**) (&%$##)!1 9BLXfv‰ž³ÎîþÿweWKB:40,)'&%# "!  '.6@JVdt‡œ± Ê ëþÿsaSH?72-)&$"  $+4=HTbr „ ˜ ­ Æ ç ú ÿo^PE<5/*&#! ")1;E Q ^ m €”ªÂæøÿk[MB:2-($! !!!!"& ". "7 "A "M"Z"i"|"‘"¨!À!å ø ÿgWJ!@!7"0!*!& "  !#$& & & & &"&*'3'='I'V'f'y'&¦&¿%ä%ù$ÿc T"G#=$4$.#(#$"!"!"#$&( * ++++,',0,:,E,S,c,v,Œ+¤+¾*ä*ú)ÿ_#P%D&:&2&+&&%#$$$%')+ -/ 00111#2,262B2O2_2r1‰1¢0¼0ä/û/ÿZ'L(@)7)/))(%'!&'(*,. 024 5 6788 8(829=9K9[8n8…7Ÿ7º6ä5ü5ÿU*H,=,4,-+(*$)*+-/ 1 468P¥®™:; = >@@@$@.@9@G@V@i@€?›>·=ã<ü<ÿP/C/9/2/,-', -/13 6 8;=@ACE FHJJJ(J4IBIQIdH{H—G´FàEüDÿJ3?36301*0#1358 ;>ACFHJLNO QTUU"T.T<TKS^StRQ®P×OûNÿE7<756/4&57:= ADHJMPSUWX[] _bbb'b4aE`W`m_‰]§\ÌZøYÿA<:;49*:!<@C GKOSVY\_acegjm psr r-q=pOoen€mŸkÁiñhÿ?@9>.?$BFJ OTX]aehknqsux{~ …‡†$…4„F‚]v–~¶|çzÿ?D3E(HLR W]chmqvz~ƒ†‰‹Ž’•™ žž)œ<šR˜l–‹”ª’Ôú8K,N SY `gntz€„ŠŽ’•—š £§«¯´ ¸·µ0³F±`¯~¬ «Á©î1U$[aiqyˆ”šŸ¤¨©¬¯³µ¹½ÁÆËÑ ÓÑ%Ð;ÍTÊqȒųÃÞ)biq{„•£©¯´¹¼¾ÂÅÈÌÐÔÚßäêî íì/êIèeæ†ä¥âÆÿÿÿüüþÿÿÿ&ÿ0ÿ:ÿBÿIþPûVù\öbôhòoðvíê‰ç•ä£àµÛÐÕöÊÿ¶ÿ¨ÿŸÿšÿ–ÿÿûöóóö úýû ÷*ò3í;éCæIâOÞUÛ[Ö`ÒgÏnÌvɀƌš¿ª»Á¸é¶ÿ§ÿšÿ’ÿÿŠÿúñêççäà ÛÚÛ#Ñ,Ê4Æ;ÂB¿H¼NºS¸Y¶_³f±n®w¬ƒ©‘¦¡£µ Øžû•ÿ‹ÿ…ÿ€ÿ~ÿïãÚÓÆ¿¹·´´³%®-«4§;¤A¡FŸLQ›W™^—e•n“y‡Ž—Œ©‰Äˆï…ÿ|ÿvÿsÿrÿàÐÆ¶©¡™ ˜˜—”&‘-4Œ:Š?ˆE‡J…PƒV^€f~q|}yw u¶sßrÿnÿiÿgÿeÿ̾«“Š…‚€ € }&z-w3u8t>rCpIoOmVl^jhhug„e–d«bÉaö`ÿ\ÿ[ÿZÿ½©—‰~xsom lkkj h&f,e2c7b<`B_H]O\WZaYmW{VŽU¢S»RéRÿPÿOÿOÿ­˜†xngc`]\ [[[Z!X&V,T1S6R<QBOINQM[KfJtI…H™G±FØFüEÿEÿEÿŸ‰xlb[VSQOO NNML!J&I,H1G7E=DDCLBU@`?n>~=’<©;Ç;ó;ÿ;ÿ<ÿ“~naXQLIGED CCCB@"?'>,=2;8:?9G8P7[5h4x3Œ2¢1¼1ç1ÿ2ÿ3ÿ‰vfYPIC@><;: :9976#5(4.342;0C/L.W-d,s+‡*œ)µ)Ü)û)ÿ*ÿn_ S J B = 9 6543 2110/.$,*+0*7)?(I'T&`$o#‚"—!®!Ì!ó!ÿ"ÿ{ h Z NE=8 3 0 . - -, +*)('!&'%-$4#="F!Q]l”ªÅëÿÿu dUJ@93/,)' ' ' & %$"! $+2:DO\k}‘§¿äúÿq_QF=60+(%#"! !     " ) 1 9 C O \ k ~ ’ § ¾ à õ ÿm\NC:2-(%"  !(09DP] k |  ¥¼ßôÿiXK@70*&" %.7 @ K X gx£»ÝôÿeUH=4-(#   " ) 2 <GTcu‹¡¹ÝõÿaRE;2+%!   &/8DQ`rˆ ¹Þöÿ^OB8/)#     !#!+!5!@!N!]!o!† ž ¸ÞøÿZK?5-'"Ñ€üu ! " # $%%& &(&2&=&J&Z&l&ƒ%œ%·$ß#ù#ÿUG ;N;`:w9’8°7Û6ü5ÿG);*2*+)%'!&'(*, /1468;=?A CEEE!E,D9DHD[CqBA«@Ò?ú>ÿB-8./-)+$**,. 1 47:<?ADFHJL NPPP'O4OCOUNjM†L¤JÊIøHÿ>251./). .137 :=@DGILOQSUXZ ]_^ ^,]<\N[cZ~XWÀUòTÿ:634-2$369=AEILPSVY[]`behk oon%m4mFk[juh”f¶débÿ8927(9;?DIMRVZ^behkmpsvy} …„‚,€>~T~k{ŠzªwÖuý8=,>"AFKQW\bfkotx{~€ƒ†Š‘–› ›!š3—I”b“ ŽÅŒó1D%HMSZahnty„‰‘“–™ ¤¨¬²· ·µ(²>°V¬sª”©´¥å*OT[ bjs{‚‰Ž”šŸ¤¦©­°³·»ÀÅËÑÕÓÐ2ÍKÊfƇ©ÁË"[b kt}‡—ž¤«±¶º¼ÀÄÈËÏÔÚàæëñðî'ì?ê[çzä›à»ÿûöóôö úÿÿ"ÿ,ÿ5ÿ=ÿEüLúR÷Xõ^ódñjîrìzé…å‘á Ý²ØÎÒöÁÿ­ÿžÿ–ÿÿŒÿúòìééìò ø÷õ%ð.ë7æ>âEÝKØPÓVÐ\ÍbÊjÈrÅ|ˆ¾–º¨·¿´è®ÿÿÿˆÿƒÿ€ÿðåÞÚÛÜØÑÑÒË'Å/À7½=ºD·IµO²U°[®a¬i©s§¤¡žž²›Õ™üŒÿ‚ÿ{ÿvÿtÿâÓÊǼ¶°¯ ¬­­ ¨(¤/ 6<›B™G—M•S“Y‘ajŒuŠƒˆ”†§ƒÂ‚ð|ÿsÿmÿjÿhÿÏÁ¹­ ˜”‘ Ž!‹(ˆ/†5„:‚@€E~K|RzYxbvltyr‰qo´mßlÿeÿ`ÿ^ÿ\ÿ¾± ’‰‚|zx wxwt!r'p-n3l8k>iDhJfQdZcdap_^“]©\È[÷WÿTÿRÿQÿ°Ÿtnjfec ccca!_'],\2Z7Y=WCVKUSS\RhPwO‰NŸMºLéKÿIÿGÿGÿ¢|ne^YWUTS STRQ!O&N+L1K7J=IDGLFVDaCpBA—@¯?×?ÿ>ÿ=ÿ>ÿ”ocYQMJHGG FFGED!B&A+@1>7=><G:P9[8i7z65§5Æ4õ4ÿ4ÿ5ÿˆteXOHC?=<<; ;;:97!6&5,42391A0K/V.c-s,ˆ, +»+ê+ÿ+ÿ,ÿl]QH@;74322 2 110/-",(+.*5)=(F'Q&^%n$‚#™#³"Þ"ÿ#ÿ$ÿweVKB:50-,+*) ))('&%$$*#1"9!C NZi|“¬Íöÿÿp_Q F = 5 0 + ( %$## " "!  &.6?JWfx¦Ãîÿÿk[ M B 9 1 , ' # !     #+3<GTcuŠ¢¼åþÿg W I>5.($           ! ( 0 : E R a s ˆ Ÿ · Û ö ÿc SF;2+%!        ' / 9 E Q ` q †  ´ Ò ñ ÿ_PC8/(#      $ , 6AN]o„œ´Ôóÿ\M@6-&!í]$S      !)3>KZl‚›´×õÿXI=3+$     '0;HXj€™´Ù÷ÿUF:0("     $-8FUg}—³ÛùÿQC7.&         !!*!5!B!R d z•±ÛúÿM?4+$  !# %&&&'''2'?&N&`&w%’$¯#Ú"û!ÿH<1("  !#%') , ....#...;.J-\-r,Ž+¬*Ô)û(ÿD 8!.!&!  !#%'),.03 5 6666)666E5W5m4‰2¨1Ï0ú/ÿ?$4$+$$#!  !# %(*-/2479;> @AA@%@1@@?R>g=‚<¢:Ç9ø8ÿ:(0()'#%#$%( *-0368;>@BEGJ MMLL+K:JLIaH|G›E¿CóBÿ6,-+')#'(*- 037:=@CFHKMPSVY [[Z%Y4XFWZUtT“RµPêOÿ30,.',-/2 6:?BFILORUXZ]`cgk lkk,i=gRfjd‰a«_Ü]ÿ13,1"259 =BGLPTX[_behknquy}‚ ‚€$~5|I{axvŸsÆp÷16&8;@ EKQV[`einrvy|~‚…‰Ž“˜œ›˜+–@’Y‘s•‹µˆè+> AG MT[ahnsy~ƒˆŒ’•™¡¥ª°·¸µ!²5¯Mªi¨ˆ¦¨¢Ñ#HNT\dmu|ƒ‰•› £¦©­±µ¹¾ÄÊÒÚ ÖÒ)ÎAÊ\Å|ÂÁ½U\enwˆ˜Ÿ¥­³¸º¾ÂÆÊÎÓÚàçíóôòï6ìQènäß±  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿmft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tª̳VÚëv·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦%ÿ¤0ÿ§:ÿ²C"ÿ¼K2ÿÃTEüÆ]ZñÈdqãÆj‡ÖÀo›Ë¸r¬Â±tº»­wÄ´©{Í«£Ô¢ž…Û™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽáÿ¦%ÿ¥0ÿ¨:ÿ³C"ÿ¾K1ÿÅTEùÉ\[ïÍcqãÌiˆÕÆmœÉ¿p®½¶rº´°uëªxÊ¢¥|Ñ™¡Ø‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ýÿ¦%ÿ¥0ÿª:ÿµC"ÿÀK1ýÈSEöÍ[[íÑaráÐg‰ÑËkÂÀn­¶·q¸¬±sÁ£¬vÈš¨yÎ’¤~Ô‰ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …Øÿ§%ÿ¥0ÿ«:ÿ¶C!ÿÁK1úËRDóÑZZêÙ`rÞÖe‰ËÌjœ»Ám«¯¹p¶¥´r¾œ¯tÄ”«wÊ‹§{Ï„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ôÿ§%ÿ¦0ÿ­:ÿ¸B!þÄJ0÷ÎRDðÖXZçà^rÖÚdˆÄÍiš´Ãl¨¨»o²ž¶pº–²rÀŽ®vƆªzʧΧΧΧΧΧΧΧΧΧΧΧΧΧΧΧΧÎÿ¨%ÿ§0ÿ®9ÿºB ûÆJ/ôÓQCëÝWZãæ\qÎÛd‡½Ïi˜®Åk¥¢¾n¯˜¹o¶µq¼ˆ±tÁ®xÅ{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}Éÿ¨$ÿ§0 ÿ°9ÿ½B÷ÉJ/ïØPBæãUYÜè[pÆÝc…¶Ñh•§Èk¡œÁmª“¼o±Š¹q¶„µt»}²w¿w°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âÿ©$ÿ¨0 ÿ³9þÀBóÍJ-éÝO@áéSYÓê[o¿ßc‚¯Óg‘¡Ëj–Åm¥Ào«†½q°ºsµz·w¸tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»ÿª$ÿ©/ ÿ¶8ùÄAíÒI+âãM@ÛïRXÊíZm·áb¨Ög›Ïj—‘ÉmŸˆÅo¥‚Âq©{¿t­v½w°q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³ÿ«$ÿ«/ ÿº8óÉAäÚI(ØèL@ÎóQWÀïYk®äaz Üg†”Ôk‹Ïn—„Ìpœ}És xÆu£sÄx¦nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©ÿ­$ÿ°/ ûÀ8êÐAÚâF(ÌîLAÃùPUµóXf¥éat—ág~Ûk†…×oŒÔr‘zÑu”uÏx—qÍ{šlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œÿ¯#ÿ¶- ñÈ6 ÝÜ=ÍêF*ÁöK@¶ÿOQª÷X`›ïakèht…äm{àq€yÞtƒuÜx†rÚ{‰nØ~‹kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚ÿ±#ú¿,ãÔ/Îæ;ÁóE+´ÿI=¨ÿNLžýWX‘öaa†ñiiíonyêtruèwuqçzwnå}ykä€{iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|ÿµ"ëË"Ðã'Âñ:´þB*¦ÿF9›ÿME’ÿVO†þbVŒþ~új\w÷p`sõucoóxemò|gjñhhð‚jfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…köÂÔßÂï& µü:§ÿ>'™ÿD3ÿK=…ÿUE|ÿaKuÿjOpÿpRlÿuTjþyVhý|WfüXdü‚Zcû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[ÔÏ Äíµû& ¨ÿ6™ÿ;#ŒÿA,€ÿJ4xÿS:qÿ_?lÿiChÿoEeÿtGcÿwHbÿ{Iaÿ~J_ÿJ^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„KÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿŸ8ÿª@ÿ³I+ÿ¹R<ÿ»\Oúºedí¸mxá°s‹Õ¨yœÌŸ}ªÅ—µ¿‘…¾ºŒ‰Å¶‡Ì²ƒ–Ò¯ Ö§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢ÓÿŸ"ÿž- ÿ 7ÿ«@ÿ´I+ÿ»R<ÿ½[Pú¾ddì¼lyàµrÓ­wžÊ¤z­Âœ~¹¼–‚÷‡Ê²‹ŒÒ®‡•ئƒÚ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õÿ "ÿž- ÿ¡7ÿ¬@ÿ¶H+ÿ½Q<ÿÀZPúÁceìÁjzÞ¹pÒ±u¡È¨x°À¡{¼¹›Ç´–„ϰ”Õ«‘—Ú ‰œÜšˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×ÿ "ÿž- ÿ¢7ÿ­@ÿ·H*ÿ¿Q<ÿÂZPùÄbeëÅi{Þ¾nѶs£Æ®v³¾§yÀ¸£É´¡†Ï¬œÕ£–”Úš‘œÜ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØÿ "ÿŸ- ÿ£7ÿ®@ÿ¸H*ÿÁP<þÅYP÷È`fëÊg|ÝÃm‘ϼq¥Å´tµ½°yÀ¶¬È®§…Ï¥¡ŠÕœœ‘Ú•™œÜ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØÿ¡"ÿŸ- ÿ¤7ÿ°?ÿºH*ÿÃP;ûÈXPõË_féÏf|ÜÉk’ÎÃo¦Áºrµ¶²vÀ¬¬{Ȥ¨Μ¤…Ô” ØŸ™ÛŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØÿ¡"ÿ - ÿ¦6ÿ±?ÿ»H)þÆO;øËWPòÐ^fçÔd}ÚÏi“ÈÅm¦º»p´­³s¿£­vÇš¨zÍ’¥ÒŠ¢†×„ ‘Ù„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×ÿ¡"ÿ - ÿ§6ÿ³?ÿ½G)üÈN;õÎVOîÕ]fäÚb}ÓÒh’ÁÆl¤³¼o±¦µr¼œ¯tÄ“«wÊ‹§{σ¤Ô}¢‹Ö{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õÿ¢!ÿ - ÿ¨6ÿ´?ÿ¿G(ùËN:òÓUOêÜ[fààa}ÌÓg‘»Èk¢¬¾n¯ ·p¸•²sÀ®vÅ…ªzÊ~¨Îx¦‡Ñu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òÿ¢!ÿ¡, ÿª6ÿ¶>ýÂG(õÍN9îÙTNæãYeØâ`{ÅÕf´ÊjŸ¥Ám«™ºo´µr»ˆ±uÀ®xÅz¬}Étª„Ëq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìÿ£!ÿ¢, ÿ¬5ÿ¹>ùÅG'ðÑM8éàRLâéWdÎä_z½×fŒ­Ìj›ŸÄl§“¾o¯Š¹qµƒ¶tº|³w¾v±|Âq¯‚Än®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æÿ¤!ÿ£, ÿ¯5ÿ¼>ôÉF%êØM6âçOLÜïUcÆæ_x´Úe‰¥Ði–˜Èl¡Ão¨…¿q®~»t²x¹w¶s·{¹nµ€¼k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾ÿ¥!ÿ¤, ÿ³5ûÁ>íÏF"áßK4ØëOLÏóTb¼è^t«Þd„Ôi‘Îm™‡Éo €År¥zÂt©tÀx¬p¾{¯k¼€²h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³ÿ¦!ÿ¨+ ÿ¸4 óÇ=äØEÖæI5ËñNLÄ÷S_±ì]p¡âd}•Ûi‡ŠÕn‚Ðq•{ÍtšvËwqÉy mÇ}¢iÅ¥fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦ÿ¨ ÿ®*ü¿3 éÏ<×áBÊíI5¿øMJÿTØA·ûR[¦ñ]i˜éetŒâj}ƒÝo„|Ús‰w×wŒsÕzoÓ}‘lÑ€”hЄ–eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—ÿª ÿµ)ðÈ1ÚÝ3 ËêB!¾öH5²ÿLF©ÿQU›÷]`Žðej…ëlq}çqvwävzsây}oá|l߀iÞƒƒg݇…e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†ÿ­ù¿%ßÖ"Ëè2¾ôA"°ÿE3¤ÿJAœÿQMþ]V…ùf^}ôndvòshrïxknî|mlíojì‚pgê…reê‰scéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtÿ¶èÍÌæ¾ó1±ÿ>"£ÿB/–ÿH:ÿPD„ÿ\K{ÿgQtþnVoüsYlûx[iù|]gø^føƒ_d÷†`bö‰aaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbóÄÎÚ ½ó±ÿ2£ÿ:•ÿ?*‰ÿF3€ÿO:xÿ[@qÿfElÿmHhÿsJfÿwLdÿ{MbÿNaÿ‚O`ÿ…P^ÿ‰Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹QÌË ¾æ ¯ÿ ¤ÿ0•ÿ5‡ÿ<$|ÿD+sÿM1lÿX5gÿc9cÿk;aÿq=_ÿu>]ÿy?\ÿ|@[ÿAZÿ‚AYÿ†BXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ—+ ÿ—6ÿ¡>ÿªF%ÿ°P4ÿ±ZEÿ°dW÷¬miì§w{áž}ŠÙ–ƒ—ÑŽ‰¢ËˆŽ«Ç‚“±Ä~—·Ázœ»¾w¢¿¼uªÂµq®Ã³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Áÿ™ÿ—* ÿ˜5ÿ£=ÿ¬F%ÿ³O4ÿ´YFÿ´cXö±lkê­u}ߣ{Õ›œÍ’†¨Ç‹Š±Â…¹¿€”¾»|šÃ¹y¡Çµv©Ê­u¬Æ«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Äÿšÿ˜* ÿš4ÿ¥=ÿ®F%ÿµN4ÿ·XFÿ·aYõµjlé²sݨxÓŸ~ Ê–‚¬Äއ·¾ˆŒ¿ºƒ‘Å·˜Ë´|¡Ï«x¥Ï¥yªÈ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æÿšÿ˜* ÿ›4ÿ¦=ÿ¯E%ÿ·N4ÿºWFÿ»`Yô¹imç¶qܬv“Ф{£Èš±À“„¼»Œ‰Å·ˆË´†™Î²†¤Ñ¤|¤ÑŸ}©Êž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈÿ›ÿ™* ÿœ4ÿ§<ÿ±E$ÿ¹M4ÿ¼WFþ¾_Yô½gnçºo‚Ú±t•Ϩy¦ÅŸ}´¾—À¹”ŠÆµ‘’˯˜ÏªŠ¡Òž‚£Ó™¨Ì˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Êÿ›ÿ™* ÿ4ÿ©<ÿ²E$ÿ»M3ÿ¿VFýÁ^ZóÁfoæ¿mƒÙ¶s—Í­w¨Ä¥{·¾¡ƒÀ¶›‰Æ®•̨‘•Ï¢ŽžÒ™‡¢Ó”†§Í“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ëÿ›ÿ™* ÿž3ÿª<ÿ³E$ÿ¼L3ÿÁUFûÄ]ZóÅeoåÃl„Ø»q˜Ì²u«Ã­|¶¹¥¿°ž†Æ¨™ŒË¡•’Л’›Ó”Ž¢ÔŠ¦ÎŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËЍËÿ›ÿš* ÿŸ3ÿ«<ÿµD#ÿ¾L3þÃUEùÇ\ZñÉdoåÈj…ÖÁošÊ¹tª¾°z¶³©¿ª¢„Æ¢ŠË›šÏ•—™Ò”¢ÔŠ¦ÎŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨Ìÿœÿš* ÿ 3ÿ¬<ÿ¶D#ÿ¿L2üÆTEöÊ\ZïÍbpäÍh†ÓÅmšÅ¼sª¹´xµ®­}¾¥§‚Å¢ˆË•ŸŽÏœ–Ò‹œ¢Ó†•¦Î†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ìÿœÿš) ÿ¢3ÿ­;ÿ·D#ÿÁL2ùÉSEóÍZZìÒ`pàÐf†ÎÈlšÀ¿q©´¸wµ©±|¾Ÿ¬Å—¨†Ê¤ŒÎŠ¢•Ñ…¢¡Òœ¦Îš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìÿœÿ›) ÿ£3ÿ¯;ÿ¹D"ýÃK1öÌRDðÒYYèÚ_pÛÕd†ÉÌj™ºÃo¨­»t´¢´y½˜¯}ìƒÈ‰©‰Ìƒ§‘Ï~¦œÐ}¤¦Í|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ëÿÿ›) ÿ¥2ÿ±;ÿ¼D!úÆK1óÑQCëÚWYãß]oÓÛc…ÂÏi—±Äm§¤¼p²˜µt»Ž±x†­}Æ€«‚Êz©ŠÍv¨”Îv©£Ìw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êÿÿœ) ÿ§2ÿ³;ÿ¾C õÊK/îÖPBæáVWÜä[nËÞcƒºÑh”©Çl£›¾n®¸q·†´t½~°xÂw®|Ær¬ƒÉm«ŒÊm«™Én¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇÿžÿ) ÿ©2ÿ¶:úÂCðÎJ.çÝO@âéRWÒèZmÁàb€±Ôg‘¡Êkž”Ãn¨‰½q°€¹t¶y¶wºt´{½n²Àj°ˆÂg°’Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–ÃÿŸÿž) ÿ­1 ÿº:ôÇBh5t‹èÕJ+ßäL?×ìQVÉîYk·ãa|¨Øg‹šÏk—Én ƒÄq§{Àt¬u½x°p»{³l¹€¶h¸†¸d·¹c¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºÿ ÿ¡(ÿ±0 ûÀ9ìÎBßßG(ÓéL@ÊñQU¾òXh­æawžÝg„’Õl‡Ïo–~ËsœxÈv¡rÆy¤nÄ|§i©fÀ†¬b¿­a¿®a¿®a¿®a¿®a¿®a¿®a¿®a¿®a¿®a¿®a¿®a¿®a¿®ÿ¢ÿ¦'ÿ·/ òÇ8 áØAÒæF*ÇðL@¾øPS²õWc¢ëap•ãg{ŠÝm„Øq‹zÔutÒy“pÐ|–lΙh̃›dˈaÊŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸÿ¤ÿ­&û¾-æÐ4Óâ<ÇîF+»ùJ>°þOO¦úW\˜ñahŒëhqƒænx{âs}ußxqÝ{„mÛ‡jÚƒ‰gÙ†Šd׋ŒaÖŽ`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Žÿ§ÿµ#îÉ&Õß)Çì<ºøD+­ÿH;£ÿMIšÿWTùa]„ôje|ðpjvívnqëzqmé~tkè‚vhæ…wfåˆycäŒzaã‘|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|ÿ«÷ÀÙÜÇë( º÷;¬ÿA) ÿF6•ÿLAÿVKƒÿaR{ýkWtúq\oøv_lö{aiõcgôƒdeó†fcòŠgañŽh_ð’i_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“jÿ·ÖÏ Çê¹÷) ¬ÿ9žÿ>&’ÿD0‡ÿK9€ÿT@xÿaFrÿjJlÿpMiÿvPfÿ{QdÿScÿƒTaÿ†U`þ‰V^þW]ý’X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“XÖÄÆÔ ¸÷«ÿ)žÿ4ÿ:!„ÿA)zÿI0rÿR6lÿ^:hÿh=dÿo@aÿtA_ÿyC^ÿ}D]ÿ€E\ÿ„E[ÿ‡FZÿŠGXÿGXÿHXÿHXÿHXÿHXÿHXÿHXÿHXÿHXÿHXÿHXÿHXÿHXÿHÄÇ·Û©ÿŸÿ* ÿ0ƒÿ6wÿ>"nÿG(fÿP,aÿZ/]ÿd1[ÿl3Yÿq5Xÿu6Vÿy6Vÿ|7Uÿ7Tÿ‚8Sÿ…9Rÿ‰9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ“ÿ) ÿ4ÿš;ÿ¢D ÿ©M-ÿªX<ÿ¨bLÿ¤l\õŸvlì™z䑇†Þ‰Øƒ“˜Ó~™ŸÐz¤Ív¢©Ët§¬Éq­¯Ço´²Ál¹´¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±ÿ”ÿ‘( ÿ‘3ÿœ:ÿ¤C ÿ¬L-ÿ­V=ÿ­`Mþ©j^ô¥tnêŸ}}á–ƒ‹ÙŽŠ–Ó‡ Î•§Ê|š­ÇxŸ²Äu¥¶Âr«¹Àp´»·nµ¹³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µÿ”ÿ’( ÿ“2ÿž:ÿ§C ÿ®K-ÿ±U=ÿ°_Ný®h_òªrpç¤zÞš€Õ’‡œÎ‹Œ¦É„‘¯Ä~—µÁyœ»¾v£¿¼t«Â´o®Ã®r³¼«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸ÿ•ÿ’( ÿ•2ÿ :ÿ©Bÿ°J-ÿ´T=ÿ´^Ný³g`ñ¯præ©xƒÛŸ~“Ò—ƒ¡Ëމ¬Ä†ŽµÀ€”½¼{šÃºz£Å·y«Ç¬s¬Æ§u±¿¥wµº¥wµº¥wµº¥wµº¥wµº¥wµº¥wµº¥wµº¥wµº¥wµº¥wµº¥wµºÿ•ÿ“( ÿ–1ÿ¡9ÿªBÿ²J,ÿ¶S<ÿ·]Nû¶eað´ntä­u†Ù¤{–Ï›€¥Ç’…±ÁŠ‹»½‡”À»…Ķ‚¤Ç°~ªÈ¥wªÈ¡y°ÁŸz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼ÿ•ÿ“( ÿ—1ÿ£9ÿ¬Bÿ´J,ÿ¹S<ÿº\Nøºdbï¸luã²sˆØ©y™ÍŸ~©Å˜„´¿“Œ¼¸“Á³‰™Å®†¡Èª„©ÉŸ|©Ê›}®Â™~²½™~²½™~²½™~²½™~²½™~²½™~²½™~²½™~²½™~²½™~²½™~²½ÿ–ÿ“( ÿ˜0ÿ¤9ÿ­AÿµI,ÿ»R<ý½[Nö½cbî½kvâ¶q‰Õ®w›Ë¥|ªÂƒ´¹–‰¼²‘Á¬Œ–Ƨ‰È£‡¦Ê™€¨Ë–®Ä•±¾•±¾•±¾•±¾•±¾•±¾•±¾•±¾•±¾•±¾•±¾•±¾ÿ–ÿ”' ÿ™0ÿ¥9ÿ®Aÿ·I+ÿ½Q<ü¿ZNôÁbbìÁiwá»p‹Ò±tǨ{ª¼ ´´š‡¼¬”¦”Æ ›Éœ‹¤Ë•†¨Ë‘…­Å…±¿…±¿…±¿…±¿…±¿…±¿…±¿…±¿…±¿…±¿…±¿…±¿ÿ–ÿ”'ÿš0ÿ¦8ÿ°Aÿ¸I+ÿ¿Q<úÂYNòÄacéÅhwݾmŒÍ´s«yª·¤~´®„¼¦˜ŠÁ ”‘Æš‘˜É–¡Ë‹¨ÌŒ‰¬ÅŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°Àÿ—ÿ•'ÿ›0ÿ§8ÿ±AÿºI+ÿÂP;øÆXNðÈ_cæÈfxØÁkÉ·q½¯w©²§|³©¡‚»¡œˆÁš˜Æ”––É”ŸË‹‘¨Ì‡Ž¬Æ‡°Á‡°Á‡°Á‡°Á‡°Á‡°Á‡°Á‡°Á‡°Á‡°Á‡°Á‡°Áÿ—ÿ•'ÿ/ ÿ©8ÿ³@ÿ¼H*üÅO;öÉWNíÍ^câËdxÒÄjŒÄ»oœ¸²u©­«{³£¦€»›¡†Á”ÅŽ›”ÈŠ™Ê†™¨Ë‚“¬Æ‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Áÿ—ÿ•'ÿž/ ÿª8ÿµ@ÿ¾H)ùÈN:óÍVMêÓ\bÞÏbxÍÇh‹¿¾n›²·s¨§°y²ž«~º•§„ÀŽ£‹Äˆ¡’ǃŸšÉ€ §Ê}š¬Æ}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Áÿ˜ÿ–'ÿ / ÿ¬7ÿ·@ýÁH(öËN9ïÓTLæÙZbØÔawÇËgйÃlš­¼r§¡¶w±˜±}¸­‚¾ˆª‰Ã‚¨Æ}§™Èz§¥Éw¢¬ÅxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°Áÿ˜ÿ—&ÿ¢/ ãmÒÿ®7ÿ¹?ùÄG'ñÎM8êÛSKàßY`ÐÚ_vÁÐe‰³Ék™¦Âp¥›½u¯‘¸{¶ˆµ€¼²†À{°Ãv®–Ås®¡Ær­­Är©°Àr©°Àr©°Àr©°Àr©°Àr©°Àr©°Àr©°Àr©°Àr©°Àr©°Àr©°Àÿ™ÿ˜&ÿ¤. ÿ±6þ½?ôÈG%ëÔM6åãPIÙãW_Éß^tº×d†¬Ïi–Çm£‘Àq¬†»u³~·z¹w´½r²…¿m±Áj°—Âi±¥Ál´²½l´²½l´²½l´²½l´²½l´²½l´²½l´²½l´²½l´²½l´²½l´²½ÿšÿ™&ÿ§- ÿµ6ùÁ?îÎF#äÜL2ÝçOIÏèV^Àä]r²Þd‚£Ôi‘•Ëmœ‰Åp¥Às¬w¼w±p¹|µk·¸g¶‡ºcµ»aµ›¼c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹ÿ›ÿ›%ÿ«- ÿ¹5 òÇ>åÕFÚãI3ÏëNIÆíT]·ê\n¨âc}šÙiŠŽÒm”„Ìq›{Èu¡sÄx¦nÂ|©iÀ¬e¾‡®b½Ž°_½—±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±ÿœÿ $ÿ°,ùÀ4 éÏ=ÚßBÎéI3ÄñNH»òRZ­ð[ižçcv’ài‡Úo‰~ÔswÑw•qÎ{™lÌœhʃždɈ aÇŽ¢^Æ•¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤ÿžÿ¥#ÿ·*ðÈ2ÜÛ5 ÎçBÂñH4¸ùLF¯÷QU¢õ[b•ídmŠçkv€âp}yÞu‚sÛz‡nÙ~ŠkׂŒgÕ†ŽdÔ‹aÓ’^Ñ–”\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•ÿ¡ÿ­!ø¿&âÔ%Îå3ÂðB!¶úG3«þKB¢þPO—û[Z‹õec‚ðljzìrptéxtoç|wlåzhã„|fâˆ}cáŒ`à‘^ß–‚\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒÿ£ÿ¶éÌÏãÂð3µú@"©ÿD0ÿI=•ÿPH‹ÿ[P‚ýeWzùm]tösaoôydkò~ghñ‚ifð†jdïŠlbîŽm`í’n]ì—p\ë›q\ë›q\ë›q\ë›q\ë›q\ë›q\ë›q\ë›q\ë›q\ë›q\ë›q\ë›qÿ¬óÃÑÚ Áï´û3¨ÿ< ›ÿB,ÿH6‡ÿO?ÿZFxÿeKqÿmOlÿsRiÿyUfþ~Wdý‚Xbü†YaûŠZ_úŽ[^ú’\\ù—][ø›^[ø›^[ø›^[ø›^[ø›^[ø›^[ø›^[ø›^[ø›^[ø›^[ø›^[ø›^ú¹ÍË Àæ ²ü §ÿ3šÿ9ÿ?&‚ÿF.zÿN5sÿX:mÿc?iÿlBeÿrDbÿwF`ÿ|G_ÿH]ÿ…I\ÿˆJ[ÿŒKZÿLXÿ•MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MÍÁ¾Ð±ö¥ÿ! ™ÿ.Œÿ4€ÿ; vÿC'mÿL,fÿT0bÿ`3^ÿi5\ÿo7Zÿt8Yÿy9Xÿ}:Wÿ€;Vÿ„;Uÿ‡Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>½Å°×£ÿ™ÿ" ‹ÿ)~ÿ0sÿ8iÿ@bÿI#[ÿQ&WÿZ(Uÿb*Rÿi+Qÿo,Pÿs-Oÿw.Nÿz.Nÿ}/Mÿ€/Lÿ„0Kÿˆ0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0ÿ‹ÿˆ(ÿ„4ÿ:ÿ—BÿžK'ÿžW4ÿbBÿ™mOÿ“x\ø‚gòˆ‹qì‚“yè|™€äxž†át£Šßq¨ŽÝo®‘Ûm³”Úl¹–Øk˜ÕiÌšÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÿ‹ÿˆ(ÿ„4ÿ:ÿ—BÿžK'ÿžW4ÿbBÿ™mOÿ“x\ø‚gòˆ‹qì‚“yè|™€äxž†át£Šßq¨ŽÝo®‘Ûm³”Úl¹–Øk˜ÕiÌšÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÿ‹ÿˆ(ÿ„4ÿ:ÿ—BÿžK'ÿžW4ÿbBÿ™mOÿ“x\ø‚gòˆ‹qì‚“yè|™€äxž†át£Šßq¨ŽÝo®‘Ûm³”Úl¹–Øk˜ÕiÌšÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÿ‹ÿˆ(ÿ„4ÿ:ÿ—BÿžK'ÿžW4ÿbBÿ™mOÿ“x\ø‚gòˆ‹qì‚“yè|™€äxž†át£Šßq¨ŽÝo®‘Ûm³”Úl¹–Øk˜ÕiÌšÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÿ‹ÿˆ(ÿ„4ÿ:ÿ—BÿžK'ÿžW4ÿbBÿ™mOÿ“x\ø‚gòˆ‹qì‚“yè|™€äxž†át£Šßq¨ŽÝo®‘Ûm³”Úl¹–Øk˜ÕiÌšÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÿ‹ÿˆ(ÿ„4ÿ:ÿ—BÿžK'ÿžW4ÿbBÿ™mOÿ“x\ø‚gòˆ‹qì‚“yè|™€äxž†át£Šßq¨ŽÝo®‘Ûm³”Úl¹–Øk˜ÕiÌšÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÿ‹ÿ‰(ÿ…3ÿ9ÿ˜BÿžK'ÿŸV4ÿžaBÿšmPÿ•w]÷hñ‰‹r냒{ç}˜‚ãxˆàt£ŒÝr¨Ûo­“Ún³–Ølº˜Ök›ÑiÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÿŒÿ‰'ÿˆ2ÿ“8ÿ›Aÿ¢J'ÿ¤T4ÿ¢_CÿŸjQýšt_õ”~l펈xç‡â€•ŠÝ{šÚw –Öt¦šÔq¬žÒo²¡Ðm¹£ÏlæÅgæÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÿÿŠ'ÿŠ1 ÿ–7ÿž@ÿ¥I'ÿ§S4ÿ§]Cÿ¤hSü rbòš|pê”…}ã‹‹ˆÝ„’‘Ø~˜˜ÓzžŸÐu¤¤Írª¨Ëo°«Ém¸®Âi¼°¼kÀª·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥ÿÿ‹'ÿŒ0 ÿ˜7ÿ @ÿ§H&ÿ«R4ÿ«\Dÿ©fTú¥pdðŸys瘂߈و—Ò• Î{›§Êv¡­Çs¨±Åp¯µÁm··¹k¸µ³n½®°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨ÿŽÿ‹&ÿŽ0 ÿš6ÿ¢?ÿ©H&ÿ®Q4ÿ®[Dÿ¬dUùªneï¥wvå…Ü”…’ÔŒŒÎ„’§É}˜¯ÄxžµÂu§¹Át±»¸p³»±o¶¸¬q»±©s¿«©s¿«©s¿«©s¿«©s¿«©s¿«©s¿«©s¿«©s¿«©s¿«©s¿«ÿŽÿŒ&ÿ/ ÿ›6ÿ¤?ÿ«G&ÿ±P4ÿ±YDü°cUö®lgíªuxã¡|ˆÙ˜ƒ–щ£Ê‡­Å‚—´Â ¸¾|¨»»z°½±t²½©r´»¦t¹³£v¾­£v¾­£v¾­£v¾­£v¾­£v¾­£v¾­£v¾­£v¾­£v¾­£v¾­ÿÿŒ&ÿ‘. ÿ6ÿ¦>ÿ­G%ÿ³O4ÿ´XDú´aVó²jhì¯szá¦z‹Ö€šÍ”†§Æ¯¿‡”µº‚œ¹µ¤¼²}¬¾«y±¿£v²½ x¸µžy½¯žy½¯žy½¯žy½¯žy½¯žy½¯žy½¯žy½¯žy½¯žy½¯žy½¯ÿÿ&ÿ“. ÿž5ÿ¨>ÿ¯F%ÿ¶N3þ·WD÷·`Vð¶hiè³p{ÞªwП|Ç—ƒ§¿Š¯¸‹‘¶²†˜º­ƒ ½©©¿¥~°Àœy±¿š{··˜}»°˜}»°˜}»°˜}»°˜}»°˜}»°˜}»°˜}»°˜}»°˜}»°˜}»°ÿÿ&ÿ”- ÿ 5ÿ©>ÿ±F$ÿ¸M3ü»VDõ»_Ví»giãµn}Ö¬sÊ£zÁ›€§¸”‡°±Ž¶«Š•»¦‡¾¢…¥ÀŸ„¯Á–~°Á”¶¸“€»²“€»²“€»²“€»²“€»²“€»²“€»²“€»²“€»²“€»²“€»²ÿÿŽ&ÿ•- ÿ¡5ÿ«=ÿ³F$ÿºM3ú¾UDó¿]Vê¿ej߸k~ЯqŦxœ»Ÿ~§²˜…¯«“‹¶¥Ž“»Ÿ‹š¾›‰¢Á˜ˆ¬Â‚¯Âƒµ¹„º³„º³„º³„º³„º³„º³„º³„º³„º³„º³„º³ÿÿŽ%ÿ–, ÿ¢5ÿ¬=ÿµE#ÿ¼L2øÁTCðÃ\VçÃcjÚ»i~̲pÀªvœ¶¢|§­œ‚¯¥—‰¶ž“»™˜¾” Á‘Œ©Â‹ˆ®ÂŠˆ´ºŠˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´ÿ‘ÿ%ÿ˜, ÿ¤4ÿ®=ÿ·E#ÿ¿L2öÅSCîÈ[VãÆajÔ¿h~ǶnŽ»­tœ±¦z¦§ €¯Ÿ›†µ˜—Ž»“••¾Ž’ÁŠ’§Â†Ž®Â„´»…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´ÿ‘ñ©ªÿ%ÿ™, ÿ¦4ÿ°<ÿ¹D"üÁK1ôÉRBëÍYUßÉ`jÏÂf}¹l¶±r›««x¦¢¥~®™ „µ’‹ºŒš“¾‡˜›À„—¥Â€–¯Â’³¼€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µÿ’ÿ%ÿ›, ÿ§4ÿ²<ÿ»D!ùÅK0ñÎQAçÒXTÚÎ^iÊÆe|½½kŒ°¶pš¥°v¥œª|­“¦‚´Œ£‰¹† ½ž™¿}ž¢Á{ž¯Áy™³¼z—¸µz—¸µz—¸µz—¸µz—¸µz—¸µz—¸µz—¸µz—¸µz—¸µz—¸µÿ’ÿ%ÿ+ ÿª3ÿµ<ü¿D ôÈJ.íÓP?ãØVSÓÒ]hÅÊc{·Âi‹ª»o˜Ÿ¶t£•±z¬­€²…ª‡·§Ž»z¦—¾w¦ ¿t¦­¿s¡´»tž¸µtž¸µtž¸µtž¸µtž¸µtž¸µtž¸µtž¸µtž¸µtž¸µtž¸µÿ“ÿ‘$ÿŸ+ ÿ¬3 ÿ¸;øÃCïÍJ,çÚO=ÝÞUQÍØ[g¾Ïbz°Èg‰¤Âm—™¼r¡¸x©†µ~°²…µy°Œ¸t¯•»p¯Ÿ¼n¯¬¼m«µ¹n§¹´n§¹´n§¹´n§¹´n§¹´n§¹´n§¹´n§¹´n§¹´n§¹´n§¹´ÿ”ÿ’$ÿ¢*ÿ°2 þ¼:òÇBèÓI)ááL;ÔãSQÆÝZe·Õ`x©Ïf‡Ék”‘Åpž‡Áv¦¾|¬x¼„±rº‹´m¹“¶j¸œ¸g·§¸g··¶h²»±h²»±h²»±h²»±h²»±h²»±h²»±h²»±h²»±h²»±h²»±ÿ•ÿ•#ÿ¥)ÿ´1 øÁ:ëÎBàÝG%ÕåK;ËçQP½ãYc¯Þ_t¢Øeƒ–ÓjŠÎo™Ès¡uÄx§nÁ}«i¾„®e½‹±a¼“²_¼²_¼¬±b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­ÿ–ÿ™!ÿª(ÿ¹0ðÈ8 áØ@ÔãE&ÊëK;ÁìOO³èW`¦å_ošâf|ŽÜl†„ÕqzÐu•sÍz›lÊŸgÇ„¢cÆŠ¤_Ä‘¦\Ä™§Zä§ZݧZݧZݧZݧZݧZݧZݧZݧZݧZݧZݧÿ˜ÿž ÿ¯&øÀ.æÐ3Õá<ÉêE(¿òJ;µñNL©ïV[í_h’êgs‡ãm|~Þr‚vÚxˆp×}ŒkÔ‚fÒ‡’cÑŒ•_Ï’–\Ι˜Y΢™XÍ«šXÍ«šXÍ«šXÍ«šXÍ«šXÍ«šXÍ«šXÍ«šXÍ«šXÍ«šXÍ«šÿšÿ¥ÿ·#íÉ&ÖÞ)Éé;¾óD)³øI:¨÷MHŸöUU”õ_`‰ñhh€ìopxèuuråzymâ}ià„€e߉‚bÝŽ„_Ü“†]Û™‡ZÚ¡‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰ÿœÿ­öÁÛÚÉè) ½ó;²ýC(¦þG6œýLC“ýUMŠý_Vùi]yõpbsòvgnð|jjîmgì†odë‹qaêr_é”t]è™uZç wXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xÿ¢ÿ·ØÏ Êç¼ó) ±ý;¤ÿ@&™ÿE2ÿK<‡ÿTDÿ_KxÿiPqÿpTlývXiû|Zfú\cø†^a÷‹__öa^ö•b\õšcZô dXó¥eXó¥eXó¥eXó¥eXó¥eXó¥eXó¥eXó¥eXó¥eXó¥eXó¥eÿ­ÖÃÈÓ »ô¯ÿ* £ÿ7—ÿ="‹ÿC,ÿJ4zÿR:sÿ^?nÿhCiÿoGfÿuIcÿ{KaÿL_ÿ…N]ÿŠO\ÿPZÿ“QYÿ˜RWÿžSVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TÙºÅǹ٬ÿ¢ÿ+ •ÿ3‰ÿ9~ÿ@%uÿH+mÿP0gÿZ4cÿe7`ÿm9^ÿs;\ÿx=Zÿ}>Xÿ‚?Wÿ†@Vÿ‹@UÿATÿ”BSÿšCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCƾ·ÍªäŸÿ”ÿ( ‡ÿ.{ÿ5qÿ=iÿE#bÿM&[ÿV)Xÿ_,Vÿh-Tÿn/Sÿs0Rÿx1Qÿ|1Pÿ€2Oÿ„3Nÿˆ3MÿŒ4Lÿ’4Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5·Ä©Ôœù “ÿ…ÿ# yÿ)nÿ1eÿ9]ÿAWÿJSÿR PÿY"Mÿ`#Kÿf$Jÿk%Iÿo%Hÿs&Gÿw&Fÿ{'Eÿ~'Eÿ‚(Dÿ‡(Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)ÿƒÿ€'ÿ{3 ÿ†8ÿŽ@ÿ“I"ÿ•U-ÿ“a9ÿmEÿ‹xOÿ†„Yü‚Ža÷}–hôxnñt£sîq©wìn®zêl³}éj¹çhÀægǃãeÏ…Ýc؆Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡ÿƒÿ€'ÿ{3 ÿ†8ÿŽ@ÿ“I"ÿ•U-ÿ“a9ÿmEÿ‹xOÿ†„Yü‚Ža÷}–hôxnñt£sîq©wìn®zêl³}éj¹çhÀægǃãeÏ…Ýc؆Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡ÿƒÿ€'ÿ{3 ÿ†8ÿŽ@ÿ“I"ÿ•U-ÿ“a9ÿmEÿ‹xOÿ†„Yü‚Ža÷}–hôxnñt£sîq©wìn®zêl³}éj¹çhÀægǃãeÏ…Ýc؆Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡ÿƒÿ€'ÿ{3 ÿ†8ÿŽ@ÿ“I"ÿ•U-ÿ“a9ÿmEÿ‹xOÿ†„Yü‚Ža÷}–hôxnñt£sîq©wìn®zêl³}éj¹çhÀægǃãeÏ…Ýc؆Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡ÿƒÿ€'ÿ{3 ÿ†8ÿŽ@ÿ“I"ÿ•U-ÿ“a9ÿmEÿ‹xOÿ†„Yü‚Ža÷}–hôxnñt£sîq©wìn®zêl³}éj¹çhÀægǃãeÏ…Ýc؆Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡ÿƒÿ€'ÿ}2 ÿˆ7ÿ?ÿ•I"ÿ—T-ÿ–_9ÿ“kEÿŽwQÿˆ‚[ú„Œdõ”kñz›rîv¢wër§{éo­çl²‚åj¸„äi¿‡âhljàfÏŠÖcÖŒÏbØŠÏbØŠÏbØŠÏbØŠÏbØŠÏbØŠÏbØŠÏbØŠÏbØŠÏbØŠÿ„ÿ'ÿ€1 ÿ‹6ÿ“>ÿ™G"ÿœR-ÿš]:ÿ˜iGÿ“tSþŽ~_÷ˆ‰iñ‚‘rí}˜yéxŸåt¤„ãpªˆàm°ŒÞk·Ýj¿‘ÛiÈ“ÕfÏ•ËdÑ“ÆeÔŽÆeÔŽÆeÔŽÆeÔŽÆeÔŽÆeÔŽÆeÔŽÆeÔŽÆeÔŽÆeÔŽÿ…ÿ‚&ÿ‚0 ÿŽ5ÿ–=ÿœF!ÿ P-ÿŸ[;ÿœfHÿ˜qVû“|bô†mw耕€äzœ‡àu¢ŒÝr¨‘Úo¯•Øm·™ÕkÀœÒiÉžÉeÉžÂg͘¾iÑ“¾iÑ“¾iÑ“¾iÑ“¾iÑ“¾iÑ“¾iÑ“¾iÑ“¾iÑ“¾iÑ“ÿ†ÿƒ&ÿ…/ ÿ4ÿ™=ÿŸF!ÿ£O-ÿ£Z;ÿ dIÿoXú˜yeñ’ƒqꋌ|䃒†ß}™ŽÚx •Öt§šÓp®ŸÑm¶£ÏkÀ¥Çf§ÀhÆ¢»jË›·lΖ·lΖ·lΖ·lΖ·lΖ·lΖ·lΖ·lΖ·lΖ·lΖÿ†ÿƒ&ÿ‡. ÿ“4ÿ›<ÿ¡E ÿ§M-ÿ¦X;ÿ¤bJü¡lY÷œvhï–€uç‰à‡ŒÚ€–•ÕzžÑu¥£Íp¬¨Ëmµ¬Çk¾­½h¿¬¸kæ³mÈŸ°oÌ™°oÌ™°oÌ™°oÌ™°oÌ™°oÌ™°oÌ™°oÌ™°oÌ™°oÌ™ÿ‡ÿ„%ÿ‰- ÿ•3ÿ<ÿ¤D ÿªL-ÿªW;þ¨`Kø¥jZó¡tjíœ~y䓆†Ü‹’Õƒ”œÏ|›¥Ëw£ªÇt«­Äsµ¯¿p¼°µk¼°°nÁ©¬pÆ¢©rÊœ©rÊœ©rÊœ©rÊœ©rÊœ©rÊœ©rÊœ©rÊœ©rÊœ©rÊœÿ‡ÿ„%ÿ‹, ÿ—3ÿŸ;ÿ¦Dÿ¬K,ÿ®U;û¬_Kõªh\î¦qlç z|ß—‚ŠÕŽˆ˜Í…¡Ç€—§Â{ž¬½x§¯ºv°±·uº²­pº²©q¿¬¥tĤ£uÉž£uÉž£uÉž£uÉž£uÉž£uÉž£uÉž£uÉž£uÉž£uÉžÿˆÿ…%ÿŒ+ ÿ˜2ÿ¡;ÿ©Cÿ¯K,ÿ±T;ø±]Kñ¯f\ê«oná£vÕ™}Ì‘„™ÅŠŒ¢¾„“¨¹š­´|£°°z«³­y¶´¦t¹´¢u½¯ŸwæyÇ yÇ yÇ yÇ yÇ yÇ yÇ yÇ yÇ yÇ ÿˆÿ…%ÿŽ* ÿš2ÿ£:ÿ«Bÿ±J+ýµS;öµ\Kî³d]å®loÛ¥sÎzÅ•™¾Žˆ¢·ˆ©±„—®¬€Ÿ±¨~¨´¥}²µŸz¸¶›y»±™{Á¨˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢ÿ‰ÿ†%ÿ* ÿœ1 ÿ¥:ÿ­Bÿ´J+û¸R:ó¹ZKê¸b^á±jpÓ©pÈ w¿™~™·’…¢°ŒŒ©ªˆ”®¥„œ² ‚¤µ®¶™··”}º³“Àª’Å£’Å£’Å£’Å£’Å£’Å£’Å£’Å£’Å£&Ñ®’Å£ÿ‰ÿ†$ÿ‘) ÿ1 ÿ§9ÿ¯Bÿ¶I*ø¼P:ð½YKç¼a^ܵgqάoäu޹œ|™±–‚¢ª‘Š©£Œ‘®ž‰™²™†¡µ–…«·“…¶·Ž¹´Žƒ¿«ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ÿ‰ÿ‡$ÿ“) ÿŸ1 ÿ©9ÿ±Aÿ¹I)öÀO9íÂWJä¿_]Ö¹fpɰm€¾¨sŽ´ z™«š€¢¤•‡©‘Ž®—Ž–²’‹ŸµŠ©·ŒŠ´¸ˆ†¸µˆ‡¾¬ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ÿŠÿ‡$ÿ”) ÿ¡0 ÿ«9ÿ´Aü»H(ôÃN8ëÇVJàÃ^]Ѽeoijk€¹«q¯¤w˜¦ž~¡žš„¨—–Œ®‘“”²Œ‘œµˆ¦·…±¸‚Œ·¶‚Œ¾­ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ÿŠÿˆ$ÿ–(ÿ£0 ÿ­8ÿ¶@ú¾H'ñÇN7çÌUHÜÇ\\Ì¿co¿·i´°pŒ©©u— £{ ˜Ÿ‚¨‘›‰­Š™’²…–𵕤·~•¯·{’·¶}‘½®}§}§}§}§}§}§}§}§}§}§ÿ‹ÿ‰$ÿ˜(ÿ¥/ ÿ°8ÿ¹@øÂG&îËM5äÐTFÕË[[ÇÃbnº»h~®´n‹£®s–š©zŸ’¥€¦Š¡‡¬„Ÿ±~˜´zœ¡¶x›¬¶uš·¶w˜½®x–§x–§x–§x–§x–§x–§x–§x–§x–§x–§ÿŒÿŠ#ÿš'ÿ§/ ÿ³7ü½?óÆF#êÐL2àÕREÏÏYZÁÈ`l´Àf|¨ºlŠ´r•”°xž‹¬~¥ƒ¨…ª}¦Œ¯x¤•²t£Ÿ´q£ªµo¤¹´p ¾­r§r§r§r§r§r§r§r§r§r§ÿŒÿŒ"ÿ'ÿª. ÿ¶6÷Á>íÌF äØK.ÙÜPDÉÔXX»Í^k®Æez¢Àjˆ—»p’·u›„³|¢}±ƒ¨v¯Š¬q­“¯m­±j­©²i­·±j©¿¬k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦ÿÿ ÿ &ÿ®-ý»5 ñÇ=åÓDÝàH-ÐáOBÂÛVV´Ó]h§ÍcxšÈh…Ãn…Àt˜}½zžvº¤p¹‰¨k¸’ªg·œ¬e¸¨­c¸¶­dµÁ©e°Å¤e°Å¤e°Å¤e°Å¤e°Å¤e°Å¤e°Å¤e°Å¤e°Å¤e°Å¤ÿŽÿ“ÿ¤%ÿ³,÷Á3 èÎ<ÜÞ@ÐåH.ÇåMB¹àUT¬Û[eŸÕat’Ðf‡Íl‹~Êr“vÈy™oÆžjʼn¢eÅ’¤bĦ_ħ§]Ä´§^ÃĤ_½È _½È _½È _½È _½È _½È _½È _½È _½È _½È ÿÿ˜ÿ©#ÿ¹)îÈ1ÝÚ4 ÐäAÆëG.¼êLA°æSR£ãZa—àanŒÝhy‚Ûn‚zÙu‰rÕ|kÒ‚“eψ—`Íš\Ì—œZË XË«W˺YÌÌ™YÌÌ™YÌÌ™YÌÌ™YÌÌ™YÌÌ™YÌÌ™YÌÌ™YÌÌ™YÌÌ™ÿ’ÿÿ¯ öÀ%âÓ$Ðã2 Åì@ºñG/°ïK?¥íQNšëZZêbe…èjn}çruuãx{oà~€iÝ„„dÛŠ‡`Ù‘‰]ؘ‹ZÖ XÖ¨ŽVÕ´ŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽÿ”ÿ¤ÿ·éËÑáÅì1ºõ@®÷E.£õJ<šôPHóZS†óc[~òlbwñshqîzmlë€pgé†scçŒv`æ’x]ä˜zZãž{Xã¥}Vâ¯~Tá¸~Tá¸~Tá¸~Tá¸~Tá¸~Tá¸~Tá¸~Tá¸~Tá¸~Tá¸~ÿ˜ÿ­óÃÒØ Äì¸ö1­ý>¢ýC+—üH7ŽüOA…üYI}ücPwümVpûtZkùz^h÷adõ‡caóe_ò“g]ñ™hZðžiXï¥kVï­lTî´mTî´mTî´mTî´mTî´mTî´mTî´mTî´mTî´mTî´mÿ£ñ¹ ÎÉ Äß ¶÷¬ÿ2 ÿ;”ÿA'ŠÿG1ÿN9zÿX?sÿbEnÿlIiÿsLfÿzOcÿ€Q`ÿ†S^ÿŒT\ÿ’UZþ˜WYýXWü¤YUû«ZTû±[Tû±[Tû±[Tû±[Tû±[Tû±[Tû±[Tû±[Tû±[Tû±[ð¯Í¿ÀÍ´î©ÿ!Ÿÿ1’ÿ7‡ÿ>"}ÿE)uÿM0nÿU5iÿ`9eÿj_ÿw@\ÿ~BZÿ„CYÿ‰DWÿEVÿ”FUÿšGSÿ HRÿ§IQÿ­JQÿ­JQÿ­JQÿ­JQÿ­JQÿ­JQÿ­JQÿ­JQÿ­JQÿ­Jϸ¾Ã²Ô¦þœÿ#ÿ-„ÿ3yÿ;pÿC"iÿJ'bÿR*]ÿ\-Zÿe0Xÿm1Vÿs3Tÿy4Sÿ~5Rÿ„6Pÿ‰7OÿŽ8Nÿ“8Mÿ™9Lÿ :Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:¿¼°Ê£Ü™ÿÿ"‚ÿ( vÿ/mÿ7eÿ?^ÿGXÿN!TÿW#Qÿ_%Nÿe&Mÿl'Kÿq(Jÿv)Iÿ{*Hÿ€*Gÿ…+Fÿ‰+EÿŽ,Dÿ”,Cÿš-Cÿš-Cÿš-Cÿš-Cÿš-Cÿš-Cÿš-Cÿš-Cÿš-Cÿš-±Â£Ò•ëŒÿ€ÿtÿ# iÿ*`ÿ2Yÿ:SÿBNÿIKÿQHÿXFÿ]DÿcCÿgAÿl@ÿp?ÿt >ÿx =ÿ| <ÿ!;ÿ‡!;ÿŒ";ÿŒ";ÿŒ";ÿŒ";ÿŒ";ÿŒ";ÿŒ";ÿŒ";ÿŒ";ÿŒ"ÿzÿv(ÿr3 ÿ|7ÿ„?ÿˆHÿ‹S'ÿ‰`1ÿ†m;ÿ‚yDÿ~†Lÿ{‘SÿwšXÿt¢]üq¨aún®døk´g÷iºiõhÁkófÈmïcÍoìaÓpç_Ýqâ]åsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÿzÿv(ÿr3 ÿ|7ÿ„?ÿˆHÿ‹S'ÿ‰`1ÿ†m;ÿ‚yDÿ~†Lÿ{‘SÿwšXÿt¢]üq¨aún®døk´g÷iºiõhÁkófÈmïcÍoìaÓpç_Ýqâ]åsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÿzÿv(ÿr3 ÿ|7ÿ„?ÿˆHÿ‹S'ÿ‰`1ÿ†m;ÿ‚yDÿ~†Lÿ{‘SÿwšXÿt¢]üq¨aún®døk´g÷iºiõhÁkófÈmïcÍoìaÓpç_Ýqâ]åsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÿzÿv(ÿr3 ÿ|7ÿ„?ÿˆHÿ‹S'ÿ‰`1ÿ†m;ÿ‚yDÿ~†Lÿ{‘SÿwšXÿt¢]üq¨aún®døk´g÷iºiõhÁkófÈmïcÍoìaÓpç_Ýqâ]åsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÿzÿw'ÿt2 ÿ6ÿ†=ÿ‹GÿŽQ'ÿŒ^1ÿ‰k<ÿ…wFÿƒNÿ}Vÿy˜\üu aùr¦e÷o­iõl³lój¹oòhÀqðfÈsìdÍuèaÔvã_ÞwÛ]ãyÕ]åvÕ]åvÕ]åvÕ]åvÕ]åvÕ]åvÕ]åvÕ]åvÕ]åvÿ{ÿw'ÿw0 ÿ‚5ÿŠ<ÿFÿ’O'ÿ‘\2ÿŽh=ÿŠtHÿ†€Rÿ‹Zü}•aøxgõt¤mòqªqðn°tîk¶wìi¾zêgÇ}çeÎâbÖ€Ù_ÝÐ_à~Ì`ã{Ì`ã{Ì`ã{Ì`ã{Ì`ã{Ì`ã{Ì`ã{Ì`ã{Ì`ã{ÿ|ÿx&ÿz/ ÿ…3ÿ;ÿ’Dÿ–N'ÿ•Z2ÿ’e>ÿŽqJÿŠ}Uþ…ˆ^ù€’gô{šnðv¡sír§xêo®}èl´€æi¼ƒägƆáeψÙb׊ÏaÙˆÈbÝ‚ÄcàÄcàÄcàÄcàÄcàÄcàÄcàÄcàÄcàÿ}ÿy&ÿ|. ÿˆ2ÿ:ÿ•CÿšL'ÿ™X3ÿ–c?ÿ’nLÿŽzWü‰…bõ„kð~—sìyžzèt¥€åp«…âl³‰àj»ŒÞhÆÚfÑ’ÎbÑ’ÇdÕŒÁeÛ†½fÝ‚½fÝ‚½fÝ‚½fÝ‚½fÝ‚½fÝ‚½fÝ‚½fÝ‚½fÝ‚ÿ}ÿz&ÿ, ÿ‹1 ÿ“:ÿ˜BÿK&ÿV3ÿ›a@ÿ—lMû’vZ÷fòˆŒpì‚”yç{›ãu¢ˆßq©ŽÜm±’Ùk»–×iÈ™ÌdË›ÅeΗÀgÒ‘ºhØŠ¶iÛ†¶iÛ†¶iÛ†¶iÛ†¶iÛ†¶iÛ†¶iÛ†¶iÛ†¶iÛ†ÿ~ÿ{&ÿ+ ÿ1 ÿ•9ÿ›Bÿ J&ÿ¡T3ÿŸ_AûœiOö—s]ñ’~j쌈uç…‘€â~˜‰Ýx ‘Ør§—Òm¯Ïl¹ŸÌkÅ ÃgÇ ¼hË›·jД²lÕ¯lÙ‰¯lÙ‰¯lÙ‰¯lÙ‰¯lÙ‰¯lÙ‰¯lÙ‰¯lÙ‰¯lÙ‰ÿ~ÿ{%ÿƒ* ÿ0 ÿ˜8ÿžAÿ£I&ÿ¦R3ý¤]A÷¡gPñœq_ë—{måƒzÞ‡‹†Õ~’‘Ïx™—Êt¡œÇqªŸÃo³¡Án¿£ºkÅ£³kÈŸ¯m͘«oÒ‘©pÖŒ©pÖŒ©pÖŒ©pÖŒ©pÖŒ©pÖŒ©pÖŒ©pÖŒ©pÖŒÿÿ|%ÿ†)ÿ’/ ÿ›8ÿ¡@ÿ§H%ÿªQ2ù©[Aó¦dQì¢naåšvpÜ‘~Ò‰†‹Ë‚“Å}•™Àxž¼u¥¡¹s®¤¶r¹¥²pæ«oÆ¢¨qË›¤sГ¢tÔŽ¢tÔŽ¢tÔŽ¢tÔŽ¢tÔŽ¢tÔŽ[«¯³¢tÔŽ¢tÔŽ¢tÔŽÿ€ÿ|%ÿˆ(ÿ”/ ÿ7ÿ¤?ÿªG$ý®O2ö­YAï«bRç¦kbÞžrsÒ•zÊ‚‹Ã‡Š“½‘š·}™Ÿ³y¡£¯wª¦¬v´§ªvÁ¨£sÃ¥ uÉžžwÏ–œwÒ‘œwÒ‘œwÒ‘œwÒ‘œwÒ‘œwÒ‘œwÒ‘œwÒ‘œwÒ‘ÿ€ÿ}%ÿŠ'ÿ–. ÿŸ6ÿ§?ÿ­G#û²N1ó²WAë±`RâªhdÖ¢ptÌ™wÃ’‹¼‹†”µ†Žš¯• ª~¤¦{¦§£z°©¡y¼©›wÁ¨™yÇ ˜z͘—{Ñ“—{Ñ“—{Ñ“—{Ñ“—{Ñ“—{Ñ“—{Ñ“—{Ñ“—{Ñ“ÿÿ~$ÿŒ&ÿ˜. ÿ¢6ÿ©>ÿ¯F#øµM0ð·V@çµ^RÝ®fdÐ¥nsÆu€½–|‹µƒ”®Š‹›¨†’ £‚š¥Ÿ£¨›~­ª˜}¹«”{Àª“}Æ¢’~Ì™‘Д‘Д‘Д‘Д‘Д‘Д‘Д‘Д‘Дÿÿ~$ÿ&ÿš- ÿ¤5ÿ¬=þ²E"ö¸L0í¼T@ä¸]QײdcË©lsÀ¡s€·šz‹¯”€“¨ˆ›¢Š œ‡—¥—„ ¨”‚©ª‘‚µ«¿«Å¤Œ‚Ë›Œ‚Ï•Œ‚Ï•Œ‚Ï•Œ‚Ï•Œ‚Ï•Œ‚Ï•Œ‚Ï•Œ‚Ï•Œ‚Ï•ÿ‚ÿ$ÿ%ÿœ- ÿ¦5ÿ®=üµE!ó¼K.êÁR?à¼[QѵccÆ­jr»¥q²žwŠ©˜~“¢“…š› –Œ•¥‘‰¨‡§«Š‡²¬‡‡¿¬††Ä¥‡†Êœ‡†Î—‡†Î—‡†Î—‡†Î—‡†Î—‡†Î—‡†Î—‡†Î—‡†Î—ÿ‚ÿ€#ÿ‘%ÿž, ÿ¨4 ÿ±<ú¸Dð¿K-çÅQ=ÜÀZP͸abÁ°hq¶©o~¬¢u‰¤|’œ˜‚š•”Š ‘’¥ŠŽ›¨†¥«ƒŒ°¬¾¬€‹Ã¦‹É‹Í˜‹Í˜‹Í˜‹Í˜‹Í˜‹Í˜‹Í˜‹Í˜‹Í˜ÿƒÿ‚"ÿ“$ÿ ,ÿ«3 ÿ´<÷¼CîÄJ+äÉQ;ÕÄXOȼ`a¼´gp±­m}§§s‰ž¢y’–€™šˆŸ‰—¤ƒ”˜¨“¢ª|’­«z’»¬z‘æ{Éž|͘|͘|͘|͘|͘|͘|͘|͘|͘ÿƒÿ„!ÿ•$ÿ¢+ÿ­3 þ·;ôÀBêÉI(àÍO9ÐÇWNÃÀ^`·¸eo«²k|¡¬q‡˜§x£~˜‰ …ž‚£}›–§x™ ©u™«ªs™¸«s˜Ã¦u–Éžv•Í™v•Í™v•Í™v•Í™v•Í™v•Í™v•Í™v•Í™v•Í™ÿ„ÿ‡ ÿ—#ÿ¥*ÿ±2 û»:ñÅAçÏH%ÛÒM8ËËUL½Ä]^±¾cn¥¸j{›²o†’®v‰ª|–‚§ƒœ{¤‹¡v¢”¥q¡§n ©©l¡¶©m¡Ã¦oÉžpœÍ˜pœÍ˜pœÍ˜pœÍ˜pœÍ˜pœÍ˜pœÍ˜pœÍ˜pœÍ˜ÿ…ÿŠÿš"ÿ¨)ÿµ0öÀ8ëË@áØF ÓØK6ÅÐTK·É[\«ÃblŸ¾hx”¹nƒ‹µsŒƒ²z“{¯™u­‰žo«’¢kªœ¤hª§¥fª´¦f«Å¤h¦Êœi¤Í—i¤Í—i¤Í—i¤Í—i¤Í—i¤Í—i¤Í—i¤Í—i¤Í—ÿ†ÿÿž!ÿ¬'ýº/ïÇ6 ãÔ>ØßCËÞJ4¾ÖRH°ÐZZ¤Ê`i˜ÆfvÁl€„¾r‰{»xt¹•n·‡ši¶eµ› b´¦¡`µ³¡_¶Å a±Ìšb®Ï•b®Ï•b®Ï•b®Ï•b®Ï•b®Ï•b®Ï•b®Ï•b®Ï•ÿ‡ÿ‘ÿ¢ ÿ²%õÀ+æÏ1ØÞ8ÌåC ÃâI3¶ÞQF©ØXWœÒ^eÎdr†Ëj||Èp„tÆwŠnÄ~hÇ”c—_Á›™\Á¦š[³›ZÃÅš[¾Ï•\ºÒ‘\ºÒ‘\ºÒ‘\ºÒ‘\ºÒ‘\ºÒ‘\ºÒ‘\ºÒ‘\ºÒ‘ÿ‰ÿ–ÿ¨þ¸!ìÉ"ÙÝ%Ìå7ÂêC"·çH3¬äOD àVS”Ý]`ˆÚck~ÖjuuÔp}nÒwƒgшbЇ‹^БŽZМXЧ‘Vе’UÒÇ‘VÍÔŽVÈÖ‹VÈÖ‹VÈÖ‹VÈÖ‹VÈÖ‹VÈÖ‹VÈÖ‹VÈÖ‹VÈÖ‹ÿ‹ÿÿ¯ôÁÝØÌå&Áî7¶ïB#«íG2¡ëL@–éUM‹ç]X‚æeayälirätolã|tgâ„xbâ{^â•~[àž€Xß§‚UÞ±ƒSÞ¾ƒRÞÒƒQÙÜ‚QÙÜ‚QÙÜ‚QÙÜ‚QÙÜ‚QÙÜ‚QÙÜ‚QÙÜ‚QÙÜ‚ÿÿ¤þ¸ÖÌ ÌäÀï&µõ8ªô@"ŸóF0•òK<ŒñTF‚ð]OzðfVtðn\nïvaiï~deï†haïŽj^î–m[ížoXë¥pVë®qTê¸rRêÇsQéÕsQéÕsQéÕsQéÕsQéÕsQéÕsQéÕsQéÕsQéÕsÿ˜ÿ®ÔÁ ÉÏ ¾ð³ù' ©û8žû>!“ûD,‰úJ5úS>yú]ErúfJmúoNhúvRdú~Uaú†W_ûŽZ\ú–[Zù]Wø¥^U÷¬`S÷µaRöÁaPöÊbPöÊbPöÊbPöÊbPöÊbPöÊbPöÊbPöÊbPöÊbÿ£ Ö¸ÆÄ»Ô °ü¦ÿ) œÿ5ÿ;†ÿB&}ÿI.uÿQ4oÿ[:iÿe>eÿnAbÿuD_ÿ|F\ÿƒHZÿ‹IXÿ“KVÿ›LUÿ¢MSÿ©NQÿ±OPÿ»POÿÃQOÿÃQOÿÃQOÿÃQOÿÃQOÿÃQOÿÃQOÿÃQOÿÃQÚ¯Ƽ¹É­Û£ÿšÿ+ Žÿ1ƒÿ8yÿ@ pÿG&iÿO+cÿX/_ÿb2\ÿk4Zÿr6Xÿx8Vÿ9Tÿ†;RÿNÿ£>Mÿª?Kÿ³@Jÿ¹AJÿ¹AJÿ¹AJÿ¹AJÿ¹AJÿ¹AJÿ¹AJÿ¹AJÿ¹Aȵ¸Á«ÐŸë –ÿ‹ÿ& ÿ-uÿ5lÿ=eÿD^ÿL"XÿT%Uÿ]'Rÿe)Pÿl*Nÿs+Mÿy,Lÿ-Jÿ….IÿŒ/Hÿ’0Gÿ™0Eÿ 1Dÿ©2Cÿ®2Cÿ®2Cÿ®2Cÿ®2Cÿ®2Cÿ®2Cÿ®2Cÿ®2Cÿ®2¸ºªÈÙ’ÿ ‰ÿ}ÿ!rÿ( hÿ0`ÿ8Zÿ@TÿHOÿOLÿWIÿ]Gÿc Eÿi Dÿo!Bÿt"Aÿz"@ÿ€#?ÿ†$>ÿŒ$=ÿ’%<ÿ™%;ÿž&;ÿž&;ÿž&;ÿž&;ÿž&;ÿž&;ÿž&;ÿž&;ÿž&«ÁÐá†ÿzÿnÿdÿ# \ÿ+ Uÿ3Oÿ;IÿBFÿIBÿO@ÿU>ÿZ<ÿ_;ÿd9ÿh8ÿm7ÿr6ÿw5ÿ|4ÿ3ÿˆ2ÿ2ÿ2ÿ2ÿ2ÿ2ÿ2ÿ2ÿ2ÿÿpÿl)ÿi3 ÿr7 ÿy>ÿ}Gÿ€Q!ÿ~_)ÿ|m2ÿy{9ÿvˆ@ÿs“EÿpJÿn¦Nÿk­Qÿi´Sÿh»UÿfÃWÿcÇYûaÌ[÷_Ó\ó^Ý]ð\ã^ë[é_çYï`åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_ÿpÿl)ÿi3 ÿr7 ÿy>ÿ}Gÿ€Q!ÿ~_)ÿ|m2ÿy{9ÿvˆ@ÿs“EÿpJÿn¦Nÿk­Qÿi´Sÿh»UÿfÃWÿcÇYûaÌ[÷_Ó\ó^Ý]ð\ã^ë[é_çYï`åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_ÿpÿl)ÿi3 ÿr7 ÿy>ÿ}Gÿ€Q!ÿ~_)ÿ|m2ÿy{9ÿvˆ@ÿs“EÿpJÿn¦Nÿk­Qÿi´Sÿh»UÿfÃWÿcÇYûaÌ[÷_Ó\ó^Ý]ð\ã^ë[é_çYï`åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_ÿpÿl(ÿk1 ÿu6 ÿ{<ÿFÿƒP!ÿ^*ÿ~k3ÿ{x;ÿx†Bÿu’Hÿr›Mÿp¤Qÿm¬Tÿk²Wÿi¹ZÿgÁ\üeÇ^øbÌ_õ`Óað^Ýbì\äcè[édâZïdàZðbàZðbàZðbàZðbàZðbàZðbàZðbàZðbÿqÿm(ÿn0 ÿx4 ÿ;ÿƒDÿ‡N!ÿ†[+ÿƒh4ÿu=ÿ|‚EÿyŽLÿv™Rÿr¡Vÿo©Zþm°^üj·aûh¾cùfÆeôcÌgðaÓië_Þkæ]ålà[émÙ\îhÖ\ïgÖ\ïgÖ\ïgÖ\ïgÖ\ïgÖ\ïgÖ\ïgÖ\ïgÿrÿn(ÿq. ÿ{2 ÿƒ:ÿ‡CÿŠL!ÿŠY+ÿ‡e5ÿƒr?ÿ~Hÿ|‹Pÿy–VÿuŸ\ýr¦`ún­døl´höi¼kôgÅmðdÌpëaÓrå_ßsÞ\åtÖ\èqÏ^ílÍ^îkÍ^îkÍ^îkÍ^îkÍ^îkÍ^îkÍ^îkÍ^îkÿsÿo'ÿt-ÿ~1 ÿ†9ÿ‹BÿŽK!ÿŽV+ÿ‹c6ÿ‡oAÿƒ{Kÿ‡Sþ|’[üxœaùt¤göp«kóm²oñjºsïhÃvëeÌxæbÕzÞ_ß|Ó]ã{Í_ævÇ`êpÆ`ìnÆ`ìnÆ`ìnÆ`ìnÆ`ìnÆ`ìnÆ`ìnÆ`ìnÿtÿp'ÿv+ÿ/ ÿ‰8ÿŽ@ÿ’I!ÿ“T,ÿ`7ÿŒlCÿ‡wMûƒƒWøŽ`öz—góv nðr¨sín¯xëk¸|èhÂæfÍ‚ßbØ„Ñ_Ü…Ê`àÅaãz¿cèt¾cér¾cér¾cér¾cér¾cér¾cér¾cér¾cérÿtÿp&ÿy*ÿ…. ÿ7ÿ’?ÿ–H ÿ—R,ÿ•^8þ‘iDúŒtPõ‡[ò‚‰eî}“nêw›uçr£|än«áj³†Þg½ŠÚeÊÒbÔŽÈbØŠÂcÜ„¼eà~·fåx¶fæv¶fæv¶fæv€–’¶fæv¶fæv¶fæv¶fæv¶fævÿuÿq&ÿ|(ÿˆ- ÿ6ÿ–>ÿšG ÿœP+ÿš[8ù—fEô’pRïŒ{_ê……jå~tàx•}Ûr…Ôm¤‹Ðj­ŽÍh·ËhÑÈgÑ’¿eÔ¹gÙ‰´hÝ‚°iâ|®jäy®jäy®jäy®jäy®jäy®jäy®jäy®jäyÿvÿr&ÿ'ÿŠ, ÿ“5ÿ™=ÿžFÿ¡N+û Y8õœcFï˜mTèwbâˆoÚ€‡{ÒzƒÍu—‰ÉqŸÅn¨‘Âl±“¿k¼•½kË•¶iД±kÕ¬lÛ†¨mà§mâ|§mâ|§mâ|§mâ|§mâ|§mâ|§mâ|§mâ|ÿvÿs%ÿ&ÿ, ÿ–4ÿ<ÿ¡Dþ¥L*÷¥W8ð¢aGéœjVá”reØŒ{sÏ…ƒ|É‹„Ãz“Š¿v›ºs£“·p¬–´o·—±oʬm͘©oÓ¥p؉¡qÞ‚ qà qà qà qà qà qà qà qàÿwÿt%ÿƒ%ÿ+ ÿ™3 ÿ ;ÿ¥Cû©K)óªT8ì¨^Gã¡gWÚ™ogÏ‘xsÇŠ€}Á„ˆ…»‹µz—±wŸ”­t¨—ªs²™§r¿š¤rËš¡sГžtÖŒ›uÜ„šuÞšuÞšuÞšuÞšuÞšuÞšuÞšuÞÿxÿv$ÿ†#ÿ’*ÿ›2 ÿ£:ÿ¨Bø­J(ð¯R7ç¬\GÞ¥dXÑmfÈ•usÀŽ|}¹‰„…³ƒŒŒ­“‘©{›•¥y¤™¡w®›žvºœwÊœ™wÏ–—xÔŽ•xÛ†”x݃”x݃”x݃”x݃”x݃”x݃”x݃”x݃ÿxÿx#ÿˆ#ÿ”*ÿž1 ÿ¦:þ«Bõ°I'ìµP6ã°ZFØ©cWÌ¡kfšrrº“z|³…¬ˆ‰Œ¦„‘¡€˜–}¡š™{ªœ–{¶”{Æž’{͘‘|Ó|Ùˆ|Ü…|Ü…|Ü…|Ü…|Ü…|Ü…|Ü…|Ü…ÿyÿz"ÿŠ"ÿ–)ÿ 1 ÿ¨9û¯Aò´H&é¹O4ß´YEÒ­aVÇ¥ie½žpr´—w|­‘~…¦Œ†Œ ˆ‘š…•––‚žš’€§³ž€Âž‹€Ìš‹Ò’Š€Ø‰‰€Û†‰€Û†‰€Û†‰€Û†‰€Û†‰€Û†‰€Û†‰€Û†ÿyÿ{!ÿ‹"ÿ˜(ÿ£0 ÿ«8ù²@ï¸G$æ½N3Û¸WDͰ`V©gd¸¢nq¯›u{§–|„ ‘ƒ‹š‹‘”Š“–‡›š‹…¥ˆ„°Ÿ…„¿Ÿ……Ë›……Ñ“……ØŠ„„Ú‡„„Ú‡„„Ú‡„„Ú‡„„Ú‡„„Ú‡„„Ú‡„„Ú‡ÿzÿ} ÿ!ÿ›(ÿ¥/ ÿ®7ö¶?ì¼F"ãÁN0Õ¼VCÈ´^U½¬fc³¦lpªŸs{¡šz„š–‹”’ˆ‘Ž–‰Œ™š„УЮŸ~мŸ~ŠÊœŠÐ”‰Ö‹ˆÙˆˆÙˆˆÙˆˆÙˆˆÙˆˆÙˆˆÙˆˆÙˆÿzÿÿ!ÿ'ÿ¨.þ²6 óº>éÁEßÅL/пTBÄ·]S¸°db®ªjo¤¤qzœŸwƒ”›~ŠŽ˜†‡•Ž•‚’—™} œz«žx¹Ÿw‘ÊyÏ•yŽÖŒy؉y؉y؉y؉y؉y؉y؉y؉ÿ{ÿÿ’ ÿ &ÿ«-ûµ5 ð¾=æÇDÚÉI.ËÃSA¾¼[R³µba¨¯inŸªox–¥uŽ¡|‰‡žƒ›‹”{™”˜w—ž›s–©q–¶žp—Èr–Ï•s”ÕŒt“؉t“؉t“؉t“؉t“؉t“؉t“؉t“؉ÿ|ÿ„ÿ•ÿ£%ÿ¯,÷º3 ìÄ;âÎBÓÎH,ÆÇR@¹ÀZQ­ºa_£´gl™°mw«t€ˆ¨z‡¥z¢‰’u ’–pž›™lž§›jž´œiŸÅ›lžÐ”mšÖŒm™Ø‰m™Ø‰m™Ø‰m™Ø‰m™Ø‰m™Ø‰m™Ø‰m™Ø‰ÿ}ÿ‡ÿ˜ÿ¦#ÿ³)óÀ1çË8 ÝØ:ÍÒF*ÀÌP>³ÆXO§À_]œ»ej’·kt‰³q}¯x„z­Štª‡n©“i§š–f§¥˜c§²™b¨Ã˜e§Ñ“f£Ö‹g¡Ù‰g¡Ù‰g¡Ù‰g¡Ù‰g¡Ù‰g¡Ù‰g¡Ù‰g¡Ù‰ÿ~ÿ‹ÿœÿ«!û¹&íÇ,ßÕ1ÓÞ9ÆØD(¹ÑN;¬ÌVL Ç]Z•Âcg‹¿iq‚»oyz¸v€s¶}†m´…‹h³Žc²˜’`±¤“^²±”\²Â”^²Ó_¬Ù‰`ªÚ†`ªÚ†`ªÚ†`ªÚ†`ªÚ†`ªÚ†`ªÚ†`ªÚ†ÿÿÿ¡ÿ±ôÀ ãÑ Óß,Éâ;¾ßD%²ÙL8¥ÓTI™Ï[WŽËac„Èhl{ÅnusÃu{lÁ|gÀ„…b¿Ž‰^¾˜‹Z¾¤X¾±ŽW¿ÂX¿×‹Y¸Ü…Y¶ÝƒY¶ÝƒY¶ÝƒY¶ÝƒY¶ÝƒY¶ÝƒY¶ÝƒY¶Ýƒÿÿ•ÿ§ý¸éËÓßÈç,¾æ;³äD%¨áK5œÝRD‘ÙYR†Õ`]|ÓfftÑmnlÏttfÎ|yaÍ…}\ÌŽ€YÌ™ƒVÌ¥„T̳…SÍÄ…SÍ݃SÆà~TÃá}TÃá}TÃá}TÃá}TÃá}TÃá}TÃá}TÃá}ÿ‡ÿœÿ®Ú ÐÒ Çè¼ì, ²ë<¨êC%èH3’æP@ˆäYK~â`Tváh\oàobhßwhcÞl^ÞˆpZÞ‘sWÞ›uTÞ§wRß´xPßÄxOàÞxOÖåuOÓçtOÓçtOÓçtOÓçtOÓçtOÓçtOÓçtOÓçtÿÿ¤Û¸ÍÅ ÅÕ ºñ°ò- ¦ñ;›ðA$‘ïG/‡îN:~îXCwíaJpíiPjìqUeìyYaì\]ìŠ_Zì“aWícUí§eRí³fQîÀgOïÔhNëæhMèèhMèèhMèèhMèèhMèèhMèèhMèèhMèèhÿ™ Ý®̼ÁÉ¸Û ­ø¤ø/ ™ø9ø?!…øF*|øM2u÷W9n÷`?i÷iCdøqGaøyJ]øLZø‰OXø’QVù›RSù¥TQú¯UPú»VNúÊWMûãWLûéWLûéWLûéWLûéWLûéWLûéWLûéWLûéWå¥Î´¿¿´Îªë  ÿ—ÿ/ Œÿ6‚ÿ=xÿD$pÿL*jÿT/eÿ^3aÿg7]ÿo9ZÿvVÿ†?SÿŽAQÿ—BPÿ CNÿ©EMÿ³EKÿ¾FJÿÐGIÿÜGIÿÜGIÿÜGIÿÜGIÿÜGIÿÜGIÿÜGIÿÜGÑ®¿¹²Å§Õœý”ÿ"‰ÿ+ ~ÿ2uÿ:lÿBeÿI"_ÿQ%ZÿZ(Wÿc+Tÿk-Rÿr/Pÿy0Oÿ€1Mÿˆ2Kÿ4Jÿ˜5Hÿ¡5Gÿª6Fÿ³7Dÿ¿8DÿÅ8DÿÅ8DÿÅ8DÿÅ8DÿÅ8DÿÅ8DÿÅ8DÿÅ8Á³²¾¥Ì™Ýÿ†ÿ{ÿ' qÿ.hÿ6aÿ>ZÿFUÿMQÿUNÿ] Kÿd"Iÿk#Gÿq$Fÿx%Dÿ&Cÿ†'AÿŽ(@ÿ–(?ÿž)=ÿ§)<ÿ°*<ÿ´*<ÿ´*<ÿ´*<ÿ´*<ÿ´*<ÿ´*<ÿ´*<ÿ´*³¸¥Æ—Õ‹ï„ÿwÿmÿ"dÿ* \ÿ2Uÿ9PÿAKÿHHÿOEÿVBÿ\@ÿa>ÿg<ÿm;ÿs9ÿy8ÿ€6ÿˆ5ÿ4ÿ—2ÿ 2ÿ¤2ÿ¤2ÿ¤2ÿ¤2ÿ¤2ÿ¤2ÿ¤2ÿ¤¦À—ΉÞÿtÿiÿ_ÿWÿ$Pÿ, Jÿ3 Eÿ;AÿA=ÿG:ÿM8ÿR6ÿW4ÿ\2ÿa1ÿf/ÿk.ÿq-ÿw,ÿ}*ÿƒ)ÿ‹)ÿŽ)ÿŽ)ÿŽ)ÿŽ)ÿŽ)ÿŽ)ÿŽ)ÿŽÿf ÿa*ÿa3ÿi6 ÿn=ÿqFÿsQÿs^#ÿpm)ÿn|0ÿk‰5ÿi–9ÿg¡=ÿfª@ÿd²Bÿc¹DÿaÂFÿ`ÈGÿ^ÍHÿ\ÔJÿ[ÞKûYäL÷XêLôWïMðVóMìUøMìUøMìUøMìUøMìUøMìUøMìUøMìUøMÿf ÿa*ÿa3ÿi6 ÿn=ÿqFÿsQÿs^#ÿpm)ÿn|0ÿk‰5ÿi–9ÿg¡=ÿfª@ÿd²Bÿc¹DÿaÂFÿ`ÈGÿ^ÍHÿ\ÔJÿ[ÞKûYäL÷XêLôWïMðVóMìUøMìUøMìUøMìUøMìUøMìUøMìUøMìUøMÿf ÿb*ÿc1ÿk5 ÿp<ÿsEÿuOÿv]#ÿsl*ÿpz1ÿm‡6ÿk”;ÿiŸ?ÿh¨Bÿf°Eÿd¸GÿcÀIÿaÇJÿ_ÌLÿ]ÓMü\ÞNùZäOõYêPñXïQíWôQéWùPéWùPéWùPéWùPéWùPéWùPéWùPéWùPÿgÿc*ÿe0ÿn3 ÿt:ÿwCÿyNÿzZ$ÿwh+ÿtv3ÿq„9ÿn?ÿl›Cÿj¥Gÿh­Jÿg¶Lÿe¾NÿcÅPÿaËRý_ÒTù]ÝUô[äVðZêWëXðXçXõWãYúTãYúTãYúTãYúTãYúTãYúTãYúTãYúTÿhÿc)ÿh.ÿq2 ÿw8ÿ{Bÿ}Lÿ~X$ÿ{f-ÿws5ÿt€<ÿqŒBÿo—Gÿl¡KÿjªOÿh²Rÿg»TÿeÄVþbÊXù`ÑZõ^Ü\ð\ä]êZë^æYñ_âZõ[Ü[ùWÜ[ùWÜ[ùWÜ[ùWÜ[ùWÜ[ùWÜ[ùWÜ[ùWÿiÿd)ÿk-ÿt0 ÿ{7ÿAÿJÿ‚U%ÿc.ÿ{p6ÿx|>ÿu‰Eÿq”KÿožPÿl¦Tÿj®Xýh·[üfÀ]údÉ`õaÐbð^Ücê\åeå[ìfÞZðcØ[ô`Ñ]ø[˜K3²Ñ]ø[Ñ]ø[Ñ]ø[Ñ]ø[Ñ]ø[Ñ]ø[Ñ]ø[ÿiÿe(ÿn+ÿx. ÿ6ÿƒ?ÿ…Hÿ‡S%ÿ„`/ÿ€l8ÿ|yAÿx…IþtPûq™Vùn¢Zøkª_öh²bôf»eódÅhðbÐkê_Ýmã]çnÛ[êmÓ\ïhÍ^ódÈ_÷_È_÷_È_÷_È_÷_È_÷_È_÷_È_÷_È_÷_ÿjÿf(ÿq)ÿ{, ÿƒ5 ÿ‡>ÿŠGÿŒP%ÿ‰]/ÿ…i:ýuDú|€M÷x‹Uôs•\ñobïl¥gíi­këf¶oècÀræaÌuã`ßwÖ\äxÎ^érÉ_ímÄ`ðh¿bôc¿bôc¿bôc¿bôc¿bôc¿bôc¿bôc¿bôcÿkÿg'ÿt'ÿ+ÿ‡3 ÿŒ<ÿEÿ‘N%ÿZ0ü‹f;ø†qFó|Qï|‡Zìvbèq˜iål páh¨uÞd°zÛbº~ØaÇÔaÚË_á~Äaåw¿bér»cím¶dñg¶dñg¶dñg¶dñg¶dñg¶dñg¶dñg¶dñgÿlÿj&ÿw&ÿ‚*ÿŠ2 ÿ;ÿ“Cÿ–L$ý•W0÷‘b<òŒmIì†xTç_âxŠiÜr’rÖmšxÒj¢|Îg«Ëf´Ée¿ƒÇd΄Ác݃ºdâ|¶fæv²gêq®hïj®hïj®hïj®hïj®hïj®hïj®hïj®hïjÿmÿl$ÿz$ÿ…)ÿŽ1 ÿ”9ÿ˜Bÿ›J$ø›T0ò—_=ë’jKåŠsXÞ‚|dÕ|…nÏvuÊr•zÆn~Ãl¥‚¿j¯„½i¹†ºhLJ·hÚ‡±hÞ­iãz©kèt¦kìm¦lím¦lím¦lím¦lím¦lím¦lím¦límÿmÿn#ÿ}"ÿˆ(ÿ‘0 ÿ˜8ÿœ@ûŸI#ô¡R/í\=å–fLÝŽoZÓ‡xeÌnÆ{‰vÁw‘{¼s™€¸p¡„µnª‡²m´‰¯lÁŠ­lÒŠ¨lÜ…¥má~¢nåwŸoëpŸoëpŸoëpŸoëpŸoëpŸoëpŸoëpŸoëpÿnÿq"ÿ!ÿ‹'ÿ”/ ÿ›7ÿ ?ø¤G!ð§O.è¢Z=ß›cMÔ”lZËŒueĆ}o¾€…v¸||³x•¯u…«r¥‰¨q¯‹¥p»Œ£pË qÙˆqß›räz™sér™sér™sér™sér™sér™sér™sér™sérÿoÿs ÿ‚ ÿŽ&ÿ—.ÿŸ6ý¤>ô¨F ì¬M-ã§X<Ù aL͘jYÅ‘re½‹zn¶…‚v°€‰}«}‘‚§y™†£w¢ŠŸu«œt·ŽštƘuÖ‹–v݃”vâ|“vçt’vèt’vèt’vèt’vèt’vèt’vèt’vètÿoÿuÿ„ÿ%ÿš-ÿ¢5 ú¨=ñ¬Eè°L+ß«W;Ò¤_KÈœhY¿•od·wn°Švª…†}¤Ž‚Ÿ~–‡›{ž‹—y¨Ž”x³’x‘zÕzÛ…Žzá~zævzævzævzævzævzævzævzævÿpÿvÿ†ÿ“%ÿ,ÿ¥4 ÷«<î±Cå´K)Ú¯U:ͨ^J fX¹šmd±“unªŽ|v£Šƒ}ž†‹‚™‚“‡”€›‹~¥Ž}°Š}¾‘ŠÓ‰~Ú‡ˆ~߇~åw‡~åw‡~åw‡~åw‡~åw‡~åw‡~åw‡~åwÿpÿxÿˆÿ•$ÿ +ÿ¨2 ô¯:ëµBá¸J'Ô³S9È«\I¾¤dW´žkc¬˜rm¤“yužŽ|˜‹ˆ‚’‡‡…™‹‰ƒ¢Ž†‚®‘ƒ‚¼‘‚ƒÎ‘ƒƒÙˆ‚‚ß‚‚äy‚‚äx‚‚äx‚‚äx‚‚äx‚‚äx‚‚äx‚‚äxÿqÿzÿŠÿ—#ÿ¢)ü¬1 ñ³9èº@ݼH%϶R8ï[H¹¨bV¯¢jb§œplŸ—wu˜“~|’†‚ŒŽ‡‡Š—‹ƒˆ Ž‡«‘|‡¹‘{‡Ë‘|ˆØ‰}‡Þ‚}†äz}†äy}†äy}†äy}†äy}†äy}†äy}†äyÿqÿ|ÿÿš"ÿ¥(ù¯/î¸7 ä¿?ØÀF$ʺP7¿³YG´¬aUª¦ha¡¡nk™œut’˜|{Œ•ƒ†’‹†”‹|ŽžŽx©vŒ¶‘tÈ‘vŽØŠwŒÝ‚wŠãzwŠãzwŠãzwŠãzwŠãzwŠãzwŠãzwŠãzÿrÿÿÿ ÿ©&ö³-ê½5 àÆ<ÒÄD#ŽO5º·XF¯±_T¥«f`œ¦mj”¢ssŒžzz†›€€˜‰…z–’‰u”›r“¦o“´m”Åp•ØŠp’݃qã{qã{qã{qã{qã{qã{qã{qã{ÿsÿ‚ÿ’ÿ ÿ­$ò¸*æÃ1ÛÌ5ÌÈB!ÀÂM4´¼VD©¶^RŸ±d^–¬khŽ©qq†¥xx¢~y ‡ƒtˆoœ™‹k›¤h›²Žg›ÂŽiØŠj™Ý‚k–ã{k–ã{k–ã{k–ã{k–ã{k–ã{k–ã{k–ã{ÿtÿ…ÿ–ÿ¤û² í¿%áÌ*ÔÑ2 ÇÌAºÇL1®ÁTB£¼\P™·b\³if‡°on€­vuyª}{s¨„€m¦…h¥—ˆe¤£Šb¤°‹`¤Á‹b¦Ùˆc¢Þežãzežãzežãzežãzežãzežãzežãzežãzÿvÿ‰ÿšÿ©ö¸çÇÛÙÍÖ0 ÀÒ?´ÍJ/¨ÈR?ÃZM’¿aX‰»gb€¸mky¶tqr³{wl±ƒ|g°Œ€b¯–ƒ^®¡†\®¯‡Z¯¿‡[°Ú„]¬à^§åx^§åx^§åx^§åx^§åx^§åx^§åx^§åxÿzÿŽÿŸÿ°ïÀÙÔ ÎßÄÝ/ ¹Ù=­ÓH,¡ÏP;•ËXI‹Ç_T‚Äe^yÂlfrÀrlk¾zrf½‚va»‹z\»•}Yº¡Wº¯€U»¿€U¼ÙV¸ãzX²çuX²çtX²çtX²çtX²çtX²çtX²çtX²çtÿ€ÿ”ÿ¦ã¸ ÒÆ Ì× Ãã¹â1 ¯à=¤ÝF'™ÙN7ÔVDƒÑ]OzÏdXrÍj_kËreeÊyj`É‚o[É‹rWÈ–uTÈ¢wRȯxQÉÀxPÊÛwQÆèsRÀëoR¿ìoR¿ìoR¿ìoR¿ìoR¿ìoR¿ìoR¿ìoÿ‡ÿ› ß®мÇÉÁÛ ·è ­ç1 ¤æ=™äD&ŽâL3„àT>{Þ\GsÝcOkÜjVeÚr\`Úz`[ÙƒdWÙŒgSÙ—jPÙ£lNÙ±mMÚÂmLÛÜlMØìjNÏðgNÏðgNÏðgNÏðgNÏðgNÏðgNÏðgNÏðgÿ é¤Ñ´Å¿¼Í´éªî"¢î3—í;ìB$ƒëI.{êS6sé\>lédDgélIbètM^è|QZè…TVèŽVSé˜YQé£ZNé°\Mê¾\LëÒ]Kêé]Jãó\Jãó\Jãó\Jãó\Jãó\Jãó\Jãó\Jãó\ù™Ô¬Å·¹Ã°Ò§öžõ$•õ2Šõ:õA xõH'põP.jôZ4eôc8`ôk<]õt?Yõ|BWõ„DTõFQö—HOö¡JMö¬KK÷¹LJ÷ÈMIøàMH÷óMH÷ôMH÷ôMH÷ôMH÷ôMH÷ôMH÷ôMH÷ôMڣDZ¸»­É£Ùšý’ý'‡þ/ }þ7tÿ?lÿG fÿN%`ÿW)\ÿ`-Yÿi0Vÿq2Sÿx4Qÿ€6Oÿ‰7Mÿ’9Kÿœ:Iÿ¦;Hÿ±Dÿç>Dÿç>Dÿç>Dÿç>Dÿç>Dÿç>Dÿç>ˬ¹¶¬Â Ð•åŽÿ„ÿ$zÿ, pÿ4hÿ<aÿD[ÿKVÿS Sÿ["Pÿc$Mÿk&Kÿs'Iÿz)Hÿ‚*FÿŠ+Dÿ”,Bÿž-Aÿ§.@ÿ±.?ÿ¼/>ÿÍ0>ÿÍ0>ÿÍ0>ÿÍ0>ÿÍ0>ÿÍ0>ÿÍ0>ÿÍ0»±¬¼ŸÉ“Ù‰ü €ÿvÿ lÿ( dÿ0 ]ÿ8Wÿ@QÿGMÿNJÿVGÿ\DÿcBÿi@ÿp?ÿx=ÿ€;ÿˆ :ÿ‘!8ÿ›"7ÿ¤"6ÿ­#5ÿ¸#5ÿ¹#5ÿ¹#5ÿ¹#5ÿ¹#5ÿ¹#5ÿ¹#5ÿ¹#­¶ŸÄ’Ò„á}ÿ rÿhÿ_ÿ#Xÿ+ Qÿ3 Lÿ: GÿACÿH@ÿN=ÿT;ÿZ9ÿ_7ÿe5ÿk3ÿr1ÿz/ÿ‚.ÿ‹,ÿ“+ÿœ*ÿ§*ÿ§*ÿ§*ÿ§*ÿ§*ÿ§*ÿ§*ÿ§¡¿’Ì„Üx÷nÿ cÿZÿRÿKÿ$Fÿ,Aÿ3 <ÿ: 9ÿ@ 5ÿE 2ÿJ 0ÿP .ÿT,ÿY*ÿ^(ÿd&ÿj%ÿq#ÿx"ÿ€ ÿˆÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿ\"ÿW-ÿX3ÿ_6 ÿc= ÿeFÿfPÿe^ÿdn"ÿa|'ÿ_Š+ÿ^–.ÿ\¡1ÿ[ª3ÿZ²5ÿYº6ÿXÃ7ÿXÍ9ÿWØ9ÿVà:ÿUæ;ÿTì<ÿSñ<üRõ=øRù=õQý=óQÿ=óQÿ=óQÿ=óQÿ=óQÿ=óQÿ=óQÿ=ÿ\"ÿW,ÿZ2ÿa5 ÿe< ÿgEÿhOÿh\ÿfm"ÿc{(ÿaˆ,ÿ_”/ÿ^Ÿ2ÿ]©5ÿ[±7ÿZ¹8ÿZÁ:ÿYË;ÿXÕ<ÿWß=ÿVæ>ÿUë>ýTð?ùSõ?öRù@óRý@ðRÿ>ðRÿ>ðRÿ>ðRÿ>ðRÿ>ðRÿ>ðRÿ>ÿ]!ÿX,ÿ\0ÿd3 ÿh: ÿkCÿlNÿlZÿjj$ÿgx)ÿd….ÿb‘2ÿaœ6ÿ_¦8ÿ^®:ÿ]¶<ÿ\¾>ÿ[È?ÿZÒAÿYÝBÿWåCýVêDùUðDõTõEºHËÓxÞ y z1 {h |’ }2 ~2 2 €" 2 ‚f ƒ  „ …2 †2 ‡, ˆ3 ‰( Šp ‹1 Œ# ; Žo p!p"p#p$p%p&p'p( p) p* p+ p, p-p.p/p0p1p2p3p4p5p6p7p8p9p:p;p<p=p>p? p@!pA"pB#pC$pD%pE&pF'pG(pH)pI*pJ+pK,pL-pM.pN/pO0pP1pQ2pR3pS4pT5pU6pV7pW8pX9pY:pZ;p[<p\=p]>p^?p_@p`ApaBpbCpcDpdEpeFpfGpgHphIpiJpjKpkLplMpmNpnOpoPppQpqRprSpsTptUpuVpvWpwXpxYpyZpz[p{\p|]p}^p~_p`p€apbp‚cpƒdp„ep…fp†gp‡hpˆip‰jpŒkplpŽmpnpop‘pp’qp“rp”sp•tp–up—vp˜wp™xpšyp›zpœ{p|pž}pŸ~p p¡€p¢p£‚p¤ƒp¥„p¦…p§†p¨‡p©ˆpª‰p«Šp¬‹p­Œp®<¯g ‘T °’] “À • –&—(˜‚™†šr›Sœ.Sžê ŸN  & ¡A ¢x £.¤.¥.¦@§@¨@©hª+«"¬!­2®[°D±D²D³D´DµD ¶D ·D ¸D ¹D ºD»D¼‘€p³€p´€pµ€8 Ò=„ w ÿÿÿÿÿÿÿÿ “"8ñTúEîTþDìTÿBìTÿBìTÿBìTÿBìTÿBìTÿBìTÿBÿ^!ÿY,ÿ_.ÿf2 ÿl8 ÿoAÿoLÿqWÿng%ÿku+ÿh‚0ÿeŽ5ÿd™9ÿb£<ÿ`«>ÿ_³Aÿ^»Bÿ]ÄDÿ\ÎFÿZÜGþYäHúWêIõVðJðUöJíUúJéVþGçVÿEçVÿEçVÿEçVÿEçVÿEçVÿEçVÿEÿ^!ÿY+ÿb-ÿj0ÿo6 ÿr@ÿtJÿuUÿrd&ÿor-ÿl3ÿi‹8ÿf–<ÿe @ÿc¨Cÿa°Fÿ`¸Hÿ^ÁJÿ]ËKÿ\ÚMúZãNõYêOðWñPëVöQçWûNäXÿKáYÿIáYÿIáYÿIáYÿIáYÿIáYÿIáYÿIÿ_ ÿZ+ÿe+ÿm.ÿs5 ÿw>ÿxHÿyRÿw`'ÿtn.ÿp{5ÿm‡;ÿj’Aÿg›Eÿe¤Iþc¬Lýa´Nû`¼Qú^ÆSù]ÔUõ[ãVïZêXéXòYåY÷VàZûSÛ[ÿO×[ÿM×[ÿM×[ÿM×[ÿM×[ÿM×[ÿM×[ÿMÿ` ÿ])ÿh)ÿq+ÿx3 ÿ|<ÿ}Fÿ~Pÿ}](ÿyj0ÿuv8ÿq‚?ümEúj—KøgŸOöe§Sôb¯Vó`¸Yñ_Á\ð]Í^í\à`èZìaáZò`Ú[ö[Ó\úWÏ]ýSÌ^ÿQÌ^ÿQÌ^ÿQÌ^ÿQÌ^ÿQÌ^ÿQÌ^ÿQÿaÿ`'ÿk&ÿu)ÿ|1 ÿ:ÿƒDÿ„MÿƒY(ÿf2üzr;øu~CõqˆKòm’QïišVíf¢[êcª_è`²cæ^¼fä\Èiá[ÚkÝZêkÓ\ðfÍ^õaÈ_ù\Ä`üXÁaþUÁaþUÁaþUÁaþUÁaþUÁaþUÁaþUÿbÿc%ÿo$ÿy(ÿ0 ÿ…9ÿˆBÿ‰Kÿ‰V(ú…b3õ€n=ðzyGìuƒPépŒXåk•^áfdÞc¤iÛ`­m×_·oÔ^ÃpÑ^ÒqÍ]çqÇ_îkÂaòf¾böaºcù\·cüX·cüX·cüX·cüX·cüX·cüX·cüXÿcÿf#ÿr"ÿ}'ÿ…. ÿŠ7ÿ@ÿIúS(ôŒ_4î†j?étKãx~UÞr†^ØmeÓj˜jÏg mÌe¨pÉc±sÆb¼tÄaÉuÁaàv¼cêq·dïj´eóe°fö`®gù\®gù\®gù\®gù\®gù\®gù\®gù\ÿcÿh!ÿu ÿ%ÿ‰-ÿ5 ÿ’>ü”Gõ–O(î‘[4ç‹fAà„oNÙ}yXÑw‚`ÌsŠgÇo“lÄl›pÀi£s½g¬vºf¶x¸eÂy¶eÕy²fæv®hìoªiði¨iôc¦j÷_¦j÷_¦j÷_¦j÷_¦j÷_¦j÷_¦j÷_ÿdÿk ÿxÿ„$ÿ,ÿ“4 ÿ—<ø™Eð›M'è—Y4ábB׉lN΃uXÈ}~aÃx†h¾tŽm¹p–r¶nžu²l§x¯j±{­i½|ªiÍ}¨jãz¥lér¢líl mòfžnõbžnõbžnõbžnõbžnõbžnõbžnõbÿeÿmÿ{ÿ‡#ÿ*ÿ—2 ýœ;ôŸCì¡K%ãœV3Ú–`AÏŽiNLjrXÀ‚zaº}‚hµyŠn±u’s¬ršw©p£z¦n¬}£m¸~¡mÇŸnà~œpçušpëo™qðh—qód—qód—qód—qód—qód—qód—qódÿeÿoÿ~ÿŠ"ÿ“)ÿ›1 ù 9ð£Aç¦I#Þ¡T1Òš^@È“gMÀŒoX¹‡wa³‚h®}‡n©zŽs¤w–x tŸ{s¨~šq´€˜q–rØ•tåx“têq’uïk‘uòf‘uòf‘uòf‘uòf‘uòf‘uòf‘uòfÿfÿqÿ€ÿŒ!ÿ–(ÿž/ö¤7 ì¨?ã«H ئR0Ìž\@×eM»‘mW³‹ta­†|h§‚ƒn¢~‹t{“x™yœ|•w¥’v°u¾‚ŽvÑ‚ŽxãzxèsŒxíl‹xñh‹xñh‹xñh‹xñh‹xñh‹xñh‹xñhÿgÿsÿ‚ÿ ÿ™&þ¢.ó¨5 é­=߯FÒ©Q/Ç¢Z?¾›cLµ•jW®r`§‹yh¡‡nœƒˆt—€x’}™|Ž|¢€‹z­‚ˆz»ƒ‡z̓‡|â|‡|çu†|ìn†|ði†|ði†|ði†|ði†|ði†|ði†|ðiÿgÿuÿ…ÿ’ÿœ%û¥,ð¬4 æ²;Û³DÍ­O.æY>¹ŸaK°™hV¨”p_¡wg›‹~n–ˆ†s…ŽxŒ‚–|ˆ€ €„«‚¸ƒÊ„á}æv€ëo€€ïj€€ïj€€ïj€€ïj€€ïj€€ïj€€ïjÿhÿxÿ‡ÿ”ÿŸ#ø©*ì±1â·9 Õ·BɰN-¾ªW=´£_J«žgU£˜n_œ”uf–|mƒs‹Š‹x†ˆ”|†ž€}„¨‚{„µ„y„Ç„z†à{…æw{…ëp{„îk{„îk{„îk{„îk{„îk{„îk{„îkÿiÿzÿŠÿ—ÿ£!ô­'èµ.Þ½5 к@Ä´L,º®V;¯¨^I¦¢eTžl]—™sf•ylŠ’r…‰w’|{‹›wЦ‚t‰³ƒrŠÄƒtŒàt‹åxu‰êqvˆílvˆílvˆílvˆílvˆílvˆílvˆílÿkÿ}ÿÿšÿ¦ð±#ä»)ÙÂ0 ˽?À¸J*µ²T:ª¬\G¡§cR™£j\‘ŸqdŠ›wk„˜q~–†vy“{t’™~p¤m±‚kÁ‚m’Ýn‘åxoêqpŽílpŽílpŽílpŽílpŽílpŽílpŽílÿnÿ€ÿÿžû«ì·àÃ!ÒÆ-ÆÁ=º¼I(¯·R8¥²ZEœ­aQ“©hZ‹¥ob„¢ui~Ÿ|ox„ts›yn™–|j˜¢g—®€e˜¿e™Øh˜åxi–êqj”ílj”ílj”ílj”ílj”ílj”ílj”ílÿqÿƒÿ”ÿ¢õ°æ¾ÙÌÌÊ+ÀÆ;µÁG&ª¼Q6Ÿ¸XC–³`N°fX…¬m`~ªsgw§zlr¥‚rl£‹vh¢”yd¡ |` ­}_¡½~^¢Ô}a¡ævbëpc›îlc›îlc›îlc›îlc›îlc›îlc›îlÿtÿ‡ÿ˜þ§ç· ÖÅ ÐÐÅÏ(¹Ë9®ÇE#£ÃO3™¿W@»^K†¸dT~µk\w²qcq°xik®€mf­‰ra«“u]«žx[ª¬yY«¼yX¬ÒyZ«ès\§ìn]¤ïj]¤ïj]¤ïj]¤ïj]¤ïj]¤ïj]¤ïjÿyÿŒÿž ܮһ ÌÈ ÇÖ½Õ%²Ò6§ÎB œÊL/’ÇT<ˆÃ\GÁbPw¾iWp¼p^j»wce¹h`¸ˆl\·’oX¶žqU¶«sS·»sR·ÒsT·ëoV²ïjW¯ñgW¯ñgW¯ñgW¯ñgW¯ñgW¯ñgW¯ñgÿÿ“ á¥Ò³ɾÂ˼ݴÝ#ªÚ3 ŸÖ@”ÓJ*ŠÐR7€ÍZAxËaJpÉhQjÈoWdÆv\_Å`ZňdVÄ’gSÄžiPĬjOļkNÅÓjOÅíhPÀódQ½õaQ½õaQ½õaQ½õaQ½õaQ½õaQ½õaÿ† ðšÔªȶ¾Á·Ï °ã¨ã%Ÿâ5 •à>‹ÞH%ÜP0xÚX:pØ_BiÖgIcÕnO^ÔvSYÓWUÓ‰ZRÓ“]OÓ _MÓ­`KÔ¾`JÕØ`KÔí^LÑ÷\LÌùZLÌùZLÌùZLÌùZLÌùZLÌùZLÌùZÿڢʯ½¹´Æ«Ô ¤êœé(“é4‰è=çD"wæN*oæW2iå_8cåg=_äoBZäwEVä€ISäŠKPä”NMäŸPKå¬QIå»RHæÏRHæèRHäøQHáüOHáüOHáüOHáüOHáüOHáüOHáüOá™Í©¾³³¾¨ËŸÚ ˜òò*†ò3|ñ;tñClñK#fñT)añ]-]ñf1Yñn5Vñv7Sñ:PòˆKò@Ió©AGó¶BFôÇCEôßCDôðCDòúBDòúBDòúBDòúBDòúBDòúBDòúBÑ¢À®²¸§ÄœÒ’í Œû‚û(yû1 pü9iüAbüI\üP WüY#Týb&Qýj(Oýs*Lþ{,Jþƒ.Hþ/Fÿ˜1Dÿ¢2Cÿ®3Aÿ»4@ÿË4?ÿã4?ÿï5?ÿï5?ÿï5?ÿï5?ÿï5?ÿï5?ÿï5γ³§¿šËÚ†ÿ~ÿuÿ%lÿ- dÿ6]ÿ>XÿERÿMOÿULÿ\IÿdGÿkDÿs Bÿ|"Aÿ…#?ÿ$=ÿš%;ÿ¤&:ÿ¯&9ÿº'8ÿÊ'8ÿÜ(8ÿÜ(8ÿÜ(8ÿÜ(8ÿÜ(8ÿÜ(8ÿÜ(µ¯§ºšÆÔæzÿpÿgÿ!_ÿ)Xÿ1 Rÿ9 MÿAIÿHEÿOBÿU@ÿ\=ÿb;ÿi9ÿp7ÿy5ÿ‚3ÿŒ2ÿ—0ÿ¡/ÿª/ÿµ.ÿ¿.ÿ¿.ÿ¿.ÿ¿.ÿ¿.ÿ¿.ÿ¿©µšÂŒÏÞvÿlÿbÿZÿSÿ$Mÿ+Gÿ3 Cÿ: ?ÿA ;ÿG 8ÿM 5ÿS3ÿX1ÿ^/ÿd-ÿk+ÿs)ÿ|'ÿ†%ÿ$ÿ™#ÿ£"ÿ«"ÿ«"ÿ«"ÿ«"ÿ«"ÿ«"ÿ«œ¾Ë~Úpægÿ]ÿ TÿMÿGÿAÿ$<ÿ+7ÿ24ÿ80ÿ=-ÿC*ÿH (ÿM &ÿR $ÿW "ÿ] ÿc ÿk ç׃ÿs ÿ| ÿ„ ÿŽ ÿ• ÿ• ÿ• ÿ• ÿ• ÿ• ÿ• ÿR%ÿM/ÿQ2ÿW5ÿZ< ÿ[EÿZOÿY]ÿXmÿV{ÿU‰"ÿS•%ÿR 'ÿQ¨)ÿP±*ÿP¸+ÿOÁ,ÿOÊ-ÿNÖ.ÿNä.ÿNí/ÿNó/ÿMø0ÿMü0ÿLÿ0üLÿ0ùLÿ/øLÿ/øLÿ/øLÿ/øLÿ/øLÿ/øLÿ/ÿS$ÿM/ÿT0ÿY4ÿ]: ÿ_Cÿ^Nÿ]Zÿ[jÿZy!ÿX†$ÿV’'ÿU)ÿT¦+ÿS®-ÿR¶.ÿR¾/ÿQÇ0ÿQÒ1ÿPá2ÿPë2ÿOò3ÿO÷3ÿNü4ûNÿ4øMÿ4õNÿ2ôNÿ2ôNÿ2ôNÿ2ôNÿ2ôNÿ2ôNÿ2ÿS$ÿN.ÿV/ÿ\2ÿ`8 ÿbAÿbLÿ`Xÿ_hÿ]v"ÿ[ƒ&ÿY)ÿXš,ÿV£.ÿU¬0ÿU³1ÿT»3ÿSÄ4ÿSÎ5ÿRÞ6ÿRé7ÿQñ7ÿQö8ûPû8÷Oÿ8ôOÿ7ñPÿ5ðPÿ4ðPÿ4ðPÿ4ðPÿ4ðPÿ4ðPÿ4ÿT#ÿP-ÿY-ÿ_0ÿc6 ÿf@ÿfJÿeUÿceÿas#ÿ^€(ÿ\Œ,ÿ[—/ÿY¡1ÿX©4ÿW°5ÿV¸7ÿUÁ8ÿUË9ÿTÚ:ÿTç;ÿSð<ûRö=öQû=òQÿ=ïRÿ;ìRÿ8ëRÿ8ëRÿ8ëRÿ8ëRÿ8ëRÿ8ëRÿ8ÿU#ÿR+ÿ\+ÿc.ÿg4 ÿj>ÿkHÿjSÿhaÿfp%ÿc}*ÿ`ˆ/ÿ^“3ÿ\6ÿ[¥8ÿZ­:ÿXµ<ÿW½>ÿWÇ?ÿVÓAüUäBùUîCõTöDðSüDìTÿAéUÿ?æUÿ<åUÿ;åUÿ;åUÿ;åUÿ;åUÿ;åUÿ;ÿV"ÿU)ÿ_(ÿg+ÿl2 ÿo< ÿpFÿpPÿn] ÿkk'ÿhy-ÿe„2ÿb7ÿ`™;þ^¡>ý\©Aû[±CúY¹EùXÂG÷WÎHõVàJñVìKîUöLéVüJåWÿFâXÿCÞYÿ@ÝYÿ?ÝYÿ?ÝYÿ?ÝYÿ?ÝYÿ?ÝYÿ?ÿW"ÿY'ÿc&ÿk(ÿq0ÿt9 ÿuCÿuMÿuY!ÿqg)ÿmt0ýj€6úfŠ<øc”@öaœDô^¤Hò\¬Kñ[´MïY½PíXÉRëWÚSçVéUäWõTáYýOÛZÿKÕ[ÿHÐ\ÿDÏ\ÿDÏ\ÿDÏ\ÿDÏ\ÿDÏ\ÿDÏ\ÿDÿX"ÿ\$ÿf#ÿo&ÿv.ÿz7 ÿ{Aÿ{Kÿ{U!þwc*ùso2ön{:òj…AïfGìc—Lê`ŸPè]§Tå[¯WãY¸ZáWÃ]ßWÒ^ÚVæ^ÖYóZÒ\üUÍ^ÿPÉ^ÿLÅ_ÿIÄ_ÿHÄ_ÿHÄ_ÿHÄ_ÿHÄ_ÿHÄ_ÿHÿY!ÿ_"ÿj!ÿt$ÿ{,ÿ5 ÿ>ÿ‚Hý‚R!÷~_+òyk5ísu>én€Fåi‰Máe‘TÞa™YÚ_¢\Ö]ª_Ó\³aÐ[¾bÎ[ÌcËZâcÈ\ñ`Æ_úZÁ`þU½aÿQºbÿM¹bÿK¹bÿK¹bÿK¹bÿK¹bÿK¹bÿKÿY!ÿb ÿnÿx#ÿ+ÿ„3 ÿ‡<þˆE÷ˆN!ð„[+ê~f6äxpAßrzKÙmƒRÓiŒXÏf•\Ìd_Éb¥bÆ`®dÃ_¸fÁ^Äg¿^Øh¼_ëfºc÷_¶dûY³eþU°eÿP¯eÿO¯eÿO¯eÿO¯eÿO¯eÿO¯eÿOÿZ ÿeÿqÿ|"ÿ„)ÿ‰1 ÿŒ:ùŽCñŽL êŠX+ã„b7Û~lCÓxvLÍsSÈo‡YÄk^Ài˜b½f eºe¨h·c²jµb¾k³bÎl°båk¯fôd¬gø]©hüX§iÿS¦iÿR¦iÿR¦iÿR¦iÿR¦iÿR¦iÿRÿ[ ÿgÿtÿ ÿˆ'ÿŽ/ý’7 ô”@ì•IäU*ÛŠ_7Ñ„iCÊ}rLÄx{T¿tƒZºq‹_¶n“d³k›g¯i¤j­g­lªf¸n¨fÇo¥fßo¥jñh¢köa lù[žlýVžlþUžlþUžlþUžlþUžlþUžlþUÿ\ÿjÿwÿƒÿŒ%ÿ’-ù—5 ï™>ç›FÞ–R)Ò\7ʉfBÃoL¼~wT·y[²u‡`®reªp—h¦mŸl£l©n k´pžjÂqœj×qœnîkšoód™oø^—püX—pýW—pýW—pýW—pýW—pýW—pýWÿ^ÿlÿzÿ†ÿ#ÿ–+õ›3 ëŸ;â E×›P(Ì”Z6ÄcB¼ˆlLµ‚tT°~|[«z„`¦w‹e¢t“ižrœm›p¥p˜o°r•n½s“oÐs”rën“sòf’sö`súZsûYsûYsûYsûYsûYsûYÿ_ÿnÿ}ÿ‰ÿ’"ýš)ñ 0ç¤9 Þ¥CÑŸN'ǘX5¾’aA¶ŒiK¯‡qT©‚y[¤€`Ÿ|ˆe›yj—v™m“u¢qs¬ssºt‹sËuŒvçpŒwðh‹wõbŠwù\ŠwúZŠwúZŠwúZŠwúZŠwúZŠwúZÿaÿqÿÿ‹ÿ• ùž&í¤.ã©6 Ø©@Ì£L&œV4¹–_@±gJª‹oS¤‡vZžƒ~`™€…e”}j{–nŒyŸq‰xªt†w¶u„wÇv…zär†{ïj…{ôd…{ø]…{ù\…{ù\…{ù\…{ù\…{ù\…{ù\ÿcÿsÿÿŽÿ™ö¡#ê©*à¯2Ò¬>ǦK$½ U3´š^?¬•eJ¥mRžŒtY˜ˆ{`“…ƒeŽ‚‹jŠ€“n†~q‚}§t|´v}|Åv}~àsîkóe~÷^~ø]~ø]~ø]~ø]~ø]~ø]ÿeÿuÿ„ÿ‘ÿœò¥ æ®&Û´.ί=êI#¹¤S1¯ž\>§™dI ”kQ™rY“y_ŽŠ€d‰‡ˆi„…‘n€ƒšq|‚¥ty²vwÂvv‚Ýty„ílyƒòfz‚÷_z‚ø^z‚ø^z‚ø^z‚ø^z‚ø^z‚ø^ÿgÿwÿ‡ÿ”þŸîªâ³!Õ·*ɳ;¾®H"´¨R0«£Z=¢žbG›™iP”•pXŽ’w^ˆ~dƒ†i~‹my‰˜qv‡£sr†¯up†¿vo‡×us‰ímsˆòft‡ö`t‡÷_t‡÷_t‡÷_t‡÷_t‡÷_t‡÷_ÿiÿzÿŠÿ—ù£ê®ݹϺ(Ä·9¹²F ¯¬P/¦§X;£`F•ŸgOŽ›nVˆ˜u]‚•|c}“„hx‘Œls–poŽ rl­tj½uiÒulímmŽñgnŒö`nŒ÷_nŒ÷_nŒ÷_nŒ÷_nŒ÷_nŒ÷_ÿlÿ}ÿÿ›ô¨åµ Õ¿ʾ&¿»7´¶Dª±N-¡­W9˜©^D¥eM‰¢lU‚Ÿs[|œzawšfr˜Šjm–”ni•žqf”«sc”ºsb•Ïsf—ìlg•ñfh“ö`h’÷_h’÷_h’÷_h’÷_h’÷_h’÷_ÿoÿÿ‘ò  Ú­ Ó¸ ÎÃÄÂ#¹¿5¯»B¤·L*›³U7’¯\AЬcJƒ©jR|¦qYv¤x^p¢ck ˆggž‘kcn_©p]¹p\Íp_Ÿëkaòebšö`b™÷^b™÷^b™÷^b™÷^b™÷^b™÷^ÿsÿ… ú– Û¥ѱË»ÆÇ ½Ç ²Å2 ¨Á@ž¾J'”ºS4‹¶Z>ƒ´aG|±hOu¯oUo­vZj«}_e©†ca¨g]§›jY§¨kW§¸lV§ÌlX¨éhZ§ôc[£ø^\£ù]\£ù]\£ù]\£ù]\£ù]\£ù]ÿx ÿ‹ ߜҩɴ¾¼ÌµÍ«Ë/ ¡È=—ÅH#ÂQ/„¿X:|¼_CuºfJo¸mPi·tUdµ|Z_´…^[³aW³šdT²§eR²·fQ³ÌfR³écT²÷_U®ú[V­ûZV­ûZV­ûZV­ûZV­ûZV­ûZÿ~ ò‘Ö¡Ê­À·¸Â²Ï «Ô£Ó+™Ð:ÎE…ËN*}ÉV4uÇ]=nÅeDhÄlIcÂsN^Á{SYÁ„VUÀYR¿›\O¿¨]M¿¸^LÀÍ^LÀê\N¿ùYO¼þUPºþUPºþUPºþUPºþUPºþUPºþUÿ…ݘͦÁ±·º®Æ§Ó  Ý™Ý(Û7†ÙB}ÖK$uÔT-mÒ\5gÑcü«*=ü¹+;ýË+;ýâ+:üô+:ü÷+:ü÷+:ü÷+:ü÷+:ü÷+:ü÷+½¨®°¡¼•ȉÔ~èwÿoÿgÿ&`ÿ/Yÿ7 Tÿ?OÿGKÿNGÿVDÿ]Bÿd@ÿl=ÿu;ÿ~0Ò¨}9ÿ‰7ÿ”6ÿ 5ÿ¬3ÿ¹3ÿÈ2ÿâ 2ÿç 2ÿç 2ÿç 2ÿç 2ÿç 2ÿç °­¢·•ćÐ{Ýrý jÿaÿZÿ"Tÿ*Nÿ2Iÿ: EÿA AÿH >ÿN;ÿU8ÿ[6ÿb4ÿi2ÿr/ÿ{-ÿ†+ÿ’*ÿž)ÿ©(ÿ³'ÿÂ'ÿÇ'ÿÇ'ÿÇ'ÿÇ'ÿÇ'ÿǤ´–À‡ÌzÚmëdÿ\ÿTÿMÿHÿ$Bÿ,>ÿ3:ÿ96ÿ@3ÿE0ÿK .ÿQ +ÿW )ÿ] 'ÿd $ÿl "ÿv ÿ€ ÿŒÿ—ÿ¡ÿ¬ÿ®ÿ®ÿ®ÿ®ÿ®ÿ®—¼ˆÉyÖkã_öVÿNÿ GÿAÿ<ÿ7ÿ$2ÿ*/ÿ0+ÿ6'ÿ;%ÿ@"ÿE ÿJÿPÿVÿ\ÿdÿmÿwÿ ÿ‹ ÿ• ÿ˜ ÿ˜ ÿ˜ ÿ˜ ÿ˜ ÿ˜ ÿI'ÿD1ÿK1ÿP4ÿR:ÿRC ÿQNÿO\ÿMkÿLyÿK‡ÿI“ÿHÿH¦ ÿG®!ÿGµ"ÿF½#ÿFÆ#ÿFÐ$ÿFà$ÿFê%ÿFó%ÿFú%ÿFÿ%ÿFÿ%ÿFÿ%ÿFÿ$ýFÿ#ýFÿ#ýFÿ#ýFÿ#ýFÿ#ýFÿ#ÿI'ÿF/ÿM/ÿR2ÿU9ÿUB ÿTMÿRYÿPhÿOwÿN„ÿL‘ÿK›!ÿJ¤"ÿJ¬#ÿI³$ÿI»%ÿHÄ&ÿHÍ&ÿHÝ'ÿHè'ÿHñ(ÿHù(ÿHÿ(ÿHÿ(þHÿ(ûHÿ'ùHÿ&ùHÿ&ùHÿ&ùHÿ&ùHÿ&ùHÿ&ÿJ'ÿH-ÿP-ÿU0ÿX6ÿY@ ÿXKÿUVÿTfÿRtÿQÿOŽ!ÿN˜#ÿM¡%ÿM©&ÿL±'ÿK¸(ÿKÁ)ÿKÊ*ÿJÙ*ÿJæ+ÿJð+ÿJø,ÿJÿ,ýJÿ,úJÿ+÷Jÿ)õJÿ(õJÿ(õJÿ(õJÿ(õJÿ(õJÿ(ÿK&ÿK+ÿR+ÿX.ÿ[4ÿ]> ÿ]IÿZTÿYbÿWqÿU~ ÿSŠ#ÿR•&ÿQž(ÿP¦*ÿO®+ÿNµ,ÿN½-ÿMÇ.ÿMÓ/ÿLã0ÿLí0üLö1úLþ1÷Lÿ1õMÿ/òMÿ-ðMÿ+ðMÿ+ðMÿ+ðMÿ+ðMÿ+ðMÿ+ÿK&ÿN)ÿV)ÿ\+ÿ`1ÿb; ÿbFÿ`Qÿ^_ÿ\mÿZz#ÿX†&ÿV‘)ÿUš,ÿS¢.ÿRª0ÿQ±1ÿQ¹3ÿPÃ4þOÎ5ûOß6øNë7õNõ8òNý8ðOÿ5îPÿ3ëQÿ1éQÿ/éQÿ/éQÿ/éQÿ/éQÿ/éQÿ/ÿL%ÿQ'ÿZ&ÿ`(ÿe/ÿh9 ÿhCÿgNÿeZÿbh ÿ_v%ÿ]*ÿZŒ.þX–1üWž4ûU¦6ùT­8øSµ:÷R¾;õQÉ=óQÚ>ðPè?ìPó@éQý>èSÿ;æTÿ8ãUÿ5áUÿ3áUÿ3áUÿ3áUÿ3áUÿ3áUÿ3ÿM$ÿT$ÿ]#ÿe%ÿj-ÿm6 ÿn@ÿmKÿkVÿhd!þeq(ûb}-ø_‡2ö\‘6óZ™:òX¡=ðW©@îU±BìT¹DëSÄFéRÒHåQåIâRòHßTüDÝVÿ@ÛXÿ=ÖYÿ:ÒYÿ8ÒYÿ8ÒYÿ8ÒYÿ8ÒYÿ8ÒYÿ8ÿN$ÿX!ÿa ÿj#ÿp+ÿs4 ÿt>ÿtHÿrRûo_#ökl*ògw1ïc‚7ì`‹=é]”AæZœEäX¤IâV¬LàT´NÝT¿PÛTÍP×SâQÒTðNÐWûJÎZÿEÍ\ÿBÉ\ÿ>Å\ÿ<Å\ÿ<Å\ÿ<Å\ÿ<Å\ÿ<Å\ÿ<ÿO#ÿ[ÿeÿn!ÿu)ÿy1ÿz; ÿzDúyNôv[#îqg,élr5åh|<ác…CÝ`ŽHÙ]—LÕ\ŸOÒZ§QÏY°SÍXºTËXÆUÉWÚVÅWìUÃ[ùOÂ^ÿJÀ_ÿF½`ÿBº`ÿ@º`ÿ@º`ÿ@º`ÿ@º`ÿ@º`ÿ@ÿR!ÿ^ÿiÿsÿz&ÿ~/ÿ8 ûAó€Kì|W#æwc-àqm8Úmw@Ói€FÏe‰KËc‘OÈ`™RÅ_¡UÂ]ªWÀ\³Y¾\¿Z¼[Î[¸[å[·^õU·bÿOµcÿJ²dÿF°dÿC°dÿC°dÿC°dÿC°dÿC°dÿCÿUÿaÿmÿwÿ~$ÿ„,þ‡5 õˆ>í‡HåƒT"Þ~_.Ôxi8Îss@Én|GÄk„LÀhŒQ½e”TºcœW·b¥Z´`®\²`¹^°_Ç^­_ß_¬bñY¬eþSªgÿN¨gÿJ¦gÿF¦gÿF¦gÿF¦gÿF¦gÿF¦gÿFÿWÿdÿpÿ{ÿƒ"ÿ‰*ùŒ2ïŽ; çŽDÞŠQ!Ô„\-Ì~f8ÅxoAÀtwH»p€M·mˆR³jV°h˜Y¬f \ªe©_§d´`¥cÂa£cÕb¢eí]¢iûW¡jÿQŸkÿLžkÿIžkÿIžkÿIžkÿIžkÿIžkÿIÿYÿgÿsÿ~ÿ‡ ÿ'ô’/ê”8 á”BÖN ̉Y-Ńc7¾}k@¸ytH³u|N®r„SªoŒW§m”[£kœ^ i¥`žh°c›g½d™gÎd˜ièašmùZ™nÿT—nÿO–nÿK–nÿK–nÿK–nÿK–nÿK–nÿKÿ[ÿiÿvÿÿŠü‘$ð—,åš4Üš?Ï”LÆŽW,¾ˆ`7·‚i@±~qH¬zyN§w€S£tˆXŸq\›o˜_˜m¡b•l¬d“l¹f‘kÉfmäd‘qö\‘rþVrÿQrÿMrÿMrÿMrÿMrÿMrÿMÿ]ÿkÿyÿ„ÿŽø•!ë›(á 0Õž=ʘJÁ’T+¹Œ^6±‡f?«‚nG¦~vN¡{}Sœx…X˜v\”t•_‘ržcŽq©e‹pµg‰pÅgˆpàfŠtô^‹vüXŠvÿR‰vÿN‰vÿN‰vÿN‰vÿN‰vÿN‰vÿNÿ_ÿnÿ{ÿ‡ÿ‘ô™ç #Ý¥+Ï¡;ÅœH¼–S*´\5¬‹d?¦‡lG ƒsM›€zS–}‚W’zŠ\Žx’`Švœc‡u¦f„t²h‚tÂh€tÛhƒxò`„zûY„yÿT„yÿO„yÿO„yÿO„yÿO„yÿO„yÿOÿaÿpÿ~ÿŠÿ”ðã¥ר(Ë¥9ÁŸF·šQ)¯•Z4§b>¡‹jF›‡qL•„xRWŒ‡\ˆ}`„{™c€z£f}y°h{y¿izyÖi||ða~~úZ~}þU~}ÿQ~}ÿQ~}ÿQ~}ÿQ~}ÿQ~}ÿQÿcÿrÿÿü˜ì¡ߪѬ&Ǩ7 ¼£D³žO'ª™X3£”`=œhE–ŒoL‰vR‹†}W†„…[‚‚Ž_~€—cz¡fw~­hu~½is~Òivîbx‚ú[x‚þVyÿQyÿQyÿQyÿQyÿQyÿQÿeÿuÿƒÿõ›è¦Ù¯̯$«5 ¸§C®¢N&¦V1ž™^;—•fD‘mK‹ŽtQ†Œ{V‰ƒ[|‡‹_x†•bt„Ÿeqƒ«hnƒºimƒÎio†ëcr‡ù\s†ýVs…ÿRs…ÿRs…ÿRs…ÿRs…ÿRs…ÿRÿhÿx ÿ† ö“ Þ  Ö© Ò² Dz"½¯3 ³«Aª§L$¡¢U0™ž]:’šdB‹—kI…”rP€’yU{Zv‰^rŒ’bnŠek‰©gh‰¸hg‰Ëhi‹éclù\mŒýWmŠÿRmŠÿRmŠÿRmŠÿRmŠÿRmŠÿRÿkÿ{ ÿŠ â˜Ö£Ь ˵ Á¶¸´1 ®°?¤¬J"œ¨S.”¤[8Œ b@†žiH€›pNz™wSu–~Xp”‡\l“`h’›cd‘§eb¶f`‘Éfb’çbe”ø\g’ýWg‘ÿRg‘ÿRg‘ÿRg‘ÿRg‘ÿRg‘ÿRÿnÿ ñŽÙ›ϦɯĹ»º²¸/¨µ=Ÿ±H –®Q+ŽªY5†§`>€¥gEz¢nKt uQož|Ujœ…Yf›Ž]bš™`^™¦b\™´cZ™Çc[šå`_›÷[`šþVa˜ÿRa˜ÿRa˜ÿRa˜ÿRa˜ÿRa˜ÿRÿr ÿƒß“ÑŸɪÁ²»½´¿«¾,¢»:™¸EµO(‡²W2€¯^:y­eBs«lHn©sMi§zQd¦ƒV_¤Y\£˜\X£¤^V£³_U£Æ_U¤ä]X¤öXZ£ÿT[¡ÿP[¡ÿP[¡ÿP[¡ÿP[¡ÿP[¡ÿPÿwð‰Ö˜Ë¤Á­¹¶²À«Å£Å(›Â7‘ÀC‰½L$€ºU.y¸\6r¶c=m´jCg³qHb±yL^°PZ¯‹TV¯—VS®£XP®²YO®ÆYO®äXQ®öTS®ÿPT¬ÿMT¬ÿMT¬ÿMT¬ÿMT¬ÿMT¬ÿMÿ}ßÎè¹°°º¨Ä¡Ì›Ì#’Ê3 ‰È?ÆIyÄR(rÂZ0kÁa7f¿hëÀ.=ìÛ.=êï.=èü.=çÿ-=çÿ-=çÿ-=çÿ-=çÿ-=çÿ-ÅŸµ©¨±œ¼Ç„Òzßtômô fô*_ô4Zõ= TõEOõLLõUIö]FöeDönAöw?÷=÷;÷™ 9ø¦!8øµ"7ùÈ"6ùã"6øó"6÷ü"6÷ü"6÷ü"6÷ü"6÷ü"6÷ü"·¦©®œ¹ÄƒÏwÛoö gÿ`ÿZÿ'Tÿ0Oÿ8Jÿ@ FÿH CÿO@ÿV=ÿ^;ÿe8ÿn6ÿw4ÿ‚2ÿ0ÿ›/ÿ©.ÿ·-ÿÈ,ÿá,ÿï,ÿï,ÿï,ÿï,ÿï,ÿï««žµÁ‚ÌuÙiäaÿ [ÿTÿNÿ"Iÿ+Dÿ2@ÿ:<ÿA9ÿG6ÿN 3ÿT 1ÿ[ .ÿb ,ÿk )ÿu 'ÿ€%ÿ$ÿš#ÿ¦"ÿ³!ÿÁ!ÿÐ!ÿÐ!ÿÐ!ÿÐ!ÿÐ!ÿП²‘¾ƒÊuÖgâ[ñTÿNÿHÿBÿ=ÿ$9ÿ+5ÿ21ÿ8.ÿ>+ÿC(ÿI%ÿO#ÿV!ÿ]ÿeÿoÿz ÿ‡ ÿ” ÿŸ ÿª ÿ³ ÿ³ ÿ³ ÿ³ ÿ³ ÿ³ “»„ÇuÓgáXèNûHÿAÿ ;ÿ6ÿ1ÿ-ÿ")ÿ(%ÿ-"ÿ2ÿ8ÿ=ÿBÿHÿNÿUÿ]ÿg ÿr ÿ} ÿ‰ ÿ“ ÿœ ÿœ ÿœ ÿœ ÿœ ÿœÿ?*ÿ?0ÿD0ÿH3ÿI9ÿHBÿFM ÿE[ÿCiÿAwÿ@…ÿ?‘ÿ>›ÿ>¤ÿ=«ÿ=³ÿ=ºÿ=Ãÿ<Ìÿ<Ûÿ<çÿ<ðÿ<øÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ@*ÿA.ÿG.ÿJ1ÿL7ÿK@ÿJK ÿHYÿFgÿDuÿC‚ÿBÿA™ÿA¢ÿ@©ÿ@±ÿ?¸ÿ?Àÿ?Éÿ?Öÿ?åÿ?ïÿ?÷ÿ?þÿ?ÿÿ?ÿÿ@ÿþ@ÿþ@ÿþ@ÿþ@ÿþ@ÿþ@ÿÿ@*ÿC,ÿI,ÿM/ÿO5ÿP>ÿNI ÿLVÿJdÿHrÿGÿF‹ÿE–ÿDŸÿD§ÿC®ÿCµÿB½ÿBÆ ÿBÑ ÿBâ!ÿBí!ÿBõ!ÿBý!ýBÿ!ûCÿ úCÿùCÿùCÿùCÿùCÿùCÿùCÿÿA)ÿF*ÿL)ÿQ,ÿS2ÿT<ÿTG ÿQRÿO`ÿMoÿL|ÿJˆÿI’ÿH›ÿG£!ÿG«"ÿF²#ÿFº#ÿFÃ$ÿEÍ%ÿEÞ%ÿEê&üEô&ùEü&öEÿ&õFÿ$ôFÿ#óGÿ!óGÿ!óGÿ!óGÿ!óGÿ!óGÿ!ÿB(ÿI'ÿP&ÿU(ÿX/ÿZ9ÿZD ÿWOÿU\ÿSjÿQwÿOƒÿNŽ!ÿM—#ÿLŸ%ÿK§&ÿJ®'ÿJ¶)þI¾*ýIÉ*úHÙ+÷Hç,ôHò,ñHû,ïIÿ*íJÿ(ìJÿ'ëKÿ%ëLÿ%ëLÿ%ëLÿ%ëLÿ%ëLÿ%ÿC(ÿM$ÿT#ÿZ%ÿ^,ÿ`6ÿ`A ÿ^Lÿ[WÿYfÿWrÿU~"þS‰%üQ“(úP›*ùO£,÷Nª.öM²/ôLº0óLÄ2òKÑ3îKä4êJð4çKú3åMÿ0äNÿ-âOÿ+áPÿ)áPÿ)áPÿ)áPÿ)áPÿ)áPÿ)ÿF%ÿP!ÿX ÿ_!ÿd*ÿf3ÿf= ÿeHÿbSÿ`aü]m øZy%õX„)óV-ðT–0îRž3íQ¥5ëP­7éNµ9çN¿;æMÌ<ãLà=ßMî<ÜOù9ÙQÿ5ÖRÿ2ÔSÿ0ÓTÿ-ÓUÿ-ÓUÿ-ÓUÿ-ÓUÿ-ÓUÿ-ÿJ#ÿTÿ\ÿdÿi'ÿl0ÿm: ÿlDýjOøg\óch"ï`t(ë]~.èZˆ3åW‘7ãU™:àS >ÞR¨@ÜQ±AÙP»BÖPÈCÓPÜDÏPìCÌRø?ËUÿ;ÉWÿ7ÈXÿ4ÇYÿ2ÆYÿ1ÆYÿ1ÆYÿ1ÆYÿ1ÆYÿ1ÿM ÿWÿ`ÿiÿo%ÿr-ÿt7ýsAöqKðnXêjd$åen+àay3Ü^‚8Ø\‹<ÓZ”?ÐXœBÎW£DËU¬FÉUµGÇTÀIÅTÐIÂSæIÀVõE¾Yÿ@½[ÿ<¼\ÿ9»]ÿ5º]ÿ5º]ÿ5º]ÿ5º]ÿ5º]ÿ5ÿPÿ[ÿdÿmÿt"ÿx*ÿz3öz= ïxGçuTáp_%Úkj-Ógt4Îd}:Êa†?Ç_ŽBÄ]–EÁ[žH¿Z¦J¼Y¯LºXºM¸XÈN¶XßN´YðK³\ýE²_ÿ@²`ÿ<°aÿ9°aÿ8°aÿ8°aÿ8°aÿ8°aÿ8ÿRÿ^ÿhÿrÿyÿ~'ù€0ð9 ç€Cà|PÖw[$Ïrf.Émo5Äjx;Àg@¼d‰D¹b‘H¶`™J³_¡M±]ªO®\´Q¬\ÁRª\ÔR¨]ëP¨`úI¨cÿD¨dÿ@¦eÿ<¦eÿ;¦eÿ;¦eÿ;¦eÿ;¦eÿ;ÿUÿaÿlÿvÿ}ÿƒ#ô†,êˆ5á‡@Ö‚LÍ}X$Æwb-Àsk5»ot<·l|A³i„F¯gŒI¬e”L©cœO¦b¥Q¤a¯S¢`¼U `ÍUž`æTžd÷MŸgÿGŸiÿCžiÿ?iÿ=iÿ=iÿ=iÿ=iÿ=ÿWÿcÿoÿyÿû‡ ïŒ'äŽ0Ú= χJÇ‚U#¿}_-¹xh5³tp<¯qxB«n€F§lˆJ¤iN h˜Qf¡S›e«U˜d¸W–dÈX”dáX•hôP–kÿJ—lÿE–mÿA–mÿ@–mÿ@–mÿ@–mÿ@–mÿ@ÿYÿfÿrÿ}ÿ…öŒê‘"ß”+Ó‘: ÉŒGÀ‡S"¹‚\,²}e5­ym<¨uuB£s}G p„KœnŒN™l•R•kžT’i¨Wi´YŽhÃYŒhÜZlòSnÿLpÿGqÿCqÿAqÿAqÿAqÿAqÿAÿ[ÿhÿuÿ€ÿ‰òå–Ù™&Í•8 ÄE»‹Q!³†Z,­‚c4§~k;¡zrAwzF™uK•s‰O’q‘RŽo›U‹n¥Xˆm°Z†l¿[„mÕ[†oïUˆrýN‰tÿI‰tÿDˆtÿCˆtÿCˆtÿCˆtÿCˆtÿCÿ]ÿkÿxÿƒýŒí”àšÓœ$È™6 ¿”C¶O ®ŠX+§†a3¡‚h;œpA—|wF“y~Kw†O‹uRˆs˜V„r¢Xq®Zq¼\}qÐ\sìVvûOƒxÿJƒxÿE‚xÿD‚xÿD‚xÿD‚xÿD‚xÿDÿ_ÿm ÿz ÿ… ò ç˜ ÛŸΟ"Ä4º˜B²“MªV*£Š_2œ†f:—ƒm@’€uE~|J‰|„N…zŒR‚x•V~w Y{v«[yuº\wvÍ\xwêX{zúQ}|ÿK}|ÿF}|ÿE}|ÿE}|ÿE}|ÿE}|ÿEÿaÿo ÿ} õˆ ߓ؛ Ó¢ É£¿ 2¶œ@­—K¥“T(ž]1˜‹d9’ˆk?…rEˆƒzJ„€N€ŠR|}“Ux|Xu{©[rz¸\qzÊ\r|èXu~ùQw€ÿLw€ÿGw€ÿFw€ÿFw€ÿFw€ÿFw€ÿFÿdÿr ÿåŒØ–Ñž Î¥ Ħº¤/± >¨œI ˜S'™”[0“b8i>ˆŠpDƒˆxI~†Mz„ˆQv‚‘Ur›Xo€§Zlµ\k€È\kåYnƒ÷Rq„ÿMr„ÿHr„ÿGr„ÿGr„ÿGr„ÿGr„ÿGÿf ÿuöƒÜҘ̡Ȩ¿©µ¨-¬¤<¤ GœQ%”™Y/Ž–`6ˆ“g=‚nC}ŽvHyŒ}LtŠ…PpˆTl‡™Wi†¥Yf†³[e†Å[e†ãYhˆöRkŠÿMlŠÿHl‰ÿGl‰ÿGl‰ÿGl‰ÿGl‰ÿGÿi ÿxå‡Ö’ÍœƤÁ«¹­°¬+§©:Ÿ¦E–¢O#ŸW-ˆœ_5‚™f;}—lAx•sFs“{Kn‘ƒOjRfŽ—Uc£X`±Y_ÃZ^àXbõRdÿMfÿHfÿGfÿGfÿGfÿGfÿGÿlþ|ފЖÈŸÀ§¹®²²ª±(¡¯7 ™¬C‘¨M!‰¥U*‚£\2| c9wžj>rœqDmšyHh™Ld—‹P`–•S]–¢UZ•°WY•ÁWX•ÞV[–óP]—ÿL_—ÿG`–ÿF`–ÿF`–ÿF`–ÿF`–ÿFÿpëÖÊšÁ£¹ª±²ª·£·$›µ4 “²@НJƒ­S'|«Z.v¨a5p§h;k¥o@g£wDb¢H^¡‰LZ ”OWŸ QTŸ®SSŸÀSRŸÝRUŸóNW ÿJY ÿFYŸÿEYŸÿEYŸÿEYŸÿEYŸÿEÿuà†Ï“ÄŸº§±®©¶¡½ ›½ ”¼1‹º=ƒ·H|µP"u³X*o²_0j°f6Õ73^e¯m;`­u?\¬~CX«‡GUª“JQªŸLOª®MMªÀMMªÜMNªòIPªþFR©ÿCR©ÿBR©ÿBR©ÿBR©ÿBR©ÿBò|׌ș½£²«©² »—Ä ’Å‹Ä,ƒÂ: {ÁDt¿Nn½V$h¼]*c»d0_ºl4Z¹t9V¸|K´ÿ=K´ÿ=K´ÿ=K´ÿ=K´ÿ=âƒÍ’ÁŸ´§ª¯ ¸–ÀŒÊ†ÍÍ&zÌ5sËAlÊJfÉSaÈ[#\Çb(XÆj,TÆr0PÅ|3Mņ6JÄ’9GÄŸ;EÄ®å›#<åª$;æ¼$:æÓ$9åî$9ãú#9âÿ$9âÿ$9âÿ$9âÿ$9âÿ$9âÿ$¿ž¯¦£®—¸ŠÂ~ÌsÖiå dï_ð Yð+Tð5Oð>KñF GñN DñWBñ_?òg=òp:ò{8ó‡6ó”5ô¢3ô±2õÅ1õâ1ôñ1ñþ1ñÿ1ñÿ1ñÿ1ñÿ1ñÿ²¤¥«˜¶‹À~ÊqÕeÞ^õ YüSüNü'Jý0Eý9Aý@>þH;þO 8ÿW 6ÿ^ 3ÿg 1ÿp .ÿ|,ÿ‰+ÿ–)ÿ¤(ÿ´'ÿÇ'ÿá&ÿò&ÿö&ÿö&ÿö&ÿö&ÿö§©™³‹¾~ÉpÓdÞXçRÿ MÿGÿCÿ">ÿ*:ÿ27ÿ93ÿ?0ÿF-ÿM+ÿT(ÿ[&ÿc#ÿm!ÿy ÿ‡ ÿ• ÿ£ ÿ± ÿÀ ÿÖ ÿß ÿß ÿß ÿß ÿß ›±¼~ÇpÒcÞUäKõFÿ@ÿ;ÿ7ÿ3ÿ#/ÿ)+ÿ0(ÿ5%ÿ;"ÿAÿGÿNÿUÿ^ÿhÿtÿ‚ÿÿÿ©ÿµÿºÿºÿºÿºÿºŽºÅpÑbÞTåFë?þ9ÿ4ÿ /ÿ+ÿ'ÿ#ÿ!ÿ%ÿ*ÿ/ÿ4ÿ:ÿ@ÿFÿN ÿV ÿ`ÿlÿxÿ†ÿ‘ÿÿ¡ÿ¡ÿ¡ÿ¡ÿ¡ÿ6-ÿ9.ÿ>.ÿ@2ÿ@8ÿ>Aÿÿ@Jÿ>W ÿ*ÿC*ÿF-ÿG2ÿF<ÿEHÿCU ÿAb ÿ?pÿ=}ÿ<‰ÿ;“ÿ;œÿ:¤ÿ:«ÿ:²ÿ:¹ÿ9Âÿ9Ìÿ9Ýÿ9éÿ9óÿ:ûü:ÿú:ÿù:ÿø:ÿø:ÿø:ÿø:ÿø:ÿø:ÿÿ9+ÿA'ÿF'ÿJ)ÿK/ÿL9ÿKEÿHQ ÿF^ÿDlÿByÿA…ÿ@ÿ@˜ÿ? ÿ?§ÿ>®ÿ>¶ÿ>¾ÿ>Èÿ=Öþ=æû>ñø>úõ>ÿó>ÿò?ÿñ?ÿñ?ÿñ?ÿñ?ÿñ?ÿñ?ÿÿ=(ÿE$ÿJ#ÿN%ÿQ,ÿR6ÿQAÿOM ÿLZÿJgÿHtÿG€ÿF‹ÿE”ÿDœÿC¤þC«ýB²üBº úBÄ ùBÐ!öAâ!òBî"ïBù"íBÿ ëCÿêCÿéDÿèDÿèDÿèDÿèDÿèDÿÿ@%ÿH!ÿO ÿS!ÿW)ÿY3ÿX>ÿVI ÿRUÿQcÿOoþM{ûK†ùJ÷I˜!öHŸ"ôG¦$óG®%ñF¶&ðF¿'ïEË(ìEÞ)èEì)åFø(âGÿ&áHÿ$ßIÿ"ÞIÿ ÝIÿÝIÿÝIÿÝIÿÝIÿÿC"ÿLÿSÿYÿ]&ÿ_0ÿ_:ÿ]E ÿZPýX^øUjõSvòQ€!ïOŠ$íM“&ëLš)éK¢+çJ©,åI±.äH»/âHÇ1àHÙ1ÜHê1ØIö.ÔKÿ+ÒLÿ)ÐMÿ&ÏNÿ%ÎNÿ#ÎNÿ#ÎNÿ#ÎNÿ#ÎNÿ#ÿGÿPÿWÿ^ÿc#ÿf,ÿf6ÿdA úbLô_Yï\eëYp çV{%äT„)áQ-ÞP•0ÜO2ÙN¥3ÖM­5ÓM·6ÑLÂ7ÏLÑ8ÌLæ8ÉMô5ÇOÿ1ÅQÿ.ÄRÿ+ÃSÿ)ÂSÿ'ÂSÿ'ÂSÿ'ÂSÿ'ÂSÿ'ÿJÿTÿ\ÿcÿi ÿl)ÿm2ùl= òiGëfTåc`à_k"Û\u(ÖY-ÒWˆ0ÏU3ÌT˜6ÊS 8ÇR§:ÅQ°;ÃP»<ÁPÉ=¿Pß=¼Qð;ºSü7¹Uÿ3¸Wÿ/·Xÿ-·Xÿ+·Xÿ+·Xÿ+·Xÿ+·Xÿ+ÿMÿWÿ`ÿhÿnÿr%ûs.òs8éqC ânPÛi\Óef$Îbp*É_z/Æ\‚3Ã[Š6ÀY’9½Xš;»V¢>¸U«?¶UµA´TÂB²TÔB°UêA®Wù<®Yÿ7­[ÿ3­\ÿ0­]ÿ.­]ÿ.­]ÿ.­]ÿ.­]ÿ.ÿPÿZÿdÿmÿsÿw!ôy)êz3âx? ÙtLÏpXÉkb$Ähl+¿eu0»b}5¸`…8µ^<²\•>¯[A­Z¦C«Y¯D©Y¼E§XÌF¤XåF¤[ö@£^ÿ;£_ÿ7£`ÿ3£aÿ1£aÿ1£aÿ1£aÿ1£aÿ1ÿSÿ]ÿhÿpÿwû|î$ä€-Ú;ÏzIÇuTÁq_$»mh+¶jp1²gy6¯e€:«cˆ=¨a@¦`˜C£^¡E ^«Gž]·Hœ]ÆIš\ßIš_òDšbÿ>šcÿ9›eÿ6›eÿ3›eÿ3›eÿ3›eÿ3›eÿ3ÿUÿ`ÿkÿtÿ{õè„Þ‡'Ñ„7ÈFÀ{Q¹v[#´re+¯om1ªlu6§j|:£h„> fŒAd”DšcG—b§I•a²K“aÁL‘aØL‘cïG’eýA’gÿ<“iÿ8“jÿ5“jÿ5“jÿ5“jÿ5“jÿ5ÿWÿc ÿn ÿwÿð…ã‰Ö‹#ˈ5„Cº€O³{Y#­wb*¨tj1£qq6Ÿny;œl?˜jˆB•i‘E’gšHf£Je¯LŠe½M‰eÑN‰gìJŠiûC‹kÿ>Œmÿ:Œnÿ7Œnÿ7Œnÿ7Œnÿ7Œnÿ7ÿYÿe ÿq ÿz ñ‚ è‰ ÝŽÏ Æ2½‰Aµ„M®€V"§|_*¢xg0uo6™sv:•q}?’o…BŽmŽF‹l–Iˆj K…j¬MƒiºOiÌOjèLƒmùE„oÿ?…pÿ;†qÿ8†qÿ8†qÿ8†qÿ8†qÿ8ÿ[ÿgÿsó}Þ†ÙŒ Õ‘ Ê’Á0¸?°ˆJ©„T!¢€])}e0˜zl5“ws:u{>Œs‚Bˆr‹F…p”I‚ožLn©N|m·O{mÉPznæM|qøF~sÿAtÿ=€uÿ:€uÿ:€uÿ:€uÿ:€uÿ:ÿ]ÿjÿvä€Ù‰ÒÏ” Å–¼”.³‘= «H¤ˆR ž…[(˜c/“~j5Ž|q9Šzx=†x€BƒvˆEu‘I|s›Lyr§NvrµPtrÆPtrãOvuöGxwÿBzxÿ>{yÿ:{yÿ:{yÿ:{yÿ:{yÿ:ÿ_ ÿlõyÞƒÓ‹Í’É—À™·˜,¯•; §‘GŸP™‰Y'“†a.Žƒh4‰o9…v=}~A}{†EyzIvx™Lsw¥Npw²PnwÄPmwàOpyõHr{ÿCt|ÿ>u}ÿ;u}ÿ;u}ÿ;u}ÿ;u}ÿ;ÿa ÿoè|نώȕڻœ³œ*ª™9 ¢•E›‘N”ŽW&Ž‹_-‰ˆf3„†m8€„t={‚{Aw€„EtHp}—Km|£Nj|°Oh|ÁPg|ÝPj~óIm€ÿCnÿ?oÿlBhŒ‰FeŠ“Ia‰ŸK^‰¬M]‰½N\‰ÖM^ŠðH`‹þCb‹ÿ?cŒÿ‹£H„ Q ~žY'xœ`-sšg2o˜n7j–u]“ÿ;]“ÿ;]“ÿ;]“ÿ;]“ÿ;ÿnà~΋ĕº±£©©¡® ›¯”®.Œ¬; …ªF~¨Nx¦V#r¤]*m¢d/i¡k4dŸs8`ž{<\…?YœBU›œES›ªGQ›ºGP›ÑGQ›îDS›ü@U›ÿΨ&<κ&<ÏÔ&<Íï%;Ìû%;Ëÿ%;Êÿ%;Êÿ%;Êÿ%;Êÿ%;Êÿ%Óµž¨¦®‘¶…¿yÇoÎdÖ ^Þ[Þ WÞ-Sß:PßDLßN IßW Fß_CßhAßq>ß|<߉:à–8à¥7à·6áÍ6ßì5Þù4Ýÿ4Üÿ4Üÿ4Üÿ4Üÿ4Üÿ¹œª¤ž«’µ…¾yÇmÏbÖXáUêQë Më+Ië5Eì>BìG?ìO=íX :í` 8íj 6ît 3î€2îŽ0ï.ï­-ðÀ-ðÞ,îñ,ìþ,ëÿ,ëÿ,ëÿ,ëÿ,ëÿ­¢ ©“³†½yÆlÏ`ØUÞNó J÷FøCø'?ø0;ù88ù@5úG3úO0ûW.û_+üi)üt'ü‚ %ý $ý  #þ° "þÄ !ÿà !ýò üü üü üü üü üü ¢§•±‡»yÆlÏ_ÙRßHèCÿ?ÿ;ÿ7ÿ!4ÿ)0ÿ0-ÿ7*ÿ>'ÿD%ÿK"ÿS ÿ\ÿfÿrÿ€ÿÿŸÿ¯ÿÀÿÖÿéÿéÿéÿéÿé—¯ˆºzÅlÏ^ÚPàDæ<õ7ÿ3ÿ /ÿ+ÿ(ÿ!%ÿ'!ÿ-ÿ2ÿ8ÿ?ÿFÿMÿVÿ`ÿl ÿ{ ÿ‹ ÿš ÿ¨ ÿµÿÂÿÂÿÂÿÂÿÂЏ{ÃlÎ^ÛOâBç6ì1ÿ,ÿ'ÿ#ÿ ÿÿÿÿ!ÿ&ÿ,ÿ1 ÿ7 ÿ>ÿFÿOÿYÿfÿtÿ‚ÿÿœÿ¦ÿ¦ÿ¦ÿ¦ÿ¦ÿ./ÿ3,ÿ7-ÿ80ÿ76ÿ4?ÿ1Kÿ/Xÿ,fÿ*t ÿ) ÿ( ÿ(— ÿ(Ÿ ÿ(¦ ÿ'­ ÿ'´ ÿ'» ÿ'Ä ÿ'Î ÿ(Þ ÿ(é ÿ(ó ÿ(û ÿ(ÿ ÿ)ÿ ÿ)ÿ ÿ)ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ0-ÿ6*ÿ9*ÿ;.ÿ:4ÿ8<ÿ6Iÿ3Vÿ1c ÿ/q ÿ-~ ÿ-Š ÿ,” ÿ,œ ÿ,¤ ÿ,« ÿ,± ÿ,¹ ÿ+Á ÿ,Ë ÿ,Ú ÿ,ç ÿ,ñ ÿ,ú ÿ,ÿ þ-ÿ ý-ÿ ý-ÿ ý,ÿ ý,ÿ ý,ÿ ý,ÿ ý,ÿ ÿ2+ÿ9(ÿ=(ÿ?*ÿ>0ÿ=:ÿ}ÿ=‡ÿ=‘þ<™ý< ü;§ú;®ù;¶ø;¿ö;Êô;Üð;êí;öê;ÿè<ÿç<ÿæ=ÿå=ÿå=ÿå=ÿå=ÿå=ÿÿ="ÿDÿIÿMÿP&ÿQ0ÿP;ÿNFÿKS ÿH`ÿFlûExøD‚öCŒôB”óAœñA£ï@ªî@²í?»ë?Æé?Õå?èâ@ôß@þÝAÿÛBÿÙBÿØBÿØBÿØBÿØBÿØBÿÿ@ÿHÿNÿRÿV#ÿX,ÿW7ÿUBÿRM ùPZõMgñLrîJ}ëH†éGçF—åEž ãD¦"áD®#àC·$ÞCÂ%ÜCÐ&×Cå&ÓDó$ÐEþ"ÍFÿ ÌGÿÊGÿÉHÿÉHÿÉHÿÉHÿÉHÿÿDÿLÿRÿXÿ]ÿ_(ÿ^2ý]=öZI ðWUêUbæRmâPwßNÜLŠ"ÙK’$ÕJš&ÓI¡(ÑI©)ÏH²*ÍH¼+ËHÉ,ÈHß,ÅHï+ÂJü(ÀKÿ%¿Lÿ"¾Mÿ ½Mÿ½Mÿ½Mÿ½Mÿ½MÿÿGÿOÿVÿ^ÿbÿe$þe-ôd8íaC æ_Qà\]ÚXhÔVrÐT{"ÌR„&ÊPŒ(ÇO”*ÅN›,ÃN£.ÁM¬/¿L¶0½LÂ1»LÓ2¸Lé1¶Nø-´Pÿ*³Qÿ'³Rÿ$²Rÿ"²Rÿ"²Rÿ"²Rÿ"²Rÿ"ÿJÿSÿ[ÿbÿhÿjök(ìk2äi>ÜfL ÓbXÍ_cÈ\m ÄZv$ÁX~(¾V†+»UŽ.¹S–0¶Rž2´R¦3²Q°5°Q¼6®PË7¬Pã7ªRô3©Tÿ.¨Vÿ+¨Wÿ(¨Wÿ%¨Wÿ%¨Wÿ%¨Wÿ%¨Wÿ%ÿMÿVÿ_ ÿgÿlûpïq"äq,Ûp:ÑlH ÉhTÃe_¾bh!º_q&¶]y*³[-°Z‰0®X‘3«W™5©V¡7§V«8¥U¶:£UÅ;¡UÝ;ŸVð7ŸXþ2ŸZÿ.ž[ÿ+ž\ÿ(ž\ÿ(ž\ÿ(ž\ÿ(ž\ÿ(ÿPÿY ÿc ÿk ÿpõtèvÝw%Ñv6ÈrD ÁnP»k[¶gd!±em'­bu+ª`|/§_„2¤]Œ4¢\”7Ÿ[9Z¦;šY±=˜Y¿>—YÓ>•Zì;•]û5–^ÿ1–_ÿ-–`ÿ*–`ÿ*–`ÿ*–`ÿ*–`ÿ*ÿRÿ\ ÿf ÿn öt ïxá{Ô| Ê{3ÁwA ºtM´pX®la!©ji'¦gq+¢ex/Ÿd€3œbˆ6™a8–_™;”^¢=‘^­?]»@]ÍAŒ^è?aù8bÿ3Ždÿ0Ždÿ,Žeÿ,Žeÿ,Žeÿ,Žeÿ,ÿUÿ_ÿiôrâxÛ| Ù ÍÄ0»|? ´xK­uU¨q^!£nf&Ÿln+›ju/˜h}3•g„6’eŒ9d•<ŒcŸ>‰bª@‡a·B…aÉB„bäA…d÷;†fÿ5‡gÿ1‡hÿ.‡iÿ-‡iÿ-‡iÿ-‡iÿ-ÿW ÿaþläuÛ{Ó€Ѓ Ç…¾„-¶< ¯}H¨yR¢v[ sc&™pk+•nr/‘my3Žk6‹i‰:ˆh’<…gœ?‚f§A€f´C~fÅD|fáC~hõ<jÿ7€kÿ3lÿ/lÿ/lÿ/lÿ/lÿ/ÿY ÿcôoßxÔ΃ʇˆ¹‡+±…:ªF£~PzY˜wa%“uh*so/‹qw3ˆo~6…n†:‚l=k™@|j¥Byj±DwjÂDvjÝDxló>ynÿ8zoÿ4{pÿ0|pÿ0|pÿ0|pÿ0|pÿ0ÿ[ÿfçrÚ{Ï‚ɇÄŠ¼Œ´‹(¬‰8¥…Dž‚N˜W“|_$Žyf*Šwm.†ut2‚t|6r„9|q=yp—@vo¢Bsn¯DqnÀEpnÙErpñ?srÿ9usÿ5vtÿ1vtÿ1vtÿ1vtÿ1vtÿ1ÿ]ÿiâtÔ}Ë…ÄŠ¿·°&¨5 ŠBš†L-¬†œ“ƒUŽ]$‰~d)…|k-zr2}xy5zw‚9vv‹ HŠŽQ„‹Y!‰`'{‡g+w…n0s„u4o‚}7k‡;h€‘>eœAb~©C`~¹D_~ÏD`ì@b€ü:d€ÿ6eÿ3fÿ2fÿ2fÿ2fÿ2ÿdårÓ~LJ¾¶•®™¦›  œ™›.’™; ‹–F…”O‘Wz^%uŽe*qŒl.mŠs2i‰{6fˆ„9b†=_…š?\…¨AZ…·BY…ÌBZ…ê?\†û:^†ÿ6_‡ÿ2_‡ÿ2_‡ÿ2_‡ÿ2_‡ÿ2ýhàv͂Œ¹“°™¨Ÿ  ™¡“ +ŒŸ8…CšLy˜Tt—\"p•c'k“j,g’q0d‘y3`‚7\Ž:Y™=W¦?T¶@SË@Té=Vú9Wÿ5YŽÿ2YŽÿ1YŽÿ1YŽÿ1YŽÿ1ímÙ{ȇ½´˜ª¡¡—¦‘§Œ§'…¦5¤@ y¢Js RnŸYi`$eœg(a›o,^šw0Z˜€3V—‹6S——9Q–¥;O–´º³&=ºÈ&=ºè&=¸ù%=·ÿ$=¶ÿ#=¶ÿ#=¶ÿ#=¶ÿ#=¶ÿ#Lj¹•¬¡¤–«Š²¹s¿hÆ`Ê^Ê[Ê,WÊ8TÊCPÊLMÉU JÉ]GÉfDÉoAÉy?È…<È“:È¢9ɳ8ÉÉ8Èè7Çù7Åÿ6Äÿ6Äÿ6Äÿ6Äÿ6Äÿ¾‘°›¤£˜ªŒ²€¹tÀhÇ]ÍSÓ O×MØ"KØ0IØ<FØFDÙOAÙX?Ùa<Ùk :Ùv 7Ù‚5Ú4Ú 2Ú±1ÛÇ1Úç0Øö0Öÿ/Ôÿ/Ôÿ/Ôÿ/Ôÿ/Ôÿ³š¦¡š©±€ºtÁhÉ\ÏRÕHÜEåCåAæ*>æ5;ç>9çG7çP4èY2èb0èm.éy,é‡+ê– )ê§ (êº 'ëÖ 'éð 'çý &æÿ &æÿ &æÿ &æÿ &æÿ ¨ œ§°‚¹tÂhÊ[ÑO×EÝ>î <ò9ó6ó%4ô.1ô7.õ?,õG)öO'öW%÷a#÷l!øzø‰ùšù«úÀúÞùò÷ýöÿöÿöÿöÿž¦‘¯ƒ¹uÂgËZÓMÚBß8å5û1ÿ.ÿ+ÿ)ÿ&%ÿ-#ÿ4 ÿ;ÿCÿKÿSÿ]ÿjÿxÿˆÿšÿ«ÿ¾ÿÕÿíÿðÿðÿðÿð“®„¸vÂgÌZÕLÜ?á5æ-ô*ÿ&ÿ #ÿ ÿÿÿ#ÿ)ÿ/ÿ5ÿ=ÿE ÿN ÿXÿeÿtÿ…ÿ–ÿ¦ÿµÿÆÿÊÿÊÿÊÿʆ·wÁhÌZ×KÞ>ä2é'í#ÿÿÿÿ ÿÿÿ ÿ ÿ"ÿ(ÿ.ÿ5ÿ=ÿGÿRÿ^ÿmÿ~ÿŽÿ›ÿ©ÿ«ÿ«ÿ«ÿ«ÿ*-ÿ.+ÿ0+ÿ0.ÿ.5ÿ)=ÿ%Iÿ#Wÿ!dÿrÿÿŠÿ”ÿœÿ£ÿªÿ±ÿ¸ÿ¿ÿÉÿÖÿåÿïÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,+ÿ0(ÿ3(ÿ3+ÿ11ÿ-:ÿ+Gÿ(Tÿ&aÿ$oÿ"|ÿ"‡ÿ"‘ÿ!™ÿ!¡ÿ!§ÿ!®ÿ!µÿ!¼ÿ!Æÿ!Ñÿ!âÿ"íÿ"÷ÿ"ÿý"ÿü"ÿü"ÿü"ÿû"ÿû"ÿû"ÿû"ÿÿ.(ÿ3%ÿ6%ÿ7'ÿ5-ÿ48ÿ2Dÿ/Qÿ,^ÿ*kÿ)wÿ(ƒÿ'ÿ'– ÿ' ÿ'¤ ÿ'« ÿ'² ÿ'¹ ÿ' ÿ'Í ÿ'Þ ÿ'ë ü'öù(þ÷(ÿö(ÿõ(ÿõ(ÿõ(ÿõ(ÿõ(ÿõ(ÿÿ2%ÿ7"ÿ:!ÿ;#ÿ;)ÿ;4ÿ9@ÿ6Mÿ4Zÿ1fÿ0sÿ. ÿ.‰ ÿ.’ ÿ-™ ÿ-¡ ÿ-§ ÿ-® ÿ-µ ÿ-¾ þ-É û-Ù ø-è ô.ô ñ.þ ï.ÿ î.ÿ í.ÿ ì.ÿ ì.ÿ ì.ÿ ì.ÿ ì.ÿ ÿ5"ÿ;ÿ?ÿ@ÿB&ÿB1ÿ@<ÿ>Hÿ;Uÿ9bÿ7n ÿ6y ÿ5„ ý4 ü4• ú4œù3£÷3ªö3²õ3ºó3Åò3Òî3åê4òç4ýå4ÿä4ÿâ5ÿâ5ÿ á5ÿ á5ÿ á5ÿ á5ÿ ÿ9ÿ?ÿCÿFÿI#ÿI-ÿH8ÿEDÿCPÿ@] û>i ø=t õ<ó;ˆñ;ï:˜í:Ÿì9¦ê9®é9¶ç9Áæ9Îâ9ãÞ9ñÛ:üØ:ÿÕ;ÿÓ;ÿÒ;ÿÒ;ÿÒ;ÿÒ;ÿÒ;ÿÿ=ÿCÿHÿLÿOÿP(ÿO3ÿM?ûJJõGW ñFd íDoéCyçBƒäA‹â@“à?›ß?¢Ý>ªÛ>³Ø>½Ö>ÊÒ>ßÎ>ïË?ûÉ@ÿÇ@ÿÆAÿÅAÿÄAÿÄAÿÄAÿÄAÿÿAÿGÿLÿRÿVÿW$ÿV.øT9ñQEëOR æM^ áKiÝItÙH}ÕF†ÒEŽÐE–ÎDÌD¥ÊC­ÈC¶ ÆCÃ!ÅCÓ!ÁCé!¾D÷¼EÿºFÿ¹Gÿ¸Gÿ¸Gÿ¸Gÿ¸Gÿ¸GÿÿDÿKÿQÿWÿ[ÿ]ù](ï[3çY?àWMÚTY ÓRdÎPnÊNwÇL€ÅKˆÂJ ÀJ—!¾IŸ#¼H§$ºH°%¸H¼&·HË'´Gã'²Ió%°Jÿ"®Kÿ®Lÿ­Lÿ­Mÿ­Mÿ­Mÿ­MÿÿGÿO ÿV ÿ\ÿ`ýbðc!æb,Þ`:Ô^HÍ[T ÇX_ÃVi¿Tr¼Rz¹Q‚!¶PŠ#´O‘%²N™'°M¢(®M«*¬L¶+ªLÄ,¨LÛ,¦Mï*¤Oý&¤Pÿ#£Qÿ £Rÿ¢Rÿ¢Rÿ¢Rÿ¢RÿÿJÿR ÿZ ÿ` ÿeõgèhÝg$Òf5ÊdDÃaP ½^[¹\dµZm±Xu ®W}#¬U„%©TŒ(§S”*¥R,£R¦-¡Q±/ŸQ¾0QÑ0›Qê/šSú*šUÿ&™Vÿ#™Vÿ!™Wÿ™Wÿ™Wÿ™WÿÿM ÿUÿ]ûdïi ék álÓmÉl1Âj@»gL µdW°a`¬_i¨]q!¥\x$¢Z€' Y‡*X,›W˜.™V¢0–U¬2”U¹3“UÊ3‘Uå3‘W÷-‘Yÿ)‘Zÿ%‘[ÿ#‘[ÿ!‘[ÿ!‘[ÿ!‘[ÿ!ÿO ÿWÿaêhÞmØpÕp ËrÂq.ºo=´lI ®iT©g]¤de¡bm!at%š_|(˜^ƒ+•]‹-’[”0[ž2Z¨4‹Yµ5ŠYÆ6ˆYá6ˆ\ô0ˆ]ÿ+‰^ÿ(‰_ÿ%‰_ÿ#‰_ÿ#‰_ÿ#‰_ÿ#ÿQ ÿZõdàl×qÐtÍu Äv¼v*´t:®qF §nQ¢kZžibšgi!–eq%“dx(b€+aˆ.‹`‘1ˆ_š3†^¥5ƒ^²7‚^Â7€^Ü8€_ò3aÿ-‚bÿ)‚cÿ&‚dÿ%‚dÿ%‚dÿ%‚dÿ%ÿSÿ]çgÛoÐtÊxÆy¾z¶z(¯x7g|¨vD ¢sNœpW˜m_”kg!jn%hu(Šg}+‡e….„dŽ1c—4b¢6|b¯8zb¾9ybÕ9ycï4zeþ/{fÿ+|gÿ(|gÿ&|gÿ&|gÿ&|gÿ&ÿUÿ`ãjÕrÌxÅ{À}¹~±~%ª}5£zA wL—tU’r]Žpd Šnk$‡lr(„kz+j‚.~i‹1{g•4xg 6vf¬8tf¼9sfÑ:sgí6tiý0ujÿ,vkÿ)wkÿ'wkÿ'wkÿ'wkÿ'ÿWöcßmÑuÈ{Á»€´¬‚#¥2ž~? ˜{J’ySv[‰tb …ri$qp'~ow+{n.xmˆ1ul’4skž7pjª9nj¹:mjÎ:mkë7omü1pnÿ-qnÿ*qoÿ(qoÿ(qoÿ(qoÿ(ÿYëeÛpÍxÄ~¼‚¶„®…§†  …0š‚=“€HŽ}Q‰{Y„y`€wg#|un'ytu*vs}.sr†1pq4mpœ7jo¨9ho·:goË:gpé7iqú2krÿ-lsÿ*lsÿ(lsÿ(lsÿ(lsÿ(ÿ\çhÕsÉ{À‚¸†±ˆ©‰ ¢Šœ‰.•‡;…E‰‚O„€W~^{|e"x{l&tys*qx{-nw„0kvŽ3huš6et¦8ctµ9atÉ:atç8cvù2evÿ.fwÿ+gwÿ)gwÿ)gwÿ)gwÿ)ÿ_ãlÐvż…´Š¬Œ£Ž Ž—Ž+Œ8ŠŠC „‡L…Uz„\v‚c!s€j%oq)l~y,h}‚/e|Œ2b{˜5_z¤7]z³8\zÇ9\zå7^{ø2_{ÿ.`|ÿ+a|ÿ)a|ÿ)a|ÿ)a|ÿ)õbÞoÌzÀƒ·‰¯Ž¦‘’—“‘“(‹’6…A ŽJzŒRuŠZqˆam‡h#j†o'f„w+cƒ€.`‚Š1]–4Z£6X€²7V€Å7V€ã6X÷1Yÿ-[‚ÿ*[‚ÿ)[‚ÿ)[‚ÿ)[‚ÿ)ìfØsÇ~¼‡³Ž©’ •–˜™Š™$…˜2–> y”Ht“Po‘Wk^hŽe!dm%`Œu(]‹~+ZŠˆ.W‰”1T‰¡3Rˆ°4QˆÃ5Pˆâ4Rˆö0Sˆÿ,Tˆÿ)Uˆÿ(Uˆÿ(Uˆÿ(Uˆÿ(ækÐxƒ·Œ­’£–ššŽž‡ŸƒŸ ~Ÿ/x;sœE n›Mi™Ue˜\a—c^–j![•r%W”|(T“†+Q’’.N’ 0L’¯1K’Â1J‘à1L‘õ-M‘ÿ*Nÿ(Nÿ&Nÿ&Nÿ&Nÿ&ÞpÉ}¼‰²’§—›“Ÿ†¤~¦ z¦u¦*p¦7l¥A g£J c¢R_¡Y[¡aX hTŸp Qžz#N„&K‘)Hœž*Fœ®,EœÁ,Eœß+E›ô)Fšÿ'Gšÿ%Gšÿ$Gšÿ$Gšÿ$Gšÿ$Ôw„¶«–¡œ– ‹¥ªt®o¯l¯$h¯2d®=_­F [¬O X¬VT«^QªfNªnK©xH©ƒ E¨"C¨$A¨­%@¨À%?¨ß%?¦ô#@¥ÿ"@¥ÿ!@¤ÿ @¤ÿ @¤ÿ @¤ÿ Ê~»‹¯•¤›™¡Ž¦‚¬w±j¶c¸a¸^¸,Z¸8W¸BS¸KP·S M·[J¶cG¶kDµuBµ?µŽ=µœ;µ¬:µÀ9µß9³ô9²ÿ9±ÿ9°ÿ9°ÿ9°ÿ9°ÿÁ†´“§šœ ‘§…­y³m¸b½VÂSÃRÃ#PÄ0MÄ;JÄEGÄNEÄWBÃ_ @Ãh =Ãr ;Ã~8ÃŒ6Û5ë3ÃÀ3Ãà3Áõ2Àÿ2¿ÿ1¾ÿ1¾ÿ1¾ÿ1¾ÿ¸«™Ÿ “§‡®{´n»cÀXÅMÊDÏ CÐBÐ%@Ð2?Ñ==ÑG;ÑP9ÒY6Òc4Òn2Òz0Òˆ.Ò˜ -Ó© ,Ó¾ ,Óß +Ñó *Ïþ )Îÿ )Íÿ )Íÿ )Íÿ )Íÿ ®˜¢Ÿ–¦‰®|¶o½cÃWÈLÍBÒ9Ù 5ß4ß2à'1á20á=.âG-âP+âZ*ãe(ãq&ä%ä#å¡"å´!åÍ äì âûáÿàÿàÿàÿàÿ¤ž˜¥‹®}¶p¾cÆVËKÐ@Õ6Ü/å-í+î)î"'ï+%ï4#ð<!ðEñNòXòdóqóô’ô¥õºõÖôïòüðÿðÿðÿðÿ𤭶q¿cÇVÎIÓ=Ú3ß*ã&ô$û !üýý"þ)þ1ÿ9ÿAÿJÿUÿa ÿo ÿ€ ÿ“ ÿ¦ÿºÿÔÿëÿöÿöÿöÿö¬€¶r¿cÉVÑHØ;Ý0â&æðÿÿ ÿÿÿÿ ÿ$ ÿ+ ÿ2ÿ;ÿDÿOÿ\ÿkÿ}ÿÿ£ÿ´ÿÆÿÖÿÖÿÖÿÖ‚µs¿dÉVÓGÛ:à.å#éíýÿÿÿ ÿ ÿÿÿÿÿ$ÿ+ÿ3ÿ=ÿIÿVÿfÿxÿŠÿ›ÿ¨ÿ±ÿ±ÿ±ÿ±ÿ%+ÿ()ÿ))ÿ(,ÿ#2ÿ;ÿGÿUÿbÿpÿ|ÿ‡ÿ‘ÿ™ÿ ÿ§ÿ­ÿ´ÿ»ÿÄÿÎÿßÿëÿöÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ()ÿ+&ÿ,&ÿ+)ÿ(/ÿ"8ÿ DÿRÿ_ÿlÿyÿ„ÿŽÿ–ÿÿ¤ÿªÿ±ÿ¸ÿÀÿÊÿÛÿèÿôÿýüÿûÿûÿúÿúÿúÿúÿúÿÿ*&ÿ.#ÿ/"ÿ/%ÿ,+ÿ*5ÿ'Aÿ$Nÿ"[ÿ hÿtÿ€ÿŠÿ’ÿšÿ¡ÿ§ÿ­ÿ´ÿ½ÿÇÿÔþæûò÷ûõÿôÿóÿóÿòÿòÿòÿòÿÿ."ÿ2ÿ4ÿ3 ÿ2&ÿ22ÿ/>ÿ,Jÿ*Wÿ'dÿ&pÿ%{ÿ$…ÿ$Žÿ$–ÿ$ÿ$£ÿ$ªý$±ü$¹û$Ãù$Ïö$ãò$ðî%úí%ÿë%ÿê%ÿé%ÿé%ÿé%ÿé%ÿé%ÿÿ2ÿ6ÿ8ÿ8ÿ:#ÿ9-ÿ8:ÿ5Fÿ2Rÿ0_ÿ.kÿ-vý,€ú,‰ù+‘÷+™õ+Ÿô+¦ó+­ñ+µð+¿î+Ëë+ßç,îä,úâ,ÿ à,ÿ Þ,ÿÞ,ÿÝ,ÿÝ,ÿÝ,ÿÝ,ÿÿ5ÿ:ÿ=ÿ?ÿAÿA)ÿ@4ÿ=Aÿ:Mü8Zø6eô5qñ4{ï3„ í3 ë2” é2› è2¢ æ2ª ä2² ã2» á2È ß2Ü Ú2ì Õ3ø Ò3ÿ Ð3ÿ Î3ÿ Í4ÿ Ì4ÿ Ì4ÿ Ì4ÿ Ì4ÿ ÿ9ÿ>ÿAÿEÿHÿH$ÿG/þD;÷BGñ?Tì>`è Å>¨Ã>±Á>¼À>˽>âº>ò·?ÿµ@ÿ´@ÿ³Aÿ³Aÿ³Aÿ³Aÿ³Aÿÿ@ÿF ÿK ÿQ ÿSÿTóT"éR-áP;ÚOIÒMUÌK` ÈIjÅHsÂG{¿Fƒ½E‹»E“¹Dš·C¢µC«´C¶²CİCÙ­Cí«Eü©Eÿ¨Fÿ¨Fÿ§Gÿ§Gÿ§Gÿ§GÿÿDÿJÿPÿU ÿX ÷YêXßW$ÔW5ÌUDÆTPÁR[ ½Pe¹Nm¶Mv´L}±K…¯J­I•«I©H¦ §H°!¥H½"¤HÏ"¡Hè" IøŸKÿžKÿLÿLÿLÿLÿLÿÿG ÿMÿT÷Zë]ç] á\Ó]Ê]0Ã\?½ZL·XW ³V`¯Ti¬Sq©Qx§P€¤O‡¢O  N˜!žM¡#œM«$šM¸%™LÈ&–Lâ&•Nõ"”Oÿ”Pÿ”Qÿ”Qÿ”Qÿ”Qÿ”QÿÿIÿPûXå^ÝbÖcÔa Êb" Âc,»b;´`H¯]S ª[\¦Zd£Xl WtU{›Tƒ ™T‹"–S“$”R%’Q§'Q³(ŽQÃ)QÝ*ŒRò&‹Tÿ"‹Uÿ‹Vÿ‹Vÿ‹Vÿ‹Vÿ‹VÿÿLÿSì\ßbÔfÎhËgÂgºh(³g8­eE¨cP £aYŸ_a›]h˜\p•Zw“Y!X‡#ŽW%ŒW™'‰V£)‡V¯*…U¿+„VÕ,ƒWï)ƒXþ$ƒYÿ „Zÿ„Zÿ„Zÿ„Zÿ„ZÿÿNÿWå_ØfÎjÇlÃk¼l´m%­l5§jB¡gM œeV˜c^”be‘`lŽ_tŒ^{!‰]ƒ$†\Œ&„[•(Z *Z¬,}Z»-|ZÏ.{[ì+|\ü&|]ÿ"}^ÿ}^ÿ}^ÿ}^ÿ}^ÿÿPõYácÒjÉnÂp½p¶p®q"¨p2¡n?œlJ —jS’h[Žfb‹eiˆcp…bx!‚a€$€`‰&}_’){^+x^©-v^¸.u^Ì/t^é-u`ú'vaÿ#wbÿ wbÿwbÿwbÿwbÿÿRì\ÜfÎmÄr½t·t°t©u¢t/œr=—pG ‘nQlY‰j`…ig‚hnfu!}e}$zd†'wc)uc›,rb§.pb¶/obÉ/nbæ.odù(peÿ$qfÿ!qfÿqfÿqfÿqfÿÿTè_×iÊpÀu¹x²x«x ¤yžx-—w:’uE ŒrNˆpV„o^€md}lkzks wj{#tiƒ&rh)og™,lf¥.jf³/ifÆ0hfä/jh÷)kiÿ%liÿ"ljÿ ljÿ ljÿ ljÿ ÿWäbÒlÆs½xµ{­|¥| Ÿ}™|*“{8yC ˆwLƒuTs[{rbxpiuop rnx#om&ll‹)jl—,gk£.ek²/dkÄ0bká/dlö*fmÿ&fmÿ#gnÿ gnÿ gnÿ gnÿ öYàeÎoÂv¹|±©€ €™”(Ž€5ˆ~Aƒ|J ~zRzxYvw`svgptnmsv#jr&gq‰)dq•+bp¡-`p°/^pÂ/]pß/_qõ*`qÿ&arÿ#brÿ brÿ brÿ brÿ ï\ÜiÊr¾zµ€­„¤…š…”…ކ%‰„3ƒƒ>~H yPu~Wq}^n{ekzlhyt"ex}%bw‡(_v“*\vŸ,Zu®.YuÀ.XuÝ.Yvó*[vÿ&\wÿ#\wÿ \wÿ \wÿ \wÿ ê`ÕlÅvº~±„¨ˆŸ‰”ŠŠˆ‹!ƒŠ0~‰;y‡E t†Np„Ulƒ\i‚cfjb€r _{#\~…&Y}‘)W|ž+U|¬,S|¾-R|Ú-S|ò)U|ÿ%V|ÿ"W|ÿ W|ÿ W|ÿ W|ÿ ådÏpÁz¶ƒ­‰£Œ™Ž†‘},x8sŽBnK jŒSgŠZc‰a`ˆh]‡pZ†y!V…ƒ$T…&Q„œ(O„ª*M„¼*M„×*Mƒñ'Oƒÿ$Pƒÿ"PƒÿPƒÿPƒÿPƒÿÞiÉu¼€²ˆ¨‘““…–~— y—u—(q—5l–?h•H d”P a“W]’^Z‘fWnTwQŽ NŽ#Kš%I©&H»'GÔ'GŒð$HŒÿ"I‹ÿ J‹ÿJ‹ÿJ‹ÿJ‹ÿÕnÃ{·…¬¢’—–Œ™œužpŸmŸ#iŸ0ež;ažE]M ZœT W›\TšcQškN™tK˜H˜‹E—™ C—¨!B—º"A—Ó"A–ï B•þB•ÿC”ÿC”ÿC”ÿC”ÿÌu¼±Œ¦’›—‘›…Ÿy£j§e§c¨`¨+]¨6Y§@V§IS¦Q P¦Y M¥`J¥iG¤rD¤}B£‰?£—=£§<£¹;£Ò;¢ï; þ;Ÿÿ<Ÿÿ<Ÿÿ<Ÿÿ<ŸÿÄ|¶‰ª’Ÿ—•œ‰¡}¦qªd®Z±W±U²#S²0P²;M²DK±MH±UE±] C±e @°o >°z;°‡9¯–7¯¦6¯¸5°Ñ5®ï4­þ4¬ÿ4«ÿ4«ÿ4«ÿ4«ÿ»…¯£—˜Œ£€¨t­h²\¶PºI¼ H¼F½'E½3C½=A½G?½P=½X:½a8½k6½w4½„ 2½“ 0½¤ /½· .¾Ð .¼î -ºþ ,¹ÿ ,¸ÿ,¸ÿ,¸ÿ,¸ÿ³¦—›£ƒªv°jµ^ºR¾GÂ=Ç8É7É6Ê'5Ê34Ë=3ËG1ËQ0Ë[.Ìe,Ìq*Ì)Ì'Ì¡&Í´%ÍÎ%Ëî$Éü#Èÿ#Çÿ#Çÿ#Çÿ#Çÿ©–ž’£…«x²k¸_¾RÂGÆ=Ê4Ï+Ô &Ù%Ù%Ú%$Ú0#Û;#ÛE"ÜP!Ý[ ÝhÞvއߙ߬ßÄÞçÜøÛÿÚÿÚÿÚÿÚÿ œ”£‡«y³lº_ÁRÆFÊ;Î1Ó)Ù!Þèèéé'ê0ê9ëCìNìZígîwîŠïžð³ ðÍ ïì íü ëÿ ëÿ ëÿ ëÿ—£‰«{´m¼_ÄRÊEÎ9Ó/Ø%Ýáì÷ ÷øøù% ù- ú5 û?ûJüWýfþwý‹ýŸüµüÑüíüüüýüýüý‹«}´n½`ÆRÍDÒ7Ø,Ý"áåêúÿ ÿ ÿÿÿÿ ÿ'ÿ0ÿ:ÿEÿSÿbÿuÿŠÿŸÿ³ÿÇÿåÿåÿåÿå´p½aÇSÐCÖ6Ý*âæêí ú ÿÿÿÿ ÿ ÿÿÿÿ!ÿ)ÿ4ÿ@ÿNÿ^ÿrÿ‡ÿšÿªÿ¹ÿ¹ÿ¹ÿ¹ÿ )ÿ"'ÿ"'ÿ*ÿ0ÿ9ÿEÿ Sÿ `ÿ mÿ yÿ „ÿ Žÿ –ÿ ÿ £ÿ ©ÿ °ÿ·ÿ¾ÿÈÿÖÿæÿñÿûÿÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ#&ÿ%$ÿ%$ÿ#'ÿ,ÿ5ÿBÿPÿ]ÿjÿvÿ€ÿŠÿ’ÿšÿ ÿ¦ÿ ­ÿ ³ÿ »ÿ Åÿ Ñÿ ãÿ ïþ úú ÿùÿùÿùÿøÿøÿøÿøÿÿ&#ÿ( ÿ( ÿ&"ÿ"(ÿ 2ÿ?ÿLÿYÿeÿqÿ|ÿ†ÿŽÿ–ÿÿ£ÿ©ÿ°ÿ·ÿÁÿÌýßùíõøóÿòÿñÿðÿðÿðÿðÿðÿÿ*ÿ,ÿ,ÿ+ÿ)$ÿ(/ÿ%;ÿ"HÿTÿaÿmÿwÿÿŠÿ’ÿ™ýŸü¦û¬ù´ø½öÈóÛïêì÷éÿèÿçÿæÿåÿåÿåÿåÿÿ-ÿ0ÿ1ÿ0ÿ1 ÿ0*ÿ.6ÿ+Cÿ(Oÿ&\ÿ$gü#rù#|÷"…õ"ó"•ò"›ð"¢ï"©í"±ì"¹ê"Åè"Õä#éà#öÞ#ÿÛ$ÿÙ$ÿØ$ÿ×$ÿÖ$ÿÖ$ÿÖ$ÿÿ1ÿ4ÿ6ÿ7ÿ9ÿ8%ÿ61ÿ3=ý1Jø.Vô-bð,mí+wê+€è*ˆæ*å*—ã*žá*¥à*­Þ*¶Ü*ÂÚ*ÒÕ+çÐ+õÍ,ÿË,ÿÉ,ÿÈ,ÿÇ,ÿÇ,ÿÇ,ÿÇ,ÿÿ5ÿ9ÿ: ÿ>ÿ@ÿ? ÿ=*ù;7ò8Dì6Qç5\ã4gà3rÝ3{Ú2ƒÖ2‹Ô2“Ò1šÐ1¡Î1© Ì1² Ë1¼ É1Ê Æ2á Â2ñ ¿3þ ½3ÿ »3ÿ º3ÿ º3ÿ º3ÿ º3ÿ º3ÿ ÿ9ÿ= ÿ@ ÿD ÿFÿE÷D#îA/æ?<à>JÚ=WÓ•²>°>¦¯>°­>½«>Í©>æ¦?÷¤@ÿ£@ÿ¢@ÿ¢@ÿ¢Aÿ¢Aÿ¢Aÿÿ? ÿDÿJ÷NìPêO ãLÖLÍM0ÆM?ÀLL»KW·Ia ´Hi ±Gq®Fy¬F€ªEˆ¨D¦D˜¤C¡¢C« C·ŸCÇCà›Dó™Eÿ˜Fÿ˜Fÿ˜Fÿ—Fÿ—Fÿ—FÿÿBÿG÷OåSÝU×UÕR ËSÃT+¼T;¶RH±QR­P\ ©Nd ¦Ml¤Lt¡K{ŸJ‚JŠ›I“™Iœ—H¦•H²”HÁ’HØIïJþKÿŽKÿŽLÿŽLÿŽLÿŽLÿÿEÿKéSÞXÓ[Í[ÊXÂXºZ'³Z7®XD©WO¤UX ¡T` žSh›Qo˜Pv–P~”O†’NŽN˜M¢‹M®ŠM¼ ˆMÐ ‡Më†Oü†Pÿ†Pÿ†Pÿ†Qÿ†Qÿ†QÿÿGøOäWÕ]Ì`Å`Á^º]³_#¬_3¦^@¡\KZT ™Y\–Xd“VkUrŽTz‹T‚‰SЇR”…RžƒQª!Q¸"QË"~Rç!~Sù~Tÿ~Uÿ~Uÿ~Uÿ~Uÿ~UÿÿJîRÞ[ÏaÆd¿eºc³b¬c ¦c0 b=›aH–_Q ’^Y \aŒ[h‰Zo†Yv„X~‚W‡W}V›!{V§"yVµ#wVÇ$vVä$vW÷wXÿwYÿwYÿwYÿwYÿwYÿÿLéVÙ_ËeÁhºi´h­g ¦h h-šg:•eEcN ŒbW ‰a^†_eƒ^l€]s~\{{\ƒy[vZ˜!tZ¤#rZ²$qZÄ%oZá%p[ö q\ÿq]ÿq]ÿq]ÿq]ÿq]ÿýOåYÓbÇh½l¶m¯l§k  l›l*•k7iC‹hL ‡fT ƒe[€cb}bizapxaxu`s_‹p^–"n^¢$l^°%k^Á&i^Þ&j_ô!k`ÿkaÿlaÿlaÿlaÿlaÿõQâ\ÏeÃk¹o±qªq¢o›o–p'o5‹n@†lI‚jR ~iY{h`wffufnrevpd~mcˆkc“"ib $fb®%eb¿&dbÚ&dcò"edÿfdÿgdÿgeÿgeÿgeÿðSÝ_Ëh¿o¶s®u¦us–s‘t$‹s2†r>pG}oO ymWvl^skdpjlmjski|hh†fg‘"cgž$af¬%`f½&_gÖ&_gñ"`hÿahÿbhÿbhÿbhÿbhÿìWÙbÇk¼r³wªy¡y—wx‹x!†x/w;|uExtM trUqq\npckojhnqfnzcm„`l!^lœ#\kª%Zk»&YlÓ&Zlï#[lÿ\mÿ]mÿ]mÿ]mÿ]mÿèZÒfÃo¸v¯{¦~~‘|Š|…}}-||9wzCsyK pxS lwZivafuhctoasx^r‚[r Yqš"Wq¨$Uq¹%TqÐ%Tqî"VqþWqÿWqÿXqÿXqÿXqÿã^Íi¿s´z«¢‚˜ƒ‹„ ‚{‚)v6r@nIj~P g}Wd|^a{f^zm[zvYy€Vx‹Sx˜!Qw¦"Pw·#OwÎ#Owì!PwýQwÿRwÿRwÿRwÿRwÿÞbÈn»w°§„‡’‡„‡}‡ xˆtˆ&pˆ2l‡=h†Fe…N a…U ^„\[ƒcY‚kVtS€~P€‰N–L¥ J¶!IÌ!I~ëJ~üK~ÿK~ÿL~ÿL~ÿL~ÿÕgÃs¶|¬„¢‰˜‹|uŽom!i.e9bŽB^ŽK[R XŒY V‹aS‹hPŠqM‰{J‰‡Hˆ•Fˆ£Dˆ´CˆÊC‡êD†ûD†ÿE†ÿE…ÿE…ÿE…ÿÍm½x±‚§ŠœŽ’†“y•l—f—c˜a˜)^˜5Z—>W—GU–OR–V O•^ L”fJ”oG“yD“…B’“@’¢>’³=’É=‘é=ú>ÿ>ÿ>ÿ>ÿ>ÿÅs·¬‰¡–“‹–™sœdŸ\  Y W¡"U¡/R¡9P¡CM KJ SH ZEŸc CŸl @žv>žƒ;ž‘9 8²7žÈ7è6›ú6šÿ6™ÿ7™ÿ7™ÿ7™ÿ¾{±‡¥›”˜„œw k¤_§RªM«K«J«'H«3F«=D«FB«N@«V>«_;«h9ªs7ª€ 4ª 2ªŸ 1ª° 0ªÇ 0©ç /§ú /¦ÿ /¥ÿ /¥ÿ /¥ÿ /¥ÿ ¶„ªŽž””™‡ž{£o¨c¬W¯K²Aµ>¶=¶;¶):·49·>7·G6·P4·Z2·d0·o.·|,·‹*·œ)·®(¸Å(·æ'µù&³ÿ&²ÿ&²ÿ&²ÿ&²ÿ¯¢”—š‹ ~¦q«e°Y´M·B»8¾/ -Ã,Ã+Ã)*Ä3)Ä=(ÅG'ÅQ&Å\%Æh#Æv"Ɔ ƘÆ«ÇÁÆäÄøÂÿÁÿÁÿÁÿÁÿ¥”ššŽ¡§s®g´Z¹N½BÀ8Ã/Ç&ËÐ ÑÒÒ%Ó/Ó:ÔDÔPÕ]ÕkÖ|×ؤÙ»ÙÞÕóÓÿÒÿÑÿÑÿÑÿœš‘¡ƒ¨u°h·[½NÁBÅ7È-Ì$ÐÕÚâ ãää# å- å7 æB æO ç]çmæ€æ•æ«æÄææçùçÿæÿæÿæÿ“¡…©w±i¹[ÀNÆAÊ5Î*Ò!ÖÛß ã ñ óóòò"ò*ò4ò?òLò\òmò‚ò˜ó­óÆôåôöôûôûôû‡©y²jº\ÂNÉ@Î3Ó(ØÝáä èóýüû ûûüü&ü0ý<þIþZþmÿ‚ÿ˜ÿ¬ÿÀÿØÿäÿäÿä{²l»]ÄOÍ@Ò2Ù&Þâæ êíôÿÿÿÿÿ ÿÿÿÿ!ÿ+ÿ7ÿFÿXÿkÿ€ÿ•ÿ¦ÿ³ÿ»ÿ»ÿ»ÿ&ÿ$ÿ$ÿ'ÿ-ÿ 6ÿCÿPÿ^ÿkÿvÿÿŠÿ’ÿšÿ ÿ¦ÿ¬ÿ²ÿ¹ÿÂÿÍÿßÿìÿøÿÿýÿýÿýÿýÿýÿýÿýÿÿ#ÿ!ÿ!ÿ#ÿ)ÿ2ÿ @ÿ MÿZÿgÿsÿ}ÿ‡ÿÿ–ÿœÿ¢ÿ¨ÿ¯ÿ¶ÿ¾ÿÉÿÛÿêüöøÿ÷ÿ÷ÿöÿöÿöÿöÿöÿÿ"ÿ"ÿ!ÿÿ$ÿ/ÿ<ÿIÿVÿ bÿ nÿ yÿ ‚ÿ ‹ÿ ’ÿ ™ÿ Ÿÿ ¥ÿ «ÿ ²ÿ »ý Æû Ô÷ çó ôð ÿï ÿî ÿí ÿí ÿí ÿí ÿí ÿÿ%ÿ&ÿ%ÿ!ÿ !ÿ+ÿ7ÿEÿQÿ^ÿiÿtÿ}ÿ†ýŽü•ú›ù¡÷¨ö¯ô·óÂñÐíåèòæþäÿãÿâÿâÿáÿáÿáÿÿ)ÿ*ÿ)ÿ'ÿ(ÿ''ÿ#3ÿ ?ÿLÿXüdønöxóñ‰ïî—ìžê¤é¬ç´æ¿äÍàãÜñØþÔÿÒÿÑÿÐÿÐÿÐÿÐÿÿ-ÿ.ÿ. ÿ/(•·Àÿ/ÿ.!ÿ,-ÿ)9ù&Fô$Sï"^ë"iè!sæ!|ã!„á!Œà!“Þ!šÜ!¡Ú!©Ø!±Õ!¼Ó"ÉÐ"ßÌ#ðÈ#ýÆ$ÿÄ$ÿÃ$ÿÂ$ÿÁ$ÿÁ$ÿÁ$ÿÿ0ÿ2 ÿ3ÿ6 ÿ6ÿ5ý2%ô02í-?ç,Lâ+XÝ+cÙ*mÕ*vÒ*Ð*†Î*ŽÌ*•Ê*œÉ*£Ç*¬Å*¶Ã*ÃÂ*Õ¾+ëº+ù¸,ÿ¶,ÿµ,ÿ´,ÿ´,ÿ´,ÿ´,ÿÿ4 ÿ6ÿ9ÿ<ÿ< ý;ñ8è5)à47Ù3FÑ4RÍ3]É3gÆ3pÄ2xÁ2€¿2‡¾2¼2–º1ž¸1¦·1°µ2¼³2Ì ±2å ­3õ «3ÿ ª3ÿ¨3ÿ¨3ÿ§3ÿ§3ÿ§3ÿÿ7ÿ:ÿ>úAñAñ? æ<Û:Ð;1Ê<@Ä÷DæGßHÚFÙ@ ÍBÅD+¾D;¹DHµCS±B\®Be«Al©@t ¦@{ ¤?ƒ £?Š ¡>“Ÿ>œ>¥›>±š>¿˜>Ô–?í”?ü“@ÿ’@ÿ ’Aÿ ’Aÿ ’Aÿ ’Aÿ ÿ=ÿCéIÞNÓOÍNÊIÂI»J&µK6¯KC«JN§IW¤H`¡Gg žFo œFv šE}˜E…–DŽ”D—’C¡C¬CºCÍ‹DèŠEú‰Fÿ‰FÿˆFÿ ˆFÿ ˆFÿ ˆFÿ ÿ@òGãOÔSËUÄTÀP¹O²P"¬Q2§Q?¢PJžOS›N\˜Mc •Lj “Kq ‘JyŽJ€ŒI‰ŠI’ˆHœ†H¨…HµƒHÇHäJ÷€Jÿ€Kÿ€Kÿ€Kÿ€Kÿ€KÿÿCìKÝSÎXÄZ½Z¸W±TªV¥V.ŸV;›UF—TP“SXR_ Qf ‹PmˆOt†O|„N…‚NŽ€M™~M¤|M²zMÃyMßxNôxOÿxOÿxPÿxPÿxPÿxPÿýFçOÖWÈ\¿_·_±\ªY ¤Zž[*™[8”ZCYLŒXU‰W\ †Vc ƒUjTqSy}SzR‹xR•vQ¡tQ¯sQÀqQÛqRòqSÿqTÿrTÿrTÿrTÿrTÿóHãSÐ[Ä`ºc³c¬a¤^ _˜_'“_5Ž^@Š]J†\Rƒ[Y €Z` }Yg{XnxXuvW~tVˆrV“oVŸnU¬lU½kVÕkVðkWÿkXÿlXÿlXÿlXÿlXÿñKßVÌ^Àd·g®h§fŸb˜c’d$c2‰b=„aG`O}_V z^] w]d u\ks\sp[{n[…lZjZœhYªfZºeZÑeZîe[þf[ÿf\ÿg\ÿg\ÿg\ÿíNÚYÈa¼g³j«l¢j™g’gg!ˆg/„f;eD{dMxcT ub[ raa paim`pk_yi_ƒf^Žd^šb^¨a^¸_^Î_^ì`_ýa_ÿa_ÿb_ÿb_ÿb_ÿêQÔ\Äd¹j°n§pžn”kj‡kƒk,~k8zjBviJshRpgY mf` keghdnfdwdcacŒ_b˜]b¦[b¶ZbÌZbê[cü\cÿ\cÿ]cÿ]cÿ]cÿæUÏ_Áh¶n¬r¤tšsŽo‡o ‚o}p)yo5un?rmHnlPklW ik^ fjedilaiu_h\hŠZg–Xg¤Vg´UgÊUgèVgûWgÿWhÿXgÿXgÿXgÿáXËc½k²r©v x–wˆss |txt&tt2ps=msFjrNgqU dp\ apc_oj\nsZn|WmˆUl”Sl£Ql³PlÈOlçQlúQlÿRlÿRlÿRlÿRlÿÜ\Çg¹o¯v¥{œ|‘|‚xzyuyrz#nz/ky:hyCdxKawR_wY \v` YuhWtpTtzRs†Os“Mr¡Lr±JrÆJråKrùLrÿLrÿMrÿMrÿMrÿÔ`Âkµt«{¢—Œz~snk€h€,e€7b€@_H\~PY~WW}^ T|f Q|nO{xL{ƒJz‘HzŸFz¯EzÄDzäEyøFyÿFxÿGxÿGxÿGxÿÍe½p±y§€œ„’†††w†k†f‡ c‡`ˆ'^ˆ3[ˆ<X‡EV‡MS†TP†[N…c K„l I„vFƒDƒBƒ@‚®?ƒÂ>‚â?÷?ÿ@€ÿ@€ÿ@€ÿ@€ÿÆk·v¬¢…—‰Œ‹sŽe] ZX!V‘-S8QANILPJXG`EŽi BŽs @ ><œ:¬9Á8á8‹ö8Šÿ9‰ÿ9‰ÿ9‰ÿ9‰ÿ¿r²}§†œŠ‘ކ‘z“m•_—T™O™NšLš'Jš2Hš<FšDDšLBšT@™\>™f;™p9˜|7˜Š 5˜š 3˜« 2˜¿ 2˜ß 1–õ 1•ÿ 1”ÿ 1“ÿ 1“ÿ 1“ÿ ¸z¬…¡‹–‹”—r›fZ N¢E¤ B¤@¤?¤*>¥4<¥>;¥G9¥O7¥X5¥a3¥l1¥y/¤‡-¤—,¤©+¤½*¤Þ*¢õ)¡ÿ) ÿ)Ÿÿ)Ÿÿ)Ÿÿ±‚¥‹š‘–ƒšvŸj¢^¦R©F«<­5¯ 3°2°!1°+/°5.±>-±H,±Q+±[)±g'±t&±ƒ$±”#±¦"²»!²Û!¯ó ®ÿ ­ÿ¬ÿ¬ÿ¬ÿª‹‘“—‡œz¢m§`«U¯I±>´3·*º$¼ "½!½ !½* ½3¾=¾G¾R¿^¿l¿|¿ŽÀ¡À¶ÀÓ¾ñ¼ÿ»ÿºÿºÿºÿ¡’–˜Šž}¤oªb¯V´J·>º3½*À!ÄÇË ÌÌÌ%Í/Í:ÍF ÍR Î` Îp ΃ Η άÎÆÎèÍû Ëÿ Ëÿ Ëÿ Ëÿ˜˜ž¥q¬d³W¹J½>À2Ã(ÆÊÍÑ ÖÙ ÙÚÚ$Û.Û9ÜEÝRÞbÞsÞˆßß³ßÎàîßúßÿßÿßÿŸ¦s®eµX½JÂ=Å1É&ÌÐÔÙ Ýáãã äåæ"ç+é6ëCìRìbívîŒî¡ï·ïÑïëðöðöðö„§u¯g·Y¿KÆ<Ê/Î$ÒØÜ àãçëëíî ðñóô'÷3ù@úQûcüwýý£þ¶þÉÿßÿßÿßw°h¹ZÁLÊ<Ï.Ô"ÚÞâ æéìðöö÷øúû ýÿÿ#ÿ/ÿ>ÿOÿbÿwÿÿŸÿ®ÿºÿºÿºÿ#ÿ!ÿ!ÿ$ÿ*ÿ3ÿAÿNÿ\ÿhÿtÿ~ÿ‡ÿÿ–ÿœÿ¢ÿ¨ÿ®ÿµÿ½ÿÇÿÖÿçþóþþýÿüÿûÿûÿûÿûÿûÿÿ ÿÿÿ ÿ %ÿ0ÿ=ÿKÿXÿdÿpÿzÿƒÿ‹ÿ’ÿ˜ÿžÿ¤ÿªÿ±ý¹ûÃúÐøã÷ñöüôÿôÿóÿóÿóÿóÿóÿÿÿ²Q€Ÿÿÿÿ!ÿ ,ÿ 9ÿFÿSÿ_ÿkÿuÿ~ÿ†ÿŽÿ”þ›ü¡ú§ø®õµó¿ñËðßîîìùëÿêÿêÿéÿéÿéÿéÿÿ ÿÿÿÿÿ(ÿ4ÿ Aÿ Nÿ Zÿfÿpþyüú‰øö–óñ£ïªí²ê»èÈæÜäìâúà ÿÞ ÿÝ ÿÝ ÿÜ ÿÜ ÿÜ ÿÿ#ÿ#ÿ!ÿÿÿ#ÿ/ÿ;ÿIüUø`ôjñtï|í„ë‹é’ç™æ ä§â¯à¸ÞÅÜÚÖìÒúÏÿÍÿÌÿËÿÊÿÊÿÊÿÿ'ÿ' ÿ% ÿ& ÿ%ÿ#ÿ (û5õBïOêZæeãnàwÞ܇َ֕ԜңЫεÌÁËÒÇèÃøÀÿ¾ÿ½ÿ¼ÿ¼ÿ¼ÿ¼ÿÿ+ ÿ+ÿ+ÿ- ÿ,ÿ)÷& î#-ç!:áHÛTÕ _Ñ hÎ qÌ!yÊ!È!ˆÆ!Ä!–Ã!žÁ"¦¿"¯½"»¼#ʹ#ãµ$ô³$ÿ±$ÿ¯$ÿ¯$ÿ®$ÿ®$ÿ®$ÿÿ/ÿ/ÿ2ÿ3ù2÷/ë+á'"Ø'2Ð)AË*NÆ*YÃ*bÀ*k½*s»*z¹*‚¸*‰¶*´*˜³*¡±*ª¯+µ®+Ĭ+Û¨,ï¦,þ¤,ÿ£-ÿ¢-ÿ¢,ÿ¢,ÿ¢,ÿÿ2ÿ3ù8é9â9Þ5Þ. Ñ/É1,Ã3;½3H¹4S¶3\³3e°3m®3t¬2{«2ƒ©2Ч2“¥2›¤2¥¢2° 2¾Ÿ2Ñœ3êš3û˜4ÿ—4ÿ–4ÿ–4ÿ–4ÿ–4ÿÿ5ÿ8ê>ßBÕBÏ?Í8Å8½:&·;6²ãEÔIËJÅGÁAº?³A!­B1¨C>¤CI BSA[›Ab˜@j–@q”?x’??ˆ >‘ >› ‹>¦ ‰>³ ˆ>Ć?à„?ô ƒ@ÿ ƒ@ÿ ‚@ÿ ‚Aÿ‚Aÿ‚Aÿÿ<ëCÜJÌOÃP¼N·I±FªH¤I, I:›IE˜HN”GW’G^FeFl‹Es ‰E{ ‡Dƒ …D ƒD—C¢C¯~CÀ|DÚ{DñzEÿ zFÿ zFÿ zFÿ zFÿ zFÿ õ>æHÓOÇT½U¶T°P©L ¢MN(˜N6”NAMKMSŠLZ‡Ka…KhƒJo €Jw ~I |I‰zH“xHŸwH¬uH¼tIÒsIîrJÿrJÿ rJÿ rJÿ rJÿ rJÿ òBàLÎSÁX¸Z°Y©V¢R›R–S$‘S2S>‰RG†QPƒQW€P^~Oe{Ol yNs wN{ uM…sMqMœoM©nM¹lMÎlMëlNýlOÿlOÿ lOÿ lOÿ lOÿ îEÜPÉW½\´^¬^¤[œV•VW!‹X/‡W;ƒVDVM|UTzT[wTbuSh sSp qRx oR‚mQkQ™iQ¦gQ¶fQËeRéeRûfSÿfSÿ fSÿ fSÿ fSÿ êIÕSÅZº_°b¨bŸ_–ZZŠ[…[,[8}[AzZJwYQtXXqX_oWf mWm kVv iVgUŠeU—cU¤aU´`UÈ_Uç`Vú`VÿaWÿaWÿ aWÿ aWÿ çLÑVÁ^¶c­f¤f›d^‰^„_€_)|_5x_?t^Gq]Oo\Vl\\j[c h[k fZs dZ}bZˆ_Y”^Y¢\Y²[YÆZYå[Zù[Zÿ\Zÿ\Zÿ \Zÿ \Zÿ ãOÍY¾a³f©i j—h‹bƒb ~czc&vc2sc<obElaLjaTg`Ze`ac_i a_q _^{]^†Z^“X] W]°V^ÄU^ãV^÷V^ÿW^ÿW^ÿ W^ÿ W^ÿ ÞSÈ]»d°j¦mn“m…g~g xgtg#qh/ng9kgBhfJefRceX`e_^dg \do ZcyXc„Ub‘SbŸRb®QbÂPbáQböQbÿRbÿRbÿ Rbÿ Rbÿ ÙVÄ`·h¬n£qšsqkxkrknlkl,hl7fl@ckH`kO^jV\j]Yie Wim Uiw Sh‚PhNgMg¬KhÀKhÞKgõLgÿLgÿMgÿ Mgÿ Mgÿ ÒZÀd³l©r v–wŠvyqqqkqhqfr(cr4`r=^rE[qMYqTWp[TpcRok Pot Mn€KnIn›Gm«Fn¾EnÜFmôFmÿGmÿGlÿ Glÿ Glÿ Ì_¼i°q¥wœ{‘|†{uxkwew ax_x$]y0Zy:XyBVxJSxQQwXOw`LvhJvr Hu} EuŠCu™Bu©@u¼@uÙ@tó@tÿAsÿ Asÿ Asÿ Asÿ Æd·n«v¢|—Œr€e]YW€ U€+S6Q€>O€FM€NKUI]FfD~pB~{ ?~ˆ =}— <}§ :}º:~Ö :|ñ :{ÿ :{ÿ :zÿ :zÿ :zÿ Ài²t§|’„‡†{‡n‡`‡U‡PˆNˆM‰&K‰0I‰:H‰BF‰JD‰RB‰Z@ˆc=ˆm;ˆx9‡†7‡• 5‡¦ 4‡¹ 3‡Ó 3†ð 3…ÿ 3„ÿ 3ƒÿ 3ƒÿ 3ƒÿ ¹p­z¢‚—‡ŠŒuŽhZO‘G’ D’C“A“*@“4?“==“E;“M:“V8“_6“i4“u2’ƒ0’“.’¤-’·,’Ñ,‘ï+ÿ+Žÿ+ÿ+ÿ+ÿ³x§‚œˆ‘Œ‡z“m•a—U™I›?œ976ž"4ž,3ž52ž>1žG0ŸP.ŸZ-Ÿd+Ÿq)ž'ž&ž¡$žµ#žÎ#î#›þ"šÿ"™ÿ"™ÿ"™ÿ¬ ˆ•Ž‹’–ršeY N£B¤7¦.¨)©(©'ª"&ª,%ª5$ª?#ªH"«S!«^ «j«y«‹««±«Êªì¨ý§ÿ¦ÿ¦ÿ¦ÿ¥‰™”ƒ™užh¢\¦P©D¬9®/°&³µ···!·*·4¸>¸I¸T¹b¹q¹ƒ¹—¹¬ ¹Ä ¸ç¶ûµÿ´ÿ´ÿ´ÿœ’•†›y k¦^«R¯F²:µ/·%º½ÀÃ Æ Å ÅÅ(Å2Æ=ÆIÆWÆfÆwƋƠŶÆÒÅïÅüÅÿÅÿÅÿ•–‰œ{£m©`¯S´F¸:».¾$ÁÄÇÊÎÐ ÐÐÑÒ'Ó1Ô<ÕIÖXÖiÖ|Ö’Ö§Ö¿ÖàÖóÖþÖÿÖÿŒ~¤o«a²T¹F½9Á-Ä"ÇËÎ ÒÕÛÜÝ Þßáâ$ä.æ:çIèYèkéé˜é­éÅéâéòéõéõ€¥q­cµU¼GÂ9Æ,Ê ÎÒÖÛßãåçèêë íïñ!ó+ö8÷HøZùmú„ú›ú¯úÂúÚúßúßËòt®e¶V¾HÆ9Ë+ÐÔÚ ßãæéíïñóõöø úýÿÿ(ÿ6ÿGÿZÿnÿ…ÿšÿ«ÿ¹ÿ¼ÿ¼ÿ ÿÿ ÿ!ÿ'ÿ0ÿ>ÿLÿYÿeÿpÿzÿƒÿ‹ÿ’ÿ˜ÿžÿ¤ÿªÿ°ÿ¸ÿÂÿÎÿâþðýûûÿûÿûÿúÿúÿúÿúÿÿÿÿÿÿ!ÿ-ÿ:ÿHÿUÿaÿlÿvÿÿ‡ÿŽÿ”ÿšþ ý¦ü¬û´ù½øÉ÷Üõìóøóÿòÿñÿðÿðÿðÿðÿÿÿÿÿ ÿÿ(ÿ6ÿCÿPÿ\ÿgÿqÿzü‚ú‰ø÷–õœô¢ó¨ñ°ð¸îÃìÓêçéõçÿæÿåÿåÿåÿåÿåÿÿÿÿÿÿ ÿ $ÿ0ÿ>ÿKÿWþbúlõuò}ð„î‹ì‘ë—éžç¤æ¬ä´â¿àÍÞãÜòÚýØÿÖÿÕÿÕÿÕÿÕÿÿÿ ÿ ÿÿÿÿ*ÿ 8ýEøQô\îfêoæwäâ†àŒÞ“ݚ۠بձһÐÉÎàÌñÉ ÿÇ ÿÆ ÿÅ ÿÅ ÿÅ ÿÅ ÿÿ! ÿ ÿÿ ÿÿÿ#ö0ï>êJå Vá `Ý iÙ qÕ yÓ Ñ ˆÏ Í–ËʥȮƹÄÈÂß¾ò»ÿ¹ÿ·ÿ¶ÿ¶ÿ¶ÿ¶ÿÿ%ÿ#ÿ#ÿ$ÿ! ýñè'á5ÚCÓOÎYËcÈkÅsÃ{Á‚À‰¾¼˜» ¹©·´µ´Ö°í­ü«ÿ©ÿ©ÿ¨ÿ¨ÿ¨ÿÿ(ÿ'þ*ï*ç'ç" äÙÏ-É<Ä I¿ S¼!]¹!e·"mµ"t³"|±"ƒ°"Š®"’¬#›«#¤©#¯§#¼¦$Σ$è %ùž%ÿ%ÿœ%ÿ›%ÿ›%ÿ›%ÿÿ,ÿ-í2â4Ú3Ó.Ò% É%Á''»)6¶*C²+N¯+W¬+`ª+g¨+o¦+v¤+}£+„¡+Ÿ+•ž+Ÿœ+ªš+¶™,Ç—,â”-õ’-ÿ‘-ÿ.ÿ-ÿ-ÿ-ÿÿ0ò3ä:Ö=Ì<Ç9Ã1½.µ0!°20«3=§3I¤3R¡3ZŸ3bœ3iš3p™3w—2•2‡“2’2š2¥Ž2±3‹3܉4ò‡4ÿ†4ÿ†4ÿ…4ÿ…4ÿ…4ÿü3ë:ÜAÍDÃD½A¸;²7«8¥9+¡:8;Dš;M—:V”:]’:d:kŽ9rŒ9zŠ9‚‰9‹‡9•…9 ƒ9­‚9¼9Ó:î}:þ|;ÿ|;ÿ|;ÿ|;ÿ|;ÿô7å@ÒGÅJ¼KµI¯C©> ¢?@&˜A4”A?‘AIŽAQ‹@Y‰@`‡@g…?mƒ?u?}>‡}>‘{>œ z>© x>¸ w?Í u?ê t@üt@ÿt@ÿs@ÿs@ÿs@ÿñ;ßEÌL¿O¶P®O§J DšE•F"F0ŒG<‰FE†FNƒFUE\~Ec|DjzDqyDywD‚uC sC™ qC¦ pCµ nDÉ mDç mEú lEÿlEÿlEÿlEÿlEÿì?ØIÇP»T±U©T¡P™J’IJ‰K,…L8‚KBKJ|JRyJXwJ_uIfsImqIvoHmHŠ lH– jH£ hH² gHÅ fIä fIø fIÿ fJÿfIÿfIÿfIÿèCÒMÂS·X­Y¤XœU“NŒN‡O‚O)P5{P?xOGvOOsNUqN\oMcmMjkMriM|gL‡ eL“ cL  bL¯aMÂ`Má`Mö `Nÿ `Nÿ `Nÿ`Nÿ`NÿãGÍP¾W³[ª]¡]˜ZS†R €S|S%yT1uT<sSDpSLmRSkRYiR`gQheQpcQyaQ„ `P‘ ^Pž \P­[QÀZQÞZQõ ZRÿ [Rÿ [Qÿ[Qÿ[QÿßJÉS»Z°_¦aa”^ˆW€V zWvW"sX.pW9mWAjWIhVPfVWdV^bUe`Um^Uw\U‚ ZUŽ YUœ WU«VU¾UUÛUUó UUÿ VUÿ VUÿ VUÿVUÿÛMÅW¸^­b£ešecƒ\{[u[q[n\+k\6h[?e[Gc[NaZU_Z\]Zc[ZkYYuWY€ UYŒ TYš RYªQY¼PYØPYò QYÿ QYÿ QYÿ QYÿQYÿÔQÂZ´aªf h—iŒg}`u_o_k_h`(f`3c`<a`D__L\_S[_ZY_aW^iU^sS^~ Q]Š O]™ M]¨ L^ºK^ÔK^ñ L^ÿ L]ÿ L]ÿ L]ÿL]ÿÏT¾^±e§jm”m‰lxeodidedbd%`e0^e:\eBZeJXdQVdXTd_RdgPcqNc{ Lcˆ Jc— Hc¦ Gc¸ FcÑ Fcï Fbÿ Gbÿ Gbÿ GbÿGbÿÊXºb®i£nšqr„qtkiici _i\j!Zj-Xk6Vk?UkGSjNQjUOj]MjeJinHiyFi† Di• Ch¥ Ai· @iÏ @hî Ahÿ Agÿ AgÿBgÿBgÿÅ]¶fªm s–v‹w€vpreq\pXpVpTq(Rq3Pq<OrDMqKKqSIqZGqbEplCpwAp„?p“=o£ ;pµ ;pÍ :oì ;nþ;nÿ;mÿ;mÿ;mÿ¿b±k¦sy’{‡|{|mz`xVwPwNxLx$Ky.Iy7Hy@FyHDyOByWAy`?xi‚C=‚K;‚S9‚\7‚f5‚q3‚1Ž0Ÿ.±-È-é-ü-~ÿ-}ÿ-}ÿ-}ÿ³n¨x’ƒˆ†}‡pˆc‰UŠKŠAŠ;‹9‹8Œ"7Œ,6Œ54Œ=3ŒF2O1X/b-Œn+Œ{*Œ‹(Œœ&Œ¯%ŒÆ%‹è%Šû%ˆÿ%ˆÿ%‡ÿ%‡ÿ­v£€—…‰‚ŒvŽi\’P“D”:•1–-—,—+—$*—-)—6(˜?'˜H&˜R%˜\#˜h"˜w ˜‡˜™˜¬˜Ã—å•ú”ÿ“ÿ“ÿ“ÿ§œ†‘‹‡z’m•a˜U›I=ž3Ÿ*¡!£ ££¤$¤-¤6¤?¤J¤U¥a¥p¥¥”¥¨¥¿¤â¢ø¡ÿ ÿ ÿ ÿ †•ŒŒ‘•qšdžX¡L¤@¦5§*©"¬®° ±±±"±+ ±5 ±@ ±K ±X ±g±x±‹± °µ°Ð°ï¯þ®ÿ®ÿ®ÿ˜Ž“‚˜ug¢Z§N«A­5¯+±!´¶¹ ¼¾ ½½¾"¾+¾6¾A¿N¿\¿m¿€¾•¾ª¾Â½ä½ö½ÿÙõŠû½ÿ½ÿ’”…šx j¦\«O°B³5¶*¸ »¾Á ÄÇÉÉ ÉÊË"Ë+Í5ÎAÎPÏ`ÏrχÏϳÏÎÏëÎøÎþÎþˆ›z¢l¨^¯PµB¹5¼)¿ÂÆÉÌÐÓÕÖØ ÙÛÜÞ(à4âAâQãcãwäŽä¤äºåÔåêåóåó|£nª`²Q¹C¾5Â(ÆÉÍ ÑÕÚÞáâäåç éëíï$ò1ôAôSõfõ|ö“ö©÷¼÷Î÷ß÷ßp¬a´S»EÃ6Ç'ÌÐÕ Ûßâåéìíðñóõ÷ úüÿ!ÿ.ÿ@ÿSÿhÿ€ÿ–ÿ¨ÿ¶ÿ¿ÿ¿ÿ ÿ ÿÿÿ$ÿ.ÿ<ÿJÿVÿcÿmÿwÿÿ‡ÿŽÿ”ÿšÿ ÿ¦ÿ¬ÿ´ÿ½ÿÉþÝýíüúûÿúÿùÿúÿúÿúÿúÿÿÿ ÿÿÿÿ*ÿ7ÿEÿRÿ^ÿiÿrÿ{ÿ‚ÿ‰ÿþ–ýœü¡û¨ù¯ø¸öÃôÒóçòöðÿïÿðÿïÿïÿîÿîÿÿÿÿ ÿÿÿ%ÿ3ÿ@ÿMÿYÿdýmûvù}÷„õ‹ô‘ó—ñð£îªì³ê½èËçáåñãýãÿâÿáÿáÿàÿàÿÿÿÿ ÿÿÿ ÿ-ÿ:ÿGùSõ^òhðpíxëé…èŒæ’å˜ãŸá¦ß®Ü¸ÚÅÖÙÔìÒùÑÿÏÿÎÿÎÿÎÿÎÿÿ ÿÿÿ ÿ ÿÿ&ü4ôAíMéXæbãjàrÞyÛ€Ù†Öӓњϡͪ˳ɿÆÐÅèÃöÁÿÀÿ¿ÿ¿ÿ¿ÿ¿ÿÿÿÿÿÿ ÿù ð,æ9àFÜQÖ[ÒdÏlÌsÊzÈÆ‡ÅŽÃ–Á¿¦½°»¼¹͸ åµ ÷³ ÿ± ÿ° ÿ°ÿ¯ÿ¯ÿÿÿÿúõö ëâ "Ø 1Ð >Ë JÇ UÄ^Áf¿m½t»{¹‚·ж‘´š²£°­¯º­ʪå§÷¥ÿ£ÿ¢ÿ¢ÿ¢ÿ¢ÿÿ"ÿ ð#æ$à!ÜÛ ÐÈ)Â7½D¹NµW³`°g®n¬u«|©„¨Œ¦”¤ž£¨¡´ŸÅžßšó˜ÿ—ÿ–ÿ•ÿ•ÿ•ÿÿ&ô'æ-Ú/Ï-Ê'ÇÁº"´1¯ =«!H¨"R¦"Z£#b¡#i #ož#wœ#~›#†™$—$™–$£”$°’%¿‘%ÖŽ&ïŒ'ÿ‹'ÿŠ'ÿ‰'ÿ‰'ÿ‰'ÿú)ì0Ý6Í8Ä7¾2º+µ%®'¨)+¤*8 *C+Lš+U˜+\–+c”+j’+q,x,,Š‹,”Š,Ÿˆ,«†,º…-΃.ê.ü€.ÿ.ÿ.ÿ~.ÿ~.ÿô.ä7Ò=Å?»?´<¯5©/ £/ž1&™23–2>’3H3P3X‹3^‰3e‡3l†3s„3|‚3…€33š}3§|3µz3Éy4æw5ùv5ÿu5ÿu5ÿu5ÿu5ÿð3Ý=ÊC¾EµF­C¦= 6™6”8!9.Œ99‰9C‡9L„9S‚9Z€9a~9h|9oz9wy9€w9‹u9–t9£r9±q9Äo:ân:÷n;ÿm;ÿm;ÿm:ÿm:ÿê9ÕBÄH¹K¯K§IŸD˜>‘<Œ=ˆ>*„?5??~?H|?Oz?Vx?]v>dt>kr>sp>|o>‡m>“k> j>®i?Àg?Þg?õf@ÿf@ÿf@ÿf?ÿf?ÿå=ÏF¿L´OªP¢O™J‘DŠA „B€C&}D2zD<wDDuDLrDSpCYoC`mCgkCoiCyhCƒfCdCcC«aC½`DÙ`Dó`Dÿ_Dÿ_Dÿ`Dÿ`DÿàAÊJ»P°S§UžS•O‹IƒG }GyG"vH.sH8qHAnHIlHPjHVhH]fGdeGlcGvaG€`G^Gš\G©[H»ZHÔZHñZIÿZIÿZHÿZHÿZHÿÛDÆM¸S­W£YšX‘T†N}KwKsLpL+mL5kL>hLFfLMdLSbLZaLb_Lj^Ls\K~ZKŠXK˜WL§VL¹ ULÑ TLïTMÿULÿULÿULÿULÿÕHÂQµWª[ \—\YSwOqOnPjP(hP2eP;cPCaPJ_PQ]PX\P_ZPgXPqWP{UPˆSP–RP¥PP· PPÎ OPíPPÿPPÿPPÿPPÿPPÿÐK¿T²Z§^`”`‰]|WrTlShTeT$bT/`T8^T@\THZTOYTVWT]UTeTTnRTyPT†NT”MT¤KTµKTÌ JTëKTþKTÿKTÿKTÿKTÿÌN»W®^¤bšd‘d†bw[mXfX bX_X"]Y,[Y6YY>WYFVYMTYTRY[QYcOYlMYwKX„IX’HX¢GY³FYÊEYêFYýFXÿFXÿGXÿGXÿÇR¸[«a¡f˜hŽiƒgr`h^a] \]Z]W])V^3T^;R^CQ^JO^RN^YL^aJ^jH^uF^‚D]C^ A^±@^È@^è@]üA]ÿA]ÿA\ÿA\ÿÃV´_¨fžj•mŠmlogdd[bVbTbRc%Pc/Nd8Md@KdHJdOHdWFd_EdhCdsAc?cŽ=cžr@=rH;rP:rY8rc6rm4rz3r‰1rš/r¬.rÁ.rã.qø.pÿ.oÿ.oÿ.oÿ³f§ov“zˆ|~}r}d|W{LzBy)…G(†P'†Z&†f$†s#†ƒ!†• †§†¼†Þ„õ‚ÿ‚ÿÿÿ¨tž}“‚‰…~ˆqŠe‹XŒL@Ž6Ž,% #"!% ‘.‘6‘@‘I‘T‘`‘n‘~’’¤‘¹‘Øô¾9ŽÿÿŒÿŒÿ£}˜ƒŽˆ„Œwi‘]“P•E—9˜.™%š› $-ž7žAžLžXžg žw žŠ ž ² Ì œì ›þ šÿ ™ÿ ™ÿœ„‘ŠˆŽ{’m–`™TœHŸ< 0¡&£¥§© « ªªª$ª.ª8ªDªPª^ªnªª•©ª©Á¨ä¨ö§ÿ§ÿ§ÿ•‹Œ•qšcžV¢J¦=¨1ª&«­°² µ¶ ¶¶··%·/¸9¸F¸T¸d¸v¸‹· ·¶·Ó¶ï¶ü¶ÿ¶ÿ’‚—tf¢X§K¬>¯1±&³¶¸ »¾Á ÃÄÄÅ$Æ.È:ÉGÉWÉiÉ}ɔȪÈÃÈäÈôÈýÈý…™wŸh¦Z«M±?µ1¸%º½À ÃÇÊÍÎÏÐ ÑÓÕ×"Ú-Ý9ÞIÞZßn߅ߜ߲ÞËÞæßôßôy¡k¨\¯Nµ@»1¾$ÁÅÈ ÌÏÓÙÜÝßáâä æèê í+ð:ñKñ^òsó‹ó¢ó¶óÉóáóámª^±P¹A¿2Ä$ÈÌÐÕÚÞâæéêìîðòôö ùüÿ)ÿ:ÿMÿbÿxÿÿ£ÿ³ÿÁÿÁÿÿÿÿÿ!ÿ+ÿ9ÿGÿTÿ_ÿjÿsÿ{ÿƒÿŠÿÿ–ÿ›ÿ¡ÿ¨ÿ¯ÿ¸ÿÄþÕüêûøúÿùÿøÿøÿöÿóÿñÿÿ ÿÿÿÿÿ'ÿ4ÿBÿOÿ[ÿeÿnÿvÿ~ÿ…þ‹ý‘û—úø£÷«ö³ô¾óÌñãïóîÿíÿìÿëÿìÿìÿëÿÿ ÿ ÿÿÿÿ"ÿ/ÿ=ÿJÿUý`úiøqöyôó†ñŒï’î˜ìŸë¦é®ç¸åÅãÚáíßûÞÿÝÿÝÿÝÿÝÿÝÿÿ ÿ ÿ ÿ ÿÿÿ)û7øDõPòZîcìkésçzå€ã†áŒß“ݙۡ٩ղҾÐÎÎæÌöÊÿÊÿÉÿÈÿÈÿÈÿÿÿ ÿÿÿÿ÷"ï0ë=èIäTà]ÝeÙmÕsÒzЀ·ÌʔțƤĭ¸Àǽ߼ñ»þ¹ÿ¸ÿ¸ÿ¸ÿ¸ÿÿÿÿ ÿ ÿ øèã(Ý6ØBÒMÎWÊ_ÇfÅmÃtÁz¿½ˆ»¹—·Ÿµ¨³³±Â¯Ø®í¬û«ÿªÿ©ÿ©ÿ©ÿÿÿ÷ìæåÝÔ Í-È:ÃF¿P¼X¹`·gµn³u±{¯‚® Ь ’ª ›¨ ¥¦ °¥ ¿£ Ô¡ íŸþÿœÿ›ÿ›ÿ›ÿÿ÷êßÕÐÎ Ç À %º2¶?²I¯R¬Zªa¨h¦o¤v¢}¡…ŸŽ—œ¢š­˜¼—Дì’ýÿÿŽÿŽÿŽÿúî#ß(Ð*Ç'Á!½¹²­,¨8¤C¡LŸTœ\šb™i—p•w”’ˆ’©‹·Šʈç† ú„ ÿƒ ÿƒ ÿ‚ ÿ‚ ÿõ$å,Ó1Æ3¼1¶-°%¬ ¦¡ &œ!2™"=•"G“#O‘#V#]$d‹$k‰$rˆ$z†$ƒ„%ƒ%˜%¤€&²~&Å}'â{'÷y(ÿx(ÿx(ÿx(ÿx(ÿï+Ý3Ê9¾;´:­6¦/¡(›'–( ‘)-Ž*8‹+Bˆ+J†+R„+X‚,_€,f,m},u{,~z,ˆx,”v- u-®t-Àr.Ýq.ôp/ÿo/ÿo/ÿn/ÿn/ÿè1Ó:Ã?·A®A¦>ž8—1‘.Œ/ˆ0(„132=2F}2M{2Ty2[w2au2it2pr2yp3„o3m3l3«j4¼i4Õh5ñg5ÿg5ÿf5ÿf5ÿf4ÿâ6Ì?½D²G¨G D˜?9ˆ4 ƒ56$|7/y79w8Bt8Ir8Pq8Wo8^m8el8mj8uh8€g8Œe8™d9¨b9¹a:Ð`:î`:ÿ_:ÿ_:ÿ_:ÿ_:ÿÝ;ÇC¹I®K¤L›J’E‰?: {:w; t<+r<5o=>m=Fk=Mi=Sh=Zf=ad=ic=ra=}`=‰^=–]>¥[>¶Z>ÌZ?ìY?þY?ÿY?ÿY?ÿY>ÿÖ?ÃGµLªP P—OŽK„Ez@u?q@m@(kA2iA;gABeAIcAPaAW`A^^Af]Bo[BzZB†XB”WB£UC³TCÉTCéSCýSCÿTCÿTCÿTCÿÐB¿J²P§ST”SŠPJuEnCkDgE$eE.bE7aE?_EF]EM[ETZF[YFcWFlVFwTFƒSF‘QF¡PG±OGÇNGçNGûNGÿNGÿOGÿOGÿÌF»N¯T¤WšX‘W†T{NpJiH eHbI!_I+]I4[I<YICWIJVIRUJYTJaRJjQJuOJNJLKŸKK°JKÅIKæIKúIKÿJKÿJKÿJKÿÈI¸Q¬W¡[˜\Ž\ƒYvSkNdM _L\MZM(XM1VM:TMASNHRNOPNWON_MNhLNsJOIOGOFO®EOÃDPäDOùEOÿEOÿENÿENÿÄLµU©[Ÿ^•`‹`€^rWgS^QYQWQTQ%RR/QR7OR?NRFMSMLSUJS]ISfGSpES}DS‹BS›AT¬@TÁ?Tâ?Tø@Sÿ@Sÿ@Sÿ@RÿÀP²X¦^œb’eˆe}bn\cYYVTVQVOV"MW,LW4JW<IXDHXKGXSEX[DXdBXn@X{?X‰=X™^a<^l;^x9^‡7^—6^©5^½4_Ý4^õ5]ÿ5]ÿ5\ÿ5\ÿ¸Yªa g–lŒnnvlgi\fQdHb DbBbAc$?c->c5=d=s4r 1s0s/s#.s+-t4,t<+tD)tM(uW'uc%uo$u"u!u¢ u·uÒtñsÿrÿ qÿ qÿ©kžs”yŠ|€~tgZM~C~8}/}(} &}$}#~%"~-!~6!~?HR^kzŒŸ³Î~ï|ÿ{ÿ{ÿ{ÿ¤ršz…‚{„m†`‡T‡Hˆ<ˆ2ˆ(ˆ ˆ‰‰‰Š&Š.Š7ŠAŠL‹X‹e‹u‹‡Š› Н ŠÈ ‰ê ‡ü‡ÿ†ÿ†ÿŸ{”Š…€ˆs‹eYLA’4’*’!“”–— — — —& —/ —9 —D—P—^—n–€–”•¨•¾”à”ô“ÿ’ÿ’ÿ˜‚Žˆ…Œwj’]•P˜Dš8›,œ"ž  ¢£ ££££'£1¤<¤H¤V¤e£w£‹£ ¢¶¡Ò¡ð û ÿ ÿ‘ЉŽ{’m—`›SžF¡9£-¤#¦¨ª ¬®¯¯ ¯°° ±(±2²>²L²[²l²±—±¬°Æ°è¯÷¯ÿ¯ÿŒ•qšcŸU¤G¨:ª-¬"®°³ µ¸»»¼¼ ½¾¿À'Á2Â@ÃOÃ`ÃtËáøÂ×ÂïÂúÁþ—se£W¨I­;±-³!¶¹»¾ÁÅÇÈÉÊË ÍÎÐÓ&Ö2ØAØSÙfÙ|Ù”Ù«ÙÃÙáÙðÙôvŸg¦Y¬K²<·.º!½À ÄÇÊÎÒÕÖÙÛÝßá ãæé$ì2íCîVïkï„ïœï²ïÆïÝïäj¨[¯L¶>¼/À ÄÈ ÌÐÔÙÞâåæèéìîðò õøü#ÿ3ÿFÿZÿqÿ‰ÿŸÿ±ÿÀÿÆÿÿÿÿÿÿ(ÿ7ÿDÿQÿ\ÿfÿoÿwÿ~ÿ…ÿ‹ÿ‘ÿ—ÿÿ¤ÿ«ÿ´þ¿ýÎûæùöøÿ÷ÿ÷ÿ÷ÿðÿìÿéÿÿÿÿÿÿÿ$ÿ2ÿ?ÿLÿWÿaÿjÿrÿyý€ü†úŒù’ø˜öŸõ¦ô®ò¹ðÆîÞíðëþêÿéÿéÿçÿãÿàÿÿÿ ÿ ÿ ÿÿÿ,ÿ:ÿFþRû\øeõlótñzïî‡ìê“éšç¡æ©ã³á¿ßÐÝéÚùÙÿ×ÿÕÿÕÿÕÿÔÿÿ ÿÿÿ ÿÿû&÷4ô@òLîVê_çgänâtà{Þ܇Ú֔ԛѣϭ̸ÊÇÈàÆóÅÿÃÿÃÿÃÿÃÿÃÿÿ ÿÿÿÿ óîê-æ:âEÞOÙXÔ`ÑhÎnÌtÊ{ÈÆ‡ÄŽÂ–Àž¾§»²¹À·Ôµì³û³ÿ²ÿ²ÿ±ÿ±ÿÿ ÿÿ÷ôç àÚ%Ó2Î>ÊIÆRÃZÀa¾h¼nºt¸{¶´ˆ²°™®¢¬­ªº¨Ë¦æ¥÷¤ÿ£ÿ¢ÿ¢ÿ¢ÿÿû ïæ ß ÚÐÉÄ*¿7»B·K´T²[¯b­h«n©u¨{¦ƒ¤‹¢” žž¨œµ›Æ™â˜ô–ÿ• ÿ” ÿ” ÿ” ÿüñãÖÌÇÄ ½·!².®:ª D§ M¤ U¢ \  bž iœ o› v™ ~— †– ” š’ ¦‘ ³ Åâ‹ö‰ÿˆÿ‡ÿ‡ÿ‡ÿöç Ö$È%¿"¹´± ª¥'¡3>šG˜O•V“\‘ciŽpŒx‹‰‹‡–†¢„°ƒÁÝô}ÿ|ÿ|ÿ{ÿ{ÿï!Ý)Ê-¾/µ,®'¨ £ž™!”-‘8ŽA‹I‰P‡W…^„d‚k€s|}†|‘zžx«w¼v Ôt!ðr!ÿq"ÿq!ÿq!ÿq!ÿè(Ò0Â5·7­5¥1ž+˜#’ ‰!'†"2ƒ#<#D~#K|$R{$Yy$_w$fv%nt%ws%q&o&™n&§m'¸l'Îj(íi)ÿh)ÿh)ÿh(ÿh(ÿá.Ë6¼;±=§=Ÿ9—3-ˆ' ƒ'("|)-y*7w*?u*Gs+Nq+Tp+[n+bl+jk,ri,}h,‰f-–e-¤d.´c.Êa/é`/ý`/ÿ`/ÿ`/ÿ`.ÿÚ4Å<·A¬C¢C™@:ˆ4€.z-w.s/)q03o0;m0Ck1Ji1Qg1Wf1^d1fc2oa2y`2…_2’]3¡\3±[4ÆZ4æY5ûY5ÿY4ÿY4ÿY4ÿÒ8À@³E¨HžH•F‹@‚;y5s3o4l4%i5/g57e6?c6Fb6M`6T_6[]7c\7k[7vY7‚X8V8žU8¯T9ÃS9äS:ùS9ÿR9ÿS9ÿS9ÿÍ<¼D¯I¤LšL‘K‡F}@s;l8 h9e9"c:+`:4^:<]:C[:JZ;PX;XW;`V;hUÁM>áM>øM>ÿM>ÿM=ÿM=ÿÉ@¸H¬M¡P—QŽO„KyEn@f= b=_=\>(Z>1X>8W>@U?FT?MS?UR@]P@fO@pN@|LAŠKAšJA«IB¾HBÞHBöHBÿHBÿHAÿHAÿÅDµK©PžT•T‹S€PuJjFaB\AYBWB%UB.SB5QB=OBCOCKNCRMDZKDcJDnIEzGEˆFE˜EF©DF½CFÜCFõCFÿCFÿCEÿCEÿÁG²O¦TœW’XˆX~UqOfJ\FWFTFQF"OF+NF3LG:KGAJGIIHPHHXGHaEIlDIxBI†AI–@J§?J»>KØ>Jó>Jÿ>Iÿ?Iÿ?Iÿ½J¯R£X™[]†\{YmSbOWLQJ NJLKJK(IK0GK8FL?ELFDLNCMVBM_@Mj?Mv=N„RT2]F1^N0^W/^b-^n,_}*_Ž)_ (_³'_Ì'_í'^ÿ']ÿ(]ÿ(\ÿ­\¢d˜jŽnƒoyonn`kTiIg?e5c 2c0c/d!.d)-d1,d9+eB*eJ(eT'e_&fk$fz#f‹"f f±fÉfë eþ dÿ cÿ!cÿ©bžj•pŠs€uuuit\rOqDo:n0m)l 'l&l%m$$m,#m4"m=!nF nPn[ngnvn‡ošo®oÆnémülÿkÿkÿ¤išqv†y|{q{d{WzJy?x5x+w"vvwww&w.w7x@xJxVxcxrxƒx—x«xÃwævúuÿuÿtÿŸq•x‹|‚wj‚]‚P‚D‚8‚.‚$‚‚‚ ƒƒƒƒ'ƒ0 ƒ9 ƒD ƒP ƒ] ƒlƒ~ƒ‘‚¥‚»Ûò€ÿÿÿšy~†ƒ}…o‡b‰UŠI‹=Œ1Œ&ŒŽ  )2=IVevŠŽŸŽ´ÏŒîŒû‹ÿ‹ÿ”€‹…‚‰tŒfY‘L“@•4–(–—˜š ›œ œœœœ"+5@N\nœœ—œ¬›Æšè™ù™ÿ˜ÿŽˆ†Œxj”\—OšB6ž)Ÿ¡¢¤¦¨©© ©©ªª"«+¬6¬D¬S¬c¬w«Ž«¤«¼ªÞ©ô©ý©ÿ‰Ž{“m—_œQ D¤6¦*¨©« ®°²µµµ¶ ·¸¸º!»+¼8½G½X½k½½™½°½Ì¼ê¼÷»þ~•p›b S¥Fª8­*¯±´ ·¹¼¿ÂÂÃÄÆÇ ÈÊÌ Ï+Ð:ÑKÑ^ÒsÒ‹Ò¤Ó»ÓØÓíÓösd£V©G¯9³*¶¹¼ ¿ÃÆÉÍÏÐÒÔÖÙÛÞáäè*è<éOédê|ë•ë¬ëÂìÕìåf¦X¬I³;¹+¼ÀÄ ÈÌÏÓÙÝàáãåçêìîñ õøû+ý>þSþjÿƒÿ›ÿ®ÿ¾ÿÊÿÿÿÿÿÿ&ÿ4ÿAÿMÿXÿbÿkÿsÿzÿÿ‡ÿÿ“ÿ™ÿ ÿ§þ¯üºúÉùáøó÷ÿöÿõÿñÿéÿäÿáÿÿÿ ÿ ÿÿÿ!ÿ.ÿ<ÿHÿSÿ]ÿfþmüuû{ù‚øˆ÷Žö”ô›ó¢ñªï´íÁëÕêìèüçÿåÿæÿàÿÙÿÔÿÿ ÿÿÿ ÿÿÿ)ÿ6ÿBûN÷Wô`òhïoívì|ê‚èˆçŽå•ãœá¤ß®Ý¹ÚÊ×äÔöÑÿÐÿÐÿÏÿËÿÇÿÿÿÿÿÿ úö#ó0ð<íGéQåZâbßiÝoÚvØ|Ô‚ÒˆÐ͖˞ɨdzÅÁÂØÀï¿þ¾ÿ½ÿ¼ÿ¼ÿ¼ÿÿÿÿÿôíèã)ß5ÛAÖKÑTÍ\ÊcÈiÆoÃuÁ{¿‚¾ˆ¼º˜¸¢µ¬³¹±Ë¯ç®ø¬ÿ«ÿ¬ÿ¬ÿ«ÿÿÿöîçß ÖÏ"Ê.Ç:ÃDÀM¼U¹\·cµi³o±u¯{­‚«Š©’§œ¥¦£³¡ÃŸÞžòÿœÿœÿ›ÿ›ÿÿö é ß ÕÎÆÀ»'·2³=°F­OªV¨\¦c¤h¢o¡uŸ|„›™——¢•®“½‘ÓíüŽÿÿÿÿùêÜÍľ º ´®ª*¦5¢? HP›V™\—c•i“o‘vŽˆŒ’Šžˆª†º…Ï„ ë‚ ü ÿ€ ÿ€ ÿ€ ÿñàÍ Á!¸±¬¨ ¢ #™ .• 8“ A IŽ PŒ WŠ ]ˆ c‡ j…qƒz‚„€~›|¨{¸zÎxìvÿuÿtÿtÿtÿèÓ&Ã*¸*®(§# ›–Œ'‰2†;„C‚K€Q~W|^{eylwtv~tŠr–q¤o´nÉmèküjÿjÿjÿjÿà&Ê-¼1°3§1Ÿ,—&Š …"~,{6y>wEuLsSqYp`ngmpkzj…h’g e °d!Åc!äb"úa"ÿa"ÿa"ÿa"ÿ×,Ã4¶8ª9¡8˜5/ˆ(€!{ w!t"'q"1o#9m#Ak#Hi#Nh$Uf$[e$cc%kb%ua%_&Ž^&]'­[(Á[(àZ)÷Y)ÿY)ÿY)ÿY(ÿÏ2¾9±=¦?œ?“<Š60y*r&n'k(#i(,f)5e)<c)Ca*J`*Q^*W]*_\+hZ+rY,}X,‹V-šU-ªT.½S.ÜR/õR/ÿR.ÿR.ÿR.ÿÊ6º=­B¢D˜DA…<{7r1k, g-d-a.(_.1].9\/@Z/FX/MW/TV0\U0dS1nR1zQ1ˆP2—N2¨M3»M4ØL4óL4ÿL4ÿL3ÿL3ÿÆ:¶B©FžI•I‹GBw=m7d2 `2]2Z2%X3-V35U3<S4CR4JQ4QP4YO5aM5lL6wK6…J7•H7¦G8¸G8ÓF8ñF8ÿF8ÿF8ÿF7ÿÁ>²E¦JœM’MˆK~GsBi=_7Z6W7T7"R7*P72O89M8@L8GK8NJ9VI9_H:iG:uE;ƒD;“C<¤B<¶A=ÐA=ðA=ÿA<ÿA<ÿA<ÿ¾B¯I£N™PQ…P{LoFeBZ=T;Q;O;M;'K;/I<6G<=G\C>gB?s¹(@???‘>@¢=@µCe=Cq;C:D9D 8E³7EË7Eì7Eÿ7Dÿ8Dÿ8Cÿ·I©PžU”X‹Y€XvVhP]LSHJE FDDDBD"AE)?E1>E8=E?I=I;J&:J.9J58K=7KD6KM4LV3L`2Ll1Mz0M‹.Mœ-N¯,NÇ,Né,Mý-Mÿ-Lÿ-Lÿ°P¤X™]a†b{ap_b[XXNUCQ;O 8O6O5O#4P+3P22P:1PB0QJ.QS-R],Ri+Rx)Rˆ(Sš'S­&SÅ&Sç&Sü'Rÿ'Qÿ'Qÿ¬U \–bfƒgxfme`aU^J[?X5V1U0V.V-V',V/+W6*W>)WG(WP&XZ%Xg$Xu#Y†!Y˜ Y«YÂYåXú Xÿ Wÿ!Wÿ¨Zb“gŠkluljk]hQeFc;`1^*] (]&]%^#$^*#^2"^:!^C _L_W_c`q`‚`•`©`À`â_ù^ÿ^ÿ]ÿ¤`™hn†p|rrrfqXnLlAk6i-g#fffff%f-g5g>gHgSh_hnhh’h¦h½hàg÷fÿeÿeÿŸg–oŒs‚vxxmx`wSvFt;s1r'qqp pppq'q/q8qBqN q[ qi qz qq¡q¶pÒpïoÿ nÿ nÿ›o‘u‡y~|t~f~Y~M~@}5}*|!||| | | ||!|)|2|=|H|U|c|t|‡{œ{±zËyëyúyÿxÿ–wŒ|ƒ€yƒl„^…Q†E‡9‡-‡#‡‡‡ ˆ‰ ‰‰ˆˆ#‰,‰6‰BˆNˆ]ˆmˆ‡•‡«†Ä…æ„ø„ÿ„ÿ~‡ƒ~‡q‰c‹VI<‘0‘$‘’“ ”•–– •–––$–.–9–F–U–e–x•Ž•¤”¼“ß“õ’ÿ’ÿ‹†ƒŠugY”L—?™2š&›œ Ÿ ¢£££ £¤¤¥%¦/¦<¦K¦[¦n¥„¥›¤³£Ð£ï¢ü¢ÿ†x‘j•\™NA 3¢&£¥§ ©«­¯°°°± ²³´µ$·0·?·P·b·x·¶©¶Â¶ä¶õµþ{“m˜_P¢B¦4©&«­¯ ²´·º¼½¾¾ÀÁ ÄÆÉ$Ê2ËCËUÌj̜̃˵ÌÎÌéÌöp›a¡R¦D«6°'²µ¸»¾ÁÄÈËËÍÎÐÒÕØ ÛÞâ$ã5äHå\æsææ¥æ¼æÓççc¤UªF°8µ(¹¼ÀÄÇËÏÔØÜÝßáãåèêíñõø%ù8ùMúcû|ü•üªü»ýËÿÿÿÿÿÿ#ÿ0ÿ=ÿIÿTÿ^ÿfÿnÿvÿ|ÿ‚ÿ‰ÿÿ•þ›ý£û«úµùÃ÷ÛöðôÿóÿòÿìÿâÿÜÿÖÿÿ ÿ ÿÿ ÿÿÿ+ÿ8ÿDÿOÿYþaüiúpøw÷}öƒô‰òñ–ïí¥ì¯ê¼èÍæèäúãÿâÿàÿÕÿÎÿËÿÿÿÿÿÿÿÿ%ý2û>÷IóSð\îcìjêqèwæ}äƒâ‰àÞ—ÜŸÙ©Ö´ÓÄÐÞÎóÌÿËÿÊÿÈÿÂÿ¾ÿÿÿÿÿû öñ í,ê8çCãMàVÜ]ÙdÕkÒqÐvÎ|̃ʉȑƙģÁ­¿»½Ï»ë¹ü·ÿ·ÿ¶ÿ´ÿ±ÿÿÿÿöîçáÛ%Õ1Ò<ÎFÊOÇWÄ^Ád¿j½p»v¹|¸ƒ¶Š³“±œ¯§­³«Å©á§õ¦ÿ¥ÿ¤ÿ¤ÿ¤ÿÿüñèàÔ ÌÇÂ*¿5¼?¸HµP³W°^®d¬i«o©u§|¥„£Œ¡–Ÿ¡­š¼˜Ò—î•þ”ÿ•ÿ•ÿ•ÿüðãÕÌž¸³#¯.«8©A¦J£Q¡WŸ]c›išo˜v–}”†’›Ž§Œ¶ŠÉˆç‡ù‡ÿ†ÿ†ÿ†ÿô äÑŽ¶±«¦¡&ž1š:˜C•J“Q‘W]ŽcŒiŠpˆw†€„‹‚–€£~±}Ä{ázõzÿyÿxÿxÿêÖÆº±ª¤ Ÿ ™•‘)3‹<ˆD†K„Q‚W]c}j{rz|x †v ’t  s ¯q Áp ßo önÿmÿmÿmÿáË#¼&±&¨$ ™“Ž ˆ „ " ,~ 5|=zExKwQuXs^qepnnwl‚kih­fÀeßdöcÿcÿbÿbÿÖ$Ã*µ.ª/ -˜("‰‚}yv's0q8o?mFlLjShYgaeidrb~a‹_™^©\¼\ØZóZÿYÿYÿYÿÍ*½1¯5¤6›4’1‰+%ysol"i+g3e;dAbH`N_U]\\d[nYyX‡V –U ¦T!¸S!ÒR"ñR#ÿR#ÿR"ÿR"ÿÈ/¸6«: <–;8ƒ2z-r&j f c!a!&_"/]"6["=Z#DX#JW#QU#XT$aS$jQ%vP%ƒO&“N'£L'µL(ÎK(îK)ÿK(ÿK(ÿK(ÿÃ4³;§?œA’@‰>9u3l-c'^&\&Y'"W'+U(2T(9R(@Q(FP)MN)UM)]û…±L*gK*sI+€H+G,¡F-³E-ËE.ìD.ÿD.ÿE-ÿE-ÿ¾8°?¤C™EE…C{>q9g4^.X+U+R,P,'O,/M-6L-<J-CI-JH.RG.ZF/dE/pC0~B0A1ž@2±?2È?3ê?3þ?2ÿ?2ÿ?2ÿ»<­C¡G–IŒIƒHxDm>c9Z4R0 O0L0J0$I1+G12F19D1@C2GB2OA3X@3b?4m>4{=5‹<6œ;6¯:7Æ97è97ü:7ÿ:6ÿ:6ÿ·@ªFžK”MŠN€LuHjC`>V9M5 I4G5E5!C5(A5/@56?6=>6E=7M<7U;8`:8k99y89‰7:›5:­5;Ä4;æ4;û5;ÿ5:ÿ5:ÿ´C§JœN’QˆR~PsMgH\DR?H:D9A9?9>9&<9-;:4::;9;B8;J7‡1>™0?«/?Â/?ä/?ú0?ÿ0>ÿ0>ÿ±G¤M™RU†V|UqRdLYIOEE@?> <>:>9>#7>*6?15?84?@3@H2@Q1A[0Ag.Bu-B…,C—+Cª*CÀ)Dâ*Cù*Cÿ+Bÿ+Bÿ®J¡Q—VYƒZyZnWaRWNMKCG:C 6C4C3C 2D'1D/0D6/E=-EF,EO+FY*Fd)Gr(Gƒ&G•%H¨$H¾#Hà$H÷%Gÿ%Gÿ&GÿªOŸU”Z‹^_w^k\_XUUKQ@M5J0I.I-I,I$+J+*J3(J;'KC&KL%KV$Lb#Lp!L€ M“M¦M»NÝMöLÿLÿ Kÿ§SœZ’_ˆc~dtcia\^R[GXf3e)c a` ````&`.a7a@aKaX af bv b‰ a a²aËaë `ý _ÿ _ÿ›f’mˆq~suujt\sOrCp8o-n$lkkj j j j! j) j2j<kGkSkakqj„j˜j­iÆiçiøhÿhÿ—ms„w{zp{c{VzIz=y1x'wvvv v vvvv$u,u6uAuNu\ulu~t“t¨sÀsãr÷rÿqÿ’u‰z€~v€i[‚N‚A‚5ƒ)‚‚ ‚ƒ‚ ‚‚‚‚&‚/‚;‚G‚Uex€¢ºÝ~ô}ÿ}ÿ|„{„n†`ˆRŠE‹9Œ,Œ!ŒŒ Ž (2?M]p…ŽœŽ³ÐŒð‹þ‹ÿˆ„€ˆr‹dVH“;•.–"–—˜™› žžŸŸ) 5 C T fŸ{ž“ž«Æéœùœÿƒ‹uŽg’Y–K™=œ0ž#Ÿ ¢¤¦¨ªªª««¬ ­®¯±)±8±H±Z±o±ˆ± °º¯Ý¯ò¯ýx‘j–\šMŸ?£1¦#§©«®°²µ··¸¹º¼½ ¾ÀÃÅ+Å<ÆNÆbÆzƔƭÆÈÅåÅól™^žO¤A¨2¬$¯± ´·º½ÀÄÆÆÈÉËÌÎÐÓ ØÜÞ-ß@àTáká…áŸá·áÏáæ`¡R§C­4²%µ¹ ¼¿ÃÇÊÏÓÖ×ÚÜßáãæéì ðóô1öF÷\øtøù¦ù¸øÉÿ ÿ ÿ ÿÿÿÿ,ÿ9ÿEÿPÿYÿbÿjÿqÿwÿ~ÿ„þŠýü—úžù§÷±ö¾õÒóìñþðÿðÿæÿÜÿÒÿÍÿÿÿÿÿÿÿÿ'ÿ3ÿ?ÿJþTû]ùd÷kõróxò~ð„ïŠí‘ì™ê¡è«æ¶äÇâãà÷ÞÿÝÿÙÿÌÿÅÿÁÿÿÿÿÿÿ ÿü"ù.ö9óEïNìWé^æeälâràwß~݄ۋؒ՛Ҥϯ;ËÕÉïÇÿÅÿÄÿ¾ÿ¸ÿµÿÿÿÿþ÷ ñëç(ä3á>ÝHØQÓXÐ_ÎeÌkÊqÈwÆ}ĄŒÀ”¾ž»¨¹¶·Èµæ³ú±ÿ°ÿ°ÿ¬ÿ©ÿÿÿúñèà ØÑ"Í-Ê7ÆAÂJ¿R½Yº_¸e·jµp³v±}¯…­«—©¡§®¥¾¢Ø òŸÿžÿžÿžÿœÿÿ÷ëáÖË Å¿»&·1´:±C®K«R©X§^¦d¤i¢p vž~œ†š˜›–§”¶’ÊéüŽÿÿŒÿÿøéÛÌĽ¶ °« §*¤4¡<žDœKšR˜X–]•c“i‘pw€‹Š‰•‡¡…¯ƒÁà€õÿÿÿÿî Üʾµ ¯©£ž™#–,“5>ŽEŒKŠQˆW†]…cƒjqz}„{yœwªu»tÔrðrÿrÿqÿqÿãÍ¿³ª£ — ‘‰%…/ƒ7€>~E}K{QyWx]vdtkrtpn‹l˜k¦i·hÎgìfýf ÿe ÿe ÿÖÄ ¶#«#¡ ™’Œ† €|y(v0t8r ?p Eo Lm Rl Xj _h gg pe zc ‡b •` ¤_ ¶^ Î\í\ÿ[ÿ[ÿ[ÿÍ!¼(¯+¤+š)’$‰‚{u q n!k*i2g9e@dFcMaSuÎ^˜_Z^b\k[vYƒX’V¢U´TËSìRÿRÿRÿRÿÆ(¶.©2Ÿ2•1Œ-ƒ'z!rk gda%_-]4\;[BYHXOVVU^SgRrPOŽNŸL°KÇKéJýJÿJÿJÿÁ-±4¥7š87‡4}/t)l#d^[Y!W)U0T7R=QDOKNRMZKcJnI|G‹F œE!®D!ÄC"æC"üC"ÿC"ÿC"ÿ¼2­8¡<—>=ƒ:y5o0f*^$W T Q O!%N!,L!3K":I"@H"GG"NF#WD#`C$kB$yA%ˆ?&™>&«='Á='ã=(ú=(ÿ='ÿ='ÿ¸6ª=ž@”BŠB€?v;l6b0Y*Q% M%K%I%!G&(E&/D&6C&=B'DA'K?(T>(]=)i<)v;*†9+—8+©7,¿7,à7,ø7,ÿ7,ÿ8,ÿµ:§@œD‘F‡F}Ds@h;_6U1L+G)E*C*A*%?*,>+3=+9<+A;,H:,Q9-[8.f6.s5/ƒ4/•30§20½11Þ11÷21ÿ20ÿ30ÿ±>¤D™HJ…J{IpEe@[;R6H1B. ?.=.;."9/)8//7/660>50F41O31Y22d12q03/4“.4¦,5»,5Û,5õ-5ÿ-4ÿ.4ÿ®A¢H—LNƒNyMnJbEX@N<E7=3 93736343&33-24414<05D/5L.6V-6b,7o+7*8‘(8¤'9¹&9Ø'9ô(9ÿ(8ÿ)8ÿ«EŸK”O‹RSwRlO_IVFLBB=88482818/8$.8+-92,99+:A*:J);T(;_'Ô!>ó"=ÿ#=ÿ#<ÿ¨IO’S‰VWuVjS]OSLJH@D6@/= -=+=*>!)>((>/'>7&??$?H#@R"@]!Aj AzAB BµBÑBñBÿAÿAÿ¥MšSX†[}\r[gX[TQRHN=J3G*C &C%C$C#D%"D,!D4 E<EEEOFZFhFxGŠGžG³HÎGïGÿFÿFÿ¢R—X]„`zap`e^YZOXDT9Q/N&K JJJJ!K(K0K8KBLLLWLeMuMˆMœM±NÌMîMÿLÿLÿžW”]‹bewfmfcdVaJ^?[5X+V"TR RRRR$R,R4R>SHSTSb Tr T„ T˜ T­TÅ Tç Sû Rÿ Rÿ›]‘dˆh~ktlkl_jRgEd:b0`&^][Z ZZ [ [' [0 [: [E[Q[^[m[€[”[¨[ÀZâZöZÿYÿ—dŽk„n{prrgqYpLn@l5k*i!gff e eedd#d,d5d@dLdZdid{dc¤c»bÝbôbÿaÿ“l‰q€uxwmx`wRvFu9t.t#rqq qqp ppoo&o0o;oGoTodounŠm m¶lÖkòkÿkÿŽs…x}{s}e~X~K~>~2~&}|| |}}| ||||!|)|4{@{N{^{oz„zšy±xÎwïvþvÿ‰zx‚kƒ]…O†B‡5ˆ)‡‡‡ ˆ‰ŠŠ‰‰ ‰‰‰Š"Š,Š8ŠF‰V‰h‰|ˆ”‡«†Æ…ê…û„ÿ…‚}†oˆa‹SE8‘+‘’’ “”–—˜——— ˜˜™™"š.š=™M™^™s˜‹˜£—¼–â–÷•ÿ€‰rŒdV“H–:™,š›œ žŸ¡£¥¥¥¥¦§§ ¨©«#«1«A¬S¬g«€ªšª³ªÐ©ï©ûug”Y˜Jœ<Ÿ-¢ £¥ §©«®±²²³´µ¶¸¹ »½¿$¿5ÀGÀ[ÀrÀÁ¦ÀÁ¿ã¾ój—[œM¡>¥/©!«­ °³µ¸¼¿ÁÁÃÄÆÇÉËÎÑÕØ'Ù9ÚMÛdÛ~ܙܰÜÉÜã]ŸO¥@ª2¯"²µ ¸»¿ÃÆËÎÑÑÔÖÙÛÞàäçëïð*ò?óUômôˆô¡ô¶ôÇÿ ÿÿÿ ÿÿÿ(ÿ4ÿAÿLÿUÿ]ÿeÿlÿrþxü~û„ú‹ù’÷™ö¢ô¬ó¹ñËðèîûíÿìÿáÿÒÿÉÿÄÿÿÿÿÿÿÿÿ#ÿ/ÿ;ýFúP÷Xô_òfðlïríxì~ê…éŒç“åœã¦á±ßÁÝÝÛôÙÿÖÿÏÿÄÿ½ÿ¹ÿÿÿÿÿÿ ü÷ô*ò5î@éJæRãYà`ÞfÜlÚr×xÔ~Ò…ÐΕ̟ɪǸÅÍÃëÀþ¿ÿ¾ÿ¶ÿ°ÿ­ÿÿÿÿùòëæá$Þ/Ú9ÓCÏLÌSÉZÇ`ÅfÃkÁq¿w½~»†¹Ž·˜µ£³°±Â®à¬÷«ÿªÿ¨ÿ£ÿ ÿÿÿõëáÖ ÏÊÆ)Â3¿=»E¸M¶T³Z±_°e®j¬p«w©§‡¥‘£œ ©ž¸œÎšî™ÿ—ÿ–ÿ–ÿ“ÿýñåÙÍĽ·³"°,­6©>§F¤M¢S YŸ^d›jšp˜w–€”Š‘•¢°‹Ã‰ãˆù†ÿ†ÿ†ÿ†ÿóãÑŽ¶® ¨¤ &œ/š7—?•F’L‘RX]‹cŠjˆq†y„ƒ‚›~©|»zÕxòxÿwÿwÿwÿçÑ Ã ¸ ®¨¢›–’Ž(‹1ˆ9†@„F‚L€R´Ÿ`W}]{czkxsv}tˆq•p¤n´lÊkêjüjÿjÿjÿÚÆ¸­¤œ– Š…!~*{2y9w@uFsLrQpWn^mekniwgƒe‘cŸb¯`Ä_ä_ø^ÿ^ÿ^ÿν° ¥›“‹„ ~ yur#o+m3k:i@gFfLdRcYa`_i^s\ZYœW­VÁU áT öT ÿT ÿT ÿƶ%©(ž(”%‹!ƒ{tn if d %b -` 4^ :] @[ GZ MX TW \U dT oR {PŠOšN¬LÂLãKùKÿKÿKÿ¿&°+¤/™/-†)}$tle_\ZX'V.T5S;RBPHOPNWL`KkIxH‡F—E©D¾CßCøCÿCÿCÿº+«1 4•5‹41x+o&f ^W TQO#N*L1K7I>HDGLETD]CgAt@ƒ?”=¦<»;Û;ö<ÿ<ÿ<ÿµ0¨6œ9‘;‡:~7s2j-a'Y!Q LJHF&E-C3B:AA@H>P=Y<d;q9€8’7 ¤6 ¸5!Ö5!ô5"ÿ5!ÿ6!ÿ²4¤:™>?…?{<p8g2]-T(L"FCA?"> )= 0; 6:!=9!E8"M7"W6#b4#n3$~2$1%¢/%¶/&Ò/&ò/&ÿ0&ÿ0&ÿ¯8¢>–BŒC‚CxAn=c8Z3Q.H(@$ =#;$9$8$&6$,5%34%:3&B2&J1'T0'_/(l.({,)+* **´)*Ï)+ð*+ÿ**ÿ+*ÿ¬<ŸB”FŠG€GvElBa=W8N3D.<) 7(5(3(2(#0()/)0/*7.*?-+H,+R+,]*,j(-y'-‹&.ž%.³$/Í$/î%/ÿ%/ÿ&.ÿ©?E’IˆK~LtJjG^BT=K9A48/2- 0-.--- +-'*..).5)/=(/F'0O%0[$1h#1w"2‰!23±3Ë3í3ÿ 3ÿ!2ÿ¦CšIM†O|PsOhL\FRCI??;66.2 +2)2(2&2$%3+$32#4:"4C!5M 5X6e6u7‡7›7¯8È8ë8ÿ7ÿ7ÿ£G˜MŽQ„S{TqSfPZLPIGE=A3=*9 %7#7"8!8" 8(80989A:K:V;c;r;…<™<­=Æ=é<ý<ÿ;ÿ K•Q‹U‚XyYnXdVXQNOEK:G0C'@ > >>>>%>-?5?>?H@S@`ApA‚A—A¬BÄBçAüAÿ@ÿP“V‰Z€]v^l]b[VWLUAQ6N,K#HE DDEE"E)E1E;FEFPG^ Gm G G“ G§G¾Gà Gö Fÿ FÿšU[‡`}bscjb`aS^GZUJVWVeUwU‹U U¶TÔTñSýSÿ“bŠh€lwnoocnVlIj=h2f'ecba `` ____&_/_:_E_S_a^r^‡]œ]²\Ï\ï[ý[ÿj†o}rutju]tOsBr6p+o nml lkk jjjj!i*i4i@iNi\imh‚h˜g®fÊeíeüdÿ‹q‚vzyp{b{U{Hz;z/z#yxw wwwwv vvvv#v.u:uGuVuht|t’sªrÄqépûpÿ†y}vhZ‚L‚?ƒ2„%ƒƒƒ ƒƒ„…„ƒƒ ƒƒ„„&„2„?ƒOƒ`‚u‚Œ¤€½ã~ù~ÿ‚€z„l†^ˆPŠB‹5'Ž Ž‘’’’’’’ ’““”(”6”E“W“k“‚’œ‘¶Øóÿ~‡pŠaSE“7•)–—˜ ™›œž    ¡¡¢ £¤¥¦*¦:¦L¥`¥x¥’¤¬¤É£ë¢úsŽd‘V•G™9œ*ž ¡£¥§©¬®®®¯°±²³µ ·¹¹.º@ºT»jº…¹¡¹»ºÞ¹òg•X™Jž;¢,¦¨ª¬¯±´¸»¼¼¾¿ÀÂÄÆÈË ÏÑ Ñ2ÒFÓ]ÔvÔ’Õ«ÕÄÔâ[L¢=§/¬¯±µ¸»¾ÂÇÊÌÌÎÐÒÕØÛßâæ ëì$í8îNïgð‚ðœð²ñÅÿÿÿÿ ÿÿÿ$ÿ0ÿ<ÿGÿQÿYÿ`ýgümúsùyøö…õŒó”òð§î³ìÄëáêøéÿçÿÙÿËÿÂÿ½ÿÿÿÿÿÿ ÿÿ ÿ+þ7úBöKòSð[îaìgêmèsçyåã†áŽß–ݠ۬ػÔÑÓðÐÿÎÿÈÿ½ÿ¶ÿ²ÿÿÿÿÿý÷óï&í1è;ãEàMÜUÙ[ÖaÓgÑlÏrÍxËɇÇŚåÀ²¾Å¼åºû¸ÿ·ÿ°ÿ©ÿ¥ÿÿÿþõìå ßÚ Ô*Ð5Ë>ÈGÅNÂUÀ[¾a¼fºl¸r¶xµ€³ˆ±’®ž¬ª©»¨Õ¦ó¤ÿ£ÿ¡ÿ›ÿ˜ÿÿûðåØÎ Ǿ$».·8´@±H®N¬TdÂ"ªZ©_§e¥k¤q¢x ž‹œ–™£—²–Ç“è’þ‘ÿÿÿ‹ÿùëÝÏÆ¼µ °¬¨(¥1¢9ŸAH›N™S—Y–^”d’jqŽzŒƒŠˆœ†ª„¼‚Üö€ÿÿÿ~ÿìÚɾ¶®§ ¡œ˜"•*’2:A‹G‰M‡R†X„]‚dks}}{ˆx•v£u´sÌqípÿpÿpÿpÿßÊ ¼ ± ¨¡›” Ї$„,3:}A{GyLwRvWt]rdpmovl‚jig®eÃdäcúcÿbÿcÿп²§• ‰‚~zv%t-q4o:n@lFjLiRgXf_dgbq`|^‰\˜[©Y¼XÜXôXÿWÿWÿƶªŸ•…~ w rnjh'e.d4b;`@_F]L\SZZXbWlUwS…R”P¥O¸NÒMðMÿMÿMÿ¿°"£%™%"…}un g c_]![(Y/W5V;TASGQNPUN^MgKsI H ’G £E ¶D ÐD ïC ÿC ÿD ÿ¹$ª)ž,”,Š*€&w!nf_Y U S Q "O )M /L 6K <I BH IF QEZDdBp@?>¢<¶;Ñ;ñ;ÿ;ÿ<ÿ´)¦/š22†1|-r(i#aYQLJHF$E+C1B7A>@E>M=V<a:m9|76Ÿ5³4Í3î4ÿ4ÿ4ÿ¯.¢4—7Œ8‚6x4n.e*\$TLF B@? ='<-;49:8B7J6S5^3j2y0Š/.±-Ê-ì-ÿ.ÿ.ÿ¬2Ÿ8”;Š<€<v9k4b/Y*P%G@ <:86#5)40372>1G/P.[-g,v*ˆ)›(®' Ç& ê' þ( ÿ( ÿ©6<’?‡A}@t>i:_5V0M+D%; 6320 /&.--4, ;+ D*!N)!X'"e&"t%#…##™"$­!$Å!%è"%ý"$ÿ#$ÿ¦:š?C…E{DrCg?]:S6J1A,8&1# .","*")"#(#*'#1&$9%%A$%K#&V"&c!'r'ƒ(—(«)Ã)æ)û)ÿ(ÿ£>˜CGƒIzIpGfDZ?Q;G7>25-,( ('''%'$'!#('"(.!)6 )?*I*T+`+o,,•-©-Á-ä-ú-ÿ-ÿ¡A•G‹K‚MxMnLdIXDO@F==834*/$, !, ,--%-,.4.</F/Q0^0m11“1¨2¿2â2ù1ÿ1ÿžE“K‰O€QvRmPbNVIMFDC;?1:'62 2222"3)314:4D4O5\5k6}6‘6¦ 7¼ 7Ý 6ö6ÿ6ÿ›I‘O‡S~VuVjU`SUOLLBI8E.A$=:88899&9.97:A:L ;Y ;h ;z ; <¢<¸<Õ<ð ;ÿ ;ÿ˜NŽT…X|[r[hZ^XSUIR>N4K*G!DB@ ??? @# @+ @4 @> AJAVAeAvAŠAŸA´AÐAîAü@ÿ•TŒYƒ^y`p`f`]^Q[EW:T/Q%OLJH GGGG H(H1H;HGHSHbHsH†H›H±GÌGíGûGÿ’Z‰`€cwenfefYdL`@]5[*Y WUS RQ PPPP%P.P8PCPPP^PoPƒO˜O®NÉNëMûMÿa†f}itllmakSiFg:d/c$a_^ \\[ ZZZY!Y)Y3Y?YLYZYkX~X”W«WÅVéUûUÿŒh‚mzprrgrZqLp?n3m(kjh ggff e eddd$d.d:cGcUcfczba§`Á_æ_ú^ÿ‡otxwnx`xRwEw8v+v tssrrrqq qpppp'p3o@oPo`ntn‹m¢l¼kâjøiÿƒw|{s}e~WI</€"~~~~~~ ~ ~~~ ~+}9}H}Y|m|„{œz¶yÚxõwÿ€w‚iƒ[…M†?ˆ2‰$‰‰‰Š‹ŒŒŒŒŒ Ž"Ž/Ž?PdŒ{Œ•‹®ŠÍ‰ï‰ÿ{…mˆ^ŠPB4‘&’“”•–˜š›››››œ žŸ $ 4 F YŸpŸŠž¥žÂèœùpŒaS’D–6™'›œŸ¡£¥¨©©©ª«¬­®° ²³´'´9µM´d´~³š³´³Õ³ðd“U—G›8Ÿ)¢¤¦¨«­°´¶¸¸¹º¼½¿ÀÃÅÉÊË,Ì@ÍVÎǫ͋ÌÂÌâX›I :¥,©«®±´·º¾ÃÆÈÈÊËÍÏÒÕÙÝáæçè2éHê`ë{ë—ì®ìÂÿÿÿÿÿ ÿÿ!ÿ,ÿ8ÿCÿLþTû[úbøhönõtôzò€ñ‡ïí—ë¡é­ç½åØäóâÿàÿÐÿÄÿ¼ÿ¶ÿÿÿÿÿÿ ÿÿý'ù2õ=ñFíOëV$ z£è\æbähãnásßy݀ڈؑԛҦϴÌÉÉéÈÿÇÿÁÿ·ÿ¯ÿ«ÿÿÿÿÿøòîê"æ,á7Ý@ØIÓPÐVÎ\ÌbÊgÈmÆsÄyÂÀо”¼Ÿ¹¬¶¾´Ý³÷±ÿ°ÿ¨ÿ¢ÿžÿÿÿùïæß ÖÐÌ&È0Ä:ÀB½J»P¸V¶[µa³f±l°r®z¬‚©Œ§˜¥¥£´ ËŸîÿœÿ™ÿ”ÿ‘ÿÿöêÝÏÇÀ»· ³*°3­;ªC§I¥O£U¢Z _žek›r™{—…”’¬Ž¿Œâ‹ú‰ÿ‰ÿ†ÿƒÿôäÔÈ¿µ® ©¥¡#ž,›4˜<–C”I’NSŽY^‹d‰k‡s…}ƒˆ•¤}µ{ÏyñxÿwÿwÿuÿåÑø¯¨ š•‘Ž&‹-ˆ5†<„B‚G€MR}X{^yexmvvsqŽom®lÄjçiýhÿhÿiÿÕö«¢›” ˆƒ |'z.w5u;tArGpLoRmXk_ifgpe{cˆb—`§^»]Ü\ö\ÿ[ÿ[ÿÉ ¹¬¡— ˆ‚{ wso!l(j/h5g;eAcFbL`R_Y]a[jYuW‚U‘T¢SµQÏPïPÿPÿPÿ¿°¤™‡ wqkgda"^)]/[5Y;XAVFUMSTR\PeNpL}KIžH°GÇFéFûFÿEÿ¸ª ž"“"‰€woh a ]YVT#R*P0O5N;LAKHIOGWFaDlCyA‰@š>­=Ä<å<ø<ÿ<ÿ²"¥'™)Ž)„'{#qiaZ S OLJH$G*E0D6C=AC@K> S= ]; h: v8 ‡7 ™5 ¬4 Â3 ä3 ù3 ÿ4 ÿ­' ,•/‹/€.w*m%d \TLF C A ? > %< +; 2: 88 ?7G6P4Z3f1t0….˜-«,Ã+å,ú,ÿ-ÿª,1’4‡5}4t1j+`'X!OG@ ;976!4'3-241;0C.M-W,c*q)‚'•&©%À$ã%ú&ÿ&ÿ¦1š69…:{9q6g1]-T(L"C;5 21/.$,*+1*8)@(J'T&`$o#€!“ §¾àø ÿ ÿ£4˜:=ƒ>y=o;e7[2R-I(@#80 ,*)' &'%-$5#>"G!R ^l~‘¥¼Ýöÿÿ¡8•=‹ABwBm@c<Y7O3F.=)5$- ' %#!!$ +2;E O!\!j"{""£#º#Ú#õ#ÿ#ÿž<“A‰DFuFlDbAW<M8D4<03+*&#" !!""!"(#0#8$B%M%Y&h&y&'¢'¸'Ö(ô'ÿ'ÿœ@‘E‡H}JtJjI`FUAL>C::612(- ) ''''(%(-(6)@)K*W*f+w+‹ ,Ÿ ,µ ,Ï ,ï ,ÿ +ÿ™DI…L|NsOiN^KSGJDB@9=/8%40- ,---#-*.3.= /H /U 0c 0t 0ˆ1œ1±1Ë1ë0ü0ÿ—HMƒQzSqTgR]PRLIJ@F5B+>":74 33 3 3 4( 41 5;5F5R6`6q6„6™6¯6È6è6ù5ÿ”MŠRVxXoYeX[UQRGOýHúP÷Wõ]ôcòiðoïtí{ëé‰è’æœä¨â·ßÍÜîÙÿÙÿÊÿ¾ÿµÿ°ÿÿÿÿÿÿÿüø#ô.ð8ëBèJåQâXà]ÞcÜhÙnÖtÔ{тϋ͕ʡȯÅÁÂãÀûÀÿ»ÿ°ÿ¨ÿ¤ÿÿÿÿûóí èãà(Ú2Ó<ÏDÌKÉQÆWÄ]ÂbÁg¿m½t»{¹„·Ž´™²§¯·­Ð«òªÿ©ÿ¡ÿ›ÿ—ÿÿÿôéàÕÎÉÅ"Á+¼5¹=¶E³K±Q¯V®[¬aªf©m¦t¤|¢† ’žŸœ®™Ã—ç–ÿ•ÿ’ÿÿŠÿüðãÔÈ¿¹ ³¯¬%©.¥6£> DžJP›U™Z—_–f”l’u~ŽŠ‹—‰¦‡¸…Ö„ö‚ÿÿ~ÿ|ÿíÝÌÁ¸®§ ¢žš—'”/‘7=C‹I‰NˆS†Y„_‚e€m~w|‚zxžu¯sÇrìqÿpÿpÿnÿÝɼ±©¡™“ ŽŠ‡!„)07}={ByHxMvRtXr_qgopl{jˆh—f¨e¼cábúaÿaÿaÿͼ¯¥œ”†|xu#r)p0n6m<kAiGhLfRdYc`ai_t][Y¡W´VÐUòUÿTÿUÿÁ ²¦›’ ‰‚{u plhf#c*a0`6^;]A[FZLXSV[TdRnQ{OŠM›L®KÆJêIþIÿIÿ¹ªž”Šy qke a]ZX$V*T0S6Q;PANGMNKVI_GiFvD…C—A©@¿?â?ø>ÿ?ÿ²¤˜Ž„zrjb\WSPNL%J+H0G6F<DBCIAQ?Z>e<r:9“8¥6º6Û5ô5ÿ5ÿ¬ Ÿ$”&‰&$u ld\T N JGDB @%?+>1<7;>9E8M6V5a3n1~0/£-¸,Ô,ð,ÿ,ÿ¨%›*,†-{+r'h"_WOHA >;98!6&5,322 91 A/ I. S, ^+ l) |( & ¢% ·$ Ó# ð$ ÿ% ÿ¤*˜/2ƒ2y1o.e)\$SKC<5 3 1 / . "- (+ .* 5) ='F&P$\#j"{ Ž¢·Ôòÿÿ¡/•3Š6€7v6m3c/Y*P%H ?80,*('%$$*#2":!C NZhx‹ µÑñÿÿž3“7ˆ:~;t;k8a4W/N+E&=!4-& #" !'/7AKWev‰ž³Îïÿÿœ6‘;†>|?s?i=_9U5L0C,:'2"*" $,4>IUct‡œ± Ë ìÿÿ™:?„B{DqChB^>S:J6A29-1)(%  ")2<F S a !q !… "™ "® "Ç "ç "û !ÿ—>ŒCƒFyHpHgF\DR?I;@884/0','# !!"" "'#/ $9 $D %P %^ &o&‚&–&¬&Ä&å&÷&ÿ•BŠGJxLoLeK[HPDGA?>7;-6$1-*( ' ( ( (% )- )7*B*N+\+l++”+©+Á+ã+ö*ÿ’FˆKOvQmQcPZMOJGG>D3@)< 841 / ..//#/+050?0L1Y1i1|1‘1§0¿0á0õ/ÿK†P}TuVkVbUXSNPEM:I/E%B>;9 7 6666 6)627=7I7W7g7y76¥6½6à5õ5ÿP„V|Zr[i[`[WYLV@R5N*K HFC A@ ?>>>>&>/>:>F>T>d>v=Œ=£<»<Þ;õ;ÿŠW‚\y_paha_aT^G[:W/U%RPM KJI H GGFF"F,F7FCFQF`EsE‰D D¸CÜBõBÿˆ]bwenggh[fNcAa4^)\ZWVTSRQ QPOOO'O2O?OMN]NoN…MLµKØJõJÿ…e|itlmnbmTkGi:g-e"db` _^^]\[ ZZYY"Y-Y:YHXXXkWW™V²UÒTôSÿlypsshsZrLq?p2o%nlk jjiihgff feee'd4dCdSdec{b”a­`Í_ñ^ÿ}twwny_yQyCy6x)xwv uuuvuttsss rrr r,r;qLq_qtpŽo¨nÆlíkÿ{{r~d~UG€9+‚öø‘ ‚ƒƒƒ‚‚‚‚‚‚ ‚‚‚#‚2‚CVl€†¡~½}æ|üv‚hƒY…K‡<‰.Š ‹‹ ‹Œ‘’‘‘‘‘‘’’“ ”””'”8”L“b“|“˜’³‘Øöjˆ\ŠM?0’!”• –—™›Ÿ    ¡¢£¤¥¦¨¨¨-©@©V©o©‹¨¨§Ç¦ì_P’A–3™#œ Ÿ¡£¦¨¬®¯¯°°²³´¶·º½¿¿À3ÀIÀbÀ~À›À·¿ØS—D›5Ÿ&£¥ §ª­°³¶»½À¿ÁÂÄÆÈÊÌÏÓÚÛÝ%Þ;ßSànߌݩÝÂÿÿÿÿÿÿÿÿ$ÿ/ü:ùCõKóRñYï^ídëiéoçuæ|ä„âà—Ý¢Ú±ÕÅÒèÐÿÏÿÄÿ¸ÿ¯ÿ©ÿÿÿÿÿÿû ÷óï)ê4æ=âEÞLÛSØXÔ^ÒcÐiÎnÌuÊ}È…ÆÂ›À©¾º»Ù¹÷¸ÿ´ÿ©ÿ¢ÿÿÿÿÿöîç áÜ×#Ð.Ë7Ç?ÄFÁM¿R½X»]¹b¸h¶n´u±~¯ˆ­“ª¡¨±¦È¤í¢ÿ¢ÿ›ÿ•ÿ‘ÿÿüîãØÍÆÁ½¹'µ0²8¯@¬FªL¨Q§V¥[£a¡gŸnžv›€™Œ—™”¨’¼ßŽûŽÿ‹ÿ†ÿƒÿøéÜÌÁ¸² ¬¨¥!¢)ž2œ9™?—E•J”P’UZ`g‹o‰x†„„‘‚ €²}Ì|ñ{ÿzÿwÿuÿæÓÆ»±§¡› —“#Œ+Š2ˆ8†>„D‚INS}Y{`yhwqu|s‰p˜o©m¿kæjÿiÿiÿgÿÓõ«£›’Œ ‡ƒ}$z+x2v8t=rBqHoMmSlYjahjftda‘_¢^¶\Õ[÷[ÿZÿZÿŶ©Ÿ–އ€z uqnk%i+g1f7d<cAaG_M^S\[ZdXnV{TŠR›Q®PÈOîNÿNÿMÿ» ¬   • Œƒ|unieb_]%[+Y1X6V;UASGQNPUN^LhJuH„G•E¨D¿CäBüBÿBÿ²¥™Ž„{ sle_ [WTQO%N+L0K6I<HBFHEPCYAc?o>~<;£:¸9Ù8õ8ÿ8ÿ¬Ÿ“‰uld ]VQ MJGE D&B+A1?6>=<D;K9T7_6k4z2Œ1ž0³/Î/ï.ÿ.ÿ§š"$„$z!qg_WP IE A><:!9&7,62483?1G0P.[-g+v*ˆ(œ'°&É%ê%û%ÿ¢#–(‹**w(m%d [RKC = 96310"/'--,4*;)C(M&X%e#t"† š®Æçø ÿŸ(“-ˆ/~/t.j+a&X!OG?81 .+)('#%)$ 0# 7! @ J U b r … ™ ­ Æ æ ù ÿœ-1†4|4r3h1_,U'L#D<4-& $ " !   % , 4=GSaq„˜®Æèûÿ™1Ž5„8z9p8g6]2S-J(B$91*# !)1:EQ_o‚– «  ã ú ÿ—5Œ9‚<x=o=e:[7R2I.@*7%/!(  &.8BO \ l  “¨¿àõ ÿ•8Š=€@wAmAd?Z<P8G3>06+.''# # , 5 @ L Zi|‘¦¼Ýòÿ“<ˆADuElEcDYAO=F9>652..%*%!    "*3 > J!W!g!y!Ž!¤!º!Û!ò þ@†E}HtJkJbIXFNBE?=<59+4"/+( $ ###$ $(%1%<%H&U&e&w&Œ&¢&¹&Ù%ò%þŽE„I{MsOjO`NWKMHDEO2L(HEB@=<; :999 9)949@9N9]9o8…8œ7³7Ò6ò5ÿ‡UZv]m_e_]_R\DX8U-R"OLJ HFED C BAAA&A1A=AJAZAl@?™?±>Ð=ò<ÿ„\|`scledfYdKa>^2[&YVT RQONML KKJJ"J,J9JGJVIhI~H–G¯FÍEñDÿcygrjkl`kRiDf·Ü‘7d*b`^ ][ZYXWVV UTTT'T4TBSRSdRyR’Q«PÊOïNÿ~jwnpqfqXpJoK=S;]9i7x6‰4œ3±2Î2ñ1ÿ1ÿ¦šŽ„zph_ XQL HDA?=!<&:,91776>4F3O1Y/e.s,…+˜*­)Æ(ê(þ(ÿ¡• Š!!ulcZR KD@ <8643!1'0,.3-:+B*K(U&a%p$"•!© Á äùÿ"‘&†(|'r%i"_WNF? 84 1.,*)"'(&.$6#>"G R^m~’§½ßõÿš'Ž+„-y-p+f(]$TKC;4 - ) &$"! $*2:DO\j|¥»Ûò ÿ—+Œ/1w2n1d.[*Q%I @81)#    ' . 7 A M Z i { ¥ » Ù ñ ÿ•/Š36v6l5c3Y/P+G&>!6.'       # + 4? J X g y¢¸Ôïÿ’3ˆ7~:t;k:a8X5N0E,='5#-&    ( 2 <HUev‹ ¶Ñîû6†;|>s?j?`=W9M6D1<.4*,&%"   &/:FSbt‰ŸµÐíûŽ:„?{BrChC_BV?L;C7;430,,$)$   $-8DQ`r‡³ÎíüŒ>‚CyFpHhH^FUDK@C=;:37*2 -)% "   " +!6!A!O!^"p"…!›!²!Í íüŠC€HxKoLfM]KTIJFBC:@/;%73/ ,)' &%&&!&)&3'?'M'\'m'‚'™&°%Ì%î$ýˆHLvPnQeR\QSOJLAI5D+@!<96 20/ .----'-1-=-J-Y-k-€,—,¯+Ë*î*þ…M}RuUlWcWú¿ [VSUGQ;M0I%FC? =:87 6 5444$4.4:4G4W4h4}3•2­1Ê1î0ÿƒS{Xs[j]b][]OZBV6R*O LIGDBA?> ==<s0r#qo nmmmmlkjiiih hhg!g/g?fRffedšc·báaüwxmz_zPzBz3{%{zyyyyzzzxxwwwwwwww&v6vIu_uwt“s¯rÓq÷q~cT€E‚6ƒ(„„ƒ„„…†ˆ‰ˆ‡‡‡‡‡ˆˆˆ‰‰‰,ˆ?ˆUˆm‡‰†§…Ç„ïf„W†Hˆ9Š*ŒŽ‘“•—˜–———˜˜™š›!3Iœbœœœœ¹›âZ‹KŽ<‘-“•–˜šœž¡¤¦§¦§§¨©ª¬­¯±³ ³´'´=µUµp´Ž´¬´ÌM’?–/š Ÿ¡£¦©¬¯³µ·¶·¸º»½¿ÁÄÇËÍ ÎÏ/ÏHÐbЀÐи  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿmft1!  !"#$%&'()*+,-./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïñòóôõö÷øùúûüýþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/7/}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷éþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ a²bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÍ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿݯ–·ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅŒh§çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌœ‰¤çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúλÆõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜŽõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿“z…ÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ[=e¨öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ¼u4T›ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ”~I,NšìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØÔʳ~em¥ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÅ®¯ÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÖÆìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ滑tc«÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÄšsE&4}Ìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµ€U0 `²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏt5 R§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–4O§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöi  R±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿË;5L[ML^Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©`6`†Ÿ¶¬©¸Ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà—¾åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÙʼÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏšmZFˆêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄ|>&T°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàƒ<.‡íÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬SmÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû€1 aÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒZ]Ìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨5\Óÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ} TÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿî}EDÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüªd/"7IXÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé¤kA(?c•§ºÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ²¬²Ìäúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼"-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿå»—wbÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛžg6 ŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈ?^ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙ9<ªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžL#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜo}ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯Hoîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„dæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìQWÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸HÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿt8Ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù¢Z#Åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß›\, ºÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï±}U9""²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß¿¥™˜š ¬½Úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã¾€|ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò·„W0¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒŠLróÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖ6KÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú‘>/«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀZ•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç^wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´%jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}[ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý+Lëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥<áÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0 -Ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™Ša''×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿí¾‰U'%ÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÊv]J<2-,09GÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýæÝÖÒÐÓÙäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÔ»Öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç¸jK/oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿä¡g4<ÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖ‚;—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿí…1oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦BPáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìi7Éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³/"¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿy§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò4™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©ŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿFÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ—jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎcÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)"aÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹£€W7hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÓ®”†|uqprw”ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛº‚iiÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈ“e=žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛŽLnÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ|,E×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹*"´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂD—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç6jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿXÿÿÿÿÿÿö²ÿÿÿÿÿÿÿÿÿÿÿFGøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé5éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–%Ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÂÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ' µÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàœŒpUB3& &¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùäØÒÎÌËÌÏÖàüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÓ¼ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒ©…eH,…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ«q<OàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ5²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãu‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕCHöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ.Ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8Èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœ¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿº“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜ‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿhÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿB`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿz]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$fÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿɬ™‰}vqligfgkpzŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâŪ‘yawÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿݦwP, 1Äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà’NÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒp`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîo7âÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ3éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^ÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+Èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ ËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüëáØÏÌÍÏÐÒÔ×ÜâêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÚÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÆ£„hM2«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹|Fqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|/;ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßd µÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™Kÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶0ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×çÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|iÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ× hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿiZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™IÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒ9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿX)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»/øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«)ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉG .>Rh„íÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÕÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÒ°’w]B( JÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅ}EØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄPŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢ hÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿH¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿuƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃRÿÿÿÿÿÿÿÿÿÿÿÿÿÿç>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ3+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞ"òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèJ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 'Ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿzwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿz Lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢Wht€œ«¼ÐçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒ£zX:)#Ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬RiÿÿÿÿÿÿÿÿÿÿÿÿÿÿäC4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿyãÿÿÿÿÿÿÿÿÿÿÿÿÿͲÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿO]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒ:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿOçÿÿÿÿÿÿÿÿÿÿÿÿÿÿtÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄ­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿð3šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿg†ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£rÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãD\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘Aÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËW $1?N`t‹§Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×çòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÔÍǾº·³°­©¨¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝ~S?0# Ûÿÿÿÿÿÿÿÿÿÿÿÿÿv§ÿÿÿÿÿÿÿÿÿÿÿÿÿºuÿÿÿÿÿÿÿÿÿÿÿÿÿÿFÿÿÿÿÿÿÿÿÿÿÿÿÿÿNÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒýÿÿÿÿÿÿÿÿÿÿÿÿÿÁÛÿÿÿÿÿÿÿÿÿÿÿÿÿñ¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿD¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿkÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘yÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·fÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞ!SÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿw+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖMýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§.Õÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜*-E`àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ctœ«»ÍâúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçË·©•މ„€|xtplheÿÿÿÿÿÿÿÿÿÿÿÿÿ¼jH- 1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBÜÿÿÿÿÿÿÿÿÿÿÿÿÿ޲ÿÿÿÿÿÿÿÿÿÿÿÿÿÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)kÿÿÿÿÿÿÿÿÿÿÿÿÿÿZNÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿú=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿñNØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌC¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘zÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòt _ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèt,8ESbr…›´Òõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×èôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû÷óñîìëëìñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙ²™‡ymd]VQKFA<82-(#ÄÿÿÿÿÿÿÿÿÿÿÿÿÿK% ’ÿÿÿÿÿÿÿÿÿÿÿÿÿˆfÿÿÿÿÿÿÿÿÿÿÿÿÿ×=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿlÿÿÿÿÿÿÿÿÿÿÿPvu•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉ öÿÿÿÿÿÿÿÿÿÿÿÿÿñ5ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[Ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍC@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØ^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿N,>Rj†¥ÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂ|Œš§¶ÅÖèýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîá×ÏÉþº¶±­©§¦¦§®ÿÿÿÿÿÿÿÿÿÿÿÿÿ¾†m[L@7/(" ÿÿÿÿÿÿÿÿÿÿÿÿÿ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4öÿÿÿÿÿÿÿÿÿÿÿÿÿvÒÿÿÿÿÿÿÿÿÿÿÿÿÿ°²ÿÿÿÿÿÿÿÿÿÿÿÿÿá$–ÿÿÿÿÿÿÿÿÿÿÿÿÿÿQ|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿyfÿÿÿÿÿÿÿÿÿÿÿÿÿÿ QÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ#<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿîK'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØLÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥8 4NkŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™9CQ_n}Ž µËåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë̹¬¡™‘‹†|xtpkhffhñÿÿÿÿÿÿÿÿÿÿÿÿÿaE2#žÿÿÿÿÿÿÿÿÿÿÿÿÿ~uÿÿÿÿÿÿÿÿÿÿÿÿÿÃRÿÿÿÿÿÿÿÿÿÿÿÿÿû72ÿÿÿÿÿÿÿÿÿÿÿÿÿÿjÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿæBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹,ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿè\Ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜.)FfÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿî (7FWi~•¯Ìîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç ª¹ÈØéüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýõðëæâßÛØÔÒÑÐÒ×àÿÿÿÿÿÿÿÿÿÿÿÿÿΞŠ|qia[VQLHC>:62/.1ÿÿÿÿÿÿÿÿÿÿÿÿÿÒ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿBÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ° öÿÿÿÿÿÿÿÿÿÿÿÿÿÝ9ÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿbÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯"™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖH‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿriÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡(NÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ\3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–.2Rwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàr/BXp‹¨ÈìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊon~Žž°ÃØïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜ6¨WÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùàÒÈÀºµ°¬¨¥¢Ÿ››œ §ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚dVKC<60+'" Ôÿÿÿÿÿÿÿÿÿÿÿÿÿ’­ÿÿÿÿÿÿÿÿÿÿÿÿÿÌ‹ÿÿÿÿÿÿÿÿÿÿÿÿÿûRmÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Qÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐB#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿõh ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ7/PtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝr*AZu”¶Úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼XDTdu†š¯ÈãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÍáñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüûúûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–І‚{xvtrsuxÿÿÿÿÿÿÿÿÿÿÿÿÿëO:0(! #ÿÿÿÿÿÿÿÿÿÿÿÿÿÿiÿÿÿÿÿÿÿÿÿÿÿÿÿÿ› ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈ9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿðcÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…ìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±I9]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿå{ !8Ro³Ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»X)9IZl€—°Ííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³ž´Å×ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúïçáÜÙÖÔÒÐÐÐÑÓÙàë÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸Š~wqlhda^[YXWWY^eqÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿1 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿíVèÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚Ìÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«/³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒW›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷|…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢7+”ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËa ,PvžÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõ0 #;Wv™¾åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃc*;L_t§Æçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨–¨»ÐçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÎÅ¿¼¹¶´³±²²µ¹ÀÉÕãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ—ld^YUQOLJHGFHKPYf¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§&VÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎP:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿôy !ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ2ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄX1Z„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé'KqšÂéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§I/JhŠ®ÕüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓu&8J^u«Ëïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®r…˜¬ÂÛöY…=rÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿²ª¦£¡ ŸŸ¡£¦¬´ÀÍÝìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠZSOKHFDCBABCGNYi}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿž.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃVAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç{ 4`‹´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ?%Jq™ÂëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆf*Dbƒ§ÍõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëŽ5+>Qh¼Þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾v”©ÁÜùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒØóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöòðïïïñóøýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø°Ÿš—–––˜›Ÿ¤¬¶ÂÑáîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþŽPJGEDDDEFGKQZhƒ©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦A6cºáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆe 'LsœÄìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåˆ/*Db‚¦Ìôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«P6Ja{–´ÖúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒ‡|˜±ËéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔÎíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíåããäæèíñùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý±”’’•™£©²¼ÐíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSGIMQV`sНÖüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²V5Pm‹®Ò÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍo>_{™·×ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦ÂáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÎëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxýúÄ} L H HLinomntrRGB XYZ Î 1acspMSFTIEC sRGBöÖÓ-HP cprtP3desc„lwtptðbkptrXYZgXYZ,bXYZ@dmndTpdmddĈvuedL†viewÔ$lumiømeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ óQÌXYZ XYZ o¢8õXYZ b™·…ÚXYZ $ „¶ÏdescIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view¤þ_.ÏíÌ \žXYZ L VPWçmeassig CRT curv #(-27;@EJOTY^chmrw|†‹•šŸ¤©®²·¼ÁÆËÐÕÛàåëðöû %+28>ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ5õ…,@Pages, @Layer 1ˆ h Xl@k[No Trap Preset]?Ð?à@Y@$@Y?ù™™™™™š@Q€Œ h Xp@kDefaultTrapStyleName?Ð?à@Y@$@Y?ù™™™™™š@Q€xQ0?ð?𸚛œž¨X,k%ÀÀxà@ƒH@yššŸ–4,k šš–X—šš­,k%@iÀÀ`@@y`@`HNãø-Òð —,k ÀÀxà@ƒ0Àx ÀÀaÀ@ƒ0Àa@ÀÀ`@@ƒ0À_€À@_€@ƒ0@`@À@a@@ƒ0@aÀÀ@x @ƒ0@xàÀÀxà@@xà@h@Àxà@hÀ@xà@iÀÀxà@j@@xà@y Àxà@y`@xà@yàÀxà@z @xà@ƒÀxà@ƒ0@xà<šš °±²³´µ¶·¸¹º»T ¡ÿÿ k™ÍÍJ=@Regular@"lÙ³fÍ›@£F4h?ð?ð("@€à@("@B@B@B@B[ š›Q0?ð?ðÀxÀT @ƒ @ˆÀ, LLH ¡¢£¤¥@A@Master| ,kF¡¡¦§–4,k ¡¡–4,k ¡¡—4,k ¡¡—D k™ÍÍJ=@Regular@"lÙ³fÍ›@£F4h?ð?ð("@€à@("@B@B@B@B[ ¡¢Q0?ð?ðÀƒ ÀxÀT @ƒ @ˆÀD k™ÍÍJ=@Regular@"lÙ³fÍ›@£F4h?ð?ð("@€à@("@B@B@B@B[ ¡¢Q0?ð?ðÀxÀT @ƒ @ˆÀD¾8@Unassigned InCopy Contentl7`e¼ej¤ˆq }Šø\þI:›/ (ñ9kÖ¬[C ÿ]Z)æü _Jd(¤Ü_$žÜ_$¡Ü_$¡:ÿ\ÚT´ýû Çÿ7 @ ö_øþ ëñ ðP Ènÿ7@ö ðR Ènÿ7Aõ ðQ Ènÿ7?ô ðS ÇÃ÷ ð«‰÷ôÙ*ÿC1ãæ ^Å/þŸÁ޵PóÆŸ€  9ùðýÿ{• 9 ÿ‚07#e©¼j¤ˆqš•þ^z%(7fº ™¡¢þXð‰ Àl«Fš€ÿT¸ þçýY ö  ï  Õ kâ °ò ®# ëà þ… Ø ´ÿnŠ’ÿsŠnŒüŠÿ7 {ZÈÊÿ7íÊ_ŠŠÿ]û ÷L Å—™ˆ™ÿxþþ™Š™ÿvþþ™Œ™ÿt„ lö¹”òYf¹úš’™þ™ÿfHþ È™ ñþšÿ_»šœþDð™ÿiÿ™˜ä4ÿÿÿÿ  Ð d ܘd0ü€8 ¸Èp<älàX, (4 à¼Ñ(7f« ™¡¢8[ š¹nn@nd ncnh®nc,](,?3]+Z@h€À_`@h€@`xNãø-Ò@x@`xNãø-Ò@xÀ_`Q0?ð?ð@'À` &?ì<žà?è˜_H[ šž3(ÀxÀŸ?©™™™™™š@s H[ šž3(Àa€Ÿ?©™™™™™š@s H[ šž3(À`Ÿ?©™™™™™š@s H[ šž3(@`Ÿ?©™™™™™š@s H[ šž3(@a€Ÿ?©™™™™™š@s H [ šž3(@xÀŸ?©™™™™™š@s H [ šž3(Ÿ?©™™™™™šH [ šž3(@h€Ÿ?©™™™™™šH [ šž3(@jŸ?©™™™™™šH [ šž3(@y@Ÿ?©™™™™™šH[ šž3(@zŸ?©™™™™™šH[ šž3(@ƒ Ÿ?©™™™™™š˜7‰©j™ ›–ø÷ øêùþÿT D‹    ¤ ¸óœ*ÿ8døýÿñ øï ö ö  þÿn D’  ÷ —¤ÿ4Ò D’  ÷ —¤jÿ4Y] l¨ÿn £ KÀ:þHE, 1­€  ÎS 1­€  ÎS 1­€  ÎS 1­€  ÎS 1­€  ÎS 1­€  ÎS 1­€  ÎS 1­€  ÎS 1­€  ÎS 1­€  ÎS 1­€  ÎS 1­€ < hÿÿÿÿ ¸ ØH¸p(à˜PÀ`( ôh žE±0„ af62ddc7-213f-11da-ac18-fe020baf4f13 adobe:docid:indd:af62ddc6-213f-11da-ac18-fe020baf4f13 2005-09-07T14:40:37Z 2005-09-07T14:59:44Z 2005-09-07T14:59:44Z Adobe InDesign 4.0 JPEG 256 256 /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4AE0Fkb2JlAGQAAAAAAQUAAr///9sAhAAKBwcHBwcKBwcKDgkJCQ4RDAsLDBEU EBAQEBAUEQ8RERERDxERFxoaGhcRHyEhISEfKy0tLSsyMjIyMjIyMjIyAQsJCQ4MDh8XFx8rIx0j KzIrKysrMjIyMjIyMjIyMjIyMjIyMjI+Pj4+PjJAQEBAQEBAQEBAQEBAQEBAQEBAQED/wAARCAEA AMUDAREAAhEBAxEB/8QBogAAAAcBAQEBAQAAAAAAAAAABAUDAgYBAAcICQoLAQACAgMBAQEBAQAA AAAAAAABAAIDBAUGBwgJCgsQAAIBAwMCBAIGBwMEAgYCcwECAxEEAAUhEjFBUQYTYSJxgRQykaEH FbFCI8FS0eEzFmLwJHKC8SVDNFOSorJjc8I1RCeTo7M2F1RkdMPS4ggmgwkKGBmElEVGpLRW01Uo GvLj88TU5PRldYWVpbXF1eX1ZnaGlqa2xtbm9jdHV2d3h5ent8fX5/c4SFhoeIiYqLjI2Oj4KTlJ WWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+hEAAgIBAgMFBQQFBgQIAwNtAQACEQMEIRIxQQVRE2Ei BnGBkTKhsfAUwdHhI0IVUmJy8TMkNEOCFpJTJaJjssIHc9I14kSDF1STCAkKGBkmNkUaJ2R0VTfy o7PDKCnT4/OElKS0xNTk9GV1hZWltcXV5fVGVmZ2hpamtsbW5vZHV2d3h5ent8fX5/c4SFhoeIiY qLjI2Oj4OUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6/9oADAMBAAIRAxEAPwDs2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxVKdV806Dolytpql2LeZ0EqoUdqoSyg1RGHVDlkMM5iwEGQCC/wCV geUP+rkv/IuX/qnkvyuXuRxxd/ysDyh/1cl/5Fy/9U8fyuXuXji7/lYHlD/q5L/yLl/6p4/lcvcv HF3/ACsDyh/1cl/5Fy/9U8fyuXuXji7/AJWB5Q/6uS/8i5f+qeP5XL3Lxxd/ysDyh/1cl/5Fy/8A VPH8rl7l44u/5WB5Q/6uS/8AIuX/AKp4/lcvcvHFNtL1fTtatjd6ZMLiFXMZcKy/EACRR1U/tDK5 wlA0Uggo3IpdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirx/82f8AlJrf/mBi/wCTtxmz7O+g +9ozc2EZmtbsVdirsVdirsVdir2H8qP+Ual/5i5P+IRZqdf/AHrkYvpZtmKzdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirx/82f+Umt/+YGL/k7cZs+zvoPvaM3NhGZrW7FXYq7FXYq7FXYq9h/K j/lGpf8AmLk/4hFmp1/965GL6WbZis3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8f8AzZ/5 Sa3/AOYGL/k7cZs+zvoPvaM3NhGZrW7FXYq7FXYq7FXYq9h/Kj/lGpf+YuT/AIhFmp1/965GL6Wb Zis3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8f/ADZ/5Sa3/wCYGL/k7cZs+zvoPvaM3NhG ZrW7FXYq7FXYq7FXYq9h/Kj/AJRqX/mLk/4hFmp1/wDeuRi+lm2YrN2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KvH/zZ/wCUmt/+YGL/AJO3GbPs76D72jNzYRma1uxV2KuxV2KuxV2KvYfyo/5R qX/mLk/4hFmp1/8AeuRi+lm2YrN2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvH/zZ/5Sa3/5 gYv+Ttxmz7O+g+9ozc2EZmtbsVdirsVdirsVdir2H8qP+Ual/wCYuT/iEWanX/3rkYvpZtmKzdir sVdirsVdââ.+irsVdirsVdirsVdirsVdirsVdirx/wDNn/lJrf8A5gYv+Ttxmz7O+g+9ozc2EZmtbsVd irsVdirsVdir2H8qP+Ual/5i5P8AiEWanX/3rkYvpZtmKzdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirx/8ANn/lJrf/AJgYv+Ttxmz7O+g+9ozc2EZmtbsVdirsVdirsVdir2H8qP8AlGpf+YuT /iEWanX/AN65GL6WbZis3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8f/Nn/AJSa3/5gYv8A k7cZs+zvoPvaM3NhGZrW7FXYq7FXYq7FXYq9h/Kj/lGpf+YuT/iEWanX/wB65GL6WbZis3Yq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8f/Nn/lJrf/mBi/5O3GbPs76D72jNzYRma1uxV2KuxV2K uxV2KvYfyo/5RqX/AJi5P+IRZqdf/euRi+lm2YrN2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KpTqvlbQdbuVu9UtBcTIgiVy7rRAWYCiOo6ucshmnAUCgxBQX/Kv/KH/AFbV/wCRkv8A1UyX5rL3 o4Iu/wCVf+UP+rav/IyX/qpj+ay968EXf8q/8of9W1f+Rkv/AFUx/NZe9eCLv+Vf+UP+rav/ACMl /wCqmP5rL3rwRd/yr/yh/wBW1f8AkZL/ANVMfzWXvXgi7/lX/lD/AKtq/wDIyX/qpj+ay968EXf8 q/8AKH/VtX/kZL/1Ux/NZe9eCKbaXpGnaLbG00yEW8LOZCgZm+IgAmrsx/ZGVznKZspAARuRS7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/9k= application/x-indesign Blue Square Test File XMP test file, created in InDesign CS2, saved as .indd and .pdf. XMP Blue Square test file InDesign .indd .pdf Black CMYK Process 0 0 0 100 Paper CMYK Process 0 0 0 0 Registration CMYK Process 100 100 100 100 Times-Roman Times Regular TrueType Times-Roman5.0d10e1 false Times.dfont Times-Italic Times Italic TrueType Times-Italic5.0d10e1 false Times.dfont Times-Bold Times Bold TrueType Times-Bold5.0d10e1 false Times.dfont Times-BoldItalic Times Bold Italic TrueType Times-BoldItalic5.0d10e1 false Times.dfont znEÿÞ99yQˆKlŽcîø®àÝ8€Àk&ÿÿÿÿ&g Blue Square Test File - .indd XMPFiles BlueSquare test file, created in InDesign CS2, saved as .indd and .pdf. XMP Blue Square test file InDesign .indd ýÎÛp÷†KO¤ÓÇ(³Aq€Àk&ÿÿÿÿexempi-2.2.1/samples/testfiles/BlueSquare.gif0000664000175000017500000000742212144603625016143 00000000000000GIF87ahØã ÿ--ÿffÿÿ––ÿÀÀÿÌÌÿÕÕÿêêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,hØþ0ÉI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËíz¿à°xL.›Ïè´zÍn»ßð¸|N¯Ûïø¼~Ïïûÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàÚ«æçèéêëìíîïðñòóôõö÷ñäøüýþÿ œ§OU¹*\Èð^ÁTJœH±"¿‡¨"ZÜȱcEŒþ§4zI²äÅ}&Sª\ɤ)‘,cÊìè²Ì™8s.¬Iê¦ÎŸ@ûñå3¨Ñ£ð†Š*Š´©SsJC1}J5hTPS«jÅyõSÖ­`Wvõô5¬Y’c;•=ËvcZNkÛÊ•øvSܹxÖÕt7¯_€{3õýK_`Lƒ +&ˆr±ã‡/%~LY]dK“+kp¹RæÍ”;Sú Ú±èI¤K+>-)µj¬#¹~í76¤Ù´ñÚ~„;·ÜÝŽzûf ¼‘ðáf‹3:ެòEÌ›k}®(ºtªÔY¿î4;¢íÜ‘z?>¼Ññ†Ê›оúõ:ÛzŸkãú•å¢?¦~Aüõþ'Ö}.ö_ hÒ€$¨ Z>øƒ8(!M^¨[†þÆa‡Ä}br"Žè\‰&N‡bŠØ­Èbw.¾(^Œ2žGcì݈c|:îhŸA>†E¡Ð}iä?Hò¡ä’Bõ¥JMîñä”I‰eIUêqå–ôt™Ç—`Ê#&d–™”–jrtæi¶ÙΛvÄ)ç:tÖaçéäIÇž|žãç€Ê›†64¨…ºhòù(‘Þ9é•Êy©™¶¹iªù)¡–9ꥂyª©n¹j­bù*±N9ëµBy«¹.¹k½ù+Á9ìÅúx¬ɼî¸lÍâø,ÑÖ8íÕÊx­Ù¾¸mݲø-á¦8îåšx®鎸n ï¼ôÖkï½øæ«ï¾üöëï¿,ðÀýÀÌÁ'¬ð 7ìðÃG,ñÄWlñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÍ8ç¬óÎ<÷ìóÏ@-ôÐDmôÑH'­ôÒL7íôÓPG-õÔTWmõÕXg­õÖ\wíõ×`!ÿ XMP DataXMP Blue Square Test File - .gif XMPFiles BlueSquare test file, created in Photoshop CS2, resaved and handcoded to .gif. XMP Blue Square test file Photoshop .gif 8 8 8 ÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!  ;exempi-2.2.1/samples/testfiles/BlueSquare.psd0000664000175000017500000010625611745673651016205 000000000000008BPSØhLº8BIMéxHHÞ@ÿîÿîRg(üHHØ(dÿh 8BIMê° com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:09:24Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:09:24Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMíHH8BIMó 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM8BIM8BIMÁxWXMPFiles BlueSquare test file, created in Photoshop CS2, saved as .psd, .jpg, and .tif.Blue Square Test File - .psdXMP Blue Square test file Photoshop.psd8BIM@@8BIM 8BIM Π`à´²ÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ` "ÿÝ ÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’I%)$’IJI$’R’I$”¤’I%)$’IJI$’R’I$”¤’I%)$’IOÿÐõT’I%)$’INGXúÛõ¢d·©åýž÷°ZÖzv>XK˜4×c~•oT?ñÈú—ÿ–?ø ÿúAqãÿX¿øMŸù÷!p«§ä>Êó®,ÓžQ,‘⌡Ãôý[ ²ÈHŠ>ãÿŽGÔ¿ü±ÿÀoÿÒ ã‘õ/ÿ,ðÿô‚ð䕯ù1ÉœÍþ6?ýT·Þ—`ûþ9RÿòÇÿ¿ÿH%ÿŽGÔ¿ü±ÿÀoÿÒ Ã’KþLr_ç3ÿU+Þ—`ûþ9RÿòÇÿ¿ÿH%ÿŽGÔ¿ü±ÿÀoÿÒ Ã’KþLr_ç3ÿU+Þ—`ûþ9RÿòÇÿ¿ÿH%ÿŽGÔ¿ü±ÿÀoÿÒ Ã’KþLr_ç3ÿU+Þ—`ûþ9RÿòÇÿ¿ÿH+]7ë·ÕŽ©›^o­•vïN¿JÖÎÖº×û쩌ú wç/]7ø·ÿŧNÿ¯ç‹Ô<×ü]å1rù²ÆyŒ±ãžHñK!Ä8¿V˜æ‘ PÔ¾â’I.QI$’JÿÑõT’I%)$’IO‘ÿüQbÿá6ç܅®ëüoÿâ‹ÿ ³ÿ>ä.wÿÿµü¿÷?kW'ÎT’I+ë’I$¥$’I)I$’JRé¿Å¿þ-:wý{ÿ<^¹•Ó‹üZtïú÷þx½Uø‡û‹™ÿc—ÿIÉt>hù‡ÜRI%çmµ$’I)ÿÒõT’I%)$’IO‘ÿüQbÿá6ç܅®ëüoÿâ‹ÿ ³ÿ>ä.wÿÿµü¿÷?kW'ÎT’I+ë’I$¥$’I)I$’JRé¿Å¿þ-:wý{ÿ<^¹•Ó‹üZtïú÷þx½Uø‡û‹™ÿc—ÿIÉt>hù‡ÜRI%çmµ$’I)ÿÓõT’I%)$’IOžÿŒ?©Ýw¯uš2úuL²šñ›S‹žÖÁö¾6»ù65rßø×ýoÿ¸õÛ¬þõíi-n_ãÜÞ 0ÃãàÆ8cÅqÓc8¢M›ÕñOükþ·ÿÜz¿íÖz_ø×ýoÿ¸õÛ¬þõíi)¿å/=û¸¿Å—ýú=˜ø¾)ÿÖÿûWýºÏïKÿÿ­ÿ÷¯ûuŸÞ½­$¿å/=û¸¿Å—ýú½˜ø¾)ÿÖÿûWýºÏïKÿÿ­ÿ÷¯ûuŸÞ½­$¿å/=û¸¿Å—ýú½˜ø¾)ÿÖÿûWýºÏïKÿÿ­ÿ÷¯ûuŸÞ½­$¿å/=û¸¿Å—ýú½˜ø¾)ÿÖÿûWýºÏï[S>¡ýcéYpú†m,f5>¯¨æØ×º«joµ§÷Þ½A%oøÁÎeÅELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ8BIM8BIM8BIMIØh BlueSquarehØnullboundsObjcRct1Top longLeftlongBtomlongØRghtlonghslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongØRghtlonghurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM!UAdobe PhotoshopAdobe Photoshop CS28BIM"MM*XnÆÎ(1Ö2ô‡i2XMPFiles BlueSquare test file, created in Photoshop CS2, saved as .psd, .jpg, and .tif.Ð Ð Adobe Photoshop CS2 Macintosh2005:09:07 15:10:03  h Ø€ˆ(‚HH8BIM$ä Blue Square Test File - .psd XMPFiles BlueSquare test file, created in Photoshop CS2, saved as .psd, .jpg, and .tif. XMP Blue Square test file Photoshop .psd 8 8 8 8BIM%«^?’ Ú.ùÿÿÓþ¦þ‚þ`þDþ+þþþçýÈý¤ýý[ý9ýýùüÝüÆüµü²üÏüý¬ý“þìÿÄàÍ ¥ ¨o/á§ ¼ ‹n¾¦ÿ"þýöû¨úáøªö>ôóñ5ðTïŒïèðDó2ö ù)û7ü üûkù§÷@ö‰õ®õ—öå÷Où{újû=ü ýþZÿ4‚`L { æ ¢ á ï  …q¬ > > ð^ŸÉv伊>Ùk–B»V«ÐÿÈþÈýÏüü³û°ûü¤üBý¡ý²ýJý}ü_ûúÀø¸÷#÷÷Ž÷føqù„úmû ü†ü°üÃüÆü×üíüý9ýDý6ý ýÔüªüªüíütý9þÿïÿ«EÒ½~ßÍ ç ÄZ„‚†ýE Û €=Þ˜Ž'ÿªüsúÖøû÷×÷6øÅøùûøXøV÷=öWõéôõ—õƒöt÷JøÎøùù"ùkù'úTûâü˜þ@î&×»Ý[3(Ê),ü±Œ«‘aMĹF“Ò'ÿµýzü€û®úáù%ù`ø§÷ ÷¥ö€ö¥ö ÷§÷løGù*úúú°ûMüÆü&ýiýžýÔý þ`þÜþ„ÿWHSXT2É}âþÙfÌ2bêA¤ {ñjôÿÿeÿWÿbÿŠÿÍÿT°ÊÄ®ŒeKT¾d‰Ž\uÊÿýþ-þfý¸ü1üÌûŸû‘ûŸûÌûüwüóüˆý0þïþ·ÿ~,°ÝÏ€mØÿQÿìþºþ¬þ´þÂþ¿þ›þLþÙýDýªü#üÏû³ûÌûüuüåüJý§ýíýþ"þ þÎýˆý?ýþü×üÃüÃü×üýRýÈýcþÿÛÿ”EÝ[ÀcÂ-®Càoå)?)ñ¸ƒg_\V7úŒé"Al»7ã p*Êÿ>ÿþÔýýŽüüÌûû‘û°ûæû.ürüÌüýlý¡ýÀýÎýÈý²ý‹ýJýýÉü”üzülügü[üSü7üüÿûãûÒû×ûôûüEü€ü²üåü ýcýÀýþvþÈþ ÿCÿkÿ˜ÿ·ÿØÿ÷ÿF{Ç&™ ½q>÷Ç}|ÈðòÜ©Jà =FIRo¸/Ì\*ìÿÿ;ÿÍþ]þþý½ý¡ý¡ý¤ý™ýtý9ýâüƒü,üôûèû ü=ürüŽü™ü€üHüùû«ûVû$û û ûû!û'û'û)û2ûNûšû#üåü½ýþAÿ ÿ±ÿpÿúþnþäý‹ýlýýäýLþ´þìþïþ¿þnþ0þ0þ¡þyÿ¾MÍY…> ‚ n zÔ4ª2ÇjȦ›©¿ìÈWÅ6½X¸lÁg£ÿIÿýþËþ¦þþ„þcþ%þ½ý+ý”üöûmûüúŒú0úÞùù-ùµø(ø¯÷V÷<÷[÷½÷?øÑøOù ùºù˜ùOùþøºø¡øÖøRùúÇúƒû ü”üèü1ý–ý3þ5ÿ¨‚¦üR ~ [ ÐÛ{ÁÄxôDw¤ Ú  u ÿ ¹ ’ { W  ¯ ûû³/ÒhþÑügû'úùø.÷aöÄõjõWõ—õ4ö÷3ø]ùbú!ûƒû{ûû~úÂùù¦øtøø·ø ùZù¦ùäùúZúÛú—ûzütýXþýþIÿ%ÿ¡þÜýûü:ü¶û€ûšûãû7üoürü=üÌûVû û=ûüËýTwë;  0p݌²ª Á 1 Ý Ç ¾ ­ _ ' Ø „ - Å 0 X:ÛW»,Çÿ©þÙýRýíü‹üüVû—úéù`ù3ù|ù8úYû­üþÿ´ÿ¿ÿ5ÿþªüû±ùŠøÆ÷X÷1÷?÷i÷¡÷â÷(øtøËø-ù„ùÂùÈù’ùùtø¯÷åö2ö°õpõeõõ°õØõ÷õödö÷øÞùoüÂÿ˜¤ƒ Ðm%W§.×µ¸ÎßÉ€î ð Ï ­ p  uŒ` ¿þœü¹ú ù‘÷=öõúóûòòlññ/ñ¥ñfòLó0ôÛô-õõ‡ôÈóþòaò òò…òUó]ô—õÚöø3ù-úôúŒûëûü#üüÁûmûû«ú\úúõùÞùÈùù*ùøÑ÷&÷Éö ÷<ø•ú>þ‹(^­áóèûoœàumÕƒ^ U<Œç*«í Í l ÚþûkùX÷Kõó¢ð î†ëeéøçzçóç8éëíõî=ð¥ðð¦î¡ì{êè ç@æ7æ×æèé5ëíïîðÎòŠô!ö}÷|øùWùAùùÈøÅøù„ùú—úÂúhú‡ù<ø¾ö~õ÷ô†õŽ÷ûñÿ£š =¯.)7´ †{ý!»¤™]Þ´Üg8[Ö÷ n\ûýKüû$úùÌ÷&öZô¡òHñ†ð‘ðSñ²ò]ô÷õ1÷Æ÷­÷öö÷õõ„ô˜ôCõNöw÷wøù ù–øß÷B÷÷o÷`ø·ùû,ü§ü^üVûÓùøxöõøó óòîðhï‹íuë˜éfè‡èmêtî©ô”ü=Ž vnP^ÇZ>ðžFŸW #2%®&g'†':'—&Š% $ù!`&whK€ 3 mä:þNúÒõÝðåëtç'äoâPâŠãŒåœçévéè}æ£ãŽà½Ý†ÛÚšÙéÙñÚoÜ>Þ7àBâIä@æèÈé@ë}ì‹ítîTï@ðHñtòºóõ=ö ÷}÷.÷,ö|ôUòðîâìBíÂï·ô üQ5µæ g'÷+Š.3/^.Ÿ,¿*`) )õ),"/E2Ð4@6j65ó3Ì1+/,}(L$k˲² `8,áþÏüeúS÷tóÞî ê®åwâùàKá+ãîåÙè&ëì_ëõèsåˆáòÝ4ÛÙøØ|ÙÄÚzÜIÞàµákãCå^ç«éìtîðiòÐóäô¿õªöÉ÷(ùÄú[ü¤ý0þ¸ý ü;ù¼õ9òšïÛî¶ð†õóükí½#/&ô&/&c$)"! Ö¤S!w#v%Ò&H'î&&·$G#ª!ÍtbƒÝÏ èÑØìþ¬ý‘ü'ûù\öó¼ïþìuë~ëûìïMò˜ô¢õõ²ò-ïNëóçØå\噿Réíãð;ô‹ö­÷Ú÷z÷ÿö°öÆöJ÷ øûøù ù0ùUø.÷æõ›ôGóÁñÞï|íŒê7çÛã)áñß#áƒåtíiøôBÒÙ# ){+m+•)æ&+$&"2!~!í"%S'Î()ü'F&k$×"‰!b <~Œ¢H ^wštþgü÷ù¶öcòíçHá–ܱÙäØÍÙÁÛáÝxßàW߬ݰÛÚeÙ÷Ù°ÛAÞ á¿ã«å¸æ ç9çÉçé ëží\ðÙò´ô¼õöÝõÇõ öÏöâ÷òøù-ù“÷Çôñ6íé§æå5åÉçíìôfþMdí¦‘"Ð$¦%‡%ø$y$k$5%'õ)»-Á1L5ö7Ë9';d<À=9?•@šAÚAÿ@Ù>•;Á7þ3¨0µ-Â*='¾" AYFÿáùÁöÏõSö:÷[÷¢õ^ñ†êÃá6Ø-ÏÇ™Á‡½»Þ¹y¹k¹h¹~¹Í¹šºí»ž½’¿‚Á(Ã@Ä«ÄÄ_ijÄ?ƒɕοÔdÛ”á™æêÉëì¶ë¥ëùì¾ðŸ÷ƒ‹ 3h%l-¢1â2Ÿ2,2M293Ð4Á6™8":@;ÿ;»<¢=D>”=Â:6æ0K,ª(¼%ð"®g¶Óƒ:ü>ùS÷”õ¦ó–ñ]ï×ìúéJçŸåÄå×ç/ë˜îùð¥ñQðí9è ãÞÏÛ Ûâۯݶß?áèáªá×à/à¹àZãOèïÉö>þ„ä: ö Ò † † Ú ) ¥ t -ÿ+øÚñÃíBíEñÊù«ð¤)0µ2}2ÿ0 /ò.ß.þ./Ë.`.X-*+?'u!¶k <ýúíøËøùù’ú°üF$Ä CÓ­?V4Ž Áa‘³~8 šòßX£ ùü;ï‚â©Ø§Ò‘ЈÑÔ‹Ö¤×ÔÖhÔÑ›ÍmÊÈÇÒÅTÄÃ×ÁmÀ¿¾ø½®¾ÀÔÁ÷ÃSÆ´ÈÒÊGÌÍLÍ©ÍΪÐLÔsÚvä6óã¯ì*7H=Î>w=>;Å9: Þ?"@:=6—+F m' ?ÞyØíý^ü<ý8½= œIøÿ ü-ú¨û÷ø¾•kŸ"Ž"M, YÂéLþ¥ûËømõñ­ë¼å\à?܇ÙÖ×¢Ö7ÕÓ@Ð%ÍÊ]É2Ê3ÍlÑïÔSÖÕ¡Ñ‚ÍúÉçÇÃÇ É©ÍÇÔrà1ñÐö$F+í-..û-â.¹1'62;›?ƒB×CŠD·E{GcIKMLOÓPcOIß=`/ ècýø&÷­÷ø{özòŽìšåUÞl×ßÑ÷Î¥ÏäÓÚëáRèÜì*ïCïÎíüë ë”ë%íïŸð‹ñÔñœñÿð!ðWïï ðJòKõ+øúúqùX÷Ûôlòrðïnîqî’îçíƒëGçÚá‘ÜÜØØPÛßâDîÿû- Úx K&¬(")f)¦*1-¶0¡48:SÈ?KA°BMC×Bú@=ý5š+·dúêýhù×÷wøsú?üû÷ºî„äØÚËÓQÐ\ÐAÓLØ`ÞÞã ç)ç÷äâQàÕàLä~êóñøBüœüúöBòÒï{ïñyóÄõ»ö¶õ¯òîßèä_àÞ6ݯÝßáãä*äãPá¹ßIßÚà‘ånî$û K;¡#9$–"Á ¿ …#…(G.S37©9:<?èAé™ç@æ/åbäÙãžãnãã[âYáúßAÞÜIÙÿÕÓãÐúÏüÏNÐŽÐñФÒ}×á î^ý 3GV Ò!w#Ø%G)Ô-&3f8Ýy?ã@ÿA8Aî<ì4A*Ù § öŠ‚¡ô0  l0nÿ·ùøóLï1ìhê8éè1çÃæ§æ‘æŸæçíç²èÜèGèfçÁæ—æ)ç…èŒêJí¢ð5ôd÷±ùéú\ûuûjû@ûÞúTúÈùùˆ÷„ôÊïæéä¿ßËÝ8Þ€àúãûè‰ðû7u’ûQ ±U–X¼ %$‘'*M- 0‚4S8õ:ú;j;ð8Ù3,a"öŒ›þùõóýóÆ÷™ý± þ   çýüößò\ñâñŠóvõ÷øRø×÷Ìö5õ ó”ðhî×ìåë{ë\ëoëì¤íðóÒõþ÷8ù3ùÚ÷†õ‚òÓîÊêªæÙâ£ßßÜ2Úz×÷ÔÓ.ÒUÒqÓNÕl×’Ù§Ü.âéê¼õèw ÚT˜ª"m&Î)¾,k/2ú4z8ñ;º>Ð@åB"E{FÀDD>B3«%<ù Wÿ²ý˜ÿÅ ~ ] ÜÖýööï;éñäÑâÑáÌà_ß Þ6ݯÜÜ”Û}ÛBÜÀÝ_ßÚà#âhãã䉿RèêºíÆñYö ú¤ýýþÈþaý'ûføõnóßñjð©î4ì"éñåUãèá âêã§ç¤í öýÿº ÔÉ”Sfë.)"Ç% )Œ+­-0¾2`5Ÿ7‚9Â::6l.U$`ìÒqþäøvõRô{õzøÉüµzÉLþ3øóTïíàë³ë€ìøíOïÛï¿ïWïÛîUî§ííœìiì‹ìÑìûìííÓî?ñRôa÷¼ùÂú!ú6øIõ–ñqí0éHåâsßåÜæÙŸÖ±Ó ÒøÑnÓèձضÛì߃æhïêøë¢¦ û ¥=! &*Õ,Å.¨013{6Ë9Y<(>?O@%?k:Ÿ1ô%ÈnB„õSÄ Ç…ÍnÇ ¸’ú¤òöë.çä+âëàEà!àHàHààà\à«àÚàÇàŒàdàKà àæß:àŽáä‹çëcîñ ó3ônôÅóÃòèñ)ñ!ðhîÿëé4æËã<â²áRâ¶äé/ñûF.ý±ud77”!Â%3*.÷0}3Û5Ò7R9©:ü;”<Ó:«5¯-X$™ Ì£þ|þÉYC f X KAþjõJíÉæ&â_ß Þ÷ßÙâSæWé\ëì¥ëvê8é|èqèòèéïéïéÂéÓé~êëëîÝðÜódöó÷Røt÷”õþò=ðÙí,ì)ëKêÅè#æ‚âžÞŽÛÚ7ÜîàèfòÏüÏ) ʉMº€ö"ø(‹-0Ž24~5F6•53í.*%Ó`¿Ae ¸q´‡¥O ~ B  èö°üö=ðìÓé>éÍéúê:ìííì*êðçñåä"ä’äùåèFêìwí˜îð.ò«ôüö¬ø£ùúÊùžø‘ö"ôüñgðyïžî íêùæËâÍÞóÛ{ÛZÞÿäËîéùûF >@¸ ~ ç  ,Ü—!‚)‚/E35’5“42n.v*Ç&¡#Ç À'¼¹ l© ®çµ °üM ëÿ€÷×ñËîþí©î'ð×ñóûò/ñÀínéFåMâá¸áìã#ç†ê?íìî˜ïìï—ðÃñJóïôaör÷­÷ƒö½óãïÝë[èëå~ä©ãÔâ€á\ߋܩÙÜׇ؜Üsä'ï£ú¦­ O¬ü | ©Œ k³ô&z- 2Ó4K67:7³6ï4°1-H'³ ½ø ü i¶ wƒ½‰ß (HIú]ôKðî6í ííùì“ì¶ë_êÖèlç¢æÃæ»ç3éÄê ì#íÓíRîïîð.òõAøCû[ý0þ–ý—ûlø´ô?ñÂî|í#íí–ì2ëé­æìä„äæïéÞï÷þËEtÆ!kHW ÌS×"Ï&ß()Ô'ý%$€"H!; ø+s³&€ Í þiô ›ªFÁ²Ò sâýêø°õô‚ó¬óúóÐóÃòØð’î¤ìoë!ëšë…ìíOîyî¯í)ìxê`ébé—ê‘ì´î‘ð­ñ³ñxðî/ëèÚæ&ææBææ'å`ãñàÞ1ÝÞÀátè?ñ‰úzÚQ b  Àœ’ å *{À")Ã-Â02Õ1¶0D/è-¨,'+Ô(v%!ùoFçY`ù<ª¶ ¿¿þÅù)öÓótòŸññmð•ïvî<íì,ëšêCêêêôéÈékéÐè è²çèDéoë"îàð(óvô|ô3óëðAîÒëê*éÈè–è(èEçôåyävã£ã¶åê¢ðUøãÿ   / V k Q ¢ ̧N u"n# #î!_ õøw Ž{Ë‹õƒÏb\[£B¢r©ye F÷þÌüœüý‚ýÆý¤ýöü³ûú#ø@ö|ôíò”ñdðLï>î6í?ìŽëjë ìlí'ïàð(ò²ò9ò°ðAî@ë9è°åÓãwâ4á¿ßÙÝgÛ¡ØôÕ"ÔÔ­Ö.ÜFäòíŸ÷¦ÿïBB ïñì „ÕÔ”!•$Õ%¼%Ù$Ù#4##i#–##V!i¦¾qSÒë~B¯€ÅÄü ×ÿý#ü ûòùËø¤÷†ögõRôfó¤òþñHñbð;ïÖíHì±ê0éèrç§ç©è=ê ìµíçîLï•î°ìÛ颿ŠãèàÈÞÝ¢ÛCÚÎØa×YÖgÖJØŽÜLãîëCõÜý` qvÉb ¢tÎÙ#'B(»'&$o"a!ú ô Û @ º2ìËU  ï ª{wC œyºçkºð´ÿRýûcù ø÷)öõ¡óüñ)ðZîµìxë¿ê†ê¨êÏê¿êQêeéþç:æQälâ¶àßOÝ:ÛÎØüÕþÒ\ÐÈÎÏÀÑ ×˜Þ¯ç#ñ˜ùÑF@ýª~ Êãþ["j&)D** *D)c(l'@&•$#"ê$gW™uꚺgÔ€_°ê² ¬ylnÿ>þoýÉü)üxû—ú„ùUø7÷7ö@õôžòÕðÞîóì,ë´é¬è.èDè´è;é•é±éŠé%éŠèµçªæåFäòâzáÒßÞzÜÛ/ÚÚÛ²ÝöáÎçÂîö×ü1¿™J¬› Á eOêX$î'ï)R*D):'©$ "¬€8‹p?‡Ü ‹ ¯I‹QÇ‹Ó/8 †²ïÿþÝüîûû@úkùlø[÷göÒõõeõ õOô+ó¸ñ$ð„îþì¶ëàêŒêê~ê=ê«éÖèËç­æ†å_äZãqâ‘á”à_ßáÝ4Ü{Ú Ù]ØÙ‹Ûúß@æÙíùõý¦²Ð   ë þ ƒKØp!K&û)=,)-ñ,Ý+O*¬(&'¨%Æ# !?§e·W;EDÆû–q zoÓþÏü)üdü¾üÆüHüVûCúLù·øˆø›øºø›øû÷¾öõ.óœñ°ð¥ð‹ñ(óõÌö½÷ª÷”ö·ôiòð%î¤ìŽë¥êyé™ç®ä³àðÛüÖ§ÒîÏ«Ï<Òœ×@ßOè–ñºù±ÿ+ÅÖ±Új ÷÷´Ÿh "í" #å"r"ã!!©1vÈô   ) £“ùäÑÁ%“º -Syþ°ü°ûôú-úZù¤ø?ø+ø[ø¬øøøùÖøþ÷xö„ôœò&ñbðQðÕð¾ñÃò‚ó¦óþòœñ¿ïºíèë†ê«é>éäè3èÌæ‡äƒáÞÇÚJØo×çØݯãMì¹õtþ*% p Å MJö÷ I=ËØ%†+U/11¼/–-$+»(K&µ#¥ Ì ½É O  ] q 2sF7%WV üMýéúÛùºù÷ùúÞùþøz÷xõ.óàð¿îþì³ëüêÄêëÏë.í;ïèñúôøÐú¸üzýûüjûùröôùñ~ðmï’îíìêˆç¶äðá—ßޛݬވáæùë ò7÷šú,üaü)ü†üDþ­Œ7 »Ht'—(ÚâÁ̇³ ^ÖΧµ d*gâÒ‚m á +Õ½µ±ÿßýaüKû³úúÿú‘ûñû¹û¿ú*ùP÷—õIô•ówóøóáôîõ³öñö”ö¿õŠô+ó»ñ:ð îÑì¿êwèæ´ãgáTß·ÝíÜwݹ߿ã8ékïgõ0ú ýßýUýÉü}ýC@ÿ ŠÊ¥ ›$m&_&ò$µ"2 ×î`Üî6«»  —¨”W œ }Ú½ãΨ W#$óýšû0ùööõ¯óêò¬ò¤òPòañÒïííìpê`ééÊégë¤íôïßñóJóÆòÃñ†ð{ïïîçîï$ï£î…íÚëáéøç³æ°ætè,ì¢ñ øþ¤Ä²ÌÞ‚äJE öP†í3ƒs“'eqÜ{P Ö ¨Ñ¿îÖ å ~$mI8 UÛ¯°¼®ÿnþýŸûmú£ù3ù ùõøËøløÑ÷÷Bö~õïô›ôvôWô"ôÅó"ó.òÁðÖîwìÐé9çýä>ãâ)áxà¶ß˜Þ Ý:Û·Ù>Ù¥ÚÞ!åîø÷Vˆ¸ E ¾  j JJ›8 é%Þ)Í+¶+*‹'ï$Ý"†!  yf\ ï ÿ~i fÿä’Þr­ [ÿ‚ýüÐú¦ùwøX÷aö õÊô¡óÔñ’ï#íÝêé»ççç×çÙè¿éZêãê¾ëíÅîNðoñòòoñéïžíÏêßç,å%ãDâãæmë‚òhúè K >+ × N ‰± y$&h%¤"“ ÆIA: Ë ÁGÍÿèü$ûàú.üÍþ')rÕ»ÿùûWúeúÄû½ý•ÿÊ bêþûüôúGù3ø¸÷»÷ö÷øøâ÷­÷¯÷(ø(ù{úÁû¢üëüŽüšûúø¹õóxðÅí ë]èÌåfã1á-ßDÝŽÛeÚ@Ú”ÛºÞÞãÇê§ò_ú®áèiaåÛ µ ?žÅ±$Ì')¡('¯$M"p R¯Æã¯]C ã̇ ”_b>&`} ò ó@•ÉØÍþ²ü’ú¯ød÷¾ö‘ö€ö@ö¿õ/õ¹ô]ôýó•óóoò‹ñVðçîXíÒëbêé è¤ç"èFésêÿê~êïè”æÙã[áÍßÕßóá=ælìÈóNûÝœ3 ï • 3 Å ÿ „¾œ!÷%ð'K'y$F Yà”›<  Œ?´ÿ“þ"ÿP„Æ ¶ n Sóý]øéôXóÂó¨õ(ø~ú#üåüÉüüû>úïù úhú±ú¹ú{úú¬ùùïùìúoü þIÿÐÿÿ•þýôúˆø ö½óÑñ)ðîrìÍ陿+ãàÈÝ ÝŠÞDâ.è ï€÷ŠþÂÉÚ¤ i_ ÂÊ|ó¯¯M!ø††&9˜î  YhŒf å äY¿ø n 8ÿüÿúëûóý/ÝŽ.àøþèüûÛùùøÑ÷ÿöùõØôÂóóµòÙò0óRóóXòEñÞïî ìýénèÃçÙç9è3èSçTåPâºÞjÛbٌـÜ#âæéõò.üyã ê’†Åe@¯”{¥ -%G(i)œ(b&–#ã ¤àT±–ž¥ö 0éš1<Ð ñ * |Cíü2û'ûEüÙýÿ±ÿvÿhþÆüÞúù½÷ñö‘öœöÚö÷4÷÷ÔöîöŸ÷õø¶údü^ýMý ü!ú­÷'õËò¢ðžîˆì2êoç*äuà§ÜÙYÖãÔ5Õ×îÛóáé¨ð™÷ý¶¡ˆF¥4: uVö!Z%ü&è&s%1#³ ˜)\³š–× t  / û Ýå?Ìò Jà„DÅjš÷kDþ7ûnøBö÷ôŒô¹ôõ_õ¨õ ö»öÃ÷ù~úÉû†üMüÛú<øØôBñîèëàêÝêVërëpêõçäpß¹ÚÝÖÊÔ$Õ.ؓݫäzìÙóÂù›ýFÿeÿøþ0ÿãk‡ „’Íe ewe¡l§îÂËî€  ƒKÄê, ›) .`8 Ÿ»mØÿ‰­–âtgÓÿþSüûCúÅùWùûø¡ø`ø1øDøÎøïù¢û¯ýÿÿxÚ'ÿ†ükù€ö8ôªò™ñ‰ðõî€ìéÞäKà ÜËØG×Ù×sÚºÞääé8ïZóÛõÝö)÷Ã÷ùýceOSiåakˆ=Äñ/ãŒ9_À  ü ‹ *dº=#U òàŠ¿é4ó¾uO‰›þöûýùÖø]øMøJø øÀ÷H÷÷&÷å÷*ù¹ú ü×ürü¶ú­÷ÐóïïðìŽëÚëPíìî´ï÷î€ì–èÙã2ßÄÛpÚ¾Û³ßÒå6í·ôû|ÿª ™Y)bë4  v+¸2(<ü ÿ‹¢ÇÜ, L ÝZ î ”ÃHä" ÐÛÿHü³ú$ûåüýþ«‰€ *ÿýEüxûûÞúyúìù]ùêø²øíøÊù‰ûþÊ?ØCW.ýþTûÚ÷$õJóþñ¹ðúîXìÓèä$àPÜýÙØÙJÜ#áÎç0ïö!û¯ý²ýü8úùîú¬þZô a~•Ó sÅò•_ðgRx ž k ! w‹)<#Ê¢ˆ Än]~Ã_ á  F*ÿßüYûvúïùvùùøøå÷Jønù'û ýÈþ£ÿQÿ™ýyú@öuñâìIéMçîæÃçÙè]éèEæÈâòÞÝÛ¾ÚwÜEá…èöðùvÿ]©ýlVÚ„ ÎZ}‹§A4eŽ×ñ,Ý~å b ŸˆåÍ yÔ34- ÂÊÿPüØúdû9ýhÿ,WÿDýbûú;ùßø©ø…øqø|ø˜øÓøUùjúüAþp&ðruýøÎóØïRí.ìãëÁë ëZ陿ã‰ßðÜBÜÞUâ[èïKõÅùàûÄûmúOù´ùPülO£kë Fz ˆ° #3þ«²  c q b ½²óµQ:4 V¬ùPýú[µè–Ûÿ^ý”û‡úúéùäùçùéùéùçùúÂúëûiýÍþ·ÿÕÿòþðüÈù«õ,ñíúéMèÎçøç èXç†å§âIßlÜ$ÛVÜHàœæOîùõEüFÒ”¹‘± jzBŠøúg0 Q€ÔmÖ „ [. Ǭ ‚ šäN {Kªüeùö÷iø@úµüÿ—@ëÍÿ0þªü‰ûæú—úhú;úú;ú•ú5ûü6ý©þCÄÔ [poý±ùéõ½òðeï½îîÜìÏêíç|äá]ÞÝäÝÏà¥å»ëíñ÷eú¾ûÇû­û–ü8ÿ– ïrÔ(÷T¡i’x#ÜD‰8 ÿ a f—ß*¼ ~­Ú&çœ&~ÅM’ÿ1ý‰û¨úFúúòùäùòùúIú ú\û§üOþñÿd³çþüø£óZïìúé%ééýèyè#çãäðáýÞÝÝ{ßTäÕêÚñ#øœüáþOÿòþÿÒ‡Û é±8Ô<’lºuvÐÔ‰÷M * rÿj§ `¢ü5‘ É»|þãû\ûÃü3ÿ§G¬× ¿þƒüÊúÖùhùIù6ù(ù>ùŠùúÒúæûGýÜþ\xùŸQÜýQúözñ…í¹ê(éŠèfè0èzç æä âÄàá>ã€ç%íAó·ø§ü±þ%ÿÙþÜþ2Dó‹ ƒFú‘’Ú'Çšèð ² š „ ú ù .ZÇ9ë} ²t”’ÿKü¬’b •þ.üCúù[øþ÷Ã÷¡÷»÷ø¬øRùú!ûiüºý´þÿ¡þ9ý¼úH÷ó±îÇêâç!æbåWå‰å‰å!åIäUãÃâ9ãNå8é¦îÍô ú%ÿèêËlµZŽñ Ç"G·f‘Íë¦yUºø…1 ! ð¨2wô ©l|zŠ* 4PýÿúmúVûýÐþ uÿÃýˆü­ûTûgûûÌûôûü^üÑü…ývþÿàþœrS*ÿñûí÷…óFï×ë£é›èfè‚ènèççÝæ~å0ä›ãZäÝæúêðæô¤øÄúgû2ûûüÍþfI $+ÅtÙùõ ‘ å c$Sƒ¥ø Ò Ì U XÿH¹IQu °åØ¥èΆj$·X’ÿý7ûZú8ú‡úìúKû—ûÇûëû#ü‹üGýAþ0ÿ ÿIÿøý—û%øÞóFïëÔçèå2å_åôåzæŸæVæÊå\ååªæéªì ñõWùüÈýËþ®ÿ/²d  Ðávݯ—<Ý d B ô @ $ Ñ}†VER  …÷ôkŸ IãRþÉü?üŽü[ý0þ¿þ´þõýŸü!ûéùUùùWúbûlüXý"þÙþ„ÿ5 óß·%°Iÿ üJøhôàð(îHì ëê"éßçYæÊä±ã‚ã«äUçaë8ðæôŠø’úéú'ú3ù%ùÍútþËõ Þ’x[i" >7 x Ì § ]|õ ù æ / F x ¯_È*qmƒ Pªsÿ¹ÿp/ª°&Íþˆý”ü üñûHüèü¯ýþ~ÿb/ÒP“rÁjJþmûøWôÄð¬íaë÷é>éäèžè.è‹çÌæ4ææÝæÓèÿë2ð¿ôÓøãûÃýÂþvÿ†w†Š [®”þÿòE•f  K ý I 3 ûãC\dG § ·yå F ½¶Uþªü{ûsúùÓø›øÑø6ùù¼ù¼ù®ù´ùïùsúNûƒüâýAÿ†³À›–¡Bsÿ1ýú­÷Êô ò„ïGíEë‡éè³æ¾åmåüå§çŒêîóV÷¨ú‘üý€üÁû­ûûüýÿé D›Y#'Ë®œ N > L ï † « K ú Û × ¼ßZuÐŠà ¤í)ÿ±þZþ9þAþhþþ›þnþþ›ýðü1üŸûuûîûðüZþÛÿNœº‡æÊÎãfþ{ûføeõˆòÍïDíôêûè^çæå‡ää8åÃæDéŸìŸðÕô˜ødûý¡ý¸ýõýõþ86Y ý‹È·“¿½ë —   R <ñWs€z! í  {|d ¸ÌUþ»ü³ûìúú>ù¦ø¡ø0ùúæúgû~û7ûÐúšúñúÿû¬ý«ÿ” D_N¿ÂlÒõþâü¥úGøÏõ%óNðJíeêÙçãå«äCäÓ䀿`éGíÉñ7öÐùü×üiürûÂúûóüH£c ² 韸m8Ã Ä £ q    ‡ ºóŸ6ò ¸ ìÔ˜· !H +n} ÿ›þ þlýwüKû-únùOùÓùÕúü^ýXþýþvÿÏÔ;_H×åS2‘TÿùüúMøö©ó=ñ¦îì¹éßç¾æ}æ9çøèÆëeï|ód÷‰úwüý¤ü—û¨úsúxûËý#ý·Ø ó Üžl Á ¯Àœ‰' ÚÙ~ <vŸ_¼å W ‰ >ÿGýü7ûvú ùÅøøÜ÷MøkùûÌüOþWÿÞÿ!jRÅÿV•­š|þrü‰úÎø.÷{õ…ó:ñ„î¢ëêèÒæ¶åÕåEçáéfí^ñ*õø¼ù$úºù%ù ùçùôû%ÿûà2 ” Ù ™ z  Ö ðˆUª»ÄlÖ Ü Õ[ÈÅG” ` Ĥ*Lþ¸üû`ùr÷õ`ô-ôWõÃ÷÷úRþY¦« Ê=î¸^½»!ýœeÿý üÇúù#øVöïóÿðÙíëTéïèêrìÛïÈóz÷@ú¥û¾ûû'úÙù{ú=üýþP«te d ”  2 åùN¼Wž0iZ§Á ø³f·¡\9 · ²¼ÿ.ýôúáøÝöôôOóòÁñŽòŠôX÷Zú ýÿ=”_=÷9Å5=œC ƒþý»ûçùlø÷¨õìóŸñ î2ë×ç\åQäåªçÒëëðöWúëü¬ýýîûQûÌûºýæÛÅè ¸ M Ò fJÕîJ‹r»Ì‹( ‘ •¸WØÞ`šþ  V g]þµüûnù–÷°õÐóJò™ñPòô(ø ü·ÿaäC =.PD º Ão¥–rŒÿþýüãú3ùÒöÙó~ð(íxê%é©é&ìKðIõúäýKÿýûúù2úÒûfþHÂ\ì£òIø*Ø«Hdú-`ê3hœŒ Ô ¹µO‹„œ A ÝÑ@3ÿaý{ûkù7÷÷ôçò)ñýï¿ïÄðóösùVünþ±ÿTÇjzçhŽ×ãhw,ªý7ûùJ÷Çõ8ôcò2ð©í ëÂèXç^çTé3í¤òµøRþfbD¯¥ÿïþ\N Õ = „  z7³ñëf4aVs•n u p—lÆÖù ž =. Šþ¾üîúù÷õ0ójñðsïïï³ñ•ô%øÒû;ÿ eúÚžZ ç ½ øÔ_¤¶ÿËýÆüÁû•úùX÷Kõ<ó–ññöñ„ô?øYüÞÿ#ÀÉ£ÿ ýû>ú÷úöü’ÿþ˜y TÓþþþÓþÐÿ¨!Õ‘®†Mî  >nhDB ½ ’dƒ¬þÉüÒúÈø¸ö¼ôâòPñ,ð®ïð­ñ|ô<ølüb‚~KEÞ„_jm*|XÁÍÿ§ýŽû±ùøÆö„õ'ôˆò”ð˜îèìì€ì„îùñ2ö_ú§ý ÿQ,ÐÿÍÿ†&sëÜÙ È ÎM¶kÜ($S.r)»Žî Ù # ”‹©E ‡ ­ßEïþÉü¨ú…øVö;ôJò«ðZïyîî`îšïùñNõRùfýô…æN*-¼‰Mµ‘Ú¥"oÁ>ÿâý²üû„úUùø ÷gö—öÜ÷Iúýà˱\éЦ GI¿ÚµªÓˆK•þ¸ý§ýþ´þ3ÿyÿšÿÍÿKHö2°Þ = š ô ‚ ™h<)Iÿ¡ýüŒúøø^÷¹õô™òVñð!ð)ð¥ðÌñÐóÁöeú(þ”0ÏŽ°œªè&&¸Ä`²¾£þrüFúMø—ö*õìóßòò¢ñðñóõ­÷vúâü´þÕÿ‰Ïðk z?ö-+d,Çÿ,/o“R·òFü4 C ‹ T;S = Ì®ª¶½þ§ü~ú?øöìóò³ðÛïpï_ï„ïð=ñióxöõùXý*M²n¿ýeñu­Ž8ÑH±ÿJþ6ý†ü4ü7üˆü4ý-þ~ÿöï¶ µºMÃP<V.Ÿ—-€Ê>ÿþXýý.ýoýÈý-þ¬þ_ÿYÁ|e1‚ è\°Øÿþaü«úíø.÷{õÞóMòÚð’ïîêí–íˆíÈí¬î—ð¯ó¯÷ü÷ÿ @Y»Ìå l‘aÁÁq×ñÐþÀüûÛù]ù‡ù2ú:ûrü¸ýËþ£ÿ:® g夺'¨Üw9&b0ÝÜþoýµüœüÚüDý¯ýþcþËþ_ÿN»©ìÖ Ä Þ 0 êV£}kÿ§ý¹ûºùÃ÷Ýõ*ôÆòÔñ^ñMñxñ»ñòœò¬óõwøèûTÿ?Lj¶—¹5Á Ä ÷‚̦þÙýÀýAþLÿ¹^ä¨àî K­,ÚÀ·  á - í:-ðÕÿ½ýÔüVüEü–ü9ý þõþ÷ÿiá=KÝ×QLïS¢úþXý³ûúDø€ö¿ô ójñïïºîÙíJíþìåìþìUíîšï òQõþørü3ÿôÏ +…GI;Øô±iÆúÿcþXýýýÅþsGÙÐË+ ÖNa  Ñ ˜>É ~ ¾÷wŒTÿ¯þZþ+þþþDþÐþ®ÿãl3‘‹ËJ ŒË”bÿ`þ^ý=üéúeùµ÷éõô‚òKñ†ð/ð$ðHð‰ðëðuñoòô†ö’ù¢ü%ÿÏ¢ë^ûÑ£@ZÊä“|ÿJþÔý3þeÿBˆàß" ‚  t%ø] # û x†£ç † Èôkg3ÿËþžþ¡þáþAÿÂÿ_)9yÊé”¶=8½ó!qþöü«ûjúùŸ÷éõ ôòðRîí4ìÒëÁëãëìaìÀì…íìîñ·ó}öù û­üûý0ÿg°íø£Û¦ûç€ýÿ±þþfþ¹ÿ×Tª^" ç¥)™¼ + nÏaÖf y uÍÀg®Fúÿ«ÿbÿIÿ„ÿ PÅ;a  ¨¶yûƒ'ÿ(þ9ý üÇú3ùw÷¨õÙó ò³ðïÞîqîLî]î•îäî;ïàï ñó¢õ–ø2û(ýtþIÿÝå Ê-ˆP!:÷ÿš4’Yý  E € Ý ¶ Œ ç  ÷ l FéÊ·Ý ] ‘Ø€³bÿ`þýëüzüSüwüèü›ý‡þ ÿÇÔž"D€¢ƒ_ÿRþaý†ü­ûÄú©ùRøªöÅôºòÒð>ïîlí.í<ízíÃíî|îTïãð0óùõ²øãúiü4ý™ýËý%þËþ¼ÿ¾‰öþ­ Q¦ÿ]ÿÊÿW^½6 ²}2xñ»’ Ë ®¡MªÛ95 UúD+të^¶ŠÿhÿÓÿ¶î.8Þ!÷ÀÔɶ«ÿ±þËýÝüÝû¼únùó÷_öÍô]ó9òrññÒðÕðèð ñ&ññññÚñió°õ<ø~ú#üý›ýþ¡þ®ÿXfêêˆç.‹Bœ×À~ ™ ª ž ­ T * · Q è .†r–žˆv¬ ‘(ÏÇQÿ©þþÃýÀýþÍþ·ÿ—B­µjÁÓÿ¯þzýaü~ûÕúFú¿ùùøÌöõ3óEñ„ï%î9í¾ìªì×ì#íiíí¬íþíéî—ðóÊõwø±úPü[ý þžþLÿ*à^}f&à§¾Mp§· ! « H F 9^¿ : F.RFçG«ˆ W –Œ8nßU¾!Œ!_Úœ3…ÆÝáÿïþþlýÌü,ü~û£ú›ùRø×öNõÞóªòÃñ4ñîðöð#ñjñ¢ñµñ°ñ§ñùñçò›ôÏöùû”üýþ›þeÿx­ÆË²k(i;±¸ N ê ©qf ÿ ¿ > ã ¥ o[]Aë" .Í ÙŽ¥ ÿ]ÿnÿÊÿj€ª‘&s|ÿOþýñûñúúnùÃøø ÷ö£ô"óŽñð½îÀíí»ìµìÉìêìåì²ìoìoì#í®î ñÎó‰öÙø—úÒûÃüªý©þ¼ÿ¹oÔ.}þÎÁÜý » ½ Ë ¼ p ¦ ç m õ ã…LÞ-[³¯  PŒ_¦wÆþ=¢b 7ër‹&^N*ÿþ1ýˆüü×ûûbûÿú\úeùø¥ö*õÜóßò<òèñÉñÔñèñÝñ¸ñuñ!ñàðñíñ²ó4öêøKûóüÆýóýßýþ˜þ¦ÿãàiw?ùèPkFƇ  ¯OÙ– ô Œ ø ^ 物ä4®å O 6³šÈ`“°Ï,ñÿp¾ÒTÿ]þ^ý[ü€ûÇúúvùßø3øi÷aöõRóˆñÐïWî+íVì×ë—ëŒë†ëuëNë$ëë\ëPìî¢ð‚ó:öcø¼ù_ú¨úúú¥ûÃüþbÿm#°G *¶²õ # × £w}  ã O Ò € %&ºT¥®¡îm h B­NZOS†!4—°¼hÿçý}ü\û¶ú‰ú¥úÕúæú úúùÆ÷/övôåò¥ñØðuðgð—ðèð/ñMñ7ñëð—ðgð«ð‘ñLó¨õRøÄú‘ü–ýíýûý;þÿ@­ß¯q ûMI÷<® Ñ DÂO1 Ú Þ ± ° º TêÛàÍ·½2€   }Vp¦ß &SÒ¹ÿj°ªN‰ÿ>þëü¶û¼úú|ù ù“øþ÷)÷îõIôEò)ð;î¤ì~ë¿êbê=ê@ê5êê©éFéé%éýéªë(î ñÞóö‹÷?ø…øÙø’ùÒúwü;þéÿd§Ñô,¤] H & ˜WL•œ Æ ‘ P ­sÄ6[ F ' Š  …ÆÄ†-þ9B¡?d!žþ ýãû)û÷ú/û{û¨û~ûìúÙùRøoövô¯òañŸðFð@ðbð‰ðð_ðñïbïéî¦îËî„ïöð ó°õ.øú=û³ûàû)üëüDþúÿÄ.I- •Lj› ƒ è z . P / O  æ ™ ïYGWZ[šyM x  9 ¤}Ÿ> +Ô –(wJgñÿhþýöû@ûÒú{ú!ú•ùÅøƒ÷ØõÙóÉñ÷ï‚îˆíèì‹ì:ìÚë@ëhênéwè½ç“çGèêÉìðDó«õüö+÷ªöööÔö‚øÐúRý®ÿÁnÛ/– Ð r Ñ ›ÅfÜ z ¡ ŠF§>oÎþûúU„ç æ ´ L í`“u80À¸Àª.2Ðÿ0þ¤ügû¹úúìúmûÝûüû¥û¿úLù…÷ õáóœòÝñ–ñ³ñöñ?òSòò‘ñØð'ð¦ï ï5ðœñ·ó=ö¡ømú_û”ûgûNû­ûµüXþFXò ÜÖANù ! Ô ½ ¸ ë ¶ C { ý<Ã;˜Ô î ½ Z ( Ô1.æ –í9–Âw–)pÿ¬ý4ü,û«ú‡ú•ú•úTú’ùUø™öŠôiò‰ðï(î·íí‚í[íêì&ì&ëê;éÖè3évêªìvïJòŒôëõVö$öÕõàõ™öø*ú†üÜþô½O¿&–ò 8 / ³ à ƒ 4 4 Ì ÷M®¹þM‹æ˜&Üþ ±  ½ G ›¸œ„•õŠ?à ù˜ÿ þ}üCûmúúú-úZúhú'úvùUøÏö5õ²óqò”ñ!ññ4ñxñ‘ñjññðTð¦ïïïîQï‰ðŽòõ­÷Öù@ûèûüÿû1üÚüþ¨ÿS½ÂT©ïmCƒ ¿ ! ó  µ  x @ ­ RIUÀ<ãû  ˜   % ê¬6z€v•ÈÓøï‚‹_ÿýñû¹úúºù©ù›ùOùøM÷’õŠórñ„ïîíŸìˆì–ìŽì<ìŸëÄêÛééºèïèôéÕëcî/ñ¯óõmöœöjöBö‘ö“÷Gù~ûÖý) ÄgíC d : µ Ô ¸ œ ß ¡ áŒfAÍÁæ2ÈèéýM ë Ø  ` È Yƒ®ìL´%€­šFÿÔýlüVû¥ú\újúšúÇúÄúvúÅù½øi÷ÿõ±ô“óËòaòBò[ò…òžòò6òÉñVññöð}ñ½ò©ôöö;ùûEü×üóüßüåüPý(þZÿ«Ò§0˜£•×^é 8 ö ! Ï C ± ] ~ * Y Ô D\ݨÅ]³ ¦ ²+Ü–#u Åžyžä Ó%öm½þ&ýèû$ûØúØúéú¿ú$úù^÷bõOóañØïÓîRî6îGîAîîˆíÔì ìYë÷ê!ëì½íìï#òõóõ”õ„õ5õõmõoö%øZúÃü"ÿH6éaœ“L È   ' b ý z %ÝzË•·36î‰0û Ô ë  k ± Ùíÿ/{ìbßA€‹b0ÿþ6ý§üVü1üüèû†ûÛúäùºød÷ öÅô¦ó½ò&òÏñ»ñ³ñŸñxñ7ñãð¢ðšðöðÑñ.óïôÄölø¼ù’ú ûQûšû üûüþ_ÿŒxoªóysÒ}3 ± ³ & # Ò b  = Ø ß T;³¥*Ú Ç Ø  A `aE*6Š+"ˆ¸”5ÿÎýƒüuû¿ú@úïù›ùùføf÷,öÍôió.ò&ñYðÇïTï÷îîîíí–ìJìSìÚìîÂïÚñõóÇõ÷Ñ÷ ø+øDø¦øùÒúœü¯þî+8óB ’ ¬ • f D L ¯ ¼ B á~èót[ª”Iò¯ ” Ò ' › c¸†vÐ.1ïþþˆý4ýýûü×ü‹üü!ûýù·øt÷\ömõ«ôô©óZó(óðò¸ò‚òGòòò#ò–òwóÂôPöí÷]ùyú2û¢ûëû=ü¾ü…ýþšÿ—\ÌùMí £ˆy  E × î ª N  ! ‘ c f`TekX P p ¿  y ©µ¥‰•ÖRË+{Œhÿ9þý üQû±ú$ú’ùòø(ø4÷!öôôÈóœòŽñ¥ðãïIïÈîUîíí‹í1íåì­ì¤ìðì²íïñðó@õ÷[øùcùvùùúñúYü"þõèåzÅäÖ½¬È6 ï ì 1 >*äTY `|i E ! 8 % Öˆöa¼0<E=FhÿÈþZþ"þþþþóý…ýÉü×û±úŠù‚øœ÷Ýö2ö’õòôOô²ó%ó¸ò}òlòŽòßò`óô õ&ö^÷“øžùvúû‰ûüŽüDýþÿôÿÁS°àü+“65u­· ï $ 0 ; e Ç ~ j f DÈê¬%l Ÿ Õ  ] ´  PŸüjìv„ç) ÿLþªýýŽüöû5ûFúùÌ÷NöØôióòæðÛï÷î-îzíÑìEìÕëœë—ëÒëPì%íRîÊïoñó~ôšõSö¾ö ÷i÷ø6ùÇú¾üäþ ® É+G? (‚+  N ” É çÐ{Á OO7 á Ö  RÚ}7ö°K±Ûȧ€enÿºþ`þUþyþ¬þ´þyþøý+ýüÛú£ù˜ø»÷÷uöéõpõòôkôÞóUóâò¡òžòçòwóLôNõgöƒ÷“øùpúCûü»üfýþ½þvÿ8ë€âE¸|„ÁÖD U - ûÜç9 Ó ¨ a ó 4  ­  ! 5 D [ƒÉ@æ¶—vFý’A^^WWÿqþ¤ýóüPüŸûàúúùøøÚ÷¸öõpôfófòoñ~ð‡ïî¯íùìzì1ì.ìoìíøíWïôðžò"ôTõ)ö¥öåö÷l÷1ønù,ûMýšÿàꉶgµÌðµß<Ö± ¼ Ï ß Ü ½kÞÐW¡º ­ Å  §P ÑœPÕÖ“d\•ÿÿêþøþ"ÿAÿ8ÿäþLþaýHü ûáùÙøøX÷ÉöHö¼õ5õôôwóóÃò¸òíòkó'ô*õ_ö¯÷ ùZúƒûuü<ýâýyþÿ¿ÿj ™ Uz­óq%ÿî¢Xif`wÀ> ä ¨ p  Y a  ‰ ¿ Ù ç1€î†CúÊvïJa^Qeÿ¦þþªý^ý ýßüˆü üYûsúhùMø.÷!ö2õOôkóò†ñxðhïqî©í?í6íµí®îðÔñ©óQõ»ö»÷Døtønøtø·øqù®ú^üZþufLaV³vpÿŸaMA I F B  À %Ù G u ƒ ‰ ´  ? öâÉ“)‰¨®›¥ñ†\buxQñÿIÿZþ?ýüû ú-ù]ø§÷üöVö«õ÷ôFô›ó ó§ò‚òžò óËóÅôôõ:÷øÐù÷úîûÀüqýþÈþ~ÿ=ñ™)“ßcÑeã­lRn^?4P©G $  ù – Ô Ã l Ï ú ì ˤ¢Ò=Þ´’q0ÈA™Éæ3ÿyþßýRýÆü,üŒûÞú2úyùÀøû÷.÷dö‰õ©ôÈóçòò)ñKð„ïäîyîUîî'ï$ð}ñóÅôaöÌ÷ÑøvùÂùçùúsú:ûwü+þ!B0ÇÚ[YñEØìWü ä £ : ° ô  Ø g Ç  ( U‘ëjãÕàôã;AJd¾_Kx¼éàƒæÿÿþöüîûû2úùÎø øf÷°öÿõbõØôvô0ôô ô'ôkôæô¢õœöÎ÷*ùúÚûóüÑývþõþkÿïÿK ÃXÂkÅ*¶Vù‹û9?íÌÆó^ ½  x { $ s  w^a†ækh`*º*Lÿ›þþªýRýöüƒüîû@û{ú®ùíøMø½÷<÷ªöö;õZôwó¤òÝñ)ñ‰ðð±ï‰ïïúï¶ðÌñ6óÛô‘öøZù5ú¨úæú!û”ûuüËýŒÿ”¤‰ MV€¹/ý/¶€^? © 5 £ ý : V @ ÷ ~ Ð  U¸HÝÌÉ»ƒ_T"ëÁÕÿ8ÿÿÿ_ÿ¨ÿÍÿ¨ÿ5ÿ‚þžý°ü×û'û•úú£ù"ù…øÜ÷ ÷röÛõbõõØô´ô«ô¼ôúôeõ öÿö?ø¼ùVûÚüþÿ¨ÿ5pÊPî¡Mç|†ÿmÒ.uœ¤–zdd}ÀDð´ h ì 8 / Ø ' A 4,H’áÍͺhÂË—Fÿ þcýýßüÔü¸üoüüjû¼úú`ù·ø%øŸ÷÷KögõWôAó?ò^ñ¹ðKðððQðÁðañ1ò6ónôÏõ?÷›ø·ù‰úû~ûèûŽü¡ý"ÿ ôŒ°BPóM‘ô†Zxà‰Jµ+ | ž ¬    A ûž4Éd ϸ¸Õëåœ * ΙØÿ„ÿŠÿÐÿ8—¹Œ"ÿþýBü¥û)ûÂúQú·ùûøø.÷Pö¢õ$õáôÅôÅôØôõIõ°õEö#÷Jø©ù$ûŽüÎýÈþvÿÞÿ*mÌHè¡f6ý³NÌYz}g1ñ°Žƒ°‘1ËI › ´ ‚  l‘­Õ'¿•˜¦©y¡Ÿ«ÿïþcþ þÈý‹ý9ýÆü1ü†ûÇúúkùÖøJø»÷÷göŒõ’ô“óœòÉñ,ñÌð¥ð¶ðëðPñåñ²ò²óÛô$öo÷žøùLúÞúmûüýOþúÿîû샓  º(‘ÚÚ€þ|ä; n ’ ¯ ´ £ t  ›gÕaN‰¾ÁxÏЊ4ñúÿ]ÿ*ÿFÿ˜ÿïÿ$'ÛÿZÿ©þêý6ý§ü7üèû”ûû„úÂùäøød÷×ö{öSöHöVöuö¢öÚö.÷µ÷‚øùÐú)üwý•þpÿ‘ã2”ÉŠ`5»YÚ9t…q9å€Ä†~³°BµäÀ9gY;3köâ RˆŠ<…‹jOÿDþzýåü”ürüiüaü:üñû†ûûyúú•ùDùûø¤ø3ø¡÷ñö)ö_õ›ôïó`ó óêò ó`óäó~ô8õöööê÷Ñø˜ù0ú¨úû—ûSüPý¡þ=ÅW‘PˆYãVÞ—~ àC¥[»‹ê0 > –â=’áé'’üQ\mv[BK”/ /b—¥†/ÂÿCÿÂþUþøýªýMýâü=üuû’ú£ùÅøør÷÷¾ö†ö\öHöEömöÒöl÷Oøqù®úëûýþ´þ;ÿšÿúÿ_àu 嬄\)è‹RcJªJùÕà,ª?Å" >  žÜëÞÖí.²rfw‚[Vupÿqþ‚ýÀü ü¶ûgû)ûÿúãúÐú¿ú±úšú‡úpúFúú±ù>ù¦øøl÷Éö7ö«õ;õòôÞôýô_õöàöÜ÷õøéù¿úTû«ûÚûôû=üÆüµýÿ³rxjñ Õr ʱÕ\ªà7rÃ+²¡6޶Õ|66e£ÐЛ(…Élë”W*úÿÅÿ„ÿ0ÿÐþtþþâýÃýµý¤ý…ýPýðüdü¾ûûTú¼ùGùçø–øOøøÔ÷¤÷Ž÷œ÷ö÷øyùŒú¨û»ü–ýDþ·þÿOÿšÿSÜ8ÊQÍEÄ4‹°œHÏ7¶WQÒƒöÚ<Q=-G™+ೋPô_¦ÿÅþóý1ýˆüüŸûQûû¥úCúÙù„ùUùIùcù¦ùìù*úIúIú ú¬ù3ùµøDøê÷²÷–÷¡÷µ÷ð÷MøÑø„ùmú€ûªü½ý“þÿÿòþ¯þþÅþyÿ #ÀCd )×:„ìsŠºæôØÊä-îšä(….4‹²(RŠª§¼«ÿšÿ¿ÿ:F´ÿ*ÿ¡þ6þðýÜýíý þþþý¬ý#ýuüÇû$û¥úIúúáùºù„ùGùùÑøÈøþøŠùmú”ûÑüþýäþeÿŒÿpÿ;ÿÿAÿ«ÿg\t“ v‘å&Voza&ÄNÛŒx¹HÉ`¤‚èöãÖøföêÑ}àñÊÿþcýiü³û7ûéú±ú{ú'ú¼ù>ùÃø]ø%ø1øløÈøùOù;ùáøXøµ÷÷—öBöö,ödö»ö+÷²÷`øAùNúƒûÑüþ*ÿïÿTus؉áCŽ‹1ÜV­±pTLQTL@8Ch¥î,@«%G1‚ß Ë1g‰ÍÿLÿÿÿ*ÿ]ÿvÿhÿ%ÿ¿þcþþûý þ9þfþþ‡þOþÑý.ý}üÝûmû)ûû!û5û'ûñú—ú5úõùúvúNû‹üûýpÿ°”Éo4µ……„KèV–»Æµ‘Mù‘!±jZ„ægå<7ÇúÞº­èg22E@ümŒÿþ}ýŽüÄû2ûÐúú2úÖùcùõø˜ø`ø`ø…øÈø"ùyù´ùÅù¦ùWùïø…øøÆ÷¡÷¡÷Ñ÷ø|øßø]ùúÕúàûöüþÿØÿHjeb‰ü¾Éõ-,Ý ¨/¿v_{¹ü,E2÷éô5NCü{Êý9§UP…Ü+Džó2{ìÿÿnÿhÿsÿ~ÿhÿ"ÿ¯þ"þ‹ýýèüþüMý§ýçýðý²ý?ý°üü”û@ûûû!û$ûûàúúmúWú’ú/û)üfý¿þôÿñŽÄ¥@Ìx\ÚæT¶ì÷÷ú  é±sNT’œ }ˆ,rsh|ÃX) âu¾Êÿ´þ§ý°üîûdûÿú¥úCúÂù*ùŠøû÷™÷w÷Ÿ÷û÷‚øùqùžùŠùLùíøø#øÜ÷²÷­÷Ñ÷ø…øùÙù¿úÁûÚüêýêþ«ÿ8xu_Wñ§–¦ÅÍœ#JÇV÷¼®Ïü2NYVVa€Ÿ»Ç¢SÒ8ÀŠwyˆ…]ûX޹÷ÿTÿáþ•þfþGþþâý…ýý‘üü¨ûjûNûKû\ûQû/ûüúÄú—ú{úbú_újúúšúšú‰ú\ú*úúújúû&üwýÓþ',Ò ârÝQ_öíÖ„é¦®·ºÍúF¿E¾  °8Z›­‚wi<×)KCÿ-þ&ýBü‰ûéúhúçùcùäøføû÷¤÷l÷^÷t÷œ÷»÷×÷Ü÷½÷‹÷?÷ëöªö{ömöŽöÝöS÷ð÷¯ø˜ù«úèû<ýŠþ¿ÿ«P°Á¥{x¸EÙ F¨Í³TLWx—±ÇÒʶ££¼é$Na@÷{éZõÀ¯¬©–f‹ódésÐÿ‡ÿ0ÿÖþ]þÎý9ý§ü.üÚû¢û€ûxûpûbûEûû¶úWúúÍù´ùÂùáù ú$ú-úúúú*ú„ú$û ü+ýþÓÿ ö“ѽl »œ³¯wR¹Yg\C!ñ³hặä/—ñ¶*v¯lÄ™u7ÝbÇÿ-ÿþõýfýâüYüÌû=û¨úúnùßøfø øå÷è÷ø%ø?øDø.øþ÷Ã÷¡÷Ž÷œ÷²÷Ñ÷øXøËø]ùúûüRýþ´ÿ¥PµåÝÏÏöM×y«*á›nLWv˜¿Öïò÷!Q’ÏúÕ{ôeêž|·ÓΞ9µ&­HÝÁ¥u'·ÿ'ÿ‡þêýcýöü­üƒügüSü,üöû¶ûgûûéúÍúÕúÿú2ûdûpûVû$ûôúÞúñúNûëûÚüþAÿsu7µ×À€< +zêqõh´ØéÛ¼`-ûѯ˜¤Óá$@!Å>›ûrÝÆÆ»—PàWÍÿCÿÐþfþ þªý9ýÀü1üûû„úúÖù®ù›ùŠùvùOùùÖø–ø[ø.øø øDøwøÃøù„ùú«úuû^ücý`þCÿŒî,Y†É)–˜Z±¿º«£©¿äN¶æ =d‰šœƒQšŠøy%ðÙ˪f ™8Þÿ¦ÿsÿ8ÿøþ˜þþwýÑü=üÌû‰ûrûmûjû\û2û÷ú£úWúúúú0úsú¼úû\û‘û¥û«û°û×û4üÚü½ýÍþãÿàµBœ¸§t?Gê3q›ºÓí;Z`R*ý˯¬ËTÊÊŠqµ‰#éÄ¢p$ÍÿTÿÖþcþõý›ýMýýµüYüæû\ûÊúCúÖùžùù©ùÐùõùúùÛù›ùRùþøÀø˜øø¤øßø;ùºùNúûÄû™üoýLþÿÐÿbÁô7oÉ<ÃG¯õûÙ¯‚fi·]¼!p¶ãÕ’@é3ê¬wJÆdèYÄ8ÅÿhÿÿÐþ“þGþêýzýöürüëû{ûûéúÐúÇúÂú«úyú0úéù±ùžù£ùÐù úNúúÂú÷ú,ûjû³ûü¢ü[ý3þ*ÿ$°.t“™‚€žÎyÅ 6ITZWTR>"ûÖ·¯Àç%e˜®˜RßMª‰Á8áÿ|ÿøþkþÜýXýåü†üBü üãû«ûgûÿú‰úú ùRù-ù0ùZù’ùÈùáùÐù›ùOùùÑøµøËøûø`ùïù±ú”ûˆü}ýcþ-ÿÛÿ_°à÷üN¥™i¯ÓÜά|Jß»¯Àþfí|{Ïú÷Íš\ÐTç´‚Mž ‰éF®ÿ*ÿ¿þkþ(þßýý+ýÀü[üëû‰û'ûÒúúWú0úúõùÙùÅù±ù·ùÐùúIúšúÛúûCûxûÉû?üÆüoý(þýþÓÿ°r‚Æð .Mq˜Î Fqe6û½ˆcRcÎh«æÞ"©“³^à—@ÕÿTÿ·þþoýÔüEüÕûxû)ûØú~ú$úÈùeùùÈø›øˆøˆø˜øµøÅøÜøçøïøíøäøíø ùLù®ù8úæú»û§ü¤ý˜þvÿ5ÁNguŽ»þdÑ0Îû øÜ·`?.AnÅ6¼F¼ 2)¿e ®`%õÓ²…M Ãl”~æÿFÿ±þ%þžý(ý°ü?üÚû~û'ûÕú‡ú>úúÂù‡ùUù0ùùù3ùOùŠùÞù>ú¥úû\û³ûü‹ü+ýðý¿þ£ÿƒKü–X“ºÜý;TsŠ´é'e~p-Í]ï›wˆÈ6«j„x2ÍZÙ[åt³V÷‘,¹ÿFÿÍþLþÀý&ý‹üëûEû¨úú‡ùùËø˜øtø`øMø?ø3ø+ø6øJølø“ø½øäøùIù•ùúùyúûÝû»ü¯ý¬þÿQã@u”­Ú&›„ÐôïäÊÂÅÐÓÈ«R*8sÅp®ØàÁ†=é ]"ê²w9ó­Pþœ:Ä@´ÿÿþÙý6ý–ü ü‰ûû³ú\ú ú¼ù|ù3ùøøËø¬ø›ø¤øÀøíø(ùsù¼ùúZú±úûŽû#üÆü‚ýRþ'ÿ÷ÿ¾x ².ŠÓ 0Wh Êú5v¥³±Œ;Ó`ý²–¤Ö"|Ðý¿]çkð‹1Ô}!¾\÷ÿŠÿ"ÿ©þ(þ–ýöüSü«ûûjúÙùcùù²ø‚ø`øJø<ø+øø øø÷ø÷øø9øføˆø½øùsùú±úuû[üJý3þÿÇÿT¾NŸ‹©"„Êò$;Tj’Œshp{’³ÒæñÿüìÒ£jÂ]õˆ%²JàrŒsÿÜþ9þ–ýðüEü¥ûûúú¦ùIùûø¯øiø+øó÷Ã÷§÷­÷½÷ê÷+ønøÃøùqùÈù*úŒúôúgûôûŸücýUþTÿ_V? ²8’ÂÖØÞÞôb¿,ŽÝ  àŒ£2á·®ÐI„  m¦qÀ&—#¼_¦ÿOÿêþvþêýPý­üùû=ûúÊùùzøè÷t÷÷Ìöœöƒöxöxö{ö†ö‘ö¢ö¶ö×öùö&÷d÷µ÷ ø¬øZù'úûîûÑü§ýkþ-ÿæÿ¢a+ó´`á@m„„Œ ÊE~¨¨—xN2'/S€ªÇÒÉ»šr@ Ò’FÛ]ÑAÀMè—P ÁeæÿCÿ‚þ§ýÉüôû/ûúìùkùïøwøø»÷r÷:÷÷üöñöóö ÷&÷M÷}÷¸÷ø÷Jø¤øùyùïùmúìúxûüèüêýÿeÁ (†¹šQýÂÅC ¾Dˆ6ÆBÌm5/C\o~‰x\¿=Öþ+lÌQôÿ®ÿ_ÿÿ„þâýý7üKûZúyù¦øí÷M÷ÉöPöëõ—õTõ*õõõõ õõ'õ=õbõ{õ õÕõ!ö™ö4÷û÷ÜøÓùÄú«ûƒüRý(þ%ÿ5l¸ûñxŸ‰\:\¾g#Ùh · · „ " ½c+#.McfMÚ¢oM.ÒoÒ   l÷¹¥”p'šÿÞþõýóüùû ûFú¦ù"ù¬ø?øÌ÷V÷Úögöö¼õŒõvõvõŒõ°õàõöNöŽöÔö#÷€÷è÷XøÎøLùÙù‰úmû‹üêý|ÿ,ÑIeK¨/ò±°ö9 8 Ø  ¼ ' q º6óè1RcM ðÆª‘i‰¶ k) 2¦ÿTÿ3ÿÿÓþhþÀýÔü¹û‰úcùlø¤÷÷°öaööÊõmõ õ®ôeô3ô"ô*ôAôhô‡ô ô«ô·ôÞô2õ³õdö7÷øþøÙù«úƒûiüqý›þýÿ‰" Ø¥ ãëHóð  Ï E d : ë ƒ =  ý ÿ ú á ¨ F È D ËqG4Úa—•]ëî8Ðÿÿ„ÿeÿÿ|þªýŸü†ûmúyù·ø(ø»÷d÷ ÷ªö4ö¹õ/õ¼ô]ô-ô'ôLôŠôÓôõYõõÄõöVöÁö4÷²÷9øÅøqù0ú)ûKü¬ý3ÿÚwê ³æ³Qôæb_Ìc Û ö ‹ œ 7 Œ Þ L ø Û é   ä ’ + ²Uþå™ü´6µjnÿÓþþ|þvþUþóýDýVü5ûúù1ø…÷ ÷¨öPö÷õ‰õõô*ôìóÖóäó ôFô„ô¦ô¿ôÂôÂôäô8õ¿õ}ö[÷6øù´ùLúØú†ûgüýýþšJÑìKQ/!Vëè% s — d Ô ë Ï ‘ Y H V r Ž ‹ N Ò / p º 0 ßÈäþäq‘E·‘e’ÿÿïþÖþ¦þ>þ–ýªüŽûeúWùzøÔ÷^÷÷Äöjöüõsõéôhô ôÖóÜóôsôÞô=õõõõõ¨õÕõ,öŸö+÷Ã÷iø ù¼ù’ú”ûÔüOþúÿ§(Dò÷±•Èm‰ù‚ Þ æ l o & ¥ @  H ‘ Ò Ï ‰  Z ¦  ²‹“¡zûÁ;ž2;ÿËþŠþXþ þý²ü¶û’úùøÔ÷J÷Ýö‰ö2öÍõ_õæôbôìóžówó‡óÎó"ô|ôÇô÷ô õ õõ5õ’õö×ö­÷…øIù÷ùúCûü ýLþÂÿ^øZL¶±bZ7râA T  B = ü Á ¢ Ä  x » ¾ d Ê 8 " õ   È ãb´ÇÐÿCÿÿòþÐþyþÎýÑüšûNúù+ø€÷÷Éö‹ö4öÁõ2õ•ôô“óUóXó£ó"ô¿ôIõ°õæõëõØõÄõÄõæõ2ö¨ö?÷å÷Šø>ùúñú#ü™ýFÿ¯Þ5È«FV¸9 ˜ —  ! à ~ 2  @ — ÿ K \ # ¢ ÷ I ¯ G íÑ‹ö ÊI½B8ÿ±þ`þþ½ý&ýYüQû;ú(ù6ø€÷÷°öuö/öÝõvõõ£ôIôôøóôFô ôõeõ³õéõö,öKöƒöèöi÷þ÷–ø-ù·ùLú÷ú×ûþüZþìÿ†(Þ ÈLѤ꺈 O * — ¨ Q H _ ¨  H Y  † Ø  |  òþ ¬è¸;¡݇ÿTÿAÿÿ±þþýÌû~ú>ù?øƒ÷÷Éö¢öoö/öÍõWõÞôvô;ô5ôeôÐôNõØõPöŸöÏöàöàöñö ÷z÷í÷qøõønùçùpú,û&üiýêþ#kW¼eѺÕ1¿ £  /  ì á  Y Ä  B  Ÿ ï 2  ßÑίU–rqè®ÿÿÅþ•þfþ þoý‘ü~ûNúù ø4÷—ö/öãõšõNõ÷ôôLô ôáóÞóúó5ôvôÇôõmõ³õö\öÉöM÷ß÷wøù|ùÞùIúÂúbûHütýêþ‘BÀä~IÍqvý–- ¹ \ ™ † V 4 : l µ ü  â l ¹ æ ' ž W L k t D ¬­7Ñ@ LÿêþÓþÍþ¡þ(þaýHüû®ù|øƒ÷×ödööñõÁõ†õ=õæô ôvôsôôòô_õàõ\ö¸ö÷4÷S÷r÷¯÷ øwøøø|ùúùvúìú€û?üJýžþ$ÉM˜m¿•Ds!:‹Öé   ú ý Þ ¶ ¹ Û ' x ¶ Á ‰ _ ¯  ¡f^R4ÉØhÎBÿ£þ‚þ‚þqþ-þ™ý²ü‰ûFúùê÷ ÷döùõ®õxõCõõ¿ôyôCô'ô0ôZô ôôôTõ°õöPöŸöÿöo÷ó÷ø6ùÓùmúúú€ûüÌüºýáþC¾<yL£xún3Óÿˆ „  = ! è ¾ ¹ ã # S V  ‰ Ø  n ê¡‚tBÆö¿Až ¹ÿËþGþþþþêýýÌü×û¹ú›ùøÀ÷ ÷³öjö:ö öàõ³õ’õ{õxõšõÏõ!ö}öÔö+÷r÷§÷Ñ÷øDø›øù›ù-ú¹ú5û¢û ü‹ü9ý"þTÿ¾E²Û«F•õ–ÅŠÍEµÓ ¿ ± ~ Q ; b «  F F ÿ e ¬ Ü+§gH:ÿ€¥s{çþ"þÃýºýÔýÜýµý.ýVü:ûúùÅøÀ÷÷†ö:ööÛõ¨õeõõÞô·ô´ôÓôõxõÝõ=ö‰öÏöÿö<÷‹÷þ÷ø0ùÐù\úÛúCû°û1üëüçýÿuÚ©Lº9 ]F¥:Ë  u Œ p 8  $ Q ¹ ¼ ~  e ·  –Jð¤@ ˜¢yÿ¯þGþþþ þÆý6ýMü)ûáù¤ø™÷×ödööÿõãõÄõ’õgõ8õõ*õ_õ õÿõVö­öèö ÷÷1÷[÷²÷?øõø¿ùŒúEûÚûEü°ü+ýíýøþKÉAL•C’À ûf]¼<Š  2  Ù ± º ò L £ Ê ¦ - | ¤Ñ1Ä”‰u)†(œ'çþþ²ýªýßýþþºýþüñû®úqùcø–÷÷×ö³ö—öjö,öãõ’õTõ;õ;õsõÄõ4ö—öóö)÷M÷i÷“÷ß÷]ø ùÍùú5û°û ü[ü»üUý-þQÿ¨ULÐØyá] ]WÒG I ¦ ± v 2   0 ~ Â Û ± > › â9°S)¾:_8ÔaÿŠþcþŠþÂþÖþžþûýþüÄûjú3ù<ø“÷.÷ ÷ÿöóöàöÄö†ö\öBöKöxöÆö÷a÷œ÷½÷Ã÷»÷Ì÷øtøùçù¶újûöûYüœüëü[ýþÿWÁ ÂÖqÈ™ˆõ5†§qßøÙÅÅûZ Í * T " £ í[Äd7ñ†Êºi ÍÿÖþLþ+þUþ¦þáþáþþÖýÔü¢ûsúvù½øMø øè÷Ã÷Ž÷B÷îö¨öuöoöœöñöM÷­÷øDønøø˜øÅø"ù©ù_ú'ûëû†üùüDý…ýÙýZþ%ÿ5{ÎæWIáA½‚¯`p¥Ãž 0 þµt[íf Ð õ È O ™×xÏ•2•¦rÍÿ·þþÎýûýkþÞþ%ÿ ÿŠþ¤ýƒüYûWú ù;ùùù%ùùçø–ø9øè÷½÷Æ÷û÷[øÅøùLù]ùLù3ù-ùWùÅùmúHû#üëüzýÖý þ>þ“þÿáÿØöþÓTk"ž ž}Ñ|heHå7H7&1oÑ<“·‹o°~$òʇMEØÿÜþ0þêýþZþºþýþõþ›þðý ýü7û’ú$ú÷ùéùáùÅù|ùù¬øOøøøRø²ø(ùùÖùòùçùÊù¼ùÈùú’ú@ûÿû­ü&ýqý“ý¯ýíýcþÿ7iq6Šsíº¦±¢PªµƒB ü)wÎ ÜlÏ,—$Þ®yitKøþ+þÃýÃý"þ¡þÿAÿÿ˜þÆý×üëû:ûÒú¼úÒúÿúûüú¹úLúÞùùRùZùùÙù$ú_úsúpú\úLú_úúûÇû”üaýþyþ±þ½þºþÍþÿvÿ$üâ¯AwXö‚ó¡XÐI~bFCj®Y~g£’0ïŘJÎ//;ÿ‚þ"þ"þkþÜþAÿ|ÿkÿÿXþ…ýµü ü«û€û€ûŽûŽûdûûšú$úÂù•ùžùÛù5ú•úæúûûûãúÇúÞú)û¨ûHüëütýÀýÙýÆýµý²ýíýtþCÿCPBç3"Ñt#MÆk®5*éìT«ìü¼QÖbý¯k0ÔG†‡ÿþÎýoýoýËýZþêþLÿ_ÿÿ„þÈýý[üñû¾ûÄûàûôûèû¹ûrû!ûàú¿úÍúûVû¨ûèû üüæû¾û«û»û ü‘üDý þ¿þLÿŒÿ˜ÿsÿFÿ*ÿ>ÿÿ'é§S»Ù¸d¸œ¸…þ[˜©ž‚²çD>©0²Jó»”\xÂÿõþ6þžýJý[ý²ý;þÐþAÿsÿbÿÿyþðýwý+ýý#ýBýMý6ýý­üVüüüüaüÌü1ýýªýžýlý#ýëüÉüßü(ý–ýþ‚þÓþúþøþÜþ¿þºþÞþ8ÿ¼ÿ\Žè ùÉŽjg‹Ï&t¯ÃÆ»¸Æç.È í´`Ãw+Ý}uÍÿÿ„þ"þþ"þ|þìþeÿ¹ÿÛÿ¼ÿhÿÿžþGþ þðýêýõýíýÑý“ýMý ý×üÉüÝüýPý–ýËýÔýÆý“ýcý9ý9ýiýÆýAþÓþOÿ¨ÿÐÿÂÿ•ÿWÿ3ÿ*ÿ_ÿÊÿWô}àÚœ^=:^œÝ9?7.+Gt¡ÔûøÑ…)Æg®_·ÿFÿ½þ6þ²ýUý6ýcýÆýJþÖþ;ÿvÿsÿ8ÿäþ“þRþ6þ9þLþfþcþAþ þ½ý}ýXýcý–ýçýOþ¬þìþÿìþÂþŠþ`þLþZþþäþ>ÿ’ÿÊÿæÿãÿÕÿÂÿÂÿÛÿbÄ/†ÄåðåÔÁÄÝþ&GXXM7.7P‚Ãû+A?×€¥/³5®ÿ*ÿ©þ9þßý¯ýµýêýDþ¦þÿZÿ|ÿyÿ]ÿ0ÿÿìþäþäþòþøþòþÐþ¦þhþ>þ+þ0þUþŠþÍþÿ%ÿ0ÿ-ÿÿÿÿÿZÿ±ÿ{¹ÒÄŒHìÿ÷ÿ$pÄ^ƒ”€gN@7@KVVH2 îÒØæEu™§‘dÊs´ÿZÿõþ“þþ¯ýGýþü×üíü#ý‚ýðýXþ©þÙþäþÜþÈþ·þ±þ·þÍþäþÿÿÿòþÙþÅþÓþõþ5ÿÿÓÿ:C5!$Ce~‘‘uQ*!Cp¥Øù#),#  ñÒ¶”ƒ Áñ#PddNÁWãÿhÿõþŠþ(þÙý›ýwýtýýµýêý+þcþ›þ¿þäþòþúþÿÿÿÿÿÿÿÿúþçþáþÜþïþÿ"ÿ8ÿFÿLÿLÿQÿZÿvÿ¨ÿéÿ2u®ÇÇ¥j2úÿÞÿÛÿìÿW—Ò#:=4# ùëàÚÕĶ¥š”š ³Ìæÿ  î¼u®ÿ;ÿÓþtþ"þçý½ýªýžý¡ý¯ýÈýçýþ>þfþþ•þ¡þ›þ˜þþ‡þŠþ›þ·þäþÿhÿ«ÿ÷ÿ5_pm\F58FgšÏùñãÝé÷)=HS\jlxr^EØ”QýÿéÿáÿæÿæÿéÿãÿØÿÐÿÕÿãÿñÿÕÿ•ÿ8ÿÓþhþ þÃý™ý}ýoýqýwýý…ýý™ý¬ýÈýäý þ%þJþ]þvþþ‡þþ¡þ´þÖþÿ0ÿkÿÿ¿ÿÛÿÛÿÊÿ«ÿŠÿvÿ~ÿ¦ÿéÿC ÷)B7泑~‰—¼Õô&)2/ùÁ†@ ÞÿÅÿ¼ÿ¼ÿ¹ÿ¹ÿ®ÿ˜ÿsÿLÿ0ÿÿ ÿÿÿÿõþÍþ“þGþøýµý‚ýiý^ýaýoý}ý}ý}ýtýqý‚ý¡ýÔýþRþ„þ©þºþÂþ½þÂþäþ%ÿ~ÿñÿgÚ2l}^4ÿÚÕæ E{ªÄÒĵŸŽƒ‹Ÿª°¥‘xaSY^jrgE ¶Yýÿ´ÿ„ÿyÿ~ÿ˜ÿ¨ÿ·ÿ«ÿ•ÿpÿOÿ8ÿ*ÿ'ÿ*ÿ-ÿ"ÿýþÈþ„þ9þçý¤ýý}ýý²ýßýþþ%þþþþþ6þZþŠþ´þÓþáþêþäþáþúþÿ]ÿ¦ÿñÿ=x‘ŒpN/,F~Ò:œè בP&  !:V\^VNYx­âþüÏxÿx®ÿ|ÿkÿyÿ„ÿŠÿsÿAÿõþ¡þUþþóýçýäýçýâýÎý¤ýfýý×üŸüˆüŽü­üÚüý(ý<ýBý6ý(ý&ý6ý^ý›ýßý"þZþ|þ“þžþ´þçþFÿ¿ÿTæjÌüùÚ¢ud{³ i²âíΙ[&óîè׸‘lP@BgŽ¸Æ¸}!—Œÿ*ÿïþÓþÓþÜþçþÜþ½þþ`þ9þ"þþþ%þ0þ%þþêý½ý‹ýXý4ý+ý6ýPý‚ý½ýóýþ%þ-þ;þGþkþ›þÐþÿ0ÿTÿ_ÿnÿ|ÿŒÿ«ÿáÿ,‰ëK޳³‰^:7dÆ?À%UU»Müĵ¾Òââϵ¥ªÉ S“½»€rÄ$¨ÿWÿ'ÿÿÿÿÿËþ“þJþ þÜýÈýÃýÑýâýâýÆý™ýXý ýÏüŸü”ü¢üÆüðüý9ýMý[ý^ýlý}ý™ýÆýøý+þ]þþ¡þ½þáþÿbÿÅÿC¾4™Ôî⻎lo—èG¤ç ê¸zGðÚÁœ†lo€ªè#P^<àdÇ*ŒÿÿºþþqþhþcþXþAþþõýÆý™ýwý[ýJýJý<ý1ýýþüèüÌüÆüÉüÚüíüý#ý4ýGýXýiý‚ý¬ýßýþ]þ“þºþÙþêþÿÿ8ÿeÿ±ÿ pà7x——‰x€ŸëS»"i“Š[΋dJEGMMGJ^€»AiyUódÁx÷ÿ ÿnÿQÿ>ÿÿòþ¡þDþäýýUý6ý+ý#ýýöüÏü–ü^ü1üüü ü4üMü[üuü†ü™ü§üÆüðü1ýtýºýþ9þ`þŠþ¯þÞþ%ÿyÿéÿgëuþd²ÔΪwP9EwÉ+|½ÜÑ©k׎U#þèÚÝð9fŽœˆPëaÁhÿÙþkþ(þþþþþõýÈý™ýXý ýÀü}üBüüüûñûôûùûü ü.üEüVü^üoü€ü‘ü§üÌüùü1ýtý½ý þAþ‚þ¬þËþäþòþÿ"ÿ]ÿ´ÿ!®:Æ<‚¤¡“‚‚ޏó.RfR(ó»ˆ^B&ùåâî 9o§Ùíê¸aåN¥hÿøþ©þyþfþRþDþ0þþâý§ýcý ýßü§üzüMü)üüÿûùûÿûü,üBü[üuü€ü”ü¢ü»üåüýUý™ýÖýþ3þRþfþ|þ©þïþIÿ¹ÿ5ÄSâ^»ðóÖtf}­ð.kŠn6âža7  1B^wŽœ¤ž“r4ÔP¶sÿìþþJþ;þ;þJþLþ3þ þ¸ý[ýíü†ü.üëû¾û­û­ûÇûàûüûü)ü:ü?üSüaüuü”üµüâüýPý‹ýËýþý(þGþ]þnþvþ“þºþøþOÿÇÿTî}þd§Ë˽¤“Ž‹–ž­²²ž}[<&9Pt¯¸»²™tBª=¾/ ÿÿ¿þyþRþDþ;þ0þþûýÆýlýý¤üMüüÏû»û³û¾ûÒûèûöûüü&ü:üSürü¢ü×üý?ýqýžýÆýíý þ3þZþ“þÓþ5ÿ¦ÿ$®7ÁB²öøÑ­ªÃJ›ÖçÓ›DÜ‚M49X€ªËåêåÙÔÀ¸§ˆSü‰ùYÅÿFÿòþÅþ·þ½þÅþÂþ¡þ`þþ™ý(ýÉüuü7üüüü#ü,ü,ü#üüü ü4üYü”üÏüýUý…ýµýÜýþýþþ-þ3þJþcþ•þÞþFÿÐÿmÆiê?UDß¡}l}¤Îíøê½Ž^7+<Uˆ²ÜöþöåËÀ¸µ¯[‘ ~ñÿvÿ%ÿïþäþçþïþçþÈþþ;þÑýiýöü–üHüüÿûôûôûëûãûÒûÁû»û¾ûæûüaü¸ü ý[ý™ýÆýçýþþ>þqþ¯þïþIÿ¹ÿ:Êdù‹`ŠŠf ܧ™ÃyÖ*Èk ½™“µÜ %(ûÙÃÀÃÆ½™[ðjÕFÓÿ~ÿZÿWÿ_ÿkÿ]ÿ0ÿäþ„þþ¬ýPýýÝü¸üŸü”ü‘ü†ürüVü=üüüüü=üuüµüöü1ýfýˆý¤ý¸ýÀýÈýÖýêýþý0þkþÍþQÿìÿ¢g&ÎJ‚|DêJ+B€å<wwJѵ¸Ù?fn[3ܸ²»ÆÀ™PâV¾,±ÿ]ÿ3ÿ%ÿ*ÿAÿCÿ%ÿòþ•þ+þ¸ýBýåü‘üVü,ü üîûÕû»ûû€ûxû~ûŽû¹ûöû7üzüªüÝüý&ýBýiý™ýËýþGþ•þòþbÿæÿu¸PÎ DDמ‚‹ÀwÎò½RDJiФ¦˜q? çËÆÃɲ…7ÏNÒ\Íÿ±ÿ«ÿ¦ÿÿyÿ;ÿáþvþþý.ýßü§üzü[ü:ü üÿûàû¹û¥û—û—û¨û»ûÝûü.üYüzü™ü­üÀüÚüöüýDýwý¸ýþnþòþŒÿH Ï‚XRª1Ï™¢×<²]|tX6 9[yyc3ó²ˆllˆ™¯œf{ÝCÇÿpÿCÿ8ÿ;ÿIÿIÿ5ÿÿ½þfþûý™ý4ýÝü‘üYüüèûÄûŸû‰û{ûxû€û‘û¥û¾ûÚûöû ü)üMürüŸüÌüý6ýwýµýøý>þ›þÿÿ¶^ù}ÑöΖX+&?€Ù+c|w]?%%0G`cMߎGþ  ÆlùÇÿ’ÿ~ÿsÿkÿ_ÿ>ÿ ÿÐþ„þ+þÖýzý1ýöüÃü–üdü7ü üèûÕûÌûÒûàûÿû#üKüiü†ü™ü§üµüÃüÔüíüýBýwý²ýûýZþÈþQÿéÿšNètÎíÜ‹+Ág/2V¢U»ÆËÑß3R[D Ão)ùèð Ô€¨:æÿ±ÿ¦ÿ´ÿÍÿæÿïÿáÿÅÿŠÿIÿõþ›þDþçý–ýBýíü­ürüKü1ü)ü.ü?üPüdüwüƒüŽüœüŸü¤ü°ü¾üÚüý4ýtý¯ýõý9þŠþêþ]ÿæÿp†ð<^S)ƒªëG¤û0DA0  (?OUAß™XóÔÆ¾ª†Nÿ:ãÿ¨ÿŠÿŠÿÿ´ÿÅÿÂÿ«ÿsÿ*ÿÖþþ;þûýÆýýaý.ýùüÃüŸüˆü†ü†ü‹üŸüµüÌüßüðüþüýý#ýDýoý¡ýÙýþLþþáþCÿ¹ÿ@ÄKÆ+tˆUÉŽjg†ÆX–Ãßö (9?<% Ü­…i[U^^M)å‘/Äm2 !=T\T,¼ÿyÿ3ÿïþ©þnþ+þäý™ýUý&ýóüâüâüóüý?ýcý}ý…ý…ý…ýý‚ý“ýºýäýþDþfþ‚þ©þÞþ%ÿŠÿ÷ÿ~ †ë#9+öµxPBY‹ÌS…¤¯µµ»ÆÉËíf4 ëÔÌÌÔÄ¥g °Wìÿæÿ,\x\Íÿÿ5ÿøþÐþ¦þþLþþËý“ý^ýGý4ý9ýBýDýPýMý<ý&ýýýý ýRýýäý6þ‚þ½þêþÿFÿyÿ¿ÿmÊ\ƒ‘ƒY,ÿëé H‹Ý&^ˆœ¤ª¯»Ã»¯–wS.þè°^ü¢W$,Ns‰†g'Ûÿ’ÿWÿ'ÿ ÿòþÓþ¬þkþþ²ýcý#ýýýý4ýRýfýoýiýaý^ýaýzý™ýËýþ9þ]þ|þ‡þþ›þ¿þÿhÿÞÿ\Ø4u€oKôëü2oÁJirdSMJ[ittr^S1    î³\ô—K'/bÕ÷éă2áÿÿeÿCÿ-ÿÿõþÍþþ;þøýµý‚ýlýXýUýPýDý6ý1ý+ý.ýBýaý“ýÎýþUþ˜þËþòþÿÿÿ5ÿbÿÿñÿQ¢æ ñÊ ”ÄE€ªÄÒÒÏÌÔ××ϸ”r=ëÝØØØÁ e'áÿ·ÿ£ÿ®ÿÛÿKje:ýÿ®ÿnÿ>ÿ%ÿÿÿ%ÿÿÿËþþRþþðýÜýÖýäýûýþ þõýÑý¬ýýˆý–ý½ýíýþLþhþnþnþvþŠþ¿þýþWÿÅÿ'~¼Úϳ†_FF_‰¾ô!7HBBENYr‰””‰rS4!ùÚ°H/m³ôô¼@éÿÓÿÅÿ¼ÿ±ÿÿ|ÿTÿÿìþ½þ“þvþfþUþ9þþçý½ý¡ý™ýªýÎý þLþ‡þ½þÙþÜþÈþ¯þ›þ•þ›þÂþÿQÿ£ÿñÿ,CH5$!:b¼æ,7No™¾×èâÒ°€\:#ëÏ«{K!*g¨æ  ñ¹x=ñÿéÿéÿïÿñÿÞÿÂÿ˜ÿbÿ'ÿÿòþìþòþïþçþÈþ›þhþ6þ þõýóý þ%þGþ]þ`þ]þOþDþ;þAþ`þ•þÞþ-ÿÿÇÿ÷ÿ$/QuÌéÿ :Vƒ§ÌåëÝÁœrK!ùÏ¢sHýÿúÿ'\ÝÿùÊŒKñÿÐÿÂÿ·ÿ«ÿ˜ÿÿZÿ0ÿÿáþÅþ½þ¬þ¦þ•þyþXþ;þþþ3þRþ„þ´þÜþìþïþÜþºþ˜þ‚þþþ·þêþ-ÿkÿ£ÿÓÿúÿ/FmšÄã÷ 2Px¢Æèóðîà̵Ÿ†a7Ê”Y5$,K¼÷!,!Ø®ƒ_C82*'!÷ÿæÿÓÿÍÿÇÿ¼ÿ¼ÿ±ÿ¨ÿ£ÿ˜ÿ|ÿeÿFÿ%ÿøþÓþ¯þþtþZþGþGþRþnþ˜þÍþÿeÿ®ÿñÿ*Km††ƒ{{{{{‰š³ØKŽÌ+BJ.Æ{B¾Q*2_—Ìÿ)!Ø b/ áÿÅÿ´ÿ˜ÿ„ÿhÿOÿ0ÿÿÿõþêþçþòþýþ ÿÿ*ÿAÿOÿTÿLÿ>ÿ*ÿÿòþÞþÂþ±þ©þ¦þ©þÂþäþÿFÿ|ÿ®ÿÍÿéÿúÿôÿôÿìÿôÿýÿ'C\u‘°Ú7o™ÁÚà×Á—j4Ï—~bQNKKN\juƒ”¥¥”m=Õÿ®ÿ•ÿŠÿŒÿ•ÿÿÿŒÿsÿQÿ0ÿÿÿúþÿÿÿ%ÿ*ÿ"ÿÿÿÿýþÿÿ%ÿ8ÿCÿCÿ;ÿ3ÿ-ÿ5ÿCÿ_ÿ‡ÿ¼ÿôÿ2=8'/Kjƒ‘ °ÇëBuŸ¸¾­ƒPÝ®Œ†Œ °¼¼³« š¢°ÁÊÌÁ¥N$ñÿìÿæÿæÿáÿÐÿ¹ÿ£ÿ|ÿkÿQÿIÿ>ÿAÿAÿCÿIÿLÿLÿ>ÿ;ÿ3ÿ-ÿ'ÿ'ÿ0ÿ5ÿ5ÿ3ÿ-ÿÿÿøþýþÿ>ÿvÿ·ÿôÿ!55,÷ÿýÿ ',,**2Np Ïù ÷Ø¥xN::Nj‘ š‰{smpx††xgK=,''*/Ûÿ®ÿ|ÿTÿ3ÿ-ÿ0ÿLÿeÿ~ÿÿ‡ÿnÿCÿÿÜþ´þ£þ£þ©þ·þºþ¿þ¯þ¦þ›þ¡þ¬þËþøþ-ÿ_ÿŠÿ¦ÿ±ÿ¦ÿšÿ„ÿyÿvÿ’ÿ¨ÿÇÿãÿïÿôÿéÿáÿãÿúÿW”ÊéîÚ¹‰bHCTj† ®¨”jeg~¼ÊÒʶ‘sN8''8FTN@*æÿÊÿ´ÿ¦ÿšÿŠÿpÿIÿÿáþ¬þŠþvþþ¯þýþpÿôÿ~ñ=H°'„ÿáþGþÆýaý ýùüóüý4ý…ýêýhþïþŠÿ5ë§aþy¬(}”Œ„ÿþÃý1ýèüßüýlýÙýRþ¿þÿnÿ£ÿÍÿáÿïÿúÿúÿ÷ÿïÿïÿæÿÕÿ¹ÿÿ_ÿ0ÿ ÿøþúþÿeÿÅÿ@Ï^àM¤ÙåÙª[‰¨TCŒñaÒ)a€l7å} $ÅÿyÿAÿÿÿÿ3ÿWÿ~ÿÿ±ÿ¼ÿ±ÿ¨ÿ’ÿvÿZÿ3ÿÿÞþ·þžþŠþ‚þ‡þþ›þ¦þ±þ©þ¦þ©þ´þÙþ ÿ]ÿ¿ÿ$†Õ Ä{!Øÿšÿ„ÿŠÿ´ÿïÿ2x®ÌÚÚ϶~Y:ñÿÊÿ¦ÿŠÿhÿWÿCÿ8ÿ5ÿ3ÿ3ÿ-ÿ-ÿ'ÿ-ÿ8ÿLÿ_ÿeÿeÿQÿ;ÿÿõþÓþ´þžþ˜þ¡þºþÞþÿ*ÿIÿWÿbÿpÿ„ÿ£ÿÐÿY—ÇÚÊšW¦ÿZÿ'ÿÿ'ÿWÿÿìÿFšñ=}­ÉÉ­}@ô¥TìÿÓÿáÿúÿ'Y—Ïôé³s8Êÿ«ÿ ÿ£ÿ£ÿ«ÿ±ÿ¦ÿŠÿhÿ5ÿúþÍþ´þºþáþ"ÿ~ÿãÿC†¨—_’ÿ0ÿÞþ¬þ•þ˜þ·þáþÿ8ÿyÿ¿ÿ!xÌóâ§@Ì{g°^XwvIí)Iÿ™ýSü”ûTûuû¾ûÿûüæû‰û/ûû:ûëûûüZþÊÿ ëSGöxÊÄô:{‘x4㥚Úo?3"ØLp_5$h³îæÂ©f#ÿRþµý#ýwü¥û³úºùÓø%øÉ÷Ñ÷1øËø|ùú‡ú³ú¨úmú*úïùÛùéùúbú®úôú!ûEûuû­û ü–üfýZþhÿ~ƒa …ÂßÖÀ¦“›È LÁ[ÔëŽoÏ/›|ÙBb•ÿçþtþ9þ>þfþ›þÂþÂþ›þOþêýzýýÉü™ü†ü‘ü²ü×üûüý6ýaý›ýûývþÿ«ÿ/x~!|ÿþ}ýrü—ûúú³ú³úñúTû¾û üuü»ü ýoýþý·þ‡ÿg2Ýd»í.]¬‡ï28ôkºr^Ô`ß"²&K¦ÿIÿ0ÿOÿ„ÿ¿ÿáÿæÿ¹ÿhÿïþXþ¬ýóü.ümû³úú|ùùäøçøùù ú«úTûü¤üMýõýžþFÿñÿ—/»Mß‚3ô¶YÒó×uéWÛ]TL²ð×ÿ–ýdüŒûûôúüúû ûÞú•ú;úçùºùÊùúŒúû”ûàûñûÏûƒûHû)û@ûû1üùüÎý¦þnÿ/à¢tXF2÷x­€sØW ï%Ù…3þöX–©77'*ÿUþÀý^ý.ýýùüÀüuüüÄû‰ûuû‰ûÇûüMüuürüEüüÇû¢û­ûü¤ülýLþÿ±ÿýÿôÿ¦ÿ*ÿžþ3þþýþcþÞþeÿÊÿìÿ£ÿZÿÿÿÿQÿšÿéÿ,m¹‹Îwý8…™xHCÿ•þ`þ˜þ"ÿÞÿ=§î9}×RÙOÊʼ±¼ò@ ô! «ú(4Sšyÿêþ6þiýwüƒû—úÓùIùùïøõøùòø½ø]øÎ÷+÷ƒöãõYõáô~ô3ôìó©ókó3óóó>ó£ó3ôìôÏõÏöß÷ù-újûÃü+þ®ÿ2žïô³)j~†‘Ä1ÌW  «  $  Ð  ¿ R ßXÎPë­—Ÿ¶¨aÁÍ…¨ZÿRþ¡ý6ýþüÏüƒü üYû‡ú•ù¯øû÷…÷l÷§÷?øùLú­û.ý½þC”¤O[ÉðüZÿÞþÍþÿ˜ÿK׎9ê¼Çqé = K â î E Z w’ß}g~ÿòþcþÀý+ýªüPüüüüüùû¨ûûWú|ù©øó÷o÷ ÷÷.÷V÷z÷}÷[÷÷Áö_ööÄõ¶õãõEöÔöw÷(øµøùGù-ùêøŠø3øö÷ö÷.ø¬ø`ù'úîú¢û4ü¢üðü+ýiý§ýõýOþ¬þúþAÿkÿŠÿ•ÿÿ¨ÿÓÿ«}¡%ôû ô ‚ “ïD+ Ú • ›   ‚ 8 ÷ { ‘ $ T 3 ÿKñã$¼'`›ÀÙ<º0Å߉úÿOþÀüuûbúnùˆø‹÷oö/õäó¬ò§ññÊðñ¥ñòÎóWõ#÷3ùrû½ýØÿƒç‚}Šþ ýügûQûÄûœüËý0ÿÄŽÏ0 ¤ h«: ˆ ] M‘TLË+¥êþý\ûéùáø?øó÷×÷Æ÷§÷l÷÷—ö öõsõ¥õ/ö ÷ø6ù>ú û‘ûÉû°ûjû ûšú>úòùºù˜ùùžùÅùú•úCûùû²üDý›ý¡ýMý»üÿû@û£ú5úúùúù-ú’ú ûŒûüuüÑü#ý[ýtýlý4ýåü”ü‹ü ýnþÏ = -lpºöBÂ2/P1| ùxï™ Ž ¼  F  ‹’i\ÍÿïþÖþ_ÿQS^ :, ÿþùüèû¨ú%ùX÷Nõ%ó ñ"ï‚í<ì=ëjê¦éêè<èŽççëæ<ç6èê‘ìÊï`óèöìùüýßü×ûFúø÷àõCõõQõÍõŽöœ÷ùKûRþ.¸— Ny»ìýæòa«'ˆcqGœ4 o ¯ 18ËçGÄ&uØÿÿïÿÒ)Îxó¬ÑžDð¾­‘?r ¾9þÝûïùøÎ÷ˆ÷Ÿ÷×÷ø÷í÷­÷M÷Äö2öõ˜ôtóòNðtî–ììê’é¬èOètèêè„éêQêIêê®éyé¼é¿êÌìïïô"ùvþ¦ ¤ ž˜q  i k×wy’·!%} _ ¨ - › ½i±Îù•ÿOÿÂÿÁ6ý*¬žNôÿÞþ;þþ;þþÜþøþÍþOþýiü$ûÓùŠø[÷4öõÜówòèð;ï…íüëÿêÄêŽë‚íxð>ôcøiüÇÿ  ³"ÿêý}ýLþ¨ b?$ý)(.Ä0ã1»1p0M.¼+n)ë'E'?'V''ã%#éú©J.aüàöÃñ+íéYåöáúÞ™ÜÿÚÚ®ÙnÙIÙ%Ù ÙýØ-ÙÍÙ$Û1ÝÄßiâ¹ä}æžç9ènèfèkèÈè‡é®êì¤íLïñðòáôâö ù_ûÈý,GïxZÍ <–+Ïoà Üþwý.üpû°û<ý28íÉ EÆbæšÓøS&q½ïOœÆiK ²»Z*׬þîû-ùÆöýôõóêóÂôxöÅø2û^ýõþÞÿÅÿÿAþtýÏüBüÉû_ûûôú ûKûƒû¨ûšûKûŒúWù¡÷†õ0ó¾ð]îì êDèÒæèå¹åŸæÖèwìañüöPüp‹bÿûVö§ò?ñózøÁÄ 'Ùô&×,W0Ý1B2[2­2U3R4|5¥6¥7^8¸8l8ü6Ö3².à' ów& úLó í§çßâ±ÞñÚ×_ÔiÑÂÎrÌxÊ·È.ÇùÅaŰÅûÆ*ÉüË!ÏfÒ‘ÕtØôÚ(Ý5ß4á3ãåóæÐèãêPí/ðyó1÷Eûsÿtë· Ä  ¸ Ñ … Ý ÿ ÿ ¿ +Â:Âþ§üTûKûèü:ú‰ NÇ•‚d!1#$$ä#Ë#I$Š%†'ý)r,[.I/%/ð-é+6)$&ó"Ÿ£K‘Š~ Ͻd®ÿqþlý[üüú3ùÿö˜ô1òðAîùìì‘ëëvê éÅèèÀçêçèéê†ë.ìuìaììÌëšë‰ëoë$ëvê-é<çÍäRâjàÐß#á£äê­ð:÷PüÍþ"þ„úïôÓî¹éç¡çÌëóVü÷£  ø œ!ð"`$ý%­'G)‡*;+;+b*µ({&$Ï!æ9—˜èA˜5 ~ÿQû3øö„ôDó òñúïï¦îäîúïåñhô)÷©ùYûÕû ûOùB÷°õõŒõ÷Iù—ûýŠþžþâýÆüÌûYûŸû‘üóýyÿæøÂ˜öÁÊÿýeùòôúïÛêüåèá'ß6Þpßââ0èÍîàõwüÏ\ ¼ã¬ù )a—è⚸ORx  ã p Ú p Þ ?áþÈýÖý´þÕÿŒ5‚þ”ûøôíñÁðñ¡òÇôÒöMø ù*ùùøø>ùúùû?ü6ýµý“ýý:üŒû:ûVû¶ûü1ü€ûºù¾ö¸ò+îÂéKæä±äÉæêRí@ïçîìwçqâáÞ£Þã°ìsúA t{%ã,·/e/Î-ª,Õ,w.$14”6 8¤8×8(9ý9~;r=]?@?>¸8•/È#¾ø Èþ!ö_ð1íÄëëêè¹äEàüÚjÕ!ЪËGÈÉÅúá‹Á‹À ¿¿¿KÀòÂùÆþË™Ñ×Ýqã0é®îúó(ùLþX.j Øf0Z2àƒ X6g¥Ã¬  ŠþúŽ÷€÷õùvþÐ Öª2€Õ€!7& Áò"•$š%Â$"øRú—„©Šfœ Ä  ϽQÅþ+þDþ“þqþfý!û½÷¯óïÿë•é“èçè;êÿë©íäî‰ï•ï"ïeî©í.íí[íçí‡î>ï ðñBò¡óõröƒ÷Ü÷÷Ðôñì}æ ázÜ•ÙÙoÛjàMçÍîpõ0ú¾üßýêþVôó ±êã&,D..°,~+'+,U.j1¡4/7Ž8É8d88B8â8È9:D:83Ð*±Üôú9òì>èæÂäLãîàqÝýØìÓäÎsÊëÆbÄÓÂÑÁ¸À!¿½/»ô¹ã¹S»`¾ÑÂ(ÈäÍ›ÓÙFÞJã+èíò÷ü2 „ ‡;`:f»öØg»1 Póþý=üýCh WJ°zÎÓ_×2!Q%Ù)..m1ß212ž/Á+g'G#ò¸Žb*#s™9G . Ž ê º ¢   óúšÿˆýÄûÞùH÷ióîÃçÿàšÚ)Õ Ñ±ÎÎÍ"ÎÏЎЪМÐàÐåÑÛÓ³ÖÚ“Ý”à¸â¦ãRã â/àAÞþÜðÜÞÚáªæJì§ñ³õÀ÷ß÷×öãõVöùLþ„¯ ¼¾"k% 'œ'ó'Ë(W*},Ù.ý0ˆ2#32?.Ž'û\W´ [rÚs¤„þ÷ùEö£ôŒõ…øÌüd2M‘üœößñ;ï‚îáî‡ïïïÄïËî<íÉë\ëµìðõ®ú8á[_ Ø - òþ¾U¬ { ^ òä!ô«~-p ”bÿVöŽìhãMÜ|ءصÜïã°ì2õÇûIÿhÿ”üøUóHð ðóòiøÿŒI j ° ²¿/ÿÿÚÈ»RQ%Oþcþ;È ÐCÍ Tìþ’úê÷÷µ÷Óøù%ùÉ÷ÒõÜóiòÏñ.òió õ}öP÷f÷ÿö‰ö\ö¶ö²÷8ùúú[üµü¢û*ùÍõò`îñêèæ:åŒåëæéÏëqîpð‹ñåñòÑòäôºøtþ«¸ ÐXò#])–-š0‘2Ö3·4I55Â5ô5m6K7[8q9:“9Ý6H1)T þyú¿ô»ð9îðì€ì[ìùëÍêcèÅä¢àÎÜéÙ9ظרõØšÙÙ¦Ø×KÕÔ´ÓCÔ¢ÕÎ×Ú²ÝÌàÓãùæ¼êŒï¨õ×üvÕ [¢ønT !¶!K"–"<"¹ œˆš Òëûþø;ùü$]¢U  îqÿ–üQû7ü8ÿÜ( ó Òò zJŠÿg“ýš°2ÉN¦þnþÛÿç.¶ ;Ää  ;ÿÿ¿þÖýæûùjõªñRîåëÛêmëqídð›ódöGøþøŠø7÷xõºóPòjññÇð)ð¿î1ìkè¦ãDÞZÙöÕ—Ô/Õ?×KÚõÝóá:æ³ëŠóXþg š%£/5619O9°7‡5À33Ë3y5”7¯9‡;Éã…mõ¥ H!!8 òB,¯é׊,  ÕñªòN |àÚdÈz å # Ø Þ Ü‘—Ù|ÿÇû.øõSòðîãës黿Ûãá©ÞêÜ ÜÜµÜ–Ý Þ›ÝÿÛ0Ù\Õ)ÑͱÉwÇŸÆíÆõÇ2ÉVÊgËê̮ϗÔ+Ü/æƒñ”ü „UC¬²"÷&ô*P.÷03Þ4W6r798¸8i8/610)Ä– ‡ÜýËøCõóòÉñòóÇô³öXøcùÈù„ù¡øJ÷ÝõÊôôCõ€ö§÷<øøB÷†õÎòZïÌëÖèÌæ¹å†åKæ[è4ì.ò$ú‚ Úz¤#&á%X#ÈÅ/ÂŒÎe«¯G['õù®õ›ó•óõ7÷%ùú®ùøôõ*ôXóºóCõƒ÷®ùÕúúS÷åòêíyédæïäéäèåGçDè6èëæ’ä×á£ßúÞ¶àFåVìæôcýhòú  A > ·  Q S Ÿ ¼ ur_4   ¾wýÿ+ý«û»ûýCÿPˆtéþLúüõjñÑì0èqãÞÙ—ÔjОÍßÌÐÎ"ÔíÜ[èÅô~0 Hýõ_Mg"¢':-4269I;ñ<.>?ì?Å@jA!Aõ>F:63*Il“6ýxõ¥ð]îçí îéïñ”ñ­ð>î±êÁæøâ±ß ÝmÛ‰ÚÚ•ÙäØ(ؤמ×í×(ØØÜס׈י×õ×äØÒÚ8Þfã‰êkóýójÖ¡Þ wH$Jc”!í"Ô" !ÙÙÕzb¦öP¸'Ë  t~®¥Ôn“±éÿú>ôvï7ìŒê8ê®ê)ë ëê“èÁæå5äØäwçìâñ¤÷îû þþŽüÂú©ùú)üÐÿ%¹ ‰ ¼ âÉ%¦*Ü¥êþoüéúÐúKüÿl~Y[x#íýOù ô5ðìâçZã]ÞIÙÒÔ¤ÑÐÐÒzÖ Þvéø§T$H&ý%¦%,'_+148Ÿ=/A{w{ © ˆ•þüùüöØô`óßò>ó'ôõ¢õxõ›ôDóðñññðzñ…ò›óRôWô…óßñ£ï6í ëvéŠè(è+è]è“èÀèÖèøèWé'ê€ëMíWïSñûò%ô·ô®ô8ô›ó6ó˜óõr÷®úvþl!9 x Æ 1 ü § µ t ƒ|ƒÛ}ôqFcf.‰jº­ š Ù¢:}#ÀÎ mZfK\¡´ W « ì Dî3Tˆý ûùß÷^÷l÷Ô÷Oø¦ø©ø9øa÷Höõô%ó[òˆñŸð ï±îðícíöìƒìåëëìé´è»ç^çøç±é[ìÂï•óŽ÷\ûžþ€3i–-†â* ­¨"õ¿ —!i"Æ"^"!!%¥Þ#±²Rc  `Í…œÙþÑýðüüûçùÀø¸÷×ööYõ©ôáóåò‘ñÐï¬í=ëÅèƒæ´ätãßâÙâ9ã´ãäbäšäúäŸå³æGèNê™ìáîÊð òŽòcòÃñ)ñôð‹ñó¹õ8ùMý‹vˆm  á ; · Ù ú 4 ;…mfû4KÙmŠq9…ø3ì ­ t 6œªD £ Ð º Ó e m à y• À7‚ÊJþ1ü•úsù¯ø%øÌ÷‹÷.÷†ö”õvô`ó–òò×ñÏñíñ òSòaò&ò‹ñð'ïfíYë3é7ç¼åå'åSæiè\ëúîó÷’ú1ý±þÿÖþvþ›þ¿ÿ1Äõ uºÛ"ä$é qc•û»2˜ŸI5qç w  Æ o ù T { t RÄ]êuýÿnþ²ü¼ú¤ø‹ö£ôó¸ñÇðð„ïéîîóì†ëæé|è‹çaç%èÞéXì"ïÏñôŒõaöÁöÒöÉö¢ö_ööÊõ¶õö#÷ùöû¦ÿ·rL Á ¢  J-{éÿÕÿ,iÁwí/ð'N ±Çp%¤‹P+ê%© Œ  ~ ñ z  ½ ]ËÙ‚Æ ¥  ( ö¼§¾òþ4ý{û÷ù©øa÷ØõÅóñî$ëè‹æ~åŒå³æ¬èënívïùðßñ+òùñrñÿðöðƒñºòŒô÷úˆýSG± ô ã Ò % œî¤ G·y¬™"ï$ %%…#¹! ž™° 0M‚Í6 ] 0 +öL0¼þŽûUùÀ÷ëöªö¶öÁö‘ö$öeõ'ô9ò‰ïBìÜè³åãá¹ßïÞ•ÞÞyÞÞ ÞìÞŒßrà–áºâÛãåŽæ›èCëWîƒñyô÷ ù’ú×ûöü þ0ÿ~&F I ª ¶DqÅŸƒé,uÏœ<íÇAÛøÀ  ™ ü Þ - ÍçÁ³ÑÐ:¬  `QÆ…¤H¥æïïê ð Ø ~ Ã¥FÆOÿûüàú*ùÉ÷‹ö5õ›ó‹ñ÷îùëÓèùåäZãäÁååçÛé$ërëÇêbéœçãåŠäÐã¬ã*ä=åâæé ì£ïÐóOøªüKç’xª› j ýþ¶Àü ^"ù"ð"‹""É!»!¹!r!£ (üLd±ˆKÞb‡ Ò ývÿwýüûCú·ù*ù…øŸ÷\ö‡ôòéîxë è/åðâráŸà@àà¹ßQßÞÞÞ•ÞßúßSáãåçÈè!êëÁë¡ìêí®ïüñ®ôœ÷šúoý²jG ¡ „~ebà 4 _ Ç § ¥4kQ½×ÿWt ^ è « V ¦ ‡ %ÄÄb®Žß£ Ì <ŒSnõ ß¡Oê^mÛŽ š JïÄøýÁû-ú>ùžøó÷ùöõÅó–ñ8ïåìúêÛé®é8ê ë¸ëüëŸë«ê(éGçYå©ãMâEámàÒߥßàYá›ãóæEë!ðÊôøüúüBü:ü§üþ®yþ™ ‹Gºn?‰d”»jj·Ž 2 %ñê íöËZªîŠëp^ ¼ s f lPì" Íÿ™ý†û˜ùÔ÷NöõøóÜò–ñ,ðÙîÖíJí^íî]ïüð™òÓó~ô„ôô<ótòÏñrñ4ñ1ñlñþñó‡ôŽöùüûÿ '_-ö_Oþ^ýðýæÿÜâ• ì  +ôï–)ž¬Û®ÒF8ûÚ#Ÿ‚fòȡ֒ <Õ € ÍSÔ!8K Ë5þeÿqýöû¹úeùÆ÷Êõ›ó™ñ@ðìï¢ðEòbô‰öOøsùÓùùÎø ø}÷4÷÷Äöjöëõ„õsõöo÷äù[ýŽôõ ð …‚è 8 ’iêÞ…ÿ } ª ‰ ’ [—Âހɶ껣ÿ%þ–ýøýÿ«whEÀ›4âä V 7 j ” ¯ üÈuMýúˆø÷éõ·ô0óYñeï·í™ì.ìªìîìïòÞóìôõCôøòrñ ðýîkîRîŠîäîZïÿï#ñóÕõùÖýXV- s " §°*´¶1­ k‹Z„.ØD Ð ’  Ï N ¹“üHª0Ê ” €B//TÀfœ Á u Í Ü®c!ÿfýÝû\ú–ødöÂóñð3îÌëêFé£éëí$ïèð×ñÆñÌð-ïMíŸëxêýéìéêIê—ê,ëMì3î ñÕô6ùý&wDÈ}YÚó€ì e-’k7´Ž B à , ¸  Á Ç 8 R{k|Z W ü ]&¼Fø o Ý , N  t\ç\ÿýÕûûú5úŠùfø­ökôöñÂï9î©íîï8ð ñ#ñTð·îœìjêŠè#ç4æšå=åå!åå°æŠèHëÓîÔò¶öçùùû×üÃü?üæûBüÈýW‚Y -Ä,¶æ%ÓõnÛìh9¢ ã h tDõ‰ ë ú6)X‡· Ì@¬<öÝÊž9 ~ W Ú8Æ´ÿ"þûüü:û'úÀøóöÛôºòîð¿ïOï]ï¨ïÍï˜ïÅîRíVë(é&çŒåŒäääQäØäšå­æ(èQê(í‘ðô+÷hùŒú¹ú>ú©ù¬ùÍúUýEú® ÿÉHòi9 Æ  Ù ÈL _ y À‰œ% ¤ ší9yΤY;`ºU V  I )•ÏÿÃüûÊùêøø1÷ö„ôÀòîðmïîvî ïð1ñ òXòðñÕð$ïBíŽëNêé6é*éWé·éKêKëèìLïzòöžù^üäýþ&ý³ûmúúüúýƒ'¨ U’)Nn7 k v t  Ç * ï µ:h¿<ä o =K¹híÆ)öî³Ð« ÖÇË*þrüEûFú8ùè÷KöRô(ò/ðÂî(îZî-ï=ðñoñôð«ïÎí¨ë¦éè&ç³æŽæ‘æ°æóæ™çÖè ëLî}ò ÷”û%ÿNó\' ÿËþãÿl$_ RHÑêÚFÓþ þ “T¿h9V $ ƒüÚ6 ‘ 8OQé-}¼Šó ½ ¤ f Ñ Ò 8 þ=BhÿóüîúWù ø#÷/öõ¦óóñCðçî%îî£î ïÁðµñòµñ‘ðéîí†ëTê›é]évéÖéNêéêÆëí ï³ñéôlø¹ûXþôÿ~/ÿ>ÿÞÿÄéäþ s™%&*× æ á  ü ? 9‡Ô N ý | 5 K Oœm#}¬ib“²-ê™ ‡ LÎýÌûýùDø‘ö·ôÈòÝðFï3îºíÓí]î'ï÷ï‘ð°ð)ðïqí¸ë5êéfè(èMè˜èòè`éúéÿê™ìúîò†õ ùüUþnÿÿòþGþ6þ5ÿ{é & À…øƒ´0o – XDÊ®Öc ¢  9 c ® × hÁcŠ7j£X µ ª þ l ¯ z §  µ¼}Zÿ†ü'úDøÁö~õAôóòˆñ=ð5ï£îî½î0ï±ï ððmïIîÉì5ëØéÓè6èõçõçèièøèáéYë‹í~ðôâ÷uûJþÿLþZþ±ÿa" à Qd•– ¼ ‡ > Ç Ï Ì P & d N C   Å Û Æ 0‹qº§ôIû E # i À ß w ^ Œ TŽâý üšúLùøüöÏõ©ôŠóœòòÆñÑñüñ#òò¾ñüðàïî<íìEë¥ê/êÞé˜évé éFêŽë“í\ð¦ó ÷úBüiýýý7üÉûBüêýÄhD¨ L`‡G  m Y ¹ ) ? Ï Í k ûÝuùn   WØaé•× £ Ù · " Ç Y †  ¿ »<vÿý û‡ù]øw÷³öÿõKõ˜ôýóŠóRó9óDó>óóžò×ñ¾ðkïîóìì~ë)ëë÷êëmëìPí2ïÌñ÷ôtø¾ûcþ3ÿtþfþnÿ¢ÅG{ À ²Lå  ] q™È Œ B cв  (üë Z  «†Bà·Ô Y š £ 5  ƒ g V A Nö«ÿåüÄúIùOø­÷+÷Ÿöéõ÷ôøó ó}ò[ò‹òóòUóó`ó¬ò†ñð£îií‹ì ìÄëŸë—ë¥ë×ë^ìUíÛîñºóÆöÂù4üºý9þÎýöüHüPüwýÛÿ6ÿ w Aäž‹ É ˆ § ö  ” š 5 ¯g°Ý > Ñ Dñ¾šÐÚ 2 >  « š € ù ° x O o?'týEûžùfø…÷Éö!ö„õÛô>ô²óDóûòÔòºòœòGò¢ñ­ðsï%îèìãëë êWê5êKê¨êaë“ìOî¢ðóàö-úýÿOÿcþÎýþnÿè‚s o L.l ƒ ù  × ®£+ m ç ; Œ Æ sߺn%/( î Œ Ì ˆ ? ‹  †  âýÿªýôûÂúäù(ùJø1÷ÍõFôÎò³ñ!ñ)ñœñSòåòó¸òÃñ_ðËîBíì&ëšêCêêêêQê÷ê4ì%îÏðêó&÷õùöûðüý†üüÿûðüòþà/iú ™ 7 ð ) @ ¨  Ä K \ ã ô º ‚™Yù‚ Ä U®rRDf`À É U¿Ðo ï âÂ×pÿ§ýiüûû•úïùùø÷ÚöÍõõ|ô;ô"ôòóóœò?ñ‡ï·íÿëêWéwèÎçiç[ç¯çqèÍéÏëtîœñäôÎ÷ÙùÍú¥ú¼ù¤øè÷#ø£ùVüìÿÈP « B  š @ \ ü î × qŠ(a } Ä †  S >_^Ù—ÓzÄ…   M ¡ – è s A —Ë7ÿlýVü¢ûûú¦ùzø#÷Íõ´ôô¬ó·óïóôúó`óJòãðTïÙí‘ìœëàêbê!ê8ê®êŸë(íIïåñÂôz÷ù«ú¹úïùÅøÉ÷Ž÷wøšúµý= S £ ] –µ?i+; 8 Ê Ð O y íÜ™ ) t„ói7¹J& } S ”  … – â Y  KnÌžþöüÝû!û‰úÓùÈø[÷®õô§ò°ñ4ñ&ñVñ†ñjñèððäî·íœìŸëÒê5êÍé®é÷éÁê4ì`î?ñ•ôó÷¿ú‹ü ý–üdû2úžù2ú#üpÿ|­H Ü "Dˆ ª K € – Ë € Ì Ê Ç ï › œ L¿$ôF>³ ~ ‰ Û | ` n q  +ƒWè~ÿMýƒû8úcùÙø`ø½÷×ö¶õôZólòÉñ‹ñ¥ñëñòùñlñƒðZïîðìåëëmêê÷é*êÕêìî»ðÂó»ö3ù¼ú:ûæú8úÅùú”ûAþÔÇk & § ó U E C Ò $ & i yÐ â « « 5 ~ š 4 ûŒ¨?1Ÿ e ë ë  š C  Ð 3 u]þ’ÿGýYûäùøøwø+ø×÷X÷œö³õ©ô¦óµòþñzñ&ñÝðjð¼ïÞîÖí¸ì‘ëpêné¦è.è è©èïéùëÂîòNõ6ø@ú)ûÿú'ú;ùïø´ùÏûÿ"<¿ ( LO‹ ‹ Á Ÿ = i ²©áIy½ G U %v‘4Sà÷Ü× ü K ° * ¨ 0   ёĊ þBüLúÑøÜ÷V÷óörö¢õ’ôcóBòYñÊðšð¾ð!ñˆñµñ†ñöððïþíí ìuë÷ê¼êØêgë™ìî:ñ`ô™÷FúüÑü”üÌûûûÿû-þ\ú^ì K x ¼ ˜ £ R ä 2 × <ýD ¹ Œ ì  Û / ž ·Ty-£ø U Ï } = ô —  „ Í ðÚ†X™Êÿ þ‹üYû{úÐù%ù]øœ÷Òö!öõìôpôôó óoò»ññ8ðeïîzíXìQë‰ê-êTêë¡ìÈîuñTôèöËø©ù’ùÎøè÷z÷øú+ý,=§Ø ¥ :  ¤­–lý Ê J %<½ Ý è K F æ þ +'˜~ï"X µ d V j S ÿ T _ + Ã7«.̉Lÿþðüãûñúúùø÷ö8õyôäóŠócónóó˜óó6óÀòòKñ@ð"ïîBíÆìÔìzíìî#ñô7÷\úâüþïþ`þGýEüñû¤ü‚þ@])(  Ð Ö‘†2É1Ù T : Y Ä ¦ ] GÌþß / Ý ñ { ¦ © ð©ð A ´ ¿ L n ?å„; ôÿÈþ“ýiüVûWúvù¦øè÷7÷†öÕõ-õŒôúóyóó…ò ò™ñ/ñÇðHð¹ï ïWî¬í1íí–íÍîÒðwóröLù†ûÃüöüzüÉû€ûüÎýõlF  É x ” ¶ Z Ò  ß ˜ÛQÿÖ¯ ó ë Ž ©¿sh¦>ˆ Ò y ·ÀðßRMÍòð•þ…ýÔü=ü‘û¹ú©ùnø÷Äõ˜ô©óóÈò¸òÎòíò ó óÜòzòüñuñùðšð@ðéïï8ïçîËîïÕïVñ¦óŽö®ù™ü¿þÕÿ·ÿ¯þUý[üMü‹ýˆ.b ˆ X è — ø ™ t± N É ¯ × P K  ' Í 2 5 x ‹ ª – W í#)âõý • v ‚ Ñ¥`\ÛÿÞþDþÖýaýÃüüûûéùÅøÎ÷÷ªö\ööÒõjõÕô ôóòñrððàï´ïmïçî6î`í¡ìSì¾ìîKð3ógöUù€ûªüÉü7ü{û)û³ûDý¼ÿ§ŒßW ú Ð I ÎÎy ¿ N Ë ÞO3¦í G  c R¶mo°kß l b ñ ! « ? ˆ ? T ¦ aÅB!“þýåügüÝû7ûNú"ùÀ÷Köúô ôyóAó>óRóUó(óºò ò/ñKð„ïõîŠî+îÅící í×ìþìÈí_ïÌñæô<øEûwýyþUþ[ýüYûŽûýÐÿXÿ  Á E ÿ | [ûÓ T ” 7 z u h   y  5 x i ž ü Œ ¦ œæéض7ûp  ¼ D ë*™¨ÿ›þDþ]þ“þ¡þUþžýˆü'ûÖùÈø9øø<ønønøø÷Áõ%ô–ò\ñ—ð:ððéï ï'ï¦îGîRîïðËòŒõnøÞú†ü9ý ýVü­û†ûMüþ¼¬mn„ ž õðü~”P`y L ± ´ v º º - / & ¤ } ™  G w5'³¢‘6BzîÂgCÿ¯ýÏü‹ü°üùüýëüKü7ûéù–ør÷°öNöEö_öröPöÝõõôó?ò­ñMññÌð†ðCð/ðuðSñðòWõJøbûþÛÿ†'0ÿþ‹ýçýnÿþ*J¿ ! K ~  ¡ƒoUf ; £ „ õ  9™‹  ¿ Ð  §¢qz)³!7¯ !/MØGþü±úúLúûèû”üµü.üû¼ùcøX÷ÒöÁö÷f÷‘÷[÷³ö¥õbô+ó#òlñöð³ðŒð~ðšðîðÃñ0ó\õ3øbûnþãtø¤åBNEDñÍ E â qø Æ H õ 0  © ~ = Ÿ { Þ ø ûBþU% * ô 5 ¦ D ?Þ–Ê·ÿ~ÿNØ;Ôš þ—ûºùžø[ø·øvù2ú—úvúÅù¦øz÷‰öÿõéõ7öœöëöëöröõyôRóPòŸñ7ñ ñùðüðñSñâñõò´ô ÷úùÑü'ÿ¢¢Âÿÿ'ÿW²éy µ ïÓ? Ç Õ « 5  ó ^ < ‹ Œ v ž D ‡ W j r ó µ ” ¦ y TŒÿ·ÿ öU`©øGæÿBýÛú ù øó÷ø˜ù«ú\ûdûÂú¦ùiøJ÷—öKödöªöÏöŸöôõÐôfóÝñmð-ï;î§íií‹íîï”ð½òŒõËøüáþÇŽ@8ÿyþìþ¥wÝ5 Ú täcJ  @  ~ a J × Ü J \ T v  Z 5 r œ J.( F ËX:ïÿ‡ÿìÿë+XJÒãÿâýü®úÛù£ùïù‡úûCûûŒúÙù(ù¤ø`øMø[øJøø÷S÷VöõÎó“ò€ñ¢ðýïï~ï ï!ð ñò•ô ÷äùdü6þÿýþ9þRýâüfý"ÿâC¡V  –  ¾ C ‚η æ ë l N « ¹ Ë 3 9 ä V U ² 1 Ì ± sNQÿÿ•ÿx†a¸J!_ÿXýdûÐùÎøtøÅøŠùvú5ûŒûjûãú@ú©ùGù(ùIùŠù®ùvùÓøÔ÷‘ö/õÐóˆòuñŸðð ðmðxñ9ó°õµøñûÙþëÔŽW¿þ‚ýDýkþùyD« -ç¤ Õ " ûž È s « Z • ¡ÀEd6’  ^ ó œ H + ‘ÙgÿvþþDþêþÂÿŒé¬þÑüÛúùª÷îöÝöl÷`økùFú¼úØú ú-ú©ù8ùçø¯øzø.ø¤÷èö÷õïôÓó²ò¢ñ¾ððàï!ðæðMò]ô÷'ú?ýÞÿ™BîÊÿ“ø/ •Øìýˆ  Þ k ¶ j  r 1 d F + P ln Ä ü ¢ x j ž YÛzuýþþ¸ýµýðý6þ]þ3þ™ý–üEûÛùwø<÷göö\ö ÷<øWù2ú±úÐú¨úWúäùŠùWù>ù%ùÜøMø}÷xöKõôÙò°ñÁð5ð,ðÇð&òIô&÷{úÎý¢‹6Ô§\ŒÿÐÿrZû¥ ©ŒmÞ j s T æ Ä € ¸ P b ; 6 ¡·t ± ù î g Ä n³íjqþýrüPüƒüÌüðüÌü7ü@ûòùø÷ØõïôhôbôÓô¥õŸö‹÷6øžøºøµø“øløDø1ø ø øÀ÷B÷‰ö®õÅôÎó×òèñ&ñÁðèðÁñcóÁõÅøübÿðn²ð­NYÎSH ÓKP×8Ê 0 • é é  µ Á  ñ º ߺq ì Ñ ‡~b Ø ðÄËWžþ¤ýRýtýÎýþþ›ý­ügûýùˆø.÷ ö'õ ôôéô—õmö:÷×÷6øJø(øÔ÷i÷ùö”ö:öÒõeõÕô3ô‡óËòùñ&ñrðð5ð ñ¬òõ+øŸûÿÉŠ˜‹}Ôß ® 0Õ:: * g y _ ï Á ^ z ù ÿ á û›õ ~  X§  Ð 1„kþUýªü[üEü7ü)üëû€ûæú!ú8ù6ø4÷Kö õ\õvõëõ‹ö<÷Î÷3ølø…øwø`øGø#øê÷ˆ÷îööõýóÃòxñFð]ïòî>ïdðcò;õ¦øKüŠÿâßÝ‘¹ÿúÿ¢·¬à 5^öïX æ 6 “ðì  Ä ã b s q ÈÔ± F  ›Rça á Ì›»|ÿøý(ýÌü¸üÀü¤üPü³ûØúäùøø%øl÷Éö=öÝõ¿õãõHöÒöw÷øŠøÓøÑø¦ø`ø øÀ÷o÷ ÷œöö†õäô'ôOóqò¥ñ&ñ=ñòÞó”öúâýr8ÒTßœ¬› t ñ^]Ö¦  õ º " ¿  æ  âœœNÌË ~ ¥ ×  - ­æ?ýÿ;þþü#ü‘û$û¿úCú¬ùùUøµ÷.÷»öSöñõ õvõ„õÕõaö ÷À÷`øÑøù%ù ùÜø›øJøí÷}÷üöSö†õ‡ôZó òÚðñï¨ï,ðªñ8ôŸ÷—û’ÿø@7à¦G…Xj h¡s¼M& g ¹ Y  H ô  ì Ù6cZ Û x ª S ~ ή™éÿÜýaüVû—úúyùßø#øX÷‘öîõpõõ©ôIôôÞóõóLôìô¿õ¶ö¡÷]øËøïøßø¦øUøê÷}÷ ÷™öö†õÅôËó¤òuñpðÒïôïñXóªöÂúÿóÕa“ÉšºÐ2âu =qv{ð  ú B ³ Ÿ ù á · ß©G ? ¸ |R Í ß¦‘êþÝüpûvúÅù*ùzø‘÷†öxõ„ôÖó|óRóDóDóJó]ó…óËó0ô·ôgõ4öÿö¤÷ø#øøÀ÷a÷ëöjöÕõ*õRô<óíñ”ð_ï•îŠîpï†ñ´ô·øý8mÒÅý% t= Wòmoæ…Û¬ a  x . º Ë U u g > ¦ Ç [ ÞÓØ½ˆ ,Ü÷ÿ¸ý.üQû÷úãúàú¥úú ùå÷­ö”õ ôÜó>óÑò‹òwòˆò¸ò óóô±ôIõ¿õ÷õôõ°õNõÓôTôÓóGóžòÔñèðàïÍîíízíÑí0ï³ñFõ˜ùþîÂ@Œ\C/c¨ yÞ[i'õoŽ Ñ å X Ã ß … É î 5 é H P Î LT†£À è±Ôvÿ¡ý.üúúÛùÈø‘÷KöôôÀóçòwò^òqò–ò¸òÙòóò.óó0ôõBö…÷¯ø ùCúŒú~ú!ú˜ùïø<ø}÷¨ö¥õpô(óßñÊð,ðHðSñ|óœö{úŠþ+Ö@o«•ïAÏ|Ø -ÒJ^Ö s nY#ˆž½|ðY?# = ­ ‚ i P F ˆsuäþðüŒû«úú ùùlø‘÷¥öàõYõõõ/õ8õ-õõõõgõ ö÷AøŠù«úrûÕûÒûjûÄúýù0ùzøÎ÷÷=ö8õôóMòBòóõøàûÅ—[§ŽÄÒ ­ â£AXÂ Ä ( Pþû×€³¢ÿÑ W b à — v iÄnþƒüúúÅù½ø­÷ŽöQõôó<òëñòcòçòfóÂóô%ô5ôTôôõ¨õ‰öt÷9ø²øÓø¬ø6øª÷ ÷uöØõ!õ>ôóÏñ¥ðØï¼ïðwò†õ„ùþd`c 6 [“€™ì š±Òª4 RÒ²< † a d K ã 2 I ] ¬tÔ¿ ÿ =  < u ¹ 48)]ÿþüûŠùGø+÷$öõÀózò\ñ«ðrð¥ð#ñ¸ñ?ò§òâòó9ó•óCôKõŽöß÷ùú‡úŒúúZùøÎ÷+÷ŽöÝõõô óiò&ò¯ò5ôÚö{ú¯þÙdÈÐ ¬ ËßzÞ Ž ´§Û÷Ò ™=õ ) ô I ï · y 9 õÎÑ( ï  H [ ó â  ¨ ¦ Pæ“u“þÔü/û’ùø‰ö õ›ó[òrñùðèðñjñ³ñëñüñðñÆñ”ñƒñÃñPòó ôæô—õëõÕõWõôºóíò4ò}ñ»ðàïïnîLîéîð6óùöxû,q²£ ] - ¯ F ! õM•#ŠžwgõœÞÐ`L3å M z ‘ Ç _ Œ \ Ž Ô ·ä>¸ v °ºë„ÿ…ýæû‡úAùö÷Žöõ‡ó#òñŸð¨ð#ñÑñ}òó]óóyówó¦ó5ô/õxöÜ÷ùúhúCú¦ùºø¯÷°öÍõòôôóò#ñ‰ð‘ð€ñóÄöÕúFÿk­©Z D¢²Ñú Ô ÕX÷h¼üÐ Ç  ¼ v  •  §|¯U h ­ Ú œ º # ã  É_ø¾±þÑüûeùÜ÷jöúôŠóBòKñÇð°ðæðHñ¥ñùñ&ò+òòò òMò×ò¦ó¦ô«õ”ö.÷P÷÷göŒõ®ôËóêòöññðìïïÂîï/ðXò’õžù%þ‚!“Å ø · ’  ­ >r·r•Î ±H=á+â ª S » ë  ; È á š ¼ ð â .¯ Y T ¾äÿ“ýãûú6ùê÷xöÛô(ó‹ñ:ðhïïmïðöðÝñ–òó9ó>óJóŠó0ô8õ}öß÷ùúù_ú>ú®ùËø×÷ëöö\õ£ôáó%ó¡ò–ò9óÊôa÷àúïþ{ç" Q ï ‚ ‰ } ùqšýk7ÊŽ Ú ® ç Z ÖX圎Î^I s ” r à o ƒ  úȳ¼ÿäýü;úRødö~ô¤òùðï¿î`îîìî„ïð¢ðôðññöðüð7ñ¾ñ}ò]óFôõ{õ’õIõ¹ôøó6óoò™ñ°ð¼ïìînî„îeïBñ8ô1øÑü—Áܨ N C * † Ì C#%ý˜( ®ŽôòTÙ6a d g ‰   « Ú º ™ Y s \»N3þiüØú`ùó÷röÓôólñ÷ïìîeîhîÛî¦ïŒðdñ òiòòŽò¡òõò£ó©ôàõ.÷RøùqùAù²øÜ÷üööQõ„ô´óõòoòUòâòCô”ö¼ùtýSÐdÔ3 ÖUB ¶ E *Ô¼•Fòõ g \  L Ö L ·G9ÔÛ / ‘ ¡ í  ° ò  -wÚ3ÿlý‰û|ùi÷Wõóùññððüð†ñòfò™òŽòSòùñªñ‘ñ»ñ(òÆòkóúóRôRôõóLó‚ò³ñôð5ðsï îÙíJí(í·í2ï¾ñTõ®ù]þ²'Xh   › Þ ñ ü Ðöæ93#g]‹,\ú®F¡Ë × ô V ' V f `Þ¦¬ ã ‡ ×(³šÿäýoüû¼ùJø­öéôó:ñÒïìî¦îõî´ïÁðåñåò•óòóôõóôyô;õKöz÷˜ønùÍù¦ù ù6øP÷}öÄõõRôŠóÙòtòžò•ó„õiøü÷ÿžj#À­ Z ƒ «‹R4m`z ÿ  n ðqÚ7ª\aÕ¾ Z x  # š ( ™ú|"à‘0ÿ¯ýÿû8úlø­öõáó%óíò(ó¬óIôÕô-õ$õÕôIô´óLó6óóôéô¶õHöxö&ömõsôfózò³ññ_ðÊïOï"ï_ïKðòäôˆø»üé ¯] › ø Þ Ÿ "çPq‘ýBÒÞWêkº â ÿ / I ~ *   w ¸ Q ` ˜7 "þzüüú›ù<øÉö5õóèñ~ð„ïïOïÿïñPòtóLô´ô¼ô„ôRôZôÅô—õ»öø÷ùÞù$úéùGùlø€÷¥öéõFõ·ôIô3ô‡ôpõ÷kùoüÍÿ ìÔÈê²õ* # ©/1DD9u`S ¥ m ¦ `–¶Ø@=ñ?`   ‡ ^Ìý+€Èþžý€üQûòù[ø—ö¿ôóªñÕð‘ðëðÁñßò ôõÊõöØõjõïô®ôÕôpõoö–÷¬ø`ùŠùù6ø÷üõõIôºóOóóíò.óäó=õS÷'ú‹ý>¶R h ¦ C ” ª 8Îé,pÊsÌ!Çê`ø o ° ¹ ® ´ ê‹ ø æ † ¢ ! ø J:øÆæÿcþ4ý4ü2ûú‚ø¶ö©ô§òîðÄïWï’ïVðzñÎò ôòô\õCõÛôbôô0ôÅôÒõ&÷…ø˜ù$úúvùøo÷rö¥õõ›ôbôpôÍôšõùöøøŽû‡þ‰62S¸°¢ á ( Š”èOܸ8²f € Ø H ¿ ·ªÌ7xdµ C Ý Ì ÿ ‡ –_%OÿÆýdüû·ù6øxö„ôwò—ð-ïeî]îõî ðjñËòáóyôôô˜ó<ó9óÅóäôdöû÷Lù÷ùÙùùí÷Ÿö†õÂô|ôôïô„õHö7÷zø-úrüÿÍ7û s „ š   ‹ AÍãMóù%â î : «  y Àþ?¨=!o¸J^ª{Öóù0ÿ²ý€ü€ûúºùµøt÷öhôøòèñoñ°ñœòôÛõ­÷-ù'ú{ú5ú ùù¦øÈøvù£ú üJýþ"þýSüæúsù9øS÷Òö»öñöƒ÷Xøvùìú»ü¿þÒ»O_ñKë| V  4 ³ ¼ ‰ h |è….Á/ôy-A·e‘»€ÞÖ‚þjÿËý×üÿû2ûIú*ùÔ÷Hö©ô>ó6ò»ñÚñ…ò¬óõœöí÷Åøùºøøf÷öö÷²÷íø„úüMýÔý™ýÀü€û0úù3øÔ÷è÷fø-ù-údû×ü“þurRì ë[¬ á r Ñ ì‡Šýâ Õ Œ 8 Þ ` ¯ÜE¶bsÒx&­×‹Á‰ø9‰ÿÎý×üü,û2úù‘÷éõ5ô²ò¥ñ)ñKñüñó„ôö^÷XøÀøµøRøÜ÷}÷ƒ÷ó÷íø;ú”û°üBý4ýŸü¶û³úÅùù²øºøù¿ù úÇû6ýìþ̤L±³[­ëJ $ s ³ “ í ª â ¾ s D få¢l—ô=„ø¡¬Û¹rãÕH8Èmòþ½ýÔü üNûsú`ùøaö¦ôóßñ7ñ&ñ¥ñ–òÓó2õjöM÷»÷§÷<÷¢ö!öëõBö÷`øÊùûèûHüü‰ûÊúú‡ùcù ù8úû,ülýÙþƒU8Ÿø Í : + X•¥_‰'Þ‚ B Y Ê { ; Ö 6 cux—æŠésî$ú\FÑ!„ÿþöü)ü‰ûôúCúRù ø‰öäôUóòPñ)ñœñ¤òô¹õE÷nøùùµøøt÷4÷t÷Oø›ù)ûƒüwýÔý…ýÆü¹û¨úÊùUùUùÖù«úÇû ýyþŽq†d€ûž| Ò ë ª ð ¯ ó æ ¶ £ Üc èœ,‘ã5 6I¿QÊì¨úÑP ýþ™ýŽü×ûQûÕú5úZù ø—öÞô0óÝñ ñÝðMñ?ò“óõ‹öÃ÷øáøÑøøøÔ÷è÷`øDùbú‰ûrüëüþü°ü&ü~û÷ú¨ú¼ú/ûñûýRþÞÿ”O÷\o?ÜZ ì ¦ É Âän|< è ± Å 6 ä©RÑHZÖ‚‚äbÍì£ÜéÿUýæûÕú*ú®ùIùÃøþ÷ëö„õúóˆògñ°ð—ðÿðùñLóØôjö½÷¯ø3ùOù-ùþøïø;ùïù ûaü²ýÅþ_ÿÿ-ÿŠþÃýý°ü§üý¬ý˜þ¼ÿ }õNoEÑ4‚ßh *   ß ? u d  ˧ÒYÞ† nº‚)P¸3Š3wa•þUýPü¥û/ûÕúvúìù%ùøÁöNõïóÆòöñŽñŸñ+ò0óôùõi÷›økùÛùéù¿ù|ùcù ù;ú)ûEü^ý6þ±þÂþtþóý^ýëüÆü ý¸ý½þ§MéVw6©ò> ´ e \ z ™ q륃 ¥ K  òMùëßµHŸÊáMçÜ ‚ȺAUhÿºý4üû0ú®ù]ùù–øß÷Ôöõ3ôðòèñ7ññðñÌñÜò%ôŒõåö øíø|ùÂùÈùÈùäùIúúúîûýþýþÿ·ÿ‡ÿÿ¦þRþ>þ‚þÿ @¡sœƒ9?BwûË Ê Ø – ö » ù Í f ó¥¥£q8õ˜+ª?îÚwíGMö. «ÿDþûü üdûûìú¶úQúžù…ø÷õô¬òªññîðEñþñóLôŒõ³öª÷[øºøÖøÈøÑøùùTú\ûzü…ý]þÜþÿÓþŠþDþ+þXþÙþ·ÿé[û—6 ò Z é ° µ × ä©ý¿û µ g A k âX¢ù$=e´ci´I0©§@’ÿÖýEüû'ú¦ùZùù¤øö÷ùö³õTôøòÏñîðgðCðð/ñ4òcó¹ô öM÷OøùùÅùçù-ú—ú:ûüýþçþhÿ•ÿ|ÿ5ÿïþÍþêþbÿ2K¡ mšuþDiž © ~ m E Ú  ­ ë Ò £ toª$Ám’ iÑ[#rßMwö Òyÿþûü&üŸûTû$ûàú\ú•ù‚ø4÷Ûõ’ôyó¡òò§ñœñèñŽò˜óáôYöÑ÷ùýùmúsúFúúúpúûü?ýUþ'ÿ•ÿ ÿbÿÿáþúþvÿY‹ú1›ê"  $  d ¸ ÖŠ¼]Šq =   R ·BÌP¶ Lá`+<…߈¡PÐÿ9þÏü¥ûÒúIúéù‡ùù6ø)÷æõ›ôUóGò†ñÿðÊðÝðBñëñíò-ôõ÷tø›ùhúàúû:ûgûÁû^ü?ýXþsÿ\ô/ã¶ÄåþZÕ7M y › £ ¿  ¦ m E ù X < ¾ à Ê ¦ žÉ ¢/«q½^ÝŸ°þi×åao=êþ§ýŸüÝûYûû¼úWúºùÙø¸÷uö*õúóóEò»ñgñ:ñEñ‹ñ.ò.óvôëõX÷zø>ù˜ùžù‡ùù¼ùZú\û­üþQÿ$_/:”\ˆû<" ¯ ú F ® Y ^ ‹ ²Þ5"Ô W n Ù…[9ªQvŠËAûßΤ1a=ÐþPýöûàú!ú±ùkù*ùÀø ø7÷öìôÈó×ò&òµñoñ7ñ ñîðñuñSò´ójõ[÷3ù«ú¨û1üdüuü¤ü#ýþ>ÿ® ¡½%óþtD_œÀ¬D ž ½ Ö _ ñ ¨ S Ã Ñ u ° £ n MY¢¨/¦R™Ý@Ì—¥ô^É ¸''ÿ6þoýßü€ü7üöû‘û÷úúòø¸÷uöTõ]ôŠóÜò<ò»ñ\ñ/ñSñèñåò0ô¢õùöø¤øÓøºøzø]øø0ùFú¢ûþü(þìþTÿkÿbÿnÿÅÿƒµ0ÍQ“ k ´  Õ à & kv²‚ ?  5 Š  µ^ŽÿNŒáRççá²J™¥{Oÿ;þPý§ü,üÉûTû¹úÓù¦øM÷æõô“óÑòEòëñ¥ñrñPñ^ñ³ñoò˜óõÌöqøÖù¼ú/û5û ûãúÿúŽû”üßý5ÿYrj7 x7?h‰ƒ:¾ M¤+ Þ ¦ \ Ì Ú † Ð Þ ËÉè=«5¿8¦þXµ7ëÒüP»E)Á ÿþDý²üVüüÇûYû±úÓù½ø¡÷Žö¥õäôIôÙófóõò…ò6ò?òÀòÀóCõ ÷Üø\ú_ûÁû«ûKû÷úñúgûgüÆýCÿš†öÝŽy·4žÈÅÈ Š p ‘ ° ˆ õ × < =  ì [å–JërÕ>qÉU..G[EöY„ÿ“þÎý<ýßü­üƒü.ü‘ûúWùó÷”ögõ„ôêó‚ó9óõò¤òEòóñåñEò3ó›ômöOøúHûñûüÕû†û~ûèû×ü6þÂÿ&4½Ü²€wÃqn’°“+§È v " ô ¼ = d # ƒ £ ž §Æ€ÿvÖ"[‚³üs$,W{~KÛÿ*ÿXþý¸üüŽû5ûîú ú8ú’ùÀøÆ÷Éöàõõôôºónóóºòtòòþòô†õa÷IùûPüý&ýíü²ü¾üBýGþ®ÿ=¡ ¬U0k=H#™ºµ©ÔI  ù ª ù Ì # $  õiñŽ2¿5˜á"lÔl/Ú”yÿºþþýaýåüzü üÌû\ûÄúìùßø»÷Žö†õ®ô ô˜óAóûò¬òUòòóñMò.ó˜ômöwøjúöûöü[ýPýý ýaý0þsÿôi“A|kAA•NQdi% ‡ © £   Ó 8 æ ¶ }  1 ë 1 8  òð){æIÓûE”ÂÿšÿÿvÿLÿÿþõýDý‹üãû\ûôú¥ú\úú¬ù-ù‚øµ÷Ôöùõ8õ’ôô¬ó`óóßò¡òoòtòÜòÈó2õÿöòøÊúKüBý§ýµý¯ýÙývþÿÃLhúÿ®F8ÕÌÔËq º © v D I › 8  Ø o œ V ‘ ‡ W 1:† ³m’ûOîgḛ̈~8ÐÿWÿÐþJþÙý…ýPý(ýùü°ü4ü‰û«ú£ùø}÷—öÍõ8õ´ôIôáónóþò“òoòªò`ó˜ô7öøÐù=û)ü‹ü”üƒüŸüýþZÿã[Ay`"-±{g…¯µÃþq ' ÷ Ê ^ ‹ P ° Ä ¿ ºâ4­:¿$eЧÒs´ÿhÿÿ´þ0þ‹ýÝü:ü«û7ûÞúšúNúúùù[øŸ÷àöö_õÅôAôÓófó óªòXòòßñöñqòkóæôÉöÙøàú”üËý‡þäþ%ÿŠÿK} ¼Nƒ%BóŽJ^Ìh 2 ® Þ ¿ k  õ  „ $ Ç = V  @ 2 þÌÁà*Šøqê^Ï:«*Ðÿ„ÿLÿÿÜþ“þ(þªý+ýÏü–üuüoüdüKüü¶û/ûpú’ùžøª÷ÄööWõÅô;ôÀó6óÀòoòcò¸ò|ó£ô&öÚ÷‡ùôúîûoü–ü–üµü&ý þZÿét½•úÖ¿ØCé»uó16+#P²] -  ¨ î ¶  "  mÿ¨\ìTµÔgïÿ•ÿOÿÿ•þþ[ýªüü«ûdû@û!ûæúúäù ùø ÷ö@õô ôžóJóó²òXòò³ñrñuñÔñ¯òôÕõå÷ìù³ûþüÎýDþ›þÿéÿ)ÆŠ5…Mˆ[þ»Ã%Ö¬ m ô '  Ò Œ _ ] • ý m Ê ã Ÿ   õâ«á;¤ XœÚ*ÿòþvþþµý[ýýªüYüüîûãûèûöû üüãûƒûû_ú±ùïø6øŽ÷èöYöÄõ;õ›ôòóRóÑòˆòòÜò¦óáôuö9øéùVûdü ýcý¡ýõýŠþÿÌG½úÄ)2ÕÊ~° U^G4?wõ¦ b ÷ =  š Å È»Ì ºZß`Ñ?¢ÿ\Âÿ0ÿŠþÜý&ýrüÝûuû7û'û'û,ûûÇúNú¦ùÜøø.÷gö®õõ„ô ô•ó+óºòUòò×ñßñ4òðòô õa÷0ùÒú&ü#ýßýqþÿúÿ4µ`ÿS.U MÈh ý s ¦ ˜ b  ç Ù T ¼ /  ~ ± ¬ŸŽÈ|åP¾@ÄWéÿyÿÿ•þþ›ý ýÀü€üiü€ü°üèü ýýåü}üôûQû®ú únùÈøør÷ÁööIõ˜ôøóŠóLóXó¯óWôNõ†öå÷>ùmúVûüzüèüUýþúþFµ(`CÄéîéô=³:¸DG6%%X²9 Ö _ ¨ ® Z ± ßöY¹8¿OÙ[É9¢eÂÿÿ`þµýý”ü:üü ü?ü^ürü^üü­ûûyúÛù;ù¦øøŽ÷ööPö«õõkôïó“ónóŠóïó´ôÁõ÷|øäù$û,üðüzýõýþhÿ‰ð‚g[è ííiÑ6 v v I  ää R · ; - Ö 9 iw{Œ· ‚ “ŽùQ¨ÿúþJþ¡ý ý‹ü&üñûôû)üuüÉüûüýùü²üYüæûuû û¨úCúÊù3ù…øÃ÷ùö,öpõÞôyôLôeôÂôeõHö[÷Šø®ù¹úŒû,ü¢üý‹ý6þ"ÿQ¢öý’ã!K” ˆûPniG  (lÜf ì Z y ] ä 3 Xix—Ö0˜ zÚ#Tkÿqþwýˆü»ûû¶ú’ú£úãú@û‘ûÉûÉûšû=ûÊúWúéù’ùDùõøø øl÷Äöö‰õõØôÐôõ~õ,ö÷ ø-ùhú«ûÝüçýËþ‡ÿ ,É‹cF'æxÏü&S™íG··–i4í1‚½Ô·[Ô Hb„·wüŽ#¥kÿ´þðý6ý–üüëûñû1üœüýzý¯ý¬ýlýðüaüÏûTûìú•úFúÞùZù²øð÷÷Sö®õ-õïô÷ôCõÕõ¢ö…÷…øyùeú2ûÝûaüÌü+ý–ýþËþ¦ÿ‘ƒd¡õ0e¦sñjÉ  ,wÔ+z–ˆDÌ.u¶ýZÓk¯<¢ÝúÿúþþýYüÌû{ûxû°û üoü»üÝü¾ügüèûVûÍúZúú¼ùù6ùÜø[øÆ÷)÷—ö!öØõÕõÿõmö÷ê÷ÙøÓùØúÉûªüqýþ©þ-ÿ¿ÿg, þíÅpà,KYd~°ó?…»É»™uMB^‘̲4ŒÁô-öŽ+ÉN®ØÿäþÜýÝüÿûQûìúÐúìú:û¢ûÿû?üSü,üàûuûû—úCúúÓù›ùGùÓøDøª÷ ÷‰ö$öñõôõ)ö™ö<÷ øíøÛùÒúÌû°ü}ýþ›þÿ_ÿÐÿNÿÄ™cÍ÷ ;m±ü:j{ƒuaS\‰Ï,w°»€&Œà*|ít¸PÌ !ÿÙýµüÁûû±ú®úîú\ûÒû:üoüiü&ü»û7û¼úWúúÙù¦ùnùùµø9øÀ÷a÷÷ ÷÷M÷­÷.øÈøùTú:û7ü4ý3þÿãÿ”#­9׊OÊH—­”oK=Nx­ã ñ¶j!éÍØ÷2'é„ôF“âSå‰7Ú_±ÿÐþËý°ü°ûàú\ú2úWúÂúQûàûMü}üoü1üÒûmûûæúÇú¹ú®ú‡úCúÞùZùÙø`ø ø×÷Ì÷ê÷.ø›ø-ùÞù³úû™ü–ý„þZÿƒã2‰ö‚0ç›2šÒãààîCu¨Äɶ€HÒ¶³ÊÛãÊ•2®yÜdù­\÷j«ÿ±þ–ýoübûŒúúéù*ú¥úEûæûSüƒüwü4üÚûxû!ûæú¶ú—úpú;úïù˜ù3ùÙø˜øøŠø¯øïøAù©ù*úÂú†ûgülý‚þ•ÿ†NåJœö]ê’=Ò5djE$ 'Vœë&¾\ü—F !$æ‡i»†°Wéÿ]ÿ¡þ¸ý²ü¹ûæúNúú*ú’ú$ûÁûKü¤ü¾üªüuü:üüàûÕûÉû»ûŽûKûîú~úúÂùùù’ù±ùáùúeúÂú=ûÝû²ü§ý¬þ£ÿu j‘—§Ï–¤DWRLT„Ê$j—•s-Ø|-øäï *AA"犞#¸\«:«ÿúþ+þMýuüÇûNûûûTû°ûüoü°üÉü»ü™üiü4üüÚû³û~ûKû÷úšú;úäù´ù ù±ùÓùú_ú±ú ûjûèûˆüUýLþTÿT/Ï9w™À wû•!†¹¼«š‰•Áô,NK)æ5ØR6ûÎ+¯+­7Êg‡ÿúþ>þlýŽüÄû'û¿ú£ú¼ú ûrûàû7ürü€üuüdüMüEü=ü4ü)üÿûÇûgûôú~úúäùÖùòù!újú¹úûYû³û,üÉü–ý|þhÿCæKxxgVlª wßAˆ©ÀÈÖ*]‡  •|T(ÜÈÂÅÑÓѺ–Jçw‘¥'ÿýþOþ‹ýÃü ürû ûÞúãú ûQûŸûÕûôûüûñûÕû³û”ûuû\û:û ûØúŒú@ú÷ùÈù·ùÂùéù$úhú³úûgûÚûlü#ýþúþôÿÝ—d­Ôˆ\—¶ÁÇÏÞñÿæÄ†Cú±k3ûßŲžXÃaâ\ÒC·ÿ*ÿ˜þûý[ý¢üôûTûØú‡újúmú•úÊú û7ûgûuûuûrûdû\ûNûEû'ûûÕúšú_ú!úòùÞùçù úCúŒúìúEû¶û7üÏüýAþÿãÿ”!}§°µÁë4œ Ù*k›¼ä$Û¼›eI-ýíáκ›q.ÙiðjÝH¹ÿ-ÿ•þûýRý¸ü.üÁûjû=û!ûû)û:ûHûTûbûgûdûYûHû,û ûæú³ú~ú;úúÓù¿ù¼ùÓùìùúNúúØú7û³ûHüýÑý¦þyÿ5ÌB‹µâdÎGÈF·bšÇéÿ÷Û¶’jN-ä¼£‡vqhZ;¤(™þdÌ@¿ÿ-ÿ©þþzýåülüü°ûuû\ûHûEûEûKûNûHûHûKûQûTûKû7ûûãú úWúúÞù¿ù¼ùÖùú@ú•úñúYûÕû^üþüµývþIÿ¥\rgYEV‹âSÑRÂ-ÓýЛsTOLTZRL8-(% ß–6»+”péÿpÿìþqþðýwýý”ü:üöûÇû¹û¹ûÁû×ûîûöûüüûëûÇû¢ûpû:ûÿúÇúú_úIú>úQúvú®úîúHû¨ûüˆü ýžýJþýþ´ÿ_ôd¸ë7f²Š m¶à÷ñÏ«{eWZhe\5ÊŠ]D6% Öˆ …ðP¹/¦ÿ'ÿ¯þ-þ²ý4ýÀüVüüû¶ûŒûpûgûbûbû\ûTûCû7û$ûûûûîúÛú¶ú‰ú\ú2ú$ú'úCú~úÛúEûÇûMüÚülýþ˜þ0ÿÂÿF®ÿ)2&/xâdøøFs|`-øÀ¦›¯Ëõ3FLIA;3ò·]ðrëaÚeïÿ„ÿÿ¯þAþËýUýÚüdüùû«ûdûKû7û:ûCûEûEû@û,ûû÷úÐú¨úúZú-úúýùýùúLú•ú÷újûèû}üýÃýqþ%ÿÓÿxƒ× &7Gf²¦2³ :@$æ TéØÓäìïÞÊ£„hD"í©DÎE¸&¥/ÍÿpÿÿºþLþÔýRýÌüHüÝû†ûNû7û7û=ûHûKûHû7ûûûîúàúÍú¿ú¥ú~úNú'úú÷ùú5ú„úìújûüû‘ü&ýµý>þÈþCÿ¼ÿ!s¨ÊÒØæü&jÄ7»AºWkZ(í¬yik´êIkŠ ¼¿·Lß`Ë<°/Á_ýÿ£ÿAÿÍþUþÑýMýÌü^üü¾ûŽûjûNû7û$û ûüúìúÛúÐú¼ú®úú~ú_ú;úúúú5úbú«ú û{ûü–ü+ýËýhþÿŠÿýÿ\Œ¢¥¥«Ï޽c ò-;ä˜RêÑÈÖç(LnŠ „W˜§KĆ:ÞÿhÿÞþJþ¸ý6ýÃürü:üüüîû×û¶û‰û_û/û ûéúÕúÐúÊú±úšúvúTú>úCúTú„úÍú$ûƒûñûVüÆü1ý¬ý-þ¯þ'ÿ•ÿãÿ$úÿæÿïÿ{¥Sûˆê%* Ü–U øåßð +RŠÑOnvW ¤–§PÏ‘Hñÿ|ÿõþqþóý…ý<ýýåüÏüµü”üoüBüüùûÚûÏûÄû¾û³ûûpû7ûûØúÍúÞúûgûÁû&üƒüåüBý¤ýþþÿÿúÿYš°¢YNg³2Ï}(¯D>ßžU"øû (A`‚·ê"L`L©%ŽðrÄš~_,ØÿbÿÓþ9þ¯ý9ýâü²ü™üŽü†ülüBü üÉû”ûjûYûVû_ûjûgûTû,ûÿúÛúÊúÕú û\ûÇû.üŽüèü+ýlý¸ýþ•þ*ÿÂÿN®ÕÕ¨xTg³4à¡Xä;WDÀ|M(öç˸¤ªË[¬ûÅR½€®u_N/úÿ®ÿ>ÿ¿þ9þÆýlý.ýýèüÌü°üƒüMüüãûÄû¹ûÄûãûüûü üîû¹û€ûTûHûdû­û&üªü.ý¡ýþJþþÖþ5ÿ£ÿ*«^oPàÇÝ4Ät%È6hWËG%"3GUX]fw¤Ü*v¦«“ðP»SÝǰ†CÞÿZÿÍþGþÖýýDý&ýýýåü»üwü1üæû°û†ûxû{ûƒû‰ûxûTûûæú®úú úÕú/û¥û ü”üóü?ý…ýÈýþ„þÿ‡ÿýÿT~ƒjF=eÁVÔ‚û6*ïžMóðø "?kºs®¼˜6²ˆ ­oK,ÿÁgñÿnÿêþvþþÔý¡ý}ýXý(ýåüŽü?üîû­ûƒûxû†ûŸûÁûÒûÌû³ûƒûYû7û:û_û³û)ü²ü<ý¸ýþcþ›þÓþÿpÿØÿC¢àüñÏ« ¾‰ ¯(kqAð™Bþ&?SalzœÎc¤Â½+µ9Ì}E4/# ݉/¼ÿQÿÿ½þ˜þ„þ|þkþOþþÙý‹ý?ýûüÉü°üŸü§ü­ü°ü™ü}üHüüãûÉûÌûîû,ü€üÔü&ýiý¤ýÎýþ>þŠþÙþ0ÿvÿ¦ÿ¿ÿÂÿ®ÿ¦ÿ«ÿÛÿ5¶Pâ^¯É­r)èÁ¾Ô1f‹¯× J–á6ꈤGå×Ï­x”úÿ_ÿËþ]þþÑý¸ý›ý…ýcý4ýðü§ü^ü üùûÝûàûæûñûöûôûèû×ûÕû×ûñû&ürüÉü&ýˆýÜý(þhþ¦þêþ5ÿŠÿãÿ=†¾Øãææ2xÚ<ÑåÑ¡X»Žolro{u{†§×Jz…t?ö¥\& &à‰šÿ%ÿ¿þ‚þXþAþ3þ(þþêý½ý…ýJýýëüÆü²ü§ü–üŽü†üzürülüiüoü€ü”ü²üßü ý9ýlý¤ýßýþXþ˜þÖþÿ8ÿWÿkÿvÿŠÿ£ÿÕÿpÌ4”â44  öèåðü &7S€ÃO‚˜Aå€#âľÄÏÌ¥VàYÍÿFÿÜþ•þkþJþ3þþÜý™ýPýýÃü‘üoüYüKüBü,ü#üüüüûüü1üPü}ü§ü×ü ý<ý‚ýºý þUþ¯þÿZÿ ÿÕÿôÿ*=m®^»Mw‚w^7ùàÏÉÄÌÔö Xžâ3A"êžMÔÄÏ×à×°güšÿCÿÿäþºþþcþþÙýýDýýÝü¾ü¤ü–ü€üaüEüüÿûëûæûñûü&üBüdü€ü¢ü¸üÝüþü.ýiýªýõýAþ‚þ±þÐþòþÿ;ÿvÿÊÿ,š^ŸÄ×ÏÌÁ¾Ïë7[w–²Ô9f–²º¤i"Î}G+ #++ ÉjñpñÿÿFÿÿøþÞþºþ‡þOþþÎý›ýtý[ýGý6ý(ýýíüÉü¤ü‹ü†ü™ü¸üßüýBý^ýlýwý…ý›ýÆýþUþ´þÿvÿ¼ÿïÿ !5W†Ø#{¾ó  þùðèàÏÏÔù)^–Ã×Ô¸w7ë­‹ƒ—³ÌÔ¾ƒ/Êpãÿ¼ÿ«ÿÿÿbÿ-ÿêþ¬þvþGþ(þþõýÖý¬ý‚ýJý ýíüÝüÝüðüý6ý^ý}ýýˆý}ýwýqý‚ý¡ýÖýþkþ¿þÿ;ÿ_ÿ|ÿ’ÿ£ÿÂÿôÿ=‰ØPox}x{ƒ™³ÉâóþEr­â.3êªfëÒÔë â‹)¼Qñÿ«ÿ|ÿLÿ'ÿøþ½þyþ9þþýÙýÃý¯ý¬ý§ýžýˆýlýMý&ý ýþüýýBýlý›ýÆýâýðýíýíýêýþýþDþ„þÍþÿbÿšÿÍÿñÿ5W°à :Vo{}€€‰™­ÁÌÒ×åð 7SXX?å­†gd{¢ÏèëÄ}«Hñÿ±ÿÿbÿCÿÿìþ¯þqþ-þþäýâýßýíýóýøýíýÜýÀý¬ýªýªý¸ýÎýêýþþ(þ(þþþðýäýäýóýþJþþÙþ%ÿkÿ ÿÓÿôÿ:Wu”¹Õ÷)/4:Kau™Áó#[‚§»»¯‹f1ÝÆÆÚó Ô‰#Ágæÿ¼ÿšÿvÿIÿ ÿÈþ“þcþGþ6þ-þ+þ-þ-þþ þäýÈýªý›ý“ý¡ý¯ýËýíý þ%þ;þJþZþfþqþ|þþ£þÅþïþÿTÿ‡ÿ¹ÿñÿ=Q\gpuƒ‘¢¶ÁÄÇÄÊÒà÷=g‰¥µ°¥Ž{P2  7Slua2îHýÿ¿ÿ‡ÿ_ÿ>ÿÿõþÂþ•þhþGþ6þ-þ6þAþRþZþ`þ]þLþ;þ0þ%þ+þ9þJþUþcþfþ]þJþ3þþ þûýóýõýþþAþtþ©þäþ'ÿ_ÿŠÿ¦ÿ±ÿ±ÿ·ÿ´ÿ¿ÿÐÿìÿ=gŒ¥¶Ìã2j§è<G?&Ò¥€a\gx™»ÔàÏ­d¾gÓÿšÿeÿ8ÿ ÿáþ©þyþUþ6þ"þþ(þ6þ>þLþUþOþGþ;þ0þ(þ0þ;þLþhþþ±þÓþêþÿÿÿÿýþúþÿÿAÿyÿ·ÿ÷ÿ/Q_YH2$'8Wxš¶ÇÊÁÊÒé@g‘ŸŸ€SñÊ®¢¨³ÁÌØØÒǨ†W'éÿ±ÿvÿFÿÿêþËþ¯þ˜þ‚þkþZþDþ;þDþOþcþ|þ˜þ´þËþÖþÜþáþÞþÜþçþøþ ÿ"ÿ>ÿTÿbÿ_ÿWÿCÿ-ÿÿÿÿÿAÿyÿ¿ÿ@bgT,Õÿ·ÿ«ÿ´ÿÇÿãÿ,8H_¹ù:l‹™‰g4 ëÝàë2Sgllj^H&÷¾x2ïÿ±ÿ„ÿ]ÿCÿ*ÿÿøþÞþ¿þ¦þþ„þ‚þ„þ˜þ¬þ¿þÓþÖþÓþÖþÈþÂþÂþËþÙþïþÿÿ'ÿ'ÿ"ÿÿÿÿ3ÿ]ÿšÿæÿ2{¢¶«_2÷ÿ÷ÿ,YŒ®ÄÏØàùH}§Äħ{Kùæñ&EYaPE4!ÿëϨ~KÛÿ¦ÿyÿWÿ;ÿ*ÿÿÿúþòþçþêþòþÿ0ÿTÿvÿ„ÿ‡ÿ|ÿnÿTÿIÿCÿ>ÿQÿhÿyÿ„ÿ|ÿnÿWÿCÿ;ÿCÿeÿ•ÿÍÿN~Œ‰b,ìÿ´ÿŠÿsÿ~ÿ ÿÐÿýÿ/Ng{‰¼î=SYP=! ÿ #Ba}††€gSB/! ñÄ‘NÐÿÿ|ÿbÿ_ÿQÿCÿ'ÿÿïþÙþÈþÂþÜþúþ'ÿTÿpÿ‡ÿŠÿyÿkÿTÿCÿFÿQÿ_ÿnÿvÿpÿ_ÿQÿFÿCÿZÿ|ÿ·ÿ@{ ~NÕÿ¦ÿŠÿÿ˜ÿ·ÿÞÿ8Tju¢¼Øñüüôà̹¹ÄØô&4/&ùñîëàϰ†Y$éÿ¹ÿŒÿhÿLÿ0ÿÿ ÿúþõþýþÿ0ÿ]ÿŠÿ´ÿÂÿÍÿ¿ÿšÿsÿQÿ8ÿ0ÿ3ÿFÿZÿsÿ~ÿŠÿ„ÿvÿsÿvÿ‡ÿšÿ´ÿÍÿáÿéÿæÿÕÿ¿ÿšÿpÿLÿ0ÿ'ÿ'ÿ8ÿZÿ~ÿ«ÿÕÿ!Fe{—°ÌÚéñ÷ÿ!2HP\\^\SH@2#æÇ {Y8úÿÛÿ¿ÿÿsÿLÿ%ÿÿýþÿÿ8ÿWÿ„ÿšÿ¨ÿ±ÿ£ÿ•ÿyÿhÿ_ÿZÿWÿ_ÿnÿ|ÿŠÿšÿ®ÿÂÿØÿôÿ/F\bTF$ñÿ¼ÿÿhÿQÿZÿsÿ ÿÞÿCbuxxme\bejmmggmuƒ««¨¢”‰xsgWK5!ìÿÍÿ®ÿÿvÿZÿAÿ*ÿ ÿýþøþøþýþÿ-ÿLÿsÿ‡ÿ˜ÿ ÿ’ÿÿbÿ>ÿÿÿÿ ÿÿ8ÿ_ÿ‡ÿ¨ÿÊÿéÿýÿ!$'$÷ÿØÿ¼ÿ•ÿvÿ_ÿTÿOÿWÿvÿÿÐÿúÿ=KWY\\juŒ¢¼ÌÚãéëñôùüÿùîéØÁ°‘{bH/ ÷ÿæÿÅÿ¨ÿ„ÿ_ÿ5ÿÿõþçþÙþÙþäþúþÿÿ*ÿ0ÿ*ÿÿ ÿõþáþÜþÜþêþÿ0ÿhÿšÿÕÿ'@KKF@852'úÿÓÿ´ÿÿ•ÿ ÿÅÿúÿ=³æôñã̶°³ÁÝî îØ¼—†~~††‘Œ†s\:'ýÿôÿáÿÓÿÂÿ¦ÿ„ÿhÿWÿAÿ;ÿ8ÿCÿQÿ_ÿpÿvÿsÿpÿpÿnÿkÿkÿ_ÿ]ÿIÿ>ÿAÿLÿeÿÿÅÿýÿ@s”¢šŒjK2éÿÊÿ ÿpÿIÿ5ÿ;ÿZÿŒÿÍÿNu~gQCFYƒ¶é )2#ݹ¢¢¨ÄØéëà̹ {pgT:æÿ±ÿ„ÿOÿ*ÿÿÿøþøþøþúþøþìþÜþÐþËþÅþËþÍþÈþºþ¯þ¬þ¯þÂþêþ*ÿpÿ¹ÿñÿ2,! ýÿýÿ !:KH=$/b¥ô,NP7༥¨Äé#,ÿÕ¨ƒeWYgppgK5ýÿãÿØÿÐÿÕÿÞÿæÿìÿæÿãÿÕÿÐÿÇÿÅÿÂÿÍÿÛÿïÿýÿ ÷ÿôÿæÿìÿñÿúÿ =g‘Ìÿ#:B,Õ¨†up~ƒ~pW8*K{¢¹Ä¶ Œ~ƒÊ:arlS,÷Ï®¨«¼ÊØÝÒÇ®”xp_TKC5ýÿÞÿ¼ÿ˜ÿ~ÿkÿbÿZÿ_ÿ]ÿ_ÿbÿ]ÿOÿ;ÿ-ÿÿÿÿÿ ÿÿ0ÿQÿ|ÿ£ÿæÿ*e—¶¾³~_K@=NW_bYF,'$8_‘ÄîüÿæÌ®šš«Çéÿ÷Õ¥{Q2$$,58/ãÿÇÿ¹ÿ®ÿ«ÿ¨ÿ«ÿ«ÿ¨ÿÿÿ|ÿnÿWÿIÿ>ÿ;ÿ8ÿ3ÿ;ÿ;ÿ;ÿ3ÿ%ÿÿÿúþêþïþøþÿ;ÿkÿ®ÿïÿ:‰Ìü&ྠŒ{ƒš³ÁÒÒÇÁ¶¼ÇÝ÷)/#ùù/Nx‹Žƒa4àÊÄÇÏÕÕ̰š{_NC8/$ ýÿôÿ÷ÿïÿæÿØÿÂÿ«ÿÿ~ÿnÿ]ÿLÿCÿ;ÿ3ÿ'ÿÿÿ ÿÿ*ÿTÿ•ÿÐÿTŒ¼ÚéãÚʹ¥—Œƒ~~†‰‘‰xj_\_p‰¢°ÄÇļ® ¢¨°¹¶¨†_,éÿÕÿÓÿØÿæÿúÿ÷ÿìÿÕÿ¼ÿ¨ÿ’ÿ„ÿyÿ~ÿ|ÿÿ•ÿšÿÿÿŒÿ|ÿkÿQÿ;ÿ"ÿÿÿýþòþäþËþ¯þžþ‡þ‚þþ±þäþ3ÿ„ÿÛÿ/x«ÇÌÁ®‘ƒp_F:$',=KTWN8,  ýÿ!$$ ÷ÿáÿÓÿÊÿ¹ÿ¿ÿÇÿØÿáÿãÿãÿØÿÅÿ·ÿ¨ÿ ÿšÿ ÿ«ÿ·ÿÊÿãÿôÿýÿïÿÛÿÅÿ±ÿ£ÿ˜ÿŠÿ„ÿsÿhÿOÿ8ÿÿÿÿ%ÿOÿšÿìÿ@¾ëÿôæÕ¾¥‰ug_g{š¾ØéàÒ³ šš®ÁÏàãÚÊ®—{xx~xjK/ÞÿÇÿ¼ÿ¼ÿÊÿÕÿæÿïÿïÿïÿìÿìÿôÿ2HbmsmbH*éÿÍÿ·ÿ£ÿŒÿ~ÿkÿTÿ>ÿ%ÿÿÿ-ÿQÿ˜ÿôÿT¹=VP:ô̶¢‘‰†{{†—³ÏãîãÇ¥{\F:H\uƒ†xe=ìÿæÿáÿÞÿÊÿ´ÿÿ]ÿ3ÿÿáþÖþÖþïþ ÿ"ÿ*ÿ'ÿÿÿïþÞþÜþäþÿ0ÿTÿ~ÿ’ÿ˜ÿ‡ÿkÿIÿ-ÿÿÿÿÿÿ%ÿ"ÿÿÿ ÿÿÿ-ÿeÿ¨ÿýÿN”Ìù  ÿ÷æÚàé/&éÄ—~u‰¢°¼¼®‘pH$ñÿÓÿ¨ÿÿbÿQÿOÿhÿ|ÿšÿ·ÿÅÿÅÿ¼ÿ´ÿ·ÿÅÿÞÿýÿ$Kj~Œ†jQ=/'!÷ÿéÿØÿÓÿÞÿ5m®ÿ7r‘¢—€jP2üôéë÷ &@V^YN=÷ñü#42!ÿÚ¶š†su†ƒuY/Øÿ¹ÿ·ÿ·ÿÂÿÇÿÍÿÊÿ¹ÿ¨ÿŒÿsÿ_ÿ]ÿnÿ˜ÿÇÿïÿýÿØÿ±ÿŠÿhÿLÿ5ÿ*ÿÿÿÿÿÿÿÿ*ÿTÿ‡ÿ·ÿìÿ'Tp~uussmsu{{†Œ‘š ¢š‘m_guŒ¨ÊàîæÒ¼{mYQNN@/ñÿÊÿ ÿ~ÿbÿTÿOÿLÿLÿIÿQÿLÿIÿFÿ>ÿCÿZÿsÿ•ÿ¨ÿ¼ÿ¹ÿ±ÿ•ÿyÿWÿ8ÿ%ÿÿÿÿÿ%ÿ5ÿIÿWÿnÿÿšÿ¼ÿÞÿF«Øü ÿîÕĶ®°ÁÝü4EV\^N@4)7H^lujV=éÁ¥†~{xseK5! **'ýÿìÿÛÿÕÿÓÿÓÿØÿéÿ÷ÿýÿéÿÓÿ¼ÿ ÿ|ÿ_ÿCÿ0ÿÿÿ"ÿ-ÿAÿ]ÿyÿ˜ÿ«ÿÊÿéÿ/Tp†” —‘‘‘‘”¢¼àù  àĨ‰‘¨ÄàîéÚ¹Œ_5ÞÿÂÿ«ÿ¦ÿÿ•ÿŠÿpÿZÿ;ÿ%ÿÿÿÿýþúþúþøþõþìþäþÞþÓþÍþÖþìþÿ*ÿFÿ]ÿWÿIÿ*ÿÿêþËþ¯þ¬þ¬þ¿þáþÿ*ÿOÿ|ÿ˜ÿ®ÿÇÿæÿ5W{š°¹Ä¹«‘‘”«¼ã44,ùæÒÊÊÌØàæã϶”pN, ÷ÿìÿãÿáÿÞÿÓÿÅÿ·ÿ ÿ‡ÿsÿhÿ_ÿbÿkÿ~ÿŠÿ’ÿŒÿ‡ÿ~ÿkÿ]ÿOÿIÿOÿZÿnÿvÿ„ÿ„ÿnÿOÿ'ÿÿçþáþçþÿ3ÿeÿ•ÿÅÿÛÿæÿ÷ÿ5Wƒ®Ú÷! ùñëñü&7BE@:# ÷æÚÌÄÁÁǾ®”bH$Õÿ´ÿŒÿnÿLÿ*ÿÿÿòþçþÙþÍþÍþÂþ¿þºþ´þ·þºþ¿þ¿þÂþºþ½þ¿þÍþÜþìþÿÿÿÿÿÞþ´þþnþ]þhþþ½þïþ-ÿZÿ~ÿ’ÿ ÿ£ÿ«ÿ´ÿÊÿéÿ/Kjsx~~Œ¨¹ÊÕÚàæîññîññéà̹¢Œ{j\NH=,ãÿÊÿ¼ÿ«ÿ ÿÿ•ÿÿ|ÿkÿWÿIÿCÿIÿTÿkÿ‡ÿ ÿ¦ÿ¨ÿ£ÿ˜ÿŒÿ„ÿyÿyÿ|ÿ‡ÿ’ÿ•ÿ’ÿÿeÿLÿ8ÿ-ÿ5ÿTÿvÿ«ÿÛÿ'*$5\ƒ °°«š— «ÁÚëùÿ÷÷÷üüÿÿ÷éØÇ³¢‘ƒƒ‰ƒjF$ãÿÓÿ¿ÿ®ÿ£ÿÿ’ÿpÿ]ÿFÿ8ÿ8ÿFÿbÿ~ÿÿ·ÿÊÿÍÿ¼ÿ¨ÿÿÿ~ÿsÿnÿbÿZÿOÿ>ÿÿìþÓþÅþÈþÞþÿ-ÿWÿÿÿ¦ÿ£ÿ•ÿŠÿÿ‡ÿÿ¼ÿÓÿôÿ':K\sŒ¢¾ÒÝàØÕÕØØÌÁ®‘ebWQY__TC/ ïÿØÿÐÿÊÿÇÿÓÿÕÿÓÿÊÿ¿ÿ·ÿ®ÿ®ÿ®ÿÂÿÕÿÞÿáÿÞÿÕÿÇÿ´ÿšÿ’ÿÿ~ÿ~ÿyÿyÿhÿQÿ0ÿÿÿøþÿÿ;ÿbÿ„ÿ£ÿ®ÿ´ÿ±ÿ®ÿ±ÿ´ÿ·ÿÍÿÞÿïÿ $8CKNFKQj¹ÁÌÝë,:EE:, îàʹ¨u_H5'÷ÿáÿÛÿÇÿ¿ÿ¹ÿ¨ÿ•ÿ„ÿ~ÿÿÿ ÿ·ÿÊÿØÿæÿéÿïÿéÿéÿáÿÕÿ¹ÿ¨ÿ•ÿ„ÿnÿQÿAÿ5ÿ0ÿ8ÿIÿ_ÿsÿ‡ÿÿ ÿ ÿÿ’ÿÿyÿ~ÿÿ±ÿÍÿ÷ÿ5HTWQQ\bs—¶Êé&/@KVgjlgYH,üîØÒÌĹ—g/ôÿÇÿ«ÿÿÿsÿyÿyÿnÿZÿOÿ5ÿÿ ÿ ÿÿÿÿÿúþáþ·þ‡þXþ>þ+þþ"þ-þ>þUþtþŠþžþ½þÞþÿ'ÿIÿ]ÿnÿsÿ~ÿ‡ÿŒÿÿšÿ·ÿÛÿ!:NWgu{†š³Õô)EYu€Ž””‹{gK/ùîàÒÁ¨ƒY2áÿÇÿ±ÿ ÿšÿ˜ÿ ÿ®ÿ±ÿ´ÿ¨ÿÿ‡ÿyÿhÿ_ÿeÿkÿsÿ~ÿ|ÿ~ÿvÿnÿ]ÿLÿ8ÿÿÿïþáþÙþÞþýþÿ;ÿ]ÿyÿÿ ÿ®ÿ¹ÿ¹ÿ±ÿ¨ÿ ÿšÿšÿÿ®ÿ¹ÿÐÿÞÿïÿ5KYgŒ”¥¶Êæ)Pr‹—Ÿ™‘oY:ÿëÚ̼«—{\=ýÿÛÿ¼ÿ£ÿŒÿ|ÿeÿTÿFÿ;ÿ*ÿ"ÿÿ ÿýþõþçþÞþÂþ©þþqþOþ3þþ þþýøýøýþ"þJþvþžþÍþïþýþýþÿÿ"ÿ8ÿOÿZÿkÿyÿŠÿÿ®ÿÇÿáÿýÿ8N_gpxŒ ³Êà÷  ôéØÊǼ¼¼¶¨\,ñÿÂÿ˜ÿpÿQÿ;ÿ3ÿ-ÿ-ÿ3ÿ0ÿ0ÿ-ÿ-ÿ5ÿ8ÿAÿFÿFÿCÿAÿ8ÿ;ÿ5ÿ*ÿ%ÿÿÿõþÙþÈþ·þ¬þ±þ´þÈþÞþÿ>ÿpÿšÿ±ÿÂÿÊÿÊÿÇÿ¼ÿ¨ÿšÿÿ’ÿ ÿ¹ÿÍÿáÿúÿ!=K\mpp{†¶ÇÏÝëô#)/æÄ¨Œ{smjbT:ïÿÅÿšÿnÿQÿ>ÿ3ÿ3ÿ8ÿAÿAÿFÿCÿAÿAÿ;ÿ3ÿ-ÿÿÿ ÿÿúþêþÙþ¿þ±þ¬þ¦þÂþÖþøþÿ8ÿ]ÿ|ÿ•ÿ¨ÿ¹ÿÇÿÓÿÓÿáÿãÿôÿ $/2*$'@Tjmm_QC@@K_pƒšuj__ju~ueCúÿÕÿ¿ÿ¨ÿ˜ÿ˜ÿÿŠÿÿsÿhÿWÿIÿ5ÿ'ÿÿ"ÿ-ÿ0ÿAÿIÿTÿWÿIÿ>ÿ'ÿÿúþïþìþøþÿ"ÿOÿ|ÿ˜ÿ«ÿ±ÿ´ÿ±ÿ®ÿ®ÿ±ÿ±ÿ¹ÿÅÿÐÿÕÿØÿÕÿÞÿæÿúÿ:_~—¢«®«®°³¹ÁÒãî÷üîãÕļ¹¾ÁÊǼ{\=!*8=2' ýÿôÿÞÿÇÿ¨ÿŠÿeÿFÿ;ÿQÿÿ®ÿÍÿÐÿ®ÿpÿÿ½þqþZþvþ¿þ0ÿ¨ÿ!x³¶‰=ïÿ´ÿ ÿ¹ÿôÿ:s—uF*b³ñ  àW'CôN޵­†H ÝÊÌéÿô¹p'ïÿÐÿÅÿÓÿñÿìÿÇÿ ÿ„ÿnÿpÿ~ÿÿ·ÿÅÿ¼ÿ˜ÿsÿCÿÿúþêþçþìþÿ%ÿ8ÿLÿOÿLÿFÿ8ÿ8ÿ8ÿ>ÿFÿQÿ_ÿnÿsÿ|ÿÿŠÿ’ÿ¨ÿ¿ÿÛÿñÿ $@bŒ®Ìéÿ #&4BSN=üæÏÇÇÏÝæãÏ¢xT8$'8Qbg_H'ýÿÍÿ¨ÿ„ÿhÿIÿ5ÿÿýþáþÙþÙþêþÿTÿ£ÿôÿF{šŒY÷ÿyÿõþtþþ¸ýýˆý¤ýÜý"þvþÈþÿnÿÂÿxÝ7‰ÏðüëÉ”^Ò‰N!úÿÛÿÊÿÕÿìÿTîE—× #)לY¹gÕÿ¹ÿ«ÿ´ÿ¼ÿÐÿæÿôÿôÿéÿÛÿÍÿÂÿ±ÿšÿ‡ÿyÿhÿbÿQÿCÿ*ÿÿÿìþÖþÂþ¦þþvþhþ]þ]þnþþ©þÞþ ÿAÿsÿ•ÿ±ÿÂÿÊÿ¼ÿ´ÿ¨ÿ£ÿ•ÿŒÿÿ’ÿ˜ÿ ÿ«ÿ¿ÿØÿýÿ/bØ4Sg{‹”—™—™ŽlB Ò¨{_F:,!ôÿéÿÛÿÓÿÅÿ´ÿ¦ÿ•ÿÿeÿ>ÿÿòþÓþ¿þ±þ±þ´þºþËþÞþïþìþìþÞþÍþÂþ¿þËþÐþÜþìþýþÿ0ÿFÿTÿeÿyÿÿÇÿïÿ8HNQT\g¶ÇÒ¾”\æÿÊÿÊÿãÿe¼=argP:2,7ENE#î¨b'ýÿéÿéÿ=u¥¹¼®¢”š®ÒH™óPˆaîEehÿ]þ[ýuüÇûHûû û/ûrû³ûñûüüÿûÇû€û=ûûû7û€û×û4üˆüÝü&ýXý“ýÆýíýþRþ›þúþsÿ ¾‰iJÓb¹ÛÍ•Cì sq›á=—àÿÇv±Oï›[%þÔžJÆ'5ÿJþlýµü&üÁûxû,ûæúú2úÍùùZù]ùùäù_úéúmûÏûü)ü4üHügü¤üùüfýÙý>þŠþ½þÜþïþÿ>ÿŒÿŒ§t­Ùû"Jw¦ÈÖÈ–DÜlÔ¸ÁÚîîÒ‰#°8Ðÿ„ÿQÿTÿ_ÿsÿŠÿÿ‡ÿpÿQÿ5ÿ"ÿÿ%ÿCÿeÿŒÿ®ÿÐÿéÿ÷ÿ5_—Äãݳ_ñÿ|ÿ ÿ·þ‡þ•þºþýþ5ÿbÿkÿWÿ5ÿÿýþÿÿZÿšÿØÿ:gšÝ,†à9o‚rBù¸†x‹¸è×\®æÿ8ÿÐþ±þòþyÿ”Á~Âÿ¬þ[ýü!û’ú‡úñú¶ûŽüJý¯ý¯ýUýÏüMüüüŽüJý%þìþvÿ´ÿ·ÿšÿ˜ÿÍÿW/&Ñ%‚Δ^‰»qû0½OöÑðA¦çáw²­‘ÿøþ©þ¬þòþQÿÿÅÿ®ÿvÿ%ÿËþŠþvþ“þÜþ>ÿ¨ÿ8\jsŒ°Ý ÷³QÐÿeÿÿúþÿvÿñÿxÕ ÿݾ¶¹Ú4a‘Áè4MPBªm«ÿòþfþ þóý%þ‚þìþWÿ ÿÂÿÂÿ±ÿ˜ÿŠÿ|ÿsÿpÿWÿ-ÿçþ‡þþ¡ý<ýèü»üÀüûü[ýÔýLþ¿þ-ÿÿôÿN‘¶®~5ÍÿIÿÂþ;þÈýtýJýJýaýˆý²ýÙýõýþþ3þXþþÓþÿ]ÿ£ÿãÿ:Qgx¥¾ælÚ^ö›;Â'ZNýË BŸ,ô÷!^¥Ìɪ€B!=g™»¾œaÕ¨—«ÄÚëÝ«Wæÿvÿ%ÿýþÿCÿ’ÿìÿC‰¼ÒæééÝ̼‘Nñÿ’ÿ%ÿÅþ‚þ`þ`þyþ¦þËþÙþÅþþ;þäý§ýˆý™ýêýnþÿ¦ÿ@ÏEŸÒÔ³j«5¿ÿLÿçþþcþOþ]þyþþžþ¦þ¬þ¯þ¯þ·þÅþÙþøþ"ÿZÿ˜ÿØÿ !ÍÿeÿÜþJþÃý^ý(ý ýRý›ýêý3þ`þyþnþUþDþ9þOþtþ¦þÖþõþøþÓþ¡þkþLþRþ|þÂþÿQÿnÿhÿFÿÿçþÈþËþõþCÿ¨ÿsÁ=‹ùœ|•Þ.|¦ ¦ b Ê è ¹ Q ´ õ  %,C„ú«˜´ÖáÅ y×+Ž—FÅÿŠÿ%ÿ“þÑýåüãûØúÅùÈøÚ÷ ÷jöö¿õ®õ³õÝõöYö°ö#÷¯÷[ø ùºùFú¨úÒúÊúŒú*úÙù’ù|ù„ùºùúWúšú¿úÇú¶ú£úŒúŒúšúÇú ûgûÕûKüÉüaý%þÿ8‹ób±Á€í óÀ…gw²qÃþ ò˯¤µÈâç¤4åÒ…?  Ø d Ÿ x á Í XŽœ¥Óþ4ýÄû‰ú‡ùºø(ø¯÷[÷÷âö—ö7ö¼õõkôžóÈòëññ!ð2ïDî`í™ìóëŽëjëšëìÜìÙíïîð4ñGòAóCôjõëößøVû0þNe1y !  Ž Ž ^ ? Y » a 3ø„·ŠGq œ à = ®  t ¯ÀÌà y( õÂ]¯¸xÿËý²üÚûNûûÕú±úú;úòù´ù±ùúÛúüžý;ÿ™öµÏŒÿþ­ü†û¹úTúTú£ú!û«û)üŸüýzýßýJþ±þÿŠÿ¼¸Þù6 V  RÈ|w ù L ËÉdE5£ìïÉ—usÿŠþªýÃüÏûØúõùAùÀø‚øøäøsù'úìú«ûPüÉüýJý[ý^ýRý<ý+ý&ý<ýlý¡ýÖýûýõýªýýHüTûLúDù`ø§÷1÷ëöÒöÒö×ö×öÄö™öSöö¥õKõæôyô ô‡ó ó™òMò+ò9òŽò(óô5õÄöÃø:û-þoéJd o7“µÑû?¡ò““ * , | ü-6—Åþ¸ýý×ü ý‚ýþnþ˜þþþ™ýýˆü4üüü:üSüHü4ü üüûüwüýþ]ÿùâ [  ®—³w? £ Ú8î„þlýŸüüÚûàûMü?ý¿þ¹+¿6I Ä ‘ ª   ï Ü œ‹²ÆwŽ×CýÂúDø$öbôåò–ñTðïÀíuìHë8êZé©è"èÃç…çJç ç¸ælæ1æ)æYæ×æ§ç½èê¢ëPí ïèðÑòÊô×öõø!ûUýŠÿ§¡_×þÔR •  W 0  òÖ›6“°û þBüûÊúæû“þ¤° 5š|“§ëPÖ|¹s´¸»Ý)’ÛÑ?÷ é ÁÙ\]ÿÑý§ü¶ûÛúýùïøµ÷Vö¿ôó\ñïÅíüë8ê‡èöæåäòã©ã’ã©ãÍãáãêãêãýãQäåœæøè1ì!ðnôµølü5ÿÊ,‰-ÿ‹ýëû’ú’ùíøtøø²÷r÷–÷tøbúqýƒ: •JÞYɈÿ»Žû¿o‚ˆa"&ß¼î Z ¢ÒŠ÷kþ.ü„ú˜ùRùùÍùìù˜ùÃø™÷Vö\õäôõör÷ù£úÇûuü¾üµü†üaüPü†üðü‹ý-þäþ¦ÿp:à4)ª®Fÿý‘ûžùß÷aö$õô óòÊð;ïGíëËè†æ˜äZã ãäãæIéíoòz÷=üFUb¨ƒˆ / E –Ø&†)Yn¬3ð§(=à*1 & ‡ 0 ÿ«òÚ_ÿµüúŽ÷võçóËò òÉñ°ñ¢ñuñüððìî‹íìÍê±éíèèfèèõè é¶êzì'ïÎòV÷^ü=FÚ›…ô\qý´ù‰öôcò€ñ‘ñÎòsõžù*ÿ’? œ ry7!Ý!Ç!N!÷ !ë!X#ú$@&¢&Ä%ž#h ‹ckÒž ¶ ήKÑýbúH÷¦ô‹òñôï0ï’îøínííðìí‚íîžî¿îAîùìëÖè³æúäïã·ãhäùå0èÕê¤ígð ó’õö÷@úaü]þoS»µSÄ~¿ÿsÿäþÎý üžù¢önórð9îDíííNð%ôíøøý#·Ú¨*ÊŸk ¬ ¨­Oˆ³¾ ¼ ¹ € Ž >¸ „ ë— wËÈàœ{'™"ÿEû–÷¦ô¬ò¸ñ‘ñðñò óÂó©ô÷õÎ÷!ú»ü8ÿ4B.ôÞþMü´ùƒ÷éõæônôIôkôõrö0ùýGÓ 4{ »Úûäø®ùUþ Z¤’ g&Þ)'+Þ*ž)à'ã%$ë"è" $ÿ%1(*'+ý*n)u&z"ÎÈJ1 EÅþ÷Ûïséä£ßÜÙHÖÓ!σʃŋÀð»¸aµá³·³Á´‘¶´¸Éº›¼ ¾¿Ý¿ÝÀÎÂ,ÆñʉÐ7ÖŽÛ{àå¦éŠîô*úÌ…â ‚?!>¢!t#ø$:&&'a'š&¿$ñ!iŠÄµóÌ+•o*V–|1îSo"ßÒ2 a"9#Ô"Œ!·Æ®ì=0ˆp6&bûß Ú ¢ ú Àú¾LþÞúœ÷•ô¾ñúî,ìb黿OäMâÇà±ßß|ÞçÝÝ­ÛòÙõ×ùÕ@ÔøÒÒŽÑÑ{РϩÎÎ|γÐHÕzÜèå°ð7ûÖ  )g úÊôÉñÑòGø\^ B’ ”',,ž.e/`/U/©/Z0,1ã1M2[2,2Ò1p1Ò0¦/‹-„*³&Y"‹9l# ³®ÿÂúS÷FõCô½óGówò!ñFïÉì¿éKæÑâ£ßÝdÛsÚ2ÚsÚ ÛÁۧܽÝ'ßüà;ããåÎèÏëÐîµñkôîöRù¢ûûýQ–ÈÿA ¸ ˜ÿ¾¶¿¯~ 1§üi÷óð;ï¾ðôÊù´ÿ5Š 4  ´ ÒhOøSÐ œ Áaèp— ƒD‚z Ï> µ ¨èÂè9yútÊ?6- ƒ“ƒ5TÿJþ–ü÷ùröSòðí¿é#æ|ãèá:á1áŽá+âââŠãäLä"ä•ãµâoáÕßäÝåÛ@Ú|ÙÚ‚Üèà1ç±îmööü ×nÿ¼úWõñvïœñ‹÷u ¿âl"'%Œ%h$¤"$!„ ÷ l"y$Ÿ&[(G)3)<(Ÿ&´$­"— 6,­m yÿ¨ûúìúžýƒ±" 8 Q ëæÒÿùüjû$úÀø×ö`ôœñ÷îåì¸ë—ëzìûí~ïCðñï‚î:ìéùæáä¦ãyã8ä¥å^ç>égëîYñõêøoü"ÿ‘g‡þ5ûüö–òÐîaìùëøíPòlø-ÿj> G Jl  íéûµ*Þ •@ éð õ ãr÷ÿžþ;þ`þþ`þÙýaýcý;þôÿt„ù Æ XU ÷ Ì|¢¼ÿýþWÿ_x#)}F¡þ¾üãú8ùÜ÷ÏöñõCõäôõÍõa÷•ùöûþÿ¦þSü1ø¡ò^ìBæ áÝiÜÞ¸â«éåñúîvŸ4q‡ j rfW É'ˆ- 1¢23 3o3Š4@68n9Ñ9#9§7ï5>4ƒ2k0Ã-¦*&'»"SJ;ú¬íêâ¼ÚjÕäÒ–ÒOÓÍÓ-ÓoÑýÎBÌyÉÃÆŒÄeÃnÃÄCÄà ¸À:ÀµÀ Â/Ä6Ç!Ë~ÏÂÓ‹×ÕÚÞiá5åbé î3óÖønþJ¦ « ‹ ÏIÚ+¿ço;ì@%£º{%*#-–.Ñ.c.ª-­,’+´*˜*b+Ï,.J.—,(w"úcó ©Ïÿ+W ž Ãô[Æ´'´ § #i×Ü: ŸrùÇÿ`þEü>ùpõñÀìéYæ¼ää¿ãkãâÝàhÞŽÛÜØßÖÄÕgÕrÕNÕhÔ^ÒCÏ¥ËRÈÆdÅÆðÇ¥Êï͡щՊ٬Ý`âè"ï€÷K ÛÊÝ'<-õ/ì0=1172^3'5‹7:!<Ž=`>?¯?F@'@q>:‹2 (ñT|ù ò íÓé§çBæ”åbåNåÇäOããàûÝYÛÙºØ>ÙPÛºÞçâçpêÑì]îï¾ðòtóõèöÜøÂú€ü%þãÿù|VF  pr➓ߎů g 篞þéùäôCðöìÝëníjñ÷ý…Œµçz29¯A×¾ ü•]¸†1  Ž‘›Þ  nýçyÕ£ <¯ëî-ivÂn ˆøõþúöêòàð˜ï‡î(íëyèŒåðâá_à¹à×áãÛãŠãÀá|ÞÚ,Õ­ÐXÍ”ËYË4Ì¡Í†Ï ÒšÕ‡Ù<Ý7àˆâ®äaç@ëÌðø~3 Y[ ª"ƒ&Ð)¶,`/Ú164K68+9|9E8“4<.:&+ˆÆkª º 2¬ýŠùBöeôõóôîõˆ÷ùCúÍúÒúÛúšû‹ý{žúójÏáþ²ü#ü¡ýë=Ë Ü Mh`^¸®S ¿ sû³žþðü×ûuûxû:ûìùùö+òÕë´äÖÝOØ'Õ$Õ`ØLÞÁå9íUó÷øœötóÿïí(íFï£óvù’ÿ±×tÒÙ«0þöüþüðýÿÿ¬þMüõø‰õ(óœò"ôˆ÷Bü{Ñ( &ˆZÿ³ûqùù’ú‚ýã½{ü±®Åš.3 * Ž . µ 1 «  h › zÒ„ƒðýçù’õñuìçç„ãßEÜÍÙ´ØhÙÜƒà—æþíEöÂþÄø hÀH"Â$¢&X(*à+þ-m03Â5&8 :p;‰î`ídëè{åÈâåàÕß*ßDÞËÜÏÚ·ØÝÖ~ÕÞÔbÕa×,Ûëà‚èYñFú û: O.´kj '-š1L4 5j6H7X8z9:;ï:Å9$7â2l-ƒ'ü!“¦…'îÜÓ.Ø|q Q)¬þýeúÄöiòûíêç=åsäQämä>ä›ãžârápàôß=àKáçâ¦äæåæèææšä…âúß.Ý\Ú¸×dÕUÓoÑÁÏZÎAÍ–Ì–Ì©Í)ÐIÔãÙÏà¤è°ðû÷¤ýNM’aÈ 8~¯x&¨,Ð0&3J44ó3}2¦0%/‚.›.õ.ð.R.-Q+9)^'N&Y&K'U(™(ˆ'%H!¢i[0N q ÌŒXXþÓùõŒð–ì¦éÔçµæ¶åmäËâ,á÷ßQß!ßjßàáXâã|ä÷äÍäÖã<âEà‡ÞnÝÝ1Ý9Ý¡Ü!ÛÓØ ÖcÓƒÑ Ñ¯Ò=Ö°ÛÙâYë;ô:üX\Öï Ž m°Òß"è'j+ˆ-Ö.ú/g1 3`4Ð4å3¶1q.T*m%æ] f œ·ŸR¼3ŽU]| ‹ÓþðüŸûmúûø÷›ôöñZïóìàêDéè^çÚæSæÌå\å/åuåBætçáè\ê°ëŸìßìHìñêéçuå˜ä„äÿäpå2åçãŽážÞÔÛÚIÚ»ÜVá½çmïœ÷Cÿ‰é § |QèÌé‘!î&+Î-U/N0j1í2º426®6Ç5ª30Ú,…(Ë# ¼)®n`yÐÚÊö µ<Óþ®ú÷Ëóæð6î¢ë"éÒæ¨ä¬âöà‰ßcÞÝÎÜlÜ^ܵÜnÝ„Þã߀ákã¥åè{ê…ìîÛîÈîÜí[ìæêäénéIéûè%è¸æôäcãËâýã¤çîÔöË ôyrPÒß‘Ñ]Ñh$")_,þ-.Ž,*'k$w"!•µµÙ ¨  ê jˆlª;E V #ý>ùuöyôÑòñCïJí7ë(éMçèåå´äÛäeå!æëæ¡ç+è¡è(é!ê¢ë‚íkï ñJòõòó–ò³ñ»ð)ð=ðüðòÙò+ó²ò}ñÞïUîzíÓí´ïó“÷¾üÔYÞ ? – (b§àÎâ~!$I%ì$R#!N‡Á!äð ø#“ ù â 3Ë ÿ ËÈþ†û;ù¯÷œö°õ®ôcó¢ñWïÀì8ê%èÚæaæ‰æç½çGèè¤èÂè8éFêèëííýï°ñÈòó¡ò­ñ°ððð¾ð³ñtòÆòwòœñbð5ïžîïñŠô-ùAþûªûÞ ´ % 𬠰 êH™²f&xÓoH5w{5ö 5 I W _ ( F@‘ΰ>Ì å-ÞþzýŸüüŽûæúúùøM÷Ôö¥ö—öröö5õô×ò¢ñ«ððúïCðÌð\ñ¢ñˆñÿððïî[íùìþìfíþí„î¿î|îÀí§ìxë±ê®ê¾ëî€ñÝõ~úÞþrú†[ð²  ÙÉ|†§írYä`æÓ¦S ô Ò > Z : Ú ª¶N‰z{ Ð C% § Bg|ÿ›þ½ýâüüûñú¦ùø\ö•ôõò­ñãð°ðñ¾ñœòZóºó£óóò ñð‡ïLïTï]ïOïúîLîcíiìšëHë³ëí5ï1ò¹õnùöü‚„HùË Õ {¡D(Ésø Á Ø  I k §  wk Ê o „p¶KD½ ô  RÒŒ¬%û6›ø©ÉjÊÿþ”ü7ûõù›ø ÷Tõ…ó­ñýï±îøíÑí+î½îQïÊï ðð´ï'ïtîÀíí^ì³ë!ëÒêëÝë‚íýïDó1÷YûOÿ™¸Ôº·  ü eüe=HuÚ‚^}àK~`ß ü ³ ! G Ñ ]¤èZN 0 KÖâgbÿÂþ‚þ‡þžþ‡þ(þGýëû$úøôõôXòñðQï›îÓíÔìšë;êïèÑçþæ‰æ^ælæ¥æùæUç»çAèéêëìÀì6í‚íßíîãï+ògõkù¤ý‹·ó[I 2 ‰ § ‰í7äà`4U,†šÛÐz  á 8 T = » y dÇR+ ± 4ô%â7^»Ô^@~ÿGýÐú[ø4ö‡ôJócò¢ñÚðàï©îPíèë®êÛéséséé¼é©éAéèªç¾æùåƒåxåÏ勿¤çéë…í~ðôRøÔüVZ™ô ¥ ¸¿“Ìà 0$8&¼&¶%n#W "ëb_„¡“\5DÅÐLïbT›ñ U †ÅPAÿ¯ýˆü³û/ûÛú„úìùòøw÷†õ>óÚðîªì/ëê"éèÌæ*å3ãáßqÝiÜÜdÜ ÝÜÝžÞ5ß—ßÇßæßà‰à1áþáõâäŸåÙç ëhïÐô û€‹€ RÅõ1zƒ"ì%)(Ù((N&$­!Í“×P‘8"x˜ñUj[Û“:cg ¤Qeøþr/îsŒÿ%þ:ü÷ù‹÷'õ óSñýïìîðíâì­ëIêºè9çæåúä~äeäsä„äkääqã§âÀáåà2à¨ß\ßbßÍßÄà}âñäMèuì:ñ:öéúÞþĺQ  %ˆSñÊl"©#…#P"j Rƒ!3v¡iØ[îò¨3Ó´¬ÏWœ ì wež&ãÅÿ©þqýüú ùw÷Øõ;ôòÕðïíëøèèæå•ã¤âBâqâãýã÷äàå­æSçÜç]èÜè|é*êàê—ë[ìPíºîÊð¯ól÷Õû¢Qt ª ÈÞ$/†Ÿ©Œì+£Õ €“ÉPñ—é®ß « L ZDºñYnÜl&L<H±ÿ›þþ þXþ´þÐþhþlýÚûú+ø”ö_õ¦ôRô>ôOô3ôÅóóòÉñ{ðCïRîËíµíêíUîºîäî¿îAînígìKë;êZéÀè˜èéFêaìQïøò&÷ƒû«ÿ6Õa +Uþ  ¦ÈuAÛ C!  D…Ç8Î[¨ˆ cØ Ó µÎ" o jÎöÌŠŽ D 6¹¬þýÉûØú ú%ùø‘ö¿ôªògð%îìxêLé‡è èêç»çˆçBçüæÉæµæÌæç}çÑçèMè‚èÅè0é·éCê¿ê&ëƒëüëÎìAîšðýózøËýqäŽ zÍ~ÿ¤!›#%F%$Ç!ÑÕDu\¥ç¯Áè ¡ÇÖŠÐrí·|,ô<’ÿPý¶û¿ú@úúÙùvùÅø¡÷$öeô¡òöðï îîµíí`íí™ìì”ë/ë ëCëÕëµì½í£î@ïyïQïáîAî…íÃììƒë2ëKëìÜíÌðúô;ú*7« ô¸Ó|:ÁØŸU²ã4R1V\ÇÝ‹zâj›¿aG 5 À ¿  I’¢b  ó™„ÿ¤ýÏûïùø,öIôòÇð5ïÖíŸì€ëê´ééÀè–è˜è˜è[èœç7æZäUâ~àßDÞïÝõÝ6Þ’ÞßZߥßàß$àƒàáßá3ã/åøç¶ëgðÿõ.üoŸ ´j&€+ʧ¹‰ s%Ð)-ò.`/Š.Ì,¦*‹(¾&A%ò#€"« DY i®ääT¥hWa ¨ ˆLN´þ¢üôú‡ùDø ÷Ïõôó€ñàïAî»ìaëCêvééébéÖéCêxêvê8êòéÊéòésêEë7ìí½íîÖí<í,ì¼êétç æ=åHåoæáè‹ì=ñ‹öãû‘~ÞÈø—n: Kädu v?$æ—êÿ‰©ÝÖa Q 1 ä§g>¦p½é€3E ¿ YÍpÿóüŒú6øüõ'ôÎòèñBñ¥ð ð~ïï¬î+îíÃììrëàêeê5êWêÁê=ëšëœëVëÇêôéäè§çaæKå„ä3ä®ä:æéUíçò‡ù}i 庉‰ÉÏÐÄ@ ·#‘&o()}(Ê&Z$¥!Ϲ6ó A fÉ…O ˆ ‚›hµ ´ Ò§êþüúùzøí÷ ÷æõô³ñïBìÍéÜç‹æÇå~å¨å,æöæèvéëÉì]î¶ï¾ðoñÔñþñüñâñ¸ñ™ñ€ñjñ7ñÕð,ð"ïÅíXìë”êë¾ìÒï%ôLùþ6¨ž3 Ö6ù©y E †¡à×jÙ¤vøÀýMéÌE$µ’¡ Ò Ý â dmíƒh å­kÿJýKûkù™÷ÝõkôióÎò[ò³ñ¥ð2ïwí”ë«éðç»æ\æöænèvê¸ìéîÌð4òó<óóÀòSòÌñôð¶ï(îXì”êIéçèïéªìñÚö[ý²ßK ¸ f ô C - h * Ra—5É"U§x, 4ü@í8… g Q ‰  £{Ö$›Õ1 - p^/Ùþþ?ý#üyú%øCõ òï&ì®éžç÷åä|ã…âÎárá–áDâyãåÝæ¯èeêëë+íîÖîWïÄï!ðxð°ðÇð‘ð ð;ïLî›ííîÊðOôûøtþ%W q $ƒf(®J ã!a"r!RuXƒe.Éö[ÃòòÓÓGpM“®þ#ék÷%¶ Ã2ךtþ[üQúUø\ösô¯òñkïËí1ì¹êqéUèdçxæ{åQäøâ–á5à ß%Þ“Ý1ÝøÜóÜ ÝOÝ–ÝÅݽÝfÝÀÜüÛYÛ7ÛîÛËÝáÝå ìRóÿúM^Á TsÄ ÿzã¹ I%å(=+,,Ø+¦*")Æ'Õ&!&W%þ#Ý!ë#V»ökhn>ùêeÉ t šDPmtþVü5ú3øröïôtóâñðî×ë’édçå;ä‚ãhãäãÕä#æ¯çRéãêXì›ížîZïÍïñïÊïIïtîXíöëhêËèJç!æšåîåMçÍé[í¸ñröæú`þu ±ÿOÿ~º ÒI2’À_l ¼  Ý ½ >"t Ž Ú  ª ã>áÑe C!x G'ªWj܃ $ Æ_åH™ýûçø÷†õýócòÊð8ï›í¾ë¦ézç†åä0ãÜâðâ>ãã¦ãyããâcâ›âã©ãýãýã’ãäâDâ9âcã)æ³êÚðø«ÿ»z juö§iø¿Ã³÷ê#ù&Ô(c)Æ(E'L%#à |Ó`d §²½~ O?gþ, o±â»Ò£ÿçý‰û·ø¢õŽò¼ï^í{ëêÅè‹ç1æ¹äcã‹ââqã\å èëîYðÚñwòXòµñãðð‡ï"ïÈîWî›í“ì@ëÛé©è èXèØé“ìCðôÖøœünÿ †BæP® ÿ ò9Fñ\õ7³¿ å?óäÖD²pn# .`9ÏyŸÐJ*"ö  Éõ6þuûù4÷°õ0ôcòðií êóç¢åýã;ãkã]ä¹åç9è"éäé‰ê7ëüëþì9îkï:ðQð˜ï(îgìÇêéémêÌì,ñH÷hþ ö Á¤·qÃê3—£Ïv!!†!± ÖmÖYœýü ¬ _ŠÒª<: À °:üìr GF#Oÿ¯þêþ;ÿìþýéúz÷Ðó~ðêí&ìë5êqéqèçåòãÑâiâõâyäÌæéìîïï6îâìŽë¼ê£êQë…ìÓíËîïžî²íÃìdì.í„ï‡óíø*ÿmú AùDt(þ usz÷Y!a!* šJ†rúÐ~¬.7AnvÖÁgRý<k‚Kw  ºŒ`Ðÿý†ûÐùlø4÷ÿõ£ôóYñvïwí~ëéêçaæôäžãBâÏà5ßqÝ”ÛÍÙRØU×ëÖöÖ.×q׈×c× ×ÚÖÚÖz×'Ù4Üåà çtî7ö™ýßžè "ôäœÌ!F&ä)2,-x,ì*â(Ì&%Ô#â"Ý!e GÁ9HY‘¸q$EuŒ¦õÒç g ` §-Çÿ‹ý†ûÐùiø7÷ö£ôåòððíë…è™æ®åÏåîæºè¿êƒì¬íîígìÁêïèBçÿå$å˜ä$äŠã¬âƒá5àßZÞÞôß“âVæìêãïô…ø=ûÃü–ýRþ¨ÿþm¬ <…ØÁ(K—¤ùô¼/èaB{8Ь  ? RYúiò~-3âu·&*¬ Û í'¤u˜þýÇûúù€÷¿õôžòƒñ¶ð'ð¿ïvï'ï©îíí í#ìVë£êêhé½èðçàæ‘åòãâ5àžÞºÝçÝs߈âîæMìòS÷ŽûRþ’ÿ¹ÿ~ÿ·ÿñ‚S ë8MÐË…‰c™x ñ¼Å& š v v Á à Vç‚AfVaÁm8Ø — 6 ŸƒFÿaýÏûyú8ùøÌö¢õ®ôúóóRó.óþò§òòñéï›îGí ìÿêê>éXèPçæ±äã€áà!ßß,à–â,æ¨êŒïAô%øÒúBüÝüGý3þ7 æ$1ÈOŸ‡õ·yÙ¡ÝøP K , ŒêuÄɹä¢Q(:k‹ m  ¢0Ô’ÿˆýÇûQúøø¤÷@öØôówò­ñ/ññ,ñƒñ»ñ­ñ,ñ/ðÐî3í—ëê˜èJçæ¿ä-ã^áTßMÝ¥ÛÇÚ,Û Ý³à³å¨ëðñÃ÷Vü;ÿ{¹Ê‹…×@ -Ö‹ÇxÊ9KDºÃç½ó‘écq ¡ Ai‰´ê˜˜(¼ÔúnS„µ ¨ Z ësãÿþÃüÏûôúéù¡ø1÷Íõ|ôUóUò‘ñ/ñññÇð'ðïºíì5ê.è)æLä¯â4á®ßÞ9Ü_ÚžØG×µÖ[×Ù+ÝâÃç¡íóS÷;úÚû¾ü¤ýQÿ<j‘ ç/×!¦íz»¶/™‘ݨe¡þà+Mj!¦$g&j&º$³!û0ÌÌØç Ì k àIÒÿÀýü„úÅøÚöÐô¸òð•îßì¥ëë$ëœë?ìÀìåìƒì~ëééõç÷å-ä¸âŽá{àbß6ÞêÜ—ÛjÚ´ÙÞÙKÛ0Þzâßç½íkó6ø¨û–ýcþÐþ±ÿ­£ OùâS•J|½È*R©É7Sw«µ!I‰!g"»!Â屟å2žÏ ¦ WœÜýôûNúÖøa÷Ïõ'ôfò«ð$ïîBíûì í‹íîDî+î›íœìQëáé|è7çæñäËãzâåàß+ÝgÛ*Úï٠ۯݾáëæœì(òÒöúöû×ü}ý·þ ´‚ Ù#ʾ8·×õ„©ìçUJ?¥ü[Ää,ò• ¹ n*KÖøª¢~ê Ê  þwýQû|ùÃ÷öôò'ðŠîtíþì%í·íî0ï‰ïmïÅî²ídì ëäééqèè€ç¸æƒåìãâ=àØÞZÞ-ß‹ámå‰êQð!ö/ûäþî‘Y,¾¡èV @Óf$„B«’-9Iû»@%Îj3M³üÞ“[n. « ¨ Ë ²&!¯ýÿJýÇú“ø­öìô.ó}ñ÷ïÈî îäíLî-ïVðŽñò"ó+ó“òuñéï0îŽì2ë'ê]éžèµçzæãäãaáàÕßöàãˆç}ìÚñÝöàúlýnþXþþRþìÿ w¥ ¸ã–£6Áà%þµ.¬Âê°Ò¼¥“)ç/±‹›‹ òå z ~ þ-.;ÿuüúø÷7öôóuñðÍîíí|ízíÙíîZï ðjðTðÇïÞî²ígì,ë$êIé‡èªç‘æ5å¦ã âëàmàáðâ\æëàð÷¤üÿykMÏ­;U ]|Æ£ÌpòëésȽêÈþ‘ÐGf ž ³é AWJ\Ï d  h ä Ñ•ª•þ¢ûù÷‰õ'ôËòañðïLîîRîïðñ×ñ&ò×ñöð¦ïîJì®êZéRèlçræ*å¡ãëáKà߮ބßÎáŒå{êðÄõ¿ú`þQ³'Šÿ«ÿ!1â S´¨#dýnBÚS[k÷©ž&ÊC³9[Tx?™«ëÛä˜û Ž × † öøÄÃý,û(ù§÷}ögõTô.óòæðïïIïýî$ï~ïàïðÐï5ï3îêìuëê´è‹çlæ8åÖãMâ¾àhßyÞcÞb߸áWåêsï¼ô0ù7ü¬ýßý‹ýýŠþ÷é |—íš„^¼ìýŒ$Qé ]cs”|œLé!ý¯ÂÀ/io  à ? 8 M£àLÿýEû±ù6øÔö†õZôXó…òóñ§ñœñµñÔñ×ñ§ñ,ñbðIïî­ìdë/êøèžçüåä âà`ÞÝäÝ ßËâ9ç}ìíñÝö—ú²üBýÝüPüuüêýé' Ö¤Ç*¡¾!3'¿‰ùÇé©‹  ¸ ˜–:Ο.3Æ;ä:b[å –   W @a¹ÿwý¨û2úþøå÷×öÏõÊôäó+ó¬òiò[òcòXò#ò¥ñÒð®ïGîÎìYëôé“èçpå’ã…á’ßÞRÝÖݹßãwçŸìÉñ=öcùÿúTûûûùû>þÔg8 н„ús`1EÒÛ›R ^ j z ap+ Õ~6BÌñ|[o ˆ W ÜåÕáþýEû¦ù<ø÷2öõõ¼ôeôôyóÎòò#ñHð_ï|îžíÉìñëëÞékèŸæsäâôß`ÞÖݼÞEáKåpêúï õßøÿú€ûãúúïù5û"þ}§¸ ØwsßmWô\VXíÌñ¥O|žì^sx”—¯E¼f{Ô × Ú Ç  Úì·xIÿDýmûÊùwør÷¶ö,ö³õ@õ¼ôôfó–òÃñëð!ðZïŠî²íÚìîëæê¦éè#æäãráßþÜÉÛÌÛRÝpàãä@êÊï¹ô]øbúûúúÿúèûþµC v§c¿ ”Ä€nõÄW;êaøî¡’xSQÈë3‹îO“ Ê  Bƒ¿û)Tÿlý{û˜ùû÷¶öØõ=õ´ô*ôó¬ò­ñ—ðhï6îíì/ëNêqé|èXç÷åOäJâ à½Ý­ÛIÚ÷Ù ÛÀÝðá<çêìò÷õ øiøœ÷‘öEöz÷úLÿï æf> X1²žp¶C*΋Û<]ƒ‘Õ<⫉OÉëÅŽ e [o˜Éü"ÿ&ýû(ùˆ÷döÊõšõ õ°õ—õ*õ]ô.ó¸ñ,ð¬îcíXì‰ëÝê-êFéþç:æõãdáÅÞ}ÜñÚ”Ú¶ÛqÞ¤âÜçfífòöøžø.ø½÷øéùMýàó¶ `ŽMî÷úh’YrX¸u¨¥Ó\U†Ö]"oƒÒ$ZOÆÅ} 8 3 rì3ÄþüõùGø÷jö!öñõ¹õ@õpô<ó¸ñð‚î%íìaëæêxêäéûè™ç¾åãBá2ß·Ý1ÝÙÝæßGãªç…ìñ¦ôÆöz÷B÷ëöH÷ ùlü7» m<Zßu~WuܼÐÑxp—躉æƒ[¥¨¦ÜUó^B~< ® 6;׸³~ÿøý&ü2úcøööÿõõTõTõQõõ›ôÈó²òuñ/ð ïîXíÉì4ìrëTêºè­æFäÚáÄßkÞ0Þ@ß»ásåêçî9ó\öó÷?øÔ÷ƒ÷ øÞù1ý™† ½üÔƒŒh¡wõʆØWïý´ÿ§Ivà‡ wÉ€}†$%­ {eÙÉKTÿõý=ü_ú¦øS÷xööüõÿõîõ—õÕô²óJòÇðeïOîí+íöì¾ì<ìQëäé èùåä›ââ™âeädçEë‡ï|ó€ö(ø|øøz÷¯÷(ù#ü_N õ jV÷Å[P  Î 0ÁèSÿ!F¹M·|`|#Á¦ŠòÖä Œ Î;‹‘ýÿhÿ“þPý¹ûýù`ø#÷Köãõ¹õ¶õ õ=õôcóò¥ðhïvîßí‹íMíèì#ìÄêÙè‹æ0ä1âáùàJâôä©èùì?ñäôS÷qøŠøAøMøRù«û5ÿ“ ö ÅCŒAþ kn_ƒùkŠBn×H¦½ ·-ü¢œ®Ül ¿ <*©ªà ôÿ˜þ ý{ûúïø øœ÷H÷ÿöxöŒõ3ôŽòÁð ï›í–ìì¶ërëæêÞéRèSæäþáxàîß­àºâñåïé"îóñÅôBö”ö2öãõgö1ødû±ÿsòx ¦~A`w î  R’Sjî-ŠR¼Õf >ÖD:8¸  . 52bµ d ßu„+^Ä ôÿ|þÔü/ûÈùµøøÎ÷É÷Ì÷“÷ëöÁõ;ô…òîð¦ïÍîkîRî>îÙííìdëeé7ç_åQä~äæéêì!ñìô§÷õøêøø÷ÿö­ö™÷ýù¡ýð5£ Ä x  ÷ ½ ßµZ ‰ Ì Ÿ ¾ 4 \ 2 y † E R&77!F ½ y L Õ Ó>¬? C  óTI¤+–ľ ÿþ™ýÀü üpûÇúúþø­÷öZô™ò ñÒïï•îDîÎíðìšëÂé¬ç¶åOäÞã±ä׿ê îþñFõl÷Jø%ø­÷€÷MøeúÃýrF ù GLw H : ± ì Ç ó í c>¯ ü j K Æ â FS$÷¢ D V=2`´ •  " Ö,pøød ¥FCÿ(þý#ürûüú³úpúúRùJø÷‰õô¸òÁñ&ñÁðQð ïŠîíEëyéèXç½çeé.ì¹ïwóŸö¬øUùÑø»÷Úöîönøjûÿ"Us 1 ˆ Ñ — W • ’ W ƒ ¢ ?  j m  _ g çj!¼Fþ Q »ÊÞ@Ü] _ • ç caDiNéÿ±ÿÿ8ÿ·þûýýîûæúúLù–øÌ÷Ïö”õ*ô¡òñÛïòîZîî–íêìÝësêÓèGç7æ!æPçÖéfí€ñjõø>ú«ú!úZù%ùúŽüWäk ? ÊãÄÓ“…  & ¸ ]©`™ ¢ Ï u Ê Ô t2š&—÷“ Ê þ O|OZHÏÁÖJµeeÿ¿þJþäý…ýý†üèû7û„úäùRùÎø+øX÷4öÍô>ó¸ñ_ð]ï´î]î%îÈííñësêäè¯ç)ç²çŠé‹ìmðvôå÷ú¼ú-úù]øÃø¹úJþøóN L¢e 1 † ‰ • ƒ è +À…“ S * v ‰ x  ΔòRù W ÏС[áé&Ƹóá)ÄÍÿTÿ>ÿeÿÿÂÿ¨ÿ;ÿŠþ¤ýŸü¢û¥ú ù‚ø?÷æõvô óµñŒðï•îíiìë`é¸çNæåÇå4çÞé‹íŸñ\õ øGùùû÷ÆöNö:÷ÅùÆý¤l\ ê ûÞ  j j  êFêù & ã \ ¡ pdß`§Õ6F t©ˆÜkým=vMù³¨ÿúþ¦þžþ½þÜþÞþ¯þ>þ“ý­ü«û’úeù(øàö”õIôóòBñ¢ð!ð«ïï-î íÁë”êÞéæéîêí=ðô¤÷„úüüúúvùcøŠøTú¯ý#ÏÒ } Ž ¹ 9 ê — Á ( É Ì ’ „  k š B ß Ð·w @ £,Øÿ=%¼éŠÂÃÉùg,K¶=­×”ôÖþýEü÷ú¿ù¦ø¤÷¶öÕõïôôðò§ñðWîŽìëêýéñêí)ðçó¯÷Çú§üý ü‰úù|øhùÿûãÿh¬ü ê nÎ ” N p C ´ j ë è T k t κh Ê ‹ 33- î D xíù¼ØÿÍÿæÿ/ uƒHÁ5ÿhþÎý–ýÆýLþÿ¨ÿïÿ]ÿ]þ ýÒû’úvùøÌ÷#÷ƒöëõ/õAô ó§ñð˜î9íSììÀìkîñ|ôøTû…ý]þðý¢ü=û’ú@û…ý=Á8 Ü °òJj ã 0 m N N ë Ñ  á ¦ Ë©q ÿ è ŠTìJ ¹ œnª£ÿhþÖý¯ýÎý%þ¯þQÿãÿTƒj]ÿ›þçýoý[ý¸ý]þ"ÿÓÿ*!•ÿŠþ(ýŸûúËøµ÷Ìö öbõ®ôÐó¯òEñ˜ïäídìSëë¨ëií2ðÀó‹÷û¡ýýþÿþÚüùû#ü¸ý°›År \evÚ  ÿ Y Á × j „   D ž Ç ‘ «6g æ&2ÿqþ"þÙý–ý}ý§ýþ´þ]ÿÛÿúÿ£ÿìþðýý^ü?ü°ü‚ý„þkÿñÿæÿ5ÿðý[ü®úùÎ÷Áöîõ2õpô‡ó[òÚð*ï^í³ë\ê´éïé7ë“íÁð`ôÎ÷~úü:üuûWú›ùäùšû½þø‹° ´FQ3z ¾ š Z ú  ( À ¯  F á , 7 Ù Í !N ./¯ëÛÿFÿÙþcþçýˆýUýXýýÙýþþÖýaýÑülü^üÆü›ý˜þ„ÿ,£ÿ•þ.ý¨û@úù+øz÷ëöPö‰õkôçòñï6íÌëëYë§ìï[ò4öìùÔü„þÍþíýoüû{ú@ûfýÁ·Ÿ … “ V æ  I   ® Ø ~ È  z…> ´ ³ ´8¿'iî  Eáô/„ÿ¿þâýý°ü¾üBýþêþkÿ_ÿ½þµý”ü¶ûjûÁûœüµý±þ]ÿ|ÿäþ§ýÿû0úˆø&÷$ösõæôOôwó<ò‘ð’î‘ìãêæéáéüêBíƒð]ôAøƒû™ý9þ›ýHüÿúúNû“ýZ  D·nÉ T { v  Ì H & j W G z6 ± ‘ <Ü[ ã Ú·å´ÿGþwýðü[üŒû‡úùËøžø ùúù,ûKü ýJý6ýýGýêýÿbÉ瘖Ôj±ÿþ²üÚûYûûÕúWúkùó÷îõºó§ñ'ð~ïÛïYñÜó÷•ú¤ý¼ÿ†¿þ(ýñû¥û‹ü¬þ¥éßø ñ Û á z  ®é_¥uÄáºû»í § E à N ( ¶LEÏÞÿ>ÿ¡þßýðüüTûûgû?üiý‡þLÿ~ÿ%ÿ•þþþ£þ¨ÿë ö"€ ÿÌü¶úùÚ÷÷ªö2ömõôBòðäí.ìQë”ëíÊïcód÷ûÔý%ÿõþ²ýüéúæúiüWÿGz/ Î ï× H ¼ ½ v õ Õ Œ ¼ @ Z R ˆBµï ¼ ¡ ‡Ó ~ ‹› ÅþÜýý üîú„ùø÷Žöâöû÷ùû4üÚüýýPýäýçþ/‹ž"êðY|þµüVû~úú÷ùÐùUùJøœökôòñï›îîÂïcòöCúLþxJŠ“éZÿŠþáþ~ðÿ  p h R ‚%?Óèö{7ŸŠ š G Ü ƒ Z ¸œ³ZÿnþªýÚüÝû¼ú•ù©øRøÈøú¨ûUýþÿÿ|þóýÆý3þ8ÿš "©k^¨˜þ–üæú®ùáøDø‘÷{öÛô²òFðûíPì¸ëuì˜îëñôõ÷ù4ýÿ5ÿþü8úhùúlüïÿÉ  , 2 Ü€æ ¸ƒ °³¸oêÿ J Dhe0ü * #Z T"ÿ-þ<ýü¹ú(ù¡÷uööƒöß÷´ùŒûýÜý3þDþZþÅþ ÿÌ&Dçä(Ô'tþýü€û2ûÕú*úïø)÷ìôœò¨ðšïÇï\ñAôøHü÷ÿަ?ÒÞþ¦þ¹ÿè¼“Í  2 p  ˆ:e$QŒ@ŠÂ6¬ôÏðÞ ) u ³ ªŽ\¡þGý,ü'û úÓø}÷,öõ©ô'õ‘ö¯øüúùüJþáþòþÙþýþÿØrm!ÿn^Iÿ…ý=übû¹úçù©øîö¼ôoòjð2ï5ï¢ðwó[÷¢ûpÿ þ?Fíýü”û°üFÿÀV6 Ê ñ Ó â¿ûóÃ0ÜR`t  Â8M¬ Ò E ª î  “¼«òþºýÔüöûûáùø&÷ÇõÊôôIõöö%ùYû.ýcþúþ-ÿ;ÿ’ÿb°6¦’ÏN0¤ÿŒÿþçýˆý&ýiü2ûùz÷‰õ ôtó%ô4ö|ù}ýo €ÒÍ EE€ûhk Ç ö k ‹Ï¦%-k|(t“×€ÉÃ]QB´ I ç ƒ€0ÿ<ý«ûTúù­÷2ö«ô.óÔñÏðpðôðtò®ô÷Uùìú×û.üEüwüýGþôÿÔyŠÅ6å!>ÿ‹ý:üNû’úÂù˜ø÷_õÅó–ò<òó\õáø+ý}÷iQ`lN†(Øç < œ » é µ¨;´È‡ç[9"·­¤ ¦ 0 ê(œLÿcýëûÄúÂùµø‹÷Kö÷ô“óGòañ/ñíñ¡óñõwø®úiüˆý"þþõþÂÿüzí„_<™éÿ„þýíüoüÌûÇúnùß÷oöjõFõVöµø)ü!á»<PE±TÎ`ì  Y ¶  ˜ Éìv«/— 8’ê…¡T¥r] ÿ ë ô W ‡Íÿßý)ü‰úÜø&÷põÂó.òÁð¦ïïWïuðPòŒô¶ö|ø´ù\ú«úéúuûzüðýÿ&PΙÄ\¯þ ý¢û{úvùzøV÷$öõô·óôõø¥û¦ÿi:»Üë{Aä´” x & ¯  T  ¶ÞÎË;seÖ½ æH Ó : æ ° ˜ Å{ø‰hÿ¯ýBüûÊù‚ø+÷ÇõRôÜòŽñ¥ðrð,ñÃòõ}÷Ðù¥ûÑüoý¸ýþ•þ˜ÿë[˜e£*¥˜þqýˆüÉûû'ú;ùXøµ÷“÷Aøúù»ü'¦‘q ©ŽV ÄÉl \ Ç 5 Ð ðúbw0tÓýÓqûª¸68¥H½´ ì ` K"Ú¨ÿ¸ýümúÙø:÷šõ ôò:ñ ð-ïËîïKð.ò‡ôàöõømúNû­ûÚû ü»üºý ÿs°‚ÀMEÍÿ(þ¢üVû>úGùfø¤÷#÷ ÷o÷…øyú1ýj´ƒ[ Àɾ'jŸ| u  ¯ G à È lQÅð¸Ü ç]LÇf¿ ‰ „ ¯ #Àl;ÿfýÒû~úIù øÁövõ"ôÑòˆñ{ðàï÷ïîðÃò=õè÷Wú)ü<ý›ýˆý}ýºý|þ¹ÿK×ÍÈÆEØÿ´þÜýGýÀüBüÉûjûNû°ûÏü½þ^R0 Z š $ ` ½  ,  o î   À¨´Al)1B&â‘YlîíTñ}– º»â«ÿ›ý¶ûúùOø¨öõwóóñ‰ð;ï"îXíþìPíeî@ð™òõ÷“øeù¬ùÊùúú°û+ýÐþT\¾gjÿ–ý7ü!ûLú·ùUù(ùUùäùûÉü5ÿœy b b Ë  ¬äé x 7 ·yF) Ö Ž¿˜û øÑ·ßT8{è;  C ½ ˆÁ£X*3þ†üû•ù6øÉöWõäócòñÄïçîîºî´ïzñÓódö²øeúbûÒûùû1ü¾üÆýAÿ÷™ÅDý §!Åþµý ýµüˆüuüuü–üýþÿÆDÉäQ ÷ á e Ù © ' Ð V x ÿ ç Pm®Rˆ<B^dGåÝ+Ùï@Œƒð:ÿFSQhþ°ü)û®ù<øÁö5õ¦ó ò­ðsïtîÃí‹íøíïÝðóõÉöß÷cøøÀø"ùúùHûðü›þÏëW3ÿÈý[ü!û8ú®ùyùŠùéù£úÉûˆý¿ÿ[ r; I ’ L Å | ¬ v « ü "å ÿ ÀŽÐº?<i˜w?%[ýg°¤ þ!ðéÿþ°ü~ûsúhùMø ÷šõô¡òVñQð´ï’ïð=ñ ó2õ?÷äøäùTúbúeú±úrûÃü|þg#XÑ…œSõþOþþ;þŠþäþLÿØÿ¨ÏX/)ûe = { = Ð k I y Ê ! = ï  ²ói#N殚g=8gîÔLp/_éÖ<YZÿýñû£úù˜ø¡÷‰öCõÐóUòñðÄïïî„î îsïãð¸òô2ö?÷Ã÷â÷å÷(øçø8ú üþôÿS媾bÿäýœü»ûVûmûÚû}ü[ýtþáÿªºãðž Ò u ¥ ” ” à } f Gò"©€ ¾ © ƒ±Zˆâ½œaëîBøýæY5v(t”ËþDýüûFúqùwø?÷Ïõ0ôœò7ñ'ð~ïCïŒïƒð ò-ô\ö?ø ùQú~úbúTú¨ú”û ýÿ½Ë·Ñ¸°ýÿ¹ÿÕÿ*ŒëPàÃ¥…k  K î  §  š , ã ® b ý W c1χnœÒ¥}H ̼ÿ¢­äô_'–¥„ÿ‚ýÉûbúUùtøŸ÷»öõOôêòŽñpð˜ïïïï‰ðò¡óõö‹ö‹öBöö@ö ÷nøLúHüûýÿkÿÿþÚü¹ûìú£úéú¢ûªüíýeÿ Ô£jûR Z ! ¨ o ù ¤ n*«Ðh‚& ~ Ù [7oú\±DÙž²Û¶g¸uš(S_„þöüÇûãú>ú¦ùøøø¶ö-õ‚óòÇð÷ïï¦ï:ðdñûòÊô{ö×÷²ø ù ùûø*ùÙù!ûâüçþÏU?|f—ëK°€õ†¦ ú è \ S ù p Ð > · ; À9…¸Íú8©DѤ[ð€# Kî×Ó®*!` Phÿ™ýüôú-ú›ùù]øS÷ö|ôþò§ñŸðìï’ï«ïFðMñžòøóõÕõöÿõÍõÊõ4ö.÷²ø~úYüÜýÅþýþþ¤ý†üŽûûûŸû°üþ·ÿr0ØCl[ · Q ñ Ÿ a # É 6Jõ J \ 5 Ù× mî{«DÓn.<›6Þe—W’O°ìÿ;þÔü¾ûôúeúçùUùø^÷ôõbôçò­ñÇðCð$ðjð1ñqò ôÇõf÷¤økùºù·ù¬ùìù±úü½ý ÿlßÙA8ß|0%GˆÑT«'ÛÁâ0 { š l Ý × r ¼ Õ Û ç?Žà*n¬ië†/ÚÍÿ ÿ·ÿ'Ì—M½²ñbÿ²ýüÒúäùAùÑønøê÷&÷öÕô|ó<ò7ñ~ððñïHðñGò©óõ2öñö?÷:÷÷:÷É÷êøvúBüþpÿ\š@~ÿ›þíý¤ýêý¬þÞÿSê|ÒãœlÔn ; !  Ú [ o  a b O > Ji°„÷häiªdGf²+¡íø¤åÉgòþýaüxûÄú;ú®ùù#ø÷°õOôóÝñôðKðÛï±ïéïšðÆñLóõŸöÚ÷“øËø½ø¦øÙø„ù¹úiüZþK [8©ØòN®ƒå?œ²‡ „ Ÿ Ã É ‡Ù¬ö ³ ]  ö\¿5 …ótörîeéÿ•ÿvÿšÿš2”Ÿ/QÿµýKüûúù0ù˜øøˆ÷Ïöüõôôìóíòòjñëð¨ð¢ðñÏñþò]ô³õÄöd÷Ž÷[÷÷üöJ÷øUùÛúwüÙýÂþ"ÿúþ‡þþâýþÞþª[äÚ1M^ŸBG Œ à ó Ž “   Û ˜ ‚°)ω2Ç@·8Ù›|Š·ò%A3ç[™™‰nÿ`þiýŽüÉû ûQú’ù·øÃ÷¶öšõ„ô|óŽò¾ñÿðdðÿïð†ð§ñ9óúô™öÃ÷cøøUø1øXøù;úîûøý óqeäL¨!¢.»Rç• O , # ( £Ó‚¯ } 4NÇjÍhê[½ ‘ šC ìÿìÿìÿáÿ´ÿQÿ¿þþýý:üjû³úú˜ùùøð÷B÷xö õÇôúó>ó™òò†ñ&ññlñXòºóQõÉöê÷ø©øqø1ø+ø©øÂùTû(ýïþgNŽKÄN=°»(·!,»Ñ¢ioâËý @ H Ú É ! ú ž B)gÿÊš_ý ¡]D[Ö  ÖnÉ&K’ÿøþnþóýcý»üëû÷ú÷ùòøó÷÷=öõÅôôUó–òÏñ!ñ¾ðØðœñóÅô—öøùyùZùþøºøäø¬ùûýWÿ”|ä¼)/V­4Ñt ’  Ä ¢ ž ŠAT•f ã I Àœ£h'Ø]ÀJŸN ÍÿŠÿ5ÿÈþDþ¡ýóüEüšûû‡úú„ùçø.øa÷‘öÊõõ~ôòóyóóˆòòoñÕð_ðCð¹ðÉñ]óõ°öÌ÷XøUøøâ÷øøø{úzü¦þ  û6»µ08±PÈÛ e h   c   Z j œ Ž ç Õ C ·i~ì b’í"X¾ldŸð# É&C8ÿ9þUý°üEü üÚû¨ûHû¹úú"ùMø…÷èöjöüõ†õõTôóªòÑñ/ññƒñµòhôKö øDùÖù¿ù-ù¡øføßøúüXþÊç‡xÕØÒ÷aëΞ > ®  Y Ø – ‹ “~Iáïœ  • L `ш^1ÚC•¦× §@àsãÿ0ÿOþXýdü†ûÕúWúõù•ù3ù¯øø÷÷ö õ%ôióêò“òMòòªñ4ñšðúïmï2ïïð4ò-ôö¡÷˜øßøµøcøcøõøFú,ühþ¥…ÈZ]õ6ìo½· > A ì | 3 L Ù Ä Ê ° \ 8 È PQÐkûi¸üHÁƒ‰Ì\^‘Ðÿúþ"þtýóüªü€üdü)üÉû,ûpú˜ùÅøøˆ÷+÷îö¢ö7ö õÛôòóótòGò²ò½ó@õ÷·øúÞúüúúúù’ùIú¥ûˆýÿŸ3;´ÖÐä-ÇŒ^§ L ’ ø £ Œ ª À ¯-*•‹ , Ç „ “í™uP­Cv¯§aÆE‘¦ÿ›þˆý‹ü°û ûŒú'ú®ùùDø:÷öÐô½óçò^òòÝñµñ}ññ‰ðæïFïÙîÖîbïƒðòÓósõ¥öS÷ˆ÷“÷­÷+ø6ùÍú×üÿ#ÔøäLÞÇâþÞ m   ~ ; ý ý Q ì ¶ l × Ñ V u O  û añ’8È>¤þo ÝÚóó§TnÿþÔýMýðüµü†ü=ü»ûû>úcùøè÷t÷+÷ÿöÒö‹ööxõ«ôÎóó¸òÙòžóòôŸö`øäùìúVû7ûÕú~ú„úûPüþù¤Êj®¶Íu¸^ß9 ‚ ¿ " ± u V 7 í L9ž œ Q ò ¬§ÿœmEšT¡øt à§^÷T~ÿŠþ–ý°üüûrûû¨ú8ú•ùºø­÷‰öeõkô¬ó%óÙò¬ò‚òBòÔñ?ñ‰ðÒï>ïï{ï~ð òÖó„õ¾öl÷‘÷l÷P÷Ÿ÷‚øúùùû"þ=Jé\+3  v ’ k ; $ _ ñ Ø å ß ‡Å‚Ë É ‡ Å.°7°!äe Üν˜DÑ PjÿÍþ+þžý&ý­ü,üŒûÄúÞùíøøf÷åö”öVö!öÕõWõ±ôïó"ólòùñüñ…ò£ó'õ×öfø•ù8úZú8úúLúüú?üõýãÿÔt N±Äÿ~&í§6 ˜ È ø 2 8 ÿ Æ l Ñ Î a ˆ p C % ?Ÿ7ó°\ãI˜çMÜ‹S&å†W ÿäþAþ¸ýGýåüwüöû@ûQú8ùøåöÒõìô;ô·óZóõòŽòùñSñ—ðàïeïOï¿ïÁð?òõó’õÒöŽ÷Ñ÷½÷¡÷À÷Uøkùîú²ü‚þ\?åk Þì4   Þ Û Ð Û 0 Ä « œ ‚ Ll o T 8 L ˆù€Œ„£hI>çwÜK†ÞÿTÿáþtþøýfý§üÇû¿ú¼ùÅøí÷:÷³öNöö¿õmõõ~ôõócóçò–ò™òóÞóõmöÌ÷ïø´ùú*ú5újúÿúüiýÿÇMF·ò*¾…BÜI ’ Å _ æ = Ú < P ü Y x y È<ÚŽ4¸bí`þÆœo&§ Fvÿºþþˆý ý”üürû¥ú´ù˜øz÷jö„õÅô0ôÅónóó¤òò}ñÚðCðàïØïTðMñ¸òZôôõP÷6ø¬øÓøÖøùqùQú”û ýÅþQœ–Uêq®aœ Gt§ ‚ ' ì « K § ­ a Ì ú  9 n¾7ÁQæv «]êºy%²+¢¢@ïÿ’ÿÿ‡þÃýÚüÚûÛúïùùnøÜ÷[÷èöxö ö’õõŠôô‚óóÙòÜò3óäóïô7ö‹÷ÈøÊù‡úÿúVûÁû[üDýyþÛÿE““F·F$ã¾›` ø h ¶ ý H ¥  € â  þ ™ ü / W Š ÖG×aà:m’ºöSÚx¹:˜ÿáþ"þ…ýý§üVüüŒûôú2úIùJøE÷\ö„õÓôCôÂóOóíòwòüñxñöðƒð5ðð5ð³ðŽñÀò*ôšõîöøÅøLù›ùéù\ú û üRýºþ,‹ÃÓ·x$¶?µf¯ûh õ ¨ ~ Y + Ô ..Ë  1 / * ; nÃBÉd¶s/á„ tÃEÅÿ˜ÿ|ÿOÿÿvþªý¢üxûNúAùløÃ÷B÷Ôömöö”õõô'ôÂóqóAó3óUóºóTô/õ4öH÷]øUù-úÐúrûüÀü“ýþ¨ÿ¼³rû[›Ü6®Z$öÆz ¬ - ¦  † ñ E r j ) ¹ $ s Í - ¯?ÚgÝ@ŒáA´AÎ[Ô=‰Ðÿÿ„þþ¯ýJýÏüü=û$úíøª÷‰öŒõÓôLôáó‚óóªòòxñØð:ð¼ïpïhï¨ï8ð ñ òcó¹ôüõ÷ö÷˜øùùýù£úŒû»ü(þ¼ÿVåO†~7¸^¬ |  ® j , ß 3½%L5Ù.E 4 ø UÌl,öÇ{bŠ‚{ïÿ„ÿOÿ;ÿ*ÿìþvþ¸ýÃüšûZú%ùøB÷—öö¨õ@õÓô`ôìówóóÈò¡ò¡òÆòó‚ó"ôôôñõ ÷+øIùTú:û üÌü‚ýDþÿ ùËyýeº~ °l1í› A Ð T Ï = ¥ ù 4 S G ³ : ­  „ ò Z Ã+ˆèYàhæT¡×ùCŠÿäþhþðýcý»üæûàú±ùnø.÷ öõCô©ó ó¤ò4ò»ñ:ñ¹ð=ðÕï’ïvï ïð³ð–ñ¯òáóõKöJ÷øøáø(ù‡ù$ú$ûƒüAþ'ÖNVö,,1^Ì…n m g H ë a µ í +]yw6µ å Ú « žèwHH[a4¶ìÐ?ÿñÿ%ÿ˜þDþþâý–ý+ý€ü—û~úGùøöö öQõ·ô8ôËó`óøò™òMòòíñåñþñBò¯òAóúóØôëõ.÷øújû»üäýçþÓÿ¨{[0¿ZÛCŸëH»M Ö « x & § þ & 1 . &   ü Ú ™ : ¨ ÷ ' U ‚»aÊCº%t¤ÄÌØÿÿ;þ¤ý(ýÆüdüèûKûpúsùMø)÷ö!õ]ôÅóLóâò…òò­ñ:ñ¶ð5ð¿ïsïbï•ïðëðíñ%ópô¹õâöÔ÷føºøáø ùkù*úpû1ýFÿxˆ8jã—~ăžé 2 = ð G U M G ^ Æ ß Ã J € x L + 4‹.#:M —«kû—byÿõþ½þ´þ¦þþ(þ“ýÌüÝûÞúÞùùJøµ÷1÷Áö@ö¼õ8õÂôeô*ôôô%ô0ôFôeô£ôõ„õBö<÷lø·ùû)üýËýGþ©þÿ‡ÿC4E[Lb†pTZ³gi™È Ê ‰ ë  ÿ : Ž ó B ^ 9 É  ' * D “Ô¢gù=5áoÇÿÙþ9þËý}ýý}üŸûvúùª÷Köõô9óòöñañ¾ðð@ï‡îêí^ííÌìÀìÑìíníûí´î£ïÄðò<óFôõšõüõaö÷Xø;ú¸ü£ÿ¤e‹ÔG  tÜO = JQÝÆ@‰ôÇòØZq? ÿ Ò ï q W ‚ ´ ¬ + ƒ’}‰ýþþýýfýqýtý9ý²üÝûÐú±ù¬ø×÷?÷×öŽö@öôõ’õõ ô3ôêóËóÜóýó'ôLôbô|ô„ô«ôòôsõ:ö?÷nø¦ù¿ú—û)ü†üÉü+ýÎýÅþuÜ Íäs%È ×á Ò ^ L“[Ñ P  & œ Gø|©hÎó  H ¾ { m d , • | ö<¶ ÿçþnþøýMýEüãú"ù1÷@õŠó ò ñCð¦ïïîÑíí,ì\ë±ê8êôéééêIê±ê:ëãë¸ìµíÛîð=ñ6òó˜ó*ôïôöå÷húý©Ì' ‰ ù ¹ 5 é 8 B K‘n ÿ’’fP‹)ÿÛ‰ØÀP Á W > ™[UX1ÄÅjÿßüCûQúú-ú‡úÇúÍú\ú‡ùqø<÷2öjõôôÓôæôõ$õ-õõìôÊôÇôæô;õ°õ2ö°ö ÷t÷»÷ö÷<ø¬øOù0ú7û?üýºýþ9þRþþÿ aêbà->yJïsª- ‘ t•á‡Ö¤ ž û žOÍýÊI£– q ˆ ² º ^ € " ã¦ë±ÿÓþ3þ‹ý°ü{ûòùøö ôGòÒð¨ïÅîþíRí§ìÿëNë¥êêéAééøèé%ékéØéhê!ëì í"î*ï ðÄðgñòó`ômö8ùÀüÊä–u G û í ‚ J ² õÿý`±ßYäÑ%ÚªVšmÓ Q ç  §¤¬c…é˜Ý þ‘û¦ùzøø1ø“øáøßøqø¡÷‰öbõhôºónówó´óøó'ô;ô3ô%ô"ôLô«ô=õôõ¸öz÷øøçø"ùeù¿ùCúîú¶ûwüýXýfýXý[ý–ý6þFÿÁl-±v˜qr“Žn B ¡;ÿÿ„Û`AŠÄ:a/¹/±kÍ$NýX  ‹îˆ€÷ÿÐþíýýèûúÅøÄö˜ôtòƒðéî›íˆì—ë¶êØéøè0è€çüæ¥æ‹æ”æ¸æèæ çaç²ç+èÂèŠé~ê{ëˆìlí(îÓî‡ïƒðòIôi÷YûÊÿWz¹ â êÞËL»e+/Æd5•ð‘±2õ ÚQ‡à 7 * ˜ k Q   z7'ÿMüýùfø™÷f÷…÷ª÷‹÷÷2öõáóÙò#òÑñÑñòaòªòÔòêòõòófóìó®ôõ‘ö€÷?øÓø>ù‡ùÈùú•ú=ûùûªü#ýPý4ýëü¤ü§üýþ|ÿ@v8$ZÒ#Jk# ¢ £á_Nô¦•Þb÷mš},Ï”¢ŸHªƒ¨É  <‰9\áÿ¦þqýüyú›ø‰öZô?òNðîí³ëZêé½ç€æpåšääçãúãAä£äå_å¶åæzæç½ç–èéhê/ëÉëJìÑì¡íýî#ñ;ô?øþüÇ¿ “ 3Źôº~œ½Óœ÷y^¤/¾§ë'…E ƒ =  ã  ,³[ý{úJøëöBö ööæõ‰õØôÖó¬òˆñŸððãïôï/ðjð¥ðØðñdñâñ™ò‡ó£ôÍõëöÔ÷ŠøùùÊù-ú¨úQûüÆüPý‹ý…ý4ýâüÉüýÖý*ÿÚ§68vìÅlYëdÙ§0 V Ô ·õÜá%©=°ãÊ=-s$,G0‡Ã°= t÷ïXÍÿqþ×üéúµøVöøó¸ñÇïîœì=ëØéièç°åšäÂãLã+ãUã´ã"ääïäHååæræþæ“ç è›èéTé¼éhê‘ëwí@ðøóŠøªýÙ‘Y ç RÛY=öe[_øÂŒ Q OÙK÷øA¤åàß#†;UÑ … + ^ é ºØ–-ÿüZùf÷/öŒõ@õõ¦ôô+óòÿððOïäîÅîÍî÷î*ïbï¶ïð»ð‹ñ¡òáó8õƒö¡÷–øRùçùZúÇúKûôû¾ü‹ý3þ“þ›þXþõýžý–ýþýþxB s,$ÅX\µ"ED Þ ô ­  q Ñ Xý®/Y'Â`0b=¤\ÂDk” 䌛Æmòþ.ýûÙø{ö*ôò,ð|îâìYëÍé[èçÚåúämä;ä]ä¿ä=å¼å&æzæ°æàæçGç–çõçOè©èõèDé¼é†êÝëþí ñõÛùÿý?d U J²ÍS›u‡Ki·ø§&¼¡Ñ(u‰NÜMÍ·9û ½ 7  Q ÑȃJþxû>ùª÷³öö°õ;õ ôÓóÜòßñùðHðéïÄïÒï÷ï/ðrðÊð=ñÌñò“óÂôö[÷‚øyù8úÂú'û~ûãûdüýÙý˜þ-ÿnÿ_ÿÿþ9þ;þ±þ«ÿ­@¼¤U7¢ÏÁ<ô—íßt Ë  h ñ ° † 9 œ § f  × ö … £'ÔM9O‚å  ] íÛ3Ü¢jõþDýCûùÒö¼ôÜò4ñ¿ïWîíì{ëêžèdçgæÊå—åÄå7æÃæMç¬çÜçåçÎç¯ç¤ç»çâçèMè‡èËèLé;êÌë6î‘ñÏõ±ú¼ÿb.Ò \  ‹ .vƒ;YTÌk½Ãg Þa¾ôÕvø‘Wvõº%< Ÿ O oD9ýÛú"ùö÷1÷¢öösõ©ô½óÎòåñ#ñ¢ðHððÿï÷ïð8ð‘ðñÌñºòÜóõoö¤÷µøù;ú¨úôú=ûŽûü»üý6þ¿þÿúþÈþ›þžþÿÕÿˆø£È¤ˆ¾Žh®¨SªÔ[í ¶ # S , Ï m K — l Æ hl ðë/í x  ë$´€^$¦þëüìúÅø¨ö«ôðòdñúï›î?í×ë„êFé>è}ç&ç#çrçíçfèÈèûèíè©èOèðç¸çžçœç¯çÃççç>èòè;êJìOï<óå÷Úü†sR Ÿ V ¤ ʵ nED0%ÄF%‚du8º4͹š[ž :  ^8 þ‰û©ùUør÷ÆööNõ`ôRóGòBñrðÕï~ïLï8ï5ï@ïmïÄïKðÿðèñøò3ô†õÌöþ÷ ùäùŒúûdû¾û1ü¾ülýþ¬þÿ8ÿ>ÿ*ÿ0ÿpÿü<“¿¨8I3J×ö§¦©vãú÷/Éà Q _ ñ ° ' « y Ç ³ + ìšÔ[ë"î c~ï¤zP„þÃüàúòø ÷{õ ôºòrñ'ðÖî…í4ìëêké(éFé«é8êÄê/ëYë/ë¿ê'ê„éûè˜èXè6è+èMè½è©éCëºí&ñgõúÜþû/Dq  ® ¾ ™ F˜>Ÿè"o!><– ŸÒ±D¸8+Ë ½ ¯ M S ’ *ùçþ:üú¡ø¤÷åö2ömõ‡ôófòSñrðÒïyï_ïkïï¨ïéïFðÌð€ñiò|ó·ôöP÷ˆø’ù„úCûÒû4üˆü×üJýÖýqþÿsÿ¹ÿÍÿÍÿÊÿéÿH Gmس %GÀÃJ-$æKCñŒNx)M½  ¢ š , ’  ò ] j ö ´8/S   ?$eáþoýÇû÷ù1ø—ö*õòóÙòÌñ°ð‰ïLîíñëë ê‰êÍêNëëë…ìêìíÆì?ì”ëñêhêúé´é’é˜éÛé~ê¶ë©í†ð8ô‚øþün¸ÅO - Õ U‘t¸BϨ0ÎÏ4è¢@ ޱÀA(3P Ï ’ °t:UýûcùJø–÷ùöNömõRôóÉñð¹ï*ïçîäîýî*ïhï¿ï)ð­ðañEòZó•ôæõ)÷`øùpú)û«û üYü¾üDýóý¿þ~ÿ!ãN¥?3\a EoÍW;’,ë}¸€è'~/_)Y²á   Í p ¯ ÑÑ( Œ  f 9 ¼ º …h“æãÿïþíýÀüdûÞù[øëö°õ®ôÐó ó?òdñuðkïhî‹íóìÆìåìRíçí‚îúî2ïï˜îäí#íuìëëƒëKë:ë\ë×ëÎìtîÕðô×÷Ýû±ÿ× Qñ^’ ë ¡óبu|(ÔÚQî—Ù·X飴D6cnó Á ¹ 䧦þ)üNúù9ø“÷Úööæô˜ó4òæðÍïï¿î©îËîï_ï¿ï$ð”ð!ñÉñ¯ò·óäôöE÷løyù\úû³û4üÀücý(þÿáÿ¶då7zÃ<êÐÕÒ‘íâz×@ãã)—öÏ5h ¼ zy ú Þ A UaªuÚÌ Q @ Ÿ K Q Ô-wÝáÿÿþýôû£úGùö÷Ôöæõ$õôïóXó¬òùñ4ñ~ðúï¶ï¼ï ðð)ñ»ñò6òò‘ñæð8ð‰ï÷î„î>î3î‚îCï—ð™òNõŠøüWÿ{—ìà¤@ `Ž;ùãïÃêˆrrB³¹y(ë ¨ Á & ˆ † à m D•µïÿ›ýèûÄú úùêøø ÷¶õAôÎò”ñ³ð/ðôïñïðNð—ðàð1ñœñ&òÙòºó·ôÄõ×öß÷Ùø¬ùZúæúdûÝûwü4ýþøþãÿ¼oˆžO' ö°%U6ë–io­û66â7Qh¦R8Eu| > â 4V͹$óíÀ6 " zJ¿t ãÿòþþJýgübû@ú ùê÷åöövõôôô8ôÐóZó×ò[òöñÃñÉñþñcòÜòZóÀó ôôôÈótóó“ò#ò»ñ†ñ™ñò3óôôV÷Cúwý ʹ $¶öõ o ý4µcDˆ{p«LAI0ºç Ì š ‡ Â f ý v ¦ A + l2»T>þ²ü°ûû¼úTúÊùûøè÷¢ö@õôóoò òÔñÁñÉñèñòUòµò<óäó´ôŒõdö1÷ð÷¡ø>ùÈùFú¶ú7ûÒûˆüUý;þÿìÿ°\¯|ebj^1Å   ää U ¦ Ó º G ‚‹Œ¼N_྾¡3 L ð4?Sš@L±KÝ1&Ÿ³q ³ƒŠÿÅþþfý‘üŸû„ú]ù<ø?÷oöÝõmõ*õõØô«ôpô>ôôøóïóô'ôZô˜ôÛôõ_õõ¶õÇõÁõšõ_õõäôäôFõöl÷DùŒû þprêÅ-_£:Yûñ ó ¦ÐK$~ž¸  µ ™ Ž d ô : Q U |Ñ…–ðJ|Br$br‰áþ§ýÑügü üæû‰ûîúúùê÷Ýööjõ õÓô¼ô´ô·ôÍôòô/õ—õ$öÉöw÷ øµø;ù±ùú{úæúNûÝûuü(ýâý£þ_ÿ)¾d(òÊdzÀåöDÙ  ÖM}Ž£÷˜¦ÏŸ[ÑèŸ=h¼O>yéZ«¶e¼Ë²‰p~ÿ´þþRý§üæûûú-ù<ør÷ÌöYöööùõÿõöö÷õãõÍõ«õ”õõ¥õØõ!ö†öñöP÷‘÷¯÷¡÷z÷M÷+÷<÷Ÿ÷iøžù7ûýÿñˆ´„eÒu^‹Ð   ” à †  ” $ Û ¶   { *   ä,xñÁÕ S_!xe † ·þ²ýöü}ü#üÒûrûôúTú£ùíøGø½÷S÷üö³öoö4ööÿõöKö¸öH÷í÷øùsùºùïùúTú«ú)ûÏû™ütýGþÿÐÿ{µf+ òÍ‘4¢óDn² y È é Å A wzm„Þ›±š$†¥uÿL„º¡ff€ž¤‚)™ã;ÿ`þ‹ýÃüüQûšúéù;ùøå÷E÷¸öEöö÷õöjöÒöB÷¡÷×÷ê÷É÷Ž÷P÷&÷.÷o÷ê÷“øIùõùsú±ú¶ú‰úNú0úCú¨úgûrüºý%ÿö0*ì ŸJµU È ý é › 9 Έ[JRJ É?ŒÁ„6"LÍïÈTŠˆa:>ÿcþÃýPýëü†üüxûÊúúnùÜøløøÆ÷ƒ÷B÷÷âöÌöÝö ÷“÷ øµø*ù‡ù´ùÂùÊùÛùú‰ú=û#üýþÖþ|ÿôÿ_ÄHù×ÙäÕ¢B¸.[¡ k Ð  " Ù ; XSEeÍ«÷=WCôqÓfÏKùĨ‘g5ãÿvÿúþhþÜýBý²üüŒûìúIú®ùùiø×÷P÷åö¨ö™öÉö7÷×÷“øRùõù_ú~úmú2úúùÐùçù8úÇú~ûBüëü^ýˆýoý#ýÉü€üiüœüýÔýºþ¨ÿ”dÉf ±Zú†ã ó¢2¶Lô8j†Fìsø–ff¤õO’®Š0˜ê)rÒTñÿšÿAÿÓþJþ¬ýý^üÇûHûàú~ú'úÊùhùùÜøÈøäø3ù›ùúeú—úúWú úÊùÅùú±ú¢ûÀüäýçþ±ÿ8”ÕŽ)êË©v$°i¸qÖ3 k h  t‘€my·DGt“ŠUíiÏ4«ÿWÿ%ÿýþçþÅþ©þqþ(þÔýcýöüƒü ü”ûû‰ú úŠùù¬øJøû÷Ã÷¯÷Æ÷ øøOù2úûÿû­üý(ý ýÑü¤ü°üý¬ýþbÿ†”NØÿIÿÞþ¬þÍþ3ÿÕÿ‘EîwíOº*±LØ=d@Ò'h¯"λßOf] Ñw.&dÎ?›ÜäÂqþ€ œKÏ:ÊÿFÿ¯þþ}ýóü}üüŸû,û¥ú!ú·ùnù`ù˜ùúŒúûdû€ûNûãújúúõùLúû:üýêþù†Ôö[ÉfÍ{ †ëE¤ …òI c A Å éÖä"žX917+þ­:®|ÿáþcþðý¤ýcýDý4ý ýýùüÝü²üwü4üæûŽû,û¼úLúáùsùù½øwø<øøø+ø‚øùòùúúü#ýøýþºþ£þhþ6þ0þþÿúÿà¢+èdÕH÷ÿïÿ2®NóÖ(sÅ${ÇÞ¼F•½Ü ”B7Hd}xY!à¾ÇùVÌBªçó׎7Úœoaa^4îsÕÿ-ÿ„þçýlýûü–ü1ü¶û/û£ú2úäùäùú’úûûæûëû—ûû_úÖùžùáù£úÏû<ý´þ°<^êf ¼j ŽdÌ4© ` n > ·ëåǺÈ} èÄ—d¥ŒÿïþUþµý+ý­üPüüû¾ûšûuûjû\ûVûKû7ûûîú«úTúõùù"ùÀø]øøµ÷w÷M÷B÷^÷½÷iø]ù’úèûGývþ_ÿÛÿúÿÅÿvÿQÿvÿôÿÁ»¤Už0§&̳èSçˆÍý8j±ü=N’Ū¥Ì2Øÿ´ÿ«ÿ´ÿ¹ÿ«ÿÿnÿeÿsÿÿìÿ:‘ÒüæÇ³¥«°¹«‰FÞÿhÿáþfþõý–ý?ýâüzüÿûuûæúsú*ú*úeúÞúmûùûPü^üüŒûéúTúú!ú¶ú¹ûýcþ¦ÿ«aà&aœø|"Û/³ …âMÀ3 © | 64!X׎^4þª/ØÿÿGþ“ýíü[üÏûNûØúpúúÙù©ù‡ùvùkùZùDùùßø˜øJøþ÷­÷d÷÷Ïö‘öYö=ö4ödöÏö‹÷–øòù†û+ýºþño—‰ƒ°#íçÞ«Ä8 %í`æ mšœ‰jSSamg$¥áêÑ­ Çÿ%ÿÅþ˜þ‡þyþtþhþfþfþ„þ·þÿQÿ˜ÿÇÿØÿØÿÅÿ·ÿ´ÿ·ÿÕÿýÿ'CTFØÿ„ÿ"ÿ¿þcþ þµýPýÝüMü³ûû úLú;újúÞúpûüoü™üiüñûNû«ú@úúyú/û7ücý•þ¦ÿ†)¥^ÎU¿s—ü^» ™% © " Ù 6 UE'>¤Då¯aà2Thÿþ¯ýûüVüÄû2û¥ú-ú¿ù`ùùÑø©øø|øføDøøÔ÷ˆ÷1÷åö¥öröPö4öööüõö7ö°öˆ÷Îømú=üþ±ÿñÏ7r‹ÎU(8QB×û°oÒvb’úmÝ,MEÚªŽ‰Œ~Qã;I+óÇ¿ÿòþ]þþÜýÎýÔýßýðýþýþGþ„þÅþúþ%ÿ;ÿCÿCÿOÿhÿ˜ÿÕÿHjjT'ãÿ•ÿAÿòþ¬þqþ3þíý–ýýŽüüûrûûÞúéú,ûŸû ü”üÏüÃüzüÿûuû ûéúû«û€üý‡þsÿ5Ä4— žR%¼_Õ&a¢ëRÔZ Ë ý ËÔ¾±Í%·yGÑX­ÚýÿÿRþ¤ýý€üùûgûÊú*úŠùþøøDøøð÷Ñ÷ª÷t÷+÷Òö{ö!öÛõõxõ_õ=õ/õ!õ$õ8õ„õ2öP÷Öø³ú°üþ'KüMt­%ïCoUÜç“z àî.‘ë+B4 ÔªŽƒ€l1¶ôì¯Mô¼ÿ¿þþ›ý[ýBý6ý1ý#ýýýý ý1ýJýiýwýý¬ýÔý þGþþÖþÿOÿvÿyÿsÿZÿ3ÿÿÈþ•þfþ>þþðý¸ýoýýªüMü üùû üƒüý‚ýêýþþÃýJýÔüzüdü¤ü+ýâý©þ_ÿýÿxÒ#‹ÉžIìVŒ­Äî:ª.· ;  ¤ë ;„¤`ÉEœÊæÿýþþXý­üüŒûûpúÛùAù·ø?øí÷¯÷–÷z÷a÷.÷îöœö:öÝõŒõNõ*õõõõõ õõ2õ¢õƒöê÷ÅùÚûûýÓÿE1ªå‚AZ¨+ ø F " ©  “B1Gw›žt¤.Ú­Ÿ°°Œ$jb(Ém;ÿAþýýÝüÀü¤ü€üYü,üÿûæûãûôû ü7üdü™üÑüýUý›ýóýGþ¡þïþ3ÿ_ÿ|ÿÿpÿWÿ0ÿÿÖþ½þ£þ“þyþJþþ²ý^ýýåüëüýwýêýUþžþ¦þkþøýiýåüˆüuü¤üý²ýOþÜþQÿ´ÿ~ϵ©2ÒÞÛé'”.Üzâ ËBz‘£Ó(¯R­9ŸëFÿ|þÀýýˆüùûgûÐú5ú•ùùwøøÎ÷–÷z÷M÷÷àö†öö®õFõïô±ô„ôbôOôAôAôFôhôÂôõÔöø«úÝüïþÏ}Ñ faßL m  K  ® - Í ˜ ’ ž ¦ ˜ ` þöƒ: ¢îæ¡.¾pÿ]þ§ý(ýåü¾üŽüKüüû”û5ûàú¨ú•ú¥úÍúúú/ûdû¢ûÚû#üuüÑü4ý¡ýþUþŠþ´þ¿þ±þþkþJþJþRþkþ|þyþcþ0þêý§ýqý^ý‚ýÙýZþäþTÿ•ÿÿ3ÿ±þ%þ¸ý}ýˆýÑýDþÈþFÿ¦ÿ÷ÿ2†ù¥znZ$±ü ÷ÞÞ”B·6 f A ÑM{Á$¦3ÅG¸Ku¦ÿÜþ%þtýÉü üpû¹úòù3ùøè÷l÷÷Ïö™ö_ööÕõvõõ•ô'ôËó‚óJó"ó ó óó0ó‚ó%ôCõàöäøûGý*ÿ—ƒ fÆn|æˆ3 « ¹ H \  ¨ 2 Þ ® ˜ • ~ O ø ‡ ‹4ûóóßœ $ò“ÁÿÈþ>þóýÈý¤ýqý#ý°ü.ü­ûKûûûûQû‰û»ûñûü=üaü–üßü9ý™ýðý+þXþ]þUþ0þþßýÑýÙýêýþþþðýÑý™ý}ýqý™ýêýhþÿ„ÿãÿØÿvÿÿ˜þ`þ`þ“þòþbÿÍÿ'j Õ)¢GõÂmÒôÞ eW†¶ƒ<·Ù™7CQ|Î<Ñt³2šúÿTÿ½þ-þ¡ýý€üèûHûú÷ù]ùáø‚ø<ø øå÷¸÷ˆ÷H÷öö”ö:öØõ„õ5õôôÂôôŒô˜ôÛôvõuöó÷±ùŸûwýÿ,ã=uÉfqÖ€4Â ì ‘ ¼ ~ Œ  Ð £ Š q D ž9ß“dH.³!F-íœbQÿþóý“ýUý.ýíü–ü&ü­û7ûÕúú’ú¿úû{ûîûYü¸üýfýµýþOþ˜þÐþïþÿ ÿÿÿõþïþúþýþÿ ÿÿçþ·þ|þLþ+þþAþŠþõþbÿÊÿ'ÍÿpÿÿêþáþÿAÿŠÿÇÿñÿ!K !מcøWe6û3´x_BóRUðBdv•Ù6¸MâjÌQÿ‚þµý ýgüÕûQûÄú0ú•ùûøiøè÷€÷1÷÷åöÒöÆöÁö¸ö­öœöŽö€ömöaöYöKöNöuö×ö“÷¤øúÇû“ý>ÿšƒ4Uœ6IÄ‹k ! z J “ l  ƒ ¹ { V * á v ø h ÖUßw¢ÿ*Ù†:ÿþ6ý¢ü4üÕûgûãúCúùÑø%øª÷V÷B÷S÷ˆ÷Ì÷øRø–øÙøùeù´ùúpúÇúûdû¹ûügüÏüGýÀýAþ½þ'ÿ~ÿ¼ÿéÿ:uÒ@¸)z¤–fÔ¥‘™Äþ&<4þÆ‹r{³…ð9nŠ¡Ë’NCaˆ _ á  Ø b ½ ^Î[ù”'•ä 뾊ÿ`þ?ý)ü!û$ú-ù9øS÷oö õÞô5ô“óó‚òòÁñuñ4ñöðÇððVððéïÊïÛï)ðÌð»ñóôö¤÷ùúûÚûÏüþ«ÿ¥íH…] ¶ € Ô ð ó U Ë J¬Ö½]Ô < ° : Ú ! ˜ Í Î¤oIInÀ7­KWÿ9þýëû÷ú;ú¿ù„ùqùkù]ùDù%ùùíøïø ù;ùùÓù'úhú¥úÕúûdûÌûHüÏü^ýÜýLþžþÜþÿ'ÿQÿÿÇÿ†ñHƒ—‹jNEY‘ëPªßÙ–+ŸÁš³ñH§ð)d²"Ñ©®¸²lä  ðË©ž©·½›B­î 2@;ÿþóü¹û•úù¯øó÷P÷¾ööjõ’ô¯óÎòòxññëðèðÿð ññùðÌð‘ðpðrð°ð=ñ ò óTôšõÒöð÷ù'úpûýõþ4ž4ò 5 ÿ o ¸  ‚ %ç£'Y˜Ëõ 7 Ÿ 1 ã Œ  O ` G1=~¿’TÖûÉ_Þþ}ý^ü¨ûEû,û7û5û û±ú5ú¬ù-ùÜø½øÖøùRùù®ù´ù¦ù·ùÖùú‡úûŒûöû:üYüSü:ü üü&üSü”üâüý1ý(ýùüÑüÏü ý›ý‡þ¹ÿGOû*øËÉ ´n«£†Ûƒz–  h ¿ £ - þ§¬ ' ~ p Ö µ,áˆx³vÿ£þ–ýVü÷ú®ù›øÑ÷P÷ ÷âöªöKö°õìô"ô|ó"ó(ó‚ó%ôÞôõæõùõÍõvõõÕôÐô õŒõ:ö÷½÷føùÖùñú‘üÂþ}•ÎÐ U 'IÏù4¨[1ðO%f#”ì^ æ ä ÈuÇÅ™|ÿ¤ý?üYûàú£úbúÛùÜø^÷Œõ•óÏñgð’ïQïï5ðãð^ñ–ñ‹ñañ=ñKñ¢ñMò>ó`ôvõröH÷ø÷¤øeù\ú”ûþüŠþB4½öíÆª­Ü%q˜y fÉu”?|ÌJW ½ t ©“‘îÇ!̈ #É4­‰R; } ·’Ä?¢Øñx<…‚Ή¬ u O EZnaÿƒüÂù÷sôBòŒð>ï>îcíuìNëæéRèÃæmåääää8åèåjæªæŸæræ@æ,æ\æÔæ™ç¤èÈéüê1ì“í>ïzñvô6øªüƒaÍ w!ßÜy Þ ½‡#dÄj•–ÂA 4K2Åù é â´8ø² ݬýû¯øªöbõÞôõ¢õ_ööö1÷ ÷‘öôõbõõïô;õ³õ@ö³ö÷4÷[÷‘÷ øËøäù/ûŽüºý„þÞþÈþcþÖýGýèüÌüíü.ý^ýMýý”ü:ü)üªüÔý«ÿöWrð–c‹aeÞàG I ÑßÕ:a‹˜ 4 ç/¯DaŽùÏ/åÉz–¸áª \  ëÓµmêý!û1ø2õiòôïõíuìKëZêhéDè׿=åãâÁà÷߫ߨßmà,áóá™â ãRã‚ãºã ä¦ä~åŸæâç8é¥ê:ì%î‘ðÂóÃ÷‘üÌô ôðÓàdÝ­é&Lü Ú!¹!— À†Qa༼¤7h<ù Ù #ë:ã£/A­‰þ°û¬ùUøÉ÷øÃø·ùŒú÷úîú{úÍùùXøå÷»÷Ã÷×÷Ú÷»÷€÷H÷+÷B÷¤÷Jø(ù úØú@û=ûÊúú ùø<÷¥öNö!ö÷õ¢õ5õ¼ôhôô@õÒö"ùüûÿÏ\Í{Å"ïs•)Àø e ÖSì Ü 4 Æ |L€ d s æ ï ~ j G Î ¯ å ‰ Ö û,•6ó ÿ<ý$ûùèö*õÓóûò‹òaò<òðñ\ñƒðï›îßí…í§í+îïÿïÚðoñ°ñ™ñ?ñÇð_ððæïØïÂï¨ïïÊï~ðòáôäøþêá O½×–-¡zþ;. 7!a!v ˆéíàhø % €½ ¡þ­ü:û>úùáøð÷röLô–ñîrëÀèÃæ®å†å/æfçÂè!êQë?ìíìlíËí6îÅî„ïjðlñ}ò›óáôaöøú4ütþ¨¡3FÍÏe®Ö J™é,bÿ˜þþûý›þBÐ  yû©Ë Ñ   ™ à '\î—A& ¦ G‰ÇKþ ª ³UkæÔU“¬µ¤J–‰8ÃMÝ|N  #QÿÄú,öÉñÎíbê¬çƒåËãJâ×à\ßÖÝPÜéÚ®Ù·ØØË×½×ßר|ØòØyÙÚ¼ÚjÛܵÜOÝáÝÞ{ßöàGãÆæŸëÚñùÝ^õ0ðI¨†f¡b ™"%€'‡)æ*_++Ö)&(&ä#”!*Žºc8S ñ ( ÜèÿØ<ü(þìúŸ÷’ô+òšðÿï)ðùðò6óTôYõ@ö÷–÷ß÷Ü÷‹÷ùö2ö_õ·ôZôkôôôãõ÷wøÐùüúÒû4ü1ü×ûEû‰úÈùùGøŽ÷¶ö°õ|ô0óòƒñÉñó†õÑøªü—ÒI L øÃ ø Œ Ž ’)å°†¯u T §Æë F V¬Ï„¢ÃêÑyÌ:±%ƒ¦a „ ö×RþùÍô2ðñëèÕäâÕßäÝ4ܼÚyÙUØ^×€ÖÏÕTÕÕÕ=Õ°ÕVÖ1×0Ø8Ù,ÚÿÚ¢ÛÜtÜËÜDÝÞvßÝá‘åÁêPñßøÇ[êÝTÕϪº$ ó!þ#&¾'õ(…)[)œ(\'¼%Ù#Ä!|ö5BRŸeÎ Ï N  ñ Œ ¶ O g/âÊ'ÿ þýwýÈýUþìþ|ÿ\†_¿ÿºþDý€ûžùÃ÷)öæôô›ówóŠó·óáóçóÀóXó½òò1ñQðhïvî…í‹ì‘ë‰ê‡é´èUè´èê§ìHð¼ô’ù>þB8ÿ°¢S<Æ X ~‰éR p ùæ`y.“TsîžC ¥ € Ì r {  J‘ûRøç“ðÛÿžþGý×ûZúÑøV÷ôõ¼ôÅóó¸òµòõòUó´óïóõó´ó(óXòlñ—ðôïŒïZïIï2ïýîîËí¸ìƒë†ê5êëíÑñ§÷“þÏ™ ^ÉΠ™+À¯ É!º#Š%î&ª'¸''ô%n$Ž"I ˆôÌ x°ÀýÛúêø»÷üöHöNõÅó¢ñìîåëÜè æÅã â)áÚà á¢áâÞãxåEçéÒê<ìBíÙíîðíËíßíkî‡ï)ñ<óšõ øhú–ü|þll A[Súÿkþ»ü'ûéùIù’ùñúfýıµg ]u¡ö¯1ã# ÈÕÜk!Ç`0ñ¬ ≖#ëÖœá ( 긔Ð× ë F øþ7{¨›M¾ôÿâý†ûÙøàõ¸òeï#ì éYæ0ä©â§ááÌà³àšàuà,àÍß@ß·Þ ÞiݲÜëÛÛÚõØØS×&×Ü×¹Ù ÝMâ>é³ñìúû ŸŸ2ª|!­"¡$Ø&9)„+l-À.D/ä.Ì-,,;*&(ì%`#e Ú²I¿ ÏȳNOÿDþâüôúwømõ+òïîìéé‡èðçþçè‡éÛê…ìkîgðfò8ôÁõîö§÷ö÷û÷Ú÷½÷Ú÷?øùúuûÚü"þ"ÿÅÿÐÿ3ÿ+þÏü)ûIù7÷ õÎò—ð’îðì ìì^íÒïfóÉ÷rüØ’S Þ > £ { # ˜¸ T‘¸àZw”ìwd/¯ Ò @ ¼ [ ô'q£¡Ï®ƒ„À1 ¨ ï ð¨3¨(þ»ûGù¶öáó¨ðí;ébåÔáÍÞlܾÚÅÙIÙCÙpÙ¼ÙÚQÚ’ÚÄÚØÚ¾ÚbÚÇÙçØÃ×}ÖHÕFÔËÓ$Ô¥Õ¡Ø#ÝãIêòõù#” ça‚«#XÒ!>%1(|*,×,-”,³+*)u'˜%R#® »©¤Ó?z ì c Î@¿]ëôÿ'ÿfþ¤ýÚü#ü­ûŒûÒûiü6ý þ±þÿòþfþ…ýuüjû{ú¼ù6ùÜø¡øcøø¤÷÷€öÛõ/õpô›ó“òEñšï|íîêèKåþâ¸áëáòãÜçRí²ó ú’ÿ½Sw… ¾.¤ +oWgKã_6Çwx Ð W ÉàŠàDþ)üû'û™üÿ Ê¥îyFýZúÃøMøÅøÐùûPüJýðýAþJþ(þþíýêýçýËýˆý+ý²ü7üãûÏûü¾üýDþ•þ]þwýãûºù4÷ŒôåñZïâìjêßçNåðâ,ášàÎá8åñê–ò,û® ôMØQ,ÑeΧ"p&˜)¹+œ,=,Þ*É(T&ž#³ ˆ'º • Ç™þ:ü_úDøÇõíòÒï­ì éèæ®äãÎáîàCàÍß«ßà&áËâØä ç;é/ëâìGîpïðŸñóò|ô$öÜ÷©ù\û ý“þïÿ#<9s ³Âÿfý¶ú#ø öØôáôVö(ù ýxÒ‡ / “ Ë 4 V Ì # – D¹Ë & 2«Ü3»ì} „ H"^>ÿõý¡ý%þ5ÿsV‰ñÿÜýùûLúù9ø½÷l÷)÷Ýö‘ö7öÏõvõ=õ2õNõbõ=õÇôôûòÑñ¢ð«ïï÷î@ï¼ï'ðbðFðÍïúîÑídì¶êÂèræÈãÕàÙÝ7ÛÙWÙVÛìßç_ðúv§ “C.65ùÎÃ"g' ,03ø4±55J30B-ç)p&Æ"²5~Íd T gôÿ;þôû(ùàõoòçî†ë‚è&æšä¡ãäâ âoáüàñàPáâGãÂägæè›éë“ì9îð+òLôxö©øÊúÏü©þK¸ðÙn±• Ÿ|ÿÀüùö–òŒïií¤ìˆíð%ôùþf«§…§™þI œ Íg鲊s š I ¼%ž6Æ#Fãºß ‹ ž Ü Î þ s + $o-þ¬ùCõYñZîlì¥ë»ëiìDíþíRî(îtíVììêké èåæ æså'ååjåù嵿ŽçcèééÈéké]è™æAä…á¼ÞVܹÚWÚ‘Û£Þ‚ãÞéñJø¯þŠœ‹Ñ· Ä ?Ú!$¹%$& %Š$9# "!h ÂÜœ hóרmbè% ΨÙx£þBý&ü)ûLú’ùùÑøžøXøø÷l÷»öÿõ@õ©ôTôkôéôÁõ³ö¸÷¤øhùçùúïùùçø?ø–÷ùöYöŒõyô ó:ñï¡ìmêÜèkèqé1ìrð¥õñúnÿ€á™:‰4w ÷ÃQ[èI¥› , ‘  I  Žæynðâ0û7àÿ ýû3ùÉ÷Áö÷õ$õIô]ó…òöñÏñ.òósô)öøïù‘ûóüþÞþ˜ÿNëâçÐ~Ç¥ØïþÝüŒúß÷ÇôKñ–íêöæ÷ääüå’éïÛõý…¤  ¿¶aÞ à!È#ž$v$#)" ïEYó÷ƒï ¬_®Ôéÿ”ü‡ù&öºòvïŽì5êOè¾æFåÖãâoáÇàšàãà–á–âÈãågæÆç>éüêþì5ï–ñô¢öDùÝûLþ{l W7¢Ž÷kgÿŽüIú¦ø øËøæú+þ.Sú ¢ ê Æ j Z `:l  Âwm(wz•<ãýÎ U U o E Á è Õ Ð ê1ª:šâIÿaü|ùÁösô¯òjñ~ðÍïTïïïïïïï5ïvïàïmð,ñ#ò`ó¼ô)ö‘÷êø;údû^üý‹ý§ýXýŽüCû˜ùŸ÷~õ9óÁð(îšë]éÔçlç˜è³ëæð×÷·ÿrß €¶²Ÿ€½@™7!$Ø%C&%Ë#m!½ÕÇBB ï 6 —aCÛÛ u#ý]ùõ×ñºîSì’ê8éûç¸æsåCäLã–ââÑáœáwáaáPáoá×á²â'ä#æ‡è@ëîñäó—öùƒûÆýÞÿ°‡„ œÊÿêý=üûÐú~û(ý®ÿ¯ÁfF 8 \  ± é ö þ î|1Aïš j „O=$ô ŠÙ çžF< Û ¤h¶(þmûlø=õ òõîì8éœæ8ä1â¥à£ß2ßQßñßáRâ©ã¿ä{åÝåüå æ1æ—æPç]è¹é&ëuìUí¡í+íìsê¡èöæãåÌåüæ é¯íóòêøòþOw K z : ) » "YÊ.ç·˜£ <ϱÙ3í %ê!¶‚Z D½iE„UÛ<¹ n ^hiasÿÃý[üCûjú¿ù>ùÓøOøª÷ëö,öšõFõ2õWõ¶õPö ÷û÷ÃøOùŠùeùáøð÷¥öõRóxñ{ïií@ë>é¬çüæ…çéíÚñf÷ëüŸØ_@‚…½™† „ÌÛp ÃWÎ ‘ ì âDÉ&KFAy(˜(y¯+ýîú…ø—öIõŠô-ôôô8ô¦ô5õÏõ_öèöa÷É÷øiøÎøhùNúrû­üêýÿÏgÆö è€ʹÿXþœüúøjõ×ò«ðIïïð¤ò†öbûŒL ƒ Ÿ ³ B ñ Y ½ /D… Ÿa÷¡¹¡¼S _ Í |J7T•–Mª×¦þoüú™÷\õwóòëð ð0ïDîMí^ì‰ëÁê-ê¿é¦éòé—ê”ëÎìOîðò>ô{öÑø7û¡ýìÿóŠ®W{ZJ‘çþßü’ú+øö®ô`ôjõâ÷‘û÷ÿh4Í ñ Ÿ > |)㇠å j]$ƒk?jo Ò äÉS¶ ýiB–<ËçJÌ•ÿèüúw÷TõáóóžòUòþñ†ñîðKð±ïQïbïðlñXó—õø÷Qúoü6þÿbüx œ+“κ91«½þ€üòù#÷ôãððíŸëWê~êgì2ð¶õVü+% ˆ Çz — Ý a ͪNP[czÛÜÄÐ o ï „ R…7i- T @ › SOÌ ýWùö3óØðÍîùìQëÐéèJç#æåäkãêâÑâãáã2åùæéQëíÄïßñìóîõí÷éùëûÖý„ÿÏ­.P4î†Á”¢ü§»6ý d   _ ’ '   B ‘rÙvÈþhx¼¯}S×a¯…ÝÕG ¶ W Ô#;¾AþÄûZù÷õJó»ñ\ðï¯í1ì«ê3éèPç çUç"èRé«êùëíºí0îîÈî"ï’ï/ðØðrñÝñöñÏñgñ³ðÄïîPí:ì¥ëÒëþì5ïlòxöû•ÿ©ÉÎÅ ï Ó ç Ò µ äñXêˆS„qu ã Û ‚ ž  C 1 t ä{#Ã2=ŸFLêHçB «  6˜ñAþ¥û;ù÷\õLôõóAôõ_öó÷¦ù@û†üBý‚ýqý+ýßüªüªüèüJýžý›ýýübúDøÁõóCðäí4ìxëãë|í8ðáó ø#ü•ÿîþö9^ ”.¨ˆH J Aµ ¦ .¹·fµd#Á5£ÿÿÈþ½þ"ÿéÿݪöŽxÍþÔüÄúòø¤÷ ÷ ÷d÷Ú÷9ønøqø3øµ÷+÷Òöåö€÷›ø5ú1ükþ«­F_)ÁB¸(‚½²Mƒ_¬EÊ;ÿýüû ú¬ùOù©ùÕúÉü8ÿ¾ÖQŠg‡ÿ÷ÿ^k¥“ÔR ÌW` 0i¦Ù 3Zép ƒŒÀ þKüÐú£ù¬øÆ÷åöùõõìó¬òzñ~ðð$ðæðPò`ôñöÈù”üÿ¤Åì28ų þÝû˜ùƒ÷Ýõäô¿ôvõ÷Où#ü'ÿî =x÷-ˆ|OüUÇ Ú <M m ß[BïÿbÿFÿ_ÿ„ÿ¦ÿ¦ÿ’ÿpÿbÿŒÿ:ãõþ‚ýùû‡úhùºøOøø§÷#÷göpõ>ôçòÁññ?ñSò`ô?÷Äú¡þf û` ä È 3 ÜuHMM1ü¢,{SQÿ6ý@û©ù¦øtøùúSüþyÿAÿ%þý#üÄûãûlü#ýÎýOþžþÅþÖþìþ>ÿýÿ2¸LÁÿÔn ì F K a UÞçU& \  oº¡þKüúø$öbô¤òöðsï;îtí+ítíOî´ïˆñŠó{õ#÷cøRùú•úEû,ücýçþ<be¡?9ºyN¶MM<4?^‹²¾¾ª‘“­Ü#q™‹?®GüÿmFj¶ùÿÌgÞÿ_ÿçþžþnþOþþºýýÿûÄú`ù øÔöÛõ$õôô‚ó¤ò”ñuðï5ï¹ïñXóöÙøNû&ýUþïþ-ÿFÿTÿŒÿéÿgæH}‰{^\j‘Ô&}Ñc² séeÛE”¶‘)„±ÅÑÚù2˜ÿ%ÿìþÿŠÿpµ% íXnR+.fâ A é j š d Ä ½ fÁìþ*ÿ[ýŒûÖùDøüööÏõ&ö)÷ÎøÛúýìþT,¾ñÿÿvþ-þOþ¿þLÿ¿ÿéÿ·ÿÿþ×ü€û;ú3ùŠøDøqøùòùûoüÔýIÿ¹R>Êé  ?aœãî7œö4&Ì'úþµýdü5û0úWù·ø9øå÷À÷É÷þ÷[øÅø8ù•ùÖùçùÖù£ùkùGù>ùRùùçùTú¹úû2û,ûû$û¥ûÝüòþªÐó´ Ý 6çÓ6ø Î µ – o 9 ù à ˆ H Ú  ï G2ß‘•ÿ0þ“ý²ýUþ-ÿÛÿÓÿýþÀýYüûúnùOù•ùúÂújûüŸücýhþ’ÿÌâ¯þo‹Œ·ÿFÿWÿØÿ¥†G²ª)H:ÿêýÆü°û¶úÙùùMø“÷öö†öYö†ö÷øeùéúrüÑýçþ ÿ$*:†ððçÂhÏì± øl†kþMüpú"ù¦ø%ù®úóüÿüº’b[ÒFÿ„þ¡þTÿs°Éw¡iÃÀíD²ˆç⨕ÿýþ ÿ´ÿÏ©Š½\¿ÿ"þÆüÄû)ûôú û5ûEûû•úÙùþø+ø™÷–÷Uøïù7üäþœ*EÜÙ6  –å1Œ//Ÿg^A ½ ‚ RûIÿƒû<øàõôeô÷ôëõ×öd÷X÷ªö„õ-ôêòþñˆñœñ1òó5ôTõVöV÷ˆøúüJþ¹Ÿƒ¸lóœÁzÔš ƒ (;8fM  á ¿ ·ß ' Èdù£ÿ‚þºýiýžý;þÿîzµª‹€ÃM-T­%˜ Û ¼ { é .O˜þ¬ù$õ¢ñsïºîFïÕð×òÐô@öèö¸öãõ®ônófòÔñßñzò|ó«ôàõÿö øùõùãúÄû¤ülýóýþ¸ýåüÚûÕú-ú$úàúdüqþÁ߉ñÞpÓ*¬w©%Ê{{¢dÄÛÎÎ7E?E’ š w‚n]k•ÂÅq ù „ Q»3ÿ4üúøøíø’ù~úÿú®úUù.÷›ô&ò5ðïÍîQïTðuñfòßòÎòJò”ñüðÄðñíñ6ó¿ôNö½÷øøúéúàûý£þ‰¸<( š † ÿ ? ^ ‹ ¾  U ¡ ¸ w ³ d › aÈðøþ4üäùJø‹÷­÷–ø'úüþÛÿ:7ßRÙ©îÀø B 6]Zí  iÆýÞùJ÷2öjöi÷“øOùUù˜ød÷4öõÝõ?÷ ùœü¹ÿ‹®÷oS÷¨Œ¨Ò鳦—ÿVüçùû÷­öæõšõ¨õÒõæõ«õõ>ôXóòëñ¾ñ#ò<óúô&÷ùÏûÖýÿ¹g™‘oK³ QÿÐþÞþôÿ |ö ‹U›yÿ‡"Á‡  ‰»ÓÿGþAþ„ÿx]eøYöücù7öôóGó]ôñõ¯÷%ù0ú¶úÊú úpúLú*úúÅùù>ùùLùúŽûËý‰|EžO 8 Y Þ é À€H8bÜ–|]6Ù7~ÿ^ýñú|ø4öOôóòtòó·ôa÷¼úZþå$Úì j ƒ t | Òvà µ¬vþÛùƒö›ôòó'ô©ôéônôõò­ðþí‰ë÷éÐéVë©îfóäøJþªŒÏÚ/eÞÖQ¢ù¨S›s œ ²;ãx á ÜrÏüÎêá A Í `ÿ×0ÿjûÚ÷¹ôòÂï§í¢ëÅéèèæ—æˆçòé™íóñrö¥úRþg,ð- çgœüZù1÷‰ö}÷ÂùÑüáÿ# <æÿlüqø´ô×ñbðmðÔñôÄöRùrûóüçýkþ¯þäþ"ÿkÿÿÅÿÞÿ*ñ€‹É N‰ó2Òó „(‡v‘–#öùop ¤û†?ý5úœ÷¥õŠôpôYõ)÷‡ù üZþ=ª€àÛÿ„þ¸ü~úÔ÷ÕôèñhïÅí(ííáî³ðœò ô©ô;ô½òbð‚í{êÉçÁå´ä´ä®ålç¹éMìÙîñµòÈó`ô~ô3ô£óðòaòò^òZó*õí÷”ûæÿ 5rá·-’/#‚A&‡x • ÅŒwŸ[V ©C1†0ÿ9þÀýêýòþã~G ‘ ( ó Ü å  l/Ÿ-þTûvùµøÙøcùäùú´ùÎøa÷~õnó†ñðïvî0î3îhî·îïîìîÈî’îcî-îâíií²ìÕë÷ê8ê·é±éeêÿëyîªñKõòø=üáþ¼ÝžUhBú ø Î,ëÜûGæÚkE  í¿¬Æ5ÿ‡þ›þkÿÇ™•ƒ+] é ¬ –¨þgûnùcøGøïøòùîú¢ûèû¶ûûIú˜ùRùÂùÕúuüLþ,Ò´õíÙò0b*O°LÿKüù)öôøò>ó±ôùö‡ù»ûBýßý¤ýÔüÕûûÍúûü^ýõþx³wÆ¡)u¨æÿ>ÿ¯þ6þ¯ýýˆüüÚûôûPüðü¸ýþQÿ5YûE( C F 6 :ºf¥ÇÿÍÿg@ l7r$“þýãû!ûÍúÊúûYû¢ûÏûÚûÏûÕûü?ü¤üÝüÃü:ü7ûÐù1ø—ömõõÇõ–÷Wú§ý *”%âõ¡4ðwU „ Ý 9 UpWäâ u ò nÿ¥RèÒÓÿõþ(þ–ýDýtýAþ•ÿS<ØÄ«;oºýù«õ§òÕð/ððdñaòóDóíò1òSñ{ðððÕðaòôüöùü`þs1“ m—°V£®½Î3AÞÌ© F u f E ö ¥ } ¢  – XÅô'ª ” øçæÿý„ú3øö;ôžò?ñ!ð"ïhîíí©í›í½íîÓî,ðBòæô¤÷çù5û:ûýùß÷Tõâòôð´ï;ïkï,ðgñ×òsô ö‹÷ù¼ú­üïþrõa‚* d E ó ™ R'Œ«@]6  ¥ = ( ÞeIÅ(Ž ³ z Y 7  ô Ê  Œ Ó í׎*²Gãÿ3þåüû_úù»÷PöúôËóçòò¸òžó÷ô}öÚ÷µøÈøâ÷ö¬óüð‚îŽìCëêbê\êTêêé›èwç)æñää·ãä,åÚæûèCë‚í£ï‘ñ]óõÌö›ø‰úƒüþ«å5»~ t šß Á%'!×"3$0%Ð%&,& &Õ%%Z%%¡$ð#Ý"S!Weªç&nª Ó ÒÈÇÙý/ûÓøÉö!õÓóÔò òˆñjñíñóÇô€öâ÷©øÃø%øîösõô ó^òâñƒñ!ñ­ððsïžîÃíí‹ìSì)ìÕëNë„ê„écèBçlææ†æ½çéÿëÂîœñZôÒöùãúÀüËþž!žé Ô f¿Ò¸“UòUvUøi§ÄÕÞì& H x ± Ù íóã³s%ÉH±þýmûòùÓø%øû÷<øßø±ù‰úYûüûaü¤üþüžýþæÿ‹U”Æ©A ·  A b O ý c n#šß_Âþ6ý¹û2ú¦ø÷”õ*ôófòUòßòÜó2õŽö½÷øÜø¯ø(ø‹÷ÿö°öÄö+÷Ñ÷‚ø8ùòù úNûüÆü‹ýUþÿ’ÿFbQ!ÇÿIÿ©þâýý ü2ûvúúÅùÐùú’úgû»ü•þãkÞðc * L  Ð Å  ¨ F Ê ô °   Ô§ŸÏ=¿Lçnêw.4…"ÅR‡F…G¢áþý{ûúíøþ÷E÷×öŸöÌö“÷%ùmûOþ}±€½ =  € ‹ € j j } ª à ª E ‰ Œ U âEyŒnþ,üÂù<÷´ôGòÿïî¤ì ìMìwí>ïKñ]óõ=öööi÷ó÷áøZú[üÅþBˆjÇœR™þy ì 8 A ç  í‘C>¬–ÙF £;qM éÿìþ3þ¤ý.ýœü¾ûú3ù­÷ÿõTô²ò!ñ’ïþí}ì!ëúé"éÂèïèÍé7ëí5ïuñ¡ó¢õi÷øø\ú¹ûýZþ¿ÿS`0®ô!’uðÐ î ó   æ{£·À Ü Oä~ï5K5Â`ä<l † ˜ ½  ©…‹©º¤G“Ÿ‰TÔ® ÿ©þÃýÔüÒûÊú±ùøt÷rö—õïôeôÙóZóÙòwò1òòüñ#òcò²òøò"óóêò–ò.òåñ×ñ1òðòôTõŽöˆ÷ø3øø¸÷‹÷É÷¬ø>úaüºþë‹?圫ÿý†ûõùáø3øÆ÷l÷ ÷†ööõvõ¢õ)öåöÌ÷ßø÷ù û7ü‹ýLÿ™vÉj dFzïs¼æ 8~ÝPà‚< Ø— 5!Ž!¥!g!Û ýÎoôpÈöÛr·³ v …ÿŒû øvô°ð×ìÜèãäÿàOÝÚ(×ÞÔ6Ó[ÒcÒLÓãÔÑÖºØIÚ\ÛÿÛaÜÃÜÝÐÞœàÀâ å9çAéëÉìcî,ðPòÐô™÷‰úUýÊÿ¸ênÓb' ë¯9 „ ¦ Ð * ï 4 hû{²hŒ*bgbYeb*¹òÔ€'ÛËödö¨: ©Oª  –,¾²ýbúÆöðòïjëèFåã§ááá§á`âãã½ãäã5ä峿eéílñÛõúùoýâóû]ÓeÇ“q‚ Ç K   (æ)¾§ÿævå_÷£G ³ ò  8ªx®K25:,¨ÿ'ÿ‚þÑý#ýwü»ûÐú¬ù?ø†ö˜ô¤òÕðWïkî6îºîÛïxñXó=õàö6øeù„ú¶ûûüAþTÿéÿÓÿÜþýÇú#øYõŽòÕï(í„êÔçåRâ¹ß“Ý7ÜÿÛ݉ß`ãOèâí¯óIùyþ0rb ;% :> #&t)ñ+þ-·/'1l2…3U4´4q4q3»1Z/r,)2% !ªûóˆ ÉügüJ÷ÔòCï¡ìëêñêàëíUî;ï•ï@ïZîí­ë”êéé«éÖé8ê¹êEëüëí¦îöðÞó#÷Cúßü´þšÿ®ÿCÿ·þ`þ‡þ8ÿN{^¯<ùïþHüWù_ö˜óBñvïAîºíäíÅîTðžòpõ¯ø ü5ÿü(«ªHŸâ.ž t v #Ì-`”æÿ‡þýÝü¢üÔüRýøý|þþøý”üWúi÷ýóNðÆì éçTå•äáä7æè¸ë„ï©óÜ÷Úûnÿ[´šXF ³ ¹OMº¤#'ý)r,w.$01µ2™34(4²3É2d1/E-±*å'Ó$Ž!öã{Ú óßý#øµò^í.èAãÂÞ¾Ú<×5ԯѿÏpÎÙÍÎÏ ÑÖÓf×jÛvß+ã,æ>èhéÐéÅéééÐé_ê)ëìÌìiíÜí6îvî¦î¿î®îOî‚íìê[çmä‘á8ßáÝõݼß`ãÙèðMøÄ3ìM "Þ$ö'8+q.j146ƒ7P8‚8.8{7{65U31A.'+Ã'$* ÿƒ– Ì úòôð7ìéèÀçèyè`è^ç\åâ{ß™Ü~Ú Ù5Ú?Üpßcãœç¸ëZïcòÂô†öÚ÷Ñønù›ùeùçø`ø%ø“øéù[üÕÿ(Ö+ xa¤KÅ¥ ¡, ®y˜&uÿkþäþ—3N] Ø t ™ N O ¸ÓÏáþEüú(øÆööö&÷nùßü=¨ iسAÌ Q Ju_=¥Dÿƒû½÷ìóð<ì3èìãßKÛw×bÔÒqÒeÔØ±Þ4æ;îÊõëûñÿÏî!_bƒ´ŽŠ = yFî²Øi= b î!a"¢! çÄËéÉ ú ;ÿùwó>îêé'êÈí½ó'ûÎf í ÐÑ ô ãȆÁ ‚ Z ¯¸»ÊÛΈ pÿÙý†üÇûãû#ývÿd84­YA›þùóní…èä[áØÞ¸ÜÝÚeÙžØäØ’ÚáݽâÅèLïbõNú¡ýTÿ·ÿ]ÿÓþ˜þÞþ„ÿF¨ÿ-þ?üeú6ù>ùúúžþê; †àyú` c!ù RZÑ_ÖýûnøöFô¡óTôSö"ùôûþÿËþ¬ýMüYû¨ûºýÔ°yee ˆ#%;%º$+$ $©$é%€')L*ä*´*Â)l('÷%2%’$Æ#V"÷™? a …ª»û\õ+îæ`ÝIÔ7Ëá ¼ˆ·!µ³´ÿµ¹T¾¨ÅÎ?ÖûÜÀá•äÁåèåü廿|èîêzípïŒðüðÊð÷ïyî¸ì/ëIê·éçèfçNå"ãƒáëàŸáìã è½í"ôú´þðÒ¢ú < Á¢£%=,ƒ1%57¶7×7489‡:/ÎÓÓWÚîà¾æ$ëËíÈî¦îRî½î­ð’ôFúS ‹òÎ#ÿ&¤()œ(‹'8&Ð$‚#H"æ -ÚÜbª‘ n•ÁÞþPý ü2ûÒúûñûýßýÑýMüù5ô9î¸çˆáMÜÀØaׂØ&ÜßáÙèð†ö‰ûÖþ«€ö¡Ù¤£ @ N × ó Æ ^ Õ  · i˺þcø?ñêã˜ÞÁÛVÛUÝ”á²ç>ïŽ÷Ûÿ)Ì Œzö–냗11`ÌþDŠÕ½½€v(£ÑØ MùãûFõyîèâ´ÞðÜžÝÝàgæ`íÂômûu‚ÈÍ9lÔo)BÉž“T‡á4vÿüžøØõRô`ô,ö˜ù0þw½c ÿ<þX‘8 —  é „  ¼~¬ù&òë—å‚â(âbä¦èîó9ørû ýý ü!ú­÷úô+ò2ïüë–è=åoâ¹à«àÆâXç3îªöhÿèñ í 4 ’ w¾Wÿ5ÿÓÿYþëûzø¼ô\ñìîðínî$ð‹ò!õ“÷ºù”ûMý*ÿ}’| ¨é>° ùözËÇ #%u&ë&Œ&±%ä$£$I%Ý&)x+[-1.Ã-,›)¢&X#˜ì·r è‰õcèüÛÜÑ˧ÇÉÆMÇOÈ]É‘ÊzÌhÏêÒ!ÖqØáÙÏÚ¶Û Ý;ß?âså.èìé³êñêoë§ì„î³ðÜòòô€ö÷mövô°ñïíòí‰ð5õ{ûJ.Ä \ I ­ù›MŠFsý€"ö"å!L 0k7!>$»'Û*î,‘-É,ï*}(Ø%<#’ l(c7 %PüÿõGòÆñyôÓùÊ € è ƒjñú'õ{ðÚìäéç„ãòÞkÙ Ó„ÎãÊýÈtÈ£ÈÙÈ›ÈÎÇÑÆ ÆÏÅKÆÎÇÚÊôυ׈áiíÍùõ ™ÈƒŽQ ø#G(Æ,0x2ÿ1/y*C%³ À°&"w.ÙÈ£q<ãÿþÍþ_ÿ%ÿ(ýùJó°ìŽæJâ á‚ã•é#ò\ûU“h  ÞU!8¯ÌN BÅ[ ý Í S jz:Š w/ûÇôðˆííäíï„ïAî@ë#çã=àÊßUâ×ç]ïE÷êý w­³ÓþGþÓÿвD<ùk´/55b¥uj2¤¤ý|ó\êLãßÀÝ0ß›â§æäéNëZêJçãÐÞ9ÜwÜ'àÝæ8ïE÷?ý´ÿóüIù7öõxö>ú]ÿ[ L ×áîXÒ: höy$ï)É, -¥+) (×' )/+u-//M.+$&$ úe ˌכý ù«ôñÐî¬íí1ìêHæ‘àvÙÒœËwÇ ÆUÇCÊ0ÎõÒÙØôßçtî£óèö©øžù«ú€ü]ÿ–š¤ŒÿNúõÒðÜí^ì1ì¡ì‹ìëè8ä×àZߨà=åíŽ÷fžzÐ ¹ ! "($j'±+Z0n4ñ6™7 6Š4Ú1O/­-S-9.¦/¨0‰0/Q,â(]%?"Èê:ø|„›øêÁÛ\Ï}ÆÂÀÁ'ÄqÇ/ʃËË5É™ÆýÃøÁàÀ ÁÎÂEÆöÊÕÏÐÓVÖ“×OØsÙÆÛßäôé´îBò~ô®õ”öÜ÷-úâý< œßý#¢&€(‚)ý)%**Ö)O)r(B' & %‡$¯$˜%:'`) +l-6.À-V,*¤(³&±$Ÿ"Œ RšÚŽs ¯øøCï‘æß÷ÚÖØÙÛ(Þ¾áå™ç½ècèîæåáãÓãýäÚæ©è´éhéwççã*ßòÙÕVÑÏ;Î0ÎpÎÎ]Î Î%Î~ϺÒ%؉ßDè\ñÓùÿ¶ Kç¹ÜK"÷&{+/Ñ2;5¶6Y7H7Í6*6„5ï4h4ó3µ3¡3–3^3»21E-Ø&­‹‘ ûñémä}á$àéßmà‘á6ãåÏæèºè é%é>é˜éêìÎí-ï~ïvî ìûèåGâšßäÝ.ÝÝÝ‘ÜƒÛ ÚŠØª× Ø=ÚÞñäþìæõ±þmV °è¾ `´‹_Ãyx ì ÿ !ƒ!¸"½$&'>)b*s*Å)þ(œ(ª(ª(Ñ'T% 9hÜøRíÇäÈÞ{ÛæÚÎÜ¥àŒå êÙîxñ[òëñÝððNðëñ ôª÷úÐúù$öYñ ì<çËãâðá¡âRãcã§âMá à„ßgà ã²çGîSöúþ.õ ¡2:j:êjU/!}#ç$s%L%Ù$$Ö$´%à&×'(N'®%¡#¢!ïMÇ<ä Òúðöæ›Þø×éÓ"Ó»Õ Ûåáòèïió¶õöúôkóqòÆòvôöö|ù,û:ûIùŒõ¢ð‘ëEçyäZã‡ãeä=å¥å†å2å$åàåÎçVë”ðd÷ÿ”Ý 6¤<¸µ…NåÇ9ËR?Èe Ý"˜%ª'f(œ'«%1#x wøýo {wý|ôjë%ãPÜUׄÔÔÖ@ÚÞßæåCëï/ñÝñüñoòÐóöËøHû ý›ý–üÅùWõ5ðjëðç4ææÏæíçÂèíèqèªçSç6èôêÄïjö(þñß #b­€ žûþ©Õ4…çÓ˜¬|/›C!©#]%*&&%¡#ª!3$D.^ ²Âùï@æLÞ(Ø5ÔÑÒ>Ô>ØõÝäéGí0ïšïIïï’ïñ.óxõX÷Oøó÷ öÑòïî:ë[èœæÏåŒågå2åØä]äÞã¯ãLä7æÛé-ïÄõâüź <ÑÑ ¨õùOÈzâ…½˜ ³!P#˜$;%%$w"T Ùô}O3×,Ž÷¬îgæ\ß÷ÙœÖ~ÕªÖýÙßáäjê¦îñ§ñMññµñ²ó¥öÅù.ü6ýŽü2ú€öòÃíCêûççç…çõç è(èOèé®ê–íÁñ÷ýˆþ Kwày—637­1­H˜>êÐÕK!f#>$™#Ÿ!îÜ@JI© .6ùmï†ålÜÕgÐ|μÎ)Ð1ÒÍÔ+ØùÛ‰ßâ„ãLäFåEç¶êšï;õ8úýóüú¥õ ñUíãêÛéWêEìïŸñ%ó‡ó‚óô®õºøýPUzŽÀvõj )!E"“#·$Q%$%%$ˆ"  õ M’K!Ý"©##¸"m!Ûâ:‹€Õ …õùÕïÕåÔÜÒÕ™Ñ ÐdЋÑäÒvԜ֊ٯÜFßÁàHáŽá+âã æ éžíñµò(ò¦ï&ì¯èÇå˜ãDâ âââOäîå–ç¦é§ìñð\öiü™âÕïHy• €!d"l#˜$Þ%'Ã'î'‘'Ý&'&¼%é%¨&Ã'â(¬)º)û(ƒ'b%¤"*±Í. ê®ùpïæÖÝJ×ÑÒ¸ÐèÐÜÒÖÚkÞžâôåûçÅèáè8é«ê‚íuñÏõ¬ùüSüFúdöœñåìýè7æ äýãìãòã¬ãã²âãÅäèí>óúÊÌ ý,…UçŒ1LsdÙÖv î —!¢"O$~&Ü(÷*a,ÿ,ñ,g,„+**(ä$ JWĶúpð§çŸàgÛ>ØUר‰Û{ߦãPçêgë€ëÍê*êêJì$ï6ò ô¶õ$õÑòï‰ê!æ¤â{à£ß¨ß àmàŸàÇàHá²â‘åêðóö%þôÕ ef’•ž\?eSœèd<zÛ $V'õ)s+Ç+h+´**w)X(ú%‘!¼”ÝÕûÌñ£é„ã_ßGÝ3Ý÷ÞâØåké1ìÀí+îºíêìoìíÖî†ñ>ôöuöõòî épå&âà2ßß*ßLßFßIßàߤáåê­ð+øÂÿƒÝ „”ƒÔ Ñ;[ïP Ó½ f­Lå!á$l'å( ) (Ì&{%3$–"' x?=wiýûò"éŒàÊÙVÕ|ÓԖ֮ڱ߶äçè¶ëíUíí3íŠîPñ*õOùœüþPýmú4öŽñcí_êáèÂèé_ê¹êWê’éé£é°ëvïìô¢ûËt ½#È*øLL6{a“½+¯½˜@ M"-$k%¼%C%f$‹#¾"Ä! ðÉ_óPü»ñ%èàÓÙ{ÕqÓçÓŸÖÛ2à2å(é¢ëˆì ì ë2êeêüë´îèñ¼ôPö öÜó)ð¶ë^çäã¤áŒàCàgà«àüà‹áÔâQå0éUîyôû°… -¿$÷°Áuâáùž•…UäIY´æ ™"¡#û#Ñ#R#ƒ"=!>4ÁœÖ ñâ÷¹ï(é„äíáwáõâæééÓí!ñnó·ô5õ@õjõ@öøÇú§ýñÿ³Öþ¥û‘÷0ó$ïîë®é9è4çHæTåsää_äëåäè<ížòtøþý¸Q–  w[â Ø ² ]’=r¨M²Ûzdý cÞ7ßL% lÖø)ðè&áÚÛ¡ØÎ×kÙÝ âoçEìÊï­ñò¾ñ¥ñ½òeõù ýH*ÌüÃøØô§ñ]ïçííuìåë)ëWêéé„êªì†ðôõgü(n ˜7>÷ýÐÊÐÕùçJí×d*ºe tÌ}3èÆ0/aŦ ÉúèñŠéâÆÛ ×WÔ÷ÓÚÕÙWÞJã™ç‰êùë)ìàë,ìÙíñsõúùÈýúÿ$-þ‰úöµñ+îÁëhêáéÈé·ééZéÊédëŠîRó]ù¶– þ_¼ÊHMÈŠ,Bt­6Æl‚é 2!²#-%~%Ö$z#¢!n»G  àûÚñièà5Ù8Ô‹Ñ<ÑêÒÖ!ÚFÞ­áºãZäìããÎâ½ã!æ¦éíöðó9ó¥ñáîÌë3é¯çUçè£é€ë9íyîeï‰ð…òÛõ£ú¹–kG&=ùgaÖ  o"º#$D#E!›pÌ~ o"…#›#×"r!„.IŒƒØ §ùgðûç¢à’Ú)ÖõÓCÔ×¶Û…áUçìïîÄï÷îcí ìì½íÏðô½÷yùùKöÔñ™ìç‚ã¢àäÞÞËÝíÝFÞ÷Þbà ãSç.í>ôÝû. q‘.Ö*¦ %ƒâÐ!E!  •½¯ºÁ!X$Ø&Ñ(û)3*q)Ï'W% "µÄ ³løÐïtècâ½ÝÄÚúÙ‘Û5ß-äéAîÚñäó~ôôyó˜óïô‘÷ûþNˆÄÿû™özò$ï²ìÿêÛéé…èèóç¡è ê%îóõø"ÿæ• É n½[Ë q … ç t nkÓ¯ / á ] ! G {-°‡€Ÿþ»ÝIË·©så÷Þïºè²âÞÛTÚ»ÛáÞãPçéêDí%îµíªìåë4ìêí¾ðô ÷8ùïù-ù?÷Íô™ò&ñ¥ð¾ð)ñ€ñ”ñMñæðÇð”ñÞóí÷‚ýòe U ^ªwBc~ùD;žiék«‰¸Àcwþg-/4þ xÈþ¨öÞîíçþá(ݦÙß×(ØgÚ6ÞÔâ^çë`í-î·íªìëë<ìþíñæôžøHû=üCû¤øõ7ñÃí÷êäèlçuæÇåWå8åÄå€ç³ê]ï-õŸûÀK v\dáÌêöøÉg*Ÿ‡„çŸ6ôMìÒ ,!,!Ø úJYÄ2»þ`ôÌëôä à#ÝMÜ…Ý_àäåçÝêwìzìë›è æ]äbäEæyé íéï1ñ—ð]îë¬çãäAãÆâã¿ãmäåÁ嵿DèØê®îõó‡úëO áç4ø¹÷,¼Ýh &"f#ß#n#î!•ׄ0úQ³ ]¥ Ç!r"M"ô ðºBSü°ñtè?áÜÙLØ·Ù݈álæÝêîàï ðéîDíìì“íYðÂóööù‡ùøôôëðÉì éæåAãáßzÝXÜâÛzÜyÞâåæ²ìíò8ùQÿô´ < •ù帽' x ÝNÕØŽðÛ "t$Œ&?(k)*>*i)ñ&,"ï_2„ú¹ïÒæ)à¥ÛÙ%ØïØ2Û„ÞGâÊåèIêCëÏë<ìí î ñô4÷Åù2ûNûQú–øƒöhôlòÄð‰ï¿îOî-îkî@ïÿðúó?øýqR žøë¡…öPñÏŒÕ{˜4v}ÏëmüJ7ÒN³Åó ¦ {¡þâöï èöáóÜOÙtפ×ÐÙŠÝâƒæê ì¸ì.ìCëÁêEëèìpïSòÇôö‰õLóÍïèë|è&æå8å=æÙç¼éÆëîàðô>ùÿ£K ^Va¤*A¦ »!.#¦$æ%«&Á&!&%$µ#A$%='²(c)ø(^'Í$¢!"W! ˜ û+ò«é âjÛüÕ(ÒNÐ}ÐtÒÌÕýÙ;ÞÚáŒäNæfç9èRé÷ê1íàïªòôô,öñõWôöñvïzíSìÿë1ì¡ìíBí?íníWîjðÐócø¸ý ùÁ GáÐì öä=²Ûaùœ†'q§‚ ¢¹©P£0Ôÿâ Ë­*ù@ðþçá1Ü´ÙéÙÃÜ­á–çMí¸ñ3ô®ô˜óÃñð@ï¦ïñÀòôeô(óNð,ì‹çDã)à´Þ÷Þ‘àäâ@å çnèké¥ê×ì‰ðéõœüÈk Â`srñˆª„ #s%ü&†' '¹%ê##"Ç  ú Ö-°8·a:Z/è v†û4òéUâÝÚ£ÙŽÛ5ßËã[èì‚îsï-ï0îJí1íDî:ð‚òhôTõéôóTð3ípê›èÑçêç‡è]éê~ê¿ê:ërìÙî§ò“÷ý!¯È © ߸z‰ ª g(5غ[[1â+„ƒÏmì¿'wÛõè¤ý`ô<ìüåâ°àwáÛãþæêSì`í+íì”êqéLé~êípðÙóuöŽ÷÷!õ}òÛïäííìâìtí3îÂîï$ïšïëðó½÷XýÎe T¦ÎROQ¸%ÐõËÃ"ýÊì 4±ëEZù °4ƒû0ôÜìæ=àSÛ×NÕìÔ‹ÖãÙIÞËâ™æ*éêúêSë&ìòí¾ð-ôŽ÷*úEû\ú}÷Aó®îÍêXètçÜçéNê/ë\ëôêê!ë“íUò%ù! ÐÊÑ-cÆ"O:˜é É"ê#%$‹#w"g!ô j!Ô"Þ$'»(¡)q) (á% #òÏt† 13ùôï[ç àuÚßÖjÕÉÕ‚×òÙaÜ6ÞßìÞÞݸܺÝ=àÓãµçÝêˆìBì$êªæžâß‘ÜÆÛ™Ü®ÞráFäÝæ8éÄëï˜ó´ù À´õ+•ÅRäûÐ{²! ?"¬#$w#Ý!ÈÆ‰jSÅ v ´×,9{[å®ï ZþTõ?ìCä8Þ°ÚÚJÜ¢àÿå2ë5ï€ñò^ñ2ðZï¨ï}ñôå÷úuûLú÷<ò°ìaç0ãmàýÞhÞÞÈÝ9ÝŸÜVÜݣ߇ä¥ëRôlý¨ /ƒMinl¾ö!D$Í%ƒ&{&&%% &ÿ&â'(N']%Ÿ"›Á-ÔIöM èçþæõÃì>äêÜS×ÔÐÓuÖ\ÛYáöæ ëûìÑì5ë;é ènè¼ê|îËò‹öÃøÙø¶öøòºî=ëkéé)ë¯í\ðŽòõóô¼ô5õ»öÖùyþ ¯ ›<W$÷kðõ±$ð£ÓCÕ¿U H5šPãÐWÎ}Û…  JUzü/öôï=êšåtâ&áÔá$äUç†êåìêí“í<ìŒê*é¡èRé/ëÙí—ðœò"óÏñÐîÒêÃæãëá+â0äGç—êcí_ïÇð?òŒôAø‚ýä¦ ÝÞD$϶bIÄùÖ!#•$]%W%˜$l#M"œ!Œ! "è"Î#X$0$#£ ÈË êPý,öäî¸çëà¾Ú³ÕMÒÑèÑ´Ô·Ø.Ý1áä¨åÿåÒåÒå°æ“èoëÙî+ò˜ô\õ*ôañäí£ê|è×ç²èÊêžíðÎòWôNõHöþ÷îúCÿ•0 I<¥”Yç÷ÓÙ  °"Ñ#$`#["€!K!ö!^#$%¼&­'x'Ç%§"nž’h Iþ²÷,ñ¹ê˜äßÕÚ9ؤ×Ù)Ü'àäÌæóçzçæQäAã|ãFåfèìeï=ñÿð±îæê€æ`â0ßXÝøÜÞgàkã­æìéBíàðõúýÿ_œ ù}•º`Op}A4"±$T&Õ&,&¬$å"m!Û \!Î"Ð$Á&ö'â'8& #Ëìš Ðþó÷=ñ¥êkäòÞÒÚ¬ØÐØ:Û\ß8ä¬è¨ëŸì¢ëké ç†ååfçêLîŽñUóíòVð7ìŽçOãNàúÞß²áåíè¤ìïï×ò®õù6ýiM.Dü ž(?l1â˜ÿ¡ã ["Æ"1"!¼êÑej ƒ!H"d"”!·ÚXygþ MÝûõOîÆçÀá²Ü3Ùå×ÙaÜHá‹æìêtíºíìR鵿=å†åˆçÊêcî4ñMò=ñ>îê¾åâ®ßúÞ5àã çrë~ïõòôõÓøü5/´ ­Agdfh{!d"#"!| & –“¦~ Á  ]ƒÆ`y þrüÄõQïqé3äÁß‹Ü÷ÚKÛÝ á2å%éì“íwí.ìvê8ééhêåìðåò«ô¦ôËò{ï”ëßçïä0ãßâäjæé¾ì¿ïwò2õUøPü2Är ‘£M•ê‘…æ¡!è"¯#l#^"ü ·êÈ3 î —!¨!¿ ž@èÏ éCÿlø³ñ\ë†å@àîÛøØÙ×±ØHÛß ãoæ…èøèèEæ˜äÍã]äVæFé…ìï,ð]ïßìZé°å“â‰àÛߢàäâ=æêîªñõµø»ü{Òz Ýp˹\=ŠpK hà!í#-%~%ì$Î#™"¶!_!—!?"##õ#v$I$# Éð?ã ÷½ýƒö£ïhéÛã߆ÛyÙCÙÒÚÃÝiáúäÀç6é(éÉç°åËãäâ|ã‰å‚è—ëäí£îíÿêŽçäáúÞÞŠÞ'à¸âæåné íñjõ\úïÿ÷ ¥@‚_üÁ!´ï3à #´%Ø&Ê&¼%$ƒ"K!³ ¿ @! "Ô"J##×!hÏ?×¶ æ¬ý\öZïäè+ãkÞÛ•Ù5ÚÀܨàå-éì[íÌì¼ê èÌåæäÇå3èjëtîKðKðnî/ëSç¯ãîàvßhß¶àãæTéŽì¼ïóîöŽû  VH–]õþ¹d¢z'!##$ç#í"¥!—   h Þ 2!,!³ ˜ÔFû` áý³õhî€çSáVÜÙØpÙÔÜráSævê+í îíÇêèÿåbågæ´èƒëßíïî}ìRéÁå‚â,àß$ßuà²â¢åýè¡ìƒð¼ô|ùÖþ ~ òy¾¡W%‡ûõºFa£Ÿ!#™##þ"r"""#"a"œ"Ã"À"g"ƒ!Êä½ É]ÿß÷Òð~êåÉàÀÝEÜwÜ3Þüà$äöæéIê’êêé èµç6è’é†ëfíŠîhîíì_ê1çøã áßÞ%Þmß­á£ä0è7ì¨ð”õôú@‰ ÅYèžÆ¬¯3]/k¨ ƒ"¤#ä#n#ª"ñ!{!Q!a!”!É!ÿ!"š!x ]¥] ~û`ôøí`è©ãúߤÝðÜßÝEàãç$êBì3íóì³ëê“èþç“è*ê<ìîºîøíîëé÷å3ãáã߳߆à6â„äSçšêeîÆòÆ÷?ýðnE 2ÿ™Ïœ¿u…©”! #â# $µ#.#Ã"­"å"R#½#$G$A$Ë#Ÿ"v oi$ Þú+óoìÉæMâßÝŠÝ*ßöáYå¤è=ëÑìBíŸìEë¹éžènèIéæê­ìðíþí§ì-êçºã×à¬ÞkÝ(ÝÑÝ>ßgáOäè}ì­ñr÷zýwêw ùwñFVŒ4ˆ‡åIV!Ñ"w#X#¢"Á! !¶ ¥ ¿ Ð Ð ± W ›AÆ9`a«ÿÑ÷mðéékä,àwݑܖÝCàä6èèë’îñïð÷îBí‘ëêêÁë©í’ï­ðpðÐî,ìé÷ånã»á áiá©âäçúé|íƒñö!û—'b ìwéPÝÌzV¾Öš³Åp j!†!ñ ý›–›q rª 842  äcý¿õ’îJèãFßÝÉÜFÞ=á åïè<ìyîŒïsï|îíÒë7ëƒë–ìî'ï_ïhî[ì éÃæ3ä?âáÝà‹áòâñäˆçÛêïøóù‡ÿj¼ -ŽÞCö7Blëó~mi2 ‰!4"<"Ò!S! ! !/!K!@!ú ‡ æ­®²vÖâ øƒðê¹ä»àIÞÝÞÏàÞã ç¹é‰ëoì“ì?ìÒë~ë‰ëåë§ì‹íLîvî¯íì·éMç!åhã+âuáaáöá+ãôäoçÊêïRôFúª m˜£ÁHz­í;Ý¡D r!¶!€! !± ¨ ã )!7!ÿ „ Û”k#wP ïóü'õ-îDè„ã àޞݼÞáä1çÖé­ë™ìÀì^ì¾ë7ë÷êë¢ëVìÎìŸì†ë•é1çÍäÈâKádà'àšà­áGãjåOè1ìñ÷}ýé º<›ü­G ieE!Ñ"ê#|$$G$Ü#™##™#ˆ#.#w"‰!v >Ô ›ë> aú ò!ëYåààíݧÜÝ÷Þ¸áÐä¡çÅéìê&ë¶ê÷éOéýè%éÈéÏêåë¡ìƒì\ëbé çÍäêâƒá³à”à)áRâøã!æ éêì×ñŸ÷Öýò` ¬ ¹§Î‡«m‘-:€®ƒ!Ú"–#Î#§#z#t#ž#Ô#Ù##Î"å!à ¼[€ÐÕb ÒÍù&òKë‰åáIÞOÝÞNàAãVæßèeêØêpê éÙènèèéêHë7ìoì”ë±é.ç¦äâá=à5àöà`âIäŸæyé í†ñëöýН òÄg?¡Ù+Ö¢Šp "#™#ˆ##g"ó!Ï!ã!ã!‰!« `ÜE·7®üÕ FÑýöÞî‚èOãߓ݂Ý*ßâså¯è$ëzì¸ì&ì@ëpêôéÛéê{êìêë~êýè³æäœáÁßÞøÝ ÞÊÞ,à âpäwçQë2ðö²üq¦ È–Ÿ€ ˆGeùåéÇ!1#"$Š$Š$X$>$k$á$T%%-%O$#¨!$ |Žï,æ Öùò/ëåoáÖÞ ÞßHá-äç0é\êê*ê éeé¼épêEëÚëììdëê+èôåìãfâiáÏàuàràîàâ¡ãôåé`í×òDù” ‘ßWv '2ôÕí¬ñ ³!" "K"¸"t#O$ï$'%Ö$$#³!5 ‚rž’ K’ùˆò‹ìÃçZäˆâqâäãaæFéëëÈí˜înîµíåìrì€ìíìlíÀíÈícídìêèQåÑâ×àmßkÞÜÝËÝeÞ߃á*äßçÃìËò¦ù ö ˜ª¯%|*ÕõN–Ð Œ!Ì!Á!ª!Ç!:"ù"Æ#L$L$²#¤"Y!ú‚׫ˆè †ýÏõéî8ééäGâ}áâåOè‘ë;îÍï'ð‡ïnî|ííBíÃíOî›î‡îíí–ìêè¾åêãÎâ?â â#â™âãÐ䵿bé%íò+ø·þk cÛM1,ƒfÂxMbHÄù^öçúØ 2!ñ  ýѳšQˆ¶m LˆüúôAî´è¦ä[ââã@æé‹ì¿îÊï¦ï®îwíœìiìÑìiíÑíÓíJí&ì_êèŸå›ãGâ§á€á¤áâââäÒå6èƒëÿï¿õoüqï -×ýCHƒ,fë¸3; Ê æ ¨ T 2 m ô ‰!Ì!{!’ *‹ÛUK›Öš ç=üZôíìzæYáÙÝ[ÜÝßGã^çîê[íeî-îBí[ì ìzì^íOîïîýî]îùìÄêèuåkã(â™áuá™á âÔâýã—åÉçôêsï\õMütä ä4þ·ò8ýx›&Àÿ œ"l###z""."Æ"“#9$]$Ö#²"7!©"­þì\ U÷úÎòœëÁåráìÞ`Þ¨ß.â,å×ç’é!ê›é|èiççœçòèmêxë¾ë@ëê<èæÖã1âgádáÉáGâÖâ¡ãÇäNæ[è/ëïvôûPG MÄÏã‘jÕËãâsb ¨ b È-õD ã u!ƒ!! ä¤Yï3ÒOAªDøüð±ê«å1â€à¾à™âuåèë»ìUííXìÌëåë¡ì§íeî|îÓí‹ì±ê]èÚå›ãâoáoáÃá.âºâŠãäæíç¨ê›îøó‡úƒ? ÍΩç(Ê|ÚÖ' « „ ì>ÙÐú "»"»" "Þ Wµù"û${ ÃüõõíðçGãNàNß=àžâ¼åÀèëVìzìÉëéêsêÊê×ë íÜíîfí&ìIêûçšåžãoââ6â›â(ãòã奿›è:ëÐî·óÛùÇŽP {õ'ÒSkÄû¼Ç !¶  Lê8 £ ¼n9ÚJ'k [±ú(ógìÌæ¯âdà/àÑáÂä èëíÎíJí ìÄêêQê)ëÿëBì°ëWê[èÝå-ã»àßkÞ£ÞNß$àáGâÙãØåkèÒëYð,öþü„ ~Ñ•CmNÃï™A{!þ"º#º#6#€"ó!ë!€"t#f$á$ž$›#"L w™´¤¡Ë €9øðÅéäà6ÞÞÇàäXçÞé$ëë-êé]èºèýéšëÜìMíÎì{ëvéîæAäùášàCà¥àaá9â;ãŠä&æèbê|íÏñt÷þ·{ ´=^‘oƒMòV Ÿ¤æZ ' ©Ln8 Œ!ð"û#]$$#Ï!j ‚Õ·Ò² @¿þ^÷»ð,ëöæeä±ã¼äç éÝë%íRí™ìjëmê*êÏêìí…íåì_ë(ézæ˜ãñàßÞáÝ3Þ£Þ8ß$àƒá`ã¹å·è§ìÔñ+ø ÿŒæ ²)ª·*lI?Ó»!É"#À"&"Ÿ!x!Ç!d"ë"#­"¾!p ølÌ —Bª ¾éÞù>ó‹íéæÛä{å}ç-êÉì±îïkï|îlíÃìðìÈíËîQïïâí ì¿é<çÐäââÉáˆáÎáPâíâÖã8åçIéèë0ïóòø-ÿj žÊ‰N¼{ùoºl$}øÆu2ƒM<ò0ÙÚCû”ÒX©„ íüÍõOïØéÇåtããA䢿`é¸ë1í›íí ìSë5ëöëBíhîäîtî9íjëDéùæÛäUã¡â›âõâcãòãÓä/æèŒêµíÏñ÷6ýÅÖ ©àŠçL€Ž¦   x Û"©´D ¨ ± ÷¾Çç1—ûÄ ‘øøüñ³ëœæã‹áùá äþæìéìííBìaëëÁë[í@ï—ðæðð(îªëÜè#æøãÆâžâ(ãäã•äCå æ ç“èŒêcíxñîöqýé 0ÁãBUk?IðÊ« £ òõ ×GF\ !ÿ / ËY´#ŒÅœ›T ¥áþ½÷ñðë€æžã©â‡ã«åGèxêÁëèë&ëòéõèËè®éVëûìÙííìØé7çšäqâ,áôà™á¬âÂãÇäëådç;éoë-îÁñ€ö}ü" ½7õhÀ8uW9Šã :!³ ›i“z.O_ ã ¨ ºR³`µôê4a +ÁÂúçóÓíïè‰åÛãòãmå¡ç´é ëVë±êséDèÆç[èòéãëcíÅíèìë‡èàåvã§áÝàáÉá©â]ãäÐäæÀç!ê`íÆño÷þý h £!,JMRW+C ýú !s ň !Ú!ã!!±ö&b² 2ðÍs Ç'ÿDøÌñ<ì è{åÂä«å™çÂéuëBì ìëìé-éLépê)ìºíeîßí:ìØé)çä}âKá áµá“âUãäãyäK唿fèë©î¬óéù¹, voKY:0)¦ö‡ "a"Õ!Õ Ð;W 2!"a"ã!¨ êö<ˆÐÙE² Ö½ôû8õ5ïhê#çåÌåJçhéNë€ì¤ìÚë†êAé¤è éjê&ìií–íŽì’ê èmåã€á×àáíáÑâyãýãšä”åçAéiìÚðªötýR2 ]°xS Vµ8ïÕ š!d!‰ çò´æ "Ÿ"Y"=!siY‚ßrúmu ùHùMòˆìDèÌå:åHæXè‰êì‘ìåë{êûèè(è|é—ë™í¬îcîÉìNê}çÍäËâÎáâã~ä«åxæççcè¹éãë@ïôLú#zo ~ÊÊ8ávHLçVÜ* 8 ] ÚH—¯@ ¨  Ñþrÿ¬9=Jø AžýÌöðmë×çæ4æ¸çòéìMítí…ìÿêyéžèÙè-ê ì–íîRíxëõèKæõã`âÑáUâãÓäë廿wç[è’é_ëîòŸ÷>þ R­f†{Žá(¶ÅÁ ƒ!)! ½µföW !ô æ%ÜÔhÑñtæ '¼ù•óWîvê9èÆçÖèÛêûìyîáî0îªìëÖé£éšêVìî ï·îíêÎç'åã â âêâä2å÷唿EçRèôéaìéï·ô³ú/:ë Ö hñï…ë‚æ `+þSg<fOøªî&jÐDœ‡¥ <ýªöÝð7ì"éÑç<èæé ìâíÙî¿î½íBìñêNê«êåëzí¦îáîûí.ìÛézçså-äêãŠä®åÒæ¬çAèÂèkémêì•îfò–÷Èý"£ – Âh*±Âà%F¦‹|T0qœ#P"Zv ô ‰ DSȰäMÄïo Í ÛËþ6øóñ¤ìÖèÏæ—æÜçôéì^í¯íêì{ë÷éééêŽëûì¤í.í³ëé+çåã ã’ãØä^æ¤çèé«éê.ì¦îPòP÷iýíÓ OùàS»“rÓð8Q @ e1.ÝSi©Œ ¿ù¬z„ÓM¿Î û™=ü¨õ¹ïë èç×çÅéìíí¿îLîâìîê0é0è<è8éšê­ëÚëôê*éÝæ~ätâ?ááÚá9ã±ä÷åçóçé”ê²ìÒï0ôÛùbÝK îXñ€¾%Ç3¶H!É!C!! á ðˆ„b ¥  ´Æ•i_‡Ú,Rë ž WÿõøµòUíeé7çàæè-êJì¡íÑíÑìë"éÃçdçè˜é$ëÿë¾ëZê3èÚå·ã4â­á(âtã åoæwç.èÖè¿é!ë[íÇð—õ—û– F8úIò œºoîý; ¬Ãð… Í Ž!~!„ ÅœQ $ZªãÅù +.Jý&÷€ñþì êÈèé«ê°ì`î$ïÂîwí¶ë$ê3ééáéúê×ëîëëRé4çåyã‚âiâãCä{åoæçµç‚èÈéÉëÅîþòqø¯þÖú ‚ D¦Lï53— ò®v·ö™íÖ ü K!® ;4쪑¼m( Þ mìÿÓùçóçî_ë’éséêrì"îïýîííSì¹ê£éTéÖéÕêÁëì€ëê%èæLäãÀâãäåæ×æ“çèÖé»ëyî?ò.÷ ýqr пИÍÝûîôâÀ©ð¢Ì¡Ù \ 6^$ܾï[ãC9p œ™Æü¾öPñ%í”êÂésêìßíïOïkî²ìÄê*éUètèRésê:ë5ëIê¤è§æ¹äDã‹â¬â„ã¿äôåëæ¯çtèyéüê9íjðÓôNúT š ‹ ê"ÖºbÎTâcß‚Æ&¯Ö ü !W È»|Sg¼6¢¿E ç eØÿºùÓóáîuëÓéïédë…íyïŒðuðFïzí­ëmêúéNêëãë#ì‘ë2êRèNæŒä]ãçâ+ãïãáä¹ådæçÜçéëËí­ñ°ö€üfŽK i (ç 6vÌòag…žw+tX‡‰ ú ’ RtIF§/å æ îèü4öñðíìêêüêíìïðñ:ðîoì®ê«éé;ê@ëìì7ë•éçåäfãvã8äTåræUçè²è£é5ë“íùð†õ ûü‰ì µ ò½“"®#'Wœè†æ{Œ7G]ûdhcŒú †…ë ‹;ÿ•ùLôìïÜìQë=ëXìîÂï¾ð¾ðÄï;î¡ìuëàêæêEë¢ë‘ëãêéègæå]äAä¶äšåŸæ¡çwèDéCê°ëËíÄðÍôÐùpÿú  è ¡%á>xŸpi÷¶€ˆ ÁÁPOsQ áiaÝÐø1T(† 9'ÿ¬ù3ôeïÏëÈéTé-êÕë“íÅîïWîþì‘ëêêFêÕêmë¢ë2ëêèöæ—åÂä•äåÝåÒæ»çtè"éúé=ë#íÕï|ó ø‚ý Ý >T’’áéÉh?Тz‚xK§™Îìs $ õ ÕœäXÏÜ ÷ 4‚#ýƒ÷Sò;îšëêôêVìîmïéïeïþí.ì„êeéûè-é£éïé¹éÜèiç¹å"äðâfâ…â0ã-ä2å!æüæûçRé5ëßílñëõ7ûÕ_ G Ùv£ý݈òǾ(´¡D´£— '!! iS%Q·#V*j í‡ÿýùôÕïdìê5ê/ëðì©îÇïÛïéî?ídëÞééáè6é«éáéé¤èEçÁåpäžãkãÍãšäƒåjæ4çè é†êœì{ïRóø^ýœ. z B [ [ Ë  ·š9/VÉÚâ1ð > )!u!ñ  À¢¡âj–³; Xþ–ø|ó]ï–ìVë{ë™ìîZïÄï0ï²íÉëêÐèUènèËèéé`è.ç¶åFä3ãµâÙâ‡ãmäjåVæ.ç(èkéEëêíƒñ öKûÁÊÍ } å [t·’)tÃì\ +9²“¬£ !!ì Þ"ÙèCÈ9\ n(Wÿ8úNõñþí:ìÆëzìÓíIïCðjð®ïLî­ìHëbêêïé÷é¿ééóçxæáä‚ãžâRâ™â;ã äãä³åœæÉçyé×ëï+óøXýˆÿT u … ]h^Óg·mmÚë^ 3W ,!a!Ê h€gnÁV÷^N˜$ ëþªü[÷§òï¸ìÌëìùìîÙîÞîîÌìQë!êéhé±éýé÷éqécèðæ\åä+ãòâZãäåã墿tçè/êˆì¹ïÅó“øÃýÑ7~ – ¡ >ÂÓ‹Ã'PòæNbm¹oz©¬/ ú“ÇòJ×yðÿv4 ?¬¡þù¹ôÝð-îÜì¾ìíÐîôï‰ðHð@ïµíìÏêêäéê;êêé‡è.ç¶åvä¡ãXããêãsäå¥å€æÉç©éSìØïAôRù¡þ–¤„ : z ³ó‡ "”a¸à+é´£ /!!@ ÃÝØl£ê¨ª Þ TFûùõ§ñqî™ìì°ìõíLï/ðFð‡ï"î…ìë5êØéôé8êQêúééÔçgæå8äìã3äáä³å†æGçè6éØê+ídðsô>ùkþcŸ¼ § Ž Ù ~%F)‹X´Ö‡gŸèïk޹ðd÷©ë~V qûÿ-úšõÑñ5ïÖí¤íLî]ïTðÄðpðeïâíBìîêêŠé]é>éøè`èrçPæ*åAäËãÓãIä÷ä¹åƒæ[çqèôéìïÑò^÷uü™K µ Aý`ÓšñÅÛâ…¦C†®ùŽlnRÊ Ñf ºóbéUmì¶ ×c˜þ´ùõñ î&ìgëœëuì‚íUî›îAî[í7ì,ësê$êê8ê8êòé`é‚èzçƒæÌå{å†åÏå,æ—æçÙçééê|íÚðõ·ù¡þ<õ Ï ß ‚ %"¢¯ ghÞ¼$VŽÜí Ê !  7nËM͸´ » (ýløAôôð¿î§ííûí£îïúî;îûì{ë!ê(é¡èwènè]èèXçYæ$åä0ãÈâÜâAãÛã•ämåƒæøçôéƒìÂï·óGø+ýüQÐ ^ ìÝ&Å«¤c·Œéjþ×Ã‡é¼øµ!û™=¦œ÷” …íÿ5úÄõò„ïî·íîÛîvï•ïïðí€ìëôéIé é ééÀèèçØåŠä„ãðâäâDãáãä@åæçè ê`íàðõÅù•þ Ák ' & × ž Èmu±ÏÓúC¥K).Åï’·‚&ГS븊— óü+øôÌðÂîÙíßítî$ï‰ïOïqîí—ë=êAé´èèkèMèøç^ç}æ~åŒääã´ãêã_äôä†åæèæèÊé?ìyïó+øýÏÕßã  Æ i L£o…lÞL’ÛÝß©Ñþ³h+ù¨×÷a 6¤ýþ~úrö3óãðšï;ïyïð{ð~ðÿïýî²íiìSë”êê¿énéýè[ètçYæ,å'äãDãkãÐãLäéäÁåóæ©èëîíñjöQû/š 4 Ñ £ØƒÊߘآ^¾Mê¬  Šˆ9ÇTðr¹ˆÄS D Èjû÷fóŒð®î¯íní§íî"îÖííìÏêÅéýèè0èøçµçPç¾æÿå/å~ää äWäÍäWåÝ倿lçÓèéêÀí^ñ®õjúAÿ²V ­ ­ M û ïN õÇEUðJ…ä~\^V`DµÌ³’y[ü-µ|‘ XýùTõ}ò³ðãïØïCð³ðØðrð~ï(î°ìaëmêÞé’ébé%éÀè èEçKæYåšä*ää8ävä®äôäså^æè~êçíòñöÿûÌäû @ ü µ ² 0!^ Ÿ('¿mãƒG ´f¤ŽW èyw¼4 ø;Lÿ„ú:öÎòuð>ï÷îZïñï\ðKð•ïkîùìœëŒêæé˜évéZé"é¬èøçç&ægåå åmåÿ剿ç¸ç–èïéùëÍî…òùöÚû¶ý[¨ ù Ÿ ¡ ¬8&9!¤¡(`…ÓsQK)¯À^Ž{bn™Æ³»„u Áµ°üøAôzñÍï$ï8ï¨ïð$ð¨ï˜î.íªëZêqéáè–èfè%è¸çç1æFåväøãêãIäæä”å)æÉæçÅè—ê<íÄð!õúOÿ0DC & +´5_(F["hKF@së™S×É!áÖ×¶-ø, ¤¯–ýÅø ô^ñ0ïîÖí+î±îïïkîcí#ìôêê˜éyé„ééeéûèAèPçKæjåÞä¿äôäNå®å æŽæaçÈèØêÀíƒñ÷õÛú¼ÿrº  ° 1 î 6aÙÙ®ñ\Ò†StV^T`…ˆEpÑW! VY‹üAøÇôSòÚð@ðCð‰ð¹ð‰ðØï®îMíåë¿êáéTéêèèè}ç¾æëååkääïã"ä|äÞä=å¶åxæµç é^ìôïOô3ù-þÑ”D Û ¨  ™ ‹ f´­%ÇýQ݆.­ÑœHb‡ºâÏH. ¬ÀÂþú&ö0óYñ—ð¢ðñ”ñ­ñ!ñ÷ï]î¡ì$ëê`ééÖèžè<è™ç¸æ¹åÇääÞãä‡äå”å æ¢æŽç éNëyîˆòM÷oüa¨Ùæ î \ § 9 Uý`x#>Ö;yï—KÚ+—ÌØê^‘r¼.¯I =ãÿ¿ú:ö½òuðkïhïðãðoñgñð;ï‚íÝëŒê·éWéDéAéé¦èêçùææ5åÊäÕäFåæå‰æçœçGè`éë²í/ñ~õhúkÿ ¾> š  N ™ o ì ñnÂÇÇæ5¨Y:¶Ó´ˆ­ñË×H ¸³™üß÷ýó?ñÇïpï÷ïãð»ñò»ñ­ðïlíöëîêhê;ê/êê±éøèíç»æ—åÂähä‡äå«åNæàæ}çUè©é¸ë©î‹ò:÷YüY³òý î B r ù á.¬öÈò~©©Å°gM)Ž~co™»’ÜKÎ t q3ÿ0úÏõzòQðWïOïÞï‘ðöðÄðéï|îÎì7ëêFéøèßèÐè›è+è}ç¢æÄååÕä÷ä{å#æÒæwç"èûè5êÿë˜îòrödûu!ÑC ƒ Ú Ñ è ˆ ÖÁQK¯ÅÎËúhšÿ°ú 6€ÒìP32 mSHü»÷ ô€ñð¼ïð¶ð1ñ7ñðeïÖíBì÷êê¦éyébé8éÙèJè€çªæëåså_åŸåæ¢æ+ç¸çkèséë[íŒð£ôhùþ|°Í ° ˆ Ë ê c|:nÕ ÂÛTgNK{émÝÁÓœ€uZðó'u èÒ”ü­÷óŒðÈî9îžîyïbðàðÄðìïîðìuëZê¼éééé>é¯èÙçàæëå:åôä$åŸå@æ×æfçþçÓè$êìòî¯òM÷uüŸ=Ð & M ¯ À È5&`‰[£`®Êé*’†»‹îúêço× Â² ‰ ŸEöû4÷tóñðÇï¹ïjð\ñ ò#òrñðAî^ìÇê®ééÖè·èwèûç1ç:æ2åOäËãÈã5äñäÌ奿rçRèvéëcíð£ônù£þ©í ë ¸ ó ˜¼†Ë5a ƒ ¢Ç$°XÜ Àþæ©nUK'ºªÊñ :ë}ü}÷Uóbð¿îUîÍî¶ï‘ðöð¥ð ïî^ìØêÊéAé"é-é"éËèè çæ÷äAääeäåüåÒæç9èéêÕëhîüñ€ö¨ûà‰ Y Y € a z 1 ¬Øc잊ï/{Áwø §Ôć–¢†úµ‡j †7ùûJ÷˜ó,ñðð³ð”ñ9òGòœñYðºîíªë¶ê*êØéé;é–è¬ç‘æmåväáãÅãä¨äQå÷噿[çqèêŽìéï%ôùXþG[8 Õ o } † ö ¿öOmþn˜½·g÷=‰¹Ðó&[j.j» 96%þyù«õøòƒñ&ñ‘ñXòþò.óÀò­ñ$ðkî×ì—ëÇêCêäééïè.èBçHæjåáäÂäå¥åPæóæwçèËèêñë±îiòÿö üKØR ~ z ª ‹ ¥ S ²¼ yuјò>˜'à†âÌ@T-ëñ÷Ð<æ™ I AçþÂùbõ+òCð´ï,ð:ñJòûòõòBòñvïøíÚì:ì ì)ìHìEìÿë€ëÕê*ê£éqé¦é5êüêÒëŸì`í>îbïùð.óö©ù½ýë¿ÎÕ Ò ù ¶ d b è ù qjaÔÉ[°üTÇ]û o Á N ‡ © ›J¨þæúÎ÷õíò†ñîðñÃñµòžó>ôôkôôÅóžóÓó|ô‰õ×ö.ø]ùIúÞú'û=ûEûdûÄû[ü+ý þìþÅÿ”rf÷Ÿn* š † î Ú r ã V ÿ á  Q ‘ š K Œ ` ×(JŒÿÎýÝü7üÉûuû!û¥úú"ùøîö¿õŒô|ó–òëñzñBñ1ñ?ñxñ×ñUòóò¡óhô;õ&ö÷(ø`ùÄúoüXþsžº¥9] á    ; Œ  ¨ E Æ  +  ¸ P Ú Q Ê F È G Å9ª ¸d7æ†ÛÎSxhþSüeúÜøÌ÷E÷4÷o÷Ú÷?øtøqø6ø×÷d÷ööªö€öƒöœö³ö­ö‹ö\ö,öööö_ö»ö1÷»÷MøûøÛùôú^üþ Ò1 ™º¯–‹©õh é T ˜ « • _   v ;  òÈ–BÔ^åx$Òmá Ñ,-ÿùüÂúÎøB÷BöÝõüõoö÷t÷¤÷ˆ÷#÷‘öôõvõ2õ5õpõÁõö&öööæõàõ öjö ÷Î÷©ø„ùWú7û,üUý¯þ=ë©L¸Én½ÔÜç    Y Q  { á D ½`9++ ¾<ŽÒ;ýÅDSæÿ ýûAùø÷M÷?÷µ÷`øùyùù>ù¡øè÷E÷àöÁöèö)÷a÷l÷+÷¾ö4öÊõ õÕõmöV÷zø¬ùÍúÕûÔüÔýòþ@Áq*Ìþk v > õËðU ø « : ƒ {  ~ Å  ™P?D.Ú<gp•ížž½Ñˆ¸@%ÿ™üòù‹÷®õôWôÅô¥õ™öM÷‘÷H÷‘ö«õáôbôhôÓô{õ$ö‹ö‹ö$öŒõ÷ô±ôÞô’õ»ö9øÊù@ûzü}ýZþ8ÿ=ƒÖ­P > k 0  f L • 2 æ € Á Ž ù , O •  ÜÑÈ›^u¨Öé*TI½‰Îýæú1øö®ôCôôxõrö#÷X÷ÿö@öTõ›ô;ôeôõéõÁöE÷J÷ÒööQõÛôáôvõ†öí÷Wù•ú€ûü‘üýÑýúþ žÈÕwk º v ðl4z9 W ~ o â É 4 H A U ¬R41Ã4€Ûsj¼C¾ÕS {‚ý£ú?øŸöæõö³ö™÷Mø|øø)÷ öõbô8ô‡ô$õÇõ)ö!ö¨õïôAôÜóýó«ôØõM÷ÈøúûÏûVüùüâý>ÿ%bl á  Š Ã‘¤9( 0 ú K  Z ] Glã¸Éîñª'vÞ„›ÏxÇu\nÕäýû“øëö!ö/öÔö­÷Xø›øUøŸ÷¸öãõbõNõõ)ö¶ö÷åödö¨õ÷ô˜ô±ôNõSö‘÷ºø£ù8úú¥úæú‰û²ükþðC1ˆ- ; ð–wÀ • Ê Ô € ¤ [ » ü V Þ   h ' ¬ êl:Ô·ž 2   8¶ý¼ù)÷õÞôïôbõÒõñõ’õ¿ô²ó¯òðñœñ°ñò…òÑòÎòfòÃññ”ð‰ðöð×ñõò"ô'õéõYöœöóö¤÷ßø¨úðü~ÿ`1™“i^Ÿ9 *  ³ æ ­ 2 ’  ¿ ž   ± ¬ ‚ 3 Ü©Öt v ³ â ² Ü m Ü£<"ÿ¸ü/û‰úúéú:û:û¼úÞùÈøÆ÷÷¥öªöîöB÷o÷E÷¶öØõæôô¬ó¬óô¼ôxõögöoöSöNöœöt÷áøÐú ýZÿ†6OÊÊZe¼b5 µ ÔŽ[Mg–Ìíóײ²ö‚R A  Œ u Œ Î@%éÿóü¨úDùÀøíø‡ù0ú—ú¥úbúìùkùù ù8ù›ù÷ù*ú úù¡ø“÷‘öØõ~õõëõgö×ö÷÷üöñö)÷Ñ÷ù—úŽü›þ”B|-hT30qò¨mŸè(M‹Ù3 ’ é > • ý † :  É ]“%ù  PŸcþ°ûÈù©ø1ø ø(øøª÷ÿö&öNõ˜ô%ôìóáóòóôáóóóˆòòëñ(òÈòÐóýô=öX÷MøùÊù ú¹û#ýáþÚø àM0 ‚ ] êcð»Ô(©+ • Þ  " 0 ; I W Z h { • ¿ ÷ = † Ï ñ Ê = " fc{Àýmû·ù©ø1øø9øAø%øÉ÷H÷³ö$ö®õ\õõÞôô"ô…óºòëñ)ñŸðbð{ðàðuñòÃòLóÐóIôòôÛõ&÷ÈøÇúýWÿ™¯xàð·Z ç ‡ @ & + 65Ûrã1awrlaXE ö¶_Êì£Ì _ i{ýïùo÷—õTô|óßòJòµñ ñQð¦ïï·îtîLî+î îÙíí3í×ì“ì…ìÀìPí(î2ïNðañXò%óÐóôbõ‘ö øúEü¡þñ Í!‹Éó#‚ ç Þ à Ï “ 9º3£ŒŸ?×[ÖD•ÓÈk§f¼¬Y Þ l5Rĉ˜ÿÍþ%þ…ýâü1üuû¥úÂùÃø§÷{ö5õïó¡ògñFðOïî î·í‹ífíJí%íóìÉì»ìèìlí`î±ïdñAó-õ÷©øýù÷ú¢û üoüåü›ý¡þôÿŽRÇB„ ˜ ‰ g 4 Åy ¿ÒÇTéFwo 1   Sp˜îƒyÿÍþvþXþ>þþ¸ý ý#üüú¦ùXø÷ ö-õsôÐó3ó¡ò ò¾ñ€ñdñuñ°ñòœò>óòóÂô°õ×ö(ø ùKû ýÖþ~Ýß…á%| üPä‡  E ½·´´Îø5WZ-Å3t – ¢ ˜ | <Ççƒ þ¹û¼ùUø“÷f÷¯÷1ø˜ø½ølø¡÷}ö$õËóªòÑñEñôðÄð‘ðQð ðÒïÂïæïVðñòó-ô5õ,ö&÷1øcùØú‹üþˆ>’oë,lå²Û C Á øks"²<ß ¡ f § ã Õ  ¸•´“øÒ ÿâü’útøÔöãõ®õöÒöŸ÷+ø?øÎ÷ñöØõÍôô£ó·ó%ô«ô*õmõjõ;õ õõvõKö‹÷ù¶ú&üGý þþýþÿs¸`@1ß Ò  æ ¶ ¼  î  ]5bFUi ¢  ¶ d ú > % ¾$% 2x¿ÿËþaý‰ûLùîö«ôÜòŸñ ññVñµñåñ¸ññ!ðïäíùìdì.ì?ì€ìÎìí[í§íîËîÇïñ¬òbôöª÷ûøú ûü.ý˜þQU’ã" ' Ì ä„³€u‚bî/,Þ¼®¨—m|·×ÿ@ ]J ­ Š ;d·þSüQú¯øS÷öÛô‚ó òxðäî`íìÏêéé;éÅèfè(èðçßçêç(è›èRéCê\ëwì…ínî5ï÷ï¾ð°ñíòô}öÅøTûþ¼D‰}( ü X ºd‘IÅ÷±;²¥mº d ! á ¬^ñLf8Æý'û|øÿõáóGò7ñ¹ð°ðîðEñˆñ”ñdññ»ðpð_ððüð°ñ…òqóWô@õ)ö÷å÷Èø±ùŒúTûÿûˆüýˆý(þÿr Ö­iá ú Ÿ Õ ¾ ~ H @ s ã x  ² (‚¯·“Oê t å S Ä N é š b ;  ½ + %œyåÿ.ü±ùÔ÷Æö—ö#÷+økù‰úNû‘û\ûÄúòùùGø²÷<÷Úöƒö2öàõšõgõYõvõ¹õöNömöaö/öüõùõNö+÷¦øÍúiý:â‰.EC`äòZH ‹§r³xdjj=Ò'LXl¸:ü¼e¿ÿ½þMý”ûÊù6ø1÷åöd÷ŠøúÄû&ýþý"þ›ý¤ü†û‰úÐùWù%ùùõøºøRøÑ÷a÷#÷?÷ª÷Xø%ùäùyúØúû/û”ûlüçýæÿPÞ< $ A „ 9ÇšúúSÔ" ÿ T = æ Œ T Q ‡ Ð ý ô ~ ¯ –a55kÓX½å³ÿDýgûÍùµøAø‚øAùIúEûîûü³ûæúçùêø1øÌ÷Ì÷øˆøõø0ù3ùþø¤øJøø øXøçøÂùÛú=üóýñÿMúѱ [ ˜¾€jÖ h ï  y ú H * ’ BÕeêÚÒ´ÿyþý­ûTú*ùJø½÷a÷÷°ö÷õÛôióÆñ$ðÐîøíÈíIîkïöð¤ò"ô=õàõöüõÛõÝõ,öÒö»÷ºø®ùyú û{ûÒû=üßüÀýòþQÏM¦ÍÉ­‹q b F ÿ x u ö ã c ŸãeRβíD“¦iß0ÿ˜þAþ;þ`þ¡þìþIÿ±ÿ/Çg€Æ­+KÞþ¸ýèü™üåüÃýýþQ†U¤rà#u éÿ\š³š\æÿŒo‹¤‡!ºý^ù ˆDýnqõ".gÿ }+ÔJc¡4}yéŽþG ˲/˜ÏÌéÿõþÆý7üLúøéõáóMò:ñ°ðŒð”ð”ð\ðÛïï-îXíÜìÆì íÎížîhï ð†ðñð^ñò.óÇôÏöùYûcýÿ'ë}Z ¾ è t € 7 × »  ¬ ˜˜jÛÍIv•â … œ £3~]º² S Ê  d£ËÒ«ÿcýñúˆøNö]ôóòòÃñóñqòó¯óô*ô ôºóXóóÎòÀòÙòó6ófó…ó£óÎóô’ô\õ_öƒ÷©ø®ù‡ú5ûÚû¤ü¸ý5ÿ/tã. _  o ‘ à ( × ´vúyq Á š Ë h W k ] õÇ`¸\_ÿ½þGþÎýý üãúkùó÷¶öÊõeõ‰õ)öH÷ÅøšúŸü½þ¾…íéj~/¦R¸7בa,ëñÿ0ÿ9þ ý¾ûbúùû÷)÷ªö™öëö…÷Døïøvù¿ùáùÞùÓùÞùú£úbûVüiývþ~ÿg:þË·ÅÛÒ…ÔÆlÒmÖ`ïkÃö5sÿÿÿ~ÿYP7ÎþËB¢!àæ!Çôÿ˜þ×üñú-ùÎ÷öö­öÌö÷S÷^÷&÷¸ö/ö¿õ‰õ³õKö1÷AøGùú¹ú)û{û×ûYü ýþWÿ§røAiáqIVwt- ’ ¦  L ; q é Y ñ :  g I ÔJîúyZn„WȲ@ ÿ þÆüæûpû7ûûàúsú¿ùÑøÚ÷÷gööÊõ¢õ~õ_õ_õ¼õÌöù€üHÝ™ Ìñ¤Ó…0ê%’áÖIJß   ”êOþ‘û ùåöYõ ôô*õ÷õÄöH÷J÷™ö5õ+óØðîŸìKë¥êÁê‰ëÉì6îŒïð1ñ^ñ1ñ»ð2ð¿ï~ï~ï±ï ððañlò½óNõ÷Èø‡úüwý|þFÿáÿjÿª}мg²Í ´ Q ‘ ! ‰ Ð  +S€Ç-´]á¡D»ü2bÿÓþþ¬þ-ÿæÿÄ™B§ª[Ï#‘=8¨”í’riO ô G 6·Ö˜ t ° ë  W ž ûq¤&obo¶ÿ“ýœüHü‘üiýŠþ¹ÿ«,@Öþèü•úøgõâòð¬î íÿëVëHë ìÈí«ð·ô¦ùýþXN × / ¨ ê^:{ïnÖ ÷ØÿÅþÜýþüüÐúWù»÷:ö õ|ô¿ôôõó÷púåüÓþýÿ@´ÿkþ§ü¶úïøŽ÷Áö€ö¨ö+÷â÷²øù0úÇúKû³ûöûùûÏû—ûgûpû¹ûgüwýõþÁ¡]Ç×–[|ˆ¤½í0 ‡ ‡  Ç x  o f Ú ¥ Ö ˆä+·ÿ¯ý=üYûéúÄú¶ú‡úúIù1ø×ögõôíòò‹ñKñHñ}ñðñ–ònóvô¨õ÷˜ø~ú²ü3ÿÒnÝ  ª (y¶×À`¡‚ lªæ=£3 { · Î÷LåÏYÊÿ;ÿ¡þíý.ý^üƒû³úäùùû÷ªöõ6ó1ñ'ï6í—ëTêyéýèËèéÈé{ëcî™òè÷Ùý´·7 ó â o  ƒ*i}B€íDR(Ôdü¢\/&\Ï“º5ñÃ_ ƒ  Ò ú © Hû—m]ÿUþMý:üûõùÑøÆ÷»ö¼õÐô ôófóºó„ôÇõo÷WùNû1ýÐþÁ#M1Ýa¼‡ÿ'ÿÿOÿÐÿ¢§Àܼ;C©yÆ·ÿ–ýŸû úù|øqø©øþø3ù"ù²øê÷àö¼õ¦ô¬óóò}òJòiòßòËóNõƒ÷~úþ± Ž tD3 =  ‹ à p&ƒ1øÚå ¥ ÉY5*% Ø®ÿÂþþâýûýGþ„þvþíýÚüYû®ùøÉöàõ_õ*õúô›ôÎówòðhîìáéèµæùåÒåjæóçÇê-ï@õ¸üòó ÎÙã ¥:G:_Ù½šu‹ÔX úŒ¹pÊäßÜ_ë~ïÆ ÿ © ¾c¿ÿÿûDøôñí êµæ„ãŒàÖÝuÛnÙÆ×ŽÖÉÕÕÖ4×çØ۴ݨàäãGç±êõíãðZó2õmö÷a÷…÷É÷OøùIúÄûýkÿlw„dçá $ £ zÝ8ÙþÉ´LARå9þwü ûúžù ù2úQûýŠÿ¡=' {AB ÉÕi‚új€î‰\¡”h3ô¦7 ž Ú¥·ÿ‡þ(þtþAÿTSöþa,£þýšûŒúìù¬ù¦ù•ù;ùføóöÞô9ò>ï&ì%édæìã°á•߯Ý<Ü™ÛlÜFßväÒë®ôÈý¼V ß s ²Â{þûýÐþ¢ãÔÒ ä 0(·r STSÖ—Ji ®ÄfÓŽ~á 5Aÿ±ùõ§ñeïþíùìöë¹ê6éwç³åä–â^ájà¨ß5ßßTßQàâäè7ìÊðxõÛù¡ý Ã««Lä¬á©í8 ‘ ¬/Ø~Ì ï Ýý”Êÿ›þçýiýöüMüNûìùø÷õ¡óVñsïZîkîàïÎò÷MüûX »ä»z€HMÏêhæ “‚V¶/ Â6´)Ñ + Þ}]ÿ˜þïþæÿñ€KF›þ¢ü•ú“ø‘öyôJòðøíìÄêQêéêuì‚î_ð\ññFïEìtè8äàzÜÍÙc؅آÚýÞ¥å0î¸÷ñ–¯ Þ`Ï  2àšÿ“þÅþïÿù±íg Ó Óf²Æ¿íÛ : £ ~ € òîŽ=í íå§üÿö‹ò„ï½í×ìaììîëì–ìtí îñï7ñ<òÙòóGóêó‰õnø™üŸ#‘ j;µä wr/ÅJÌ_Æ Æ 4  1 : ³ - g]RþÑø“ó-ïìNêé‡évéÙèwç5åMâßëÛQٽת×kÙ1ÝÔâôé òmúfG ¦uÞFE(0vôwºŠ·Oˆ€Sï³w| u<´þüú–øŸ÷âö4öjõTôõòSñŒï½í ìŒêŠé3éyéFê~ëÉìîúîï‡ïïDîPí^ìšëîêKê’é˜èaç#æ\åÚåcè…íYõ%ÿy ™æ,zà³ =z÷Ú _=øË#(˜*®+Ø+†++¿*Ø*h+_,ƒ-§.º/Ð0°1à1š0X-ë's :ß .<øÛïvéïäÚá¼ß>ÞÝÜÝÚvÙí×YÖ´ÔÜÒãÐÏýÍøÍCÏÉÑ=Õ;ÙiÝ:á_äÉæÐèôê¡íîð«ô˜øMüÿåwD¦ìIÏma&(uRþCû¡ø—ö/õ%ô.óëñ5ðîgë–èÚå˜ãRâºâYåTêañ±ùJ8 Ƕ÷1´î ä#Y'Ó*Ü-õ/¶00t.K,**<(†&Å$Ÿ"¿ÿ‘å˜* Ã?:@íþFÿàûø;ôÊðî[ìšë‘ëÒëèë¥ëë«ê—êë¶ëXì§ìdìxëýé"è/æ„äkãÜâÆâââ6ãìã†å²èîÁõÿÈ2˜êhúº äsÿ4ýý~¾ J^Eš Y"ù"#+#i#¯#“#™"  U”ëSV Ñ®dÿøýÿùö£îˆçÎá¬ÝüÚyÙ¬ØnØ´ØbÙNÚôÚÏڦٽןÕáÓâÒÓÄÔ+ØêÜMâ¡çaìuð ôa÷®úíý¶¬Í " È á ‡ è ¿qT L_ ÖAÿú¢õèñ¦î¢ëžèså6â!߈ÜëÚÄÚJÜšß„ä„êèðÏöšûÿl…: L?"P'Â*o,­,,m+F+æ+#-¯.ç/00/d,Ô(*%?" æ÷ Ö+q]y *Ž“þöû]ùKözòðíéäñàžÞ˜ÝºÝeÞïÞÈޯ݃ÛqØÕÔfÑ÷ÎÎÓΰÐíÒÿÔi×gÛ¡â?ížù< :Õ» V•ÿúÚöjö½øaýÀ HUr¯˜ÈLÆ ŽZ42{f?.j– φû‰õÄï8ê8å7áOÞHÜ&ÛÛÜIÞ=áOäÔæ‚èé]è»æÐä•ã$äç‘ì½ó—û3 *m kû"µ'/,´/Ø1‘2,2ï0þ.š,F*É(¡(´)C+Q,,õ)Ê%¬ó³=üó’ê ã–ÜÝ֖ѯÌcÈ/ÅAé˜Ã:ÆpÊÄÏ2ÕÕÙ#Ý0߉àâ¼ä"é¦ïå÷¿ Fqì5’à]R0ÜÇ]:Ømìî»z~¨N ‡ÿ˜ùìôëñpðýïàï„ï£îPíÁëKêAéÙè*éêë¾ë­ëæê±éièSçuæÌå:åä¬ã™âÌá âTäWéñ¼ú®M <Õ"×+ ›{·œô ë¯$€(Z*I*+)Ý'à&_&\&³&:'Ý'ž(‡)´*E,.£/ï/ö-()³!i½'úaòÎìeé–çç[ç(èáèÐèrç¨äÚàˆÜØúÓšÐÎÎ'Ï ÑÓÕöÖ8Ù&Üãߊä@êÝðÀ÷õýÔþð| A š Ñ ù¦ ©Ä=0*  ;_ü1øWôFðìóçFäzáà=àBâ°åê˜îzòõùõYõôkó˜ôDøXþ!‚ÏçArŒ»úÕoAz !¨ Dó¡´ì µ#,&€'ù&;$vq6× ×Äýß_ÿ—úõpï{êÁæeä>ãÜâ¬â6âEáàßFÞÑÜâÛŽÛ¸ÛÜÚÛîÚ"ÙëÖÕNÔñÔ+×àÚ)àÁæ©íóE÷AøŸö0óï™í{ï$ö ( b%Ç+í-—,3)Œ%û"B"[#]%='w(+)•)*ï*C,.˜/È/u-( úÞ ®ÿ®õòí é°æPæ9çÅèhê”ë³ëxê0è‰åhãUâqâžãƒårçºèçèèçÃæÙç¼êkï—õ§ü›n ‚ Ç¥„ÇĬտ~•ÿ UþþøÂôrñ›î°ë>èAäàBÜÛÙQÙÄÚáÝâÃæ&ë]îØï•ïnîÖíïËòÑøe‹ ©~äÕ‹/|ŒÎTx—'3 à¼kÖ#ã&Ì'K&­"ɽö2u¿Jç ¡ýd÷òOî:ì—ëÁëüë¨ë—ê édç7æÒåKæˆç0é«êEëjêøçWäKàËÜ’ÚãÙuÚÄÛ3Ý(Þ6Þ3ÝNÛáØ”Ö!ÕÕrÖ٠ݦãPíOùx·j[Î×i K"©$¢&<(*m,3/»1§35¿5á4ƒ1Q+#'¶ dÐYÈ $  xrüª÷“óHðµíœëéŽçåõãíâ¤âfã{åÎè€ìsïÇð@ðIî”ë é“ç×çê;îžóù–ýKë˜ÿÏüZù$ö¬óòôðÛïZî[ì ê¤çCåDãMâ-ã‰æaìô=üº• ¡ a:“VïØ ñ&,±/ô1X334U43·/Í*m%£ »‚¢À«l ] :Ú˜ { ­ ª T ©È~ûøKö öVö)öìôÀòïïªìéÁåãzá¹àxà\àKàxà)áqâ*äæ+èxêöì_ïrñçò‡ó óªñmïíSëšêÝêgëYëêSçã‡ß)ÜFÚWڲ܋á0é+óþJv_vB2 5!”"k$m&4(Å)~+¡-$0™2£46„6y5€2¸-—'Ð '> ¾ ö U /DCIÂD Xžý‚øpô†ñ ï;îöì”ëê©èrçoæuåAäËâ:á£ßÞŽÜjÛÛÚ,ÛwÜ ÞPá0äöæ|é—ëBíyî'ï*ïyîRí ìæêôééççæ©ãáßDÞß âõçèðBü`iür!þ#•$|$Ù$/&…(~+–.b1È3é5à7¬9W;å<Ô===k:s5õ.”'Û6K³ ë)Kª‡ æ Õ µFÿùô¦ïaì@êé3èGçÝåÞãŸá¥ßLÞÝ6ÝöÜœÜüÛÛIÚãÙWÚÜß ãªçgìàð©ôV÷–ø|øH÷mõRóoñðïOîtíìáéùæøã»áÿàJâèåùëLôõýan»º$§¯\!c$7'[)¹*Í+7-+/u1È3ì5­778¥6ƒ2a,2%û[»t æ A / è <`î ç †‰ûP÷3ô9ò ñ8ðŒïáî+îUí^ìrë£êÊéÓèÃçÒææŸågåYåƒåæçÖè$ëÃí_ðŽòäó"ô]óÉñ´ïií/ëAé¤ç:æ¿äËâ=àRÝ«ÚÙÙØxÚ3Þ~äXíÚ÷BÞ üÊ)ÎZj8¤"'&G)Ç+â-Þ/ô14÷5ñ6K6¬3L/¬)X#Ô³‰™  ò Œ ° &f­úÇ ª=ñûP÷Èó^ñÐï®îíPìÿê´é`èçîå'åÓä´ä|ää‚ã(ãOã"äå¸çjê–íÕð“óIõÒõ5õ¯óˆñ2ï+í¾ëÏêïé˜èdæ;ãsß¶ÛÙØ¤×±ØwÜJãßìè÷i¨ Ê€êVe y$è'R*±+ƒ,“-;/K1å23N1û-Â)%ép_µ ;    ­ ˜BiN(½ Ð÷ÿÁûžøÒö ö¥õõáó1ò2ðîìQêéJèè×ç^ç€æ~å®äOääšårç5êµíKñ*ô«õ¥õFôöñ0ïˆìbê½èPç—åã«ßuÛ^×kÔnÓ•ÔØÖÝ1æð~û'\ æR©Ð”bà!I%×'½)†+Ÿ-0j2‚4ã5Û5í30*3$Ÿl?tr ˆ £×ìÄ”9¼ ØÿTûê÷{õ²ó4òÏðyïîªìëeéˆçŸåÞãwâaá”àúߨßÐß—àâOä çêPíKð}òfóÜòñLîQë´èèææ°åFåä°á(Þ2ÚÝÖ:ÕüÕ©ÙŒàmêôõÐ >¾a“Å7u"a(Ò,y/¿0€1o2Æ3ú4A5R4^2±/S,(×"üó"j µ±>uè? $sÿû*ù¯÷¥öFõJóæðtîìééèÉæ=æ&æ,æîåKåvä·ãLãOãÍãÿä+çWêî­ñOô_õôBòòîjë‚è—æ‰å¿ä|ãHáÞ†Ú}×ñÕaÖøØçÝsåLï2úF þ¿E0æcJ#Ý&“)e+ë,².ã0(335¼6E7$63ó-ˆ'j ](F Ê ª *øÄƒÇÉ, àÐÿ ú¨öÓóÔñðvîÃì ëAé…ç÷å˜äXã6âPá¥àà¶ßsßb߹߰àlâìäè­ë$ïùñŠó¬óòxðîåëCêIéºèûçzæÓã2àPÜ]ÙDؕ٦ݹäIîù0Û njÏGu—Ï!Ì'ƒ,/V1ƒ2¯3ê4Å5£5A4Õ1ä.’+­'.#M|*ö’m–’æS( L9ý¥ûú8ùS÷õˆòÛïðìêtç¥å¹äbäZäpääÓäKåÝåzæUçÅèñêíðòÔò1ò/ðJí=êËçEæ{åÓäžãMáÓÝšÙ€Õ‚ÒfѲҟÖMÝSæ¥ð¿ú Ôr Þ@‚ç%i#Ý'ô*³,œ-…. 0&245Z4=2 /+K&Ä Ó8«µ Ñ %4÷O ¹' ’pÿEûJø=öôÔò¥ðLî ìêŠè7ç1æåmå_å2å«äÙãã§âßâÙã¾åžèXìQð½óëõ‘öÍõøó¾ñÇïhî›íêìÆë£é:æ¾áÝ5Ù‚×£ØþÜäžîù]~ |Åpä‡M7i…#^(~+ -è-[.^.u-Y+}(%×" à ·-ü øŠ G öú4P‰3ž‡ éµ'®ÿWÿ|þýûÑøãõcòÞîîëôéêèqè6èèè èíç¸çžçèŠéÆëîBñAóøóûòmðßìR锿åvää6ã?áÞæÙƒÕÒ‘ÐøÑ™ÖZÞOèËòèûE’‘³u* h«“m%*‰,[-¡-A.¦/x1â23°1Ù.Ð*Ð% ÙûD† K ]Ìs&ø‘9¦« M’ÿÔý™üQûùööòóØð î¢ë•éóç§æ³åñä0äGã.â árà\àààâ8äMçÿêŠî)ñGòÌñ ðºíŸë$ê]éïèJèÁæõãàÒÛZØâÖ%Ø“ÜäÑí1øEŸô î ³ ¹ S B,øA$û(î+z-P.ç./+. ,) &9#h G·¼”¬ Ò Ù 2 |u¥rö <9—vÿ0ÿÖþÆýüõùÆ÷eõÔòjðîcíÑì€ì4ìÕëjëúêêêééNê¢ëÙí‰ðó›ô¿ô9ó8ðƒìûèdæ å•ä>ä>ãÿàqÝÙ¼Ô–Ñ­ÐÀÒû×àýéçóÿû43Z¡qF½*&+–.0ñ0Ï1346Û6¶6>5?2»-ö'u! ±ƒ1kÒOºÚçc €–ÿœüìúcùz÷õXò’ï íñêRé+èPçŸæôå:å0äÈâ á~ß;Þ›ÝÜÝ2ß}á;ä°æ<èXèüæsädá˜Þ¯ÜÔÛÄÛëÛªÛ¹ÚLÙØt×6Ø«Ú@ß7æ'ïÅøB?_ _ K ~ M †Íë&/,I/Â0r1Ø1î1_10.ú+Å)/' $e Y é¹Ýº ]Â#ì¢Ú ?ž™!{µ|ÿ#ýTú+÷ïóñ"ïîµí™í‚í^í#íèì¸ì¤ìÆìXíîxðµò®ôÛõÊõLôœñ`îoësénèètçæ„ã¨ßÛ¾ÖÞÓ’Ó¢ÖÝãå¨ï…øìþ&œ^iržÒ$()™'‡$î A}Î\!ß#ú$Ü#_ >Wß “ë~‚g¤…n :•Åþ³•ÿˆü©øCôæïPìÓéè.èUè¬èé-éÈèßç¢æååpå—æcèbêîëzì¥ësélæXãåàbßÞÞMÝÜ!Úó×!ÖHÕÖúØsÞræ,ðýùGëÛ Õ ñ } ´JøŽ!r(–-Í0™2™3ø3“3:20‹-+t({%"+%$§s'ÝÈ–§uÜ(âÙ%þêý•þ5ÿÿ%þMü·ù‰öGó«ðï¦îÞîkïðgðŒðdð ð®ï ï:ð”ñ‚ó õ[÷%ø–÷”õzòòîÉëyéè&ç!æyäíáÞÊÚl×jÕ—ÕØ(Þ—å¤íÅôÛù€ü1ýý™ý¿ÿs ÐQ ½$Á&j&$  v|õQϪP‚H/7á&ïYÝt~ÍS Àr@•ûø:qþ£úöˆñ¯íëäééé¶êÌëµìóìMììêDéÑçîæÏæˆçé¿êì:ìëíèKæõã^âœádáPáÕàßnÝàÚÈØ%ØÓÙFÞuå£îfø dÿ : ü ƒ # ȯ'Ò ~&˜*<-Å.’/£/â.E-!+½( &Î"ï,üwE  À ÍíØÛçe¹ S÷™üúùsúÚûóüDýÃü\ûùYö˜óxñNð÷ïðrðÏðñ4ññæðÊðñò|ó'õŽö<÷Äöõ òkîÕêûç&æåOä ãåà½ÝòÙ/Ö|ÓÃÒÄÔ«Ùá•éÏñ<øüUý ýÉü²ý¼'} ±X4#”&a'ú%+#õ[,x­ÑÔ— è±ã¤‡œÛ Idq0h¸ \  ?  Õ nû¢öò£î“ìÚëì“ì+í–í·í™íwízíêíïîð[òøó›ôáó³ñ]îêÃæ©ãPá‡ßøÝEÜCÚÙ×'Õ^ÒüϼÎÏ0ÓÇÙ¤â:ìÅôéú(þÿçþ5ÿSÿ v–$r(ì*,/,+6*Ñ(×'H'¢&2%¤"•îè ¼—Ë~ÌÖ· ¤±ÿ¬ýqý6þ-ÿ¼ÿ®ÿáþ?ý÷úwø_öõ±ô¼ôÞôéôØô®ônô-ô'ô•ôõ÷²ø>ú@ûQûúœ÷ô,ð‹ìÊéóçµæƒåäã–á’Þ=ÛLؤÖ+×jÚKàðçôïªöÞúEüƒûçù ù0ú þ|œ B!Ã"¶!¯Ê&¿ûº$,‰óø ¬ ¹þXM€!." ’k- ãÛ¨B ž íñÿÞú,öŽòQðmïïCðñ»ñ×ñoñÒðjðŒðVñµòhô/öˆ÷þ÷&÷ÊôHñUí´éàææäkãâCàíÝÛÎרÔDÒoÑÓl×`Þþæ´ï÷&ü±þ~ÿæÿH 2 r%ò%J(*«*A*ó(K'ñ%%„$À#z"¥ R¢ß¾ /´dø¯bHÉs !áÿƒüûìúüúšúžù+øaöhôòöð ðÒïð{ðñµñªòËóéôîõåöû÷3ù~úÇûÉü[ý1ýüú“÷òôÈòBñ=ð;ïÜíèëLé:æãšà߀àäãWéÇïØõWú­üý=übû~ûBýãÇ /;K15À ¿ á ù J 0Aw & Í * é w ­Ç I °»4= ²üÒu Î\–¹ÿVû&÷áóâñ&ñKñÉñòßñ!ñúïÈîòíÙí¿îuðˆòZô8õ©ôòOï~ëÎçÕäêâðáSáxà÷ÞËÜ*Ú“×”ÕéÔ[ÖmÚöàéYñ?øÔü*ÿÌ‹CV LÚR$©)¸,..µ.ò.I//„/È.-L*Œ&i"céca&]+Wì|ÿ«ÙrUýúùøóö¿õôµñïiì@êÎè+è3è“èäèééIé¿éÇêƒìýîóñõ ø‡úEüýÆü\ûùö ó¢ðÓîží¡ì{ëÐéŽçïätâ¨à7à”áãäÖéïÛô›ø8úõùÅøÚ÷cøûÂÿÿÌ #Ï·cš1¶S¶77\´¡ ¾ ¶  4 Ò2A&z&e…"ÏS r  Ì $ Ð ²Í^Ùý¼úRø¸öÍõbõõ£ôÖóºò”ñ¹ðjðÊðÏñ>óÊôöªöKö÷ôó ñOïäí‘ìôê¡èeåaáöÜËØ¢ÕCÔ2ÕØ ÞÅäšëSñ'õ×öîöªöH÷´ù>þ‡¼ å%åã K"”"o"r"#$A%á%b%–#¼ r|œS½{¿ƒ"Ë#è"ÐØ¼L[|Ùýrü:û£ùr÷´ô»ñïíÿë¥ë­ë»ëŸëYëë,ëÉëí;ïöñæô–÷›ùšúyúOùo÷;õó#ñÊï÷îkîÓíâìNë鉿ä`âíá%ã:æëÏðŸöVû-þÿ“þ½ý¤ýÿwP× æðþQŠb“ ° Þ Þ  Í Ö 6N˜¬$Þ £lâž‘[´a õ íor¦ÿHü*úùçø¬ùÐú×ûMüüñúOùd÷’õ3ô•óÖóÛôdöè÷øøLùÃøƒ÷ÏõôŽòˆñàð8ðáîgì¤èçãýÞÛÚØêØ1Ü âbéØð÷ûëüýƒüœüAþÔ^ –Üœ¬L¡›`é ¸"$D$Ý" ”>ÿgù‚ñ!ä#›#æ Ø>- R÷ïþªýoü¥úøØôVñþíEë‡é é•é«ê¨ë#ììuëÛê±ê€ëtíƒð5ôÑ÷úÕûjûsùröó,ð9îtííííËíÆìÍêèKå+ã‚âÛãtçþì£ó*úeÿ“˜þÌ,! ýÛ’rJMý0öƒ¥¼> 6 uIA·Þt Ë ñò7¶È+ Ð Öi,„ Õÿ=üø'õzòÝð~ðPñó;õB÷¤øGùDùùÙøùÓùÊúšûñûŽûjú›ø}ö„ôófòoòËòêò6òjðˆíìégæäãUãWåê”ðÆ÷þXS$Lþ þ%¦ Z)G¸*»SŠÇév‘ó « ·Àé Ó¬[³öñõ±÷‘ sÀr5ÿ¸ü¬ùYö+óð"ï ïFðaòÂôâöcø*ùAùçø‚ø`ø¡ø>ùú¼ú ûÄú¼ùø÷õõóò³ñoñ:ñ‘ðï€ìûèØäÄà˜ÝfÜßÝ+â©è$ð÷4üºþáþˆý ü¹ûý­o¡ Ú6KÍÙû Lß ¹ êÖ±c >(üóÈÌqs‰ cN;´öhþVû+øIõ ó¾ñxñ1òºóàõ.ø8úÁû§üý4ýRý–ýøýUþ`þçý¸üôúÎø°ö÷ôÙóOó+óðò.ò—ðîëøçŒå’ä«å3éÍî{õÏûu×ü¹uùsh á¿]¯†ˆ~î Æ    õ ò‘‘l6c ˆþ€˜ü l†›“aFþ4üsùŽöçóÚñ‰ð ðTð}ñ…ó:ö-ùëûþ•ÿ~ùBr{B‘Lÿ}ýTû(ùV÷öQõÊô"ôêòàðî®êaçÇä‚ãäÏæ{ëlño÷SüWÿp;ÿçþáÿˆ­‘ 2¬hQ¯ 8  ± N $ ò ûÄ nvP‘ pÅ”P >—â Å ¤oÒ87Šÿ=üÃø{õÔòñCðFðñ“ò¿ôJ÷ÊùôûªýäþÅÿ_¹®/ÿzýdû ùÝö$õýóRóÙò9ò#ñkï í@ê}çjå˜äƒåcèþìºòŠøRýbŸ€éÝ1@Ð 'G[ÅbpwÀ1‹†jÈ! ( —à' ­òq(jÏ òxÎÿÍÿ½þaý†û"ù_öfóŒð3î™ì¾ëƒëªëXìÈí,ðLó­öÖùˆü©þ*ù,Êïÿ£þèüæúßø<÷4ö®õKõôió”ñ2ïwìÓé½çÃæ^ç«éí‹òÑ÷wüÍÿ‘)™óñ v¯Ú}z®Ê]õ [õ +H Ù wØš Ü ¢`Ö­•/  ¥é´)8ÿÌü÷ùîöô}ñ®ï£îîßíâínîÐï+ò/õqø—ûXþ–Ul0þ üÍùÑ÷\ömõ¹ôÐótò‰ð>îÏë é è½çÖèoëLïïóµøóü8Jf ï»Â × rÄ'&œ³Þ‹Czlü»4> È r  à „u.ƒ£î Ó Á ×GþKüúù<÷Fô?ñeîöë5ê(é´è“è˜èÖè©éaëî}ñ-õ·øÄûþÿôÿ’ÿ•þ ýuû´ù øñö4ö¹õõÎóùñ¶ïfíjëêäé ë¬í}ñîõLúõý?3IƒÕ wl>{$c»Åøº  ¸  ï > BsLFš(d …Äœ÷ N O ‘vþâÇQÿ^ý÷ú1øIõ…ò'ðZî1ízìì°ë€ëÚë íyïÑò¶ö¼úkþS+Ñf&\UþMü•úLùøð÷+÷ØõÈó1ñvî ìhêúéë…í,ñYõ]ù¾üLÿ&ŽïÇ^¾ ¦–ñ<0Ö[2Ó»2FºD o ô D ÎëÝΘ Ï Ü *n¡ù Í iêóþ¹û%ùjö©óñ´îÃìKëQê·éTéýèºèÀèqé2ëîþñdö¹útþ!‹Ãþ—êþ1ýŸû_úkù©øÎ÷xö~ôüñ_ï3íîëöë|íð«ôLùý¥z0ná-²u ®Àu€Ûê1IÉ'²3B ¥ „ ?L%;Yï V ç Af ” O ©–¥{ìþßübúœ÷¿ôòÇïîùìBìÌë_ëìê”ê¹êÌëî¥ñùõvúnþjOo¾½þÃüûÖùøøGøz÷,ö0ôxñ‡îãë5êúé\ëRîqòÿöû(þïÿÁ@Ÿ¨ e%+Þñj¬?ºœ/YÂêo N ߆Ås…H ² 0„´ Ð ˆŒÖG¥šÿýúùöäóñ·îÑìmëjê«éýèAèwçÔæŸæBçé<ìuð8õÅù}ýôÿ ãÓÿAþ–üûúùùcø…÷!öô”ñÞî…ì)ë=ëûìNðÐô¿ù-þNåOAòÌ $Q´¤Ã غ{Ã÷$é«äl _ % E'.3 Œ ˆ ˜t7 2 ߸ýJ™ƒÊÿiý‰úd÷Côlñïníoìåë†ëëêéénéé”êí¹ð8õ¿ù…ýPP_áþ?ýÚûÕú$úùÎø–÷¼õ6ó@ðfíaëÒêìçîóß÷Yü¿ÿµržVx s .žM— ^…œ,¦i ¶ #2W¼P± : 0·[ m ] §{ØmÂf/9þæúƒ÷Zô™ñkïÎí§ìÆëîêêéAè»çÉçÂèÿêîó¡÷ûnþúÿYáÿòþäýýƒü#ü­ûØúcù7÷`ô#ñîìuëÆìéïeôhùþ\þw&¿* «e`Ñ`õëç¥ß4ñ¥ÂŒ ܃Öì’ » × “   è|½×‰P¥0ÿåüòù­ötó‘ðLîÃìëë‘ëmë5ëÇê5ê®ékéäé{ëtîwòóöû>þ*æ«éÿúþAþÎýý9ý†ü:û(ùYöóÄïRíoìí¨ðFõ—úÿUT¨qú#ñ æ@¸¦± N+eiMÉKC]¾ ßaÖ›³Ôh – µ c Á 3 Q¯»—$éÿZÿþÿûIù@ö3ómð"îrìCësê¼éïèèçaææræßçšê‚îóf÷ñú^ýžþìþ•þþ}ý1ýýöürüQû|ùóöòóèð„îzíUî,ñ—õÂú¨ÿc_š«¯Â¥k ˜G|dkkˆZ¾ˆ\mm¨h8 > r\„ù„ ë i z  ’ ¢íùüÕ÷¼•ÿ[ý8úŽöÜò‰ïåì$ëFê êê!êæéqéÐèMè6èýèë‡îçòa÷)ûºýÿ8ÿËþþ¡ýtý…ýý#ýü úS÷ôÚðGî íËíŸð!õú ÿŠ«úõ¥; <Ãܸ֡줕S¢h®š §é y»¯ l +i oWÏAÿÐþGþ(ýEûºøÒõåò:ð î…ì”ë ë«ê'êséè§çóæ­æ+çÐè¾ë¦ïÖó…÷ú{ûÚû¥ûKûû/ûrû¥ûgû~úÀøNöZóNðÃíoìèìmï½óùRþz愦O ë× ‹}I! ”L¯zJ‘woFN 6 ­e¥d Ý Ùvy/ " ì(BWéÿ5ÿªý7û ø¿ôlñ˜îwì,ë‰êIêêéáèèiçùæ)çcèãêîòVö0ùÞúuûVûéú’úúéú_ûŽûû›ùa÷ô‹ñòî|íÎí5ðnô±ùÿMúão{$NU í Gt}ße+a@ß‘/7ã±… « Η’ã• S Oê ñ  2¬èÿ:Aÿfý¹ú…÷>ô7ñËî#í<ìîëÏë‘ëë/ê>éXè»çªçtèeêqí1ñäôö÷úû€û—û¶ûü°üJý‹ýý¹û„ùÆöáódñúïFðˆò‘ö«ûÊég[$†_ z ÀûN ]40 n×<7 $;ˆ †jÄ- è •Ô 2 HE°·ÿøþóýaü0ú€÷•ô»ñ8ïBíåë ë~êïéAénè§çç­æÉæ–çZéì„ïóÝõÆ÷Àøù3ùkùýùàúÝû‹ü}üƒû©ù4÷’ôEòëð)ñXóV÷uüªî¡¦ U wû¢ áúú C!T ÷ÁO€1»šÏ âdéÂéZ # Ï , _ åˆsÿ-þ‚ýˆüÿúÑø&ö9ó_ðÎíÌë{êÓé¦é˜ésé%é²è>èåçÉç.èWéuëUî}ñZôƒöß÷›øùŠùFú:û=üâüßüôû$ú²÷ õžòññûòÄöÕû/ÁÅ á  “A Ÿ kOd ñ C G”µK£ÈU¯KòÚ ØD6 Ò ü ª  Å –ñÿáþqýuûáøöóðhîèìùëdëñêbêécè1ç#æxåeå æ¡ç'êcíÒðÂóÇõÆö ÷ ÷:÷ß÷þøTúpûÕû2û•ùJ÷Ðô¸ò”ñâñô×÷×üxW m 2 h  $ þ xñdÒ …#D$+#£ JËÄ´ž%¡ƒ„Ý }àxEðá _ Ò  ( ­­Íÿnþtý™ürû¿ùi÷ôŸñÈî[ì~ê>é‡è(èåç“çBç çùæçˆçJè é¥ëIîñ‡ó8õöuöÆöi÷›ø;úôû?ý²ýý5û›ø®õûò!ñ³ð ògõúÿ¤ÏPR–ÑA [z§ð©š Ö¸ÞâW›»J»~Up P±"ýC™O § ð å ¢ ~ ¹ÅUHCúþ+ýÊúø÷õ1òÒïîöìSìöëƒëÁê¿éŠèiçœæHæ”æžç‡é)ìïÚñÎóØô'õõ*õ¢õ—ö×÷òø|ù ù‘÷Iõµò\ðéîìîÇðyô‡ùÿäHí wðƒ Ê8Çy…"–#Æ"m .±ŸqA²:/ZÆ ì ^®'Ûƒ‚  ¹  f n5êþ þXýrüüúáøHönó­ðOî}ì=ëvêýéééGè…çþæâæ[çcèêiì*ïöñOôÊõoö‹öŽöåö×÷Wù!û²ü‚ý9ý»ûWù‹öòó ò¥ñÜòÒõ$úøþRmþ6Ì¢™' >DU€ ú ! þy©²JÔÇÜ4 L É=ôüûQ 4 ƒ Ê M«O‰pÛÿpÿ½þXý2ûqøgõòðhîqíí ííì}ìªë‰êbéwèøçèçè’êíìŒïèñwó"ôôêóôÅôEö6øúYûuûQú øeõÆòñððâñ-õäùÿÑ)Åä4²M£ ½ ©‚Ï!+#œ"‰ “nµÐÐ`õ/˜°  Vݪt š S l ¢  'wYØÿçþ(þ9ýÉû¦ùóöòóñnîwì/ëpêê éé6è.ç)æ_ååxå­æÅè—ë®îzñtókôôZôOôôôgöwø£úEüèüEü~úþ÷bõ]ó¬òºó­öû×Z f ¡½@ •Ê•§"µ#Ì"W ˜³¿Èw6uÍOj έ™Š Ú Ë ©0a £ ­ýùÁ2æÿhÿLþ^ü©ù€öRó‘ðŠîJí¸ì…ìaìüë:ëêêèÜç<ç?çøç|é­ë0îrðüñ“òqò òèñtòÐóÏõê÷ùúeùœ÷5õ½òÝðFðlñ~ôùnþ` „  …çÞ Šþåj!##ó"2!cF…”L"vó‰¡ Ð Èóq ß Ù‡ë Q BIÄìÿ¯þÃýÑüuûsùÒöÀó¨ðííÆë_ê«é`éAé é–èÙç󿿉åƒå7æ¸ç÷é§ì8ï!ñò?òþñ×ñUò•óxõŽ÷>ù÷ùŠùø ö ôœòXò¦ó°öû!´£ ± Åâ ø É ¸Ñx!.#ß"Õ ª'ÿ·iÔl”ô Ä +_Ä€J € ˆ < ¨  R•ÿ´þ-þýwü£úøõëñïóì”ëôêÛêëëÍê;êné›è èè¬è*ê[ìïî=ñËòXóóaòåñò(óéôöö·ø¦ùùJø\ö8ô…òåñÜòõÙùÐþEv $ Ó W ± † ßÀú }","m ÉØ<_W燵±Ô  öMžh ü Ñ ‹ / ø\Ë™ãÿ˜þzý7üšú‚øöLó«ð`î§ì‘ëëÊê«êvêê`é¬èè¸çÜçžèê<ìËî7ñóòó ô´ókó£ó•ô/öø±ùú@úøø÷õyó óôâöûéÿ`²f › ç4^" ¡ zßÒp <"#"Z };K*øz(uüË7  o• ” ^ Rg ä ë¸çþþ4ýëûýùr÷„ôŽñÛî¾ìYë ê_êWêCêôéWéè×ç^çXçêç>é=ë¡í÷ï§ñtòwòòÑñ(òRó/õ[÷Gù\úWúDùz÷õõókó`ô ÷,û 9Z  L „  ;¬™j "ñ!8 wTrN cꨅ ¦ è7ªû± =  à d D ¾I+†Aÿ(þëü\û`ù÷ôöñ¹ïíí­ìëë†ëKëë”ê÷éFé›è èè´è÷éñëLîšðaòZó‡óAóþò(ó ô’õf÷ûøÙùÈùËø1÷mõ ô›ó•ô#÷ûŠÿÜ) › I äD wM± ƒ"w"Í áûÐ’ ÎA‹  I t·Û s â µ w 4 $ œÜ¹ÿžþoýöûú¸÷!õòð6îêì,ìÒë¨ëmë ësê«éõèièGèÀèòé×ë(îdðòõòóÆòò¯ò˜ó$õîötø6ùþøÜ÷ö"ôˆòíñ½ò8õùžý šÚµ¡`Ãs – ë¶,j — Lö-Ž’Z·G‹7Aö Õ c í Õ Ž äÀ š 3 ¸q‹÷Šÿþ[ü@úÔ÷;õ§òQðhîûììrëúê{êáé"é[è¤ççðæGçUèêVì•îdðuñÉñ§ñ€ñ»ñžò%ôîõ€÷Xø3ø+÷šõçóªòlò¡ógöjúïþ%Q µˆc  £?.ެ'!Þ P<rsiö“†´f  + B[W ¿ Æ ­ ³  蹯ëu ÿ–ýãûÛù“÷*õÎò³ðïÑí í‹ì,ìÉëYë¿êêbéÐè‡èÀè©é@ë`í’ïVñlòÈò¸òžòÜòºó*õÚöUøùùø¶ö'õúó·óÇôV÷!ûvÿ…šl Ô™ Ø û &³ÓÔ`c Ç+»Ð¡øz¾{¬† y íM¡È H ¢ c B B Œ tHF€ù~ÿÜýüûÓùt÷õ¡òðäî²íêìaìãëdëÄêêyéíèŠèwèÓè¿éNëMíOïæðÑñòùñèñ<ò3ó¿ô€öð÷¤ø[ø4÷‰õÅó}ò<òfó)ö@úçþ9uDÀq.ÈÇ >ÚÁ3± áPqÉäÙ|[û_G7 š Û  ÷ 1 < ¤ 4 ë ¾s`Ÿ±þ.ýjû`ù ÷ÅôqòKð„î9íXìÄëYë÷êêêé%éÎè¯èéìé{ë…íïgñòó+ó6ó“óŒôöÌ÷Aùòù¼ù¦ø ÷gõ5ôúó$õÎ÷°û!>S Š D ž Œ çGëñ½÷•ßY¡7„¸Ïõµ ‡ Ü  Z ” B , 8 ž ²¶Ù.¹LÿÃýùûõù½÷jõ+óñvï>îqíèì}ì ì€ëìêTêÞé‡éqé®épê¾ë‚ímïñBòÙò ó0ó•ó|ôàõw÷Îøqù3ùø†öéôÀóŠó¼ôd÷=ûšÿ¤ŸD¯c+ÿ 0­dƒ`®hÜ{ÜŒÖä|?û!(= ¼  '  P l ß ‹ ^ ˜ wHFˆ±ÿAþ–üšúcø ö¯ózñŒïîêììmëàêQêÍéZéøè²èè´èRé†ê1ìî¿ïüð³ñòUòâòçógõ÷“ø`ùLùtø÷¥õôZômõÚ÷gûsÿ3¤(ù²¹ ^ãÂf|PÞHizùœüÞDd L ºí¿ Û ¾ # Ï Ç A w±™S¡þûüûÙø—önô}òØð‡ïŠîÎí1íŸììmëæê„êCê2êjêëBìËíkïÄð­ñ&òcòºòcóŠôöÀ÷ ù„ùùö÷_öÍô·óó©ô÷’úvþÅKÇ­¸‘±  aÄ‚ÿŽýÃ{#o#ågeÖ @ é I n ; Y N µ g T ´ Ñãlî~ÿþVüpú[ø:ö'ô?ò‘ð2ïî1íwìÒëCë¼êTêêòé÷éCêôê,ìÓí’ïñ ò‹ò¸òÔò6ó"ô„õ#÷Šø>ùù9øîö¨õÊôÍôüõnøÚûÿšÿgMY9] Æ {;³œù:Ôbcd”Áb™ ¨ é ½U½© ¿ ƒ ¢  ç PŒÖMó¾ÿþaüjú?øöÖóßñ@ðýîþí+ígìªë÷ê\êäé›éé›éêÍêìí"ïpðSñÏñòzò3ónôöÌ÷%ùÂù‡ùø:÷ãõõ÷ô!ö–øüÞÿcÿoÑ¢–^] ¡ Äý‡ÕœüOÛåHü¥üØJ™   º  ô à x r ¹ m ºùLËw&Åÿ3þdüQú øëõÓóüñuð5ï3îJílì‘ëÁêêné éïèé„éIê~ëíÐîgð¥ñwòówóôõ}öø÷6ùäùÓùùø÷Vöxöµ÷úXýãm­ð(- m Öû/®öµü*Æg‚^åΟÍ"9 { > ¿ Ê ¹ d x Ê y º¾Ø‰ºþ9ý†û˜ù–÷’õžóðñð_ïyîžíÀìÝëÿê;ê é;éé"éŠéTê”ë%íÐîHðYñþñ^òÃò|ó·ôVöø’ùTúIú‡ù]ø<÷‘öÁöø‰úÈýE`¢×(ðô 3,7£Û—æ%ÑÅ­1ñ—ঠS á ú Ð ] Q N â Ý  ¼ ðÿ$…Õ„ÿ þ[üyúqøaöpôÃòdñHðQïhîníiìgësê®é"éßèíèLéêYëùì±î=ðoñ<òºò9óúó$õ¨öAø’ùCú;ú ù½øó÷Ž÷ê÷;ùƒûvþ”F$ 7gì i€€Â¹=Yt ª_Á†KÇÎf Ì W L ä( Û « 2 8 ` Ñnå‹T%ÿÙýaü¥úÈø×öúôGóíñæð ðFï„îµíÚìì_ëÛêŒêpê®êVëƒìîÐïdñ“òUóÅó*ôÓôéõd÷ûøFú÷úàú5ú3ùJø×÷3ø£ùü5ÿr; (íóÑÛ ëÒ~˜¡!µÝÇbW;ÂÅ^ Á C 9 Ü0 õ Í V N U §ÊûdÿÊÿ˜þMýÒûú<øHöhô¸òSñFðkï©îäííBì€ëÒê=êÞé±éØéhê{ëöì©îFð–ñ‚òó·ó•ôÝõz÷3ù—úVûYûÂúÙùù¡øùúâüÕÿß_ëƒi&Mc  å »~eÍä¨`¢'ìh`â 2 ± §R· 2 b ì ç i¨Û0¸pFÿþÉüEûyùƒ÷{õžó òÇðÂïäîîJí}ì°ëñêIêÈé„ééêëŸìeîðrñMòÈò"óžóvô¹õ ÷]ø%ùWùùø+ø3øíøvúÔü¹ÿ¤Ç‘²ŸÜê .×mPÜ#é²ñæ{Y5Åá¡ , Ð Û Š Ð ~ / g ¦ f Ú!yí‹Fòþ‚ýãûú%øö"ôcòñÿï*ïcî‹í­ìÆëîê'êéýè·èºè0é*ê”ëGíïîKð:ñÏñEòßòÜó;õ»öøÜøùËøMøê÷ø÷Ëøú(ý59šœ}Bƒ¯ R ǤW«Âö¹˜üÍÛÊbvx é Å O ’ Q , ¾ Ç $ õ Rx˜âj$ýþËý}üüúDùP÷@õDó–ñCð;ïkî›íÌìùëë2êRé–èèíçJè>é¿ê¤ìî=ðˆñoò(óòóõNö¯÷áø£ùçù´ùWùùIù8úüþo(C‘ 1Ã2 ” ¹?€ „ÊòG:DÆå€\{~+» s š ] « H Ú  ¾ ã ‡ ÎôiéŠÿ-þÉüNû´ùð÷ö*ôaòàð®ï´îßííSìŽëÝê5êé%éÙèÖè>é'ê—ëMí ï†ð”ñ?òÑòŠó£ôöœ÷òøÙù>ú;úúúùNúCûýsÿMVÖ’ È é p ¶ Ô ³ßÕFTRœ‰Š«~@¿á¯ N ú ç L 3 v Ë é   íÔmÖ3œ!ÍþˆýKüÿú¦ù9ø­öõyóòÄðÄïõîDîžííˆìÿë\ë³êê¹éÓéxêÁëwí]ï&ñžòºóô{õ‰öÆ÷ ùú¼úñúÒú—ú„úæúôûÆý:âL û66ê ( eËÇäìÖÈ ;[³m:Äᣠ8 W  W á W h ò ø‘æiÝ„ÿOþ#ýãû„úù‹÷ëõFô²òSñ/ðCïqî§íâì,ìŒëüêvê êÊéÍé*êëSìûíÂïañ§ò˜ópô_õ—ö øùÐú¨ûüüü,ü¸üâý®ÿðb‘?3 ’ ¬ ì ¶ P ©€eã‹(À}±µñ¿8Â3f ^ : " ; ·¬øk · ¦  ÒWÖf Óÿ£þ}ý?üéúùö÷döÇôOóüñæðÿï;ï„îßíRíÔìdìñë{ëë«êšêÿêñëcíïÇð?òqóvô~õ¥öÚ÷ ùú¶úû=ûgûÌû‘üêýÕÿ&|x×|›ÔÈ š 3HZæ™6ȆÄõi\ÍŒWï0¾ d C Z Š Û Â  ÌC’çdòþíýëüÇû~úù^÷¢õêóXòñïïïZî¬í ídìÉë&ëêæéné-éOéôé)ëÌì˜îKð³ñÈò¬ó•ô¶õÿöXø‡ùbúæú'û\ûÁû‹üÜýÅÿ `_Àt§·  Ì UB%‰œ(ñFIÂ0ic :  ì + Ü f Ù  ¿ í¢ R§/÷ÿõþþ1ý=üûáùwøüö~õôóòëñÿðð0ïOîzíÃì&ìŸë,ëÍê”êŒêãêªëÑì(îsïðuñEò3óRô¢õÿö<ø6ùÞùCúšúûüýŒÿÔ Øÿƒ–µG¦ è ÙdÃõ&šÅ×: Äû¸ € $ , ‘ ù  ¾ ¼ A o´#ÝÅÿÈþ²ýuüûOù€÷¥õäófò/ñ=ðsï·îõí(íHìjë‰ê¿éé“èJècèøèê‘ë9íÈîð#ñüñÎòËóúôEö}÷ˆøRùú¼ú³ûýÖþ kšV`Ñâ ˜ é ÖÚ¨ÚZž7y·J\Êeì0+ð ¨ È t é ; A Í ÃE¬ö‰nÿ„þ½ýßüÕû•ú ùX÷”õÙóXòñ'ðWï©îîUí¡ìùëYë¼ê=êØé¦éÂéFêEëŸìîsï”ðxñ6òøòÞóôô&öJ÷GøùÈùú¥û(ý0ÿ™7ƓÛ©R Þ B =l=UfXU­Ù3 j2!ÿŒ¹£l a ° m š ô B / ‘ I mIS¨kÿqþ–ý°üšû;úøªö±ôËò#ñÊïºîÜí%ízìÉëëeê¿é-é¯èOè"èGèÓèáéHëÜìkî¿ïÊðªñòyó›ôÒõ÷øøøÖùØú)üêý$µT§c _ ¶ Ê  è – Æ´šeW¸Ý-ê%¸fÚî£ \ Û ½  0 ] ; ™^£ryÿÔý¢üÉû2û•úÙùÜø‹÷üõFô¡ò4ñ!ðkïéîîîˆíèì,ìjëÁêKêê-ê®ê­ëíÅîjðÔñßò˜ó%ô¼ôõ{ö™÷µøÈùÂú«ûµüþ¹ÿÝD¥¬ ¼ Õ ¹ Û « M ·Ÿ•Ù˜W3}—ß“¾Hî„ÐЖ P 5 s " 0 m W › Gx`<K±þý¤üèû!û!úÙø<÷jõ‡ó»ñ5ð÷î îXíÌìHì»ë&ë{êÛéOéäè©èºè*éê_ëùì˜î ð/ñòªòJóôìôÿõ+÷]ø’ùÒú.üÑýÓÿ&´,A « _ ~ u ¶ œ UÁ“\§" "ÙI½¤ù”2”•9¥  ¿ ç–º D  X=ñìþBýöûûCú›ùËøÉ÷}öýôfóëñ«ð¹ïïžîIîî©í3í¡ìì{ëëÍêãêjëiìÙí„ï)ñò…ó3ô·ô=õãõ¶ö¸÷ÈøÐùÂú°û¾üþÊÿîOš|· 2  Ù ò Ê ˆ ã¬ölÜXhº^réšI¼Þ§ H ÷ õ f U £  Z 5 „ ._I):©þwý‹üÌû û0úùÎ÷Hö·ô9óöñôð/ðïï|îÜí íEìgë—êê¦é®é/ê/ë™ì>îÒï#ñòªòóXóÅóZô*õ!ö4÷Møùãú–ü©þ“Þ¾õ„   ¯ ' _ l 23lÙ>¡?~¼O[ÉdüQT‹ 2 $ ž • Þ A k - U ëüÑŸ¨ÿ þÑüàûûbúŠù‚øJ÷ÒõAôÆòxñpð¨ïï±îRîíí`íµìöë7ë—ê-êê†êoë¾ìDî¹ïëð¸ñ4òòËòAóìóÐôàõüö øOùú4ü(þmÔ X W ž 0 p f ÷ןß"z,’ ê<å³gÝýÙ… B C ¹ ¦ á , C ý 5 äøyÿ3þ6ýPümû\úù§÷öhôÙò€ñpð˜ïéîUî½í íaì”ë¹êæé3é·è“èíèÖé2ëÔìkîÄï¶ðEñ‘ñÌñòòAó*ôKõ”öøÖùàûDþÕc¨i‹ ` · ’ , Š€˜o“ÓTrýh%û©ü”} B † H m š š !  |g °ŠÿÈýiüKûQúZù?øëö\õ©óöñpð8ïWîÃící í×ìiìÉëüêêRé·èwè¦èTé”ê7ìþí£ïàð°ñòUò“òõòžó„ô¢õàö3ø•ù)ûóüÿaÂúÃþº * ® — & `ý™˜¹ã5ßHÄžá…9Ì$ï©} –  ù   Ú ! á %ÅŽŠÿßý€ü\ûIú6ù ø¾öIõ¯óò¢ðWïIîtíÔìSìåëmëØê!êZé¬è.èóçèÂèìéuëí±îìïÇðBñŽñÔñ9òÈò“ó•ôÄõ.÷ÙøÊúý¨ÿaBðõ s  = P +¼º»R,ãñ|ë—Â\F-ÖÜHÜ ‘ Ç ~ ~ x * e ,ì“N`þÑü—û•ú©ù½ø­÷YöÍôóxñ ð÷î6îµí^ííÌìJìšëÁêäé(é´è“èçèÂé$ëèì¿îuð¸ñˆòíòó(ó`óÓó ô³õ÷‚ø*ú ü0þ— •É £ K ¶ = E j6ÿ`°eI¤×L6Š6í‹ãë·tG o è ° Œ H ¶ ´ Jue?5fþÔü€ûNú(ùö÷ªöFõÐóSòôðÂïÅî î‚ííÎì}ìì‰ëÝê/ê•ééõè3éêNë íéî°ð òóžóÜóô>ô£ôKõ4ö^÷ÃøhúVü›þ,ÙYwï ´ ÿ  ƒ ‹ OÇ›gº>Ðk6ˆÍU^ܪzdb%â ¾ ÿ š Œ — ~ |o —FÿXýÝûÂúäùùGøB÷ÿõôóˆñ2ð*ïcîâííiíRí+íÑìJì¨ëë¨êêæê»ëíºîðòGóô]ôsôvô’ôØô_õ,ö:÷|øýù¹ûÃý‹éãX> ±  š Á ™ Ú„¤ ‰ý²Ô[Ô_¥®“t † è š Œ { * k 9 ˆ†X)8ÿ“ýHü7ûQúqù‚øt÷4öÓônóòñ$ðyïï©îcîî§íí€ìåëgëë)ëšërì¯íï‘ð×ñÔò|óÙóô;ôvôÕô_õö ÷6ø¼ù‘û½ý/¯ýà%ß0 ‡ 8 š ½ xwFtÅ` b¿wµiV4Ô ï¡[ K ¢ p Œ Ä Ä Y _ ÙÚ&æÿþ”ü~û úÅùÅøŽ÷öyôÔò^ñ:ðmïìî£î|î`î-îÓí6ílìŽëÕêbêTêÁêœëåìhîïïEñJòóòOó…ó£óÜó>ôÕô õªöó÷ùbû–ýž÷Ï ¬ê ´ ì ë ~a)lÃD#®;VëŸN¼÷ø  K ù ÿ 1 V # ~ I ™‰I Uþ ýü,ûQúhùMø÷{õÞóPòñðIïËîqî0îíí‹íûìJìšëëÒêîê{ëlì·í'ïð”ñUò½òóòó<ó‚óõó’ô\õVöƒ÷òøÄúûü„ÿY‘1t ÿ M 5R5[“½õ‹à`UâÚûö–Ä”5ê â K ) K o K ­ „ ѳTóÂÿêýrüEûNú]ùRø÷ õôMòÁð~ï’îþí©íˆíwí[íí“ìëë2ë’ê=êTêàêãëJíçîxðÚñÙòyóÈóòóôFô ô/õüõ ÷]øú üqþ½í ´ W ! ¥ ê°©SOZp¬P¾\c߯?‘†=Üœ ª 4  = ? è  Š uýP·ÿoýû;ú-ùAøJ÷2öìôóüñ†ð8ï3îqíöì¤ìƒìzìiì:ìèëxë ëÊêÍê/ëöë%ížî/ð§ñÜò·óCô›ôÛôõ~õöÔö×÷ ùmúüßý oáÑÙ O h ‰  d tÜdB<3^ôWÖ½#à¸d¶©Xð ¥ ¼ L O Œ ¹ „  `u*¸bÿ^ýÒû¶úáù(ùXøP÷ö’ôóòañðïRîðíÎíÑíçíêíÅíiíåìgìììoìGí„î ð¥ñóAô õõÁõëõ öNö»öa÷9øGù’ú&ü"þsûs“"  Z _ ~ ' Ÿ Þ¥|üº…RG³ŠŽÏ­Y°®k ñ ! Í Ò   Ä ä f_ïaúþðü\û'ú-ùGøM÷!ö¿ô0ó‘ñ ðÅîÓí(íÉìŽìuìaìBìì¨ëNëëë~ë<ì^íÐîgðò]óbô õvõ¹õôõ@ö­öH÷øù;ú¢ûMýFÿ—~ ì : @ j o &Êœ6Ù°`íóm4¢ïä– 4  2 Ö á  ' Ó írp—;þ7ü¥úŠùÅø+ø‹÷ÆöÄõ|ôó‘ñFð@ï‡îîðíõíîî îÈíníííìí¬í¬îðœñ(ósôbõéõö öüõ÷õ!ö{ö÷ø%ù~ú#üþK¤Ö­ù¬âç ï Œ ê Ä›÷ˆ¤j¿ °ã— ®~ï â ³ ¼ '  @ — ³ b p ßÇTÄkÿlýëûÍúéù(ùJø?÷æõTô¤òñ¦ïžîðííií`í^íDíûì‘ìì»ëœë×ëzì‹íòîƒðòDóô›ôÕôæô÷ô!õ~õöóöö÷3ù¥úgü„þîæùk A • ¶ î Ž ؈5lÙOÖ‘à0ÑùœŽ†E¨´y. @ ã Þ ý é b L “TÎ:çýùû„úvù˜øÎ÷ööö÷ôÂóòBñ,ðTïºî]î(îîþíÑíwíùìoì ìîë7ìóì"î¦ïPñêò5ôõjõ~õpõ\õeõ¥õ&öëöö÷*ù’ú4ü+þ\µòÌÅþ >  ¹ ùÖ=Ôfù³ú?ë7Eƒ€)mv]l Ô ¸ ë < X ù ù O „ÔWAþ¤üxû‰ú¬ù·ø‘÷&övôžòØðFï î íŽì4ìÿëÌë†ëë_ê·é3é éFéýé)ë°ìZîôï?ñ(òªòâòó ófóìó±ô¿õ ÷˜ø_úiü¿þKÖ,n * y ® 2 K (¥t,aÂ"…#b©[¡ior.”h( r ) / H & I [ãF½ý¥ûúêøø+÷=öõ·ó<ò¶ð_ïRî›í<ííí.í6ííµì?ìÆërëoëàë¾ìî ïEñ½òÜó•ôïôõõõ8õŒõöÚöÜ÷*ùÐúåüZÿ¦üËä _ h h ¹ Ç œ è—¾J–)eºzÉ—š‘H¢tB S Ç ° Ú ü d $ DØ \Üý×ûLú3ùXøŽ÷¨ö„õô‹òÚðCïííßì.ìÄë—ëŽë†ë\ëëêêÖéÛéKê,ërìûí£ïñMòóŠóÈóýóCô®ôNõ$ö)÷Rø·ù\ûUý¨ÿGìYL « j Ä – ½ «4¤·ã>²É ½íþûµë˜< d  ! 4  g * JÒ'ˆýYû©ù`ø^÷jö_õô‹òÄðïlí4ìdë÷êæêë\ë”ë”ëNëÝêjê-êKêæêìí_ï4ñËòøó«ôõ'õ5õ\õ®õ,öÚö¸÷Îø*úãû þwNÙÄ ö j g H } P ì,²âÖÔðj›ð¶ÍǰT®Àµ ° î † « Ï ¨ ú ´ ×xˤý—ûúËøÜ÷÷ö õ½óEòÇð_ï;î`íÑìˆìwì‹ì§ì§ìoìì¥ë_ëgëÕë¾ì î¨ïKñËòøó´ôõ*õ2õKõ†õöÁöÀ÷ûø~úVü„þ´Hz  g ~ ¥ = € nî›È¬•“ôi4šrrSñ-'ø Ú ù ƒ g ‰ ” N ~  „¾ÿ–ü¨ú3ù+ø^÷Ÿö¼õ©ôLóÁñ)ð¿î›íÚìlìJìaì‘ì¾ì¾ìˆì7ìñë×ëìµìÃíï¨ð(òyóyô$õõ¶õÝõömöåö€÷Dø0ùWú×ûÈý'׆öÖ  Ÿ Õ  ” µ |ÆA€Ü™†à€oîÛëÛ{·²Ž } ¾ \ \ ° Ø ž ÃpÔ/½ý­ûúÈøÆ÷ÝöæõÇô|ó ò—ðCï6îníùìÌìÎìêìóìÔì…ìì°ë~ë¢ë,ì%íî ð‘ñçòÜónô®ôÇôÐôìô/õšõ@ö÷DøÂù¢ûûý¹©{Ü„ _ s x  [ vȲcè/WÌÉaYgHÏ÷Ö¤ ‘ Ý Œ ¨ ñ ! î ' ¯ –&Zÿåüîúùzø¯÷îööïô…óëñKðÙî²íâìiì7ì?ì[ìoìXìì¾ëuëoë¾ëwìžíïšð ò3óôvô±ôÓô÷ôCõ¹õdö4÷ø(ùbúöûþýp%Ø4 2 Á ü = ë 3!…ý,µZíCqèåoVgVô;A.? Ÿ V ^ } r * ¯ ¤*rÇÿ^ý_û·ùcø<÷,öõÖóoòñðyïî í7ì¥ëNë!ëëæê«ê\ê êÖéæéNêëPìÑívïÿð4òóóÙó ô5ô~ôìô„õBö)÷Gø®ù~ûÆýpR!ˆL Y Ø  ƒ i ò$²@aº| $3Ÿ­Ym”}ÿá“ l Ÿ K N u ! 2 “\´Ý"þÄûçù|øt÷œöÇõØô¯óXòÝðmï6îDí¤ìHììì ìèëœë:ëãê¿ê÷ê¢ëÆìOîðßñkóŒô5õ†õõ¢õ¹õôõYöèöœ÷nønù«úPükþÿÅuº] K « ¼ ù » 9_ß\oË9¬S„©4@æÝæÁN“™ à H & = S 4 « ’ íÄA”ÿ²üÄú6ùè÷ÒöÍõ«ônóòð8ïûíþìBì¾ëoë:ëëàêšêIê ê÷é5êÏêÝëGíéî”ðò0óïó`ô˜ôÐô!õ õNö#÷ øù0ú‰û?ý_ÿðºrÅ u r Ú  P "£»(‰t“ºâH@J¾Ø†’«„÷ýà u T š Q _ • £ T n íÍJ—þ¾ûõù˜ø“÷¾öëõ÷ô½óPòÏðeï;îcíèì²ìªì¾ì»ì“ìEìàë‰ëmë°ë[ì‹íïÌðzòáóéô„õÍõÝõüõ7ö­öP÷øÃø„ù_úƒûý*ÿ¾H‡  Ý : ü t’„z¡ÀëYhƒ 2æ÷òy¦– ƒ ¨ ' 5 _ K Ä © þÏ[Ïtþdü¿úqùOøJ÷7öõ½ó[òÿðÍïÖî"î¬í^í(íðìµìaìóë‰ë:ë5ëŒëHìwíõî”ð.òóŠôõgõõõØõ:öÚöŸ÷|øqùúàû–ýÅÿS¢· $ à  : ™ Ž 5xrUfq}ÕÊÜ\‰CTp;«¬z E K ´ „ £ Ð Ä O L §~þeþýùû\ú-ùDøw÷—ö„õ3ô¸ò/ñÇï±îäítíJíPícíXíí²ì<ìÝëÌë#ìöì9îÒïˆñó`ô-õŒõõ’õ õÛõPöüöÆ÷›øhùLúgûíüòþu-Ò Œ K Ÿ ô Ý w«#s=4(= ½ö®Ðæ÷Í8J.  K æ æ , p j ï Ù 1 ž#ÞþëüKûìùºø–÷aöõ¬ó+ò¶ðpïhî¤ííÆì–ìwìHìöë†ëëÊêÏê:ëìfíïÌðqòÂó©ô'õeõ‰õ³õ ö”ö^÷OøRùTú\û”ü3þHÆe×Í  ¹ Ú ë K P SÑ!Úµ–†ÄºÒp´|˜`ÀÀ † V p ú ú A „ „   gFâm-þEü¹ú|ùløo÷_ö-õÅóBòÌðïyîÀíRííííßì‘ììŸëSëVëÄë§ìî¹ï€ñ+ópôFõ³õØõÝõîõ,ö¢öJ÷ ø ùú!ûgüþ$œ;²¯ ÿ — ¾ Ï 7 9 ò4§ãˆM Tf¥_·˜£hÜø â Ú  « ˜ ¶ Ç ˜ ò ÀÿÓtõý.üÂúùwø^÷&öÅôAó­ñ2ðïîòí<íÀìrì?ììÏëxëë®ê~êê$ëì‚í*ïàðtò´ó’ôõYõŒõÒõ:öÝö§÷¤ø·ùÍúñû9ýÍþÕ<Ä+ b = d × ç  Ò%@µS ãHô5êвL™ ‹ N ' ; ºžÀßËMH³¤Vÿðü:ûÛùÃøÌ÷âöàõ¹ôióò«ð‰ï®îîÓíºíºíºí›íDí×ìlì1ìMìÜìâí]ïñâòyô¥õYö¥ö³ö°ö×ö)÷¸÷|øhùjúmû‹üÜý„ÿ‹Ü=q- : ¶ Ò ñ o œ h­ zù†:]V”F‡6ð ß î Ø é 6 äê  ÔÏÜ”ZþlüÕúù|ø…÷‰övõ5ôÑòañðúî+îžíMí(ííþì×ì‹ì.ì×ë¶ëèë–ìºíIïñóò•ôÒõœöüö ÷<÷t÷ß÷–øùú­ûÃüçý%ÿ¥…ºÿ Ê æ o ° è o $1R/lÏBÞøåºó – l . Æ  / * A –91?BûH ]Sþ,ü±ú„ù“ø»÷×öØõ«ôXóþñ»ð±ïìînî0î îûíßí²íiííÎìÌìíÜíï”ð[òô«õÌöz÷Ì÷å÷í÷øtø ùÊù³ú«û­ü½ýúþXk€U´ ‰ æ H ë & õ!X'Qš±è ycÆ z B ü x Á Ò Û ûn6Jz…BˆN˜ŽYLþˆü'ûú*ùMøP÷)öÐôZóâñšð˜ïäîvî>î%îîðí§íBíÔìˆì…ìóìÓí"ïÊð¡òhôëõ ÷µ÷øø6øwøõø±ù¥ú¹ûÏüäýÿ5³qbS Q  ¶  µ í £³Ã‰­ù_1E›`œ # Ô o æ * F W “×ßùð–̆ÖÝÓÿûýgü/ûCú‡ùÓøþ÷ùö¹õ]ôûòÃñÌðð ïWï$ïéî›î-î¤í%íÑìÑì3íîWïöðºòkôÕõÔöl÷²÷Ñ÷ó÷6ø½øvùZúKûHüBýXþ£ÿ/ûïÒq˜ C ‡ ¦ ï « î ¯®¯WeÈ){õ E Ô z { ¿ ú G ½zq“·¯Rz!b[Kkþßü³ûØú*úù²ø¯÷jöýô‡ó4òñFð¹ïmï>ïïÅî`îâí`ííûìcí>îŒï,ñçò„ôÒõ»ö7÷i÷‹÷µ÷øÅø©ù¶úÒûèüíýýþ8°`/è[f T ’  Ý 1 êØ­%-cãY a â o æ 8 h ‚ ·Àª¸¾™&KýRoŒÿÖýlüKûjú©ùäø øüö¼õbôóò,ñðKððïï¹ï_ïäîLîÈítí…íî÷î\ðòÈó\õœöz÷ø÷.øJø…øçø„ù\úNûEüDýDþZÿ¢ Ó•<– ò  5 @ z ï³#0§…«¤  ª ? ¶ ú " G …þÑÚ­)=Ø BpÿÙýˆü€û¹úúIùcøE÷÷õ’ô3óòñ_ðôï®ï~ï8ïÐîGî©ííÌìÚìlíyîôï»ñó2õxöP÷»÷í÷øløõøÈùÊúèûý þÿ7œ3ÛoÀ£ $ Z Œ ñ ¾ ü Š@×þ–½€•i – ÿ ƒ  _ ’ ©Æ†VaŒ¥~ÿ½Tžþ(ýü2û•úúWùøl÷)öØô¡ó¡òëñoñ&ñùðÇðxð÷ïTï£îîÜíîÂîñïrñ.óÞôHöP÷ó÷<øXøzøÃøLùúû ü&ýþ ÿB²L™â½ * I ]   K d Ô `Øü™“èÇ`Ý  \ á _ ½ ø:‰ì/Q2®ÂkÒ'žþ[ýaü¨ûû’úéùùøÆövõCôDó‹òòÏñ§ñuñ!ñ—ðàïïî3îWîï)ð°ñkó'õ™ö§÷Dø|ø…øøÃø>ùúÿúü ýþÿ:– ÿÈ D h È ‰ ­ # ¯)ª”ãÅ|E H  ® F ¿ 6a³@,Q_=¹ÓˆüeìþÀý×ü4ü³û2û‰ú®ù›ø^÷öúôôtóóßòºò‚òòoñŸðÍï*ïäîïÐïñ™òZôöV÷9ø²øÙøáøøøDùÓù«ú³û¾üµý“þTÿ,&^½'rr`ˆ¯ ò * œ (’¢4,’c? ^ « , ¼ C © â 4ŽéîÿÿÊ=L‰±þ¡ýÑü?üÄûEûšú·ùžø^÷$ö õ*ôŠó+óóòÔò¡ò9òŽñ¾ðìïCïõî-ïéï,ñÎò›ôSö»÷·øDù„ù¦ùÙù>úìúàûðü þÿÍÿ‰SEi±7#º " G ¬ m ë X›é¹ä¬ ” ­ ’ " ¬  Rƒ¾/ãÛü$,÷jn"¢/ïþþUýßü}üüVûhú6ùê÷¥öõ¿ô0ôÐó˜ócó ózò¥ñ°ðÂïïºîõîÄïñÑò£ôSö¡÷øíøù3ù`ùÍù•ú¨ûâüþÿúÿ¾Žˆ² g¤% k º - ý  o ÈéN&sJ+ ? ‰ ï m Ù + `}ªüN2ô›çÎjáÿkþ?ýdüÝû€û5ûÂúú"ùí÷‘öNõ5ôcóÜòœò‚òtòEò×ñ#ñNð~ïçî®îúîÐï)ñçò¼ôxö×÷Óøcù´ùçù8úÕúÉûý]þ±ÿÒ»w0$EP   é  ] Ø ” ƒ – ¡„NIJ1 ) @ „ á I §ó&S‰ò•qnnOõA7ãyÿþ ýKüÉû{û2ûÊú$ú>ù+ø÷îõõZôìóÀó´ó¡ónóõò<ò^ñ‰ðôïÄïðÿð[òøó¨õ.÷Røùqùù®ù÷ù’ú~û²üþFÿQ/åžt|£Éמ+ t © õ v @ E l Ixì"1 Y ” æ C ˜ Ü :xà5·ZºÔ™*±þ[ýBü{ûéú„úú’ùÎø×÷¶ö‰õvô˜óþòžòtòlò^ò&ò°ññFðšï0ï5ï¿ïØðfòAôö¸÷õøÅù>ú{ú±úûÇûÑü%þÿã ö´]éÕÌ›> ¦ Ù > ¨ Q & ç ž ¦â â Ò Ç ä  iÀ H{º¤fD0ÉJ}m*ÿçýÔüü~û7û ûÞú~úÛùûøè÷ÌöØõõ’ôCô"ô ôêó•óó6òVñŸð2ð=ðÕðèñyóIõ÷˜øºùpúÇú÷ú$û€û1ü9ýþÓÿ Ùˆ(Þ¥Œr?Ô0 ] ‚ ½ " Ä ‘ u ^ ˜²c¸ Ñ Ú ã D íMŸîI¼Wê½|l}QÿËýÃüü†û@û ûÄúNúù¡øƒ÷döjõ ôô´óŠófó<óêòaò¸ññmðð'ð³ðÃñDóõÄöRø‡ù\úÕú/û€ûü×üõýOÿ¼ 0ÅeÉ™c £ ú 5 k ¶ $ ¼ u . ß i©S ^ g v ²â @hÑ6Ô™oE”éôÿÍþžýˆü¹û5ûôúØúÂúúúyù“ø–÷¨öãõNõïô¼ô©ô•ô`ôôfóªòâñ7ñÝðÿð¥ñÎòeô/öð÷eùpúû_ûƒû¶ûüÏüÔýÿYŽ` ®W¸[öiÀ I ¯ ; ì ° ˆ G â >Dí [ – ¾ ï  U ™Ú _£; ê´cÔë«ÿcþBý[üÇûbû/ûôúú ú3ù.ø÷ö5õô"ôÞóºó“óLóÎò(òañ¥ððæï'ðîð+òÅó~õ ÷tøkùúbú¨úû¥û™üÔýAÿ° Ð/Ý‹4ËI ´  v ï † : ö ¯ RÐ ï|à å ñ ÷ (V{±ôWߘ]%ÜoÏñÛÿ¯þˆý‘üàûmû'ûûÒú~úõù3ùJøP÷aö”õýô¦ôvôkô]ô*ô½óóUò‘ñüð¹ðèð¢ñßò~ô@öö÷`ùmúû{ûÄû ü»ü¬ýáþK³Íxª4© U Ó ' 2 à ‘ 7 É ">²  g ¢ Õ ú  Bi—Ï'£LõÅwûBHÙþªý°üÿû‰ûCûûÍúWú©ùºø¯÷ªö¼õõvôôêóÂóó0ó–òÔññCðÊï®ïðÿðaòôëõ–÷õøòù•úôúNûÉûƒü™ýýþŒŠ¼Á”Mëzõc ½  e  8 Ç g  µ A¯ìç›X z ˜ ’ …ƒ†•¼n²i‘æýÿìþ½ý–üŽûÍúQúúïùÍù’ùùtø¡÷»öãõ-õ£ôFôôô ôêó¯óAó²ò ò}ñññuñ^ò¬óNõ÷½ø$ú'ûÌû)ülüÑüwýnþ·ÿ4½3„¥–XíW ˜ Ë ò ' h Ê N ô ¢ S ð qÂäÅnâ 9 z ¥ ¼ · ¯Ÿœ ºýkÆ€Žǹÿ|þ#ýÝûÊúúùLù%ùøø©ø%øl÷”ö¶õôôTôòó´ó£ó˜óókóó¤ò òxññð¶ðÕðañoòçóšõa÷ù\úVûùûdüÀüJýþIÿÇf Œàûâ  I v ’ ´ é 2 —  § . ¤ Ac`² # o ¢ ¹ ± ›€jj|¯žGó‹FWÿ9þýÏû¼úõùnù6ù%ù%ùùÙøføµ÷åööbõÕôyôOôAôLôFôôËóLóºò#ò¸ñ‹ñ»ñXòióÛôƒö6ø¿ù÷úÕû[üªüëüPýøýõþCÄ[éN€q q „ n c y ½ 2 Ò † 4 Ô U ¬ Ù Ù œ 4 ª  V ‰ ¦ µ»ÄÕ÷6˜(Ù‹.§îúÿÓþ‹ýMü/ûZúÈù|ù]ùLù-ùÑø9øi÷€ö¥õéôWôøóÎóËóÓóÅó“ó3ó¬ò òoññÚðñÏñûò~ô7öê÷qù«úxûñû7üzüíü²ýËþ:â˜=¸óç‚ Ù ï é á ø 5 ¦ : ë ‘ “ â õ ª ? »  b | iVK\•›`+ßi³¼˜ÿDþëü³û¹úú¬ùùqùRùù›øó÷&÷Nö†õæôvô;ô'ô0ô;ô'ôúó“óózòíñ‘ñrñ¸ñoòóõÁöqøõùûÝû:ü^ü}ü×ü‚ýþýÿ°|5Ä  › Þ Û ¿ ¦ ½ ~ $ è ¥ E À 66Ù t ü d ¨ Ç È ºª°ÏÀnw­°~ÿ-þÔüû¥úòùùAù ùÓø|øö÷<÷aö†õ´ô ôóLó.ó9óDó9óþòœòò†ñÿð¨ð—ðîð­ñâò`ôö§÷ù-úàú:ûmû¨ûüíü(þÇÿ­©—S·´ C v h I I ÿ ¹ œ € Gá>`]5øž<Æ . j x _ 9 TÊy3çk­°s ÿ‹ý üæúõùUùïø·øøUøø÷f÷¢öÊõäô%ôó3ó óó.óOóOó óÃòBòµñ=ñññ‘ñwòÂóWõ ÷²øú2ûãû?üiüŽüåü“ý©þ5>gf  ‘ † * ¼ ˜  ë ð ø ÐZ••e"Ü•Dó q Á Ì ® t D?gÊp/÷˜õÉWÅþ+ý³û~ú›ù ù½øøfø øª÷üööõôAóœò4òöñóñòò(ò òÆñgñôð‘ðgð†ð ñò]óýô»öcøÓùÛú€ûÒûüKüÚüÙýTÿ&?pwA   ƒ Ý Ï ” Y b Ç ‹ ‹ ›5~Cò˜>õ¦J¸ ó Ý š A öÏà5Èv%¯ðî¨0ÿ›ýü®ú ùáøcøøÜ÷“÷&÷{ö«õ·ôÈóøòPòÝñœñŽñ­ñÔñüñòíñ°ñVñöð¥ððÒð€ñ“òô®õf÷ù_úQûÏûüüVüßüäýpÿrÀ)nW Ç Ÿ ß ³ N ö î P  3¶ùé ;Ón´6ˆ ” g  Å…{¨«WïUtEÕÿ>þ”üû®ù¤øð÷€÷E÷÷âö†ööCõnô•óßòJòåñ¾ñÁñíñ(ò[òwòiò1ò×ñƒñKñ?ñœñXò…óýô¥ö[øéù!ûëûYürüuü¤ü<ýLþéÿð6‘À‰ Ì o ˆ 7 Ì ‘ ¼ S M q\ÍϽ<Ù 1 1 æ q ù¢©%Ñ.–¢\Þþ9ýû*ú ùGø×÷¡÷ˆ÷d÷÷Ÿöîõõ3ôcó²ò?òòùñ ò?òtò“ò¤ò–òqò9òòâñùñaò+óWôÏõt÷ù úÄûrü»üµü¢ü¾ü?ý>þÇÿÉjT †   ¶ F @ Ý ß þ ¿ÊTç‚Aà S œ ‘ L ä…Vb´D·J“‘HÍþ4ý¥ûFú*ù[øâ÷™÷i÷7÷âö_ö°õÕôòó+ó“ò1òòò#òUòŽò²òÀò¤òtò6òþñèñ ò‚ò`óôö¤÷3ùšúŸû7üdüPü7üYüíüþ¨ÿ¾€¤] b Ì š ! ® ô Ò [v8vFÊ'›(ê É ¤ P ¥ « W ð™o $ìÓ©>tMÒÿPý—û-úùqøøê÷×÷­÷[÷Ìööõ3ôcóÎòfò+ò&òBòoòœòµòµò§òòMòòò òŽòXóvôÕõS÷Óø!úûû¹ûû~û¥û:ü^ýÿ/“?ú  s K ã ‡ ˜ , = § 5æØT·*ÅwJß ÿ ¦ 3 åωQ$ÛOc#—äþ&ý€ûú ùXøâ÷œ÷[÷÷¢öö;õ`ôŠóÎòEòâñ³ñµñâñ òcòŽò¤ò–òlò<òòò4òªò‚ó¦ô ö–÷ù\ú:û¥û­û€ûdûŒû1üiý-ÿoïaˆ" C  „ 2 e ! l û ~®VuxÊ;Ü·²žG l (@Þ¿¶‰ÃCÿfý«û2úùXøÜ÷…÷:÷ÚöPö’õ«ô²óÎò ò€ñ1ñ ññKñ”ñÚñò6ò?ò1òò òòfòóòÎóýô\öÚ÷Dùsú@ûŸûšûrû_ûšûaüµýšÿènÝøy H g ’ T ¦ — ÂY†4BÚ7 ´ŠvFÖû É b é ž¢³œxQ"ŽÄÖþþüNûìùêøAøÎ÷t÷÷—ö÷õõ-ô<ófò°ñ,ñÕð­ð­ðØðñoñ¸ñðñò(ò(ò&òEòŽò.óôNõÄöGø·ùàúŸûîûàû­û”ûÒûœüõýÞÿ4Â1L ¼ ~  ’ _ ¹ Ç X ¿èr[Ì; D%µ z ý y  j¼ÜSƒþ¤üîúŠùˆøß÷i÷ ÷³ö/ö~õ£ô©ó²òÝñ7ñÇðƒðgðxð°ðùðSñ¥ñóñ+òSòtò–òÑò>óïóáôöw÷íø@úQûÿûBü4ü üüVü1ý¦þ ßÐ  Ÿ x ã I  E ÇîuS³àkÓ¯kÜ ß ‰  ‚BVÕ«¨—/Z a|ÿý¹û$úÙøð÷S÷ëö‰ö)ö³õ õAôZótò°ññ¢ð_ðFð\ðšðüðañÔñ6òˆòÃòíòóUóÈó~ôõÄö1ø©ùüúü”üµüˆü?ü#üoü?ý±þ«þs»„   ô ¦ ø Z 6   Ï ÀvœÝ,IsÎi<+ø o u $   #è  ’¶Á{´qÏôÿ þBü¹úù¬øø¸÷^÷÷†öàõõ-ôDózòßñoñ/ñ ññHñœñòiòÆòóOówó“óÈó8ôäôãõ÷qøÛùûü‘ü¤üaü üàûüðücþgÃ/d  Z ý L ½¬Z  œ ¡QrÚœæ3›<û ²  ÿ    °‰Çs{£³h•J™¹ÿÈýùûpúAùnøÜ÷w÷ ÷»ö7öõÅôçó óPò¸ñHññàðñð1ñ”ñòwòêòGó“óÈóìó*ô’ôCõ/ö^÷¦øúù,û ürüoü#üÉû¥ûîûÀü+þd¼Òc; Z ß Ž…GÈ Á Ñ ¶!î@yÈR%%.ø a S ú v ÿN)u¥ƒîäˆùQ¦þý«ûjúOùJø^÷uöŒõ«ô·óÀòÌñöðFð¿ïkïIïkïÍïYðôðƒñüñSò‹ò¬òÎòó˜ókô’õñöiøéù=û?ü×üýýýaýþ"ÿ³žºÚ¬ Ä Ð F q §P›  ª „`Ù0–  ß Æ µ u Ú Û • 6óúb5Wš¼{Å–uÖþUýüûjúìùùù¬ø øˆ÷ÒööeõÊôLôÞó…ó<óóóAó…óÓó"ôhôô’ôôpô’ô÷ô«õ¨öÚ÷ù5úûbûKûîú‰úpúÐúÇûaý~ÿëWrð©›ö N,É1  Ñ õnOÙGÙ ¬ ¸ ê ê X Y ± |–ÿ#VPÒÛsÎFÿµýYüKûsúÂùùwøÆ÷÷PöŒõÐô-ôžó ó¤ò+òÆñ‘ñ–ñÌñ+ò¡ò(óžóòó%ô8ô]ô£ô/õÿõ÷Xø±ùàúÁû#üüÄû{ûmûÝûëüþ¶ †™ È ½  E –ä± œ DZЩ- ½ ¯ Ã Ë – ó ã ‡  ÎÚN$CjaìúžT±þ6ýÿûûLú¬ùùwøÑ÷&÷oö³õôôFô¬óó™òò³ñzñƒñÏñ?òÔòyóô¦ôõNõŒõæõmö7÷3øcùšú«ûrüÃü¸ürü)ü,ü¢üªýAÿV©üö] ø Í þí ¸.c ë q nºqÙ # – = ) = N  x y ; a7oèSdݹ&,XþÏü”û¿ú$úžùùlø¯÷Úöö8õ„ôô›óJóóò…ò òªñˆñ§ñòžòfó;ôõ¢õöNö‘öèö}÷Røeù¥úæûùü²ýûý þûýþ¡þ¦ÿ2(\u; Z ¼ O R —ÕÃ0 ® ö ³ ß Ž ñ T Ê ‰ y ‰ Œ L £ ¡i'] Z› >fBñ•ÿ]þXýŸü#üÚû«ûrû)ûÐúWúÅù%ùøþ÷…÷÷¢öö¢õ;õôôÓôÛôõFõ¢õ÷õ=ö€ö»ö÷t÷øÃøžù‰úYûôû:ü4üüãûÿûˆüýÿÿ!ÏëGí8„¶[ ƒ o É ­ K Ý Œ d g s d  8  ß­¶ä@sL´¦G¹*ÿºý†ü”ûñú{úúÅù]ùêøiøß÷S÷àöŽöVö2öüõÍõšõ†õšõÊõ!ö†öÿöw÷å÷<øøºøùnùúù®úƒû^ü&ý²ýêýÎýˆýJýBý¡ýyþÕÿ‘tF¶™¸& Í܈û¨?‡ C s 2 ½ I ûäû" ( çGV@@| Rº žVìþþ^ýëü–ü:üÒûTû®úýùDùžøøª÷d÷&÷âö”öKö$ö)öSö°ö#÷¤÷+ø“øÓøøøù6ùkùÈùIúãú†ûülü€ü^ü#ü ü:üÌüÑý5ÿé²Z \uÿ-A¡… xÆÀD W  Έcq–ÅÈ JƒÍT!2s¹Ò•ìç­aÿþfýßüzü üŽûûbú±ùþøJøÀ÷X÷÷âö­öoö=ö&ö)öHöƒö×ö7÷–÷í÷9øtø½øùùúÂú€û=üâüMýwýlýPýPý–ý9þOÿ¶aš¶4g_`©ˆK–" L 3 û䬽ś1€ªÄ˜e¿®êÙ—Q"ÿ%þfýöü²ü†üMüüû‰ûúúQú›ùíøXøí÷™÷H÷îö—öKöö öö_ö¶ö#÷‹÷ö÷AøøÓø(ùùú£úHûèûuüÑüþüýýGýÀý›þÊÿBç„àÒ1Ys 3Fìô##Ñ ð¤M þ4M.Ì Q†äZq ´ó¶„ÿ|þ¬ý+ýëüÚüÏü­ügüîûKû’úÐù%ùžø1øå÷¡÷X÷ ÷×ö¸ö¾öàö ÷}÷è÷Oø¯ø ùcù¿ù*ú±úHûôûœü1ýžýÖýÜýÃý½ýßýRþ-ÿ\Òiæ$è ÄeLú §ÔÈU99M^GëMx•ÊA O•±n¸{*òþóý9ýÏü¢ü¢üŸüuü&üŸû÷úCú‡ùïø|ø+øð÷²÷t÷1÷ÿöëöùö&÷r÷ß÷UøÓøGùºù-ú—úû«ûKüöü¡ý>þ©þìþõþìþøþ0ÿ±ÿ§þq¹ª17»ñO __JJ6âwÁ”~u=ÞI•ê` 9ŠÙê¡óóÏ£ÿ•þÆýBýýý.ýDý6ýùü†üæû2ûúïùùAù ùßø¬øŠølø`øcø|ø¯øïø>ù’ùáù2ú‡úãúYûàûrüý™ýþhþ•þ©þ±þÞþAÿñÿî)ˆìå4 j—Ö`T¿„g€ˆE×jéØÒ¼má%JÆÒdœ‹ ,áþÈýëü^üü.üuüÃüùüöüÀüVüÌû=ûÄúmú>ú!úúéùÊùžùù|ù‡ù©ùÞù2úŒúàú5ûƒû×ûEüÀüRýçý|þÿ_ÿ’ÿ•ÿÿsÿ~ÿÅÿFóöê«8ôsäk?iê£_úQjY2æÏ͹~n¦ß<ϰÏd‹aÚêþäý ý–üiü}ü»üöüý ýÌüdüèûpû ûØú¼ú¼úÄú¹ú«ú ú ú±úÒú û\û¨ûôû1üVüzüœüÑü#ýˆý þŠþýþWÿ‡ÿ‡ÿ|ÿ|ÿÿôÿ—laX%·äºA¡ ¡ˆ½<ÎT®Í¿›‡„ Ðýé|ÓỦŽÉUMó/2ÿþ6ý§üdüaü”üÉüëüÚü–ü1ü³û5ûÒúúú•ú¨ú®ú¨ú’úvúeúbúvúúàú,ûxû¹ûöû7ü}ü×üJýÑýcþêþhÿ¿ÿ!8Hs®ƒžqž“iܪœ»ö9·ç>b Êìá©>¯™B+X–µžMµ÷$Tÿ¯þ>þ þþ9þZþnþUþþ¤ý&ýŸü.üãû¶û—û~ûVû'ûãú—úLúúìùäùú2úpú¹úû_ûÇû=üÌüXýõýyþïþOÿŒÿ¹ÿæÿN¥ ‰– `Š˜yO"MŠÑIy¦Û/LC±0“øwðîþî¢&pÿÂþøý[ýþü×üÚüùüýýÔü‹ü#ü¹û_ûûÿúûûûûéú¹ú‡úWú;ú;ú_ú¥úüúbûÌû7ü­ü.ýµýAþÍþTÿÍÿ,u¨Ú:}Á X¡ç39+öÙÉÃÉÜþ9c–Î T’ÅÓ¼¤3ߤޓª¯œUÚ4u¼ÿÿ“þDþ+þ(þ-þ%þþý¸ýMýÚügü üÉû¢û”ûƒûmû:ûúú£úLú÷ù´ù•ùù¬ùçù5ú úû­û[üýËýyþÿ„ÿæÿ,sÁƒî[½ Ož¦¯²¬¬¡w[A0(<[Åû6ZeR¯3¯9â°¢­»Á™E¾_ÿ¯þþºýˆýýý¤ý§ýýPýöü–ü4üîûÄû­û«û¨û—ûpû/ûéúúLúúú-úmúÐúKûÌû[üùü›ýGþøþ•ÿ$PŸù[Ã.…Î%;FLOLLA0 ߯yO0+6U|¤ÂÎÀ–?ÎSà{Bÿ¾_ÞÿIÿ·þ0þÖýžýýªýÎýðýþýêýÃý…ý<ýý×üÃü»ü¾üµüœüoü.üÝûŒûCûûûû:û‰ûîûiüþüžýXþÿÍÿs÷a­å&d¯[¯í%FRR>(ÎDö¤XëÔÔàþ4EB)ó§@Õx,ôÿúÿýÿúÿáÿÿ0ÿ£þþoýóü¤üƒü–üÉüýMýoýoýRý#ýíüÉü²ü¸üÏüëüûüýíüÃüˆüBüüÚûÉû×ûüPü¾ü<ýÖýþCÿ¹YÔ4}¸ð(k¡ÈáêäÙËÅËÎË·Jç…#ݳ¸Ú Br‹Žt?ó™Bé¨psx~{\Êÿ]ÿçþyþþäýÑýÜý þ6þ]þvþqþRþ"þíýºý–ýzýlýcýRý1ýùü°üVüùû¢û_û7û)ûEûxûÉû?üÑüý;þÿ¹ÿYÚ=ƒÏd»f¤Öõ"088*Åw ¡J ëåö.BE.þ¾j—2Þÿÿyÿ_ÿQÿ>ÿÿçþþþ“ýý¤ü[ü:üBürü°üùü4ý[ýfýaýUýRýUýoý“ý¸ýÖýçýçýÎý¤ýfý&ýèü²ü‹ü†ü™ü×ü+ýªýJþÿÅÿŒ=Ï7}ªËí0Ufnqnkt|ˆŠ|Oþ“¥K S”ÔÒ‰2ÕCÂÿZÿçþ`þçý‹ýMý?ýUý…ý¸ýßýõýõýÖý¬ýtýGý ýýýóüßü¾ü‘üPüü¾û{ûHû$û'û=û{ûÚûaüýÎý¬þ„ÿNôxÔP‚¸êD`w–´Ùê˜.¯1Ì‘{€ªâ SolX1î§Næ5ñÿÂÿ ÿŒÿ‡ÿvÿLÿÿžþ"þžý(ýÌü™ü”üµüöüDýý§ý²ý¡ý‚ý[ý<ý+ý+ý1ý<ý6ý+ýýèü¸üzüEüüùûöû üKü°üGýûýËþ¨ÿ{,Á)r¤Éç<c‚“©Ëï>WT*Öcâ^ÆÁÔ J‹½Ñ˪r&ÆYéu¿ÿ|ÿZÿQÿOÿAÿÿÓþkþíýcýèüƒüKü:ü[ü™üåü&ýXýlýqýiýUýJýGýJýMýPýJý?ý&ýý×ü¢ürüBü)ü)üKüŽüþü™ýOþ%ÿúÿ¾jå.awµê0q©Ñò (6A;Â[â^ðŸuu‘Æþ<^aJÉ{°@áÿÿOÿ*ÿÿÿÿìþ¯þUþßýXýÌüVüüûÏûÒûüVü°üý?ý[ý^ýDý(ý ýûüý ý#ý6ýPý[ý^ýPý1ýýíüÚüßüýPýÈýyþOÿH@#ÙJ……w[Uk›ß-s·ò82±6¦ z¾œ§ÉþG}­½²–[ ¢‘ ˜ÿCÿÿÿÿ-ÿ8ÿÿÓþcþÜýBý¾üMüüüEü–üóüDýý–ýýtýRý.ýýýý#ý(ý.ý1ý#ý ýåüÆü­üªüÆüýqý þÐþ±ÿš}9Æ%ðßê%yáF£áÍsò]À+§K 7d™ÌîüùݰgŒ˜ÿ3ÿçþÂþ½þËþÞþÖþ¬þ]þêý^ýÉüEüãû³û¶ûëû=ü–üåüý.ý(ýýóüåüíüûüýBýfý‹ýªý²ý½ý§ý™ýˆý‹ý§ýóýfþ ÿÕÿ¾¸™XÎûäžM 9òFsp=ÛR² iå{,÷ãæô#Y‹¸ÝåÒ¢NÝ\ÊÿQÿìþºþ¬þÍþøþÿ"ÿúþžþþýùüzü)ü ü#üdü¾üý[ýˆýýwýXý6ý#ýý ý4ýMýfý…ý–ý–ýý[ý1ý ýóüýGý½ýhþCÿ:/ ¯Ùˆ<#J¯Mý©2•®’=ºt×Pè—^=/4BaޏÝóóÒ‘)¢vÿøþ©þþ•þÅþúþÿÿçþ‡þøýXýÀüEüÿûîûüwüÝüBý…ý§ý¬ý–ýlýDý.ý+ý?ý[ý‚ý¬ýÎýßýÙýÀýžýwýaý^ý…ýÜý]þÿãÿÏ­fåçˆÆ°åaç-vx2´qÙ^»‹a:!)V”à)UfBðd¼ hÿêþžþ‚þ|þŠþ„þZþþýßü:ü¥û2ûÿúûTû«ûüVü†ü‹ürüEü ü ü ü.üiü§üíü+ýaý…ý“ýžý¤ý¬ýËýõýDþ¬þ8ÿéÿ¼Ÿw(˜G²þo!2¥^9´ýôí0r×aëÒ¼¥—‘¾üN—ÚþöÁdÚWáÿÿsÿ‡ÿ¹ÿ5K/éÿpÿÜþ>þ²ýGý ýöü ý6ýfýýýaý(ýÚüŽü?üüèûãûÿû üKüwü”ü–üŽüoüPüEüVüœüýÑý·þÂÿÒ̀ѻM³¹®ÔÙáÊm¨‰ÙDߤ‹‚ra?#þ .fœ¸¸‚‘ë@¹ÿZÿ5ÿAÿbÿŒÿ£ÿ¦ÿyÿ"ÿ¡þ þoýåü€üHü4üHüoüœü»üÆü²ü”üdü:üüü ü&üPüzü¤üÉüÚüÚüÑü»ü­ü²ü×ü#ý›ýGþÿÚi“SÉx*«‘­Ë´C_'›ïR×–}€€lGÝ­™¢Ô^‹ŽXögÊ,¼ÿ~ÿnÿÿ ÿÅÿÐÿ¹ÿnÿøþkþÎýGýÑüƒüYüVüiü†ü§ü­ü¤üŽüuüSü=ü)ü,ü=üSüuüŸüÆüåüý ý ýýýý9ýýþÐþ¼ÿÄÄ¡%Gö^¥ ¾Ýui‚ŠN£†Z›™wwŽ–tG #dÀ%cq?ËVïÿ„ÿ_ÿhÿ‡ÿ¦ÿ´ÿ¨ÿnÿÿ˜þþ“ý&ý×ü¢üˆü€üuüwürüiüdügüdüdüaüaüaüdüoü€ü¢üÏü ýMýýÆýêýþLþ•þøþŠÿ:ùÆ`›|GxÚ¹N&"òy˜WÂzÔÔö#à™^2,N‹× +×xšK2HÌ 7: ³@¿ÿIÿÜþ‚þ;þþÔý¤ýqý<ýýÉü–ürüVüEüEüBüEüHüEüHüPüaüwü™ü»üëüýUý§ýþ›þAÿÌ}ü.¥xVdwOÊÛ’i噋œÀßײoÉ”‰ªå#JJ»:°,Õÿ¦ÿÿ±ÿÓÿéÿéÿÇÿÿ"ÿ´þLþþýÈýªý§ý¤ýªý§ýžý‚ýaý?ý ýýýý#ý1ý6ý?ý9ý6ý<ýRýoý™ýºýÙýûýþXþ£þÿ£ÿFôŽðÏH¨´ÿ®ÿÚħX›ˆ%¡ ̪ÉBloG Ä‘†¢èG™ÆÃ‹&°7à«¢¹æ #㌫ÿLÿúþÈþ¦þ‡þhþGþþðýÆý™ýzýfý[ýPýJý<ý+ýýÔü™üiüKüEüSüoüŸüÏüýRýžý þ|þÿÿ$”ÒÏš2ÇÿnÿWÿ˜ÿ,ôÒ…øê&Ô¸ÔoÀíöÔžoJJl¤ÙþþÑ}‘)ذ¨ÁÕæÚ®\ñÿÿÿºþvþJþ(þþÙýªýoý.ýëüµüˆüzüwü†ü™ü°ü»üÀü»ü°üªüªüÃüíü ý^ý›ýäý3þ„þìþeÿãÿbÏ, ¶CÍÿ|ÿkÿ±ÿ5é™ tl1Ô}H@dªî.}‘Æ Mrr9ë€Ï¢”¨ÊëÿôÌŒ8Õÿ„ÿ;ÿ ÿäþ¿þþZþþÈý…ýDýýþüûü ýý.ý9ý1ýýóüÌü°ü¤ü²üÝüýaý¯ý þZþºþÿŠÿôÿT¨ÌÌ‘2Âÿhÿ3ÿLÿ¦ÿ:éuÝöÚ‹=ôdÄ awi<  E‚Îûçœ4Æg# 7l‰†g!Ä\úÿ ÿ]ÿ*ÿýþÅþ„þ9þÜýý1ýèüÃü­ü§ü°ü»üÃü¾ü­ü™üzüiüdüwü¢üëü4ý…ýÔý%þ‚þÜþAÿ£ÿQ‰š~@ìÿ•ÿhÿhÿ¨ÿ!³E³îâ°o42a°ü.< 𸎆ŸÝ+l™Ž^ ­Vôñ :aod4é‘:ïÿ´ÿ‡ÿhÿ>ÿÿÂþtþþÑý“ýaýRýXýlý‹ý¡ý¤ýýtýDýýöüíüþü&ýfý¬ýøýGþ“þáþ5ÿŠÿÓÿTjjHÕÿ£ÿ˜ÿ¼ÿxîS‰‹Yذ¨Òa­×ëϳœ¢Ä[¸û Ët ¸xVSoŽ­­‘Y ¶j!ñÿÕÿ·ÿ’ÿ]ÿÿ·þUþøýªýiýGý9ýBýMýUýMý1ýýÑü­ü†üƒüœüÑüýoýÆý(þ‚þêþFÿ¦ÿýÿNƒ¥ NñÿñÿsÚ=ƒœ‹Y!ùîSŸè1#ü×Á× [²ø"â…µlEHg™Ìèà³jÁF!áÿ«ÿ_ÿÿ˜þ3þäý¤ý…ý}ýý§ýÆýÑýÎýºýžý}ýlýaýtý™ýËý þJþþÐþ ÿLÿŠÿ¼ÿÛÿôÿ÷ÿÛÿ®ÿ|ÿ_ÿTÿvÿ·ÿb«ØÚÁ ƒ—ÏSŽ­­”lPHd¢öMœËѸ}.ó¾§¢°ÌÝ×°õH$ìÿÅÿ‡ÿ8ÿáþŠþGþþþýõýþþ þûýÜýµý‚ýXýBý9ýGýtý¬ýíý0þtþ¯þúþ3ÿeÿÿ«ÿ¼ÿ¹ÿ¨ÿÿyÿbÿkÿ„ÿÅÿ\¢‘j85{àHŸÝùë̪¢µè7ˆÔå¤Jö¸”ƒƒ‘Ÿ™{7ëšNýÿ÷ÿáÿ¦ÿTÿõþ•þAþþýâýÜýêýþþ(þ"þ þíýÎý²ý²ýÈýûýAþ˜þòþLÿ ÿÞÿ$ éÿ¿ÿ•ÿkÿQÿIÿTÿnÿ ÿÕÿ 28$ØÿÅÿÅÿáÿ$xÒ/oœ­§Ÿ™ªÔrÀþð¸}M+&.JfwlBþ¢KüÄ—pKÛÿ„ÿÿžþ6þÎýˆý[ýMýXýcýwýzýiýRý<ý&ý(ý<ýfý¤ýóýDþ“þÖþÿ8ÿIÿFÿ5ÿÿìþÍþ¯þ£þ¬þ½þçþÿTÿÿ£ÿ¦ÿ’ÿnÿFÿ%ÿ%ÿAÿ~ÿÕÿ,†Ìô üëî 4}Æ B^f[B++9G<#ðªd&ñÕ¼¨_Êÿ]ÿõþ“þDþ þðýðýþýþþþþþíýäýäýûýþRþþÜþ*ÿyÿ±ÿØÿãÿÓÿ«ÿpÿ3ÿÿÙþÍþÜþÿ8ÿyÿ£ÿ¼ÿ¼ÿšÿ_ÿ"ÿêþÍþÞþÿWÿ·ÿm«Òãñù=}Ô+}»ßððÜνµ²½À½²“a Ô—\2÷ÕWñÿ„ÿÿ›þ;þõýÆý¸ý²ý¸ý¸ý½ýªý™ý‹ýý}ýý²ýäý%þfþ·þÿIÿvÿ’ÿŒÿkÿ%ÿÞþþZþ9þ9þXþþÖþÿWÿnÿeÿ>ÿÿÅþ¦þ›þºþúþWÿ¿ÿm ¹ÄÇÕô)rÌ#ožÆÔÔËÀ½»ÀÉò–aφE& ùæÄ‘Cáÿsÿÿ“þ6þøýËý½ýÀýËýÔýÜýÙýßýÜýâýõýþ;þkþ¦þÞþÿWÿÿ•ÿÿpÿ;ÿúþ·þþ`þZþvþ©þõþ8ÿkÿÿpÿCÿÿÂþ“þŠþ©þçþ;ÿ˜ÿïÿ:pŒš«¼ÝVªüBz¤»ÎÜíþ%6?< Ë–d9 óÆ{ ÿ8ÿêþ´þ›þþþ‚þtþZþ>þþ þþþ-þUþ„þ½þïþÿIÿhÿpÿbÿAÿÿ¿þyþGþ-þ-þGþþÅþÿ3ÿLÿCÿ"ÿøþÓþÈþÜþÿbÿÅÿ!x¶é4P{°î9w²Ùû  (.300%꽋S ëÁŸxNÝŒ'ÂÿZÿúþ¯þnþDþ-þ(þ%þ%þþþþþ"þ9þXþ‚þ´þçþÿOÿ~ÿ˜ÿÿŠÿ_ÿÿÐþ|þ;þþþ0þnþ½þÿQÿnÿhÿAÿÿÓþ´þ´þÖþÿnÿÐÿ'j ¼ÌÚùS”ÔXޏÜû ?Uci]?â§o7 âÄ­™xNÄe•ÿ%ÿËþ‚þGþþ þþýóýäýÖýÎýËýËýÙýóýþDþqþ©þÙþÿ5ÿOÿTÿCÿ"ÿìþ¯þvþLþ6þGþkþ¦þìþ"ÿ>ÿ5ÿÿáþ¦þþtþþÈþÿ„ÿæÿ@ŒÇôEuµö<ŽÔ 6RiqwtkU<꽎a7èÁ§‹rE Ò'ÅÿnÿÿÈþ•þþvþþþ›þ¦þ¯þ·þÂþÓþìþÿ;ÿnÿ¨ÿÛÿ:NFáÿ•ÿ8ÿáþ›þvþhþ„þ´þïþÿ0ÿÿõþ±þnþ-þ þ þ-þnþ·þÿOÿ„ÿ±ÿÊÿáÿôÿHÄ:oŸÄå<dˆ¡­ª“rP+ þùðëÚÆª{B÷¢@Ûÿ|ÿ*ÿêþ·þ•þþyþtþnþfþfþhþnþ|þþ·þäþÿIÿyÿ ÿ«ÿ ÿ„ÿLÿÿ±þfþ(þþýðýþ3þvþ¯þÜþïþäþ·þþJþ%þþ6þtþÅþÿnÿ´ÿïÿ@Y~¨ÚBx¥Ìù#P‚²âöøå»€J対»»¾°¢€VÚ:ãÿ•ÿIÿÿÖþ·þ©þ±þºþÓþçþøþÿ"ÿ8ÿTÿvÿ•ÿ·ÿØÿñÿúÿñÿØÿ£ÿZÿÿºþtþAþ+þ6þZþ•þÞþÿ"ÿÿïþ¬þhþ;þþ-þLþ|þ·þõþ*ÿTÿpÿŠÿ£ÿ¼ÿáÿ$F_~Áñ,l¸?fzrX+â××èþ ݪx/ëWÐÿšÿeÿQÿ>ÿ8ÿ>ÿAÿIÿQÿTÿZÿ_ÿeÿpÿŠÿ•ÿÿ˜ÿÿWÿÿËþvþ"þÔý–ýoýfýtýý¸ýßýûý þþýíýÑý½ýÀýÔýþý0þcþ¡þÍþõþÿ>ÿbÿ’ÿÊÿHŒÁù#S†ÁþE‚µ×ê߯œi9 óëóþþöݵ}@ÿ°g'éÿ¼ÿ‡ÿbÿAÿ*ÿÿÿÿÿÿ*ÿFÿ_ÿ‡ÿ±ÿÛÿ!Þÿ˜ÿ8ÿÐþtþþäý½ýÃýÙý þJþŠþ´þÅþ·þ‡þXþ%þ þ þ+þ`þ›þäþ%ÿ]ÿ’ÿ¼ÿæÿY‘Ï,Kalƒ­Ýa§åûלa11BE+Ò‹PÕš_áÿ®ÿpÿ>ÿÿÿøþýþ ÿ"ÿ>ÿQÿ_ÿhÿvÿ|ÿ„ÿ‡ÿvÿOÿÿ¿þ`þûýžýRý&ýýýDýwý§ýÈýÑýÆý¤ýˆýqýzý›ýÜý0þ‡þÜþ*ÿpÿÿÇÿôÿ$_¥æ&Y}—ª¸Ïó#^™ÃçûðÙ¯€U7)+..+#Ï¢d4ÿÏšuHñÿÂÿ˜ÿsÿ]ÿOÿQÿ]ÿyÿ˜ÿÂÿïÿ:TWFÂÿZÿêþvþþÑý§ý™ý¯ýÙýþGþqþ„þyþZþ0þþóýõýþZþ¡þêþ*ÿhÿ•ÿ¿ÿãÿ:s³é#HYlx‰­â ^™À××À‹Uว­»ÉÌÁœd)÷ÊxQ/ áÿ±ÿ~ÿQÿ-ÿÿÿÿ3ÿ]ÿ„ÿ®ÿÓÿéÿôÿÊÿŠÿ5ÿÙþ|þ(þõýßýóýþXþþ¿þÍþ½þþOþþÜýÎýâýþXþ£þìþ"ÿQÿkÿ„ÿ ÿÊÿH‘Ò)7@EVxŸàGlfMÝ—\7#,=P^\BÕT!úÿæÿØÿÍÿÇÿ±ÿ˜ÿ|ÿ_ÿLÿAÿAÿTÿnÿ•ÿ·ÿÞÿ!8KK8±ÿTÿçþ‡þ3þþøý þ0þ`þþ©þ©þŠþ]þþíýÑýÙýõýþAþqþþ¯þºþÓþìþÿOÿ ÿéÿ8x³¹¼Ï÷:‰è7z¡¯™r9×¾µ»ÆÆÁª€PñǨ‘ƒujW=æÿÕÿÐÿØÿæÿýÿ2H_gj_@Âÿeÿýþ›þDþþêýóýþRþþžþ£þŠþRþþÙý¸ý¬ýÆýûý6þ|þ©þÖþòþýþ ÿÿ*ÿQÿŠÿ¿ÿýÿ,K\\bu”Ò^”»»¢o2ô¹—†”¶ÒëôëÌ«~W=8CQ_\\F/*5885*Þÿ«ÿbÿÿ¯þOþõý¬ý…ýwýˆý²ýßý þþþêý¸ý‹ýaýcýýËýþcþ¦þÙþøþ ÿÿ*ÿFÿvÿ´ÿ÷ÿ=sš¨¨¥¥¶Ø H†¾âîèϪ†uo€—­¾¾°‰\!îÁm_TC8!úÿãÿÛÿØÿÞÿìÿ ìÿÅÿŒÿIÿÿ¯þfþ+þþþýþ6þfþþ£þ˜þqþAþ þÙý½ý½ýÖýûý"þLþkþþŠþ˜þ£þÂþçþÿ_ÿšÿÕÿ$8CQ_‰¾K‹ÁâîåÒª‹j^V\glo\=ã¶‘se__WWK@,$$,:HNK=*Óÿ•ÿQÿÿ¬þcþþóýÜýßýûý%þRþnþnþUþ(þêýºý™ýý¡ýÆýþý6þkþ•þ¬þ¿þÈþÙþúþ-ÿhÿ¦ÿáÿ8N_m‰«ØP޾ÝåÝÄ¢xYB/4/)#T,úÿ÷ÿôÿéÿØÿÇÿ¹ÿ·ÿ¿ÿÇÿØÿñÿ/HYQF*ÅÿŠÿ;ÿòþ©þkþ>þ"þ"þ>þkþžþÂþÖþÈþ¦þqþ9þþíýóýþJþŠþÅþõþÿ%ÿ-ÿ5ÿCÿ_ÿŒÿ¿ÿúÿ2Yu†‰‘®Ò:g‰—‰xS/ÿñù ##ÿàĥ𥰼¼¾³«‘”¥Äæÿ#ñ¼x'Íÿ|ÿÿ½þkþ(þþíýóýþ6þcþ‚þŠþ‚þ`þ>þ%þþ(þOþ‡þËþÿCÿhÿ‡ÿ˜ÿ¦ÿ¹ÿÊÿãÿ 2bŒ«¼ÏØë&Nuœ¸Á¸Ÿ{N, ùîññôîãÄ¥\F25/:85/*2Qx—°¾®uKÂÿpÿ"ÿÐþ“þfþOþJþXþkþ•þ¯þºþºþ¦þŠþfþRþLþ`þ‚þ´þäþ ÿ5ÿFÿTÿ]ÿ_ÿhÿyÿ‡ÿ ÿ¼ÿÛÿïÿýÿ2Nx®Ý!ëÕ¾¶³¹¹¹¼«šbC5'$$,5=8//*5Hj—¾æùÿéĉ@ôÿ ÿQÿýþ´þ|þXþOþZþvþ˜þ½þÐþÓþËþ¬þþnþ`þhþyþ›þ¿þêþ ÿ*ÿ8ÿAÿLÿZÿvÿÿ·ÿÛÿýÿ'2@F_x¥Ò :dƒ‘‹xV2ñؾ¥ŒuT8ôÿãÿÞÿÞÿïÿ2==:85@Ws—¼ãôüã¾{8ïÿ¦ÿ_ÿÿìþÂþ¬þ©þ¯þ·þÂþËþÖþÓþÈþ·þ¯þ©þ¦þ¯þ½þÐþÞþòþõþÿÿÿ0ÿAÿZÿpÿÿ¦ÿ¿ÿÕÿáÿïÿúÿ,C_x‘¨®°¢”ƒpg\\bm~ƒ†{gN:*$'8Wpƒ‘”ƒƒ†š¶à)=@&÷³YúÿšÿCÿòþ´þ„þXþGþ9þ;þ;þ6þ+þþûýçýÔýÎýÔýßýøýþ6þXþvþ•þ´þáþÿ3ÿZÿ„ÿ«ÿÇÿØÿéÿôÿúÿ'Cm”Áæ&,&ôãÒİšŒ{_F*ýÿôÿïÿñÿ,,',Hj‰¢«{@ýÿ¦ÿWÿÿÈþ˜þþyþþþ¡þ©þ¬þžþ„þtþcþ]þ]þhþyþ‡þ“þ˜þ¡þ£þ¬þ©þ½þÙþÿ*ÿZÿ‡ÿ¦ÿ¿ÿÐÿáÿéÿôÿ$Cb~¼ÏàîÿüüëØÇ°—ŒxujbWNH@=FHT\epx—«¹ÏÚéàÌ\Åÿsÿ0ÿÿÙþÍþÅþËþËþÂþ¬þþhþAþ%þþþ9þXþ„þ¬þÐþçþøþýþ ÿÿ-ÿFÿhÿŠÿ±ÿÍÿæÿúÿ /@_u¨ÁÏéü üéÒ¾° Œ†s\K8'!'25=FKNQQYjpse@Íÿÿ3ÿêþ¬þþnþtþþ•þ©þ·þ±þ£þþyþkþkþvþ“þ±þÓþêþøþÿÿÿÿÿ*ÿLÿ|ÿ±ÿáÿ2@KTYj{‘¥¾ÏØÚÚÒ†u_K2ñÿÛÿÓÿÓÿÕÿãÿ÷ÿ $:Ws—¹ã#Eauƒ‰€jEÄu$Ûÿ˜ÿeÿOÿFÿFÿLÿIÿ3ÿÿòþÐþ¯þ›þ˜þ©þÅþïþÿ;ÿFÿQÿLÿCÿAÿFÿWÿyÿÿÅÿïÿ:QeuŒ¥Áàô#!!#!&/,/#ñÚϾ° ue\YYQNKT\j¥Äàù ÷ĉFÅÿ˜ÿ~ÿbÿ_ÿbÿhÿbÿQÿ0ÿÿÙþ¬þþ„þ“þ©þÐþõþÿCÿ]ÿpÿsÿyÿvÿ~ÿ‡ÿ’ÿ¨ÿ¼ÿØÿñÿýÿ !2He𥫰°¥ š¥¨³¶°«”gK*ýÿïÿìÿéÿéÿïÿôÿ5Tp¶Úñ /2,üÒ—_*ñÿÊÿ®ÿ¦ÿ£ÿ¨ÿ¦ÿšÿŠÿkÿAÿÿêþÖþÙþêþÿ%ÿ8ÿLÿFÿ;ÿ*ÿÿÿÿÿ3ÿLÿpÿ•ÿ·ÿØÿñÿ$@YsŒ«®¨‘~sjgb_\TH=/**,=HYj†š³ÊÝî÷ÿ ÷Ø«s*éÿ«ÿ|ÿ_ÿOÿLÿTÿbÿhÿWÿ>ÿ ÿÙþ¡þþkþhþyþ•þ´þËþÖþÞþáþêþòþÿÿ5ÿZÿvÿ˜ÿ´ÿÍÿæÿýÿ=b†¢ÁÕæãÚÌÁ¼¾ÁÌÒØØÌÁ°‰ugTC/$ '5Nbu¶ÄÚé÷ü÷éÁ—YØÿ ÿyÿbÿbÿkÿvÿÿÿvÿWÿ0ÿÿáþÂþ·þ´þÅþÐþÙþêþìþçþáþÜþÞþìþøþÿ'ÿIÿWÿpÿ|ÿŠÿšÿ±ÿÊÿïÿCm”°ÁÊÄļ¾¾ÌÏØØÌ¹¢‰peQK@@8885/28@Teuš«°³®š{QÕÿ’ÿLÿÿõþÜþÙþêþÿÿ3ÿAÿAÿ0ÿÿÿäþÖþÓþÓþÙþáþïþòþòþìþäþäþïþúþÿÿ3ÿLÿeÿ„ÿ£ÿÅÿÞÿ!:Wm{~xmb\QTY_egge\YK@5/,,2:FW_sƒ”¢°¾ÊØàãëãÚʳ†\!Þÿ¦ÿsÿQÿLÿQÿeÿyÿ„ÿ~ÿkÿIÿ%ÿÿêþáþäþøþÿ%ÿ>ÿOÿQÿWÿTÿ]ÿeÿvÿŠÿ ÿ±ÿ¼ÿÂÿÇÿÊÿÊÿÍÿÕÿãÿúÿ$2:@::2=CTbxƒŒ‘ƒ~m\N=2!!*8Qj~š³ÇÒÝéÝÚÇ®g8ÂÿŒÿZÿ3ÿ"ÿÿ"ÿ*ÿ;ÿAÿIÿAÿAÿ>ÿIÿQÿeÿÿšÿ´ÿÂÿÅÿ¼ÿ®ÿ˜ÿ„ÿ~ÿÿ‡ÿ’ÿ ÿ¨ÿ«ÿ«ÿ®ÿ·ÿ¼ÿÊÿØÿôÿ'@Qbmmjj_\NF8,úÿïÿãÿÛÿÛÿØÿØÿÕÿØÿÛÿæÿôÿ$Kx«Ú#/=7,ÿéÏ«KÛÿ¦ÿvÿbÿ_ÿnÿÿ˜ÿ«ÿ·ÿ±ÿ±ÿ¦ÿ•ÿšÿšÿ®ÿÊÿÛÿãÿæÿÛÿÓÿ·ÿ®ÿ ÿ ÿ¨ÿ´ÿÂÿÐÿáÿéÿ÷ÿ*Fgš¨«¥‘~bQHHN\bmpm_WH@885@FQbs†¹à)HYgj\PB/Ý«p/ïÿ´ÿ~ÿWÿCÿ>ÿLÿ_ÿpÿ~ÿ~ÿsÿeÿTÿLÿLÿOÿ]ÿpÿŒÿ ÿ·ÿÇÿÇÿÊÿÂÿ¼ÿ¹ÿ¿ÿÇÿÓÿáÿïÿ$,=FTW\QNKCFCFQWbg\Q:÷ÿÕÿÅÿ·ÿ´ÿ¼ÿÍÿáÿFj‘¾ë@lŽ¥ª¥”xNë¶u=÷ÿ¹ÿ„ÿ]ÿAÿ3ÿ-ÿ0ÿ0ÿ*ÿ"ÿÿÿÿÿ-ÿ;ÿTÿhÿ|ÿÿŒÿŠÿ|ÿpÿeÿWÿWÿZÿeÿyÿÿ¦ÿ±ÿ¼ÿÂÿÊÿÛÿïÿúÿ$=Qes†Œ ¨°¶³¨‘uW:$!,FYpƒ—¢³Çã&K\ll\K/Ò b!Þÿ£ÿZÿ*ÿýþáþÙþÞþìþúþÿÿÿÿÿÿÿÿ'ÿ0ÿ;ÿ>ÿCÿCÿFÿOÿQÿ]ÿkÿ|ÿ„ÿ•ÿ¨ÿ¹ÿÊÿÕÿÞÿìÿïÿúÿýÿ$5@KY_eeWK:**=QexŒ¢Äà,Kdol\B Øb$éÿ¼ÿÿnÿTÿ;ÿ-ÿÿÿÿÿÿÿ%ÿ'ÿ0ÿ8ÿ8ÿ5ÿ8ÿ;ÿAÿCÿLÿTÿTÿTÿOÿLÿAÿ>ÿAÿFÿIÿZÿhÿ|ÿ’ÿ±ÿ¿ÿÐÿÛÿéÿôÿ:HYempspjbTH/ôÿãÿÓÿÓÿÐÿÞÿìÿúÿ!=Qx—¼ÚôîØ³e5Õÿ£ÿvÿFÿÿõþÐþ·þžþ•þ‡þŠþþ›þ±þËþÞþòþÿÿ%ÿ3ÿAÿFÿLÿQÿTÿZÿ_ÿkÿsÿ~ÿÿ ÿ®ÿÅÿØÿôÿ$! '/5@@=2!ñÿÞÿÇÿ¿ÿ·ÿ·ÿ¹ÿÂÿÊÿÍÿÐÿÛÿãÿìÿ!@mš¹ÏØÒ¼sH÷ÿÓÿ®ÿ˜ÿ„ÿvÿeÿIÿ;ÿ"ÿÿÿýþõþúþÿÿ0ÿ;ÿLÿ]ÿhÿ~ÿÿ®ÿÇÿØÿñÿúÿôÿãÿãÿÞÿæÿñÿ!'*! ýÿ÷ÿýÿ ìÿáÿÓÿÍÿÅÿ¼ÿ¹ÿ«ÿÿŒÿ„ÿÿ|ÿÿŠÿ˜ÿ®ÿÇÿôÿFp¾ØéîæÕ¶b/Íÿ ÿyÿ]ÿIÿ5ÿ*ÿÿÿúþìþçþçþìþúþ ÿ"ÿ8ÿIÿ_ÿpÿ|ÿ„ÿ„ÿ‡ÿ˜ÿ•ÿÿ¦ÿ¨ÿ®ÿ±ÿ®ÿ¹ÿ¹ÿ¹ÿ¿ÿ¹ÿÂÿÊÿÕÿãÿéÿìÿñÿæÿìÿñÿôÿýÿñÿéÿÛÿÐÿÂÿ¨ÿ‡ÿnÿ]ÿQÿTÿ]ÿbÿsÿ‡ÿšÿ«ÿ¿ÿÓÿæÿýÿ,Nj®Ìãùù㾌Wæÿ·ÿ˜ÿ„ÿÿŠÿ’ÿ’ÿ•ÿ’ÿ‡ÿ„ÿvÿnÿkÿsÿyÿŠÿšÿ«ÿ¼ÿÊÿÞÿéÿôÿôÿ÷ÿñÿæÿØÿÊÿ¼ÿ±ÿ®ÿ¹ÿÂÿÐÿÓÿÛÿØÿÐÿÅÿ·ÿ¦ÿ•ÿÿŒÿ•ÿ¦ÿÅÿæÿ=\pspbK/ *=\mƒŒ”¢®¼Ìæ÷ #2:7#ôذ†_5ïÿÐÿ·ÿ£ÿšÿ’ÿŠÿ‡ÿyÿkÿZÿIÿAÿ5ÿ0ÿ%ÿ%ÿ%ÿ-ÿ3ÿ8ÿ>ÿAÿIÿIÿOÿQÿTÿWÿZÿ_ÿhÿeÿkÿnÿvÿsÿ|ÿ|ÿ~ÿ|ÿ~ÿyÿ|ÿ|ÿŠÿÿ£ÿ´ÿÐÿïÿ$55:*ôÿìÿæÿéÿéÿéÿæÿæÿïÿ÷ÿ'F{¹ô2g‰œ—ƒ\,ñ¼‰Y2÷ÿáÿÕÿÅÿ·ÿ£ÿÿ„ÿvÿnÿkÿsÿ|ÿ‡ÿ’ÿšÿ ÿ¨ÿ ÿ•ÿŒÿ‡ÿ|ÿ|ÿ|ÿvÿyÿvÿsÿpÿsÿyÿ’ÿ±ÿÕÿýÿ$H\p{ƒ” °¾ÒÝãéà̹¨m_KC=:@Nbx‰š«¼Úÿ:Sr}ƒrS,س‰gC*æÿÂÿ˜ÿpÿQÿ8ÿ"ÿÿÿÿ0ÿAÿWÿhÿsÿ|ÿ|ÿyÿ|ÿ‡ÿ‡ÿ’ÿ˜ÿ ÿšÿÿ˜ÿ˜ÿ’ÿÿ˜ÿ˜ÿ¨ÿ¹ÿÇÿÓÿØÿÓÿÍÿ·ÿ£ÿ•ÿšÿ¦ÿÅÿéÿ5Tg{Œš«°¼¾¹³®¨¢¥¨¨°¹¼Á¾¼®¢”‰xg\@!Óÿ®ÿÿZÿ8ÿÿÿÿÿÿÿÿÿÿÿ%ÿ5ÿ;ÿCÿFÿIÿIÿIÿLÿIÿIÿAÿ;ÿ-ÿÿÿúþçþÍþ·þ¬þ©þ¯þ¿þÙþúþÿ5ÿIÿWÿeÿpÿ|ÿŠÿ•ÿ«ÿÅÿÞÿúÿúÿæÿÇÿ´ÿÿ‡ÿ|ÿvÿsÿsÿvÿsÿpÿeÿeÿbÿeÿkÿyÿ„ÿÿ´ÿÐÿñÿ''ìÿÅÿ’ÿbÿ*ÿýþÙþºþ¦þ˜þþŠþ‡þ‡þŠþþ˜þ£þ¯þ¿þËþÐþÖþÖþÖþáþòþÿ-ÿLÿkÿ|ÿ‡ÿŠÿ|ÿnÿ_ÿIÿAÿ;ÿ8ÿAÿCÿOÿ]ÿeÿkÿpÿvÿ|ÿ‡ÿ˜ÿ®ÿÂÿÓÿÞÿæÿìÿéÿæÿÞÿÓÿÐÿÍÿÐÿÐÿÕÿÞÿáÿìÿôÿýÿ,8:==:/*!úÿïÿÛÿÐÿÂÿ¹ÿ´ÿ·ÿ¿ÿÓÿæÿôÿ$$'!$$$$'*$!  $2@HQWWYYTTQNNKNW_ju‰®¶¼¼¶°« š——¥«³¶¹¹¶®«¢š””—š  š‘‰ƒxsspjg_TF2' úÿ÷ÿ÷ÿ÷ÿúÿýÿúÿúÿôÿôÿôÿôÿýÿýÿ÷ÿôÿìÿæÿãÿáÿÞÿÕÿÓÿÍÿÂÿ´ÿ«ÿ ÿÿšÿ ÿ«ÿ´ÿ¿ÿÊÿÓÿØÿÞÿáÿãÿæÿéÿïÿ÷ÿ $*5@FNQQNF=2'÷ÿìÿáÿØÿÓÿÊÿÇÿÂÿ¼ÿ¹ÿ±ÿ¨ÿ ÿšÿ•ÿ’ÿŒÿŒÿŠÿŒÿŒÿÿÿŒÿŒÿŠÿŒÿŒÿ•ÿÿ¦ÿ«ÿ±ÿ´ÿ´ÿ´ÿ´ÿ·ÿ´ÿ´ÿ®ÿ«ÿ£ÿÿ˜ÿÿŒÿŠÿ‡ÿ‡ÿŠÿŠÿÿ•ÿÿ¨ÿ´ÿ¿ÿÇÿÐÿÓÿØÿÞÿãÿæÿéÿñÿ÷ÿýÿ!!÷ÿôÿñÿïÿïÿìÿìÿïÿìÿìÿéÿæÿÞÿÕÿÍÿÂÿ¼ÿ¹ÿ´ÿ±ÿ±ÿ´ÿ·ÿ¹ÿ¿ÿ¿ÿÂÿÂÿÅÿÅÿÅÿÇÿÊÿÍÿÐÿÓÿÕÿÕÿÕÿÕÿÕÿÕÿÓÿÓÿÐÿÐÿÍÿÊÿÊÿÐÿÕÿÛÿæÿïÿ÷ÿ $$'''**,,28=@HNTY\\_\YTNF=5*!  ýÿýÿýÿúÿ÷ÿôÿñÿïÿïÿìÿìÿñÿôÿúÿ!$''$!  úÿôÿïÿéÿæÿæÿéÿéÿìÿïÿñÿñÿñÿñÿôÿôÿ÷ÿ÷ÿúÿýÿýÿýÿýÿýÿýÿýÿýÿúÿúÿ÷ÿ÷ÿ÷ÿ÷ÿúÿúÿúÿúÿúÿúÿýÿýÿýÿýÿýÿúÿýÿýÿ ýÿúÿ÷ÿôÿôÿ÷ÿýÿ  !$''**,**''$'****$úÿñÿñÿñÿ÷ÿ!5=FQT\YTQC=822/2,$ýÿýÿúÿ!!!$*5:HNWTWQK=/'!**$!úÿïÿæÿéÿìÿñÿôÿ÷ÿ÷ÿ÷ÿñÿãÿÛÿÍÿÍÿÐÿÛÿìÿýÿýÿ !2:8'ýÿéÿáÿãÿéÿ÷ÿôÿìÿæÿãÿìÿýÿ÷ÿúÿôÿ÷ÿúÿôÿïÿïÿéÿéÿæÿæÿæÿéÿúÿ'8Kbp{†‰~jQ8ìÿÞÿØÿÕÿÐÿÍÿÂÿÂÿÊÿÕÿÛÿïÿúÿ!/5=@@FQQY_\\N@:,'$/C\j~ƒ{mY:$ýÿ *58:82:FWpŒ” ”ƒpT8$ '*2@KYejs{~xug\H,ìÿÛÿÍÿÅÿ¼ÿ´ÿ¼ÿÂÿÐÿÕÿÛÿãÿãÿáÿæÿáÿéÿïÿôÿ'$,=FNNF2$ñÿáÿÕÿÐÿÓÿÛÿãÿïÿìÿéÿìÿæÿáÿÛÿÞÿãÿïÿúÿ !*8:==8:/!ñÿìÿæÿãÿìÿïÿñÿæÿØÿÇÿ¼ÿ·ÿ±ÿ¨ÿ£ÿšÿšÿšÿÿ¦ÿ±ÿ¹ÿÅÿÍÿáÿñÿ2KYbeb\NC2ýÿñÿéÿÛÿØÿÕÿÓÿÓÿÕÿÛÿØÿÛÿÞÿéÿïÿ÷ÿ*:C@:÷ÿéÿÕÿÓÿÍÿÕÿÞÿéÿôÿúÿ!'/2*'!ýÿ÷ÿýÿ  ýÿñÿìÿãÿáÿãÿìÿ÷ÿúÿýÿýÿôÿìÿáÿÐÿ¿ÿ®ÿ¨ÿ±ÿÅÿãÿ 2KYg\C$éÿÛÿÐÿÂÿ¿ÿ¼ÿ¼ÿÅÿØÿìÿ2FHNNNQNH8*ýÿæÿÕÿØÿÐÿÓÿÍÿÐÿÅÿ¿ÿ·ÿ·ÿ¹ÿÅÿØÿ÷ÿ/FWbeYH:'úÿ÷ÿ÷ÿ '5:==2ìÿáÿÕÿÕÿÞÿæÿ÷ÿ/282*ýÿñÿæÿáÿãÿæÿéÿñÿïÿ÷ÿúÿýÿýÿ÷ÿúÿýÿ5Kg~Œ‘~gK2÷ÿáÿÓÿÂÿÇÿÊÿÕÿæÿúÿ/8FCF=8*ýÿ÷ÿôÿôÿ÷ÿ***' ÷ÿïÿãÿÛÿÞÿæÿñÿ$/5//$ýÿ÷ÿúÿ!*2=CFH=2ìÿÕÿÍÿÍÿÓÿÞÿñÿúÿýÿ /CQW\\__ju†—¨®®¢”ƒseN:/'$!ýÿýÿ!8K\p~†††pge\THF=88,'úÿôÿïÿïÿúÿ$CQ_jmsx~‰”‘‘Œxj_TQQY___TK@8* ýÿýÿ'@HTTTH@=@HYgux{sjeWQNKC82'! ,5@CHHC=////5=HNY\YK8ñÿæÿãÿéÿýÿ*2582,$!$**/2:8:@=85*! ÷ÿñÿìÿéÿãÿæÿæÿìÿïÿïÿñÿôÿñÿéÿïÿñÿ!'*',$!!$!!!úÿôÿïÿìÿñÿôÿúÿ÷ÿôÿïÿéÿìÿñÿôÿýÿ$'*'$5@KNC5ÞÿÅÿ®ÿ ÿ˜ÿÿ’ÿ˜ÿ£ÿ´ÿÂÿáÿ÷ÿ*F_ux~xsgWK=, ôÿãÿÞÿÞÿÛÿãÿéÿôÿýÿ !/8KWg{xubQ:!5QYmmm\QF:/*,28=F@@@FFNQNK=,÷ÿéÿæÿéÿìÿ÷ÿúÿýÿýÿúÿñÿñÿæÿæÿæÿìÿ÷ÿ ôÿÞÿÂÿ«ÿ£ÿ˜ÿ ÿ¨ÿ·ÿÅÿÐÿÛÿáÿìÿìÿúÿ! ÷ÿïÿáÿÕÿÅÿ¹ÿ±ÿ¨ÿ ÿÿÿÿÿ˜ÿ’ÿ•ÿ•ÿ¦ÿ¹ÿÍÿéÿôÿ ôÿéÿìÿÞÿÛÿÐÿÐÿÊÿÇÿÇÿÊÿÊÿÅÿ¿ÿ·ÿ·ÿ±ÿ¨ÿ¦ÿ£ÿ ÿ¦ÿ¦ÿ¨ÿ ÿšÿ’ÿŠÿŒÿŒÿšÿ¦ÿ¨ÿ®ÿ¹ÿÇÿÐÿØÿæÿìÿýÿ!$$,/2/**!éÿÕÿÅÿ¿ÿ¼ÿ·ÿ±ÿ®ÿ®ÿ±ÿ¹ÿÇÿÛÿñÿ *5@FHHNF2 ôÿÞÿÐÿÅÿ¿ÿ±ÿ±ÿ·ÿÅÿØÿæÿôÿýÿ ýÿñÿôÿýÿ  *5=:/ ÷ÿãÿÓÿÐÿÕÿãÿñÿýÿìÿéÿéÿæÿôÿ$*58=@=8*úÿáÿÊÿ¿ÿ±ÿ±ÿ·ÿ¿ÿÊÿÕÿÛÿÞÿÕÿÍÿÂÿ´ÿ«ÿ«ÿ´ÿÊÿÛÿ÷ÿ '5@HF8/$ýÿýÿôÿéÿáÿÐÿÂÿ¹ÿ·ÿ¹ÿÂÿÕÿãÿôÿ*:KWYWNC5ïÿáÿÓÿÓÿÍÿÓÿÕÿØÿØÿØÿÞÿÞÿãÿæÿæÿéÿñÿýÿ!,!**8:C@=8/,$ !',,558/,!!*8KQ\WWN@8' '5=K\j{ƒ‰”—š”ƒxmegg\\NNF8/!/FQ\bjgjsu{~~xpmgbYTK=/ýÿúÿ÷ÿñÿúÿúÿúÿ $,:FFC8$÷ÿôÿôÿýÿ ýÿ÷ÿôÿ÷ÿúÿ !!*'$$ýÿñÿéÿãÿáÿæÿñÿôÿúÿúÿ÷ÿúÿýÿýÿýÿñÿïÿñÿ ýÿôÿúÿôÿñÿæÿæÿãÿìÿýÿ $*/÷ÿ÷ÿ÷ÿ ,HYpƒŒ”‘Œxg\QC8/*$$!$*,*ýÿìÿÕÿÍÿÇÿÐÿáÿôÿ,FW_NF5$/::=8/'!ýÿ !'/!!ñÿãÿØÿÞÿéÿúÿ!ýÿñÿ÷ÿýÿýÿ2=F@,ñÿØÿ¿ÿ±ÿ®ÿ´ÿÊÿÛÿñÿ ýÿôÿìÿáÿÛÿÓÿÊÿÊÿÅÿÂÿ¿ÿÂÿÍÿÕÿæÿéÿôÿïÿôÿæÿñÿìÿïÿïÿñÿ÷ÿïÿÛÿÅÿ·ÿ£ÿšÿ•ÿÿ¨ÿ´ÿÇÿÓÿáÿãÿáÿãÿáÿáÿáÿÞÿáÿÞÿØÿÐÿÐÿÇÿÂÿ¼ÿ¹ÿ¼ÿ¿ÿÇÿÐÿÛÿéÿïÿúÿúÿñÿìÿÞÿÕÿÕÿØÿØÿãÿãÿéÿéÿæÿáÿØÿÇÿ¹ÿ®ÿÿ’ÿšÿšÿ£ÿ®ÿ¹ÿÅÿÓÿÛÿÛÿáÿÞÿÛÿÛÿáÿãÿñÿ!2CFC8!æÿÕÿ¿ÿ´ÿ´ÿ·ÿ¿ÿÊÿÐÿáÿéÿ÷ÿ$'! ýÿýÿïÿéÿØÿÐÿÓÿØÿáÿìÿôÿýÿ!$,88@CCKHH:,,!ñÿæÿÕÿÅÿ·ÿ®ÿ®ÿ¹ÿÅÿÕÿéÿ÷ÿ*,:CHN@=*ýÿéÿáÿéÿúÿ'2,! $$$÷ÿéÿÞÿÛÿÓÿØÿØÿÞÿÞÿáÿãÿéÿñÿúÿ*/*ýÿýÿ÷ÿ÷ÿôÿïÿéÿÛÿÞÿÞÿÛÿØÿáÿáÿãÿìÿïÿïÿïÿïÿïÿñÿôÿïÿ÷ÿìÿáÿÕÿÐÿÇÿÂÿ¿ÿ¼ÿ¿ÿ¿ÿÊÿÕÿÞÿñÿúÿ ýÿñÿáÿÓÿÍÿÂÿÇÿÊÿÊÿÓÿÓÿØÿáÿæÿïÿ÷ÿ ýÿúÿúÿýÿ $!! ýÿ÷ÿýÿ$$  '/5=82*$**288885522288@N\egjbWC=/'',FYm†ubT@:/2855/!!,Cb~«««šŒ{~~†‰‰{gT@825:82*!!5HWegbYTFFHHNNQKK@5,!'5=FKNHC:2! $'/:KWWTC5$!*2=KTTKC:85'!!$$*'/8:@@2$úÿ÷ÿ÷ÿ!*''*5@F=5,'$*825,'!!!$$!!úÿ!$$$!**//*' '2CHKTTF:2,*!**,,'!!'*,58:@@=:22/*!!$!*252/,,,'''$$$!!!!!,,,2:HHKKC5''!'/8FHKN@,!5Q_geYK=,!úÿ÷ÿñÿñÿúÿ÷ÿïÿìÿïÿñÿúÿ úÿìÿáÿØÿÍÿÇÿÅÿÅÿÂÿÂÿÇÿ¿ÿ¿ÿÅÿ¼ÿ¼ÿ¿ÿ¼ÿ¿ÿÅÿÅÿÊÿÐÿÓÿÓÿÓÿÍÿÓÿÐÿÕÿÞÿãÿéÿéÿñÿ÷ÿ÷ÿôÿéÿÞÿÕÿÐÿÐÿÍÿÕÿáÿìÿôÿ÷ÿúÿúÿúÿôÿ÷ÿñÿïÿéÿæÿÞÿÛÿÛÿÓÿÐÿÍÿÐÿÐÿÓÿÓÿÍÿÊÿÅÿ¿ÿ¹ÿ·ÿ´ÿ¹ÿ¼ÿÅÿÓÿÞÿæÿìÿïÿìÿìÿìÿìÿìÿæÿæÿãÿìÿñÿ÷ÿýÿúÿôÿïÿìÿìÿãÿãÿØÿÊÿÂÿ·ÿ«ÿ±ÿ®ÿ¼ÿÇÿÇÿÓÿÐÿÍÿÐÿÍÿÊÿÍÿÕÿÕÿáÿæÿæÿéÿéÿéÿìÿñÿ÷ÿýÿýÿñÿéÿáÿÞÿáÿãÿéÿéÿéÿÞÿÞÿÓÿÐÿÐÿÓÿØÿÞÿéÿñÿýÿýÿýÿýÿ$$!ýÿýÿ*5@FC=8,$úÿñÿïÿñÿúÿ$*/2,'!$$$ñÿñÿéÿìÿïÿôÿ÷ÿ úÿúÿýÿ÷ÿúÿ $$'$æÿØÿÂÿ«ÿ ÿ•ÿÿ’ÿ’ÿÿ£ÿ£ÿ«ÿ±ÿ¹ÿÂÿÞÿïÿ  $/8=5* !'//,$!*2/*æÿ¿ÿ•ÿsÿZÿ]ÿeÿ~ÿÿ¹ÿÓÿæÿúÿ!=Y~ ¶¼«†b2 @\pujYK@HYu‰¥®¥—sHôÿéÿéÿýÿ5HWWWNKHKNYp‘ÄVªü9P?öuÌ >ÿnþ¯ýþüSü¹û:ûÊú‰ú{ú¼úHû4ülýÖþ\â6R¥ôÍhÐøÌ‘nÿþâýžýªýþ„þÿ«ÿ*‰ãB»GßiºžûÒ,GþoüæúòùºùIúdûÑüDþbÿ!ÍÿCÿ·þZþGþvþÅþÿ%ÿÿÿ3ÿ¿ÿÚw`EÌ©µèjФØÿ0ÿçþÂþ‚þþ6ý)ü,ûmúúNúúúöûûüÔýGþLþþÔý¯ýâýfþ>ÿNdd<í‡5ã¢YöG9§‰%4Oÿ›ý?üQûÂú—ú¨úñúVû×û^üåü^ýÀýþ>þhþŠþ±þÜþÿpÿØÿQÊ=‘¸Ÿ=„ÿUþýãûÛú-úçùúšúgûgü…ý·þæÿ)€êeà?f 8 ˜ ø  åŸTߟbÿÜýªü¨ûæúbú8ú>újú¥úÐúæúéúæúéúûgûîû™üaý+þòþ«ÿWù‰#½UêR›¼¼®•©Ó8Q@éZ‚t4Óÿkþý«ûjúRùRøƒ÷ÚöVööØõÕõ÷õBö¶öJ÷øêøõùûdüËý>ÿ¹#|«®‰)¤í# óѲŽi:ü»j¿WÞR¯çþôÇÿ‡þ9ýîû«úùnø}÷¾öö¹õ„õvõ®õ$öÚöÉ÷íøúbû–ü¬ý©þ„ÿN Ä…?ò›*—à ÿÄmôW“»à\Ûÿ|ÿLÿ-ÿÿúþÅþvþþÀýfýýëüÌüÌüèü ý<ýwý²ýøýDþŠþÞþ*ÿ|ÿÇÿT‰°Ìà÷\§ó?l…€^#ृ{‘¾ðë‰_±ÿÿ“þ+þÖý“ýBýèü†ü#üÉû‰ûpûrû—ûÇûÿû:ü†üóü‹ýXþFÿ\}“ˆ;«Â;Ë`Ëd+àoÒWÿ¡þõýfýþü§üdü.ü üüü[üÌü[ýþý¡þ3ÿ¦ÿæÿôÿÓÿ¹ÿ¨ÿ´ÿæÿC¶:³JX4ü»‰ro†”™†V‡ÿÿÂþþAþ þÙý§ý…ýzý‹ý¬ýäý+þ|þ½þýþ-ÿ]ÿÿìÿH¾EÄ7…¡œi¾dñàÚÚØÄ«ƒW'Þÿ¼ÿšÿ|ÿLÿÿÖþ›þcþDþ;þ>þXþ|þ©þÐþøþÿÿ%ÿ5ÿ]ÿ¦ÿ™ð ð§PÚÊØîÿî³\ìÿ|ÿÿºþyþUþDþ6þþøýÀýý?ýýý ýqýõýþÿ«ÿj¨ÕNŸî7fi4Ýr ¾«¼î,\{oS#÷Ͼ¹¹°ŒQýÿ˜ÿ*ÿÅþhþ0þþþ þþóýÈý‹ýGýýýXýÆý`þÿ¿ÿQ¹ü ÷ݾ¨¢ÁjàU¡À§S×PÏp=8\”Êéæ¹u$Óÿ‡ÿLÿÿúþÞþÂþ¬þŠþvþUþ6þ"þþ+þLþ“þÞþ-ÿ~ÿÅÿQ”ã,}Æ ÔŸoSSu§àîœ)¨*Âÿ~ÿWÿOÿFÿ8ÿÿÞþ‡þ+þÖý¬ýÀýþvþøþ~ÿáÿñÿ¹ÿ‡ÿeÿTÿbÿŒÿ´ÿØÿìÿæÿÐÿ´ÿ«ÿÂÿúÿN¼,‰Éϳx@üÌ«”\$ÕÿvÿÿÈþþvþþ¦þçþ>ÿšÿïÿ2T_Cñÿéÿ \ÏNÆ&UU&Ìu#ôëN¥?P1à€®_!æÿ´ÿnÿÿ˜þþ¤ýBý ýöüýJý“ýÔýþ6þ`þþÐþÿ~ÿØÿHQ=ìÿ¹ÿ ÿŒÿ•ÿÿ·ÿáÿ_«VœÉ×»{/ôĶÁÕéÕ¢=¼ÿ8ÿÐþ˜þ˜þáþOÿØÿ_ÄôùæÝë 4aul@ÚØ}½XÈøß‚ûXµ&®TôÿÓÿ¨ÿ|ÿAÿÿºþhþþÈýýiýUýBý.ýýöüÑü§ü†üzü‹üÃüý}ýþ‚þúþZÿ£ÿæÿ/ƒÚ/^la4ù¾‘—Ê^œÆÌªSØWÓÿnÿ0ÿÿ5ÿvÿÇÿg®àôîʱÿ>ÿÙþ•þ‡þ·þ%ÿšÿ$‰¼¹ƒ,Íÿ„ÿbÿpÿ£ÿñÿKØÿëÒ¶¨¥°¨W±ÿbÿ0ÿ*ÿ8ÿWÿpÿnÿAÿêþkþäýlý4ý9ý‹ýþ©þ8ÿ´ÿHejpsxŒš ¥³ÒgÔ?žÔΜ9Éd!,^œ¾¾ŽHë‰:ãÿÞÿìÿ*@\÷^Ô<‚™to¥Ðÿõþ6þžý<ýýý+ýcý§ýäýþ þçý¡ýJýâüˆü7üüñûöûü ü.üHülü­üýoýâýXþÂþÿTÿ|ÿ£ÿÐÿuØHªöâŸdH^¥Ž[‚qJU©õ ÓM‚œ¼ýÿnÿÿÓþžþZþþý–ý9ýý9ýÑýÈþ@Eê–Á°£ÿÜþvþ‡þêþyÿôÿ'÷ÿhÿþ¤ýÉü&üÒûÁûæûüBüYüYüBü1ü4ügüÉüXýêý|þçþ'ÿOÿhÿvÿ£ÿæÿ: ù//¾x\uÏSèrÉöþøRËk¿:ŒŽQÛC·É»¨ ÿ¿þþºý¯ýóýfþäþQÿ˜ÿ®ÿ•ÿ_ÿ8ÿ'ÿOÿ«ÿ*°SY)ÏeïÿŒÿLÿ%ÿÿúþÞþ·þ‡þOþ þÀýiýþü‹üîû=û{ú·ùù…øDøAøø ù´ùhúû¢û üPürüwü}üŽü²üþüfýóý“þCÿ¾lª+¤ e±WÊjBRt •  , ¹ Ê c Æ$®wŽÝVÏ8ŒÿÙþGþóýçý0þ¡þÿ]ÿQÿäþþ#ý:ü—ûYû†ûüÔü¬ývþÿ®ÿpÌ:‰’ÿJþÌüVûú;ùÑøßøRùìùúûbûûÒû1üÉüžý˜þ¦ÿ† !¾ýÿÿøý ýlü,üKüµüBýÑýOþ½þ"ÿ˜ÿ2Eѱªž K – U o ß ¾ ' [r¦ÌÒ’ÿ'ÿÓþ•þvþ‡þÍþ3ÿ¿ÿNà^ÁMŽâOÖeއ½»Ø2Âÿ|ÿCÿõþvþºýÌü¾û³úÊùù“øGø.ø9øXøŠøÀøþøAùŠùïù_úÛú_ûÒû1üuü¢üµü»ü²ü­üªü»ü×üýwýäýXþÍþ>ÿ¨ÿ®‰Ô©ö˜ : |  | % $nEÅÿÐþOþþýÎýžýqýfý™ýþÂþŠÿ/š”$FÿAþXýÚüÝücý6þ"ÿìÿWKãÿ8ÿ“þþþý%þqþ¿þÞþ½þXþªýÔüëû ûIú®ù;ùùùeùúûEü–ýÐþÇÿ\xeÿ‡þ½ý ý¾ü¤ü¾üðü4ýfý‚ý“ýºýþ¬þ„ÿƒŸÑ*¼œÅ  wxÄ &4 ÔŒíK¼Ä€ÙÃ9ƒàsNF!ÿ•þ(ý«û’úhú†ûþŸÊá 1 O ~ó Ý ž ‹Álpþýûè÷Âôòðçî®î'ï ð ñóñ¡òóZó¬óô«ôYõ÷õYöoö4öÏõpõNõ õaö¡÷"ù¹ú4ücýJþïþsÿÌînvóØ í ÷©Äu¾ì1½ u]èËþÆýÃü«ûú„ùáøÑøUù_ú¶û ýþ]þõýûü¾û’úÂùeùù2úNûªüþhÿš­™O©¡3tuHÿþ[ýóü×üëüýXýžýâýþ`þ½þÿhÿ_ÿòþþýüdû/û~û?ü9ý0þçþÿäþRþýÔü^ü^üý`þi Lô»?zpB]- N3±ÿÇÿÂÿ*ÿÔý×ûžù‹÷öYõ_õöîö»÷ø×÷S÷÷­÷›ùâül­ö ”ðØ\¼;üY E6ýøAóïì8êÖéÍêÎìsï4ò˜ô@öüöâööáôqóùñxðï“í.ìãêÓééíèné«ê–ìïÑñ©ôl÷úoü¬þÄêQBÕ ‚þüF ƒ"q#ë"ñ ÆÎ Æ¡^ á Ë ¬4=ê¢Èþ¡ý[ýäýýþQlóåNx‡ÿ¦þµýÀü°ûú`ùOøœ÷Ž÷Røáù ütþÇž´á(åeýþõýDý×üŽü7ü¹û û@úù ùËø¤ø[øµ÷”ö÷ôó&ñšïÖî÷îÿïµñÖó öø®ù¼úEûŒû¹û,ü ýþæ(.» KsÃØpFg<tÞ S>º‡ñ,l_%@hþ:ü ûÞúYûèûÒû~úÜ÷ZôÒð;îqí÷îóDùÝ™> Ì­ IÆÇz  påþ¾û±ùø`ø ùeúü§ý˜þ›þºý&ü5ú+ø,öeôçò¸ñ°ðÍï ïîvîÞîïŒðjñ òGòòHñHðyïbï—ð|ó]øÿù*‰N Œ!ÿ – ÇÍ– ¬ JGõ± ´ –g¶vþ+ýóü–ý£þyÿ‡ÿ“þ¸üúqøóö/öö=ö—öÏöÏö¥ö—öóöû÷©ùÌûþ2ĤÀB†÷ã€Ë’oþÛœ|âãÅÿAþ1ü˜ùÄöôòñ/ñJòô7ö.ø¦ùpúŒú8ú·ùvùäù@û¸ý,N’ q ‰…JµÊÔ L ×B¥üÑ“º ŸØÿ9þýµüþü¬ýJþ]þ…ý¹ûRùóö=õ£ô2õÚöhù‘ü!Ü¢V ýƒ±+y9=Šq§ö"þ±úÑøXøùZúèûPýDþ¯þ±þnþ þˆý¸ürû„ùëöÐóuðRíÇêéDèRè éê5ëì­ìí¡í´îÕðkôžù*d];J%º4  % N.ö| Å ­ ! Û DÛÿ©þþÿ•ÿ‡ÿcþü ùÏõó1ñbðð¾ñDóÊôéõœöÿöa÷ ø0ùû“ýÁRë Ï ·Ànê z .  × u Õ    ë”ý02ÿóüôú`ù?øˆ÷#÷åö³ö‰öSöüõ~õÓô ô`ó(ó©ó*õ²÷ûÿÎÛ²HÍnÖk2Ψ y•nu A cJdó.°¬ý›ù$öÈóÈò0ó£ô¥öºøúÿû&ý"þýþ¨ÿñÿ¦ÿ˜þÃüFúŸ÷QõøóÖóéôñöyù)ü¡þ¨Bˆ¦Áãóߊ È | ™- ;ÿ½ýŽüŽû¶úïù"ùfø»÷V÷X÷í÷3ù$ûˆýSï¦`6Yÿëü7ûZúú‘û^ý•ÿϬïxjìbõÑò8nRºÀ¢®N¥¸cW)wíz1W3eÿGþËýÙýþcþfþþoý¤üèû~û—û4ü9ýqþ•ÿuü/¶=Åÿ3ÿþ¸ýÑüñû@ûØúÐú)û×ûÆü¸ý•þLÿÊÿ,~ÚE×–iFšñüÄ_ÓIÅUø“)œ ~Ðÿ¿ÿÂÿÊÿ¼ÿ|ÿ ÿkþ¬ýÝü ü†ûûÛú¹úúsúNú2úCú—ú/ûüý þøþ±ÿ8x‰¨éj) ø´$*ØDнüSÊYñÿ•ÿ-ÿÅþcþ þºýýfý^ýaýRý(ýÉüYüèû€û2û÷úÕúÄúÐú û€ûEüXý¦þVi%Š˜tD 9i›½ÎÀ¡wU??9.ø‚ÒàÓÿ´þ¸ýèüdü.ü?ü†üèüUýËý;þ¬þÿ~ÿìÿbÏ=™ð?€Æû6`“¦ºÜ D| bç<o™Ø,£ÿ3ÿËþ`þÈý ýüìú´ùøª÷ ÷#÷²÷Îø\ú7ü%þãÿBE ‰ô==j”¥TÓÿÅÿ\?y^jpÿÖþDþÑýaýðü†ü.üü.ü”ü<ýþýþÐÿm¼Ê°ƒps”Ìÿù¶\ìÿx&îµG‚XÉù$yÿÿïþòþìþ£þõýÉü\ûÙù¤øû÷ ø-ù'ûÈýǬ¢9åÝhßzg¢sÿÖþ-þýýðü4ýûýAÿÄGt(Fç3a¥)ù)2¥>ÿhþ¯ý?ý(ýXý½ý0þ¦þ ÿOÿ|ÿŒÿ£ÿÍÿ'š)°)‹ÆÜÑ¡d+ùÚĵŸ€PÇ2ÐÿFÿŠþ“ýzügû—ú>ú¥úëûþ¶Š¸^ë€|M\ÞþßýMýåü†üöû@ûjú®ùOù ù®úiüŠþ¨t› ´É‘j~ÿýþÓþõþZÿáÿ~»f(ò´T¶ÁxÖß§Pìÿ›þ}ý–üôûšû—ûàûYüûüªýXþêþLÿ|ÿÿnÿ_ÿ_ÿ~ÿÂÿŒô7=îT„ÿ©þûý¤ýÀýZþsÿÚJ;e JiŸÿ4¥d}^&èÏüoÈ00¡“vÿÔý€üû@ûYû¶û.ü§ü ý?ýcý…ýËýJþýþÓÿ¨SÁݰ=ÄW!N—æ/\oolr­ˆž-·3œüNu]ÿþuüÍúGù%ø¯÷ø-ùüúý-ÿÁ¥Ä=Qbÿ¿þžþÿãÿãÆdœz Ï»ËÂÂxÄ’ïê§aFvÿòþ¯þ¡þ·þòþ5ÿÿÊÿW¥àÿî—-ÿþåü°ûšúÐùcù]ùºùhúYûoüˆý“þyÿ@àuùzçD··›fÃ[åYÁ' ÿCÿ-ÿvÿ)·Ón¤¢”¹ÿ%ÿçþáþúþÿ%ÿÿìþ½þ´þçþ]ÿ¶V³Æ—& Íÿ¼ÿÞÿ!m¥Äʰ‰x¹‹óEfGö}÷{$ìÿÊÿ¿ÿÂÿÓÿáÿìÿãÿÐÿ®ÿ„ÿ_ÿ%ÿÙþþ9þêýžý^ý9ý&ý(ý4ý?ýJýBýJýaý“ýþ±þ¨ÿã<ˆ«b³š-’ûkøŽ#¢N ÿÿ•þ`þnþ±þÿZÿ‡ÿ~ÿ>ÿÜþZþÃý#ýƒüöû†û5ûû)ûpûüû°üý|þyÿxo9Ô6R3Ü^Ì:¶\$úÿúÿúÿ÷ÿéÿÛÿÊÿÅÿÐÿ÷ÿ,pÁ^™ÉÔÄœKÕ/vÿ´þþýcý‹ýþÐþ¿ÿ®dÆÌŽ&³e2'8F@$ôÿñÿ*† °<€z Pp„ÿºþþ½ýžýªýÃýÔýÜýêýûý(þqþäþ„ÿC°7‚§¡‚S+ðÔœPî~¦ÿQÿÿÿÿÿÿúþÂþtþþ²ýwýfý‹ýÎýþ;þ-þðýˆý#ýÚü×ü#ýÈý©þÿx,ñ{ôÿÿ•ÿéÿ~)¾#󵎗ë“]>ì;-·õ C’ÿòþhþâýJý²ü#ü¨û_ûKûmûÄû?üµüýXýfýRý1ýýýUýÆýcþÿÇÿ_Ú7†ÉfËRÖW´ää¼vºRÜM¢Á¿ÿ±þ²ýßüMüüSüÝü™ýDþ½þÜþ´þXþÜýtý.ý.ýfýÀýþZþtþfþOþAþcþÅþnÿNN7çDJœ#Ì™‰™ª°”\¥Q $\—ÌØÄ8Þÿ’ÿeÿ]ÿ|ÿ«ÿÞÿ÷ÿÇÿyÿ-ÿøþÐþÖþúþ;ÿ•ÿãÿ,KYH*úÿ¹ÿnÿ"ÿËþyþ-þþýäýõýAþÈþ|ÿ5Ø2B /Ûÿ·ÿÍÿjÒ2”Ú a¤û`´ïõ´J½lÌKôÿÊÿ¼ÿÍÿØÿéÿúÿýÿýÿ,T{=Íÿ5ÿ“þøý‚ýJýPýýÎýþOþhþfþ]þhþ¦þ5ÿ)G6á* ¡€þ°g¨"ÿ(þ<ýˆüBü}üGýþáÿ#^+ƒ¥Ðÿ>ÿÿÿQÿ„ÿ˜ÿkÿÿ‡þþªýªý þ¿þšÿp!—ÉÏÁµÄ lÑ"M<íl×Vî¶«¾æ ô¾p'éÿÅÿÂÿÐÿæÿæÿãÿÅÿ’ÿQÿÿÂþŠþhþ`þfþkþ|þ‚þ„þþ¦þÖþÿTÿ|ÿÿ_ÿÿÂþvþ>þLþ£þOÿCSP`?½üH¨ÿ;ÿ ÿÿ"ÿ;ÿ]ÿyÿ ÿØÿ* :×U¤žJªÌÊÿÅþûýzýGýqýÖý`þõþ„ÿéÿ,Qm‘ÌuÆ Ì{)ݶ¨¶Ý!,ô϶¶Çà÷üã°mÐÿÿbÿCÿ'ÿýþÙþ¡þZþþÜýÑýþýZþÞþsÿìÿ:H£ÿ-ÿÂþ„þtþ‡þ¬þÐþòþýþúþÿ8ÿ ÿQ:?9Š´sáB޼¨¹ÚùùÝ¥b$ïÿìÿïÿáÿÅÿŠÿ8ÿÖþ|þ>þ"þ9þ|þäþWÿÍÿ*_jW,ôÿ¿ÿÿŠÿ„ÿ‡ÿ’ÿ•ÿÿ„ÿ]ÿÿ·þ3þýÌüü—ûNû_ûÚû²üÆýøþ÷ÿ®ùãš=ôÿ$xÌ Ú¨”¾2ÔžMÅážJlšæÿhÿ*ÿÿ'ÿ>ÿbÿŠÿÅÿpñjÒ#?¾)s´ÿÿþDþ(þ+þLþþÈþÿvÿÐÿ2Œà2o—¢”rE㳉Q¨ÿÿcþ¯ýý‘üSü^ü¸üMýþ½þOÿ˜ÿšÿ]ÿòþþ%þûýþ+þkþ¦þÓþøþÿ5ÿkÿÂÿCé—EÎ%RU3Æ™iEó×»œƒjdr‘ª¾»”,‰®ÿ±þ¤ý²üñûpûHûpûÚûoüýºý;þ¡þõþ;ÿŒÿ÷ÿx¥&}ž™o ¸7¹5¿ÿZÿÿÐþ·þËþÿWÿ´ÿôÿÐÿWÿ¡þÃýÚü üdûúú¹ú®úÄúôú5û€ûÝûHüÑüzý3þòþšÿ$³¹ ƒbTm—à)€àJ¸0½k/ú°7zdö)$òƪ¼‡ÿ;ÿÿÙþ£þkþ6þþþUþºþ8ÿ´ÿF2ØÿOÿ¬þþýýÚüÆüÚü#ýˆýþÍþ±ÿ®¾ªR–G…d©þwý‹üôû¢û‘û­ûàû&üzüëüzýþçþ¼ÿŒ4­âÏ}ùbÊÿTÿÿäþõþ-ÿpÿ¼ÿK”ãPâ–fI$àg­¢H¥ÈθµÒvÿÿÍþ±þ´þÐþýþ>ÿÿÊÿHu—«¢KÕÿ¦ÿ‡ÿ„ÿÿÍÿ_®ü&2ÄQ¼ÿÿkþÀý#ýˆüü‘û5ûÿúîúûNûÁûMüíüˆýþ„þÙþÿÿýþÖþ›þ]þ-þþóýøý þ6þtþÈþ0ÿ´ÿ@ÌN³<a‹ÑOò´x!”¸{ÛäÀ“}¥Õÿ¹ÿ¼ÿÅÿÍÿÐÿÕÿéÿ 5T\8áÿQÿ£þõýqý?ýoýûýÙþÓÿ¾gµ°VÝb÷ÿ±ÿŒÿsÿQÿÿ¯þ9þÀýPýý×üèü.ýžý%þ·þ8ÿ¹ÿ*‰Ú ù¾g¨ÿ]ÿ3ÿÿ0ÿWÿŠÿÊÿ=‘ôlåSÉ6´IòQèPi uW"/¶—¹ñ)Ø£ÿÿ•þõýMý–üùû¢û°ûSü‹ýCÿ2 ye³é(4PŒÇÿòþûýâü¾û ú¬ùþø¯øµøøøRù©ùòù!úNúeú•úàúEû¾û:ü™üÝüùüþü ý1ýˆýþºþyÿ5Ï&KN@P‰ó–`W\oa ¬   ¯?/ýÀˆuƒÇÿ0ÿ¡þþfýÉü1üÁû—û¹û,üßüµýyþÿeÿ„ÿ]ÿÿÈþ‡þyþ›þïþZÿÊÿ*p”¥\@!Ûÿ¦ÿeÿ'ÿáþ£þyþkþþ´þÿbÿÇÿ 'ØÿyÿÿÂþ¡þ´þòþOÿ«ÿïÿØÿŒÿ>ÿÿêþÿ]ÿÿBº=ŸÃ“ " äD:ãh߉p«ÿ-ÿÐþfþÎýùüùûôúúùùìù¶ú³ûœüPý¡ýºýÃýþý˜þÿøú•_Ê›v0¤¤ÿ§üNúUø÷ƒöÒöÌ÷6ù±úôûÑüDý[ý4ýèü†ü ü­û=û¼ú$ú„ùíøˆøqøÈøù¿ú7üÀý>ÿ††MânýCëÓ ¨ < OÎÀ9[ E  Þ ¯€m\R<¾sÿUþý(ý?ý¤ýLþÿšÿñÿýÿ·ÿAÿÂþAþËýMý°üùû2ûeúºùcù‡ù*úNû¸ü0þ|ÿT®†ìÿÿ9þ}ýùü²ü–üƒüiü.üîû«ûuûbû~û°ûàûëûÇûbûÇúúùAùWùÐù£ú°ûÉüÃý‡þÿTÿ~ÿ±ÿ ¨ŸçEùy N Œ T ˜ k ÚO¸‰ÕŒ¢šs Œÿÿ½þþ‚þyþJþÈýèü³ûTú(ùtøøsù:û¯ýg/¸¤J?öH/©É¹Åþ+ýüŸû¾û[ü4ýþÙþ>ÿCÿçþ]þºýýdü¶û÷ú-úkùÅøOøø?øºøsùFúû—ûèûüæûÁûÉû&üý¯þñ´œL g É i q  j s > ç…QT«Dý©+t”®Ûÿ5ÿÍþžþ‡þtþ9þÆýý&üHûúúÊùÊùõù>ú±ú7ûÇûoü4ýþìþ®ÿF ³W*5‘³?¤Ëœ+”ÿsšÿ"ÿþ¤ý¢ü”û£ú÷ù®ùÊùIúûÌûwüóü<ýcýlýzý²ý-þÿKÝŠ*†uß²î¨G°pÿºþžþÿ¦ÿN«¥@˜ÿÐþ(þÀý¡ý¯ýÈý¯ýaýÏü ü†û7ûQûàûíüXþÁR’jØñññ @aC«Š gÛÿ¬þþßý%þ¬þ-ÿ‡ÿ’ÿhÿÿ¦þ3þÆý?ý–ü¨û„ú6ùâ÷°öÕõgõ~õö÷Rø›ùÐúÝûÃü¤ýºþ5]¾ê• ” Ì 8 Ja«qßþ¦›†àÖo>ÿÖþ£þ|þ"þ[ý4üàú£ù½øJøløùú7û=üýý½ýçýþ„þ;ÿ:{â;mQà )Ì—g7ú’R¡³Êæÿÿ6þ}ý×üSüëû¨ûƒûuû{û‘û«ûÁû¶û‘ûHûæúúú¼úmûˆüóý„ÿ÷™¤MÉllóí3{{öÕ/õí)»‹j†„ÿ0þ»ü_ûeúõùúúrûMüýýíý(þcþ¦þçþÿõþ©þþ^ý–üüû­ûÒûgüUýqþ’ÿšj}çJº*’ÊÈvß ,vÿøþ¡þcþ;þþÆýtý4ý ýýUýÔýþhÿ=éB=Ý=ÿËþAþþþ“þWÿK2ùˆÉÈ)ÉjÏŒF¹ÿŠÿÿ¹ÿ5îÝ×Àqȱ3`S=:hÿÖþþXþOþLþJþ;þ-þ"þ6þfþºþÿŠÿìÿ5QH!Óÿpÿÿþþ¸ýcý(ýý(ýwýíý‡þ0ÿÕÿgØ!Vjogdl€ŽŸ­µÌë7f‹™“a}éWÕÿkÿÿçþÅþ˜þcþ"þÙý¡ý}ýwýý½ýêýþþóý¤ýMýèü§ü‹ü°üýžýRþ ÿ«ÿ5°}å^å`È çŠŽ†°T«ÿLÿäþ˜þZþ3þ3þDþcþ„þ¡þ¦þþXþ þ¸ýzýJý1ý#ýý&ýJýýßýZþøþ¹ÿ7ÔM……^Ì€Bü÷éÒ³—†ƒƒ”š‰NïÿhÿÐþ>þÈý}ý[ýoýžýêý>þ•þáþ"ÿ]ÿ’ÿÅÿ@ŒÊ2N\dgg^d^^YV= ÝšWÍÿ•ÿeÿAÿÿúþËþŠþGþíý‹ýý¤ü1ü¾ûmûTûmûÉûiü6ý-þ0ÿë†è åÄ¥ƒ\,ñ°j:!Tî7a^#¶ Fÿ‚þÔýJýùüÔüÑüùü<ýžýþ|þýþ‡ÿsÏ#&î¹gK@FNg—Êÿ,Y‰µÝöþå­gÄg  ÿ"ÿþÀýóü#üpûüúãú7ûöûýtþÛÿ¯â»G¸#—*Þÿ¦ÿÿ_ÿCÿ0ÿ3ÿhÿ¼ÿHî‹S^ ¥_ÊÿOÿÿÖþÅþ¯þ“þcþ-þûýÆýªý¯ýÔýþRþžþÖþÿÿÿçþ¿þ£þ›þ±þÞþ3ÿ ÿŒülÏ)l“ª–l1݆&Òu!¿ÿWÿäþfþðý›ýzý¡ýþËþ´ÿgèÚS¢áÿ*ÿ¡þDþþíýËý¤ýzýaýlý§ý"þäþØÿàÚ­3XŽÄæWÿäþ©þ¯þÞþ3ÿŒÿæÿ5sš°¶«—eÂÿWÿáþþ3þþõýõýþOþ¡þúþLÿÿÊÿôÿ!Fg†®à 4Yola/Ýu÷ÿ„ÿ-ÿÿÿpÿÕ¥XÑâ uñ$æÿ ÿ_ÿÿ·þhþ9þ3þ`þÂþFÿÛÿY¶Ï®HÊÿIÿìþ±þ›þ¬þÓþÿ-ÿLÿZÿeÿyÿÿØÿ$~Ò=B&ù¾~CÓÿ˜ÿbÿ'ÿòþÂþ¯þ´þáþ3ÿšÿ—Y”¢—l/î°_ýÿ’ÿÿ˜þ%þÙýÔýþ¬þvÿjKþ^d—üm¿ÿÿÿŠÿsÿCÿÿËþ©þ±þÿ‡ÿ*Ï\¸Ä‹g±ÿÿtþþÙýÑýõý9þ“þÿ|ÿýÿuôgÄùþ×}ÿmÕÿWÿìþ±þ£þÂþõþ>ÿ‡ÿ¼ÿïÿQ‰ÏdŸÒëàµr#Á\÷ÿ•ÿ*ÿÂþhþ6þ(þZþ±þOÿ Õ‹SEö}îg·ÿ’ÿÿvÿbÿLÿ*ÿÿÿÿFÿ’ÿñÿQš¹³ƒ:ìÿ´ÿŒÿvÿvÿŠÿ«ÿÍÿéÿéÿéÿéÿúÿQ‰¾æÿôÇ'Íÿ‡ÿCÿÿÿÿÿ3ÿIÿWÿkÿ‡ÿ ÿÇÿáÿãÿ¹ÿŒÿ_ÿ>ÿ*ÿÿõþÈþ›þtþUþRþtþÅþLÿôÿ¥PÌ7àœ\#ùÚ¾šuN'ñÿïÿ!QxŒŒb!¹ÿ;ÿ·þ;þÙý“ýýýºýþýOþ´þÿŠÿ÷ÿeÇSx}\#؃/ôÿÍÿ·ÿ®ÿ·ÿÇÿÓÿÕÿÓÿÍÿÍÿìÿ$sÁ S}——xNØ~®ÿCÿÜþ‚þRþOþþõþ„ÿ¥Vua:ÿÄŒNÕÿšÿbÿ'ÿÿÿ3ÿvÿÛÿCÚãÏ—@Õÿvÿ"ÿçþÂþ¦þ›þ“þþþ¡þ¿þìþ5ÿŒÿïÿN«ë/#üݹ‰gH,éÿÂÿ¦ÿŠÿ~ÿÿŠÿ’ÿ’ÿ’ÿŒÿyÿTÿ-ÿ ÿòþäþÍþ·þ›þkþDþþøýõý þDþžþÿhÿÂÿ5C=558Ng~‘¢ ¨¹æ!l¸öó¥7³$šÿ"ÿ¿þ|þXþAþ9þ;þ9þ0þ3þAþ`þ„þ¦þËþäþïþäþÅþ±þ¡þ¦þ¿þøþFÿšÿïÿ:m†~u~Œ®æ!V{‹‹o@ü°_úÿÿ'ÿÈþyþ3þ þþþcþÂþ0ÿ˜ÿïÿ$88,ýÿñÿáÿÐÿÂÿ®ÿ«ÿ¹ÿæÿe¹÷&ë³~H'ôÿÛÿÂÿ ÿyÿLÿ'ÿÿÿ5ÿWÿ~ÿ±ÿÛÿôÿýÿýÿñÿìÿïÿúÿ!áÿ¼ÿŠÿhÿOÿAÿOÿhÿÿ¹ÿÞÿúÿýÿÞÿ®ÿvÿ8ÿòþ±þ„þcþGþ;þJþþËþ*ÿÿìÿ/g{{xuŒ®Ïë   #=a€™Ÿ‹Y ÿ ÿ¬þqþcþ|þ¬þÞþÿ>ÿQÿ]ÿ_ÿZÿ_ÿhÿpÿnÿWÿ0ÿÿÍþ©þ¡þ¯þáþ'ÿvÿÍÿ!jÌü)oÄ[zw?èuôÊÿ|ÿ*ÿÐþvþ%þâýºýÀýûýqþÿ˜ÿTWÇÿkÿÿýþ ÿ0ÿkÿÿÿšÿÿeÿQÿZÿ‡ÿÕÿ@« N^Hã³—†‘®¹°†C÷ÿ±ÿ|ÿ]ÿQÿWÿQÿLÿ;ÿ"ÿýþÞþÅþºþÂþÖþÿ>ÿÿÇÿ2Qbuuusuƒ‘¢°³«¢—ƒg=ìÿÊÿ¼ÿÊÿìÿ,u¼ññ°Yúÿ ÿbÿ>ÿ5ÿ;ÿFÿbÿÿ•ÿ¦ÿ¼ÿãÿYÕë®:¹ÿ8ÿÐþ‡þcþkþ›þÜþ-ÿ‡ÿÊÿ*=Wgxƒ{\,ñÿ¹ÿ’ÿ‡ÿ•ÿ¹ÿïÿ/jšÁÒãô!:SajjY2ÿÒšgFæÿ´ÿ|ÿAÿ ÿïþêþÿAÿ’ÿáÿ$Êÿnÿÿ¿þþqþ`þ]þ]þ`þfþqþ‡þ·þÿÿšj‘‘}K༢”ƒmN*úÿ÷ÿúÿ éÿ¼ÿŠÿLÿÿõþáþÞþçþõþÿÿÿ;ÿZÿ‡ÿÇÿ\¢Ý:H@)Ú¢_´ÿQÿõþ¯þþ¡þïþeÿ÷ÿ”jƒVùƒ¦ÿsÿkÿ„ÿ±ÿÐÿÛÿÇÿ£ÿ„ÿnÿ~ÿ´ÿe¶îñÄ_ØÿOÿÖþþfþnþ“þÂþøþÿÿ%ÿ%ÿ;ÿkÿ¿ÿ,—ù:EÌmÓÿ¿ÿÅÿéÿ 2F@'ýÿÐÿ±ÿ¹ÿÛÿH{¨¹«KúÿæÿìÿæÿÕÿ«ÿeÿÿÈþŠþvþ›þøþ„ÿ¢ EN2ùÁ—Œ—®¾¶†,ÂÿWÿÿÙþáþÿŠÿ÷ÿW{u/ÅÿCÿÈþUþõýµýýRý4ýýý ý(ýcýÃýJþÖþhÿÞÿ/K=±ÿZÿÿÿÿ8ÿvÿ±ÿôÿ,\ƒ®ë4—þtÎ93ׂ ¸:ÇYôÿ¦ÿnÿQÿ_ÿŠÿÇÿ8F*ãÿyÿïþZþÎýUýùüµü”üˆü‹ü°üëüBý¬ýþžþ ÿ_ÿ•ÿ®ÿ¦ÿŒÿyÿ|ÿ£ÿôÿs”GJŸeÐÿnÿ0ÿ'ÿFÿ|ÿ±ÿÞÿ÷ÿ $8\ƒƒ\*ýÿãÿØÿÞÿìÿýÿñÿÇÿ•ÿZÿ-ÿÿÿ ÿÿ3ÿLÿZÿkÿŒÿÅÿxî\µÚ¾\¹ôÿ0ÿyþðý“ýiýcýlý…ý–ýªýÎýþZþÓþsÿ   @E ¨8¹ÿCÿÙþ‡þDþ þËý“ýcýJýXý“ýþþ;ÿìÿ&‰¾É¸¢ƒlS,ùÊTÐÿ£ÿŒÿ˜ÿ®ÿÕÿ8g®ÇÚæîãÊšTýÿ ÿTÿÿÿÿZÿ®ÿY††T÷ÿyÿøþ‚þ"þçýÆýÈýßýþýþ3þLþhþ›þäþ3ÿšÿ ‘ }èS­ó É7S/ïþ¡ýwü‘ûôú¨ú¹úû«ûVüýÆýyþ"ÿ¼ÿH¹H\KÝ”Y2*5,Ûÿ¨ÿ„ÿ|ÿ˜ÿìÿeñlÆùë¾€N/@xÆ .+âlÏ'ŒÿÿÍþ±þ½þÂþÈþºþþUþþíýßýûýDþ½þQÿæÿpÏ ôæÚÌÇÌÚK¾^ ¦"´Ñ{Øÿ%þˆü,ûúeùíøŠø9øâ÷ƒ÷<÷)÷t÷1øcù ûþüøþ¶Ñ.לžíy¿‡ò J”44‹üalùÊÿAþ¾übûLú˜ùDù3ù]ù¦ùõùQú£úüúgûîû‘üfýfþŠÿÏ7´2—²^qÚ° ?™\´ÿ®ÿ/3Oeœót  § í Âø|c Ç ì HÂf)ënÿ²ý¹û±ùÎ÷Pöpõ;õ¶õÄö+ø ùéúèûŽüëü#ýXýµýDþÿÍÿuÁŒÅÿtþ¸üÍúïøP÷öQõúôïô!õgõ«õãõñõùõîõãõÛõÝõëõÿõö:öuöàö–÷¦ø0úüXþÇ"@cO ò T Þ 2 ô 7 : ü ‰ ô h  * ˜ F § ß ƒ ìÀ»Þÿ%þoü úžøröIôSòÊðÍïvï±ï_ðMñ6òøò‚óõó›ô¨õf÷Ùùåü:q™ aìX{¢adcvn3ß–[%×[»Ì2¡I ² “Å)þ&Ð^ “Gýhùÿõ(ó³ðtî[ìpêÅèˆçîæçèÊé.ìýîòCõ[ø=ûÙý­¤ß[*ÿßü„ú|ø÷NöVö÷Møáù¢ûtýpÿ°;" ( ÍÉÉ¡BÓš EŠþ^üšúùÑ÷Äööÿõ”öö÷÷ù[üºþoE$Oþ#üúŠøŸ÷r÷ê÷½ø¿ù®úxû üoü–ü²üÑüýoýÙýLþÓþ|ÿ@ðÞ„h)­Ý¶C•¿Ñ×Ô®_ÿâýPüúçøH÷ñõ$õõàõ€÷éùßü=Ó‘b ;šÜªÎ  ©Øë`μ iïu´ÿ‹ýÕúÎ÷Çô&ò)ðõîŠî®î*ïÊïŒðÁñïóŸ÷óü› ¢amfBK|2½U ó G ¬ f « (âlüpõ©îÓèZä‹áYàƒà™á6ãåç½èê£êêÓéèîæåãVáàjßLߌßàŒàáláœá°áµáëá¡â5ä çÏë™ò7ûý6 ì%½)h+++)!&§"Ix•£`0‚ñh2µ h ÀQFe*;d˜ÿîûª÷JóLï.ìjêQêì ïéô{û²ç b¶˜Ç=$µ;¢ MRÚÜýQûù)÷’õWôqóßò™ò–òÎòóXóZóóMòVñ@ðýîtí€ëéSæ]ã‰à;ÞöÜ9Ýß]äªëõ|ÿï ?®Í–"(#ö!¦ù•“"W°‹””Š—ÎU] þ%ù'ô:ð(îºî<òUøáÿYU Ä:²Þ ÎþºùÚ÷wøñúOþSÙ²üû÷6óìî{ëéÔçÔççè±êÔìïŽñô³öùúú üü¹úÆ÷Ló·íÀç âöÜyØÔ,ÑÎ&ËäȈÇGÇ9ÈYÊÍSÑüÕÔÜ(è0ùê à!÷0À9H=u=î;0:–9Ê:w=@CwDZEvFªG.HuG£EèB?…9a2*%#ŽÓP;·  ÜÜTNöüë+â8ٸюÌsÊ,Ë¬ÍÆÐ‚Ó,ÕFÕÔ×Ñ~Ï[ÍÁËÊÂÉ*É0ɳÊbÎ]ÔàÛÓãNëåñˆ÷EüÙº†$q 1ýòù‘÷HöÿõÿõÊõõêóò)ñrð)ñ*ôúðË R$°,­1™3²3S363o3Ô3 43š1Î-X(Õ!/ éH ~ £  Ô £ž ' >güçó.ìŸæúãägæ÷éâíñ¤òzòlñzñôô?ýý â¥&_0ê4Þ4æ1û-á*¤)b*Y,.X.Í+%îìRí÷Lï5ê‡èïè·é¦éUèØåˆâ´Þ«ÚðÖÔÒrÐÎ@ÊgžÀZ½¸»¤»¼¾¶¿.Á¸ÁÁ³¿C¿œÁȵÒ)àûíú› }©t(°1ø9-@DFG†GåG}H[IJ£KTLáKJGwC?Z;”6ã0**ª"ŒÁ((þ´ôÆìåæ%ãôà¼ß ÞݾÚl×›Ó!ÐïÍ‚ÍúÎ.Ò³Ö™Ûšß²áÀáŽàNß÷Þ«ßñà â§â¤âþá”àcÞ³ÛÙ&×ÖƒÕÉÕ׺؄ÚóÛöÜçÝß³à›âÊä“ç,ìéôçøf#Ÿ-2Ž2Ò0`.—,‘,§.2F527}77€79·:2<Ú=¡?¿?{;Q1?"Kª õÝëxææªë­öÝÝ!ô ³ØúµñhîÄïFô5úôÿíÈ µü³özñí¶êÂè×çAèê¾ìVðòôÿúþœ «IÓ$Â%/!#ܬøéóÛÒJÍ‹Ë)ÌÍÍ,ËÃÇúÃ#Áü¿°ÀÖÃãÊ1×èýùßÿ\©Òcñ Ä yiÑEZ u"Ù#L$Ã#1#`$^(–.á4 9Ü9o7M2÷*ü!L ‚RýÛõRí£äµÜôÕÁкͯÍSÑÀØJã ï,ü^ fLâš?‚g ± k Ù ì 1!c×/Xþ§ü†ûñú{úUù)÷3ôÏð(íïèŠãÝ:Ö³Ï5ÊÆcÃÃŸÆ’Ï Þ¹ï¼™ ¼{%ÇÚ y g é\_×"s% 'j''4'ª(+¨,ô+å'  qZÿ‡ÿ@Öä´ì /¸{çù_ï´è€æóç&ëÅí½íìéDâÙ×½ÌÃ8¾Ë½tÁÇFÎ0ÔÂØ ÜhÞKà6â¿äMè¤ì!ñÐô÷Ú÷B÷”õõòÄï…ì±éfçåkã«àÅÝEÛ£ÙbÙÁÚfÝKàlâ3ã¸âzábà4ájæŽñ°ª`#„%Å$ð"É!Ã"@&”+Ÿ17*;.>¨@ÉB`D¿E¨GcJôL»MyK;Ff?…842!,ï%•§„öÃü<óƒëôåëáÞWÙ›ÓËÍçÈ,ÅO Às¾º½-¾Ø¿XÂÅqÇɹÉÐÉãÉöÊ%ΨÔ2ß–íOþä§Ê%*>*}'}"Ä^ ~û‘÷çó,ðîëiçºãÃâ)æ’îû˜ Ø ú%&#á_ è"”'ä*Ä,-·*˜$Å*ìnþü¤üJþ®ÿu<Øì óï%<-L0‚.X(® ½4ýõù?ø1÷=öNõÞôÁõ¦ø–ý¦y ó «³/e $ ô îݺ²È3N¿ú’îøãëÛ7ÖqÒHÐ¥ÏаÐ1ÑrѓюÑüÐ/ÏÌ饀 ÂrÀÁ¿NÀÂ7ƹÊäÎ ÒÇÔØäÝ èa÷ä ô%*å2Û6ö7H8n9)<5@ÐDPIüL0O›OMN„K×GJD¼Ae@n?‹=º9û3-Þ%ò9¸¶ r¢œü¾öÊïûçÕßœ×ÏfÈ]ÃdÁRÂúÄòÇsÊSÌžÍhÎÊÎýÎbÏ ÐÏÐ}Ñ9ÒÅÓèÖÜãVëôµü{ Ž êàyùÑñÀìëìËîðñô¨ö ùµýîô£$)¡)µ'ê$^"« 5 )!w#¶&v*(.:1r2_0Z*K!§ Y¥Á \ }"¹%/'7'Þ%‚#2!* !1#Š%Õ&j&ß#´t »û$ï/åïÝìØàÕ•ÔkÔ¨Ô,ÕˆÖpÙ>ÞWäê¶ïLóIõõ%ôañ˜îíUíîLïOî\ëÆæšàOÙÒEÌÉLÈÉÞÉÊìÉîË›Ó ã(øž 3§'y*S(ª"ú%ð  ÎÛ T ¥ ™ … u ‹ÅÎx Ó*À\!ƒ!tU2à é ¶ S < ° l.žøí â©ÙyÔÚÑãÐBÑ%Ó×›Ýzæ¶ðšúl4 3  Í  ˜-ËäÉÓëý¬ìÎð{V *ÏüìóëäâPÜØuÖ¤×?ÜÕä¨ð.ýE¥ » “<aüLùCúÿ/Ñ ]ûFÐoƒŒ )Ï"‹3i¢".r7À=*A}BHBs@¾<@7Z0–(‡ ²¢Ä  ›þù‚òYëÍãÜÔçÍÈÜÂ3¾pº¸^·]¸jº‹¼¾±¾Ó¾˜¾¾‚½0½½á¾‹ÁÚÅÚËÓÚ#áBæê6í!ð×òýô\öÿö1÷:÷[÷À÷áøàûÄ; `$• %$¥&o(t)Þ)3*ï*7,¯- /W0ü1í3¹5 748º9Û;ð=È>Ì=W;P85/1m,r'…#E!T Åtp ]8ü*ôqîìêÜèùævä[á8ÞuÛÙןÕÔsÓ+Ò‘ÐÈÎíÌ=ËÞÉ ÉøÈ÷É^ÌCÐ@ÕùÚˆá®éêóeÿ ÒØu‚ÏÇ ±Óþ¡÷Äð2ëèçè©îÜøŒS‹@&à+.E- *‘'ç$œ"I §’‘x:gû{ïŸæLãzæ•ïoü; Cž"Z ~Dß œ hªG#o-À48Y7õ3W/±*ƒ&ª"˜z( >þLó¿éUâˆÝåÛõÝJãê˜ïgñ6î€æàÛ7ÐSŽï¸Õ¹ã¾öÅœÌãРґИ̓ÊyÈLÈ$ÊUÍ\ÐaÑ«ÏPÌŠÉQÉaÌMÒ¿ÙPáåçUíËòÖùµî t}à>½#>)Ù.§3N7Ó9!;;Ë9B8/7Œ6Ø5À4t3¢2µ263è2 1<.7,,V-G.€-’*Â%÷""ªv4 0 1üööô‚òHðrì çîàYÛB×)ÕãÔÒÕÔÖÉÖ5ÕÎÒ¶ÐÏ-Ï·ÎòÍÍ}ÌÌEËYÊ,ÊÌ˱ÏYÕëÛµâTé"ïóTôµò-ïƒë±é&ë‘ðÛùØlSø$™(ð'1#g}¦ «„ ¾ ;u%$ *¡-R/0h0£0¶0¿0à0ñ0Œ0ç.F+¿%n,7ønù"±%I%†!:ÙÆ Ý€ÛÿòþQÿÞÿÿîûö î8åRÝ‚×ýÓ.ÒHÑgÐäÎfÌeÉÎÆYÅ'ÅîÅ<ÇÉðË}МÖiÝÛãséøí°ñÅôÁö+÷¶õ&òœìÒåLßÛ’Ú(Þ®å¢ñ+IÝ&6339":4805u221Ï1Ñ3é5¥6]5ü2180Å/l.ý*¬$ƒ’ZKûqóGîCëËè‘å#âCàÇàLãÏæêîð\ñyïênã–ܛؘØPÜAãßìÑ÷ðŠ í Çe4¶Ëé¬m žSI•±Œ<Æ 7 þüö6òðQðÉñûò–òïï\ëÏåÒàÞ@ß,å’ï¢üI ™«ï%]¨ú;ô]óºøf$òõ)m0o2N1-/ð-–.ú0]4å7´:à; :Ç6•0½(Ûm( Lÿèû8úøø÷ôØïìê4æ¯âáüà×á…â&â!à?ÜœÖÏÏòÈOÃæ¿ý¾÷¿„Ä%ÇvÉÕÊË_ÊʨÊlÌÏqÒŸÖ‘Û¹àå¬ç›èÀèûè÷éÄë(îèðêóÏöùmú5ûþüd u½)%4999—6»1Ò,¬).)ä*‘-/ý/W/ß.Ù.Î.·.;/1å365 1(/ qýæðççãlâ•äËç¥ê×ìÍîgððvîÍéäCßËÜ}܈ÝàìäÜì÷µÐ Eé2àž?Τá-äƒ  ã T Y Ç 1 ¶ U ˜"þ^÷\ñ ìˆç©ãŸà(ÞèÛÊÙAØØ'Ú2ßÉçJó’ÿï ÝžgHr¶! &Š) +g,Q,±+F*P'z"PQ³‚ö f Ÿ|ÐÿÕû›ør÷·øèû®ÿ»RDUþt÷mïóç¸âà_߳ߜàöácãäyã–á@ß]ÝPÜùÛ)ÜóÜWÞà}áíá7áüß2ß_ߎà‹âQå|èYëÚì¡ìñêŠèoæYå°åMç¦éüëÃí¦îÓî8ïrñ÷Hö Ž Ó%N'C&X$å"²"Ã#®%(|*-ç/»2>5 78H8&7c3,³!³‹ VD¼ÿ»ûz÷¡ó‘ð>îªìœì$ïô`ùƒüÚûM÷Òï¸æ¬ÝùÖæÔžØSá[ìŸöþd£ÿÍúöÖóÊõdûoq1 ç Gâ  ” Ô d‘u3óú' ´ÌÍþþJý'ûi÷âò¿îóëñêãë’îiògönù‡úŠùf÷†õ*õâöàú ògÃ9o<ƒ Aÿnù–÷Iù<ýŽ’Ñ´þú)ö"ô õ*ùÛÿzÜ $\š ÓWúÚðõèãŽàßàVá©âyã˜ãnãã¦äç„ê"îañáó@õgõŒô3óòåñ+óüõ´ùXýñÿÕáÿ›ýéúiøŸöùõ”öJøsú ü&ü¼úø7÷1øüû9 }`e µ#h$i#»! Ü« È#à&)‚)â'â#}¶X g†ý·{Dþúùæôðûì…íGò>úA± ½ Oþ¸òÆçÊß ÜŸÜ¶à#çvî=õú&ü¹ûú“ø›ø•úþ pÿ~GñkS KÚÚN óë›ý‡úµø¯÷röô\ð»ëaçŠääPæ¶êð$õÀø—ú ûñúNûýãÝöËì$¬(¡)Ã'^#)Kô' ohF…áÿ‹üGù<÷S÷ÙùZþȺü ‘  ’íüÅôËíé­æîå=æçøçqè è»æåäZä=æ›éÜíòjõ ÷ªö£ôÆñ$ï–íní´îVñÊôøCú¨úùEö>óñ¶ðPò_õùñû(ý}üpú.ø4÷áø¸ý‰b›."”'¯)¦)ç(}(%)2+….‘2°6":~<1=‰; 7ï/'ÙãÊg ùæwü÷ãðüê»æWåUçBìÑòùâüëü½ø ñ¯çÈÞ(Ø ÕÄÕæÙœà¬è¶ð}÷Úû‹ýGýVüÿû(ýéÿ…ÿ6 ˜ qr“qH¹ ¥t 4†û‰öËó"ó¦óô3óƒðVì}ç0ã«àá•äÒêGòùþé+É´Øä òSÓ"%3)©*²)‘&Ì!B9!hTFÑ Ø Š lu…£ ÙÉ>sà ÷lüªòNêeäVáôàÀâ!æêJíòî½îûìhêÀç³åæäÌå(èëcí+îRíŽëÓéûènérëÞî"ó&÷±ùõùþ÷ ôæð¡í~ëàêªëqíWïð ñ ñ^ñóòxö ü©ˆ æqÛ$r(Â)*D*+š,ð.ñ1>5V8¼:<:<~;…9¿5é/9(AÍà ï•þ’ùšõœòrðï•îéî£ï÷ïï“ì<èiâöÛôÕ ÑÎÔÌÐÍãТÕxÛÔáèÖíêòa÷Vûìþ4?‹È6P‰/rzR Õ ‚e¢©¦ T£ÿ‰ú¸ö`ôJóíòŽòˆñ‰ï¤ì]锿:å#æ•éïQõæúõþB»v ¹Bx&š,Ä0S21P-¾'!£?Œ $#QÿtýÉüþ¸ˆ"ß‹ž<t ”·ÿÛù”õâò}ñ7ñÁñ“òÔòµñ'ï¾ëJèbåZãzâøâ´ä çé8êKê¿ééŠèåççKæ³ååÅã¤áÅÞ‹ÛŠØdÖ\ÕVÕÖ×ZÙ4ÛÔÜÞÅÞQßHàºâè ñ ý$ rx ­', .È.`/e0æ1ê3C6í8Õ;²>ý@HBµBC»CŠDíC›?Q6ç(Ë éÿ½÷kó¡òôÿõ÷¨ö¦ô€ñfíèµáôÚ2ÕEÑÏÐÍ‚ÍpÎ&ÑŸÕ/Ûáâælì¢ñ öù ú=û”û&üý|þƒcÉ a c < ‹ s ½ VkdþüúøB÷ö¹ôó,ñ¼ïsïëð%ôÃøþiû@ Ô ¸ b £ [9ì »}Ô "Ó$=&Ÿ&'&ä$è" g­ ë ÇKBü_úûþ›¬ $[Nt• —"vþ}üQúö÷šõ|ó™ñìïžîûíOîïüð4òÔò×òUòSññïqîXíûìXíþíGîòíÆì—êaç;ãÞ£ÙdÕfÒÁÐEЃÐHÑ+ÒþÒÔmÕU×¼Ù×Ü”á]é ôÚA²ê³!ä#>%Ï&˜)Ã-Ž2ñ6%:_Q@YBªCcDbE:GIÑHcD;i.« ÎûýÝüÿ@°Ðÿèûœö$ðnèà9ØtÒ=ÏêÍ…ÍÎéÏvÓ`Ø›Ýwâàæ÷ê´îÆñ¬óCô8ôeôFõîöù{û>þ\8÷ •d$+þdü—ú“øuö ô3óþñ¨ðìîöì7ë8ê‰êµìëðÿöóý¦ É „Oµ ¹ û ‰/*±<#˜%Ï&&'Ò&&¿$4#¢!/ ¯œ›îd ðxÛ "æ7Á ? #žÿ«úùöFôÎòwòóôõ„õõÓóÔñZï­ìêŽçYåtãþáá{à/àÿßÄßZß´Þ¯Ý ÜÓÙ^×ïÔÃÒÑÐÇÏ€ÐXÒCÕáØiÜWßPáUâ%ãeå/ëÄõíV½•$d'­'î&e&K''*.q3°7˜:b<»=Î>k?´?b@ BŠD\FeEÐ?O5Ÿ'nÚ Mõýcý¼¨’ ± w"¨ûÙòvéŽàyÙ ÕÓ…ÒDÒJÒÓ2ÕÐØžÝõâ[è6íñfóFô0ôôõ+÷vú`þ€{ œ Ü ü © èêÕµýbúÔö<ó¹ï<ìÎèšåãÚá1âäíè2ïƒöÎý©2 ¼  9 1· ™ †Ûäô¡‹Ä‹O‡Ç ”Gñyÿ½þÐþÚÔ ð(Áw?Ô p šÿ—û*ùMøÅø;úü¯ýËþLÿCÿÐþþGýlü‰û•úvùþ÷7öCô?ò5ð9î:ì2êûçså‹âß,ÛB×äÓuÑÐüÏÚÐGÒ¼Ó¹ÔãÔkÔ·ÓAÓ]Ó2Ô!Ö;ÚÚáíúà˜ [Å/W™#Ü(n.<3‰6…8ç9Q;É<þ=ð>@YABØ@¹<ú5Ì-2%¾æ à 0zoi Œoý%óé~àšÚ“×ÝÖ‹×úبÚXÜßÝhߪáNå5ê®ïÂôwø'ú¦ù^÷Lôœñ2ðšðåò¢ö û;ÿ+ø:Mý<øøòþí›éEæ*äãiâ­áôàñàÀâ9ç]îM÷% CyDUÿE‚ö m 4 î¿pþ˜œ¤í ™v9­Mó$!ÝØè ßõ¢O¿i Çkÿdû0ú{û“þw)¬G »`C?üÑøöÙó?òñðúî©í#ì—ê8éRèèêè÷ê·íð ñ ð6í3éãäôà¯ÝÛýØ…×:Ö¼ÔõÒ4Ñ$ЉÐRÓ]Ùã’ï­üÀ'èIÛ¤å"‚)Ë/Þ4…8;³ôºóßò­ñKð-ïéî÷ïaò¥õùü9þnÿôÿNë ¤jùþ#&æ€[ýùFõ9ò¹ïUíšêXç˜ã¼ßrÜ Ú Û0Þ0äiìŒõÑý˾»b³íümú'úiüÄ ‡äÆ Å ˜?µÚÇÂÿIÿ!§Fß!(à,L//&,='!úé–éCá ®ÿhù‡ôÕðvî#ígìãë2ë'êÎèiçNæ¢å\å\åbå!åZäÆâ7àËÜÙèÕÛÓ6ÓÂÓÕ™ÖÖ×qØ0Ø4רÕÞÔÕ¸Ö=ÚÕßµç=ñÿúMq Æ :´â Ë#L)§-C0 1_0Ó.Ï,˜*c(ƒ&L%ž$$¤" d.eØ×ú M"<"61C ó ýAùV÷ÏöÝöÄöüõkô?ò ðnîòíºî†ðóÕõÀørû¡ý-ÿY}Ùy7¸¬À¢-Ž<ýíø5õ+òšï#ísêŽçÂä‹â‹á[âWå_êãðè÷Jþ+ ÚÇ[uþÔütýÊÿ3¸f ¨ F wÇËêýaügû¿ú;ú±ù8ùù¼ùÇûyÿÊF ?ÙG"ø#O$t#×!Êœm3ë•R #´ÿéúo÷ÊôÎò?ñØï›îcí:ìëÞéÜèMèfè"é'êñêúêæé¡çä®ßÛM×ýÔ$ÔhÔ2ÕÖuÖ/Ö@Õ@ÔÔ ÖãÚÃâ×ìX÷_‰› ~ Ç , ÍÊV%±+0 2Œ19/ë+œ(&Ó$$q$…#@!ªU³ï\+ÚK!P#µ"©¼£Î§ÿèüÉûÿú5ú8ù ø­öIõ*ô²óøóÍôÝõàö¡÷%øwøÃø`ù’ú†üÿ¸êý¤2êýúöXò0ï“ì\êcè¥æWåÍäsåŽçë®ï´ôyùXý*ÔU³/“þ¤ýþ/t7¼ z %’ÙE 5  H¶0f*™ýûíøß÷zøû±ÿ î ‹Â<þ[פ–ÆÝª Q qVˆýú ÷|ôòÂïígëéèÝæ4ææ‰æ1çßçŠè8éÂéÛéFéè\æŠäâ5à6ݦÙÖGÓoÑ}Ð,Ð\ÐJÑ‚ÓÀ׊ÞÉçfòÆüN8 ÐüåkÙl#)Æ-à0æ11·.—+E(F%û"€!N ßÒFª{]·Ç]½Î"_%±%¡#•AW¡º Îig=¬þ×üû©ùíøÙøAù¼ùäùeù+øHö'ôJò,ñ#ñXò’ôV÷úPüíýýþ‡ÿ|ÿÅþJýãúƒ÷Dónîké¶ä×àZÞ¡ÝìÞ?âdçºíAôúOþñHT®ÿÓÿ÷¹` Ê / Ý ú ¬ ';Pp¡þíügûFúÈù>úæû´þt¶æ …zµùϱ õ>„nÀa Q žs7Oÿ ýrû8úíø)÷Êô òIïßìë*êêvê/ëåëoì™ì?ì2ëéˆçuå|ãŽá@ß4ÜqØsÔèÐWÎÍ9Í/Ï„ÓuÚŠãíÌöLþk€P Á ÇÕ!‰&´)'++y)='%‚#Î"™")"à ¤¶§ÿU-±¸†$ œ"n#ˆ" ‰9·B ± ˆ~.ƒ§ýôúõø#ø¯øsúýéÿa·D׫+þæûbúáùLú!ûÄûÏû$ûúÃø€÷ö]ôðñÂîØêzæöáÀÝQÚDØ(ØFÚ¬ÞÍäÁëPò^÷WúYûû ú¨ú»ûðýù‡ûÍ ƒ  ¸ Ú Þ ò  .èÉqýNû!ú5ú¹ûŠþ4ü( @ B l ) Ì ¼ ! O•YK`À ¥ + ƒÓghÿþýgü‘ûjúíø^÷üõõ‡ôLôô·óðò³ñðAîdì±êIé(è4çæyä&âìÞÏÚ4ÖÃÑ8Î[ÌÍãÐõ×^á~ë„ô û“þÿ3ÿCÿ#b­ í½H"##°! á·ŠÐ ³!d!›§3!LG2VT Ž!  ËçÇeÎ M t “ ð $ %Þÿü;ùø÷`ø-úÆüpÿ³]s-¥ñ)Es04«ÿ×üúP÷ õDóåñ­ð"ïÉìqé2årà³Û™×ÐÔéÓ=ÕÓØDÞÍädëëð¿ôÆöˆ÷ê÷Îø¶úµýj5æ V  P t µ >%-Û¢'‹ R Q`ýe^4 óc>ƨ›B Ý i Çxy¾ P®@fþEüéú'ú´ùGù¤øÀ÷ÁöÛõõAôGó#òëðšïî7ì$ê%è”æŸåFåNåeå$å"ä+â0ß‹Ûß×ñÔ›ÓhÔ¯×]Ýáä(íÕôÊúqþïÿß‹ìh¦8w*‘ˆUÖHF\ã ÅtÀŠ.·«Ø0 £ór²±P­~ÜHŸüÊùiø¤ø8úµüÿ.y@…z] b Œ µ œ í [ ­ ÅÊW=ü0ù[÷göšõAôåñWî¼éšä³ßèÛæÙÚ9ÜÍßçã€çééæêæêÊêrëqíÄðæôù‹üÞþìÿãÿAÿ˜þ`þáþ:UÛPU ¨ H s ¢ \ ÄhcØ‚gV‘ñ.¿ýWy^L¥É  ¾ËB'ÿcýñû£úeù3ø÷Ýõ¿ôó&òjð9îœëŠè'åªá]Þ†ÛOÙÜ× ×ÚÖ§Ö&Ö5ÕõÓÙÒzÒ|ÓPÖÛ–ááèð öhú<ýÿ³ð_! ãÕîhÍ  ½L—ld¶üޏ4!ê"[Þ¤$ÿÝé>L ô èÞâŸÇ'¿ÿvÿ'ÿºþ-þÈýÀý(þòþHo[Þîa Ò d ¤ iy½ ? > ûèÐÿÃýÌû´ù4÷ô”ððì›éç~å5åÿårçíèÐéäéhéékéëðíÚñ/öIúcýÿÿßýôûòùRøo÷r÷OøÊù€û ý0þìþ£ÿ°oú<Ú R&çsË<;AÉ 4 ¥ Þ¥Ñ+¤d·Ù  £ v w}mW6ÒmêþPýû´ùr÷ÐôÚñ·îrëèÍä™á˜ÞÆÛÙ”Ö•ÔIÓøÒºÓ¹ÕÙ¡ÝOãéšïŠôÔ÷ŠùNú ûÀüúÿÍ´ ØTh­éŒišwù Ú ¿ v #)è“6 ¹ ç)Þra·¿ ñÈŽ/LÿnþDýëû®ú÷ùýù¿úüÈý±ÿ”?Š„Q " Z ¨  RWЛ¬ ÀoF1Æý@û¤øSönôó(ò–ñKññãðdð~ï+î‹ì÷êÖé¦éÝê¡í™ñ)ö‰ú-þ¶ùî¾£þü ù™÷4ö‰õšõPö“÷0ùûlýF– h  ÜӮЋ  £ A ó¶±/jNww % äM–ÿ¨Ÿ¸¶jÍä²+QOþHü2úÑ÷÷ôœñõí;ê°ænãuàÙݸÛTÚÓÙ_Ú ÜìÞãèÅíGóø_ûýwýýµü‚ý££ °“˜û&¦ ÷0}vÜ æ îÍáX o ÜïÆ Á q 1=Ábÿ²ýŸû8ùÄöpôoòîð@ðÊðËòñõ›ù9ýjZ?ív ö i ¦„Û¿AqJ à m " )h#Cÿñû‚ø’õ©ó"óïó¨õ‹÷Óøòø–÷ÛôEñ›í£êûèéšê[í”ð•óôõ‹÷zøíø ù ù%ùvùäùúÙùù<øÔ÷[øúùÏü³\* `H§‘V]ü ‡ RŸv®ý(1x^n»ß · ‘,ñÄ¢‘Œ\Áv€Rý„ú½÷õ^òšïŽì éNå–áZÞ Ü!ÛÜßýãIê ñ7÷Äûþqþ‚ýzü€ü9þÚèª :ÌäNKOÙrb¼F•D!Xm  »°äï 1 Ö-Ü  4Tÿiüyúyù(ùøøcø÷÷ôlòÞïÃíXì»ëîëíïðñeõùoüsÿn³ u à Ê)ÇÇR° ¿ äc×ó~|2øþ#ýÿûÌûˆüÖý"ÿÞÿ±ÿŠþ}üÊù»öÓó¢ñ‘ðŸðrñŽò|óýóúótó–ò–ñÚð¥ð ñâñêòçóÐô¼õÉö1ø'úëü~‡à AÍ%À î ò öI‹éeÿþÝü üãû¾ü£þ7Õ „  é F v ¡Ú4ª@ØC0‹Fªýûˆø=öòólñvîëwç$ä¢á~àá´ãièËîëõ™üÌú/ÞÈáý•nÿ –Ö'‰l–Ò5Ù µ  è yKŸÉx½ Ù 2=šûÀ÷ïôó×ñÕðÐï©îtí<ìëêké éäèáèøèFéê­ëîoñxõúÿõPÒ A®¿´E ¾ s n žâ1~ÕWž6](Nd׿T‹ëÇÿ;ÿÿ˜þqýdû›øpõ<òmï?íÚë_ë—ëdì“íýîƒðòºó„õœ÷2ú<ý~˜79˜ e ´ C º  ?)¶+Tÿ‡þþ–ý[ý–ý¬þ”þm… Å Â  ë†ýiÚ‘ ÿ ÿþ²ýrüØúù1÷/õõò”ð9î ìênèXçMçžèSë"ï©ó|øýH¤w Þ ñ N À C!㤓‡bô±¿l ñ_x/X¤’ºË¥kC ~\Hû¨öÆòÛïÅíJì5ë_êÊéWééÐè²è–èfè(èåç¯ç§çÜç‡èäé?ì´ï;ôŠù"ÿhðK RÓç » ” ‚ ™ÌJ,ŽJZ ˜ Ê ” ° ñ m f@e<óf;Þͦ:¤ýIù¼ôƒðí¥ê3éžè²èeé¥ê‹ìï<òÛõ®ùiý°D†°Çå ?^Hã)½#{òþÀýÝüEüüûEü}ýÓÿöQ0 2 )  ! ‡ Ÿ¤µØÿ0þâüëû û÷ùžø÷Qõ¦óò¹ð«ïïÛîïÄïùðÆòõÆ÷Çú%þèìò “ bSYR° ΃K)ð= Ž >Û0‚"Rm™MX¡:>° ž ìÄPýÙø•ô³ðXí£ê¡èfçÝæîæiçèäè•éêQêeêTê8ê*êTêúêSìî°ñ’õõùŠþóÕï  E z å Ç k û§¥$Hz5 ë [ 6iê Ì d   µð‡  A Û ·Ývª¯þ¥ûnøõÉñ¿î[ìîê êƒëˆípðìóŸ÷'û+þpÒaSëu Ï®‰Qìÿvÿøþ•þOþþÆýMý¤üôûQûÛú¨úÞúÚûâýÏ7˜  p Û µšX¬þwü‡úíø‹÷4öäô½óóò§òó ôÁõøŒúßü›þ‡ÿÞÿ«e™K õ®È{"I †‚µN·¼À‡ ú & < `\¢Ks*² & ¨ % …‰þÓÿüð÷ºó®ïìAéGç4æ÷å^æçè éäépê’ê\ê'êQêëBìäíãïSòKõËø¢üškÑv ) Ï u T ¿ ‘‰2š»fQ , µ ÈA'¦û U × ™ € u E Ê æ ‚ ¢_âpAþ[üú¡øSöÈólñ¶ï ïŒï/ñžó†öZù­ûXýZþìþ8ÿFÿÿÓþ„þLþþÖýaýÚüHüàûû€ûƒûûÄûñûü üñû”û=ûNû)üçýHÑ¢Eë³ä»ZÿßühúøãõøóJòöð!ððæðËò’õøø¤ü:9*à¥'IŽ u .*•I‰í  †Àü@aΛy«^› H %ÚNŒ¿Í9š ( 2…Æšÿâü©ùö6ò’îxë(é½ç+ç?çÉç›è‡éhêë‘ë#ìítî=ðEòTôrö¤øúútýïÿBOæëM5 ÎËU§½bP6 æ 7  ¡ à ½ ² Ù 3£%ìJ4 ‘ y  ?!Dþ­üCûúêøû÷+÷‹öBögöÿöß÷Ñø±ùZú«ú®úNú©ùäø(ø¯÷€÷¤÷øzøþøUùkù;ùøøÖøûøZùÞùjú÷úuûÉû¾û@û{úòù2ú‰ûÈýg×£m“@yþŸûòøƒöbôºòªñMñŸñœòZô÷úÙþ"É9 h Œ * Þ Z  ìd‰}µè¦ ÁrŒ_üdoKBÄÎÄ a Å`GÏ Q ø ê%z¢@0u4ý›ùãõ^òOïèì:ë5ê¼é¹éê³ê—ëÀì9îð4ò~ô³ö¡øúKûaü–ýÿ®o\÷$´åºþ-þ›þúÿó%MâöÚêb K [5}š\q ‚ 뇅é£ÿ“þ¡ýÑü:üüû üMü°üýiý›ý–ýBýœü¾û¹ú¬ù“ør÷oöõ¿ôô¬ó‚ó´óô›ôõ;õ\õ‰õÝõVöâöw÷øzø¡øUø‹÷xö†õCõ)ö6øû;þñÉkÎ&Óþ4ü˜ù<÷Yõô·ó-ôxõ‘÷múþ9\Å ÿ â × r Y þ ¬_´ •°ïMá ²KjÌâ¢,æ#ûQ§y b Y m ç eíõ%`ùÍÿý'úB÷«ôŽòÚð„ïnî“íöì¡ìœì íûí~ïˆñïóoöµøvúŸûYüëü›ý£þúÿuÙÂêHõþ”ü¼úìùZúùû‚þu8=.,³dÝ`ñ NȽ—ûH ¿ ¢æ|?ü¢Aÿþýý6þ>ÿH YY8ÿçý”üjûhú‡ù²øß÷ööàõô0óÁñð‡ïçîžî±î-ïðMñ™òÂó·ôYõ õ„õ õ>ôióÃò¬òqóõX÷Óù üßýÜþÿfþ+ý~û¦ùÜ÷xö¶õÛõ÷hù»ü¥´l\ E 9 f¾¿Bzp9>,  Ús›ˆËË<;¶dÅ G #V6)m]ÿ ÿ_ÿìÿK*ÿfý ûcø¹õ|óâñôð~ðFð ð¹ïbï$ï2ï¼ïæð½ò$õµ÷*úHüøý;ÿ~ÒNå¤çi1jþÝüôûü}ýãÿË•“lÇ'¼µ D_|RÖ7Ð O Núѧj'ýþþ›ý¸ý`þ|ÿ¾É?’ÿ²ý°ûäùløP÷möšõ·ôžóSòØðbï îþìlìgìÜìÀíìî=ð–ñÎòÈóbô ôvôôžó.óßòêònó~ô öß÷Èùrû¸ücýaý°ü”ûeú’ù„ùhúPü*ÿ¤gé Á žk`Ü`iZBòë‚Fësò­äùDù ! • (ǦL£³[Z 2 r ¸ è ' ¸ï1ÊÿþÝüHüüÁûNûyú3ùt÷eõDóaññïïîRîíí¯íní1íåì‘ì€ìûìDîpðAó_ökùüþWÿýÿmÿð LWéá…2_s‰qÁð  Í Ô² ™h B ˜¤ÙÇ_¬Ñ š Ì ÜÚãôÿÿyþ%þ3þ¦þeÿ2ØÕ½þ#ýpûÖùør÷™öÛõýôìó“ò ñLïíüëÄê êÞé5êüê&ìíäî)ð#ñµñâñ°ñHñÕð‰ð‰ðñ òyóõÔöwøòù$ûñûPüYü:ü.üzüoý>ÿðpD å Ó°r7}ØÒÝëò{þAB*MüTM ¾ ~ A ëaÛ“êIH¬ï ‘ ? É H ò,cñ ÿ¸ýÝü7üŽû£úRùˆ÷põDóKñ¼ï®îîÈí›íUíåìEìŽëéê’êÇê¾ë‚íæï–ò-õE÷ºø©ùFúìúÇûùüGþÿF—ƒQTÊóÑCûs J .E , \ _ g X¼Å„2äÆ0}  þSòº–xušÿÿÍþýþÿY a:Lÿºýöû;ú¦øS÷@öYõŠô²ó²ò†ñðîêìŸëÊêxêšê ë­ëdì#íÃí;î‡î®îÐîìîïï'ïmï ðñlòòó†õ÷ø¦ùbúØú5ûÁû²ü3þT%Œ> º „J+lw½˜2qdýÙ)©§‚¥Z¸ Ž { A ½=¦€üE<£‘a‘;¦þš•ÿáþUþÆý ýü¨úûø)÷gõõóûò‚òiòqò^ò òlñðeïIî‚íGíÃíäîðJòøóCõÿõEö_ö¢ö[÷Šøú\ûrüýMýJýRýÈýýþí E – × ¡ É ¬eµ +41\þ†>d ý ò ûÒI 1‰ëÄ-ÿþ²ü'ûyùÌ÷7öÓô¦óœò¢ñ¨ð ï‡îcí,ì ë'ê«é©é'êëì9í6îçîFïWïIï0ï'ï;ïkïÂïYðñåñòówó'ô*õröÌ÷*ùšúKüLþ°w¶O ø HÎ\ú÷W—»Ö—MC !{ ´ü¡*ÓL< B $ Å 9¥ÑþÃóOˆy }¢—’ÿ½þ6þþ(þDþ>þäýýÉûú1ø}ö;õô‡ôÞô_õ¼õÒõvõ˜ôqó(òñxðxðñGò·óõÏõîõ†õäôbôeôõ7ö§÷ùú ú ú_úTúãúMüžþ™ÛßA Õ ­ & µ ©;P£Ïo0å!ñ$ÈÆ î  8 2  #^öÚãÇK;¬¸ÿRýûù ÷põìóòñÂïtî.íåëêéžèèíç+èÂè›é®ê»ëªìcíÙíî"îîøíòí îIîºîCïæïšðVñ(ò óLôÇõœ÷áùrü'ÿÉO¸ p ¤ ~ÛÆu%Œ–"ÝT!î!—! ªäY<< V g s µ ™oa1¶Û«D¸'ºþªýýÃüÆüÉüœü#üKûú¡ø)÷éõõÞô!õ¿õuö ÷J÷ ÷Nö'õÙóµòðñÁñ òûòô!õ«õŒõÅô˜ótòÃñÔñºòeô}ö¤ømú¨ûKü‘üÃü9ýþyÿ,öÿ&D  å ,<áì2®ŠøH¼µ ( Á N Ì 2 ¦ 2 ï Ö ¿ ‡ þ —®léÿ[ýôúÓø ÷—õZô3óòÇðeïîœìSëZê¼éé¹é/êÏêxë ìoìŽìrìBì.ìJì¡ì3íõíÖî±ï_ð»ðÄð¨ð¶ðñëñOó;õ™÷\úRýNA º  “±’_B`ÛÕ9ÁÅ s‹D•<=Šø u  ¿ ¡¾Á”_îÅ+gžþûüŸû«ú'úú$úLúZú0ú¿ù ù.øM÷¥ö@ö:öŽö.÷ø÷ÀøOùsù(ùŠøÃ÷÷œö‰ö×öz÷?øÑøÙø%ø×ö*õyóEò¾ñ&òyóxõ×÷úæûý²ý þOþžþÿšÿW77cÊ€‹Ê  ¨ÌioåùÖº¸ ß & — $ Ä ~ I F T s { W ø L `.¶êÔ„ÿ ýØú½ø×ö-õ˜óò‰ðïzíìÇêØéFééTéÖé’ê_ëì‘ìÉìâìþìBí§íLî'ïFð‹ñÃò›óáó•óõòUòò?ò3óòôa÷Lútý®JW Ý •v¹›~¹’&q/ç2Ãz9$ÈrqÑr$ÂP à ‰ | Ñ¡ÅõâG e<¾3þÝû úßøUøDø|øÈøøøÖøXøˆ÷—öÁõ@õ$õjõöèöÎ÷–øùù›øø÷S÷åö¾öóöˆ÷iøUùúúù`øÒö*õÎóó0óIôö?øbú7üÀýúþìÿ#¢Žþ…A_ñÖì è ›é¶ù¹!Rtœ × # m ¼ ý > ‚퓎Ô<‹¡XªŽ3#ÿâüÕúïø)÷†õôËò”ñ\ð0ï"îGí²ì^ì?ìVì™ìíníÅíøíîîþíî|î>ïmðò²óõÝõüõŒõÓôô¯óÙó¼ôVötøàúcýéÿiÅãžò é 1 Ñ ¸ 2ª˜ÕEãÂ#@–.ñǯ¸ â : Ä ƒ s u s  ] % Ž®¡oFÿMý³ûúÓùZù ù·øOø¯÷àöùõ-õ£ôpô£ôõÛõŸöM÷»÷É÷“÷4÷âöÁöîöo÷AøRùTú û'û’úZù²÷ö ôÙóïóÕô{ö˜øÊúÑüyþ®ÿsØùîëüNððWܬ H ‹ c Ô Ô € ß  C Œ ï | % ⽯·Ôò   ø²J¾ÛnÚ$`þ‹ü³úíøB÷¿õbô%óò ñ8ðŒï*ïýîï8ïkïï]ïïî î¤íní©ínîÒï¸ñ²óYõ\öŸö:öxõ«ô3ôbô_õ ÷>ù°û0þ®=`> È ; Ð ¢ × w„ÌëP3¬–‚ÝÇ£c+  5   W ] ± , x d ¶ | ²•?ñÖþý»ûú´ùòø]øê÷ˆ÷)÷ÆöuöBö:ö_ö¢öñöH÷“÷À÷»÷ƒ÷&÷àöÁöîöw÷Mø]ù{úmûôûãû)ûòùføèöÁõ5õmõaöó÷Êù­ûRý›þpÿìÿ,_šéVùß~ÃL ” u ß Ì S Ÿ Ä ç  z À…HՍ𢶏—7«¬žƒeAÿþûüèûÛúºù‚ø4÷éõ´ô¡óÎò?òòò6ò‚òËòóLóRó(ó×ò}òEòMò§ònó«ôPöø›ùŒúÇúNúWù3ø?÷Ïö ÷3øçùñûþ=E(¼åŽÉÆÀâc] á Ñ  ×*ý" ‚šWU} ™ ¼ Õ  t ò+ ž " b  A Î÷Óu%ÿ#ýŸû¨úúÂùqùùŠøê÷+÷röãõ¨õÇõ,ö¶öH÷É÷ ø3øø÷z÷ñö€ödö³öi÷qøºù û&üÀü¢üÒûvúçøw÷{ö4öÁöøéùñûÖýnÿ¢rë&7f⤦Ø:½F ¼ ö ß k‡(c \ = 8 ] © ƒšCô¿’h8ÍÔgáþJý¹û>úþøø?÷™öéõõ'ô óëñÝðð¦ï«ï ðÁð¥ñ…òXóçó0ô-ôôÙóÀóçó`ôKõÉöµø¶úoüýøýÃý(ýiüÚûÁû4ü(ýkþÊÿa•eé!ñæ¾ó  ” ‹ ;’x׸!;0>‚ ö ‘ H Ú ¼ ¹ Ý , ‘ ë  þ ƒ - `S"ùúÿLþèüÇûÇúÞùçø×÷ªö~õôÖóó¯óô®ô@õ¥õ¼õõõ`ô½óUóJó£óyô¨õ÷iøcùÍù¦ù ù+ø^÷ëö÷ö÷’ù¥ûäýïÿ‘¡ói§ãWT1·e “Ð ´ = b 2 ¼  O “ër.<uµ f½þ ÖX™­ X+ôÿúþþ.ý)üéúvùß÷4ö•ôóÚñëð_ð'ð=ðmð¶ðëðöðæð¢ðQððð2ðÄðÔñkóYõP÷øøúšú±úúúôú»ûðünþïÿK^3äkÛ@£—&Æ“Š ¼ É ² iää]™ ³ Ø Z È Z ( ;  Ç ƒ 7 » ð Æ N † ~ A É/û†Üþ¯ý°üÝû'û~úäùhùùÜøÃø·ø©ø‚ø<øÉ÷1÷{ö¿õõ•ôOôOô£ôKõ$öüö–÷Î÷œ÷÷EöšõQõ¶õÚöÃøû›ýìÿÒºÑnç[þóP bÕM¬ Ä ‘ ö ô Œ ã % .)5\·T**AZ`I –å4Wÿýþ|þþËýtý ý€üÁûéúúùù ø[÷Äögö:ö7öHöjöƒö‹ö†öröSöEöBö_ö”ö÷Î÷ ù£úPüÆý·þÿÅþ-þˆýýý“ý|þ¦ÿàêêò¯+ ÆâotÍC§Ô¬ 0 y ~ O ì ‚  ½cåM¨/æ÷_ ûº Ë  þ¢'Å“µ ƒãÿÿ þÑü~û;ú;ù¬øžøù´ùbúîú5û)ûÂúú;ùiø×÷¡÷Î÷Xø-ù'ú7û)üÏüýÑüü ûÞùßøXøøŠù5û[ý ÿÏ¡÷¶ã†Û3¡^ˆê7rh ì  ·  `ƒ¨ÍéXÀ[.9iªÙ×…ÒÏ„ÿþµü‰û¶ú@ú!ú5úIú'úžù¬øf÷ñõ˜ôó×òò§òðòLó“ó¯ó•ó`óóçòíò0óÅó©ôÝõr÷qù¨ûÔý£ÿàƒª‹xªSiÈ,[Bç` ¦ È ¯ t  ·M貸 ž> á m Ò ñ Ç A  ¬íMÇN饄Œ«æ:¨4‘¶ cëñÿ8ÿ¿þUþÑýý7ü'û÷ùÜøþ÷Ž÷Ž÷è÷wøþøcù|ùLù½øå÷àöàõ*õæô$õàõ÷løäù$ûñû4üñûKûvú´ùLùqù5ú‘û^ýOÿ2Ëõ•´n²‚tˆ²ûRÊm5)1" Û > F  ß6‘œQüéàÛʱjúLk^=*8ÿqþÔýfýýuü«ûŒú*ùª÷/öÞôÎóózò(òíñ°ñVñæðjðñïŒïTïLïïìï¢ð»ñGóFõ‹÷Åù¶ûýøýyþÜþpÿe¸X†¤U™›l.ù í­i:&E¢%ÈI ‡ f Ù &:sÖnLZ˜†­ gd”à*Mž Òªl jÿ±þËýýœüwü€ü”ü€ü7üŽû—ú`ùå÷jöõôŠó‚óúóÛôö^÷žøžù*ú@úýùù3ùùŠù’úüþýìÿ¥ðºÖUµ&×Ý)¤9Â>ºCØ{#œÜÑ€å$*A“ɪ¥§¥—g/æQúÿ£ÿIÿÿÍþ±þ›þ|þLþøýýÌüü5ûsú¿ùù›ø.øÜ÷“÷E÷ëö‹ö$öÄõ{õTõIõpõØõ¨öð÷ùEûÉüÜýfþþ|þþËþŠÿ®&¤æÁ!ÇNá«®÷hãN¨î&dÆM ½ F p ' c R«eiµU7<a‚¡¡–f¾Pà_ïÿŠÿ>ÿÿÅþ|þþ›ýýgüÏûgûKû€ûüµütýþ„þ›þRþ²ýÆü¾û¼ú÷ù›ù´ùLúNû¤ü þ_ÿWÝàïÿeÿ%ÿWÿ)ˆá÷—¼pÊäêþ,† ·ÿ‡ÿvÿŒÿÐÿ:ØŽGâMq] –}üšN/=g—¥‘NæÿbÿÙþUþðý§ý¡ýµýíý6þqþ„þXþßý1ý^üƒû³úúhùÜø`øÜ÷V÷ÉöBöÍõvõWõ\õõ¶õîõBöÔöÌ÷AùûýÙþ5”×1×Ü'ŽÆ¤ + ¯Bðµ¸â#¾ga ø ± ï ¹  0 ר Ù<ÃXù”2ÁKáÿÿ>ÿÿÅþþ3þâýýý”üüŒûûšú!ú±ù`ù*ùù0ùWùùÖù ú$úú¦ù%ù‚øí÷t÷7÷V÷ê÷äø>úÇû<ýþZÿÐÿïÿØÿÅÿáÿW#&68ýsŒ_úkË"ˆþŽB@¢<þÓ£TÛK‘°¨Œ_/÷®bÂsóG‰¾ôÿ5ÿ˜þ%þÑý–ýfý<ýþü¢üüYûú©ùÙø ø[÷—ö¹õÐôËóÃòÚññŒðFð2ð=ðgð¥ðñåñ.óúô#÷qù‘ûfýáþ@€û£aê ¹ Þ ú D ©<+UwtDåoÇÚ4¸+`9ÆC~ÖbïÖ½›k%Ñi³x^PK=#÷«Qáÿpÿÿ˜þ(þºýDýÆüBü»ûEûàú ú~úpú_ú'ú®ùþøø?÷—öNö}ö4÷Mø¿ùbûýtþ’ÿH«Ú N¸GßkÎ øÑ›JíwùxîgãÿÿQÿZÿ ÿ ”#œàÚ€é/vÿÓþZþþõýþ%þZþ˜þËþáþÜþÈþ¦þ›þ¡þ¿þõþ;ÿšÿýÿe¶ù),ã~ÛÿýþÜý¢ü\û0ú6ùiøâ÷}÷:÷öö™ö$ö¢õTõmõ4ö…÷>ù÷úiüzý(þ“þÿ·ÿÕXÁå²èú$©˜æQ±ÞÒQ-‰,î“Ú­)Uࢉ†rKñjÍÿ8ÿËþ•þ•þÅþÿhÿ«ÿØÿáÿÕÿ®ÿyÿ8ÿõþ·þkþþ›ýýVü¢û ûúsú„úÇú!ûmû—û{û)û¨úúºù©ùúüúYüûýšÿµ6`´Šæ$5©wÔUó»”j4ëY5@xÏYgH÷xÓÿÿnþâý‚ýDý&ýýýýýèü§üdü)ü ü ü)üiüÃü6ýÃýJþºþÿLÿkÿZÿÿÂþDþªýíü ü=û\úùßøUøå÷…÷)÷ÉöYööö¢öå÷®ù¶ûªýFÿu4µ#»¡ÞK¾ Þ >   ·íVëëñàªaÿ®† úrÝ×E_;þÒÝ$±ÿpÿIÿÿäþ•þ;þäý¬ýwýPý+ýýýëüÝüÃüªü‘ürü[üPüYügü€üƒürüEüùû‘ûüúeúÐùqùIù`ùùÐùú8ú\úú³úûÄû°üçý*ÿeg7½J‚²òDÖ=N;ò„õiø§‚}Ž»øA›„÷FZ8áZºû4d”ìÿbÿÿÈþ˜þXþþý‚ýèüPüÌûjû=û:ûYû€û¥ûÁûÌûÄûÁûÇûÏûàûèûÏû‘ûû\úyù‚øˆ÷ªöÿõ{õõÇôyô;ôôTôõ@öû÷ ú,ü%þ´ÿÊrà<½wy®ÿ<0 È ï º D §þdåšr\E:@mÇPù¬> „  coS2*[ÉrUPG&⃠—5æÿ¹ÿÿŒÿ|ÿ]ÿ'ÿÙþ|þþµýPýèü€üü¥û'û„ú·ùÅøÎ÷óöNöéõ¹õ¼õàõ$öoöÆö&÷ª÷iøcùúÿûaýžþ•ÿ@šÇé#‘4ûôÕ‰ñÌQÁ-ºTÂttËe"yœ¢¥´ÿáþ3þµýoýPý^ýwý™ý¡ý‚ý9ýÌüPüÚû{û,ûûÿúûNûŽûÝû)ülüµüýiýÈýþ-þþ–ýóü,ümûÄúCúÓùhùøø‚øøß÷ øµøáùxûGýÿpgâ7–GAbx[ù9.è…¸~N,ãQ;•ƒÌÇa—‡Rübÿõþºþþcþ-þíýªýfýBý?ýaýžýâý(þXþ|þþ£þ´þÓþáþïþäþËþ£þhþ-þÙýwýýzüàûTû¿úFúçù£ùù¦ù÷ùhúúú¨ûwüqýþ¨ÿ¨aÌèÆŽYElÆPó¡6›¿qÆ<Æo#注ÚHå§cò6Š»ÄÁáÿ-ÿ´þyþXþ;þþßý…ýý§üHüüöûÿûü:üVülüƒü™ü¢ü‘üwügügüzü‘üŸü–ülüü—ûæúúAùtøÆ÷+÷³ö\ö\ö¸öˆ÷Öøyú^ü>þÞÿŸÄ­”ª Æá'mo íƒ ”C$5m¥ÏÚij°ÒoÆóÚlš†IÝÝŒÿ*ÿÍþqþðýMý–üãûHûæú¿úÒú'û‘ûü}ü×üý?ý9ýýÔü‹üHüüüüûôûÝû°û\ûüú‡úú©ùUù(ù>ù’ùúæúãûýhþáÿY²½k®˜;ÈMûå iõ¥†;Öe©]Ñ™[<9fÀ3¤äÓyÔëÝÂÿºþßýDýåü§üŽüˆüiü)üÄû@ûÊú{úQú_ú‰úÇúüú)û5ûûàúšúbú5úúúúúúú¿ùOù½øød÷Æö7öÍõ õ¥õöóö?øúüþéÿ\9žž€t¯GF†à äL A ç^܃dz°è 1nÎO Ð 0 C ï 0 à ‡´ Ѥz7Ï4jvÿvþýÚülü=üEürüªüèü ýýýÔüœüYüü×ûûdû,ûãú„úõùLùŠøÎ÷÷”ö7ööömöüöÑ÷êø2úŸûýcþsÿ=®ØÒÌÝ#¥UÜqÛé IÖ½©nJ" %iÜR·áÐyç3l³¾ŒpK¿ÿ>ÿžþçý1ý™ü,üëûÚûñûüSü†üœü†üEüæû~û'ûîúÞúû@ûuû~ûYûûúúkùÓøXøøø#øŠø;ù>ú‰ûý¦þ¾þîÒÒ)ç jÁÜžõõ¬Uâë4DB׋Y^Ÿ zï6P ¾‘ÂÿCÿÿçþÓþ¡þ;þªýóü4ü‘ûûîúúú@û«û#üƒüÀü×üÆü§ü‘üzüzü†ü¤üÉüâüßü™üügû¨úäùIùùù®ùúÉûýJþ]ÿFôgµàóüöîåðPœ×þÔz ‹ϰ¼é/uÌPz–§½ÉÑ˧d­=㨌”{@éÿyÿýþ‚þþËýªýµýÔýøýþ"þþÈýzý(ýåü»ü²üÑüý‚ýÜýþâý}ýÔü ü$ûCúsùÖø‚øwøËøkù\úƒûÃüíýÜþvÿ£ÿÿ5ÿáþºþáþbÿ5/1ÈA•ºæQ†Á uù¢DäR t > µÜÄ’b`§7 ü×}ñ$;ÿGþtýÝü”üˆü¸üóü#ý9ýýÉüSüÌû@ûÒú~úTúQúsú—ú¶ú®úmúúyùþø¬øµøùäù ûwüûýyÿÏëÆc½íὓÑ8º= Ê«TÅ-–­tMEJJ[oˆªÉßâÆwó:bvÿþÀý ý¸üˆüŽü°üÝüöüâü¤ü1ü¢ûû‰úFúTúšúûŽûöû&ü&üôû«û_û2û!û7ûdûûÕûü,ü&üùû”ûû‡úú·ù ùÖùbú:ûBütý¡þÇÿʃð ó¾‘{¢îw"ÅF›Åű› ÈpÊ7S{Á4×–n ; Ò  ñ k ’ –€jp¦  ^Çÿêþþ…ýýèüÑü¾ü™üYüàûHû•úÙù-ù“øø¯÷o÷J÷<÷4÷#÷÷Òö‰ö=ö öödö÷.ø‡ù ûŸüþ]ÿWüN^7ù¾š¨ô{µ6“t3å“E 対Ïî^¸ ¡*£@I'ÐF¬žJü×§VÚ:‡ÿÙþ>þÀýqýDýBýGýRý9ý ý²üHüÕûbûûÄúú’ú—ú ú«ú¨úúbúúÂù]ùïø–øRøJøøþøÅùÊúÿûBýþšÿƒu”Ÿª×&‹ Åhì@jm_QWb‰¿@m‘­× gÚXÙ; f L ÎúO»EàrùpØÿ3ÿþûýýUýMýcýzýqý?ýÚüSü¶ûû~úúžùWùùÓøŠø+ø»÷H÷ÚöƒöYödö­öH÷ø"ùWú¥ûûü;þQÿ2Ì&H@//\³&­"ˆ·©i –<ð¾§¥³Òë 1[Ž×(i¤ÅÀ›Måoþ¥gSYgd7ÕH¦ÿ ÿ›þhþ|þÖþOÿÐÿ*H$ÍÿTÿÙþvþ6þ-þLþvþžþ¯þ˜þXþäýPý¤üîû=û«ú8úéù¿ùÐù ú„ú'ûëûÀüý9þ½þÿÿÿìþáþøþ3ÿŠÿúÿgÇ=j™Ú)t×9˜íD•éQÛ€MÜf ¦ ‡ % ˆÎdÏLä„¡û.Ng£ÿ ÿ¦þqþZþcþqþkþJþ þ§ý.ý°ü?üàûûgû=ûû¥ú8ú±ù"ù©øRø+øMøµøZù5ú@ûaü¡ýÙþü²?²¦…]9"%0?DG.þ²Uþªa, ÷ñô#N‰ÌJt€l.ÆB¼2Âÿhÿ'ÿÿìþÖþ¬þfþþ…ýþüwü üÝûèû#ü€üÑüýýÌüoüü—ûNû:ûHûƒûÉûüKüiürü[üBü#üü&üMüŽüÚüBý¬ý%þ£þ8ÿæÿ¨l µO`R9% 3Rw¡¡‚twˆ˜ºá 8q±ý_ÒYàPŸÆ¸oùV®©L´UÉ&a”Åÿÿ]þçýˆýJýýÏü€ü ü¹û@ûÇúQúáù‡ù6ùõøÀø“øcø1øê÷­÷d÷7÷&÷B÷Ÿ÷1øù ú=ûrü™ý©þ’ÿg¸MÙ`ÙI˜ÈÊTí|»t?öÒ³¢œ³à&}åJ¬ø8q˜|Z6ûºi ËdðjÕ*ÿáþRþäýýUý+ýþüÃü}üüŽûúúeúéùùGùùøøáøÅø¡øzøUø+øøøøXø½øIùìù³ú~ûYü<ý-þ"ÿüÆrøf¯ä (Fe˜«´®›qDõêáêõAyÊ-ƒÝ,°/—úq ´ŠX ÎdèYÌQÞÿ„ÿ-ÿáþŠþ%þªý ýƒüëûYûÕúbúïùùùzøí÷a÷àörö!ö÷õôõöuöùö§÷zøyù’ú³ûÌüÆýžþLÿÞÿQÌ:»GÜcË36 Èt ¸Så‹BëØÏÚS­ tË(( ß»o[S^r}tU׉EÚ°Œ_Åÿeÿýþžþ;þÜý‚ý1ýâü”ü:üÌûVûÍúFú´ù3ùÅø|øOø?øUøŠøÎøùkùÂù0ú¶úYûüÔü“ýDþÜþZÿ¹ÿ{ÝNÉ?À3˜ò;¼ú'@TZQW\pŒ¿÷/dƒŒo2Ç;˜òcå}&׋=ëŒ/Õÿ|ÿ*ÿÙþ“þRþþêýÃý›ýtýMý1ýýöüÉü†ü7üÚûpûúú„ú!úÂùŠù`ùcùùÊù8úÐúƒûKüýÖý‡þÿ’ÿñÿFÝ2‘óS¡ÔçÙ¸€<ö­o7æÌÌÝô ,P{³öG“ÔöøÜ¤a Ý¢uN,Çpšÿ5ÿÖþþXþ9þþþýÑý™ýXýýåü²ü‘üuügü^üVüHü#üëû¢ûCûæú—ú_úNúQúyú¶úûTû«û üoüíülýûý›þQÿô»aß9|¤Åí0n«Þ$5F\‰ÇVƒ”‰xgVQS__H¨!y½ó4uÇ/ÿÿ|þþ™ýJýýÝü»ü–ügü)üÕûmûÿú úTúúúïùõùúúúúõùÛùÓùÓùìùúZú±úû¢û.ü×ü‚ý6þêþ˜ÿ5ÇH³ ?i€“¤»É×ßêçß˽»ÀÎß%RŠÎn¼ C{±¿¨†L®W ·nÃJ¾b±ÿÿ„þ þªýGýíü€üöû_û¿úúùù©øOøøÑ÷­÷™÷€÷i÷P÷<÷E÷f÷¤÷øqøêø]ùÂùú{úüú—ûSü1ý+þ"ÿ÷ª?¤í<]žŠ¨SgK!üìEª&§zºÖÖκ›fÀP»e£ïG¯œ‘úÿTÿ¦þõýXýÑü^üüûšûCûñú úFúòù˜ùAùïø²øzø[øRøUø]øføwø“øÃøùcùÛùeúôú€û üŸü<ýâý˜þFÿïÿŒ€Ò#49BE<1 à§g)ñÕÏãlÒE½3¬|Ó@_j_L'ä k0ß…–‰ÿ{÷ÿpÿòþ|þþ§ýJýðüŽü#ü¨ûûsúÅùùløå÷…÷S÷7÷.÷1÷H÷d÷z÷“÷²÷â÷.ø–øùÖù®ú¨û­ü¸ý¯þ~ÿ*¨K‹åSÔXÑOÅ-‰Çìô={Ï7Ÿù9`tlU Úz {ÊR¡øróƒ š|ÿÍþ%þwýßüSüÏûTûãú~ú-úòùÈù±ù©ù ùùsùIù ùÙø·øºøÙøù|ùéùbúÕú@û¥ûôû?ü‹üÚüBýµýGþïþ˜ÿ=Õ\»9f‚…iBÔ—d=),=\ƒµëJ€ÉqÓbn0ÖkÜÉÆÔÔÀ‚#¥pØÿLÿÅþ`þþÑýýPýýªüKüÝûgûéúhúÛùRùÈøJøê÷²÷§÷É÷øwøäøAù›ùÞùúTú’úñúxû)üýþÿïÿ¼S¸èùóùJ¡ |òO Ðï8e•Äô$K{­ãJu€d¢ÿ8h“Î Ÿ:à~ ÿÿvþâýaýëüwüü°û:ûÂúLúÛù|ù0ùùòøõøù ùùòøáøçøù3ùùáùLú¹úû\û¥ûñûMüÆüMýðý›þWÿÊdà9l…‹“¡Àå(0.û×¯Žˆ–¸åJ…ÀøFbssT²?ÀE׆dYoxo=ëuãÿFÿ¯þ+þ½ýoý&ýßü‘ü7üÉûNûÍúLúçù„ù6ùïø²ø…øløiøtøøÅøùhù¿ù úLúúàúHûÝûŽücýXþOÿCÌX²ê 3Gc…©ÑL›ï;s¥ØK†¾ó.d–¾ÚâÚ ~ôhêkø}”‘kÿËþ+þ“ý ýˆü üšû/ûÂú_úòù„ù%ùÑøøcø?ø6ø3øAø`ø‚ø²øøøLù¬ùú{úØú2û†ûëûYüëü¡ýtþ]ÿC#Ýd¸×ײoUMMX[[USUSU^i…ªâ kº Z æ5-÷¦3¦ ¡<뾪µÏîþùÉ{ /ÍÿpÿÿÂþ]þóý…ýý”üüŽûû—ú'úÈùyù0ùùÙøÑøÑøïøùRù‡ùÂùúWúÇúVû üâüÔýÜþÞÿÒŸJÃOq‚Š–›ž¯ÀÖûR‡¼ò*Z’¿ì é«\ú‚ðP»@Ï~@Õÿ£ÿZÿÿºþhþþËýzý(ýÚü”üMüü»ûpû,ûéú³úú‡ú’ú¨ú¿úÍúÊú³ú‰úZú2úú'úQúšúûŒû)üèüÀý¬þ’ÿs)­öè¸}N4:KuœÏþ1^‚žÃçM“Ù(sÂIpxW …þ€Ä}HÒ”TÍÿ’ÿQÿÿìþ½þþZþþ½ýcýý²üoü:üüôûÚûÁûŸûŒûpû_ûNû=û'ûû ûÿúúúûûTû¨ûüŸü<ýäýžþLÿúÿ,¢Ezž¯½ÃÉÔçø(]›Åáíêí IsÍÿÛ„Šûy ­U µKÚjúÿ’ÿ0ÿÖþþXþþâý¡ý[ýý×ü–üdü:üü üùûÝû¶ûŽûpûjûpû†û°ûÒûùûüüüæû¹û‘û~û‰ûÄû.üÉü‚ýGþÿÂÿgñV—µ­ŽoP=7/,! 2Nj†ŸÁâ i¸X¦©`µG×x)ñʨxFýÿ¨ÿCÿçþyþþÖý¤ýˆýzýqýcýGý#ýùüÏü²üœü™üŸüµüÏüëü ý&ýMýwý›ý½ýâýþýþþþþþ9þkþºþÿÿ‘ €â.l™µµµ¤Žwd[^r“Àö3t¦ËÙÜäø8Wsy](Îfó€Ì‹\,ù¶\÷ÿ’ÿ*ÿÍþyþ3þþýËý‚ý4ýßü†ü4üñûÄû¢ûŽû†û~ûuûmûgûgûjûxû†û‘û”û‘û‰ûƒû†û¥ûÕû)ü–üý²ýRþïþ|ÿïÿK‘Äé ÷àÏǾ¾¹¼Êî&a­ó?ˆÑ`²ø6`qeA½t(篂aB)ö³dëmáÿ]ÿäþþGþ"þ þþóýÎý›ý[ý&ýóüÔüÃü¾ü»üÀüÑüÝüèüèüâüÝüßüöüýDýzý¸ýûýJþ˜þìþOÿ¿ÿ5«!ŽöS¤ç êªXü­d7/@Su¢Æåö +Bf–µËɪz9þ̪ŸŽ}d7ÿ³Y±ÿpÿIÿ5ÿ3ÿ;ÿ>ÿ"ÿúþÈþ‡þOþ(þ þþýþþ>þ`þþ¯þ·þ¡þkþ"þÈýfý ý­ülüBüHü[ü™üðü^ýÜý`þáþQÿ·ÿFjxxmjgebYQHNYp”Ä÷/g§öU¸f©ä íÅ9øµˆX<ീ2Ý~¹ÿnÿ'ÿøþÞþÓþÍþ½þ¬þþfþ3þ þêýçýøýþ>þXþ`þLþ%þõý½ý“ý‚ýý¸ýþLþžþäþÿCÿnÿšÿÐÿmÇg—ªœ}S)üÒ°—¥¾àaªþ?i}€oP)þ×µŸ”Ž‹‰‹†jB¾gÂÿpÿ'ÿçþ·þ˜þþ˜þ©þÂþÍþÜþÙþÓþÂþ¦þ›þ¡þÂþÿZÿ´ÿCT'ÐÿQÿÅþJþíý½ý¸ýÙýþ‡þçþIÿ¨ÿïÿ/_‘¹ë涃FãÿÇÿ¹ÿ·ÿ´ÿ®ÿ ÿŒÿŠÿ’ÿ®ÿéÿ:‰Ø@EB/#&2BEB/ Ý¥uN$æÿÐÿ¼ÿ¦ÿ•ÿÿsÿsÿ~ÿ‡ÿÿ’ÿ•ÿŠÿŠÿÿÿ®ÿÛÿK~—”x8ìÿ˜ÿAÿÿÐþ·þ´þËþøþ-ÿ]ÿ•ÿØÿ,‰r×+XfX.üÏ¢‰og^^^jx‹°å&f¤ËÙ×»‚BþÉœxV2Ú¨p2æÿšÿCÿêþ„þþºý^ýýâü¾üµü²üµü¾üÆüÆüÌüßüûü(ýfý¤ýóýAþþÅþúþÿ%ÿÿÿøþÜþËþ¿þ½þÅþáþúþ%ÿWÿ‡ÿ¿ÿýÿ:†ÌNlraBÚ¥b5$FjšÇë2V€§ÉÒÉ»¢™™Ÿ­¾Ä­‹V¾p'Þÿ¨ÿsÿ8ÿúþ·þtþAþ%þ"þ3þXþ‚þ£þ±þ´þ¯þ£þ£þ¯þÈþõþ-ÿpÿ±ÿæÿ éÿÊÿ«ÿÿ|ÿnÿbÿZÿWÿ_ÿ|ÿ·ÿsîoåEw}X³aذ š——¨¹Úÿ&K\dP)ùÏ®¥¶Ø Hlo\7Ò—_/Õÿ«ÿvÿ;ÿòþ¦þUþþøýðýþ(þLþhþyþ|þþ‚þ“þ¯þÙþÿ5ÿ]ÿeÿZÿ3ÿÿÐþžþtþfþcþtþ‚þ˜þ©þ½þÜþõþ"ÿWÿ£ÿe¼î ÷Ç~2áÿ¨ÿÿhÿeÿkÿÿ¦ÿÕÿ:m—Çé &@H7#ùÝÏàP§ë1)Ú§r=dž8ãÿŒÿAÿÿäþÞþçþÿÿ3ÿ3ÿ"ÿÿêþÐþÐþçþÿTÿ•ÿÊÿñÿýÿïÿÇÿ˜ÿhÿ>ÿÿõþÜþ·þžþþþ¬þìþLÿÍÿYã\œ³Ž\Ý°š”š¨¶Õñ/Ng€—µÄÌɸ™xP,üôùüÿùà³H Óÿ’ÿZÿÿçþ£þcþþÜý²ý–ýýªýËý þJþþÖþÿ_ÿšÿØÿ :b{Œ”——ƒƒussx~ƒƒŒ‘°Ìù&KgdHÒ~'ÕÿÿLÿ'ÿÿÿ'ÿ>ÿWÿnÿÿÿÿ¦ÿ´ÿÊÿæÿ÷ÿñÿáÿÓÿÇÿÓÿæÿ 8b{‘pQ:'æÿ®ÿeÿÿÙþžþ„þŠþ¦þäþ3ÿŒÿãÿ5x°Ú&Kr”­³¥ŽlN2÷ëÝÚÝë /o³ü1U[G׉EÏ¢uQ5!/8HQ\m‰¢¹¾¶¢‰pT=2,52$ñÿÇÿ’ÿZÿ"ÿïþ·þ„þUþþäý¬ý‚ý[ýBýBýXý‹ýÎýþ`þ•þ¿þÜþìþõþÿÿÿ*ÿ>ÿLÿ]ÿhÿÿ¦ÿÇÿéÿ=e†¢¶ÌÝô2Yo†Ž‹}^: 漨¢®Êéñæîÿ!=@2Ì‘e=5:Qexub/ãÿŒÿ0ÿçþ´þþqþRþ+þøýºýýiýfýý¸ý þcþÂþÿkÿ®ÿáÿ5Qx®é!HYP7æÒÕë!d³þ<i……w[?ùÏ¢xN) ôÝÕÏʹ¢K ÇÿŒÿhÿbÿ|ÿ®ÿìÿ8=*Øÿ®ÿŠÿ|ÿ„ÿÿÂÿÞÿïÿÞÿ´ÿpÿ3ÿýþÐþ¬þ“þþ`þAþ"þþçýâýêý þDþ‚þ¿þìþÿ ÿýþçþÜþçþÿ8ÿyÿ¿ÿ5bƒ—¥®ÁØü)HlxoS!ã \!ïÿÊÿ·ÿ·ÿ¼ÿÇÿÞÿôÿ*:F:ãÿ£ÿeÿ3ÿ"ÿ%ÿCÿsÿ¦ÿÍÿæÿôÿúÿôÿúÿFs—³¼¶¢{Q$ôÿÇÿÿpÿFÿ"ÿÿïþäþêþÿÿFÿ„ÿÅÿýÿ*HN8ïÿÂÿ£ÿŠÿ„ÿ~ÿ|ÿsÿpÿ_ÿQÿLÿWÿsÿ®ÿ÷ÿY¾!jœª§”x^HB4=@N\o€‘—‹oN¾e®ÿsÿ_ÿbÿyÿÿ®ÿ±ÿ£ÿ~ÿQÿÿïþÖþÅþÅþËþÞþäþêþçþÐþ¬þ‡þfþJþ;þ-þþþþþþ3þcþžþäþ%ÿ]ÿ’ÿ´ÿÓÿáÿáÿæÿìÿìÿ8bƒ¨Çàñùÿÿ 4BNE)Ïb2 ôÿïÿ8Yx—¨«Œ_Êÿ~ÿCÿÿÿÿ3ÿFÿOÿLÿ;ÿ*ÿÿÿÿ5ÿQÿnÿ|ÿÿpÿLÿ0ÿÿìþÞþêþÿÿ%ÿ"ÿÿòþÖþÐþÜþÿFÿ˜ÿïÿF‰³Ä¾³¢š”—š‘†~{†¨ã#{Ï&i–§§–wU9ëÔÁ­Ÿ™œ¥³»³œj#Ê_ïÿ‡ÿ3ÿïþ½þ˜þvþXþ6þþßý¯ý“ýzýoýlýlýqýzýýzýqýcý[ýMý<ý6ý4ýMýoý›ýËýþ;þvþ·þõþ>ÿyÿ¹ÿF†Êü#@P^oƒ”ª¸°¢ƒY4 !:So€x\,ñ«pF/$8_Øa—³µ¥‘lP4! ñÝʨ{Fáÿ¼ÿ ÿ˜ÿ•ÿŒÿ|ÿeÿFÿ"ÿúþÓþ¯þ•þyþcþLþ+þþ þ þþ"þAþkþ˜þËþòþÿ8ÿQÿsÿ’ÿ¹ÿáÿ5Y{‘¥³¶ÄØù#Y‰µÝö)?Xit…‹‹…wf^XazžÆêøÙ¡Xþ™:é«p@Ûÿ ÿ_ÿÿÞþ¯þ‡þqþXþDþ-þþÔý¤ýlýDý(ý ýýýûüÝüÃü²ü°ü¾üßü ýlýÃý þOþ|þ˜þ£þ¯þ¿þìþ0ÿŠÿïÿN«ü:g‹¢µÆÝó  4<B7&üâ̳”oHñϹ³ÄãNr€rKăW8,*æÿ±ÿsÿ5ÿÿäþÖþìþ ÿ8ÿWÿbÿ]ÿCÿÿäþ¿þ›þ‡þtþ]þ>þþðýÎýÀýÆýíý"þkþ©þáþÿÿÿïþÜþÖþòþ0ÿÿãÿF—Òôüùü÷:l§à .Pi}Žˆˆ‚…–ªÀÑ×É¡^ §EàŒ@Õÿ«ÿ|ÿLÿÿÜþ“þJþ þÑýžýý[ý<ýýýëüÚü×üÝüûü ýMýtý™ý²ýÈýâý þJþ•þìþ8ÿÿ·ÿÕÿæÿãÿÛÿÕÿÕÿáÿ2j ãE\rƒ‰‹”—‘މxdH!ÿà̼³®¥š”‰†ƒŒš®ÁÏÕ̼«š”‰ƒse:Âÿ„ÿ8ÿýþÖþ¿þ¿þÖþøþÿÿÿÿìþÐþ±þ¡þþ‚þyþkþUþ6þ"þþþ-þXþþÈþÿ%ÿIÿZÿbÿ~ÿÿÂÿæÿ2KT\\bm†¢ÊñBarxo^K@BSj†§Éî 1Piw}zdJ.Ú­{NÝW·ÿhÿÿËþ„þDþþÃýýJý ýùüÔüµü‘ü€ülülürü†ü™ü°üÀüÏüëü ý1ýcý¡ýäý9þþÙþÿWÿÿ¦ÿÍÿæÿ@s®é!P}Ÿ¾Ýü.EPP9Y/ ôÝʹ°¼Êà&#T*ýÿýÿéÿ´ÿ|ÿCÿÿøþäþçþïþøþýþõþìþÐþºþ¡þ‡þqþfþhþZþXþLþ9þ0þ%þ9þJþnþ¦þÖþÿ*ÿIÿ_ÿkÿÿšÿ¹ÿáÿ8_ƒ¢¶ÁÇÌÚë ôÝÏÊÒë/Y€¢ÁèEi…œ}U è°‰gP:)بm,ïÿ´ÿsÿ>ÿÿËþþUþþÜý›ýfý<ýýþüöüöüóüöüþü ýý9ýXýqýˆý“ý§ýÃýêýþUþ›þÙþÿIÿ‡ÿÇÿW¥î)Yu†‰”œ­ÆÝîöîÒ­uB÷æéë÷&4BN\gogS4 ëÏÁ¾ÌÚéîãÊ¢j2ñÿÂÿ£ÿ‡ÿ|ÿpÿeÿTÿ8ÿÿïþÅþ¡þ„þyþ|þ|þ‡þ|þyþfþUþGþGþJþ`þ„þ±þÜþÿ%ÿ8ÿLÿWÿhÿÿšÿ¼ÿãÿ 2Y{š¹Øù,BPS=#ÿض ®Ïÿ:x¸ð7BJGJJE1èÁ—xY4à¥bÐÿ•ÿWÿÿïþÈþ¦þ˜þ‡þnþUþ0þ þâýÆý¸ý¬ý½ýÈýçýþþ0þ>þAþ;þ6þ-þ+þ0þ0þAþcþ˜þÙþ0ÿ•ÿýÿb¼ P{””‰rYSSg†™¥­¢ƒd7 ëØÒàÿ2Pd}†””‘}lS,ñØÇÇÊÊǰY$áÿ ÿeÿ8ÿ%ÿÿÿ%ÿÿÿòþÓþ¬þ“þþ“þ¦þÅþäþÿÿÿÿÿÿ%ÿ5ÿCÿeÿ„ÿ¦ÿ·ÿÅÿÅÿ¼ÿ¿ÿÅÿÛÿúÿ'Hgx†‰†{xxƒƒxbC$ìÿÛÿãÿôÿT ëBƒ°ÒàâÚÆ¾§—€a=ñÒ°—sQìÿ±ÿsÿ;ÿÿáþÅþ´þ£þ“þtþLþþâý²ý…ýlý^ýaýiý…ý–ý§ý§ý§ýªý½ýÖýðýþ;þhþ›þÜþÿeÿ·ÿTŒÁé  ):Ndrro^N:# ÿéÝÕÝãÿ/BP\ad^YKNBHNNB2Õ”Fýÿ´ÿ|ÿOÿ%ÿúþÜþÈþ·þ£þ•þþ‚þyþyþ|þŠþþ£þÂþÜþòþÿÿ5ÿLÿnÿŒÿ¹ÿÞÿ*,'÷ÿýÿ 'Hm‘¨¼¹«”uYK@@=@8,ôÿÛÿÊÿÇÿÊÿÓÿïÿ=Tg~‘¨Çà!4ENB,æ¼”g= áÿ«ÿ|ÿIÿ%ÿÿÞþÅþ©þþyþfþUþ>þ+þþþøýíýÔýÃý¤ýý}ýý‚ýý¬ýÑýûý3þnþ¬þõþ;ÿ„ÿÂÿ÷ÿ/:@=:8=@@@:'  $2=CC:228=K\jx‰‘š¥³Çàÿ!B\rujNë¥\Ûÿ¨ÿ‡ÿkÿQÿ>ÿ*ÿÿøþÞþÍþ½þ¿þÈþÖþçþêþäþÜþÅþºþ¯þ´þËþçþÿFÿyÿ¨ÿÐÿáÿãÿÕÿÐÿÐÿÞÿñÿ@p”«¹¹¨”ƒmbY\YTKH=2*  !/FWpŒ¥Çé,7HPPN@) ôÝÇ ~T/Øÿ®ÿÿTÿ'ÿøþÍþ´þ£þ£þ£þ›þ‡þnþAþþðýÎý½ý²ýÎýóý%þcþ˜þÐþýþ0ÿWÿ|ÿšÿ±ÿÅÿÊÿÍÿÐÿÓÿÛÿìÿ!',*'*=\xš°¼¾¾¼¶°®¨—\@ñÿñÿúÿ8_‘¶ØëîæÒ¶š{Q2÷ÿéÿÕÿÊÿ´ÿ£ÿ’ÿ~ÿeÿQÿIÿCÿQÿbÿyÿÿ£ÿ·ÿ¿ÿÂÿ·ÿ®ÿ¨ÿ®ÿ·ÿÐÿÞÿìÿïÿæÿÕÿÐÿÐÿãÿ8j ÒñÿôÒ«\F/! úÿôÿúÿ!!$éÿØÿÍÿÍÿÛÿñÿ=bƒš°¹ÄØñ !44/ÿãÊÁ¶¶¾Á¼° ~\:$ñÿÕÿ¨ÿ~ÿQÿ*ÿÿïþçþòþÿÿAÿhÿ’ÿ´ÿÕÿïÿôÿýÿôÿñÿ÷ÿúÿýÿúÿôÿìÿÞÿÕÿÊÿ¹ÿ¨ÿ ÿ˜ÿ£ÿ«ÿÅÿØÿìÿ÷ÿ ýÿ÷ÿñÿìÿïÿôÿýÿ /Q~³ØüÿëÚÒÚæ÷Ï sC!ôÿæÿÕÿÅÿ·ÿÿ~ÿeÿQÿCÿ;ÿ;ÿ5ÿ'ÿÿõþÞþÈþ½þ¿þÙþúþ0ÿbÿšÿÓÿôÿ ÷ÿñÿôÿïÿãÿÞÿØÿÐÿÓÿÛÿïÿ,FNT@,ýÿôÿýÿCb~‰mT5úÿýÿ$*$÷ÿ÷ÿ!8FF2úÿÛÿÍÿÅÿÇÿÕÿÛÿÓÿÂÿ£ÿÿ]ÿAÿ0ÿ-ÿ;ÿQÿvÿšÿ¿ÿÛÿïÿñÿïÿãÿÛÿÕÿÍÿÓÿÕÿØÿáÿìÿýÿúÿïÿáÿÕÿÕÿáÿñÿ!@TbbN8éÿÊÿ´ÿ£ÿ£ÿ ÿšÿ˜ÿšÿÿ«ÿ¼ÿÍÿãÿñÿ*:Tu”¢«°¥¢¢¥¨³¼ÊÒÕÕǹ¥‘{jWK8!æÿ·ÿ˜ÿ~ÿpÿnÿeÿbÿQÿ;ÿÿúþÙþÈþ½þÍþêþÿ%ÿ0ÿ0ÿÿÿìþÜþÍþÐþÜþõþÿ'ÿAÿQÿeÿpÿyÿ„ÿÿ˜ÿ£ÿ®ÿÂÿÍÿáÿæÿñÿýÿ!5@@2$ ôÿÞÿÐÿÊÿÊÿÛÿæÿôÿýÿúÿïÿæÿÛÿÛÿáÿôÿ5=@:5/'ñÿáÿ¿ÿ£ÿ|ÿbÿAÿ'ÿÿ-ÿ;ÿTÿsÿ„ÿ’ÿ•ÿ’ÿ‡ÿ~ÿ~ÿ„ÿ‡ÿŒÿÿŠÿvÿ]ÿ>ÿÿêþÍþ½þºþºþÜþÿ8ÿnÿ¨ÿÓÿìÿñÿãÿÍÿ±ÿ•ÿÿnÿbÿ]ÿbÿvÿÿ®ÿÐÿìÿ/@Q\m{‘¢³¼ÇÇÊÄÁÁ¾ÊÊÏÌͰŒ{ujbN@/÷ÿÕÿ·ÿ•ÿ~ÿeÿ]ÿ]ÿ]ÿ]ÿeÿkÿsÿvÿsÿvÿyÿ‡ÿŠÿ’ÿšÿ’ÿŠÿpÿQÿ5ÿÿçþÈþ¯þ©þ¬þºþÓþïþÿÿ'ÿ3ÿ;ÿFÿTÿkÿ„ÿ£ÿ¹ÿÓÿæÿôÿ÷ÿ÷ÿ!úÿÛÿ¼ÿ«ÿ¨ÿ±ÿÇÿãÿýÿ$2:@FQ_j{†ŒsY@÷ÿãÿØÿÅÿ¼ÿ·ÿ«ÿ«ÿ®ÿ´ÿ¼ÿÐÿØÿïÿ ýÿïÿáÿÓÿÇÿ´ÿÿvÿLÿÿïþÐþ¿þÂþÖþïþÿ-ÿCÿLÿOÿ;ÿ"ÿÿäþÅþºþ·þÅþÞþúþÿ-ÿ;ÿLÿWÿ_ÿhÿvÿŒÿ¨ÿ¿ÿáÿúÿ:\ƒ¢ÁØîù )E\ox€†}{rj^N:ÿÒš_'ôÿÊÿ«ÿ˜ÿ’ÿ˜ÿ®ÿÅÿáÿ÷ÿ éÿÓÿ¹ÿ ÿ‡ÿkÿWÿFÿ8ÿ0ÿ'ÿ'ÿ*ÿ8ÿCÿQÿ]ÿeÿeÿeÿ]ÿ_ÿkÿÿ¦ÿÇÿæÿúÿýÿìÿÛÿÍÿÂÿ¹ÿ´ÿ±ÿ´ÿ¹ÿÅÿÞÿ÷ÿ,=N\m~‰‘—”””Œ{gN,ìÿÕÿÇÿ¿ÿ·ÿ¹ÿ·ÿ¹ÿÂÿÍÿÞÿñÿ !8KY_YQC2! ýÿôÿìÿáÿÓÿÂÿ±ÿ ÿŒÿ|ÿpÿnÿhÿhÿkÿeÿ_ÿOÿ;ÿ"ÿÿÿêþäþÖþÖþÖþÖþÓþÙþÙþÜþÙþáþçþúþÿ0ÿWÿÿ¨ÿÍÿñÿ 2Hb{ÁîPƒ°ÒëóîÝÆ¢€gK&ÿÏšg*ñÿÂÿÿŠÿyÿsÿnÿsÿvÿ|ÿÿ„ÿŠÿ‡ÿ~ÿhÿTÿCÿ3ÿ'ÿ"ÿÿÿ ÿÿÿÿÿ3ÿFÿ_ÿyÿŠÿŠÿ„ÿvÿhÿTÿOÿOÿeÿÿ ÿ¿ÿÕÿæÿìÿæÿÞÿÕÿÐÿÐÿÐÿÓÿÓÿÕÿÐÿÊÿÇÿÅÿÂÿÇÿÕÿìÿ 'Fb~š¶Êàî÷ùôéÕÁ †gC$æÿÕÿÊÿÐÿáÿôÿ ôÿÞÿÇÿ´ÿ¨ÿ ÿšÿšÿšÿ˜ÿ•ÿÿnÿZÿAÿ5ÿ-ÿ3ÿ8ÿOÿ_ÿsÿ„ÿ˜ÿ¦ÿ£ÿÿŒÿvÿhÿhÿnÿyÿ•ÿ¨ÿ±ÿ±ÿ¦ÿ ÿŠÿ„ÿvÿvÿsÿsÿyÿpÿhÿZÿLÿAÿAÿQÿkÿ˜ÿÐÿH†¹÷&Y†³Ôîóî×­xH澚sK/ éÿ¿ÿÿÿeÿWÿLÿOÿWÿhÿsÿ„ÿŠÿ„ÿvÿ_ÿ>ÿÿòþÍþ¯þ˜þ„þqþkþfþkþvþ“þ¯þÐþïþÿÿÿ%ÿ%ÿ"ÿ%ÿ0ÿAÿWÿpÿŠÿ•ÿ ÿ ÿ•ÿŠÿ„ÿÿŠÿŠÿ‡ÿ~ÿkÿLÿ0ÿÿÿÿÿ"ÿ;ÿbÿ˜ÿÇÿúÿ2b‘¹ØëùôîãÝÝÝØÕ¾¨\:$ýÿìÿÓÿ«ÿ‡ÿ_ÿ3ÿ ÿäþÐþºþ¯þ£þ¡þ“þŠþ‡þ‚þ‚þþ•þ¡þ©þ´þ±þ¯þ¬þ£þ¦þ¬þ¯þºþÈþÖþçþøþÿÿÿÿÿ8ÿZÿÿšÿ·ÿÂÿ¿ÿ¼ÿ´ÿ®ÿ®ÿÂÿÛÿ={Áù)Y}œ¸ÁÌÉÉ»ª—oK\2úÿéÿÞÿÕÿÂÿ®ÿ ÿ’ÿÿŒÿÿŠÿŠÿ~ÿnÿWÿ>ÿ%ÿÿìþÙþÂþ¯þžþ“þþ“þ›þ¦þ´þÂþÖþáþïþÿÿ5ÿQÿvÿŒÿ ÿ±ÿ·ÿ¼ÿÂÿÂÿÅÿÂÿÊÿÊÿÇÿ¼ÿ±ÿÿ~ÿ]ÿ*ÿýþÐþ¯þŠþvþyþþÂþýþAÿŒÿÐÿ 8\p{†Œ¢¹ÊàîôñãÝæ÷@d{ƒx\/ÝÁ³°¢š{Náÿ®ÿÿ_ÿAÿ'ÿ ÿêþËþ¦þ‡þnþ`þZþ`þtþ|þþ›þ¡þžþ›þ›þ¡þ¬þ¿þËþÖþÙþÓþÍþÂþºþÅþÖþïþÿ-ÿAÿQÿ]ÿnÿyÿÿŒÿÿ¼ÿãÿTŒÇÿ,Vu†Ž‘‰†ulaSH2ñÝÌÄÇÌʼ¥W*ôÿÅÿÿ„ÿkÿTÿFÿ>ÿ*ÿ ÿõþÜþËþºþºþ½þÈþÍþÓþÓþÍþÈþÈþÙþêþÿ5ÿ_ÿŒÿ·ÿÐÿÞÿãÿãÿéÿïÿ÷ÿúÿñÿÞÿÅÿ«ÿ’ÿvÿZÿCÿ8ÿ8ÿLÿnÿ ÿãÿ'e—°¾¾¹¶³³³¾ÊÚÝææàñ!Bj}‰ƒrP2 îÝÏǶ ~Y/Ûÿ®ÿŒÿnÿOÿ-ÿÿÿõþäþçþäþòþÿÿÿÿ%ÿ"ÿ'ÿ-ÿ3ÿ>ÿCÿIÿQÿWÿZÿbÿkÿvÿŒÿ£ÿÅÿæÿ',!úÿñÿïÿýÿ*Wu¼Øñ/7:7/! îÒ°”ƒu{~xmg\H=' ïÿÓÿÅÿ¿ÿÂÿÅÿÇÿÂÿ´ÿšÿ|ÿZÿCÿ*ÿÿ ÿýþõþïþäþáþäþïþÿ-ÿOÿyÿšÿ·ÿÅÿÅÿÂÿÅÿ¹ÿÅÿÇÿÛÿáÿìÿïÿïÿéÿãÿÞÿØÿØÿÛÿÕÿÍÿ¿ÿ¨ÿ•ÿ„ÿyÿ|ÿÿ ÿÊÿôÿ/CWbmusj_\WNQTe{«Êãù#2=ENPN@2!îÝÁ¨~KÕÿÿZÿ'ÿýþäþÙþÐþÐþËþÍþÍþÓþÙþêþøþÿÿÿ*ÿ-ÿ*ÿ"ÿÿÿÿ%ÿ-ÿFÿWÿkÿ~ÿ˜ÿ®ÿÅÿéÿ'8Fg{”³Òë &BYoxƒƒƒ{oYE, ôãØØàæéãÝǨW/Øÿ·ÿ•ÿyÿZÿOÿFÿAÿ>ÿAÿCÿ>ÿ5ÿ*ÿÿ ÿÿïþáþÞþÞþìþÿÿ8ÿTÿsÿŠÿ ÿ£ÿ¨ÿ±ÿ´ÿ´ÿ¹ÿ¼ÿ¿ÿ¿ÿÇÿÊÿÐÿÓÿÛÿìÿôÿ ÷ÿãÿÍÿ¼ÿ´ÿ¨ÿ«ÿ«ÿ«ÿ®ÿ®ÿ±ÿ±ÿ·ÿ¼ÿÂÿÓÿÞÿïÿ $8HQ__Y\\m{‘¨¹¾Ä¼¼¶®¨«¨¥¥ š‰mN,æÿÂÿ•ÿpÿOÿ*ÿ ÿìþÓþ¿þ¬þ¦þ©þ´þÍþêþÿ'ÿAÿFÿFÿ3ÿ"ÿÿÿÿ"ÿ5ÿFÿTÿ_ÿbÿhÿpÿyÿ‡ÿšÿ´ÿÇÿáÿ÷ÿ'8HT_p~†‰Œ‰Œ‘”——†{{†š³ÏÝÝÒÁ¥‰sjju†‘š—‰x_@* ÷ÿìÿÐÿ¨ÿ~ÿOÿÿýþïþòþÿ3ÿTÿ|ÿ˜ÿ¦ÿ«ÿ£ÿ˜ÿ’ÿŠÿ‡ÿ~ÿvÿZÿ>ÿ"ÿÿêþÞþÙþÞþìþýþÿ8ÿTÿnÿ„ÿ’ÿ•ÿšÿ£ÿ ÿ¦ÿ£ÿ«ÿ¨ÿ´ÿ¿ÿÍÿãÿúÿ'Hm”¾P¥âùÝŽ#¹e=\³7ÄE¡½…S‰Çÿ;ÿÞþÈþÓþïþÿòþ¿þtþ(þþýþAþ£þÿCÿWÿ>ÿ ÿÓþ½þçþLÿìÿ®o l…P×,bŒÿËþ%þ²ýwýfýýªýÙýþýþþ+þAþcþ“þÈþýþ8ÿhÿŠÿšÿ«ÿ´ÿ¹ÿÇÿÞÿýÿ,j°N‰¾ë?r¯ûG…·È¬k¤BöƵÁÚèðâÆŸd ¢2Íÿvÿ8ÿÿÿÿÿõþÐþ›þLþõý™ý<ýëü¢üiüBü4ü,ü4üBü[üuü”ü»üýRýÃýDþÐþ]ÿÞÿT¾a­ð1i‹œŽi&î°‹{޾Bw™¤ŽX¾j)ôÊ¢{Hýÿ ÿ3ÿ¿þRþþÆý²ýÖý6þÐþÿ{\+ƽBWyÿ´þþºýfý(ýèüŸüdü?üHü}üâüfýóýkþ±þ·þŠþ0þÙý¡ý§ýøý˜þpÿ\7É×}:!@—#ª `[»X ââþ.þÒ¢ƒ‰³öM¡çÃiþ‘&Áp,ìÿ·ÿ‡ÿ_ÿCÿ3ÿ%ÿ*ÿ0ÿCÿLÿZÿLÿ0ÿÿêþÐþËþÍþÜþòþÿÿÿäþºþ“þvþqþ„þ¯þìþ8ÿ|ÿ¦ÿ®ÿ˜ÿeÿ*ÿøþÞþòþ3ÿ~ÿÇÿôÿñÿ¼ÿ]ÿòþŠþGþ-þRþ˜þýþbÿ±ÿáÿãÿÊÿ±ÿÿ ÿÂÿ jÝVÆ1…ÎJäRÍNÍ/o{Cã_ÓZýÙÙõ"A6žˆö{æÇ®{/®ÿúþ-þJýgü†û¶úõùAùøÜ÷7÷ªöHööéõ÷õ)öröÌö÷^÷Ž÷­÷¯÷Ÿ÷}÷J÷÷óöîö÷J÷­÷6øÑøkùú{úàú2ûrû³ûôûPü»ü4ýºýGþÍþIÿ±ÿgÊNþßWÏ^Û / ? þ f Ž ‹ ‹ ² ÓÅÝîå˜ðÅ^ßMÆ=°b£Ù z ñ m ÷ p Ð ç°!D.çýèûúløëöpõô“ò/ñÕïŠîRí:ìNë„êäéRéÈè]è èÙçÎçðç3è¦è6éÖévêë¨ë:ìÀìBíËí`îïýïñ&òfóÂô@öè÷ºù¾ûþeåN‹c ¹ ù  ! P Ì ¤ Ëd}?˜…X†¼˜;ä˜0É G Ñ g  Ï p é  òwÄø7°nÿ„þÙýMýÆüü@û8ú ùê÷ööYö/öƒöM÷Xø•ù¶ú{û»ûgûŒúsù[ø…÷ ÷÷J÷»÷.øˆøÃøïøùUù±ù>ú÷úàûßüøý*ÿ~¯h lk ï Þ A 6üئ›Ø= ÛÒš-©“§<»W~ÿºþþ¯ýlýDý.ýýýÝü¤ülü)üÒûbûÛúTúÊù`ùù²øXøøœ÷÷rö¿õ!õ´ô ôáôpõ4ö÷À÷OøøŠø[øø»÷w÷M÷J÷z÷Î÷?øÈøhùúæú»ûŽüiýUþZÿ”çfô w ¿¨ø§›â¢*½™ ë ³ å P Î >|›•‡qU¯ ó Ê - 1ò<ƒƒëxüJGöl¶éÿýþóýÑüšû;úÃø&÷õ ôÑòóñƒñzñÉñUòðòqó£ówóêòòBñ†ð ðìï!ð‘ð&ñ­ñòSòqòòËò9óÖó©ô«õÔöøUù³úMüXþãç?’ œ ãÌóŽÿ”ƒè²²£- 0œ—i= b Ö§ªD“þ™üñú›ù¦øø“÷#÷‰ö¥õŒôOóòæðãï ïWîµíírìÉë7ëÛêÁêëÆëåìeî'ðòõó³õ7÷ø´ùîúVüþôÿ85×  Ð { ! Ý ¯ ¡š—¯³Iö"\& )•*·*[)¶&<# f°à:T…¼ Óî“ýØúørö8ôÃñ-ï­ì’ê"éwèŠè*éêë¶ë ìÿë¶ë@ë¿ê=êÊékéýèèèªçUç<çXçªç"èÅèéKê ëÆëoìízíÃíÜíÃíwíí§ìXì<ìoìðìÅíÐîôïÿðÆñ&ò#òÑñƒñlñ¾ñœòô=ö-ùöül_p \Ó¤¨åhb !¢!V"M#„$Þ% '»'°'Ø&%É"õèäB0ðcwÛÊÝr$øý‹ ûÒ|+Ò&»3?ž)äþ üíøÇõ×ò$ðÅíÁëê¦è–çîæÏæSç|è/ê<ìkîrððñ–ò9òàðÂî4ìé4ç8å¬ã‹â°áá”àjà¶àåábä˜è±îjö ÿ‘WÒØí‘R“{ôÕ ¬³ k ?€WʱäïA(ëÝ$Âÿ¦ÿ¹ÿÛÿïÿØÿšÿCÿÿ*ÿ˜ÿFÝi™GŽŒvÿyþ¤ýóüzü.ü üHü†üÔüý9ýý”ü­ûFú‚øxöhôŽò4ñðàðùñÐó ö?øõù±ú$ú?ø8õƒñÎíéê¦é¨êAîIô ü‘ `tù5ïFýÄ/Ø„S‰²ê  s ºÄsÝ0ÿÑüûú£ù`ùòøøîö—õŠô5ôõ+÷ú„þ™ÿ+ÃÀ„˜ÿ ý@ûúvùòø[øf÷ öTôqò»ð{ïïsïÚð3óEö¦ùÚüTÿ°¾ÿ<ýLú÷ÐóÝð>îóëêÂèJèé»ë‘ðw÷Õÿ²÷ϾŠ> {>, .´Òã*Q® Uý[÷òéî€ìîêÈé´è¸ç9çÉç£éÌìÄðäôøôúôû~ûúzøœ÷øú6ý&|¼ Ì Ò H ¦ W ‡ 2 K ™ ÙØj—”†¢æÍB ¯ 'üú,öðñeîxëäèPæyãEàÉÜFÙ1Ö8Ô ÔjÖ³ÛÈãõíù·¥ <V9 ‚wFÄ+è‘°Ÿ C X”G„ÿ}ü|ù³ö8ô ò ð%îaì¼êTé.èaçèæÃæèæJçåç¤èyépê­ë+íï)ñ`óbõööø÷føUøí÷M÷Žö®õ·ôó(ò\ðîgëtè¾åÖãGãyäMçŽëÕðxöÏû:y{d‰€ øÔ ÃTg"c).;0h0¬/þ./0Ò14s6Ž80:~;¹<>•?8AÚB.D…DC`?â8W/»"þè÷·íƒæ²á8ÞôÚ ×qÒ3ÍçÇOÃÀO¾%¾u¿ ­ÅZÉoÌÎÐaÑÓjÕOØ™ÛLßUãSç£êþìîÊïñ¤ò¹ôz÷ûsÿ-im  É ç ¬ ë " œnàBýÓùàöôó^ò™òhô3øÑý¥ Sc²&"’%î'‡)á*o,c.«0ë2¦4W5ž4S2–.Ó)¦$›&°˜( ú üalüi÷œò`î&ëéÛé[ìÇðjö=ü#"鯙ý$úJ÷~õýô«õ<÷IùQûßü§ýýgü‰ú øKõGò-ïìýèôåÖâ¨ß‹Ü¼Ù¡×gÖÿÕdÖÈ׉ڒÞãóæ]é¼éõçmä à)ÜFÚœÛmà–èJó¦ÿ\ Ý’ ã%S(û(A)-*,º.Ý1ò4—7©9v;S=Z?Ø@˜@ð= 9ü2ô+$W:f YFúôäîvê™æÀâ6ÞÙØUÓ’ÎæÊȹÅ'ÄÍÃôÄXÇ~ÊýÍûÑµÖ Ü‹á^æêîPñ ôEöføôú„þ.fl ¸zÆ9JyÖhV0ÃÁ´ùAóîxêøèÈéþìaò-ùH‘b |h±iB Ì ^ ÆýM {/*Ä…ß ] ß^ØÊ¨,ZÿhþoýwüŽû¶úõù`ùùíø>ùìùØú¹û4üüîúÖøùõ×ò$ðîkî¶ï?ò«õyùý¼ÿEj2íýñú¤÷hô™ñbï¡íì2êè‘åÃâàíÝ ÝÑÝŸàKåãêðžó„ô¡òÂî†êçç©èßí7÷R5Ý"8&á%‹#7!; /!$(a,20ö2L4}3·/ø(\ §”  ÚÄtÙýø>óçî×ë·é×çsåâËÝÀØ6ÓºÍZÉqÇ'ɒγÖÄß(è„î1òóÝññïïNðeôû¦& ÄÈN'³,Ù/F11\1±0•/.},+á))ª(™(¤(4(b&M"Na$Î÷¶ê-ß€ÖÆÑŸÑîÕÓݬçˆñ¿ù*ÿ€÷cþ@ûWùúùiý aP°!”"¶ Ä­Xq Z ôßÍÿˆüù—õ…ò2ð±î½íóììéêõèæëáÉÜ?×6Ò±ÎUÍIÎÑ7ÕòÙºÞã‘æéÒêÿëÚì·íïëðÀóV÷7ûêþ e4ùi`Ô°Å ÈþƒûÅø÷7ö_öÿöd÷¶öÓô+òTïÆìë°ëîð.ü³ /&ÿ+Ä,Û* (ï%Q%ã&O*z.2t4é5r7q9;S=Z?PB5FßI‰KJ;Eµ=º3a'Ù‚ Í89þÌü„úÌö§ñ,ë‚ã&ÛÓiÌwÇÃÀÀ¼º¸¶$´Ó²³µU¸×»ô¾ÔÁxżÊíÑÁÚ£äïù?x uãuEÌrŸof¸œ›Ñ^Œú¢õËóeõú—ƒÀ :O:i… ,"f$g&ù'3)*$,ø-/[.;+Y&!ĽÔgÃV ‡ 1^’  ³ ÷ |Wáþºøºò™íáéÔç^ç9èêMì˜î:ðÏð8ð|î¨ëõçÞãàOÝÜ–ÜºÞ âæsêžîöñ ô´ôìóÏñŠîWêå_à¢ÛØSÖ,Ö4×áØÁÚ¡ÜqÞ@à.â8äxæ3éíóEûvÂo"&l'm&O%%&ë'-*d,|.h0 2¤3v5Ô7Å:>AµBôAÀ=Å5¼*Aˆ„ (þÉü)kþÂùºóûì!æ¼ßÚ ÕÕÐÍšÉ.ÆïÂÀ¾ä¼õ¼v¾œÁ)Æ}ËªÐæÔØ«ÚUÝààùåöìvõÙþK¼å²Ô˽iPú2¼ òtýOøvõsõ øVü,ŒþT Ï Î ÐCiT²Û²Sïòh ä.Yü`¿xIAÎxÁùr3 & ­Ã@HŒ|@ Á2ÿúHöòî~ëé çšå|äºã9ãÎâGâŽáèàÇàSá§â˜äþæ•éîë‚íðíÑìòéuåìßjÚEÖTÔ•ÔBÖ‚Ø7Û{߸æjñXþH VÙÛ$}(ä)¤)a(¥&ï$#í"“#¨%§(¥+â-e/—0g1‡0Ý+?"ýöšúÝðéOäYá{àÄà,ááŒàKàVàÁßÜÝØÚÆ×‘ÕhÔ¬Ó(Ó6Ó>ÔÖØÙ&ÛÞãïéÏñÍù^4.#ôÜ{D#Ì'Ú,?2Ÿ7d<Ö?—A¥A5@¢=`:é6¯3Ç0ª-¡)$S‹1pûÚðíèÂä±ä%èÃí£ó%øWú*ú øìôòàðEòBöü+rý j š µWÅÿSüìú¨ûÆýPCÿü9ø’ôòSñMò•ôd÷Åùû«úøÞôFðªëèØåÕäeäÅãDâ¼ßVܯؑ՛ÓAÓ„Ô#×ÚÞåàðâ'äñäîåžçêJí¶ðôëöùsúûmûÒû4ü,übûäùø‹öÒõöH÷ùýÀ R×&,ò/p1Ð0/ƒ-Á,ñ,ß-+/Þ0ð28547X8Ÿ8Ã8t9®:æ;¶<==Ý$×"¶ "æe=[  æü^ýúùóöpôòñOï6íæê“ègæsä©âÚàýÞ#Ý4Û-ÙB×,ÕÈÒ)ÐÈÍ)Ì¥Ë#Ì6ÍÎúÏÅÒkÙEæòø™ AÞ*I0ú0Î.~+Æ(ó'6),"/¢1w3"5Ê6¸7Y7Ç5(3ä.ù'Ü:Ü‹÷BíÐäÓÝËØµÖÃ×¾Ú8Þá½â½âÿàkÝõ×,ÑÊåÅZÄÆ¢Ê)ÑZØ·ÞRãæSçˆç.çùæèšëEò¶ûŸ}É"J(ã+X.‡0?3Í6Û:ž>A¼As@ƒ=9¹5M3¸23Ý2—0‰+3$æ(ø ± ƒ} á j Û Eodüí÷‡ôÎòJóÍõ6ùàû‹üÛúP÷…òåìöæÃá’Þ-Þà½â¶ä@åhäqâÍß+ݗܑۜá!êÙó~û3ÿÿ#üö÷õóŽñ°ñ0ôð÷YûýóüYûïøàõ[ò5ïíîNðêò›ôÅô›óªñWïí†ëîëî½ò1÷¨úƒüªüpû>ùmötó­ð0îuë"è*ä2à[Ý[Ü9ÝÁßÅãÞéOó-ˆÀ(.+/­-'+“)D*a-Ý1'6.9;¢@±@"@`?G?•??=<Ð5b+X@öo™å ¢ìãö—ôúçíáÌÖ_Ð›ÍÆÌMÌN˫ɷÇ#Æ_ŪŻÆÈQÉÍÉÉIÉŒÉxÊüËÙÍîÏcÒxÕÙþÜ áeåZêð7öüúß \ ³ @ „ >   ÈJ ˜æ =!!ñ '!"¬#Ó%è'Š)¼*Í+Ý,P-±+®&‘Gý!õõîxêzç æ æÁæXçŽç^çÆæîåÌå"è îªö~ÿã›?€$$Çá 0þ/£È×qh† ‡ âÀ¤Å Œ ‡ ¦ ñ¦‘±ÿ‚ýyúgö–ñ»ìfèäàà¯Ü جÓHÐÎøÌžÌÌUÌxË5ÊeÉÊ9ÍAÓ ÜŸæ”ñmû›L ‰ƒ²"ä*í2n9¤=È?¶@mA‹BþCZEjFîFÛEmAi8é+Ø|»ûfE!4"£òÙ%ÿ°õÙíÈèœæ@æBæå;äâáüßßFÞ3ÞÂÞ;ߺÞûÜ—ÚAتÖgÖß×HÛ—àrçï‰ö°ü²•góý,ûû÷pôæðîƒìÆì5ï·ó¦ù¨Ö P 1  € K .  Wv$7(-*Þ)Ì&ÿ LùO ?%ÿ×ü¥û±ú;ù÷Iô‘ñãï$ð¯ò^÷žý›, 5Üû>{ ¯ 9 ç ' 4 ˆ ö ®  i7 «ÿ„ý‘þxûÙø ÷‹öüöøù6ùó÷Cõzñí˜è~ä&á´ÞèÜHÛ‡Ùw×QÕnÓåѥЮÏÏÄϲÒÂØÔáŽì÷? ’sš «&—+Å._0/12?3 4U3¿0Ò,[(“#1ð/Ø «î¨ÿÿ†Xè ¯ ¡ B ú ª<ý]øõfóó|óô|ôvôfódñïöì‘ë¼ê-ê·é`éé²èè#ç‘æçÈèaë î)ðuñ×ñ ñäîuë&çÀâéÞ×ÛkÙ“×jÖÖ¤Ö.ØÚ×Û?ÝòÞUâÐèBò¾üÏV Ç0=;z5!"%²(h+,-©.¶03³6q9m;j<Ê;É8?3Ê+“#ÌWNƒ 0 ' = t÷WIŸ zD²ý“ø‡ôÏñ=ðï‰ï ïvïïŠîîÀí3í…ìÚëHëîêÏê ëšëzì¤íçîð#ñ ò²òÀòíñ,ð§íšê^çCägáÛÞÚÜœÛ7Û‹ÛHÜMݱރà ãüæ?íñõÊÿŇòöžg#Õ&W*J-›/¥1Î36)89û99T6u1¦*™"TÎß µ!SÞ ) U ß Õ ‘˜]ÿ/û}÷Åô>óªòòcòÝñÌð_ïÅí&ìšêIé[èóçè]èÂè-éÍéë.í,ð‡ó¶ö8ù¼úûú.ø„õfò÷î@ëaç‚ãÄß[Ü•Ù¸× ×œ×%ÙôÚ[ÜRÝØÞ¯âïé·ó²ýÞÕ jWí\êª"_&•)÷+§-G/u134Õ6œ8%978˜51ô*ß#þYt!N ÂgÆSE è:úùõBòññlñÔñÁñÒðòîƒì2ênè<çjæ«åæä$äžãã0äŸåßç±ê¬íKðüñaòlñkï¤ìnéæåMâçÞ¾ÛõØÝÖŸÕ!Õ5ÕÇÕíÖ¦ØôÚAÞ£ã×ë&öƒÎ[ã3"Ì"¥'Í+“.01a24%5‚4ö1[.*¥&ó!Egg¬ Ò ¯Ì  ï¡%Æ0Œ ¶Žûµ÷ ö¿õ{õ¦ôkóGò?ñØï"î¡ì³ëSë,ëîê£êÄê³ë‚íñïºò¥õ¬ø¹ûvþp{a*øýôúa÷Šó±ï¸ëzç ãÂÞüÚê׳մÔFÕÎ×…Üyã<ìõºýÉ(½Ð K 8áLÒed!`#±%f(+‘,_,* &Ä N¨ 8 B.Ò• [ =°Y'8 é û™÷¼õÇô-ôÀó˜ó‡ó óÉñÐï“í†ëêé©èçè£é£êÄëâìî¶ïâñeô¾ö`øíøiøÁöô¥ðí±éœæÙã4áqÞ™ÛÙD׎Ö×ÙÚÜã€ë/õ6þæ¯C ñ æ #x1M"&w(û)_+,-|/—1z2u1X.Ð)¯$Ø«`‡©•L_E—s ´ všùû]ø öÇôô•ó"óò”ñÞï|íÊê[è”æ‘åYåàåçïè$ëcí~ïrñwó¹õ.øúHü ý°ü¹úo÷JóÐîê¸æOãdàÞz܉ÛdÛHÜŠÞžâíè:ñLúoMs a ù <X‘àd!Þ$o'k)$+Ò,G.þ.^.2,µ(‚$ ~¾Ú. G Á÷¶zŒ H ( Ñ = ‚ô/ßýrûú0ù›øå÷÷éõôÔòÁðvî1ìTêéDè.è¬èvé@êàêNëñë í˜î\ðüñóDóßòßñmðÙîPíÄë$ê(è‘åPâºÞŽÛnٷؠÙ<Üèàè=ñ$ûÂÈ  å ‚ "~Âò#')æ+^.Ò0B3©5S7 7ð3..Ø&¾Y† ½ òÅ ‰ } !*• ô2 ûH÷/õ„ôáôéõ&÷ø1øS÷°õ‡óÿð9îÉë@êØéjêƒëŸì…íDî$ï=ðœñ ó´ô!ö÷ööÕõ¯ó³ð3íŠéñåžâ£ßðÜÚ©Ø×îÕŒÕoÖ5Ù6Þxå6îüöþ1tËÄÒ YÀ¿ 'I+Ú-y/‡081T1„0Å.:,õ(È$ÍW¥7 K 8 Ô  » Ø  S [òÃÄHp¿þgüÍù+÷`ôañîEìîê_êTê¥ê\ë–ìZîuðÃò/õÃ÷‡ú.ý_ÿÌE¹ ÿBütøêó$ï{êæ¸á¯Ý,Ú^×,ÕnÓ3ÒÜÑ6Ó ×ÓÝçÝð"ù]þe,LÿOÿHã× ò­Ú"'í)ÿ+“-.f.#-'+ó(”&È#_ rMeKÍK…ša¬b ? ’ÿ!ú–÷a÷¦ø5úQûšûû˜ùE÷pôÚñ÷ïÍî9î-îžîŒïãðPò¬óõrö?øhúˆü9þ-ÿ'ÿçýKûo÷Îòî›éšåâúÞ4ÜÓÙÖ×:Ö/ÕŸÕ©Øß"èfò¾ûˆœT©¿ßýàS{!$%x'»()²(V'%ó!wÊ&à¡ « Ž—9 Çi¤ M ¢!û³ö%ô óAóRôÿõÌ÷ù;ù3ørö’ôêò¾ñ)ñ/ñ¥ñ?òœòÆòçòDóô¨õÀ÷Cúëü%ÿ8„ÿóüßøúóýîTêæ.â·ÞÆÛIÙ ×ÕeÓ²Ò±Ó ×3Ý®åïM÷öü´ÿs¹W dñ &‚)¢+.-¤.01ÿ0È/Î-W+z(% !€óW‹ªU¢}âMÅ£i­2ûôõ²ò™ñòió´ô_õõÖó¢ñçîJì5êÐè è½çêç˜è éÝê&ì…íýîÁð½òŠô¢õ¿õÓôó¾ð+î—ëOéJç_åZãá£Þ9ÜÚ.Ø×}×;Úàß0è òÒûnâ% NWŒ’ ÷X-$d'>)s*¥+:-ð.®/X.„*Ö$X™X{   *  T†M6á £ ¿•ÿKûøM÷z÷øúQûüôû®ú`øgõcòìïeîßíGîTï¾ðaòôÍõr÷IùKûDýËþkÿ±þgüøtóµí èkã àÞèÜPܶ۾ÚsÙ3Ø}×½×pÙ.Ýã¼ê¯òùqþªûdä ¨¥À")'È)T+¶,È.¨15“8é;U>‹>;¿5.,&Lbâœþ2JMœôCÅÅø×ò3î¥ê"èÆæŽæçËç3è<èèÙçXç—æÝåå¨å#æÒæËç]éŸëŠîßñ2õø2ú)û¼úÙøãõUò›î¼êÏæãéßÝÜÿÚÚÙZØ›ØjÚ3Þ äKë™òŠøü¤ýþ¦þ†±F cƒ"Q&‹(›)s*”+ÿ,.Ú-4,`)Ç%¥!.Ö>Üão] õPç« K¢þŸû¬ùê÷Nö*õ¿ôýômõ—õNõŠôcóòÊðãï„ïÍïØð™òáôd÷éù&üøýFÿïÿÍÿ´þ‘üù2öûò!ð‹íéêðçšä á¯Ý÷Ú’ÙÚêÜ+âFéñðœ÷ üÀý+ýrûÐù`ùàú•þ>8 ‹DÒ!$>%T%•$l#)"Í ( hg;{*e Œ¦«ä7Òe ÜþÈùÒöÇôZózò ò×ñrñ‰ðïíÄê·èBçªæçDèÖé€ë#íçîôð>óšõø÷@ú?ü§ýþ^ý€ûáøö6ó{ð§í£ê[çÈãàŽÜ±ÙAØÙEÜÉáíèŒðB÷ü“þZÿ|ÿ2rÒ& nCh ˆ#%‡%«%y%$–"æ bÌ ýæ  ? Ö: /c´™ÂL Ñwüo÷%ôUòañ¥ðúïhïõî˜îOîLîÓîØïñ#òâòOó¡óúóLô’ôõÏõ÷þø,ûJýìþ¹ÿyÿ(þÿû‡ù#÷ õ óÌðõíTêæ­áßÝ}Û:ÛcÝ×áßçeîLôø®úãúúù-úÃü^¤áp Ñ"`#i"s ÷|¡ó#è‡e©¢Þ×Ä!Í$H&ý%â#! ãnf †{~ûŽ÷|ô6ò»ðÐïï]î|í€ì†ë’êÍé]éIéyéÍéê_êàêñë¡íÂïþñômõëõ\õÅóYñ|îƒë¬èæãÿàsÞB܆Ú;Ù‡ØÙ‰ÛÕàòèâò×ü y  J ƒ ÿ ë é¿e¬Ñ#¾&ª(Î)8*í)¸(~&^#·à>®‹ ô % ˆf ‚)Ôüè u=ü+øõ`ôô8ô õröøûøÜøÆ÷ö0ôaòôð,ð$ð¶ð¥ñòfó'ôõ$ör÷õø ú,üGýwý^üú°öÔòÂîêræiâáÞ+Ü/Ú¡ØU×zÖ‘Ö0ØÔÛœáûèÁð€÷Vü8ÿ  s:ðž#×'®*¥,<.Þ/É1½3*5|5Š4S2/ô*°&Ô" Öš #%$&¦%l#£šáÖß9þRùõMñGîöëTê0é`è™ç¢æåLä0ãXâíá âÎâAäNæÀèSë½íæï™ñ‚ò}ò”ñúïîÆë]鏿Âã‰àkÝÏÚøØâ×P××l×ÐØÜ‹áõèñ<ø1ýsÿŠÿÍþ¡þÈ  æqò#î&&(ö'—&k$&"T ⃘&eÑù~¾®EÅ•ºEU9º â~½–Y¶ 'ÿþ»ügûúùtøÔöQõôJó¸òoò}ò óô’õ1÷ÙøŒú1ü¡ý„þ•þºý üúµ÷õÏñî êôåPâ¹ßÓÞàºãhé:ðÒöÕû`þUþuüúDø6øIúkþs ’sªA•GUr  ”[Û óŽzæ W¥dL ¢!h (z» z0ìÿ[ý@ûZù™÷éõLôÆòKñÒïDî§ì ëÂéûèäèWéê)ë²ì¿î4ñÈó=öUøÐù‡ú2ú¯ø!öçòhïåëtèå¸áZÞ@Û½ØöÖÌÕdÕzÖÚ—àØébôRþ)  Æ † ¿ %[ig¼ $*&î&N&˜$l"L J2 Ä Rôs8û ™ ¡ ! 0 F»ûOøgöÛõÿõBö_ö$öpõ0ô¡òYñëðdñ‚òïóvõ ÷›øúù ûüûý`þ ¾  ` u_ÿýÊúøjöôYñî_ê@æ?â8ßêÝ÷Þâ<è]ïxö ü8ÿZÿ&ýúµ÷X÷|ùûý´ ’éuaÛò•ÂõŠ¢²  Þ } &æa_ "N!q ÛŠÊ RPýþXýƒûqù÷·ô…òÊð~ïeîfízìÌë€ë¸ë‹ìîVðûòõÃ÷3ù’ù¬ø‰öfó®ïîë–èÕå‚ãVá$ßðÜÒÚõØz×xÖYÖØ[Ünã§ì‰öhÿñ•  " ï × Ô(„ä$É(C+³,z-å-Ñ-Ì,˜*:'#?O•_â > ¬w± ÿ ‡x&T+á ¸#Ëý\ú.ø.÷Ýöœö!ösõ¿ô-ôÎó¦óÎóLôõ¶õVöÏö1÷¯÷cøUùyú¹û ýZþŒÿ‰:†/%þ‘ûøïôÕðìÆæôàBÛlÖÖҔРÏNÐ9ÓžØàßÉçÅîÐó”ö“÷è÷ÓøHû¹ÿS Â!ì$è&'÷%D$ð"»"¬#C%¶&€'S'C&Ù$Æ#©#Ë$'Â)$,B-³,W*V& !;-= G É0qýDù¼ô/ð&ìéóæÚåuåuå°åæzæçõç6éÍê§ìî2ðñÒðmïíTêœçTå•ã9âîàeßnÝÛ©ØzÖ’ÔõÒ×ÑÔÑÍÓfØ£ßwèMñøaýÊÿ³l0¶ a¡Ãj!²#ò$v%*%$E"_ taÓÇ_À  Ï X ä䮸¾JJ ›Æ€„ÿ0þ§üéúù™÷Ýö ÷Ì÷·øqùÖùúWúÊúxûuüÀýFÿÒ<]"WÖt_ßý\û ù×ö~ô¾ñhîêNæ[â\ßýÝ·Þ¤á¢æ íúóÊù‚ý£þ“ý/û²øM÷µ÷IúºþO Ù¤¯œÿntLËZ`ö  U ¡f Á Fˆ&2&• 4“¡ª—_ÿÀý~û“øKõ+òŒï™ídìñë7ì ícîÐïVñðòôNöÚ÷ùçùLú$úUùÆ÷ŒõÎòÞïóìê+çúãœà[݉Ú0ØrÖ‰ÕPÖÇÙ{àÍéýóóü+2ŸÄCm ÓëÎq#a'ò)x+,,4,”+*G)¥'W%#" …/J× + »·M¨ ±s€ûŽ÷õôºó…óóJò#ñïíVëDéœç€æôåæç;é²ì ñãõ¨ú ÿËÏß R þ ‰4áÿªý~û*ùdöókï—ëè=åìãŠäMçüëßñÌ÷™ü|ÿbÅÿþÙýfþ~ßù A7Ý_Jl ô > Q Ò K H ¨ © ¡#§‡ À ÆÇ½-а(ÐH &·÷¯þœüÒú•ùçøˆøø€÷Äöüõ;õ’ô ôºó²óòóZôòô¿õñöqøú‰û§ülýÆý‚ýwü¶úløÕõó,ðùìhéå§áÞôÚäØJØÊÙÞå"î§÷ U  > 4. × 1%½G#m&(4()'A%#)!qtÛƒ½ú¾ ¦ $ b Bø-sàâ ÔMþÅù÷Òõ¥õÒõãõ¥õæô…óˆñïrì5êÓè©èÍéì2ïºò=önùHüÓþeqDµØÿºýšû±ùö÷ö²óNðëëåæëáíÝëÛ‹Üà#æßíØõ€ü¾E—ØÿZþ-þñÿˆ[†úI2ßÚ=äf x  rI0½@„ Ê/£ zÂÿµýü¹úqù øYö;ôÉñWï^í[ì–ì îjð3óöøú7üˆý¿þýÿ=P.ª‘fþÝüÄûû~ú‡ùÎ÷õuñDíé¢åËã-ä çì4òUø9ý$ùK3ÿÖþýÿð7 A­¢/ zaÊÎ6t   €$U´¤­ ½”kÜZb ißô¬þÀüìúùåöô+ò¹ïí&ìÿëPíéïDóÁöõùŽünþŠÿCÕu#»"Ãü±ÿOþûüÉûyú¤ø ö¬ò©îNêæ¡âÁà,á5ä›éjð+÷lü5ÿbÿÆýšûTúûþø½‚ÇMšRè ¥ F W 줒G  -( [²¿ !þôûFú¤øÆö›ô9ò¨ïí¶êÈè¤ç™çºèæêÎíñIôa÷úlünþ!€fÀÁ Lÿâýrü@û\ú©ùÈøa÷8õSòúî­ëûè}çêç¥ê ïôõKüP„.2·ÿÂÿÄ—‡ ®9ŽqÂÃÌ„l¶5“ { ÙúG^¶Ì¬ ù`Î7 Þ V&Óþ”ü\û®úúøøS÷'õ–òÇïíÇê>éÅèé¨ëÂî}òmöúJýÍÿ»  ЇíÉ=|ÿªýüûúžùÎøÀ÷ö˜óCðaì‚è2å+ã;ãîåë òRùÿtÓøèôÿ>ÿýòniË•ýS!þ)®Iœ ~  ­Ûú¤Ä ŒýþíÁÙÛ\ åýñ¿þý{û£ùo÷÷ôcòÐïfí=ë‡éèè¹éùëï–ò)önù ü3þ®ÿ¥&=Ý!ÿÖýuüû ùcøE÷ö]ô òïoë²çFä²á³àûáÏåèë>ómú²/@éŽq } öJ8Ø/B%ÌÁ´O† { µŸ»` \ ºp†ÄON ð Øqþ¤ü!û£ùû÷ öÈó=ñ¬îVì~êhéWésê»ìúï½ó‘÷ûþ:Á½Df+“ƒ/¦þ&ý×ûÒúúLù(øKö•ó5ð€ìõè:æéä¥å½èîÍô‘û h~Û…twÛ Ë#ekUˆv… ô ñ ä ½°)rÔ\ êûÚ·ï8²Î-e ÿUŒÿ¡ýKü$ûÖù3ø:öõóˆñ*ïíšë ë—ë6íšïlò{õ…ø@ûqý ÿ,àHNôFWÿAþ ýÄû•ú„ùø<÷„õ+ó@ðíê…çèåèåèwìaò›øóý€"?ÀŽ[{ÑÑ ¼ç÷Çr0US‡× —  %$y˜òÏ P ” sdq úGAÿ¾ü¥ú¬øÉöäôíòÚð´î¤ìàê¼éséKêPì@ï¬ò!öZù#üZþ/“çí–×Ì•ÿGþýüûÛù#ø³õ¤ò8ïÆëÜèùæÌæÂèóìÆòùþPR²UºP¦ /i¦Û6â)|Á {  cÕ¶Té™O œ ézºvÔ*Ý D ³z¨ÿ6ýÿúÎøröúó}ñõî‘ì~êÖè¸ç&çMçtèêqí†ðnóÿõAøLúüžýÖþ¨ÿæÿkÿºþøý?ýŽüæû'ûúŠøaö²óÁðîì!ë¢ëêíþñl÷<ýM¿Suî”&øÚ ]щ#”ö„w, M Ê ; cNL½ }DYT vÚÛ-Ü@Ë õ ,Ë›ýpû8ùîö•ô9òñïÀí¾ëýé…èrçöæ^çûèªëïÔòaö„ùü%þ±ÿÊu¾­2geÿZþ[ýgüNûéùø°õíòôï í—ê"éAéYëkïõƒûjÁ%À9i1  × Û€kp’é¡ó2• Y U ù»ÉÀÉÒ %êh@~M*x ²5?ÇÿýVûòøaö¯óñðLîîëê¦è²ç9çwç¬èÿêî”ñìôø÷—úÏü‚þ¹ÿu¼”ìÿ½þ9ýû0úïø²÷Sö·ôâòÕð±î¡ìôêýé/êùë„ï›ôúH¿ow0 Ç P C $8à Nç ¡ [ à ¢  DÄì/°Q Ž ¹#ceJ4`! ÔÅ „ÿþüZú¡÷ïô[ò ðî“ìŒëàê{êhêë‘ìïþñôôœ÷ÞùÁûXý¬þÅÿ¥E{#Q>ÿþýÝûsú¬øŽöIôòð½îî˜îQðOóX÷öûx(šÎ?w Z = tvóÀâo€5º4 ¾ Q Ñ&Ita°¡ã ²vë!c k Õn7/;þPüQú3øÿõÅó‘ñ~ï›íìÇêÐéIé’éëÖíƒñvõù.ü•þY—UÀß& Êÿ•þXýàûúøîõçó(òÌððHð”ñúód÷{ûÂÿ¬ÁäQ ~ ß Â w„èlù¥ y  “H Ђö&9'À´ i ]*Å<Õ Ö¥}«ÿ<ý$û;ùw÷Ïõ%ôoò¨ðéîDíëëìê=êÖéÊévê&ìÓî ò„õ¤øHûqý"ÿjNÏÏBƒ·ÿÿAþ9ý¹ûÓùÆ÷ëõ„ô½ó¦óhôö‚ørûþ†2À W ü ¢ ÿ›Ä؆ ' Ö lÇäíB/àËsRæ à “ € ­ _ È ùÖg¬þ»ûºøÏõ(óØðáî6íÕë£ê©éËèè¸çè„é ì‰ï.ó}ö3ù=û¤ü“ý3þ¬þÿsÿ®ÿÇÿ¦ÿFÿþýÄúð÷õ–òÚðð!ðBñ]ódöúçý°ß*  ç ÷zIðêáÇÂãqñ¬»  ‚ ßZÎÆƒ4áV ¥ f × ° é ©,yÁ"þ‘ûùªönôaòðÈîBíÝë¨ê¦éÈè+èíçnèêèìÒðõïøùûþ"ÿ ÿ«ÿnÿÿ¡þþ9ýPüTûIúùM÷5õó)ñð¿ïNðŸñ•ó$öù7üCÿüR\JO Ž öÙKßL¯BT.‹ E  Í M°I]%·!1’ ¸ .¡"ð Q t iI õýûø'õlòðî¡ìŒëÏêTêôé éIé"ééë¡íñÞôMøÿúåü(þøþŠÿ_‰{'šÿ´þXý\ûÅøæõ>ó^ñðñðJòyôE÷„úäýËüÀW  n Ðl¸ö_G×n1 C • þY©ÝP—²£,Û : ß ›…Ü × Œ  6,ä\£þæûWù ÷õZóÏñmð-ï îíìSëàêëMìºî òîõùSü0þ-ÿpÿTÿÿáþ´þnþíý ýÝû>ú#ø‰õªò ð0î™íIî8ðóªöŒúUþ—ÿ¢` ~  ;K¿!$Ј¿èTG Ì « Š @6a”ñ1=> k Å–2Ðy¥òþÚüTú‘÷Çô1ò÷ï"î™ì\ë\ê•é é¦èwè“è6é®êGíîð-õkùýÍÿ”U“ÅѵxÂÿýôú6ø¶õõóXóøó³õ<øNû“þª3™  ˆ ’íVWxSÆýP5” ® > þœ ˆaÚ íyjU¿ T ú ç^¨Ž2Êÿþüûqù¸ö ô§ñ«ï îÑìèëEë¼ê;ê¼éTé0éeé5êÝëyîëñ°õ;ùü þLÿýÿY{_kÿUþÆü¿ú[øÝõ•óþñƒñ[òôŸ÷2ûÅþÝ6¹¸§þ! »9Ü[…~¯’Žæ¯ ã 8 |¢ÐGB¡ · £ ä ›ÿ=f†~ÿGýÇúøbõÎò{ðîåìœë”ê®éÖèèfçîæÆæþæËçZéÆëúîtò¹õnøpú×ûÝüºý‡þOÿ÷ÿWH«ÿhþrüýùB÷¹ôêòMòóõþ÷YûºþÆ3ã4Ó H £˜°FÑÎ^ $l'R»  0 ÿÍë»;ë> È q w.Ï’iJ|ÿlýÞúð÷äôò‡ïíÿëôêKêÓé|é3ééé‡éêPìïò2önù³ûëü?ýýßüùüiýþyþvþ²ýüÅùÝö²ó»ðîÃíîÊð ôÎ÷†û¯þ Ž|hîlñ -›¬ÛÔtÀë]á—Â>Ú K › è—ô7S 5 ? ˇhŠ1 — ä /‰´þŸûnø\õˆòðÓíñëmê3éAèwçÏæBæñåæ™æÙçòéèì~ð5ôl÷¿ùû°ûæûüKüÏü}ýþ;þ‹ýüû·ù÷ôœòµñ1ò*ôS÷ûžþŸ·ì{ÿ#c Ú p6Ý+ æ™©P ” > õu±ßUogJû'th ¢ ù ” ± RùŒïØÿ9ýZút÷Êô‹òÏð‡ïžîõí|íí¸ìaì1ìMì×ìäí«ï6òWõ–øYû+ý þ"þíýÖýþ©þ0ÿ]ÿçþ›ýƒûÅø¹õÑò—ð«ïQð–ò$öhú·þaìCŸ° ‚ “¯ÕWÄÜ™&ºÒËÈë : h V8ˆ™¡©†åF Ú – _ • ƒbD:Aÿ<ýñúGøYõlò´ïií‘ë!êé3èœç)ç׿»æüæªçÖèjê^ìÅîŽñ~ô ÷ù;úÛúNûæûÃüäýÿ÷ÿj,"ÿfýEûùd÷ƒöèö²øÇûŠÿ?:  Z ¬ ¦ ª ØêGB0¨ VÑu›¢ T A ò[—õÑ[nÓg¾|̪QõžVúÿkþrü÷ù ÷õó ñîŸì@ëjêýéÊé˜éFéçè˜è¦è(é!êœëÃíŒð·ó­öûø_ú ûNû¢û4üý%þïþÿcþŸüúH÷´ôóòfòUóÍõ•ùõý&jaè^ø è ùúz©W ºøN •KR¨ " ¾Î¸užÊ1T Á : ¼ ~ Ô/c—¼ÿ¸ýmûçø:ö“ó!ñúî+í¥ëQêéèþæ#æåeåÒåÌæ9èúéìnî ñžóÍõf÷iøùÐù³úÌûóüÙý3þÀýoü{úXøuö@õòô¼õ½÷éúÅþ»l£   ® Y hµ™?Þ #‚#g"ìo}£gø? Ï Z ²Ú¦Ùâ´$ÒUW © f ²À­*ˆ‘(þYûJø'õ1ò ïží&ì5ë£êCêê´éqéLéhéÞé¼ê ìÑí'ð×òsõ}÷žøòøßøÅøþø´ù¹ú³û&ü°û-úÎ÷õžòÝðYðHñ½óƒ÷ ü¼„ù »ë; ÿ ·<Ô ºû IÓë•Á * ‚ ÀÿŠÀÙ̓›  œ 4 n ¢ÒJ{‚þHü·ùåöìóñ]î.ì„êOéèíç}çç×æÃæçËçéšêŸìïÆñ‡ôÉö1ø·ø½ø½ø"ùúmûÌü½ýÖýöüNû]ù¡÷œöœöÔ÷eúþ?QŠ p  ³ , Q ¾ ¿ÙV« a"i"à sƒÃ 1 d é qÉX‰Òânÿ€,_TD?7ŒÿÀýŽûûø7öióÝðÂî.í)ìšë\ëKëEë5ëë!ë_ëñëßìî±ï¢ñçó:öDø˜ù0ú@ú2úQúÛú¾û¤üý»üKûùgöôžòXòwóöúÂþœ8 5 æ  h ï  ÍŠUJȨ  ]ã $‚BA4 ã qAJcЉÙÒ î Ú ± ½€R^¢ýþXýŒû|ù÷]ô‹ñËîHì'ê…èSç†æñå~å åšäpä¶äåÚæèê×ìeï òkôHö}÷AøäøÍùû»üXþ’ÿýÿsÿþ[üôúNú³ú4üÍþ[os à ïÛÛ„†€À7s˜Ú"’$˜$ù"$ ‰‹·mÞ  …įΤ6>h5\ÒáÓÔåîÊÿkþªü‡úû÷*õ4òZïÔìØêéÓè·èõèTé´éêKê¹ê\ë<ìfíÙî¢ðÈòõ1÷²ø|ù´ù´ùÊùCú'ûEü+ýXý}ü±únøaö/õ*õmöáø^üpn°½ ‡ _ $ m 9SBõV" #," ¬Ôý V % @%ê˜ ùç j  ” - Ϥ¸LþŽü•úRøÍõ óKð–íëÖèÚæ8åä3ãÃâ›âºâ3ã äFåÃæcèòé~ë#íéî­ð9òyó~ô~õ¾öXø-úüûUýõýªý‘ü!ûéùvùúÉûŠþô ö "2spÊÿLª®®ë"Í$%Ü#†!fÛ:áÞö   )š£häƒòä I š=ò§=ÿ¸ýuûïø4ö…óñÞî íÉëÒê;êéé¹é©é£é±éìéIêÄêgë.ì.í„î,ðßñRóOôïô\õëõÁöÑ÷ùäù-ú©ùlø×öjõ£ôÕô&ö›øü™ b Ì Ï 7 *êJœ$ Y"ù"&" S"æêSë ± [,¦º±En  ˜ (Ü»áÿJþÔüdûÓùøØõ`ó¾ð"î»ë£éêç‘æŒåáäväTäväæä°åÆæè`éÝêªìÐî&ñ]ó õöŽöÌö#÷Ü÷ù‰úëûÆüÑü#üû@úúù‰ú üqþ”'¯Ÿ § ½'p*Æ|+gs ž#Z%]%Ö#!w¯+ôA× a ¿  ‹_¼¶:¾œ†UÒƒeÿLþý¥ûºùd÷¹ôíñIïöìë·éäè“è¦èéŠé-êÝêŒëBìþì·í•îÇïVñ9óõ­ö²÷(ø[ø“øùÖùÞú¨û¾ûàú6ù1÷{õ•ôÍô7öÖøoü”«W V b  ÷ ¶ ¬ àç™õõ©J&ž®§ÊçÁ ~ në5ai Ò N ë }  Ç„S8þ×ûnùÉöõóñOîÆë„é‹çÇå0äÎâ–á—àæß®ßîß«àÎá6ã®ä&æ…çé¨êoì;îñï}ñêò]ôëõŽ÷8ù£ú‰ûÉûŽû=û7ûöû–ýGãŒ Ü vå#Jß>‹®?»!$!&g&_%1#' ‘ꌯN3? _ ›ÿmjì¨EdåÞyðrÓþ™ýYüéú6ù<÷ õ²òQð î ì„ê‡ééøè;é·éeê!ëàëƒì ííî¿îÍï1ñËòTôõjöåöH÷É÷‚øhù;ú‰úúäøX÷ãõýôÕô¢õl÷!úoýÏ´ÁñŽ  ï À j{LgU…ü¹X¥Y'õ à ¼  ñ \ P œ ïáOË Ï · °Íòù¿ÿ6ýWúE÷"ôñ>îªëZéUçŸåäÔâµáÝà\àHàšàPá9â6ã;äCåræðç©é{ë?íÐîFð¸ñJóõÚönøùìùÖùùù*úŽûËýØq<Ê £š¨f›]öC!½#% %Ë#r![ôªÈH": ] ©Sx2~4 ¯â‚œVéBúÿÂþ^ý×û0úzø¸öæô(ó€ñðçî îfí íðìí|íî•îïsï¶ïð»ðÏñ.ó•ô¹õ†öÿöS÷™÷ øŠøûøù›ø§÷uöxõõNõSöø‰úPý<¯e´ë£ Ò;ÔZº¤«z_£[X g Q  Üèz¢i£ : Ý × ) ý ’ a@¬ýãúø@õ²òxðŠîðì—ëvêqéyèˆç¾æ!æãåùåVæîæ¡ç|è é&ëíï!ñÑò"ôõãõ»öÃ÷ïøúØú)û ûÞúàúgû‘üvþ?" \ º Xw˜*šö)¦×-L  Ö­ä×Ù/ø { ï cöÕ!ì;à——±kPBNOÿDþý¶û-úøâö2õ‡óèñpð0ï-îiíöìÚì#íÃíîLïÞï)ð@ðdðÝðÚñ>óÊô2öE÷ó÷Oø“øêøWù¼ùäù£ùûø.ø‘÷a÷Ô÷ù÷ú™ý~<IVx'ôoó‡ ß u ×åâÿ~˜‹’ß € _ O ( ë¸ÊCFÒÁѲ û^lQÑdÌÿþüÊútø&öøóöñðcîâì‘ëpêyéºè6èèè‚èé©é;êÊê‰ë¡ì3îð+òôjõaö÷ª÷nø|ù¨ú«ûYüªüÉüþü‹ýþ’Vú # Ž 9fêö˜z'F £XV·JÔ : „ ÑHW-‡2Ø)•ÅŤxN'ÿþýÀügûúùøööeõÅó.òÄð£ïÍîGîîøíîtîÐîï$ïïïQïÿï4ñËòŠôö?÷ó÷UøŠøáøLù·ùéùÓùhùÎøGøøRø8ùÊúðüpÿëê/¥¥  ^¦ » '9„°Áæcƒ—äˆ ƒ ­ æ .¢{Çi+ÀþÎJw_–üFþ‹ü~ú[ø4ö'ôEò‰ðõîíPìCëeêÍé‡ééÅéê{êÊêëmëìížîŸðËòÞô™öê÷òøçùûVüÎý5ÿg@å}²se”þ Ê ° , \ ˆ ü ð ~†ÅÕKùµ—Ê}úŽ p ± P"[À[GwâOž½²ŠGçiÔ/p•ÿžþqý,üÕúnùð÷oöõõó"óœòaòaò–òÙòóêòòò†ñdñÉñ½òô‰õÌöª÷øMøqøÎøkù-úÊú$û$ûæúúCú;ú úŽû ýÙþ°Mk Rï÷¸0 ó „rdSaÛ/ v ¯+Ìlómé{IhÍ:ƒŽE¿>?Ênÿþ”üûqùÎ÷/öô.óåñÕðýï]ïäîî`îUîhî|î„îîtî‚îòîéï‹ñ©óùõøÅùúúÌû†üaýþÞÿKœ²xÄ'Ç­Ë  ñ l ª Æ  – •÷ƒø 66Ÿ ‚ ~ ¿ J åÌÄúÿsÿ-ÿ%ÿ5ÿIÿWÿ]ÿkÿpÿyÿ|ÿkÿLÿ ÿ©þþBý7ü÷ú ùOø÷öTõÐôônôô·ôïôõòô¦ôCôúó%ôïôdöJø0úÁû¸üýþü×üÑüý–ý%þ˜þÐþËþžþfþ>þRþºþ„ÿ¸Æˆõ-WÂø  ¡`>[ð V È ‚“ù‰!—Øíå a!SŽŸxñÿ]ÿÂþ0þ‚ý¸üÉû¹úŠù3øÆöNõòóÃòÝñEñôðÕðØðôðñ:ñHñHñ,ññ!ñœñ¯ò~ô×ö`ù³û‹ýÞþ¼ÿ_ åqÕ· 3 + " D •  « 2 ¨ r è ‹ k‡Çã§í…‹Dj ® 0 öîñá¦Pñ´ÿ´þþˆý1ýëüŸüPüÿûÄû¢û¥ûÉû üSüzüaüîûûïùˆø÷ÏõØôOô'ôFô~ô¹ôäôæô¿ôhôïóqóó×ò"óôÇõâ÷úüfýAþ½þÿLÿÂÿWñg‰x/ਚÁ/ÏŽ?½L‡éŒŒë„  j 7 w & l ~ ½  §P§1—ñI±>Ùˆ+Ñoð\ Õÿÿ;þ^ýlüVûúµø:÷¹õCôðòðñ)ñ¥ðFðúï´ïvï'ïÐînîîÈí¯ííí±î,ðUòòô¤÷úüûwý¯þØÿ&²|\„ p Ø Õ Œ - Þ Ö " ¶ s / à ? œ ê 9ž'¼-Wyn ä c!_Â(‚»Ýñeÿäþ“þhþOþ>þ6þ-þ;þhþ·þÿbÿŒÿeÿçþøýªüûyùþ÷ÌöôõgõõÂô|ôô‚óÎòüñ#ñYð¹ïbïšïðòýó÷õ–÷¬øRùÊùNú!ûYüäýŒÿùóX7ÒSé¹Ê)»l¬yæj24f› ˜ = j ! · í?¾rM1ÿŸ!šÂvse>øˆøU¾4Êe÷ÿ]ÿ„þcýüvúÙød÷/ö;õ|ôÙó3ó…ò»ñÕðÞïçîîqíííí±îgðwò’ômöó÷-ùLú‘û&ýÿ\¯à¢Ö‡ Ë Å £ ˜ Ö Q ï ) µ 9 ²  ˜\;®½w ñ O ¡£Wå bÿ0þ ý?ü”û,ûéúÒú¶úú~úvú¥úûÁû”ülýþkþ]þßýýüû÷ú'ú¬ù‡ù¦ùÛùýùòù¦ùùXøz÷™öÊõ;õõpõoöøÍùxûÀü…ýÙýþ9þ±þ‡ÿ¨Úâ“.t™Ì:ìÿìÿ*Ú7Žœkb°Ì©( A þi¤ÉúLÊk ø?™®\£ÿÿkþ›ýÔü:üÚûÁûèû)ügüuü7ü¢ûÊúÈùÅøå÷4÷Äö}ö_ö4öîõsõ¿ôøó0ó“ò9ò òUòíòôÁõö÷Nú‘ütþìÿ XäÉÜØ z œ 0Aó a É N  ñ ô ô Ý ¾ š ~ u † ¾ # ¢ 7 ü g † h - Ñu5åϰ˜ÿ“þ¬ýëüKüÄûHûÕúTúÊùLùíøÎøþøùFú5ûüµüûüÝüKüpûjúZùlø­÷.÷ëö¸öxöö«õ'õ ô"ô¬óJóó.óäóIõ.÷IùKûëü þ½þCÿáÿÄ¡@¥Ÿ Ÿë2’;'C\Z=/-bÒ€dlk 8 ± Ç ~ Þ  öèôZˆª¾Ìæÿ"ÿ‡þþ²ýMýÌü=üŸûûÇú«úÒú$ûŽûæûüû¾ûûúûøÔ÷Òööõ5õõÊôhôÓó óiòÁñBñôðàðñ¾ñåò‡ôŸöÖøÿú×üJþ‡ÿ³Ùé#I U 6“ Ñ ª ­ Æ â ë Ì ” K  Õ Ì ü P § ß Ì a ¥ ¨ ‡ X#ôÓºµ°¼Êÿòþ0þˆýóü^üÉû'û~úáù„ùùáùúŽûwü1ý‹ýfýÑüèûÛúÅùÖøøœ÷M÷ ÷âö}öîõ2õeô“óÙò<òÃñzñˆñòó~ô2öÚ÷Oùvú{û–üøý·ÿª¤T~ëYs|´9 %U|tO+.y òP|k  >  ¿ > ©ˆ ”†ïZÙnÃfëNŒ¹ÿøþqþ9þGþþ¿þäþÖþvþºýµü€ûNú>ùMøo÷—ö¼õÕôËóªòuñKðFïtîÖíqí[í²ížîðóñ ôö ø©ùû€ü%þ!túg| ÿ î N H  Ç Ÿ ¨ Ò 7 ? / ë ã ö ? ° ( Ž Æ ª . S , Å 1†æk Ä’ÿ|þýÑüEüÏûYûÛúCú›ùßøDøö÷ø¯ø´ù÷ú.ü4ýÖýþÆý+ýiüŸûñúhúõù˜ùDùòø“ø#øª÷.÷Äömöö¹õWõõ-õØõ÷¬øeúîû.ý0þÿ@§"vmÒ¨C`˜ÑÙ ?[it˜íy;54µòÅD“Ìÿ5vÀ ?\ghÿtþ–ýÌü ü‰ûÿúúú´ùŠù ùú úYûÿû†üÉü¾üdüÉûûWú®ùù¯øMøð÷€÷îö7ömõ®ô ôóDó0ókó'ôpõ1÷Gùjûcýÿ_oz¯8öΉ î ß P J Ú 4 ƒ ì y  Ó „ 0 ßX?`¯+ ¯ -  ž û(1ô·w4ïÿ¡þXý&üû>ú ù0ùÜø“øOøøøønø ùáùÐú°ûrüðü#ýûüˆüàû!ûbú¿ù6ùËønøø§÷+÷™öövõýô˜ôIô-ôvôTõÌöÅøãúÔüZþnÿ2Ò”Ë-ml<#Ü…4óö׎‰áúvCJlc ø $ Û 9 [VC88DE4ÿ þ(ýwüÚûHû«úúGùˆøí÷…÷l÷¤÷%øÎøŠù5ú¼úûûéú‰úú˜ù"ù¦ø9ø½÷+÷ƒöÇõõFôºócóGónóôõŸöžøÒúûüïþ~µÀÓ—`5 ã 4 O+¸ †  F æ ~ ú y À§Å ˜ ' ’ ¹ Œ  q ¡¾×ô!IO ÊQÿäýŽüjûvú±ùù²ø[øøè÷Ú÷û÷`øêø˜ùFúØú7ûTû$û¼ú5ú¦ùù˜ø.øÎ÷t÷ ÷†öÍõ÷ô ô(ólòÚñ”ñ¾ñ‚òïóëõ1ø{ú†üþAÿãÒóOÁ+Ñ  ·Xðœ:Ç5†ÛR (º±ë?t A   ‡  c »è$m¿<SSQ]ÿvþžýÏüü7û{úÙùkùRùŠùúØú«ûƒüýzýý4ýŸüÚûû5úqù½øø…÷ööPöõÐôøó.óŽò.ò6òÙòôöOøÇú.ý>ÿÚß·«Í ‚Ó ÿ Ú S r N  š 5 ¿ 8 ¬  –¸™É6Ùv ì  õ y ºÌÏÛ÷Go††pÿXþ<ý=ü_ûú÷ùkùù©øqøXølø½ø8ùéù±ú{û&ü¢üÏü­üEü¶ûû„úú¼ùùqùOù ùøÀ÷ÌöÕõéô0ôÖóôìô€öŠø¹ú¾üUþeÿúÿQ³YU–ò7?öJ?ðƒÉŒQ¿\ú´£æŒª²f ´ ’ 9<=F]‚§µ°ŠÿXþ(ýü@û’úú‡ùù›ø+ø×÷²÷Ñ÷?øûøÛùÂú‰ûüYüSüü†ûñú_úïù›ùcùAùùÓøføÌ÷÷jöãõ³õ ö÷›ø¨úýQÿ\þ(ìvÿÄÆ ] † P µ ° V Ç * ‡ ò Z ÑB­€ãr&è–êÙ`™¥š’¡Æü&=;ÿ"þýèûãú÷ù8ù˜ø<ø øø øUø©øù’ùúšúûjû—û‰û=ûÍúLúÂù`ùùùù ùùºø.øX÷\öYõhô©óUó˜ó ômöÅø@û‚ý;ÿNÊùŽl¯2¾ ´ é Í y  ·^‹ùY¶=!e)^c 0 Ù  öî L›êü¨ÿ(þ™ü!ûÖù¯øÆ÷÷_öÕõ_õõÓôáô2õÒõ™ö}÷GøïøLùWùù²ø(ø­÷M÷÷ÿö ÷ ÷ ÷ñö‰öÿõmõ õõÒõ:÷GùÉûvþÿ£Œ Y»d|á s ß £È‡c ¾ ! u Ò  Z ˆ¾¾Ç<õÐ b ‡ ' f XE:Iy´4E2ýþµýoü7û'úAù–ø.øö÷ó÷øUø²ø(ù£ùú\úyú\úú›ùùJø€÷»öÿõeõòô´ôŠôOôòócó¬òâñ)ñðrðæð òÜóöwø•ú=ü[ýþ¦þWÿWµiC ¯ C k 5 Ù v + õòðÜÑÜ" ¬ { s r E º À M € { s ÖRðŽö´"ÿ?ý†û úËø½÷Ýö$öõ õ¿ô£ô®ôæô'õ\õ{õjõ*õÂô;ô²ó<óßòµò¬òÆò×òçòåòÈò–òfòPò¤ònóæôàöGùæûnþ«lÀÍÒ|;  ê v Er,¨ò0cž â / Ä  ; % W ± " m „ > ¦ ÙóK’æ-f€r:äþˆý:üû@ú ù6ùþøçøõø ù3ùcù˜ùÓùúúúúÅùnùùˆøð÷[÷¸öömõÓôAô©óóMòˆñÁð!ðÍïïïŸð×ñŠóvõX÷íøúôú¥ûrüýÿ+\Mâò { š s >   0 k ¨ Þ ÿ  8 ƒ ß Î ´h¼<G ^ ý p ä 0 6å5?/3ÿiýèû¨ú˜ù²øÑ÷÷@ö„õìô~ô>ô*ôôô ôýóÞó¯óyó<óóíòóò ó%ó0óóßò…ò+òüñ#òºòÖóYõ4÷(ù$ûèüyþ´ÿÁÁínHl¨ » i ÅRÎRß } & Ñ z  ­ T , 2 p Ú ? } o  Q p Š ²û^¸÷ÜlÌÿaýÇûjúOùŠø øÌ÷¯÷­÷­÷¯÷¤÷‹÷i÷?÷ ÷Òö¨ö}öaöEö,ööñõÍõšõ_õõô ô`ó¤òóñjñ/ñYñðñðò;ô¿õH÷µøòùúúèûâüþÿ†²éèv s á ï Í ® ´ é 5 ‰ Ê ã Ç ‘ \ N   £ÊsÈç  = ¢ 2 Ê ; k .Œ’Xâýöûbú(ù#øH÷uö¨õØôônóíò“òiòUòUòBò&òöñÁñˆñ\ñ=ñ7ñPñ†ñÃñ ò?òUòSòMòGòtòðòÀóæô@öÃ÷IùÂú.ü™ýÿ«‹·#¦ ö â 8æÂh0-e±÷ïvÙi  S Ë 6qUß ( Y ¥ ! Ç ‰ ' „ …ZGúþýƒûQúvùÖøXøâ÷^÷ÄöösõäôhôôäóËó´ó£ó˜óófóAó"óóÜò¡òPòðñrñèðQðÇïhïLï„ï ðÄð§ñ™òŠó~ô{õ—öè÷ù‘ûþ®kôn L Ê , ?  즹LøÙ £x_M#œÝ!‡%ê·D^ î ä i©Éøþaü$úGøÁöxõRô<ó6ò7ñ@ðkï¬î"îºíqí9ííþìííJí…íÜíAîºî>ïÄïKðÇðEñÉñMòêòžóvôjõröƒ÷ˆøŠù¥úôûtýAÿN©:Î2 . ›sæ$YÄjB§Å`ƒ\õ+× ð iïILêA} Ï a K j ƒ \ ¼ „ ÀŽ¢Cÿ.ý~û*úù?ør÷ªöàõýôô+óMò–ññ°ðpð5ðúï¶ïeïï·îqîDî-î-î6îGîOîRîDî6îîîDî›îï´ïYðñþñ.ó¹ôÆöGù1ü]ÿˆpÑ‚ ˜ 5 ­ 7  JÂ@‘l½Šþ^ݰèz3Ù90½Hœ4ü‰Ô Œ Öéí qý5û]ùÚ÷‹öTõ'ôóò³ñpð>ï3îRíªì.ìÝë­ë‘ë”ëœëŸë­ëÒëìƒìí¯í`îïïððÿðƒñ&òêòÈó©ô‰õoö}÷Ùø£úëüÿœ¼·Q M “I±¢šínÞÚ)­*§NNÛæK³ë¿=y©ó } U i ‚ P ™ K k hŸòþœüÄúeù[ø…÷¶öÛõÕô¡óEòîð¼ïÐî9îðíßíòíî0î-î îÎížíí‚í¤íÙíî]î‡îî‚îkîcîkîŠî±îéî>ïÂïð”ñ"óeõMøàûÇÿ–è„ H ^  ™ k«dUIÒÏ ªÄ¶Â3s÷p¥{ï-c½J ㆿk} 1!þïþ,üÖùí÷aöõÞó¸ò€ñ8ðÞî…íHì:ëpêòé´é®éÍéê=êbêŒê¼êërëì×ìºí´î®ïðañò™ò.óÎó`ôäôYõñõÌö øú¤üÛÿ…MÍ § ´Ý\ƒ¶HXÙ‰<¬R<³ç<S/d¢Ÿ4_I.1 ” S d ‹ o Õ ºSŠ¥ÑýQûLùÑ÷Ôöö‰õìôô ó¾ñ_ðïÙíûìoì<ìMìƒìÎì í6íJí^í‚íËí3î©î-ïšïéïðð ðñïÊï˜ïZïïïîìî8ïð™ñõó ÷üú3ÿi12 ? f …W®‹ÂðIئäÜß,ã zíÆè±e?fåšS¹¯  ˜§ý’úö÷æõFôíòµñuðï©íìêýè»ç¾æ#æØåØåæxæîæiçíç‚è*éýéìêóë í0îOïVð:ñùñ‹òóXó›óÞó3ô±ôpõªöøûLþà ™ ïpVÏHAý 3.f°CyµV‡_¶:š€Û¿t:E°{vQ´na ¬ röÿHü‡ù^÷Áõ~ôkóPòñ£ïõí.ìpêçèÀçüæ‹æPæ@æ@æSæaælæ‘æÚæXç èçèØéÏê¶ërìící¡íËíðíîþíâíÖíîÓîVðËò!ö;ú¿þ97L j ¯ n¥Èg~+ðËó¶kcȺ£øòqœ™šÐN÷©Ñ?ï   ÷<¯þ†ûäøÉöõó&ò¥ðï[í‘ëÓéJèçæTåÛä¨ä’äŒä˜ä±äÕä!å¨ålælçžèìéVëµìøíúî«ïðCð:ððãïàï=ð,ñÎò@õ…ø}üÚ;- d ´!ôu.é1Å2 ûáÎ úÌ@dèd”7TÅœà””šS{õª ½ r±ÿ¾üNú`øâö¨õ„ôGóÏñ$ðRî}ìÕênéièµçSç)çç çîæÉæ¢æ—æÉæ4çâç´è£éŒêaëìŽìßìí%ííþìÆìƒì[ì“ìqí0ïëñõ÷ù±þA,  ( õ ç_z5JKÀLÅDmáº0LÎQ„'J¨m„þѬ9,bß Â M²8ý~úUø‰öôôióÑñðLîoì¨êé×çàæ@ææåÇåØåæVæŸæåæEçÃç|èké‰êÏë íkî’ïð:ñµñðñðñ°ñKñØðð­ðlñ ó³õ3ù[ýÄ · l Ü*‡_cH;Ô>ÜŸÝoi :/¥9É‹¶bm¥¶T3S ¼ –†&ý$úª÷«õô¬òañð±î(íŽëôé‡è^ç†ææÏåØåæ^æ°æóæ<ç¡ç+èíèäéüê1ìXíZî*ï¹ïððÿï±ï>ï·îcînî"ï¨ðómö‰úÿ´É÷  X…eŸ—óž „ é›üu]ÈÂìò•½€·žå‘i&o'" ‹CðÅþãûeù?÷_õ¡óðñ:ð|î²ìñêLéÔç°æÝåYåååKå¥åæŽæ ç“ç9èéýé2ëŽì îvïÌðßñ§ò"óUóDóøò}òòÑñ#ò6ó$õó÷ƒûÿÜÆï  >£Â%2Ó$Æk M‘ÍZw(+.è4)ç›…Ú¢­¾€¢ó 2 ¡:ý8úÑ÷Ûõ5ôºòSñÛïGî“ìÏê"é²ç‘æÒåeåHåbå¥åôåHæ™æöæoçèäèìéë:ì`íeî>ïÛï:ðdð\ðð¿ïQï ï'ïìïuñÙó÷ÿúFÿiîv ÷ š Ø 7 9 "ökH´ C „+‘*Aï33¿êµp>ZÜžz,¨‡Ú ½eËþàûLù÷õRóªñðZîœìØê%éžç\æmåØäšä®äúäbåÕåBæ³æ4çâçÂèØé&ë–ì%î´ïñJò"óžóÈó¯ó`óðòœòœò.ósôuöGù»ü¢•¹ N å × ­ ð ×(¥1§4hÃo¥YQ5ÒþÿEô dª”ÛnP £ “L0þ°û›ù×÷aöõÈótòôðOï–íîë{êOétèóçÑçøçMè¬èøè*éZééýéŒêKë7ì?íOîCïðŸðôð!ñ)ñ ñÁðYðð)ðãðcò·ôâ÷­û¿ÿž¾Ùé 8 ; p N  ÂY-!  =ý–[¢mƒŸ{îá½Ì2ÿ={;c ú ÝêþKüúøoöõ²ófòüðyïçíoì!ëêbééénéäé_êÇêëKë”ëì¤ìˆí›îÐïñ?òAóô¦ôõ2õ'õõÂôô¿ôWõ†ö]øÐú½ýî Á·Ë Í  ¦ š ƒ -.ý/q½+ÿ’6?ÎÌ(ûr𔣸¬ºê´Ü l h í*PŒÿ ýæú3ùâ÷×öãõäô¦ó4òƒðËî(íÏëØêNê'êNê¥êëaë¨ëÕëìSìÚì–í‡îï—ð‹ñaòó¬ó-ô£ôõFõjõ{õ õ öèöJø>úÃü·ÿÑ«íW Ù £ " È ; ? Ü‘äQVÇÞ䪋œœaÒôæÓå J  (  œ ¶ W CÅ,¬þuüšú(ù ø÷7ö$õÖóPò°ðïÈíÉì:ìì,ìˆìþìlíÃíûí+îtîìî¦ï‰ðœñ¸òÎóÅôŒõ)öªö÷d÷œ÷Ñ÷øMøÜø·ùñú‘üþÌ(b7qþälþù›ø æ °‘Ãa”¢Å-ò3L¦< x Ý _ d \  m h ó' ÆÿˆýÚû‡úŠùÃøø ÷üõ•ôórñ ðýîGîðíçí(îyîËîúîúîçîáîïkï ðÕð¾ñ¬ò‡ó>ôØôWõ¼õ$ö‹öùöf÷ß÷wø3ù-úpûýÙþàó쉧BiRM™` = í hj÷¿=¦*êÜìï¦%€ à  š \ Q Y : Ð ý ¯üìªe]þ»ü€û¨úúsùÈøÚ÷”öõó òùð,ðÄï±ïÐïðFðdðgðbðxðÌðjñGòUóyô’õ†öH÷Ô÷3øŠøíø`ùáùpúû¢ûMüýíýêþH§Qg4ªÚëPç¿ ¼ ­ a É Ú ¢ 4 ­ 5 Ø ¹ Ä ô  /  ã  ¬ k ] k k A ½ßœý%7„ÿ(þ9ý¸ü}üVü üpû{ú3ùÆ÷\ö!õ5ô›óAóóâò²òaòò¢ñoñŽñòÎòÎóÕôÄõ€ö÷M÷l÷ˆ÷»÷ø“ø8ùïù®újûüÌü…ýZþbÿ¥“C,­âðû6¤A ç ~ é  ý ¼ Z ø ¯ | h c Z A º^óœl[owJÌà˜ó&ZÿÎý»ü&üüHü†ü–üBü‰ûsú0ùû÷ÿö\ö öîõùõ÷õãõ¨õYõõúô=õÛõÆöó÷ùúÂúû,ûûûûNûÉûaüýªý;þ¯þ ÿhÿÅÿHñÆÃÎáÕš i‹¢Àè.(¾aö”7ôÁ«£«³®xQ2$¼0M®3ÿËý»ü üüoüý¤ýþûý‚ýªüŸû•ú¿ù6ùíøËø·ø“øMø×÷E÷Ìö™öÄöV÷9øAùCú ûƒû¨ûŽûQû)û)ûmûèûˆü+ýÀý3þþ¡þ±þËþÿbÿØë ON ŽÝ.Pu“Ÿ…J_ìÊ´£•snnsb3·ðÔ{çþaý üû¿úôú¥ûwü4ý›ý“ýýKübûšúúìùúsúÕúûéúŒúú’ùeù±ùyúûåüþòþsÿ~ÿFÿäþ›þ‡þ½þ%ÿ¦ÿ_g!´ÿ5ÿÖþ¬þËþ>ÿúÿñ "Å8m{jQ/ Ó|©0²Gð»§­Äàù4St¡…4”®ÿ0þÚü­ûìú¶úûÒû»ü“ýþ(þÙýMýªü#üãûàûü?üPü ü³ûûQúÈù¦ù÷ù¶ú³ûÃüªýAþþkþþÖý¸ýßýAþÍþkÿìÿ2$Õÿhÿêþþfþ‚þòþ®ÿ¶å"F8æS‰Žƒa5ú¥8·*¡%»l9 ëɵœ‹uV ñÿÿþ×ü¹ûÒúLú8ú—ú@ûüµü#ý<ý ý°üVüü ü?ü–üýRýwýaý ýÝüÆüöüýRþIÿ=ƒ³§r@!2a§èþÏV¨Õÿ ÿcþóýËýøýŠþbÿj‰–n8-øžAçˆ.݉:üÇ®«Çî7PYSBùÇ{$ ÿÿGþýÔüEüôûãûü†üùülý¬ýµý™ý[ýý×ü­üœü¢ü°ü°ü–ürüMü:üPü¢ü+ýâý¡þTÿáÿC~«Ìù=ƒÁàÄrà5Œÿøþ•þtþþìþŒÿel‚“sWT ¦0ºGßw#בV&ëÕÄ®‘u\H2ñÿ·ÿkÿõþXþ¯ý ý†ü.ü ü üYü­üýPýwýý}ýiýXýGýBý9ý9ý1ý ý ýþü ýBý§ýAþúþÅÿŒ,­?w²öD…ÀÓ¬J§åWÊÿsÿeÿŠÿìÿ~: Ü–]T¤…ólù¢W!ôÿìÿìÿ 2QjsgF'Õÿ±ÿŒÿ_ÿÿÍþkþ þ›ýMýýþüý1ýoýµýðýþ%þþíý¬ýoý1ýþüßüÔü×üåüý<ýˆýçýUþËþ>ÿ±ÿuÊ!u×4™ç+ø…Òÿ*nÿõþËþúþhÿí®!I*ÈF² “¥Eô¨j@'ôÿÇÿŠÿ8ÿäþþGþ þÑý›ýfý+ýèüŸü^ü1ü#ü:üiü»ü ýýÑýøýþçýµý}ýGý&ýý(ýXý›ýûývþÿ˜ÿ5ÏdëdÔ<¦„mÍÿú®I?  !„ÿ>ÿWÿÊÿs: ÀMž¤câ9r®ñÿIÿÂþ]þþäýÆýºýËýðýþ;þUþfþUþ9þþíýÙýÜýøýþ%þ%þþûýÙýµýžý™ý§ýËýþDþþÍþõþýþÜþ•þ0þºýGýèüªü¢üÌü(ýÃýkþÿÊÿQ¼H†âaºsx£„`wz€¢±ÿ´ÿ¶—–“qms-¦õ.[†°÷ÿQÿÙþþGþ-þ"þ"þþêý§ýGý×ü[üëû‘ûVûEûCûNûQûHûKûKûTûuû°û üƒüý‚ýþvþÐþÿ*ÿ%ÿøþ·þkþ+þþþý-þ•þ8ÿúÿݸ‚"©O£ EóŽù( “¸Fí§«÷ÿ±ÿÊÿ=ñÌœRÙ½+o—°ÊÿäþþJýµüKü üü#üVüŸüÉüÌüŸüaüùûŽû,ûéúÇúÄúÐúÕúÕúÐúÊúÒúìúûTû°ûü”üûüaýµýøýþþõý§ýBýÑüiüü üHüÝüºýÅþæÿ÷àŽþM“ø„I/Üi™lÌÕ Rþ4Á«ô™tkT~¨pýLy¥¹Ðÿïþþoýâü”üuü‹ü¾üóüýöü­ü,ü‘ûìúZúÛùù`ùUùUùRùWùkù›ùÞù@ú¿úTûüû­üRýâýRþžþÈþ¿þþDþçý‹ý<ýý4ýªýkþnÿ¢Ýøá’F’÷‘^G6 ì Q C  Ô‘$¦XEŽ=H¥BÀ`ºÍ•t­Ìéýÿÿ þýKü«ûHû'û7ûpû¹ûãûîû¹ûTûÒúCúÅùcù(ùùù6ùUùsùŠùºùýù_úÒújûü¤ü1ý²ý%þvþ¯þÂþ±þqþþqýÚü^üüüˆüaý˜þ †ËÎvÐ @¥K&  º Í % °8ѪÏK!PÉt<ý˜÷ú˜?i}‰•ÿ›þªýÝü:üÕû­û¾ûëûü=ü.üèûpûÊúúsùçø…øUøUøzø²øêø-ù|ùÛùLúÐúgûüÆüwýþ£þ ÿAÿOÿ0ÿçþ|þþýýGýBý¡ý`þ|ÿæzûNKîBlœèt6  ã p Q ‰ Z íjÑþ“€»"›s •OÙDŽÌîÿþóüãûñú0úÂù ùÂùújú£ú®úpúòùOùžøø‹÷S÷P÷w÷Æ÷#øøÖø3ù£ù-úÒú”ûgü<ýþ¯þ0ÿ|ÿ•ÿvÿ0ÿºþ-þ“ýý¸ü²üýºýÙþ@Ú|ô$özÉ cð¯ y 5 « ¾ Y ‰ ] þšNA??‚çTº ÍeçG޵ÏÛÿÙþÖýÔüæû)û«úsúvú‰ú«ú®ú‰ú*ú˜ùáøø^÷ÄöYö,ö&ö\ö¸ö.÷§÷%ø¦ø6ùÙù‰ú:ûüÀüqý þnþ©þºþ›þUþíýtýýÚüðüoýLþŒÿ¤; Çœ+™ûy ' ý ã ­ . < ¾ Ê h ÙMîäFZÐeÞ$5ò6qœ»ÊÅÿ·þ¡ý†ürûeúŠùõø¡ø˜ø¯øÖøáøÑø…ø øi÷Æö2öÏõ”õ‰õ®õñõVöÆö+÷Ž÷ø÷|øùÓù®úŒûgü4ýÎý-þXþJþþ²ý.ýŸüüÄû³û üÏüøý~ÿ@¼!&Ì4ˆí‡ W F # Á ß x Œ Q íŽ_†_Í2xƒ_³@ÊRÖ<Ž»ÌÍÿºþ§ýœü¶ûûÇú¨ú¨ú®ú’úNúÓù-ùiø¡÷ööjö öãõéõ&ö†ö÷r÷ß÷Mø½øAùÙù{ú,ûãû}üýMý[ý9ýèü}üöû{û ûÂú¼ú û»ûÔüLþ ëºQš}“ ’ F  æ ƒ à ” î ô  …ÒŽ°§M4Ã&g£òTÈ6…µ¶ÿLþþüÄû®úÍù8ùÑø–ø[øøÆ÷J÷¶ö ögõÞôvô;ô0ôTô£ôõ’õöƒöööw÷ ø·øvùFúûÝû†üûü1ý4ýýÉügüÿû¨ûdûYûûHüUý¿þp? £ëÜqßD  b ! Ò N } 1 † ‡ ] ?P³{‘ñY§µzY®qõ‚ w»ØÕÿÍþ¸ý²üÇû û{ú úºùcùùøøi÷Äöö‰õõÊô«ôÂô õxõö‘ö)÷­÷9øËøqùúÍú{û#ü°üýRýRý1ýâüwüü€ûûÞú÷úrûuüßýÿ€iƒƒ.–äI Ö : Ï  š Þ ú % w ð%tÎûâtÑ,mÂ6·D¯þõþÖý²ü¥û¼úçù6ù¡øø™÷÷—ööŒõõ‡ôôËóžó˜óÅóô¦ôFõãõ‘ö1÷Ü÷øIùúÂúxûü–üèü ý ýåü¢üPüöû¥û~û¢û)ü#ý‡þC&Ï1(§ÎÖç+ £ L é d ‘ b á 5 y ß‚Xn¡Ôß§ ^ŽÍ$ >ê"‹Ò÷ %ÿ>þcý†ü°ûÛúúWù›øí÷J÷¶ö/ö°õCõáô˜ôkôbôôÅô-õ®õ7öÆöJ÷Ú÷cøøø’ù5úØúpûñûPüƒü‹üuü=üæû{ûûÂú³ú ûÕû ý£þu^3¿à™<n½; ç   @ ¨ ¹  ’  È ¬ º á ø ¯  `…­ñWÛ|¤M{‘¦ÿ¬þ¯ý§ü”û‰úù¬øâ÷4÷™ööõõôôËóó…ó¬ó ôô;õãõ‹ö÷–÷ ø…ø ù£ùFúñú”û#ü”üÚüý ýóüÃü†üKü4üdüðüêý>ÿÚœOÊë¤ù%tû± b ú C C ú ’ " Ë ž ’ £ © 9 ²þ<{àhÓ›Fä`ÆPƒ˜ÿ¡þ–ýuübûbú„ùËø<øÀ÷X÷ëö€öö®õ_õ/õ-õQõ¢õ ö†öùöa÷Ã÷øcøÀø0ù·ùFúÞú_û¾ûùûüüûÚûšûYû'ûû=û»û‘üÎýIÿÿ­>~\× #VÉw; ø „ ã  æ ¹ k F  Ó ` Ñ aªÿv·n*Ñtö^¥ÝÞÿÍþ–ýVüûõùù9øª÷:÷âö‹ö/öÄõTõ÷ô¼ô£ôÂôõõ$ö¶ö1÷–÷ê÷9øˆøçøcùïù‰ú)û­ûüKüaüiüPü:üüü,ü–üUýhþÊÿa‡Á”óöljr¨: í½ Z ± Ç ´ > ø ´ t " ½4™îH¶2ÐW3·[ßB}—Šÿfþ9ý ü÷úúOùÀøXøþ÷ª÷P÷ëö‰ö2öîõÛõ÷õ@ö³ö.÷§÷ øMø|øžøÅøþøWùÊùQúÛúYû¾ûü)ü.ü1ü&üü)üYüÃüaýDþ]ÿ þR\éú¼„‰é—ˆzW ý b ‰ y A ì › A äwùoàQ¼;ÊI% á¤Dµðüáÿ±þtýMü7ûQúžùù¯ø[øøŸ÷)÷­ö=öæõ¼õÇõöYöÁö)÷z÷À÷ê÷ø<ø‚øáø]ùòù‡ú ûƒûàû&üaü‘ü¾üëüýUý§ý%þËþ£ÿ®Ý6¥ÁŒ£TW¿Œ”ª›W ¿ Þ º f ø‹¸Såoÿ’ÅyF6(ûºM¸âæÓÿ±þ¡ý°üæûNûãú•úNúúùù`øÎ÷^÷÷÷1÷ˆ÷ð÷UøžøËøÎøÈøÃøÎøøø>ù£ùúúúúVû¢ûèû1üuü¸üýMý¯ýþ¯þZÿ$ þí¯;bLõˆ3]ìúßtÀÅ™GóŸV¶V`"û©X\F"ÿþýMü¾ûdûûÞú—ú*ú¦ùùzøø÷¡÷ƒ÷‹÷µ÷øDølø‚ø…øøˆø¯øòøWùÞùeúæúYû»ûüMü¢üðüPý¬ýþqþÖþFÿÅÿbè²nTe0Ót33ˆ(é¶Mœ¤i Ÿ=÷ÁšmFá¦nA3Dk˜nq¡¢ «ÿáþGþâý¤ýtýBýùüˆüôû=û‡úçùeù"ùù"ùOùù•ù•ùyùRù6ù6ùWù•ùïùNú®úûQû‰ûÏû üwüèüXýËý>þ¡þõþOÿ¦ÿ ƒ™t²ÆÆ²¡¸ ˆ*ÖeÏÿÒFغ©›eAûçû %( ·0}§ÇýÿWÿÞþ›þ‡þyþnþ>þêýoýÚü7ü¨û@ûúúÕúÊúÒúÒúÇú¥ú{úFú-ú0úTú‰úÒú$ûgûûÇûèûüKü‘üóü^ýÜýJþ±þÿLÿšÿïÿYÒSÆ.‚»åû6wÓ>´$mŒNÊ’qbZbekeRA8AIOO(çwÜ SÓÿLÿÿïþÿ*ÿAÿ5ÿøþŠþðý[ýÃüPüüÒû¾û°ûûpû7ûúúÇú¹úÍúûKû¨ûùû=üoü–ü­üÑü ýUý¯ýþ‡þìþ0ÿTÿpÿ~ÿÿ®ÿÛÿmÊ)‰Ý.t»`´;WI%ç¤qO<336AGRU[iy˜k"§a®’ÿOÿ8ÿWÿ’ÿÓÿ÷ÿñÿ´ÿOÿÐþGþÎý}ýMý9ý1ý.ýýâüœüKü üàûÒûèûüMüˆü¸üÔüèüóüý<ý‚ýÜý;þ›þáþÿ"ÿÿøþÓþÈþÐþòþ8ÿ˜ÿ ‰rà<‹Î.AMG"øÔ¸ª¯µÎç6fŠ©Ëßõûíºcß4}Ç!¨ÿ_ÿTÿsÿ®ÿæÿ ãÿÿFÿïþ£þfþGþ9þ-þþóýµýcýýÑüµü»üíü.ý}ýÃýíýþûýóýøýþAþþáþ3ÿvÿ˜ÿÿZÿÿÅþ‡þfþhþ“þáþLÿÊÿNÌ=—î4i€‚tGÔ—oagƒµð+l¡Îø"GcytR¤€ëeÛÿãÿN« p$Çÿpÿ'ÿõþÖþ´þ›þnþ-þÙýtýýÏüŸüœüµüåüýGý^ýqýtý}ý›ýÎýþhþ¿þÿAÿQÿ8ÿýþ¯þ`þ"þþýþ-þ‚þýþ„ÿ‘ë<o––…UÝ­ƒor‹¸î.o¸ê6GJ3½^ëu÷†2ñÿ*TxuWÊÿsÿ*ÿúþÞþÐþÅþ¯þ‡þLþøý¡ýRýýýý&ýPýˆý¤ýÀýÈýÆýÑýçýþfþ½þÿIÿeÿIÿÿ´þUþõý²ý¡ýªýóýZþÜþhÿñÿsà2g‹—‹xV&ôÄš†¨à2‹â<‚»ßööß½‹Gþ­dÚ®—š«Êæñã¶~:ñÿ¹ÿ„ÿZÿ8ÿÿýþÐþþGþþý¸ý‚ýcý^ý^ýlý…ý›ý¸ýÈýÖýêýþ6þnþ¦þÙþÿ ÿïþ´þcþ þ¸ý…ýoýýÖýLþáþ~ÿ  ^”¢¥‘oH&àÌÊÝ\»#ˆâ.`w|nR.Ë“SÚ¢rH,!! é³s*ÞÿÿZÿ%ÿÿÞþ±þþDþ þËý™ýaýDý6ý9ýJýaýý‹ý¤ýµýÖýóýþGþtþþŠþtþ3þßýˆý4ýýý9ý¯ýLþúþ®ÿTÏ#HE/ î̹®« ¥³Ì÷7ŽîU²0A3ܯ‹fJ1óÆŸuH&÷dž:ïÿ¦ÿ]ÿ"ÿêþ½þþkþAþþÙý§ýýfýXýcýqýˆý¬ýÀýÑýäýõýþþ3þDþUþGþ0þþýµýcýýèüèü ýˆý%þÖþŒÿ*¥ÿ#,ôϰ”ƒƒ†«ã,‘þoÜ6n‚wJߪz^PE9#Úª€dYYdujPÒ~*Õÿÿeÿ5ÿÿïþÐþ¬þþqþ]þOþUþfþ„þžþ½þÐþäþêþêþìþòþïþòþïþÐþ¡þcþþÔý›ý}ýýÖýJþÜþyÿ‰Úé¹FñÿØÿÊÿÊÿØÿúÿ,~àY×UÃ<?%ûέ“–¡²ÃÎɯ…[. ùîàÉ¢d ¹\ýÿ£ÿeÿ0ÿÿáþÂþ£þþRþ%þþýÖý¸ýªýžýªýºýÑýíýþþ"þ+þ%þþíýÀý‹ýRý+ý ýýJýžýþ±þLÿÞÿW¥ÏÚÊ«†\2ñÿæÿñÿCîaà^É<3Àt4îó+1)踔}}‰—Žu7æ{ÿFÿÿÞþÂþ¯þ¦þŠþqþGþþþíýíýõý þ+þJþXþUþ>þ-þþõýäýÙýÃý¬ýýtý^ýMý^ý–ýðýhþïþÿýÿ\ ¹®”mC' ÷ÿãÿáÿéÿ*eÁ7ÆSÎ+ODÑ‚J&.Uzœ¯²­™}[?#ùÏœNë‘2ÓÿŠÿOÿ'ÿÿýþêþÓþºþ•þvþUþAþ3þ(þ-þ;þDþRþXþRþ>þ%þ þøýßýÖýÈýÃýÀýÈýäýþnþÖþQÿÇÿ=šØ÷ôÒ®ƒ_C'ôÿìÿñÿF  ‰Žö06Ãf°€o€¥ÆâèÚÁŸ€gVNNH/ü«@ÇÿQÿäþŠþJþ+þ"þ"þ0þ0þ(þþþíýÖýÎýËýÔýçýêýêýßýÆý–ý[ý ýíüÉü²üµü»üÏüèü#ýlýËý6þ£þÿsÿÅÿìÿ÷ÿÛÿ´ÿŒÿ]ÿ8ÿÿÿúþúþÿ>ÿ~ÿÓÿC¼:°[}o9ü»‰l€¥à Szˆ€fB#öåÒªj¼W÷ÿ®ÿ~ÿhÿ]ÿQÿIÿ3ÿÿõþÈþ›þqþZþGþAþ>þ6þ(þ þßýµýtý<ý ýèüÔüÔüåüýUýªý þfþÐþ0ÿŒÿÞÿ,5/ìÿãÿÛÿáÿïÿ:sÁ!™‹öDtyXÃw<7i¡ËÜÑ­r4ùÒ»¾Á¸”Pîs÷ÿŒÿ;ÿýþêþäþêþòþïþçþÈþ©þŠþkþ`þZþcþtþ‚þ‡þqþUþ"þçý¡ýcý1ýýý1ýaý¤ýûý]þ´þýþ>ÿeÿyÿnÿ]ÿCÿ"ÿ ÿýþøþìþäþÖþËþ½þºþ·þÖþÿeÿÇÿ5üN†œ—uH#^œë1a…“™–‚ofSG&îœ=Ú{,ïÿÕÿÓÿØÿãÿìÿæÿØÿÂÿšÿnÿ>ÿ ÿÞþºþžþŠþþhþRþþçý¤ý[ý ýûüðüûü&ýcýºýþvþËþÿ-ÿCÿLÿOÿWÿ_ÿeÿnÿkÿ]ÿFÿ-ÿÿ ÿÿ5ÿ~ÿÞÿNÇ=œó.U^[9 ù 4o¯å(3" çÀ™}ridJ à™SÒ«—”{eF!÷ÿÂÿÿ_ÿ>ÿ'ÿÿÿÿïþÂþ‚þ3þäýžýtýiý‚ýÆý-þžþÿsÿ·ÿÐÿ¿ÿ•ÿ_ÿÿïþÖþ·þ´þ·þ·þºþ´þ´þ¯þ±þÅþïþ*ÿvÿÊÿ!pÁ=j†‘Ÿ­»Ý9d–¯À»ªtiaafX7ó¥Eà5úÿÓÿÍÿÍÿÐÿÇÿ¼ÿ¨ÿŒÿeÿ3ÿúþÅþ•þ`þ9þþþäýÆý›ýlý9ý ýèü×üâü ýaýÆý6þ£þúþ5ÿZÿ]ÿLÿ>ÿ%ÿÿÿÿÿÿ"ÿÿÿÿ3ÿIÿpÿ ÿãÿ*u¼ù4\€Ž—”Ž‘ŸÉþBˆÃçûþêѯ‚^?1  î»{)ØW5,*//'úÿÓÿ ÿnÿ8ÿÿÓþžþfþ9þ þßýªýýXýDýDýcý™ýõýhþìþeÿÍÿ $!Ûÿ«ÿŠÿkÿZÿWÿbÿsÿŒÿšÿ£ÿ«ÿ·ÿÇÿÛÿ÷ÿ'KsšÄù/VrŽœ§Á×öPtœ¸½Ã¸™z^B ݧd °_ïÿáÿæÿúÿ æÿ¼ÿŠÿFÿÿËþþ`þ0þþÑý™ýaý&ýóüÌüµü¾üöüGý²ý-þ›þõþ0ÿOÿFÿ'ÿÿÞþÖþÜþïþÿ%ÿ8ÿIÿWÿbÿkÿsÿ~ÿŒÿšÿ±ÿÍÿìÿ/T~³é=dƒ™ªÁÚð.EEB4ݰ{Hæ¼b/úÿÇÿ®ÿ«ÿ¼ÿÓÿïÿýÿôÿÓÿ£ÿ_ÿÿÜþžþhþ>þ"þþßýÃý§ýý‚ýˆý¤ýßý-þ˜þÿhÿ¼ÿæÿýÿ÷ÿÓÿ«ÿÿTÿ0ÿÿ ÿÿÿ ÿÿ0ÿCÿZÿpÿyÿ~ÿ‡ÿ‡ÿŒÿšÿ®ÿÇÿñÿ*g®ã7PlŽ»å +EXdddSJ9. èÄ”\!鼫 °ÊÕÒ¾šbÞÿ˜ÿLÿìþ“þGþþýºýˆýaýJý9ý1ý9ýRýˆýÈýþcþ¬þÜþÿÿÿÿòþáþÞþáþçþïþÿÿ8ÿ]ÿ|ÿ˜ÿ¨ÿ´ÿ±ÿ¨ÿÿŒÿ~ÿ|ÿÿ•ÿ¹ÿãÿY†³Õô/KgŽ¢³³¢ƒg=ÿæÕ̾«‘jN8,/,@FQTN:Þÿ˜ÿZÿÿÖþ›þhþ>þþðýÑý½ý¸ýÆýâýþUþžþïþ8ÿvÿ ÿ®ÿ®ÿ ÿ’ÿ„ÿvÿhÿbÿbÿbÿeÿsÿÿ’ÿ£ÿ«ÿ·ÿ¼ÿ·ÿ£ÿ’ÿyÿ]ÿOÿLÿeÿŠÿÇÿH†°Êàé÷#@ax‹‘”‘‰xjaVNH@) æÁ¥”—š¶ÌéñæÊ—T¼ÿnÿ-ÿòþºþ„þZþ3þþþþ%þ>þnþ¡þÓþÿ'ÿOÿ_ÿeÿbÿWÿQÿFÿQÿkÿ„ÿ˜ÿ«ÿ¿ÿÕÿæÿôÿýÿìÿÇÿ¨ÿŒÿ~ÿvÿŒÿ®ÿÛÿT—Ê÷#Ha{‘¥»ÉÄ»§ŽuY=ÿîààÚÒ¼¨— «°¨g=Íÿ’ÿTÿ ÿËþþZþ6þ"þþþþ-þGþtþ¦þçþÿIÿ_ÿpÿpÿpÿpÿpÿyÿ„ÿ˜ÿ¨ÿ¿ÿãÿýÿ'KsŒ‘‰uQ,áÿÇÿÊÿØÿôÿ,eÒ÷!     éÕ¹¥”†~smxƒš¨¶¼³¢†mCéÿ«ÿpÿ3ÿøþÍþ¡þ‡þvþ|þ„þ˜þºþçþÿ'ÿ0ÿ5ÿ0ÿ"ÿÿÿÿÿ*ÿAÿ]ÿÿ¦ÿÇÿìÿFm—mFãÿ¿ÿ´ÿ´ÿÍÿ÷ÿ8xÄHuŽ™œ¥­µ­¥”uK!÷ÕÁ®«¢ šƒƒ{~{xsgT@$ýÿÕÿ±ÿŒÿeÿCÿÿÜþ¯þþtþkþkþ|þþ©þºþÙþïþÿ'ÿCÿZÿhÿbÿbÿhÿpÿ‡ÿÿ´ÿÐÿáÿúÿ/Ns~eC!úÿÞÿÅÿ¼ÿ¿ÿÇÿÞÿýÿ,\‰¶Ýôüÿ  ùîãÕ¼¥‘{mbYNW_gx‰” «  š”ƒmKïÿ¼ÿ•ÿbÿ;ÿÿÿúþÿ0ÿLÿkÿÿŠÿŠÿÿ‡ÿ|ÿeÿQÿAÿ0ÿ%ÿ%ÿ3ÿIÿnÿšÿ¹ÿÛÿýÿ8C=/ñÿÍÿ¨ÿ•ÿ„ÿÿ„ÿ ÿ¼ÿáÿ/Tx”¥¼ÌÝñÿ  üàÁš{Y8$úÿôÿôÿC{®ã Ç{Âÿnÿ*ÿøþÞþÓþÙþÞþìþýþÿ8ÿWÿ„ÿ«ÿÇÿØÿØÿ¹ÿ•ÿ_ÿ"ÿøþÜþÙþäþÿFÿŒÿÊÿ2Qgxƒƒ†gNñÿ¿ÿ•ÿpÿeÿ]ÿpÿ’ÿ¼ÿéÿ:Y{¨ÇæôéÝÄuQ2÷ÿñÿìÿæÿéÿæÿæÿæÿéÿúÿ*,,8=HKC5!áÿ·ÿÿZÿAÿ-ÿ0ÿ;ÿTÿvÿ•ÿ®ÿ¿ÿÂÿ¹ÿ¨ÿ•ÿÿnÿhÿkÿ~ÿ˜ÿ·ÿÛÿ2\¨ÁÒ̹‘j8 áÿ¹ÿ’ÿ~ÿ|ÿŠÿŒÿ£ÿ·ÿÊÿÞÿýÿ':HWW\\QC5ýÿìÿáÿØÿÓÿÕÿáÿìÿ*//'$$'÷ÿÞÿÂÿ®ÿ¦ÿ«ÿ¹ÿÍÿãÿñÿôÿïÿìÿÕÿÊÿ¹ÿ±ÿ´ÿ¼ÿÍÿæÿ,CWxš¼Øëô÷éÒ«†b8÷ÿýÿ $5CQbmj_C$éÿÛÿÍÿ¿ÿ®ÿÿŒÿ|ÿpÿhÿeÿpÿyÿŒÿ£ÿ±ÿ¿ÿÇÿÞÿïÿúÿúÿéÿØÿÊÿÊÿÓÿáÿìÿïÿúÿ !'!÷ÿïÿãÿØÿÕÿéÿ@¾ÝîãÄpTHHHC*Þÿ·ÿÿ’ÿšÿ±ÿÐÿïÿ ,Nx¨Ïãëàǰ”~sssspeK5 ýÿúÿ!2=HKKC2ôÿØÿÅÿ´ÿ¿ÿÐÿãÿýÿ*5@5úÿãÿØÿæÿ*Qsš³Ý :d}ƒu\7 ÒuQFHF@=82/28:5'2Qƒ¥¼Á¶e8 ïÿñÿúÿ!!ìÿéÿìÿ!5FF:/úÿôÿôÿýÿ $CWjx~{mY=/,:WpŒ³Êàü&S}—™ŽoHÚ uWC/*!ýÿáÿÇÿ«ÿ’ÿ„ÿ|ÿÿ‡ÿŒÿÿ±ÿÂÿØÿïÿýÿúÿôÿñÿñÿïÿôÿýÿýÿ÷ÿýÿ*C\pxspeQ@:@Qs—³ÌÌÁ«ŒmN8,NsÏ/Va^K&÷Ç”pWC5!ýÿìÿæÿáÿÐÿ¹ÿ ÿ’ÿ‡ÿŒÿÿ ÿ¹ÿÕÿ÷ÿ2CQQTNC/,:F:2ñÿìÿïÿýÿ!''**8Nj°ÌØÌ¶Œb:!!,@eƒ ³Çà 7a€”Ÿ—ƒa4Ì—e@÷ÿÓÿ´ÿ¦ÿ ÿ«ÿ´ÿÊÿØÿéÿæÿáÿÇÿ¨ÿ„ÿhÿ]ÿbÿpÿŒÿ¦ÿ·ÿ¿ÿ¹ÿ´ÿ¦ÿŠÿnÿTÿIÿQÿZÿsÿ‡ÿŒÿÿ•ÿÿ´ÿÓÿñÿ@jƒ”—ƒ†‘°Ï÷/2ô¼ƒQ'!=j¢Ú 7\x‹œ­»Á³™g&؉:úÿÕÿÂÿÂÿÐÿÕÿÓÿÇÿ´ÿŒÿhÿ8ÿÿÞþ½þ›þ‡þ„þvþtþqþqþhþkþtþŠþ¯þÞþÿWÿšÿæÿ*j¥Õù é¨KÕÿIÿ¿þAþÑýýUýRýwýÔýRþýþ¹ÿs/ÌX½ðûÙ—xýÿ˜ÿQÿ*ÿÿÿ'ÿFÿsÿ¿ÿ†ülÔ)azwU&ÒgîmáÿZÿÖþfþþäýÖýðý(þqþÍþ0ÿ•ÿôÿK¾àææÌ¥sFéÿÂÿ¨ÿ•ÿŒÿ~ÿÿyÿyÿÿ•ÿ¨ÿÊÿìÿ/F_bgjx¨Ìñ)242/&î¨=¿ÿ;ÿÅþyþhþþøþ‡ÿ!ÁYÒ.t¤Ñû03¸)l‘´ÿÞþ0þ§ýRý.ý6ýRýý¬ýÖýûýþAþkþ˜þÖþÿFÿbÿhÿZÿ5ÿÿÐþ©þ•þ¦þáþ-ÿŠÿãÿ/Yjsgjj~¨Ò2P\Y\Vl‘Ì P‚“r+ÆKÒjÍÿ®ÿ ÿ±ÿÇÿôÿ!Y†¶ÚùÿñÒg5ãÿÛÿÓÿÐÿÓÿ¿ÿ¨ÿŠÿnÿLÿ3ÿ"ÿ%ÿ-ÿ8ÿFÿIÿFÿ3ÿ%ÿ"ÿ0ÿ]ÿ•ÿÍÿúÿúÿÕÿÂÿÂÿØÿQ†¨°”YØÿ¹ÿ¿ÿéÿ'm¨ÊÕÁ¥—š¶ô@œÚîÉjéN¹ÿFÿÿáþïþÿ"ÿ0ÿ0ÿ%ÿÿÿAÿŠÿéÿW¶ëëÄ~5÷ÿsæ^¾þÒŽBÿÇ{_/úÿ´ÿhÿ*ÿøþáþäþÿ5ÿsÿ±ÿáÿ2T¨ÇÚãÚÊ¢j*ØÿŒÿOÿ*ÿÿÿ*ÿ>ÿQÿ]ÿ_ÿnÿyÿŒÿ¿ÿ†°4½À‹<è™\/ÿݳKéÿØÿÞÿ bÒS¾Miz}zodEµHÌKÛÿŒÿnÿhÿvÿ~ÿTÿýþ‚þûý‚ý9ý(ýUý§ý þ`þ“þþOþõýý6ýýèüöüý(ý1ý6ý4ý6ýGýqý¬ýþ]þÂþÿTÿpÿnÿnÿ_ÿ]ÿhÿ’ÿæÿNÕlü–˜ûFvŠyhen‡«Íéôúïææì@\‰b¦(Ô =p®ÿýþUþÃý4ý¤ü&ü«û7ûãú¼úÍúûxûæû?üdüKüöû{ûôúyú!úìùÂùŠù3ùžøÔ÷èöÿõQõòôõ—õ—öê÷Zù¶úîûâü›ý3þºþTÿæëþ éšaœÏ J‘ÉèßÃŽ^Sa‹Æ(BD?+ íײ‹YƒÛûÔ¥u]ÿOþ[ýoü‘ûÊúú‡ùùÖø¯ø¬øÀøßø ù3ùZùsù’ù¼ùçù!ú_ú úÛú û=ûVûmû{ûŒû¨ûÒû üPü‘üÑüýGýzý›ýÀýâýþGþþïþsÿظ¸Ëý)P^G á 0 - á h Å#€ñ{'ôÒÇÊÛôEƒÁîÿÄ_¿ô óعÿ‚þ<ýÒûbúõø­÷¢öîõ õ¨õñõgöóö}÷ö÷[ø¡øÈøíøòøêøÈø›ø`øøÆ÷ƒ÷S÷J÷t÷Ã÷?øÎøkùýùsúÕúûbû¾ûKüýðýøþîµJ½ínò~üa—Ÿx5ì«•£àC¾7§ó%4+ ߪ}J ¾Qæ‰;÷±LË <=8CÿhþÈý^ý+ýý ý#ýýðü¾ü”ü}üuüuüdü7üãû_û¥úÊùçøøˆ÷1÷÷+÷[÷Ž÷­÷¡÷t÷?÷÷÷H÷µ÷]ø"ù÷ùÊú€ûü­üUý6þWÿ¼[Ê<` c I ßRÉYñîîñóîëñY¸PMð Ó¬»³†axÿ-þ‘üæúUùè÷Ïöö¥õ~õ†õ¨õãõ4ö³öi÷cø£ùû‹üäýäþnÿvÿ ÿXþýµüü¹ûŽû¢ûÝû4üªü.ýÎýŠþÿ—Ì*;!è“6ê¯ „ K ã 1  x e òM³`wûA¬ (øß?­/ÒxOÿUþý¹ûbú>ùcøÚ÷…÷E÷÷Žöîõ!õAôyóíò¸òÜòXóôìô°õNö³öîö ÷÷&÷P÷™÷ ø¦øUùú±úVûôû–ü9ýäýþ5ÿ¼ÿúÿ’ÿáþøýý#üpûôú úmúZúvú¶ú2ûîûûücþ$7|ö‚  ˜Ms†…~^® ñ!Ô"M#U##¢" "u!Õ / v¦ªu qµØáÔ´‚ 5 ÖQ©Ò¬ý!ú,öÑñ9í¡èFäKàåÜÚó×[Ö@ÕyÔÞÓeÓÓ·Ò–Ò§ÒÓ®Ó®ÔùÕ×*ÙÿÚ×ܼޢà}âQä!æåç¦éHëÌì(î{ïèðªòØô“÷àúºþ"þ &Õï6‡ Ì!"”!‡ A .à)óïÖT N ¿·S¹§gF¡×Çz  ™VbË{\5ÿûý–üû|ùí÷ŸöõõÐôÓôäôÊôhôóUòÕðLïî`í^íî_ïñâòŠôÒõŸöùöùöÆö‰öaöYöaögöYö!ö¼õ@õÇôeô3ôô"ô*ô;ô|ôõ÷õz÷•ù.üÿü•¸fÅ  ¾ ïÔ_<ù P"w#™#è"Á! ¿©@ u!ß"-$ %>%±$l#{!@(Ê:£ ÉÐ+ÅÿfýÕúÔ÷Lô=ðÌë&ç…âÞ$ÚµÖÞÓµÑ/Ð8ϿδÎïÎjÏ$ÐÑóÑþÒÔ_ÕÝ֞ؾÚ3ÝîßÖâÌå¯èVë›íhïÁðÔñÆòÀó÷ô†ö¤øgûçþ3.¬ ^Ü×ë!ä$”&÷&,&„$a"Q ½åÆAÂ/ ! •.ï<bk.«Ý ø :òOzrC@Ýña@–‘Wÿýûkù9ør÷÷Ôö¨öKöšõôDóÝñƒð_ï‡îþíµí©íºíÖíî6î‡îúî„ï'ðÌðlñÏñëñªñ&ñrð¶ïïÍîúîÕïœñTôÌ÷¶û˜ÿÁ–À¯ÜÓ ü v3MŽ"]%Q&_%Î" ¹~ó„>ï5Þê a b •”9þüúù(ø‹ö8õ-ôfó½òòPñ:ðÍî íëòè çuåbäáãøã•ä¥åëæ>èéØê7ìÀíï»ñôƒöçøûýŠþ«ÿ~rŸ”SÏ3ÿGþ§ýÀýÿî_ “+Z¿$+)d,^./|.ë,¿*[(!&D$À"Y!ÈÉ*ð6'ñ Ôõbýú4÷ô(òð"îoìÛêDé“ç«å£ã…áßçݸÜÜåÛüÛ7ÜtܪÜåÜ?ÝêÝýÞŽà}â äÌæÖèê ìMíîúï¾ñêórö(ùÒû0þ'¢Ã²·úƒ3 ¿ æ V Ú _ þé³áþ(ýûü•þÔ¼ ò4-¦¯†©Ç ˜ í" a :ù¸µ"‰&)•*8+j+„+é+­,²-Ã.„/ä/ä/£/6/¤.þ-.-ÿ+'*ˆ'$ ®Bƒ 6ì#4ü¥õ–íŠäKÛnÒTÊOÕ½N¹€¶µ¶´µóµ·"¸ò¸„¹ã¹@ºxº{ºQºº:º×º ¼Ð½YÀÄÉýÎÕ¾Ú®ßä(è°ì?òOùöÁ  )W0W5#8[9©9Ñ9-:ä:æ;Ú<¾=w>??'@•@5@ >õ9D4(.l(?#L\­ V »ÏyÿëüúåöôÔñúïZîðìñë—ëÌëì4ìüë¢ë5ësê8é¡çàå'äwâÝàeß-ÞcÝ+ÝtÝ%ÞTß1áÐãç¼êhîÑñ•ôuöV÷€÷B÷÷÷l÷â÷9ø6øÌ÷ ÷°ö÷˜ø‘ûÛÿv b 6-Ô *   X·À"*‰1S7Ð;ä>¼@—A‘A‡@J>Ð:š6r2/-‘,d-/ñ0&22{0Ž-²)Q%¨ ¢¯S ­ŽÊùØð€ç„ÞgÖ2ÏÅÈõ½y¹z¶µµ ¶|·Í¸¥¹ºVºdººy¹•¸¯· ·â¶9·¸k¹â»Ê¿ÅËÒЫՌÙÉÜàZä{ê óµýL Šzô&Ì-Ñ26É7É8²9Û::<§=ð>ì?„@k@Ù>\;6¿/ž)t$£ NÐâ,è® d ˜ p  s P – ¸ ¯ ¤ Ž ( N ý .×b´ÏÐÿžý:û¤øãõóYðÎíYëòè³æØäqãtâ°ááràÇßúÞÞÝÿÛ:Û¹Ú’Ú³ÚÛÄÛÎÜ`Þ³àýãkè"îôôgü´0 ]Qý8M Î ¶ ¨ ¦cáÖ#Y' )ª(5&"âœûp&  : # 6Þ©ž ë º .nªÿÝüéúù^÷àõÕôOô8ô~ôõÏõuö¶ö&öÅôªò!ðí÷êÎèç÷å5å•äÐãºâBá_ß3ÝëÚòؽ׽×-ÙóÛ¹ßä[è ìÓîðúïÖîGí1ì™ì_ïôô ýÇñz#í) .>0{1r23Ë4Q6ð7…9Ó:Þ;¨<ƒ=²>*@_AKAÃ>9Ç0à&€Pµ·øzòêì½çûâ¬ÞëÚ§×ÊÔnÒåІÐ7ÑlÒÂÓ2ÕþÖLÙÄÛÞ àëáòã4æ[è/ê°ë?íïÿðçò›ôSöUø¼úRý®ÿ™L5Þgü²^ÅÀDB¶“æçýúúµøª÷Dø¨ú¡þ·; ˜R`'frïr—Íb™HôýÅ$Ù(Ä+-œ,F*m&¹!ÏtWGE(#).³1z3#3„0Í+{%.°¦© ÷{ËþVüyùÁõÄð’êãÜÒÔÎÃÇ.‚½:ºÓ¸m¹°»÷¾ŸÅâÇÉ5ÉŠÈMǶÅ÷Ã9œÀš¿†¿SÀÂàÄÂÈOÍÔÑ­ÕØ”Ú»ÜÚàAéñö%F&l.12þ2V2­1:2X4}7®:ã<Æ=å=ù=>ó=Ÿ=Î=?Ç@¿@«<ê3î'5bì&üÏõPòÌðÇïî¥ë%é[çxæÿåšåŒåYæðç‡é\ê’êàêóëßíjðqó ÷ ûÍþS&ƒ5äþâýýwüùûÁû¢û:û ú øãõÈóöñpð"ïêí­ì_ë/êbéòè˜èõçÝæ_åÐãÃâþâ'å•é!ð%øeœÝ €Ú¸ŸÝ“ÅŒ’m ¥&ø-©5¹²9ì5˜4¿5‚8x;i=Y=¦:T5ß-O%¾câ\ÿƒü`øðñ¿é,á~ÙÓ‡ÍtÈÿ³º·Ê´g´&¶\¹ ½À+ÂnÃ>ÄxÄõìÂ7Á$ÀÇ¿ñ¿{À<Á6ÂÃSŬÇsÊ|Í—ÐqÓØÕØ2Û¶à¿é°õfº °Žù"\'æ*ê-«0?35o7â88:®;,=<>¡>[>?=Ê:6®0Å)€"Wy+©•lJ· µ! Ï ‹ w ° d Å j (Ù›sŒŽåLÃÞÿåüú[÷õcóBò–ññšð,ð®ïäî¬íìKêUèBæäöáãßíÝÔÛIÙPÖvÓÑÑlÒÌÕ°Û`ã×ë%ôdûÚ3Á@”… § TíÝÜ:Æ*K" %w(8*R*U("$9­îU‹ yD‘ñ=Ê×/æ CÉüZú|ø¾ö«ô4ò’ï.íjëhê!êQê³êÝêsê6é+çäèáÛßÈÞòÞ=à`âÕäçkè…èGçÛä–ááÝgÚí×»ÖµÖ.×ÑרŒÙñÚÃÜìÞuáÇäêqòRþN ¿A$•*-Á,I+**¢+.Ò1Ö4/7å8":ä:;;p;/<Ý="@ëA¢Að=*6´*Ô!úeõ˜óÎòKñ6î£é;ä¼Þ·Ù{ÕfÒîÐ&ÑÙÒuÕ‚Ø¢Û¬ÞŸá£äµç¹ê“íFððò¿õïø¤üÇò¬ À g“ñûcï¯ÆV•ˆ:ž¢ 4FÛÿ!ûaöò‚î^ìñëDíðÂó½÷uûkþ_,ü,eÿ ÿvÿ³žòw' G QpVK"K'*¨+˜*¢'?#iFí塆!¬$2&˜%#D@âsÀ«Ê ;þÊô¥êáÙ|ÓHÐÐÎ;ΓÍ&̘ÉÆ9Âʾˆ¼å»û¼’¿%ÃÇ{ÊøÌ`ÎýÎmÏÐÕЯÑßÒŒÔÚÖ¹ÙÎÜ¥ßâ-äæ²ç;é7ë;ïV÷*z7!W*R.‚.”,*ˆ()¨+ž/–3 6f8|9:_;£;~;ì;ƒ=¬?¿@6?Û:L4æ+$!ÙÇú²òïfíãëÍéùæã±ßœÛø×‰Õ¶ÔúÔNÕgÕàÕ¡×÷Úvߌä÷é¨ï2õúµý³¬èì ! U ç |e†xö 42Dd ø=Hý²øúóÛî]éÓã ß.Ü)ÜhßšåÈí—ö›þð…îW#P1©+ LaB½ld{%t.¾6 =Í@ÒA*@ü;T6 1M.6/o3O9²>ÁA¨Aw>É8€1¦)"2O ¢Sü²÷òÏêGâ;Ù¨Ð"ÉË©½£¹M¶s³9±!°ª°á²J¶ºc½À%ÂòÃ7ųŎÅCÅVÅùŠǦÈ/ÊÝËÎ1ÑÂÔDØYÛÙݹßVáÈãïèóñûý’ N1€"Þ%¸'Ë(Ù)W+)-/¦0ã13Š456x7{7n5ú0s*è"ƒ>¹G“ à (º¦®&jO €LþKü°û ýYâðÏÅ4Šÿaýü×ûHüùüžýþŠþÓþÜþfþwýYü5ûýù–ø÷Äõ´ôÓóøòùñÝð£ïZîíìHëLé ç/åýãòãCåâç†ë¶ïìó€÷ÍùmúZù1÷ïôfóóÐóõöÏöd÷RøpúRþ6Ÿ ·eƒ!%‡%É"½Ôê„Hõe; ï$P'Ì&w#ÎÒy›ÙfþûXø¢õÀòÛï^í”ë—ê@ê/êòééJçTäNà§Û ×vÓ.ÑmÐóÐlÒŒÔðÖLÙdÛóÜÀÝÑÝGÝ<Ü ÚÖØ‹×ùÖc×ÜØ\Û©ÞUâùå;éëëWîªñøyèÀ"/6B8K7Â4,21ö1º4^8Õ;B>·?¼@pAQA3@û>½>‡?@õ>«;¹6@0P'¸ sÿö°ðºí@ëMè¿ä¶àoÜLØÞÔßÒµÒÐÓÕšÕ¥ÕšÕ_Õ£Ô¼ÓÔÑÖzÜÂãëÝñ›øÛÿdiUN û"Ö$¼%ï%Â%$%í#P"¶ nî§UA’ ¦þÞùå÷øQûÿ™'œQsî±ÿ·þFÿé­©U§-ÿåüÚûíümù ß‚Ä&ÞëÌä[ þ #(÷*v+n)W%Û˜<M MIüÜýsú†ö.ò½íeé!åãà²Ü´ØÕêÑϪÌÇÊ‡ÉøÈúÈFɇɫɱÉÓÉ8ÊÕÊ‘Ë[Ì+ÍõÍÛÎEÐ…Ò¾ÕìÙ·Þ•ãþç—ëIî8ð»ñÐó<øî+oì*ó3 8}8~6ˆ3'1’0ñ1‚4!7â8Î9˜:š;\d=ç9¡4·.D)·$/!%!>$Ÿ'Þ)*ë'q#ðsXð„Dþ2úöXòïÙí#íËí ðJó\ö1ø<øŸöøó:ñLïÅîàïò)öõùùü‚þyþ+ýÿúøVö·ô·ó óœòÉñHðûíéêoçZä¡â ãÌåxêðxõÊùrüUýµüû„ù¬ø3ùûßýÿÀT¯ÅþhúÌö÷ôjõø‹üâè_ ” { ßæ§å’ ®]ðF \蜽F Õ!ª""h÷0ΓD’ÿ¸ýoý¸ýzýëûÜøÇôpðlì>éçùåxåå ä9â¨ß½ÜïÙ׫Õ]Ô•Ó>ÓÓäÒwÒâÑ?ÑñБѴÓó×ÅÞ¯è¶õºR-r'­,Ë/x1M2×23˜4´5‰6/78–9¿; >ç?AuA;@~<Í5m,5!„á f¤ü®ùùïù±úïù÷oò­ì‹æ—à$Û}ÖÓSÑ&Ñ×ѬÒqÓÔ†ÖŠÙÝ&â¸æãêžîåñÕôœ÷±ú©þËÖ Ò`t ò43«U«². ö ¹ " Çyÿ­ûþø.ø`ùüÂÿ“, Ì ª P † í ¹Âó"ñ%Õ&„%d"(›;‘¤  ™ _  Ï ¬þÝû!úºù¥úœüúþ^ÁC|þÚürû2úËø÷Âô1òhï‘ìÍéSçmåQäÙãÈãÙãáãÂã„ãLãRãÓãÿ䳿žèpêÒë²ìíìuìoëê¦è4ç³åçã‹áÂÞÜúÙºØJجØÚtÜ$àå§íAøø‡/©Ìöq"Ä%*P.¶1í385b68U:«<½>W@ô@A?ê9Ê0I%Åm_ ¤Ÿ‚ N ÈÞŸ  ÍTôûø=õó¤ò4ò§ñÝð÷ïáîžíEì:ë«êNê¼éÙèßç çóæœç8éÄëïâò¨öºù¢û=üÏû¨úêø×ö ô}òTðßíÝêGçJãõÞ{Ú?ÖÜÒùÐ4ÑÔÙªáSëéô°üÁ;¾  |ìʪ!Â%(k)v*=+!+©)'ð#à Ñv×M5Ñ j d SZßé,ª%‡T W:ûý/ûGøIõzòðøíñëê…èaç}æ{åQäAã¤âÃâãÛäræ9èêŽëœì í í¤ì­ë8êfèlæ‡äÎâá!ßÉÜFÚð×&Ö÷ÔŒÔ Õ§Ö’ÙcÞŸå$ï›ùú i4›¢Óé-%Î)J-|/¿0Ý1“36f8w9B8Î4Ó/**G$9lºÊ£÷m§öiæˆõï Ê®ÿ÷úS÷;õ’ô´ôòôôô·ôAôó[òÊðïlíBì”ërëÕë¾ì%îÇï\ñ¡òóCôäôsõÍõÝõvõô9ó‹ñ¶ïÑí¾ëIé=æ^â²Ý‡Ø·Ó&ЦÎÍÏÛÓ”Ú-ãEìTôúùåüžý™ýfþ2uÎ ýw#&t(·)Þ*±+³+˜*É(ã&%B#ñ ì¸ïA3ÂVÈ!æAŒóyq viüù¨õ?ò$ïµìÕêé.çNå·ãˆâŸáôà­àÿàóá‡ãeå+ç·èê_ë‹ì›íî"ï_ïï3î(íEì³ëdëë'ê…èæÑâ\߀ÜBۀܨà§ç«ð5ú¤ÅH ½ .ÞÊv¿éÇ%Z*4-©.`/Ù/@000%/-e*H'À# ïÿY¡ Y Í Ì ®Ô¬øÊl " Z«ÿŒû<ø¹õ£óÉñðºîˆíVìéê]éÙçxæbåÂä¹äW噿[è_ê“ìÐî#ñó³õˆ÷Åø6ùßøÜ÷_ö£ôóÌñîðýï‚î&ìÜè¼ä@à)Ü]Ù•Ø_ÚÂÞNåíØôTû«ÿ¸ öi]cqæ“+$Ü(«+.-.R.ß-Œ,¦*ª(—&($ÿ õÔýá†kuf›6’ù‚ wq%ÿÚû3ù—öËóùð‚î}ì£êËèüæ‰å«äpä®äNå@æˆçõèhê¶ëÑìßíÍîyï¿ï¨ïFïžî©íoìë´é·èèGç7æ•äfâàçݸÜåÜÓÞ¯â`è«ïÀ÷|ÿ£’ g Ý î † L­¢¸#Ù(w-à0c385š6^7S7b6w4g11-#(Ô"þiHó¡ï!ï€WØ# R ’äþÇûløäôxñ î–ìEëvêêÛéïé$ê{êôê—ë‘ìðí£ï€ñ`ó-õåönø®ùyú¿úpú£ùø ÷³õIôÃòñÐîìäè—å¤âœààwáÞäêFðröNûßýóý#ü¦ùÑ÷»÷ìù9þ T  ƒÃª‘Øø[&K~“z V j  s × -•ÒðÄ ñ‰;„ÏvÉøþùûùYöÓóœñÐï‚îµíDí1ízí3îhïùðÀò‡ô=ö½÷áø‡ù˜ù6ùøÔ÷ ÷4ö=õôtò8ð<í•éå€á6ÞEÜ+ÜFÞ¡âïèmðâ÷þÂÀžÿ" h]“j!#‹#c#Ô"E"î!¶!=! ¸~îÑëœÔ–‡IŠEÖ´~ µÍË^fþ:üù‰öfó{ð"î¾ìaìêìõíïðŒðÊðôð^ñGòºóõœ÷Uù{úÒúNú ùJ÷\õóòôðÛïîßìÕêtèñå˜ãþáÌákã+çÜìÅóÄú‰%b£§TžþGþ®ÿ¡uQ … £Ç¦¬ & ³ ­ $ ?m˜xœ  µ -d4Æ  @4¨³×<F´`<\øþuü!úø!öô>ótò4òXòêòúó’õˆ÷ùûùûü¥û®úDù‘÷Áõô§òYñïï-îÿë|éâæ~äÙâcâ’ã”æKë:ñƒ÷<ý‘ý÷Р¤ëFEß^`…ã•iÉë A Ÿ\YZ ¹ ² ¬|7 N 6 oQ‘:lªÓ „þ£ú¸ö3óuðËî6îîCï8ðñÌñUò½òó|óáó8ô]ô>ôÐó ó9ò#ñìï±îtí4ìÍê"é çvä™áÅÞzÜ4ÛxÛ‚ÝoáçÀíÐô5ûq¿| Ô Ø=|´ìIð2`º Qhˆ Û ÑÎ’ ô t_- µÍûœ|r#à«©þ5û¡øaöbô–ò ñãï>ï'ï®ïÚðªòïôX÷Šù û»ûuûNú[øÝõûòàïŸì8é«åðáÞ8ÚzÖ3ÓåÐ=ÐÃÑÏÕJÜ’äÅí¢öâý½¥ÿÚx ¿­¬#€(ñ+ .ð.Ó.û-Á,\+í)G(*&U#òaJ@¾Bm‰ýÉ^l ÃßPÎÑë‹ý•úz÷nô¾ñ‰ïâíµìÿë»ëìÔì0î÷ïüñôØõ?÷ø÷Ì÷ÄöõÃòFðþí:ìëmêáéýèrç'å1âéÞàÛ«ÙõØ'Úfݯâ’é/ñløOþM|e¿) ^ ¹ E Š¥°§wOnAŠ˜ƒ R ¾j V G ìKÿà ` XþVüû¥ú û)üºýFÿù¦þÔüÊúµøÒöIõOôôÂôöð÷ú üËýýþIÿ˜þýÊúGø°õóðóì„éÏååáõÝsÚó×רÛÞßæíAôúsÿ‹IH> ·•N"ð'2,….þ..$,¬) '±$É"$!]öÜg6ÊnA4#¥É Ó Wæ ýúø÷Ìö&÷ð÷õøÙùCúòùÑø÷õõòùð@ïõíJízí¬îÌðógö%ùxû#ýþZþþ^ýYü û‡ùÑ÷ ö%ôòï‘ìRéüåíâ«à«ßYàòâwçníô2ú8ÿµ•@Q¶ ^ 1TH/LíaýI¯ç Ì m é qHÉVò2 ^ ËÙ x #kÕâý¹û*úÙø€÷!ö'õ õÝõP÷ïøQú!ûHû³úù%ø×öÝõeõ—õ†öø5úuütþæÿ³ñã{Âÿ´þRý‰ûOùxöó"ïëXçLä[âèá-ãEæàê—ðÌöÌüâšÚò„ h E hÈðM%#Á&Æ(%)(¼%¢"8ñr ‹Ü) ± ɸ»Î‚ * « ä àðŠþLúœöËóÚñ¥ðð,ðØðÝñÔòióióêò òEñ¢ðNðNð”ðñÃñÎòLô7öUøIúÌû§üÉü7ü÷ú"ùóö¦ôˆòÕð’ïî–í^ì«ê[è®å"ãgá)áÈâ=æ/ëñðŸöHûkþïÿ\l–JH ãP³te½Ê™Ú¹‡ž ÓJ  y  à +÷„£¢ DÚ þÝû!úÅø×÷“÷ó÷·øù;ú ú¿ú„ú÷ù*ù1ø1÷Bö†õ-õgõHö¸÷]ùôúKü.ý‹ýXý™üxûú›øüöôô(ò‡î5êå¾à?ÜcبÕ~Ô7Õß×<Üþá›èOïCõ·ù™ü„þm0<™ úÊ ¾&Q+G.·/á//™-Ê+*‹(='¼%À#C!bŠ3úCn&WIq f¤ý›ø©ôâñ@ðvï@ïQïbïFïºî¤íìbê¬è1çæå¼å»æ‡èëõí ñô‘ö`øhù ù(ù#ø¶öôôó:ñ’ïîVì{ê`èæ½ãðá&áÑá'äèíÀò+ø™üÿglÏ ~º\ Êuí"3xD 2  „   Ra¨‰M ¶ £S|oC^ I [Ȥ¼¿þ”üsúáøRøÅøïùTû–üzýâý™ýÀüšûsúžù>ùGù±ù‰úÁûý>þÿ„ÿ´ÿÿ5ÿtþUýùû~ú¦ø,öÙòºîê,å»àOÝ‘ÛöÛ Þ>ãé_ï5õéùöüqþïþhÿÚÈ?ß Ü#Ý&œ(R)6)¤(Ï'ë&ï%©$×"Z aT¾=‹çÎ€Ì  òTÿ_û øsõ"óñ‰ï·î½î>ïÐïìïhïRîêì¢ëÕê³êCëHì‚íÅîð­ñ‚óvõ1÷zø3ùkù*ù…ø“÷{öbõLôó™ñÂï§írëWéˆçgæxæè_ëÿïbõ³úÿ…Ȥá= ØÇ»^¹&ci pÖ’DJ°îOÍ3 ö T‹×Dè MdsêþUýdûêø!öyó”ñÚðjñómõÎ÷Åùû€ûKûÂúIú5ú«úŸûÝü3þpÿp=ØŒ8®ÿ©þöüúƒ÷úó/ð}ìkéoçàæ×ç=êÑíEò#÷ãûïÿߴdz A z ‹kó; '!¼ A#¼oƒÑd’tj Ø  " * è ÙbÝáq Ð QƒãûÚ÷±ô…ò)ñrð'ð)ðKðNðìïïÀí,ì‰ê éÔçùæ‰æ†æèæœç©è5êVìïòõ½÷´ù÷úƒûdûúIù–÷¶õáóògðîªìúêÊé éúê-îóùäþ˜‰»ªùâT G%&^ %¥ó¼ÏÀ ¹ y Š |4àᱚÀæ n‹–éó ´ ¢í:Šÿý!û›ø\öìô±ô¹õµ÷ú7üÃý|þkþÃýíüMüüYüöüÃýþ%ÿyÿ~ÿ*ÿ‚þ¸ýâüöûîú’ùÎ÷‰õ¯ò5ï/ëÌæzâ´ÞÜØÚrÛßÝÎáÃæåë\ð©ó³õ÷iø—úþÔleàü c4–„ a!!ºß/F~Á5 ú ~ ›b#<( Rí¾üÓùM÷õ(óVñ•ïòíƒìNëKêéÙè|èqè²è éLé>éòè˜ècè“èIéêaìUî!ðgñÝñgñð%îÝë›é‹çÚå«ää8äWå»ç‰ë—ð\öü—›] äQQ RZi´ýX)ü… v N-ÔÝëúÿFÿ-ÿ÷ÿÆ›¹ п&Ñ ÷ mˆ€ðuuÿ[ýôûHû¢ûýúþµŠJµƒµ+¯3w­¾Çÿáþþ.ý ü¥úøÏõ‚òäîVë[èPæ\åpåNæâç$ê×ì˜ïÚñGóçó>ôôô­öÅùDþѱ qYâ+oî <Òìbp@ƒ.5™'‰9Å +‰Žˆ · 5‚ýEûLùƒ÷Òõ5ôÈò”ñðýï¶ïÄïðŸðEñ òÙòŠóïóÞóGóUòSñ¥ðxðÒð”ñˆòZó¯óOó+òFðÎíë+è³åäÂãå+èÃìiòø%þžZVô*áÁ¥ ÷W«ã¶8‘õÅm Y¯x½ý”û$úžù'úëûçþÆãy å É M Ç • ©§2!0ÿ%þÝüVû’ù‘÷võwó×ñîðüðò8ôùö ú(ýËÄû¤·<?Ò-wà~ÿfþ¡ýýEüàú¬ø¿õ–ò¼ï·ííì·í/ðôùþa@jóåB;™¶ ÖUÐÕyXüÞE # F k v åÉw l '¢A¬Àš… Þ ú þ†ûùt÷€ö:ögöÆöÿö×ö&öïôZó¥ñðïÍîQïrð×ñ0óúóôGóÚñðcî+í™ì¾ìUíî¦îî¬íèëhéuæyãá®ßæßâášåæêgñ…øeÿ/G š } ‘ ™ M *S”F±+#T%ÿ%O%i#¥ iöûôß Õ üºv5× , œ å à Ð 6lÿDýüûû*úDùAø.÷!öIõõõ ÷3ù_û9ýþnÿúÿ_à‰J‚žX»Ï*ÿ¯ýYü@ûFú>ùå÷ö“óbð–ì|è˜äƒá¶ßh߉àÎâãå6é,ìAîIï¹ïYðüñõ±ùbÿ„@ úR@ýà>„L;¢þä"ÑSö qy,5Zž/D­ G æµÓÿoý¨û~úÊù8ù“ø²÷ŸömõFô6ó<òañ»ðVð8ðrðæðŽñXòJóFô2õéõ\ö‘öŽö_öÿõIõêó§ñeîKê¢åÝà€Ü5Ù×íרÚßîå(í"ôÓùžýQÿvÿçþ›þeÿ§T ýfƒð«˜)¹ž ö I ÚjWú•.• l %2¢ôl ~ …Þ¯-ÿRþ+ý»ûúiøöö,öSöz÷Dù2ûèü3þÿÊÿ””Ñ"F 7ÄÍ–1ÌÿÅþOþþ–ý¤üØúøô‘ðßì!êõè’éàë~ïÀóâ÷ûÔü ý üÛú*úÄúâüCI.: ù t î ¾ L äÆ1 Vw:œé‰Þ" ° Lx¢†µ ¼ œ«÷ÿþ4ü@ú3øöôwòŸñÚñ óõ÷òø;úãúÿúÐú¥ú±úôúdûÝûSüÌü&ýDýýµü?üöûü[üµüÀüü‰úâ÷3ôðaì÷é’éxëZï£ôpúÇÿÖ2¿…ƒ’ÿ*aÞé ¬ „rÆF<ü á š/›ð\eÿOÿNMPC G þ o à  r'HÅÿkþýmûºùøoöõôÎó£ô}öêøpûˆýÿýÿš ‰4á’ïØkºÆµ¶ìÿkÿäþóý7üŠùöèñÈí_êfèiè£êÂîô|ùðý³‰—¯þÃüôûÝü’ÿ“# ¶üCáS è Þ F ç ] lë-‹ˆºñΨ ½ ›K ½ à¸áÿkþ&ýÌû2ú[øVö0ô(ò‘ðãïmðòpôóöAù!û€üqý6þúþÇÿšB°àÚ¢5-ÿJþµý}ýRýðüüûLúÎ÷Šôàðˆíjë)ëûìð;õ8ú˜þ‘²Üý[üBüËý¨W$ ö t å ” é 6ÁÁ*ÅI‚œÝÌ¡y1m “ B›J   ù•–ù ]ÿûýMü{ú¬ø÷ö ö÷ù¥û0þTÚ¸<MXfi`?½BŽÇýÿWÿÜþXþ™ýSübú¤÷5ôpðÚì2êééé‘ì¹ð°õsú þØÿÓÿqþªüŸûü0þ×SÇ k¨gÏ'Ú O N=…½ »)qŒ4á 0° k ™˜§ÿÆü÷úvù øªö-õ¦ó òÚð/ð{ð×ñõóVözøúVû[üaýyþ•ÿr<+ågÄLÿÂþ‡þ|þOþžý üÅù¸öDóúïwíoì3íØïäóø ý‘¡EÕ•ÿ_ÿ~âG ÿ º Uç Ï H ´ P?o¹æÓz&=Üe„ } Ì L J$.ÿ–ýüeú¡ø×ö/õÖó"ónóÐô÷Šùàû§ýÍþÿÇ­¤Š%e6½)K‘ôÿúÿãÿLÿðý¥û–øõ^ñOîƒì‹ìîMòóöŒûCÿƒ&uìþÓþ$ÉS 9 W~× ‘ (  æ±©yò0€PðvÁU « 9 ½  p  =AQ¡ý=û ùâö¦ôiòYð•î íì¸ë)ìí´ï+ò•ô»ö¡ø\úü™ý'ÿ¢ðíyˆ9­ëN¼ÿvÿ>ÿºþ…ýgû–ømõoòðï•ï ò öÞú±ÿ·V^ñ‰íåkãï ù hÄîJ& õ ö7´Jëš„ÿøþCÿ‰¸q Ì c Æ ' êrûµ£ÿ¸ýæû$úwøÔöTõõó¬ò‹ñãðñòõó,ö[ø5ú³ûðüþTÿ¶Aø–²ŽWÿþzýGýDýý=üŒú øõòbïÈíÃí£ïRó?øwý2mÛðsNµe¸ ‹ õ"<­ Þ O 6²€[Sp˜6„³§ Y û ¦O  |¨½ôÿ…ýYû`ù€÷®õøófòÿðØï*ï'ïðŸñ¡óÁõ²÷kù÷úgüßývÿ™º;-¦ÙåÚìÿ*ÿ¬þ`þóýý‘ûkù×ö-ôÆñ,ðìïMñ3ô ø[ü5¿Šßû é(T ù þ = ï R ¤!ØÖJŸ!ügŽeÁL E û µ Ÿ ÷ õÄv+ þHü®ú6ùÌ÷möõ¦ólò»ñ×ñÎòRôöÃ÷0ùZú_ûaüý±þéÿ³öÏV¥¿ÿ½þ½ýâü1ürûmúêøåöŒôòØï%îqí6î¢ð‡ô0ùµýEi;½ÑÖñÐ ß |2Æ2 i  í‹è»°€ {Û57Ô½ ƒ µ  † 5 L „šÿUý,ûùóöÛôÜòÝðúîBí×ëôêÊêŽë3íïòô¶öøFú üþ …]’RÅ(‹™Pp_ÿµý~ûòøuö‡ôÅóŒôÿö®ú ÿ<œ©; ¡…”HÒº \ ¥ S E ‹ K º jánÒ±ÿÜþ‚þÜþåOà- Û ­ Œ £ " :$þÇ„þHüúøöpôó×ñÚðìï@ï-ïúïÆñ>ô÷ ù³û#ýõý„þÿ,aD¯–G@/ÿ%þ<ý&ü³úßøÌö¼ôêò™ñ ñ™ñó»öØúÿ­òÕ±/ý«dø ß hr°û­ * åEvLbWýW´qËæ­ÎÇ  l Ò ~ ·­|+Ûÿ…ý:ûòø¥öRôòðyî6íPì¶ë€ëÒëâìÙî”ñ¿ôå÷—ú¢üíý¯þ5ÿÕÿšu1­Îï“}^1¾éŠÿ¤ýVûøøëö õ—õùöºù[ý#e‘ˆwÕ,ñ_…" Ð  Ï Ã  ¶ ( ‘!ú8Åÿ÷ÿë¯÷l¯ K î  Ö 1H-ù«ÿXý ûËø»öïôyóPòYñ‰ðÇï$ïËîïðåñOôÏö ùÇúüýþýÿ2B[<»ñ ÿ þþüÁû>úqø†ö±ô.óEò&òó$õ?øæûŒÿt8´bΖ>ã[$ ª OÖAº U HæQCZ2©ß É(]Qº â É Ã ù ¨ ò ûÞ¦o8ÿý¿únø4öô<ò”ð2ï(îlíící„îðóåöú§ühþvÿ=  Xn2ÍO‚×@¨÷ÿÿþý»ügû8úyù„ùúªü˜ÿÉ ‘Xñ$’¢É–¬Ä %a3ÿÓþ¬þþþ™ý.ý ý¸ýÿ2Åg› ¼ Ç ] £ ¤YÕ(U_Gþ,ü*úUø­ö5õõóçòòuñ?ñ¸ñóxõcøHû›ýÿÍÿæÿÓÿ¿ÿØÿïÿsÿ¡þžýoü)ûÊù9ø”öôô‚óJòañØðÒð™ñUóöhùûü:¤æe:" — 6~ùa­ïˆ á ÌñÕÿ ¹%`Oq,± š £ é –Ïºt$ÎýŽûOù÷äôâòñï-î+íƒì ìùëì¤ìîrð¬ó:÷úRýQÿ¢‹E Ÿ¸jã5nqaE=TÿþøýªýËýþÍÿµï'ë v | y ± L  î u x Ê I WtÍÿ½ý€üöûëûîûÕû”ûTûQû×ûýÿ{ @Ét`Ì׫Zê\¹ÿõý#ü@úiø—öïôólòªñ=ññðØðñ­ñ(óWõø¥úÀüþ¯þáþýþ>ÿ±ÿ$e: ÿ¬þqýühú¤øÆöýôyóoòðñþñ“òÈó¿õtø¨ûòþåIü,< j Ñ Œ+C†É  ûUˆ—vsá úxR ò Ö ²æÓ‹"ÿ­ü5úÉ÷eõóôðïBíåëìêIêïéÈéÓé'êÿê‘ìï&òŒõ½øKûý3þÙþbÿôÿ¶†Jðc¤²|ûáÿáþRþAþ´þ«ÿª]ì1µ- ¯ h ƒ  Âpœüdá™ Ç Éúµ2·ÿsÿ>ÿÿÂþ¡þÂþOÿ\Ô÷ŒŽ'Z8Ñ7ÿ¬ýÁûÞùøYö¿ôDóâñŸðŒïºî(îçíîºî/ðˆòšõáøàû"þyÿñÿÓÿÿOÿhÿ±ÿôÿ÷ÿŒÿºþýü$úó÷®õ©ó<òœñ×ñÜò˜ôóö¼ùªü]ÿŽ>=r Z  µÅÞãÍÑ-M « ¡^³SìZ£íq]ß—D˜ A * ` uކ‡þ™ü³úÃøÉöÐôâòñšïcîííÜìÉìÑìùì|í îðAóEö0ù«ûwý•þ5ÿ ÿϳ¡ˆ;’h¡4F;þ‹ü¶ûüûaýšÿ[8ÎÈ ã , ú  ñ Ý z ±)qúbb%µ R 7¤Ä{Šÿºþðý9ý¤üiüŽü#ý3þ£ÿ,t+<Ë7=ÿøýÆü°û•únùø†öÍôó7ñ£ïqî©íGí6ícíËíŠîéïöñ®ô­÷’úý´þ®ÿCpÏS»Ô†Ä•ÿõýèûù#÷8õôçóÍô¸ö|ùÏü*I¢}?f / ¯ ¢·pDä?gºE m c4³€:ÁL¬[|"'5ù œ’%}¹ýþUýÌûFúºø÷eõ¦óíñFð´îcí€ì ìùë)ìƒìöìˆíOîyï:ñó=ößøû¢üžý>þËþÿj{…qˆ#Àý»ûúÍúSüýþ^W è o ç ¤ 7 ? (!ó7DŒ­{aò < Þ BLÀr@Q·ÿÿÍÿ‹ÉÜyܽYÍÿ"þYüú·ø÷~õô¸òdñïïZî§ìúêyéXè¤ç[çrçÔç…èyéÒê¡ìéî€ñ%ôŽö‚øÙù¨ú=û×ûµüÆýÐþ˜ÿæÿšÿ¿þ<ý5ûäø­öõ`ôõH÷’útþJ~­ÎL º Ð ö ;R¬™ã ¥ ç œ Æ& ¾ ¦ ¦ ixéÞ_Sz„ "  R ÚÒnÏ(þ”û(ùîöæôó^ñÐï`î íÉë”êŠéºè%èÜçÙç è¡èeé‰ê7ìeîôð“óàõ¤÷ÃøcùÊùZú@ûzüÈýáþ˜ÿ¨ÿÿûý[ü‡úÖøß÷ø ùYüþ  Ô Ã Ž ê F¸À@êI * ¦ÔNë Ï / Ö nëj;–“(2o“BD‹:Š¡¨±þ»üÒúêøÿöòôçòèðïRíÏëê]étè¬ç ç‹æ=æ:æ—ælçÅè³ê%íÐïXòTô†õööö™ö¤÷0ùØúHüýþüñû÷ùl÷òôJóó]ô÷àúÿCB 3 k s » 2‡?F ¾!Ž!údCû{¦U. Õ 0 SKóq •  Ò   À’J çþíü!ûyù×÷öTô‹òÝðCïÃígìCëTê±éIéé%éhéòéÄêöëžíÄïEòÍôåö[øù>ùAùù>úƒûýnþQÿbÿqþrüÓù<÷põ õVö]ùÆýÙ»³ OpkÙ˜Za›‹oŽ! " !ÜÏcúëO æ ¡2Ùë¼uo±Äd 9#ýþëüúú0ùw÷Çõ ôaòÊð_ï"î íìüêýéøè è7çŸæPædæüæ3èêƒìZï&ò‡ô/ö ÷V÷V÷}÷ø;ù±úüÝüÀü”ûŠùüö~ôÆòlòÈóÔö@ûgs¦ } Ù ê +~,ÿe© " $c$##’ 7›,R2›<Æ  D §‘Hã?ï j ) Õ y MÁŒ+þüú9ø\öhôtòŸðéîXíöëÊêÖéé¡è]èRètèÐè`éêÿê.ìÃíÐïò*ôÍõÆö<÷w÷Ô÷˜øÙùbûÚüÎýßýßüØúø-õÙòÝñ¸ò õQú / ÜÛa)à†Ý_ A$à&Ý':'2%4"²»ÖV² @ ÖÒŒ/Ǭý •  ˆ,`{¯ýûÑøÁöÞôóñ'ïDí{ëÖé`èçãåÍäÈãÙââdá á áµáÜâ äþæÂé¤ì;ï4ñ}òóqóÎó£ô öø÷ú°ûwüü‡úøIõâò³ñEòÕô*ù¬þk‚ 9 LôÞïô^ÿbÅc#¨%K&F%å"•ÿ¡ÞÖd4Ø  ž^’ : É ¡ i ü ’ ‘tƒóýÄûäùAø­ö$õ›ó&òÇð•ï’î·íûìHì¢ëÿêsêêÅéÍéê¿ê»ë+íï7ñZóõ öVö@öödö7÷øúTûÇû5ûù÷úóñÙî0î’ïó[økþI  Ü ß ‰ò[a!½$¶&#'&Ô#Þ ¸Ç1úá»Tà C XV…¯{ N – Ü  ' ©ãuþÁûsù ÷pôÁñï°ìêïèžç‹æšå£ä’ãzâzá³àQàgàá[â>äªæ]éîëþíWïúïð,ð†ðuñ óõÝöø%ø÷*õßòæðýï¥ð óP÷µü‹è) ì@¥ã׋ù£ ½$³')Ã(Õ&¯#ÛùØÖMÕ å • ˆ<îª ¼ î & $ õ ÙÛÿJý/ûqùí÷‹öõ…ó×ñ'ð˜îPíPì­ëEëëëë2ëjëÝë§ìÈíIï1ñqóæõ+øäù¹ú¥úúùùø“øIù~úÇû€ü4ü úÎ÷ôHðí7ë:ë`írñâöÀü@äC ô Ç o @‹è— .#„$•$…#ª!c ì&ªýc V - ' 8 þ û@>Q ðN|þñû’ù:÷¼ô#ò‰ïíÊêÎè çÄåähãMâ)áàìÞÞžÝÃÝžÞ:àâTåAèæêâìî„î›îÐîsï¶ðòbôîõ¨öHöéôâòæð£ïÊïÑñÁõ5û}‘¥ -Ã×1›d\ïI$¾'Å)*Æ($&»"Ìñ*toS È Üó4` s x ± ß¶ËýHûAùª÷=öÍôDó­ñð¦îfíiì¶ëQë,ë&ë&ë,ëCë‰ëì ívîpðçò õAøQúŽûàû€ûÂúúìùhúuûÀü²ý²ýYüžùàõ»ñêíëÊébêêìñjö ü7Q4$ ­ w ï< !²r!+#ä#·#â"œ!' ·SÝ×BÇ.¯ Uä0^Œð 8¾±þôû`ù¸öÞóÕðÀíÒê.èÚåòã`âáÁßkÞíÜ^ÛéÙáØØõØYÚ™Üpß}âKå}çáèéÍéêÁêìËíÐïœñÎòóoò)ñÇïýîZïYñõ_ú”ÝV _ÑíUÈ}&• %í(m+4,;+À(T%”!µÚ;wo%Ý ý Ù ± p Ï Ã 7 g ™IóòþˆüÊú˜ù¦ø§÷Vö±ôßòñvï+îDíÎìµìßì%ífí©íûíîTïšðcò£ô+÷˜ù~û™üÚüiüûàú—úéúëû<ýnþÍþçýƒûê÷½ó¦ï^ì_êôé2ëÙíxñmõ;ù€ü*ÿrºg· ª ë •:öËõ¦B‰ÌúÂùøÐ%·mÉ8ÚS—é” + Ífÿƒûþ÷yô&ñîYë éçbåáãqâüàmßÎÝ9ÜîÚÚýÙ«ÚÜ8Þ­à"ã5å­æ‚çíçGèßèìémë.íÓîñï@ð£ïcîûìì?ìî­ñåö.ýº© Xu(þ£Û4¼/ ì$9)_,Ü-ƒ-m+(õ#Ø46Ä•aòX á ðÔÀ§8 Ì Ã ° g  ßïÿ…ý¾û‡ú•ù“øM÷«õÎóíñ8ðáîîží¤íþí‚îï‰ï÷ïxð:ñtòLôÆö˜ùlüÖþeëuTÿþý­üý%þ_ÿ:þ¨ûÉ÷¬óð|íJì}ìÙíðˆòúô#÷þøÇúýÙâ œx 3-U&g@‘ ƒP7] Ë‚Rÿú,Vs¯xu Å Ý©*oüˆø©ôñÃíôê›è§æÿäãâ¥à!ß¡ÝEÜEÛÛÚ&Û<ÜýÝ,àwâŠäæüælç§çþç´èÅéë^ì<íní×ìœë'êééŒêÙíóçù€º›‘©k±b4pÞì$²)u-©/0Ë.ë+(Æ#á­ÆZ“‡€ ò GÑž] H œ ¸ ^ · =tÞþèûÐùøÉ÷÷ö®ô×ò¾ð½îíüë‰ë­ë4ìèì“í(î·îTï/ðˆñ…óöùùû„þFÏÞÿ¯þºý<ýoý6þLÿ5eyÿXýLúèöÅóƒñ\ðdðxñ.óõ”öf÷‘÷z÷Ã÷ùÿûbÛ— ÍÊ4°ek W2K7{–aåBq¾û^ß—Å–8²  [F»ªý6ù©ôYð‘ìséþæåRã»áàZÞ¡Ü&ÛڌٱلÚå۲ݚßMá“âXãÈãä äƒåÁæ3èéhêsê˜éè)æØäÍ䏿ÛêñÑøÖlÕǤ«kâ#U( ,t.D/.x,i)Ð%,"Öî9€‚@ W Ôiø ë o ß Ú ~ &iÓÿÔü¥ú`ùÀø`øÑ÷ÔöWõ‚óŽñ¿ïLîXíùìí…í+îÙî’ïmð‘ñ%ó8õÌ÷®ú“ý!û[VY¼ÿÿýÿ !þý5û+øYõDó(òòûò„ô7öŸ÷Uø+øl÷¥öŽöÉ÷«úÿkÙ ÒÅÎ)WÑ  Ù  ¿&K¾§®7Dî\›Ìïæ v ”9sÿdûE÷Oó¨ïzì¼é^çNåtãÀá/àÓÞÙÝcÝ…Ý(Þ;߃àÔáûâ¿ãä-äCä¨ä~åÒæqèêEë¨ëëvézçÊå'å=æ`é î’õqýI ñí_¶.Óó"d'*+­-.â-Í+Ã(8%ª!|°"ul ª ´ ¤¸ÿP" à Ú – ÷ 6Í@âýûÓøM÷Nöõ±ô·óžò}ñrð‡ïÖîtîZî˜îï´ïrðlñ¯òbô€öþø³û`þǤÀÈ+€ â fÆÀRþ¾û>ùS÷KöNö1÷žø$úQûÏûƒû’úUùløfø£ùSüÈY Åá·‡Ã Û 3 %ç š Ê & À—ŽeãÄã@›ÿeçi Ò é –ÅŽ þ_ú¸ö.óÞï×ì'êÎçÇåä§â‹áÇàpàŽà)á âDãeäKåÏåñåÕåÇåÿåÁæè«égëÆìfííÝë$êtèwçÎçìéîôVûÔ ½43TbþŠþù!é%<){+d,Ý+*d'6$ú ö8¿¡AÚ Ù¥Œ«Ú›T b j L 6{rnÿ°üTúløÝö‰õLôóèñÁðÍïïîGî(î(îUî®îCï5ð‘ñió¹õUøû½ýµµû¸+™@=}Ýè eÿýyúø)ö8õNõHöê÷Êù{û¢ü ý¸üîû)ûØújû ýšÿÑ2G ¹ U ç  Á F ûr:dö ¦ Á 0Ò]pÃ(²*›übÅ  Î%ÉüùEö óæïí_êè æsä>ãwâ â6âºâžã´äÄå—æ ç ççîæ çŽçŠèòé‰ëêì·í¬í¸ì&ëséDèMè êÀíJóúHí? ã 35Ó=!ò#´%N&Ð%U$."¬¦^U-§ ( ûø(]×þ- R³’Jõýüvúøør÷àõZôó<òÁñ”ñ™ñ§ñµñ­ñ‹ñrñŽñò3óéô&÷ÈùŽü;ÿƒ ûÅ9ÙÔUõbIq̇ÿëü\úGøëö{öÚöÌ÷ù-úûšû¶ûšû~û¹ûlüµý|ÿ”Ëã° ì I "  q,Û«Â6+½ÿt & Å ¯¯Aw{b%¸  8 %î©\ÿèüšú+ø”õíò\ðøíÚë!êêè9èèyè3é$êëåëlì–ìoì#ìñëìˆìqí£îïïôðrñ/ñ2ðÂîXíiìiì–í$ðôÖøþ?W l í Z,¤¶Xò—!"x!é­9„þŒQ ‹ñÖtü^‚‘œâS$®ŽúÿUþ‘ü¥úžø‰ö£ôóòrñ7ñBñjñ‘ñªñœñ‹ñ°ñ?òkó@õ¤÷Qúûünÿg¯O[ßΡe-¹Ä¤™Zÿ.ý~ûsú0ú•úgû[üDýðý`þ“þ£þ½þýþŠÿeƒÆCaP zBˆƒIÑàP\ÚC z 0L¼¦-t… Y é - B/ùÿ9ýŽûçù%ø:ö"ôüñïïî­ì°ëCëYëåëÀìËíÖî¶ïCðpðCðôï¼ïÒïKð&ñGòwópôæô¦ôÂó}òMñ”ð°ðÉñõó÷ñúýþÀÞ4ï Y × ½,&õ <rÄYUö‚ ä½ W #/ž¤P§…®¹a~_ˆd„þµü«úˆøxö¼ôwó§òGò1ò<òMò6ò òÉñ³ñüñÙòLôNö¯ø)û}ýkÿÁj‹^&&ƒ43F2evû4sÿõýóü€ü¢ü(ýíý±þTÿÊÿ @† ɽ¿•=¸JaS ‘î5q½(ÔÜR>H Ä ,  ™ ¤ X É ù Ø t Æô $]þÆüCûÅù.ømöôœòÊð5ïêííµìåì™í½îðzñ§òtóÐóÙóÅóËó%ôÕôÏõÿö+ø ùZùþøø¨öjõ¹ôØôñõó÷¿úûýKRÏ©  ÿ . ·‰lC¿„•E3  6 wÁreÿFÿÿN:Î0?»E°FOÿþ”üéúUùó÷Ôöãõ*õ ôAôôÎó¡óó£óúó©ôÍõz÷˜ùùûDþ2‰BwP îµ²ÐÁ=/„WÙNúÿÿ½þÞþWÿìÿ‰¥oÔRßká/j†š —{Qúh¤µµÚ8ìÿ‰j¡«&i]  b ‡ _ ï " ­`ªýÿ„þ4ý üôúÊù|ø÷gõÈó9òèðïï_ïQïÛïùðò0ô¶õÒöf÷w÷B÷÷H÷í÷ù‰úü1ýßýßýDýEü@û—ú‡ú:û¢ü“þÄðÞu§ž‚ ‡ Ï U ø†»ruÉh…:  [^ØÿŠþ…ýÏü[ü.ü=üuüÏüJýÖýnþõþkÿÐÿÇÿCÿyþýˆüŒûúÊùùtøâ÷S÷ÏöPöùõ¿õ®õÁõ÷õPöÏöŽ÷¤ø*ú üþŸ™øðÆÎ3øïñÌPd5' fù7¡Šý]Å8«d”šu=ñ¨W˜31Óÿ¿þíý‚ýýþÐþéÿMkh=ÛH~o QLÆ~AÿþöüëûéúäùÙø¸÷ƒö8õïóªò†ñ‘ð÷ïÊï/ð#ñ“òCôëõH÷ølønøiø›ø3ù0úuûÑüþÞþ5ÿÿ|þÑýXý9ý¬ý¬þ,üáRW b { » ]x:}7_J : ¾©×HÿJþ¸ýXýýèüÝüÝüûü<ý›ý þ•þ ÿ]ÿpÿ5ÿ¬þêýý7ügû¨úýùhùäø]ø×÷[÷ñö³ö‘ö¨öÚö÷X÷ˆ÷¸÷#øù úŸüÈþ«²Æ“d‹=Hrdå;–<%An¬ß`¿;Òjã.7¥!~Ö-›þPxs_ÿcþ¤ý<ýBý¬ýqþeÿe^7ß]©Âº“GßU³ù,Lÿ`þcýlü{ûúžù¤øœ÷}öQõ'ô óò,ñŸð¥ðañßòáôööÃøòùvú{úQúNúÂú¶ûý‚þÐÿ¹:2Á~ÿ*ÿLÿôÿ€~Áâδ ´ Ò  % ›®In& • ޤâ\ÿþ1ý­ü[ü:ü?üdü‘üÏü ýýóýhþÐþÿ-ÿýþ•þ þoýÏü7ü«û'û¨ú-ú±ùIùßøŠø9øþ÷Ü÷É÷À÷­÷‹÷r÷–÷]øìùüŠþÇf?i+óÀÖ![JÜ È#<Y—$ú @Œà/r³öMœÆ°^à7{®Ñø4o¨Âÿ¿þ¬ýªüÇû7ûû=ûÏû¢ü…ýfþ%ÿ¼ÿ5{°ÏÚØ¼ƒ,¹ÿ-ÿ‚þÎýýiüÌû:û¹ú8ú£ùòø(øB÷Nö\õôçóÐósôàõø÷8ú:ü™ý;þRþ(þ(þžþ˜ÿëBi*‡‡>ÈGóû`ö¾UÎI é ´ ” j  7  S 8 ¿ 7Wësÿ"þûüü@û¶úyúyú¥úîú7ûrû¨ûÌûöû ü[ü™üÏüûüýýýÆü^ü×û)ûúïù‡ùGù0ù3ùGùOùUù>ùùÙø…ø%øè÷ øáø„ú»üÿt%O[¦vÊM·Í _ „ A ¬ ßEϨ»ó,[dY:&,PwŽ€BãdÇRœ§ŒOÿûý­üŒû¼ú\úpúéú«ûzü+ýžýÖýÖýÃý²ý¸ýÙý þGþnþvþGþßýJý”üÕûûpúçùnùíøUøœ÷ÆöîõõZôÐóóÜóÓô‹öÈø'û9ý¬þeÿsÿ8ÿÿvÿp×iÊÍ\Žo,Þ®¹ —<èê% 9 U   0 ï « # ? à ÿ ¯ )O“®ÿþ…ý–ü¹û÷úNúïùÐù÷ùNú±úûmû³ûæûüVü°üýýþUþvþ`þþtý¾üÿûVûÛú—ú‡ú’úšúú8úÈù6ù˜øû÷z÷÷ÿö^÷fø!ú=ü`þ!YŽï$ª(n ; ’ $ • ð^þð(q·È·z1⪖¤ÀθröS†•…UÊÿfþöüŽûZúqùíø·øÜø0ùùÍùÞù®ùWù ùçøùŠù*úãúƒûöû#üü­û7ûÇújú$úìù±ù]ùßø1øi÷¥öüõõ;õ-õmõ,öŽ÷|ùÁûâýŒÿš#Pƒ ö8†Ž.gS 廸åHÉ?™½½–fDcËn 5 Ò  Û  ða•¯Ò'·þ}ýoüŒûÍú>úÞùÈùúùpú û¨ûüPüVü=ü.ü=ü}üý¬ýkþÿÿÿ_ÿÖþþcý¤ü ü”ûEûûØú‡úúnùÅøø‹÷÷Éö‘ö”öùöû÷’ù€ûqý"ÿœ¤·údÔ ä A 2 Ö R Ã?ðí<½0 | y A Ùi ÎÑ?^PödŒx8Ù€2ìþ¤ýYüûú*ùø6ø øþ÷Ü÷–÷ ÷—ööÏõéõaö&÷øøø¦ùúúäù’ù>ùùáøßøßøÀø‚ø#ø­÷7÷àö³ö¶öâöE÷øIù$ûqý¿ÿÄ0ÐI#?( ´ ä Ó ¬ Š | Ë 0 «  N K  ¨ 5 Í • ¦ ý s Í Ê ] q gŠ™¼ÿ¸ý™ü°ûúúWúÖùsù>ùDùsùÅùúQú_úIú5ú2úbúØú†ûVü(ýÑý(þþ¯ýýMü­û=ûúúÍú®ú‡úNúáùGùøÑ÷#÷‘ö$öÍõ’õvõŒõö ÷µø£ú¢üžþj&Ñ&µ ô { ­ H ú  ® Ò  Y ƒ j  • ; ( G Ù ò ž øñ±]Ú¾¼ÿÈþÜýóüüCû‰úÛù(ùqø¤÷ÒöùõNõéôØô-õÊõŽöS÷ð÷Møfø6øâ÷€÷+÷÷÷÷)÷#÷ ÷âö¶ö”ö†ö”ö­öÌö÷¸÷ùôúXýÊÿù¯#Bn y : C  ÷  \ ¾ 4 µ  E  œ ë $ s ý Þ  é  Þ " ûlš©¸áÿDþëüÁûÒú úù*ùùAù˜ù úmú±ú³úú\ú>úZúÄúxûaü^ýGþìþ>ÿ*ÿ¿þþRý‘üöûŽûVû'ûéúsúÊùíøø÷Yö³õ;õìôÅôáôWõ2ö^÷Ãø8úÉûzý]ÿj˜¿Ÿ  ~ v A ú á h ÿ ¨ 4 } u & « ! ¼ « ÿ ~ ë / ) Á ý ç “&±I ð,kÿ·þäýùüãû¹úqùøÏö—õ’ôÈóGóó9ó˜óô›ôôôõõïô´ôpô5ôôôôWô©ôõmõÍõ!ö\ö†öŸö³öÏö#÷øÅù.üõþŸÖ¾ÀÀÓ á Ì j Ÿ ˆ S , , K } Á  M l M ×  @ k  O - Z º   Š #pˆ‘£ÿðýzüTûhú·ù-ùáø½øÑøù|ùòù_ú¶úñúûEû”ûü¾ü…ýOþÿŒÿÕÿÛÿ ÿ3ÿ¯þ"þ¬ýRýýÏürüàûûúûøÎ÷¾öØõ/õáôúôxõEö:÷(øíø’ù*úìú ü²ýÞÿ^ï< > Û  é ¿ ¶ á = ­ ÿ  ñ ‘ ' Ç « Ø V  É G q j F Û Bª;aÁ:¨ôÿÿþÏüTû´ùþ÷VöÊô…óˆòåñ‘ñ‹ñ¾ñò‹òâò ó óÑòqò ò§ñdñEñdñ¾ñXòóòó¹ôeõÕõö,ö!ööBöüöø ûþ!ÈÏ<J; C d € f ó õ À “ o ^ c … Ë  ð t Á  C ¨ Q 8 m £   5 D â'618qþðü³û«úºùêø.ø–÷+÷üö÷a÷Ú÷løûøyùõùjúñú{û ü¢ü6ý²ýþGþRþ%þßýtýýœü=üîû³ûmûúúLúZùJø+÷7öšõxõØõ­öÃ÷òøúù¶úû,û,ûdû ü“ý·ÿSˆq    Ê - k Ñ|n™Ù O Û W  ë ö ð ›Ü›Ù » Q Í R2šIï›ÝQŠþ¤ü¹úíøV÷ö÷ô-ô›ó>ó óêò×ò½òˆò(ò¢ñöðCð˜ïïÂî·îúî‡ï_ð^ñ[ò6óÖó%ô3ô ôäóõó£ô@öÙø üTÿ7y'}À ¥ J Âé”ØÊ’;Ó`p ¿’" ë Þ q " â|»”Ru„ÿÃý?üûúUù¡ø ø…÷ ÷ÚöÉöóöP÷ß÷øIùúÇúuûü™üýýóýDþyþþŠþhþ9þóý™ý9ýÉüPüÌû=ûšúáùùGø}÷ñöÆö÷ß÷áøúùîúŽûÄû‘û'ûÊúÕú€ûÚüäþHÅ ÑíW 3 ™Î x=\ÏŸ½ ¹ o ~‹€bÜ(  â »œ‹[Ïàv¯¢qþEü@ú‚ø÷ÏõÞôô˜ó9óõòÃòŽòUòòˆñîð,ð_ï£îî½íÀíî¬îhï5ðöð–ñòaò}òqòtòµò¦ó{õ9øgû›þ\$‰þÂ Ì õ ý—“ðÃ,KW‡ êTRø3 æ ¹ Å % ßßÅ‚ßÕsÎ_ÐþzýYüTûQúIù6ø7÷Vö¿õ‰õ¶õ=öööÑ÷¦øhù ú úû‰ûöûaüÏü4ý…ýÃýðýþþþ+þ;þLþLþ%þÎý?ý}ü¥û¹úäùGùù`ù'ú=û[üUýêýþ½ý4ý¸ü”üý%þØÿö3Nù U ME,;•`·Œã¡« Ì Âe{ùÒÊ<§ K I ± k f v ` í ªòöÚ´þœü«úøøˆ÷SöFõhô¯ó ó§ò.ò¥ññCðmïtî|í‘ìÌëVë:ëmëóë§ìní+î·îï;ïIïWï~ïãï¹ðMò«ô¤÷Íú¯ý ânëW / D]ÄH83A§Žðêß?‰ÞJ = Õ F   …\–èj'ÿþ ýÕû_ú©øâö5õäó óµòÙòió"ôáô~õüõ\ö°ö ÷z÷ø¦øcùúÄúNû¾ûüzüÔü<ý¸ýDþÙþQÿ|ÿLÿÈþþUý²üPüHüœüGý(þÞþTÿkÿ*ÿ£þ þ›ý…ýõýøþb˜òô{~ CZÜ‚‹±¸ d \¢S^Úüúq%3tÈá…ž ! 0 íš<üêþ ýQû±ù1øÁövõOôGóPòHñ/ðõîží,ì±êLé"èGçÌæ³æëælçè¦èéeé|éé‡é«éêìêVì]îãð£ó_öÖøû(ýZÿâæl/ Öö;{Çb ç|à†¾VNÃó/·º <  Ï a † L ÎHÛ–§­uçþþüàúÑø÷¢õÅônôŒôúô„õÿõNöjödöVöBöPö‰öóö…÷ø¤øùcù¦ùÞùúLú•úìúQû¥ûÁû”û,ûúéù]ùùDùÐù¥ú‰ûHü¾üèüßüÃüÃüý²ýÐþFèkWŒ_ô|* "qædrÀA ã … ý8dN¿RÜË£C¥Ók} 8 ÎsOa¿ÿUþýèû¼úùcø&÷ÛõpôøòoñãïOî×ìuëIêbéËè‡è|è¬èõèFééŠéWéé“èDè6èèkéÇêœì©î»ð¯ò„ôVöløôúþÄà N¯£vk´Fªû°¾L‚¥ú©É E è o ¥ ‡ + ÃrWy²âÌKZþü®ù€÷¥õOô‚ó6óRó¬óô~ôÊôõ2õQõsõ°õ$öÏö§÷Šø`ùú®ú/û­û)üÆüzýDþõþ~ÿ«ÿ|ÿÿfþÃý?ýýýUý¡ýËýºýiýûüŸü†üÚü²ýÿ¹} v;|žøÃ ÈÈÛëåÖË æ , ˆ Þ î_SÒTáêymrBzÔKå  èæ<úÿ"þ°üpûIúùÀ÷Bö®ôóVñ˜ïÙí ìvêÐèMçëåÛä'äÓãáãIäéä¼å‹æ1ç‹ç™çlçBç7ç‹ç]è¼é‰ë‹í‰ï\ñ ó®ô¨ö6ù¢ü÷ Û«‡@ðÎ8* ÿ ù!å"n#M#S"v _ÜŸÈ+°0Õ % V·}®ÿJþ1ýü¼úßøxö²óñð|îŽì5ëxêFê„êë¥ëBìÚìí-îéî¼ï³ðåñGóÅô4ö…÷¬ø±ù¥úû­üêýCÿ¨àÉJ]w¾~@*£ÿËþµý¤üëûÏûoüÑýÓÿ e7JƒñæÓ «ÛVäW ­  w2"$ëGø…ÆÚ#ø"Y:j Èˆ±° à wý•úè÷NõÃò5ð›íôê9èså¬âúßOÝÏÚŠØ­ÖQÕ{Ô8ÔyÔ$Õ#Öi×ÂØ ÚÛùÛ‹ÜÝ–ÝRÞeßèàËâýäUç±éìqî&ñhônøaý+ -„í=˜Q ¶!#±$Œ&z(A*p+Ï+*+˜)P'º$." U&,*ܹ_º V > d º‰ÿ?üvùåö±ôøò»ñãðNðØïhï÷î’îIîîîîLî·îOï ðØð™ñSòó¦óCôòô°õ}öd÷Dø ùžùòùúõùÊù·ùÊùújú¥ú„úòùùø7÷ ÷²÷;ùxûþ¥À"DUÄ»G%0æ‘Mi" o 0&÷a5F‰?"Ð ü!M"¨! Ë ÷ÝÎÕ  C–æ"þ,ûø£ô ñiíÅé4æÆâ{ßtÜÇÙ™×ëÕØÔQÔIÔ®ÔdÕ4Öײ×AØÂØIÙòÙÛÚÜiÝ÷ÞŽà&â¿ã‰åÀç±êžîžó|ùÇÿ÷u ò^ÞÃ…uÆj +#±%—'‚(P(è&ž$Ï!òmpþå×·S‡— Ö€"×uÙþÚüšúXøPö¹ô¯ó6óDó²óRôõ‰õödö»ö÷w÷ø÷·øºùæúü+ýþÂþFÿ ÿñÿC°2° ël¼ïÿ%ÿtþßýRý¢üšû$ú`øŽö õ>ôhôŒõœ÷Cúýnÿ ¥4ºþªýGý²ýÅþPü )é×{ ZâšV‘N*¤õÁˆÜL£Ú0•/ ðæ ~ÿëüWú½÷/õ½òjð9î ì$ê<èSæWä?â/àOÞÔÜÚÛrÛ¥ÛXÜ`ݘÞÐßÝàÉáâã|ãêã„äWåuæÆç%évê°ëöì±îHñõCúŒi0Ë óïI ¶!í#Ï&û)Ý,í. /È.”,f)Ê%,"áÞËÍ? ]  M£ÿ–ýùûpúˆøëõ¸ò2ïÉëíèîæëåæå¸æè|é—êCëuëjëKëKëšëlìÈí¨ïÆñÞóÍõ}÷þøpúèûýhÿƒ˜s¶?5 Ù×MÉî_ÿBý÷úù#øŠøIú ý‰ÑSŸ‹CTr4×[ôQ¶¼% ³8 ÞáqݯåîxIò¦\–Í V"¸"Ï!¬—íé¶} [OT=üþ÷¬ómïrëÎçäâá—ߤݻ۠ÙM×ÍÔ`ÒHÐÂÎøÍÎÍÎПÑÓÔÕ Ö6מØ2ÚüÛõÝà âäèå¸çÊégìÕïpôNú4yïàs ã!G$»'ã+0t35\6Ê5û3$1À-h*”'s%Ñ#u"!}ôí®”Þ” MBDþïùÊõSòñïÍî·î2ïÇïððï|î í¨ëvêæé'ê&ë“ì+î«ïùðùñºòUóýóáôöƒ÷òø!úØúìúyú¬ùÈøøÑ÷û÷qøáøûøXø÷õó–ñ ñÆñºóŸöáù×üìþáÿ´ÿÞþçýiýºýÞþ €áLž)¥ãÿ‰êÕæ VN $§)g‰L"ž$Œ&j'1' &;$"¦#|¢k¼‘ `Üþ£úèö¬óãðcîãë*éæ–âß‘ÛØEÖÍÔ*ÔIÔéÔÌÕ¸Ö–×>ØÎØIÙÓÙxÚKÛBÜ?Ý3ÞßÞßåàtâéä¡èÀíô\ûµy ìªÓÍFæD­7!$'^( (u&º#h üäoŒ ‘Ç£1 · ršDi½î¡þü6ùŽönô%óÜòóõåöµøúÛúûÒú_úúú¨úàûýpÿ,‹wR’äjÚY^Ä„À»Åÿþ×üôû@ûmú*ù^÷*õßò ñð=ð‘ñáó°önù‰ûŽülü_ûúùíøÅùmûqýAÿ/ôÿ£þÉü)ûšúŸû‡þ%âÓÜH²aæ"Èl>BOšé/©Ž“ôS y YÑñÿëûøŠôÁñÕï½î9îòí…í™ìÿêÈè1æ•ã[áÇßßßãßáoâŠãCä˜ä£ä•ä•ä¿äå{åÏåôåãåîåxæè@ë)ðÄö„þ‰É iü“¤}å{I L$¾'û)*|)ñ&q# +QðÏ©K È JtMŽÿ'¦þEü ùKõxñî‰ë!êúé÷êÉìáîÏð.òÙòßò^ò§ññîð”ñ ó/õ¤÷údücþµR&3  E ­ B $ Š ÌK2’0²“¨þ ûUø}öö÷Iùaü•ÿ+“ˆ95Oþ6ýcýÅþÿc-ÁÞ½Ãý¤üJý÷ÿqõ Š"6Ñ2Uvzt÷Œ¡EZ¯ ; ¶óÞþmú¶õôð^ìAèãä}âáNàñ߉ßÈÞˆÝÒÛÓÙç×oÖ³ÕèÕù֬عڻÜ]ÞxßàràÁà1áßáÙâäHå—æõç éóëbïCôúî¬ ü=ôû’ :!—!S"ß#_&´)d-Ê0M3©4Ó4Ô3Á1Å.I+ª'O$S!ºHÙYÂ.´w ¯ ÌÔ ÿüløáôÆñ_ïâíDíRí·í(îkînîîíÕëxêqé évé êSìIîHðòyó~ôQõö ÷]øÍù7ûoü4ýiýýzüÄû$û¹úhúúRù<ø¸ö õ|óòiòXó5õ½÷súÉüRþÐþtþ–ýÌü§ücýêþô®v´ª«ÿZþ>þ±ÿÀ4V Vp(‚ÂUƈø 7ní%Äã¤2–Òß £ [pÿ€ûÉ÷’ô òpðQïeîUíàëêÆçpåJã¤á¨àpàÝàµáµâ•ã-ähäbäFäAä_ääãäå$å,åmåHæ"èSëæï«õütþ# £©Ç¹$o½ÕAi¼Ò ‡ òmAÛŽ¦S m Ð ^ÒìR ø øˆwÄ„þüùl÷ÛõõõÄõëö+ø;ù÷ùLú-ú´ùùøøùúŒû4ýáþj­µ…IîÌ€âÔJEôˆ7çþ–ýèûýù øjömõTõ,öÉ÷Þùü¬ý‚þcþfýüûÄú@ú¿ú,ü3þYüª&‰Dþæû ú8ùÓù üÂÿe( J @Ú.”v`Èò´¼Á‹øöfSÐø ã „ ÕÓ«‹ýŒúå÷ÕõôRôÅô”õEöuöÝõnô6ò˜ïêì±êAé¬èíè¹éÍêàë¤ìùìÜìwìåëEëêÖéøè(è™ç–çqèê0îXóºù¢1¥ ef߀ .^«À õ÷ ¢!à ÎÄ9û Y  ùò Sýÿ0ÿêþÿvÿ¨ÿLÿþÉûÑøxõGò¦ïòíií î’ïŽñ‡ó*õ:ö¾öÆö‰ö:ö:öÄöøÛù#ü›þ OCåG• ñ g ß "F;%ð ¼ ‰ ; –m¡eÿü3ù+÷röùö˜øÛú#ýÞþ’ÿÿýšûÓùíø>ùÊúBýwõ>U”kÿýHüVüçýéÐê} ‰àWeyõ û R¬Àc‹ / Z 1î·™nÿýNúM÷ ô¢ð9í-êÜç‹æ@æ°æ‚çOèÙèõèŠè²çµæëå«å4æ‚çkéªëêíØï=ñ òaòqòaò?ò òÆñ‹ñzñÃñ¯ò’ô¯÷ü§Æà êÇúÖX"¦$i Æ"Ù$ô%Õ%‡$1"I&{L}éZº  ‡ A fþß»: EÙýúaö%ó¾ð]ïõîIïúï”ðÌð\ðFï²íîëTêOéé·é)ë%íbï‹ñwóõKöf÷…ø¿ù$ûŸü þ>ÿps*¿ÿCÿÂþ"þXýMüûáùßøRøUøøø'ú­û9ý‡þAÿWÿáþ9þ¸ý¸ýnþÕÿ»Àx{ÁNQâ&4X†`~ cÇwUtX̃x†‘}2‰kÜ  %'ù¹ÿXýÂú øbõóxñŒð8ð\ð«ðôðîðjðeïî“ìuëìêëåëRíï¨ððñµòõòÜò}òòƒññëðñÃñþòÛôa÷{úþ¥ò–Z > m W _ é  ó /oIk Ö3é>ƒ  )³˜¯å?׵뎊´¶)ئ»Wµý5û0ùö÷œ÷øùúæú2ûÞúáùnøÚö„õÂô®ôQõ€öø®ùHû¢ü¸ý˜þ]ÿ$üâÀ‚6ÀA²)—æÿäýÏüèûTû,û{û)üýþÜþIÿZÿ'ÿáþÓþ%ÿãÿEXûòM+¾Wÿ3þ™ýÑýìþà[ôR8 s ÿ æ V   õ  > "  - % õ‚¾¾š` Ìgòþiý»ûúnø?÷†öYö‰öåöH÷w÷M÷»öÇõ›ôyóœò6òXòðòäóæôÁõ@öVöö õõZô¯ó"óâòóïó~õÔ÷ÒúRþ‚š ­ Ò \ ¹ m Â Ò } k&Hw¥Þ[ b Y˜r÷Oÿ›þÑýýBü­ûrû¢ûKüDý+þºþ¦þóý»ü!ûkùè÷ööÒöˆ÷Ùøpúü?ýûýþªýëü=üîû.üýUþýÿÄ‚K[^k • Ê å Ñ R]Î Ñ † $ Ô“QúyÄìÿþoü)ûpú2úeúÄú$ûNû,ûÄúFúäùäùsú‰ûý£þV=8ÿJþÀýâýáþ®®ì _ ý "  l àÏ¥H•†áÿLþÃü@û±ù øEö`ô[ò{ðéîðí¡ííí›îyïQðãð ñÚðbðéïÂïð ñŽò~ô‘ö‚øú!ûÏûEü¾üXý+þ-ÿ_¥ç'K“" æ à |Þ¶ü¿8·|©8ù­ÉÊà $ œsÓ爋ª¸Ž&†Ì2ãÿéÿ$ƒ¼¢ÿ¡ýüvúAù˜øtø¬ø ù`ùeùûøøÿöØõ õ¹ôõÕõ ÷iø®ù¥ú@û‰û³ûèûYü ýøýúþæÿ†¶xÛÿÿfþßý–ýýµýûý9þcþnþnþkþþ´þÿhÿÕÿ2‰Ø:ÉŽ˜Ö? R¿Dö+Î6ù© Ç 2 Õ Ð tÛÅÈ÷! ¦ç߸~Wÿ6þ(ý üÇúUù»÷ö ô|óÃò}òœòó‡óõóôýó£ó9óðòðòqó`ô³õE÷Öø5úTû1üðü“ý;þêþ¦ÿb Ÿö)S“ ÈÂÒãÑ|ß  9 U G tun¸&ìÿ*ÿìþ'ÿ«ÿQÏ÷ÿZÿeÿ·ÿ@Ç)BæCeÿ‚þÎýXý<ýRýýºýºýý ý†üÿû¢ûƒû¹û7üðü½ý‚þÿÿÅÿïÿ@s ¾°_ÇÿýþþPý¸üiügü­üý¡ý%þ„þ¿þÖþÞþòþÿkÿãÿ†:Ñ¡s;üŸH)¨ÍDîÒ,¥° e„÷2äXÄsÿyþóýÖýþUþ¡þÖþçþÅþvþþýiý»üùûû8ú;ùUø‹÷÷¸ö¾ö÷l÷í÷]ø½øïø ùù;ùyùáù~ú@ûüèü¬ýZþÿ¹ÿ~@åt»»z ƒÒæP ç·]ÂéÞÅ©´ÍáÊ|ê 1=T˜ÿÿäþÍþÍþ½þ“þGþõý™ýRýBýzýøý¡þWÿñÿYp,ÕÿšÿŠÿ«ÿ÷ÿW®ëüæ®m='8_—ÊE—¤wq~m rP»Ï®“§µ°×þ¢@bÿvþªýýÃü²üèüJýÑývþ%ÿÛÿ=Á »5;ÿDþ‹ý(ýMýõýÿ\¥Éþ³3ÿÆý”üÁûNû$û'û=û@ûû¼úCú´ùù‚øè÷B÷‘öØõõkôÙó˜óžóúó•ôTõöÔö€÷øÅø¬ùãú€üqþ”ÆÓ”ù  e ý ¥ E ß E c € m G R¤Va¢ùög€b61rÌ!bÿ|þý¤üÚûNûûHûÉûˆüMýþtþ¡þþRþþþ;þºþsÿ=éYƒPægýÿÂÿÇÿýÿHŒ°C¼ÿ"ÿþþÎýžýcýý¾ü^üüèûü–üwý„þ•ÿgÕ¼*;ÿ+þDý»ü°ü ýõýÿôŸü)&Jª9ò£Wÿ— ¤ –í"  ¯Òy+Y:gYîÂþ&ýgûÂù]øM÷™ö7ööööö ööüõö/öNöYö:öñõ{õéô`ôýóÞó ôpôõ«õNöñöœ÷føùûóüIÿÒ]»Å{ ã ü å ¦D·òá|ÅË Ÿ b A k ûòI Í 8 m ; ˜ … ’ý€#ÕÿžþcýMüTûmú´ù"ùÓø²øÎøøø"ùGùZùeùnùùéùŒúxû¢üÖýúþôÿ¨=2!4uÄ^zi&¾Pàx yÿ±þÀý²ü¨ûÍúIú@ú¼úšû¾üÑý·þ%ÿÿŠþ¸ý×ü:üüEüåüºý“þIÿÕÿ8†î†dŠáEˆ v   È {  Œ ù ) ÿ u ‡ ?å•n‚ßo#ÔoÌÛÿ˜þ ýKûsù¡÷æõ`ôóòVñÏðuðNðTð‰ðÚð:ñ¢ñóñ6ò[òqò}ò“òÆò%ó¦óCôïôõBöëö§÷¡ø÷ù¾ûðýeð\‹` ï ? w ¬ÊÄjªg«|r ÷  ðz`|¡%M!±3Ä ÿõþnþóýoýÚü7üšû)ûãúãú/û­ûKüíü}ýóýUþ¦þòþWÿÐÿp&î¡?¬äá²cÉ“zfU<µH¾,„ÿÂþÈýŸüQûýùÎøö÷¡÷â÷µøú—û(ývþQÿ£ÿ~ÿõþcþêýÈýþþÿeÿ~ÿOÿøþºþËþTÿbÝ‚'³¨2 æ8à ·å¢–. *ÿøþ|þðýBýgürûmúhùlø}÷Žö¢õ¼ôçó"ó‚òòò<òÆò‡óeô5õéõmö¶öÁö¢öuö\örö°ö ÷§÷.ø¦øù˜ùQúmûý>ÿóìí¨ ð ²ï¿SÏ:‹™S—søX Ò š ì Å  Ä  , Ï é ‡ ×îUÕ ÿ“þ‹ýdüû¦ùGø)÷oö)öSöÒöw÷øøßøù8ù|ùìù•ú~û”üÃýêþôÿÇjâBœ±8„†;«ò3oÁ =0ÿÙý?üŒúùê÷w÷Ô÷äøvú7üËýìþhÿOÿ½þíý6ýÏü¾üóüMý‹ýwýý‹ü)üMü4ýçþBçrt¬ ¬ þ^(|W p K z  ú • Á·wÔëÿóý7üpú¦øóöTõÓócòüð£ïcîXí­ìaì…ìûì²íîLï÷ï~ðæð=ñ‘ñöñiòõò•óAôòôõEöèö‘÷?øùú¥ûõý•D° •Ïw²¦yQN"­&·•í Ë ø Uyû  Õ k ø¢‘¼ `aLÿoýŸûúõø<øè÷Ú÷ó÷ø øø(øløËøIùÞùúCûèûƒüþü[ýµýþyþòþ„ÿ$Ê^Éð×€ùW¦ÿìþ+þfýzüpû;úïøÀ÷×öaöƒö.÷Rø·ù'û[ü1ý–ý¡ýtýBý#ý4ýoý¸ýêýêý§ýGýýýÎý'ÿfà+ p : ¢ ß + µ kFh©`Á  M^¥ s¼ÙÙÒÌÇÿÅþ¯ýuüûŠùÚ÷ÿõôUòÊð‡ï›î îÎíÖíîqîËîïOïkïŒï¹ï ðšð^ñEò9ó0ô!õöâö½÷²øú×ûZþd±å« ß cZì\Á/ùs©´² ­ Ç  Œ - Í U ½óùÕ¦wo™ãQ¿ÿ'ÿkþ–ýªüÇûÿú{úQú~úûÉûªüýLþêþTÿšÿÛÿ$”!¸SåU¡ÎÙÖÑÙû>F0ßOŽ™|ÿvþlýYü,ûäù…ø7÷$öõgõÛõÝö<ø¿ù,ûBüßüûü»ü=üÏûŽûûëû[üÀüþüûü×ü­ü»ü4ý0þÂÿÏ@L é  é ¿ È ' Û ¨ E } 4 u m L .._¥ôF`SÿíýEü¹úeùiøª÷&÷­ö,ö†õ±ô½óÙòòœñzñ­ñò–ò óXóqóRó"óøòõò%ó‡óô·ôgõ&öùöð÷DùûžýÄb « ¦Õ&½Ú½‹VÆYÒK¹*ž%¬ # u ¥ ¼ º ™a!ìÈ»Æàÿþëüšû2úÅø}÷‘ö ööjö1÷(ø(ùòù„úÛúû!ûYûÇûwülýþ´ÿ¹‘1­ºb o†5|J 8ÿDþý°ûúøS÷Ÿö”ö7÷tøú—ûÔüýtýÑüèûû‡úú'û#üRýOþìþ ÿÓþþZþ¦þ«ÿgº_ð u + S  Ï ¥ µ ü J o ? µ Ú Õ ¿ ¯¾ÒéØÏšÿöüú)÷sô4òŒð‡ïïÈî îRîÅíí.ìrëüêàê$ëÁë–ì‚íkîIïðæðÁñ¯ò²óÅôëõ÷+ø>ùCúNûwüþý5+Ýé õ…N  .ÚB†Âçþ)28R• µ t G  à \ Ê ; f ›ÔHjk3»ñÿõýñûú¤øŸ÷÷÷1÷l÷ˆ÷i÷÷—ö ö¥õxõ³õHö.÷(ø ù·ùú;úFúQúsúÒú_û ü¾üJý‹ýoýùü?übû’úÞùIùÀø1ø‹÷Ôö,ö¹õ°õ$ö÷tøúÌûJý]þÖþÙþ›þkþþÿ^ž–ïJi™= ˜£ë ¼ É + ü r Ì K  = g ” ¢ ¶ Ò ù / d z N Ê Þ Š Üú )sïþ¯ý”ü‰ûjúùƒ÷¿õÓóëñ,ð·î¯í íÆì¾ìÉìÔì×ìÌìÆìÔìöì9ííõíRî®î"ï¿ï»ðJòvô?÷yúßýç–] - H ¥ 0´æªë°@Zw™ É ù $ F U J7)@‡øŠt¥”Lÿðý¢ü†û¹úWúFú{úãúdûëûYü¤üÑüýDý¬ýOþ%ÿ ó¯9›Ó;ÍQj/±äÔª†|ÿ›þËýýü ûÞù½øÑ÷P÷<÷Ž÷+øäø•ù ú2úúÙù®ùÙùpú‰ûâü;þLÿÍÿ ÿÜþ¬ýuü~ûû@û,üÜýúÿ^xÆÜßÑÜ  ì T ¦ ¦ ‡ Q ò y Ëâª%ü½þˆü—ú ùð÷V÷÷÷Úöaö„õIôÆò/ñ¿ïºîOîî8ïHðzñòwóô|ôÍôõ‰õöÔö¡÷‚øcùLúpûíüÓþ¤5›¶ l Î ø-‰©æ4è/ûí:js6§ Ç ¤_"1ÄÞÿhÿ0ÿòþþÜýÌürûúµø»÷4÷÷d÷å÷“ø>ùÊù$úIúTúhú úû¥ûuütý|þyÿKØ=l”¸ùXÔXÅçÂD…¢¶ÂÿáþþýüîúÍùËø ø‘÷l÷‹÷Ü÷]øùÍùÂúèûGýçþ®‚8’m°j¼áˆUyï•_)èoÌþ194íªSîƒ)ã«ZÐõÃ)0ÿ×üFú§÷/õó?ñúï>ïï$ïpï¼ïÕï¨ïLïÈî0î¬ífí|íîïîðdñ§òÐóÛôÊõªöœ÷˜ø•ùŒúbû üˆüëüDý½ýqþŒÿ  h Ä q ýiÂèÖv¼§7‚¯Îܸaª”-tŒ|XC[ª k ¸æýöÛÿ¸ý³ûÛù?øàö¹õØô;ôËónóûò^ò”ñ¨ð¶ïÙî(îÃí²íûíqî÷îeï¼ïñïð8ðdð¾ðEñöñÃòó"ô•ôìô-õ{õØõYöóöœ÷%ø|øˆøOøó÷…÷.÷ÿö#÷²÷Åø_úiüÈþYäKUï ô x ‘ _  Ä š Ä ñ  ô ¼ Z y ï ¾ þ ¦{SøQpEâP¡äÎ+#¼ðÔZœ £ Œk= ý2úƒ÷õÔò¾ðÂîßì ëFéˆçñå˜ä›ãããGãËãyä'åÇåSæÒæUçêç“è3é¿éCê®êëuëöë»ìøíÛïòëõõùkþaH wØrfß`¼8±úb3oIê { % W X§sôÿÿOÿCÿkÿÂÿ5°:ÝŽMïb£«›h0>|£•I´Ü¸jÿÔýÃüàû2û—úú’ù ùøøª÷}÷l÷a÷:÷àö4ö@õô™òPñVðð¾ð“òŒõnùâý^m© Ø â ß  ¶ Z <œ}ÌD™›%H'ïÖóXóùà™:éÄãHè²tòøkiÿQÿ‹ýÕû\úAùø6ø øAøøÎøùRùù ùÅùÞùäùÅù•ùqùnù’ùìùjúû¥û ü[ü=ü×û!û'úòøŸ÷@öéô¯óŽòŽñ»ð@ðmð‹ñäó€÷Büµg¾ NÓ?ªR‡¬¦”‘^‹ÝKäæ–-à Ö5KŠþ×ü=ûÖù¯øÌ÷1÷Ýöœö\öÿõŒõõÇôôôŠôÂô õjõÛõNöÉöB÷²÷þ÷.ø6ø1øDøfø›øõøhùú¶ú{û4üÔüaýäýkþÿáÿà+k– Óÿ+ýZúå÷Eöéõ÷ºù–ý ª¨ – 0e[d  âKšÄŸÎí© Û „ Ë×ÚôNòк‚»¯êJ½ûÅçP ÿVüUù@öUóÌðáî™íèì­ìÔì9íºí0î‚îžî˜îkî(îÖízí?íUíÓíÂî ð¢ñ]ó õ™ö×÷Üøºù{ú'û³ûü7üüŸû±úZùÎ÷mö¶õ7öwø²ü×A 4Þ¥ *&8*Æ,â-É-Á,T+Ð)(»'\'4'ÿ&x&b%À#†!©öd¤ þ«Õªý@û˜ù–øøÃ÷Ã÷í÷øû÷¤÷÷,öõÞó[ò¥ðÓîí¥ë£êêýéêêÖé(éèÁæKåÞãâ…áèàÄà&áþá+ãŒäÿålçËèê5ëVìzí îÄïæðëñµò9ókóUó3ó]óCô/öDùlýPzu àhà^ 33UÂ~xuM×.R¡’õ ÍýŸÇÂè~«s«ƒ”Ó¨ø  ÚsýLúf÷÷ôó»ñ°ðÂïÈî¡íMìÍêéXç¥å$äãiâXâ¯âRãäÂäKååååWå5å'å åÞä|äÛãðâßáîàƒà)áUãaçBí•ô‘üF 8ÎÞÏ SƤäK‹<&ƒ£ÔL  y ëY·%èKrr'XI ­ a g Ø Û ¯ i?YÊ„~ ’;q9œ¼ÿ²ýšû’ù²÷öÓôÓóóoòíñƒñ#ñÇð_ðïïvïï£îeîUînî˜î·îžî9î²íJíní˜îñòô÷ù¦ÿTk t,zª7/jü­ío/nf Q t ß­Çïòª’ÿAþPýÝüÚüRýþÿÕÿ\”{hÿvþBýüûØú úÅùúû‹ü3þ¼ÿÒH '´þÚüæúùµ÷Éö\öKöaöƒöƒöEöÊõ õôøòÑñ—ðCïÑí,ìWêXèdæ´äºãÓãå é|îsõ9ýá¶ 42ÔR'áÒE(N!#Q%&¼&Ø%Ü#÷ Scæ ”“ÖþTû.ø†õ…óò^ñ1ñŽñ?òóáó„ôòôõ õ¿ô]ôô%ô ôõ÷ÜøÇúƒüÎýyþŠþ9þÀýRýýëüýiýþËþ¹ÿÕc´Ï†¶=AÝ þûâ÷«ôxñ|î ì±êÏêÉì‰ðõVûæ«"  ~ ´ 9 Éî^± – vªÅ¤lx‘ R °ÌrKî$û§2Íÿvþ^ýlü{ûQúÀøÏöŒô ò]ï™ìúéÙçYæå¥åjæÜç¼éÄë§íFï«ðèñ óOôõ¾öøùàú7üoý‡þ‡ÿg!¥îü­æŒÿ§ýCûŠøõ¤òæïÎí¾ì6í¦ïOôû%‘ [ÞÓ "Ô#"$‹#€"š!C!¹!##Q%Ý'*{++ *'Ñ"€ƒo ­sb0ÿcþºýþü üìúÅùµøâ÷J÷÷÷z÷Ü÷Ú÷)÷ÄõÜóµñšï·í7ì&ë\ê é´è…ç&æ®äGãóáåà,àÛßæß=àÇà}áMâ0ãäåæEç´è_ê&ìðíŒïÝð¾ñòðñoñàððñÑò÷õyúãÿ ¿^Ê/É f0¦Ì‡Ž"s%ð'Þ)$+Ï+Û+Q+L*ð(g'Â%Ö#Ž!ÙÕ§\´« øÄú¬²ð//£þŽüúH÷´ôòñYð\ðèðÌñºòŠóôhôOôáó%óBòPñ\ð~ïºîîí íÎì“ìrìaìEìÿëVë@ê´è³æAä–áÞÞXÜbÚ`٣ٗÛsß5å‘ìÅôðü´ ‹ ÖÚÆD€JY>Ÿ!#B#?" 1Þ‰Š3ç  u   1 à – y0kó P O .9—"ÿÃýwü=ûúù ø4÷@öFõZô¡óóÔòÃòðò]ó ôæôÛõÝöÎ÷ºø‡ù5ú±úÿú!ûûÄúúþø“÷éõøóÆñhïí7ë/êhê ìLï¡óølý”Š/¢2‰î9  øu+í¯µB˜þ ° Ý { T  ~  Dú2ȱÐÞ£ý߃þUý–ürüóüóýAÿŸ<1{5£þý³û£úÐù;ùÑøqøøˆ÷Ôöÿõõ3ôRótòŽñð¦ïîUíì¼êécèaçuæ®åTå¥åçÖéGî>ô,ûEµê ¨õ\p¶ŒûäëÀï%( ûNY… - ƒáG‰¡þÀü'ûäùù·ø²øÃøºø…øøl÷¨öÝõ*õ©ôôáôšõŸö×÷6ù‰ú¾û°üiýõýŠþ5ÿE·_)í~ Ï °  Ñ Ý ; ~»ìÿ(ýyúß÷/õPò"ïÌë¯è:ææäåç¥ê’ï$õyúÓþÌcÜÎÖ„,Î ¦è&¾Y6ñ£… « ú 6Cª_ÿaý¾û’úÈùù?ø ÷mõqó)ñ£îöëqéXçùåeå³åÔæ©è÷êlí¶ï¥ñ0óhôsõröŽ÷äø{úVücþƒ™=É - ñ C  O òÐlâýÚû÷ùOøÿöEö€öê÷£ú‚þ°æ >gV)ïËy%y€½ó2w-¾ È ™S¹„vhIúý=«  •ØþÛúa÷ ô ñ˜îÉìœëôê{êäéêè‹çæå-äµâ²á=álá6âã:å#çéúêßì¦îYðßñ6óFôõ¹õ,örö‘ö™ö{ö=öØõgõõ2õüõ²÷Qú¯ý{@¤_ X žhÆ01†·V! #§#J#4"¿ >êÚ†æÓ+à%=X ® UaÊfüxÅþþü=û’ùøÒöæõ\õ@õvõéõjöèö1÷?÷÷åö°öŽöröPö/ööãõ¿õ‰õIõõìô¹ôeôÞó%óEòBñ$ðïî¯ízìdëWê6éóç¢æŒå å‰å<çIêŠî¯óù9þw¥À ý ÷ Y Xîä¶Œy:'X,×?#-seÓÙœ:ÊXÝ T ¿ Î2Rþ_û…øÕõwó€ñð*ï¬îhî;î"î-îqîúîÊïñðiò%ô öí÷®ù@û§üíýÿ÷§ JaNäþ(ýûÅø:ö©óHñ_ï;î îïñô}÷Òú™ýsÿ8' ÿ>ÿpÿˆ8(ì  yÓ& 4 ƒ /   Ð L • ºëEñöB§þ.1ß‹~ÍDXPENpÿ½þþ¤ý?ýÝüYü¥û«únù øÆöšõ®ôôÖóËóáóáóÀó|ó"ó¸òMòèñ†ñ&ñ»ð$ð_ï‡îÖí“íîkïëñvõÖù‚þâxê  q ž6Ë Á =Ïfàe<¼ W ^‰xŒxTftŸÚØæ¾=Tÿ þiüšúÖøX÷xöHöÁöÆ÷ù„ú¹ûŽüùü&ýUýçýÿÄ ¼, G ›%ò6 Ú Œ > íxŽbÈýôúø÷Êôzñ-î ëMèEæ*åK廿néí4ñ2õøÇúüuü™üùüþïÿ¤ìL S ¡jòÅG Ú Ò O "  ´  þª=çÙ1ÏuãôÿžþèüØúø öÈóüñÕðHð@ð°ð€ñqò]óôÇôsõBöJ÷‚øáùgûýÅþbÏ;FH<+ ä ‡ ï ï    0 ö\q[KZþÆü¥û ûôúEû×ûuüöü9ý&ýÏü^üüûÝû&üÝüêý-ÿŒÝ ï› b¹2×µ¬¬ £ p  Y o P  ¢  I A ëED×ÿ1ü]ùÄö|ôªòHñYð±ï$ï‡îçíDí¾ìdìPì“ì6í>î£ï,ñÑòhôôõl÷Îøú\ûœüÜýÿÄUÃûΙ[#þü)–9ôà°H¤Ôð Gž  h ÿ j ƒ K Ê  ` º9ëÃÃÎÃŽ€ÄR²rÌ÷ìÿžþ9ýÕû ú´ùùßøäøù6ù8ù(ùòø¯øiø9ø+øUøµø6ù¼ù*ú{ú®úÍúÕúØúæúû5û\ûrûdû@ûúú¥ú@úòùÂù¿ùéù;ú®ú$û¢ûü‹üý…ý"þáþÂÿ°§€?ÖD¿æI¥¸r6û¯ A ± ÷  ï ¶ Œ _ 8  Û t Üã†ò1_“þÝüKûéù½øÎ÷÷ŸöNö/ö4ödö»ö)÷­÷?øßøù!ú¿úTûùû”ü?ýçýþÿ ÿýÿ22¿ÿkÿÿÐþ±þ¯þ±þ£þ`þÎýðüÄûvú%ù øH÷÷r÷Xø’ùéú,ü9ýþ‡þòþnÿE›ô:EÀò-  ‡ ì , $ Ê  + )Nç3tŸsÿAþ ýñûÿú>ú·ùqùcùsù©ùõùWúÂú)û€û¶ûÝûãûàûÕûÏûæû ü€üý›ý9þÍþ>ÿ’ÿ¿ÿÕÿáÿúÿFW,«ÿÐþ¤ýSüñúÖù"ùùžùúÝû ýßý9þ þ…ýÑüEüürü[ý¬þ=Ï.*¼ï2š=â– " ÙUÃEóÌÄɾ†ô¬jÅþ?ýãûÂúÊùûø6ø€÷îöŽöxö¶ö<÷ö÷Èø•ùFúÍú/û†ûùû¢üˆý´þ }ß±,—ÿ[…:Y´E3ÿÚûžøöTôËóWô¥õE÷µø’ù®ù ùø÷åöBöNö)÷Ëøüúfý±ÿ‘Î|·5ñ­ƒÕ³¥°Žf ( ¤…ã gÿ"þÀýÀýûý>þ‡þ¿þìþÿòþÂþ„þ-þ¬ýý4üVûúÖùyùvùéùÇúùûRý©þãÿüø«ýºÎ#ÓÿýFúÉ÷öõõ¶õ¸ö­÷3ø ød÷=öïôÖóRóó~ô2öføÒúýøþ@­S"0hªÎ©" A A O ˜ ' ÷  4 J8²z Ä ´ ‘"6Üâ +0 ­=H]ÿqþ›ýÔü.üÄû¨ûÚûaü.ýJþ‡ÿÌ-IaB°SÛ ìþÅùFô*ï)ë·èóç·è”êèìòî,ðNðsïûírìuëxëÑìïó%øèü4›îDêD © ; ú ¨   ¶  e ï ç Z K ƒ Ë ½ýX° 2 äà‡þ ý¾üDýfþÅÿ)Îí‹»¨pÿ;þý&ürû:ûƒû^ü¸ý„ÿ™ÀÍŽþ   Ë ‹  "þÂúcø:÷ ÷ª÷JøwøÎ÷$ö•ópð#íêÔçŽæzæˆç˜é?ìï‘ñyó«ôTõÁõ,öÚöÚ÷-ùÇú†üJþ$ TÌk  º/OÞ®—¬ ÷¬ƒ Ø Þ ¦ õ y æ ô h ¢ZÉNþ4ü¶ú©ù ùáøù¿ù£úÌûýnþ´ÿæ%Lh@¶Ž³}nþ:ûXø,öìô’ôØôpõ öSö@öÒõTõõ!õîõr÷¦ùaüQÿL¹Cjk9Ý86þÌû ùöcóBñðôïØð‹òÂô÷AùæúæûEüKü4ü[üþüLþWS½ þ Û¤nyáÎd´Ë Á ¯ Üo†5s)§[Ñ1‰ÍÂO/tþHûøCõ>ó9ò òÆòÅó¼ô\õNõ˜ô`óóñ»ð,ðŒð ò˜ôè÷¥ûIÿi´­ÉÉÝ JzzHë†QuZ { F Y y zQE¸ü(øôèðÛîî0î-ïðíñ+ó ôhôLôÞó`óó.óÀóÅôKöXøîúþ°’„ ? {õ2ã&üY$) E×wüÃ÷%ô¸ñgðéïØïéï´ï-ïUîií²ì“ìMí0ïEòdö û¦ÿ›†Døäw ̾Ƹ…1ñåE.´ ¥ Ü ª¡“‰ B ¿ “HNóÑ…¯ƒîJýù³õò´î¥ëõè׿jåÕä_åçØé|í‹ñ¥õùöüµ:ø* ‡ ì Xñ YþýSügûûéú£úäùnøVöÀóôðRî.ìãêêNëÑìäîKñ´óùõè÷‡ùûƒüþÅÿlþqÁ^ ! žSøVB›FF›w®„ÀcwÑ6cMù=%à EÀp"þüû>úù¯øùõùûü²ü»ü=üCûÊùâ÷†õÑòãïùìQê.è§æÊå~åÇåƒæ“çÂèééÁêEë€ëšëÕëzìÑí÷ïíò€öúþ¼añŽ„tÄÿtýü$ûÍúKûŸü½þa*ÁÙA ý $ æ ‰ L _ ñ ü } >÷V#<‘)D ® RE¢ÿËý¸üöû”û¢ûSü²ýÇÿ[/þ‰ ° [÷i ý ôþnÿMý†ûúø.÷°õ ô(ò/ðIî¡ìYë”ê\ê«êoëuì™íÅîìï#ñòúóõ ÷tøsùúúäùùvùÐùÞú–üÍþ/` QmÐv„/œ3 Ä  â M X & Ú ‘ = æ _ š „ Y‡ÆPb'¨×…prW ì  a è š |¿ª•ÿåüÛúùßø¡ø¦ø¯ø›øGøµ÷ ÷rööôõBöëöø÷UùÕú4ü+ýˆý4ýHüÇúáø»önô(òðOîíì.ì ì¸ìîð–òNõ øúÚüÍþƒ¤hg’ Ø *à#À©ßƒÅÑ Ê Ù (­\%Ë^ÓÿLþÔü‰û£úFú£úÕûÀý/팾% ‡ ˱ ÿ–ý4ü~ûNûxû­û¶û{ûôú;úWù‚øÎ÷ˆ÷²÷Gø-ù;úbû”üÆýúþ*V‚·©2$`ö‰Tÿ£þþ ÿÛÿ¨ g5ÿžý×û0úáø øÀ÷ø÷¦ø·ùñú,ü4ýíýUþvþ]þ6þþþLþ›þúþnÿìÿjÌ ),:€RèÈ b g °  Œ Dmi’ÿMý¾ûúúæúTû ü»ü<ýwýiý4ýðüÆüðüoýLþsÿÒ&UIá$Û¤3ÔzŽÎMïÊÏåëÀ] · Û Í • 0 ží.jš¼È–8ÿóüpúÜ÷bõ9ójñðFïÙî´îºî´î˜îqî>î6îîWïôð|óÌö³ú±þ4¼üÛhAÿrüúløt÷&÷P÷»÷9ø©øíøùùùõøçøïø0ù±ùvú†ûÑüGþØÿjöqìƒ+ æ Ÿ Oïƒ „ôaªêBM+½ï²ùÁv<1M‘ÂÅzÔÊf ¼ ð/wÍÿýIúf÷~ôƒñyîgë`èšåRã²áÕàÇàoá¡âïã å«åÊåeåä£ã¡â²áá³àÉà?áþá ãLäŒå»æËç´è•é êóëµíýïÀòéõùöû+þ®ÿÁÔ9u Æ ùJM30Ci¯¿®aÆö ëÌ”E¾áºM«äþÿòÆ y þ5&úþàûù‘ö˜ôó ò/ñŒð!ð!ðÕðqòæô×÷Çú9ýÖþ‡ÿIÿtþPý&ü'ûZú˜ùçøJø¯÷&÷‰öØõõyôêóZóœò°ñ”ð>ïÖí}ì~ëë‰ëÚìéîjñ"ô×ökù°ûªýkÿ§]$ÌD v V  ˆ  … ˜ >3ç]µ  r Ï *  厊¨nÿ]þqýÃüEüèû¥ûHûÂú÷ùùø÷Söëõîõ\öE÷øú€û§üPýiýýHü”ûüú«ú«úñújûüû†üýqýßý;þ‚þ¯þÈþÈþ˜þþ?ýüšúùo÷Ýõnô.óaò4òËò]ôñöhú‡þøE! G¥:#“Èþ6‡ÞÍ( ”ÅÀ — ] Øœb+þÒûnù÷ ô<òÒïtí@ëTéÎçªææå~åmåÁåNæ çRè*êÎì_ð˜ô"ù}ý@>\Ñ C Õ É ïøpYšHpc? ÇWË  W `ah¡˜ÿþzü’ú<øpõ.ò›îôêˆç£äqâùà7à@àëàâãeå…çÞéaìýî§ñ]ô+÷ú ý+79 ‡¨f·ŠÙ‚öÞa £ èQç¹Èþýæû\û¨ûÚüÖþ€’­ Á R-ŠyÛvE­å¤¹>Æ ~ ˜ "  ø á ž þóriºýHûÜø‹öbôaò‰ðéîˆírìŸëë’ê*ê¿é-écèiçPæ=åsää>äåaæ.è;êSì9î¿ïÕðjñ‘ñ}ñdñañ™ñòâò ô†õd÷vù­ûËýÿöž²¦ÿÌÈ Ç ˆ Ù«úä‡"ê£ÄP>Vw|Eªˆ¦íxWÌ7y ã L PßâB½A • ¯ |  ^ˆ—¨ÞAÈDí< Qÿýpú²÷õ¬òð¿î?í ìëWêáé¹éÞéZê2ëEìtí˜î‰ï,ðrðbððÄï{ïZïvïØï‰ðŸñ0óCõ­÷_ú&ýÐÿÙý~$ “™èô£ÿþoü÷úÛù-ùùù¨úwüÈþ}Z<é ? nNÍ Ò”NïRkU ! ñ á lèð#`žêW ï  ¼ ª l Ñ ² å u ` Úøæºý’ú}÷ôÔñïžíMì‘ëjëÌë°ìîñï4òÅôƒ÷ú^üþýêþýþ`þ ýšûõùø…÷1÷ª÷Ñø„úƒü“þ{þþ] MÿpÿÔý^ü@û’úZúsúÇúHûüûü-þ„ÿÕüâq¦yûU°Vað(éü ¼ æ r l ö Y Û ˜ ¼ : ù Ô ¯ Afa Ÿ Ê Ò ¬ UÌËïÿVüí÷²òêìþæKá Üo׊ÓaÐÎÎÌ¡ÌÀÍ$бÓ3ØXÝ©â§çÚëïañó›ôSöžø¨û_ÿq™Ÿ bÎÊDOÕÒ77éA†ã‡¡J‚"ý¹5T2‰Va…Š$/|:"#o*.7  Õ 9 7ÞaÕÿ9ýeúH÷ÀóÂïgëåæ…â®ÞÉÛÚ¦Ù’ÚÑÜàçã–çsêñë³ëÞéÉæøâßœÛòØ1×7ÖØÕñÕ™Öß×æÙ™Ü¹ßãæáèëÀìîsï1ñ¦ó÷ûEæFéˆ#&µ'–()c)›)¤)X)‚( '%¾"/ zÅ9ÊUÄ(— Z œŽ,u{ØF§"þ!ú&ö§ò ð·îÍîTðó¥ö‡ú%þ êÅÂ?œ9Jö3Í}Ü  ½ í¢ã·ðýNúVöGòUîÊêâçÏå«äyä:åÚæ"éÒë¦îdñêóöøýùü9þ‘ê×fÙ m B Z¢þ'̽ÎÚi@¥ ©8bÿ-úô¿îºè¯âøÜø×úÓEÑÿÏ$ÐÎÑìÔÙäÝÆâ‚çîëæïnóŽöDù¾ûþF[‡1~ f¯ '²_!ù"R#§"~!j úh ¹!Ñ#\&â(Ð*¶+N+)¨&Æ"GqÂ' —åöüè÷øòîæêtèfçËçséüëï ò¦ôŽöµ÷øø÷r÷ÒöBö¹õ-õ‡ô·ó×òò¾ñ ò²ó¢öÞú  U/òË * Ø€µý ú(øîõóÏðžíê^æãNàhÞnÝMÝÀÝžÞÍßuáËãèæÿê!ð öiü¯qM 4"HÑõ,ƒÍr!»"#Ñ#–##}"."H"Ì"–#c$Å$v$M#)!êáÜÆÿ†ööìRã Ú²ÑùÊrÆ;ÄõÃ5Å6ÈcÍÄÔUÝ¢åSìÒð óLóSòñKðÄð[ònô:ör÷Jøù£ùúmúû7ü^ýßýJý‘ûGù ÷«õFõVö;ùçý¦` þ àó’$,„©ûè!ø$Ý&‹'N'«&K&†&S'S()f)ó(Á'ì%™#ì ×Z¬ )üjõŒïëRè¡çéì'ðôèöÚ÷œö`óÈî«é¿äŸà[ݾÚ]ضէÒWÏPÌÊõÈÖÈhÉ=ÊèÊ?ˆËfÌFÎ&ÑìÔsÙéÞåfíuö9 $K+•v :!["û#&X(b*«+Ø+Þ*)ã&ý$¤#Ã"#"Q!ÖfýÍQ ] jÒZÿ=üMø²óÓî8ê‘æ„äšäçüë¤òúù³®fø œ@–• Œ õ›¥1¯ðsN ÝÕûözòmð¼ïôïdðmð«ï%î?ìênéné êðìãïÈòõ,ö/öbõnôçóômö‡ùcý\ö" — ‹ ? Ñ AJ} T w×Ûú%óoëhä®ÞÒÚýØõØYÚßÜ)àºãðæéjë3í{ïÎòV÷Ñü­4¸ äš:^“'Q1zö¼0í–ËUþ"''*à+N,Á+*û(/'-%#• œÜ"W‹!žù“òJìç²âNßÑÜKÛÍÚYÛÝpßâ-ä/å¦ä›âjß¶ÛJØæÕ:ÕÑÖãÚHá’é.ó6ýšJ“Fļû4Òú ItÔ W JéþHûføõ&ñœìÎçvãSàß5àÖãØéªñLúˆq q{ø^UtL½æøx! #f#‘"¹ tKÛnï,Ée³ \!p!ÿ * ΃zùËDý~ð¡ã²×wÍ—ÅŽÀ]¾]¾{¿ÁòœÅIÉíÍþÒûײÜöàšälçé\ëRí{ïÃñô³ö¬ùÀüpÿµ—P÷ùuÆBÇ WÌ$ ,Ï]þòŸ‡H m & æ*‘¼Bý « î ÷ Ä b ìvï ªF¨°~ hûüÝõÐïVëÈè3èéJìúïÅóåöÈøù¸÷õ¸ñRî‰ë·éžèÆç‹æŠä™áºÝ5ÙyÔ)ÐóÌ/ËsÊ2ÊïÉ{É ÉQÉ:ËNÏ€Õ3ÝÏåÅîÌ÷  Ázª!L%E(Í*H-Ð/[2¬4”6Ô7B8¶7!6²3Ò0.Ê+*z(¼&‚$u!7™ ‹ìÿf÷ï“èºâýÝxÚGØUמ×;ÙHÜ—àÏåSëYð]ô÷|øùIùÂùæúåü]ÿªf»Ÿ¶môP- ó\“5ÿü±ùµøOù_ûtþ”ÓOÃvÿ$ûÚö›ó?ò<ójö!ûWäó( ½<xTN› å }¥ÓŒ¼p Ù» ÃEuü”öÁðHëzæòâKáÎáZäOè­ìpð§òœò:ðìXçkãŽáâKæXì‡óvúk¼sRüîHÞÿ•ÿêþÃýYü)ûîúVüÅÿ@ N:`żêÛŒUQ!Ë#'%%‚#Õ ¤£D³¼ S¹B ‚Èþúõùð&ìîæ áéÚ¿ÔxÏüËÇÊÌË·ÎWÓáÙâë<ósùý|þ]þßý-þ'ßt€ ¡"F Ò¾ ý•ùþ÷.økùTúÐùŽ÷ô@ðûìúêëâíÈóñûȆ 5QýÐz§ðs¾"æ‰Ø¹÷£§¶]÷x é“¥Zú—¼ ê£ùØï†æ`ÞÀ×ÓÄÐöИÓGØÞä¯è/ëEë¦é‹çEæÒæ„é%îõó¿ù+þÿxû†öªñ îBìMìºí¿ïªñåòZóAó6óøó4övú íL—‰üÒºx¥ÓF°¸âVsøƒ9‹OÚÑ ‡ I L[á6ù Žëõ\êÛß ×oÐlÌËÆË'ÎßѳÖÜHá†åièêë ìµíFðÂóÌ÷¢ûhþÿ'ÿ½ýü¼ú;ú‰úYû,üzüæû\úføœö¢õ÷õÜ÷‘ûî[ø Ë6÷=BsC-ž¯ 9Ñ­àžB]f˜ï#ºß½›à¬àê 4Œƒ÷ûíÛä»Ü!ÖœÑjÏ{Ï‹ÑmÕ”ÚEà‘å¦é ì3í™í6îÍïòaö³ú·þNœLÿÞúpõ5ð ì•éè“èAéæéòé>é+èfçÉçúéIî˜ôPüeÊ °¶`úybyg";%S')(™'Í%9# JøFL — ïUæºÛÿ ÖþŸöÖíåâÜaÖAÒ¨ÐñÐnÒÐÔ‚ØËÝ>ä¨êÕïónôô*ôTôØõêøèü”§Žp#ýù2ö£óoòºò%ôÁõœöYöbõkôôÕôñöÒúš»û>Œ^B{Q-o11 rN¼ûuÝ[ÛÉT!îQÁ ø.ÿõëöàØÃÒÐÁÏåÐcÒ·ÓìÔ€ÖõØ<Üšßtâ¶äµæêèåëðõjû{¬Z…ÿ û­÷~õÍô¨õ¤÷ìù»ûªüÔüÃüBýÜþ§¨  *qœ¯ì{ Œ s ~ ã ‰!"ü!!‹ý o ¿üvÍG•zÆ ±6ýÎóê¹àyØÒ'ÎÃÌOÍÞΟÐÒ0Ó_ÔÖ‡ØmÛcÞBáäç8êÖíªñõ}÷[ø–÷¢õ.óàðïµíùìíìní>î-ï)ðrñ`óVöbúZÿÞm Ó£’ÔÁ ”!"u"À"##Ë#©#ù"Õ!p  Æ3TÒ 7"(#i#Ã"÷ É‘Z Ç”öµìçã™ÜׄÓðÑÒLÓ¶Õ'ÙnÝíáÇåcè¦éôéêvêÁëâí°ðÅóNö}÷×öhô¨ðiìè«åä¿ãsä¼å ç+è(éWê ì±î–ò­÷ªýç¬ nÿ ¢6v¦ùŽDæ B"B#È#¤#è"×!æ š /!œ"¡$î&")ò*÷+Ò+*‰&d!£J‚øý¬óvêËâªÜ Ø!ÕÔ¼Ô×®Ú0ßýã`èÌëþí2ïðlñ‚óBöAùöûÈýþzüùsô„ï:ë.èuæÊåÇå æ=æ&æëåãå—æžèPì°ñOø_ÿüQ ä͉¢—ÆwÅ’}пõð@ãµ”°"æ%[(ç)y*ï)#(ï$5 ·d‹ý"ó„ê¦ã©Þ­Û¾ÚÔÛ¦ÞÜâíçí‹ñ|ô¥õFõ;ôó ôÒõžøÒû¡þ2Ðÿ4ýÙøÈóï\ëÈè+ç/æÄå®åÄå÷åoæ€ç©éGítòáøéÿ¶l ~×òà “vu  ý îéT_éÒÜÅ]•sáÉÄ‹È# £Äú~ð§æÞוÓAÒðÒñÔØPܧáSç?ì±ïƒñ4ò§ò¦ó¨õÖøÏü¼–v ñÿ­û÷þòØïõíPí‹íþí+î îî¿î5ðtòõqù-þ<èƒ Ü ;¶H彚#wV‘C¢Ã`5Ý1ø*ÙøS¯®w*ÿÕô¹ê»áuÚÕ€ÑØÏëϪÑýÔÞÙÕßÿå7ëÓîÄð™ñ<ò“óØõïøKüIÿ4u£ÿèûÝö}ñ¸ì-éüæÝå†å‘å¨å°åæåªænèoëÊï_õÁûPU1 Œ}f©˜|“º{÷éNO?ŸÔþÍÏ…¹xÛî¶½4åP yù±î‰åZÞ5Ù ÖïÔÚÕ·ØÝqâèí#ñøóšõ—öÎ÷õù?ý&äà ˆåþüOø©ôEòîð'ðpï¦î¬í²ìììGíôïôùkþ¬Jæ .T¼Ö”o}¯¼hsçííf­Î£¾£ï—«KpÈ ã hxû ò éáÚ«ÕÅÒÆÑiÒÇÔáØ‡Þådë³ð‡ô÷¬øTúwüOÿ¸C3 Í ~ 6WÿéúÿöbôJófó"ôúô—õ2öE÷*ùüû ÿ  +øÉ9>-‚² ×MO|Qg˜ /£Ðª3ƽ¦|qªOa¤Ö§ù.øïæÞ‹×ÓëЗÐ[Ñ¡ÒvÔS×dÛ,à•ä½çhé2êëêìVð\õ,ûY›%þßýßøôúï<í#ìzì–í®îhïðñÙò¶õ‡ù"þk F]<æ­ðÓhÍ! Œ ü 7!æ õùÇ=«0Y!å"# #ÿ!h t Î(… ¦ú¬îÈãÚéÓjйÏÉÐnÒïÓHÕ×ÇÙOÝàà·ã®åEç é‰ë*ïÅó›øƒüþ;þ¨û€÷¯òõíÓéÁæÿäšä,å:æ™çnéì¿ïhô¿ùOÿÊá A­IbU>§ïé¼ ”!."<"‰!- –MÄ7x g"µ#$`#"- í7ו §Î÷õíñäDÝz×òÓ¡ÒêÒÔÒ՘اܔáoæIê§ìêíÓî$ðoòéõeúÿ‹ ¨ûÝöBò9î&ëAénè0èþçÃçíçé€ë"ï›óŠø‹ý<!ÖZ  ƒ ô u ö ‚ A8F)ªÔ× À(\0^7"G$¼%°&/'ÿ&¦%¤"…P ^€öèìHåÄßPÜ¾ÚØÚoÜ>ßòâ çñêîïïÌð4ñþñúó7÷CûbÿÃÈXúÿ{ûÁöœò•ï–í[ì”ëæê5ê£é’épêƒìàïZô‡ùÜþê[Ý OÖÇ}:Ó£k/Òç–<\2Ô Öš#>ì'Ùˆªå - ü²òÐéâàÛ×KÕÕÔšÕ4×´ÙDÝÀá†æÕê9î³ðˆò`ôÄö÷ùóý)®ŽHé‹üê÷½ó{ðeîwí1í í¸ìƒìûì’îoñvõ{úN‰ƒ ƒ^Ëα’‰§ßäT õºÔ¤€¢+ÁË~!G#$È#°"Õ 3«)KËÛÿ2ö»ì-ä ÝÈ×ÊÔòÓ’ÔèÕÃ×TÚ´Ýiá~äSæ¾æzæ‰æËç¿ê@ïŠôqù¸üýÏûøAóAîæéÚæ”åæ‚ç6é†êšëûì5ïtòŸöŽûÕ! Nþc „ «EÌS½ÎM „߯µû€Ó9 1"^#â#õ#¡#Ž"> )úˆ ?ø^íOäRÝ‚ØæÕ‰ÕP×ÝÚ¿ßCå’êéîÝñ]ó©óŠóôñõkùøýªx|6š jûÄõèð9í«êéþç^çççêçÐéâìñö_ûu÷ž5 × ß À±Çù9|£grÇžnµÌΚÝù?Ô∜ʎƒb onøqîxåÞnبÔÜÒÓ5ÕúØÞ¯ãéí—ð(òµò óOôÒö’úýþ0VÉsFrûÚö<óÕð£ïFïWïsïïÿï&ñkóâöjû”æÊ Âa­ðÑÚGt9l-7 ¨ ì @ Ÿ ËQ¬v€Õ¹V„Î¹Ï ò¤üáó¢ëäÖÞ³Ú9؅ױحÛ,à¢åEë@ðìóö¸ö¶öàöö÷@úžýoÖñ$uÚü9øRô¢ñKð!ðŸð=ñ¥ñåñzòÙóaö*úÿ£_ ?xS/7–Pc”Ø %rždK ? û*vá^Ðÿ¢ ¹lý`ôVëââxÛ”ÕµÑîÏàÏÚÐPÒýÓ,Ö%Ù²Ü=à3ãxå^çé–ìñÿö‚ý`[ê{ nþû¤øw÷“÷‚øsùúbú û–ü5ÿË‘ @„µ‡%£y©LI‹Ô²“bî…m¥nx ©- Ø´§Šocþ·ô\ëãd܈׹ÔÔŒÕÂØOÝtâ.ç~êÕë:ë;éðæŸå&æÀèðìÆñöºø%ù1÷ió´î*ê—æ]äã¿ã±ä÷åfç*é—ëìî]óÑøúþQ: -Ù@¢ió|3$P}`¡þji;þðò‰&A¬ÔÔ‘çµá hrüÜóŽëAä]Þ5Ú+أآۭàç§íyóµ÷ÓùýùáøÀ÷»÷nù¾üI–  ±‰¼úYõ)ñ`îÎì ìªëaëë!ëÄëMíÊïó³ö‡úXþå‹› m 9 ÷Ì•Kµw6èý(1w±¢|¶ ,"Ú"Ú"ÿ!õY¶ÅäúTïÒåÞZØÒÔRÓLÓCÔÖ±Ø ÜÛß(ã¨åGçqèÛé&ìšïôûøaýTE8Àý{ú÷áóEñŒïÐîÛîIïïïñó2öjúZÿy í ”9Çmš°à1°o…ÍÝÔ¹›Ò ãã ?DÐÙk Ô ¸çùxñWé(â^ÜJØ!ÖÇÕÑÖÓØ¾Û{ß±ã²çñê<í½îæï7ñ óÝõWù ý!»†·ÿóüçùööhôtòEñÕðæð!ñrñ+òáóÌöÛú«ÿÓé yJ$G ¯Iá—ooUêê6ðNËÀX™Dpn ‚Ö Äs{_ ø©íËãBÛØÔÑØÏ†ÐÒÓӌՈ×òÙ–Üßåàtâ8ä§æÞéÓí.ò7öù÷ùÃøñõŽò®ïêí[íäí]ï€ñ½óõ÷žø¿úÆý§î2 0ÆÅñ<ç`ýšm+Àû‚!Ëãá\Å`'ÁŠÞZ÷7\ò9 ‹¾]ùmðèáùÛäØõ×*Ù?ÜÒà\æ&ìSñCõ¡÷øløOøáøeú™üÙþ{ã®ÿ×ü¡ø£ó£î;êÆæCä›â¤áHá”á§â±äßç7ìˆña÷6ýt¾ú H û ~$I”ËØ¡ ȺÜJe.†¤J•¯hí‚Â0 œyù®ï=æòÝt×AÓ…ÑÒÄÔCÙ'߉å~ë/ðAóÐôKõxõ,öê÷ÞúžþzpÌK¥µüíøàõêóóóLóOó ó>ó>ô†ö0úÜþ  c så»e‡Ï ¥ N Ò # êÄ:í¯¥2Öû º'ãŠéà¨g+µªo9t)PüEòIé9âiÝëÚÚ1Ü߯â#æêèšêëê`éqèŠèêèì5ð.ó*õæõ{õô(ò=ðäîLîUî±îï>ï˜ïuðGòeõìù®ÿƒ m]îP§?.`‡ x! "ˆ"°"d"š!\ ê–ªVaYÌpaæRÏ+ý °ã£ùuñ0érá¼ÚmÕ¾ÑØÏ ÏÏÐ9Ó°ÖñÚvß¡ãçsé,ë“ì0î~ð½óÉ÷ üyÿ,Ò©þTû¡÷Fô»ñpðð”ñþòô’ôÐôbõ¾ö*ù™üôæé híQǤBß“s{­×ÎZL^:Ø4¤|]"žüOjå l2ú7ñwèšà'Ú_ՈҵѲÒÕDØŸÛ Þ×àâ‹ââòâLäëæ”êËî¸òŒõŸö³õóCï@ëÆçCåòãêãå9çýéímð'ô˜øÖý½Û ’RÔý8,Wã×+¼r!#D$’$²#¹!"x-”iÁ?lûñW3{ü ›OýHö5ïMèöáˆÜŠØ^ÖjÖ·Øݽâ·èûíÌñäó~ôIôôÞôùöNú+þ”|3¨Mü ÷ùñâí5ëýéÓéêê’éÜècèËè”êîóòù¨ÿ d 2ö#iMò^0ó6• ô h LE&ÉÓÍ! yêÄZèZj² Ô“$ûóüê-ã1Ü¢ÖÓ™ÑåÑËÓX×fÜ&âzçoëÅí¿îï®ï:ñ"ô.ø™ü5ÉàÙý˜ùõ ñî}ìÎì½îjñÜóŒõ³öí÷Ðù}ü6õÑ )_€=ëà?`ŒHHsÜÏÊG|f½ˆu2÷Èq ¥ ÖŠ›þo÷Êï[è°áJÜ“ØÑÖëÖ½Ø&Üèà^æ†ëeïYñxñVðï¦î¶ïPòéõ|ùñûdü’úÔööñöìÎè=æ”åªæïèŸë3î{ð¸ò@õXøBü jã ÛÙ¢DsÍej×!K"ß"°"—!ʽ/j‘ sá óïp¸Ü« Fÿ§÷Fïâæ߇شÓÑVÐ#ÑÓÖ*ÚòÞ›ã?çséWê{ê£ê†ë¯í1ñ†õ¬ùSü²üÕúl÷Jó0ïÁë£éRéÒêídðßòôô÷£ùÏü—ä Ö3d[ þ[AÊÔæ ")"/!`.8 ìão×]¯Ì—ɤ ð<,ü ôuë9ãèÛÖ1ÒjÐuÐÑÑ]ÔؽܧáÌå–èáé!êê’ê&ì-ïfóû÷¹ûoý­üºùsõÁð€ìOéÀçèêöìÿïÀòKõû÷ûÂþ°} ü¼Pª(9R£FTÒ¦v ö!¾"”"€!´»N¨ñ î!Ÿ!ïIÓ¯ÒTú}ò¹ê]ãÆÜ…×ÔŠÒ›ÒýÓÉÖÛ2à\åhéšëùë ë¿é"éêÚìHñ=ö8úügûøôéîêPæÂäŸåkèì¦ï½òŒõtø­ûIÿi è däÌÁoHz6Š{¯©ú m!æ ’ÀüØÂÕ»áƒ!1"œ!ÈÔ£Ûp ‹ü8ô¶ë•ã‚ÜJ×bÔ¦Ó{ÔYÖ*ÙöÜoáÇåéàê,ëšêê5ê¨ëîJòöµøvù9ø\õˆñ^í’éÃæ†åîå¸ç@êí=ðáó1ø#ýlÔ Á•?·8;0]dž×F ‘!Õ!E!é \¦2“žÖûé¸q>( 7¥úÑò&ëúã“ÝwØÕ¼ÓÔšÕ(ØÒÛ€àƒå÷é#íÓîCïïïØïåñõ¬ø¥ûý”üQúÌö™òUî«êGè‹çXèêEìŠî,ñpônøý Qa§¢² ΰ“W® Q!,!@ ½ö\T%Ð ow§tÍ·rCÿªö%î/æýÞêØsÔþÑuÑUÒ@Ô×îÚZ߬ã+ç„é±ê!ëgë ìÎí†ðòó1÷>ùsùÚ÷Ûô ñûìI陿måèåœçæéSìÓî°ñõùËýËkRôø Â|qÜÞY ¦é ª!É!N!_ `¯> Œ!²"[###»!!$ Ý ø*ï­æïÞ|ØÔ ÒÒIÓHÕØ—ÛÍßêãçøè˜é„énéìé~ë>î­ñÐô­ö¨öÞôßñ0î_êùæäêãÛäóæé?ìIïåòH÷Kü°:ª š—PËk¦Í BaË> {!M"…""2!õηÛ! "u"ù!T wn„ÜD¨<ø‰ïç*ß±ØmÔ¯ÒÓ¹ÔS×ÍÚß´ãßçÛê.ì ì_ëÁêëƒì'ï?òÞôö‰õGóÂï¥ëçäâªáõâHåèüê0îÔññõ{úWÿv¯ ›ÆÍ¢¡(y·š†ÔJ®¥ ÷ ‡ `dð4]  ƒ!¶!é Üxæj' ûüû©ó”ëä›Ý´ØëÕ@Õ1ÖØÏÚUÞ…âèæÁê‚íúî{ï±ï)ðYñXóãõOøÍùÍù.ø=õoñRíeéBæpä;äjålçáéÃìKðôùËþ8’ ˜öQlhºÎ䣗ö '!”!:!8 ÎdEÁñ¸×ä ¿ïÝq¿ìëÇÿâöõí‘åÞð×®Ó§Ñ­ÑÓ~ձءÜá@åËè:ëœì`íî>ïñcóñõø÷Ùø9ø4ö"ó‰ïÚë“è4æCåØåªçêßììïnó€÷ü!_— {l±áý;±ÌOÞ/! "B"É!Í ›ˆß¸äÓ³ K!C!5 Ëä¦>­3þTõÉìôä"Þ´Ø/ÕáÓkÔ/ÖÈØÜ«ß]ã¥æéêEëÌë¡ìî2ðœòÕô4öNö õ¤ò„ïì˜è®åÍãLãä®ååç®ê-îwò^÷²ü1µ Ô´cõÊ:’ù”‚´ H!7"¤"ƒ"×!Ò Ö%ï>ìé è!Ã"B##Ï!Ð6)RýZôèëTäÑÝÂØŸÕ„Ô7Õ<×CÚÞâîå*éSëdì»ìûì·í2ïEñyóõ õ±ôqò;ï{ëÃçyäâëàá4âøã:æéÑìgñ°ölüGðü !*'[1øêr '!o"^#Î#©##"K!à Û ,!ª!1"Ž"°"["\!`ˆ³ dhù\ðÜç7à¿ÙÕzÒ ÒIÓÁÕ>ÙzÝ â@æ|édëìÝë³ë,ì–íØïaòvôgõäôóð‘ìõèÊå¯ããìãîå˜è»ëpïÂó›øµý×èÆ 7ì§XA¼5xù× Z~ /!7!• q%†xÉEË3] üã‹Ô¸ 2¢üÈó_ëÅã%Ýâ×yÔ(Ó·Ó¹ÕÜØÎÜ#á8åŠèØê.ìÎìPí0î´ïÁñôØõƒö õJóéï#ì[èñäMâ×à¹à»á„ãÒåÀè…ìHñ×ö×üç¯å ?‰¤½O±«u™Âd!°"i#t#å" "H!Õ Ç !u!å!,"4"è!!’ðß.Õ ’ù5ðµçQà5Ú³Õ*ÓÒ|Ó{Õ]ØåÛ£ß"ãæRèäé ë&ì™íïÁñêóKõ_õô‘ñî)ëÙçÐäwâBá[ázâF䙿¦éží…òøçý–â} 4äšKèž¿:ßæ ù!–"¸"ƒ")"ö!"‘"6#Ö#O$‡$‚$+$U#ª!ÓŠâ áhúdñné©â3ÝCÙ.×óÖJØÕÚ3Þ×á2åíçÖéúê¢ëEì3í îjð6òóºó…òð¤ìõèpå}âEàßÍÞ‡ßîàÔâFå–èíòÓø„ÿüÁ { pߤþ9…éfºÞ— Ê x æh8]± T ‰ ® ® L 8·ÙUVzý£ô¤ì¾åìßEÛ.ØðÖ‹×¹ÙÝBáƒåAé ìîïï5ðEñõòõ ÷tøføÄöÞóFðŽìéæäã½âµâ„ãÓäuæ²èóëdðàõöû&âÆ —Aòÿ¹Pðµ±úuâ Í  Ö•’é„ $!‰!Ÿ!m!!  æ–=lå¥ úMñ›éþâiÝÙaÖ{ÕYÖÈØ‹Üáxå3éåëíOî•îïîÛïƒñÅó ö‹÷ª÷7öžó\ðåì‡é°æÇä'äÊäHæAè’êníñ”õ±ú!Œ  ‘Ìâ…ç(qP–²kº˜©‚À>ÂúÛ]©Ë”®ÃˆÙ Ï·þ2öøí†æà„ÚlÖ8ÔÔæÕ;ÙwÝÆáuå0èúéëªëiì½íÍï^òìôÁö<÷öžóCð¤ì(é&æÙã}â&âËâ>äaæ>éíò+øäþ³ô $Ÿ%Ü"8næ ¥Ñõï £ Q äÊ$ \ b 2 ÖFtñ–ÃH FTûEòôé²â™ÜÃ×—ÔcÓÔlÖéÙçݲáÇäç…èémê¾ëµíð…òpô_õïô óYðíÐéîæ£äã‹âíâ0ä!æ¡èÉëÇï®ôbúx† Í„,Ö½%ZŒÞj@Vqe / ì`Èwk¦û-AF3øfššæ• (øï èßáÎÜòتÖHÖÈ×éÚØÞÃâÿåJèÂé±êrëˆìAîšð6ó~õÉö¥öïôëñ9îmêçOäiâ[á#á™á…âËãåõç—ë‘ðÁö¬ý›Õ é–l.¡‡b—¤ý÷ €!š!g!2!:!¥!H"ð"M#?#Ñ"4"~!— OP%Iyîoüó³ê¯ãçÝ>ÙàÕ*ÔZÔ[ÖÇÙçÝßá!åzçé2êYëÌìÈî/ñ²óÊõñö¸öõEò÷î¾ëûèàæŒåågådæÙç®é ìCïóäøêþ£ ZèTÒ°D½0ºpeo[ø+­a[À“•v ì æ ~ æA…t«‹¤Ì ])ûBòTê˜ãûݘپÖÉÕÏÖ Ù¡ÝûáÏåŠèê¼êéê2ëì¡íÍï òìó‡ô›ó=ñííWêçsä¬âÌáÝáËâWäYæËèàëàïæô¼ú<Ï SŠƒ™DÑn3!@‚ººW e  £‡Þš ~!#"?"Ý!!2 8YÐ÷xL Ýøï(èÝá¤Ü¡ØBÖñÕº×2Ûvß‡ãªæ¤è•é÷éQê7ëþì˜ï‚òõVööøó—ð}ì[è¿äâNà’߼ߟàâÙãKæ£é"îÎómúYâo ¢k æiâ‚k®B¬ü Ï!"ñ!‘!@!@!¥!V" #‚#–#X#è"V"Œ!_ zgÇTPpÿ¥ö©îÔç âÝNÚÐØLÙœÛ*ßãoæÅèêê³ê5ëlìvîîðRóÞôýôtóxð‘ìwèÐäûáàß·Þßàaá6ã®åé½ížójúuœ Ï®{œaÖìNån± †!Ú!³!7!® h £ d!Y"#[# #”"ë!2!L í¶9"E ìàû ójëúäÍßðÛ ÙÙbÚÝŸàäÚæ¦èŠéÞé8ê,ëí ï‚òïôBööFô?ñ–íê çýäÙã|ãÂãŒä¢åèæ‚èÕêDî óùÿ÷x £VÑŠõ_ù?Î{"´ÅcÔ^MÀ›’> h  |§EÙì!…ÊÿîöÞî èqâÞéÚOÙyÙaÛžÞqâæçè±êŸë#ìÑìîýïoòõ÷ö÷B÷õŸñäíŒêþçKæbåFåãå ç‡èCêlìhïó·øËþ ýžé™ÔXóÞHMßâaƒšúÛI§Ýu qX#š^æÐ Hü*ôƒì°åæßYÛcØqׯØÒÛ$à¨ä‚è)ëƒìÔìÃìíî ð‚òÛôPöSö®ô–ñ¤íé:æáã–â4â“âyã®ä1æèêî²òžøWÿ)V HÂè¬*Y¸  ¶ Ð j · ¯ÎOé@  qˆ‹ƒQΑ6>–¼…ø¶ð´éãUÞ'Úf×}Ö“×bÚ%ÞÝáÓ䥿wçÃç>èkéuë9î,ñ¡óÞôsôXòúî!ë¡ç÷äUãžâÃâ˜ãú䵿¯è ë îüñ ÷ýf| ´¯NÄ€Ý+œRbÁG¦  нê•~ V!¾!Ž!é ê¯4C€n½ m0þ÷õqîíçqâÞÛ£ÙÚÜ;ß›âå}çyèÐèéÛé‰ëîàðqóõ/õ¬ó¶ððì%é÷åÅã}âëáâ¯âêã†å…ç êcíÏñS÷¯ý;8 –Ö)Á…t«$² š 2  áO/ /!à!ü!~!  ˜ˆPʘNrÄ Åùañêäpß#ÜWÚ!ÚjÛáÝöà䋿.è éyéêQëiíðËòôôùõ†õ‚óHðƒìýèEæä´ã˜ãä,嵿–èàêÅí}ñ)ö¨û™YS 2è ¹‰K&(`Á MvhûiþêR Å' ’òMŸ¸W WïÔDø¥ð$êÕä°àÑÝoÜœÜ3ÞÁàžã!æ×ç¯èäèõèvé¼ê¸ì ï&ñoò‚ò/ñ£î\ëèpåÂããòânã_ä«åMçFéÏë2ï©ó*ùeÿ¶m ?Cp)Ñœ“¿}÷/  •Ù1öGýÊN 5 vDÝu™¶þØò oúþñÏêÞä5àåÜ ÛÛÚJÜßâüå²èbêëEëŒëzìOîÊðnó’õ¨öSö|ôjñ·íê4ç=å-äÛã5ä!å}æ3èCêðìxðõpúW ê†Å‰r™ð|!¡ÅZn¦Ufä¬p Û ¼ $ IclSÓ¡TpÞ äùGòªë:æëáØÞ?Ý1Ý Þ á䔿Jèééé·éEëÀí¥ðGóòôõ¦ó¾ðíLéHæ]ätã>ã‡ã*äå4æžçŠéVìNðsõrû¸ˆP Çî ÅGéÒªb ^3à aVÜ|ž+[jxŠk߇㑠±íý/ö>ïZé¨ä áòÞ0ÞÛÞ¨àãsåMç]è¯è²èýè!ê:ìúîÏñúóïôZôJò0ïÁë´èŽæuå/åxåæ ç6è£éoëçíVñØõQûE ì}ä,9•”Ãz©]¸üa$VÔS}Ygp‚},Nw09ÕäødñúêÌåÚá$ßÃÝÀÝìÞôàLãpåþæ×ç"èMèøè„êíì¨ïòó²ófòæï²ìvéÝæ=åä¦äåÕåÔæèŠé€ëGî1òP÷Pýˆ3 Æ ÿðøŠÞ}¢þøn[ÑNëƒ.§¤üͬ¡ƒÖ{ úDýbõ;îRèÂã”àÓÞÞhßMá©ãëåªç¦èïèáèé êìçîÌñ ôýô]ô1òïmëAè æÿäØäFåüåàæ×çïèFê7ì0ï|ó ùQÿï õ†êŠõ•¶YOQ&ˆR"cŽð[ ¬Ù[Jë„6­õw¯A EvúÎòìYæóáäÞJÝ+ÝZÞ‰à"ã~å1çè(èðç èûèéêtíðóñ¡òÚñ¹ïµì|鯿åsä«äg剿ççeéëêìsïõò­÷oý¯© £Eyš QĤó˜\L ' ¿MÙÎ “Ù¡ß¶_ÆrຄÁ _Ùý!öïéQäÒà¬ÞêÝÞ2à}â¿ädæ4ç<çëæàæ²çéiìsï òyóOó}ñ`î¼êiçåøãìã£äÏåPçõè¥êoì•îuñ\õWúôK ‡fºbY ¡® È "i&fþ˜Ùˆ­ƒCÎi£#k RÁû`ôäí›è£äþá­à¥à­ávãgåçåçûç€çüæçè=êíÐïÏñtòƒñ0ïì½èæyäúãOäåæBçèÛé”ë îŽñEö üJBG ùM ZÛ»ÞÌ™ø¼Þq´ó‚}ÜX¬–øöÁŒ` —ySÁ ³’ÿAø‹ñëë€ç]ä}âèátâêãÚå»çééqéòèºèOéãê3í±ï­ñŽòþñýïíìnéVæ5ä3ãããWäWåræ²ç(é/ë0îfòÀ÷ÖýíR ‚ Kà–ðfA®”ÎRÞÈA–%|¦Ókq)Áe¤ãwäÇ -¾ü_õÐîvéjåÈâŽá¤áËâ•äƒæèûèé½èUè…è´éÚëŠîñÔòGó?òéïÌìéç°åeåÚ廿Ëçêèê=ë§ìºîÚñ@öÉûಙ B9|“ß·$>SèËíqŸÝr{åiÀ­ ñ’ ˆñ0DC ÊÿÚ÷èðÕêùåzâuàîßÁà“âãä#çÈè‡ébéÀè3èkèÂéìïîxñóóˆñ½îQë%èàåãäåëå7ç¯è*ê¥ë?í0ïâñ¨õ•úYH” .nËÅÜk•Vhx#3–OŸÉ4m…œ#$Óf¶_Ë¥wÞ Î¾üõï®éŸåãÌáèá ãÐä§æèÐèºèè9çùæÀç©éEìçîÚð€ñ—ðIî)ëóçsåäáãä—åèæRèÂéEëíbï²ò.÷¢ü™U ‰Žq¬ÈpJT,‹ARè7‹7K§ )ÏùÛ©zQÖÔéÇ 7|ÿGø€ñ¾ëGç8äâDâ"ãÓäÏæžèÐé2êééAé½èáèêì„î«ðâñÉñNðÅíÊêè,æWåsåæðæåçäèêaëJíðäóêøÂþÐI “jèw˜Ëh£r›Ï¤ßeLÎ1À¯ðM|?l!²TÙöså ÝæúõóËíÓè:åþâ&âqâžã:åèæ9èáèÖè[èßçóçýèüê|íàïˆñüññÖîóëéîæÒåÌ冿žçÜè/ê‰ëðì•îÏðòó.øoý3Ëw Õβõvköí îJõŠÙ<ü9ÆOtÌ`þ¸dÛ× °*ù?òPì¡ç_ä–â#âÎâ-äÕåXç[è¬èièåççðç>é:ë[íï±ï*ï‚íëfè#æÂävä å/æçé{êüë›í£ïfò2ö û¨{ã @OÍ/ÁÔZ'ùt]£`Ë3âøkûZD˜aàFÀH¿ò¨Z ÛDþM÷¹ð!ëÒæúã©âºâêã³å€çÈè;éßèûç ç³æXç éQë…íïîïíí¨ëÓè æõãäâíâ¿ãýägæÔç;é¼ê€ìÓîòdö³û†,ù ‡»ÜR©L‰rÖV- !=!ì \ æÊ £ $!=!¿ ©(uÂ[p$? 1WúÂóõíFéîåätãägåçèyé±éFéèè è3éë?íïôï•ïîŒëÈè\æÊä8ä•ä†åÉæ(è£é/ëâìúî¾ñxõ'ú•ÿ-L c,À^‚¯D{Ef~19ŠJ§üœ¶7ÙD6–{'½Së_ˆ,Í hþ“÷†ñuì¦èBæKå”åÏæyè$êVëÆëoë£êÊéqéééSëDíïCð8ðçî‹ì«éöæñäõãäÍäùå9çtè®éÿê§ìýîJò°ö üÒ^ù A2 S…><Š‹ê–˜AÀlzðž0OÓ»HÅGÝd dnm Keùõò`íé æsääÊäæçÈèsévéøè[èèqè¿é»ëÓímï ðïßíŒëéçÄå{å÷åàæøç(éWê¢ë.í8ï òÕõúŒm 3¨özœÜÙ­Îã—»M]É­ó…n3nBîcŸ±ç …ýÁöðjë§çTå|äãä1æçç‡é êîêxêéÈèwèé_ê1ìÓí£îIîÀìeê¸çYåÅã0ããäæåMçºè/êÌëÈípðô·øGþ3Ù ‡ÝÈžÈÅœ´ëјqÖtEŽŠˆÜ‘ãHšð&÷+ t ¦Ùþ‚øPòÚìè¢å8ä-äCå çòèêQë:ëxêyéÙèûèêùëî¹ïdðÍïî{ëËè—æKåå¶ååæMè¼éëiìÜí¼ïiòöÇú’k %xšÝÒñ‘ßÄùÏÒ)ü†ë4â²6+z=ÇAÉH£ª/ë ¡M(ýÏöæðèë+èÏåØä*ådæè¹éÕê$ë«êÂéßè…è éeê<ìõíïòî·í‘ë鯿Hå¿ä!å1æ¡ç%é—êüëií-ï™ñìôGùvþý6 t bù‹“–þÕŒ§²›lðèX¬Î3óCt²yÃ¨â  />ÿ½ø[ò¾ìRèTåäãáãú䳿‡èôé”êbê’é›èè6èTé)ë í˜îï`î–ì-êÎçÿåå!åãåçGèé¶êöë‹íÊïûòH÷Žüf1( ÒûÜí¯²R¶Ã%d8ä]óß.Îh0 jçg˜ÉYü ˆ¾üHöKðEëˆç/å;äpä~ååæ6èýèéiè€ç¾æ‘æBç½è¨êdì`í?íÿëôé¬çÇå£äkäåæzçíèhêñëµíàï¸òoöûQÞý åO·–c˜|.bKˆþާ¥ œ a2±+µ\fHf ±ôÿ¼ù©óUî*ê^çææ+çßè’êÆëì{ëNêéOèkèvé&ëâìîîÚì êõçså¯ãøâ;ãAäåçcè›éÒêEìGî:ñWõ•ú{d{ ;uf‹o¡…*lê,׺ç›"Ôó›~ é ’ q½ÏÜb·Ú~M þGýÒöÇð­ë×ç{åšäåræ0èÂé³êØê;êDékè6èçèeêBìçí¿îŠî?í/ëÖèÌæ†å=åÇå׿%èné®êñëXí-ï°ñ!õùÍþDL P ý_İŸÍæ¹Ç$ù,,¢€…GnÔ—÷JÁd¤Æ5« ùP ûôôïNëtèùæÒæ¬çéêœëÝëYëQê(énèyèbéìêˆì–ížízì\êÜç‘åä‚ãøã*嵿UèÐé)ëƒì%îVðfów÷lü×” ·pùà:M"xó‹+‘÷’š&×JþóY“ÝTõÚ’o G(aýo÷åñBíÐé²çåæ4çJè©éØêjë@ëxêvé´èè;é—êHì½ívîî¸ì—êJègæNåå°åÁæèAéTêSëƒì9îÝð›ôcùáþ„ l æY,$šÃŠ°Î„‰Û®K2ÒÆÔ–½Ò'Z­,¿<Sº8 ­Hdû—õjðVì‡éèâç©èýéNë#ì1ì~ëZê6é›èÅè¼é=ë¾ì¬ííSì5êÀçƒåäŠãä'噿ènéšêÆëBíZïtò¨öÄûVª! U5K€O$ažƒ»7™÷@ùíò‹Òì{ºÐ¢ nAlýi÷ßñBíòé èlçóç*éê—ëëërëhê6é`è>èïèKêåë+í¡í í†ëé}ç æuåÇ寿%è„é¿êÉëÌì îÐïtò!öÂúFä a m~IIØ þ'4ÎÅï¦v®NEJ (ŽE£äHÐhå÷R± ÿeNúkôLïgëáèÎçþçé¨êìÃìœìªëNêøè(è0è éêìûìíüë*ê è#ææääåBæ²ç(éê×ëUí8ïÁñ$õkùkþ²¤¢ W¹$ ÿar-Q}IsîÒ\ÞšÊjEþJèÕQ¤üy޶<ï ¾ÉSüÌö»ñ‚ímê˜èõçUèhé±êªëìÒëë/êyéLé´é¶êîëâìíSì±ê¤è—æåsä£äx墿×çòè÷éëgìqîañ_õ>ú ÿ÷¬ E ›Û_ª  „r|ñÁùÆg!,œ[˜|²\®óPÍOœ{¤ õ xQéú°õñiíàê|éééIêë\ë$ëeêbé|èè%èÜèééîê~ëNëQê½èç—åÓäÕäxåŽæÔçé8êdëÆì¬îañõù½þò× pÏ@HY×è‚xlúôN8æ«´'îݧöŸ¥=±6Õ& B þ…ýøó ïìmêÛé*êëåëuìiìÄë¿ê®éõèÐèWéTêuë4ì:ìgëæéè}æjåååaæ…ç¡èé„êŽëíIïqò”ö~û°£Å ¾ F®',Ôéí;æÐÐxgVâß1‡–Hé? 0 WÐÿúvôÄïHì!êTéé¥êèëåìBíåìÿëìêê¦éïéÍêöëíwí íìpêÎè}ç×æàæ€çyèé—êŽëœìòíÐïcòÍõõùžþUŽÛ JçLÞÛV0!â-ì-á¿ÞZ÷Žª,*ÓiÍ•A”L, 1cþ½øÎó±ï»ìëê,ëBì[íøíâííãëê«éOé›é\ê=ëÏë­ë¿ê%é1çsåWää´äèåaçßèFêšëíÙîEñpôqø(ý ãï í ¿¢Y9ç×ÀQW¼”LZ¿bô4ü8 ª=ÕcÑéy_ ˆþùFô@ð.í:ëbê{êCëBìílí+íiìrë—ê$ê/ê¶êƒë<ì‘ìBìQëïéqè?ç—æ”æçíçïèýéëaìî'ðóªöúú¦ÿ0+5 9 UÜ;ÐÏHÃá>C*"Q¿TôdxYI"ûÉs˨Þd <‚wýzøøóKð¬í1ì¾ëìèìµíîÖí íóëàê$êéé8êàêšëìÝëë£é èœæ¶å†å æçUè£éÛêìiíïlñŠô‚øý×Hõ ¢ DvÖ„³MëckìøÅ“ÎIØKm$stP&Ùl‰ ?ä"ÿ@ú¨õÚñïBíŽìµìfí0î®î£î îíöëëê®ê)ëàëwì‘ìùëÍê;é²ç‰æùåæÌæÜçéIê{ëÆìhî‘ðqó ÷HûÍÿ8 þ žýŠŒûôµÂý쿦È'´@ š$F6è¹eÃ—Ë I dlü“÷<óÄï^íìÏë4ìêìwíí í ìÕê¼ééçèLéê±êëÏêê·èMç#æŒå¥ålæžç éêåëMíáîÕðkóÆöãúyÿ6† Æ Š±ï’Æwb:µ¡ýá…äðD¯ý£ÙÌ”Z*ó”Ûœ ¹ #ê>þhùæô#ñkîêì…ì í î ï£ï•ïçî½í}ìrëàêÍê5ëÏëMìPì°ë{êêèXç1æ®åæå»æûçhéØêEì·íeïˆñTô×÷ôû\£`@ . DÓDæù…Z=í0ì-ä·ºòW¿ìhŠl?Ól°É t /”üøêó—ð;îåìrì²ìJíÙíî·íùììë{êCêvê÷ê‰ëÝë»ë ëòé¡èzçÃæ§æçè(éxêÕëGíìîñð|ó°ö„ú½þøÉÙ ü B å 6›W”4ÐEDÑûíÆ½ä9›äêžó ê“Çkm Ô¬-ÿ•úKö¸òð’îþí(î´î0ïWïäîäíœìSëhê÷é ê„ê/ë¸ëÉëHë8êÜè…çƒææBæüæèbé¿ê#ì·í‰ïÑñ«ô(ø4ü~•Í œ œ `ÞÍ=Ùu²qËÖÃÀß-Üì£ýçÎŽîÐ Ãì³Müøeô”ñ¿ïäîÓîTïñï\ðQð¼ï½îžíŸìùë¸ëÒë#ìoìrìÿëëÓéwèaç¸æ¥æçèLé¹ê:ìÈíŒï”ñô?÷úúÿ"Ýï & – iÜO÷ u’Ò²<qiSG[ˆ¸Ñ¯Bލ¨¬¯œHŠG s 3øþ¥ú¥öZó ñÍïvïÍïmðñ&ñ­ð¨ïUîíì‘ë€ëÄë#ì^ì&ì_ëê¤èMç\ææKæ ç[èØégëûìîNðoòõiøHümkß„ N P ß OìäKðž:íBP96SžøARz–~\I+ñjwô ðb^ýÜøõòðïýîkïÿïQð'ðkïGîíì”ë{ëÌëVìÑìöì“ì­ëpê%éè…ç‚çè*é’ê#ìÃíeï!ñ%ó—õ“øüÂÿk°D  , Æ . ¬ k’§6~dã# :aŽ™rÿK_WJ:Н m ¬~Ýêýáùöðò«ðZïçî$ïÄïbð­ðuðÇïÍîÓíí™ì‹ìÆì%í`í<íŸìšëeê>éXèêçè¦èÍéKëùì¿î¥ðºòõå÷û¬þP®…´ ! ó q ß we¶?Ñ*,Ï ùüEdVù@I3㘠› ¶c±ÿÒûøÐôUòÇðð'ðšðñSññTðFï+îDí²ì‹ì»ìí`íRíÌìÒë êné…èè è“èééêzìîØï³ñÓódönùÚü†4¬ j z  ‹ À¿X˜›TÄ,Kr¢×ÿÿ¾7p‡“§°’'U  1ôV‚ýºùBö|óŽñƒð/ð\ðÊð ññ~ð˜ïvîní¡ì<ì.ìXìœìµìuìÆëÒêÅéêèkèfèÙè¹é÷êwìîÍï¢ñ¬óöÙø ü‡ÿ7äÞ 7  ½«ëS½òà‰î)EPV[S4ÚHh]6ñ¼]µ « (-ÉþZúÏöÅóˆñ/ð±ïÍï2ðšð¾ðjð«ï¦î™íÃìJì,ì[ìµìóìâìVìdë=êéJèðçèÈèæé\ëûì©îdðGòkôööìùGýØIV { ™ B À U'@‘ø;>ýu»ãôü æu¼È·ŸŽxFå 1  ˆoýºùSöŠóœñ‰ð=ðpðÝð,ñ&ñ¶ðæïéîòí6íÀì–ì¡ì¸ì°ìPìšë êéÅèMèDè½è¦éúêŽìGîðíñô_ö"ù?ü•ÿßÞM N  } ó ‹ cs®àíºO±>y®àýØpÓ%<B8õf u " xt,ÉüŠù¸ö„ô óBòþñ ò&òòÃñ!ñHð_ïîäíwí?í.í íåìdìŸë¶êØé*éÐèÖèIé-êmëöì´î”ð¡òäôt÷Túqý—Š  v $ ¹ Y ( +b¥×â¬RÓ;’Êîñã¶béD‚µÒÍ# á MqYþúú1ø÷õnô‡ó+ó%ó3ó+óßòSòˆñ­ðæïCïÓî•î‚î‚î]îûíJígìxë®ê$êïé*êÒêãëJíçî°ðªòÊô.÷ÈùœüÿUä ²á ® F Ì d . %;QK­+ŠÑøþá©OÎ&m¨Øûê – ý  Ýk¾çþ ü]ù ÷†õ‡ôôôFô|ôvô-ô˜ó×òòYñÁðTððÛï«ïTïÈîøíí:ì”ë:ë@ë¶ëŸìêí~ïEñ0óCõ‹÷úµüŠÿJáÎ ý ! § P 'öªDÀUkZ*êa­ñ2btJ Ø   öðüçù.÷ õóÃòòòÈòâòÆò^òÃñ ñbðÒïhï0ïï$ïïÛîUî©ííìVìùëóëXì3íhîàïxñ"óéô×öù~û+þô¤9Ù ÿ Ç P µ  ™ 9ṉ4ÌA˜µ©t(ÑaÏ$j¦Öð ë ¹ W ²Çü0ÿHü|ù÷Qõ*ô˜óó¬óÞóïóÈó]ó½òòHñŸð$ðÛï¼ï®ïï*ïžîðíDíÎì§ìóì½íõîƒðGò'ôöø'úaü¿þ=· Í Ý \ œ Æ ö J Î ‚R!ØmÏñ×}†Šýk½  = _ h R ³M4ÙþMüÅù€÷°õ|ôÜó½óúókôÛôõ*õïô~ôáó<óœòòÑñµñ§ñˆñ=ñ¹ð ð_ïÛî©îéî¨ïÝðaòôÒõª÷ù‰ûžýÊÿüÿ§øç { Ç ã é ÷ / ¢ N ûÅ_®¹„5ä˜Lû i ¥ ¾ ¶ Š JÝFkBÐþ:ü®ùr÷°õ~ôáó´óáó0ôvô›ô‡ô>ôÈóAóºòMòòò9òSòPòò–ññ‰ðHðpðñ òZóÕôdöö÷’ù7ûýïþ÷-ºò ¼  2  ý  Q æ ­ Ž k"•¼•%•û t ö ‹  — ô ; ] [J!ô¦)eJþèûsù.÷Tõ ôZó0óyóúóôõ;õ$õÇô>ôžóó¡ò‚ò–òÆòêòÙò‹òòœñHñBñ³ñ™òÜóYõñö|øú‰û+ýøþæø  Ñ> C Ú   Ò ° Ä / Ý ¯ |-©áÅ]È%–  ¸ N Ú H º ÃÆÇÏͤ1W"þ¥û*ùîö-õônó]ó›ó ôkô¦ô˜ôCô²ó ócòíñÃñâñ4ò‹òÀò¤òBòÁñMñ#ñgñ6òwóõªö?øºùûwüðý‡ÿK9*·ý ¿  Ò T Å c ] º s Y H “ Ë ¯ ^ ü ° } j a N  ¶ ' m ¦ ç+oŽeË­ÿ[ü®ù[÷¢õôOôŒô'õØõaö—ö_öÏõõ8ô›óLóRóŠóÐóÞó›óó4òañÚðÌðMñ^òËó\õÔö ø3ù-ú@û€üþ÷ÿ#eŒU’ 5 I ý ; G    ¼ Ô À [˜w  ª a # Õ _ Í  Z ›öià=Läënÿ™üÅùB÷Qõô¡óÖó|ô_õ/ö¸öÔöŽöÿõYõÐôô˜ôæô@õ„õxõõyôÅó<ó ócó5ôpõ×ö6øhùhúCû&ü+ý‚þ/&OrUº ~ š 5 | ½<%…6  Ð N m 2 ¶ ' ¬ f G D > " ížGö°z7Òé+æ6þmûÜøÝö õ*õYõöÚö™÷ ø øÚ÷a÷àöƒödö—öñöH÷r÷E÷Áöôõõhô"ô`ô'õaöÎ÷-ùWú:ûæû‘üXýyþð5]   Š ÈŸª%õÖ é ï  ’ ( õò   ðÔÅÀµ+^Žžþ”û½øxöòôCôLôÐôõ@ö³öÔö¨öSööàõüõVöÒöJ÷‹÷}÷#÷‰öæõeõFõ—õVöl÷¡øºù’ú!ûrû¾ûBü4ý¡þ­áÏ< % º[å̾…; · Þ Â | 0 ðÖÜþ" > O c ‡ º  I s T Ö ÅÊþìþüùÌ÷Ýö­öüö‘÷ ønøløøœ÷÷­öoödöjögö4ö¹õýôô6ó‹ò<òoò ó3ôpõŸö‹÷(ø‚øÓøUùLúÏûÖýCË* ?º¡#ˆüBш" ‡ ˜ c žJ4?w·ø" I  Í 5 ¦ @  b  kjkþÒûÞùÃøfø˜øù£ù÷ùúÙùŠù8ùùûø ù%ù%ùáøXø€÷uö_õnôÓó¦óìóôNõö­öùö÷#÷o÷.øvùCûqý¼ÿÝ“±2/Þv-0„Çoñ7E7  SÀl9  á ¥ a  Æ O£•ö 8 ÜÿËŒÿœüFú¬øÌ÷z÷€÷¡÷½÷Ã÷²÷™÷…÷…÷ˆ÷–÷–÷r÷ ÷—öéõ'õ|ôúóÂóÜó>ôÛôšõVöööf÷Ã÷1øáøõù~ûzý´ÿüà#× â…)èÒîMaMÇ{S_³J   Ý ° a ç +} g ´ `„MÿöûqùŸ÷{öëõ¿õÇõÛõéõéõàõÛõØõÒõ¹õ†õ$õŠô½óÎòÝññjðððpðöðŸñPòóò‡óôáô÷õˆ÷ùÿû©þH¬±:GíD y © é 2 ~ ¿ Û ã Ä š h T e š ñ p  ¾ w ©|´´ZG x  S0ìÿÉü úß÷Vö\õìôÓôýôIõ¨õörö¾öàöÒö”ö,öõòô>ô•óóÀòœò§ò×ò ó‚óêóZôÓô\õöñö%ø®ùrûXýCÿ‹Â©CØ÷):@@2!)aÕˆlŠ Ò 1 Ž ÓìØ‰ÿ.üdFžl · œM ý£úËø“÷Úö†öxö‘ö¶ö×öàöÉö}öÿõ_õ’ô´óÎòåññYðÒï~ïWïOïkïïñïxðñíñíò*ôõB÷ùûóüÈþ~ fŠ„Y“þ<X^RUf¤ È ® Ê þ J›é+ ÷· í\Wù F gvª*ÿý”û•úú÷ùúhúšú úZú¼ùÎø¡÷HöÞô|ó&òÝð´ïžî¤íÃìÿëQëÒê‰ê‰êØêxëXìiížîìïSñÃòIôÒõl÷ù¼úaüíýQÿ‰‰[ ¦FýãPÈ m  ÓpöU¨‘:¤¾”!ÍëwÊ øM¶|þ­üQûpúúìùú*ú*úçùOùnø[÷7öõ%ôfóÜòqò òÉñrññ¶ð~ð‰ðæð§ñ½òôQõ‹öª÷¤øùZúKûoüÈýCÿ¼ A y•vZe„¥‡ ÿ Y € nD¶m–âóªùàZw H ädí‹Zÿaý³ûLúGù“ø3ø øøó÷Ì÷l÷ÉöÝõÇô›ótòuñ­ðð{ï÷îvîþí‹í?í6ííLîsïîðŽò5ô¿õ÷Møhùú×ûaý%ÿïx“B¡Ù Š W † ð |ò$¸1–ûhÛ;ve÷(øj•œ ‰ | u„“¥´ÿÑý ü„úAùXøÃ÷z÷S÷&÷×öPöõkô.óßñŸð{ï‚îžíÑììoë÷ê³ê¶êë¸ë°ìßí$ï\ðuñiòGó"ô'õrö ø*úuüÖþ«ñöðû> Ç ‚ W¤äÛ—5ÏdˆÜÖiz'„¸ÛJ «  n‘v ¨ÿ1ýãúçøP÷&öbõÛô]ô½óßò¾ñ\ðìî|íEìNë¥ê*êÈévé6ééé(éé@êCë}ìÜí8ïxð™ñ™ò›ó¹ôöÎ÷éùYüýþœ!ÜI ³ ð [ä{þe•†Hß^Ñ6…±¡JžÃ»£„^BØk­ 8BWÿ¤üNú[øÆö{õIôóÌñdðìîwíìÝêÞééqèççiçöæ—æNæ&æ)ægæâæ²çºèéé5ëzìÅíï”ðPòkôùöçùýedè 1 w ¬ä)}Îýæ€ÒæÕ³”pN´>6à›Rþ  lgœÿ‘üLú]øÚö¼õäô5ôŠó×òò=ñgð¦ïï®î‚înîRîîËíqíí¸ìrìXìƒìíÑíïîFðÏñŠó~õŸ÷ úÆüÍÿû)" ³ É Wm2׈U9$ô~¥\¹Óáö)ƒ†h£½ Á ³ • ` þglúÿJýpú™÷éô‚ò{ðÛî“í–ìÌëëxêØéLéÂèUèþçÆçªç¤ç²çËçêçèfèÖèZéôé«êƒë‘ìêí˜ïŸñôÏöòùaýü› 5 ð 5l„e2ÿÉ‚+›Î´UºM«,Í2ÐG¡Üÿ Îa « £ J´âêþöûù‰ö8ôMòÄð’ï îßí.ízì¸ëñêêFéŠèêçwç)ç ççç9ç‚çðçwè-é'êƒëJíyïòØôÑ÷ÛúÑý¥[î^˜ ­ ‚d^øD^M?( ûåÀ‘XãœEÏ*WX( Ú h Ö1~½×Ðÿ“ý/û²ø@öìóèñFðïLîçí·í²í¬í™ífí íŸì?ìüëëëì)ì[ìŽìÀìí“ítîÂï‘ñäó¢ö¦ùÀü±ÿ?]œ ¹ } cK`>˜|‚ðw1ë¥@¶2Åv5û£ ­ ú V´J à«ÿGþ†üsúø¨õ`ójñàïÍî+îÜíµíí<íµìÿë5ëjê¿éLééDé®éIêë&ìíeïœñ5ô÷úùÀü3ÿEŠüu Ê ™ kd<}4€˜ÖcJw½òÞ…õ < j ƒ ‡ v Dó—F ùN£ÿúþ%þý¥ûõùø,öbôåòÉññŸðuðpðxðpðTðð®ï0ïÈîvîtîÖî´ï,ñ<óÇõ¡ø—û]þÁ™Ù•,,‚ ¶ 7 ykô*ÍWÂc ¢ ô b é  Q ¨ î ÿ ³ ý Û Rƒ›½ÊÿÙþ9þËýfýèü7ü=ûýù‚øÝö/õóðñ‘ðmï‡îÖí[í íÑì§ìƒìJììÏëÉë:ìJíïÁñõòøåü¤ôŽ‚ f Ë v m ™ Î á·$ÖWÓtXf‡˜cß  ! C ¦ L -  Ó ( ù: œ8ÿýuû_úÅù‡ùkùLùûøwø¸÷îö!ösõÓô>ô£óâòëñ¾ðyï0î íìdëúêÏêãêEëì`íQïöñ*õÃøuüúÿ—aw q ï ¿ î c ìNHľS³¦ŠÅN Æ[²ÔÎÀ»²‘.\÷‘ ß/Àª¬þ›ý¤üŸû\úßø#÷Nõ‡óèñ—ð•ïËîî[ígì2ëÅéJèÌæuåWäyãòâÀâøâÈãCå–ç±êyî¯òóöãú(þŒ˜*÷ gÎ ï C  ‰ Í % ½ËR C b € q JïÒ»“G›t¤:b[ j · `råŽ=¿úò­@®ÿþªügûeú•ùßø<ø‘÷Úöéõ´ô>ó¢ñ ðÅîðí·íDî¦ïÝñ¿ôø=ûþ*{üî¢r—â½k¦FMÒvþ&ýEüôûüŸü[ý0þÿØÿÁÝ(’éÿŽoƒìøÿhÿvþ>þ¯þ‡ÿƒSİ)W_ÿnþ›ýûüœüiüMü&üôû¶ûpû'ûÇúFú•ùÎøø}÷r÷Aø!úýã j ÅúŠ›À E 9 œ (w¤ ë h xyÏ´þ9ýKü¾ûQûØúIúÅùvùžùNúƒûùünþpÿ ÿÂþÚü8ú^÷ÍôêòåñÃñXòióô«õSö—ö†ö:öØõmõ;õFõõùõSöƒöxö@öéõ õjõeõõöàöGøjúfýNã« "ÉZÏ?ödîãd[z]·<Ì»©Á L `){Ø"]ª1)tµÒY+þ{û©øüõÐóPòuññññ ñ­ððï îßìÏëéêQêêêZê«êîêÿêÇêKê›éçèwèèé¾ëQïWô{ú#‹ @´Vjm«d“øK/Bjž#AaÀ† ¼ O ¨n× Ûÿ’ÿ«ÿb†$ ÿ?ýúúø{öõvô˜ô8õüõœöÝöªöö2õ0ô(óGò§ñMñ?ñoñ§ñ¾ñ‹ñüððçî¯íŽìÌë”ëEì(î€ñ7öÿûEiÎ õƒù¾:é ÉÂ@2K{6mὑ Qìø Á ž ûœ¨»‰ ÎfýGù-õ™ñï‚ííítí›íDíEì¼êêèçŸå ä-ä8ä•äéäñäbäLãÚádà5ßÞkÞß¶àcã.çìòºø˜ÿs  |äÖÃÂý[+íÿ<—DŽ ‘ @ K V , ¶  | 9 q A ” ‚;áU ¼ ‘qðmúÿeH.§a@bÿýeú×÷õÓóÀòXòiò¯ò×ò–ò×ñ­ðTï î íöìêí:ðõóÓøOþÑÀÆ Å¥uwñ:«e_„Ö» Ö ~"'Ãý üñú2úqùzø+÷Äõ›ôýóô’ômõSö÷<÷ªö@õ ó¢ð`îÑìSìíÓî}ñ©ôÀ÷Zú&üý1ýÃüü‘ûCûCû€ûîû^üŸüŽüü!ûçùød÷¨ö¨öÆ÷QúnþÓò vÜú ’ûz½Lò¯e3 zv Tÿqý2ûÀøxö¼ô½ó|ó½ó3ô„ôLôAó:ñhî7ë6èÌåAäã£ãOäeåœæËç´èAéZéékèßç¬ç èé{ê ì½íï ððÁð¹ð»ð,ñlòÓôÓø‡þ¼å 7%*A.F0Ò0b0k/i.Ô-ð-º.Å/p00n.h+j'Ñ" ¦Í½K(Ú 3 @kTÿ%þBýuü\ûù¨ö¡òÓí·èÞã¹ßŽÜ‰Ú®ÙÅÙYÚéÚÛÝÚ8Ú Ùo׉մÓUÒ¸ÑÒÓ‡ÔÖo×AØyØ>ØÜׯ×XØôÙèÜoá¬ç‰ïøè¶ f²:!$&>) ,Ë.@1.3›4Œ56Þ5Ù4É2ä/‘,J)T&¯#V!ýBηj‹ › ¾ÏasˆáÿÀü·ùJ÷ÍõIõõVöl÷XøËø“ø²÷Höô}òHðî)ì¶êÞékéé6èÁæ•äÚá´Þ}Û±ØÝÖƒÖØ{Û×àÙçïï[øoé Ž ÀLé«o+‚¯É¸ñuBíû žr;"þ .  £ ¶Pû£ô$ï@ë3é¯èé é¼ééfç'åºâ”àõÞøÝzÝnݯÝ3ÞäÞ¨ß7àHà±ßŠÞGÝXÜHÜ…Ýdà÷äëò;ùïÿ—; %¢±øŠ4 8 ."¡#9$Ë#E"¦ðÀ'‹ ü / ¹ Q Ó W  y Ò M š9ƒÓÕpûFj ¨ ; ì ) 9 l B v 5Õÿú¹ô'ðœìêè†æÿä6ãÚàÀÝÚÖÒîÏÓΥϽÒ.ØÍßÙèò-ú²_džI«#Ë S ; 0ëÆ z£¾ñÿÿ´þ`þÃýÚüæûbû¢û×üÅþëŽ]ÿTûaöMñÜìéééÏêÓîkô‡úQù\ÍÔüØÿŒÿ÷ÿ¾­ªÑ0d˜þKû<øösõèöÛúER €D³ÅÎXé Ûç‰d±†÷©£‰, {óÿóý¾ü\ûÂùþ÷PöõŒô5õùöIù/û¾ûeú1÷ªò¬í é_åêâÀáÚáäâAäQå¥å*åêãâhß<ÜÙ4ÖpÔ÷ÓÂÔ–ÖWÙ­ÜàãÕäåmå‘åùæ ê,ñŒúSÑè&­,c/F0«0F1K2Æ3¼5ù7û9W;Ð;;ý:W:X94793r-¢&¦ø­ i'åÚ¬þ–üû_úÓù¬ø{öió¼ïŽëùæPâ;ÞdÛÚýÙÛÚHÜíÝjß7àìß©ÞíÜ!Û•Ùhؤ×Xמ×hØ«ÙùÚ»ÛœÛÇÚ’Ù`؞קׯØÚÝgàå°ë'ô‚ý‰|Fì]»" %Æ({,"0É2ó34(4ç4K6ð7´9ì;½>¢A[CC¼@^=Ë9W6è2 /1-4,ª,“-Ž-—+Ž'î!qC ?aül÷kôÃò‘ñðÙíÁêèæâÞ ÚŸÖçӤѢÏòÍíÌœÌÌÌÚÊýÈÇjÅQÄáÃ5ÄŽÅ9ÈðÌZÔÞ›è4òÈù%ÿ§Öx…¢ ÍRè˜Zã‰ñD,«Ï!"Þ òâæ]Ãc åγ#‘ [¹ûÍõGò,ñòôBöÜ÷øÌö ôtòüð_ðƒðSñÆò´ôƒör÷.÷ùõTôqò'ð9í¿éPæøã½ã7æaë“òŒúÏùO  YÍ£P˜ øä¬x–·Ú<Lç ob`½ÉQvþ¸üãû°ü|ÿ6s ¸M"¹!lxqÒ¼µüôúuûûýÁ$5ÿLù]ó›íè§â8ÞjÛeÚÚÛ:Û Û¢ÚÛÙZØëÕêÒ2Ð8ϵѣØãFðaü—¼ ã ; zNÊVº Ul2°íi <½¼Pç[* ý t Qc+(Œ+C Õ > ÿ$öRí‰æäâRâ-äóçRíÀóLú±ÿ›òæÂbÈ?"%ƸCÍþlýÒûù×ö’ôô­öœü2ý}¶ Õ&Ü)()Q%W g•£Ýܨ û#Ï&à'&(#qÜF Ç%gRý€÷Ìðÿêrçƒælçõè!êpêÅéþçÐäÊßÙ“ÑSËßDzÇÍÉ»ÌjϧѺӹÕiר;ÙÊÙšÚ¥Û™Ü<Ý´Ý’Þ)à–â¹å`é`íjñ*õtøƒûÿø{ lØŽ"}(=,ð-è-ƒ,©*ž)v* -20ß2ä4¶6œ8":I:H8Ô3^-\& 1ÿÇߣÅzMHšÿelœþ2ú÷ôZîèæ¹ß@Úq×D׺ØCÚÛ7Û:ÛEÛ\ÛƒÛ ÜkÝß{àôàYàýÞÝÑÜ6Ý´Þ×à%ã'忢å½ãáÖÞRÞ«à™æéïûîá±Í|³ ¨!"[#&j+£0t4K6Á6Ò6/7a8´:(>EBFŽHoHhE>@6:U4ø.>*&d"ÓbÔŠœ —èû(òjêÝåä‡ãÀâoá/à‰ß-ߘ޲Ýè܋܈ÜHÜ@ÛnÙ4×5ÕËÓÓ¯Ò¬ÒžÒ+ÒѱϩΣÎÐÓ‹×qÝÂä¾ìçóïø¾ûaý8ÿü—© õ BÇÅ0Xó‚¬ ^ÒU$¼*Š.·/ø.V-ÿ+’+,å,Ž-Ž-¸,+(%#’å%Ý}ý§ý«ÿÁ9OQŸ…U ”  Á Ò `ÁQH®(bÿæûX÷Gòî^ìËí6ò¡øŒÿFiv¡þ¡øIôòó õê÷=ûþºþÉû«õUîè"äÔâòãÏæêìmëGèïãHàáÞgà¦äüêÀò)û%„ “ × A ïbÿKû|ù´ùûöüZÿ4¦L‚œü÷ù»÷÷ôlñîrì×ì`î"ïâíìêXçìã×àžÞ Þâÿê7÷ÐY5!Î#›#Ú!õçò M"F%²( ,t./f-")P"£sqÔ¹ÿ þöûRøGóIîÏê‡é!ê¸ëMí;îvî+îí„ê€æˆá²ÜÙ‹×ç׫ÙiÜYàÌå¤ìIô üi ·ž"%_u ì ] t Ð Ù Ôr.,ÜþN®C ön/ û"Y"ä˜.Ù |`ü Ø“ýõäíéüæ™çeê(îñ‹ñFïaëðçµæ>èãëmð·ôÎ÷GùûøööZóZî¡è;ãQß–ÝÑÝ'ßÁà^â3ä1æµçè^çHæ—ååŒåæäãbàqÝÛÕÙÐÙÛnÝàfâšä<èFï úê4}"A)é+ ,±+,“-ì/­2C5r7c9p;–=c?W@e@Z?@<|5¿*Ù¾·šÿýTû£úƒûÑýÏ“•‰VºÉíý¿ù¼õBò«ï;îîÅîðÉñÙóüõE÷Sö…òiì¾åQà<ÝtÜ`ÝWß°á½ãå:å¼ä;ä]ä'åHæåægæäâšß¿Þ»à æAîö÷ÁÞ ÙiL e F 2!G#Ê%Ý'O)*,9.ã064.8_<´?ú@ø?K=¡95e/(S!ù¼Î_ ¤üûõóì÷äWß­ÛÓÙìØ<Ø‹×× ×P××a×תր֋ֆÖPÖÖ ÖaÖð֙רØFÙéÚõÝ›â¤è•ïÏöËýøÀ” Y ‰ " O Û  sµy|ç:Âùžóéïï>óyú(>È$×-Š4M8<9#8ì5a31‡//¼/Ò0Ÿ1»1«1u2Ü4^8£;^==Š:Ç5.›#ÌS 7X¿ÿÏücùÿõíòïéêúääÞ±ÙxÕMÑÌÈ Æ¡ÈŒÐ™ÜQê4÷uåiXþWúù‡úlý«ä¾\:úó>îÁë÷êôêKë»ëöë_ëé}æ>ãëààŸàâïãlæ|éßì)ðåòÅôÊõHö¾ö…÷©ø>úœü82 ñÄ © rR%)ò 4úþÿDý 3œ¸"Y&å'É':&™#¨ Då^èRÙáO þÙòë¤ç×çôé?ìwíGí<ì!ë£ê)ë»ìáî&ñ>óÐôQõõóCðŒêúãÈÝ½ØØÔûÑ7ЉόϗÏTϹÎÈÍ‹Ìr˸˩ΌÔÜûâÙçKêæêÁêúê:ìÖîêònøòþ¥ ¢ö¦0%ì*`/ 2Y20¹+š&}"Ä —!ä#T&¾'a'Ð$á­C #¼¢ºÒ Ò * ûãž¹ÿžý»ücý_ÿ€yÿºùßñ¼éþâqÞ1ÜàÛ#ÝWßœáãLãÖâ+â»á­áèá#âðá³àûÝŒÚc×:ÕmÔÕÔEÖ‡ØÛÝû݊ݸܷ݇ã•ï«ÿ½ ºEýc8"õ#P(x+Î-á/p1Ò1Þ0².ò*F%R^¨ß )  §  X [ï=Ž\“ k O„þè÷ðéÙâZÞ€Û¿ÙÈØ›ØyÙrÛÞ—à‚âËãä!åŒå:æ–ç¼é?ìIîÞî`í8ê€æ;ã¹àFß8ßÄàºã‹çÿëñ4öúTûúœ÷ãõÏö@ûþî P@ H&))ø()(P'—&&<(«+Q0Ð48È9ò:_ý?@ê>ï: 5G.Ž' !h ì ðûröíòšðõî–íãë]éÿå4â‡Þ}Û>٪׾ÖÃÖ%ØÝÚIÞœáQäææºã ßÙÓÄϫθÐÏÕ–ÝËçÅóéÿï 8–.¨ÍéÕ\!ô&s*+c(H"í[ §føôÛõ<ý™àCv ¬$Ø&S'#'Y'^(Ù)á*`*ë'+$T âKµÉøÄ*ã›Ï­ûûòðìòééQê÷êÛêbê-ê-ê|éåæâ&ÜðÖLÓ¸Ð0ÎÌË”Ë7ÐQÚ7ç…òù¶úËøõÝð î;î<ò0ùæ?‘ R e (þrü½þ Ï&|Œ ÇÆýoýGþ;þSüOù×ö¼õ õ öa÷„ú®ÿã ¹P‚^W Ö$ )œ,ž/¨1Á1õ.J)¥!˜– …n2uûjöëñsïÇð)÷tÄ-*/¡.å(r!,oîÂK)9µ%ÁßýêóÖéPáàÛýÙšÚ³Û—ÛòÙµ×4Ö/Ö×òÙËÜ2ß/à*ßåÛYÖCÏ6È;ÖÁyÃÃÇlÌÏ_ÐàÏ=ÏÏï·ÎÎÎ;ϾÑÕ±Ø™Ü áæHëðAôø€û¬þŽv%X U‹¯$+ 0`44739W:¿:¿:·:È:ú:;;{;’;Q;•:99N7Ü4¾1Ú-q)A%É!›Õ÷eá àVý8ùEöÕôôôÏõ ö`ô,ðÞé}â@ÛÕšÐ|·ΠÐGÒúÔí×ÊÚ%ÝïÞSàSá¤á¨àûÝIÚÌÖ_ÔÓ…ÒMÒ|ÒkÓÕ¾Ö…×zר·Ý“è÷kz 19÷$gºí¦$`)_,..•/ì/ã,%ÓZâÿ?* 8™Çtßš!Í%Ð)„+*8&é  úÇúò›íÌì“íAîkî(îí¨êðæðâ¼ßÅÝÜÜoÜÜÜ(ݒߤâãä$åLãNàÝ_Ú…Ø‹× ×[ׯؾÛÇàÚæ^ì/ð9òRó´ô<÷)ûsáÇBa!}#¡$Z%%ö" ¯Ò ®&X.n5•:ó=3@ŒAA˜?‡;±5[.%!XÁ ©ØçŒÿ»ürûÉû™ü†ü ûˆøxõ9ò$ïí¤ì]î}ñôPöÒö×öööÿöYö·ô[ò¿ïíeê»ç†åÓäÁæÌëyó™ü³+ ¸íd…Ê ‘ ìz§ï>*í ŠTú°ðÜèä3ã¢æ›í4ö(þO [ ¾Íû*xâ:ŠÚÊÐíy’ 25ÚûÔ÷ ôÇðî{ëfèFåã~äkè¬íEòIõJ÷*ùÂúvúÚö$ðMèÉáÞóÜÞùàüåíÓô=ûþËþ.ýTûeúãú#ý/Œ =ˆu¨¯ 2 “ò n[ÓÕ×?ä—‚)  ^ï—kþÑýþ,o8 Ó º ªq/Þþ%þÓÿb ¾Kû)`´Ùÿöï÷ê éè¥æ¿ä¡ã5åéêÇôBßC û"‡ Ê ÈG P v¸êãæB~ûÊïVæ°à ßYàðâYådægåÈâàúÞràäÜè.í¦ïFï×ëså­Ü%Ó=ËöÆÚÆúÉÎäÒ°Õ§ÖŸÖðÖcØùÚ>Þâ çqîRøt öv½|P ‰ íÖá˜$*/U36P7è7‹89Ã8ü6¡3Z/8+7(æ&^'G)Ê+z-ù,¬)-$ܺãÊš-/NÜä™  m=ûÄõ!ð-êÛãݵ×%ÓHÐ!ÏeÏ†ÐøÑLÓCÔÔÓÓiÒ¾ÐTÏvÎDÎZÎ8ίÍÃÌ—ËNÊ;É©ÈçÈÊÁË©ÍmÏ Ñ•Ó‚Øálìí÷YMó |f`%ï)è-¨0#2°26364á4J33.³&kIP•žÍVß’Ç 6$(›*W*ë&d!÷œ “þWúnøª÷‰öô(òð3î×ë3éJçöæ(èê—ëƒì+í(î{ïFðvï§ìXè|ãìÞÛØÕÓÒѶÐ)ÑcÒ>Ô}ÖËØÍÚaÜ0ÞÎá˜èXò[ý§>Ë?ÿ¼$G#ñ,Õ5g<*@ÒAŽBPCOD(EAEADãAÀ=Ž7/Ÿ&ÉÕ;Z Mî’C dRý.ø¯òÑí¶êúéQë…í5ïpïAîdìxê›èræŠã à‹Ü¦Ù™×=ÖKÕãÔÉÕ*Ù®ßÈèµòdû§böÿH¿/Ì : [ å k £ÿÉ÷,ñiìWêaë•ï\ö‚þÌ›±Ç± ‚$ª'b*”,¤-M-Ê+á)(:&# ÷uzch ´`þjúÃ÷Iõóñâí!êÎçBç%èêÜìNðÈó7ö=öóðìÏåñß<ÝŠÞãúêtó†ûñÏI G7 ê rïµÒˆ  8 Ð S nôŠLœ  é A ²å¨Û (þDù~ôñ¶ï=ð³ñþòió‚ò$ð–ì¡èåkäæê/ñ(ùùóä ˜ ñ0•ÿÉüÕú©ùþøqø^÷CõòžîHì»ìjñ•úÁ+.#y%q$!)â…R f*µV DþÇûEûÄû»üÃý;þ‚ýÒûCúúù=û.ýþnþMüGø²òìåRÞ©ØÔÑÑ_ÐñÏ&ÐVÐÐÏÏéÎÏ Ð½ÒÜ×@ßµçsïØô÷PöýóˆñTðSñòôüúS• Û{ô ¨%)+Ï+à+h+¼*s*+‘,f.º/]0£0¿0;06.D*% ªFx‘<' —!­!äSˆ?( |Dƒûöìï•é´ã•ÞQÚ¾ÖËӭѭоÐ}ÑqÒ`ÓyÔùÕÎ×IÙÊÙ5ÙØâÖSÖBÖ,Ö³ÕÕÔìÓhÓsÓïÓ¨Ô‘Õ×ÊÙhß…èçóÖþó« ¡ 0äBÞu"Ú'~+€-·.ú/„0+.­'½ù+Šƒp©ù"è&º) +m+¿+4,é+À)b%e7t ”{úFõSòÏðpï‚í:ëÈèãå6â"Þ®ÚÖØ·Ø®ÙéÚÜtÝ$ßôàMâÆâXâ áßaÜyÙ×FÕCÔ"ÔdÕ´Ø(ÞÍäëãï ógõ»÷>úåü±5 À‡+\ h ‚ï°:j$~+T1 5Á6ã6é5U4€2k0¸-0*«%' ©œ” e‘.ýúú|ù3ø³ö±ôöñhîCêYæÖã£ãŸåËèãëî@ï~ïïîzìêqè#æã°à½ÝBÛ ÚÝÚWÞbä4ìeô—ûîhuµ‚c  Aåù,˜¡ù­®ÑÆ¿ê|c%¡O3k —õQ… òŒâü‡ù™öpô óBò ñï?ìF陿Œäkã|ãáäç0éêbé¬çæå•äyãâdà!ßNßrábåšê†ðŸöwül‘I ¼ 7 ß ïûgÁà!s%''±%Æ"ˆ%Kä¶wÕ Æ" $L$6#2!ª‹«ÿd‡ Aü/õ¿îFé2å…âÇàhß3Þ#Ý?Ü™ÛjÛÜÈÝEàêâHåüæœçÝæ˜ä&á¯Ý‰ÛoÛ+ÝÁßâ‚ã-äÊäræ„ê­ñûÖ ÑÄú¨ÍöÏ‚ "•$ì%'€'Ç%!ÂbþѨZzÃ"*&P'h%@!Áqz÷û ª”å÷ËîçâáýÞJÝÜNÛ¢ÚWÙùÖԜѾЯÑïÓÆÖÕÙÝ àâýã•ä•äøãˆâŒàúÞáÞ¾àZäFéZïgöÔýq Ÿ ÎÏÔ•) Åg"-%'Ã(b*ô*.)ê$¬¾ a ›$ø(u,ˆ.ß.™-j+O)°'Q&|$œ!lûâýôšë/å×àÞ^Ü4ÛÚŠØœÖÊÔÓÓ$ÔrÕ ×ØÞÙ Û}ÛšÚcØÏÕÔºÓ‰ÔÇÕöÖ>ØáÙÚÛ(ÞSá†ætî3ø”²ë º%'Zm6þóB#:&m&X$‡ Q‡àp:b )(Ó.µ36k5 2-(þ#!Xé=š ™ý»÷có»ðIï-î¾ì³ê+èWå¡âxà\ßhßHàdá…âêãuåjææWäâá¨ß"Þð܃ۼÙLØû×3ÙÝÛæß@åƒëÉñ7÷‘ûÿ)Î / ‚Ì¦Š  ˨»ÍK¥ #( +,,³+ï)P';$K!õ¾Ã: Û¤ý“÷óïóìÍê>é6è<ç¥åãà¤Ý»Ü˜Ý!àýã›èóìÕïjð¦îNë¡çäžâ[ášà‰àƒá´ã#ç—ë¶ð ö$û ÿX€ Á ò¯¿mJ~oÒfÄhd\ç}c#à'2+--ì*Ê&Ì!wš§/Y ®ÿêø›óïaëžèªæ@åÖãðáhߤ܌ڼÙQÚöÛ]ÞYáŒäóæ7ç’ä£ßFÚjÖãÔ:Õ€ÖØÚøÜáüæeîBö ýöæùG = þðÏѨ!µ#q$Ô#^"„ c!šÐ.!8% )V,í.W00Ô-L*x&#±Cï³ `úâñjëÚæìã4âáà÷Þ–Ý Ü†ÚkÙ ÙšÙ!Û[ÝÒßRâÂä—æç†å™â•ß¡ÝóÜ×ÜÑÜ Ý>ÞáæåMì`óÈùXþîšîdÅ‘Ä Þ%ï¾"¿$% $ü!n?jÉC!æ%˜*Å.24â3Õ1©.K+i(¿%€"Ãõ!?ýÛôÅí½èÇåä“âÒàáÞûÜHÛáÙÈØJØïØëÚÃݳà’ãBæ.èRèæRâcÞœÛ_ÚKÚÕÚùÛnÞÎâ éÛï—õsù”û¾üðý÷ÿç!Ñ m o 3Œ€ø¢8à ÷  ; H ³rå'k/58 85ö1f.¼+ž)î&§"ªp^ ‡Nûóò‘ì6è@åãuájà¹ßÖÞDÝ2Û©ÙÐÙ­Û3Þ”àíâ*åoæåˆâ`ÞÛÚ)ÛRÝãßã»çî\õVüœ´”‹m Ðìn@ˆ(Îþ$ŽÊŠJ–Ùݪd"Ô'ÿ+G.^.7,(^"HÝŸ† ŽˆÞÿ–ü•ùîö ôcòÞïíIêççPæŸå~å¥åæ ç%èýèÍé2ë í;îóìÈèíâ“ÝsÚÙ÷Ù!ۺݧâŠéÁðPö;ùïù·ùçù$ûžý=¨O <«³ã¨ñZ ú  ²‹ï›‡±%Þ*f. 0ç/3.C+S'»"ìN»¦Ë 3RþÑø0ô)ðìÜçõã#á«ß!ßýÞÍÞ•ÞºÞ‰ßÚàRâïã«åâæ°æÍäÀá£Þ…ÜÜÝ•ßUãJè;îŒôTú£þå1<Õ ³Y«).½{Öîæ=zçi"t( ./2…4O5£4d2?.M(H!8µß fóUýÃ÷ÀòÐîÿëÐétç¦äœáߦ݂ÝÞÛÞ‰ßgà§á-ãŒäuåÚå{åä€á"ÞÕÚnØD×9×JØŒÚÞãé®ïÍõ‰ú½ýa‰Ù 6Œv~|òçXº®Ÿ"ò$ü'Å*#- /0±/w-t)"$ð4΋ ú*ôcîéÚåOãEáß[ÜÛÙOØØÈØ©Ù8ÚÛÚ4ÜsÞöàã±äãåjæëå5äÆávßýݦÝÞuà`ã ç{ëàïtó”õ€ö ÷¤øùû&M )..JÙ´K"JÕ!´%t(‡*x,Š.¨0¤2A45ç4‹3C1.¶+þ(&i"^Ý"ɬþ­÷^ò•î”ë˜èåþâ…á áÒà!àߊÞúÞàáÌá`âµâGâšàÓÝ÷ÚÙ“ØÙmÚ+Ý[â;êAó¿ú¬þ ÿiý«ûEûý&~š ÞnÆ Q  •4akÃo ‡ãÔ›mÈfH!%(‡)õ(¶&n#±‰Ém° ã8úõ,ñ]îìÐéŽçæå\åÏåŽæçBç¸çèIéké3éûè¤èÆçæïãíá°à~à…áQäé:ñ‡ù…®ÿœüôú­ûÿÍà ŽP àAÚ _ ë %(û,ó¬:"p%ž(-+³,Æ,÷*à&Ä Âcš ƒ‰öû‘öòyî¾ëZéÁæ¡ã à‘Ü÷ٴدØkÙ ÚVܱÞoá0ä׿©érì%î§íÁêuæ}â{à#áävê+òmúo¨š*  Kd Ž†Û‹”ÜÒU‹VüÐc{fÀ— }#'·*œ-`/®/(.‡*Û$ÑbRäoý+øwóÄïPíÚë¥êÜè:æ>ãñàüß)à¨àÏàÉà:á^â¯ãbääÛäxåæå!å©â ß{Û'Ù¡Ø=Ú-ÞQäÉëçòø±úVûgûSüÿ0 rcî*¢L§Ñ ¦ùŽ7!Â$')+z-•/1ÿ1)2_1/+L%"æ& ©BýV÷¬òÈîoëíèUçBæéäââ¥à-ß'ß\àåáã´ã äæŽçnè“è]è%èÉçÒæñäcâæßnÞÞ:àã¢æ$ê1í«ïðñ ôAø ýR• žÔ ,±Ö4ªÃ(ü‡¸"%Á&‹(*j, .Š/Ç0F1e0 .v*Õ% õÊ9 ¬øò<ìSç¯ã=ábßtÝNÛÙ¯ØòØÞÙîÚ.ÜÞ—àUã\å@ææ5åºã¤á8ßðÜYÛãÚÉÛ8Þâ׿Vì ò}÷°û‚þ:Ÿ“Òs —¬Q@rh< ? ^ × ÷¾Í $˜%”&(;*»,Î.ä/º/P.ô+õ(h%5!uiMî îKyù>ó+î;êöæÍã«àÞ»Ü¡Ü Ý?ÝÝ ÝtÝDÞßîßá4âäâcâ‘àÞÚÛ{ÚýÙjÚÜeß$äé]îèñ8ôöiø‰û•ÿ‡ø Â{g*^ y Û I — %PŽ:¬ÈøóLŒ!$‰&Î(k*Â*…) '>$Ï!ö"íª Õìÿù"ôðóì êé˜èŠéxëlí˜îòîÛî¬î6î3í×ëjêêè9ç:åã7áìßZ߼ߧáôå²ì|ôôúDþ%þ­û–ø†öŸöZùqþÖÍ Là Ÿ  êþ–‹F Ð\ÔØ;NŸI¬H!M"à »òL ã+þúöò{ïíì’ê0è”å½âà8ÞÅÝÞÇßá‹âIä7æÑç éTêöëtíîí,ëZéÂèúé3ícòù2! * ËåÇCÃ. À_ôħ‰”‹äœ¾ÜN Ê ¢!¯#®&Ð)x,?.Ã.w- *¬$ö¥'ÀÄ„úNõ=ñ;î ì®ê`é€ç«äMá’Þ“ÝeÞà‹álâ+ã-ä!åYå¶ääãyãZãËâ.á•ÞÒÛæÙ«Ù»Û\àMçkïÝöôûþ(þˆý¯ý˜ÿ˜` Â÷™BÞó¦kkÊÃaó"´%Ÿ'À(*Œ+#-….©/N0ý/A.ä*8&  sä? Ç—šúÊô_ïéê–çãäþá’Þ=Û'ÙõØCÚ)Üòݫߵáøã¾ågæ=æôåÏågå-äâ³ßËÝöÜiÝLß‚â‹æ†ê“ípï¨ðPòNõúR$¶ÐÐzK÷‡çN  ƒ!-%x'ß(`*Y,“.’02433†2•/Þ**%0L[B #4~ûÛõVð\ëSç-ä‘á0ßRÝtÜÎÜÈÝ’ÞïÞCßàˆá ãä_äIääããŽáß“ÝJÜfܦÞ]ãêŸñ`ø4ýÂÿƒp—»nµ¬ ¶P ‰t—¶ Vq‚a"6$%8&)(Û*Ú-y0ù1Õ1é/_,ˆ'Ò!¨Ç£ Ƕ÷ú®ô±îéé—æä»á_ßÀ݊ݼރàðá§âÜâââºâoâGâ}âµâXâáòÞðܸÛÏÛ˜Ýwá çqíÜòKöœ÷}÷÷}÷ù[ý»ç‚àüAY 9 Mp '$°€"=&—'‹'‘'‹(W*j,X.Þ/00–-`)($Óä0hV °€û³öqòÐî¾ë éÃæFåå,æ¬çyèè”æå8äÖãÅãä´äCååìãÌá\ßtÝÝúÞºã£êóñÀ÷³ú®úµøaöQõƒöú˜ÿã\ i<C ÉS ÿýþ«>  #U fl7!ç#¿$[#±3ˈ ˆéÿâü!úa÷¦ôòÐï…íÒêÉçFå£ä­æãê¨ïtó°õ°öèö†öÒõõ:ö¸÷ùù“÷=õ6ó–òôµ÷ ýçÎp O íuæÿJ¢7 yC@ <¥Ý| “èƒ=+z?ªÐ r"#À#Æ"* «®á ¾Eü¯÷Ùó~ðfíêíç†åã{àÓÝÌÛ&ÛÜ´Ý>ß à\àÇàŽácâãqã½ã¡ãµâ¹àíÝ=ÛÕÙ«Ú"ÞýãVëçòUù§ý¹ÿ=:¹wìá bç7kwHP£ªu® y$æ&µ'”'Ž'G(À)+J-l.n.¶,)½#z2 Ñ/ÿûf÷ÃònîêÃæ%ãà|Þ£Þ!àóáAãïã~ä*å®å¾å—åŸåÚå¶å~äâ ßiÜÛ»Û8Þâ‰æ{ê+íAîîDíníãï/õ¸üì ô#ó‰=uŸ° ‚$ (*©*ì*Ò+§-ä/Ý13ð2b1..Š)ð#X6˜W :Àý-ùŠôð¾ë§çõã=áàƒà§á}â‹â(â â‹âJãÅãÛãÂã„ãêâ¢áÍß Þ(ÝáÝrà~äéJí@ðÑñaòºòÓó,öÓùJþíù„ Ö ÜbîÿWÿ×î* /†<g!Î#5%°&)/,‡/42ˆ3.3=1â-U)$¤|ìù‚  KÔèüð÷<óäîÒêEçÛääáä4æ&çGçÚæBæåñäOäÖãŠããâ€à·Þ·Ý‡Þ×ázçUîÕô’ùàûèûŒúþø`øyùiüÿaC 9L¨ ªTJõ fz¥[ÚG¿ M#%e%$î Ž°#I  ¼ðýÈùÊõ#òïèì~ë„êÖé˜é!ê/ë#ìMìŒëeêvééé6éeé;é`èÃæ ä¡â»áõâÒæðìêóúAþ¹ÿÙþªü’úÓù'ûvþþ– z Ä D ú?S½&¶ š-ê,«ã•°Ø#%$%¸"è&F[{EûÑ÷ õäóò´ï íšêAèæäRâ°á}âŒäç%éjê&ë¶ë,ì‘ì%íDîÇïüðKñÇðNðîðcóÜ÷¬ý´·Ø É Ê   J®e»y ó Ÿ7*l $ G ' ‘ ätÁ…Yñx¿ {ó`0*97›-- Mþäùuöcóðäí¢ëédç¶äâá³ß'ß”àLãæÔç[è(è×çˆç7ççEçÔç.è»ç4æä“âÃâ_åFê{ðÉöüÇÿ̈“½ß‰‰ øwû‚åT®e™yG#x&#(P(†'”&&F&Ú&‘'ë'l'„%ã!¢YÐÓ ì2"þìúîö&ò+íè´äƒáìÞ Ý‹ÜfÝ\ß–á;ãøãäøãäbä¹ä*å¾å4æ,æTåÞãâPâ´ãƒæ÷é ímïÄðŽñ^ò½óÿõ8ù‹ý²Ÿ n@ Šø ŠhwiàT $\&)'''¾' )|*¢+4,Û+*¨&É!S7ßDÿ ÅWƒý ø¬ò§íé}æeä;ããÞãÿäÁå¹ååCääÅä ærçžè%éÙèžçÇåúã"ãçãgæ!ê î)ñûòêó·ôöfø€û3ÿ"k ° ( ™³ZZˆ< ­&_ Ï!Ÿ!ì Ò å!þ#~&…(<)ó'‡$hn–£Õ Þ¤Ïðüð÷Gò¸ìõçAä­áQàYàªá©ãsådæuææ¨åså{åîåâæ"è"éTé¤èˆçÔæ1ççèÒëkïóñõÜ÷õø¼ùÇúˆü3ÿ²Ìì GòŠŽ H  ´ ë Nk…î l"à!C øõL r"‚$¦%>%þ"ø´ Ó‡ )bªtþ‡úëõüðHì0èúä¡â á¾à§á¬ãæÃçwèJèåç½çûç“èRéýé_êeê$êÈé±é\ê<ì‰ïòó‚ø7üLþÐþnþþ|þ!ÏÊ Â’Î m ¦ 3 T É /*PÝ ›½‘/ :!À"è"H!ê%¡" Øtý¦ù{õÿðrì<èŠägá¿Þ§Ü†Û×Û´Ýxà6ã:ålæ+ç¸ç+è“è%é÷ééê­ëîëŒëéê¼ê»ë î7ñTôÌözø±ùñú¢üúþÒ nñõ;%”xv³ûæG ö!}"Ç!  ³ M"6$«%&%l"?þˆk üÀ€û öCðàêjæõâYàLÞíܡܛ݉ߟá;ã*äÅäYå÷åuæ¸æÚæùæçç­æ&æÿåÝæéPìôïqó{öù:û^ýšÿ¤Á ÄÑžó4_ñø$"Ô"!&ª'o'2&A%O%V&ª'ª(Î(Á'"%¼ ì¬ø €û§Ðþ ûNöôð—ë»æÀâ³ß›Ý½Ü?ÝØÞÌàJâòâòâ½ââcâDâfâßâkã©ãRãˆââzâFä çIêùìËîÞïÕðUòÐôRø°üŸ°K ÎÍ4mD·å¨OZ-$(`*Ø*-*)¯)æ*Ÿ,(.â.?.Á+B''!pAeô ‡ gïŸ6ýÆ÷Ãññëüæ;ã³àeß@ßà^áPâ…ââ–áoá¸á?âÖâcã´ãŠãÑâ§á»àÕàtâ‰åTé×ì8ïNð­ðKñûòöQúhÿ·¦ ª =ë ï Ç ‚–S œ"<#P" !¨ à!y$Ÿ'R*¥+ä*Ï'™"s®_ …¨æt±þùLóûìXçêâæß`Þ`ޮߪá|ãä®ä]äøã¬ã•ãÓãpä,å”ågåÅä3äsäæòèÀì°ðòó ö÷™÷]øúÌüÇ—Í ®tvkžõOŠdC‡[!à!!Oí>{!È#T%A% #¡¤ ?ß§ñÿóýûåöÝñ‘ìÆçÛãáCßÂÞß#áââä‡ä˜ä¶ä åpåÕåKæÃæçÉæ&æ‘å¾åXç’êïÈóè÷Œúbû«úOù‚øLù1üîÇ¥ oLõÙà5·ÊUè:"²#9#g!•ø r"$%'P'Z% !÷P ÀËN±ÿõý=û)÷ùñMìÝæ â%ÞdÛ$Ú”ÚdÜ·ÞŽà‘áâ`âäânãøã£ämåùåæŒåïäÞäæÜèíò­ö8ú)ü¢ü^üaüˆýN«' úy§p·+ T±!n#õ#å"=!- e ã!þ#Ð%j&-%Ý!³Tt =LÿÙýÒû…øøóÂîéŠäà™ÜpÚÚ/ÛÝÓÞÍß5àƒàùà€áßá.â™âãJããGâ”á¸ávãçÕëãðõâ÷;ùÐù‰ú&üÿ9táåò3JEYž2ï9#:'ç)£*ž)Ñ'e&&ñ&z(õ)|*A)á%Œ ìóx  YqþVü8ùÍôyïáé˜äìßÜ’ÙžØTÙüڤܤÝÞ`ÞÞÞß à†à á‹áÉá‹áÝà=à_àåáåIéÎí™ñÞónôÓó0óËódö û4Úê iÊ"HÛ_BÅÔè" &à'—',&ò$Þ$!&^(Ø*¥,Ò,Ê*x&„ øÃ•Ç UÌZ(¦ÿÍúõúî3é*äjà•ÞÈÞdà.â"ãã›ââªáBáÚà­àÁàÝàŸàÐß·Þ%Þ÷Þ¢áãåìê’ïâòbôTôºóÐó¨õù%ÿ•ô 2„Œ[ú]`E€~ #Ö##""R#®%€(Û*Á+L*5&÷²­¾ lºD?ÌAþeú’õdð{ëç‡ãHá»à°á3ãLä äŒää«ä¨äeä äÙã¯ã6ã+âÚàÿßšà-ãŽçÔìëñÊõ×÷3ø¡÷P÷iø{ûg‰è f†èêjù]r— (#i#Ú!Ðžíš #¨%\':'˜$þ« ”ê‘òþJýîúd÷Ãòí.è;ã ß7ÜjÛµÜC߸áAãÙãä>äLääÐãÙãä3ä±ãµâöázâå¦é¹ïögûºþ„ÿþ—û¿ùú?ýp ó  g“5´qŒù\ Ù#%$Ž!k¤vx!õ#&ã&e%@!áUã pŒPýjû úXø¢õÉñíóçµâÀÝÍÙÀ×+Ø{ÚcÝšßÏàzáþáMââ”á1á,á7áÏàÁßÞ6ÞÇß¿ãáé1ñJøÈýÕgpLÿ]ÿ{ÕÚ wJPµÐ×­¶.Ü^"`$G$™"s çz8Í ‹"#í"* jN¦ qý8úû÷ôõnóHðÀìébå‘áÞªÛÛ[ÜyÞ{àóá+ãbäNåpåÂäÈãíâ+â.áÁßFÞ¡ÝºÞ âfçøí«ôCú›ýUþýVûÍú‹üàYájMƒ›aP¿É!]%l(D)4(p&$%Þ$Š%¹&É'ü'‰&#ˆ¾›ÃÎþÍú|øgöìóÁðíËè0äZß¶Ú×ÕúÔÖ¡×5ÙùÚÝß~à á#á ááƒàvß ÞÜÜÜÜ®Þââçøí…óa÷òø¡øª÷§÷©ùþy Š©€Ù%=ïóÝ:f?à!Õ%Ý'å'î&'&'&æ&+(¬)Ø*é*.)m% úÖ0k ¨×{0þ”û…øéô»ð ì4çÜâôßéÞj߆à™á¡â¿ã¹äåväOã(â.á/àÈÞâÜÿÚÚÚÝ7áræ×ëQðøò˜óóœòÅó)÷°üžï mýëpžPŸeÚuà ˆ#ð#ó"î!Ò!Ÿ"$¹%B'Ú'³&B#µ Qe «M„þ1ý«û·ù÷ìó$ð ìèå·ã*äŒåçfèÊé5ë7ìuìì†ëë³êáéiè™æ@å奿æénînóê÷éúæûûù¯øÊù^ýÍ WIÉÑ$ð#:xðÊÅå¨ /!Ûþåþ3- P"Ö#Î#Ÿ![Æèƒ ùW{ÿÃüúÁöÎò|îïéWåüà¡Ý#Ü¡ÜIÞüßáíáËâžãòã·ãOããçâ9â¾àÐÞqݲÝ'à¿äìêÚñlø4ý;ÿ„þ=üFúIúý™ì É¡#º§9çàL´}"%$R#!ïß0æ …" #å!XäfÚ EÃý_ûºù9øaöÓó†ð€ìÔçÎâ3ÞBÛ¹ÚVÜÓÞáÀâ0äWåÇå=å;äyã(ãÈâÌáàIÞÝ¦Þ¾á¾æíôvúäþphÿDýöûÝü~uË ¹áŸ/h¯Wt"·$I%D$ß"#"P" #>$]%ì%2%™"1™ªè z™cþãúÎ÷Íô°ñqî÷êç™âòÝÚÔײ×êØ\Ú»Û(ÝïÞuàáÄàà¥ß*ß6ÞrÜFÚ©Ø´ØùÚ‰ßùå“íõû+þAþƒüÍúÒúoý§¯ ,ÁSËå¸Ûƒôˆ_ $\')í(Æ'¾&\&š&,'Æ'(S'%5!Ì>+ ÅWÿÒûù‹ö%ô¸ñïöë èÈã¶ßêÜܝܸÝFßšà#âŠã0äÓãòâBâÎáEáà`Þ¤ÜèÛöÜàÇä³êÝð&öeù>úkùŠø*ù#üd<ìo½x˜Ü×Ôãáõ#Á&»'€'4'Ž'o(w)W*Ð*h*œ(% 30W ÷N6þYûtø„õòCï‘ëdçã‡ß‚Ý Ý–Ý8ÞòÞà”áÑâ0ã¸âíá&á\à2ßMÝÛ>ÙìØ°ÚÞÍã¿é@ï6óõÞôìó½óõäù=¸§›q\„›¬àF('!K"Ú!!H!‘"v$u&(Ô(l(T&}"M¤Hœ Ë ÇAë„ÿåüúù¸öóáî‰ê¢æ0ä¦ã ä#æˆçÐè5ê—ëuìˆìùëë±éÑçQå‚â,à8ß)àãŽçÜìò/ö]øwø÷ õmõ€÷üSZ Š›Þ›|å Ž c k²¾>ÕYÞí3|:‡/ OuÚ?} 7ÉWÿ»ü±úÜøâöôÆñ‚î¼ê‘æ§âà‡ßá›ãñå×çé2ërìíìÔì¸ìÀì}ì~ë˜é–ç§æªçÊê¶ï¿õ üœISásÿ›þFnO ‰’.û’ER 9 U÷òU‰r^tOj#´L¼¶é ´5µü*úGø³öúôâòCðöìíèpärà(Þ*Þÿßzâ¿äªæUèéÊéDéèèŽçaæ;ä¢áÇßÇß(âÃæêì²óúºþô-ÿ6ý¤ü|þû‚ Øz™†ëıÏ-}£E!æ 6omKÌŸk¤wb~s0 k©þ)û·øóögõÎóò!ð¡í_ê}æ¬â÷ß5ß_àâ÷ä9çeé\ë€ìˆìÒëë5êéÚæ±ãpàRÞIÞÄàŒåì`óú±þŒñÿþ‹üµü;ÿûI ënæãÎ Üt@nr"&&(¸(“(™()ç)´*C+W+’*…(ê$òþÙb‰ý ùdö]óNðÉìè·ãWßfÜBÛ{ÛJÜOÝÞÐßÁàÁà¹ß3ÞµÜgÛÚLØBÖ‡ÔÞÓéÔÖ×iÜûá¤çMì5ïNðVððJòSöwü´¶ _*Ÿp:p#i`)v …#%e&Ç&ˆ'û(Ö*Ž,§-Ô-ó,ì*»'#“Z¦ ¸3ïÿÏüÂù¶ökó¨ï~ë‚ç¦ävã•ã-ä’äÊä5åÝå^æSæ³åÓäýãã¾áØßºÝ&ÜâÛJÝSàsäßè¸ìFï=ðýïeï£ïªñØõãûÑ; ß Ç9x ƒ ­ å 5ªù$ø íäæ"Û$†'q)>*¦)Ž'$¬ã)Ï÷ Gšž%ÿHû ÷¬òííDéåºãïãYååæâçGè]è6è»ç׿¶åmäûâ:áßûÜjÛ ÛHÜ8ßã‚èídðíñ¾ñ”ð®ïVðXó¯ø’ÿ°† éÜK C ± Þ } Eã£kZ j ’ø32 ‰!Ú"º#¬#,"ýWïsm !¤þýSü•úXø{õ ò0î/ê°æ¦äÂ䯿®é^ìZî¨ï‘ð&ñzñÔñaòÙòœòBñòîµì­ë“ì{ï"ôÞùÓÿáÃaæÉM ^ ÑüÙ4®w«õ ‹ fžë-˜aŸ\Ùõ‰ƒ€µFè™9]þIúüöyô…ò¶ð£îìõèYåiáˆÝ‰ÚZÙYÚåÜãß…â±äræµçRè|è¬è;é éé&ç´äã6ã¼åbê«ð§÷+þþb_Ù&³¸Î ¬Õ   áÀsÅ(¡–¼ ¤#0%Ó$#ÿ e1XÈ+{¾† [þú1÷õ6óañ~ïzíëÑçä€à3ÞõÝß<âÍäÚæyèÊéšêÒêÏêëšëÄëÇêièbåøâBâÅãrçÌìõòçøzýýÿpŒÿqþJþéÿi+# BäúïU½Šû2Vh,!.#Ü#µ#J#Ý"…"P"<"1"¨!ï¢ß, ݆üêø¶õ¬òØï?íÁêèáägánÞÃܸÜßÝpßüàzâäƒå‰æöæ ç#çXçMç¸æ‘åpä"äCåêç»ë'ð|ô øIú)ûüúmúyúãûøþDÑ µ ` ‹ ˆ U¤î´}‰ K"â"û".#Ù#Ó$é%Ì&='ñ&¨%1#ÈÄ‘cpÝ §«ª~ÿ.üÜø õ…ò•ï íªë~ëHì<í·í¬í|í…í½íÓítí€ìë8éåæ8äªáúß¿ß=á$ä»çëlí`îî?í¡ì+íeï‚ó ù%ÿŠ1© Z Boƒ™• f ÷äU~8ÞbÁ©‰ Ä!Ä!@ <|Íp œ&W¡þ‘ü÷ùëöžó)ð™ìTé#çµæè{êêì·îéïÊð‹ñ1ò™òÃò½òqòÉñ»ðkïOîçí’îmð(ó/öíøÊúšû€ûûÒú”û“ýÌÅÎÿ – l ö F I | æ S  v1ìÒýQ>«Wî&ø/…y‘ á<þ=üút÷Zôùðíxê>èaçè¦éŽëíðíqîÅîïï÷î›îçíÀìëAéÀçJçfè2ëQïøó3ø'ûƒüaü\ûZúNúæûQÿ  P é¼Ât ¢ ƒ [ L5Ÿ¡+×ÞÐ2Ä_~Œ+v ¾ðÓÿGýûùÿöÂôBòï²ì¼éîæÂäÙã˜ä»æhéÏëˆí©î{ïð­ðdñwòËóòôeõïôÎó§ò9òóxõù ýšþíºðB^Àx ½ «dí»aB€GÍEÃ! !Œ vtÆVö—Þ§'³ü r`Âÿzüqù‰ö¡ó—ð`íê¥ænã¾à ߬ޗßEáðâä äÊäÅää]ä'ä'äQäTäáãÙâ°á áwá9ã7æê+îëñäôùöJø>ùNúü¿þ4ôk 1 "kpg…ðÄ15kE!B#I$½$%O%%˜%Z%Ö$À#Ì!ÃÂHÁo f ’öþ_ûcøõþò‰ð;î1ì¶êêsê€ëªì‚íçí î%î]îºîOï!ðñ¾ñ×ñ&ñàïîµí½í±îdðcò0ômõö=öPö³öÉ÷ÅùŽüÊÿß5‰ü޲Œ þ ÞQá¥ÕÏßí©äy3ã¤ä7í  M§yÿöû(ø;ôrðí5ê+è)ç<ç èûèqéAé©èèßçènèêèIéTé½ètç¾åAäã ä¨å èñê“í ïùð×ñ¤òøó:ö‡ùµýJ¥0 ƒ z ‚ ^ ½ òîˆrvÙwt[(AT ô ® 0‰_à ’ rj(m&ýùöËò5ðîäínî«ïñðªñ»ñxñVñ‘ñ òêò½ó]ôyôÐó‚òùðæï¼ï‰ðòäóõ€öÉöröÝõ~õÏõ#÷nùoü·ÿ§®Œ\¿`ØYËî kÀ\×—ñ¨ØQÒ°F»`Ï ™ôç4«ÿGýÿú ø¹ôñ›í’ê`èMçwç‡èïéëÌëìaìÚì›í‡îïYðÌððÍïÂîîZîÒïXò{õžø2ûâü§ýÎýºýõýòþã¦Ä¬ ã  c ð U •«q±4¯í&ü«ÓK¾°±‚F€Æ ‰ ÚŒnBÓþñûŠøÍô#ñßí7ëbé|è¤èÂégëíìâíAîLîcî´îCï ðôðµñüñƒñbðïIî„îñï[ò/õÀ÷yù-úú•ù]ùäùuûþý7i| ® = š   •³Jw©Lc}ùÔåÑH÷ž;, ëøêý»ûÍùÜ÷°õ+ó_ðíÊêyèÃæàåùåç¬èeê³ëgì²ìÜì(í¬íhî]ïgðVñÏñ­ññ8ðÕïQð¸ñìó‰ö(ù~ûlýõþFŽ ÊÉÎ  4 Å¿ð5ÁTªtŠïæ¼Â T !  yYàó F ÅN¦ŒâüÓø«ôñðêíÆë†êêhê!ëÌëìšëÄêìé`é-é3éZéé¹é£é(éXè}çþæ<ç>èØé¶ëzíìîýïÄðƒñŽò0ôŽöùëü8 biº @ + y º õ|¦÷°ÏkÀù*Ç[;€  âÉ©9LÿÉûè÷ôÒðIîªìöë7ì%í>îõî÷îeî¤íBíqí>î~ïñðMòLó¦óGóò»ñgñÃñÑòhôBöø¬ùéúñûý‡þs»i` á Ú S } ° 4 <Å—n¨ÉÇèPó–âiö›‘R: |'(a®Åþgükù÷õXò ïaì—êÂéÓéšê­ëœì í íÑì»ìöì“íhîQïðxð_ðÇïìî3îðíRîLï¥ðþñóÐó3ôŠô/õuöløûóýÚw†öÚn ä F + vàÂÇ:d€²íë,š3!Ú Í </| 3ÿˆý{ûù\öÖó¾ñ8ð]ï;ï¶ïðœñlòâò+ówóôôô ö)÷øqøXøÔ÷ ÷NöéõöÝöø’ùû^üoýRþ8ÿH‰û„^q9 £ È Ó ý ~ s â ˜Fœuõz#ÌrT8œ + èì6ª$yþ™ümúó÷/õUò¨ïníÏëéêÁêEë:ìBíî±îïLï’ïéïTðÏðPñ»ñåñ»ñSñèðÊðñþñ]óõèö¬ø0ú~ûµüþ±ÿ°øHˆ # w Šh5 ^çgœJtBðª}Y&¶ÍI)´ £ JáĹÿ¤ýgûêøEö¯óañ~ï0î‚í‚í îÙîïÿï!ðð$ðKððñ¾ñfòâòóðò“ò1òüñ9òó ô¥öÈø³ú1üRýJþWÿ”¯\öXn 0 ´  † ) # ‚¶õ±g^[Ú´íª'» È×CUý*úÉökóNð¡í¥ëeêÞéýé‰ê=ëÌëì4ì?ìaì­ì íÀí‡îTïúïKð@ðýï¿ï«ïéïŸðöñáó2öŠø’ú=ü›ýÿŒSDKJ$ ¾ /Ž3÷–ÑŠÎÖç 0'ËûªÛÀ”~– ¹ · iÓþÿôûçøö“ó”ñ$ð]ï5ï¦ïYðñuñˆñaññæðÁðÇð ñ€ñ òiòtò4òÆñdñ#ñ)ñˆñ^ò•óõmö¸÷øøWúôûßýG‡šR£ „ d °  µ ˆ ‚y@Ýr.ÎOD‚¤ @  H®E!ªýúú.øbõµòQðcîíSì:ì²ìívîFïïïrðèðzñ&òíòÎó·ô~õîõñõ”õõ„ôAôRôÓôÛõH÷õø¿ú‘ükþg™úuï K i*m,ƒ¡¯×1Ñ©ŒC°Ì¨dôLLðKœ ¾ õ MÏWËÎýVû½øö˜óKñZïêííÔìíží;îÈî$ïOïWïCï8ïIïpï«ïôï/ðgð‘ð¾ðîð4ñ°ñ}ò©ó!õ»öUøõù°û‹ý•ÿÄjÀÐ o € 0ø wA\{u%¤õ ÈÄ'Xu Œ À e¤Ÿ_ÿýÛúÓøÿö8õtó­ñð’îˆíöìóìfí-îï!ð:ñMò>óôÊô\õÒõö$ö÷õ¥õNõ!õ'õ’õ‹öøú&üþ´ÿ=ÀFà‹I ³ 3ôp¶Ý u) Â$>"Í01Ì!Rƒ   …üZr*“ýéúcø!öôPò¾ðTï(îMí»ìzìiì}ì–ì¾ìêì%ífížíÎíûíî9î;î-îî+î]î½î]ïmðò0ô€ö²øú#üžý3ÿ 9¹cô . ìÇ ë‹ŽÜ8\&œ¾zÁ„ÓàÍÉ à  MV‰Ðþ ü·ùŸ÷ãõ`ôó¸ñ{ðkï´î|î·îIï÷ï«ðYñùñ‹òøò6óDóAó0óóÜòò<òòðñòºòøóÛõ ømúoüþQÿ{ÁG*Y¯ ô Ç) Žˆ?Ž?ðÅÅh§rë>ª E    óuÿôûøøPöô+òŸðIï+îPíÀì‹ì™ìâìJíÅíLîÍî2ïmïïï«ïïïFð—ðØðñ7ñ}ñëñ§òÜó—õ¸÷÷ùüþýÇÿŽÁP ™ Ö‘µ?Jöoüè1Î…Å͇áÎx¯l 4 ý ± +Q{½þ üÙùö÷döõìóçòòMññðîð=ñ¸ñ<ò¬òó<óZóOó<ó9óOó‡ó½óÙóËó¦ó‡ó…ó´ó;ô5õªö]ø'úëû“ýQÿ/G£{ § [|·3Àžì«¢‹&Vx_á+ u ø Îå) ˜Éÿ<ýÛú½øÿö¢õyô]ó1òöðÇïáîcî]îËîvï2ðØðSñœñªñ–ñrñoñ–ñóñfòßòOó´óôCô£ôKõ_öß÷˜ùgû1ýÿîIµ" l qúùg\”Ieüÿ1Os_Ùç™&¿^ E  ¦ ùÂVìþÉüû£ùnø7÷Ûõsôóëññ»ðÒðEñåñòóUóAó×ò&òEñdðšïõîyî-î0îî$ï,ðŸñXóõÁö3ø„ùÞúdü9þmðš6y = f û × ‚ X ™ LFFÿ\QÝ" ? ‘  s ¨ y Ì•âýÿ<ý÷úhù…ø#øð÷¤÷÷$öýôÎóûò¯òóò¡ó~ôWõüõ_öuö4ö«õõ`ôÈó3óžò&òíñ<ò6óÛô÷ºùSüžþYl }(>ÕÎú É õynŠX¦ÍEŠOO›r!ò tº 4 B ¹ ÁŽIÿHüáù3ø ÷jö¿õáôÂófòÿðÂïúîÅîïÒï¶ð†ñ ò+òÝñ,ñNð~ïáîvî+îþíþíRîï{ðXòôÚöòø¨úôûûü þeÿ:º # ²ÅIN©‡Åvo€O¡Rr2᩵ è 4 m ] ËŸÅýýùt÷³õ©ô3ôôËóUóòŽñðÞï¶ï)ð&ñwòÐóôô³õéõ¢õúô8ôŠó ó¸òò–òËòUó'ôbõ÷6ù—ûðýôÿ€­²ÖN%A \ LØãm€/°Q\éë Oz, ½ Ÿ Ä ý *  Æ%ù±ÿqýgû£ù3øñö³õZôÜòBñ¿ïŠîßíÃí(îÞî¦ï@ðŒð{ððpï¿î6îòíòí3î›îï¼ïbðñ™ñ6òçòËóéôHöø÷ ú‘ü‡ÿåuý 4 æå#¬·|<(^øäî¹ ­´RÆ/·kJ / ñ ‡ ÚIÿÿDþ#ýüûïù›ø&÷õ5ôDóçò óÐó¹ô—õ7öoö=öõ·ô¬ó½ò ò¥ñ‹ñÁñGò óïóæôîõ&÷øÛùûEüzýÙþŒ“Ð R / ‹ U ‚ E Æ E ô è K  õ Î`|>Å3– ð B m h  } ¬Áýÿ‡þcý°üHü ü³ûûäù[ø‘öÅôUólò6ò‚òó´óôô²óóBòdñ¢ðð¼ï£ïÄïðÄð–ñ–ò´óôô_öÎ÷3ù‡úãûtý]ÿŽûxÖã z ‚ ø ß º É 0ýVaðÚ#Åž²  Ž  =  MwÁ0þü•ú±ùAùùßø|øÜ÷÷öKõ÷ô/õùõ÷OøUùõù!úÐùù+ø#÷4öõõÛôõ”õ¢öøáùÁûˆýøþ÷ÿƒÄ÷lU¯h? ¢  æ O õ õ O Õ = N á Ö¤­ ±{5®¬Ûÿ4ý\úŸ÷Cõ…óqòíñÉñ»ñ‘ñ/ñð´ïúî˜îÍî£ïôð…òôsõmööö÷àöuöö¶õ—õ°õ ö°ö²÷8ù!ûPýkÿ@¡“Ozn Ä 0sJ“O‡e§iwÖqFÀ&. K ƒ • L …-S'ÿùûù¨öÛô¦óûò¤òqòò€ñðïÍînî îIï8ð,ñþñwò“òMòÃñ!ñð$ðôï÷ï!ð{ðñÝñó«ô¨öÅøîúÑükþ·ÿàw'#G \ + e¿¼‡TT 8÷šã¢Ø©O ù , õ  íC0Ì0ÿ”üúø÷Köõ0ô…óÙòòñð±ïîËí™íîÞîÞïÌðˆñò6òòÚñŸñ‘ñÉñGòøòáóýôNöÑ÷ù:ûöü›þ\‹¤Ó,¤I ÿ ³ Gx‰×S“óiêIZû3.!'RÆ Ï —  .çÄÕÿ(þ¾ü”û—ú¿ùòøø)÷öÊô²óíòŽòŽò¸òßòâòªòBòŸñÚððOïÅîqîOîAîcî´îIï)ðSñ¯òôõÁöê÷ùjú ü þTÑT­¬ '  ˆ ª ° Á ð U ð ¡F«´TËAâ ¯ … 9 œ { · Voþùûúáø]øMøwø¤ø¤øRø¸÷èö$ö¨õ¨õ&öùöÜ÷©øAù˜ù¿ùºù˜ùùùÈùú\ú•úÒúûšû[ü^ý©þ}½Ñ•raq£ ï / 9 í DO Ù ¡ ˆ ‹ ¯ À “  ñ ‰ ¢{‰Âý Ô/-þîû®ù¤÷ÿõéôTô;ô`ô’ô«ôôôkóÃòMò4ò…ò"óÙó|ôäôõõéôô;ôçóÀó½óÓóôIôÍô°õ÷¬øú?üÙý8ÿp†žáh?` ¨ Ñ ©Ò,.ö¸‹€‰uQ‚ Õ O [­Õ¦évþÝûhù[÷Ûõæôyôeô|ô•ô˜ônô ôó+óóióôõîõ»öi÷ö÷zøõøkùïù{úû~ûÒûÿû&üoüýêý%ÿš7ÖIƒr1ç´ ´ Ý  OR'Ç7ƒ³ÉÔ×ÁxÛÊU¢ Õ ( ¤@éyëóýŽûù¨ö~ô¯ò=ñðCï›î î‹ííˆììŸëxëšëüë€ìþì`í©íßíîvîçîpï ð»ðlñò‹òó´ó±ô&öø_úÆü"ÿK+ ÒÌÃð{ Y i~}LØ#ÑU¦Ë´J–œ~T-ö¹Fž ¶ | h×Wÿýû’ùOød÷¸öEöæõŒõ*õ¼ôRôïó¦ó]óó–òò»ñ€ñ†ñÔñXòêòwóÖóÖó‚óêòSòò+òíò;ôñõÚ÷©ù=ûuüRýûý›þ]ÿxå¤Hâ- 2  » a õ tÖýäqµ à Á Ä Ö çèÌ’"}®ËþûüYûïùÈøÎ÷÷_öÝõsõõ©ô>ôÎónó"óÔò‹òBòòßñèñ#òˆò óóýó5ôô·ó3óÜò óòó¥õ øØú¯ý@PÑÛ£_VµŒ µ $å6’ÒãæÄ{ïö‘˜S H p ¨ È ·PŒq½þ‘ü¶úWùqøð÷²÷™÷€÷?÷Ìö,ögõ›ôÎóóqòíñ”ñzñ¾ñiò|óÍô!ö1÷½÷µ÷+÷\ö†õõ2õöŽ÷ùƒûPý¡þ|ÿôÿ!@†#+¤IÕ Ñ+ A 3 6 f ´  Q ' ‡ …4ÄLå­ ÇÿìþøýÔü†û!ú²øa÷Hö~õõ õ5õpõ”õ¥õ‰õTõõ¿ô•ô›ôÐô2õÄõ‹ö“÷ïø•úgü%þÿ ùxïÿ´ÿ)â Sh   r j 4  ¢ œ êY¨²cÎþ튻m ‚ F  *|èeÂþùüæú˜ø,öËó°ñðÞî;îîûí îîîËítíí‹ìì³ë\ë!ëë_ëì<íÂîð+ò‡óhô¼ô©ôyô«ô†õ1÷•ù^ü5ÿÆÈ!ã)VªlÅ£ ×  “›-v£ÂäõÍ; }b ~ Ä´èF©þíüû*ù?÷’õIôónóÞó’ôNõæõHö€ö‰ö{ö\öHöSö}ö¶öåö÷a÷ð÷Öøú\û»üäý¡þÓþvþ½ýý§üíüíý’ÿ³$×ít  W A k  : Ú ´„3øyÊúÈ6#𣅠\ W …ìs ‘ÓÿÀýbûáø\öô ò«ð¿ï0ïÛî›îRîõí¡íGííì€ìëë/ëTêké˜è èççUè`éæêÆìºîrð­ñcò¯òçòtóô”ö>ù[üŒÿt¿V:­…c ± d L‘œ6z›¬ÈíûÓX€g5  Ó [¢±¯ÇÿÎýóüŸü°üýMýRýöüHü{û®úúnùáø?øƒ÷¢ö¿õõÅô õùõt÷3ùÕúîûBü»ûú3ù øÉ÷lø úrü>ÿð„ìbͼ—ö§L ­ ¢ 7 € “ ž ¤ ‚  4  ËŽ3ó÷ÿDþÌü†û@úÎø#÷Nõfó”ñðËîî²íÑí3î¦îïLï‡ïÄï÷ïððúï¼ïpï5ï@ïÊïñAó)öùùüôÿ9k ˆiûL7fy  ü œ ¼ æ v ¼ Á l p}J©‡æñÊ mžM¯ˆ > è—cKOÿcýxû›ùÎ÷!ö¦ô|óºòlòoò™òºòÀò™òGòÃñ ñ!ðïâíµì»ëëëãë½í—ðô½÷û¤ýÿ~ÿÿ‡þ`þ'ÿÿ½ö0 ù N·¯z € ÿ  ¢ c £‡Gí } î & ú ; ×Ö{ý±ù¥öôßñTðCï„îÑíí4ì@ëeê¹énééêúêì í>îeïƒð†ñSòÙòóó¯òEòíñòÑòhô°ö`ùüOþñÿæS¸wû\t Ô ÆºÒÄ"|*qeñÜÓo€óÜd»ù''Ù®¶R¶ #Óôžþ¸üûGù<÷Ûô?ò’ï í)ëÅééÂèËèßèßè·è`èÔçç ææä±ãâŸáá&áâäç¼êÞîçòSöËøIúû¶û™ü+þ†ˆ× à ºØ®Öþ t … >WvQ¾¶\Ç2¹n0¬ª ñ  †?ñÿßüZú¤øµ÷V÷<÷÷°ö!öjõ«ôôÎóòó]ôÞô8õ\õNõõ¿ôOôÙóióóžòBòóñëñcò˜ó†õøîúÑýN]n·˜2q â mrµ½ÌŸ¥/vrÚ`´—ñÚuô„0Ê Ÿ_G ˜ —‘äýìúÙø¤÷ùögöõFôžòÏðïzíSì­ë~ë¥ëÕëàëšëëêøèµçgæ2åä;ã¬â“â+ãšäîæê™íMñ±ôt÷qùÂúÇûþüÅþHZ¢Ç w y¢î~ Èf´ÅY’‡¹Lq‚¸:ñšÝe  ”Ô0ÿ ü´ù3ør÷÷ÔömöÝõIõìôòô„õŸöøÂù,ûüSü×ûÐúvùøÒöÛõ8õØô¿ô÷ô õÔö©ø'ûþ:øôåÏ/¿=Õ] x •7¬%™j0ƒ Ê ) f šª Ä F«eFø : f  7–üAø¿ôUòôðVðúïeïZîÆìÊê´è׿så¶ä˜äéäeå¾åÄåYåä‚ãcâSáuàÁßFßßZß@àâÅä´è§í6ó·ølýôGЧá â ‰[³.˜ìD¸îùÉöÆ¥­º`l}=LŸ G|†åü ú<øl÷J÷d÷r÷4÷™öÍõ÷ôkôIô˜ô!õ«õæõ°õïô¯óòNðîþì¢ëê•éýèÐè>évê–ì«ïqóV÷Çú?ý›þÿ8ÿÿÁçú¬ ‚ ü²b ÂáÙM¡õôÛ¶”ŠðBæcîÐ psÿsùýó£ï§ìëmêQê'ê„éMè—æ±äçâŽáãàåà^áâ‹â²ââ4âåáÎá ââGãäÛä¼åâæ“è$ëÅîió¤øÈý7§ðï $ ö ~‹ÍâQÆ@Œ…àCÿãºÇ ”!÷ IéX–‚¤iV-Ï‹ È;~ðýŸü üñû‘û«ú6ùH÷;õcóò†ñ‹ñßñ òëññkï9í¹ê%è°åvã‘áìßžÞËÝ¡Ý]ÞNà‚ãÙçÑìµñãõïøæú7üˆýWÿèQL … ‹ç,­:Z½ ‹Þgè,;–äÜ Á l ? ~ ‡ @mû;õvïàêèç¯ç"é¿êåëXììuëÄêxêæê&ìþí ðÑñþò‚óóDóóóqóòóvôÊôÕô¼ôÂô;õoöqø,û6þ <˜QîÙ ê™)-F4㌞ǴàiÞuUßâ¨Î#G.¼ù :JýŠù.÷$ö ö4öö!õ]óôðeî,ì¥êêTê5ë1ìÆì‘ìxë·é¡çåäã“âªá áîà&áíá„ãKæbê‰ïõ$úûý@»Š‘„ ÞþF1…7¦ƒÎX ‚ Ì^[æ– ] óÛôœV*°ûgölñí\ëëHì˜îBñóõxõ2õ©ôkôÕôöÉ÷®ù'ûÌûrû2únø™öõôkó9ó>ówóêóÅôBö›ø×û±ÿÕ $ > Ð ‡ ï d {QÙš+oSdÖ6ìGO=©µì¶høì‡ * ÒgúYõYñïyîï5ðñ,ñFðyî:ìêyèÃççç·è¼éêŒê´éèæäcâáéßßOÞõÝ ÞÛÞ¥à½ãèqíóò½÷:ûXýŠþÿÒ×±I P E® ÝçŠAn×Ómד¶ÔÇzw½§IȰ nÈýõøõ½ó‚óTôõgö°ö:öQõpô-ôìô°ö0ùÄû²ýqþÑýüù÷ïô‡ó½òXòòœñ ñ†ðjð7ñ%óöùµüÿ,xj«³ÂÏŒ Š&áNC¿?nP œ § å'yµƒ¼yÛlXå § a¢:üø÷Kõ'ô%ô’ô¹ôôtòðBí®ê½è™ç.çGçˆç€ç׿jåXã áß|Ý€ÜÉÛ2Û‰Úòي٩ٶÚ<Ýiá ç^íLóømûÃýÇÿ Î ¶Keˆh÷]É™? ²"È#9#!µ% %Ëqd@ö ²‡ÿÏûUù?øUø*ù5úìú ûúžùÀøOø˜ø©ù7û×üçýþýëüÛúAø°õ…óßñ³ð´ïºî§íŽì¥ëEëÿë îdñgõ6ùÚûóü²üÌû$ûmûýæÿÀ >7Ò/Â+4 } 5ÿacëC?4B4^Üßé Âäýr÷&ònîdìÉë ì€ìgìdë‡é9çÿä`ãâ›âJãQä5å—å@åTä0ãXââiâ+ãäãäŸågæŽç„éÆì”ñ“÷þýÅ ô ^ Ô ê ý ɦ m p!à ïüõÕ\ÌÙh †!Þ ½ÄÔIáÛ|3°ó R]½þìúAøÄöPö‰ööö.÷ÌöØõ’ôóíòó¡óôsõëõ¨õô¡òNðêíšëTéüæŒä6âEàßýÞjà´ã´èÅîÍô±ùÆüþXþfþýþ –V $¦Ëµ×ïÃÜ*¸]–jDÛþ C ¿ ÿ  á d€üöðãê?çCåÍäu呿çèÙçEç»æ¢æXçßèëfí˜ï/ñ òMòEòaòÑò©ó©ôŒõö7ööôõ7öM÷Šù¾üsÖ:Yu4?#$ B 7_®ÿ' uaòþ›ô Ä ø)û,O‚ql–xî UO‚þú¸÷öFõ!õ2õïôýóBòðºíüëë ë»ë¾ì¬íîqíëë´éMçå%ã‹á/àßcÞIÞßáZäé’îôºøÇûDýÀýþ"ÿ=©7 rº¨:~ГŠÌ×[hf^ Ç ' ¾ K + @'®ú«õµñ-ïîîïgðÉñÆòóÙò^ò6òÔòIôVöˆøeú”ûÝûCûìùOøåöôõ”õŒõ°õàõ!ö‰ö:÷qøTúÔü ÿ#á˜Èu N Íå"¬¶TS–‰OTÔF3ÿ­É¢h– 0 ßvþÅù\öTôwócó½óýóËóâòEñLï‚ígì.ìÃìÑíúîÞï'ðŒïîÒë|é^ç¢å0äßâ¢á‘àúß àáãEæeêÞîóòîõ‘÷DøÙø!ú¤üWÛ Ë Öwo4sÁf$SrN·+p^™.ÞW°Œ ¥æÿûl÷*õúó›ó©óºó¡ó(ó‚òóñò+óTõ6ø:ûËýZÿ£ÿ·þíüØúùí÷a÷+÷÷¸öKöãõÇõ4ö€÷ºù‘üZÿjPS°ÏZŽ/ ‡ÿ?,ôò§ Ç  Í â  cUñÓÀ l : [b]Î ® _¢4ý±ùP÷÷õKõ÷ô’ôÙó¡òãðéî(íìªëëëiìåìíÜìì~ê‚èzæ¹äkãcâgáNàIß Þ•Þvß…áÓäLéZî.óÿöhù¥ú€ûßüTÿóoK $<Ó·Lnšwp!Y"ù!; [øÌs1ÀˆãT¯  îOþƒû›ùcø¤÷ ÷­ö=ö¿õFõ õTõNöå÷ÊùƒûÃüDý ýü±ú(ùÚ÷èöKö°õæôÖóªò»ñMñ°ñóeõ<øîúÉü[ý¸üjû@úýù ûfýÇ•#é ™ ( Ñ  5 ã Î ~<b~pZžÔ†hÿ$/º Ù ÕÿúúèöáóÉñdðŒïïîRîíJìàê„é–è6è[è½è;é«éòéïééäè.è²ç‹ç–ç¤ççzç–ç+èvé¸ëýî9óå÷Yüæÿ<OjB a ñ3¾D¬ÝsqWy°•}Âà ® -Ò-Ú7;©ß÷Aô [çØGþ&üZúÖø¤÷Áö övõúôÂô÷ôõxöP÷ó÷Uøtø(ø[÷öyôÆòñWï‹íÒë_ê|éFéØé/ë(í~ïµñOóô-ôôŠô÷õ–ø ü$¤k B 9 w f f Ô Þ~}y$)dÄvÎ4ù-Ñ  HÏ#ýËø8õŽò¶ðpïîµí ílìÒë=ëÛêæêƒë¤ì"î¼ï7ñwòcóúóOôô¼ôõpõ³õÄõ«õõ¶õ2ö÷wø'úüû–ý¿þbÿ®ÿ')—§¶ w’àfJîªãÆ]†äÁdBso—8eáMH‰ã }6Bºþ‹ü úçø^÷öÐô£óò¸ñBñKñ¸ñ^òó¦óúóÙóó°ñãïûí1ìšêFé3èç‹ç.èké$ë(í-ïüðMòówóËó•ô=öáøPüÀÕ { ' m ¢  q-ùwqÂn…:ÒÙ|A½ ” ‰ ª>¹ýû(ùÎ÷°ö õ˜ôºó"óÔòÎòó¡ó„ô õ¸ö“÷øGø#øÌ÷B÷­öBö,öröüöŸ÷Oøù¼ùsú!ûÉûuü+ýäý•þ;ÿãÿ®×`F^k 2 ‹ w … ÊÇÿJ˜ÍÝ­uQçiüš0ˆ u  :]3þ)üpúÜø<÷Œõáócò7ñYðÍïšïÍïNðùð–ñùñ(ò&òðñuñ¢ð‰ïZî3í,ìKë¨ê_êê2ë:ì|íÙî$ðMñ<òøò›ó]ôŒõi÷õùþü2(¥‘ "  , € 'Í/ l^Ý 1‘åæFè Ï¡¨þýšû`ù<÷8õ‡ó[òèñ&òóTôîõ¤÷3ù_úûNû'ûÛú úŒú±úûÒû™üPýÑýþ þÜý–ýRý&ý+ýiýÜýtþÿ¦ÿ@üðnÏ,[O  ‡ ì K ¹ H  õ 5H[@¬? Ø b Ãñï×¾Íþý€û÷ùOø{öŠô²ò/ñðbïïäîúîï0ïïÓî‚î-îÜí‚í í€ìñëVë¿êêéééTéêë‹ìIîCðPò;ôöµ÷‡ù¨û%þîßÇ c“‚gBŸJw&^$yxTJxÓJ¾  c ˆ†]¡þ4üòùø­ööBö ÷1øsùú_ûÉûÒû‰ûû®újúQú_úpú‡úúbú*úÞù•ùLùùùøøõøíøÙø·øžøøøËøRù2úuûóü‡þ^ˆ–•£Ì%› 5 Æ <ne aaTb9Ñ ' D 1çàïþý!ûù÷õóƒñTðšï5ïõî½îvî+îßí–í`íMíwíËí3îî¿îÍîÈîºîÈîýîsï8ðSñºòeôHöRøpúˆü‚þNîkÍ/‹Ëò ô ã Ú ø IÒ}6ì}ÎÂFWïÉ=•¾¢¦›a à  û¹]ÿ¬þƒü¨ú;ùcø+ønøþø£ù2ú’ú¶ú¥úhúú¬ù8ù·øøa÷”öÄõýô`ôôÐóÂóÀó¦ówó6óóòÎòÙò%óºó›ô¼õ÷ø$ú¹ûJýÈþ2—| Ÿ+ ® E J0òæÒF-™ ­ ‡ ?ò¯ƒ‚þ¢üÛú(ùz÷ÄõôŽò=ñQðØïÛï8ðÊðzñ+ò×òwó ô˜ô5õãõ¥ör÷9øù±ù\úüúŽûü†üÚüý6ýMýtýÜý¡þØÿd(éxµ I h    ú B × ˜VðDIýdƒ7 ¬iëT· á 6~¼ö)Cÿ.ýîú¤ø}ö¹ôó óó‚óôŠôÐôÊô‡ôôóÙò6òŸñ!ñ»ðƒð~ð¶ð)ñÆñ}ò(ó´óôsôÍôKõÿõîö+ø•ùûŽüçý0ÿ_”½á2u½ø   ë ¬ Uõ!—ÁekÎ ³ R Ïb)8›þBýüéú¼ùzø)÷Òõ©ôËóqó¦óRô=õ/öñöl÷™÷ƒ÷P÷÷÷V÷Ô÷…øZù@ú7û)üþüžýøýþþýÖýºýäýyþŒÿ# ÚD W ; í¯º Í Þ & ˆ ÜüÒ‘Jûï÷ à d  èòA¸:¬þÉüúøsõåò»ð;ï‡î î@ï!ðôð†ñÆñ¾ñuñ ñ‘ð5ð÷ïãïãï÷ïðNð¥ð1ñâñ²òóWôõ¹õuöS÷cø›ù÷ú[ü²ýêþ÷ÿໞ˜Âiä] ¶ â Î “Lϰ‘R·Šªï† ¤©¨8ÿ™ýÁû¼ùÃ÷öõ’ôìô÷õd÷áøú ú®úWúÊùRùùGùÙù¼úÏûÝüÆýnþáþ'ÿIÿOÿ;ÿÿêþÓþêþOÿ1kŠTÒüìãñ)ƒÑ© C ô : Ï P ¤ ² a ™ T u2ø÷8ÿÆý¢ü»ûæúõù·ø&÷Iõfóµñ{ðàïéï{ð\ñ<òóò`ó…ó|óDóóÀò™òˆò‚òlòBò òðñò–òkó„ô®õÌöÔ÷Ãø´ùÄúü™ýIÿÔyì 1( - = d ¡ ò@xlf|^#ÎXÁã¹9g _ PS„çx!ÈþGý¢ûäùAøóö,öÿõƒö–÷þøú¹û}üÃü¤üKüãû‰ûYûbû‘ûàû.ü€üÏü4ýµýRþÿ¹ÿ5Y!«ÿ"ÿ½þ¦þÿÐÿãÙLe>Å›©ïk£,¢ gÉ%z¡‚û®ý "þiüüúÐùÅø½÷—öFõÅó9òÊð¨ïýîËîïšïFðèðgñÆñ òMòžòøò|óô¿ôQõ¨õÇõ°õõÁõmö²÷vù€û}ýQÿãM©'Õ¬’ N ¯ ›;0;›Q_…–cÙõºD–ÜQe>Ù 7 h ‚œ¿ €Óþ‚ýü®úDùø ÷€öröâö¡÷‚øGùÂùÞùžùùqø»÷÷†ööÁõxõ/õïôÍôÞô-õ®õVöüöŽ÷þ÷Uøµø8ùúùû[üçýŠÿ []©/³Sþûõ Ð ~ ÿ l à t ² À € Ñ ­  ßQˆÊÿDý)ûyù.ø÷öõÞó²òªññðŒððëðƒñ4òåò…ó ô~ôôôsõùõ”ö:÷ð÷¤øAù¿ù$ú‰úû¹û–ü“ý›þ®ÿÝ‚ý‘%  æ æ ˆ ß ü ü  . ‚ Ë£v4¾ ëŸ@ÛbÛ-`a = ñ › 9Õjœ)¨ÿþƒüìúkùø÷Yöö ö=ömömö&öšõÊôÓóÑòßññð@ððôï´ïZïúî½îéî¦ïëð“ònôYö(øÓùbûðüþ@ëyØüüÀ[Ô6   $ Ê † : Ï ( <  ³ 7 ³  s • ^Á±MÅÿMý)ûeùø<÷°öSöÿõ¨õKõõäô õõHö?÷Gø6ùìùeú±úéú5ûšû#üÌü“ýJþÖþ"ÿ%ÿøþÂþ±þÖþIÿ<k Ÿ§²¬ • Y ñ d µ è  E l ™ À õ ([‚c¤  N d Q - ׫k}Çÿþ:ü‡úêøf÷üõ£ôcó?òSñ°ðbð_ð†ðÇðÿð1ñKñPñ=ññãð°ð‰ðuðuðƒð¨ðüð–ñœòô÷õ(øeúˆüXþÍÿ0yÿ²t  o f í  å Ã Ñ fÅøÜk§ Á Õ ñ " U qPÒä™ÿ–üQú|ø÷:öÇõ¥õ®õÏõ÷õö@öxöÒöV÷ø½ønùòùLú~úšú®úÐúüú=û{û³ûÕûãûîûüPüðüçýAÿÚ€ýÛCŒà[çÖ Ê ¨ j … Ù 3c•© ^ r d F " ëÒŠ#òþŽü*úö÷ö·ôÎó>óðò§ò[òùñŽñ!ñÊðƒð_ðQðQðTðHð)ðÿïÕï¼ï±ïÊï÷ï2ð_ðbð2ðéïÄï5ðuñ•ójöŠù‹ü*ÿ:ß;:% Y Ž .µÑ¡ll¸AÑ"–²}2ïÜ d Á é ¬ í³+ƒ þôûvú„ù ùÓø²ø…øJøøø6øÃø£ù¹úÁûzüÌü¤ü&üxû¿úú©ù]ù%ùçøŠøøˆ÷?÷X÷þ÷%ù±ú[üíýÿãÿQ¨×íIÇ4^ ` 3 ¯ wa×?`9Æ.Ž•-Í`Öãvÿêýaüûõù>ùÅøløø÷V÷‘ö¹õ÷ô]ôòó¯ó‡ó]ó9ó óðòóòóZóÀó3ôŒô¼ô©ôRôÂóó‹ò[òßòTô³ö©ùÆü•ÿöá†&õ B h:ŽRq“7&l× aHìiÝ u > L w“xMx´ÿ(þðü&üÉû¹ûÌûÏû«û_ûúú¥ú~ú±ú/ûÚûƒüßüßüoü­û¿úÂùçø ø€÷âö4öeõsôó ó0ó%ôÛõøIú#ü?ý›ýoýýý¬ýúþë9i½] U ê[èÀùqòD G ð[§ögú³~5´Ë[eþýpûùS÷2öÁõ¶õÏõÇõ†õõnôÙótóAó6óRóyóºóô˜ô-õØõƒö)÷µ÷ø6øøÀ÷V÷÷S÷zø±úÃýB¦ry ¹ ~  ó 0Ó¥^´v•"0 î2ëÿ7@îäX ¹ 5  (–ŸìýÂ<~½þ#ýÇûÂúúqùõøtøÑ÷÷Kö”õõ©ôôZô%ôÙókóêòXòÃñ,ñ—ððmï½îþíDí²ìrìÌìþí)ð%ó€öžùüÆýÖþ«ÿ¹J,õ ƒ Õ!îsô«ÅŒÊ—òÖt ö   Å#dH JsÿMü6ù€öyôAóÈòÈòó0ó.óíò‹ò1òòBòÈòŠó]ô'õàõ{ö÷Ÿ÷1øºø-ùù›ùŠù`ù>ùkù!ú†ûý¡äƒuÑö?ûZ 4 OCÚß? f‹¼'ÞÛïì£( ü  ; ž  ›þ& ˜ÔϬþ¢üéú ùµøøf÷¥ö®õ~ôDóò4ñ”ð5ðÿïÐï¦ïpï-ïÐîcîðíiíåìoìüë¢ëmërëèëíïëñ2õzø_ûªýFÿ†¸9;ÀŒ M ±ol¤.Vb®y·5®ÁC%“ Ï * ê(ÃrîÞ"³ÍþÁûùîöÄõ”õ2ö1÷<øòø%ùíøøøøcø*ù@úYûHüßü ýâü€üü­û\ûû±úTú úýùFúûiü9þKJáäQL-Nì²s  l 3nX Y V  ç Þ ¿ ` ¡ƒ7ìÖ–Gþ‹¹sÿ¸ý¨ûŠù²÷jöÊõÒõdö÷²÷ê÷§÷ùööFõô5ôýóøó ô"ô'ôôòóÂóžówóJóóâò¡òqò^ò‹ò(óZô:ö¦øHûºýÂÿSŽ½å š 2³r^³´tºI¿¼ê j Û ‡ –ùùÌ ÍÜlÅþ?ü5úäøcøˆøþøkùŠùGùÃø9øð÷#øáøújûµü²ýAþOþøýlýÆüü‘ûûsúáù]ùùù ù³úHü"þìÿY1rJ™¯_d` ú è x Z þ²ÁK7ar/„ci»r‰Ìð³ü·ÿ þ1üjúïøö÷“÷²÷ øøµønøµ÷­ö’õ›ôìó“ó•ó·óêóôôïóÓó½ó£óŠó`ó.óóòÀò¤òµòó½óéô¨öûøû3þp<©~tæ µ ¢OkÇVBÁ$£k‡´¿Zh\©° Ÿ Ç 0 x„^,%þ€üQû±úhúLúúžùçø øE÷¾ö—öÚöd÷ö÷`øføøi÷—öÄõ õnôÞóUóµòüñMñÇð¢ðñ+òÙóëõøáù=ûüoü»üBý>þÕÿóeå Ê Ò 7 ) Ý ” p ‰ Ç  Õ 8 h Öf<GX4¤Ž÷Ì“þ”üûòùhùùÑøOøz÷_öõêóåò4òÚñÁñÏñ×ñÌñ¢ñjñ1ñ ñüðñ)ñ\ñ¢ñòžò‚óÕô”öÅøTûþÄ9Fë9v Ø € fso%Zñéh£Ó%µˆ}iaYÔ ‘ m s ž Ü ù¥oÌTÿþ#ýuüèû\û•ú›ùøl÷€öàõ†õmõvõõŒõ_õõŠôôóó¬ò1ò–ñèð$ðsïõîçî]ïxð&òô,öøsù‰úTûü(ýžþ¥Ên¼ } Ë € S X } § ž M µ æ  C › " ÈiÑàj|/½þdühúïø ø¡÷…÷€÷f÷÷Æö_ööö)ö‰ö÷‹÷øløºøþøIù©ùúúûrûÁûîû üHüªüMýAþkÿ³ðûÈWÍ_@z ¹ d Ù Ü]`øUª  œ K  ¾ 5 s q ^:,/IÃóøþÔý»üÄûûŒú>úúòù´ùGùºø#ø‹÷÷Éö¢ö¢ö°ö¸ö¨öƒöYööéõ¢õTõïô|ôýóó óðò"óÎóìôxöDø!úÚû<ýLþ'ÿ÷ÿd# ¹ î ž Ô ¯ ^  ¸ } K ô _ { ] ëîCïÞæÖË­:ÿõý‹ü”ûûû2ûpûšûšûrû7ûûìúñúûCû_û\û,ûÛú~ú'úçù¿ù¿ùáù'ú‰úôúmûöû†ü.ýçý½þ±ÿ®­¡h\oœß" Q S  ¡ â ð É ‹ < Ú j ã K · ÃÀ³³·ÅÎ̶ÿ6þèü³û«úÛùDùäø¦øløø¤÷üö/ö_õô ô©óyófó]óDóóÙòœòqòXòUòaòlòfòMò1òò+òò]ó¦ôYö[øyú}ü3þ‡ÿ{r–ô†B Ç X ¯Ç³‰HâMwRÔ A¬`A+û z ‘ 2 q rs×j5ÿ"þ(ý#üûúGùÃøø©øêøù"ùáøUø‘÷ÄööÄõÏõ4öÒö€÷øfø`ø øœ÷7÷÷E÷ß÷Óøúmû»üÔýÂþ˜ÿ_@?k¿VPõL k ` ;  Ã<öœ.¥L˜¡¥¢£ÿ©þÈýýlüÿû­ûmû:ûñú•úú’ùþøˆø1øó÷ß÷É÷¸÷™÷^÷ ÷³öaö,ööööØõmõÂôïó ó–ò™òJóÊôèö„ù:ü±þ°þ˜-ô$»½ ÿ Jb&ˆkk-´þó°Lå ˆ @  üé·cîpøþ›ý[üQûsúÂù;ùÙøŠøcøJø9øøÑ÷P÷¢öÍõõhôô-ô¹ôšõœö‹÷%øOø ør÷ÆöHö!ö}öX÷Šøïù5û=üßü<ýiý™ýûý¦þ®ÿü€ûC/Ì#VrœÉù(²&o¹WÂGÙfëN¢ìÿ8ÿþðý^ýßülüñûbûÂú úWù¬øø‘÷:÷÷4÷…÷ øÃø©ù¨ú«ûƒü ý.ýëüVüŸûûñú\ûiü þ òTm_/!SÚ²ÀÖ Ð ƒ î # &  æ ¶ p  ’ Ó Ãr÷|"þuýÿšÿ%ÿþÈýÚüãûéúúyùùþøùùAùkùù®ù¬ù‡ù*ù½øJøê÷Æ÷ó÷zøZù~ú¨û°üPýoýý7üNû‰ú-úZúûPüªýäþÓÿNWÇÿÿÍÿjuÆ-smiˆ‹ƒŽ™™u dpFû¥gOÿfþ¤ýöü[üÇû@ûÛú®ú¿úû†û#üÃü?ýzýwý9ýÝüwü,üöûÝûÒûàûèûùûü.üƒü ýÀý‚þ3ÿ£ÿ¿ÿsÿìþZþþý þ£þÐÿa.ïuœ[à t  é  € ým°µ|IU-·íÌQ‚o 2 öÛê1—ÿcýšû’ùa÷õËò¶ðïîˆíuì¥ëë~êê´éqéLé0ééêèÀè¦è¬èòèé†êÚë‹íhïSñóŠô³õ¢ö€÷wø·ù_û^ý®ÿ A'¤Å > á ° µ ó D~{V.»T•ìnâ Ñ Ü ß º a à ã Ç ‡ 6öã•OAA6“Ù×¢Tÿþ¾üŒûhúAù#ø÷)ö‰õKõvõ öùöøáøWù(ù]ø+÷Òõ±ôô;ô!õ¥öøú1üqý6þ‡þ˜þ£þÓþ]ÿ@ƒø„d–  8 ¼ ö Ý Y s 9 µqÑYÐþÀý¸ü»û¹ú¬ù–øƒ÷{ö’õÊô%ô¬óRó óó6ó‡óúóvôÞô-õjõ õÿõœö§÷ù ûRýÇÿÂÖ'Ö*tþûkA;a)pbkß" ‹= ¬ ¦ô——/†ÞFÂDÀ S \ 0 ÔV¹ˆ•ÿ6þåü¢ûvú]ùføŸ÷÷ŸöKöö¼õYõáôCôó–ò‘ñðÐïkï ï‘ðSòÛôû÷gû©þV"òçXœ)Be$ß9 ò ï - âE±c} ÚÔׯ—Y¶g„ÿÈþµýPü«úáø÷eõúóó¤òºò9óôæôÁõ€ö÷l÷µ÷ ø¡øcùIúdû¤üøýCÿmgif»og»w…·Í”Ýœÿ_N:­v 5 ‹ ? & V  © þGf $ B >Ç¥ÌQjF ù ¾ Q ‹_Ëô þ@ûËøÉöKõ>ôkó¡òÆñ¥ðFïµíì êéÙè¬èíènéêñê­ëSìÉìí+í#íí1í¬íÍî»ð‡ó&÷YûÊÿ¤; ¹ = ! Õ Ä #  |œª ªƒæ(‘ b ® _ Q ; ì > < Ò¿ç.‹Æ«ÿýÕú‚ø_ö®ô¬ó]ó¯óhôTõ4öÚö7÷M÷1÷ùöÉö¨ö‰ödöö«õõeôÀó6óßòÃòåòAóÎóŒôxõ¥öû÷yù ûŽüßýÐþhÿ±ÿãÿ/ÒóyWS; æ /  ¸ AäØE%\Áña]õIqeý(§|ªU¶ ‡ xýZÿøý[üZúøeõºò)ðßíèë8êºèXçüå±äcãâ¹àjß%ÞûÜüÛBÛîÚÛëÛXÝjßðá®äSç¦é†ëíRî¨ï\ñ…ó,ö0ùSüQÿÚ·Ø_‰³7Hç÷ & *ÊöÆiÙ¶ƒüî2ºª=¡ 2  …uàb/ìò*š@óˆ¾l‰/ž¾±ÿ ÿ¿þ¿þÿ‡ÿFVœÌ‘Ž­ýË¿þ–ýDý¯ý›þ´ÿŒÕTÿ ýÄú–øÔöÄõŒõö#÷wøÖù/ûoüýŠþ]ÿñÿ=IÿçýüÖùœ÷—õô9ó3óúóWõñötø®ùeúŒú-únùˆø­÷÷Áöªö»öâö÷#÷÷Áö$öFõZôó%óióôªöžù(ýãqi› ì ¹ æ r } ýÒÉ’÷¹¾žH/bØeÓð ¸ : £ ɹéOÀ"Ud8áþaýÄû>úÜø½÷ùö”ö€ö³ö÷i÷¤÷Ÿ÷t÷#÷°ö$ö†õéôbôúó¦óXóíòlòâñuñ\ñßñ6ó~õ²øŽü—R,Àûmº]RCÜ‘ õ  ~—*ïDì¨4Qî! 1 K  9þµýù]ôð€ìáé3èwçaçªçètè¦èè6è¸ç1ç׿³æÔæ1ç¬çRè éÖéšê\ë ì¸ìlí;îOïÚðóöú¡þ˜‚è 9Q&Ôq%ÜyÕ¼Ù $X¥)`éHV÷O¢8"]Ë ( H Þ çaq_wýúúøøl÷4ö-õ8ô3óòîðÊï½îäí9íªììdëxêFéÃçëåÂãrá2ßMÝÜÔÛÃÜúÞfâÒæëë,ñöòù²üZþOÿãUn:y × ÷¡«&¸9Ù±¨{ݙʕ9ùô2{• Ô %ËPý ø·ópðnîíqí·íîîðí™í+íÚìâìXí+î-ïðÒð^ñÃñòzòÜò>óóÅóÐó½ó©óËóAôõEö™÷êøú¿ú$ûuûüûþü¦þñ¤€ $ ? Y s á S= ¨ < cL;{6_Æ Ç—Bᬠq=Â"ZbËX ñ Ã=»üÖù¯÷!öõøóåò°ñ\ðìîqíóëêeé©èèé=êìvîñ]óõüõëõ'õ"ôXó%ó´óòô¢öiøáù¶úÊúúûøµ÷ªö2ö{ö™÷Lù,ûÉüÖýXþvþ‚þ¯þ-ÿïÿØ‹¸ÿUý¿ú.øöÐôÂôö–øüáEì ° ¥ è Ô Ÿ } Y  ¿ ´ lñ\Îz‹,‰»Â…± ç ¼×ø 9å’ÅÛÛŽ£šwÁé+Û\  {··.¯îÒyÿþý™üQû>ú3ùøVöýóèðDíhé®åqâ à±ÞcÞòÞ÷ßá(âøâtã£ãã]ãLã’ãIäbåÁæcèCêVìyîð<ò›ó•ôKõôõÔöMø¨úþ<ñŸ ®¤A’õø<&åU$×ç\>P ÊŽÛ5ÄV5µ4ÿ;Ó›*# ; ~Bý*ù/ö;ôGóóJóžóõó5ônôÅôFõ)öE÷øvùÓùUùê÷ÁõóCðˆí ëûèSç&æmå\åæˆçêíÌñ_ö±úJþ露š7 ¢ !–†‡y‹)´’ê§w.ªü\æ³Ä$¥ÏĬ¢ èÓ¼ÿ ü ùÏöWõeô´óóXòrñTð ï¬íXìëïéÖè²ç™æ—åÇä*äºã`ãã™â.âðáâÜâ~äç@ê îò¿õÅøæúüÏüqý|þHß'¿ J jèÅ!=U£CÜ5 Á v v­j`˜õ<#p*  MOÿÜýªü«ûû¼úÐúû\ûVû¶úOù4÷ ô ò¼ïÙí[ìëúéÜèËçîæ‹æâæ"èQê9í{ð“óö}÷þ÷ß÷œ÷Ô÷Üøîúêýlô$ : \ Ç Þ  µc W : Ì & – w H×Læ$·4 Æ"¦ÿžýûüUýþ„þ6þûüéúGøpõÆòšðïî…íþìaìŸëÄêïé6é“èèÎçÉçèÅèêùë›îèñ—õ6ùaü¿þC³afÖŽ[ò $ ¥ _ C ‹ŸäÓÎæèh Ä “ ¦õ· . 4 : A % ÀôÎ{;ÿ[ý ü¶ûSüÜýúÿSy!7µµl ¾¥œ—g b;}ýÂùoöógñ¥ð™ñTôŠø›ýÉ.> Ÿ u C ¬iëEM 2 / a ‰ ¯ ý÷ZþYüôúéùÓød÷õZóHñ±ïÓîËîvï‰ð}ñðñˆñ/ðõí7ë[èØå$ä‚ãïã,åàæ·èvêöëJívîŒïÁð6òúóö1øúíü|ÿ ã©ä ‡ ˜ ; Ë ´ C µ Kó>»1»¹ÅZÞ_¤F½| ûÊ…µèK¬vî‰v&b‹ïË  £ ò¸Â' ü²÷nó˜ï}ì2êžèfç=æôä„ãûáxàßÜÝݟ܈ܑ܈ÜBÜÒÛ=ÛÚÇÙÜØß×üÖVÖ1Ö×֕ؾۗàüæîdöžý…̘ \ ª ÿ©îvÃj #"É"["!W2C úù¶e,š=Ïý•z · _¸ÿîû®ùˆøGø¡ø6ùÙùeúÇúûKûŒûÒûñûÌû2û-úäø‘÷YöQõnô¬ó ózò ò¾ñÁñ+òóIô¨õüöó÷nø<øt÷Pö2õhô>ôÂôîõµ÷ÛùüGþ,×cØ_Û ë °åÜÐØùÙ<õÉ—€Ë ˆ¦‹2gÂÿ_ÿÓþ0þýöüaüÌû:ûúáùçø–÷ùõCô¬ò\ñQðkï‚îní)ìÁê|éžèŠèbé7ëâíëðÅóëõ÷÷¢öööööÓø‘ûÈþó)³:ÎÎ[§ºÇ‰–- x 3)mlÐé 4üà¥ëHVuáÿ|ÿeÿÂÿ‰”z癑|þýàûûŒú'úºù-ùøþ÷¯÷Ì÷]øLùjúuû üü«ûû¼úôúÝûˆý¿ÿ9©³ÎÖiµ¸è}G t ¬ ½ Å Å ½ D ¤…¥÷ÿ¸üºùX÷ÍõNõãõH÷ùñú^ü(ýGý×üüEû¶úúÄúûTû_ûûyúù6ø¢öÊôÜòüðTï%îµí-î•ïÑñ¦ô­÷súœüÙýUþUþfþìþÏï2Gä Þ 8 Œ ò | L v Ù '  R {Øk[É¢×+[BÚ!!ïþ¯ý™üæû—ûŸûãû7ü¤üý}ýÙý-þ“þÿŒÿ_³!³U×þ“‘;þ†ü_û!ûü%þôèþõ ± …îŒÐí 7 ó ‡kï`â õ û ¡ ¥ æ Þ+Çäþ¡ýÆüü÷ú]ù)÷vôŽñ îüëäé‚èåçÜçGèÙèné÷é_ê¿êëƒë,ìíííÂîbïÊïúï ððð)ðrðÌð!ñañŽñÝñ“òúó@öhù[ýÄ$ ü ÿŽw¯÷Ú1×”¥/G½,/‰ Êä¥hŽaÝÏݨôž” ì ëç)Üþ ý—ûhúkùˆø¸÷ëö)öpõ¿ôôXó}ò}ñ\ðïˆíÚëê9èzæ åä„ã’ã-ä@å§æ9è¹éñêÆë,ìMì^ìµìˆíïBñ>ôÎ÷ÄûÐÿ·?F ³ ‚Ê®YöœX9>HBö6ßà; m§ ô {·+Ì‘ÿ“þÔýMýûüÝüÑüÆü­ü}ü4üÄû,û‰úýù©ù±ùõùWú«úÍúŒúìùáø²÷”öÏõ’õæõ­ö¸÷Ñø´ùTú®úüú€ûYü“ý ÿD]L´f<3JtžÈøLØ®»åí  È ; ó'3‚gî‘ trö#!0ÿþAþhþêþ˜ÿ'{u$®ÿ8ÿìþÓþÖþÜþ¯þ+þMý:üû*úžù©ù@úKûrüJý›ýMýŽüŸûÛúú±úƒûÏüRþÂÿëµ <ë×…º^}Œ•ÿ½þóýý&ü ûÙùÀø×÷J÷1÷§÷¦øú¨û+ývþ]ÿ÷ÿHÌ@å§OÂá¯3Žëd#2ƒâ&œÕãÿÿqþXþ¿þÿgBåMriSEUžÅŠWÒ€6ò Œ H ã 4 1 Ï ÿ Í G‰È.àÝ!ŒÿõþAþXýBüû¬ù]ø ÷ö*õsôôÎóìóZôõôõñöð÷Ùøùõùú•ù½ø‹÷:ö õ0ôÓó"ôôô:öÉ÷`ù¼ú»û=üKü üÚûîûzü‹ýÿæ×Å~ó( *  ÿ å ½ c·˜ü ° ] " 7j‰q NQÿ+ýû*ù…÷BöYõÕô´ôäôbõ/öM÷µøZú)üûý®ÿ)½ß¯UƵÒ)­îúÿòþþzýDýqýþ·þvÿ¶Úg û*~ÇíÜ ý F • ÷ ‰ 4 â z Ô ß ž ù ü £ Hhng_ÿlýšûõù‚ø:÷öõ-ô]ó²ò#òÁñ†ñrñ†ñ³ñóñ?òòßò"óZó…ó¡ó©ó“ókó+óÔòtòò×ñÆñþñòDó*ô8õHöH÷3ø ùÖù±ú¾ûý¬þ¨çb  bQÔçŠÈ´`çU¯ö2e©¯ ­ ¥ ¨ © Vü„þ‹H]ÿáþÙþFÿúÿãÄrÔÎXŽ‘˜ÿºþþcýÝüYüÏû/ûvú¬ùáø#ø…÷÷”ö:öÛõ„õõ¹ô`ô'ô*ôvôõÿõ&÷nø·ùæúëûÆü‹ýGþÿÞÿÁ³¡qZNJMD  h A y Vs¤,,¦ÿ~ÿŒÿ’ÿsÿÿAþ<ýüûúùDùLù‡ùÐùú*ú5ú2ú8úLú{ú¿úû=û=û û¼úhú5ú@ú³úšûÚüZþØÿ2?ðOkkkˆÓ;ºLæŽ:ùÛ m ! ¢ Ç Œ ï ú шK-6wÎ4¥QÿÖþ3þ¸ýfý6ý&ýýýý9ýqýßýnþ-ÿïÿ2÷e~ÿ]þ(ýüûúú0ú¦ùcùUùvù±ùúeúØúbû üÆüˆýGþçþhÿÂÿ2p¾=âžq6ì„÷Co{~~†œ¥ª€eTå@yÿÀý,üÊú•ùˆø‘÷°öÏõýô;ô˜ó%óßòÑòõòUóøóÂô¶õ¸öÑ÷òøú=ûVüfýfþCÿš dœÌî +GzËU ÞÄŸMÆþ辤²þ…R C :  ° ð †  j Ð 5 ‚ ²µ‰@ê­†—Íÿ3ÿ›þûý6ýMüKû;úDùˆø ø øJø·ø;ù£ùÓù¿ùZùºøð÷÷Pö—õõ„ôôÂó‡ótó˜óõóômõxö–÷·øÂù®ú~û7üèü›ý`þAÿ@N^fbF­?».ðG Í ý   ì Š ßÚr¼ÉÒøþ^ýü$û~úúÅùù8ùíø¦øcøGøUø›øùÈù•úbûüÉüaýþ¦þWÿ÷»S²µlë@úÿšÿÿãÿ‘x‚…e _mL$8•,ÿ  Þ  € É ü   Ô Y ” ~  r£·Ï þRý=ü=û*úøø²÷Vöôô£óòœññÄðÄðùðHñŸñðñ&òPòwò¤òÜò óqóÈóôhô´ôõšõ_öl÷ÃøIúëû“ýÿgr4» f¯ûZÊNÕjÿ¢Dâk Þ - Q ] I $ ú Í © | 9 ºûåç7—"ÿçýíü,ü¢û=ûûìúúú/ûŽû üßüµý•þOÿáÿ/=!éÿ·ÿ’ÿÿ¹ÿ÷ÿ5WQ!Çÿ_ÿêþvþ%þóýçýðýþ;þtþ±þýþ_ÿÐÿ_ë† €ð`Üh ljPö‚ÔßµJ§àúïÓª}_WÿfþýÏüübû¶úú`ùÃø3ø§÷4÷ÝöŸö{öröröxöuöYö,öàõ’õ8õòô¿ô©ô«ô¼ôÅôÊôÓôúôWõö#÷Šø-úÝûýÿb‹§´Íô&^„ { / ¨ ã î à Ç ¨ { g 8 æ m Þ L Å9°\{k+Ïs3ÿþ?ý­ü[üBüEü^ü†ü»ü ý…ý6þÿë»MŽ‚.°¿ÿnÿÿÂþOþÈý<ýÀüaü)ü üEü†üÉüý?ý‚ýßýXþõþ¿ÿ ”r%žÎ·]ÔG̃ag€™­Ÿgù_Šÿ˜þýrüHû'úùAø–÷÷ÔöÁöàö ÷r÷½÷þ÷.øGøGø3øøó÷å÷è÷ø÷(øløÎø8ù©ùú>úCú!úáù›ùvù˜ù*ú@ûÃü¬þÒþÝM` 8 Þ x œ 1 à XánïY¥Á¶~!’ÐÙ ª Y Û M³©id—Šÿ-ÿÂþ>þ‹ý§ü­û£ú·ùõøzøJønøÑø]ùòù_ú¥ú¼úú>úáù‡ùUù0ùùùÅøløû÷Ž÷7÷+÷z÷+ø8ùsú­û¾üoýµýý(ýµü€ü­ü[ý‚þ÷ÿ†û8-ã\¶P­qÀââ²U×7u›nü\›þÉüÿúRùâ÷¶öãõ\õõõõ'õNõ{õ«õàõ!öjöÁö÷w÷Ü÷JøÅøIùÙù\úÐú5ûxû­ûàû1ü¾ü¤ýøþ¹Ô!l| , d  i f 7 ð ð  ( P l f 9 ë Ž B   / H K  ³  ðÆœ¥ÊnÉ,þûüHû©ù3ø÷öxõõ¿ô‡ôZô-ôôËóóGóþò¬òUòóñzñÝð=ð£ïï¬î‚î¦î_ï­ðžòõŸ÷'údü+þvÿpH&D•ª- y { , ” Ú  4 c “ À Ñ µ U µ è ú õ øóüü÷Ñwé%ÿJýrûÐùø™÷÷ÔöÉöÉöàöñö÷H÷™÷ø¤øUùúÞúŽû7üÏüJý¬ýþDþtþ›þºþáþÿsÿúÿ®€Sžõ(`Ø’{wUð( ûf‘” Þb0;WkZ΂G+0GUJ…Òü8ÿ|þõý§ýwýXý6ýðüzüÏûôú÷ùù?øµ÷f÷J÷J÷S÷V÷<÷üö™ö/ö¿õ\õõõ-õ«õ€ö¡÷ùŒúüýžþpÿ{ù­Ž¦Û ²ùí‘ ƒ ¿vNúe“œ‘†˜ÿËþ"þˆýßüüûúòøø“÷…÷ø%ù úYüþ±ÿ #ó|ìQ•® NÅý ü ;ÿ£þXþtþÿ aÜDb 2Ø-nÓˆ¡"ý :[] - Í F ­ ­ Œ C Ç  À:×2¹ÿ`þý¨ûòùê÷õ3óæðÛî?í,ì¢ëŸëìŸìUíòíhî›î›îkî;î-îOîÅîï†ð»ñ óZôõrö.÷¸÷1ø·øqùúüûÖýS‰D  ® C ÿ ó `šœHˆo ¨/ÍpW$Â+ ¾ k " ðãæïܯYáÿOþ»üQû'úRùÑø“ø‚ø…ø¦øÅøùcùçùŒúKûùûrüœüdüÄûÊúù%ø¸öYõ'ô.ózò(òMòðò ôõ€÷ù‘ûXý½þ«ÿ8‰Ï/É¡©ÈÇ¢<™¾ÎÜèùþë§&x®ôe;hv;˜&’ÿäýPüæúÂùäøUøøÔ÷¯÷ƒ÷7÷Ôö_öæõpõúôŠô%ô´óLóóò²ò“ò™ò¬òÜòó‡óôéôö€÷Aù=ûJý;ÿæ4(ÜQxùÞ ÿ 0*Éó§õûðçܯAˆrnÔ _ 0 U À^Ü)®P¼ÿnþwýÌügüü»û=û—úÛùùiøí÷¤÷}÷^÷ ÷¨öÝõØô›óXò4ñHð¶ïï«ï'ðîðíñóTô¨õÿöJøù®ú³û–üoýOþCÿ_¢ûe®Á}ÜíÃgö~Ç„FÛÅé@«YVÿNW¸Kÿíý9ýöü ýžý3þ±þáþ©þþýýÄû~ú`ùzøß÷€÷<÷ÿö¸ö\öüõ«õxõšõö÷iø$úü þ÷ÿ­0„¶×ö" W Ÿ Ô å ·0;Ù Õ Œ Z <V¢/Þ„|½Î¾‘_ÿ6þýüôúäùßøøM÷èöÒö÷§÷Šøù•úuû üzü”ülü)üÚûŸû”û¶û üzüþüoý¸ýÆýqýÏüæûñúúvùUù¿ùæúÃü"ÿ¾L†Gk ý  ø Ó á  k Ä * ' æ ; Û k ÅÆd ‚!–ý!ûïø?÷!ö‰õTõ;õõŠô¡óUòÁðï¬í–ìùëëëiì^í©î$ð¾ñRóÛô\öÔ÷;ù„ú¶ûÆüµý£þ£ÿÇï@<ÎùÀaóÉó‹w› ± æ Ý š N = ‘ \ w ½ôü»B–ÀÌ×âøþêœg¦Âê # Y j W Y\û5 ýäùÆöøó¢ñ¶ï0îßì­ëeêé²çSæåÐãºâÉáüàmààéßìßà‰à1á(â`ãÅäEæÆçLéë6íðÎóøaü‰(c * ­ 0Þ¾ÅÒÉ…Ø’¢ß€ ƒé(H v µ,ìØò%fŽÿZþcýÔüÃüGýGþšÿü+ð9 ‚Æé÷ÿÿ(þ[ýŸüÿû{û ûÄú¥ú®úãú2û†ûÕûü)ü,ü üüüÿûü.üdüœüÚüýý ýý ý4ý[ýýÜý0þþÐþ;ÿÂÿb!îÉ¡býWZ]tio¢Åÿ£ÿŒÿ|ÿLÿúþ‚þßýýKü{ûÄú$ú¦ù6ùËøJø²÷÷@ö‰õýô¹ôÇô'õÇõ}ö:÷Ú÷[øÃøAùú:ûýTÿîÄnc ž I ¯ –ƒÔ| ‰ † N Ï   â u Ä Ç (ÁvkÞ'“JùÇÿúþ›þ¬þ ÿÿÊÿ·ÿ5ÿ]þ[ýVüŒûûæúØúúýùßøP÷Œõïó×òˆò(ó¦ô»öøøñú=üÔü×ü™ü‹üóüþ¹ÿÒêšÏShOcÜâOín„6öšZÿtþçý½ý²ý¤ýlýûüiüÄû!ûšú@ú úïùÐù’ù(ùžøø­÷z÷§÷(øõøéùÐú†ûöû&ü,ü,üMüªüRý6þ-ÿÄ«b Kà¥i©>,ÌÓ  cmùׯëñ„kÍs=ÝÉæ]E Ê bÆY"þü>ú‚øèöpõôûòò4ñŒðð‡ïï¬îIî îêíîRîáîšïbð&ñ³ñùñ×ñMñ\ð;ïî+í°ìßì½íhïµñ„ô§÷Þúõýã“'¤ ˆ Öè¤çÂ:bmjr~x@¿Û¤4ÁstÎ i ( Ú H H Å Ì—M&"ÿ4ýNûeùd÷KõóëðïîBíì2ëÁêêjê/ê·éõèøçèæôå2åÅä¶äýä‘åaæXçwèæé°ëíí{ð3óØõ.øú=ûôûgüíüÖýFÿ@˜tW Ÿ V Á . ø eu'Ýý‡ ­!°"Ë#"%¥&7(‡)F**Ù(&w#õ}XÉÓR—ºV ‚ o[sÜý—ûùl÷/õ¡òØïßìæé ç]äþáéß%ÞªÜjÛuÚØÙÙÂÙ/ÚØÚŽÛHÜêÜqÝõÝ£Þ¹ß^áã1æéìÙî)ñåòôÕô{õ4öP÷êøû²ý‘q|¦ ³ Óˆ^FƒàTìÔZÃ\Lœ / Ð fÕ5º–þ+›€fõ ì * ¹ Û Ñèar?Ð ´}2†Ïö,Ö‰ ¯¢já±ežÛÿûüÍùœöÈó‹ñ ðIïï;ï®ï\ðBñlòÂó@õ»öû÷½øÈøû÷_ö'ôªñIïMíèëEëxëXìºíkï&ñÆòôýôsõŒõeõ'õìôÕôáôõeõÝõaöåöE÷l÷^÷ ÷—ö/ö7ööö·øbû¿þU¥G ý _ ¼ ƒ û *Ô’ç†\Ç y((R|`Æ‹±iÝG¹ 6 ¾LÆFÿßü¨úÙø}÷—öîõQõvô3óŽñ˜ï“íÆëêïé$êÿêJìÃí'ïgðañ4òó"ô~õ&÷ßøsúÄû²ü[ýþòþ”{Z (N3˜z5S ‰ `7&í( F Õ š ˜ ge£  –¦  Ð " 4<Q{q³3ÿü]ø›ôñ î¾ëIêéeé˜éÞéê5êêÛé|é*ééRééé±êŒëaìíPí<íÌì#ìgëÁê=êê8ê)ë íÿïô(ùõþúÇ ý`óÊ ÑL š!Ú"$ %Ø%V&p&&8%$Æ"¥!Õ T  ìÅs·wš0p‚¬ Ò ~Ñùü´ùVöçò„ïBìDé­æŒäíâ¾áàà7à®ßßsÞºÝÝXÜÁÛ,Û†Ú¼ÙÜØå×ùÖ^ÖSÖB×bÙÑÜoáöæíGóûø¸ýBÂ¥H  X òªe˜ ÍŽ"L%à'*+,=+J)~&…#!e½·òÖÆN:¸C ›‚þ’ùöôóòXò­ñ¥ð'ïwíëëÒê\êêCëì¤ìœìãë—ê é§çÉæ¥æ<çAènéxêCë»ëüë,ìwìíõíïñï”ðæð ñ^ñMò'ô ÷Äúøþo‹ ë†wsÿ(ýüPü¤ýŒÿƒ<Âj™¾ é¦Z v%c)±+/,+¸(ú%…#Ý!d!ÿ!6#]$¬$¬#$!#èè— ¶¶èü$ú ø:öbôcò@ð îèë$êýè©èTéüêíÇðFôˆ÷úŒûÒûúú„ùí÷»öHö¢öw÷Døžøø€öôÇðDíïé+ç:åäºãýãšäQåùåŽæ9ç6è©é€ëží¨ïYñPòoò‹ñÍïíYë·ééáéì¶ïyôìùhÿk…† c [©˜yfff]Dê 4 ! Ò ž ð9 Ê É dV"Ê&ø)¨+¹+k*(s%6# "?"Ã#,&Ñ(ú* ,—+k)y% ©þ¸ ic‰“þýÄûpú ù‘÷ö‡ôâòñïÌì÷锿ËâÖÞÛí×­ÕmÔÔWÔàÔFÕ2Õ„Ô-ÓJÑÏþÌ^ˑʼÊöË6ÎaÑdÕÚßä‡ègì’ï4ò ôd÷îúÿ2ƒ ñ×° Ï!"r!„ é ÿ V"ˆ#ç#í"p ª9þÍOÓT¬N×o[ðjÝQ¼ç¬ÏLEâ A ŽÇÿ ý³úˆø:ö©óÕðõíKë(éÑçtçènéîê)ì¡ì,ì¹ê]èeåâäÞ&ÜÚçØÐØÚÃÜ?áiçúî ÷êþŒ¨ 6m¢SöÀvr"‚$T%Å$ù"T V`¸N!T½ B   y › • û“TXïþxû?ø”õó×ñmðïííÑìÚëëIê¹éWé6éFéké˜é©ééRéÂèççÒæ¶å±äõã¡ãìãåçê²í³ñ¨õ3ùÚûoýËý1ýüØú*ú\ú‰ûžýH<5  EæòOœ"g&D)+à+@,¢,f-©.50š1,2C1z.Ù)À#ÔîÊ ß,ZDÚUýù›ôðfíNëIêê;êKêäéÅèüæáäÔâáÁßÍÞ ÞkÝøÜåÜXÝÞ—àyãçúêºîÉñÙóáô5õpõ@ö øEû~ÿFûö ÍKjmÀù ³ 8 ~  œ Ï ù œ >ÇA ‹#ô&^('û"x˜³ ƒÿãÿ}“^|ÿ~ûùöœòï»ìöëaìUí%îyî>î“í}ìë’éMè™çªçèêHììîóñõû÷@ú­û^üœüÌüMýkþ:Ž SþÅ Z ¢±÷ ý¬ùS÷EöŽöþ÷@úÌü3ÿN6 ÏD-  Ô5Suü<÷qòìî^í6îŸñE÷nþå ?¹[z†œoy¹oW^ Ààlü9ø öröhùqþ˜± ±ÑÃÆ¨t  J~6)Ù¦ïA v„ •Tÿ'ûø„õ óð‹ì¡èÅäYá„ÞBÜKÚtØŽÖkÔíÑÏÌ]ÉJÇHÆ‘ÆíÇáÉ ÌWÎÝРÓjÖ Ù\Û|Ý—ßÔá]ärç:ëÒï õvú˜ÿûY ± : ÿ Ù Wvòm%*½.Ì1…34–3É2#2#235­7L:!<¥<;Ü8õ4‡0€,‚)§'{&v%;$À")!©1°ã2Y ®šÿ‡ù²óhîêþæåúãõâzá8ßHÜÙ#ÖÐÓ+ÒÑÐÅÎÍèʡȔÆ÷ÄÊÃÖÂ×ÁŽÀï¾û¼ôºb¹>¹™»dÁ#Ë<Øðæôô—> 5.ñfŒò•%®+:1`5³78~6+3È.n*'È$^#ñ!é ÕSkº w cÛ‰¨L„ æYäý,üü&ý„þ·ÿƒëÿݹ”{:¨ÿžþýûÜø™öyôaòðJíêœæ•ã¤á1á[â÷äÜèží…ò‹öçøIùøùõÂóò#ñ‹ñnóªö¼úÿöK" Œ ¬ •\˜Í¥aqAðF ž#g& ([(¼&ð" ´ß ŸÇÚü¶úõùú-úáùÃøÿöõ.ó»ñ¨ðæïkï*ïçîWîDí×ëŒêúé~êùëûíýï‹ñaòŽòPò6òÎò£ôÃ÷ÁûÐÿþ¼âóסDH%0 ÀŸþþ!ú}öôºòqòžòºòzò.ò…òeô?øçýÖB f`o ú¾aì# E %çY«â|D òÿ:ûÙø ølø8ùÅù©ùøø­÷¿õóÊïPì;éçægæè ë÷î3ó÷úîû™üaüÕû¨û?ü¸ýÛÿdýP Ë q Mîÿ.‚ ¢ Ûf–.‰ew E ñ / ˆ = ¦ [lˆü¨öÏñÅîîïðò7÷Cûþ0ÿ±þ&ý5û›ùíøOù¼úÃüìþ®­³³Ðþrüúø¥ö«õ/õWõ=öøàúnþJØ C Š w“1Vë™ %H·Òþ ü ûKû§ü£þŒ­³¶3ÿÈý ý+ýÔýþÈþ%þ–ü2ú<÷ýóØðqîlíî,ðó¶õ§÷qø ø¥ö ôžòlñ­ñ½ó^÷Ìû@(<‡ ú b „ M^>þdü‹ü0ÿOV øä"Ý"Ú!|^qz 2å˜þ>C 9äšx½óÔy[õÊ - ZqÒýµ÷èðé á•ÙhÓáÎ1ÌPËóË|Í5ÏxÐÑ#ѶÐÐeÏòιÎÎΠÎKÏ ÑõÓt×ÇÚfÝß àràëà â¿äRéÞïµ÷´ÿ& ù[¦#j Ð$>*0š5 :=ˆ>#>æ;?84N0‹-ë+'+ä*£*3*f).(Á&_%0$#Ä!Ђ\Ç ¢á#hÿkþÑý.ý:ü¶ú–øëõ"óðºî…íÌì)ìHë÷é9èæ¿ã=á›ÞÒÛÐØ³ÕÃÒaÐÅÎ"·ÎôÏ9ÒæÔq×hÙÚùÚÛÛ}Û×܉ßÙã®érðr÷þ½žŸ ÞˆÔñJ‘!•$B'·)Ý+‹-q.M.ÿ,`*b&,!Þ üþ)ƒØŸ91r$þíü—ûñú/ûEüˆýAþêý–üÇúíøP÷&öxõCõeõõ{õ;õõŒõóöUùKüFÿŽ€óÆýÒûéúgûDý5À< x '  šVýLù—öõô÷ôéõt÷¿ùóüæZ ˆ ®3æ ªt5`þþòþÄþ_¨ÞWŽØyÿ“þþþýþýäýýöü1ü_û‡ú|ùø4öô#òôðôð^òõòøqýóÒz· ± ò¢ë  … ÒfŽOè ηp¦þhþAÿQ³ýÿ-þ¾û(ù÷õòô·ô>ôøò”ð`íôéçYåuå–çšëôðÁöü$…`<˜{²Ÿ hMÈ 5– µ!UsLÿ„þâýXýýPýDþÞÿàÈ*G:žþÖýþ ÿšr"TÁTFÉa›;ã[Š ‰ Ô hÚV‹˜à f ¼þÄûïùù¡ø3ø^÷Ïõ‚ó¢ðíÊêÎèõçcè÷éSìï×ñô¢õBöüõ õÂó‹òÌñÔñûò_õõøwý€uš ]`ÎM ¢ ’ b  ƒ c\èl°Ê& I µÞT7冦€äý ú[øM÷l÷ø2úÄû‘ü#üŒúøeõõò=ñpð¶ðåñ¯ó—õ1÷?øÖøù>ùžùhúÇûÀýH£¸ Š 0 QdnþuûÜø÷ŽöJ÷%ù»ûþÏ+PdØÿcþý›ýÙþ)D§á t L_éEªƒá•?OfÃtG°\Á† ­“ªý8ùbõ òpï9í_ëÅéè@æ;ä#â_àßZÞÞçÝ ÞqÞßÇß~à.á×áˆâLãäåPæûç!êµì’ïòQõÚ÷òù—ûíü9þ˜ÿª3¶M E Lj\ ×“ºC 5 ºïøÒg•H|&l ‡ ÄŽ:Üþkþºþ~ÿb/”xÿN¿ÿ¨ÿ5Yå„à¶år‰Fârýÿ|þÏü÷úù÷8õÈó½ò4òöñÚñ¢ññ8ð"ïîízìJìˆì.íAî®ïgñLóIõS÷Iù'ûÝünþæÿYÎ;«&·b  § ýÓ~]Ï  ` Ño=*3dÁH#†ŽÀl§Cÿ3þwýPý¬ývþ]ÿ =ÞÿÜþ[ý†û£ùøñö}ö­öi÷øçù_ûÌüþQÿpƒo.À;¿h7 ä { ¹ ’ ø  µ@®+¾Wêþlýëû{úùÜ÷×öö¿õ°õÇõÝõæõôõ7öÔöÌ÷ùÒú×üÿdi÷ªù ü7¢#…  ²Ž_ÿPýšûjúÓùáùjú,ûãûlüµü¾ü§ü}üzü¾üfýtþãÿ™qNë.  · ´ Š ; ê…o†Z§\5-ÿ0þJýVüKûúÓø²÷ëöŽö¥ö ÷ê÷äøéùÕúrû¥û€ûû¥úNúIúÂúÄûBýõþ»?!¹ÿþiüûNúsú†ûqýÅÿù˜h`–[ïÿkÿÿC‰(å› '  × o ¸ ¡ 1 x u 2 ²‰34uÝTÐÿ8ÿtþ¡ýÝüMüÿûãûü[üâü‚ýþ˜þçþ%ÿQÿyÿ ÿÐÿ‰ªóª—þ€û™÷(ó¦îÇê"èGçfèKë>ïZó¢ö‚øÓøÜ÷,ö ôÐóZôVö¼ùþêu } ›Ât  <¦ýq< † © #SS- _  ú Ö »9Çÿþ+ýMý0þÿ.ê30 J-‰Î–‹SØ/²üå÷DóTï}ìëNëí'ðó}öøê÷ëõ}ò9î êÃæåWåŽçŸëñð¾ö üKÉ©J<5ÁMvÒ æ d œ ©ŠFÒé!´Ï Í  ëªRË Ê Ü yK'[ $ ·YTÙëYà5-ÿºýèûÅùo÷*õJó(òòÜòkôHöö÷*ù·ù¼ù„ùùúuû¸ý®}˜ ð (ó B ( ï÷ÿÕúöcò ð@ï´ïüð‚òËóyôZôkóÑñðtî©íûíïJòôõúAþðÓ»µÜ:ã à®ÿÃý[ü¶ûü[ý‡ÿ#ºÝ6–ÔÿO8Rýûú‡úzüÿ.‰õ- > y P1Ž¢™L ~ í No•5›½¡K·u  * „ û‘3¬ýeúÃ÷öNõõ=öÿö^÷ùö¿õºó)ñWî°ë›é[èøçXè8ébê—ëÀìÖí½îmïÇï¶ïïòíPì\ê]èÁææ—æÂèlì&ñSö5û>ÿ¦>ZLÏ( & y»pH+Pû^¢Ø$ž9Å3oƒbç ÿ Ö œšò»ö¥¾ S9‹$þýKûtøöŠôZôpõ…÷2úý„ÿ{µ å+#éÿnþÏüû¬ùÖøÙøÈùxû}ýAÿ8Ûÿêýbú«õbðCëÚæ£ãÝáŸáßâgåêèÜìÌðIô÷þøúšúÕú:û.üðý‰á×) sRSAäêxÞe<….)V™ÔíÑ‹ ‘¼›%†   iXWrü½÷¯ò·íLéÄåDã×áwáùá ãbäŸå‘æ.ç»ç|èÛéBìôïõûPHE ll3ëô  ÑÝZZ·X   Ofó*Îý,ûø ö8ôUó˜óòô ÷˜ù.üyþéÄ%ÿ±þÿ5MIÙ° K9*ú£3ÉÀ‘ ų÷£Ùó˜þÛù5ôOîíè®ä â7á(âŒäÀç$ë"îuð ò3óbôö“øëûØÿᜣ Ï "ËDú:ê’Þ\ìv4E Ø ¨ Æ Ð/?c"ˆ¹H ÎÁtl† Ž¡”Uþ_ûâ÷ ôðoìWéçîåØå³æèé¹êSëSëôê êÕê,ìÅîŽòÿömûÿx ôGþÄú4÷ôßñƒðð{ðŸñGóõÔöUø„ù{úEûüDýøþ=ûëº 4 6©¶u ŽÜè²?Ì‹ƒèÆ>NÃ:91À†ˆü~ ÓÞþNú€÷”öo÷’ù7üyþ·ÿØÿÿóýýÚüÀý·ÿrx<k ô î t § § œ € 9 ƒ ' ( ¥Öfþ=ü±ú´ùùløw÷öOô(ò¼ïGíë*éçç1çÝæ°æœæªæçõç é?ì¦ïwó ÷úÒû1ü)ûòøÍõò î'êªæ¿ãzáÒßÊÞnÞ·Þ«ß áãåþæ²èFê#ì·î¤òJøÛÿø¸õ#ä)ª-c/c/.à+c)Ú&˜$¤"ú ®¬ðœí"'!§#&(L)Ë)•)Ã(u'Ó%6$Ì"‘!L ©mîÌG ˆ¯Ðþìùòôúï&ë™æ…âõÞÜŒÙ^×,ÕµÒÛϲ̇ÉÀÆÇÄæÃNÄîÅyÈlË;ÎjÐßÑÈÒŠÓ¨Ô‹Ö’Ùê݇ã êèðo÷ýu„uÆòy ™ LX\öòbdGD‡ !§"$Ð$Þ$$r"N û¼Ù»ˆµDU‹«mÙÚ~¥ L {Hëü–ø|ô­ð9í*êœçŒåýã ã§âÀâAãäïäÕ冿îæèæ€æÕååvääÂãyããqâ–á³àúßÁßgàâÿäõèÅí.óøøêþÂW I¡°x $g'W*š,ö-9.a-+þ(ý%Æ"›§ªÓ#†ïi   5 „ ½ªgRþôúz÷úó»ðÙíxë£écè‹çþæ†æ!æÝå°åÄåæ³æ“ç´è$êÉë›ísï7ñ×ò;ôgõ{öŽ÷ÎøQúüõý·ÿ&¡çGvoé ‘ 7Ž“a|. ¼ cQ¦UJŽ#üN§<'ãšvƳ|þPüWúøâöQõçóÔòPòaòøòõóõYöŽ÷²øºùšú/ûgûû*úµøÝöØôâò=ñ)ðìï—ðò-ômöžøú‘ü£þß1÷ š­- ".#›#l#¢"a!Þ9Ž÷|#îʘGÌ2ku ; °Ó×õþYü$únø÷$ömõÍôô3ó9òEñ_ðvïRîÑìÝêè æŠã?áTßÜÝ×Ü.ÜðÛ1Ü ÝìÞ‘áÛäUè‰ëî¹ïrðjððïšïð)ñ¬òôàökùüÓþ‹Fÿº o ýg§ÇÉ©K™‚ MU9ízà5ªü'`ÚÄ*v$ó¡å“­@‡§ ´ ²¢|7Ðÿ[ýñú²ø¾ö=õ0ô¯ó©óô‡ôõ@õ2õØôIô©ó6ó0ó²ó¿ô4öÉ÷Iù„úbûàûüû»û/ûjúnù.ø¸öõ…ó#òÿð2ðšï'ïºî(î[íPì&ë'êqé8évéêÕê†ëîëÿë¸ëVë&ëxëƒì`îüðIô øüNnP¹ ¦ü»õ©ìÈDf7¹X Ê ’ Û º ; Q Ñ Š2ŸµnÜDn ÂÂe µ T O »q  G8ªz™ëb á )·þ{ú—ö+óCðÃíŒënéGçýäqâ¶ßóÜxÚ¡ØÔ×AØÚíÜ»àÞäáè?ì±î2ðÝðÚðTð{ïŠî¯ííÜìížíÙîãðÙóÆ÷‘ü ✠¸¶Lp`?'¹®ÒۉС ju  #áWÀühùŽösôócò.òòòÚñƒñ^ñ¥ñ¬òôóö©ùaüìþ:X{»0 Á FdêžtzÛи Ø ] +¿õr-þ*úšõüðÃìézçç<èëWï·ô¨ú  O×þ·FÍY×>¯ïW s̤üùÁõºòàï.íÏêäèªçEçÃçéë3íeïlñóbô~õ—öö÷¼ùöû|þXZ1 = Ž ÇÁ`±«rŽÏÆuÏé¿3 +¨ ¥^ þýù‰öýóŽò1ò¯òºóõ4öîöèöùõô}ñeî/ëèTåÙâ«àÂÞÝÌÛÕÚTÚYÚñÚ ÜÝßVà:á¾á(âßâOäÔæ¨êÊïöÔü©ç %#ôó¬šó‡ â"£$k%%Ã#¶!nSà@uKz½Û  !$!!£ Û–ª¥§6£ eàZÿíýýÑý|þúþÖþ¸ý¢ûÜøÕõó¨ðÖî‹í™ìÒëÿêêé%è4ç\æ¥åôä$äãÎáHàÍÞ´Ý`ÝûÝ•ß â*å–èÿë;ï.òéô‘÷5úðü®ÿiƒ˜ @ \ å ë Ž Ý ý  + w²µèq+  Ç H x F ¨ ’ å‚'ÿîûAùƒ÷ÿöÔ÷òùý "- _ Ç ® b  ´ Z âMª¨o__Y2¨´J™ìÿ“þêý"þWÿoOŽÛ Ñ *Áˆ–:É¢ö»ËÍeIA7DŸ ­Ñe™ýŒûú"ùwøè÷o÷ùö—ö/ö¨õÐôcó1ñ"î'êƒå—àöÛRØ&ÖÉÕf×ÒÚ‡ßÇä·é“íÛï‰ðãï˜î<íwì“ì–í2ïèð(ò“ò òöð{ïî#í§ì“ì¤ìÉì íÙí{ï4ò/öEû:…½ toœ Ô" %ë&™(>*æ+œ-9/¨0Á1ˆ2ë23â2Ÿ2E2Õ1F1Œ0©/·.¾-¸,¶+©*O)o'·$Ø °'S uû½òüêkäúÞgÚuÖÓKÐ6ÎûÌœÌçÌ•ÍsÎCÏ,ÐXÑõÒÿÔ<×TÙÿÚöÛÜ”ÛÇÚ,ÚIÚoÛ˜Ýuà˜ã”æé$ëÀìî•ïlñìó?÷NûÐÿZzã n'YrÖØšÜè!v$V&}'(z(å(ž)’*±+ª,f-É-»- -v+Î(%’ bÐÖ ˆüVö°ðÕëèså;äCä,åuæ¸çyèAèÉæ"ä¢àßÜbÙgÖïÓ¤Ñ_Ï ÍôÊéÈdžÅbÄÃIÃkÃLÄBÆÉûÍ’ÓÚ§á$êLó¸üñHÚ"ð'{,«0˜4H8~;+>Q@ÝAåBaCfCCSBYA@G><<9ò5,2Ì-ß(™#Dðó ð{«úÅó+ífçÔâšß“ÝaÜÒÛÏÛSÜfÝßHáºãæÜçêèéfè7çÝå±äýãÓãä¼äŒå‘æÎçkédëžíñïEòeô7öÀ÷ ùhú ü-þ̦gÅ’ « ã *   ŽŒ0òú& ù ‡)”Áì‘ * oT®8Ó<zœ¥ÿZþåüñúløKõ¸ñâíêŸæ*ä;ã8äEçìåñ²÷‘üïÿ§Ò¥ ·Yž è ÂãXDÙe»[ª‹ÿÈŽ{Õ¹,#yæK‚hê0-·Ã&ìP›ë $ iAÿ¹úö†ñ+í6éØåLãwáÿßÞ²Ü8Ú(×´ÓNÐqÍoËuÊgÊËaÌ0Î ÑÏÕzÜŠäÆìÙóõøàûâü¸üwü¾üÃýbÿ)»“œÝ´þÉü€û³úòùÓø)÷-õLóíñzñiòFõTúxÙ .GiN!"5!D.¨/ë‹®ö!$é%g'™(·)È*¿+Ž,,-­-D.ê.’/0'0„/è-+s&õ‘Æ ‚·ù!ñêsä”à‡ÞÞqÞõÞÓÞÖÝMÜ Ú٬תÖaÖ×ÎØ=ÛÜÝ,àíá6ã-äåÕåŸæMçÙçDè¡èééIêƒëí°ðõúOÿ ²é ~ W ¨öÿû0ùè÷“÷å÷ø`ùIú_ûÑüÞþŸ*L Ë SŸ]Veš !¿ höq S4ÿPý&ý›þa í€ kr…»1ôWz s G ÄÈ:#ü§÷óeîÂé'åƒàëÛœ×ïÓ Ñô΂Ͳ̽ÌvάÒáÙ’ã›îsùÑ ëœÌ¦ºƒLà!Ü#%ã%ƒ&E'(Î(i)ç)*²)&(%¥ ¡ðÌkùòëhä`ÞCÙ‰ÕÛÓ¨Ôû×iÝLäÌëåòµø”ütþÅþ6þ}ý ý.ýÔýçþ$rôÊÿyþýoýþ3ÿgVåÁEëÙ'?k % &tcþ‚øòíÀèãå~äyä—åç$ê(í{ðøóŽ÷ûUþa*­êÛ ˆ Iï¸ A LOÿÜø¡ò3íé:æñä廿ìé„îøó ùÈþÙŒÝ)¿.è4H+ÙEU â Œû°cÖ1¶®œ j÷²mÀBŠ "–#½#¤"³ iP·Å|±3®¼%Üôž«“ à v  €hÆŠÿ†û\öÊïøçNßMÖÀͤÆËÁW¿Ç¾_¿rÀ­ÁËÂÊÃÕÄ7Æ•ÈÀÌ›ÒÙÅÞ"ãKæËèîêûìïMñRó¼ôõ>ôÃòañ‘ð,ðÐïpï>ï>ïIïï„îîºîùðõØúÏ¿ ÐW C%Ë(m+Ã-0µ2]5à7ï95;N;3:<8634&3ü2ž3¡4Š5ã5h54K2N0.W+¥'™"eÏ ¨úqóäíhêõè>é—ê:ìJíí7ëâç’ãÓÞ8ÚBÖIÓrѨЪÐѤÑtÒ›ÓÕ»ÖRØ ÙÚÛÚ ÚÓÙÅØø× ØvÙtÜá9ç½î÷’ÿ?X ”õЄ‚,ú W »–vþãúŠøå÷"ùü8£² Ó)D0ÒÁrLù« %ŸûKõñ_ïmðIôvúót Â%p×Õ-ÀBð`éù4Kòæ ÿqùïó%î¡ç‰àLÙÃÒ½ÍÒÊúÉÒÊ‹ÌbÎîϯÑ:ÕÜÒåƒðÓùb8)MÀF ßêlì “#ú%c(·*å,/š1R4š6Æ7o7®5­2c.–(/!–IŒ¾ûGòqé–áÛ?ÖŠÓÓ ÕkÙ¶ßÝæní<òô±ôtóò»ñœòkôrö øçøù…øÌ÷<÷&÷¡÷Rø·øRø×öWô=ñhîÎìDíCðÊõ4ýWß ŸÛ/êÍÿ ~@'¿ÿ+þûÌöwòmïÞî‹ñM÷*ÿu£Î¹Æ§ôCqGY ` kûüåöÔñWîóìøíjñ³ößüau{îû2õ¥ðËíMì†ëÇê éâç¨å+ã×àsß ß°ábåýéòîÙózøÃü¾qöx âæs©#r'h*d,o-¾-Ž-H-&-E-ˆ-™- -¨+¤)z'ã%O%«%Œ&\'K'ï%%#LZîP A Ÿô3ø™ìßâÒ£È+ÂÕ¿ÚÀÅÃÇ¿ÉPË̘̅ÍeϲÑFÔ6׳ÚÊÞUãÜçÌëÅî—ð4ñ³ðï6îUí ííÉì ìÄêéSçèåpåzæ˜é ïVönþ? ea‘Áʳa!¶…"·)C0W5ˆ8:‡::O: :“9ó88ñ6*5Ÿ2c/”+Y'Æ"×GÆI ïùžòßì%é€ç èÕêï¶õü‹Nùjø2¶ûÿö^ò½íýè'ä\ßãÚ×0ÔDÒuÑ™ÑiÒWÓÓÓWÓÌÑÏfÍ&ÌœÌ\ÏÐÔÜÜ­æñmúüM´ ë ¬x­‰ÄF è"3$;$`#:"E!Ð Õ ü Í ÛíÛàl%¹ ‚“oECȱÿCúøóºíyè$å5äÒå éìî±ôòùõýbrªÉdËÍùÓ ÿ 5 I XÁ ¶-ÿ`þ þ²ýåürû`ùÒöøóñOîìpêTéqè‹ç»æuæEç©éÖíó úH@.Ë–vt“|{\ m¸.,!#¬$%2%£%T&ÿ&ñ&A%!ò¦(ùïSçóáÈÞÝwÝòÝqÞÈÞØÞ±ÞhÞ‡Þ¨ßPâ³æ™ìó½ø‘üäý§ücùõöð îåìí~ïÁñwó-ôô´óÖó*õ øÑü \ ªü!'%o'A)+&-/•0j1«1V1W0w.¢+($ ôޤG è Wÿý[üðüAþZÿ3ÿ­ü#÷¿îä_ÚŽÑ1˵ÇåÆÈÊ"Î0ÓÂÙBážèÓî]óöÿöÉööõšõæõëõõßò•ïuëÝæ.â¡ÝeÙ¥ÕfҮϴÍþÌ-ÎÀѵ×Ðß·éÂôØÿÛ 2I"ú$ë'Û*Æ-«0t3Ó5‰7a8[8°7¢6Œ5È44½4O5Ê5«5Ö4U3Q1A/u-¶+k)&Ä!ÝM8QZù’ê7ÜrЄÈ~Ä·Ã÷ÄÎÆIÈäÈžÈÙÇåÆüʼnÅgÆkÉWÎáÓ‡Ø\Û<܉ÛôÙ0ØÌÖ1ÖˆÖ¤×Ù{ÚâÛ…Ý•ß9âæå ëèñCú0¨ À+);¹!þ#Q&€(*T*O)¥'N&ñ%¶&i(•*&-20l36x747˜5^3@1Ö/k/0g1å2ž3B2­-2% Œ Éû¬î_ä Ý9Ø:ÕÍÓ®Ó¦ÔƒÖçØYÛkÝÍÞšß5àèàÎáÃâãÐã©ã ãÉá«ß¡Ü ÙÁÕvÓ<һыууÑlÑ.ÑJÑÒ†Õ,ÚÐßÒå)ì>ó'û[ àŸob ‚#,&Æ(’+c.¶0=2 3¤3‚4´5°6ÿ6g65i3Ä1~0¼/Š/Û/„010X-Ê%¿Ê ¥û£îáäyÞÛ=Ú/Û(ÝWß1á¯âìãÓäTåÄå׿é™ì‰ðÐó¥õàõ«ôUò'ï¥ë‚è#æCäDâÄ߯ܨÙa×pÕFÔ;ÔæÕÊÙÛßaç•ïÜ÷´ÿ”/ ez¹B(¤ ꉎnÊ Ý!c#¶%§(e+?-Ú-P-Ï+t)¨&$–"["À"<"%¯LT]ùhïåæà^ÛáØ]Ø3Ù ÚdÜÛÞUâÌæñë:ñ@ö¹úyþN<hÅ(Øÿ ûšõmðì˜èÝåäGã˜ã‡ä¢åâæ·èÄëVðKöýõL ۛƎÓH"™#Ñ#R#­" "H! ?ÞUÃBÎ$·Á H!ïë󺚙 “8-ÿ*ùBòÁêãÔÛîÕÒaÐ}ефÓÉÕºØÎÜâÑç6í¾ñgõiøû‚ý'²y£‚OþõøÀóWïœë6è_åçãväç³êîùñ\õ>ùžý)†® êG},' ¾!#ð#I$-$ê#ž##¹!º‚ØQ€-x Á лՀ(éi Ù‚púlñAèsßq×Ñ3ÍîËœÌ*ζÏÑ“ÒvÔöÖÊÙÀÜ à äÂèÖíÔò.÷~ú[ü”ü@ûäø!ö‚ó=ñïùì ëÓéépêì„îðñuöôûå–‘ ³6o©íÇ Ô"ß#3$"$$ä#§#<#­""5!> 3J²¤¦á˜Æ‹Õ™Øoó Ñ®ÿôõƒëVáØþÑWÎ+ÍÍ ÎÐAÒ2ÕºØÜ©ÞYà¸áqãÌåÙèzìCðyó8õýôóòÛï­ìêèKæéä$ä$äŒäå¢å çúé½îáôƒû 9Ñ “:ÖÞÁÀ¶ i"#$â#M#a"'!±Do‘-!Î"Æ#$ß#4#ÿ! fŠþ4 )×öŒëzá~Ù>ÔÃÑfÑÒ²Ò*ÓÖÓmÕfØ…Üñà÷äžè7ìÐïOó¢ö¿ù[üâýªýpûˆ÷Ùò]î¨ê¬ç{åLäLä=徿¤è)ëÂîºó·ùïÿ¹ ‹*)ðã(Ò ³!Á!/!5 Ùö®oÇ~¤6ôotå­Ä@GÏtt™ýûònèßÜ×yÓøÑ¬ÒÔjÖœ×Æ×tׂמؾÚÝÄàäécî5ôÂùóýýÿ’ÿýAùÛô«ð1í¹ê’éÐé/ëíïÌð“òôô`øÔüü< ;·³…jFñ!3$ã%æ&P'E'î&_&¦%Þ$($ˆ##Ì"¾"å"X#Ô#9$’$á$ò$y$#e b/ ÝŒôèÞãÕñÐ;ÏÐDÒ‰ÔÖÝÖlרŒÚåÜß4áãSæÖéâíòFõÔöaö"ô¥ð­ìÈèKåMâàÐÞ›Þ*ß=àíáhäèíó‡ù±ÿ’ ö T)TÝ| hm!ð"ä#t$Þ$p%V&ˆ'Ë(*v+ -§.ì/®0÷0ô0à0Ò0®0Í/à,&ÿ."ÿ?ñæÞÙuÖÖ9×ZÙÒÛ|ÞSá8äÁæ¦èïé)ëêì‡ïËòöçø¶ú)ûòù&÷>óËîNê æâ›ÞªÛ„Ù0Øž×ß×QÙiÜ,á)ç‚í¦óLùJþ‹ Îñ µ G·,À|CÚËsK} Ø×! $C&.(‚)8*©*!+æ+ó,ê-Ž-õ)¹!8”¡øwíÌådá¶ßàÑáäBæèôéì î‰ïrð1ñaò'ô!ö²÷Uøö÷ªö‡ôƒñ²íéšå.âWßûÜüÚÙÀØïØQÚ1ÝÃáè˜ïw÷ìþšQ ô=9Åì¨E‹ ɘTéQ — Ò !€!"Ñ"}#$`$¡$Å$ä$¿$²#¼ ŃÒsùGîƒåsß¾ÛØÙvÙYÚEÜÞÞÔáØä™çÛé~ëŸì|íŠîðüñôéõüöèöõóïªëÃç;äVáFß ÞˆÝ“ÝAÞãßíâ“ç™í]ô)û€³ W]_?çQ—×T =!”!N!— ¼ ´ûÖ!w"‹#þ#Ù#.#ÿ! S-[ â+÷–ìãàÚyÔ7ÐFÎLÎ’ÏSÑ9ÓuÕDØœÛõÞ¸áúã æUèEëïŠóOøVüvþ3þÏûøõóýï“ìêûènéìêÃì©î³ð]óùörûjv_ ýTÜï~ Ž!1"”"ß"1#‚#µ#À#¯#…#9#É"Y"""B"o"z"^"ó!!c}Ú© ¿ÿõ¥êPáhÙ;ÓCϤÍûÍ\ÏóÐ…ÒmÔ×FÚ`ݼßPá“âúãàåièŸëïò˜ó"ó¹ðþì²èTä/à»Ü¥ÚgÚàÛ„Þ×á¶åKê¨ï~õ7ûpk c ë ë¦)[ E!"Ã"n# $n$q$$#Ú"i"V"É"§#½$Ç%—& ''{&Û$¶!ª’‘ 7‹÷ºí¨å~ßÛØuÖ)Ö(×OÙJÜÁß-ã&æ[è¼éxê/ëuìîlñ©ôÃ÷$úCû³úUø]ôsïxêÿåzâ!àßZßÇàGãÁæë)ðÊõŽûüÄÍ 1 ˆ$?ë<iž¬TÛÕ‡pÛÇðû¦ j W £*ìÝüˆòFé¢á}ÛÁÖ|ÓÔÑ™ÑzÒ'Ô€ÖyÙÃÜãß™âÍäÁæÖè_ëî1ò$ö®ùüÆü»û„ùÉöõó/ñ›îŽì€ë~ëXìží]ï×ñpõ$ú•ÿ/ ’u?‰ g"È#£$%O%Ð%«&¾'ª(+)9))Î(Ë( )f)ž)i)€(Ì&|$Ì!Ö†ˆoè ò û òÊéâXÜ×0ÓÏÐéÏ ÐÌÐöÑžÓ!ÖyÙ6ݳàŠã«å[çòèìêºíMñæôo÷ ø†ö`ó]ï2ëBçêã²ááDâ¶äè:ì ñŽöƒüf¤ù yooË!O2 ¾!ó"ä#¿$Š%=&”&j&Ê%%c$;$Å$Ø%'(f( (1'&k$"¦ÈM$ x÷ßìÐãJܳÖhÓwÒIÓéÔlÖa×Î×Xؚىۛ݌ßiáãæé¸ìgðUóôÀóÒð°ìèNåLãtâÜâ¶äÙç³ë£ïDóŸö úÔýë5 6&¿ÙmœŠ!!H"#z#Ö#R$ï$v%%%%$#"S!Ò „ b \ Z W  RÉ'QÈ ³öö–íFå;Þ£ØæÔ%ÓÓÐÓÕ§Ö3ÙÑÜ1á~åé†ëRíÅî:ð#ò¹ô²÷0úEûbú¯÷Óó_ï¼êæÑá®Þ.ÝkÝߤá*å«éïõÇúýÿ•ÀŸ ðb‘| &à…D"áI N ÷W–ÜwŽ(*F ,!Ÿ!p!v ¦ÕÑ<Û ëRø>ïˆç€á Ý$ÚìØ]Ù^Û›Þ¡â׿±êÅíÂï¨ðëðBñBò0ôÄö’ùöûoý“ýHü˜ùÏõjñíìÜè¥å’ã¬âÆâ±ãgåõçrëéï-õÕúp¶‡ ©ühúÌÇY÷¨WòRlSE=„SŽþ)Æ8@’¹PÔ Á™ü˜ó°ë@åàÜ>Ù–×J×>ØNÚÝ/à+ã³å‹çËèÊéëêìšïßò:öòøvúpúùªöÜó&ñúî¤ínícî8ðòòôƒ÷vúõý&àà Òy©ºŽ!²"4# #œ"å!H!é Í Ò Ê š _ /  * p ú ­!B"r"" !v)÷ë® 0¹úüñÍé}âÜ^ÖÒhÏ·ÎjÏ×СÒÛÔ¬×ÝÚíÝSàöá0ã•䆿LéÔì¶ð"ô&ö:ösôƒñ îê7ç¦ä]ã•ãã䀿åç*éÄê3í‘ðØôú†Ô # Ëéɤ d"O$'&¸'²(í(t(ˆ'j&_%£$$ï$¶%\&ƒ& &;%c$“#l"C ‰ ·¾µü‹òRé¢á†ÛßÖÙÓ¬ÒcÓÕØ­ÛcÞVàgáˆáôà\àŸà`â‘å é–í”ðùñ^ñÂî’ê‘åÚà…ÝEÜ6ÝÿßòãAèVììï6ó†öWúïþZ'  a³¸[Üe ì Ï!µ"}# $$ˆ#^"ã Zè†K0Ac‘Áà준 ûqùæðíèèáüÛt×¶ÔÔQÕ"ØÜNàOäfçAéÛé¦éOé£é/ë î»ñxõXø ùþø­ö6ó0ï@ëþçÕåÞä÷ä°å§æ»ç éìê‚íÇð¿ôkùÐþ©k hG¡±’™÷"ò#Z%8&¢&¨&=&Z%$É"Ì!!š  A?ÉŒ S, UýÇõÖî´èGãnÞCÚ׌ÕÝÕØÆÛ@àÐäérìïîŸðþñžóëõÙøæûRþ„ÿ-ÿoý«ú?÷nó±ï™ìšêÛéêúê4ì·í®ïMò¢õùËý+ƒ® k‘íuÉĶñ‹c>ìWs`*Üv ¤B莆´OùG- Yü¼õ~ï·éCäFßÛ(ذ֔Ö}×%ÙrÛ`Þ…áe䥿èéïé\ë©íÊðô¾öÆ÷Éöøóÿï¢ë…çZäÀâ9ãÏåòéÂîžó3ø¤üù50 ó š`<üLî!È#á$W%b%8%"%'%I%e%m%L%ç$G$›#.#c#f$ï%g'^(œ(4(\'Û%4#íêo :Ÿ÷Çïøèþâ¡Ý Ù¾ÕÔ¼Ó>ÔÕEÖõ×2ڙܱÞQàÃá˜ãæ"éaìhïœñwòrñ•îsêùåâIßøÝDÞSàËã èXìYðõó^÷¼úþý  ¾ Ŷ/Ý"ùj Y"Ó$*&e&á%%v$U$·$s%8&Ÿ&_&F%B#{ 1„ØY Ð}ýÝõyîÆç+âÞàÛ¥Û<Ý:à äþçaëˆíîíúêÜè¬çûçÓéŸì’ï»ñ^òñÜí6éçã·ÞgÚt×#ÖYÖß×sÚõÝ(âÒæÉëñ¸öëü ØhˆvŠ'Á̂Р[#Ø%ó'y)**ç)Ã(E'&Ê%N&'†'!'Ä%#‰ °¡§ ìþ–÷”ðFê¦ä{ß°ÚœÖïÓUÓ,ÕÙ ÞãçÐéÿêôêFêÓéhêzìæïêó^÷6ùÑøöœñ)ìëæãMáâåDé©í}ñŒôóöù:ûÀý«òi ˜Ía¨±ÞÁWQ!l"œ"#"r!!5!è!×"“#Ã#(#Á!¦ù¿ ¶µ ìúïô$ïyéýãçÞÇÚûת֧֯×sÙ¢ÛÜÝ¿ß áÌáfâhãWåèÌì¥ñ!ö3ù8úù}öó«ïíÉë ìðí—ðnóãõß÷ºùàû“þëÒ; çc/ø³x€†@”‰×±©ðÒÄÜ[ŒÉH+ ‘‘dû_õ«ïCê åàŽÛû×ÏÕ7ÕÖÙ×QÚ#Ýúß‹â•ä&æoçºèmêêì_ðWôâ÷ú÷ùµ÷´óÂî®éHåoââááãËç‘ìÿð‡ô)÷`ù¾û´þwñÝ Áæ}€9õïd!J#]%&'E(f(Ÿ':&Š$ #,"S"z#C%'.( (¢&©#]-û1üŽöñ¶ëaæSáþÜãÙ0ØÈ×hØÇÙ}ÛÝûÝÞ<Ý[ÜHÜÑÝá¢å«ê2ï9òíòñð™ìÒæÄàœÛظօ×@ÚeÞ+ãÜç)ì ðòóAø^ý? Å“÷!†­¦Á!$&K'd'*&$”!©ßWÁ u"À#$<#$!êÈ-F V@Úû4ö{ðÏêWågà§ÜÕÚ\ÛÞ1âœæjêùìîÀídìÕê2êKëZî²ò+÷ú°ûNúröÌðeêhäàßRݸÜÝ8ß.áãïäåæeéÜì†ñi÷0þ=Ç ÂàâXÜÜš/!n$B'9) *Ù)ó(Á'¨&÷%æ%p&Y'&(9(,'ï$Á!ÔD wHíø§ñšêÐã‚Ý>ØÇÔ¬Ó'ÕõØRÞÞã<èxê\êcè‘å;ã‚âäÀçíˆòÔöÈø øýôpðœë½çÇå/æíèUícò÷Þú›ý’ÿ,ÈŸ xÅP¢KŒ¼LŒ‘ke®Iqi†¤J¡[[¶Šôš »P‹ý©øòóvï,ëç-ã7à¦ÞÓÞ­à©ãâæ¦éoëì‰ëIêÐèÉçâçyéoìð“óÏõ2öôñdì}çOãÁà~àžâ¥æ¾ëñ÷õ@úõýgì½è BhêŒG1f ˆdk:!å"ò#$t#?"Á ;‹W!œ"X#¸"Q îÇDÀýôõïRéQä ßôÚ}ÖäÒ×ПÐÒ¹Ô ØƒÛ˜ÞÌàíá9âPâ ãåÐèÃí9ó øYû&ühú¢öªñ}ì6èÏåîåŠèêìþñ¾ö úý¿ÿ§²N¦ ž ¾ZúËk‚b4·j!È#]%Þ%F%ß# "s ®* Ì!$e&å'(m&µ"èmö AÒû0ô¯íMè¬ãQßÛùÖéÓÒLÓôÕÓÙÞ²áä‡äcãSá—ß\ßYápåæêpð´ô¨öÊõXò í?çóáDÞµÜOÝ«ß6ãzçìÄðeõúù“þ?â u{ªÓî$Ø”ùX˜["%P'‚(r(&'ý$œ"Á ÷{ "L$Œ&#([(«&É" ý<S¦þ…÷1ñ¢ëƒæ–áÔܺØôÕ=Õ¾Ö$Ú˜Þãƒæ9èâçæå6ãá‘àlâræÝë\ñ”õi÷möâò›íÑçäâØß5ßöà’äTéî•óøünÿµ/0 ©+/ÛgKp~ép S"9#ó"¹! c1­óø@!o"l"Ê oœÑl ®Èþ øÁñöëŽæiáÉÜ*ÙGפ×KÚ©Þ±ãXè¥ëíììké=æÈããväâçrìæðô2õÓó5ðë—ååàýÝ݄ߦã-é;ï÷ôäùçý:Lƒ Ü€‰™¤ÎaÁlÝU¶“:!þ"}#Ì"5!*~±ï裒  Æžð4 ôÍþ<øwòíéñäáºÝgÛ Ú»ÛÞMâBæ’éªëJì{ë´éÑçÏæzçêDîçòÚö*ùAù+÷Xó„î é«åqãfãmåéºí¤ò^÷Ÿû~ÿ%åé "±N*Åt‰À$ "%#+#K"Ê °¸­T2!¤"ù"œ!?ûM® Æ$ûFôLîé8ä—ßKÛÑ×ÉÕ«Õ“× Û;ß3ã#æžçwçæä“â[âä€ç ìŒðÅóòôÓóÄðwìÙççã€á)áþâœæ\ëƒðvõäùÃýNÓ‹™ ÒÞPÕKÁj°é¾€Þ<" $ç$±$#î!- À¶ a"z#R#u!Ÿ KÖ GûŒôÂîéeäZߨÚ×_ÕèÕ‚Ø–Ü.á_å`è¦é éþæ|ä½âÃâ÷äíè¬íüñ®ôõóï÷éÐä»àÞ£ÞÌà‡ä%éîÃòÿöÊúhþ.j Í%ŸÞÞÂáÆl»ïë"%Þ%v%$."Q çA–È€!9#D$$ "1ºÊ GüWõ@ï˜éäÞÞjÚ}×¤Ö ØKÛ«ß;ä+èÁêƒëmêè‰åøã8äzæ8ê|îòôøóµñÜí-é¿äzá$àáòãOèRíEò™ö'úýñÿ. 5RY qçѶ€ù>Äá 8 câ/±·…%mö3¤ÀIEî³ ú>þè÷(òûìèãhÞ‰Ú9Øþ×ÚÅÝ…âJç@ë½íZî6íÿêËèžç6èŒêîÝñÊôö5õfòî6éÂä­á‘à‘á]ätè6íòŸö¿ú„þ1 GVÕw´˜'Ó"QXÐ1"í#·$|$l#Ï! iSù^Rq8  KNì§ü|ùœò¡ìzçíâÓÞPÛÜØÙצØÛŠÞXâÚå¡èNêšê«é èàæªæè¶ê(îoñ¦ó>ôíòãï­ë.çUãÿà—àâ,åIéêíŽòùö$û5ÿX­! x]†ÂWé'˜‡H— "É"‘"¨!W øß^–Û7!"Ì!úSëMK¯øèñìùæMâÞ”ÚhØå×Ù¾Û*ß©â¾åè6é(é(èàæ&æœækè=ëGî­ðÌñPñLïì<èšäùáëà§áúãtç—ëýïOôføSü:]Èi åØðEÇÕQ¢|‡ V"–#$µ#§":!ÞøÀLe ¹!Ã"#?"Èšãød¼ÿ–øEòÀìÃçãØÞ—ÛÇÙÂÙƒÛ£ÞzâYæé”ë ì@ë’éíç7çóçêí'ðcò óòZï‰ëdçÈã€áîàâ|äûçì~ðæôù.ýH• ¯7â•Q,Ь`Ò½ºS!#"ù!æ 3P¼Ó´N^œŠ²–惥º Gãúô;î*é’äEàˆÜæÙêØæÙ¯Ü«à$åLé“ìnî˜îGíKë é-éTêâìðó¹ô¼ôêòï)ëÒætãÔá(â;äŽç¥ëðyô‚ø#ü’ÿ%‰ O»@j¿´ßÆ¡CX]Ø p!!éXÄšF+<ËwÚÂ$Dw@útó–í]è¡ã_ßöÛÕÙZÙ¨ÚkÝáýäèQëÌìÌì¥ëêßèÓè2êªìvïÏñóªò¨ðPíLéƒåÖâÑá‹â¶äççÉëð£ô3ùªýV® û«ŠšÒ4öd÷Ú<Þr!™"#À"Ç!m .ѽ' - ;ð¡à  ý†õòîeé˜äNà“ÜÐÙ`Ø…Ø$ÚâÜ!àXã)æAèhééýè]è.èßè†êÉìï‰ðîððÜíÕê}ç‡ä–ââðâåè¶ëÊïôŠøýƒb 4L¢+ø'ä0€R5 Ì!Ô"#§"°!‡ ÜÃ%Êv ã ¼ £4+n: ëûeôøí¡èä5àÝÛgÚ!ÛÝ÷ßãæ‡è$êÏê±êê±éééúê¾ì¦îððØïäíëªçbäåá»àáÔâƒåáèÀìñ”õNú%ÿÎo ¸mi•@mVºF œ!}"­""ú  »Ï7Æ69€³êê ÚOÿß÷ñëÝå1áÝ·Ù¸×q×ïØðÛÕßêã‹ç2êšëÄëëKêê¹êrìÈîñˆòºòxñìî~ëÉçŠäqâÝáÙâ åèVëòîÃò¾öÕúÿfßY {ÚÑòbO5ômR@ ×!Ì"û"u"j!* i6X¬¬zNð[œ ÿéÿÜø<ò?ìÚæâ%Þ\Û*Ú¼ÚßÜà¿ã9çêüëÔìÉì?ìèë:ì|í‡ïÔñ“ó8ôXóñËíêræ¯ã6â[âõãœæÂéíxðô½÷¾ûŠA ç ,¹[ý·´OìýÅ/è• ì s ZöªÒÄKâVaÚ”LÕ -Ñü¶õTïÖéåùà·Ý”ÛôÚÜÞâëå`éìíûííªììEìcí5ïñ^òfòùðDî¨êÆæ;ã­à’ßàùáÐä%èÆë´ïôºøËýcc ×{D%2‰p*~‹ © !ÿ!P"ü!2!- >¦Ë0Â’Å+vrô0 “Õú¡óXíè˜ãØßÝrÛSÛ¸Ü>ßUâ\ååç±é¼êëüêæê:ë<ìÓíÄïañò”ñÄïùì éEæ`ãoá¾àráDããå é¤ì¹ð=õ$ú;ÿI c $H¢GiSJ]±ds> e  `·G+qû’ 5 ØÃÆž0 —LùÑòPí´èÅäˆá@ß>Þ®Þ{àJãlæRé‰ëðì“í¤ííwíõíï¢ð.òóÔò:ñtî÷êGçòãláà2à–áïãÉæ÷ézígñÏõ¥úÐÿ nòüJó(6Zê} ’ î ¼  R¦A?Ñý“§¯/dQ Týöàï‰êÚå¸áWÞ ÜxÛ‘Ü;ßßâ¾æ$êªìî›îtî(î6îýîðoò-ôõ ôßòð–ìé&æ-äãbädæ0é[ìÊïqóV÷xûÊÿ-w} û2¥^}4Ú¹ #•'rEt)‰î‰~°xÌüåg@+Êî« cÒû›ô3îžè½ã‰ßV܌چÚ7Ü8ßßâaæ-éüêÄëÄëxë\ëàë3í$ïKñ óÈóAóxñËîÏëïèµæå—åóæOé:ìeïÈò}ö•úÿ¦PÏ îg‚ÍQ/±FAÛœ! m ÷õ½§ã~jx‰uIóîþò¦ -ûü¿õïéÙãZß»Û`٦ةÙ+Üß;ãlæÜèhê2ë{ë¨ë ì.íËî¹ðoò`óóƒñÐîƒëè$åþââ‚â"䔿qéwì¿ï…óÚ÷¸üöPz )8ŒKŸÌÆí\ Ì!â"l#c#â"&"Y!¶ N !  õÂc½µÅd¸— R†üòô(îMèUã0ßÜ8ÚéÙ!ÛtÝKà ã/冿&ç^ç…çûçõèxê?ìõíïQï]î^ì´éàæIä6âñà¾à¸á±ãSæbéµìmð¹ô›ùìþR GSóyO£¼ìbP¤%‡ ƒ!Ú!Œ!Ä ØýcJÈߦ»yãÄ2 ´üõÞî‡éådááÞÑÝDÞ àµâ¢å"èÓé¨êÏê¶ê¹ê2ëHìðíÕïxñMòíñTð½í£êˆçØäßâÔáíáããä çbéöëýî²ò ÷#üo¢Q 'ÿøT@èz?náe Y!­!u!ã 2 ¦y£ _ —   Z ¦[PDnž‡ù“ògì çqâ¼ÞSÜuÛ<ÜkÞrá äaçRéQêêsêsêîêì¬ímïÌðHñ†ð„îªëwè~å+ãÆá™á¤âÇä“çêºíùð‡ô–ø4ý?Y/ vòƒBJÈêv_Á]ÖÕ 2!Û òáÔ}ŽÚ#J<â$ÕÜýëƒ î·þˆ÷Ýðîê¹å[á"ÞzÜ™Ü]ÞHá˜äªçÛé÷êëšê êäésê¸ëqíï ðÞïWî¨ë]èåGâ\à„ßî߈áä#çbê½íEñ2õ ù‡þ·øó ^ìzs¥÷ŸÎ` !u"R#w#ë"à!« £ÎÙïòÅcœKT§s  âÉûÍôIîMèõâ˜Þ­Û”ÚVÛÝ—à©ã)æÆçtèèXèŠèhéë(ívïgñqò.òðøíÒêÃç*åUã}âÎâ>䀿%éåëÐîòñõ~ú~ÿ£Š ç €3÷ùx¸óoR´mAÐà S!@!Õ Q ïÓýL   Ò ¿ C F¯Y.õw×OùªòÉì¡çJãñßûÝ·ÝúÞiáQäç*éWê¼ê ê”êñêîëní*ï³ðˆñEñÇï9íê׿äâÏà”àráDãÌåÀèì˜ï˜ó+ø6ýzŸN Iw¹)ðU¡ä'Ätæà 5!ã  >ˆ  .[nRðE)~žìò öšû ôtî3éÅä7á¿Þ¦ÝÞÛßâå èÓé¶êôêîê&ëîëfívï­ñó„ô"ôcò˜ïSì*éŽæÂäúãOä³åâç„êfí†ðôó÷^ü#ô{ qšðm5ƒŒ¢“{lò nf<@šYm ỄìáJ÷¤7ú<óí€ç½âúދܳÛrÜyÞ?áäxæøç›è¬è›èûèê×ë+îŒðlò6ó™òŸð¬íjêrç/åçãºãÂäÃæsézì´ïóÔö ûÊÿæ ÞgÑb@¥Çñu…÷ ­"í#h$$#Ò!• ’Ùk ŽÏÌ|âÛq k}ügõ®î‚èãnÞÛCÙFÙîÚ½ÝÿàäNæ¤ç+è<èiè(é«ê×ì"ïñòÌñ'ðcíê»æøãâ7árá¸â´äçŠé&ìï¸ò)÷aü Ì& »NÉRÐ\\âÍÁ!U#;$;$l#"¼ ±*"q·¼c›^¼£õòÒ  ÀýÏö,ðê˜ä÷ß–ÜÛÚñÚ™Ü8ßâpä÷唿€æVæ—æ½ç¿éHìÅî¥ðxñîðï?ìéæÓãˆâRâ-ãýätç@êíýï.ó÷ûÝa¶ xW êÙCæ³ðL Ì!µ"×"1"ü ˜k²tŸöADí)ñTJ´H¯ Úéù óÌìEç‹âÛÞ‘ÜëÛÎÜØÞ[ážã'åÄå¢å/ååÊåŽçêêìeïüðEñðºíêPçŠäžâŸá§á§âŒäçýéíNðÙóß÷rügr= ‡øyßXÃvHM\ "M#¤#1#4"!ýW%R®ý ¿ò–¨+ôÒ} ÿ6øëñSìlçDã7à•Þ•ÞÿßPâØäç]èÖè¡è9è<èéàê<í±ï–ñiòßñôïöìyé4æ©ãâ”á â’ã«åèxê íìïwóÆ÷Ïü.z? ;?NšaßiJ«‹¡  #"ð"í":"! ¡´äá|¯o͸!ÀRÅf«ûõáî3é3ä7à¤ÝÃܖݳ߂âTåçÜè-éáèŠèÅèïéì®îSñAóõó óãð¯í/ê ç´ähã;ãäÌåèmêíì ï²òVö«úÿ©˜ õ uõ’{ùgL#D !."‘"1"E!! k%1[nRåëZM«&l l{;ùJò ì‹æâÞÞX݈Ý5ßÝáÕätç0éÐééÀèOèÎèê#íð¬ò5ôRôâòð­ìDéxæ¨äïãQä¶åÙçjêí ï<ò-õÎø4ý&1Õ ¼ª ®!T«xÙ¼îš r!g!~ µª/4€ÔâN=¦œJn ëüHöðNê8åüàÞ½Ü+Ýß­áväÏæGèÎè˜è6èXèséŒëIî ñ.ó%ô˜ó™ñ‚îëÆçWåõã¯ãvä/æ‡è)ëÎí_ðóKöTú*ÿ„Þ Àù™ç c5 ˆx!À"1#Æ"ª!N U?›êò²P~D¨d%¬4@ûyôAîÈèäƒà]ÞËݼÞÁà9ãƒå çÔçªç çŸæç…èàê“íôïlñ°ñƒðîüêËçå-ã+ââòâ¦äç¹éœì£ïóüö«ûà/ Rœïb/­<p4DN "##n#Ý"°!N %k+<‚ÈÙ›âªæ‹ym, ÇÅþÆ÷Pñ”ëŸæ“â³ßRÞ‡Þàâ5åzçäèDéÖè+èíçžèhêíÞï1òqó3ózñ’îëÎç2åãðâZã¨ä™æïè~ë9îEñÅôïøÆý Bþ Û²‡€ñavm­ÛŸ!¢"À""Ø Š…øÜþ%(ódgñ`-´ % ü õžîáèçãîßRÝPÜèÜÍÞiáäHæŽçÜçzçùæþæþçôé“ì8ïBñòxñvï}ìDéjæTäDã9ã>ä#æ¡èdë>î/ñZôøPü:gm ÐG¶7û^§-5ÌÙ ñ!4#¤#.##"Ø Å%I©áºèE>è2àž 1ÄÐúøó‹í½ç½âçÞ§Ü?܈ÝàòâåSçþç§çÃæÿåÿåçAéèë`îïïð îñëŠè8åâá°àŽákãüåáèÆëîEñ5ô²÷îûÕ$ •Œùoß©úÚ)!í"$L$À#°"u!v äÂï/ T / £ëÇ1E^ Q|ÿ|øßñàë¥æBâßtÝ‚ÝßuáäYæµçè™çåæŸæXç(é¸ëkî”ð¢ñ4ñIï?ì´èYåµâá—à1áÙâQåDè\ëhîŽñõ ùºýÎ߆ _G2NàBßû¼×!…#Z$>$[# "Ç ÐWFÞ  fĘÌ;› âŸû£ôeîé ä?áßsÞ2ß ákã°åUçèíçUçâæ)çkè£êfíðíñwòxñïîë“è¢å„ã?âöá©â>ä}æéÕë·îÚñ{õ±ù`þR#u ¡`p¢oºšåIS!²"6#Ñ"Ì!{ In O¡È›í»ý¯®Æ­ r~ÿ|øþñMìiçfãxàÊÞÞ•ßœáä4æ¯çDèèªç“çcè*ê¾ìïüñ`óDó¢ñÅîVëèjåËãGãáã~åÜç£êíƒð‡óÏöŒúÜþX× ®§«Úi¤ßw›Wi5!<"g"Ì!® qiÉ™»D3²œôà ª]ò…”û®ôAîkèDãß1ÜæÚBÛ Ý³ßžâåÁæaç+ç³æ™æ[çéšëOîrðoñãðÖîÁëMè2åøââáâGãpå6è7ë(îÿðäó#÷üúŒÿ•ŠЀh?6–½Æ ."›#$·#œ"2!äý¦Ë%vŠ*DÒá‚®1Æ +†\úOóÆìðæâ`ÞHÜðÛ9ݱ߯âuåtç]èAè€çÉæ»æÀçØéŸì]ïKñÏñ­ðî¨ê ç'ä4âoáâáqãàåÐèãëÓî¢ñ„ôÃ÷­ûFQm Ô„,U™%T/Šñ #]$Å$>$ #š!W ]’ï-  ‡Ox ‚>ú ½Ýüôõ~ï¦éä2àÝ™ÛÁÛfÝôßÀâ'叿Gçþæ^æ æªæcèÿêòíƒð ò òuðží'ê׿8ä²âJâãôä¡çÁêøí ñô7÷ÊúìþBÌ ³·¹ÒKu»êôO )" #û"#"Ò vkèèD´¬»@8‘È í—û|ôîyè½ãà¯ÝåÜ©Ýß6âÅäÌæççèœççþæóçæé}ì-ï=ñ&ò¥ñÇïùìØéþæÞä¯ã‚ãWä!æžèrëcîVñhôß÷ôû¥®£ ¤0³Y†ŽÏ‹õë+W "ß"Ñ" "Ð ˆíÃøX¦©1 _ç•EÊ F-þ&÷³ðüêÿåÎá®ÞßÜœÜÀÝìß‹âåÌæ¯çÃçfç)ç€ç¯è±ê3í ï\ñåñöðÂîÏë½è!æWä’ãêãYå¡çxêí†ðó¸ö;ú3þ–,¥ ®å8­uÔ‹…$<kQ!ƒ"Ý"l"m!8 RöJ–6PãçMþ¹h Dý€ö8ð’êŸå¢áäÞ¬ÝÞšßâ’äÌæJèçèºè9èþç|èÛéîëDîCðEñàðï ì“èNåËâiáHálâ¨äœçÒêûíüðïó÷³úÍþU} htŒÒxà žËŒ¡±N!."4"ƒ!b ;Råå?¤áºÆÛ^F†ö gNúºó“íè+ãTßíÜ9ÜÝLß#â ådçßèRé é‚èqèAé ëíðòÑò.òðí•éoæäðâþâL䔿qéiì8ïÚñvôf÷îúÿžM§ K®F«™3\Àõ”!d"P"Œ!s W?X´T"i lî ÁÍþ²÷ÿðìê¢åBáÞ…Ü‚ÜäÝ2àÔâ*åàæ»çÔç€çiçè©éì£îëðEòMòèð`î@ë(èåïãZãìãŸå3èNë‡î³ñÅôó÷jûAÿqÆö ®¡¬Õ\†°&4êOC Œ!ÿ!š!š Z%<»ŸÏ9 o:O¨(© aKûkôAîçèsäñà¦ÞÅÝRÞüßPâ¼äÁæ"èºè´è|è“èqé ë#í@ïãð‘ñÿð2ï}ìn陿eäãÔâ£ã{åè$ëUî}ñ¼ô6øüWäq ¬ S%!YùG"¥r0 N!V!Ç Ûßi&+V‚}!ŒB-, ÍÙþÌ÷:ñdëdæBâ5ßnÝ ÝýÝìß`âÕäÝæ(è·èÈèÐèLéxêMìîðöñEòVñ@ï…ì¦éç5åAä_ä¨åíçÕêøíñ'ôH÷úGþG{˜ [€ßvgà&ˆcΰ»Ø r!\!Ç 6›G<]–¦i»€£ºQÄ 0ýö¦ïýé*åVá©Þ`Ý‚ÝÖÞüàhã¥åJç"èMèèè¦è'êSìÂîÏðåñ­ñðlí5êçyäÔâXâãåÔçëkî¢ñÇôø÷uûIÿ]‹ 'R¿Ÿ#Ž+AÞɬ5 '!a!!F n©.UŠ9oøM`P^-úLó%íÎçOãà߯ÝíÜŠÝFß­á>䋿>è3é„ééÐé¨ê<ìIî_ðóñŽòâñ ðXíNêrç:åõãìã$åoçbêí¥ð£óœö¿ù.ýëò +õýj€”ÈÕ߇ à ¥  >3%fºA]ö´}.¬ ¼ÿløªñ³ë§æ‹âßêݦݦރàÎâåÌæóçnènècèÓèúéÌëðíôïHñœñÄðéî[ì éç@åWä˜äæcèaë®î òpõíø–üx|: •SW¶~î?Ưã¸Lb Ð š ï1wĶÁ̧:=“icBÈù¡òMìçÖâØß(ÞÃݘÞYà¤âåç©è˜éýé=ê¼êÕë…í˜ïœñ óºó<ó§ñ8ïdì’é&çjå äïäVæ›èjëtî¥ñõ¡ø™üÏA  v($~SÏ+¬|·=×8 _ ýnÎA΋iV1Ú70YVö Qçþr÷‘ð¨êÁåðá8߯ÝOÝÞßwáyã=åŽæMç§çíç…è«éaëcíQï¶ð?ñÇð]ïDíÛêŠè¸æ®å®åÔæïè»ëÛîòWõ²ø7üìÿŧx )±‰¤(DB}3p µú; ì;]‚ÔjH^”°€Ý•z_ úðý ÷Áð/ëlæâÄß6ÞêÝÈÞ~à¯âñäàæ3èáèéIéáéëðìïüð&ò9ò#ñïuì¼éaçÇå2åÒå…çêùì ð"ó=ösùâüZ ¶ ê‘–ýÒ7rÚ¾+ñÆJAF¦ß+ªg\u”™dÏ·—9À rmû•ôZîõèvä áìÞ*Þ®Þ5à^â¶äåæèéÍéÅéäé¥ê)ì9îTððñ§ò6ò¥ð0îSë‚è@æìäÐäëåèôê%î\ñ|ôˆ÷±úþÁ’ c ¿tbƒ#o.cãa“Jn"–ù€/&!ém’<=q’‰ \vþ}÷üð5ëHæXâ’ßÞËݺރà¸âñäÚæ9èéŠéêãêBì îìïrñ9òòãðáîaìÈé}çëåKåÌådçÍéµìÂïÑòàõù€ü@8D: ÍÌŒS‘Žœß% (Ñሖ&Ár4¼Cbð¶wø+ ^!ûôÈíXèêãšàÞºÝÞ0ßùàøâãäjæiçøç`èéQê.ìkîŸðXò>óóÝñØï[íÝê½èGçÁæSçõèjëeî‘ñÍôøjûìþœ\ € vÀI$ph\#ˆ e^å ë³j2/PY/³Ê3Á3`U‰ú"ôkîéÇå ãwááˆáÆâ_äæ…ç˜è3ésé®é@êjë íïÒðëñòBñ{ïí{êèSæmå—åÔæøè­ë î§ñ¹ôâ÷)û£þ?ãh § |ÄceÙú\'aêvǭ݆4îǾÇϰQ‡94I@ Øþ}÷Sñÿëˆç$äåáôà=á…â„äÔæéÏêüëˆì­ìÔìfí¦î{ð‚ò>ô$õéô“óKñ„î»ëyéèÔç·èêí±ïaòæôJ÷±ù?üÿ7~ÈÒ cN—?ˆ­Å¨^ÜìpƒIñ«Â T†‰NÂÖf=ÎG Ù üvõ{ïNê æäâùàVàÕàBâ>äoækèäé³êîêîêëÏë.íïîðlò óÑò†ñhïÜìbêkèiçœçéuë„îÑñ$õOøHû3þ&A€Ð z@HšgñH,lÖñN2¶eÜk˜¦‚þû@˜¹˜ b™ýÝö¥ð=ëÆæLãáñßàáÃâéäçéŒêƒë ì}ì+í9î˜ïñGòßò¡ò‹ñ¶ï|í&ëé…çÒæçUèNêÃìkï#òÞôÀ÷àúRþæ± 1 2…%’¹éV/cÓC{XÑó΂»m:î¢Aêãß´_ 0ªýX÷”ñ‹ì[è'å ã ââõâväKæ è®éÍêoëÌë?ìíZîàïYñ^òªòò¶ð©îHìæéêçŸæ@æåætèÁê|ídðcóuö£ùöüs¢ þ _  “…§ïSˆ*‡±«˜|bL>>8%çL ÑU©B¹ûõFðÚëtèæÕäšä:åoæóçéÊê³ë ì,ì1ì‘ì…íï¹ð<ò"ó9ócòÄð£î[ìeêé¦è0é†êˆììîxñô¥öRù)ü3ÿdºš V üÒñ€ˆÖ@Ž–A¦ÐЯ|LÔ§w.°Ä'ŽÂ ÂBýÏöãð»ëwç5äâ áYáâšäçéÕëwíkîÓîïQïýï ñMòióôôLóÝñð%îªìÕëèëêì·î ñ¯ójöù«û;þà¡~f = ÐôˆzÑØ¤""ƒ `O®’|Ë.ªBæ€ú;3Î÷‚2 ëÉ&ürö ñ)ìåçkäèá{à@à áòâWåâçê¾ë²ìíí3í¯í¬î ðgñaòò×ñ@ðî¾ë˜éèfçÙçZé¸ë¦îÝñõ?øQû]þ†Ê%u N| ÷NT@p ZÂÿ×?G ¶VÌ¥W|©oŸþIu ¨Oÿòøóíí«é\æäÜâ™â(ãAäŸåóæðç|è–è]è.è`è(ésêùëXí6î]îºírì¿êõètç‰ægæç¯èãêˆí\ðRóSöeù§ü|à â 0Ûã[wzµJU¹MÜ'¼®u,á˜`0ážDÄ]Íü )Óÿ„ùÂóÓîãê èlææ­æ<èNê€ìnîÍï†ð¨ð~ðdð­ðoñzòwó ôúó+óªñ¨ïníVë±é¯èkèÅèé¼êüëMíÈîð×òÇõcù“ý xv ™ ´Êùæ/ n*ö…ž3W3äŠ3ê¬aûuÉñÖ`VtŒ šãÿ÷ùRôOï&ëûçñå*åšåçOéÉëîÐïÏð!ññëð/ñüñ3óô„õéõ’õŠôóoñ ð0ïï¿ï!ñ ó5õo÷›ù°ûÑýž_G µ ÖV oeT|G•Ųiþ ¤ } – â J²õýÈtå Ñ ÿ %(8ÿÈùIô$ï êüæsä0ãDãŠäÌæ›ézìçîðañ}ñ=ñÿðñµñÆòôõ õ„õÂôyóò¾ðð$ð/ñóõwøbû3þÊ<š  J ìSG£HNÕ-©Š÷é#UOÎÖ|í<†Ç T’·½¥\Þù s €ýööÕðüê¶åMáýÝùÛ\Û+ÜAÞ?á¦äêç‰êSìXíâíZîïð†ñóhôõÓôÈó&ò@ðtîí)ììˆì›íïŒð òÅó õ×÷£úþ\ J$òÎtwZ ä£öw§œ}X4¸NÄWŠž^~¡G 0Ýüèö¾ñ©íØêTééïéaëþìWîï$ïîUíìÝê/êééÖé›éé èÆæTåúãââGâUâãkä@æ]è’ê×ìïxñôH÷û5ÿ¤íÁ Þ!ƒ %èÀålOWV&ŸÔϲŸ–‹g³'õ`ÜAS®- \÷ÿúsõñ©í\ë@êCê@ëèìÞîÁðEòAó²óÙóýónô2õ,ö÷ˆ÷o÷¶ö„õô“òVñpððð_ð ñëñÙòÅó£ô{õjöˆ÷øøÂúëüIÿ°ïÍ:D Ð ® Ç  SrXÓ„$¨æx÷p•?³  ¿£ÿZù‚ó‚î«ê(èçSç½èæêlíÕï¾ñâòDó"óåòûò¡óÊôö÷ƒ÷#÷öôðò™ñæðùðÏñGó8õo÷£ù¾ûªý~ÿ\yæ›x 0èÚ ù¼º.kÞÓí u §Á©“Ôld¾oO8Þæõ×|þ'úTõ‘ðdìéùæ,æÌæ¯èœëïžò®õè÷*ù’ùcùùËøÖøþøù½øÑ÷HöOôBòjðï•îÛîàï}ñó¹õø÷8úuüÈþ\O¤/ ¬Æ;Ò‰{÷IÊÅZ~önKp,±-¬(žù1:ÀVà]¯ ” Àì@úôçí0è9ãTß²ÜaÛYÛfÜDÞ‰àÜâïä§æûç%é\êÆëPíËî÷ï¢ð¾ðQðŒïžîÓíDííUíðíìî2ðœñó„ôöµ÷©ùÿû´þ³¼– Ú þ “ Î õ Lû€ ‡ÇÌŽ6Ù‚-Ð@p:«çS²Yèh ±vþ›ø·óð îwí>îð?òTôØõ{ö@öYõ0ô0óºòÙò0ó+óGòTðí;êóæäûáÝàÌà§á+ã2å‚çê»ì‰ï‚òÄõnùýÏá ö 0‰!=4VàÎh—xåÌ:TC%ëÊ‚ˆ Á ! $ „ ‚ Ú5‘&ýnøòóð6ígëÊê\ë×ìÐîÊðEòóûò^ò–ñ!ñdñ–ònôdöå÷ø?ø÷{õÞó¸ò[òÔòô¢õr÷0ù¼úüDýfþ®ÿKO ëÍ ô  A –ŽÅ²¡®¨ ‰ € ¯ÖUó â (·WÖÛeÅ(¡ # r * Ü=NŒú¦ôWï&ëièSçÙçÅé–ì¶ï…ò•ô«õÝõ‰õ*õCõö…÷ùNú¿úLú*ù¯÷PöpõTõ öa÷þø‡úÏûÉüýLþ>ÿ ž=Rƒ RTK=Tçq d  † ª 'ªãôº} 4 ± Ëu½à>þ,üæú„úãú¨û[ü}ü—ûhùö4òLîúê²è¬çèÅé€ìÇïóÄõ­÷ÈøDùsù®ù;ú$û üÆüÃüàû8úøÄõ£óüññÄð,ñò>ó˜ôö}÷ùüú<ý9ÉL t ï”fœl.#o+"8:ÿxµÁÃÆÏÌ¢,V-ÎaÐÈÎ Á V + Ý ýøUóTï<ìêáè`èJèXè>èçç[çµæ/ææ§æèêMì+îFï{ïéîçí×ììöëœìðíÂïÃñÂó”õE÷ËøNúîûÆýïÿUÈñ‚D ; ¡ÃÕP‹] u |,­¶”{­.í¯>‚hŠœHñdCD2 :ÀZþŒúœ÷®õÅôÅôsõ€öŽ÷Dø‚ø9ø¡÷öö†ö†öööœ÷øÑ÷×ö'õóÒðÐî<í,ìœëmëoë‰ëÄë:ì%í˜î»ðŠóÿöæúÿðEµ0 Ê Ç ‰ Q s  = à kñµÚ™j³ïûË S ¦ äBñýTïð³±ÿâü•ù=öRó!ñÕïsïýïKñóõ¾öþ÷¬øÎø…ø øâ÷ø÷iøù„ù´ùsùÜøø4÷‘öNöxö÷ ø;ùúü½ýpÿ,ê¦a¿ * / ­ ” ñ ã • ?Nü!ŸSº6 ½ Ó Ë ž D ·.g¿Fò¼A›[b½ý¨úƒ÷®ôlòÚðððšðœñÎòìóÅôFõ„õõÊõ)öÄöw÷ø6øþ÷w÷Éö)öÇõÒõaöa÷©ø ú_û–ü¸ýÍþïÿ,ŽÍ–L ¼ °  Ÿ  T p ÷ Õ Ô Æ wů>œ î E ¨ ú 0  Æ)]}¥õþ…ýaüuû’úù%øxö®ôó”ñxðÇï‰ï¿ïrðƒñÀòôõñõ‹öÿöt÷ø½øvùú;ú úù²øÀ÷àö=öö@öùöøùûÚü©þp¤$¢+˜ Õ Á \ ª Æ Á » É  ‚ À8yn•ó X É N Ç ' ] c BÁ|ˆªÊ£ÿþü®ù:÷äôíòlñxððð{ð)ñÝñcò™òzò ò»ñ†ñ³ñGòóêó‡ôÐôÊôyô ô£ówó´ókôšõ.÷ûøñúåüÅþwÓ5¤þ ñ \ m 2 Ç b $ C ¼ r < ² À X ¥ Õ m õ ’ 9 ÎD޳Ĩ|ªþÚ3ÿ(ý÷úÜøùö{õpôìóúó~ôQõ,öÏö&÷#÷àöœö”öèö‹÷Røõø3ùøøGøH÷/öCõÂôÊôxõ™öøžùûoüýþvÿ~Ì]$ëw  A m 0 ¬ - âû| I 2  o j ô * I v ÑGÃ#QT0î‘gj@ÿ-þü©ù÷ÇôÔòrñ¹ðÇð”ñóò›ô&ö^÷øUøMø[øºøyùpú_ûü#ü»ûÞú¼ù¡øÔ÷Ž÷â÷ÀøúùdûÚü-þFÿ'Ý‘‚ÈZ©ú Þ C 2 Í I ï é e K u Ž ]©i¬ » ¾ Þ  t ËÿÊs"þ4ÚØÕƒyÿ¬ý5ûlø—õóñ«ïï]ïFðœñóOôõ†õ¨õÄõ,öóöø0ùúsú@úùøl÷¢ö_öÌöÑ÷DùÕúaü²ý·þÿ*ñö`$þ• ¢  ë _ š ä y | õ ´ m ã à \ h O D€ùóèŸe£çI!,óöîÙù§ý;ú÷ŒôÎòùñíñ}òRó ôsôsô0ôêóúó„ô~õ”öt÷Ñ÷“÷Òö¶õ˜ôÅó•ó-ôxõH÷;ù û€üýAþÍþpÿuùõ=‚m Ê l \ Á Ø ò W 6 £ s j 7 ” o ¾ ¼   º9ð™ëñȯÎM)7&—K-þxû…ø®õGó‘ñ­ðšðKñ“ò'ô¼õ÷ø÷›ø8ùúù û^üªý£þÿ©þ¤ý.ü úOùqø#øXøøøÂùú ûVûrûŸû üßü6þúÿìS#zn< Uê¿ ¦ V — \   n‹ë1³*`Ö¤Å"q]‚³ýþ¶ûJø$õ§òñHðjð7ñzòÖóýô¹õ öööKöÏö“÷tø(ù|ùcùäø<ø­÷w÷»÷…øÊùjû(ýÐþK—Æï8—v Ê Ú } ˆ   È –ŸÌë1Y4Ÿ ]"#œ¥#âø Ü¡‚¤ºeÊx%¾tþ¹ú÷úóÌñ°ðŸðxñßòôôõ ÷½÷3ø›ø%ùòùÿúüûülý^ý×üùûûúnùùùWù¬ùòùú;újúæúÁûý›þe9á5”Çå,°…£ ô a ¯ ´>;·Ô × ñ H á š ] • `Úu1 フÂà ýžø5ôQðfíšëôêKëJì›íéîïïð ñ\ñÌñ‚ò‡óÍôö1÷Ü÷øâ÷}÷ ÷ªöƒöŸöñöf÷ó÷ŠøDù;ú‘ûMýhÿµC ‡ b ® „  · v ` c h ` ( ·æÖ ž¬8-aµ y è } 8ø± ¶T˜m Édtý|ù­öõZô5ô>ôô´ó ó?ò‹ñ#ñ&ñ€ñòˆòÃòòüññ$ð8ï„î9îRîËî{ï@ðñëñóòLôÿõ øWú¾üÿ)å;/Õ_Ò4“ë9|§··Ö L = P c A·Àcµ î  m Þ m ò 0 Æv16þ úBö]ó™ññuñµò~ôxö‚øbú üzý¬þ¼ÿ°‰.}<jnþ²üû©ùøÎ÷d÷<÷4÷J÷t÷Î÷fø6ù>úpû»ü%þšÿMc;Û=eL‡MR›(ïãö3 - ý ‰ Ø ö î Ý Ç ­ , y + ç÷ÿŸûˆ÷ô³ñ=ð’ï„ïÞïðgñXò<óô¿ôCõ¢õëõö:öNöPöPö\öxö¢öÝö.÷œ÷Gø>ù•úMüUþ‘øFd% h * u j  ¨  k µù)CTyß›´%Å~7ÝgÑ6©; é ® d è )  ­ Í n ˆè]þÄú…÷õió¤ò}òÈòXóôäôÁõ‘öE÷Ô÷9øtøøøtøOø#øå÷‘÷÷xöšõ„ôUó?òxñ)ñañ.ò…óFõH÷Gù,ûÝühþãÿ^ê‡)ÉL ­ € 4 ó á”(±ýÌÁ9‹rÁÅk° 9•ª‡ÿ4üÓø°õóòÇð'ïîlí9ízí îìîúï ñíñ‹òÈò²òfò òÃñ™ñ”ñ¥ñÁñÆñ§ñYñëðð=ð=ð¢ðrñµòZô=ö.øúÒûoýøþxëiÍ ° ùð%·· Ÿ 3£ÕÒœlRh¶(žìér€‡‘5rLÚ D¦/êýû…ø‹öõô…óó“òíñùð¼ïIîÌìmëFê]éžèþçiçÝæPæÇå\å$å=åÄ叿èÅé­ëºíÞïùñ ôöøúEü|þ¹Ñîè–›U _ Ç l *Äûnw9×iŸ4«éÞ‹ ö A ‚ÌDY]ÿlý¨ûúõø<øø¬øõùÉûÎýÿÚBÕÇÿkþýüû7ûÄú‰úpúTúú©ù ù`øê÷Ñ÷#øÓøÂùÐúÝûÀüaý½ýþýRþêþÐÿ X››/_/Û|ÈmduzA ± Û Ù Û ø - _ s A ¯ ¤8(2yÿþåüàûÇúùøVö‡ôÈòMñNðôïQðKñ–òÜó´ôïôŠôÅóßò9òòlòLópô’õ}ö ÷V÷z÷µ÷JøLùÒúÃüìþ!.ïN[.þì  g à ýÓ$ä"ù u Q ‰ ” ð  » 1 ‰ æ W Í ; ‹¤ƒ/ÂoPôÿÿÿ`þ9ýšû¦ù“÷õôçò^òfòâòŠóôkôAô©óÑòðñBñôð ñƒñ òËòZóÂóõóô'ôkôÛô†õjöz÷¬øúYûÀü9þÍÿƒi{°ï  $SH/7‰Æ‚]D½ß¾s¬ ? ¼ " ƒÒ-¤N!ÿþ¸üûíøjö²óüðîœìHë³êÇêdëPìBíîtî’îkî>î>î|îï¶ï~ðEñ ò¸òcó ô¿ôõ†ö¤÷ÃøÐù¶ú€û:üþüðý3ÿ㹩š >\Äoz&¶mr׃R·*®0ŠÀÚØ¿•f ?  ú ÈrÒÅ2%þÊúH÷ïóèðtîœì~ë ë$ëœë4ì²ìèìÑì}ì#ìüë&ì°ìíkîWïð¾ð,ñ‘ñóñqò.ó-ô{õüö¬øsúEü%þ/Rv u %Zú˜ç0“ < . B & Á     BÀ}dP?Òrÿj£žGš“þHüÞùˆ÷gõ£óGòVñÚðÝðdñ^ò˜óÞôùõ³öüöåö¥ö_öPö‘ö)÷û÷êøÛù—ú û/ûûæúÕúû­ûÆüXþ@^Ÿz T V # µ  ó –  P ý ’ Z ] y š   y  O nuƒ±¼˜|FÂÔr ÿtýüúcøÁõDóüðï`íìë’ê„ê ë:ìðíúïüñ¦óÓôvõ¹õãõ2öàöè÷Dù¹úüýˆýcýÉüæûüúhújú,û­ü·þixG © 2 Ø š Y ó 7  – Ç Ä Í  ÅÖ9 º ; ‰ • C ¦ ê1ªS1#  ÉCjWÏ_Íþ ý$û3ùi÷æõØôOôeôõö ÷#øÜø3ùù¦øøa÷ëö¥öxöNööàõ«õ”õ õÿõÒö%øïù ü;þQ+¤´mñ{  0 * Ø  ­ ´ R ÀETûR·;WvšÍìé³;yŠzu¨¦ÿCÿ¿þûý×üKûqùˆ÷Øõ’ôÜóÅóFô8õ}öÔ÷ùúúàúîúÞúÇú¶ú¨ú•úvú\újúÊú—ûßüþ—»Ê†°.ù?5'Rõ·ŒSɶÂ}g¨8,_¥ œUÎLsU.Øÿ‡þÆýBýßü€üüû/ûýù|øÚöQõôZó(ówóAôvõöö–ø5ú¹ûýþáþZÿ ÿ¹ÿ®ÿÿyÿšÿ2VCœÞ ¹ ü o # H $ ý Uùð tÅõí¬9“³ WâS¹ÿDþý[üüü)ü#üàûNûjúIùø?÷Ýö÷Ú÷ùLúQûàû¹ûàúùø™ö†õéôÂôýôõ_öo÷Èøhú:üþ¼ÿÆþÒoÿu–b³; ¨ ˆ ›·Ô  õ ÉîÍ|俳l­^¥¥›ž²×ñïÿÂþ‹ýlü¢ûQûŽûHüPýkþQÿÐÿ¿ÿ%ÿþèüÏûû¿úÕú,û—ûÕûÉûjû¶úÊùÃø¯÷¢ö”õ•ô¡óÈòòµñÆñGòGó›ô!ö™÷Ñø˜ù úWúØú×ûýØÿ¤£^{ ³ Ý   µ éòoß ¼ ñ Í ‰ Q C T p O Í ß§Q5˜•' ègJ†$`€Øÿ¯þ(þ>þÅþŒÿQé4#¶úÿøþµý7üyúŠø‹ö´ôAó[òòUòûòËóôéôýôÍô|ôFôbôõ@öû÷úëû?ý¸ý(ý¾ûÖùå÷\öõsõöH÷Ùø’úVüøýŒÿ/;¤5 ¸ ýÇãS<àœ€‹Ÿ³š=xAª Ý  ?—έ”s-ÿíýÏüîûNûÕú_úáùDù›øí÷J÷Òö—öŸöÝö4÷“÷øføËø3ù¼ùvúmû–üÙýÿÇéHáþåüÂúêø¡÷÷H÷%øhùÄúöûÔüiýÎý+þþýþvÿæÿ®ÿÿcþâý¯ý¸ýøýZþËþ;ÿÿÓÿ”j¤-Ïd½´ 2 8 ä c ížtJ –»m¬ª•ÿ›ýÝûNúßøw÷öÇôÈóqóôÍõÎø¾ü-U Q  €M…ýü­ûdüµý8ÿjëT˜ÿÿÿLÿÍÿ:\0ÿþ.ý­üÃüXýþÅþøþ“þýüeúÜøÜ÷ƒ÷Ü÷Îøú¹ûoýÿ®B䳪© ‘ E ´äÇj×)ë/ï ¥ êCöóý¥<4ö2åtþyùÐô ñ’îlící(î@ïNðñYñ”ñèñžòÈóKõåö?øùïø%øåöÏõKõ¶õ÷ù,ûöüçýÀý–üÇúÈø÷öëõ†öÆ÷`ùüú[ü[ý þ‚þêþeÿéÿ{}³ÆÌüˆ|Ó\âI e @ ù Ý ÇÔøã4–ÕÐ³å ø ~ßBƒHjÿý«útø¸ö—õ'õ/õ~õÁõÕõõTõIõÄõ÷òø_ûðý8ÔˆSu_ÿQÿÞÿƘ7¾ãæ [Ü‚ °e·ÿ;ÿïþËþ•þþ ýdûùröìóòSñÑñó$ö8ùEüÿliqî Ç ê (ÁËLeYMGŽ®{:† lÜý@ûIùƒ÷’õó ð‘ìûèÄå(ãMá,à«ß£ßô߀à4áâqãKå¬çvêPíïï òó3ôZô8ô3ô£ô«õ4÷ù'ûûühþ0ÿ_ÿÿ½þ„þ½þ|ÿ¹JßWs0î÷xxÌ=‰œŽ¢?·S ºõ0öã!Â$&,'ñ&& %$X#ë"ƒ"Ý!¼ íoUÇîõ ì Ï¢Xýõø ôuð»ì›é4ç¨åÞäÇä,åæ<çÀè ê¸ìõîñÜòôsôAô¡óõò…òžòZó¦ôdöJøú,ûšûTûúùºøDø9øˆøíø(ùùiø€÷”öéõ®õëõ†ö)÷t÷ ÷šõ"óïïwìIéÏæHåå:æíèí}òÅøŠÿQ¥ €õ¸ 2!X#¨%9(+ó-0[2G3.320S-*x&ª"–Šç |šÿ†û?øÏõýóŽò4ñ´ïîgìÝê éäèÐè]éjêœë¡ì9í`í(í²ìJì,ì‘ì“íïüðíò¦ôñõ”öŽöö5õ|ôôïó ô%ô*ôô“óêò1ò§ñˆñíñÀòÂó®ôCõWõáô0ô·ó"ôüõvùcþ-' Å‚&´m²ß5 Ý!Ù#÷%ð'])È) )#'h$5!ߌEŒ¢ ÙoýMøáó~ð-îÀìùëjëÄêáéßèûççÙçòèÄêíï‘ñðòófóóòwòòóñòGò§ò óqóòó«ôÄõ:÷ùû<ýCÿë¯×µSÝVÌ8ÿóý&üÐù÷Þó«ðµíxëIê‰ê€ìKð¼õ=ü˜ Tù$²Âa!ˆ"D#¯# $•$£%j'ä)ë,*0 3056`5ü2ð.)M#Á_~N Ä¡¯þ¹úœöaòîäéôå^âC߯ÜàÚÙºØ>ØØû×+ؘØ5ÙÛÙuÚùÚoÛëÛtÜÝçÝáÞàMáÈâŒäªæAé7ìïíòKöcùèû¸ý˜þžþËýYü‡ú¤øÿöÛõ_õ«õÚöùuüx\ #u•ü! #Ô"¹!C tÖ- 4"O$Õ%H&s%X# Çñ: üV9ýùVöÐóòùð‘ð¥ðñjñ‘ñ:ñVð-ïî`í(íí„î5ðoòòôa÷ù=ûœü¯ý|þ"ÿÓÿÄö?¿Ï¤?‹“|t|zUªè¿ÿðü;úl÷˜ôÉñ8ïBíiìBíTð õŽü ¨-_I/Ì 6k+¾ö'–v O _ b / w B@Óù" $ë"  ©óúfß Ø Ô·ÍþÂùNõ¾ñïí,ëáè¼årá&ÜBÖ€Ð}ËÀÇšÅ,Å:ÆRÈàÊGÍCϸвÑ[ÒêÒŠÓkÔšÕ× Ù»Û£ßÕäÿê‹ñÀ÷èü² 9{tþÆüëûYü|þ» ÕZÇ!G) /¾2|4Þ4£4c4456r7û8©:g< >½?÷@ƒA÷@û>~;’6{0n)œ!6¶µÆYü¬ø¢ö¼õõ ôðñ¿îìêçìãÌáüà‹áAã«åè¼éê~êêé;é8ééúéxê¶êeêyé+è¸æQåäã…â‹â0ãhäôå½çÈé?ì2ï…ò ö]ùü¡ýçýÌüúw÷Rô¾ñrðñCôäùPy oˆk¾"2%¿%¦$”"N wl7€¯á ™ ÃOË|Ep øÉpèo–Mué²ãÆ ñ  t { V 9’±Ô ‡ Ù„ú³ñ´énãZ߂ݘÝßüàäâbäbåàåÌåìä%ãuà?ÝÚ<×gÕæÔàÕ+ØaÛÖÞ²áhããþáòÞÛèÖÓ­ÑUÒPÖRÞTêyùá Xæ%i.â264½3»2î1Ì1a2q3È4W6)8F:\<™=ù<Ã9c4#.1(#wC,è[ ¬F¶`þ#ý üeú–÷òó÷ïöë0è å0ãã£ä+çŠéúêVëÿê5ê*éèç}ædæ€æ™æªæ×æfçkè£éÒê ìˆísï™ñ¦ó_õÁöÃ÷zøêø%ùZù¦ùýù'ú¼ù–øÄö‡ô1òð¿î½î°ðõrû"é Ä,ìðèiÝ¢Æ<²¯‹Ù~Z sÔ ÿ´þ¿þWÿë^NO !¤Ð$ó'¬(#'â# àQŒ(2!Ñ"¬#i#Ú! xƒ … ¥Âþ°ö2ï¦èã`ÞpÚöÖ´Ó»ÐTÎÔÌ)̾ËËýÉáÈ-ÈøÇðÇÑÇˆÇ Ç‹Æ)ÆÕÅ—ÅuųřÆhȪËÎѵÜÌì«ÿ2þ*%Á'Ÿ'x&¨%:&Ž(),÷/ó2Ù4$6r7ˆ8Î8»7¡4“._%øß œ;ùcòÙíÛêÈèÔçMèÈérëVìÝëê×çÝåšäËã>ãOã|äüæ—ê®î…ò°õ[øØúfýÛÿëfO·Í÷‰¸`- Ÿ x µ z Õ ì  é ‰ ¼ Ñ 7 ¥ $ ÈxæûPö!ñ íØêëî£óôú 8 â|wŸ!U#R$>%s&(ý)÷+#.*0j1ô0%.ó(j!ó 6«ûô£î¿éÚåãásßïÝÆÜžÝÖâ<í úÿR²¾ˆ ŽàŠþºþ9Æw #kÝ´_Œ ÆCûFô‚íÁæSàÛÚëÖbÔ½ÒÑÑÒ£ÓÖءؙ׉Õ3ÓÑNÏÍÆË«ÊÒÊM̱΋ÑsÔßÖZØÐØ|ØØAØxÚdà7ëúø ɨ!Ÿ'+7-/81Ë3~6Ô8:m;C<‹=O?AHBB•?D:E2–(ºr)sŒqHpø£ T•ðË úõ¾ñ!ð,ðƒñUó‡ô;ôiòÊï1íNë\êFêÕê‘ëèëxëKêÈè§ç^çÔçkè½èºèŠèXèè>é¹ê“ìßíííHìAéƒåÚáÍÞ^Ü@Ú.ØVÖ:ÕmÕi×Ü-ä)ðþ¢ ßÔ"3$v$Þ$s&ž)û-™26©9ô;>Ù?£@¡>8ü,1ªUýãõ/ð.ìvéXç‰åTä å•éÜò0ÿ= ;ZÞ ©˜r Ý ”ôª!ë""R4³Ì ´ &ÖÅÿæûÅøÕõÑñ^ìÆæ²â»àîßäÞöÜ_Ú‚×eÔÑáÍ^Ë2Ê{ʙ˯̇Í|Î¥ÏoÐKÐQÏ„ÎÏÙӜܩéù ô* å!§" $Y'‘,^2B7„:j<Æ=>?®@ƒA:A±?ÁèFÞØ!ÖP×’ÙÇÚØÙ×UÓxÏüË›È/ÅUÂ)ÁÆÁÃÃË–ÁÁ¦ÂûÇ–Ò–âbõŸ»‹nðHú#üð#«+z2@7:Í;¢<Ÿ<‰;+94ë+ AùéšßYÛ&ÛÝñß±ã»çê÷êUè%ã9ÜŒÔ|ÍŠÈùÆ2ɛλÕ.ÝQäëEñ—ö ûAÿ´B1 Ëæ-Ç‘¶k$w)i-ž/Å/ó-·*”&­!éN× ¨PýCõßí#çÏàÊÚ†Õ ÒˆÑØÔÔÛ2åbï8ùÏzÔ 3³É2¹À#?'>*ü,W/Û016/ä*D$/ßV r7¡þTúæôLïÄê²ç®åêãâáà à©ãëIô¾üÆNѤυ|þãú–øµ÷ ø‡ùSü86Uɉ¾Ãü÷gñ:ìèšäóáYà,à áJâòâãÎââ¹àÈÞ4ÜÙÒÕ Ó?ѪÐrÑGÓ‘ÕÃ×ýÙÜÝŒårñ*ÿ ²F#{Wãe°! (&-Þ034î7;œ=>Î=–=ú;b6b+‘Ô €àûWùòùoýtk Ö×Ök ˆ"ùbïÃæ¢àºÝ–ÝÛÞxàBâb䉿èäèÂé¥ëÛî¯òö.ø0ù`ù0ù"ù÷ùŽüd êL&†ÿ T v°öûÔöñàêšäçÞ~ÚÜ×6×kØ­ÛráØéÈóBý :  ?  ÓÓTå!V'*+Ì-0H2Ë3¸3F1:,%ýÀ ­¤Jþ*úöÑò4ñœñ½ó¨öWù\ûýÿ‰ƒ  ]ë¯@U, Ö»»–õ Œ ð 7 u PK„ú„ôjðŠîeî ïïsïõíìê—æÎáÃÝ{ÛPÛ–ÜÖÝÞ½ÜÅÙ¨Õ­ÑïÎÀÍÀÍbÎ*ϹÏ4иÑ/ÖçÞ ëøŠj ÃüÁíl#t(-Ê0Ö3é6v:>š@A|?ú;p6q.f$—–  ù ó m(NyŸ× !ÃüÞôîßèmå´ã0ããÆâ6âÝáùáwâAã„äuæéÝëçí©îîÚì7ì`íàð}öaý íDg9 ç€Í§fýSö"îÁå„ÞÞÙõØXÜçã·î÷ú5c»ß³ ÷`è»c#Ã'±*Õ,í.ô0¹1s/()ÐÇ( »#Ëþ#üùYö™ò÷î¡ìèì,ðõÅùýÖþ_ÿXþ¢û øõmõ‹÷úÝütýþüuü.ü°ûŒúÙø÷ñõõeõïôÈóUòañŽñ óîõúžþÒv k  †2Wú*õ\ñŠîÁë"è]ãÞLÙÏÕ÷ÓúÓÖ4Û;äñ¦ÿª ÒÁ¹ÀBM7Û9#&Î(s+ß- /0q. *À"qCõý—ö5ð7ëþç—æ³æççêÜìbðô7÷ùLùÑ÷ õ&ò¶ðªñŠôøüúMü)üû£ù§÷=õóiò¬óSöGùpû–üGýRþ$ÔuÛ ’ßè¹ßÝ —þ÷‰ðvê¦ä_ß Ûû×ÖNÕ¾Õí×ûÜùå™òeÝ “`è=Aq_ujå!ì%“(Í*<-Å/è163µ2(/ù'½BE½ýÊõ8ïê”æýä¦ä¹äåƒæé¤í€ñ½óÅóùñbï%íì¤ì·î òØõùéúVû¿úhùz÷*õ%ó ò#òžòGó'ôjõl÷-ú›ýœü0 “ ]*& ‡ Tßý)÷ñðƒë»æMâ%ÞbÚa׃ÕéÔrÕ ×WÚôàì'úẫÿZ+ãwýõµa"‘&n* .1 3c3Ä1â-j'žO© áÿ¯÷BñƒìAéœçXèì‚ò8úBüíY©bQû¢öó¡ò<óIôéôÞôeôËóóò¢ðOï´îïðñ³ñùñwòžóõcøÒû®ÿùž $ ½6þ1÷=ð©éÐãßœÛÇÙ`ÙÚ—ÛêÝáÝå`í­÷Ž rwQÔ3Ó‡$˜)ê-—1·4!7‘8Ë8æ6¹1 ) Û Î ý øÅóYðîºî\ñ€öPýòq£ …™ý3øòóuññðëñ¡ó;õ=ö¢ö€öÛõô}òrðTïbï,ðùð=ñ!ñ?ñóñ|óùõùðýœ—6 8 ` aPÇúÜó¬íè>äNà¯ÜÐÙå×ÔÖ¾ÖÖ׆ÚÐߺèõ–(¶``źl·óÁ!,'&,p0n4H8C;/<Ü9È3’* X ñ·ÿ¨úªöXó¢ðbï«ð'õ†üá— ç‚ý b´þþ÷“òmï·î¼ïƒñ9ó~ô;õ\õÓô½óaò!ñ”ðÕð^ñÁñüñ9òºòÙóÿõeùÑýrƒh ÷ 5  ?œÆü»ö7ñuìè¦ã—ßBÜ$ÚbÙÚ¤ÜâCë–÷3ÃðûL X#(,á/¡3¼698K73Ì,ç#"Áxƒû‰öEòžîãëbê8êåëðgö9ýˆÞá$ûBö0óòBò¸òóòóGóô õTõ˜ôUóŽòûò•ô}öê÷ßøÈùîú[ü+þ¢Î$ o . ì ·êýjö2ïÜèãÍÞ«Úc×7Õ ÔËÓ¿Ô Ø_ß_ë@únƒlMà©#wF57!Ý&K+.b164š6—7N62«*  „÷ Ýbú„ô=ð^íŒëÒê­ë£îÀóLúʨ×Ì×þüùö“ò”ð‰ðSñòžò<óòónô8ôAóðñëðŒðÊð:ñ”ñâñqòXó£ô}ö*ù×üùØû$ 5 £ ëÆ¾û8ôDí7çùáÝéÙ^×ÁÕÕÕlÖýÙá)ì›ù)ø3òÌN³å'|¬$å(7,W/a24X4ô0O*—!z/ ¤µü÷°ñÎì>éûçÂéÓîÆö÷ÿ9½ Ž ^{Ûúîõûòoñrðïï-ï‡ïÇïšï$ïçî*ï ð\ñ¯òÎóäôéõ°öJ÷1øúý¢Dzé * Œ u¸>úPòÛêFäsÞyÙÉÕÂÓcÓNÔ[ÖÚÒà5ëø .ãÓb1%#a(°,š0>4÷6‘7ç4G.c$]Íþ·ùö3óÇðÍîâíÂî4òDøÐÿî à l&ÕûE÷Tõ¥õ÷“øÓùôú¨ûbûÍùH÷¦ôÈò#òlòó©óRôìôõÂôôáóÓôóöÂù§üÿ«ë-ÿ2ûÄõýïêŸå á.ÝÚ<؋יר`Ù…Üã™íyú­˜n, '¦•P³ö!'_+/»256ˆ8?8y4f-|$QþÌ „Óÿ2úôeï.ììéïi÷O êɳ©þÌ÷wóåñPò´ópõJ÷òøäù›ù<ø_ö‡ô%óŽò“òÔò3ó£óáóÅóŠóìó®õÖø»ü ïmÚ¢ý·ùêògì=æà!Ú/ÕÒ¸Ð#ÑÓJרÞêi÷È¢ /zÝ—ïI>Ð$Ð)?.x2,6z8E8Ù4A.O%e¸ × ü øõÜò7ñ:ðCð[òd÷êþw „Þë ì£ÿàú[øŸ÷¡÷Ÿ÷¯÷Aøqùšú÷úQúIùÎøŠùûaüëüÚüˆü ü2û!ú©ù~ú¸üÊÿÔQ°j¡‘ü!õíŸægàÏÚ Ö¤ÒÁÐãÏ«ÏÆÐÛÔXÝê`øÓ Á_mL;:kE!è&«+Ö/3,6x6w3S-0%gûj Ø÷úözñ¡íHë$ëîRôUý7„L’NÀ2ùìô£óúó¼ôõ­öøçøøëöÇô6óó>ôö–÷Åøºù8úìùÑøÑ÷ øÊù‹üpÿÒcõÃCÿ¬ùåò ìKæ€á`ÝÇÙöÖQÕÍÔHÕ(×°Ûïã˜ï†ü²ìöØÖN!&F+D/É257N6Y2s+¸"•:$ D"ÿ5úmõPñhîÌìgìäíòùœ> Ë . 'ZÿÊúø×ömöaöŸö4÷ø©øËøJøi÷óö¸÷›ùÇûýÍþ¦ÿ8juëXÞÐ ˆ ¢ Ç °—ùÌðßèíáaÜ Ø®ÔPÒ»ÐÏ ÎÏ‚Ò~Ú”æô~ÿ  r ™ µ í ãmô¼ &Ð*-/Ú2È4ê30û)€"kM "nþ>ùôLïÏëñê¬íÙóHüI( [Ñ/ Nû¶õóÑò·óõ€öÚ÷›øøê÷÷{ö$öEö¾ö[÷ø÷øÑøwø²÷÷V÷¡ø³úýAÿ€ÔPÈýÈøó[íêç ãáÞ”ÛhÙ`Ø6ØÓعÚßçGòqþ²j˜.%2eT &´*².?2O5@7/7+4ö->%\³3 4oü^÷Îò5ïêìÉëîë(îóú­™' ½Dtþ ù;õ`óó“óIôúôÒõ¾öa÷a÷‹öõÎóÐóQõÆ÷yúýTÿuO:½ Ÿ ÿO—à T¯ý¹õ%îçšàÍÚ,ÖûÒèÐxÏìÎÉÐÃÖ#áßí£ùþ_…ÏŒ@:Ç )3Â8%Â)B-ò.»-À);$c§þ} t²ÅþZù¬ó£îoëÒêíŸñ(øáÿƒM «D- CNÿ„þ¯þÓþ©þ-þJý ü¹ú ùøø¡øŠøíøáù2ûŸüûýÿãÿÁþÑ2Ë@ þ ‹ ª - ú:˜ù¯òñë¾åVàÏÛ.ØdÕUÓèÑzÑ3ÓžØâ0îú%© Q Í Ç = ¹Ù¦> '%U)à,/õ.Õ+~&F >Í÷Ï 9ŠæÿúùËómïnîàð¼õàûw§ L¢ ÿ|ÿ;úE÷Nö{ö÷å÷ÃøGùïøö÷ ÷³ööö^÷¯÷?øù·ù ú¬ùËøcønùEüŒe8 “à|â·* <ôûõçîé%ã1ÝË×ÂÓ»Ñ|ÒùÖsß¶êVö!ó¶ Á Ò 3 ?þñ Áš—"”&)ç)j'µ"þ,”ƒ ?äóþ8úQõæðîíˆíÛï‡ô!û.“y MîTû”õòñ?ò´ôf÷¦ùûöû[ü‹üÃü.ýÜýÐþéÿÁÌWÿ-ÿñÿÚ« j >ýY ?Héú©ôÈîéhãÞWÙ­ÕòÒlÑÒjÖ¿Þ¼éÓôµýRØHVf­ ¤þ¯`#\'Þ*E-u- +ü&¤"ÃPR|Á “a€ü‹÷_õ†öIúhÿÓ· ù 4 ž ѼúËó’ïUî_ï¾ñ˜ô+÷·øÖø×÷‰öšõFõ8õ@õ‰õ=ö.÷í÷ð÷÷öÁõ¸öòøüûQÿžsg9¸Ïß_ÿŒû­÷…óËîDé>ã“Ý~Ù.Ø~Ú×àjêQõhÿP­ |'¼~Q‹ I´è"Ä&L*ö,œ-F+ô%˜€á`çþKûÑ÷;ôÁðøíiì?ì™íÒðãõüüʤ}üÁõjðzíívîñô÷¼ùƒû=üüÚûüÃüõýÿÍÿØÿFÿ±þ©þ¼ÿ[HÐ çSSÓC &ý@ö ðÝê‘æµâߥ۱ØKÖ«Ô¦ÔÙ×hßšêèö\+\ ã = ã è A©!&Ö*1.¼0ÿ1H1l.**h% «Ç)ó  éÿKûÎønù¸üodÛ Á ü ÿ)÷\ñ‚îAîÄï(ò®ô‘ö ÷7ö•ô óiòSòwò½òóõÏönøù0úNûwýÄ•T j  v‰³ú¦ôáîÂébå™áÞ¥Ú[רԘÓxÕ&ÛyäÕïéúø2 l ö Á ¾ o «áÎ…#Æ'$+-ƒ, )`#d2ÎÈ ! ´ÿYû¢ötò~ï;îïîÉñ¸öýq.  #ŸÕúô,ðºíåì ííDîTï¶ðUòôöøZú¸üÿKAÅq%YÛ  FY»÷ö Dþ?ø3ó½îQê°å:áwÝaÛÜ÷ßSçëð‡úü\ðÃè@o p›‚EqÍ–Ã$ÆÓ/ È 4dû‹öqò ð'ðûòí÷õýßf ½ Ê’ÿwøò¡íYëØê~ëÀìZîðíñ£óQõ÷ùû6ýÿš†Ÿ=úÿ­ 'R'½ªQçø#ò ì¾æÌáMÝhÙPÖmÔ«Ô<ØÕßÊê¾ö)¤ë …%ù r ž Œ¦9µ "C& *Á,Ÿ-S,0)Å$8…$ý êÈþ¿ù~ôÂïµì?ì„îÀòÑ÷åüN-]ñ~úÈòóëUç@å/åzæè®ê7ìíì3íßí„ïò=õiø_ûþCl”#)½ F‚Ïø#¿Þ5 Lÿ’úöjñ–ì¤çãÄßÂÞÕàæÎí2öiý#êÎåøP¨ ~o"ÓÑÅr|4 v â4I,­üËøQõ<ótóö£úmï ¥ ó ‡ ÊÍÿÞù õ¾ñ¹ï£îcîÐîÍï7ñøòòô+÷ùñûðýeÿN \±ÿÿÓþ·ÿÝ-> P «µ¸T° mUþP÷ÿðgëlæÎá¦Ý Ú×ÿÔZÔ!Ö@Ûìãòî'úU] a G 7 o Ù‹Fk“¨!´%)Ä,û.£/n.’+‹'­"&=m) gÎJþsú]ø·øûJþEq˜F¢†üÒõQï¨ê[èâç`èé·éêê¹ébé©é ë‹í¨ðÓóóöýù™ü•þôÿ=9ap ¦?¼5±YŸ H#týçøìó(î“çÇàŒÚ‘Õ©Ò·Ò^ÖÝüæbð–÷‰ûdü†û‡úÍúJý.ÖCaEœ!„$ã%ã%Þ$<#p!ük—§ t à;!ëv `­Ñø ëÍÿù¦ôôð%î#ìÝêúé8é©è–è]ééêÆì’î)ð}ñ½òäóìô öÀ÷Iú¬ý—  û ‡Ž  ¤¤eÿÿújö€ñ:ìÃæiá¸ÜLÙÈ×Ù¤Ýå îÝöþÄÌ#Φ  œ@-[òH"9$2%¦$…"F‰zök =gžý@ú.øø0úÎýùÇž* á Jާü ÷ÃòðÈî9îî%î îlíXì:ë{êmêëŽìÓîÌñ!õcøûÚüþÿ§Ö½¾ ;“q¡;ƒ •ÿVüŠù‰öÙò`îéCå›âÑâ¾æGîû÷ŽÖ¸ 7 * åÓ?Ö¥ ï6 lLzæ   Œ ì{þûÅø ø’ù^ýÀ² 2€g qþéù ÷'õºóGò¢ðÍîöì_ëIêúé±êoì÷îöñôô™÷Íùgûƒü…ýýþK|1¼ ¦uÇ ˆ ÿxû øô@ïŠéãhÞjÛ³ÛÒßMçšðºùÕÁ¾dÚðÔ öM¾ÑÊ )"1#™#â"Þ å„É^& Ÿž¡þ¾ûáùGùNúÝü=`{5„]˜ÿ~úÛôãïoì—êìéÊéØéòéäéqé‡èrç¢æSæ^æ—æç3èQê“í–ñÄõÖùíýGå~ ± pdÛ²8ÿ °´/ýúùö¯ó@ðí¼ê«êÎíô&ü ž Èø ë È º’ d {¦ß‚G6L Þþ®ÿý úø~õUóoò©ó÷ôûaj_ ¥ ö K þËÿüùö÷åöùõÓôOó–ñúïÐî;îLîï~ð½ò†õRø¼ú™üþeÿ#qC` l äe¨ a  $îóýbú÷“ó]ï„êå–áxßôßUã3éŒðå÷ßýªJq(8½à ““— V"ó"d"— ö(ý  ”=¤ü ù¢öàõ[÷û,pì î . ; ‰æÿ{ú!öóîðpï6îíìÒê˜éŠèêçÆçõçcèeédëŠîŽòèöÿú·þ#eY å ï7dFË L 7 Rþ û%øeõwò*ïŸëRèæ~å<çë_ðÄõúÃüÜý0þÙþ¢øµc0X1còû¸›:m×  ÉTnþ}üNû:û»üéÿhy 6Ï¡t\ª â½êþØú¯÷Qõ]óˆñ¨ïÓí7ìë”êê¿ê)ëÚëíúîƒñôª÷Øúþjºâ¦ » ç  ‡ã–ý¹ú9øÏõOóðî×ëêÝêþìàðÁõpúËýLÿ ÿÖýðü}ý'Ȧ ¥ãÈ:Jĺdêj s<ý:ûsúûý‰´ºÒ ™ ð ö ã ðnÄBýúa÷õøòñïGí³ëêìééRéøèºèéQêÑìð õçù¦þû°  Ä  ² œ Á w8§+þñúÜ÷Þôòïþí‚íUîðôløðü‰‚À¸{:óî¶ 7i?* !5 $×¼:*û ý ùfþ¿úÎøOø3ùxûÜþµ2‹ 6 \qwšÙþýãú]øxõSò*ïBììéfèÔçóçfèßèOéáéìê»ìŒïXóÜ÷¸ü†ØL Ç 9 ² B ë Å ùá¶Ãý ûzøüõ›ó‘ñ2ðÞïØðJó÷Ìû‰A:Vý×fe’ ã¶M·[Ûî)Wï1 ‡ à»áþü®úñúÉüìÿ¯> ‡ jP„ÿqý4üûEûšú-ùÒö·ó8ð­ìé4çÌå8å/åNågå‰åã廿DèÛê£î›ó>ùêþ ( Ú o è A 9éyùvþÒûùöyóÚñµñ.ó öÞùþڠ㳘ˆ~Š D´¾W °"}" ÿ[ðs4 ü ñ L ¢ %ÿ»ûnù¡øŠùü|ÿÛå º¹Öý¶ûúhúÞú_ûKû*úí÷ÞôƒñcîìÒê¥ê:ëìûì§íîkî ïpðóùöü†Ä þ sw} Ù ¸n/ýú)÷-ôBñÐîíËíàïwóö÷wü*röó'Šþþ~ÿþ`ÞbïË• ; Œ¥º b ™Z_ÿ§ý6ý0þŒäˆ˜ : ã  QGfþ)ûûøÌ÷P÷ ÷ƒö_õyóöðîënè”æå@åuåæÚæçç*é¿êèìðTô©ùŒÿLI v=½4 O _ëDþuûwøYõ}òŒðFðüñeõÍù3þ§–ѤÒbÿ]ÿSQá /K@k\ Ø–3|» Ê + <¿×õþªügû¨û™ý/ u î _ ?f·ÿíü~ûdû)üýˆýöü,û`øäô7ñûí¨ësê/êxêæêVëÏë?ìÎì·ímï}ò ÷¸ü»%B ¯WfK šË&þÄû¬øbõò>ïwí‚íÍïô’ùêþöqÿ]þÍÿøT~ŒÑG°å©¹‹  åšþ@ËýüVûüqþS 1 a š Y`|ÿVümúÖù-úÍúûQúøÍõPò‡îë+èSægå'åCå«ådæoçÜè¹êBíãðÍõÄûÜr bŒDŸ ¯ÄsºýÇúÃ÷õ óiò•óîöüÏó0  Š xÙ ÿ~> „'ºÉl'¾Öù Z ópªáÿý#üüûRýíg 1 â Œ Ç[(þØúÓø%øføùeùù×÷°õËò‡ïVì é¡ç\æšåFåNåÇ叿 è®éÄë£î™ò­÷cýö­é x P  R’û¨qþüOù\ö›ó”ñÕðÔñýôú,ǘ ÿ  ŽJÄlâ ×J‹0 ýBGÑ®V ¯ Yä7ÿ.ý¶û‰ûóüéÿáö* ¥  v sàŸüsùÔ÷§÷tøùWúLú>ù#÷'ô¹ð[ímê%è€æsåáäÓäFå/æzçéëµígñ&ö‘ûë~¯5  º”-ðJþoüZú%ø2ö÷ôúô¾ö‡úxS bö/ÅÕ ’ âF œ 4#íé \!; µ÷Ý£ JÙpaýûúú§üRfV o _ XïÿyúùöÞô;ô´ôãõ:÷6ø`ø–÷ÍõJódð‚íôêõèžçëæÚæPçAè’é7ë3í±ïâò÷ôû#Øf _ ¶   ‚E5ÿýÂúJøö ô`ô¥õ˜øý€¤j ü B ý BNׇ RL“¨X™—„ªWàˆ ; î“e½ýüû°ü%ÿ»¸Q ° E ô òŒ†ühù}÷Ïö ÷û÷Öø;ùßøª÷°õ6ó~ðÅí2ëéBçæsåuåæ^ç8é†ëeîüñgöxû³ZÙØ : - e¯:þÝûÂùª÷ñõúô/õóöeú]ÿ~ yNìÜ $ ê > ! E‡©ÂÅÝ'ÿ²Y ùk¼6ý;ú9ø}÷3øbú½ýœ2¤–!Ÿ¯ýú÷Kõ•ô´ôNõôõPöö@õÙóò$ð9îdì¶êOéDèÆçÙç…è¿éŽëÑíð©ói÷Éû~ìt•  F iüwÜþ§üeú9ø€öÁõYö…ø:ü\ ÎU v ivsˆT ¬…7ù95Ôk/ ×Þþlüûàú)üºþ4ñ á Ø ³™oýÐù7÷Ïõ„õ öööÌ÷Aø#øo÷/ö‡ô§ò¹ðÐîíjë*êkéTéòé@ë íkïòØôø»ûšÿA,ÔlÄÜÔ´ÿcý÷ú©øóöYö&÷ù?ýüù\ Xbw, • ̤R z b݈"ê­¼.5 ¯FÚÈþzüVûšûBý|à‚ Ø   ø/ÉFÿ4üçùŠøø÷øiøßø-ù ùDøâöúô¸òQðÜí€ë`é»ç»ægæ»æ¯ç3é$ëUíÇï¬ò$ö*úXþìm”ß»yÿ.ýãú¤ø­öQõõ!öÖøý+œS pT B L g[A ª °ZüX‹Æ\v4›Ú ý üÈj?ý¼úkù’ùQû`þ)Õ·  Ïcnÿ¥û¡øÄöüõömöåö4÷:÷×ööÕôióâñ=ðtî‹ì«êéèÎçDèqé/ë[í®ïüñZôèö´ùœü*ÿ+oÇÿ6þgüeúRøoö*õõ\öAù‚ýœØ ‡I+Ò D ¤¸©  Í¢f-`“„ O š.pÿµý1ýþ+Œ‚ j Ú ¼ BÍæ ýÞù¯÷‹ö/ö\ö×öi÷Ñ÷Ú÷M÷:ö©ôËò«ðWîîë¹éèçÝærçÀè„ê‘ìºîæð<óôõùlükÿ­ nÆ—ìÿßýŽûDùS÷:öaö ø@ûÿW J ÊsZ Ä U v F [å&#ûîLJ½!  Õo>ÿ°üûÄú üÞþâB f õ µ ò /kþšûéù*ùûøþøù%ùùÙøRø€÷}öCõºóèñÕïËí ìë¨êñêÚëMí"ïñõò±ôuöøîúUýZÿÁx¢E~QÿÙý:ü±úyùþø£ù»ûLÿÜÔw 4žh–œLµ ‹ ª¿oL"çÃÚs¾ÙÒ µ ¤áÿýñûgû?üvþª$ï > õN¸áþ_û²ø ÷Nö&ö\ö¸ö ÷o÷o÷÷VöQõô‚òÏð÷îíƒëTêÍéòéÍê<ìûíÇï†ñJóIõ¯÷múýFÿ®B&†vÿ(þÀügûCúyùRù'ú7üyÿ¡  L@ÁñL¬ å /có0>]ÌÛÀ€P O =J°žþPýýþe‚»] Û ú © Â*âü\ú¬ø½÷S÷:÷J÷o÷i÷÷}öŒõeôþòSñvï|íœë!ê8éûèqéêöë›íFïÕð^òô=ö½øCûfýÓþ|ÿ|ÿçþêý¤üNû úùtø½øúÆüŒž Æ ÷û¯DBE ñÎ>cªS ²¥kÚ Í Q¤TÿÀü,ûú!ûÉüpÿ™’¸¡B³8#óý2û8ùø™÷ƒ÷§÷þ÷ˆøù;ùùzø‹÷4öZôò±ï‚íèëëéêuë€ìßíOïŸðµñœò£óõùöùûœüfýaýœü,ûGù7÷YõôÐóÊô&÷Õú„ÿº¿ þ ×DœS'ÓÇð«.ËTܲ2Ýw° lÐN>þ üãú÷úEü¡þ”T5Ç÷E(þ,ûÀø:÷€ögö—ö×ö7÷»÷Aø¡øÅø“øø7÷îõ3ô6ò2ðŠîíUíÖíòîYðÆñðòºóIôáôëõ}÷qùdûèüËýÜý.ýÌûéùÑ÷ÛõkôÜó’ô³ö'ú›þnðŸ ODR u 8ÏD‚¯&@.ç€ ¦ d×bÿYüúù`ù_û¿þÃxõé R r±Ž¡þVüæú0úäù¼ùžù ùÂùáùçùÂùkùíøøÒöõ×ò—ð¦îXíÔì3íDîÊïYñœòfóÖó8ôïô,ö×÷’ùûügüÒû_úMø÷õÖócòò(óîõ>úšÿ@k |=ªöo—4w’öøCÂ’Ðzƒç®å Àh5–üÞùMøøù{û£þèé÷ÍÃ/lýàúçø§÷÷ëö ÷–÷Aøùìù úû ûú¦ù.øYösôÎòµñMñŸñ‹òäóNõxö4÷ƒ÷™÷½÷Aø*ùTúpû1üdüèû¼úõøàöÊôó+òGò›ó4öúùtþ#L \ f – J  € åT‹ÓÇ;?÷ÃÉ%Ï âÿëü×ûüÀýgi »#òÔhþCûáøS÷uöñõ¨õõmõeõTõCõ=õ8õ õ|ôkóâñðnî3í™ìªìUí]î‰ï¨ð‘ñJòêòÂóõÉöÙøÕú[ü4ý(ý,üeúø¼õºózòXò£óƒöéúQéØ •uþ˜ç v†»ð^=¿'¾Â Òœÿlü ûñú.ü¦þÔæÃ)¿þKûDøö¼ôôÅó£ó²óïóIô ôÞôïôØôyôºóòñðQïêíþìÀì?ícîñïˆñâòÐóTô©ô!õôõB÷äø—úÿûÃü¾üãûNúMø=ö•ôËó;ô,ö’ù+þnð -,3þþºvþÊ&ŠßGù$û”x˜Y ¸òecý7û*ú~ú:üòþ×  º3ÌÔý¿ú#ø_öõsõ°õöaöÒö?÷‘÷µ÷»÷­÷i÷ÔöÇõLô“òèð¦ïïQï@ðŽñåòøó©ôõ2õõ=ör÷þøú­û:üüûLù)÷õLówòâò¼ôølüjEy ¸ m)ˆöç ¿|í…}ISˆY‘ Xmºý4üü&ý]ÿ›:š¿Ù=AþNûÖø ÷ñõCõ·ô8ôáóÈó ô„ô$õÒõjöÉö¨öæõôðòdñFðØï@ð\ñçò„ôàõÉöM÷ª÷9ø;ù«úKü½ýÂþÿtþßü~úµ÷úô¸òxñŸñó÷ ü”Äã ž û>ÖD(*{ÈBŸå‡K­0g 3 ¶7ÿ‘üìúZú ûèü~ÿ#ïyâ†Èý'û ùµ÷÷èöëöåöÏö¶ö™ö‰öŽö¨öÒöèö¸ööõÖóò”ñ ñ1ñ ò]óÐôöÁö÷èöÏö÷»÷½øÙùÂú/ûæúÂùÑ÷bõâòÕðÕï_ðŽò\öTûÝ2® ê Ы~¢†q23¾i%r4s?¥Žá„ ¿!Mý«ú`ùsùÐú&ýØÿ+Цޔ þ\ûøø+÷üõ\õõÍô¿ôØôõ‰õöröÝö4÷<÷×öÿõÕô©óºò6òEòûò-ô”õÔö§÷øø%ø˜ø„ùÍúü&ýªýzýuü•úøKõ¬ò¥ð ïñï×ñIõÙùáþ˜r; ñ ­ Á ­ & ´ƒ¤KªÆÌø­L!5ö  Ÿóÿý¢û~ûÀü ÿÆ-•¨k"ÿüû8ù1÷ö{õCõ!õõéôÊô©ôsôOô8ô-ôôŠó¬ò‹ñYðZïÐîÙîïãðwòô\õ,ö†ö»ö÷í÷>ù¼úüÔü¾üŸû©ù#÷ôUòÕðxð†ñô?øcýΰ† 6ïÿ¢,׺‰©ÈÖç7ý}æAxa Ó ô+Ùþ[üûûHü|þëâÙž4éÿý*ú»÷öNõ/õYõ’õ¨õ¨õõ’õõ‰õ†õxõ;õ«ôÅó™ò^ñQð¿ïÐï‘ðÚñ`óÓôàõröªöÁö.÷øhùØúü”üEü ûøø\öóñWïÙîØï“ò×ö?üÝöì ±ï5É•Yïp ® ذõJ} * €ÆnÿÌü7û û:ükþÿ%F%»TUýLú¸÷üõ'õ÷ôõFõWõ;õúô•ôô£óXó0óóÀò+òYñxð´ïbï®ïŸðòÓóxõ»ö€÷Ã÷Ñ÷ ø©ø¬ùÄúšûàûNûÞù­÷õòxðTïZïÄðžó×÷ýzMï 4 O´ò~Á Hªp "["x!•óá¹§¥t ì !f-ÿÉü«ûöû¡ý,ç ÷vž¹PýúùS÷«õ÷ôéô!õ\õgõFõúô›ô>ô ôýóôìóŠóËòÔñÄðìï„ïÒïàðtòOôöP÷øqø·øOùFújûrüý ý1ü’úRøÊõLóYñTð†ðòõ0ùþ [ Ñ ÙyjóOa·œ¦— ~ n?@Jh\ øjþøþ¢üVû@ûiüqþ®…]ðNÅþ¶û·øSöéô|ô¹ô*õõ¢õ†õ=õáô~ô*ôêóÂóŠóó‚ò×ñKññ)ñÚñóô@ö²÷·øOù•ùÞùmúTû^üJý¯ýaý?üQúÎ÷õtò~ð‰ïÞï¥ñÓô0ùAþX§¿ € 1 (  P ¿þ׳í!"³!2 À«HÎTÁ ø5°±þwü=û,û[üZþGóGTUýÖù{öÎóJòâñ?òóòžóõóòó¦ó óœòòµñ}ñBñàðdðØïeïTï¶ï³ð1ò ôüõ½÷ ùáùsúûüû.ý]þ>ÿ‡ÿÿ þgüNúâ÷Wõózññóñônø9ýKq j g ¸ ù ª -³õi~»ßí2Âׯ{B ò œUYäýüHû—ûý>ÿŸk%Šªçþ°û–ø/öÐôsôÂôIõÁõÿõ÷õ¿õmõõÇô|ô'ô¡óßòÚñÇðÕïOïeï,ðœñwópõ4÷…øIù¬ùú—údû:ü¾ü°üüû¿úù:÷Kõ…ó#òxñÌñfóoöúhÿí£ , ª œ ª o h“”Êžx!#U#7" žÿdÖV å’†òþûüãûëûýÿ&Ët׿þúo÷õêóÖóô—õŽö&÷E÷îöNö”õäô`ô ôÀó]ó×ò<ò°ñoñ¥ñaò›ó;õööøÊù‡úôú\ûüÝü¸ý>þ9þˆý1übú<ø÷õ½óâñØðñ‹ò’õÅù“þA1 « Y a Y Ï AàsaÿÓ î ' ]ÌÃy¬' ª`†>ÿªýùüMý˜þ¤I÷`‚¦ÿ:üøøgöÍô"ô8ôôõbõ†õpõ8õòô´ô•ôyô0ô©óðòòPñØðàð†ñºòWô!öÀ÷ïø¦ùú{ú ûÄûlüµüaügûÛùð÷æõìó+ò¾ðïïðxñ>ô6øÚü\'ât * Z ¹ Ç þ xÍI6!¤"¸"p!$Ô‰d> È•µQ›þÈýþCÿ&„áê³þæúa÷•ôÜò^òÑòÐóæôÁõ7öHöö¶õ\õõ¼ôAôŠóžò­ñæð†ð¶ðuñºòhô=öö÷UùQúûùûý þÐþ ÿþlý×ûýùø ö>ôÀòÑñÑñûòxõ ù9ý^ÓM·% øÖc  9dÝ9- ¼ ÐÃô»ym‡¢ Ãú]&sÿ‡þþÿ\OÂ-T#áþûf÷eô“òò[ò>ó8ôæôõÕô5ônóÈòiòGò<òò»ñ=ñÊðð«ð7ñ&òfóìô{öÜ÷ù;úxûÑüþúþ;ÿÈþ½ýEüŒú½øëö-õ¯óÀòÀòôÚöìú¦ÿ°õ Õ ‰ › ÀÀ8 M Ÿ€žÒ ~!¼ òx›—‚W · aXæ>ÿ‡þÖþÆŠ %~ý;ùÇõó”ñ,ñ¥ñœò˜óFôŠôOôºóóEò­ñ?ñÝðjðØïIïéîòî{ï‰ð òêóîõß÷•ùüú4ü}ýÅþãÿš³*-ÿäýoüØúùt÷ ö;õTõŸö(ù­ü³„œ‡ - ± …Pãß ¦qû¢ß›ó,x%ÓŽ R 5RÝøþÀýBýªýúþãíeÖê°Šþüú¡÷úôyó%ó©ó›ô‰õ&ö\öövõŠôó¡òò–ñ7ñãð¥ðšðæðzñXò‚óéô}öøŠùØúüiý¯þ®ÿ,nÿhþ+ýÒûyúùÀ÷‹ö¹õ¨õÁöù^üº¢q c Ö`·I P u)•þ h W *æ–s‚ ¦ ̵àÊÿšÿTàΣ¶ŒòcþsúóöWôíòœòóôìô~õšõ;õvôó§òóñuññð/ðÐï±ïôïðªñ ó«ôgö#øÅùQûöü›þ@Ƴñÿ›þ6ýÕûyúDùRøÜ÷1øùÏû£þ§I2)#V8sºx 9%§ñ™™*Ààå$¸ | HúÎÿÂÿTÿáÿ^w„ñ#àMÅÿæûOø”õôÞóôàõ÷øOøð÷÷Êõ•ôžó ó²òaòò¢ñdñdñ§ñ4òóAô¥õ÷ˆøìùYûÉüøý½þêþ£þ þMý‘üîûQû£úÓùþø[øRø-ùÿú™ýJŒë:”vÍž° gæyù÷ä@`û Ÿ n 4€†FàUW\Ãþ×ZüRýìù^÷ö öîöJø’ù‰úñú³úïùËø‹÷}ö³õ õkôÀó"ó¬òwò}òÙò|ó|ô³õüöRøáùŽû?ý¡þhÿvÿïþþëüñû2û¥ú@úòùÅù÷ùÄúMünþé[j³ñÎÚ9Aíà ÉW=^“Œfyö é  .8J¥ƒx¥XïÕ†ç,ßý‡ú»÷éõQõæõB÷Üø*úìúñú;úþø…÷,öIõÛôÊô¼ô¦ôŠô|ô•ôÛôQõÿõîöø"ù0úTû‘üÑýÂþ-ÿÿŠþßý?ý°ü:üÉûEûúïùùÓùûMý'0à­BˆÊž×/.ï ÜŸäy–šðëx 6 ï²°*ÿOþDþ*ÿÝ!éI”Uþ ûJø”ö!öÒö.ø¦ù®ú û¼úÓùzøñö†õ„ôúóÈó©ótó>ó ó óJó¬óbôsõ¸öøcù¿ú?ü§ý©þìþnþtý^übû—úúžùLùòø¤ø¬økùû¡ý¶ÜŽi ^Ÿ|Ëd¯ÉV —‰tÁ4÷FÄn” W “ñ;‚ñ´ÿÿIÿ8»D8lÍÿ”üGùgöyô²óøóõgöƒ÷+ø.ø–÷ƒöõ£óˆòëñµñ¾ñßñòfòÔòUóõó®ô†õ‹öÆ÷0ùÛúœü3þIÿÿ'ÿ3þ9ý†ü.ü4ülüŸü¤üŽü™üýDþ7|mªè\y â+h nDA¼›VRùÑ  û.Œ ÉðŸÔ¡ý‰Ì.\Tx9þûwøŸöØõ öÝöÑ÷‚øÑø¦øø ÷³õFôóEòÁñlñ:ñ4ñVñŸñüñcòÜòwó8ô-õgöû÷ÞùÌûcýRþ“þAþ¬ýýÌüÃüÝüý ýJýºý£þ*CþõðÜ*åÉ;7\ ý-1¯_ , ÀåmßÚ2üHR£•¹ÐÙ*4ýhú3øèö­öV÷nø’ùjúÒú¿ú-ú;ùó÷—öxõ´ô0ôÀóXóóêòðò%óŠó"ôïô÷õ.÷øú°û ýþcþþMý†üãûƒûjûgûpûŒûàû‘üÖý¦ÿ×EðΡdmi –°ú ·øtSñ ¸•‘ íª©²Únÿ•þ‡þFÿÁÆä~ùÓ¾cýeúøÌö‹öJ÷…øÈùÂúKûVûúú*ú ùÆ÷‘ö†õ›ô½óõòcò#ò.ò}òó²óŒô”õ×ö[øú¨ûýíýþªýöüPüôûôû?ü°ü ýUý¯ýGþIÿ®a(³Ì#ŸIþ)‹`³ ´Ñ¨ÝzÄìµ Û ¤ú9öݹÿÕÿmu§“Âûabÿfý¾û³úhúàúöû?ý`þÿWÿOÿÿŠþÖýýdüèûŽû5ûÊúWúõù£ùIùÜøføøø?øíø údûªütý‹ýâü¶ûvúeù¤ø øÉ÷…÷€÷øUùpû;þKLÁB‹wF€úÿvþqþ/›< Vq–÷  gIˆà$kþöüüÒûrüÀýŒÿ\ޤj%ÿKü|ù4÷Êõmõ&ö¡÷nùûüœü»üƒü ü°û\û:ûQû€û­ûÄûÕûüuüý¡ýLþÿÞÿÒëý’sN¦þXýwüÝûYûÇúTúCúãúKüyþßm[G çY» —Ú„ ¦cëÃê–;B4 · –š©É!ÈþÜýwý¡ýJþ ÿ‡ÿ;ÿøýÚûGù‘ö"ô6òñ¾ð=ñ(òóÎó>ôeôCôÜó0ólòÁñ\ñ=ñjñÔñòtóŠôšõŽöi÷?ø;ù•ú[ü˜þüŠ’ž“»H!ùŸµA ÚW $ õ –@wà>ÿÿ~–Úr YåÀ&“¶  £È3?dضcÈ«„8þyÿ ýNûCúúÐúüqý‚þõþÅþþýÌüYûÅùJø÷,öbõ ôçóLóíòµòžò¤òÆò óó`ôvõÌöøù•ùqùÙøøˆ÷M÷a÷“÷Æ÷í÷Døù•ú×ü«ÿÙ÷¡p / Û Å U)°< ö ±lrGºð!©Íð Y  âÝ3ÿþý‹ý þÍþvÿ•ÿÍþ#ýîú˜ø‹ö÷ôôÖóbômõ—ö“÷<øžøÑøßø½ø…øJø1ø+ø øøö÷ø|øùÅùjúúúŒû?ü?ýþ,Æ¡RGÕWÿþý#üVû¨ú>úIú÷úYüGþ׺ñ/m܆Øÿ_J´ ê g©Š(Îæ¬ƒ ¨ 0 þÝÁØW`áæMÙ š ì v¤þÑü=ü?ü‹ü²üzüÉû¿úsùømö¼ôþòMñ¹ïAîâì°ëÍêNê/êbêÕê€ëdìíïñGó~õa÷µønù©ù’ùùùÍù*ú•úûîûPýOÿåáÌF  ¾ K Ò Å¾jF† – b½×@|ÿ3z  %”i€ÿþùü”üÑü–ý•þWÿsÿ©þýîúïø…÷ëöB÷nø@ú[üZþïÿô†Áµ})Êpšÿ ÿ|þ þ½ýžýˆýtýUý9ýPý¯ý]þ;ÿôÿ8Ûÿêþ™ý1üñúìù ù6ød÷¶ö†öH÷ùùû|ÿ?¢6 y  BpކaõÉ öž_`#8& Z x3ÑÅþYü0ú˜øÔ÷ê÷½øõùôú'û'úøYõ¯ò‘ðvïyï‰ðMò]ôöP÷ß÷ øó÷ß÷ö÷]ø>ùyúÚû&ýLþZÿjƒž¡’{u–òv î  o ü ¼ ì ßôA¡÷5ÿ}ýübû~ûzü3þHSߊ*Îãÿºý§ýÿâæ] `=¤§‘¿¤ š ý ûX¤š$nÏx ÿbÿÐÿ¶‹µÚÿ­ü0ú ø‹ö¿õ°õ2öèöa÷o÷÷oöšõ®ôºóÑò ò¸ñ€ñ\ñEñSñ”ñòÎòóhôõëöÙøQû%þ·¥—šô Dª™S†ld% Ý s˜G¢ 9ÖX^M$U â ¸•^ñà k [ýt€ÆéãÿÜþþºýíý´þéÿ@&#ÿïþƒü0ú‚ø¯÷×÷ÑøTúãûýtý9ý‹üŒûbú6ù9ø…÷÷¥ööeõÊônô]ô‡ôÐô-õ¶õrö}÷ßøúdü þ0ÿ®ÿ•ÿÿþõýtýåü7üpûÄú’ú$û²üÿÚä Ð š c §!x/qÿ Tž ptYŠx“! 5 §NJN¦ÿkþ¸ý™ýêýOþOþ“ýëû’ùüö¼ô+óqòžò˜óõ\öP÷ª÷ƒ÷÷ŸööjõÛôkôôÐóyó6ó<óó-ôúôÒõ¨ö€÷ŠøïùÁûõýTiáyä1:'ïþ›ýrüÁû×ûÏü‡þ¨½kLÜÒšÿõýý˜þVm> ì¯Ù; Ïû1 Ö D“wˆƒgV…ßø $  #  ç÷ÙþýÝüfý>þáþÙþþŽüÍúêø÷gõõó½òªñ¨ð•ï„î¤ííßìùìGíÀí]î8ïrð#òCô³öù$û–üzýíý%þ;þ(þêýýýÝü9ýqþ~(½¿ Ï ° O sXPÑôqœ  ¡©Ü/  Ž>%à5RþŸüdûÛú$û?üêý¹ÿƒØbÿ›ýüQû~û”ühþŒr˜áiwH'>ÿ¿þ´þêþÿÖþDþ}ý–ü°ûÍúúZùïøÖø0ùýù!ûdüfýßý¬ýûü üQû úéù ùøâöö$ö[÷ïùµýxú  V « ˆÈ~±þÿ”m Äç#YÍÇg ` î f™sÿ ý¼úïøð÷Ü÷¬øúŒûaüü„úøõqò¢ðñïuðüñô=öí÷õøhùsùIù ùçøùvù8úûüý3þeÿ¢ÏË©sWxâ ÷ ö E Á ¨ > Îjúc™¼ÿþðüÀüý%ÿ@`±@.ýÍúáùñúþ ÂJær;É©a ’ ‘a®æÈP³Aÿ3þÀý þçþÐÿZÿ‹ýôúøFõóÌñˆñ1òfó©ô‰õÏõ~õ¼ô©óaò/ñKðÞïæï8ð°ð\ñ9òDó`ôvõxöo÷¡ø!ú&ü´þª±S%  * ì ¦ k " ¤×ÒÒN ö0  êV­€—+ øô @œÿ¦ eÓ•ŽWš ëÊ€$5ÿþœüNûpú8úÍú.ü þÍÿÕ«ÿ”ü ùâöÞôÙóçóïô†öø8ù•ù"ùø³ö$õ¬ózò³ñ?ññÒð³ðÇðñŸñcòLóTômõÄöqø«úBýãÿ&À„•3žó+SQCÿhþ3þïþ¶ñ„ ™ «Nk^ Ê i× ² )r›Í N®° Q ™)‰|½þªü7û•úÄú«ûÏü…ýaý?üeúGø_öõ‡ôáôö‘÷ù$ú¨ú®ú\ú¿ùêøè÷×öÏõÇôºó¯òÏñMñMñµñ[ò(óïóÅô¼õ ÷ÀøØúýÿ‘Nj#  ]ÿ¡þÎýþüƒü¢ü–ý_ÿÏ„ â› ûÿ±þÔýËþ™ìô ¿cIeû¢ç7  ½6#¸ Œ/7­–ÀË " ] ˆUtþžýýíý•þäþþ›ý)ü‰úêø[÷Ýõvô%óÝñ~ðïÜííìwìoìÆìXíîòî)ðÉñÙóNöçøQûJý›þ_ÿ¹ÿØÿÐÿ˜ÿ*ÿŠþóý¸ý;þ·ÿR' + Ù î { ö68Âþ8ÿµÇ® I™ç<ô¸ 0 à6}†ĹÿþüúŠøâ÷<ø•ù¹û%þ!2ÿXþAþçþFsÕõíü4«C¿ÿÜþ‚ýÁûäùGø÷)ö’õ8õõ!õ{õEöo÷Èøúû«ûÚûÉû‘û=û«úÓùÀø»÷:÷½÷£ùÔü ç ( ÖV ¯‡ Aÿ®ÿrŸ ëØ¸x{z­ ·QTfMýCú€÷~õ˜ôæôSözø—úñûèûjúÑ÷áôaòÚð~ðgñAó«õøäùû¥ûæûü,ürüðüµýþLÿÊÿ8b¢ñ2xè¤ÈFã`U  Ñgwa>ÿ ýÒúºø÷aöÆöiøû„þ  å£ç±ÿý×ûÃümæ 1Å"‚„à>8  ×ëÇ™ìþKü*úÓøøù÷ùšúeúþø—ö£ó­ð0îœì&ìÃì(îÐï\ñwòóJó"ó¬ò+òßñíñ[òþò·ó|ô\õ\ör÷ø®ùîúlü]þÒÖ Ž ½•< a \  wŒ¼‚RkÁé M 5èÏ´Ì èþýûý,àÞ ê!H©ë  Á>“ªpOÿÑýMüQû5ûüâý2^¡c€fþØú§÷mõkô ôÍõ^÷ËøùLùOøÒö!õwóüñÁðÄïïî0îií°ì<ì?ìßìîÇïÉñô‘öGùüêþ}“ì£eáA¬öX‹Ññ§ ]pYüyB  k íÍ  LÉš/B òY¬7 ; ·iÒÂ2|þü@ú;ùùÊùÕú»ûöûHûÖùø—öõ!õ\õ!ö&÷ø¡øºøqøø­÷:÷¥öæõýôáó™ò,ñÊïºî0îOîìîØïôðGòïóéõ øsú²ü´þ8&™³°œrƒúÿ¼ÿ$YXé²8  × 4 * k2-ÿìþ®3·E ÛÆ½cb §¾ì¶.)ÐkSÔö»·eL6dLÿwý:ü¶ûÝû€üMýËý¯ýßü”û!úÃøœ÷¶öùõ_õ¼ôòó×ò†ñ=ðQïÞîýî£ïÌðqòpô°öøø!ûý©þØÿŒü^ÔM“.œ!Úi«RÞ Á ˆ ë Þ ŸÓ_þªýeÿç‘S $7<eB • X‹”yÿRþ‘ü—úÈø‹÷1÷Ô÷Dù:û&ý˜þIÿZÿ*ÿ'ÿ|ÿ'ë–×ÚÿW!Q¹#KüXþ1üïùøœöæõ¶õãõNöÚöo÷þ÷¡økùFú$ûëûwüÀüÝü¸üKü~û{ú•ùDùòùÝûÿiK F“ JeDþZþ¹ô' 0óÊ•²©: †Ê¬ªYhÿýú˜øz÷S÷ øOùšúHûØú8ù°öôßñÌðãð òøó:öXøçù¶úûûbû üýþ¢Ùw]Àë4Òé‹ÀFÞ7 ‚R¢še0Ò"ÿùü’ú]øåöœöÌ÷\úÜý³ý VĤ±þüú˜øXøúïþ© A­VÓ Í ˆc(  W q PZB¡þöüoüëüçý˜þXþÏüCú?÷kôBòñùðßñfóìôÿõYöö_õ ôô¯óÙóô†õƒö7÷€÷z÷t÷²÷qøÖùæû‚þ—¦g   u † j = ¼  ç Þ…™¾Báù¶ S /  //üó÷¿õ÷õ|ø²ü‹æÎË  P-UJBWW¥**"€iûõò;hMLÿ üIùt÷Æö.÷iøúVûöûŸûvúÃøÚöõ]óò:ñ¨ð2ð±ïïnîîRî'ï¾ðóö]ù»ü¿ÿ9"b @S”&ùß È ‡ ä ‹w%„ p o  ÖO .±ÆúÿŠÿb Œ,Ç’ Ÿ¼‘!²ÉÕLÿûý1ý&ýÙýÿ\SªS‰ÿ¡þõý›ýžýÜý%þ>þ þýóüBüuû„ú|ùnøX÷4öòôwóÝñYð5ïîîWïàð óõUøñú ýÈþÕÿb¥Ï&ƪÅý5Y`W Q _ } Ž c½n[ ‰ 6 Ä«f ßmV õ Ó ¡¾’ž@{Fe{2pÿ]þ4ý?ü¹û³û)üðüÃýRþXþÔýþüüjûÿúÍúÕúûgûÄûügü¸ü ýXý‹ýý.ý‘ü»û®úùDø.÷aöüõö³ö¸÷ùmúãûRý¦þ¿ÿ‰:Y†ÚSßcçn÷Œ2ÿâÀ é Û % ß=’M×J•jJ· 8 ¯ BH;dü·ÿ•ÿnÿÿ;þý×û¿úòù›ùºù@úû»ûMü†üzüBüñû{ûÞú0úŠù ùÀøÑøRù>úƒûåüþáþ;ÿ%ÿÂþ"þ[ýzüûãú_ú0úyú)ûSüðýÕÿÏ–ò¹ÏQ¬å…ýW’q8ÙÀŠ"iYúþRþ|þ’ÿ‰ý~l| n iÌôR9ÉîXÃÑwµ¼¦ÿžþÃý1ýÆüMü”û~úùŸ÷KöWõäôõ³õÏöø0ù ú‡ú¼úÕúæúû\ûùûÑü²ý`þ©þ„þþý#ý9ýûýsÿx·ãŸº ¬×Ïú’Ê{d(‹i§oô“‚Ï€rrSùW’ÿÐþXþJþ¿þ’ÿ”{öëo®÷ÿšÿÅÿ‰Á+„và¼"+gØgšÿÿkþµýýoü üîûùû)üMüBüùûbûúqù`ør÷Éö‰ö‹ö¾öàö×ö—ö4öüõ)ö ÷Ëøjû£þ-z·ËèuÑvÏ‹0 I ‡ Ù l¥ÍJSðþ§÷*vÿÿ"ÿ®ÿxK¸—Ø ÿGþ&ýœüÑüÔý~ÿxG’ÈÂJ¶_ÿvþ%þGþ¯þÿZÿeÿLÿ%ÿ"ÿbÿïÿÄ‹ þPLþwüÛú¼ù8ù>ù¬ùúFúõù%ùø7÷÷è÷ÞùŸüÂÿ­ÖæÄ´<ðV¸ ïñ‹n h zè[&¥ÆX Š˜ 4÷ÿ8ÿçþøþ0ÿOÿÿ]þDýèû¥úÓù©ù>ú†û<ýÿm@VÁÇÿÅþþýªýËý>þÅþÿ*ÿÜþAþ™ýýùüoýcþ®ÿùó[&Ðÿvþ[ýµü‘üµüßüÉüPüpûsú®ù‡ùNúüyþ=ΗSüÂ"³ü=‹’Ĉf  ¸•DK!ýÿÕGËŒN„qt׳ðB^óîpÿäý°ü4ü”üÎý˜ÿ}(%J¾Ûÿþ¾ü üüûSü²üßüªü ü@û‡ú!ú'ú¼ú³ûÆüªýþâý ý°û0úíøø×÷øløµø›øøB÷uö2öÏöwø ûDþ™‡¨¤–ÌÇúÂZªPä ú 2 h ÙÕÛX§Ë˜£xÇj„`M†@g×+\ ]þ­übûÊú÷úãûJýÈþéÿpF’ÿ|þPýdüöûü–ücýþyþ‚þJþþóýþžþeÿHa=kÿþ¢ü{ûÇúŒú«úÒúÂúIúùzøœ÷<÷œ÷ÑøÇú+ýÿ§þtMu:7Ë EUˆÑ\•Ë3ÍÔÜY—Þ€»_8yj~ÿþ‹ýÜýÙþ/aëîQÿcýxûéùáø`ø.øøí÷‘÷÷‹ö7öKöÏöÀ÷òøú¹úôúúÓùÎø×÷4÷÷r÷1øùÊù5ú;úú¿ùÐù‡úùûþ³kÛ¸½û™öƒˆ4n ã , â ¾ ¶ á ŸQ|…–‚úd?:V¿ß&ïÿpÿÿ jHÿ;þÀü€ûÒúû)üþ2&tßk[ÿ´ÿÈþqþ¡þ%ÿ ÿéÿÛÿÿÿ¿þ£þÞþ|ÿ5Ìîe>ÿ‹ý¥û¿ù.ø÷œöŽöÉöëö¸ö4ö_õŠôô„ôñõJøHûkþ4Je˜?­²‚ô¸D%  Ú㘆$Óÿ GW!î¹Ñ¾ýþÈþ-ÿ®ÿÍÿ'ÿÃýÒûÊù3øw÷Ô÷Gùbû›ýWÿ$éÿÐþPýÕûÒúšú=û‹üþ¨ÿØ—iß–›ã,#níªÖ¸¾ÿ þýaý6ýÀüæû¥ú6ùÌ÷ÔöœöV÷ßøüúBýLÿÊ—ªPÊ~°}»-Ö&‰sÿ;ÿâTÚÃ’ + »£|»°mÁBo÷ÐÿLþ»ü‘ûûjû€üäýÿ·ÿvÿUþŸü¹úùí÷ƒ÷Ã÷tø3ùÈùú5úTú¥úYû€üþïÿÄ.íç<#ñÍÿÿ´þ¿þìþÿêþ|þÔý(ý¸üÚüªý-ÿ0r SLDž“ôƒu¿‡Ýù†…¡nŠÈUu¬þfýðüiý©þK³zl‘:ÙþÜýýþúþà~OÿÙýzü{ûûEûÒûaü™ü[ü¹ûæú>úúpú‘û<ýÿ¥Žªñ’ÿäý4üÕúú¿ùÛùúúÍùIù¤ø øÉ÷(øWù/ûýìÿÅÊ*ÛÖ2J‹ ç › ²ƒa«‰ ù â ‚á‹~"ÿ£þáþÿ'jÿ¡ý ü¹úúúÂúÒûßüý¬ý6ýdü†ûàú±úÿú¢û[üÝüùü¢üüdûû7ûü–ýeÿ4§qyÆ”Èþ¸ýý»ü‘üaüÿûbûú£ùÜøŠøÖøÍùCûíüþéÿØ:&Ï~xñî?«æœª·|¨èå`+[7$qWУ‘7JœIö¶/ăöÒéOÿaý†ûú0ùÜøáøûøêøøÜ÷ ÷Söö_öd÷ïøÂúiü–ýþÙýýüéúúù|ùhù®ùúTúZúúºùUù6ù‡ùhúîûÖýñÿð¡Í_h´hv暴4€H”Ðs·{€i⪟áÔéÿÿOÿ,S^óør™Ä5* lJí}ƒYIÿþUþ•þ*ÿÞÿmšbéÿhÿÿ5ÿÂÿ¢œ^µl{úÿ-þ[ü«úOùUøµ÷:÷ÉöEö¨õýôkôôIô$õ¾öøø‰û þ8̪ÃS¢#l4ûŠ´|ÎÈÿVXº4ǘ.vþÑýóý¯þÿpÒ‘ÊÿËþäýJý&ýlýêýþÍþ±þþ4ý:ü€û7ûuû&üýþÿ¦ÿ:ƒÚ h³°.rbÃoHOÿþÑýýü ûúùùOøøOø6ù•ú.ü½ýÿÅÿýÿ¦ÿúþDþËýÃý6þúþØÿ¥N¾P»yŠÁÝŽ¤ó£Ùu•ÿ]ÿÇÿ‰NÌö° =sÿÜþþRþ;þþ¡ýëüæûÄú¬ùßø‚øˆøÓøIùÊù5úyú¨úàúNûüýtþéÿ@UR0ÀrØ_ñÿãÿÓÿ ÿLÿÙþvþAþUþêþŽO Œ™¾èÄ›´0ûþ 3.Ëoz¤­€üáÿ˜þ…ýëüöü“ý•þ¹ÿ¹o­uã!|ÿúþ±þ‡þqþhþJþóýcýµüüû_ûîú úbú2úúúú>ú—ú,û ü4ý„þÍÿé¾?U—à ÿ+þMýŽüùûpû÷ú‡úú¼ù‡ù›ùúüúuüUþs‹b¼ŽÚÏ¥ƒ~¢åB­(¡ › ' ®  ëÛ–u®ÿvþÖý²ýËýõýþþýÈýwý(ýðüÔüÃü²ü‹üBü×ûNû³ú$ú®ùqùWùhùŠù£ù·ùÅùÓùõù@úÂúŽû¤üÑýÿã^€Y ¨,±ÿ*ÿ£þþ‚ýöüaüÌû=ûÒú¥úÇúNû?ü…ýúþuµœö‚Ý2ʹ×å$ñœ qn‘Òôv> Áx [MÚ2~ékßG‹³«~ÿ(þÚüûŒú®ùùøøÑ÷¡÷‹÷ˆ÷§÷ö÷ø8ùúôúÏûzüèüýùüÀü‹üaüEü,ü.üKüzü§üÃü¸üˆüYü?üƒü+ýRþÞÿ³Š2¨{¼®“»Poõúî¢ Òjà;˜ˆKÞþþý}ýoýÖý‡þ|ÿxa#²[|ˆ…t]0ÙX¾‘Êÿ ÿ˜ÿ±ÿÛÿ÷ÿìÿÅÿ’ÿ]ÿ*ÿÿáþ©þOþÑý(ýrü°û÷úQúÊùnù8ù%ù ùÙøøþ÷…÷4÷S÷ø„ùŸû%þ¶öm\Dîëx³‹É-{‘SµÃ€ü@F¯nÿóý×üBü=üµü–ý¡þ£ÿeÇÊxéÿFÿ£þþºý‹ýýˆý™ý§ý¤ý›ýý›ýÜýZþÿÛÿ¶‹Jâ[ÀqÐF;ôq¯¸—_>ÿ0þGýlüšû¼úÖùßøè÷+÷óöt÷Àø¶úýOÿ:tÆ1 ÿtþÜýþ"ÿÕö/,¬„ ´ W ˆd2 êĉ]ÿ`þ²ýfý‚ýßýhþòþTÿhÿÿJþ6ýüÞúúùsùRù„ùáùCú‡ú¥ú—úmúNú_ú¶úbûPüzý©þÍÿÇ—9ÉRÅW|s>ákçl Áx{·ÿÈþâý1ýûüoýŠþùÅFúò0ÿ¤ýýUý‡þ:¯ÐQ5•¦œ§Ê5ÿnþµý(ýâüùüzýXþpÿ‰gàåu®±ÿžþ¬ýðüuü üÌûgûãúIú ùøøiø(øDø¬øOùúÂú{ûü§ü<ýâý©þÿu7µÝ¸S¾ÿÿáþÐþÍþ·þtþøý^ýÆüaügüùüþ¦ÿ{Uï ŒuÛ;ÈߘÒVÑú • ˜  ß‘Z0ùÌÿnþ›ý+ý6ýªýyþsÿNà®÷ÿýþçýâü ü{ûûÍúú0úÙùŠùOù6ù3ùLùŠùÞù>ú’úéúCû¢û ü‹ü(ýÜý‚þÿpÿ˜ÿŒÿsÿTÿ8ÿÿÿ%ÿ>ÿAÿ"ÿÐþUþÆýPýýMýõýÿŒqT’ðjáÿºþDþ¯þúÿàé7Ã…°‰q¤Oc´ø ߈(íðJï®WšpÅÂŽN*Cÿ©þ9þÑýPý­üãûû5úù%ùùùLù‡ùÂùòùú@úyúÊúNûîû­üMý¸ýÜýÔý²ý…ý^ýUýoý¸ýþRþqþ>þÑý?ý¾üˆüÆü¡ýÿÄ¡>Q£!íP¼šÿ8ÿÂÿ#; %iÉ€ìc)Yà”,•ÿÂþÙýý¢üÆüwý´þ$”Àt´˜Dß…B Ú”&” ˜ÿ_ÿbÿ˜ÿæÿ8_H„ÿÿ•þUþ3þ0þ(þþËýGýœüèûHûÛú±úÂúüú5ûKû!û«úú3ùˆø1øtøyù5ûý lAQx´M—ÿÿ÷ÿ°òE(D n ѧ7ЬÙJÁÿõý+ýÚüýÔýäþìÿ—¶'ÿÑý™ü³ûHûYûÇûdü ý}ý¬ýµý¸ýÑý%þÂþ¨ÿÇèí²3s’›„qkFûyÆü2uÍÿCÿÙþcþÃýâüàû®úvùJød÷îö1÷Aøú:üJþÇÿgÐþ&ý—û±úÛú1ü•þŸºPðh ÖŸ:!|T„·£ö‘Feÿÿÿ\^#GªYþ¢üîú¿ù0ù(ù„ùòùIú_ú>úúùÍùÊùú£ú{û^üDýþ•þÿ|ÿôÿ‰@ð´D’©•sTIRhs;¦²^áÿfþ<ý”üœüXýžþPöÏÇÿåüæúù ù¬ùKû“ý wí–¸µ÷«Ýj z–d Òâ[+-x*ojnþÚüÕû\ûYûšû×û×û‘ûû{úéùyù;ù6ùZù ùáùú\ú¨úû°ûwücýnþpÿN÷^‘°»ÁÚ UœÉ¸fÒ @~ÿÿýþ_ÿÙG<ª¸ ±ÿÿÿTÿÒuÆ™ K¦ÿQÿhÿìÿ¥lü îƒ÷#³l3Èò©ööæéÿ'ÿ¡þLþþêý¬ýaý ý¸üwüHü&ü üöûÝû¶û‰ûTû!û÷úñúû,ûpûÇû4ü²üBýÎýhþúþÿxÒE\^K,ÿØÚŽ1ßc¦ˆ )sÿAÿ•ÿYY[6â)4K´ÿsÿÿÛÿ:sp:ñÿÍÿãÿY ó¤íËAl}¢ôÿsÿÿ¿þþ0þäý–ý[ý6ý.ý<ýMýaýfýMýýÏüzü7üüöûüûüü,ü:üVü‹üåüiýþý•þ'ÿšÿúÿ',æÿÅÿ´ÿÓÿ'³d+Ñ?MfŸÇ*éÿ¢oEê0øU^\yÿÓþþfþnþqþ]þ3þþäýþýqþ'ÿù¾<d9×K¶'«ÿFÿçþ˜þXþ6þ9þtþáþkÿ÷ÿsÕ@@ Çp’ÿÿŠþþˆý&ýùüöü.ýˆýþýnþÅþçþÖþþ"þ¯ýGýíü­ü‘üœüÉüýlýÖý>þ›þÙþòþÜþ½þ›þ•þÐþZÿ*4P?Ü ÖOžü‹ad޵Á­{PKo¾ai {ƒ]ÿ9þ<ý–ü7ü=üzüÚüGýµý þ;þUþtþþÅþ"ÿ«ÿQÝPƒr,Ìj''xé\¸ùðÁ{,ÝŒ=ÕÿbÿÐþ0þ“ýý¤üaüBü:üHüiü}ü‘ü°üßü9ýËýþTÿ,æ^}Né_ñÿÐÿ÷ÿj ׋‚ºÜ(Wn]­¢š«ÿìþcþþþ þþ0þ9þ3þþíýÆýžýýýªýÎýþ+þGþOþAþ0þþþ%þ]þÍþkÿ!Øl× þÉ‹KÏ {KÅÿhÿøþþ0þâý§ý…ý‚ý¬ýðýUþÂþ8ÿ¦ÿýÿ''ôÿÿAÿòþ¿þ½þêþIÿÊÿbù‘€×GRGÆJ¢æ,vÿäþ‚þRþLþfþ›þÐþÿ%ÿÿÞþyþøý}ý(ýý+ýwýÎý%þUþOþþÈý‚ý[ýlýÃýLþýþ£ÿ: ë)Hu­üEt}<Ì2†ãÿTÿÿøþ-ÿŠÿ÷ÿjÏ)oœª™uBù =Õÿ„ÿIÿ0ÿ5ÿkÿ¿ÿ$¥#¢l¸ó.%öŽî/Thÿ“þçý‹ýzý½ýDþçþ„ÿúÿ2,ôÿ¦ÿZÿ'ÿ-ÿWÿ•ÿÊÿÐÿ±ÿeÿÿ¡þcþhþ£þ%ÿÇÿbà,H)÷Ƕ¼Øüãnÿ¯þþ…ýXý}ýâýþ-ÿÞÿ{é! à¨b £ÿ>ÿêþ¦þþ¬þýþ„ÿ5ÿÏ€ cˆi3×róS±ÿÍþþý[ýûüÚüþü[ýÔýGþ˜þÂþ½þþJþ þÜýËýçý+þnþþŠþXþóýzýýèüþüUýðý¡þLÿÐÿ/\mp{ àNdKÿìÿLÿÂþnþ]þ“þ ÿ«ÿWñ^™¥{=÷¨T¹ÿZÿÿ·þ“þ˜þÍþ0ÿ«ÿ8ÒPªÒÔÄ™l4ÿÄu¨ÿ8ÿÖþ˜þþ¿þÿŒÿu¹Ä\Ðÿ ÿŠÿ’ÿ®ÿ¿ÿ¼ÿÿbÿÿÙþ´þ¬þÍþÿhÿ¼ÿ5:$ìÿæÿïÿ 2C/ïÿÿìþRþ½ýcýGýýþÍþ¿ÿ°uþE?¥4®/ÊÿÿZÿTÿ~ÿØÿYÿ»}+²ýÑqø}ðoîu÷ÿsÿõþþOþAþcþ¬þýþTÿ„ÿÿQÿõþ|þþºý‹ýý¸ýøý9þkþ„þŠþ‚þyþ‡þ½þÿvÿñÿgÄÿîààëôæ¶K¦ÿÙþþ?ýµürü‹üóü¡ýyþQÿs¢=ÕÿhÿÿÂþþhþJþ(þþþ9þþÿÐÿ jl“r#¾\ÇŒCãÿsÿýþ“þDþ(þOþ½þQÿïÿmÁÏ8¼ÿTÿÿõþúþÿ>ÿQÿAÿ"ÿøþÙþÐþòþ0ÿ‡ÿãÿ5juT8'@s¼/¨ñÿÿþýrü4üdüýçýìþÛÿ B,æ‰*Íÿ~ÿ3ÿòþºþ“þ•þ¿þ-ÿÍÿ¢ƒf.È"0û›3×[1ùª@ÁQæÿ®ÿÂÿ~é&#ÕCŠÿÐþ9þÔýªýµýÜýþ%þ%þþ þûýþ(þcþÍþCÿ®ÿg ¾Òàù#Nla)³úÿÿ(þUýßüÏü1ýçýÙþØÿ³V—Ž7Á2¹ÿIÿòþ¦þhþ0þþýçýíý-þ±þeÿ@ÏU§»žfÏx°2•ÿêþOþçýÆýêýXþÿ±ÿYÇëÁYÞÿ]ÿòþ¡þþþþ£þ¦þ¡þ˜þþžþ½þõþAÿÿÍÿïÿ÷ÿãÿãÿéÿK~¥¢p „ÿçþXþóýÜýþ¬þ_ÿ¨éØ{æÿCÿ´þJþþþ-þJþZþhþþ¬þõþhÿúÿ EÌ)[f^G77<9ÚuùpïÿŠÿ_ÿ|ÿÛÿe†×îÄjñuÅÿ•ÿsÿTÿ'ÿêþ£þhþDþJþþêþyÿ Œæ/2:E\{ŽŽj‘ïÿOÿÖþ˜þ¦þúþ|ÿ‘àé¶\éÿ„ÿ5ÿÿïþÜþÅþ›þZþþçýÈýÖýþOþ±þÿ5ÿFÿ8ÿÿÞþ¯þ›þ¦þÐþÿLÿ|ÿÿQÿÿ˜þ0þêýÎýóýRþçþšÿHæHo\!ÝšgF, Þÿ¦ÿhÿ>ÿ5ÿnÿéÿ¨†anwJø.âŸd#ÄF£ÿÿ„þ;þ-þfþÜþsÿúÿYsHìÿsÿÿ©þyþqþ‡þ¦þ·þ¬þ‚þUþ3þ%þAþtþÅþÿQÿkÿbÿAÿÿïþêþÿZÿÇÿ=‘¾³p ’ÿ-ÿìþïþ3ÿÂÿ~Hùt²ªUÒ:¨,Ðÿ‡ÿLÿÿïþËþÍþõþWÿôÿ¶r…§‹Eë™jSV\N!ÇWïÿ ÿ|ÿ ÿ ¢KÝ<M ÄNÚp$ôÿÐÿ¨ÿnÿÿºþkþ6þ3þZþ¡þøþOÿÿÓÿïÿýÿ÷ÿ÷ÿúÿ':@$Þÿbÿ½þþcýÚü‘üŽüèü‚ýOþÿÍÿCmNÿ;ÿòþËþÅþÜþøþÿ%ÿ3ÿIÿvÿÍÿKî‹ d}^Ær7ÿØ—CÕÿ_ÿøþ¦þþ¿þ5ÿÕÿ~^j4ÊFÊÿeÿÿÿÿÿ'ÿ'ÿÿÿÿÿ5ÿpÿÇÿQpmN*÷ÿÂÿÿ‡ÿÿyÿeÿ3ÿÖþZþÖýiý&ýýUýÜý“þOÿúÿe‰\Þÿ'ÿZþžý#ýâüâüý^ý²ýþUþ¯þ"ÿ±ÿ\âˆGR9þÈSÉdÝH¿ÿZÿ'ÿ0ÿyÿúÿ‰ƒ­‘4¹2¿ÿhÿAÿ;ÿOÿpÿŠÿ‡ÿ~ÿeÿLÿ>ÿ>ÿOÿsÿ¨ÿÛÿH{¢Ìñ ÿÌxñÿTÿ±þþ¯ýzýýÈýJþÖþeÿÕÿ¼ÿ3ÿŠþÜýBýÚüªüªüÏüýiýÈý+þ“þýþsÿ÷ÿ†œ d§ÑâóóܪXàE¢ŒÿZÿyÿìÿ—S€µ“+‰Ç]ÿÅþRþþý½ýˆý[ý?ý<ýPýzýÃýþnþ¦þÂþ½þ¡þ|þXþOþ`þ›þïþLÿÿÓÿÛÿÍÿ ÿÿ‡ÿ¹ÿ,Ø”JÑ ²\ŒÇÿÿ“þ0þßý¡ý^ý#ýþüý.ýˆýþžþ8ÿÕÿ_¾÷2SuŽ}@ÕNÓÿÿnÿ¼ÿ=üÌ…[X ²7µ=ÇWôÿŒÿ%ÿ´þXþþøýþýþOþyþþŠþcþ(þêýºý›ýýªý½ýÆýÀýžýtýMý4ýJýýþïþôÿ  í|¯‚aµ«bC=CQ_j†³üP° X€ˆl7è‹4ã”5ÐÿZÿÜþJþÙýˆýlý›ý þ¿þ•ÿj)­óÚ‹:î®W8Þÿ ÿkÿIÿ>ÿTÿ„ÿ·ÿÕÿÐÿ«ÿ~ÿFÿÿêþ½þ„þOþþßý™ýMý ýðüýlýþÍþ·ÿ¥xliŽéC´ÿOÿÿÿCÿvÿ´ÿæÿ'mÊ@¾<žçøÎœf. ëÉ—BÄ!bÿ¦þ þ™ýzý¬ý+þÐþ„ÿ,¥÷éÊ®{gTC8,2C_ƒ¢¹«‰Fýÿ¨ÿWÿÿÖþ›þXþþ¡ý6ýÚüªü¾ü ýÙýÈþáÿëÔižfë7gšÿïþþRþZþþÓþ'ÿ|ÿÓÿ*ÿ}l¸ÜÔ¤o9 ðׯªgñe±ÿòþDþÎý¤ýËý6þÓþ•ÿHñxÒüóÏ¢rS7 ÏŒCúÿ¼ÿ•ÿÿ«ÿÕÿúÿæÿ·ÿvÿ"ÿÈþnþþºýcýýý(ýªýkþnÿƒ‰o J0¸þ'8ÿtþçý¡ýýµýøýUþ½þ'ÿŠÿæÿ=Ø7Yu—³Ôö).ÏV¥Óÿáþ þXýíü×üý§ýZþÿÓÿbÁô/Kg{‹—¢µÉåù).Ä\Ú=£ÿÿkþäýzýýÑü¢ü™üÑüGýþýáþáÿا+a<Ô@‘éÿQÿçþ˜þnþ]þhþ„þ©þÙþÿCÿŠÿÇÿTŒ®ÊØàîÿ!=^ul@ã\¼ÿÿŠþ0þþ3þ‚þìþeÿØÿ=—æ,j¢ÝGrtPÔŽEÿ°e±ÿZÿøþžþGþþý½ý‹ýwýoýý¡ýðývþ'ÿ÷ÿتXÙö¤g Õÿ*ÿ›þDþþ"þRþ•þáþ*ÿ]ÿyÿŒÿ ÿÅÿïÿFb†¹Ú@l†r7ÁCÿnþžýþüœü–üÆü+ý¯ý9þ·þ-ÿ£ÿ!¶Vüœ.›í ß©k"å“9¸j ÿÅþâýûüü@û—úúÓùÐùúyú,ûü#ý;þOÿN&É1df7àƒÏ«¥ÇE޻ɳ€=üÇ—~ušÁH—Äâå³@~ÿ`þUýzüëû¨û³ûü}üý§ýAþÞþÿNüå·eÛ'ä®s*Ó`Ë úþóýíüü@û£ú8úõùìùúhúñú¥ûuüRýDþ0ÿýÿ¥2—Ýóë»}&Ý«š®æ2†Éëóóöö +9GXoŽ»ÙêÀaÁæ¿ÿþPýHü~ûÿúÒúæú,û‰û üªüiýLþ>ÿHSP9çb¦ÅÅ¿¼±¦|3À9,úÿ½þ…ýaübûúúÂù®ùÐù*ú¥ú:ûÝûˆü9ýâý‡þÿ ÿm¢¶¥~¼râMœµ­zM#<iœÆßö +?G6ø…×éÊÿžþtýaü~ûÕúbú'úú2ú{úéúxû=ü&ý0þAÿWd^<¦$x¨¶¥{£?SK,ÿþýSüÌûŒûŒûÄû ügü¸üýMý“ýðýkþÿ´ÿb†ÌàÔ»°Ò…þc¤¯ˆ(»S à×î +J^w…Žˆo9ÚV”¦ÿ“þiý4üûúIùÑø²øáø]ùúüúü ý;þeÿÔT„šˆ6›²–?°ñ Ó} £ÿDþýümû ûæú÷ú!ûQûxûšû¥ûÁûñûSüðüËýËþÓÿÕµiê<n“·çFT;ûˆdÔ^ àØÚé÷ùéÇ‘QÛÿÿ0ÿ´þ þ6ýBü=ûIúvùêø¯øÖøUùúûüðüÆý•þhÿNE[ˆ·ÒÄuÜâ‹ÿEmytigx¨ÿòþLþªýý†üùûŒû'ûÞú¥úú•úÐúEûùûëüþZÿ®ü®-ýÛ¿£|;ÜO¡å2 =!æÿ¦ÿWÿÿÖþ´þ›þ|þGþðýlý­üÒûôú;úÖùºùýù„ú/ûôû²üUýäýtþÿÍÿÄè(y¹ÉœD6ö–xÁìö׳’ÿþtý}ü¨ûìúIú·ù0ùµøUøøê÷ø÷Rø ù2úÁû“ý’ÿƒOÊñÉPŸÃ×ÜɃ YjW91Nš¨ÿCÿÜþ`þÆý.ý”üü³ûxûgûdûgûbûYû@ûûîúÛúæúû~û ü²ütý>þøþ£ÿNã†< øôôݵqð- ( âc»ù ô²?¨õþ6ý~ûäùzøV÷uöÁõNõ÷ô¿ô®ô¹ôõõ†öå÷·ùîûhþ©9ì $ æ = B ! à ~ é "  íŒ'È–‹°Wÿ£þÑýÏüŒû*úÈø‹÷ŽöôõÒõöªö}÷tøhù>úû³ûMüÚütý(þçþ¦ÿg­.§Š´h!ÏlðJzi%¢îô·^ÝAÿˆýÄûú[øÏöxõbôóóÈòÆòóyó8ôNõÌöÀø=û+þd¼í¹ ù s·‡qµ ß à ¶ L ¾>“·ÿþRýü—úþø:÷sõÈóiòˆñ=ñ”ñtòÂóIõóö˜ø!ú‰û×üþÿæÿ¥BÁ7ž]² `¼*£/».ƒ­°€.¾5ä ø³C›þßüû0ù}÷üõÂôËóóˆò9ò òGòÑòÙóxõ»÷¥úþåÇv ¢ "éè:ÿg ®´§ u  t °Êäƒÿ¤ýBüÊú;ù…÷¿õêó1ò«ðmïžî>îcîï_ðò8ô‹öíø5ûGýÿ†ªŽGê/Û{ˆâ#[|©Ö  % žû÷ {Âÿøý#üLúnø¢ö÷ôwó9òKñ³ðpððñèñ9óõœ÷¹ú`þi‰{ ø Á½Ü(Ö  ëÇ7 ‰ | +þaý‘üãûûýùø‘ö;ô¾ñQï6í¢ë«êeêÊê»ë3íïdñýóâöéùöüæÿž ¬ì Û † ö : S K 1  Ò ‘ F á b  øüÁ`Ñ!FÿRýNûIùB÷QõŠóüñ¹ðÍïCïï]ïïïØðò½óæõ¦øüñÿOÀó š‚{p~ØÂ…M&ô‚¥ Q ¢æU5¯þÀý9ýâüdüƒûúø~õ¸ò÷ïqídëÖéÎèMèUèòè!êì•îÔñõ•ùýBZÉwŠ  { Ê  ‘ ‘ þ X } € P  ™  ~ ¿ ½ nÒÍtãÿ<ýú%øéõõóGòÕð±ïºîî“íqí²ícî«ï³ñ¦ôˆøBýo°” ¶Üà̾ô¿cÛ·kÌ ® (bëWÿ¿þ©þÐþÙþ|þzýÁûUù†öŠóÄðGî:ì£êéíè¯èòèÖé†ëîƒñõçù%þë÷,›|  •  ¨ N ó t µ ž P ß l ü ‘  y ’ Dx0‰©þÒûù°ö ôêò€ñTðLïvîËíRí%íPííí0ïPñsô¯øÖý- tÑ ûœ°nMŸ2¨„q e ¶Ûÿ¡ýiü ü?ü§üÀüHü÷úùŸö8ôòKðïîÜíèìÚë«êéÅèõèbê#íñãõûéÿöµ Ù L Ð š ƒ M µ ‹ î  / ˜ Q Q e O  …~À{ýºù×öŠôêòÔññgð¨ïÅîÑíèì7ìùëŽìcî°ñ‘öªüt2 K;ÃÍjñÅaÿ%»m §ÙZÿÏûyùAøû÷[øïø`ùOùžør÷öÕôÞó<óÆòPò”ñKð]î ìéé¦èÂèsê™íöñ÷Büñ˜ÿUõA „ ý Ç Ò Ý Ž ª . a ‘  Ä á : ¨ Ê F Ù ˆ týúööpôtòàð_ïÅíì-êfèÒæÌå¾å)çŒêðŸ÷bO ƒ1ó•C e¸ÝW`ê–ÉÇÿƒ ÿ±ÿvúÒö·ôÐóÈó*ô•ô ô%ô>ócòùñ<ò ó8ôvõHö/öìôªòðêíðìlíyï×ò)÷Úû?Lv¤.fWÍBXç ( k   Y × ´L¬ é 4ð‚þWúÆöìó°ñÕïî:ì$ê×ç~åã“â„ãçtíxöô~ ¼°ýœ!ì ¯ãhârµù[÷=| Ï«ú*õ–ñ®ïäîºî©îOî‚ílìŽë­ë?íNð|ô6ùÀý:ç€Kýìù§÷ÁöE÷ùŽû3þ8¥Iÿ}ýÉû¥úmúCûýyÿÏ–®Wúà1ç Õ Ã ]NW`q ¿ …ýu(ý8ú…÷Þô1òFï7ìéôåvã9âã‹æDí×öt lï}#ï$Ã#Ê 4KB4 Î 2§üìô ï/ëòèËç1ç¢æÕå¼ä´ãyãýäÂèÅîoö´þd\ äæÞˆ ¹ Í×ÝÄ5ÿ ý_úª÷bõËóóóô~õ<÷êøFújûªüRþšw°ø  „,Æ_÷½ é §*”ý’ù)öÎò‰ïSì8ézæ‡ä äÚåšêfò°ü+G¾›#x'7(s&.# ¸áõ(l·z Çû óHì¤çôä›ãßâ+âá•ßûÝÝÙÝ:á–çjð£ú·4 JÏ66†”~(^Þa Æ41üƒöëñÖîGíöì|íyî•ïðrñ[ò½óÏõ½øgüus B ·|"0Ñ  ½é…¬þú4öÔñ“í¿éÏæWåæbéÇïõøòIžè!r'*ý)â'´$p!¡@º/Êh †B÷éînèä°á~àÄßïÞ›ÝèÛ/Ú3ÙïÙ]ÝäÖícùïÓKW[õÕ ‰!"V"¢!eOp j¸÷Äïvêõçªç¤èìéÝêë®êêÓéÍê[írñxö»ûyic \ ë Ÿ “ ©‡Û éÿ ù òìÔçëåÝæÄê\ñ$ú*X²‡s%J)+Û*A)Ò&Ù#\ ãÕÎ ;ýù'ðËçwáMÝæÚ·ÙÈØ–×ãÕÔºÒÒ0Ô˜ØKàëœ÷3%z ”!‘"ø#H&i)¸,².^-j'öb÷3ôéê°åäáäŸæççíç­æ¶äíâ#â-ã}æÆë?òêø´þñÔ ø Í  jMÉB‚ ÉŒ‚ø¾ð ê‚ç3è™ìøóJý^f ý$4(Ù)A*¬)c(&$/ ý÷ úÍîWåeÞÚ"ؽ××µÖãÔÒVÐNÏNÐÔgÛ=æ`óݳ „ð;W "*%J)3.§2¬42Ð)\ æûºî7æêâ£ã#æè èuæäþá áóá¼äqéyï¶õÛú6þñ§iqÀ2 •Äùõú bþM÷#ñ›íÀí³ñ½ø—Ç ¿|~!J#$I%‡%% $#"Å x õù ï!æ¿ßåÛ=ÚÚeÚ/ÚÙ4×CÕ-ÔÛÔ(؇ÞóçRóÿŠ ösl(ª!I%ç)/X35H2Ð):­ û‚í5å¯â~äÜçúé‡éîæÅã”áá1âåÂé±ïØõÿútþ EÓj×? E 0ý† ŸÔ‚ý?øÖóYñ¾ñ!õ£ú4Ѳ M\ çú,/Á³†B,c ÿ’ô€ë|äÛß|ÝøÜ…ÝIÞ˜ÞLÞ¯ÝzÝÞ»á“ç¨ïÜøÔ± =‰qVû<"&—+'0ˆ2_1ú+§"N1úî1æ+ãÖã¼åªæ¨åhãKáSàãàõâoæ ë)ð´ôÎ÷‡ùÂú^ü¡þ#nšíW d w U Y Ç ¡ÇJ·þüûü>þé·œ` † å Î À¸^Þj-oý ‹yùüðÍé'äúßÝSÛ\Ú,ÚÍÚwÜ\߯ãéð[øÓÿ5m £]Ùñ!ã%È)?-/#.·)4"™+ÑúˆñôêÚæñä>äã™ââââ8åè ì ïrñ(óôõóó²óeõ›ø§üÄÀI Ò E ã F   ¬ š=ÕƒEþº„IîœÀ„ ë ¯¸Öoi» r„ùñÛé$äîßûÜ ÛÚjÚdÜàFå”ëwòAù]ÿWD¨ '(ª7F [# %¿$"åæ6öÄû÷óïíëé…èÖè)ëbïZôžø$û­ûúøõUòñò'õùJþ–ÿ`©   5 e T y ×ìyÑÓ(úpÿQ$m«|C, à YÙ3Ò³ sý›ôÔìYæ=á“ÝPÛ¥ÚÝÛßeäCëåòsú)r ” ‡ã*Xü~!%'x& #ë8 d ûsõ7ñîjëõèNæãdá³àPâVæì(ò+÷ú~ú©øõŽòñòšõéú÷¾ ÓŒ÷Ý S7p¡ a H 5  l:€==¡LÃ& ci‰ à0þšõ.í³åÛßÜQÚãÚ–Ý+â>èTï¢öwý%V Õ . ž Om·n%ÅŒ4§üw÷"ôªñ˜ï“í¸ëvê=êrëî×ñöyùNûûÀø\õòððUò4öüúÓÿd˜ Ò ‰ & Ô } ²  — f Ç&hþPüKû‰û™ü½ýkþþ+þÎýÖý´þãŠq ΂š”V#(å!ìúdöô"ôö(ùâü†TÒ–ÝQ8ÿ¿þÿ$dJJ="ÿ=üÙø2õŽñZîüë”êêKêCëöì~ïóòl÷ÀüŽ%à ¹¿ì½ Ø ãÖÐ•Õ > ¯r³á&¨Lÿûý¢ü,ûvùƒ÷šõ%ô›ó8ôö²ø—ûGþj°Ýô_ÿäýPýÙýpÿxG`k+«Pý•ù&ö‡óòÝñÙòýôø ü ³2 ÷Ç@!È$K'…(ª(à'\&9$r!Îß1± @ö^íÿåbà‚ÜmÚÚÛÝŒßëáìãeå\æÃæÃæzæ=æBæÏæ6è¥êqî¦ó'ú‘W æªGg! $O%{%¿$D#!T¶; ½Àý¤ø¦ô¾ñÄïtîˆí¾ììÆëì<í_ïBògõDø\ú\ûCû>ú²ø÷ÝõQõ õëö"ùü0ÿ# œ4| ’ p 1 Ú q µ o S ] §R”²ü*ùŸöÊõ+÷úú wï)Q gÜ"&™ Þ ÈÇ-ŒÕûBöðƒëqèóçê-î6óøŒûýKüvùgõPñDîÃì§ì|í¬îÄïðàðñYñSònôö÷Àü4°œ ®Å!öt©ƒØW£r­d -åü}öµñïLî$ïèðåòvôFõ2õnôfóoòöñ4ò>óéô÷’ù&ü‡þs¢åV2ïþõý›ýêý£þsÿQÿðýùûÂùœ÷¹õôµò”ñüðœñ8ô|ùr† ”j!ì*g2E7A9t8p51ô+Ï&×!åuàµÿô¥êUâ#ÜØ~ÕÔ*Ó6ÒàÐ$ÏcÍXÌÙÌ”ÏéÔåÜBç(ó>ÿý u^ Ñ‚}7yp÷÷Ñz‰¸Œ à©øïï©è‚ã¢àßhß³ßîß à/à­àùábäèþìµò–øÜýð› ¸B%¦ ¨ Ë p IP ‰ ŸL øÓüªÂ´ÿ!ú¡óöìçãÝáeäôêKõ?ïg@&ù,±0î1ƒ1e06/3.#-”+A)Û%   ÿñHåÝ›Ø×ÖBÖ_ÕkӗОÍlËÊgË…Í}ÐIÔÓÙâÛîzýô }Ž"v*W04Š55Î4…3‰1w.8*%òIª¯þàõ‹í†å©Ý:Ö ÐÆËsÉtÈ>È·ÈFÊyÍŠÒOÙráÄêïônÿn þ¬t#ù&l(E'Ô#õ…0]H ùCŽ8ÿìúöoñîèë¹ê¼éMèîå¤âúÞEÜBÜuàsé—ö!¥+#J-…356x6 5Î4`4ó33=1Ñ.,ª(l#-Ò Öù“çXء͈ǨÅùÆÍÉŽÌ Î ÎJÍ×Ì3Í8ÎÛÏäÒÙä·ó=Àð(05pYj;‘7ß3]0ù,½)Ì&%$H!™ºäñÚÛØÉI¾€ºÜ½ÆCÏÖ<Ø&ÖÆÑÍ«ÊÊlÌqÓñà„ô_ »Ç+4½9”Þ'êö8+Ñ Hd`rÙ$b*S,Ð*'&"d5IQ ËPý:öî¹åcÞ…ØCÔÜÑ)ѪљÒnÓÊÔ0Øß´éX÷:‡~!»,«5„;>»=C;7«1\,€(\&ý$ƒ"o®ÈþïèRÓ%Âe¸+·9½íÆÊÏbÔԨМÌÞÉáÈ{ÉaÌ©Óñà%ó»Úò$È. 6Œ<¿?ê?Æ=›:ÿ6¢24-E'Ž!Ýg ×÷Êï±êÆçšåDã«àÑ݆Ú×ýÔÖ)Ûøâªëºó8úúþ#Öv¼ ߘ« Ô#$l"smŒ† š‚•ÿú~ôGî²èägàçÝ­ÜÝ8ߣãjêLó“ý4  p!'æ+Ë/P2E3§2s0Ï,}(Z$I ÓJÿ÷PçØKË7À͸…¶®¹xÀíÇGÍ’Ï®Ï-ÏýÎÏCÐÇÔ‡ß ñº)ú4œ;$7Ý1+^#r¦ ,©ùJóÈífèžâ‹ÜüÖµÒ¿ÏçÍUÍÏ ÓùÚ›ãìÀó„ú”xø H þ9sv$°'") )­'8%×!¸9ÊŒÝ Åþ°ö½î‚ç á³Ûž×gÕdÕÆ×^Üíâôêáóý± ªùŒß !Ë#k%F%–#V!Ri„•F©ø ìIߛӔʜÅ'Å6ÈÌ$ÐÒòÒÖÓ Õ[Öó×KÛ“âÙîŠþoN'e/ç4»7ÿ7m64b1P.û)$ÛáÀ=ºø(òXí@êèæ¦ãáÞÝÛ®Ù0ÙÏÛöá¹êvôµý«à ÷Æ×Y°©iYŒ! &U)+¼*a("$©¸™B Z¤ý*õXìøã­ÜëÖÙÒœÐSÐÒÿÕ+Ü]äÈío÷\û»r£†0‰!1#¤#¤"£ ig8»G ÍÿõWé¤ÝUӾ˂ÇlƂǚÉÏËÐÍÏÑUÒ5ÔŠØùàˆíŽü~ [K"n) .0¶06/Ä, */'¬#8Þ3¬q 6¯þ"ù*ô5ð#íhê“ç„ä^á„Þ‚ÜöÛz݈á+èÇðjúÖ 7óȽÁec$Ö)^.÷0\10–-A*±%qu÷ùð]èÀáˆÜAعÔ6ÒÑoÑøÒVÕ‡ØÝGãdë~ôžý,áh`é Y"û"þ"¢" "x!« Óº x”õ©ébß%Ø0Ô¯Ò^Ò?ÒèÑ–ÑÀÑ©ÒvÔ‚×™Ü|äïû Ì%ÐÉ"…#™"Í Èsлä,¾ ûþòøWô¥ð î&ìê²èræøãÝá áMâ/æíì4öà {^"£%o'™(*Y,y/r24Ü3æ1ž.Â)–"¬° ô¿éaáéÚôÕøÑ´Î[ÌE˃ËÃÌRΠϢРÒHÕ€ÛÅä!ð[üi¡X0%'+’/»2±45È3C1M.s+Ñ(´%!¯žgüðâââךÐêÌ)Ì0Í¿ÎúÏxÐxÐmÐÑqÓ¡Øoá…í)ûíÝ?¥NKQúp2Q"¸‚Ýà ê"þQú‘÷mõ+óVðâìé«å’ãòã¤çáîÅø²ê / ¬¨!è"n$ÿ&®*™.\1î1>0à,J("+ •þÐï©â+؆ІËÍÈ ÈÍÈ”ÊÀÌäÎÉÐ9Ò Ó±ÓÁÕãÚ´ãOïü™ A'G.‹3Õ6€8§87Ö3O/’*¢&È#!»•öAø"èÚ”ÏÉÉÆÙǶʕÍFÏ®Ï~Ï—Ï€ÐâÒØâ¾ðÚoÁc#†&^'¾&2%n#B""ñ!x ­ôvÞ MÀüÉö?ò‰ïIîGíVë"è;äràÃÝXÝœàGèó_/ LK²£ "õ#ù&@+ì/[39412.å(í"W4®P÷àêxàGØÀю̽ȲƾƞȗËÞΧÑOÓçÓÔ“×hÞ*é‘öÓ€ÑR)”1 7©98:²9l86K2§-U)&[#Z²j ×ûîëÞ˜Ó–ÌOÉsɵË3ÎÏÇÏ=ÏìÎ\ÏöЗԙÛÉæìôAOSç²#«&}'b&L$M" å˜ÖÆ %âfýª÷Mò(î»ë¿êIêé"è†æQåQå…ç­ìÞôÿ¬ `N:!0%€'õ(*.-Ä04•5O4•0/+‚$mºS÷ëEáãÙÔ϶ÊÜÇ?ÇÈÈ€ËFÎYÐ…ÑÒÓ7ÖÀÝÍê1üýb –.¤8?>¬?>ú:™7‡4”1`.á*¢'¬$x 1- ß÷!å¶ÕaËÆ'ÅzÇKËZÎÏtÍùʼÉÒÊLÎ{Ô`Þlìýƒ ^jˆÎ;­!º#L$(#e ùpt úPP™wÎxþäø9óî±éVæmäå"éÚðÐúÞ4 _Ôµûž¸’ Ñ# %#¡m/ ›™ü&÷Ãòòî­ëäè æ#â×ÜׯÒÑ Ò¹ÔØ»Ûgà§æ‚î¡÷™ Òÿ ç)ý0639e:¤9ù63Î.+y) ({%¼s¸{õ]äuÕÊÃÔÀ²ÂÆÆ¶ÊâÌ%Í}ÌÌ‹ÌλгÕÞÂéP÷kv ˆU#Œ&B(×(Ô(S( 'Ë$¾!–ÏX¹‚: dݶú„ô-ï,ëèiçè®ê2ïìôìú* rw?ìd‰ M§ù z¬ìþjúBö§òeïÝëiçJâÝ8ÚÙÂÙÁÛÅÞGãäéÈò&ýÎ ¨„$S,j2@68¸8­8Ú7á5”2[.Š)^#ƒ /û½èUØr̚ŲˆÂöÄÕŧÆJÇðÇÉ­ËVÑÛièB÷!Y–¡¡#¡(3.4]9«<¶ö±*gßý“ó´éEáÁÚVÖ'ÔWÔÌÖÛ{àgæŸì ó˜ùýÿã÷ û±q¤ê¤Ìåfé3C C¨ÿ2úõíñ•ï„î½îð&ò`ôKöµ÷©ø0ùRù6ù6ùÛùŸû©þªQ ©†¢5Á õ Y;˜SP—/æÿÿ0ÿÿpÿQE™Ø©þ!û¥ö»ñíýè:æbåfç íKö “Câ#È*õ.÷0«1¹1”1\1K1T1j1š1ü1l2”2ù1º/h*e }ýßèßÖ!ÊhÃâÁïéÇ^ËÙ͹ÎÎÎêÍýÍÅÍð̾˥ÊÊùÊ$ÏÓØ…è¹ûfi¢' -1.,(“#æðä#Ï&£*H-‘-¿*ï$ÒUL šÿ÷ ð!ê*äÙÝ<ØôÔ•ÔKÖ˜Ø=ÚÚšÙJ׊ÓsÎäÈÄÃùŘÍÙzæcó þÍú ŠœÙl!’Y"]$Â%Ú&×'Ù('*,².j1a3™381î+ò#%äÄSü7û5ûvú¤÷Jò‰êëàªÖÍSÅÝ¿¸¼P»,»a¼dÀŠÉÅØÆëŠþ"Û ä$j&¢&æ&þ'>*ˆ-1$6';5@õCÙD B’;2&ÑH ŠþZójêÐãß‘ÛZÙ9ت×ÝÖQÕÓdÐA͇ÉNÅÁ3¾W¾¬ÂKË×sä­ñUýüØõM"c#Î#9$T%Ý'Ê+Z0ê4þ8u<]?A&B@A9Ä,bß®õaç Þ’ÙCÙuÛßݺÞÝéÚÃ×@ÔÐËEÆ´ÃrÅàËHÕ;ßièÕðÓø2CÐ 6÷½V8 † Œ0 à‘"¸'*¯)?'G#.‹å O ÿÆ&ý/övî¸æ¥ßÛÙMÖœÖ ÜVæiòý;U 9 ¯ÎZ l †ÐŠŽ;¢!l#$l"í¶<@¿ÿÒú‘÷öîõ=ö”öÒö™öTõ[ò…íXçÝà7Û×ìÓþÑlÒÌÖxß—êõµü ¥:/6ÃÔ Ÿ,ë!!Ï&},Ç1b6%:†<€Þ?Æ>á9F1&¿þ ÎûqóÉìMçAãNàŠÝsÚ­ÖðÑ)ÌœÅô¿¿µÆ×{ëtýÖ i š ¢NŸÚ Gü "#S!„œGùÂôËóô;ô·ô_õ@õ‡ó—ð îèìXì_êBæÑáuàä)ëªò˜øÑüùa¬ý¯÷ñôêæþâ’ã0écóÛÿÄ ï¦ò#z(¢,ý/637Q;c>º>;™2á%0 þ¯÷Cô%ó“ò‰ðÏë¦äŸÜŒÕQÐÌbÉ^ƱÄYÆ)ÌØÔ ÞÝåÏë$ð0ó¹õùUþ@§ ÚöJ£Œ@¥M!%û(Í*|)]%ØAÂO ·+þBöií¿äUÝ¡×UÓ’ÏoËÔÆÈêÆ|ÒTåùÔ;Ti D Hßð %8¾"L%Š%$!Ò¬7û òÓí}ì?ìÜìŠî¹ð(ò‹òåòOôö@öøòµì)æ#â€áãçîz÷BN ØI $êþ¦ù1÷Aù˜ÿÜsh%œ!A%y)6.Ã2;6}7,6E3e0Ú-Þ)"½ýöªñáî?írì,ëçç^â¶Û¾Õ€Ñ]ÎÕÊ”ÆÃIÄ{É¡ÑuÚ ãjëOóÛùyþ¾I O·7,!þ(1‰7ô;?ÝAGDEùBÝ=e6¯-U$ŒÄÜ ›ø‰ðè7àïÙñÔ@ÐæÊ>ļYµz±°´VÁ7Õ—êÌûE’ ÷ ] §µe Ûi©ÿ&¥,h/o,u!ónù½÷ù”û)üEû„ùl÷ýô?ò®ï[í!ê2åß7Û0ÙÖØÀØÖØÚqÝ`âçééàæå‡äæåbêûòÐþ8  #Ä!|$Õ&ä)Ü-E2&7u<~ALEoGNG&C€8,'#H÷¡òrññïïÈíTêÁåpà@ÛP×ñÔvÓûÑxÐÏÏÑ/Õ‚ÜKæ¥ðúµ²? Ø_Þ‘]$á*—1¨6û8J9¦9ý:!<;7£0ç(« íúÒû£ó²ìÉægáfÜØ]ÔÐ=Ê-þ'¿;È&ÖêãeîÒõ³û8™+qÈ‹8 •sÞo œ ÿžùÌöøÕûØÿÔŠþiüüÀý¹Ê 0Rj ör9þ2úHöGòõí˜èiáOØDÎ~ŃÀÉÀwƶÐFÞníÏûqV6Ìêi#)¹0É7(>fC£FÈE?>|/¾, ;þ2ö¢ñ]ïtîqíÒê^æKáåÜØÙ¡×Õ Ò,ÐÌÑa×ÂÞKå_êï¢ö'ÿ Ú ÏÂ3Ÿ<x‚xßû· ";%¾&W%°!iUÍt ž1ü‘ö\ñJìèšåbå çêîGò)öûøìùtøÅôïïÏëêñêòí×ñÏõ•ùÑüìþ_ÿkþ&ýÔü¯ý"ÿ°E¬’´SîÔ. Ù£†ê¶ å'û÷ õÇõéõRôÿïßèàå×Ó¼ÓyÙtâåì§÷¥¯ Ð,1JLU½#(W*£*)?'u"'0éú8ô¨ïÆì=ë/êÎèªæÞãëàvÞtÜæÙ#ÖDҔкҬØ×à(éðjõ’ù ý·ÿg§WÏË Ô §×{Ý"â(u-80ƒ1Õ1{1„0^.©*Ä%— ¹×7„ yöüM÷JòÃíôé‹çþæ.èêrëuëÍ鉿 âJÝ•ÙkØ_ÚØÞkä¦éÑíüðfóbõw÷2ú…ýÇy„“2 i qÄÁº†Æa92Ë$ —µýŸ÷ó¶ðî“ì’êÀèiçÔæiç¿éAîÓôÌül ­®Ÿè°´)!t$%4"éíq þõvîêžç€æôå åyã‘á¥ßïݯÜîÛ)ÛéÙصÖ<×ùÚ#âjëÅôÔüqâ1 =ü½å§îbÙ ´ ¾ÇhÌ| o y"Âð à ¿ ‘ÙeùeÿïþXþ<ý\ûeùiøÎøúùæúÊúOù{ö¤òŠîëRé®éÌë£î7ñíòÀó ô3ôkôäôàõÀ÷ÊúÿA D²=ó@z´ñ!0$Œ&Ü(›*@+I*x'Ý"”Ùÿ µýùËòžíêÐé/ëyîZóGùTÿº  ¬ cÂpÇè6Îþn Aþ"ôdìþæÍãžâÆâÔâÌášßÔÜÚšÙCÙ…Ø׫ÕhÔøÒÑÏÏfѺ×Ôâ‰ðËý·K ¥žUV ›m!›#T&)=,à,*®%ŠÈ³Ê äpýžùÁõÉñhîì„êêèÒæ®ä-ã}ââgáá â,åéé©îòqóióßòwòò0óô¥öïøûëü£þÊŠQ9ß é  õó£c'ãxyä8· Ú {´ÿÞú÷%ôÉñ«ï¯í)ì{ëÄëÚìLîÇïVñçòZôÁõ€÷@ú¯þôg ÙçV¸p&Ôj o ÿTûøQõ“ò•ï­ì~êÊéë‡î8ôÝû˜ –xóíc99¾WÎ"Ó$k$m!rŸü “$MýúÚöôJòœñÝñPòòŸðßíêçç4æå¿ã+â­à_ßÞ+ÜáÙz×¢Õ!ÕoÖáÙ{ßÁæËîVöüAÿ$˜ÿïþsÿüNA%h*û-÷/«0¦0 1µ2Â5w9uÔÞ£êû÷À £; $æ&‡)ª,@04—7:ƒ<”=–=gÖv$Æ(=,9/à14n5Q66Q6O5l3¿0¸-«*÷&à xiÿõæ_Ú>ӱϱÎvÏÉÐiÑÒЄÏhÎ%ÎÂÎÒÏÑÖÒMÖ.ܨäTïYûwa÷{ #¯#þ#¡$ç$È#!w¡îˆ˜4 † T ·£Ì!ûëõ¸ñRîuë]é+è è>é€ëžîÝñnô¹õÏõõCô5ô~õRøùûOÿô=(ýˆøžóÍï î0î>ïÐïÖîÚë[çþâ.áQäíàû™ j)¹1š6H8‘7„513p1Ä01æ1S2?2à1'1/¨,(Y!ß5 ÿûVì£Þ'ÔâÌOÈ:Æ[ƵÇÉÂÉÊ÷É’ÉÈÈÆÇÇ–ÇØÉ-ΣÔMÝÑçDó-þ7¤ šµ¿·Ùþ¡Ÿ^Q0# ÃÍ·i\*´þGýYüSü+ý¿þ=~ Ãfx!3$é%Ò&ù&\&ú$É"‡$¶|½¾û‰õâñNð@ð‰ðÐï1íïèä¿ßËÜxÛ¶ÛfÝ€àýä”êàðJ÷qý²Ÿøé  ý _ 8  x ý Ö µÑ  c¶ûW&üß÷øóàðÖîêíçíqîï«ïð»ðµñ×ò²óäóAóóñ_ð±îêìúêÐèœæ¿ä˜ãOãõãÒåéñïù ø?9#ý$%$•$ %‘' *Ä,k/Œ1¢22®/:,ø(Á&y%¯# î gûsïHæ¿ßóÛÄÚÛNÛ_Ú.Ø!ÕâÑìÎiÌYÊ-ÉOÉÁÊÃÌäÎHÑeÔ|ØËݶäfí…÷åé û„v ­RÌ!¢'ð-œ3d7§8¢7>5=2ò.«+…(„%w"‡ücV¨º?Ï ¢ÅùØð§çeß ÙÕ„ÓÖÓ_Õ×ÂÙÚÛÓÝæß âä—åªæ»çZéöëšïôÙøwýr ö^ò   0 >  ²¸èµÓ Í F Ø D ržvþàú·ø9øïøúôúûLúÀøÆö£ôœòæðï½î(îÀíPí»ìì)ëê²èÌæÿäýãCäîå8é¬î¾öü {V• 1#I%o'¦)Y+,+Þ)l'%Ã#ß#%&%Û Ový)÷ÙóÔòó|óióÀòÃñÏðÞï¿îRíñë@ëKë&ëÐéç|ãìßÚÜ\ÚkØDל×ÚWÞ¡ã¤è€ìïî5ð«ð¨ð¹ð7ñqòŠôB÷Zú¤ýY¹Þ Õ²’(06ž9!;—;Ä;ì;ú;Õ;x;!;é:e:#9Ý6c3z.( c Çrû"îÁà‘ÕÍRÈ­ÅjÅÇ®ÉåË Í6Í(ͬÍýζвÒCÕÙØnÝòâéâñÝûö¾¦¹ $%v%·#v ”jÂòÀ›$ìJ ö8@0ÿÜýëü7ü×ûæû#ü)ü¾ûû-úRùMøÚöïôÀò”ð¦î íÉëë¶êìê†ëŽìIî#ñ\õ‰úÅÿ ªœPƒ‘Pg Þ®{t#•)û- 0/r,j'_!³1†ø ÿ ‹¡hÿîúgöò îôé†åÄàÜË×~ÔXÒiÑ¡ÑÃÒIÔ¥Õ§Öž× ÙYÛ›Þ`âVæsêïAô’ùZþ1JÖ¦ ¿ y k *  sI`ü '+P.ú/ô0m1=1k0e/ˆ.‹-@, *¤(ý%)"×=ì "þìóíèÞ®ÔÍÉqÇßÇZÉ:Ë+ÍÛÎÐëÐMÑiÑ»ÑÀÒàÔ3ØݦãìpõÅþÿ} ,—œ¹Ü¢!–#X$Î#)"ØPý"¤÷|Û_ ¸a‚þÛúE÷ÐóÚðËîÀí¬í¦î¶ð“óœö"ù³ú:ûñú@úsù¡øâ÷X÷&÷H÷­÷Dø3ùjú¹ûÌü?ý¾üNûUùf÷4öPö(øÁû‘¼k (ùÖ~ÄÙ4¡É î ë a è  ° s R xMHÆýîûÞúúàúîûwýìþ‡ÿ´þiüùIõgñ½í—êGè)çJç3èLéêêÇêëƒëùëwìíûíï/ðxñóØôÆö…øáùüú üýWÿuḠ™ 4’‹*³3u!.#%$]$$##å!m ÃÏWèø µ´Šÿ€ü{úøøa÷;õMòÓî@ë è³åvä_ä,åSædçè˜è*éê&ë§ì›îñõó÷úÆü]ÿå1á ƒ Kåwê\I   oîvøPŠÿªýÉûúø&÷¼õ8ô¸ò€ñÝðèð–ñ¤òÂóÅôŒõ&ö¢ö÷Ÿ÷9øõøéùûaü¬ý·þ„ÿ5 7Ñ¿Ôá Ú º |4ðˆBk[ ‰ A Å ú Œ  ô Þ Ž-Caüù€ö·ô‡óÃò+ò”ñàð$ðšïïàï—ðuñqò´óWõi÷©ùÏûý·þFÿ]ÿ]ÿ’ÿ==P Jœ‹.YU Ë y ‹i¥¨ŸO _ o Læ<^U8 σ+ÑU‹áéÏ C=ûP÷~ô}òàðFïtíVëòèuæäþáHàäÞïݷݘ޹àçã§ç†ëFïÑòöòøšû þ\ˆ€lW  – ¯pï22Ê ‡ …O=¡þ§üEûIú|ù²øÌ÷ÏöÄõÇôìó‚óÜó@õŽ÷@úÌü½þïÿxu*¹ÿZÿÿõþçþÿeÿ:at 9ç‚tö%Þëõ ¨ Ú ¸ k ©Li& Á v ’ k 8 Õ µ |kô JÀÙþ0úPöóÉñÇð:ðïï±ï£ïïï¨ðèñ£ó®õÎ÷·ù=ûBüÉüÔüwüëû{ûmûñûý¦þmëÀÃáÿçþ6þêýþ“þ«ÿd´ƒ  å ¸¦¶ à{íO²ñÍòY A íïÿùüú ÷òó¹ð[íê<çånãwâûáÚáíáâDâcâ©ânãåâç×ë¥ðàõúú|ÿ0fO ü … ø_ši¯PN·Ô ô I õ×»mËàØÿâýüŒú(ùÚ÷ŽöQõ3ôGó¤òJò[òçòÙóõ4öf÷ÀøZú&üþ'<D2û  \ ¡ Öô÷ÝŸ3ˆŠGÆÿÕ0 ˜ è2ŽËýèû_úùß÷Áö®õô`óüñ‰ðWïéîïôðõòõ÷ÙøFú_ûBü&ý-þhÿÌGòÏÃ’ )   Ó*é w  èO«^ýúö÷„õóŒðîŸë˜écèfèôéÚìuðýóööùTúØúûjûü ý`þ£ÿ¾ÉÉ“ê¬ð —Ÿ#ðÙÓ Ø5kÈyˆ²¬0qýsú¤÷ŒõWôêóÓóÓóúó‡ô‰õ»öê÷ùWúÁûDýËþKÔ›’o ‰ ² `¿¾1îǯæ â!ä9ݼÿ©þ‹ý,üvú…ø‘öáô¦óó•ó8õÜ÷$û˜þàÍg˜ g ë 0Dô„  q ãÅ|0²•\£÷ùûr÷ó_ïêì¶ë­ë¡ìDî_ðËògõí÷0ú,üÑýÿÞÿgÒHÏfÙ©•—°È¬  ž |Éæ0ðE&}+ê´=F‡ø¹þVû²ø/öÙó×ñ!ð¦î6íšë®éwç'å"ãÔáŽálâTäç{êîÑñgõÜøüÿÄ0xÙ† ŠàbÖÇ­.af £HÛz , ߎ>ó¼ÿªý¥ûÊùGø‘÷å÷3ù÷úÌühþ¿ÿ¨H§ ŽJ±*¥HþÖ± ‡ V ô = ) Õ @ 2 cØ×Õÿ ýàúùÜ÷a÷½÷ÃøúûãûEü)üŒû„úqùøøµ÷P÷¶öÒõ¦ôóòŸðÈíéêè&çÔæ¬çéŸì:ðáóñöòøÛùÐù ùÎ÷ƒöšõ”õ»öþø ü_ÿi¦³p&u‡ÿ ÿÝ3\ä  ±œ(NŒÏêÅ-v––¶úvc‚ òá½þÍù/õöð6íêiçuå;ä¬ã·ãä´ä:å¹åNæ[ç%éìðõ ú=pá t 'DÖG¬Q'ö¤Ö}l¹t«? ( £$ü“øõAó†ñrðìïÇïñïƒðuñ‹ò…ó0ôŒô´ôÅôÓôýôbõ:öµ÷ÖùzüQÿóQÄ„ôhAÈ•x7Žz Õ ± ¾ à h{îÝh®´ˆ r Ø # i T@o]ú üå÷ÚìiâýÙ{ÔÒMҌԸ׾ÚíÜøÝòÝûÜ^Û~Ùþ×M×…×wئÙÛ]ÝYá“çÄïäø»6 ´ ifÀ)Ô‡gp> %>)†,í.Œ0g1‘1:1´0>0Ë/Ó.¾,w)s%g!ª`ƒä4ê 8úþzø^ò í¡èå?âà(Þ.ÜÚ"ØâÖœÖ[×ÞØÕÚ ÝjßÀáõãæUè ëqîŽò^÷¾ü[óù Õ² ª!ÅÑ ^ 4 +  Æ ÿ éå¼ÿŸü©ùâöLôò\ð>ïºî îÐîï‰ïðñBòäóÕõÚ÷¿ùmûèükþ*)kè‚ ) À ½¯Ü[Bvç ¨ , ÏŒ/šŸð3QQpPA — þ é¹ÍÔ ¾¿ù™òƒì"è¥åÐäåå æ/æææ1æ¸æçwè0é›éÞé;êë»ìCïòö•ùzükþZÿŠÿOÿõþ½þÈþQÿ_ÔiïKœ0 T +¥vL¾›×!™#ý$ &j&Ó%-$œ!`ÅÿA«P D m˜—PýÅùÿõMòõî<ìbêkéFéÈé¥ê³ë¾ìíîeî±îï±ï¹ðJò›ô½÷Ÿû|¬^ ~D'Ú|ýHMê}=LÔ Å èdºýù¼ôÌðí&ë›éßèÎèé«éFê¹êúêëEë¶ëŸì+îKðêòÇõ©øQû½ý[Å<  ¹ [ iÖž× ¥ Q 0 ’ 0   µ  å r Ç £ Î aþ·ùÏõÆòÒð ðbðŽñ"ó±ôØõKöàõôžòðzíë"éÑç7ç^çUè÷é ì;îCðÝñçò<óÜòÑñ5ðWî²ì³ëÁë í÷ï ôáøÀýà鸜ëðâÆ‹ dQûœg‘{xÅ, º³µÍ@\«p̘™kÇ ~!x!Ð ì ?iay§mœA þ«¸ÿ¾üú…ø‘ö®ôóÉñ!ññ”ñEòóóÀóóÆòÚñ4ñYñMòÂóCõYöÝöÚöƒöö«õvõ„õ õ„õôô ôçòÏñÝð$ð¿ïÄï$ð¹ð7ñ4ñŒð'ïJí$ë6éðç¸çÎèë]î òéõGùèûºýÈþeÿ )¶Ô †+·ùœ ; 6;ÿìúâ÷{ö¶ö]øæú¯ý‘ëP8-ÿ‡þZþþ%ÿ  "Ö–Ž2Þÿÿ ÿØÿN9\dû´ q D¢Þ3‰ïÿ‡þ™ýfýÖý¯þÂÿéåŽÔç"Î~Λ™°Ò9bþýÎý`ó x ¯ Ô 1 H ‘ H b ¹ ) ³ G Ù L²«b!š¢$-ÜM Œ £ }÷ökþ_úÇõÕðÉëöæÃâpßݳÛ)ÛNÛÚۤܓݱÞàÑáÐãüå6èmê²ì$ïòõ´ùþ4Ò–_ H Œ \ C !  Ø ¹ ‰ $ f BÉ=ŽX»ä£ŽO Œ $  h 3 ÀHá©™°Õ*ÿþÑüdû úùMøÔ÷P÷}ö8õ•ó¾ñúï±îDî÷îÕð›óëöZúÀý/ÍµÑ ãº¼‰z“ ,亲Ïìï½r7C›ÀOµ Ú « Z + 4H'Pÿîûa÷Ýñ”ëïä¦Þ©Ù¾Ö ÖüÖØÅÙïÙúØP×TÕsÓßѳÐüÏãÏŽÐÒ{Ôœ×ùÛÈâùì2úâ"*6.3/M.×,Õ+¹+”,þ-£/b143Ë4Ð5565665"41,T%Úæ- þÑý¦ùöµòï5ëçÙâ£Þ¨Úc×jÕéÔ{ÕƒÖ²×Ù¥ÚµÜ5ßâ8å`è_ëËísïrð,ñòŠóxõÜ÷„úGýÛÿ…O´Û¤~ P ¯ +¤ #  É—“Ä$ËþºýÆüÉû±úùnøP÷&öÞôóGòñ ðïîPíÜìêìwícî‡ï¨ðªñzòcóÕôf÷KûC¶ ±iÿlðóÚÆ¾‹YFÀÁn( @ ä í1d'6dõýúø÷Ïö)÷ÑøKûþü¬![„ ­ Ùà…‚º?<ékê ‹ u Ä k * ½ õÆ$ÁIÿý‘ûû¾ûRýnÿ‹0áf»Fÿœübúûøø·øIùÊùúáù„ùùßøù´ù¨ú¥ûMü=ü!ûøøöóšð0ï ïýï–ñióõNö÷r÷d÷üöjö ö2ö ÷–øšúèü;ÿjO¼ŒãÞ«TÖ(X€»EEÆ»û=Ó2$ú ò½è{߸כҚÐ)Ñ(ӌժ×ÙÞÙôټ٘ÙÇÙ«ÚVܘÞEáä8éÞïïøõÞƒÿ%f.õ3x6¢6Œ54É2ü1!2t3ý5J9Œ<õ>F@¿@´@*@ø>.=é:ë7‚3-˜$/' ‚ÖýÖø;ô´ï÷êÄåàÚ÷ÓWÎšÉ Æ2ÄÞÃÁÄdÆ;ÈÊ­ËDͼÎCÐGÒFÕpÙ˜ÞŒä&ëcòúâW ÿïòè!²#>$©#"®ª|{ÓSÖP á ª¨½Æ·ÿ¯ý³ûÛù1øÚöÝõ2õ¼ôZôôÅó²óäóeô;õ{ö(øïù\ûü«ûpúÈø4÷ö¢õ õùõƒöèöööÄö¨ö÷%øúùBüËþSÓ=…˜ z %~Wx® 4 y n A Þ ï , c hTz { x×ýÈøpõJóMòüñÝñ‹ñëððïîíiìBìœìzí½îHðòÜó°õl÷Èø£ùýù$úhú û4üÙýáÿ „ž H ï¢qV>h:!M"”""Õ ½Ïö3¯ ΟüÜ÷Öó³ðkîâìÿë¢ëÆëJì íÀíGî•îìî„ïVð\ñtòžóõëö„ù×ü¢˜^« >r¤ËÛ±KÄ,}ˆ1†Þs;qX­ 0 )-œÿþ¾ü7ûWù)÷¼ô òï¢ëèæäqâá—àáXâ ä æ3èbêzì]îÞïôð³ñqò˜óQõr÷£ùƒûÔüzýwýöü?ü¹û¨û)üùüËýnþÜþIÿéÿô‹Š¥^R > %7Â)áþqý<ýZþY–vîjsÿÌüTú1øröõçóóˆòXòcò“òÑòþòøòªò<òòŽòøó:ö ùÿû½þâ8!¹,Õ®ØVûú 5 à ©Êöò­Bᫎe!K"%#·#+$¯$A%Ê%&á%%§#~!˜ô¥öM þC_ÿÏü2ú[÷FôBñ¦îÔìÝë¸ë7ì%í]îÂï:ñžòÅóô;õ³õö\ö\öùõFõnô£óóÀò¬ò×òJóô$õBöP÷?øùÓùCú-úeùê÷ãõ£órñ‡ïþíåì ì‰ëéêêéåç§æsåeä•ã6ãJãïãåàæOérì'ð"ôû÷Nûßý˜ÿ†æVÔŽn]\V4ë–Z _ ¥  ´x…ÙBžÌÙÂj!§"`#™#^#²"r!’ ÷ èú<ãÿþý–ü†û‰úcùøƒöõ·ó§òèñoñ4ñ#ñ#ñ:ñzñþñåò-ô¿õo÷Rùpûþ›1‘ Le’Ô ³ ­9þéïÿÿcþõýÑýÖýÜý¸ýRý‹ümûúžøƒ÷åöÄöëö÷ÿöªööjõôÓó3óóŠóÍô™ö¤ø¹ú²üfþ±ÿ¢oE(êh ´äCà­¢™L G %îÑÿÂúö:ñ“ìJèmäãà©ÝÏÚnØÌÖ7ÖצÙÜÝZã’éÕï¢õ¶úÿ¯£ ó ¸ À"@&¤(ý)Š*›*W**û)ï)Â)>)4(—&k$Ò!ý9F•š ?žêýyù—õˆòbðï¦îÓîOï®ïïõîÖí‹ì@ëê"éOèžçç¢ægæ}æüæâçé/êEëuìî'ðçò=öú3þ‹àô Š€Ñy†Y–å 뮡!Og ËÕ¥'úÍ`¯ªNŒÿiý÷úlø÷õÖóPò™ñ¸ñwò˜óÓôñõÆöH÷‘÷Î÷+ø·øsù;úñúƒû×ûîûÕû³û¶ûöû€üXý„þè"Œäñ r o â ø ç Æ } Ï p % ÞÁ?ýÖø'õªò»ñSòô‰öùNûðüÎýÆýÆüôú²øgö„ô9ó¡òžòþò|óÖóäó¯óóÀó´ôaölø¶úýÿë;dqT  … ËÛÍŸ?r,  ? P H $ Ö#éÐþ)ûH÷GóLï”ë[è¶å©ã â ágà à¿ß\ßÛÞsÞUÞ¼ÞÕ߸áŒä[èíiò<ø]þ«ï ÝCkJ#Ê&*ü,¿/#2ó3ç4á4ç3=2"0Æ-e+ )'õ$­"æ‰À®‰\ (ýÿ üMøsô¥ðíØé)çå©ããã·ã ä¢åªæ§ç›èeéê®ê_ëEìníÍî_ð1òCô‰öËøÞúwütýªý4ýVü_û®úpú—úñúNû_û÷úúù‚ø÷ùõ³õ/öH÷Ëøú4üªý©þ"ÿÿËþ`þ þÖýÖý þ>þ-þÀý ý:ü~û÷úÍúûöûPýøþ—ڎäX+Ž"Ö/¼!a†¨îdðwÜ ûˤ™©Ù c  > B£ËóHËþ–ý­üü»ûYûÐú!úvù ùùºùûý ÿw_ Z / œ ¯@«¿\A» $ ¯ wˆó³Ï4­þªëÛŠ g´ÿþýMü¨ú%ùÌ÷‘öxõ„ôºó(óÈòòtòEòíñMñuð¦ïïÓîÐîïÄïæð}òkô‰öøNú¢ûoüŸü,ü,ûÞùøE÷:öIõFôóKñïiìké}æúã1âKáoá¬âìäèãë,ð©ôùý ˆìí¯ : ™ ½ ¿Ý?íô<šâßQ ú ¹ ®"oÐc+,@-Ñ=û †  ¦ E¢ïþBüºùˆ÷—õìóò?ñð´îåì¨êGè&æŠä’ã3ãqã5äpå׿Jè·é\ëiíð‡ó§÷€ü×Ea ¼>|¾×º7!4"}"å!b *(>Ÿh¡( ¼  É;ÿÆüûú£ù„ùDù“øE÷{õnólñ¼ï•î+îŠîšï ñqòyó ôRô~ôæô¹õ÷õø5ûýŠÿ#U(Å-I˜åüëÊÿ›þUýüúáø÷2õLó™ñVðÍïFðåñ›ôøëû£ÿß8¢, œ—$©cˆ‘®!¥µ0¿2S‹ê] Í ¥ j å  Á / g y y n[\s›ËíþñÿÂþfýñûmúçøV÷¿õ ôoòôð¹ï±îâíBíÆì^ììšëë—ê;êTêëœì÷î ò°õÈù>þâ€Ø ÂÕêxÄÀ`ˆ1‹¸Ýn´äíÉmÎèÖÀ Ì  `»%½þ?ü´ù?÷õóŽñŒð÷ï¹ï£ï{ï"ï’îÜííuì ìBìíî»ðiójöù‹üÿྟ®TÿõýÑüüpûÊúÈùøxõòßíŠéŒå“â áHáLãüæÕë)ñ,ö8úùüŠþCÿ¦ÿ' €Z:»“žaã ì d ìü:d”òÉ j 0 i'F‡¤ˆ!‡ÿºýÚûúør÷»öYööëõÊõ¥õsõ-õÓôô5ôçó‚óþòaòÏñuñlñÌñ¬òô¨õd÷ùpúŽûrü9ý+þ„ÿ}Oè1 æ£*Mö!%¸'Ó)W+4,=,s+Þ)—'Ö$Á!FS®R|° ¬‰€ ÿýÍúþø¡÷jö$õ¦óÝñÞïßíì¿êØéé•éìéQêŒê³êÝê$ëšëJìGíî'ðëñÅó®õ§÷´ù¹û‹ýêþ®ÿÅÿ;ÿJþ#ýümûTûÁûgüÆüSü³ú¤÷Dóî|èJãß7ÜÛ»Û%ÞâðæóëbðÅóîõ÷»÷RøDù³ú‘ü¦þ¹TxÌ| š %ëÅ+uVÎ÷î ó!# $á$L%%ø#Ì!Œr ¿9S´ÿõýÕûOù”öÓóñnîùëÐé è­æ¢åïä•ä¨äåîåç˜èeêgì„î¶ðóòsõløügmæ s¥^›Û j!u!/!® úð{’GÂ+Áž» ú  ® Fÿ}üõùÚ÷=ö!õkôõó´óyó%ó–ò³ñšð~ï›î îêíî˜î8ïÒïNð­ðñrñ1òGó±ôröˆøÛúXýÅÿ  ¹ëft(ˆ{æ²¹ÿöû^÷ÚñªëWåßÒÚÈלÖU×÷Ù"ÞRãÐèâíò-õH÷²øÞù=û4ýÅÿ¯ŒùÖ b ÆìS¾ßV!+#k$8%Š%2%+$w"m OPk¾÷AusB é |·ƒ„ÿÎýBü•úøñõõò¼ïoì>éYæÞãóáŽàŒß¿ÞòÝ ÝÜàÚéÙbÙ¹ÙPÛRÞ§âè;îÕôƒû¯ ƃT c$(+X-©.í.#.\,Ó)Ä&q#! ù1G!¡ Û àðJþ!ûžøÝöÍõõbô|ó[òñìïÞî î…íMí^í¤íêíîUî®îOïTðÉñ¯óüõøûªý 7A2 Í _ ¥ t ¡ 1 S : ý ˆ¨ØÑü3øJó’îêŽçÿåüåˆç_êîðñ@õJ÷“÷&ö|ó~ðîªì°ìßí«ï‘ñ óLôFõVö½÷’ùèûºþà-tx %{…WîHXþoà,FÆ 2 ì  X#µÌLAÚ]þãûhùÝöOôâñÒï(îÎìœëhêé¡çæ•ä6ã6âÑáPâáã¥æêÄïÛõoüíÖê 7ìO{y1"$ƒ&Ý'¬(ç(½(J(µ'ñ&&Ð$6#!RÍÌÉR§ Ø ¦ ²‹î¦šßüµø„ô°ð‚í ëLé%èwççåæÌæÁæÝæ.çÎç½èÐéîêèëœìí‚í>î«ïðñïô[ø¾û½þ)ðïDûŽbÿzüáøäôàð<íeê¯èUèhéåëïÀó ø¾ûcþÍÿýÿkÿþäýÀý þqþtþÀý)ü÷ù™÷¼õáôeõ?÷Cúêý§å ‘ ™ P ê ‚’áì’€ è 8 ¡SCIFÏmÿþ&ýŽü)üàû‰ûæúçù©øw÷Žö öàõÛõÕõ¨õKõ¼ô ônó3óžóìô1÷púþtà Vá½ "õ#Â%}')Z*-+_+é*Ë)&(&z#® ­bÕðË’ S7hþ!û|øxöìô˜óGòÊðï6í7ëOé¡çjæÄååÌåæjæ¢æ¢ærææÄå¨åüåçÐè\ë‡îò¹õùöûþkÿéÿ£ÿòþ6þÆýÔýþ>þ›ý×û¬ø*ô·îûè¿ã±ß<Ý¡ÜßݹàÍä é„îêò\öÃøWú†ûÉü|þàÖ d ž ¬ Ô x  A D Z € k§¹Up&êG.€,*œºà>ö y .ü¹Ôÿ ü0ù¶ö¹ô<ó1òañ—ðïkîí°ëê¼é8éûèéLéÂéIêúê ì½í_ðôäø¬þ rbè Í d"Ü#A%p&7'?'e&½$}" ‚Æ‚P¼ª D Ê“Óÿ“ýÚû¥úÖù6ùwøi÷öZôžòëðZïî#í‘ì<ìóë¢ëHëìêxê÷éné éé±éúêí¼ï óÄöšú9þ=wÊ_Zý•R8¦B¹ÿæû ÷­ñ“ìqèÏåå=æAéníò@ö£ùèû.ýÎý6þÐþÛÿxwvüÎû­?g¡¦ dzèå¤a&ÿà¨Bs"S  žHZÿÆýˆüûæúFú¬ùõø øâöõ"ôíòåññðïî.íƒì&ìì1ìuìªì²ì‹ìXìlì#íËîŸñ¶õ÷úo“ xúÆ ü!µ#L%³&¸'(¥'@&Ù#„ xß!ü O É8o_ÿüÅø†õ§òpðéîþí^íÆìùëôê¹énèXçÌæ&çÂèªë{ï¬óŽ÷Âúý>þ©þ¦þ›þÖþÿÿð\# ™ Á2éúŠâ \ 5 L 9aUáþ%ù…òŸëå¼ßÜTÚšÚ‹Ü߸â~åiçUènè6è6èíè”ê í'ð ó8õPöjö öãõœö©ø&ü¾ãÒ 4Šma‹‰ `#˜%¼&&ï$V"(àÀä šþ b .Š´ÿãûGøáôÃñÈî¾ë…è,åþá_ßݡ܀ÜÝÓÝÞòÞß5ßÕß}áväáè©îŒõý¿Ê ¸VÓŸš!0$æ&Š)Ò+[-Î-&- +•)d'O%#ù!¨ Rޤ§„³ …Z++÷5ÿÚüú÷%ôSñ½î…ìÊêé–èåçlçUç¬ç|è›éÍêÿëíîïKðþñWôw÷$ûìþE¿)Ž*(G‚—¸ý$úŒõ5ð£êjå,áWÞ?ÝßÝ àGãç±êÅíð}ñiò%óôbõ÷"ùû¾üÃý%þ þßý(þ'ÿ›» + ô<@¶üù°,sžÎ}ëQ¨äòÔ ^ e À„üýmúÃ÷mõAóñÍîMì£éîæWäâà¬ÞÑ݅ݘÝïÝ„ÞmßîàUãç€ì½ógü O—$0"v$°&)~+ó-0K1¨1 1•/u-Ó*(Z%ö"Ê ŠîÎFŽÉ rû ÿ,ücø>ô÷ïÚë3è'åÆâá'àÛßà€à áœá9â ã"ä‘åEç(éë(íIï°ñ˜ô øBü¶çô 0’eïtþ l j   µnÎýM÷»ðôê‘æäkã´äwç)ëï¡ò\õ ÷øiø]ø+ø øføùÈù‡ú/û×û¾üþr*  µ úÚl¿ÿ,?©Ð`M”hüy Z Úo|à$>þ)üýù×÷Øõ ô[ò¶ðïMíŸë!êéièGè]èqèGèÉç1çÌæ ç.èWêtíYñ°õ8ú¬þ4= Ã@›É©ü!#G$>$ˆ#4"p kH- ð­F¸  o%¢~ÿ¯þ¬ý}üûùå÷,ö|ôþò§ñ{ð]ïGîBíaìÄërë—ë#ì<íúîYñ;ôt÷¼úäý¹Øúd= Âõfžâxþ•ú/öYñÉìéàæNæiç÷éˆíˆñYõ‚ø¿úüÑü9ý¡ýRþyÿ⇗Ï/ïŽo{×Ó0 ý a l 3á‡'®æ¼[™ « ¯Ì*Ö§€CÖþ+ý:ûùuö½ó ñ›î}ì®êéÑçÆææ†åHåCåpåÄå)æ‘æâæ ç…çAè©é×ëòîõòÜ÷[ý.ò[vB±Õ!À#]%&&','Ÿ&«%c$Ú"'!FE§Õ¤_ ª0/Èþþü«û‡ú0ùi÷-õ¯ò)ðÖíÕë5êéGè è3è½è•éÄêJìî$ðwòõ#ø—û_ÿUJ ‚uµ' œ)*](  zfü;õËî«é†æ”åÌæ£éBí¢ðþòìó|óò,ð|îííkîÛïHñ+òMòÉñùð_ðgð}ñÎó<÷dû£ÿfS^´ ¶ Ê < /1 *·w³Ó­ « ô _   q°`œ‡þ=ûö÷¹ô‹ñRî÷ê€çäÿàsÞ§Ü¥ÛaÛÒÛ»ÜáÝ ß!à1áâ˜ä¡çÚë4ñw÷9þò \¬9p¯#"Ç%w)à,±/°1Ï23¾2æ1±0I/À-,A*î'ø$K!^¯5' °¼1¿ÿýú‹öÔòïŸëèæäÆâ×á,á­àKà àüß,à¥à”áã å–ç~ê½íEñõ"ùMýHáÚ;  ž ÞÖ\- » % R£þÀø`ó2ïœìÒë²ìÛî¸ñ’ôÉöó÷û÷&÷æõ ô½ó•ó"ô'õBöÿö)÷ÒöBöÕõîõ×ö¯øbû˜þÚ¿ßC ù ¦š¡e‰Ê¬ÆÊù l \ x r ù ï 6 ë;E"þîúŸ÷>ôîðží_êSç®äâüàà‰ßßàá9âºã¢åèSëbïAô¿ù‡ÿI¼ «°-‘"Í%Æ(N+?-l.Ë.i.f-÷+O*ˆ(°&±$g"¦VlsÍ VJÐþ üïùJøÌö*õ6óëðkîàë’é§ç1æå8äfã“âßárágáâáßâQä#æ3è\êŸìçîMñÞó»öÊùóüïÿ…˜=§þA _ ö Ð ?D%ÿ‡ùIôð‚íÜìîîð®ô‚ø­û–ýþwý ü¶úÓùäùûíüÿÕÔª/Ÿ%„[ X Ó´-†éx7½Îêws zã å<¡´"Ýìÿoý‡úr÷pôªñï™ì'êÑç¥å¿ãPâlá#árá4â-ãCä\åŽæèê“ìïïô½øÈý΃° RiƒÈq¹ Æ"n$˜%=&m&5&«%ç$ç#¸"V!¼Ñê÷Ñu c g“Ïþ,ûMøgõŽòæïíVëyéóç¾æÚå5åØäÅäýäuå#æþæè>é³êiìcî—ðóñõíø­ûõýŒÿDzàw J ˜¥ ê²Àý øÂóañBñAó×ö'ûIÿŽ~m«–îÚ.™µUo,±þJýHüüÑü|þ«É¨@m\Q€Ã…òê^a ¦c§“Ö¼Z.(þúàöRó)ðníëËèÃæÕä ã[áØß ÞçÝÑÝ|Þîß â åè‘ìñØõûH~h áÆðxÜI ­"ý$'½(ä)h*F*‚)4(~&Š$w"\ 3ü£AHDV …Û<¢õý!û1ø;õiòæïÖíEì/ë‰êCêbêÏê{ëMì%íêí|îÍîïCïéï!ñêò/õ§÷ú.ü¬ýtþ¡þþ±þ_ÿ«^ ÖûTÿFú•ôLïKë"éïèê›íPñæô¸÷ZùÞù›ùù…øføäøúùrûåüðýhþLþÆýý°üÌüºýŒÿú»  äñ–å­Ä-ã È þŒ·y9 ”Öþµü5ú[÷WôEñGîaëÀèzæšäãóáëàîß!ߛބÞÞÞ¼ßBá˜ãÏæØêvïZôZùnþz< ³éá¤!$°&É(Z*W+¿+¥+K+Í*;*˜)À(œ'&þ#\!1±#ð« ¯ åýa;þÄúB÷òóñ„î€ìéê˜éièEçæáä¯ã©âóá»á.âZã'ålçêÀìïGò®ô°öAø˜ù ûÑüøþV–I {=4ü.øïôóó´ôå÷ãûÇÿÆe›žð‡þ²ý¬ý6þËþÿ¦þºýƒüQû{úNú ûÃü8ÿù‡xµfÑ3 Í Í / ª á`çz \ Ò=qkÇN\ãý´)Q;þñû|ùÝöôHñtî¶ë3éðæúäRãûáôà:àÞßñßšàâ˜äè¡ìíñÃ÷Ãý“Ù[ )eK§N!#R$ì$ï$t$º#ö"H"¢!ã ï©üØM„ªìi / 6 rÄùhÿ^üõø{õ<òpï1íŒë_ê‡éÜèAèªç.çèæâæ ç¬ç˜èìéŸë¬íïï?ò|ô™ötø ú\û€üªýòþjåûU‘zý›ù{õ¥ñÐîníÀí«ïÑò”öLú^ýeÿWj ÿ£ÿFœ†BJˆþüTIÃç  ê ~RË+¯ z € € ( / y h§/>þý†ü”üíü9ýBýèü.üûÈù<ø‹öØôóPñyï“í¶ëìéRèöæîå5å¿äŠä„äÍäƒåÃæ¬è7ë;îÃñÊõ\ú_ÿ  ‡Æu±‘%\!<#ž$‡%÷%&®%%A$P#E"'!Ö6EìSŠªË a{´ÝÍÿoýÇúð÷õGòÄïíÌëŒêÂénéné¦éúé\êÍêSëì#íqîñïŸñZóõ¢öê÷ßø„ùúú_û‹üßýÿ¼ÿhÿÔýÿú&÷×òÓî×ëŒêKëîiòŸ÷Ôü:TúQ¿á3;œ(0 Z ÿòÉæ¼ÿšÿuÙ—ê¦ { ƒ ° µ (É } p ûp"ae@pK£ÿqþâü ûù?÷~õúó–òBñ÷ï±î`í ì¨êFéþçóæ7æîå@æ.çÈèéêUíÛïcòéô€÷-úýDª } Íøô¦÷É-8 é H!_!5!Ä  øox6ÏyMpçª Ÿ ³ ¿ º …)•ç'6þ)üú øöFôœòñãïúî|îIîZî îïÛïëðEòÙóõ÷Aøïø ù¯øø¤÷…÷â÷¯ø‡ùúùqù‘÷Côéïë¢æ+ã?á4áã³æxë³ð°õïù&ýQÿ¾Ôóh5 Ó  ‘  b Ö   ç Ç ! à hĸ?}œÌ ÅŠœÒ6ô P¦K‚ýpûúGùÃøAø‘÷”öKõÜóMò¾ð;ïËí€ìjë„ê¿éé‚èççPçÆæzæœæUçÖèëîYñÅôû÷¼úýäþ”PL­h \ hz‰œ¨Š!#Š$O%v%%-$#³! ¾#~Oª † ´ é ò™Û¯(þ'û<ø—õOó^ñÊï„îíµìì¢ë_ëgë¾ëƒìºímï‘ñøórö©ø\úYû—ûûúßøÀ÷ÿö³öÆö×ö‹ö{õqódðŽìGè"ä­à`Þ¡Ý›ÞMáeåIêOïÙó™÷úýIÿ‘(  É Ó÷FýkÐiw$€Æ½;O%ܺßRçN-9oÖ¥  Mÿ ýû%ù<÷=õ9óEñ’ï3î1í^ì—ë«êé9èÆæCåÐã‹âˆáîàãà”á%ãå˜è7ì)ðIô`ø?ü˜ÿJb!ά Õ DÝtô^Å<¬è!º#ò$~%F%L$‹"$ G*õü0 W P~Å) 0ÿÖýŽüTû2úù ø÷!ömõìô˜ôRôôçóÎóÂóÀóÂóÙó*ôôô,öÀ÷ù@ûÃüÆý"þßý(ýBüƒûúúúú6ùœ÷õ†ñ^íéQåˆâáá}âôäõçãê+í£î{ïFðœñïóo÷ü@‰8 ÅôÒ¥æ|y:§F=ýpÙhRv´¿hŠ– ® ŽbV|þÕûOùåö›ôtòpðŠî»ìÿê]éêç¢æšåÂäýã%ãâåà¶ßáÞÂÞ®ßÎá5å¹éïØô{úÿ¡Ì; , â šn¹ÝF”½> 7!m!Ä > ]u„³"Ì • c$Ö‰Zÿaý¶ûmú|ùÜø…øføcøtøiø9øÜ÷o÷÷—ö,ö¶õ8õÅôyô’ô-õxö|øû½ýª4ɾ•ÿ¯þAþGþqþ9þý®ú÷oò‹íémå+ãiâãšä­æ¬è!êÍê¶êKêê¶êÃìrð~õVûôž ñ ? õ ‚-8¨l;ñ^nZsnnveJùºü  XÛ@Âþüù!ö>óð3î<ì®êeéMèEçPæmå¦äõãRãÃâUâ#âXâ-ãÕäwçë]ï*ôùªýÄ-ë$ ! #¿ÿÔX¡Îó6Aªþ#$ý–åý ) s ðƒ TJìÿaýÞú¦øëöÇõ;õ8õ”õö‰ö×ö÷÷÷4÷o÷ß÷‚øhùúëûýCÿ#øŠ—î~hÔLÿ¡ýübú]ø¿õfò`îòéå€áv޵܀ܽÝàââŒåç½è8éLéŠéWê)ìCï›óáøhþŠÃú S 'Ý̪-:–36½@¨Q5©ÈXr%šýƒ - åx¯vÿöûløõòmïRí¥ë;êòè¤ç:æ¼ä0ã–áà£ÞˆÝËÜ™ÜÝFÞƒàçãRèwíûòiøiýÒíô êü-XYêä!”!Y!¥ ©–ˆxIçcÕLÎJ°ø  ø­IÉ"ÿ[üùÚövôœòYñ»ð¥ðüð‹ñ+òµòókóÀóôŒôõÏõÔö6øú1ü±þ\ûKù²tu ›c‚å:þúúÝöò íyèäâáŒàœà×áÙã æðç0é·éé;éékéÄêí=ðÖó¡÷mûÿ“Þ j á| kEvÕ g!E!± ÷kïӈ΃Œ'&;o · ñø«ý(ù!õ7ñ–í„êè ævä%ãëá°àpß(ÞÝ#ܸÛîÛ×ÜÞùà5äèoìñãõ¶únÿíã Z‘ŒXñ^ ¨!X#‡$%Å$À#"Þ4;½„¤ T £ z€V»Yßýšû®ù%øÚö¥õ`ôûò”ñTðhïìîòîkï:ðSñòÎóýôö7÷iøÊùŽû½ýY</Öá # – \ Á ÷ 0 | º¤ÏÜ·þ•ùêócî•éôåÐã%ã©ãïälæ¸çqè…èóç ç!æ—åÄ嵿]èŒê í«ï^ò8õqø:üŒQ5 á ŒRm1(ï  =!¹!ö!Ï!)! 汋T —êØ Xyjgü›øõüñ5ïÉìêcè1æìãªá‡ß¤ÝÜÛ¶ÚÛXÜAÞÉàÅãçbê¯íèðôd÷Þú¦þÑ?Ý ~ò{Fj!#6$"%Õ%H&T&á%Å$ß"> óJ„늆 ä­Ð+ƒšÿXýÄúø†õ>óSñ¿ïZîíÏëšêéËècèkèéNê.ì›îañeô…÷Âú þYŠwá ™ Ý § E î Ç ¶ { ® êã¥oüÌödñÀìZéoç çè·é—ëí©ífíwì=ë8êÐéFê‰ëUíIïñqòóŒô¿õr÷úÆý€Ì ¨Tö¯¿x=B“÷!ª!ƒ! íÌk>€’ã ¸"þºùÇõ}òÛï¯í¸ëØéõçæ'äDâ†àß ÞžÝÓÝÅÞjà½â®åé¸ìgðúóf÷±úäý!qû¼ ®¤oáÑ* è!#Ü#A$`$-$¤#ª"!íthÕ À¨½ýYû•ùcø‹÷ÏöîõÓô‡ó&òÝðÛïIï$ï_ï¼ïðbðšðØð/ñ×ñçòôÚö¬ùÌüJCÅ• — Ø — , ã á  N  ý –·¡þßø<óeîÄê‡èÀç<è éaëíìÈíÎíí¾ëTêFééÛéªëîbðPò¦ó„ô'õæõ÷ùôûÍÿDç< îá: ˜$àäÿ Ô"$q$$#r!IÒh+ðaAš ƒ+Îý¬ù÷õÃòúï[í±êøçFå¬â5àíÝÿÛ’ÚÞÙÚÛݕ߲â&æ éåìãïµò’õ²ø=ü5Š – Ú®ë`m "1#þ#q$‡$D$©#°"V!„#%¢À² SM›þ{ûûø ÷¼õ›ôóGòëðï6îGíÌì°ìÀìÀìˆìì†ëëÛêKë“ìÍîüññõ_úäþ °R ì ¶  l ( G˜ÄH¶·$ C®/û}öó#ñ¥ð=ñcònóÅó ó†ñFïÎì”êéèéê~ë¾ì¡íLîÛî‰ï†ð òOôV÷æú£þ1eM Æ Œ^F%æ< :!×!ã!V!; ¬×ñøÕh”U± į±þ ûâ÷8õíòÏðÈî°ì~ê"è°åGãá_ßcÞAÞߥàðâ°å´è¾ë¦îdñô­ö’ùÉüNû°\ Ü#'ðÒïÐ M"c#þ#9$$›#×"¶! ðu+|¬ ú‰‹ü"ù€ö ôOó<ò#ñÞïhî×ìgëIê·éÍéTê ë¥ëì?ì€ìíî¹ïXòéõ8úÙþ?ë’ / Ú ë Ø  Ñ õ ˜õÉ øÂÆýð÷ó¿ïîîZï?ñ0ó‡ôæôLôûòjñ ð>ï5ïãïñò§òªò9òœñ7ñYñSòIôB÷éúËþaeè ê ÛöRÄ"!†BM­p½Ôé<Y<è ] ªÜ ]þÝûùX÷õ–ò÷ï3ímêÉçeå`ãßá#áSáwâhäåæéPì·îÌð¡òZô2öcø'ûqþ) ¸ )O)½"áE!?"É"ë"ª" "!!ìnœ59ž `_ÿÞúóö²óñï¯íÑìSìì°ëHëÁê2ê´éhéeé«é*ê¹êrëgìÈí«ïòõ“ørüYê¾¬Í  ¹ Ž } D•ê Ø ?Rµý6ø¡óŒðFïÒïÝñ¹ôœ÷ÅùÇú‰ú8ùE÷8õ•óºò²òDóøóTô0ô£óõòˆòªò©ó”õXø†û¯þj:,6› š + €M`ÓÎcª¢dì1,À > {ç”ÿºýîûçùz÷©ô†ñRî@ë‡èYæãäQä£äÊå–çÓéVììîoñ´ó«õ^÷ùÄúÑü8ÿâØû2 J!–®€k‹PßÎ àvÜ I.¿Ë > NlüÉ÷ºórðîdìoë ëëKë€ëuëúê/ê>é|è0è›èÈéŽëºíðXò´ô.÷Ûùµü¦ÿ‚-}c á   ´¬U Ð #ªý ùFõßòòÈò£ôöö*ù®ú2û¼ú]ùŽ÷¿õ|ô ôpôYõNöñö ÷¶ö2öÝõ ö÷ÖøVûþ”Ží´$ , « ©‰ß~_‘=šá6˜èåh`î 0 Y–øþ+ý~û¼ù§÷Cõ“ò¿ïðìsêyè9çÒæGçè†êðìïòkôdöøŠùîúrüJþŒ3'9 ! ´ÄPi6ì£g7 ß“ "ËðŸÞÑuç# 0 îd¡þàúi÷nôòKðïî‚íBíJíˆíÓíøíÑífíÑìEìÿë)ìùìcîdðÜò¥õ˜ømûßýÂÿ7zê¼íQ ‹ >i# P](þùö>ô%ôŒõÔ÷Fú#üðü‘üHûùÀ÷{öëõ)öÿöû÷Èøùøø…øøÃ÷øù¹ú ýŠÿÏ®;j~¹Ql  E 8³‘Ï—sÓTäqÆ §  ärê‹nÿ™ýùûpúÜø÷'õ óÝð·î»ì&ë8êê®êìîNð²òôôëözø·ùÊúëûGýÿ/²j( ¹ ôŽð(>= ð™%yž|¶ìÜ Læ ] ¥¤Q¸üûøbõò8ï×ìñêé¦èDè[èÐèsé êvê¥ê®ê¼ê$ëìÀíððò4öùªü;ÿz¦Ìþ_ Ž û-µ î«”û…÷òôôæôñöùÇû&ýRýgüÕú ù“÷ÄöÄö…÷²øÖù„úŒúúGù¬ø…øù~ú‘üÿ^]ʼQÄH - ® Y û L/—‰Rnœ ö €  { £ k ÚîË—vÿˆý¾ûú?ø_ö`ôXòYðîêìÝëoë¾ëÎìî¥ðó’õö÷úÝû[ý¦þúÿ€[öh µ ¦2ga1ä|ò;TZF-  ¿þ§¼Rš µÄÙñÿýõù¾ökó)ð(íšê‡èüæùåxåpåÝåªæ¸çíè-êdë–ìêíŒï³ñkô‹÷ÐúÔýHöífÅkSZ * : ü  ŸÝ–üµ÷ô ò#òÞóÒö*úýçþhÿÂþXý»ûpúäùCúpûýyþbÿ‡ÿÿ"þMýÑüûüêý~ÿa(|/_2æºï±ùú /  ™ Ô Æ ƒ # Ä F  • Û ÈrÛ0þPübú]ø7öøó»ñ¦ïÑí}ì×ëìíºîÿð“ó/ö–øúKüÀýÿ‰.[¶ ð ÜQHÔ)f¯^‚f€ÚBÊv5÷sù Ø <j§/þ:üpúwø)öqó~ðí¼êfèœæmåÅä¹äNåYæÉçLéÏêHìçíæïzò«õOù ýW¸ybR«:( á Ò Y 6 ~Çæû¸÷ïôòóÅô÷;ú?ýkÿHÓÿRþEü>ú½øøqøŠùüúBüýRý&ýðüðüoýŠþ* ¿÷Ø®±!#¡k G ç À 9 ˆ Á  Z Ë 3 …™Œ\»KÂÿ-þ‹üÍúçøåö¹ôŽò{ð©î?íiìXì#í¿î ñÂó”ö8ùƒûwýÿ—¯xo ­ µ „÷ÿªUÀÖÑ–#z¢¨±Ù+™ ð  ¦ Ãg½ þMü‰ú(ùø÷¸ö=õUóñyîìééUèSçÏæ­æÚædçAèeé¼ê?ìî/ðêò7öÛù‚ý³TÍÐØÇ¶Ÿ ŽØâÿ û‘÷Iõyô=õS÷-úý5ÿC! ÿýùûæú ú5ûlüäý"ÿÓÿæÿ„ÿìþþþWÿîZB  ÃnU–L W g & P è  - ˆ1íµ4Q'Ñfÿ˜ÿ;þâü{û÷ùJøxö‡ôœòÒðFïîBíícíqîð(ò~ôüökù¨û¡ýTÿæt"ú - j ¡°oÓÖ—Y{{b$«ò îÖ•1 ‰ ˜ M©ÌïþEüú6ø×ö¼õ©ôUó™ñeïêìjê9èræ!åLääãçãWäC嵿©èëîPñäôøüTÿþxŸ²ß5 Œ ‹ Ï ñ  SºýúŽ÷¸ö…÷žù[üÿØg Ðþrü0úŠøÚ÷(ø;ùŒú”ûöûŸûÒúõùhù‡ù‰úwüÿÔZSƒ åÚB; ¶ j â Ù›ž d @ s  Ù › ‘Þ Ž'ýþûýý ü¿úù÷¿ôoòNðžî‚íí1íîyïdñ£ó öqøÄúëüïþÝÉÈå% ~ Ô ü¡ïãü&¢ Qеâ &ITJ °  B7ïrÓþ,ü ùM÷=õwóüñ­ðpï"îÆì_ë êäèçç+çŽæ)æüå:æüæwèê[íŒðúó^÷~ú<ýyÿKÙIÇ?¯Ð F ± α¹‹üáøHö@õãõð÷àúøýsð.jyþRýëüaýþ=ץČÿZþ™ý‹ýUþÕÿ»¡''Ÿ¥o@_îßõÅ  ž §JÒ‡´‚ä•-Näõ§=ïÿúþtþOþLþþýEü~úRøö ôòÚñùñËò"ô¹õd÷ùyúÄûý]þ÷ÿÝCÇ Ô £:½OË0ec(¬?\p~yX  « ( …¿ßë÷ÿ þ,üjúÈøM÷îõ›ô9ó¸ñýïîìê<è°æŒåÕä äïäÏå9ç é/ë‹íð¬òjõ1øìú‹ýˆé<t s ù º P ‰ nn üÙøùö™ö¯÷ÊùPü‡þìÿ8|ÿûý ü{úùùbúÉû+ýþ;þ¯ý­ü—ûîúûüêý=–’÷Ä4Ÿ™ Ø ‚ ´'ÈÆ : v Ȁǚ»³N_òB‰ÿÔýýlüÌûãúyù™÷eõóñ{ïžî’î2ï_ðâñwóõ¸öXøúÉû§ý«ÿÔ8Çv / Î4Gï@=íiµº}7=õiœ±¸ Ç ì (xÛR»0þ1üúå÷àõ*ôÀòªñÁðØïÖî›í,ì‰êçèfç,æTåÞäãäpå—æMè—ê3í ðêòõ ø0ú.ü3þ\­ MA   ' y |Z†§ý_ú1ø^÷øïùœü_ÿ™ê+“dçþGþ;þ¬þCÿ±ÿÂÿeÿÜþAþÖýÆý+þÿT¾þõÞ*2E›ï ý † é Þ ‚ ±©õÓ?J¿ÿ‚þzý¸ü üƒû®úŠùø‹öõòócóókôÒõ}÷DùãúMüzývþ]ÿY{ÉLñµ K Ú %%ྤ|* Ó¼qw×4•Ô á ÜÉÐYÅÿþ=ü-úø÷ÒõÀóÝñ)ð›îíšëêfèÌæ\å5änã ã%ãÐã!å)çÛé í{ðÙóâönù€ûGýÿ ?­O  ¿ \àXþdû•ùùúüÈþ{“¦«Ó‚#vÿ‡ÿ!ü¸ù¸T¨ÿOÿWÿÍÿ”r)œÎÔÔå(´«ì7?Î߈ßüôæyA9AÑPªë!]ÿ›þºýŸü5û‡ùÀ÷ùõpôXóÆòåò¯óõÁö“øNúÝûJýŠþÊÿ!²’¾ { ¡ pÕ¸)BMl½(ŠÎºX¡ª~Iß š * ˆÒc׌ÿ©þÖýßüûú`øªöõÀóžò­ñÌðÍï˜î?íÄë_ê0éGè½çªç+èkéuëAî†ñÊô™÷±ù÷ú»ûgüoýÿPÀÕ ÚâÀýyù÷õõóÓó‰õ¬ø^üÓÿ40לäþkþÞþ$åžÅ!…9B÷ƒß©j§ À×Áò®$KÜk y ¦ Þ G7š±ÿnÿ¨ÿ2¶÷¾ÿÔý”ü†ûÄú\úúÅùGù–ø¸÷×öö¨õÁõoö»÷nùVû9ýçþW”¤©Í2âË Ò À e«€îî×ÝBro,”³•Lî ~  –)Ív+öÊ®ÿžþ“ýwü:ûÐùGø¸ö5õÖóªò°ñØðôïáî‹íóëQêÀèrçŽæ#æPæEç"éãëLïÙò özøúØú_ûüMý-ÿu½hú½CÿYûÚ÷—õõ\ö"ù»üg[mŠóK$Óÿm­.eò£˜#Ï ãUí2Ç£áí0º$  ± H $ R2"l:¥Ê,ã2ÿºý1ü¹úsù…øß÷f÷óöjöÏõ5õ¼ô‡ôÇôšõüöÎøñú ý3ÿ™ûFš Ù ³ § ‡=¯Ëï ä„ѸH›Ô  W µ&®AÜdñÿþPýBü_ûúºùºøˆ÷4öÊôkó1ò&ñKð„ï¬î¤íiìüê’éUè}ç çiçkèFêírðô€÷ú¢ûSü¢üýþáÿ<©{M-ÿú)öóÉñ™ò;õùUýT dïÿ%ÿLÿ@ª õ;ê0iåó²ûÄiSŸ•’êá˜ô‹øÈ Ë ûw{`dÂÿŠþÎýzý‚ýºýõý þÙýRý†ü‘û¨úéùhùùáø¬ønø.øøþ÷RøùLúùûþ2E~Ÿ‹cO ] ” ö néEd6ºøÅiÜà– , Ð M ±JÉ@¿þaý7üEûvú±ùÓøÔ÷³öõbôqó²ò+ò»ñBñŸð¨ïeîåìaëêWé"é®éë#íãïóëõ6ø£ùTú«ú,ûBüþ‘+5Mþ6ùô&ñ{ïïïoòjöûOÿ–qÞ%Ã^xg7‚ê÷•ǹ•—Ø{Y9ÀÀ6P\Nd–Ô©   ¸ô 1«yÿ¡þþ}ýý§üMüÝûQû£úÐùù6ø‘÷÷™ö=öæõ õjõbõõ:ö7÷¦ø‡úµüÿo¡ i ¦  – ’ ›úü”å ÑoÝä…ë'DV e tƒ|SçýÌû÷ù|øo÷×öŽöjö:öØõ'õ>ô9óJòœñ:ñññôð†ð¨ïcîåìrëCêé’éêoìQïÎòYö]ù†ûÚü™ý6þÿmEOñƒ{§Xþ8ù>ôFðîîÿïžóøPü·ÿÌ‹+)IÿIÿ$€O-—ÁÒŽ‘øk ”  ã  ò ÃÑg¢t’ „ ã { ` ­¥|gÿþðü ü_ûàúšúvúZúú•ùÎøÑ÷»ö«õ£ôÀóó‚òBò[òÔòÈó=õ+÷„ù üÜþ”@ ¯  u Ü Zë‹"ãâ™( À?ˆŸ0¡ã4 j ± û:WEÃý€ûnùÉ÷ŸöùõÊõÇõÄõ†õúôôóëñùðNðàï’ï;ï±îâíÚì¶ë¹êêêÄêBì’î‹ñÂôÉ÷@úüDýDþIÿ G V±tØÿ€û7÷ÂóÃñ‹ñ"ó)öòùªý‘GÀ?2_ÿsÿYÔk›!h¤þÎ9I¿:f  ÑDÆ–ðËï ï g ! " ‹šŠé£ÿ´þøý[ýÔüaüüŸû!ûyú£ùµøÃ÷àööbõ¿ô'ô¯ócókóêóïô{özøÕúwý!œ¼mÎõ$ p ß y*×lÍÛŸYa7àV ¬‚ —øS ¹  q¨±Ž@Üý‰ûeùª÷_ö~õýô±ôyô'ô•óÈòÔñãðð’ïWï@ï8ïï®î î1íXì¸ëŽëÿë.íï™ñ‡ôw÷ú4üÀýõþ=ˆäôNMêþÛúóöçó<ò<òäóÝö{úçým¢‰ÿ¤ýÔüûüþ÷ÿù‡Å0ø(ìCåk { ã ®  ; ‹?‹` y Y š  Å èǬÌTWÿ¬þ(þ¡ýýaüÇûûjú£ùßøøl÷Äöö\õ›ôäóRóó"óÂóòôŸöºøû¯ýF­Ð‘| ì z +èÎÿµû¬ [bCòƒùT¯ ÿ W ¤ã ôÅþˆü\úMø”öCõhôòóÈóÂó¡óOó¸òóññCðï*ïéîÈî£îhîøíRí¤ìì×ë ìíÛîKñ5ô?÷úiü>þ¹ÿJžììE„w=Vü|ø~õÜóáó‰õ`øÇûòþ,µpÂþ?ý^üoü‚ý>ÿ!žcfâ4³§9`ÞKVÆ­EÒœîà b p Ä 5 Ë Àm.Báÿÿ›þLþäýJý™üÝû'û~úáùGù²øør÷ÄööIõ ô%ôòó'ôØôùõw÷8ù'û<ýTÿoX¥(± K ö ¬ežúî‘ö# âzè$-õ…ñL– Ê Ð ¾„%³-þ»ûùˆ÷ÿõäô"ô¦ó`óó¡òèñüðúïïqîîþíî îðí™ííˆì)ì7ìèìAî:ðªò_õøTú)üˆý¡þ«ÿÝEÀØ•øBý8ù¿õqó¸ò©óö|ùý$+ö»×ÁñÿÅÿToµ²(¦ Îê–Â5“…Öß uN³ŸÎÓ F ï Ë ÷×ñ~ÿ‡þøýžýBýÃü.üŒûéú@ú®ùùˆøÜ÷÷,ö2õ8ôcóËò“ò×ò¬óõöö-ùšûþšåØoÔ% ˜ / ð —RÛ' ßoÙ%Ù6:Ø-Sj›ë d ò qÕìÆWÃý'û²ø™öôôÙó(óÎòžòlò#ò°ñ ñdðÍïeïFïbïïÛïàï‰ïéîîUíðìíðíkïgñ·óöwø—úoüþhÿÁ.kÙ+sÿüµøüõhô;ôõð÷û`þÎyD–ÔVg0OLì8|öåib£»^rQš-@ãPD | Öov<IÿþUýýþüÚüƒü ü‰ûûúú·ùhùù¬øøi÷¶ö ö~õ8õTõüõ?÷ùQûÈýQª©7aR; I ‰ þ ˜@ÚU~/°ÿ)&öp—q †útü ” C çd¨²ƒ8ÿíüÐúù‘÷ƒöÁõ*õ£ôôZóòuñQð>ïUî²í[í?í3í#íâìoìÒë:ëìêëñëcíQï}ñÈóöOøhú[ü"þ«ÿùîd#-ÿ€ü|ùœönôióËó~õ9ømû‡þÿ}½dK6 vm!дÇÇÎܧ)\æñ†}‚9 A wã¿X þÑüüàûÏû¶ûuûûyúÍùùløÜ÷o÷÷³öBöÍõIõÕô‡ôvôÊô¢õ ÷ûøEûÔýmð*î6 ½ _ / S Ü Âàõ ‹º¯o u«±‚ŽÛ 4 F D)ýÆ•ÿiý\ûù ø×öéõ=õÂôbôô|óÃò×ñÌðÐïçîDîòíííî>î>îî…ííÌìíÖí5ïùðÔòô2ö½÷Oùñú¢ü;þ¦ÿ¨Äÿwý¿úÎ÷8õóõòÈóÄõ–øûfþs”ÒoÕ_g4›äÁúš8$~Vz§Š ì Í L “Ü[E–6ä3 ðóQ*ÔÿÎýƒü»ûQûûšúúkùÑøJøê÷¸÷œ÷“÷}÷E÷Òö:ö’õõ®ôÍôsõÁö¦ø ûÀýŒ3zߺ ; ˜ ý Ÿ œ õ ˜_vmîé„÷U›ÑóùØ›E Ø Q ½W¢¨ÿ–ýƒûùÌ÷Sö=õŠôôäó¯ófóõòUò‘ñ¾ð÷ïZïòîÖîòî"ïLïTï;ïï-ïïƒðßñkóòôNöˆ÷Åø*úÒû§ýÿ&UÎMÁ6þÿúœ÷£ô™òâñ§òÂôÀ÷ûþpë‚o°µG?es2Ž”g'VöÔ¬I Š k  tâƒ}À4ˆ‚öåj´öY ÿþJýªüöûûúäøÔ÷üö{öVöxö¾öàö»öVö¼õ õ|ô0ô`ô-õªöÖø—û¡þª`—<L   Ø × 0€.¬Øšüü°: ì31 ÓE à ] ºîôäþßüñú"ù‹÷:ö/õsôýó¯óqó+ó½ò.òuñ¨ðãïFïìîÍîéîï;ï8ï ïÙîÛîCï,ðƒñó¿ôHöÃ÷;ùÂúVüçý_ÿš\xÁÿ­ü·ùœöáó òlñ4òFô&÷WúaýØÿl)4ë¾îžÀ2 wŽu[€êú ý « ù Ò K Œ Å  ì½½wÔÉxõaÚyÿAþ ýüàúžùOø÷ÕõïôpôOôpô«ô¿ôôÜóóòòdñEñÝñ>óYõø7û‡þªešD‚ h $ Ú ° à 1Öh¾Æzêð×ÉkºÝòg Þ f èN„‹Wþ³ûùŽ÷ñõ©ôÂó.ó×ò§òòBò×ñ=ñŒðàïCïçîÍî÷îLï´ïð5ðQðpð¹ð=ñíñ½òŠónôpõ°ö.øäù¾û‚ýÿñÿLÿ“ý!ûRø—õcó+ò&òcó¨õ…øuûþHÉÆŽ†à­´ÓÞ­,r‹­ít% ä ‡ ã ú ¼ I º - ÀqwUèú•\¼ÿDþûüÒû±úù`ø.÷ö*õô%ôôô-ô"ôäófóÆò<òóñ+òó’ôÚö®ùÝüGqI ° ¸ “ fDQ}Æ8/æYŽ‘u4×T’A»X¢ á + [†¡¢’ÿzýrû‡ù×÷aö5õWô´óLó óâòËò§òfòùñoñãðmð'ð)ð_ðÄð:ñªñùñ4òzòåòŠóbô8õö¾ö–÷½øLúüþÂÿëEšçþdünùmöáóòdñâñtóÁõOø«ú†üºý]þ›þ¦þËþ8ÿK™Å¦*hŒ¼$àö> p N ³ « N Ç A Í • ’ º Í   û€·ËÝÿ–ý[üQûWúOù6ø÷æõÞôô¯ó²óõóRô~ôeôïóDó–ò.òJò.óæôr÷ú þ”Ð™Í u ª ™ c3!?fvb!¨ù ,ö­'FV{§ ì L ¸]iCþÉû¬ù½÷!öáôúófó óÔòªòwò.òÌñSñÒðTðàïï ïæïdðñ×ñ“ò9óÐóbô õÏõ¨öz÷9øøøäù)ûâüêþ÷µÀÅ™@ýsùöcóÑñŽñ“òô+÷±ù¶ûþü‚ý}ýBýý6ýäýÿ¾oäéŒÒ÷$ŒBU˜ Ê « ! , Ø _ Ð b 2 0 C 8 Ó ¾)Wr—ïþý}ü‘û¹úÐùßø×÷ÏöÛõõŠôFô0ôôïó•óó[òÃñlñ¥ñzòô:öçøÕûÅþr²èD { Ò J Ü{ t£Œ7¶i¢ÃÆ}ààÜ]§ ù F |ƒRó‡ÿ ýàúÓø÷«õ›ôÖóOóçòŽò4òÔñƒñ1ñàð”ðNððæïØïïï)ððÝðKñÉñXòóÀóvôõ¶õaö[÷Îø¶úóü0ÿî 9þûÜ÷ õólòþòÂôJ÷úÀüÍþ””jY¢jž FraéŒ…È ‰  m Ë R  - y Å È Z i \¾¬þ–ýµüôû$û-úùß÷ªöŒõÂôRôAôWôbô5ôÂóóSòÁñŸñòLóFõÌ÷³ú²ý‘-Ò4y Õ V ø ›:¯ûØmÕ#g¤ÏÚ¢,ÞD{Ñ  b “¨’[ ²ýdûOù‘÷7öCõ›ô;ôôäó´óyó9óóÑòŽòBòóñ°ñŽñ¥ñðñoò ó¯óIôÇôõTõ{õ”õ¥õØõEö1÷½øÐúýIÿë¥E·ÿ9ý'ú÷Šôíò}ò9óïô:÷žù¢ûùü¤ýÔýÈýÑýþËþìÿP»á© -8eÊ€ƒ²Ð     Ð „ W L k ¨ Þ á y › R»9xÞÿqþ&ýôû¿úùfø<÷&ö*õhôòóÎóäóôõó›óøò1ò}ññBñ.òÞóKö-ùKübÿ<´­<‡ ¹ ù P Å=ªþ-5 ¹B°ö û°1jTòSŒÅ j Ð (YbB¸ýƒûùÆ÷göWõôøó‚ó(óËòwò òßñ‘ñ7ñÄð,ðïïÖîìîZïðëðëñíòÖó•ô!õ~õÁõö³öâ÷¿ùKü'ÿÔÑ«&ÿŒû øeõÂónóIôönøÇú²üþ¦þÍþ´þ›þ·þ-ÿ#þ–õA˜Ç¨­²Š  C 8 Ó º Í O ‰ " R ¨A€Õÿ6þÃü{ûNúGùcø¤÷ÿögöÝõsõõÞôŒô0ô¦óó“òXò}ò+óeô,öiøìú“ý/–·~ûR Œ Ï  X¹Ä¯>ÛeÒ=5ÿ•õ ÉTÐ? á öé¦KÓþYüúð÷7öæôòóLóÜò“òGòþñ»ñlññÇðbðìïmïòî©î›îÞîhïCðVñ‚ò·óÂô”õöEöHöKöªö¸÷ùüÓþSóM) ÿ1üˆøbõRó¯ò…óõ3øüú^ýòþ ÿ•ÿ5ÿìþÿ¨ÿÚovKœu,ñ~[´ ¨ ' * Ê 8 •  ÑÔø äD1¿Uìþwý)üüúçùäøþ÷)÷oö¹õ-õÇôô¦ôÂôáôÓô©ôeô*ô"ôvôIõ°ö“øãúzý¡äÒnÐ 4 M [FÍgñlâUËA£õ¬ ㆜  h ~Aànÿý¶ú¦øÚöWõô.ó…òò×ñ¾ñµñÉñëñ òòÏñañÏð8ðÊïïÞï{ðˆñâòLô”õ‹ö ÷÷¨öö¹õàõÝöºøQû3þÁa§aÈþbûß÷õRóóôYö0ùütþÝüعý5‰†7ñîH%Z _ K ' ¼ 2 º t h ’ ¿ º I Rë/Jr¹ÿAþþüñûîúòùøøø÷7ösõÂô8ôÙó˜óXóóžò+òÁñ†ñ¥ñBòóTõ»÷‡úýsA¶Ô ^ § ìQX?þ•sÇ @YHŒÓêÚ¥Y‹  A Mž]þÉûcù:÷mõòóÔòùñKñÄðYð ðéïìï'ð~ðãð&ñEñ:ñ!ñ)ñjñóñßòôõöö1øïøù¯øè÷÷°öñöøúÉüÿè ¡®‚ýÂù/öqó ò+ò©ó!öòøŒû‹ý¿þ0ÿ"ÿøþ ÿ ÿÁ7Åúgo::ǾøC \ ! o a  ” 5 ÿ ô  ñ ˜ Ð ™ÿ!(4bÿÃý^üûéùÎøÆ÷×öö2õnôÅóJóûòÙòºòˆòBòåñ”ñjñ¥ñcòÀó«õøîúíýæ¯)J$ Ï o ûvÚø´N¹ Y”Ìñô¾C‡`š-À ^ ú q ÆÒ¦\øþœübúiø³öFõô0ó‚òüñ™ñ^ñKñlñ³ñòMòlò[òòÝñ­ñµñòžòó´ôëõóö‘÷¤÷:÷€öØõ¨õ=ö½÷úµü;ÿüx~(þãúi÷kô…òò ó\õMøHû¸ýLÿìÿÛÿkÿÿ3ÿìÿ:ß„ÇoŽK÷Çî~z©Ð Ä _ ‰ s :  é ÷  F 2 ¼ Í qÁÞíhÿþý»ü‘û_ú%ùö÷àöéõõ`ôÓónó0óóÑòŽòMò ò òlòóTôö3øú+ýÅÿM®×Î V ’ñ åtÖ"h·vÒÿý¶*ZOÕG Ç _ ÃèÊwýÿ}ýûÜøèö5õËó¡ò¢ñÕð,ðÂï‡ïïÐïCð¾ð1ñxñ‘ñ‹ñzñŽñíñµòÖóIõîö…øÈùúúú8ùøGøÙøFúdüºþÁןéÿóüOù®õËò1ññcò©ôX÷ìùæûýˆý…ýiý“ý3þeÿÿµFjNQV”1+k ± Ç } × Ñ ™ N    1 , Ò  ä [Œ•™¼ ÿ…ýü{úáøE÷Êõ~ôyó²ò+òÚñµñµñ»ñ°ñ‘ñlñYñrñèñÙòLôEö¬øbûAþË2D š & ºQÚ<c@Ê@Tm”¹Ì­Y¶Ê˜.¨ž ) ± % gp(ðý:û½ø†ö®ô9óò4ñƒðïïsï ïÐîÈîïï$ðÄðMñ­ñÝñùñ#òòXó‡ôöÃ÷cù—ú'ûîúú ù9øøïø£úèü;ÿÿªéÅþ¨û+øõåò+òõò÷ô§÷_úˆüÔý9þõý}ý6ý…ý‡þC[n ÿM³rƒ%k ¨ ù ù  ¦ e e   æ ÿ ¶  ÔV ÓŒ3ÿþýÃürûú…ø÷Äõ©ôÎó0óÈòœòwò[òò¸ñ?ñØð­ðëðµñ óõƒ÷LúGýH+Á  Ø ‹ ”å ûºNÂuÒ)xœ†4†‰IÔ@›õ Y  " g~R÷kþÚûZù÷5õ£ólò†ñÊð=ð¿ïWïï ï2ï‰ïïïNð—ð»ðÒðëð1ñÏñÑòOô)ö(øõùNûëû»ûúúúcùWùú—û‹ý„ÿ÷g„þ¢ûøãõ>ôïóúô÷ù³û4ýÃýýÚü üÒû:üwýTÿ{|ôÏ ì¿Ïj™>  œ º GGß 7 †  Ê Ø ü  « æ ž èéȸáÿRþùü°û_úþøŽ÷&öÍô“ó‹òÌñPññññ&ñ!ñ ñÿð#ñ¥ñªòWôŸöeù€ü¼ÿåÄDe ) º 5šñ%-ý‰Õ騼«®¼Â£L©µz |å K ¹ % ‹Ûøî£ÿGýîúÅøùö„õpô¦óóªò4òÁñSñöðÁðÄðÿðañÝñ^ò×òAó¡óô¼ô«õóöøúpûEüSü­û•úùËøÑøžùûÀüGþÿÐþ[ýàúå÷õÜòåñPò ô‘öRù¥û&ý¡ý^ýªü üëû†üêýáÿÜ$ÄéÁ±ü×< Ê B +i"o œ à m T Œ Ç Ò j  7×Êÿ¯ý™ü­û¼ú·ù˜ø[÷öäôÐó óòfòiò‚òœòœòˆòiò}òðòçó{õ§÷Lú.ý!êel „ à J Ðbî` 52÷úé®@Šd «Rð ‰ ø 1)ÜS©þüû|ù1÷8õ˜óMòKñƒðÍï'ïî î·í™íÈí6îÞîšïHðÚð\ñâñò‡óÞô‘ö|øhúôûåüý§üÝû5ûüú€ûÌüžþ†ˆÆ¼ÿÏü‡ù™ö ôôÓôÌönùüþÿÿkþtý¸ü”ü<ý¬þ†^Î’©Zíº»·± B 4 z & x ¨ ÿ ¶ Ø C ­ Ò s v íÚv ØÿþÀüÉûôú*ú;ùøÏöpõ*ôó<ò¾ñƒñ}ñˆñŽñˆñrñxñÆñ…òÓó¹õ.øûLþ€v + é l å eôˆ \\ÿM[7ÿÌ”HÒ"ÔN ê V æ ’ <¸ôÙg½ýúúXøöô™ò‹ñÚðjððÕï~ïïÛî½îÞî@ïÒï‰ðEñâñaòÈò3óÖóÕô@ö øúÉûý¤ýPýaü@ûhú5úÛú4üøý£ÿ³¶yÿ(ý-ú#÷±ôUóUó«ôñö˜ùü¯ývþ`þÑý&ýÚü6ýLþî¯ï—³x2/¶ÕwQ  [ <Ù & a Ä u { ° Ä ~ ´ ` }CÔxhþ¾ü~û{úžùºøÆ÷¸ö”õbôJólòÉñzñ^ñoñ™ñÏñò.òoòêòÖóWõi÷ýùëüñÿÑ\r ‡ Ä  qý—kkQN)ô¿‰>Ó0GÇRÜ u ! Ë [¸Ê–‚ý÷ú¬ø¶ö$õêóóò#ògñ«ðúïWïÙî î®îï’ï:ðÚðSñ¥ñÑñüñEòêòôÏõå÷úülýçý›ý×üüû~ûûuüßýÿñ¢KÓÿqý£ú ø&öYõÄõ?÷`ùŽûUý]þþþ^ý­üzüíüþ¦ÿV½¯ ÙÈÓ¸n á è d l  ³ T 2 T š Ï Á F I ÅÒ’J,Rþ×üŸûŒúùnøH÷öÞôÂóßò<òÚñÉñÑñöñò#ò&ò+òiòóòô¥õå÷Œú}ý~A¥œ0 Œ Ø 4 ¬5Æ9qTÞ$!Ðh´Ã‹)¦† ý n ÆìÈV¬þëûAùÔöÂôóÃñÌðð‡ïï’î%îÈí›í§íþí›î_ï/ðöð¢ñ<òÜò›óôöÔ÷ÛùÚûlýOþhþêý1ý”ürüðüþýpÿãâ ,Cÿµüýù­÷,öÊõ—öAø_úaüßý›þ¦þ3þ¡ýXý¡ý¦þ5 ½ú®Þ¿p¿‘Ô` á  Ú  î z ô ‰ T Q Q ! • ž 1aL %þ™üYûIúLùJø7÷öòôÙóßòò}ñ/ññ7ñzñÏñ ò…òûò¦ó¦ô!öøŒúUýF0Û. ¼ + ‡æ\ÔAyjÿ7ÄYé{‡çÁL¯ ù F –à½þaüõù­÷—õËóSò1ñVð´ï>ïéî©îqîUîWîyîÓîIïÊïHð¹ð!ñˆñòðò-ôàõí÷!úü‹ýAþ6þ§ýùüŽüœü4ýLþšÿ®7ã¦ÿ§ýEûùP÷†öÉöû÷¼ùŸû.ýþ`þþˆý ýþü›ýÓþu#– !æ±Ä9   j S î d ñ ± ¨ Ä Í ˜  òƒ¹º»éÿZþýüûúùÌ÷€ö-õçóÔòðñVññôðñPñ§ñ ò‚ò%óô\õ ÷`ùöû½þ€mO ö w ïhë`®¹rÌÉŒ$«@È>ˆ¡‹Nï‚  ‡  rÄòïÿËý¥û‡ù‹÷³õô§òuñrð«ïï‚î"îííêí îZîËî]ïúïŸðBñåñ“òwó«ô=ö%ø>ú?üßýÖþÿžþõýiýBý¬ý“þÂÿîµ¾Ø ÿ¤üúó÷‰ö)öÝöXø@úüXýßý¯ý ýBüÁûÉû‹üíýÿKœ`¦›Š ¨‚Z Ú × E . É S ñ Õ î   ¹ ì › âÕ›uÿäýƒüdû_úZù?ø÷¼õkô0ó#òYñÒð‰ðdð\ðYðjðšð ñÑñ ó´ôÚökù=ü%ÿëh‘i Œ  ´h½'5î?,×bãeá9^M £+§ * º PÕ;`Pÿ”üú²÷sõ…óëñ¥ð¨ïÞî9îžíí“ì.ìöë ìoì íÜíÈîÂï¾ðÃñÜòô³õœ÷Óùüþ’ÿN: ÿÈþ(þþvþyÿÇóœaõþBü›ùo÷/öö÷ºøÄú¤üþ¡þþþ…ý4ýlý>þ•ÿ&¡Ån©¦˜ÂLV¾U Ç î ” à ” & ³ Y 5 = @  „ ‡ @åÍÿøýzü@û5ú>ù<ø#÷îõ•ôLó(òMñÇð‰ð†ð³ðîð1ñ€ñëñ‚òfó¹ô}ö¬ø$ûËýx\oL à ‡_.ò‰Ò¾<[1â}†àÎQ®a Ê G Ã5vt/ªý ûtøöúó?òÝðÍïõî>î¡íí…ììÉëŸë³ë ì“ìRí6î5ïCðlñ½òLô)öAø{ú™üUþkÿÐÿ•ÿ ÿ‡þUþ¬þÿ®ÚµÑ eþ³û˜ù<øÜ÷‚øéù»ûzý½þIÿ'ÿ|þ¯ý ýëü}ý·þKî3ø;Ó©á›Õi Q ! m @  - © q „ Í  ' Å ðŸ÷<sïþ¯ý”ü†ûhú-ùÜ÷xöõËóµòåñaññùðîðöðñ1ñ†ñ.òGóáôñöZùüºþV·Ò­]  Ñ ¦šˆOØî‘ÆŸBÌNÞbÓ%ö„á : ` ŽÄõ$þöûéùð÷ö|ôóëñÿðFð¶ïIïõî´î‡îtîyî›îäîCï¿ïTðÿðÔñÜò"ô¹õ¤÷Óù ü þ„ÿN_ôÿOÿÖþÂþ0ÿ#Ž7ùøþ¤üeúµøÜ÷ø÷òø{ú4ü¤ý“þÖþ„þßý4ýÝüýðýIÿÚJ[ç õç*ØŸ] ì  ¾ Ú ‹ ~  ñ  $   ò ¬ûFÿÙýªüû‰ú]ù ø‘öõ“óUòoñèð¶ðÄðÿð?ñzñµñþñzòLóŒôEötøñú¬ýms“q $ à `¨6’¨b¾Á‘=ÛmòW˜Ÿo‡ß : ˜ þd¿óüÐþˆü;ú øö~ô9ó1òlñÁð!ð‡ïáî>î²íPí+íUíÀí`îïñï»ð”ñoòkó ô,ö ø0úaüJþ«ÿbj|ÿ0ÿIÿìÿë å"‚üÖþgü8úµøø…ø¼ùbûùü-þ´þ‡þßýûü1ü×ûü ýfþïÿPMâ<nûïYÅ 5 ! } j ÿ u   ¼ á ô Ð F L Ü(.N½þfýKü=ûúòø­÷Söõìóó‚ò6òòòòò#ò9ò‹ò6óLôàõÑ÷úˆüÿd–•a Ò ‹ Dý— 6 „«šm;ÅsOf=éy ‰  Qt\ÿ»ü_úøö8ô¡òVñFðsïËî>îÀíXííßìèì%í›íUî>ïFðVñoòžó÷ô†ö[øhúƒühþáÿ°ÏgÂÿ3ÿÿkÿQ€ªiRSjþýxûcù ø»÷]ø¿ù€û(ýZþáþÂþ%þUý°üzüßüÑýÿuœ[»×Ü Ûoò* ï 2  ® ; Û ± ½ Þ ú Ð O fWw”ÕÿXþýüûûúùáø¯÷oö=õ5ôwóóÃò¯ò¤ò–ò…òiòlò§ò9óOôÕõÔ÷ú§ü"ÿ†¯7Èe  Ô  \í>2Äú÷ʉ;ÐA…‹VäG¥  k âQ«çùêþ»ü’úzø™öéôóJòHñmð´ï ïvîòí‹íPíRí“íîÛîÊïÒðèñûòô=õœö6øú ü þÂÿô€gà:Çÿ¿ÿ=&MD´]¸ýpû›ù˜øˆøOù¼ú^üßýáþAÿýþXþ–ýýëü^ýRþŠÿ¶¢7…²çR;ª+v k Þ ã •  £ Z W Ó ò ½  ör˜¡Ç"ÿ½ýœü‘û‰úhù ø¸ö=õêóÔò(òÆñ¸ñÏñþñ.ò^òžòþòžóôÿõÀ÷Óùüfþ¨ÎÊšDç E òA6Ó*;2 Û’%w…Qæ]à *   (¸8¦åûýëûïù ø_ö÷ôÙóçò+ò}ñÚð:ð£ïï£î`îeî®î5ïæï¶ð‘ñlòOóLôvõÝöøú}üUþ´ÿg\¹ÿËþþý¯ýóýäþ=­²ö9>þÉû ù6øÑ÷føÈùû^ý´þkÿnÿøþDþ¡ý^ý¡ýhþ’ÿÕî½0k›õ’ÚM© « : N  ò | G W Š ½ ¬ D n,ÀÝqþ ýÌû•úRùö÷‹öõÙóÈòòµñ°ñÚñ òcòžòÔòóóRô{õ÷(ù~ûóý_žYÚ9 ˜  § DÒ7X-±áçÅ›h©#¼Rå s ©:¼95þôûòù#ø†ö$õøóþò#òañ¢ðñïCï¬î>îî>î½î~ïpðƒñò•óôõÆö6øïùæûçý®ÿñ{=u~ÿ·þnþËþ¿ÿwkвæ‡þüýùºøzø6ù«ú^üðýõþ>ÿÙþûýóü,üãûHüJý£þ7þd“Ã(ø*ª6 v Þ Ê O © q¤ò6 ; ßÉ2cŽÞÿcþ ýüûúùçø»÷†ögõsôÎókóLóUóqó“ó·óçóAôÞôÏõ#÷ÎøÄúåüÿ!øé1Z ¦  – _r4§××À§}Pùu¿Å˜B Ï T âaàF‹®©þ”üú˜øîöõpô˜óóòfòâñPñ¶ð!ð¦ïbï]ï®ïKð&ñ&ò0ó;ô8õ7öP÷ø ú»û–ýZÿÄ‘™îØÿ¬þÔý‹ýûýÿmÆ“œïÿÖýÚûjúÐùú:ûÉüfþ£ÿ8]ÿOþBýŽügüÚüÈýïþæd¢Áðd0I—ãö©íÈ^Úg#.i»óë…Áš8»Põþþ6ýYü_ûIúùß÷³ö¿õ õ ôvôyô•ô·ôéô'õ—õEöB÷¦øQú:üAþF+ÖFrww‚ ® ö E Ц„_jS$ë¢=®ìó Á m ú ‹#Õ9×W´þþüCû•ùø¾ö¢õ¿ôôóþò}òüñuñÿð­ðŒð°ð!ñÔñÀòÅóÊô¿õ”öX÷(ø%ùWúÇûPý¿þÍÿHOÿ6þ ýuüaüýGþÇÿ,þ2¼ÿþzü€ûTûü[ýÿš¸)Ý ÿ“þ•þ0ÿ,HEø[¦ÙI!JP 0 ç9?C\Ê|he>ËâŒ"ÿ½ýƒü€û¶úú„ùêøMøŸ÷èöKöÒõ¥õ°õö{ö÷µ÷Xøøø¦ùjú_û€üêýsÿ œ@E#å¯ „ – … D´Ù²X× M Æ H Ä 8 ‡ © ¤o)Ø“dNQ]ÿcþUý7üûÐù¤ø–÷»öö õYõ2õõ÷ôÊô˜ôhôIôWô˜ôõÁõ™ö€÷`ø%ùÍùeúüú¨ûoüRý0þõþvÿŠÿ'ÿ]þfý†üüûöû}üˆýÍþÿd,˜ÿ¿þ6þ+þžþŒÿ«¾óíž4àÉz%ËO¦Â±´ìTàrñ,†ÁÐÎíB×—a#Ä/nÿþ}ý}ü¢ûîújúú¼ùkù ùžø9øè÷½÷Ñ÷(ø¯ø`ù$úìú«ûaüýÀý„þZÿHKPDÞxüoã^ë…%  ; Ç Â ’ A Ù n øzíSœÏæøþ 'ZÿþËýý1ügû úïùOùÑølø%øö÷Î÷¯÷‘÷t÷f÷i÷‹÷É÷9øÑø„ùIúû°û4üªüýýõý|þÿ’ÿúÿ÷ÿ~ÿÍþþMýÌü‹üªüýªýXþõþkÿ£ÿ«ÿŒÿ_ÿ>ÿ8ÿ_ÿ¼ÿ,ÿHƒ¸óE»Mí’*•Ø,Ku¥ÏàÁ{p«ßo×VãgãÿQÿ¦þðý.ýwü×ûNûàúú*úÙùŠùAùùûøùcùÙùpúûÌû}ü(ýÈý]þçþsÿšEü¸‚Fý /Ÿaµû<n–¯¡c+è“:¾7—Þ (?Ps ÿçþ>þ¯ý(ý°ü:ü»û@ûÄúWúòùžùcù>ù(ùùùùùAùùÞùQúÛúdûæûSü­üöü?ý“ýõýfþÙþIÿŒÿ®ÿÿÿvþµýöüSüñûîûHüðüÎýÂþ ÿN³Ï¾”pj—î^ÔG¤â?yÅ„ä-\jT$ä¦v’¿ïúä’[‹µé=®ÿLÿÿÙþ¬þvþ(þÀýJýÀü:ü¥ûû ú2úÞù®ù¦ùÓù$ú®úQûüÃüqýþvþËþ ÿCÿÿÍÿCØ—a6ýºWàN­ù<r™­ª™lEà­{7àeÂêêÔ¹´ÿËþþ}ýý¸ürü.üÝû†ûû¨ú8úÊùqù%ùõøßøçø ùAùžùú„úû¥û,üœüûüDýýÜý>þ½þFÿØÿ_¾é¾@|ÿ‚þ“ýÏüdüuüíü½ý±þ˜ÿK°¹x •ÿCÿ3ÿhÿÛÿmÿ€Ý7X™…´;—ÍÒÁ¥ ±à!YuQæ=``f‹ÚTìÿšÿTÿøþ‚þíýGý–üîûKû¹ú0úºùIùøøºø¯øÀøù©ùhúKû,üþüºý]þÓþ3ÿ‡ÿÞÿ@¹PÉ“LôpÕ!dšÉóùǃ2ãš\-ô´F½<SsšÿÙþ;þµýGýÝüzüü¾ûgûû¶úmú5úúÖù·ù•ùùù‡ù£ùÛù8ú³ú7û»û4ü†ü¾üßüýDý§ý0þÞþ’ÿ'us0ÿ(þýKüæû üªü¬ýÖþôÿÚ\o4Òm,/{¥B½Rº>È;vs5Ðn%I b~QØ+.B†®ÿÿsÿ_ÿFÿÿ±þ9þ²ý(ýŸüü¥û2û¿úbúúõùýùFú¶úVûüÝü“ý3þ¦þÿ8ÿvÿ¹ÿjë}§(–øL›é=•à$Q_aK5' î¼hæ>k…—®Þÿ3ÿžþ"þªý.ýœüöûHû•úõùeùíøŠøOø(øøø#ø?øzøÑøLùäùú5ûÏûMü°ü ýtýþ·þšÿŒr G@'òþçý?ýý™ýŠþ¿ÿü™µiĆ@T®/§+)üÒ¾Ô&¡6º"TR*êº¦È `©Í·]Ë<uÌQáÿÊÿ±ÿ„ÿ;ÿÙþ]þÔýXýèü‹üHü ü×û­ûƒûbû_ûƒûÕûVüùüµýqþÿ´ÿ/†ÒS¢oðqíR Þ@e†šŒj@ИhA"õÀfêM™ÊQÿºþJþóýªýwý<ýöü¢üEüèû‘ûHûûìúÕúÍúÇúÒúãúüú/û{û×ûMüÑüRýÃýþZþŠþ·þýþpÿ &j@¢ÿ9þÚü³ûûÿú‘û–üäý-ÿ5Êæ¨5ÇÿŒÿ ÿ ¹ƒ4­âÙªtd‹íy¦-á•W>Z«x¼Á„ì#=~ñÿ•ÿWÿ5ÿÿìþ´þ`þðýwýùüƒüüÄûrû/ûüúØúæúûpûöû¤üPýþ˜þÿhÿ±ÿ÷ÿH¨!°J犇Ø-Lv«Þ ,@7î¶~N!é©IÎ.w°î=®ÿ;ÿÙþ‡þ0þÎýMýÀü#ü‰ûôúyúúÙù©ù‡ùqùZùLùIù`ùŠùÊù-ú£ú)û³ûürü»ü#ý¯ýþŠÿ³Ô²%ó&Ýeÿþ.ýùüqýtþÅÿ4×öªué€l™w¥H#u¤+w‚Oøœd^“Š Zk6´4rÊNôÿ¿ÿÿ~ÿTÿÿÙþ‚þ3þçýžý^ý ý²üHüÒûmû$ûûCû¶û^ü1ýþõþ¿ÿeÌ /\‹Ô?²3¯|Åý'LhvpW'Ûv¯`ê˧t)µe®ÿýþkþøý¬ýzýMý ýëü¢üKüñû”ûHûÿúÐú³ú£ú’úúyúyúúšúÇúûmûèûdüÉüý<ýJý^ý›ýþËþ«ÿ@†@j"ÿ¤ýKüTûüúQû4ücý©þ±ÿ\Yéÿhÿÿ"ÿ˜ÿ_N1ß?R?`ç|e†p/æ± ¿ hÁìÞ„Øýþöÿ2‡ÿ ÿ©þZþ þµý^ýý²üiü,üùûÉû—ûbû$ûñúÕúÕúûrûüèüÖýÅþ«ÿs™l×GÂ6£N†¥«¥¨£¥¨ ŒWÂhÑ“nD ç“ †Ï]ÿ½þ6þÈýaýóü}üÿû†ûû®úTúúÖù±ù˜ù‡ùvùqùqù„ù±ùòùZúàú†û1üÌüMý§ýâýþcþáþ˜ÿsSMH„þ ýîûbûxû,ü9ý`þTÿìÿ¼ÿ*ÿ“þ"þþhþÿñÿÄg»»‹S/K¥7â‚D;õ“A J¡ø>L½%€ÚEÊgÓÿÿ-ÿÐþkþþ¬ý^ýýÌüˆü1üÁû:û«ú'úÅù£ùÅù2úàú¹û¢üwý9þÈþ;ÿ˜ÿsªi(Ó`¿ò@p¿CS@¶m$ïÂv8ÙA€¢¼ìÿ8ÿ¯þJþûýºýoýýµü=üÁûTûûÍú¶ú±ú«ú«ú«ú±úÄúéú)ûšû#üÌü‹ý9þÈþ-ÿhÿ’ÿ¹ÿs ­9r<ŽmÿËýÌüHüYüèüÑýÖþ¼ÿNTïÿvÿ*ÿ%ÿnÿ¼xftE󪆗ÝXðyÓõÙº²ËW·ïÖqá.o³8úÿÊÿ’ÿCÿÈþ>þ¤ýýwüü»û‰ûYû)ûìúšúNúúúNúÄú~ûaüUýGþÿÇÿYÒNÒi ¬OÞC†’v= Ø¿·¼¿¦|8ä…"Ë€1å†~ÅÿÿAþžýý»ü”üˆü†ü‹ü€üdü4üîû¢ûbû'ûûôúúú û/ûEû_û†û»ûüoüßü^ýÖýLþ·þÿ‡ÿš=àd¡}ðÐÿ|þJýgüÿûü°üýþnÿ_mK æÿïÿ2—{ÁèâÁ™‹µž<ÑL ÍȺ¦ ·á!\„‰Zô]©ûX×oÕŒ=áÿsÿòþnþäýoýûü™üEüëûŒû'ûÒú¥ú®úìúmûüÚü¬ývþ0ÿÕÿWÇxî}(ä@¹úæ®p@-IZL'ì£T¦.¡ö/\ŒÿÂþþ§ýGýûü¸ü}ü?üüÄû†ûHûûÞú«úú\úCú-ú-ú5úZú’úìú_û×û^ü×üJý¬ýþyþòþ~ÿ³/†‘:Œ˜ÿþýÆüKü,ü^üÚütýþ“þÿFÿkÿŠÿ®ÿãÿ$uÁ @Y\H72N†Ò4ªw·äý(Ak®·«y%© aµƒ ¨ÿQÿÿ·þ]þøýý#ýÀügüüÝûšû_ûûØú¨úšú®úüú{û&üûüÑý´þ‡ÿ@éx (ËhúvÇÿãÊÁ¹¶³¥N«Dê–0ËB¥ÿHŒÿÖþ6þ²ýXýýÝüªüƒüSü1üüüüüÿûñûÝûÉû­û”ûŒûŒû¥ûÚû?ü»üGýßýcþáþLÿ±ÿmÏ&j—‹NÚ2nÿ£þðýfýýùüýPý›ýíý-þ]þ‚þ¯þäþ-ÿÿãÿ:ŒÚ4:)K”å?“Ü"nºý>kŠy;ÙR¸ YÁ=Õÿÿ3ÿçþžþGþêýˆýýªüKüôû¨ûmû2ûûàúÇú³ú¹úÛúûŒûüÃütý"þÈþWÿÓÿ@¥ƒzå?ˆ´Î˺´ÀáFvº¼±Z*ç“3À9¢ñ:‡ÿçþfþ þËýµý›ý‹ýwý[ýBý#ýýßüÆü¤ü€üPü.üüü&üEü}üÀüýýøýkþËþÿbÿÿÕÿ=eumFÿÿ„þêýqýýöüýJý²ý-þ½þOÿÞÿ_¾,PrœÉö7Ur™Æð0|Ö-v©¼Â·’‡„nAíwâ.u¼sÿïþyþ þ¤ýDýåü‘üKüüèûÉû»û³û«ûûŽûxûgûbû~ûÉû:üÚü“ýfþ5ÿìÿƒ÷PœðMªk¯ÖÖ´Dðçø%U|ˆ]­.°2¶@ÊÿTÿÜþRþÎýDýÑüuü=ü üü#ü?ü[üuüƒü†ü†ü}ü}ü}üƒüœüÑü ýPýýÃýþAþ•þÿÿúÿ_®ÝãÚÄ xN$ãÿŒÿÿhþºýý™ügüzüÚüqýþÜþ„ÿWgYNbôgÝJ“µÃÉÜ G©›ú8I=Ö vT;õÀkûlÒ&ƒ÷ÿŠÿ0ÿòþ·þ‚þRþþâý¬ýýfýJý4ý ýþüÏü¤üˆüˆüµü ýý>þÿãÿ°\Ú.dŽÉX›í6hvhLûäÖÜáíäÀ3ÑfþŸHë‘,·ÿ-ÿ•þûýoýûü­üŽü‹üŸüÉüûüý+ý(ýýýèü×üÆüÃü»ü¾üÚüëüýUý§ý þþúþpÿ¿ÿÞÿÐÿÿ8ÿÜþ›þvþtþ‚þ˜þ•þqþþ‚ýßüVüùûÝûüŸü[ý0þúþÿ*ôÿÓÿÊÿìÿ/Ø#Vglo}™ÝJÑ[äL©£nWOII3 ÂR½{ôÂÿpÿ"ÿºþAþ¸ý1ý¸ü^üüîûÚûÚûÝûÝûÏûÇûàû ü‹üýÃý„þCÿìÿxéB—å?­%›ý;OAÈfk“ÅøûÈy ΀4è—:Ò\ÓÿAÿ½þRþþýÃý¯ý²ý½ýÆýÃý¯ý‚ý^ý.ýýùüùüöüýý4ýRýoýžýäýDþ¿þQÿìÿe¾Ïš5¹ÿOÿÿÿ;ÿ•ÿïÿ´ÿÿUþ›ýýâüý“ýGþÿ®ÿ!WN$æÿ±ÿ®ÿÛÿ*ƒÝ=K@=P†àUÙA‚t3ê§d7óÔ³u«2´ÿAÿáþžþtþcþUþJþ0þ þÖý¯ý™ý–ý§ý½ýËýÔýÎýÆýÆýßýþfþÞþ_ÿáÿW¥ÝüùéÇÁÒü/KP7Ï”b:2@eŒ¥¢†N´ÿvÿLÿ0ÿ%ÿ8ÿQÿ_ÿTÿ-ÿçþ¡þcþ9þ6þ]þ¡þÿ]ÿ±ÿñÿ,÷ÿÐÿ®ÿšÿŠÿ’ÿ¨ÿÊÿãÿéÿìÿôÿ8b{g¦ÿÿŠþ(þþþfþºþÿ"ÿ ÿ´þAþÆýcý#ý&ýiýóý¡þbÿ ‘Ý÷éÄ««Ìÿ&B=2üîôE{»â密:üϼ¹¼ÇÏÄšg2ãÿÕÿÅÿ±ÿ˜ÿ~ÿZÿ3ÿÿøþøþÿÿ0ÿ>ÿ3ÿÿÞþ›þZþ(þþþXþ±þ ÿeÿ£ÿÐÿãÿïÿéÿéÿáÿñÿ ØÿÿeÿCÿ;ÿAÿkÿ¨ÿïÿ2s ®¥‰gC!úÿñÿïÿúÿúÿéÿÅÿ¦ÿŠÿÿ„ÿ ÿÇÿôÿ8F@8éÿ¹ÿÿ]ÿ8ÿÿÿýþýþúþÿÿ-ÿIÿeÿvÿvÿnÿCÿÿÅþ‡þcþUþ`þvþ¡þ½þÂþ´þ˜þqþRþ-þ"þ"þAþnþ±þõþ>ÿ‡ÿÇÿ:j”¹ÚééàÚÒØîS‹»àóåɉEü¥_*úÿìÿÕÿ´ÿ’ÿeÿ;ÿÿøþÜþ¿þ©þþtþRþGþRþnþ•þÖþ-ÿÿÅÿÞÿÊÿ˜ÿOÿúþ´þ‡þ‡þ¯þúþeÿÓÿ,Áô2PagYH/éÊ«‘†ƒ‰”š”x8ÂÿŒÿ]ÿAÿ;ÿLÿbÿ„ÿ•ÿÿ˜ÿ|ÿTÿ-ÿ ÿýþúþÿ>ÿyÿÅÿp¾P†™‹\#à g:*/Ks‘¥¢~CïÿšÿLÿÿÐþ´þ¿þÖþáþáþËþ£þþUþ0þþþ0þfþ´þÿvÿÕÿ2pš¹ÊØÕàÌÌÌÒÕÚÌÕÊÌÄÇÇÄÁ¹«‰xjT5ïÿÐÿÂÿ·ÿ·ÿ®ÿ£ÿÿ~ÿhÿLÿ'ÿÿúþýþÿ0ÿOÿeÿkÿZÿ5ÿÿÐþžþhþOþLþcþŠþºþáþúþÿÿ ÿ"ÿLÿ‡ÿÓÿTxŒ‘ƒbH/!!'=Ts‘®¾ÇÏÝù#,7#ྡྷeK@@FHTH* ïÿÕÿÂÿ¦ÿ„ÿ]ÿ5ÿÿøþçþìþúþÿ5ÿ_ÿvÿyÿnÿ]ÿQÿOÿhÿŠÿ±ÿÕÿôÿ ýÿÞÿ´ÿyÿAÿÿ ÿÿÿ0ÿTÿ~ÿ±ÿØÿúÿ5KWbb\H858@Tj®ÁÁ¾³«¨ƒ{umbK8ïÿÐÿ´ÿ˜ÿÿhÿCÿ%ÿÿýþÿÿ"ÿ;ÿTÿvÿŠÿÿÿ|ÿkÿLÿFÿCÿQÿkÿŒÿ®ÿÍÿÛÿÛÿÛÿÕÿÛÿæÿ@_{Œ”~\2ãÿÐÿ¿ÿ·ÿ±ÿ·ÿ·ÿ´ÿ¦ÿŒÿeÿLÿ8ÿ-ÿ*ÿ0ÿ0ÿ3ÿ5ÿAÿIÿQÿOÿTÿTÿ]ÿbÿvÿ£ÿÐÿ@‰Ê 4KB#ë Y!!Cu®é)!ë«_Ðÿšÿ|ÿbÿWÿOÿ5ÿÿúþáþ½þþ]þ9þ%þþ þþ-þZþŠþÐþÿsÿÅÿCjjeYQ\pšÄô:PSK7üÝʳ—xY*ìÿ·ÿ~ÿWÿ;ÿ%ÿÿÿúþòþçþÖþÈþ·þ¦þ›þ˜þ£þ¯þÂþÖþÓþÜþÜþáþáþáþïþÿÿ8ÿWÿ]ÿTÿ5ÿÿÙþºþ¦þ£þ¦þÂþÞþÿ-ÿFÿZÿ]ÿWÿQÿWÿkÿ„ÿ«ÿÓÿýÿ:Qgu ¾¾Á°ƒ_5éÿÊÿ¼ÿ·ÿ·ÿ·ÿ·ÿÂÿÇÿØÿÛÿÕÿÕÿØÿÅÿ ÿ~ÿTÿ0ÿ"ÿ"ÿ>ÿeÿ•ÿÊÿéÿ÷ÿñÿÞÿÂÿ¦ÿ’ÿ‡ÿ„ÿ‡ÿ•ÿ¦ÿ·ÿÊÿÓÿÍÿ¼ÿ®ÿÿ•ÿ„ÿ|ÿpÿeÿ]ÿ_ÿhÿ~ÿ¦ÿÛÿ@m ¥š†m\TTm¹ÝñîÒ¨p=ôÿÛÿÐÿÛÿìÿ':HNQN@,ïÿÂÿ˜ÿpÿTÿAÿ3ÿ-ÿ-ÿ;ÿTÿbÿkÿbÿWÿ8ÿÿÜþ¬þ‡þŠþ£þÖþÿeÿšÿÍÿæÿìÿæÿáÿØÿÓÿÍÿÞÿ:sš¼ÏÒ̹‘”—¢¥¥—xT!ìÿ·ÿ’ÿkÿOÿ3ÿÿäþ¬þvþDþþþþýþ9þkþ±þøþ8ÿ|ÿ®ÿÓÿØÿÍÿ¹ÿ«ÿ´ÿÐÿ=ÁôùÁ{,ìÿÍÿÕÿ÷ÿ*_Œ¢¢j=Õÿ±ÿšÿ˜ÿ®ÿÂÿÕÿÞÿæÿýÿ2W~”—~F¼ÿ„ÿQÿ5ÿ0ÿ;ÿbÿ’ÿÊÿýÿ*/,,2CTgjs”«¾Ä¶¢†pYF$úÿáÿÅÿ®ÿ’ÿsÿbÿOÿ;ÿ-ÿ%ÿÿÿÿòþìþäþòþ"ÿeÿ±ÿìÿCbjgegs†¼àü ôØÁ¶®«¨¨¨¥°°³¾ÕÕʶ—e5ýÿÍÿ¦ÿ’ÿŒÿÿ ÿ·ÿÓÿãÿôÿ÷ÿ÷ÿôÿãÿ¿ÿÿZÿ*ÿÿÿÿ0ÿ_ÿ•ÿÕÿýÿìÿÂÿ¨ÿšÿšÿ¨ÿÇÿúÿ:s—¢¢”~g\_e{”¢¢«««¶¼¼¶¨”~gH!éÿÛÿáÿôÿ@g‰Œs\F=@Kb~”¢—ƒe=ïÿÓÿ´ÿÿŒÿsÿ_ÿOÿCÿFÿOÿ]ÿsÿ„ÿ•ÿ ÿ¨ÿ«ÿ«ÿšÿŒÿ„ÿÿŠÿ£ÿÇÿ÷ÿ:@NHFHKYbms”š{bC*úÿéÿæÿéÿôÿýÿ!Ceƒ ¨¥—{gQ:'ñÿÛÿÇÿ¼ÿÇÿãÿ'@WW:áÿ£ÿnÿFÿ8ÿ;ÿTÿvÿ’ÿ ÿÿnÿ0ÿïþºþ˜þ›þ·þòþ8ÿ~ÿ¿ÿÞÿæÿØÿ¹ÿÿpÿeÿvÿšÿÓÿY—Ì÷NxŸ¸ÒÚÝÏ­‰l^agƒ­ÔþþלP ¾N,úÿÕÿ®ÿ~ÿAÿøþ¯þ`þ(þþýêýêýõýþ6þUþvþ›þ½þáþòþøþÿÿ'ÿ>ÿZÿkÿ’ÿ¿ÿ÷ÿF”ã=:) îÒÊÊØîüüüñذ{@ Þÿ¿ÿ´ÿ´ÿ¼ÿÐÿÓÿÊÿ¿ÿ¹ÿÂÿÊÿÊÿ¹ÿ¨ÿ•ÿyÿTÿ;ÿ'ÿ"ÿ0ÿFÿ_ÿÿ•ÿ®ÿÂÿÐÿØÿìÿ :b‰š¨®®¶³¶³³ {K¼ÿ‡ÿbÿQÿIÿIÿCÿIÿCÿ3ÿÿáþ¬þyþ]þJþLþ`þþ©þÓþÿ5ÿeÿÿÐÿ8bƒ—¨Äã#):Nj‹³ÏÚÝΆ^E4! ôÌ¢s@ãÿ«ÿkÿ5ÿÿÜþ·þ›þ„þqþUþ6þþøýóýþýþDþtþ•þ±þ·þºþÅþÈþáþÿ'ÿTÿŠÿÂÿôÿ**$'Hu°ë)HYYK@,&## üãÄ—mH::@,áÿ®ÿvÿ;ÿÿÖþ·þ£þ¦þºþäþÿCÿeÿ~ÿ˜ÿ¨ÿ·ÿÐÿìÿ5QessgCÕÿ’ÿLÿÿïþìþÿ3ÿkÿ£ÿÕÿïÿýÿôÿÛÿ´ÿŒÿpÿeÿhÿ„ÿ´ÿãÿ:b†¥ÁØëéëÚÁ¥”«¾ÒñÿÿæÒÁ¨‘{gWH8,*/85,áÿ·ÿŠÿkÿ]ÿbÿsÿšÿÊÿïÿáÿ¨ÿyÿQÿ5ÿ8ÿCÿTÿnÿŒÿ˜ÿ ÿšÿšÿÿ´ÿÓÿ÷ÿ*2$ ãÿ¹ÿÿ˜ÿ«ÿÕÿ=_mgQ:,$÷ÿÛÿ¹ÿ•ÿpÿ]ÿbÿpÿ‡ÿ’ÿ’ÿšÿšÿÿšÿ•ÿŠÿÿŠÿ˜ÿ¦ÿ¿ÿáÿ'Nx¥Ø :YluoY/ù®Y±ÿhÿ>ÿÿÿ-ÿAÿWÿkÿnÿkÿbÿOÿCÿ;ÿ3ÿ8ÿQÿsÿ˜ÿ·ÿÓÿìÿ:\~š¹ÁÏÝæéôù !7KVPB==BBHB4#ôÝǹ³³° ‰e=ÕÿšÿhÿLÿ8ÿ5ÿ5ÿ'ÿÿýþêþáþáþøþÿ3ÿTÿkÿ„ÿ„ÿ„ÿÿ«ÿÛÿKŒÄî),,#&/@VYSB2Ý®†gK* ìÿÍÿ¦ÿ|ÿTÿ*ÿÿúþÿÿÿ-ÿ>ÿQÿ_ÿnÿnÿsÿ|ÿÿ‡ÿ„ÿŒÿŠÿÿšÿ¨ÿÅÿéÿ8\‰¢««s_CÞÿ¿ÿ¦ÿ’ÿÿŒÿšÿ«ÿ¹ÿÂÿ¿ÿ¿ÿ«ÿ¨ÿ±ÿÅÿØÿïÿ!úÿØÿÊÿÓÿìÿ2H_sx~‰‘¥¼Òù!Hl¢ÏèåµPÄ,«ÿkÿpÿ·ÿ‰ÏσkÿÖþkþGþkþ½þÿTÿQÿ ÿþþý‚ýBý[ýËý|þIÿúÿb{:ÐÿZÿÿ ÿZÿúÿ¹rèÏK³5ýÿgéd¾Òœ&Íÿ¹ÿìÿQ¼:,àmýÿ£ÿŠÿ£ÿéÿ@Œ°¨xÂÿsÿCÿ;ÿOÿpÿÿÿšÿ~ÿTÿ-ÿ"ÿ0ÿkÿÇÿ5šà!Ú m@ úÿôÿéÿæÿØÿÓÿÅÿÅÿÇÿ¼ÿ«ÿÿyÿZÿ;ÿ"ÿÿÿÿ%ÿ0ÿFÿ]ÿsÿ‡ÿŒÿ’ÿŠÿŠÿ’ÿ¨ÿÇÿìÿ5Wu¢¶ÇÚî4\€”‰oHæ°‰eC*Øÿ®ÿ~ÿZÿLÿIÿZÿhÿsÿsÿ_ÿ>ÿ ÿáþ½þ¡þ‡þþ‡þþ©þºþÅþÍþÐþÖþÖþÞþìþÿ5ÿ_ÿvÿ|ÿkÿOÿ0ÿ"ÿ0ÿZÿÿÊÿ2b‰¢«¨®°¹ÁÌÕÕǨ†pWHK\mxxe:Øÿ£ÿsÿOÿ3ÿ-ÿ;ÿLÿhÿsÿ‡ÿÿ¦ÿÂÿÛÿìÿôÿúÿôÿïÿéÿæÿæÿÞÿÓÿ¹ÿÿyÿQÿ0ÿÿÿõþêþÙþÍþ¿þ·þ¯þ·þÓþÿCÿ|ÿ¼ÿéÿCTN@*!5Nm”¶Á°@Óÿ¿ÿ±ÿÂÿÞÿ 2Qmu{um\Q==:@HW_{Œ¥ —gN5!áÿ¹ÿ˜ÿsÿ_ÿFÿ3ÿ"ÿÿÿÿÿçþÅþ£þþ‚þþ±þäþÿWÿ„ÿ•ÿ‡ÿ_ÿ-ÿøþÍþ´þ¯þÈþìþ*ÿnÿ±ÿÞÿúÿýÿúÿéÿÓÿ´ÿšÿŒÿÿ~ÿ‡ÿ•ÿ«ÿÐÿúÿ$_‘¾àüîÝ̳ ‘” ¶Øñù÷æàÝãîüüî¹eÞÿIÿ·þAþêýÃýÀýÖýõýþLþfþnþkþcþ]þhþ|þ¡þÂþäþøþÿÿúþòþìþøþÿFÿ„ÿÕÿWue\_m† ¼ÌÒÒʹ¢”ƒƒŒ‰†ubN8/*/8:,ãÿÂÿ¦ÿ~ÿWÿAÿ*ÿÿÿÿÿÿ>ÿ_ÿŒÿ«ÿÂÿÛÿéÿ÷ÿ'2:8/÷ÿæÿÛÿÛÿìÿ /WsŒ‰~jK$÷ÿ''*'$!'!$$*' ïÿÛÿÐÿÊÿÇÿØÿïÿ2\†®Õÿ2l­ÝèÄrîH’ÿÙþ9þºý}ýwý¬ýþfþÓþ3ÿÿÂÿ$CTm”¶ÏÕÄmH28WŒÇ/VYV=)îàÕǾÄÄÊÊÄ®Œ_,ÞÿÇÿ´ÿšÿyÿ]ÿ>ÿ*ÿÿ ÿýþïþêþäþìþøþÿÿÿÿ ÿÿ'ÿ8ÿIÿeÿÿ¦ÿÂÿÓÿæÿéÿôÿ$N{𶳫~@úÿ¿ÿ„ÿbÿTÿLÿWÿpÿŠÿ¨ÿ¿ÿÐÿØÿìÿôÿ ñÿÕÿ·ÿÿvÿ]ÿIÿ>ÿAÿ>ÿAÿ8ÿ'ÿÿÓþ£þkþGþ0þDþfþ¦þìþ5ÿvÿ®ÿôÿ@¥,×<½û© 9VxÂÿ8ÿáþ¿þÍþêþÿ5ÿQÿ]ÿbÿhÿyÿ˜ÿÅÿúÿ$8$ñÿ˜ÿ0ÿÅþhþ-þþþDþþ½þýþ3ÿeÿŒÿ«ÿÊÿñÿ'//*ïÿÛÿÓÿÛÿñÿ/FNKC@8@Wx®ë/rªÒàÉ™Nñ‘8Þÿšÿpÿeÿhÿvÿ„ÿ˜ÿ ÿ¨ÿ¨ÿ«ÿ´ÿ®ÿ±ÿ¹ÿÂÿÊÿÍÿÇÿ¼ÿ ÿ~ÿ_ÿCÿ-ÿ"ÿÿ*ÿ8ÿFÿFÿ;ÿ%ÿÿõþìþúþÿIÿÿ¼ÿ8m—«¼ÇÒÒÏÊļ¨{ees‰¨Ìæ,\œ‹0ÙsÞýÊ0M)ñÍÿÞþ-þÃýˆýtýwý}ýwýqýiýlý…ýµýûýDþ•þËþêþòþäþÐþ·þ¬þ¬þ¿þìþ%ÿbÿšÿÅÿãÿñÿ $QŒØ#a‹Žl/ãš\/÷ÿáÿÐÿ«ÿyÿCÿÿýþýþ%ÿ_ÿ®ÿTšÒ!4:/)ÿØ Qïÿ‡ÿ3ÿïþËþºþ±þ©þ±þ¿þÖþïþÿÿ>ÿhÿ•ÿ¼ÿÓÿØÿÂÿ˜ÿ]ÿÿÙþ›þqþ]þZþfþ|þŠþ˜þžþ“þþnþZþUþZþhþ„þ¦þÐþõþÿ>ÿhÿšÿ¿ÿáÿôÿÐÿ«ÿÿÿ«ÿÐÿúÿ/~Õ\üÀ˜s' ÇŒò絕ÿÐþAþßý¡ýlý9ýöü¸ü}üKü4ü.üMüˆüÚü ý^ýzý‚ýzýlýPýGýDýRýqý–ý½ýßýþ%þ]þ¦þÿkÿÞÿK¥ãüà«_Þÿ«ÿŒÿnÿWÿ5ÿÿÍþþZþ>þDþtþÂþ>ÿÂÿNÕSÏ<¤Rˆ¦¤w§oÏ:Åÿsÿ;ÿÿÿýþõþøþøþÿÿ8ÿpÿ¼ÿN†®¹³‘j8úÿÐÿÿhÿ*ÿìþ©þnþ9þþøýíýðý þ6þhþ¦þÞþÿOÿyÿÿ·ÿÇÿÇÿ·ÿ ÿ~ÿZÿ;ÿ*ÿ"ÿÿ-ÿQÿŒÿéÿgÁˆO˜ý!ÂRÎGÉ^»}@Á‰Q÷ÿÞÿÍÿÅÿ¼ÿ¨ÿŒÿhÿ;ÿÿäþÈþ¿þËþäþÿ'ÿIÿkÿ‡ÿ£ÿ¼ÿÓÿìÿ'//* ôÿÕÿ±ÿ‡ÿ]ÿ0ÿÿêþÖþÐþÙþòþÿ>ÿkÿ•ÿ¼ÿÛÿñÿJUNQ. Blue Square test file JUNQDISP Blue Square Test File - .wavJUNQJUNQJUNQJUNQJUNQ„INFOJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQ_PMXT Blue Square Test File - .wav XMPFiles BlueSquare test file, created in Premiere Pro, saved as .avi, .mov, .mp3, and .wav XMP Blue Square test file Premiere .wav LISTÄINFOICRDIARTINAMIGNRICMTIENGICOPISFTJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQJUNQexempi-2.2.1/samples/testfiles/Makefile.in0000664000175000017500000003161212150231002015426 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = samples/testfiles DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = BlueSquare.ai BlueSquare.eps BlueSquare.gif BlueSquare.jpg BlueSquare.mp3 BlueSquare.png BlueSquare.tif\ BlueSquare.avi BlueSquare.indd BlueSquare.mov BlueSquare.pdf BlueSquare.psd BlueSquare.wav all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/testfiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign samples/testfiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/samples/testfiles/BlueSquare.mov0000664000175000017500000013503111745673651016211 00000000000000widešÏmdat (7=;<:=>=>8898888433333333333333333333333333333333333333333333333333333333333333333333333333333378<:99:<<>>;<<¶8)  /23/-352-++þüþ12/44444444444444444444444444444444444444444444444444444444444444444444444444444447898;98;=;;:; 8! +02???;?@@??   ?>=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>??????>?<>>>>á;: ‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò®ÿþþÿþÿ‚ü­üûøøûûþüþþýþ²ÿó‚à‚àòµÿ þÿþðýÿÿõõþðÊù‚ö­öôëþæåçèêìòéÓáøòåêèý³ÿó‚à‚àò»ÿþÿþÿÿþÿÿþòüÿÿ÷÷ÿçªÔ‚Ñ­Ñ˼µ··¹»»½¿«™‹³æðåîîý³ÿó‚à‚àò»ÿþÿþÿÿþþÿ öùøýüûÿÙe‚­ü 148xÊëçóòþ³ÿó‚à‚àò»ÿþÿþÿÿþþÿ úõðùýýö¿A ‚­ý ^¿ìèðëþ³ÿó‚à‚àò»ÿþÿþÿÿþþÿ üóì÷þþñ²1‚ ­ û `Åòìíâü³ÿó‚à‚àò»ÿþÿþÿÿþþÿ üöïøüûñ³8‚­jÉõñíàû³ÿó‚à‚àò»ÿþÿþÿÿþþÿ úøõüù÷ó¼E‚®  `Äöõõåý³ÿó‚à‚àò»ÿþÿþÿÿþþÿ ùüùý÷óóÆR ‚­þRºó÷øðý³ÿó‚à‚àò»ÿþÿþÿÿþþÿ ýüúúüýÿË* ‚®þ \½ëïùøþ³ÿó‚à‚àò»ÿþÿþÿÿþþÿ ýüúúüýÿË+‚¨ \½ëïùøþ³ÿó‚à‚àò»ÿþÿþÿÿþþÿ ýüúúüýÿË+‚¨ ^½ëíùöþ³ÿó‚à‚àò»ÿþÿþÿÿþþÿ ýüúúüýÿË(‚© ^½ëíúöþ³ÿó‚à‚àò»ÿþÿþÿÿþþÿ ýüúúüýÿË(‚¨  \½ëïùöþ³ÿó‚à‚àò»ÿþÿþÿÿþþÿ ýüúúüýÿË(‚¨  ^½ìîú÷þ³ÿó‚à‚àò»ÿþÿþÿÿþþÿ ýüúúüýÿË)‚¨ ]¼ëïù÷þ³ÿó‚à‚àòºÿþýÿ þÿÿýüúúýüÿË)‚ª Z¼êïù÷þ³ÿó‚à‚àò´ÿþÿýþúüüÿË(‚¬þ V·éîýúþ³ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¶ÿ þÿÿþýüúúüþÿË+‚¬ûS¶éïþü²ÿó‚à‚àò¹ÿþýÿ þÿýüúúüüÿË*‚¬ü Q´æëø÷þ³ÿó‚à‚àò»ÿþÿþþýÿ ýúùúüýþË, ‚®ú Q²áçñòû³ÿó‚à‚àò¼ÿþþÿþÿþþÿýþúüýÿÊ, ‚®û  Q²ßâìðû³ÿó‚à‚àò¼ÿþþÿþÿþþÿýþúüýÿÊ+ ‚®ù  T²ßâîðù³ÿó‚à‚àò¼ÿþþÿþÿþþÿýþúüýÿÊ) ‚­ûþ   T³áäðñù³ÿó‚à‚àò¼ÿþþÿþÿþþÿýþúüýÿÊ*‚¨  Tµäçññû³ÿó‚à‚àò¼ÿþþÿþÿþþÿýþúüýÿÊ(‚©  X¶äèôôü³ÿó‚à‚àò¼ÿþþÿþÿþþÿýþúüýÿÊ(‚« Yºçêõõü³ÿó‚à‚àò¼ÿþþÿþÿþþÿýþúüýÿÊ(‚¬þ   [¼éíøö²ÿó‚à‚àò¼ÿþþÿþÿþþÿ öóõøõöþ®þ 'jÂñåÎÊú³ÿó‚à‚àò¼ÿþþÿþÿþþÿ üú÷ùõ÷ýÃ#‚­þ hÅøøîïþ³ÿó‚à‚àò¼ÿþþÿþÿþüÿúúö÷ùÃ7‚¬ c¼ôýÿþþ³ÿó‚à‚àò¼ÿþþÿþÿþüÿüüøúøÊS‚­"4rºéùûþþ³ÿó‚à‚àò¼ÿþþÿþÿþüÿøúúù÷Öƒq‚m­mjfecefhjmny{‹°×ñúûþþ³ÿó‚à‚àò¼ÿþþÿþÿþþÿ~üýõ÷üúøè¿ñìîìîììîìîìîìîìîîìîìîìîìîììîìîìîìîìîîìîìîìîìîììîìîìîìîìîîìîìîìîìîììîìîìîìîìîîìîìîìîìîììîìîìîìîìîîìîìîìîìîììîìîìîìîìîîìlîìîìîìîììîìîìîìîìîîìîìîìîìîììîìîìîìîìîîìîìîìîìîììîìîìîìîìîîìîìîìîìîììîìîìîìîìîîìîìîìîìîììîìîìîìçãâáåæèéíÞÜåóü®ÿó‚à‚àò¼ÿþþÿþÿþÿÿþñýïóüüú÷âþüþûüþüþùüþüþûüþüþùüþüþûüþüþùüþüþûüþüþùüþüþûüþüþùüþüþûüþüþùüþüþûüþüþùüþüþûüþüþùüþüþûüþüþùüþüþûüþüþùüþüþûüþüþûóîîïïñòõøúúþûÿþ³ÿó‚à‚àò¹ÿþüÿþéúëðúþýó‚õ¬õòíéèééëíîîéï÷õíëñüÿþ³ÿó‚à‚àò»ÿþþóÿþ‚ÿ«ÿþüûþüÿÿþüÿþ±ÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò®ÿþþýþ‚ÿ¢ÿýýþÿÿþ¯ÿó‚à‚àò³ÿ þòýÿÿôñûìÊþ‚ÿ¨ÿ þýýüûúðÚêÿüùþù²ÿó‚à‚àò³ÿ þõüÿÿöóùâ§Ô‚Ó­ÓÖÖ×ÔÒÑÐÐÎʱšºîýû°ÿó‚à‚àò²ÿ øüúýù÷ùÒ] ‚­  +*0vÍóóÿü²ÿó‚à‚àò²ÿ ýøòúüúò·6‚®øTºíïùóþ³ÿó‚à‚àò±ÿ öîøþûì©%‚®úýV¿òñóé²ÿó‚à‚àò±ÿùñùû÷ìª,‚ ­  þ  ^Äö÷öåþ³ÿó‚à‚àò²ÿ ýûöüøóí¶< ‚®   ZÄüÿýðþ³ÿó‚à‚àò²ÿ üÿûýöñí¿I‚¬L¼úÿÿû²ÿó‚à‚àò°ÿüûùúùÄ%‚¬ý V½óø°ÿó‚à‚àò°ÿüûùúùÄ$‚¬û V½ó÷°ÿó‚à‚àò°ÿüûùúùÄ$‚­þûU¼ð÷°ÿó‚à‚àò°ÿ~üûùúùÄ&lU¼ð÷°ÿó‚à‚àò°ÿ~üûùúùÄ&_ü V¼ò÷°ÿó‚à‚àò°ÿ~üûùúùÄ&lU¼ñø°ÿó‚à‚àò°ÿüûùúùÄ'‚®ý Sºïôÿþ²ÿó‚à‚àò±ÿ þüûúùùÄ'‚®þTºîôÿþ²ÿó‚à‚àò±ÿüüúùù÷Ä%‚¬   X¼ð÷°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¶ÿþýÿ ýûúùø÷Ä%‚­  Z½ñõ°ÿó‚à‚àò¹ÿþúÿýûúþùÄ%‚­  [¾òö°ÿó‚à‚àò»ÿþýþþüÿüûûüúûÇ'‚­     \Áôø°ÿó‚à‚àò¼ÿþþýþýüÿýýüýÉ) ‚­   \Ãøú°ÿó‚à‚àò¼ÿþþýþýüÿýýüýÉ+ ‚®    ^Äøú°ÿó‚à‚àò¼ÿþþýþýüÿýýüýÉ,‚­   ]Ä÷ú°ÿó‚à‚àò¼ÿþþýþýüÿýýüýÉ,‚ ­  ]Ãøúþÿþ³ÿó‚à‚àò¼ÿþþýþýüÿýýüýÉ+ ‚­  [Âöùþ±ÿó‚à‚àò¼ÿþþýþýüÿýýüýÉ+‚ ¬  ZÀôöþ±ÿó‚à‚àò¼ÿþþýþýüÿýýüýÉ+‚ ®  X¼ðôÿü²ÿó‚à‚àò¼ÿþþýþýýÿ øööùõõû ‚­c¿ñéÏËü³ÿó‚à‚àò¼ÿþþýþýýÿ þýùúõôúÁ"‚®ýý \¿ö÷îìý³ÿó‚à‚àò¼ÿþþýþýûÿüüööøÁ5‚ ­  V´ïúùûþ³ÿó‚à‚àò¼ÿþþýþýûÿýýø÷÷ÈQ‚­ý 'g±âòõûþ³ÿó‚à‚àò¼ÿþþýþýûÿúüúøõÕ„p‚n­nptuspþn mlsp~¥Ñíôõûþ³ÿó‚à‚àò¼ÿþþýþýýÿ~þÿöøüú÷æ½ññðñðññðñðñðñðñððñðñðñðñðññðñðñðñðñððñðñðñðñðññðñðñðñðñððñðñðñðñðññðñðñðñðñððñðñðñðñðññðñðñðñðñððñðñðñðñðññðñðñðñðñððñpðñðñðñðññðñðñðñðñððñðñðñðñðññðñðñðñðñððñðñðñðñðññðñðñðñðñððñðñðñðñðññðñðñðñðñððñðñðñðñðññðñðñðóøùøôòòñðîÚÕÝëùþÿþý²ÿó‚à‚àò¼ÿþþýþýþÿ~þôýñõüûúôàþÿþÿþÿÿþÿþÿþÿþÿþþÿþÿþÿþÿþÿÿþÿþÿþÿþÿþþÿþÿþÿþÿþÿÿþÿþÿþÿþÿþþÿþÿþÿþÿþÿÿþÿþÿþÿþÿþþÿþÿþÿþÿþÿÿþÿþÿþÿþÿþþÿþÿþÿþÿþÿÿþÿþÿþÿþÿþþ`ÿþÿþÿþÿþÿÿþÿþÿþÿþÿþþÿþÿþÿþÿþÿÿþÿþÿþÿþÿþþÿþÿþÿþÿþÿÿþÿþÿþÿþÿþþÿþÿþÿþÿþÿÿþÿþÿþÿþÿþþÿþÿþÿþÿþÿÿþÿþÿþÿþýÿþÿþÿúúûý­ÿó‚à‚àò»ÿýýþüÿ þëüìñûüúúò‚õ¬õúýÿÿüûúùø÷ëïõóíëïù±ÿó‚à‚àò»ÿþþóÿþ‚ÿ¨ÿþúÿþ«ÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò»ÿùýþûýÿþþÿþÿ‚þ­þôÿþúñèåëö³ÿó‚à‚àò¼ÿýûû øöóäñöýùùÿ÷ã‚ÿ¡ÿ þõùïɧ¡­çý´ÿó‚à‚àò¼ÿýøöøûûøöôñâìôûûþþôÚ‚ÿ ÿæîôÔ­§²çý´ÿó‚à‚àò¼ÿýøöøûûøöôðèéîùþÿÿð»«Ç‚ɮɽ£›¡«­ªª®´êäÐæÿõãàÛö³ÿó‚à‚àò¼ÿ ýøöøûûøöôòêäæõþÿé¥Åí‚ð®ðæËÀÆÍÍËËÍÔÛÔÈåÿÿýûìü³ÿó‚à‚àò¼ÿýøöøûûøöôòëãâóþÿþá˜Í÷‚ú®ú ôåßãëíëééîñâÖëþÿúéþ³ÿó‚à‚àò¼ÿýøöøûûøöôòëæåôþÿþâŸáý‚ÿ­ÿþþýûÿ þñßíþÿþ÷ßû³ÿó‚à‚àò¼ÿýøöøûûøöôòêèê÷ýþÿè­Õý‚ÿ®ÿûóðøüüõðîíûåÈâÿþùèÖ÷³ÿó‚à‚àò¼ÿýøöøûûøöôòéëïùýýÿì¹Êó‚õ®õòéçïóóëåßãîÒ³ÒùüñáÕóý´ÿó‚à‚àò¼ÿýøöøûûøöôòíëðöüÿþä–Ïù‚û®ûöðíòööðêääðÛÀßÿ÷éâßôý´ÿó‚à‚àò¼ÿýøöøûûøöôòíëðöüÿþä–Íø‚ú®úöòïôúöðìèéðÝÂßÿùíäáö³ÿó‚à‚àò¼ÿýøöøûûøöôòíëðöüÿþâ”Çð‚ò®òñïïôúöðîêëõ߯áþúñèãö³ÿó‚à‚àò¼ÿ~ýøöøûûøöôòíëðöüÿþâ”Çñóñóññóñóñóñóñóóñóñóñóñóññóñóñóñóñóóñóñóñóñóññóñóñóñóñóóñóñóñóñóññóñóñóñóñóóñóñóñóñóññóñóñóñóñóóñóñóñóñóññó{ñóñóñóñóóñóñóñóñóññóñóñóñóñóóñóñóñóñóññóñóñóñóñóóñóñóñóñóññóñóñóñóñóóñóñóñóñóññóñóñóñóñóóñóñóñóñóññóñóñóïëéîöôìèæçò߯áþúñëåø³ÿó‚à‚àò¼ÿ~ýøöøûûøöôòíëðöüÿþä–Í÷ûùûùùûùûùûùûùûûùûùûùûùûùùûùûùûùûùûûùûùûùûùûùùûùûùûùûùûûùûùûùûùûùùûùûùûùûùûûùûùûùûùûùùûùûùûùûùûûùûùûùûùûùùû{ùûùûùûùûûùûùûùûùûùùûùûùûùûùûûùûùûùûùûùùûùûùûùûùûûùûùûùûùûùùûùûùûùûùûûùûùûùûùûùùûùûùûùûùûûùûùûùûùûùùûùûùûñåáçìêäàÞàëÛÂßþûïèåø³ÿó‚à‚àò¼ÿ~ýøöøûûøöôòíëðöüÿþä–Íøùúùúúùúùúùúùúùùúùúùúùúùúúùúùúùúùúùùúùúùúùúùúúùúùúùúùúùùúùúùúùúùúúùúùúùúùúùùúùúùúùúùúúùúùúùúùúùùúùúùúùúùúúù{úùúùúùúùùúùúùúùúùúúùúùúùúùúùùúùúùúùúùúúùúùúùúùúùùúùúùúùúùúúùúùúùúùúùùúùúùúùúùúúùúùúùúùúùùúùúùúùúùúúùúùúùòãÛãèèâÞÜàîÛÄáþýõíêø³ÿó‚à‚àò¼ÿýøöøûûøöôòíëðöüÿþâ•Éò‚ô®ôìâÝäìêæââçõäÌäÿÿýùðú³ÿó‚à‚àò¼ÿýûøýû øöôïíðøþþÿä•Éò‚ô®ôîããêððêææêøåÎæÿÿýùðú³ÿó‚à‚àò¼ÿýýûüÿøöóðôüþþäšÏù‚û®ûôñïõûúóîîïöâËåÿþûóëø³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò»ÿýýþÿþÿûøóñöüþþäÔû‚ý®ýøõôùþüöòðî÷äÌãÿüõïéö³ÿó‚à‚àò¹ÿþþÿ ýøöóñöüþþÿä–Ñû‚ý®ýöðîöûüøöôð÷âÇãÿüùóìú³ÿó‚à‚àò»ÿþÿþþûöôôñðñöüþÿßÐý‚ÿ®ÿ÷äßëúÿþüøö÷ÜÁßÿþýüôþ³ÿó‚à‚àò¼ÿþþÿþüøöôòïîðôüÿÿÞ…Ê÷‚ú®úòßÙéùÿÿþúõõؼÝÿþýõþ³ÿó‚à‚àò¼ÿþþÿþüøöôòïîðôüÿÿܽç‚é®éæÚÝëøÿþü÷ñïÔ·Öûûö÷óû³ÿó‚à‚àò¼ÿþþÿþüøöôòïîðôüÿÿܾç‚é®éæßáîúþþüõîíгÓùûòóïû³ÿó‚à‚àò¼ÿþþÿþüøöôòïîðôüÿÿÞ†Êö‚ú®úôëéôüþÿýõïíαÏ÷úñóïù³ÿó‚à‚àò¼ÿþþÿþüøöôòïîðôüÿÿÞ…Ðü‚þ®þüòòöüÿþþ÷îíαÑ÷ûõöòü³ÿó‚à‚àò¼ÿþþÿþüøöôòïîðôüÿÿÞ…Êú‚ü®ü úööúýÿÿýúóðÒ¶Õþýþùþ³ÿó‚à‚àò¼ÿþþÿþüøöôòïîðôüÿÿÞ…Êö‚ú®úøö÷úþÿÿþ÷ñîÔ¸Ûÿþÿÿþ²ÿó‚à‚àò¼ÿþþÿþüøöôòèçêòõøÿÙvÇò‚õ®õôïïõûþüøðêüÕÄâÿþúêÝþ³ÿó‚à‚àò¼ÿþþÿþüøöôòíîíóõøÿÛy»ç‚é®éãØÖßéëéâ×Òݾ´Þÿÿþ°ÿó‚à‚àò¼ÿþþÿþüøöôòòôðôöùý݇Áè‚ê®êàÎÉÓÝßÚÕÏʶž Ïöýÿþ³ÿó‚à‚àò¼ÿþþÿþüøöôòòôñõøúüâ–¹‚»®»³£›§³µ±«§¥¯¢¤Èíýÿþ³ÿó‚à‚àò¼ÿþþÿþüøöôòòôîôúýÿè­¼‚Ë­ËÅ»»ÇÕ×ÕÓÏÑàÝÜèøüûþÿþ³ÿó‚à‚àò¼ÿþþÿþüøöôòíñêñüþþòÒþ‚ÿ­ÿþþÿþÿþÿþÿÿþÿÿþøòøüý³ÿó‚à‚àò¼ÿþþÿþüøöôñãïåíùÿþúìýþÿþþÿüþÿþÿÿþÿüþÿþþÿüþÿþÿÿþÿüþÿþþÿüþÿþÿÿþÿüþÿþþÿüþÿþÿÿþÿüþÿþþÿüþÿþÿÿþÿüþÿþþÿüþÿþÿÿþÿüþÿþþÿüþÿþÿÿþÿüþÿþþÿüþÿþÿÿþÿüþÿþþÿüþÿþÿÿþÿüþÿþþÿüþÿþÿÿþÿüþÿþþÿüþïî÷þþ ÿþÿþþÿÿöæáæðø³ÿó‚à‚àò¹ÿþÿÿûööóßðåìøÿÿþùó‚ð­ðêÜÚâìþð óùúýÿñÝÍÐáðø³ÿó‚à‚àò»ÿþþýÿýýûýýþÿþÿÿ‚ý­ýú÷÷ùüýþ ÿÿþÿÿûööøûý³ÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚àò‚ÿ‚ÿ‚ÿðÿó‚à‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬‚‚‚‚‚¬freelmvhdÀ+TdÀ+Teu0_êÿ@Atrak\tkhdÀ+TdÀ+Te_ê@Ðà$edtselst_ê¹mdia mdhdÀ+TdÀ+Teu0_ê:hdlrmhlrvideappl Apple Video Media HandlerWminfvmhd@€€€9hdlrdhlralisappl*Apple Alias Data Handler$dinfdref alisÞstblzstsdj8BPSapplÐàHH Planar RGBÿÿpaspˆÐstts_êstscstszšÇstcoLudta&@PRMCreated with Premiere Pro 2.0FIELFIEL#freelmvhdÀ+TdÀ+Teu0_êÿ@Atrak\tkhdÀ+TdÀ+Te_ê@Ðà$edtselst_ê¹mdia mdhdÀ+TdÀ+Teu0_ê:hdlrmhlrvideappl Apple Video Media HandlerWminfvmhd@€€€9hdlrdhlralisappl*Apple Alias Data Handler$dinfdref alisÞstblzstsdj8BPSapplÐàHH Planar RGBÿÿpaspˆÐstts_êstscstszšÇstconudta&@PRMCreated with Premiere Pro 2.0FIELFIEL"PrmL` ð C:\Documents and Settings\alillich\Desktop\BS.prproj9¨aJ  6à5ë²aJÿÿÿÿˆ¯ëLÿ¹9`Vê Ä5ëÀ5ë[à5ë x#Èh:´û¹9²†“|Lÿ¹9¯Þ4@Pš¼u#.)5¼u#¬u#Üû¹9²†“|Lÿ¹9Ù4 Oš¬u#Pg:¬u# µcJøÃu!¬u#¼u#‡Lÿ¹9x#SLhü¹9iÕyÿÿÿÿLÿfreelmvhdÀ+TdÀ+Teu0_êÿ@Atrak\tkhdÀ+TdÀ+Te_ê@Ðà$edtselst_ê¹mdia mdhdÀ+TdÀ+Teu0_ê:hdlrmhlrvideappl Apple Video Media HandlerWminfvmhd@€€€9hdlrdhlralisappl*Apple Alias Data Handler$dinfdref alisÞstblzstsdj8BPSapplÐàHH Planar RGBÿÿpaspˆÐstts_êstscstszšÇstcoÊudta&@PRMCreated with Premiere Pro 2.0FIELFIEL"PrmL` ð C:\Documents and Settings\alillich\Desktop\BS.prproj9¨aJ  6à5ë²aJÿÿÿÿˆ¯ëLÿ¹9`Vê Ä5ëÀ5ë[à5ë x#Èh:´û¹9²†“|Lÿ¹9¯Þ4@Pš¼u#.)5¼u#¬u#Üû¹9²†“|Lÿ¹9Ù4 Oš¬u#Pg:¬u# µcJøÃu!¬u#¼u#‡Lÿ¹9x#SLhü¹9iÕyÿÿÿÿLÿ\Cr8r¾ïÊþTPrMrCRPr.prproj/L ÿÿÿÿZAdobe Premiere Pro 2.0À5ëu#›freelmvhdÀ+TdÀ+Teu0_êÿ@Atrak\tkhdÀ+TdÀ+Te_ê@Ðà$edtselst_ê¹mdia mdhdÀ+TdÀ+Teu0_ê:hdlrmhlrvideappl Apple Video Media HandlerWminfvmhd@€€€9hdlrdhlralisappl*Apple Alias Data Handler$dinfdref alisÞstblzstsdj8BPSapplÐàHH Planar RGBÿÿpaspˆÐstts_êstscstszšÇstcoæudta&@PRMCreated with Premiere Pro 2.0FIELFIEL"PrmL` ð C:\Documents and Settings\alillich\Desktop\BS.prproj9¨aJ  6à5ë²aJÿÿÿÿˆ¯ëLÿ¹9`Vê Ä5ëÀ5ë[à5ë x#Èh:´û¹9²†“|Lÿ¹9¯Þ4@Pš¼u#.)5¼u#¬u#Üû¹9²†“|Lÿ¹9Ù4 Oš¬u#Pg:¬u# µcJøÃu!¬u#¼u#‡Lÿ¹9x#SLhü¹9iÕyÿÿÿÿLÿ\Cr8r¾ïÊþTPrMrCRPr.prproj/L ÿÿÿÿZAdobe Premiere Pro 2.0À5ëu#PrmAPARfˆÐmoovlmvhdÀ+TdÀ+cœu0_êÿ@Atrak\tkhdÀ+TdÀ+Te_ê@Ðà$edtselst_ê¹mdia mdhdÀ+TdÀ+Teu0_ê:hdlrmhlrvideappl Apple Video Media HandlerWminfvmhd@€€€9hdlrdhlralisappl*Apple Alias Data Handler$dinfdref alisÞstblzstsdj8BPSapplÐàHH Planar RGBÿÿpaspˆÐstts_êstscstszšÇstco Oudta&@PRMCreated with Premiere Pro 2.0FIELFIEL"PrmL` ð C:\Documents and Settings\alillich\Desktop\BS.prproj9¨aJ  6à5ë²aJÿÿÿÿˆ¯ëLÿ¹9`Vê Ä5ëÀ5ë[à5ë x#Èh:´û¹9²†“|Lÿ¹9¯Þ4@Pš¼u#.)5¼u#¬u#Üû¹9²†“|Lÿ¹9Ù4 Oš¬u#Pg:¬u# µcJøÃu!¬u#¼u#‡Lÿ¹9x#SLhü¹9iÕyÿÿÿÿLÿ\Cr8r¾ïÊþTPrMrCRPr.prproj/L ÿÿÿÿZAdobe Premiere Pro 2.0À5ëu#PrmAPARfˆÐ iXMP_ Blue Square Test File - .mov XMPFiles BlueSquare test file, created in Premiere Pro, saved as .avi, .mov, .mp3, and .wav XMP Blue Square test file Premiere .mov exempi-2.2.1/samples/testfiles/BlueSquare.pdf0000664000175000017500000002506611745673651016167 00000000000000%PDF-1.4 %âãÏÓ 4 0 obj <> endobj xref 4 7 0000000016 00000 n 0000000565 00000 n 0000000660 00000 n 0000000920 00000 n 0000001145 00000 n 0000001256 00000 n 0000000436 00000 n trailer <]>> startxref 0 %%EOF 10 0 obj<>stream xÚb```a``f¦ƒ ˜€……Á ¹ ÓK˜ÀLf . ÍDZa^Ô endstream endobj 5 0 obj<>/Metadata 2 0 R/Pages 1 0 R/Type/Catalog>> endobj 6 0 obj<>>>/Type/Page>> endobj 7 0 obj<>stream H‰d±Â0 D¿Àÿp_:Vš´3ˆ:0 )¡‚ß'…U >ùä»ç;1V \-HžÖ¸«ª°r¶Æp¾æP+w}xúI»Zß§°G TLÆéAÂN•ë”èÚAʼÚ{üüahÌIãƒEv—<3l¶ŒŠþQJ1YÛ13’aóo¿Ù8jF:SCKz 0êÎ1w endstream endobj 8 0 obj<> endobj 9 0 obj<> endobj 1 0 obj<> endobj 2 0 obj<>stream uuid:ce7a0ad8-c8d1-11da-9cb6-000d936b79c4 adobe:docid:indd:af62ddc6-213f-11da-ac18-fe020baf4f13 proof:pdf 2005-09-07T15:00:22-07:00 2006-04-10T13:37:19-07:00 2006-04-10T13:37:19-07:00 Adobe InDesign CS2 (4.0) JPEG 256 256 /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4AE0Fkb2JlAGQAAAAAAQUAAr///9sAhAAKBwcHBwcKBwcKDgkJCQ4RDAsLDBEU EBAQEBAUEQ8RERERDxERFxoaGhcRHyEhISEfKy0tLSsyMjIyMjIyMjIyAQsJCQ4MDh8XFx8rIx0j KzIrKysrMjIyMjIyMjIyMjIyMjIyMjI+Pj4+PjJAQEBAQEBAQEBAQEBAQEBAQEBAQED/wAARCAEA AMUDAREAAhEBAxEB/8QBogAAAAcBAQEBAQAAAAAAAAAABAUDAgYBAAcICQoLAQACAgMBAQEBAQAA AAAAAAABAAIDBAUGBwgJCgsQAAIBAwMCBAIGBwMEAgYCcwECAxEEAAUhEjFBUQYTYSJxgRQykaEH FbFCI8FS0eEzFmLwJHKC8SVDNFOSorJjc8I1RCeTo7M2F1RkdMPS4ggmgwkKGBmElEVGpLRW01Uo GvLj88TU5PRldYWVpbXF1eX1ZnaGlqa2xtbm9jdHV2d3h5ent8fX5/c4SFhoeIiYqLjI2Oj4KTlJ WWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+hEAAgIBAgMFBQQFBgQIAwNtAQACEQMEIRIxQQVRE2Ei BnGBkTKhsfAUwdHhI0IVUmJy8TMkNEOCFpJTJaJjssIHc9I14kSDF1STCAkKGBkmNkUaJ2R0VTfy o7PDKCnT4/OElKS0xNTk9GV1hZWltcXV5fVGVmZ2hpamtsbW5vZHV2d3h5ent8fX5/c4SFhoeIiY qLjI2Oj4OUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6/9oADAMBAAIRAxEAPwDs2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxVKdV806Dolytpql2LeZ0EqoUdqoSyg1RGHVDlkMM5iwEGQCC/wCV geUP+rkv/IuX/qnkvyuXuRxxd/ysDyh/1cl/5Fy/9U8fyuXuXji7/lYHlD/q5L/yLl/6p4/lcvcv HF3/ACsDyh/1cl/5Fy/9U8fyuXuXji7/AJWB5Q/6uS/8i5f+qeP5XL3Lxxd/ysDyh/1cl/5Fy/8A VPH8rl7l44u/5WB5Q/6uS/8AIuX/AKp4/lcvcvHFNtL1fTtatjd6ZMLiFXMZcKy/EACRR1U/tDK5 wlA0Uggo3IpdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirx/82f8AlJrf/mBi/wCTtxmz7O+g +9ozc2EZmtbsVdirsVdirsVdir2H8qP+Ual/5i5P+IRZqdf/AHrkYvpZtmKzdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirx/82f+Umt/+YGL/k7cZs+zvoPvaM3NhGZrW7FXYq7FXYq7FXYq9h/K j/lGpf8AmLk/4hFmp1/965GL6WbZis3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8f8AzZ/5 Sa3/AOYGL/k7cZs+zvoPvaM3NhGZrW7FXYq7FXYq7FXYq9h/Kj/lGpf+YuT/AIhFmp1/965GL6Wb Zis3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8f/ADZ/5Sa3/wCYGL/k7cZs+zvoPvaM3NhG ZrW7FXYq7FXYq7FXYq9h/Kj/AJRqX/mLk/4hFmp1/wDeuRi+lm2YrN2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KvH/zZ/wCUmt/+YGL/AJO3GbPs76D72jNzYRma1uxV2KuxV2KuxV2KvYfyo/5R qX/mLk/4hFmp1/8AeuRi+lm2YrN2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvH/zZ/5Sa3/5 gYv+Ttxmz7O+g+9ozc2EZmtbsVdirsVdirsVdir2H8qP+Ual/wCYuT/iEWanX/3rkYvpZtmKzdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirx/wDNn/lJrf8A5gYv+Ttxmz7O+g+9ozc2EZmtbsVd irsVdirsVdir2H8qP+Ual/5i5P8AiEWanX/3rkYvpZtmKzdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirx/8ANn/lJrf/AJgYv+Ttxmz7O+g+9ozc2EZmtbsVdirsVdirsVdir2H8qP8AlGpf+YuT /iEWanX/AN65GL6WbZis3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8f/Nn/AJSa3/5gYv8A k7cZs+zvoPvaM3NhGZrW7FXYq7FXYq7FXYq9h/Kj/lGpf+YuT/iEWanX/wB65GL6WbZis3Yq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8f/Nn/lJrf/mBi/5O3GbPs76D72jNzYRma1uxV2KuxV2K uxV2KvYfyo/5RqX/AJi5P+IRZqdf/euRi+lm2YrN2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KpTqvlbQdbuVu9UtBcTIgiVy7rRAWYCiOo6ucshmnAUCgxBQX/Kv/KH/AFbV/wCRkv8A1UyX5rL3 o4Iu/wCVf+UP+rav/IyX/qpj+ay968EXf8q/8of9W1f+Rkv/AFUx/NZe9eCLv+Vf+UP+rav/ACMl /wCqmP5rL3rwRd/yr/yh/wBW1f8AkZL/ANVMfzWXvXgi7/lX/lD/AKtq/wDIyX/qpj+ay968EXf8 q/8AKH/VtX/kZL/1Ux/NZe9eCKbaXpGnaLbG00yEW8LOZCgZm+IgAmrsx/ZGVznKZspAARuRS7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/9k= application/pdf Blue Square Test File - .pdf XMPFiles BlueSquare test file, created in InDesign CS2, saved as .indd and .pdf. XMP Blue Square test file InDesign .pdf Adobe PDF Library 7.0 False endstream endobj 3 0 obj<> endobj xref 0 4 0000000000 65535 f 0000001365 00000 n 0000001415 00000 n 0000010379 00000 n trailer <> startxref 116 %%EOF exempi-2.2.1/samples/testfiles/BlueSquare.ai0000664000175000017500000441534711745673651016020 00000000000000%PDF-1.4 %âãÏÓ 7 0 obj <> endobj xref 7 21 0000000016 00000 n 0000000910 00000 n 0000000969 00000 n 0000001469 00000 n 0000001717 00000 n 0000001751 00000 n 0000558975 00000 n 0000559087 00000 n 0000559160 00000 n 0000559510 00000 n 0000560670 00000 n 0000620978 00000 n 0000650272 00000 n 0000715859 00000 n 0000781446 00000 n 0000847033 00000 n 0000912620 00000 n 0000978207 00000 n 0001043794 00000 n 0001109381 00000 n 0000000716 00000 n trailer <]>> startxref 0 %%EOF 27 0 obj<>stream xÚb``b``fg``|ùž01 Gƒ˜-øæX5ƒXV HË*0\cªhc`yÀ Î |€%o»B‘£ ƒ Á {b03ƒà{%¨ ŒÊpË0ƒDD–Q ÀÌs¨ endstream endobj 8 0 obj<> endobj 9 0 obj<>/ArtBox[143.5 215.5 432.5 576.5]/MediaBox[0.0 0.0 612.0 792.0]/Thumb 3 0 R/TrimBox[0.0 0.0 612.0 792.0]/Resources<>/Properties<>>>/ExtGState<>>>/Type/Page/LastModified(D:20050907151747-07'00')>> endobj 10 0 obj<>stream H‰DI Â@EOPwøˆ=$fØÚŠ FÐ^¸!¶Ú’;AñövPŠ*õ©ŶÅÇ8°\q,– ô$Ž$“ˆ…D0€3tDCLi޲Ÿ¥©ô3‰3p_èÊÆŸX;˜ªèí˨¶j­Mïl g‰­ýé­£(”"F ÓaÌõu+=Ê8 ÕŽÞˆûÅÃ÷§3Ç?CM"ŠFªFš' 韦ôNšV¹ÿkO_Ì)5H endstream endobj 11 0 obj[/ICCBased 12 0 R] endobj 12 0 obj<>stream €pADBEprtrCMYKLab Ð)5acspAPPLADBEöÖÓ-ADBE descütcprtp+wtptœA2B0°¢A2B2°¢A2B1£¸¢B2A0EÀ8´B2A1~t8´B2A2·(8´gamtïÜ‘descU.S. Web Coated (SWOP) v2textCopyright 2000 Adobe Systems, Inc.XYZ µZ¼g’0mft2 $ÚiÙ 6 … Ç ÿ1^‹·â 2Wy˜µÒï%Y ‡!²"Ú#ÿ%#&D'f(†)§*Ç+è-.(/H0i1‰2¦3Â4Þ5û7859Q:m;‰<¥=Â>Þ?øAB)CBD\EuFG©HÃIÝJ÷LM,NCOYPoQ†RœS²TÉUßVöX Y#Z:[Q\f]x^Š_›`­a¾bÏcàdñfgh#i3jBkRl^mgnqozpƒqŒr”sœt£uªv±w·x½yÃzÈ{Í|Î}Í~ÌË€Éǂф¿…»†·‡³ˆ®‰©Š¤‹žŒ˜‘ކ{p‘d’X“L”@•3–&—˜ ˜ÿ™òšä›ÖœÈ»ž­ŸŸ Ž¡|¢j£W¤E¥3¦ §§ü¨ê©×ªÅ«³¬¡­®}¯k°Y±G²6³$´µµí¶Ú·È¸µ¹£º»~¼k½Y¾G¿5À"ÁÁþÂìÃÚÄÇŵƣǑÈ~ÉlÊYËDÌ.ÍÎÎëÏÕоѧÒÓyÔaÕIÖ1×ØØæÙÍÚ²Û˜Ü}ÝbÞGß,ààôáØâ»ãžä{åWæ3ççèèÁéšêqëHììðíÃî–ïvðUñ3òòêóÃôœõsöI÷÷óøÆù•úaû)ûëü§ý\þ þ´ÿZÿÿè§,„¿ç     üóæØÌÖÞááßÛÖ Ñ!Ë"Ä#¾$¸%³&®'ª(¦)¢* +ž,-š.•/‘01‰2†3ƒ45678€9‚:;~<|=|>|?}@A‚B…C‰DE’F˜GšH›IJŸK£L¦MªN¯O´PºQÀRÇSÎTÕU×VÙWÛXÞYàZã[ç\ê]í^ñ_õ`øaücdeeÿfügúhøiõjókðlîmënèoåpáqÞrÚsÖtÍuÃv¹w¯x¥y›z{…|z}o~dX€MA‚5ƒ)„……þ†í‡ÛˆÊ‰¸Š¦‹•ŒƒqŽ`N=‘,’“ “ú”é•Ù–É—º˜§™“š€›mœZHž6Ÿ% ¡¡õ¢æ£Ø¤Ê¥½¦±§¦¨›©‘ª‡«¬w­o®g¯`°Z±T²O³L´IµF¶E·D¸E¹FºH»J¼N½R¾W¿]ÀcÁjÂrÃ{ĄŊÆÇ–Èɥʭ˶̿ÍÈÎÒÏÜÐæÑñÒûÔÕÖ×*Ø7ÙDÚQÛ^ÜkÝyކߔàœá¢â¨ã­ä²å¶æºç½èÀéÃêÔëåìõîïð ñ,ò8óCôNõYöc÷jønùoúlûdüVýDþ/ÿÿÿØhÆ 2 R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$ù%î&ã'Ø(Ì)Á*¶+«,Ÿ-“.‡/|0p1d2Y3M4A566+7!89 ::ö;í<ã=Û>Ó?Ë@ÄA½B·C²D¬E¦F¡GœH—I”JKŽL‹MŠN‰OˆPˆQ‰RˆSˆTˆUˆV‰WŠX‹YZ[‘\“]–^˜_›`aŸb c¡d£e¤f¦g§h¨i©jªkªl«m«n«o«p©q¨r¥s£t uv™w•x‘yŒz‡{‚||}v~oi€aZ‚QƒH„>…5†+‡!ˆ‰ ŠŠ÷‹íŒâØŽÍù‘¯’¥“œ”’•‰–€—x˜p™jšc›^œYUžRŸP O¡O¢P£R¤U¥Y¦_§f¨n©xª‚«Ž¬œ­«®»¯Ì°ß±ó³ ´ µ8¶Q·l¸‡¹¤ºÂ»á½¾!¿CÀeÁ‡ÂªÃÎÄñÆÇ9È^ɂʦËÊÌíÎÏ2ÐTÑtÒ”Ó²ÔÏÕëרÙ6ÚLÛaÜt݇ޘߧà³á¾âÇãÍäÑåÒæÐçÌèÄéºê¬ë›ì‡íoîXï\ð[ñVòLó=ô*õõööÖ÷³øùbú/úôû±üfýý³þMþáÿqÿÿÙ T– ¡ ¤ Ÿ “ ‚p_L7! ðÖ»Ÿƒ}tfUA, ê!Ó"½#¦$%z&d'N(9)%**ý+ê,×-Ä.±/ž0Œ1y2g3U4D526"788ñ9â:Ó;Ä<µ=¦>˜?Š@}AoBbCUDIE~% ô€Û‚¨ƒ„r…W†;‡ ˆˆê‰Ïг‹˜Œ}bŽG-ø‘Þ’Ä“ª”‘•x–`—G˜/™ššê›Ôœ¿ªž–Ÿƒ q¡_¢O£?¤0¥"¦§§ý¨ó©êªâ«Û¬Õ­Ð®Ë¯Ç°Ä±Â²Á³Á´ÂµÅ¶È·Í¸Ó¹Ûºã»í¼ø¾¿À Á0Â@ÃRÄfÅzÆÇ¦È¾ÉÖÊñÌ Í*ÎGÏcЀџҿÓàÕÖ'×LØsÙ›ÚÄÛïÝÞFßsà¡áÏãäM噿çè6é†êØì+í€î×ð1ñòïôMõª÷øZù«úöü:ý{þ»ÿÿÿ€€å´ÍTÌ?¥~òŒ”~i˜ž~L}ãÁ~cbAþ~’Da€dþ€ü¸~t‹yä~W‰²ÊÛ~Oˆ±>~\†´—/~‚…›|“~¾„º`éƒôC–ƒx¢€äƒßú£}%—âH}”1ÉX}%‘z¯Î}K•Ö}† {N}׋<_´~7‰‰AË~Àˆ-ψø¿|¢°à‚|žÉDz|+›®E|[—£”s|«”¦z} ‘æ^•}wO@¶}ÿ-Œ~Ä‹É÷ {G®uÞÚ{D©zÆ{]¤Ä¬Ò{– f“{êœZxÚ|[˜»]ˆ|Ï•M?¹}R’‹<}ÆŽðõ…zªº]ÝYzŸ´Hħz³®‹«|zð©=‘â{L¤Nw²{ÀŸº\‹|=›>Ó|¼˜v|ÛIô8z/ÆrÜ z¿;Ãbz'¸sªMzd²6ßzɬqvÒ{D§[®{À¢0> |;Ÿ| óyÑÒÈÚñy´ÊaÂIy¸Â©?yð»açzY´ÎvzÝ®Æ[{^©‡=c{ФÓI{Rò*yŒß„ÙýyfÕÓÁUy`Ìî¨Vy”Äâyþ½’uKz†·Zi{ ±Ü<Ú{z©%žzÈŽíí‰~+Ö~ˆ}±¾Í‡}W¦µ†0}3Ž…„}HtЄü}ŒZk„›}è=Ž„Ÿ~‹‹†z€ëɇ®‰Õ†£‡}½…¹†!¥~„ø…ŒÐ„d„*s}ƒôƒˆYƒ¨ƒ<9ƒ¸‚àù…w„éû†p“øÓS…w‘u¼„œ¤ƒõ‹‰ƒu‹VrUƒ‰ÕWÿ‚؈|;,‚뇔ˆ„{‡¨èR…sžøÑ²„ƒ›ºƒ²˜;¢¡ƒ•:Š8‚ ’¡q)‚PCV÷‚Ž:4‚.Œ–8ƒ‰ŠÉæÈ„ªªÐ2ƒ»¥­¹‚ñ¡‚¡?‚U¤ˆîãšp £–çVu“ÿ9S†’ ‚šŒçåc„ µbÎÖƒ°·µ‚Rªê ¹¦.‡ÕN¡Æný ¼U€ãš38‰€ó˜8¼ŒAä/ƒ‹ÀÚͬ‚œº‚¶’δzžô6®ß†è€Ó©°n1€“¤íT\€e Ø7Ý€tžXT‹·ã)ƒ$̯̕‚6Å;µ˜e¾Cž€Ê·Ë† €i±Ýmw€3¬SÆ€¨V7M€ £\®€l‹GâN‚ÐØ»ËÚæÐN´ÄÈa5€tÁ…N€ºzlÕß´ÍS<º°H6Ѽ¥*ôŠîÝ<’a|˜Çkz|C±V޲|šÇ|ƒ—‹·|IkžŠ‚|±Ru‰ˆ}26މ'~2‹ÖÞÛF‘-†ËÆB…„°*ƒ„o™²‹üƒ‚ƒŠ­‚òjŒ‰‚ˆQ^ˆ£‚@5zˆI‚`Š˜ƒ†Ù³‘$ÄŽ"Ží®ýŒcŒß˜€Šñ‹&U‰³‰²ijˆ¦ˆ|PJ‡Ë‡v4v‡y‡ú‰V†»ØG›’Ã.2˜{­‹†•——Š’ý€ˆè¾hS‡æŽ¼O[‡Œÿ3†ÂŒˆ(‰„ÖéŽJ¦ÁÑŒx¢&¬$ŠÔžs•Ò‰h› ~æˆ2—êgK‡>•-N}†o’Ì2Ù†‘Á N‡%ˆÿÕ§±°ÇÀ›‹â¬ªöŠ>§w”´ˆÖ£A}⇤Ÿ\fX†§›ÚMµ…ݘù2,…Š—ò ¨†KˆÔ3»¥¿’‹g¶©ò‰Â°¦“¾ˆ[«¤} ‡0§ež†6¢çM …_Ÿ¯1… ? …—ˆ1Ó£ŒËÆÇ¾³‹ÀI©‰^º’ç‡ô´I|B†Ì¯dö…ܪwL‡…§e1$„¢¡: ®…‡æÒàŒrÒW½ûаÊñ¨]‰ Ãá’1‡£½S{†z·|di…‹²ÇL „½®g0·„\ ð U„އ©Ìû›ò{[¸“™G{!£ö–¸{ ŽÞ”`{&y’E{xbie{ùJrŽÚ|“/cŽ5}~ ~ÀË:šâ„ý·f˜#ƒç£•™‚üú“M‚Kx+‘CØa|ušI~÷.yWã ÏŽ›ƒÉәߎ­¶—%ŒÂ¡å”˜ŠøŒá’[‰‰w!^ˆT`ƒŽž‡^H˜*† -§ŒŒ† 5G…èȨ˜ç˜Ž´ã–=•Π§“½“4‹»‘rív†Žÿ_ÒRG±Œf‹û,ދ̋ͯŒ…ßÇ|˜,¢†³Æ•„žúŸ{“ ›¬Š„Ò˜ªtìŽÙ•ô^1“ Fî‹Å‘Ä,;‹'‘¾<‹!…‘Æ_—›¬¥²²”õ¨Yžl’~¤J‰„J tŽS#]¸Œš'FA‹4—÷+®Š”—;ÛŠL…PÅf—&¶ì±É”€±Þ‰’­ˆªÕ¨šs@å¤]Œ0¡E±Š´žÓ+:Š›È‹‰›…Ä’–ÃÁx±”»¥œÉ‘§¶‡îr°îr…¬U\}‹Ú¨™E>Š\¦A*Ù‰¨œùJ‰ „îÃâ–nÌy°g“ÊÅØœ(‘V¿…‡N#¹³qþ6´ª\‹±DÕŠ¬B*|‰iœºˆ™„˽?¥Ðzzª¢hzM–ÑŸzEƒœzrn™8zÔY,–²{dBS”¢| 'ó“ó|ýª“¦»³¤âƒ”©*¡Z‚œ–ž Ђ`šý>mÛ˜:€ëXc•€ÎA‚“¼€Û'4“ uh’‚šºˆ£ëŒÂ¨ h‹•$‰nkšˆ)lñ—]‡'WŠ”ï†f@¼’î…è&Ž’8†[/´‚Ô¹|£•õ¦ýŸ£“z“ÿœY‘9€_™N3kõ–‘V­”4Œ1@’4‹9%ù‘w‹Ùý’‚²¸–¢UŸh¦ žéœ3’þ›ª™?V˜¦–‹k•Ø”.UÙ“|’??R‘~ì%n¿‘VÓŽ™‚–·£¡È©¥5žU¥’.›¡k~‚˜žj9•V›"U"’똬>Ãì—?%'– ¯È‚}¶Ë¡W²½¤mᮑlš©Æ}Ê— ¥Ñi–”ë¢RT–’€Ÿƒ>OlžT$¬ ˜Ì‘‚i¶ þ¼¶£Æ‚·aÊš=²\},—?­Ìi”Ž©àT’-§ =ï¤Ã$e0˜›yŒ‚Yµq ¯Ç,£<-ÁA™ê»_|¥–ð¶?hˆ”@²S³‘à¯G=›Ò©¨$Žô˜leŒ‚L®¯þyäœ)«Þy¶Š§Þy²wФyædG ˜zPOùszæ:šö{ )š˜|q•Óʬί(‚ƒ›hªä™‰~¦Ú€àvû£€cc¨Ÿ›€&OSœ€#9tš€L¡™–”Ž€«ß®=‹.šŠ©þ‰ˆ½¥íˆv1¢0†ûbäž¼† NŸ›¦…Ž8Õ™,…K.˜«†F“p€«­j“癪©7‘š‡Ì¥0„uP¡h½büŒQMèšè‹88A˜jŠ¢ʗ׋³’x€ªA¬Êœ´˜Ú¨˜™Â†ó¤”—tu Ï”ÀaMK’°MBš=‘(7¿—¸ku—a ‘’€©¬,¥Ì˜/§ü¢1†H£ùžâsÊ 5›ï`ªœ²™\L¯™—k7M— –å(–_”XÄ€¨â«¹¯—¢§}ª¸…£r¦Ãs@Ÿ¬£C`)œ6 OLA™ž;6ö–€}ó•È”@(€¨B«a¸t—§³{…C£ ®çrÈŸHªä_»›Ö§©Ká˜Å¥ã6°–#¢ëÌ•O”&3€"§¹«Â^–¦¦Ä¼«„Ö¢¶·qrbžö²ú_c›†¯ºKœ˜u­6{•ݤÖ§• ” < €(Ÿ°º„ytŽÕµ«y:}Ѱüy2ld¬‹ygZ8¨dyÔF冷zj1ë¡æ{ð¢r{¾‘(€ž¦¹¶¤ŽB´Â€½}b°€ k󫌞Y¸§drFl£®ƒ1l ÞÁ°¡;€ºn€÷¸Ë‰Õš³ÞˆI|ϯ†îkUª£…íY¦z…4Eá¢Æ„Ì0úŸì„Ä †Ë€h·ó’Œø³ç|®Rûjª©ÎŒcX}¥«‹-EY¡öŠW0•ŸŠ,\Ÿа>€œÕ·FšiŒb²a—¦{{­¦•4j©$“Wí¤ð‘]Dá¡?50>žR*>ž6ޏŽÄ€œ;¶¿¢î‹Ù±ÑŸ’zú­œi‹¨™øWy¤Z—ÖD} ’–p/øž–¤'g¨Ž^€›È¶6« ‹p±D§¥z˜¬‚¤i/¨¡W%£Ôž—D9 I/Äœðœ'œ¨›Ž €›Jµ×´Œ‹"°Ô¯ÛzW¬««hé§y¨1VߣK¥°CüŸ•¤ž/œœ† 1œ›Å€šÙµ†½ëŠË°t¸ƒz«¡³¶h¬§¯ãV²¢ï­ Cߟ8ª§/‘œ/ )›¶¢Ž€‘óÅcy‚¿ÒxËrº|x¹a£µixêPq°§yS> ¬syä)¦©–zjf«Y{ C€‘7Ä‹€æ¶¾óøq¹JaJ´m~âP ¯ž~Ä=­«_~å)]¨f2…©Ã€DŒþ€ÍÃ’ˆ¨G¾‡'q^¸ž…Ü`Û³u„óO¡®Ÿ„Y=RªZ„)#§J„N¯¨O„îŒÁ€Â©k€è½#Ž_pé·¼Œ•`k²†‹&O:­²Š%=©j‰“(ö¦H‰ãÚ§‰ŒŒ€,Áè˜O€”¼[•µp’¶ð“t` ±»‘•Nè¬Ö&<è’i(×¥c¥áŠÔŒ^€ÇÁP b€B»µ7pM¶@šs_ϱ ˜,N®¬&–q<•§Ð•²(¤–•¼+¤ãŠîŒ8€fÀÕ¨”ü»*¤Ðpµª¡‡_¢°ožßN‰«“<}§:œ¬(¸£àšnN¤‹Œ€&ÀQ°õ̺¡¬“oöµ¨Ë_¯ã¥ØNw« ¤—}g€Ôu~_€Ûîjx&t×hx¬ŽQ¿×y7ŒQ§’yÌŠŸŽ¼zi‰%u7{‡ÕZ‘{º†•=v|k…‰ö|ï…ì˜vøœÕŸw…˜Ó¾ x•Ѧx¼“ Ryo¦sõz'ŽkYuzÛŒM¯1—<}ª €#}¥oha}?¡'O|}gŒ3¸}™›f Ø}É\Ø}…ÅYÂë}¿¬ò|ȸזP|™²ãD| ­mg|˨•NÚ|÷¤Ù3,} X S}(‰×d}5ÑÂ<|ÐÉç¬0|nÂÆ•‚|4»÷~„|8µÍf÷|e°—NT|—¬–2º|·¢L è|­ˆºÑÁQv’½µ‹ëw©Š©w~“~‰Žx }1ˆ—x²f‡ÅyzMž‡(zI28‡%{1 Ö‰$|yÐ<‹ñ€Ç¼|Š™€>§Ú‰cÎ’hˆU~|‡nWdû†®QL”†\15†˜ 쇋€ZÎ⊩‹»!‰_‰œ¦¬ˆ+ˆ7‘/‡0‡ zò†X†câ…©…FK…&„–0D…!„D †$ƒÂÍ~‰•u¹±ˆI“¥&‡%Ú͆.ŽÏy±…l bDŽ̋vJœ„QŠ/n„F‰Y k„솷Ì&ˆ°ŸÚ¸W‡lœ«£Î†N™žŽ…]–Âx„„˜”a„‘ÑIÀƒ“Ð.¯ƒ~Žñ ҃ᆤÊöˆªh·/†½¦j¢ª…ž¢ˆh„°žÚw‚ƒï›o`ÓƒX˜^Hû‚ê•ã.‚Е Qƒ†LÉù‡rµ¶7†1°N¡±…«—Œu„ §v§ƒf¢÷`‚ÒŸGHU‚Xœu-{‚8šIæ‚F†É,‡¿ÿµm…źg ß„Ÿ´Þ‹¡ƒ©¯’uÞ‚ïªÂ_g‚f¦¤GÇí£ù-ºžp®…ÉÈ‘†®Ë=´Í…tÄØ /„I¾zŠêƒK¸hu5‚޳^Õ‚®µGJ“ªÖ,—^ž&J5…›Â–½u„¯Y”Šv œ ’ƒv—‡ð®w6røwó]”xËE¹Œry¦+ŒNzŒ©Œÿ|œÀ¼•},®S“P~Ë›‘S~~‡ˆ~Sr í~O\Œˆ~mD΋o~™*'‹C~ú,‹l€¿Ž”WˆØ­’4‡™û6†u…äŽx…‰pÿŒê„Æ[(‹’„/CñŠƒº)cŠMƒ¹¾Š ƒ&¾o“A’§«ä‘(™˜¹7Ž¡„ÈpŒãoë‹ô‹fZ0ЍŠC‰ž‰(ª‰eˆç_ˆ×ƒ¡½G’gœ…ªÏN™²—™Ža—ƒ•Œª”…nÙ‹(’AY@‰ëRBSˆäŽÇ(ˆ ŽÊ ‡Ðƒj¼<‘¿¦†©Å©¢ø–¼Ÿ‡‚—ŒœJmðŠ‡™QXm‰@–»A§ˆ<”ß'|‡ð”;Ȇóƒ<»[‘9°§¨é%¬_•´5¨,À‹~¤4m,Š ˜Wƈ½ƒA‡©›•' ‡U˜¾†<ƒº¤Ï»¨6޽¶”ùŒÊ±‹¬^ly‰”¨0W(ˆW¤×@‡@¢Ü&ª†Öš$`…¦‚öº|ź§§ŽmÀ”[ŒxºR€`ж´òkâ‰7°NV§‡û­@-†ì¨Ä&H†™â;…/‚ݲàztáHˆuN<šÇuâ|h˜=vŒh±•éwSSè“Úx2=¡’Ey #g’IyÔJY|º±°Ÿ`}æ }œk}˜Ž|™¬}c{ª—$}Qgì”Ø}fS$’Ò}<Û‘@}á"¹‘3~T,ŽÌݰ»žF‡Ÿy›\…ô˜›„ùz¶– „3g“݃œRP‘áƒ1<S‚î"5ƒ;o€¹¯¼S1žhšmŽ`Œn—´Œ¶y·•0‹3f’ú‰úQ~‘ˆó;nxˆ9!•Jˆ³úŒ@€©®Õœp™Šv™“—‹r–â”§x³”e’se1’‚P¶3Žî:ÊŽ§Ü!ŽmŽ/æ‹=€œ­ó›Ì£œ¬˜îŸÑŠ©–8œ¾wà“¼™ådc‘}—WOÿŠ•=:8þ” ©·’àÖŠc€‘­2›M¬ ›ì˜o¨Á‰è•·¤þw%“:¡~cºÿžfOn ›ñ9Âj› U•Üȉ®€‡¬šë¶j›P˜ ±ã‰H•Q­uv…’ΩVc “¥ËN控£J9Y¡[ Œ•«½‰€€¬šœÀšÓ—¾»oˆ¾•¶Vu÷’x±¢bŸ9­ÍNzŽL«]8üŒ®¦e¾Œ>•v´ˆ¥€z¤ ª‘t9“Ÿ¦ìt¼‚±£|uOq Euü^sJvÅJ¼š¨w¢5W˜¾xk@™kx잣0©–|ã“ ¥ç|›‚$¢p|spvŸ4|p]Úœ9|—J"™›|Þ4¿—­}-И5}˜Œl€¢s¨Š…ˆ’?¤ä„…l¡fƒ¤o²ž1‚þ]›<‚ˆIy˜£‚D4,–²‚+m—‚Æ‹`€¡°§•Ž/‘c£öŒƒ€} €ŠþnÛD‰²\UšYˆ«H˗Ňá3¡•чx–ˆ8Šw€ ã¦Ô–æ—£5”š©ŸÂ’nœˆŸ[œ™‰ŽöH,–ý¿3&•/È•-Œí‰¯€ :¦"ŸÞí¢‰œó~üŸš5mV›Ú—¶Zø˜Ú•†G –9“å2»”;“‰„”VꉀŸ¥¡¨òg¢¥g~wžŠ¢lÈ›FžóZn˜Nœ[G*•²š“2b“šP“¢‘ˆ|€Ÿ¥C²4Žæ¡¤®}ôž#ªlHšÚ¦zYõ—ࣔF¾•L¢2“.Ÿt&“‘ˆ €žª¤ù»ÞŽ}¡T·!}„в‹kךƒ®zY—†«ƒFl”ï©B1Î’Ø¡¬÷’µá‡°€•ñµsĆ}°¸t7v¬¢tÂeï¨ÅulTg¥+v1A¢¢w,ðŸøw¬n¢w¬‰~€•U´"|†¯Å{´v4«ž{eާ²{–Sû¤{ÈA8 é|,žÉ|iT |¯ˆÄ€”Õ³„,…Œ®Ãƒ4u°ª“‚edü¦©ØSo£@½Ÿà[,/´g?Ÿ?‚ ˆ!€”N²ŒS„ì­ÏŠÂtû©¤‰`dY¥±ˆ?RÖ¢‡h@=žò†Ø+Òœº†Á+ž†Ê‡“€“»±S”’„T­’ptY¨Üˆc²¤éŽßRJ¡@„?ÈžŒ¡+›ÛŒ¨œîŠâ‡€“*°·œùƒË¬fšKsÔ¨8—Õc/¤A•­QΠ”“å?fY’Ã+@› “›òŒ6†³€’¾°%¥…ƒ`«Õ¢Ksh§¥ŸJbÆ£­œ§Qn šŽ?œ¿™z+šF˜” › Œ2†^€’S¯Å®Eƒ«lªxs&§,¦ãbx££ÉQŸm¡>Μ= º*ڙʜùš]Œ1†€‘û¯z·l‚Ê«³rզЮñb*¢¿«|PÜŸ ©s>ž›Ô¦Í*¼™dœå™æŒ0… v¿åsQyáºõs­jÙ¶Ct+['±ÊtÌJŠ­žu‡8“ªvF$R¨+v· Xªw† €ˆ¿{.y¹ºzÔj®µ¼ ’`x¥·bi„²AަYÀ­ž3I?©NŒ7¥¬‹–#×£VŒ> J£¹‡¢„ñ€†ß»bšSxP¶g—Öi5±ˆ•œYu¬ß“½Hù¨Œ’U7]¤Ó‘Æ#âk‘è t¢”‡¿„€†‡ºÞ¢_x µÚŸdhõ°ïœ®Y9¬>škH§ì˜Û79¤,˜ª#º¡˜–£ œ¡”‡Ù„š€†Mºbª•wÕµZ§hưk£öY«³¡eHš§^Ÿå7£¦Ÿ #ª ü˜ À ´‡ò„{€† º³>wÀ´ø¯9h·¯ó«ƒXõ«#¨¨Hˆ¦½§97¢ý¤# `˜- ñ ˆ„a€{nË1rým™Å¶s7_XÀsšPs»‚t'@ž¶ßtË/E³!ud±øuko°Mw‰ƒ$€{hÊ@zˆm«ÄÂz_^¿kyÙPpºIyÚ@™µ‡z /R±¨zVG°1z_ ®/|Fƒ"€{rÉÙm—Þ€Ø_G¾=€PN¹  @}´:m/P°Gw}®’«—¬I€uƒ!€{pÇè‰m}Âs‡ž_½†gP%·Ô……@^³…/J¯„ß­­…„ª›ƒnƒ€{[ÆìemeÁpŽ€^þ¼ŒèP¶Â‹¥@O±ßŠÏ/P­ÜЬ߫Ћ0©$ƒ¹ƒ€{9Æ%—ämTÀš•^÷»“ŽPµÕ‘ö@O°îì/a¬Ò‘ª¦ ä§áƒûƒ€{Å„ŸumG¿êœ³^÷º`šGP µ ˜f@[°%—]/y¬—yK©£“!;¦Î„7ƒ€zöŧ0m?¿[£ý^ü¹Á¡,P´aŸ@g¯užY/«VœÓx¨à“@‡¥ë„jƒ€zÜį>m>¾á«“_ ¹8¨[P*³Ì¦3@…®×¤Î/¹ª° E³¨1“gÈ¥F„–ƒ€ævpsÐwKsñ¹€xtÌ¢*xêu¯Š$y²v¡qczw£W†{OxŸ;/|1y–}!yèät‡~hÎku‰~·úv|}å Ëwe}ʈÝxK}Íp.y3}äV[z}ù:zï~ {T}Áâ1rð‰ÒÌštˆd¶_u ‡ŸFv …ý‡~w…nóx„BU>xöƒy8ùyÄ‚ÄÄyÕ‚ àiq“•8ÊÍr®’¿´œsÀl±tÑŽL†uæŒvm²vöŠÂT*wò‰!7þx²‡·”x‹…ìÞÉpu É2q’/³r«™çœ+sÅ–Õ„®t哸l|v‘iS#w Žú7w»Œþwq‰?Ýlo˜¬ ÇÙp´§º±ªqË£šÛrèŸzƒwt›´kXu5˜3R.vA•6Bvá’Å´v„‹KÜNnë·ŒÆÁp²[°‹q­1™¾r0¨<‚rs]£šjrtŠŸLQZu”›u5v%™%þu¿ŠÐÛonmÃÅåo½¯£pˆ·˜Ëq›±#…rÉ«¬i¤sý¦¶P¯u ¢{4ôu…žµjuŠlÚËnÎÆÅDo)Çä®ëp!Àó—ÿq'º6€»rO³ühësƒ®}P tŽªI4ctý£(ôtŸŠÖq¶ÁårʬôsÏ—5tÑ€uVuÝhîˆvöP1Ïx4š€YyXòy<ÔŒ}Q|À²}s|z«Î}—||•þ}À|S}ó|¹gÓ~7|÷O~}43}rA€H}ƒÓ{Ò‡P¿|†BªA|3…D”|q„o}þ|»ƒ½f¢}ƒ&N }v‚˜2“}í‚% L~ÒƒÑnz†’½ez¼¨¡z÷Ž0“ {@Œi|ª{¡ŠÝex| ‰rM |vˆ!1­|Þ‡ x}„üÏóyrœé»ïyªš §-yí—A‘¤z?”˜{fz¥’d[{"çL{“á0Ü{êŒ Â|w‡óγx›§Òº³xÔ¤¥òy qryjœæzJyÖ™‘cVzS–„K>zÌ“æ0!{’‚ ){‡‹Í®wñ²Ó¹°x*®N¤êxe©¿lx¹¥TyZy,¡4b…y®qJ„z!šK/ƒz\˜r ªzˇ6Ìäws½ñ¸ãwª¸ ¤wܳ5Ž‹x'­ëxx›© aÄy'¤·Iåyœ¡k.üyÁN Bz-†ðÌUwÉ>¸JwQÃ#£_ww¼àËwµ¶ÂwÈx$±/a x°¬{ITy'¨ò.}yAŸo ðy¯†¸Æ~ˆpгü‡3q¾ ’†rrÚŒ…Ñsîv·…Gu `\„Üv5H´„žwU-Å„ôxR܆Oy`ÅF†€z¸²ê…»zêŸs… {‹„u{Wuªƒù{§_[ƒœ| Gºƒh|i,؃²|À/„ª}uÄ…„ù±¨„\„1ž_ƒ³ƒr‰Ùƒ,‚Òt‡‚º‚T^Q‚kóFÇ‚DŸ+û‚…n˜ƒ9 ­ƒÇ*°1ƒœÉ‚|‹÷ˆq‚Š|sB¨‰6]5kˆEÕJ‡+,x†~ø„(ÁT‚½™a®Ø‚ –ý›uz”‡)’Qr€°-\5€„ŽTE€hŒ¼*x€„Œ £€æ„}À0í£¾­¸@ –šW€«d†€8šEqç—Z[Q¶”ÂDD¡’´)×°’Dþ„=¿DI®7¬Ë€ŸªN™d€¦K… Ž¢[p=Dž¸Z’›‚C¦~ö™")Q~ø—Bö?„¾€Î¸Ú¬€&´2˜™„¯`„NªŸos~·¦NYØ~•¢©C ~w p(ß~^›‚¶~£ƒÜ¾€xÃÁ«‚Ó¾c—ì$¸Áƒ“~“³5nÆ~@®IYE~ ªsB“~§0(y}æ›^ƒ~&ƒº·\‘Wo±¦5žpí”!Žr€ôŒÉs.lË‹˜tTW“Š•u†@ï‰àv¤&Š;w*Š$y½¶XáyS¥CŽGyž“ŒÔyéù‹‡z?kÖŠ_z©Vª‰f{$@ ˆµ{˜%²ˆú{ôÛˆ„}iµIŽ‹‚ê¤ ‚]’‹’Ó~׊Sij̉7U»ˆJ€ã?6‡ž€º$ú‡Î€¸•‡€¢´,MŒ•¢Ô‹Ë‹>¶Šj‰è}¹‰*ˆ´i½ˆ‡¬T·>†Ç>k†˜† $P†¶…æY…Ù–³ŒK–I¡ÂŠË”8œ‰o’-|‹ˆ:7h°‡1ŽkS߆aŒå=¥…½‹¯#³…Ä‹¹%„Ês²‹…  ¾Š YŽ˜ˆ¬š{’‡y—Úgʆq•[S…˜“1<þ„÷‘®#,„ì‘!ùƒåV±5ŠéªŸë‰q¦–Àˆ£ z¼†ÙŸg…Õœ{Rj„ý™Ô"À„0•Õƒ'=°’Šr´'Ÿ@ˆþ° ‡–«¾z†V§—fQ…P£áQÆ„ƒ ô;ðƒÎŸ_"aƒ”—?¸‚)° о‹ž¼ˆª¹ÂŒn‡;´Æy]…ï¯îe¹„â«ÀQD„¨æ;ƒd¥1!ÿƒ"–ü ‚¨›šéo˜Ž˜spA‡¥–„€ƒ(€—~ |݈C|BxGš¡½gt—÷ŒXUÑ•‹Bü“{Š5.l’ ‰ÑÊ“‰@‚l€–ן°™«‡—œ¹—zw—™ß•WfÉ—/“SU/”·‘B{’›@. ‘'’’F΀–FŸ¢‡œ(ŸÏw™D f9–ŠštT”˜AAÿ‘ü–É-´m–…a‘8ÈK€•Ξ±«—†›½¨Nv’˜Ò¤ùe¶–¡×T“•ŸQA‡‘‚ž-Xé›à9„¬€à€•užb´ð†;›k±)v"˜x­FeA•ª©®S´“*§A/‘¥:-}žv ‡€‹€Œœ¯4n~W«{oo]¨p/_y¤ÀqKNŒ¡»rh‰°SU©7ˆ­Ct¥†‡ð21¢“‡ž¡4ˆ+ñŸú„±€€}ð´þ”pO°­’@b¬q—S¨b&C%¤ªŽ1þ¡µ #à!ž£„Ò€€}Ÿ´i›æp °™¶aƫɗ™R¾§¯•ÄBâ£ö”‚1Ò Þ”z~Ÿ.’§Nx„ñ€€}j³é£åoØ¯Ž¡Pa«=žÍR†§œ©B¬£\›p1œ Jšâfž|”yœv…€€}6³›¬GoЯ+©Va„ªÁ¦]Rd¦‚£ëB¢­¢Ã1”ŸŸóvÉ”™ ›Å…(€€r¯ÅHlÞe¥À¬m´X¼9nŸIÓ·ìo•:u´p)S±4q-–±ép¸«)t{€€r¢Äwtpeÿ±t‹X:»tÕIñ¶†u@:–²vu¿)¯v!¯Äu»©éx瀀r£Ã:{¸eª¾r{EX&¹µzýIÖµ$z÷:ˆ±{)ž­ò{8n­Þ{£§Ó}.€€r•Áí‚Úe€½&øWç¸jBI¨³Ò€Ì:f¯­€–)œ¬Š€¯¬0€Ì!¥ø€Ä€€rvÀÒŠ e_¼ˆÈWÀ·E‡¶Iu²¨†Ú:Q®s†Q)ž«G†Iíª¯†‘¤U€€rQ¿ù‘heJ»ËW²¶NŽTIg±¨":A­lŒ^)¨ª!Œ…'©X‹ƒñ¢êP€€r0¿P˜Óe?ºb–àW®µ• Ic°Ï“:?¬’Â)¶©8“`¨-!G¡´Š€€r¾Ó `e=¹ÌžW±´Õ›îId°š:::«Ò™¶)·¨}˜y…§M: ³º€€qþ¾v¨6eC¹P¥¢W»´C£(Ik¯w¡k:E«) Q)ЧʜE¨¦RºŸóØ€€ÙµqlªÅr×n7¯¿to·™›uIq-‚¬vkr£jëwŠtRx u‚6zy vÀzyv­×·oWwÞÃppÜxG®IrAx·˜Ksy4ttÒy¾iÇvzQPëw4zÖ5hx!{>ÎxÂz­Õâm„ƒÁ¤o‚g¬µp™Â–ÌrI€s^€êh“t²€œOÙuå€J4lv¼ïÀwA"ÔkêŽJ¿ÕmŽŒªîoŠð•:p—‰u~°rˆ1gWsv‡NÌt´…â3€ur„ÛÖuóƒ0Òzj”™o¾;l@–Ì©TmÖ”?“®o^‘Õ}Rpâ”f%r^‘MÎs¤‹¨2¥tGŠtÔ†¨Ñ&iФ¼ëk8¡#¨lϪ’an\šQ|oè—*e qh”?Lãr¶‘¦1às?Î esã‰Ðh¹¯Ô»Ýjg«Š¦ëkù§+‘Im…¢ç{ožæd&pŸ›3Lqè—ï1:rZ– Ùsˆ°ÏGh»»i˶¦ kS°Ã^lÖ«˜z/nj¦ÆcWoø¢mKpqCžÈ0ªq—› gryˆbιg¼Æ`º€iaÀ}¥ajÚºcœlM´`ymmÚ®Ïb§oh©ïJÎp®¦P0pëŸî q÷ˆ%ÊZyäk‹·}zdmK£Ázænë{hptyU{îqúbµ||sJÒ}tî/á}Ðv 9dv7Èéwèv<¶Wx‘v䢤y-wƒìyÄx"xBz]xÊa¯zÿyzIÙ{¢z.õ|Iz k}±z¨Çev*€ä´®v怇¡w•€,ŒsxCèvòxõ¹`…y­˜HÏzZs.zå@ ¶|3~ÖÅÓt¥‹z³ ukŠ3Ÿxv'ˆò‹vä‡Äu¢w®†¿__xx…ÐGÕy-„ï-0yœ„4 zè‚wÄ[s]–±—t*“öžtð‘Ù‰—u·Ítev‰á^HwfŒ-Fíx Š,lxr‰Š“yÌ…“Ã$r[ Â°bs,לÎsòšÞˆht¾—ôsJu—•3]Kvt’®Fw4‹+½wkz"xÝ…€Â+q«~¯fra§Ì›Ís#£ù‡hsî 3r]tÏœ¬\}u±™vEjvi–Ñ+,v‡•WÄx…@Ánpø¶M®¤qDZٚúr­1†ŽsD¨“q‡t&¤M[½u ŒDÎuÉÀ*®uÇš#xwv… Àðp”Á6®q^¼šRr ¶‰…Ör¾±pÕs™¬+[t„¨D;u;¥**u#œ‚;vö„ä»n‚”jœª1‚8lx—ëùn*„yÑo¿oü¹qMZp¸rÙC€ÝtG)‚uS<ƒ»vºL€½t³©€u–³€evVƒO€Kwnå€BwÝYp€Px¦B“€xyZ(.€üyÈÈ‚ zÒ¹~ͧÂ~ù~·•˜~ß~œ‚$~Ø~†mÏ~Ü~ƒXy~ø~Aº'~’'nŽ~|b€‘~’·¼}”ˆÕ¦\}†‡î”}|†þ€É}†l}Ÿ…LWa}Ì„˜@Ì}ÿƒö&¨~Dƒ„ HÔ¶m|Y’ᥠ|P‘8’¿|P„|]Èkw|€Œ-Vh|¾ŠÇ?þ|ô‰%ÿ}‰¾~/‚ˆµU{b £ó{^𣑍{^˜~u{n•›jy{•“¬{>•Æ$ì{*” I|}‚9³Ìz ± ¢Xz ­Æøyÿ©¯|Âz¥™hÜz1¡ÝTzyžº>z£œä$zj˜R{Ý‚³\y§¼ ¡Òy§·˜Vy²¾|yƒ­éh9y¨©—SŒyî¦A=—z£|$ y͘_ü{^‚¬Ø‹½iÚœùŠ€k»‹ý‰~mpyÀˆ©ofi‡ñp˜Qì‡br$;è‡ s…!±‡õtN‡w$«óŠseœˆøtUŠîˆ u2x¹‡?veq†vâQ†w¼;…Àxx ö†jxÇ…•{ªðˆj|ÛšÕ‡{|ù‰Ù†˜} w…Ú}!dq…4}FP)„¸}u:Q„r}™ U„ô}ƒæ~Š©Ñ†ö†Z™¤†…·ˆ…>…v‹„†„ScyƒíƒÃO\ƒyƒI9¦ƒ8‚ãƃ˜‚¸‚o€¨¥…ÃÛ˜˜„àŽŠ‡ƒ„"ubƒg‹¶bo‚ÖŠdNk‚u‰J8á‚2ˆn2‚fˆ{.€§«„×™~—–ƒú—~†ƒ0•\to‚€“3aŒñ‘0Mª†x8EEŽRµXÝ€ €¦â„£2–ȃE ˆ…­‚v¬s™ÂšÊ`Ä7˜&M€Í•ò7Ç€v”ºQ€l’W€€¦Jƒ­–#‚¾©º„øç¦&rá&¢Œ`€—ŸVLS€9œÙ77ß›µø§”D€€¥ãƒ-·•¤‚`³3„^|®ër<€©ª _|€¦ïKׯ¤z6ÍX¡yž ”€€ž¦•iNÔ“&k#î‘ylÔnÌnj\ްoöIqt3Ör²‡Ž¢röƒz¼ì“”rZ‘ÈsM't3múެu[ÄXuùHUŒEvÙ3(‹­wŠýwƒ¡~’{NŽb{}~!ŽÆ{§mX{ØZàŒ |GŽ‹|_2~Šc|‘~‹||l€Z€œ·„+Œý ƒ³|ö~ƒ5l Œ‚¸YúŠÖ‚XFΉӂ 1å‰0ÍŠÙ€€›&„,ŒâŒ{øŒ^ŠékŠö‰¿Y-‰µˆ²Fˆ¾‡Ü1Yˆ‡P°ˆÆ‡X€€šRŽ –Q‹?”˜{7‹~’Äj5ŠðX^ˆÕFEm‡Ôñ0ˇ)MI‡¬Œ€€™¤ïŸ‚ЇŒZ0zyŠÍšµiz‰^˜=W­ˆ!– DÕ‡”[0^†W“ôÿ†²€€™h¨Ì‰õ‹Ø¥éyÜŠD¢Íh܈ɟ·W‡ˆD@†‹›I/æ…½š)¾…áa€€˜½²V‰„‹{®ñyV‰Ü«9hNˆR§V‘‡¤”CÕ†¢ö/†…8Ÿk…H(€€ØžáĥלLjsßšl4cÄ—ïmÅR‡– oI?씆p±+J“èq³l–Þq/€}Ð@qc‚H›rQs<˜Ãs:c&–£t"Qð”¶u ?e“*ué*Ó’uvz8”õuò€€˜œ!yÙu™ºzr}—mzMb`•Sz•Q=“jzé>Ë‘á{@*Y‘{q“/{%€€ŽÏšÌ‚=€’˜nÛq„–-ya”&P{’7€ê>*³€Â)Þ
Ò‘’€ª€€Ž™´Š¨Æ—Y‰¹p´•ˆÇ`´“‡ÞOÖ‘‡ =› †z)wŽÁ†>­…{€€U˜Æ“G–x‘Ëp”<@` ’ŽºO33`=%ŽŸŒj)"¶Œ]‹ŽÀ‰‘€€ŒÆ˜›÷~š•Ï™øo‚“‰—Ô_z‘`•¹Nžu“ñ<¥â’Í(όؒÅiŠk€€ŒU—™¤¿~"•R¢Co“Ÿ“^öÍœñNŽÜšÔ<&O™Ü(kŒ8˜KŒ¬ŠW€€Œ—=­Ä}ÔôªÜn‘’š§¨^‚V¤‘M´Ž[¢Q;όƠõ(‹¯›!‹ùŠ7€€ƒ‰©h7v<¥öiàh£kxXâ xlþH‹žnr6²œ5o·"^›ãpZX¯p €€ƒ§òpguÞ¤ÖqGg­¡çr,XŸ'sH0œ«sþ6gšÃtË"+šGu€›tu1€€‚–¦–xhu?£ˆx¢g" “xåWïÒy=G°›Ty 6™gyþ!ë˜Ìz™gz§€€‚¥B€Pt¢:€f_ŸN¶WNœŒ‚Gši5‹˜)_!¡—uX®—‹“€€d¤%ˆGsð¡$‡xeµž<†­VŸ›y…ñF–˜ú…\5—…!Z–B…¼•߃р€€Ø£K_sh Ne.aËVš˜ŒF˜‹ˆ4È–Šñ!+•$‹bÌ”`…ó€€€m¢˜‡r÷Ÿ™–Îd¸œ¨•U™Ú“ME¦—Q‘ò4w•<‘[!”èⓆ€€€¢ Órßž¹d~œœmUQ™,š8EP–•˜¦4”Ž˜a Æ“o•è’†€€Ñ¡¼©\r}ž·¦ìd.›¦¤2Tú˜­¡¥E–  -3Ù“üž| ™’Ø– ã‘;†€€v´³Ágiõ°8i\€¬åjŒN©¼l>‡¦âm\-=¤ënk¹¥—nl‰¢ªp€€vZ²ÐoRiʯ(p\W«¦pùMù¨TqÝ>p¥^r¼-:£Isj㣧sFþ 7ua€€v ±|vèi`­Øw\ªGw`M ¦ëwÃ>(£ìx--¡Çx„î¡éxT^ùzX€€u¬°~]hé¬}~[w¨ó}ÝM4¥”}Ã=Ç¢™}Æ,Рj}Ñç Z}¼¬›ú~¯€€uD®ô…áh«X….[§Ï„‡L·¤mƒó=r¡dƒ,Ÿ2ƒkÙž÷ƒ¿íš;û€€t䮊h(ªuŒrZ¯¦ã‹XL_£yŠX= h‰š,_ž‰hÒ¶‰ƒ#˜¶‚€€t”­e•=gæ©Á“ÊZn¦#’CL¢­Þ<ÔŸšî,0;Úœ•ŽYV—j‚B€€t]¬×g±©-›;Z2¥†™VKØ¢—£<”žì–µ+뜓–v»›Æ¹‰–S‚d€€t.¬~¥g´¨¾£Z.¤ü ÐK¸¡]žÉ<{ž)ó+뛾›“ÑšòȬ•Œ‚|€€j2¿f´]λ@hPã·–ipC#´jÆ4*°èkô#¯>l¢!±HkãŸs°€€ií¾=n2]Ϻ9nØPõ¶BoœCE²wpn4[¯.q1#s­Jqœµ®èpæÀx)€€iͼçud]¸Úu€PÕ´Ïu¸C&°ív4Q­v|#‘«ˆv®¬Èv&œ‰|"€€i¨»r|k]a·f|P‡³]{éBò¯w{Þ4-¬{ð#“©ò{øgªâ{Ø›h¡€€izº1ƒ]5¶#‚ÚPV²‚KB´®+×4ª·š#”¨…ž©©0®šl€€€iN¹<Š»]µ‰ÉPD±ˆÜBž­ ˆ3ü©‘‡’#§:‡Àæ§«†¸™€€€i)¸‘þ]´GÈP?°‚B”¬Žl3ñ¨›á#§¦2ŽE"¦YŠé˜ß€€€i ·ó™Y]³ž—æPD¯Y–UB’«M•3ä§Ç”¶#œ¥^“Ì?¥YŠü˜H€€€hú· ë]#³ŸIPQ®µ|B–ª›œ%3é§ ›n#±¤”˜"V¤ƒ‹ —²€€€ÍPlmfD¹çn0hu¥ÓoØjàqcl”{rßndUtOp}Llu¤rP1­v©sÖ Çx1s¶Ë\iîqT¸Xkçrg¤mm¶swŸogt†yãqu—c>r–v¥Kasúw›0±tÜxU ævtwåɈgÉ|`¶‘iÜ|\¢ákË|_Ž&m™|}x‘oV|ªbpÿ|ÞJYro}/Æs+} !tî|ƒÇ»eâ‡P´Âh †P¡j …`Œškò„‡w*m̓Ó`ÛoŒƒ/ITq‚.éq™ë vs›€¸ÆdF’4³)f|TŸƒhŽ~‹jƒŒ»u×ln‹_²nC‰¢H`oˆA.p+‡ ärx„RÄÅc!±Ýe?špž8gU—µ‰ÊiS• t¦kG’…^¥m!3G‚n¦Ž)-inæŒÅ hq„‡ öaý¨°Ôd@¤—*fU úˆ»hTks©jRš]Èl3–ÿFÇm±”T,ÒmË’ó p¹†ÄÂía<³ ° c®ÄœSeªL‡Ûg…¥ÛrÊi„¡¸\ÿkmžF$lêšý,OlÙ˜\ ¯p†ŒÂj`»½þ¯…bú¸ç›²dø³“‡%fâ®NrhÚ©s\]jÂ¥>E‹l7¢>+Ælœ¨ mp†_¾¯tŽe`­u‚g¾šlvqiwZkýrxBmû\Zy,oîESzq»+zßs€}s}½Fr=oð«ésfq;™Zturp…¶uvs˜qvst½[jwqußDvx]vä*8ywõ{[x»Àp.zkª>qrz¶—Óršzù„?s¶{BoÁtÏ{•ZDuä{ìCsvÖ|2)XwN|?zyÖ|lº)n]„ʨšo²„3–1p샖‚×r‚þnxsO‚€Y'tx‚B…unŸ(‘u·.x…€1¸®lÑ)§'n2Ô¿o|ŒPlp¸ŠßmFq÷‰„Xs4ˆRA¨t-‡;'ÞtD†y´wdƒl·xk–™š¥ôlÿ—m“nM•#€Co‘’Úl0pÙ¯W)rŽ·@âs'>rûŒVgvÞƒ§¶‚j›¤¤ül¡$’’mTžInššækGoë—ùV`q.•V@>r“8&¼qÞ’#'wJƒ|µËiß®—¤>kLªç‘Ål‘¦ø~vmÏ£jwo"ŸaU£pnœ7?¦q]™ó&Ipê–âôw¡ƒYµVib¹$£¸jÉ´·‘#kþ¯ø}Æm/«>iÏnz¦òUoÅ£g?p®¡ %Çp™‹Êwçƒ=°p|ÿd¬ M}g}TiW|–}œkghþ}ñmeTD~VoS>~Õq$«r&÷gt¯SzÑn Ÿ3{'pß{zqh{u{Õr©gó|:sãSS|¯u=8},v#C}ÉvŸ¶®xq®xÕx‘àyMyŒ¾y¶y‘zKz&zfäzœzvRf{zí¹²–ô*ð:–F²‹÷€€Ž¾…Eª÷€—„e¨Wqcƒb¥Ea?‚b¢!PX—Ÿ˜>V že*›€Ž›5q€E‹Ë€€‡|˜czi–˜eYlD”ãgx\á“dirLI’kM:6‘ lõ%Ù‘8n <“•mt€}F†Õ–ýkŠyÏ•mk™“ing\E‘Ûo¿K¼{q9¾r'%xvrÈ .‘rE€€† •HsÛxt¥jÒ‘Ùud[{QvK ŽõvÔ9.úwt%Ôw» ŽÈw}€€…H“°|wþ‘ü|LiÌ]|sZ¦ŽÚ|—JKŒ|À8‘Œ”|å$œŒX|æ Œ¼} €€„o’]„Yw*±„høƒ¡YÆšƒ1I¨ŒA‚É8‹Q‚‡$8Šþ‚g íŠñƒº‘GŒÈvr¨‹ïh?ŽŠôYŒ‰‰ëI‹.ˆý7œŠ%ˆ[#ë‰Àˆk Ù‰g†€€ƒ&t•DuñŽÝ“ðg¼;’bX†‹¨ÅHkŠMh7‰BŽ˜#žˆ²ŽÆ ƈ‡I€€‚±ÖÎuvŽBœg:Œ—™ïXŠö—ÌGꉓ–6ˆŒ•k#4‡é” ¶‡‡>€€‚Zd¦„uΤ[fËŒ¡ÇW‘ŠgŸ/G„ˆ÷R6<‡åœp"î‡9—ž •†F‡(€€z¢¥bpn &d•`«îf R ›çhŠBXšjN0â˜þkÙÁl?ߘ¡l¾€Ðyü¡Aj{m žÌkâ`4œmAQ¹š]n•B˜€oÒ0£—JpÔf—Ïq –qÒ€€ykŸ¢rXlîBs!_šôsæQ!˜Ñt¬A‚–òuh0D•±uþ6–uûR“ÅwM€€xÄžzl2›»za^Í™xzœP|—XzÜ@ì•{/Ó”<{O÷”g{1t‘À|L€€xœ¿ïkˆšr¹^˜5vOÈ–-@h”4€ø/d’ï€Üµ’õ€ØŽý€€€w†›º‰ßjú™s‰8]“—0ˆuO:• ‡­?â“"‡/‘¹†±‘‡¨Žvƒ&€€wšÝ‘×j€˜žÄ]–X†Nº”+ŽH?m’@N.ÄÊŒô†eŒ¤Ç)ƒ;€€v³šE™ëjK˜˜ƒ\Ý•®–ËNs“a• ?‘e“Ö.cû“Ò0Œ‘=ÕŒƒE€€vk™Ö¢+j— {\‹•'ž\N’ÌœD>ÒÄ›.'K™ðŽÍ’FØ‹RƒF€€n­9a“bª]c’U:§·eƒGi¥;gW8M£h÷'6¢j*¤i§˜Ónb€€mƒ¬i?aº©jTý¦FkáG@£ m*87¡`nS'? 1oq¢-nŠ—-si€€mªp³a9§“qsT˜¤´r7FÞ¢s7ퟹsº'žrt.’ s˜• x0€€l¡¨êx`¯¦xSSý£,xœFj zxï7‰ž3yA&ÝœÜyl—ž2xõ”0|c€€l(§l`8¤¯PS¡Ù+EãŸ&71œÐ~ô&›p~ò’œ†~ã’耀€k½¦‡†ò_Ù£¥†wS% Ç…äE…ž …P6Ø›«„å&oš(„Õ’›„¸‘Æ€€€kd¥·Ž}_‘¢Ò¯Rߟ猲E:‹»6†š¼‹&;™%‹J¥™¨‰¡Û€€€k$¥–_T¢&”õRœŸ3“ŸDóœ_’Y6@™ô‘³%é˜a‘¼‚˜­Œƒ'€€€jð¤¡ã_V¡¤œ¨R™ž˜š÷DØ›¢™V63™˜Ï%ü—j–窗©Œž Š€€€a³¸|`‰Uôµ|bRI¡²de`ˆ"m$gîsinøji]·p¹lÑFÇrEo,Ïs&pÝ v*q¿ d%jÑ­KfŠl…šŽh¿n,†èjÒoËrFlÏq`\¨n±rëEÉpItS+èpñu] mthuk½Ia•u§«†d vN™f}vó…sh³w¥pøjÒx\[lÐyDÊnpy¯+nÙz érÜz-»w_K€]©¸aõ€—CdlȃîfÁo—iiZRkMCÏl¾)*Blä~ívq³~†¹Ì]U‹¨ `‰Ü•²b¦ˆµ‚ie ‡—nRgb†ŽY5i…§Bçk9„Í)‰k„rY‚?¸q[À•³¦Ô^’“»”pa-‘µ1c¢¶m-fÔX·\Zy c¥Ì]Vž“j_õšº€1bp—Þl=dÞ•1Wjg’ÀAqh»¯(`hÊ|sY…¶ŽY«¥\b§|’œ^þ£¾_av knc眙V­f,™@ÖgÉ—''ìfâ•"Ds¸„ê¶ XÔµ¬¤~[µ±?’^D¬¥~º`±¨!jÏc¤Ve` ~@Mfðž'neÈ™_t„̳7nì_G¢™pOb1‘q§dé~hrögwj´t?iíUéulM?¼v¤nw&wZoü2{ q±Âl,i«¡{mÏkŒoPmP}kp½nÿiÃr pŸUsxr2>øt sš%Wutxáyruɰ1iµsôŸÍk~tߎ{m u¸{ön­vŒhzp0w`Síq¡x.=þrÉxÜ$‡ræy&™yëzF®’g‚~ž&if~-ŒÚk!~.z•lÇ~)g8ni~0RÙoî~;=q~<#Òpá~[zS~+­eŸˆGœ³g˜‡‹‹lii†ºy.k …áflÑ…Q×nl„gøoŒ÷nÍp,‹\½qEŠUIrL‰64ÛròˆcïqˈK€€žmk€™UÜH‚ûH;ŽÊ‚¡9„†‚V)0Œ¾‚7vd‚hà‰'€—€€m¬’O‹'aõÕŠ¡UTE‰äG³¿‰9Œvˆv(Ï‹ˆQu‹ãˆ‡ß€¯€€mB‘‹“ a±’5UŽy‘GiŒÓ±8¼‹tŽÓ(pŠžŠÇŒ †Ñ€¾€€lïø›a_}™øT¹Ô˜_GŒ –±8rб•Ñ(9‰Å•'ü‰ÉŽ0'†€È€€eb¦W[°Z¤^Mð¢#`e@« [b1òŸdh çŸeŠ û¡»e”mÒ€€d³¤Ìc'Y¦¢ŽdñM“ mf°@lž{hV1Òœÿi¿ óœÕjŠ Ožúiý‹ûrÌ€€d+¢èjuY  ¸k¸Mž”lñ?øœšn1›o КÁo• }œloŠ{w¢€€c¡q«XkžârzLhœÉsã™?yì0´—©z' M—-z1 Ž˜z*‡Ñœ€€bž,€VWqœ€aKu™ø€H>|—ó€0U–Nú %•¢ø •–€†´€€€b&-‡¿W›‡yK$˜ð†ø>(–܆f/ú•2†æ”m†D ¬”t… …΀€€aÕœ^+VÌšJŽ›JÓ˜¾=Ø•ýŒÛ/®”DŒv‹“~Œ¯ ‰“%ˆz…!€€€a•›Ë–ÍV¿™®–$JÅ—l”ï=½•(“¬/«“J“g±’[‘ï ¿‘숟„œ€€€Y#±­ZdN¯R\Bd­^ª5œ«`ž',©ãb#“«abhE©¶cZˆçqý€€Xp°ga}Mº­âcB#«jd¹5©.f:':§½g`ê¨ÏgpÒ¦¿hQ‡ v²€€X®’hhMJ¬ iAЩ‰j´58§8kÎ'¥¬lš ¦sl|9£ómx†gzÝ€€W®¬§o:Lߪ&oýAW§¨p¹4ç¥Uqm&ߣ¼qì ¤Nq«„¡\rü…A~Š€€WRªývLЍ‚vŠA¥ÿvê4Š£¦w3&º¡õwm ¢]w)Ÿxá„>€€€Vÿ©­}#LP§*}J@Õ¤}N4^¢7}?&’ t}3 —}ÿœï~ƒ^€€€Vº¨ „-L)¦„@¹£uƒÇ4A¡ƒl&tŸ4ƒGŸ-ƒ‡>›!‚z‚­€€€V…§Ò‹CL¥2Šý@ª¢ƒŠg42Ÿþ‰Ï&]ž!‰Êÿž‰6M™«ƒ–‚€€€Vb§4’~L ¤z’"@§¡º‘U4.Ÿ#¤&g/™&œöäj˜pƒ©€€€€µ&aSY²£þcÑ]’6f/`7†hqcLkÞjŸfFW(l®i%A*nbkÏ'ënÚmݹt£nų*]Îda¢q`šf¬Ôc6hæ~Ke®kjºh m(Vj@o.@5küq'lr^cu5sA±NZ±o ª]³pJM`ƒqŒ|Öc&rÎine¬t TûgþuC?>i»vV&Qiew uµx"¯tWåyžÝ[yÜŒ^ z9{Y`Òz—hc{SÔeê{k>Ng¨{Ä%—fÝ{ëÕv$|š­¾UxƒòFX΃uŒ[ã‚öyÞ^Å‚yfâaŒ‚RÈd¯=veÊX$òd„vƒ€m¬RSvŽf›÷VéŠÌZ‹Àx¸] ŠjeÎ_ä‰(Qçbpˆ <¾d%‡$bbu†nvÓƒ¦«-QϘ՚êUX–¶‰ÐX‘”ƒwÊ[˜’Ydï^€TQ$aŽ…<)b¸ #ð`ÈŒ¢Fwƒ‘ªPP„£6šT C‰ WZ7w Zdš;d7]T—€Px_ñ•;œaŠ“V#Ž_l‘ì&wLƒ{©ÁO˜­u™’S4© ˆxVl¥¹vyYp¡øc°\^ž™P^ú›Å;(`š#"^E– wwƒj¨hÛYI˜cj©\¯‡Ïlk_æv%nbðceoÊeÜOq_h§:"r¯k* èrñlÌL}Ïnó¦eˆcw—4g¥e䆽išh1u-kvjcb€mBl}N³nñn9tp>pE [pqL.~sǤÞbˆmŽ•dÙo…7fûpxs¸hÿqÔa8jïs&M–l¸ti8mýu|m.uù~-xe£4_×wˆ“ÕbPx0ƒ–d”xÇr_f¸yQ_þhÍyÜLŒjªzc7«kæzÏújzáý~T|f¡¨]}’``]‚-b|&pþd¸€â^èfဤK—hÔ€w6èj€Kkht€ê~uÔ c[‹{‘+^BŠ– `¸‰’oéc ˆƒ]æe@‡‚JÉg5†£6ChX…øîf«…ÚÙ~‘€“Ÿ_Yù•t2\¼“Ì€_>‘ûoa›$]câŽoJeÜŒó5¿få‹áe3‹ŒÌ~¨€ŠžX»Ÿas[ˆœ÷Y^ š[nJ`l—¿\Zb¸•aIhd¹“i57e²’7:d6Á~º€‚žWØ©6ŽêZ¥¦ ~Ã]#¢§m²_{ŸN[ÐaÄœXHõcš4Ãd¢˜åËc “x¸~É€|›6p²X÷ŒÕqÌ\`}grñ_l¼tbŒZáuDedGÁvgh2òwhj`^wÍkZ€r™ám‡b‹£nîe|1pAgik£qŒi¡YårÑk¾Fætmº28tõo`ÒtÉoÜ€vȘ…j¡l Š?l@mÇ{m½oUj…o&pÆXîpƒr(FqÉst1™r¥t|cr&t“€zâ—hu™ˆÁiËv~yƒkgwFi:lìwùW¾nlx£EoÂyA0Çp‰y·ÊoìyŒ€~q• eƇgg¦Ýy•lÓ*ŸzGn@ˆ{…mö€zŒsjµ~½t lyp{tãn`åu»o¢P2vq>w]r]* wísE=yrË€}µŠÕp“s²}kq¨tÀo)r¡u­_èsv‡OOtzwK=guOwû)Žu½xivìwð€€‰“nk|®|Po™}n p©}W^¸q¥}zN]rž}š<Šs}}º(ÝsÆ}áu%}ž€€ˆ‰l¤…¶{Gmã…zmnÿ… ]Çp „‚Mqƒÿ;ãqÛƒ™([qÿƒeZs¡‚ú€€‡²k,ŽºzulyÞlAmœŒÃ]n«‹‘LÆo°Š{;Hp~‰¦'úpp‰i.rY‡p€€‡ j—¹yÍkX–Dk•l|”\]m‰’©L#nŽ‘:ªo[ö'€o'ìqPŠ%€€†—i$ ³yOjž´k kžœQ[Ðl¡™ÞK§m—Ò:En_–®'n •e§p‘‰è€€×‹X]uXX[—gÆZ^¡Xì}awHÁ¸d7‚'fq"уgø焤g߀ys€Ë~¶`âth~Êc_fÔ~íeµXgçH `iò6pÊk¹"g€„lÉßélš€}º| i]s9|Vk)eÍ|—lØW|ÜnfG2}-oØ5¾}–q!æ~q¶Å†q›€€~˜y¦qÊrz r÷d–zhtV.z»t÷F[{ uÓ5{‡vˆ!t{Ôvв}pw €€}€w‰zKpùx zÜcŒxy{IU,xÚ{™E´y?{á4‹y©|!yÀ| ª{¡|–€€|uׂÞp,vk‚ßbÍvá‚­T_wF‚\Dåw¬‚3òxß ŸwãÕƒz\€€{Ëtq‹jofuŠÞb u‰ŠS¥uñ‰(D4vXˆ]3\v ‡Ù Jv;ˆrxØ…U€€{1sR“ðnÎsû’àasts‘StÕC£u9ŽÌ2ËuzŽ+ÜtàŽ cwÎ…«€€z¾rxœ|nWs'šý`ós›™R“sò—C5tI•2ttz•s¶’Ö,w …†€€uNŠ·WÚi€‰ûZð\²‰|]ÞN¤‰'`›?4ˆþc-ó‰Je)ŠùeóõŠg€|_tXˆ_çh³‡™bS[è‡.džMø†ÙfÅ>©†«h¹-ކâjKOˆ0j»,‡lkú€ƒsj…‘gçg¬…>i³[ „ékfM#„¡lù=ø„xnd-„¡o}…™o N…q6€€rpƒ?oßf¡ƒqYö‚Çr8LJ‚Œs>=4‚pt#,m‚ŽtÊœƒ6t²]ƒ vÍ€€q}Bwàe¹x‘Y€êy"K]€·y˜<™€“yü+耩zBH€ÿznD{À€€p¦òdï€#XRU€'Jµ!€ <~øð+³~éå3~óè½ø€€oö~9ˆ da~:‡ÆWÏ~ ‡=J+}ʆ”;r}›† +)}}…Ô÷}*†–~vÀ€€oi}&$c×}/rWE}ŽgIª|µ<:õ||Œ`*¤|QŒ<{´‹[Ÿ}jÆ€€ný|S˜Kcj|`—BVÓ|,•¿I;{Ö”":—{“*[{I’ÿQzu| ¼€€i”W ]ГHY÷Q®’U\ÅDQ‘•_b5y‘%a°$r‘¢cUO”Œc'ˆ iš€~Ôh’#^¨]‘`ýQ !c8CÌQeN5ŽÌg$>h[i‘mgú†"nd€€gQ¶f7\@ŽÌgýPPçi­Ck=4Œ‘l•#âŒÂmn^Ž‚lé„^s§€€f~qm¼[^ŒžnÿOb‹Ép*Be‹q<3슀r #oŠ˜r7‹Ïr‚¼xš€€e¯‹}uLZ–мvN›‰ñvÂAž‰.wP3fˆŸwÈ#ˆ¢wý ‰Sw”N|倀d÷‰â|ðYî‰0}KNˆg}{A ‡Ÿ}2Þ‡}™"Ù†Ì}£ ‡}µ€€€€dZˆˆ„‹YR‡æ„wMh‡ „/@v†TƒÐ2Z…°ƒŠ"€…Xƒ‰3…!ƒG€€€€cÞ‡€ŒEY †ï‹åM/†‹$@?…,Š;2/„g‰°"6„Š僠‡ò€€€€c|†±”X­†!“|LË…M’S?á„O‘1ãƒsn"‚í*Û‚]Š €€€€\àžñUßRBYXŸFÀœ[E9ùšû]¸+‰š}_¾I›Í`¸„œJaƒ£mI€€\œÝ]Q¬›Y_UF7™ôay9•˜Àcr+Q˜e P™e´ߘÝeã‚r1€€[_š…dCPõ™eüEŸ—½g¢9–„i&*ê•ÅjV&–‡jµ•œj䀗w€€Z¶˜@kZP8–çlžDÑ•—mÎ8j”anã*j“Ÿo±Ý”3oÎ.’±p#€{e€€Z –LrO’•s[D0“·t7Æ’|t·*‘«u-”’u!1*uÞ€.€€Ys”·yÈO“}zCC±’.z•7QézÃ)˜zßq-zÌ;ø{Ñ€€€€Xð“kN–’>;CLê#6í—€ì).Ž¥€Î Ž©€ëPŒ€à€€€€Xˆ’\ˆ`N/‘:ˆ;Bçæ‡Ä6ކ‡6(Ü~‡·s‡G+Š£„Ù€€€€X7‘ŽåN r£BÃŽÎ6oÛ(âŒWÂùŒŒ¡r‰T… €€€€P¦ªaTMFb¨˜VÒ;M§ Y=.ì¥ä[i †¥Ù\÷—¨£] `|€q.€€Oƨ”[*EĦÌ]7:¿¥_2.…£Á`÷ [£mb+Ç¥²ble€uø€€O=¦SaïE-¤–cŽ:A¢ëe.¡~fy ¡gVÑ¢ág šÞiî€z<€€NǤ h§D£¢YiÞ9¤ ¶k-¡ŸIlÀž¿l‘Æ ?l(˜wo+€}ÿ€€NK¢ oqD+ kpN93žÅq-+Lq¤Œœ¥qöÀÙqŽ5–u €€€€M× jv`CÊžÓvð8ä(wU,뛞w‘Xš×wœØ›©w^q“ÚzT€€€€MsŸ}UCƒ}¢8«›Ï}°,·š7}ž&™]}ŒÑ™å}µ°’ ~΀€€€M$ž„YCJœs„q8š¶„2,™™ƒß ˜ƒäª˜wƒ{µ™€{€€€€Lñ)‹C(›”‹†8d™Ð‹,†˜ŠŽ–óНÙ—ˆDÝg€–€€€€©ÎZêS©™­]ÇW|ˆó`†[5wPc,^Ìd¨eºbCPáhe•;ÂiÝh£#%ipjéçygl˧ÂV£^ ˜Yà`þ‡‡\îcÆv _Øfxc€bŸiOÖe"k:ÓfçmÐ"eeØolÈyœqg¥ÜRÌh–GVUjs…ûY§lLt•\Ænb2_»oßN¶b^q9åds!±b±t­yÊvb£ùOSrÝ”zS sÚ„| X_ê|VEŽb(|¤1­c|å°cD|dQ‚„µ‡Gg{Q*Ðgh{4jz{o€€ŠY ‚|Ò\j‚n¢^òß_eaF O'cgd=e ;*Me$,æh÷;€€‰W™‹O{çZ}ŠžmÅ]‰¼^–_ˆÈNda®‡í<úcK‡B)éc'†ÿ³g°†C€€ˆ\Uö”‚{1Xí“'m[•‘Ž]ì^êM¿`6Ž{<[aÎq)oanI‚fªŠb€€‡ÙTº™zªW½›Ÿl‚Zg™V]^\Ò—ME_•;ú`“Ó) _ï“h$eï‹—€€…0q’S@xjr–Vój¥s³Zx[¥tØ]ÉK^u÷`ç9—wc»%™wùe× ºzÄf€uƒÇmÒ\w7o0_ip„aÎZ¥qÍdsJ‚sfí8át"i$% tÈj¶ w÷jª€yá‚pj]dÝuÒlghXmƒi2Ynîk)I˜p@lÿ8#q^nž$‚q¼o² eu‚oŠ€}€g3m°tpi o7gj¶p¡X•l@qòH½m®s"7}nÌt+$nátË Ns^t³€€ºdrv€sHfswceÜh>x"W`iÝxÁGÏkZyT6¤lxyÓ#ml9z q›ze€€~ bYr7d9šdÜf­VpgУFôiT˜6j_˜"÷iÊ£ ßpÇ€€}¼`(ˆ&q^bZ‡ÊddL‡4U®f ††F=g˜…ë5ph“…‚"¤g¤…Š ËnÏ„C€€} ^‘åp³`ÔöcdbÐŽ»U d”kEŸfŒP4Ôg ‹¥".eØ‹é ³mê‡<€€|‹]W™’p2_¨˜ bÛa¥–JT„cd”aE)då’Ö4xe¾’!Édb‘Q knd‡ €€xýyîRþmzbV` {YöQ×{°])BG|h`0ÿ}Ab®â~ld#„€édí€y w³v`[Hkõw(^/_wò`ïPÿx¸c…A”y}eæ0tzGgêˆ{hñ›~)i²€|Àv}s c—j°teÔ]üu góOüuêië@¹v¿k¸/Åw}m5wËmÖœ{Ån¹€ïuDpkßisq:m}\ºrOnþOsEp`?ât.qš/!tßr–¦tºrâŸy±t(€€tmWt7hKn°u:[¢oÞvNpçvÞ?joÎ}œ.pR}½áoˆ}˜x<~‚€€r:i3„ùf¡j¾„äZl „‘Lxm%„"=ºnƒÄ-nnuƒ—˜mˆƒÞšx8‚ƒ€€q’g§FfiCŒ±Yxj–‹ÍKäk°ŠÎ=(l“Š,Ül߉º+kö‰Ì™x:ƒ€€qfq•e„h”ŽX÷ip“"Kejƒ‘ž<½kX€,Šk…_Ðj´Žˆlx‡‚ý€€lÅ‚ÙR{a‚‚ÍUçUH‚ôY,G˃9\=8Öƒ¡_'Ù„xa,ô†»a•ƒ:e®€|k–„ZN`Á]!Tf€_ÐG€UbS8C€¹d'tkfDׂûf_ jb€6j„|Sb#_o|Ëd^Sv}2f|F.}hn7‹}øj'&ê~Škg”‰k?€oz€€imyfiø^Nzk¡RQz…m-EKz÷n˜6¿{hoÎ&L{Ûp¡9|pH€tþ€€hcvÕqÓ]TwrõQ]x%sõDQx¢tÑ6#y u%Èy`võyøuž€y gst yÅ\puxzbPˆvzÕCšv{%5vÿ{d%}w{’×w¹{`€~ €€f®rȳ[Ës½ÛOötkÅC tãŒ4éu9c$÷u/d©uÚ‰€€€€fqI‰š[4rM‰UObsˆ½B‚stˆ4gs»‡‹$rs‰‡›Ktj†Á€€€€e˜p‘†Z¾q(êNëqàÛBrK޳4 r~Ž$/r!Ž6s?Šð€€€€`¦ŒoQ˜V‹íTÜJw‹©Wý=œ‹•Zä/‹×]e)^ú €Žj_)€ii€~p_‰RXþU+‰[»IªˆÞ^U<õˆÄ`¼.¡ˆîbÆɉùcø ¤Š¨cý€n)€€^Ÿ†A`cT-†1b˜H׆d¯Å’§\]2ˆ’D^›$g’ˆ`OØ”ç`™Ô‘ bi€qø€€RË‘ ^?HÜy`g> ìbm1؇d9#ä¯e‡›‘¤eŽËgg€v䀀RŽBe@HÈfñ=(Kh1/Œéiá#TjÐJŽ“jŠðl¤€{<€€Q9‹ÈlUGD‹im–ß¡Œ;MÀd¹|ïQœg"lŠUAi{[ X¨k¾H[Šmè4š\óoÚ]Jq$š}Ktâ˜èEE÷RÞ€C2‘S €X«W)€¨º}€å” :–Šq†J@‰ˆw±Eˆ§hI‰‡ÔW;M“‡E\P­†{2.Q5†!gUʆ’Â}0’õ8”?…e=À’vvùBíÄgnG˜5V¹K»ÖDÜNÔŒ¶1ÃOŒ1T¯‹ËÈ|ý4’36´„¾;ò›vqAB˜†gF –KVlJ?”cD¥MY’ã1‰M^’P÷SÏðÍ|õ8“ƒZ¾Mî…C]aR v[_ýV9f}bŠZ/Udù]ûC=ga/Oh@d±ªiufT€mÒ‘yU™W™ƒÕX»Zþu-[¶^Je^avT£a1dxB€cjgJ.¹d]i·Nf`jÚ€r°šPäaI‚Tmc×s™W¹fPdZÏh¯SV]¥jòAc_ñm-Ñ`nÚ±càoŠ€wbÊL“jë€GPsl§qõTnVb´WRoòR)ZYqx@j\¯rç-] t8a¸ts€{vŒH®t†~ÅLÛu{p’P­vca`T,wôW~Ô+õVÀ ‡^dX€€‰ˆB[‡ž|~G‡ n—KD†m_žO…ÍO”R~…C>XTÔ„ß+›TL„ÄU]¢„ú€€ˆ¡?ðÿ{²DÊ­mâI0ŽJ_M&ŒóOP•‹Ð=ËRÜŠù+-RGŠÆ*]뉛€€‡ÿ>š{C ˜mVGŠ•õ^†K’“òN O ’E=‚QE‘*áP­‘ß^i@€€ˆaìN zÃdRl±f&V]›h9YìMVj.]‘;¤kÚ`ï'òl˜c©“pëdh€q´†'\ùWyH_‹Zwkcaþ]¶\{dQ`ÓLYfrcÃ:Ìh)fu'Bh‡h”Cnhÿ€vh„nXb`Fw´[[bßj-^ec[\`£gÅKibèj: d¡l &¹d’m™k‡mÅ€z‹‚»T0iivWykBh•Ztm Z]0nºJ?_ pJ9aUq´%ù`Èr½ ¸ixrÏ€~#2PkrˆtªSôsªgAW)t¹XÔZu²I\\Ÿv8L^Kwq%g]ƒx ~i1x:€€ëM!{§s€Pá|f6TG|oWßWV|µH{Yö|ù7²[}C$öZÌ}‰ Ri|~ €€~áJM„´rŽN<„xe[QÊ„WTøƒ°GÀW¥ƒY7Y&ƒ)$¦X‘ƒD ˜YaÒ.ŠY”y@[žtÓ„y€€pÑqsMâer“Q¤XxsÍUUJÑuXÞ;Ív-\ *çwC^Ùx0`§~æbZ€xÚolëUÜc»njYW_oÜ\.Iéq6_!; rjaÐ*RsZdCt d×Î~¤g!€|„m–h§]÷bRjx`‘V6l#cHØmei:&nÝgˆ)šoŸi7Çp}i­à~†l*€¼l5d´f`øfÄhTâhœi÷GÞj6k½9Fk„mM(ðln‚]mnn©ó~eq–€€jãa#nF_¸cfo¤S»edpíFÊgr8£hns"(mhÃsçjÉsÚ~.w€€iÅ^v€^È`vwPRçb–wÿEôd\x7Íe£y'Ùeªyx®hšyg~0{ô€€hÜ[K~«]í]ã~ôR` E6aò 7c+'GbÞ/qf»f$~ú€€h%Y†À]D[»†Qy^ †D _ã…‰6‰a…)&´`a…&eT…D0}þ€Î€€gžW-ŽÆ\ÅZŽ3P÷\^6D"^2Œ"6 _?‹j&g^a‹‰°d8‰ó~5€¸€€dãz MZYÜz¸PøN{ˆT‚A|dWÝ2t}LZÛ!”~€] Ì€ ]x€e€{´cEuÂTßX¨vÁXLýwº[@*x¤]Ø1Èy‚`S!zgb ´|¬b=€jH€~ôañq§\ƒW]rî_Kîta?/uc×0úuæeÐ vxg |yAg€oV€€`°mÕd2VoQf4J°p—h>7q¬iß0r~kYÕr³l? 0vXl €tÑ€€_„j\kèUlm_I¤min¼=,n‹oó/xoOpùKoqˆ þsÐqn€y²€€^vgFs²Tit¤H¾jœut†ª€€€€Xóƒ\L`N«ƒ–OÝC„„S>7 „šVa(¼…€YV‡‰Z\q‡Õ[¢€i5€~WxNS|M„ÕVŠBy€`Yq6,€ñ\(±^Iñƒ3_C„`n€mñ€€VH{ZZ³LT|]@A{|É_ª5>}_a×'S~c‘k~ûd/Š€¶eV€s$€€U+w¢aõK1x’cý@VyUeä4Xy÷gš&ˆzhæÓzøi/s}Üjo€x €€Tt9iGJ)uRjÎ?Uv/l63bvÐml%âw7nXGw„n^Z{ioã€|r€€S&q,p«ICroq»>„sdr¦2¡tsg%7t=sët‡sÓbyCu߀€€€RQnwx Hsoçx©=Äpöy1õq–yk$¡q›yŸ¢r&y€xJ{s€€€€Q¦l'tGïm̸=Xn÷±1¨o‰$eoR‰Bp:°\x¢€'€€€€Q%j?†òGol†é<ÜmA†x19mÎ…ó$md…Ûn¤…¸Qxµ‚뀀€€Lï J×C`jN68ÕƒQi,½ÿTDU_VW €‘ÝVö‰Š\4€l­€€K“‰ËQ”B8‰æT‹7µŠWP+ÅŠY¾™‹˜[l 9[Ö†N`߀qŽ€€J……úXgA†KZé6¼†”]<*׆ó_;܇Ô`„ 䈞`¿ƒTeº€vˆ€€I‚T_G@‚ÈaO5«ƒ#c+*ƒd¿ „1e« ˆ„·e€ªjÞ€z뀀H›~ñfM|°np3þ}6oh(q}}p"û}¦pl ~†p‡€vU€€€€Føy1t]=•z-u3\zËu§'æ{vrzçv Ô|6vl€{G€€€€FOvÐ{l<ëx{Ð2½x¼{ø']xí|úx„{û mzo|­€x€€€€EÓtÛ‚¼<‡vD‚à2ow ‚Ÿ':w9‚K$vr‚[ Îxµ‚€€€€€€@™™EH«7²˜­Kå-£˜”NÔ!ª™QQ;yœ2RSR™¾T`„²_Š€p €€?7•¼O6T•ŽQÙ,,•™Tb K–@Vfn˜¡W/ •Y?®d@€u€€>A’Ux5:’Wá+’>Z:’×[  ”Ã\ÒÏ^.€i#€yt€€=oŽ}[ý4PŽŸ]ö*ŽÕ_©gd`èÿ×a*ªc:€nV€}X€€<š‹bš3t‹id&)D‹­et™Œ"fK§fg™‰Åh‡€t€€€€;ˇòi]2¦ˆ‡j(ˆåkk‰Bkñ?‰¤kÖ¦‡n0€y;€€€€;…)p)1ô…þpï'ø†wqy†¿q´熮q†–„ÅtS€}˜€€€€:|‚»w 1]ƒÏw|'v„ew®.„—w¨£„Iw’nƒz+€€€€€€: €ª~'0çö~O' ‚¬~1ã‚Ì~‘‚\~.‰ˆ~ÿ€€€€€€ÿÿÿÿÿÿmft2 $ÚiÙ 6 … Ç ÿ1^‹·â 2Wy˜µÒï%Y ‡!²"Ú#ÿ%#&D'f(†)§*Ç+è-.(/H0i1‰2¦3Â4Þ5û7859Q:m;‰<¥=Â>Þ?øAB)CBD\EuFG©HÃIÝJ÷LM,NCOYPoQ†RœS²TÉUßVöX Y#Z:[Q\f]x^Š_›`­a¾bÏcàdñfgh#i3jBkRl^mgnqozpƒqŒr”sœt£uªv±w·x½yÃzÈ{Í|Î}Í~ÌË€Éǂф¿…»†·‡³ˆ®‰©Š¤‹žŒ˜‘ކ{p‘d’X“L”@•3–&—˜ ˜ÿ™òšä›ÖœÈ»ž­ŸŸ Ž¡|¢j£W¤E¥3¦ §§ü¨ê©×ªÅ«³¬¡­®}¯k°Y±G²6³$´µµí¶Ú·È¸µ¹£º»~¼k½Y¾G¿5À"ÁÁþÂìÃÚÄÇŵƣǑÈ~ÉlÊYËDÌ.ÍÎÎëÏÕоѧÒÓyÔaÕIÖ1×ØØæÙÍÚ²Û˜Ü}ÝbÞGß,ààôáØâ»ãžä{åWæ3ççèèÁéšêqëHììðíÃî–ïvðUñ3òòêóÃôœõsöI÷÷óøÆù•úaû)ûëü§ý\þ þ´ÿZÿÿè§,„¿ç     üóæØÌÖÞááßÛÖ Ñ!Ë"Ä#¾$¸%³&®'ª(¦)¢* +ž,-š.•/‘01‰2†3ƒ45678€9‚:;~<|=|>|?}@A‚B…C‰DE’F˜GšH›IJŸK£L¦MªN¯O´PºQÀRÇSÎTÕU×VÙWÛXÞYàZã[ç\ê]í^ñ_õ`øaücdeeÿfügúhøiõjókðlîmënèoåpáqÞrÚsÖtÍuÃv¹w¯x¥y›z{…|z}o~dX€MA‚5ƒ)„……þ†í‡ÛˆÊ‰¸Š¦‹•ŒƒqŽ`N=‘,’“ “ú”é•Ù–É—º˜§™“š€›mœZHž6Ÿ% ¡¡õ¢æ£Ø¤Ê¥½¦±§¦¨›©‘ª‡«¬w­o®g¯`°Z±T²O³L´IµF¶E·D¸E¹FºH»J¼N½R¾W¿]ÀcÁjÂrÃ{ĄŊÆÇ–Èɥʭ˶̿ÍÈÎÒÏÜÐæÑñÒûÔÕÖ×*Ø7ÙDÚQÛ^ÜkÝyކߔàœá¢â¨ã­ä²å¶æºç½èÀéÃêÔëåìõîïð ñ,ò8óCôNõYöc÷jønùoúlûdüVýDþ/ÿÿÿØhÆ 2 R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$ù%î&ã'Ø(Ì)Á*¶+«,Ÿ-“.‡/|0p1d2Y3M4A566+7!89 ::ö;í<ã=Û>Ó?Ë@ÄA½B·C²D¬E¦F¡GœH—I”JKŽL‹MŠN‰OˆPˆQ‰RˆSˆTˆUˆV‰WŠX‹YZ[‘\“]–^˜_›`aŸb c¡d£e¤f¦g§h¨i©jªkªl«m«n«o«p©q¨r¥s£t uv™w•x‘yŒz‡{‚||}v~oi€aZ‚QƒH„>…5†+‡!ˆ‰ ŠŠ÷‹íŒâØŽÍù‘¯’¥“œ”’•‰–€—x˜p™jšc›^œYUžRŸP O¡O¢P£R¤U¥Y¦_§f¨n©xª‚«Ž¬œ­«®»¯Ì°ß±ó³ ´ µ8¶Q·l¸‡¹¤ºÂ»á½¾!¿CÀeÁ‡ÂªÃÎÄñÆÇ9È^ɂʦËÊÌíÎÏ2ÐTÑtÒ”Ó²ÔÏÕëרÙ6ÚLÛaÜt݇ޘߧà³á¾âÇãÍäÑåÒæÐçÌèÄéºê¬ë›ì‡íoîXï\ð[ñVòLó=ô*õõööÖ÷³øùbú/úôû±üfýý³þMþáÿqÿÿÙ T– ¡ ¤ Ÿ “ ‚p_L7! ðÖ»Ÿƒ}tfUA, ê!Ó"½#¦$%z&d'N(9)%**ý+ê,×-Ä.±/ž0Œ1y2g3U4D526"788ñ9â:Ó;Ä<µ=¦>˜?Š@}AoBbCUDIE~% ô€Û‚¨ƒ„r…W†;‡ ˆˆê‰Ïг‹˜Œ}bŽG-ø‘Þ’Ä“ª”‘•x–`—G˜/™ššê›Ôœ¿ªž–Ÿƒ q¡_¢O£?¤0¥"¦§§ý¨ó©êªâ«Û¬Õ­Ð®Ë¯Ç°Ä±Â²Á³Á´ÂµÅ¶È·Í¸Ó¹Ûºã»í¼ø¾¿À Á0Â@ÃRÄfÅzÆÇ¦È¾ÉÖÊñÌ Í*ÎGÏcЀџҿÓàÕÖ'×LØsÙ›ÚÄÛïÝÞFßsà¡áÏãäM噿çè6é†êØì+í€î×ð1ñòïôMõª÷øZù«úöü:ý{þ»ÿÿÿ€€æOÎXÍ™¨~Í´Ú™~yœ£~eƒLÆ~…j…þ~ÀQ¿€c=9€üÅ~|‹4äµ~c‰lÌ@~]‡Ì³š~n†fšØ~˜…C‚~Ù„OiZ/ƒgP®¯‚¡8€væú¼}6–qâû}0“’ÊË}>ϲ:}iŽ^™“}¬Œ,€ï~Š"hN~uˆOÁ †7A胬øã|.¡·áA|3¿É3|M™ð°Â|…–W˜E|ß“Ë}OógV}ÑŒµNï~|‰M6‡g…\÷7{c­ߥ{f§ëǪ{‡£ ¯`{Éži–ø|+™ø~²|¯•·fn}C‘AN.}ýŒ{5å~ô†ïõ¼zʸUÞ/zDzÆCz䬮{,¦a•Ü{™ Ú}¤|$›Ye•|È•¨M‚}‘5[~‘ˆ_ôwzRêÜìzF¼2Å z]µ ¬ùz§®;”é{§›|Ù{¶ èdØ|`™ÝLí}5’P4è~=‰§ócy÷ÏÛØyãÆ@Ãúyò½ä«÷z:µì”z¸®$| {[¦@dH|åLo|ê”ã4‰}÷ŠÅòuy´ÚZÚëy—Ð2ÃyŸÆ”«yã½j“;zd´j{w{ «@cÂ{Ì¡–L |¯—34=}¾‹¶îSˆÛ~6׆‡Ä}ÂÀŸ†Ã}p©Œ…æ}U’R…*}u{„†}Æcăñ~5Lƒx~é5’ƒ(€ì=‡}ˆËÖ†p‡@¿k…ƒ…ã¨c„»„Á‘„ƒßyÔƒ”ƒ-bœƒ‚K’‚Â4Ø‚Áêz†G“eÔt…MÚ½ü„oŽs§ ƒÄŒXíƒ9Šwxʂʈ½a¶‚i‡JÍ‚&…L43‚ƒoèÛ…OþÒà„_št¼zƒŽ—¥«‚ç“莴‚r‘ w»‚ŽA`ÖÇ‹dJ—ˆh3¢‹…ç\„‹¨ Ñlƒ¤»‚ÔŸº¤[‚7›”€Â—•vºx“»`9²Iu‹e3$†{æƒñ³KЃ­º¹Í‚:¨X£2££-Œ{6ž uÈ€î™_J€¾“ÛH䀯Ž:2¹€Á‡ÏäÕƒs½øÎú‚‡·V¸µ¼°â¢/&ª¨‹Ÿ€Ä¤Šu€ƒžU^§€T—ÑHi€SÙ2`€rˆûãփȥ΂$Àâ·ÆW¹S¡J€¿±úŠÐ€aª»tk€.£\^)€›•H€“;2€0‰þソÓTÍ7ÖÊY¶úÁš ˆ€n¹Š#€°¢sÚâ¨]·ÆžýG«ЕV1ÜûŠ×Þ‘â|°Èîñ|c³±Ž|:ž;Œh|GˆŠÞ|rʼni} ]‡ü}¨G{†™~“2Q…9ñÜ*´†—Ç”ŽÁ…R²’Œô„<6‹Wƒ[‡Ž‰ä‚¶qÒˆˆ‚=\+‡3ØF¹…é¢1Ë„¢Ú£Ž•Æ9¨ŽW±r‹ÝŒ>œŠWŠp†xˆøˆÙpЇµ‡h[H†w…üF…F„Ÿ1T„ƒ4ÙBŽ›š—ÄØŒ¿—l°‹”kšÈ‰‚‘¤…Rˆ9oÙ‡Œ¨Zƒ…ØŠ&Eo„º‡0샠„¯×îᤔÇŒ  ®ºŠ[œ›™ˆÞ˜ä„:‡•Onð†k‘ÕYÎ…JŽ4Dè„=Š[0‘ƒ5† ÖµK®œÂ\‹w©­™‰Ê¤Ä˜‚ˆR ƒL‡›~n…á–âY+„Î’DsƒÐŒÿ0E‚Ú‡DÕ§ŒÐ¸£Á\Šÿ²°¬¡‰Q¬Ú—›‡Ý§*‚††›¡Šmw…z›ÐX¡„b•ÐDƒsl0‚ˆVÔÂŒj¦À†Š»²«Ïˆñ´Ô–ч{®Ά=§[lã…) ‚X6„™NCÁƒ'‘œ/Ñ‚N‰AԌ̩¿ÕŠMÄ «ˆ£¼¥–'‡-´¾7…ñ¬Þlg„à¤ÕWÔƒÙœmCx‚ô“…/§‚ŠÎO›{€º¢˜Y{Q¦ï•¬{F“ “'{s~èÆ{Új¨Žu|wVˆŒ"}9B–‰Â~P/B‡BâÌš„Ò¹—<ƒ¾¦”—‚Õ’4’ ‚$~Ó­iÚ˜cUÆ‹Y1Aü‰7.zËB™Ž!¸D–EŒ.¤ù“ŠZ‘.‘7ˆÕ} Žú‡}iŒÑ†JUŠ¥…Atˆp„ .¥†‚úÊ!˜—Ž·•c”¹£Ë’É’WŒ|Ž-Qh Œ‹)TX‰ùˆù@ò‡Û†Á.e…Ÿ„^Èÿ—f ö¶”­D¢¯’™¿Žú½–i{ ‰“3gQ‹S¾‰mŒÍ@Ї]‰a..…4…¡Çì–Øª`´þ”"¥×¡®‘’¡pŽ 91zL ™f—Šø”ÎS6ˆðt@0†ï‹Ó-ÿ„؆ÁÆû–d³¿´ “®®V ×‘©AŽÈ£ÑyžŒ¡ž§f Š“™cRƈ‚“â?熎 -Ø„Œ‡»Æ.–½³e“N¶Ä !À°|Œ’ŽiªDxþŒF¤e‰ŠDºRkˆ6—?ª†A -¸„LˆÅ…•¯Æq²Í’ü¿Ÿ‰r·Æ‹þްwx{‹û©(e ‰þ¡²R‡ý™ì?p†‘Â-Ÿ„‰@¿ ¤‡z­¬É úzš|z–ˆšzØur–Þ{Vb´“¥| P*[|é=áŒî~ ,j‰;Ó½¢£œƒp«âŸò‚|™Îœsµ‡n™%tÅ•ï€Òb ’Ç€®O‰€¦=nŒ5€Ü,Iˆ—Y¼ƒ¢©Œ6ªÜŸŠn˜ì›…ˆÏ†Œ˜A‡usó•†PaR’…PNóŽÙ„[= ‹ƒ…,,ˆ‚Ä»‚¡Ý”ì©ÐžD’[—ÙšÌù…•—~Âs”d‹Í`˜‘T‰æNfŽ4‡ú<²Šû†,‡„„º¥¡è鎚e–çš!—4„¡–Ú”&r<“©‘?_橎kMᔋ}›Ù¹Þ”V˜j³‚)•0¬Jp’ ¥‰^*ž¤L™Œ —;Ÿ‰+Å…ôˆ‰°®(z&ŸŠ©Íz ŽŽ¥~z}€¡HzjlJ!zø[˜ð{ÀJ ” |±9j}ÿ)Ћį\­R‚fžÔ¨Ù‚ޤ„€Ð|þ P€Zk¿œ2€"Z}˜€I“Ê€69!K€“)àŠk9®w¬kŠŸž§÷ˆ÷R£‡{|GŸs†Gk›]…HYé—E„sI“ ƒ®8䎛ƒ)î‰Ï‚‘­´«›’Ï.§4jŒs¢ãŽ2{{ž±Œ5j\š£ŠpYT–’ˆÁH°’`‡8¯þ…n)ú‰GƒÉ¬íªýšõœj¦–—Ô‹ª¢I”çz´ž’,i°™ùƒXÍ•òŒøHT‘ÅŠV8‚q‡¥*ˆÑ„à¬Dªb£7›É¥ýŸR‹ ¡°›™z„˜i#™f”…XV•Q‘H‘0k8ZŒð‰¯* ˆn…Ô«ž©ï«^›D¥€¦¨ŠŽ¡-¢y¯h³˜ï™TWý”æ”åGÅ»M8>Œˆ‹‡*ˆ†¥«©—³hšÃ¥­ÚŠ Ê¨ly1œž£hT˜“ÛW°”•˜|G“j’ì8*Œ5%*‡Ø‡Tªƒ©L»dšW¤É´è‰´ u®…xÕœM¨Ah˜F¢ Wx”K›µGn/•38ŒŽ‚*‡£‡ã¢á·üyÇ“²Ìy£ƒ<­ªy¸su¨–zc™£}z¬S¿žH{ƒDF˜ß|†5J“}ç'ŒÙ¶¡ä·-’w±è€°‚Ö¬¼€ s§£¨c+¢Œ‡SX]žCñ—úÖ5,’D€U'¼Œ¡?¶F‰B‘Û± ‡°‚O«Ø†Mr„¦Â…9b¨¡®„\R뜆ƒ®C¥—*ƒ5‘ƒ‚¨'ò‹p‚b ·µræ‘D°>Ž¥©«Œ•qì¥òŠÄb  ç‰-R›Æ‡±C`–q†:5Ù„Ú(!ŠÞƒˆ ,´Ç˜‡·¯’•”ªi’Ùq[¥LOa¦ 3éR#›‹›C'•Ή@4øC†ä(HŠa„Ÿ›´B %7¯œy€£©Ö™p•¼aDŸ¤’‰QÕš~UBù•8Œ4í¿ˆÁ(i‰÷…nŸ.³º§°Ö®z£@€I©LŸpœ¤5šò`ýŸ%–îQ¡š’ÛBÖ”«Žª4åFŠf(…‰ †/ž·³\¯® ©Í€¨Ò¤´p^£±ŸÍ`ž¥šúQq™š–B¼”T‘4åŽî‹Ú(›‰Y†ÏžM³ ¶g<­®°4˨sª0p(£W¤d`œžPž´Q[™H˜ïB´”“ 4ꎶ(­‰ ‡Q•ìÁýy‡2»òyPx‘µøybiü¯ÿyÂ[g©ëzhL죡{O>ë|b1…–}Ó%tŽo©•<Á&€Ø†Ñ»ùxEµ\i®¯[¨ó~üL¦¢§,>½œ€1“•€%Ü”ÙÀ2ˆ†kº3†‹wë´+…;iM®"„AZ¼¨ƒ„Lb¡¼‚ú>š›-‚‰1¥”@‚K&6Œæ‚8”‘¿P.†¹Tw‚³O‹hí­<‰mZh§%ˆL% å†µ>~š_…t1¸“„„S&„ŒHƒN”B¾“–H…Ƹ’“yw3²Šêh™¬zŽ“Z%¦XŒeKø 'ŠT>k™¬ˆ<1Ë’â†3&Nj„B“ä½ý]…{·ð™Üvõ±á–›hf«Ò“’Yö¥µ¥KÖŸ}Á>_™ ŠÓ1Ý’U‡æ&þ‹R…“‰½ƒ¤N…:·h vıQœh?«A˜KYØ¥/”¢KÄžüñ>X˜ƒ-1ì‘܉e',Šõ…Æ“M½«…¶å¦ v§°Í¡Fh,ª¿œ¿Yɤ³˜RKºž‘“Õ>U˜D1ú‘qН'QŠ©†Z“¼¢±µ„ò¶t«¿vŸ°Q¦h'ª9 ¹Y̤,›ŽKÇž–W>n—º‘2‘0‹Æ'oŠn†Ñ‰•Ì$yp{õÅ6y(nf¾hy/`ì·ŽyS°xzND~Ù}46Ëé~}ð²y¹„ÏÚ-z4ƒÊÃ*z³‚è«Ï{;‚2”4{Ъ|ˆ|vBdá}.€ãMU~€Ÿ6:€hîÌxYØjxåÚÁŸyx‹Òª^zŠ’êzɈ}{d{‹‡cä|_…†L}}[ƒþ5L~›‚?íw3›1Ö®wÈ—ï¿øxh”بày‘ò‘˜yáTzAz»ŒÃbò{§ŠK¸|¹‡G4­~ ƒýëivG¦UÕvÞ¢¾rw…Þ§wxA™ìMy–y(z’rb {Ž–K|,Šo4$}…êu“±oÓ¿v'¬½vͦצ7w¡Ï/xnœæxyi—ýa9z|’ëJ_{²m3¯}‡èÚu¼{Òu•¶»ÿv7¯º¥$vû©”Ž=wä£wQxês`z— IÔ{K33M|ˆhççtœÇqѰu'¿î»u¸{¤7v‚±+`wq©øv›xƒ¢®_òyªšüI^zö’»2ü|t‰Œç'tUÒAÐötÙÉ›ºLujÀÿ£nv$¸€Œ¢w°uôx+§ˆ_jy[žŽHùz±”ú2¼|6Šâ™„x̓…xx¸ƒxá¢8‚«ydŒ ‚\z u¼‚zÙ_€ð{ÃIUâ|ì3|‚~uàႎ‚©Ì\‚æ·³?¡(e€ÁŠé+€kt  €9^s€þ€Hu€2àZ€IßQAAÊÁ€Ù‹nµ–€‚‰¸ŸÅ€Mˆ>‰²€.†ðs”€)…¾]€5„ŠGº€dƒX2V€¿‚Ý¿€(—ÅÉ%Ç”ô´|’Bž\P¹ˆtKnr‡\‹1\·ˆãGņt1Ý€4ƒ¬ÜDB¢Adz~âž{²š~ šÒ~€—J‡A~‚“Ýq‰~ª“[ï~à F{9‰m1tº…0Úú~¬¾Æt~1¨±c}î£X›ã}Ӟņ=}ßšHpž~ •Ð[9~V‘6Eô~ÂŒ;1Q†ŽÙè~·2Ål}¤±~°\}^«Çšä}C¦!…^}Z ‘oæ}’šòZž}á•E~\ŽÑ0Ð~ù‡ÃÙ }—Á˜Ä–}:ºâ¯|í´š|Í­M„‘|禛o9}-Ÿ×Z}‡˜ÃE!~‘+0“~¯ˆÎØf}JËîÃî|îÄ'®Å|˜¼5™D|o´;ƒà|ˆ¬Xn¦|Õ¤`Y¬};œDÓ}È“=0c~t‰­ÒïŒëvÙ¿’‹|wW«½Š-wÝ—_ˆþx|‚©‡æyCmцÞz4Y…Þ{FD{„ñ|¡0Z„~kÑu‹”€Á¾dŠ5€<ª£ˆôÑ–Z‡Õ†¯†Òelè…ãgX@„ý{CÌ„,º/îƒn€*Ð&ŠTй½‰‰5©ƒ‡É‡Ê•4†¿†“€›…Ð…ƒkñ„ù„‘Wm„,ƒ¢C+ƒw‚¿/‚ÔÒÎΉB”¥»´‡ø’7¨†Îâ“é…˳v„õ‹´jú„3‰ÂVªƒ|‡ÃB‚Û…¯/9‚Kƒ]͈iž„ºh‡"›4¦É†—ú’²…”Ù~d„1‘Îjƒ…ŽÚUú‚Þ‹ÄB‚Pˆy.ñÓ„ÆÌ[‡¾¨i¹L†z¤6¥´…W  ‘¬„b›í}yƒ•—ßiG‚é“ÎU]‚TœA²Ø‹.³l† Ëf‡3²D¸^…ò­'¤Ç„ΧÿɃڢß|²ƒÊh¤‚s˜ TÙÝ“=AWr~.€‡'Ê †Ç¼·œ…椄c¯Õƒj©¡{ü‚ª£wh ‚2Ti‡–¥A §.V€ÎˆÊ †uÅÍ·…<¾À£Y„·}Yƒ°%{b‚Q¨ÔgÀ¡hT?™°@ŀᑈ.4€•ˆäû•øuޱʓ²vrŸo‘wŒ”‘wÉy\©xªeþ‹Ëy¸Rˉëzê?Ĉ |k-i†$~`Â|”Á4°Ð’ƒ~Øž„m~“‹¶Žz~rx…Œ¢~ye5ŠÙ~¥R‰~ç?;‡G[-+…t€ ÁY“¢ˆ¯¢‘o‡@{Z†Нw…w–‹°„Dde‰üƒŠQhˆF‚×>Á†”‚6,ô„×ÀE’“‘Ø®|lºœKŽeª‰§Œ}‹ÇvžŠÌŠ c‘‰)ˆbP‡‡†¯>P…ï„ò,Å„Kƒ¿'‘¾›&­t˜˜1›<—•Qˆ‹‹À’‰u¨Š×bň€5P)†íŠv=í…d‡,œƒÒ„b¾'‘¤s¬vŽø «šBŒøœè‡¡‹%™5t׉x•‹b‡ç‘ÜO¦†bŽ=™„ë‰þ,yƒk…޽N˜­®«¥Žx© ™sŒv¤`†ÚФŸ¶t(ˆþ›a…‡s–XO9…é‘l=U„‚Œ5,\ƒ†’¼Ÿ1¶ÙªúޱW˜ÃŒ«µ†-Š9¦sˆˆ– Z`ÿ‡š”NÛ…””Ž=„,Ž.,E‚·p¼ß¿÷ªrƹ†˜.‹À²Û…–‰å¬sˆA¥S`“†ÆžtN†…O—U<áƒóß,2‚•ˆ'µŸ=u2¤cœ(uΓb™7vzñ–ewEp,“£x:^Fáy^LŽz¨;6‹,|D*­ˆ~T´ž)}ü££›}·’®˜'}ŽD•[}Šo~’¤}²]£ò~L 2~j:ÔŠ` *‡e¼¢­š … ‘Ñ— „ €d”bƒÑn²‘¹ƒ)\ó‚ŸK~Œi‚:}‰©»*†Ák²)œ)b¡ª™%–A‹¼{“~ŠmÝ䈜\EŽQ‡-Jý‹±…¼:1‰„J*ƒ†1‚ȱL›K˜ Å˜Q•tוv’â~’»bmû[ ”‹¥J…‹‰89ìˆl†²*y…´„°tš« Ú —°e”Ò™ú}Î’–¡lb€“R[ ŒüÿJŠwŒ‘9°‡ïˆò*p…J…¯»š.©yŸQ—5¥:Ži”U ó}%‘œ²kÎ ˜uZ“Œ‰”&Iʼný¬9‚‡„Šù*i„ò†¯!™Î±þž½–Ô¬ëÔ“ò§¾|“‘6¢ˆkHޤTZ#Œ.˜Iz‰¥’‡9[‡+ŒÄ*c„ª†Ò®ª™ºvžF–ˆ´T“£®Y|ã¨j׎P¡áYˋݛŽI6‰a• 90†òŽI*^„p‡x§¨ºtÁ—~¤Üu[‡¸¡v w›uvâg9™ÎwæVÄ–yF¡’Ezx6àŽD|*(/‰þ~H¦2§Ä} –ó£à|χ6 |·wœs|Éfµ˜Ñ} VI•'}xF7‘^~6¨m~È(K‰8Ñ¥¦¿…=–3¢ä„:†ŸƒXvj›|‚¬f—ã‚*UÁ”GÊEÑŒz6xŒ«L(dˆŠ;¤Æ¥Ï[•f¡ü‹ž…±ž>Šuªš™ˆŽeg—‡FU7“}†EqЄÛ6L‹ÿƒ¯(z‡ò‚…¤¥•j”¦¡?’ø„î…¥tç™ãŽqdÈ–JŒJT¹’ÈŠ;E%ˆ6(‹d…ê(‡pƒ«£c¤c” ˜š`„OœÞ—CtN™<”9d<•¦‘7TJ’Ž8DÔŽƒ‹'6ŠÙ‡õ(œ‡„¬¢Ï£å¥–“Š ¡¤ƒÔœV´sϘ¯™ÎcÆ•"•òS푟’ D—ŽŽ5ïŠg‰Ï(©†¦…‰¢N£ˆ­z“Ÿ·¨Àƒ]›ò£õs]˜FŸ+c_”ºšgS˜‘A•D`§–5ÛŠ ‹n(´†[†B¡è£?µH’®Ÿj¯¸‚ö›¡©ÿrø—ò¤>c ”ež‡SWD3_’×5ĉόÊ(¼††Ù™¬²lti‹<­Çtú|©:u­m¾¤³vŒ^° wO¢›`xâ@þ–vzO2Ü‘D|%ö‹·~<™±‹|<Šå¬Ü||J¨B{ômi£±|^VŸ|rOQšc|û@¿•€}£2Ñ[~Œ&<Šã¶˜¡°‰ƒêŠ]«â‚ö{Ò§B‚*l袴]áž >Nó™w@‚”Ÿ€â2ÇŠ€ç&zŠ)˜"¯–‹{‰Éªô‰Û{.¦ZˆblY¡Ç‡]b?†N’˜¡…@G“Ô„2¿ŽÒƒ&¯‰ˆ‚G—˜®Î“‰<ª/ºzœ¥—Ž—kÇ¡Œ–\íœuбN:—äˆá@“!‡2¸Ž.…/&܈þƒ[—®5š†ˆ¾©“—z#¤÷”´kU e‘ô\‡›ÔBMð—5Œ‘?ê’}‰Ø2³ž‡'ˆŠ„K–«­¥¡ðˆZ©žEy¤jš¨jùŸØ—\8›J“™M¸–® ?Í‘æŒj2°ˆº'!ˆ*…–G­F©7ˆ¨ ¤Ìy†£õ YjµŸQ›ñ[õšÂ—™M~–:“8?«‘ƒŽÁ2¯Œ»Š2';‡Ü…•ô¬ü°a‡Ð¨M«)y=£œ¥Ôjqžõ †[¿še›QMZ•Þ–?˜‘4Ç2¯Œy‹l'O‡†L¼Rt¢¶ãt r±„uQdd¬v7Vœ¦wTHë ®x«;¼š˜z*/0”#|$I~0Œ¿»x{‚}¶{Bqð°{;d9« {oVm¥l{ßHÆŸ|…;«™‹}L/R“#~W$nŒdžŒ„ºn‚².´ÿÇq©¯„ c骀šV&¤c€]H”žœ€M;˜˜•€T/p’?€Œ$Í‹€éŒA¹l‰¾~Õ´ˆ5q?®Š†ÚcŽ©…ºU×£n„ÐH_²„;…—·ƒ?/Š‘u‚œ%Šñ‚‹ï¸•¾~‚³*Ž˜pç­²Œ c2¨+ŠÒU”¢‰(H1œã‡˜;v–ô†/¢Æ„ƒ%dŠ_ƒ‹—·ñ—¸~4²”ðp¡­’Kbó§xÉU[¡Þ^Hœ)Šÿ;j–Gˆœ/¶-†<%Ÿ‰äƒö‹E·pžŒ}ó±÷›pi¬o—¾b¿¦à”U0¡L‘VGô›œŽ+;e•¯Š÷/Ȩ‡Ã%Ή„´‹¶ö¥2}ű|¡p?«ñœöb›¦_˜óU Í•GÚ›)‘ ;\•</Ù5‰%õ‰-…RŠÔ¶¦«½}±±¦Óp1«¡Úb…¥ÛœúU ?˜CGÙš¡“;j”ÓŽÞ/ðŽëŠ/&ˆë…Ñ ÆdsötŠÀ4tdgþºu [i³¬uóNÜ­wB‚¦ x6Þ´z+Ê–å{õ"E޶~%Åzùt™¿Oz§h¹zž[g²‘zÛNØ«Ü{^B‹¤Ü|6ã‡},•É~*"×À‡Ä`°t‡¾;€Ágð·ì€ [J±m±Nê¶B‰£¾¥6þœtÖ,`”Í€;#UŒê€ÅÃDˆ7tp½ †ºgƶ҅t[)°P„tN¬©¢ƒ´B…¢·ƒ7›}‚Š,ž“ð‚%#ÀŒ3߀ûÂSޝt[¼*Œ£g°µ×ŠÏ[ ¯V‰-N ¨¦‡¹B‰¡Í†e7/š¤…,Ö“0ƒæ$‹˜‚Ö€ÜÁ”•tK»`’~gªµ [ ®ÂN §Ö‹˜B” ü‰ƒ7J™æ‡u-’Œ…{$h‹ƒª€½Àù›bt@ºº˜#gª´S•[­Î’N©§+5B¤ ZŒd7e™C‰—-3’†Ý$§Š¬„\€ŸÀ~¡rt9º3Œg¯³Â™»[­5–N³¦—’B²Ÿ×Žú7|˜Ê‹y-X‘ˆ$ÚŠU„À§Pt8¹À¢³gº³Dž[-¬²™´Nɦ•rBÏŸ]‘=7š˜c-x‘=‰%Š…eæ·v±shÑUw“tK»†xpu4¥:yHv*Ž¡z$w9wï{xeaO|yªJÏ}={(4¯~»|ÿäµt×~sϳuá~+ºvà}ú£íwÛ}çpxÛ}ôvÚyê~`S{~JI÷|_~–4}û~üâåsM‰ŠÍñtiˆ¸…u†Ä¢}v•…¨Œ+w³„¯u¿xâƒË_dz&‚âI4{•õ3p}L€äá(qü”Ì3s#’¶ÔtF¥ ýuqkŠØv¬‹jt w÷‰s^}yW‡iH€zá…<2ì|¯‚²ß”pèŸzʦr›óµKsA˜ˆŸŒtx•B‰uÄ’s‹w* ]¢x¢‹ÕGÛzCˆ_2z|$„^ÞApªUÉYq?¥×´rn¡ažNs¬ˆpu˜Àr‡vw”|\×xGFy¼‹V2{­…ãÝ+omµÈJp˜¯¥²ïqª As¤©‡teŸGq»uæ™Õ\'w”%FÈyJŽ1É{G‡;ÜRnó¿ºÇvp¹M²q>²¶œ\ry¬†¤s᥎qupžò[šw˜F\xë”1†zóˆfÛ³n¥Ê#ÆÚoÆÂ²±apÝ»›œr³;…êsu«~p`u £§[v½›wE÷xœ’Æ1Qz¯‰a× rÚs9¯€(tNšÉ@uh…ªdv—pb–wå[3ØyNF€>zõ1~€Þ|ýÕ£}f|™Âr}‹|š®h}³|£™¸}â|Á„ž~|ûoi~m}OZQ~Ñ}²Ef]~71€!~äÔ#{ó‡À×|(†¬í|`…˜R|©„(ƒe}ƒkn\}p‚ÂYq}ñ‚D¸~˜p0‘u€´Òžz²‘t¿Dzïi«`{5n–õ{Œ‹Œ‚.|‰ÔmU|‰ˆ%XŸ}%†fD}ç„‹0/~Ü‚gÑ.y¨›Æ½Ýyê˜Í©þz9•Ý•¢z’ü{-l[{ÀtWÝ|sŠ—C}L‡/Ú~Uƒ÷ÏùxÙ¦¼¬y¢0¨ÒymžB”ƒyØšZ€zd–}kw{’œW-{ÙŽžC|ÈŠI/’}â…aÎýx5°L»³xz«}§×xǦŒ“Žy4¡”'yËœ¦jÁz„—¥V˜{V’mB«|WŒÙ/W}†ŸÎ9w¼ºhºïx´ª§xG®®’¼x¯¨›~ayK¢ŽjzœmVzñ–BR{ú)/&}0‡±Í¯wjÄ^º\w¬½¦¦_wè¶”’xE¯Z}¹xà¨$i‰y¯ ÖU¤zš™·^‹- † Àd€Æµ*®¦€%° œ-‹ª¡‰6¥ v2~ÙŸxcG~Ì™×P¸~Ò”>pÂ,ðQ‡¿í€t¾¡®Õ¸˜›Š1²ˆ‰~¯«_u–~o¤¯bÊ~iòP[~}–ü>2~»,ׇչw®pF©Žæq’—øLrІ‹ÔtsÑŠiunaZ‰vòO‡¥x›=†Pz+¦…|ó¸~Dy•¨,œyê—ŒzC…7Чz®r÷‰J{6`•‡ü{ÝNl†°|š<‰…u}ˆ+~„C~²·zù‚˧Œc‚?•ûŠá¶„,‰…Kr ˆ;€ù_͇€¾M̅ЀŒ<„®€j+Zƒ“€T¶hŒÅŒ¥Û‹9Š”Ã‰È‰6ƒ&ˆp‡éq‡=†¶_†…M4„ÿ„b;»ƒùƒ,+:‚ù×µN‹Ì•&¤×ŠC’ö“»ˆÙÁ‚‡Žp,†dŒh^>…[ŠOL „Rˆ;aƒ^…È+ ‚sƒ6´Z‹ žI£à‰‰›M’Ȉ ˜9-†Û•o`…¶’]”„­ŽáL$ƒ·‹©;‚Ùˆ4+ ‚„m³’Šv§U£ˆ÷£‡‘ÿ‡ŒŸŒ€j†F›|n²…)—j] „)“FK¿ƒ2Žú:Ø‚fŠh*ö¡…|²öаH¢wˆˆ«¤‘T‡¦¹À…Ì¡¦n„±œ‘\€ƒÀ—gK]‚Ò’ :¢‚Œ^*çR†b²ˆ‰®¹!¡úˆ8³ŸÂ†Â­³)…l§mŽ„N¡j\ƒa›0K ‚”Ä:kÄŽ *Ú‡«Z™Ào»œ#—+q ŒN”ÇrQ{Ò’s¢jëCuYߎv©I‹¶xf8š‰dzs)‡|쪓˜x›q–xç‹“§yX{‘eyÞj:/z„YAŒþ{KH”ŠÂ|,8Hˆ„}B)†5~™©Ã—C,𔨀¾Š²’‚€^z:O€irŽ)óX™Œ åH‰ãâ7þ‡ºù)…€'¨Õ–+‰´™€“ň‡‰¥‘z‡ey[H†Oh§6…YW÷‹*„kGž‰ƒ}7¿‡‚Ž) „ß“§ö•+’K˜›’Ð]ˆ½ŽqxtŽfŒ„gïŒOЦW`ŠYˆÕG5ˆX†ò7ˆ†]„ù) „U‚ܧ*”ršß—å’˜1ˆ וpw·°’©g<‹£äVЉ­Fχ¼ŠA7Q…Ô‡8) ƒàƒþ¦“á£S—6‘Ÿã‡ZIœIw ˜f§‹”îVX‰)‘1F~‡5R7(…^‰>) ƒ„÷¥÷“t«¥–ª‘%§l†ÇŽÛ¢òv}Œ«žTf Ц™²UåˆÁ”üF/†Ò 7„ý‹) ƒ/…Ê¥•“#³Þ–<×®Ö†Iއ©juüŒN£Êe¯ŠDž'Uˆb˜sE높™6Û„¹Œ‹) ‚ï†wÍ£ o[¥Ÿµp£€ùœ‹qîq™ssJb4–StÇR‘“#vpCJØx>4hŒqz_&¢ˆá|ä6¡ôw£'žªx€p›}xq<˜`y'a³•ByæR’zËBïŽÝ{Ì4A‹†}&ˈ~€œ™ ÉÄŽjŽiÇš`"pŽ—La”:~ÿQ¢‘$B•öF4в’&ð‡Hû›âŸ²‡Æœ~†·~ê™[…¸oÕ–I„Ô`s“H„Q CƒXB>&‚¤3û‰õû'†¡T›"žÏ´Œá›žù~,˜€ŒHo•sŠ£_ß’k‰P«x‡xAôŒi…Þ3à‰L„9'*†‚‰š…ž—±ŒBšâ•D}—Æ’În~”·T_W‘²ÝPHޏ‹hAµ‹ºˆç3Ɉµ†H'@…˜ƒ—™üyŸ‹ÌšVœn}—2™)mÿ”•Ô^Ý‘’ƒOéŽ.)A|‹,‹¸3´ˆ9ˆ#'S…3„~™Œ§D‹Z™ï£i|Ÿ–ÅŸPm‹“¦›^s¨–äOŽÂ’¢AAŠÅŽG3¢‡Ô‰Ä'b„á…@™8œÄ®ÚŠÿ™Ÿª<|9–n¥@m$“H ^FšõOJa•ÆAŠq‚3‹‡Ž‹!'n„ …ßoƒ·¨~pBv¤qŽh šrôYÚœŠtK˜˜Wv9=Ê“ùx0ƒezN$Š™|Û…«›vÚƒl§‰wCuÊ£‡wËgÉŸ…xxYŠ›qyPKW—DzR=’ï{r0ˆŽj|Ð$Љ±~hªy~y‚æ¦r~)uU¢k}ögMžl}óYš`~K–A~Z=m‘ú~²0‹ˆ3%ˆæÓš©`…ð‚P¥^„ût¯¡_„fÄaƒdX¦™e‚ÏJ¬•T‚M=;‘Õ0ŠŒ¿q%Qˆ6¨vX¤y‹Ãt Š?f1œƒˆÍX7˜ƒ‡qJY”ƒ†%=Y„Ô0ŠŒƒ†%„‡Ÿ‚=ŽŽ§Ã”¹G£É’ƒs¤ŸËKe½›ÍŽWЗ͋òJ“‰Ì<즇£0Œ‹r…l%®‡!ƒ:Ž-§$›û€â£0™s>Ÿ1–+e[›2“2W|—5:IÝ“-<<׊30Šç‡%Ò†¸„צ½£€­¢ÇŸ‘sž¸›Òeš¢—ûW7– ”.I’¬_<¯Ž•Œ†0Š|ˆ˜%î†c„Å“¦rª€j¢r¥Õr¾žY¡?dΚ=œ‡Vú–7—ßIq’D“7<–Ž:ŽŠ0ŒŠ1‰Ô&†…W„»¶Fnªxa±ƒoÚkƬÈq&^é§ïr–Që¢ßt1E“uÿ8§˜ wõ,ô’8z="¢Œ'|Ò„µnvxJ°™vxk««¾w^ͦÍwÇQС³x¸DõœkyÙ8¬–ë{-%‘'|#‹0~S„L´M};wú¯}|ñkhªš|Î^…¥¥|èQ” }/DЛU}ž8¦•â~&-N3~Û#xŠX¯„³(„.w›®\ƒMjù©~‚^-¤‹üQJŸƒ˜D¢šVM8›”ô-o[€ò#͉ž€çƒ­²0‹wC­h‰žjœ¨ˆF]Ì£š‡Qž…çDv™t„Þ8” ƒØ-ŒŽž‚à$ˆÿûƒY±u‘ìv÷¬«æjS§Êå]†¢Ô‹óPËËŠDS˜©ˆ@8ˆ“d†o-¤ø„¡$Rˆz‚胰嘞vº¬–j§+“P]N¢/¢P—*ŽD6˜ ‹h8‡’¿ˆÌ-ºi†/$„ˆ ƒ²‚Þ°iŸvŒ«˜›ái릧˜|] ¡¦• Pnœ ‘ªD—ŽF8z’BŠæ-ό$­‡´„Y‚®°¥‚v…«;¡ ià¦5i]¡™PXœ ”ëD –ýÊ8ƒ‘ÏŒµ-⌛ˆ¦$͇m„áyÀ0nem}ºËo€aεJpÇV ¯€r=JG©\sæ>¸¢áuÉ3ÊœwÔ)¨”íz1 ú‘|Éy¿iuom—¹äuÁaç´3vQV"®GwJ_¨x'>Û¡›yg4šØzË*“Â|q!Œˆ~>y¾>|m¸¹{ÏaÖ²ÿ{µV ­ {éJU¦Ø|R>æ j|ì4(™µ}£*U’¹~‹" ‹£Žy½‚m\·¹a¡±ÉUç«×€¢J<¥±€m>åŸR€X4E˜°€Y*˜‘Ï€~"yŠß€¹xç»õˆím?¶s‡•a€°º†aU¿ªÉ…QJ-¤¥„k>æžYƒ¦4`—É‚ê*Ò‘‚H"ÖŠ8¿xÆ»&Dm-µ™gat¯Ø‹™U´©å‰ãJ"£ÅˆG>ìy†Ã4z–ý…K+Rƒå##‰¬‚ x¨º…•lm$´é“ap¯–U°©%Ž2J £ ‹å>ôœÊ‰¦4“–N‡q+2½…Q#b‰:ƒ]xŽº ›am"´]˜jas®•PU±¨ƒ’6J¢n4>õœ;Œ?4¤•ɉY+VB†‰#•ˆÝƒúx{¹´¡&m'³ê‘a|­þ™ÀU¶§ø•èJ$¡ã’/?›¸Ž‰4´•YŠ÷+mŽè‡‰#¾ˆ“„yÚ¥qðm*ƦsQnIJ+t¤pW uêq釴w0s‰r&x…uB\µyówGm{”y#2­}Š{“ضoÛxÅqkx‰°Ærãy›ätOy’†”u¾z4q"w=zë[ÌxÔ{¯F­zž|”2%|¹}¤ÖïnƒÃ[o¿‚Q¯DqT®š{rÞ5…Wto€×pv€ŠZêwÑ€=Eýy¿ô1­{ûÕ4lÏÁnEŒ ­’oìŠc™q‘ˆÖ„ sC‡unûu †Zvé„¶EZxøƒ81D{QzÓ¢kG˜}Àm•Ŭ n½“—Œpr…‚Èr;Žmít!‹œY?v‰DÅxJ†X0éz¼ƒ2ÒXjI£¾ÏlŸvªÈmɛȖToˆ˜#«q_”ŒlôsVöX€uoGD?wµ‰J0œz;„ÁÑPi­—½ËkI© ©¿m¤X•MnÅŸ€¾pªšîl-r²–2WÝtÚ‘CCÏw6Œ0[yφ"Јhï·ì½j¶²w¨ëlh¬¹”qn'¦Þép¡ kxr+›-WUtd•CovÎŽ{0'yu‡SÏþh¼|jS»”¨Hk÷´Ä“»m­­Ç8o˜¦ÍjÞq¸Ÿ¿VÒsý˜gCvv¢/ýy,ˆSËÄzl$¹—zžmò¦½{(o¨“,{¶qT"|Ls jê|ñtßVÖ}«vÐBé~y/š·{˜Ê`x/v‹¸}xàw<¥­yˆwé’'z0x~(zâydj{©zBV|‰{2BN}—|I/9~ç}“Èèv‚€Ý¶åwI€¤9x€*ÇxÌê|öyŸ¿iz‹¦U:{A²|¼ƒ.ã~+sÇdu ‹ µSuቼ¢«v°ˆppw‰‡0{Åx}†hy‡„öTtz©ƒÓA&{ù‚.˜}„5ÅùsÓ•'³ðt°’ò¡Ku޶ŽvwŽ}z¦w{ŒOgx¤Š1S½yá‡÷@©{M….X|ò‚ÒÄÎrÜŸ9²Çs¿œ$ &t¡˜ñu”•¶y§v§’~f:wÝCSy5‹ð@:zºˆU.!|u„FÃÝr©2±×s¥:Ÿ3sá¡ ŒtØœÇxÑuø˜„e‰w>”0RŽx¢®?Þz>Šà-ô| …Ã'q‰³±ro®(žksK¨ø‹Lt?£ŸxufžFdåv½˜ÚRx1“1?yØ*-Î{´†¦Â®q*¼¥°–r ¶ÙÍrܰœŠ¡sƪ'wotí£®d]vL!Q¢wΖS?=y…$-±{n‡½`‚{kR¬Ý‚m?›‰Üo ‰^®pÈv­Œr”cÈxtQrv‹>‡xÝ,³Ø{›¼I€¶u«É€‡všc€_vÚˆK€Fw¶u²€;x¢bî€Dy§P[€]zÁ>€š|,y}€»&~ÙªŒ~Æ™X~ñ~°‡6~ï~£t¹~û~«b ~ÅO´Z~æ=¼,F€II¹Ó}­ˆt©6}¥‡…—æ}¤†Š…÷}´…‘s}ᄯa0~%ƒÔNÿ~{‚ô=~ú‚,¢€ò¸’|‘ü§ö|9–«|‹Ž`„Ì|ªŒ{r¢|䊜`^}EˆÈNb}µ†Þ<¶~O„Ì+ò‚v·†{“›¦ì{š˜ê•¦{©–'ƒÒ{ГOqÁ|s_£|€’MØ} Š›<]}¼‡c+Ò~•ƒÐ¶¯zؤî¦zä¡”ÉzòÍ‚û{™÷q{n–_{æ’1Me|xŽ<}@‰Â+·~-„þ¶ zK®8¥fzZ©í”zd¥D‚Czˆ fpSzᛂ^p{k–ŠLö| ‘`;Ö|Û‹à+ }׆µ¡yì·W¤æyü²*“zyú¬}¤z¦ŒoÂzk ”]ùzûšˆL–{ª”F;“|‹±+}“†×¯f‹;j² N‰ôl¨Yˆàn~ƒ‡îpGn)‡r#\ †)t#KW…QvI:@„x»)ûƒì{œ®Š‰’sêŸjˆté]‡„uÜ~”†ŸvÔmO…Èwá[ã…y J¹„AzJ9Ùƒ{»)çƒ}m­“ˆ |ÿžH‡}#Ž[†%}>}‘…V}blo„”}™[,ƒæ}åJ-ƒD~;9‚‚¿~¤)Ö‚R ¬‚†¥† (…º…`)„á„¡|˜„ƒçk–ƒqƒDZ„‚Û‚©I±‚X‚ 95öi)ƨ€±«c…Žþœ,„š”Œ/ƒÍŒ {ŒƒŠqj­‚zˆÜY¿‚‡UI#–…¼8æJ„)¹‚ªv„—ñ›9ƒÀ•À‹?‚õ“^z¯‚CÝi豎XY">‹ÓH³€é‰=8¤€¶†o)®€˜ƒ_©¶ƒê ÇšvƒÍŠ{‚HšŠyî——i9“£X˜€§"HY€TŒƒ8o€8ˆ¢)¥€0„w©%ƒd©€™Û‚•¥¸‰ÔáŠyH hŸ€ƒ˜ªX €.”(Góé†8AÒŠ—)žÛ…e¨Äƒ²™d‚<­}‰E`¨Ux³€˜¢Üh€bW¨¾—ÝG¨‰’48ƒŒC)˜–†)¡å”jN“ï’l?…--nuœŽvoìe—ŒÁqÕUm‹ sæE–‰Lv6 ‡—x¦'v…é{›¡5’šs“>µt„eŽîu tà:vdê‹w?TÚ‰æx…Eˆ=yæ5džŸ{~'ˆ…}Y l‘){’I`{ц£{þt‹ÿ|Ed(Šd|£T<ˆÕ}Dª‡D}œ5Œ…À~<'—„@~÷ŸzÛƒï‘HŽƒr‚tŒn‚îs$ŠÒ‚jcd‰PûS¥‡Ø–DC†_45Y„÷€Õ'¤ƒ‘€rž•Ž´ŒX\Œÿ‹#‹‹_‰Ûr@‰Ïˆ…bµˆP‡6S†ñ…óCä…‘„¤5,„CƒC'°‚úÈÍÚ”¿¨Œ.’Ó€ÚŠŽ½q…‰ŽŽb‡‹Œ\R†0Š*C…„ä‡ê4ýƒ¬…‚'º‚z‚õ)/Žü‹Šš[€-‰è—rpÞˆY”bap†ì‘LR…™Ž+C<„MŠò4Ûƒ+‡‰'‚ƒøœ©Œ¯¥Žu‹¡¶‰hôpR‡Ñ™ù`í†f•õQ¦…"‘âBìƒß¶4¾‚Á‰S'ȹ„ÓœOŒS­Ž Š·¨ì#‰¤AoÕ‡eŸL`…ôšQQS„´•IB­ƒ€&4˜‚sŠÖ'Ís…‡”ã$iý‡Ûš]käz-—Èm¿kוCož] ’²q–NUs¸?ñ[v1ùŠ™x›%+‡É{—”U›Ýr3‡X™0s=y™–œtNkM”up\¤‘ƒv¯MïŽíx?¦ŒFy’1≗{L%a†Û}E“·šz8†•—ëz‚xî•[zÓj ’Ü{;\[{¾M|Ù|\?Z‹G} 1̈¯}ß%† ~Ð’û™:‚…Ä–®µx ”-Si둵€ÿ[pJ€ÀMŒÝ€‘? Ša€h1µ‡à€L%¹…T€8’:˜,‰à… •¦ˆÚwR“-‡Êi,½†¶ZèŽP…¦L˜‹ù„¦>͉‘ƒž1¤‡(‚%Û„·y‘š—H‘³„g”Ðv±’YŽ4h˜éŒPZcŠkLA‹'ˆŠ>™ˆÔ†¢1•††„¢%ù„3‚“‘–¡™cƒõ”0— v?‘²”th:‘¹YéŒÙŽýK⊋Œ=>gˆ8‰o1†…þ†€&ƒÆƒ„«–' æƒ†“¸ßuÊ‘4š|gªŽ²–äY€ŒR“JK„Ч>)‡Ä‹ö1y…ˆ"&$ƒl„O]•Ψ?ƒ/“^¤†ugÑ KgFŽE›ËY*‹à—IKD‰¡’Á=û‡cŽ-1c…@‰€&4ƒ%„ôˆ€¦li§|Q¢øko£Ÿ¥m]bvœIoGU˜ÊqPG••)s…:¡‘fuâ.;x#!‰€{“ˆ¥Wql{ü¡èrsoGž‚sb#›tÃT¼—”vG_“ûw:„Cy>.OŒo{#yˆ„}1‡ ¤ xò{k ªyEnÌDy«a¨™Ýz2TW–fzÙG’Þ{¢:`8|€.\‹z}‡#Ƈ¨~¬‡¢Ä€JzÍŸl€n œ¿a ˜²–Sâ•MˆFÆ‘Ø:7ŽG£.eŠ Ë$†é€†…¡³‡‘z<žc†¯m‹›…Ë`Œ—³„ëSy”Q„Fwðƒ^:q‚ .l‰àæ$@†F2† áŽÎy—TmšA‹Ã`–äŠ(S“ƒˆF=†þ9÷Œ¯…m.s‰8ƒÒ$o…¼‚;…¢ -•æy\œë“Ïl¬™”‘‰_³–6*R¼’ÙŒÉFxŠe9ꌇý.~ˆ¥…ˆ$–…Kƒ…PŸ¶œ×y,œtš)lz™— _t•˜“åRz’6°EÃŽé9¿‹…ŠM.ˆ0‡$µ„ïƒÙ…Ÿa£œxKl4˜£œw_+•$˜bR=‘¾”WE˜ŽsR9§‹ŒO.~‡ÛˆF$΄¥„r|¾¯ëi?qK«×k e‹§ÂlèY|£‚nßMHŸpüA/šLsI5§•cu¿*ÎDx„!W‹ {|m¯pq%ªØqeh¦rÁYb¢Bt M7»uA-™ w%5»”,xë+ zî!Ί}|%­¿w¬pÈ©™xe¥Xx|Y üy$Mœ}yòA—Üzè5À“{ù+=Ž}5"6‰~‹{άq~„p^¨Q~Md¨¤~*XŸÄ~,L¹›U~S@é–Æ~“5½’ ~å+f2T"ˆPÒ{p«U…Ip§<„ŠdG£ƒÓX]ž¶ƒ'LzšJ‚˜@À•Ï‚5·‘)¬+‡ŒgI"Û‡¥€ó{ª~Œo³¦eоcþ¢,‰dX؈ L;™o†»@¡”ò…}5³^„E+£‹¶ƒ#‡ízЩג–oy¥»ÃcÆ¡zŽÁWÜŒ­L˜»Š£@ƒ”Eˆ¢5·¬†¥+½‹„¦#N†¡‚ÁzŸ©O˜ïoK¥/–Šc“ è“ÝW©œˆ‘ KÕ˜$ŽB@W“¼‹|5¨%ˆÀ+׊œ†#x†Aƒqzt¨ùŸ&oM¤Éœ9c l˜ÇWŽ›ò•Kׂ‘‚@V“Ž5³Ž¨Š‘+éŠ@‡)#š…õ„q¹£hÜf«µj’[Ű1lmPʪÿnpEÐ¥ip¢; Ÿs 0ò™Xuœ'£’éxzÂŒr{‡qD¸äo×f«´pÈ[Ô¯qñP䩪sNEñ¤tã;=ž%v¬15˜x™( ‘®zÄ W‹W} q(·¢vsf€²ÊvÉ[º­°wLP̨OxE뢳y ;NœÞz11c–Ò{v(_•|è ׊b~mq¶C|ÏfL±o|¢[y¬[|™P£§|ÃEÒ¡t};O›²}›1…•¼~/(¦~ä!E‰§pÞµƒf&°B‚p[Q«/àPt¥ÛgEÁ S;Pš¦€è1£”Æ€Ã(ãŽÄ€·!£ˆÞ€ºp¸´,‰Rf¯Oˆ6[Bª5‡Pc¤á…õE°Ÿ`„ð;U™·„1¾“ëƒ*)Ž‚^!ðˆH§p—³y`f ®‹È[>©fŒ P[¤ŠAE©ž—ˆŒ;Z˜ø†é1Ù“0…U)FjƒÒ"0‡Î‚op~²õ•7f ­ð“![B¨¼ÀPY£_ŽEEŸé‹Ü;T˜\‰…1æ’ ‡C)kŒç…"d‡jƒpm²–šÙf­r˜=[M¨,•1P\¢Ç‘üE£SŽÜ;`—ЋÔ1ð’'ˆå)}Œ„†"‡ƒ›Î¡mfú»ènìi=¨µp­kq”êr^mœ€µtoÎlVuÚrX w¿tDyßw'0É|Yz>̾j´qźjlÁrä§`n­t“¾p‹u0¤rnvgkbtgw³WIv~yCtxÏz›0b{x|bÊùh§|~¸´jÒ|¥èlä|’^næ|¶~ppò|ój\s}AVtu[}–B×wÚ}û0z¬~lÉ;fׇ ¶øi† ¤9kD…ëmh„5})oœƒviNqê‚¿U¥tX‚BEvÿ=/·y÷€VǧeP‘{µqg¦‹¢¶iåž|l‹»{õno‰èhLpãˆ(Tâsu†SAÁv@„Z/ryX‚Æ_d›Ö´2f}™¡}hÆ–ŽMk“/zámtLgdoþjT3r²ŠxAKuœ‡I/8xσ´Å[c&¦³5e¢[ }gÜžrQj.šxyýl¥–†f¥oD’ˆSŸr Žd@êu‰þ/x\…Ä™bp° ²vdÜ«Ÿ²g%¦”Œ€iw¡„y3køœyeøn¬—bSq‰’@—t Œo.àwý†UÄa÷¹ë±ôd`´RŸfŸ®W‹Øhè¨-x‘kk¢emn)›ÐR§q•\@?t@ŽŒ.Àw°‡ZÀ‚tÿf4¯uþh¦åvÿjõ‹xxm0xŠyosekz.qÐR|{itP?Ä|Öw-Ó~zK¿'rÈp{®sÿqÔœãu#sŠ„vFtgw£wtu½dx¾w*QÏz%x®?E{Äzb-Ž}¯|X½¯pÑzŸ¬êr'zò›ssj{@‰(t¯{™vxv|c£wy|Qy }>ºzÓ}œ-R|ä~H¼(o„™«Yp‚ƒþ™éq݃^‡Ûs=‚ÁuPtº‚;b°vS¼PPx <>Ayû€¶-|0€º»mŸŽ{©øo˜p‹‹z†r‰èt?s“ˆ^aÌuQ†âO¦w+…T=Ôy>ƒ¨,ï{“¹’lu˜S¨Ômü–—oou“†…{púùsGr Žlatq‹ÝOvk‰?=tx†j,É{ ƒ@¸¦kˆ¢ §èmžÜ–‚n’›l„–p—ÝrxqØ”M`Ws¼¯N“uÈŒï=&xˆñ,©z„·÷j׫˜§4lg§ˆ•ÁmᣃÔomž‚q¿q0™å_¹s*•9N uI_<âw¥‹6,z@…¯·†ja´è¦³kí¯í•)m\ª|ƒ2nà¤Ïq)p¥Ÿ _|2s§o„|­u]Ê}@v¬LO}êxT;"~Âz-*æÕ|L°œy(xá¡*y«yr‘ z$yù€z«z~n•{D{]{ú{¼Kº|Ë|r:Ã}Í}?*È ~%¯Fwz‚KŸÐx‚¡x¥®~ÏyDQm…z\'zÝ€¼K{Ò€w:^|ø€0*®~TÛ®v‹¡žvºŠŽŽfw`‰\}¤xˆl•xä†Õ[^yá…œJƒzõ„V:|<‚ö*—}·k¬útø”ðˆu¨“fvVø|°wŽÆk¸wøŒŽZ°yŠRJz7ˆ9¼{›…Œ*„}1‚Ь&tžœ±tÌ›kŒu}˜l{ávD•Ejþw7’ZxUŽØIy”‹|9€{‡ç*u|Á„«‡sh§$œ t$£™‹ÝtÓŸ«{2u™›…jYv–—VY‹wÉ“I7yŽ®9Kz¤Š*h|e…«rò¯ñ›Žs®«‰‹MtT¦¢zœu¡uiÒvœ>YwK–öHÛx­‘‚9 zL‹Ì*^|…쥋…|e;—„ÈgȈ„Dj,x¶ƒÞl{hQƒƒnØW½ƒ3qWGr‚ðsþ7r‚Ìvô(j‚Ôz\¤¯ƒˆnS–•ƒo‚¯qtwÆ‚\rög~‚tˆW åv4FêÁwü7#Àyù(kè|>£°ÀwE•hpx †#x»vÀ€éyofŸ€¿z/VZ€­{Fh€ª{æ6Û€Í|ä(k~¢›€€#”H߀ …S®€u܇âeÚzËUdž¾F¦µ6¦ñ¬(k€^ ¡~ˆï“K~–ˆ/„Y~s‡ItÌ~]†Jdú~d…MU ~’„XE}~σY6_5‚G(k¿ –}²‘³’\}‘1ƒq}uŽvsô}jŒ—d9}~бTv}·ˆÇE~†Ñ6(~“„±(k8‚eŸÙ|ÙšR‘ž|˜ ‚µ|§•vs>| ’±c•|ÂàSõ} DÅ}kŠ 5þ~ †â(k~ǃ†ŸJ|4¢È‘|$Ÿ»‚|œCr¢{ü˜Œc|$”ÈSs|€òDj|ñ5Ø}˜ˆÔ(k~k„{žè{À« ‘{³§4Ž{¢Ñr{yžb{¡™_S|”ŽD|‡ž5§}BŠy(k~!…E˜Ž1dé‹©Œ®gl}Ý‹hiÐo:ŠAl(`‰n‘PÞ‡ùq Aú†×sÙ3r…Évæ%ÿ„Õza—èŒjmyŠð‹!o}‰òp®nˆÓrE_z‡¼sïPY†¯u¹A˜…¨w¡3F„¸yÅ&!ƒà|0—Š´u߉õ‰’v¹|1ˆtwŠm¦‡kx_^ÆkyFOË…zzDA6„‘{U3ƒÁ|‡&>ƒ}Ý–"‰#~ˆùˆ~G{&‡ ~_lÙ†~q^….~OJ„[~¸@惑~ê2ý‚ã%&X‚If•5‡Ë†Wˆ†È…ÒzG…Ò…+l„å„n]|„ ƒ±NÛƒVƒ@ž‚«‚P2à‚“&n¦€È”k†Éއc…ÑZy „Þ‹ìkIƒöŠV\σ)ˆ¼NZ‚|‡)@Gê…Ž2¹yƒÔ&€‚“Ç…û–Ÿ†·… ”¶xõ„’zj¦ƒ3 \7‚q“MãЋ@Cˆ2 €ì…Ý&€©ƒ “G…_ž†2„y›âxhƒ˜Ój‚“•~[¹Ô’!MnF޼?¸€Æ‹J2Š€x‡©&œ€Kƒï’ì„ï¦:…É„¢åwïƒ ž÷i¥‚š¯[SO–dM#€Ç’?ƒ€Yµ2m€‰-&¦€„©Œ(—d­€”Ðg sY’ÔiƒeßèkãXŽënWJŒápö< ŠÍsÀ/œˆ¼vß#̆·zc‹Ž•xl‘“nn`rÁ‘woýeY‡q¦W’sgI‹—uL‰c{å"Œ†r}œ~ž›µz›sI™zóg‡–h{L[p“°{µOò|4BàŽ+|É7;‹S}o,Oˆx~0"Õ…¤~ÿ~švÁr±—àˆfï•=BZÜ’€öN³Ù€»B–*€7Ši€j,\‡©€P#„õ€;}}™~ˆÝr4–ñˆfx”O‡"Zh‘ †NMŽð…BeŒ@„(7‰—ƒ8,i†õ‚A#F„aN}˜®ÎqÇ–*Žlf “‰ŒÍZÛ‹ MõŽ2‰HB-‹Œ‡†7ˆß…Ç,y†Yƒý#pƒç‚9|½˜–•q—•ž”¨eÛ’ï’NYÆ*µMº}"AîŠíŠ˜6؈Uˆ,€…Û…#’ƒ„‚ý||—´(qW•,š¦e•’s—ŒY¦”!MŒö¾AÇŠje6ÇâŠ,…}†Ã#®ƒ5ƒtë©PcèjO¥ãf=_`¢rh¡TžÐkH¹šîm¾=o–Ùp2¾’ŸsŒ(ÀŽHvÙ "‰øzbtu¨5k#j¤¸lº_-¡$nnSÿjpDH©™ƒrB=t•ytn2Ý‘Ov½)yL žˆÛ|t¦¼riŸ£Is ^ÙŸµtS±›ýuSHt˜#v­=_”.x02ëyÎ)B‹ö{›! ‡â}~s¬¥Ùt(‚o.wþº]^”«©©`c’—˜CcHl†Vf+Ž;t)i0Œaèld‰çOþȯµ>tsw…[-òwn‚¿¹w\-ž¦¨®_A›®—Mb0˜‰…ke#•SsShA’!a7k‘ŽçO|o‹’>#rሠ-Ðvö„0¸±[D¨n§ð^a¤Œ–‹aS h„ªdLœ%r›g{—ç`˜j哟On‚-=ÜrfŠv-µv’…m¸3Z¤±ê§p]­ •û`®§Ü„c¤¢r fØC` jR—ëNŸn’b=‘qþŒŽ-ŸvB†wµ~o®`^¥£q&cc•rfBƒÇti qõu£kÚ_ôwInÅN1yqØ<¸{u8,-}py´mjy¤”nÎlp”ptnR‚Þrp/qsÏr_;u¨tMžw§v2uŠŽË6£x‰ü)Gz³…›è_ÑŽÃzb〾ƒeÌqÚ©hŸbmÞk~RÖ€$nC—€q±4¹u7&øÄy7šú}Gh¿Ó}kjé¿}Ÿlúpó}âoa¦~8qR7~¥sTC#*u«4€ÞxA' €Æ{*™ð{&q‡Œ¤{{rà~¼{Ît&oú|2ug`Ù|«v´Q˜}AxB¸}ñy4N~Ò{.'å|û˜Ïy6z?‹wy­zÓ}Œz!{LozŸ{Á`{?|9Q{ü|ÀBZ|Õ}R4%}ã}õ',~¦—¯w˜‚ÝŠ|x%‚º|’x±‚nnyH‚ _Jz¦P]zæLAæ{å€ñ3î}€’'9~u€)–¿vN‹o‰‹vêŠ{ªwƒ‰qm9x+ˆ2^Šxø†ìOÒyñ…§Aˆ{„^3Á|f‚ü'C}䀕ÿuA“؈Ìuê’5zñvŠElŠw>Ž&]íx‹ýOXy,‰ÌABz\‡3£{Ð…+'L}l‚©•ltqœˆ5u#™©zUuÅ–Þköv{“×]cwhÅNÞx¦@ðyÒŠv3…{U‡'S} ƒ¥•sÚ¤‡Át’ ÞyÔu01kvuâ™:\övÒ•8N‹x‘*@©y\3Wz÷ˆ½'Y|º„u—‡ï_©ƒw‡b¯vˆ†ie–hÍ…ÛhoZ˜…RkXLE„Ïni>[„Wq¦0åƒýu<$¥ƒËyBŽË…Éh‚²….j@u¸„¦l^h„,n{YÿƒºpªKуXrú>ƒul0ЂÑx $Ö‚Ã{!éƒÀpQ¬ƒVqÀtÕ‚ës!g<‚tYM‚;uñKKýwy=ºÏy0¶Äzå%Ú|ÜŒíïxp€¢žy.sÁPyØfjzyX˜€Ú{%JÆ€Á{Þ=i€¸|¦0œ€Ô}ƒ%'~r‹ú€P€»€€”rå e•³€^X”€;Jm €!=9¼€ 0“ÿõ%F€_ß‹(ˆ~ò‡õr:~Ç#dé~›†+Wl~‘….Ið~®„8<æ~èƒ@0sL‚6%aË Š~n~Z}ÿ%q”}Ô‹dN}µ‹ÁVÝ}»‰îIƒ}éˆ<°~1†90c~²„?%wP‚5‰ú}T˜}Õ}B–q}“¸cÐ|ø‘Vh}ŽbI}L‹ª"‰…¯yK‚펭gXw¼Oi„kÇŒk­_EЏmßRe‰kp'Eˆ$r”9†ßu&-J…°wý"Ö„›{‚1Œ¾ovå‹‹pkŠTr ^›‰!s‰Qà‡ïuE"†ÈvÏ8è…¦x-P„›zš#ƒ¨|¿`Šöv®v‰Ûwˆj/ˆ¾xV]ô‡ y'QT†zDÄ…Šzñ8¹„Œ{ò-Sƒ¦}#U‚Õ~A€“‰q~0uQˆh~riƒ‡\~™]B†R~®Pí…M~ÇDz„k~ò8—ƒŽ"-Z‚Ì\#‡‚ ™Þˆ9…­t¦‡C…Lhá†?„½\º…8„ Py„BƒXDKƒh‚µ8‚¬‚-]‚r#°ˆ€ÇL‡Ft5†^Œ hw…ZŠ¿\?„O‰@Oýƒg‡ÁCé‚¡†N8Zï„ß-ZqƒW#Ó Ê~؆Œ”'sÁ…«’h„¥…[Ôƒ—Ž4Oœ‚³‹æC‹‚‰ž8 ^‡^-Y€î…#‚£~†›se…"˜ägŸ„–[uƒ’æOO‚ÁCWqŒ¥8€à‰-S€ˆ†f$€QƒUx3™f_)m¿—2bbÁ•!déW:“gÖKoÄjÞ?¯Žln4}Œq})鉪u= ª‡hyPwŽ—¸fŸmF•¥hÅbN“j÷Vâ‘mm͉/}Ä4<‡F~=*f…n~È!þƒ±Zu‘~‚üj¹¾‚Ï_éã‚{TÅ‹ö‚I™Šª>¢ˆ/U4+†d *u„®€À"5ƒ€wt›†‰ÊjCŽÔ‰ _wŒýˆ TY‹†çI=‰6…Ã>g‡g„ª4+…Ÿƒ›*ˆ„ ‚"c‚’jt<ÑljŽ)(_?ŒJtTŠO‹}I ˆo‰’>-†·‡¶4……é*”ƒ„ "ˆ‚(‚5sòI–ÖiÁž•^õ‹¹’šSÙ‰¹×HÓ‡Ø"> †%Š3ö„†‡ì*›ƒ…R"¦Ó‚ÛmB¢o^°cxŸ¤a€YZœÖdcNæ™ÚgbDL–¢j‡9Ñ“Amâ/õÉqi&ÏŒKuBˆòyTl© üe½cž4gâY›Pj#N¶˜DlƒD6• o 9Ø‘¼qÁ0Ž[tž'Šûw¾ˆ‡Â{l1Ÿ:lb™œ…nX¬™¬oÂN^–©q‰Cþ“…sp9ÅOu01 w±'a‰Ïz÷†¹|Škµ|s0bšØt9X˜uLMü•"vwC´’w¾9¢y#09‹Þz '•ˆÅ|A W…Õ}êk8œyÃaœ™lzJW­–¯zÌM“Ë{PCvÓ{î9~Ú|¥09ŠÕ}j'½‡Þ~E ©…"jÊšÖ€Ka=˜L€RWX•’€:M@’²€C6Äü9hŒÓü0<‰ë€'Þ‡€ í„p€0jm™é†¤`ó—f†,W”ª…tM‘É„žBùŽåƒÓ9FŒƒ0G‰!‚n'þ†k¿!%ƒéj'™*Œ¿`²–¬‹ÃVÖ“ðŠiLÆ‘ ˆßBÇŽ-‡^9‹]…ë07ˆ„„Ž(…݃+!Rƒ|Ôi’²`§–"‘IVË“Y;L²`ŒÜBÅuŠ™9*Š­ˆs0P‡ô†g(6…o„Z!vƒ%‚pb¬«Ê^Y}¨s`×P7¤ãc½FÑ ñfÐ=iœ¥j48˜m+µ“wqM#úŽÇuE•ŠTyUbªdÁY/§"fáP£gi0F½Ÿ\k¯=q› nb4_–ŽqK+ü‘ûtZ$hhw£-‰zøa½¨Þk$XÔ¥tl¼OÅ¡ÀnxF‹¸pj=]™wr‡4m•tÕ,1œw@$ÅŒ,yÙ°ˆ|sap§qVX}£¼rsOi s©FSœ#u =;—úv’4m“µx=,W_z%‹{æ ‡}Åa#¥’wxX8¢Ax!O)ž¢xÓFš¹y”=%–¥z~4l’}{†,vŽG|%QŠ#}ʆK~ï`ݤ]}’X ¡}ÊOq}íEô™~= •„~J4u‘i~¤,•Q%ˆ‰R‚Ï…£ð`££fƒzWê ƒANðœu‚ÑEà˜”‚O<û”–á4u‹‰,´Œ~E%¹ˆ¢ …€Ê`v¢¨‰*WØŸOˆ€N囨‡xE֗ĆJ<î“Ì…/4hׄ*,¼‹Ûƒ>%àˆ‚W D„¨`Y¢ޤWÓž¯‡Nâšÿ‹áEÓ—Š<ó“!ˆ44y7†ƒ,Ê‹P„í%õ‡Ÿƒi n„N‚·Yb·Zé¦÷e^^X–+göa¹„Îje rþm:hgap kÛOFs oy=Üv[sh-qz wãµr_jeT¥~bdg¹”àeCjƒ¬hluqûknÛ`n-q[NŒqxsû=]uvà-Fyz,³©\o¤£Î_¹q“qbÕr\‚VeësÅpÓiu<_+lzvÈMÒp xl<çsíz@-!x+|U±äYéyÆ¢]Vz+‘Í`¡z•€ùcë{o¢gZ{^6jö|#MnÆ|Åp?†|sk2}üvŸ%ϳz0xtkã„umÇwvo›iVw(qh[3xVsCL÷y«u7?){#wI1å|Ùy%ð~Ã|Eq´tr‚Þríu•uïtv¡h{uUw¨Zyvµx³LrxÜyé{1Ë{Ö|U& }ñ}ÆŽo½|çÛq}Stðrh}gtsÄ}ÐY³uH~KÎw~M>oxà~š1Ÿzù~ó&%}=T"n!…H€éo“„út pü„yf¤ruƒØXÿtƒ4KSu> wõÿ1z:^&9|£€³ŒZlÎ|€)nTŒrsVoÍ‹!eûqZ‰§Xisˆ(Jáu†§=åw-…$1ky—ƒ&J|$ä‹Ák•vmW“¯r½nÚ‘Šempr/WårFŒÏJntYŠl=›v’ˆ1Wy…{&X{¼‚æ‹Tjú&l™š¦rAn—¨dôo»”gWq—‘"J$s¼Ú=[vІ1/x¬‡&c{iƒ»†ðmZ„{‚8]üo\2a\b~DdµU/^h GΈk¶:áÇo~.€‚2s¦#l‚ÏxA…ù~Ðb¸z©~èein‡h aÉAj®TŸ‚mcGfÚp=:¦€Js@.|€êvŽ#¬µz.„þ|`jÒy—|³lÈm }n´`ó}\pSó}Èr™Fé~Qt±:^~ôvè.pÅyU#〽{öƒóz.rËx‰z¨tl{uM`.{˜v~SK|4wºFt|ìy :}¿zn.g~Á{õ$ä}—‚òxDz½wxà{Yk¦yu{Ø_Uz|ERÈzÇ|ºF{®};9í|­}È.c}Ý~f$<*‚v¼‚žvØwq‚‘kx‚S^©xÉõR&yœ˜E©zF9ª{Àù.P}€ª$_~€XauzŠNv&vA‰•jWvöˆ”^w¸‡jQœx£†ô@3Pï5i„õ+UÝü"µ€M€v§~h‡"la~s†´a~[†VP~<…"K~A„G?Ü~oƒy5L~µ‚³+Z3á"ÜÇ v)}rŽkè}‹a}z‹¢Ué}b‰úJ¥}tˆW?‰}º†½5~…,+_~§ƒ‹"üZìuÈ|¶”Ëkˆ|ד/`¸|Ê‘U|´ŽJ`|ËŒ?[}‰´5}އU+W~;„î#‚£pu’^Zf¬Ú]p\ms`ÊQ³Žd6F¹ŒzgÄ;ÏŠãk†1z‰Mox'Ù‡ËsÅ™†qxZo©4a`fŽàd [ä‰fÆQLŒ$i’FtŠ®l};±‰9o—1†‡ÈrÙ(†pve …>z#nöþh€eUŒ×j’[L‹œl¬PÄŠQnØFˆýq;|‡¯sŒ1†gv(B…;xâ j„1{Æn;‹ðo‚d“ŠæqZ‰‰ÉrP7ˆt E¥‡ou©;:†Jwd1o…-y9(b„+{5 ¾ƒH}@m…Š,vpcè‰=w^Yæˆ6xAOŸ‡y EI† z:ý…{1\„|0(}ƒ=}_!‚~‘l䈺}McY‡â}¯Yh†é}ïO-…á~Dì„á~U:æƒñ~¢1\ƒ~ü(—‚nZ!@Ú¶lZ‡…ƒòbԆƒÀXì…׃YN½„Ú‚ÖD’ƒì‚X:³ƒæ1n‚Fƒ(²½!qQ€°kŠubš…ì‰ÄX¾…ˆªN”ƒô‡UDuƒ†:Š‚I„ç1KžƒÒ(Ã*‚«!™€à‚k˜…á¿bI…9ŠXm„SºNMƒH‹œDA‚[‰˜:m¦‡­1F…×(Ñ€¸ƒö!¸€‡‚-eÞ›1Y¡\ç™\åS™–ç`AI픟c¿@’"gh6f‰kL-WŒço_%ŠWsLJüxbe"™G`}\k—?c)S.•eñI¥’ÌhÚ?õXké6jÙo+-„‹Wr—%[ˆîvJŒ†»zd”—'g,[Ô•?iLR·“3k€I=ùmÖ?´Ž¡pJ6VŒDrê-Ÿ‰éu¬%¤‡¬x¦…£{°d•m·[8“KoPR‘Yp÷HÍ=rµ?d tŽ62ŠÕv‡-ªˆ¤xš%܆‘zØc„²}cs“Wt3Z°‘¢uIQšÀv`HX¶wz?$‹ x°6‰‘z-¬‡‡{d&…œ|â·ƒä~[bð‘êz¥Z=K{:Q7Žu{¸HŒw|+>âŠp|°5ÿˆr}T-°†‹~&(„È~¿ýƒ8rb‚Á€éYâ5Pég€ßG¾‹m€¦>¡‰v€~5؇€n-»…³€n&H„€i 7‚©€_b*φðYŽŽS†„P›ŒŽ…ÁG}Š˜„×>nˆ¨„5¦†Õƒ=-©… ‚’&hƒ}Ý f‚6$aåŒÓYo§‹øP‹ãŠ„Gf‰ÝˆË>r‡ä‡85Ɔ…Ç-Ì„l„q&…ƒƒ ‹ÚÅ[“¤\XùSP¡”\1J垦_‘BH›ic&9œ—àfø1'”,k )_koL"^Œ½sÓ¥‰^xhZÚ¢¬_pRÔŸôbJ}œödúB™«h9…– kG1=’|nÀ)¤ŽÓr`"Ï‹Gv:>ˆzZk ¢eµR^ýgæJ!›j8A¸—Öl¾9^”dom1AàrM)×ZuK#-‰øxw†ì{œZ ž–kÕQóœm‹I¯™1o[Ap–qR91’Âsq1Â&ƒÙ€Xµ™/ƒzPç–çƒ[HÞ”8‚î@Å‘=‚e8ÐŽ1õ10‹8ž*_ˆK_$J…¥[ƒc€ÑX‹˜oˆõPÍ–)ˆaHÉ“~‡S@¹…†8Öz„ü1EŠƒý*t‡¶ƒ$c…,‚4…ƒi¬\ãU+2_ýY&…c]}Lf0`ûlŸitdç[ÄlêhïK;p•m(;t™q»,xúv媋Xí_a›°\ob`Œ3_ßeW|'cWhLkœfôkIZèjÆnaJŒnÐq¢:¥s4u4+÷wòy>¨½Ugi€™ýY>k€ŠÄ\ÿm~zÑ`Ãoƒjxd¯q–YühÕsÁIÞm7v :@qõx–+êw{v¦òR=ss˜KVct‚‰&Zdu”y€^lv«iSb¦wÒYgy I:kÎz]9åpÞ{Ù+Þv7}ˆ¥BOw}B–ËSà}n‡ÅX"}™x4\d}Äh[`Ü}øXIe›~>H«j–~Ž9–oì~ô+Óuƒn£ÔM †ñ•‹Q†=†¯V8…w=Z±„»g}_]ƒûW¨dQƒEH8i‚’9To Ý+Êté"¢©K)s”‰OûŽ×…ÏT›*vzY@‹ufÍ^‰ÄWcCˆGÞh­†V9"nt„‡+Ãti‚¡¡ÄI—™°“ÂNŽ—$…!SM”‚uâX‘ÚfD]7VŸbeŒG„gû‰Ï8ùmæ†ë+½tƒé¡+Hp¢“7M{ž÷„ RK›\upW!—Åeç\;”8VXaªGDgbŒä8Êmrˆú+¹s«„û ÕcóU5’ÔfiY:„Ihç]'ukxaeqn,dîU¢qhùF/t(m77+w•qÖ)[{Xw Ÿ+`0^å‘£caûƒEeàetc0ˆQ•g®†Cnll…05Çq€ƒ³)|v·‚#—bQ…–1ŠMU°”"|•Y·‘ÞnM]Ѓ_³b,,QfÖŠÓCk½ˆp5§pó…î)vMƒU–ÝPjž‰ÊT§›£|X½˜smÓ\ç•*_OaZ‘êPÐf!ަBÙk)‹O5zpƒ‡Ô)uù„R•[k5UVˆ”mYV{'nê]=mpça^gsdûO©uLiASwÄmI3vzqñ&Ù}¢w+“æg£^j‡bi×azl d£lnLg°]™p±jÉOsIn@ãvqk3Fy/u'&ø|yQ’dagx† fêiÆxþialkkänB\ÓnpŠNuqprî@ˆtˆut3#wòx<'{˜{S‘atpa„Ÿd@qãw”fôsWiùi´tÂ[Ül¨v5M·oÓw¿@ s4yb2ëvã{1'*zÁ}.­^éy.ƒ[aêyëvfdÕzhãgÌ{%[j÷{ÀMng|l?¤r }&2Ãuõ}ø'>z~ÞŽ\Æä‚R_òÛuwc ¬h f1gZYiŒ"L™m+€é?Rq€¹2 u)€‹'Oyk€]©ZþŠi{^M‰˜t±a†ˆ‘gWdÔ‡mYºh]†IL!l(…)?p*„ 2Št}‚â']x諌ùY’¬€Ô\ú‘t`L/fÄcµ'Y3g`‹!K«kU‰>Éo}‡2tsï„õ'ix}‚ÆŒX|š•€Y[ù˜7s_Y•vfJbÒ’†XÐf’›Kdj¢Œ²>Šnì‰À2Ks‚†¶'rx'ƒ±Šr¶U€~LsÞYqqçu)]OdÐvŽa#WFx eI¦y¬i‚Or£7²‚)tð.Ì‚wY&§‚yìß‚=|ˆeÇ€Çq,\ñ€ãr S€àt JW€Êuz@߀¾w7s€Ëxž.»€æzN&Å | *l}áe~õwò\M5xÖS3Oy£IÙXzf@{j{77R”|.·Ü}&á€E~ i€¼ dv}d~}[»}Ë~ÒR²~~ûIm~!@$~P07(~˜_.Ð~ôŸ'‰Ü €+€cû|(„ß[j|´„¯Rq|û„*I>}ƒ{@}U‚á7}¿‚[.´~=ê'~ïk ǵ€åcš{*‹[{ÊŠOR|#‰Hù|Q‡¬?Û|•†U6ð}….±}¦ƒê'$~x‚· èW”^㓈TÙVž’X“N ª\fE%`a<~dŽ3‹Èhú*ËŠm˜#Mˆr…&‡w^û[ƒU÷Æ^·MwŽvbD±ep;È‹yi 3 ‰êlØ*öˆdpÒ#ª†þu ¯…ËyU]XŽgbUEddÃLëŒ=gƒD:Šïjb;}‰md2ðˆ.p•+†Ùsç#õ…§wl&„¥zò\±‹ûh’T›‹ j¸LCŠlëCȈûo6;+‡Èq¡2̆›t.+…zvÖ$0„{y£ƒ¨|e\ ‰ÚoT‰&p¢K·ˆErECK‡Asñ:ë†5u¾2«…8w§+$„Fy $aƒw{°ã‚Ð}®[uˆ uaS{‡~v|KG†ºwˆBï…Ðx•:¦„ày¶2Ÿƒÿzö+1ƒ7|@$‰‚—}+‚~ÌZò†‡{S †|'Jí…s|˜B©„›|þ:nƒÃ}w2…‚þ~+G‚M~§$°Ø<g…¿Z‡…FpR¥„ýJ„hTB\ƒ¢:4‚Ý€å2P‚7€Ê+?“€Ä$Û2€°— €ŠZ3„H‡HR„'†ëJyƒ¦† B_‚Ï„ô:bû„2 ZƒM+|€ß‚¥$ý€²ê½€¬/TÜœ†T#M‹šZW×Eû˜ [¯>•®_À6&’þd.`5h±'Emm| ïŠÌrŠÒˆ~wšTš‡Éo‘R†ÑaX1…ÜRƒ^•„êDteAƒ÷6ólC‚ü*ìsJþ–ß>’³Š9DzÆ|ýJ–ŽàoP«`¢Vú‹+R]™‰LD,d}‡b6Øk­…^*ïrÞƒK–(f—9k'„y7oÔƒ-}t²‚ $ºys­yT´JnÖXíŽýcþ]EX¾a@‹`MUe«‰‰Bj]‡Á7`o7†-ct@„>$Îy‚ŠwlsQlñtWU+buÌYdVÕwU]±KBxðb?²z±f½4¯|˜k˜*W~Äpà!dv™uØoX½kÏpÕ\La.rž_âVtsc…J¶vbgC?Vx~k04†zÁoO*l}DsË!½Úxt‡kq`‚j”m’cj`4o­fVUAqÑiKJtlX>ãv†oŒ4Oy!rì*u{òv–" ~Èz{sLhh9igj’ju_lùlµT|odnûIlqüqS>{tÂsË4!w®ve*zÉy8"M}Ù|/re)oãhRgåqs^ jsS¢mBt‹Höpv)>*s2wá4vfy°*yÄ{©"…} }·q!bœwvg‚e—xa]phy7RúkpzH^n‰zÞ=ÑqØ{Ò3ÕuK|Ø*xæ}ò"µ|`pS`k~ÒfÅcœ\Çf¹5Reià@Gßm1W=ypµ‚3ºtW½*™x(ý"Ü{Ñ€8o°^™…åf4a÷…\AeA„ïQðh“„3Gxlƒ„=!oÉ‚ç3s•‚Y* wŠÇ"ü{]2o9]$ŒªeÇ`ª‹¿[ÖdŠeQŽgˆˆÛG.k%‡`<óo…ù3grø„Ÿ*ŽwƒF#{ÿlÒzÍQcJ{‡U.Ym|bY`O)}E]¯D¤~-b%:0-fÕ0U€Jk¾'8šq€ƒv²khwXUbDx<[åX•y^_ƒN„z‚c5D/{³g 9î}k0J~roG'h€sÖì¿x¢j@s§_ a-ub—W»v‹e˜MÆwôh¨C¥ypkÖ9š{o/00|Ðr²'Š~¹v{ I€¡zki(pzfß`r=i8V»sík—M užnCwhp‰9=yWs10 {auú'¡}xø ™ª| h$m¤n _3o©oÆUäq™q‚LFsŒsCB¤u•u8ówÎw/özy'º|†{H Þ~×}|g;k*u&^_mmvDU-o™wTK·qÄxaB5ty}8Ívrz¹/òxú|'Ô{ }f!~%~Áf|i|]Ãk‡|˜T«mç|øKFpA}KAÎrµ}°8„uT~./äx~¾'çzÞO!F}’×eäg=‚¹]9iT/l|‚\JÞnþòAvqœœ8:tj\/ÀwB.'õz?€û!l}€Áereˉ\Ðh¤ˆƒSËkX‡€J‡mû†SA8p·…;8s¥„;/©v¥ƒL'ñyÈ‚_!‹|º€b„‚ÜPáYô‚ñT÷Qƒ Y*GÓƒK]ƒ>[ƒnb 5ƒ›fÖ,MƒÛkØ$b„Cq5Õ„ÄvÇaCjW·YÝ[OPG€J^ûG6€ªbÄ=ôf¶4Õ{jß,[‚o8$ª‚±sÞRƒqx¥`C|^X |áažO„}d¹F~.gì=€~ÐkC4˜ŒnÉ,Z€\rv$âOva¾‚Iz[_Tye^W"zgÙN¥{j_Eð{älú=|Îo²4T}Òr‘,N~éu% €x»I{ç^pvOlVNw˜nMãxÁoóEFyÜqê<¥{t4|Nv6,B}£x%0zêk€n}G]¥särËU—ult!MGvÎunDÂx!vÁ†âb.8†XfH0…×jž(¿…fo "5…sâí„ñx§V˜„Õ]IO;„Ø`uGœ„¸c³?¨„vg7¯„(jœ/êƒènX(Õƒ¹r6"ƒ¯vFgƒ¾zLUÒÝc¯Nv‚fSFÜ‚7i?#‚4kØ7P‚(nÏ/¿‚,qì(à‚?u%"¾‚rxЂ¶{ÇU)j MÁ«l&F9þnL>—€1p‚7 €ará/›€¤u_(è€ôwî"ñ`z‘)Ô}T_|Äp[M}ŠqêE±~sz>-~|u6¾~ÜvÍ/ˆMx§(óÒz‹#€t|ts~;SÅz³vyL”{¸w€EB|{xt=Ù} yn6{}—zƒ/k~2{²)~Ö|î#Dª~!°€{3SAxç|YLz/|ÖDÕ{&}-=†{à}‚6@|Œ}ò/:}R~x)~#o~ÿ–áý€Ràwq‚KÌxö‚D z¿=qzíX6U{£/h||€ø)'}c€è#Š~~€Î˜€¬NØ“ýO£HJ’„SÒAq‘X:=…\¤2áÙav+»Œ#f“%AŠzk䔈öqo‡´vçMÌúU¹GRíY}@€Ž¯]_9}?aq2l‹­eÁ+–ŠjO%lˆŸo ‡Rs嵆Gx§Mø[ËFŒ,_?ÕŒ)b„8êŠèf2‰‰iã+yˆ1mà%†íq÷ […Ýv/;… z>Lx‹aÐEêŠ|d¤?1‰¯g8{ˆ¬jŸ1ɇ‰mà+e†oqF%¯…jtÀ ¨„—xM¯ƒø{ªKÚˆ^gÎESˆj!>®‡{lˆ8†¨o1¢…¿q¹+\„âtŠ%Ï„wb ìƒ}zAƒ|ìKA…ïmÇDÆ…ño•>@…™qn7Ä„ös^1s„9up+cƒ‰w¤%ð‚ñyÚ!&‚Œ| a‚N~J¼ƒÐs“DL„ tÜ=ä„v"7†ƒ‹w{1L‚õxò+Z‚mz‚&÷|![À}œ¤®~ïJL‚y/Cç‚—yò=•‚¯zŸ7V‚^{X1-ê|2+E‹} &2~!„~ùÚ,´Iû€|~¥C—R~Û=U~æ71l~ù1$0+T€Ê|&(€–Ñ!š€ž€€Ä€Tÿÿÿÿÿÿmft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢FJý M`ñ¤Lræ§L„Ú¨P–ϦY¦Ç¥d±Ä§o¶Á§x»½§Àº¥‡Æ¶£‡Ë³ ‡Ð¯ˆÖ«š‹Ý¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦92ÿ¢EJý¡L`ò¥Kqæ©JƒÚªM•Ï©V¥È¨a°ÅªkµÂ¬uº¾«}¿ºªƒÅ¶¨‡Ê²¦‡Ð«¢‡Ö¤ž‰Üššáššáššáššáššáššáššáššáššáššáššáššáššáššáššáššáššáÿ¦82ÿ£EJý¢K`ò¦IqæªH‚Û­J“ЬR£É¬]¯Æ¯g³Ã±q¸¿³y½¸¯Ä²ª‡Ë¬¦†Ð¥£†ÕŸ†Ú“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þ“‹Þÿ§82ÿ£EJý¢J_ò§Hpç¬FܯG’Ò°N¡Ê±W­È¶b°Åºlµº³x¾²®Å­ª‡Ë§§…Ï ¤„Ó˜¡…ןˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚŸˆÚÿ§82ÿ£DKþ£I_ó©Foè®D€Ý³CÓ¶HŸÌ·QªÊÀ\¬½¸l·³²xÀ­®Æ©ª†Ê¢¨„Λ¥„Ñ”£„ÔŒ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×Œ¡‡×ÿ§72ÿ£DKþ¥G^óªDné±A߸>ŽÖ½B›ÏÃJ¤Â¾\¯¶·l¹®±xÁ©®Æ¥«…Éž©„̘§ƒÏ‘¥„ÒŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†ÔŠ£†Ôÿ¨72ÿ¤DKþ¦F^ô­Bmê´>}á½;‹ÚÆ<–ÊÆH¤¹¼\²¯¶m»©±yÁ¥®‚Å¡¬„È›ªƒË•©ƒÍ§„ω¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñ‰¦†Ñÿ¨72ÿ¤CKÿ¨C]õ¯?lì¸:zäÃ7‡ÝÓ5ÁÄI§±º^µ©µn¼¤±zÀ¢¯‚Ä­„ǘ¬„É’ª„Ë©…͈¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îˆ¨†Îÿ©62ÿ¥BKÿªA\ö²;jî½6wèË3€ÐÒ3“¸ÃK¨ª¹`¶¤µp¼¡²{Àž°ƒÃš®„Å•­„Ǭ„É‹«…ʇª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ì‡ª†Ìÿ©52ÿ¥BKÿ¬=Zø·7gñÄ1qß×,{ÅÐ5•°ÂN©¤¸c·Ÿµr¼³|¿›±ƒÁ—¯„Ã’®„ÅŽ­…ÆŠ¬†È‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡É‡¬‡Éÿª42ÿ¦@Kÿ°9Xù½1bçÎ-iÐà$¹Ï7—§ÂR©žºfµšµs»˜³}¾—²ƒÀ”±…Á°…ï…ĉ®†Å†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æ†®‡Æÿ«32ÿª;Iÿ¶2SðÇ*ZØÞ!fÂß$‚­Î<˜ŸÃV§™¼h²–·u¸”´}½“³ƒ¾‘²…¿Ž²†À‹±†Áˆ°‡Â†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃ†°ˆÃÿ­12ÿ°3EøÀ)LßÖ#MÇè j³Þ&„¡ÏA–—ÆY¤“Àj¬¼u²¹}¶·ƒ¸Œ¶„ºŠµ…¼ˆ´†½†³‡¾„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿„³ˆ¿ÿ¯/2ÿ¹)?èÎ?ÌæR·î!m¥Þ,ƒ—ÒE’Ë[ŒÅk¥‹ÂuªŠ¿|­‡¾°„¼€±ƒ¼‚²»ƒ³º„´~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µ~º†µÿ²*2ñÆ3Ñâ:¼óV¨î&m˜á5ŽØJŒˆÐ]•†Ìk›„Ét Çx£~Å{¥|Ä}¦{Ä~§yÀ¨x‚©wƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªwƒªú¾(ÖÝ#Àð?¬ýWœð-jå>y†ÞNƒØ_‹ÔkzÑp”wÏt—uÎw˜sÍyšrÍ{›qÌ}›pËœoË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€oË€ÙÒ Äí)°ýAŸÿ$U‘ô5e‡ëFpåTy{áavÝh„rÛn‡oÙq‰mØt‹kØwŒjÖyiÖzŽhÕ|ŽgÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~gÕ~ÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿPUú Peï£Quä¤S†Ú¢[–Рe¤Èp°Åœ{µÂœƒ¹¿š‰¾¼•‹ÂºŒÅ¸ŒÉ¶ˆ’̳„—ϲŸÒ­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Ó­¢Óÿ£9*ÿŸF@ÿžOTú¡Ndï¤Ouå¦Q…Ú¥X•Ñ¢b£ÉŸm¯ÅŸwµÂž€¹¿ˆ¾¼™‰Ã¹”‹Ç¶Ë³ŠÏ±†–Ô®ƒ ×§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õ§¡Õÿ£9*ÿ F@ÿžNTú¢Mdð¥Ntå¨O„Û§U”Ò¥_¡Ê£i­Å¢t´Â¡}¹¿ …¾»ˆÃ¸˜‰Èµ“‹Í±ŽŽÓ®‰–ا…Ú¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Ö¡… Öÿ£9*ÿ F@ÿŸMTû£Ldð§Ltæ©NƒÜªS’Ò©[ Ë¦f«Æ¥p³Ã¥z¸¿¤‚½»¢‡Ã¸‡É³˜‰Ï°”ŽÕ«’—Ú ŠœÜ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØ›‰ŸØÿ£8*ÿ E@ÿ LTû¤Kcñ¨Ksæ«LƒÝ­P‘Ô¬XžÌªb©Çªl±Äªv¶Àª~¼¼¨„¸¤†É³¡ˆÏ¬œÕ£–”Úš‘œÜ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØ–ŽžØÿ¤8*ÿ E@ÿ KSû¥Jcñ©Irç­JÞ°MÕ°UœÎ°^§É°h¯Æ²s³Ã²|¸½°€Á¶¬‚É®§…Ï¥¡ŠÕœœ‘Ú•™œÜ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙ‘”žÙÿ¤8*ÿ E@ÿ¡JSû¦Hbò«Hqè¯H€ß³JŽÖµQšÐ¶Z¤Ì¸e«Ê½q®Á¹{¶·²€À®¬„Ȧ¨…Τ‡Ô” ŽØŽŸ™ÛŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙŒ›žÙÿ¤8*ÿ¡E@ÿ¢ISü§Gaò­Fpé²Fà·GŒÙ»N—Ó¿WŸÐÅc¤ÅÀp­º¸y·°²€À©­…Ç ¨„Í—¥…ÒŽ¡‰×‡ ’Ù‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØ‡¡œØÿ¤7*ÿ¡D@ÿ£HRü©Eaó®DoêµC}â¼D‰ÜÂJ“ØÊT™ÊÆb¤¼½n°²¶x¹ª±€Á¤­…Ç›©„Ì“¦„Њ£‡Ôƒ¢ŽÖ‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Ö‚¢–Öÿ¥7*ÿ¡DAÿ¤FRýªD`ô±Bnë¸A{äÁB†ßÌFÓÏR—ÁÄa§³»m³«µx»¥±€ÁŸ®„Ƙ«„ʨ„Έ¦†Ñ‚¤ŒÓ€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Ó€¤’Óÿ¥7*ÿ¡DAÿ¥EQþ¬B_õ´?lí¼>xçÇ@àÖF‡ÉÍQš¸Â`ª¬ºmµ¥µx¼ ±€Á›®„Å•¬„ÈŽª„ˇ¨†Î‚§‹Ï¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ð¦Ðÿ¥6*ÿ¢CAÿ§CPÿ®?]÷·Ž³ÉR §Àc­Ÿ¹p¶šµz¼˜²¿”±…¯…Ä‹®†Å†­‡Ç‚¬ŠÈ«É«É«É«É«É«É«É«É«É«É«É«É«É«É«Éÿ§5*ÿ£BAÿ¬?ÿ±7Jù¾0RçÏ/UÑâ,hÀá0­ÒB“ ÈW¡˜Ág«”¼s²’¸|·¶‚ºŽ´…¼‹³†¾ˆ²‡À…±‰Áƒ±ŠÁ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂ°ŒÂÿ©2*ÿ«8=ÿ¸/EîÈ)HÖß%RÃì)l±ß1‚¡ÒE’—ÊZŸ‘Ãi§Ž¿t­¼|±‹º´ˆ¹ƒ¶…¸„¸ƒ·†¹¶‡ºµ‰»~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼~µ‹¼ÿ«0*ÿ±/8öÂ&<ÜÚ;Æë#W³ì*o£ß5‚–ÔJÍ]š‹Èk¡‰Äu¦†Â{ªƒÀ~¬¿€®¾‚°}½ƒ±{¼…²z»‡³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³y»ˆ³ÿ­.*þ»%0ãÒ-ÉèA¶÷#Z¥ì.o–á<ŒØO‹‡Ò_“„Íl™Êtž~Èx¡{Ç{£yÆ}¤xÅ¥vĦuçtĨs†©s†©s†©s†©s†©s†©s†©s†©s†©s†©s†©s†©s†©s†©s†©ÿ´$%ìÊ#Íå,¹öF§ú&[˜î5lŒåDz„ÞSƒ€ÙbŠ|ÕlxÒq“uÐu•sÏx—qÎz˜pÍ|™oÍ~šnÌ€›mÌ‚œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œlË„œõÁÑß ¼ó1ªÿGšü,YŽò]ù½?fîÈCmãÖMoÕÝNÄÓY‘µÉfŸ©Áq« »y³™¶€º”²…ÀŒ¯†Ä†­ˆÇ€«ŒÉ|ª’Êz«œÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊy«ŸÊÿ£5"ÿ B7ÿ¦AEÿ¯=Pþ¸;YóÄ6ÿ­9Aÿ¸4HðÆ3MßÙ6PÍå6g¾ä;{­×HŒ ÍX™—Æg¤’Ár«Ž½{°Œº´ˆ¸ƒ·„·…¹‚µˆ»´Š½|³¾z³‘¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿z³“¿ÿ¦2"ÿ¦:4ÿ²3=÷À.BäÒ/AÏä.U¿ï3k¯á;~ ÖJ–Î[™Èi¡ŒÃs¨‰À{¬†¾¯‚¼²€»„³}º†µ{¹ˆ¶y¸‹·w·¸w·¹w·¹w·¹w·¹w·¹w·¹w·¹w·¹w·¹w·¹w·¹w·¹w·¹ÿ§1"ÿ¬31ÿ¹+6êÌ&6Òá&AÁï,Z°í3n¡á=•×MŒÐ^–‰Ëk†Çt¢ƒÄz¦Ã}©|Á€«zÀ‚¬y¿„­w¾†¯u¾‰°s½Œ±s½±s½±s½±s½±s½±s½±s½±s½±s½±s½±s½±s½±s½±ÿ©.!ÿ³*+òÅ",ÖÞ-Ãí#G²ù+]¢ì6o•âB}‹ÚRˆ…Ô`‚Ðl–~Ìs›{ÊwžxÉ{ vÈ~¢tÇ€£sÆ‚¤qÅ„¥pć¦nÄŠ§n˧n˧n˧n˧n˧n˧n˧n˧n˧n˧n˧n˧n˧ÿ¬* ú½"ÜÙÅë3´ú#J£ù.^•îÿ¤FJÿªFVü®Hbô³Kmî¸Owè½UáÁ^†ÖÀlŽÈ·q½®wª²§}´©¡‚»¡œˆÁš˜Æ”––É”ŸËŒ’¨ÌŠªÉŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆŠŽ¬ÆÿŸ6ÿœC.ÿŸF>ÿ¥EJÿ«EUü°Faö¶Ikð¼NtçÂU{ßÈa€ÑÃjĺp¸²u©­«{³£¥€»›¡†Á”ÅŽ›”ÈŠ™Ê†™¨Ë†”ªÉ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«Æ†’«ÆÿŸ5ÿB.ÿ E=ÿ§DIÿ­CTþ³D_÷ºGhïÁMpåÉVuÜÎdzÌÆi¾¾nœ²¶t¨§°y²ž«~º•¦„ÀŽ£‹Äˆ¡’Ç„ŸšÉ€Ÿ§ÊšªÈ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æ‚˜«Æÿ 5ÿB.ÿ¡D=ÿ¨BHÿ¯ASÿ¶B]÷¾FeìÇMkãÒXmÖÓazÇÊgŒ¹Âm›¬¼r§¡¶w±˜±}¹­‚¾ˆª‰Ã‚¨Æ}§™Èz§¥É{¢«È}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æ}ž¬Æÿ 5ÿB.ÿ¢B<ÿª@Gÿ²>Qýº@YóÃD`èÏNcßÜYgÏØ`yÀÏfвÈkš¦Âp¦›¼v¯‘¸{·‰µ¼‚²‡À}°ŽÃx®–Åv­¡Æu¬¬Æw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åw¦­Åÿ 4ÿžA.ÿ¤@;ÿ¬=Eÿµ;N÷¿>UìËDYáÚOZÔßQlÆÚZ}¸Ób‹«Îi˜ŸÆq¤•Àw­Ž»~´‡·ƒ¹´‡½|²Œ¿y±“Áv°›Ât°¦Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âr°­Âÿ¡3ÿžA/ÿ§=:ÿ°:Cýº8JðÆ;OãÕENÕáF_ÈâKqºÝR¬Õ[ŸÌf›–Æp¤Àx«Š¼±„¹ƒµ€·‡¸|¶‹»y´¼w´—½v´¡½t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾t³¥¾ÿ¢3ÿ >.ÿª97ÿ´5?öÀ5DçÏ9E×ßÿ«BHÿ±DRú·HZð½NaæÄVgÞÉbmÎÁgÁ¹m޶±r›«ªx¦¢¥~®™ „µ’‹ºŒš“¾‡˜›À„—¤Â‚–¯Âƒ“°À„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾„‘²¾ÿ›3ÿšA&ÿŸB3ÿ¦@=ÿ­@Gÿ´BO÷»GWíÃM]äÌX`ÙÍ`lÉÅf~¼½k°µqš¥¯v¥œª|­“¦‚´Œ¢‰¹† ½ž™¿}ž¢Á{ž¯Á}™°À–²¾–²¾–²¾–²¾–²¾–²¾–²¾–²¾–²¾–²¾–²¾ÿœ3ÿšA&ÿ A2ÿ¨?<ÿ°>Eÿ·AMôÀESêÉNVâÕZWÒÑ^kÄÉd}¶ÁjŒª»o™Ÿµt¤–°z¬¬€²†©‡·§Ž»z¦–¾w¥ ¿t¦­¿w¡±¿z²¾z²¾z²¾z²¾z²¾z²¾z²¾z²¾z²¾z²¾z²¾ÿ3ÿ›A&ÿ¢?1ÿª<:ÿ³IðÆDMæÒOMÜÜWVÌÕ]j¾Íc{°Çh‹¤Ám—™¼s¢¸xª†´~°²…µy°Œ¸t¯•»q®Ÿ¼n¯«½qª³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼t¥³¼ÿ3ÿ›@&ÿ¤<0ÿ­98ÿ¶9?õÁ%ÿ§9.ÿ±65û¼6:íÉ:<àÚD:ÒâGLÇâM^¹ÞTn¬Ù[|ŸÔbˆ”Ðh“ŠÌo›‚Çw¢|Ã~¨vÀ„¬r¾Š¯o¼‘±m¼˜²k»¡³j»­²gº¶´gº¶´gº¶´gº¶´gº¶´gº¶´gº¶´gº¶´gº¶´gº¶´gº¶´ÿŸ2ÿ :$ÿª4,ÿµ21óÃ23ãÔ80ÓáW¬éEgžçKu’àS€‰Ù^‰‚Ôh‘|Ðq–xÌw›tÊ}žpÈ‚¡nLJ£kÅ‹¥iĦhÄ–§fÞ¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨eÃ¥¨ÿ¡/ÿ¨/ÿµ*"ðÆ$!ØÝ# Èé-5ºò5I¬ñžÿ4N’ú?\ˆòJfìUoyè^uräd{nák~jßphÞu„eÜy…cÛ}‡bÚˆ`Ú„‰_Ù‡Š]Ø‹‹\׌[Ö”[Ö”[Ö”[Ö”[Ö”[Ö”[Ö”[Ö”[Ö”[Ö”[Ö”ÿ° íÆÍÛ »ó¬ÿ!.žÿ,?’ÿ7M‡ýDXöOaxñYhqí_mjëdqgèjtdçowbåty`äxz_ã{{]ã~|\â}[á„~ZáˆYàŒ€XàXàXàXàXàXàXàXàXàXàXàó½ ÌÏ ½å ¬ÿžÿ$/’ÿ/=‡ÿ=IÿIRxüTZpøZ_iô_ddòegaðji^ïnk\îrm[ívnZìyoXì|pWë~pVëqUê„rTêˆsSé‹tSé‹tSé‹tSé‹tSé‹tSé‹tSé‹tSé‹tSé‹tSé‹tSé‹tÌÆ½Ô­õŸÿ“ÿ'-ˆÿ49~ÿBCwÿMJnÿSPgÿYUbü^X^ûd[[ùh]Yøl^W÷p`V÷saUövbTõxbSõ{cRô}dQô€dPóƒeOó†fOó†fOó†fOó†fOó†fOó†fOó†fOó†fOó†fOó†fOó†f½Ë®ÛŸÿ“ÿˆÿ*(~ÿ82vÿD:mÿKAeÿQF_ÿWI[ÿ]LXÿbNUÿfPSÿjQRÿmRPÿpSOÿrTNÿuTMÿwUMÿyULþ{VKþ~WJýWJýWJýWJýWJýWJýWJýWJýWJýWJýWJýWÿ-ÿŒ>ÿŠL.ÿ’S;ÿ”WHÿ•\Tý“b`õ‘jkïrvé‰|ä…„†à€‹Ü|‘’Úy—–Øvœ™Õs ›Ôq¥Óo©ŸÒn® Òm³¡Ñl¹¢ÑkÀ£ÍlÅ£ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÿ-ÿŒ>ÿŠL.ÿ’S;ÿ”WHÿ•\Tý“b`õ‘jkïrvé‰|ä…„†à€‹Ü|‘’Úy—–Øvœ™Õs ›Ôq¥Óo©ŸÒn® Òm³¡Ñl¹¢ÑkÀ£ÍlÅ£ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÿ-ÿŒ>ÿŠL.ÿ’S;ÿ”WHÿ•\Tý“b`õ‘jkïrvé‰|ä…„†à€‹Ü|‘’Úy—–Øvœ™Õs ›Ôq¥Óo©ŸÒn® Òm³¡Ñl¹¢ÑkÀ£ÍlÅ£ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÿ-ÿŒ>ÿŠL.ÿ’S;ÿ”WHÿ•\Tý“b`õ‘jkïrvé‰|ä…„†à€‹Ü|‘’Úy—–Øvœ™Õs ›Ôq¥Óo©ŸÒn® Òm³¡Ñl¹¢ÑkÀ£ÍlÅ£ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÿ-ÿŒ>ÿŠL.ÿ’S;ÿ”WHÿ•\Tý“b`õ‘jkïrvé‰|ä…„†à€‹Ü|‘’Úy—–Øvœ™Õs ›Ôq¥Óo©ŸÒn® Òm³¡Ñl¹¢ÑkÀ£ÍlÅ£ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÈnÆ¢ÿ-ÿ>ÿŒL.ÿ”S;ÿ•VGÿ–[Tý•a`ö’hkïpué‹z䇃‡ß‚ŠÜ~’Ùz–—Öw›šÕt Ór¥ŸÒp©¡Ñn®¢Ðm´£Ðlº¤Ðl¤ÊnĤÄoĤÄoĤÄoĤÄoĤÄoĤÄoĤÄoĤÄoĤÄoĤÄoĤÿŽ-ÿŽ>ÿŽK.ÿ•Q:ÿ˜TGÿ˜XSþ˜^_ö•djï’luéŽv~䊀‡ß…‡ŽÛ€Ž”Ø|”˜ÕyšœÓvŸŸÑs¤¢Ðqª¤Ïo¯¥În¶¦Îm½§Ên§Ãp§½q§½q§½q§½q§½q§½q§½q§½q§½q§½q§ÿ-ÿŽ>ÿJ-ÿ—O:ÿ™QFÿ›VRþš[^÷˜aið•htê‘q~äŽ|†ß‰„ŽÛƒ‹”×’šÔ{˜žÒwž¡Ðt¤¤Îrª¦Íp±¨Ío¹©ËoÁ©ÃqÁ©¼rÀª·sÀª·sÀª·sÀª·sÀª·sÀª·sÀª·sÀª·sÀª·sÀª·sÀªÿ-ÿ>ÿ’J-ÿ˜M9ÿ›OEÿSQÿX\ø›^hñ™erê•m|ä‘w†ßŒŽÛ‡‰•ÖšÓ}–ŸÐy£Îu£¦Ír«©Ìp³ªËo½«År¿«½s¿¬¶t¾¬±u¾­±u¾­±u¾­±u¾­±u¾­±u¾­±u¾­±u¾­±u¾­±u¾­ÿ-ÿ>ÿ“I-ÿ™L9ÿNDÿŸQPÿŸV[ùž\fòœbqë˜i{å”s„à}ÛŠ†”Ö„›Ò• Ïzœ¥Ív£¨Ës««Êqµ­Æq¾­¾t½®¶u½®°v½®¬w½®¬w½®¬w½®¬w½®¬w½®¬w½®¬w½®¬w½®¬w½®¬w½®ÿ-ÿ>ÿ•I,ÿ›J8ÿžLCÿ¡OOÿ¢TZú¡Yeó _oìfyæ˜oƒà“yŒÛŽ‚“Ö‡Š›Ò’¡Ï|š¦Êx¢ªÇu«­Ãs´¯¿s¼°·u¼°°w»°ªx»°§y¼°§y¼°§y¼°§y¼°§y¼°§y¼°§y¼°§y¼°§y¼°§y¼°ÿ‘-ÿ‘>ÿ–H,ÿœH7ÿ JBÿ£MMÿ¤RXû¥Wcô¤]mî¡cwèžk€â˜u‰Ü’~’ÓŒ‡šÌ†¡Æ€—§Á|ž¬½y¦¯¹v¯±·vº²¯wº²ªyº²¥zº²¢{»±¢{»±¢{»±¢{»±¢{»±¢{»±¢{»±¢{»±¢{»±¢{»±ÿ‘-ÿ‘>ÿ˜G,ÿG7ÿ¡HAÿ¥KLÿ§PVü¨Uaõ¨[kí§atå¤i~ÞŸs‡Ô˜}Ë‘„šÄŠŒ¢¾„“¨¸€š­´|¢°°z«³­yµ´¨z¹´¤{¹´ }¹³}º³}º³}º³}º³}º³}º³}º³}º³}º³}º³ÿ’-ÿ’>ÿ˜F+ÿžF6ÿ£GAÿ§IKÿªNUú«S^ò¬Yhé¬`qâ©hzÙ¥sƒÍœzÅ•š½Žˆ¢·ˆ©±„—®¬€Ÿ±¨~§´¥}±µ¡}¸¶~¸µš¹´™€º³™€º³™€º³™€º³™€º³™€º³™€º³™€º³™€º³™€º³ÿ’-ÿ’>ÿ™E+ÿŸD5ÿ¤E@ÿ©HIÿ¬LSø®R\ï°Xeæ±_mÞ°ivÒ©q‚È x¿˜~š·’…¢°ŒŒ©ªˆ”®¤…œ² ‚¤µ®¶š€··—·¶•‚¹´”‚¹³”‚¹³”‚¹³”‚¹³”‚¹³”‚¹³”‚¹³”‚¹³”‚¹³”‚¹³ÿ“-ÿ’=ÿšD*ÿ C5ÿ¦D>ÿ«FHÿ®KQõ²PYìµWaä·^iÚ´isͬo‚¤v¹œ|™±–ƒ¢ª‘Š©£Œ‘®ž‰™²™‡¡µ–…«·“…¶·‘„··…¸µ…¹´…¹´…¹´…¹´…¹´…¹´…¹´…¹´…¹´…¹´ÿ“-ÿ“=ÿ›C*ÿ¢B4ÿ¨B=ÿ­EFü±JOòµOVéºV]á½`dÔ¸grȯm½§tŽ´ z™«š€¢¤•‡©‘Ž®—Ž–²’‹ŸµŠ¨·ŒŠ³¸‹‰··‹ˆ¸µ‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´‹ˆ¹´ÿ“-ÿ“=ÿœA*ÿ£@3ÿ©A<ÿ¯DEú´HLðºNSç¿VYÞÂ``Ï»fqól¸«rŽ®¤x˜¥ž~¡žš„¨—–Œ®‘“”²Œ‘œµˆ¦·…±¸…޶·†¸¶‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µ‡Œ¸µÿ”,ÿ”=ÿ@)ÿ¤>2ÿ«?;ÿ±BBø¸GIí¾NOåÆWSÚÆ^_˾dq¾¶j€³¯p©©v˜ £|¡˜Ÿ‚¨‘›‰­Š™’²…–𵕤·•®·~”··‘·¶‚¸µ‚¸µ‚¸µ‚¸µ‚¸µ‚¸µ‚¸µ‚¸µ‚¸µ‚¸µÿ”,ÿ”=ÿž?(ÿ¦=1ÿ­>9ÿ´A@ô¼FEëÄMIâÎXKÓÊ\^ÆÂcp¹ºh®´nŒ£®t—š©zŸ’¥€§Š¡‡¬„Ÿ±—´{œ¡¶x›¬·w›·¶z—¸µ|•¹´|•¹´|•¹´|•¹´|•¹´|•¹´|•¹´|•¹´|•¹´|•¹´ÿ•,ÿ•=ÿ ='ÿ¨;0ÿ°<7ý¸?<ñÁD@èËNBÞÓUJÎÍ[]ÀÆan´¿g~¨¹mŠ´r•”¯xž‹«~¥„¨…ª}¦Œ¯x¤•²t£Ÿ´q£ªµp£¸µsž¹´v›¹³v›¹³v›¹³v›¹³v›¹³v›¹³v›¹³v›¹³v›¹³v›¹³ÿ–,ÿ—<ÿ¢:&ÿª9.ÿ³:4ù½<8îÈC9ãÕP7×ÚRHÈÒY\ºË_m­Åe|¡Àk‰—ºp“¶vœ„³|¢}°ƒ¨w®Š¬r­“¯n¬±k¬¨²i­¶²l¨»±o£»±o£»±o£»±o£»±o£»±o£»±o£»±o£»±o£»±o£»±ÿ—,ÿš;ÿ¤7%ÿ­6+ÿ·70óÃ:1æÐC0ÜßJ5ÏßRGÁØXZ³Ñ^k¦ËczšÇi†Ân†¿t˜}¼zŸvº¤p¸‰¨k·’«h·œ­e·§®d·´®e³½®h­½®h­½®h­½®h­½®h­½®h­½®h­½®h­½®h­½®h­½®ÿ˜,ÿ9ÿ§4#ÿ±3(ù½2*êË7)ÜÝ>)ÐãF:ÅâMK¸ÞUZ¬Ù\hžÓbw’Ïg‚ˆËmŒ~És”vÇyšpÅŸjĉ¢fÃ’¥bܧ`æ¨_ô¨_Á¨aºÁ©aºÁ©aºÁ©aºÁ©aºÁ©aºÁ©aºÁ©aºÁ©aºÁ©aºÁ©ÿ™,ÿ 5ÿª1 ÿ¶.#ðÅ-"ߨ3Ðã:.ÄèB@¸åIP«áN_žÞUl’Û\w‡Øc~Õj‰vÔqoÑy”k΀˜g̈›dÊbɘŸ`É¡ _É« _ɹŸ\Èâ\Èâ\Èâ\Èâ\Èâ\Èâ\Èâ\Èâ\Èâ\Èâÿ›,ÿ¤0ÿ¯,ø¾'äÑ&Ñâ- Äë73·ë>EªéETžçLb’åRn†ãXx}à`vÜi†pØq‹kÕxhÓ’eц”bÏ–`Δ˜^Λ™]Í£š\Í­š[Í·š[Í·š[Í·š[Í·š[Í·š[Í·š[Í·š[Í·š[Í·š[Í·šÿ,ÿ¨+ÿ·$ëÊÓàÄë+&·ñ48ªðÿ>K†þGV}øQ^vóYenð_jhíendêkraéqt_çvv]æ{x[åyYä„zXãˆ|WãŒ}Vâ‘~Tá—SáœSáœSáœSáœSáœSáœSáœSáœSáœSáœÿ±ÔÇ ÆÖ ¶÷¨ÿ ›ÿ+0ÿ6=…ÿ@H}ÿKQuýTXmùZ]gö`bcófe_òkg\ðpiZïtkXîxlWí|nUì€oTì„pSëˆqRëŒqQê‘rPé•sPé•sPé•sPé•sPé•sPé•sPé•sPé•sPé•sPé•sÖ¾ÅË·Û ¨ÿ›ÿ"!ÿ..…ÿ9:|ÿDCtÿNJlÿTPeÿZT`ý_X]ûeZZúj\Wùn^Uør_T÷v`RöyaQö}bPõ€cOô„dNô‡dMóŒeLófLófLófLófLófLófLófLófLófLófÄÂ¶Ñ¨í ›ÿÿ%…ÿ1*|ÿ<4sÿF;jÿLAcÿSF^ÿYIZÿ^LVÿcNTÿhPRÿlQPÿoROÿrSNÿvTLÿyUKÿ|UJþVIþ‚WHý†XGýŠXGýŠXGýŠXGýŠXGýŠXGýŠXGýŠXGýŠXGýŠXGýŠX¶É¨Ù›ÿÿ…ÿ'{ÿ3$qÿ<,hÿC2aÿJ7[ÿP;VÿV=Sÿ\@Pÿ`ANÿdCLÿhDJÿkEIÿnFHÿqFGÿtGFÿvHEÿyHDÿ|ICÿ€IBÿƒJBÿƒJBÿƒJBÿƒJBÿƒJBÿƒJBÿƒJBÿƒJBÿƒJBÿƒJÿ‚( ÿ‚9ÿH%ÿŠO1ÿŽV=ÿ\IÿŽcTþŠj^ø…qhò€zpî|ƒwêx‹}çt’‚äq˜…âoˆám¢‹àk§ßi¬ŽÞh±Ýg·‘Ýf½‘ÜeÅ’ÜeÍ’ÔfÑ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÿ‚( ÿ‚9ÿH%ÿŠO1ÿŽV=ÿ\IÿŽcTþŠj^ø…qhò€zpî|ƒwêx‹}çt’‚äq˜…âoˆám¢‹àk§ßi¬ŽÞh±Ýg·‘Ýf½‘ÜeÅ’ÜeÍ’ÔfÑ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÿ‚( ÿ‚9ÿH%ÿŠO1ÿŽV=ÿ\IÿŽcTþŠj^ø…qhò€zpî|ƒwêx‹}çt’‚äq˜…âoˆám¢‹àk§ßi¬ŽÞh±Ýg·‘Ýf½‘ÜeÅ’ÜeÍ’ÔfÑ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÿ‚( ÿ‚9ÿH%ÿŠO1ÿŽV=ÿ\IÿŽcTþŠj^ø…qhò€zpî|ƒwêx‹}çt’‚äq˜…âoˆám¢‹àk§ßi¬ŽÞh±Ýg·‘Ýf½‘ÜeÅ’ÜeÍ’ÔfÑ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÏhÒ’ÿ‚( ÿƒ9ÿƒG%ÿŒN1ÿU=ÿ‘[HÿaSþh^øˆohòƒxpí~‚xézŠ~æv‘ƒäs—‡âpŠàn¢Œßk§ŽÝj¬Ýh²‘Üg¸“Ûf¿“ÛfÇ”ÙfДÏhГËiДËiДËiДËiДËiДËiДËiДËiДËiДÿƒ( ÿƒ9ÿ†F$ÿŽM0ÿ“T<ÿ”XGÿ’^Sÿe]øŒmgò†upíxé}‡~åy„âu•ˆàr›ŒÞo¡Ýl§‘Ük¬“Ûi³”Úhº–ÙgÖÙfÍ—ÐiΖÈjΗÄkÍ—ÄkÍ—ÄkÍ—ÄkÍ—ÄkÍ—ÄkÍ—ÄkÍ—ÄkÍ—ÄkÍ—ÿ„( ÿ„9ÿˆE$ÿ‘L0ÿ•Q;ÿ–VGÿ•\Rÿ“b\ùjfóŠrpí…{x逄å{Œ…âw“ŠßsšŽÝp ‘Ûm¦”Úk­–Ùi´—Øh½˜ØgÈ™ÑiÌ™ÉkÌ™ÂlÌš½mËš½mËš½mËš½mËš½mËš½mËš½mËš½mËš½mËšÿ…( ÿ…9ÿŠD$ÿ“K/ÿ—O:ÿ˜TFÿ—YPÿ–`[ù’geóŽooî‰xwéƒä~Š…áy‘‹Þu˜ÜqŸ“Ún¦–Øl®˜×j¶šÖhÁ›ÓiË›ÊkË›ÂmÊœ»nʸoʸoʸoʸoʸoʸoʸoʸoʸoÊÿ…( ÿ†9ÿŒD#ÿ•J/ÿ™M:ÿšQDÿšVOÿ™]Zú–ddô’knîtvé‡~~䇅à|‹Ýw—Ûsž•Øo¦˜Öl¯šÕj¹œÔiÆËlÉÃmÉž¼oÈŸµpÈŸ²qÈŸ²qÈŸ²qÈŸ²qÈŸ²qÈŸ²qÈŸ²qÈŸ²qÈŸ²qÈŸÿ†' ÿ†9ÿŽC#ÿ—I.ÿšK9ÿœOCÿTNÿœZXûš`bõ–hlï‘ouê‹y~å…ƒ…àŒŒÝy•‘Ùt–Ôp¥šÐn®Íl·ŸËkàÃnÇ »oÇ¡µqÆ¡¯rÆ¡¬sÆ¡¬sÆ¡¬sÆ¡¬sÆ¡¬sÆ¡¬sÆ¡¬sÆ¡¬sÆ¡¬sÆ¡ÿ‡' ÿ‡9ÿB#ÿ˜G-ÿœI8ÿŸLBÿ QLÿ WVûž^`ô›ejí–lsçv|ኀ„Û„‰‹Ó~‘’Îx™˜Ét¡œÆq©ŸÂp²¢Ào½£ºpÅ£³rŤ®sŤ©tÅ£¦uÅ£¦uÅ£¦uÅ£¦uÅ£¦uÅ£¦uÅ£¦uÅ£¦uÅ£¦uÅ£ÿ‡' ÿˆ8ÿ‘A"ÿšE,ÿžG6ÿ¡J@ÿ£PJþ£UTö¢\]ï bgèœipá–tyÚ}‚щ†‹Ê‚“Å}•™Àyž¼v¥¡¸s­¤µr¸¥²ræ¬tæ§væ£wÄ¥¡xÄ¥¡xÄ¥¡xÄ¥¡xÄ¥¡xÄ¥¡xÄ¥¡xÄ¥¡xÄ¥¡xÄ¥ÿˆ' ÿˆ8ÿ“A"ÿ›D,ÿ E5ÿ£I?ÿ¥NHû§TQó¦Z[ë¥`dã¢hmÜsvÑ•z‚É‚‹Â‡Š“¼‚‘š·}™Ÿ²z¡£¯w©¦«v³§©vÀ¨¤w¨¡y§zç›zæ›zæ›zæ›zæ›zæ›zæ›zæ›zæ›zæÿˆ' ÿ‰8ÿ•@!ÿB+ÿ¢D4ÿ¥H=ÿ¨LFøªROï«XWç«_`à¨iiÔ¡puË™xÂ’‹»‹†”µ†Žš¯‚• ª~¤¦{¦§£z°© y¼ªzÁ©š|Á©˜}¨–}§–}§–}§–}§–}§–}§–}§–}§–}§ÿ‰' ÿ‰8ÿ–?!ÿžA*ÿ£B3ÿ§F;þ«KDõ®QLì°WTä±^\Û­hfÏ¥nuÅu¼–|‹µƒ”®Š‹›¨†’ £‚š¥ž€¢¨›~¬ª˜~¸«–~À«”Àª“€Á¨’€Â¨’€Â¨’€Â¨’€Â¨’€Â¨’€Â¨’€Â¨’€Â¨’€Â¨ÿ‰' ÿŠ8ÿ˜? ÿŸ?)ÿ¥A2ÿªE:ü®IAò±OIéµVPá·_WÕ±eeʨltÀ¡s€·šz‹¯””¨ˆ›¢Š œ‡—¥—„ ¨”‚©ª‘‚µ«‚¿«ŽƒÀªƒÁ©ƒÁ¨ƒÁ¨ƒÁ¨ƒÁ¨ƒÁ¨ƒÁ¨ƒÁ¨ƒÁ¨ƒÁ¨ÿŠ' ÿ‹8ÿ™> ÿ¡>(ÿ¦@0ÿ¬C8ù±H?ðµNEçºUKÞ»^TдdeŬks»¤q€±žxŠ©˜~“¢“…š› –Œ•¥‘‰¨‡§«Š‡²¬ˆ‡¿¬ˆ‡À«ˆ†À©ˆ†Á¨ˆ†Á¨ˆ†Á¨ˆ†Á¨ˆ†Á¨ˆ†Á¨ˆ†Á¨ˆ†Á¨ˆ†Á¨ÿŠ' ÿŒ7ÿ›=ÿ¢='ÿ¨?/ÿ®B6÷´G<íºMAäÀVFÙ¿\SË·cdÀ¯is¶¨o¬¢uФœ|“œ˜ƒš•”Š ‘’¥ŠŽ›¨†¤«ƒŒ¯¬½¬‚Œ¿«ƒŠÀ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ƒŠÁ©ÿ‹' ÿŽ7ÿœ<ÿ£;&ÿª=-ÿ±@3ô¸E8ê¿L<âÇU@ÓÂZRǺac»³gr°­m~§§s‰ž¡z’–€™šˆŸ‰—¤„”˜¨“¢ª|’­«z’º¬{‘À«}Á©~ŽÁ¨~ŽÁ¨~ŽÁ¨~ŽÁ¨~ŽÁ¨~ŽÁ¨~ŽÁ¨~ŽÁ¨~ŽÁ¨ÿŒ' ÿ6ÿ:ÿ¥:%ÿ­;+ü´>0ñ¼C4çÅL6ÞËR?ÎÆYQ¾`b¶¸fp«±l}¡¬rˆ˜§x‘£~˜‰ …ž‚£}›–§x™Ÿ©u˜ªªs™·«t˜Àªw”Á©x“¨x“¨x“¨x“¨x“¨x“¨x“¨x“¨x“¨ÿŒ' ÿ‘5ÿŸ8ÿ§8#ÿ¯9(ù¸<,îÂB.åÍL-ØÐO=ÉÉWP¼Ã^`°¼do¥·j|›²p†’­vŠ©|–‚¦ƒœ|¤‹¡v¢“¥r¡§o ¨©m µ©m Á¨p›Â§r™Â§r™Â§r™Â§r™Â§r™Â§r™Â§r™Â§r™Â§r™Â§ÿ& ÿ”4ÿ¡6ÿª6!ÿ³6%õ¾9'êÉ@&àÖI(ÑÕN<ÃÎVN¶È\_ªÂcmŸ½hz”¸n„‹´tƒ±z”|®šu¬ˆžp«‘¢k©›¤h©¦¦f©³¦fªÃ¥i¤Ä¥k¡Ä¥k¡Ä¥k¡Ä¥k¡Ä¥k¡Ä¥k¡Ä¥k¡Ä¥k¡Ä¥k¡Ä¥ÿŽ& ÿ—3ÿ£4ÿ­3þ¸2 ðÅ5 ãÓ?ØÞE&ÊÛM:½ÓTL°Î[]£Éak˜ÄgwÀl„½r‰|ºxu¸–o¶‡šjµe´š b³¥¡a´±¢`µÂ¡b¯Æ¢d«Æ¢d«Æ¢d«Æ¢d«Æ¢d«Æ¢d«Æ¢d«Æ¢d«Æ¢d«Æ¢ÿ& ÿ›1ÿ¦1ÿ±.÷¾-çÎ1ÙÞ9ÍãD(ÂàM8µÛSJ¨ÕYZœÐ_hÌes†Ék}}Æq…uÄw‹nÃ~iÁ†”dÀ—`Àšš]À¥›[À±›ZÁÁ›[¼Êœ]·Ê]·Ê]·Ê]·Ê]·Ê]·Ê]·Ê]·Ê]·Êÿ‘& ÿŸ/ÿª-ÿ·(íÈ&ÚÜ)Ìä6Áæ@.¶ãH>ªàNLžÝVY’Ú]eˆÖco~ÔjxvÒpnÐw…hωc·_Î[Íš’YÍ¥“Wβ“VÏ“VËДWÅÏ•WÅÏ•WÅÏ•WÅÏ•WÅÏ•WÅÏ•WÅÏ•WÅÏ•WÅÏ•ÿ“& ÿ£,ÿ°&õÀ ßÕÍä'Áë4#µê=3©çEBåKP‘ãR\†âXf|à_ntßfulÞmzfÞuaÝ}‚]܆…ZÛˆXÙ˜ŠVØ¡‹Tج‹TØ·ŒSØÉ‹SÖÖ‹SÖÖ‹SÖÖ‹SÖÖ‹SÖÖ‹SÖÖ‹SÖÖ‹SÖÖ‹SÖÖ‹ÿ—$ ÿ©& þ¸ æÎÎãÀî&´ð2(¨î;8œíCF‘ìKR†ìR\|ëYdsë^kjêdpeèluaætx^ä|{[âƒ}Yà‹Vß’UÞšƒSÞ¢ƒRݪ„Qݶ„QÝ¿„QÝ¿„QÝ¿„QÝ¿„QÝ¿„QÝ¿„QÝ¿„QÝ¿„QÝ¿„ÿŸ!ÿ°éÅ ÐÙ Àî ³ö&§õ1,›õ;:õDG…õLQ|õSZsõY`kó_feðfjaímm]ëtpZêzsXètVç‡vTæxSå”yQä›zPä¡{Oãª|Nã°|Nã°|Nã°|Nã°|Nã°|Nã°|Nã°|Nã°|Nã°|ÿ¨ë¼ ÍÌ Áà ²ú¥ü' šý2.ý=;…þEE{ÿMNrÿTUkûZZdø`_`ögb\ômeYòrgWñxiUð~jSïƒlQî‰mPínNì”oMëšpLë¡qKê¦rKê¦rKê¦rKê¦rKê¦rKê¦rKê¦rKê¦rKê¦r÷³ Ìÿѱï¤ÿ™ÿ)!Žÿ4.„ÿ?9{ÿGAqÿNHjÿTNcÿZR^þ`VZüfXWûlZUúq\Sùv^Qøz_O÷`Nö„aLõ‰bKõŽcJô”dIóšeHóžfHóžfHóžfHóžfHóžfHóžfHóžfHóžfHóžfÍ»½Ç±Ø£ÿ˜ÿÿ, ƒÿ7+zÿA4pÿG;hÿMAaÿTE\ÿZIXÿ_KUÿeMRÿjOPÿnQNÿrRLÿwSKÿ{TIÿUHþ„VGþˆWFýWDý“XDü–YDü–YDü–YDü–YDü–YDü–YDü–YDü–YDü–Y½¿°Î¢à—ÿŒÿ"ƒÿ.yÿ8%nÿ>-fÿE2_ÿL7YÿR;UÿX>Qÿ]@OÿbBLÿfCJÿjDIÿnEGÿrFFÿvGEÿzHCÿ~HBÿ‚IAÿ†J@ÿ‹K?ÿK?ÿK?ÿK?ÿK?ÿK?ÿK?ÿK?ÿK?ÿK¯Æ¢Ö–÷ ‹ÿ‚ÿ$wÿ-lÿ3cÿ:$\ÿB(VÿI,QÿO/NÿU1KÿZ3Hÿ^5Fÿb6Dÿf7Cÿi8Aÿl8@ÿp9?ÿs:>ÿw:=ÿ{;<ÿ~<:ÿƒ<:ÿ†=:ÿ†=:ÿ†=:ÿ†=:ÿ†=:ÿ†=:ÿ†=:ÿ†=:ÿ†=ÿu$ÿv5ÿwCÿ€J'ÿ…R3ÿ†Y>ÿ…`HÿhRÿ|oZüwyb÷sƒhôoŒnñl“rïjšuíg xìe¥zëdª|êb¯}éaµ~è`»è_Àç_Ëæ^Õà`Û×bÞÔcßÔcßÔcßÔcßÔcßÔcßÔcßÔcßÿu$ÿv5ÿwCÿ€J'ÿ…R3ÿ†Y>ÿ…`HÿhRÿ|oZüwyb÷sƒhôoŒnñl“rïjšuíg xìe¥zëdª|êb¯}éaµ~è`»è_Àç_Ëæ^Õà`Û×bÞÔcßÔcßÔcßÔcßÔcßÔcßÔcßÔcßÿu$ÿv5ÿwCÿ€J'ÿ…R3ÿ†Y>ÿ…`HÿhRÿ|oZüwyb÷sƒhôoŒnñl“rïjšuíg xìe¥zëdª|êb¯}éaµ~è`»è_Àç_Ëæ^Õà`Û×bÞÔcßÔcßÔcßÔcßÔcßÔcßÔcßÔcßÿv$ÿw5ÿyBÿ‚I'ÿ‡Q2ÿˆX=ÿ‡_HÿƒfQÿ~nZûywb÷u‚iôqŠnñm’sîk™vìhŸyëf¤{êdª}éc¯èbµ€ça¼ç`Ä‚æ_΂ã_׃ÜaÛƒÒc݃Ïd݃Ïd݃Ïd݃Ïd݃Ïd݃Ïd݃Ïd݃Ïd݃ÿw$ÿx5ÿ|Aÿ…H'ÿŠO2ÿŒV=ÿ‹]Gÿ‡dQÿ‚lZû|tb÷xiótˆoðptíl—xëjž{ég¤~èfª€çd°‚æb¶ƒåa¾„å`Ç…å`Ó…ÝbÙ…ÓdÜ…ÌeÛ†ÉeÛ†ÉeÛ†ÉeÛ†ÉeÛ†ÉeÛ†ÉeÛ†ÉeÛ†ÉeÛ†ÿx$ÿx5ÿ~@ÿˆG&ÿN1ÿU<ÿŽ[Fÿ‹bPÿ†iYü€qb÷{{ióv…pïrŽuìn•yêkœ}èi£€çf©‚åe°„äc·…äbÀ‡ãaˇßbÕ‡ÕdÚ‡ÍeÙˆÆgÙ‰Äg؉Äg؉Äg؉Äg؉Äg؉Äg؉Äg؉Äg؉ÿy#ÿy4ÿ€?ÿŠF&ÿM0ÿ’S;ÿ‘ZEÿ`OÿŠgYü„na÷~xiòy‚pït‹vëp“{ém›çj¢‚åg©„äe°†ãd¹ˆâbÉâbЊØdØŠÎfØŠÇg׋ÀhÖŒ¾iÖŒ¾iÖŒ¾iÖŒ¾iÖŒ¾iÖŒ¾iÖŒ¾iÖŒ¾iÖŒÿy#ÿz4ÿƒ>ÿE%ÿ“L/ÿ•Q:ÿ”WDÿ’]NÿŽeXüˆka÷‚tiò|pîwˆvës‘|èo™€æk¡„äh©‡âf±‰ád»‹àcÇŒÜcÔŒÏfÖŒÇhÕÀiÔŽºjÔŽ¸kÔŽ¸kÔŽ¸kÔŽ¸kÔŽ¸kÔŽ¸kÔŽ¸kÔŽ¸kÔŽÿz#ÿ{4ÿ…=ÿD$ÿ–J.ÿ—N8ÿ—TBÿ•ZLÿ’aVüŽi_ö‡phòzpí{…wêvŽ|æq—ãmŸ†àj¨‰Ýg°ŒÚf»ÖeÇŽÑfÔÇhÓ¿jÓ¹kÒ‘³lÒ‘²mÒ‘²mÒ‘²mÒ‘²mÒ‘²mÒ‘²mÒ‘²mÒ‘²mÒ‘ÿ{#ÿ|4ÿˆ<ÿ’C$ÿ˜H-ÿšL7ÿšRAÿ™XJü—_Tö“f]ðnfë‡woæ€vá{‹}Üu“ƒ×qœ‡Òn¤‹Ïk¬ŽÌiµ‘ÉhÀ’ÇhÏ“¿kÑ“¸lГ²mД­oГ«oÑ“«oÑ“«oÑ“«oÑ“«oÑ“«oÑ“«oÑ“«oÑ“ÿ|#ÿ}4ÿŠ;ÿ”A#ÿšF,ÿœK5ÿP?ÿVHø›]Qñ˜c[ë“kdäumÞ†~uØ€‡|ÑzƒÌv—‰ÇrŸÄo§‘Àm°“¾l»•»kÈ–¶mÏ–°oΖ«pÏ–¦qÏ•¥rÏ•¥rÏ•¥rÏ•¥rÏ•¥rÏ•¥rÏ•¥rÏ•¥rÏ•ÿ|#ÿ}4ÿŒ:ÿ—@"ÿœE+ÿŸI4ÿ N<û¡TEô ZNìaXå™iaÞ“sjÕŒ{tÎ…ƒ}È‹„Âz“оv›ºs£“¶q«–³o¶˜±o˜­p͘¨r͘¤s͘ tΗŸtΗŸtΗŸtΗŸtΗŸtΗŸtΗŸtΗŸtΗÿ}#ÿ3ÿŽ9ÿ™?!ÿžC)ÿ¡G2ÿ£L:ø¥RCð¤XKè£_TáŸh]טphΑxtÆŠ€}À„ˆ…º‹µ{—±wŸ”­u§—ªs±™§s½›¥sË› uËšvÌššwÍ™™w͘™w͘™w͘™w͘™w͘™w͘™w͘™w͘ÿ~"ÿ€2ÿ8ÿ›? ÿ B(ÿ¤F0þ¦K8ô¨P@ì©WGä©]PÜ¥fZÐnhÇ•us¿Ž}}¹‰„…³ƒŒŒ­“‘©|›•¤y¤™¡w­›žw¹œœwÈœ™xÊœ—yË›•zÌš”zÌ™”zÌ™”zÌ™”zÌ™”zÌ™”zÌ™”zÌ™”zÌ™ÿ~"ÿ‚2ÿ’7ÿœ=ÿ¡@'ÿ¦D.û©I5ñ¬O<é®UCá¯]KÕ¨dYË¡kg™ss¹“z}²…¬ˆ‰Œ¦„‘¡€˜–} š™|ªœ–{¶”{Äž’|Ê‘}Êœ}Ë›}Ìš}Ìš}Ìš}Ìš}Ìš}Ìš}Ìš}Ìšÿ"ÿ„1ÿ“6ÿž<ÿ£?%ÿ¨B,ø­G2ï°M9æ´T?ݳ[IЬbYƤjf¼qr´—w|¬‘~…¦Œ†Œ ˆ‘š…•––‚žš’€§²ž€ÁžŒ€Éž‹€ÊŠ€Ë›Š€Ë›Š€Ë›Š€Ë›Š€Ë›Š€Ë›Š€Ë›Š€Ë›Š€Ë›ÿ"ÿ…0ÿ•6ÿŸ;ÿ¥=$ÿ«A*õ°E/ìµL4ãºT9Ø·YH˯aXÁ¨hf·¡or¯›u|§•|„ ‘ƒ‹š‹‘”Š“–‡›š‹…¥ˆ„°Ÿ†„¾Ÿ……Éž…„É…„Êœ…„Ë›…„Ë›…„Ë›…„Ë›…„Ë›…„Ë›…„Ë›…„Ë›ÿ€"ÿ‡/ÿ—5ÿ :ÿ§<"þ­?'ó³D,éºK0á¿R5ÓºXGdz_W¼¬fe²¥mq©Ÿs{¡šz„š–‹”’ˆ‘Ž–‰Œ™š„ТЭŸŠ»Ÿ~ŠÈž‰É€ˆÊœ€ˆË›€ˆË›€ˆË›€ˆË›€ˆË›€ˆË›€ˆË›€ˆË›ÿ"ÿ‰.ÿ™5ÿ¢8ÿ©: û°=$ð¸B(æ¿J*ÝÃO4νVF¶^V·°ed­©kp¤¤qzœŸxƒ”›~ŠŽ—†ˆ•Ž•‚’–™~ œz«žx¸ŸwÉžyŽÊzŒË›{ŒË›{ŒË›{ŒË›{ŒË›{ŒË›{ŒË›{ŒË›{ŒË›ÿ"ÿ‹-ÿ›4ÿ¤7ÿ¬8ø´:!í½@#äÆI#×ÇL3ÉÁUE½º\U²´cc¨®ioŸ©oy–¥v‚Ž¡|‰‡ƒ›‹”|˜”˜w—›s–¨q–µžp–Ær”Êœt’Ë›u‘Ëšu‘Ëšu‘Ëšu‘Ëšu‘Ëšu‘Ëšu‘Ëšu‘Ëšÿ‚"ÿ, ÿ4ÿ¦4ÿ¯5ô¸7éÃ>àÍEÑËK2ÄÅTC¸¿[S­¹aa¢´hm™¯nw«t€ˆ§z‡¤{¢‰’u ‘–pž›™m¦›j³œižÃœkœË›n˜Ìšo—Ì™o—Ì™o—Ì™o—Ì™o—Ì™o—Ì™o—Ì™o—Ì™ÿƒ!ÿ+ ÿ 3ÿ©2ý³1ð¾4åË;ÚÔ?ËÏI0¾ÉRB²ÄYQ§¿`_œºfk’¶lu‰²r~¯x…z¬‹tª‡o¨“j§™–g¦¤˜d¦±™c§Á™d¥Í˜g Í˜hŸÍ—hŸÍ—hŸÍ—hŸÍ—hŸÍ—hŸÍ—hŸÍ—hŸÍ—ÿ„!ÿ“) ÿ¢0ÿ­.ø¸,ëÆ/àÕ8 ÒÚ=ÅÔH.¸ÏP@¬ÊXO Å^]•Ádh‹½jrƒºpz{·vtµ}‡n³…‹h²Žd±˜’a°£”^°°•]±¿•]±Ð”`ªÐ”a¨Ð”a¨Ð”a¨Ð”a¨Ð”a¨Ð”a¨Ð”a¨Ð”a¨Ð”ÿ†!ÿ—( ÿ¦, ÿ±(òÀ& ãÐ(Ôß2 Éß>½ÛG,±ÖO=¤ÑVL™Í\YŽÉbe„Æhn{ÄovtÁu|mÀ|‚h¾„†c½‰_¼—Œ[¼¢ŽY¼¯X½¾ŽW¾ÔŽY¶ÓZ´ÓZ´ÓZ´ÓZ´ÓZ´ÓZ´ÓZ´ÓZ´Óÿˆ!ÿœ'ÿª' ü¸! éÊÕÞ Éå0¾ã=´áF,¨ÞN:œÚUH‘Ö[U†Óa`|ÐgitÎnpmÍuvgË|{bË„~^Ê‚ZÊ—„WÊ£†Uʯ†T˾†SÌÕ†TÄÙˆUÁÙ‰UÁÙ‰UÁÙ‰UÁÙ‰UÁÙ‰UÁÙ‰UÁÙ‰UÁÙ‰ÿÿ¢%ÿ°òÂÙÛÉæ ½è/²ç:"§åC1›ãJ>áPJ†ßWT|Þ^]tÝedlÛljfÛtoaÚ|s\Ù„vYÙŽyUÙ˜{SÚ£|QÚ°}PÛ¾}PÜÓ|PÔà~QÐàQÐàQÐàQÐàQÐàQÐàQÐàQÐàÿ•ÿ©ûºÔÍ Éæ¼í °í.¥ì9'šëB5êIA…éPK{èWSrè]Zjçc`dçje_çri[çzlWç‚nSç‹qPç•rNèŸtLèªuKèµvJçÃvJèÝvKäàuKäàuKäàuKäàuKäàuKäàuKäàuKäàuÿÿ±Óà ÇÑ »ò¯ó!£ó.™ó9*ŽóB6„óJA{óRIróWPió\VcócZ]ói^YópaUówcRófOò‡gMðiKï˜kJï lIî©mHî³mGíÀnFíÇnFíÇnFíÇnFíÇnFíÇnFíÇnFíÇnFíÇnÿ§ÓºÅÇºÖ ­ú¢ú"—ú/û:+ƒüC5zýL>qýQEhýVKaþ[O\þbSWþhVTýoXQûuZNú|\Lùƒ]JøŠ_H÷‘`Gö™aFö bEõ§cDô±dCôµdCôµdCôµdCôµdCôµdCôµdCôµdCôµdÖ²ľ·Ì¬Ü  ÿ•ÿ%‹ÿ2‚ÿ<)yÿE2oÿJ9gÿO?_ÿUCZÿ[GUÿaJRÿgLOÿlNMÿrOKÿxQIÿ~RGÿ„SEÿ‹TCÿ‘UBþ˜VAýžW@ý¦X@ü©X@ü©X@ü©X@ü©X@ü©X@ü©X@ü©X@ü©XƸ¶ÄªÓžò ”ÿ Šÿ(ÿ4wÿ<%mÿB,eÿG2]ÿM6WÿS:SÿY=Oÿ_?LÿdAJÿiCHÿnDFÿsEDÿyFBÿ~GAÿ„H?ÿŠI>ÿJ=ÿ•K<ÿœL<ÿŸL<ÿŸL<ÿŸL<ÿŸL<ÿŸL<ÿŸL<ÿŸL<ÿŸL·¼©ËœÛ’ÿ‰ÿ€ÿ*uÿ1kÿ8bÿ>$[ÿD)TÿJ,PÿQ/LÿW2Iÿ\3Fÿ`5Dÿe6Bÿi7Aÿn8?ÿs9=ÿw:<ÿ|;;ÿ‚<9ÿ‡=8ÿŒ=7ÿ“>6ÿ•>6ÿ•>6ÿ•>6ÿ•>6ÿ•>6ÿ•>6ÿ•>6ÿ•>ªÄœÒç†ÿ|ÿqÿ$ hÿ+_ÿ2Wÿ9Qÿ?LÿF!HÿM#EÿR%BÿW'@ÿ[(>ÿ_)<ÿc*:ÿg+9ÿk,7ÿo,6ÿt-5ÿx.4ÿ}.2ÿ‚/1ÿˆ01ÿŠ01ÿŠ01ÿŠ01ÿŠ01ÿŠ01ÿŠ01ÿŠ01ÿŠ0ÿj$ÿi2 ÿl>ÿvFÿ{M)ÿ|U3ÿz]=ÿvfFÿqnMÿmyTÿj„Zþf_ûc•bùaœeø_¢h÷^¨jö\­kõ[³lôZ¹nóYÁnóXÉoòXÔpïXàpéYäpãZæpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÿj$ÿi2 ÿl>ÿvFÿ{M)ÿ|U3ÿz]=ÿvfFÿqnMÿmyTÿj„Zþf_ûc•bùaœeø_¢h÷^¨jö\­kõ[³lôZ¹nóYÁnóXÉoòXÔpïXàpéYäpãZæpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÜ]èpÿj#ÿi1 ÿn>ÿwEÿ|M(ÿ~T3ÿ|\<ÿydEÿsmNÿoxUÿk‚Zýh‹_ûe”cùb›f÷`¡iö^§kõ]­lô\³nóZºoòYÁpòYÊqñXØqìYáqæZäqà\çqØ]èqØ^èqØ^èqØ^èqØ^èqØ^èqØ^èqØ^èqÿk#ÿj1 ÿq<ÿzCÿ€K(ÿS2ÿ€Z<ÿ|bEÿwjNÿqtUÿn[ýj‰`úf’død™höa kõ_§mó^­oò\³pò[ºqñZÃrðYÍsîYÝsèZâtá\åsÙ^æsÐ_çtÐ_çtÐ_çtÐ_çtÐ_çtÐ_çtÐ_çtÐ_çtÿl#ÿk1 ÿs;ÿ}Bÿ‚J'ÿ„Q2ÿƒY;ÿ€`Eÿ{hMÿtqUÿp|[ül‡aùhf÷e˜iõcŸlóa¦oò_¬qñ]³rð\»tï[ÅuïZÐuêZßvâ\âvÛ_åuÑ`ævÊaåwÊaåwÊaåwÊaåwÊaåwÊaåwÊaåwÊaåwÿm"ÿl1 ÿv:ÿ€Aÿ…H'ÿˆO1ÿ‡W;ÿ„^DÿfMÿxnUÿsy\ün„bùjgög–kôdžnòb¥qñ`¬sï^´uî]¼vî[Çwí[Öxå\àxÜ_ãxÒ`äxËaäyÄcãzÄcãzÄcãzÄcãzÄcãzÄcãzÄcãzÄcãzÿn"ÿm1 ÿx8ÿƒ?ÿ‰G&ÿ‹N0ÿ‹U9ÿˆ\CÿƒcLÿ}kTÿvu\ür€bømŠgõi”lófœpñc¤sïa¬uî_´wí]¾yì\Ëzè\ÜzÞ_ázÒaã{Êbâ|Äcâ}¾eá}½eá}½eá}½eá}½eá}½eá}½eá}½eá}ÿn"ÿn0 ÿ{7ÿ†>ÿŒE%ÿL.ÿS8ÿZAÿˆaKÿƒiSú|q[÷v|bóq‡hðmmíi™qêf¡uèc©xæa²zä`»{â_Ç|à_Ú}Ôbá}Êcà~Ãdà½f߀·g߀·g߀·g߀·g߀·g߀·g߀·g߀·g߀ÿo!ÿo0 ÿ~6ÿ‰<ÿD$ÿ“L-ÿ“R6ÿ’Y@ÿŽ`IùˆfRô‚nZï|yaëwƒhçrŒnäm•sàjwÝg¦zÚe®|Öc¸~ÓbÀÑbÓÊdßÁeÞ‚»gÝ‚µh݃°i݃°i݃°i݃°i݃°i݃°i݃°i݃°i݃ÿp!ÿr/ ÿ4ÿŒ;ÿ“C"ÿ—K+ÿ—Q4ÿ–W=ú“]FóŽdOîˆkXè‚u`ã|hÞw‰nÙr‘tÓn™yÐk¡}Ìh©€Éf²‚Çe½ƒÅeË„ÁfÜ„¹hÛ…³iÛ…®kÛ…©lÛ…©lÛ…©lÛ…©lÛ…©lÛ…©lÛ…©lÛ…©lÛ…ÿq!ÿt. ÿ„3ÿ:ÿ–C!ÿšI)ÿšN2üšT;õ˜[Dî”bMçiUá‰s^Û‚|fÓ|…oÍwuÉr•zÅoÁl¥‚¾j­…»i¸‡¹iĈ·i؈°kÙˆ«lÙˆ§mÙˆ£oÚ‡£oÚ‡£oÚ‡£oÚ‡£oÚ‡£oÚ‡£oÚ‡£oÚ‡ÿq ÿv, ÿ†2ÿ’:ÿ™B ÿœG'ÿžL/øžR8ðX@éš_Iâ•gRÚp\чxfÊoÅ|‰vÀw|»t˜€·q „´o©‡±m³‰®l¿Š¬lÏ‹¨n׋¤oØŠ pØŠqÙ‰qÙ‰qÙ‰qÙ‰qÙ‰qÙ‰qÙ‰qÙ‰ÿr ÿx+ ÿˆ0ÿ”9ÿ›AÿŸE%ý¡J-ô¢P4ì¢V<ä \EÜ›eOÒ“m\ÊŒufÆ}o½…v·|}³x”®uœ†«s¥‰§q®‹¥pº£pÉ qÕœsÖŒštÖ‹—tØŠ—tØŠ—tØŠ—tØŠ—tØŠ—tØŠ—tØŠ—tØŠÿs ÿz* ÿ‹/ÿ–9ÿ?ÿ¡C#ú¤H*ñ¦N1è§T8á§\@ÕŸbN˘k[Ñrf¼‹zo¶…‚w°‰}«}‘‚¦y™†¢w¡ŠŸu«œt¶ŽštŘuÔŽ•vÕ“wÕ’wÖ‹’wÖ‹’wÖ‹’wÖ‹’wÖ‹’wÖ‹’wÖ‹’wÖ‹ÿs ÿ|) ÿ/ÿ˜8ÿŸ=ÿ¤A!÷¨F'í«L-å­R3ܪY?УaMÆœiZ¾•pe¶wo¯Šv©…†}¤Ž‚Ÿ~–‡›{ž‹—y¨Ž”x³’xÁyÓzÔŽzÕŒ{ÖŒŒ{ÖŒŒ{ÖŒŒ{ÖŒŒ{ÖŒŒ{ÖŒŒ{ÖŒŒ{ÖŒÿtÿ~( ÿŽ.ÿ›8ÿ¡<ÿ§?ô«D$ê¯J)â³Q.Ö®W>˧_MÁ gZ¹™ne±“unªŽ|v£Šƒ}ž†‹‚™ƒ“‡”€›‹~¥Ž}°Š}½‘‰~Бˆ~Óˆ~ÔŽ‡~Õ‡~Õ‡~Õ‡~Õ‡~Õ‡~Õ‡~Õ‡~Õÿtÿ€'ÿ.ÿ7ÿ£:ü©=ñ¯B ç´H$ß·N,ѱU=Ǫ^L½£eY´ld«—sn¤“zvžŽ|˜‹ˆ‚’‡‡Ž…™‹‰ƒ¢Ž†‚­ƒ‚»‘‚‚Ì‘‚‚Ó‚‚Ô‚Õ‚Õ‚Õ‚Õ‚Õ‚Õ‚Õ‚Õÿuÿ‚&ÿ’- ÿŸ6ÿ¥8ù¬;î³?å¹FÚ»K+Í´T<®\K¸§cX¯¡jc¦œqmŸ—wu˜“~|’†‚ŒŽ‡‡Š–‹ƒˆ Ž‡«}‡¸‘{‡É‘|‡Ó|†Ô}…Õ}…Õ}…Õ}…Õ}…Õ}…Õ}…Õ}…Õÿuÿ„%ÿ”- ÿ 5ÿ¨6ö¯8ë·=â¿EÕ¾I*ȸS;½±[J³«bWª¦hb¡¡ol™œut’˜|{Œ•ƒ†’‹†”‹|ŽžŽy¨vŒµ‘tÆ‘uÓv‹Ôx‰Õx‰Õx‰Õx‰Õx‰Õx‰Õx‰Õx‰Õÿvÿ†$ÿ—, ÿ¢2ÿ«3ò³5è¼:ÞÅ?ÐÁH)Ä»Q9¹µYH®°`U¥ªgaœ¦mk”¢tsžzz†›€€˜‰…{–’‰v”›r“¦o“³n“Ãn“Óp‘ÔŽrŽÕrŽÕrŽÕrŽÕrŽÕrŽÕrŽÕrŽÕÿwÿ‰"ÿ™, ÿ¥0 ü®/ï¸1äÃ7 ÙÊ;ËÅF'¿¿P8³ºXG©µ_TŸ°e_–¬kiލrq†¥xx€¢~zŸ‡ƒtˆo›™‹lš¤iš°Žg›ÀŽg›ÕŽi˜Õl”ÖŒl”ÖŒl”ÖŒl”ÖŒl”ÖŒl”ÖŒl”ÖŒl”ÖŒÿxÿŒ!ÿ+ÿ¨, ø³* ê¿+ àÌ2ÑÎ9ÅÉE%¹ÄN6®¿VE£»]R™¶c]²ig‡¯po€¬vvy©}|s§„n¥…i¤—ˆe£¢Šc£®Œa£¾Œ`¤Ò‹c ×‹eœØŠeœØŠeœØŠeœØŠeœØŠeœØŠeœØŠeœØŠÿzÿ ÿ )ÿ¬'ò¸$åÇ$ÙÕ'ËÓ7¿ÎC#³ÊL4§ÅTBœÁ[O’½bZ‰ºhd·nly´trs²{xm°ƒ}h¯‹c®•„_­ †]­­‡[­¼‡Z®Ð‡\ªÚ‡_¥Ú‡_¥Ú‡_¥Ú‡_¥Ú‡_¥Ú‡_¥Ú‡_¥Ú‡_¥Ú‡ÿ~ÿ”ÿ¥&ý± ìÁßÓÐÜ%ÄÙ5¸ÕA!¬ÐK1 ÌR?•ÉYL‹Å`W‚Ãf`zÀlgs¾sml¼zsg»‚wbºŠ{^¹”~Z¸Ÿ€X¸¬V¹»UºÏV¶Þ‚X°Ý‚X¯Ý‚X¯Ý‚X¯Ý‚X¯Ý‚X¯Ý‚X¯Ý‚X¯Ý‚ÿ„ÿ™ÿªõ¹ÞÍ ÐßÅà&»ß6°Ý@¤ÙI-˜ÕQ;ÑXHƒÏ^R{ÌeZsËkalÉrgfÈylaÇp]ÆŠtYÆ”vVÅŸxSƬyRÆ»zQÇÏyQÄãzS¼â|S¼â|S¼â|S¼â|S¼â|S¼â|S¼â|S¼â|ÿŠÿŸÿ°ØÃ ÎÑ Äå¹ä&®ä4¤â? ™àG-ÞO9…ÜVD{Ú]LsÙdTl×kZfÖr_aÕyd\Ô‚gXÔ‹jUÔ•mRÔ nPÔ­oNÕ¼pMÖÐoMÕèpNÌérNÌérNÌérNÌérNÌérNÌérNÌérNÌérÿ’ÿ§ع ËÆÂÕ ·ê¬ê' ¢é4˜è>$çG0ƒæN:zåTCqäZJiäaPdãhU_ãpYZãx\Vã€_Sã‰bPã“dMäeKä©gJå¶gIåÆgHæßgJàìgJßìgJßìgJßìgJßìgJßìgJßìgJßìgÿœ Û±ʽ¿ÊµÚ ªï ð(–ð5Œð?&‚ðG1yðN9pïT@hïZFaï`K]ïgOXïnRTïuUQð}WNð…YKð[Hñ™\Fñ£^Dò¯_Cò»_BóÌ`Aóç`Aóè`Aóè`Aóè`Aóè`Aóè`Aóè`Aóè`Þ§˶½Á²Ï§ê ÷”ø+Šø6ù@&xúH/oúM6gúS<`úX@[û_DVûeGRûlIOürKKüyMHüOEýŠQCý“RAþœS?þ¦T=ÿ±U=þ¼V<þÍV<þÎV<þÎV<þÎV<þÎV<þÎV<þÎV<þÎVΰ½º±Ç¥Ö›ý‘ÿ ˆÿ-€ÿ9vÿ?#mÿE*eÿK0^ÿQ5XÿW8Sÿ];Oÿc>Lÿh@IÿnAFÿuCCÿ|D@ÿ„F=ÿŒG<ÿ”H;ÿI:ÿ¥J9ÿ­K8ÿ¹K8ÿ¹K8ÿ¹K8ÿ¹K8ÿ¹K8ÿ¹K8ÿ¹K8ÿ¹K¾µ°À¤Î—Þÿ†ÿ#}ÿ.sÿ5jÿ<bÿB$[ÿH(UÿN,PÿT/LÿZ1Hÿ_3Eÿd5Bÿj6?ÿp7=ÿv9;ÿ|:9ÿƒ;8ÿ‹<6ÿ“=5ÿš>4ÿ¡>3ÿª?3ÿª?3ÿª?3ÿª?3ÿª?3ÿª?3ÿª?3ÿª?±º£È–Ö‹ô ƒÿyÿ oÿ( gÿ0_ÿ7Xÿ>RÿDLÿJ"HÿP$DÿU&AÿZ'>ÿ_);ÿd*:ÿi+8ÿn,6ÿt-4ÿz.3ÿ/1ÿˆ00ÿ0.ÿ–1-ÿž2-ÿž2-ÿž2-ÿž2-ÿž2-ÿž2-ÿž2-ÿž2¤Â–ψ߀ÿ uÿjÿbÿ!Zÿ) Sÿ1Mÿ8Hÿ>CÿD?ÿJ<ÿO9ÿS7ÿX5ÿ\3ÿa1ÿe0ÿj .ÿp -ÿv!+ÿ|"*ÿ‚#(ÿˆ#'ÿ$'ÿ$'ÿ$'ÿ$'ÿ$'ÿ$'ÿ$'ÿ$ÿ`%ÿ[0ÿa: ÿjAÿoJÿqR)ÿo[2ÿkd:ÿgnAÿdzGÿ`„Lÿ]ŽPÿZ–SÿXžVÿW¥XÿU«ZÿT±[ÿS·\ÿR¾]þQÇ^üQÑ_ûPà_øPé_óQí_îSð_èTñ_äVò_äVò_äVò_äVò_äVò_äVò_äVò_ÿ`%ÿ[0ÿb9 ÿl@ÿqIÿrQ)ÿqZ2ÿmc:ÿhmAÿexGÿaƒMÿ^Qÿ[–TÿYWÿW¤YÿVª[ÿU±\ÿT·]þS¿^ýRÇ_üQÓ`úPâ`öQé`ñRî`ëTï`åVñ`áWò`áWò`áWò`áWò`áWò`áWò`áWò`ÿa%ÿ\0ÿe8 ÿn?ÿtGÿuP(ÿtX1ÿpa:ÿkjAÿgvHÿcMÿ`‹Rÿ]”UÿZœXÿX£ZÿWª\þV°^ýT·_ýS¿`üSÉaúRÖbøQäbóRêbíTîbæVïbàXðbÛXñcÛXñcÛXñcÛXñcÛXñcÛXñcÛXñcÿb%ÿ]/ÿg6 ÿq>ÿwFÿxN(ÿwV1ÿt_:ÿnhAÿjsHÿf~Nÿb‰Sÿ_’Vÿ\›ZÿZ¢\þX©^ýW°`üU·aûTÀbûSÊcùSÚdõRædïTëdèVîdáXïdÙYðeÓZðfÓZðfÓZðfÓZðfÓZðfÓZðfÓZðfÿb$ÿ^/ÿj5 ÿt<ÿzDÿ|L'ÿ{T0ÿw\9ÿreAÿloHÿh{Nÿd†Sÿ`Xÿ]™[þ[¡^ýY¨`üX°bûV¸cúUÁdùTÍe÷SÞfòTçfêVëfâYîfÚZîgÑ[ïhÌ\ðhÌ\ðhÌ\ðhÌ\ðhÌ\ðhÌ\ðhÌ\ðhÿc$ÿ_.ÿm3 ÿw:ÿ}Bÿ€J&ÿR0ÿ|[8ÿwcAÿplHÿlwOÿg‚TÿcYý`–\ü]Ÿ_ú[§bøY®d÷X¶fõWÀgôVËhñUÝhíVéiãYìhÚ[íiÐ\îjÉ]îkÅ^îkÅ^îkÅ^îkÅ^îkÅ^îkÅ^îkÅ^îkÿd#ÿa-ÿp2 ÿ{8ÿ@ÿ„I%ÿ„Q.ÿY7ÿ|a@ÿviHÿpsOûlUøh‰Zöd’^óa›añ_£dð]«fî[³hìZ¼jêYÇkèYØkäYèkÚ[ëlÏ]ímÈ^ìnÂ_ìn¾`ìo¾`ìo¾`ìo¾`ìo¾`ìo¾`ìo¾`ìoÿe#ÿd+ÿs0 ÿ~6ÿ…?ÿ‰H$ÿ‰O-ÿ†W6ÿ‚^>ü|fFøvpNôq{Uðm…ZíiŽ_êe—cèbŸfæ`§iã^¯ká]¹là\ÄmÞ\ÓnÙ]ænÎ^ëoÆ_êq¿aêqºbér¶cér¶cér¶cér¶cér¶cér¶cér¶cérÿf#ÿg)ÿw. ÿ‚5ÿ‰>ÿG"ÿN+ÿŒU3üˆ\<öƒdEñ|lMìwwTèrZänŠ`áj“dÝf›hÚd£kÖb¬nÓ`µpÐ_¿qÎ_ÍrË_âsÄaès½bèt·dçt²eçt¯fçt¯fçt¯fçt¯fçt¯fçt¯fçt¯fçtÿg"ÿj'ÿz, ÿ†4ÿ=ÿ‘E ÿ’M(ý‘S1öŽZ:ð‰aBêƒiKå~tSàx}ZÚs†`ÔnfÐk—jÌhŸnÉf§qÇd¯sÄc¹uÂbÆvÀbÚwºdæw³eåw®fåwªhåw¨hæw¨hæw¨hæw¨hæw¨hæw¨hæw¨hæwÿg"ÿm&ÿ}* ÿ‰4ÿ‘<ÿ•Dÿ—K&ø–R.ñ”X6ê^?äŠgHÝ„qPÕ}yZÏx‚aÊsŠgÆo’lÂlšp¿j¢s¼hªv¹g´x¶fÀy´fÐz±gãz«hãz§jãz£käy¡käy¡käy¡käy¡käy¡käy¡käy¡käyÿh!ÿo$ÿ€) ÿŒ3ÿ”;ÿ™Cý›I#ô›O*ì™U3å–\;Þ‘eEÔ‰mP̃vZÇ}~aÁx†h½tŽm¸q–rµnu±l¦x®k¯{¬j»|ªiÊ}¨já}£lâ|Ÿmâ|œnâ{šnã{šnã{šnã{šnã{šnã{šnã{šnã{ÿi!ÿq#ÿ‚( ÿ2ÿ—;ÿœBùžF ðŸL'èŸR.àZ6Ö•aDÍŽjOƈrY¿‚zb¹}‚h´yŠn°v’s¬sšw¨p¢z¥o«}¢n¶~ mÅžnÛ›oà~˜pá~–qá}”qâ|”qâ|”qâ|”qâ|”qâ|”qâ|”qâ|ÿi!ÿt"ÿ…(ÿ‘1 ÿš:ÿŸ?õ¢Dì¤J#ä¤P)Û¡W5Ïš_CÇ“hO¿ŒpY¸‡wa²‚h­~†n©zŽs¤w–x už{s¨~šr³€—qÀ–rÓ“s߀‘tàtà~tá}tá}tá}tá}tá}tá}tá}ÿj!ÿv ÿ‡'ÿ”0 ÿ9ý¢=ò¥Aé¨GàªM%Ô¤T4Ê]BÁ—eNº‘mX²‹ua¬†|h§‚ƒn¢‹t|“x™y›|•w¥’v¯v½‚Žv΂wÞ‹w߀ŠxàŠxà~Šxà~Šxà~Šxà~Šxà~Šxà~Šxà~ÿj ÿxÿ‰&ÿ–0 ÿŸ7ú¤:ï©?æ­EÜ®J$ϨS3Æ¡\A½›dM´•kX­r`§‹yh¡‡n›ƒˆt—€x’~™|Ž|¢‹z­‚ˆzºƒ‡z˃†{Þ‚…{Þ…{߀…{à…{à…{à…{à…{à…{à…{àÿk ÿzÿ‹&ÿ˜/ ÿ¡5 ÷§8ì­<ã²B×±G#Ë«R2Á¥Z@¸ŸbL°™iW¨”p`¡wg›‹~n–ˆ†s‘…ŽxŒ‚–|ˆ€Ÿ€„ª‚·ƒ€È„€ÝƒÞ߀€~à€~à€~à€~à€~à€~à€~àÿl ÿ|ÿ%ÿš. ÿ£3 ôª4 é±9ß·?Ò´F"Ç®P1½¨Y?³¢`K«gV£˜n_œ”ug–|mƒs‹Š‹x†ˆ”|†€~„¨‚{„µƒy„Å„x…݃y„Þzƒß€z‚àz‚àz‚àz‚àz‚àz‚àz‚àÿmÿ~ÿ$ÿ,þ¦0 ð®1 å¶5 Û¼9ηE òO0¸¬W>¯§_J¦¡eUžl^—™sf•zlŠ’r…‰w€‘|{‹›wŠ¥‚t‰²ƒr‰ÂƒrŠÚƒs‰Þt‡ß€u†àu†àu†àu†àu†àu†àu†àÿoÿ€ÿ’#ÿ +ú©,í²,â¼1ÕÀ6É»C¾¶M.´°V<ª«]I¡¦dT™¢j]‘žqeŠ›xk„˜q–†vy“zu‘˜~q£n¯‚l¿ƒk‘Õ‚mÞo߀p‹àp‹àp‹àp‹àp‹àp‹àp‹àÿqÿƒÿ•!ÿ£)ö­'è·&ÞÃ*ÐÃ5Ä¿A¹ºL-®µT;¥°[G›¬bR“¨i[‹¥oc…¢vj~Ÿ|oxœ„tsšŒyo™–|k—¡h—­€f—¼e˜Ñ€f–ßh“à~j‘á~j‘á~j‘á~j‘á~j‘á~j‘á~j‘á~ÿuÿ‡ÿ˜ ÿ¦%ò² ä¾×É"ÊÇ3 ¾Ã@³¿J+©ºS9Ÿ¶ZE–²aP¯gY…¬m`~©tgx¦zmr¤‚rm¢Švh¡”yd Ÿ|aŸ«~_ º~_ Î~_Ÿá}b›á}c˜â|c˜â|c˜â|c˜â|c˜â|c˜â|c˜â|ÿxÿ‹ÿý«ì¸ÞÈÏÍÄÌ0 ¸È>­ÅH(£ÁQ6˜½XB¹_M†¶eV³k]x±rdr¯yil­€ng¬‰rbª’u_©x\©ªzZ©¹zYªÌzX©äz[¤äz]¡äy]¡äy]¡äy]¡äy]¡äy]¡äy]¡äyÿ}ÿÿ¡ö±ÙÁ ÒÏ ÈÒ¼Ñ. ±Î;¦ËF%œÈO3‘ÄV?ˆÁ]I€¿cRx¼jYqºp_k¹wdf·ia¶‡m]µ‘pYµœrV´©tT´¸tSµËtSµätT°çuV¬çuV¬çuV¬çuV¬çuV¬çuV¬çuV¬çuÿƒÿ–ÿ¨Ù¸ ÎÄ ÇÒ ¿Ù´Ø+©Ö9ŸÓD"”ÐM/ŠÍT;Ê[DxÈbMqÇiSkÅoYeÄv^`Ã~b\‡fXÁ‘hUÁœkRÁ¨lPÁ·mOÂÊmOÂälO½ìnP¹ìoP¹ìoP¹ìoP¹ìoP¹ìoP¹ìoP¹ìoÿ‰ÿگͻÄÇ¼Ö ³ßªß+ Þ9–ÝCŒÚK*‚ØS5yÕZ?qÓaFjÒhLeÑoR`ÐvV[Ð~ZWχ]SÏ‘_PÏœaNÏ©cLϸcKÐËcLÐåbJÎòeKÈòfKÈòfKÈòfKÈòfKÈòfKÈòfKÈòfÿ’ Þ¦δ¿¹Ì°Ý §åžå- ”å9ŠäB ãJ*wâP3oáX;ià_AcàfF^ßnJZßuNVß}QR߆SOßVMß›WKà§XIàµYHáÆYHáßYGßðYFÜõ[FÜõ[FÜõ[FÜõ[FÜõ[FÜõ[FÜõ[íœÑ­¸·Ã­Ñ¤í›í ’í.‰ì:€ìC!vìJ*nìP1fëV7`ë\<[ëd@WëkCSërFPëzIMìƒKJìŒMHì–NEí¡PCí®QBî¼QAïÌRAïåR@íñQ@íñQ@íñQ@íñQ@íñQ@íñQ@íñQԥIJ¶¼«É Ø—ôõ$‡õ1~ö;töB löH'eöO-^÷U1Y÷[5U÷b8Q÷h;Møo=Jøv?Gø~ADù‡CBù‘E@ú›F>ú¦G<û±H;û¾I:üÏI9üãI9üãI9üãI9üãI9üãI9üãI9üãIÇ­··ªÃžÐ“ã Œý„þ'{ÿ1rÿ8iÿ@bÿF"\ÿM&VÿS*RÿY-Nÿ_0Jÿe2Gÿk4Dÿq5Aÿy7?ÿ8<ÿŠ::ÿ“;8ÿ<6ÿ§=5ÿ±>4ÿ¾>3ÿÊ?3ÿÊ?3ÿÊ?3ÿÊ?3ÿÊ?3ÿÊ?3ÿÊ?¸²ª½Ê‘؈û ÿvÿ$nÿ- fÿ5_ÿ<XÿCSÿINÿO!JÿU$Fÿ[&Cÿ`'@ÿf)>ÿk*;ÿr+9ÿy-6ÿ.4ÿŠ/1ÿ”00ÿœ1.ÿ¥2-ÿ¯3,ÿ·3,ÿ·3,ÿ·3,ÿ·3,ÿ·3,ÿ·3,ÿ·3«¸žÅÒƒà}ÿrÿhÿaÿ'Zÿ/ Tÿ7Nÿ>IÿDEÿJAÿO>ÿU;ÿY9ÿ_6ÿd4ÿi2ÿp /ÿw!-ÿ"+ÿ‡#(ÿ$'ÿ™%&ÿ¡&%ÿ§&%ÿ§&%ÿ§&%ÿ§&%ÿ§&%ÿ§&%ÿ§&ŸÀ‘̓Ûxöoÿ dÿ\ÿTÿ Nÿ'Hÿ/Cÿ6 ?ÿ< <ÿB8ÿG5ÿL3ÿQ0ÿV.ÿZ,ÿ_*ÿe(ÿk&ÿq#ÿy"ÿ ÿ‰ÿ‘ÿ—ÿ—ÿ—ÿ—ÿ—ÿ—ÿ—ÿV'ÿQ2ÿV5ÿ_=ÿdEÿfNÿdX'ÿab/ÿ^n5ÿZy;ÿW„?ÿTCÿQ˜FÿO HÿN§JÿM®KÿLµLÿK¼MÿJÄNÿIÎOÿIÞOÿHéPÿHòPüIöP÷KùPñLúOëNûPêOûPêOûPêOûPêOûPêOûPêOûPÿV'ÿQ2ÿX4ÿb;ÿgDÿiMÿgV'ÿc`/ÿ`k5ÿ\w;ÿX‚@ÿUDÿS–GÿPŸIÿO¦KÿN­MÿM´NÿL¼OÿKÅPÿJÏQÿIàQÿIëQþIòRùK÷RóMùQíOúQæPúRåPúRåPúRåPúRåPúRåPúRåPúRÿW'ÿR1ÿZ2ÿd:ÿjBÿlKÿjT'ÿg^/ÿbh6ÿ^t<ÿZ€AÿW‹EÿT•HÿRJÿP¥LÿO­NÿN´OÿM¼QÿLÅQÿKÑRÿJâSÿIíSûKóSõL÷SîOøSèPùSáRúTàRúUàRúUàRúUàRúUàRúUàRúUÿX&ÿT0ÿ]1ÿg8ÿm@ÿoIÿnR'ÿj\/ÿef6ÿaq<ÿ]}AÿYˆFÿV’IÿTœLÿR¤NÿP«PÿO³QÿN»RÿMÄSÿMÏTþLàUûLëUøLôUðO÷UéQøUâRøVÛTùWÙTùWÙTùWÙTùWÙTùWÙTùWÙTùWÿY&ÿW.ÿ`/ÿj6 ÿq>ÿsHÿrQ&ÿoZ.ÿjc6ÿen<ÿazBÿ]…GÿZJÿW˜MÿU PÿT¨RþR¯SýQ·UüPÀVúOËVøOÜWõOéWòOóWêRöWáS÷XÚUøYÑVøZÏVøZÏVøZÏVøZÏVøZÏVøZÏVøZÿY&ÿZ,ÿd-ÿn3 ÿu=ÿxFÿwO%ÿtX-ÿp`5ÿjj<ÿfvBÿbGþ^‹Kû[”OùYRøW¤TöV¬VõT´WóS¼XòSÇYðRÕZìRæZéSòYáTõ[×Vö\ÏW÷]ÈYø]ÇYø]ÇYø]ÇYø]ÇYø]ÇYø]ÇYø]ÿZ%ÿ]*ÿg*ÿr2 ÿy;ÿ|Eÿ|M$ÿzU,ÿu^4ÿog<üjrBùf}Höc‡Ló_Pñ]™Sï[¡VíY¨XëX°ZêW¹[èVÃ\æVÑ\ãVä\ßVð]ÕWõ_ÌYö`ÆZö`À[öa¾\öa¾\öa¾\öa¾\öa¾\öa¾\öaÿ[%ÿ`(ÿk(ÿw0 ÿ~:ÿCÿ‚K"ÿS*ÿ{[3ùvd:õpnAñlyHíhƒMêdŒQça•Uå_Xã]¥Zá[­\ÞZ¶^ÜYÀ_ÚYÎ`ÕYâ`ÑYïaÊZôbÂ\ôc¼]ôd·^ód¶_ód¶_ód¶_ód¶_ód¶_ód¶_ódÿ\$ÿc&ÿo&ÿ{/ ÿ‚9ÿ†Aÿ‡I ÿ…Q(ø‚Y0ò}`8íwj@èruGänMáiˆRÝf‘WÙc™ZÕ`¡]Ò_¨`Ï]±bÍ\»cË\ÇdÉ\ÛeÅ]ëe¿]òf¸_ñg³`ñg¯añg®bñg®bñg®bñg®bñg®bñg®bñgÿ]$ÿf$ÿr$ÿ~. ÿ‡7ÿ‹?ÿŒGù‹O%òˆV-ìƒ]6æ~g>àxqFÛs{MÕnƒSÐjŒXÌg”]Éeœ`Æc£cÃa¬eÁ`µg¿_Áh½_Ðiº`æiµaïj¯bïj«cïj§dïi¦eði¦eði¦eði¦eði¦eði¦eðiÿ^#ÿi"ÿv#ÿ‚, ÿ‹6ÿ>ý‘Eô‘L"íŽS*æŠZ2ß…e;×~mEÐxvMËtTÆp‡ZÂl^¿i—b»gŸe¸e§h¶d°j³c»k±cÊl¯cál«dím¦fíl£gíl hîkŸhîkŸhîkŸhîkŸhîkŸhîkŸhîkÿ_#ÿk ÿy"ÿ…+ÿŽ4 ÿ“<ø–Cï–Jç•P&à‘X.׊a:΄jEÈ~sMÂy{U¾uƒ[¹q‹`µn’d²lšg¯j£j¬h¬l©g¶n§gÄo¥gÚo¢hëožiìo›jìn™kím˜kím˜kím˜kím˜kím˜kím˜kímÿ_#ÿnÿ{!ÿˆ*ÿ‘2 ÿ—:ôšAë›Gã›M!Ú–U-Ï^9ȉgDÁƒoM»~wU¶y[±v‡`­se©p–h¦nŸl£l¨n k²pkÀqœkÒršléq—mêp”mëp’nìo’nìn’nìn’nìn’nìn’nìn’nìnÿa!ÿpÿ~ ÿ‹)ÿ•1 û›8 ðž>ç Dß JÓšR+Ê“\8ÂdC»‡mM´‚tT¯~|[ªz„a¦w‹e¢t“ižr›mšp¤p—o¯r•o¼s“oÍs’pæspérŽqêqqëpŒqëpŒqëpŒqëpŒqëpŒqëpŒqëpÿc ÿrÿ€ÿŽ'ÿ—/øž6 í¢;ä¥@Ú¤FΞQ*Å—Z7½‘bBµŒjL¯‡rT©‚y[¤€`Ÿ|ˆe›yj—w˜m“u¡ps¬ss¸t‹sÉuŠtât‰tèsˆuér‡uêq‡uêp‡uêp‡uêp‡uêp‡uêp‡uêpÿeÿtÿƒÿ&ÿš-ô¡4 é¦7 àª=Ô§DÉ¡O)À›X6¸•`B°hK©‹oS£‡vZžƒ~`™€…e”}j{–nŒyŸq‰x©s†wµu„wÅvƒxßuƒxèt‚xés‚xêq‚xêq‚xêq‚xêq‚xêq‚xêq‚xêqÿgÿwÿ…ÿ“$ÿ+ñ¤0æª3Ü®7 ϪCÅ¥N(¼ŸW5³™_A«”fJ¤mSž‹tZ˜ˆ{`“…ƒeŽ‚‹jŠ€“n†~œq‚}§t|³u}|Ãv|}Ûv|}èt}|ès}|ér}|êq}|êq}|êq}|êq}|êq}|êqÿiÿyÿ‡ÿ•#û )î¨,ã¯/ײ4 Ë­AÁ¨L'·£U4¯]@§™dIŸ”kR™rY“y_ŽŠ€d‰‡ˆi„…‘m€ƒšq|‚¤ty±vwÀvvÖvvçtwèsx€érxêqxêqxêqxêqxêqxêqÿkÿ{ÿŠÿ˜!ø£&ê¬'ß´)Òµ2 ǰ@¼¬K&³§S3ª¢[>¢cHš™iQ”•pXŽ’w^ˆ~dƒ†i~ŠŽmz‰˜qv‡¢ss†®uq†½vo‡Òvp‡ètq…èsr„érs„êqs„êqs„êqs„êqs„êqs„êqÿmÿ~ÿÿ›ô§"æ° Úº!͸1 ´>¸°I$®«R1¥¦Z=¢aG•žhOŽ›nWˆ˜u]‚•|c}“„hxŒlt•pp rmŒ¬tjŒ»uiÎuiètk‹ésm‰êqmˆêqmˆêqmˆêqmˆêqmˆêqmˆêqÿpÿÿÿžð«â¶Ó½È»/½¸<³´G#©°P0 «X;˜¨_E¤fN‰¡lU‚žs[}œzaw™fr—Šjn–“nj”žqf”ªsd“¸sc”Ësc”ære’êqgêpgŽêpgŽêpgŽêpgŽêpgŽêpgŽêpÿsÿ…ÿ”ü£ê°Ù¾ ÍÁÂÀ-¸½:®¹F!¤µO-š±V9’®^CŠ«dLƒ¨jS|¥qYv£x_q¡clŸ‡hhž‘kdœn`œ¨p^œ¶q]œÉq]œäp^šëp`–ëoa•ìoa•ìoa•ìoa•ìoa•ìoa•ìoÿwÿ‰ÿ™ó¨×µ ÏÁ ÆÅ¼Ä*²Â8§¿Dž»M+”¸U6‹µ\@„²bI|¯iPv­oVp«v[kª}`f¨†db§g^¦šj[¥¦lX¥µmW¦ÇmW¦âlW¤ílZŸílZžílZžílZžílZžílZžílZžílÿ|ÿŽöž Ø­ ͸ ÇľʵÊ'«È6¡ÅA—ÂK(¿S3…½Z<}ºaEv¸gKp·mQjµtVe´|[`²„_\±ŽbX±™eU°¥fS°³gR±ÆgR±ágQ¯ñhSªðhT©ðhT©ðhT©ðhT©ðhT©ðhT©ðhÿ‚ÿ” Û¥αÅ»½ÇµÐ¬Ð#£Ï3 ™Í?ÊH$†ÈQ.}ÆX8vÄ_?oÂfFiÁlKdÀsP_¿{T[¾„XW½[T½˜]Q¼¤_O¼³`M½Å`M½à_L¼ðaM·õbM¶õbM¶õbM¶õbM¶õbM¶õbM¶õbÿ‰ áœЪŵ»¿²Ë«Ø £Ù šØ/ Ö<‡ÔF~ÒO)vÐV2oÏ^9hÍd?cÌkD^ÌsIZËzLVʃORÊROʘTMÊ¥VKʳWJËÅWIËàVIÉðXGÇúYHÅûZHÅûZHÅûZHÅûZHÅûZHÅûZ÷‘Ô¢ǯº¹°Ä§Ð Ÿá˜á!à0 †à;}ßDuÞM$nÝU+gÜ\2bÛd7]Ûk;YÚr?UÚzCRÚƒENÚHLÚ˜JIÚ¥KHÛ³LGÜÄLFÜÞLFÚíLDØùOCØûOCØûOCØûOCØûOCØûOCØûOۚʩ»³°½¥É›Ö ”èŒé%„è3 {è<sèDkèK"dçR(^çY-Yç`2Uçh5Rço8Oçw;Lç€=Iç‰?Gè”ADèŸBBé¬CAéºD@êÍD@êäD@èõD@çøC@çøC@çøC@çøC@çøC@çøCÍ£½®°¸¤Ä™Ðá ‰ññ(xò2 pò;iòCbòJ\óP#VóW'Ró^+Oóe-Lôl0Iôs2Fô{4Cô„6AõŽ7>õ™9=ö¤:;ö°;:÷¿<9øÏ<8÷è<8÷ì<8÷ì<8÷ì<8÷ì<8÷ì<8÷ì<¿ª±³¤¿˜ÊŒØ„ú|ûtû&lü0 eü8^ý@XþGSþMOÿT KÿZ"Hÿa%Eÿg&Bÿm(@ÿu*=ÿ}+:ÿ†-8ÿ‘.6ÿ›/4ÿ¦03ÿ²12ÿ¾21ÿÐ21ÿÖ21ÿÖ21ÿÖ21ÿÖ21ÿÖ21ÿÖ2²¯¥º˜Æ‹Òßyÿoÿgÿ"`ÿ,Zÿ4 Tÿ<OÿCJÿIGÿOCÿU@ÿ[>ÿa;ÿf9ÿm6ÿt 4ÿ}!1ÿ†#/ÿ‘$-ÿ›%,ÿ¥&+ÿ¯&*ÿ»')ÿ¾')ÿ¾')ÿ¾')ÿ¾')ÿ¾')ÿ¾'¦¶˜Â‹Î~Ûuùkÿbÿ[ÿTÿ&Nÿ.Iÿ5Eÿ< AÿC >ÿH;ÿN8ÿS5ÿX3ÿ^1ÿd.ÿj,ÿr*ÿz'ÿƒ%ÿŽ$ÿ˜#ÿ "ÿª!ÿ­!ÿ­!ÿ­!ÿ­!ÿ­!ÿ­š¾‹Ê~×pãgÿ^ÿ VÿOÿIÿ Cÿ'?ÿ.:ÿ47ÿ:3ÿ?0ÿD.ÿI ,ÿN )ÿS 'ÿX %ÿ^ #ÿd !ÿl ÿt ÿ}ÿ‡ÿÿ™ÿ›ÿ›ÿ›ÿ›ÿ›ÿ›ÿL*ÿH3ÿO4ÿT7ÿZAÿ\JÿZTÿW`$ÿTk*ÿPx/ÿM„3ÿJ6ÿG™9ÿF¡;ÿE©<ÿD°>ÿC·?ÿBÀ?ÿBÉ@ÿAÕAÿAäAÿAîBÿAöBÿAýBÿBÿAùDÿAôFÿBïGÿBïGÿBïGÿBïGÿBïGÿBïGÿBÿM)ÿJ2ÿQ2ÿW6ÿ\?ÿ^Iÿ]SÿZ^$ÿWi*ÿSu/ÿP4ÿM7ÿJ—:ÿHŸ<ÿG§=ÿF®?ÿEµ@ÿD½AÿDÆBÿCÑBÿCâCÿCìCÿCõCÿCüCüDÿCõGÿCïHÿDëIÿDëIÿDëIÿDëIÿDëIÿDëIÿDÿM)ÿL0ÿT1ÿY4ÿ_=ÿaGÿ`Rÿ]\$ÿZg+ÿVs0ÿS4ÿOŠ8ÿM”;ÿK=ÿJ¤?ÿH¬@ÿH³AÿG»BÿFÃCÿFÎDÿEßDÿEêEýEóEûEûE÷FÿDðIÿEêJÿFåKÿGåKÿGåKÿGåKÿGåKÿGåKÿGÿN)ÿO.ÿW.ÿ]2ÿc;ÿeFÿePÿaY$ÿ]d+ÿZp0ÿV|5ÿS‡9ÿP‘<ÿNš?ÿM¢@ÿK©BÿJ°CÿJ·DÿIÀEÿHÊFýHÛFúHçGøHòGõHúFñIÿGêKÿHãLÿIÞMÿJÞMÿJÞMÿJÞMÿJÞMÿJÞMÿJÿO(ÿR,ÿZ,ÿa/ÿg:ÿjDÿjNÿgW$ÿba+ÿ^m1ÿ[x6ÿWƒ:ÿT=ÿR–@ÿPžBþO¥DüN­EûM´GúL¼HùLÇHöKÔIóKåIðKðIíLùHéLÿJáNÿKÚOÿLÓPÿMÓPÿMÓPÿMÓPÿMÓPÿMÓPÿMÿP(ÿU*ÿ])ÿe-ÿl8 ÿoBÿoKÿlU#ÿh^*ÿci1ÿ_t6ý\;ûY‰?ùV’B÷TšDõS¢FôR©HòQ±IñP¹JïOÃKîOÏKëOâKçOîKäOøMßOþNÕQÿOÎRÿPÉSÿPÉSÿPÉSÿPÉSÿPÉSÿPÉSÿPÿQ'ÿX'ÿa'ÿj,ÿq6 ÿt@ÿtIÿrR"ÿn[)ýhd0ùep6öa{;ó^…@ð[ŽCîY–FìWžHêU¦JèT­LçSµMåS¿NãSÌNáSßNÝSíOØR÷QÑSýRÊTþSÄVÿS¿WÿS¿WÿS¿WÿS¿WÿS¿WÿS¿WÿSÿR'ÿ[%ÿe$ÿn*ÿv4 ÿz=ÿzFÿxO ûtX(öoa/ñkl6ígv<éc€@æ`ŠEä]’Há[šJßY¢MÝXªOÚW²PØV¼QÕUÈRÒUÛSÎVëSËVöUÆVýV¿XýVºYýW¶ZýW¶ZýW¶ZýW¶ZýW¶ZýW¶ZýWÿS&ÿ_"ÿi!ÿs(ÿ{2 ÿ;ÿ€Dû~Lô{T%îv]-éqh4ämr;ài|AÜe…FØbŽJÔ_–MÑ]PÎ\¥RÌZ­TÉY¶VÇYÂWÆYÐWÂYæX¿YóY»ZûYµ[ûZ°]ûZ­]ûY­]ûY­]ûY­]ûY­]ûY­]ûYÿV$ÿb ÿm ÿw&ÿ0ÿ„9 ý†Aõ…Iî‚Q"ç}Z*áxd2Üsn:ÔnwAÐj€GÌf‰LÈd‘PÅb˜SÃ` UÀ^¨X¾]±Y»]¼[¹\É\·\à\´]ï\°^ù]«_ù]¨`ù\¥aù\¥aù\¥aù\¥aù\¥aù\¥aù\ÿX"ÿeÿqÿ{$ÿ„.ÿ‰6 ø‹>ï‹FèˆNá„W&Ù~a1Ñxj:ËssBÆo|HÂl„M¾iŒQ»f“U¸d›Xµc£Z³a¬\°`·^®`Ä_¬`Ø_©aë_§a÷_¢c÷_Ÿd÷_dø^dø^dø^dø^dø^dø^ÿ[ ÿhÿtÿ~#ÿˆ+ý4 ó;êCâJÚŠT%Ѓ]0É~g:ÃxoB¾txH¹q€NµnˆR²kV¯i—Z¬gŸ\©e¨_¦d²a¤d¿b¢dÐb dçbžeõbšfõa˜gö`–hö`–hö`–hö`–hö`–hö`–hö`ÿ]ÿjÿwÿ‚!ÿ‹)ù‘1ï•8 æ–?Ý”GÒŽQ$ʈ[/ƒd9¼~lA·ytH²u|N®r„Sªo‹W¦m“[£k›^ j¤`h®c›hºd™hËe—hãd•iód“jôc‘kõbkõakõakõakõakõakõaÿ_ÿmÿzÿ…ÿŽ'õ•.ë™5áœ; Ö˜CÌ“O"ÄX.½‡a8¶‚iA°~qH«zyN§w€S£tˆXŸq[›o˜_˜n¡b•m«d’l·flÆflßfŽmñeŒnód‹nôcŠnôbŠnôbŠnôbŠnôbŠnôbŠnôbÿaÿoÿ|ÿˆÿ‘$ò™+çž1Ý 6 ÑœAÇ—M!¿‘V-·Œ_7±‡g@«‚nH¥~vN {}Sœx…X˜v\”t•_‘ržbŽq¨e‹p´g‰pÃh‡pÛg†qîf†ròe…ród„rôc„rôc„rôc„rôc„rôc„rôcÿcÿqÿÿŠü”!îœ'ã¢,ؤ2ÌŸ@ÚK º•U,³]7¬‹e?¥‡lG ƒsM›€{S–}‚W’zŠ\Žx’`Šv›c‡u¥f„t±g‚tÀh€tÕh€uìgvòfuóeuóduóduóduóduóduódÿeÿtÿÿù—ë #ߦ&Ò§0È£>¿žI¶™S+®”[6§c? ‹jF›‡qM•„xRWŒ‡\ˆ}`„{™c€z£f~y¯h{y½izyÑiyzêhzzòfzyòezyódzyódzyódzyódzyódzyódÿgÿvÿ„ÿõ›ç¤Û«Ϊ/Ħ=º¡H²Q*ª˜Y4¢”a>œhE–ŒoL‰vR‹†}W†„…[‚‚_~€—cz¡fw~¬hu}»is~Îis~èht~ñft}òeu|ódu|ódu|ódu|ódu|ódu|ódÿiÿxÿ‡ÿ“ñžã¨Õ®Ê­-À©;¶¥F­¡P)¥œX3ž˜_<—”fD‘mK‹ŽtQ†Œ{V‰ƒ[|‡‹_x†”bt„Ÿeqƒªgoƒ¸imƒËimƒæhnƒòfo‚òepódpódpódpódpódpódÿkÿ{ÿŠÿ–í¢Þ­бŰ+»­9²©D©¥N' ¡V2™^;’šdC‹—kJ†”rP€’yU{€Zw‰^rŒ’anŠœdk‰¨gi‰¶hg‰Èhg‰ãgh‰òfi‡óej†ódj†ódj†ódj†ódj†ódj†ódÿnÿ~ÿ÷šÛ§ Ó° Ê´À´)¶±7­®C¤ªL%›¦U0“£\9Œ cA†iH€špN{˜wSv–~Xq”†\l’`h‘šce¦ec´faÆfaáfaòecŽóddŒôcdŒôcdŒôcdŒôcdŒôcdŒôcÿqÿ‚ÿ‘ ÞŸ Óª ̳ ĸº¸&±¶5 §³Až¯J#–¬S.Ž©Z7‡¦a?€¤gFz¡nLuŸuQp|Ukœ„ZfšŽ]c™˜`_˜¤b]˜²d[˜Ãd[˜Þc[˜ðc\•õb^“õb^“õb^“õb^“õb^“õb^“õbÿuÿ† ë–գ̭Ŷ½¼´½#«»2 ¡¹?˜¶H ³Q+ˆ°X4€®_b»pC^ºwGZ¹€KV¹‰NS¸”PP¸ RM¸®TL¸¿TK¹ØTK·íTJ¶ùUJ³þVJ³þVJ³þVJ³þVJ³þVJ³þVú‡֘ɥ½¯³¸©Â¡ÍšÐ’Ð(ŠÏ6 ÎAyÌJrËR&lÊZ-fÉa2aÈh7\ÇoqØHj×PdÖX%_Õ_*[Ôg/WÔn3SÓv6PÓ9LÓˆ;JÓ”>GÓ ?EÔ®@DÔ¿ACÕØ@DÓì@BÒöBAÑþDAÑþDAÑþDAÑþDAÑþDAÑþDјåµ®©¸žÃ”ÍŠÙ „ã}ä&uä2nã<gãEaãM\ãU Wã]$Tãd'Pâk*Mâs-Jã|0Hã†2Eã4Cãœ5Aä©6@ä¸7?åË7?åä7?ãó6=âû8=âû8=âû8=âû8=âû8=âû8Æ¡·«ª´ž¾“ɈÔîyíqí'jî2dî; ^îCXîKSîRPïYLï` Iïg#Gïo%Dðw'Að€)?ðŠ*=ñ•,;ñ¡-9ò®.8ò¾/7óÐ/7óç/6ñó/6ñó/6ñó/6ñó/6ñó/6ñó/¹§«°Ÿ»’ƆÐ{Ýt÷m÷fø&_ø/Zù8 Tù@PúGLúNHûUEû[Bûb@üh=üp:ýx8ý‚ 6ý"4þ˜#2þ¤$1ÿ±%0ÿ¿&/ÿÏ&.ÿã&.ÿã&.ÿã&.ÿã&.ÿã&.ÿã&­­Ÿ·’†ÍyÚpòhÿaÿZÿ#Tÿ+Oÿ3Jÿ;FÿB CÿI @ÿO=ÿU:ÿ[8ÿa5ÿh3ÿo0ÿx.ÿ‚,ÿ*ÿ™)ÿ¤(ÿ¯'ÿº&ÿÇ&ÿÇ&ÿÇ&ÿÇ&ÿÇ&ÿÇ¡´“¿†ÊxÖlâcü\ÿUÿOÿIÿ&Dÿ.@ÿ4<ÿ;9ÿA6ÿF3ÿL1ÿQ .ÿW ,ÿ] *ÿd (ÿl %ÿu #ÿ!ÿŠ ÿ•ÿ ÿ¨ÿ±ÿ±ÿ±ÿ±ÿ±ÿ±•¼†ÇyÓkà^íVÿOÿ IÿCÿ>ÿ 9ÿ'5ÿ-2ÿ3.ÿ8+ÿ=(ÿB&ÿG$ÿL"ÿQ ÿWÿ^ÿeÿnÿxÿƒÿ ÿ– ÿž ÿž ÿž ÿž ÿž ÿž ÿB-ÿB2ÿH2ÿL6ÿN<ÿPGÿPRÿN_ÿKkÿHw$ÿEƒ'ÿBŽ*ÿA—,ÿ? .ÿ?§/ÿ>®0ÿ=µ1ÿ=¼2ÿ<Å2ÿ<Î3ÿ;ß3ÿ;ê4ÿ;ó4ÿ;û4ÿ<ÿ3þ<ÿ3ü=ÿ4ö?ÿ5õ?ÿ5õ?ÿ5õ?ÿ5õ?ÿ5õ?ÿ5ÿC,ÿD0ÿJ0ÿN4ÿQ:ÿSFÿRQÿQ]ÿNi ÿKt$ÿH€(ÿE‹+ÿC•-ÿB/ÿA¥0ÿ@¬1ÿ?³2ÿ?º3ÿ>Â4ÿ>Ì4ÿ>Ü5ÿ=è5ÿ=ñ5ÿ>ú5ý>ÿ5û?ÿ4ø?ÿ6òAÿ7ðAÿ7ðAÿ7ðAÿ7ðAÿ7ðAÿ7ÿD,ÿG.ÿM.ÿQ2ÿT9ÿWDÿVOÿTZÿQf ÿNr%ÿK})ÿHˆ,ÿF’.ÿE›0ÿD¢2ÿC©3ÿB°4ÿB·5ÿA¿6ÿAÉ6ÿ@×7ÿ@å7ý@ð7ú@ø7÷Aÿ6öAÿ7òAÿ8ìCÿ9êDÿ9êDÿ9êDÿ9êDÿ9êDÿ9ÿE+ÿI,ÿP,ÿU/ÿY7ÿ\Bÿ[MÿXWÿVc ÿRo%ÿOz*ÿL…-ÿJ0ÿH˜2ÿGŸ4ÿF¦5ÿE­6ÿE´7ÿD¼8þDÆ8üDÒ9ùCâ9öDî9óD÷9ñDÿ9ïDÿ:ëEÿ;äFÿ<ãFÿ<ãFÿ<ãFÿ<ãFÿ<ãFÿ<ÿF+ÿM)ÿT)ÿY,ÿ^5ÿa@ ÿaJÿ^TÿZ_ ÿWk&ÿTv*ÿQ.ÿN‹1þL”4üKœ5ûJ£7úIª8øH±9÷H¹:öGÂ;õGÍ;òGß;îGì;ëHö;éGÿ=çGÿ>áHÿ?ÚJÿ@ØJÿ@ØJÿ@ØJÿ@ØJÿ@ØJÿ@ÿG*ÿP'ÿX&ÿ^*ÿc3ÿf= ÿfGÿdQÿ`[ ÿ\g&ýYr+úV}/øS‡3öQ5ôP˜7òNŸ9ñM¦;ïL­<îLµ=ìK¾=ëKÊ>éKÜ>åLê=âKõ?ßKþAÜJÿBÔLÿCÍMÿCËNÿCËNÿCËNÿCËNÿCËNÿCÿJ(ÿT$ÿ\#ÿc(ÿh0ÿl; ÿlDÿjNþfXùab%õ^m+ò[x0ïX‚4ìV‹7êT”9èS›;æQ£=åQª>ãP²?áO»@àOÇ@ÞOØAÙOèAÔOôCÐNþEÎNÿFÈPÿFÂQÿGÀQÿGÀQÿGÀQÿGÀQÿGÀQÿGÿM%ÿW!ÿ` ÿh&ÿn.ÿr8 ÿrAýpK÷mTòh^$ídi*éat0å^~4â[‡8àY;ÝW—>ÛUŸ@ØT¦BÕS®CÒR·DÐRÂEÎRÐFËRåFÈRòHÅRýIÂRÿJ¼TÿJ·UÿJ¶UÿJ¶UÿJ¶UÿJ¶UÿJ¶UÿJÿP#ÿ[ÿdÿm$ÿs+ÿw5þx>öwGðtPêoZ"äke)àgo/Ûcy5Ö`‚:Ò]Š>Ï[’AÌYšCÊX¡EÈW©GÆV²IÄV¼JÂUÉK¿UßK¼VîL¹VúM·VÿM²XÿM®YÿM¬YÿM¬YÿM¬YÿM¬YÿM¬YÿMÿS ÿ^ÿhÿq"ÿx(ÿ|1ø~: ð}CézLâvWÜra(Ômk/Ïit6Ëe};Çb…@Ä`CÁ^•F¿]œH¼[¤KºZ­L¸Y·N¶YÃO´YÕO±ZêP®Z÷P¬ZÿP¨[ÿP¤\ÿP¤]ÿO¤]ÿO¤]ÿO¤]ÿO¤]ÿOÿVÿaÿlÿu ÿ|%ý.ó„7 ê„?âHÛ}SÑw]'Ërg0Ænp7Âjx<¾g€AºeˆE·cH´a˜K²_ŸM¯^¨O­]²Q«]¾R©]ÎS¦]åS¤^ôS¢^ÿSŸ_ÿRœ`ÿR›`ÿR›`ÿR›`ÿR›`ÿR›`ÿRÿXÿdÿpÿyÿ€#ø†*í‰2äŠ; ܈EÑ‚PÊ}Z&Äxc/¾sl7¹ot=µl|B²j„F®gŒJ«e“M¨d›O¥b¤R£a®T¡a¹UŸaÈVaáV›bñU™býU—cÿT•dÿT”dÿS”dÿS”dÿS”dÿS”dÿSÿZÿgÿsÿ}ÿ„ óŠ&èŽ.ß6ÔŒAˇMÄ‚W&½}`/·xi6²tq=®qxBªn€G¦lˆJ£jN h˜Qg SšfªU˜eµW•eÄX”eÛX’fïW‘füWgþVŽgþUhþUhþUhþUhþUhþUÿ\ÿiÿvÿ€ýˆïŽ"ä“)Ú”1Î?Æ‹K¾†U%·^.±}f6¬yn<§vuB£s}GŸp„KœnŒN˜l”R•kT’j§Wi²YiÀZŒiÕZŠjìYŠjúX‰kýW‡kýV‡kþV‡kþV‡kþV‡kþV‡kþVÿ^ÿlÿxÿƒù‹ë’à˜#Ó˜/Ê”=ÁI¹ŠS$²†[-¬d5¦~k<¡zrBwzG™uK•s‰O‘q‘RŽošU‹n¤Xˆm¯Z†m½[„mÐ[ƒnéZƒnøY‚oüX‚oýW‚oýW‚oýW‚oýW‚oýW‚oýWÿ`ÿnÿ{ÿ†öç–ۜϛ-Å—; ¼“G´ŽQ#­ŠY,§†a4¡‚i;œpA—|wF“y~Kw†O‹uŽRˆs—U„r¡X‚q¬Zqº\~qÌ\}rç[}röZ|rüY|rüW|rýW|rýW|rýW|rýW|rýWÿbÿqÿ}ÿˆò’ãšÕŸÊž+Á›9 ¸—E°’O"©ŽX+¢Š_3œ†g:—ƒn@’€uE~|J‰|„N…zŒR‚x•V~wŸX{vª[yu¸\wuÊ\wvå\wwõZwvûYwvüXwvüWwvüWwvüWwvüWwvüWÿdÿsÿ€ÿ‹ï•ßž ТÆ¡)½ž7 ´šC¬–M ¤’V*Ž^2—‹e9’ˆl@…sEˆƒzJ„€N€ŠR|}“Ux|Xu{¨[sz¶\qzÇ\qzâ\q{óZq{ûYrzüXrzüXrzüXrzüXrzüXrzüXÿgÿuÿƒôŽ Û™ Ô¡ ̤¤'¸¢6 °žB§šL —T)™“\1“c8j?ˆŠqDƒˆxI~†Mz„ˆQv‚‘Us›Xo€¦Zm´\kÅ\k€ß\k€òZk€ûYl~üXm~üXm~üXm~üXm~üXm~üXÿiÿxÿ… â’Õ› Σ Ǩ½¨%´¦4 «¢@£ŸJ››R'”˜Z0Ž•a7ˆ’h=‚oC~ŽvHyŒ}LuŠ…PqˆŽTm‡™Wj†¤Yg…±[e…Â[e…Ü[e…ðZf…ûYgƒüXgƒüWgƒüWgƒüWgƒüWgƒüWÿlÿ{ ò‰ Ù•ÏžɦÁ«¸«"¯ª2¦§>ž¤H–¡Q%žX.ˆ›_5‚™f<}–mAx”tFs’{KoƒOkŒRgŽ–Ud¢XaŒ¯Y_ŒÀZ_ŒÙY_ŒîY_ŒûXaŠýWa‰ýWa‰ýWa‰ýWa‰ýWa‰ýWÿo ÿ ßҘʢ©º¯²° ©®/¡¬<˜©F‘§O#‰¤V,ƒ¢]3}Ÿd9wk?r›qDnšyHi˜Le—ŠPa•”S^• U[”­WZ”½XY”ÔWY”ìWY“ùV[‘þU[þU[þU[þU[þU[þUÿs õ„̜ؑå»­³³ «µ£´,›²9’°DŠ­M ƒ«T)}©\0w§b6q¥i|½Hu¼P!oºX'j¹_-e¸e2`·l6\¶t:Xµ|>U´…AQ´DN³œFL³©HJ³¹HI´ÎHI³éHH±öIH°ÿJH°ÿJH°ÿJH°ÿJH°ÿJH°ÿJâ†Î”¡¶©«±¡º˜ÃÉŠÉ ƒÉ/{È; tÇEnÆNhÅV!cÄ]'^Ãd+ZÂk/VÁr3SÁ{6OÀ„9LÀGÀ¨?FÀ¸@EÀÍ@EÀè?D¾öAC½ÿBC¼ÿCC¼ÿCC¼ÿCC¼ÿCC¼ÿCÖÆ›¸¥­®¢¶˜¿ÈƒÑ ÒyÒ*rÒ7lÑBfÑKaÐS\Ï[XÏb#TÎi'QÎq*MÎz-J΃0HÎŽ2EΚ4CΨ5Bθ6AÏÍ5AÎè5@Íõ7?Ëþ9>Ëÿ9>Ëÿ9>Ëÿ9>Ëÿ9>Ëÿ9Ê–¼¢¯ª£³˜¼Æ‚ÏxÙ sÞnÞ&hÞ3bÞ> ]ÞHYÞPUÞXQÞ`NÞgKÝo HÞx#FÞ%CÞŒ'AÞ˜)?Þ¦*>ßµ*=àÈ*=ßã*<Ýñ+;Üû-:Üý.:Üý.:Üý.:Üý.:Üý.ÀŸ±§¤°˜ºÃÍv×nèiècè'^é2Xé;TéD OêLLêSIê[FêbDëjAër?ë{<ë†:ì‘ 8ìž!7í¬"6í»#5îÏ#4îæ#4ëõ#4ëø#4ëø#4ëø#4ëø#4ëø#³¥¦­™·Á€ËuÕiádó^óYô&Tô0Oõ8Kõ@GöG DöN A÷U?÷\<÷c:øj7øs5ø}3ùˆ1ù”/ú¡.ú¯-û¾,ûÏ+ûç+ûë+ûë+ûë+ûë+ûë¨ªš´¿€ÉtÓgÞ^òYþSÿNÿ#Iÿ+Eÿ3Aÿ:>ÿA;ÿG8ÿN5ÿT 3ÿZ 1ÿa /ÿi ,ÿr *ÿ} (ÿˆ&ÿ•%ÿ¡$ÿ®#ÿº"ÿÊ"ÿÐ"ÿÐ"ÿÐ"ÿÐ"ÿМ²Ž¼ÇsÑgÝYãSýMÿHÿCÿ?ÿ&:ÿ-7ÿ33ÿ90ÿ?.ÿD+ÿJ)ÿP'ÿV$ÿ]"ÿe ÿnÿyÿ…ÿ’ ÿž ÿ¨ ÿ³ ÿ· ÿ· ÿ· ÿ· ÿ· º‚ÅtÐgÜXãMðGÿBÿ <ÿ8ÿ4ÿ0ÿ%,ÿ+)ÿ0%ÿ5#ÿ: ÿ?ÿDÿIÿOÿVÿ^ÿhÿrÿ~ÿŠÿ” ÿž ÿ¢ ÿ¢ ÿ¢ ÿ¢ ÿ¢ÿ9/ÿ<0ÿA1ÿD4ÿD:ÿDEÿEQ ÿC]ÿAiÿ>vÿ<ÿ:Œÿ9– ÿ8ž!ÿ7¥#ÿ7«#ÿ6²$ÿ6¹%ÿ6À%ÿ5Ê&ÿ5×&ÿ5å&ÿ5ï&ÿ5ø&ÿ6ÿ&þ6ÿ&ü6ÿ&ü6ÿ'ú6ÿ(ú6ÿ(ú6ÿ(ú6ÿ(ú6ÿ(ÿ9/ÿ>/ÿD/ÿF2ÿH8ÿHCÿHO ÿG[ÿDgÿBsÿ?ÿ=Šÿ<“!ÿ;›#ÿ:¢$ÿ9©%ÿ9°&ÿ8¶&ÿ8¾'ÿ8Ç'ÿ8Ó(ÿ8ã(ÿ8í(þ8÷(û8þ'ù9ÿ'ø8ÿ)ø8ÿ*ö8ÿ*ö8ÿ*ö8ÿ*ö8ÿ*ö8ÿ*ÿ:/ÿA,ÿF,ÿJ/ÿL7ÿMAÿLL ÿKXÿHdÿFpÿC|ÿA‡ ÿ?#ÿ>˜$ÿ= %ÿ=¦&ÿ<­'ÿ<´(ÿ;»)ÿ;Ä)ÿ;Ï)þ;à*û;ë*ø;õ)ö<þ)ô<ÿ*ó;ÿ+ò;ÿ,ï;ÿ-ï;ÿ-ï;ÿ-ï;ÿ-ï;ÿ-ÿ<-ÿD)ÿJ)ÿN,ÿQ4ÿR>ÿRJ ÿPUÿMaÿJmÿHxÿEƒ"ÿC$ÿB•&ÿA'ÿ@£(ÿ@ª)þ?±*ý?¸+ü?Á+ú?Ë+÷?Ü,õ?é,ñ?ô+ï?ý,í?ÿ-ì>ÿ/ë>ÿ0ç?ÿ0ç?ÿ0ç?ÿ0ç?ÿ0ç?ÿ0ÿ@*ÿH&ÿN&ÿR)ÿV2ÿW<ÿWG ÿUQÿR]ÿPiÿMt ÿJ#ýH‰&ûG‘(úF™)øE *÷D§+õD­,ôCµ-óC½-òCÈ.ðC×.ìCç.éDó-æCü0äBÿ1ãBÿ2áBÿ3ÜCÿ4ÜCÿ4ÜCÿ4ÜCÿ4ÜCÿ4ÿC'ÿK#ÿR"ÿX'ÿ\/ÿ]9ÿ^C ÿ[NÿXXþUdúRo ÷Pz$ôM„'òL)ðJ•+ïIœ-íI£.ìHª/êG±/éGº0çGÅ0æGÒ0âHå0ßGò2ÛGû4ØFÿ5ÕFÿ6ÒFÿ7ÍHÿ7ÍHÿ7ÍHÿ7ÍHÿ7ÍHÿ7ÿF$ÿO ÿVÿ]$ÿa,ÿc5ÿd@ ÿbJú^Tõ[_ñXk îUu%ëS(èQˆ+æO‘-äN˜/âM 0áL§1ßL®2ÝK·3ÛKÂ4ÙJÏ5ÕKä5ÐKð6ÍJû8ÊJÿ:ÈJÿ:ÆKÿ;ÁLÿ;ÁLÿ;ÁLÿ;ÁLÿ;ÁLÿ;ÿJ!ÿSÿ[ÿb"ÿg)ÿi2ÿj< ùhFòePía[è^f ä[q%áX{)ÞV„,ÛTŒ/ØR”2ÔQ›4ÒP£5ÐOª7ÎN²8ÌN¼9ÊNÉ:ÈNÝ:ÄOí;ÁNù=¾Nÿ=¼Nÿ>ºOÿ>¶Pÿ>¶Pÿ>¶Pÿ>¶Pÿ>¶Pÿ>ÿMÿVÿ_ÿg ÿl&ÿo.ùp8òoB ëlKåiWßebÚal%Ô]v*Ð[~/ÍY‡2ÊW5ÈV–7ÆT9ÄS¥;ÁS­<¿R·>½RÃ?¼RÓ?¹Rè?µRöA³RÿA±SÿA¯SÿA¬TÿA¬TÿA¬TÿA¬TÿA¬TÿAÿPÿZÿdÿlÿq#ýu*óv3ëv= ãsGÜoSÔk^Îfg&Êcq+Æ`y0Â^4¿\‰7½Z‘:ºY˜<¸X >¶W¨@´V²B²V½C°UÌC­VãD«VóD¨WþD§WÿD¥XÿD¢XÿD¢XÿD¢XÿD¢XÿD¢XÿDÿSÿ]ÿhÿpÿv ÷z&í|.ä|8ÜzD ÒuOËpZÆlc&Áhl,½fu1¹c}5¶a„9³_Œ<°]”?®\›A«[¤C©Z­E§Z¸F¥YÇG£ZÞG¡ZïGŸ[üG[ÿG›\ÿFš\ÿFš\ÿFš\ÿFš\ÿFš\ÿFÿUÿ`ÿkÿtÿzò"ç)Þ‚3Ó@ ËzLÄvV¾q`%¹nh,´kq2±hy6­f€:ªdˆ=§b@¥`—C¢_ EŸ^©G^´I›]ÂJ™]ÖJ—^ìJ–_úI•_ÿI“`ÿH’`ÿG’`ÿG’`ÿG’`ÿG’`ÿGÿXÿcÿnÿwû~íƒâ‡#Ö‡.̃= ÅI½{S·v]%²se,­om2©mu7¦j|;¢h„>ŸfŒAœe”D™cœG—b¦I”b°K’a¾LaÐLbèLŽcøKcÿJŒdÿI‹dÿI‹dÿI‹dÿI‹dÿI‹dÿIÿZÿfÿqÿz÷‚è‡Ý‹Ћ,Lj; ¿„G¸Q±{Z$¬wb+§tj1£qr6Ÿoy;›m€?˜kˆB•iE’h™Hf¢JŒf­LŠeºMˆeÌN‡fæN†göL†gÿK…hÿK„hÿJ„hÿJ„hÿJ„hÿJ„hÿJÿ\ÿhÿtÿ}ó…ä‹ÖËŽ*ÂŒ8 ºˆD³„O¬X#§|`+¡xh1uo6™sv;•q}?’o…BŽmE‹l–Hˆk K…jªMƒi·NiÈO€jãO€kôNkÿLkÿKkÿKkÿKkÿKkÿKkÿKÿ^ÿkÿvû€ êˆ Û Ð’Ç’'¾6¶ŒB®ˆM¨„V"¢€^*œ}e0—zl5“ws:u{>Œs‚Bˆr‹F…p“I‚oLn¨N}nµO{mÆPznàPyoòNyoþMyoÿLyoÿKyoÿKyoÿKyoÿKyoÿKÿ`ÿm ÿy îƒ Û‹ Ô‘ Ì••%¹“4±AªŒK£ˆT!„\)—c/’~j5Ž|q9Šzx=†x€BƒvˆEu‘I|s›Lyr¦Nvr³PurÃPsrÝPtsðOtsýMtsÿLtsÿLtsÿLtsÿLtsÿLtsÿLÿbÿo ü{ Þ†ÕŽÏ” ǘ¾˜#µ–2­“?¦IŸŒR ˜‰Z(“†a.Žƒh4‰o9…v=}~A}{†EzyIvx™Lsw¤Nqw±PovÁPnwÙPnwïOnwüNnwÿMowÿLowÿLowÿLowÿLowÿLÿd ÿr ð~ÚˆÐÊ—›¹›!±š0©—=¡”Gš‘P”X'Ž‹_-‰ˆf3„†m8€„t={‚{Ax€„EtHq}—Km|¢Nk|¯Oi{¾Ph|ÕPh|íOi|ûNi|ÿMj{ÿLj{ÿLj{ÿLj{ÿLj{ÿLÿf ÿuáԋ˓Ě½žµŸ¬ž.¤›; ˜E–•N“V%‰],„Žd2‹k7zŠrmBi‹ˆFeŠ’Ib‰žK_ˆªM^ˆºN\ˆÎN]ˆéM]‡øL]‡ÿK^†ÿK^†ÿK^†ÿK^†ÿK^†ÿKÿmê|ՈʒÁš¹ ±¦ ©§¢§)š¥6 ’£A‹¡J„ŸR!~Z(y›`.t™g3o—n8k–uQ£˜@O£¥BM£´CL£ÈCL£äCK¡ôCK ÿDK ÿDK ÿDK ÿDK ÿDK ÿDã}ϋ–·Ÿ­¦£­™µ¹‹º„º-}¹9 w¸Cq¶LkµSf´Z"b³a&^²h+Z±o.V°w2S°5O¯‹8L¯—:J®¤E«ÿ?E«ÿ?E«ÿ?E«ÿ?E«ÿ?ڃǑ»œ¯¤¥«š²º†Á Â{Â(uÂ5oÁ@ iÀId¿Q_¾X[¾_ W½f$T¼n'Q¼v*M»-J»Š0H»–2E»£4C»²4B»Å5C»â4B¹ó5A¸ý7@·ÿ7@·ÿ7@·ÿ7@·ÿ7@·ÿ7΋¿˜²¡§©œ°‘¸†À{ÈtËpÌ"kË0fË<aËE \ÊNXÊVTÊ]QÉdNÉlKÉt"HÈ~$EȈ'CÈ•(AÈ¢*?ȱ+>ÉÄ+>Éá*>Çò+=Æü-<Åÿ.<Åÿ.<Åÿ.<Åÿ.<Åÿ.Ä“¶Ÿ©¦®’·†¿{ÇpÏgÖ d×`Ø*\Ø6XØATØJ PØR MØZJ×bG×iE×rB×|@؇=Ø“<Ø¡:Ù° 9Ùà 9Ùß 9×ï 8Õù"7Ôÿ#7Ôÿ#7Ôÿ#7Ôÿ#7Ôÿ#¹œ«¤Ÿ¬“µ‡¾{ÆpÎeÖ]ãZãVã'Rä2Nä<JäDGåMEåU Bå\ @åd>æl;æv9æ€7çŒ5ç™4ç¨2è¸2èÌ1èå1æô1åü1åü1åü1åü1åü®¢¡ª”³ˆ½{ÆoÎcÖXÞTîQïMï&Ið/Eð8Añ?>ñG<òN:òU7ò\5ód 3óm 1ôw /ô‚ -ô+õ*ö«)ö¼(öÎ'÷æ'õñ'õñ'õñ'õñ'õñ£¨–²ˆ»{ÅoÎb×VÞNðJúFûBû"?ü*;ý28ý95þ?2þF0ÿL.ÿS+ÿZ)ÿb'ÿk$ÿv#ÿ‚!ÿ ÿ ÿ« ÿº ÿÉ ÿÝ ÿÝ ÿÝ ÿÝ ÿÝ ˜°Šº|ÄoÍbØUÞIäDû?ÿ;ÿ8ÿ4ÿ$1ÿ+-ÿ1*ÿ6'ÿ<%ÿB#ÿH ÿNÿUÿ]ÿgÿrÿÿŒÿšÿ¦ÿ²ÿ¼ÿ¼ÿ¼ÿ¼ÿ¼Œ¸}ÂoÌbØTßGå>ñ9ÿ4ÿ 0ÿ,ÿ)ÿ&ÿ""ÿ'ÿ,ÿ1ÿ6ÿ<ÿAÿHÿOÿW ÿa ÿl ÿy ÿ†ÿ’ÿÿ¥ÿ¥ÿ¥ÿ¥ÿ¥ÿ11ÿ6.ÿ:/ÿ;2ÿ;9ÿ;Cÿ9Oÿ8\ ÿ6h ÿ4tÿ2€ÿ1‹ÿ0”ÿ0›ÿ/¢ÿ/¨ÿ.¯ÿ.µÿ.¼ÿ.Åÿ.Ïÿ.àÿ.ëÿ.ôÿ.üü/ÿû/ÿú.ÿú.ÿú.ÿú.ÿú.ÿú.ÿÿ3/ÿ9,ÿ=-ÿ>0ÿ?6ÿ?Aÿ=Mÿ€ÿ<Šÿ<’ÿ;šý: ü:§û9­ú9´ù9¼ø9Æö9Óò9äï9ðì:úê9ÿ!é9ÿ#è9ÿ$ç9ÿ$ç9ÿ%ç9ÿ%ç9ÿ%ç9ÿ%ÿ<'ÿC#ÿH"ÿL&ÿO/ÿP9ÿNCÿLO ÿJ[ÿHfÿEqüC|úB†øAŽö@–õ?ó?£ ò>ª ñ>±!ð>¹!î>Ã!í>Ï!ê>â!æ?ï!ã>ù#á=ÿ%ß=ÿ'Þ=ÿ(Ü=ÿ(Ü=ÿ(Ü=ÿ(Ü=ÿ(Ü=ÿ(ÿ?#ÿG ÿLÿQ$ÿU,ÿV5ÿU?ÿSJ þPVúNböKmóIwðGîFŠìE’ ëD™!éC "èC§#æC®#åB¶$äBÀ$âCÌ$ßCà$ÛCí%ÖBø(ÓBÿ*ÑBÿ+ÏAÿ+ÎAÿ,ÎAÿ,ÎAÿ,ÎAÿ,ÎAÿ,ÿC ÿJÿPÿW!ÿ[(ÿ\2ÿ[;üYF öVQñT]íQhéOræM|äK… âJŽ!àI•#ÞHœ$ÜG£&ÚG«'ØF³(ÕF¼(ÓFÈ)ÑFÜ*ÍGì*ÉF÷,ÇFÿ.ÄFÿ/ÃFÿ/ÂFÿ/ÁFÿ/ÁFÿ/ÁFÿ/ÁFÿ/ÿFÿNÿVÿ\ÿ`%ÿb-üb7ô`Aî]L èZXãXcßUnÛRwØP€"ÔO‰$ÑM'ÏL—(ÍLž*ËK¦+ÉJ­,ÇJ·-ÆJÂ.ÄJÑ/ÁKç/½Jô1»Jÿ2¸Jÿ2·Kÿ3¶Kÿ3¶Kÿ3¶Kÿ3¶Kÿ3¶Kÿ3ÿJÿRÿZÿaÿf!þh)ôh2ìg<ådH ßaTÙ^^Ò[iÎXr ËV{$ÈTƒ'ÅR‹*ÃQ’,ÁP™.¿O¡/½O¨1»N±2¹N¼3·NÊ4µNá4²Nñ5¯Oý6­Oÿ6¬Oÿ6«Oÿ6«Oÿ6«Oÿ6«Oÿ6«Oÿ6ÿMÿUÿ_ÿfÿkøm$ín,åm6ÝkCÔgOÍdZÈ`dÄ]m"Á[v&½Y~)»W…,¸V/¶U”1´Tœ3²S¤4°R­6­R·7¬RÅ8ªRÚ8§Rí9¥Sú9£Sÿ9¢Sÿ9¡Tÿ8¡Tÿ8¡Tÿ8¡Tÿ8¡Tÿ8ÿOÿYÿcÿjÿoòræt&Ýt1Óq?ËmKÅiVÀf`»ci"·`q'´^y+±\€.®[ˆ1¬Y3ªX—5§WŸ7¥W¨9£V³:¡VÀ;ŸVÒ–ZÌ?”Zå?’[õ>‘[ÿ>\ÿ=\ÿ<\ÿ<\ÿ<\ÿ<\ÿ<ÿUÿ_ ÿiÿqõwæ{Ù}Î}*Å{9¾wE·tP±pY­mb"¨ji'¥hq,¡fx/žd€3›b‡6˜a8–`˜;“_¡=‘^«?^¸@^ÈA‹^áAŠ_ó@‰_ÿ?‰`ÿ>ˆ`ÿ>ˆ`ÿ=ˆ`ÿ=ˆ`ÿ=ˆ`ÿ=ÿWÿb ÿl øt éz Þ~ ÒÈ'À6¸|B ²xM¬uV§r_"¢of'žln,›ju0—h|3”g„6‘eŒ9Žd•<Œcž>‰b¨@‡bµB…bÅB„bÞCƒcñB‚cýA‚dÿ@‚dÿ?‚dÿ?‚dÿ?‚dÿ?‚dÿ?ÿYÿd ÿn êwÛ}Ô‚ ̄Å$»ƒ4³€@ ­|K¦yT¡v\!œsd&˜qk+”or/‘my3Žk6‹j‰9ˆh’<…g›?‚f¦A€f²C~fÁD}fÙD|gïC|güA|hÿ@|hÿ@|hÿ?|hÿ?|hÿ?|hÿ?ÿ[ ÿg ÷qÞzԀ΅ LJ¾ˆ"¶‡1¯„> ¨I¢}RœzZ —wa&“uh+so/‹qw3ˆo~6…n†:‚m=k™?|k£Byj°Cxj¿DvjÔEvkíCvkûBvkÿAvlÿ@vlÿ@vlÿ@vlÿ@vlÿ@ÿ] ÿiìtÚ|ЃɈʺ‹ ²Š/«ˆ< ¤…GP˜~X“|_%Žyf*Šwm.†ut2‚t|6r„9|q=yp–@vo¡Btn®Drn½EpnÑEpoëDpoúCqoÿAqoÿ@qpÿ@qpÿ@qpÿ@qpÿ@ÿ_ÿkávԈŋ¾ µ®Ž-¦Œ: Ÿ‰E™†N“ƒVŽ€]$‰~d)…|k-zr2}xy5zw‚9wv‹f~›Ac~¨Ca}¶D`}ÉD_}åC`}öB`}ÿAa}ÿ@a}ÿ@a}ÿ@a}ÿ@a}ÿ@ÿgãtÒLj¾¶•®˜¦šŸš&˜™3‘—? ‹•H…“P‘X z_%ve*r‹l.nŠs2jˆ{6f‡„9c†Ž<`…™?]„¦A[„´BZ„ÇCZ„ãBZƒôA[ƒÿ@[ƒÿ@[ƒÿ?[ƒÿ?[ƒÿ?[ƒÿ?ÿjÞx̓Œ¹“°˜§ Ÿ™Ÿ#“ž1Œ< …›F™Nz—Vu–]#p”c(l’j,h‘q0ey4aŽ‚7^Œ:ZŒ—=XŒ¤?V‹²@T‹Å@T‹á@TŠó?UŠþ?U‰ÿ>U‰ÿ>U‰ÿ>U‰ÿ>U‰ÿ>ïoÖ|ȇ½‘´˜ªœ ¢™¤“¥ Œ¤.…£9 ¢Cy LtŸSoZ jœa%fšh)c™o-_˜w0[—€4X–Š7U••9R•¢;P”°=O”Ã=O”ß³ú,=²ÿ-=±ÿ-=±ÿ-=±ÿ-=±ÿ-lj¹•¬¡¤–«Š²¸s¿jÄ gÅcÅ(_Å5[Å?WÅH TÄP PÄXMÄ_JÃfHÃnEÃxBÂ@ÃŽ>Ü<ë ;ü!:ÃÕ!;Âî!9Àù"8¿ÿ$8¿ÿ$8¿ÿ$8¿ÿ$8¿ÿ$½‘°›¤¢˜ªŒ±€¹u¿jÆ^ÌYÏWÐ!UÐ.QÐ9NÐCKÐLIÐSFÐ[ CÐc AÐk>Ðu<Ñ€:ÑŒ8Ñš6Ñ©5Ñ»4ÒÒ5Ðì4Ï÷3Îÿ3Îÿ3Îÿ3Îÿ3Îÿ³™¦¡š©Ž±¹uÀjÇ^ÍTÔLÝ JÝHÞ&FÞ2Dß<BßE?ßM=àU;à]9àf7ào 5áz 3ᆠ1á” 0â£.â³.ãÇ-ãã-àò,ßû,ßý,ßý,ßý,ßý¨ œ§°ƒ¸vÁjÉ^ÏSÕIÜEéBé@ê$=ê.:ë68ì>6ìF3íM1íU/î]-îe+îp)ï{(ï‰&ð—%ð§$ñ¸#ñÌ"òå"ðó"ïõ"ïõ"ïõ"ïõž¦‘¯„¸wÁjÉ]ÐQ×FÝ?ê<ö9ö6÷ 3÷(1ø0.ù6+ù=)úD'úJ%ûR#ûZ ücüný{þ‰þ˜ÿ¨ÿ·ÿÈÿàÿäÿäÿäÿä“®…·xÀjÉ]ÒPÙDß:ä5÷2ÿ .ÿ+ÿ(ÿ!&ÿ'#ÿ- ÿ3ÿ9ÿ?ÿEÿMÿUÿ_ÿjÿxÿ‡ÿ– ÿ¤ ÿ° ÿ¾ ÿ ÿ ÿ ÿ‡¶y¿kÉ^ÓPÛCà8å/ð+ÿ'ÿ$ÿ!ÿÿÿÿ#ÿ(ÿ-ÿ2ÿ8ÿ? ÿF ÿOÿYÿeÿrÿÿÿ›ÿ§ÿ©ÿ©ÿ©ÿ©ÿ,/ÿ0,ÿ2,ÿ30ÿ16ÿ0Aÿ/Mÿ-Zÿ+fÿ)sÿ(~ ÿ'ˆ ÿ'‘ ÿ'™ ÿ&Ÿ ÿ&¥ÿ&«ÿ&±ÿ&¸ÿ&Àÿ&Éÿ&×ÿ&æÿ&ðþ&ùû'ÿù'ÿù&ÿø&ÿø&ÿø&ÿø&ÿø&ÿÿ.,ÿ3)ÿ5*ÿ6-ÿ64ÿ5?ÿ3Kÿ2Wÿ0dÿ.p ÿ,{ ÿ,… ÿ+Ž ÿ+–ÿ*ÿ*£ÿ*©ÿ*¯ÿ)¶ÿ)½ÿ)Çÿ)Óþ)ãû*ïø*øö+ÿô*ÿô*ÿó*ÿó)ÿó)ÿó)ÿó)ÿÿ1)ÿ6&ÿ9&ÿ:)ÿ;2ÿ;=ÿ9Hÿ7Tÿ5`ÿ3l ÿ2w ÿ0‚ ÿ0‹ÿ/“ÿ/šÿ. ÿ.¦ÿ.¬ÿ.³þ.ºý.Äû.Ïø.áõ.íñ/÷ï/ÿî.ÿí.ÿì.ÿì.ÿì.ÿì.ÿì.ÿÿ4&ÿ9#ÿ=#ÿ>&ÿA/ÿA9ÿ?Eÿ=Pÿ;\ÿ9h ÿ7s ÿ6~ÿ5‡ý4ü4–ú3ù3£ø3©÷3°ö3·ô3Àó3Ìð3Þí3ëé4öç3ÿæ3ÿä2ÿä3ÿã2ÿã2ÿã2ÿã2ÿÿ8#ÿ= ÿAÿE#ÿG,ÿG6ÿF@ÿDLÿAXÿ?d û>où–å>œã=£â=ªà=²ß=»Ý=ÆÛ=ØÖ=éÒ=õÎ=þÌ<ÿ Ë<ÿ!É<ÿ!É<ÿ!É<ÿ!É<ÿ!É<ÿ!ÿ?ÿEÿKÿPÿS$ÿT-ÿS7÷QBñNMìLZ èJeåHoâGyßE‚ÝDŠÚC‘ØB™ÕBŸÓA¦ÑA®ÏA·ÎAÁÌAÐÉBåÅBó!ÂAþ#ÀAÿ$¾Aÿ$½Aÿ%½Aÿ%½Aÿ%½Aÿ%½Aÿ%ÿBÿIÿPÿVÿY ÿZ(÷Z2ïX=èUIãSU ÞQ`ÙNjÔLtÐK|ÎI„ÌHŒÊG“ÈGšÆF¡!ÄF©"ÂE±#ÁE¼#¿EÉ$½Fß%¹Fï&¶Fû'´Fÿ(³Fÿ(²Fÿ(±Fÿ(±Fÿ(±Fÿ(±Fÿ(ÿFÿMÿUÿ[ÿ^ù`#ï`,æ^6ß\DØYP ÑW[ÌTeÈRnÅPwÃOÀN†¾MŽ!¼L•#ºKœ$¸J¤&¶J¬'´J¶(³IÃ)±IÖ)®Jê*«Jø+©Jÿ+¨Kÿ+§Kÿ+§Kÿ+§Kÿ+§Kÿ+§Kÿ+ÿIÿPÿYÿ_ÿcòeçe%Þd1Ôb?Í`K Ç]VÂZ`¾Xi»Vq¸Ty¶S"³Rˆ$±P&¯P—(­OŸ)«N¨+©N²,§N¾-¦NÎ.£Næ.¡Oõ.ŸOÿ.žOÿ.Oÿ.Pÿ.Pÿ.Pÿ.Pÿ.ÿLÿT ÿ]ÿcùgëißjÓj,Ëh;ÅeG ¿bRº`\¶]e²[m¯Yu!¬X|#ªVƒ&§U‹(¥T“*£S›,¡S£.ŸR­/R¹0›RÉ1™Râ1—Sò1–Sÿ1•Tÿ1”Tÿ0”Tÿ0”Tÿ0”Tÿ0”Tÿ0ÿOÿX ÿ` ûf ðk ämÖnÌo(Äm7½kD ·hO²eX®baª`i§^p!¤]x%¡['ŸZ‡*œYŽ,šX—.˜W 0•Vª2“Vµ3‘VÅ4VÝ4ŽWð4Wý3ŒXÿ3ŒXÿ2ŒXÿ1ŒXÿ1ŒXÿ1ŒXÿ1ÿQ ÿ[ ÿcëjÝnØq ÏrÆs%¾r4·pA±mL¬jU§g^£ee cm"œat%š`{(—^ƒ+”]‹-’\“0[œ2Z¦4‹Z²5‰ZÁ6‡ZÖ6†[í6…[û5…\ÿ4„\ÿ3„\ÿ3„\ÿ3„\ÿ3„\ÿ3ÿS ÿ]õfßmÕrÐu ÉvÀw"¸v1±t>«qI¦nR¡l[ib™gj"–fq%“dx(c+a‡.Š`0ˆ_™3…_£5ƒ^¯6^¾8€^Ñ8_ê7~_ú6~`ÿ5~`ÿ4~`ÿ4~`ÿ4~`ÿ4~`ÿ4ÿUÿ`èiÚpÐuÊxÃz»{³z/¬x<¦uF ¡sPœpX—n`“kg!jn%hu(Šg|+‡f„.„d1c–4c¡6|b­7zb»9ybÎ9xcè8xcø7xdÿ6xdÿ5xdÿ5xdÿ5xdÿ5xdÿ5ÿWÿbálÔsËxÅ{¾} ¶~¯~,¨|9¡yD œwN—tV’r]Žpd Šnk$‡lr(„kz+j‚.~iŠ1{h”4xgŸ6vfª8tf¹9sfË:rfæ9rg÷8rgÿ7rhÿ6rhÿ5rhÿ5rhÿ5rhÿ5ÿYöeÝnÏvÇ{À¹€ ±‚ª‚*£€7}B —{K’xTv[‰tb …ri$qp'~ow+{n.xmˆ1vl’4skœ6pj¨8nj·:mjÉ:ljä:mkõ8mkÿ7mkÿ6mkÿ6mkÿ6mkÿ6mkÿ6ÿ[ëgÙqÌyÃ~»‚´„ ­…¦…(Ÿ„5™‚@ “I}R‰{Y„y`€wg#|un'ytu*vs}.sr†1pq4mp›6ko§8ioµ:hoÇ:goâ:goô8hoÿ7hoÿ6hoÿ6hoÿ6hoÿ6hoÿ6ÿ^äjÓtÈ|¿·…¯‡¨‰¡‰%›ˆ3”†> Ž„G‰P„W~^{|e"xzl&tys*qx{-nw„0kvŽ3hu™6ft¥8ds³9bsÄ:bsà:bsó8csÿ7csÿ6csÿ6csÿ6csÿ6csÿ6ÿaàmÏwÄ»…³‰ª‹£Œœ#–Œ0‹<ЉE„‡N…U{ƒ\w‚c!s€j%oq)l}y,i|‚/f{‹2cz—5`y£7^y±8]yÂ9\yÝ9]yñ8]xþ7^xÿ6^xÿ5^xÿ5^xÿ5^xÿ5õdÜpÊzÀƒ¶‰®¤‘—’ ‘‘.Š9„ŽC Lz‹Su‰Zqˆa n†h#j…o'g„w+cƒ.`‚‰1]”3[€¡6Y¯7WÀ8WÚ7Wð7X~ý6X~ÿ5X~ÿ5X~ÿ5X~ÿ5X~ÿ5éhÔtÆ~»‡²¨‘ž”––‘—‹—+…–7”A y“It’QpXl_hŽf!eŒm%a‹t(^Š},[‰‡/Xˆ’1U‡Ÿ3S‡­5R‡¾5Q‡Ö5Q†î5R…û4R…ÿ4R…ÿ3R…ÿ3R…ÿ3R…ÿ3ãlÎyÁƒ¶‹¬‘¢•—™› Š„'~œ4y›>sšG o™Oj˜Vf—]c•c_”j"\“r%Y’{(U‘…+R‘.P0N«1L¼2LÓ2Lí2LŽú2Lÿ1LŒÿ1LŒÿ1LŒÿ1LŒÿ1ÜqÈ~»ˆ±‘¦–œšŸ‡¢£|¤#w¤0r£;m¢D h¡Ld T`ŸZ]žaYhVp!Sœy$P›ƒ'MšŽ)Jš›,Hš©-G™º-FšÐ-F˜ë-F—ù.F–ÿ.F–ÿ.F–ÿ.F–ÿ.F–ÿ.ÑwÁ„¶Žª• ›•ŸŠ¤}©w«s«o¬,j«7e«AaªI ]©QZ©XW¨_S§fP§nM¦vJ¥!H¥Œ$E¥™&C¤¨'B¤¸(A¤Î'A£ê'@¢ø(@¡ÿ)@ ÿ)@ ÿ)@ ÿ)@ ÿ)É~º‹¯”£š˜ ¥‚ªu°l³ i´e´'a´3^´=Z´FV³N S³U P³\M²cJ²kG±tE±~B°Š@°—>°¦ <°· <°Ì <¯è ;®÷!:­ÿ":¬ÿ#:¬ÿ#:¬ÿ#:¬ÿ#À†³’§™œŸ¦„¬y±m·a¼]½Z¾ X¾-T¾8Q¾BN¾JL¾RI¾Y F¾` D¾hA½q?½|<½ˆ:½•8½¤7½µ6½Ê7¼ç5»ö5ºÿ4¹ÿ4¹ÿ4¹ÿ4¹ÿ¸ª˜ŸŸ“¦‡¬{³o¹c¾XÄPÈ MÈLÉ%JÊ1GÊ;EÊDCÊLAÊT>Ê\<Êd:Ën 8Ëx 6Ë… 4Ë’ 2Ë¢1˲0ÌÇ0Ëå/Éõ.Èý.Çÿ.Çÿ.Çÿ.Çÿ®—¡ž•¥‰­|´p»dÁYÆNËEÐ>Õ=Õ<Ö&;×19Ø;8ÙE6ÙM5ÙV3Ú^1Úh0Ûs.Û,Û*Ü)Ü­(ÝÁ(ÝÞ'Ûï&Ùù&Øþ &Øþ &Øþ &Øþ ¤˜¥‹­~´q¼eÃYÉMÍCÓ:Ù5ä 3ä1ä 0å*.æ3-æ<+çD*çL(èT'è]%ég#és"ê ê‘ë¡ë²ìÇìáêñéùéùéùéù𤬵r½eÅYËLÐAÕ8Ü/á-ñ +ñ(ò&ò$$ó+"ô2!ô9õAõIöQ÷Z÷eørùù’ú¢ú³ûÆûÝûéûéûéûé«´s½fÆYÍKÓ@Ù5Þ,ã&ñ$þ !ÿÿÿÿ"ÿ(ÿ.ÿ5ÿ<ÿCÿL ÿV ÿb ÿoÿÿÿ ÿ®ÿ¼ÿÇÿÇÿÇÿǃ´u½gÆZÏKÕ?Ü3á)å!ìýÿÿ ÿÿÿÿ ÿ# ÿ(ÿ.ÿ5ÿ=ÿFÿQÿ]ÿkÿ{ÿ‹ÿ™ÿ¥ÿ¬ÿ¬ÿ¬ÿ¬ÿ',ÿ**ÿ+*ÿ*.ÿ&4ÿ%?ÿ#Kÿ!Xÿ dÿpÿ{ÿ…ÿŽÿ–ÿœÿ¢ÿ¨ÿ®ÿ´ÿ»ÿÃÿÎÿßÿëüõùþ÷ÿ÷ÿöÿ öÿ öÿ öÿ öÿ ÿ)*ÿ,'ÿ.'ÿ-*ÿ,2ÿ+=ÿ)Iÿ'Uÿ%aÿ#mÿ"xÿ"‚ÿ!‹ÿ!“ÿ!šÿ! ÿ!¥ÿ!«ÿ!±ÿ!¸ÿ!Áÿ!Ëü!Üù!éö!ôó"ýò"ÿ ñ"ÿ ñ!ÿ ð!ÿ ð!ÿ ð!ÿ ð!ÿ ÿ,&ÿ0$ÿ1#ÿ1&ÿ2/ÿ1:ÿ/Fÿ-Rÿ+^ÿ)iÿ(uÿ'ÿ'ˆÿ&ÿ&–ÿ&þ&£ ý&© ü&¯ û&¶ ú&¾ ø&È ö&Ù ò&è ï'ó í'ý ë&ÿ ê&ÿ é&ÿ è&ÿè&ÿè&ÿè&ÿÿ/#ÿ3 ÿ5ÿ7#ÿ8,ÿ87ÿ6Bÿ4Nÿ2Zÿ0eÿ.pþ-{ü-„ú,Œ ø,“ ÷,™ ö+  ô+¦ ó+¬ ò+³ ñ+» ï+Æ î,Ô ê,æ æ,ò ä,ü â,ÿá,ÿà,ÿß,ÿß,ÿß,ÿß,ÿÿ3ÿ7ÿ:ÿ= ÿ?(ÿ?2ÿ=>ÿ;Iÿ9Uû7a÷5lõ4vò3 ð2‡ ï2 í2– ì1œ ê1¢ é1© è1° æ1¹ å1à ã2Ñ ß2å Ü2ñØ1üÕ1ÿÒ1ÿÑ1ÿÐ1ÿÐ1ÿÐ1ÿÐ1ÿÿ7ÿ;ÿ?ÿCÿF$ÿF.ÿD9üBDö?Pñ=\íìFJçDVãCbßAl Ü@u Ù?~ Õ>†Ó=Ñ=”Ï<›Í<¢Ì<©Ê;±È;»Ç;ÈÅ<ÜÁ<í¾<ù»<ÿº<ÿ¹<ÿ¸<ÿ¸<ÿ¸<ÿ¸<ÿÿ>ÿDÿJÿOÿQûR#ñQ-éO8âMEÜKQÖI\ÑGf ÎFpËExÈD€ÆC‡ÄBŽÃB•ÁAœ¿A¤½@¬¼@¶º@¸@ÒµAè²Aö°Aÿ®Aÿ­Aÿ¬Aÿ¬Aÿ¬Aÿ¬AÿÿBÿG ÿOÿSÿVóWèV%àU1×S?ÏRLÊPW ÆNa ÃLjÀJr½Iz»H‚¹G‰·GµF—³FŸ±E§°E±®E¼¬E̪Eã §Fó!¥Fÿ!£Fÿ"¢Fÿ!¢Fÿ!¢Fÿ!¢Fÿ!¢Fÿ!ÿEÿK ÿS ÿW ùZë[ßZÔZ+ÌZ;ÆXHÁVS ¼T\ ¹ReµPm³Ou°N|®M„¬L‹ªK’¨Jš¦J£!¤I¬"£I¸#¡IÆ$ŸJÞ$Jð$›Jý%™Kÿ$™Kÿ$˜Kÿ$˜Kÿ$˜Kÿ$˜Kÿ$ÿH ÿOÿVõ[ é^ ä^ Õ_Ë`'Ä_6¾^C¸[N ´YX°Wa¬UiªTp§Sx¥R¢Q† PŽ žO–"œNŸ#šN¨%˜N³&—NÂ'•NÖ'“Nì'‘Oû'Oÿ'Pÿ&Pÿ&Pÿ&Pÿ&Pÿ&ÿJ ÿSøZâ_ÚbÔc ÍcÄe#¼e2¶c@±aK ¬^T¨\]¥[e¡YlŸXsœVzšU‚ ˜TŠ"•T’$“S›&‘R¥'R°)R¾*ŒRÐ*ŠSé*‰Sù)ˆTÿ)‡Tÿ(‡Tÿ(‡Tÿ(‡Tÿ(‡Tÿ(ÿLÿVé]ÜcÑgÌhÆh½j ¶i/°h<ªeG ¥cQ ¡aZ_aš^i—\p•[w’Z~!Y†#XŽ%‹W—'‰W¡)†V­+…Vº,ƒVÌ,‚Wæ,W÷+€Xÿ*€Xÿ*€Xÿ)€Xÿ)€Xÿ)€Xÿ)ÿOýYâ`ÕgÌjÆlÀl·m°n,ªl9¥jD hN ›fW—d^”be‘`lŽ_s‹^{!‰]‚$†\‹&„[”([ž*Zª,}Z·-|ZÉ.zZã.z[õ-z\ÿ,y\ÿ+z\ÿ*z\ÿ*z\ÿ*z\ÿ*ÿQò[ÞdÏjÇnÀpºp ²q«q)¥p7ŸnBšlK –jT’h\Žfc‹eiˆcp…bx!‚a$€`ˆ&}_‘){_œ+x^§-v^µ.u^Æ/t^á/t_ó.t_ÿ,t`ÿ+t`ÿ+t`ÿ+t`ÿ+t`ÿ+ÿSè^ÙgËmÃq»sµs ­u§u'¡t4›r?•pI ‘nRŒlY‰j`…ig‚hnfu!}e}$zd…&wd)ucš+rb¥-pb³/obÄ/nbÞ/ncò.ncþ-ncÿ,ncÿ+ncÿ+ncÿ+ncÿ+ÿUå`ÓiÈp¿t·w°w¨x¢y$œx2–v=‘tG ŒrOˆpW„o^€md}lkzks wjz#tiƒ&rh)og—,mg£.kf±/ifÁ0ifÛ0igð/igý-igÿ,jgÿ+jgÿ+jgÿ+jgÿ+þXácÏlÄs»x³z«z¤{ž|"˜|/’z;ŒxE ‡wMƒuUs\{rbxpiuop rnx#om&ml‹)jl–+hk¡.fk¯/dj¿0ckØ0ckï/dkü-dkÿ-ekÿ,ekÿ,ekÿ,ekÿ,ô[ÝfËoÀv·{¯~¦~Ÿ™€“€-9ˆ}C ƒ{K ~zSzxZvwasugptnmsv"jr&hq‰(ep”+bp -`o­/_o½/^oÔ/^oí/_oû-_oÿ,`oÿ,`oÿ,`oÿ,`oÿ,ë^ØiÇr¼y³«‚¡‚™ƒ”„Ž„+ˆƒ6ƒ‚@~€I yQu}Xr|_n{ekzlhyt"ex}%bw‡'`v’*]už,[u«.Zt»/YuÑ/Ytì.Ytú-Ztÿ,Ztÿ+Ztÿ+Ztÿ+Ztÿ+æaÑmÃv¹}¯ƒ¦†œ†”ˆ މ‰‰(ƒ‰4~‡>y†G t…Op„Vm‚]icf€jcr `~z#]}„&Z|)X{œ+V{©,T{¹-S{Î-Tzê-Tzù,Tyÿ+Uyÿ*Uyÿ*Uyÿ*Uyÿ*áeÌq¿z´‚«‡¡Š•‹ ‡Ž‚$}1xŽ;sD oŒL kŠTg‰Zdˆaa‡h^†p[…x!X„‚$U„&Rƒš)P‚§*O‚·+N‚Ì+N‚è+Nø*O€ÿ*O€ÿ)O€ÿ)O€ÿ)O€ÿ)ÛjÇuº°‡¦Œœ‘†“€”{•!w•-r•8m”Bi“J e’Qb‘X^_[fXŽmUŽvR€!OŒ‹#M‹˜%K‹¥'I‹µ(H‹Ê(HŠç'I‰÷(Iˆÿ'I‡ÿ'I‡ÿ'I‡ÿ'I‡ÿ'ÑoÁ{µ„«Œ •”‰—~šw›sœo)kœ5fœ?b›G_šO \šVX™\U˜cS˜kP—sM–}J•‰G••!E•¤#D”³#C”È#C”å#C’õ$C‘ÿ$Cÿ$Cÿ$Cÿ$Cÿ$Êu»°‹¤‘š•™ƒt¢n£ j¤f¥%c¥1_¤;[¤DX¤KU£S R£Z O¢aM¢hJ¡qG {D †BŸ“@Ÿ¢>Ÿ²=ŸÆ=Ÿã=ô=œÿ<›ÿ<›ÿ <›ÿ <›ÿ Â|µˆ©ž–“›‡Ÿ{¤o¨c¬_­\­Z®+W®6T®@Q­HN­OK­W I­^ F¬f D¬nA¬x?«„<«‘:« 9«°8«Ã8ªá7©ó7§þ6¦ÿ6¦ÿ6¦ÿ6¦ÿº„®¢–—›‹¡¦s«g¯Z´S¶ Q·O·$M¸0J¸:H¸CF¸KD¸RA¸Z?¸b=¸k :¸u 8· 6·Ž4·3·­2·Á1·Þ1¶ò0´ü0³ÿ0³ÿ0³ÿ0³ÿ²Ž¥•š›Ž¢‚¨u­i³^·S»GÀCÂBÂ@Ã'?Ã2>Ä<<ÄD:ÄM8ÄU6Ä]5Äf3Åp1Å|/ÅŠ-Åš+Ū*ž*ÅÚ*Äð)Âû (Áÿ (Áÿ (Áÿ (Áÿ ¨•›‘¢„©x¯kµ_»T¿IÃ?È6Í 3Î2Ï1Ï'0Ð1/Ð:.ÑC-ÑL+ÒU*Ò_(Ói'Óv%Ó„$Ô”"Ô¦!Õ¹!ÕÒ Óë ÒöÑÿÑÿÑÿÑÿŸ›”¢‡©y±m¸`¾TÃIÇ>Ë5Ð-Õ%Û $Þ#Þ"ß%!à. à7á@áJâSã^ãjäxäˆå𿬿ÀçÝåïãúãúãúãú–¢‰©{±n¹aÀTÆHÊ=Ï3Ó*Ù"Þë ìííî&î-ï5ð=ðFñPò[òi óx ôŠ õœ õ® ö öÙõíõíõíõí‹©}²oºbÂUÉGÎ;Ò1Ø'Ýáèøú ûüü ý# ý) þ0ÿ8ÿAÿLÿXÿfÿwÿ‰ÿ›ÿ«ÿ»ÿÎÿÏÿÏÿϲqºcÃVËHÑ:Ö/Ý%áåé÷ÿ ÿ ÿ ÿÿÿÿÿ#ÿ*ÿ2ÿ<ÿGÿTÿcÿsÿ…ÿ—ÿ¤ÿ²ÿ²ÿ²ÿ²ÿ")ÿ#'ÿ#(ÿ +ÿ1ÿ=ÿIÿVÿbÿnÿxÿ‚ÿ‹ÿ’ÿ™ÿžÿ¤ÿ©ÿ¯ÿ¶ÿ½ÿÇÿÔýåúñ÷úõÿôÿôÿôÿôÿôÿôÿÿ$'ÿ&$ÿ&$ÿ$'ÿ"/ÿ :ÿFÿSÿ_ÿjÿuÿÿˆÿÿ–ÿœÿ¡ÿ§ÿ­ÿ³þ»ýÅúÑ÷äôïñúïÿîÿîÿíÿíÿíÿíÿÿ'#ÿ) ÿ) ÿ(#ÿ)-ÿ'7ÿ%Cÿ#Oÿ![ÿfÿqÿ{ÿ„ÿŒþ“ü™ûŸú¤ùª÷±ö¹õÂóÎðáìîéùèÿæÿåÿåÿåÿåÿåÿÿ+ÿ-ÿ-ÿ. ÿ/)ÿ/4ÿ,?ÿ*Kÿ(Wÿ&bý%mú$wø#€ö#ˆõ#ó#•ò#›ñ#¡ï#¨î#®í#¶ë#¿ê#Ìç#àã$íà$ùÞ$ÿÜ$ÿÛ$ÿ Ú$ÿ Ú$ÿ Ú$ÿ Ú$ÿ ÿ.ÿ1ÿ2ÿ5ÿ6%ÿ6/ÿ4:ÿ1Fû/R÷-]ó,hð+rî*{ì*„ê*‹è*’ç)˜æ)žä)¥ã)¬á)´à*½Þ*ÊÛ*ÞÖ*íÒ*ø Ï+ÿ Í*ÿ Ì*ÿ Ë*ÿ Ë*ÿ Ë*ÿ Ë*ÿ ÿ2ÿ5ÿ8ÿ;ÿ= ÿ<*þ;5÷9Añ6Mì4Xè3cå2mã2và1Þ1‡Ü0ŽÚ0•Ø0›Ö/¢Ô/©Ò/±Ð/º Ï0Æ Í0Ø É1ê Æ1÷ Ã1ÿÁ1ÿÀ1ÿ¿1ÿ¿1ÿ¿1ÿ¿1ÿÿ6ÿ9ÿ>ÿAÿCÿB#õA.í>:ç=Fát Ã={ Á=ƒ ¿<Š ½<»<—º;Ÿ¸;§¶;°µ;»³;ɱ;à®<ñ«<ý©<ÿ¨<ÿ¨<ÿ§<ÿ§<ÿ§<ÿÿ= ÿBÿH ÿK úLìLáJÖJ,ÎK;ÉJHÄHSÀG]¼Ff ºDn ·Cv µC}³B„±A‹°A’®@š¬@¢ª@«©@¶§@Ħ@Ù£Aí AûŸAÿžAÿAÿBÿBÿBÿÿ@ ÿFÿLñOæP ãO ÕOÌQ'ÅQ6¿PCºON¶MX³La °Ji ­Ip«Hx©G§G†¥F£F•¡EžŸE§žE²œE¿šEјEé–Fø•Fÿ”Fÿ“Fÿ“Gÿ“Gÿ“GÿÿBÿJòPáTÙVÓU ÌUÃV"¼W2·V?²TJ­STªQ] §Pd¤Nl¢MsŸLzL›K‰™J‘—J™•I£“I®’I»IÌŽJåJö‹Kÿ‹KÿŠKÿŠKÿŠKÿŠKÿÿEÿMåTÙYÏ[Ê[ÄZ»[µ\.¯[;ªZF¦XP¢VY ŸU`œSh™Ro—Qv•P}“P„OŽN–ŒNŸŠNªˆN· ‡NÈ!…Nâ!„Oó ƒOÿ ƒOÿ‚Pÿ‚Pÿ‚Pÿ‚PÿÿGóQßXÑ]É`Ã`½^ µ`®a*©`7¤^CŸ]M›[U ˜Y]•Xd’WkVrUy‹TˆS‰†S’„Rœ‚R§!€R´"RÄ#}RÞ#|Sñ"|Sþ!{Tÿ!{Tÿ {Tÿ {Tÿ {Tÿ ÿJéTÚ\ÌaÃd¼d¶c ¯d©e'£d4žc@™aJ•_R ‘^ZŽ]a‹[h‰Zo†Yv„X}X†W}V™ {V¤"yV±#wVÁ$vVÚ$uWï$uWý#uXÿ"uXÿ!uXÿ!uXÿ!uXÿ!ÿMåWÓ_Èd¿g·h±g©h£i$žh2™g=”eGdO ŒbW ˆa^…_eƒ^l€]s}]z{\ƒy[Œv[—!tZ¢#rZ¯$qZ¿%pZÕ%o[í%o[ü#o[ÿ"o[ÿ"o[ÿ!o[ÿ!o[ÿ!úOáZÏbÄg»k³l¬j¤kžl!™l/”k:iDŠhM †fU ƒe\€db}bizbpxaxu`€s_Šp_”!n^ #l^­%k^¼&j^Ñ&i^ì%j_û$j_ÿ#j_ÿ"j_ÿ"j_ÿ"j_ÿ"ðRÝ]ËeÀk·n¯o§n ošp”p,o8ŠmB†lK ‚jR ~iY{h`wffufnreupd~mcˆkc’"ibž$gb«%ebº&dbÏ&dbê&ebú$ecÿ#ecÿ"ecÿ"ecÿ"ecÿ"ëUØ`Èh¼n³q«s¢q›r•st*Šs6…r@pH}oP ymWvl^skdpjlmiski|hh†fg!dgœ#bf©%`f¹&_fÍ&_fè&`fù$`fÿ#`fÿ#afÿ"afÿ"afÿ"èXÓcÄk¹q°u§wžu–v w‹x'†w3v=|uFxsN urUqq\npckojinqfnzcmƒalŽ!_kš#]k§%[k·&ZkÊ&Zkç%[k÷$[jÿ#\jÿ"\jÿ"\jÿ"\jÿ"ã[ÎfÀn¶t¬y£{˜yz Š{…|$|1|{;wzDsyL pxS lwZivaguhdtoasx^r\qŒ Zq˜"Xp¦$Vpµ%UpÈ%Upå%Upö$Voÿ#Voÿ"Woÿ"Woÿ"Woÿ"ß_Êi¼r²x©}Ÿ’~Š„€€!{.w€9r€BnJk~Q h}Xd|_b{f_zm\yuYxWxŠTw–!Rv¤"Qv³#PvÆ$Pvã#Puõ#Quÿ"Qtÿ!Qtÿ!Qtÿ!Qtÿ!ØcÅm¸v®}¥‚šƒƒ„„}…y†u‡+q‡6m†?i…Ge„O bƒV _ƒ\\‚cZkW€sT}QˆO~”M~¢ K}±!J}Ä"J}á!K|ô!K{ÿ K{ÿ K{ÿ K{ÿ K{ÿ ÐgÀr´{ª‚ †•ˆ‡ˆ|ŠvŒrnŽ'jŽ2f<cD`ŒL\‹S Z‹Z WŠaT‰hQˆqOˆzL‡…J†’H† F†¯E…ÂE…ßE„òEƒþE‚ÿE‚ÿE‚ÿE‚ÿÊmºx¯¥‡š‹Žt‘n“ i”f•"c•.`•8\•AY”IV”PT“W Q“^ N’fL’nI‘xFƒDBž@­?À?Ü?ñ?Œý?‹ÿ?‹ÿ?‹ÿ?‹ÿÂsµ~ª‡ŸŒ”ˆ“{•l™e›`œ][ž)Xž4Už=REPMMTKœ[ Hœc Fœk C›uA›€>š<š›:š«9š½9šÙ9˜ï9—ü8–ÿ8•ÿ8•ÿ8•ÿ»z¯…¤Œ˜‘•šuh [¤V¥ S¦Q§#O§/L§8J§AH§IF§PC§XA§_?¦h=¦r :¦} 8¦Š 6¥™4¥©3¥»3¥Ô3¤î2¢û2¡ÿ2¡ÿ2¡ÿ2¡ÿ´‚¨Œ’’—†œy¡m¥a©U¬K¯G°E°D±'B±2A²;?²C=²K;²S9²[7²d5²n3²y1²‡/±–.²¦-²¸ ,²Ð,°ì +¯ù +®ÿ *­ÿ *­ÿ *­ÿ ­‹ ’•˜‰}£q¨d­Y±M´B¸;º 8»7¼5¼)4½23½;2½D1¾L/¾U.¾^,¾h*¾t)¾‚'¿‘&¿¢$¿´#¿Ë#¾è#¼÷"»ÿ"»ÿ"»ÿ"»ÿ¤’˜˜Œž€¥s«g°[µO¹D¼:À0Ä*Ç (È'É&É'%É0$Ê9#ÊB"ËK!ËU Ì_ÌlÍzÍŠÍœήÎÅÍäÌôÊüÊÿÊÿÊÿ›™Ÿ‚¦u­h³\¹P½DÁ9Ä0È(Ì ÐÕ ×ØÙ"Ù+Ú4Ú=ÛHÜSÝ_ÝmÞ~ß‘ठภàÒ ßí Þ÷ Ýû Ýû Ýû’Ÿ…§w®jµ]¼PÁDÅ8É.Í%ÑÕÚÞç ç è è! é) ê1 ê;ëEëQë^ënë€ê”ê§ë¼ëÒëéìïìïìy¯k·^¾QÅCÉ7Í-Ñ#ÖÛßã î ö öööõõ%õ.õ7öBöNö]önöö•÷§÷·øÇøÐøÐøÐ{¯m¸`ÀRÈDÍ7Ñ+×!Üàä çïúÿÿÿ þþÿÿ!ÿ)ÿ3ÿ>ÿKÿ[ÿlÿ€ÿ’ÿ¡ÿ­ÿ³ÿ³ÿ³ÿ&ÿ$ÿ%ÿ'ÿ.ÿ:ÿGÿ Sÿ _ÿ kÿ uÿ ÿ ‡ÿ Žÿ •ÿ ›ÿ  ÿ ¥ÿ «ÿ ±ÿ ¸ÿ Áþ Ìü Þù ëõ öó ÿò ÿñ ÿñ ÿñ ÿñ ÿñ ÿÿ#ÿ!ÿ!ÿ$ÿ,ÿ7ÿDÿPÿ\ÿgÿrÿ{ÿ„ÿ‹ÿ’ÿ˜ÿÿ£þ¨ü®ûµú¾øÉõÛòêîõìÿëÿêÿêÿéÿéÿéÿÿ"ÿ"ÿ!ÿ ÿ)ÿ4ÿ@ÿLÿXÿcÿnÿwþ€üˆúŽù•øšö õ¦ô¬ó³ñ¼ðÇíØéèæõäÿâÿáÿáÿàÿàÿàÿÿ%ÿ&ÿ$ÿ%ÿ&%ÿ$0ÿ!;ÿHÿTý_ùi÷sô|ò„ñ‹ï‘î—ìë£éªè±çºåÅãÕßèÜõØÿÕÿÔÿÓÿÒÿÒÿÒÿÿ)ÿ*ÿ)ÿ,ÿ,!ÿ,+ÿ)7ý'C÷%Oó#Zï"dì!né!wç!å!†ä!â ”á šß  Þ §Ü!¯Ú!¸Ø!ÃÕ!ÓÑ"çÍ"ôÊ#ÿÈ#ÿÇ#ÿÆ#ÿÆ#ÿÆ#ÿÆ#ÿÿ,ÿ.ÿ0ÿ3ÿ3ÿ2%ú00ò.<ì,Iç*Uã*_à)iÝ)rÚ(z×(‚Õ(‰Ó(Ñ(–Ï(œÎ(£Ì(«Ê(³É(¾Ç(ÌÅ)âÁ*ñ¾*þ¼*ÿº*ÿº*ÿ¹*ÿ ¹*ÿ ¹*ÿ ÿ0ÿ2 ÿ6 ÿ8ÿ9ù7ï5(ç35à2BÛ2OÕ1ZÐ1dÍ0mË0uÉ0|Ç/ƒÅ/ŠÄ/‘Â/—Á/ž¿/¦½/¯¼/¹º/Ǹ0ݵ0î ²0û °0ÿ ®0ÿ ®0ÿ ­0ÿ ­0ÿ ­0ÿ ÿ3 ÿ6ÿ< ÿ> ý=ï<ä9Û9-Ò:<Í:IÈ9TÄ9^Á8g¿7o½7v»6}¹6„·6‹¶5’´5š ³5¡ ±5ª ¯5´ ®5Á ¬5Ô ©6ê ¦6ø ¥6ÿ£7ÿ¢7ÿ¢7ÿ¢7ÿ¢7ÿÿ7ÿ;ÿ@òBéB å?Ø>Î@'ÇA6ÂAD½AO¹@Y¶?a´>i±=q¯=x®< ¬<† ª; ©;• §; ¥;¦ £:°¢;¼ ;Íž;æ›<õš<ÿ™<ÿ˜<ÿ˜<ÿ˜<ÿ˜<ÿÿ:ÿ@ïEáHÙHÓF ÌEÄG"½H1¸H?³GJ°FT¬E]ªDd§Cl¥Bs £Bz ¡A  Aˆ ž@œ@˜š@¡˜@¬—@¸•@È“@á‘AóAÿAÿŽBÿŽBÿŽBÿŽBÿÿ<ùDäJØNÎOÉMÃK»MµN-¯N:«MF§LO¤KX¡J`žIg œHn šGu ˜F|–Fƒ”E‹’E”EŽE¨ŒE´‹EÄŠE܈Fð†Fý†Fÿ…Gÿ…Gÿ…Gÿ…Gÿÿ?ìHÝOÏSÆUÀS»Q ³R­S)¨S6£RBŸQKœPT™O\–Nc ”Mj ‘LqKxK‹J‡‰J‡Iš…I¥ƒI±‚IÀJÖJí~Kü~Kÿ}Kÿ}Kÿ}Kÿ}KÿÿCæLÖSÉXÀYºX´V ¬W¦X%¡X2W>˜VH•UQ’TXR_ ŒRf ŠQmˆPt…O{ƒO„NN—}N¡{M®zN½xNÑwNëwOúvOÿvOÿvOÿvOÿvOÿøFâPÐWÄ\»^´]®Z¦[ \"›\/—[;’ZEYM‹XUˆW\ †Vc ƒUjTq~Tx|S€zR‰xR”vRŸtR«rRºqRÍpRèpSùpSÿpSÿpSÿpSÿpSÿïIÝSËZÀ_·b¯a¨^¡_›`–`,‘`8^B‰]K…\R‚[Y €Z` }Yg{XnxXuvW}tW‡rV‘oVœnV©lV¸kVËjVæjW÷jWÿjWÿkWÿkWÿkWÿëLØVÈ^¼b³e«e£bœb–c‘d)Œc5ˆb?„aH€`P}_W z^] w]d u\ks\rp[{n[„lZjZšhZ§fZ¶eZÈeZäeZöeZÿeZÿeZÿeZÿeZÿèOÓYÄa¹f°h§iže—f ‘gŒh'‡g2ƒf=eF{dMxcT ub[ raa paim`pk_yi_‚g^e^˜c^¥a^´`^Ç`^ã`^õ`^ÿ`^ÿa^ÿa^ÿa^ÿäRÏ\Àd¶i¬l£l™i’j Œj‡k$‚k0~j:ziCvhKsgRpgY mf` kefhdnfdvdc€bc‹`b—^b¤\b²[bÅ[bá[bô[bÿ\bÿ\bÿ\bÿ\bÿàUË_½g²l©pŸo”lŒm†n‚o!}o-yo8unArmInlPkkW ik^ fjedilait_h~]g‰[g•Yf¢Wf°VfÃVfßVfóWfÿWfÿWfÿWfÿWfÿÛYÇbºj¯p¦sšsp‡qr|sxs*ts5ps?mrGjqNgqU dp\ boc_oj]nrZm|Xm†Vl“Tl Rk¯QkÁQkÜQkñRkþRjÿRjÿRjÿRjÿÔ\Ãf¶n¬t¢w–v‰uvzwvxry'oy2kx<hxDewLbwS_vZ ]ua ZuhXtpUsySs„QrOržMq­Lq¿KqÙLqðLpýMpÿMoÿMoÿMoÿÎ`¾j²r¨x{z„zz{t| o~l~$i/f9bB_~I]}PZ}W W|^ U|e R{nPzwNz‚KyŽIyœHx«Fx½FxÕFwïGvüGvÿGuÿGuÿGuÿÉeºo®w¤}˜‹~slƒ h„e… b†,_†6\†?Y…FW…NT…UR„\ Oƒc Mƒk K‚tH‚FŒDšB€©A€º@€ÒAíA~ûA}ÿA}ÿA}ÿA}ÿÂjµuª}Ÿ‚’ƒ…„y…j‰dŠ`Œ][Ž'XŽ2UŽ;SŽCPŽJNRLYIŒ`GŒh E‹r B‹}@Љ>Š˜<Ч;Џ:ŠÏ;ˆë;‡ú;†ÿ;†ÿ;†ÿ;†ÿ¼q¯{¥ƒ™‡Œˆ‰sŒe\“W• T–R–"P—-M—6K—?I—GG—NE–UC–]A–e>•o<•z :•‡ 8•• 6”¥ 5”¶4”Ì 4“é 4’ø4ÿ4ÿ4ÿ4ÿµxª‚žˆ“†Žym“a—U›MžIŸGŸF &D 0C¡:A¡B?¡I=¡Q;¡Y9¡a7 k5 v3 ƒ1 ’0 ¢. ³. É.Ÿç-÷ -œÿ -›ÿ -›ÿ -›ÿ ¯€£‰—Ž“•r˜fœ[ O¤E§>© <ª:ª9ª)8«27«;5«C4¬K2¬S1¬\/¬f-¬q+¬*¬Ž(¬ž'¬°&¬Å&«ä%©õ%¨ÿ%§ÿ%§ÿ%§ÿ§‰›‘”„™xžk¢_¦SªH­=°4³/µ-µ,µ +¶)*¶2)·:(·C'·L&¸U$¸_#¸k"¸x ¸ˆ¸™¹«¹À¸ß¶òµü´ÿ´ÿ´ÿŸ”•ˆ›{¡n¦b«V°J³?¶5¹,¼$¿ ÂÂÃ&Ã/Ä8ÄAÄJÅUÅaÆoÆÆ‘ǤǹÇÔÆîÄúÃÿÃÿÃÿ—–‹œ~¢q©d¯X´K¸@»5¾+Á#ÅÉÌÐ Ñ Ñ Ñ! Ñ* Ñ4 Ò> ÒI ÓU ÓbÓrÔ„Ô˜Ô«ÕÀÕÜÕíÕöÕöÕöŽ€¤s«f±Y¸L½?À4Ã*Ç!ÊÎÒ Ö ÛÜ ÜÝÞ Þ(ß1à<áGâTãcãtäˆä›å®åÁåÕæçæçæçƒ¤u¬h³Z»MÁ@Ä3È(ÌÐÔÙ Ýáäåæ çèéê%ë.í9ïEðSñdñvòŠóœó­ô»ôÈôÈôÈw­jµ\½OÄ@É3Í'ÑÖÜàãæêîîïð ñóôö ø*ú5ýCþRÿcÿvÿ‰ÿšÿ¦ÿ°ÿ°ÿ°ÿ#ÿ!ÿ!ÿ $ÿ +ÿ7ÿDÿQÿ]ÿhÿrÿ{ÿƒÿŠÿ‘ÿ–ÿœÿ¡ý¦û¬ù³÷»õÅóÑòäññïúîÿîÿíÿíÿíÿíÿÿ ÿÿÿÿ)ÿ 4ÿ AÿMÿYÿdÿnÿwÿ€ÿ‡ÿý“û™ùž÷¤õªó°ñ¸ïÂíÏëãêïèûçÿæÿæÿæÿæÿæÿÿÿÿÿÿ%ÿ0ÿ=ÿIÿ Uÿ `ÿ jý sû |ù ƒ÷ Šõ ô –ó ›ñ ¡ï §í ®ë ¶è Àæ Íä ââ ðß ûÞ ÿÜ ÿÜ ÿÛ ÿÛ ÿÛ ÿÿÿÿÿÿ"ÿ,ÿ8ÿDþPù[õfóoðwîì†êŒé’è˜æžå¥ã¬á´à¾ÞÌÚáÕðÒûÏÿÎÿÍÿÍÿÌÿÌÿÿ"ÿ"ÿ!ÿ"ÿ"ÿ 'ÿ2ø>òKîVê`çjärâzà‚ÞˆÜە֢ٛԩұлÎÉÌÞÈîÅûÃÿÁÿÀÿÀÿÀÿÀÿÿ&ÿ% ÿ( ÿ)ÿ(þ& ô$+ì!8æ DáPÝ[ÙeÕmÒuÐ}΃̊ËɗȞƥŠ­à ·Á ÄÀ!Ö¼"ê¹"ø¶"ÿµ#ÿ´#ÿ³#ÿ³#ÿ³#ÿÿ) ÿ*ÿ.ÿ/ ÿ-ó+è("à&/Ù&=Ò'JÍ'UÊ(_Ç(hÅ(oÃ'wÁ'~¿'„¾'‹¼'’»'™¹' ·'©¶(³´(¿³(ϰ)æ­)ö«*ÿ©*ÿ¨*ÿ¨*ÿ¨*ÿ¨*ÿÿ-ÿ0ÿ3ö4ï2 è.Ü,Ñ.(Ë/7Æ0DÁ0O¾0Y»0b¸0j¶/qµ/x³/±/†°/®.”­.œ«.¤©/®¨/º¦/ʤ0â¡0óŸ0ÿž1ÿ1ÿœ1ÿœ1ÿœ1ÿÿ0ÿ5ï8â:Û9Ö5 Î4Æ6"¿81º8?¶8J³8T°7]­7d«6l©6s¨6y¦5€¤5‡£5¡5—Ÿ5 ž5ªœ5¶›5Å ™5Ý –6ï ”6ý “7ÿ ’7ÿ ’7ÿ ’7ÿ ’7ÿ ÿ3ö:ä?ØBÎBÉ>Ä;»>µ?,±?:­?E©?O¦>X£=_¡=gŸ^qF\pMYpTWp[UobSoj Pns Nn~LmŠJm˜Il§Hl¸GlÍGlêHkúHkÿHjÿHjÿHjÿÇ^¸g¬n¡r“r‡qzqqrktfucv`w(^w3[x<YwCVwKTwRRvYPv`NuhKuq It| GtˆEs–Cs¥Bs¶AsËBrèBrøBqÿCpÿCpÿCpÿÁc³l¨s›vŽuvuvixcz^|\}Y~$W/U8S@PHN~OL~VJ~]H}eF}nC|y A|† ?{” >{£<{³<{È…v;…ƒ9…‘ 8„  6„± 6„Æ 6ƒä 6‚ö 6ÿ 6€ÿ 6€ÿ 6€ÿ ¶oªxŸ~ƒw€k‚^‡UŠNŒJŽHG%E/D8B@@G?O=V;_9h7s5€3Ž1ž0ޝ/ŽÃ/Žá/Œô/‹ÿ/Šÿ/Šÿ /Šÿ °v¥˜„Š„}…p‡eŠZŽO’F•A˜ >˜=™;™(:š19š:7šB6šJ5šR3šZ1šd/šo-š{,šŠ*šš)š¬(šÀ'™Þ'—ò'–ý'•ÿ'•ÿ'•ÿ©~ž…’‰„ŠvŒj^“T—I›@Ÿ7¢2£1£0¤!.¤*-¤2,¥:+¥C*¥K)¥T(¥^&¥i%¥v#¥…"¥– ¦¨¥»¥×¤ï¢û¡ÿ¡ÿ¡ÿ¢†—Œ‹}‘o”c˜WM¡C¥8¨0«(®$¯#¯!¯! °)°1°:±B±L±V±a²o²~²²¢²¶²Î±ë¯ù®ÿ®ÿ®ÿš’„—ušhŸ[£P¨E¬;°1²'µ ¸º¼¼¼½&½.½7¾A¾L¾W ¾e ¿t ¿† ¾™¾¬¾Â¾ß¾ð½ú½ü½ü“”‡™zŸl¥`ªS¯G³<¶1¸'»¾ÁÄ ÈÉÉÉÉ$Ê,Ê6Ê@ËLËYËhËy̌˟˳ËÈÌâÌïÌñÌñŠš|¡o§b­U³H¸;»0¾&ÁÄÈË ÎÒÓ ÓÔÕÖ"×*Ù4Ú?ÜKÜZÝjÝ}ݑݤ޶ÞÈÞÞÞâÞâ¢q©d°V·I¼<À/Ä$ÇËÏ ÒÖÛÞßà áâãåæ'è1ê=ìKìZílî€î”î¥î´îÂîÆîÆtªf²X¹KÀ=Å/É$ÍÑÖ ÛÞáåèéêëí ïðòô#÷.ù;ûJü[ýmý€þ“þ¢þ­þ¯þ¯ÿÿÿ ÿ ÿ(ÿ5ÿAÿNÿZÿeÿnÿwÿþ†üŒû’ù—øœ÷¢ö§õ­óµò½ñÉïÜîëí÷ìÿëÿêÿêÿêÿêÿÿÿÿ ÿÿ%ÿ1ÿ>ÿJÿVÿaÿkýsú{÷ƒõ‰ôò”ñ™ðŸî¤í«ì²êºèÆçÖåèäõãþâÿáÿáÿáÿáÿÿÿÿÿ ÿ "ÿ-ÿ9ÿFÿQþ\úföoòwï~í…ë‹ê‘è–çœæ¡ä¨ã¯á¸ßÃÝÑÛæÙó×ýÕÿÔÿÔÿÔÿÔÿÿÿÿÿÿÿ(ÿ 4ÿ AùLõWñaíjéræzäâ‡àߒݘ۞٥׭ԵÒÀÐÏÎåÌ ôÊ ÿÈ ÿÇ ÿÇ ÿÆ ÿÆ ÿÿÿ ÿ ÿÿÿ"û.ó:íFè Rå \á eÞ mÛ uØ |Õ ‚Ó ‰Ñ Ð •Î œÍ£Ë«É´ÈÀÆÏÃæÀõ½ÿ¼ÿ»ÿºÿºÿºÿÿ ÿÿÿ ÿøî&æ3à?ÚKÔVÐ_ÎhËoÉwÇ}ƄĊÑÁ˜ÀŸ¾§¼°»¼¹Ë·â³ò±ÿ¯ÿ®ÿ®ÿ­ÿ­ÿÿ"ÿ"ÿ%ü$÷! ìáØ*Ð8ËEÇPÃZÀb¾j¼qºx¹~·…¶Œ´“³š± £° ¬® ·¬!Æ«!ݧ"ï¥"ý£#ÿ¢#ÿ¢#ÿ¡#ÿ¡#ÿÿ%ÿ(ò*å+ß(Ü! Ò!É$$Ã%2¾&?º'J·'T´']²'d°'l®'r­'y«'ª'†¨'ާ'–¥'ž£(¨¢(³ (ÁŸ(Õœ)ìš*ú˜*ÿ—*ÿ—*ÿ–*ÿ–*ÿÿ(õ.å3Ú5Ð3Ì-Æ*¾-¸.,³/:¯/E¬0O©/X§/_¥/f£/m¡/s .zž..‰›.‘™.š˜.¤–/¯•/½“/Ï‘0è0ø1ÿ1ÿŒ1ÿŒ1ÿŒ1ÿÿ-ê5Ü:Î=Æ<À7»3 ³4®6'©74¥7@¢7JŸ7S6Z›6a™6h—5o•5u”5|’5„55–5 ‹5«Š5¹ˆ5ʇ6å…6ö„7ÿƒ7ÿƒ7ÿ‚7ÿ‚7ÿô2ã;ÒAÆD½C·?±; ª;¥<" =0=;™=E–=N”kÿ >kÿ º`­i n‘m„mxmlnap[rVt RuPvNw'Lw1Kx9IxAHxIFxPDwWBw_@wh>ws³<¬8§3¢24™5*•55’5@5I5P‹5W‰5^‡5d…4k„4r‚4y€4‚~4‹}4–{5¡y5®x5¾w6Ôv6ít7üt7ÿt7ÿt7ÿt7ÿç5Ò=ÃB¸D¬B¤>Ÿ9š8”::&;1Š;;‡;D„;L‚;S€:Z~:`}:g{:ny:uw:~v:ˆt:“r:žq:«o;»n;Ïm;êm<úl<ÿl<ÿl<ÿl<ÿâ9ÌB¾G±H¥FC—?’> ?‰?!…@-‚@7@@}@H{@Oy@Vw?]u?cs?jq?rp?zn?„l?k?œi?©h?¸g@Ìf@èf@ùe@ÿe@ÿe@ÿe@ÿÜ>ÇF¹K¬L J—G‘C‹C†C‚D~D){E4yE=vEEtDLrDSpDYnD`lCgkCoiCwgCfCdC™bC§aD¶`DÊ`Dæ_Eø_Eÿ`Eÿ`Dÿ`DÿÖAÃI¶N§O›M’KŒG…G€G|HxH&uI0sI:pIBnIIlHPjHVhH]fHdeHlcHuaG`GŠ^H—]H¥[H´[HÇ ZHäZIöZIÿZHÿZHÿZHÿÑE¿L²R£Q—PN†J€JzKvLrL#oL-mM6jL?hLFfLMdLSbLZaLa_Li^Lr\L|ZLˆYL•WL£VL²ULÆ ULâ ULõULÿULÿVLÿVLÿÌH¼P¯U T“S‰QMzNuO pOmP jP*gP3eP<cPCaPJ_PQ]PX\P_ZPgYPpWPzUP†TP“RP¡QP± PPÄ PPá PPôQPÿQOÿQOÿQOÿÉK¹S«WœVU…T|PuQpR kShTeT'bT1`T9^TA\THZTOYTVWT]VTeTTnRTxQT„OT‘NT LT¯LT KTß LTóLSÿLSÿMSÿMSÿÅN¶V§Z˜Y‹XWwTpUjVfWbW`X$]X.[Y7YY?WYFVYMTYTSY[QYcOXlNXvLX‚JXIXžHX®GXÀGXÝGXòGWÿHWÿHWÿHWÿÁQ²Y£\”[‡[}ZrXkYeZ`[]\Z\!X]+V]4T^<S^DQ^KP^RN^YL^aK]jI]tG]€E]D]œC]¬B]¾B]ÚB\ñB\þC[ÿC[ÿC[ÿ½U¯]Ÿ_^ƒ^x]m\e]__Z` WaUbRb(Qc1Oc9NcALcHKcOIcVGc^EcgDcqBc}@b‹?bš>bª=b¼`ÿ>`ÿ>`ÿ¹Y«aša‹aataia_bYdTf QgNgLh$Ki-Ii6Hi>FjEEjLCjTBj\@ie>io¬=¡:š7•31 Œ1‡2 „3+353>}3F{3My3Tw3Zv3at3gr4oq4wo4n4Œl4˜j5¥i5³h5Æg6âf6õf6ÿf6ÿf6ÿf6ÿØ7Ä>µB¦A›?“<8ˆ6„7€7|8'z81w9:u9Bs9Iq9Pp9Wn9]l9dk9ki9th9~f9‰d9•c:¢b:±a:Ã`;à_;ó_;ÿ_;ÿ_;ÿ_;ÿÑ;ÀB°E¡D•C@‡=‚;};y<u=#s=-p=6n=?l=Fk=Mi=Sg=Zf=ad=hc=qa>{_>†^>“\> [?¯Z?ÁZ?ÝY?òY?ÿY?ÿY?ÿY?ÿÌ?¼F«HœG‘FˆD‚@|?w@ s@oA lA*jA3hA;fBCdBJcAPaAW`B^^Be]Bn[BxZB„XBWBžVC­UC¿TCÚTCñTCþTCÿTCÿTCÿÈB¸I§K˜JIƒG}CvCqD mDjEgE'dE0bE8`E?_EG]EM[ETZF[YFcWFlVFvTFSFŽRGœPG«PG½OGÖOGïOGýOGÿOGÿPGÿÄEµM£M•L‰KJxFqGlGhHdHaI$_I-]I5[I=YIDWIJVIQUJYTJaRJiQJtOJNJŒMJ›LKªKK¼JKÓJKîKKýKJÿKJÿKJÿÁH²P O‘O…N{MsIlJgKbL_L\M!ZM*XM2VM:TMASNHRNOPNWON_NNgLNrKN}IN‹HN™GO¨FOºFOÑFOíFNüFNÿGNÿGNÿ½L®RœQQQwPnLgNbO]P ZPWQUQ'SQ0QR8PR?NRFMRMLSUJS]ISeHSoFS{ES‰CS—BS§AS¸ASÏASìARûBRÿBRÿBQÿºOªT˜T‰T}SsSiQbR\SXT TURUOV$NV-LW5KW<JWDHWKGXRFXZDXcCXmAXy@X†>X•=X¥c>=cEg”4™*ž!¢¦© ¬¯²³³ ³´´µ"¶+·5·@¸N¸]¸n¸‚¸—¸ª·¾·Ò·æ·êvˆg‹ZN–Bœ7¢,§"«¯³ ¶¹¼¾¾¿À ÁÂÃÄ Å)Ç4ÈBÉQÉbÉuɊɟʱÊÁÉÑÉÙn“`˜SžF¤:«/°$µ¸¼ ¿ÁÄÈÊÊÌÍÎÐ ÑÓÖÚ(Ý4ÞCßTßgà|à‘à¤à²à¾àÃfŸY¦L­?´2¸$¼¿ÃÇÊÍÑÕØÙÛÝßáã åçêí'ð5ñFòXókó€ô”ô£ô®ô²ÿÿÿÿÿÿ,ÿ9ÿEÿPÿZþcûkùr÷xõ~ô„ò‰ñŽð“î™íŸì¦ê®è¸æÅåÛãíâûâÿáÿáÿáÿáÿÿÿÿ ÿÿÿ(ÿ4þAûL÷Vô_ñfïmìtêzéç…æŠåã•á›à¢ÞªÛ´ÙÀÖÐÓèÒ÷ÑÿÑÿÐÿÐÿÐÿÿ ÿ ÿ ÿÿû"÷/ô;ðGíQéZåbâiàoÞuÜzڀ؅ՋӑїϞͦ˯ɺÇÉÅâÄòÃþÂÿÁÿÂÿÂÿÿÿÿÿ ùñë)ç6ãAßKÛTÕ\ÒcÏjÍpËuÉ{ȀƆŌÓÁš¿¢½«»¶¹Ä·Ú¶í´ú´ÿ´ÿ´ÿ´ÿÿÿÿÿì åÞ"×/Ñ;ÍEÊNÆWÄ^Ád¿j½p¼uº{¹·‡µŽ³•²ž°§®²¬¿ªÑ¨è¨÷§ÿ§ÿ¦ÿ¦ÿÿÿñèáÕÍÇ'Ã3¿>¼H¹Q¶X´_²e°j¯p­v¬|ª‚©‰§‘¥š£¤¡® »žÍæœô›ÿšÿšÿ™ÿÿ ñäÙÎ È Â¼·,³7°B­JªR¨Y¦_¥e£k¢q wŸ~…› Žš —˜ ¡– ¬• º“ Ì’ å öÿŽÿŽÿÿöæÖǾ¹· ± ¬ $¨0¥;¢DŸLS›Zš`˜f—l•r“y’Š”Ÿ‹ªŠ¸ˆˆæ…÷ƒÿƒÿ‚ÿ‚ÿíÜ!Ê%»"±«©¥ œ*™5–>”G’NUŽ[Œa‹g‰mˆt†|…†ƒ›€§~µ}Ç|âzõyÿxÿxÿxÿå"Ð)¿,°*§' #š•‘$Ž/Œ9‰A‡I…PƒV‚\€bi} p| xz y!Œw!—u"¤t"²s#Ãr#ßp$óo$ÿo$ÿn$ÿn$ÿÝ)È0·2¨0ž.—*“'# Œ#ˆ$„%*‚%4€&=}&D|&Kz&Rx&Xw&^u&et'lr'tq'}o(ˆn(”l(¡k)¯j)Ài*Ûg*ñg+ÿf+ÿf*ÿf*ÿÔ/Â6¯6¡5–40Š-‡*ƒ)*|+%y+/w,8u,@s,Gq,Mp,Tn,Zm,ak-hj-ph-zg.…e.‘d.žb/¬a/½a0Õ`0ï_0ý_0ÿ_0ÿ_0ÿÍ4¼;©:›:8‰5ƒ20{/w0t0!q1+o14m1<k1Cj1Jh2Pg2We2]d2eb2ma3w_3‚^3Ž]4œ[4ªZ5»Z5ÒY5íY5üX5ÿX5ÿY5ÿÈ8·>¤>–=‹<ƒ:}7x4t4 p5m5j5'h60f68d6?c6Fa6M`6S^7Z]7b\7jZ8tY8W8ŒV9™U9¨T9¹S:ÏS:ëS:ûS:ÿS9ÿS9ÿÄ<²A @’@†?~=x:s8n9j9g9d:$b:,`:4^:<];C[;JZ;PX;WW;_V·N>ÍN>éM>úN>ÿN=ÿN=ÿÀ?®CœCŽC‚Bz@s=m<h=d=a>^>!\>)Z>1X>9W>@U?FT?MS?UR@\P@eO@oNAzMA‡KA–JA¥IBµIBËIBèIBùIAÿIAÿIAÿ½CªE˜EŠEEvCo@h@cA_A \AYBWB&UB.SB6QB=OBCOCKNCRMDZLDcJDmIExHE…GE”EE£EF´DFÉDFçDEøDEÿEEÿEEÿºF¦H”H†H{GrFjBcC^DZE VETFQF#OF+NF3LG:KGAJGIIHPHHXGHaFIkDIvCIƒBI’AI¢@I³?JÇ?Jå?I÷@Iÿ@Hÿ@Hÿ¶I¢J‘JƒJwJnIeE^GYHUIQJOJLJ!JK)IK1GK8FL?ELFDLNCMVBM_AMh@Mt>M=MQS=R\U+=V24\F3]N1]W0]a/]l.]z,]‰+]š*]«*]¿)]Þ*\ò*[þ+[ÿ+Zÿ£UUUrUgV^VTWLYE[?]:_6` 4a2b1b#0b+/c2.c:-cB,cJ*dS)d](di'dv&d†%d—$d©#d½"dÚ#cñ#bý$aÿ$aÿœX‰XzYnYcYZZP\H^A`:c4f/h ,i*i)j(j&'j.&k5%k=$kF#kO"lY lelrl‚l”l¦kºkÔjîiühÿhÿ•\ƒ\u\i]_]V^LaCdk7n0q)u"x{}}}~"~*~1~:~DNZh x Š ~ ~° }Æ }ä |ô {ý zÿ†ewejeafVhLkBo9s1w*z#~„‡ ‰ ‰ ‰ ‰# ‰+ ‰3‰=‰H‰T‰a‰q‰ƒ‰–ˆ©‡¾‡Ú†ì†õ†ú~jqjgk[lPpFtíQîeïzïðŸð«ð³ÿÿÿÿÿÿ)ÿ5ÿAÿMþVû_øfömôtòyñð„î‰íë•ê›è¢æªå³ãÀáÒàêßùÝÿÝÿÝÿÞÿÞÿÿ ÿ ÿ ÿÿÿ$þ1û=øHôRðZíbëiéoçuåzãâ…àŠÞÜ–ÚØ¥Õ¯ÒºÐÊÎãÍôËÿËÿËÿËÿËÿÿÿÿÿ ü÷ò+ï7ëBçLäUà]ÝdÚjØpÕuÒzЀυ͋˒əǡŪõÁÿھî½ü¼ÿ¼ÿ¼ÿ¼ÿÿÿÿùñêä%ß1Û<×GÒPÎWË^ÉeÆjÅpÃuÁzÀ€¾†¼º”¹œ·¥µ°³½±Ï¯è®ø®ÿ­ÿ­ÿ­ÿÿÿýîã ÚÑÌ+È6Å@ÂJ¿R¼Yº_¸e¶j´o³u±z°®ˆ­«˜©¡§«¥¸£È¢â¡ó þ ÿ ÿ ÿÿöêàÓɽ$¹/¶:´C±L®S¬Yª_©d§j¦o¤u£{¡‚ Šž“œš§˜´–Õܔï“û“ÿ“ÿ’ÿùê Ü Ë Â¼ ¶±®(ª3§=¤E¢M SžYœ_›dšj˜p—v•~“†’™Ž¤Œ±‹À‰Öˆíˆú‡ÿ†ÿ†ÿïÞʼ³® « §¢ Ÿ,œ6™?— G• N“ T‘ Z _Ž e k‹ rŠ yˆ ‚‡ Œ… —ƒ ¢ °€ À Ø}ï|ý{ÿ{ÿ{ÿæÑ½¯¦¡ž ˜”%‘/9ŒAŠHˆO‡U…[„a‚g€nu}~|ˆz”x w®u¾tÕsîqýqÿqÿpÿÜÆ%³%¥#œ!–’‘ ‰†)ƒ3<€C~J|PzVy\wbvitqszq„onl«k»jÐiìhûhÿgÿgÿÑ&½*«**“(%ˆ"†ƒ|$z.w6v>tErKqQoXn^lek mi vh!f!e"šc"¨b#¸a#Í`$é`$ú_$ÿ_$ÿ_$ÿÊ,¶/¤/–/Œ-…*€(}$z" v#s# q$)o$2m$:k%Aj%Gh%Mf%Te%Zd&ab&ia&r_'}^'Š](—[)¥Z)µZ*ÊY*çX*øX*ÿX*ÿX*ÿÅ1¯3ž33†2/y-u*r( o(k)i)%g*-e*5c*=b*C`*J_+P^+W\+^[,fY,oX-zW-‡V.•T.£S/³S/ÇR/åR/÷R/ÿR/ÿR/ÿÁ6ª6™6‹65y3s1o/k.h-d.b.!`/*^/1\/9[/@Y/FX/MW0SV0[T1cS1lR2wQ2„O3’N3¡M3±M4ÅL4ãL4öL4ÿL4ÿL3ÿ»9¦9•9‡9|9t7n4i3e2a2 ^2\3Z3&X3.V35U4<S4CR4JQ4PP5XN5`M6jL6uK7‚J7I8ŸH8°G8ÃG8áG8õG8ÿG8ÿG8ÿ·;¢<‘<ƒ<x<p:j7d6`6\6 Y7V7T7#R7+P72O89M8@L8GK8NJ9UI9^H:hG:sF;€E;ŽD<žC<®B<ÂB=ßB<óB<ÿB<ÿB;ÿ³=ž>>>u>l=f:`9[:W:S;Q;N; L;(K;/I<6G<=G\C>fB?qA?~@??@œ>@­=@À=@Ý=@ò=@ÿ>?ÿ>?ÿ®@š@‰A|AqAh@a<[=V>R>N?L?I?G@%F@,D@3C@:BABAAI@AQ?BZ>Bc=CoE8=E?*VF)VO(WY'Wd&Wr%W$W’#W¤"W·"WÏ"Wì#Vú#Uÿ$Uÿ–M„NuNiN_OVOMPER?S9V3X/Z+[*[(\'\$&\+%\3$]:#]C"]L!]V ^a^n^~^^¡^´]Ì]é\ù[ÿ[ÿQ~QpQdR[RRSJTAW;Y5[.^(`$b "c!cd d'd.d6e>eGeQe]ejeze‹eže±eÈdçc÷bÿbÿ‰TxUkU`VWVOWFY=\6_0b)d#gjllmm!m)m0m9nBnLnXnenu n‡ nš m­ m là kó ký jÿ‚YrYfY\ZTZJ\A_9c1f*i$loru www w# w* w3 w< wGwRw_wow€w”v§v»uÕtëtötü{]m]b^Y^N`Ec¬M¬]¬p¬…¬›«¯«Ã«ÙªèduWyK~?„4Š)–›Ÿ £§ª®°°±²´µ ¶·¹»&¼3½A½R½d¾y¾½¤½·½Æ½×\P…D‹8’,™!Ÿ¤© ®²¶¹½¿¿ÀÁÃÄÆ ÇÉËÎ&Ð5ÑEÒWÒkÓ‚Ó—Ó©Ò¸ÒÄUŒI“=š0¢%¨®´ ¹½ÁÄÈËÍÍÏÐÒÔØÚÝ àãæ'ç8èJé]êrëˆë›ì¨ì²ÿ ÿ ÿ ÿÿÿ&ÿ2ÿ=ÿHûRøZöbóiñoðuîzìë„éŠèæ–äâ¥á¯ß»ÝËÛæÙ÷ØÿØÿ×ÿ×ÿÔÿÿÿÿÿ ÿþ!ú,÷8ôCðMíUê]çdäjâpàuÞzÝۅًՑәѠϪ͵ËÄÉÝÈñÇÿÆÿÆÿÆÿÇÿÿÿÿÿ øñì'é2æ=âGÝPÙXÕ_ÒeÐjÎpÌuÊzÉDžŌÔÁœ¿¥½°»½ºÐ¸ë·û¶ÿ¶ÿ¶ÿ¶ÿÿÿýóéáÛ!Õ-Ñ7ÎAÊJÇRÄYÂ_Àe¾j¼o»t¹z·€¶‡´Ž²—° ®ª­·«È©ã¨õ§ÿ§ÿ§ÿ¦ÿÿþñå× ÍÇÂ&¿1¼;ºD·L´S²Y±_¯d­i¬oªt©z§¦‰¤‘¢› ¥ž²Á›Úšï™ý˜ÿ˜ÿ˜ÿýðáÑÆ½ ·³ °+­5«>¨F¦M¤T£Y¡_ džin›uš{˜ƒ–Œ•–“¡‘­»ÏŒé‹øŒÿŒÿŒÿóâÌ¿·±«§¤$ .ž7œ@šG˜N–T•Y“^’diov‹~Šˆˆ’†…©ƒ¸Ê€å€õÿÿÿè о±¨ £  œ˜•'’19ŽAŒHŠN‰T‡Y†_„dƒkr€z~„}Ž{šy§xµvÈuãu ôt ÿs ÿs ÿÝı¥œ–” “ Ž‹ ˆ *… 3ƒ ; B€ I~ O} T{ Zz `x gw nu vt €r Œp ™o¦mµlÉkæj÷iÿiÿiÿй¨›’‹ˆ‡…~${-y6w=vDtJsPqVp\nbmjksi}h‰f–e£c³bÆbãaö`ÿ`ÿ`ÿÇ"°#Ÿ$’#‰"‚ ~|z wtq(o0n8l?kEiKhQfXe^cfbo`y_…]’\¡[°ZÃYàXôXÿXÿXÿ¿'©(™(‹(‚'{%v#s q nki#g,e3c:bA`G_M^T\[[bY kX vV!‚U!T"žS"®R#ÀQ#ÝQ$òQ$ÿQ$ÿQ#ÿ¹+£,“,†-|,t*o(k%i"f!c"a"_#']#/\#6Z#=Y$CW$JV$PU$WS%_R%hQ&sO&N'M(œL(¬K)¾K)ÚJ)ñJ)ÿK)ÿK)ÿ³.ž/Ž00w/o.j+e*c'_' \'Z'X($V(+U(2S(9R)@P)FO)MN)TM*\L*eJ+pI+|H,‹G-šF-ªE.¼E.ÖE.ïE.þE.ÿE-ÿ®1š2‰3|3r3k1e/`-],Y, V,T,R, P,(N-/M-6L-<J-CI-JH.QG.YF/cE0mC0zB1‰A1˜A2¨@2»?2Ó?2î@2ý@2ÿ@2ÿª3–5†5y6n5f5a2\0W0T0Q0N0L1J1%H1,G12F19D1@C2GB2OA3W@3`?4k>5x=5‡<6–;6§;6¹:6Ñ:6í;6ü;6ÿ;6ÿ¦6’7‚8u8k8c7]6W3S4O4K4 I4F5E5"C5)A5/@56?6=>6D=7L<7U;8^:8i99v89…7:•7:¥6:¸5:Ï6:ì6:û69ÿ79ÿ¢8Ž9~:r;h;_:Y9S6N7J8F8 D9A9?9>9&<9-;:4::;9;B8;J7;S6<\5“2>¤1>¶1>Í1>ê1>ú2=ÿ2=ÿž;‹<{<n=d=\=U<N:I;E<A=>=<=:>9>#7>*6?15?84?@3@H2@P1@Z0Ae/Ar.B-B‘-B¢,Bµ+BË,Bé,Bù-Aÿ-Aÿ™=‡>w?k?a@Y?R?I>D?@@K9L3N.P(S$T "U UVV$V,V3W;WDWNWYXfXuX‡XšW¬WÂWáVôUÿUÿ„ItJfK\KSKKLDM[6_.b&fjmps vx xyyyz&z/z9zDzPz_zpzƒz˜z¬yÂxßxïw÷j[_[V[L\B`9c0h(l ptw{ ~‚ƒ ƒ„…† †(‡1‡<‡I‡W‡h‡{‡†¥…º…Ó„ê„ôe`\`QaFdÌPÌdÍz͑ͤʹÍÀMƒAŠ5‘)™ ¦ ¬±¶º¾ÂÆÈÈÊËÍÎÐÒÕÙÝá!â1äCåVækæ‚ç–ç¥æ°ÿ ÿÿÿÿÿ!ÿ-ÿ8ýCùMõUò]ðcîiìoêtézçæ…ä‹ã‘á™ß¡ÜªÚ¶×ÆÕáÓôÒÿÑÿÑÿÏÿÊÿÿÿÿÿ ÿúö(ó3ð>ìHèPåXâ^ßdÝjÛoÙtÖzÔ҅ЌΓ̜ɥǰƾÄÔÂîÁþÀÿÀÿ¿ÿ¾ÿÿÿÿúñëæ#â.à8ÛBÕKÑRÎYË_ÉeÇjÆoÄtÂzÁ€¿†½Ž»–¹ ·ª¶·´Ê²æ±ø°ÿ¯ÿ¯ÿ°ÿÿÿ÷êá ×ÐÌ(É2Æ<ÂE¿M¼SºY¸_·dµi´n²t±z¯€­ˆ¬‘ªš¨¥¦±¤Á£Ü¡ò¡ÿ ÿ ÿ¡ÿÿ÷èÙËý¹"¶,´6²?¯G¬M«T©Y§^¦c¥h£n¢t zž‚œ‹›•™Ÿ˜¬–º”Ï“ë’û’ÿ’ÿ‘ÿ÷çÓÆ»³ ­ª§&¤0£8 @žGœNšS™X—]–c•h“n’t|…‹šŠ§ˆµ†Ç…ä„õ„ÿƒÿƒÿìÓÁ´¬¦ š —)•2“:‘AHMŒS‹X‰]ˆc‡i…oƒw‚€€Š~–}£{°zÂyÝxñwýxÿxÿÞ Ä ² ¦ ™• ‘Ž‹#‰,‡4…;ƒB‚H€NS}X|^{dyjxrv{t†s’qŸp­n¾mÖmílúlÿlÿη¦š‘‹‰ ‡ „~%|.z6x<wCuHtNsTqYp_nfmnkxjƒhg e ¬d ¼c Ôc ìb úb ÿb ÿí‡}|| x u r (p 0o 7m >l Dk Ji Oh Ug \e cckbu`_Ž]œ\«[½ZÖYðYýYÿYÿ¹¥”ˆ~xtqq oli"g*f2d9c?bE`K_Q]X\_ZhYrW}V‹T™S©RºQÒQíQýQÿQÿ² ž"Ž"#w"p!ligfca_&]-\4Z;YAXGVMUTS\RdQnOzNˆM—K¦J¸JÏIëIûIÿJÿ¬$˜%ˆ&{'q&j%f#b!`^ [YW"U)T0S7Q=PCOJMQLXKaIkH wG …F!”D"¤D"¶C"ÌC#éC#úC#ÿC"ÿ¦'“)ƒ*v*m*e)`'\%Y#W!U!R!P!N!%M",L"3J"9I"@H"FG#ME#UD$^C$iB%u@&ƒ?&’>'£>'´='Ê=(è=(ù='ÿ>'ÿ¢*Ž+-r-h-a,\+X(T&Q&N% L%J&H&"G&)E&/D&6C'<A'C@'K?(S>)\=)f<*r;*:+9+¡8,²7,È7,æ8,ø8,ÿ8,ÿ,Š.{/o0e0]/X.S+P*L*I* F*D*B*A*%?*,>+3=+9<+@;,H:,P9-Y8.d7.p6/5/40Ÿ30±20Ç20å30÷30ÿ4/ÿ™/‡1w2k2b2Z2T1O/K-G.D.A.?.=.;."9/)8//7/660>50F51N41W32b22n13}03/4ž.4°-4Å-4ã.4ö/3ÿ/3ÿ•1ƒ3t4h5^5W4Q4K2F1B2?2<2 938363 43&33-24414;05C05L/6U.6`-7l,7{+7‹*8œ)8®(8Ã(8â)8õ*7ÿ*7ÿ’45q6e7[7T7M6G6B5=6:677 472718/8$.8+-92,99+9A*:I*:S);^(;j';y&<‰%<›$<­#<Â#<à$<ô%;ÿ%;ÿ6|8m9b9X:Q9J9D9=99:5;2;/<-=,=*=!)=((>/'>6&>>%?G$?P#@["@h!@v @‡A™A«AÀAÞ@ó@þ ?ÿ‰9x:i;^<U<M<G<@<8=4>0@-A*B 'B&C$C#C%"C,!D3 D;DDENEYEeEtE…F—F©F¾EÜEñDýDÿ„<s=f>[?R?J?D?=@6A1C,D'F$G !H III"I)J0J8JAJKKUKbKqK‚K”K§K¼KÙJðJüIÿ?o@aAWBNBGBAB:C2E-G(I#KMO PPPP%P,Q4Q=QGQRQ_RmR~ Q‘ Q¤ Q¸ QÑ Pì PúOÿyCjD]DSEKEDE>F6H/J)L$OQSV WXXX X( X0 X9 XC XN XZXhXyXŒXŸX³WÊWæWóVüsFdGYHPHHHAI:J2M+P%R UXZ] ` ` ```#`+`4`=`I`U`c`s`†_š_®_Ä^â^ð^ølJ_KUKLLEL=N5P.S'V Y\_b eg ghhhi&i.i8iCiOi]imi€i”h©h¿gÜfîf÷fOZOQOJOAQ8T0W([!^beh knp p qqrs!s(s1s<tHsVsfsysŽs£r¹qÒqëpôaSVSOSEU;X2\*`"dhlo rvyzz {|}~"€*€5€A€O€_€q€†€²~Ê~å}ñ\XTXIZ?]5a,e#josw {‚„††ˆ ‰ Š‹ŒŽ",8FVh~•Ž«ÁÜŒëY]N_Cb8f.l$qw|…‰’“”–—˜ š›Ÿ# . < L ^ tŸŒŸ¢Ÿ·žËžàSdGh÷HóPðWí^ëdèiçoåtãyâà…ތܓٜ֦ӱÑÀÏÚÎñÌÿËÿËÿÆÿÁÿÿÿÿÿûöò$ï.í9èBãKàRÝYÙ_ÖdÓiÑnÏtÎyÌʆȎƖĠ«À¹¾Í¼ê»üºÿºÿºÿ¶ÿÿÿþôë äßÛ)Ø3Ó=ÎEÊMÇSÅYÃ_Ád¿i½n»sºy¸€¶ˆ´²š±¥¯²­Ä¬á«öªÿªÿªÿªÿÿýîâÕ ÍÇÄ#Á-¿7»?·GµN²S°Y¯^­c¬h«m©s¨z¦¤Š£”¡ŸŸ¬ž»œÒ›îšÿšÿ™ÿ™ÿþîÞËÁ¹ ´±®'«0ª9§A¤H¢M¡SŸXž]b›gšm˜s—{•„”Ž’™¦Ž´ÈŒæ‹ùŠÿŠÿ‹ÿðÛǺ°¨ ¤ !›*š3˜;–A”H’M‘RWŽ\Œa‹gŠnˆu‡~…ˆƒ”‚ €¯À~Ý}ò}ÿ}ÿ}ÿàÆµª¢›• ’$‹-Š4ˆ;†B…GƒM‚RW\~b}h{pzyxƒvuœtªrºqÑpìpûpÿpÿÍ·§›“ŽŠ†„'}.|6z<yBwGvLuRsWr]qcokntl~kŠi˜h¦g¶fËeçe÷eÿeÿÀ « ›† ~| ywu!s)q0o6n<lBkGjMiRhXf_egcpbz`‡_•^£\³\Ç[ä[ô[þ[ÿµ¡‘…|vsr q nli#g*f1d7c=bCaI_N^U]\[ cZ mX xW …V “T ¢S ³R ÇR äQ õQ ÿQ ÿ­™‰}tmjggf c a _ %] ,\ 3[ 9Z ?X EW KVQUYSaRkPvNƒM’L¢K²JÈIåI÷IÿIÿ¥’ƒvmfb_^^ [YW U'T.S4Q;PAOGNNLUK^IgHsF€EDŸC°BÅBãBöBÿBÿŸŒ }!q"h"a!\YWUTQON#L*K0J7I=GCFJERCZBdAp?}>=<®;Ã;á;õ;ÿ<ÿš!‡#x$l%c%\$W#S QOM KHG E&D-C3B9@@?G>O=X<b:m9{8 ‹7!›6!­5!Á5!ß5!ó6!ÿ6!ÿ–#ƒ&t'h(_(X'S&O$L"I G DB@ ? #> )< /;!6:!=9!D8"L7"U6#_4#k3$y2%‰1%š0%«0&¿/&Ü0&ò0&ÿ1%ÿ‘&(q*e*\*U*O)K(H%D$A$?$ =$;$9$7$&6$,5%34%:3&A2&J1'S0']/(i.)w-)‡,)˜+*ª**½**Ú+*ñ+*þ,)ÿ(|*m,b-Y-Q-L,G+C(?(<(9( 7(5(3(2(#0()/)0/*7.*?-+G,+Q+,[*,g)-u(-…'-—&.¨%.¼%.Ø&.ð&.ý'-ÿŠ+x-j._/V/N/H.C-?,;,7,4, 2,0-.--- +-'*.-*.5)/=(/E'0N&0Y%1e$1s#1ƒ"2•!2§!2» 2Ô!2ï"1ü"1ÿ†-u/g0\1S1K1E1@0;0603001-1 +1)2(2'2$%3+%32$3:#4C"4L!5W 5c5q66“6¥6¹6Ò6í6û5ÿ‚0q2c3Y4P4I4B3=37314.5+5(6 %7$7"7!8" 8(80879@9I:T:`:n:;‘;¤;·;Ð:ì:ú9ÿ}2m4`5U6M6F6@6:646.8*9&:#; <===>%>->4>=?G?Q?^?l@|@@¢@¶@Î?ë?ù>ÿy5i7\8R9J9C9=9791:+<'="?AB CCDD"D)D1D:ECENE[EiEy EŒ EŸ E² EÉ Eå Dö Dÿt9e:X;O;G<@<:<4<.>(@#BDFHJ JJKK% K- K6 K@ KJ KV KdKtK‡KšK®JÄJàJðIún<`=T>K>D>=>7?1@*B$EGILNQ Q Q QQ"Q)Q2R;RFRRR_RoRQ–Q©Q¿PÜPîP÷h@[APAHAAA;B4C-E&H KMPSU X XXYYY%Y-Y6YAYMZZZiY|YY¥XºXÕWìWöcDVEMEEE?E7G/I(L"ORUX Z ]_ ` `aab b'b1b;bGbUcdbvb‹b a¶aÏ`ê`õ]HRIJHCH:J2M*P#SWZ] `cfgh ijklm"m*m4m@mNm]mom„lšl°kÈkæjóXMNMHL>N5Q,T$X\`d gknprrs uvwxy#z-z9zGzVyhz|y”xªxÁwßwïTQLQBR8U/Y&^bgk oswz|~€ ƒ „†ˆ‰%Š0Š>‰M‰_‰sˆ‹ˆ¢‡¹‡Ñ†èRVGWr2x'€ˆ —£¨­²¶¹»¼¾ÀÂÄÆÈËÎÑ Ö×#Ø5ÙIÚ^Ûuیܟܫÿÿÿÿ ÿÿþ$ü/ù9ôCðKíRêYç_ädâiànÞsÜyÚ׆Ԏіϡ̬ʻÈÒÆîÆÿÅÿÅÿ¿ÿºÿÿÿÿþ÷òîë*é4ã=ÞEÙMÔSÑYÎ^ÌcÊhÉmÇsÅyÀÁˆ¿½›»¦¹´·È¶æµû´ÿ´ÿ³ÿ®ÿÿÿøíå Ý×Ò$Ï.Ë7Ç@ÃGÀN¾S¼Yº^¸c¶hµm³s±y¯­Š«”© ¨­¦¾¥Û¤ô¤ÿ£ÿ£ÿ¢ÿÿöæ×Ëľ»¹(·1´:°A­H«N©S§X¦\¤a£g¡l sžzƒ›Ž™™—¦–¶•Ì”ë“ý“ÿ“ÿ“ÿ÷äÐÁ·¯ «§¥"£+¢3Ÿ;œB›H™M—R–W•[“a’fmt}Œ‡Š“ˆ ‡¯…Â…â„÷„ÿ„ÿ„ÿåͼ¯¦žš–”’%‘-5<ŒBŠGˆL‡Q†V„[ƒ`g€n~w}{zšx©wºvÓvïvþuÿuÿл«Ÿ—‹ ˆ†„ ‚'/5}<|A{FyKxPwUv[tasiqqp{n‡m•k£j´jÉièiùiÿiÿÀ¬œˆƒ{ ywv"t)s0q6p<oAmFlKkPjVh\gdeldvc‚a`Ÿ_¯^Ã^á^ô]ÿ]ÿ´  „ | wtq omki#h*g1e6d<cAbF`L_R^X]_[hZrX~WŒV›U«T¾TÚSïTûTÿ© –‡zrli g f db`^%]+\1Z7Y<XBWGVNUTS\ReQoO{NŠM™L©K¼JÔJíJùJÿ¡Ž~sjd`^] ] ZXV U'S-R3Q8P>O DN JL QK YJ bH mG zF ˆD ˜C ©B ¼B ÕB îB ûB ÿš‡xlc]YVTTS Q O M "L (K .J 4I :GAFGEODWBaAl?y>ˆ=˜;©;¼:Ö:ð:ý;ÿ“sg^XSPNLL JHFE$D*B0A7@=?D=L<T;^9i8v7…6–4§4º3Ó3î4ü4ÿŽ|nc Z S NJHFECA?> =';-:39:8A7I5Q4[3f2s0ƒ/”.¥-¸-Ð-ì.û.ÿŠx j"_#V#O"J!F CA?= ;976#5)40361>0F/O.Y-d,q+*’)¤( ·' Î' ë( ú)ÿ† t#g$\%S%L%G$B#?!=:7 5310 /&.--3, ;+ C*!L)!V("b&"o%#$###¢"$µ"$Ì"$é#$ù$#ÿ‚#q%c&Y'P(I'C'?&;$8"5"2"0" .","*")"#(#*'#1&$8%%A$%J#&T"&`!'m '}'(¡(´(Ê(è(ø'ÿ~%n'`)V)M*F*A)<(7'4&0&-&+' ('''%'$'!#('"(.!)6 )>*H*R+^+k+{,,Ÿ,²,É,ç+÷+ÿz'j*]+S,J,C,>+9+4*0*+*)+&+#,", ,,-%-,-3.<.E/P/\/i0y0‹0ž0±0Ç0å0ö/ÿv*g,Z-P.H.A.;.6-1-,-'/$/!01 1222"2)31393C4M4Y4g5w5‰5œ5°5Æ4ä4õ4ÿr,c.W0M0E0>08030/0)1$2!356 77888&8.969@9K9W:d :t :† :™ 9¬ 9Á 9Þ 9ñ 8ün/_1S2J3B3;36312,3'4!689;= >>>># >* >3 >< ?G ?R?`?o??”?¨>¼>×>ì>÷i3[4P5G5?59545.5)7#8;<?AC D D DD D'D/D8EBENE[EjE|ED¤D¹DÑDêCõd6W7L8C8<87818+9%; =@BDG I J KKKK#K+K4K>LILWLfLwKŒK¡KµJÎJéJõ_:R;H;@;:;4;.<'>"ACFIK NPQ QRSSS&S/S9SESRSaSrS‡RœR±QÊQçQôY>N>E>>>8>0@)B#DGJMP SUWX YZZ[\!\*\4\?\M\[\l\[—[­ZÅZäYóTBJBBB^2c'jpx …‹‘–›Ÿ¢¤¥§©«­°²µ· »¾¾&¾8¾K½a¼z»”º©º¹7j+p x€ ˆ–œ¢§¬°³¶·¹»½¿ÂÅÈÊÎÒÕÕ,Ô@ÔWÓnÔ†Ô›Ó«ÿÿÿÿÿÿü ù*ö4ñ=íFéMæSäYá^ÞcÜhÙnÕsÓyЀΈˑɜƧķÂÌÀì¿ÿ¾ÿ½ÿ·ÿ²ÿÿÿÿúó íèå%ä.ß8Ø@ÒGÎNËTÈYÆ^ÄcÂgÀm¿s½z»¹‹¶•´¡²¯°Â®ã®ú¬ÿ­ÿ©ÿ¦ÿÿÿòæÝÒÍÊ È)Å2À:¼B¹H·NµS³X±]°b®g¬lªs©{§„¥Ž£š¡¨Ÿ¹žÒòœÿÿœÿ™ÿüîÝÌÁº ¶²°#¯,­4©<¦B¤H¢M RžW[œ`šf™l—t•}“‡‘“¡Ž±ÆŒè‹ýŒÿŒÿŒÿíØÅ·¬¦¡Ÿ›&š.—5•<“B‘GLŽQU‹ZŠ`‰f‡m…v„€‚Œ€š©}¼|Ü|õ|ÿ|ÿ|ÿÙÁ±¤œ” ‹‰ ‰(‡/…6ƒ<‚A€FK}O|T{Zy`xgvpuzs†q“p¢o´nÌnínþnÿnÿį ”Œ†~|{y"x)w0u6t;r@qEpJoOmTl[kbijhtf€eŽcb­aÂaäaøaÿaÿ´ ‘†~yuq omlk$k*i0h6f;e@dEcJaO`V_]]e\oZzYˆX˜W¨V»VØVñVÿVÿ¨”…zrligd ca`_%^+]0[6Z;Y@XEWKVQUXSaRjPvO„N“M¤L¶LÍLëLúLÿ ‹ | p h b _ ]\ ZXWV U&S+R1Q6P;OANGMMKUJ]IgGsF€ED¡C²CÈCæCõCÿ• ƒti`ZVT S S QONL!K'J,I2H7G=ECDJCQBZ@d?p>~=Ž<Ÿ;±:Æ:ã:ó:üŽ|nbZTPMKK J IGED#B(A .@ 3? 9> @= G< O: X9 c8 o6 ~5 Ž4 Ÿ3 ±2 Ç2 ã2 ô2 þˆwi^UOJGECCB @ ? = < $; *9 0877=6E5M3W2b1n/}.Ž- ,²+È+æ+ö,ÿƒrdYQKFB?><; :875!4'3-230:/B.K-T+_*l){(Œ'ž&°%Æ%ä%ö&ÿ~n`VMGB>:8754 20/-#,*+0*7)?(H'R&]$j#y"Š!œ ¯Äâ ô ÿzj]S J D >:7420. ,*)' &&%-$5#="F!P [hwˆ›­Ãàóÿwg Z!P"H"A";"7!3 0-+(&%#!!$ *2:C M!Y!f!u"‡"™"¬"Á"ß!ò!þs d"W#M$E%>$9$4#0",")!&!$!"! !!""!"(#/#8$A$K%W%d&s&…&˜&«&À&Ý%ñ%ýp"a$T&J&B'<&6&1%-%)$&$"%%& &''''%(-(5)>)I)U*b*q*ƒ*–*© *½ *× *î)ûl$]&Q(H(@)9(4(/(+'''"()*++ ,,,-#-*-2.<.F .R ._ /n / /’ /¥ .¹.Ð .é .÷h'Z)N*E+=+7+1*-*)*$* +-./1 222 2 2' 2/ 38 3B 3N3[4j4{3Ž3¢3¶3Í3ç2ód*V,K-B-:-4-/,+,&,"-/1246 8 8 888$8,848>9J9W9e9w9‹8Ÿ8³8Ê8æ7ò_-R.H/?08/2/-/)/$013579 ;= >>>>!>(>1?;?F?S?a?s?‡>œ>°=Ç=ä=òZ0N2D2<25201+1&2 468;= ?AC CDEEE$E-F6FBFNF]FnE‚E˜D­DÄCãCòU4J5A59534.4(5"7:<?A DFHI J KLMN N(N2M=NJNXMiM}L”LªKÁKáJòP8F8=87817*9$;=@CF IKNPQR STUVW#W,W8WDWRVcVwVŽU¥T½SÝSðK<B<;;5;-<&?BEHK OQTWXZ[\ ]_`bb&b1b>aLa]ap`ˆ` _·^Ô]îG@??:?1@)C!FJNQ UX[^acdegh jlno o*o6nEnUnhmm˜l°kÊjèDD>C5D+G#KOTX\`dgkmoprtuw y|~".=~M}a}w|{¨zÀyßCG9I/L%PU[`ejnrvy|~ƒ…‡ŠŒ ’’%’3’D‘Wm†ŽŸµŒÍ=N2Q(V\bhnty~‚†‰ŒŽ’”–˜›ž¡ ¤¦¦)¦:¥M¥b¤{£”¡«¡¿6W,\!bipw~„Š”˜›žŸ¢¤¦¨«­°³· »»»0»CºX¹p·‹·¡·³0b%ipx €ˆ–›¡¦ª®°±´¶¸»½ÀÃÇËÏ ÓÒ%Ò8ÑNÐeÏ~Í–Ì©ÿÿÿÿÿ üù÷%ó/î8é@æHâNßTÜYÙ^ÕcÓhÐmÎsËzȂƌ×À£¾²¼Èºê¹ÿ¸ÿ±ÿªÿ§ÿÿÿûöíçâß Þ)Ù3Ñ;ÌBÈHÅNÂSÀX¾]¼bºg¹m·tµ{²…°®œ¬ª©½§Þ¦ù¥ÿ£ÿÿ›ÿýöëßÑÊ ÅÃÀ$¾,¹5¶<³C°H®N¬R«W©\§a¦g¤m¢t }žˆœ•š£˜´–Í•ñ”ÿ•ÿÿŽÿóæÑ¸±­ª¨¨'¦/¢6Ÿ<B›G™L—Q–U”Z“`‘fnŽvŒŠˆ›†¬…Á„æƒý„ÿƒÿÿä˺¬¢œ˜ –”“!’(06‹<‰AˆF†K…O„T‚Z`g~o|zz†x”w¤u·tÔsôtÿtÿtÿ˶¦š’Іƒ€#*}0{6z;x@wEuItNsTqZpanimskihg®fÇeêfÿfÿgÿ¸¤•Š|vt rqpp$n*m0k5j:i?hDgIeNdTc[ac`m^y]‡[–Z¨Y½YßYøZÿZÿ¨•‡{snjgedccb%a*_0^5]:\>[DYIXOWVV^ThSsQP‘O¢NµNÐNðNÿOÿœ‰{phb_][ YXWW V%U*S0R4Q9P?ODNKMRKZJcIoG|FŒEE°DÇDèDúEÿ’€q f ^ Y UTRP ONML K&J+I0H5G:F@EFCNBVA_@k>x=ˆ<™<«<Á;à;ô;ÿ‰ x j_WQM K JI H FEDC!B&A+?1>6=<<C;J:R9\8h6u5…4–4¨3¼3Ø3ï3û‚ qdYQKGDB A A ?><;:"9(8-72695?4G3P1Z0f/s.ƒ-•,§+º+Ò+ë+÷}l_TLFB><:: : 8 654 2 $1 )0 // 6. =- E, N+ Y) e( s' ƒ& •% §$ »# Ò# ë# ÷xh[QHB=975332 0 / - , !+ '* -)4(;'D%N$Y#e!s „–©½ØîùsdWME?:520.-, +)(&%$$*#1"9!B KVcq‚•§»Ôîúp`TJB<62/,*(&% #" !'.6?ITap“¦ºÒìúl]QG?94/+(&$"  $,4=GR_n’¥¹ÐêøiZNE= 61-)%#  ")1:EP ] l | ¢ µ Ê å ôeWL!B!:!4!/!* &#    !!"""&#/#7 #A $M $Y $g $x$‹$ž$±$Ç#ã#ñbT!I#@#8#2#,#("$!!!!!#$%& ' ' ' '# '+ (4(>(I(U)d)t)‡)›(¯(Å(á'ð^"Q$F%=%5%/%*$&$"##$%&() , ,,,,!,(-0-:-E-R.`.q-„-™-­,Â,à,ðZ$M&C':'3'-'(&$&!&&')+, . 0 11222%2-263B3N3]3m32–2«1Á1ß1ðV'J)?*7*0*+)'(#()*,.0 1 45 67888"8*939>9J9Y9i9}8“8¨7¿7Þ6ðQ+F,<,4,.,*+%+ ,-/13 5 7:; < =>?@@%@/@:@F@T@e?x?>¦>½=Ü=ðM.B/9/2/-.(."/0257 : <>ABC D FGHH!H*H5HAHOH`GsGŠF¢E¹EÙDðH2>26201+1%2469< ?BDFHJKL NOQRR%R0R<QJQZQmP„ONµMÒMîC6;645/4'5!8;>A DGJMOQSTUW Y[]]]*]6\D\T[g[~Z—Y¯XËWê?98938+9#<?CG JNQTWZ\]_`bd fhkk#j.j<jMi_hugf¨eÂdã==7<.=%@DIM QUZ]`cfhjkmoqt vy{{'z5yExYxmw†vŸu·tÒ_C^H]N[UZ]XgWrUT‘S£R¸QÜQùRÿRÿ‹|qid`^\ [[ZZY%W*V/U4T8S=RCPIOPNXMbKmJzI‹HG±GÌFðGÿGÿ~pf^YVSRP OONN M%L*J.I3H8G>FDEKDSC]Ah@u?…>—=«=Ã=æ=û>ÿ‡uh]UPLJIG FEEDC B%A*@/?4>:=@;G:O9Y8d7q65“4¦4»4Ý4õ5ÿ~m ` V N H D B@?> =<;;:!9%7*60554<3C2L1U0`/m.}-,¢,¶,Ð,î,üw g ZPIC> ; 9 8 76 54321"0'/,.2-8,@+I*R)](k'z&Œ%Ÿ%²%Ê%è%÷r bVLD>9631 0 0 / .,+*)#()'/&5%=$F#P"\!i y‹°Æãóm^RH@:51.,** ) ( ' %$# " &! , 3 ; D O [ i y ‹ ž ° Å á ðiZNE=71-*(&$## "     # * 2:DP\j{ ³ÉäòeWKB:4/*'$"   !(09CNZiyŒž ± Å á ñbTI?71,($! &-6ALW e u ‡ š ­ÁÝ î_QF=5/*%"  # * 3 < G S aqƒ—ª¿Úì\NC:3,'#      '/9CP^n€•©½ØìXKA80*%!   !!!$","5"@#M#Z#k#~#“"§"¼!×!íUH> 5 . ( #   " $ % %&&&!')'2'='I(W(g'{''¥&»&Ö%íQ E!;"2","&!"!   "# % &( ) +,,,,&-/-9-F-T-d-w,,¤+º+Ö*îM"A$8$0$)$$#!"""#$& ( *,. / 02333"3+363B3P3`3s2Š2¡1¸0Ö0ïI%>&4'-'(&#%$%&(* , .0245 7 8::::':2:>:L:\:o9†8ž8¶7Ô6ïD):)1)+)&("'()+. 0 2579;<> ? ACCC#C.C9CGBWBjA@š?²>Ï>ï?,6,/,*+%*+-/2 58:<?ACEFH JLMMM(M4LBLQKdK{J”I­HÊGì;03/-/(-"/147 :=@CFHJLNOQS UXYX"X.W<WKV^VsUT§RÂRæ8312,1%258< @DGJMPSUWYZ\^a dfgf'f4eDdWdkb…aŸ`¹^Ü5705(7 :=B FJOSVY\_adegilnq tww v-v=uOtcs{r•p¯oÉ5:+;"?CH MRW\`dhknqsuwz|‚† ŠŒ‹$Š3‰E‡[†r…‹ƒ¥‚¼/@%DIN TZafkoty}€ƒ…‡ŠŒ’–™ž ¢¢¡) ;ŸPgšš™™¯)INT[bipw}‚†‹“•—𠣦ª®²· »º¹0·Eµ\´t±Ž¯¤"T[bjs{‚‰•šŸ£¦¨«®°³¶º½ÂÇÌÓ ÔÓ&Ñ:ÐQÍhËÊ–üöòñóô òðí%è.â6Þ>ÙDÔJÑOÎTËYÉ^ÆcÄiÁp¾x¼¹¶š³«±À¯æ®ÿ¥ÿšÿ”ÿÿôìèçßÙ ÒÏÏ Ì(Æ0À7¼>¹D·IµN³S±W¯]­b«i©q§z¥…¢“ ¢¶›Ô™ù–ÿÿˆÿ„ÿèßÙÉ¿¸µ ³±°"­*©1¦8¤=¢C HžLœQ›V™\—b•i“r‘}‹š‹¬‰Åˆî†ÿÿzÿxÿÙÍ»®¥Ÿœ ™™™˜$”+‘1Ž7Œ<‹A‰FˆK†P…Uƒ[‚b€k~u|‚z’x£w¹vàuÿrÿnÿlÿǵ¥™‰…„ ‚‚‚€%~+|1z6y;w@vDuIsOrUp\odmnlzjŠh›g¯fÌeõdÿaÿ`ÿ´ …}wspoooom%k*i0h4g9f>eCcHbNaU_^^g\s[‚Y“X¦W¿WêWÿVÿTÿ¡Žulhda` ____]%\*[/Y3X8W=VCUISPRXQaPmN{MŒLŸKµJÜJúJÿJÿ’€rg_ZWUSR RRRQO$N)M.L3K8J=ICHJFRE\DgCuB†A˜@®@Ë?ò@ÿ@ÿ…tg]UOLJHG G FFFED$C)B-A3?8>>=E<N;W:b9o8€7“6§6À6è6þ6ÿ|k^TMGCA?>= =<<<:9$8)7.635:4A3I2S1^0k/{.Ž-¢-¸-Ý-ø.ÿsdWMF@;87654 44321 0$/)./-6,=+E*O)Z(g'w&‰&%³%Ï%ð&ÿm^ R H @ : 6 2 0..- , ,+*)( '%&+%2$9#B"K"W!d s…™®Çéúh Y M C<61 - * ( ' && %$$"!!" (.6?ITap‚–ªÁáôc UI@82-)&# "    %+3<FR_n€”§¼Ùï_QF<5/*&"          " ) 1 : E Q _ n € ” § º Ò ê\NC:2,'#        ( 0; F Q ^ m  “ ¦¹ÐèXK@70)%!      % - 6 A MZj|¤¸ÏèUI>5-'"       "*3>JXgzŽ£·ÏéRF;2+%!   '0;GUdwŒ¢·ÏêOC90)#    $-8DRbuŠ ¶ÐëL@6-&!      !!"!*!5"A"O"_"r!ˆ!Ÿ ¶ÑíH=3+$   !" $ &&&''''2'>'K'\'n&…&%´$Ñ#îD90(#  !"$&(* + ----$...:.H-X-j-,š+²*Ð)ï@ 6!-!&!! ! " $&(+-/0 2 4555 5*565C5S4f4|3–2¯1Í0ï<#2$*$$# "!!#% ' )+.02468: < >>>>&>1>?=N=a@BD F IIH!H,G:GIF[EqD‹C¥BÃAè4*,*'("'(*- 0 369<>ACFHJLNP STTS'S4SCRUQjPƒOžM¹Là0-+,&+,.2 59=@CFILNQSUWY\_ bccb,a<`N_b^{\–[°YÏ/0*/"037;?DHLORUX[]`bdfimp tts%r4rEpYoqm‹k¦jÀ.3%58<AGLQUY]aehkmortwz~‚† Љˆ+†=„Rƒg›~²): =BHNTZ`dinrvz}€‚…ˆ‹Ž’–›  ¢ !Ÿ3Gš^˜w—•§#CHN U\cjqv{€†ŠŽ‘“–™œ £§«°¶¼ º¹(·<´R²j¯…­œNT \dlt|ƒ‰”šŸ¢¤§ª®±´¸¼ÁÇÍÔØÕÓ1ÐHÍ_ËvÈŽ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿmft1!  !"#$%&'()*+,-./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïñòóôõö÷øùúûüýþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÚË èÍ:éÌ`ÜÈ’˺2¬Æ·P´À³h¼»®{ĵ¨ˆË³¥‡Ñ°¢‡Õ­ŸˆÙ«‰Üªœ‹Þ¨šá§™ã¥—’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’楗’æÙË çÎ 9èÍ`ÜÉ ’Ë»0«Æ¸O´À³g½»®{ĵ©ˆË²¦‡Ñ¯£‡Õ­ ˆÙ«ž‰Ü©œŠÞ§›Œà¥™ã¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜ä¡˜äÙË äÎ 9çÎ`ÚÊ ’˼.«Å¹M´À´f½º®zŵ©‡Ë±¦‡Ñ®£‡Õ¬ ˆÙªž‰Ü§œŠÞ¥›‹à¢šâž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãž™ãØË áÏ 9åÏ`ÙÊ ‘˾,«Å¹Lµ¾´g½¹®{Å´ª‡Ì°¦‡Ñ­£‡Õ« ˆÙ¨žˆÛ¥‰Ý£œŠßŸš‹á›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™Žâ›™ŽâØË ÜÐ 9ãÐ `ØË ‘Ë¿+«ÄºLµ½³g¾¸®{Å´©‡Ì°¦‡Ñ¬£‡Õ© ‡Ø¦ŸˆÛ£ˆÝ œ‰Þ›Šà˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá˜šá×Ì ÚÑ 8ÞÑ _ÖË ‘ËÀ)¬Â¹M¶¼³h¾·®{Ƴ©‡Ì¯¦‡Ñª£†Õ§¡‡Ø¤Ÿ‡Ú¡ž‡ÜžˆÝšœ‰Þ•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›Œà•›ŒàÖÌ ÙÑ 8ÚÓ _ÔÌ ‘ÉÀ)­À¹N¶º³i¿µ®|Ʋ©‡Ì­¦†Ñ©£†Ô¥¡†×¢ †ÙŸŸ†Ú›ž‡Ü—ˆÝ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹Þ“œ‹ÞÕÌ ØÒ 7ØÓ ^ÒÌ “Ç¿+­¾¸P·¹²j¿´­|ư©‡Ì«¦†Ð§¤…Ô£¢…ÖŸ¡…Øœ …Ù˜Ÿ†Ú”ž‡ÜŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝŠÝÔÍ ÖÒ 7ÖÔ ^ÐË •ľ-®¼¸Q¸·²jÀ³­|Æ®©‡Ì©¦†Ð¥¤…Ó £„Õ¢„Ö™¡…Ø• …Ù‘Ÿ‡ÚŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛŽž‰ÛÓÍ ÕÓ 6ÔÔ _ÎË —Á¾0¯º·S¸µ²lÀ°­}Ǭª†Ë§§…Ï¢¥„Ñž¤„Óš£„Õ–¢„Ö“¡…× †Ø‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰Ù‹ ‰ÙÒÎ ÓÔ 5ÑÓ bËÌ ™¾½3±··U¹²±mÁ­­}ƪª†Ë¤¨„Ο§„Л¥ƒÒ—¤ƒÓ“£„Ô£…ÕŒ¢†Ö‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×‰¡ˆ×ÐÏ ÑÔ 7ÎÓ eÆÊ ¹¼8²´¶Xº­±nÁª®}Ƨ«…É¡©„Ìœ¨ƒÎ—§ƒÏ“¦ƒÑ¥„Ò¥…ÓŠ¤†Ó‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔ‡£ˆÔÎÐ ÎÔ :ÊÓ hÀÈ¡µ»>´­µ[»©±oÁ¦¯}Ä£­„Ç«ƒÊ˜ªƒË“©ƒÍ¨„Χ„ÏŠ§…χ¦‡Ð…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑ…¦ˆÑÌÐ ÊÔ >ÅÓ m¸Å¥®¹Dµ§µ^»£²pÀ¡°}ß®„Å™­ƒÇ”¬„É«„ʪ…ËŠª…ˈ©†Ì…©‡Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰Íƒ¨‰ÍÈÑ ÅÕ B¿Ó r±Ä§¥¹I¶¡¶`»ž³p¾±}Á›°„Õ¯„Ä‘®„Æ­…ÇŠ­†Çˆ¬†È†¬‡È„«‰É‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉ‚«ŠÉÄÒ ÀÖ H¸Ô x©Ï˜ž¾G®š¶bº˜µq¼—³|¾—²„À’±…°…ʯ†Äˆ¯‡Ä†¯ˆÅ„®‰Åƒ®ŠÅ®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å®‹Å¿Ô%º× N®Ú p Û‡—Í9š’ÃX¨‘¼l²‘·z¹’´ƒ½Ž³†¿‹²‡Àˆ±‡À†±ˆÁ„±‰Áƒ±ŠÁ‚±‹Â€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ€°ŒÂ÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ1ù½ Sê·(|̨DªÆ¥]´Â£pº¾¢¿¼ ˆÃ¹›ˆÆ·˜ˆÊµ•‰Í³’ŠÐ±‹Ò°ŒÔ¯ŠÖ®ˆ“Ø­†˜Ù¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú¬…Ú÷ÀøÀ0ù½ Sê¸'|̨D«Æ¥]´Â¤pº¾¢¿¼ ˆÃ¹›ˆÇ·˜ˆÊµ•‰Î³’ŠÐ±‹Ó°Õ¯Š×­ˆ“Ù­†˜Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú«†Ú÷Á÷Á0ø¾Sê¸&|Ë©C«Æ¦\´Â¤oº¾¢~¿» ˆÃ¹‡È¶š‡Ì³—ˆÏ±”‰Ò°’ŠÕ®Œ×­ŽÙ¬Š’Ü«‰™Ý§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛ§ˆœÛöÁ÷Á0ø¿Sê¹%|Ë©B«Æ§[³Â¥nº¾£~¿»¡ˆÄ¸ž‡Éµœ‡Í²™‡Ñ°–ˆÔ®”‰×­’‹Ú«Ü©’ߨšß£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜ£‹œÜöÁöÂ0÷¿Sêº$|Ë©A¬Æ§Z³Â¥mº¾£}¿»£ˆÄ· ‡É´‡Î±›‡Ó¯™ˆÖ­—‰Ú«•ŠÜ©“ß§’‘⤑™à ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜ ŽœÜõÂõÂ0öÀSêº#|˪A¬Æ¨Y³Â¦mº¾¤}¿º¤‡Å·¡‡Ê³Ÿ‡Ï°‡Ô®›ˆØ«™‰Ü©˜‹ß§˜Žâ¥—’æ –™àœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýœ“›Ýô õÃ0öÀSê»"|ʪ@¬Æ¨X³Â¦lº¾¤|¿º¥…Ŷ£‡Ë³¡‡Ð°Ÿ‡Õ­ˆÚªŠÝ§›Œà¤šŽâŸ˜ãš˜á™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ý™—›Ýòà ôÃ0õÁSê¼!|Ê«?­Æ©W³Â§kº¾¥{¿º¦„Ŷ¥‡Ë²£‡Ñ¯¡‡Ö«ŸˆÚ§‰Ý¤œŠß ›‹à›šâ—š“á—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þ—œ›Þðà ôÄ/õÂRê½ |Ê«>¬ÆªV³Â¨kº¾§y¿º¨ƒÅ¶§‡Ì²¥‡Ñ¬¢‡Ö¨ ‡Ù¤žˆÜ¡ˆÝœœ‰Þ—›‹à“›à’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—Þ’—ÞíÄ óÅ/ôÂRê½|ʬ<¬Æ«U³Â¨j¹¾©w¿ºª€Åµ©‡Ì¯¥‡Òª¢‡Ö¥ †Ø¡Ÿ†Úž‡Û™‡Ý”‰ÞœÞŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝŽ“ÝêÅ òÅ/óÃRê¾|Ë­:¬Æ¬T³Â©i¹¾¬s¿º­~Ų©‡Ì¬¥†Ñ§£†Õ¢¡…מ …Øš …Ú–Ÿ†Û‘žˆÜž‹Ü‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜ‹žÜæÅ ñÆ/òÄRêÀ|˯8¬Æ­R²Â«f¹¿°o¾·­~ư©‡Íª¦†Ñ¤¤…ÓŸ£„Õ›¢„Ö—¡…Ø“ …Ù ‡Ù‹ŸŠÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚˆŸÚáÆ ðÇ.ðÆQêÁ|˰5«Ç¯O²Ã°`¸¼²l¿²­~Ç­©†Ì§§…Ï¡¥„Òœ¤„Ó˜£„Ô”£„Õ¢…Ö¡†×‰¡ˆØ‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹Ø‡¡‹ØÛÇ îÉ.îÈQëÄ|̳0«Ç±L±Ä¸V·¶±nÁ®­Ç©ª†Ë£¨„Ξ§ƒÏ™¦ƒÑ•¥ƒÒ‘¤„ÓŽ¤…Ô‹£†Ôˆ£ˆÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕ…£ŠÕÚÈ ëË -ëÊPëÇ|̶*ªÈ·D°º¶Yº¯±pª­Ǧ«…Ê ª„Ìš¨ƒÍ–¨ƒÎ’§ƒÏ¦„ÐŒ¦…щ¥†Ñ‡¥‡Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰Ò…¥‰ÒØÉ ßÍ ,çÍOèË{ͼ"¨Â¼<±±µ^¼©±r¦®Å¢­„Çœ«ƒÉ—ªƒÊ“ª„Ë©„Ì©„Í‹¨…͈¨†Î†§‡Î„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰Ï„§‰ÏÕÉ ØÏ +ÚÓ NØÐ zÍ賺Fµ©´b½¤±tÁ¡°Þ®„Å™­„Ç”¬„È«„ÉŽ«„Ê‹ª…ˉª†Ë‡©‡Ì…©ˆÌƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰Ìƒ©‰ÌÒË ÔÑ )ÕÕ LÐÐ ~¸¿%®¨¸O¸¡´f¼ž²u¿±Á›°„Ö®„Å‘®„ÆŽ­…Ç‹¬…lj¬†È‡¬‡É†«‡É„«‰É‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊ‚«ŠÊÏÌ ÐÒ (ÎÔ RÅÑ ƒªÃ-¨ž·W¸›µh»š´u¾™²¿—±„Á“°…¯…ÃŒ¯…ÄŠ®†Åˆ®‡Å†®ˆÆ„­ˆÆƒ­ŠÆ­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹Ç­‹ÇÌÍ ËÓ -ÇÔ Y²Ø €žÍ+š˜ÁP«–¸g·•µu¼”´~¾”³…¿²…ÀŒ±†Áб‡Âˆ°‡Â†°ˆÂ…°‰Ãƒ°ŠÃ‚¯‹Ã¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃ¯ŒÃÇÏÅÔ 4¸Ù [¢çv—Ú%‰ÏE˜ŽÇ]£Án«½y±Œº´‰¸ƒ·†·…¹„¶†ºƒµ‡»‚µˆ¼´‰½€´Š½´‹¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾~³Œ¾ÂѽÖ:§ñU›ñh‘æ-x‰Ý@……ÕVƒÏg—‚Ës~Èx¡{Æ|¤yĦw¨u„©tÂ…ªsÁ‡«rÁˆ«rÀЬqÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬qÀ‹¬ÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿ´*F÷¯6iÞ§BÇ›b±Ä›r¶Â›¹À›ˆ½¾™‰À¼•ŠÃº‘‹Æ¸È·ŠÊ¶ˆ‘̵…“Í´ƒ–ϳ™Ð³€Ñ²£Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñ°~¤Ñÿ¸ÿ¸'ÿµ)F÷°5iÞ¨AÇœa±Äœq¶Â›~¹¿†½½š‰Á»—‰Ä¹“ŠÇ·ŒÊµŒŽÌ´‰Î³‡’в„•Ò±‚™Ó±žÔ®€¢Ô¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Ò¬€£Òÿ¹ÿ¹'ÿ¶(F÷°4jݨ@Ç`±Äœq¶Âœ|º¿ž…¾¼œˆÂº™ˆÅ¸•‰É¶‘ŠÌ´ŽŒÏ²‹ŽÑ±ˆ‘Ó°†”Õ¯„™Ö¯ƒŸ×ª‚¡Õ§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Ó§‚¢Óÿ¹ÿ¹'ÿ¶(F÷±3jÝ©?‘Ç`±Äp¶Âž{º¿Ÿƒ¾¼žˆÂ¹›ˆÇ·—ˆÊµ”‰Î³‹Ñ±Ó¯ŠÖ®ˆ“Ø­†™Ùª…žÙ¥„¡Õ¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ô¤„¢Ôÿºÿº'ÿ·'F÷±2jÝ©>‘Çž_±Äo¶ÁŸyº¾ ‚¿» ˆÃ¸œ‡È¶™ˆÌ³–ˆÐ±’ŠÓ¯ŒÖ®ŒŽØ¬Š“Û«‰™Ü¦‡Ú¢† Ö †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ô †¢Ôÿºÿº&ÿ·&Fö²1jݪ=‘Çž^±Äo¶Á xº¾¡¿»¡ˆÄ¸ž‡Éµ›‡Í²˜ˆÑ°•‰Õ®’‹Ø¬Ûª’Þ¨Œšß¢ŠÚž‰ Öœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôœ‰¡Ôþºÿ»&ÿ¸&Fö²0jݪ<‘Çž]±Äžn¶Á¡vº¾¢¿»£ˆÄ· ‡Ê´‡Ï±š‡Ó®˜ˆ×¬•ŠÛª“Þ¨‘’⤙àžÛšŒ ×™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õ™‹¡Õþ»þ»&ÿ¸%Fö³0jÜ«;’ÇŸ]±ÄŸl¶Á¢tº¾¤~¿º¤‡Å·¢‡Ê³Ÿ‡Ð°œ‡Õ­šˆÙª™ŠÞ¨˜Žâ¥—“柕™àš‘œÛ—Ÿ×–ޡՖޡՖޡՖޡՖޡՖޡՖޡՖޡՖޡՖޡՖޡՖޡՖޡÕý»þ»&ÿ¹%Fö³/jÜ«:’ÇŸ\±Ä j¶Á£sº¾¥|Àº¥…Ŷ£‡Ë³¡‡Ñ¯Ÿ‡Ö¬ž‰Û¨œ‹ß¤šáŸ™ãœš˜á—–œÜ”“ŸØ“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Ö“’ Öý» ý¼&þ¹$Fö´.jÜ«:’Ç \±Ä¡h¶Á¥qº¾§zÀº§„Ŷ¦‡Ì²¤‡Ñ®¢‡×©ŸˆÛ¤‰Þ ›ŠàššŒá–›“á•››Ý’—žØ‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×‘• ×ü¼ ý¼&þº#Fö´-jܬ9’Ç [±Ä£fµÁ¦nº¾©xÀº©‚Ŷ¨ˆÌ°¥‡Òª¢‡×¦Ÿ‡Ú¡ž‡Ü›ˆÞ–œŠß‘›ß‘™Ý›žÙ™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×™Ÿ×ü¼ ü¼&ýº"Eöµ,jÜ­7“Ç¡Z±Å¥cµÂ©kº¾¬u¿º­ų©‡Ì­¥†Ò§¢†Ö¢¡†ØŸ†Ú˜ž‡Û’‰ÝŽÝŒž”Ü žÙŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×ŒžŸ×û½ û½%ý»"Eö¶+jÛ­6“Ç¢Y±Å§_µÂ­f¹¿±p¾·­~ư©‡Íª¦†Ñ¤¤…Ôž¢…Ö™¡…Ø” †ÙŸ‡Ú‹Ÿ‹ÛˆŸÛˆ ˜Øˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ˆ¡×ú½ ú¾%ü¼ Eö·*jÛ¯4”ȤU±Æ«X´Ã³_·»²n¿²­~Ǭ©†Ì¦§…Р¥„Ò›¤„Ô–£„Õ‘¢…Ö¡†×‰¡‰Ø†¡Ø„¡“ׄ¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Ö„¢—Öù¾ ù¿%ú½Eö¸'jÛ°1”ȨM¯Ç²N²Á¸X¸´±pÁ­­Ç©ª…Ë¢¨„ΧƒÐ—¦ƒÑ’¥„ÒŽ¤…Ó‹£†Ôˆ£ˆÕ„£‹Õ‚£Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“Õ£“ÕôÀ ÷À$ù¿Döº%jÚ².•ʯ@­È½=¯·¶]º®±r©­Æ¥«…ÉŸªƒË™©ƒÍ”¨ƒÎ§„ÏŒ¦…Љ¦†Ñ†¥‡Ò„¥ŠÒ¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥Ò€¥ÒìÁ õÂ$öÁD÷½!jÚ´)–ͼ(©»»C³®µa¼¨±sÁ¥®Å¡­„Ç›¬ƒÉ–«ƒÊ‘ª„ËŽ©„Ì‹©…͈¨†Î†¨‡Îƒ¨‰Î§ŒÏ€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§Ï€§ÏßÄ òÅ#óÄCôÁiÞÂÁÀ#¬¯¹L¶¦´e½¢²uÀ °€Ã®„Å—­„Æ“­„Ǭ„ÈŒ«…ɉ«†Ê‡«†Ê…ªˆÊƒª‰Ëª‹Ë€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒË€ªŒËÚÅ ëÉ "îÈBïÆhÐÒ ‡±¾/®¥¸T¸Ÿµh¼³v¿›±Á™°„”¯„ï…Ä®…ÅŠ®†Æˆ­†Æ‡­‡Æ…­ˆÇƒ­‰Ç­‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹Ç€¬‹ÇÕÆ ÙÌ åÏ @ØÕ _½Ö ˆ¥Ä4¦œ·Z¸™µk»—´w½–³¾•²…À‘±…Áޱ…Á‹°†Â‰°‡Âˆ°‡Ã†°ˆÃ…¯‰Ãƒ¯ŠÄ‚¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹Ä¯‹ÄÒÈÓÏ ÕÔ =ÂÙ c«Þƒ›Î3™”ÄS¦‘¾g¯ºt´·}¹‘µ„¼Ž³†¾Œ²†¿Š²‡Àˆ²ˆÀ†±ˆÁ…±‰Á„±ŠÁ‚±‹Á±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂ€±ŒÂÎÊÎÑ Æ× A¯êaæxÚ2ˆ‹ÒL”‰Ë_œˆÆn£ˆÃx¨…À|«ƒ¿®€½°¼ƒ±}¼„²|»†³{»‡´zºˆ´yº‰µx¹‹µx¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶x¹Œ¶ÉËÈÒ "³ß B üZ“ð(j‹æ9w„ßI‚Ø[‹€Ói‘|Ðq–yÍvšvËztÊ}žrÉ qÈ¡pǃ¢oÇ…£nƆ£mƈ¤lÅŠ¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥lÅ‹¥ÄÎ ·Ù&£û=–ÿNú/[†ò?g€ëNq{å[yvàe€qÝl„nÚrˆkÙw‹i×zgÖ~ŽfÕ€eÔ‚dÔ„‘cÓ†‘bÓ‰’aÒ‹“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“aÒŒ“ÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ±#ÿ®1:ÿ©>Yí¢KyÙš\—È•r°Å•}µÃ—…¸Á—‹»¿“Œ½¾ŽÀ¼ŒÂ»‰’ĺ†”Źƒ–ƹ™Ç¸€›È¸~žÉ·}¢Ê·|§Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Ê´{©Êÿ± ÿ²"ÿ®0:ÿ©=Yì£JyØ›[˜Ç•r±Å—{µÃ˜ƒ¸Á™Š»¿•‹¾½‘ŒÁ»ŽŽÃºŠÅ¹‡’Ǹ„•É·‚˜Ê¶€›Ë¶~žÌµ}£Ì³|§Í¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ë¯|¨Ëÿ² ÿ²!ÿ¯/:ÿª}Ö¨D›É¨O¯Ç°S²Å¸Yµ¹³m¿±­}Ƭª†Ë¥§…ÏŸ¦„ј¤„Ó’£„ÕŒ¢†×ˆ¡Š×…¡Ž×ƒ¢–Ö„¤ŸÔ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñ„¢£Ñÿ·ÿ¸ÿ¶%9ÿ±1Zê«<~׬;™Ê­D­É¹E®½¸Y¸²²oÀ¬®~ƨ«…Ê¡©„Í›§ƒÏ•¦ƒÐ¥„ÒŠ¤†Ó†£ˆÔƒ£ŒÔ£‘Ô€¤™Ó€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñ€¦¡Ñÿ¸ÿ¹ÿ·$9ÿ³/Zé­9~Ù´/–̸2©Â½@°³¶]º¬±qÁ§®~Ť¬…È«ƒÊ—©ƒÌ’¨„Χ„ω§†Ð…¦ˆÐ‚¦‹Ñ€¦ŽÑ~¦”Ð}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏ}§šÏÿ¹ÿºÿ¹"9ÿµ-Zì³0zÝÀÉÃ!¨µºH´«µb¼¦²sÀ£¯~஄ƙ¬ƒÈ”«„ɪ„Ê‹ª…ˈ©†Ì…©ˆÍ‚¨ŠÍ€¨Î~¨‘Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Í|©–Íü»ü¼þ»8ÿ·)Zð½$tßÓ†¹Á*ªª¹O¶¤µe¼ ²t¿ž±›¯„Ö®„Å‘­„Æ­…ÇŠ¬†È‡¬‡É…«ˆÉ‚«ŠÊ€«ŒÊ~«Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Ê|«’Êñ½ ù¾ú¾7üº%ZçÎhÈÙ ‰­Ã2§¡¸V¸µh»›³u¾™²À˜±„Á“°…¯…ÃŒ¯†Ä‰®†Å†®‡Å„®ˆÆƒ­ŠÆ­‹Æ­ŽÇ}­Ç}­Ç}­Ç}­Ç}­Ç}­Ç}­Ç}­Ç}­Ç}­Ç}­Ç}­ÇßÀõÂöÂ6îÈPÍÜ fµÚˆ¢É6 š¾V°—·j¹•µv¼”´~¾”³„¿²…À±†Áб†Áˆ±‡Â†°ˆÂ„°‰Âƒ°ŠÃ°‹Ã€¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯Ã~¯ÃÙÂäÇ ïÈ4ÑÚ Eºéh¦Þ‚˜Ñ7•‘ÈS¡Âe©Ž¾r®¼{²Œºµ‰¸‚·‡¸„¸…·…¹ƒ¶†º‚¶‡ºµˆ»€µ‰»~µŠ¼}´Œ¼|´½|´½|´½|´½|´½|´½|´½|´½|´½|´½|´½|´½ÔÄÖË ÓÔ '½â I©ôe™æ%xŽÜ9†ˆÔO†Ï`—„ÌmœƒÉu Çx¢}Æ{¤zÅ}¦yÄ€§wèvƒ©u„ªtÁ†«sÁ‡«rÀ‰¬q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­q¿‹­ÏÆÐÍ ÀÙ ,¬÷H›ú\ï1k†çBv€âP~~Ý_…{ÙiŠwÕntÓs’qÑw”pÐz–nÏ}—mΙlÍ™k̓šjÌ…›i̇œhˉgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒgÊŒÊÈÂÒ®æ -ÿA‘ÿ(P‡ú9\óHf|íTnwè^uqäezmák~jßphÞu„fÜx…eÛ{‡cÚ~ˆbÚ‰aÙƒŠ`Ù…Š`؇‹^ØŠŒ^Ö^Ö^Ö^Ö^Ö^Ö^Ö^Ö^Ö^Ö^Ö^ÖÄʱڟÿ (’ÿ7‰ÿ.C‚ÿ=N|ýKWwøV_oó]ehðbjdíinaëoq_éss]èwu\ç{v[æ~wZæ€xYåƒyXå…zXäˆzWä‹{VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|VãŽ|ÿªÿª'ÿ§6/ÿ¢DJúReê—_~Ü“n“Ï’x¥Æ’‚´Ä’‰¶Ã‘ޏÁŽºÀŠ’¼¿‡”½¾„–¿¾‚™À½€›Á½~žÁ¼}¡Â¼{¤Â¼z¨Ã¼y­Ã¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Âÿªÿª'ÿ§6/ÿ¢DJúReê—_~Ü“n“Ï’x¥Æ’‚´Ä’‰¶Ã‘ޏÁŽºÀŠ’¼¿‡”½¾„–¿¾‚™À½€›Á½~žÁ¼}¡Â¼{¤Â¼z¨Ã¼y­Ã¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Âÿªÿª'ÿ§6/ÿ¢DJúReê—_~Ü“n“Ï’x¥Æ’‚´Ä’‰¶Ã‘ޏÁŽºÀŠ’¼¿‡”½¾„–¿¾‚™À½€›Á½~žÁ¼}¡Â¼{¤Â¼z¨Ã¼y­Ã¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Âÿªÿª'ÿ§6/ÿ¢DJúReê—_~Ü“n“Ï’x¥Æ’‚´Ä’‰¶Ã‘ޏÁŽºÀŠ’¼¿‡”½¾„–¿¾‚™À½€›Á½~žÁ¼}¡Â¼{¤Â¼z¨Ã¼y­Ã¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Âÿªÿª'ÿ§6/ÿ¢DJúReê—_~Ü“n“Ï’x¥Æ’‚´Ä’‰¶Ã‘ޏÁŽºÀŠ’¼¿‡”½¾„–¿¾‚™À½€›Á½~žÁ¼}¡Â¼{¤Â¼z¨Ã¼y­Ã¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Âÿªÿª'ÿ§6/ÿ¢DJúReê—_~Ü“n“Ï’x¥Æ’‚´Ä’‰¶Ã‘ޏÁŽºÀŠ’¼¿‡”½¾„–¿¾‚™À½€›Á½~žÁ¼}¡Â¼{¤Â¼z¨Ã¼y­Ã¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Â¸y¯Âÿªÿª'ÿ§5/ÿ£DJúQeé—^~Û”m”Ï’w¦Å’´Ä“ˆ¶Ã’¸ÁºÀ‹‘¼¿ˆ“¾¾…–¿½‚˜Á¼€›Â¼~žÂ¼}¡Ã»{¤Ä»z©Äºy­Äµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãµy®Ãÿ«ÿ«&ÿ¨4/ÿ¤CJùžPeé˜]Ú•i•Í”t¨Å”~´Ä•†¶Â•Œ¹Á‘Ž»¿½¾‰’¿½†”Á¼ƒ—ûšÄº~ź}¡Æº{¥Æ¹zªÆµz¬Æ±z­Ä±z­Ä±z­Ä±z­Ä±z­Ä±z­Ä±z­Ä±z­Ä±z­Ä±z­Ä±z­Äÿ«ÿ«%ÿ©4/ÿ¤BJùŸOfè™\€Ú–f–Ì•q©Å•|´Ä–ƒ·Â—‹ºÀ“Œ¼¾Ž¿½‹Á¼‡“ú„–Ź™Æ¹Ǹ}¡È¸|¦ÉµzªÉ°{«Ç¬{­Å¬{­Å¬{­Å¬{­Å¬{­Å¬{­Å¬{­Å¬{­Å¬{­Å¬{­Å¬{­Åÿ¬ÿ¬$ÿ©3/ÿ¥AJùŸOfè™[Ù˜c–Ì–oªÅ–y´Ã—·Á˜‰º¿•‹½¾‘À¼Âºˆ’Ź…•Ǹ‚˜É·ʶ}¢Ë¶|¨Ë°{©Ê¬|ªÈ¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Å¨}¬Åÿ¬ÿ¬$ÿª2/ÿ¥AKù NgçšYÙ™a—Ë—m«Å—w´Ã™·Áš‡»¿—о½“ŒÁ»ŽŽÄ¹ŠÇ¸†“ɶ‚˜ËµÍ´~£Î±|¦Î¬}¨Ë¨}ªÉ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æ¥~¬Æÿ¬ÿ­#ÿª2/ÿ¦@Kø MgçœWÙš^—˘j¬Å™t´Ãš}·Á›…»¾™‰¿¼•ŠÂºŒÅ¸ŒÈ¶‡’Ë´ƒ—γ€Ð²¤Ñ¬~¥Ï¨~§Ì¤©É¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æ¡€¬Æÿ­ÿ­#ÿ«1/ÿ¦?Kø MgçUÙœ\—Ê™h¬Åšr´Ãœz¸Àœƒ»¾œ‰¿»—‰Ã¹“‹Ç·ŽË´‰Î²„–ѱӬ€¢Ó§€¥Ð¤€§Í ©Êž«Æž«Æž«Æž«Æž«Æž«Æž«Æž«Æž«Æž«Æž«Æÿ­ÿ­"ÿ«1/ÿ§?Kø¡LgçžSÙY—Ê›e¬Åœo´Ãx¸Àž¼½žˆÀ»šˆÄ¸•‰Éµ‹Í²‹Ñ°†•Õ®„ž×§‚¡Ô£‚¤ÑŸ‚§Íœƒ©Êšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çšƒ«Çÿ­ÿ®"ÿ«0/ÿ§>Kø¡KhçŸQÙŸV—Êœb¬Ål´ÃŸu¸À ~¼½ ‡ÁºˆÆ·˜ˆË³“‰Ï°ŽÔ­‰”Ù¨†Ú¢…¡Õž…¤Ñ›…¦Î™…©Ê—…«Ç—…«Ç—…«Ç—…«Ç—…«Ç—…«Ç—…«Ç—…«Ç—…«Ç—…«Ç—…«Çÿ®ÿ®"ÿ¬0/ÿ§>Kø¢Khè¡OÙ S—Êž_¬ÆŸi´Ã¡r¸À¢|¼½¢„Á¹ ‡Çµœ‡Í²—ˆÒ®“‹ØªŽ“ߢ‹œÜœ‰ Ö™ˆ£Ò—ˆ¦Î•ˆ©Ê”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Ç”ˆ«Çÿ®ÿ®!ÿ¬//ÿ¨=Kø¢Jhè¢M€Ù¢P—Ë \¬Æ¡e³Ã¤n·À¥x¼¼¥‚¸¤‡È´ ‡Î°ˆÕ«™ŠÝ¥—“曑›Ý– ×”£Ó’Œ¦Ï‘‹¨ËŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«ÈŠ«Èÿ®ÿ¯!ÿ­//ÿ¨ÿPU÷ŸQhë S{à WÔž_žÊ›k¬Å›u´Ã›~¸À›‡¼½—ŠÀº‘ŒÅ·ŠÊ´„—ϲ€£Ò¨¥Ï£€¨Ë €«Ç­Å›¯Â™‚±¿™‚±¿™‚±¿™‚±¿™‚±¿™‚±¿™‚±¿™‚±¿™‚±¿™‚±¿ÿ¦ÿ§%ÿ¥4%ÿ¡C>ÿžNUø¡Nhì¢Pzà£RŒÕ¡[Ëžf¬Æq´Ãžz¸Àž„¼¼›ˆÂ¹•ŠÇµÎ°†–Ô©‚ Ö¡‚¤Ð‚¨ËšƒªÈ™ƒ­Å—„¯Â–„°À–„°À–„°À–„°À–„°À–„°À–„°À–„°À–„°À–„°Àÿ¦ÿ§%ÿ¥4%ÿ¡B>ÿŸLUø¢Lgì¥Myá¦N‹Õ¤VœÌ¡aªÆ¡l³Ã¢v·À¢€½¼ ‡Ã·šˆÊ²“ŠÒ¬‹”Û ‡ŸØš†¤Ñ—†§Ì•†ªÈ”‡¬Å“‡®Ã’‡°À’‡°À’‡°À’‡°À’‡°À’‡°À’‡°À’‡°À’‡°À’‡°Àÿ§ÿ¨$ÿ¦3%ÿ¢B>ÿ JTù¤Jfí§Jxâ©KŠÖ¨QšÍ¦[©Ç¥e²Ä§p¶À§z¼¼¦ƒÃ¶¢‡Ë¯ˆÖ¥—•æ—žÚ“£Ò‘‹§Í‹ªÉŠ¬ÆŠ®Ã‰°Á‰°Á‰°Á‰°Á‰°Á‰°Á‰°Á‰°Á‰°Á‰°Áÿ§ÿ¨$ÿ¦3%ÿ¢A>ÿ¢HTù¦GfîªGwã­GˆÙ­K˜Ï¬T¦È¬^¯Æ¯h³Â±s¹¾²}À²ª‡Ë¥¢†Õ”œ‹ÞšÚ•¢ÓŒ’¦Î‹©Ê‹Ž«Ç‹­ÄŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯ÁŒŒ¯Áÿ¨ÿ©$ÿ§2%ÿ£A>ÿ¤FSú©Ddï­Cuä±B…Û´D”ÒµJ¡Ë·S«Ê¾_­½·n¸²°|©ª†Ëœ¥„Ò ‡Ø† —Ù‡ž¢Ó‡˜¥Ï‡•¨Ë‡“ªÈˆ‘­Åˆ¯Âˆ¯Âˆ¯Âˆ¯Âˆ¯Âˆ¯Âˆ¯Âˆ¯Âˆ¯Âˆ¯Âÿ¨ÿ©#ÿ§2%ÿ£@>ÿ¦CRû«Acð±?sç·=‚Þ¾;ÖÄ?šÌÅJ¦¼¼]²±µo»ª°}ã«„É–§ƒÎФ†Ó£Õ¥ŸÒ‚¡¥Ï‚œ¨Ìƒ™ªÉ„–¬Æ…”®Ã…”®Ã…”®Ã…”®Ã…”®Ã…”®Ã…”®Ã…”®Ã…”®Ã…”®Ãÿ©ÿª#ÿ¨1%ÿ¤?>ÿ¨@Qü¯>ÿ«;Oÿ´7]ö½3jëÊ1uÜÚ)‚ÄÎ8™²ÁO«§¸c·¡´s¼ž±Á˜¯„Ĭ„ȇª‡Ê€©ŒÌ|©“ÌzªœËy«¦Êz§ªÈ|¢«Ç}ž­Ä}ž­Ä}ž­Ä}ž­Ä}ž­Ä}ž­Ä}ž­Ä}ž­Ä}ž­Ä}ž­Äÿªÿ«!ÿ©.%ÿ§<>ÿ°6Lüº0YïÈ,bÞÙ'mËÜ&†¶Ì<›¨ÁT«Ÿ¹f¶›µt¼™²¿•°„¯…Ć­‡Æ¬‹È}¬È{¬˜Èy­ŸÇw­§Çwª¬Æy¥­Äy¥­Äy¥­Äy¥­Äy¥­Äy¥­Äy¥­Äy¥­Äy¥­Äy¥­Äÿ«ÿ¬ ÿ«-$ÿ«6;ÿ¶/HóÄ(QàÖ&VÌä"q»Ú(ˆªÌA›ŸÃW©™¼i²–·v¹”´€½‘²…À‹±†Á†°ˆÃ¯‹Ä~®Å{®”Åz¯šÄx¯ Äu¯§Ät­®Ãt­®Ãt­®Ãt­®Ãt­®Ãt­®Ãt­®Ãt­®Ãt­®Ãt­®Ãÿ¬ÿ­ÿ¬+$ÿ°/7ú¿%AäÑ EÎä[½é"t­Ú,‰ŸÎE™—ÆZ¤“Àj­‘»v³¸·¶„»‰´†½…²ˆ¿‚±‹Á±ŽÁ|±’Âz±–Áy±›Áx²¡Àt±§Át±§Át±§Át±§Át±§Át±§Át±§Át±§Át±§Át±§Áÿ®ÿ¯ ÿ®($ÿ¸$1êË5ÐâC¿ð^¯è%u Û1‡–ÑH”Ê\žÅj¥‹Ávª‰¾}¯…¼€²‚ºƒ´~¹†¶|¸‰·y·Œ¸w·¹v¶“ºu¶—ºt¶ºs·¤¹s·¤¹s·¤¹s·¤¹s·¤¹s·¤¹s·¤¹s·¤¹s·¤¹s·¤¹ÿ°ÿ± ÿ±%#óÄ'Ôß+ÁïH°÷ `¡ê+s•ß9‚×LˆÑ]•†Ìj›„Ét €Æy¤}Ä}¦z€©wÁƒªuÀ†¬s¿Š­q¿®o¾¯n¾”¯l¾™¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯k¾ ¯ÿ³ÿ´ ü¼ÖÖ Ãí0²üJ¢ù%^–í3nŒåAz…ÞOƒÙ^ŠÕjzÒp“vÏu—sÎy™qÌ}›oË€mÊ„žkɇŸiÉŠ hÈŽ¡gÇ’¢eÇ–¢dÇœ£dÇœ£dÇœ£dÇœ£dÇœ£dÇœ£dÇœ£dÇœ£dÇœ£dÇœ£ô¶ ÿ¸ ÕÌ ÄÛ ²ü3£ÿH–ü,XŒó;e„ìIo~çUvzã`|ußgqÝm„mÛr‡jÙv‰hØz‹f×}dÖŽcÕ„aÔˆ`Ó‹‘_Ó’^Ò”’\Ò™“\Ò™“\Ò™“\Ò™“\Ò™“\Ò™“\Ò™“\Ò™“\Ò™“\Ò™“Ü»ØÃÄÑ³è £ÿ1–ÿ$CŒÿ4P„ûBZ}öObxñZhqî_mkëdqgéitdçnvbæsx`åwy_äz{]ã~|\â}[â…~ZáˆYà‹€Wà€Vß•Vß•Vß•Vß•Vß•Vß•Vß•Vß•Vß•VߕԽÄÈ´Ù £þ –ÿ,‹ÿ+:ƒÿ:D|ÿHMuÿRSnýWXgú]\c÷b_`ögb]ôkd[óoeYòsgWñwhVñziUð}jTï€kSï„kRî‡lPî‹mOínOínOínOínOínOínOínOínOínOínÆÀ´Ð£ã –ÿ‹ÿ $‚ÿ0/zÿ?7rÿH>jÿNCdÿTH^ÿYL[ÿ_OXÿdRUÿiTSÿmURþqWPýtXOüxYNû{ZMû[Lúƒ\Kù†]Iù‹^Hø_Hø_Hø_Hø_Hø_Hø_Hø_Hø_Hø_Hø_µÇ¤Ú–ÿŠÿÿ$yÿ3"pÿ;*hÿB1aÿJ6\ÿQ;WÿW?Sÿ]BPÿbDNÿgFLÿlHJÿpIIÿtJHÿwKFÿ{LEÿMDÿƒNCÿ‡NBÿ‹OAÿ‘PAÿ‘PAÿ‘PAÿ‘PAÿ‘PAÿ‘PAÿ‘PAÿ‘PAÿ‘PAÿ‘Pÿ‘ÿ•' ÿ•;ÿ“K/ÿYCÿŒdTûŒkcòŠrqêˆ|}ㆄ‡Þ‚ŠÚ–Ö}”›Óz˜ŸÑxœ¢ÐwŸ¤Îu¢¦Ít¦¨Ír©©Ìq­ªÌp²«Ëp¶«Ëo¼«ÈpÀ«ÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÿ‘ÿ•' ÿ•;ÿ“K/ÿYCÿŒdTûŒkcòŠrqêˆ|}ㆄ‡Þ‚ŠÚ–Ö}”›Óz˜ŸÑxœ¢ÐwŸ¤Îu¢¦Ít¦¨Ír©©Ìq­ªÌp²«Ëp¶«Ëo¼«ÈpÀ«ÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÿ‘ÿ•' ÿ•;ÿ“K/ÿYCÿŒdTûŒkcòŠrqêˆ|}ㆄ‡Þ‚ŠÚ–Ö}”›Óz˜ŸÑxœ¢ÐwŸ¤Îu¢¦Ít¦¨Ír©©Ìq­ªÌp²«Ëp¶«Ëo¼«ÈpÀ«ÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÿ‘ÿ•' ÿ•;ÿ“K/ÿYCÿŒdTûŒkcòŠrqêˆ|}ㆄ‡Þ‚ŠÚ–Ö}”›Óz˜ŸÑxœ¢ÐwŸ¤Îu¢¦Ít¦¨Ír©©Ìq­ªÌp²«Ëp¶«Ëo¼«ÈpÀ«ÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÄqÀªÿ’ÿ–' ÿ–;ÿ”K0ÿYCÿcTúŽidñpré‹z~≂‰Ü…‰’Ø‚Ž™Ô“žÑ}—¢Ï{›¦Íyž¨Ìw¢ªËv¥¬Êt©­És­®Ér²¯Éq·¯Èq¼¯Âs½®¾t½¯¾t½¯¾t½¯¾t½¯¾t½¯¾t½¯¾t½¯¾t½¯¾t½¯ÿ“ÿ—' ÿ˜;ÿ•K0ÿ‘YDÿ‘`Uúfdðmsèw€áŒ€‹Ûˆ‡”Õ…œÒ‚‘¡Ï–¦Ì}™©Ë{¬Éy¡®Èw¥°Çv©±Æu­²Æt²³Æs¹³Âuº³¼uº³¸vº³¸vº³¸vº³¸vº³¸vº³¸vº³¸vº³¸vº³¸vº³ÿ”ÿ˜' ÿ™;ÿ–K0ÿ’YDÿ’^Uú’deð‘jtçsàŽ}ŒÙ‹…–Ôˆ‹žÐ…¤Í‚”©Ê˜­È}œ°Ç{ ²Æy¤´Åx¨µÄv®¶Äu´¶Áv·¶¼w·¶·w·¶³x·¶³x·¶³x·¶³x·¶³x·¶³x·¶³x·¶³x·¶³x·¶ÿ•ÿ™' ÿ™;ÿ—J0ÿ“XDÿ”\Uú”aeð“gtç‘p‚ßzŽØƒ˜Ò‹Š Î‡§Ë„“¬È—°Æ›³Ä}ŸµÃ{¤·Ây©¹Âw¯¹Âvµ¹¼x¶¸¸x¶¸³x¶·°y··°y··°y··°y··°y··°y··°y··°y··°y··ÿ–ÿš' ÿš;ÿ—J1ÿ”UDÿ–YUú–^eð•dtç“l‚Þ‘vŽØ™Ñˆ¢ÍŠŽ©É‡’®Æ„–³Äš¶Â~Ÿ¹Â{¤ºÁyªºÁw±º½xµº·xµ¹³yµ¹¯y¶¸¬z¶·¬z¶·¬z¶·¬z¶·¬z¶·¬z¶·¬z¶·¬z¶·¬z¶·ÿ—ÿ›& ÿ›;ÿ˜I1ÿ–SDÿ˜WUú˜[eð—atç–h‚Þ“rÖ‘{šÐ„£ËŒ«ÇŠ‘±Ä†•¶Ãƒ™¸ÁžºÁ{¤»Ày«¼¿w³¼¸x³»²y´»®yµº«zµ¹¨{¶¸¨{¶¸¨{¶¸¨{¶¸¨{¶¸¨{¶¸¨{¶¸¨{¶¸¨{¶¸ÿ—ÿ›& ÿœ:ÿ˜I1ÿ˜QDÿšTTú›Xdðš]tç˜c‚Þ–mÖ“wšÐ‘€¤Ê‰¬Æ³Ã‰”·Â„˜ºÀž¼¿{¥¾¿y®¾¹x²¾²y²½­z³¼©{´º¦{µ¹¤|¶¸¤|¶¸¤|¶¸¤|¶¸¤|¶¸¤|¶¸¤|¶¸¤|¶¸¤|¶¸ÿ˜ÿœ& ÿœ9ÿ™H1ÿ™ODÿœRTûUcñZsç›_Þ™iÖ–ršÏ“|¥Ê‘…­Å´Ã‹’¸Á…–»¿€¾½{¥Á»y¯Á²z°À¬{±¾¨{³½¥|´»¢}µ¹ }¶¸ }¶¸ }¶¸ }¶¸ }¶¸ }¶¸ }¶¸ }¶¸ }¶¸ÿ™ÿ& ÿ9ÿ™G1ÿ›MCÿžOSûŸRcñ VrèŸ[€ßdŽ×šmšÐ—w¤Ê”­Å’ŠµÂŽ¹¿‡•½½€œÁ»{§Ä³z­Ä«{¯Â¦|±¿£}²½ ~´»žµ¹œ¶¸œ¶¸œ¶¸œ¶¸œ¶¸œ¶¸œ¶¸œ¶¸œ¶¸ÿ™ÿž& ÿ8ÿšG1ÿœKBÿ MRü¢Pbò£Sqé£Wà¡^ŒØžg˜Ð›q£Ê˜{­Å•…´Â’º¾Š’¿º›Å·|©É«|«Ç¤}®Ã ~°À²½›€³»™µº˜¶¸˜¶¸˜¶¸˜¶¸˜¶¸˜¶¸˜¶¸˜¶¸˜¶¸ÿšÿž& ÿž8ÿšF2ÿžIBÿ¢JQý¤M`ó¦Poê§T}á¦XŠÚ¤b–Ò¡k¡Ëu«Æš€³Â˜Šº¼ŽÂ¶ƒ™Ë¬}¦Î¢ªÉ€­Äš°À˜‚²¾—ƒ³¼•ƒµº”ƒ¶¸”ƒ¶¸”ƒ¶¸”ƒ¶¸”ƒ¶¸”ƒ¶¸”ƒ¶¸”ƒ¶¸”ƒ¶¸ÿšÿŸ& ÿž7ÿ›F2ÿŸGAÿ¤HPþ§J_ô©Lmë«P{ã¬T‡Ü«\“Ô©eΦo§È£z°ÃŸ„¸»–‹Ä°Œ™Î ƒ¤Ñ™„©Ê–…­Å”…¯Á“…±¾’…³¼‘…´º‘…µ¹‘…µ¹‘…µ¹‘…µ¹‘…µ¹‘…µ¹‘…µ¹‘…µ¹‘…µ¹ÿ›ÿŸ& ÿŸ7ÿ›E2ÿ¡E@ÿ¦FOÿªG]ö­Ikí°Lxæ³Oƒß´UŽÙµ_—Óµi Îµv§Á«|¶°Ÿ…Ä¡•’Î”Ž£Ò‹¨ËŠ¬ÆŽŠ¯ÂŽ‰±¿Ž‰²½Žˆ´»Žˆµ¹Žˆµ¹Žˆµ¹Žˆµ¹Žˆµ¹Žˆµ¹Žˆµ¹Žˆµ¹Žˆµ¹ÿ›ÿ & ÿŸ6ÿœD1ÿ£C?ÿ¨CNÿ­D[ø±Ehð¶Hté»L~ãÀQ‡ßÆ[ŽÖÈk”ƽq¦µ³xµ¥¨Ã”ŸÍ‰œ¢Ò‡”§Ìˆ‘«Ç‰®Ã‰Ž°À‰²¾ŠŒ³¼Š‹´ºŠ‹´ºŠ‹´ºŠ‹´ºŠ‹´ºŠ‹´ºŠ‹´ºŠ‹´ºŠ‹´ºÿœÿ¡& ÿ 6ÿžB1ÿ¥@>ÿ«@Lÿ±@Yú·Adó½DoîÅIwåÎR|ÝÖbÌÎh’¼Ån¤«»v´š±ÁŠªŠË§Ï€Ÿ¨Ì‚™«Çƒ•­Ä„“¯Á…‘±¿†³½‡Ž´»‡Ž´»‡Ž´»‡Ž´»‡Ž´»‡Ž´»‡Ž´»‡Ž´»‡Ž´»ÿÿ¢& ÿ 5ÿ ?0ÿ§==ÿ®hÿOCbÿUG]ÿZKYÿ`MVÿePSÿjQQÿnSOÿrTNÿvULþ{VKýWIý„XHüˆYGûZFû“[Eú˜\Eú˜\Eú˜\Eú˜\Eú˜\Eú˜\Eú˜\Eú˜\Eú˜\½½­Ížß’ÿ ‡ÿ~ÿ)uÿ5#lÿ<*dÿC/^ÿJ4XÿP7TÿV:Qÿ[Kÿd@JÿhAHÿlBFÿpCEÿtDDÿxEBÿ}FAÿG@ÿ†H?ÿŒI=ÿ‘J=ÿ‘J=ÿ‘J=ÿ‘J=ÿ‘J=ÿ‘J=ÿ‘J=ÿ‘J=ÿ‘J®Åž×õ†ÿ|ÿ qÿ$gÿ,_ÿ5Yÿ=!TÿE&OÿK)LÿR,HÿW/Fÿ]0Dÿa2Bÿf3@ÿj5?ÿn6=ÿs7<ÿw8;ÿ|9:ÿ:8ÿ†:7ÿŒ;6ÿ’<6ÿ’<6ÿ’<6ÿ’<6ÿ’<6ÿ’<6ÿ’<6ÿ’<6ÿ’<ÿƒÿ„"ÿ…5ÿƒF$ÿU4ÿ^BÿfPÿn\ù|wfóz€oîwˆwêu}çr•‚äpš…ãnžˆál¢‹àk§ßi«ŽÞh¯Ýg´‘Ýfº‘ÜeÁ’ÜeÉ’ÛeÐ’ÒgÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÿƒÿ„"ÿ…5ÿƒF$ÿU4ÿ^BÿfPÿn\ù|wfóz€oîwˆwêu}çr•‚äpš…ãnžˆál¢‹àk§ßi«ŽÞh¯Ýg´‘Ýfº‘ÜeÁ’ÜeÉ’ÛeÐ’ÒgÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÿƒÿ„"ÿ…5ÿƒF$ÿU4ÿ^BÿfPÿn\ù|wfóz€oîwˆwêu}çr•‚äpš…ãnžˆál¢‹àk§ßi«ŽÞh¯Ýg´‘Ýfº‘ÜeÁ’ÜeÉ’ÛeÐ’ÒgÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÎhÒ‘ÿ„ÿ…"ÿ†5ÿ„F$ÿ€U4ÿ„]Cÿ…ePÿƒm]ø€uhò}~qìz†yèwåu“…âr˜‰àpŒßn¢ŽÝl¦Ük«’Ûi¯”Úhµ•Úg»•ÚfÖÚfÌ–ÓhÏ–ÌiÏ•ÈjÏ–ÈjÏ–ÈjÏ–ÈjÏ–ÈjÏ–ÈjÏ–ÈjÏ–ÈjÏ–ÿ…ÿ‡"ÿ‡5ÿ…F$ÿ„T5ÿˆ\CÿˆdQþ‡k^÷ƒriñ€|së}…{çzŒ‚ãw’‡àt—ŒÞrœÜp¡’Ûn¦”Ùlª–Ùj°˜Øi¶™×h½™×hÆšÓhÌšÌjÌ™ÆkÌšÂlÌšÂlÌšÂlÌšÂlÌšÂlÌšÂlÌšÂlÌšÂlÌšÿ†ÿˆ!ÿˆ5ÿ†F%ÿ‡S5ÿ‹[CÿŒbQþŠj^ö‡qjð„ztꀃ}å}Š„âzŠÞv–Üt›’Úq •Øo¥˜Öm«šÕk°›Õj·œÔi¿ÔiÉÌkÊÆlÉÀmɽnɽnɽnɽnɽnɽnɽnɽnÉÿ‡ÿ‰!ÿŠ5ÿˆF%ÿŠR5ÿŽZCÿaQþŽh^ö‹ojï‡xué„~䀈†à|ŒÝy”‘Úvš•ØsŸ™Õp¥›ÔnªžÓm±ŸÒk¸ Òk¡ÍlÇ¡ÆnÇ¡ÀnÇ¡»oÇ¡¸pÇ¡¸pÇ¡¸pÇ¡¸pÇ¡¸pÇ¡¸pÇ¡¸pÇ¡¸pÇ¡ÿˆÿŠ!ÿ‹5ÿ‰F%ÿQ5ÿ’XCÿ’^Qþe^öŽlkï‹uvè‡~€ã„†ˆÞÛ{“”Øx™™ÕužœÓr¤ŸÑpª¢Ðn²£Ðmº¤ÎlÄ¥ÆoĤ¿pÄ¥ºqÄ¥µqÄ¥²rĤ²rĤ²rĤ²rĤ²rĤ²rĤ²rĤ²rĤÿ‰ÿ‹!ÿŒ4ÿŠF%ÿO4ÿ”VCÿ”[Qþ“a^ö‘hkîŽpvè‹{€â‡ƒ‰ÝƒŠ‘Ù~‘—Õz—œÓw Ðt¤£Ïqª¦Îo³§Ín½¨Çp¨¾qÁ©¸rÁ©´sÁ©¯t¨­t§­t§­t§­t§­t§­t§­t§­t§ÿŠÿŒ!ÿ4ÿ‹F&ÿ“N4ÿ–SBÿ—XPþ–^^ö”djî’lvçvጀŠÜ‡ˆ’Ø‚™Ó}•ŸÐyœ£Îu£§Ìr«ªËp´«Èp¿¬¿s¾¬·t¾­²u¾¬®v¿¬ªv¿«¨wÀª¨wÀª¨wÀª¨wÀª¨wÀª¨wÀª¨wÀª¨wÀªÿ‹ÿ ÿŽ4ÿE&ÿ–M3ÿ™PAÿšUOÿšZ]÷˜`iï•huè’p€á{ŠÜ‹„“Ö†ŒšÒ€“¡Î{š¦Ìw¢ªÊt«®Èr¸¯Àt¼¯·u¼°°v¼°«w¼¯¨x½¯¥y¾­£y¾­£y¾­£y¾­£y¾­£y¾­£y¾­£y¾­£y¾­ÿ‹ÿŽ ÿ4ÿD%ÿ˜J3ÿ›M@ÿQNÿW[øœ\hðšctè—jâ“uŠÜ€“ÖŠ‰›Ñ„£Í~˜©Éy¢®Çu­±Ätº³·v¹³¯x¹³ªyº³¦zº²£{»± {¼°Ÿ|½®Ÿ|½®Ÿ|½®Ÿ|½®Ÿ|½®Ÿ|½®Ÿ|½®Ÿ|½®ÿŒÿ ÿ4ÿ’C%ÿšH2ÿJ?ÿŸNMÿ SZù XfñŸ_rêœe}ã˜oˆÜ“z’Ö„›Ðˆ£Ë–«Ç{¡±Åv°µºw·¶¯y·¶¨z¸¶£|¸´ |¹³ž}º²œ~»±›~¼°›~¼°›~¼°›~¼°›~¼°›~¼°›~¼°›~¼°ÿÿ ÿ‘4ÿ”C$ÿ›F1ÿ H>ÿ¢KKÿ¤PXú¤Udó¤Zpë¢a{äŸi…Þšsו~™ÐŽˆ£Ê…“¬Ä} ´½x°¹¯yµ¹¦{¶¸¡}·¶~¸µ›¹´™º³˜€º²—€»±—€»±—€»±—€»±—€»±—€»±—€»±—€»±ÿÿ ÿ‘4ÿ—B$ÿC0ÿ¢E=ÿ¥HIÿ¨LUü©QaõªWlî©]wç¨cá¤m‹Öžy–Ë•ƒ¢À‹Ž­¶ƒš¶®~ª»¤|³¼ž~µºš€··˜¸µ–¹´•‚º³”‚º²“‚»±“‚»±“‚»±“‚»±“‚»±“‚»±“‚»±“‚»±ÿŽÿ‘ ÿ’4ÿ™A#ÿŸA/ÿ¤B;ÿ¨EGÿ¬ISþ®N^õ°Shì²Zrä³a{Û¯n„̦v”Àœ~¢´’ˆ®©Š”· …¤½™‚±¾•ƒ´»“„¶¸’„¸¶‘„¹´„¹³„º²„º²„º²„º²„º²„º²„º²„º²„º²ÿÿ’ ÿ“4ÿš?"ÿ¡?.ÿ§@:ÿ¬BEÿ°FPù³KZð·Rcè»Ykß½drѶl‚Ĭs“¶£z¡ª™ƒ®ž’·”Ÿ¾Ž‹±¿Œ‰³¼Œ‰µ¹Œˆ·¶Œˆ¸µŒ‡¹´Œ‡º³Œ‡º²Œ‡º²Œ‡º²Œ‡º²Œ‡º²Œ‡º²Œ‡º²Œ‡º²ÿÿ’ÿ”4ÿœ=!ÿ£<-ÿª=8ÿ¯@Bÿ´DLõºIUì¿Q\äÆZaØÅboɼi»²p’­ªw  ¡€­“›‹·‰–›½ƒ•¯¿„‘³¼†Žµ¹‡¶·‡Œ·¶ˆ‹¸µ‰Š¹´‰Šº²‰Šº²‰Šº²‰Šº²‰Šº²‰Šº²‰Šº²‰Šº²ÿÿ“ÿ•4ÿž; ÿ¥9+ÿ¬:5ÿ³=?ûºBGñÁHNèÉQRßÑ[YÏÊ`mÁÂg€²¹m¤±tŸ—ª}«Š¤ˆµ —»xŸ¬¾|𳼕´º’¶¸ƒ··„¸µ„¹³…º²…º²…º²…º²…º²…º²…º²…º²ÿ‘ÿ”ÿ–3ÿ 8ÿ¨6)ÿ°82ÿ¸:;öÀ?AìÊGEãÖTEÖÙWXÇÐ^k¸Èd~ªÁkŽœºrœŽ´z¨€®…²v«”¸o«©ºr¥µºwµ¹z™¶·}–·¶~“¹´‘º²€»±€»±€»±€»±€»±€»±€»±€»±ÿ’ÿ•ÿ—3ÿ¢5ÿ«3'ÿ´4/ù¾65íÉ=8âÖH8ÙàMEÍßVV¿Ø\i°Ðb{¡Éh‹“Ão™…¾w¤xºƒ­n¸“³h¸¨¶i²¸¶o§·¶s¡¸µvœ¹´x™º³z–»±{•¼°{•¼°{•¼°{•¼°{•¼°{•¼°{•¼°{•¼°ÿ“ÿ–ÿ™3ÿ¥0ÿ¯0#ýº/)ðÆ2-ãÔ;,Öà@:ËåHLÀáN\³ÝVl¥Ø]z˜ÒeˆŠÎm”}ÉvŸsă§lÀ‘¬g¾¡¯e¾¶¯f´»±k«»±n¥»±q ¼°s½¯tš½®tš½®tš½®tš½®tš½®tš½®tš½®tš½®ÿ”ÿ˜ÿ1ÿ©-ÿ´*õÂ)"äÑ-!Õà3,ÉèX—ñFe‹ëOpåXzzßd‚sÚmˆmÖvhÓ’dЈ•`Ï’˜^Ι\Í©š[ι™YÍÈšZÅÊœ\½É^¸Éž^¸Éž^¸Éž^¸Éž^¸Éž^¸Éž^¸Éž^¸Éžÿš ÿŸÿ¬ø¾ØÖ Èèºô"'®ú-9¢ú6J–ú?X‹õHc‚îRmzè\uräd{màm€hÝu…dÚ~ˆ`؆‹]ÖZÕ˜XÔ¢WÔ®‘VÔ¼VÔÍVÍÑ’WÈÑ“WÈÑ“WÈÑ“WÈÑ“WÈÑ“WÈÑ“WÈÑ“WÈÑ“ÿœ ÿ£ÿµÔÉ ÈÚ ¹ô¬ÿ#*¡ÿ.;•ÿ8I‹ÿBU‚øL_zòVgsî^mkêdrfçlwbätz_â|}\áƒZß‹‚WÞ“ƒUÝœ…TÜ¥†Rܯ†RÜ»†QÜÌ…RÚÚ…RÚÚ…RÚÚ…RÚÚ…RÚÚ…RÚÚ…RÚÚ…RÚÚ…ÿ  ÿ­ÔÀÆÎ¹ã «ÿŸÿ$*”ÿ09Šÿ:EÿFOzýQXrøX^kõ^ceòeh`ïlk]írnZëypWê€rUé‡tSçvQæ–wPæžxNå§yMå¯zMä»zLäÅzLäÅzLäÅzLäÅzLäÅzLäÅzLäÅzLäÅzÿ¤ظÄÄ·Óªó žÿ“ÿ'(‰ÿ35€ÿ??yÿJGpÿQNiÿWSbý]W^ûd[Zùj^W÷p`TövbRô|dPóƒeNòŠgLñ‘hKð˜iJðŸjIï§kHï°lGî·lGî·lGî·lGî·lGî·lGî·lGî·lGî·lݯżµÊ¨Ûœÿ ‘ÿ‡ÿ*#~ÿ6-vÿA6mÿHÿk2<ÿp3:ÿu49ÿz57ÿ€66ÿ†75ÿŒ83ÿ”83ÿ˜93ÿ˜93ÿ˜93ÿ˜93ÿ˜93ÿ˜93ÿ˜93ÿ˜9§Ã—Ôˆä€ÿ rÿgÿ_ÿ Wÿ& Qÿ/Lÿ7Gÿ>CÿE@ÿK=ÿP;ÿU9ÿY7ÿ^!5ÿb"4ÿg#2ÿl$1ÿr%/ÿw&.ÿ}'-ÿ„(+ÿ‹)+ÿ‘)+ÿ‘)+ÿ‘)+ÿ‘)+ÿ‘)+ÿ‘)+ÿ‘)+ÿ‘)ÿvÿs ÿr1 ÿqCÿqP&ÿuY3ÿub?ÿsjIÿptSÿn~[ük‡aùigög–kôeœnòc¡qñb¦sïa«uî`°vî^µwí^»xì]Ãyì\Ëzë[Øzæ]Þzß^áyØ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÿvÿs ÿr1 ÿqCÿqP&ÿuY3ÿub?ÿsjIÿptSÿn~[ük‡aùigög–kôeœnòc¡qñb¦sïa«uî`°vî^µwí^»xì]Ãyì\Ëzë[Øzæ]Þzß^áyØ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÕ`ãyÿvÿsÿt1 ÿrBÿtO'ÿxX3ÿy`?ÿwiJÿsqTÿq|\ûn†c÷kŽiôi”mòg›qðe tïd¥víbªxìa°yë`µ{ë_¼|ê^Ä}ê]Í}ç]Ù}á_Þ}Ú`à|Ñbá}Ïbá}Ïbá}Ïbá}Ïbá}Ïbá}Ïbá}Ïbá}ÿwÿtÿu1 ÿsBÿwM'ÿ{V4ÿ|_@ÿzgKÿwoUþsz^úqƒeönŒkók“pði™sîgŸwìe¥yëdª{êb¯}éaµ~è`½è_Å€è^Ðâ_Ú€ÛaÞ€Òb߀ËcßÊdßÊdßÊdßÊdßÊdßÊdßÊdßÿxÿuÿv1 ÿtBÿzL'ÿU4ÿ€]@ÿ~eLÿznVþvw_ùtfõpŠmñm‘rîk˜vìižyëg¤|ée©~èc¯€çb¶‚æa½ƒæ`Ç„å_Ó„ÝaÚ„Óc݃ÌdÜ„ÆeÜ„ÅeÜ„ÅeÜ„ÅeÜ„ÅeÜ„ÅeÜ„ÅeÜ„ÅeÜ„ÿyÿvÿw0 ÿvBÿ~K'ÿ‚S4ÿƒ\@ÿ‚dLÿlVýzt`øwhósˆoðptím–yêk|èh£çf©‚åe¯„äc¶…äb¿‡ãaɇàaÕ‡ÕdÚ‡ÍeÚˆÇfÙˆÁgÙˆ¿gÙˆ¿gÙˆ¿gÙˆ¿gÙˆ¿gÙˆ¿gÙˆ¿gÙˆÿzÿxÿy0 ÿxAÿI'ÿ†R3ÿˆZ@ÿ‡bLÿƒiWü~qa÷{{iòw…qîswëp”|èm›€æj¢ƒäh¨†ãf¯ˆâd·ŠácÁ‹áb΋ØdÖ‹ÍfÖ‹ÆgÖŒÀhÖŒ»iÖŒºiÖŒºiÖŒºiÖŒºiÖŒºiÖŒºiÖŒºiÖŒÿ{ÿyÿz0 ÿ|?ÿ…H&ÿŠP3ÿŒX@ÿ‹_LÿˆgWü„naöxjñ{‚ríwŠyés’~æo™ƒäl¡‡âj¨Šàg¯Œße¸ŽÞdÄÛdÒÎgÓÆhÓ¿jÓºkÓµlÓ´lÓ´lÓ´lÓ´lÓ´lÓ´lÓ´lÓÿ|ÿzÿ{0 ÿ>ÿ‰F&ÿN2ÿ‘V?ÿ]KÿŽdVü‰kaö„skð~sì{‡zèvär—†ánŸŠßk§ŽÝh°Üf»’ÛeÊ“ÐhÑ“ÆjД¾kД¸lД³mД¯nÑ“®nÑ“®nÑ“®nÑ“®nÑ“®nÑ“®nÑ“®nÑ“ÿ}ÿ{ÿ|/ ÿƒ<ÿE%ÿ“M1ÿ•S>ÿ”YJÿ’`Uýh`öŠpjð„ytëƒ|æzŒƒâu•ˆßqžÝm§‘Ûi±”Ùg¿–ÔgΗÇk͘½l͘¶n͘°o͘¬pΗ©qΖ¨qÏ–¨qÏ–¨qÏ–¨qÏ–¨qÏ–¨qÏ–¨qÏ–ÿ~ÿ|ÿ~/ ÿ†;ÿ‘C$ÿ–K0ÿ˜P<ÿ˜UHÿ–\Tý“c_÷kiðŠtsë„|æ~‰„áx’‹ÝsœÚn¦•Øj³™ÖhÅ›ÉkË›½nÊœ´oÊœ®qÊœªrË›¦sËš£sÌ™¢t͘¢t͘¢t͘¢t͘¢t͘¢t͘¢t͘ÿÿ}ÿ/ ÿ‰:ÿ”B#ÿ™G/ÿ›L;ÿœRFÿ›XRÿ™_]ø•fhñnrëŠy{僄„à|ŒÜvš“Øo¦™ÒkµÎjÈŸ¾nÈŸ³qÇ ¬rÇ §tÈŸ£uÉž vÊžvË›vËšvËšvËšvËšvËšvËšvËšÿ€ÿ~ÿ€/ ÿŒ8ÿ—@"ÿœD-ÿŸI9ÿ NDÿ UOüž[Zõœbeî—joè‘tyáŠƒÙƒŠŒÏ{••Èu œÃp®¡¾o¿£³rÅ£ªtÅ£¤vÅ£ wÆ¡xÇ ›xÈž™yʘyÊœ˜yÊœ˜yÊœ˜yÊœ˜yÊœ˜yÊœ˜yÊœÿ€ÿÿ/ ÿ7ÿš?!ÿŸB,ÿ¢F7ÿ¤LBÿ¤RL÷¤XWï£_aç fkàšquÕ“|ËŠ…–»{šžµv§¤°t¸§¨v§¡xæyÄ¥šzÅ£˜{Æ¢–{Ç ”{Éž”|É”|É”|É”|É”|É”|É”|Éÿÿ€ÿ‚.ÿ‘6ÿœ< ÿ¡@*ÿ¥D4ÿ¨J?ú©PIòªVRêª]\â©ff×¢orË™xÁ¸ˆŠ—¯• ¨|¢¦£z²©žzÁ©™|Á¨–}æ”~Ĥ’~Å£‘~Ç¡~ÈŸ~Éž~Éž~Éž~Éž~Éž~Éž~Éžÿ‚ÿÿ„. ÿ”5ÿž:ÿ¤>(ÿ¨B2ÿ¬G;ö¯MDí±TMå³[UܰeaΨlqßt€¸–|®†˜¥ˆ‘¡ƒ§—€­«“€¿«‘Á©Â§ŽÃ¥Å£Æ¢ŒÈŸŒÈŸŒÈŸŒÈŸŒÈŸŒÈŸŒÈŸŒÈŸÿ‚ÿÿ†- ÿ–4ÿ 9ÿ¦<&ÿ«@/û°E8ò´K?é¹SFá½\MÓ¶b`Æ­ip»¥q°yŒ¥•‚—›¡“Š™§Œ‡©«ˆ‡¿¬ˆ‡Àªˆ†Â¨ˆ…戅Ťˆ„Æ¢ˆ„È ˆ„ÈŸˆ„ÈŸˆ„ÈŸˆ„ÈŸˆ„ÈŸˆ„ÈŸˆ„ÈŸÿƒÿ‚ÿˆ+ ÿ™2ÿ¢7ÿ©9$ÿ¯=,÷µB3í»I9åÂR>ÚÂXL̺`_¿²go³«n~¨£v‹œ~—’—‰ ‰’–§‚¥«~º¬€Àª‹Â¨‚ŠÃ¦ƒ‰Å¤ƒˆÆ¢„‡È „‡ÈŸ„‡ÈŸ„‡ÈŸ„‡ÈŸ„‡ÈŸ„‡ÈŸ„‡ÈŸÿ„ÿƒÿ‹* ÿœ1ÿ¥4ÿ¬6!þ³:(ó»@-éÃH1áËQ7ÒÇVKÅÀ^]¸¸en¬±l} ªsŠ”¤{•ŠŸ†ž€›’¥y˜¢ªt˜·«w•Á©z‘§|Ã¥}Å£~ŒÆ¡ŠÈŸŠÈŸŠÈŸŠÈŸŠÈŸŠÈŸŠÈŸŠÈŸÿ…ÿ„ÿŽ( ÿŸ1ÿ§2ÿ°3ù¹6"îÂ=&æÍG&ÛÓL5ËÌTI¾Å\[±¾cl¤¸jz˜²q‡Œ¬y“¨‚œw¤£p¢Ÿ§l¢´¨nŸÂ§r™Ã¦u•Ĥw’Æ¢xÇ¡zŽÈŸzŽÉžzŽÉžzŽÉžzŽÉžzŽÉžzŽÉžzŽÉžÿ†ÿ…ÿ‘& ÿ¡/ÿ«.ÿµ/ô¿2éË:ßÙDÑÚJ3ÄÒRG·ËZY©ÆaiœÀgxºn„„¶vy²€˜o¯Ÿh­£d­²¤eªÅ¤j¢Å£mÆ¢p™Ç¡r–ÈŸt“Éu“Êu“Êu“Êu“Êu“Êu“Êu“Êÿ‡ÿ‡ÿ•$ ÿ¤+ ÿ¯)ú»)ìÈ,ÞØ7ÓáAÉßI0¼ÚQD¯ÓXV¡Í_f”ÈetˆÄl€|ÀtŠq½“i»Œ™b¹œ^º±ž]¸Éžb®ÈŸf¦ÈŸi¡ÉžkÊnšË›n™Ë›n™Ë›n™Ë›n™Ë›n™Ë›n™Ë›n™Ë›ÿˆÿ‰ÿš#ÿ¨' ÿµ" ñÄ àÕ$ Ñá0Çæ=$½ãF4²àND¦ÜVR™×]aŒÒco€ÏkztÌs„kÊ~‹bÈŒ‘\Èœ•Yȱ–WÈΖ[»Í˜^²Ì™a«Ì™d¦Í™g¢Í˜g Í—g Í—g Í—g Í—g Í—g Í—g Í—ÿŠÿ‹ÿŸ!ÿ® ø½ãÑÐá Åê.ºé:)°çC9¤äJH˜âPVŒàWb€Ý_lvÛhulÚr}cØ~ƒ\ØŒˆWØ‹T×°TØÍŒUËÓWÀÒ‘Z¸Ñ“\²Ñ“_¬Ñ“`ªÑ“`ªÑ“`ªÑ“`ªÑ“`ªÑ“`ªÑ“`ªÑ“ÿŒÿÿ¥ÿµÚÊ ÐáÄë ¸ï,­î7.¢ì@=—ëHJŒéOVèV`vç^ilçepdæpw^ã||Yà‰€VÞ—ƒSݦ„Qܸ…QÝÔ„SÐÚ‡TÆØ‰V¿×ŠX¸Ö‹Y¶Ö‹Y¶Ö‹Y¶Ö‹Y¶Ö‹Y¶Ö‹Y¶Ö‹Y¶Ö‹ÿŽ ÿ—ÿ­Ù¿ ÌÎ Ãë¶õ«õ,!¡ô70–ó@>‹óHJóPTwóW]mó]deðfj_ípnZêzrVç…vSå‘yQäž{Oã¬|Mã½|MãÙ|PØà|QÎàRÆÞSÄÞSÄÞSÄÞSÄÞSÄÞSÄÞSÄÞÿ’ ÿ  Û·ÊÃÀÒ µô©ûŸü,#”ü71ŠüA=ýIGxýQPnýWWeú^\`öfa[ôoeVñxhSï‚kPîŒmNì—oLë£qJê°rIêÁrHêØrKãärNØæsNÕçtNÕçtNÕçtNÕçtNÕçtNÕçtNÕçtÿ– Þ¬˺½Ç²Ø§ÿœÿ!’ÿ.#‰ÿ9/€ÿB9wÿJBmÿPIeÿVN_ÿ^SZþeVUümZRúu\Oø~_L÷‡aJõ‘bHôœdFó¦eEò³fDòÁgCòÔgEîçgFëègFëègFëègFëègFëègFëègFëègî¢Í´¼¾¯Í¤Þšÿ ÿ$‡ÿ0 ~ÿ;*tÿB2kÿH9cÿN?]ÿUCXÿ]GSÿdJPÿkMMÿrOJÿyQGÿ‚SEÿ‹TCþ”VAýžW@ý¨X?ü³Y>ü¿Z>ûÑZ=ûÛZ=ûÛZ=ûÛZ=ûÛZ=ûÛZ=ûÛZ=ûÛZÒ­½¸®Å¡Õ–÷ ÿ„ÿ&|ÿ1qÿ8"hÿ>)`ÿE/ZÿL3TÿS7PÿZ:Lÿ`Fÿm@DÿtBAÿ{C?ÿƒE=ÿŒF;ÿ•G:ÿžI9ÿ§J8ÿ±J7ÿ¾K7ÿÂK7ÿÂK7ÿÂK7ÿÂK7ÿÂK7ÿÂK7ÿÂK¿³®¾ Í’Þ‰ÿ ÿwÿ# mÿ*dÿ1\ÿ8Uÿ@"PÿH&LÿO)HÿU+Dÿ[-Bÿa/?ÿg1=ÿm2;ÿs39ÿz57ÿ‚65ÿ‹73ÿ”82ÿœ91ÿ¤:0ÿ¯;0ÿ²;0ÿ²;0ÿ²;0ÿ²;0ÿ²;0ÿ²;0ÿ²;°¸ Ç‘Ø„ï|ÿ oÿfÿ^ÿ! Vÿ)Pÿ2Kÿ:FÿABÿH?ÿN<ÿS9ÿY 7ÿ^!5ÿd"3ÿi#1ÿp$/ÿw%-ÿ~&,ÿ‡'*ÿ()ÿ—)(ÿ *(ÿ£*(ÿ£*(ÿ£*(ÿ£*(ÿ£*(ÿ£*(ÿ£*¡Â‘Ñ‚áxÿlÿ`ÿ WÿOÿHÿ Cÿ)?ÿ1 ;ÿ8 8ÿ>5ÿD2ÿI0ÿN.ÿS,ÿX*ÿ])ÿc'ÿi%ÿo$ÿw"ÿ~!ÿ…ÿÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿhÿd#ÿ_/ÿ^@ÿcKÿgT%ÿh]/ÿfg9ÿdrAÿb}Hÿ`‡Nÿ]Rÿ[˜VÿZžYÿX¤[ÿWª]þV°_ýUµ`üT¼aüTÄbûSÍcùRÜcöRæcñSêcìTícæVïbàWðcàWðcàWðcàWðcàWðcàWðcàWðcÿiÿe#ÿ`.ÿ_@ÿfIÿjS%ÿk\0ÿie:ÿgpBÿd{Iÿb…Oÿ_ŽTÿ]–Xÿ[[ÿZ£]ýX©_üW¯aûVµbúU¼dúUÄeùTÎe÷SÝfóSæfîUêfçVíeáXîeÛYïfÛYïfÛYïfÛYïfÛYïfÛYïfÛYïfÿjÿf"ÿa.ÿ`?ÿiHÿmQ&ÿn[0ÿld:ÿinCÿgyKÿdƒQÿaŒVÿ_•Zÿ]œ]ý[¢`ûZ©búY¯dùXµeùW¼gøVÅh÷UÏhõTàiðUæiéWêhâYìhÛZíiÓ[îiÓ[îiÓ[îiÓ[îiÓ[îiÓ[îiÓ[îiÿjÿg"ÿb.ÿc>ÿlFÿqP&ÿrY1ÿpb;ÿlkDÿivLÿgRÿd‹Xÿa“\ý_›`û]¡bú[¨eùZ®gøYµh÷X¼iöWÆjõVÑkòUálìWçläYékÜ[ëkÔ\ìlÍ]ílÍ]ílÍ]ílÍ]ílÍ]ílÍ]ílÍ]ílÿkÿh!ÿc-ÿg<ÿpEÿtN&ÿvW1ÿt`;ÿpiEÿmsMÿj~TÿfˆZþc‘^ûa™bù_ eø]§hö\­jõZ´lôY½môXÇnòWÔoîWâoæYæoÝ\énÓ]êoÍ^ëpÇ_ëpÇ_ëpÇ_ëpÇ_ëpÇ_ëpÇ_ëpÇ_ëpÿlÿi!ÿe-ÿk:ÿtCÿyL&ÿzU1ÿy]<ÿufEÿppNÿm{Vÿj…\üfaúd—e÷aŸhö_¦kô]­mó\´oòZ½qñYÉrïXÚsèZãsÞ]ærÓ^èsË_ètÆ`ètÁaètÁaètÁaètÁaètÁaètÁaètÁaètÿmÿj ÿf-ÿo8ÿxAÿ}J%ÿR1ÿ~[<ÿ{cFÿvlOÿqwWþm‚^ûjŒcøf•hõdlóa¤oò_¬qð]´sï\¿uî[Ëvê[Ýwà]ãvÓ`åwÊaåxÄbåx¾cåxºdåxºdåxºdåxºdåxºdåxºdåxºdåxÿnÿk ÿh,ÿs6ÿ}?ÿ‚G%ÿ„P0ÿ„X;ÿ`Eÿ|iOÿvrWþq}_ùmˆeöj’jóf›oñc£rïa«uí_µxì]Áyì\Ðzã]ß{Ôaâ{Êbâ|Âdá}¼eá}·fâ|³gâ|³gâ|³gâ|³gâ|³gâ|³gâ|³gâ|ÿpÿlÿi,ÿw4ÿ<ÿ‡E$ÿŠM/ÿ‰U:ÿ‡]Eÿ‚eOÿ|nXývx`ør„gõmŽmñi˜rïf¡vìc«yë`¶|é^Ä~ç^ØØaß~Êc߀ÁeÞ¹gÞ´hÞ°i߀¬i߬i߬i߬i߬i߬i߬ißÿqÿmÿk+ÿ{2ÿ†:ÿŒC"ÿK-ÿS8ÿZCÿ‰bMÿƒiWý|r`øvgôqŠnðl•tíhŸyêdª}èa·€æ_È‚ÝaÛƒÌdÜ„ÀfÜ…¸hÛ…±jÛ…­kÜ„©l݃¦lÝ‚¦lÝ‚¦lÝ‚¦lÝ‚¦lÝ‚¦lÝ‚¦lÝ‚ÿrÿoÿo)ÿ0ÿŠ8ÿ‘A!ÿ”J,ÿ•Q6ÿ“XAÿ`Kû‹gUõ„o_ð}zgëw…oçrvãm›|Þh¦Úe³„ÕcĆÏdÚ‡ÁgÙˆ·i؉¯k؉ªmÙˆ¦nÚ‡£nÚ† oÛ… oÛ… oÛ… oÛ… oÛ… oÛ… oÛ…ÿrÿpÿr(ÿ‚. ÿŽ6ÿ•@ÿ™H)ÿ™O4ÿ˜U>ú–\Iô’dSíŒk]ç…vfáoÛxŒwÓr–~Ím¡„Éj­‰Åh»‹ÁhÐŒ¶kÕ®mÕ§oÖŒ£pÖ‹ŸqØŠqÙ‰›rÚ‡›rÚ‡›rÚ‡›rÚ‡›rÚ‡›rÚ‡›rÚ‡ÿsÿpÿu&ÿ†, ÿ‘6ÿ™@ÿœF'ÿL1üR;ôœYEí™`Oæ”hYߎscÕ†}n͇xÆx‘€Às›‡»o§Œ¶m´³lÈ‘¬nÒ‘¥pÓ rÔœsÕ™tÖŒ—tØŠ–uÙ‰–uÙ‰–uÙ‰–uÙ‰–uÙ‰–uÙ‰–uÙ‰ÿtÿqÿx$ÿ‰+ ÿ•5ÿœ>ÿ C$ÿ¢I.÷£P7ï¢VAç¡]JßgTÔ•obËxnÃ…‚y»Œ‚µy–‰¯u¡Žªr¯’¦qÁ”¡sДœtÑ’˜vÒ‘–wÓ”wÕ’wÖŒ‘xØŠ‘xØŠ‘xØŠ‘xØŠ‘xØŠ‘xØŠ‘xØŠÿuÿrÿ{#ÿŒ) ÿ˜4ÿŸ<ÿ£A"û¦F*ò¨M3ê©T<â©[D×£cSÌšlb“unº‹~y²…‡ƒª‘Ф{œžxª”šv»–—wÏ–”yД‘zÑ’zÓŽzÔzÕŒz׋Œz׋Œz׋Œz׋Œz׋Œz׋Œz׋ÿuÿsÿ}!ÿŽ) ÿ›4ÿ¢9ÿ¦>÷ªD&î®J.å±R5ܯYAϨaRÅ ia»˜rn±‘zy©‹ƒƒ¡…‹š˜‘”~¥–|¶˜}Í—Œ~Ï•Š~ГŠ~Ò‘‰~Ó‰}Õˆ}Ö‹ˆ}Ö‹ˆ}Ö‹ˆ}Ö‹ˆ}Ö‹ˆ}Ö‹ˆ}Ö‹ÿvÿtÿ€ ÿ‘( ÿž3ÿ¤7þª;ó¯A"ê´H(â¹P.Ô´V@É­_Q¾¥g`´žomª—wx¡‘€‚™ŒŠ‹‘‡•‘‹„¢–†ƒ²™ƒ„˘„ƒÎ–„ƒÐ”„‚Ò’„Ó„ÔŽ„€ÖŒ„€ÖŒ„€ÖŒ„€ÖŒ„€ÖŒ„€ÖŒ„€ÖŒÿwÿtÿ‚ÿ”'ÿ 2 ÿ§4ú®8ïµ=æ¼F!Ü¿L,ιT?ñ]P·ªe_­¤ll£tw™˜|‘“†Š‰’‘‚ŒŸ–}Н˜z‹Ç˜|‰Î–}ˆÐ”~†Ò’…Ó„ÔŽ€ƒÖŒ€ƒÖŒ€ƒÖŒ€ƒÖŒ€ƒÖŒ€ƒÖŒ€ƒÖŒÿxÿuÿ…ÿ—&ÿ£/ ÿ«0õ³4ë»:âÄDÕÄH+ȽS=¼¶[N±°c]¦ªjjœ¤qv’Ÿz€‰šƒ‰–Žy“œ•t’¬—q’Øs‘Ï–vŽÐ”x‹Ò‘yŠÓzˆÕŽ{‡ÖŒ{‡ÖŒ{‡ÖŒ{‡ÖŒ{‡ÖŒ{‡ÖŒ{‡ÖŒÿxÿvÿˆÿš%ÿ¦+ þ¯, ñ¹/æÃ6ÝÍ<ÎÈG)ÂÂQ;¶¼YLª¶a[Ÿ°hh•«ot‹¦w~¢€†yŸ‹qœ™’l›©•i›¿–k™Ð”n”Ñ’q‘Ò‘sÔuÕv‹Ö‹v‹Ö‹v‹Ö‹v‹Ö‹v‹Ö‹v‹Ö‹v‹Ö‹ÿyÿxÿŒÿž#ÿª&ø´%ëÀ(áÍ0ÔÒ7ÈÍE'»ÈO9¯ÂWJ£½_X˜¸fe³mqƒ¯u{z«~ƒq¨‰Šj¦–e¥§’b¦½’c£Ò‘gÓj˜Ôm•Õn’ÖŒpØŠpØŠpØŠpØŠpØŠpØŠpØŠÿ{ÿ|ÿÿ¢!ÿ® ò»åÊÚÛ$ÌÙ5ÀÓC$´ÎM6¨ÉUGœÄ]U‘Àdb†¼km{¸svrµ|~j³‡…c±•Š^°¥Œ[±¼[¯Õ_§Õc¡ÖŒfœ×‹h™ØŠj–Ùˆj–Ùˆj–Ùˆj–Ùˆj–Ùˆj–Ùˆj–Ùˆÿ|ÿÿ•ÿ§üµëÆÚÛÍà%Ãß6¸ÛA!¬ÕK3 ÑSC”ÍZQ‰Éb]~ÆigtÃqpkÁ{xd¿†~]¾”‚X½¥…V¾»†U½Û†X³Ú‡\«Ú‡_¦Ú‡a¡Û†cÛ…cÛ…cÛ…cÛ…cÛ…cÛ…cÛ…ÿ~ÿ‡ÿšÿ­Ú¾ ÑÍ ËäÁä%·ã5­á@!£ÞI/—ÛR>‹×YK€Ô`WvÑhamÏpieÍzp^̆uXÌ•yȚ{Qͼ|PÌâ|SÁàU·ß€X±ÞZ«Þ\¦ß\¦ß\¦ß\¦ß\¦ß\¦ß\¦ßÿ€ÿŽÿ¢ ÛµÎÁÆÐ ¾é´é% ªè3 æ>%–åG2‹ãN?€áUIvà]SmÞf[eÝoa^ÝzgX܆kSÜ•oPݦqMÞ»rMßáqNÑçtPÆæwR¾äxS¸äyU²ãzU²ãzU²ãzU²ãzU²ãzU²ãzU²ãzÿƒÿ– Ý«͸ÂÄºÔ ±ï§î% žî3”í='ŠìF3€ëN>vëUGlê[NdêcU]êmZXêw^SêƒbNê‘eJë¡gGì³iFíÐiHæèiKÙëjLÏìmNÇëoOÀêpOÀêpOÀêpOÀêpOÀêpOÀêpOÀêpÿ‰ é бÁ¼·É®Ú ¤õ›õ'’õ4ˆö>'öG2vöN;löTBdöZH]öbMWökQRöuUM÷€XHøZEø›\Bø«^A÷¾_@÷ß`Cîì`Gãñ_HÛñaIÒòcIÒòcIÒòcIÒòcIÒòcIÒòcIÒòcþ•ԩµµÁªÏ ç ˜ýþ)†ÿ5~ÿ@%tÿF-kÿL5cÿR:\ÿY?Vÿ`CPÿhGLÿqJGÿ{LCÿ‡N@ÿ”P>ÿ¡R=ÿ°T;ÿÃU;þáU<ùðU@ðôUCç÷TCç÷TCç÷TCç÷TCç÷TCç÷TCç÷Tۡ۵º¨ÇÖ“ü‹ÿƒÿ+zÿ5qÿ<hÿB&`ÿI,YÿO1SÿV5Nÿ]8Iÿe;Eÿm=Aÿv?>ÿ€A;ÿ‹C9ÿ˜E8ÿ¤F6ÿ²G5ÿÄH5ÿÝI4ÿðI7þøI7þøI7þøI7þøI7þøI7þøI7þøIÉ«¶´¨Á›ÏŽß‡ÿ~ÿuÿ' lÿ/dÿ7\ÿ>VÿE"PÿK%KÿR(FÿX+Aÿ_->ÿg/;ÿo18ÿx36ÿ‚43ÿ61ÿ™70ÿ¥8/ÿ²:.ÿÀ;.ÿÓ;-ÿë<-ÿë<-ÿë<-ÿë<-ÿë<-ÿë<-ÿë<¸°¨¼šÉŒÙõyÿnÿeÿ^ÿ' Wÿ0Qÿ7Kÿ>FÿEAÿL=ÿR9ÿX6ÿ_!4ÿf"1ÿn$/ÿw%-ÿ€&+ÿŒ()ÿ—)(ÿ¢*'ÿ­+&ÿ¹,&ÿÉ-&ÿÉ-&ÿÉ-&ÿÉ-&ÿÉ-&ÿÉ-&ÿÉ-ª·šÅ‹Ó}âuÿiÿ _ÿWÿPÿIÿ&Dÿ. ?ÿ6 ;ÿ= 7ÿC3ÿI0ÿO.ÿU,ÿ[*ÿb'ÿi%ÿr#ÿ{!ÿ†ÿ‘ÿœÿ¥ÿ°ÿ°ÿ°ÿ°ÿ°ÿ°ÿ°œÀŒÎ|ÞpõeÿZÿQÿ IÿCÿ=ÿ8ÿ&4ÿ-0ÿ3-ÿ9*ÿ>'ÿC%ÿI #ÿN !ÿT ÿZ ÿa ÿi ÿr ÿ| ÿ† ÿÿšÿšÿšÿšÿšÿšÿšÿ\ÿW&ÿQ2ÿN<ÿWEÿ[Nÿ\X"ÿ[c+ÿYo2ÿWz8ÿT…=ÿRAÿP™EÿO GÿN§IÿM®KÿL´LÿK»MÿJÃNÿIÍOÿIÝPÿHéPÿHòPûIöPöKùPðMûOêOûPçOüPçOüPçOüPçOüPçOüPçOüPÿ\ÿX&ÿR2ÿQ:ÿZCÿ_Mÿ_W#ÿ^a+ÿ\m3ÿYy:ÿW„?ÿTŽCÿR—GÿPŸIÿO¦KÿN­MÿM´OÿL»PÿKÃQÿKÎRÿJßRÿIêSýJòSøKöSñMøRëOúRåPúSâQúSâQúSâQúSâQúSâQúSâQúSÿ]ÿY&ÿS1ÿT9ÿ]BÿbKÿbU#ÿ`_,ÿ_k4ÿ\w;ÿY‚@ÿVŒEÿT•HÿRžKÿQ¥NÿP¬OÿO³QÿN»RÿMÄSÿLÏTÿKàUÿKëUúLòUôMöUìPøTæQøUßRùVÜSùVÜSùVÜSùVÜSùVÜSùVÜSùVÿ^ÿZ%ÿT1ÿX7ÿa@ÿeIÿfS#ÿd]-ÿbh5ÿ_t<ÿ\BÿYŠGÿV“KÿTœNÿS¤PÿQ«RÿP³TÿOºUÿNÄVÿMÐWÿMâXüLíXöNòXîPõXæSöXßT÷Y×UøYÓUøYÓUøYÓUøYÓUøYÓUøYÓUøYÿ_ÿ[%ÿU0ÿ\4ÿe=ÿjGÿkQ$ÿiZ-ÿfd6ÿcp=ÿ_|Cÿ\‡IÿY‘MÿWšPÿU¢SÿSªUÿR²WÿQºYÿPÅZÿOÒ[üNä[øOí\ðQò[çTô[ÞUõ\ÕVö]ÎX÷]ËX÷]ËX÷]ËX÷]ËX÷]ËX÷]ËX÷]ÿ`ÿ\$ÿV/ÿ`2ÿj;ÿoDÿpN#ÿoW-ÿka6ÿgl>ÿcxEÿ`ƒKÿ\ŽOÿZ˜SÿW VÿV©YÿT±[ÿSº\þQÆ^üPÖ_ùPç_òRî_çUñ_ÝWò`ÒXóaËYõbÅ[õbÃ[õbÃ[õbÃ[õbÃ[õbÃ[õbÃ[õbÿaÿ]#ÿZ-ÿe/ÿo8ÿtAÿvK#ÿuT-ÿq]6ÿlg?ÿhsFÿdLÿ`ŠRÿ]•VÿZžYÿX§\þV°_ýTº`üSÇbùRÜcóSècéUîcÞXðdÐZñeÈ\òfÂ]òf½^òf»^òf»^òf»^òf»^òf»^òf»^òfÿbÿ^#ÿ^*ÿi-ÿt5ÿz>ÿ|H"ÿ{Q,ÿxZ6ÿsc?ÿmmGÿizNÿd†Tÿ`‘Xÿ]œ\ýZ¥`ûX°búV»eøUÊfõTàgìVêgßZígÐ\ïiÆ]ïj¿_ïj¹`ïjµaïj³aïj³aïj³aïj³aïj³aïj³aïjÿcÿ`"ÿb'ÿn*ÿy2ÿ<ÿ‚F!ÿ‚O+ÿX5ÿ{`>ÿuiGÿotNûjUøfŒ[õb—_ó_¡cð\«fîZ¶iìYÄjéXÚkáZêkÐ]ìmÅ_ìn¼aëo¶bìo±cìn­dìn«dím«dím«dím«dím«dím«dímÿdÿa"ÿf%ÿr'ÿ~0 ÿ…;ÿˆEÿˆM)ÿ†U3ÿ‚^=û}fFövpNòr|Uîm‡\êh’bædœfãa¦jà_²mÝ]¿oÚ]ÓpÒ^êpÄ`érºbès³dès­eés©fér¦gêq¤gêp¤gêp¤gêp¤gêp¤gêp¤gêpÿeÿb!ÿi#ÿw%ÿ‚/ ÿŠ9ÿŽCÿL&ÿS0ùŠ[:ó…cDílMèywUãt‚]ÞncÙi—iÓf¡nÏc¬qËa¹tÈaÊuÅaåv¹dæw°fåwªhæw¥iæv¢jçuŸjèsžkésžkésžkésžkésžkésžkésÿfÿc!ÿm ÿ{#ÿ‡. ÿ8ÿ“Aÿ•J#ú”Q-ó‘Y7ì`Aå‡iJßtSÖz~]ÏtˆeÊo‘lÅk›qÁh¦u½f²xºeÂz·eÝ{®hã{§jã{¢käzžlåx›måw™mçv˜nçu˜nçu˜nçu˜nçu˜nçu˜nçuÿgÿd ÿpÿ~"ÿ‹, ÿ“7ÿ˜@ýšH ôšN)ì˜U3å•]<ÝfGÓˆoSËy^Å{ƒf¿uŒn¹q–tµn¡x°k¬|­j»~ªjÒ¤là~žmá}šoâ|—pãz•päy“påw“qæw“qæw“qæw“qæw“qæw“qæwÿhÿd ÿsÿ ÿŽ+ÿ—5ÿ>øŸDï K%çŸR-ßZ7Ó•cFÊŽlSÇu^»~gµ{ˆo¯w‘uªsœz¥p¨~¡o¶žoÊ‚›pÞ–q߀“rá~‘sâ|sãzŽsäyŽsåxŽsåxŽsåxŽsåxŽsåxŽsåxÿiÿfÿvÿ„ÿ’*ÿ›4 þ ;ó£Aê¦H â§O'Ø¢V6Ìš`EÓiR»r^³†zg¬„o¦}v y˜|›v£€—t±ƒ”tÅ„‘u݃vÞvà‹wá}Šwâ{‰väz‰väy‰väy‰väy‰väy‰väy‰väyÿiÿiÿxÿ‡ÿ•(ÿž2 ú¤7ï¨=æ¬DÝ­K$ЦT5ÆŸ^D¼™fR´’o]¬Œwg¤‡€ož‚Šw˜~”}’{ z­„ŠyÀ…ˆzÜ„‡zÝ‚†z߀†zà~…zâ|…yãz…yäy…yäy…yäy…yäy…yäy…yäyÿjÿkÿ{ÿŠÿ˜&ÿ¢0õ¨3 ë®9â³AÖ±G#Ê«R4À¤\C¶ždQ­˜l\¥’tf}o–ˆ†v…‘}Š‚œ‚…€ª…¼†€€Û…€€Ýƒ€Þ€~à€}á}€}ã{€|äz€|äz€|äz€|äz€|äz€|äzÿkÿmÿ~ÿÿ›$þ¥,ñ¬/ç³4 ݺ:еF!ůQ2º©ZB°£bO§j[ž˜re–“znƒvˆ‹Ž|‚ˆ™|†§…y†¹†w‡×…x…݃zƒÞz‚à{á}|€ã{|ãz|ãz|ãz|ãz|ãz|ãzÿkÿpÿÿÿŸ"ú©&í±)âº/Ö¿6ʺD ¿´O1´®X@ª¨`N¡£gZ˜žodšwmˆ–€u€’‹{z–€tޤ„q¶…oŽÑ…q‹Ýƒs‰ßu‡à~v…á}w„ã{wƒäzwƒäzwƒäzwƒäzwƒäzwƒäzÿlÿsÿ…ÿ”ÿ¢õ­ ç¸!ÝÃ&ÐÃ4 ľB¹¹M/®³V>¤®^Lš©eW‘¥mb‰¡uk€~ryšˆyr—”~m–¢‚i•³„g–̓i“Þ‚l߀oŒá~pŠâ|rˆãzr‡äyr‡äyr‡äyr‡äyr‡äyr‡äyÿmÿvÿˆÿ˜ÿ§ï³âÀÕÊÉÇ2 ¾Ã@³¾K,¨ºT<žµ\I”°cUЬk_©rhy¥{or£…vk ‘{fŸŸbŸ±`ŸÊ€bœàe—á~h“â|jã{läymŒåxmŒåxmŒåxmŒåxmŒåxmŒåxÿnÿ{ÿÿú¬Ú» ÕÉ ÍÎÂÌ/ ·É=¬ÅI)¡ÀR8—¼ZF¸aQƒµh[z²pdr¯ykk¬ƒqd«v_©žz[©¯|YªÉ|Z§â{^ ã{a›ãzc—äyf”åwf’æwf’æwf’æwf’æwf’æwf’æwÿpÿ€ÿ’ò£ Ù³ Ͼ ËÌ ÄÓºÒ,°Ï;¥ÌF&šÈP5ÄXA…Á_M|¾gVs¼o^k¹wed¸‚k^¶ŽpYµsUµ®uT¶ÈuS³çvW«ævZ¤æv\ çu_œçt`šèt`šèt`šèt`šèt`šèt`šètÿrÿ† û˜ Ù©εÆÁÀÏ ºÛ±Ú)§Ø7œÔD!’ÑM0‡ÎU<}Ë]GtÉePlÇmWeÅv^^ÄcYÃŽhTÃkQîlOÄÈmNÂímP¸ëoS°ëpU«êpX¦ëpY£ëpY£ëpY£ëpY£ëpY£ëpY£ëpÿwÿÞ Ï®Ĺ»ÅµÓ ®á¦á)à7“ÞB‰ÜL)ÚT5u×\?mÕdHeÓlO_ÒvTYÒYTÑŽ]PÑ`MÒ°bKÓÉbJÒíbKÈòfM¿ñhO¸ðiQ²ðiR¯ïiR¯ïiR¯ïiR¯ïiR¯ïiR¯ïiÿ í–Ò¦IJ¹¼°É©Ø ¡ç™ç* ç7‡æB}åJ)täQ3kãY:dâaA^âkGXâuKSá€OOâSKâ›UIã¬WGäÄWFãéWFÝöYGÐ÷\IÈ÷^JÁö`K½ö`K½ö`K½ö`K½ö`K½ö`K½ö`ÿ‰ÙžÇ¬¹¶®Á¥Îœä •ïï, …ï9|ïAsïI'jîP/bîW5\î_:Vîh?RîqBMï|FIï‰IFð–KCð¦M@ñ¹N?òÛO>ð÷NBæûOCÝûQDÔüSEÏüTEÏüTEÏüTEÏüTEÏüTEÏüTá•˦»°®»¢È˜Õø‰ø ‚ø. yù7pù?hùF"`úM(ZúT-Tú\1Oûe5Kûm8Güw;Cüƒ=?ý?<ýŸA:þ¯C8ÿÆD7ÿêE6üýE;òÿD>êÿD>æÿF>æÿF>æÿF>æÿF>æÿF>æÿFП½¬®µ¢Â•ÏŠÝ„ÿ{ÿtÿ* lÿ3dÿ;]ÿCWÿJ QÿQ$LÿX'Hÿ`*Dÿh,@ÿq.<ÿ{19ÿˆ25ÿ–43ÿ¤61ÿ¶7/ÿÐ8.ÿï9-ÿÿ91ÿÿ93üÿ93üÿ93üÿ93üÿ93üÿ93üÿ9Á¨¯±¢½”ʇØ}óvÿmÿeÿ$^ÿ- Xÿ6Rÿ=LÿEHÿLCÿS?ÿZ<ÿa 8ÿi!5ÿr#1ÿ}%.ÿŠ&+ÿ™()ÿ§)'ÿ¹+&ÿÒ,%ÿï,$ÿÿ-$ÿÿ-$ÿÿ-$ÿÿ-$ÿÿ-$ÿÿ-$ÿÿ-±®£¹”ƆÓyáqÿgÿ_ÿWÿQÿ&Kÿ.Fÿ6 Aÿ= =ÿD9ÿK6ÿQ2ÿX/ÿ_,ÿg)ÿq&ÿ|#ÿ‰ ÿ˜ÿ¦ÿ·ÿÊÿæÿðÿðÿðÿðÿðÿ𤵕†ÏwÞkôbÿYÿ QÿJÿDÿ?ÿ&:ÿ-6ÿ42ÿ:.ÿ@+ÿF(ÿL %ÿR "ÿY ÿb ÿk ÿv ÿ„ÿ’ÿ ÿ­ÿºÿÃÿÃÿÃÿÃÿÃÿ×¾†ÌwÛiç\ýTÿKÿCÿ =ÿ7ÿ2ÿ.ÿ$*ÿ*%ÿ/"ÿ5ÿ:ÿ?ÿEÿKÿRÿZÿbÿlÿw ÿ„ ÿ ÿœ ÿ¢ ÿ¢ ÿ¢ ÿ¢ ÿ¢ ÿ¢ÿP ÿK*ÿD6ÿG:ÿJ?ÿNIÿOTÿO`ÿMl$ÿJy*ÿH….ÿF2ÿDš4ÿC¢7ÿBª8ÿA±:ÿ@¹;ÿ@Á<ÿ?Ë=ÿ>Ü>ÿ>è>ÿ=ó>ÿ=û?ÿ>ÿ>ÿ@ÿ>úCÿ=ôDÿ>îFÿ?îFÿ?îFÿ?îFÿ?îFÿ?îFÿ?ÿP ÿK*ÿE5ÿJ8ÿM=ÿQHÿRRÿQ^ÿOj%ÿMw+ÿJƒ/ÿHŽ3ÿF˜6ÿD¡8ÿC©:ÿB°<ÿB¸=ÿAÁ>ÿ@Ë?ÿ@Ü@ÿ?é@ÿ?ô@ÿ>ýAÿ@ÿ@ýBÿ@öEÿ@ðFÿAéHÿAéHÿAéHÿAéHÿAéHÿAéHÿAÿQÿL)ÿG4ÿM6ÿQ;ÿUFÿVPÿU\ÿRh&ÿPt,ÿM€1ÿJŒ5ÿH—8ÿF ;ÿE¨<ÿD°>ÿC¸?ÿCÁAÿBÌAÿAÞBÿAëCÿ@õCÿ@ýCÿCÿCøFÿBðHÿCêIÿDãJÿEãJÿEãJÿEãJÿEãJÿEãJÿEÿRÿM)ÿJ2ÿP3ÿU9ÿYCÿZMÿYX ÿVd'ÿSq-ÿP}3ÿM‰7ÿK”:ÿIž=ÿG¦?ÿF®AÿE·BÿDÁDÿDÌEÿCßEÿBíFÿB÷FÿCýFùFÿFðIÿFéKÿGâLÿHÛMÿHÛMÿHÛMÿHÛMÿHÛMÿHÛMÿHÿSÿN(ÿN/ÿT0ÿZ6ÿ^@ÿ`Jÿ^U ÿ[`(ÿXm/ÿTy4ÿQ…9ÿN‘=ÿL›@ÿJ¤BÿI­DÿH¶FÿGÁGÿFÍHÿEáIÿDïJÿEøJûGýJñJÿIèMÿKßNÿL×OÿLÏQÿLÏQÿLÏQÿLÏQÿLÏQÿLÏQÿLÿTÿP'ÿR,ÿY-ÿ_2ÿd<ÿfGÿdR ÿa\(ÿ]h0ÿZu6ÿV;ÿR?ÿO˜CÿM¢EÿL«HÿJµIÿI¿KÿHÌLÿHáMÿHîMüHùNòKüMçNýOÝPýPÒRþPÌSÿQÆTÿQÆTÿQÆTÿQÆTÿQÆTÿQÆTÿQÿUÿQ'ÿV)ÿ^*ÿd/ÿj:ÿlEÿlO ÿhY(ÿdc0ÿ`p7ÿ\|=ÿXˆBÿU“FÿSIÿQ¦KÿO°MÿNºOýMÆPúMÙQöLêQòM÷QçPúRÛRûTÎTüUÇVýUÁWþU¼XþU¼XþU¼XþU¼XþU¼XþU¼XþUÿWÿR&ÿZ&ÿb&ÿj,ÿq7ÿsBÿsLÿpV(ÿk`0ÿfk8ÿcw>þ_ƒDû[ŽHùX˜L÷V¡OõU«QóSµSñRÁTïQÐUëQçUæRöVÚTùXÌVúYÃXûZ¼ZûZ·[ûY³\ûY³\ûY³\ûY³\ûY³\ûY³\ûYÿXÿS%ÿ^#ÿg#ÿp*ÿw5 ÿz@ÿzJÿxS&ÿs\/ünf7øir?ôe~Eña‰Jî^“Në\RèY¦UæX°WäW¼XâVÌYÞVäYØVô[ÊX÷]ÀZø^¸\ø^³]ø^®^ø]«_ù\«_ù\«_ù\«_ù\«_ù\«_ù\ÿYÿV#ÿb ÿl ÿu(ÿ}3 ÿ€=ÿGÿP$ù{Y-ôvb6îqm>êlyEæh„KâdŽQÞa˜UÛ^¢YÖ\¬[Ó[¸^ÐZÆ_ÍZß`ÈZòa¾\õbµ^ôb®`õbªaõa¦böa£c÷_£c÷_£c÷_£c÷_£c÷_£c÷_ÿZÿY!ÿfÿpÿz&ÿ‚1 ÿ†;ÿˆDù†M!òƒV+ë~^4åyi=àttEÚoLÓj‰SÏf’XËcœ]Ça¦`Ä_±cÁ^¿d¾^Òeº_ìf²`òf«bòf¥dòe¡eódŸeôcœfõbœfõbœfõbœfõbœfõbœfõbÿ[ÿ\ÿiÿuÿ~$ÿ‡.ÿŒ8ûŽBòŽJë‹R'ä‡[0Ýf:ÓzpEÍuzNÈpƒUÃl[¾i–`ºf d·d«g´c¸i±bÊj®cæj¨dïj¢fïigðhšhñg˜iòf–iód–iód–iód–iód–iód–iódÿ[ÿ_ÿlÿyÿƒ!ÿŒ,ÿ‘6 õ”?ì•Gä“O"ÜŽX-Ò‡b:ÊlEÃ{uN¾vV¸rˆ]´n‘b¯k›f«i¦j¨g³l¥gÃn¢gànžiím™jîl–kïj“lði’lñglòflòflòflòflòflòfÿ\ÿbÿpÿ|ÿ†ÿ)ú–3 ðš<ç›DßšKÓ”U,Ê_9‡iE»qOµ|{W¯x„^ªtc¥q—h¡n¢ll®ošl¾p˜lÙq•mëo‘nìnoíloïjŒoði‹oñg‹oñg‹oñg‹oñg‹oñg‹oñgÿ]ÿdÿrÿÿŠÿ”&ö›0ëŸ8 â¢?ØŸGÍ™R+Ä’]9»ŒfD´‡nN­‚wW§}€^¢y‰dv“i˜sžm”qªqqºrŽqÑsŒrêqŠsëoˆsím‡sîk‡sïj†rðh†rðh†rðh†rðh†rðh†rðhÿ^ÿgÿuÿƒÿŽþ˜#ñŸ,ç¥3ݨ9 Ñ£EÇP*¾—Z8µ’cD­ŒlN¦‡tW ƒ|^š†d•|jyšn‹w¦rˆv¶t…vÌt„wérƒwêp‚wìn‚víl‚vïjvðivðivðivðivðivðiÿ^ÿiÿxÿ†ÿ‘úœí¤'âª,Ö¬4 ˧CÁ¢N)¸œX6¯—aC§‘iM qV™ˆy^“…‚dŒjˆ—oƒ}¤r|³t}|Èu|}ès||êq|{ìo}zím}yîk}yði}yði}yði}yði}yði}yðiÿ_ÿkÿ{ÿ‰ÿ•õ è© ݰ$а2 ƬA¼¦L'³¡V5ªœ_A¢—gLš’oU“Žw]Œ‹€d†ˆŠi…•n|ƒ¡rw‚°tu‚Åutƒçsuêqvëow~ímx}îkx|ðix|ðix|ðix|ðix|ðix|ðiÿ`ÿnÿ~ÿŒÿ™ñ¤ã®Ö¶Ë´0Á°?·«K%­¦T3¤¡]@œeJ”˜lSŒ•t[†‘}bއhyŒ’mtŠžqpˆ­tmˆÁtm‰äso‡êqp„ìorƒímsîkt€ðit€ðit€ðit€ðit€ðit€ðiÿaÿqÿ‚ÿõ ã© Ùµ ϹŸ.»´=±°I#§«R1ž§[>–£cHŽŸjQ†›rY˜z`x•„fr“lm‘œoiªrf¾se‘árhŽëpjŠìnlˆílm†ïkn„ðin„ðin„ðin„ðin„ðin„ðiÿcÿuÿ† ø” Ü¢Ô­ ϸ ɽ¿¼+µ¹;«¶G!¡±P/˜­Y;ªaF‡¦hO£pWx x^rždk›Œifš™mb™¨o_™¼p^™ßo`–ìnc‘ímfŽîkg‹ïji‰ðhi‰ðhi‰ðhi‰ðhi‰ðhi‰ðhÿgÿy ÿŠ ßšÓ¦̱Ç»Á¸Â(®¿8¥¼D›¸N,‘µW8ˆ±^B€®fKx«mSq©vZk§`e¥Šd`£—h[£¦kY£ºlX£ÜkY îk\šïj_–ðia’ñhcñfcñfcñfcñfcñfcñfÿkÿ~ ñÖž̪Ä´¾¾¸È°È$§Æ5 ÃB“ÀL(нT3º\>y·dFqµkNk³tTd±~Z_°‰_Z¯–bV®¥eS®¹fR¯ÛeR«òfU¤òfXŸòfZ›óe\—ód\—ód\—ód\—ód\—ód\—ódÿp ÿ„ݖΣÄ®»·´Â®Í §Î žÍ1 •Ë>‹ÈI#‚ÆR.zÃZ8rÁb@kÀjGd¾sM^½|SY¼ˆWT»•[P»¥]N»¹^M¼Û]K¹÷_N±ö`Qªö`S¥ö`U¡ö`U¡ö`U¡ö`U¡ö`U¡ö`U¡ö`ÿwëŒÓ›Æ¨»±²»ªÇ¢Ó Ö•Ö,ŒÔ:ƒÒFzÐO'rÎX1jÍ`8dËh?^ÊrEXÊ|ITɈMOÉ•QLÉ¥SJɹTIÊÜSGÈ÷UHÀüXJ¸ûYL²ûZN­úZN­úZN­úZN­úZN­úZN­úZÿܓʢ¼¬±µ¨ÀŸË–Ù ‘àŠß,‚ß9yÞCqÝM jÜV(cÛ_/]Úg5XÙq:SÙ{>OÙˆBKÙ–EHÙ¦GFÚºHEÛÛGDØôIBÓÿMDÉÿOEÂÿPG»ÿRG»ÿRG»ÿRG»ÿRG»ÿRG»ÿRæŠÏ›¿§²°§»œÆ“Ñ‹ê…è~è-vè8nèAfçJ_çR#Yç[)Uçd-Pçm1Lçx5Iç„8Fè‘:Cè <@é²>?êË>>èï>=æÿ?=àÿB?×ÿD@ÎÿF@ÎÿF@ÎÿF@ÎÿF@ÎÿF@ÎÿFÖ“Ä£´¬§¶›Á̆ـòyòqò+jò6 có?]óGWóORóW!Mô`$Iôi(Fôs*Bõ~-?õ‹/<ö™1:ö©38÷¾46øá56õù55óÿ47ìÿ69åÿ89åÿ89åÿ89åÿ89åÿ89åÿ8Èž¶©¨²›½ÈƒÔyèsükýdý'^þ1Xþ; SÿCMÿKIÿSEÿZAÿc>ÿl;ÿv!7ÿ‚#4ÿ%2ÿŸ'0ÿ°(.ÿÈ)-ÿê*,ÿÿ*,ÿÿ*/ùÿ*/ùÿ*/ùÿ*/ùÿ*/ùÿ*/ùÿ*¹¦ª®œ¹ŽÅÑuÞmú eÿ^ÿWÿ#Rÿ,Lÿ4Hÿ< CÿD ?ÿL<ÿS8ÿ[5ÿc2ÿl/ÿw,ÿ„)ÿ“'ÿ¢%ÿ´$ÿÌ#ÿí"ÿý"ÿÿ"ÿÿ"ÿÿ"ÿÿ"ÿÿ"ÿÿ¬«¶Â€ÎsÜgé_ÿXÿQÿKÿFÿ&Aÿ-<ÿ58ÿ<4ÿB1ÿI.ÿP +ÿW (ÿ_ %ÿi #ÿt ÿ‚ÿ’ÿ¢ÿ²ÿÈÿåÿúÿúÿúÿúÿúÿúŸ³¿€ÌrÚdäXõQÿJÿ Dÿ>ÿ9ÿ4ÿ%0ÿ,,ÿ2(ÿ8%ÿ>"ÿDÿJÿQÿYÿcÿnÿ|ÿŒÿœÿ¬ ÿ» ÿÓ ÿÓ ÿÓ ÿÓ ÿÓ ÿÓ ‘¼Ér×däTëKÿDÿ=ÿ7ÿ 1ÿ,ÿ(ÿ$ÿ" ÿ'ÿ,ÿ1ÿ6ÿ<ÿBÿI ÿQ ÿZ ÿfÿsÿÿÿœÿ«ÿ«ÿ«ÿ«ÿ«ÿ«ÿD$ÿ?.ÿ<6ÿ@8ÿA=ÿAEÿAQ ÿ@]ÿ?jÿ4ÿB6ÿD;ÿDCÿEO ÿD[ÿAhÿ?uÿ<‚!ÿ:$ÿ8š'ÿ7£)ÿ6¬*ÿ6´,ÿ5½-ÿ4È.ÿ4Ö.ÿ3æ/ÿ3ò/ÿ2ü0ÿ2ÿ0ÿ3ÿ/ÿ6ÿ/ÿ9ÿ/ù;ÿ0ô=ÿ1ñ=ÿ1ñ=ÿ1ñ=ÿ1ñ=ÿ1ñ=ÿ1ÿF#ÿ@-ÿA2ÿF3ÿH8ÿH@ÿILÿHXÿEeÿBrÿ@#ÿ=Œ&ÿ;˜)ÿ:¡+ÿ9ª-ÿ8³.ÿ7½/ÿ6Ç0ÿ6Õ1ÿ6æ2ÿ5ñ2ÿ5û2ÿ5ÿ2ÿ6ÿ2ÿ:ÿ1ú=ÿ3ó>ÿ4í@ÿ4êAÿ4êAÿ4êAÿ4êAÿ4êAÿ4ÿG"ÿA,ÿE/ÿI0ÿL5ÿM=ÿNHÿMTÿKaÿHn ÿE{%ÿBˆ(ÿ?”+ÿ>ž.ÿ=§/ÿ<¯1ÿ<¸2ÿ;Ã3ÿ:Ï4ÿ:á5ÿ:î5ÿ:ø5ÿ:ÿ5ÿ:ÿ5û>ÿ5òAÿ7ëBÿ8åDÿ8áEÿ8áEÿ8áEÿ8áEÿ8áEÿ8ÿH"ÿC,ÿH,ÿN-ÿQ1ÿS9ÿUEÿSQÿQ]ÿNj!ÿKw&ÿHƒ+ÿE.ÿD™0ÿB¢3ÿA«4ÿA´6ÿ@½7ÿ?É8ÿ?Û8ÿ?ê9ÿ?õ9ÿ?ÿ9û@ÿ8ñCÿ:èEÿ<áGÿ<ÚHÿ=ÕIÿ=ÕIÿ=ÕIÿ=ÕIÿ=ÕIÿ=ÿI!ÿD*ÿM(ÿS)ÿW-ÿY6ÿ\Bÿ[NÿXYÿUe"ÿRr(ÿO~-ÿLŠ0ÿJ”3ÿHž6ÿG¦8ÿF¯9ÿE¸;ÿEÄ<ÿDÒ<üDå=øDò=õEþ<ñEÿ>æHÿ@ÜJÿAÒKÿAÌMÿAÉMÿAÉMÿAÉMÿAÉMÿAÉMÿAÿJ ÿH'ÿQ%ÿX%ÿ]*ÿ`3ÿc?ÿbJÿ`Uÿ\a#ÿYm)ÿUy.ÿR„3ÿP6ýN™9ûL¢;úKª=øJ´?÷J¾@õIÌ@ñIáAíJðAêJüBäJÿDØLÿEÌOÿFÆPÿFÀQÿF¾QÿF¾QÿF¾QÿF¾QÿF¾QÿFÿL ÿL$ÿU!ÿ]!ÿc'ÿg1ÿj< ÿjGÿgRÿc\#ÿ_h*û\t0÷Y5õVŠ9òT”<ðR?îQ¦AìP¯CêOºDèNÇDæOÝEáOîEÝNûHÔOÿIÈQÿJÀSÿJºTÿJ¶UÿJ´VÿJ´VÿJ´VÿJ´VÿJ´VÿJÿMÿP!ÿZÿbÿi%ÿm-ÿq9 ÿqDÿoNûkX"õfc)ñco0í`z6é\…;æZ?äX˜BáV¢DßU«FÜS¶HÚRÃJÖRØJÑSìKÌSúMÅTÿN¼VÿOµWÿO°XÿN¬YÿMªZÿMªZÿMªZÿMªZÿMªZÿMÿNÿSÿ^ÿgÿn"ÿs*ÿw5 ÿx@ùwJòsT ìo^(çkj0âgu6Þc€<Ù_ŠAÔ]“FÑ[IÎY¦LËX°NÈW¼PÆVÍQÃWæQ¾W÷R¸XÿS°ZÿS«\ÿR§]ÿR£]ÿQ¢]ÿP¢]ÿP¢]ÿP¢]ÿP¢]ÿPÿOÿWÿbÿlÿt ÿy'ÿ~2ù€< ñFê{Päw[&Ýsf.Õmp7Ðiz>Ëe„DÇbŽIÄ`—MÀ^ P½]ªS»[¶U¸[ÅVµ[ßV²\óW¬]ýW¦^ýV¡`þUž`ÿTœaÿSšaÿSšaÿSšaÿSšaÿSšaÿSÿPÿZÿeÿpÿxÿ$ý„.ó†8 ê†Bã„KÛW#Ñyb/Ëtl8Åov@ÀlF¼hˆK¸f‘Pµc›S±a¥V®`°Y«_¿Z©_Ô[¦`ï[¢aúZcûY™düX–dýW•eþU”eþU”eþU”eþU”eþU”eþUÿPÿ]ÿiÿtÿ}ÿ„!÷‰*í4ä= Ü‹HÑ…T#É^.Âzh8¼uq@·qzG²n„M®kRªh–V§f Y£e«\ d¹^ždÍ^›dê^˜fø]”gù\’hûZhüYŽhýWŽhýVŽhýVŽhýVŽhýVŽhýVÿRÿ_ÿlÿxÿÿˆò%ç“/Þ•8 ÓEÊ‹Q"Â…[.»€e8´{nA¯wwHªtN¥pˆS¡n’Wkœ[™j§^–iµ`”hÈa’iæ`j÷_kø]‹kù\‰lûZˆlüXˆküXˆküXˆküXˆküXˆküXÿTÿbÿoÿ{ÿ…úí“â™(Ø™3Ì•BÄN!¼‹Y-´…b7®k@¨|sH¢y|Nv…T™sŽX•q˜\‘o¤`n±b‹mÃc‰nâb‡oöa†o÷_…où]„oú[ƒoûYƒoüXƒoüXƒoüXƒoüXƒoüXÿVÿdÿrÿ~ÿˆõ‘è˜Ýž Ñž1Çš@¾•L ¶V,®‹`7§†h@¡‚pHœ~yN–{‚T’x‹Yv•]‰t a…s®c‚r¿d€sÞd€tõbtö`sø^~sù\~rúZ~rûY~rûY~rûY~rûY~rûYÿXÿgÿuÿÿŒñ•ã֣ˡ/ž>¹™J°”T+©]6¢‹f?›‡nG•„vN€T‹~ˆY†{’]yža}x«dzx¼eyxÙexyôbyxö`ywø^yvù\yuúZyuûZyuûZyuûZyuûZyuûZÿZÿiÿx ÿ„ ï Ýš Ù¢ ЦÆ¥,½¢<´žH«™R)£•[4œ‘c>•kF‰sM‰†|S„„…X]z›av~¨ds}¹eq~Óeq~òcr}ö`s{÷^tzù\tyú[uyûZuyûZuyûZuyûZuyûZÿ]ÿl ÿ{ öˆ Ü“Õ Ñ¥ ʪÁ©*·¦:®¢F¦žP(žšY3––a<“iD‰qLƒyR}ŠƒWxˆ\s†™`o„¦cl„·dj„Ïdj„ðbl‚ö`m€÷^où\o}ú[p|ûZp|ûZp|ûZp|ûZp|ûZÿ_ÿo ÿ~ãŒÖ—Ï ʨÄ®»­'²«7 ©§D ¤N&˜ W1‘œ_:Š™gCƒ–oJ}“wPw‘€VrŠZm–^h‹£ae‹´cc‹Ìcc‹îae‰÷_g†ø^i„ù\j‚úZkûZkûZkûZkûZkûZÿbÿrø‚ÛϚɣ콲µ²$¬°5 £­B›ªL#’¦U.Š£]8ƒ e@}lGv›tMp™}Sk–ˆXf•”\b”¡__“²`]“É`]“í_^ø^aŒù\cŠú[d‡ûZe†ûYe†ûYe†ûYe†ûYe†ûYÿf ÿwã‡Ó“Êž§»¯µ¶ ®·!¥¶2 ³?”°J Œ­S+„ª[4}¨c]¶xCXµ‚GT´KP´NM³®PK´ÅPK³êPJ±ÿQL«ÿRN¥ÿRP¡ÿRQžÿQQžÿQQžÿQQžÿQQžÿQÿv݉ʗ¾¢³ª©³ ¼˜Æ‘Ì‹Ì%„Ë4 |É@uÈJmÇS#gÅ\*aÄd0\Ãm6WÂv:SÂ?OÁŽBKÁEHÁ®FGÁÅFGÁêFD¾ÿIE¹ÿJG³ÿKI­ÿLJ«ÿLJ«ÿLJ«ÿLJ«ÿLJ«ÿLéÑžµ§ª¯ ¸–ÁŒË„Õ €ÕyÕ.rÔ< lÓGeÒP_ÑY!ZÑb'UÐk,QÐu0MÏ4IÏŽ7FÏ9DЮ;BÐÆ;CÐê:@Íý>>Ëÿ@@ÃÿBA½ÿCB¹ÿDB¹ÿDB¹ÿDB¹ÿDB¹ÿD݈ǘ¸£«« ´•¾‹È€Ñxá táná+hà7aàB\àMWàVSà_Oài"Kàs%Gà~(Dà‹+Bàš-?á«/>âÁ/>âå/<ßú19Þÿ49Ùÿ6:Ðÿ8;Ìÿ9;Ìÿ9;Ìÿ9;Ìÿ9;Ìÿ9Í’¼ ­¨¡±•»‰Å~ÏtÚnëhëbë*]ì5Wì? RìHMìQJíZFícCím@íx=î…!:î“#8ï£$6ð¶&5ñÒ&4ïó&4ìÿ&2ëÿ(2çÿ+3äÿ,3äÿ,3äÿ,3äÿ,3äÿ,Áœ°¦£®–¸‰Ã}ÍqØgæbö\÷W÷'R÷1Mø:HùB DùK AúT>ú\;ûe8ûo5û{2ü‰0ý˜.ýª,þ¿+ÿã*üú*úÿ*÷ÿ*÷ÿ*÷ÿ*÷ÿ*÷ÿ*÷ÿ³£¤«—¶‰Á{ËoÖcß[õUÿPÿKÿ#Fÿ,Bÿ4>ÿ<:ÿC7ÿK4ÿS1ÿ[ .ÿd +ÿo (ÿ| &ÿ‹$ÿœ"ÿ®!ÿÅ ÿéÿüÿÿÿÿÿÿÿÿÿÿÿÿ¦©˜³Š¿{ÊnÕ`ßTçNÿIÿCÿ?ÿ:ÿ%6ÿ,2ÿ3/ÿ:+ÿA(ÿH%ÿO"ÿW ÿ`ÿlÿyÿŠÿ›ÿ­ ÿà ÿã ÿø ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ 𱋽|ÈmÔ_àQæGõAÿ<ÿ 7ÿ2ÿ.ÿ*ÿ#&ÿ)"ÿ/ÿ5ÿ;ÿBÿIÿQÿZÿf ÿt ÿ… ÿ– ÿ¨ÿ¹ÿÐÿãÿãÿãÿãÿãº}ÇmÓ_àPçBí:ÿ5ÿ/ÿ*ÿ &ÿ"ÿÿÿÿ#ÿ(ÿ-ÿ3 ÿ9 ÿAÿIÿSÿ^ÿlÿ|ÿÿÿ¬ÿµÿµÿµÿµÿµÿ9'ÿ32ÿ54ÿ86ÿ8;ÿ6Cÿ3Nÿ1[ ÿ/h ÿ-vÿ+„ÿ)‘ÿ)›ÿ(¤ÿ(­ÿ(µÿ'¾ÿ'Èÿ'Ôÿ'äÿ'ïÿ'ùÿ'ÿÿ'ÿÿ'ÿÿ(ÿÿ+ÿÿ-ÿü/ÿü/ÿü/ÿü/ÿü/ÿÿ:'ÿ41ÿ81ÿ;4ÿ;9ÿ:Aÿ7Kÿ5X ÿ3eÿ1sÿ/ÿ-Žÿ-˜ÿ,¡ÿ,ªÿ+²ÿ+»ÿ+Äÿ+Ðÿ*á ÿ*í ÿ*÷ ÿ*ÿ ÿ+ÿ ÿ+ÿÿ,ÿÿ/ÿ!ü1ÿ"÷3ÿ"÷3ÿ"÷3ÿ"÷3ÿ"÷3ÿ"ÿ;&ÿ50ÿ;/ÿ>1ÿ?6ÿ>=ÿkÿ;xÿ9…ÿ7ÿ7š ÿ6£!ÿ5«"ÿ5³#ÿ4¼$ÿ4Æ%ÿ4Ô%ÿ4æ&ÿ4ñ&ÿ4û&ÿ5ÿ%þ5ÿ&ú6ÿ(ó8ÿ)ì:ÿ)æ<ÿ*æ<ÿ*æ<ÿ*æ<ÿ*æ<ÿ*ÿ=%ÿ=*ÿC(ÿG)ÿI-ÿJ6ÿJAÿIM ÿGZÿEgÿBtÿ@€ÿ>Œ ÿ=•"ÿ<ž$ÿ;¦&ÿ;®'ÿ:·(ÿ:Á(ÿ:Í)ÿ:á)þ:î)û:ù)÷;ÿ)ö:ÿ+ð;ÿ-è=ÿ.á?ÿ.ÛAÿ.ÛAÿ.ÛAÿ.ÛAÿ.ÛAÿ.ÿ>%ÿA&ÿH$ÿL%ÿO)ÿR3ÿQ>ÿQI ÿOVÿLbÿJoÿG{ ÿE†#ÿC‘%ÿBš'ÿA¢)ÿAª*ý@²+ü@¼,û?È-ø?Û-ô@ë-ð@÷-í@ÿ/ë?ÿ1äAÿ2ÛCÿ3ÑDÿ3ËFÿ3ËFÿ3ËFÿ3ËFÿ3ËFÿ3ÿ@$ÿE#ÿL ÿR!ÿV&ÿY/ÿY:ÿYF ÿVQÿT]ÿQjþNu!üL%ùJ‹(÷I•+õG,óG¦.òF®/ðE¸0ïEÄ1íEÓ1èFè1åFö2âEÿ5ßDÿ6ÓGÿ7ÊHÿ8ÄJÿ8¿Kÿ7¿Kÿ7¿Kÿ7¿Kÿ7¿Kÿ7ÿA#ÿIÿQÿWÿ\#ÿ`,ÿ`6ÿ`A ÿ^Mý[XøXdôUp#ñS|'îP†+ëO.éM™0çL¡2åLª3ãK´4âKÀ5àKÏ5ÛKæ6ÕJô8ÑJÿ:ÎJÿ<ÄLÿ<½Mÿ<¸Oÿ<´Oÿ;´Oÿ;´Oÿ;´Oÿ;´Oÿ;ÿB"ÿLÿUÿ\ÿc ÿf(ÿh2ÿh= úfHôcSî`_ê]k#æZv(âW-ßU‹0ÜS”3ÙQ6ÕP¦8ÓO¯:ÐO»;ÎNÉ<ËOá=ÇOò>ÃOÿ@ÀOÿA·QÿA±Rÿ@­Sÿ@ªTÿ?ªTÿ?ªTÿ?ªTÿ?ªTÿ?ÿFÿPÿYÿbÿhÿl$ÿo.ùo8ñnDëkNåh[ßdg#Ú`q*Ô]{/Ð[…4ÌXŽ8ÉW—;ÇU =ÄT©?ÂS´A¿SÂB½SÖC¹SíD¶SýE³TÿE¬VÿD§WÿD¤XÿC¡XÿB¡XÿB¡XÿB¡XÿB¡XÿBÿHÿSÿ]ÿfÿmÿr!ûu)òv3év> âsJÛoWÒkb#Ígl+Èdv1Äa7À^‰;½\’>º[šA·Y¤DµX®F²W»G°WÍH­XèHªXúI§YÿH¡ZÿH[ÿG›\ÿF™\ÿE™\ÿE™\ÿE™\ÿE™\ÿEÿKÿWÿaÿkÿrÿxõ{$ë}-â~9Ù{FÐvSÉq^$Ãmh,¾jq3ºg{8¶dƒ=²bŒA¯`•E¬^ŸG©]©J¦\¶K¤\ÇL¢\âMŸ]÷Lœ^ÿL˜_ÿJ•`ÿI“`ÿH‘`ÿG‘`ÿG‘`ÿG‘`ÿG‘`ÿGÿNÿZÿdÿoÿvü}ïä„'Û„4ÐCÈ|OÁxZ#»sd,µpm3±lv:­j?©gˆC¥e‘G¢c›JŸb¥Mœa±O™`ÁP—`ÜP•aóO“bÿNcÿLŽdÿKŒdÿJ‹dÿH‹dÿH‹dÿH‹dÿH‹dÿHÿPÿ\ÿh ÿrÿzöé†ÞŠ ÒŠ0Ɇ@Á‚Mº}W#´ya,®uj4©rr:¤o{@ l„DjH™h—L•g¡O’f­Qe½RŽeÔSŒfðQ‹gÿPˆgÿN‡hÿL†hÿK…gÿI…gÿI…gÿI…gÿI…gÿIÿRÿ_ÿk ÿu ù~ ð…ã‹ÖÌŽ.Ë= »‡J´ƒU"­~^+§{g3¢wo:tx@™r€E•o‰I‘m“MlžPŠjªS‡j¹T…jÏT„kîSƒlÿQ‚lÿOkÿM€kÿL€kÿJ€kÿJ€kÿJ€kÿJ€kÿJÿTÿa ÿn ýx è‚܉ Ø Ð“Æ“+¾; ¶ŒH®ˆR!§„\+¡€d3œ|m:—yu@’w}EŽu†JŠrN†q›Q‚o§To¶U}oËV|oëT|pÿR{pÿP{oÿN{oÿM{nÿK{nÿK{nÿK{nÿK{nÿKÿWÿc ÿpð|Ü…ÔŒГ Ê–Á—)¹”9 ±F©P ¢‰Z*œ…b2–‚j9‘r?Œ|zE‡zƒJƒxNv˜Q{u¤Txt³VvtÈVutèUuuýSutÿQusÿOvrÿMvqÿLvqÿLvqÿLvqÿLvqÿLÿYÿfÿsáÖˆÏÊ–Äš¼›&´˜7 ¬•D¤‘NŽW(–Š`1‡h8‹„p?†‚xDI}}‹Mx{–Qtz¢Tqy±VoyÅVnzæUnzüSoyÿQpwÿOqvÿMquÿLquÿLquÿLquÿLquÿLÿ[ÿiöw݂ЋÉ“Ä™¾ž¶Ÿ$®4¦šAŸ–L˜“U'‘^/‹e7…Šm=€ˆuC{…~HvƒˆLr‚“Pn€ Sk®UhÂVgãUh€úSi~ÿQj|ÿOk{ÿMlyÿLlyÿLlyÿLlyÿLlyÿLÿ^ ÿlæzÖ†ËÄ—¾¸¢±£!©¢2¡Ÿ?™œJ’™S%‹–\-…“c5‘k;zŽsAuŒ|FpŠ…Kkˆ‘Og‡Rd†¬Tb†¿Ua†áTa†ùRc„ÿPeÿOfÿMg~ÿLg~ÿLg~ÿLg~ÿLg~ÿLÿa ÿoà~ЉƓ¿›¸¡±¦ ª¨£§/›¥=”¢HŒŸQ"…œY+ša2y˜i9t•q?o“yDj’ƒHeŽLa›O^ŽªR[޽RZŽÞR[øP\‹ÿO^ˆÿN`…ÿLaƒÿKaƒÿKaƒÿKaƒÿKaƒÿKÿdõtÚ‚ËŽÁ—¸ž±¥©«£­œ¬,•«: ¨E†¦O¤W(y¢_/s f5mžn;hœw@cšE_™ŒI[˜™LW—¨NU—»OT—ÜNT–öNU”ÿMXÿLYÿK[ŠÿJ[ŠÿJ[ŠÿJ[ŠÿJ[ŠÿJÿhåyчŒ»œ±¢©©¡±›³•³(޲6 †°B®Lx¬T#rª\*l¨d1g§l6b¥u;]¤@Y£ŠCU¢—GQ¡§IO¡ºJN¢ÙIN õINŸÿIP™ÿIR–ÿHT’ÿGT’ÿGT’ÿGT’ÿGT’ÿGÿnÞʾ˜³ ª§¡®—¶‘ºŒº#…¹2~¸>w¶IqµRk³Z%e²b+`±j0[°s5W¯}9S®‰=O­–@L­¥BJ­¹CI®ØBH«õCGªÿDI¥ÿDK ÿDMœÿDMœÿDMœÿDMœÿDMœÿDêu҆Ó·¬¤¢«˜³Ž»…Á Â{Â-uÁ: oÀEi¿Oc¾W^½_#Y¼h(U»q-Q»{0Mº‡4Jº•7Gº¥9Eº¸:Dº×9C¸õ;B¶ÿ=B³ÿ>D®ÿ>E©ÿ>E©ÿ>E©ÿ>E©ÿ>E©ÿ>à}ɻ𮢣©˜±Ž¹„ÁyÉtËpÌ&kË5eË@ `ÊK[ÊTWÉ]RÉeNÈo#KÈz&GȆ)DÈ”,BȤ.@ȸ/?É×/?Çõ0=Äÿ3;Ãÿ5<¾ÿ6=¸ÿ7=¸ÿ7=¸ÿ7=¸ÿ7=¸ÿ7цÀ•²Ÿ¥§š¯Ž·ƒ¿xÇnÏe× cØ`Ø-[Ø:WØF SØP OØYK×bG×lD×wAׄ>Ø“ <Ø£!;Ù·":ÚÕ":Öò#7Ôÿ'6Òÿ)4Ñÿ+6Êÿ-6Êÿ-6Êÿ-6Êÿ-6Êÿ-Ŷ¨¥œ­¶ƒ¾wÇlÏbÖZäXäTä)Pä5Lå?HåIEåS Bæ\ ?æf<æq:ç~7çŒ5çœ3è®2éÆ2èê1åþ/äÿ.äÿ-âÿ -âÿ -âÿ -âÿ -âÿ ºšª£«´ƒ½wÆkÏ_ÖTÞQðMðJð&Fñ0Bò:>òC;óK8óT6ô]3ôh 0õt .õ ,ö‘*ö¢(÷·'øÖ'öô&óÿ&ñÿ%ñÿ%ñÿ%ñÿ%ñÿ%ñÿ­¡ ©’³„¼vÆiÏ]ØQßIîFüBý>þ!;þ*7ÿ34ÿ:0ÿB-ÿJ+ÿS(ÿ\%ÿf"ÿs ÿƒÿ”ÿ¦ÿ¼ÿâ ÿù ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ¢§“±…»vÆiÐ[ÚNàCå>û:ÿ 6ÿ2ÿ/ÿ#+ÿ*(ÿ1$ÿ7!ÿ?ÿFÿNÿXÿcÿpÿÿ“ÿ§ÿ½ÿàÿöÿÿÿÿÿÿÿÿÿÿ•¯†ºwÅhÐZÛLá@ç7ó2ÿ.ÿ*ÿ&ÿ#ÿÿ ÿ&ÿ+ÿ2ÿ8ÿ@ÿH ÿR ÿ]ÿkÿ}ÿÿ£ÿ¶ÿÍÿìÿìÿìÿìÿ숹xÄiÐ[ÝKã>é2î+ÿ&ÿ!ÿÿÿ ÿÿÿÿ ÿ$ ÿ*ÿ0ÿ7ÿ@ÿJÿVÿdÿuÿˆÿšÿªÿ»ÿ»ÿ»ÿ»ÿ»ÿ/+ÿ+2ÿ/1ÿ04ÿ/9ÿ+Aÿ'Lÿ#Xÿ!fÿ tÿ‚ ÿŽ ÿ˜ ÿ¡ ÿ©ÿ°ÿ¸ÿÁÿËÿÛÿèÿòÿüÿÿÿÿÿÿÿÿÿÿÿ!ÿÿ"ÿÿ"ÿÿ"ÿÿ"ÿÿ/+ÿ.0ÿ2/ÿ31ÿ26ÿ/>ÿ+Iÿ)Vÿ'cÿ%qÿ$~ ÿ#Š ÿ#•ÿ"žÿ"¦ÿ"­ÿ"µÿ"½ÿ"Çÿ"Ôÿ"åÿ"ðÿ"úÿ"ÿÿ#ÿÿ#ÿÿ#ÿÿ$ÿþ&ÿü'ÿü'ÿü'ÿü'ÿÿ0*ÿ1-ÿ5+ÿ7-ÿ62ÿ4:ÿ2Eÿ/Rÿ-`ÿ,m ÿ*z ÿ)†ÿ(‘ÿ(šÿ(¢ÿ'ªÿ'±ÿ'¹ÿ'Ãÿ'Ïÿ'áÿ'íÿ'øÿ(ÿÿ(ÿÿ(ÿÿ'ÿü)ÿö+ÿô,ÿô,ÿô,ÿô,ÿÿ1)ÿ4)ÿ9(ÿ;*ÿ<.ÿ:6ÿ9Bÿ7Oÿ5\ÿ3i ÿ1vÿ0‚ÿ/ÿ.–ÿ.žÿ-¦ÿ-­ÿ-µÿ-¾ÿ-Êÿ-Üÿ-êÿ-õý.ÿú.ÿù-ÿù-ÿó/ÿí1ÿê2ÿê2ÿê2ÿê2ÿÿ3)ÿ8&ÿ=$ÿ@%ÿA)ÿB3ÿA>ÿ?Jÿ=W ÿ;d ÿ9pÿ7}ÿ6ˆÿ5‘ÿ5šÿ4¢ÿ4©ÿ3±ÿ3ºÿ3Åý3Óú3æ÷4óó5þñ4ÿð3ÿî3ÿ ç6ÿ!á7ÿ!Þ8ÿ!Þ8ÿ!Þ8ÿ!Þ8ÿ!ÿ5'ÿ="ÿB ÿF ÿH%ÿJ/ÿI:ÿGFÿER ÿC_ ÿAkÿ?wÿ=‚þ<Œü<•û;ù;¥ø:­ö:¶õ:Àó:Îð:ãë;ñè:ý!æ:ÿ#ä:ÿ%á:ÿ%Ø<ÿ&Ð=ÿ&Í>ÿ&Í>ÿ&Í>ÿ&Í>ÿ&ÿ9$ÿAÿGÿKÿO"ÿQ+ÿQ6ÿOAÿLM ÿKZüIføGrõE}óC‡ñB‘ïB™íA¡ ìA©!ê@²"è@¼"ç@Ê#äAß#àAï$Ü@ü'Ø@ÿ)Ô?ÿ*Ï@ÿ*ÇBÿ*ÂCÿ*ÀCÿ*ÀCÿ*ÀCÿ*ÀCÿ*ÿ< ÿEÿKÿQÿVÿX'ÿX1ÿW<üUH öRTòPaîNmêLxçJ‚åIŒ âH•"àG$ÞG¥%ÜF®&ÚE¹'ØEÆ(ÔEÜ)ÏFî*ËEû-ÈEÿ.ÅEÿ/ÀFÿ/ºHÿ/µIÿ.´Iÿ.´Iÿ.´Iÿ.´Iÿ.ÿ@ÿIÿPÿVÿ\ÿ_#ÿ`,ú_7ó]BíZO çX\âVhÞSrÚQ} ÖO†$ÒN'ÐM˜)ÍL +ËK©-ÉJ³.ÇJ¿/ÅJÐ0ÂKè0½Kø2ºJÿ3¸Kÿ3³Lÿ3®Mÿ3ªNÿ2©Nÿ2©Nÿ2©Nÿ2©Nÿ2ÿCÿLÿTÿ\ÿaÿeûf'òf1êe=ãcJ Ü`WÕ]bÐZmÌWw#ÈU€'ÅT‰+ÂR’.ÀQš0¾P£2»O­4¹O¹5·OÈ6´Oâ6±Oô7®Pÿ8¬Pÿ8§Qÿ7£Rÿ6 Sÿ5ŸSÿ5ŸSÿ5ŸSÿ5ŸSÿ5ÿFÿPÿX ÿ`ÿfÿjôl!êm+ál7ÙjE ÐgRÊc^Å`h Á^r&½\{*ºZ„.·XŒ1´W•4±Už6¯T¨8­T³:ªSÂ;¨SÚ;¥Tð<¢Uÿ<¡Uÿ;Vÿ:šWÿ9—Wÿ8—Wÿ7—Wÿ7—Wÿ7—Wÿ7ÿIÿSÿ\ ÿe ÿkúoìrât#Øs2ÎqB ÇmOÁjZ»gd!·dm'³bv,¯_0¬^‡4©\7§[™:¤Y£<¡Y®>ŸX½?XÑ@šYì?˜Yþ?—Zÿ>”[ÿ<‘[ÿ;[ÿ:[ÿ:[ÿ:[ÿ:[ÿ:ÿLÿV ÿ` ÿh úo ósåwÚyÏy.Çw> ¿tK¹pV³m`!¯ji(ªgr-§ez2£cƒ6 aŒ9`•<š^Ÿ?—]ªA•]¸B“]ËC]èC^üAŽ_ÿ@‹_ÿ>Š_ÿ=ˆ_ÿ<ˆ_ÿ;ˆ_ÿ;ˆ_ÿ;ˆ_ÿ;ÿNÿX ÿcúlçsÝxÚ{ Ñ~È~+À|;¹yH²vS¬r]!§of(£mn.Ÿjw3›h7˜fˆ;•e‘>‘c›AŽb§CŒa´E‰aÇEˆbåE†búC†cÿB„cÿ@ƒcÿ>‚cÿ=‚cÿ<‚cÿ<‚cÿ<‚cÿ<ÿPÿ[ÿfìoÜvÔ|Ñ€ Ê‚ƒ(º9³~F¬{Q¦wZ!¡tc(œrk.˜os3”m|7‘k„;jŽ?Šh˜B†g£D„f±FfÃGfáGgøE~hÿC~hÿA}gÿ?|gÿ>|gÿ=|gÿ=|gÿ=|gÿ=ÿRÿ]ýiárÖzÎʃņ¼‡&µ†6®ƒC§€N¡|X ›y`'–wi-’tp3Žry7Šp<†n‹?ƒm•Cl¡E|k®Gzk¿HxkÝHxlöFxlÿDwlÿBwkÿ@wjÿ?wjÿ>wjÿ>wjÿ>wjÿ>ÿT ÿ_òlÝvÐ}Ƀć¿Š·Œ#°Š4©ˆA¢…LœU–^&‘|f-Œyn2ˆwv7„u;€tˆ?|r’CxqžFup¬Hso½IqpÙIqpôGqqÿDrpÿBroÿArnÿ?rnÿ>rnÿ>rnÿ>rnÿ>ÿV ÿbæo×yÌŇ¿‹¹Ž² «1¤Œ? ŠJ–‡S‘„\%‹d,†k1‚}s6~{|;zy†?vwBrvœEou©HluºIkuÔIkuòGkuÿEluÿCmsÿAmrÿ?mrÿ?mrÿ?mrÿ?mrÿ?ÿYÿeârÑ|Ç„Àй³’ ¬”¦“/ž‘< ˜H‘ŒQ‹‰Z$†‡b*…i0|‚q5xz:tƒ>p}ŽBl|šEi{§Gfz¸Hd{ÐHd{ðGe{ÿDfzÿCgxÿAhvÿ?hvÿ?hvÿ?hvÿ?hvÿ?ÿ[÷iÝv̀È»Ž´“­— §˜ ˜,™–: ’”EŒ’O†W"€_({‹g.v‰o3r‡w8m…_Š•A\‰£DZ‰´EX‰ËEXˆíDXˆÿCY†ÿA[ƒÿ@]ÿ>]€ÿ>]€ÿ>]€ÿ>]€ÿ>ÿbäqÏ~ȹ‘°—§›ž¡˜£“£%¢4†¡@ €ŸJySt›Z#o™b(j˜j.f–r2a•|7]”†:Y’“>V’¡@S‘²AR’ÉBR‘ëARÿ@Rÿ?U‹ÿ>Vˆÿ=W‡ÿ=W‡ÿ=W‡ÿ=W‡ÿ=ùgÝvɃ½³•©›  –§©‹ª!…©0¨< x§Gs¥Pm£Xh¢`$d¡g)_ p.[žy2W„6Sœ‘9PœŸ;N›°=LœÇ=L›ê­ÿ2@¨ÿ2A¦ÿ2A¦ÿ2A¦ÿ2A¦ÿ2Õ|е–¨£’ª‡±|·p¾hÂfÃcÃ-^Ã9ZÃDVÂN RÂWOÁ_KÁiHÁsEÀ~BÀŒ ?À›"=À­#<ÁÄ#<Àé#:¾þ&8¼ÿ(7»ÿ)8¸ÿ*8¶ÿ+8¶ÿ+8¶ÿ+8¶ÿ+É…¹“¬œ ¢”ªˆ±|¸q¾fÅ[ËWÍVÎ#SÎ2PÎ>MÏHIÏRFÏ[ CÏe@Ïo>Ï{;ω9Ï™7Ï«6ÐÃ6Ïè4Íû2Ëÿ1Êÿ0Éÿ!/Èÿ!/Èÿ!/Èÿ!/Èÿ!¾¯š¢¡–©Š°}¸q¿fÆ[ÌPÒGÚ FÜEÜ'DÝ5AÝ@?ÞK=ÞU:ß_8ßi5ßv 3à„ 1à” /ᦠ.á¼-âà-Þø+Ýÿ*Üÿ)Úÿ(Úÿ(Úÿ(Úÿ(Úÿ³˜¥ ™§‹°~¸qÀeÈYÎNÓDÛ?é =é;ê#9ê.6ë84ëB1ìK/íU-í_*îk(îx&ïˆ%ïš#ð®"ñÈ"ðí!ìÿ!ëÿ ëÿ êÿ êÿ êÿ êÿ ¨Ÿ›¦¯¸qÁdÊXÐLÖAÝ8ä5ö 3÷0÷.ø'+ù0(ù8&ú@#ûI!ûRü]ýiýyþ‹ÿžÿ³ÿÓþôüÿúÿùÿùÿùÿùÿ¥®€¸rÂdËVÓIÚ>ß4ä.ô+ÿ (ÿ%ÿ"ÿÿ&ÿ-ÿ4ÿ<ÿDÿNÿYÿg ÿw ÿŠ ÿŸ ÿµÿÕÿôÿÿÿÿÿÿÿÿÿÿ‘­‚¸sÂdÌVÕHÝ;â0ç'î#ÿ ÿÿ ÿÿÿÿ!ÿ' ÿ. ÿ6ÿ>ÿHÿTÿbÿsÿ‡ÿÿ²ÿÊÿêÿóÿóÿóÿó„·tÁeÌVØGß9å-ê#îýÿÿÿÿ ÿ ÿÿÿÿ ÿ&ÿ.ÿ7ÿAÿMÿ\ÿmÿ‚ÿ–ÿ¨ÿºÿÃÿÃÿÃÿÃÿ$/ÿ%/ÿ(/ÿ'1ÿ$6ÿ >ÿIÿVÿdÿrÿÿŠÿ”ÿÿ¤ÿ¬ÿ³ÿºÿÃÿÎÿßÿëÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿ%.ÿ)-ÿ+,ÿ+.ÿ)3ÿ$;ÿFÿSÿaÿnÿ{ÿ‡ÿ‘ÿšÿ¡ÿ©ÿ°ÿ·ÿÀÿÊÿÛÿèÿôÿýÿÿÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿ&-ÿ,)ÿ.(ÿ/*ÿ-/ÿ)7ÿ'Cÿ$Pÿ"]ÿ jÿwÿƒÿÿ–ÿžÿ¥ ÿ¬ ÿ³ ÿ¼ ÿÆ ÿÓ ÿå ÿñ ÿü þÿ ýÿ üÿ üÿ üÿ÷!ÿ÷!ÿ÷!ÿ÷!ÿÿ**ÿ/&ÿ2$ÿ3%ÿ2*ÿ14ÿ/?ÿ-Lÿ*Yÿ(fÿ&rÿ%~ÿ%‰ÿ%’ ÿ%š ÿ%¡ ÿ%¨ ÿ$° ÿ$¸ ÿ%Á ÿ%Î ÿ%á ü%ï ù&ú ö&ÿ õ&ÿô%ÿô%ÿò&ÿí'ÿí'ÿí'ÿí'ÿÿ.&ÿ4"ÿ7 ÿ9!ÿ8%ÿ9/ÿ8;ÿ5Gÿ3Tÿ1aÿ/mÿ.y ÿ-„ ÿ- ÿ,– ÿ, ÿ,¥ý,¬ü,´û,½ù,Éö,Ýó-ìï-øí-ÿë,ÿê,ÿé,ÿå-ÿà.ÿà.ÿà.ÿà.ÿÿ2#ÿ8ÿ<ÿ>ÿ@"ÿA+ÿ@6ÿ>Bÿ ŸxJšuS•s\‘qd"ol'‰mt+…l|/‚j…2i5|h›8yg§:vf¶;tfÌ­¹#=­Ø"=«õ#<©ÿ%;§ÿ&;¦ÿ&;¤ÿ&;¤ÿ&;¤ÿ&;¤ÿ&Ìz»ˆ®’¢™—žŒ¤€ªu¯i´^¹[ºY»$V»1S»=P»GM»PJºY Gºb DºlAºw>¹„<¹“9¹£8¹·7ºÖ7¸ô5¶ÿ4´ÿ3³ÿ3²ÿ 3²ÿ 3²ÿ 3²ÿ Áƒ´‘¦˜›ž¥‚«v±k¶_¼TÁLÅ KÅIÆ(HÆ5EÇ@CÇJ@ÇS>Ç];Çg9Çs 7Ç€ 4Ç 2Ç¡1ȵ0ÈÓ0Æô.Äÿ-Âÿ,Áÿ+Àÿ+Àÿ+Àÿ+Àÿ¸ª—žž‘¥„¬x²k¹`¿TÃJÈ@Í:Ò9Ò8Ó(7Ó56Ô@4ÕK3ÕU1Ö`/Öl-×z+Ø‹*Ø(Ù±'ÚÍ'×ï&Ôÿ %Òÿ $Ñÿ #Ðÿ #Ðÿ #Ðÿ #Ðÿ ®– ”¤†¬y´l»`ÂTÆHË>Ð5Õ-Ý ,á+â)ã*(ä5'ä?&åJ$æU#æa!çn ç~èé¤é¼êâæüåÿäÿãÿãÿãÿãÿ£–¤ˆ¬zµl½_ÄSÊGÎ<Ó2Ú*ß%î #ð!ññ"ò+ó4ô>ôHõRö_ön÷€ø”ùªùÆùí öÿ ôÿ óÿ óÿ óÿ óÿ™£‹¬|µm¾_ÆRÍEÒ9Ø/Þ&âêûÿÿÿÿ!ÿ(ÿ0 ÿ9 ÿC ÿNÿ\ÿlÿ€ÿ–ÿ­ÿÊÿðÿÿÿÿÿÿÿÿÿÿ«}µn¿`ÈRÐC×7Ý+â"æêùÿÿÿ ÿ ÿÿÿ"ÿ*ÿ3ÿ=ÿIÿWÿiÿ~ÿ•ÿ¬ÿÇÿèÿúÿúÿúÿú€µp¿aÉRÓCÛ5á)æêîøÿ ÿÿÿÿ ÿÿÿÿÿ#ÿ+ÿ6ÿCÿSÿeÿzÿ‘ÿ¦ÿ¸ÿÏÿÏÿÏÿÏÿ/ÿ ,ÿ!,ÿ.ÿ3ÿ<ÿFÿ Tÿ aÿ oÿ {ÿ †ÿ ÿ ™ÿ  ÿ §ÿ ­ÿ ´ÿ ¼ÿ Åÿ Ñÿ ãÿ ïÿ ùÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ-ÿ#)ÿ$)ÿ"+ÿ0ÿ8ÿCÿPÿ^ÿkÿwÿƒÿÿ•ÿÿ¤ÿªÿ±ÿ¹ÿÁÿÍÿßÿìÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#*ÿ&&ÿ(%ÿ''ÿ#+ÿ3ÿ@ÿMÿZÿgÿsÿ~ÿ‰ÿ‘ÿ™ÿ ÿ§ÿ®ÿµÿ¾ÿÉÿÚÿéþöûÿùÿùÿøÿøÿøÿøÿøÿøÿÿ&&ÿ*"ÿ, ÿ+"ÿ(&ÿ'0ÿ$<ÿ"IÿUÿbÿnÿzÿ„ÿÿ•ÿœÿ£ÿªÿ²ÿºÿÅüÓùçõôòÿñÿðÿïÿïÿ ïÿ îÿ îÿ îÿ ÿ*"ÿ.ÿ0ÿ0ÿ0"ÿ0,ÿ.7ÿ+Dÿ(Qÿ&]ÿ$iÿ#uÿ#þ#ˆý#‘û#˜ú# ø#§÷#®õ#·ô#Áò$Ïî$äê%òè%þæ$ÿ ä%ÿ ã%ÿ ã$ÿ â$ÿ á$ÿ á$ÿ á$ÿ ÿ.ÿ3ÿ5ÿ5ÿ8ÿ8'ÿ73ÿ4?ÿ2Kÿ/Xû.dø-oõ,zó,ƒñ,Œï,”í,œì,£ê,«é,³ç,¾ æ,Ì â-âÞ-ñ Û,þ Ö-ÿÔ,ÿÒ,ÿÑ,ÿÏ,ÿÎ-ÿÎ-ÿÎ-ÿÿ2ÿ7ÿ:ÿ<ÿ?ÿ@"ÿ>-ÿ<9ú:Eô8Rð7^ì6jé5tæ5~ä4‡â4 à4˜ Þ4Ÿ Ü3§ Ú3° Ø3» Õ3É Ò4ß Î4ðÊ4ýÇ4ÿÅ4ÿÃ4ÿÃ3ÿÀ4ÿ¿4ÿ¿4ÿ¿4ÿÿ6ÿ;ÿ> ÿCÿFÿFÿF&öD2ïB?é@Lä?Yß>dÛ=oØ„}H |Q{zYwy`swhovp!lux%it‚(fsŽ+crš.`q¨/^qº0]qÔ0]qò.^qÿ,^pÿ+_pÿ)`oÿ(`nÿ(`nÿ(`nÿ(ñUÞbÊm½u³{«€¢‚˜‘ƒ…ˆ….ƒ„;~ƒE zNu€Vq^n}fj|m g{v#cz€'`y‹*]x˜,Zw¦.Xw¸/WwÑ/Wwñ.Xvÿ,Xvÿ*Yuÿ)Ztÿ(Ztÿ'Ztÿ'Ztÿ'íY×fÅq¹z¯€¦„†‘‡Š‰ †Š‚‹+}Š8x‰BtˆL o‡Tl…[h„cdƒka‚t!]}$Z€‰(W–*U~¤,R~¶-Q~Î-Q}ï,R}ÿ+R|ÿ)S{ÿ(Tzÿ'Tzÿ'Tzÿ'Tzÿ'è^ÐkÀv´~«…¡‰—‹‰ƒ~{‘'v‘4r?mI iŽQeYbŒ`^‹h[ŠqW‰{!Tˆ†$Q‡”'O†¢)M†´*K†Ì*K…î)L„ÿ)Lƒÿ(Lƒÿ'Mÿ&Nÿ&Nÿ&Nÿ&ácÉp»{°„¦Š›Ž‘‘„“z•u—r˜"o˜0j—;f—Eb–N _•V[”]X“eU“nQ’xN‘„ K‘#I¡$G²&EÊ&Eí%Eÿ%EŒÿ%F‹ÿ$FŠÿ$FŠÿ$FŠÿ$FŠÿ$ØiÃvµ«ŠŸ•“Š–~špkŸhŸf *b 7_ŸA[ŸJXžR TžZQbNœkKœuH›E›BšŸ@š° ?šÈ ?™ë?˜ÿ >–ÿ!>•ÿ!?”ÿ!?”ÿ!?”ÿ!?”ÿ!Íp¼}°ˆ¤™”Ž˜ƒw i¤`§]¨[©$Y©1V©<S©EP¨NM¨W J¨_ G§hD§sA¦>¦<¦:¦¯9¦Ç9¥ê8£ÿ7¡ÿ7 ÿ7Ÿÿ7Ÿÿ7Ÿÿ7ŸÿÄxµ…©•’š†Ÿz£n¨b¬U°P²N²M³(K³5I³?F³ID³RA³[?³d<³o :³{ 7³Š5²š3³­2³Å2²é1°þ0®ÿ/­ÿ/¬ÿ/¬ÿ/¬ÿ/¬ÿ»®Ž¡•–š‰ }¦q«e¯Y´N·C¼@½?½>¾+<¾6;¿A9¿K7¿T5À_3Àj1Àw/À†-À—+Àª*ÁÂ*Àç)½ý (¼ÿ 'ºÿ '¹ÿ'¹ÿ'¹ÿ'¹ÿ²Œ¥”™š¡§r­f³Z¸O»D¿:Ä0É.Ê-Ê,Ë)+Ë5+Ì@*ÍJ(ÍV'Îa&Îo$Î#Ï‘!Ï¥ н ÏäÍúËÿÊÿÉÿÉÿÉÿÉÿ¨”œš¡‚¨t¯g¶[¼NÀCÃ9Ç/Ì'ÐÖ ÚÛÛ&Ü1Ý<ÝHÞUßbàrà…ášâ±ãÏàôÞÿÝÿÛÿÛÿÛÿÛÿžš’¡„©v±h¸[¿NÄBÈ7Ì-Ð$ÕÛßéêëë&ì0í: îF îS ïb ðtñ‰ò òºñäñýïÿíÿíÿíÿíÿ•¡†©x²iº[ÂMÈ@Ì4Ñ*Ö!Ûàäð ù ú ûûü$ü,ü7üBüPüaýuüŒü¤üÁüëüÿýÿýÿýÿýÿ‰©y²j»\ÄNÌ?Ñ2×'Ýáåè ñýÿÿ ÿÿÿÿÿ'ÿ1ÿ>ÿMÿ_ÿuÿÿ¦ÿÂÿçÿüÿÿÿÿÿÿ|³l¼]ÆNÏ?Ö1Ý%âæê îòÿÿÿÿÿÿ ÿÿÿÿ!ÿ+ÿ9ÿJÿ]ÿsÿŒÿ¤ÿ¹ÿÔÿÞÿÞÿÞÿ,ÿ)ÿ(ÿ+ÿ0ÿ 8ÿDÿQÿ^ÿlÿxÿ‚ÿŒÿ”ÿœÿ¢ÿ¨ÿ¯ÿ¶ÿ¾ÿÈÿ×ÿçÿóÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)ÿ&ÿ%ÿ'ÿ,ÿ4ÿ @ÿNÿ[ÿhÿtÿÿˆÿ‘ÿ˜ÿŸÿ¥ÿ¬ÿ²ÿºÿÄÿÑÿäÿñÿüüÿüÿüÿüÿüÿüÿüÿüÿÿ&ÿ!"ÿ !ÿ#ÿ'ÿ0ÿ<ÿJÿ Wÿ cÿ oÿ zÿ „ÿ ÿ ”ÿ ›ÿ ¢ÿ ¨ÿ ¯ÿ ·ÿ Àÿ Ìÿ àû ï÷ úõ ÿõ ÿô ÿô ÿô ÿô ÿô ÿô ÿÿ""ÿ$ÿ$ÿ"ÿ"ÿ,ÿ8ÿEÿRÿ^ÿjÿuÿÿˆÿÿ—ÿžÿ¥ý¬ü³ú½ùÉõÝñíîùìÿëÿêÿéÿéÿéÿéÿéÿÿ&ÿ(ÿ(ÿ&ÿ&ÿ&(ÿ#4ÿ @ÿMÿYÿeþpüzùƒ÷Œö“ôšó¡ñ¨ð°îºíÆêÙæëâùàÿÞÿÝÿÜÿÜÿÛÿÛÿÛÿÿ*ÿ-ÿ-ÿ-ÿ.ÿ-"ÿ,.ÿ):ÿ&Gú$Tö#`ò"kï"uí"~ë"‡é"ç"–å"žä"¥â"­á#·ß#ÃÝ#ÖØ$êÒ$ùÏ%ÿÍ%ÿË%ÿÊ%ÿÊ$ÿÊ$ÿÊ$ÿÊ$ÿÿ.ÿ1ÿ2 ÿ4ÿ5ÿ5ÿ3'ú14ó/Aî-Né,Zå,eâ,pß+yÝ+‚Ú+‹Ø+’Õ+šÓ+¢Ñ+ªÏ+³Í+¿Ì,ÏÈ-çÄ-÷ Á-ÿ ¿-ÿ ½-ÿ ¼-ÿ ¼,ÿ »,ÿ »,ÿ »,ÿ ÿ1ÿ5 ÿ6ÿ: ÿ<ÿ;ø9ï7+ç69á5GÜ5TÕ5`Ñ5jÎ4sÌ4|Ê4…È4Æ3”Ä3œ Â3¥ Á3® ¿3¹ ½3È »4á ·4ó ´4ÿ±4ÿ°4ÿ¯4ÿ®4ÿ®4ÿ®4ÿ®4ÿÿ5ÿ8ÿ<ÿ@ÿA úAí?ã<"Ú=1Ò>AÌ>OÈ>ZÄ=dÁ=n¿ÿCëKÝQÑTÊTÆRÁQ¹S"³U3®TAªTL¦SV¢Q_ ŸPgOošNw˜N–Mˆ“L‘‘L›K¦K³‹KʼnKâ‡L÷†Lÿ…Lÿ…Mÿ…Lÿ…Lÿ…Lÿ…Lÿÿ@üGåPÕVÊYÂZ½X¸W±Y¬Z/§Z=¢YIžXS ›W[ —Vd•Uk’TsS{R„‹QˆQ—†P£„P° ‚PÁ!€PÝ!~Qô }Qÿ}Qÿ}Qÿ}Qÿ}Qÿ}Qÿ}QÿÿBðJßTÎZÄ^¼_¶^±\ «^¥`+ `:œ_E—^P ”\X [`Zh‹YpˆXw…W€ƒV‰€V”~UŸ!{U­"yT½#xU×#wUò"vVÿ vVÿvVÿvVÿvVÿvVÿvVÿÿEìNÚXÉ^¿b·d±c«a¤cŸd(še7–dC‘cMŽaU Š`]‡_e„^l]t~\}|[†yZ‘ wZ"tYª$rYº%qYÒ%pZð#oZÿ"oZÿ pZÿpZÿpZÿpZÿpZÿÿHçRÓ[Åb»f³h¬h¥fŸgši%•i4h@ŒgJˆfS „e[db~cj{brxazv`„s_Ž!p^š#n^¨%l]¸%j^Î&i^î$i^ÿ"j^ÿ j^ÿj^ÿj^ÿj^ÿj^ÿùJãUÏ_Áe·j¯l§lŸj™k”m"n1‹m=‡lGƒkP jX|h`xggvgosfxpemdŒ!jc˜#hb¦%fb¶&dbÌ&dbì%dbÿ#dbÿ!ebÿebÿebÿebÿebÿòLßXÊb½i³n«p¢p™n“prŠr.†r;‚qE}pN znVvm^slepkmmjujigiŠ!eh–#bg¤%`g´&_gÉ&^gê%^gþ#_gÿ!_fÿ`fÿ`fÿ`fÿ`fÿïOÚ\Æeºm°r§ut”st ‰v…w+w8|vCxuL ttT qs[nrckqkhpseo|bn‡ _m”"]l¢$Zl²%YlÇ%Xlè%Ylý#Ykÿ!Zkÿ[kÿ[jÿ[jÿ[jÿëSÓ`Âi¶q¬v£y™yw‡y ƒ{|({|5w{@szIoyQ lxYhwaevhbup_tz\t…Zs‘!Wr #Ur°$SrÅ$Srç$Sqü"Tqÿ TpÿUpÿUoÿUoÿUoÿåWÍd¾m²u¨{Ÿ~“}‡}€|€x$u‚2q=m€Fi€O fV c~^`}f]|nZ{wWz‚TzQy!Oy®"NyÃ"Mxå"Mwû!NwÿNvÿOuÿOuÿOuÿOuÿß\Èh¹r®z¥€š‚Ž‚€ƒy…t†qˆ nˆ.jˆ9g‡Cc‡L`†S ]…[Z„cW„kTƒuQ‚€NK›I¬H€Á G€ãGúH~ÿH}ÿI|ÿI|ÿI|ÿI|ÿÖaÂn´xª€Ÿ…”‡ˆ‡{‰pŒkŽ hf)b5_?\HYŽPVŽX S`PŒhMŒrJ‹}HŠŠEŠ™CŠªBŠ¿AŠáAˆùA†ÿA…ÿB…ÿB„ÿB„ÿB„ÿÍg¼t¯~¥†šŠŽŒ‚ug”a•^—\—#Z˜/W˜:T˜DR—LO—TL—\ I–e G–oD•zA•ˆ?”—=”¨;”½;”ß:’ø:ÿ:ÿ:Žÿ:Žÿ:Žÿ:ŽÿÅn¶{ª…ž‹”ˆ’{”n—b›WžR Q O¡(M¡4K¡>I¡GG¡PD¡XB¡a? k = w : … 8 ”6 ¦5 »4 Ý4÷3œÿ3šÿ3™ÿ3™ÿ3™ÿ3™ÿ½w¯ƒ£‹˜‘•™sœgŸ[¢O¦G©DªCªA«+@«7?¬A=¬J;¬S9¬\7¬g5¬s2¬0¬‘.¬£-¬¸ ,¬Ù,ªõ +¨ÿ *¦ÿ *¥ÿ *¥ÿ *¥ÿ *¥ÿ µ€¨‹œ‘‘–…œx k¥_¨S¬H¯=²6µ 4µ3¶!2¶,1·70·A/¸K.¸U,¸`*¸m)¹{'¹%¹Ÿ$¹´#¹Ò#·ô"µÿ!´ÿ!³ÿ!²ÿ!²ÿ!²ÿ­Š ‘•—ˆ{£n¨a­U±J´?·4»+¾$ "Â"Ã!Ã* Ä4Ä?ÅJÆVÆcÇsDžǙȮÈËÆñÄÿÃÿÁÿÁÿÁÿÁÿ£‘˜˜‹ž}¥p«b±V¶J¹>½4À*Ä"ÈÌÐ ÒÒÓ%Ó0Ô<ÔH ÕV Õe Öx Ö Ø¤ ؾ Ùæ Öþ Ôÿ Òÿ Òÿ Òÿ Òÿš˜ŽŸ€¦r­d´WºI¿=Â2Æ(ÉÍÑÖ ÛÞ ßßà$á.â:ãGäVägå{æ’æªçÈçðèÿèÿèÿèÿèÿ‘Ÿ‚§t¯e·W¾IÃ<Ç0Ë%ÏÔÙÝ áåéé éêë!í+ï7ñEòVóhó~ô—õ°öÐ÷ó÷ÿ÷ÿ÷ÿ÷ÿ…§v°f¸XÁJÈ;Ì.Ñ#ÖÜà ãçêõôõõ ööøú'ü4ÿCÿUÿiÿÿšÿ²ÿÏÿíÿùÿùÿùx°hºYÃKË;Ñ-Ø!Ýâæêíðøÿÿÿÿÿÿ ÿÿÿ"ÿ0ÿ@ÿSÿiÿÿ™ÿ¯ÿÃÿÕÿÕÿÕÿ(ÿ%ÿ%ÿ 'ÿ-ÿ5ÿAÿOÿ\ÿiÿtÿ~ÿˆÿÿ—ÿÿ¤ÿªÿ°ÿ·ÿÀÿÌÿßÿìÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%ÿ"ÿ!ÿ#ÿ (ÿ0ÿ=ÿKÿXÿdÿpÿzÿ„ÿŒÿ“ÿšÿ ÿ¦ÿ­ÿ´ÿ¼þÈýÙûéúöùÿøÿøÿøÿøÿùÿùÿùÿÿ"ÿÿÿÿ"ÿ ,ÿ9ÿFÿSÿ`ÿkÿvÿÿˆÿÿ–ÿÿ£þ©ü°ú¹÷ÄõÒóæòôñÿðÿïÿïÿïÿðÿðÿðÿÿÿÿÿÿÿ(ÿ4ÿ Aÿ Nÿ[ÿfÿqÿzÿƒþ‹ü’ú™øŸö¦ô­òµðÀíÎëäéóæÿå ÿä ÿä ÿä ÿä ÿä ÿä ÿÿ!ÿ!ÿ ÿÿÿ$ÿ/ÿ<ÿIÿUüaùköuô~ò†ðŽî•í›ë¢êªè³æ½åÌáãÝóÙÿÖÿÔÿÓÿÒÿÒÿÒÿÒÿÿ%ÿ%ÿ$ ÿ#ÿ#ÿ"ÿ)ÿ5ùCôOï[ìfépæyäâ‰à‘ߘݟۧٱֻÔÊÐáÌóÉÿÆÿÄÿÃÿÃÿÃÿÃÿÃÿÿ(ÿ) ÿ(ÿ+ ÿ+ÿ)ý&"ô#.ì!;æ Iâ UÞ `Ú!jÖ!tÓ!|Ð!„Ï"ŒÍ"“Ë"›É"£È#¬Æ#¶Ä#ÄÂ$Û¾%î»%þ¸%ÿ¶%ÿµ%ÿµ%ÿµ%ÿµ%ÿµ%ÿÿ, ÿ-ÿ.ÿ1ÿ1 ý/ñ+ç)%ß(3Ø(BÑ*OÍ+ZÉ+eÇ+nÄ,vÂ,~À,†¾,޽,–»,ž¹,§¸,±¶,¿µ-ѱ-ê®.û«.ÿ©.ÿ¨.ÿ¨-ÿ¨-ÿ¨-ÿ¨-ÿÿ/ÿ1ÿ5ö7ê6ç3ä/Ù.Ï1,É3<Ä4IÀ5U¼5_º5h·5pµ4x³4€±4ˆ°4®4™¬4¢«4¬ ©4¹ §4Ê ¥5å ¡5ø Ÿ5ÿ 5ÿ 5ÿ œ5ÿ œ5ÿ œ5ÿ œ5ÿ ÿ3ÿ5ö:å>Ü@Ô=Ò7 Ë8Ã:&½=6¸>D´>P±=Z®=c¬=k©èGÕPÆV¼X´Y­V§S¡TœV%˜W4”W@WJVSŠU[ ‡Tc „Tj‚Sr€Rz}Rƒ{QŽxP™vP¦tPµsPÉqPèpQüpQÿpQÿpQÿqPÿqPÿqPÿõ@äKÏTÁZ·]¯^§[¡X›Y–["’\1Ž\=Š\G‡[PƒZX Y` ~Yg{XoyWwvV€tV‹rU–oU£mT²lTÆjUæjUûjUÿjUÿjUÿkUÿkUÿkUÿòCßOËX½]³a«b¢`›\•^`Œa.ˆa:„`E`N~_V {^] x]ev\ls\tp[}nZˆkZ”iY¡gY°eYÃdYãdYúdYÿdYÿeYÿeYÿeYÿeYÿïFÚRÆ[ºa°e¦fc•ab‹d‡e+ƒe7eB|dKxcSuc[ sbbpajm`rk`{h_†f^‘c^Ÿa]®`]Á_]á_]ø_]ÿ_]ÿ`]ÿ`]ÿ`]ÿ`]ÿëJÔVÃ^¶e¬i¢i˜ge‰f …hi(~j5zi?viIshQpgY mg` kfghepedycdƒ`c^b\b¬Zb¿YbßYb÷ZbÿZaÿ[aÿ[aÿ[aÿ[aÿçMÏY¿b³h©mžm“k‰iƒk m|n%xn2un=qnFnmOklV hl^ ekecjm`iv]i[hXg›VgªUg½TgÜTgöTfÿUfÿUeÿVeÿVeÿVeÿâQÊ]»f¯l¦q™pŽoƒn}pxrus!rs/os:lsDirLfrTcq[ `pc ]pk[otXnUn‹Sm™Qm¨Om»NmÙNlôOkÿOkÿPjÿPjÿPjÿPjÿÝUÅa·j¬q¢u”t‰t|svuqwoxly+iy7fy@cyI`xQ]wX [w` XvhUuqRu|PtˆMt—Ks¦Is¹HsÕIróIqÿJqÿJpÿKpÿKpÿKpÿÔZÀf³o¨vyx„xwyo|j} g~d&b€2_€=\€FZNWUT~] R}e O}oL|yJ|†G{”E{¤D{·C{ÒCzòCyÿCxÿDwÿDvÿDvÿDvÿÍ_»k®t¤|—~Š}~rfƒa„^†\‡!Z‡.X‡8U‡BS‡JP‡RN†ZK†b I…l F…w C„ƒA„’?„¢=„µ<„Ï<‚ð<ÿ=€ÿ=ÿ=~ÿ=~ÿ=~ÿÅfµqª{Ÿ‚’‚…‚yƒm†_ŠXTŽRP'O3M=KEINFVD_Bh?s =Ž€ :Ž 8Ž  7޳6ŽÌ6ï5‹ÿ5‰ÿ5ˆÿ6‡ÿ6‡ÿ6‡ÿ¾m°y¥‚™‡ŒˆˆrŠfZ‘P•I— G˜E˜ D™+C™6Aš@@šH>šQ<šZ:šd7šo5™}3™Œ1™/™°.™Ê.˜í.–ÿ -”ÿ -“ÿ -’ÿ -’ÿ -’ÿ ¶uªžˆ“†Žxk’_•T™I@ :¢ 8£7£"6¤-5¤74¤A3¥K1¥T0¥^.¥j,¥x*¥ˆ(¥š'¥­&¥Æ&¤ë%¢ÿ% ÿ$Ÿÿ$žÿ$žÿ$žÿ¯~£ˆ—Ž“~•p˜c›WŸL¢B¦8©/¬*®)®(¯#'¯-&°7%°A$°K#±V"±c!±q±‚²”²©²Á±ç¯þ­ÿ¬ÿ«ÿ«ÿ«ÿ¨ˆ›‘”„švŸh¢[¥O©D­9°/³&¶¹»»¼ ¼*½5½@¾K¾X¾g¿x¿ŒÀ¢ÀºÀá½û¼ÿºÿºÿºÿºÿŸ”•‡›y¡k§^¬R±E´:¶/¹%¼¿ÃÆ Ê ÊÊÊ'Ê2Ë>ËKÌZÌjÌ~̫̔ÍÈÌíÌÿËÿÊÿÊÿÊÿ—–Šœ|£nª`°R¶E¹9¼.¿#ÃÆÊ ÍÑÔ ÔÕÖØ'Ù1Û>ÜKÝ[ÞnބߛߴÞÙß÷ßÿßÿßÿßÿ¥p¬a³SºE¿8Â,Æ!ÉÍÑ ÕÚÞàá âäåç$é/ë<íKî]îqï‰ð¢ð¼ðãïùðÿðÿðÿ¥r­cµT½FÄ7È*ÌÐÕÚÞâæéêìîï ñóõ ø+û9ýJþ^ÿtÿÿ¦ÿÀÿáÿõÿõÿõt®e·VÀGÈ8Í*ÒØÝ âæéìðóôöøúýÿ ÿÿÿ(ÿ7ÿJÿ^ÿvÿÿ¦ÿºÿÑÿÑÿÑÿ$ÿ"ÿ !ÿ$ÿ)ÿ2ÿ>ÿLÿYÿeÿpÿzÿ„ÿŒÿ’ÿ™ÿŸÿ¥ÿ«ÿ²ÿºÿÅÿÓÿçÿôÿÿþÿÿÿþÿþÿþÿþÿþÿÿ!ÿÿ ÿÿ#ÿ-ÿ:ÿHÿUÿaÿlÿvÿÿ‡ÿŽÿ•ÿ›ÿ¡ÿ§þ®ý¶üÀûÍùâøð÷üöÿõÿõÿõÿõÿõÿõÿÿÿÿÿ ÿÿ)ÿ6ÿCÿPÿ\ÿgÿqÿzþƒüŠú‘ù—ø÷£õªô²ò»ñÈïÜîìíúëÿêÿêÿêÿêÿêÿêÿÿÿÿÿÿ ÿ$ÿ0ÿ>ÿKÿWÿbüløuõ~ò…ñŒï“î™ì ë¦é®ç·æÃäÔâéá÷ßÿÝÿÝÿÝÿÝÿÝÿÝÿÿÿÿÿÿÿÿ +ÿ 8ÿEûQ÷\òfîpêxç€æ‡äŽâ•áœß£Ý«Û´ØÀÖÐÓçÐøÎ ÿÌ ÿË ÿË ÿË ÿË ÿË ÿÿÿ ÿÿ ÿÿÿ$ú0ó>î Jé Vå aâ jÞ sÛ {Ù ƒÖ ŠÔ ‘Ò ™Ð Ï©Í³Ë¿ÊÐÆéÂù¿ÿ½ÿ¼ÿ¼ÿ¼ÿ»ÿ»ÿÿ" ÿ!ÿ ÿ!ÿ ÿöì(å6ßCÙOÓZÐdÍmËuÉ}DžŌĔœÀ¥¾¯½»»˸å´ö²ÿ°ÿ¯ÿ®ÿ®ÿ®ÿ®ÿÿ&ÿ%ÿ&û'ñ%ð! èÞÔ-Í<ÈIÅ UÁ!_¿"h¼"pº#x¹#·#‡µ#´$—²$ ±$ª¯$¶­%Æ«%ߨ&ó¥&ÿ£&ÿ¢&ÿ¡&ÿ¡&ÿ¡&ÿ¡&ÿÿ)ÿ(ö-ç0ß/Ù+Ö" Î#Æ&'À(6»*D¸+Oµ,Y²,b°,j®-r¬-zª-©-Ч-’¥-›¤-¥¢-± -ÀŸ-Øœ.ï™.ÿ—/ÿ–/ÿ•.ÿ•.ÿ•.ÿ•.ÿÿ,ÿ.ê5Ý9Ñ9Ê6Ç/Á-º0!´21°4>¬5J©5T§5]¤5e¢5m 5tŸ5|5„›5š4—˜4¡–4­”5»“5Ð5ìŽ6þŒ6ÿ‹6ÿ‹6ÿŠ5ÿŠ5ÿŠ5ÿÿ/ò4â<ÒAÇBÀ@»:¶6°9ª;,¦<:£=FŸ=P=Yš=a˜=h– ¦@¢B'žC5šDB—DL”DU‘C]CdCk‹Bs‰B{‡B„ …AŽ ƒA™ A¥ A³~AÆ|AäzBù yBÿ xBÿ xBÿ xBÿ xAÿ xAÿ ö6æ@ÑHÃM¹N±M©I¤EŸFšH#–I2’J>JHŒJQŠIY‡I`…IhƒHoHw G€ }GŠ zG•xF¢vF°uFÂsFàrG÷qGÿqGÿ qGÿ qGÿ qFÿ qFÿ ó9àDÌL¾Q´SªR¢NJ—K“M O.ŒO:ˆOE…ONƒOV€N]~Nd|Ml yMt wL} uL‡sL’qKŸoK­mK¿lKÜkLõjLÿjLÿjKÿ jKÿ jKÿ jKÿ ð=ÛHÇPºU°X¥VœS—O‘PŒR‰T+…T7‚TBTK|TSzSZxSbuRi sRq qQz nQ„lPjPœhP«fP¼ePØdPódPÿdPÿdPÿeOÿ eOÿ eOÿ ìAÔLÃT¶Y¬\ Z—W‘T‹U †WƒX'€Y4}Y?zYHwXPtXXrW_oWf mVn kVw hUfUdTšbT©`Tº_TÓ^Tò^Tÿ_Tÿ_Tÿ_Sÿ _Sÿ _Sÿ çDÏP¿X³]¨_œ]’[‹X…Z [}\$z]1w]<t]Fq]No\Ul\]j\d h[l eZu cZaY‹^Y˜\X§[X¸YYÐYXðYXÿZXÿZXÿZWÿ ZWÿ ZWÿ ãHËS»[°a¤b—aŽ_…\^{_xa!ub.rb9obClaKjaSgaZe`b c`j `_s ^^}[^‰Y]–W]¥U]¶T]ÎT]îT]ÿU\ÿU\ÿU[ÿV[ÿ V[ÿ ÞLÇV¸_­d e“d‰caybudreof+lg7jg@gfIefQbeX`e`]dg [dp Yc{Vc†Tb”Rb£Pb´ObÌObíOaÿOaÿP`ÿP`ÿP`ÿ P`ÿ ÙOÃZ´c©i›hg„gyesgoiljik(gl4dl=blF_kN]kVZj]Xje Vin Six Qh„Nh’Lg¡Kg²IgÉIgëIfÿJfÿJeÿKeÿ Kdÿ Kdÿ ÑT¾^±g¦m—lŠkkskmmhn epbq$`q0^q:\qCYqKWqSUpZRpbPpk Nou Ko‚ InGnŸEn°DnÇCmêDlÿDkÿEkÿ Ejÿ Ejÿ Ejÿ ËXºc­l¡q’p…ozonpes`u]v[wYx+Wx6Ux?SxHQxOOwWLw_JwhHvs Ev Cu Au?u®>uÅ=uè>sý >rÿ >qÿ ?qÿ ?pÿ ?pÿ Å^µi©qœut€tutiv^yX|T}R~Q&O1M€;L€CJ€KHTF\CeAp?~|<~Š :~š 9~¬ 7~à 7}æ 7{ü 7zÿ 7yÿ 8xÿ 8xÿ 8xÿ ¾d°o¥x–y‡y{ypzd|X€PƒK… H†G‡ Eˆ+Dˆ5Cˆ>A‰G@‰O>ˆX<ˆa:ˆl7ˆx5ˆ‡3ˆ˜2‡ª0ˆÀ0‡ä0…û0ƒÿ0‚ÿ0ÿ0ÿ0ÿ·kªv ~‚~vj€^ƒS‡J‹AŽ=;:‘#9‘-8’77’@6’I4“R3“\1“g/“t-’ƒ+’”*’§(’½(’á'ú'Žÿ'ÿ'Œÿ'Œÿ'Œÿ±t¥~™…Š„}„o…cˆX‹MC“:—2š.›-›,œ$+œ.*8)A(K'žU&ža%žn#ž~"ž ž£ž¹žÝœøšÿ™ÿ—ÿ—ÿ—ÿª}ž…“‹…Šu‹hŽ[‘P•F™;2 *£"¦ §§¨$¨-¨7©A©L©Xªfªvª‰ªž«´«Ó¨õ§ÿ¥ÿ¥ÿ¤ÿ¤ÿ£†—Œ‘}’m•`˜TœH >¤4§*«!®±³µµµ! µ+ µ6 ¶A ¶N ¶\ ¶l¶¶”¶ª¶Å¶êµÿ´ÿ³ÿ ²ÿ ²ÿš“„˜tœe W¤K¨@¬5°*³!µ¸» ¾À ÀÁÁ"Â+Â6ÃBÃPÄ_ÄqćÄĵÄÚÄöÃÿÃÿÃÿÃÿ“”‡šx j¦\¬O±Aµ5·)º½Àà ÆÊÌÌ ÍÎÎ!Ð*Ñ5ÓCÔRÔcÕxÕÕ§ÖÂÖéÖýÖÿÖÿÖÿŠ›{¢l©^°P¶Bº4½(ÁÄÇ ËÎÒ×ÙÚÜ Ýßáã'å3çBèTègé~é—ê¯êÎëïëþëÿëÿ}£n«_²QºBÀ4Ã'ÇËÏ ÓØÝáäåçéëí ïñô$÷1ùAúUújû„ûü¶üÒýíýôýôq¬aµR½DÄ4É&ÍÒØÝáåèìïñóõ÷ùûþÿÿ!ÿ/ÿAÿVÿmÿ‡ÿ ÿ¶ÿÊÿÔÿÔÿ ÿÿÿ ÿ%ÿ.ÿ;ÿIÿVÿbÿmÿvÿÿ‡ÿŽÿ”ÿšÿ ÿ¦ÿ­ÿµÿ¾ÿËÿáÿðþýýÿýÿýÿýÿüÿùÿùÿÿ ÿ ÿÿÿÿ*ÿ7ÿEÿQÿ^ÿhÿrÿzÿ‚ÿ‰ÿÿ–ÿœþ¢ü©û°ù¹øÆöÙõëôùóÿòÿóÿóÿóÿóÿóÿÿÿÿÿÿÿ%ÿ2ÿ@ÿLÿYÿcþmüuú}ù„÷‹ö‘ô—óžò¤ð¬î´íÀëÏéæèõæÿçÿæÿåÿåÿåÿåÿÿÿÿ ÿÿÿ ÿ,ÿ:ÿGúS÷^ôgñpïxíë†êŒè“ç™å ã§á°ßºÝÉÛàØð×þÕÿÔÿÓÿÓÿÓÿÓÿÿÿ ÿ ÿ ÿ ÿÿ&ý3ô@ïMëXèaåjâràzހ܇ڎؕԜңЬζÌÄÊÙÈíÇûÅÿÄÿÃÿÄÿÄÿÄÿÿ ÿÿÿÿ ÿ üñ+ç9âFÞQÚ[ÕdÒlÏtÍ{Ë‚Ê‰ÈÆ˜Ä Â©Á´¿Á½Õ» ì¸ ý¶ ÿµ ÿ´ ÿ´ ÿ´ ÿ´ ÿÿÿÿÿûúî ã "Ú 0Ó >Î JÊ UÇ ^Å gÂoÁv¿~½…¼º•¸·§µ²³À²Õ®î«þ©ÿ§ÿ§ÿ¦ÿ¦ÿ¦ÿÿÿúëãßÞ ÓË(Å7ÀD¼O¹Y·a´i³q±x¯€®ˆ¬«™©£§®¦¼¤Ï¡êžüœÿ›ÿšÿšÿ™ÿ™ÿÿ"ÿ!ì'à*Ô)Í$ÊĽ"·1³ >¯!I­"Sª#\¨$d¦$l¤$s£$z¡%‚ %‹ž%”%ž›&ª™&·˜&É•'æ’'ù(ÿ(ÿŽ'ÿŽ'ÿŽ'ÿŽ'ÿÿ&ò)ã1Ò4È4À0»)¸#±&¬(+¨*8¤+D¡,NŸ-W-_›-g™-n˜.u–.}”.†“.‘.š.¦.³Œ.ÅŠ/á‡/ö…/ÿ„/ÿ„/ÿƒ/ÿƒ/ÿƒ/ÿû)ë1Ù8É<¿<¶9°2¬- §/¢1&ž34š4@˜5J•5S“5[‘5b5i5qŒ5yŠ5‚ˆ5‹†5–„5¢‚5¯5À6Ü}6ô{6ÿ{6ÿz6ÿz6ÿz5ÿz5ÿõ-ä7Ð?ÂC·D­@§:£67™9"•:/’<;hÞ >g÷ >fÿ?eÿ?eÿ?dÿ?dÿÃW³a§i–h‡g{gqgeh\jXlTnRoPo$Np.Mp8KqAJqIHqQFqYDpbBpl@px>p†¶0¹$¼¿ ÅÉÌÐÑÒÓÕ ×ÚÜ!ß,á:âJã]ärä‹å¥åÀåæåøåÿåÿz¡k©\¯M¶?¼0¿#ÃÇÊÎÑÖÜßàâäæè éìîñ+ô:õMöa÷yø“ø­ùÆùäùóùómª^²Oº@Á1Å"ÉÎ ÒØÝáäèëíïñóöøú ýÿÿ)ÿ;ÿOÿfÿÿ™ÿ¯ÿÃÿÖÿÖÿÿÿÿÿ"ÿ+ÿ8ÿFÿSÿ^ÿiÿrÿzÿ‚ÿ‰ÿÿ•ÿ›ÿ¡ÿ¨ÿ¯ÿ¹ÿÅÿÙþìýûûÿûÿûÿúÿôÿðÿðÿÿÿÿÿÿÿ&ÿ4ÿBÿNÿZÿdÿmÿuÿ}ÿ„ÿŠýü–úù£ø«÷´õ¿ôÎóæñöðÿïÿïÿîÿîÿêÿêÿÿ ÿÿÿÿÿ"ÿ.ÿ<ÿIÿTþ_ûhùp÷xõó…ò‹ð’ï˜íŸì¦ê®è¹çÇåÞãðâþàÿàÿáÿáÿáÿáÿÿ ÿ ÿ ÿ ÿÿÿ(ü6ùCöNòYïbìkêrèyæ€ä†âŒá“ߚݡ۪شÕÀÒÓÐêÎúÍÿÍÿÍÿÌÿÌÿÌÿÿ ÿ ÿÿÿÿö"ð/ì<éHåSá\ÞeÛl×sÔzҀЇΎ̕ÊȥƯĻÂËÀå¾õ½ÿ¼ÿ¼ÿ¼ÿ¼ÿ¼ÿÿÿÿ ÿÿ øéã(Þ5ÙAÓLÏVË_ÉfÆnÄtÂ{Á‚¿‰½¼˜º¡¸«¶·´Ç²à±ò¯ÿ®ÿ­ÿ­ÿ­ÿ­ÿÿÿÿò ê é ÝÔÍ-È:ÄEÀP½Y»a¹h·oµv´}²„±Œ¯•­ ž« ¨ª µ¨ Ŧ ߤ ô¢ÿ ÿŸÿŸÿŸÿŸÿÿÿïäÛÒÏ ÈÁ $¼ 2· >´I±S¯[­c«j©q¨x¦€¥ˆ£‘¡› ¦ž³œÛÞ—ô•ÿ”ÿ“ÿ’ÿ’ÿ’ÿÿôå#Õ%Ê$¾»´¯+«8§C¥M¢V ]žel›sš{˜ƒ—•—“¢’¯¿ØŒ ñ‰ ÿˆ ÿ‡ ÿ‡ ÿ† ÿ† ÿúë&Ú-Ê0¾.µ(°"® ¨£&Ÿ!3œ">™#H—$Q•$Y“%`’%g&nŽ&v&‹&ˆŠ'“ˆ'ž†'«„'»ƒ(Ñ€(î~)ÿ})ÿ|(ÿ|(ÿ|(ÿ|(ÿõ$ã.Ï5Á8´6«1¥,¢&ž&™(!•*.’+9,D-L‹-T‰.\‡.c†.j„.r‚.z/„/}/š{/§z/·x/Ìv0êu0þs0ÿs0ÿs/ÿs/ÿs/ÿð*Ü5Ç;º?¬<¢8œ3˜/•.0Œ2)‰35†4?„5I‚5Q€5X~5_}5f{6ny5vx5€v5‹t5—r6¤p6´o6Èm6çl6ük6ÿk6ÿj6ÿj5ÿj5ÿê0Ó:ÂA³C¥A›>•:6Œ5 ˆ7„8%:1;<|;Ez"z?.x@8uABsAJrAQpAYnA`lAgjAphAygA„eA‘cAŸaA®`AÂ^Aâ^Aù]Aÿ]@ÿ]@ÿ]@ÿ]@ÿß9ÈC¹J©K›IGˆDƒA~AzBvCtE*qE5oF?mFGkFOjFVhF]fFedFmbFv`F‚^FŽ\Eœ[E¬YF¿XFßXF÷WEÿWEÿWDÿXDÿXDÿÚ=ÄGµN¤N–L‹KƒI}ExFtGpHnI'kJ2jK<hKDfKLdKSbKZ`Kb_Kj]Kt[JYJŒWJšUJªTJ½SJÜRJöRJÿRIÿRIÿRHÿSHÿÔAÀK²Q P’O‡N~LxHrJnK kMhN$fN/dO9bOBaPI_PQ]PX[O`YOhWOrUO}SOŠRN˜PN¨NN»MNÙMNõMNÿMMÿMMÿNLÿNLÿÎD¼N®TœSŽRƒQzPrMlOhP eQcR!aS,_S6]T?[TGZTNXTVVT]TTfRSoPS{NSˆLS—KS§ISºHSÕHRóHRÿHQÿIQÿIPÿIPÿÊH¹RªW˜VŠUTvSlQgSbT_V]W[W)YX3XX<VYDUYLSYSQY[OXdMXmKXxIX†GW•EW¥DW¸CXÒCWòCVÿCUÿDUÿDTÿDTÿÆLµV¥Z”Y†X{XqWfVaX]YYZW[U\&S]0R]9Q^AO^IM^QL^XJ^aH]kF]vD]ƒB]’@]£?]¶>]Ð=\ñ>[ÿ>Zÿ>Zÿ>Yÿ?YÿÁP±Z¡]\‚[v[m[a[[]V^R` PaNb"Mb,Lc5Jc>IcFGcNFcVDc^Bch@cs>co=o"ÿJÿVÿ`ÿhÿpÿxý~ü…ú‹ù‘ø˜÷žõ¦ô®ò¹ñÇïàîòìÿìÿìÿëÿåÿàÿÞÿÿÿÿ ÿ ÿÿÿ+ÿ8ÿEþPûZøcõkórñyïî†ìŒê’é™ç æ©ä³áÀàÓÞëÜûÛÿÚÿÚÿÙÿÔÿÒÿÿ ÿ ÿÿ ÿÿû%ø2õ?òJíTê]çeälâsàzހ܆ÚהԛҤϭ͹ËÉÉäÈöÆÿÅÿÆÿÇÿÇÿÇÿÿ ÿÿÿÿ ôïê,å8âCÝNÙWÔ_ÑgÎmÌtÊzȀƇŎÖÁž¿¨½³ºÂ¹Û·ðµÿ¶ÿµÿµÿµÿµÿÿ ÿÿþöè àÙ$Ñ1Í<ÊGÆQÃYÀ`¾g¼nºt¹{·‚µ‰³‘²š°¤®¯¬½ªÐ¨ë§û¦ÿ¦ÿ¥ÿ¥ÿ¥ÿÿ ÿô ê âÚÏÈÂ)¾5»@·J´S²[°b®h¬o«u©}¨„¦¤–£ ¡«Ÿ¹Ìœèšù™ÿ˜ÿ—ÿ—ÿ—ÿÿ÷èÜÎÆ  ¼·!².®:«D¨M¦U¤ \¢ c  jŸ q xœ €š ‰™ “— ž• ª” ¸’ ÌêŽüŒÿ‹ÿ‹ÿ‹ÿŠÿûíÝ Ì!¿·³² « §&£3Ÿ>GšP˜W–^•e“l’s|…‹šŠ§ˆµ†É„ç‚û€ÿÿÿÿÿõä#Ï)À*³&ª"¥¤ ›!—-”8‘BKR‹Y‰`ˆg†o…wƒ€‚‹€—~ £} ²{ Åy!äw"ùv"ÿu"ÿt!ÿt!ÿt!ÿï!Û+Ç1¶1©. *›&˜!• !(‰#3‡$=…$Fƒ%N&U&\~&c|'k{'sy'|x(‡v(“t( r(¯q)Áo)àm)÷l)ÿk)ÿk)ÿk(ÿk(ÿè(Ð2À8®7¡5˜2’-Ž)‹' ‡(ƒ*#€+/~,9|,Bz-Jx.Qw.Xu.`s/gr/op/yo/ƒm/k/i/¬h0¾g0Ûe0õd0ÿc0ÿc/ÿc/ÿc/ÿâ.Ê8º=¨<š:‘7Š3†0ƒ. /{0x2+v35t3>r4Fp4No5Um5\l5dj5lh5ug5€e5Œc5ša6©`6»_6Ö]6ó]6ÿ\6ÿ\5ÿ\5ÿ\4ÿÜ3Å<´A¢@•>‹<„96{4w5t7q8'o92m9;k:Cj:Kh;Rg;Ye;ac;ib;r`;}^;Š\;—[;§Y;¸X;ÒW;ñV;ÿV;ÿV:ÿV:ÿV9ÿÔ7ÀA¯DCB…@~>y;t:q:m<k=$i>/g?8e?@d@Hb@Oa@W_@^]@f\@oZ@zX@‡V@•T@¤S@¶R@ÏQ@ïP@ÿP?ÿP?ÿQ>ÿQ>ÿÏ;½EªG™F‹EDyBt>o?k@ gAeB!cC+aC5_D>^DE]EM[ETYE\XEdVEmTExRE…QD“OD£ME´LEÌKEíKDÿKDÿKCÿLBÿLBÿÊ?¹H¦J•I‡H}GuEnBiCeD bE_F]G(\H2ZH;YICWIJVIRTIYSIaQIkOIvMI‚KI‘JI¡HI³GIÊFIìFHÿFHÿGGÿGFÿGFÿÆC¶L¢L‘L„KyJpIiFdG_I\JZKXL%VL/UM8SM@RMHQNOONWNN_LNiJNsHM€FMEMŸCM±BMÈAMêALÿALÿBKÿBJÿBJÿÂG³OžON€NuMlLcJ^LZMVNTORP"QQ,OQ5NR=MRELRMJRTIR]GRfERqCR~AR?R>R¯=RÆW{?\F>]O=]W;]a:]l8]y6]ˆ4]™3]«1]Â1\å1[ü1Zÿ1Yÿ2Yÿ2Xÿ¶T¤YX€XsWiW`XTYN[H]C_@`>a=a ;b):b29b:8cB7cK6cT4c]3ch1cv/c….c–,c©+c¿*cã*bû*`ÿ+_ÿ+_ÿ+^ÿ±Yž\‹\{[o[e[\\Q^I`Cb“K“Y“i“{’’¦‘¿‘åúÿÿÿw}uptbuUxI|?€4„+‰"‘”— ›žž"Ÿ+Ÿ5 B P _ q ‡ŸŸµžÚöÿœÿœÿ†}x|i|[NƒAˆ6Œ,‘#–šž ¡¤§©© ª«¬­"®+¯7¯E¯T¯f¯{®”®«®É®ï­ÿ­ÿ­ÿ„q„a‡S‹F9–.›# ¤¨ ¬¯²¶··¸¹ º»½!¾+À8ÀHÀZÁnÁ†Á ÁºÁãÀùÀÿÀÿyhY”Kš= 1¥%«¯³ ¸»¾ÁÄÅÆÇÈÊ ÌÎÐÓ+Õ:ÕLÖ`ØwؒجÙÉÙìÙûØÿp™`žQ¤Cª5°(¶º¾ ÁÅÈËÏÒÓÖØÛÝßâ åèì*í<íQîgïïœð·ðÓðìðôg¦X­I´:º*¾ÂÆÊÎÒÖÜàãäæèëíïòõ øüÿ,ÿ?ÿUÿnÿŠÿ¤ÿºÿÑÿáÿÿÿÿÿÿ%ÿ2ÿ?ÿKÿVÿ`ÿhÿpÿxÿÿ…ÿ‹ÿ‘ÿ˜ÿžþ¦ý®ü¹úÈùâøô÷ÿöÿöÿïÿçÿâÿÞÿÿÿÿÿÿÿ ÿ-ÿ:ÿFÿQÿ[ÿcþküsúyù€÷†öŒõ’ó™ò ð©î³íÁëÖêîéþçÿçÿåÿÝÿÕÿÑÿÿ ÿ ÿÿ ÿÿÿ(ÿ5ÿ@úKöUó^ñfîmìtëzé€ç†æä“â›à£Þ­Ü¹ÚÊ×æÔøÒÿÒÿÒÿÎÿÉÿÆÿÿÿÿÿÿ ü÷"ó.ï:ìEèOäXá`ÞgÛmÙtÕzӀчώ͕˞ɧdzÅÂÃÜÁñ¿ÿ¿ÿ¾ÿ¾ÿ½ÿ»ÿÿÿÿÿöîçá'Ý3Ù>ÓIÏRËYÈaÆgÄmÂsÀz¿€½ˆ»¹˜¸¢µ­³»±Î°ê¯ü­ÿ­ÿ®ÿ®ÿ®ÿÿÿýòèÞ ÓÌ!È,Ä8ÁB½KºS¸Z¶a´g²m°t¯z­‚¬Šª“¨¦¨¤µ¢Æ¡ãŸöžÿžÿžÿžÿžÿÿûîâÕËý¸%´1±;®E¬M©U§[¥b¤h¢n¡uŸ|ž…œŽš˜˜¤–°•Á“Ü’ò‘ÿÿÿÿÿý ðáΠ»· ±¬¨)¥4¢>ŸGO›V™\—c–i”p“x‘€ŠŽ•Œ¡Š®‰¾‡؆ ð„ ÿƒ ÿƒ ÿƒ ÿƒ ÿöæÒÀ³¬¨ ¦ ¢"™ .– 8” A’ J QŽ XŒ ^‹ e‰ lˆt†}…‡ƒ“Ÿ€­~¾}ÛzôxÿwÿwÿwÿwÿïÛ!Æ$´#¨  ›™˜“'Œ2‰<‡D…LƒSZ€`~h}o{xyƒxvœtªs»rÔoñnÿmÿmÿmÿmÿç Ð)¼+«*ž(–$ Œ ˆ„"-~7|@zHyOwUv\tcskq tp n!‹l!˜k!§i"¸h"Ïf"îe#ÿd#ÿd"ÿd"ÿd!ÿà&È/´1£0–.+‡(„$‚ ~ {"x#)u$3s%<q%Cp&Kn&Rm'Yk'`j'hi(qg({e(ˆd)•b)¤`)µ_)Ë^*ì\*ÿ\)ÿ\)ÿ\)ÿ\(ÿØ,Ã5­543†1€-|+y(v'r)p*%m+/k,8j,@h-Gg-Ne.Ud.]c.ea/n_/x^/„\/’Z/¡Y/²X0ÈV0éU0þU/ÿU/ÿU.ÿU.ÿÐ1½:¨9—8Š7€6z2u0r.n. k/i0!f1+d24c2=a3D`3K_4R]4Z\4bZ4kY5uW5‚U5T5ŸR5°Q5ÆP5çO5ýO5ÿO4ÿO4ÿO3ÿË6¸=£<’<…;{:t7o5l3h4 e5b6`7(^71]8:[8AZ9HY9PW9WV:_T:hS:sQ:O:N:L:®K:ÃJ:åI:üI9ÿI9ÿI8ÿJ8ÿÇ:³@ž?Ž?>w=p;j8f8b9_:\;Z;%Y<.W=7V=>T>FS>MR>UQ>]O?fM?pL?}J?‹H?›G?¬E?ÁD?ãD>ûD>ÿD=ÿD=ÿE<ÿÃ>¯CšBŠB}As@k?e<`<\>Y>W?U@"SA+RA4PB<OBCNBKMCRKCZJCdHCnGC{EC‰CC™BC«@CÀ?Cá?Cù?Bÿ?Aÿ@Aÿ@@ÿ¿AªE–E†EyDoDgB`?[AWBTC QDOENE(LF1KF9JGAIGHHGPFGXEGaCHlBHx@H‡>H—CKFBLMALV@L_>LjPC%cG#cQ"d\!didydŠdžd³dÎcñaÿ`ÿ`ÿ_ÿ¡YŒX{XmXbXYXPYG[>^7`1c*f$i !j jj k(k0k9kBlLlXleltl†lšl¯lÊkïiÿhÿhÿgÿ™]…]u\h\^\U\K^Ba9d2g+j$mps ttt!u)u2u;uFuRu_ un u u• uªtà tç sý qÿ qÿ pÿ‘bapadaZaObEe‡2'’—œ ¤¨«®¯°±³ ´µ¶¸$º1º@ºR»e»}º—º±ºÒºó¹ÿ¹ÿoƒ_†Q‹C6—*¢§ ¬°´·»¾¿ÀÁÃÄÅ ÇÊÍ$Î3ÏDÐXÐnшФÐÁÑæÑøÑÿgW”Iš;¡.§!­³¸¼ÀÃÆËÍÎÐÑÔÖÚÜ ßãæ$ç6èIé_êxë”ë¯ëÌìèìö_žP¤B«4²&¹¾ÂÅÊÍÑØÛßàâäæéëîñõ ùü%ý9þOÿgÿ‚ÿÿµÿËÿäÿÿÿÿÿÿ"ÿ/ÿ;ÿGÿRÿ[ÿdÿlÿsÿzÿ€ÿ†ÿŒþ“ý™û¡ú©ø´÷ÂöÚõñôÿóÿóÿéÿàÿØÿÓÿÿÿ ÿ ÿ ÿÿÿ*ÿ6ÿAÿLÿVþ_ûfùm÷tõzô€ò†ðï”í›ì¤ê®éºçÍåéäûãÿâÿÞÿÑÿÌÿÈÿÿ ÿÿÿÿÿÿ$ý0û;÷FóPïYì`êgçnætäzâ€à‡ÞŽÜ•ÚžÖ¨Ô³ÑÃÏßÎôÌÿËÿËÿÅÿ¿ÿ¼ÿÿÿÿÿý ÷ñí*ê5ç@âJÝRÙZÕaÒgÐmÎsÌzʀȇÆÄ˜Â¡À­¾»¼Ðºí¹þ¸ÿ¸ÿ·ÿ³ÿ°ÿÿÿÿùîåÞØ#Ò.Ï9ËCÇLÄTÁ[¿a¼g»m¹s·zµ´‰²’°›¯§¬´«Æ©ä§ø¦ÿ¦ÿ¥ÿ¥ÿ¤ÿÿÿõêÞРȾ(»3¹=µF²M°U­[¬aªg¨m§s¥z¤‚¢Œ –Ÿ¡®›¾™Ø—ñ–ÿ–ÿ—ÿ—ÿ—ÿÿõçÔÉÀ¸³¯!«,¨6¦?£G¡OŸU[›ašg˜n—u•}”†’‘œŽ©Œ¸‹Í‰ëˆýˆÿˆÿˆÿˆÿùé Ôà · °« ¦¢ž%›0˜9–A”I’PVŽ\b‹iŠpˆx‡…Œ„˜‚¥€´~È}ç|ù{ÿ{ÿ{ÿ{ÿñÞÅ´©¡ž › —“)3Š<ˆC†K…QƒW‚^€dl}t|~z ‰x –w £u ³s Çr æp ûp ÿo ÿo ÿo ÿèй©•Ž ‰ † #ƒ -€ 6~>|F{MySxZvauhsqq{p‡n”l¢k²iÇhçfýeÿeÿeÿeÿ߯$°$ #”!‹†ƒ‚|y(v1t:rAqHoOnVl]kdimhwfƒdcŸa¯`Ä^ä]û\ÿ\ÿ\ÿ\ÿÕ%½*¨)˜)Œ(ƒ%}"yxvro#m-k5i=hDfKeRc Yb aa i_!s]!\!Z"œY"¬W"ÀV#áU#ùT#ÿT"ÿT"ÿT"ÿÍ+¶.¢.’.…-|+v(r&o#m! j"g#e$)c$1b%9`&A_&H]&O\'V[']Y'fX(pV(|T(ŠS)™Q)ªP)¾O)ÞN)÷M)ÿM)ÿM(ÿN(ÿÈ0°2œ2Œ2€1v0p-k+h)f( c(`)^*%\+.[+6Y,=X,DW-LU-ST-[S-cQ.nP.zN.ˆL/—K/¨I/»H/ÛH/öG/ÿG.ÿG-ÿH-ÿÄ4«5—5‡5{5r4k2f/b._-\.Z/X0"V0+U13S1:R2BQ2IP2PN3XM3aK3kJ3wH4…G4•E4¦C4¹B4ÖB4ôB4ÿB3ÿB2ÿB2ÿÀ8§8“8ƒ8w8m7f6a3]2Y2W3 T4R5Q5(O60N68L7?K7FJ7NI8VG8_F8iD8uC8ƒA9“@9¤>9¸=9Ó<9ó<8ÿ=7ÿ=7ÿ=6ÿ»;¢;;;s;j:b9]7X6T7Q8 O9M9K:%J:-H;5G;<F=<=‘:=£9=¶8=Ñ7=ò7<ÿ8;ÿ8;ÿ8:ÿ¶=ž>‹>|>o>f=^=X;S:O;L<I=G>F?"D?*C?2B@:A@A@@I>AQ=AZÿ±@š@‡@xAlAb@[@T?N?J@FADBBC@C?D'>D/:EF9EN8FX6Fb5Fn3F|1F0FŸ.F³-FÌ-Fï-Eÿ.Dÿ.Cÿ.Cÿ¬C–CƒCtChC_CWCPCHCDEAF>G nJnWnenvnŠmŸm¶lÖlókÿjÿjÿ…ZtZfZ\YSYHZ?]6`.c&gjmqt w wwww$x-x7xCxPx^xox„x™w°vÍuðuÿtÿtÿ~_n_b^Y^M_Bb9e0h'lptw {~€ ‚ƒƒ&„0„;„H„W„h„|„“ƒª‚Åëþ€ÿ€ÿweid_cRdGgÀG¼NºU·[µa³g²m°s®z¬‚ª‹¨•§ ¥­£¾¡Û ôŸÿžÿŸÿÿ›ÿÿüîàО¹µ#³.°7­@ªH¨O¥U£[¢` fŸls›{š„˜Ž–š•§“·‘ÌìÿŽÿŽÿŽÿÿüïÛɽµ® ©¥¢' 1:šB˜I–O”U“[‘`gŽmu‹~‰‰ˆ•†¢…±ƒÄä€ùÿ€ÿ€ÿ€ÿôà Ç·¬¦ ›˜•!’*3<‹C‰I‡P†U„[ƒah€p~y|„{yx¬v¾uÝsôsÿsÿsÿsÿé Ϲ©ž— “ Œ‰†$ƒ.6>}D|KzQyWw]vdtlsuq€onšlªk»iÖhñhÿgÿgÿgÿßîž“‹†„ ƒ €|y(w0u8s @r Fp Lo Sm Yl aj ii rg ~f ‹d ™b ©a »` Ø^ó]ÿ]ÿ]ÿ]ÿÔ¹¤•‰{xxw sp"n+l3j;iBgIfOdVc]af`o^{\ˆ[—Y§WºVÕUóTÿTÿTÿTÿÊ"°"##"y!sonm jge'c/a7`>^E]K\RZZYbWlVwT…R”Q¤O·NÐMñLÿLÿMÿMÿÃ&ª'–'‡({'r&l$h!fdb_]#[+Z3X:WAV HT OS WQ!_P!iN!tM!‚K"‘I"¢H"´G"ÍF#ïE#ÿE"ÿF"ÿF!ÿ¼*¤+‘+‚,v+m*f)b&_$]"[!X"V#T$(S$0R%7P%>O&EN&LL&TK'\I'fH'qF'E(C( A(²@(Ë?(í?(ÿ?(ÿ@'ÿ@'ÿ·-Ÿ.Œ/}/q/h.a-]+Z(W'T' R(P)N)%M*,K*4J+;I+BH,IF,QE,ZD,dB-o@-}?-=-ž<-°:-È:-ë:-ÿ:-ÿ:,ÿ:,ÿ²0›1ˆ2y2m2d2]1X/U,Q,O- L-J.I/"G/*F01E08C0?B1GA1O@1W>1a=2m;2{92‹82œ62¯52Ç42é42ÿ51ÿ51ÿ50ÿ­3–4„5u5i5`5Y4T3P0L1I1G2E3C3B4'@4.?56>5==5D<6L:6U96_76k66x47‰27š17­/7Å/7è/6þ05ÿ05ÿ04ÿ©6’6€7r8f8]7V7P6K4G5D6A7 ?8>8<9$;9,:939::8:B6:J5:S4;]2;h0;v/;‡-;™,;¬*;Ã);æ*:ý*:ÿ+9ÿ,8ÿ¤8Ž9|:n:c:Z:S:M:F8B:?;<< :<8=7=!6>)4>03>72??1?G0?P.?Z-@f+@t)@„(@—&@ª%@Á$@å$?ü%>ÿ&=ÿ&=ÿŸ;Š<x=j=_=V=O=I=B=<>9?6A4A2B1B/C%.C--C4,D<+DD*DM(DX'Ec%Eq#E‚"E• E¨E¿DãDûCÿ Bÿ!Aÿš>…?t@g@\@S@L@F@>A8C4E0F-G +H*H)H"(I)'I1%I9$IA#JJ"JU JaJoJJ’J¦J½JàIúHÿGÿGÿ•B€BpCcCXCPCICBD;E5G0I+K&M $N"N!O O%O,O5O=PGPQP]PkP|PP¤PºPÞOøNÿMÿMÿE{FkF_GUGMGFG?G7J1L+N&P SU VVV V'V0V9WBWMWYWhWyWŒ W  W¶ VÔ Vô Uÿ TÿSÿˆIvJgJ[JQJJJCJ;L3N,Q&T!VY\^ ^^^"^* ^3 ^= ^H ^T^b^s^†^›^±]Ì]î\ÿ[ÿ[ÿNpNbNWNNNGN>O6Q.T'W!Z]`c f gggg$g-g7gBgNg\gmg€f•f¬eÇeëdüdÿcÿzRjS]RTRKRBS9U0X([!_beh kn ooopp'q0q;qHqVqfqyqp§oÁoçnümÿmÿsXeWZWQVFWÿHÿRÿZÿbÿiÿoÿuþ{üûˆù÷—õ óªò·ïÉíæìûëÿëÿÝÿÎÿÆÿÂÿÿÿÿÿÿ ÿÿ!ÿ,ÿ8ÿCýLùT÷\ôcòiðoîuì{ê‚è‰ç‘äšâ¤à°ÝÀÚÜØôÕÿÓÿËÿÁÿ»ÿ·ÿÿÿÿÿÿ ýùö'ô2ð<ìFèNäVá\ÞcÜhÙnÕtÒ{Ð‚ÍŠË“ÈÆ¨Ä·ÁÌÀë¾ÿ½ÿ½ÿ´ÿ®ÿ«ÿÿÿÿúòêåà!Ý+Û6Ó?ÎHÊOÇVÄ\ÂaÀg¾m¼sºz¸‚¶‹´–²¡°¯®Á­à«÷ªÿ©ÿ¦ÿ¡ÿŸÿÿÿ÷èÜÐ ÊÅÂ%¿/¼8¸AµH²O°U®[¬aªf¨l§s¥{£„¡ŽŸš§›¸šÐ™ï˜ÿ—ÿ–ÿ”ÿ’ÿÿöäÒÅ»µ°¬ª)¨2¥:¢B IžOœUšZ˜`–f•l“t’}‡Ž“Œ¡‹°ŠÅˆæ‡û†ÿ‡ÿ‡ÿ†ÿøåͽ³ª£ Ÿ›™#—,•4’<CŽIŒOŠT‰Z‡`†f„nƒw~›|ª{¼zÛxõxÿxÿxÿxÿíÑ»¬¢›–‘ ‹ˆ&†.„6‚=€C~I}O|Uz[yawiuqt|rˆq–o¥n¶mÎlîkÿkÿkÿkÿß Â ® ž “ Œˆ… | z(x0v8t>sDqJpPnVm]ldjmhwg„e’d¡c²aÉ`é`ü`ÿ`ÿ`ÿж¢“ˆ€| y x usp#n+l3j9i@gFfLeRcYba`j_t]\ZŸY°WÆV çV ûU ÿU ÿV ÿÆ­™Švqnm m j g e &c .b 5` <_ B^ H\ O[ VY ^XhVsU€SQŸP±NÈMêMýMÿMÿMÿ¼¥’ƒwoifddb_]![)Z1X8W>VETLSSQ[PeNpL}KŒIœG®FÅEèEþEÿEÿEÿµž!‹"|"q"h!b_\[Z WUT%R-Q4O;NBMHKPJXHbGmEzC‰Bš@¬?Â>å=ü>ÿ>ÿ>ÿ¯#˜$†%w&l&c%]$Y"VTS QNM"K)J1I7G>F EE MC UB _@!j?!w=!‡;!˜9!ª8"À7"ã7"û7"ÿ8!ÿ8!ÿª&”')s)g)_)X(T&Q#O"L"J"H"G#E$&D$.B$4A%;@%C?%J=&S<&\:&g9&u7'„5'–4'¨2'¾1'á1'ù2&ÿ2&ÿ3%ÿ¥)*},o,d-[,U+P*L(J&G'D' B(A(?)#>)+=)2<*9;*@9*H8+P6+Z5+e3+r1+‚0,”.,§,,¼+,Þ,,ø,+ÿ-*ÿ-*ÿ¡,‹-y.k/`/X/Q.L.H,E+A+?, =,;-:.!9.(7./6/65/>4/E3/N10X00c.0p,0€*0’)0¥'0º&0Ü&0÷'/ÿ(/ÿ(.ÿœ.‡0v1h2]2U2N1H1D0@/<0:1 71625233%23,13304;/4C-4L,4V*5a)5n'5~%5#5£"5¹!5Ù!4ö"4ÿ#3ÿ#2ÿ˜1ƒ3r4e4Z5Q5K4E4@4:374452607/7.7"-8)+81*88)9@(9I&9S%9_#9l!:| :Ž:¢:·9Õ9õ8ÿ8ÿ7ÿ“46n7a7W7N7H7B7<75829/:,; *<)<(=&=&%=.$=5#>=">F >P>\?i?y?Œ? ?µ>Ò>ó=ÿ<ÿ<ÿŽ7z8j9^:S:K:E:?:9:2<.>)@&A$B"B!B C#C*C2C:DCDMDYDgDwDŠDžD³DÐCòBÿBÿAÿ‰;v<f=Z=P=H=B=<=6>/@*B%D!FH IIII&I.J6J@JJJVJdJtJ‡ J› J° JÊ Iì Hÿ Gÿ Gÿƒ>q?b@V@M@E@?@9A2B+E&G!IKNPPPP!P)P1 P; QF QQ Q_ QoPP–P«PÅOèOûNÿMÿ}BkC]DRDJDCCüGøOôWñ]îcìiêoèuæ|äƒâ‹ß•ÜŸÙ«Õ»ÒÔÏòÍÿÌÿÅÿºÿ´ÿ°ÿÿÿÿÿÿùõó"ñ-í7ç@âIßPÛW×]ÔcÑhÏnÌuÊ|ȄŘÀ¤½²»Æ¹è¸ý·ÿ¶ÿ­ÿ§ÿ£ÿÿÿÿõëä ÞÙÓ&Ñ0Ì:ÈBÄJÀP½V»\¹a·gµm³t±|¯…­ªœ¨ª¦»¥Ú£õ£ÿ¢ÿžÿšÿ—ÿÿþïßÐÇÁ¼¹ ·*µ3°;­C«I¨O¦U¤Z£`¡fŸmtœ}šˆ˜”–¢”²’É‘ë‘ÿÿÿŒÿŠÿüìÙǺ±« §¤¡$ ,ž5›<˜C–I”O’TZ_f‹m‰vˆ€†Œ„š‚ª¾€à€ùÿÿÿ~ÿñØÂ³¨ ™•’Ž&.Š6‡=…C„I‚NTY~`|gzoyzw†u”t£rµrÏqñpÿpÿpÿqÿáİ¢—‘‹† ƒ!})|0y7x=vCtIsNrTpZobmjktj€hŽge¯eÆdèdýcÿcÿdÿ϶£”‰‚~{wurq#o+m2l8j>iDgIfOeVc]be`o_{]‰\™[ªY¿YáXøXÿXÿYÿ ª —‰}v q om kige&c-a3`9_?]E\K[RZYXbWlUxS†R–Q§P»OÛNôNÿNÿNÿ¸¡Žtlgec c a^\![(Y/X5V;UBTHSOQVP _N iM vK „I ”H ¦G ºF ØE óE ÿE ÿE ÿ°™‡xme_\ZZZ W U S $R +P 1O8N>MEKMJUH^GhEuC„A•@¦>»=Ü=ö=ÿ=ÿ>ÿ©’rg_YUSRR PNL J'I.H4G;EBDICRA[?e>r<:’8¤7¹5Ø5õ6ÿ6ÿ7ÿ£{ m!b!Z!TPMLKIGED$B*A1@8??=F<O:X9c7o5~32¢0·/Ó/ó/ÿ0ÿ0ÿˆ"w#i$^$V$P#K"H FEC A?>!<';.:59<7D6L4 V3 `1 m/ |-!Ž,! *!µ)!Ð)!ò)!ÿ* ÿ+ ÿ™"„%s&e'['S'L&G%D$B!?!=! ;!9"8"6#%5#+4$23$92$A0$J/%S-%^+%k*%z(%Œ&%Ÿ$%³#%Î#%ð$%ÿ%$ÿ%$ÿ”%€'o)b*W*O*I)D(@'=&:%7&5&4'2'1("0()/(0-)7,)?+)G))Q(*\&*i$*x#*Š!**²*Ì*ï)ÿ )ÿ!(ÿ(|*l+_,T,L,F,A+<+8*5*2+0+ .,-,,,*-&)--(-4'.<&.E$.O#.Z!/g/v/ˆ/›/°/Ê.í.ÿ-ÿ-ÿŒ+x-h.[/Q/I/C/>.9.4.0.-/+0 )1'1&1%2#$2*#21!39 3B3L3W3d4t4†4š3®3È3ì3ÿ2ÿ1ÿ‡.t/e1X1N2F2@1;16111+3(4%5#6 !6 77 7'8.868?8I9U9b9q9„9˜9­8Ç8ë8ÿ7ÿ6ÿƒ1p2a4U4K4D4=48434-5(7$9 :; <===#=+>3><>F>R>_>o> >• >© >Á =ä =û <ÿ ;ÿ}4k6]7Q7H7A7;75707*9%; =?AC CCCD'D/D9 DC DN D[ DjD|DC¥C½CàCöBÿAÿx8g9Y:N:E:>:8:3:-;'=!@BDFI J J J J#J+J4J>JIJVJeJwJ‹J¡I¹IÝIõHÿHÿr<b=U>J>B=<=6=/>)@#BEGJL O P QQQQ&Q/Q9QDRQR`QrQ‡QQµPØPõOÿOÿl@]AQAGA@@9@2A*C$FHKNQ SVW XXYZ!Z)Z3Z?ZLZZZlZY™Y±XÑXôWÿWÿeEXEMEED>D5E-G%JMPSV Y\^_ ` abcd#d-d8dEdTdfd{c“c­bÌaòaÿ`ÿ_JSJJICH9I/L'ORUY ]`cfhij k mnpq&q1p>pNp_psoo§nÆmïlÿlÿZOPNHM=N3Q)T X\` dhkortuwx z |}€(€5€EVk„~ }¾|é{ÿzÿVTNSBT7V,Z"_ch mrvz}€ƒ„†‡‰‹ ’’,’;’M‘b‘z—´ŽáŒûŒÿUYHZ;]/a$flr w}‚†‹Ž‘“•—™›Ÿ ¢¤¦!¦1¦C¥W¤p£Ž£«¡Ð õŸÿNa@d3i'nu| ƒ‰Ž“˜¡¤¥§©«­°²µ¸¼¼%¼7»Lºd¹·¢·À·ê·üFk9p+w† Ž•›¡¦«°³··º¼¿ÁÄÇÊÍÑÔÔ+Ô@ÓXÓtÓ’Ò°ÒÓÒò>y1€#ˆ‘ ™ §®³¸½ÂÆÊÊÍÏÒÕÙÝßãçëìí3îKïdï‚ðŸñ¹ñØÿÿÿÿ ÿÿÿÿ)ÿ4ÿ?ÿHÿPÿXÿ^ÿeýkûqùwø~ö…óñ—î¢ë¯èÀæàãøâÿÛÿËÿÁÿ¹ÿ´ÿÿÿÿÿÿ ÿÿÿ#ÿ.ý9ùBõJòRîXë^édæjäpâvß}݆Ù՚ѧζËÎÉðÇÿÅÿ»ÿ´ÿ­ÿ©ÿÿÿÿÿûö ñíì(é2ã;ÝDØKÓQÐXÍ]ËcÉhÆoÄvÂ~¿‡¼’ºŸ·­µÁ²ä±ý¯ÿ¬ÿ¥ÿ ÿœÿÿÿûîäÜÓÏË"É+Æ4Á=½DºK·QµV²\°a®g¬nªv¨¦Š£–¡¥Ÿ¶Ñœó›ÿœÿ–ÿ“ÿÿÿöçÓÆ½¸ ³±¯%®.©6¦=£D¡JŸOU›Zš`˜f–n”w’ŽŽœŒ­ŠÃ‰èˆÿ‰ÿ‡ÿ…ÿ‚ÿóã̼°§¡ž›™˜'–/“7‘=ŽCŒI‹N‰T‡Y…`„g‚o€z~†|”z¤y¸xØw÷xÿxÿwÿuÿæË·¨ž–‹ ˆ‡…!„)‚07}=|CzHyMwSvYtariqsomlj¯iÈhíiÿiÿiÿiÿÒ¸¥—†|ywvt#s+q1o7n=lCkHjNhTg[eccmbx`‡_–]¨]¾\ä\û\ÿ\ÿ\ÿª˜‰xtpm kihf%e,c2b8`=_C^I\O[VZ^XhWsUT‘R£Q·QÖQõQÿQÿRÿ¶Ÿ ~ s l heca _]\!['Y-X3V9U?TESKQRPZOdMoL}JIŸH²GÌGïFÿGÿGÿ¬ •ƒukc^[ Z Y WUSR#Q)O/N5M;LAJHIOHWFaEmCzB‹@œ?¯>È=ê=ü=ÿ>ÿ¤Ž|nd\VSQP P OMKI%H +G 1F 8D >C EB M@ U? _= k< y: Š8 œ7 ¯5 Ç5 é5 ý5 ÿ6 ÿ‡vi^VPMJIIH F D C!B(@.?5><=C;K:T8^6k4y2Š1œ/°-É-ì-ÿ.ÿ/ÿ—‚qdYQLGDCBA @><;%:+82796@4H3Q1\0h.w,ˆ*š(®'Ç&ê'ÿ(ÿ)ÿ‘}m`VNHC@>=;9865"3(2/160=.F-O+Y*f(t&†$™"­!Å è!þ"ÿ#ÿyi!\"R"J"D!?!< 9854 20/.%-,+3*;)C'M&W$d"r „—«Ãçýÿÿ‰ u"e#Y$O%G%A$<#8#5"3 0 .! ,!+!*"("#'")�%#8##A"$J!$U$a$p$‚$•$ª$Á$å$ü#ÿ#ÿ…"q$b&V'L'D'>'9&5&1%.$+%)%'&%&$'#' "''!(. (6(>(H)S)_)n)€)”)¨)À(ä(û(ÿ'ÿ€%n'_(S)I*B);)6)2(.(*(&)$*"+ +,,,$-+-3-<-E.P.].l.~.’.§ -½ -ß -ù,ÿ,ÿ|(j*[+P,F,?,9,4+/+++&,"./0 1112!2(20293C3N3[3i 3z 3Ž 3¢2¹2Ù2ô 1ÿ 1ÿw+f-X.M/C/<.6.1.-.).#02356 7778$8,85 8? 8J 8W 8e8v8Š8Ÿ7µ7Ó7ñ6ÿ6ÿs.b0T1I1A19141/0+0%2 368:< = = = =! =)=1>;>F>R>a>r>†=œ=²=Ð<ð<ÿ<ÿm2]3P4F4>47423-3'4"68:=? A C DDDD$D-D6DADND\DmDD˜C¯CÍBðBÿBÿh6X7L8C8;75606)7#9;=@B EGI IJKK K(K2K=LILWKhK}K”J¬JÊIïIÿIÿb:T;I;@;9:39,:%<?ADG ILOP P QRTT#T,T7TDTRTcTwTS¨RÆRíQÿQÿ\?O?E?>>7=/>'@ CFIL ORTWXY Z[]^_&_1^=^L^]^q]‰]£\Á[ëZÿZÿVDKCCBÑFÍLÊRÈXÅ]ÃcÀi¾p¼x¹·´š±©®¼¬áªü¨ÿ ÿ™ÿ–ÿ”ÿÿùòçÛÑÊ ÇÄÂ&¿/»7·?´E±K®Q¬Vª\¨a¦h£p¡yŸ„‘š ˜±–Ì•ñ”ÿ‘ÿ‹ÿˆÿ†ÿ÷ìÞɼ´¯ «©¨ §(¢0Ÿ8œ>šD˜J–O”U“Z‘ahq‹{‰ˆ‡—…¨ƒ¾ä€ÿ€ÿ|ÿ{ÿyÿé×Á±¦—” ’"Ž*‹1‰8‡>…CƒHNT~Z|azixsvuŽsŸq³pÐoöoÿoÿmÿlÿÚ¿¬ž“Œ…‚ ~}|$z+w1u7t=rBqHoMnSlZkbilgxf†d—bªaÂ`ëaÿaÿaÿ`ÿÅ­›ƒ|wrp nllk%i,g1f7d=cBbH`N_U]]\fZrY€WV£U¹TÞTûTÿUÿUÿ¶Ÿunifc a`_^ ]&[,Z2X7W=VCUISPRXQaOlNzLŠKœJ±IÎIóIÿIÿJÿª”‚tjc^[YW VTSR"Q(P-N3M8L>KEJLHTG]FhDuC…A˜@«@Å?ê?ÿ@ÿ@ÿ Š y l a Z U R PON LKJI#G)F/E4D:BAAH@P>Z=d<r:‚9”8§7¾6ã6ù6ÿ7ÿ˜ ƒre[SNJH G G EDBA @%>+=1<7;>:E9N7W6b4p2€1’0¥/».Ý.õ-ÿ.ÿ‘}l_UNHDA@@ @ > < ; 9 "8 (7 .6 55 ;3 C2 L0 V/ a- o+ * ’( ¥' »% Ý% õ& ÿ' ÿ‹wg[QIC?<:998 7542%1,02/:-B,K*U(a&o$€#“!§½à÷ÿ ÿ†scWME@;85432 1/-,"+)*0(7'?&H$S"_ m~‘¥»Þøÿÿ‚o_SJB<741/.,+)(' %&$-#4"= FQ]k|£ºÛöÿÿ}k\P G ? 941-+)'% $"! #*2:DN[iz¢¸ØõÿÿzgY!M"D"<"6"2!.!* ' $"  !!!"!"'"/"8#A#L#X#g#x#‹ #Ÿ #´ #Ð "ð "ÿ !ÿvd"V#K$A$:$4$/#+#(#$# #$%& &&''%','5(?(J(V (d (t (‡ (›'±'Ì'ì&þ&ÿq"`$S&H'?'7&1&-&)%%%"%'(*+ ,,,,",)-2 -; -F -R-`-p-ƒ-˜,®,É,ë+ü+ÿm%]'O(E)<)5)/(+(''#'(*,.01 1 1 1 1&2.272B2N2\2l22•1¬1Ç0ê0ü0ÿh)X*L+A,9,2+-+)*%* +,.024 7 7777"7*838>8J8X8h8|7’7©6Å6ê6ý5ÿc,T.H/>/6.0.+-'-"-/1357 :; <=>>>&>/>:>F>T>d>w>=§=Ã<é<ý;ÿ^0P1D2;241.0)/$02469 ; =@A B CDEF"F+F5FAFOF_FsEŠE¤DÀCèCþBÿX4K5A59524-3&4 58:= @ BEGHJ KLNOO%O/O<OJOZNmN…M L¼KçKþJÿS9G9>97817)7!9<?B EHJMOQRT UWYZY)Y6YDYTXgXWšV·UãTýTÿN=C=<<5;,<$>ADH KNQTWY[]^` bdgg"f.f<fMe`ewd“c±aÝ`ü_ÿIBAA:?0@&CFJN RVZ]`cegikmo ruwv&v5uFtYtos‹r©pÍo÷nÿFF@E5F*H LQV Z_chkoruwy{}€ƒ† ‰ŠŠ+‰<ˆO†f…„ ‚ÂðÿFK:L.O#SX^ diotx|„‡ˆ‹Ž“–™ ¡ ! 1žD[œv™–™µ–å•þ?R2U&Z`g mt{†‹”—™œŸ¡¤§ª­±µ ¸·&¶9µP´j²‰°ª®Ï­õ7\+ahp x€‡Ž•šŸ¤¨¬­°³µ¸»¿ÃÇËÑÑÐ.ÏEÍ_Ë~ɞȾÅé/i#py ‹“›¢¨®´¸½ÀÂÅÈËÎÑÖÛßäèëê#ê:éTçrå“ã³ãÔÿÿÿÿÿ ÿÿÿ!ÿ+ÿ5ÿ>ÿGÿNÿUü[úaøfömôsò{ï„íŽê™æ§ã¹ßÕÛ÷ÖÿÀÿ²ÿªÿ¥ÿ¢ÿÿÿþüüþ ÿÿý$ù.ô8ð@ìHéNæTâZß_ÜeØkÔrÐ{ͅʑǞîÀŽë»ÿ°ÿ¤ÿœÿ˜ÿ•ÿÿúôñòêçâáá(Ø1Ð9Ë@ÈGÅMÂS¿X½^»d¹k¶s´|±ˆ®•«¤¨¸¦Ü£ûŸÿ•ÿÿ‹ÿ‰ÿùïçßÏÈÁ ¿¼»!¹*´2±:®@«F¨L¦Q£V¡\Ÿcj›s™~–Œ”›’­ÇŽðÿ†ÿ€ÿ}ÿ|ÿíàÑ¿³ª¦¢ ¡ Ÿ#›+˜2•9“?‘DJŽOŒUŠ[ˆc†k„v‚‚€’~£|ºzáyÿwÿrÿpÿoÿÝ˶§”Ž‹ ‰ˆ‡‡%„,‚28}={CyHxNvTu[scqnozm‰lšj®iÌhögÿeÿdÿcÿÊ´¡“‰‚{xv utsr%p,n2l7j<iBhHfNeUc]bf`r^€]’[¥Z¾YéYÿYÿXÿXÿ¹¢ƒyqmif edcc a&`,^1\7[<ZBXHWOVWT`SlQyPŠOžN´MÚMûMÿMÿMÿª”‚ukd`]ZX WVVU!S'R,Q1O7N=MCLJJRI[HfFsE„D—C¬BÉBñBÿCÿCÿž‰xjaZURPN M LKJI"H'G-E2D8C>BEAM?V>a=n;~:‘9¦8¿8è8ÿ9ÿ9ÿ•€o b X Q LIGFD CBAA?#>)=.;4::9A8I7R6]4j3z2Œ1¡0¸/Þ/ù/ÿ0ÿŒ x h \RKE A ? >=< ;:98 6%5+40372>1F/P.Z-g+w*‰)(³'Ñ'ò'ÿ'ÿ† rcVME@<97 6 6 54210"/(..-4+<*D)N'Y&e$u#‡"› ° Ëíþÿ€m^RHA;74200 0 / - , * ) %( +' 2& :$ C# M! X e u ˆ œ ± Ê ë ü ÿ{iZNE=830-+**) (&%$##)!1 9BLXfv‰ž³ÎîþÿweWKB:40,)'&%# "!  '.6@JVdt‡œ± Ê ëþÿsaSH?72-)&$"  $+4=HTbr „ ˜ ­ Æ ç ú ÿo^PE<5/*&#! ")1;E Q ^ m €”ªÂæøÿk[MB:2-($! !!!!"& ". "7 "A "M"Z"i"|"‘"¨!À!å ø ÿgWJ!@!7"0!*!& "  !#$& & & & &"&*'3'='I'V'f'y'&¦&¿%ä%ù$ÿc T"G#=$4$.#(#$"!"!"#$&( * ++++,',0,:,E,S,c,v,Œ+¤+¾*ä*ú)ÿ_#P%D&:&2&+&&%#$$$%')+ -/ 00111#2,262B2O2_2r1‰1¢0¼0ä/û/ÿZ'L(@)7)/))(%'!&'(*,. 024 5 6788 8(829=9K9[8n8…7Ÿ7º6ä5ü5ÿU*H,=,4,-+(*$)*+-/ 1 468:; = >@@@$@.@9@G@V@i@€?›>·=ã<ü<ÿP/C/9/2/,-', -/13 6 8;=@ACE FHJJJ(J4IBIQIdH{H—G´FàEüDÿJ3?36301*0#1358 ;>ACFHJLNO QTUU"T.T<TKS^StRQ®P×OûNÿE7<756/4&57:= ADHJMPSUWX[] _bbb'b4aE`W`m_‰]§\ÌZøYÿA<:;49*:!<@C GKOSVY\_acegjm psr r-q=pOoen€mŸkÁiñhÿ?@9>.?$BFJ OTX]aehknqsux{~ …‡†$…4„F‚]v–~¶|çzÿ?D3E(HLR W]chmqvz~ƒ†‰‹Ž’•™ žž)œ<šR˜l–‹”ª’Ôú8K,N SY `gntz€„ŠŽ’•—š £§«¯´ ¸·µ0³F±`¯~¬ «Á©î1U$[aiqyˆ”šŸ¤¨©¬¯³µ¹½ÁÆËÑ ÓÑ%Ð;ÍTÊqȒųÃÞ)biq{„•£©¯´¹¼¾ÂÅÈÌÐÔÚßäêî íì/êIèeæ†ä¥âÆÿÿÿüüþÿÿÿ&ÿ0ÿ:ÿBÿIþPûVù\öbôhòoðvíê‰ç•ä£àµÛÐÕöÊÿ¶ÿ¨ÿŸÿšÿ–ÿÿûöóóö úýû ÷*ò3í;éCæIâOÞUÛ[Ö`ÒgÏnÌvɀƌš¿ª»Á¸é¶ÿ§ÿšÿ’ÿÿŠÿúñêççäà ÛÚÛ#Ñ,Ê4Æ;ÂB¿H¼NºS¸Y¶_³f±n®w¬ƒ©‘¦¡£µ Øžû•ÿ‹ÿ…ÿ€ÿ~ÿïãÚÓÆ¿¹·´´³%®-«4§;¤A¡FŸLQ›W™^—e•n“y‡Ž—Œ©‰Äˆï…ÿ|ÿvÿsÿrÿàÐÆ¶©¡™ ˜˜—”&‘-4Œ:Š?ˆE‡J…PƒV^€f~q|}yw u¶sßrÿnÿiÿgÿeÿ̾«“Š…‚€ € }&z-w3u8t>rCpIoOmVl^jhhug„e–d«bÉaö`ÿ\ÿ[ÿZÿ½©—‰~xsom lkkj h&f,e2c7b<`B_H]O\WZaYmW{VŽU¢S»RéRÿPÿOÿOÿ­˜†xngc`]\ [[[Z!X&V,T1S6R<QBOINQM[KfJtI…H™G±FØFüEÿEÿEÿŸ‰xlb[VSQOO NNML!J&I,H1G7E=DDCLBU@`?n>~=’<©;Ç;ó;ÿ;ÿ<ÿ“~naXQLIGED CCCB@"?'>,=2;8:?9G8P7[5h4x3Œ2¢1¼1ç1ÿ2ÿ3ÿ‰vfYPIC@><;: :9976#5(4.342;0C/L.W-d,s+‡*œ)µ)Ü)û)ÿ*ÿn_ S J B = 9 6543 2110/.$,*+0*7)?(I'T&`$o#‚"—!®!Ì!ó!ÿ"ÿ{ h Z NE=8 3 0 . - -, +*)('!&'%-$4#="F!Q]l”ªÅëÿÿu dUJ@93/,)' ' ' & %$"! $+2:DO\k}‘§¿äúÿq_QF=60+(%#"! !     " ) 1 9 C O \ k ~ ’ § ¾ à õ ÿm\NC:2-(%"  !(09DP] k |  ¥¼ßôÿiXK@70*&" %.7 @ K X gx£»ÝôÿeUH=4-(#   " ) 2 <GTcu‹¡¹ÝõÿaRE;2+%!   &/8DQ`rˆ ¹Þöÿ^OB8/)#     !#!+!5!@!N!]!o!† ž ¸ÞøÿZK?5-'" ! " # $%%& &(&2&=&J&Z&l&ƒ%œ%·$ß#ù#ÿUG ;N;`:w9’8°7Û6ü5ÿG);*2*+)%'!&'(*, /1468;=?A CEEE!E,D9DHD[CqBA«@Ò?ú>ÿB-8./-)+$**,. 1 47:<?ADFHJL NPPP'O4OCOUNjM†L¤JÊIøHÿ>251./). .137 :=@DGILOQSUXZ ]_^ ^,]<\N[cZ~XWÀUòTÿ:634-2$369=AEILPSVY[]`behk oon%m4mFk[juh”f¶débÿ8927(9;?DIMRVZ^behkmpsvy} …„‚,€>~T~k{ŠzªwÖuý8=,>"AFKQW\bfkotx{~€ƒ†Š‘–› ›!š3—I”b“ ŽÅŒó1D%HMSZahnty„‰‘“–™ ¤¨¬²· ·µ(²>°V¬sª”©´¥å*OT[ bjs{‚‰Ž”šŸ¤¦©­°³·»ÀÅËÑÕÓÐ2ÍKÊfƇ©ÁË"[b kt}‡—ž¤«±¶º¼ÀÄÈËÏÔÚàæëñðî'ì?ê[çzä›à»ÿûöóôö úÿÿ"ÿ,ÿ5ÿ=ÿEüLúR÷Xõ^ódñjîrìzé…å‘á Ý²ØÎÒöÁÿ­ÿžÿ–ÿÿŒÿúòìééìò ø÷õ%ð.ë7æ>âEÝKØPÓVÐ\ÍbÊjÈrÅ|ˆ¾–º¨·¿´è®ÿÿÿˆÿƒÿ€ÿðåÞÚÛÜØÑÑÒË'Å/À7½=ºD·IµO²U°[®a¬i©s§¤¡žž²›Õ™üŒÿ‚ÿ{ÿvÿtÿâÓÊǼ¶°¯ ¬­­ ¨(¤/ 6<›B™G—M•S“Y‘ajŒuŠƒˆ”†§ƒÂ‚ð|ÿsÿmÿjÿhÿÏÁ¹­ ˜”‘ Ž!‹(ˆ/†5„:‚@€E~K|RzYxbvltyr‰qo´mßlÿeÿ`ÿ^ÿ\ÿ¾± ’‰‚|zx wxwt!r'p-n3l8k>iDhJfQdZcdap_^“]©\È[÷WÿTÿRÿQÿ°Ÿtnjfec ccca!_'],\2Z7Y=WCVKUSS\RhPwO‰NŸMºLéKÿIÿGÿGÿ¢|ne^YWUTS STRQ!O&N+L1K7J=IDGLFVDaCpBA—@¯?×?ÿ>ÿ=ÿ>ÿ”ocYQMJHGG FFGED!B&A+@1>7=><G:P9[8i7z65§5Æ4õ4ÿ4ÿ5ÿˆteXOHC?=<<; ;;:97!6&5,42391A0K/V.c-s,ˆ, +»+ê+ÿ+ÿ,ÿl]QH@;74322 2 110/-",(+.*5)=(F'Q&^%n$‚#™#³"Þ"ÿ#ÿ$ÿweVKB:50-,+*) ))('&%$$*#1"9!C NZi|“¬Íöÿÿp_Q F = 5 0 + ( %$## " "!  &.6?JWfx¦Ãîÿÿk[ M B 9 1 , ' # !     #+3<GTcuŠ¢¼åþÿg W I>5.($           ! ( 0 : E R a s ˆ Ÿ · Û ö ÿc SF;2+%!        ' / 9 E Q ` q †  ´ Ò ñ ÿ_PC8/(#      $ , 6AN]o„œ´Ôóÿ\M@6-&!      !)3>KZl‚›´×õÿXI=3+$     '0;HXj€™´Ù÷ÿUF:0("     $-8FUg}—³ÛùÿQC7.&         !!*!5!B!R d z•±ÛúÿM?4+$  !# %&&&'''2'?&N&`&w%’$¯#Ú"û!ÿH<1("  !#%') , ....#...;.J-\-r,Ž+¬*Ô)û(ÿD 8!.!&!  !#%'),.03 5 6666)666E5W5m4‰2¨1Ï0ú/ÿ?$4$+$$#!  !# %(*-/2479;> @AA@%@1@@?R>g=‚<¢:Ç9ø8ÿ:(0()'#%#$%( *-0368;>@BEGJ MMLL+K:JLIaH|G›E¿CóBÿ6,-+')#'(*- 037:=@CFHKMPSVY [[Z%Y4XFWZUtT“RµPêOÿ30,.',-/2 6:?BFILORUXZ]`cgk lkk,i=gRfjd‰a«_Ü]ÿ13,1"259 =BGLPTX[_behknquy}‚ ‚€$~5|I{axvŸsÆp÷16&8;@ EKQV[`einrvy|~‚…‰Ž“˜œ›˜+–@’Y‘s•‹µˆè+> AG MT[ahnsy~ƒˆŒ’•™¡¥ª°·¸µ!²5¯Mªi¨ˆ¦¨¢Ñ#HNT\dmu|ƒ‰•› £¦©­±µ¹¾ÄÊÒÚ ÖÒ)ÎAÊ\Å|ÂÁ½U\enwˆ˜Ÿ¥­³¸º¾ÂÆÊÎÓÚàçíóôòï6ìQènäß±  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿmft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¥%ÿ¤0ÿ¦:ÿ±C#ÿ»K2ÿÁUEþÃ^ZòÄepäÂl†×ºp™Ì²tªÃ«v·½¦y·¡}˱‚Ó«š‰Ü¥—•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•楗•æÿ¦%ÿ¤0ÿ§:ÿ²C"ÿ¼K2ÿÃTEüÆ]ZñÈdqãÆj‡ÖÀo›Ë¸r¬Â±tº»­wÄ´©{Í«£Ô¢ž…Û™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽá™šŽáÿ¦%ÿ¥0ÿ¨:ÿ³C"ÿ¾K1ÿÅTEùÉ\[ïÍcqãÌiˆÕÆmœÉ¿p®½¶rº´°uëªxÊ¢¥|Ñ™¡Ø‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ý‰Ýÿ¦%ÿ¥0ÿª:ÿµC"ÿÀK1ýÈSEöÍ[[íÑaráÐg‰ÑËkÂÀn­¶·q¸¬±sÁ£¬vÈš¨yÎ’¤~Ô‰ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …؉ …Øÿ§%ÿ¥0ÿ«:ÿ¶C!ÿÁK1úËRDóÑZZêÙ`rÞÖe‰ËÌjœ»Ám«¯¹p¶¥´r¾œ¯tÄ”«wÊ‹§{Ï„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ô„¤Ôÿ§%ÿ¦0ÿ­:ÿ¸B!þÄJ0÷ÎRDðÖXZçà^rÖÚdˆÄÍiš´Ãl¨¨»o²ž¶pº–²rÀŽ®vƆªzʧΧΧΧΧΧΧΧΧΧΧΧΧΧΧΧΧÎÿ¨%ÿ§0ÿ®9ÿºB ûÆJ/ôÓQCëÝWZãæ\qÎÛd‡½Ïi˜®Åk¥¢¾n¯˜¹o¶µq¼ˆ±tÁ®xÅ{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}É{¬}Éÿ¨$ÿ§0 ÿ°9ÿ½B÷ÉJ/ïØPBæãUYÜè[pÆÝc…¶Ñh•§Èk¡œÁmª“¼o±Š¹q¶„µt»}²w¿w°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âw°|Âÿ©$ÿ¨0 ÿ³9þÀBóÍJ-éÝO@áéSYÓê[o¿ßc‚¯Óg‘¡Ëj–Åm¥Ào«†½q°ºsµz·w¸tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»tµ{»ÿª$ÿ©/ ÿ¶8ùÄAíÒI+âãM@ÛïRXÊíZm·áb¨Ög›Ïj—‘ÉmŸˆÅo¥‚Âq©{¿t­v½w°q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³q»{³ÿ«$ÿ«/ ÿº8óÉAäÚI(ØèL@ÎóQWÀïYk®äaz Üg†”Ôk‹Ïn—„Ìpœ}És xÆu£sÄx¦nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©nÂ|©ÿ­$ÿ°/ ûÀ8êÐAÚâF(ÌîLAÃùPUµóXf¥éat—ág~Ûk†…×oŒÔr‘zÑu”uÏx—qÍ{šlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œlÌ~œÿ¯#ÿ¶- ñÈ6 ÝÜ=ÍêF*ÁöK@¶ÿOQª÷X`›ïakèht…äm{àq€yÞtƒuÜx†rÚ{‰nØ~‹kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚kÖ‚ÿ±#ú¿,ãÔ/Îæ;ÁóE+´ÿI=¨ÿNLžýWX‘öaa†ñiiíonyêtruèwuqçzwnå}ykä€{iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|iã„|ÿµ"ëË"Ðã'Âñ:´þB*¦ÿF9›ÿME’ÿVO†þbV~új\w÷p`sõucoóxemò|gjñhhð‚jfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…kfï…köÂÔßÂï& µü:§ÿ>'™ÿD3ÿK=…ÿUE|ÿaKuÿjOpÿpRlÿuTjþyVhý|WfüXdü‚Zcû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[cû†[ÔÏ Äíµû& ¨ÿ6™ÿ;#ŒÿA,€ÿJ4xÿS:qÿ_?lÿiChÿoEeÿtGcÿwHbÿ{Iaÿ~J_ÿJ^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„K^ÿ„KÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿž8ÿ¨Aÿ±I+ÿ¶S<ÿ¸]Oû¶fcî´owâ¬u‰Ø¤{™Î›¦È“„±Âˆ¹¾ˆŒ¿ºƒ‘Å·—Ë´} Ï®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤Ñ®y¤ÑÿŸ"ÿ- ÿŸ8ÿª@ÿ³I+ÿ¹R<ÿ»\Oúºedí¸mxá°s‹Õ¨yœÌŸ}ªÅ—µ¿‘…¾ºŒ‰Å¶‡Ì²ƒ–Ò¯ Ö§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢Ó§~¢ÓÿŸ"ÿž- ÿ 7ÿ«@ÿ´I+ÿ»R<ÿ½[Pú¾ddì¼lyàµrÓ­wžÊ¤z­Âœ~¹¼–‚÷‡Ê²‹ŒÒ®‡•ئƒÚ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õ¡‚¡Õÿ "ÿž- ÿ¡7ÿ¬@ÿ¶H+ÿ½Q<ÿÀZPúÁceìÁjzÞ¹pÒ±u¡È¨x°À¡{¼¹›Ç´–„ϰ”Õ«‘—Ú ‰œÜšˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×šˆ ×ÿ "ÿž- ÿ¢7ÿ­@ÿ·H*ÿ¿Q<ÿÂZPùÄbeëÅi{Þ¾nѶs£Æ®v³¾§yÀ¸£É´¡†Ï¬œÕ£–”Úš‘œÜ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØ•ŽŸØÿ "ÿŸ- ÿ£7ÿ®@ÿ¸H*ÿÁP<þÅYP÷È`fëÊg|ÝÃm‘ϼq¥Å´tµ½°yÀ¶¬È®§…Ï¥¡ŠÕœœ‘Ú•™œÜ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØ”ŸØÿ¡"ÿŸ- ÿ¤7ÿ°?ÿºH*ÿÃP;ûÈXPõË_féÏf|ÜÉk’ÎÃo¦Áºrµ¶²vÀ¬¬{Ȥ¨Μ¤…Ô” ØŸ™ÛŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØŠœŸØÿ¡"ÿ - ÿ¦6ÿ±?ÿ»H)þÆO;øËWPòÐ^fçÔd}ÚÏi“ÈÅm¦º»p´­³s¿£­vÇš¨zÍ’¥ÒŠ¢†×„ ‘Ù„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×„¢œ×ÿ¡"ÿ - ÿ§6ÿ³?ÿ½G)üÈN;õÎVOîÕ]fäÚb}ÓÒh’ÁÆl¤³¼o±¦µr¼œ¯tÄ“«wÊ‹§{σ¤Ô}¢‹Ö{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õ{£•Õÿ¢!ÿ - ÿ¨6ÿ´?ÿ¿G(ùËN:òÓUOêÜ[fààa}ÌÓg‘»Èk¢¬¾n¯ ·p¸•²sÀ®vÅ…ªzÊ~¨Îx¦‡Ñu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òu¥Òÿ¢!ÿ¡, ÿª6ÿ¶>ýÂG(õÍN9îÙTNæãYeØâ`{ÅÕf´ÊjŸ¥Ám«™ºo´µr»ˆ±uÀ®xÅz¬}Étª„Ëq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìq©‹Ìÿ£!ÿ¢, ÿ¬5ÿ¹>ùÅG'ðÑM8éàRLâéWdÎä_z½×fŒ­Ìj›ŸÄl§“¾o¯Š¹qµƒ¶tº|³w¾v±|Âq¯‚Än®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æn®‡Æÿ¤!ÿ£, ÿ¯5ÿ¼>ôÉF%êØM6âçOLÜïUcÆæ_x´Úe‰¥Ði–˜Èl¡Ão¨…¿q®~»t²x¹w¶s·{¹nµ€¼k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾k´…¾ÿ¥!ÿ¤, ÿ³5ûÁ>íÏF"áßK4ØëOLÏóTb¼è^t«Þd„Ôi‘Îm™‡Éo €År¥zÂt©tÀx¬p¾{¯k¼€²h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³h»„³ÿ¦!ÿ¨+ ÿ¸4 óÇ=äØEÖæI5ËñNLÄ÷S_±ì]p¡âd}•Ûi‡ŠÕn‚Ðq•{ÍtšvËwqÉy mÇ}¢iÅ¥fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦fÄ…¦ÿ¨ ÿ®*ü¿3 éÏ<×áBÊíI5¿øMJ·ûR[¦ñ]i˜éetŒâj}ƒÝo„|Ús‰w×wŒsÕzoÓ}‘lÑ€”hЄ–eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—eχ—ÿª ÿµ)ðÈ1ÚÝ3 ËêB!¾öH5²ÿLF©ÿQU›÷]`Žðej…ëlq}çqvwävzsây}oá|l߀iÞƒƒg݇…e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†e܉†ÿ­ù¿%ßÖ"Ëè2¾ôA"°ÿE3¤ÿJAœÿQMþ]V…ùf^}ôndvòshrïxknî|mlíojì‚pgê…reê‰scéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtcéŒtÿ¶èÍÌæ¾ó1±ÿ>"£ÿB/–ÿH:ÿPD„ÿ\K{ÿgQtþnVoüsYlûx[iù|]gø^føƒ_d÷†`bö‰aaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbaöŒbóÄÎÚ ½ó±ÿ2£ÿ:•ÿ?*‰ÿF3€ÿO:xÿ[@qÿfElÿmHhÿsJfÿwLdÿ{MbÿNaÿ‚O`ÿ…P^ÿ‰Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹Q^ÿ‹QÌË ¾æ ¯ÿ ¤ÿ0•ÿ5‡ÿ<$|ÿD+sÿM1lÿX5gÿc9cÿk;aÿq=_ÿu>]ÿy?\ÿ|@[ÿAZÿ‚AYÿ†BXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBXÿˆBÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ–+ ÿ•6ÿ >ÿ¨G&ÿ®Q4ÿ¯[Eÿ­eWø©ohí£xy㛇ے…”Ô‹ŒžÏ…‘¦Ë€•¬Ç|™±ÅyžµÂv£¹Àtª¼½q²¾¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿¹o±¿ÿ™ÿ—+ ÿ—6ÿ¡>ÿªF%ÿ°P4ÿ±ZEÿ°dW÷¬miì§w{áž}ŠÙ–ƒ—ÑŽ‰¢ËˆŽ«Ç‚“±Ä~—·Ázœ»¾w¢¿¼uªÂµq®Ã³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Á³r¯Áÿ™ÿ—* ÿ˜5ÿ£=ÿ¬F%ÿ³O4ÿ´YFÿ´cXö±lkê­u}ߣ{Õ›œÍ’†¨Ç‹Š±Â…¹¿€”¾»|šÃ¹y¡Çµv©Ê­u¬Æ«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Ä«v­Äÿšÿ˜* ÿš4ÿ¥=ÿ®F%ÿµN4ÿ·XFÿ·aYõµjlé²sݨxÓŸ~ Ê–‚¬Äއ·¾ˆŒ¿ºƒ‘Å·˜Ë´|¡Ï«x¥Ï¥yªÈ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æ¤y¬Æÿšÿ˜* ÿ›4ÿ¦=ÿ¯E%ÿ·N4ÿºWFÿ»`Yô¹imç¶qܬv“Ф{£Èš±À“„¼»Œ‰Å·ˆË´†™Î²†¤Ñ¤|¤ÑŸ}©Êž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈž}ªÈÿ›ÿ™* ÿœ4ÿ§<ÿ±E$ÿ¹M4ÿ¼WFþ¾_Yô½gnçºo‚Ú±t•Ϩy¦ÅŸ}´¾—À¹”ŠÆµ‘’˯˜ÏªŠ¡Òž‚£Ó™¨Ì˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Ê˜‚©Êÿ›ÿ™* ÿ4ÿ©<ÿ²E$ÿ»M3ÿ¿VFýÁ^ZóÁfoæ¿mƒÙ¶s—Í­w¨Ä¥{·¾¡ƒÀ¶›‰Æ®•̨‘•Ï¢ŽžÒ™‡¢Ó”†§Í“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ë“†¨Ëÿ›ÿ™* ÿž3ÿª<ÿ³E$ÿ¼L3ÿÁUFûÄ]ZóÅeoåÃl„Ø»q˜Ì²u«Ã­|¶¹¥¿°ž†Æ¨™ŒË¡•’Л’›Ó”Ž¢ÔŠ¦ÎŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËŠ¨ËЍËÿ›ÿš* ÿŸ3ÿ«<ÿµD#ÿ¾L3þÃUEùÇ\ZñÉdoåÈj…ÖÁošÊ¹tª¾°z¶³©¿ª¢„Æ¢ŠË›šÏ•—™Ò”¢ÔŠ¦ÎŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨ÌŠ¨Ìÿœÿš* ÿ 3ÿ¬<ÿ¶D#ÿ¿L2üÆTEöÊ\ZïÍbpäÍh†ÓÅmšÅ¼sª¹´xµ®­}¾¥§‚Å¢ˆË•ŸŽÏœ–Ò‹œ¢Ó†•¦Î†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ì†”§Ìÿœÿš) ÿ¢3ÿ­;ÿ·D#ÿÁL2ùÉSEóÍZZìÒ`pàÐf†ÎÈlšÀ¿q©´¸wµ©±|¾Ÿ¬Å—¨†Ê¤ŒÎŠ¢•Ñ…¢¡Òœ¦Îš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìš§Ìÿœÿ›) ÿ£3ÿ¯;ÿ¹D"ýÃK1öÌRDðÒYYèÚ_pÛÕd†ÉÌj™ºÃo¨­»t´¢´y½˜¯}ìƒÈ‰©‰Ìƒ§‘Ï~¦œÐ}¤¦Í|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ë|¢¨Ëÿÿ›) ÿ¥2ÿ±;ÿ¼D!úÆK1óÑQCëÚWYãß]oÓÛc…ÂÏi—±Äm§¤¼p²˜µt»Ž±x†­}Æ€«‚Êz©ŠÍv¨”Îv©£Ìw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êw«¨Êÿÿœ) ÿ§2ÿ³;ÿ¾C õÊK/îÖPBæáVWÜä[nËÞcƒºÑh”©Çl£›¾n®¸q·†´t½~°xÂw®|Ær¬ƒÉm«ŒÊm«™Én¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇn¬ŸÇÿžÿ) ÿ©2ÿ¶:úÂCðÎJ.çÝO@âéRWÒèZmÁàb€±Ôg‘¡Êkž”Ãn¨‰½q°€¹t¶y¶wºt´{½n²Àj°ˆÂg°’Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–Ãf°–ÃÿŸÿž) ÿ­1 ÿº:ôÇBèÕJ+ßäL?×ìQVÉîYk·ãa|¨Øg‹šÏk—Én ƒÄq§{Àt¬u½x°p»{³l¹€¶h¸†¸d·¹c¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºc¶‘ºÿ ÿ¡(ÿ±0 ûÀ9ìÎBßßG(ÓéL@ÊñQU¾òXh­æawžÝg„’Õl‡Ïo–~ËsœxÈv¡rÆy¤nÄ|§i©fÀ†¬b¿­a¿®a¿®a¿®a¿®a¿®a¿®a¿®a¿®a¿®a¿®a¿®a¿®a¿®ÿ¢ÿ¦'ÿ·/ òÇ8 áØAÒæF*ÇðL@¾øPS²õWc¢ëap•ãg{ŠÝm„Øq‹zÔutÒy“pÐ|–lΙh̃›dˈaÊŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸ`ÉŸÿ¤ÿ­&û¾-æÐ4Óâ<ÇîF+»ùJ>°þOO¦úW\˜ñahŒëhqƒænx{âs}ußxqÝ{„mÛ‡jÚƒ‰gÙ†Šd׋ŒaÖŽ`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Ž`Õ‘Žÿ§ÿµ#îÉ&Õß)Çì<ºøD+­ÿH;£ÿMIšÿWTùa]„ôje|ðpjvívnqëzqmé~tkè‚vhæ…wfåˆycäŒzaã‘|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|`ã’|ÿ«÷ÀÙÜÇë( º÷;¬ÿA) ÿF6•ÿLAÿVKƒÿaR{ýkWtúq\oøv_lö{aiõcgôƒdeó†fcòŠgañŽh_ð’i_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“j_ð“jÿ·ÖÏ Çê¹÷) ¬ÿ9žÿ>&’ÿD0‡ÿK9€ÿT@xÿaFrÿjJlÿpMiÿvPfÿ{QdÿScÿƒTaÿ†U`þ‰V^þW]ý’X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“X\ý“XÖÄÆÔ ¸÷«ÿ)žÿ4ÿ:!„ÿA)zÿI0rÿR6lÿ^:hÿh=dÿo@aÿtA_ÿyC^ÿ}D]ÿ€E\ÿ„E[ÿ‡FZÿŠGXÿGXÿHXÿHXÿHXÿHXÿHXÿHXÿHXÿHXÿHXÿHXÿHXÿHXÿHÄÇ·Û©ÿŸÿ* ÿ0ƒÿ6wÿ>"nÿG(fÿP,aÿZ/]ÿd1[ÿl3Yÿq5Xÿu6Vÿy6Vÿ|7Uÿ7Tÿ‚8Sÿ…9Rÿ‰9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9RÿŠ9ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ’ÿ) ÿ5ÿ˜;ÿ D!ÿ¦N-ÿ§Y<ÿ¥dLÿ¡n[÷›xjî•w玉‚ᆋ܀•“Ø|›™Ôx žÑu¤¢Ïs©¥Íq®¨ÌoµªÊm¾­Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®Ãi½®ÿ“ÿ) ÿ4ÿš;ÿ¢D ÿ©M-ÿªX<ÿ¨bLÿ¤l\õŸvlì™z䑇†Þ‰Øƒ“˜Ó~™ŸÐz¤Ív¢©Ët§¬Éq­¯Ço´²Ál¹´¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±¼l»±ÿ”ÿ‘( ÿ‘3ÿœ:ÿ¤C ÿ¬L-ÿ­V=ÿ­`Mþ©j^ô¥tnêŸ}}á–ƒ‹ÙŽŠ–Ó‡ Î•§Ê|š­ÇxŸ²Äu¥¶Âr«¹Àp´»·nµ¹³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µ³o¸µÿ”ÿ’( ÿ“2ÿž:ÿ§C ÿ®K-ÿ±U=ÿ°_Ný®h_òªrpç¤zÞš€Õ’‡œÎ‹Œ¦É„‘¯Ä~—µÁyœ»¾v£¿¼t«Â´o®Ã®r³¼«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸«s¶¸ÿ•ÿ’( ÿ•2ÿ :ÿ©Bÿ°J-ÿ´T=ÿ´^Ný³g`ñ¯præ©xƒÛŸ~“Ò—ƒ¡Ëމ¬Ä†ŽµÀ€”½¼{šÃºz£Å·y«Ç¬s¬Æ§u±¿¥wµº¥wµº¥wµº¥wµº¥wµº¥wµº¥wµº¥wµº¥wµº¥wµº¥wµº¥wµºÿ•ÿ“( ÿ–1ÿ¡9ÿªBÿ²J,ÿ¶S<ÿ·]Nû¶eað´ntä­u†Ù¤{–Ï›€¥Ç’…±ÁŠ‹»½‡”À»…Ķ‚¤Ç°~ªÈ¥wªÈ¡y°ÁŸz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼Ÿz³¼ÿ•ÿ“( ÿ—1ÿ£9ÿ¬Bÿ´J,ÿ¹S<ÿº\Nøºdbï¸luã²sˆØ©y™ÍŸ~©Å˜„´¿“Œ¼¸“Á³‰™Å®†¡Èª„©ÉŸ|©Ê›}®Â™~²½™~²½™~²½™~²½™~²½™~²½™~²½™~²½™~²½™~²½™~²½™~²½ÿ–ÿ“( ÿ˜0ÿ¤9ÿ­AÿµI,ÿ»R<ý½[Nö½cbî½kvâ¶q‰Õ®w›Ë¥|ªÂƒ´¹–‰¼²‘Á¬Œ–Ƨ‰È£‡¦Ê™€¨Ë–®Ä•±¾•±¾•±¾•±¾•±¾•±¾•±¾•±¾•±¾•±¾•±¾•±¾ÿ–ÿ”' ÿ™0ÿ¥9ÿ®Aÿ·I+ÿ½Q<ü¿ZNôÁbbìÁiwá»p‹Ò±tǨ{ª¼ ´´š‡¼¬”¦”Æ ›Éœ‹¤Ë•†¨Ë‘…­Å…±¿…±¿…±¿…±¿…±¿…±¿…±¿…±¿…±¿…±¿…±¿…±¿ÿ–ÿ”'ÿš0ÿ¦8ÿ°Aÿ¸I+ÿ¿Q<úÂYNòÄacéÅhwݾmŒÍ´s«yª·¤~´®„¼¦˜ŠÁ ”‘Æš‘˜É–¡Ë‹¨ÌŒ‰¬ÅŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°ÀŒ‰°Àÿ—ÿ•'ÿ›0ÿ§8ÿ±AÿºI+ÿÂP;øÆXNðÈ_cæÈfxØÁkÉ·q½¯w©²§|³©¡‚»¡œˆÁš˜Æ”––É”ŸË‹‘¨Ì‡Ž¬Æ‡°Á‡°Á‡°Á‡°Á‡°Á‡°Á‡°Á‡°Á‡°Á‡°Á‡°Á‡°Áÿ—ÿ•'ÿ/ ÿ©8ÿ³@ÿ¼H*üÅO;öÉWNíÍ^câËdxÒÄjŒÄ»oœ¸²u©­«{³£¦€»›¡†Á”ÅŽ›”ÈŠ™Ê†™¨Ë‚“¬Æ‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Á‚’¯Áÿ—ÿ•'ÿž/ ÿª8ÿµ@ÿ¾H)ùÈN:óÍVMêÓ\bÞÏbxÍÇh‹¿¾n›²·s¨§°y²ž«~º•§„ÀŽ£‹Äˆ¡’ǃŸšÉ€ §Ê}š¬Æ}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Á}˜¯Áÿ˜ÿ–'ÿ / ÿ¬7ÿ·@ýÁH(öËN9ïÓTLæÙZbØÔawÇËgйÃlš­¼r§¡¶w±˜±}¸­‚¾ˆª‰Ã‚¨Æ}§™Èz§¥Éw¢¬ÅxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°ÁxŸ°Áÿ˜ÿ—&ÿ¢/ ÿ®7ÿ¹?ùÄG'ñÎM8êÛSKàßY`ÐÚ_vÁÐe‰³Ék™¦Âp¥›½u¯‘¸{¶ˆµ€¼²†À{°Ãv®–Ås®¡Ær­­Är©°Àr©°Àr©°Àr©°Àr©°Àr©°Àr©°Àr©°Àr©°Àr©°Àr©°Àr©°Àÿ™ÿ˜&ÿ¤. ÿ±6þ½?ôÈG%ëÔM6åãPIÙãW_Éß^tº×d†¬Ïi–Çm£‘Àq¬†»u³~·z¹w´½r²…¿m±Áj°—Âi±¥Ál´²½l´²½l´²½l´²½l´²½l´²½l´²½l´²½l´²½l´²½l´²½l´²½ÿšÿ™&ÿ§- ÿµ6ùÁ?îÎF#äÜL2ÝçOIÏèV^Àä]r²Þd‚£Ôi‘•Ëmœ‰Åp¥Às¬w¼w±p¹|µk·¸g¶‡ºcµ»aµ›¼c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹c·¦¹ÿ›ÿ›%ÿ«- ÿ¹5 òÇ>åÕFÚãI3ÏëNIÆíT]·ê\n¨âc}šÙiŠŽÒm”„Ìq›{Èu¡sÄx¦nÂ|©iÀ¬e¾‡®b½Ž°_½—±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±^¼ž±ÿœÿ $ÿ°,ùÀ4 éÏ=ÚßBÎéI3ÄñNH»òRZ­ð[ižçcv’ài‡Úo‰~ÔswÑw•qÎ{™lÌœhʃždɈ aÇŽ¢^Æ•¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤\Æ›¤ÿžÿ¥#ÿ·*ðÈ2ÜÛ5 ÎçBÂñH4¸ùLF¯÷QU¢õ[b•ídmŠçkv€âp}yÞu‚sÛz‡nÙ~ŠkׂŒgÕ†ŽdÔ‹aÓ’^Ñ–”\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•\Ñ›•ÿ¡ÿ­!ø¿&âÔ%Îå3ÂðB!¶úG3«þKB¢þPO—û[Z‹õec‚ðljzìrptéxtoç|wlåzhã„|fâˆ}cáŒ`à‘^ß–‚\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒ\Þšƒÿ£ÿ¶éÌÏãÂð3µú@"©ÿD0ÿI=•ÿPH‹ÿ[P‚ýeWzùm]tösaoôydkò~ghñ‚ifð†jdïŠlbîŽm`í’n]ì—p\ë›q\ë›q\ë›q\ë›q\ë›q\ë›q\ë›q\ë›q\ë›q\ë›q\ë›q\ë›qÿ¬óÃÑÚ Áï´û3¨ÿ< ›ÿB,ÿH6‡ÿO?ÿZFxÿeKqÿmOlÿsRiÿyUfþ~Wdý‚Xbü†YaûŠZ_úŽ[^ú’\\ù—][ø›^[ø›^[ø›^[ø›^[ø›^[ø›^[ø›^[ø›^[ø›^[ø›^[ø›^[ø›^ú¹ÍË Àæ ²ü §ÿ3šÿ9ÿ?&‚ÿF.zÿN5sÿX:mÿc?iÿlBeÿrDbÿwF`ÿ|G_ÿH]ÿ…I\ÿˆJ[ÿŒKZÿLXÿ•MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MWÿ™MÍÁ¾Ð±ö¥ÿ! ™ÿ.Œÿ4€ÿ; vÿC'mÿL,fÿT0bÿ`3^ÿi5\ÿo7Zÿt8Yÿy9Xÿ}:Wÿ€;Vÿ„;Uÿ‡Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>Rÿ“>½Å°×£ÿ™ÿ" ‹ÿ)~ÿ0sÿ8iÿ@bÿI#[ÿQ&WÿZ(Uÿb*Rÿi+Qÿo,Pÿs-Oÿw.Nÿz.Nÿ}/Mÿ€/Lÿ„0Kÿˆ0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0Kÿ‹0ÿ‹ÿˆ(ÿ„4ÿ:ÿ—BÿžK'ÿžW4ÿbBÿ™mOÿ“x\ø‚gòˆ‹qì‚“yè|™€äxž†át£Šßq¨ŽÝo®‘Ûm³”Úl¹–Øk˜ÕiÌšÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÿ‹ÿˆ(ÿ„4ÿ:ÿ—BÿžK'ÿžW4ÿbBÿ™mOÿ“x\ø‚gòˆ‹qì‚“yè|™€äxž†át£Šßq¨ŽÝo®‘Ûm³”Úl¹–Øk˜ÕiÌšÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÿ‹ÿˆ(ÿ„4ÿ:ÿ—BÿžK'ÿžW4ÿbBÿ™mOÿ“x\ø‚gòˆ‹qì‚“yè|™€äxž†át£Šßq¨ŽÝo®‘Ûm³”Úl¹–Øk˜ÕiÌšÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÿ‹ÿˆ(ÿ„4ÿ:ÿ—BÿžK'ÿžW4ÿbBÿ™mOÿ“x\ø‚gòˆ‹qì‚“yè|™€äxž†át£Šßq¨ŽÝo®‘Ûm³”Úl¹–Øk˜ÕiÌšÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÿ‹ÿˆ(ÿ„4ÿ:ÿ—BÿžK'ÿžW4ÿbBÿ™mOÿ“x\ø‚gòˆ‹qì‚“yè|™€äxž†át£Šßq¨ŽÝo®‘Ûm³”Úl¹–Øk˜ÕiÌšÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÿ‹ÿˆ(ÿ„4ÿ:ÿ—BÿžK'ÿžW4ÿbBÿ™mOÿ“x\ø‚gòˆ‹qì‚“yè|™€äxž†át£Šßq¨ŽÝo®‘Ûm³”Úl¹–Øk˜ÕiÌšÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÌeË›ÿ‹ÿ‰(ÿ…3ÿ9ÿ˜BÿžK'ÿŸV4ÿžaBÿšmPÿ•w]÷hñ‰‹r냒{ç}˜‚ãxˆàt£ŒÝr¨Ûo­“Ún³–Ølº˜Ök›ÑiÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÊfÊœÿŒÿ‰'ÿˆ2ÿ“8ÿ›Aÿ¢J'ÿ¤T4ÿ¢_CÿŸjQýšt_õ”~l펈xç‡â€•ŠÝ{šÚw –Öt¦šÔq¬žÒo²¡Ðm¹£ÏlæÅgæÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÀiÇ¡ÿÿŠ'ÿŠ1 ÿ–7ÿž@ÿ¥I'ÿ§S4ÿ§]Cÿ¤hSü rbòš|pê”…}ã‹‹ˆÝ„’‘Ø~˜˜ÓzžŸÐu¤¤Írª¨Ëo°«Ém¸®Âi¼°¼kÀª·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥·mÄ¥ÿÿ‹'ÿŒ0 ÿ˜7ÿ @ÿ§H&ÿ«R4ÿ«\Dÿ©fTú¥pdðŸys瘂߈و—Ò• Î{›§Êv¡­Çs¨±Åp¯µÁm··¹k¸µ³n½®°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨°pÁ¨ÿŽÿ‹&ÿŽ0 ÿš6ÿ¢?ÿ©H&ÿ®Q4ÿ®[Dÿ¬dUùªneï¥wvå…Ü”…’ÔŒŒÎ„’§É}˜¯ÄxžµÂu§¹Át±»¸p³»±o¶¸¬q»±©s¿«©s¿«©s¿«©s¿«©s¿«©s¿«©s¿«©s¿«©s¿«©s¿«©s¿«ÿŽÿŒ&ÿ/ ÿ›6ÿ¤?ÿ«G&ÿ±P4ÿ±YDü°cUö®lgíªuxã¡|ˆÙ˜ƒ–щ£Ê‡­Å‚—´Â ¸¾|¨»»z°½±t²½©r´»¦t¹³£v¾­£v¾­£v¾­£v¾­£v¾­£v¾­£v¾­£v¾­£v¾­£v¾­£v¾­ÿÿŒ&ÿ‘. ÿ6ÿ¦>ÿ­G%ÿ³O4ÿ´XDú´aVó²jhì¯szá¦z‹Ö€šÍ”†§Æ¯¿‡”µº‚œ¹µ¤¼²}¬¾«y±¿£v²½ x¸µžy½¯žy½¯žy½¯žy½¯žy½¯žy½¯žy½¯žy½¯žy½¯žy½¯žy½¯ÿÿ&ÿ“. ÿž5ÿ¨>ÿ¯F%ÿ¶N3þ·WD÷·`Vð¶hiè³p{ÞªwП|Ç—ƒ§¿Š¯¸‹‘¶²†˜º­ƒ ½©©¿¥~°Àœy±¿š{··˜}»°˜}»°˜}»°˜}»°˜}»°˜}»°˜}»°˜}»°˜}»°˜}»°˜}»°ÿÿ&ÿ”- ÿ 5ÿ©>ÿ±F$ÿ¸M3ü»VDõ»_Ví»giãµn}Ö¬sÊ£zÁ›€§¸”‡°±Ž¶«Š•»¦‡¾¢…¥ÀŸ„¯Á–~°Á”¶¸“€»²“€»²“€»²“€»²“€»²“€»²“€»²“€»²“€»²“€»²“€»²ÿÿŽ&ÿ•- ÿ¡5ÿ«=ÿ³F$ÿºM3ú¾UDó¿]Vê¿ej߸k~ЯqŦxœ»Ÿ~§²˜…¯«“‹¶¥Ž“»Ÿ‹š¾›‰¢Á˜ˆ¬Â‚¯Âƒµ¹„º³„º³„º³„º³„º³„º³„º³„º³„º³„º³„º³ÿÿŽ%ÿ–, ÿ¢5ÿ¬=ÿµE#ÿ¼L2øÁTCðÃ\VçÃcjÚ»i~̲pÀªvœ¶¢|§­œ‚¯¥—‰¶ž“»™˜¾” Á‘Œ©Â‹ˆ®ÂŠˆ´ºŠˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´Šˆ¹´ÿ‘ÿ%ÿ˜, ÿ¤4ÿ®=ÿ·E#ÿ¿L2öÅSCîÈ[VãÆajÔ¿h~ǶnŽ»­tœ±¦z¦§ €¯Ÿ›†µ˜—Ž»“••¾Ž’ÁŠ’§Â†Ž®Â„´»…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´…Œ¹´ÿ‘ÿ%ÿ™, ÿ¦4ÿ°<ÿ¹D"üÁK1ôÉRBëÍYUßÉ`jÏÂf}¹l¶±r›««x¦¢¥~®™ „µ’‹ºŒš“¾‡˜›À„—¥Â€–¯Â’³¼€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µ€‘¸µÿ’ÿ%ÿ›, ÿ§4ÿ²<ÿ»D!ùÅK0ñÎQAçÒXTÚÎ^iÊÆe|½½kŒ°¶pš¥°v¥œª|­“¦‚´Œ£‰¹† ½ž™¿}ž¢Á{ž¯Áy™³¼z—¸µz—¸µz—¸µz—¸µz—¸µz—¸µz—¸µz—¸µz—¸µz—¸µz—¸µÿ’ÿ%ÿ+ ÿª3ÿµ<ü¿D ôÈJ.íÓP?ãØVSÓÒ]hÅÊc{·Âi‹ª»o˜Ÿ¶t£•±z¬­€²…ª‡·§Ž»z¦—¾w¦ ¿t¦­¿s¡´»tž¸µtž¸µtž¸µtž¸µtž¸µtž¸µtž¸µtž¸µtž¸µtž¸µtž¸µÿ“ÿ‘$ÿŸ+ ÿ¬3 ÿ¸;øÃCïÍJ,çÚO=ÝÞUQÍØ[g¾Ïbz°Èg‰¤Âm—™¼r¡¸x©†µ~°²…µy°Œ¸t¯•»p¯Ÿ¼n¯¬¼m«µ¹n§¹´n§¹´n§¹´n§¹´n§¹´n§¹´n§¹´n§¹´n§¹´n§¹´n§¹´ÿ”ÿ’$ÿ¢*ÿ°2 þ¼:òÇBèÓI)ááL;ÔãSQÆÝZe·Õ`x©Ïf‡Ék”‘Åpž‡Áv¦¾|¬x¼„±rº‹´m¹“¶j¸œ¸g·§¸g··¶h²»±h²»±h²»±h²»±h²»±h²»±h²»±h²»±h²»±h²»±h²»±ÿ•ÿ•#ÿ¥)ÿ´1 øÁ:ëÎBàÝG%ÕåK;ËçQP½ãYc¯Þ_t¢Øeƒ–ÓjŠÎo™Ès¡uÄx§nÁ}«i¾„®e½‹±a¼“²_¼²_¼¬±b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­b¿¾­ÿ–ÿ™!ÿª(ÿ¹0ðÈ8 áØ@ÔãE&ÊëK;ÁìOO³èW`¦å_ošâf|ŽÜl†„ÕqzÐu•sÍz›lÊŸgÇ„¢cÆŠ¤_Ä‘¦\Ä™§Zä§ZݧZݧZݧZݧZݧZݧZݧZݧZݧZݧZݧÿ˜ÿž ÿ¯&øÀ.æÐ3Õá<ÉêE(¿òJ;µñNL©ïV[í_h’êgs‡ãm|~Þr‚vÚxˆp×}ŒkÔ‚fÒ‡’cÑŒ•_Ï’–\Ι˜Y΢™XÍ«šXÍ«šXÍ«šXÍ«šXÍ«šXÍ«šXÍ«šXÍ«šXÍ«šXÍ«šXÍ«šÿšÿ¥ÿ·#íÉ&ÖÞ)Éé;¾óD)³øI:¨÷MHŸöUU”õ_`‰ñhh€ìopxèuuråzymâ}ià„€e߉‚bÝŽ„_Ü“†]Û™‡ZÚ¡‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰XÙ¨‰ÿœÿ­öÁÛÚÉè) ½ó;²ýC(¦þG6œýLC“ýUMŠý_Vùi]yõpbsòvgnð|jjîmgì†odë‹qaêr_é”t]è™uZç wXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xXæ¦xÿ¢ÿ·ØÏ Êç¼ó) ±ý;¤ÿ@&™ÿE2ÿK<‡ÿTDÿ_KxÿiPqÿpTlývXiû|Zfú\cø†^a÷‹__öa^ö•b\õšcZô dXó¥eXó¥eXó¥eXó¥eXó¥eXó¥eXó¥eXó¥eXó¥eXó¥eXó¥eÿ­ÖÃÈÓ »ô¯ÿ* £ÿ7—ÿ="‹ÿC,ÿJ4zÿR:sÿ^?nÿhCiÿoGfÿuIcÿ{KaÿL_ÿ…N]ÿŠO\ÿPZÿ“QYÿ˜RWÿžSVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TVÿ£TÙºÅǹ٬ÿ¢ÿ+ •ÿ3‰ÿ9~ÿ@%uÿH+mÿP0gÿZ4cÿe7`ÿm9^ÿs;\ÿx=Zÿ}>Xÿ‚?Wÿ†@Vÿ‹@UÿATÿ”BSÿšCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCQÿŸCƾ·ÍªäŸÿ”ÿ( ‡ÿ.{ÿ5qÿ=iÿE#bÿM&[ÿV)Xÿ_,Vÿh-Tÿn/Sÿs0Rÿx1Qÿ|1Pÿ€2Oÿ„3Nÿˆ3MÿŒ4Lÿ’4Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5Kÿ–5·Ä©Ôœù “ÿ…ÿ# yÿ)nÿ1eÿ9]ÿAWÿJSÿR PÿY"Mÿ`#Kÿf$Jÿk%Iÿo%Hÿs&Gÿw&Fÿ{'Eÿ~'Eÿ‚(Dÿ‡(Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)Cÿ‹)ÿƒÿ€'ÿ{3 ÿ†8ÿŽ@ÿ“I"ÿ•U-ÿ“a9ÿmEÿ‹xOÿ†„Yü‚Ža÷}–hôxnñt£sîq©wìn®zêl³}éj¹çhÀægǃãeÏ…Ýc؆Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡ÿƒÿ€'ÿ{3 ÿ†8ÿŽ@ÿ“I"ÿ•U-ÿ“a9ÿmEÿ‹xOÿ†„Yü‚Ža÷}–hôxnñt£sîq©wìn®zêl³}éj¹çhÀægǃãeÏ…Ýc؆Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡ÿƒÿ€'ÿ{3 ÿ†8ÿŽ@ÿ“I"ÿ•U-ÿ“a9ÿmEÿ‹xOÿ†„Yü‚Ža÷}–hôxnñt£sîq©wìn®zêl³}éj¹çhÀægǃãeÏ…Ýc؆Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡ÿƒÿ€'ÿ{3 ÿ†8ÿŽ@ÿ“I"ÿ•U-ÿ“a9ÿmEÿ‹xOÿ†„Yü‚Ža÷}–hôxnñt£sîq©wìn®zêl³}éj¹çhÀægǃãeÏ…Ýc؆Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡ÿƒÿ€'ÿ{3 ÿ†8ÿŽ@ÿ“I"ÿ•U-ÿ“a9ÿmEÿ‹xOÿ†„Yü‚Ža÷}–hôxnñt£sîq©wìn®zêl³}éj¹çhÀægǃãeÏ…Ýc؆Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡Ó`Ú‡ÿƒÿ€'ÿ}2 ÿˆ7ÿ?ÿ•I"ÿ—T-ÿ–_9ÿ“kEÿŽwQÿˆ‚[ú„Œdõ”kñz›rîv¢wër§{éo­çl²‚åj¸„äi¿‡âhljàfÏŠÖcÖŒÏbØŠÏbØŠÏbØŠÏbØŠÏbØŠÏbØŠÏbØŠÏbØŠÏbØŠÏbØŠÿ„ÿ'ÿ€1 ÿ‹6ÿ“>ÿ™G"ÿœR-ÿš]:ÿ˜iGÿ“tSþŽ~_÷ˆ‰iñ‚‘rí}˜yéxŸåt¤„ãpªˆàm°ŒÞk·Ýj¿‘ÛiÈ“ÕfÏ•ËdÑ“ÆeÔŽÆeÔŽÆeÔŽÆeÔŽÆeÔŽÆeÔŽÆeÔŽÆeÔŽÆeÔŽÆeÔŽÿ…ÿ‚&ÿ‚0 ÿŽ5ÿ–=ÿœF!ÿ P-ÿŸ[;ÿœfHÿ˜qVû“|bô†mw耕€äzœ‡àu¢ŒÝr¨‘Úo¯•Øm·™ÕkÀœÒiÉžÉeÉžÂg͘¾iÑ“¾iÑ“¾iÑ“¾iÑ“¾iÑ“¾iÑ“¾iÑ“¾iÑ“¾iÑ“¾iÑ“ÿ†ÿƒ&ÿ…/ ÿ4ÿ™=ÿŸF!ÿ£O-ÿ£Z;ÿ dIÿoXú˜yeñ’ƒqꋌ|䃒†ß}™ŽÚx •Öt§šÓp®ŸÑm¶£ÏkÀ¥Çf§ÀhÆ¢»jË›·lΖ·lΖ·lΖ·lΖ·lΖ·lΖ·lΖ·lΖ·lΖ·lΖÿ†ÿƒ&ÿ‡. ÿ“4ÿ›<ÿ¡E ÿ§M-ÿ¦X;ÿ¤bJü¡lY÷œvhï–€uç‰à‡ŒÚ€–•ÕzžÑu¥£Íp¬¨Ëmµ¬Çk¾­½h¿¬¸kæ³mÈŸ°oÌ™°oÌ™°oÌ™°oÌ™°oÌ™°oÌ™°oÌ™°oÌ™°oÌ™°oÌ™ÿ‡ÿ„%ÿ‰- ÿ•3ÿ<ÿ¤D ÿªL-ÿªW;þ¨`Kø¥jZó¡tjíœ~y䓆†Ü‹’Õƒ”œÏ|›¥Ëw£ªÇt«­Äsµ¯¿p¼°µk¼°°nÁ©¬pÆ¢©rÊœ©rÊœ©rÊœ©rÊœ©rÊœ©rÊœ©rÊœ©rÊœ©rÊœ©rÊœÿ‡ÿ„%ÿ‹, ÿ—3ÿŸ;ÿ¦Dÿ¬K,ÿ®U;û¬_Kõªh\î¦qlç z|ß—‚ŠÕŽˆ˜Í…¡Ç€—§Â{ž¬½x§¯ºv°±·uº²­pº²©q¿¬¥tĤ£uÉž£uÉž£uÉž£uÉž£uÉž£uÉž£uÉž£uÉž£uÉž£uÉžÿˆÿ…%ÿŒ+ ÿ˜2ÿ¡;ÿ©Cÿ¯K,ÿ±T;ø±]Kñ¯f\ê«oná£vÕ™}Ì‘„™ÅŠŒ¢¾„“¨¹š­´|£°°z«³­y¶´¦t¹´¢u½¯ŸwæyÇ yÇ yÇ yÇ yÇ yÇ yÇ yÇ yÇ yÇ ÿˆÿ…%ÿŽ* ÿš2ÿ£:ÿ«Bÿ±J+ýµS;öµ\Kî³d]å®loÛ¥sÎzÅ•™¾Žˆ¢·ˆ©±„—®¬€Ÿ±¨~¨´¥}²µŸz¸¶›y»±™{Á¨˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢˜|Æ¢ÿ‰ÿ†%ÿ* ÿœ1 ÿ¥:ÿ­Bÿ´J+û¸R:ó¹ZKê¸b^á±jpÓ©pÈ w¿™~™·’…¢°ŒŒ©ªˆ”®¥„œ² ‚¤µ®¶™··”}º³“Àª’Å£’Å£’Å£’Å£’Å£’Å£’Å£’Å£’Å£’Å£ÿ‰ÿ†$ÿ‘) ÿ1 ÿ§9ÿ¯Bÿ¶I*ø¼P:ð½YKç¼a^ܵgqάoäu޹œ|™±–‚¢ª‘Š©£Œ‘®ž‰™²™†¡µ–…«·“…¶·Ž¹´Žƒ¿«ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ƒÄ¥ÿ‰ÿ‡$ÿ“) ÿŸ1 ÿ©9ÿ±Aÿ¹I)öÀO9íÂWJä¿_]Ö¹fpɰm€¾¨sŽ´ z™«š€¢¤•‡©‘Ž®—Ž–²’‹ŸµŠ©·ŒŠ´¸ˆ†¸µˆ‡¾¬ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ˆ‡Ã¦ÿŠÿ‡$ÿ”) ÿ¡0 ÿ«9ÿ´Aü»H(ôÃN8ëÇVJàÃ^]Ѽeoijk€¹«q¯¤w˜¦ž~¡žš„¨—–Œ®‘“”²Œ‘œµˆ¦·…±¸‚Œ·¶‚Œ¾­ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ƒŒÃ¦ÿŠÿˆ$ÿ–(ÿ£0 ÿ­8ÿ¶@ú¾H'ñÇN7çÌUHÜÇ\\Ì¿co¿·i´°pŒ©©u— £{ ˜Ÿ‚¨‘›‰­Š™’²…–𵕤·~•¯·{’·¶}‘½®}§}§}§}§}§}§}§}§}§}§ÿ‹ÿ‰$ÿ˜(ÿ¥/ ÿ°8ÿ¹@øÂG&îËM5äÐTFÕË[[ÇÃbnº»h~®´n‹£®s–š©zŸ’¥€¦Š¡‡¬„Ÿ±~˜´zœ¡¶x›¬¶uš·¶w˜½®x–§x–§x–§x–§x–§x–§x–§x–§x–§x–§ÿŒÿŠ#ÿš'ÿ§/ ÿ³7ü½?óÆF#êÐL2àÕREÏÏYZÁÈ`l´Àf|¨ºlŠ´r•”°xž‹¬~¥ƒ¨…ª}¦Œ¯x¤•²t£Ÿ´q£ªµo¤¹´p ¾­r§r§r§r§r§r§r§r§r§r§ÿŒÿŒ"ÿ'ÿª. ÿ¶6÷Á>íÌF äØK.ÙÜPDÉÔXX»Í^k®Æez¢Àjˆ—»p’·u›„³|¢}±ƒ¨v¯Š¬q­“¯m­±j­©²i­·±j©¿¬k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦k¦Ã¦ÿÿ ÿ &ÿ®-ý»5 ñÇ=åÓDÝàH-ÐáOBÂÛVV´Ó]h§ÍcxšÈh…Ãn…Àt˜}½zžvº¤p¹‰¨k¸’ªg·œ¬e¸¨­c¸¶­dµÁ©e°Å¤e°Å¤e°Å¤e°Å¤e°Å¤e°Å¤e°Å¤e°Å¤e°Å¤e°Å¤ÿŽÿ“ÿ¤%ÿ³,÷Á3 èÎ<ÜÞ@ÐåH.ÇåMB¹àUT¬Û[eŸÕat’Ðf‡Íl‹~Êr“vÈy™oÆžjʼn¢eÅ’¤bĦ_ħ§]Ä´§^ÃĤ_½È _½È _½È _½È _½È _½È _½È _½È _½È _½È ÿÿ˜ÿ©#ÿ¹)îÈ1ÝÚ4 ÐäAÆëG.¼êLA°æSR£ãZa—àanŒÝhy‚Ûn‚zÙu‰rÕ|kÒ‚“eψ—`Íš\Ì—œZË XË«W˺YÌÌ™YÌÌ™YÌÌ™YÌÌ™YÌÌ™YÌÌ™YÌÌ™YÌÌ™YÌÌ™YÌÌ™ÿ’ÿÿ¯ öÀ%âÓ$Ðã2 Åì@ºñG/°ïK?¥íQNšëZZêbe…èjn}çruuãx{oà~€iÝ„„dÛŠ‡`Ù‘‰]ؘ‹ZÖ XÖ¨ŽVÕ´ŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽTÕÁŽÿ”ÿ¤ÿ·éËÑáÅì1ºõ@®÷E.£õJ<šôPHóZS†óc[~òlbwñshqîzmlë€pgé†scçŒv`æ’x]ä˜zZãž{Xã¥}Vâ¯~Tá¸~Tá¸~Tá¸~Tá¸~Tá¸~Tá¸~Tá¸~Tá¸~Tá¸~Tá¸~ÿ˜ÿ­óÃÒØ Äì¸ö1­ý>¢ýC+—üH7ŽüOA…üYI}ücPwümVpûtZkùz^h÷adõ‡caóe_ò“g]ñ™hZðžiXï¥kVï­lTî´mTî´mTî´mTî´mTî´mTî´mTî´mTî´mTî´mTî´mÿ£ñ¹ ÎÉ Äß ¶÷¬ÿ2 ÿ;”ÿA'ŠÿG1ÿN9zÿX?sÿbEnÿlIiÿsLfÿzOcÿ€Q`ÿ†S^ÿŒT\ÿ’UZþ˜WYýXWü¤YUû«ZTû±[Tû±[Tû±[Tû±[Tû±[Tû±[Tû±[Tû±[Tû±[Tû±[ð¯Í¿ÀÍ´î©ÿ!Ÿÿ1’ÿ7‡ÿ>"}ÿE)uÿM0nÿU5iÿ`9eÿj_ÿw@\ÿ~BZÿ„CYÿ‰DWÿEVÿ”FUÿšGSÿ HRÿ§IQÿ­JQÿ­JQÿ­JQÿ­JQÿ­JQÿ­JQÿ­JQÿ­JQÿ­JQÿ­Jϸ¾Ã²Ô¦þœÿ#ÿ-„ÿ3yÿ;pÿC"iÿJ'bÿR*]ÿ\-Zÿe0Xÿm1Vÿs3Tÿy4Sÿ~5Rÿ„6Pÿ‰7OÿŽ8Nÿ“8Mÿ™9Lÿ :Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:Kÿ¦:¿¼°Ê£Ü™ÿÿ"‚ÿ( vÿ/mÿ7eÿ?^ÿGXÿN!TÿW#Qÿ_%Nÿe&Mÿl'Kÿq(Jÿv)Iÿ{*Hÿ€*Gÿ…+Fÿ‰+EÿŽ,Dÿ”,Cÿš-Cÿš-Cÿš-Cÿš-Cÿš-Cÿš-Cÿš-Cÿš-Cÿš-Cÿš-±Â£Ò•ëŒÿ€ÿtÿ# iÿ*`ÿ2Yÿ:SÿBNÿIKÿQHÿXFÿ]DÿcCÿgAÿl@ÿp?ÿt >ÿx =ÿ| <ÿ!;ÿ‡!;ÿŒ";ÿŒ";ÿŒ";ÿŒ";ÿŒ";ÿŒ";ÿŒ";ÿŒ";ÿŒ";ÿŒ"ÿzÿv(ÿr3 ÿ|7ÿ„?ÿˆHÿ‹S'ÿ‰`1ÿ†m;ÿ‚yDÿ~†Lÿ{‘SÿwšXÿt¢]üq¨aún®døk´g÷iºiõhÁkófÈmïcÍoìaÓpç_Ýqâ]åsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÿzÿv(ÿr3 ÿ|7ÿ„?ÿˆHÿ‹S'ÿ‰`1ÿ†m;ÿ‚yDÿ~†Lÿ{‘SÿwšXÿt¢]üq¨aún®døk´g÷iºiõhÁkófÈmïcÍoìaÓpç_Ýqâ]åsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÿzÿv(ÿr3 ÿ|7ÿ„?ÿˆHÿ‹S'ÿ‰`1ÿ†m;ÿ‚yDÿ~†Lÿ{‘SÿwšXÿt¢]üq¨aún®døk´g÷iºiõhÁkófÈmïcÍoìaÓpç_Ýqâ]åsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÿzÿv(ÿr3 ÿ|7ÿ„?ÿˆHÿ‹S'ÿ‰`1ÿ†m;ÿ‚yDÿ~†Lÿ{‘SÿwšXÿt¢]üq¨aún®døk´g÷iºiõhÁkófÈmïcÍoìaÓpç_Ýqâ]åsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÝ[æsÿzÿw'ÿt2 ÿ6ÿ†=ÿ‹GÿŽQ'ÿŒ^1ÿ‰k<ÿ…wFÿƒNÿ}Vÿy˜\üu aùr¦e÷o­iõl³lój¹oòhÀqðfÈsìdÍuèaÔvã_ÞwÛ]ãyÕ]åvÕ]åvÕ]åvÕ]åvÕ]åvÕ]åvÕ]åvÕ]åvÕ]åvÿ{ÿw'ÿw0 ÿ‚5ÿŠ<ÿFÿ’O'ÿ‘\2ÿŽh=ÿŠtHÿ†€Rÿ‹Zü}•aøxgõt¤mòqªqðn°tîk¶wìi¾zêgÇ}çeÎâbÖ€Ù_ÝÐ_à~Ì`ã{Ì`ã{Ì`ã{Ì`ã{Ì`ã{Ì`ã{Ì`ã{Ì`ã{Ì`ã{ÿ|ÿx&ÿz/ ÿ…3ÿ;ÿ’Dÿ–N'ÿ•Z2ÿ’e>ÿŽqJÿŠ}Uþ…ˆ^ù€’gô{šnðv¡sír§xêo®}èl´€æi¼ƒägƆáeψÙb׊ÏaÙˆÈbÝ‚ÄcàÄcàÄcàÄcàÄcàÄcàÄcàÄcàÄcàÿ}ÿy&ÿ|. ÿˆ2ÿ:ÿ•CÿšL'ÿ™X3ÿ–c?ÿ’nLÿŽzWü‰…bõ„kð~—sìyžzèt¥€åp«…âl³‰àj»ŒÞhÆÚfÑ’ÎbÑ’ÇdÕŒÁeÛ†½fÝ‚½fÝ‚½fÝ‚½fÝ‚½fÝ‚½fÝ‚½fÝ‚½fÝ‚½fÝ‚ÿ}ÿz&ÿ, ÿ‹1 ÿ“:ÿ˜BÿK&ÿV3ÿ›a@ÿ—lMû’vZ÷fòˆŒpì‚”yç{›ãu¢ˆßq©ŽÜm±’Ùk»–×iÈ™ÌdË›ÅeΗÀgÒ‘ºhØŠ¶iÛ†¶iÛ†¶iÛ†¶iÛ†¶iÛ†¶iÛ†¶iÛ†¶iÛ†¶iÛ†ÿ~ÿ{&ÿ+ ÿ1 ÿ•9ÿ›Bÿ J&ÿ¡T3ÿŸ_AûœiOö—s]ñ’~j쌈uç…‘€â~˜‰Ýx ‘Ør§—Òm¯Ïl¹ŸÌkÅ ÃgÇ ¼hË›·jД²lÕ¯lÙ‰¯lÙ‰¯lÙ‰¯lÙ‰¯lÙ‰¯lÙ‰¯lÙ‰¯lÙ‰¯lÙ‰ÿ~ÿ{%ÿƒ* ÿ0 ÿ˜8ÿžAÿ£I&ÿ¦R3ý¤]A÷¡gPñœq_ë—{måƒzÞ‡‹†Õ~’‘Ïx™—Êt¡œÇqªŸÃo³¡Án¿£ºkÅ£³kÈŸ¯m͘«oÒ‘©pÖŒ©pÖŒ©pÖŒ©pÖŒ©pÖŒ©pÖŒ©pÖŒ©pÖŒ©pÖŒÿÿ|%ÿ†)ÿ’/ ÿ›8ÿ¡@ÿ§H%ÿªQ2ù©[Aó¦dQì¢naåšvpÜ‘~Ò‰†‹Ë‚“Å}•™Àxž¼u¥¡¹s®¤¶r¹¥²pæ«oÆ¢¨qË›¤sГ¢tÔŽ¢tÔŽ¢tÔŽ¢tÔŽ¢tÔŽ¢tÔŽ¢tÔŽ¢tÔŽ¢tÔŽÿ€ÿ|%ÿˆ(ÿ”/ ÿ7ÿ¤?ÿªG$ý®O2ö­YAï«bRç¦kbÞžrsÒ•zÊ‚‹Ã‡Š“½‘š·}™Ÿ³y¡£¯wª¦¬v´§ªvÁ¨£sÃ¥ uÉžžwÏ–œwÒ‘œwÒ‘œwÒ‘œwÒ‘œwÒ‘œwÒ‘œwÒ‘œwÒ‘œwÒ‘ÿ€ÿ}%ÿŠ'ÿ–. ÿŸ6ÿ§?ÿ­G#û²N1ó²WAë±`RâªhdÖ¢ptÌ™wÃ’‹¼‹†”µ†Žš¯• ª~¤¦{¦§£z°©¡y¼©›wÁ¨™yÇ ˜z͘—{Ñ“—{Ñ“—{Ñ“—{Ñ“—{Ñ“—{Ñ“—{Ñ“—{Ñ“—{Ñ“ÿÿ~$ÿŒ&ÿ˜. ÿ¢6ÿ©>ÿ¯F#øµM0ð·V@çµ^RÝ®fdÐ¥nsÆu€½–|‹µƒ”®Š‹›¨†’ £‚š¥Ÿ£¨›~­ª˜}¹«”{Àª“}Æ¢’~Ì™‘Д‘Д‘Д‘Д‘Д‘Д‘Д‘Д‘Дÿÿ~$ÿ&ÿš- ÿ¤5ÿ¬=þ²E"ö¸L0í¼T@ä¸]QײdcË©lsÀ¡s€·šz‹¯”€“¨ˆ›¢Š œ‡—¥—„ ¨”‚©ª‘‚µ«¿«Å¤Œ‚Ë›Œ‚Ï•Œ‚Ï•Œ‚Ï•Œ‚Ï•Œ‚Ï•Œ‚Ï•Œ‚Ï•Œ‚Ï•Œ‚Ï•ÿ‚ÿ$ÿ%ÿœ- ÿ¦5ÿ®=üµE!ó¼K.êÁR?à¼[QѵccÆ­jr»¥q²žwŠ©˜~“¢“…š› –Œ•¥‘‰¨‡§«Š‡²¬‡‡¿¬††Ä¥‡†Êœ‡†Î—‡†Î—‡†Î—‡†Î—‡†Î—‡†Î—‡†Î—‡†Î—‡†Î—ÿ‚ÿ€#ÿ‘%ÿž, ÿ¨4 ÿ±<ú¸Dð¿K-çÅQ=ÜÀZP͸abÁ°hq¶©o~¬¢u‰¤|’œ˜‚š•”Š ‘’¥ŠŽ›¨†¥«ƒŒ°¬¾¬€‹Ã¦‹É‹Í˜‹Í˜‹Í˜‹Í˜‹Í˜‹Í˜‹Í˜‹Í˜‹Í˜ÿƒÿ‚"ÿ“$ÿ ,ÿ«3 ÿ´<÷¼CîÄJ+äÉQ;ÕÄXOȼ`a¼´gp±­m}§§s‰ž¢y’–€™šˆŸ‰—¤ƒ”˜¨“¢ª|’­«z’»¬z‘æ{Éž|͘|͘|͘|͘|͘|͘|͘|͘|͘ÿƒÿ„!ÿ•$ÿ¢+ÿ­3 þ·;ôÀBêÉI(àÍO9ÐÇWNÃÀ^`·¸eo«²k|¡¬q‡˜§x£~˜‰ …ž‚£}›–§x™ ©u™«ªs™¸«s˜Ã¦u–Éžv•Í™v•Í™v•Í™v•Í™v•Í™v•Í™v•Í™v•Í™v•Í™ÿ„ÿ‡ ÿ—#ÿ¥*ÿ±2 û»:ñÅAçÏH%ÛÒM8ËËUL½Ä]^±¾cn¥¸j{›²o†’®v‰ª|–‚§ƒœ{¤‹¡v¢”¥q¡§n ©©l¡¶©m¡Ã¦oÉžpœÍ˜pœÍ˜pœÍ˜pœÍ˜pœÍ˜pœÍ˜pœÍ˜pœÍ˜pœÍ˜ÿ…ÿŠÿš"ÿ¨)ÿµ0öÀ8ëË@áØF ÓØK6ÅÐTK·É[\«ÃblŸ¾hx”¹nƒ‹µsŒƒ²z“{¯™u­‰žo«’¢kªœ¤hª§¥fª´¦f«Å¤h¦Êœi¤Í—i¤Í—i¤Í—i¤Í—i¤Í—i¤Í—i¤Í—i¤Í—i¤Í—ÿ†ÿÿž!ÿ¬'ýº/ïÇ6 ãÔ>ØßCËÞJ4¾ÖRH°ÐZZ¤Ê`i˜ÆfvÁl€„¾r‰{»xt¹•n·‡ši¶eµ› b´¦¡`µ³¡_¶Å a±Ìšb®Ï•b®Ï•b®Ï•b®Ï•b®Ï•b®Ï•b®Ï•b®Ï•b®Ï•ÿ‡ÿ‘ÿ¢ ÿ²%õÀ+æÏ1ØÞ8ÌåC ÃâI3¶ÞQF©ØXWœÒ^eÎdr†Ëj||Èp„tÆwŠnÄ~hÇ”c—_Á›™\Á¦š[³›ZÃÅš[¾Ï•\ºÒ‘\ºÒ‘\ºÒ‘\ºÒ‘\ºÒ‘\ºÒ‘\ºÒ‘\ºÒ‘\ºÒ‘ÿ‰ÿ–ÿ¨þ¸!ìÉ"ÙÝ%Ìå7ÂêC"·çH3¬äOD àVS”Ý]`ˆÚck~ÖjuuÔp}nÒwƒgшbЇ‹^БŽZМXЧ‘Vе’UÒÇ‘VÍÔŽVÈÖ‹VÈÖ‹VÈÖ‹VÈÖ‹VÈÖ‹VÈÖ‹VÈÖ‹VÈÖ‹VÈÖ‹ÿ‹ÿÿ¯ôÁÝØÌå&Áî7¶ïB#«íG2¡ëL@–éUM‹ç]X‚æeayälirätolã|tgâ„xbâ{^â•~[àž€Xß§‚UÞ±ƒSÞ¾ƒRÞÒƒQÙÜ‚QÙÜ‚QÙÜ‚QÙÜ‚QÙÜ‚QÙÜ‚QÙÜ‚QÙÜ‚QÙÜ‚ÿÿ¤þ¸ÖÌ ÌäÀï&µõ8ªô@"ŸóF0•òK<ŒñTF‚ð]OzðfVtðn\nïvaiï~deï†haïŽj^î–m[ížoXë¥pVë®qTê¸rRêÇsQéÕsQéÕsQéÕsQéÕsQéÕsQéÕsQéÕsQéÕsQéÕsÿ˜ÿ®ÔÁ ÉÏ ¾ð³ù' ©û8žû>!“ûD,‰úJ5úS>yú]ErúfJmúoNhúvRdú~Uaú†W_ûŽZ\ú–[Zù]Wø¥^U÷¬`S÷µaRöÁaPöÊbPöÊbPöÊbPöÊbPöÊbPöÊbPöÊbPöÊbPöÊbÿ£ Ö¸ÆÄ»Ô °ü¦ÿ) œÿ5ÿ;†ÿB&}ÿI.uÿQ4oÿ[:iÿe>eÿnAbÿuD_ÿ|F\ÿƒHZÿ‹IXÿ“KVÿ›LUÿ¢MSÿ©NQÿ±OPÿ»POÿÃQOÿÃQOÿÃQOÿÃQOÿÃQOÿÃQOÿÃQOÿÃQOÿÃQÚ¯Ƽ¹É­Û£ÿšÿ+ Žÿ1ƒÿ8yÿ@ pÿG&iÿO+cÿX/_ÿb2\ÿk4Zÿr6Xÿx8Vÿ9Tÿ†;RÿNÿ£>Mÿª?Kÿ³@Jÿ¹AJÿ¹AJÿ¹AJÿ¹AJÿ¹AJÿ¹AJÿ¹AJÿ¹AJÿ¹Aȵ¸Á«ÐŸë –ÿ‹ÿ& ÿ-uÿ5lÿ=eÿD^ÿL"XÿT%Uÿ]'Rÿe)Pÿl*Nÿs+Mÿy,Lÿ-Jÿ….IÿŒ/Hÿ’0Gÿ™0Eÿ 1Dÿ©2Cÿ®2Cÿ®2Cÿ®2Cÿ®2Cÿ®2Cÿ®2Cÿ®2Cÿ®2Cÿ®2¸ºªÈÙ’ÿ ‰ÿ}ÿ!rÿ( hÿ0`ÿ8Zÿ@TÿHOÿOLÿWIÿ]Gÿc Eÿi Dÿo!Bÿt"Aÿz"@ÿ€#?ÿ†$>ÿŒ$=ÿ’%<ÿ™%;ÿž&;ÿž&;ÿž&;ÿž&;ÿž&;ÿž&;ÿž&;ÿž&;ÿž&«ÁÐá†ÿzÿnÿdÿ# \ÿ+ Uÿ3Oÿ;IÿBFÿIBÿO@ÿU>ÿZ<ÿ_;ÿd9ÿh8ÿm7ÿr6ÿw5ÿ|4ÿ3ÿˆ2ÿ2ÿ2ÿ2ÿ2ÿ2ÿ2ÿ2ÿ2ÿÿpÿl)ÿi3 ÿr7 ÿy>ÿ}Gÿ€Q!ÿ~_)ÿ|m2ÿy{9ÿvˆ@ÿs“EÿpJÿn¦Nÿk­Qÿi´Sÿh»UÿfÃWÿcÇYûaÌ[÷_Ó\ó^Ý]ð\ã^ë[é_çYï`åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_ÿpÿl)ÿi3 ÿr7 ÿy>ÿ}Gÿ€Q!ÿ~_)ÿ|m2ÿy{9ÿvˆ@ÿs“EÿpJÿn¦Nÿk­Qÿi´Sÿh»UÿfÃWÿcÇYûaÌ[÷_Ó\ó^Ý]ð\ã^ë[é_çYï`åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_ÿpÿl)ÿi3 ÿr7 ÿy>ÿ}Gÿ€Q!ÿ~_)ÿ|m2ÿy{9ÿvˆ@ÿs“EÿpJÿn¦Nÿk­Qÿi´Sÿh»UÿfÃWÿcÇYûaÌ[÷_Ó\ó^Ý]ð\ã^ë[é_çYï`åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_åYñ_ÿpÿl(ÿk1 ÿu6 ÿ{<ÿFÿƒP!ÿ^*ÿ~k3ÿ{x;ÿx†Bÿu’Hÿr›Mÿp¤Qÿm¬Tÿk²Wÿi¹ZÿgÁ\üeÇ^øbÌ_õ`Óað^Ýbì\äcè[édâZïdàZðbàZðbàZðbàZðbàZðbàZðbàZðbàZðbÿqÿm(ÿn0 ÿx4 ÿ;ÿƒDÿ‡N!ÿ†[+ÿƒh4ÿu=ÿ|‚EÿyŽLÿv™Rÿr¡Vÿo©Zþm°^üj·aûh¾cùfÆeôcÌgðaÓië_Þkæ]ålà[émÙ\îhÖ\ïgÖ\ïgÖ\ïgÖ\ïgÖ\ïgÖ\ïgÖ\ïgÖ\ïgÿrÿn(ÿq. ÿ{2 ÿƒ:ÿ‡CÿŠL!ÿŠY+ÿ‡e5ÿƒr?ÿ~Hÿ|‹Pÿy–VÿuŸ\ýr¦`ún­døl´höi¼kôgÅmðdÌpëaÓrå_ßsÞ\åtÖ\èqÏ^ílÍ^îkÍ^îkÍ^îkÍ^îkÍ^îkÍ^îkÍ^îkÍ^îkÿsÿo'ÿt-ÿ~1 ÿ†9ÿ‹BÿŽK!ÿŽV+ÿ‹c6ÿ‡oAÿƒ{Kÿ‡Sþ|’[üxœaùt¤göp«kóm²oñjºsïhÃvëeÌxæbÕzÞ_ß|Ó]ã{Í_ævÇ`êpÆ`ìnÆ`ìnÆ`ìnÆ`ìnÆ`ìnÆ`ìnÆ`ìnÆ`ìnÿtÿp'ÿv+ÿ/ ÿ‰8ÿŽ@ÿ’I!ÿ“T,ÿ`7ÿŒlCÿ‡wMûƒƒWøŽ`öz—góv nðr¨sín¯xëk¸|èhÂæfÍ‚ßbØ„Ñ_Ü…Ê`àÅaãz¿cèt¾cér¾cér¾cér¾cér¾cér¾cér¾cér¾cérÿtÿp&ÿy*ÿ…. ÿ7ÿ’?ÿ–H ÿ—R,ÿ•^8þ‘iDúŒtPõ‡[ò‚‰eî}“nêw›uçr£|än«áj³†Þg½ŠÚeÊÒbÔŽÈbØŠÂcÜ„¼eà~·fåx¶fæv¶fæv¶fæv¶fæv¶fæv¶fæv¶fæv¶fævÿuÿq&ÿ|(ÿˆ- ÿ6ÿ–>ÿšG ÿœP+ÿš[8ù—fEô’pRïŒ{_ê……jå~tàx•}Ûr…Ôm¤‹Ðj­ŽÍh·ËhÑÈgÑ’¿eÔ¹gÙ‰´hÝ‚°iâ|®jäy®jäy®jäy®jäy®jäy®jäy®jäy®jäyÿvÿr&ÿ'ÿŠ, ÿ“5ÿ™=ÿžFÿ¡N+û Y8õœcFï˜mTèwbâˆoÚ€‡{ÒzƒÍu—‰ÉqŸÅn¨‘Âl±“¿k¼•½kË•¶iД±kÕ¬lÛ†¨mà§mâ|§mâ|§mâ|§mâ|§mâ|§mâ|§mâ|§mâ|ÿvÿs%ÿ&ÿ, ÿ–4ÿ<ÿ¡Dþ¥L*÷¥W8ð¢aGéœjVá”reØŒ{sÏ…ƒ|É‹„Ãz“Š¿v›ºs£“·p¬–´o·—±oʬm͘©oÓ¥p؉¡qÞ‚ qà qà qà qà qà qà qà qàÿwÿt%ÿƒ%ÿ+ ÿ™3 ÿ ;ÿ¥Cû©K)óªT8ì¨^Gã¡gWÚ™ogÏ‘xsÇŠ€}Á„ˆ…»‹µz—±wŸ”­t¨—ªs²™§r¿š¤rËš¡sГžtÖŒ›uÜ„šuÞšuÞšuÞšuÞšuÞšuÞšuÞšuÞÿxÿv$ÿ†#ÿ’*ÿ›2 ÿ£:ÿ¨Bø­J(ð¯R7ç¬\GÞ¥dXÑmfÈ•usÀŽ|}¹‰„…³ƒŒŒ­“‘©{›•¥y¤™¡w®›žvºœwÊœ™wÏ–—xÔŽ•xÛ†”x݃”x݃”x݃”x݃”x݃”x݃”x݃”x݃ÿxÿx#ÿˆ#ÿ”*ÿž1 ÿ¦:þ«Bõ°I'ìµP6ã°ZFØ©cWÌ¡kfšrrº“z|³…¬ˆ‰Œ¦„‘¡€˜–}¡š™{ªœ–{¶”{Æž’{͘‘|Ó|Ùˆ|Ü…|Ü…|Ü…|Ü…|Ü…|Ü…|Ü…|Ü…ÿyÿz"ÿŠ"ÿ–)ÿ 1 ÿ¨9û¯Aò´H&é¹O4ß´YEÒ­aVÇ¥ie½žpr´—w|­‘~…¦Œ†Œ ˆ‘š…•––‚žš’€§³ž€Âž‹€Ìš‹Ò’Š€Ø‰‰€Û†‰€Û†‰€Û†‰€Û†‰€Û†‰€Û†‰€Û†‰€Û†ÿyÿ{!ÿ‹"ÿ˜(ÿ£0 ÿ«8ù²@ï¸G$æ½N3Û¸WDͰ`V©gd¸¢nq¯›u{§–|„ ‘ƒ‹š‹‘”Š“–‡›š‹…¥ˆ„°Ÿ…„¿Ÿ……Ë›……Ñ“……ØŠ„„Ú‡„„Ú‡„„Ú‡„„Ú‡„„Ú‡„„Ú‡„„Ú‡„„Ú‡ÿzÿ} ÿ!ÿ›(ÿ¥/ ÿ®7ö¶?ì¼F"ãÁN0Õ¼VCÈ´^U½¬fc³¦lpªŸs{¡šz„š–‹”’ˆ‘Ž–‰Œ™š„УЮŸ~мŸ~ŠÊœŠÐ”‰Ö‹ˆÙˆˆÙˆˆÙˆˆÙˆˆÙˆˆÙˆˆÙˆˆÙˆÿzÿÿ!ÿ'ÿ¨.þ²6 óº>éÁEßÅL/пTBÄ·]S¸°db®ªjo¤¤qzœŸwƒ”›~ŠŽ˜†‡•Ž•‚’—™} œz«žx¹Ÿw‘ÊyÏ•yŽÖŒy؉y؉y؉y؉y؉y؉y؉y؉ÿ{ÿÿ’ ÿ &ÿ«-ûµ5 ð¾=æÇDÚÉI.ËÃSA¾¼[R³µba¨¯inŸªox–¥uŽ¡|‰‡žƒ›‹”{™”˜w—ž›s–©q–¶žp—Èr–Ï•s”ÕŒt“؉t“؉t“؉t“؉t“؉t“؉t“؉t“؉ÿ|ÿ„ÿ•ÿ£%ÿ¯,÷º3 ìÄ;âÎBÓÎH,ÆÇR@¹ÀZQ­ºa_£´gl™°mw«t€ˆ¨z‡¥z¢‰’u ’–pž›™lž§›jž´œiŸÅ›lžÐ”mšÖŒm™Ø‰m™Ø‰m™Ø‰m™Ø‰m™Ø‰m™Ø‰m™Ø‰m™Ø‰ÿ}ÿ‡ÿ˜ÿ¦#ÿ³)óÀ1çË8 ÝØ:ÍÒF*ÀÌP>³ÆXO§À_]œ»ej’·kt‰³q}¯x„z­Štª‡n©“i§š–f§¥˜c§²™b¨Ã˜e§Ñ“f£Ö‹g¡Ù‰g¡Ù‰g¡Ù‰g¡Ù‰g¡Ù‰g¡Ù‰g¡Ù‰g¡Ù‰ÿ~ÿ‹ÿœÿ«!û¹&íÇ,ßÕ1ÓÞ9ÆØD(¹ÑN;¬ÌVL Ç]Z•Âcg‹¿iq‚»oyz¸v€s¶}†m´…‹h³Žc²˜’`±¤“^²±”\²Â”^²Ó_¬Ù‰`ªÚ†`ªÚ†`ªÚ†`ªÚ†`ªÚ†`ªÚ†`ªÚ†`ªÚ†ÿÿÿ¡ÿ±ôÀ ãÑ Óß,Éâ;¾ßD%²ÙL8¥ÓTI™Ï[WŽËac„Èhl{ÅnusÃu{lÁ|gÀ„…b¿Ž‰^¾˜‹Z¾¤X¾±ŽW¿ÂX¿×‹Y¸Ü…Y¶ÝƒY¶ÝƒY¶ÝƒY¶ÝƒY¶ÝƒY¶ÝƒY¶ÝƒY¶Ýƒÿÿ•ÿ§ý¸éËÓßÈç,¾æ;³äD%¨áK5œÝRD‘ÙYR†Õ`]|ÓfftÑmnlÏttfÎ|yaÍ…}\ÌŽ€YÌ™ƒVÌ¥„T̳…SÍÄ…SÍ݃SÆà~TÃá}TÃá}TÃá}TÃá}TÃá}TÃá}TÃá}TÃá}ÿ‡ÿœÿ®Ú ÐÒ Çè¼ì, ²ë<¨êC%èH3’æP@ˆäYK~â`Tváh\oàobhßwhcÞl^ÞˆpZÞ‘sWÞ›uTÞ§wRß´xPßÄxOàÞxOÖåuOÓçtOÓçtOÓçtOÓçtOÓçtOÓçtOÓçtOÓçtÿÿ¤Û¸ÍÅ ÅÕ ºñ°ò- ¦ñ;›ðA$‘ïG/‡îN:~îXCwíaJpíiPjìqUeìyYaì\]ìŠ_Zì“aWícUí§eRí³fQîÀgOïÔhNëæhMèèhMèèhMèèhMèèhMèèhMèèhMèèhMèèhÿ™ Ý®̼ÁÉ¸Û ­ø¤ø/ ™ø9ø?!…øF*|øM2u÷W9n÷`?i÷iCdøqGaøyJ]øLZø‰OXø’QVù›RSù¥TQú¯UPú»VNúÊWMûãWLûéWLûéWLûéWLûéWLûéWLûéWLûéWLûéWå¥Î´¿¿´Îªë  ÿ—ÿ/ Œÿ6‚ÿ=xÿD$pÿL*jÿT/eÿ^3aÿg7]ÿo9ZÿvVÿ†?SÿŽAQÿ—BPÿ CNÿ©EMÿ³EKÿ¾FJÿÐGIÿÜGIÿÜGIÿÜGIÿÜGIÿÜGIÿÜGIÿÜGIÿÜGÑ®¿¹²Å§Õœý”ÿ"‰ÿ+ ~ÿ2uÿ:lÿBeÿI"_ÿQ%ZÿZ(Wÿc+Tÿk-Rÿr/Pÿy0Oÿ€1Mÿˆ2Kÿ4Jÿ˜5Hÿ¡5Gÿª6Fÿ³7Dÿ¿8DÿÅ8DÿÅ8DÿÅ8DÿÅ8DÿÅ8DÿÅ8DÿÅ8DÿÅ8Á³²¾¥Ì™Ýÿ†ÿ{ÿ' qÿ.hÿ6aÿ>ZÿFUÿMQÿUNÿ] Kÿd"Iÿk#Gÿq$Fÿx%Dÿ&Cÿ†'AÿŽ(@ÿ–(?ÿž)=ÿ§)<ÿ°*<ÿ´*<ÿ´*<ÿ´*<ÿ´*<ÿ´*<ÿ´*<ÿ´*<ÿ´*³¸¥Æ—Õ‹ï„ÿwÿmÿ"dÿ* \ÿ2Uÿ9PÿAKÿHHÿOEÿVBÿ\@ÿa>ÿg<ÿm;ÿs9ÿy8ÿ€6ÿˆ5ÿ4ÿ—2ÿ 2ÿ¤2ÿ¤2ÿ¤2ÿ¤2ÿ¤2ÿ¤2ÿ¤2ÿ¤¦À—ΉÞÿtÿiÿ_ÿWÿ$Pÿ, Jÿ3 Eÿ;AÿA=ÿG:ÿM8ÿR6ÿW4ÿ\2ÿa1ÿf/ÿk.ÿq-ÿw,ÿ}*ÿƒ)ÿ‹)ÿŽ)ÿŽ)ÿŽ)ÿŽ)ÿŽ)ÿŽ)ÿŽ)ÿŽÿf ÿa*ÿa3ÿi6 ÿn=ÿqFÿsQÿs^#ÿpm)ÿn|0ÿk‰5ÿi–9ÿg¡=ÿfª@ÿd²Bÿc¹DÿaÂFÿ`ÈGÿ^ÍHÿ\ÔJÿ[ÞKûYäL÷XêLôWïMðVóMìUøMìUøMìUøMìUøMìUøMìUøMìUøMìUøMÿf ÿa*ÿa3ÿi6 ÿn=ÿqFÿsQÿs^#ÿpm)ÿn|0ÿk‰5ÿi–9ÿg¡=ÿfª@ÿd²Bÿc¹DÿaÂFÿ`ÈGÿ^ÍHÿ\ÔJÿ[ÞKûYäL÷XêLôWïMðVóMìUøMìUøMìUøMìUøMìUøMìUøMìUøMìUøMÿf ÿb*ÿc1ÿk5 ÿp<ÿsEÿuOÿv]#ÿsl*ÿpz1ÿm‡6ÿk”;ÿiŸ?ÿh¨Bÿf°Eÿd¸GÿcÀIÿaÇJÿ_ÌLÿ]ÓMü\ÞNùZäOõYêPñXïQíWôQéWùPéWùPéWùPéWùPéWùPéWùPéWùPéWùPÿgÿc*ÿe0ÿn3 ÿt:ÿwCÿyNÿzZ$ÿwh+ÿtv3ÿq„9ÿn?ÿl›Cÿj¥Gÿh­Jÿg¶Lÿe¾NÿcÅPÿaËRý_ÒTù]ÝUô[äVðZêWëXðXçXõWãYúTãYúTãYúTãYúTãYúTãYúTãYúTãYúTÿhÿc)ÿh.ÿq2 ÿw8ÿ{Bÿ}Lÿ~X$ÿ{f-ÿws5ÿt€<ÿqŒBÿo—Gÿl¡KÿjªOÿh²Rÿg»TÿeÄVþbÊXù`ÑZõ^Ü\ð\ä]êZë^æYñ_âZõ[Ü[ùWÜ[ùWÜ[ùWÜ[ùWÜ[ùWÜ[ùWÜ[ùWÜ[ùWÿiÿd)ÿk-ÿt0 ÿ{7ÿAÿJÿ‚U%ÿc.ÿ{p6ÿx|>ÿu‰Eÿq”KÿožPÿl¦Tÿj®Xýh·[üfÀ]údÉ`õaÐbð^Ücê\åeå[ìfÞZðcØ[ô`Ñ]ø[Ñ]ø[Ñ]ø[Ñ]ø[Ñ]ø[Ñ]ø[Ñ]ø[Ñ]ø[ÿiÿe(ÿn+ÿx. ÿ6ÿƒ?ÿ…Hÿ‡S%ÿ„`/ÿ€l8ÿ|yAÿx…IþtPûq™Vùn¢Zøkª_öh²bôf»eódÅhðbÐkê_Ýmã]çnÛ[êmÓ\ïhÍ^ódÈ_÷_È_÷_È_÷_È_÷_È_÷_È_÷_È_÷_È_÷_ÿjÿf(ÿq)ÿ{, ÿƒ5 ÿ‡>ÿŠGÿŒP%ÿ‰]/ÿ…i:ýuDú|€M÷x‹Uôs•\ñobïl¥gíi­këf¶oècÀræaÌuã`ßwÖ\äxÎ^érÉ_ímÄ`ðh¿bôc¿bôc¿bôc¿bôc¿bôc¿bôc¿bôc¿bôcÿkÿg'ÿt'ÿ+ÿ‡3 ÿŒ<ÿEÿ‘N%ÿZ0ü‹f;ø†qFó|Qï|‡Zìvbèq˜iål páh¨uÞd°zÛbº~ØaÇÔaÚË_á~Äaåw¿bér»cím¶dñg¶dñg¶dñg¶dñg¶dñg¶dñg¶dñg¶dñgÿlÿj&ÿw&ÿ‚*ÿŠ2 ÿ;ÿ“Cÿ–L$ý•W0÷‘b<òŒmIì†xTç_âxŠiÜr’rÖmšxÒj¢|Îg«Ëf´Ée¿ƒÇd΄Ác݃ºdâ|¶fæv²gêq®hïj®hïj®hïj®hïj®hïj®hïj®hïj®hïjÿmÿl$ÿz$ÿ…)ÿŽ1 ÿ”9ÿ˜Bÿ›J$ø›T0ò—_=ë’jKåŠsXÞ‚|dÕ|…nÏvuÊr•zÆn~Ãl¥‚¿j¯„½i¹†ºhLJ·hÚ‡±hÞ­iãz©kèt¦kìm¦lím¦lím¦lím¦lím¦lím¦lím¦límÿmÿn#ÿ}"ÿˆ(ÿ‘0 ÿ˜8ÿœ@ûŸI#ô¡R/í\=å–fLÝŽoZÓ‡xeÌnÆ{‰vÁw‘{¼s™€¸p¡„µnª‡²m´‰¯lÁŠ­lÒŠ¨lÜ…¥má~¢nåwŸoëpŸoëpŸoëpŸoëpŸoëpŸoëpŸoëpŸoëpÿnÿq"ÿ!ÿ‹'ÿ”/ ÿ›7ÿ ?ø¤G!ð§O.è¢Z=ß›cMÔ”lZËŒueĆ}o¾€…v¸||³x•¯u…«r¥‰¨q¯‹¥p»Œ£pË qÙˆqß›räz™sér™sér™sér™sér™sér™sér™sér™sérÿoÿs ÿ‚ ÿŽ&ÿ—.ÿŸ6ý¤>ô¨F ì¬M-ã§X<Ù aL͘jYÅ‘re½‹zn¶…‚v°€‰}«}‘‚§y™†£w¢ŠŸu«œt·ŽštƘuÖ‹–v݃”vâ|“vçt’vèt’vèt’vèt’vèt’vèt’vèt’vètÿoÿuÿ„ÿ%ÿš-ÿ¢5 ú¨=ñ¬Eè°L+ß«W;Ò¤_KÈœhY¿•od·wn°Švª…†}¤Ž‚Ÿ~–‡›{ž‹—y¨Ž”x³’x‘zÕzÛ…Žzá~zævzævzævzævzævzævzævzævÿpÿvÿ†ÿ“%ÿ,ÿ¥4 ÷«<î±Cå´K)Ú¯U:ͨ^J fX¹šmd±“unªŽ|v£Šƒ}ž†‹‚™‚“‡”€›‹~¥Ž}°Š}¾‘ŠÓ‰~Ú‡ˆ~߇~åw‡~åw‡~åw‡~åw‡~åw‡~åw‡~åw‡~åwÿpÿxÿˆÿ•$ÿ +ÿ¨2 ô¯:ëµBá¸J'Ô³S9È«\I¾¤dW´žkc¬˜rm¤“yužŽ|˜‹ˆ‚’‡‡…™‹‰ƒ¢Ž†‚®‘ƒ‚¼‘‚ƒÎ‘ƒƒÙˆ‚‚ß‚‚äy‚‚äx‚‚äx‚‚äx‚‚äx‚‚äx‚‚äx‚‚äxÿqÿzÿŠÿ—#ÿ¢)ü¬1 ñ³9èº@ݼH%϶R8ï[H¹¨bV¯¢jb§œplŸ—wu˜“~|’†‚ŒŽ‡‡Š—‹ƒˆ Ž‡«‘|‡¹‘{‡Ë‘|ˆØ‰}‡Þ‚}†äz}†äy}†äy}†äy}†äy}†äy}†äy}†äyÿqÿ|ÿÿš"ÿ¥(ù¯/î¸7 ä¿?ØÀF$ʺP7¿³YG´¬aUª¦ha¡¡nk™œut’˜|{Œ•ƒ†’‹†”‹|ŽžŽx©vŒ¶‘tÈ‘vŽØŠwŒÝ‚wŠãzwŠãzwŠãzwŠãzwŠãzwŠãzwŠãzwŠãzÿrÿÿÿ ÿ©&ö³-ê½5 àÆ<ÒÄD#ŽO5º·XF¯±_T¥«f`œ¦mj”¢ssŒžzz†›€€˜‰…z–’‰u”›r“¦o“´m”Åp•ØŠp’݃qã{qã{qã{qã{qã{qã{qã{qã{ÿsÿ‚ÿ’ÿ ÿ­$ò¸*æÃ1ÛÌ5ÌÈB!ÀÂM4´¼VD©¶^RŸ±d^–¬khŽ©qq†¥xx¢~y ‡ƒtˆoœ™‹k›¤h›²Žg›ÂŽiØŠj™Ý‚k–ã{k–ã{k–ã{k–ã{k–ã{k–ã{k–ã{k–ã{ÿtÿ…ÿ–ÿ¤û² í¿%áÌ*ÔÑ2 ÇÌAºÇL1®ÁTB£¼\P™·b\³if‡°on€­vuyª}{s¨„€m¦…h¥—ˆe¤£Šb¤°‹`¤Á‹b¦Ùˆc¢Þežãzežãzežãzežãzežãzežãzežãzežãzÿvÿ‰ÿšÿ©ö¸çÇÛÙÍÖ0 ÀÒ?´ÍJ/¨ÈR?ÃZM’¿aX‰»gb€¸mky¶tqr³{wl±ƒ|g°Œ€b¯–ƒ^®¡†\®¯‡Z¯¿‡[°Ú„]¬à^§åx^§åx^§åx^§åx^§åx^§åx^§åx^§åxÿzÿŽÿŸÿ°ïÀÙÔ ÎßÄÝ/ ¹Ù=­ÓH,¡ÏP;•ËXI‹Ç_T‚Äe^yÂlfrÀrlk¾zrf½‚va»‹z\»•}Yº¡Wº¯€U»¿€U¼ÙV¸ãzX²çuX²çtX²çtX²çtX²çtX²çtX²çtX²çtÿ€ÿ”ÿ¦ã¸ ÒÆ Ì× Ãã¹â1 ¯à=¤ÝF'™ÙN7ÔVDƒÑ]OzÏdXrÍj_kËreeÊyj`É‚o[É‹rWÈ–uTÈ¢wRȯxQÉÀxPÊÛwQÆèsRÀëoR¿ìoR¿ìoR¿ìoR¿ìoR¿ìoR¿ìoR¿ìoÿ‡ÿ› ß®мÇÉÁÛ ·è ­ç1 ¤æ=™äD&ŽâL3„àT>{Þ\GsÝcOkÜjVeÚr\`Úz`[ÙƒdWÙŒgSÙ—jPÙ£lNÙ±mMÚÂmLÛÜlMØìjNÏðgNÏðgNÏðgNÏðgNÏðgNÏðgNÏðgNÏðgÿ é¤Ñ´Å¿¼Í´éªî"¢î3—í;ìB$ƒëI.{êS6sé\>lédDgélIbètM^è|QZè…TVèŽVSé˜YQé£ZNé°\Mê¾\LëÒ]Kêé]Jãó\Jãó\Jãó\Jãó\Jãó\Jãó\Jãó\Jãó\ù™Ô¬Å·¹Ã°Ò§öžõ$•õ2Šõ:õA xõH'põP.jôZ4eôc8`ôk<]õt?Yõ|BWõ„DTõFQö—HOö¡JMö¬KK÷¹LJ÷ÈMIøàMH÷óMH÷ôMH÷ôMH÷ôMH÷ôMH÷ôMH÷ôMH÷ôMڣDZ¸»­É£Ùšý’ý'‡þ/ }þ7tÿ?lÿG fÿN%`ÿW)\ÿ`-Yÿi0Vÿq2Sÿx4Qÿ€6Oÿ‰7Mÿ’9Kÿœ:Iÿ¦;Hÿ±Dÿç>Dÿç>Dÿç>Dÿç>Dÿç>Dÿç>Dÿç>ˬ¹¶¬Â Ð•åŽÿ„ÿ$zÿ, pÿ4hÿ<aÿD[ÿKVÿS Sÿ["Pÿc$Mÿk&Kÿs'Iÿz)Hÿ‚*FÿŠ+Dÿ”,Bÿž-Aÿ§.@ÿ±.?ÿ¼/>ÿÍ0>ÿÍ0>ÿÍ0>ÿÍ0>ÿÍ0>ÿÍ0>ÿÍ0>ÿÍ0»±¬¼ŸÉ“Ù‰ü €ÿvÿ lÿ( dÿ0 ]ÿ8Wÿ@QÿGMÿNJÿVGÿ\DÿcBÿi@ÿp?ÿx=ÿ€;ÿˆ :ÿ‘!8ÿ›"7ÿ¤"6ÿ­#5ÿ¸#5ÿ¹#5ÿ¹#5ÿ¹#5ÿ¹#5ÿ¹#5ÿ¹#5ÿ¹#­¶ŸÄ’Ò„á}ÿ rÿhÿ_ÿ#Xÿ+ Qÿ3 Lÿ: GÿACÿH@ÿN=ÿT;ÿZ9ÿ_7ÿe5ÿk3ÿr1ÿz/ÿ‚.ÿ‹,ÿ“+ÿœ*ÿ§*ÿ§*ÿ§*ÿ§*ÿ§*ÿ§*ÿ§*ÿ§¡¿’Ì„Üx÷nÿ cÿZÿRÿKÿ$Fÿ,Aÿ3 <ÿ: 9ÿ@ 5ÿE 2ÿJ 0ÿP .ÿT,ÿY*ÿ^(ÿd&ÿj%ÿq#ÿx"ÿ€ ÿˆÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿ\"ÿW-ÿX3ÿ_6 ÿc= ÿeFÿfPÿe^ÿdn"ÿa|'ÿ_Š+ÿ^–.ÿ\¡1ÿ[ª3ÿZ²5ÿYº6ÿXÃ7ÿXÍ9ÿWØ9ÿVà:ÿUæ;ÿTì<ÿSñ<üRõ=øRù=õQý=óQÿ=óQÿ=óQÿ=óQÿ=óQÿ=óQÿ=óQÿ=ÿ\"ÿW,ÿZ2ÿa5 ÿe< ÿgEÿhOÿh\ÿfm"ÿc{(ÿaˆ,ÿ_”/ÿ^Ÿ2ÿ]©5ÿ[±7ÿZ¹8ÿZÁ:ÿYË;ÿXÕ<ÿWß=ÿVæ>ÿUë>ýTð?ùSõ?öRù@óRý@ðRÿ>ðRÿ>ðRÿ>ðRÿ>ðRÿ>ðRÿ>ðRÿ>ÿ]!ÿX,ÿ\0ÿd3 ÿh: ÿkCÿlNÿlZÿjj$ÿgx)ÿd….ÿb‘2ÿaœ6ÿ_¦8ÿ^®:ÿ]¶<ÿ\¾>ÿ[È?ÿZÒAÿYÝBÿWåCýVêDùUðDõTõEñTúEîTþDìTÿBìTÿBìTÿBìTÿBìTÿBìTÿBìTÿBÿ^!ÿY,ÿ_.ÿf2 ÿl8 ÿoAÿoLÿqWÿng%ÿku+ÿh‚0ÿeŽ5ÿd™9ÿb£<ÿ`«>ÿ_³Aÿ^»Bÿ]ÄDÿ\ÎFÿZÜGþYäHúWêIõVðJðUöJíUúJéVþGçVÿEçVÿEçVÿEçVÿEçVÿEçVÿEçVÿEÿ^!ÿY+ÿb-ÿj0ÿo6 ÿr@ÿtJÿuUÿrd&ÿor-ÿl3ÿi‹8ÿf–<ÿe @ÿc¨Cÿa°Fÿ`¸Hÿ^ÁJÿ]ËKÿ\ÚMúZãNõYêOðWñPëVöQçWûNäXÿKáYÿIáYÿIáYÿIáYÿIáYÿIáYÿIáYÿIÿ_ ÿZ+ÿe+ÿm.ÿs5 ÿw>ÿxHÿyRÿw`'ÿtn.ÿp{5ÿm‡;ÿj’Aÿg›Eÿe¤Iþc¬Lýa´Nû`¼Qú^ÆSù]ÔUõ[ãVïZêXéXòYåY÷VàZûSÛ[ÿO×[ÿM×[ÿM×[ÿM×[ÿM×[ÿM×[ÿM×[ÿMÿ` ÿ])ÿh)ÿq+ÿx3 ÿ|<ÿ}Fÿ~Pÿ}](ÿyj0ÿuv8ÿq‚?ümEúj—KøgŸOöe§Sôb¯Vó`¸Yñ_Á\ð]Í^í\à`èZìaáZò`Ú[ö[Ó\úWÏ]ýSÌ^ÿQÌ^ÿQÌ^ÿQÌ^ÿQÌ^ÿQÌ^ÿQÌ^ÿQÿaÿ`'ÿk&ÿu)ÿ|1 ÿ:ÿƒDÿ„MÿƒY(ÿf2üzr;øu~CõqˆKòm’QïišVíf¢[êcª_è`²cæ^¼fä\Èiá[ÚkÝZêkÓ\ðfÍ^õaÈ_ù\Ä`üXÁaþUÁaþUÁaþUÁaþUÁaþUÁaþUÁaþUÿbÿc%ÿo$ÿy(ÿ0 ÿ…9ÿˆBÿ‰Kÿ‰V(ú…b3õ€n=ðzyGìuƒPépŒXåk•^áfdÞc¤iÛ`­m×_·oÔ^ÃpÑ^ÒqÍ]çqÇ_îkÂaòf¾böaºcù\·cüX·cüX·cüX·cüX·cüX·cüX·cüXÿcÿf#ÿr"ÿ}'ÿ…. ÿŠ7ÿ@ÿIúS(ôŒ_4î†j?étKãx~UÞr†^ØmeÓj˜jÏg mÌe¨pÉc±sÆb¼tÄaÉuÁaàv¼cêq·dïj´eóe°fö`®gù\®gù\®gù\®gù\®gù\®gù\®gù\ÿcÿh!ÿu ÿ%ÿ‰-ÿ5 ÿ’>ü”Gõ–O(î‘[4ç‹fAà„oNÙ}yXÑw‚`ÌsŠgÇo“lÄl›pÀi£s½g¬vºf¶x¸eÂy¶eÕy²fæv®hìoªiði¨iôc¦j÷_¦j÷_¦j÷_¦j÷_¦j÷_¦j÷_¦j÷_ÿdÿk ÿxÿ„$ÿ,ÿ“4 ÿ—<ø™Eð›M'è—Y4ábB׉lN΃uXÈ}~aÃx†h¾tŽm¹p–r¶nžu²l§x¯j±{­i½|ªiÍ}¨jãz¥lér¢líl mòfžnõbžnõbžnõbžnõbžnõbžnõbžnõbÿeÿmÿ{ÿ‡#ÿ*ÿ—2 ýœ;ôŸCì¡K%ãœV3Ú–`AÏŽiNLjrXÀ‚zaº}‚hµyŠn±u’s¬ršw©p£z¦n¬}£m¸~¡mÇŸnà~œpçušpëo™qðh—qód—qód—qód—qód—qód—qód—qódÿeÿoÿ~ÿŠ"ÿ“)ÿ›1 ù 9ð£Aç¦I#Þ¡T1Òš^@È“gMÀŒoX¹‡wa³‚h®}‡n©zŽs¤w–x tŸ{s¨~šq´€˜q–rØ•tåx“têq’uïk‘uòf‘uòf‘uòf‘uòf‘uòf‘uòf‘uòfÿfÿqÿ€ÿŒ!ÿ–(ÿž/ö¤7 ì¨?ã«H ئR0Ìž\@×eM»‘mW³‹ta­†|h§‚ƒn¢~‹t{“x™yœ|•w¥’v°u¾‚ŽvÑ‚ŽxãzxèsŒxíl‹xñh‹xñh‹xñh‹xñh‹xñh‹xñh‹xñhÿgÿsÿ‚ÿ ÿ™&þ¢.ó¨5 é­=߯FÒ©Q/Ç¢Z?¾›cLµ•jW®r`§‹yh¡‡nœƒˆt—€x’}™|Ž|¢€‹z­‚ˆz»ƒ‡z̓‡|â|‡|çu†|ìn†|ði†|ði†|ði†|ði†|ði†|ði†|ðiÿgÿuÿ…ÿ’ÿœ%û¥,ð¬4 æ²;Û³DÍ­O.æY>¹ŸaK°™hV¨”p_¡wg›‹~n–ˆ†s…ŽxŒ‚–|ˆ€ €„«‚¸ƒÊ„á}æv€ëo€€ïj€€ïj€€ïj€€ïj€€ïj€€ïj€€ïjÿhÿxÿ‡ÿ”ÿŸ#ø©*ì±1â·9 Õ·BɰN-¾ªW=´£_J«žgU£˜n_œ”uf–|mƒs‹Š‹x†ˆ”|†ž€}„¨‚{„µ„y„Ç„z†à{…æw{…ëp{„îk{„îk{„îk{„îk{„îk{„îk{„îkÿiÿzÿŠÿ—ÿ£!ô­'èµ.Þ½5 к@Ä´L,º®V;¯¨^I¦¢eTžl]—™sf•ylŠ’r…‰w’|{‹›wЦ‚t‰³ƒrŠÄƒtŒàt‹åxu‰êqvˆílvˆílvˆílvˆílvˆílvˆílvˆílÿkÿ}ÿÿšÿ¦ð±#ä»)ÙÂ0 ˽?À¸J*µ²T:ª¬\G¡§cR™£j\‘ŸqdŠ›wk„˜q~–†vy“{t’™~p¤m±‚kÁ‚m’Ýn‘åxoêqpŽílpŽílpŽílpŽílpŽílpŽílpŽílÿnÿ€ÿÿžû«ì·àÃ!ÒÆ-ÆÁ=º¼I(¯·R8¥²ZEœ­aQ“©hZ‹¥ob„¢ui~Ÿ|ox„ts›yn™–|j˜¢g—®€e˜¿e™Øh˜åxi–êqj”ílj”ílj”ílj”ílj”ílj”ílj”ílÿqÿƒÿ”ÿ¢õ°æ¾ÙÌÌÊ+ÀÆ;µÁG&ª¼Q6Ÿ¸XC–³`N°fX…¬m`~ªsgw§zlr¥‚rl£‹vh¢”yd¡ |` ­}_¡½~^¢Ô}a¡ævbëpc›îlc›îlc›îlc›îlc›îlc›îlc›îlÿtÿ‡ÿ˜þ§ç· ÖÅ ÐÐÅÏ(¹Ë9®ÇE#£ÃO3™¿W@»^K†¸dT~µk\w²qcq°xik®€mf­‰ra«“u]«žx[ª¬yY«¼yX¬ÒyZ«ès\§ìn]¤ïj]¤ïj]¤ïj]¤ïj]¤ïj]¤ïj]¤ïjÿyÿŒÿž ܮһ ÌÈ ÇÖ½Õ%²Ò6§ÎB œÊL/’ÇT<ˆÃ\GÁbPw¾iWp¼p^j»wce¹h`¸ˆl\·’oX¶žqU¶«sS·»sR·ÒsT·ëoV²ïjW¯ñgW¯ñgW¯ñgW¯ñgW¯ñgW¯ñgW¯ñgÿÿ“ á¥Ò³ɾÂ˼ݴÝ#ªÚ3 ŸÖ@”ÓJ*ŠÐR7€ÍZAxËaJpÉhQjÈoWdÆv\_Å`ZňdVÄ’gSÄžiPĬjOļkNÅÓjOÅíhPÀódQ½õaQ½õaQ½õaQ½õaQ½õaQ½õaQ½õaÿ† ðšÔªȶ¾Á·Ï °ã¨ã%Ÿâ5 •à>‹ÞH%ÜP0xÚX:pØ_BiÖgIcÕnO^ÔvSYÓWUÓ‰ZRÓ“]OÓ _MÓ­`KÔ¾`JÕØ`KÔí^LÑ÷\LÌùZLÌùZLÌùZLÌùZLÌùZLÌùZLÌùZÿڢʯ½¹´Æ«Ô ¤êœé(“é4‰è=çD"wæN*oæW2iå_8cåg=_äoBZäwEVä€ISäŠKPä”NMäŸPKå¬QIå»RHæÏRHæèRHäøQHáüOHáüOHáüOHáüOHáüOHáüOHáüOá™Í©¾³³¾¨ËŸÚ ˜òò*†ò3|ñ;tñClñK#fñT)añ]-]ñf1Yñn5Vñv7Sñ:PòˆKò@Ió©AGó¶BFôÇCEôßCDôðCDòúBDòúBDòúBDòúBDòúBDòúBDòúBÑ¢À®²¸§ÄœÒ’í Œû‚û(yû1 pü9iüAbüI\üP WüY#Týb&Qýj(Oýs*Lþ{,Jþƒ.Hþ/Fÿ˜1Dÿ¢2Cÿ®3Aÿ»4@ÿË4?ÿã4?ÿï5?ÿï5?ÿï5?ÿï5?ÿï5?ÿï5?ÿï5γ³§¿šËÚ†ÿ~ÿuÿ%lÿ- dÿ6]ÿ>XÿERÿMOÿULÿ\IÿdGÿkDÿs Bÿ|"Aÿ…#?ÿ$=ÿš%;ÿ¤&:ÿ¯&9ÿº'8ÿÊ'8ÿÜ(8ÿÜ(8ÿÜ(8ÿÜ(8ÿÜ(8ÿÜ(8ÿÜ(µ¯§ºšÆÔæzÿpÿgÿ!_ÿ)Xÿ1 Rÿ9 MÿAIÿHEÿOBÿU@ÿ\=ÿb;ÿi9ÿp7ÿy5ÿ‚3ÿŒ2ÿ—0ÿ¡/ÿª/ÿµ.ÿ¿.ÿ¿.ÿ¿.ÿ¿.ÿ¿.ÿ¿.ÿ¿©µšÂŒÏÞvÿlÿbÿZÿSÿ$Mÿ+Gÿ3 Cÿ: ?ÿA ;ÿG 8ÿM 5ÿS3ÿX1ÿ^/ÿd-ÿk+ÿs)ÿ|'ÿ†%ÿ$ÿ™#ÿ£"ÿ«"ÿ«"ÿ«"ÿ«"ÿ«"ÿ«"ÿ«œ¾Ë~Úpægÿ]ÿ TÿMÿGÿAÿ$<ÿ+7ÿ24ÿ80ÿ=-ÿC*ÿH (ÿM &ÿR $ÿW "ÿ] ÿc ÿk ÿs ÿ| ÿ„ ÿŽ ÿ• ÿ• ÿ• ÿ• ÿ• ÿ• ÿ• ÿR%ÿM/ÿQ2ÿW5ÿZ< ÿ[EÿZOÿY]ÿXmÿV{ÿU‰"ÿS•%ÿR 'ÿQ¨)ÿP±*ÿP¸+ÿOÁ,ÿOÊ-ÿNÖ.ÿNä.ÿNí/ÿNó/ÿMø0ÿMü0ÿLÿ0üLÿ0ùLÿ/øLÿ/øLÿ/øLÿ/øLÿ/øLÿ/øLÿ/ÿS$ÿM/ÿT0ÿY4ÿ]: ÿ_Cÿ^Nÿ]Zÿ[jÿZy!ÿX†$ÿV’'ÿU)ÿT¦+ÿS®-ÿR¶.ÿR¾/ÿQÇ0ÿQÒ1ÿPá2ÿPë2ÿOò3ÿO÷3ÿNü4ûNÿ4øMÿ4õNÿ2ôNÿ2ôNÿ2ôNÿ2ôNÿ2ôNÿ2ôNÿ2ÿS$ÿN.ÿV/ÿ\2ÿ`8 ÿbAÿbLÿ`Xÿ_hÿ]v"ÿ[ƒ&ÿY)ÿXš,ÿV£.ÿU¬0ÿU³1ÿT»3ÿSÄ4ÿSÎ5ÿRÞ6ÿRé7ÿQñ7ÿQö8ûPû8÷Oÿ8ôOÿ7ñPÿ5ðPÿ4ðPÿ4ðPÿ4ðPÿ4ðPÿ4ðPÿ4ÿT#ÿP-ÿY-ÿ_0ÿc6 ÿf@ÿfJÿeUÿceÿas#ÿ^€(ÿ\Œ,ÿ[—/ÿY¡1ÿX©4ÿW°5ÿV¸7ÿUÁ8ÿUË9ÿTÚ:ÿTç;ÿSð<ûRö=öQû=òQÿ=ïRÿ;ìRÿ8ëRÿ8ëRÿ8ëRÿ8ëRÿ8ëRÿ8ëRÿ8ÿU#ÿR+ÿ\+ÿc.ÿg4 ÿj>ÿkHÿjSÿhaÿfp%ÿc}*ÿ`ˆ/ÿ^“3ÿ\6ÿ[¥8ÿZ­:ÿXµ<ÿW½>ÿWÇ?ÿVÓAüUäBùUîCõTöDðSüDìTÿAéUÿ?æUÿ<åUÿ;åUÿ;åUÿ;åUÿ;åUÿ;åUÿ;ÿV"ÿU)ÿ_(ÿg+ÿl2 ÿo< ÿpFÿpPÿn] ÿkk'ÿhy-ÿe„2ÿb7ÿ`™;þ^¡>ý\©Aû[±CúY¹EùXÂG÷WÎHõVàJñVìKîUöLéVüJåWÿFâXÿCÞYÿ@ÝYÿ?ÝYÿ?ÝYÿ?ÝYÿ?ÝYÿ?ÝYÿ?ÿW"ÿY'ÿc&ÿk(ÿq0ÿt9 ÿuCÿuMÿuY!ÿqg)ÿmt0ýj€6úfŠ<øc”@öaœDô^¤Hò\¬Kñ[´MïY½PíXÉRëWÚSçVéUäWõTáYýOÛZÿKÕ[ÿHÐ\ÿDÏ\ÿDÏ\ÿDÏ\ÿDÏ\ÿDÏ\ÿDÏ\ÿDÿX"ÿ\$ÿf#ÿo&ÿv.ÿz7 ÿ{Aÿ{Kÿ{U!þwc*ùso2ön{:òj…AïfGìc—Lê`ŸPè]§Tå[¯WãY¸ZáWÃ]ßWÒ^ÚVæ^ÖYóZÒ\üUÍ^ÿPÉ^ÿLÅ_ÿIÄ_ÿHÄ_ÿHÄ_ÿHÄ_ÿHÄ_ÿHÄ_ÿHÿY!ÿ_"ÿj!ÿt$ÿ{,ÿ5 ÿ>ÿ‚Hý‚R!÷~_+òyk5ísu>én€Fåi‰Máe‘TÞa™YÚ_¢\Ö]ª_Ó\³aÐ[¾bÎ[ÌcËZâcÈ\ñ`Æ_úZÁ`þU½aÿQºbÿM¹bÿK¹bÿK¹bÿK¹bÿK¹bÿK¹bÿKÿY!ÿb ÿnÿx#ÿ+ÿ„3 ÿ‡<þˆE÷ˆN!ð„[+ê~f6äxpAßrzKÙmƒRÓiŒXÏf•\Ìd_Éb¥bÆ`®dÃ_¸fÁ^Äg¿^Øh¼_ëfºc÷_¶dûY³eþU°eÿP¯eÿO¯eÿO¯eÿO¯eÿO¯eÿO¯eÿOÿZ ÿeÿqÿ|"ÿ„)ÿ‰1 ÿŒ:ùŽCñŽL êŠX+ã„b7Û~lCÓxvLÍsSÈo‡YÄk^Ài˜b½f eºe¨h·c²jµb¾k³bÎl°båk¯fôd¬gø]©hüX§iÿS¦iÿR¦iÿR¦iÿR¦iÿR¦iÿR¦iÿRÿ[ ÿgÿtÿ ÿˆ'ÿŽ/ý’7 ô”@ì•IäU*ÛŠ_7Ñ„iCÊ}rLÄx{T¿tƒZºq‹_¶n“d³k›g¯i¤j­g­lªf¸n¨fÇo¥fßo¥jñh¢köa lù[žlýVžlþUžlþUžlþUžlþUžlþUžlþUÿ\ÿjÿwÿƒÿŒ%ÿ’-ù—5 ï™>ç›FÞ–R)Ò\7ʉfBÃoL¼~wT·y[²u‡`®reªp—h¦mŸl£l©n k´pžjÂqœj×qœnîkšoód™oø^—püX—pýW—pýW—pýW—pýW—pýW—pýWÿ^ÿlÿzÿ†ÿ#ÿ–+õ›3 ëŸ;â E×›P(Ì”Z6ÄcB¼ˆlLµ‚tT°~|[«z„`¦w‹e¢t“ižrœm›p¥p˜o°r•n½s“oÐs”rën“sòf’sö`súZsûYsûYsûYsûYsûYsûYÿ_ÿnÿ}ÿ‰ÿ’"ýš)ñ 0ç¤9 Þ¥CÑŸN'ǘX5¾’aA¶ŒiK¯‡qT©‚y[¤€`Ÿ|ˆe›yj—v™m“u¢qs¬ssºt‹sËuŒvçpŒwðh‹wõbŠwù\ŠwúZŠwúZŠwúZŠwúZŠwúZŠwúZÿaÿqÿÿ‹ÿ• ùž&í¤.ã©6 Ø©@Ì£L&œV4¹–_@±gJª‹oS¤‡vZžƒ~`™€…e”}j{–nŒyŸq‰xªt†w¶u„wÇv…zär†{ïj…{ôd…{ø]…{ù\…{ù\…{ù\…{ù\…{ù\…{ù\ÿcÿsÿÿŽÿ™ö¡#ê©*à¯2Ò¬>ǦK$½ U3´š^?¬•eJ¥mRžŒtY˜ˆ{`“…ƒeŽ‚‹jŠ€“n†~q‚}§t|´v}|Åv}~àsîkóe~÷^~ø]~ø]~ø]~ø]~ø]~ø]ÿeÿuÿ„ÿ‘ÿœò¥ æ®&Û´.ί=êI#¹¤S1¯ž\>§™dI ”kQ™rY“y_ŽŠ€d‰‡ˆi„…‘n€ƒšq|‚¥ty²vwÂvv‚Ýty„ílyƒòfz‚÷_z‚ø^z‚ø^z‚ø^z‚ø^z‚ø^z‚ø^ÿgÿwÿ‡ÿ”þŸîªâ³!Õ·*ɳ;¾®H"´¨R0«£Z=¢žbG›™iP”•pXŽ’w^ˆ~dƒ†i~‹my‰˜qv‡£sr†¯up†¿vo‡×us‰ímsˆòft‡ö`t‡÷_t‡÷_t‡÷_t‡÷_t‡÷_t‡÷_ÿiÿzÿŠÿ—ù£ê®ݹϺ(Ä·9¹²F ¯¬P/¦§X;£`F•ŸgOŽ›nVˆ˜u]‚•|c}“„hx‘Œls–poŽ rl­tj½uiÒulímmŽñgnŒö`nŒ÷_nŒ÷_nŒ÷_nŒ÷_nŒ÷_nŒ÷_ÿlÿ}ÿÿ›ô¨åµ Õ¿ʾ&¿»7´¶Dª±N-¡­W9˜©^D¥eM‰¢lU‚Ÿs[|œzawšfr˜Šjm–”ni•žqf”«sc”ºsb•Ïsf—ìlg•ñfh“ö`h’÷_h’÷_h’÷_h’÷_h’÷_h’÷_ÿoÿÿ‘ò  Ú­ Ó¸ ÎÃÄÂ#¹¿5¯»B¤·L*›³U7’¯\AЬcJƒ©jR|¦qYv¤x^p¢ck ˆggž‘kcn_©p]¹p\Íp_Ÿëkaòebšö`b™÷^b™÷^b™÷^b™÷^b™÷^b™÷^ÿsÿ… ú– Û¥ѱË»ÆÇ ½Ç ²Å2 ¨Á@ž¾J'”ºS4‹¶Z>ƒ´aG|±hOu¯oUo­vZj«}_e©†ca¨g]§›jY§¨kW§¸lV§ÌlX¨éhZ§ôc[£ø^\£ù]\£ù]\£ù]\£ù]\£ù]\£ù]ÿx ÿ‹ ߜҩɴ¾¼ÌµÍ«Ë/ ¡È=—ÅH#ÂQ/„¿X:|¼_CuºfJo¸mPi·tUdµ|Z_´…^[³aW³šdT²§eR²·fQ³ÌfR³écT²÷_U®ú[V­ûZV­ûZV­ûZV­ûZV­ûZV­ûZÿ~ ò‘Ö¡Ê­À·¸Â²Ï «Ô£Ó+™Ð:ÎE…ËN*}ÉV4uÇ]=nÅeDhÄlIcÂsN^Á{SYÁ„VUÀYR¿›\O¿¨]M¿¸^LÀÍ^LÀê\N¿ùYO¼þUPºþUPºþUPºþUPºþUPºþUPºþUÿ…ݘͦÁ±·º®Æ§Ó  Ý™Ý(Û7†ÙB}ÖK$uÔT-mÒ\5gÑcü«*=ü¹+;ýË+;ýâ+:üô+:ü÷+:ü÷+:ü÷+:ü÷+:ü÷+:ü÷+½¨®°¡¼•ȉÔ~èwÿoÿgÿ&`ÿ/Yÿ7 Tÿ?OÿGKÿNGÿVDÿ]Bÿd@ÿl=ÿu;ÿ~9ÿ‰7ÿ”6ÿ 5ÿ¬3ÿ¹3ÿÈ2ÿâ 2ÿç 2ÿç 2ÿç 2ÿç 2ÿç 2ÿç °­¢·•ćÐ{Ýrý jÿaÿZÿ"Tÿ*Nÿ2Iÿ: EÿA AÿH >ÿN;ÿU8ÿ[6ÿb4ÿi2ÿr/ÿ{-ÿ†+ÿ’*ÿž)ÿ©(ÿ³'ÿÂ'ÿÇ'ÿÇ'ÿÇ'ÿÇ'ÿÇ'ÿǤ´–À‡ÌzÚmëdÿ\ÿTÿMÿHÿ$Bÿ,>ÿ3:ÿ96ÿ@3ÿE0ÿK .ÿQ +ÿW )ÿ] 'ÿd $ÿl "ÿv ÿ€ ÿŒÿ—ÿ¡ÿ¬ÿ®ÿ®ÿ®ÿ®ÿ®ÿ®—¼ˆÉyÖkã_öVÿNÿ GÿAÿ<ÿ7ÿ$2ÿ*/ÿ0+ÿ6'ÿ;%ÿ@"ÿE ÿJÿPÿVÿ\ÿdÿmÿwÿ ÿ‹ ÿ• ÿ˜ ÿ˜ ÿ˜ ÿ˜ ÿ˜ ÿ˜ ÿI'ÿD1ÿK1ÿP4ÿR:ÿRC ÿQNÿO\ÿMkÿLyÿK‡ÿI“ÿHÿH¦ ÿG®!ÿGµ"ÿF½#ÿFÆ#ÿFÐ$ÿFà$ÿFê%ÿFó%ÿFú%ÿFÿ%ÿFÿ%ÿFÿ%ÿFÿ$ýFÿ#ýFÿ#ýFÿ#ýFÿ#ýFÿ#ýFÿ#ÿI'ÿF/ÿM/ÿR2ÿU9ÿUB ÿTMÿRYÿPhÿOwÿN„ÿL‘ÿK›!ÿJ¤"ÿJ¬#ÿI³$ÿI»%ÿHÄ&ÿHÍ&ÿHÝ'ÿHè'ÿHñ(ÿHù(ÿHÿ(ÿHÿ(þHÿ(ûHÿ'ùHÿ&ùHÿ&ùHÿ&ùHÿ&ùHÿ&ùHÿ&ÿJ'ÿH-ÿP-ÿU0ÿX6ÿY@ ÿXKÿUVÿTfÿRtÿQÿOŽ!ÿN˜#ÿM¡%ÿM©&ÿL±'ÿK¸(ÿKÁ)ÿKÊ*ÿJÙ*ÿJæ+ÿJð+ÿJø,ÿJÿ,ýJÿ,úJÿ+÷Jÿ)õJÿ(õJÿ(õJÿ(õJÿ(õJÿ(õJÿ(ÿK&ÿK+ÿR+ÿX.ÿ[4ÿ]> ÿ]IÿZTÿYbÿWqÿU~ ÿSŠ#ÿR•&ÿQž(ÿP¦*ÿO®+ÿNµ,ÿN½-ÿMÇ.ÿMÓ/ÿLã0ÿLí0üLö1úLþ1÷Lÿ1õMÿ/òMÿ-ðMÿ+ðMÿ+ðMÿ+ðMÿ+ðMÿ+ðMÿ+ÿK&ÿN)ÿV)ÿ\+ÿ`1ÿb; ÿbFÿ`Qÿ^_ÿ\mÿZz#ÿX†&ÿV‘)ÿUš,ÿS¢.ÿRª0ÿQ±1ÿQ¹3ÿPÃ4þOÎ5ûOß6øNë7õNõ8òNý8ðOÿ5îPÿ3ëQÿ1éQÿ/éQÿ/éQÿ/éQÿ/éQÿ/éQÿ/ÿL%ÿQ'ÿZ&ÿ`(ÿe/ÿh9 ÿhCÿgNÿeZÿbh ÿ_v%ÿ]*ÿZŒ.þX–1üWž4ûU¦6ùT­8øSµ:÷R¾;õQÉ=óQÚ>ðPè?ìPó@éQý>èSÿ;æTÿ8ãUÿ5áUÿ3áUÿ3áUÿ3áUÿ3áUÿ3áUÿ3ÿM$ÿT$ÿ]#ÿe%ÿj-ÿm6 ÿn@ÿmKÿkVÿhd!þeq(ûb}-ø_‡2ö\‘6óZ™:òX¡=ðW©@îU±BìT¹DëSÄFéRÒHåQåIâRòHßTüDÝVÿ@ÛXÿ=ÖYÿ:ÒYÿ8ÒYÿ8ÒYÿ8ÒYÿ8ÒYÿ8ÒYÿ8ÿN$ÿX!ÿa ÿj#ÿp+ÿs4 ÿt>ÿtHÿrRûo_#ökl*ògw1ïc‚7ì`‹=é]”AæZœEäX¤IâV¬LàT´NÝT¿PÛTÍP×SâQÒTðNÐWûJÎZÿEÍ\ÿBÉ\ÿ>Å\ÿ<Å\ÿ<Å\ÿ<Å\ÿ<Å\ÿ<Å\ÿ<ÿO#ÿ[ÿeÿn!ÿu)ÿy1ÿz; ÿzDúyNôv[#îqg,élr5åh|<ác…CÝ`ŽHÙ]—LÕ\ŸOÒZ§QÏY°SÍXºTËXÆUÉWÚVÅWìUÃ[ùOÂ^ÿJÀ_ÿF½`ÿBº`ÿ@º`ÿ@º`ÿ@º`ÿ@º`ÿ@º`ÿ@ÿR!ÿ^ÿiÿsÿz&ÿ~/ÿ8 ûAó€Kì|W#æwc-àqm8Úmw@Ói€FÏe‰KËc‘OÈ`™RÅ_¡UÂ]ªWÀ\³Y¾\¿Z¼[Î[¸[å[·^õU·bÿOµcÿJ²dÿF°dÿC°dÿC°dÿC°dÿC°dÿC°dÿCÿUÿaÿmÿwÿ~$ÿ„,þ‡5 õˆ>í‡HåƒT"Þ~_.Ôxi8Îss@Én|GÄk„LÀhŒQ½e”TºcœW·b¥Z´`®\²`¹^°_Ç^­_ß_¬bñY¬eþSªgÿN¨gÿJ¦gÿF¦gÿF¦gÿF¦gÿF¦gÿF¦gÿFÿWÿdÿpÿ{ÿƒ"ÿ‰*ùŒ2ïŽ; çŽDÞŠQ!Ô„\-Ì~f8ÅxoAÀtwH»p€M·mˆR³jV°h˜Y¬f \ªe©_§d´`¥cÂa£cÕb¢eí]¢iûW¡jÿQŸkÿLžkÿIžkÿIžkÿIžkÿIžkÿIžkÿIÿYÿgÿsÿ~ÿ‡ ÿ'ô’/ê”8 á”BÖN ̉Y-Ńc7¾}k@¸ytH³u|N®r„SªoŒW§m”[£kœ^ i¥`žh°c›g½d™gÎd˜ièašmùZ™nÿT—nÿO–nÿK–nÿK–nÿK–nÿK–nÿK–nÿKÿ[ÿiÿvÿÿŠü‘$ð—,åš4Üš?Ï”LÆŽW,¾ˆ`7·‚i@±~qH¬zyN§w€S£tˆXŸq\›o˜_˜m¡b•l¬d“l¹f‘kÉfmäd‘qö\‘rþVrÿQrÿMrÿMrÿMrÿMrÿMrÿMÿ]ÿkÿyÿ„ÿŽø•!ë›(á 0Õž=ʘJÁ’T+¹Œ^6±‡f?«‚nG¦~vN¡{}Sœx…X˜v\”t•_‘ržcŽq©e‹pµg‰pÅgˆpàfŠtô^‹vüXŠvÿR‰vÿN‰vÿN‰vÿN‰vÿN‰vÿN‰vÿNÿ_ÿnÿ{ÿ‡ÿ‘ô™ç #Ý¥+Ï¡;ÅœH¼–S*´\5¬‹d?¦‡lG ƒsM›€zS–}‚W’zŠ\Žx’`Švœc‡u¦f„t²h‚tÂh€tÛhƒxò`„zûY„yÿT„yÿO„yÿO„yÿO„yÿO„yÿO„yÿOÿaÿpÿ~ÿŠÿ”ðã¥ר(Ë¥9ÁŸF·šQ)¯•Z4§b>¡‹jF›‡qL•„xRWŒ‡\ˆ}`„{™c€z£f}y°h{y¿izyÖi||ða~~úZ~}þU~}ÿQ~}ÿQ~}ÿQ~}ÿQ~}ÿQ~}ÿQÿcÿrÿÿü˜ì¡ߪѬ&Ǩ7 ¼£D³žO'ª™X3£”`=œhE–ŒoL‰vR‹†}W†„…[‚‚Ž_~€—cz¡fw~­hu~½is~Òivîbx‚ú[x‚þVyÿQyÿQyÿQyÿQyÿQyÿQÿeÿuÿƒÿõ›è¦Ù¯̯$«5 ¸§C®¢N&¦V1ž™^;—•fD‘mK‹ŽtQ†Œ{V‰ƒ[|‡‹_x†•bt„Ÿeqƒ«hnƒºimƒÎio†ëcr‡ù\s†ýVs…ÿRs…ÿRs…ÿRs…ÿRs…ÿRs…ÿRÿhÿx ÿ† ö“ Þ  Ö© Ò² Dz"½¯3 ³«Aª§L$¡¢U0™ž]:’šdB‹—kI…”rP€’yU{Zv‰^rŒ’bnŠek‰©gh‰¸hg‰Ëhi‹éclù\mŒýWmŠÿRmŠÿRmŠÿRmŠÿRmŠÿRmŠÿRÿkÿ{ ÿŠ â˜Ö£Ь ˵ Á¶¸´1 ®°?¤¬J"œ¨S.”¤[8Œ b@†žiH€›pNz™wSu–~Xp”‡\l“`h’›cd‘§eb¶f`‘Éfb’çbe”ø\g’ýWg‘ÿRg‘ÿRg‘ÿRg‘ÿRg‘ÿRg‘ÿRÿnÿ ñŽÙ›ϦɯĹ»º²¸/¨µ=Ÿ±H –®Q+ŽªY5†§`>€¥gEz¢nKt uQož|Ujœ…Yf›Ž]bš™`^™¦b\™´cZ™Çc[šå`_›÷[`šþVa˜ÿRa˜ÿRa˜ÿRa˜ÿRa˜ÿRa˜ÿRÿr ÿƒß“ÑŸɪÁ²»½´¿«¾,¢»:™¸EµO(‡²W2€¯^:y­eBs«lHn©sMi§zQd¦ƒV_¤Y\£˜\X£¤^V£³_U£Æ_U¤ä]X¤öXZ£ÿT[¡ÿP[¡ÿP[¡ÿP[¡ÿP[¡ÿP[¡ÿPÿwð‰Ö˜Ë¤Á­¹¶²À«Å£Å(›Â7‘ÀC‰½L$€ºU.y¸\6r¶c=m´jCg³qHb±yL^°PZ¯‹TV¯—VS®£XP®²YO®ÆYO®äXQ®öTS®ÿPT¬ÿMT¬ÿMT¬ÿMT¬ÿMT¬ÿMT¬ÿMÿ}ßÎè¹°°º¨Ä¡Ì›Ì#’Ê3 ‰È?ÆIyÄR(rÂZ0kÁa7f¿hëÀ.=ìÛ.=êï.=èü.=çÿ-=çÿ-=çÿ-=çÿ-=çÿ-=çÿ-ÅŸµ©¨±œ¼Ç„Òzßtômô fô*_ô4Zõ= TõEOõLLõUIö]FöeDönAöw?÷=÷;÷™ 9ø¦!8øµ"7ùÈ"6ùã"6øó"6÷ü"6÷ü"6÷ü"6÷ü"6÷ü"6÷ü"·¦©®œ¹ÄƒÏwÛoö gÿ`ÿZÿ'Tÿ0Oÿ8Jÿ@ FÿH CÿO@ÿV=ÿ^;ÿe8ÿn6ÿw4ÿ‚2ÿ0ÿ›/ÿ©.ÿ·-ÿÈ,ÿá,ÿï,ÿï,ÿï,ÿï,ÿï,ÿï««žµÁ‚ÌuÙiäaÿ [ÿTÿNÿ"Iÿ+Dÿ2@ÿ:<ÿA9ÿG6ÿN 3ÿT 1ÿ[ .ÿb ,ÿk )ÿu 'ÿ€%ÿ$ÿš#ÿ¦"ÿ³!ÿÁ!ÿÐ!ÿÐ!ÿÐ!ÿÐ!ÿÐ!ÿП²‘¾ƒÊuÖgâ[ñTÿNÿHÿBÿ=ÿ$9ÿ+5ÿ21ÿ8.ÿ>+ÿC(ÿI%ÿO#ÿV!ÿ]ÿeÿoÿz ÿ‡ ÿ” ÿŸ ÿª ÿ³ ÿ³ ÿ³ ÿ³ ÿ³ ÿ³ “»„ÇuÓgáXèNûHÿAÿ ;ÿ6ÿ1ÿ-ÿ")ÿ(%ÿ-"ÿ2ÿ8ÿ=ÿBÿHÿNÿUÿ]ÿg ÿr ÿ} ÿ‰ ÿ“ ÿœ ÿœ ÿœ ÿœ ÿœ ÿœÿ?*ÿ?0ÿD0ÿH3ÿI9ÿHBÿFM ÿE[ÿCiÿAwÿ@…ÿ?‘ÿ>›ÿ>¤ÿ=«ÿ=³ÿ=ºÿ=Ãÿ<Ìÿ<Ûÿ<çÿ<ðÿ<øÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ=ÿÿ@*ÿA.ÿG.ÿJ1ÿL7ÿK@ÿJK ÿHYÿFgÿDuÿC‚ÿBÿA™ÿA¢ÿ@©ÿ@±ÿ?¸ÿ?Àÿ?Éÿ?Öÿ?åÿ?ïÿ?÷ÿ?þÿ?ÿÿ?ÿÿ@ÿþ@ÿþ@ÿþ@ÿþ@ÿþ@ÿþ@ÿÿ@*ÿC,ÿI,ÿM/ÿO5ÿP>ÿNI ÿLVÿJdÿHrÿGÿF‹ÿE–ÿDŸÿD§ÿC®ÿCµÿB½ÿBÆ ÿBÑ ÿBâ!ÿBí!ÿBõ!ÿBý!ýBÿ!ûCÿ úCÿùCÿùCÿùCÿùCÿùCÿùCÿÿA)ÿF*ÿL)ÿQ,ÿS2ÿT<ÿTG ÿQRÿO`ÿMoÿL|ÿJˆÿI’ÿH›ÿG£!ÿG«"ÿF²#ÿFº#ÿFÃ$ÿEÍ%ÿEÞ%ÿEê&üEô&ùEü&öEÿ&õFÿ$ôFÿ#óGÿ!óGÿ!óGÿ!óGÿ!óGÿ!óGÿ!ÿB(ÿI'ÿP&ÿU(ÿX/ÿZ9ÿZD ÿWOÿU\ÿSjÿQwÿOƒÿNŽ!ÿM—#ÿLŸ%ÿK§&ÿJ®'ÿJ¶)þI¾*ýIÉ*úHÙ+÷Hç,ôHò,ñHû,ïIÿ*íJÿ(ìJÿ'ëKÿ%ëLÿ%ëLÿ%ëLÿ%ëLÿ%ëLÿ%ÿC(ÿM$ÿT#ÿZ%ÿ^,ÿ`6ÿ`A ÿ^Lÿ[WÿYfÿWrÿU~"þS‰%üQ“(úP›*ùO£,÷Nª.öM²/ôLº0óLÄ2òKÑ3îKä4êJð4çKú3åMÿ0äNÿ-âOÿ+áPÿ)áPÿ)áPÿ)áPÿ)áPÿ)áPÿ)ÿF%ÿP!ÿX ÿ_!ÿd*ÿf3ÿf= ÿeHÿbSÿ`aü]m øZy%õX„)óV-ðT–0îRž3íQ¥5ëP­7éNµ9çN¿;æMÌ<ãLà=ßMî<ÜOù9ÙQÿ5ÖRÿ2ÔSÿ0ÓTÿ-ÓUÿ-ÓUÿ-ÓUÿ-ÓUÿ-ÓUÿ-ÿJ#ÿTÿ\ÿdÿi'ÿl0ÿm: ÿlDýjOøg\óch"ï`t(ë]~.èZˆ3åW‘7ãU™:àS >ÞR¨@ÜQ±AÙP»BÖPÈCÓPÜDÏPìCÌRø?ËUÿ;ÉWÿ7ÈXÿ4ÇYÿ2ÆYÿ1ÆYÿ1ÆYÿ1ÆYÿ1ÆYÿ1ÿM ÿWÿ`ÿiÿo%ÿr-ÿt7ýsAöqKðnXêjd$åen+àay3Ü^‚8Ø\‹<ÓZ”?ÐXœBÎW£DËU¬FÉUµGÇTÀIÅTÐIÂSæIÀVõE¾Yÿ@½[ÿ<¼\ÿ9»]ÿ5º]ÿ5º]ÿ5º]ÿ5º]ÿ5º]ÿ5ÿPÿ[ÿdÿmÿt"ÿx*ÿz3öz= ïxGçuTáp_%Úkj-Ógt4Îd}:Êa†?Ç_ŽBÄ]–EÁ[žH¿Z¦J¼Y¯LºXºM¸XÈN¶XßN´YðK³\ýE²_ÿ@²`ÿ<°aÿ9°aÿ8°aÿ8°aÿ8°aÿ8°aÿ8ÿRÿ^ÿhÿrÿyÿ~'ù€0ð9 ç€Cà|PÖw[$Ïrf.Émo5Äjx;Àg@¼d‰D¹b‘H¶`™J³_¡M±]ªO®\´Q¬\ÁRª\ÔR¨]ëP¨`úI¨cÿD¨dÿ@¦eÿ<¦eÿ;¦eÿ;¦eÿ;¦eÿ;¦eÿ;ÿUÿaÿlÿvÿ}ÿƒ#ô†,êˆ5á‡@Ö‚LÍ}X$Æwb-Àsk5»ot<·l|A³i„F¯gŒI¬e”L©cœO¦b¥Q¤a¯S¢`¼U `ÍUž`æTžd÷MŸgÿGŸiÿCžiÿ?iÿ=iÿ=iÿ=iÿ=iÿ=ÿWÿcÿoÿyÿû‡ ïŒ'äŽ0Ú= χJÇ‚U#¿}_-¹xh5³tp<¯qxB«n€F§lˆJ¤iN h˜Qf¡S›e«U˜d¸W–dÈX”dáX•hôP–kÿJ—lÿE–mÿA–mÿ@–mÿ@–mÿ@–mÿ@–mÿ@ÿYÿfÿrÿ}ÿ…öŒê‘"ß”+Ó‘: ÉŒGÀ‡S"¹‚\,²}e5­ym<¨uuB£s}G p„KœnŒN™l•R•kžT’i¨Wi´YŽhÃYŒhÜZlòSnÿLpÿGqÿCqÿAqÿAqÿAqÿAqÿAÿ[ÿhÿuÿ€ÿ‰òå–Ù™&Í•8 ÄE»‹Q!³†Z,­‚c4§~k;¡zrAwzF™uK•s‰O’q‘RŽo›U‹n¥Xˆm°Z†l¿[„mÕ[†oïUˆrýN‰tÿI‰tÿDˆtÿCˆtÿCˆtÿCˆtÿCˆtÿCÿ]ÿkÿxÿƒýŒí”àšÓœ$È™6 ¿”C¶O ®ŠX+§†a3¡‚h;œpA—|wF“y~Kw†O‹uRˆs˜V„r¢Xq®Zq¼\}qÐ\sìVvûOƒxÿJƒxÿE‚xÿD‚xÿD‚xÿD‚xÿD‚xÿDÿ_ÿm ÿz ÿ… ò ç˜ ÛŸΟ"Ä4º˜B²“MªV*£Š_2œ†f:—ƒm@’€uE~|J‰|„N…zŒR‚x•V~w Y{v«[yuº\wvÍ\xwêX{zúQ}|ÿK}|ÿF}|ÿE}|ÿE}|ÿE}|ÿE}|ÿEÿaÿo ÿ} õˆ ߓ؛ Ó¢ É£¿ 2¶œ@­—K¥“T(ž]1˜‹d9’ˆk?…rEˆƒzJ„€N€ŠR|}“Ux|Xu{©[rz¸\qzÊ\r|èXu~ùQw€ÿLw€ÿGw€ÿFw€ÿFw€ÿFw€ÿFw€ÿFÿdÿr ÿåŒØ–Ñž Î¥ Ħº¤/± >¨œI ˜S'™”[0“b8i>ˆŠpDƒˆxI~†Mz„ˆQv‚‘Ur›Xo€§Zlµ\k€È\kåYnƒ÷Rq„ÿMr„ÿHr„ÿGr„ÿGr„ÿGr„ÿGr„ÿGÿf ÿuöƒÜҘ̡Ȩ¿©µ¨-¬¤<¤ GœQ%”™Y/Ž–`6ˆ“g=‚nC}ŽvHyŒ}LtŠ…PpˆTl‡™Wi†¥Yf†³[e†Å[e†ãYhˆöRkŠÿMlŠÿHl‰ÿGl‰ÿGl‰ÿGl‰ÿGl‰ÿGÿi ÿxå‡Ö’ÍœƤÁ«¹­°¬+§©:Ÿ¦E–¢O#ŸW-ˆœ_5‚™f;}—lAx•sFs“{Kn‘ƒOjRfŽ—Uc£X`±Y_ÃZ^àXbõRdÿMfÿHfÿGfÿGfÿGfÿGfÿGÿlþ|ފЖÈŸÀ§¹®²²ª±(¡¯7 ™¬C‘¨M!‰¥U*‚£\2| c9wžj>rœqDmšyHh™Ld—‹P`–•S]–¢UZ•°WY•ÁWX•ÞV[–óP]—ÿL_—ÿG`–ÿF`–ÿF`–ÿF`–ÿF`–ÿFÿpëÖÊšÁ£¹ª±²ª·£·$›µ4 “²@НJƒ­S'|«Z.v¨a5p§h;k¥o@g£wDb¢H^¡‰LZ ”OWŸ QTŸ®SSŸÀSRŸÝRUŸóNW ÿJY ÿFYŸÿEYŸÿEYŸÿEYŸÿEYŸÿEÿuà†Ï“ÄŸº§±®©¶¡½ ›½ ”¼1‹º=ƒ·H|µP"u³X*o²_0j°f6e¯m;`­u?\¬~CX«‡GUª“JQªŸLOª®MMªÀMMªÜMNªòIPªþFR©ÿCR©ÿBR©ÿBR©ÿBR©ÿBR©ÿBò|׌ș½£²«©² »—Ä ’Å‹Ä,ƒÂ: {ÁDt¿Nn½V$h¼]*c»d0_ºl4Z¹t9V¸|K´ÿ=K´ÿ=K´ÿ=K´ÿ=K´ÿ=âƒÍ’ÁŸ´§ª¯ ¸–ÀŒÊ†ÍÍ&zÌ5sËAlÊJfÉSaÈ[#\Çb(XÆj,TÆr0PÅ|3Mņ6JÄ’9GÄŸ;EÄ®å›#<åª$;æ¼$:æÓ$9åî$9ãú#9âÿ$9âÿ$9âÿ$9âÿ$9âÿ$9âÿ$¿ž¯¦£®—¸ŠÂ~ÌsÖiå dï_ð Yð+Tð5Oð>KñF GñN DñWBñ_?òg=òp:ò{8ó‡6ó”5ô¢3ô±2õÅ1õâ1ôñ1ñþ1ñÿ1ñÿ1ñÿ1ñÿ1ñÿ²¤¥«˜¶‹À~ÊqÕeÞ^õ YüSüNü'Jý0Eý9Aý@>þH;þO 8ÿW 6ÿ^ 3ÿg 1ÿp .ÿ|,ÿ‰+ÿ–)ÿ¤(ÿ´'ÿÇ'ÿá&ÿò&ÿö&ÿö&ÿö&ÿö&ÿö§©™³‹¾~ÉpÓdÞXçRÿ MÿGÿCÿ">ÿ*:ÿ27ÿ93ÿ?0ÿF-ÿM+ÿT(ÿ[&ÿc#ÿm!ÿy ÿ‡ ÿ• ÿ£ ÿ± ÿÀ ÿÖ ÿß ÿß ÿß ÿß ÿß ›±¼~ÇpÒcÞUäKõFÿ@ÿ;ÿ7ÿ3ÿ#/ÿ)+ÿ0(ÿ5%ÿ;"ÿAÿGÿNÿUÿ^ÿhÿtÿ‚ÿÿÿ©ÿµÿºÿºÿºÿºÿºŽºÅpÑbÞTåFë?þ9ÿ4ÿ /ÿ+ÿ'ÿ#ÿ!ÿ%ÿ*ÿ/ÿ4ÿ:ÿ@ÿFÿN ÿV ÿ`ÿlÿxÿ†ÿ‘ÿÿ¡ÿ¡ÿ¡ÿ¡ÿ¡ÿ6-ÿ9.ÿ>.ÿ@2ÿ@8ÿ>Aÿÿ@Jÿ>W ÿ*ÿC*ÿF-ÿG2ÿF<ÿEHÿCU ÿAb ÿ?pÿ=}ÿ<‰ÿ;“ÿ;œÿ:¤ÿ:«ÿ:²ÿ:¹ÿ9Âÿ9Ìÿ9Ýÿ9éÿ9óÿ:ûü:ÿú:ÿù:ÿø:ÿø:ÿø:ÿø:ÿø:ÿø:ÿÿ9+ÿA'ÿF'ÿJ)ÿK/ÿL9ÿKEÿHQ ÿF^ÿDlÿByÿA…ÿ@ÿ@˜ÿ? ÿ?§ÿ>®ÿ>¶ÿ>¾ÿ>Èÿ=Öþ=æû>ñø>úõ>ÿó>ÿò?ÿñ?ÿñ?ÿñ?ÿñ?ÿñ?ÿñ?ÿÿ=(ÿE$ÿJ#ÿN%ÿQ,ÿR6ÿQAÿOM ÿLZÿJgÿHtÿG€ÿF‹ÿE”ÿDœÿC¤þC«ýB²üBº úBÄ ùBÐ!öAâ!òBî"ïBù"íBÿ ëCÿêCÿéDÿèDÿèDÿèDÿèDÿèDÿÿ@%ÿH!ÿO ÿS!ÿW)ÿY3ÿX>ÿVI ÿRUÿQcÿOoþM{ûK†ùJ÷I˜!öHŸ"ôG¦$óG®%ñF¶&ðF¿'ïEË(ìEÞ)èEì)åFø(âGÿ&áHÿ$ßIÿ"ÞIÿ ÝIÿÝIÿÝIÿÝIÿÝIÿÿC"ÿLÿSÿYÿ]&ÿ_0ÿ_:ÿ]E ÿZPýX^øUjõSvòQ€!ïOŠ$íM“&ëLš)éK¢+çJ©,åI±.äH»/âHÇ1àHÙ1ÜHê1ØIö.ÔKÿ+ÒLÿ)ÐMÿ&ÏNÿ%ÎNÿ#ÎNÿ#ÎNÿ#ÎNÿ#ÎNÿ#ÿGÿPÿWÿ^ÿc#ÿf,ÿf6ÿdA úbLô_Yï\eëYp çV{%äT„)áQ-ÞP•0ÜO2ÙN¥3ÖM­5ÓM·6ÑLÂ7ÏLÑ8ÌLæ8ÉMô5ÇOÿ1ÅQÿ.ÄRÿ+ÃSÿ)ÂSÿ'ÂSÿ'ÂSÿ'ÂSÿ'ÂSÿ'ÿJÿTÿ\ÿcÿi ÿl)ÿm2ùl= òiGëfTåc`à_k"Û\u(ÖY-ÒWˆ0ÏU3ÌT˜6ÊS 8ÇR§:ÅQ°;ÃP»<ÁPÉ=¿Pß=¼Qð;ºSü7¹Uÿ3¸Wÿ/·Xÿ-·Xÿ+·Xÿ+·Xÿ+·Xÿ+·Xÿ+ÿMÿWÿ`ÿhÿnÿr%ûs.òs8éqC ânPÛi\Óef$Îbp*É_z/Æ\‚3Ã[Š6ÀY’9½Xš;»V¢>¸U«?¶UµA´TÂB²TÔB°UêA®Wù<®Yÿ7­[ÿ3­\ÿ0­]ÿ.­]ÿ.­]ÿ.­]ÿ.­]ÿ.ÿPÿZÿdÿmÿsÿw!ôy)êz3âx? ÙtLÏpXÉkb$Ähl+¿eu0»b}5¸`…8µ^<²\•>¯[A­Z¦C«Y¯D©Y¼E§XÌF¤XåF¤[ö@£^ÿ;£_ÿ7£`ÿ3£aÿ1£aÿ1£aÿ1£aÿ1£aÿ1ÿSÿ]ÿhÿpÿwû|î$ä€-Ú;ÏzIÇuTÁq_$»mh+¶jp1²gy6¯e€:«cˆ=¨a@¦`˜C£^¡E ^«Gž]·Hœ]ÆIš\ßIš_òDšbÿ>šcÿ9›eÿ6›eÿ3›eÿ3›eÿ3›eÿ3›eÿ3ÿUÿ`ÿkÿtÿ{õè„Þ‡'Ñ„7ÈFÀ{Q¹v[#´re+¯om1ªlu6§j|:£h„> fŒAd”DšcG—b§I•a²K“aÁL‘aØL‘cïG’eýA’gÿ<“iÿ8“jÿ5“jÿ5“jÿ5“jÿ5“jÿ5ÿWÿc ÿn ÿwÿð…ã‰Ö‹#ˈ5„Cº€O³{Y#­wb*¨tj1£qq6Ÿny;œl?˜jˆB•i‘E’gšHf£Je¯LŠe½M‰eÑN‰gìJŠiûC‹kÿ>Œmÿ:Œnÿ7Œnÿ7Œnÿ7Œnÿ7Œnÿ7ÿYÿe ÿq ÿz ñ‚ è‰ ÝŽÏ Æ2½‰Aµ„M®€V"§|_*¢xg0uo6™sv:•q}?’o…BŽmŽF‹l–Iˆj K…j¬MƒiºOiÌOjèLƒmùE„oÿ?…pÿ;†qÿ8†qÿ8†qÿ8†qÿ8†qÿ8ÿ[ÿgÿsó}Þ†ÙŒ Õ‘ Ê’Á0¸?°ˆJ©„T!¢€])}e0˜zl5“ws:u{>Œs‚Bˆr‹F…p”I‚ožLn©N|m·O{mÉPznæM|qøF~sÿAtÿ=€uÿ:€uÿ:€uÿ:€uÿ:€uÿ:ÿ]ÿjÿvä€Ù‰ÒÏ” Å–¼”.³‘= «H¤ˆR ž…[(˜c/“~j5Ž|q9Šzx=†x€BƒvˆEu‘I|s›Lyr§NvrµPtrÆPtrãOvuöGxwÿBzxÿ>{yÿ:{yÿ:{yÿ:{yÿ:{yÿ:ÿ_ ÿlõyÞƒÓ‹Í’É—À™·˜,¯•; §‘GŸP™‰Y'“†a.Žƒh4‰o9…v=}~A}{†EyzIvx™Lsw¥Npw²PnwÄPmwàOpyõHr{ÿCt|ÿ>u}ÿ;u}ÿ;u}ÿ;u}ÿ;u}ÿ;ÿa ÿoè|نώȕڻœ³œ*ª™9 ¢•E›‘N”ŽW&Ž‹_-‰ˆf3„†m8€„t={‚{Aw€„EtHp}—Km|£Nj|°Oh|ÁPg|ÝPj~óIm€ÿCnÿ?oÿlBhŒ‰FeŠ“Ia‰ŸK^‰¬M]‰½N\‰ÖM^ŠðH`‹þCb‹ÿ?cŒÿ‹£H„ Q ~žY'xœ`-sšg2o˜n7j–u]“ÿ;]“ÿ;]“ÿ;]“ÿ;]“ÿ;ÿnà~΋ĕº±£©©¡® ›¯”®.Œ¬; …ªF~¨Nx¦V#r¤]*m¢d/i¡k4dŸs8`ž{<\…?YœBU›œES›ªGQ›ºGP›ÑGQ›îDS›ü@U›ÿΨ&<κ&<ÏÔ&<Íï%;Ìû%;Ëÿ%;Êÿ%;Êÿ%;Êÿ%;Êÿ%;Êÿ%Óµž¨¦®‘¶…¿yÇoÎdÖ ^Þ[Þ WÞ-Sß:PßDLßN IßW Fß_CßhAßq>ß|<߉:à–8à¥7à·6áÍ6ßì5Þù4Ýÿ4Üÿ4Üÿ4Üÿ4Üÿ4Üÿ¹œª¤ž«’µ…¾yÇmÏbÖXáUêQë Më+Ië5Eì>BìG?ìO=íX :í` 8íj 6ît 3î€2îŽ0ï.ï­-ðÀ-ðÞ,îñ,ìþ,ëÿ,ëÿ,ëÿ,ëÿ,ëÿ­¢ ©“³†½yÆlÏ`ØUÞNó J÷FøCø'?ø0;ù88ù@5úG3úO0ûW.û_+üi)üt'ü‚ %ý $ý  #þ° "þÄ !ÿà !ýò üü üü üü üü üü ¢§•±‡»yÆlÏ_ÙRßHèCÿ?ÿ;ÿ7ÿ!4ÿ)0ÿ0-ÿ7*ÿ>'ÿD%ÿK"ÿS ÿ\ÿfÿrÿ€ÿÿŸÿ¯ÿÀÿÖÿéÿéÿéÿéÿé—¯ˆºzÅlÏ^ÚPàDæ<õ7ÿ3ÿ /ÿ+ÿ(ÿ!%ÿ'!ÿ-ÿ2ÿ8ÿ?ÿFÿMÿVÿ`ÿl ÿ{ ÿ‹ ÿš ÿ¨ ÿµÿÂÿÂÿÂÿÂÿÂЏ{ÃlÎ^ÛOâBç6ì1ÿ,ÿ'ÿ#ÿ ÿÿÿÿ!ÿ&ÿ,ÿ1 ÿ7 ÿ>ÿFÿOÿYÿfÿtÿ‚ÿÿœÿ¦ÿ¦ÿ¦ÿ¦ÿ¦ÿ./ÿ3,ÿ7-ÿ80ÿ76ÿ4?ÿ1Kÿ/Xÿ,fÿ*t ÿ) ÿ( ÿ(— ÿ(Ÿ ÿ(¦ ÿ'­ ÿ'´ ÿ'» ÿ'Ä ÿ'Î ÿ(Þ ÿ(é ÿ(ó ÿ(û ÿ(ÿ ÿ)ÿ ÿ)ÿ ÿ)ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ0-ÿ6*ÿ9*ÿ;.ÿ:4ÿ8<ÿ6Iÿ3Vÿ1c ÿ/q ÿ-~ ÿ-Š ÿ,” ÿ,œ ÿ,¤ ÿ,« ÿ,± ÿ,¹ ÿ+Á ÿ,Ë ÿ,Ú ÿ,ç ÿ,ñ ÿ,ú ÿ,ÿ þ-ÿ ý-ÿ ý-ÿ ý,ÿ ý,ÿ ý,ÿ ý,ÿ ý,ÿ ÿ2+ÿ9(ÿ=(ÿ?*ÿ>0ÿ=:ÿ}ÿ=‡ÿ=‘þ<™ý< ü;§ú;®ù;¶ø;¿ö;Êô;Üð;êí;öê;ÿè<ÿç<ÿæ=ÿå=ÿå=ÿå=ÿå=ÿå=ÿÿ="ÿDÿIÿMÿP&ÿQ0ÿP;ÿNFÿKS ÿH`ÿFlûExøD‚öCŒôB”óAœñA£ï@ªî@²í?»ë?Æé?Õå?èâ@ôß@þÝAÿÛBÿÙBÿØBÿØBÿØBÿØBÿØBÿÿ@ÿHÿNÿRÿV#ÿX,ÿW7ÿUBÿRM ùPZõMgñLrîJ}ëH†éGçF—åEž ãD¦"áD®#àC·$ÞCÂ%ÜCÐ&×Cå&ÓDó$ÐEþ"ÍFÿ ÌGÿÊGÿÉHÿÉHÿÉHÿÉHÿÉHÿÿDÿLÿRÿXÿ]ÿ_(ÿ^2ý]=öZI ðWUêUbæRmâPwßNÜLŠ"ÙK’$ÕJš&ÓI¡(ÑI©)ÏH²*ÍH¼+ËHÉ,ÈHß,ÅHï+ÂJü(ÀKÿ%¿Lÿ"¾Mÿ ½Mÿ½Mÿ½Mÿ½Mÿ½MÿÿGÿOÿVÿ^ÿbÿe$þe-ôd8íaC æ_Qà\]ÚXhÔVrÐT{"ÌR„&ÊPŒ(ÇO”*ÅN›,ÃN£.ÁM¬/¿L¶0½LÂ1»LÓ2¸Lé1¶Nø-´Pÿ*³Qÿ'³Rÿ$²Rÿ"²Rÿ"²Rÿ"²Rÿ"²Rÿ"ÿJÿSÿ[ÿbÿhÿjök(ìk2äi>ÜfL ÓbXÍ_cÈ\m ÄZv$ÁX~(¾V†+»UŽ.¹S–0¶Rž2´R¦3²Q°5°Q¼6®PË7¬Pã7ªRô3©Tÿ.¨Vÿ+¨Wÿ(¨Wÿ%¨Wÿ%¨Wÿ%¨Wÿ%¨Wÿ%ÿMÿVÿ_ ÿgÿlûpïq"äq,Ûp:ÑlH ÉhTÃe_¾bh!º_q&¶]y*³[-°Z‰0®X‘3«W™5©V¡7§V«8¥U¶:£UÅ;¡UÝ;ŸVð7ŸXþ2ŸZÿ.ž[ÿ+ž\ÿ(ž\ÿ(ž\ÿ(ž\ÿ(ž\ÿ(ÿPÿY ÿc ÿk ÿpõtèvÝw%Ñv6ÈrD ÁnP»k[¶gd!±em'­bu+ª`|/§_„2¤]Œ4¢\”7Ÿ[9Z¦;šY±=˜Y¿>—YÓ>•Zì;•]û5–^ÿ1–_ÿ-–`ÿ*–`ÿ*–`ÿ*–`ÿ*–`ÿ*ÿRÿ\ ÿf ÿn öt ïxá{Ô| Ê{3ÁwA ºtM´pX®la!©ji'¦gq+¢ex/Ÿd€3œbˆ6™a8–_™;”^¢=‘^­?]»@]ÍAŒ^è?aù8bÿ3Ždÿ0Ždÿ,Žeÿ,Žeÿ,Žeÿ,Žeÿ,ÿUÿ_ÿiôrâxÛ| Ù ÍÄ0»|? ´xK­uU¨q^!£nf&Ÿln+›ju/˜h}3•g„6’eŒ9d•<ŒcŸ>‰bª@‡a·B…aÉB„bäA…d÷;†fÿ5‡gÿ1‡hÿ.‡iÿ-‡iÿ-‡iÿ-‡iÿ-ÿW ÿaþläuÛ{Ó€Ѓ Ç…¾„-¶< ¯}H¨yR¢v[ sc&™pk+•nr/‘my3Žk6‹i‰:ˆh’<…gœ?‚f§A€f´C~fÅD|fáC~hõ<jÿ7€kÿ3lÿ/lÿ/lÿ/lÿ/lÿ/ÿY ÿcôoßxÔ΃ʇˆ¹‡+±…:ªF£~PzY˜wa%“uh*so/‹qw3ˆo~6…n†:‚l=k™@|j¥Byj±DwjÂDvjÝDxló>ynÿ8zoÿ4{pÿ0|pÿ0|pÿ0|pÿ0|pÿ0ÿ[ÿfçrÚ{Ï‚ɇÄŠ¼Œ´‹(¬‰8¥…Dž‚N˜W“|_$Žyf*Šwm.†ut2‚t|6r„9|q=yp—@vo¢Bsn¯DqnÀEpnÙErpñ?srÿ9usÿ5vtÿ1vtÿ1vtÿ1vtÿ1vtÿ1ÿ]ÿiâtÔ}Ë…ÄŠ¿·°&¨5 ŠBš†L“ƒUŽ]$‰~d)…|k-zr2}xy5zw‚9vv‹ HŠŽQ„‹Y!‰`'{‡g+w…n0s„u4o‚}7k‡;h€‘>eœAb~©C`~¹D_~ÏD`ì@b€ü:d€ÿ6eÿ3fÿ2fÿ2fÿ2fÿ2ÿdårÓ~LJ¾¶•®™¦›  œ™›.’™; ‹–F…”O‘Wz^%uŽe*qŒl.mŠs2i‰{6fˆ„9b†=_…š?\…¨AZ…·BY…ÌBZ…ê?\†û:^†ÿ6_‡ÿ2_‡ÿ2_‡ÿ2_‡ÿ2_‡ÿ2ýhàv͂Œ¹“°™¨Ÿ  ™¡“ +ŒŸ8…CšLy˜Tt—\"p•c'k“j,g’q0d‘y3`‚7\Ž:Y™=W¦?T¶@SË@Té=Vú9Wÿ5YŽÿ2YŽÿ1YŽÿ1YŽÿ1YŽÿ1ímÙ{ȇ½´˜ª¡¡—¦‘§Œ§'…¦5¤@ y¢Js RnŸYi`$eœg(a›o,^šw0Z˜€3V—‹6S——9Q–¥;O–´º³&=ºÈ&=ºè&=¸ù%=·ÿ$=¶ÿ#=¶ÿ#=¶ÿ#=¶ÿ#=¶ÿ#Lj¹•¬¡¤–«Š²¹s¿hÆ`Ê^Ê[Ê,WÊ8TÊCPÊLMÉU JÉ]GÉfDÉoAÉy?È…<È“:È¢9ɳ8ÉÉ8Èè7Çù7Åÿ6Äÿ6Äÿ6Äÿ6Äÿ6Äÿ¾‘°›¤£˜ªŒ²€¹tÀhÇ]ÍSÓ O×MØ"KØ0IØ<FØFDÙOAÙX?Ùa<Ùk :Ùv 7Ù‚5Ú4Ú 2Ú±1ÛÇ1Úç0Øö0Öÿ/Ôÿ/Ôÿ/Ôÿ/Ôÿ/Ôÿ³š¦¡š©±€ºtÁhÉ\ÏRÕHÜEåCåAæ*>æ5;ç>9çG7çP4èY2èb0èm.éy,é‡+ê– )ê§ (êº 'ëÖ 'éð 'çý &æÿ &æÿ &æÿ &æÿ &æÿ ¨ œ§°‚¹tÂhÊ[ÑO×EÝ>î <ò9ó6ó%4ô.1ô7.õ?,õG)öO'öW%÷a#÷l!øzø‰ùšù«úÀúÞùò÷ýöÿöÿöÿöÿž¦‘¯ƒ¹uÂgËZÓMÚBß8å5û1ÿ.ÿ+ÿ)ÿ&%ÿ-#ÿ4 ÿ;ÿCÿKÿSÿ]ÿjÿxÿˆÿšÿ«ÿ¾ÿÕÿíÿðÿðÿðÿð“®„¸vÂgÌZÕLÜ?á5æ-ô*ÿ&ÿ #ÿ ÿÿÿ#ÿ)ÿ/ÿ5ÿ=ÿE ÿN ÿXÿeÿtÿ…ÿ–ÿ¦ÿµÿÆÿÊÿÊÿÊÿʆ·wÁhÌZ×KÞ>ä2é'í#ÿÿÿÿ ÿÿÿ ÿ ÿ"ÿ(ÿ.ÿ5ÿ=ÿGÿRÿ^ÿmÿ~ÿŽÿ›ÿ©ÿ«ÿ«ÿ«ÿ«ÿ*-ÿ.+ÿ0+ÿ0.ÿ.5ÿ)=ÿ%Iÿ#Wÿ!dÿrÿÿŠÿ”ÿœÿ£ÿªÿ±ÿ¸ÿ¿ÿÉÿÖÿåÿïÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,+ÿ0(ÿ3(ÿ3+ÿ11ÿ-:ÿ+Gÿ(Tÿ&aÿ$oÿ"|ÿ"‡ÿ"‘ÿ!™ÿ!¡ÿ!§ÿ!®ÿ!µÿ!¼ÿ!Æÿ!Ñÿ!âÿ"íÿ"÷ÿ"ÿý"ÿü"ÿü"ÿü"ÿû"ÿû"ÿû"ÿû"ÿÿ.(ÿ3%ÿ6%ÿ7'ÿ5-ÿ48ÿ2Dÿ/Qÿ,^ÿ*kÿ)wÿ(ƒÿ'ÿ'– ÿ' ÿ'¤ ÿ'« ÿ'² ÿ'¹ ÿ' ÿ'Í ÿ'Þ ÿ'ë ü'öù(þ÷(ÿö(ÿõ(ÿõ(ÿõ(ÿõ(ÿõ(ÿõ(ÿÿ2%ÿ7"ÿ:!ÿ;#ÿ;)ÿ;4ÿ9@ÿ6Mÿ4Zÿ1fÿ0sÿ. ÿ.‰ ÿ.’ ÿ-™ ÿ-¡ ÿ-§ ÿ-® ÿ-µ ÿ-¾ þ-É û-Ù ø-è ô.ô ñ.þ ï.ÿ î.ÿ í.ÿ ì.ÿ ì.ÿ ì.ÿ ì.ÿ ì.ÿ ÿ5"ÿ;ÿ?ÿ@ÿB&ÿB1ÿ@<ÿ>Hÿ;Uÿ9bÿ7n ÿ6y ÿ5„ ý4 ü4• ú4œù3£÷3ªö3²õ3ºó3Åò3Òî3åê4òç4ýå4ÿä4ÿâ5ÿâ5ÿ á5ÿ á5ÿ á5ÿ á5ÿ ÿ9ÿ?ÿCÿFÿI#ÿI-ÿH8ÿEDÿCPÿ@] û>i ø=t õ<ó;ˆñ;ï:˜í:Ÿì9¦ê9®é9¶ç9Áæ9Îâ9ãÞ9ñÛ:üØ:ÿÕ;ÿÓ;ÿÒ;ÿÒ;ÿÒ;ÿÒ;ÿÒ;ÿÿ=ÿCÿHÿLÿOÿP(ÿO3ÿM?ûJJõGW ñFd íDoéCyçBƒäA‹â@“à?›ß?¢Ý>ªÛ>³Ø>½Ö>ÊÒ>ßÎ>ïË?ûÉ@ÿÇ@ÿÆAÿÅAÿÄAÿÄAÿÄAÿÄAÿÿAÿGÿLÿRÿVÿW$ÿV.øT9ñQEëOR æM^ áKiÝItÙH}ÕF†ÒEŽÐE–ÎDÌD¥ÊC­ÈC¶ ÆCÃ!ÅCÓ!ÁCé!¾D÷¼EÿºFÿ¹Gÿ¸Gÿ¸Gÿ¸Gÿ¸Gÿ¸GÿÿDÿKÿQÿWÿ[ÿ]ù](ï[3çY?àWMÚTY ÓRdÎPnÊNwÇL€ÅKˆÂJ ÀJ—!¾IŸ#¼H§$ºH°%¸H¼&·HË'´Gã'²Ió%°Jÿ"®Kÿ®Lÿ­Lÿ­Mÿ­Mÿ­Mÿ­MÿÿGÿO ÿV ÿ\ÿ`ýbðc!æb,Þ`:Ô^HÍ[T ÇX_ÃVi¿Tr¼Rz¹Q‚!¶PŠ#´O‘%²N™'°M¢(®M«*¬L¶+ªLÄ,¨LÛ,¦Mï*¤Oý&¤Pÿ#£Qÿ £Rÿ¢Rÿ¢Rÿ¢Rÿ¢RÿÿJÿR ÿZ ÿ` ÿeõgèhÝg$Òf5ÊdDÃaP ½^[¹\dµZm±Xu ®W}#¬U„%©TŒ(§S”*¥R,£R¦-¡Q±/ŸQ¾0QÑ0›Qê/šSú*šUÿ&™Vÿ#™Vÿ!™Wÿ™Wÿ™Wÿ™WÿÿM ÿUÿ]ûdïi ék álÓmÉl1Âj@»gL µdW°a`¬_i¨]q!¥\x$¢Z€' Y‡*X,›W˜.™V¢0–U¬2”U¹3“UÊ3‘Uå3‘W÷-‘Yÿ)‘Zÿ%‘[ÿ#‘[ÿ!‘[ÿ!‘[ÿ!‘[ÿ!ÿO ÿWÿaêhÞmØpÕp ËrÂq.ºo=´lI ®iT©g]¤de¡bm!at%š_|(˜^ƒ+•]‹-’[”0[ž2Z¨4‹Yµ5ŠYÆ6ˆYá6ˆ\ô0ˆ]ÿ+‰^ÿ(‰_ÿ%‰_ÿ#‰_ÿ#‰_ÿ#‰_ÿ#ÿQ ÿZõdàl×qÐtÍu Äv¼v*´t:®qF §nQ¢kZžibšgi!–eq%“dx(b€+aˆ.‹`‘1ˆ_š3†^¥5ƒ^²7‚^Â7€^Ü8€_ò3aÿ-‚bÿ)‚cÿ&‚dÿ%‚dÿ%‚dÿ%‚dÿ%ÿSÿ]çgÛoÐtÊxÆy¾z¶z(¯x7¨vD ¢sNœpW˜m_”kg!jn%hu(Šg}+‡e….„dŽ1c—4b¢6|b¯8zb¾9ybÕ9ycï4zeþ/{fÿ+|gÿ(|gÿ&|gÿ&|gÿ&|gÿ&ÿUÿ`ãjÕrÌxÅ{À}¹~±~%ª}5£zA wL—tU’r]Žpd Šnk$‡lr(„kz+j‚.~i‹1{g•4xg 6vf¬8tf¼9sfÑ:sgí6tiý0ujÿ,vkÿ)wkÿ'wkÿ'wkÿ'wkÿ'ÿWöcßmÑuÈ{Á»€´¬‚#¥2ž~? ˜{J’ySv[‰tb …ri$qp'~ow+{n.xmˆ1ul’4skž7pjª9nj¹:mjÎ:mkë7omü1pnÿ-qnÿ*qoÿ(qoÿ(qoÿ(qoÿ(ÿYëeÛpÍxÄ~¼‚¶„®…§†  …0š‚=“€HŽ}Q‰{Y„y`€wg#|un'ytu*vs}.sr†1pq4mpœ7jo¨9ho·:goË:gpé7iqú2krÿ-lsÿ*lsÿ(lsÿ(lsÿ(lsÿ(ÿ\çhÕsÉ{À‚¸†±ˆ©‰ ¢Šœ‰.•‡;…E‰‚O„€W~^{|e"x{l&tys*qx{-nw„0kvŽ3huš6et¦8ctµ9atÉ:atç8cvù2evÿ.fwÿ+gwÿ)gwÿ)gwÿ)gwÿ)ÿ_ãlÐvż…´Š¬Œ£Ž Ž—Ž+Œ8ŠŠC „‡L…Uz„\v‚c!s€j%oq)l~y,h}‚/e|Œ2b{˜5_z¤7]z³8\zÇ9\zå7^{ø2_{ÿ.`|ÿ+a|ÿ)a|ÿ)a|ÿ)a|ÿ)õbÞoÌzÀƒ·‰¯Ž¦‘’—“‘“(‹’6…A ŽJzŒRuŠZqˆam‡h#j†o'f„w+cƒ€.`‚Š1]–4Z£6X€²7V€Å7V€ã6X÷1Yÿ-[‚ÿ*[‚ÿ)[‚ÿ)[‚ÿ)[‚ÿ)ìfØsÇ~¼‡³Ž©’ •–˜™Š™$…˜2–> y”Ht“Po‘Wk^hŽe!dm%`Œu(]‹~+ZŠˆ.W‰”1T‰¡3Rˆ°4QˆÃ5Pˆâ4Rˆö0Sˆÿ,Tˆÿ)Uˆÿ(Uˆÿ(Uˆÿ(Uˆÿ(ækÐxƒ·Œ­’£–ššŽž‡ŸƒŸ ~Ÿ/x;sœE n›Mi™Ue˜\a—c^–j![•r%W”|(T“†+Q’’.N’ 0L’¯1K’Â1J‘à1L‘õ-M‘ÿ*Nÿ(Nÿ&Nÿ&Nÿ&Nÿ&ÞpÉ}¼‰²’§—›“Ÿ†¤~¦ z¦u¦*p¦7l¥A g£J c¢R_¡Y[¡aX hTŸp Qžz#N„&K‘)Hœž*Fœ®,EœÁ,Eœß+E›ô)Fšÿ'Gšÿ%Gšÿ$Gšÿ$Gšÿ$Gšÿ$Ôw„¶«–¡œ– ‹¥ªt®o¯l¯$h¯2d®=_­F [¬O X¬VT«^QªfNªnK©xH©ƒ E¨"C¨$A¨­%@¨À%?¨ß%?¦ô#@¥ÿ"@¥ÿ!@¤ÿ @¤ÿ @¤ÿ @¤ÿ Ê~»‹¯•¤›™¡Ž¦‚¬w±j¶c¸a¸^¸,Z¸8W¸BS¸KP·S M·[J¶cG¶kDµuBµ?µŽ=µœ;µ¬:µÀ9µß9³ô9²ÿ9±ÿ9°ÿ9°ÿ9°ÿ9°ÿÁ†´“§šœ ‘§…­y³m¸b½VÂSÃRÃ#PÄ0MÄ;JÄEGÄNEÄWBÃ_ @Ãh =Ãr ;Ã~8ÃŒ6Û5ë3ÃÀ3Ãà3Áõ2Àÿ2¿ÿ1¾ÿ1¾ÿ1¾ÿ1¾ÿ¸«™Ÿ “§‡®{´n»cÀXÅMÊDÏ CÐBÐ%@Ð2?Ñ==ÑG;ÑP9ÒY6Òc4Òn2Òz0Òˆ.Ò˜ -Ó© ,Ó¾ ,Óß +Ñó *Ïþ )Îÿ )Íÿ )Íÿ )Íÿ )Íÿ ®˜¢Ÿ–¦‰®|¶o½cÃWÈLÍBÒ9Ù 5ß4ß2à'1á20á=.âG-âP+âZ*ãe(ãq&ä%ä#å¡"å´!åÍ äì âûáÿàÿàÿàÿàÿ¤ž˜¥‹®}¶p¾cÆVËKÐ@Õ6Ü/å-í+î)î"'ï+%ï4#ð<!ðEñNòXòdóqóô’ô¥õºõÖôïòüðÿðÿðÿðÿ𤭶q¿cÇVÎIÓ=Ú3ß*ã&ô$û !üýý"þ)þ1ÿ9ÿAÿJÿUÿa ÿo ÿ€ ÿ“ ÿ¦ÿºÿÔÿëÿöÿöÿöÿö¬€¶r¿cÉVÑHØ;Ý0â&æðÿÿ ÿÿÿÿ ÿ$ ÿ+ ÿ2ÿ;ÿDÿOÿ\ÿkÿ}ÿÿ£ÿ´ÿÆÿÖÿÖÿÖÿÖ‚µs¿dÉVÓGÛ:à.å#éíýÿÿÿ ÿ ÿÿÿÿÿ$ÿ+ÿ3ÿ=ÿIÿVÿfÿxÿŠÿ›ÿ¨ÿ±ÿ±ÿ±ÿ±ÿ%+ÿ()ÿ))ÿ(,ÿ#2ÿ;ÿGÿUÿbÿpÿ|ÿ‡ÿ‘ÿ™ÿ ÿ§ÿ­ÿ´ÿ»ÿÄÿÎÿßÿëÿöÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ()ÿ+&ÿ,&ÿ+)ÿ(/ÿ"8ÿ DÿRÿ_ÿlÿyÿ„ÿŽÿ–ÿÿ¤ÿªÿ±ÿ¸ÿÀÿÊÿÛÿèÿôÿýüÿûÿûÿúÿúÿúÿúÿúÿÿ*&ÿ.#ÿ/"ÿ/%ÿ,+ÿ*5ÿ'Aÿ$Nÿ"[ÿ hÿtÿ€ÿŠÿ’ÿšÿ¡ÿ§ÿ­ÿ´ÿ½ÿÇÿÔþæûò÷ûõÿôÿóÿóÿòÿòÿòÿòÿÿ."ÿ2ÿ4ÿ3 ÿ2&ÿ22ÿ/>ÿ,Jÿ*Wÿ'dÿ&pÿ%{ÿ$…ÿ$Žÿ$–ÿ$ÿ$£ÿ$ªý$±ü$¹û$Ãù$Ïö$ãò$ðî%úí%ÿë%ÿê%ÿé%ÿé%ÿé%ÿé%ÿé%ÿÿ2ÿ6ÿ8ÿ8ÿ:#ÿ9-ÿ8:ÿ5Fÿ2Rÿ0_ÿ.kÿ-vý,€ú,‰ù+‘÷+™õ+Ÿô+¦ó+­ñ+µð+¿î+Ëë+ßç,îä,úâ,ÿ à,ÿ Þ,ÿÞ,ÿÝ,ÿÝ,ÿÝ,ÿÝ,ÿÿ5ÿ:ÿ=ÿ?ÿAÿA)ÿ@4ÿ=Aÿ:Mü8Zø6eô5qñ4{ï3„ í3 ë2” é2› è2¢ æ2ª ä2² ã2» á2È ß2Ü Ú2ì Õ3ø Ò3ÿ Ð3ÿ Î3ÿ Í4ÿ Ì4ÿ Ì4ÿ Ì4ÿ Ì4ÿ ÿ9ÿ>ÿAÿEÿHÿH$ÿG/þD;÷BGñ?Tì>`è Å>¨Ã>±Á>¼À>˽>âº>ò·?ÿµ@ÿ´@ÿ³Aÿ³Aÿ³Aÿ³Aÿ³Aÿÿ@ÿF ÿK ÿQ ÿSÿTóT"éR-áP;ÚOIÒMUÌK` ÈIjÅHsÂG{¿Fƒ½E‹»E“¹Dš·C¢µC«´C¶²CİCÙ­Cí«Eü©Eÿ¨Fÿ¨Fÿ§Gÿ§Gÿ§Gÿ§GÿÿDÿJÿPÿU ÿX ÷YêXßW$ÔW5ÌUDÆTPÁR[ ½Pe¹Nm¶Mv´L}±K…¯J­I•«I©H¦ §H°!¥H½"¤HÏ"¡Hè" IøŸKÿžKÿLÿLÿLÿLÿLÿÿG ÿMÿT÷Zë]ç] á\Ó]Ê]0Ã\?½ZL·XW ³V`¯Ti¬Sq©Qx§P€¤O‡¢O  N˜!žM¡#œM«$šM¸%™LÈ&–Lâ&•Nõ"”Oÿ”Pÿ”Qÿ”Qÿ”Qÿ”Qÿ”QÿÿIÿPûXå^ÝbÖcÔa ÊbÂc,»b;´`H¯]S ª[\¦Zd£Xl WtU{›Tƒ ™T‹"–S“$”R%’Q§'Q³(ŽQÃ)QÝ*ŒRò&‹Tÿ"‹Uÿ‹Vÿ‹Vÿ‹Vÿ‹Vÿ‹VÿÿLÿSì\ßbÔfÎhËgÂgºh(³g8­eE¨cP £aYŸ_a›]h˜\p•Zw“Y!X‡#ŽW%ŒW™'‰V£)‡V¯*…U¿+„VÕ,ƒWï)ƒXþ$ƒYÿ „Zÿ„Zÿ„Zÿ„Zÿ„ZÿÿNÿWå_ØfÎjÇlÃk¼l´m%­l5§jB¡gM œeV˜c^”be‘`lŽ_tŒ^{!‰]ƒ$†\Œ&„[•(Z *Z¬,}Z»-|ZÏ.{[ì+|\ü&|]ÿ"}^ÿ}^ÿ}^ÿ}^ÿ}^ÿÿPõYácÒjÉnÂp½p¶p®q"¨p2¡n?œlJ —jS’h[Žfb‹eiˆcp…bx!‚a€$€`‰&}_’){^+x^©-v^¸.u^Ì/t^é-u`ú'vaÿ#wbÿ wbÿwbÿwbÿwbÿÿRì\ÜfÎmÄr½t·t°t©u¢t/œr=—pG ‘nQlY‰j`…ig‚hnfu!}e}$zd†'wc)uc›,rb§.pb¶/obÉ/nbæ.odù(peÿ$qfÿ!qfÿqfÿqfÿqfÿÿTè_×iÊpÀu¹x²x«x ¤yžx-—w:’uE ŒrNˆpV„o^€md}lkzks wj{#tiƒ&rh)og™,lf¥.jf³/ifÆ0hfä/jh÷)kiÿ%liÿ"ljÿ ljÿ ljÿ ljÿ ÿWäbÒlÆs½xµ{­|¥| Ÿ}™|*“{8yC ˆwLƒuTs[{rbxpiuop rnx#om&ll‹)jl—,gk£.ek²/dkÄ0bká/dlö*fmÿ&fmÿ#gnÿ gnÿ gnÿ gnÿ öYàeÎoÂv¹|±©€ €™”(Ž€5ˆ~Aƒ|J ~zRzxYvw`svgptnmsv#jr&gq‰)dq•+bp¡-`p°/^pÂ/]pß/_qõ*`qÿ&arÿ#brÿ brÿ brÿ brÿ ï\ÜiÊr¾zµ€­„¤…š…”…ކ%‰„3ƒƒ>~H yPu~Wq}^n{ekzlhyt"ex}%bw‡(_v“*\vŸ,Zu®.YuÀ.XuÝ.Yvó*[vÿ&\wÿ#\wÿ \wÿ \wÿ \wÿ ê`ÕlÅvº~±„¨ˆŸ‰”ŠŠˆ‹!ƒŠ0~‰;y‡E t†Np„Ulƒ\i‚cfjb€r _{#\~…&Y}‘)W|ž+U|¬,S|¾-R|Ú-S|ò)U|ÿ%V|ÿ"W|ÿ W|ÿ W|ÿ W|ÿ ådÏpÁz¶ƒ­‰£Œ™Ž†‘},x8sŽBnK jŒSgŠZc‰a`ˆh]‡pZ†y!V…ƒ$T…&Q„œ(O„ª*M„¼*M„×*Mƒñ'Oƒÿ$Pƒÿ"PƒÿPƒÿPƒÿPƒÿÞiÉu¼€²ˆ¨‘““…–~— y—u—(q—5l–?h•H d”P a“W]’^Z‘fWnTwQŽ NŽ#Kš%I©&H»'GÔ'GŒð$HŒÿ"I‹ÿ J‹ÿJ‹ÿJ‹ÿJ‹ÿÕnÃ{·…¬¢’—–Œ™œužpŸmŸ#iŸ0ež;ažE]M ZœT W›\TšcQškN™tK˜H˜‹E—™ C—¨!B—º"A—Ó"A–ï B•þB•ÿC”ÿC”ÿC”ÿC”ÿÌu¼±Œ¦’›—‘›…Ÿy£j§e§c¨`¨+]¨6Y§@V§IS¦Q P¦Y M¥`J¥iG¤rD¤}B£‰?£—=£§<£¹;£Ò;¢ï; þ;Ÿÿ<Ÿÿ<Ÿÿ<Ÿÿ<ŸÿÄ|¶‰ª’Ÿ—•œ‰¡}¦qªd®Z±W±U²#S²0P²;M²DK±MH±UE±] C±e @°o >°z;°‡9¯–7¯¦6¯¸5°Ñ5®ï4­þ4¬ÿ4«ÿ4«ÿ4«ÿ4«ÿ»…¯£—˜Œ£€¨t­h²\¶PºI¼ H¼F½'E½3C½=A½G?½P=½X:½a8½k6½w4½„ 2½“ 0½¤ /½· .¾Ð .¼î -ºþ ,¹ÿ ,¸ÿ,¸ÿ,¸ÿ,¸ÿ³¦—›£ƒªv°jµ^ºR¾GÂ=Ç8É7É6Ê'5Ê34Ë=3ËG1ËQ0Ë[.Ìe,Ìq*Ì)Ì'Ì¡&Í´%ÍÎ%Ëî$Éü#Èÿ#Çÿ#Çÿ#Çÿ#Çÿ©–ž’£…«x²k¸_¾RÂGÆ=Ê4Ï+Ô &Ù%Ù%Ú%$Ú0#Û;#ÛE"ÜP!Ý[ ÝhÞvއߙ߬ßÄÞçÜøÛÿÚÿÚÿÚÿÚÿ œ”£‡«y³lº_ÁRÆFÊ;Î1Ó)Ù!Þèèéé'ê0ê9ëCìNìZígîwîŠïžð³ ðÍ ïì íü ëÿ ëÿ ëÿ ëÿ—£‰«{´m¼_ÄRÊEÎ9Ó/Ø%Ýáì÷ ÷øøù% ù- ú5 û?ûJüWýfþwý‹ýŸüµüÑüíüüüýüýüý‹«}´n½`ÆRÍDÒ7Ø,Ý"áåêúÿ ÿ ÿÿÿÿ ÿ'ÿ0ÿ:ÿEÿSÿbÿuÿŠÿŸÿ³ÿÇÿåÿåÿåÿå´p½aÇSÐCÖ6Ý*âæêí ú ÿÿÿÿ ÿ ÿÿÿÿ!ÿ)ÿ4ÿ@ÿNÿ^ÿrÿ‡ÿšÿªÿ¹ÿ¹ÿ¹ÿ¹ÿ )ÿ"'ÿ"'ÿ*ÿ0ÿ9ÿEÿ Sÿ `ÿ mÿ yÿ „ÿ Žÿ –ÿ ÿ £ÿ ©ÿ °ÿ·ÿ¾ÿÈÿÖÿæÿñÿûÿÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ#&ÿ%$ÿ%$ÿ#'ÿ,ÿ5ÿBÿPÿ]ÿjÿvÿ€ÿŠÿ’ÿšÿ ÿ¦ÿ ­ÿ ³ÿ »ÿ Åÿ Ñÿ ãÿ ïþ úú ÿùÿùÿùÿøÿøÿøÿøÿÿ&#ÿ( ÿ( ÿ&"ÿ"(ÿ 2ÿ?ÿLÿYÿeÿqÿ|ÿ†ÿŽÿ–ÿÿ£ÿ©ÿ°ÿ·ÿÁÿÌýßùíõøóÿòÿñÿðÿðÿðÿðÿðÿÿ*ÿ,ÿ,ÿ+ÿ)$ÿ(/ÿ%;ÿ"HÿTÿaÿmÿwÿÿŠÿ’ÿ™ýŸü¦û¬ù´ø½öÈóÛïêì÷éÿèÿçÿæÿåÿåÿåÿåÿÿ-ÿ0ÿ1ÿ0ÿ1 ÿ0*ÿ.6ÿ+Cÿ(Oÿ&\ÿ$gü#rù#|÷"…õ"ó"•ò"›ð"¢ï"©í"±ì"¹ê"Åè"Õä#éà#öÞ#ÿÛ$ÿÙ$ÿØ$ÿ×$ÿÖ$ÿÖ$ÿÖ$ÿÿ1ÿ4ÿ6ÿ7ÿ9ÿ8%ÿ61ÿ3=ý1Jø.Vô-bð,mí+wê+€è*ˆæ*å*—ã*žá*¥à*­Þ*¶Ü*ÂÚ*ÒÕ+çÐ+õÍ,ÿË,ÿÉ,ÿÈ,ÿÇ,ÿÇ,ÿÇ,ÿÇ,ÿÿ5ÿ9ÿ: ÿ>ÿ@ÿ? ÿ=*ù;7ò8Dì6Qç5\ã4gà3rÝ3{Ú2ƒÖ2‹Ô2“Ò1šÐ1¡Î1© Ì1² Ë1¼ É1Ê Æ2á Â2ñ ¿3þ ½3ÿ »3ÿ º3ÿ º3ÿ º3ÿ º3ÿ º3ÿ ÿ9ÿ= ÿ@ ÿD ÿFÿE÷D#îA/æ?<à>JÚ=WÓ•²>°>¦¯>°­>½«>Í©>æ¦?÷¤@ÿ£@ÿ¢@ÿ¢@ÿ¢Aÿ¢Aÿ¢Aÿÿ? ÿDÿJ÷NìPêO ãLÖLÍM0ÆM?ÀLL»KW·Ia ´Hi ±Gq®Fy¬F€ªEˆ¨D¦D˜¤C¡¢C« C·ŸCÇCà›Dó™Eÿ˜Fÿ˜Fÿ˜Fÿ—Fÿ—Fÿ—FÿÿBÿG÷OåSÝU×UÕR ËSÃT+¼T;¶RH±QR­P\ ©Nd ¦Ml¤Lt¡K{ŸJ‚JŠ›I“™Iœ—H¦•H²”HÁ’HØIïJþKÿŽKÿŽLÿŽLÿŽLÿŽLÿÿEÿKéSÞXÓ[Í[ÊXÂXºZ'³Z7®XD©WO¤UX ¡T` žSh›Qo˜Pv–P~”O†’NŽN˜M¢‹M®ŠM¼ ˆMÐ ‡Më†Oü†Pÿ†Pÿ†Pÿ†Qÿ†Qÿ†QÿÿGøOäWÕ]Ì`Å`Á^º]³_#¬_3¦^@¡\KZT ™Y\–Xd“VkUrŽTz‹T‚‰SЇR”…RžƒQª!Q¸"QË"~Rç!~Sù~Tÿ~Uÿ~Uÿ~Uÿ~Uÿ~UÿÿJîRÞ[ÏaÆd¿eºc³b¬c ¦c0 b=›aH–_Q ’^Y \aŒ[h‰Zo†Yv„X~‚W‡W}V›!{V§"yVµ#wVÇ$vVä$vW÷wXÿwYÿwYÿwYÿwYÿwYÿÿLéVÙ_ËeÁhºi´h­g ¦h h-šg:•eEcN ŒbW ‰a^†_eƒ^l€]s~\{{\ƒy[vZ˜!tZ¤#rZ²$qZÄ%oZá%p[ö q\ÿq]ÿq]ÿq]ÿq]ÿq]ÿýOåYÓbÇh½l¶m¯l§k  l›l*•k7iC‹hL ‡fT ƒe[€cb}bizapxaxu`s_‹p^–"n^¢$l^°%k^Á&i^Þ&j_ô!k`ÿkaÿlaÿlaÿlaÿlaÿõQâ\ÏeÃk¹o±qªq¢o›o–p'o5‹n@†lI‚jR ~iY{h`wffufnrevpd~mcˆkc“"ib $fb®%eb¿&dbÚ&dcò"edÿfdÿgdÿgeÿgeÿgeÿðSÝ_Ëh¿o¶s®u¦us–s‘t$‹s2†r>pG}oO ymWvl^skdpjlmjski|hh†fg‘"cgž$af¬%`f½&_gÖ&_gñ"`hÿahÿbhÿbhÿbhÿbhÿìWÙbÇk¼r³wªy¡y—wx‹x!†x/w;|uExtM trUqq\npckojhnqfnzcm„`l!^lœ#\kª%Zk»&YlÓ&Zlï#[lÿ\mÿ]mÿ]mÿ]mÿ]mÿèZÒfÃo¸v¯{¦~~‘|Š|…}}-||9wzCsyK pxS lwZivafuhctoasx^r‚[r Yqš"Wq¨$Uq¹%TqÐ%Tqî"VqþWqÿWqÿXqÿXqÿXqÿã^Íi¿s´z«¢‚˜ƒ‹„ ‚{‚)v6r@nIj~P g}Wd|^a{f^zm[zvYy€Vx‹Sx˜!Qw¦"Pw·#OwÎ#Owì!PwýQwÿRwÿRwÿRwÿRwÿÞbÈn»w°§„‡’‡„‡}‡ xˆtˆ&pˆ2l‡=h†Fe…N a…U ^„\[ƒcY‚kVtS€~P€‰N–L¥ J¶!IÌ!I~ëJ~üK~ÿK~ÿL~ÿL~ÿL~ÿÕgÃs¶|¬„¢‰˜‹|uŽom!i.e9bŽB^ŽK[R XŒY V‹aS‹hPŠqM‰{J‰‡Hˆ•Fˆ£Dˆ´CˆÊC‡êD†ûD†ÿE†ÿE…ÿE…ÿE…ÿÍm½x±‚§ŠœŽ’†“y•l—f—c˜a˜)^˜5Z—>W—GU–OR–V O•^ L”fJ”oG“yD“…B’“@’¢>’³=’É=‘é=ú>ÿ>ÿ>ÿ>ÿ>ÿÅs·¬‰¡–“‹–™sœdŸ\  Y W¡"U¡/R¡9P¡CM KJ SH ZEŸc CŸl @žv>žƒ;ž‘9 8²7žÈ7è6›ú6šÿ6™ÿ7™ÿ7™ÿ7™ÿ¾{±‡¥›”˜„œw k¤_§RªM«K«J«'H«3F«=D«FB«N@«V>«_;«h9ªs7ª€ 4ª 2ªŸ 1ª° 0ªÇ 0©ç /§ú /¦ÿ /¥ÿ /¥ÿ /¥ÿ /¥ÿ ¶„ªŽž””™‡ž{£o¨c¬W¯K²Aµ>¶=¶;¶):·49·>7·G6·P4·Z2·d0·o.·|,·‹*·œ)·®(¸Å(·æ'µù&³ÿ&²ÿ&²ÿ&²ÿ&²ÿ¯¢”—š‹ ~¦q«e°Y´M·B»8¾/ -Ã,Ã+Ã)*Ä3)Ä=(ÅG'ÅQ&Å\%Æh#Æv"Ɔ ƘÆ«ÇÁÆäÄøÂÿÁÿÁÿÁÿÁÿ¥”ššŽ¡§s®g´Z¹N½BÀ8Ã/Ç&ËÐ ÑÒÒ%Ó/Ó:ÔDÔPÕ]ÕkÖ|×ؤÙ»ÙÞÕóÓÿÒÿÑÿÑÿÑÿœš‘¡ƒ¨u°h·[½NÁBÅ7È-Ì$ÐÕÚâ ãää# å- å7 æB æO ç]çmæ€æ•æ«æÄææçùçÿæÿæÿæÿ“¡…©w±i¹[ÀNÆAÊ5Î*Ò!ÖÛß ã ñ óóòò"ò*ò4ò?òLò\òmò‚ò˜ó­óÆôåôöôûôûôû‡©y²jº\ÂNÉ@Î3Ó(ØÝáä èóýüû ûûüü&ü0ý<þIþZþmÿ‚ÿ˜ÿ¬ÿÀÿØÿäÿäÿä{²l»]ÄOÍ@Ò2Ù&Þâæ êíôÿÿÿÿÿ ÿÿÿÿ!ÿ+ÿ7ÿFÿXÿkÿ€ÿ•ÿ¦ÿ³ÿ»ÿ»ÿ»ÿ&ÿ$ÿ$ÿ'ÿ-ÿ 6ÿCÿPÿ^ÿkÿvÿÿŠÿ’ÿšÿ ÿ¦ÿ¬ÿ²ÿ¹ÿÂÿÍÿßÿìÿøÿÿýÿýÿýÿýÿýÿýÿýÿÿ#ÿ!ÿ!ÿ#ÿ)ÿ2ÿ @ÿ MÿZÿgÿsÿ}ÿ‡ÿÿ–ÿœÿ¢ÿ¨ÿ¯ÿ¶ÿ¾ÿÉÿÛÿêüöøÿ÷ÿ÷ÿöÿöÿöÿöÿöÿÿ"ÿ"ÿ!ÿÿ$ÿ/ÿ<ÿIÿVÿ bÿ nÿ yÿ ‚ÿ ‹ÿ ’ÿ ™ÿ Ÿÿ ¥ÿ «ÿ ²ÿ »ý Æû Ô÷ çó ôð ÿï ÿî ÿí ÿí ÿí ÿí ÿí ÿÿ%ÿ&ÿ%ÿ!ÿ !ÿ+ÿ7ÿEÿQÿ^ÿiÿtÿ}ÿ†ýŽü•ú›ù¡÷¨ö¯ô·óÂñÐíåèòæþäÿãÿâÿâÿáÿáÿáÿÿ)ÿ*ÿ)ÿ'ÿ(ÿ''ÿ#3ÿ ?ÿLÿXüdønöxóñ‰ïî—ìžê¤é¬ç´æ¿äÍàãÜñØþÔÿÒÿÑÿÐÿÐÿÐÿÐÿÿ-ÿ.ÿ. ÿ/ÿ/ÿ.!ÿ,-ÿ)9ù&Fô$Sï"^ë"iè!sæ!|ã!„á!Œà!“Þ!šÜ!¡Ú!©Ø!±Õ!¼Ó"ÉÐ"ßÌ#ðÈ#ýÆ$ÿÄ$ÿÃ$ÿÂ$ÿÁ$ÿÁ$ÿÁ$ÿÿ0ÿ2 ÿ3ÿ6 ÿ6ÿ5ý2%ô02í-?ç,Lâ+XÝ+cÙ*mÕ*vÒ*Ð*†Î*ŽÌ*•Ê*œÉ*£Ç*¬Å*¶Ã*ÃÂ*Õ¾+ëº+ù¸,ÿ¶,ÿµ,ÿ´,ÿ´,ÿ´,ÿ´,ÿÿ4 ÿ6ÿ9ÿ<ÿ< ý;ñ8è5)à47Ù3FÑ4RÍ3]É3gÆ3pÄ2xÁ2€¿2‡¾2¼2–º1ž¸1¦·1°µ2¼³2Ì ±2å ­3õ «3ÿ ª3ÿ¨3ÿ¨3ÿ§3ÿ§3ÿ§3ÿÿ7ÿ:ÿ>úAñAñ? æ<Û:Ð;1Ê<@Ä÷DæGßHÚFÙ@ ÍBÅD+¾D;¹DHµCS±B\®Be«Al©@t ¦@{ ¤?ƒ £?Š ¡>“Ÿ>œ>¥›>±š>¿˜>Ô–?í”?ü“@ÿ’@ÿ ’Aÿ ’Aÿ ’Aÿ ’Aÿ ÿ=ÿCéIÞNÓOÍNÊIÂI»J&µK6¯KC«JN§IW¤H`¡Gg žFo œFv šE}˜E…–DŽ”D—’C¡C¬CºCÍ‹DèŠEú‰Fÿ‰FÿˆFÿ ˆFÿ ˆFÿ ˆFÿ ÿ@òGãOÔSËUÄTÀP¹O²P"¬Q2§Q?¢PJžOS›N\˜Mc •Lj “Kq ‘JyŽJ€ŒI‰ŠI’ˆHœ†H¨…HµƒHÇHäJ÷€Jÿ€Kÿ€Kÿ€Kÿ€Kÿ€KÿÿCìKÝSÎXÄZ½Z¸W±TªV¥V.ŸV;›UF—TP“SXR_ Qf ‹PmˆOt†O|„N…‚NŽ€M™~M¤|M²zMÃyMßxNôxOÿxOÿxPÿxPÿxPÿxPÿýFçOÖWÈ\¿_·_±\ªY ¤Zž[*™[8”ZCYLŒXU‰W\ †Vc ƒUjTqSy}SzR‹xR•vQ¡tQ¯sQÀqQÛqRòqSÿqTÿrTÿrTÿrTÿrTÿóHãSÐ[Ä`ºc³c¬a¤^ _˜_'“_5Ž^@Š]J†\Rƒ[Y €Z` }Yg{XnxXuvW~tVˆrV“oVŸnU¬lU½kVÕkVðkWÿkXÿlXÿlXÿlXÿlXÿñKßVÌ^Àd·g®h§fŸb˜c’d$c2‰b=„aG`O}_V z^] w]d u\ks\sp[{n[…lZjZœhYªfZºeZÑeZîe[þf[ÿf\ÿg\ÿg\ÿg\ÿíNÚYÈa¼g³j«l¢j™g’gg!ˆg/„f;eD{dMxcT ub[ raa paim`pk_yi_ƒf^Žd^šb^¨a^¸_^Î_^ì`_ýa_ÿa_ÿb_ÿb_ÿb_ÿêQÔ\Äd¹j°n§pžn”kj‡kƒk,~k8zjBviJshRpgY mf` keghdnfdwdcacŒ_b˜]b¦[b¶ZbÌZbê[cü\cÿ\cÿ]cÿ]cÿ]cÿæUÏ_Áh¶n¬r¤tšsŽo‡o ‚o}p)yo5un?rmHnlPklW ik^ fjedilaiu_h\hŠZg–Xg¤Vg´UgÊUgèVgûWgÿWhÿXgÿXgÿXgÿáXËc½k²r©v x–wˆss |txt&tt2ps=msFjrNgqU dp\ apc_oj\nsZn|WmˆUl”Sl£Ql³PlÈOlçQlúQlÿRlÿRlÿRlÿRlÿÜ\Çg¹o¯v¥{œ|‘|‚xzyuyrz#nz/ky:hyCdxKawR_wY \v` YuhWtpTtzRs†Os“Mr¡Lr±JrÆJråKrùLrÿLrÿMrÿMrÿMrÿÔ`Âkµt«{¢—Œz~snk€h€,e€7b€@_H\~PY~WW}^ T|f Q|nO{xL{ƒJz‘HzŸFz¯EzÄDzäEyøFyÿFxÿGxÿGxÿGxÿÍe½p±y§€œ„’†††w†k†f‡ c‡`ˆ'^ˆ3[ˆ<X‡EV‡MS†TP†[N…c K„l I„vFƒDƒBƒ@‚®?ƒÂ>‚â?÷?ÿ@€ÿ@€ÿ@€ÿ@€ÿÆk·v¬¢…—‰Œ‹sŽe] ZX!V‘-S8QANILPJXG`EŽi BŽs @ ><œ:¬9Á8á8‹ö8Šÿ9‰ÿ9‰ÿ9‰ÿ9‰ÿ¿r²}§†œŠ‘ކ‘z“m•_—T™O™NšLš'Jš2Hš<FšDDšLBšT@™\>™f;™p9˜|7˜Š 5˜š 3˜« 2˜¿ 2˜ß 1–õ 1•ÿ 1”ÿ 1“ÿ 1“ÿ 1“ÿ ¸z¬…¡‹–‹”—r›fZ N¢E¤ B¤@¤?¤*>¥4<¥>;¥G9¥O7¥X5¥a3¥l1¥y/¤‡-¤—,¤©+¤½*¤Þ*¢õ)¡ÿ) ÿ)Ÿÿ)Ÿÿ)Ÿÿ±‚¥‹š‘–ƒšvŸj¢^¦R©F«<­5¯ 3°2°!1°+/°5.±>-±H,±Q+±[)±g'±t&±ƒ$±”#±¦"²»!²Û!¯ó ®ÿ ­ÿ¬ÿ¬ÿ¬ÿª‹‘“—‡œz¢m§`«U¯I±>´3·*º$¼ "½!½ !½* ½3¾=¾G¾R¿^¿l¿|¿ŽÀ¡À¶ÀÓ¾ñ¼ÿ»ÿºÿºÿºÿ¡’–˜Šž}¤oªb¯V´J·>º3½*À!ÄÇË ÌÌÌ%Í/Í:ÍF ÍR Î` Îp ΃ Η άÎÆÎèÍû Ëÿ Ëÿ Ëÿ Ëÿ˜˜ž¥q¬d³W¹J½>À2Ã(ÆÊÍÑ ÖÙ ÙÚÚ$Û.Û9ÜEÝRÞbÞsÞˆßß³ßÎàîßúßÿßÿßÿŸ¦s®eµX½JÂ=Å1É&ÌÐÔÙ Ýáãã äåæ"ç+é6ëCìRìbívîŒî¡ï·ïÑïëðöðöðö„§u¯g·Y¿KÆ<Ê/Î$ÒØÜ àãçëëíî ðñóô'÷3ù@úQûcüwýý£þ¶þÉÿßÿßÿßw°h¹ZÁLÊ<Ï.Ô"ÚÞâ æéìðöö÷øúû ýÿÿ#ÿ/ÿ>ÿOÿbÿwÿÿŸÿ®ÿºÿºÿºÿ#ÿ!ÿ!ÿ$ÿ*ÿ3ÿAÿNÿ\ÿhÿtÿ~ÿ‡ÿÿ–ÿœÿ¢ÿ¨ÿ®ÿµÿ½ÿÇÿÖÿçþóþþýÿüÿûÿûÿûÿûÿûÿÿ ÿÿÿ ÿ %ÿ0ÿ=ÿKÿXÿdÿpÿzÿƒÿ‹ÿ’ÿ˜ÿžÿ¤ÿªÿ±ý¹ûÃúÐøã÷ñöüôÿôÿóÿóÿóÿóÿóÿÿÿÿÿÿ!ÿ ,ÿ 9ÿFÿSÿ_ÿkÿuÿ~ÿ†ÿŽÿ”þ›ü¡ú§ø®õµó¿ñËðßîîìùëÿêÿêÿéÿéÿéÿéÿÿ ÿÿÿÿÿ(ÿ4ÿ Aÿ Nÿ Zÿfÿpþyüú‰øö–óñ£ïªí²ê»èÈæÜäìâúà ÿÞ ÿÝ ÿÝ ÿÜ ÿÜ ÿÜ ÿÿ#ÿ#ÿ!ÿÿÿ#ÿ/ÿ;ÿIüUø`ôjñtï|í„ë‹é’ç™æ ä§â¯à¸ÞÅÜÚÖìÒúÏÿÍÿÌÿËÿÊÿÊÿÊÿÿ'ÿ' ÿ% ÿ& ÿ%ÿ#ÿ (û5õBïOêZæeãnàwÞ܇َ֕ԜңЫεÌÁËÒÇèÃøÀÿ¾ÿ½ÿ¼ÿ¼ÿ¼ÿ¼ÿÿ+ ÿ+ÿ+ÿ- ÿ,ÿ)÷& î#-ç!:áHÛTÕ _Ñ hÎ qÌ!yÊ!È!ˆÆ!Ä!–Ã!žÁ"¦¿"¯½"»¼#ʹ#ãµ$ô³$ÿ±$ÿ¯$ÿ¯$ÿ®$ÿ®$ÿ®$ÿÿ/ÿ/ÿ2ÿ3ù2÷/ë+á'"Ø'2Ð)AË*NÆ*YÃ*bÀ*k½*s»*z¹*‚¸*‰¶*´*˜³*¡±*ª¯+µ®+Ĭ+Û¨,ï¦,þ¤,ÿ£-ÿ¢-ÿ¢,ÿ¢,ÿ¢,ÿÿ2ÿ3ù8é9â9Þ5Þ. Ñ/É1,Ã3;½3H¹4S¶3\³3e°3m®3t¬2{«2ƒ©2Ч2“¥2›¤2¥¢2° 2¾Ÿ2Ñœ3êš3û˜4ÿ—4ÿ–4ÿ–4ÿ–4ÿ–4ÿÿ5ÿ8ê>ßBÕBÏ?Í8Å8½:&·;6²ãEÔIËJÅGÁAº?³A!­B1¨C>¤CI BSA[›Ab˜@j–@q”?x’??ˆ >‘ >› ‹>¦ ‰>³ ˆ>Ć?à„?ô ƒ@ÿ ƒ@ÿ ‚@ÿ ‚Aÿ‚Aÿ‚Aÿÿ<ëCÜJÌOÃP¼N·I±FªH¤I, I:›IE˜HN”GW’G^FeFl‹Es ‰E{ ‡Dƒ …D ƒD—C¢C¯~CÀ|DÚ{DñzEÿ zFÿ zFÿ zFÿ zFÿ zFÿ õ>æHÓOÇT½U¶T°P©L ¢MN(˜N6”NAMKMSŠLZ‡Ka…KhƒJo €Jw ~I |I‰zH“xHŸwH¬uH¼tIÒsIîrJÿrJÿ rJÿ rJÿ rJÿ rJÿ òBàLÎSÁX¸Z°Y©V¢R›R–S$‘S2S>‰RG†QPƒQW€P^~Oe{Ol yNs wN{ uM…sMqMœoM©nM¹lMÎlMëlNýlOÿlOÿ lOÿ lOÿ lOÿ îEÜPÉW½\´^¬^¤[œV•VW!‹X/‡W;ƒVDVM|UTzT[wTbuSh sSp qRx oR‚mQkQ™iQ¦gQ¶fQËeRéeRûfSÿfSÿ fSÿ fSÿ fSÿ êIÕSÅZº_°b¨bŸ_–ZZŠ[…[,[8}[AzZJwYQtXXqX_oWf mWm kVv iVgUŠeU—cU¤aU´`UÈ_Uç`Vú`VÿaWÿaWÿ aWÿ aWÿ çLÑVÁ^¶c­f¤f›d^‰^„_€_)|_5x_?t^Gq]Oo\Vl\\j[c h[k fZs dZ}bZˆ_Y”^Y¢\Y²[YÆZYå[Zù[Zÿ\Zÿ\Zÿ \Zÿ \Zÿ ãOÍY¾a³f©i j—h‹bƒb ~czc&vc2sc<obElaLjaTg`Ze`ac_i a_q _^{]^†Z^“X] W]°V^ÄU^ãV^÷V^ÿW^ÿW^ÿ W^ÿ W^ÿ ÞSÈ]»d°j¦mn“m…g~g xgtg#qh/ng9kgBhfJefRceX`e_^dg \do ZcyXc„Ub‘SbŸRb®QbÂPbáQböQbÿRbÿRbÿ Rbÿ Rbÿ ÙVÄ`·h¬n£qšsqkxkrknlkl,hl7fl@ckH`kO^jV\j]Yie Wim Uiw Sh‚PhNgMg¬KhÀKhÞKgõLgÿLgÿMgÿ Mgÿ Mgÿ ÒZÀd³l©r v–wŠvyqqqkqhqfr(cr4`r=^rE[qMYqTWp[TpcRok Pot Mn€KnIn›Gm«Fn¾EnÜFmôFmÿGmÿGlÿ Glÿ Glÿ Ì_¼i°q¥wœ{‘|†{uxkwew ax_x$]y0Zy:XyBVxJSxQQwXOw`LvhJvr Hu} EuŠCu™Bu©@u¼@uÙ@tó@tÿAsÿ Asÿ Asÿ Asÿ Æd·n«v¢|—Œr€e]YW€ U€+S6Q€>O€FM€NKUI]FfD~pB~{ ?~ˆ =}— <}§ :}º:~Ö :|ñ :{ÿ :{ÿ :zÿ :zÿ :zÿ Ài²t§|’„‡†{‡n‡`‡U‡PˆNˆM‰&K‰0I‰:H‰BF‰JD‰RB‰Z@ˆc=ˆm;ˆx9‡†7‡• 5‡¦ 4‡¹ 3‡Ó 3†ð 3…ÿ 3„ÿ 3ƒÿ 3ƒÿ 3ƒÿ ¹p­z¢‚—‡ŠŒuŽhZO‘G’ D’C“A“*@“4?“==“E;“M:“V8“_6“i4“u2’ƒ0’“.’¤-’·,’Ñ,‘ï+ÿ+Žÿ+ÿ+ÿ+ÿ³x§‚œˆ‘Œ‡z“m•a—U™I›?œ976ž"4ž,3ž52ž>1žG0ŸP.ŸZ-Ÿd+Ÿq)ž'ž&ž¡$žµ#žÎ#î#›þ"šÿ"™ÿ"™ÿ"™ÿ¬ ˆ•Ž‹’–ršeY N£B¤7¦.¨)©(©'ª"&ª,%ª5$ª?#ªH"«S!«^ «j«y«‹««±«Êªì¨ý§ÿ¦ÿ¦ÿ¦ÿ¥‰™”ƒ™užh¢\¦P©D¬9®/°&³µ···!·*·4¸>¸I¸T¹b¹q¹ƒ¹—¹¬ ¹Ä ¸ç¶ûµÿ´ÿ´ÿ´ÿœ’•†›y k¦^«R¯F²:µ/·%º½ÀÃ Æ Å ÅÅ(Å2Æ=ÆIÆWÆfÆwƋƠŶÆÒÅïÅüÅÿÅÿÅÿ•–‰œ{£m©`¯S´F¸:».¾$ÁÄÇÊÎÐ ÐÐÑÒ'Ó1Ô<ÕIÖXÖiÖ|Ö’Ö§Ö¿ÖàÖóÖþÖÿÖÿŒ~¤o«a²T¹F½9Á-Ä"ÇËÎ ÒÕÛÜÝ Þßáâ$ä.æ:çIèYèkéé˜é­éÅéâéòéõéõ€¥q­cµU¼GÂ9Æ,Ê ÎÒÖÛßãåçèêë íïñ!ó+ö8÷HøZùmú„ú›ú¯úÂúÚúßúßt®e¶V¾HÆ9Ë+ÐÔÚ ßãæéíïñóõöø úýÿÿ(ÿ6ÿGÿZÿnÿ…ÿšÿ«ÿ¹ÿ¼ÿ¼ÿ ÿÿ ÿ!ÿ'ÿ0ÿ>ÿLÿYÿeÿpÿzÿƒÿ‹ÿ’ÿ˜ÿžÿ¤ÿªÿ°ÿ¸ÿÂÿÎÿâþðýûûÿûÿûÿúÿúÿúÿúÿÿÿÿÿÿ!ÿ-ÿ:ÿHÿUÿaÿlÿvÿÿ‡ÿŽÿ”ÿšþ ý¦ü¬û´ù½øÉ÷Üõìóøóÿòÿñÿðÿðÿðÿðÿÿÿÿÿ ÿÿ(ÿ6ÿCÿPÿ\ÿgÿqÿzü‚ú‰ø÷–õœô¢ó¨ñ°ð¸îÃìÓêçéõçÿæÿåÿåÿåÿåÿåÿÿÿÿÿÿ ÿ $ÿ0ÿ>ÿKÿWþbúlõuò}ð„î‹ì‘ë—éžç¤æ¬ä´â¿àÍÞãÜòÚýØÿÖÿÕÿÕÿÕÿÕÿÿÿ ÿ ÿÿÿÿ*ÿ 8ýEøQô\îfêoæwäâ†àŒÞ“ݚ۠بձһÐÉÎàÌñÉ ÿÇ ÿÆ ÿÅ ÿÅ ÿÅ ÿÅ ÿÿ! ÿ ÿÿ ÿÿÿ#ö0ï>êJå Vá `Ý iÙ qÕ yÓ Ñ ˆÏ Í–ËʥȮƹÄÈÂß¾ò»ÿ¹ÿ·ÿ¶ÿ¶ÿ¶ÿ¶ÿÿ%ÿ#ÿ#ÿ$ÿ! ýñè'á5ÚCÓOÎYËcÈkÅsÃ{Á‚À‰¾¼˜» ¹©·´µ´Ö°í­ü«ÿ©ÿ©ÿ¨ÿ¨ÿ¨ÿÿ(ÿ'þ*ï*ç'ç" äÙÏ-É<Ä I¿ S¼!]¹!e·"mµ"t³"|±"ƒ°"Š®"’¬#›«#¤©#¯§#¼¦$Σ$è %ùž%ÿ%ÿœ%ÿ›%ÿ›%ÿ›%ÿÿ,ÿ-í2â4Ú3Ó.Ò% É%Á''»)6¶*C²+N¯+W¬+`ª+g¨+o¦+v¤+}£+„¡+Ÿ+•ž+Ÿœ+ªš+¶™,Ç—,â”-õ’-ÿ‘-ÿ.ÿ-ÿ-ÿ-ÿÿ0ò3ä:Ö=Ì<Ç9Ã1½.µ0!°20«3=§3I¤3R¡3ZŸ3bœ3iš3p™3w—2•2‡“2’2š2¥Ž2±3‹3܉4ò‡4ÿ†4ÿ†4ÿ…4ÿ…4ÿ…4ÿü3ë:ÜAÍDÃD½A¸;²7«8¥9+¡:8;Dš;M—:V”:]’:d:kŽ9rŒ9zŠ9‚‰9‹‡9•…9 ƒ9­‚9¼9Ó:î}:þ|;ÿ|;ÿ|;ÿ|;ÿ|;ÿô7å@ÒGÅJ¼KµI¯C©> ¢?@&˜A4”A?‘AIŽAQ‹@Y‰@`‡@g…?mƒ?u?}>‡}>‘{>œ z>© x>¸ w?Í u?ê t@üt@ÿt@ÿs@ÿs@ÿs@ÿñ;ßEÌL¿O¶P®O§J DšE•F"F0ŒG<‰FE†FNƒFUE\~Ec|DjzDqyDywD‚uC sC™ qC¦ pCµ nDÉ mDç mEú lEÿlEÿlEÿlEÿlEÿì?ØIÇP»T±U©T¡P™J’IJ‰K,…L8‚KBKJ|JRyJXwJ_uIfsImqIvoHmHŠ lH– jH£ hH² gHÅ fIä fIø fIÿ fJÿfIÿfIÿfIÿèCÒMÂS·X­Y¤XœU“NŒN‡O‚O)P5{P?xOGvOOsNUqN\oMcmMjkMriM|gL‡ eL“ cL  bL¯aMÂ`Má`Mö `Nÿ `Nÿ `Nÿ`Nÿ`NÿãGÍP¾W³[ª]¡]˜ZS†R €S|S%yT1uT<sSDpSLmRSkRYiR`gQheQpcQyaQ„ `P‘ ^Pž \P­[QÀZQÞZQõ ZRÿ [Rÿ [Qÿ[Qÿ[QÿßJÉS»Z°_¦aa”^ˆW€V zWvW"sX.pW9mWAjWIhVPfVWdV^bUe`Um^Uw\U‚ ZUŽ YUœ WU«VU¾UUÛUUó UUÿ VUÿ VUÿ VUÿVUÿÛMÅW¸^­b£ešecƒ\{[u[q[n\+k\6h[?e[Gc[NaZU_Z\]Zc[ZkYYuWY€ UYŒ TYš RYªQY¼PYØPYò QYÿ QYÿ QYÿ QYÿQYÿÔQÂZ´aªf h—iŒg}`u_o_k_h`(f`3c`<a`D__L\_S[_ZY_aW^iU^sS^~ Q]Š O]™ M]¨ L^ºK^ÔK^ñ L^ÿ L]ÿ L]ÿ L]ÿL]ÿÏT¾^±e§jm”m‰lxeodidedbd%`e0^e:\eBZeJXdQVdXTd_RdgPcqNc{ Lcˆ Jc— Hc¦ Gc¸ FcÑ Fcï Fbÿ Gbÿ Gbÿ GbÿGbÿÊXºb®i£nšqr„qtkiici _i\j!Zj-Xk6Vk?UkGSjNQjUOj]MjeJinHiyFi† Di• Ch¥ Ai· @iÏ @hî Ahÿ Agÿ AgÿBgÿBgÿÅ]¶fªm s–v‹w€vpreq\pXpVpTq(Rq3Pq<OrDMqKKqSIqZGqbEplCpwAp„?p“=o£ ;pµ ;pÍ :oì ;nþ;nÿ;mÿ;mÿ;mÿ¿b±k¦sy’{‡|{|mz`xVwPwNxLx$Ky.Iy7Hy@FyHDyOByWAy`?xi‚C=‚K;‚S9‚\7‚f5‚q3‚1Ž0Ÿ.±-È-é-ü-~ÿ-}ÿ-}ÿ-}ÿ³n¨x’ƒˆ†}‡pˆc‰UŠKŠAŠ;‹9‹8Œ"7Œ,6Œ54Œ=3ŒF2O1X/b-Œn+Œ{*Œ‹(Œœ&Œ¯%ŒÆ%‹è%Šû%ˆÿ%ˆÿ%‡ÿ%‡ÿ­v£€—…‰‚ŒvŽi\’P“D”:•1–-—,—+—$*—-)—6(˜?'˜H&˜R%˜\#˜h"˜w ˜‡˜™˜¬˜Ã—å•ú”ÿ“ÿ“ÿ“ÿ§œ†‘‹‡z’m•a˜U›I=ž3Ÿ*¡!£ ££¤$¤-¤6¤?¤J¤U¥a¥p¥¥”¥¨¥¿¤â¢ø¡ÿ ÿ ÿ ÿ †•ŒŒ‘•qšdžX¡L¤@¦5§*©"¬®° ±±±"±+ ±5 ±@ ±K ±X ±g±x±‹± °µ°Ð°ï¯þ®ÿ®ÿ®ÿ˜Ž“‚˜ug¢Z§N«A­5¯+±!´¶¹ ¼¾ ½½¾"¾+¾6¾A¿N¿\¿m¿€¾•¾ª¾Â½ä½ö½ÿ½ÿ½ÿ’”…šx j¦\«O°B³5¶*¸ »¾Á ÄÇÉÉ ÉÊË"Ë+Í5ÎAÎPÏ`ÏrχÏϳÏÎÏëÎøÎþÎþˆ›z¢l¨^¯PµB¹5¼)¿ÂÆÉÌÐÓÕÖØ ÙÛÜÞ(à4âAâQãcãwäŽä¤äºåÔåêåóåó|£nª`²Q¹C¾5Â(ÆÉÍ ÑÕÚÞáâäåç éëíï$ò1ôAôSõfõ|ö“ö©÷¼÷Î÷ß÷ßp¬a´S»EÃ6Ç'ÌÐÕ Ûßâåéìíðñóõ÷ úüÿ!ÿ.ÿ@ÿSÿhÿ€ÿ–ÿ¨ÿ¶ÿ¿ÿ¿ÿ ÿ ÿÿÿ$ÿ.ÿ<ÿJÿVÿcÿmÿwÿÿ‡ÿŽÿ”ÿšÿ ÿ¦ÿ¬ÿ´ÿ½ÿÉþÝýíüúûÿúÿùÿúÿúÿúÿúÿÿÿ ÿÿÿÿ*ÿ7ÿEÿRÿ^ÿiÿrÿ{ÿ‚ÿ‰ÿþ–ýœü¡û¨ù¯ø¸öÃôÒóçòöðÿïÿðÿïÿïÿîÿîÿÿÿÿ ÿÿÿ%ÿ3ÿ@ÿMÿYÿdýmûvù}÷„õ‹ô‘ó—ñð£îªì³ê½èËçáåñãýãÿâÿáÿáÿàÿàÿÿÿÿ ÿÿÿ ÿ-ÿ:ÿGùSõ^òhðpíxëé…èŒæ’å˜ãŸá¦ß®Ü¸ÚÅÖÙÔìÒùÑÿÏÿÎÿÎÿÎÿÎÿÿ ÿÿÿ ÿ ÿÿ&ü4ôAíMéXæbãjàrÞyÛ€Ù†Öӓњϡͪ˳ɿÆÐÅèÃöÁÿÀÿ¿ÿ¿ÿ¿ÿ¿ÿÿÿÿÿÿ ÿù ð,æ9àFÜQÖ[ÒdÏlÌsÊzÈÆ‡ÅŽÃ–Á¿¦½°»¼¹͸ åµ ÷³ ÿ± ÿ° ÿ°ÿ¯ÿ¯ÿÿÿÿúõö ëâ "Ø 1Ð >Ë JÇ UÄ^Áf¿m½t»{¹‚·ж‘´š²£°­¯º­ʪå§÷¥ÿ£ÿ¢ÿ¢ÿ¢ÿ¢ÿÿ"ÿ ð#æ$à!ÜÛ ÐÈ)Â7½D¹NµW³`°g®n¬u«|©„¨Œ¦”¤ž£¨¡´ŸÅžßšó˜ÿ—ÿ–ÿ•ÿ•ÿ•ÿÿ&ô'æ-Ú/Ï-Ê'ÇÁº"´1¯ =«!H¨"R¦"Z£#b¡#i #ož#wœ#~›#†™$—$™–$£”$°’%¿‘%ÖŽ&ïŒ'ÿ‹'ÿŠ'ÿ‰'ÿ‰'ÿ‰'ÿú)ì0Ý6Í8Ä7¾2º+µ%®'¨)+¤*8 *C+Lš+U˜+\–+c”+j’+q,x,,Š‹,”Š,Ÿˆ,«†,º…-΃.ê.ü€.ÿ.ÿ.ÿ~.ÿ~.ÿô.ä7Ò=Å?»?´<¯5©/ £/ž1&™23–2>’3H3P3X‹3^‰3e‡3l†3s„3|‚3…€33š}3§|3µz3Éy4æw5ùv5ÿu5ÿu5ÿu5ÿu5ÿð3Ý=ÊC¾EµF­C¦= 6™6”8!9.Œ99‰9C‡9L„9S‚9Z€9a~9h|9oz9wy9€w9‹u9–t9£r9±q9Äo:ân:÷n;ÿm;ÿm;ÿm:ÿm:ÿê9ÕBÄH¹K¯K§IŸD˜>‘<Œ=ˆ>*„?5??~?H|?Oz?Vx?]v>dt>kr>sp>|o>‡m>“k> j>®i?Àg?Þg?õf@ÿf@ÿf@ÿf?ÿf?ÿå=ÏF¿L´OªP¢O™J‘DŠA „B€C&}D2zD<wDDuDLrDSpCYoC`mCgkCoiCyhCƒfCdCcC«aC½`DÙ`Dó`Dÿ_Dÿ_Dÿ`Dÿ`DÿàAÊJ»P°S§UžS•O‹IƒG }GyG"vH.sH8qHAnHIlHPjHVhH]fGdeGlcGvaG€`G^Gš\G©[H»ZHÔZHñZIÿZIÿZHÿZHÿZHÿÛDÆM¸S­W£YšX‘T†N}KwKsLpL+mL5kL>hLFfLMdLSbLZaLb_Lj^Ls\K~ZKŠXK˜WL§VL¹ ULÑ TLïTMÿULÿULÿULÿULÿÕHÂQµWª[ \—\YSwOqOnPjP(hP2eP;cPCaPJ_PQ]PX\P_ZPgXPqWP{UPˆSP–RP¥PP· PPÎ OPíPPÿPPÿPPÿPPÿPPÿÐK¿T²Z§^`”`‰]|WrTlShTeT$bT/`T8^T@\THZTOYTVWT]UTeTTnRTyPT†NT”MT¤KTµKTÌ JTëKTþKTÿKTÿKTÿKTÿÌN»W®^¤bšd‘d†bw[mXfX bX_X"]Y,[Y6YY>WYFVYMTYTRY[QYcOYlMYwKX„IX’HX¢GY³FYÊEYêFYýFXÿFXÿGXÿGXÿÇR¸[«a¡f˜hŽiƒgr`h^a] \]Z]W])V^3T^;R^CQ^JO^RN^YL^aJ^jH^uF^‚D]C^ A^±@^È@^è@]üA]ÿA]ÿA\ÿA\ÿÃV´_¨fžj•mŠmlogdd[bVbTbRc%Pc/Nd8Md@KdHJdOHdWFd_EdhCdsAc?cŽ=cžr@=rH;rP:rY8rc6rm4rz3r‰1rš/r¬.rÁ.rã.qø.pÿ.oÿ.oÿ.oÿ³f§ov“zˆ|~}r}d|W{LzBy)…G(†P'†Z&†f$†s#†ƒ!†• †§†¼†Þ„õ‚ÿ‚ÿÿÿ¨tž}“‚‰…~ˆqŠe‹XŒL@Ž6Ž,% #"!% ‘.‘6‘@‘I‘T‘`‘n‘~’’¤‘¹‘ØôŽÿÿŒÿŒÿ£}˜ƒŽˆ„Œwi‘]“P•E—9˜.™%š› $-ž7žAžLžXžg žw žŠ ž ² Ì œì ›þ šÿ ™ÿ ™ÿœ„‘ŠˆŽ{’m–`™TœHŸ< 0¡&£¥§© « ªªª$ª.ª8ªDªPª^ªnªª•©ª©Á¨ä¨ö§ÿ§ÿ§ÿ•‹Œ•qšcžV¢J¦=¨1ª&«­°² µ¶ ¶¶··%·/¸9¸F¸T¸d¸v¸‹· ·¶·Ó¶ï¶ü¶ÿ¶ÿ’‚—tf¢X§K¬>¯1±&³¶¸ »¾Á ÃÄÄÅ$Æ.È:ÉGÉWÉiÉ}ɔȪÈÃÈäÈôÈýÈý…™wŸh¦Z«M±?µ1¸%º½À ÃÇÊÍÎÏÐ ÑÓÕ×"Ú-Ý9ÞIÞZßn߅ߜ߲ÞËÞæßôßôy¡k¨\¯Nµ@»1¾$ÁÅÈ ÌÏÓÙÜÝßáâä æèê í+ð:ñKñ^òsó‹ó¢ó¶óÉóáóámª^±P¹A¿2Ä$ÈÌÐÕÚÞâæéêìîðòôö ùüÿ)ÿ:ÿMÿbÿxÿÿ£ÿ³ÿÁÿÁÿÿÿÿÿ!ÿ+ÿ9ÿGÿTÿ_ÿjÿsÿ{ÿƒÿŠÿÿ–ÿ›ÿ¡ÿ¨ÿ¯ÿ¸ÿÄþÕüêûøúÿùÿøÿøÿöÿóÿñÿÿ ÿÿÿÿÿ'ÿ4ÿBÿOÿ[ÿeÿnÿvÿ~ÿ…þ‹ý‘û—úø£÷«ö³ô¾óÌñãïóîÿíÿìÿëÿìÿìÿëÿÿ ÿ ÿÿÿÿ"ÿ/ÿ=ÿJÿUý`úiøqöyôó†ñŒï’î˜ìŸë¦é®ç¸åÅãÚáíßûÞÿÝÿÝÿÝÿÝÿÝÿÿ ÿ ÿ ÿ ÿÿÿ)û7øDõPòZîcìkésçzå€ã†áŒß“ݙۡ٩ղҾÐÎÎæÌöÊÿÊÿÉÿÈÿÈÿÈÿÿÿ ÿÿÿÿ÷"ï0ë=èIäTà]ÝeÙmÕsÒzЀ·ÌʔțƤĭ¸Àǽ߼ñ»þ¹ÿ¸ÿ¸ÿ¸ÿ¸ÿÿÿÿ ÿ ÿ øèã(Ý6ØBÒMÎWÊ_ÇfÅmÃtÁz¿½ˆ»¹—·Ÿµ¨³³±Â¯Ø®í¬û«ÿªÿ©ÿ©ÿ©ÿÿÿ÷ìæåÝÔ Í-È:ÃF¿P¼X¹`·gµn³u±{¯‚® Ь ’ª ›¨ ¥¦ °¥ ¿£ Ô¡ íŸþÿœÿ›ÿ›ÿ›ÿÿ÷êßÕÐÎ Ç À %º2¶?²I¯R¬Zªa¨h¦o¤v¢}¡…ŸŽ—œ¢š­˜¼—Дì’ýÿÿŽÿŽÿŽÿúî#ß(Ð*Ç'Á!½¹²­,¨8¤C¡LŸTœ\šb™i—p•w”’ˆ’©‹·Šʈç† ú„ ÿƒ ÿƒ ÿ‚ ÿ‚ ÿõ$å,Ó1Æ3¼1¶-°%¬ ¦¡ &œ!2™"=•"G“#O‘#V#]$d‹$k‰$rˆ$z†$ƒ„%ƒ%˜%¤€&²~&Å}'â{'÷y(ÿx(ÿx(ÿx(ÿx(ÿï+Ý3Ê9¾;´:­6¦/¡(›'–( ‘)-Ž*8‹+Bˆ+J†+R„+X‚,_€,f,m},u{,~z,ˆx,”v- u-®t-Àr.Ýq.ôp/ÿo/ÿo/ÿn/ÿn/ÿè1Ó:Ã?·A®A¦>ž8—1‘.Œ/ˆ0(„132=2F}2M{2Ty2[w2au2it2pr2yp3„o3m3l3«j4¼i4Õh5ñg5ÿg5ÿf5ÿf5ÿf4ÿâ6Ì?½D²G¨G D˜?9ˆ4 ƒ56$|7/y79w8Bt8Ir8Pq8Wo8^m8el8mj8uh8€g8Œe8™d9¨b9¹a:Ð`:î`:ÿ_:ÿ_:ÿ_:ÿ_:ÿÝ;ÇC¹I®K¤L›J’E‰?: {:w; t<+r<5o=>m=Fk=Mi=Sh=Zf=ad=ic=ra=}`=‰^=–]>¥[>¶Z>ÌZ?ìY?þY?ÿY?ÿY?ÿY>ÿÖ?ÃGµLªP P—OŽK„Ez@u?q@m@(kA2iA;gABeAIcAPaAW`A^^Af]Bo[BzZB†XB”WB£UC³TCÉTCéSCýSCÿTCÿTCÿTCÿÐB¿J²P§ST”SŠPJuEnCkDgE$eE.bE7aE?_EF]EM[ETZF[YFcWFlVFwTFƒSF‘QF¡PG±OGÇNGçNGûNGÿNGÿOGÿOGÿÌF»N¯T¤WšX‘W†T{NpJiH eHbI!_I+]I4[I<YICWIJVIRUJYTJaRJjQJuOJNJLKŸKK°JKÅIKæIKúIKÿJKÿJKÿJKÿÈI¸Q¬W¡[˜\Ž\ƒYvSkNdM _L\MZM(XM1VM:TMASNHRNOPNWON_MNhLNsJOIOGOFO®EOÃDPäDOùEOÿEOÿENÿENÿÄLµU©[Ÿ^•`‹`€^rWgS^QYQWQTQ%RR/QR7OR?NRFMSMLSUJS]ISfGSpES}DS‹BS›AT¬@TÁ?Tâ?Tø@Sÿ@Sÿ@Sÿ@RÿÀP²X¦^œb’eˆe}bn\cYYVTVQVOV"MW,LW4JW<IXDHXKGXSEX[DXdBXn@X{?X‰=X™^a<^l;^x9^‡7^—6^©5^½4_Ý4^õ5]ÿ5]ÿ5\ÿ5\ÿ¸Yªa g–lŒnnvlgi\fQdHb DbBbAc$?c->c5=d=s4r 1s0s/s#.s+-t4,t<+tD)tM(uW'uc%uo$u"u!u¢ u·uÒtñsÿrÿ qÿ qÿ©kžs”yŠ|€~tgZM~C~8}/}(} &}$}#~%"~-!~6!~?HR^kzŒŸ³Î~ï|ÿ{ÿ{ÿ{ÿ¤ršz…‚{„m†`‡T‡Hˆ<ˆ2ˆ(ˆ ˆ‰‰‰Š&Š.Š7ŠAŠL‹X‹e‹u‹‡Š› Н ŠÈ ‰ê ‡ü‡ÿ†ÿ†ÿŸ{”Š…€ˆs‹eYLA’4’*’!“”–— — — —& —/ —9 —D—P—^—n–€–”•¨•¾”à”ô“ÿ’ÿ’ÿ˜‚Žˆ…Œwj’]•P˜Dš8›,œ"ž  ¢£ ££££'£1¤<¤H¤V¤e£w£‹£ ¢¶¡Ò¡ð û ÿ ÿ‘ЉŽ{’m—`›SžF¡9£-¤#¦¨ª ¬®¯¯ ¯°° ±(±2²>²L²[²l²±—±¬°Æ°è¯÷¯ÿ¯ÿŒ•qšcŸU¤G¨:ª-¬"®°³ µ¸»»¼¼ ½¾¿À'Á2Â@ÃOÃ`ÃtËáøÂ×ÂïÂúÁþ—se£W¨I­;±-³!¶¹»¾ÁÅÇÈÉÊË ÍÎÐÓ&Ö2ØAØSÙfÙ|Ù”Ù«ÙÃÙáÙðÙôvŸg¦Y¬K²<·.º!½À ÄÇÊÎÒÕÖÙÛÝßá ãæé$ì2íCîVïkï„ïœï²ïÆïÝïäj¨[¯L¶>¼/À ÄÈ ÌÐÔÙÞâåæèéìîðò õøü#ÿ3ÿFÿZÿqÿ‰ÿŸÿ±ÿÀÿÆÿÿÿÿÿÿ(ÿ7ÿDÿQÿ\ÿfÿoÿwÿ~ÿ…ÿ‹ÿ‘ÿ—ÿÿ¤ÿ«ÿ´þ¿ýÎûæùöøÿ÷ÿ÷ÿ÷ÿðÿìÿéÿÿÿÿÿÿÿ$ÿ2ÿ?ÿLÿWÿaÿjÿrÿyý€ü†úŒù’ø˜öŸõ¦ô®ò¹ðÆîÞíðëþêÿéÿéÿçÿãÿàÿÿÿ ÿ ÿ ÿÿÿ,ÿ:ÿFþRû\øeõlótñzïî‡ìê“éšç¡æ©ã³á¿ßÐÝéÚùÙÿ×ÿÕÿÕÿÕÿÔÿÿ ÿÿÿ ÿÿû&÷4ô@òLîVê_çgänâtà{Þ܇Ú֔ԛѣϭ̸ÊÇÈàÆóÅÿÃÿÃÿÃÿÃÿÃÿÿ ÿÿÿÿ óîê-æ:âEÞOÙXÔ`ÑhÎnÌtÊ{ÈÆ‡ÄŽÂ–Àž¾§»²¹À·Ôµì³û³ÿ²ÿ²ÿ±ÿ±ÿÿ ÿÿ÷ôç àÚ%Ó2Î>ÊIÆRÃZÀa¾h¼nºt¸{¶´ˆ²°™®¢¬­ªº¨Ë¦æ¥÷¤ÿ£ÿ¢ÿ¢ÿ¢ÿÿû ïæ ß ÚÐÉÄ*¿7»B·K´T²[¯b­h«n©u¨{¦ƒ¤‹¢” žž¨œµ›Æ™â˜ô–ÿ• ÿ” ÿ” ÿ” ÿüñãÖÌÇÄ ½·!².®:ª D§ M¤ U¢ \  bž iœ o› v™ ~— †– ” š’ ¦‘ ³ Åâ‹ö‰ÿˆÿ‡ÿ‡ÿ‡ÿöç Ö$È%¿"¹´± ª¥'¡3>šG˜O•V“\‘ciŽpŒx‹‰‹‡–†¢„°ƒÁÝô}ÿ|ÿ|ÿ{ÿ{ÿï!Ý)Ê-¾/µ,®'¨ £ž™!”-‘8ŽA‹I‰P‡W…^„d‚k€s|}†|‘zžx«w¼v Ôt!ðr!ÿq"ÿq!ÿq!ÿq!ÿè(Ò0Â5·7­5¥1ž+˜#’ ‰!'†"2ƒ#<#D~#K|$R{$Yy$_w$fv%nt%ws%q&o&™n&§m'¸l'Îj(íi)ÿh)ÿh)ÿh(ÿh(ÿá.Ë6¼;±=§=Ÿ9—3-ˆ' ƒ'("|)-y*7w*?u*Gs+Nq+Tp+[n+bl+jk,ri,}h,‰f-–e-¤d.´c.Êa/é`/ý`/ÿ`/ÿ`/ÿ`.ÿÚ4Å<·A¬C¢C™@:ˆ4€.z-w.s/)q03o0;m0Ck1Ji1Qg1Wf1^d1fc2oa2y`2…_2’]3¡\3±[4ÆZ4æY5ûY5ÿY4ÿY4ÿY4ÿÒ8À@³E¨HžH•F‹@‚;y5s3o4l4%i5/g57e6?c6Fb6M`6T_6[]7c\7k[7vY7‚X8V8žU8¯T9ÃS9äS:ùS9ÿR9ÿS9ÿS9ÿÍ<¼D¯I¤LšL‘K‡F}@s;l8 h9e9"c:+`:4^:<]:C[:JZ;PX;XW;`V;hUÁM>áM>øM>ÿM>ÿM=ÿM=ÿÉ@¸H¬M¡P—QŽO„KyEn@f= b=_=\>(Z>1X>8W>@U?FT?MS?UR@]P@fO@pN@|LAŠKAšJA«IB¾HBÞHBöHBÿHBÿHAÿHAÿÅDµK©PžT•T‹S€PuJjFaB\AYBWB%UB.SB5QB=OBCOCKNCRMDZKDcJDnIEzGEˆFE˜EF©DF½CFÜCFõCFÿCFÿCEÿCEÿÁG²O¦TœW’XˆX~UqOfJ\FWFTFQF"OF+NF3LG:KGAJGIIHPHHXGHaEIlDIxBI†AI–@J§?J»>KØ>Jó>Jÿ>Iÿ?Iÿ?Iÿ½J¯R£X™[]†\{YmSbOWLQJ NJLKJK(IK0GK8FL?ELFDLNCMVBM_@Mj?Mv=N„RT2]F1^N0^W/^b-^n,_}*_Ž)_ (_³'_Ì'_í'^ÿ']ÿ(]ÿ(\ÿ­\¢d˜jŽnƒoyonn`kTiIg?e5c 2c0c/d!.d)-d1,d9+eB*eJ(eT'e_&fk$fz#f‹"f f±fÉfë eþ dÿ cÿ!cÿ©bžj•pŠs€uuuit\rOqDo:n0m)l 'l&l%m$$m,#m4"m=!nF nPn[ngnvn‡ošo®oÆnémülÿkÿkÿ¤išqv†y|{q{d{WzJy?x5x+w"vvwww&w.w7x@xJxVxcxrxƒx—x«xÃwævúuÿuÿtÿŸq•x‹|‚wj‚]‚P‚D‚8‚.‚$‚‚‚ ƒƒƒƒ'ƒ0 ƒ9 ƒD ƒP ƒ] ƒlƒ~ƒ‘‚¥‚»Ûò€ÿÿÿšy~†ƒ}…o‡b‰UŠI‹=Œ1Œ&ŒŽ  )2=IVevŠŽŸŽ´ÏŒîŒû‹ÿ‹ÿ”€‹…‚‰tŒfY‘L“@•4–(–—˜š ›œ œœœœ"+5@N\nœœ—œ¬›Æšè™ù™ÿ˜ÿŽˆ†Œxj”\—OšB6ž)Ÿ¡¢¤¦¨©© ©©ªª"«+¬6¬D¬S¬c¬w«Ž«¤«¼ªÞ©ô©ý©ÿ‰Ž{“m—_œQ D¤6¦*¨©« ®°²µµµ¶ ·¸¸º!»+¼8½G½X½k½½™½°½Ì¼ê¼÷»þ~•p›b S¥Fª8­*¯±´ ·¹¼¿ÂÂÃÄÆÇ ÈÊÌ Ï+Ð:ÑKÑ^ÒsÒ‹Ò¤Ó»ÓØÓíÓösd£V©G¯9³*¶¹¼ ¿ÃÆÉÍÏÐÒÔÖÙÛÞáäè*è<éOédê|ë•ë¬ëÂìÕìåf¦X¬I³;¹+¼ÀÄ ÈÌÏÓÙÝàáãåçêìîñ õøû+ý>þSþjÿƒÿ›ÿ®ÿ¾ÿÊÿÿÿÿÿÿ&ÿ4ÿAÿMÿXÿbÿkÿsÿzÿÿ‡ÿÿ“ÿ™ÿ ÿ§þ¯üºúÉùáøó÷ÿöÿõÿñÿéÿäÿáÿÿÿ ÿ ÿÿÿ!ÿ.ÿ<ÿHÿSÿ]ÿfþmüuû{ù‚øˆ÷Žö”ô›ó¢ñªï´íÁëÕêìèüçÿåÿæÿàÿÙÿÔÿÿ ÿÿÿ ÿÿÿ)ÿ6ÿBûN÷Wô`òhïoívì|ê‚èˆçŽå•ãœá¤ß®Ý¹ÚÊ×äÔöÑÿÐÿÐÿÏÿËÿÇÿÿÿÿÿÿ úö#ó0ð<íGéQåZâbßiÝoÚvØ|Ô‚ÒˆÐ͖˞ɨdzÅÁÂØÀï¿þ¾ÿ½ÿ¼ÿ¼ÿ¼ÿÿÿÿÿôíèã)ß5ÛAÖKÑTÍ\ÊcÈiÆoÃuÁ{¿‚¾ˆ¼º˜¸¢µ¬³¹±Ë¯ç®ø¬ÿ«ÿ¬ÿ¬ÿ«ÿÿÿöîçß ÖÏ"Ê.Ç:ÃDÀM¼U¹\·cµi³o±u¯{­‚«Š©’§œ¥¦£³¡ÃŸÞžòÿœÿœÿ›ÿ›ÿÿö é ß ÕÎÆÀ»'·2³=°F­OªV¨\¦c¤h¢o¡uŸ|„›™——¢•®“½‘ÓíüŽÿÿÿÿùêÜÍľ º ´®ª*¦5¢? HP›V™\—c•i“o‘vŽˆŒ’Šžˆª†º…Ï„ ë‚ ü ÿ€ ÿ€ ÿ€ ÿñàÍ Á!¸±¬¨ ¢ #™ .• 8“ A IŽ PŒ WŠ ]ˆ c‡ j…qƒz‚„€~›|¨{¸zÎxìvÿuÿtÿtÿtÿèÓ&Ã*¸*®(§# ›–Œ'‰2†;„C‚K€Q~W|^{eylwtv~tŠr–q¤o´nÉmèküjÿjÿjÿjÿà&Ê-¼1°3§1Ÿ,—&Š …"~,{6y>wEuLsSqYp`ngmpkzj…h’g e °d!Åc!äb"úa"ÿa"ÿa"ÿa"ÿ×,Ã4¶8ª9¡8˜5/ˆ(€!{ w!t"'q"1o#9m#Ak#Hi#Nh$Uf$[e$cc%kb%ua%_&Ž^&]'­[(Á[(àZ)÷Y)ÿY)ÿY)ÿY(ÿÏ2¾9±=¦?œ?“<Š60y*r&n'k(#i(,f)5e)<c)Ca*J`*Q^*W]*_\+hZ+rY,}X,‹V-šU-ªT.½S.ÜR/õR/ÿR.ÿR.ÿR.ÿÊ6º=­B¢D˜DA…<{7r1k, g-d-a.(_.1].9\/@Z/FX/MW/TV0\U0dS1nR1zQ1ˆP2—N2¨M3»M4ØL4óL4ÿL4ÿL3ÿL3ÿÆ:¶B©FžI•I‹GBw=m7d2 `2]2Z2%X3-V35U3<S4CR4JQ4QP4YO5aM5lL6wK6…J7•H7¦G8¸G8ÓF8ñF8ÿF8ÿF8ÿF7ÿÁ>²E¦JœM’MˆK~GsBi=_7Z6W7T7"R7*P72O89M8@L8GK8NJ9VI9_H:iG:uE;ƒD;“C<¤B<¶A=ÐA=ðA=ÿA<ÿA<ÿA<ÿ¾B¯I£N™PQ…P{LoFeBZ=T;Q;O;M;'K;/I<6G<=G\C>gB?s@???‘>@¢=@µCe=Cq;C:D9D 8E³7EË7Eì7Eÿ7Dÿ8Dÿ8Cÿ·I©PžU”X‹Y€XvVhP]LSHJE FDDDBD"AE)?E1>E8=E?I=I;J&:J.9J58K=7KD6KM4LV3L`2Ll1Mz0M‹.Mœ-N¯,NÇ,Né,Mý-Mÿ-Lÿ-Lÿ°P¤X™]a†b{ap_b[XXNUCQ;O 8O6O5O#4P+3P22P:1PB0QJ.QS-R],Ri+Rx)Rˆ(Sš'S­&SÅ&Sç&Sü'Rÿ'Qÿ'Qÿ¬U \–bfƒgxfme`aU^J[?X5V1U0V.V-V',V/+W6*W>)WG(WP&XZ%Xg$Xu#Y†!Y˜ Y«YÂYåXú Xÿ Wÿ!Wÿ¨Zb“gŠkluljk]hQeFc;`1^*] (]&]%^#$^*#^2"^:!^C _L_W_c`q`‚`•`©`À`â_ù^ÿ^ÿ]ÿ¤`™hn†p|rrrfqXnLlAk6i-g#fffff%f-g5g>gHgSh_hnhh’h¦h½hàg÷fÿeÿeÿŸg–oŒs‚vxxmx`wSvFt;s1r'qqp pppq'q/q8qBqN q[ qi qz qq¡q¶pÒpïoÿ nÿ nÿ›o‘u‡y~|t~f~Y~M~@}5}*|!||| | | ||!|)|2|=|H|U|c|t|‡{œ{±zËyëyúyÿxÿ–wŒ|ƒ€yƒl„^…Q†E‡9‡-‡#‡‡‡ ˆ‰ ‰‰ˆˆ#‰,‰6‰BˆNˆ]ˆmˆ‡•‡«†Ä…æ„ø„ÿ„ÿ~‡ƒ~‡q‰c‹VI<‘0‘$‘’“ ”•–– •–––$–.–9–F–U–e–x•Ž•¤”¼“ß“õ’ÿ’ÿ‹†ƒŠugY”L—?™2š&›œ Ÿ ¢£££ £¤¤¥%¦/¦<¦K¦[¦n¥„¥›¤³£Ð£ï¢ü¢ÿ†x‘j•\™NA 3¢&£¥§ ©«­¯°°°± ²³´µ$·0·?·P·b·x·¶©¶Â¶ä¶õµþ{“m˜_P¢B¦4©&«­¯ ²´·º¼½¾¾ÀÁ ÄÆÉ$Ê2ËCËUÌj̜̃˵ÌÎÌéÌöp›a¡R¦D«6°'²µ¸»¾ÁÄÈËËÍÎÐÒÕØ ÛÞâ$ã5äHå\æsææ¥æ¼æÓççc¤UªF°8µ(¹¼ÀÄÇËÏÔØÜÝßáãåèêíñõø%ù8ùMúcû|ü•üªü»ýËÿÿÿÿÿÿ#ÿ0ÿ=ÿIÿTÿ^ÿfÿnÿvÿ|ÿ‚ÿ‰ÿÿ•þ›ý£û«úµùÃ÷ÛöðôÿóÿòÿìÿâÿÜÿÖÿÿ ÿ ÿÿ ÿÿÿ+ÿ8ÿDÿOÿYþaüiúpøw÷}öƒô‰òñ–ïí¥ì¯ê¼èÍæèäúãÿâÿàÿÕÿÎÿËÿÿÿÿÿÿÿÿ%ý2û>÷IóSð\îcìjêqèwæ}äƒâ‰àÞ—ÜŸÙ©Ö´ÓÄÐÞÎóÌÿËÿÊÿÈÿÂÿ¾ÿÿÿÿÿû öñ í,ê8çCãMàVÜ]ÙdÕkÒqÐvÎ|̃ʉȑƙģÁ­¿»½Ï»ë¹ü·ÿ·ÿ¶ÿ´ÿ±ÿÿÿÿöîçáÛ%Õ1Ò<ÎFÊOÇWÄ^Ád¿j½p»v¹|¸ƒ¶Š³“±œ¯§­³«Å©á§õ¦ÿ¥ÿ¤ÿ¤ÿ¤ÿÿüñèàÔ ÌÇÂ*¿5¼?¸HµP³W°^®d¬i«o©u§|¥„£Œ¡–Ÿ¡­š¼˜Ò—î•þ”ÿ•ÿ•ÿ•ÿüðãÕÌž¸³#¯.«8©A¦J£Q¡WŸ]c›išo˜v–}”†’›Ž§Œ¶ŠÉˆç‡ù‡ÿ†ÿ†ÿ†ÿô äÑŽ¶±«¦¡&ž1š:˜C•J“Q‘W]ŽcŒiŠpˆw†€„‹‚–€£~±}Ä{ázõzÿyÿxÿxÿêÖÆº±ª¤ Ÿ ™•‘)3‹<ˆD†K„Q‚W]c}j{rz|x †v ’t  s ¯q Áp ßo önÿmÿmÿmÿáË#¼&±&¨$ ™“Ž ˆ „ " ,~ 5|=zExKwQuXs^qepnnwl‚kih­fÀeßdöcÿcÿbÿbÿÖ$Ã*µ.ª/ -˜("‰‚}yv's0q8o?mFlLjShYgaeidrb~a‹_™^©\¼\ØZóZÿYÿYÿYÿÍ*½1¯5¤6›4’1‰+%ysol"i+g3e;dAbH`N_U]\\d[nYyX‡V –U ¦T!¸S!ÒR"ñR#ÿR#ÿR"ÿR"ÿÈ/¸6«: <–;8ƒ2z-r&j f c!a!&_"/]"6["=Z#DX#JW#QU#XT$aS$jQ%vP%ƒO&“N'£L'µL(ÎK(îK)ÿK(ÿK(ÿK(ÿÃ4³;§?œA’@‰>9u3l-c'^&\&Y'"W'+U(2T(9R(@Q(FP)MN)UM)]L*gK*sI+€H+G,¡F-³E-ËE.ìD.ÿD.ÿE-ÿE-ÿ¾8°?¤C™EE…C{>q9g4^.X+U+R,P,'O,/M-6L-<J-CI-JH.RG.ZF/dE/pC0~B0A1ž@2±?2È?3ê?3þ?2ÿ?2ÿ?2ÿ»<­C¡G–IŒIƒHxDm>c9Z4R0 O0L0J0$I1+G12F19D1@C2GB2OA3X@3b?4m>4{=5‹<6œ;6¯:7Æ97è97ü:7ÿ:6ÿ:6ÿ·@ªFžK”MŠN€LuHjC`>V9M5 I4G5E5!C5(A5/@56?6=>6E=7M<7U;8`:8k99y89‰7:›5:­5;Ä4;æ4;û5;ÿ5:ÿ5:ÿ´C§JœN’QˆR~PsMgH\DR?H:D9A9?9>9&<9-;:4::;9;B8;J7‡1>™0?«/?Â/?ä/?ú0?ÿ0>ÿ0>ÿ±G¤M™RU†V|UqRdLYIOEE@?> <>:>9>#7>*6?15?84?@3@H2@Q1A[0Ag.Bu-B…,C—+Cª*CÀ)Dâ*Cù*Cÿ+Bÿ+Bÿ®J¡Q—VYƒZyZnWaRWNMKCG:C 6C4C3C 2D'1D/0D6/E=-EF,EO+FY*Fd)Gr(Gƒ&G•%H¨$H¾#Hà$H÷%Gÿ%Gÿ&GÿªOŸU”Z‹^_w^k\_XUUKQ@M5J0I.I-I,I$+J+*J3(J;'KC&KL%KV$Lb#Lp!L€ M“M¦M»NÝMöLÿLÿ Kÿ§SœZ’_ˆc~dtcia\^R[GXf3e)c a` ````&`.a7a@aKaX af bv b‰ a a²aËaë `ý _ÿ _ÿ›f’mˆq~suujt\sOrCp8o-n$lkkj j j j! j) j2j<kGkSkakqj„j˜j­iÆiçiøhÿhÿ—ms„w{zp{c{VzIz=y1x'wvvv v vvvv$u,u6uAuNu\ulu~t“t¨sÀsãr÷rÿqÿ’u‰z€~v€i[‚N‚A‚5ƒ)‚‚ ‚ƒ‚ ‚‚‚‚&‚/‚;‚G‚Uex€¢ºÝ~ô}ÿ}ÿ|„{„n†`ˆRŠE‹9Œ,Œ!ŒŒ Ž (2?M]p…ŽœŽ³ÐŒð‹þ‹ÿˆ„€ˆr‹dVH“;•.–"–—˜™› žžŸŸ) 5 C T fŸ{ž“ž«Æéœùœÿƒ‹uŽg’Y–K™=œ0ž#Ÿ ¢¤¦¨ªªª««¬ ­®¯±)±8±H±Z±o±ˆ± °º¯Ý¯ò¯ýx‘j–\šMŸ?£1¦#§©«®°²µ··¸¹º¼½ ¾ÀÃÅ+Å<ÆNÆbÆzƔƭÆÈÅåÅól™^žO¤A¨2¬$¯± ´·º½ÀÄÆÆÈÉËÌÎÐÓ ØÜÞ-ß@àTáká…áŸá·áÏáæ`¡R§C­4²%µ¹ ¼¿ÃÇÊÏÓÖ×ÚÜßáãæéì ðóô1öF÷\øtøù¦ù¸øÉÿ ÿ ÿ ÿÿÿÿ,ÿ9ÿEÿPÿYÿbÿjÿqÿwÿ~ÿ„þŠýü—úžù§÷±ö¾õÒóìñþðÿðÿæÿÜÿÒÿÍÿÿÿÿÿÿÿÿ'ÿ3ÿ?ÿJþTû]ùd÷kõróxò~ð„ïŠí‘ì™ê¡è«æ¶äÇâãà÷ÞÿÝÿÙÿÌÿÅÿÁÿÿÿÿÿÿ ÿü"ù.ö9óEïNìWé^æeälâràwß~݄ۋؒ՛Ҥϯ;ËÕÉïÇÿÅÿÄÿ¾ÿ¸ÿµÿÿÿÿþ÷ ñëç(ä3á>ÝHØQÓXÐ_ÎeÌkÊqÈwÆ}ĄŒÀ”¾ž»¨¹¶·Èµæ³ú±ÿ°ÿ°ÿ¬ÿ©ÿÿÿúñèà ØÑ"Í-Ê7ÆAÂJ¿R½Yº_¸e·jµp³v±}¯…­«—©¡§®¥¾¢Ø òŸÿžÿžÿžÿœÿÿ÷ëáÖË Å¿»&·1´:±C®K«R©X§^¦d¤i¢p vž~œ†š˜›–§”¶’ÊéüŽÿÿŒÿÿøéÛÌĽ¶ °« §*¤4¡<žDœKšR˜X–]•c“i‘pw€‹Š‰•‡¡…¯ƒÁà€õÿÿÿÿî Üʾµ ¯©£ž™#–,“5>ŽEŒKŠQˆW†]…cƒjqz}„{yœwªu»tÔrðrÿrÿqÿqÿãÍ¿³ª£ — ‘‰%…/ƒ7€>~E}K{QyWx]vdtkrtpn‹l˜k¦i·hÎgìfýf ÿe ÿe ÿÖÄ ¶#«#¡ ™’Œ† €|y(v0t8r ?p Eo Lm Rl Xj _h gg pe zc ‡b •` ¤_ ¶^ Î\í\ÿ[ÿ[ÿ[ÿÍ!¼(¯+¤+š)’$‰‚{u q n!k*i2g9e@dFcMaS_Z^b\k[vYƒX’V¢U´TËSìRÿRÿRÿRÿÆ(¶.©2Ÿ2•1Œ-ƒ'z!rk gda%_-]4\;[BYHXOVVU^SgRrPOŽNŸL°KÇKéJýJÿJÿJÿÁ-±4¥7š87‡4}/t)l#d^[Y!W)U0T7R=QDOKNRMZKcJnI|G‹F œE!®D!ÄC"æC"üC"ÿC"ÿC"ÿ¼2­8¡<—>=ƒ:y5o0f*^$W T Q O!%N!,L!3K":I"@H"GG"NF#WD#`C$kB$yA%ˆ?&™>&«='Á='ã=(ú=(ÿ='ÿ='ÿ¸6ª=ž@”BŠB€?v;l6b0Y*Q% M%K%I%!G&(E&/D&6C&=B'DA'K?(T>(]=)i<)v;*†9+—8+©7,¿7,à7,ø7,ÿ7,ÿ8,ÿµ:§@œD‘F‡F}Ds@h;_6U1L+G)E*C*A*%?*,>+3=+9<+A;,H:,Q9-[8.f6.s5/ƒ4/•30§20½11Þ11÷21ÿ20ÿ30ÿ±>¤D™HJ…J{IpEe@[;R6H1B. ?.=.;."9/)8//7/660>50F41O31Y22d12q03/4“.4¦,5»,5Û,5õ-5ÿ-4ÿ.4ÿ®A¢H—LNƒNyMnJbEX@N<E7=3 93736343&33-24414<05D/5L.6V-6b,7o+7*8‘(8¤'9¹&9Ø'9ô(9ÿ(8ÿ)8ÿ«EŸK”O‹RSwRlO_IVFLBB=88482818/8$.8+-92,99+:A*:J);T(;_'Ô!>ó"=ÿ#=ÿ#<ÿ¨IO’S‰VWuVjS]OSLJH@D6@/= -=+=*>!)>((>/'>7&??$?H#@R"@]!Aj AzAB BµBÑBñBÿAÿAÿ¥MšSX†[}\r[gX[TQRHN=J3G*C &C%C$C#D%"D,!D4 E<EEEOFZFhFxGŠGžG³HÎGïGÿFÿFÿ¢R—X]„`zap`e^YZOXDT9Q/N&K JJJJ!K(K0K8KBLLLWLeMuMˆMœM±NÌMîMÿLÿLÿžW”]‹bewfmfcdVaJ^?[5X+V"TR RRRR$R,R4R>SHSTSb Tr T„ T˜ T­TÅ Tç Sû Rÿ Rÿ›]‘dˆh~ktlkl_jRgEd:b0`&^][Z ZZ [ [' [0 [: [E[Q[^[m[€[”[¨[ÀZâZöZÿYÿ—dŽk„n{prrgqYpLn@l5k*i!gff e eedd#d,d5d@dLdZdid{dc¤c»bÝbôbÿaÿ“l‰q€uxwmx`wRvFu9t.t#rqq qqp ppoo&o0o;oGoTodounŠm m¶lÖkòkÿkÿŽs…x}{s}e~X~K~>~2~&}|| |}}| ||||!|)|4{@{N{^{oz„zšy±xÎwïvþvÿ‰zx‚kƒ]…O†B‡5ˆ)‡‡‡ ˆ‰ŠŠ‰‰ ‰‰‰Š"Š,Š8ŠF‰V‰h‰|ˆ”‡«†Æ…ê…û„ÿ…‚}†oˆa‹SE8‘+‘’’ “”–—˜——— ˜˜™™"š.š=™M™^™s˜‹˜£—¼–â–÷•ÿ€‰rŒdV“H–:™,š›œ žŸ¡£¥¥¥¥¦§§ ¨©«#«1«A¬S¬g«€ªšª³ªÐ©ï©ûug”Y˜Jœ<Ÿ-¢ £¥ §©«®±²²³´µ¶¸¹ »½¿$¿5ÀGÀ[ÀrÀÁ¦ÀÁ¿ã¾ój—[œM¡>¥/©!«­ °³µ¸¼¿ÁÁÃÄÆÇÉËÎÑÕØ'Ù9ÚMÛdÛ~ܙܰÜÉÜã]ŸO¥@ª2¯"²µ ¸»¿ÃÆËÎÑÑÔÖÙÛÞàäçëïð*ò?óUômôˆô¡ô¶ôÇÿ ÿÿÿ ÿÿÿ(ÿ4ÿAÿLÿUÿ]ÿeÿlÿrþxü~û„ú‹ù’÷™ö¢ô¬ó¹ñËðèîûíÿìÿáÿÒÿÉÿÄÿÿÿÿÿÿÿÿ#ÿ/ÿ;ýFúP÷Xô_òfðlïríxì~ê…éŒç“åœã¦á±ßÁÝÝÛôÙÿÖÿÏÿÄÿ½ÿ¹ÿÿÿÿÿÿ ü÷ô*ò5î@éJæRãYà`ÞfÜlÚr×xÔ~Ò…ÐΕ̟ɪǸÅÍÃëÀþ¿ÿ¾ÿ¶ÿ°ÿ­ÿÿÿÿùòëæá$Þ/Ú9ÓCÏLÌSÉZÇ`ÅfÃkÁq¿w½~»†¹Ž·˜µ£³°±Â®à¬÷«ÿªÿ¨ÿ£ÿ ÿÿÿõëáÖ ÏÊÆ)Â3¿=»E¸M¶T³Z±_°e®j¬p«w©§‡¥‘£œ ©ž¸œÎšî™ÿ—ÿ–ÿ–ÿ“ÿýñåÙÍĽ·³"°,­6©>§F¤M¢S YŸ^d›jšp˜w–€”Š‘•¢°‹Ã‰ãˆù†ÿ†ÿ†ÿ†ÿóãÑŽ¶® ¨¤ &œ/š7—?•F’L‘RX]‹cŠjˆq†y„ƒ‚›~©|»zÕxòxÿwÿwÿwÿçÑ Ã ¸ ®¨¢›–’Ž(‹1ˆ9†@„F‚L€RW}]{czkxsv}tˆq•p¤n´lÊkêjüjÿjÿjÿÚÆ¸­¤œ– Š…!~*{2y9w@uFsLrQpWn^mekniwgƒe‘cŸb¯`Ä_ä_ø^ÿ^ÿ^ÿν° ¥›“‹„ ~ yur#o+m3k:i@gFfLdRcYa`_i^s\ZYœW­VÁU áT öT ÿT ÿT ÿƶ%©(ž(”%‹!ƒ{tn if d %b -` 4^ :] @[ GZ MX TW \U dT oR {PŠOšN¬LÂLãKùKÿKÿKÿ¿&°+¤/™/-†)}$tle_\ZX'V.T5S;RBPHOPNWL`KkIxH‡F—E©D¾CßCøCÿCÿCÿº+«1 4•5‹41x+o&f ^W TQO#N*L1K7I>HDGLETD]CgAt@ƒ?”=¦<»;Û;ö<ÿ<ÿ<ÿµ0¨6œ9‘;‡:~7s2j-a'Y!Q LJHF&E-C3B:AA@H>P=Y<d;q9€8’7 ¤6 ¸5!Ö5!ô5"ÿ5!ÿ6!ÿ²4¤:™>?…?{<p8g2]-T(L"FCA?"> )= 0; 6:!=9!E8"M7"W6#b4#n3$~2$1%¢/%¶/&Ò/&ò/&ÿ0&ÿ0&ÿ¯8¢>–BŒC‚CxAn=c8Z3Q.H(@$ =#;$9$8$&6$,5%34%:3&B2&J1'T0'_/(l.({,)+* **´)*Ï)+ð*+ÿ**ÿ+*ÿ¬<ŸB”FŠG€GvElBa=W8N3D.<) 7(5(3(2(#0()/)0/*7.*?-+H,+R+,]*,j(-y'-‹&.ž%.³$/Í$/î%/ÿ%/ÿ&.ÿ©?E’IˆK~LtJjG^BT=K9A48/2- 0-.--- +-'*..).5)/=(/F'0O%0[$1h#1w"2‰!23±3Ë3í3ÿ 3ÿ!2ÿ¦CšIM†O|PsOhL\FRCI??;66.2 +2)2(2&2$%3+$32#4:"4C!5M 5X6e6u7‡7›7¯8È8ë8ÿ7ÿ7ÿ£G˜MŽQ„S{TqSfPZLPIGE=A3=*9 %7#7"8!8" 8(80989A:K:V;c;r;…<™<­=Æ=é<ý<ÿ;ÿ K•Q‹U‚XyYnXdVXQNOEK:G0C'@ > >>>>%>-?5?>?H@S@`ApA‚A—A¬BÄBçAüAÿ@ÿP“V‰Z€]v^l]b[VWLUAQ6N,K#HE DDEE"E)E1E;FEFPG^ Gm G G“ G§G¾Gà Gö Fÿ FÿšU[‡`}bscjb`aS^GZUJVWVeUwU‹U U¶TÔTñSýSÿ“bŠh€lwnoocnVlIj=h2f'ecba `` ____&_/_:_E_S_a^r^‡]œ]²\Ï\ï[ý[ÿj†o}rutju]tOsBr6p+o nml lkk jjjj!i*i4i@iNi\imh‚h˜g®fÊeíeüdÿ‹q‚vzyp{b{U{Hz;z/z#yxw wwwwv vvvv#v.u:uGuVuht|t’sªrÄqépûpÿ†y}vhZ‚L‚?ƒ2„%ƒƒƒ ƒƒ„…„ƒƒ ƒƒ„„&„2„?ƒOƒ`‚u‚Œ¤€½ã~ù~ÿ‚€z„l†^ˆPŠB‹5'Ž Ž‘’’’’’’ ’““”(”6”E“W“k“‚’œ‘¶Øóÿ~‡pŠaSE“7•)–—˜ ™›œž    ¡¡¢ £¤¥¦*¦:¦L¥`¥x¥’¤¬¤É£ë¢úsŽd‘V•G™9œ*ž ¡£¥§©¬®®®¯°±²³µ ·¹¹.º@ºT»jº…¹¡¹»ºÞ¹òg•X™Jž;¢,¦¨ª¬¯±´¸»¼¼¾¿ÀÂÄÆÈË ÏÑ Ñ2ÒFÓ]ÔvÔ’Õ«ÕÄÔâ[L¢=§/¬¯±µ¸»¾ÂÇÊÌÌÎÐÒÕØÛßâæ ëì$í8îNïgð‚ðœð²ñÅÿÿÿÿ ÿÿÿ$ÿ0ÿ<ÿGÿQÿYÿ`ýgümúsùyøö…õŒó”òð§î³ìÄëáêøéÿçÿÙÿËÿÂÿ½ÿÿÿÿÿÿ ÿÿ ÿ+þ7úBöKòSð[îaìgêmèsçyåã†áŽß–ݠ۬ػÔÑÓðÐÿÎÿÈÿ½ÿ¶ÿ²ÿÿÿÿÿý÷óï&í1è;ãEàMÜUÙ[ÖaÓgÑlÏrÍxËɇÇŚåÀ²¾Å¼åºû¸ÿ·ÿ°ÿ©ÿ¥ÿÿÿþõìå ßÚ Ô*Ð5Ë>ÈGÅNÂUÀ[¾a¼fºl¸r¶xµ€³ˆ±’®ž¬ª©»¨Õ¦ó¤ÿ£ÿ¡ÿ›ÿ˜ÿÿûðåØÎ Ǿ$».·8´@±H®N¬TªZ©_§e¥k¤q¢x ž‹œ–™£—²–Ç“è’þ‘ÿÿÿ‹ÿùëÝÏÆ¼µ °¬¨(¥1¢9ŸAH›N™S—Y–^”d’jqŽzŒƒŠˆœ†ª„¼‚Üö€ÿÿÿ~ÿìÚɾ¶®§ ¡œ˜"•*’2:A‹G‰M‡R†X„]‚dks}}{ˆx•v£u´sÌqípÿpÿpÿpÿßÊ ¼ ± ¨¡›” Ї$„,3:}A{GyLwRvWt]rdpmovl‚jig®eÃdäcúcÿbÿcÿп²§• ‰‚~zv%t-q4o:n@lFjLiRgXf_dgbq`|^‰\˜[©Y¼XÜXôXÿWÿWÿƶªŸ•…~ w rnjh'e.d4b;`@_F]L\SZZXbWlUwS…R”P¥O¸NÒMðMÿMÿMÿ¿°"£%™%"…}un g c_]![(Y/W5V;TASGQNPUN^MgKsI H ’G £E ¶D ÐD ïC ÿC ÿD ÿ¹$ª)ž,”,Š*€&w!nf_Y U S Q "O )M /L 6K <I BH IF QEZDdBp@?>¢<¶;Ñ;ñ;ÿ;ÿ<ÿ´)¦/š22†1|-r(i#aYQLJHF$E+C1B7A>@E>M=V<a:m9|76Ÿ5³4Í3î4ÿ4ÿ4ÿ¯.¢4—7Œ8‚6x4n.e*\$TLF B@? ='<-;49:8B7J6S5^3j2y0Š/.±-Ê-ì-ÿ.ÿ.ÿ¬2Ÿ8”;Š<€<v9k4b/Y*P%G@ <:86#5)40372>1G/P.[-g,v*ˆ)›(®' Ç& ê' þ( ÿ( ÿ©6<’?‡A}@t>i:_5V0M+D%; 6320 /&.--4, ;+ D*!N)!X'"e&"t%#…##™"$­!$Å!%è"%ý"$ÿ#$ÿ¦:š?C…E{DrCg?]:S6J1A,8&1# .","*")"#(#*'#1&$9%%A$%K#&V"&c!'r'ƒ(—(«)Ã)æ)û)ÿ(ÿ£>˜CGƒIzIpGfDZ?Q;G7>25-,( ('''%'$'!#('"(.!)6 )?*I*T+`+o,,•-©-Á-ä-ú-ÿ-ÿ¡A•G‹K‚MxMnLdIXDO@F==834*/$, !, ,--%-,.4.</F/Q0^0m11“1¨2¿2â2ù1ÿ1ÿžE“K‰O€QvRmPbNVIMFDC;?1:'62 2222"3)314:4D4O5\5k6}6‘6¦ 7¼ 7Ý 6ö6ÿ6ÿ›I‘O‡S~VuVjU`SUOLLBI8E.A$=:88899&9.97:A:L ;Y ;h ;z ; <¢<¸<Õ<ð ;ÿ ;ÿ˜NŽT…X|[r[hZ^XSUIR>N4K*G!DB@ ??? @# @+ @4 @> AJAVAeAvAŠAŸA´AÐAîAü@ÿ•TŒYƒ^y`p`f`]^Q[EW:T/Q%OLJH GGGG H(H1H;HGHSHbHsH†H›H±GÌGíGûGÿ’Z‰`€cwenfefYdL`@]5[*Y WUS RQ PPPP%P.P8PCPPP^PoPƒO˜O®NÉNëMûMÿa†f}itllmakSiFg:d/c$a_^ \\[ ZZZY!Y)Y3Y?YLYZYkX~X”W«WÅVéUûUÿŒh‚mzprrgrZqLp?n3m(kjh ggff e eddd$d.d:cGcUcfczba§`Á_æ_ú^ÿ‡otxwnx`xRwEw8v+v tssrrrqq qpppp'p3o@oPo`ntn‹m¢l¼kâjøiÿƒw|{s}e~WI</€"~~~~~~ ~ ~~~ ~+}9}H}Y|m|„{œz¶yÚxõwÿ€w‚iƒ[…M†?ˆ2‰$‰‰‰Š‹ŒŒŒŒŒ Ž"Ž/Ž?PdŒ{Œ•‹®ŠÍ‰ï‰ÿ{…mˆ^ŠPB4‘&’“”•–˜š›››››œ žŸ $ 4 F YŸpŸŠž¥žÂèœùpŒaS’D–6™'›œŸ¡£¥¨©©©ª«¬­®° ²³´'´9µM´d´~³š³´³Õ³ðd“U—G›8Ÿ)¢¤¦¨«­°´¶¸¸¹º¼½¿ÀÃÅÉÊË,Ì@ÍVÎǫ͋ÌÂÌâX›I :¥,©«®±´·º¾ÃÆÈÈÊËÍÏÒÕÙÝáæçè2éHê`ë{ë—ì®ìÂÿÿÿÿÿ ÿÿ!ÿ,ÿ8ÿCÿLþTû[úbøhönõtôzò€ñ‡ïí—ë¡é­ç½åØäóâÿàÿÐÿÄÿ¼ÿ¶ÿÿÿÿÿÿ ÿÿý'ù2õ=ñFíOëVè\æbähãnásßy݀ڈؑԛҦϴÌÉÉéÈÿÇÿÁÿ·ÿ¯ÿ«ÿÿÿÿÿøòîê"æ,á7Ý@ØIÓPÐVÎ\ÌbÊgÈmÆsÄyÂÀо”¼Ÿ¹¬¶¾´Ý³÷±ÿ°ÿ¨ÿ¢ÿžÿÿÿùïæß ÖÐÌ&È0Ä:ÀB½J»P¸V¶[µa³f±l°r®z¬‚©Œ§˜¥¥£´ ËŸîÿœÿ™ÿ”ÿ‘ÿÿöêÝÏÇÀ»· ³*°3­;ªC§I¥O£U¢Z _žek›r™{—…”’¬Ž¿Œâ‹ú‰ÿ‰ÿ†ÿƒÿôäÔÈ¿µ® ©¥¡#ž,›4˜<–C”I’NSŽY^‹d‰k‡s…}ƒˆ•¤}µ{ÏyñxÿwÿwÿuÿåÑø¯¨ š•‘Ž&‹-ˆ5†<„B‚G€MR}X{^yexmvvsqŽom®lÄjçiýhÿhÿiÿÕö«¢›” ˆƒ |'z.w5u;tArGpLoRmXk_ifgpe{cˆb—`§^»]Ü\ö\ÿ[ÿ[ÿÉ ¹¬¡— ˆ‚{ wso!l(j/h5g;eAcFbL`R_Y]a[jYuW‚U‘T¢SµQÏPïPÿPÿPÿ¿°¤™‡ wqkgda"^)]/[5Y;XAVFUMSTR\PeNpL}KIžH°GÇFéFûFÿEÿ¸ª ž"“"‰€woh a ]YVT#R*P0O5N;LAKHIOGWFaDlCyA‰@š>­=Ä<å<ø<ÿ<ÿ²"¥'™)Ž)„'{#qiaZ S OLJH$G*E0D6C=AC@K> S= ]; h: v8 ‡7 ™5 ¬4 Â3 ä3 ù3 ÿ4 ÿ­' ,•/‹/€.w*m%d \TLF C A ? > %< +; 2: 88 ?7G6P4Z3f1t0….˜-«,Ã+å,ú,ÿ-ÿª,1’4‡5}4t1j+`'X!OG@ ;976!4'3-241;0C.M-W,c*q)‚'•&©%À$ã%ú&ÿ&ÿ¦1š69…:{9q6g1]-T(L"C;5 21/.$,*+1*8)@(J'T&`$o#€!“ §¾àø ÿ ÿ£4˜:=ƒ>y=o;e7[2R-I(@#80 ,*)' &'%-$5#>"G!R ^l~‘¥¼Ýöÿÿ¡8•=‹ABwBm@c<Y7O3F.=)5$- ' %#!!$ +2;E O!\!j"{""£#º#Ú#õ#ÿ#ÿž<“A‰DFuFlDbAW<M8D4<03+*&#" !!""!"(#0#8$B%M%Y&h&y&'¢'¸'Ö(ô'ÿ'ÿœ@‘E‡H}JtJjI`FUAL>C::612(- ) ''''(%(-(6)@)K*W*f+w+‹ ,Ÿ ,µ ,Ï ,ï ,ÿ +ÿ™DI…L|NsOiN^KSGJDB@9=/8%40- ,---#-*.3.= /H /U 0c 0t 0ˆ1œ1±1Ë1ë0ü0ÿ—HMƒQzSqTgR]PRLIJ@F5B+>":74 33 3 3 4( 41 5;5F5R6`6q6„6™6¯6È6è6ù5ÿ”MŠRVxXoYeX[UQRGOýHúP÷Wõ]ôcòiðoïtí{ëé‰è’æœä¨â·ßÍÜîÙÿÙÿÊÿ¾ÿµÿ°ÿÿÿÿÿÿÿüø#ô.ð8ëBèJåQâXà]ÞcÜhÙnÖtÔ{тϋ͕ʡȯÅÁÂãÀûÀÿ»ÿ°ÿ¨ÿ¤ÿÿÿÿûóí èãà(Ú2Ó<ÏDÌKÉQÆWÄ]ÂbÁg¿m½t»{¹„·Ž´™²§¯·­Ð«òªÿ©ÿ¡ÿ›ÿ—ÿÿÿôéàÕÎÉÅ"Á+¼5¹=¶E³K±Q¯V®[¬aªf©m¦t¤|¢† ’žŸœ®™Ã—ç–ÿ•ÿ’ÿÿŠÿüðãÔÈ¿¹ ³¯¬%©.¥6£> DžJP›U™Z—_–f”l’u~ŽŠ‹—‰¦‡¸…Ö„ö‚ÿÿ~ÿ|ÿíÝÌÁ¸®§ ¢žš—'”/‘7=C‹I‰NˆS†Y„_‚e€m~w|‚zxžu¯sÇrìqÿpÿpÿnÿÝɼ±©¡™“ ŽŠ‡!„)07}={ByHxMvRtXr_qgopl{jˆh—f¨e¼cábúaÿaÿaÿͼ¯¥œ”†|xu#r)p0n6m<kAiGhLfRdYc`ai_t][Y¡W´VÐUòUÿTÿUÿÁ ²¦›’ ‰‚{u plhf#c*a0`6^;]A[FZLXSV[TdRnQ{OŠM›L®KÆJêIþIÿIÿ¹ªž”Šy qke a]ZX$V*T0S6Q;PANGMNKVI_GiFvD…C—A©@¿?â?ø>ÿ?ÿ²¤˜Ž„zrjb\WSPNL%J+H0G6F<DBCIAQ?Z>e<r:9“8¥6º6Û5ô5ÿ5ÿ¬ Ÿ$”&‰&$u ld\T N JGDB @%?+>1<7;>9E8M6V5a3n1~0/£-¸,Ô,ð,ÿ,ÿ¨%›*,†-{+r'h"_WOHA >;98!6&5,322 91 A/ I. S, ^+ l) |( & ¢% ·$ Ó# ð$ ÿ% ÿ¤*˜/2ƒ2y1o.e)\$SKC<5 3 1 / . "- (+ .* 5) ='F&P$\#j"{ Ž¢·Ôòÿÿ¡/•3Š6€7v6m3c/Y*P%H ?80,*('%$$*#2":!C NZhx‹ µÑñÿÿž3“7ˆ:~;t;k8a4W/N+E&=!4-& #" !'/7AKWev‰ž³Îïÿÿœ6‘;†>|?s?i=_9U5L0C,:'2"*" $,4>IUct‡œ± Ë ìÿÿ™:?„B{DqChB^>S:J6A29-1)(%  ")2<F S a !q !… "™ "® "Ç "ç "û !ÿ—>ŒCƒFyHpHgF\DR?I;@884/0','# !!"" "'#/ $9 $D %P %^ &o&‚&–&¬&Ä&å&÷&ÿ•BŠGJxLoLeK[HPDGA?>7;-6$1-*( ' ( ( (% )- )7*B*N+\+l++”+©+Á+ã+ö*ÿ’FˆKOvQmQcPZMOJGG>D3@)< 841 / ..//#/+050?0L1Y1i1|1‘1§0¿0á0õ/ÿK†P}TuVkVbUXSNPEM:I/E%B>;9 7 6666 6)627=7I7W7g7y76¥6½6à5õ5ÿP„V|Zr[i[`[WYLV@R5N*K HFC A@ ?>>>>&>/>:>F>T>d>v=Œ=£<»<Þ;õ;ÿŠW‚\y_paha_aT^G[:W/U%RPM KJI H GGFF"F,F7FCFQF`EsE‰D D¸CÜBõBÿˆ]bwenggh[fNcAa4^)\ZWVTSRQ QPOOO'O2O?OMN]NoN…MLµKØJõJÿ…e|itlmnbmTkGi:g-e"db` _^^]\[ ZZYY"Y-Y:YHXXXkWW™V²UÒTôSÿlypsshsZrLq?p2o%nlk jjiihgff feee'd4dCdSdec{b”a­`Í_ñ^ÿ}twwny_yQyCy6x)xwv uuuvuttsss rrr r,r;qLq_qtpŽo¨nÆlíkÿ{{r~d~UG€9+‚ ‚ƒƒƒ‚‚‚‚‚‚ ‚‚‚#‚2‚CVl€†¡~½}æ|üv‚hƒY…K‡<‰.Š ‹‹ ‹Œ‘’‘‘‘‘‘’’“ ”””'”8”L“b“|“˜’³‘Øöjˆ\ŠM?0’!”• –—™›Ÿ    ¡¢£¤¥¦¨¨¨-©@©V©o©‹¨¨§Ç¦ì_P’A–3™#œ Ÿ¡£¦¨¬®¯¯°°²³´¶·º½¿¿À3ÀIÀbÀ~À›À·¿ØS—D›5Ÿ&£¥ §ª­°³¶»½À¿ÁÂÄÆÈÊÌÏÓÚÛÝ%Þ;ßSànߌݩÝÂÿÿÿÿÿÿÿÿ$ÿ/ü:ùCõKóRñYï^ídëiéoçuæ|ä„âà—Ý¢Ú±ÕÅÒèÐÿÏÿÄÿ¸ÿ¯ÿ©ÿÿÿÿÿÿû ÷óï)ê4æ=âEÞLÛSØXÔ^ÒcÐiÎnÌuÊ}È…ÆÂ›À©¾º»Ù¹÷¸ÿ´ÿ©ÿ¢ÿÿÿÿÿöîç áÜ×#Ð.Ë7Ç?ÄFÁM¿R½X»]¹b¸h¶n´u±~¯ˆ­“ª¡¨±¦È¤í¢ÿ¢ÿ›ÿ•ÿ‘ÿÿüîãØÍÆÁ½¹'µ0²8¯@¬FªL¨Q§V¥[£a¡gŸnžv›€™Œ—™”¨’¼ßŽûŽÿ‹ÿ†ÿƒÿøéÜÌÁ¸² ¬¨¥!¢)ž2œ9™?—E•J”P’UZ`g‹o‰x†„„‘‚ €²}Ì|ñ{ÿzÿwÿuÿæÓÆ»±§¡› —“#Œ+Š2ˆ8†>„D‚INS}Y{`yhwqu|s‰p˜o©m¿kæjÿiÿiÿgÿÓõ«£›’Œ ‡ƒ}$z+x2v8t=rBqHoMmSlYjahjftda‘_¢^¶\Õ[÷[ÿZÿZÿŶ©Ÿ–އ€z uqnk%i+g1f7d<cAaG_M^S\[ZdXnV{TŠR›Q®PÈOîNÿNÿMÿ» ¬   • Œƒ|unieb_]%[+Y1X6V;UASGQNPUN^LhJuH„G•E¨D¿CäBüBÿBÿ²¥™Ž„{ sle_ [WTQO%N+L0K6I<HBFHEPCYAc?o>~<;£:¸9Ù8õ8ÿ8ÿ¬Ÿ“‰uld ]VQ MJGE D&B+A1?6>=<D;K9T7_6k4z2Œ1ž0³/Î/ï.ÿ.ÿ§š"$„$z!qg_WP IE A><:!9&7,62483?1G0P.[-g+v*ˆ(œ'°&É%ê%û%ÿ¢#–(‹**w(m%d [RKC = 96310"/'--,4*;)C(M&X%e#t"† š®Æçø ÿŸ(“-ˆ/~/t.j+a&X!OG?81 .+)('#%)$ 0# 7! @ J U b r … ™ ­ Æ æ ù ÿœ-1†4|4r3h1_,U'L#D<4-& $ " !   % , 4=GSaq„˜®Æèûÿ™1Ž5„8z9p8g6]2S-J(B$91*# !)1:EQ_o‚– «  ã ú ÿ—5Œ9‚<x=o=e:[7R2I.@*7%/!(  &.8BO \ l  “¨¿àõ ÿ•8Š=€@wAmAd?Z<P8G3>06+.''# # , 5 @ L Zi|‘¦¼Ýòÿ“<ˆADuElEcDYAO=F9>652..%*%!    "*3 > J!W!g!y!Ž!¤!º!Û!ò þ@†E}HtJkJbIXFNBE?=<59+4"/+( $ ###$ $(%1%<%H&U&e&w&Œ&¢&¹&Ù%ò%þŽE„I{MsOjO`NWKMHDEO2L(HEB@=<; :999 9)949@9N9]9o8…8œ7³7Ò6ò5ÿ‡UZv]m_e_]_R\DX8U-R"OLJ HFED C BAAA&A1A=AJAZAl@?™?±>Ð=ò<ÿ„\|`scledfYdKa>^2[&YVT RQONML KKJJ"J,J9JGJVIhI~H–G¯FÍEñDÿcygrjkl`kRiDf7d*b`^ ][ZYXWVV UTTT'T4TBSRSdRyR’Q«PÊOïNÿ~jwnpqfqXpJoK=S;]9i7x6‰4œ3±2Î2ñ1ÿ1ÿ¦šŽ„zph_ XQL HDA?=!<&:,91776>4F3O1Y/e.s,…+˜*­)Æ(ê(þ(ÿ¡• Š!!ulcZR KD@ <8643!1'0,.3-:+B*K(U&a%p$"•!© Á äùÿ"‘&†(|'r%i"_WNF? 84 1.,*)"'(&.$6#>"G R^m~’§½ßõÿš'Ž+„-y-p+f(]$TKC;4 - ) &$"! $*2:DO\j|¥»Ûò ÿ—+Œ/1w2n1d.[*Q%I @81)#    ' . 7 A M Z i { ¥ » Ù ñ ÿ•/Š36v6l5c3Y/P+G&>!6.'       # + 4? J X g y¢¸Ôïÿ’3ˆ7~:t;k:a8X5N0E,='5#-&    ( 2 <HUev‹ ¶Ñîû6†;|>s?j?`=W9M6D1<.4*,&%"   &/:FSbt‰ŸµÐíûŽ:„?{BrChC_BV?L;C7;430,,$)$   $-8DQ`r‡³ÎíüŒ>‚CyFpHhH^FUDK@C=;:37*2 -)% "   " +!6!A!O!^"p"…!›!²!Í íüŠC€HxKoLfM]KTIJFBC:@/;%73/ ,)' &%&&!&)&3'?'M'\'m'‚'™&°%Ì%î$ýˆHLvPnQeR\QSOJLAI5D+@!<96 20/ .----'-1-=-J-Y-k-€,—,¯+Ë*î*þ…M}RuUlWcW[VSUGQ;M0I%FC? =:87 6 5444$4.4:4G4W4h4}3•2­1Ê1î0ÿƒS{Xs[j]b][]OZBV6R*O LIGDBA?> ==<s0r#qo nmmmmlkjiiih hhg!g/g?fRffedšc·báaüwxmz_zPzBz3{%{zyyyyzzzxxwwwwwwww&v6vIu_uwt“s¯rÓq÷q~cT€E‚6ƒ(„„ƒ„„…†ˆ‰ˆ‡‡‡‡‡ˆˆˆ‰‰‰,ˆ?ˆUˆm‡‰†§…Ç„ïf„W†Hˆ9Š*ŒŽ‘“•—˜–———˜˜™š›!3Iœbœœœœ¹›âZ‹KŽ<‘-“•–˜šœž¡¤¦§¦§§¨©ª¬­¯±³ ³´'´=µUµp´Ž´¬´ÌM’?–/š Ÿ¡£¦©¬¯³µ·¶·¸º»½¿ÁÄÇËÍ ÎÏ/ÏHÐbЀÐи  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~€‚ƒ…†‡ˆŠ‹ŒŽ‘“”•–˜™šœžŸ¡¢£¤¦§¨ª«¬­¯°±³´µ¶¸¹º»½¾¿ÁÂÃÄÆÇÈÉËÌÍÏÐÑÒÔÕÖ×ÙÚÛÝÞßàâãäæçèéëìíîðñòôõö÷ùúûüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿmft1!  !"#$%&'()*+,-./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïñòóôõö÷øùúûüýþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿ  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ƒ†‰‹Ž’•—™›Ÿ¡£¥§¨ª¬­¯°²³µ¶·¹º»¼½¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÍÎÏÐÑÒÒÓÔÕÖÖרÙÙÚÛÛÜÝÝÞßßàááâããäååææçèèééêëëììíîîïïððñòòóóôôõöö÷÷øøùùúûûüüýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷éþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÍ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿݯ–·ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅŒh§çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌœ‰¤çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúλÆõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜŽõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿“z…ÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ[=e¨öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ¼u4T›ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ”~I,NšìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØÔʳ~em¥ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÅ®¯ÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÖÆìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ滑tc«÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÄšsE&4}Ìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµ€U0 `²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏt5 R§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–4O§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöi  R±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿË;5L[ML^Ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©`6`†Ÿ¶¬©¸Ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà—¾åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÙʼÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏšmZFˆêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄ|>&T°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàƒ<.‡íÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬SmÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû€1 aÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒZ]Ìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨5\Óÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ} TÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿî}EDÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüªd/"7IXÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé¤kA(?c•§ºÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ²¬²Ìäúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿå»—wbÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛžg6 ŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈ?^ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙ9<ªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžL#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜo}ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯Hoîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„dæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìQWÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸HÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿt8Ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù¢Z#Åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß›\, ºÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï±}U9""²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿß¿¥™˜š ¬½Úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã¾€|ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò·„W0¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒŠLróÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖ6KÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú‘>/«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀZ•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç^wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´%jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}[ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý+Lëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥<áÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0 -Ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™Ša''×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿí¾‰U'%ÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÊv]J<2-,09GÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýæÝÖÒÐÓÙäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÔ»Öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç¸jK/oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿä¡g4<ÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖ‚;—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿí…1oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦BPáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìi7Éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³/"¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿy§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò4™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©ŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿFÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ—jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎcÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)"aÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹£€W7hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÓ®”†|uqprw”ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛº‚iiÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈ“e=žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛŽLnÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛ|,E×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹*"´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂD—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç6jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿFGøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé5éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–%Ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÂÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ' µÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàœŒpUB3& &¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùäØÒÎÌËÌÏÖàüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÓ¼ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒ©…eH,…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ«q<OàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ5²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãu‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕCHöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠ.Ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8Èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœ¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿº“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜ‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿhÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿB`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿz]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$fÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿɬ™‰}vqligfgkpzŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâŪ‘yawÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿݦwP, 1Äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà’NÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒp`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîo7âÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ3éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^ÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+Èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ ËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüëáØÏÌÍÏÐÒÔ×ÜâêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÚÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÆ£„hM2«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹|Fqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×|/;ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßd µÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™Kÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶0ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×çÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|iÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ× hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿiZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™IÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒ9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿX)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»/øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«)ÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉG .>Rh„íÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÕÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÒ°’w]B( JÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅ}EØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄPŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢ hÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿH¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿuƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃRÿÿÿÿÿÿÿÿÿÿÿÿÿÿç>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ3+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞ"òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèJ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ œÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿzwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿz Lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢Wht€œ«¼ÐçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒ£zX:)#Ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬RiÿÿÿÿÿÿÿÿÿÿÿÿÿÿäC4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿyãÿÿÿÿÿÿÿÿÿÿÿÿÿͲÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿO]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒ:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿOçÿÿÿÿÿÿÿÿÿÿÿÿÿÿtÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄ­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿð3šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿg†ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£rÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãD\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘Aÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËW $1?N`t‹§Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×çòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÔÍǾº·³°­©¨¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝ~S?0# Ûÿÿÿÿÿÿÿÿÿÿÿÿÿv§ÿÿÿÿÿÿÿÿÿÿÿÿÿºuÿÿÿÿÿÿÿÿÿÿÿÿÿÿFÿÿÿÿÿÿÿÿÿÿÿÿÿÿNÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒýÿÿÿÿÿÿÿÿÿÿÿÿÿÁÛÿÿÿÿÿÿÿÿÿÿÿÿÿñ¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿD¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿkÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘yÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·fÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞ!SÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿw+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖMýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§.Õÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜*-E`àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ctœ«»ÍâúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçË·©•މ„€|xtplheÿÿÿÿÿÿÿÿÿÿÿÿÿ¼jH- 1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBÜÿÿÿÿÿÿÿÿÿÿÿÿÿ޲ÿÿÿÿÿÿÿÿÿÿÿÿÿÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)kÿÿÿÿÿÿÿÿÿÿÿÿÿÿZNÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿú=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿñNØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌC¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘zÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòt _ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèt,8ESbr…›´Òõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×èôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû÷óñîìëëìñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙ²™‡ymd]VQKFA<82-(#ÄÿÿÿÿÿÿÿÿÿÿÿÿÿK% ’ÿÿÿÿÿÿÿÿÿÿÿÿÿˆfÿÿÿÿÿÿÿÿÿÿÿÿÿ×=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉ öÿÿÿÿÿÿÿÿÿÿÿÿÿñ5ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[Ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍC@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØ^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿N,>Rj†¥ÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂ|Œš§¶ÅÖèýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîá×ÏÉþº¶±­©§¦¦§®ÿÿÿÿÿÿÿÿÿÿÿÿÿ¾†m[L@7/(" ÿÿÿÿÿÿÿÿÿÿÿÿÿ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4öÿÿÿÿÿÿÿÿÿÿÿÿÿvÒÿÿÿÿÿÿÿÿÿÿÿÿÿ°²ÿÿÿÿÿÿÿÿÿÿÿÿÿá$–ÿÿÿÿÿÿÿÿÿÿÿÿÿÿQ|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿyfÿÿÿÿÿÿÿÿÿÿÿÿÿÿ QÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ#<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿîK'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØLÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥8 4NkŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™9CQ_n}Ž µËåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë̹¬¡™‘‹†|xtpkhffhñÿÿÿÿÿÿÿÿÿÿÿÿÿaE2#žÿÿÿÿÿÿÿÿÿÿÿÿÿ~uÿÿÿÿÿÿÿÿÿÿÿÿÿÃRÿÿÿÿÿÿÿÿÿÿÿÿÿû72ÿÿÿÿÿÿÿÿÿÿÿÿÿÿjÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿæBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹,ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿè\Ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜.)FfÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿî (7FWi~•¯Ìîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç ª¹ÈØéüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýõðëæâßÛØÔÒÑÐÒ×àÿÿÿÿÿÿÿÿÿÿÿÿÿΞŠ|qia[VQLHC>:62/.1ÿÿÿÿÿÿÿÿÿÿÿÿÿÒ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿBÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ° öÿÿÿÿÿÿÿÿÿÿÿÿÿÝ9ÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿbÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯"™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖH‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿriÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡(NÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓ\3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–.2Rwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàr/BXp‹¨ÈìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊon~Žž°ÃØïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùàÒÈÀºµ°¬¨¥¢Ÿ››œ §ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚dVKC<60+'" Ôÿÿÿÿÿÿÿÿÿÿÿÿÿ’­ÿÿÿÿÿÿÿÿÿÿÿÿÿÌ‹ÿÿÿÿÿÿÿÿÿÿÿÿÿûRmÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Qÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐB#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿõh ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ7/PtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝr*AZu”¶Úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼XDTdu†š¯ÈãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÍáñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüûúûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–І‚{xvtrsuxÿÿÿÿÿÿÿÿÿÿÿÿÿëO:0(! #ÿÿÿÿÿÿÿÿÿÿÿÿÿÿiÿÿÿÿÿÿÿÿÿÿÿÿÿÿ› ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈ9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿðcÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…ìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±I9]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿå{ !8Ro³Ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»X)9IZl€—°Ííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³ž´Å×ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúïçáÜÙÖÔÒÐÐÐÑÓÙàë÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸Š~wqlhda^[YXWWY^eqÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿1 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿíVèÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚Ìÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«/³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒW›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷|…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢7+”ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËa ,PvžÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõ0 #;Wv™¾åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃc*;L_t§Æçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨–¨»ÐçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÎÅ¿¼¹¶´³±²²µ¹ÀÉÕãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ—ld^YUQOLJHGFHKPYf¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§&VÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎP:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿôy !ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ2ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄX1Z„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé'KqšÂéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§I/JhŠ®ÕüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓu&8J^u«Ëïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®r…˜¬ÂÛöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿²ª¦£¡ ŸŸ¡£¦¬´ÀÍÝìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠZSOKHFDCBABCGNYi}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿž.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃVAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç{ 4`‹´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸ?%Jq™ÂëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆf*Dbƒ§ÍõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëŽ5+>Qh¼Þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾v”©ÁÜùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒØóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöòðïïïñóøýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø°Ÿš—–––˜›Ÿ¤¬¶ÂÑáîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþŽPJGEDDDEFGKQZhƒ©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦A6cºáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆe 'LsœÄìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåˆ/*Db‚¦Ìôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«P6Ja{–´ÖúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒ‡|˜±ËéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔÎíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíåããäæèíñùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý±”’’•™£©²¼ÐíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSGIMQV`sНÖüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²V5Pm‹®Ò÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍo>_{™·×ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦ÂáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÎëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ endstream endobj 13 0 obj<> endobj 14 0 obj<> endobj 15 0 obj<> endobj 16 0 obj<>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 12.0 %%AI8_CreatorVersion: 12.0.0 %%For: (Alan Lillich) (Adobe Systems) %%Title: (Untitled-1) %%CreationDate: 9/7/05 3:17 PM %%BoundingBox: 143 215 433 577 %%HiResBoundingBox: 143.5005 215.5 432.5 576.5 %%DocumentProcessColors: Cyan Magenta Black %AI5_FileFormat 8.0 %AI12_BuildNumber: 5199 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKCustomColor: 1 1 1 1 ([Registration]) %%CMYKProcessColor: 1 1 0 0 (Global Deep Sea Blue) %%+ 0.8 0 1 0 (Global Green) %%+ 1 0 0 0 (Global Pure Cyan) %%+ 0 0 1 0 (Global Pure Yellow) %%+ 0 1 1 0 (Global Red) %%+ 0 0.5 1 0 (Global Squash) %AI3_TemplateBox: 306.5 395.5 306.5 395.5 %AI3_TileBox: 16.6001 18.5996 595.4004 773.3999 %AI3_DocumentPreview: None %AI5_ArtSize: 612 792 %AI5_RulerUnits: 0 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -234.5713 780.5713 1.4 1549 1120 26 1 0 44 73 1 1 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 17 0 obj<>stream /·“Õß*àö>Í+e—7þãæŠÌ†½¿Iïq½àJP¿aãWó…i£1ŒAé'4Bó,jî͵›ÕÒRZuJÖ Šœm¨fQÑ#ShçUª@œ+û^˜§ŸÔõÎÓ±!ç]qò±Äxù˜Äº_ Žíôfüñéè ò&\ƒ&oµ&>Ù˜rF–‹«ØªÌU®N“Q1‹¿ª¯ŠÔ©sÑ>>oE,Ä??pá jH¡¼@Ng\þdÜÊù.AÕ‘«[v‘“Þ\þv¹G¿öÊ Äž“^® ¿Æh´ó °ði~W/'Í€Ÿ“z/àV1ígU‰øƒ×)´ž` ¥Qìâ^e'µ»ðP>›“¦ñªe_ ñì"ºÐARÄwø éóÃsnX>rJ~ñÉ)(m”HÑa °†Ãm8s4Òù%;sæë,|ÍÞ¡E¯W‚òIVͬ]ßÍ”nè:Ó@,ÓÀJVf­|(ïþ 7Ê\¸nÝ É5KM g­ãN¹ã3²þZKˆaÑo³›ŠaüÀäÝ/°XN“¶ ä ÷Èî®ÙŠ7N ¢d½2v·’É`¬_íþ„¤xYѬk2>K1=R‘@ª@$3é’µ¶€D•_¯N2[n¤Ø€xœÂ/¼y¼ä£ƒÑ­ibõÆƒÎ˜Éæ~)oâéJ î!·RÔuí—L<»Š¹âarB‘ÇíÍe˜æ'[]džà(y/@\…E¹ ¨1Çj=ÔS¼›€ÚAŠÓP[ý¨H2 Ò¿FæPóÒ Pƒ7(·ØT-\¤ˆw€R7Û¯¨Üá&E¶±ÞŠ?p•ïÏ>ÚªQ;ɽ¡°ä«»Âök7³}½Dä&ò|OqxöʠЇ}?¿“-dS(Å <Å öTƒ³UÀ0&2Ná~5ØJ¤˜P€©š5À(¥iŠë0êŠ {íŸRÜ^)ÞŸ¿¢ò­N~Ee}þ,$ {½…¹[ÐÞÃîã‘ZnãÕpÈð?0\‰¦4„Íò`>ý`•ú7°5Ь[WŽÌW°'µØ×2\^<ŽºäG·À1x+Åc 8v Ž dÀñýá¯Ò‹÷^€#ààr,Õœ"W.ýŸ˜1S£¬rAì»ÙõÃ¨Ä Ÿç^ñÔ˜Õ‘²°Ôà¼ÎÈjVeÒ+§0;<àfsé/vÛô(·“ò[Ó‹2UÀsí൨ x?~ãm€PÄŸ@`Ö(Êu ZÑBã~‚½)¡9®¡ß!èA@¨bŠÐü#*kZPcbV¹¦ãÓg|¾WÃb÷ƒ;HfGײ ß7þ4…GAù¯Šü[ü§äöëãPÿŠ¥õ[«Dc=âŒÚ)Ó;IÃ! ­¯ì¯{ÃÆ­é*N€tËÜœy2@F¯±h d¼ Y䤻¦ùá<<‹Ú9qjV^,å•ϼŽçEo1 rQyÜÉbLÁüºVý¯ øWµþê¶_ùz ÿ–ÿÿÝÿ©»}Å@ž×^@Á^ 4](;Ñ*”€Š^_@ÅæP…ôÙWEçð]}ì·ÚVZ§ßÊ”ùï­ýÿDÐ_mQ½ËIR6ÿJW¿«}_âÿ.ëÕÁÿ­–õ-´ý:ÚÎ?{(M^Mnñ­¶mìþ$<_Iˆ ðóSWð§¶*O¨môyÝü‘i¿EµK\¾Eµ_9ô$îéé÷uþ«_ô‹oå’û¾¿ÿ­þÏÂá×ÌV{½Ó6– äå0»ŸŸêI{Nò¯ê²ýˆ°¢ó0Lï‘ë¨áÝ:ë³{Ák¯o»¼î¥èq%F¯ÜÅ…lñ¾ÐsÂ=ûygöÇ%öëûkûj¿êè%ô¯L«¦GVyä•Ð2Tþ–®þ3³56Ï bœæNxÜ­XLG˯åÀu/ˆ¥+1TÈK¬XÜ…žXÒÙÏZå37w*§ ï5â¤ÑïÄÊ~ÜûZ¡î{sÈÂs_™´!Tå×@\Ï7þà×u`ͽʼLü_Œ?ÒçWý‚ü#4?µ…D?r¶ªÜ »vC=ß½A8<_ÊþìäìUkûã×OGÈÑo‡œ/%{ë!ƒ:ÎCÛ6”G~àM\)¡ëK&×ܮįBЖ‰[o,•뼿Ðæ0Ô2¯dxnž›‘\´46ªÁ/æ?$‰KBÿŸffÁÝÚ“+Ñ›§ÑÅÙûôsqRý]À uøƒyr´ÝFÔª[bŠ6Ö—ê§½º7îÝ•¸¿÷—!yv?Y@ýý|n&ñfž “cTË@·ÙÆ,¼gè’G¦ÄVÂ'.îJã‹“4à1w]lF÷>ûJ3E “È|÷þû˜$Kþ6ï‘k ×këÊîÎܸ5?NJ¹õnÃ×ÖÂŽ«{={_&-ZL˜|a y"²ÞO&Í_lè,L÷•›:%V7câ–nÖøÒºÙc.¾uFóôäŸ C%ÉGÉÊî†ÐÔ¸*ð –Ö› Ûy«¿i©Qß&&qýã½½k¾ø][0çæHuÎ×fó|œ’Úrgk'oCÏ2­eˆyÎ<âD?*Œèñtoˉ[DcG¯£€F_aÈ#™ág€ä†Ú»XD‚rQ‘ –F +¾ü÷í’Zíí[µVˆýžï2Ë©wé%;KĤ¨1Õ•2ã–›Dù‘Vò7í€ÿƒgöZ)\Ø.ò:,*»ãú6`ÆËŒòîÌ‘ÓÇœm\&=Ê$®ÎË£{»S C¶ÓjI³7ÈM«£ w}›îîzûÉàÔ#³ƒ›ïvæoïr^@Ï-n±®T…97<³epFÍÑ£‘÷{„Iñ¤¸½ÒA)µëTom­a«éxãN7Fÿᨠ9Û÷ú¾ùl¿•µ3bíuÆ·kEÉžÁ„À½qÄjðýfÖ1zäÙ³½käu=\„]™Í~`w4Û­ÝLîxpŒÚñÜ™o÷NµùN;pRȵK*µv Á·pc¨7;Ç[Ë>3øÀöÀtg³3nôI©RŽöA}XŽúu¥4ùœržæbÛ“?óq¸Qxs­œÓUª5Pt«…-éÿÄÙVý¨ü-}a2\´ˆn€W^¿GÏØ®ÊÚ¹4æ7íi¶½~÷Š­Ö~Ä4×J±ýÒ©Ú¸·͆øÊvëa jŸYq\Ó r^ƒbukU=¶&Õš±…«ÅBTl·¢T0fc›íšdëv1Nä-_ ÷=jÌxÞý?Øãü ^,Úmêgø]Éð$Ø«çßK'«[~ôùÎ*}VZ¤F~l?|fRóÖÕ0ÏÖôiI±æ¸P±ç×´Z»NeË~¥™íÌCµ73;ùÕÆ8yדÑå±—Á<š½WÝrºP`ªÚã²ìk²¡ì5Ù´Èò›¤åÑÉpÿ+ÙÙôµ4G'Ä-Ç~eåam ÏúŒýéyªx¨;Öº!´É7ž¹kR›Zò˪ò \­W-¬²];¬y¸÷³,LãôZ× ¶~îè74ÓÓ…vf¨=I*Ò¯æ¾ü.Ò£”Ç¥w¶\Þ”:“Vºj¼WMƒŸ•²°ã¢b ³ªb‰°£Xø»óV’ËÌâtM°`·wä?æ÷~7ë®íý^í ÿ(Ôf½î=½bõýù^ÁGÇIÍ.ˆÁÆ ®÷Ù§=û¨¢ M­R~/µzY+šírfëøê¬·«¦ð\*‹%žÎ­µæ[)Ϩ¼¾ŠŒŠ«–´G*‘´§Ú9©uÑÒ\,ݬ;±™µ¿XFåBfÚC’{XÕOûþ™¸Í½·œ œÕuÕluIMn¨GÉ* ë“fgý–h-•LùWòeÍq uv 8Õô—iœ¬,³±™ö‡OC)X¨#o J 7.ÞLÚó‹Ô†ó‰X´òbìfD‘¾VÂe&)’àWîeÁ¯Zí_´þBÖš‹"ƒ‰\ZÞ†õÃ!ùûlò^z™õ}ØÙóV³·2Õz6:¡•ý§žèAË;Mö 4æSsUjY¤(oª)Û”.H{¯¢JmέHÄ}b‹qt÷D·ŠŽD†j¬…ËyF㯣0ÿÈöY>8âu^r¦!÷Rý'÷*G*÷Ò¸6÷âˆÖÿ‹æîÿªß-y{ì‰êyÙÍq—°}|®:ö°liÖê4GÍ.o¼´4sÛýÀ*’÷c¥ˆ¶¯²Ý?Òþ4ÏI$»EEwv¥…kî!W„ÔÿT© |7pøG9ð]ðÒÞ9s#rŸáÔ³Hq`|¬°S½:`ô‘f ¢"¥ø¤Ñ8käîÍ?˜ŠIsvš`d$Á=8¾·±Ÿk·%ã6½8¸ñ­aTwõnù­ÎíÍVnBêAj¿È“Ø-ñOáÚ*g„Ñ)ð·‹ófšf¼ é…™!nÔR[\™p{H.;ÑGδÞÌ|LµíèL^Æûôê}=Ñk€ð)–MzuØLžÙ4™|1jLo˜ÿOûn¬NÞ¤wÛ¤£åæM[<½í6 ]¿ZqfSB{¯Ù²Æ.ñôÊn…^ïpàÏë•—UðæÞÅôq*7e”Ëàu𦷆5†ƒ…UÐ`EÉcª[wÌä{÷]OèçL—Â¥vu±LµJÇ.…ï{{òØ™Ò~´ë¾¨ýE v“gÇÎ 7LÕðÜáâe÷®s>³æ ðèÕѳL_œSš¶ndåÝásúÌaõscº¾á2~'fgüôÁÂóc†YX™cp‚É_ª½ö»eºÁ¯jÔnþp¨–E)¢Ð^‘ÇKr'ž]$ÎÏX"¼e«CpuvCp:Ip:R%¼ _ÿ Ï'k_|—güºT÷¤h{í"Iæð5—°Gþµ_+Æýº$¶\ixˆL<Å;‚ÓŠÍñš)ÈÔžnŒ… jõµGg9ªµ?¢ÑɤQS”L:ïz…¸hÝ&ᣧ>ÁÈ9~ï\<¿`,™øhSáóK;?–âPÁBéUÃBòj}12ï<ôÇN¤,în=ÆO_k‰_7`ì1°pwÖÔ_¯¬¨ÖÑqQ¼*â“Ó›×ßÎß 2ž­×¤ÛzÇÄåß ¿Ë‚g­<þÈ <˜íx\ªd4ì…°uLíÖ»`·Str'¨­²?piž'ÙRe½¬—»1+!ÍY±„˜†VªÌFV©ÒïUKÑmj…E’Ìö{NxÆéôtZ5êòµ–¨/ŽÙQ•fv=³bT˜0¸X6ŸËÈÓè9ÿñÚZb¯ik‹•aï„ã.A§N¡ƒÑìU¡Jóž#•ªÆ®RÊçòâjY ‹%fµ-loü»€‹s2x©Õ|g óT:bå;þ[Ͷl¥€ËÕ¸€¡28tÉ\O¾ô ®5Î~:ô´tµ?½ûS|ïíÜ?uÀÞjFðfCt«†‰¾/Q¦£R~-‹ ÚKú\ØṳТülïÑ8œ@lÞÑÅržÎz ä|xöŽ–¹ÛeõÈõ{e,' ~&áŽ6PN¤JNÌ?+¹¾üþƒ€ay_›¬½½Aë—î9B¾UÀ¿nÀÿꀅp6¤Øb¾“—-Ç&íÒ¶¸Ó<ý fŸi/R,÷¹ûì~Ímâ“«:’bBÂaw/¡ÇY°Êõ½ìçþ޲“AóšÕ¸øCѤ«BŒt¡Üós‚*Ê@Q{QÍBÑúþútÌGùŽ›œ3Í´S<ëõ:›×|Z^4÷[ÌÍ—C–¦8»€†LRZ­„8º(Ë87EœÉÙˬQ«m²p18Aóíæ U›/Êd)Swu6SbB 4{—&ÀEq˜â|¸äÁ§X)ÅËxaŸ~.À3–‘¢_ØÍ±~à.vÛBí Û°Ÿý1—0 c¢Ðhδê©Ê´z}®Ôjù(83ùšK°ÆÖÆÐ*¸“h=Õ †•ŽOqÊ"äßà&€Äª¢k:)n3@xÍ |ªû ¢€0­ô;ÉA•š) ï‹?¢²õÐæ¸wCj­Ñøi|ªêNÝ7ó1tãn:‹ÙÁÀ"ƒ&¢ËA î9å^5ù ëã*Àþ¨4 ä­ðL÷ôLа˜"½:Ä))†u@eóýƒ5 `2Iq"™|߬'_ÚçÒÿC×{®©ªm]ÛGP1DPr΂(fDQÌ9‹YÏÿCk®=×Þïóý¹‹r:eúhW­?³Ò,À¬3]ÀŒ¬é}çkJ­O—V–vT½äÖôy­vÍÙP,¹5Ÿ•m¶@úo=Ig yÕR ¯©T՜ݧz—§×i%ÛÎ $x €+ àê&“ #®û²7+Ô€›;ûOpI%¸YÜZ.¸§W9çW}Ï’²O ª—º¸b’šß›Ï^xA¯€¹±&÷òK)»áúlÇ?Ö¿¹hÌ7ed(vétQHa pàËbðCüÊËüƒøøÂà °¼ ~Tú¤7ä2- øÑ-úœ`…!pu ´ÙôÕ#„Ú¼„ú}„F ‚»ÁÿˆÊ/=cÍ`ú©]Ö·ƒä.f3öÚ-‡ßT 4˜¿Íäz±V)}Ü O>âNá@±Ä[:ÿ ð-‰Pí«@ìÜò@œ0% ^k qHåêHmø ¤ÑŒÒ8ïiËô´Cî¥w÷4[&o?Lw@:ŽH HíWT¶±aZo‹W¹i[® è ¹(N[h;l•ülbAUæ©þÃ7UârÔÿ€–óÅg/ÿ$9ü[ÁÑ>PàÞ(6¼ÊØ?ÿéš&Þ4 ZÃ&P+Þ ¨j(çÚÅú ®W öæ,Pç’ ePÔhJiðé.‡ϼ@ÏÖT¶fôÑŽ7D¡K©CÝÉÿ±&õ«Û~ݶ°âÿßé ¥Û¯ïö+ݪÏO¶­6õÐ)Œzå`%wèNèanô)‹}Oº@ Óû'П Œl6ÿúÕ?¿ø»ˆ_qÿé>ö]Äß=~ÔÑßl„oJì×hû7r Xþ¯ Xt”@_<"ÄÝ>ôyç|bƒçÝ\_3w¨ª 7ûp¯Þ¿=½º—óéoS¯øë¬ý&°î&²Õùv¥úÇ«úÕ?¿r¨ƒÿ³ˆÿfûpH þñ“Xø¥óÄý](qwsY‘o¢nÜìí§ßë ©MKW÷8­^V´yñ.Çð¼U΃3=gñ!Çïcn\~žäH¯¥°tT¶Pïo<ìW«ýºV¿«_9ô™6“úŠw_·-óŸEü_Ü,=ôq'¸‘Íèf¯—Ëkr›ß_ˆ`üŸÈsƒmö@[âxu¶I½¿Ø ‡ß*ûwõÛ›‡ØÙMøGù8ðoV­·y}½:¸W$§.jPøê7rà“103Ÿ¡úUGÿGýâ>„Aö†x üâGü™îŒô˜‹ÖîIë?ðáá®ÛûwyÝßMØîh;ýÙÆ{æ—ëZJÞ¬¶°_qs!^˜|_\+ò{¡ìMdq.1{-au;úÔ~¼ÉÜÊ&èŒ|ŽË¨O޶åõÅ<ª‘9rx¨ãø¯yõ¿ÇøZ8žÄaê|гûÎN&²ïnd×շ츩!-®¯Ï5&?{û˜;ƒ:À›ÚP›Ì ± :qј˜‘“Q e–Ã&Éìq]½ÄSê‡âˆŒ],é¯8ê -ûгҽGš6î¿&Öÿà÷¾­Éóâüý©õêÌ> ºÅy´!Âco Zoþ¨°“™ë©}ÃO÷E=ÆÄIè”6q„Ô›é_o¡¯Ä1~ý«C-ö !]ë:i1ç{¢ËÖò£Ž˸]cÞPphµä )•Ú­¸»ž·m:O¶v‹¿¸¿Ë«×…DÖñáI´›²w –Ü+Ìõ”Ÿ"¨0&FFiØDùÆ ™9„Ñ£… àH¿ò‹žùäw]'EžÂ¹M^C4©œ;eŒJµ· i×( ¸8'¶©dø×nÛõ•עьÌgÔxOÕuÃÊÎßõI94êE4˜:²Û?ð÷Ç×Rvš:j®vZ³Aq8ÏEÙÆd±„œQ->ŠƒØƒ™èÑœñ=óÞR¹åšU¡Zj×»jÕäøn¯%^¼‘*Þ¬ùˆ¼U32Zûdöúµâ†wîõ‰:²šgkEòÊVW T«±Y¬Ô¤^P¡ïìªÜlRx™7vV™÷šwøª×N1¿ˆ…>ùÚlSÝ|(¦‡ã­6n ®XóÓQz æ…ît¤gCLüôì]ßÒÉnϸ–Ÿ|ÓОZc¸"úäÆ”ë™‚Ú¬—j»º­¨Z¾–Ç•ZžW˜E°-ûx—ùMüöÚ*†–n}ƒ/iøð³Rø¹E›ÅœÚ™SÙ^ÖÅËÍGe¶ÚÞ_ÌÙîµTËïͤºƒÁ­æ5£´k²ÛœyͶäöêÞì—g}ÚJZÉÑjŧظRïPrù„hfY(æ]¯½Î—=¹Ri”º÷v§øÒÛQ1·MŠ©òyãæ÷ .Ì8æ](Ä>á,­³êx°U¶7xhWù²éÔ@Ëï7÷Â/Õ}òDþþøz•¿¢òH蕆ÑX0[aeGºÁyv—}â $(Þª›jòÀfGÙØ»4²ÏÒ}(fНNMÖÜñ ª¹Ô° ³IÏ- Ì¬êxþ¬ù;„péÚÕÎkdÓŽ¼Î7•Kžó/ˆÕº²œ%N¦Žf™Žrâ-÷!bî±n9¹¨âÙ±¼ƗɦVÛ|£u»+„ Ú§Vò_«û'A7«xµžUÞuøÚߢ½q';.Ì…êËYÙâó(9[ùoÓçXÉ7óoÓŠgoÇ ŠDÙ¼®é†¶Ý®©Êƒi.š]ö9£¨½áyLV‡ÊýÀFÚ^øú4ìuçqºóæì?ˆ‰ü‹Üºqs%cÓ‡¦Â8¬¹N ™rÓ¾]Œ%û’'س8*,׌¿.íí}¾ÉÑÃ9Ï—¯Ø îdƼé aªCžÍ=ËE%gìŠFÔǰN¡g¤qKŸZh_Ïìì•¶¨Ï®ZIW0 G7šZ©UµÒaÖ*¥ò”J9q>ÙÚZñó«~C›Üôæ/jÒáGDب40íbV’[],À+yªõ’áÍšSKNK ³[0v¹~˹äÀµö6òN1à̂Р¥5«gñ³¤-®XNÃU&™‰«ë§• e1 Uªôž)õ«~RØp˧‚)É-ö^–…x4“Ep#¤Ë¸f~! —æ/¦D€žÑÛv×>mËÚõÓÏt­¶kí­r¸/~R5<Úéì,9¶Æ¹\ÿ81òãÝR/ÎmÉ?“£s¡€º±åŒZEò„²/X¥ù²Âž×–|j?KrËV[²ˆ„#©Ó|ì%Ep€øH=8±·í$³$Q¯k#QïµQQÔœ¨7¥a¤‘Ë7S9Ü]³³@ë!½f¶ê5Ö{9^¿Ñä],Oåã~cŸ{KüPw•úPóŒÒT­æKke?«'UŸÒhLïò)^¹\2Òåv'¤ÎŒâ%ÅÍiâƒëÄ^|¬‹úˆ„w>\ Cšx æcÂP_qø‰x‡¤àG•ŸT29~’Æ£3sMæbÑtøÜuN.FcÚ÷È-ˆ‹,u¾Õî¾}J.RwªÝOñ •:å_ RöðWûþƒ(—]‹k¼-…eÀ²U·lm¼2Êb9™ÝÕ}«¼–ºw¼ÇOûb‡+ÙH]ÏÑ[)*K–â«fwܘz{ Ö†²´?'hZ(š2uáÉ™jŸïI2. È»}>Ú"—&^þS&bT'r·Ù™È†xU^ʤ¶ÉªÑ, o!·<žZà ¼i¬-{^m+NäY/¹^¨Ý¦4Ê(2PRó«\k¸=aÀá´Í4Ðy‡>•W}ºE>f´°G7Ô¥§ÇTG¯>Éû0H“½ò– u ˆ×^ɃޠB˜ÜÃǣ·«p G讀͎RsnrUb³Ø¤°Ùª#á:–q[ŸÉ¿¹'’y>·Òcv_ßÝÜe¥{(¾>`ç¸{Ûæ(_`õò‘HË7h~.?aé1ݦ:·f›ì¬ÔÁˆx›“ÅL ¡xO˜SèB@uආâöiÂbsóªaÅ´XÄÐir*sð%âî3»m l–¾/ÜÌ!Z­²ôó€ek¬"f·]D‰©+}ôƒçä|õ³¶vúk§º·.ŠåQÑ }i nn×õx`)ÇLÎ<6,Íé³"†$`‹îÔÒ6?¦»XÑçÇ–+®Ðu*<¢åñꎒHgwžÈ2~YÊ…yR)ešW¢‘á'ã)r.È7¤=Qˆ´ò p—rfˆ4QDš@"\‘_„ü>x©x4 ¤p©^³Õ­7I&nõZó½-ž[—~gD¸¿ºýÀl#í¯)-2ûx¡¥6³»óÔÏïí ã÷¦QFÐäÒëFŒ´×á‘+»,|§1îÊ&¬5µô+gÒƒÔýœÎ…U,Òp½Î=h >óÊtŠŸðé\q+¦ûó«Ô¾ë}¨…°,¨Š…[%òªû¯¸À3¥î7 XkZ%EÆãÕ“³þŽ˜oŒn¡b;#V¦Ÿ0öB ÖËõnúMöGÉ^»Ý2m6À! qüDz‡;&5‡ÓZÊ=°BW]@äéM‚8 »§B-€Ð tžç_ƒÕi–Ålª¬ ò(©ã“g%¹–ùç˜íëÒÜSºZ^yˆdÎÅá›þ+ïÝYæ¬ü´A'.÷»©âIë2ÌF rÓÝ- k»3 ël*A›d#­%h–`@6Ñ~‚Ù%¤G™€4oÉGä“Ë–”· 4y†r­Lz6˜ õ-áeÕÖùO‹¹xj¼ìIp˜Õ8öÓTîî§p¼_Hþ–¬°òVˆöŒ§i‘ú`Óöuê¬g€ŠÁ&'h¾³€:«B‚äQH]¸& 6ã  ¶ù v8¨éÚT/H> Ú¢€ò[ŸtSªtª|Ѭ°S¼Ö>â™ßp‰†Mœò¾žé“בÍ=éñ5ìnÐú3 ñU¹ÎJîŠäàΤÞ+°=ÀäÕ`äâ:AxH0?4Xz%P‘!à¡ÆqK .!` •äíz$ØI€áƒ:`{’*LºPôm×ûZë'oA}£%Š[æò²õ[°7¶km’TFj ädíÑÏaU'°OgÛ#){B‹Óà ØæcØzø\œÀ}$`+$Á›ìËŒ-À¡l=Áh8L=}”^ì–\*4{µ;€½ 'Àî“̬ä×ùa™|²¯)á”)­Êì¨Å¤ú_;é­ª‰Ë‘°Ak-¦GËEÂÃj¶SXPðx~Ï@ÞÌLn2{üüã&!ðoH”ÀDouhÀ—7àÛY𣒠øó3ü¥6ü¹%˜€¿yàï¹àÌðÇ´ ø%7Hp¿|ÓÌôQysH™‹etVïÂJôªÜ€yänMÂ{5ìl˜wdx2i3%¾ò_ðWºý"JÑ@˜g™”Ü‚ôñôÒ£•[ˆ5µÄí¡¤´·Œ@@¢–èJHŒ±+e€Äy ñÙp8•Àg 祒± {â©uFÏ£„ö—sVÕÊ]bM±ÕäzQÏ.X˜’b«2ûg_¹Ú–ÿè¶_Ëí#¾2îÇîúG¿½6€Ü°# À÷%PªÝ;P& ”]Úþø`oÛPáñ¨HjÆo5ël€ŠJY bˆ•‡×¤·žµ›4ßåvì­NH›Ù^¦áÁ.7ָ̃+ÿqUÛOzÿݶ_ã¯|O.âߔۯ‚û?âíoÞm}46sZ·›Ú=¹èðÛºršÝ™¾^ï«@o„!Уj ô>ݨÿ³~ÿ‹¯¶ø?‹ø¿a¶ß¶^Çû?ݲ¾FÛoä@:÷_ñ“Ö#‚·Ý‡>»ïï"2ÿïæÝÜ¡Š~¾Ù{ï}C[â:ç]ëŠvðèâ=üÝ7ዯuõ«Õ®k­²Œ+K7’šýGýÄ „ѯ¼ü6¾Q¶_·í·­×7¡zDÐùuf.ð*ݱ›½yÑ×9“®¨ŸR.+Ï]ˆnŸ·ŠP:Ó‘\‹F©s£zÿÀýùñêîGe-@‡ˆ¹ý»Yó࿱_gíWý.íÿ¶¦ú•Яxû=Æ[ùþÎ_ów¨UnH ®hƒž·:‹º9Å&t8^íGr·<*ó÷ãáìß•gz?¤1l51jgŸI~ëÞ3òÆ{grëZ:SX5³dm{åþRÜ!çEÈ®˜¯‘öw\ïp«eÚoàêˆÞ Ä_=ùŸöÞ×÷Í^ÖSïH¥ãÆý‚žÄá…=*Ó—zÐW°½‡j/oë^–µõÖ¨6V‡¼¬¸™Û]¨;X\Ëîd¡ìÜÅ?ô7+qÔXг}m®ïª©}å>ÖUº?ÚÚÄlx(›A\!Nýk½EzEú- ýÀ½¡–ÎôÌIt'&Fw‘ )„Å ©tV%ÞìÕm×èb=84ÃnÀ·³V ±"ÔWSÒ¿­«ÈkÐxÏOýïÖm’U¯§¸¾_þÀ;‡*&_5vgïÚJŸÌLÕÒ m#zø²Ó*l¹;1?œçÙ°³r©A‡X±ÓvVÁ¡.ìîÄ[qK»¶Ä«öôCÕ„š¾m©êgõÓÐîÉ h¾É×í:–Ø×:¦²É r‘R_悔3,Ð h½{êµOéÈþ•ÕŠF–Ò0 êjTГs´]P¶ûcC©EF2ã“ ÚËÍ Ÿ–ùÎV’Îjµ&µ³ý³ÔFKTŸý‹IU-oúCRž¬a.zÓ©Èv~¼?QmØ5¨“½«±%mÛ­ î­jÍB=#†Zq–Zh˜KíÔòŠU2(<•ÚÍM)L·••Ú˜’ýìK–Îå¬)µ¥RE’’I…x›QãVoáy6X¡?F<¡?‘BG rì,ô§2óÅWýŽ&ÓÜ´sä•n«/ZF Ö UÞ‡¤Òû:ÊVœ|É·ò«i®,øzfÕi¨ëºí«äÉë*u±1’“ÞB2ƒ­t^lb©]º'5¿$‹tZ¼]uLÔœ*'¼2cM蟲%!×*µ…”ù\òù]ñÁÃõ'ÅÍô‰Ë͌ӆ›åfÙ/ú d™‘xQ·½EV˜v`Fþhb4¿‰ ?pEÆ¥”®M1§Vf¯VÇ ÃÎUÚjegVåSêQ“…Hí#‰w‹Z‡[/ÛÝ ¤qróñKH5¯?Š·SžÂÛMs¸ÉeŸíéÌ.Ø•õ¼)Á¤c3›{cÉl.Âʆf zF±^uOž¹í®[ì¬-Wô¾לVm¯çJå^ŠÓ‹ÙÌ‚°ý´p7 }»ÔÝK=T8V¬HòcRù¨Ö ¬ ƒü09:³IÄÛÜvÂÃñuÉÍÚÈžsóúCáZŠ]îW8ë5!% Ûb¶`VcªyÄÐã™>¨%Œæ–i“æVô”æÖ(D7±E7Á§»}0:Ô7¥ºK™ò"èÉö°éªåvC eïµQrnéy¦óí®üÌYña­‘J½'‹'®, Îe·{R…›½Õ&ç‹I…–.XoÎX¢¾Ý2[öT}Lõ-¾zXÌЇòœ¥›bÐܽZ¡âÞ½OEÿH^7)„ ;STÕÉàW¦¸Þu’¼îE‚’(“ì§Ï`²jÑô”ac•i†:·Ýü\؜ҜÕË /czFöj]™%µ¥×xdϸì*KÜ@Ùv™6C¿øˆ> ¬ Ýô‚5Í“#_*è20%j4yË®T2ŒExJ.чÙÝL³ešÅ‚‚§‹Äê‹Þ'ŒBÆàGYë¹ï´jª¹æ¸AÃ^åºê6J“jÕ)ÐL0ßYÒ—mú¤œ”ÛTì:-®=†©-ŠÉ÷Ò<.*ÔYX7©6º”4!GäÍQd7SÞ“êqr#úÂ.Eä ’ À¤(á£Ú¡€çY½M[ËV°\€eaXD³[ ],–Í 1¬ N0lnñ¤Ãw·C»ód×¾£Wgu¦õ+êpÑ*.†ëð")™æ«ƒèDÛ¾*¢J.…±9î°•}±Dµý¶KjJ®H<¥*Ѻ‘+îúD {NñцÜàùŽ“|ûØôQ{a…h‘Ų%ŒG“ú âÕC3»Q½y¶ò‚ŸYj0æ2 ²^Ïìó“s–;h¶r)þ¢Kž§ ò…m³75?·•sÒº]ÄÏn‹–öI~m0­–ü5Ò£O®yw»ì1œ^«:îpÃ]lVÉzÉ]Th`Ù}¾ƒ.{í!ê%•Š¿oûl5Ÿ¹eiªgöûi43F†3Â:§è)Ò/ï?0":É sªð-LjXdP¤ñ¿èăsÜáò¾±^ ÖÕöe;ñò»]èRѲš¿‹i,–/J9÷ª/ÑÚ`[ŽT÷êG Ú´ h9}q’ù>½»™ƒ·©dšÄÝÏp»l‰ëò ØÒ*ÁúŒˆo<_‡%­«”UM?öñ(5«è}hØY ÷-³MäNGy€~ѾYàš<+¿ýúöåå®Òë\ç%·~‹ èÕ´a׫ċ‘µ¡ýæÌžñýÓøã9ia%º_Ê {‘&Uîf¼b‚qV÷0ýle‡é¾¨-ÓÆÕ?ýÀiîÞõ‚1(=(H©4-¤2Sµ JÙÕ`+ØZÌlœŸl’y€TÏ€…èg‚þ.óh.ÇÝ[­µ[ÊCú±üº€ñ|ñsóœ•W[Ï}òÇ·"ÄÑS½Îi†Ïê«0»o.ªHG‡Ýô+\zr½”‹(•T62›`i4ºõÆ î€s·Ë À'²˜`í|Zì|FÞÛ~ÖïãQ/p±x+¹.ñÖ“¸w&[vA z^¿Ã%¼É“Øþ+ ¸6O[r´s|¹%¥éœ¹ޱ\ 5s!×õÙ‡ ._…çå“J<ìJ‚V3Á¬ˆÃ}ˆ#»HàŸÜ Ny2ÁNDìT¼G€X®€Û4 &T]~ ˆ‰%å/š« ÕÎ|û•<+×ýZÂSÐÎîö»Ã\)yx«²uÌ‹Y¾Ê³‚Ãgȼw¼b5[g䤂s6Ù…²RÅ”™jJ¤: ´(Ai” ¿Hp;Jâï º™K>9@Qå< h¨• —¼)£½•ÍJ€|íꀌW{@®ccÓN`;¿¢rw4Hy3âr/´ÐpcÁy µª‡ºd{~žã\Q ÌÊ9Ù Víwo™Îj°ƒÍþ{¡Mcèé¢÷Ýsòk[$HŽ Ý³ö Â+ gOÐsƒL0W½=@÷gÉÿä“· ³@Ç_?ðÇ9lW/€VÇ 5­ñ5‹+&5ƒÝýžäÍ%¶Òõe$[r±Æ396OfËãd¹›Í„Ò¶vË8UAâ5`A¸,6\–Ÿ¯¿[Ÿôì°,Ž\+ˆÅ`ss °&ÄÖkX€-ÃMÀZþ°y2y_þLV«6’רܰh7ù³†É^‚EU/Éxq«¾Þ¶ANŽIm¹ÃêsÅxŠ]~·}Vé\¹•é¢Äfz•á‘RÔµucŸç4®€ ÷ÿ“Í p;I à€»UÀ§÷*àåÜÇŸÌË»àgõOŽÃV¼Öûtv«lÏç1À ŽxÂÝ$ØßK« 8jd?rëÙ+/ñ4ªhئ‘P««–Ñ#:=7^(hZÈ'ï‚—Ðà=ÙŠÙ_ñöWÁEØîWËuO$"м¢á±v€Èðu :«! ö ˆ M°É±Ù èW šŸ,1p›@¬øÉ v2?•.WÈ, †õ>ó7"a‹CÆHÝ||»ì2FC’Ó µËýÃw÷ù_é _Ëíÿ•ÞðQp¿Âé_÷uhY×# Ï.k  &/E#+@q¡E‚”æËŠ¿¥5|%e+ÛCŸZg“>‰+³`Õî°ŸÔ0äž­eú£k>]ÚeÔ?éÄßAýMoøÝóG6ÖVå?øWpÂw?y·¿¹ 9|Ô¾¿Z»}ܶõ5´^ÙÚÁìíÉžÅ) £™J‚ÇèØ$t\çÿq­~õϯ&úu²~â~ñÃlÿ&#|3b¿Ý²þD|{{•ߨØf ÷·Ëx÷!ªÖïæªØþ еwá'(v»¹º§ÇùŠFúâÝæÂ…è ZçÀûy}S¾ZíüíEõUÿúVÿkÿW^þ†Ù~Áß¶^øø¡O´ÍÝ\ä⛽ÑîW÷ ¼/+^/D[AÏ[Ù¦ÎtÏæâƒ^•?‰ÆqŠ­s§cïf7ÍÃû÷úŸí‡l弇™ÛÙ·£÷€ð±ý~ƒ¾ƒû.çÿö¤ú¿¬«_)ü¾¿ó{³W’|uwVþ²b›•sõZkâœÑ=^muxxùéþ]!—{sOnwŽ<lÑnú¾!ú·×º–z¥WÆVÜg–.+‹Îåçf·þÏõ 9› U€L'9Kš:)Uúªµ_ëê¯*vúÆx‡ Îí²¢×¸q/ÝWK}Idöæ–£wˆOˆë­>WVÍt”ûäÁf{µâüQ«Uæú±Ö˜ …rkuÊáÔ~”û“¹Q›LÐQ°—áè0Úº«ûˆ^=áa“â™o·¬þµmúÊýuûæ D‘€Þ{¸}óWà°ˆ¿ã…!Ìñgüo9T«fª;X\‹•Ù<¢JÛ™çã©}+<'è@I‰‰˜Õ2 1lâ4=ˆ«7hQî_›œÖWΜùG¶éFúÝ­ö†zµÕƒ†½~×Ioa1{?uVe껽œÌÍÝ6}–6ASN¯îv[~Ñ_ÝÙCn__=ùBÊx;ç@kçg1ôÓ_l2W‚Âh›—>æU¦>H¾ÓYiéWlڪ̺;Éaû.2Æâ°ˆ`·3¯Nc¡ö¶ÂfÚ5J#‚C#Ç\\RZÉl:ï‡Z¿Ü| Φ‘ffu´ÝÐ*P듊ØükXý—u­.އ‡ƒ ×tŸ*Ïõml$ƒK £ZZ#û×êžé½ÛÛè¶Óz®C,9§]#”rÐdÄÆÜŠ}¥í_;t×eØ|DÊ´iqÑæÅMÂíS}⺷:²ªZ‘ŒÐêª~à+ÛÖèÔ$³R>t—ƒ2÷®Ü½ ¯É ®'ÁýÂ_üÀ'©ðÚ¬™g£ ãɇ¥÷ofŠì½ƒÍ«‹ Ìg{[¼¾nßOù× mFZ…l Í _Ÿ8%¥Ž,*¹Z¯ØÕUµR¬‡J¥²mú }öƒrSö»?p™»'—| ¯—¥ëðv,©0ö,¨œuß«‘äZTÚ-La¿àðQª€\h>"ýÅ.+ˆ‹ù@)cBŠý^a§vgü€ìPb|Û9$5¿rm'&Ånks÷~¨–Éý¥Rc÷¯rSܦ½8< žøŒ©R˜‹¹âcKÅäY¬¹ïùÃt-ì]p¡ Q)8´ØræM3rÐska—åý9¿ˆt¾ftøØ:Œñ’ÕtÈÕ¬Ý`‹×Hâ/V¢ÔœLVùl0›W¯‡\GzûàºTKÉñ 1&nûZ)¿Wj]hàÅrT k\ŒòÆÂºêÖ…âb2¯,8Rùá̧~ÊÁØnÆ^¦„Mšk6¿ƒnržqž†Õ<‘®Å·œ†Ù††ýÜÍy¬s]Ö{ÏÁ•2úVÃ6rTwa¤B*Áÿ‹ùÐcÆ?ð¨ùº´£<5/wvýv®Õ%u¦19d Ñ_Ë-Ë•´ª¸ùô¢å,ÌB`¯k•¾M>»³|=7ÚXÇÍúd ôújžç—)çRpîžÂ±œfS´ñ¢ ÉßÈ5+9#Å/<=ß~Ú ±fZa¾½hÙ’…©¥ËÛR½´°Pñ鍸 ϨøžÍ~·¦ÅÇm<èNÆíîRŸTÛÂÆ·~ckq C*üx}.¬;MŽØìœñí*DU,Ý«˜í{¯™»»ËnN[íGÆ€<ÍTý²ÑÇ\ê¨çßÂ]›YÂ[sÓnFËN[¤ê±3QÅ㔥T%¹ªÐéÅ@n¸ØNæ¸iZ:-å–Zãê@jmKÏcø/Æ»óbÜO-:°DµÖã³ovr¥j#O¢^÷°¸ºSÏ[ØÛ{¦m‰ÑÒ5^1ê©ëÛÓá磮¹ÚÑPBüÀªWS¦*¡zk¥Ú¯:×¹Èüd®zÍH1CÐRëé©â57vÅ`;¢r]¬…Hc^‚‘= ü{uíðïóý*‚þ‹‘°o#$×K®Ê· êþ°éêeÑU*,%Lï…¨=Ä~`Á°!QˆmóVséóiA›sÓÔùÁ9“:ÃeêÍ&—itb.!P²õNqÎ…†ŠîOº«jµÛ– aÓOÝbmG´ôrØS©"2Ú½šñ6潜î%ç ÏÊjùYr3Â,)G¼ÁiOTÝL]xrjGˆââ@RqÂÒÑš·¦ÛŸn OnÊÎy9vaÅ[¢Ü:‹í/cfùW†JÁCXR)1)LS)oS_ ôU}Ú%•V¨§ÀofÖíRõ6 ¯ÏŒ[l¿RùØ÷v¹7Iôìl_SX¡–»ÒÂú¬ŸÀ _àóШ̧'»æÌ2»6—9¥ì¢ÅÌØ’Yܱ8^˜õö1•:O2”iôî”i¶ÜP'™)ÿ¾Á(!ê»”°ˆ·T+›Lcý—÷¦NZú–T™…̼ÑoõQ<ÅJí~¹*8Óo‡+¬«8œ<8;Ç4eF¡ŸÒ¥S6…\½­qÓ­ sY†5Ù’/X\ÈW˜J'ß`(»2Tõ<¦÷LfEןVL³ý0Ùié‰ÿÀT‹0dòNŠdG{¤’=ˆûª‘%zí‚Cô:ÁЏ_•÷¤BèïÈéæg¿Ø´RfÔþ–è¨3»”›b²å¬¥¥z±‘Ñø‰J¿_­X|(ÍçŠÊâó»ÂT?~§}åž§t¶Dšxj¹6%‚JŸ±Ý‚¼lÒ²Ó1ÄýágˆÞü)zÉqð·ðñÁµ³Ã¡ c“ìËÄ&3ÿq¨x}âæzáƒ'òꕲ¹y»}®}›˜„ušZ×Ë̦PBЕê4”nö7ã‹^ÒŠ Åì'žãPâÜWW£`¯P1<Ö(Ñ›äÝ»¤RÞ—“ùËC†}¢wg»„>+Mð·ÛßàCîyÅͳœÆ¡ÑˆÅ&6™ÇC s_\£EáB1h¬£Xú6E‹ùù·W¿èVZÚ"¸ZãæìºêÕ÷crŽ•#æU*ºImnÇH…4S›ËCÛhÑF¾€B_9H•-/§T6 ñêa¤u ï6>¬<Üb—u:Ý;ØdÈŽ0Ç*¬° 9=£Åú ˜ž£~àìê½0²džodvT¼ÈÔÕW†é›J†´G™Zl\3;®öÈ’nó6 yÙzSIcåÌ£j|AdñŠ[.Ç9[BFlΞÀoÖYÝ1?ËÐI¥ÄÔ½Ev彂[;QÆœ¢`™C¢^@‹W¯‚ba¯•];§~–\¼f™'ì3u±ýÌ0×;†§ ñ]PC4šÁçµò„ÛT‚ÛanŸwØåFÒx BZºwZ¡¶nYð`Þ ÕxX•ædè¥T­°ËCùopƒ1Ÿ(iµ©#gñïN9Ï[´= Dn¿‘ÑÅ ³•ÎJÊìs5SŸ';¶„–’½œp±Žø·“`9A„0»ƒ/jþw2{ –—²’¾{ëJºG:cèU/Ѐ ihÀoèåöim™¾§{Yò‘\—¹­ïôÆËz]C§ßs¥¬È&G¬ÀÊtáÜ ¯k^V¾‰ñYpÜúŒeRz‡|ÔÓ%qïz¶:@E¤Õ Eør¸Óæ\]X±‰Zú˜toÞ¥õâ~½qü ™ å$üÀ)»¯¹`žZ÷€;)ª¥Q€ê\¸¾Lо‚Ù¡{ ?·o–ÜӶ濸EÙêàëvZy¯lŽsiM«=LÊ9‡+·úKºM+]ÂZf’{2Z¾Lä %ß–j¬è}Oæ–^Ô!èØ)ÇŠ¼T&½m‚ù ‰†r³½Àx:`À  nÉ¿Ã`d™ìUAR`ìúØ}|}èãüjåsõ¸QE_‡ªbr+Ï9cw+v»ù‡®”å}¡*Žˆ 3{gÙ]}Mx¥•¶™zæDQ¸»5õt ‡r©,'šN‚Õ§ûN!A{˜`¹8MÝ P€3” ðÌÈx¶8ؽ%ˆY€÷ €]žg€m p‚JÆw…Žεá¸b@ú¶4…ó¯Ö{V:”?iÀåº*Y<‚s5:zPVa‹»wz˜m<É¢ôrå´9;`¿-@¸TL|u„á¶ "@ð— ù`ô„ÈR F $µñQzÉÇÔ<ÄKÿÌ·~j¾g(€¯0¦±µ§Ïo¸DÙÚV¿.ྠŠ0ñõ%«¶‹ Fá›(dä=ʬˆ ÒÅù0mÅ•d/)¬?+r\-&×ÙÙø .ílÁÚ$A{“àyd=‡$Xó€lN‚GÈbgÈ’¤IY€”@””$¼U<Œø7±ø¹×ž^–©ÆNûFÎÍl0ë¨L*Š.rWYŠH^1/´¡¤H¯€ÌÓ6m À¦[ Í} Ÿ­RP/?J0'ØÍõë‹q‚4†‘  Ð)¤’`0Ô5wÔbµ»y€šÍ“ÿ؇èä!?sÜ«Õ;¶O—óoù]8ͮˮ¶'Z,ŠdŸv.ÇÝ;êLNªŽú»ûSÚ1Ñç%5”6mcú_°f ‚M‚ù1A|̘x%(f³‰yÀlm;Á¥˜ie˜óþ8‡ç@LtH^õÇÀx{0ÖÔLžý†KÐ¥Þ=o¾¤~ؽ†²5šøÜ±”/PùÌCÂØtCú‘ÿNgÙåå¸í{¤€ËèñÇm›üø7¾‚.Ó¸N]¥W€²€«ë4àºcp3ÁK°Ž7/×Ïd\-À öÀ£àÚS pÕÃpŽ~(;úmÃ:ÄÆÎè/ð4#¾¾ËÔ©±Ô³°ä$AÈ¢Ðòn§þÈÆÛÍðÐý x‹†þH·ñ7Ìá?r®€ž˜Ozƒ!«@hvm ,Èf‚É'÷„ä Âûåá|\a³Îa;IÞwOm€°@Ž:÷ž¹ŠCî•W95htÒæ¼PÁšô'y«µã rû“lügŸ}ÿjÇ_ãïo7íŸüÝohÂW1ý:p¿!¼m¸¦äü¶N“Q¥dý²²Ñ‚\Êi@nñívHÇ@Ñ<7xòÎ-Øy (³´œ_Õ^£¾¶Š2b “lãLkÔóº¡Bßçÿ=¤ï@>»ÿë¶ýuü&øèÉÿÜ€Ôÿ$'|ÅÛ¯ïöÛ¬Ìïï–Uß@cŸÐô¹´bg 4¿mж€6¬ €6R®@Û@Ô?a¦™Ôßõû_÷•«ÿ´õúf#|3býý?-ȾFÛñЧöþ.´¥»¹lkwÈY· ±voHm]¾Î™[óж@xY‰|2¿¡µ>WŸÁ%>äžÙ¸ ÅnÌM;ÿ}¼~­«ŸåüßEü_9ôÿG ýÊËŸ†i9ÚþMFˆR§èãéï§7¤2[]V\gw!‚Áù\½ îñA¼cn0LŸh˜=‰“y 3+öð(m¥ƒ¾‰ý~8{ÈG«;û¢‡[÷јoˆÑé±ÞÚ'ý7ö“‚ðƒ¾Ãû]ÉÿéEõTa™›½\ W´6¢Ï[a$ŸéÎ1 À¨xx¸õêþ]®ø» ›ëlç¢ÐÛ¬T|°ÞæRÉ[Ó£×lÕ„_«eì¾vKqŠ!•}Ì .=×c“˜ ¥†8hkŠ ñÖ¤§/ã•Û%MµŸ´¯Vûu­~×ôÿ¹öþ•C2¾=†Ðì°âÉ­iŠ÷ Ñ}¼Wó–YŠ‹)¾P6Sv®úâÌ<·ÕéDnç¦H¯mOÜ·ïŽW–_S¿>ªeýÖˆ^N£a“XOqí¶ùvËJ_úÊU†"ýéºeYÕäiÍmÿ6Ê çzþF®‡6¹þ×¢YÚýÊ¡îé쯸1Õœ?Êcfžª)ºƒ Ú÷’ùË(¹Qo‡‡¢yÄýÖ¿6¸g_‰ùTI<é7ë 5•êA•ëNLGî"“¢3ÍBgUÖ:Äæ¶éÃ{4ýp—ÖŸ›²T&~h>]fTHÿ:X‡ÅeôÕ¼¿zòªÃUÜKóˆxç&î#“Ü!¦}õk]í+GÍî½;‚׃"¡ÑMªývˆÎ¨¨SFÙq{[fçmzG­‚&Kí~à€; §V Wÿ O_y*P3ÊÙXã=®² ëõIñ^ª#¡]+Òýeuå·ñjYtÜ*q ëÿ²®ÖT'™lÈ©Õi`Á"DõO )~’(~ÕZî e(ÎÍ(Û!ªÛŠ›ªä_Û’î+wÃnêo©Ø&óì4•u'Ë·êÈÒèÖŠ„Ú¯®jƤZfÊ«ÊÖo*ôex/7•#ü{AÐ¥ëXÕK¡½ª wQ4wßÛ‹ñ?Ø£÷hq«âµI Ÿ˜ƒs¡ÀF P28$9AŠÍc+à°8™Oí. +վפ“ÜÇjE¬•©–©*^Ù6L…Ž[b¹™ÜS½¸Û0<ñÕÈ—®ƒŽ[R¡N¹9½†û^ÌBwXº “¼) GíæÌýqÖA¯YÙ.«ÝªM¼†Çüvha šôœ¯YE껽:îÒÝia×(…5oôÆô‹éT–«të< ’á]óÓ4ZŽ««²2®ÔXtVæ.ïuémw%Äç¢oïîÐݾ] ½Á…Iù†Ýüy#Í9hœ–ìUÀ6q“œ|MsªÖat,ÚNÍ @œL)!¹°ŒÊ9•Â{ ž—œJçÓÆã C_ÌU¿3jl /ê3$F{®ue‚ä{iš¨u®-SÔ¼R'ÞOBÒÍbdõ›®•­d›ë:E¦0²ËBnf—Ò:_S*ë•b«iøw3ùo3È‘Üu6Ãs*ºaÇÖ ƒ ú°Q÷`Ýânm2rΚ“bZ†>¸ê"s_© ÖþÅ´´Î \ •nñz¶Úül/ú@²µU¼T8÷¾(õ„aÇÍ—û«.‹ùíY/XÍÆg^iÆo±aJe³“ wvßxjÞĈ^­¥¼ÞN³XO×–wmª¾!-3@1uáÙ¼Šm;9¥¢Þ« ù* åÝ œd–¬d¤ãݲ¥ÒXHþ¾ñK'†zŒk{*ŒFíkµ³ÏíV7ÞÈB5Ä«ÌIzxjù¾víGе7¡dùgÝÊu[Ü‘cSõ›ENU­P¶ÔÅaøÿñõž‹ª*ëÖîô‹(É9GQEPE1眳ÞÿAû˜k̽öþΟG¤£ PÕz£½±Q 7ƒ²Þ3½<|'ýdÍÓ­:oš°z”fŒ*7šÒ|èEE›íÚò½^ÚÊæåK¯x••^“÷TzM+ç/ä4Òº ΋WÜ)ܯÕf£t(Ô³êÚ¨Rë_²Vråw‡íËÆYIq/'A™J¦3y§ÓHSÒn¨éëôÜÒÙÁ*¯ÕàmI&ϪÚáH•OLG¹DÆHi©îB¾O¢½Ü),ïršÀP©Ù‚”U—¶8š*ÉÑóÅÅLD¥ÒK˜^4](޾0ƒ‰ã_ôÍñ:nÓâ¾Å©³¢íuº²—bÎël P±ðºìòÕá`˜mófÕ‚ÞPÖðVgY«ù¦¤*’ŒÄ•V7]‘m¹3θrÚ)U¤7ÖlHÙz¯-Aòv$Ž®`)æÇÆID&Ї-};ÍûЬÂÓÛü˜ÛT_7.Hïd.ÈÀ.(-ܦ·ùErËò‹vÌ 6a£[9”jnᘩHÒF*½Çu´à RÇ\C¿öZsîymŸˆJÌ¿x9½ Ò€)NMÑk[D‡—¢0Ë#ÁE…†@ì I†_†í)Ï€Õ–Û¬™TÊ8ÇëO {ŽÇJ4`ÎtëÄD7gÔN³ÉDgËœõpÿE7ß›vZ¡j4€~ó«þëbÿD³ã!álòõ±[÷ÍÌÕ«Mc͈EõÜÙ*2¬è¸YVpË"/lZáýZÖäѳ¹Í»_â‚ÁºÊñåT‹=°ò ïõ5+uV¦IR£®ê}k‘EÚxÄ„zÎõÕó šêE™õ<óê¹â·´I»ŽKºÍh»lÔáÙ¹l¯¼ß.ïUwli‡rìc÷X¦gr»­ï¶iO¹»ÀàË”áW9‚æ¶æéãƒåû{ž­C'…•Æo“9WÅ<Ó²£¾Zuú¶Øué¶ÏhS-©çm¢zSS RÄ0GÏvLæš-1E1Å.U)Ìdn ¶äðoÛ~«ßKîÈ·ö¾ÂgRðÍaº¸qfó‡edAñ½N“Ô¼§ªÅŠü&IKÄGk–Ì Áœ¯!É4㘥oÏX¤Û½™N›¥k–zÑh‘ê]ÓU*×âd¥œÝ„áÔŽÌ«/bªìh¢—²>…#ÜãNm§.­2î)å¾hÌ7~ë¡{^›bœS]Ñ:Ì:ƒFæ˜Ü˜iЬWßô=(Ÿ¶‹´)ɹVtÁ¬©¤DNÕÛöÞ’áp\â7Scb¥)H–pÕ±dÄGL K#âK`踷 lœ.JØF{Ô±Ê#sÝÊÝ»—+RY/w9Åõ™üQñ[ QI¢€¨à2D¢Lfœz¥Mó"µ†õQÿ‘œ•Õʅʱ] þø€ªj?ÊiÃÖͨeÝ•jîØ®„K›2wˆËiºû¦£l§ß+Û ¶Ø7ãYFC÷;#ƒ†5¿ˆJâ ŠœÞïä|A¢¡>CÔò茨ƒã}_ƒº\†ž™Û²ÆÁ²&¡ õVzêì6ZÚ&º¯:ãp¦¼ûÁ~mÅþSm†¿.àpá¶•˜ô2\¿ô “¾¥xOX77Û|–3Ôp™ðÕÈ"ÐC´%Pi;¡¦0dÜD}3|X¸m'w#^ÆÐsÇÍ Œ˜?@à´R9MSð}í‚‚•éåÄ;à³æàsûð¾ª|Pì$¸¬>Dv ˜Ý-kÌ-=«hùhô`s“y«X~ƒ| ¿:¿Á õòR†{/2mdÄÆ§Yr*õ<Uw5‰O• Ї ˆzIL04<ó€h•Ý4ýh°Qå”àL5[* Zfò÷Êsˆ`öD¡›|°¸ÂÊ”/‚•ÛÅe9Æ¿.à=Æ6réì¾^dIë¤Ç°´à¤/×_“„nQvË.z^4,øÙ]Ê<µe@Ž·" ã³È6l$Pm@VýR‚YÈÑKP[%xÝVH@Öñ4 Kà = H[‚™£³É¶zfHîü$€š Ço¸„ŸÝïç¿>`¼Yt:FÄ¿$%¿õa¡v&OÌ›[OI¯µ°F¹ì#iºŸƒò2dêd) Â4 –ñg-Ôræj°q5D« ²q‚ÑP#ê¨V *Nq Ú9@µ­ä¯5h¨â’”Õ)J>l¥4Q@ÑC²Z;³çä0÷¿.ààÄŒ?iÀÅ~=ìÉœf¦’ÄxÂ>Íó™r›­.~éNÛ5Èq’S€áÐì œ“ ë%¨€~ÔjLÁ×ÐOs™`rô‘B?zòq¨ú¤–½<õ½Ý=ò@ÇÉFÉ’EƒtÚWµlÞ¿%æþå¦L±¦··[. ³"¯õ`”Ææ¯/³sä%ýä|) zÑçߦÁ¿QºTëáõZœ ×MP&˜ÌëÇî°ölα¼k€Õ“Óš5¼ÔŸ„`kèu”¹p&`Ö^¡bæÀ+lÖ7çâ;ËlQBºÆeß­(ÅØÌ Jã-Ò3¢ ã']>#‚Š` ¸íöSbíÜ<üìÿâûöw0üèÉw~xÄÝ$ˆ –7Às*–`,ž×‹€ÇÖ1àñêpo<à €;¿‡€Û@0à&¬›`ÒöG{¹¨s';?šLÍSËU'Mú?ˆpFãŒlŽú„ ÕûåŸ àøëþuO›? îÿ…¯ª;×/ */ f^(D¼•"Á~|ã"±‘ôo@LI!:Â-µÂa€°·šß‡ÏHÿ™³g›> ÔHƒ‡›H¬×ë%fò" Bni4Ž Ôº±¸ý—ø?é _ñö/~#>6ܯ ûÍä²wÁÿÂ[u€,“ÍÉæÊÙ²ª›@Ö„Èy2'ýGAl”^‘½å­è}±ªÒp©§øJ_¶|ÈæíµC4V¶‚Œy™Jbú³æïJ?²ñ¯jûköýè¤ÿÜð'‚÷ãéý«à~¯PrhUoö©š&:¸\€º±@½Ô] AÁ¨7ê.ŸêÞL9”ÐL96zßFfÒžØt8mWI‰G³(œýT1KUÙ;ý¿‚€¿ºí_·í7³á‹¯‚û5ßþ-öWºýO©2#…Q_€Ñ/`ßZi¼Œ3Ô&¸Ÿ€I½>µÒžu`ªû-0µýßã×mû}ˆ©þSÔ뛌ð͈-¬~¶vÐG¿ˆÛ˜z17´ò®3W¯Åƒ¾,eÁ¾x—Œ{Þè…àÌuËÑ)íþñ”Û.ÊŒ¿bò¦ôõ²þ7ö«‰þZW?¥§¾bèÿx~ÿßøÊËÿ8‚Ó#±t‡\®v±t|ñNPÿÌÅ×É©ö|,Qj¿9\óûÃAŸí/û‡ûxîÓ«Ø Ø²ƒjϤ׷E£·)ÞauM÷ŸÖ*€wâVcѳÅ<"ò+Ó~#¾)¿r¨ri¡êOýïfÞÆx2XZòlê\¹ ØÇÓÛM±‡«}—÷éÅÚÜAÁÈÞ/•Âjc‰îrŸ#ü¥8%ª‹ˆ ó«¶æúíκ:œ¾ètš½ÒëÉØPN´—ÝT„|t, Êö•KrG„ü4õ7mà×¼Š.ÄË÷Iþÿ²×ž7R&Ù;Ùüx7  ùz©ZÓå> /úÜÏõÕù:}×¶ïÉXÁã™Ù'ÆD¿Ÿ—=nðëICnÞÑ!ÕJ÷O•–ݸQ±w •ž~Þ5ºéû±ÛXø¼ 3§¶ƒôáØ%Y=&ÖÆào¡¬¯‰õ›¿úFÿ¤7|ÓkOb{=ÿ—úðÓÅÉX>•ÆD·[nra8 ?îGŒ?èÅ‚;ívgÕƶõŒcÛI×6:²Ÿ±‹f@kéf–O–Èæ¦\æ>OÖïšjŠ“l#RW¥úµGuýmO®½¹ÖÞÓ}º6p[Í´j´¿øºVâx­_‹ëÃñ ¹ášŽËÁ\_Šö$QÕ!7‘­«Ýô¹!þ ¨“Ügv:ÝZÒùæÆÓKÑ>P‚H<èF$ëqýÚRºuý!®%~ü«ú¢6Èé›4M«‘¿3?„b;f*¾ðÐË›HwËÜ­ûa:—ô“½Ó0÷ßæÕR\,忚÷×^;ðsDª\_Y7Яu5v!îÑ ÈÍ«qªÕA=VKhØ5 TmÍpÕ±cÊUtž1—Êd~Ê2¹Wè½Y,oœ_æÎ¹ªj¹†wêÚ^”nŽJ×Ápé>&ó£k%—äâÀϰEh;ÉÆ5§Y@Ïŧ3k’ãê¨ü‹Y‹SÖ¾²ªO7.ÿÑ“O¥ûäxís—æÆu·HÎÂtÒÛ©Žs¯U@,§Ûò¦Ú:úûFíê‹×ÆËSžTŠ3V2R1ívó1_|Ï"©8pzZ%£‡çYmVúAât ó¾†vs›Nz‘ ÒÓ›½„-!­tö4ë ³QÉ%XáY•b_ÌÛ¹6*f¹žÙ/Éññ¨^oáÓ›|WŒ+KïÑòC9HFâžòPÛîcHö‹ƒÂmT{‡Yݜ׎˟÷q—¼¯€OÇç;8bï{8a‡™ËžF¦’UÑd8»M×z¬¶ Ëâ˜qú½ïžÓƒºD¦¡ËÕIFâãø>7Çíêý/&E¸_é·†¶Ýža²Ò½7¾îã{µp¨®ÊÛS¾ç©-¸ìZ°æjç:ľãåés#Èq÷JÝßÅVö4¨õ²*\ý ™¸P›e ¼³¶º^kgYôô’‹gÚæI(m¢WE1\£’3ˆç½®ûÙÌDg ÃUÛL𼑏éeo«ñdv3âÅJwÐ1ò­mŠÕ~†¼éß0®UHÎèGÄ9pJ™µãíkrpú®‘‰)muKŒ~¯™BÚæx߇|Õt$µa¢g»m¸šÝ7ˆ{0Õýt¸Ò6ËÁQ üëëQ÷wžPÃN¨(gâQT¢•Ë7íµ‘ãÇ“ùÖ—Wwœà´úb :zÐÁ–j¡)s”{6(«ó”=ª×Vˆ¡³„·µœ°oØ™;©?Hzh­$Ó™fÃ]ʲ¾R3¦Î´3Ymk– ¿¨úêÁk×Ôº²•s¼í)MLåÛ‚ÙÈmϹJÏk–zmXRx‡K¨)"Le)Lî ,ºŸg¬„œ&°çÂó½^†âò+4î!•®M³¨P&[Ä3Ýæ¹ˆ¹Iž7lL¶+uµd£´Ë0Z5žRj½×b”Kª%(Z¾£Êwtš–ÍpûA¤—t/I½ H)oˆ#4Ós³úL˜’ÃPXƒ'¿Ðs_zÒܺäÔ¸ õ˜rìf Ø]ûXàØû¤Ÿà<á*:˜v‡ºÖª™¤[“l¦êQé)+…^ÊJó{rô¹}^ÜZ«ÙwM3Tm÷Æ ¥%§QéU»¢Ræt"Ä‘zeÅÜ’„iÒ„"!f|™-ð ¿Ræ=¦ßàÖícŸ«¤©ǾKç„­ùk„YSa­Ç(–; ¯”x§[›l–¾ª™.£Dí1£øõQ§È¡a³qd¼:4ì`‹ª§1ÊͯVO‡Ãò«¯½ös­oª‘ÏÒÉ{ë($¢pð—šâ çiÚ¥¹uÒÝæ8>RÙÝs™ak½k=.`Nt1f×é„QÚÈžŽq/Eë‹»HuÕr‘Jß±.ùî,ÏäÀ}˜ä{~iý ”…kÃ/Ú^íF×¾Tþ —à]÷žÃgÃ;ȇXk—MNÕ~ºp?zµe”6£qŒï½ÄǵN/¶ö8¤X±ûĘ<)FYóÉ]Œ¾V ŽõЦõÇÌ£s¨AuKéeÉ£  öEÚN‹#aœÍNc˜êð9©–o4gôãkê·Z_ã ‘åÚ\ËþTn{üR$[8œ;=§ÇÌ@µF¦×y…ZCääÞ6'ŠØŒC¸`¡¿™(ì>èë9~Ó†Ö„¨n§‰%ز”å H>MÎ~‘´›ã ç¡.áì³K §·ŸgÒ4NŽÖYlå"¬,ð;Œ9I"V–ô[…Ó>NîwƒÖ~ùŽÖ†jä=S,ŸŸE«4\Úba5Ò°\“]30ãOMHEêU>å¬:×…ÒÞKú–lÝS^´± î”55äPß$eb¢–H¹5y¢ß ›’9|^s+8ùÄØjðžbår傱ì›@·û–…V{f„ ™ç©· *”¹­[ÉHüûÒ’šh«>ŒÕZµ<-”ÊÚ¼’ýãnHûŽS«Ç #Ø—:jÜËÒX}Zü:9=™KÃT¦?‰É’¼8?ñù–…pJplõʱ?Vî׌ÍÎ3èŽÁ¼~­ÞöTèè'¤AÌ0¤AziD¾PuøÒZ­à–ÑÆáK{_Fä{m€È;¯ßÔ(®#ŽUvµ²ïßýü¯ x·î%k±Í—öN/àÍF?ì{Õ8ÖBÉÚÏ=îýÈÆ™ÏuŸ8µ¹Ý° ¶ºcìáÐ]ÇК"';æš“ã¸g! çì"Š 6ŒÇðåÍaÝþü¿z œuv»jê-妩·l©·â¡´¶¡ÎRïGíÑ ‹¼b±øéùºèßWË[>ûjpÚÓФûÆ=§Jï8mŠäÝ(°gë®Ðã?ᲃ'º7Î7ä$ïHã2#Jëˆ JLÑðÕÉÉpŒ5-X?œKPWÁêPúê Rg¶MÙ¸šco,t«”’ Lœß=À¹Ý8Ø©›Ü+ çn«¥ç¡7èݽâòŒÚù¨u“³6ÞǾÁ Ú#r^™Æü.m¸L{x×ÈI°¤pfº¨Tå_p<š<¡'Ú{CÝýMFÔG*5¸ ɹŸ²[²Æ\8³I`%¸› ÚÌc@‚ 0¿UX93XžM̱‹ m€ÄQ}ôæÕÍ<é¶ßÒϦ7ðJ‘Y‰Nî`Z®!ÉÈÂäµÊCµÀm!.ùFÌ5†Gg¹”IxØ•CâF´B‚2ùK*…ÀÙ œ`D&x‰ç43A»’~=?Jð8\€‹¢þÑ“ÅWpr¸8ÕÄÍʇ‹É’pgÎú¸ÊÏ÷ò)‘í¯¸P]K¹öƱ28szSL?ä ²] |¦ÖaºUÆ'g.’Áö™‡ˆ´Î‘üÆÞxòÝÓ‚‚<&  )–KPPLl@@X9'8Íç/ Àï- àLð¶Mð¤¾ä’V/‹¯²\[ùÞü äÒcâgÎRï×|\u*v–w²æÎ1jæžâê4\q—ïR«à[ûe£jë­ÀVÓ`S˜Ò$i”éäŠYç‰5…ó¤…Ïs¯O|òÖ<ú€xç× ŽO@‚J²-<ŸàÐÄ&>bâò€èô“ ê–€Û·êÎmÊ÷+4ÿãÎ;ù˜íT3DXú•ª0òô%ý1¾Q­®™ÔYïîYE[ø1÷1ÎL¦¶(ïÉÊÆ$@©¼–À0ÅØ™¿¶`@!h37Np9 õ`@a)Ïv /gôÑ“O\Òøå[äH2†€ 4ø7\âSbî7 8{6ÌÐe3Œš¦j[4-òÜìż¯æ†ô…wS·~GH)å¦Ä, §Kó‹['ÓµÓ?¶`uˆe@[ùz‚QÐ|™ ~´’"´“O¨jÐÌ{hd™4þÑI¶ï°šj1G¿Vào´Ä×üOð×̦žÖk†T.lhÎÔÜE×k:³’á@+U2‘ `SÒ¿ð½ô3—V2µUë ^MÀlØn‚Âä£ÁnV{Àl5˜É„ÌÔÊ%x·Ó&¨7hÀx…ä{lw -濹Àå^Mx”æOïähmxš)Ýj‘~o’EÙ“Fw?$µŸØåÔÙü H6³œ¤hfÎ,7W¨·WmÇð}û/ » #Àá9àjÆ6A|\ˆá b p%ÎO°.›ìcÎ.+¥W³BÀqé#à°ŽØ—Pó¦6ò,(Äx›îsCãª_CÅ…š]**í·®ê¥;bW{°%ýéÇïÐI¦Îáü~û>é g|ƒ~q=Aï@ÈJo^% Ÿj$X%‹”›0ò~2Ïñ@03/ ˆÃRòYgX+é‹=ÎÂKótì'W~+ÐÔS9zÞ D\SpÉ•…¨ÐÝŸøß§rü#Þ­Ûßíß©ßô†éã׋û/M—áoïǽt 5Ë% µÈ^‚Í HqÌ©]IæuªK uËê$¯³ËÙ…pŸ>ä2S >?Z¢\ïùL×-¼UÝrH>¼`ÿ63Ð7½á«ÿMÝýê¤ÿÜð_ù»_ãë7þ6_×€²á] Bƒ¨°2*  jG¨ú<™Ç?)ͪ0S€*öë@•w«ên×zÊé %‘q"6¿ÂK„ruÄqÊÜ)ù¯ø¯jû7¸ácöýÕoS7ë+â~ÖòWÁý/ñöšðµÜ^´%0Ró0”& Ûõ€QÎÏÑÊcÀˆ E`T 0jÌÿ!þqÛþ-ë…fÿG6‚<}¤Ç¹í?‘Úí:ã´×µ¸Ï×¥”Ç/I‡€>o4?sŠrª½+Æñd7ìc/¼Ãµp©ô%•ô-÷]¦´Ù „ ¼«sçë¬ýâ[(ë÷IþOäêWoü¶_y9âïï\¤ÞÆD˜¹·AñB7ÜÊ©öTë?È1JIñ!F™Þ¾Kb£Ý» Owټ܎E°ÙÌ”ó~½4V§5ÝÛÞWÜhþ^†è[œJ)n~­Pú\ßгôyÒšfñc2ΨRGÓƒømÜò+‡þ§Õ¿‹yÁñãJTVÇ3׬ߎ·öØ? 4´{{¹Eûڤa¶²ˆpØÇ4oͺVÇ•î£3:|ƒ¾ÎÚYW?Ïôÿ+kà#5Oæhö-“õƒ¬½ë!^Š£B{“lo–Þá“)Ôx-ÇÅçz7òS‹ó0@§AHvÞýS¹ ÷•]Œõ®µÕÓO®ÛU»b7}[êìklµÇÙ¥ÓFÇ×JìâtÜZzùéÒ¢7£S“;ÒDªBð/ð©ŒU¿ö«“_ëªMö;¿Å¼>öÚï“üÿCµ‘°Ì Ä{™¾²©;=ýP÷»éK=ì@ÝBói; Ü‹]$7l-‹¹iË'Ê«æÆ/m›Ü¶pˆB!wŽÄcõÙˆ”Zª~;D]Nù°›¹›µƒkмUj;fÁ\aìU–MXñ•qíëZýAü}÷“ãK­¾zò·Ž×ªûúWýk]m£ýÑZ:Ý (—BÎQ‘d›õX³ìðѱ aúmyµm5hb„ÕqÁnVÑ…ÝùxGi{PYö¤BÜU9£“¿oÍÞ¾øLz0QÆÒKq>.¹¹2r»žG}cVÿe]µù‘ùmá×^;.ÞoRÿTZàÝôéòþZW?ªõÊÚ5”8†]cxªÙ©êµê åWà’\ñÙ<^ÞÔŠL™;?Tó²wjçu/úÔ«¹ö‹vɀзëx¾kazqPšv ãÊzR@ÈÞqå|rMÎ/[ >ï¹BnÓ÷7¹ÀV‰[Ì_,Nåµ;v+†ÞW3ªm;Ï= w´Úǽ_E§•AÅg¸¡¿¯ïG^¤¦¥Øê®Ünîã!)¾§Ñ©hÑ­-ï‚Ãô gVíaŽ+L¨ü²1áòôu.ç’þ¥™ã^ o‡Y¾’=ÝvVÅf‹LìÑw뱉«[­ø–%6÷–%! ý>ÝÞß©d oÓŬ´N.ìÓÍíµø®ß¦ê¾KÇä€yËÐe²\ŠÓ«jñ=)U cO—G¢ü²Ž´s›æ«Ÿã½ïâ [È:{²‡¬ŠPçÌu*?~ŒAè)«ëgñô{ëqi[hiièx/˜Žª5ŒY»75Ü´t7ˆ÷SÒ—#º£ûùé>ÁâðŨ|99Ý~£©µÖ»<ÝhÕUPËCÏ}¥¼[½óËr‡jdò¾ÄesÜí”Ížúã|æ:Ž‹‹}«[Š«é÷:n¤•q; í=s.Ç&z^ÎYóº5ˆûû¬ûñÒ6CÓ‚\,©ûé5§†®ý Êiuœ+Q¥•UðûòõO“©ñl $¿žö,¨Ñi™fÃAK…{ž|ÅïLܾn7 ¸)sUâ¡f#¬Çl"¤å²hŽk9ÅDO9ã1\5—Ñ—í\^§_™¢¶é—ÊZ­‡ê~\oª¡3ì)§ù|¢¨Ôa-_7ÌU6ø"uëQ²µ ¾¯ËX´ÍôV´ÓI„$èu¾èYZŒ_b¦^0m5/Ô°™„–Yp-u'ýyafÙ­w–ýPC$ˆ(^xŠ;3Žl”Î̱,Ý™›ô¥–Aè–X"ií=©ûà`P–ÿA¨4ëVÉ~­Û!³±"FCïAäó‡O÷^¬k]œP˜NØv/5|zz×Z»­í7Ò³r¾ºlÔŒrTù’m”Ñ‚O˜×œR~Ì3©y½iR~ÚýA4šÜ}®IaUî\e…Ymh]ho©ûqx¤ÒJïB¾®«Ù¿2[`i 21:ö2D¾ÿôÔ6šxqÛâD¾bÞ{@cô0C7¹{üƒ w¸¢§ÑMu\Åèí¦Ö«vù7ƒÉ¶ÒþM‹Åìôgó.=ì8O¬¬ü|Þ1*¶ç«-TJKÃÞ…ÈhôfÃV| Õáš@抄9ñù¹°'Ðzá– ðYæHà.„ð8±É™Ø2è1úy«£›¾5BïtFyÆ'‘ý³‘°³n!’Õ>!Rf¥#a?ª"û× ÖT^Vå7£J÷“Þø¯¸ÀO(§*Ž€m´²»ô¬wîë{»_U¨kK¹—,òk@ Ìy´¿PVû°%G^á®õZaËá}‹ùêœ ÷®† ›ÇšEƒ9¥£|)—}”¯ŸëHx凈4ásÁ"à¦ðÎÀê©A·faÝZuV¯vnÒaí7ú“Ê.ç½´«îâΓs„ôþWU´0º4”n~VL®0h¡­ó™§˜­¼ÈáÞãäœ]¡[mº@ƒûzƒòÓ× ågò9¸y©K‘Á]…Ï#97+í*¬ñ ÝžÑ2³0šzA]#•)ˆµT ¿¯~TÆ•…‡Bê…ٵƳᇿ èâxý<‘..ªŒ˜oH),›M¯æjaÌ´s“úÔECËâl²\H¶8º361-Â{Œ­Ëkäˆ׈œž~Æûrñu‚/$õ€›«4 kÍ ݵµ™3ÄN½Ü\%•9Oº©T‹ß€Ü£—HÏPÒ‡‚Ç%@†É(Î i ‘‚ÜúoÆå†¸¤+Ù¤wA %w%Y2›º¼žf×ÚEª””…2~³YµÜ(›·aÜ;‘'´Ö+íàË>µƒîËÅJ3Ócêu»ÜSý¥RoŽ£eE(ÓI”Å?õ’P­Ý¨ž4Õ0@ب™¯Td“yR.Y\Æ<€Rv£ž»FÍ*§je}+ø¿.àÀtõ\lØLþ*¦L®p=hº4ŸHS#]ç…ì!—\“Ÿ»–DbuÅ‚qC¢úð =fò)eËpðÖ ‹Ñ-Á#Ð¥N%hÉ=#¹åj‚ç —ðÐ+%xdºí7º«&óöó:ŠÎÝdÉù²ƒ8B‹ü'S­ýú€B”¶ŸV[Ì`J 3Â"}Qls"Ò2]g[ΘÔë.…N}§^=%{ÌîuošEn„vË>.ÒliŽy y7èw}R –LMC›‚ïÛ&¥ÖÏÀWå'À‡ ðf J0Å^>Ò¯°r‚j6Á¹ ðÀj'Ø|²:ñjöðƒxqêÜ*ž±’ïQÂ<À™l?ÁhYÝïQùöpz¿.à z¯:ò]/esçƒn %WSØì"lÛì„5NûˆÂ*=Û¿òÉqAânÄC¶0Lî–ûóó ˆ…')@Ô5¥œ —œs¥§Ï®%Ø á§w€°7)@ä<y¹ÌÁ¯ @à¤ÕïËü£ôíeî¿fÑèë.rA¦ù[À˪vß=0iQqÏ\‹ºLh¤:h⻤ëŒjÙŠ§À@Ô#A^‡4 7+ãƒô54د-¸Êg^‚Sµì4Áî H7‹²”2™™Ô™¶€TäËX¯ H´yø†LTZýôʇÂÙ¬DÜ­±•Øf=Ä#2¿Ïò8pŒ âŠ93P8š•ÓD[»œC¼g:¨€]å;i÷ÛQu >án6Á,¨åÞÔŠ®%¨õ5¼¬5*%ùqŠý8‡Ç½#ØnªÆU|ó€Ê u@)êãk.[Š·óœ´.oibÅN=ÍϘ¼:Ôû’X…$„µŽÛ3ÉtòS´bZ°=È€©èù/>l+ëü™‘s ‹É[=_JÐHç:a‚u 0¼0IÐ>F`aÀàC0„í†$F€÷wÒ“Y€Þ¬:€îÀè78¹W³Ó³»Z½·y3Sí[åÞ;Ð^f3+•ïœÀ¾šs˜\gÌcòÃ…¦pîÁw» j€= !`_ZýßøÎûoäZŸ4àcýSèm2þ§Æ›{Oð¤{Ž,À®¹Oe·û °ã5ØöÐl-Nv“=ËfF®‡£«ÓbŒEfíÚ†neÙ›#÷pºåÃrêÁôÓî;©ÓüßîßÿJoøNý_øMtpf€Žw€_½¯€_Ûp‚½øWü–í~Ò&‡à§+ð³e ð½þð‹ xÿÜ*(éý>;C«cãÓ‘âz‡ŸŠµJ?i¬­÷ÞpAèŸþÄÖfýïòm_éöÿ'½Áð.,¹ÝñâÍãÓ@¼'} •f@ÂHp2„;@|o@<’E6ÄÔ7øõbžñu_ŦA(4[r.­g*Ö¡e.²æûßà¯bü‹ÿ7|Óþf6üUrÿЏÅ#óñôþÕQ¹v(VJ·RÍ€Rã( „H(ux”†%B“·ev•>4Ës ‘¹Ž(S¬6r¸žlÎoð¯ÿØWàoÝ·ø»î¯ø¯XüõùþUpÿ;³á?Òí'>á?Ë€®õ{@ϳk ·î0ÐÇ«ON¯¾Ç@¿Oo@ßOu ÷Ú- ÷ƒÓÿC ý&Ú~Ëz]Í’Fû;¿èÝ!w1¹ÎØÎâJÔúÛ‹wεýAÎ\»ÿ<Õ^]p·.Åét²ˆˆÅr~õwI×b{I¶eÖ hš½¡ädlfÕ ÚŸºcbR|"‡›7ØW)êÛ¼_ëêÇ'úßöÚ7ô\9Ëë£Òßíö鹷ߎ9å¼!šÐýY÷B™—áÙ£’Á§ïP£§PSàÿ)™Åjcb@™#Æ3#z"8ÃJƒ½'JfÉQ_9äú½X®/º]}rî¼{8Ú±SÃt{ì,'ßvý ß—¯Zû«‰þǼú•C¿ÍûʡߴÅ)w)ϺL%˜B ±6žDsäƒwwÈMO£Ar æ}e»Ùôôãxßí*ãd¥ñàö©–eÌ^¨7IµÔgù ³9×Zº7µ¹)?3MnÏ{Q(¹ÍF¤u'õk—¾Õg…Ýü½ó-”õMøk]ýS(ËͶcÖj}tÿ‡:²ÔÓ÷;¹ónöµÔégÚè ã´–…š×¢j“Ûxõ(ä½d R/v‘\Ö¯­Ê¤®?¼yøè66¡ZÇÚ ×¿× éúAªèòD.Kk•eÍ+VèÓ1.s÷òÑßw‡¦f0Ï—À³ô/ëêÇŸ¼Ú¹ÊoÑÙŠ_9´3PGÏx–UÍ{zE!; åTG>馷*Y{÷sl͆ ŸðÕ‚VEç…tàR»²¬äœŠÏ•JåMX(—¹s¡æ‡Z©é:Õž§¼ÛÓRl¯vîc ?‹ï¥FþÜ,B;+,8RåùYýéº7rfAoæ‡Þ*¿¬Ï÷yú29å6­Õ-Ç=V/;´ÖIÀÏF¹›¹Îp%cr2·ºå²Ÿ~ïVí´-ñ«4tžsÜŠLÓ1ÖS}™×/ŒY_¸ŒÉQhõL…åãRá7Ϋî9Aao(ò÷uÆ/ÅéB¾hcwÇ™U:…¼/募\M÷ì0ÍU²§fU˜kfâ×ɸ2°ºž8¶,:½H‚ô& ²Gs\¯ÜMôC†«Ï(}Ù}«:“J´ÍhÝÒxL[©ûù QC?éHÌuöƒ¨ -¿ÈMÌì ³ ß¡1öÓÎ9(]„¹_±û¬Í½Â¸äéy_ÜÈvhújV…xÕzÌnZú½Úših7´LGæLô´r Wûq;Ô~Ý7‘N¿ž-È>3s5,¨;å´pnŠJ·ùº…%Ùü‚ô8Am©õ÷’¥Meñýh×<û_ôÒæÁŒéæBhèÏ.VCÁ½¼çäd¼_êÔOÉÉÏ4ý<ËyVölœÕu3xÒ²aÌSB_Æ-JÛôyod¼0,z8ž¦Ø‚7ÉÏ ŽWbK¨Orõ,3Õ«´~ü+¾ÅÜÑjxw*Nem7ß|×Êi ßðŸaZ=-5FN·0÷;®‚’É/™‘«™éç7>£î4µ ÚyK¾xùHöž…;™é5RÄ(ÕÁ‰Üú"HÀšxá+âx}aÄÏ0j³y¢ëª+$}'¢„²§Ýe/™`’A+òÓùAšJj˜G·µèCòõדü³O÷ÙûÛ¦§Ú«ªoƒ¬ªžê¢dW˜_ [ë<ç´öbGdæÑ#©2$¦7Á§¹Î /"Ó=ŽO/É}[¸D ó¤<…Q羂®GH­äK!Ê¡ç1R«»W¤Ö`XDT–Ühç»pcÚáZ·QŸç£Öz^ÑÉѪìâu—0]œ]p(:ëc6} '?HºX‘z”öi®Š“ЇóL5}gN3iM¥ˆ@Éb[´ßÌKC}Œ&Ä)º^f×h%jœì^(§8²GŠ"RÛílD …>Y“!¥Œä܇®•Å|`§ "†ôS@ú™R¡k8tʼXs«÷lEêšg$®HŽX$/µ‘kË…¹¬”bí„Ó%ùuzšba½`¾v2M.>R@(OÜ%t#¼»(׸ö‘½òN®Ç0·LP< âvô„Oí7Gi]€U¢Ÿ®+¤Z©—êvÎû”å¶ 0X3°+› &©G‚…˜H&×°ôm)éìҩ\ù<×ÍÒp`…Õ:ƒçÎ[ó™ZÐÆôGÞ¼@~‡NN$VâvM§ïúéFæ„áK†d‚zˆ¤¼‡ðéMà¨M/aµ?BñÂKz°Ñ˜!©§Mð)k’6S :õ€}ÂÛ Ytàfp+i(ܺ6ÜÆŸ . €kZ®nÏV^•%p§¬Õ³Ö¯ ¸’jÒ¹ÜHer¡~0™ËmôƒhêdÑû±+¯žÉž4…¢^ûëƒÀÃ5ºÇéÇÁ>‚nñu˜zöf£T/sZ¤2t2>Üä ðsÆøÅÁG@­›à¼ÙûÔKB(×­tÂä@!Yi»á¤{«Õ[ô;¥Šýõ8yËÛ÷ÛÉ ³ÚÅØ)ê\½#x[ÎñP…ßÒU“‰kMŽ¥ë Û@órÞ“ë¬jóT_@§ ·ŒR™Í@I+‚ô ñI—OP±2E‚Í@fê sÀ¤7vÒ¯õ2è@iÖ³_e9ÄK Z9.MïñÓ½iá×ROÉî2wš¡»§QkDµ“+$]gr_áêAÕ¢­Çî¤Ðýøp„¯-a“zÛ%@3ï@³D2¥p›Ås‚Ñ *ôÙchrÁHpÉ4— Ü&ÍG7€:P-%8Ž*^P€JÏâWYþ“±¬Þ ~,ýº€Ï©ÚVYc-×á =¢ã‰l?¹#sÈ ÂÜK‹œÜPÛNÏÒ4Áê¡ò8“Î`fk0¡sÞ?%8>FpH‚ ›àhŒ4Ý«À(k‘àñ4W>Ï#£wyÐG†èÁ©|•åj@Y­òØ6þø€Ïz!ß̺i¬šRÚŠˆúÄÜD\ï}."¢€†t!ƒ¯çW•ß76Ì3…¸æà9ü›¡±W€³ÂàˆüØ=›JÐ!Ü%€=2Ùó ÀžR7Ár °— ìDè[ë[M’y£9°ø¬ªƒðtýçòÖú' x'µü¼¶Øäƒdm)ðZÚ |oÚg¬¶$‰dÑÓh/Â&F¦òWÂmÞaµ€¦É[r ¬?jëø…â”ô+ç³-Wµž`6øM?|»Ç¾ëd>+´Þ“ÎoH Àýbàön]iŽC?Õ$»î¢ßlý–o{C3']±)ñþ(®Åó–mïó= §±ä¸`‡ÉÑFLô¡Bpc'—20@:2 HÃÄÉçÈUö×L<{r‚g/ËK°ŒñÖ€8-î€8Y@¬q'ÁsˆñòùÑ“Û !2KvBýZîTöӯإ‡^þÚ\‡7¥Úúµ4âåâ}óJµ½¥Q–èáµðPE:Þ"!«½¨%#üàåݾ¬‰€²%e*ùÅ'ˆ 5@±Ù~‚ÝPœ }I€Âæe@¾¢9 Oî§ö\Ñäh¾OöCñ±*ÍγE!ÜÌû6¬Š•Oðrb©°Ä1B8¼;7¯,{¨¡ÍCÈ1¦EÀ ï̃ÞíÓðkÞ[€ž¡ »´› ]IÐiº‡|²;èzõ èEÚ&‹ûnÐ9e h¦Íã> ñ਷$øpì\æÞ]æ2§·ë®§¥ D«ý.ŦDæAlï£j–Â>Tˆš ÀfvŸüäÏËŸ¸†¿Á ßy_È ÿàõ)ô&Ä ƒ«5`Uë•àÌV‹Àrz°<{ûSÒí ¢ÿ½÷\o×…¯À÷Y–«,Krï½÷Þ»ånËuÖ^ùq®ý£$'¶Õ¬¼ÉùöÌœ¼Ï³¸2E  1^ë]D™)W aòÛ×áúyÑ÷QÑpÉåÕœ£ÖL:ïÀ®&£ýr›¶±ÌàØ(ؽEüÖ»õÛ—Û$«7€†‰éýüë„ûŽ¥æ éï Üåfê8ÌŽç³N8GnÐð>‚®†<ÕB–E(©¦²TÀ`ÅÚn×hš·¥pÈÒ¬m­*Ä8?„ms‡ìáø\K=Fÿòœ·l‘^Í®pãÕejòr š›9@¤{‹@¤ÇÎDÛ’ÑM"c•DÆ}+ˆLXÍ 3$ærZ ÒUkFáÁÈMÓš=>Õ¥ñº·ç7ÍV>B{±P0œ˜ôö<Î_̺ŠY/1½¹0ÞÑ{¥Ñš ÞÇò·¹ù |[ôC@¤g ÛzÄÞÍ_ Û6ì„l»P²«SGÈgÝŒ§w‘oyv1uÏ¡;6K„³ê£I;ìÑyiž"€?C€oàY ,<ÖKüçû\³á^±©ÞÀóà²Lcãn£Û älä;s„m çYA.=”Íu 9¯'#ä‚.Iȹ_Œ$¶lmÛ,ÆzGÙÚ–ðñ¶§}£¥HÇ–†ú-Ú» }eJlÇ›­Kmì½Õr]ÓÎ7«S|N¯¼³ùyÙÁê%œßéáĘÍÿ´¦4Ù&ãM2±/Rð¸F’>¶Ú[–MççÜ¡LuS±‰²þƃ6™†÷É5¦ÙYªzãfëSãk×`ãXvжg¡-ÆüTò„™z°:<-hèødݦ&öÉ*;®¡óÂè”WFÞõ¼1ìØ¶½Aßµ´-xÝ7ô §:rë»YcÇÙYe…¹N¹x¹N.˜›Îφ®>ú“AöÈ~‹jSºT‡ËküÔŸÈì`–¹h†S²w˜]³ÖrxÍwƒ¾#zì<þkopi>>™e7uV ë”…h—-¨­E,€ÆZ®Åßl:]±ÆµË5×F£ÞnƵQÌ´¯¦m´šÂf%ÖM[ÉZƒs¶ÐçeBWïþdvr¬;tJv—ñQÓ á}3¬BzSŸ/ÒÍ"Öd‡œê²-:{.5›¶u½q­î€®Øœõëh€†Æ³ša8XT§±Ù¦ŠNgt%kž+–Å.ˆ‹¡´-›ˆ"]·yŠ®K:^ðÁÝr¾5OTHžB†\Óf9Gmœ„KlÝU6tu?µ´V܇²2ggšuäõ¦ÞÁE‡ž aC®_µQ`ŠV§‘QÉššŽrÁRó–ÊÖB°HW QÆ;z,$ Mo6Sð^Ë…|'X®äáA¡žëG›œvÒdãh–™fç›ô¼¸=§-4nLÜYg²ìŸÆt?ÙK¸õ 4~šÚ‚lóºÚ1672[ ¡³ŠêM¬;”«»š5F–¥2©Û]ôb›¿¶Zt®NŸ²£xR5Ì2Ÿ¥W3–´e›±¦ ޤ#¹­ÇÜɲ'ãOÐm`»áL\…Bjçb×q» š¨N´ŸÕÏ£Úuô‰Û(sxZó‡Âè%5 Í;Wp•i‚«egȅײ¥àzæXMi›+6t5m.[9í0 ôäLÊŒvR«â´“,»jýDÍæz꨸)¯cXaƒ§…c4bÎ^¢ÚEŽÄ‰Š.bØtÑpÊÞÅCóÚÀ²œ¾`Á޶}k1àÐzþZ‚ÞøNó¸žñŽæ¼Q6x•[½7l…ÝvÙÔÖÕûžð¡b™Y)€;g+4B;ùä¶²KÆOb:Ö‰z2ÑŠd#†Õ2NY—åм²¬‡,Ç%XK°à]öƒäu?”ƒ›YÀ¡¹¬üµèqë;M.G_3…ª½×…Ýà aÂÓ/U½-½O¹ãË5m5,,š\fdUqÎG¥å½é¬ƒ[#d ƒµT}׹辜ç9³ÔLgñ`&A7r‘X'2ñFâÒš—io°àiz8âó»uŽ€¯™pG½WÊ‘ðv2Á¬^ù ž~!Rñhw‘†{TÉv?2ùË” q¡×ÑÖ™ n/ŽÕÐhpX q‡½œšÇí,Ö²Õò—­­Vôøln»¹šHŸmZžRÈZ35P}©j<òHv0O/ ùNâ°bÁº:žæçdpU·š™ŠáÙç3¦1/¼$0v‹àn½'])÷ÞáBÏ3ë?ú8ŒD…ˆ:î°êL{9m4e«Ûj™hÏzZgVŸu¼';U½– º*¢ßÒ$‰ˆ¿Ó¶˜®© fÇGC[…ma7f­ä§c¡ƒl/Ùäz±NÙ™^\Ý4"‰¶:,§v¿;\ÔyáÅrÇí15˜ªv¬º+µ};ìÀv‡¡©µÕRMæ Sns³6s}Òê#¦²SšzÈ ýÚ5AD)¦fQN÷PgbÓ6žWá†ØIuC7dh4K´§äíc}Ô›\êu×ê^7žnÕ:µ³cÌ¡B´éÆ$¢Å|D Éͺc$G% „z‚fãžg5ÅËd©)^&ÍÆgóp50bI»-½uºQ6 8:5»ÐVm˜øÛ‘qÍ31ä“ÎuÏê¶Ý{ñN€žl™ÛÊ s)•îš<û^À¤®ÝøR.éírEg 4Z uµéùiÈ ]!K"pDr—¾!ÚWB³I%ƒš’y“רŽé!\õž° ªãêcÏW7"–‘ Q7¢¨V}PÎâÒûrS»×‘.‡R–[°7q Ù÷vÊèÚÓµqÚzq¿­U·á¤®iÐX²­ÓÎlß®ÇÆö~ÒÐǂײ6ƒúòHîtÎ"yØb±Ž4AÓh6Å9¥)PZc‡#0\Ív0ØEÀõñRʨ½cºj*;('P6ÌBlu!Ø4…!µãÅ@WïÏ™á°+uÀ 5ç»`÷ƒSf凎ž{î½û}'l hêb¢Í-„>pFqßÒØ™xúzÃÌ^ÕZÙ¢f³64v›¦Ój¼W{ÁìÊ”§ê“eºQ{[ðºúƒ&(@uÎâ\£Z\/î ¸áÇ ¸iŒApá:€à¬MÞVè§±`6;OzRug߯UÎy'ê`Ý?ÜùæòØ-ØªŽšíš°ÁÁƒ—H†)‹…L5*­¯ú{à éÌ!W±Âµ Lñ’úT…Êjïñ\ƒ:>¨ ÖÏâKÞm/¼÷ù¢^¹! NA³¾ šÅÈœ"i´¾¤Ñ¹Æ|ñ2ß/KwAç´…¹oá]©ƒ‹έLº '±?ø¢Á9åÆG馣¶‰ål(&R¨Ç•W½)•÷úDß?ÖH¸¥© Û¦º¥vT¡`c]†4ÞóÕrÏ fOMA3ÝBš¢Mƒ4%ÔšvÒtBHÓ5ž!Mea…4ÕfÒÔª¤Éµ-&fòçX(–±eÛÁdÛ{¸(àÍÈi \ÚàŸ¾¢]¹6ÚYÏá!†eëÀ×Ià¸s §ö\oÔ†ÊEçŸ"¶e©{jt eÜuÑâuHsr´À_åhVKÑ¡ÐdÁ¯$`îLBHu‘ñ'“uÐɼBˆ wBˆ‰ÎC¼ï ˆÒsÑ…ä’é}mI‹?–DáÒ)‡Ú—ŒÆ;Ù…÷®Mß:±_òHƒ4añ8¶+ê¦=2èS±ÔHr[h\ùÆ@ ëN]H«îw!d?êC5‚æ4ƒ¹} š˜Èœ6BÈ"à …¥¿š3è²h dœò@ÈÄ ~ëØvR‰‚ÿ¬œ3*$»lÓi@\‰D? G烚'D¯ZD H õl­]'ívÌlZ¸WÃóG½87N£^×7éðiêŒ8ZÝ †cH{AvC‚¿&®¤m»(H[ ¯l©qÍIiË^ 4C¤­IÐŒ›¶\BÚšQi³Û ¤¶Ö[?AZß. imñr–lŒó©fÝ™Iè &š~Õ-gG x´Y<ÙÙð¾ÃgÓÍÈä9_ê MÜöN\zŒÊšª&Á-ªµƒôšöÒz¤ô®>YCºµÍž†t1ý41h&VH'‚ i1å&ð.hæL¯.E!Ã…tN¬é,&Òé‚`-gº•)4•TOâ‰ð2Ù h4T§S~¿žÄpWÅ>Û"ËÙ·†É*Ú).ât‘wií£¸Yã­·(V(ÒŒßÒ³ÝÙ6~æÙCúnèé+‰ ¤Og дµ>´1Cú°Óšn ÒGÌeÐôÇÞc=WÒ“TÒëà7u¬ŠÞ Ý"3J× V`%%‘h«*DJé|:¨^»ýž¼®Š:üí‰XBcóy{ª–VB»KÜš”¡1œÐBF\¯æÃép… «õ2ŒŽà?[L͉¢Éʬ%‘°‚fæ‡ Ik4ý&dHÙçÁ%'dp…Š·.!ƒ·@úm²nZ¥ÚñT—‹ÎйZØ5Lf|ÉáÀíÖÍc?ªéÕ\Þ´#iÍì(ÖñÍì—Û뢴T§â©„‡ðÞ-º—çºe ï~k`ª7Ük6°Ø†õïÞ«óŽÐôAç‰Ëš}"¦Ý>Dt³WˆèüÑ/u bPUCD㜠 ¡žÛ­½–l©Z=tË–Æâ4.R£ÖoôœÔé¬eypÿvÛ½pýHÃý/~͆O/*ëÄí„™ZÐ\ýÃÅ ÙŒÑàGéÝí²æ(d N’Í9žA6× Ùܧ¼û€fö„ÁÃ=±MÈ”>emÚvÑ©©Éþôüùå¶o¥qѶ÷J lÜí½fãÁ}¬ÙðTCûlWï–.AŽkf9ž+ä4n&fˆ¡1§Ã~‚œN—rºlõwðò5S˜ú0ÉG4Å]¥¡ÍF½!=7úµMÐäªèa/±dÐáóÓ»dd3;Ôˆ¹;ŽºŠËU"›yÅß{§©ñÕ©®íAh@§CõÕ¥±Œ§èʆñTÐOF¨h' Rt¦¡-`9;QäW¾n³˜JŽ6e]en¬tçÇ`Ís‚ªuZ¯]¨æª`×µSm¯«›K½.› ¼H^3¤ñŠk\ð6sSsq2ž;‹ëÍšd‡º´²á¶¥=Óç‚*„Ár±Ê’Ã~›DèÁq·7Žìµ± º–™,ÔÉÎÌ8ð¬©hCæ=²/.‹U|å*ôêë²½HmVÇÈ•A9¾O !zˆKGõx6:ySÍC ënã*ä:ëJ €Rš!ÆÇÿÄstÓgé*²Ìú¦:”´œõ±=Œ"xÛcìlsæ[:Õ`Çìôk@¨ZIJìíí8u)†IC7R¶F"ö±­kÐíçÙu:³3C²9÷rŸéyѺë‹ûkœ€n·É'>l†«heÙ,꘥è&UH<å@#‰ÑñRIiZ‹IÚìœ 6g÷“°?O¦mùB×õ‹Ó ½d<ÕWBں¦SµcÏ×jØ£–e³`„áÖœÚÛ;ñÃ!Ù4§Í¾:ÐX‚ΨUȰ:ö“£m Lp \™¦Ö› ¥»¡y¨7#íh3¼<3åµ}î3¤}Ü.lto‚¯AžÔ<Ì *°ã’»Å1¥BFe„hî:ZlŸj© ½c(ÒÇf´É ÇlF˜¾§M-‹±ÐÔr8¶•W%o©b Aûˆäâœ&G…yÛ¦±·Wvß±¤eÚ­B–;Of|œûâq)ÐÎÓaç<·ŠYZqwRWM3 Kß‘_vƒ²®KcÕ¶¡^hØs®- ÇPtN÷Ü0„¨?]~6*ÃçÀx5œ¦f©«BR\q(B\óB]²º=ΣË.¬ª§} enº±êÏÛ-îÌAcq7‹”mû„ýê§õd&Áà®xèÙÒ­c@·YŸÛù‰Å¢J?E"†ÇŸÆ" 1<þ4™šúOxüº´UÐ(Ò~¡üBù…ò åÊ/”_(¿P~¡üBù…ò åÊ/”_(¿P~¡üBù:”Æh£¬_ܦ ºß’¹áðߊ±_(¿P~¡üB¹5ö˜½ª¤ŸíÌÜöLÙ!üª{]{Ž4õÈë›]4Zõ&tEk9Ö¦ƒ“Pµý߯Ø/”_(¿P~¡|4¶M LB(ÄxË^‹†W"Ì6jlCOuú |¶Sa*`ÕsñíÊ©žÈô¬—méÊU?­Ì¢z9y_k&ær ‹ÙÓzì5Æ#¢m¶_ÒÇ}ù…ò åÊ?ŠS]ï0õh+¦oƒÇ—0L‡õrýÐÝ¿ŒÝf×;¼ZK×s’+q*v º _½7ÓN .AàŸÉ[Ö•ùÃ>4æ@&ÌDÕ²…ÌŠëX æs¨{RÔ3qkê.=’Ïõ÷€sv^³S䞘®A:K×üÄ îEô@rØ^Kz™¨½×;ßÈJóO¡¯_(¿PþÅP¶žØ3ߊȽˆ&*-Ú×q¶!\¶Ÿ7u°l*‚4V¶g3‹ã¨ƒ‘ŠÅ\7iKvn…ûâ]_@&:™uƒ¨æb2ͤÁZ'ºÒ;€¨6L¶¡aT¼c ®üXœFe‰¡Li7‡±wȈ”rR ¤ÒNêàà„´Ü5C'²èîAͦUgºŽôÇi:ÆÅ‡l:Ñ´.d]ði¸tɱÜÛLñF'Õˆ™þMÔú åÊÿ”õR³Ñ…F½š·³ Z©î#ǹЎ<4˜ÞÙ F§+?’±”)XûÄ»-Nö%AW7YÓ˜Ñ5³ºQ²×b¥6Œô«´™êWâj(®>íßßcç]Ç(…Êhúþ™& OD#1dr@4ƦԢ,*D7êÙÌd ÕÜPšåź&¼¦~íýÝêDZ¢ºõÑ6DL”fžJíbýš 4àu•‘>âö̲çHòVM1uþÂr_V×+šs/7P7ó³'ÍÿBù…Âkìõå8ãÁœ´\?tÕ½¤‚dÓ…‚lÏt>iMÞãÇH€”ê“gëã›XŸrH®=;«qp¹º+¥´™¡Á|1ð±BÇË|]b,Ú »õŒþGqUÒõŒ„CRd²ôΪ™I|›Òï@Å,aç£È’/ؼ_Ê! ä°-¾ƒli8ŒE'¡N¬úì$ ÂB›7–øÏͽqÙ\H ©÷wb¦2Ñ«ÈDf»}åà š¤ÔÍ!T­õ<¤-Éðl¬Ý•§6ô²!Õ ÏÌxèYþ4ý å ¿AçT¨å³¾‚²I+s7v„Exça°nm$¨w[¡ÛÒIõÉgV£“ÑáÔ—–Ôpè,K5ËfV´x%A6â'ÐÀ<×Fª*>ïí%•T®Öžµè0x"Øf„‡ÚVS 2Ù¿¬x!×2uôh´RL*0ßRÂ!LW6M¹¶ÄwΙõŜ͊=g z‚!˜¯í„„»dŽ÷§ 4Vv^¯‡â,pMQTþ`ÖÞtÇÈD¸Ytõ„i_óÃuÈßÈ(ƒJx`õÖtiX¬`ñ|ŠdZ«óŸÎ¿Pþ…Pê«Iµ~)¯(´–ÎHö§røÕŸ[cÞê#%¡ •Â0j˜1ìuðHŒ†VR{»ã 9ó:Q‘ý~#cP ‹Šš‡Ã„)¬g89\‹‚2¶ö™G!"Ĉýêa˜BAQm¬AaÌz4Âá fnŒþU‹,qôÎ ÇÆ–¬S#^öËfï¬Þeqe˜û­Ìëp šüÈ„º”ßï`S†YઅÒ3F*kµƒp½™8R9¿ÈššUï0F9\Ù“Y—¸4‡ÚyÁÄ?"çeŒÍÆ}w²°m®'og~þûQÿ/”GK­]} ß½öÐXg;X…„‹ûàÊÔ+‰žè²e¨;l /¤,F4—ÞbVËP¡»Oˆ/ó:‰f49|gŒëbC}­‘‘Õ9º¢ Cu>χ>µ:„'¸àöÕÌ…×+B¥¤„´YQ5Dð[£ìœP°Bà¦%SF¨8Tù†(SaÞ; ˜WñYJÑn›U«œ×‘ßFèýC‡âëgl£3jÕ¶w ýIì±ê›)°FE(§Ip œ_Ä+ˆ¦¸µJ¨nV‰32î=bXÒB—CÝ©RAWß8idg¾¿ëä£1—Æ Ÿ‘ÙªÀhÙ›n„l…â°Ú^ß8TÄ2ŠàÏ઎óï-/V™yÕàË ¢Ã×þ‘SÇLü°vuFËM/ÊŠ]}g´:Ε˜àÒZèozQw5®írCÛE”T4ɬgbæÃBLC{]ŽyÕ‘´ ]x•û ÒÛ""Ãîõ:S…ù*×Ya„,¤V½q‰!¯5<ï"³Ùtæ1­æa4"ë“ýñÍ/”ƒ‚.Þ±P«¸7N“IŸ-Ùô.}¿í-Ê@éÕk`ÝÄ›A½˜‘PHíKiÆ·¤‹8DN~´6¯ìî›®“t‰Í%áö梀ø™o?ó½ß£€6Tþpí1`n®(N t…´–7ß„@ùÔ¸ÒÞÄY™õnð µ|‹Œýûj}-à…²åC×EÖc,1Ã2ŸJáKoÐÜ=³>²³}-ĸÑVåUZ­PÛ­î7)*r!Yy%ê;úU“Eàpê¼ZIqê“flÛ}´À…½°€ÅÝ^ç X‘#"¢*ÄjêþA •Š”†-2ÝÞ›¤#'ÿ=ø ……²×ÃH"?oêD¼Âìv̯Ôöƒ#j}÷vÌ‘8t_-;*fÖäÉE)µΠG©¢Wh¡y9Ë0n°àÑñc&ØO.q:ŒvÜd<`Ù' ÆX0tÝætæ3NÏJ±%[Iw’/ˆOçê–NÝÙ™b»pcwmÀ¸g† §È>ßßÃ~ÙˆÓ] «µÀGo6f9?쮣6´~HK1*AÇH6•aˆ:°¾àTS^²‚”DMÍüû툋Ü? AM!gA9à°h`7§“½C'B¹u¢Ç)OcQ˾š²ô ;‡å¥/Ô›Ý~»ÑvPÈ.±K¼¢†ý?ãþ߀âÜd/2o7RÆi¹Ìmi!#h¸ÁÜ»¦ej{¢&XÞ 88Nõä°é´G„=“Œ`¾¥mnÆÚMPÔ/`d º<ߘ\ºÞ½é'iËÚÁ÷ü²RÅ„¡_³•¸é&pT¥Tª¯n,.bº˜¬:Ÿ[jÂmEùŽoÈ*Уë¸Æ´Ü°°0|¢^Ïqº‰XÐZNÏY•ÇÎÙù¯j]gîÒPG""ÔP¹6oÈ)é€F>„Uɾ©R´5椽%Zú k'š}¢q¹1x\rs I uösŒŒfn5Eo*¢Æ’}f¨£¨Õíg×4_Ïüßç°_(@Œø,Ýî ™x<ƒ¸¨/4Ž  4 [”!™HRl Q2è9΋=Ï¢­ëãy‡s…ŸY¤KégÄL͇#ˆØG®úŽñs¼;¬š+?áóƒE iâ»fÀHpTÛ¹±µ°ºI92à c×MåwNÿ°5Õï5&nà­ƒHò‰ÜÖÑ{šÇm#Š:Vfñ =6zR²N£/°Çôù”ý¦{hlÂü„j†ºIĵàYMëuj¿t°6³æŽ»Ú¾SÃ¼Ž¤Ï›Ô*µç†¦EîEÑ-ó­Í¸Iͧ\ÂM³‡‡·\‰¿CÕ® d8i¯‰“³ ÉÐëÌ™ýÆ›ñŒ¿æ ú7ððÿ>tCõÓk©ÒCèqÖ§víÀ¹Ì0g¨x?2­é#þ„‹%r>"¡¢`#ƒ&á`M—?L]w„9/­f 0åËàæÃ… aw}ưõ;\Ìgù|ÂÅusT¨»‚”ÈtÓ9Ô +k:eãú+ßžõÎ|ýˆ¯ ;xÇÃY1…c?ïvœüÿDŠ2Yih1Ãm¾ÅïÖúYf†Û·JLz,Ï­Ã*”"5 Ì +²µu½¬E9ÌzøŠßE‡õœårà›@‚ô67½eº¦Õ%Ó¥‡vr|a{Æ¢(kacßèá0œ`r`¹¸Vc)³À¥*Á›ö~ý¶o*äºÚ ™™õ©ŸŒñü;ðî?Š£·áÛŸT’V!õ¢F£Ã¬óyÉööZ\}K߈IpÜ:¸Ú§YJToêÂ9ßü–ï‚kúº?Æ2±ÍÐæV|\êfÝ!£ú‡R#tVúENǰžæŽç 1ÔÀÔ¾«zÁâunH#ü8ÛßÅR–y•ùˆý3­ìîq”oF$\WOè¦[è‹‚°Eó꺸±¯à:ÍUW3ÊÎ{‹Î$5|OÖâãvŠùÈ—À|Ð{}œŸ™ -—ê’þ⢷mǪK2O`ÛZ n¹ÑYvÊIr½¦-,Òˆn9"Њ¦ÕLÔ±S(?WWwÅÿOm óí„ø ÒI¨¶`êk.â¿þã¡lg-R=¬ZëëÎèP!›¤»(PQm'³V…ؽ6ŸZ›çü,+hÖ°³¬ *®µ ί ™«0ï5Øaq'œ[ð‡DšEú¦ÊðõfÕU¸Å²´Ïpâ] ¹Þ¹³xÆŸå>“÷¡z,pU¸JiÖÓËäh<{¯MNvHÓ´X/Ö졾”£_^°#‹D­!Vî¼{¯Óß ö¡@ºEžˆx6ª“QމK9±È!ËÇ™Pd5ч¼su>£=ÝB–˜¯A ‰¦ÞŽß¤¡¨Û®1ÄNœ§ˆšÚ»Â;®jÊýþ®>e½ÚЋÖ.jšð#\Ä|®áÔR­óýÌÿ®ú…òµLÒþt¸¬ô«¡6Š£n+ËWO1!µQJ…¸ˆIoÆP Ö_à³7ÇöYö{ LT¹„Óñ§{¡ª¡#®Ü qn8-Ü®ê27¶rXÙÉøQß="ô,LM· i[#þµ£BpG¾Ú ˆ*±—·èaÈ$‚íÆ¡ý.ÁÎÌí!ÅÌhZ×ùÐ34Â}© ™P–÷=ZH<«/èÒ£Ý8iNª»°€àn5¯9¯®ŽÉãð7ÔñoÓn«*6öì^¦ 6Àâ$œ~ðL[iW}"”4LxáQÚªwLj*$NÕ¡ÕŒ²¶Å3í\õ“™ÎÊj ÿc¹ëŠXs¼d¥Ý ww˜åsãüìÔhR°Sñ ¹ŽýŒ™–\cÍ·ÄßbƒÅ7•-뤀LW7ï:¹pó­B0!¸ÓP›µ« Ã<Ê;×3£ßWys´ˆ°ù¸Ær·3[HäDN)NY^ã£gß…‰uÕBŽIœç•™&§ÜŶ. 1m ’·›$µÐáY/1îÑ !$Ïgö‚˜Ilå¿j†:sÎñK¨È›÷JÂ7Ÿ‹ŽÌ!`ô9t‚([´Ù¢ïÁóç`%‡˜µX;çTλJ8øt–H¥ÕísÑ WäëïÅ¿PþvPv“ë,6^^Öúnÿzv4¶šÀ²m§JOoÔæó˜9ÛƒÈa¹¢3Âný^ívÅ`Ýdì<(hA]«´Rç½zÝg?ƒ-Hc¨8"7½Å™£ŸomPND@ºßÎ_«QÝMLDVZ:œ˜W…×⦸¸Ô4CŒ¿kû‘½µ¸2Ér`|“œ"éW¹.g…šWc;ßÇÆy€À«ê9)HµÀ\el¼É0!î3gpNO%ô²³UíÝN13«i:’×Ðë èÜÑzÈÀB`³¹½uz1µuYXÆç:^u?¾Gj"]>æŸÌ'¿PþžP¶Ó)ª†ˆ&g+ωض„÷É‘ÀÅ­ëЍk°c\´5Coµ~¹RȰ"Aà?B=œô^ ‡ûlí#V –>./Ø(æ"îÙ~3M>Õ(ÁʱV–’žöm3#.Lv.HL Ýht ežºNïC§…ÊFÃÃhCïbEBŠ JËÝØ-¡‡p§‘{g³m«‚›,0ß™eÚÞY̘³r }ÙµRö©!Z):Tˆß¡Ùv¶“ñ6±3uÕšM·%=UébXsjþ…ò¯…kv·óŠu¬B­‹F?‹üû•w´zº@¯GÜùœ;Ö ¹;SÜ;œÖ¾k”²¬ ^¥F4îë¶Î“ xšÿÍ%•lZ\P :6²ö¦ûF|3ni(¥\7ODØ1N÷5Ñë³ÓÄÄj|ušä߆·Ýñ—S MòC¾Ájlø tÓîD"QLfب–²ó}ìµYmwÓ{ ñŠÀ:´n¬œ„U/k"ÃN8Éô®›k»µ Vh-CqZ+á„vÚÍoýC÷ü¶¡ön,WixÛsURíøß@é¿Pþß…rôFú‘ÁÑ|l©VfyYÕ<ùt¨êßR‚lT“m:pú…Oïsc`žTÃ;£’tå邼jp¤ìÜGÍ2Îéȉ‹tœÌ¢·Ë=µH:S-ÇéLLªÕ³¡gº:µµ½óXø3ŸBÛMgR»bü9Äx3E’œL]]Ç᜶;÷þ0RµzEÆ6ìÛÅiÊHNÇ tÝÛDŠœš¡Ñ˜Î4üUûSÛq5<ž‰’È>GV` ÎÀq!&‰É†8‰–<3õœ&È·=½î¨ýå­t¢ç«-õ_Ɔ7t±Û„ÃõfIƒ§««wŠël‰­¦—½Ÿþûæy³èK…šÒ§5cão– 5Þ¾é-ãËå´š\/ÔÙrXì6ØdKQ3z>Ç.ôÁ ´ïiµX^÷žÐ— ½ãº;$»ïƧ͙龥æÅ?g­ ïìô~œ5qÛ…ÇÞóý›mwôŒúD„DŸÃiNï/gùnçëä|›)Òåpxù‹ÚJzLVÌþËvÙS‹ñeõ—ÌœA§)½;œ¨óÐÓ‹~û ½—kK0£oK³ââôrÆÎËñŒ@e;S—ùv|Ùƒ¹}nŒèhϽœv‘áþç€MÆÛñ~J=LM¬× ÌŠÞ^/ŸØ ì=üžýÞþ¢N— õ?iúº÷;_Nô†’ï¹]dAÒ‡)ý¢ÃYf#Ù³+×AßÍS³Õu÷Vù\nßðf©ïWSÀ UðÒ~!x}?ÞÉŒšÎµ™1{Ñk~ÝOe6Ÿë¶ÿBÝ @/?=öñ~Oß¶ãÍ"Ùkz=ËJ…黋}«boMjò¥Ç Š{új³XêÞþ"åg†9p2^Z$€>«ý…ÿ“ÃÉÔé/jºûïFµéË’:}ìtŒš¯ÛË‹ýÒÛ-Åž?…Ïm›Îù²Åf܈‡3ù“¢ýa^»õ¿“‘’w3f3¶{Å“:ÌÎQÂç¢ëpzI0LŸôÛÑz1¡úýg5»,o"Í-ÙkIÝÏ9‰u ßj7^P§-ázÕ÷ó°µ»í˜M¾ïÃaëtZ_õ~ÈÙ~ãóduÙe¦+ׇâ½Ø<æEù“`º=aòJÓããd<ÐrzÓ“ý84mÇS9xšaôi´ëxg:ÎÁq»¤Oï7nèu Ï«§±D膅ºÀd õÖç¯›Š«PL¯ót¼¥>ÆzÙï/ù5ž§‡íô¿2G Ûgº?Ë<èsYm¼ZØ¥íøð·~2sgµø—ªÛë|ùïVÙiÂvçDù‰”¼þ²º|²FÚ%-p LQÏrK|â¬iõ¢ÏôDËp0ÛåDïj?—Q Ùn'j±:è ¾à€Ò[ú4ŸÎ2ûølÞÏÎ$&€q ¸õ-üñÂcÙÊ*žÈgmäpú-qÓþN`( Ò\Þž”’Moï}‹× ƒô·*«cóí…^•ñè–ÐqèÓ[äÑl`n‘½“§ñŒ$oãýì-O—ó˜A/å˜Y„OÜK5`^"x“*~H¶³pmÄ[¼T}½8®›âÕqÝ¿º<î­/­ï6}Þ_ø8ĵvöTtNÝ…ŒÈt;oVpJìeN ¦Û Øá§3Å>É÷dÔb ÷‹‘w†ž¤ç=·€4£à†Ãî°¥þ kV~g+q*®}Z”¯Y…ñB^á:+›Ñ3íݧôbûôÝôv{eå  ÂŸµ;˜Y•b‰a”O1ú?ûó˜YDvµW¦ï3xfÞ‹:\/Qz?[ éV `žÞÓÓå‰ÞQbP%¼!á´ûƒtcÍÕ;+{%9F|©œ°Ü—–£Î—§{dµ@%Î0ËO›ÚJ^ܘþšD2à€hû¯ØFI¼ƒ¿Í?Ù‡¾ÑûùQÖŠÚSÀЬµÄöè?ôiyáq|œeôî¢+_ÇÛÕEFSû|™(Gµåu7ÙW[ÕùãÀå ÿh=µ„$ÅTd‰=N3axBÿ¥€Ÿ#ŒN‰ýÑõ&èjŒõuŸ¨ý‡nKÚ¯&W*ßÝÕ.7¡Ï#K¡,’ÚFyŒ=“)a2åcŸ#1?¾ (ÑÛÕTƯüñJýL±Ò ö òëkKp®¼Œ¿]–ÔÛÍÕñ(Œ¾8¿ýgIíßÎã¿4Þ¿=žìÇøÌüžÑê Àx›Ýî@°7´Ïƒý—¾¾À1þ$&Åj02šn1^íßVO€Ð7ìóÕ=@ÐÛ…f†˜Ro« Óyü¶ƒg@y9*8i|¾N—ÌôÒûk¯ß‡á íÁ\ÁìèùüêüvÝoö`ï0ÅâxzZäUïO§E“š4VÔ”’Bå¥`$9!Ï:Òû)À"lŠÎ¿J¿ËUyÞcÈü™õ^õ"xq>Ï0°–&ãKnü_ê¤Ìgü¬€&oXzyn’ÜÙˆéÊ{гùš§aË꯷YÁÑÂNªzêùø4ã™ 2çÞ‰™ù/ÎxxºQ‘X½Ø©y¿ ¿†‘Ó§øØP¸qΪýoAÞ—ø|ÔÈ_MJž„ ¹ìv$0®->“)Ð@˜; ·éM;?ñ´sIŒ~¨Hçׯ?±^êGO,ö pãœTŽŽã 8*.«}éë7K¼ã<çì˜{@– ª× ³UôþRaxëO6÷Nb·4ú8€À®÷Cpʪ¾ ©Ëòòûÿ‘ û´mÒ3 ÐVóÕ‡+¯§?k$ í9ùùHûÀr=¹}~Z||§ûQ¥.×ÃÛa¼ÿ¸/!˜P*·ç þÏʸì—OÛÆúª÷£$¤£{Wo/ÓíÉzÛ'°ü)ଷç©ug<zp¤c„(ÍÞ{“ØÏóéÉw·bãýâÃkùj&$Æøáï÷²¯Ð¹:ßï"_M„|œÈ |â7|’_êm“Öbø4ðàòcõÇY_dMáGxÄÆ‹)[Ÿ§¬pV%dKòèxI¼óu¼Þí(sˆ^È?Nè‰_!æ™ëä{ã7BŠ0Cò¶þ 4(&Ëžfý9ã× üÌ6ò#ãü zÅeO‘¡î)}•3W‡|°l?…U›Únéÿ¼”Vä«;[¡X´)C#þ%éCòÉ s¾œÄ3Õ¾â RÀÊV«Lh‘Ï<­°7¡lêV‘©Ë¢’'ºd©÷±ï«‰àˆC‚G›ÑÿŽ÷/)WN™Ögì¿’8ïì’çn…’ŽåÂ<Ð÷Làè‹Å__ì×óÖ›Àœ¯FâªW²ïaÍ §M(Cæ“”|%ÛŸg!Ûõi\yeàKö×›ø‰‡ R%Zñ©{³W:éýæ-ìå‡ +¯P‘öª ˆãûÙ‡.΄33?Ä0LÒ=sôñLÅš¿0Êy¸M§]öÅ,̨¦€=¶±‹£>ÓVCìÜ)ÍúþÀqY]ŽŽc×ñ™G Úٴⳇ×RC*z:ü“0z(dBY÷9àJùšX‚îØñS¯ƒ«X'Ñ®%üaÿ”0†{;5”mg«¦l 6&ÜbÊ“6_Ùãµk—HlîNnRpÅ?ŽÍñvàó)iòWKÈ`Mù!³EWLB(" ¡ËuU…0?$0kÎ þð€åÅ8|0åÌî6åq%rûk” ²kÁ,gûüU=º€õ]‰}Ô»ÛðD°+(Þ'uê.Ùu5’Öv&Ïùa]IkÓ ÏÁ&·àÝvìc͹óéä=wN}o©ˆ[lU=;W(€ÂM=[k™CEö‘”$P¹¶@R@'§ÅÔPžÁÞ€"¸~ØæÄ€žá#"4(;÷ P Öfh™¼Ób^ èé:ò舉ÅxÐ'Ôk\Þ¹›¥d‘µÚÚ=[Xî@UÈعVê´Ì«:q >Èp:{Lgq %ç@¹Ñ¯`­g] MHµ/ º•j3ôM>ïîa¥Ê㮎íðÑqÍ‹ÅÙrD¨Fì.{Ph{(9A×j¢kU'5~mŽZÖE&Ë®†zSZ3„-9 ñÞ&hìÁjÃYBY@SÃýh<à¨óÀšKú7 m³ž·Râ´cXçöi­žÛ•â@Óê«+מºD·TêìË3Ø,v< @»&¼š;^Åf­ƒ\"„Ä€‚}©¥WiɵVóŽÚH h oà·8М®Í†F/ T…ð×ÚøÏ’@zjxšÇ›æ`D ¨ `ã¦fÈuŠŠ"¸ƒÖ’@×êZ."´çÀû㑉ÊÐo­…újãA ¨(ÐÁ 5”JSAýB ¨ aÀæñQ<Gp¢N¨[—rZ èéT0Ã7 «Ç4&·1neªb¬¾$Ÿ¥’çtµFq(*Zôëƒx+€úO< &ÝFo@7nã(É XdÞUsG9iégQÁã…n’jž©³foõ–Ðè…Þx|±@™}ÑÇQž(ÔÍL7©dÕx¢ÙgQH™ü®B—ju j;•@3Ð(€ÂjRd¤¸äÖô”1‚×´?¾á€ë¹Ü3zÁÆ®—4{¦ª}|J^véÙOnÚ…ðùU Yg»ƒøS›0MÀNI==bȯîOŸ¥¥­]Âã¾bœ{.Ð:~<²’ìS¡€ïñ\%h{ÊRr'ŒçfY‡ÔÛQ<5]ROãxqš®H=âÕèærØðyÅ« ’zŠáµP^/õԎס#vÊ;_ üt…œ·çBI•ÂuÈÏ=å³™­›Á sPì)‹±nojÜa©· xÓJ=-áØÙ—zºÆû­Žñc‚ç='Þ_ÏQ©§n|P÷Z¥ž†ð¡cè¾?åÑØðD`Ƭ]âí±žpȼÄÓ LD´ƒ„$Æ&U"[Vg$ÞžÒDaC®$žÎ D{ÕŠ?µö5¯ïÒ‘Ây.A:C¦À>%u}êùiÂR¡÷”/ùÈËòÙ2ëûS€±¨ÙXy´Àô³š)BŸ œØãì3Za¤RÐ3=oÆe@B–‹.š¨mÖ–Œuâ>LÅüŠ'¢lF,YÓ£ý6B¶Ì|¬¼ȰUÇš‚¬”cìœî]òYò®½·ø[W†3º@8Î}÷ÝÏÖ•b\¤ŽŸ]eOéIàžÔ¤Î_2sÇcççPf(¹¤¥™éEïþ±»‡ÏØ„m˜ m>*Á7ÅÏÙÄÛ/ÁváùžTHÀ¬—ÀZäÖŒ[óÍ]öÁ¸ s7FÄûçäÃr?§ ´§8rkÐ<ÍáæÃûÇ÷Œ>!ðóË’Š!L2ˆ§å§ÄváΉI¡q”knø$ÄvžœÛÁÇý^“çl±õÑŸ[lýðüÞA‰õyM èSõ„,™ÁÐïûÇZ8rO¶?CYøœP·ïxgxÿÏ1ÿ ïç¨ ÿ²Ïž«F󄀌ž|ÒÝE£óƒe$†xpö?ˆƒ–¥Kqܵыülnç ÛÜpÇ:NEpï5 )±-Εœa#•àW"›ûæÒÌ0oiŸûò„jœ*aZî6AË`¹¥ÝëUi¹UÝ×òLîƒ8N7ÍïîÕá~Bp\i§ôdVËÓÕŸ¶)fQ@,Z~‘FÌPú”Æ©KÝr£œOJæìqJNNÎßìùÈ'®›GÎ~ù6ß%'RZr'Ù[ž«èzyôS*é%¤à8Aö¯‘ìçr%¶“inSçÜÐåÏsÿi…ÏRði04¢¿Méq^&Éyáó(ֽݿ—Y,‹iar[b; ¶dã:±«boßÄe­RÑVÕ:KKœÆ¨BduÆûþ&ùR•,Éíî£-ºÏ’ÄX£Ký€ö´qCwê}ºá}@–¢Ir³$é¸3âSúœ ÓÜùEzR°äYyß:ùý»éü£¬b+Þ?…î†1;ÈCN‡u¥Äðx÷*>Øšjü!e=z­oƒ=(67Ô\wlýÆžõºoblîÑw~ cŒLûãÁn~­?Ì%p¼®, «2ÒHŠ¡¯hÇ‹”¤)¨B¦„øbnXR ¾¦ðÁ•‘ÖFý#\™bî@²²4&0” ’رj¼Ùœ"Càææ‡ÌG¹Ù'ªGÜ ±W2ùA§ZË+¡ð4q{Ÿ™Šr«Er"ŸRàn¿üNH¥yØáTäÙžozŽâÔ%pf¸Rò¼³ÉÙkÉç £7Ìì”îîl0›uHq\ÖC áÔ ûçý §†Š'>¤d~¥vÈMéÑJ“ºÀ?"Ò< eï+ë´R záI"û“î+[tJìù(á…®À§Ú›.ϧڠ>v!Œ‘u‚·>6æêëDµTÌ7Þ¿[åü ${Ço#‹EXËY\Y’ .rV ‘õÌâ˜Åw–Å%4•€„wɪñ¨Õ_ò%Üqw?+w;ï+FEàܯ=$¯]²`i„NéÒ$%ÿ.c 6jùWö°œ{êqqž])ãàÒž2JƒV° "¶[´ÃÓ­¿î÷ ™+ó(Ñÿ1öW¾>¾DÂc“‘õ׈‰‚Oƒ á+ÓAOéÂS¦­Á:¢À™(­Jßùå}V¦ÿwÁ:ˆÍ@ùêA˜åkÂâñx JòË!û|þÙÒüviŸwâ_J÷‰ð?):W!2”î)CÏ'ߟ-±)òõÉ €¬à´¢E¥1¼ƒN1rºìǹÏ`çù¨“ÀŽ"]V úûU,GÉQð«^»ûµ ÛªŠÝNˆY|²>ïdi÷õÓîÓ/2ØŸù[ņR!ßf>†iE2Y–V™]3è¿Cñ÷Ý7¿Ë9ì(&±Q>î÷¿0úõÙðï’ØqÌ_óýKœ{ìP˜"íBÙM…Á Ô7[µû Ç>ÆŠýq`°×ÇJ¡ÝÅÌLæÒGüŽïsõÂ}™iIE7Qê§œD†‹ÝÀQráüêQ È)hõ»D“Ú%­A+•h¯=ðÌ`ß•hŸv%ì$ÚycýÞg.âÿ@ hLýð'åA‚<Ý‹}uLél¤ï^Ùq,’f½eI›üT$® HÞ½*3íƒ[ZõŠ™]»‡5ý¡P¸íþ·U{n)cîÙÛózœ?3¨Ÿ<$Ì8JCäÙê“ ÆÉž†cuÒÄ? Çê܃MóäµþêiØT}$gñ16ÖÏx³XJƒý”~ß;Š…">XyB#Ô/|.ÊN±±:ÿ§…cõ§ãü@;þ#«"xöþŸ†Ì†™eýÉ_? =z”w2¿I«q° NC0‘îEQèÔ= ¬^ü&‘™™´Aú„Ê;CJݾS‰´ÿ_53˜$o?K~%Ü=<)ÒtŸèEcŽŸ1.ÁN6Ì_ˆR“Ì-Y×5GŸQŠ&¥"Ìuó[ò&2Òj›y“ râ Ç/æªÕ–;˜”D®Ÿæµ„¤½£Òì%N*QLÔ6ú“h[f0EG‹ÈÝÍs¦ðm°Ÿ"âH[­UâO½ìäËàÛÇ;q fŸœå‚o)BrJw¿%;)iǰâXÕûy†[C£¸eqÛ®Kq™Ü6ÆÃ<»ÆnMh¨Jq±:ù :¾Ö÷§9ty@ º{õ†ïåÐÉgб·Õ?C'ŸA'‘-øå:“lÝg¶à7sè$€Þ2èîÒò{9tòt÷lÁïåÐIe2è$³¿˜C'ŸA÷¼ûžC'ŸA÷™Ç÷Í:ù :ÎCòý:ù º‡{dýKC² v‘³Ùny@"1ð%íQ>ØEñ”>R–8Ðv¥>»˜¤BNôd)O~7ö¬ÿ¾Æ“´§·¤ƒ~OÏ.&±8%¥xâôÂ8³'ƒë£r‹xÞS¸ŽbzŠ9_ä‰Sñúdòæ>u˜§JNêeNø”„™üËœ—H—œÒkÏ• žže¢”9Aœ’2‚Ä¿ "‘]ï% î/…‚ÄY§±O¯·ñ .oѪ”ø«ÀÒzðk3LÚ¯ÎFB2ÉnÊ‚A^$»Iù‹•{z™d7Å.<ÓCÞk\A0ÈË €‘P»e¡Èyì9›AÖ¦átþ§Áxù ’æ):­ž¦ô¯óS’I0 Té§Ô4¹øbE$ES:7êU üWòø¤ÝçJ÷ïžÇ×0{°Ï¡0ÞP"ç¾òÁ¤oÌyC}f È ö"ßæk#~cühÿoaÌú=Œ=;~¹‘O¡N‹Ô+]ýIm¼/¡`§^'í~0ûËl9©ì'C¼8,o 2©o{ŸšÒ%ø’»?tg‰,ª V~Õë!çç(™–Âs"¿ÊŸ}¹C¼›±óåS©‘Lq{É®/‘Áçÿt¼N5ª”D0 ²}ÅÀ×"ŸìÊ >vâé‘dÿ¼¸|ÁÌ”¤dpx~Émñéq¹<æªtF”2÷Ž}lþŽg°¤}­)Ó˜{‡G¤*Dž¾æÞ‘ô\IåÆI{d¦$ðÈdåóPï}ó(J)ËÙï× zÊÈ«H¥††5XwJ§Žª¯8u²X7쉒Áâ ?‘>&]àŸ/Êòê¾Z7Lx/ÆæÕý@$òpò§ÑƒY…)$°”ß’—\'í}ɽŸþ¶›–‘‘:þM*øí1(;èZÕ©×÷2Nõ•˜º?·¹{ƒýt>ÜG¨~)N&Bõóᾟ‘ª$Nq¶à·òáäØCFÜOçÃ=Ä\Õþ0UC„ ùùpVÒ—S5çéD3âøûòÝ|¸OJþÌ`2⾜÷âÖ÷1_ìÛ§ s¼‰®ù1_LqL$ìE:-l-hñŠÌ`Ò7:_Èøª*º±’ÏUª+Ž„|=Ž¢²ò7¼ì8ÏæóŸ®J\‰ÿZ&Wýk‘ŠZQùÀ Ò xLÈz­F>Æ{Qy* ¾ÛÀ2áCTçfV½HŸùù…&뎊8Gª¬ ?Çêkö¢èžŠ6|]gR¢0;Î÷Øðc”~§v;Ž"[Z¾Ö ;ŽrÕ^R±ç$LCPbæUµ)¹è°>žë–/¦Ô¤–5¨™¤ŠhúÂ×äXó'3R›?—‘Úü™ŒÔÞñG2R µùG2RÁ8?‘ÊŒò©Ì8?‘‘Êä¯)+-ž½ö¼awûZìVôuÄŸ ‡'ApóÛ'JU5WƆJSážO1Élo¦Â={G™üµÿ©p²uà,NÑMâ·SáíJa ÉO¥Â=@ùR™ú¯¥Â©”T,ù³T¸ŵ^%UÃÉYÆ>ûBExîDnó /¯nï„(¸}SUÅ v”¿þypøÆ%ÈÌ`æš"¦Í/2ü‡— \ ›ðG¤š–\u^F˜[dŽ<‰ÃA²š˜¯Ö÷×òên‡ÃcÎ{„­í!ïñcáúŠÆÉ~œù6x2»ÌCȘõ«4!´1¨BèpVƒŒµ°ƒù«Äô‹BæìÐÎXI­óvùéÍã”?îZž“Ýô2Én% þˆã¬³Û·8Ï: ýøÔçd7ýDSÙHäzrŸ‹˜ŸÏ}^²[ÄQ”ꀟҢøÉnÙ »$d[ëí[ÈÉSû(?KæËm>¨ÿœcÅK+‡*@yÉnÞm½ Ô¾4†šÆƒT†­Ý–Kv[à’@ñD?%a‡l,‰t†ÝXh÷H=˜ô1ÃêÁŽº‚Q¹•¦µ¼=eØÕÌ‚gÿúØ}Wá:“ïyëW„)%ýÔE?ô )Ñótn³È™5 ÑÆï¢zÞq*_KíuÈ-Oƒ-iwü0ùg*çýÃ<šƒ¤Û‰ç5Qð«|©f%Sâ¾”wú™T1É:9÷˜«Ÿú’œ˜wIòKy/¾$§pëtê¯Å\É|íåGxq}ßüˆÜ#žž†z´+|DNñúž "‹ÔçæË¬.9%Î;*7©—Á” ¦ÄJËWßSާœ­'6¥Ï/KЇ»þA6Ø 2R(›Nc?œM'¦J‹óO³éÄ–&¨ªñíl:±\:ÉûÊ?ΦûRæãgÓ=lÓ§·ù;^kñl:1ãã’(›îeôdÓIÈ?›M§Äkýýl:±\:v-?šM'ÛóƒÙtBò™%eóÄÿ(›Nìüø¬«ðcÙtb¢UôVô[ÙtOSºåÒ=xG(›N,—ŽËæøÉl:±ý{öôþD6X.ÔWÿþ<›îox¿”M§ ¿ò²éÄré¾±ßÎùÆgÓ‰cì§³éÄ®Q8ÉÿÿÕvÛÉëJû ¸H tlSB z $!)´@H¥söwþœkÿ$¹ÉݲÙk¯ý.\2VÍŒæÑsL4š‡çØh:µ¹-FG…¦SÃÒéœD¡%ÂM§&@ªaަSÃÒÉ9í£éÔ°t’¹4üFãÍæ se'J+dM'+ï’!R¥`f§ïø*ª&†4ãÎ$N‹¦Rc¤j]4¸*eͯÍvƱթZ¶øêÔÊÌò&óÕéaÖ°}±¦k¥évú”/ß'êhW͘‡+’N¾¥ ª:³Eb³;ôIhͶ“ödV=åL§ ÙgU‹¤Ô0 PçT¦ôt‘˜;ýC‰þ}“yDÊü#3a0Mš;¢l(Ë4w*ø%ÑQ>¢¤jÍØ…yš;5`@tg#ÃÒÜÙÎO6Esç0…0´KsY™ ‰îLf«Ms'ɦ²‰iîÎ…ë©ÅÁ€­/­£á,Ö-²H +jО¹;–§e*ÃôèBOíåZÃ>7“Ñì0ÒÙNÁ_·”k¥µ†1F¥™#€­“´8{Ù¬ QäS:Ê›ÎúB'±”æ“‘*Õ)°+. [ΆB6ÿ±²¡úßnž:D>Úž|0ñ^Ä.Xã&äbjÕÐO@ŽmnWVŠrþYáI$'šÔáI<°–ó,`¬Á§Ö~Ï ö’Ìþ¾ç´9|¥±……4•™&Ó„fæÞÃÒTSândPÊ÷*Ï¡î)·tá=b ƒ&ú©`÷\È:ƒa÷˜ †]‹Èæ~oe›¨Ñ®©H9† r ƒ’É9ž3(?=Ûªj-I®ªÃx‚ ¢ã[Øá¶—r‚{vñD«&Ç!°KÜÇrHÌNC wš¼ÕÇÍ¥“c¸³|4ÃpgŠ)Ï6žˆgʳ= uî™ò,2Ü©°ÌH8a) z1Ü)ù^’h’TÄn°®Ç€qgIÍ£sG¡0SXX]3‡óaqÛ® hí¹*ö‚ùH ¬b}r9öµO2×Z›'ÑXŽùCª´µå“î¹pd &xò¤<¹Æ¾]%µ¦Œò.ºú ˜Éi8Úêâ+ `L"ŒÄ„ZL6Õß¹í¨Å>M¤ šHÆ‚åú15+MpõÉALš~åhkê:}SÆAë¬ÖºO†qEÒ1aç›Ä¸N;®èž®aè0q-õg­QbÀG§Êûf/ÏNZI,×Ú.ÆÓ=šJbÃa\§;rºGí³žTöä("C XÀ¸t—<êÙT¡LŽõÅÀ‹ó7Ÿ¸^ª~ëƒön»îÝHï*=€Ø¾GøOÁ|\AX_aû"±vÚùÈg²âq¿$дíŽñlñù)åa;‰fÒ4w'g& o{GÂøØÒÜe£ mÆ9·è JìYû÷Íh~”®}Üò4v¢_$‡é]o´zØ•ÊYР±tÃ7²“ÅT~Rk¨a¤´2ò£åTïºh·©žrFFËfh·!F6sP@ƒsˆ0VS’s´™âNdE"´Æ%E’†;õ€€ÜЬ”ê{kPNd)Íꆬ7¦¡œ[5˜ŽÌ³ f„îÂE¡YG˜!‹Ž©rÁ~ŒǼÙJšÀò˜f´sIÔb†|:$-¦HSÀ…5­Cm  dÇÊ’Gd(œCb hh` Å†ÑÇ’Ä“­3ê #Ù PR  ’ÅL«Mì0ê XQK(@l!ÐÅ*P6šÍa‡Qi~Ë(@• ©Â†´}d3(@ˤ«V+hÉ€ÿ)ŸÈÈöo’òéEáŽGʧ…;*)ŸÃ´Ò0Àêš'Êă”OÊ—ôo‘ò™8Kí¤|9ðG"åCü••½ R>i‘檳—Õɶ«Ÿ¥³¡Txýô+¤ƒ%çõSí¦£œ …óúé§™f›äõÓϕ´¥-^?]ƒ½u ~1ÈëgS2ëàëóúéç3Ir­KÖyý¤U“¹Yˆ[ªòúéO5v+¼~j¨»#d¨Êxýô'®¾ò(ä&ñhð#MV?cþJs¼~ú³Î<*Í=€ŒkÀ2¯ŸZ¹ÄÕΚc22EÌe‚Ï4XŸÕïH||àOÓ||¼~úR8̈m^?i‘ä诶v©4%ß/vyýôYýxÄ]^?*¥fº[@¥ÔYÍŽP·-ÉyýôYýŽ0÷¯Ÿ™Ýjû¼~úRD>>û¸mV?r>>+äÜr4‡’×Ï:îA<™YýŒnr܃>«Ÿ¶ÿBÆëg•f†×OßœC6yý¤å’{‹¬qU^?rkÜ ¯Ÿ†”Þʶ÷ŠóúéK1ÁÇgeʤ 1f3 &Ñfõ³t¢Ž ¯_P—ÕO¹3¢ ¶Ðäõ#F¥‹¾cõÓBÖ“òúéÛL†§6™äõ3ÅÇg‡k†GO+šEÊÇg-‚©àã³}¦• «_TêñYçõSÙU2qv:)¯Ÿ~\‹ÀÛåõSÃ<©¬b6yýd•”¹í*ç\YâõÓwÛGâõÓßÍÄZ̯Ÿ¤'¬~z~¥†âRåõ³š=HÆë§o²^’}^?=Ãpºƒ9½ÇàõËë²ú!Ïâ¼~ú;6È?¯Ÿî†D×…×/¯Ëê'ÝK²Îë§éÔ:¹Å¯Ÿv‘`Z¾&Û/9éë\±ÏˆîÉò”¤EfWƒCLén†’‡vÁ=ùd–æ("±Z‰÷2Ø¢d<­e1,Ð9²èJûe\â€`jr²,síÉ ãþl4/o·ùû¯µÏ^™ÔÓCÔ›?© W š by;“­Ëó<''iêÆwúûîiÆÓg·Óï~%à¡€®Ch¿£.aaoÅÚ㣇vÏgà^g¥ªA¸~im J±ÛA@iÛ. â$Ç#˜)i4V&šã°¡ÇÙ¡»½ 5k ¿÷÷ƒÙ˜·@×J­]ûx¿¢ë·7»ÓáùbW]Ü÷ò›j0—ºy¡©ÚÈ1‰wtµ—!š?šº‡d³Iœ><îh¾?1ÞŠUM\}„–€½qæògoâ®0åíAÄmÅ室(WÈ_(À{W®àÝÉ÷7ðÑ¥+\ŒÍ\¡ë~ÃØœ‚ºN6)nL×p¿=„zÓÍÊÌEùkB1°V£ÂEÛµES«F¯Sà×Ú -yð«·áâü4õsAs§ÿö4í‹Pè*E÷ë{Óð³tÞM^¹ËŒ/ /ÃÜe;Î Z`_}ÿÙ¤áWMºø·j§§7 öi® ù¤_|€× Ÿ b&îrŽP‹¢¥çî%z¿’oRâ#`{-ŠüßÜ2ƒ!è0Ï/MÕsñþåz9„=À¾\oFÐZ €¥ì5äœú£o»ïxtÏ ËØe×.;Qö™ˆà^-_ {^BÚ*ÂÐ¥íPG· c;·Œ,‡ÐZ¹qƒ]$6ÀvÕy‰Q×?1ð× ùO³§ði| òGSƒ¶Ø0cþ+cÐñçÏá 5ÉžeKo·–­Æ¿±‘ÌÃ1ëý;ÜqUÛ0‹¶Ó¼ÞÔ+êð˜ËkX$Ö•ºK§êµ‚wþXiÎ8šJP¿>ÃäÇh°òj¾F³õÿŽN4ÔÀK“¸Ð| Moð±B “Kp٥пú43m7ýà× ÃZ¿Ôtͧ›QÐkÓI ý¢ ÜXÆ=0žp ÌO…¿®à?—`î#=Ú¬oÕ€œ?—:ƒUóqþPÑ\5nç4Ábû@µG*ž_ÎòŠ&h$"vùTÔFþ—œö8},Ñæ|÷Sœnv3'T´~ ‚ ñ½ç>0À½rš'}Ö—ÿø;9Q£Ôƒ#@3ðƒ ~l€9÷A#>BÏ|¾ ?3¨>¦:Ìdù{…c§Ð¦¸ß€µ¦ ÞvÓŸÒïɲƄÖeºr•]ÑJ}\o¶ë€R`€=uäMõšt‡Y)Ђ»6Ÿ[‹éžh8'ä1:þòLf¾ s"˜{¨Îè™gYÙnsïgR#Ùë@¡×£åÇi\4ÀÐ=Hï{Í‹+¦ XüR–¼ùì9z%Éî@w]¹Áo0캒à¨:¸ˆÄª&k¾ˆxNaÎ\m7ùj#oÔÿWJÂêcêà ǴŸ»7Ù¸{?'A؉`µ×oÀ¾šIÚŽ}Pg°îÆÀâ”O€ ÖØ3"àˆø}—/¿˜ñŠÈjÙÓ"*»áPÈœ>Ža1OXëb =ÂÇ÷Ëù©;yï¿Q¥/æ( aðGKpV0s²ÜBFWp}ÝxbX…/ÛØ”·å2ŒÌNF%¨xHo$e/þîyûÈ߇NUXŸ£0Ak§Vj‡‡ý,×LD³#b—{ÚlGȺó÷ÙYáäAÄ.âýöZM¶—„U\"€ã×,+ž†g§ ,t­%lÜC·)A]t«ÁS(E¼ÉÆ>ÞäÊaˆEá|xÛêIk8Ô…C^dï‰%_QH41¬aÈÑÊÃTøÔRúž.,^®÷éÚcéNýÐl2_”óˆ„~yÛg®°6¾ì¶ÛbiÐßâ-&ýkíÚ©4`šØ%’Œ`«SÜR–ÄÕ¼¸î“ú ä^{Š&™Ÿ@î% ›ŸÐO ÷r?ÜK@ž¡Ÿ@î%À#õȽé%ôȽ‡‡ÜO ÷8?¡$vR¼]~õÇý0µY}rr…4LP؃SŒ´žaë¼îàsJ°€^Áe Ãê_ðOn .“È0†KÐCœ›W߆ŸW…0:îÎÊvüXë½-[«y'™e5˜†/ª™‰ë`П Ûde&äý„¹Ô-¿ØÆL(½GuI´‚øÝvÎý;÷™Ð09çµN ˆHöåñOqÕú/k«‡ÝÍOþ•¿`ˆ—˜zû$‚<8’ë… ´a®ùâîyG2•J8S‰TÒIÝ~çÛÛí×âké 9.T±É0ÝålUÛÎçóÿÛWVùrïÌ8©âC¹ÙL%*ó÷Õlî Iˆ+±à«$X+¥b©óçó¿çlx\[%ŸbôLJœ,뿽ïii|}W,†–ÌÛÅ%ÓKUNg‡ªÃS)7^ßÐhS #÷á.U¥ÊGºþÓ8½ÏM*ô 9Èøö®70¼Ö€a#+4š½¸BÑÚƒËרºÀÖ´cÝiȪ|1>+ÛDFþÜS>Tžkó>*wù­~ß?¿)ÏNP”´@ífO-}úÓ©>bËçö2jÝ-6Î]S4¬E_m¯3ÁŸ$â'ÂÙ „ñüðg' …?Z—Âß0؃ziW×›~¯ë› s$„?XÄgƒü °€[[ Y­Ó×àâpðӱqy/ïpÙÓE¶ì]ˆ}åÝÌpÆpôÙ™øÎAŸëŽB‘ òß/›PçÞqbßïºHl [‚£­‡HøÃq¨ø‚¾,\#þ¾ôYŠ÷v¥Õt=Ð=¦~Y–nA©¥‚”¢þF-«/V&Ôá1%ö®çgbßqÏëoÏ©Eñáàþª>Ï:4¬#ŽäèÛaXàÖ™Á0æ ¿JűF¨\&…aóÄ*Ìhå® 5íÅ©àÄ=}ƒ½O ¿p<¡xÓ þб¿$ÉV’ ¶Âæ€0? @æívå«>•®ÁR\òÿn;@œ7JU:ò¨T‚†á€—‹YS^dñÕ謸¹Øÿa V´k‹,P|9éœ 6èŽ_Þ"¬ÛÃP‰¸Ÿ]«¯x™ ò!FH\GÁ_ô`5"h§"Èè#¹>Œ@èRƒÒØæš|gØØsÖqÐ&D/ÇÂ<p«^Ù#L×Z_ÐÝ.ò‹[\ ,r¨jÓtbÚºTÑç`ð-nY¥¬Žô³GûIÒ  –h8+2ùÞgƒ$bØ-7îê0!Äzîd‡t¢ ç.Œ‡‹ÞS-E¼iïÛ ":ÊxS ‰7Š|TkP Œ…¯±À˜/=ˆIcç§.OÉ]ck % ÀÔúuƒn—¸¸znàC«õ•ïVÑ¥¾B™<Óü½Þ†¿7ØR_·Ë`ÌÍŽQH5vÙ»iIÆ>¿Ue%ØÂ:s*!"•P è•`‹è¶ë:Ù~s¡-f6ÙèѯìüÕŸÔÚLhK#|ñ*?6Œ·€ˆ1vf)·G™øôMÝ÷¯`É×Ù6Q o¥ \G t¢^ˆJÐ\GȺ[Å`pÝÏ‹°¿.v€€*Ž @ÇÎEÞ`D?h§ Ð¥ÈøBöªQŽ„õ›…xu«ÒTD€2¬±±¬µ€æ0Ä“F¡ºš’ØeØÂƒ¹1£‚ê'àÂ÷ÖeZ WË%NLôtŠîSõFIül§ öXü\ ™=¯XxÓ¿©Œ¥À¼süò{žÄµÏá—ÃÂ%^!ïgRÚbô2…_¶ƒøå0™Ã/¹>stream %%BoundingBox: 143 215 433 577 %%HiResBoundingBox: 143.5005 215.5 432.5 576.5 %AI7_Thumbnail: 104 128 8 %%BeginData: 29100 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %522853285328532853285328532853285328532853285328532853285328 %532853285328532853285328532853285328532853285328532853285328 %532853285328532853285328532853285328532853285328532853285328 %5328532853285328532853287DFF28290629062906290629062906290629 %062906290629062906290629062906290629062906290629062906290629 %062906290629062906290629062906290629062906290629062906290629 %062906290629062906290629062906290629062906290629062953FF5307 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929287DFF282906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062929290629292906292929062929290629062953FF53072F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F287EFF2829282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292928292929282929292829292953FF532929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F287DFF28292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062953FF53292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F297DFF282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %28292929282929292829292928292929062959FF53072F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29287DFF2829062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629292906292929062929290629062953FF53072F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F28 %7EFF28292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292953FF532929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F287DFF %282929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %29290629292906292929062953FF53292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F297DFF2829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292928292929062959FF53072F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929287DFF28290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629062953FF53072F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F287EFF282928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %29292829292953FF532929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F287DFF2829292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062953FF53292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F297DFF28292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %062959FF53072F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929287DFF282906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906290629 %53FF53072F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F287EFF2829282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292928292929282929292829292928292929282929292829292953FF %532929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F287DFF28292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062953FF5329 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F297DFF282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %29292829292928292929282929292829292928292929062959FF53072F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929287DFF2829062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062929290629292906292929062929290629062953FF53072F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F287EFF28292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292953FF532929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F287DFF282929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062929290629292906292929062953FF53292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F297DFF2829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292928292929062959FF53072F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292928 %7DFF28290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629062953FF53072F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F287EFF %282928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %28292929282929292829292953FF532929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F287DFF2829 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629292906292929062953FF53292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F297DFF28292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929062959FF53072F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929287DFF282906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %29290629062953FF53072F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F287EFF2829282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292953FF532929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F287DFF28292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062953FF53292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F297DFF282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929290629 %59FF53072F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929287DFF2829062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629292906292929062929290629292906292929062929290629062953FF %53072F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F287EFF28292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292953FF5329 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F287DFF282929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %29290629292906292929062929290629292906292929062953FF53292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F297DFF2829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292928292929282929292829292928292929062959FF53072F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929287DFF28290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629062953FF53072F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F287EFF282928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %29292829292928292929282929292829292953FF532929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F287DFF2829292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062929290629292906292929062953FF53292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %7DFF28292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929062959FF53072F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929287DFF %282906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062929290629062953FF53072F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F287EFF2829 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292953FF532929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F287DFF28292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062953FF53292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F297DFF282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %28292929062959FF53072F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929287DFF2829062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629062953FF53072F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F287EFF28292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292953FF532929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F287DFF282929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %53FF53292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F297DFF2829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292928292929282929292829292928292929062959FF %53072F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929287DFF28290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629062953FF5307 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F287EFF282928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %28292929282929292829292928292929282929292829292953FF53292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F287DFF2829292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %0629292906292929062929290629292906292929062953FF53292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F297DFF28292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929062959FF53072F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929287DFF282906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %29290629292906292929062929290629062953FF53072F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F287EFF2829282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %2829292928292929282929292829292953FF532929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F28 %7DFF28292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062953FF53292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F297DFF %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %29292829292928292929062959FF53072F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929287DFF2829 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062929290629062953FF53072F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F287EFF28292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292953FF532929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F287DFF282929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062953FF53292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F297DFF2829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929062959FF53072F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929287DFF28290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %062953FF53072F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F287EFF282928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %53FF532929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F287DFF2829292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %2929062929290629292906292929062929290629292906292929062953FF %53292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F297DFF28292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929062959FF5307 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929292F2929292F2929292F2929292F2929292F292929 %2F2929292F2929292F2929292F2929292F2929292F2929292F2929292F29 %29292F2929292F2929287DFF282906292929062929290629292906292929 %062929290629292906292929062929290629292906292929062929290629 %292906292929062929290629292906292929062929290629292906292929 %06292929062929290629292906292929062929290629062953FF53072F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F292F292F292F292F292F292F292F292F292F292F292F29 %2F292F292F292F287EFF2829282929292829292928292929282929292829 %292928292929282929292829292928292929282929292829292928292929 %282929292829292928292929282929292829292928292929282929292829 %2929282929292829292928292929282929292829292953FF530729072929 %290729292907292929072929290729292907292929072929290729292907 %292929072929290729292907292929072929290729292907292929072929 %290729292907292929072929290729292907292929072929290729292907 %2929290729297DFF27532828285228282852282828522828285228282852 %282828522828285228282852282828522828285228282852282828522828 %285228282852282828522828285228282852282828522828285228282852 %282828522828285228282852282828522828282853FF %%EndData endstream endobj 19 0 obj<>stream %AI12_CompressedDataxœì½{“$¹q'ø ò;äýA3ÎÞN)xóÖάªZ.‡#j%“ÉÆš==d‹]ݼžñxŸþüçªÊªÝÙjRbWz"à‡Ãá/ ~ö¿ýæë/¯¿ýðû7_ú«å|úÙÏž}|óêÓ‡¿83ôüËwï~øþÓG€~þÛ/În½Z¨Ñõ/Ë7Úðß|üþí‡÷¿àŸøÇ—xúç×ï^½?õöÝ»·¯ÿø}åÞ¾þë÷ŸÞÜ~ÿµú‡·ŸÞ½¡v¿{ÿ }û¥û°SwÏ_}¢ëßä¿YâÙÿÂåóo~M?ß|øáý·oßÿáæÃÿMƒ?¯.žƒ÷ç˜3ýüßßþöÍ÷c›«¸PÔð MWúߘÓU¤æÏ?¼þáöÍûO¿ùøáõ›ï¿öá݇ßÿâüì¯Dù¯_ý~yu¾y÷êõŸN4àøÍË·ïÞÐØn_}: ôú—nýææ‡·ï¾ý»nÿ†]­€ûo¸¯ß}OPøàüÍ/o òõ›OŸˆ>Ân=ûõ?ÿê±øÃ-·#’õóóùí›?¼eÞCþõ mÛ+úüüoß}øý«wççoÞüùüõÐýÃ<ò¿Ÿ—«B \×èo?¾yó^~”§·Ÿ~óÃÇ7Ì}vx’þç7ïÞ}ø‹5p»¿}óm{’8Ýÿôõÿõëïÿø…ðçÞÜþùÍ1O’_h>ξb†º¿µ%q]¦2]¥e!tå*֚Αڄe çœý•¯ÆùmRßüûÛ7ùÅùï>¼#xýñÓ×oÿš‘äÖs®«@ûû7÷þí'™ë_V™½_øöÍ»_œ×öìËw¯xÒWô¥Á?¼úø‡7ŸHþ>¼ûá/ˆ²èO$_½úëÈ–ÿç7ïÿáÃ?2}_®>\Åìü9—EþpWáìb¨gçÖå¼&Æh¤¾I NºGgèÊp`%ü†äìï?¾ýÃÛ÷¿P ó7ûñí·›ìåõ\äx’öÿÕþ_¨¥úôæ½ROBÿì× /W¿þš0¾xÿí³·àü÷X¨$ºïITß}øƒüÖþæ_èñþ,Ôó÷oh’~óñí{ôyú;þ¥|ó›w?ÐOûñÃþåûï>œT‡üæÕ§?’x¿yÿí÷M¯È׳¾zMhÏÿû{óú=¬€í¯¯xûéÍÃ}ýlúx¾ùøÃ÷<ÿÇï6½·û©‘©`†¢ýOÇoø÷ÿ^8}Ĥ FL´D~rX¨õÝèÇŸrïÏ^Ñæù‡¯þüÇ·¯g&¿7LòÛ#Ñ'ÕÞžç¯öïbù×Ûßx÷öûÛn§ß ¿yõñÓÛ×ïÞÈîÿpoÏß|GÛlÇ6†¾xÿïoÞ}øsGdƒ¼zÿíù¾úøçûºÆ4}÷öý·´Bx=olüpûg˜ ç¯ÿøêÏo˜ÜO|É-¿¾@ŒÉÌyõñÌðÖ%ÔÉ/é³½JXë4~CбW}_~yNLç›÷ÝÏûñÕ·oIÛ’ ÅšîÍ·çßRï¿ÇÎ|€†Ïç›oOÿrúo§—/_¾àÏsú<£Ï }®éSéSè“é“èéèãé³ÒÇÑgÁ‡ÇÏéóìôâÙ‹þ\Ó§Ò§Ð'ó'Ñ'Ò'ðÇÓg¥ãÏòbyÎ4 —çøïnNÏoèsMŸÊŸBŸÌŸÄŸHŸÀÏŸ•?Ž?ËóåêÙ þp'úùï†?×ü©ú)üÉúIú‰ú úñúYñ9ñ?®û,ýçæ¥|Nÿ'±»,Å••>¾„K*¹”RËu¹!´Ï‰U/ëR]]«¯¡Æšj®…Œ™ëzCÄaü/êËëåÚ]¯×þ:\ÇÓuºÎ×ôüu½¾¾¾¡‘<'¾¿¼YèãnÖnâM¢O¾)7õæúÿ=#–¾¸yÉô9¢ÝÓ0¼ô,Ÿxü•8rÃù싯þÚß°¼<'޼ Kpa >„C¢O%ÔpnN$ZÏyq¼ŒKtq>R›cŠ92q¯ésC3õœ–x³$—ÖäÑKŠ)¥œH¤RMטñôìD ä3pÉ.¹ÙgB—ÉåÉø¯d’¯|I8XÞŸó:³—=ûXp!º&¼_0DB 1† C”!Ì7¼Žž³H¿à©[X°!Ún"ù†„CÆ!åsH:dÒ~ÃËQ$þæ¤rɇìCúØA K Ÿt``%Üðº~ÎëáKŒ¬ ¬ ¬ ¬ ¬ [XX!X#¼JN¬žóRyÁÂ&ËÅñr÷¼hlÙ$Ö²r*ë“›¶~ž³ê!1=A±^’…äYkÉbJ¬ÑdAÙ’²EõœU¢,,[Z¼¸N¬Gc[^ýë—ØÅ‹ìÔV™-1[^º°X*tÓxΛÅ5o™7ˆÀ[ƒã-ÛÁ3Þ*ëÿÄzß³¾_XËCÃß°Z/'Öæ‘u8t÷Âû9«èkVÊ™•p`•ëX§¾ =£iº¦+4{‰f2Ь®4ÃˉèA\|FsyM"QHBÉJ ¹YI†ã âô3šïk’¹Bò—H‰æJBº^Ðl<#™¸&Á,'’ðDÒHòWZ qëMÙ3œk’ÞB«)Ѻ ´ÂVZk qôMë3®k’ðBK3Ñ ´XWZ´Ë‰Øþ‚æþIà5-ƒB+<ÑJ´æWZû MÍ ’g$¥×´T ­ÛDÊ âXI,4}/H†ž‘$_Óz*'Ò5‰tN ݳ’ZhŽ_ =#q¿¦EWhù'R[Ô×Jjl!9xAÂøŒ–Ä5-ÌB /‘â ¤WR„´ú_bSÆFKXB3‘æ$Ô¤EÝ"*¢)ˆeaý  - =+šºV´­è[Ѹ¦sEëšÞUÍ{jÊ÷yS¾½ú%¬ú·×À¢ƒMïtð kþ „M 7%Ì:øù ƒ§ø´SÀ¦~Eù>Í«z×7[Tߊ®=ûßN`•©Ÿú{ÆL ÖXžŸ¯üÎüIü‰üÁüÉ{–È><XóÌ!1‘ž±dܰt\3!#ÈIbY´@^üi•ÿ‡E祘m<9ÏXˆ F¤ÊÂqÊ<›‘…*%è~‚¤ˆùÈBö\L%5[eÉ,r‰ÅˆyÄ¢·²˜-,€nÁ…w© Öå+³_˜§§¬Ì#YéË;5æ¨3UkžDm²%œÔþUÍÙéNÓž¦?MƒzµVE‹²=©*e*êTª¨Ô•7λëÕç¼¹Þ¨v­¼õfÖ±¢eÉ%ueeëxJ_²Ê}Á[ú3V¼7¼Õ_ó¦_XgVÉ͂À‘uÍ“VÙà}ŠM‹ld<³ 6A®Yoãcÿåöa#éÄúÜ>¡}|÷Y‡;|–ísê¿ÜõÙËÆ¿œ–«[ô0.çZ¯ò²$üüõégßÜõóÍ÷ÔBªò‹¯W ­×3"†¾T{ú¾&Òƒþâ9­W´JúG¿Ñ3Ò¡3zB¾JK(¹Ó_ñ‘²Fû)]Ñ2 g¿'÷Þ6ÚGûÙ]‘‡”]ßÅ]M¸ •žWbIýÝž<þDOÜÒI#7m`‡Î2û?×=“DbâŽq{á¼W6/’Ì“ˆfbÇÛC˜§oyQb~˜FÈò=Mƒ³ÐÃÞæ½Óâ=m!‡Ï•·~Üÿ©ÿ×Ò‚ÛÜÿ ¶r¤»Û jšÐ·\¯ÇÎ(é lŽT—hXúƒ»Êu³aæ?òSæšä²nh©„í©ÙòT)$ýòC W4þØ=5ùQ ¦ˆ… ?É$êì¥ÉüT¨$,Q~XÓ´=5û‘ŸZMšvGv-ïÎ6›ý¸ñz¸ü8óçwïß¿º}óíù :WO6Ð ŠÜµBìO>ô9þçwŸ°}Nì³FÈ'·ñU?율,q|ñ‹_H#dˉUªã€ÂÊNuаBdŸ;³Ž-ì¥\³¦µ@ïsöá_²Î­ËцS»¸oa7*¸ <¨"Þ€MW @¨F>Á?žDëD1?d ð†uÂŽÅQ‰å1ÿ¹{?»9É?í㟰ûÄÝ'uŸ,Ÿ“Æ•ŠF—ìsÝ>7úÙ²1ÏõóBâOò12OÎi8J>^ÃRwä¨á) QeÞŸ ïÑ•C×¹Ñ$G­N#‘«„¯L¢7Ù݄ՄtPNÌ—'Èåãgç‚ÿþƒ;¼_>.úœžøàz×gÈÇ|ŽÂKŸÿfG£cŸûyiŸÓög'NÇÏÃêSÕæé¨=UGÚ«ÐÜECê^•žš6Ý4ªéTÓªfÕëÔ«©XU²'Õ³Qã›Y?¥iܪñЛ¦wŸiÔô…i_Õ¿ÐÀî„"cèCÖÐãŒ!™÷-â¹E;÷¡Î-й…9÷AÎâ”…þXy¿U¢Ë>Ë.l!`·ðîYú %û`ÈuoÆžî²ceFÿ!ì»éßbا]»lal™ˆ~­?]sÜ¡~zElDÿ«®ƒ<ÉDµR|K¬p »\€f8°M‘ÑU2,¯\Iˆ’CºrTެh7Zì—´e«Ô­%I<ñʹ˜éW2ƇÈ"Œr²[—7å׌‚ĥ䄖虌% b2‰i!u¶ùeÍÅî. YJž‡Dæ8=Nܶ!]¥\g‰_Ôüó,é0µ¤ÃÎ’Vdö¹é>[ŠVÈìwšm9µco¨Äƒ¡25SZ%„3³ù¤1‰Ô,æÍ^V[¹YÊþP1ÉÌ¡ŠÒlã>VqG´â!ê2Sb0_OSÛu°Z;£u4X÷Æ*™©§f©¾ØYª½™º©½‰º7O«I©·Nmâ›å°Íxo˜v³ý°<ÿ Å;çús E<ΖA¾è3É1µOí?§nbï^ðý’ï—ý~ñ³œ&¦åÌŒ›t›ˆç§6cqÅÎ.ÝB&S¯ô±ŸÓø‘ ݃¹«/3{å Ãgái{ÉS÷‚§ï¹VßÞð4^óTVMÛsY# 0Cí$F0«(‰á,­Îf«°Ùìë»kkT NÉÁÞ’ka;3¹ÀVgÍb+¯Kú‚¶bI«m¼Tú!2i#YÈþФ¾3wïmuýÖ+çû¬þe͹çƒc8ðHók wжŒý?ÿøöÓ›ÿ*gõÈtÞ}%¾¬ÿ™†ÿ_3õPþâ´Ôç¥Jzy<ÿ–À¯Þ RjP£ü§°þ§°Î…õ>a|HïÖÇAâ¶r´Sç‘pãTéùÃû3þ%©Þ}…2ˆéÈ?´!­‹þCîüϾùA˰¤òìŸþÊ_ÿýùoüË9œ}þ—]Îß2üŸ~‹!ï:¼Ý Úéù+íñô müÕ¡'@Þ3š¿—ÌéšCä—ýáB]ìý·ú­2ÔÿJ¶µó_¶^=ŸUN=Á]HÎã¶¢ümMgï®|`ü¯KC’Û»lÀ Ðïéÿ¹{œ˜:/Ô0lí‡ÍO¡ oqßôã nSšøQÐêw 玖uÇõLù ⿃Å,aÇž1ë™׫µî N#…eÁïÙr””¯jÎ;¶4¬[v”(Òz•É:êA#N£E{gd1Ý%Ð&/=ÌzgdŒ‰J{yéaÖQ^0 1ß9I&0é¥qaJ`f•˜4b$¦g‚z6˜Äô0›“ž5ë1‹ÄhYŒ±Ùë£Ó3ÁDf&½=cf´¨Ìô «Qcâg³}{Çꜭb“¤{¡AÐ6tRÔá4ZºE§”ÌÄláØÄuxºÉ %{ŒFÇ ‰b 7_ïç™j:*“‰úûýqù?Ä”ž–™MMA=-ÓËŠÉUϘ–˜¬ßÙ.5ÛÌ)­{ié1lÒÒÓ2]–“%3Ûž–ã"ïäåR¶0wÓ^^vZh¢˜Žªd¢ü:y¹”-=-&/—Y?=-}ZÈŽÑš±+Gÿ¬±ÿcYr ž- w—µ3S}²ÌôòüÝIÌ02Ô+[_Îq,"'¡vØÄ¨8ª‡‰¹ËnY'$\ÆaE‚’â¯È9Z{FÜe+L¹ájZp? É6¡>óÎΤ0 ã¾}`¯îÏé ¾›¬ÏÛ¶¾Ï}ÞˆQ(±½£NúÕjòÀœw»a›äõÞشË]ûàl»T2 ¡E,%PÔIá•“?þ4Ùäz¶LŒÈå®]p¶Y ž–@`QlóO³˜q©EVæÑ¢œ©ã‰Ö^²³&{üwÚY=ö»,ÃuBÂEŒ”^·$FÖžw™b3f°ÕÓ3•ˆt[i°ð„«\£zÔ;e z6W–‘úäÔÜ{zÖň¤JÖ!ä+¿ê$V©²Ñ®Ñ£­»rÅÈXÖ«D\%ŠqT@[Ò4®¢õe”…«J³GŽWÈ¿Ø ¨q;D¨8ãB¾ÊÙ†oCoxo#ü1ÓÌ¿› ËÆ›#M?#n!öqn‰Ø…º¨èW™“‰j*ç æáxv4–šÏ…ƯˆR%NÙXÊ"ã̉f€Ôf!Úqa#`…¸@_Ю”UÆSV6©Ð[ö‹¶+$!LHLBž‹ÔÅ1ÏUˆ;ŒÂ†”+ÜÛ•è"…{+­Sªõ\3I¼“ɤ5“`¹…Öâr–I³]qxB˜FÚ°†ä1š’åYbX[ªÙAk äÄ jÀ!j–]*6<·¤p.ÔlY ñy «ÂÆQ4i¥> $ÀCÊMZIœ¬t¨s‹&l4’ŠB=è 2A¼E;Zy1{AU©ÝºP.´!;mIÏËöZ?íØ¥ÐF ¢"(æ–¸ Óo«t‰•»ýzŸ…ž5^å•„Ø×Eå|Ž“p9^®´oÒ¦ïeœ1,JFª‹‚ö§*–ÉkôºRˆ ÖFÍ:ã´k<Ò*–6$‘‰Ö€Åf—MB$kE­ŸÀVè‘‚!Ò¾˜u2H“åÀ¼ô´|u*‰.ÚuÁsâPÔµ|ʦyHÊ\Â5$àÕ4O¾*dTœIÅðèb&)¯´ðpfºdS;ÄPÈK¨$¿É€«˜~Ä >%Óäd8îFMJ?´Í ©„Ö!»GÄ®•ÖB$a É*‹˜D"ˆã±Ò%ñ'Ò|‘rÉkЧÇñ´5ÁÃÐ!a[«Næ i,¨ú¬«/M•úÌv—Çþaú‘u‘&ö¤¹Û¾ãaPZ§íá,…’r\W›ä6%mÀžRkIóä<íGfd‰Û8TyÒžµ]Ì_…¸Ô„vŽÛpÀ-ž´bÔ MÉnÈ'騠Œ&^ÆJZý“˦pÃâ‹÷…Ñ´[É>°B¢«6¤m¯b¢5Å;(¯/3¾.K¨¦¯eubÅäÅ›ª*I) ºµeÙÐÝèÚ>Œ§í!´–ÂÍ«K JŸ°{”!¸bºsM–˪úœÆT ”‹GqÀ"B -BlWк$L$‰æ)©¢%<´bI_‘Ž"ÎxÛ„*M·ŒI·hýÍ@g)mc'¸«Si‡Óä*† zXIh¼žK#@*YB*´³èã9nÒ¦„F¨œ‚ýéYŽ·&êÜ©î!úSŒòtóÒ1R¨3Œzã ¢³YZ‡ñôD5Íy"WÃò•ì}Ÿ¼ºtD5Ðê#ñc‹MI 0x=4­z°Ip‹O"¿Ð³-@âœ5LT¹Y³Ü°ê0mÔOy5k„Mu"%¬ê²R ñÄÊ 6æaÍèsìµÓb(0 n¥)›b0zœ.*Ì,›Û°.7Y!°'°y-<f6Ƭ›‹ÍRïå*£¨kž¨†A KwQc#yñƒð„f“‘$¯Œ][{à ll^Et“Öþæ”Ø/´Œ/ØÄ+´žÌ­wâbÓ£‘ª›˜Å¡°)qØ`k’Íz)®Y«ÀèÉA¹â±ízÙë³î ့ na05¥!=PLŸ‘¡EzƒqgÛ+<âXi؆l>ãé0¯°:Ò”™ÅTH«+'hz²Np[ÌæWT«TØPå¹2g•Íà,Ví «1Œµ%GwÌm Ö’bv Ìj…À­HNøÅÞ±Ž.DŽ¬Íšöpz\a˜· ~y53Âïfc¹T\€ÛKRKÒIû£ÓàÙt{¡XÌ @ 0ÑÔ#rg®7íìn@‹ÙFÁlVˆ$š OE #"2dQH,Ô°ØF8Á9ÕÔ½™»ä?±Ç’8xÇÀUýf±¢a<‹CÕ<Ý@Ý 'PBÛ©'ÂH3qØQÛN'jäàe3e Rª4åt]Ôý+д0—¼9¤ˆßç8èÛâBäta‡¦v!¨“]1ÉÌ1Ø ~ã‡a wÛ¯ã¹\E¬â1BùXÌ7]4 àü«n"phŽc’›p«­ ]êœyýÈ `m‘é@lß’K¬Gê)&ì`BpØãÔ™@£d*Ðmc1,¶®X››*d¿;q²‡v¦–³v¹® ƒ!cM­Ô1åMù²,êY$Ú íWS‡H‚aqbð®‹ÃÅVÒÜ#ÀN¸aâÓÆXkª$Ü6&'»¨hË>§ñ„!Nèlaÿàw Íß<ŽlcÊeéÉ !O8ôä`ýë²a›LþmÕÐÖ‰°2)ïfLDÜVöÛ‹YÈ%IŠw‰:Mt`!¬•-–ªIRšÈ±™‚R©Eb¸jè¡eYL{Ù_qÕ˜YÜÃ0Œ „†ýɤkýVš²óñ`õdŒ ˆ”ÇmýXïŽCÍY"5ÊSŽ4¦¥K•úÒq(ÅôeÅ¢G2ÁLZç8Éϵ:•!Dø õá?{A°ü¤[ï8lK¤±å98›l'{ÕËðô½F;8.{›i#‹Mc?/1CVjYËNlŽ)qºxÕIÅäA‚À \8Öι[]Íô³háE/¨õÌr` öFcà ÐʰüH§IùCKnîŽ&ÐioEŠßlz:0ú5èæ·JfQöp<"‚š'}žÌ¨ÇE¬'ÌcGÀ%±.ÂZÑå ›ùy»k áÀB©jÆcÅ2†ÇMÛõ»¨¢B~»°é”°âTO#DÆyr²ª¥b,'’⛫‘¸‹fëfCÃD\­W@Š%S¯ „„ˆ@'$3YФtmQòP%°h Õ‚a`mÄpOxgB²Ø2“!©ã‰ôDñ›uîpùŸKÄ`ç¶!síø°‹»"L†§“Üц͟ƒ7H.¾Ñ&‰yÞ6¡PÅÂg#6jôM$&„ F ©ƒ?œ/Hˆ#Ùþ:m3 ?ùÅðGàP¨ñšåÕ¢–r4Að›Ô£&— ²@Zݬz’mDfº˜#n+\Èú ¶Ú’5ˆì#u•t÷„;ã(êP=+U¡Ù°ÄÍ|fOÆÜŸa6²ÕKVÚÔÿ­´e=AÏ× z4³ÁÉÖHÁÉU8Ô– eÜÈÉàTOèü1lÛœ’Ý/ìÕ…«fW«|pjü!µ„¦9ÒŒˆsÑÝ <@Š+¸Íê‡q©ñ•«°…;]\,Ÿ°ð–ÁbÊÃ'œkb‡”·†%Ô œy¥)“¢˜ÒfU'|ùÊþ{õ¾m^\¯Ñ±=’¬\^šQZÛ¯‘xÇ>lÍVÆ»òq [Y%ÊÑ!áóßJg¼›Àá4•5˜‚¨§íe^$J,½xË CznwiµÄË”0Ò"(J/‡9`*Zh¿ ;MÛsÐ;Üuô rĹÒq ñˆ±Ó ÷8Œ‹ ï) ì e#í4¬lÆ«XMäbû)RÞÑü…"B»VÝyÉX ÂQw.Y9$ –ïžf ’åêq‡*{Šf5Ã-e³› µÚ R„$êØt*7꛾: З—û.„€˜yoùÏ æ2V°ÚF+R‰@Bò½„æ--AÊñHG4ï”#OH,ZÝCF”B‚³êB"¾O­[![¢ì÷ûVÆdöe7^ß8ØCÖ¶¢­&b?¢GKü„›vÂÜdRecíLÌ&eK—šd¬œÄƒ` †-ǽ`xd Mš\Ô«¥åZU* &csüT(ÖÚ©àq4+‰ÆAX/¾E°T$<‚iæ!¨H®Ž–×n5 «œJAŒÕæšö<š¤6Ýå°×”ŸX(råHM¡úÃR¤È?W\q7ýȱtr ˲®´YW\Wù9 ââ™G4žÌì’·ªÐ$ú²n5¡¤Ø¹$™­"”öAZ—¹lõ Û‘„ J OÒ„åì6¿ ”˜‘Jµå€:ä9°Ûúâ7XJ°VŠØìõ\û»Ã¶¡_X Œô;f»jC‡Ê ÉZBÁá®Þ‰cÁ!;(ê a‡+J•%‡¼35‡Pprâ¶/:Ä~•W„vvU‡‡q5C—Nê± a-/RÕWÆ8)=D…ê¾ø0–Yõ!ÞÃ2–B¡ëdüP€èò:©@<Žêb áÇ£ÚjÀGÄxY‡>|P©8íCø<ÛH[ìbøðÚÄÁÛñ£†(÷Q|x†PC™ÄñÙ¼ä“Ï[ãÉ? íò=‰xˆô±|‘Ü̇Œ¬\‘ÐGó9鎨Ï.œþ©'ÛÇó‰×[QB‹yrLæÑGÝ!¤"½ðoÓ_$ß½ê#{´Æˆuâ)"X„øWï*rd†PíœEÄà•öÞ"Ë1cï-’·ÖíÜE,“ƒ¿ÈŽ>”fç0:®ÞÞyŒíÄe¬sŸö+•½ÓHªÄ­{¯Ó/Çìz·1¢ŒÕ§ßs™kŽvŽ#DtðëÄq„lÁ–è=G6”ÁôÞudvèq¼MÂÆá\n,R•¼³p8Cí L6‡wJ"!†‰€{aÉçëmèuUo$`t‚¥³à°®êÍ,yÙÛ Ãh¡ o¯;KaÑŠ·ÎT€Òã‰ßÙ peGcÁ™·Ü[ p‚Ù› ‹œÊéìYºao08®Éöeg1`æ9HÝ› Ãh.†€ªTœb‰š†àûˆ‚ ˆ¨¹¯­C6Dœ†ëI ‰çQ™¶ý¾LB»¾èš A P+Æ0N©qÍI€¡^'gDE¶Ðö(yEa5ä‘•Ë’žý€.–D+ŸB|U9ÁJ¬ò9)gÒEÖñpeÚ¢¦²%Ž™³&uT ùˆ—¦+ƒžáì’©” ~óöp‚hA7;è‚€Ž$³¤•µc‡ ¹¢Óp7šK"!ȃÈ:Ä뗋ăüÍÊÚ;a'Z’ÄNI1·"q9‚~²Š6(\ʆx»·®¨¥E(&Ì:”Ä!b +«Œ$­A©XÕübÑQZ~I1Ië²Ø•Ž¡¡Ùçby`û –1.º&ÝØŽ –8lJQ9ÉΨl·Z›ÒÄåZ$f‚~zcc`ü ´ý‚Õ#„$ñEÖ­‚ž6 j«ÿO1¶Ã]cŒ]‰i«…yÌ£M ¬³Ïn‚% uô¶|ÁºtÖ@Ë  ¬EÔÍšìB€]ºàj‹7´lëõ²% JWm¹„[C1Dš*@j·Ù Àš™`Ñt>“ 'ÑZ¢µã›º×<¹¾É2m-M€2k;Öe :ƒbKH=·Q%9‚¥s‡¶A0Ù2´~šáª TÆ,›5³ÐcUŠÞrØkDùKnµ¦¬p†B·(S8þbÙö¦²–í” ÷Ü úÂ]U|frÐ8ÎaAZSˆ£´úÊaV\gPÒnýsKóÓºþáV›iËνó­ÒVj?»™µÅ¿ê±Šýâo·_ûkWŒmkßýõkbš·cG»aØøÉÆá3?pJ^Ò©Ø{CÔ-#ü„ìöœVžBHsz’è\QúÉû˜ÛRÙ#çB%© <AODMí0Pñ*ÏX˜kj9¶½@‘¥˜ ŠDI©¦ÕʈÑ\*ä8àZ¢›­Eí@T1qZvG°4 y œa¥ÕHBRlÈr0 …Ž–þËE ƒ1dò-µ%ï}RðK ÈÉ0bÍ™õR—Àå{ymŒ`‰vrømãXvŒ<;«Àt±¼W'‘PL£nw8#BK ¹%;ÔˆüŒC‚­^c8ƒðŽ÷Ú¡@Ea¹ñ7+ïr²Õç°‰,ʲްպ®šžÉ©+*„ì… ±TœÕLJm ûA\*„19²:32¾6x'u~0ñsnuc¼Àðª»jòXÕêOr “aY ssزE`&H‡ŸcAÞêD–9¤v "ÒœM¶ÊÛ¤Ž%£h#7Î9d©rÞ†qO>";ðP¹ZŠ≈qÁ+²”bàz¹´ly6,8§Á©‚¢š–(¢i1JÅï;ÁÀÛÊ ™Ö­ìñÙI¯’"›,÷l´â}”´´c¿jæA-e¹I¥ì+£œ=*vD>ŽGƸE}5¶ÄáÛ«Qðƒª¿Øee¢æì±©,e;ƒÐãâ¹Ç)9Ô¢·Í=*Ñøz£²Í=Çmù(E›|‡ÀÉ*wlòq®êƒlòQˆK®Q¹n“oÙ”ïÙä£È=s2Æ&Û;b1V Ã0'Þ°/Û䃸tòqúçV²M>¬'Ä`ê6ù–Ü Ë6ù¨UDùªêÚÑcõÍqlÙÚq±)`6ùj yßñêe(8jÙ’ !G”,Ù܃GH©Á¿´¹GqñÜ;­’D¨žk4ne°\9\5ç-f$ŸŠ« ™]Z„?\vk!¹!úÊY,§Ê¸¢š<àÄé8dí gp²0‹!`ãB¤l]±3¼;¼rÝÎ…Fqñì;‰ïrV£,Mö‘yªr†Üf•¸u"æäêúZºá£ѨÔv)HâëÙ1ZB°ðÎVº Ë.W~°¶â`~ |,Ô*™I…ç¡1ø0ˆ‹g?¬Z3CØQ ¢·wF²qùÈS;ëXDÛú´å'Q£ „@g)­ Wôã—€0L\8½e¶+l ÔààÐQiUm\Úëãf¦U\˜ç¶ê7‡#€¾+X‡qéìì¦ÈWÉßhð‹wP¿ÙH7¡Àń摪B¶0Ÿ)]Z„Ìá&J—·<áŒ׈Åñ$¡Û)5.½©ühµ%‚àØø`ÝjªL¢ SÔñwÄåK?èñfüÁ.’¸º^ÎÒ°{žZE›zópzñÂ&…ÂÏc7`ÙÊýñ`‘[ RWš $H7óµÁo!æ%%i›[ŒA¶€—Í✓˜À«œ h’jv×g$#»T"ø”Q–»~’ºÊm>Ê’í,3Èp«¦º–Móš D@°׸ÇgïXa ŠOýfë 3‰úî—å p‰‹å};ßSÙã0¬VŸƒÀ¢”º»í¦…ø.W°xq)”ãMˆ† Eü/0æ4¼¢Ì Yðv@(K…+_u`‡N1½¢€›‚-vÜH„¤ù&­`B¼×óÏ8Ý]¨˜FŸvZ0ÚeKÞ*#£†Ù$ßÍžý€.6¾¨\òq«ñ $œ´Èšzƒ‹ó‚½Ò·ÕÌ)h”δm«- \‡6óÑÁ«]Ѝ,¨Ã‰ÍÊ–|ä±âfeË^åÝaXKÚ Çállp¸Á’/SÇè!Õ®íá•óƒoþ M‡D^ËL²lv8ÉP¼Ô Q–À'Š%•ÃB«§ GF[VÌ+‰¨ØÊ…Ùæ6ØT«r7 Z¶âh^K™ƒŠe+òaýÄ+v­n Fq6AkhõÃÀ.Ö°—(5 ‚Æ>Ó¸iHÏï—ËPò†¶‘¸ÚÅ'Ì:,b¾`(5Âõ*? Òy[ãØ€¤* §5üÆ:)UgCd;´É'Í…÷ç‚—¹‹ÁΙõH9ñu+IzŽ}"¶K&VÉ–U¡!Á>‚ÍiBÉlê´ÍY(\UR»SQ^ AT¯Ù%2Ø®pïNo:!/ÅvhÙ®NâÝŒ¤ ”Xš›|r€€Gq±…¡ÅÆ|EŠ÷ņø·›©`_íÊž:¡nkÅGjÞîÁÁ–»£"N¡;3ÁŠËlt+ÖÁ¸`4à¯òŇ+bÙñ›¢Í˜‰Òî¿Øã±B™}YvaB@²Æ| x‡¤% ƒÙŒ«¥‚ã°* )nj‹ 2:+ò Hzq’q2t)¯˜Ë©ð =ÚŒEIUs&‡1\*ÀÖ¥*E:v„f“Q!þgÈs¨†ÉN‡@X’šm%Œç?¥Ý%<ÿ~7Öºlä…ìú,¬Ì?ó77¾ñü§Ò¤nÃ#g‘êU.©J±jÅö¢'ýÚeðŠnâ8|»$Šz·E=3®hàs}±å2ßàQq ‘ØU“k¨:4×Iá^VôÈ´jËŒ+™žÕêç–àxÍV…:ŽæRAÈv&|þUMˬ‡¯€Á*Ÿÿá#|®ÝÖ¨Ô¹M5ƒ[rVVòÚ¸Àò`Hº|‘*Aô‰ü-©]2&y8"]â^7náõ¹<'y»Pr?–Ç0hÅù5XH· cÛ‘ãÅ6~œ‰…é€Ã‚ÍíXŠX¸‚©]9°d1pÚ¸UÎàÄ1•Ü'EI+JIrÏ–µd»7Y¶¢ÈLbO.0´mó¦–l5à ± t±Í#Û+_§TJãL\°¹æmx0j­ú¼(ye+#Ã`0àxvóÈ–¢Wÿf9'aã`s÷Á²¢f¶ô¶‚ °öü®b. f¼›¦cƒÝt¼°wAÐ>Š#Fæwém¾Jú·å—¹¼em€\“AÊævçClkÖvL³k|ÞoƒqâŽ#Œæ\E ^Â*k1;ÆruVwwggùþù²åÑRâk6[jNc„^€lþ7'~±Q­ªùI&¦t÷6ZõŒ/ò¯á«màÚu-9l›Ûå*rGFåxáV_´šO7æÍEçLZ¶4{HÖc;WÄÌA^¨cÝ® Ø çâÉç=Oè#Ò­‹€Ó–|¤>Û}{¨xゾ9um• ¬ŽQO«:AL¡îPy»U–ðE¯h×tþ"x´kŠ iD;´k óQÌôDëRoÀd禼÷c™Í<óÔˆÏ(Ýê“(ïÀ‰‰vóŽ>³Iå$§ù"°¡ÂœA9)ßq°ø¶?°úÐ ¹¤÷–`ÈÑ\ì¦\¿‹§í0+ζ.í:fŽSä¹´ q?šËW}‘/¡¢†!îä{°¦[Iy’›Žåœ9GYk¶†j‘ÄŠœé_ÛÙ›¢78¯Û±dœH‘J,\¬c5渽ˆSª¾;`Yåþ;^qV‡íT¥òòZ|‹õî4]÷#òYzKÑBîRݶêxÀY/ž¦Þ’0íÄ^Õgìá«M¹úd1Å„ :’dÙI}r˜£^¬H ñ~¾Ú›ñƒK~[Ÿf¡1ô2ƒRbcÅ~@ Jð9Z‘P ¾:;WÎU:¨øòCÀÙj8Ç)vÆ«EQ>×íÎ)®JH¥©¿Šßé8oæÍ––,?ªUšñôv [F–ï[ÒšsšëÕZÊõn§%Ú|ûñÌæx¥+É«—.kí’×êO®uÏeõ¢ìi7Æz= Ň“íÖj\‚È×f¤Nn½Ÿ£vÉ\HR¨(ÊäÇ×Í#ÙúÌ6a;\MFt¹@`§ëQ2Û4€W—®îØ« €²j)¯ ÕNxÕ¬<ÃV• Š\Ê&0ÕØ/üâZC¯¦ºPy]ÿPtµ ¶ðúÏýYŠq4ÓåÏišÌ¹$±Þ¶˜»ŽaýÃ|o¼×õ·¨]˜åS»Ú¸ÝKÁA"¬èüÒqŒ/9D¥PËcrm/Y´I._±A·.›©ãuùy»ÊdÏå‹_ïW±¾^¶P“”ã·Z5xÆðýQ@dkAć²Ù\ÈMñEÐ~;HùÀëS‚\ÌÅ \ÛŠãߨֶk8ó=kUÖljÑÚ qKy1óQ½ÈåB¹Ýeé·>›èƒ?‹¥Ô,;èrë^/ÅÆ³X%×sâ~Ë`7ö"zµÀÅY·ˆm‚gWÏm©M6uQt[7ó–.B&8×kV)Ǫ*§YÛåPIß[Ài祙öä-V©W‘^·vã0f“Ž0 ûnšêÖ¡ÊE¥Ä?«ã‹òK>óý˜›oƒº_ÜjUªò!g„hŒÍ$µ9B³6Cßç…omáD(}nä×ÄV1Ê*0S}` òV~í.†qùnîô£»W#,UnLH‚Ûù™¥È96Ø^fFp&ªrS 3ÆMr[Å1Gpøîe\'ÜÞÈ‚³!•/TÛ›0~¯'mlÅåtü½*Éúä$Yò݈ñL÷sà…æMAO·ö$Çn»Œ>G£Øà[ª÷×áꘫ©½8pܽv*š!V§µ;P… ºïoÑnÖ3hÙŒ ç¤H2uGé9°“m庽vãy„1‡ >ù Œ” ¬ðòÆ>IÚ<È çâwìe-/¶Ê¸¹Œ?7óÄÙu ~»8¶1ʨùÐd°úw6ôW¹5:Yômõø_,ÚšòjaºÚ5ý°™ÙÔGIb#`×Ü® z•r„c·µ#Š wžÏÍ¥nøYÞ1È7ÚÕ†‡+ß·šEºHU-Ÿ@ŒÍêZ%ªÃеÙ|«•åã—ÍûõºÿsÛÜÌß`wX…-í¦78¥µÝv:Žìb‘Àq\ç\ºëY€Š+i§™¹¾ ¤­¥ifεᦳ¶6ÀY§²mBÙÉýØ%l›D^%ÕAͲÂÈNâ…%^Ù–˜W©Ø%JšÒÍz¥EÙ‚†ã f³Œ8yP²x·úN}ÜùŸÚ@Ùý*[…#¼œ$„qMœ©oì6%l/!ÂN…`Éî˳È~éT5Þ‚ð4fU#||P»Ó ì@=u‰[õÚ8ˆ‹§yÕ;t8Vô¬ˆ¼ö¡ri+í©zß âp5·{\%ï€÷à»DiÑK Iµû/p ÄIÃ`~ê!NœãĹj1>ÿ#Q¼eÑ„ êé i™#‡ZR§Á¯bŽÜa<³)Ç©'>‡àÂvžä{íÐ]mÃó¨Ú’¨ÙÒ€š–÷[À§j né2–¯Ô„FBÈ®”ÆÞN}« L•C—\ Ó±õ™Jã'1y1†ãé¦ÿ“2AõKH<–ÛæV4‚ˆ#ò±†Ê;£¾mN¾¿>ñ¹I6mm†Nü“>Ô`ÄRÞzI¦´ajÔh›0vŽ˜øªÇª±ÏZóv…è¹Â€¥€• D£ýN_ÑS-âÍm-=ôXôq´…Ò>âKì°(Ò¢Ž=Ô¾íÑD¾§Þõؘ@¤ùVS$W<[Ùö»"çü9É µ=ô€ÜQP·>òK6,ÖbßÃ0b0fòë-²µ5 [кn~3Då· ‡õ;:ãR6LÂÖæÐÉ“>Ô`,l­¾÷´Ã¤ßõ!¡ÆÚ”±“rÄÄ—åEaA›WÒÁøm.«†î«¦Çp›ÿ®ßyv‚LFk†>Â>c0þ·õ<±Ãc´lmö}Ä#žïdI ü).…±UÖúÈžÜá1Z¶6û>Âk E_¬¶q6˜‘:ÆÊ¯^ú.ZlßÑ·ÈÐwmÆ>vxôƒ1­0à ;-ÕÆÙÁ˜FÔqÁ„®¿Ÿí»náòÛÖfìc‡GŸ˜Þ×ÝúX<ëв6|û>ÜÏg”°ÙZ6¹m°,2‡À¢ÿ«Ê ¿pK~oò„óyˆåvmö}„=}Æ`,s­2à)£ÅÚÄ¡xÄ#ˆCÝ&´òlp­:¿¾ªÍ²¨ãm€×üXPåе:ô³Ãf10j!Që'.6Øc²T[«8öØìå‰Üjß¶AoÀF,þäuN^{2¼ô±µòc?~Í 7b­?bó‹™&?°fë'±ñ ¾›ÏË™ ÑAH$’³Í‰NÈË>’¾ÀÌ LŠKFB×îØ×§=Ù ÏÚúZ8×=N¥­µË‡¾Æq6[Qo%ˆŽî`Ö#ž^wñ«§üNuñ»iሙ¾à×tù¦Rôk¯¹¶Ca‡¥W\ò*«äÏ[ëËÚ°4:¤E{ˆ,ß©ÙÃ`ÇÄÝî@HI{NlÊ!1ǵ®Áˆ“¯jɆÚÂ=ø~¤ENÛ¶>Ü‹ë°(ÖâÐÈÅÞÚÞ “í…§Œgy§6r&ž¿;k¡½ášMvªZ›tè%ípÙS¬Zd.¶~pñgK¾¿V …ž­ÍØK>à²7øŠ+»öúiƒšNY p¬¦wÝøDT¥í }»c_{œödƒŠNÙúZ8×=N¥­µs‡¾Æqn0½Ø…Ôv@.ð©:yµŽÌ]ÙEÕä,HîZ;Úá³çC ]OiÄ—vø”*k•¥#>y3…nu|gbWÛ€Boð›)‚"Ø+„À„Û»VÇŽvøì¹z·žêˆ¯îðí"F;µ£pÄ'kÜ«PpÚ.··7 Ð‹«}X…`› ;úoYzZ7з;Z÷øì¹z·žÖßÚákTY+èÈññ=DzåE?îÆÔ–aÔeUEÙ º cn7µNÖ=&}¨Á˜Î2Œwô · £íÉ•Nü“Hw”‹e‹ê¾€\Ðçäî?Î^¡ׄs¼Ö5ÁÚµo5töÈì1r]ÂÖO±…›’Ôű›xD¦Ñ*ñ6ê}ì`|Ó5¨Ç›J©Í«iQÁR›çcmv}tß}÷ŒÁøz±ÖGðÔ O£Ea­ÜÇ8ž6µvÎr#ÑÅ@©¸½š"å—oI‹Í´G¡™†>µUûÉ{lö˜“:­Ÿ4bK=6£©k5ôSŽØä²<Ýå.¶Ü90ŒsêÓÈ1åç]xÙ™«Ø·:ô³ÃfP««¬Ÿ8b‹{lB“µê¨Ö´ørÄ&‹ØNÔ.K·Eu@¥VÙZ«Ñ¡Ì¯µ§C§hk•å=>{®ugÉfÚ-ºù³ÿ¶,B£ªo5vTŽøÌWNýn žÀmÜò.Ü%´qoÓ¶ø6nmåÇ~ü›=¶qGþðÛ°=aöfÊ„mØÖjì(ñ‰·¼˜¹Yß=Lìæ¥š?*–õRÍkݬï¥ECZ›c/=.{J`Ínný¨eÝpuÖw£GÛ4Š[/øچlFi÷®Ï”pÿeY¬ó‚ Ç‹YÀò•u¯™É­Å¡‡‹>¢ *§¹¶>êKí°(ÒÂ=¸v‹Ww¹¢ ¨äè¬sÍEgté¢èŒÈ­Õ¡Ÿ=6}¬%,×úÉ#¶¼Ã¦4Y«uìg[—“þMÄÜÀU3dò²ÎEÓ1IÃÜ  ù®Ü"Sš$úñ6}¬‹æÉr Øí±Å[£ik5ô3Ž­ €è2ï dÉ!/NÎ~ß ’‡^,2ôvXômícÝcé J‡µzˆ,œW)ûé"˜ŒíÜrËñ#Lò‹Ýå÷fp\:ľ;¼Ç£ÏLCŽ­?àé—kS†>Ê˯–N!׺èE4Œp$=›‹Ã-h“ä­uíûky†_«ÑÚ”¡²ÇÃÏl0~Që# xÂвµû8àÑ|½x"1–¯o°_†ïÎòÆgìg«ÇôûkyHßË¡mÂØIØc⇌ԟ·^â€)ö˜”šÖæÐÉ“ì­Z_º$Rk%©ì£4édõ”.ļlÖ»mwúYöØì1jhëg±õÁþFS×jèDZqâÌÖ±ÛìÇÆÎªoÊ@B >nÁ<ã o*EÛ„±“°Ç¤5Û{­·ì1¹ÍllÔlm†Nâ“]§ÍÞ|‡w°×ÕmP”!VùC.΢¼.¶Z†¼Vç"ãZº]»±¯eÀiO6h\×s×Õz@¹ö(i­»G¹ x•,!3Ìfî€|ÈÛÙ†8!giõЖDäôö°­Uû){lö˜¥¸õFl¡Çf4u­†~êÛwŠQÞn]Ÿ_jÐÅrB™ÏòÐR8Ùšt©ž,ÇûvíŽ]íQÚ“ ÚRBÚ—;àt{œBZkV]£lÜ‚JkéJ®: ßj¸®–ï0/ÝYN$wÕPÎò&[«¡7`ÓÇo£Ýú)#¶.ʲÑd­Ö±Ÿql6è¬Å{(ç±)7X±R›*j„1Ô×(ëïó¹ˆ:jmÊÐGÙãÑg &¥6ÚG]öxj'UFK×fßG=â÷_Óݱs‚7˜ø®An:p–ëî0}]ØÚø¡¿Ç£Ï,Y!¤ö‘<©(-[›}áˆGÝ9 èºÃLŒC0m .Aw̤)1ûn6?¯k³ïÃïñè3“R"ëà x\‡Çh±6aè#ñ°Ü¦c€²ƒ19í”9”xn Ìqè#‡Œil}ÔO’h´X›4ô‘îPr|gå£]¥ÃÔ …EÍš–†G|d­ ÀAR­Ë5b6}/Ý÷Ü=#0MY·>òˆ¨Ë{oät­v݆ÕäW}ÍÔÆÛ`&{ìXr_äjÑ+´7¹R7¤µY‡>Ö=}Æ`vKúð¿['BËÖf߇?âÑjí)|Ûý|2_6Xô]&+öU?ç£bßfìã`rw0¦­õáÔ`R—Ðz)¦­hf£¦µ:‰GL<Û·­½Ïo0sÓ5ökN—Óøpï˜9!wmö}ä=}Æ`â›[nÀÓ»øF‹µ)C切çTïêgõà ¶êÙ}ÿOÒ—Þà6Fý½Õi½½k3ö±Ã£ÏLÎßX~Àãwx„kS†>ʧN´è/wAŒÆ[ ×¹Ê;ˆx1Eu*sÁà‚„®µ‰CqGŸ1ÿÛú(žÎk´lmö}¤#g+ÂË-EÔ$ÁcyÆ•ÆVñ×"¶ÒóÖâÐCEQPÑOë£ì±”‹Ò!-ÜØƒ;`ÁwzqúÙõ/ý7/Þû›WŸ>½ùø^¾ß¼ùÃÛ÷ ùÅùç¿{ÿþÕí›oÏ 9»/NØ™d† 9ú?êú‡NE;=ýOå¯ÿƒþü7þåο>ÿË¿.çoþO¿…<žõesèã+¶»¿ ÿQô_"ó›ÿîüœ{ø{ü/Í/n™Å«*°+.r$æÊ8¨îäÚ%8<âÁ8ã9gcѯ_µv_ìˆ÷sñ "^Lc÷RÙW~£›G^‹_ùˆWðÂ7 ö{8‹Vã÷£¶GíëjŠ ßp… ±Gq©RaÁþÒd#UÑdÏv$Û¼ÿ—ßá±FÜíO†¸Gñó!ÀÔ;¾Š`­xí ù©.§€—."r6Ý„W¡ÉÔã~·ö—N½´Û 4s'í«šÎŽhò{:¢ñ2²ŽÏúª{Ô¾ 7ô›ñÊUVÆÔóÙ*Èh²g;’wB°wû“!îQü|H,eÅ­ßxM ¿´vß4¯ú[ù+ˆjY¶?ºaDGA£%®ìkÕõâtÀ+ZìfÜ6h,4a—=gÌãe&_”±ú˜²½Ø’”löÞ#fµ« ­»¹oTÝþ¨z ïZøµà†LL¾þ‘ìÅz=ÉŸÚ"—ƒý6Õ8¶Öþ:(ƒmÖñVÓnÖÛW¥W u4‡¥'noÇaïw,¶¯Â û¦¬²G•“ÔoÇfCj?¦=›;’w“¿wû“!îQüü¬…_‚ÒÖ;¶¿têËr(ŸNÚW%:ÇÑyí‰î5LY꣛îä¶qÇg{tÓŸ ©ýXö|îHÞ ÁFÜíO†¸Gñó³LYõjúÕtýö×A;íÀ°ìì@–ØÎnD‹Ý¢õv ‚Ôš²GíëÒ›Z¶ÈìQ]ƒxy¤?˜Z 2šìÙŽäÑTJn2Ä=ŠŸŸ¥ dÕ«¨SJ÷×A;í@‚öÕïí%•ä»#ºW›©enÊ´3µŒWMó6µÜñÙ*ÈhêüL6ân2Ä=ŠŸŸeȪW;þOÌ¿öÇA7í@ÍÅ´¯yoÅ@žÙŠÑ?:;P!bVµçlmW[˜j>eµ¸ôÞâRP#fÙ[\]vEí@¥áö'@Õc8ø¹v Î9_pnš~ûë  Žv Îzûš÷v‹’JâÜÝk¼ÍÔ²G7ÝÙ™ZM±¦—©ßŽÍ†Ô~L{6w$v`7û? âÅÏÏ‚²˜”¶Þq!hûK§¾,G!0CÅÒ°eO´Ù-J*Ù-Ñ}øc3µìÑ-Ò™Z-ÊRv|FQÖÆgCj?–=Ÿ;’G;°‚ŸqâççÆõµô×bª¾ýqÐ G+°ìŒ@VYÑâ‚-úWo*È”£ÛÙY¥7³‚\Ý”:ô*õV–‚š¥÷J7rGP©¸ýIö(>~nPgžþZLÝ·? áhú•åg›¥¢t¢òa£¸€lÆ•=Ú")m¥\j ÑëÆà†R@Ív’G7rG«¯›ùÿÿ {ß?^Û›òºíÌ™ÝÑ4XØÅ$ÛW ˆ»]L²ô!ɰ¤ïé»8ú.‚j¸¨|îâ§ß.wh%ÙFÙB(q·ñ6œi7Êö5î7^‹/ý0mÃWšö¨}]{[¡í,i7Öäm°—Íh^ûÁ¶PAÜm0†Õ¾+MíkÜo0:ž¼öƒíûØöD{Ô¾®ýžØÂ)e7Øän°i+x½µ ¶¹ÄuçP7ÿ˾§Nµ¨JKˬ¦S»¨JÛÍ×~ h‘Ù¼ ç] ¨YtÕ¬„.4ˆñ½›2¼»m°Íõ«;DZ…ŸÖÝ`Û׺W#:ä&Öƒ:¶ cÝ Ö¾¦^íÙ#ÍMn†Á[½ÂQi”f7‡óÛ¾ú½ÂQ—·ô¾oØsS8í¹]Àf窛«çUátŽúcÖ Ìñm”ÍV÷;…Óp¦Ý(ÛW¿W8xXúaö}l ǵ¯K¯pš?“vcÝH~¬Xæµl³IýNáôš±lûê÷ GÇ“×~°½†ÞŽ=º)ÎNá4­ZvƒÝH~‚ÂÑåÝ+‹ú-{ó½};…cæ{‹ÿ-¦p:ó½ïcS8-wq‡¼ó8šÕÙuÇ#N7ØfyäÂé5c7Øö5'¦~°½†ÞNóuk?Xû¶ìΦ‚ƒ½ÔRs¬WLÎ*—wš}-;µÔü{6¨Zê ´°)¶¦–Ús½ÑÛ’öÐRzKò‘VP7Â~PÓ:Š2õ#´oÍîõ»¢ãpPI 2Õîv*©ôÉ<ž´çFî, n ÍÅPÓ8‚Ô¾–:2jÛ³ÁÔQ7ÐÞ,ÞÔ‘=ÚlÖN™_vÝȵ>µÉOjüçxµ†ÊÿË'nùŰüoN§§T%õýݶïڣĆöXv0yî«¡«`RïeÿPf~ç+ð½<É%„\½µã 8Þl=€µ»Plìd„[/#\»±ŸÇnF¸}á¤uCF50Þ‡H‚øU×úÎëEÖ2Ë1Iw%ùä ’¼×D‡·1ñظªDÖ×WLæÖïž¼Ý ÐQï¿ÝƒwçœF~Ç<^ç¢ë7ÙÛRÀñàEcµ.„Ô[ÑÑ-¹§•«çÓŽ «Öá÷ eÑ?7aÄèã¸F¢Œ[û–·™ì¿Ý‡©g˜#ã$‚O.è[Ò=4àÊš¯¦¥È†]ååTÈð{¿ÒŽür½’w œlŒ; ˜óHãqm vÏ tËö*áöÞî„m(À%A¾u±.' ;$Ñ¶Ì r‡×:¼fj(Ž „¼cìdœGòÈ'æ¬/HîˆÞ#Ü"m½NZ.PÖþ«ÝÓ#Vïp¸ /«õ{^ø5®‹Øƒx£M¯t%uÁ–[·„xQÆÚ«>'b­”k=AG‚cš(À=QQW®`f1±¦k¢A jÉšìUŒ _·ýLíôc0½ÓSlýì`BÚnøG&MX©vC›èµ‰ö3b»Çqn|Zí}Uk³©ìFNVŸ:5Ò‹Ÿé‘ÝŒ©"é;ãçŒ{¶#{¢ªf MÕK÷ ­Ä¾ƒõtØ£=½ãXGuÕ3 ¤ þi{rë}üŠ45aäßÞ1Ì;ìÙŽk3Et·BíGcOîF8g|”UÝ[EKûvTSwi…þ‰ã ÊÛ’8óÑÞÊÖ”,Zv%¡v˜ø¸S+&½òé1i9Ò;ÓuÖ½ŠüWGº»BÛÞÜ«Y¦ÝÀL9ô#3ÒÃDeQÙ1åȺÉ@ìÁn¸3M9Ó¨ÞîÙq¬¯¼ÅlÚ‰V+l9A&þ4aËí]ÊõLé͆ñ¨¶™Žæ$t lÏv|6;QSZv0£¹{v&½Bë•úT})¬ÇcÏÎ`wZ-MÓFüí š1²=Û1|ª•îÑÅý`ìÙÝúöͼÝN£ô°ÀL±.{ÐEê¥ï÷ñÖ¬*MÜi@ôWó!‘ œiÉ¡±Íä²g\ƒu<™pnBÜØÛ7ùœª©zÞÌ4áLcš¦ê‡iDõŒz·¼ôOĈž Ö1mÆÛ1c#'/sFÇ¡ßvÚ©ÁL‹Mµ.ºþYû½gÒŒúÙ(gSóÝ„s·wôy_k§4fÚSaýLÌfl§=/ ™ŠêxªÊîÑßÉÂŒë#ÞmK^ŒîX‘c@ôÖ´T—XYοÕU*µš‰S›“Æ¿âfñü—ÓÁgº=ÍÜÁ»}ÆûcAÇ€ÑÝQ¥ÝÑû½¬²G–Ä|Ðå“í%ÀÚ>^Ék„¹Ç³»öÑüU×_žQ¿¸pû&Þá=>ä¡Iàhâ³ý~7µ6Ä ½*·<ÃoKÞŒÜj Q6ýêtðo;ýБ2‹ÑL"+÷Ä_p)gžçÑ?Õá›$Ã6ß.Y/¿:ÍçÛÓÔÊžØâ3×ãnå¨Å$¶13ìuØ 8‡b02ë"€­ݱ«=ØIÀhˆ÷+à!_aæSÜç{<͘E=fŽÂï÷Ü¡@ä+a±Àj?§½ Lƒ2³€Æ$"0sÎïsâòc¦þÎÄ/Rˆ™Àט‰2¨ò¯ Ý2šÁþ(ª<ÔŒí—@I˜XH;jbÞc¶>àîNœâ™ÅhsÏ -¯:½¨ ì§Þ4C3µlä‘ÖgŸyÈñ›9ˆ÷9’Y³3«wf²¿1p™ ]ÃÛÓÜE»Ï•{ÈšœZ÷X§;Ÿ}⺂ OÍï¦I~7}qvxïNMü/®FÃ-è?Üé)YÞ±×Û¦ëʹªÏ5és4q½ùjè@ìµg´#ê$=•ïäv‹Q¦0O’¼hÏ•ÔÈdO~5é­3\ï^„\#ïŽd¬Ç‰—ßÞ둎ým„\Æ{¾É¡1PÏ`õHMÝ&¼Þû óý„ûcs?M¸Ÿ&ÜîÇ ÷ÇþËýtä~šp?N¸ÜOsîç ÷ó„ûiÂý4áþØßÅܯî× ÷Ë„ûeÂý±¿Çr¿¹_'Ü/î—#÷ëœûxßQñ,3Í3S=3Ý3öØP)dÐÏ‚!3_¼—ÜÏ£vt4{É}ÈúEfŽk/¹ŸGm“³4“܇ŒÅ™£}èñ ¹ŸGñèÞõ’«¸÷Áö»¸3,iòyÂÛ“gä6«`|ȽÚ ŸGðè<ôò»£-Ížùƒ3wdg2|ÁMàzŠ·¿§®ÎHžyP‡>†ÃD?XÃDKy”¹0ÇÀJ¯Ç ¸ù9ǸÊуE˜ ðþˆ$Ì‘ä#’‡GBúi/Q ßðêïºnœ xlÓèÊW®Òü6qXÂUXÈÆ|Ö¯òÕºlCYvö¿Hœðó»Ëå,®D@Y'rvÙY{~“³Ö£L^,D_ë>Éa¡žØ}{ÚÄǾ÷ Ûà]Í1Ý/Êc›‘ÊÝ0ÉCÃ7‘Dã¡7?#·¼Ççû90˜MsW¤V7>Ìø2¶it©Ù÷$ù+¿¤ûE~l3;›€GðÓ›è> E½Õ†¶ÒYYáýã›H¶e²Mn lJ¼'wlcÿNŸµ…:¶ºäîþ±É@é~(d£¢{ªTÔÞn ›æì®–Òià)O†6F”J›~ÝIäÐ$Vú‰&ý>ÉÛ „Nÿ>Žûþc7šQ¼n;˜Qȃ]6†øZÂn”c£F˜rª#=7ÇF ã=“6¶9P;Y0`¨©žÉº6†œ_Nº„ÕÂú;‡f¶Ø³¦jì{o¶¬áÃNã&æÄØ@Í{Þ¶ØÇØf¤sËhµlÊé1kr¤¤·Yl ˜="ŽƒÝÿÞÌZ§ÕÍͳ±$òüÒõÜÃTMxø3e™î„Œo'‹îy¾-ƒÙ”‰!bTgôôî4’DhŽÄÐÀ,û$wls qÆ •ƒð™[—Ÿîç ÁtšÍ Gžìov‚ ÖÔÛ¨íq—xïé›1ý –ÉQ [L¶mUt’í T“BƒÙï ߺ6]ÛS<¶id‰¤­†±Z÷ÈúØd$sÊÓl“ƒ JåOWTÀ< Ço/'Ú“ÛY&6ÍfuHÿ~ì~7ó@%lb- - Í]R¾ÿ} mÂì'#OÛ?FaêM‘fC©•¡zÜ ‘mtûÍPÞÌlƒ±Mo—ͦgÿûÀÉŠx‚õAÿrë±ÒgÏ÷á¢Ö§ZfS;ö½·R Ö,ÀýÜ‚8´Q|Ö‡í²=ž±ÍHë8žG²ÓPö:í)&M?­OÕåf²ŽkÆ6Öï8ë܈Ûˆc=,»þ÷¿(œ0þ æÍD&í~‡Õns‰Ûe‡(L/“­O³TÙz1 ª…zz÷ š©¡¢63=Æ6f¾Ü'öc›™ÃPžhâÅñ¢ØÁHqoãØ\› c(fœÛX&iS·el£øî“ú±ÍHëlž`ï\¢+ó–8ßnꂾ&—­Oð.˜lùpVï=Éc›f}¨àͬ‘CµhîYc“‘Ôq8O3z&šÒlFßND›h¬ž~*¬Cl³j Á”+C›Ôîªc™›'C‹Þ’¾KúÇ6Î?Ázê†3ÊWoµÀ¦š8MÝ›Ôrld§fvÊØ¦˜Þ5ec›±“Ó‡úÅ÷w§.õ¨4ɲۙ±néÃ03%Æ6ª>îœcÙ{­‡e×ÿþ·¾Fûw‘žuO‰è/» Dˆ²­Áúžmxc›FOgäìɱMgšÜ59c›=¥Û(ž¦èžÊ=}|éuœPdÚËzž)ä±Ó…½å3´èCVwMÐØfGe£ÿ‰šm·Gš—NšLYµ…b­Õبԧ8M3¶éó’wMÑØf µ £ã_»$h³;X’~Äd÷#M½ŠíCûNf?> ûÝ鎤áòõŸ‘˳9iøÄáž¶»Òìw±è>:ïJ³_¿Wv>?ýÈàÐ^!8cÖµ³s¨“¹}tûñ¡ÖïNÓ¬ßôOMÇÝ;SáÊ}ÔÝ•&H┼òcCaYj“¹{t~ù±‘ÑïNóçSò矑v¼WpÁ—{ÓûóTöRý£%5Ÿ¸@ÕÌ2ŠOÉm>%üÖoc»¤Òcó·OÎùÜ+6aͤÍ7÷ ²¢­ø%­ùÿ1êºgßSò›O ¥u;Yþ± ܧ¥q.š¹ÇpçNç[üçÊý•¥|J¬ã5™×§$+ë·ºû£³±ONo]²Ë]—»óijÝÿ‰ÿÑòaOˆ_<Åéã~OÉ=% Õït»ÔÂr€Ÿò¿h»»„?÷Ñw—%ðPªìGÉa=!”ó¬gÍSòXO ëu[Yþ ɺ§å/Úå/aÍ}ÔݵË?$Õ?V†é)a¬;¦æ)Y¤Ç-ûݨÇþ”TÙS3 ü½™ºùVü€dÞq²(âû7÷áýo>¾}ÿéíû?|ù¥€ùÀQÿÃéïþŒ_Šüróñ‡ïÿhý´£G Ť/NËùšþÿŸþrúá´;_4?]Äg‹¾Ì¥ø«„ݲDbrà÷~™sõp¨ýýjÍx».­¯ö]Ün}¼?!·ƒ|¢¾$ʵœ¬AªÔ©ý =,¸Z™öyê˜fÅ/‘‰¸ðµÈ Æö:«\Èû¿C(Ú’Ãäx­QÛRÿöxRTl“ ¢Z½>Ž7èãx+BÒÇ ž¶MuU`@˜x:€g'ˆÆß\üôüíëOo?¼õñ¯ç_èç¸nºä”¾8ÿÍןHþpþùÍÍõë×?ÜþöçWhúÅù¿RÃÿƒþŸ©X¯ÖÂÁŒÍ/U™³¢Ð´(˜8©°jƒs«WXÇšuq:¶U®p(AÛnÃp9[§4±AǶäíyšðCSO³ªÀè¬Óþ‘7þª$“ÏïGèFqX«ÐF‹ØU%Ø×¸¤E¹À·„?Ó6’×’¶Ä:ëuOÀ:‘JŸcÿGÀy±9)åqŽÎ¤Úm³©«Ëçüútªôb†s8Âf³žƒ³WmYjµEVk¹±h»$›„5ñaQÆ’¨šØ£ÿÿ‚³Ñ™ÈÁë“ItÙ¤Üev¹1Ö76Oc·U–u¼Ù­õ?|hÕX¬ÏWúkm Â%ïê–tŠÜÊ‚Tœ˜4 /vÐ'ïuÞh//¸W`‚ oÂUq¬-€+YQØÁ]&S¥‘Ú²ˆ¨ƒU$'#©×¦ßÓUjdïL•g›çÅ {+ a.Ò+{ËBŸ±á ÉžÎO’ÕÂà\ë³Q½>ï¹èE€>†ØD7E_„Ú¼l3 b³]¶‚•²5­¢os­ürü,@U)VÖ—®kpÊØiÖÁ†ß-mãZjäh ‹m/*> Œ™ÞöBí–êš(/:[ÄÕŒ{úÑĆEɶþ‹Ó>×pµ¬Eu3âûóÁ³¢"k "÷ÏÜ4’L·Ãe`.i¿Ìh禭<è2«¸ÙQøHràbÔ~ƒKÚÖ/Å ÖnQ ¹^E€!-6„,‹ ŽŒ…»L-+ î`±ÑÖµäÖÁªúŽæß¹¬Ã kV iN!‹¶œš²¶„ÝôL¹˜Ô"Y ~Õ¶É›¦b wÊïu.Y …òÒl¯Ù)Ù`ðÙ€¥wÇèbõÊöè·¶ºa͔ƞ,ÚµbÛ:ÎØW£`,Q½[a%­­]UûÏ6\oø5§<øUy&¸h߬D—WqF\y³tNtª DfåFíå&è1¨*'°I…LJ¥hÛÖÆÞœ˜’Éiqë@Õ>åâµmm¸,£]Ã[Â˪šÔ…f¥Vò·²µM9jÛ%;¯ÀƒŽuÎ’HDW¬­h-’ÅY Ù’¸Fod­*!Ž \jk›‹-áeÖ¦…Ö"› É 2„Õ(ðyUj}Ý(ÈMp!ÍFK¦…úÕq%k›Åº ”¦’‰PC¿ø 3“k6R]®¦AÒ6¨9ú°DSm45Ú6ƤPÓ¨À¼)Ipë 뀶;™®Ô­1µƒ$xU^ÍDÛÕ„‹ VcÖ6ßð bcÖ ÕÆUó †w ÁÒİC¦–R/†±“cÄ«íùlò¢Ýœ/R²3Í”yu1{ŠÀ<¼mg _c¶tR²h m{­ÔÅÙ˜œÒY¸¤\Yâ«“® Ú³Ws€À99Ťmi9ZÛ(ökÎÌâ6|çuíúU`4Sž}g®5w–që@·|²Yd{WscrªÑ€Ñ66väqȳq6/­uїزiMö‹Ù8S{;i.ÝFëºEªt%ÀM½ºd8ÉAf !°Ñ`®  ÅùµmõÎvgõ±Ö¹©·".½¯á€l•ÛV%½–Ö6«Ÿ ²›a`5³àµ.jÒ,eÍæ©ëÆì²åÂ"ûútWÓiŸwâŸÐ:Õ0Î’vñÒ”6³b×T€›Ñ“ªIüêe·?µdã6Yæ‹e ÜMÀdº¦{‚{f®>Ý)ˆS‘½C¼©ßXt-™oCC®šõ—‰Ù‚‰&A&œ¦i‘í,“2ïÌ“ÖuI%ÉhcQ I†BÄZ &ƒŒyh4‹¨íDz]ôND,KÆ•Dÿr±šw’aõ{n¢?³¨¼ØMf!“p-A#“u±!d²4Š˜’^H°Ê ÐHfáÖê~¬¡MfbQä«sŒ¼@†ÌöW$ض;Ädþ"õH¾¯ / nv$ĉ“ðº/âRO¥êó­ã(¼0'&Yö¶o”E”*€¨Æ-ŠÉJ{"?Ú±‘$»K=,P¸£2Iˆ(&3ÖKļ¨}Ácy66ó&zêÛ€0s²åÈL<’(^|ð$+²SÌË# J ‚ç룴WgÞZ,J ¨xËeM¶?ÒóëšDƒ„æí}Øól±{·(8ª‰ˆµı%„`Ë§Š·À@o&VÅ›. ì“íæEäÉbÞj২VÚ Ûö¶H,•ÀÁÌ‘Iç:»Å((â|x¯jWv€ \±ªtƒók©HkÐN×4ŠÁf×¶Ac¨K `(¬‚@ì"Ê{$µe-y3RBë –d6^ ì§"de]“Uæf!5–¼˜1U¼ÓÑ.¾YX){ äˆõ¥8°¬&žG&JÃ#!sUÈÕ·8­y}aѪAZ‘bd¬U›¥»˜…÷)Jm/ÃÀV5HZ5 €fù8 Ð[ ÁÉûTµ_8aTÍÊ|Qÿe1ÍŠøRmfÖB,p 638a¬Û|¸Å,:èLœuª±fÑ}Àq~Ù"o!X4­ˆg v—×§»ÚÞÕëL©ŽkÆ"ÌIÊSnñ|¼ÕâY´P,xÈJk1_aiŽ ì”"ˆ\Ú° ! W‹>.“(RÓ¡Tq¢ÐÆ/9úhvu•Ûs¥w+aKÒŠÙöx¡çZœ5£Pø”Fi¨¹MàU÷Ívˆ…úZ¶Úý:l¿%ß:Ñ®–̢ݙÓÌá^¬sŠjÁ7&¦jû\ÑiÄm‹Þ¢ÙgÿQÛúÅŒ3ºpïÂ/®½‡ß-r°ÄØ­­»²8¸K‹ÆñKQsÞ:h¶™N6DTþùG‹Ö@×!𢾗¥0¡Ø¼…*Ö¥9ÚAÓµåÎ=Ph®‰¶åôŽ^"^Ù7ÅšÈ÷2?™-Fs´·À ×KpuÍŽIM Cxýã°çw’Ý~ñþÛ]nûâ”÷Ù=9éÅÉ|¹è—™Ì Z'²#ô«=4ó‹°³&¶ãÒžÔ,·¾ÚåOÜÙÚ‹ÄŒ“dZn¼¯Fë=‡| ÈÑ/±dï ºì¸E j´~WŽ80p‘.µñÿeìÝVm[’í°/¨X/[°6y¿OsTˆ[Æ£#q"R[ëÇÛfgû3 ãx~jM‘•§ôiÈazü6 €G Õ)Æfí~Ä¡Ú"é9œä)¼Y1Ã#ú¶S„ãÛ6Œ÷©E‚O¶V[8ì°î B(Q&Ü\eölIÚ3z-ÍX27Š\æžu@Ãã±ÑóÒãÒl{ädtç9`ø[­-V‚ùÜiŸVΤ]¾ƒ;Õ®tÎäÆ×ê§.T¬á+¡­„5ôûçÇñc-€ÂU&v:l/ÎBá‚_ÍÅ;c¾ÜLzàÃR]3lµpÿÄò(™B×ÒBX×V» Á´€ž<ø:¬°§¥Õp†l­ƒ§õÄ6U`>´ÒÔˆcãx(¦fÄ´èô»õÍuÿ2Œ…~ß î<²ð XŠ$…3Æ{VwàžâaíÄT2qZOAŽ85B¸JÌZ—Ø~ÿÔuñlܸO‹/"j.ÓD¥±ÑÄÊÞUľ¾c‚“”ЬàMÄô\‘=¼r-EPÈ…æßŧP”}Ú P@WÇÊóköh=h¡Ê”£Gû‡@•>¸g<ëAÔÂ7ae-Í¢Ò(ø÷E<ÞOÏ#æÍƪ'\ÙìçOŠ[†úâι‡Ä›O#~åMd Íuý¶ÝóÂ4 Ã™"ñwÞç‘ϸºJ@ïì Âyë-ìýã]³çH:È0ÈòHzn?Í»óì)uÑjÔÛ³ç×g»):GöSå*hÁ#óÑà ^ûu.å>&ÎV¿}?wÅh?›sßbòºÑ¶‚YÀõù}Rp¾¯®Ñ××ñ¤©¡aûî÷<Ü€Oqç¡P9øæÍÆÕcþøÎ“¢. ‹¬‡Ý‡ß{ì)DìË\Ìsþâ¤A·Ò‚‡zŒÎC-lÒ…XE<óÊÃ;ë÷3P'Ë@Y1CÏ*ôN±öùJƒ·Øƒkã>Ïs=¨±m-Ð7[-¸Ž´³Sù)’*ÎeÀ±ëŽ÷ÌôÚ130ø‘’ÍH àU&œ¹²¯ÂºhÀÊ>µ!ºÜÖOa[Ÿµè±é3.q÷4ô¸u{Uiˆ¨+Ù‡z>‰øýˆˆGHá´îf%…ãßJÝ ö Æt9Lœ¡H¶z@<° ‡ô‰wDŒ Ï܉Óå6 ö̸:BHÅ·KA5!¾5 Žo?‡¾fÌÝê±ú£[9ü¸ÁJmsq%îÇÅD»ºìL¬¡A×6Ì8K¾ñž°¨ÖšgÇÁfµ/XZÝ —{¤Ñ·Lº€±O™t¼šÛSH\ês Vj›½É!Á¹­>5ßæ˜ ûÒŒån1†ë×3„qÑZ«ZBÏË)ÞŒßÍR8b ‹…´±¸“Eö¹ºLÉâ:.½l®¯Ð½L˜÷äú $ÉkxÑ—p¦Ç÷ àd]Œ[Â0÷“{¼”ÉgdúíɬӴxAˆ±mÜÓÌl`õßOÆõloœÍ‚•k½ýñöŽî×1s)p Ôýànó°V¦îGü~R€)„‹A-íó¨U¢µ¥'nú,ý·WŒèŸCl€ªM2DO*,S‚ÃáåηÁWí>–\õme2–ÙÍgÀ³éh¶È‚¦ ‹ #cà^ ñ$0›°á–‹.Œ¡!ûÚ/.³%S{Gÿb¸#Mÿ4{õÁ§q™˜3#–‰¡ó £‰¸ò^Zåëº|E¦’¦|,å"Mõºî#ò­q©ÔÞLدËtðô›‰7"¼v òF¬*ÆP¸Åc£ԕèe´»±˜üÀ³UûÍv˺¨‘B:¼ÌÅhÉ,Ê4$¥{Î#¿ ¹OÝ’5tQ 2ýë³Èý¶ñl ;·™Ÿ±ò€¶FqÊŸ\þü¸ƒR 3É„CW­s¢ÓYæ 0G€:U N-÷'ÅlZID=6‘V²ÖÄÚß^ˆÑ¢¡'ƒ!‡qîÂ1/µf¯soÞ¹Ò»HÔ±]*›3ëj“îÅ£È~WËêÖ'têj£S I6n\žeò,d8ÖÔ]¹i50]¨r¢)±Õ<¿eàÙÚ ^æCî°õ™úý·}‡Дí^ßyŸ÷­§¶BéHÖˆ›°ðHèǟ׹{5?Ì×¾õÀΊõ/ÞŠ™ë´a'ý'Ä}& ²¬*æ5¨¥Ä½Ô RÙ÷w¤z”VÕ¦z GÄÌØ››®H€ë­Ççm“Cssä\劬ØVŠŠû éÛó{ð§{xµnuOxÑm‡Q³ÄªÂ.À0l–îÒ þø¤+3ÏVù½¡<;Û'Õ§|üSX¯qwÐóÃG²clº=‹ôRzàU°ëйúdØ£3õoÖÄb`EZWÛÁ®Ê÷˜Ýó€üšÍ\hò˜Ÿ‡ °ƒh wûÚçÒ£Õи£Ê·e‚÷¥…"{uw´ênÙsO´Û’\VÔî[ü JC¢vu>»ÖÁfbLƒU´no„™2€}ëÏ‘ö>Ÿg·`µ™2û¬†o†{•ÊE•Õk&’æ¡M(IÃ=馶Øîß;5LÔµ–7–•#Ø5Üù&q1”­\”.`㨵Sx7¿¶‹±¨ÏÛ¥O„ù†âsÕe9ÂŒ= Ƶ9‹²ÖžMl´mxó¸ ^Ûe 7ѹnëÐìOˆáœœ5ôHÃÑdBÀskŠ› 1ujÂ5 ök!žŽG &üÒè·p§…Agœ|BÌÀþ$ï‰ ±,&RBûÂ6PâDÆy¼ÝCý¦‚AIö#å Uè†s?lD%çê®üÝù9¢9%ÛV"¾ðõ÷/ïÇÔ4{%,"kø“RŒOWZX:€À.o•aÃSŠÜ¡CdvLs¢»Ë„BPÍjßK8s©Þæ17”äqI ÎgKdzDCd›yJò'üYÁð8øËš^×Ç›œ®}k™,TÔ ÃY.¬ÊX ¨‘SœÍã$ù;È$žmJÇß›½€;æí·Å’”‰’ƒ=ä“➘„‡¾ '!WE !6¾ g:);ßÅ#Ó sƒ+äµµ,x¥‘^ºˆF¬@]¦øè· Mh±ÔÁ…ÆŸ½ðKw ÉmÛ•3 eXN¶Ôlꉯ$®ñ¬ 4éD«m³QO:tYaÚ±ãFcEù9¼ù®•¨-Á›àÏD­Ñ.vñ¦~—ÃÌó^áI )<®ñ¯D@ö5”VÀ uJŽœ)¤Xƒ'Œ¯w }(Ü…2°"o}P¹,ã†%"sö­@rÚt£-‹@½Vhªx:SH0kdÀ·¹ºŽ5Ô±=ÇMI6á@Š;ùåç׳À8ÊæÇÛ×S“®Êë“âÍˉþ¨â‹‘ž};þÏ:±CˆDùòì(°~}{Ñy·,ð|¾?(,¹‰‘µeÂ:ã[ðï—.˜îÐ_µªÛ¦ÃÌူbMLÄâÔ•!ëH0/1!|ªJü½pö,HHŠB|Öèô–×\ëçËžÑò P¤ðØÔ&Ü7N#KÅýÇ!þì9•`:Èj=د›6¦.Ñ?ä„R (–hȃ­œ ‹¥hBeZPÌQº¸ {-Èþ[ßèZÎ$cÑ ¿vŒ.‚vÄ j#¤D~4‰#Dvc´5bnbñŽ|‡l9é¤rC/uv°ÊLêƒöãÔ[&uîœÉÀ—=+zFi„‹QQãm€yo ,•Œ¥eüÀ'œv¡ã9J!¡£Oᘢû¤ÖàcÉÁ‚ø²=ZÄCH¤­o]ð䘟ßÓ™‘JxÀ/ž ‘ü½û\âQÙÓÞ,Éiœòñ«†àÝ¥ð_9‰DÆ'Yk#³“|zEæH·Žu ÙÆAýºŽ>´À¾­.°*4hG°' ¬ã„nSÂ]ÅÑ4Õ/„ãL §wö!ÜÛ=!•§np³æ“j’”9mBåápclHj“ÏåŸh Ä¼y6²H±<Ί–’Z¿ö€HŠHf}3ñ¶$ï8ÀF,l1‚„›ÇÇ88‡þçU̸Ýì‹CÉ(P%œËÇW),I4s'ðÒ[^ MYB3 ŸÃå5…5bLdLaES“£qIÒص$…Hj$ª0á”zr“;Ó1}j sËýpºµ‡yý®%ƒ`…oàâ gøMär¢ßgäå7‡Ö’?q ÂÄó…8Ö×|hÔ¡­L°YpÔ¥¸¸ÞžÂžHAG~ŸÔð·cþõZ¸ }Jí"Ì#ÙCjÄ¡O¿³ú¹·Øaìeá“p*’¤~û‚ói)àÞ0#â i#÷Ó ŠæßéÝáûº~m³©¯ï¿¢õ/{Cy?´åEª´EŽ<·^%Ƹ¤á·ªÄÓu``…“¹Ž­¡ùÁ;ÞK‹`g ¶Ä·Á-û8¡8`‘¸7hÄú¾apò”`¼ˆ&Àìb-×D. l5ÞNé5Ð{¸°Åë‘leOJx6°2O›®e¼¨[ }¦çè“®I¦(äÙS?ëxØq¾c35×j92¤É[rqùPMzþˆ íáUòÝ…Cû°I…-+lòYd};¾…‘jå›8Åa|”„•bzchŽK±Oþn´Þw?"/k„Èú©í¦Hޏ%CÀ‰‰Ÿjˆí'Ê=g†z$úŠàkK}ZtMÒR°¥] Œë¢TJñÏ•b’A8%Pöøu"ôŠ'[Ýâõèµu)p[ÂÑÏ"Ôé©€Ú«Âo¶ÊI5öè—×S¡ÂA,„8mœÂ…)‘&žduFX§N¯‹vG]aY_eö¬<Æ~…0‹åî³J$æ‡Æe ¢ mFºHéü‰Ô¯Žé&ÖÈG¦(Ôõû¤|¿$GÝ$)p?H")c·¾æ˜Š~UA嬳À¨ •°ªNÈ8L]¤‰½R†ê Í ìM¨ƒu^ù2RØ«È ÈIÊþè€ýØÁbcs(L÷É¢±gKšßVç¼°Jpÿº(à?l »…ã0sV.¡Pew™MàLпu¬…qÓô×áºr.qŒøJq׎C0®”‡§˜Øô®T,P¥Ûò@³/ÛdÝ>Y±\ g”‰ó1PX!Z| ^UeßÔN“hpV┨‘¶ÿÓmþ©!w7;Hb–8¨Aö¹€¤ÔC®qÛ°‰_‡'Ü9‘,^¥“Ô.`} Ð%pTuLÌòÚ/_á@¤7ðã¸BøókqØf}ÀúgƒKr†,n1ÞØïÜiwæ(Ы'§ìêkH°^ÀÓjð3F±û¬ÀøÇŠ[mUánt%®ÙèÔÂj'FÅæ^ 8Èo=¶ï³C»F4NÅ­ïš8ëKÞzQ ý<¨âYò¶!ÓB Ðüc€z5—Ã:;ð3Ä›‘ý=¹Œ˜“R¶ÒϽu Õ ÊN @9whýÜÀU©ÊöàaõÜBíÊe+fXO¦i¡<¼9æŠùCö©ò€?‘ÂgTæå«Ó»¦â©õv“M:!ü¦&cbá­¹ÃÊP*H ¤G™VÂ;Çv 3&¦r¸îÈA3„¡_î0‹zHUv~/u€ÙòÐç5ARI!Æ¥©ÔÉbPªÔ+ËÌæFj,À6ÞÄmØ€Ódz]e4ën/•E¤œ±‘µRJ ³|n„‡9¤‹šæ´±è‘APõÚÀæ-zȪTsý,^l'õ"/­VB{ÔX!øƒ$ÿ3ì¬8ýèiJ ,áÂü@G›P§ŒÓd±Ç20Z×IªVßmÑÀ}ª2ÝÒYþ´q@kÌýJ×qk"nâËYmÂJÓ‚æÕÚý‘IHjÖ@ã¤t.«ß°¸fé5ÊåÎ.-ß)‚Ó˜xˆ˜ÖÒRpd­“š™‹îÑB¸„ ›7'yÄžP*9ÑnŽ\²Ð_g>â£$%Ñ¢:‡6C#ï%ïÑ4£q»37Ž !-…çËaÞÜJu+W汇óH/°‚· P|f€ ]ù¹Â¦˜Ìy¾G'?`(‹‰ ï€?øX%–R?°ga‰ÅÖ ct8Ÿ]SÖ¨(EéwN3zø¡3j4ºòÅ´”¦RŒæþÄ"¬rLîO'Þl?¹“;0 ç€Þ+ ¥ñ¢+ЄHÔËÿƒ;L¹mDø€x-^NêMñqL8ÊbÚÌt3çìæ†*(x`>ñB%«Ê½e/SÂ,XÉÜÑ>ª,–ÊVWeº¬k;…ÌHm_‹ÏÖN“š‰jéÞù‹@-ow Á t]àùz-A~õÒ²Ž7ܬú¼èŒfæË1’]~ ×Y£³ihò0(•n+"Ú:âQiÅï-ñÃEÄ\ÊqÕŸs.eBíí…Ù–)G‚Tü!W«Ý˜ékAÝ#&јø\°Â«L›”µ‘OŠ>TŒ÷=¨ F¨páIÿc$8¥ˆƒ‡Põ¶«^,?‚°Óˆr=ùßãY$-¸¹¾‡tï{&?¥t±Âû͘% ªvœQ»³[uÑìæ9}ýKˆ=+K°¶M„þY-ö&^ ÆB§šKK:K¨Ïâã‚AB‘  ôÝèæíð’³ÆÄ¬ZVÜÏ,Å,¶HØ´Ä"4‹fÁ¤ôÙ·.O–‰ÉŸ×á§¶ä;†n0È}RFMÈs£w¦‰™=TÄj À:‰O4ÛhÓCI'¯÷:íVÿ}㈫HÜË›Øyè L/…Öx »+Å„]Þßìä5ñ s‚r€ç¢Ù.ÿIf…F]#„—p³ˆëõ*l€F¾9¬*Ÿ…:ÃÕ*õ“r˼fÚ”ŠÏkÁ úÆ„êkJˆ.ǃÏòÆïz·k´êÚì­VT‡Žß·KejåÊ@b¢4„Y• W? ÐWž.±± Ç*‚®v@Î+?ÄrÜUÀ®y± ºZ519 ºh JUG±w›ü“AóÈ5ïZp˜ ÿô8ìtP»¹¦¿l¶NìØR=j)_‹èš(Èðóq­Æ_t5Ë€z¨|…©‘ýÃýã^(zäHk`õ ÅD¢(³ÒÙ+È•ÈÛ«:Õð’Qù}Ò>ý *£fº·¬;ÌèWeæãO@+G¸'Ò](¿ªjÁ¦SÑÀGJ"~à‚"ËekCx¼$î¹þP·Hø.¬s¥Šl,ù¬ÍÅ"e^Ç™ ðI–~`ywQÙ#¹ÚNÊÍZPèp„÷o!i:'IÒºŽ´„PGœ(FWoçäÌ‹ÙP0ÄϽ,ÊÏ„e`eÂÚ2r±@b-óè®›•y«Žp6ÇsMÀøqCTÚáä©wë`<Õ9Oú8WÇæ°$VHœòe¤È2ÄMy¨XLÛ`¼°ÉvÓ’Ú*Ñ‹÷wâƒç€ZòT%V3áœDôŒ ns­ ÒÇQÚ]t‹U¢ÊŸ @ãö‘°}Àf¨{]W=)Ç÷D!øW©ªb"&DR¶ 'Ü<_×ëT""£¼RIfŒÂ€XDƒàÇ]Ñþu :øzY,e‰‹^”ÎØ¿¸{ Ûƒ@‹ÆÏ™'§õÀ3 3œTÏ:ì ¡.Dó|G7Ì®‚(%ðóÓ0C×åqö+|ºpJȤ÷#9Ø¢1$D-¦£ÈŽ9ÉëëÇzk«ZàiÕ÷? ðtì7„ 5ó,´þwÙp±Zí*ÓMt­5f€;}„py2ŠƒŒ“ò}Ý—Nä³Ú=d ÚÑ…7Û}¾ÍX 1xdØ.z‹B³#(D!f~œF>8ƒÅºör5`*ù#IemÏìNÑbBºP?é>U ¯1Øà   !(„¤´tæxÖÕ­"­Ur_7“Ä™æK?«2@g \)>ˆìü÷¸ØîÊžNžú:SÖu5°»õ.Ôj'AtìÝ¥4ç|ºÅ ZñQºŠXɰ>Tö6õ<^õÀR†8ˆ#yyj(kÔÚ†–ÉtöùPÎmjÀÿ5kœq²Æm ]ŠçbIIÖH´ŸÊ‘n‘TÂSG᪣üË òê³-„µy6³ÊD#©©õ–$Ã6É'¼áœiQèâ4›0¶#º'M££Èß5Id=HJæÃX˜¦Íãê,øEÜ®Ñ4 mã>¶H;ÖÊÿçúÂa6ÄX\d5»U„Æ`«Oce*•ò¾Î'ôðú³j. &åÐÔÖÐDç‘2¥ºô[ü¥æ£y ùcv"ÏüÞMÌ2ã¾›‚‡õãRwÓ?|]Þª.ãÆLÇž¨6d½]Õ¡\Å+Ι‰©¢Ôp}{í\6KxÀv0qïs wÂóÙÖ™SHÅg2æÛãRœÇSR¸ w0ƒYRx¦2ìc9Pÿ,¬!/G½¨7%²HÍ^qÚEO—Tr«ýŒTLxêtuyúÍê)õlÓ—tFÖM'ª¸miÖ—b¨t^IûÖÄÌöhaÁ¯„lü~¾m«:f‹È$}P@C8¼€Ðë—Tz+ÊÔöˆòÐc‹Gi¨þûª=Êin掮÷óv?D˜æFD¡Þ*ç» +ÎCNî#@š ¹¿˜õœÓûžÒ‡;Çüuá[•‰5þ$¤&¤H„ø—r²‰ó±·Ó:ߢ¯×Þ` pÑKûF®à0¾´VÃ…0xSžt…s""v7” u!7‚&516½¬»¦o¶ÊsäCéð–úÈIIÓ“”ŽvU„Py ©¹VúôÜ»Œ 5ütYA^#7'„d™9™TUɨÜÁÅcíg^{;•ɽ^Ë Àܧ/ã´jø¯ñ,TˆB*a“EÌÓé%ÔÁ˜ÊE\’¨Ûa89ì‹iÏÐvÆRðe耰À â3ÌìE2‚Î[¶UMí”2Ü£’ND ˜‹ÞUÄìW [†UW‹ÄïZd 8ùÙÀ©ÅäfÄñ2p{.ôGœ˜¥®òH‰SõBóÉÇnôbš†ûM•³ÖGSAk@z9zrdÊR 6@%µŠÙîDgל—Rl:dT3‰å@éòIʯÊ1!ÉjD9LÔk´{íY¢Ä!î¯S&™ž[ÄKg d–pP=‰£ÄªSÜ1唩Ï"\²¨:²¥2éÙmãˆaË.¢´V«ß‰Êáåf}8UK'ÊŠ€íRæk™«“EN£,9]ÃëÄäÀgLDþ&KUâ•KM\4àšŽ–±£,¬…¸„kAøŠ-Q"BÂ$Ž$hêÅïùû©dUPÅãW;FOt$÷7Èhm¯Ô½˜ßiÛäzrT…ú«›Ì9ýF`EŠrpmp„Ê¢v—ÏHìÍÇþ7@ÑATŸèTÎ*n@›ç§C2àa³íOžE“vÞ›Ž4x@ ÞÍÙ¨ù˜ðh•%QÆìŒ"›e’> !„·þpüdAy½Wtt¥žT!ò²8”ï£fÈ<»ã·y¨reUŽ•50YÏÇ5la –Îý¦8©Wdìã´l2;K„Û9=óšGPÒffD xfÚÈ>Ý[lMÂUÆæç!ÿÎMîC›rHktE`›Fí©ÀÞ5©¦5$ì½ãó•bηÝÁƒ§ êöûÈÁž`¾ÑÚ¬<” †•¡Ú:~ðǸ®Áa9‰>VÒSG]a<бMpjJ65á¿'±ß ….R“IUËãJ{wÈ?›eÕ¡¾)‚¶¸÷Kt˜OÓ,Ò÷ е©m©hõjZÂF`/ŠŽw&ŒjÜä Û\´´jœ,ü9kÕSšyJ§¨¢z| ©E—+'Ú*|£<=¸®ù¹[‡hÅ¡×uþ̺ÉꉓY»gÕœZ=y1m×µ^Íåº*Y1¥ÂóŒ7÷) &ySb'Å©¾/ßÊ•ÅÍ›«tb´ÑŒ)z’Lܹv˜×R’Ôæ*†à,€?= åu¨ð³RŽfêÔúzLmaÓís+­ Þ½›Ô³ˆ$¸œ‚-–?FçMÊ!¯¾ÈhÀ¼òr\a>.‹ë3£*QI*Išã6Ç—FÙ„±¢)€g'+»Ìz˜j[õ™Õ&uª¢l!«À9»RHPÐUWKU†‘t_p(«V„ÏÂKÔ©ôK9øå|fU¬pÒŒA`f Äÿ,bÍ3t9ú„Ü„WwÙÜ㚥m&v×çÒ1½D›)±@™°KÌ Y÷èb¨Ð§FÊÓºfÌQߌxYŸÅÙfË;@y3 hg»ë0ϸïä—È- ¡óÍ@)«„Ø"æ^¡Œ KdÛ¶…XŠj¼µä»åZ?jV©·V2"Cþæ&Û¾‘0´IWôx {$+ëy’s”.d‚ŸKxã÷gByí[•icbi45MX›Ž³v–,Å­ÞèéÌÄ·KE)YE†QNŽOr}+uÏ`Îðc•¸Ê£tŠ-[å`zwy_°¸`9̆‡AÆ ÖªhwŒ›1·ž=b ­ðÍg1sظ‚+}h¸CËA¹ËÇ·q̺]‹P v$Q4ë Íqrû¨5G!‘â«1îƒÓqÚéŒ(íWT§•<Ý‘“œ!% ü ~¢ãã_Ëáwº‡â³ä¬güŒœ \7Yõ±,¡Iñ’¾_|qL߳̃ÉÛ†çbiLв›IÀºÒT¯º ÄWº6QÏé£÷Jž.`Kgç,šLÇ U¬ßwiÜ cæÃñ*]jÉ2…v¦>kˆ@¸žodÛÐD£kY)—³q³·Ì͇¿@»èhòÇ”&·¬&ŠI wjoØ4 Þ­Âs»LÒ‚{F… nG-£"1—`^”ªù1§Ñ¨P‡â.¶N =ŠMÞ‚þ_ ,À‚ú£‰S†¼Jó=1¥K3ïáâp¸ÉC4‹¹I´Ðº²q}¼éU;®M›q(¥= ù1a$3lªÜôJ] L&qºé¸˜Ï8ï!Ûva#éµ”'Ñ~æ+ü=R$f;Û~É3ÑÂÏÂß³®6t!D!cvøÎíp2LÔ[“w‹Qˆß‡äÙTðÅR«¢€PÁ˺|}§Þ³=× }èEí<¿M®P(5]’œˆš.¯®êÁ«©0ÔtÖ9{ðøv"¼c ŽÞÒcQÃÍÂ~nØ i¿Ë±kŠŒå8©Á Sï°~ïšu§˜®ÊLØL »én§1œ•vmqH2)¦ê "éŽÛÒÕNëˆbÔ~%t’T³|VÙ¢wÌÕ!NGËk\KjN[i£êúemz$×"Ó/Œ,†$ËÉÄæõ1?£,•r&Á"Ui–þ¯‰ÌÁÛíä5-Úˆ ô¢:d }•‹vÃò?}²£º{zø‹l@;äÿ`IN::NE ãËWÛÂRU·z…j‹ÅRçVŸ»‚øû,‡ך5\b¹"#|Ö!hgQî¼Ý““J”CœyÿÒN9iž¨I-ÿJÿD†‹½ õvÂ'©qGËŠÍJ«B‰›![Cp³$•¡,[Jc>`A_-6aŠŽ3›gl bì„àÊ9pŠâ¢ –ŽÍ©úu¶ŽA£S‹.ê—„•ß{².ª¯4î¹ÉG‰^{î-¸R-!>òOíÃo&¸& žÆû«âãEðû¬ªäûfÞ8q[¦ס]šåü­ÊÜ&µë‡Ø:h' øy)Ÿ8Ó;Vþ#mΟ¥ eC N§rë6Ouî@Ô65:ŠBûÆ;0f¹ŠÌ\ÓY]°P£¨¸h58(ýUCj½5°éë ™P=ÁÀþc•îÌ ç­LмNÕÒ†9º ˆZ‰ fý6€êR÷×` ‡PøÎ›Ë~ïC âj—-l½ ЉY®R¦ö‹Œ¼4U~‚ ¹ úmוeìƒTè¬ÖT; ïM“£rÑ!h½˜‰ó‰^õ©ÕÁ cU„£Ðy“#¿âõJµ=¹ƒÏ(Së['úCB¡q©ß'Âj»·Ruu—woWâàkêÒ–¬ªÇãœ3MN †=ë¹8«‚´õ(ÛU^F§âäœúµ&^Šª‘f]“Ây¡øªÃI´˜„?O¹ ½ð<DQAÔ?€æF\Ã.ܰ .‹L·çaøéÒ2àf¶6O8t¸u)ÒXŽîi¬Tº‡¶èóŒ/ nkS„ðÜ`&u<ý4 ‰qÐTË¡*dø0¾Å*?Q ‚ПA) ›)Ý›X†“¨(ZUd5“ªEjŸ N©Ö.Û€8–æLUPáÅ-Ù•I`ŽÍb“G$G0¥Q°Ï†‘4¼ü:ö¹ûÞÜ£ zâAšx³âc¬:"HH“ my}F*«‡HÁʢΠŠdz¯?«¯/27ã̳FQs6„ÄTeqª[!B­¹“>ÞNÖOQ²ÿ)¯8¿p/:”/áIH·hÕÛºh=ÓmjµâCg‡‹Í¾ ®Û|Ω%×s&ÙuÛÌZö«B…—ÎY˜m1¹û‚À“ù”ÍÉpþâÜnÅá‡ÿÀï/H¼G&ì´ð*«°.%º•>kj 5?’#[g#¨D^^#Pƒï÷Œ¬ÐW–þ€˜ÌĈÄP|0`êÚК`}ñlL¹¿w±a,[ èŽEÛú¶ùе›Ê9«»R>‹`ɶÅ"Ãׄ‡n¶_ຠ*¶ï&Ok—E94~$>A£^â œD;fI¾¯ õ§B¼ù&ê¾ÇÖ0ÖàD;}÷sÈ …ÐNj•Bl*5ó½<©Åíè¨4íXÄV ØÀõOŽDíäø¯Ýlæ[¾£Þè®&Q§2T–Àv:j•Db:ŒØV`Œ=FÔ—U`X¡ECNÔ\Æf\Oˆ‹ßÀàßÁ7Æ×Ò¿da 6[„œ ƒ«½kÐáwÕ %"àƒI±g¡èÅ×Ûî6Y]¦l놩eÕ¸›\8Tít±šÑárûÚÀœg ¯ƒò«{á <[Ï:¦ÅVö¹[÷1ÙØ…&7A CB8©kd³qÓQ¿¨wÝ_–6hÌp’³™Îÿ£5BÀºe¦ê·™°kŽ¿¡O{íÁoÂ-( àûhØþ,-ÄpFQ~ˆ©R R{ë‡FÃÄ \r](€ãdÃ7R ¹iíDAGUqÀ®ûi´ s¹,7έQùÌGÀó†îcÈ™0Àa( wcyœ”Ü.tÎSx ¥D!@Œ£EVP{Y¡w},ùrzPv¬±•YÖ\}Ê/ë—I;v,èØH“ÇÈ8I'§¬»Ù¡EI¢ˆª˜2©„Ã,€’²½^¯CÂZTÉNŠå5æÞ8á7›7±W¤‚œ)ŠªF£¤`2qi<õÈ-hB[pšÅœ Rùƒ4ÅEÆÇ©î蟅ÜÓ¡P¾A,ù·+ àÀõÜÓÓÁhp°Ýó”Éb t/Å$›6íÌ$ü¶Ž ”ì »¯ˆ`Ê,ò…Í>†Á¼Ð¤ôâÅû c(^ûßͧ êeǯy*YŒÐœ3 ÝÅÀçc TÛ¹=y‡ýòܹ‰N–úlæ²²±ÉÈ¢1WÐrMc˜pùÙÒø{ð¡-_§qrŽK‡‰ã®q¼ãà™f6H—=EÄå…;Ãóm®C/c3äé+Ø”àr¢%Lýq¹Z§ª8WÅÀi`ìI(BÔ‰Ô5¦Äx‡BmVpdVYcm\y—¸NmØÁê¥.DÈb\Àh¯ Zð{fÌýT!ÝiQ—¨ýæ¸ÊÎ¥ƒWÁ–3v  F$ÉãýÀWM/ÿÂ_3 h kdØ¢ á÷;1[è*32£,[pÐadDªðXøèºú|vlüþ”µQ¿Ê„Uj샷UŸ@2׼ʒ/•›¶itÏyáIåÒZÜžK¬ÅFû"¤à:|4 ý !#S|å^ÿCpâi«^í{[•lQö2¹«ÊÀXW>†1%‚«c…Žó€˜#¾/‡¹Šüèæƒ$×bE2{ðö+tŽ5) ŽÙcÜtªTH"J{vˆ„ š¡ q¡í ’°òE;ÆÈ‚-Œ¤:gGx*`[Ö;^Ѐ‰Õ’—î¿•uòš/Ü\¶7þÄæ¸ÔYÚb9—KñS¿´6ˆ´NÁï'òŽ©ßò»…eŒ,Ø>ÍdŒ:ÉÓùšHÈdˆ×9f 9šS&œâsË: ‰óÞaA…ñÄ-ð·Ÿë\+§©^3C·’ÇrIsǰ›#j×=‡Ñ@9eŠ'îˆÍʃÄ'øÅAÖ°S=Î3¢ÄkÄ\L“iœCw8oö•ä~+R¼¦Ëoj‘ï×nDÔGI‡¤(”(}b.®ñqÅ1Qz˜9ÅàE¾é‘N«èRZ·ÌMÊÂ2´t]!Üaä”âăƒuô{ÅkÆ=åtñŽq×agÚ« Fî+½Ý^6TyÇüèºRÏâýª®¹TíÇ4ÿÎà3ö ¸°NÿÑDõ´TµdˆG’g$­Œ¡…•SÇAiL]õC¥Læº"þÞkM„’†'†p‡ÃÒ¬JéÙ¡ ñ÷Ä¿lyïŸÂ WeöF5ÊèŸ+¹é/U¦ÃÖýoÛnºÒp­ÝØâ ô˜çH%µú8Ι¥ÈÆ8ö>y#+ª° ÂÓ¯†ò=ö¤Î˜ÃÓ=R(_ÑxFR}Ë%>’ ‘;|Ðl€Þ™­„-"x¸º2o<>8Pÿ„o¡Â£¼Sé;LÁ/ãÒUfÌÆ;SÅ7ñ枉ÐE¥ócåGb­¹^ǹ}6FS¡ñÊÅuÜSÆ!ˆXo,oy“šx¡<Êó`2Kñ1åÌ5×;Í7{´ÄÑ{0hÉ©ª·Ù³¡,ØÛbfº c.Ûlô,n’œšÛã:zg”+™øý¸ª×»eÅÏ"]ØV€ÍÞ¥¥°Þ…Ùų4“ŒÏ4tÎÞ.BV:ä»JâKéw$‰~’Óª_býGM s| ‚O âæ‘¢„­m¾Û-UÊyÏ2:v@P媼(ÑFÌ˱Y +ö=ÅL­«VŠa¶¯k½ë+©lGÅfey‡-‹ ™5D»"­·ahj8­w|Áƒß›¹|YÉñ½,4-¬h—¯o^l`Ö/Ø+€øàÃPÝ{ÊÜ©U0AKX9™ß•Àk¹L±Ìzæµ(}|낲$éÏ @Õõº¯ «Åú2³–n™[uk-ÇaP¥'TÐhÇo<Ê%Å’Ö/`ë?a™EqVX¼üºî:u-¢Â¾Äp ¡õ5¯ã[»³¶›S¼ÓCc3妫š¸%¹ žëÅÑŒ˵© g€ù,€+I܃K…]­Qi+1þžø¥‡õU×53z^?GJK ¢‚š_Æ*ÝKîéºÃh!¢u³³D+Íe_ê¿Ä•¦™ñ!©ÁÖ ýÂÂxízìphVó\ÆOˆq¼úÅÙ J'€}³dµ—Qåeø%Eã”§eaO×Ùá¬á¥;‰ƒÊÄÚJ*M:•*ºÃ¡¡Tº¤´Ã¡”çk+ŽÈ‹üöÏâÞÈü=*X\z–Áúu" Ë¡þCwa9Ugë¦>Ã܈¡Âe)€øÐNÝMì×>@ å+D€P¹HÈõ¯ÓwmîT¨ýØ‚6÷âcüÃ6I%øöcEÃ@µ’>Œáí°åŠÔ5¼KÞ ^LÆÐYxWøpD‡Ïs©r®•¿Ù<Ïxù%)Øv¸m­§Äl´Oš»1Rf=P6O¥[åД½.ÕØú•UgÖ¬Õêa8”¯ûqN·Ôð˜aæ|B }ÞÍdOsHž´î¡ !m]Ôºûõ¨¬›qD§›&™¥½THxŽY1ªÂxÉ$E°‹·z¥ü$w  ¦*æµõù>;Öº’–­˜”¬r’f%óÃd4J(… ‘ù±Â|û Ð$[âH 1ÂM‡Jj¬4n“®\€T•‚¿‘h+Ó&¸ ɺ¯”IÂÂò'"h¯SÑPf»0Ó7ÂU}47>Ï•$g–‡…0]•…5sÆÀ¢â%QúéÖ _¬±×ØÉ5ãe±j»×Ë@‰ë¹¢XD“ï{«4¦ú)þ›¬XÖ¾^ÖɉlöôcràÉ$/¸·«+Ûº[P1È„e×שéJF[Ê|µ—ÉÕº‘¶š†òŠö…IƒÕ˜üP`þ²±©µËÂy‡-{‘ŠÜ„Ô³V$»F»3b†ëö¤uy™ú–Nj“(¦~¿¥*R©´LÞ„ÈŠq™¬p¹…ÓyÑ>”¼K•[U(ÄyWwÍÖ­å}e„ƨW™áø|ãh ̦‡‘PÄl³>ÃÊ—_7m¶–Y§pÓ¾ò!¿Ý*š¾Òjq‰¯z_|Ǧë.m5O~ èáA}€´¾V×Qû–¥å¦ÄÀyEŒøvdiª 'µ„-RdXÍáJ•ô¤Áçr9n<CB_r\«"ó;a<CâÉxœWlÌĶ‹*Œ9ër.š£FönòX,+9•sS ‰|¡‡Š~úýjlTT„ù^ºépÁfQ¤ a ß…(ç Sç"ß¹¥Emý~uYY`3ᦋdãѰsìÓÅñX”7åU9I\[ä##¹9i÷xQh  f¶7j½Š×eÁò©Úcáa³¥JwN¿ÌÃüé‹ä×ø³6ñ¹ëbæ3ñ¦{•QO+Ÿ¥q¢“¹‰|nGÔæOî& L„ße%x‡mçvvӜɴ&>!«ÆýÌ:˜é°Âw¢P<,£qéªf­"k¾óÃuMC>Ž,LS|Tȇòc³>ØMç ½ =•Ê`˜zÐâ}¶ÍO8¾C‘Áß#dÈ\öŽ­mñËsîš?Åà~[I¦˜}Ã`Ü‘¤|&¬¬éwqcÕœLAÄv‘Ktb¬‡ØÔëÏá@[òfîkyî+`B_k^ªÃœâæ‰'A/`/Çš±°†I})µÆâŠêIe€3àYǾc;(«¬.ÃÄkBÒÄYb@†þ|ÒÍKRìÕöåp6Â#æÕÎÛõ4¬h‚ZZ ¾º«æOªC(mmªS¨{@,ú¥âö_F «HsB¸0~Deç¼eYÛƒb4Ú[ÕŸe]ö¼™µb 4,|Qö&Ù16²(^ È›â:¬¹6,ƒµOOüÞÄ0nJÀºù:ˆUyj¦SfÖP¿“]4%žO"¾ÑiVÖ'f&iI—IM%]Åj³*~˜|æþì>S~ªØâL³Gã¨ö2î‰Ôª§”ýI°(™5ílu¤!}óYÔÀu¢Q&òUãÀ`pŸ‡šÉJHÆÙìGˆ´f.åÂ#Å·~f»c§ò±BŠj|³‰åî Æ`ƒ•µV"œØé« 6B]a¢ÿ’Å(9á½ñ¬ůŰ™i/%TÝÕ±©jÝD¹ñÅVIf³§Yâi0÷a\JS²ÔHQ}eSüæÅJ&•©*Æ’©úŒ<(_TZ¯SÄHð\„õjxdBh=Ö!f4EÌüó)>‘`¢BÞm2nΣQ› (r "#b“/¸t¨äŽ;z‘“r¨>íq:×%ëÞR+‹‰c—›Ì¸ø¤{œ€¦Sô²Š8á:?Ø£(Duót*Ü[_z`í×Ã/²ÕfÍAg¬ Ø5±ÐC@¨Í¬XºEÍtEx_yàš*{4PÏIt–è¿ÊµÓ‰ ª BÀÇŽ†ßÇ>b‹ï¨\s5êa¾BNùÒtÜ“þ'¾l)’3ñZ³Öî–uRËåV<’B–Ï™u=]\é\EÍmÂêY¢«7á&ÚÓ¯c¶K<ö±DjfõܹDÉb“3‰}¿–B–sk:Ý&¿,¸\“ VûJ³ªIY³›E¿6Àƒ°žä˜}yÀŒi01ÊÇò&Æ4X\†««&q)íXTj r¢ªù¥³€ê™­bÝú ^<ªmòXaœÄ¨MU(—¥rl?©78c?nÙÊK Ê \¦ƒÄH×±;ÄÉ»¯ð”Ÿ9±Ë;¦ÂA0XÅDÑvêYŒ×Å乎²·¯pïÉ °OõÊœn;“€Ñ:YYª³»‚Ö=x¶óë¢+ëšrl^ƒ†®ïVŠL³:œ‚ì Øä•²ò̺òÄœM´0¦b„Î'Jw —— AZôEÈx|vl—ô’óiÎ+Å4ŽF1ºäĘÛñ º«¨Æ$6Ô ûÃgúõz»áKÉŸ5ÔOŠ­7´Òµ#T«3îþ,yÑk­ú}V£ìj‡Là¤Ç½öËàÿêþ‚ZÂ(b0OŸMÌÚ´óÔ§`jo!î=ÅŒÉâ9‰Ò÷ŠÌIùU,þÒÐ$¼ 9¦œc"ë Â_ö¡ÂµÔ"âj½eqšyh-ýË@eŠR¢·o{ J”¶kÐ §Oˆ«ÊºW–AÍT[)ž¤ô¤Îh„D¦ã h›•î,¬Ûq’kìÙÂRLÖ4¬Á)¼VXQó[ û:;«øˆùþ¿ò5£"däJ6áÂJä|‡è}ä,¼mïK[5H{ R«`ñyr\Lð;¤uQoÏÃ"ž§ÖH‚«Ü?š“ÉÝH%Mð:¥Sõæ&oíØC=&Ö,Sìñ©»€ZÜQ‘4…~2‹$VV8ð|a*¢$ÜŠf2Q·Þ¡S²׈0}¼ï{܃Ì*L~!9 øç£{ è¦OÅ•WùCvÙkhÜœ¼ê¶›èŸ½„ºIªWH…}ØÐ_9­d[bþÖ!þÖÈÐE.T¬áÀ y[™C“×ó+Ïp}kƒ/ )ÆŽë.J;M1b€¶‰‘Š“Äýït†|¿5‹”›h%ÐþŸð´’ »D®8}Ø„@Ô»”bSÆ[¹˜\_ÛæüdaùKÔú„˜ùHÉ2Gà*ù”…F¹iÌÕª^­ÃîþÚއ¥… ªgy$0RÂ}lxÖíb9Ý¡rÑuÍ⸛ô¯Öèdnyú^;ðw{6à¿zFöÑ“¨÷€S=)^Ô“¨zsݵ)r«< Ÿ“HI=M,/hGw@´°ÝLÎpßã¥$°ÛáÆ…°i‚’¢Î¼ïv‡(º» ÏÖOe-ùì^C¾j@±Ušìþ2…ØÌ’…GuïO>qo‚ÉOòpž¢B²Þª¦ß·¡=`‰!’rr,‘á(€ÇV-FÜvr Uaso‹ *újTéͧ0V•†ñ…²¥ÆWCÝ„*Fc¥¥½~¿ì¥áOˆif¥¤”Sò(ªQ”#XÉŽ‘À9ƒ³Ê÷x¨Xß}· Ñb5Ò‚t8t\¯Tƒ{¼ÆŠ¼o§béYáÙàO1=zYàªr˜R3Á¥_µ=Î|v±n%­Õr²÷²ˆK_ßÿ§&¤fºlÜ<æ„°¢×bûR.´h*°Åœƒu!úìÙ)°%”-Ÿå-p–ê·p©Œ[õ5Ÿ }®t˜^EÀ9—ÔN¬5‹¹_ÕÝîRœ‰ÕΆ\¶‡ñµ˜)o›Ûó(fÐÊ´tJ\EÛ¾7Á…R”¤Xãù„˜K1Œ[ñ¼ÆQ™ áL èçõ¢Á™ bW×)ÁjçA¥Z7UoúìÐå™ù|W Øf1É뜭ÿ­a®4ž˜øJC0F“íô ŸŽ —¼â•õ®–ªþ8³EE%_>ì¯ð@5]ß4m_ɽäú5a!p’ÃðK×…NŠ· ÃÑ›ûâ¥:5øÅ° xjÀÉIµ‰Õxø”ÙÄîqˆº6¥ò1Èò¶‰KIJpUùð¢ê½ö(²íMH0®w å¥»WºR!%ª‡˜ÑsJ BÇÇÓ⳪&Š { ‹ÁžeIfS: |}ÓJßYŠG>÷:;’j«t–§8•Um—Ó·âÚYšiøl+’C§1LVóJ[$ŠùÿDyÒÅai.D54¤ø¿ú6ß¾Ÿ#qøØJ„Œ?!®FˆP?øô$ï뀽6ÂÙâ ¸ï:Ï´Ñ0Éì°¤UË9¤‹^)‚¤ñî´{¼oû¡Oëùã(sª[1h«æÑùhË*1Ž„U…kE}—ÖSÅ¢Eµz¿wÒúìÙ¤Â!0ž²>Þw_ÑÓ_‰¼¼OˆO!Æ·ŒÈ³‘_Üó T½²"¨rÏâ5*Úõ"€æ1ž,Ÿ9å*ØÖ³`Å€{Eêú¡Y- 5xôf`Ì=wže¦OÑàžUK¸FEÉ^dÓýÊ\'Cù²@ò:@xd‰I™èH´Ê¨H¹ò~L|Êð’Þ2)6U"¤ü3Èg;Kˆ›åÙ‹©ž  , ¥H7„‡Äú ›9#t™eÏÚ¾Êà”Ó(«Ðäð>ó÷Cj.=Jípfê m«LŠ)›ãdï3I!_¥¾›`0^p*«_á ò=\Há;ÐSvÔ&³vcª= ³žd­Ø*ÂêLQ‡˜ Ï%bßÌ«}&¹.JZÇúÀ¶aIê„÷˜l#ÓKªZ …,ûI}Mg‹??Á}G|YKìq¶ý¾DÈÊÓ ±~Öݞƀ«²|}P¼X—ëÞ¤1ä )„pÐ<äF½ s™ƒkB”—E“g!G(ÎIÁ¸°=Hàú\˜ènEÐÈ[í Ý.^Ù¾O¶J¢"GßòAe•€4–—ÂÝx’¾çE”òîÕ¾å-ÒFRõŒ— {@£±¨¢™5 òꋃ[ÿ®Cз²økäütN&€µ!<¡r&bàG…þ‚[äí!äáU#%Ž 0GzùgNÙzÖ3~à|Ø×'YiRá™¶•µÜ ¿ hÆ"Y8JôSÔõÔ3ê`5Žî*§ÂÄ……ª=üÆNïwÄÝÈ^[7üJ–ifSÃìÔÎ9Ó³¸B壘ۼ‚ú¸òç¥w2·)/ë/Z­Zö×DÔ«J)¬[“¥}Å–Ú‹Ì‚”d{Ù•uw´îma'^Û°Ä^•¨o¯wá'ÏKj£—Ë®2•bÂGOW·5Ïy[‡JÍ!”ï–û]¿¸ŒÿŠ-Ť¢pÙ|þöÚ댡#]GItñÒ*3Û—ªP縂>!æ%••xbd0Yúdi¤´'÷^ŽÅË‘\(àÝà˜¼4³‚ÓÆR£jý¨ Ì×ʧôkw¡õ]¥K’ƒí?)…6~ji¶­õ—…ÛùõÅþ«ÏØ*‰¬3ë1nû¤lŸ—~}¨¿8·,H»èž´¾Å-¼ …J‘Pr§Ÿé÷Pά¹P¤ç“*l$ßD¬ ¦* æ`#Y*Dm aTMoèÌqÔJU[ËbÈ‹¿ÿöúõ ûyáU¿¶;µV»Ïà,ÜB÷à«G‹¸’ø¤XA’·«6I„ÇI¦®gó8N©*§Ý@OÑÀfßzp6ußM×Ôà®Îô,øEWI¾v ÉÔšk§ °?Ný.T_å±@O¹C ÍŠoä86(&5oQt{d±wEHGVU,ð'G'Ê!%ͤQÃÕ›DÃhäåÒ>ô™F¢>©cú.$9ßÞüŠStÍž^‰G2µ PŠ2©ÅëUS ^´ŸÁ™©ë;¨5šâÛ.AÅϲ²F â·^aÕÂÝa쑪”ÈuÙ®jF-ƒd± ìTnúÉ&Šûc‡Ya>Û] Êãƒ\™û ¸}4Fò&jŠ=RE=bÖ-ËCÀ˜«®6‰Ž%Qš—kÕœ6N±Qþ‡¶n³³©"1aÇ·WÓÉËM EøÇ!oì C¼ÛWè-pªb{#+½©ª¤Üëþ;ÈŒ!£ÚÉã?)î,9˜EJ.Å0$| ?yfB3¾µ{^H¿^Ñ›ƒÉ5ÑûET°¯#<öÕ÷Ý#×÷Y,þB™÷À”Ï"þÑr!R_;‡£•¦j,»CØë¦ª°8ªX Mr«“F¤¬“5P-Ueò¬ÄRœ¬®æ×=ë5° €c·IY ˆyîðäN,ø½~/“) ÌùŸÓcƒ‡§‰5Ê6½iä´þ­¶ÎíwO·‰…À çT̲¯{YÑã¶qÞu:º±.`‚Wªø„˜ÙÔÇÕ5¶˜K\Ž!¼ª¸Ë*{m÷¼9ÆåR{ƺÔî®òèïš ñ8EËAÝð²âbäëë>4þßšý`\9å8Öuáд×5Õ=Ÿç»ß~Ç›iý+¬.&…á F|“‡æ±ñFf’’ã£)FÍ{÷Ê­ø½i¾r°Ž›á“Ž 6„Á•ap(­sÜõ¡r¥>Ø@°ñ¯S@Ø^Ñ¿unƒ×P;Îó0™OˆálZ]qP㇒8«‹ŒÏœáVZýP«ô¥$»&æv+_„䮫ŠÕ ò^þÍI"„…ê7h™Až®â`«ñËØ×ñUkœS«·ÖŒzÀÑC±;®x  î¡ÔÖSA÷W“3iL­sÎÚ¸D)’u®_céÝÌo;e0»óbíèÓ%ÌwTªË‹#JàÓç)ç€_0Â/ŒùÆ’1ÅoWÇaÿa©|òÓJDe‡hѼºSé|vW Ø‚ðb”U„Úº¦ßÃÕn¿?3þ­б1Ý|R,g>J^ã§à&¡·Ø\írý9q2u Ò[Äjü,b4EÆÿÒvm_µÝøü„ø¨š‡àÈóNˆîg -‡%š@‰›—fÉ™Z. èÊ%±ÄE¹’ª%­rs÷"¯Ä B’‹zñë³ ÙðVEµßÒKþ<ûÚpô¬²Z¼¹"`%,6`,Ñ€‘Öê ŒãâÈä®zóävj„ðXµ,¤Îâðð^‰|ïâ¯ù‡¿ü7ÿúXÿñ¿ÿÛ?ý›ÿü/ÿÏÿñ¿ü§ÿò_þù?ÿ-„ÿæŸÿ÷ÿóo_Äÿí?üíoÿéóŸÿé‡K<Å?Ê÷—ôã_?ÿûïþë_þåù?ùGòÿü»ÿ÷ùþÇçÿ×Sô_´ÿÓÿí?¤ÿdOþ¯ÞsïtÌç´Ï»uZ/‰Áç ésŠŸ¼JüW{¶ý?ÿ%^Ÿüßhe%ñ”¥ëm µH“™^†$ ð!Þý2?Gd!DX—O"‘bÉ{íóã»þõõHBXƒAPs¦u»X ò+˜ø©!2­ÀœŒ÷ Û`˜ž4JNrb²f’IGááF Ð9io>à|Ù×vùaµòèp З¯õë Cö«~}•2ûÄ\d“ðþâ*æ W—·Föj¥Ó$edo$¦y³…·½—À>I>¼9Ç۳陭Žáyí×ÉÑA Ñö’U²b‡Ïñ,Xfd+±m$jz/’HNUü¦ÝP[BãÏ1þÞ Ÿ‹VGqÌ“ +Ö;¹ü 'S²ÅçâÏ&ò±¬ª!¢"¡oý:.x[ø¶Ùß§ÆË ¥ÂE¨sI;þä¦7Ÿöˆ/ ÅKàf_ØS…ÂÓøúþ=c`óü¢ãÑÃî€ÀÄ¥‘4ÃT¤·ÀÝl™Iܘ‡7o;yx\åÖñfæp>·#ñºø5AkíÂÁ•ÒsfþYa°ÚÉPCÎókoÀYî}1 ‚ðo:vzüí…ì1³MR(Ï|áó$Ï×B†P©þcîù«Ñë¬7ÒwŸZB-<Þ¾Œ'¿Ð± ̃KêÇK#KFð‚ UtÍc>o{p%Í¢¸P$Þ΋gžpá¿7Ý1aš Ƀ^a¡ÈÞ8>÷òg÷&1И'ûîÀŸ³š7ö“WÇfmâÊYÇ&Ww>Þcäû€dó'ÓÀ*q»ëãýëgîv#GÑXgî^žÇÓm“‡vSÏmä¡c¡ljjî’à±@ƒÐy/°ÿUiNsm;œ@*g…,–~λ”Èá²uÔäµ%œ§ÜYžjŽÊ$mR×¾ß~À‡ŽrÔÀ°gdA<Ê;æÄ+ ãÐì¥~ßa†.â…<|qq&;ÌuêrxmÀp–¿t€=›w-"FÃ\œ*[^;–÷übûaÔõœ˜„EJ O–ϺŸ¤þ~öiK¨}{¦í¥cg•äNšl§íàXîM s‚ueŸB}›ã„9˜»P¿öüoL³8Qò7ëYYþ²Å‘X-¸³Þ|çÂj-–[íú¤8(^–œ@&ÞÏÀƒâˆ,¬z¶Ô2€/pHx3³ç4NZ Ž~ä ° mÓUi•LóƒóŒŽO®ˆùÀ…ä³Û)Tâ‚Ï™y ¼ »ÈÅhÏýòŒNr<­ÒËéØ×¯xè€+•Í,i1ƒüO¦=ŒÆ£”Ä+Dç“X53Šø˜852{.zʬz¡ÍÖukï|TYÔÀ¨ ²a¦Á ÷—}AaA‰µÊ:=X¼øÝ†—u>ë)Ç¿URÀ—ußäÃ@Ž:C@DóëC>ÑÞ—îœ óqÙ* ¹÷Ðï³üzÇuñE<‚v0„<GÊï„t"›xÐ4NÇrÏRÀõay©¾÷HgnÎe;F×»x#Ž1õ±zÑXûE¨ k“Kò×Å™Ïâj­éÐ/ÙA¥:~Óƒ§ÅÄζy¾à8ó´¸~5„çÙ{¸{}31oçöÝñaäýü©6ži©­[Ö›‘‘{×Ý3LËt=­Þê–$"‡P”•¾$$ó­÷€æ¨¶ìYn}ÃxUrÁ.ùž¾uàôÌ=)q²T‹qÉ(Y½e›LԤ̺;YÉc«gô}ù=Y嘘¿ü´ž;Ów¹ð K:ÍñÖ%|kgy«•)ÁN‚ {¯èžäAS/ûrÒaA?dŽº´ök7ˆþâϼtŸ¥|ˆß†õÖÂ:üfþ¹´Üü]žÒãµVægØ.1*Þ—;P܃AÌzÂëºÉü.¬øõ¦—‘³èŸvõ«‘“{uýB§ÓÅ‘õÒÈCzÚPIÝ¡ø‰ƒ(À.Ýœ¶Z_·¶{ï!®ÞÀe±y{¤;N]4«G4àñs˜!fA"ðvàí_Ú%0>Ë¡Û#íï“bD`{àµS‡èáü†·d àµÝCβ[µ8âxÆ^¨,+“qŠùQÏÃØy¼eCe~à÷Ï;óµY“Ö})’ÄdA½æñ¶_Ì<¶¶ µ°4ª]PÿcMÌ| ¡B"§Ù„“йÒSMšˆ##võúä„…!AÌÉD¹úw?¼²{VÀòS$.¥ëú$½~Àù2FD{ÀˆøeŒþŠüóÆ” ý¤)ÇÕ˜RWPɉ‘Þ¶{²0öäJÙŒHyÚå@ µ+éƒ|}& TbéÃ5T’üµUÒ² ÒÞÞ/#TS(€-IÆ<9åáQ}ª§†Ê'“ª(»‚`Üþ2γ¢Ãk>´Ïý¯b9&>†3aü­ÈDÎ"|3a¢G2«$—µ+®q1aA~^~íGm^AÆž:‰Öë*CÓŒÐS.dÜZù¬t¸1ï9‰Ri%F|'Ç„Ç3ìölQLkóeC cÇë'çÓ™Ëkçhž„ uVhôs4€7&œÄAºÍ!Ș{à}>Ø\)Lÿ&|4ìÞ7ï¿ACrŸ*)âœ7Œ ÜáèÇá›)ì•|òž…FD7­ uo`ÉÖ‰˜Ú›”<Õ…n›Ìê—†j žKðOÊ2Ä-èw¿ÿxÛêCo{ž×POœÄŒ¯£gÎr"b]§/@ ›TTÖ‚ÄL<6Ô®q¶ÁðëÄF~é ¹8G•»gâIÆæÿ¥-“z–å‰DCøÁªX[Ïb>k“yÛƒÚQäâ¯IªÚÈOF¯MœPG>ž ý÷x8Gmö¦gŸ=[Ž ñ¯=8]ITë  ^®VÒô›0Ñáô>çˆGiW]Üh«Ö¹¶ž$ ƒöÒö¬è²L?9Òñ^Ζë4¯k©ýbÐV9"”$^(<-à_lI7v‹õªÑZ$ïàëü)(ýs-º@(¨CMÜ AœÏý„+œß;©ïß¿°-1² Ò±½¾Î)¢ÿEE¿M›.T¶mK‡â0äälbð{ GÎÐÁQÕú©ºä8‚F€EBmð2ÑÐØîç³³QÙg5¾¦:žL`¢pÞ#Ý+r•œºÖ]ÀÛDäjÝÞjŒDÞW*íd†È-ówÓ¶˜8ÒC½Êšs-r¡¿@¹Æ¨k˜iw&ä¬}¨RP¬Ý•¥ëÂ×8N~ù¶ ödæXoÞPmYݳ Qn +3,l ,@'öaJþ, (x ‹'ßó«àq!Õ]¥‰L˜7ÆêdtS4'æ«”Eî§QŠå«øÖÿYžu«s¿’¨Ý~߸v=uOΉ<¿• Te×ô¨QL„~–ó£-‰¢sh6h3Œ7BŠ¡«Òa7ÐMÅšs,NkËlµñ66qn\ÉPû,»nØ.«ÞäÂì6gÀ¡ì©O˜ˆÊÙx‰™®¯~sNx† ¤Æöåh‡äãTQnljê¬*;¬ÈvXBšE‚¹qs§ @£=¬¢;½x>µÒf0Ù½ºÜOÐcðÜpž“bÈÄÇ áä¤3ÐÖ"Ï’Ô¨Þ`90L*éfFa‰Òãá$ÔÔ¯‰01sŽOFª‘„Þ9*-¥k5‘Siª~–m‘üLòGº/Œ/Cêóµ§§ÀðÃi¥ô{¨ ]æc?Qª.Kê)Dé>¿ ÈÅÕ—ôÈ®:­N¬²¸ÆqZ[ÖÔh˜3'N`zË» ©¬5<}\jà7íɹ™6uªDõMT˜ÍdŽ5nô8QÎÝÆ¼[áÇ~B(ΰ°úB‹h õÁeX3ÓJÌC– ìMFfâ×Ñ•‘F‚Ÿsc²TøHò(ö«Úç-3ËL tÏć'¶«ÑȤ°0½'g)C™›ß½÷¢Ü5— ,•qÍø˜æÀM¦^§Ø A§H|¶Rñ¢Ã«yf>7‚ Zp±ó¨38AÁ/7|@¯Z‹ïg ±Åâû Úƒ ¿˜!ñ‘Õ¹ª,‰QXWÑõQäûy^q°úi4jÖ‚’¹¾ ³E‹2S|&¤ÕÛ#`íVY–M;xÕ´ ¾½QIÂêb?l `Šñ¬¼¸4]ÈëЪÓW*‡kpÉÙá†_#¡zØùÍ4Nd]83.€zª«¨”+H}ƒcrøF霗 8]ž¡vøœìÑ®dM¤‘ÚûÏÉ‹_öþÍîŸZ½ÃÝÃd+„1hÜ eé€ÂʶÖ “í¼öрƴIBe6r“MnaÇ9©>d±gŸ£CyoŒ¿S[d8 ŸåŒ/²žH‘wêaœ†:XôkŽÂn9”C:™óLï\¿ˆ¶Æ8¬zŠ%À_ܰ¢6“FUæ-3Œt›Ï²êØ2~Z„üBØ7÷!s51¢ß-bÏ‘¼fG$§aƒ£ßãW ÏçÀË:sÚI·ÛÐÆZäC’ áëNJ'œÊ߬ºÙä>€7,šm—6Ääiå,ïE°:{-‹Ž<ñç{×Zˆk§ H“uöëRèÈ„ Œõ«Ü²‰';ÀZ~Öj–Û·ý´p%{ä‘ 0 ZÄâ•'›(d6˜Ï ¹uÚ• k¾‹8d`QŸC[åi?Ð@  4²yª·âeBc|.œóN’;+§Tªæ,N/@Íg²R­š“è‹dbZÞ*Ͼ©—¥ªUŸ†õ@:íéôà(Û„—z~¥tR¤9¬å•‡oØ„Yº\ zËp…f©'™e!¦…Ö4¶Dm¼Ùzß2ðj;‡ ×+…nÝí‹¿Ï•ýªÒìká­9.ZÞ+¬µKòÖ¸.ám÷Š|S%Ñʼn×½fö^Á¦Èúf§igÍΩKÄ5……ƒŸ¬ˆÝݶ©“•ß™‰n^p»Ù{ ÍÎØ›3³‡üÙÅà±·ŽçºÈ ޹_;µ¹n²¢@s&ú‹÷°Eœ½Ô§Ä½E'SlH2½b P"E,JWt¨Åm«W~kÂÎ~ ã.œÂxï}…"ÇþΉÏù=3›‡êOêÚ›¾Xo”9Ë‚4BÔ$Á³…œè'ƒ•Q%‘Y¢òbÀÔ© âlÏ‹P‚ÙH1Sùµxï='xGZÓ³µqd˜Bï÷ÈÄ$$¢.œŽfu´KšÏ±£šxŒwÁÜ$ÖãpñÞ#ŒÏ|¦"1ÔÊ*Ùg×ñ\÷áÕ}HÉIrc×|"èžO«(Ï@̪ÒèNÌ9Gn~èsrb9^É\ƒ)¦§§úÓæ„‡é_´,²œ¡¦©5Ö+vCûOè”s0 (Î.sä2ávÑfkÆÂõ¢Ko4éJ)@9ä*~í%A(î@oà®]˜$œ M¨$v]¨õMºnå‘þÌ.…Þk¤«z^N‹ë›.s£Ì:Ì|†;Ö¼Wh›ª{I_6À#ÐÀ¯ý².Šª´2kÝyôpRw©”\Ý-WÁñ1Ê!Ò:{~6÷¸FIG¥™]™ùÆ—ÍaTÌY·|bðlçùöóIž Ñ¿¿è“ìØâàz•äluPÉ2{îg°™þ¦„'¥I]}(‡O¥—ÅU©ÉæÉ©‰ñF–ðî„> lù“ŠªÈ,7RÝzš$¬-Ñ­î;"„ä'©á d³ ¦suœ‹ÎSÌ»¥—û9™s(Ít´Ñé›Ã$. P€Yz\¢ôÄWÇ 34 òE cùð:{?îa¦%¡²Lð²2!(‹¼2ÍŒD(æÝÎÜèHÆo`^®œ>óRYR'„Ds1î¡÷žßòÜo[„p/·ªØž‘§°ôP3 NO'Mz‘›?+nþk08‰ï/ì­¦M0qç9ªu°e­:ø‘•×› ù6a*:‘!- žEÛْⓇ»Ù½Ï<gç`MÅ1‰ï¨ûJ„"Hå)<).Ä@ZÅԷ¦±–ëf‰j;Ãaœ?…'k×MX6@¯ËÙLÕk¸W¶£ÀH]Qú8ÆJÊ€ý^ :œ«—¿#0ÕÑ$¼ßçR¢‘•ЏêÂÀCS­; ¢Nh­Î+÷ÐqG¬6‘w ÁVk¢VÒp‰ÔcR–?N!çqeK8T:ší‚ç‹OÄÄjŠî³*Ý׉­ {Š;A£îdfý ^æælh•¤(CxÔxÀ’B\o²¶ê®T±fd&Âx±Œ5õlcY º‰Œ¤ƒac+„²•¬ ^³Z"ÿ%†Y½¡8м7Y4Ø@WþÒöÙZ­Ìfi`§µÀ=LÑùäÉÙU›‰Õ®[ù’¸_ÁÞl œTÅ¡º¯K»¥º:Ü{©nøN‰å1 “×ä‹vçÅòòo`‰EtÞÈñ,,(eµ{«ó}…%B‡’‚ Åă‡Ô‚ÖhB¥Å“mß„Y$*rù³±ˆTžWÇ{ªprÈøóc‹»ÝÂ&;…`u«EZôûÂíœÇ…KvCø'J½’Æd£Ž§UéMªäÜ„2KAÑ 0h~*ëXQàz|<èr7‰~3*³,°G6”>·¸‡¿¢ªÏ½Xk¬.ó>«†p.@$•Ì'e—ç? œIMåÈŽh7kÈARiÂÄ4#sÉaB¥}-ºãÈO;”ŸÃÇBæ$fÓz)îÌìý 2kî-rý>º„({{lj ŠØô Fýô§òòeU£œM`ï”grV×Z«VUV^¾üÒEs¨ƒ¹ø¤Òq‰¶ŽP é—cŸÌN<~^}3¡™¤¯XAë‡jŹގ•l@júâ’Òâ³™teuýØgYKÅi3†’Kª½ÒÓú6³ Ùç€4 s<ãÛ€¨ß êPK ­.™,QÁ®L²mSH+·Â¡ŸQ:bå÷ÕŠõ£€uPKÇ+7?ªè¢ý~6†ÍÅgLõÐýuUh ¥^ÀóŽêGW—z ÅP•ZD§ÕŒfdI•¢ 9Y]-—;¸£ðGĈGp«²°#'¨ÙG7é.èÙÄœt*Ny±H/‰Îj:_,¸D. âàjIV˜B‘ŠʲÀî†e’åD),ã3ö®Ö/QmI·D¬ Vh9 Àâ3ø¾À²›5°¡°Ï'‹Xõeó —²ïèWFãz¤ËYÊZ lä©z5¸Qê´DWÔ™N¸6Å##PÍ®ýA+"eÜ*V&]ë€!vÚô8XgO:[Í£8©ÙsMg,8K%%¡`×+¥_#£-P:¸ ‡ÀI^h; +Ó€¦>½!‡Vx;X·ÅÂ)Ô!¯b^ãíÞÌÿl¦/…° “¨-¾¯NÑ./Y(èH¸C©Q\»‚^:ä¯VHä=¼ë.¥s0 Œïí^N!!$Ì0…:4ôû‚ÊÐaîÊwIÆ– ëøì°+ ÙpºÚnïTÅã(O°Æ†hͬ© «¨\Co6±#$vØ£(œ Å¢MóÄ Ù£$]´,C`z¡Ú&+ÏÎ`5¦‹«Í´„½Y1í;9ÌÃjºj4‚d6ŽùU¡X­a²t;es:,Œ¨)ÊPmæÎª°mèV,È0qÓpYr˜ÂfZ9-}ÿ†¸«æò\j=„“a$L¦8<ÒqÀˆ%ÁFëï'^ô†F½AÀþªæÛ‘Ø›ÞÐÜW3‚(@Dˆ)(‹‘Ïã6Y9ñŠ’3ß°Hâ]„HÈd¦ÅÅï{r« wªÏÕL¡ãƒ%FÑèç. MÞéŒö^¸f똜¸h²6`µ´$µ“7v=ÿA‡³#¢‡ï…Ò™¦fsò²ÕÔ†*6,°ÉÉgbH3”NT¢»-Ž: PŒ+/:£®£€ªm_M]²]«˜Ò•wDËéçfD̆¸Û¼zv†Z¢&øZÔ˜#–¢1–jX@Ƥ‡û ‹æà;דìñÓÑJÉôd¶” ˜Ò/'Hk4&ôÅ"1zcïC*vb‹Ê|°b)œlç=S’êVÒ18:yè#[NËðõJ@-B¤§¡Ý¤UUâ= €À¦·¼óEaƒÉ¹óüËbånð€rTöZÅYJK«ÛIÈ Æ]¢U‰ öŽaéžÿøï0i-‚Î/ÐE¢ˆiÆšYŸÝ“ïsA¬IMMB8V(‡Ù~‚…XÒŽHc¤1(ø8ñ¥Â 3 n;ÉÒºs5‘‘&à5ƒ®x'åΧRN)Jx¨!oí°=eyÁª¡ˆ4‚|#΀eu*Â%3ÃÕ!÷œˆ#†zÄÛ÷Ç~&<>Pq¾Y›[` œã·TzUã$4X‹Ràó¸›`$ýТ–\º©NßíçšM4`ùG¡ 1 }èzÙB+!YV­±ÆpÈ@˜:{ÙWA@ ±LuŸª¦ZEÇüZß‘*Ùñ\xà.0ó& RëØÍ{à®B/¡‘¶ Ñ…P* ¶Š«áZ»A3P}øÅĈnþÖÊ­ãH· ®—®U;~¾ÕD‘p)&Þ g»G¡ã=’UË  H3Hö–Gk¤Œ ߟðZ\ÿ-׆ˆÉºó“å/г‚ã/XXÒ—- ;*Y¡Â S!#¥qî=&1R÷VD·»÷Ÿ3¦×¸6E#^œ¬1†b}Giâ;‚ÎZÌm1I4sq ·ÞÝ21ˆg {¢Ž§,òäéµ eæ*«e„dœêˆió3€pS!øÛÏ5I"ï ½3Ô®èíƒ:º´A¿ÔRsmx„k‘rꔵšYøs»ÞÌ4¢G6œÃx2Ô¡F©B†FDép\ò9ÛƒàCe3ó•b Å & R¶~ ±R¥Ëg¶B•aCQs$¦œ3Ñí:ªpºz¢ŽzT`’8ø»óÁ0É`tš@¹V1jn"úö±°#•Æ=D'&N¯Ï%Kn)>àt÷ÝæÄ!™®aËkˆ;˜kbw³ÏQ2WÛ­Ù6:0C35a|Ä“8«èրߜJQåóïZű!—»eúÃiØžŠ°òö °ÚX ÈboOFç»z†Ån‹ :>JoæI^Ö€¹ña1‹ à#n”ŒÐô™W§¡ –óšdþvo®¡ÿï¼Â+{·;#ãÝ`š¹`(ùnÆ!Ò4frN CòáIw å’°Y˜¹Ôo&äÌic2fïZÅÉ[·uJ1‚6cöõhÆr·=È©^=Ž>bôÚg÷´ ò Thœ ¥¥2xØ×<󌘀=ÓlûNp0›!8Šœ:×kp¤H¥ˆEä´4§H>I„ðΊð\œ°ë˹cÖ%Òwçvè~¥õ5ÿó¡ûì–˜44?@R?K®çt÷¼Z¤¥HûZŨ?*²LÅ" eª6*R®^zuÿï«]'½Ýöü(½êÓîUŸŒh­¬g£ùOñ鱞§w¹Glƒlw²g–š„Ãè¯ç"OV|H;ÍøÜ€‘Zn‘Ð'YÅG”Dm…”mß|ö7ñ§G‡Ñßì9œÞÜLjæêwËÍCªCh·Ü‰Ìu$WaùVãHÖ¦‰ñ ‡Ól Ô—PŸ—V±b¨MÖ)EÛ‡…Ôˆ·¬VFûÈD+©¾ÀÀ)F®N†Ò£Ú#ŽC–²Í¾Î€j·ÓäíŽÖv)MGì°Ð [¹Írµœ“™ Úä,P“®É̃@d”„s4Éî’Àä土8ãŒ…ÎØÝT£ê(«9p¢ ¸ÇétÑ$ —'Äubn…$Û#!Ýf‘,²Íð`óÅŠ83zz©iÝ$¿ÑÖt‹#`q8«d˜~áìÏAÂx—†ÎÍÅ%ˆü>*ñ-Yߣ®qžÉT…Ô'íW›O¸€É¸lNÚ/1Ð$Á _±!ÃMboŸÀƒƒÅ{!òm’4Ü%7žÕ·¡$‡°;ç€üÌLM‰q¹­c[ÓED‰XI þóAŽ—vGD<€k0•zÆk®°ô@ñ°'ÇϬ`óóA(BçÝdØhpi´ÅiÎÌP¢åFy¶Wäª6 ]™%$&ÝÖLABÓü’yÖÕeû^„ÌsɰjÙ¡´05°Ðͼ'W!.уîªá™–‚G”r¥A@Æ\4h°U¾rô[dêÓ’9š gÚCaŸEÉ´©šÕÈ—ÐÂ$-Ä$CÌ([§Y•l÷ ô¨x¤("Š3 ì¹ÞL‹7H˜°u›òñú¾Àã™ZpÂA(íCSð\½†D ŠCRg¼·ª&'Ò5,,L‹± 'K]Fí °¾©'Y%žhM4|)ëAÍÂn! ”È)·ÓF{ò.0då5óJ@ üÀ4n¥D`Áä=½TVM’MÝmÀj‚ö è<Û/Áz p¾x>“ „ÁW·†cÀ~aüñÿÖk™bSO—‚—ÉlSY¶ž_ÞŠö†T>ê¼èµÊ®0OŸ°ž  îÁ݈6IJåt h]<ãç‘Ü„QO`Á‰«PR~‚ÿõpw ‰Í x´`üŒPÆ 0#d«?šÙ`Ænœ_ U§Fi:ªu%KÔî8åTÅ S1`ŒÕleí„!Ânç s$aÜ^ ct&DªeÚÿ‚‹˜õ\ ˜Û¶pè5Cо„©ÉúÁšê³$à÷³•‚SÌ !íh÷šŽÍxVÆ)Ín°H€T“Ð#wlGº¦TˆH0C1]­T™V¤¾ì’1—I!ŠU(雽 ;K%ìÓPQðO²“¤ltY<& Àa{™D“ =)Zág èÊœK4.Ö¡äQ$ÔòÅlx^"qi0yØŽÇã‹¥£f.£aΡ˜pq óÍ`7* §PdèJĈ„³[‹½hý·¢qi¹´<˜x0ÎÎ ˜Ô1HU´ 0±^A‚€mEе¼í°Iè±&Ó(Áí @ë fk1Ä;…äq†ÌZfG€\ ¾ͨ&¬•€;ƒ§E¬Úw€;&“Óú¸ò› ª¢2õ{…bŒ?£ÛŠBɻɔ5û-"œ&Ϥ—%±DhAZTqþ´`ù$´œaÕŒ›¤v`6‹œÆl$åybT³4ímKÆ–d˨ÖÅ!s o1}(JYBêò[3—âìtš­–;Ò9ÓõéAPLBcÀ®¦7é™LÇÚÃꯎÔ'š® KzA½k™˜Íë§Œu”áQûæè³ÆIÿU<>Š­A**XPeéê2yX iêg)ÝÐðZ `1ÕuDèüÄbj«ÔÌÌ}$BÐaó1ˆ.­CCh⓸)/ti @È“ˆ®ÊGÝü uÑÒ «Ì³îz:@miƒj¬Z¯0zÛÚæ½£•‘LHÎÅ)Ùn✠hÏ1›4Ŷ„îÁûi„§E˜GÛquÆ]ûâC‚† LÊÖP„4çD@O(]Ö‘€ ¢t<‹Ï%BgæPÎJóBIO¿7à*°Ö„z²6UBBv¬˜fý9Ò$¯×¦?'JRWÝ-žñ\l Åp èàIèÑ8©EY³ŒNÄ•Ý ‰È‘ìXM2"äXŒM„¸ƒÇ™†æó$x(¯ðFfRuìÚd,µÞÉÛïg£-ø N„t„Al@ª0‹(Ý—_à‘Ìå¢ð†!F¬X%Ð¥VÄüiÆ6“&ay¶Ü$1`šmƒ\m¢ 謳5 ¿†ØRÙ|€lˆ–b,+)›»¾”iö·ÈBu+Âj6 `º.,¦;g ŸTµ5‰òrÎ¥&žš,æ'€}Ê@šùÞ½"hTä*œðÄXQl/c’§§uX³z¸1™BT½C¯``k¦/0|d3ØiÒ§¥\0 Á¾J»Pj §‘Œ²@ØEÛv”d€) DP6ÄêU9jÙ­\,³8‰“ÚÅÊî(ÒC¯/š9ÍG'ÆMæh,ܱ¥[3Ö@KQâeÍÉm銬ÝSÍní¼¶Dö¤Âaóñ·¯Yî\ÍOaìPŸÖ(»ÏI^@q©-–'z«‰¬ê¢[YÀQAqx^L7$Ó'°ó ÅËü¶!Óü}²ÖQ°\‰ØÁΆé;„ ÊÎêÒçP¨ZhA˜ìhsà&öÊXY$:c˜oh™µ.í7›!ƒEPÜËbìV œa›"ÜÕ ¡Y¬@moÈû:Ÿ¶[³`%ç¡Ç PÖ3.7ij·¾W7ƒ\ËDXÙ~Ñ@Øäz;‡ Ø)Ìg£Þ) 7Ó;Íp+½ÙYÛÌ<Ö3&žg®=l3;™Â6àe8á’ ¦ˆ*ÐLD?auíDˆÈ`‘P@Í+P ðÛ³[‚ ùÈJϧ‹6ivÖ2”&‡Ôüj¸qï°;ÐÇn¹1‚]eµfLfãçhPÛ¨5§~ ë8Jp ¬æ™9 q‚¦/ .)m±Ò‘ý þ\³Œ4Û[»×LÊpËN€Ñ¡›„Ö«ª§YR¾#~ßü”‰ð-]ÉÖÁ.irNë—×¶Nï Vkm™©™òoisŒë¢`QÓt3[а{h\;í¼…ê‡8lÐåP{Ðjï[ìÁÐ µê€£XSÊB Æyàe•!>P–l kÀd@&±y&ˆÉó½â+¯Ìª»‚ú¯égf0Ôà´á£kj‹/Œú!Ëú{4P.Ò„^„)âhgUAªdã÷sÑ!9WàŸUÿ4»Ë¦æ§lÉ >) Va3(¨ÎÚ²°àT·úìM-©uk1ç–,;ô~;˜n4rŽÚž× B«I$Ç ][)ª“’+‹öaІ8°%^™):_Ù9«·NKÅÒí•Zhæ6?£ü>XLhùba1q8Ú*BÄÕ6–Ì •cP¯A:¯¨òО§Á’ae!¤ªaùdÖ‹5X¢¹ÌŽ´„¢ƒ×:Ã$<€i*…žÔh)ç¯ÊÓ̱À\L£¶OÃÍÊŒò*°ÎN›P±'(éN˜€®õ³g³6ŽÕò£)”âL …:GÏ- zÔj°Ñ F¥+m#Ìj4îBžmVô+/¶8qtÃçh®P~OA=,pý4'{uè¢2A#bœqhîgƒ¢}L¶}Le€ xkJÔ VJ€w¢™­á „“,šmÞV ’Ú¢O› õœÜ$ÇáÞ‘>0ÂK6dgÙ71º£†Q't j´ã“Çò[‘Ø€Sè=ÙüR‹Û7Z¸£.ªÃöaz`|‹&(ˆsÁr”.B¤œ>.«uÒ§ESó‰<‹ÊØÍÅׯ+>%÷J7Ú´!·nGÇ“NU<×!NLldT1Ñ®aèg¿ö^Agß-!GLÙ,Gæ& ¨LBËRæ×D–Ò3W#Š6š˜Ñ°†—jÍ-¨ˆ-sÓ£šD©$0cXa X¦qÖbp½Q;”ü·hø˜dôÍôš"´·x(L‰";öŠñ}¸LÕ0é‚‘¼‡`OU¼]Øûü½U“ e­Ž R´Šu·wVón3×QÝkZŒrð|ò Eâ¬Æ#q†x¹Ù¬C9 zÕÝ}ªÂÍ€« :â€ú0.—P¢ŸÀ*•иh.-cs, îoÚ¢^>¶!VéZ«dŸV…ûÒZÆš€& Çäfz7íë-•¦¢Ì¨œœ¬Am;É^¹WT½9tâ*Äꦎ[”F‹ÍÔíN¦éj3lþ†HN“§Iq¾Îm×mK'›bYãt?«p¬éÇí°C¼)ŽIá_Ë:)˜éÚÐ^̪5 M­\I8¬ÁÜQ.€yÞèÓ×VöË•pœ<Í ý ØÙUÅn´qƒ¬ù"dòn½—Är”X9 ™“  l´!o:(_4¦—ƒ9Ôk*v˜q¯NßüÙÀÒÙД¼ñüFÉçÞ;*¡•ñõ&8+JŸ<ÚC8¬FÅaß……£ÚG€}¿¡s(X;2±ÌjH³HDyŒn4¢[)Z¼8 =‚ÑÖ>.(Æh®lœÄ±“Ú ¢½sÒ¯!÷7ç@Ô ÛŒÝ„á®XE ž'ŠÚd³¬;7‰;6貉¢Va}QNwÖ ’(#×ZpèQ Q'ŒnGw®M¦ζ•QEE ûŒ=Ù?#ÕGJ8¹eeƒ¿Ñ¸ãr#Ê%56î1”ŠtIÊm–p;N•:0¨æ4—±±*#u«åd€f§qÖªp ¬Bð²æõ©ì¬ŠiÙöÉÊ‚Pˆ¥Cƒ\ˆ \” ~zxÚÿr°’0 ©ìÜ¥*.A b8à/ULV"˜Œ..¦åÌÚVª·ÊhfÕIÉ¿q–ë™ÅË™n ®½Œ*Æ–-ç‰ÑHJ~.’j&!.Œdq& ¢dÝN¸êP4[Ÿø< L ÛõT©Y±;´K$×üZ 6ÞN¸>zvCYzH8«ƒ k `ƒeðü,eRäÁøÙÝ5ZI% æ0hâ?¨hT°_EãTŽ s%Ù\† dõÚ¹M5Ë™;m¡G£âP‰ì¡ciÁ%ðÁea)¼à^cF §¹Yï  ²OMäÔ[ PÜu³pƒ°¡-Œ( ™2uK£aôKŒ8…8Aóg­À×D‰ªV<žÙƒ°ÔN!n,†CŒÁJ€­ Ѝq*:$Î2 µ¬=v™x1¡O¤†b…•Ò@¯u&÷Œ°¹¹Aì@ÞzñU°MÒ$Õ2@\𩇾ƒuè?Œ ,,Áƒ0 ÂØT‘ë•_‡tYBzêê¥' À§(ÃN‚‡›_Œ))4ЯcGo?‡U‚‚2š”è5Ä“bWêÿ5p²> 3€1n&Y«5Í)R/u²¿@.€ A4ê¬W/ˆª Gj¼ÃK¾óxµbnD Åkˆ+Ò1öeÁG §D-…(K;Ÿíq•ŸŒ2†[¢È䵊«ÁykFJfvà ¦M…!NŽšÌ®+VƒU“!ø‹áܶà•=œ2Å¥àÉ`Å ’âçÚ2ªÒRDºvÖâIb i$1g»îÂUo;Êôò¸†ØãÁ”p½R‰92¦–Üó†b,/ë„(ÌL¦a2¼”z4Áö$@îÜ^Ÿk®¢4†$ I`gw&T£™@4y"’aCPtÀÀ*¥.Eò°pùg•‘V¯v<hñÂÒc²¤§°¶ièJOb£VàÁéîANºÄ^Yl(P×CµÏ:Îè š‚7£³°åF)¬+Jw½Íý,ZE:oûô…¸ÔÕ±a~ q7îªU@µÖ¹ãˆÏéîAN J¿üƒ)ý ‹RèÖZ:‹O7ÅÄiTÜo»%ó§+‡ÅI„Ư* çXŠe!£ç /kÀ¼À<¨ÈŸvž"5£Ér. _-‰¥£Z.ÖÕn¦Þ©Î@³›TìÁÇnkP±ˆ­ÜÆé&¼åò°ÊZ^f#x‚ IÒµ¿…Eÿ¤™IîfV+¨ÉTT^_¸3çDÖO˜ŽLAÿ;Åñ¡Ï|ìPÍ=—fÞnT ª5¹¸R×Yþ®,žrY/ü¨T-¯ÕWÍðÌ$Tþ Ηðf¥¢x+ÇáXyЀ³n `Q*ìŸ<¢›/} 6× endstream endobj 20 0 obj<>stream %å„ä3;AW]k ]‰ö²"•Ââ•÷(U‹©EG¡n³g'†"àM:1§n-7i6;‰:âGT“šÚ í;HPµ­bï)+ùꔤ`O^@k%©bÙº^Ó{ˆQ,N~Ffõ@-VQÊ®yÕQ9tŒôŒ.5ºYíHÏìêäÓ¨äPœß?@h9eÁ2­¹±’I¦æ+Úèˆò;rì¥j[’Ób³¥"4l–ÍÀ•à*á çKÙãùöš±%¯ˆc¿T%Ne„5 Å(¿¬óÕe¾º±ôºÒõa' à„ŸÂL³GÀ ±rÐâÊ:2g{%êáT©Dÿ@رÖñRà×v#¬xó*G&¡Ê%†@85+V&¸$-jœ2U -*4³Æk »f˦¦…‰bë2g}ѽ\ëQDˆ"¡"µöC¶„`Mß|Ú}ù}nxïœ £_ ðjUÓµ°KH5s ¢j˜åDj ¤ˆ02 î—Š †,(ߌ½!Ê7a,|HT‚`EâTu€¦‘üÁذ#¡’ÊsÁ›ú$$gãO ¡Êy©ÈÕ ¬(8;o"–1dé‰"}RP¡‚“iÐQŠ¡¾2=@….ÉlU´0¤j Vôö5d”ÂhÖ¦Þ)jœÌ¯y.Y“Õš,𹽊ÏWuÜDg*/Â4Ól\«4¸eM¡\S·|]œ©°S¨ã«F_éÑФN.¨ç&dn°²B'Žœ„š‹°XŒ?LüP 8ÎKGEç©8=·g;>Z€ç'#£HQÛ…š0‘\„|„cå8áª5¨žVsôØjwDëÐMøTé¤BI‹› XÚ äÙ –Íb"$ë~NØçŽ+Ö)¡½EÛмoFÌáN/) g9EŠÒ[ Ђ߾VÃZ’ l S¢$£s{ñ¶ã¼1ªS30¦œÖh±V‡©Á°bKíIÜÖɶÃöuWµ6‰ hâUWá˜Í­Á$Ò:…Ù¸¸ëZõD‹_cS€C£á´ÌÄéf€Aƨ›šhµÇQõͦ2Œ‰B'”x3Ä[Ô£Ï ƒv³+D×%!’±(ä,B…ª!ò–´3Ä ˜äÞ1’%5§mB2ø(Èm¼.¡å{œh?G÷åÝ›õ¿sU¾ÄxV 8jÃ_ŠtJÄœ2CÚ,)ŠÙŽà&–Eeº~$W£KÅgìarŃöY°´hZøz»Yy 픺X*bÐi‘Õ&þ¨Dd¡xhjÿPÙÌOZ$Õ‰!Zp\Ár”´ÔlŒ§ï™Ôôë„TÂ(³Hê§ÙJA`ˆŸ\9Ь*—\5ùU p¢±Tg;æ"ÕkÙƒ;^qé ‘ãì®Hœë¯ËÚÉ÷„£ÅJFZ`+ã.ÚkHè€ÀSå´¬ŽËW ý,Ôg$Ôj¤'Š‚½Ä.Cí8FªÁ—-díôÍGY­]ãîTk{WŽMDÕ™]TymV}•IŸ€|ùºÙpj´í4ÜBœQZNmïÅ+öÑkJ¦7FXÂ)_‡O¤£ºÄ£¹Iqšä«¬î¢_*¤ˆåTJå¨'´5ïBcºœ©G¡ô¸ mmÿêaàU¨îWâ…}Ëä™rºQse/à&KG4¾bú“Ñpf!8¥G•8ÓöûωZÀ]”Ò¨´b²ërF:4è¢%‡Ë(R%\‰·=Ðv*^Rƒ²áT{XÎÉú©x0!{¤Õ®Ž¡gʰ"×¶Š\˜6Àbü‰µU±|y®û;á›otÌtÃЕ¢³³¶Xe-°ûÚ væ<)£}–,"Ð ñà+X›ychÏ›„ˆ#5”u;á£ínUÄO]a9–¬Ü³É¦ËM&ë€UL [K¼&L^&&óSó‚%ú4tÝéèzMgA‹:¶/µnÖ¢›¡^Õ5¦¹3|B ^îº#¡æÉ¹Zœ†ðŽ®N_P2ךn`rílª\ÎZÉZóKLõûغ ø‚úÜ„+ûdeÓ¦7(}#ª*ˆz>SQ³'º#X×(TcÃ÷i‡šd§ÎÙ±?ïÙÊ»¶ü=Ê,_Ö#Ôñ^SpÑŠãhH'¾sŒ¨ugkÂâØIì]¶&€$ ]82Y¨‘dÊyĶG(­/AiimÀ™VBÕh¦æÂË™V~\Á¹fe ”×g³Ž·f`ˆ¦¹â`™ä¡®{XÉ1³Â!Ó0AHàÊ!ËŸŒ¼‚6”V#¿€›[+‹ò$!náåa‚{‚úµÜÌ#¦}ÙEåZƒ@²f´ñýÐÍÚž“å#EšÅ[¹‘ÿKNHT´‘&Y-bä µ«*’…-^gz/™Â’ o¨·¤„àŽ9Å ÆÑÆ’=L¾ØªÀK˜ª‘-¡è¯Äb”D&¦8*}FW†ëêd9ÊV›L>2òM*TاéJ#ä Ò<ÄH@Šú\mbœeÕX«¨Ó‹Ôð”Ydï¼ xbÌ*çv5RåÉâ`¸€k•ltû4ݰEÄÙaµ¡ÿá o§-¸Ón¼ÇÆÜiÞk¹î´r·íá{lçÝvöN‹üë}§¥¿Ó'¸ÇØékìôJîñ`v8;;½¢{¨¾Ö=^ÙN®‚|ŽÎô;4N=:H4^â­®(jSUy;öéTPŠcP@ÂaOí:5w°;â{Ží]'üNSà³a§‰±ÓÙi·ì4qvC÷N;¬]æØ=¦Ûn3o§Axñ¸ÓÐü›¯;â{ è]¶öN£ü~‡­¿Ó)¸ÏØélìòJv¨Ü{ÕóNE~ÒwrÞJ,ÎôöÕbefhrõû|èþöNÏ|‡?O !òíóõFîöY|Ï©½ó„ßi ì´î±1v™#÷Ø-»lœöÐnËé+k§E¶Óv»ÇÎÛiî´w[š»ŒÒÝÖë.3w§=¼Ër¾ÇÊÞi‘ï´Ýï³ówú;½‡ÝŽFF/==úò{ж]RŒ¸5"ZËEÓ]¥—¸\+g™ÊŸlÝ-b\jêƒÍ0U àÅÕ§"öp/& ¯á¤ jx|@~όɳ½‚ûÍ’|Q[É74ÒîNÁn!Y>­ ãDʆœ+F¤Í™ð1,h¹Ó8&õu4Aº}0èµ.¬s sV+®¨Å‰îÂdnZDBÅK 3Aß…ë“2¹pë<"vT“†æe•ÞUA]8ö­F€8@•ðJ”²Ñú‚û ýNÁN÷a‡«±(LÑ—ÌÃÅ)Ò;” ÐMU8™zŽ©’@}7bYÂÏIû;‚›ƒr(’z¢^[H‘ªÑ&‰p‰ çÈ C2Æ’T‘,dXmŽkO$w)Ô´äê’ ñ.)äE*¹ ÆŸZYhöŸ–ŒPîp üÜ#wILûɈ…»K W@ç_” ZUÛ§€þÈZBO‰ˆ áÔf$CMŸÝ$pŽlµ Ú ·:+ ›Ž¿h7ÀH}Aú…7›zô(‹£_{)3îT ª4.Ì#+T‹VÛHDÊÅFÚZ¶_å& *SâS*[›½ëáŠÆmѨ!É4¸ß#b Ýä¨!ƒ|Y&Ã-h)16¤æ3Š‘è iŠ á€º À zb¸¢¬/yQéù; ¸äM+•³úš¨´ ² ”¦œ´¸—Q™³™ç ”™–Î\GRDj«¨R±PÃ¥J®Ü‘ +3H) ¢ Í^B™š¯F*¿½7öúŒïßQjrîP€÷¨ÊZu·Þ¥©ïQê÷;ŠÇÊÎ#hçaµû`Û}î:-w¬»á{ëG»“uÍbA¤“P•,Lf4^,„7F&{€z™¡}IBáÛ*̈é@(SЈi8ݹ¶£ç™t •¡ ÐæP—Ò™Ò¥–:Ý) };iK&éà=»eçÆÚµïÙ®»·öN%p¸G¹ìTC»TÖNõ¶[Þ£4wé×]Šø¥M­ü¤Æ­ÎD}%ÙõµÙS…˜ª7"ÌîõdxE‡? 5cæìB·Kµ…j3 Á­9[ÁÓ&„%vÙB;í¦ÝÖklª7?Ì\êͦW;Á¬TÕ~f j'Æ<=œ7Ú(M$P‹TcX§i“ÊÃ@áIÆT”³Â-Æ‘Y=~ßkÄ•Œ)£Ñ©šˆ•ÇUý@CÈ"aT«I?W·÷"´¿²¤©¶²”êFY )Î.˜8o‘_ª¥Ì6}¤Y1¬Ž)°øðÊÐ ×:èE”t¥n~òN+o§E¸Óv¼ÇÎÜe“î´^ï±twZÅ»íçݦöN«|—ù~¯¥¿íìôîó5vú%ÛþËnGG(;u#Zü ƒvÙÖN:Lý±íE&Ï{䎥{Ï2ß¹%vmž{6ÚîM¹sûîÞê;ÕÂnr²Ù©˜vª°{Ô]Ä:ON=eF Åpc´i%2H‡g®ó ˆR)D’–0´7*¸몵  î£ÆvBàÞÂóE›¼EÔ½ cBkC€é¦÷j™!p½1áPDOìW7q¢åždÁ¸ˆJMµq¨‹^²jœŠ#.9ë—BÂŽkÑ’ŠÎo±ÒHèóä *£s˜*T x;ÄgÝGÒÀ7~ ó]3-"Ôf Æ‚S º¦ˆª<' i°¸`ª´°5Eë Dç»þ¼[’h!õ•’AÐÏ‹ˆp§8ÊÂóJ—`Ñj,7¡«¼Ry9™T•Û(5XºfMj´ùìRõ$B@f·°ízY-7Ž`ùge×Ä{¬.•[ÊÄkX*.’Íp\¸˜áv•0ûIÑB¡ó4IªLx”,ÖélßV¸7_Ø…Ûò•jZM0-Ã?aXë<ËlNE½_Ô2ôòʢĨ[(»YLWÝî(¼ªT(¢£A´pXhARÑÖÊŒÍעѕAPú³Ó~[,#GŸ´´»}¦¬ŠSã|iôCì ÒÅYͤ0ƒÐžµÕC££ó‘X(S¨.Js†”úJò¦ÝȸIs+19PÞ~Ÿ[Ó0ŽŸÉ,ë¬-½«—2veQÃ0 Q®GÑŒè4H‰u-wÁzËÏàdТS‘¦jÅRB³)"Fp®ÂEì‚G¯ÍêÚ òŸØ©]ôà÷ÀÆ¥œ€Û'Z3èÝN¤/Wç^Þ(å×çZ®Õw@Ÿ—áêÕL4u÷vNâ¤òj Av‚NÙù!ÏÂDg2k<|áøýØô‘ ·ª ÎùQ†¢+gv`áî”ê0äN„JJy/udæº¡Ž•êu8ø*E'!%‘ÏyijN¯ìQ9[qufe7À¤éŠÈJ¡¶}µ×ÔuT’ó‡%›±sÊ^}`ïraQ”(gœ0É@|é@"Ô‚¶Í[j7ù¼²ÅͯÊèS líütë­&…tiè6L}Z¡pË“$xy…4Ùß—{%óÌhÒÄ]%!ÏŽSú=Ó‰OT”š.×î˜õ­9|µ¡ºî>#ÿÚ4ûªEÂði¸X\Çæ,m¾ä”ò££=èîϵÈ4¼q[Šï·±·ÞC´ôݬìþê“x°d©wÜÔ ŠR[/9SjsUدt€\R_Tö‰¤™cº£ØŠ¶fº«[©0b@TK13o©»ÂẸõóZ}…SŒ›¼^m=9 ¤O4ûWˆÃ¤ëÌ.Û˃Í0SU— ëÝž[¨ËÊt"´ PôµŠS8œ ùÓÍoA°‰ Í7{Oš[й©ëtëèÈg£Xs«q7n§_Ž<»ÙG"R-ßÙ¦ž͸/œ´}ÀãânÕ·¸õ«˜Ÿmû!øn§›«•R³ ˆ µ¶%¶§#1: ®CDB=îü jp{ 7 pôKPž†Tf†åŒ$R• Q“¨¥­ðz%ÀµÍÂ9£Îb0fŠžÊï‰#fžê Ê@–_»¤V1Ô‰ü$P»”p˜·LÈX7bæ Ÿ­vW–¥]†÷è´EäÊíã© E¢9­NÛAçˆs“D²§¦¥íÈsQ8kMu, Y`æz å¸ Kç3Ê[tÿ­£Ò+r€WÊTÔ’õf ¶¡–‚àf'Œ¿n.¨pv€ršŒ‘7Ë(;©6‡èl¹ëÒ“ÑY4ò¦´mÍv p` 9²¿º†ù&-ŽK@É“EVÆ©ŠÕ1áÆ6V_¡î+6^Ù»À]~0®:Åĵ¤¡\–Äú”_€ 4‰ÀÅȈ/ây(9š$=Q”‚Øcì×ó_&z„ßÐØÒM"êyÌl»Á…µû+wœù½¹ƒŒ«]n&k¿Á(UL5¥dUƒÓô½È”€Þ;kê…yÿ•®nD £òœê^ÿe¬ÄjRV"ÄŠÇ zC‡$ ÇCˆ^.aéD¼  ®Œì\Ÿ¼¾¨:¨BAœJ}_ìüy)ÐÓO6/žf„Æb¿ÌÎl”¸ÎîÔTdd­ý0•„“ýåýîúòÉzq©ª²n®Æ»CÀiÚ>BÔ 6unV§‰ZÌ+¿Ù´¦7„l·n W§‰B¥§M£”®„Å<á4Gï¨á+‘ýh ¦*{ªãŽ—óËón«f>Õ£(sËêhäŒ'.•Ñ&Q¸T„(’Ûø½v‰5óW.ÕÊ’©þXžt±À7æE)žˆP"“d;wiDÙjiþ²9¯ÄHJnº$Bm*—hç—Us‚ŒýbYÊÑ®5Ô]ÕÊFCño}3¢T~TmϬ\^•¥´©ÒmM„Ú㓲Y¿W;—é^ ÐÖAó’«a”}Ù ,‰¨ÓLäiIiF—* û5hK]24—­§êRŸ”£ÕbÕ¥è$3Íw17e=Uq‘€·£@ B¦;-0±^ ÞœÈ,®ó=?„F)WØ€F§deÆŸªXƒÚTR„|’’D²° ¤è‹2·cz¼¬¼ eBh;Öl%ÚÁ·q#¼ºó´òûí§Ò|ê\IwÂC…¤°×KEÖ¤ ,Å£¬§ Q[ oPäíT?Ø8D£\Í@žÍs±sX&܈]ĆâžäÜ,KFÅ2î\4]V µž—„ê",Â& Â;j b¬P/dÖilðõ6…ª­(bqûåyÉÍ [Û¬wÓ2BPÐæ4h'{àóŠœZe¸ç Õh˜—g•ÕŸ«X>=áe„"¢³a]tóµÊÚ®f*mVŠY알óƒRá¯"å‡ZÚ¼ ‘¹¶zSûh“¯»ªJ»¯bX ÿ2ÅEJäÙUw$—½B̽·dÿªùÍYꨵ0Ô·Õ¸ê÷yÐqg@—í Õ—æx¾ÎÕ¬oX·L/Ú3#³%lbAû6‰Ï?ÙØ„K;œ”Eù°M ÌÚª{Å=  –ŸŒx9 Ÿê†  NU13ß+ ùd'íߤã{’R54ñ«×7×Y+«r°EÝæþUÔæ¶B<šlOñÙ‚¡CÈç•BRq4µM[Gé–i]¾Ø|0o­ ·wÞ‡Né@;©*g3·±½Æ–ÈÍ/ë ;Å É®>Ý=ÈÒ#£ýO{d0%³Ê6¦¾ñ‹øtS\ULݶdþ”u2{ãÿú›újI:¡8…Y¯?ùü“_|ñ«ÏÞÞþæòüöòæÍÙÛï^üóýòDRdÕÿË_}~ûöòÍ_^üò׿þìüüýõŸnnÏèÚxñOãÊOÇð)Ê,êü¥~œÁ7Q‚^Þ…W’ʧxm1^ÛÆ…f¨UG4½œÈª¨ÚŒ•%kÊÈéIÁa‰sVË·-mKi³ˆúbóE„ÊAÀXmSÊ¥[³FËãV{³±×üóÂÈnÀ‡‘Ll㈸y¶Uñ’—ÆÖÍÇR<8טۑMôúª¨“‰ ,j`£Rá½va.Ò”ñ„K0µÆ¨Y·ÝáŠ^*âpÊQ‘E™(%‰ÑÙg¶§Bø7ª¦8z• "A%4]ÃËŒ÷Wä¤ \-á€-³)£eHèÙûÝ»6#ú:”wÒk¨Ápúl!ËP¥ Ä“Ö²P.ÅzEk’›¸ij‚2 äýÑôq 7ï#®Pˆ1Z[BrUKë*Ô< %;­oeŽº×£ HÐà’PÓ il’ ä2á;ÏÕi\²Š@S{k0}Y ôK«˜š¤¤m@úãÐy¤Þ™¤_¢\e–PWÏ‚Z­Š(•QKBÌun1ÐñF©´«æd VÔ„ÐÓªƒC™)YG5ÍÞ2š§ä¦éëXB¤I´"‹:Vd¦AÄN».ƒ¯|â7ißG” ÂÝ‚”ì±°* —ûMf#)é-‡|9æó_N¨Nûr"²èb™iY‚ò vž®ÕíÊ\䄞òÍÚUí=¨ˆE¹ÜøÞ+Ü@‰ž¹™}Ʀž¯<õ”·²õ‹žÞºÌMõ´n¬›¥Ø–þô¼oº"ÐM“9@’æ~¡@‘†•¼XDyÊÈTy Ï)C­vD{DÐT$áf»vz[A,R: ¬ú)Cžè¤Y⣿$$mªi¬Ü2MQÒº›Ü7Y¿zlh¢™DšÏêõZ¯ Mh¶fg@¶WLÖ:»`µ4½qo2Í›zËÝ4‡ §S•b.]«µÕ’G4±“Ä=ÒÒJ_ABkŠ 2þ¢QSÊœfÂH¡sdK&¢E§U@6I›‰ÐZs­?zo'Ç)Ò1­T‘.Dðmös ©ƒÅÐç­ôp ––caчRr¾ßþX6Õ.#çÇœ|L¯hnuŒúœLD=à°Ðø!¼žUØÕEj?γí´]c]”ó)J!ŠC)éÂßd‡Ùü×ÏÎ%O2l»íî(*“vÈç ¾«Êjúc=ÈýÎK&á¿¿yóÇ1ÆíæäDÄìÓ¬ÿðÉï¿¥ñNþéóÿø×ß^^a>ù•ýq<Ú¯þów§¿¿y}AÜxæ{ÿáÓ¿üûõÕ›ñO'ã±Þ^~ùþöâ=ûxí·gw®8ÿúòêõÛ ~·ðâWÿöævþýÏíwß^пýÒ;÷‹15ÿþæò|ˆ1Cë¥=»z/×þíòõí×ß19stíx½úŸù¾¾¸üË×·{¿.ÿèï´ÿ}·÷Ë|÷ïqóåÿ¹8¿ýõÍû7¯Ç£ýúæïû¾ÖW¼oÆ¥·ïö~Áß|ôWýìß¾øìêۯϾðû¾ãåëEGÝóNtͯ¾|ÏåEþŽÿûý{(jòöýÛ/ß_]¼9¿Øw*ä§{Îîó±?ì°´÷}Ÿ/ÏÞ]üö펓°¿’¹ó«þ†on>¿½¼=ÿÀ©5ßò_ýçË«‹ýõÌÆo>ú†}_íÍûë?œßžýõo¶þ䣿m¹}ßííÅ»÷WûŸã¸| tÏ£ûïyôÝZ|9Ì.þ¼ª“ïØï™÷þ —o>°.×3®ýèËëó›÷oÏ/þõíÙ·__žïÿZx«Gx©=ß|“›o/ÞžÝÞ¼Ýû}æm×¼º¹þöæÝåí>›æ§x¶'?xï_ýæâ«Ÿ½½Ã{££·wôö~jo/½½/òļ½¯Þž ³÷ê÷7—ïž™¿·w0âè··~9º{Gwïèîݽ£»÷3v÷Ò³s÷ðFOÅÝ; ÏÅá^Я/þzqõù×g¯oþö 2_ù4ÏÖ’£“ÝÛçrp~yõþGá`lªgðîöõo.þz©Ø—½½žõGfüëÙûwï.ÏÞüZ>àS±¥²Þ}ïì½Î^ï¯_ÿý^äæ«¯Þ]Üþúç¬ ^ïoO¼þî·ýøS7ü£løwß^œÿáý–ýÓÛ$Wdîóüæêæí?ÿíkñ4÷??{ÈÝøÑSòMN¼ÿïyxÏ'ù¯ò@oóãûÍx—ÿÞû]þûm?Þ\¾¹=ÕÒcÄ#/>W=tª'ײ‡~P áÐs 4ŒÝÎûHÙ„ÃþHO-µø$É¡(ƒï›CWÏ2¹xööòöëë‹Ûýßè)©…«ËÛ?ž]~È xz^íÞ>ß7ûoªocOíÿ"qÿ‰ð"{›Áß|à•×ñý"ˆ?®/’žúÙùt|å‡Ç»|D=Ò‡üÝÅÛ¿\ÐL>!#è¡Ðsü?Ý!C?ôØõGÈЀ =à;èùóªyussõë·ÿ½w¦ép¡QyïxDF=¯ÿõåÕÙþyЧäñïý‰žŠ«¿ÿš{½ÿš{ Uâ_îMbðöìõåûý>.5ö/÷7ÚžÊáº÷=øp}¤#éI²(<à3<Ìéùè±/?€y‚Û}ï7:t[zïy÷°7|ä×ùÓÞY’W_Ÿ½ysqõùÅÕÅùCÂPÛ?üø©­½“‘?ô%·øhçÐo.ß}{uv~q}ñæöwgß>¡Ãèúl µw†õ)xGP{‡~$íBx2GÒøøHB+E÷âÅÖýÆ÷}cþÓþ¾.D¨äÕÍÛßA}<}÷€xèÚaoÏûÉh‡½ßèеÃþeÖ‡xåPvßW:}uyuõ ×Õ#|é«Ë7g{£§‡Ãqþ»›×ûÛPó?°÷³hI`|>¾f0Þ?†3²·b¹½Ùß¼½9dÅòÕÛ›ëý÷_üñë0÷V~ó½ìö¿çÇßóïüêãã²®þvöÝÞûiÀ·got`Ëõý½Þ^°Û»÷Ç{ýúòöò¯ønöƒGÈA½Ùÿ½¨wàû‹Ö7[~òñ—½—â—Ô¯pÿ¼¡\ýH.ÉÙ›Ëë³G£†}²5wü ?Âãçü~ºx¤›?}ÒÆÏþí‹ß0ÕÍ {ýHáíC™†gIÃþ|9Œö:?gžœ£Fû~VŽí¨ÑžˆFÛ{­5ÚÏQ£ýËÛ!8šhÏN¡]Ðw}Žúìh¡õÙõÙÑ@;ê³'¢ÏŽöÙQŸ}>[“:_<,[ÿÌÔÚÞ/ÿ3Êá·Í>Û¦þœ·ÍÞ/Ü6?ómóój{ôÇË¿_\ýñêì»/Växˆð–ì^ä½qm2óz´mùÅSÒ|o/®o>Têÿ´¸^Þ}Kl/û¾ÑSâzñ/ü§Á½ðyü¯{1þûtüyüßOÇ?¼øÉ›½Fï1Ûì©Nž:Êå›×_]¾¹Ü?IôöâÛ‹³Ûß<à.¿øèïw$ˆ‘i8ÄØ› b~l'a‚˜C±¡ža7É/Ðlü© õòN‡ŽÕ?,]<8µtèUóÚ>®Þ>ô|O3Kv~sýíÍ»a}ÿáýÔñ ¼I'¼Â;>9…ð@ûàÐÕÁYl‡®ÎÞ^Þ~}}q»¿Ú~ªêáÙ±ðíýBß쿱¾yŒ}µÿ‹|äµ¾H| ïtïùÀ+¯/âúE>}__$=õ3ôé¤8~Þ;>äŽéäc:ùC¯º‘N~©ß!F`Žéä]³òüÒÉϸu­`J(÷éƒVó1…ü/sL!ßë¡SÈÇò1…|L!SÈßë¡p¾è©D)äc ùàÖÙë×—_}õ~ÿn&OE<ðµ]|wquuó·}ßæêò/_ߎ?9'>Õ½ßìîÏ7¹"Ëêó1³oüæp_Mî«›7ÃWx³ÿNÛúÝÇXì}b½ûÕpFöù6t ºƒn?žýô/o/.Þ|:Žù‹O/ß¼¾üËͧ½¼¹º¸ýôíÅëOoÞž½ùËÞßóÉDãžS«â‡€ÇÜ>gç1$÷ã ÇÜ1$w ÉýÐóªí;ûïËë÷·hý¸®/\ÿÑWÙû.®Æ_òY~ñhñžß\²srJÇóc!b~#ŽÒ©šOhÉ?§°Ó»o/· û1°ð=¯½·#¬“ð`gû‡à/<ô-ÿåïß»à¼åüá#i >ƒ Û1nsŒÛ<õ¸Fi$n£Aßã6ǸÍ1nsŒÛã6ǸÍ1nsVÕ•úþÏ"- BƒP?è>W×ö F¡že¹üGz„íy’h|̸á#é§§È¡ñP¸ÝÁ+„gÙ€âyh\]ÞþñìòCñå§—OØŸààÀ¹3ö‘çÎØŸäÈq<;ÛóÐÏχ*ããÑyGç‘wêPÏÎ#ïÔñì| gçÓIï?Xç9§òtó#çÔÓâœúüë³×7û)ú=Mtdx¶äÞ¤hÇŠü#4úð.{7 }ý£a…sýý^äæ«¯Þ]ÜÒJz{ñúAêí©¨„ý?Õwûªïqûÿ?ÙÏÃøáËó9z‡òU>Nâí |£kvp®™Oîû.É¿]¾~ÚK¯þøaŸÿ}}ñaèÞòJ¸ü£¿Ó‰Ï{¿ÓþÇòwa@ýCOŸ{ú! pþïÇ Æ1¨ñ£¿S95Ö~NAv j<•°ÿ§:5îØ=5Q“ƒÇ Æ¡5~fNæíÙ0|Ï1ÛüÕÛ³óÛ³«ßß\î_¯!?ÞóãNõro"“/ÏÞ]üö펿xs¾¿ sçWPýùíåíù‚Š«ÇFWÿùòê4¿ùèoxþÓa±–êÍûë?Œýø×|¤õ'ÿíŸ{*þÎþoôàrô§s*ÉŽžÙÑsbüq/÷ntr{³¿ rsØÈWoo®÷ß?|ñÇvïo$©˜ö9ÞŽTL?þ¡u¤bú§ŠéQGûSý$A£?¿ûåû«¡Ûž^ñ™q¯<Àþ>p¯ï#Q®Pýdû/Ág‹»]í³g”¤pÇ,ÅÍÓÎRìyj¡}Úr?ypÿ‘Œ×£»w(îÞCVÙÑá;:|G‡o×ò8:|G‡ïèð©Ã··I}tø×á{¾¸´½YŽßaz|{À£ÇwôøŽßÑã;z|?[/?;ïoôT<¾ôùž¢Ï÷¿nn^ÿåíÙþJø`¾‡¬Àgëò=Ë&+Ï‘%âALÞ³oogîÈxqd¼8Òxþ/n@ñóRp?þŽh~H÷ò§²IôR‡¾G¾ºž„t™ÿç/¯Îοùô…ˆn¾=;¿¼ýwûÝÕþY½úÑ6Óoé5ŸÐ^úŸÚz`ôa[êÀíçÙoöù?ï˜vóÕOªÝŸ@8ûPôÝsrØø©ì˜‡6;>p[èo_? ðùJÖŸìqv-/v÷g?‹ñ°EøùùÙlºßî«éº}uóæÝíÙ‡Zs®ÎßÝß}ôWÜàõîýÛ¯ÎÎ/öù6ô”è¼­~:úšNF¿÷w>ûïËë÷HžÚõý¥ÊÞLPWã/ 6/¿x4ë7—¬N5ñû¨ñ ¬ Nõ9Z{bíý€>ÖOÅâÛûˆÅ<øŒÝþá#@ûú–ÿò÷ooÞ\ü€·œ?w+}” ÇÇ&sz6\xöå®'{»ÀGzŒƒ[d‡Ÿz|°Ýzèºíy"ù(ß@ ðÏϘù)Â~Èw9ô´¾ÓÞµšOå8õû7=?Û};=»ÓˆöÒ~uñö·—o!¦z(ßùöìËý¿ñSh†{'øÝÿãaa°ß<×û7çzBÚäÙ­²—õ…{ñóXgÿz\g¸ÎüÏEýú± &ììPIùŸßž½y÷Õ]$g½ÿÀrŸC…ü[íÐíÏç ‘Ex võ1¢_†‘sŸ]]À79”)ùa‹õˆÕ|È<ÒÍÔþéŸý›w_üË›×ÖŠD™$_üþæÍÇÌÁr"â__üåòÍúŸüþ[ƒÿéó﮿¼¹úä—Ÿ½=ûòâݽ¿xqòbÈ®/ƳœŸ]ýÃ'îÅgã¿ÿüÛ'ï?ùÇ÷ã=3þö‡OÜË{ðå…{¢5Ž?´ñŸ«)ûß|2ÁÿùÝøËÿ=þð†èo/Ò‹ß½øÿ?÷â5 ú§ONjíñe¯>¼h¹û—¹„üâšÅé¥EÅ$Y ¡-—Š0ùžD˜Æ#óÏûKç*]Úèß]—6W^:ïâÖò²‡2ß_æÔøÂñ Î5þ} áeËΓؿ¬¹7º6äqÿRIHÿ\ ÛËâJÒ;õq§W<@yÙ›Œ[_¶æºP# {xéÇU˜|Í$Ì/snEŸ`C,/ËO ëË|~ñ¿?YÅÅEš ¹Y}Y:MAqíe*oýËÞÝx…âÇ{¥ñ´|³HóÁøqÛ"O›Æ}}gayéSâ'ÈqÌ!}®âã˱м.‹Ó*Þ)ä§ÍãiKåg/3}¥!,~¬¤éiûËž2œ2&TÀåñ¸Y /£Ë4€«/ý¸Š®­ýeô2ã¹cæ/>>Ié‰çÀÉwæ×âꢇؿ€Œß–dó÷ÕÛïÃx¾Wø}àI¸smhykИ·îßÝKïKųz~ÙñE}Èyã­ºKc‡tgúø¢¾¯´ÎV÷ãÚ"ÑæµO76E^¾=Ac×ýµñm{?Ë%l¬‚+íõŒ3Þ‹ŸàŽ˜7Ø!}ðžÆ_bè+±§ñ´]¾­­Ù)´õÍ7#±aÙ §,Žãëú¾±z /SŠicãõ4övÈáÎ&¥q½£)_6tOåå¸*olýžúËßU½Ð£Ó7Ÿ¥×¡?ÕT=½fÝ6«–"©w¥o(4Ž…–WÍG²”{^.Äï /ë…5/’qïêR™ÏE1YDEŽ­“Æ~:5±ë"­zÜ?¹¤Â±ù t=ˆÐ¢5žÚu`¬¸Öê ™¨P2=CM/ÇÖᯒéÀà¯RëËN ‡`ü©ÙÚ^ͳ:¾õøE>€/MÖæø*©{ù~Žö‘¬Í ;1—f_`ì?VÕfZ¥‘5Ô8&Z­ô^y\ÙÆF“ý_ÖÊzzˆ{×½LŠ>Ð͆®r]”·)ˆ\’ ‚Ö[-›×Ò×ÊáΨeœ?¹ú»O0td¨>o>íÐÒÕ…²ñ^-ŒÆÚ¾3t$´È«hÎj©ò2š3K'`̼ׯ@‡¥/qó‹;Þ˵oK'° òË:àƒšeÍ,§ý\],,!-+ñ• Ÿëöb[βÄIÖ\†ñb§YqþÉWÃèøÍ'¢åó¦ mÌÙ5‹ÇyU2é)ï°›}ªD+wUSC7ïYU':ËTŒ)Ë.&{ç _;~æ|=—DZ#:q(ÈV"Ÿ ãHv.©²–3h,õ—UþøfÑ÷&ºo|²¤ ¼¾f—NÎ8âDÿŽhòÑ)–‘k„FçnÔ=24"?8_ZôH<¡:h«²Éi¡ÊJ*9Mz±¸¥E|º[|µ-n·«N”Õø q9-X:vÛX™2‹c§gW¢|W OW$%{ù^ÞušèTÓ‘×è%åÀKOrO½ê„­u@‹„LŸqž$~ç¡Í»‹²@†E8fµénwí¿2”?YŠÕË®ç³oA„cmwÙSc'ɺ!µCNj¸$ÏJ|(ɱEyS޽¬‡P)¤v²é•Z² 0v‡å“ëKO[emlO6ŸëØÙ«ÇÊÝ'Q)uÖ cÛ×ÊìØ4PcÇ߆4T¨ú‘Ì &âZù;’0ú–ÄÊq.b׺š>¬?ä Æsç {dø2ôG1蜌•çpXAQl¯0æ°ëŒïM E÷²¨ =¾R̲Fl¯1ãÛvÙ8)VÕkC܆e*ozm ¬¯;Âq¤“>À*nã òz3Z&YcÓQÇ£¶ZÔ’H-©n_4x>Lk“MÂñ0!êYÈG% Ç2 ìÛ aÊãÃËt¦°12ÄÅw~‚Ü¡;hŠÅ‚Ϥc Í¡½õpi0ht9GƵ®‰Ç3-vÿL–:[-dÈý‡¸™13]¯'l' #ošý¬Õ„ã\ó",ɛӱ¬ô´‚I?6ïÐøA¾ªy*ãSË~_µÄZmŸà1Žó©«W3fÖ>@Ĥ$ï½] º®Æ ûŒWÀ°JÆa¢O2ï7U5ÎЀu)m¼d@z„퓱.y}ˆplBµæRèuSØÉµŸCD剰F¶É÷%¼Àà™.÷«J ¬±CÖɪ02ÉÔòó»ø®;;Ò›bUˆ)Dbïõ ÆVn¬ ¨†±¬M+ ‡ÃÕ@«QÛí¼¨†ý4NÞ,Oàÿ>íª‹jœäê­¦JúH'€½~-‡ê1 ‡±ç80TCIðléPU£kœúãèV«-Q CõâÕOáåú û"’¥U31 Úpª†#Ä»=‹·ó€’“‹ì‚qÕ;'™ÄÁóFœƒÐù9•°q;òáÆ¼ódôû~÷%ú0=½»óº=Ðøl"òÔèÇ%3&¸¸Nã),±Âwã/Á‹žm£8?Y†•Ùa寛E‰˜ãøè"÷Âòh$!ël+ÉWõ¯Çù×7Ö\gë B[Ÿ µÂ_‡Ö²Ôn[CßXõ$”ÀÇæ?+=ßÙMt¼F_7÷Ý"œ;t ç^–[±§1w}§ÇŽ‚üZ™¬$:hQ&lÊŠ4µMàô®†"qIÑoh32CëeCï‘P,3Ñ‘IÝe×åÈ_õ):|˾¡yéQCá×Zµ4¿Aà§…^Œü=DQDËéÐÙTÏuã$!ᘸ´9$«IN2=^éÛóa=ϲS¥à7Î=&øëzB²°Âº¶Ó´{²]æÁ+F79 Ží·yD“Ð/ó¯Ç9Íj !¬'?}€û¦‰@kwÌ Úc¹§ Óc,ÄE7¨‘B‹-g§ ˆŸJfcVŸÀ*r¸ŠCO˜IÁo 7LªE<Í/Š¥ŒO£&Õ¸•ϱÝ5ê(Ü[s]í?zX -†"íŒÐs¿kT²k%qºi€’þ¢IÞ0UÇËÄä·ÌÚ!Ú£Ý1³º~Ær¶ûÕ†5Åz2#œã^7ÍõNÛŒ¯ Ó~<íPuià ׮”¼é.ŒG“éïºô{Ïß`qC†ž*!n:,¤£§9Üpnh¦ÀÚm:BÃaF|Øð˜vQêuÇÍUœ–1Iô³kš ®i35ŒHWô¢jsJ/6‚1âŒø¸¤ØbN—Ò¢nDXÇ›.óÛâþòméÕ‹Nx©¹©ƒV„GÆtWß7€æ›<ÚWº8Æ‘ï\Kq^Éë¨[3 S£æêòÔŒxx¶mÃ-¦À ôØXBøÚ%ªc»I`uqâ)§0¬· =î5ü\ .”Ty#ñb /Ѳy Óˆ “Åedt4bAÖ•—ìIg›^÷ó0Ъoú%«:8C”œ6"&dòåê]y¥JKU·îÐmAMIÖ„3jóŸˆ=ŸbËžñÇ¡·P=ÔØÝÑ‚¨/s×µÍÈB‹ÃõK9lÄ v|DúºÿøïȬI,m¨7=÷-dÃtµQ¤›|Ž]ë—kE؇)®³ôŒ |X®€ó’9áßPùEÿ˜ÖzÁ‰iÂ:žÝ)IGY¤{¬üPÅ9£ c—Py´ØY…5FY¬ ±Ô$¹@K"vÉ&…1ÍrÌÑ1¯™œ1jo±ËRþѱXO$tNÍ/GÆb"¦eÑ5|:Vuàà ¥!:…Zé›PΣá£fèó£„R!¼1ôK³±@I“a ‹ßLë®ùÒÝitÅ–5ñN!bÃ÷"v”õ•Í'!/–”»:N½§"ÇTA$Ÿòac´‚±+g,8N2;‰ß2¾H(!¨eŒ<‹«WÓØe9þX(G¥ß Ù ù0’¶²}iÇ~].n=µ-y-ÇGêÆ[‘U2̰~gø´é’™´Ù¢ƒmx­iVJ‰5ï|:/«¸¯ókÕN‘ö¶ù]ùo=ÝY,æÃfY/Ë‘?W %ÎŽUøJjköb[ʺ¾-£"Û ;ì‹5-Võûº¢œ·¥Å†a%«M=¬ýñ³æôU] еipŸsïðœ]uMÄÅ«‡Ï&zPmüHÒbÃω‚¬ (©ì(_-’ßÉ^à{B§U±TW--Ö%QÍa&UÃã’|÷÷’2JÃ)P˵i‘öÎðuõcx=†¶¦ªàRâÃeŒê‰’‰øê·E|º[|µ-–”0 YÍ2‚Ó¡85DLS3”{нîjT(L¦ø=½ZÑ4 †Ñ›èU“A8ò|ì/v®ƒ™fBG†¼`dÅZ)ºÛs¯¢uC¿Ç*Þà’ác‰@"%‰¬”,›aåÛ‘Õ⣑G:I%=‹(;Dfª)Q£¥·ûƒx8!šSÇ~–0"má±íÕÅíÞDatY6œC58üp¨‹q„fäÄã"h7tŸ8 ɜ̥aɸ’•ȹ:©ˆ‰'ɼH¾P …q\Ñw…Œ¡à8CY¥W¿öµÚ`ŠË9È"ífƒQ,!:¹ä©:MÊ´.¹†JH¢„¥¯ñûEè žd¿WépmS¨¸×PÓ^Îþ¨ƒR!qÌ´­YZ¬V>L9ŒUÕeã˜$Û–ÁÆM/Æê¨§3%[Ä*$kB…vAÃÿ¤RNM¤ÔIì;¬Äp†}]Ös“'êVc~l"/V5êpYEàaœ I…ÃåÖÀ…YМ瑩{Œ €_$éÆâÀ€æ/›ÏÈ’Õ±Ýt©bM ©‚–†Ôr'¤íÄkŒpÍéçr°qÄ4E{ŦPpHÍúB)h1oÒê¬$Ù¬-¬ 9Jå7M• EubŽf³» Sšã͹f„¼ïš>KÈIeJÚklÙÔÍð²å_‹Çt–b]›"•¢¦\OòY¦p|–P¢†ì1;ÀziT°‰zz§–4±ñÈ5 µåYÌ<§g˜tq® €Á0tSTuâhYUlŠáí© 7êq©ªÆÇ‡$Åh-;Mepx]¼S¯+«PzK¢6cßuøÝðI,†^€/8†¤Û‚;ÈŠµŽã7;ÑäÃjs‘#O”·Ðtq Àò’–Œ¥ZZl_M6±ûà‡Ê²ºŒ[ÔÌŠ)Pl9¸'Öx+Î!()V%g>oFŽœW-°<ùîKPV¬ÈÜÎ×¥¬ØX65ºíɈ©óÂ4žª!–yP°îÙ4röÍÔ ¢DK€ç tœá¨>»˜aÕ¼ü1H±¼Øð|;–SFZ(¬tYwäz— ™-Q ©çèV³¼/ňC­çºçô@ÕÖ=Bâ±á6÷çµz÷ëÆ[eË]Äs?˽$'a;¿ËsCK‹ÌÐX¶aC£Ð´¤”Ú†îéldɨSMq LS£‘° ¬nê>²šТnCjjx‚+š:•Î@Üоœ¯Œù®¦æOÓ‘=–› Õþü{WýæAAÒ±–ýÆ™BK©;}H=îÏ',üZÜr¨!56–-<`«pØb‡$ÿ=¿og)庺Æ›€ O81+âzBÓ•uξä¼C^ržüŒæsuÓFà'( 0TØ´JMmÃö ´´ŒZë ö"&=•å¤zh0}䜣0NIFRn›ÂÕžZ¤Óô¢ü—ø(jOÑ ~Ë cÕý†ñG+á ÅLììP°‡·aR’cUbØ4?9Sý¦¡J)>×·ŒZÚzÍpò0€‹9~‹©\†ýã·ÌjÚç’Ú\Lpöa«ß4ÖÉö|xmöXÌ!n:ŒGeûsqè{xñMV×¢;âM7¤þh:,4³Ã¸wœÚÛ ]!J‹q@su™¶)¤Åº ôdîSÉ–k›Á€öMº“¦7Â1âq‚”“ƒ%‰k Ÿ·ŽJÙ^Ïï‹'Ï;^¾³#1朓7âß(r™g<çÍ' ïE2cÎÇ_ÒkÛ˜=wÔ­9@bŒ·}úº<7q¼Z÷aÃ-æø÷´¼š ÍÙ~¥°X%º¸ñ\ì£ñØ`{šüpüX8øŒ-ÉÂ^ ¼ØÔjHt':a±Ñ5fAV‘, ‡7""`‘}º§ÇMÅŸQ]¶M¤'Ù*¯ˆ=lZùPÅv¥y®y Ûü‡ZïÃÞ@Ù†&Qr¡‰ß±åXš J·Ì˜d3—àÂÐõS+aˆí¯¨‰±ÿä_üê³··–¿øâÓñß'ýÅ/ÿáÅþ¯¥"NjÙvT·ý_7Ô(s­eÓ"¶a¤6*bV4® Ýåcw³Kس*šÙ#¥Içc‹Ÿ qª.èÑè\õŽ*¬$>ý1šsîÚÌôšª$£‚<,½#UVriW lk ~´é%ÕZÆö—±É£ºV©T…°?© e²Ð:ÃYÉ8$EG• )Pw˜õÃKÄ|Ëzò®uµ([/¨ÙK.Á³¥WbÓ¹m bèt–¯/aîFR-ºw*¡—ÎÕrè9hZÖÕæõ'0Š «¸Ó[ïÿ#M-9C•|w2AÆYI5²ÃʦH:9<¤q†–Ñ+g ÀBÕå=–jF€™WjNÄC&¼ß•®¤Öššj¤@Ešµ\ 0fg|ˆ»”UmÁàˆµœ"h±â•m?™t/ûýJ?$Sá@CÄÃÙ©AÑTè†1‚óU&žOÓ(U…yÛp¥jsØJŠ_á qÊ\ÉH¯E‡ŒˆÉŸ*椮–\( R u¥Ë"…ŒLË â1ùIijJcÛMeö¯ÔáêBa6¡®°ä]×`«Í‹›Wâæ´ŽÃ&a/•œ¢M °õ„b²«5BøŒîç·ÙX:W?ÎÚõ/>ûö®x%¿ØQÒUVr-¤öùÄŒ”Ïþk’Ö7-à¬gWdŽSŸ”N÷\tBµ.Ž•#gàx¥ÛáãÜ®€Ï49è¤b“ÝÎp öõ¡ß¹ð‹—@Є·£v: ÑȳüF½üÖ±/9òx ç¿ùºœ™è((².§sÐ ©˜:àt&K2꥚9 ¹Ãf§`¥ΣëžN ¤ƒ'¿ùPÈû À4>²sðº*›X?t “Q Ï-ê¡K¶CA69Í>ª[·§àG›ÿý¶ ùÄ©])dÔ]«Y)àIQt8ü› ‡¢„|:|%¤cØáîöNt%tYN(Ð/9Åÿ!!G¿ˆ®éNCœž°V饎Áé{Õ'p‰… ÑÓÿÏÞ—(FU-]ÿ/À;4" jàìsΞÈ(2 *bHˆd2~ܧÿO «ö>Ý ÆÄé÷^½P½»zÏCÕªU½‚Ù © rèqçJ*óׯs8ˆ]A”¿ ±P:y“ÄZP9*v–…ï[¾-ö ÌŠÌÄŽ:B)QÁ\÷ÿuëAÂ.+LŠIë'0¬”ŠÚz;Ë ©ÑTC3]t[M7(›tpÐ+¶”Î*}*z½±òÝ_·IЧLeü‡ òH5‚–£ÓZÃ@Jü/U@oÇt-@°ZYr«Bxš²He÷ì‚á¤Ç]ð¯?¶ òsxþÓxõº vƨÀ¤€¾¬šé±BïD4Œl¨v ¬, ­ØÚøPðò‚L˜Öl•ELw7, ={dÁ\[‘Õ3ŽÃx{Äר«™ÈDè\\Ö;aÈücäÁ€ ±Ó[ieÛľ=ðWžAâîôêÊ0dtÜ™€ò–w#¿l¨û5Þ‚‚ƒ¡ÉâQYÆÙ&^9GÐØð‡71+‚aùýëmÞ8@á  NIˆ9a\A'Ýça§ºtÚ§ Â3˼ÀÛθhVÉÆFÁᆜÌuÁ×ÿx¾ôj%éiXÐ*áz*Œì’šâ(ØËÞš$¼gMg¦:2Pz ·çjñMUÒ²§Ž^là\S7&¢èêÒó5¹I §sI];Ó/sšC`1"³ýpóx¥ZÕåI_'cöúXÜ—9 ¦€“cèŸx°JЮãí‹ÒéChŸŸäË-œ‹mA]ÏñEç’sÕ«ùŠPdŠ™I؈$â.ÛËAÅü‹Éký(°Ñ)±ÌpgŽE¯r ®:ü¡¶Å9 Jl'‡;m7?Tk5@{®;ôÙ˽âèÍÛ Îï-}ºOÃe¸mË:¼2õxóá~–>‰óC†Û#ªªOâi“‘²À¬ž.IŸ›Ó[ó­`MM¨úÀ%.y˜ñÈS£3њؚàë+PàKæ‘5Ø©$Ø”™²¾Y9nLBü©‚½Õd®9ô&4î.ù/¬›­X7ÖÁh­NÎêum•ZÝ)ÎBÝz•”É ì!âáðçûÞA⑎¤û­ýàM­ü0KÂla“Ž4k€¼ ×:X¬M©0Z¤ã¨°IGš)–1uo×:˜ÿÀÍý -0?W»"kÎz:H\ë OUvÝì’Í.øn¶°IGší*x¤#47þÁ¬[ȸ°IkÍÌoâ[Ä•%Þ³êdƒ ‚G…MJ뀀Á3šûVÌ.³µÞ_\+©ºéñXI‚ýÅ#%eÌ”TóiñX‰MàÄ#%ÕâØ_S ¯0J ±<@ %7÷×]6¡ºúØý0{…TËÄ7gÄ¿«ŠY£-u¢BÓ×gÄuÇt¯sí[ĪäæþºËV¤åG-­ÄuÝ‹šƒÄu¿Ìë.-mù¹2n)9ŠÏfT÷Jqåp.‰² ŠzÍ®/ÃAÎä€:/;ÁËJôvï£N‡Ðvvþd,œ.ƒhFœZ$ì4J†œM.;J1Æ•N¹N]ÓÂ¥ á®~tÚ#=ÈZ96ÀuX®Z(œ¦$†;ŽÒ‚3?‘K ±],êÅ: Ãf,´Äe"Ñ¢4%b0‚“„!-̉hœâ\s× ª^iYckT27€¾ö-0¹<”icô…ä«Ñ‘iÅÁ¾ï(ÒøËž‘:§£Ó‡«i§„Üe^)¹™:‰ÀâC\0Yˆ ? a  öĈ‚9ŠBl´ÇH«DšõØ"ZF,ë$6Å^=†ÔÚ7}JAÃàüeÝõú–­ÏD|§u%fŸ¨ÆðX’°•g`¬¢…X,qˆAÀ9ò[ž<|ÖT²‘xŠç À|ÓÍ܉݃xð[b2¦ €ˆ8$3oLD2™ûÒ€Vö бS€L]ñŒÐ’Kõ°Û©°V·* ›Ž,B\L‡]§xiL1£×q1€+×&x¨3g ÍvtŒ¡rðÑöä<*՗˧CvÎê$Ö—'‘t!¤Û „¨¬€¶æS0ÑÇÞÈ‘zcRgB—¶°¹8y}i<9õJhë ¾f„²=òtdШ ™ñ XD!8 Pµ)Daß­.Ͼm€ÚÌ,U¡‘$KÐ)€R ñ%¤gEÒ`ÚЖˆ3%+¢wWM¸Ùê¦Á VKú^W‹7·;¿.#8jå('¡P# ºÞ¡Pça&ƒ/ià3Ô'½°¿Z9`i™EÙóÔ‚hZz ý£g“\iùã¨2ncá `1ƒ”xsëgž›ö&!%ä‰-¡^L@›{[D}“uw±ŸlËH`@fc½Úl“lÆ‹: CVzÄý*Ÿvl@c¢Q¥SôkÓ[ 'Ó“»MþZDÚÝ|!¢$:\£ëÅ"Gé·d#޽ðÿéÞOÅs0™).~k~E«R£5Ë ]‡¸iõ.-Ú*„5$A­,HT¹—NˆU”2ñƒDêi[A/Óe@K”T¨cÃ-#Û¡1oÁÉÛeЉ)ß;ÿIcZ;xÝùpS„¬œ=†Œ%³“ºCùº‘À1&¤r¼E”+@«``æòDY ÇZÅ-”˸YNŒŠÅ‚„Ù÷ºí`r$"˜juåBnïmz÷F4›,‚>öÆt›‚Â*½lÀå £»)ÜyX„ð#¶r×”aM¹ÓßW\Ïá. Cù^€ÊÄD×?Lñ‰½Ñüљɋ¸ë•_•6ÿ`O4º.ë{Yðg|Q &šs¦°€XžõöI™x tsáóFÿ&ö±‹Ðµ­6FyBbæuô+ÞV ›†­EiµÈ~’9è‹7XVWB½jÁÖRÄðñ Ígãs…[u ží-ašÆÏ•®Ôª/F\X˜¯Mˆ'ZUVùo*­D2ÐÎþþ Tr¶qI‰5¨[5–‹õ-•Ù².D|‰×ï峈dœ<Ú%B[ËBaW%¡k\%D ô59.¢1¹ ‚u,ô%Ž¿[~.v>œuŒ›Ÿ£×Ø¢õ¦⬉ÿZˆKIØw3²Nžˆ¨@ÛîHÇFÂqä¬YobB3ùv0ý£,M„²iÓtQƒy'oƒÙYÔQr¯3®Á#ìÄLðjc!j Ì”ã²Ê2;{µ„l܇‚"ÎÉ즚#’ú0¶&Ô™SHFk‚ë±Äx 32iðû$by•ݤA4ÛM[ì&V–âÁ±›´~NÄ™øzóK}VgµCÍìf¿ÿ€©ú[ïUësbóµ˜ßñʃkÛ$ 1 ÃïĹ²J9<ÖZ„vá‹5màX«R(ŽkÀB((µ­Ê–vUZgúàè ØkȆ7)÷¤|IˆÙb¡šÊ’±ð±®¬À<§”U\ [@}7'ìÌ—SK-%qŒÛ­>G|¿SkJm*#jš>öse…µƒµ&(…/ r74 †àf‹fÛÙLgKË<÷ûmýb+eñ «ZU KÔR˜ “4¢CcÂçHICb3T!F(!HLö % i-M^l—kLU¶ÜÙ²á^„Ù B(ˆ¾ñse…†Qj%#ºVu­ñy  9äv\–Òß4ýŒÖÔôè÷Ɍрª¤RhV­ KŒÄàÿ$ò7õ_‡rjГ «ÅÖ¸ÚY¬üÒ!x,ô(ãmj”÷À„¶²=p%UÙ¬× ¢òs²ÙXÜkR2Rš€’ê°å6H•FBØÈ¤ ài‘Ɔð—0T‚Ûg$,4 •¸~2™‡ALÖ¬Vmñ*„—‚Ÿ+ ZØU(¼Ùì<íQ5‹HÚøéììò‘‘6AÙä Ä<.¯Èª¬0ÈÓÒ´BHBÕJ*b%––•„t/moéb¢1¡1ÑŽ˜PŽz7©Ž˜h‡AU6رÊS «#¦ÛSk­ö¨™ýìGLéñP1µØŽ˜XmÚvÄÄjƒ/G Í; ¬l²c£ÒZ Ë3ÛaP´Ærl”Äúˆ)µ•-í2­s}pä#†0“­¹Öˆþ{âhYX–^ø l lQÊj^_š€,×B:Éðý"͹G t´?Íìe¿ÿx©ú[Óâ®Ï‰ÁiÍ ¯ Y¡\G4¸­µ ¤4*[ÊVÍ2¥ó=pôÃ…¶:œ–•è³]ÛVbØïáp%ˆpç,ûZ¡×Ì®oQ¶o"ÚTöµ°3’°‘ØÒ‘ K!Ûô"DÊŒÝWØJ‘Ö%?S–Ë.ÍœY¾Âƒò”“&A!Ĺ²J12ÖŠ°šQ (“"šP•þ°Q»jaÕ#1NcºÛAÒZ,‚曃oMЃÊeC°F§[> c¨„¨AîáW´²Aéf½¸{«¿w§,ß­Åp“—7ç«×Ï!±@擃/±gÁrÕñfY:Õ„ì—±þ31R›Ò¨(¢£µ@ÁW ¡!Ò£²­@+/v:`À8'ÃìjK”78Ak¨æÐ²L…˜ÅHÊ4*ë»ZÕk_ ;¡ƒ‚"2–„æ|eëäŸ2¿ ó’c%kvö™uöc­¯}fã½D…¨$G)ëÍØÑ+;Ï ãáHŒô„•ÖÑ5³›áx)=®›ësâ  4)hm`û¤«„˜KˆÂ•í5#b¥µ-v-îë`hí dXÕ ¯‰Um«²¥]•Ö¹>8úã‡é“4LŒÍëØ;yT;³b`F°[ .Å[+W:VÐ=›n°è7IZ͉Ô\2rtfcUxCð»rñUä ±¹iÖîº,AU0<,-¤LENØUbQFe¤iÅœ©ÎQY„Y•fÕ²ªj±b„Y¨§®8y$üc@*€Ùä OB½ º’—.ØcZ…RhgqU–ø(§a«c¡Í×âÆä¤U#Tƒ Q³b·9]É¢uL¢¦d„º‡4æ +!MEÌDàÚ\5Ý6B &B ºš’¡ˆ\xõÇeqõiÊËœL­jµüÈõ4"ÚÁ*´Í%›¶Í•ÐÎÈÖ¥™²tsA¤÷#!Ç)•[Äॄ@РÁ´”C£M x »£4cS–2ìŽd—o%*´CZ°Fe[I%3Ž„X‰µŽµŽ6¨™ÍìçKép'ÏÐõ¹q°W¤åfçÉŒùé’µ¬ZͰGÖ%½ÆîW*‹Pß/bXŠ+¥Î2•T¿¯B»)&¬Q+[·Õ´ÎuÀ±¹†PU½½^¼æ0±N)¾…b=ä(a¯‘Å…‘A(“XQ6|G”äB¡Ä/ÖÂÐW7÷"žO1I›TS]];_ í|„r]–€½V+•-×ED{2HÏ6Á–ŽËjrÞ±V¶ÅÏþ~÷Ѹd÷QݪZXõ@-þŠ¿æµRGMYÖé]Õ óƒ{kν$eí|ÑxתlTRfZ´i5Þž/Eì àL:ŸLÛ–³Ö$ødÞöìù—IbØbL8¼—X¿VBC÷ŽÄ’†R·Èu‚ÞåE¦é§!´ÓEÊ㲊§}¯÷P&a´çK™D¾Øpè]ç4ÆFp~×5}%Ä:Pظ¬Ð1ýXg©V‹ÓaØ=ÍÄÌb…TXíø1Ä×È6”‹¢”ùLéqè>ΪzÛÜu3ñ•’û¾seÀŽƒ&͘–ìꕘƒdQhmQ3ÛÙ‘ŽôxàØÐõ¹qàäÉ:f-fxÔèVæZ°–µ6äVìâ\Ù^PǵÖ"” ØT4i«å•Ò ˜îqBô®*[•­kZg{@R±W„a|%·‹cj²1è̈ÁðSÞº…lìK};/žÓ=Ç]vè Ï`!Q5¶€ÄŠ>,~;J×£qC[@BµÖØR öâ‚-ÈÁ Ã[0ÏúHŒmœ~¬…»ë¤PŽ|û9Xç¨,‚< ^€„äYc (³€çUe£yVZ£yŽj-ÈsT›U»jaÕµèj|aAÐO¥ŒM@gA‚f$€M(è"èQ ä¨,"7 ]0’tÁHŒç2)Õ Ï‚.àf!OaAp¤ܨ 8Ð#aATâ‚. ~Ñ Ï‚ Q´8þ‚. \>ä9*‹ Ï‚.  £Až5º šG]ƒ™â b€¦¬@APލYU›]P ktÁH t­¥ ]@PƒPæIæ P¥!̳Èú:̳Çj4@‰…y†:ÂËU]€££*ë,±/±ù49—0ÏjõæI±G¤«%öf%쫇 -± UÙá•p$,až#1F¹&LE˜'ý”!ŸK˜'•M8”æIBuæ{ Ýí'%Ì“2\ì'V¶Çkž¡Ós¢rû‰æ9ÒYíQ3ûÙŽ˜Òß¾ ó‰ázÌÞXw¼…nZ†oÚA)DûuY:(AxbZka ó‰9ÒŠÐÍQ J˜ç¨¶UÙÒ®JëLýˆIÆrÆtD–Å—!0&UYL¸'"9åTsv> •4•U»quq"6°`PË®Ÿ– ¨‘x¸¤!<`¬ÁHý(E¦Ò"‡:k¡Ù¸,|ÙAEzJ2úlM®è³e)½ZÓÍhÍ0òkP(®GeÕT·«V}P‹mw&x¼C'RD¥ûì°Ì³¨ z¨&‹!Ä…ÐÞFÂŽ&°5­î¨,x¿(Àʇ!­ìªЏb' )Š¡PŒ$0Ç‹ÖP0¢Ñ P罟¶@?¤àíÊ%¬¤<E£+Äxœù¹íæÊ6f!#˼<ùfçQ_3²àÁÒR×aÊ:œe,ÄLF¨lë;ÝW›ÈEÆÉðýJœ“}?ÛÉŸ,©]W82hG îàhP(oF¶˜^w,´Çl²P” Ñ}oVXb]Gbãï-Zë=j¼›á|IUX!;.×çÄüÉ”ËÚfg¶aˆ•e!†!§™’ÄÏйµ°Wâ ù"kÕk¾üz¨ž«šŽÊ–ð–JçLûS_9‡Ö:ÄJÒë‘”„’ûZæ^–9Då{IH²—£^oL±¾y J ùô\>1+ν³Óàë`<Éôh„¢ ˜&ª²dÛÀ©ŒÔ™$,O­®NÄ;*ÚSVJaq™©±Ge‹mÄšU «.¨ÅœþW…¡±5LAƒ€~;  3O mQ뛈„ÆÝÈB©Å” ¬,-`¼‰ªš"ä u(€¸°‘VcwÀ½“Û}Ì%Œkè<>ôjE!-F—h˜Ò‘°DnÔb#t8JE¶AMÖ)âa/Šseñ0ím¿¦ “ ËNO½Ùy.æõÄ)¢¤±lveɰ ðÜ®K‡@yÀGBogëH4Ü‹xdê¯8ÛA€üŠ>8¹W!ðµ·ßo³`q½[¸-øáßtseÚ= ´×„¡v((â6£­P:Úœf6²#Þ”Þör—ZŸPäÒxu˜™Ã‚Â:tµÌ¥Â±J¹Ÿ+ë“Mkúê’7GnÑêÏ©c®ª€¯hoK]Kɺ­¦r®Ž-††¤7 s÷®/¨OpåÜ*uiC(˜#ÌH_ÀþŒ¢·äÇ#¡¯CE“1>Øà B2˜ƒJ…æ×nrž);,ò¶àÆbõæçLÇ‹úý®E _) ÜåHghs¿Ïï§ ¨ÊæŒX«j¡¯`cEj(¿h<»¾€hóM˜"}ÕÊR‰UhAØäa!ZÀB©Áp(¸gÊÒÃç‡<Ž…½œÁPPÄH–ÍIM,l¾öX¡ÿÙMeMÈ€pûâx¼‹‘h$dRdT ˆ™g_»Ë¸_A¹Cƒ¨7–šž‡èä{£“/e{#;6Ì?J•’Ô³¨¯ ñ[# Q#A. óßÔлrÞZÙšlÉ#aW+Š´×÷¯#JF¤Z0âuœÌ†O±CØåƒy´bÝb!b+QaAgôn®l[œCÀ?ÖÂ\ WE\¨r+­£ jf3;° t¸„ûúÜ8@’˜àœgDG·Ã¹ÍBL%øºFe}ýS¥B­ÍEƒ¤»Òê-­ª¯XÙ«ÚVeëæ¶ð0ÓÔöOÍYžóäÌÙÉ£oOœ¾xÝ5O/o¬Ü{³þlsMÿ~iúbuC%g®o<ߘ×0Ê #ÊÅý ÿX+qhraŽš;„Håä„&KÎp¾æ²zíc±n¹”Høˆ¬´·rLà $‹~‡ŽI2,Ö‹)ZèDA"6gµÙBva#g˜*à½N‚¤c† Ç3Pt¸iÈ–,c@7BVàt¬ÇÓWõ¼Èœ _å–…<å«NЭ,N2…}’À„…9g•qj©OÖgÙupxpä¸púØf•ƒ}“„ÒM$ô=~_Á~,Nrß8zÃÍ3p^˜!ïeªµõfG û, ¹ñdÚ")\¦z¯=ånÍBº4Ê÷£ÏXšœ ”#’=YØNÝ\0y]>Ó@‡ìÈ6Ç[¯*I¦:ÛË+÷‡œŒ¼,CF†q£ÅÀ{@+G õ ´vº®ÑT&RqQÐÒ&é&ÒŠ#ÓÙG¡I,äK/‹AÌù8E…Dy‘™Ü2ê­×ÐÛJY‡PR AëÕÚIÒxcl['AD24ò¼$­ôÉÃèô†39šÎ¢è­k˜d‰Å’É—ŠF´(†–Z;|h³¹U‚8pI)/hYÅÑuèZñÒÊ öóNµRvQÛFXE»æf$É $}oßgv–jP+ÏÂÀ º“`¾Dq,²°õ­MÍF.xtÕi#fQ'Рܗ6E¹)Ɇ‰‡)OãFÞì¹ê±89ïŒ.5X\A—ñ°!¸ÞÛêl…Í:;ËMw•Èv_²„ ¡,C~üˆÅP­`:èý¥·IºÈ>Ι#\R¡¬y6´]ÙŸ‚ Øè +–g¾ù ‡=ŒƒÇŽä–Ï£««Îy Z.ž,ùÖ‰ù~èl;䲚5•O‡Ä!œômºº¼Ã,“M_RÁA˜¢´ÀIü6}óÝW³‚À¶fÆ©Ã8Z¹$g»Od!haq%=×°ó+|—HÏÛBc¢o°ï5’âX~_=?¼ÙßôˆvðΈ°±ÙÝÈy-HºEÑ¢U•Œˆ$êä £r6.ƒXŸ””^g–v"~&Ø^ÜêöÆ Á‰¿ßçdÊj?ÔÅE ñÂqíEã”~LJæÔÚÉ•\£vIµÇ“°Í½6».d²mK„ Yžœæ8y´TÈw„7Z6(³}’× Ö@Q~IØ^kÅä¢Ç/Ë^d½_'ÂúçèÐ2d\¬[¦væcØlÈ2¶}i×6–r.Tw‚ÆÒpb‹i˜$²!òEŽ…F]"ãÔHß{Úö°‹ú6Î’..I,Iks)×éÓý>‹Ë¯m±¤6®TRòeq¨X—Q—TÖÜ|£³t÷ÁÛ…Œð` ÎÊÊc­þ‡P ¹T†G»)HÞv!&ÝHLïm ˰c×걺™ÚKæÝiXVr[òáu„(‘ÑÝ£+/ ¼Q‚$~/£³½ÅèÐe$èÌ·'`y– 5I+Û&‹}V.ÔhèF;»õöŠ–W”çܼ± µå¢À¹½{}ðö’T2g}j5ª3÷¡3½œiä¹ò a¥ E îš"w8ý8ÂÔ^¬ì7®ªÒ· a`r*Ô{4qYü{îÄ]ÊâV폓øp&giês*ôË3\I;‰Êïd¨PÞ6¡ÅÕ„ºÇ½1CA+¯«A<ìYË2E‡–0Æè™L%Í&š%¬vâ'a++!ØMœ„ã"‰Ð·U~¬$'xh„¯Q„b!­®íU6=†FŒŸøþ0§=ÔZr*lfs”ÞÖÄøÉ;Ÿ$%ˆØD“I âlc@é‡ä¨'­Á#á³sI[û*µT'áÔ”¦'"ÏœžSAŸUúKb$ j`€‚®‹PÐ!›gy ¹³Äøš…4´b*^V/œð$‚.ÑÝS(Zó|“³£ç›-´BÇç²XÍlém¸ C_ ëQ†Srv§TD9@‡7þ1ÂJ ¾›„ qòM]µ¬“TQ„)âP¤k¶#.@Lø`¾‚šòA- l."0Zeür”ï¯|Jù~§¦ù(X8ÞKøhR¡.¤nIó–Ï—n½b-•LÛi ’¤5—}ÏY 78‘ä¼.è”l隨ÃR¹Fœu`9Ä·¡Vͯ>[ª˜•Ûj/¥Ä×3¾™H6KaE ÌDÆ}ÃØ)Úrb^éy2|Ÿï$$‹¦°5ÐS/"73Ö»“‰) z8 iÁMâ­CRY¯´±½<àd{‹ÈÄõž.^)b‹ƒ–ŒèÉ6–Y˜XØšý2rê/ÃÖ[¹‰ÈÒÐý‘˜¬ÊþŒæ×Á¨œm$! Nwƒ_D\€|–‘5ÐUàéBâÆ•*kÓÜ®+ÔÕN_&Œ ºÃöÜqÊ-8lzp/…NP¦,$à|½PKáH¢ÓÆGÝž³ÃýËçpÔájë³­ê"uXÐFÛB¨Û+mÅ9‚¾¡Q».‹ƒ²h8[± ,Abl œ»ô N˜ˆe (ð÷O"™›^Ÿ‹\×áŒÔ½Ô«gRå©käµ§³H™D«–« ÕÀæF´H?&·Hjx+AtôòÀ ôÔ>¤Y‚Js§€ÖŠšaŠ„b‚’©ém ”(9te6x2„Nž":zM Œf†sqVΰÈ4‹t+¡óäŠz·§I’‘ƒ‰ˆHZìP¦€lW½*ÈèBºUÍ¥¸iùÇ@›RÍxl0Á¶ºâµA{ä1*'Bœº‚ž”k0},gZ‡Aîñü(„E“Ð>Fà5àÂåý›…¾kÀÙF&Zã:xãHœ”+ÙheØDÿQJf±‰ˆr:;%÷À2`Nyx’©D¶7º>‚¿¬X¼9@¬…˜´ëùFIÅ,ËC[]Í“À Ö9éñ ³Œ ·<¤Šzã@ ôøŒŒ=ÖWO«ãS(£'cBš6>²°’Ƭ~L¶=|ý¹éÕI¨Fr%«—’±BäkOAßô ?'ø~~¹"3ﺭ¾èS,ÔZ:ˆdhø±ƒ'€30ÉÕ>hÖ;1ßô¶›¶x5pGo€A9®Ù‚„*Z²Þ|äïLARSOW8œ\iRE“J&QÆ)B¢ämØJb×hYÎ\/eõöA }PI10œðKÚ‹Ú â¤1ät6ˆ³:õ²u«Pn„ýˆ¸ú(ÉìØâ†›©ç´IŠOi{‡í˜Ítœ±#•Ž 1Â$oì“>˜¹)0–¼áb5¥«\µ›_šožrúø s]€(J•ä½ MŸ–(ðê*cT‘ò û^]­¤@ÉwÈáGȉ‹A¬»Yb“ž~¿wÃr»÷ m–ƒÒ¾oâáEÎSÆÓ«H0tËÉ7°qÚe¼O|#üÍîŸ)ÐÐûKkEæö X-g è³<Ëò¡.ä>áü%GÙp]•7}Ÿñþ§G¨Þ‚}+†v.x}BČýيÊåLϪJ0ÏhW’y£¨ z0ë­ ÁÐt}ÐÐ:ÆÛ’™:ëƒlï,–Pqž.âB¤f5ýÌ×Ézˆ86ÄhI6}_ù(ØcÕ(Æ+#9?Ì1µõL&q+ `ŸpÐÓ{Ý7vUéЩv[£ëƒlœlÐÕ© ›1;)à¢ÐÊ>@u ¼¢7dãÕ œmÑíë^÷]~–öÀ+fD-‡§D®n-Î.ÁζH›©+×Eݶ¨ ½}Ÿ™øûØŸ‚rJ³W5¾R$ýù¡!`L s¨´râÐó±kÔÌq¡¸.£V.ê%Ë¥³°õ6·Õm; ûšŒnëÆòr´ŠÔ`µò!檓Ô)âûP˜+´= j¹/!,‚V$!f¥2Ëð½d)Ru°“†G¾Ñ÷™²û&³{ó›Kôbµ½ÖЉ§ª7óg—X`ÖÂ,—•d×}Jæÿ߉„ߘœZâ¿ã¤â" ow‡K†’ë#‰‘|u`•LÊßODê$Ä~â.ŒøIkìÃTVI¾‹‰¿³1\%]Ù:K%ùZ* ²^øI¬þq Ii`‘úd‘‚…!7¬å&´9o¤$¶y˜ôá*ÁÀgô5)}kg½l‘VE“£JÀ%ºo̪ÀÊ"Ǹ›&”7OÔí‘Ñ(jÏ «3_ÂI¹,(VAP.¾/¥¸àBS®ÑlˆaÜMC—d_^ü€dÓãuƒ¤²Uðœù©z @Ÿšb‘aZYšœü[JÓ"T“A€?Å$A{ ›H¬~%Þ4ø4dÕã„—2zWØM™ÒBpF1¹ªÒNðRzÙ”Á"/Žuè%Õ xk¸ùzË« owF_Òdyd¢ªé %dh['ÒÎ(õù~Æ(±NƒìèÅÅæR#N šù!aШR Zµ“1ÏbQ`;¼—(úÌãÇ8ˆ1qñF++v%‚¿ñv)=Û.H èšò·@ø\ѣʒ#·x Å\#WÀ,¦!Ú Ð·: Ãâ$µa¸Ó!\ªk½ ;àp˶áʽ–"_ ¹À§„ÿ„… ªÁþ ô1¬ hc31IY$Ò¦$,®(®DM7ÀºÐ4Š¥¬þX_"> å©Ñ››ôªŠöFÔjµf6§ÝÔIǪaoD¹Õ‘Øw½mÈQºK/m"ä<ðÁ³ë) Ó`d_Òý´So/E켚ל–I§W?$‰hAB1òRÔ—cÂëâ(“U,6Gñý“‚¤É/= Ÿ íS›¥—x(Þ` '³æ ^(‰[Y„îòþ wCÒ*`FCG’›°±œnâÎæ-NçEˆËÀ<ñ(#d#HÀh´êœ¥1èÙ+Ìœ3½&æ Ô'§žNª×ì¶Y¸=ù˜Èz³¡g°­^¬¸„ˆYÄUza¹ZÒáƒi”T_°Eö¾IÎÎZJ‡äÜõˆÌ` ÷ ú%p®{~'BêC'¥‚I(8 FrYÞ bÐã§±79£ò{ÈÁLX1å(Gƒy?ËE—#¥ $_Sã4‚€Í¾o´hŠA¯ zå$_•Þzy4ð&G;µeÇi\%²‚yñ’£IÌ6¤Eõˉ©‚Ï) ‡¶ŠÖŒh|QuzÌžmMøLyÙk¬½Ÿh–²9Bˆåé䪱×b“t31Ö §&ÚjA%å~L»![ À¥N•¨aýìÇ̺s2\P…l=²ï{výóÞ›JQÏkÖ˵ÃqLÒBg!g@Æ •ÄÈZGŽXY¤@VW>|,y]«µ4Gà JÑ^iÍ⛄‚F›sd_2¿GI ÙdGBvíAÁ Ú‚'TLÈø8¡«6ñ>Ë3P¬@äž\Wq` ÙvÔ7ÇÎ ¾b“mIýmTRÌ‘iS®@i…› ¾¯ÅºÕÛ3Q \0T~ yS¥*ó]‹ 2¯á¡:(M¢«˜P :aN§©³{ŒàÙÀ×XöŠ^-Œœâ²<(hGœ9#dNÙaY<#W퓎îœo FKÐ €AèkŒ—š©i)ênB²ds±337<’XÝŽ¡:¿‘$ Ô¢Ë^É‚r³²¡`çô4¿Š( }A’cÄÂÜMQ³ÂUr†ÒFbGè%kGj6  ,AÊ®@•è5×aâwalKïÃ;l²sC‘ž ×|‰¥P·N£g¦Œ)È0¼h-x'"K3ƒ€éǼØü€ðWnzû>FKDG—F}rÈ÷ƒ†oUœ…¦“Á”¡ ufW¸F’848e5zˆ¨¯ˆ)M«Ø›„¶-ô¦ íA™¬cMHÓÞ^PIô8 '€M¾XƺZQ-êÐÝšFQ­FÿÙâHXà?éQ£èn‡õÒª1 »óz#é[=:IÌo+,•ö=ˆ×õà·¤«Óc܈ŽY¾4fµ3tf@£±;#}è- £®4Ág‹;š•ÊNÎ8jø;C.’LYnm[Þ •Ud ]'Ñ"t„p#24Yð6„FϵÒ)„úJßx‰ur1C…Áî=š ÌQؼ@ž`ïëA”¸a~;¯® jÐF[ ,`ŠÞ‹qç·¹M8=d©1c òÁIàœMc¸óÕ:Ë¢ ¸Á¥ëÓÀlÊ‘­‹¶’ƒ pˆ?B,¯´êq‹oÅu&@GtsFˆ1Ò­¾C8 Ìk]} ³<Ô9àMÀ²ÉöWé«g$•°UÁù ‰w˜÷^‚Œ8܇©Ñè>ÛÌö-=#i¶#õwx<9H¨w-†TçjÓ€òï!ÂTt '·`¦KÄÝ å+ÇûЕ]úÅ\Äd•ÐJî õ™:Ó{£W[¯ïå³b½—Ñ%™GL=›±wGð´”,ä}/ðÇÛT;3E½uÚ­tL•ȔČ'QgGÂ/q¨¤” £)$^•\XFåžÅ1²m#i6W‡Æ¾ ‰oÿ…·cNl3`sÖ ŽãyAPžä2,¡»Ô'òôvm~Œ0<¡Ä EÎòd††4°µ¦1à ‡uŠe§˜5‹ˆL5^9jô/9; ˆ¹Ëê[ª ^QW8¡UMˆË!ýd‚…ÁJ©Èñ‡ æå'{Öð§×z·VNt¦v òx{Ø*‘/Có€b˜òVÜav2 ; ɾ ¡`s c¤e™ä˜$ŒoçSÈ1õá2  8K°ô˜šu ³…Sm0ƒÐiü§& ÃC6ÊÈ  J+û‰_«ñ˜ùÄXì5zÌßÉë¤C&4~|wDNØ^3‚ï9Õ™¢ ³AÒ(ÈK1%”‰Ÿ®<ŠpŒ“+색gUk#hay%8‹ÃÉÊ«Âñ‡ Ówˆƒaó™Æ2’Âs„Öù³„=î×]Ô¹{Äò3Ì\ê`¢fM}ÝÁߥ›®†ë*†"{F ˜²¡½épêBAîO ¢TÉ'¬ëØ‚0"pF”¬ûʰ’4îƒJ0@ê©ËŒŒ=B4¦Á†Õ.Àýæ+…£¢Ô £²Ñ0µ]"n4d¾W¤®«¬À„Õ‡wk€¯ÌdÝdÁ–¼›†®§Í«3öjxtÌÿK°X h5y>³¥r£G_ƒØW…ÐÌØ¦KÔÞ[ÓÿÆú?k¬0/⣕`O÷†ˆÒkø÷¾ÓàôÓ&>8úT` Ç› ¬âxÓ¡ÔâÈBTkJˆŠcM ÃN‹ÓOŸÿÔ„·ETÀ+¾_ ·)Ù\Ÿ™.‡?Àþ7Óþ7Óþ¸™väãsŸiˆãóQ¿cMEVq¬É(Ž5¥Çš8Ä<%EÁq&¥h8䄆ÃMÌñ~ày{äS\QP=©ÕžJúòÀf"S”¬ë‚BÔ˜«‘gwOõîØé¤å.ÕN&šÏŒBV½* t€î]m[X«K0sìÈÔÔ±±•‹Í6u£ý'‹•sjôx3Š7 F¹BѦ)+PßÈpxkhðû,yK½ñF÷Z…t7e^Fõ´jæDOèIÜ –êšù†v™ÿ´}Á)ÝVÅ—›2h¦8ÎSƒ½Ø„÷Ae)fnò¤fΖ²n€qåUyG[„%åî|WÃ)¸$g X 2†*-V1=°g$=ì*ï“a˜ï½SšKVL2bå&èvÉÓÚ%ªÚqôKˆKâIÉN#0PvSÁ€ƒ´—L¯JPNÅÎb¼© ”"–z¤ís ¡4fÀ!±ºÌ¨$¢F8¥hßðÆO£BÌðáË{O½òÄz\Jñò¦’ímnÑAœ¿ÑÀXó#þF§B 䨵ÀTª/šé/[YråÍh?C “+n³ÔG5ßrºz°Õ|ê%tTȹ:µ]†ÂÁÄŒ—êwK€ŸWÊWW3’]ìÂYÙP@Ä%‘žÕð“*aO+ãQU Ÿ˜ I)5® ÑÑÌkTž´9)Œ“-ß^½ðgÉ®G‡¾ñÜÌ›ŒOa”Ø}Ç̾¯¡âŠ·ÚwËøªÆOJeM±¸SðIgز2‚õ4-©ø¨Èå­W"B×ßÕ[õ2ƒ“J@1‰³Íh…Äì@¥éB ,eΣR ™ÃZAø 7 >ŸAÝç/¶Î~*7˜¡ ^Î;§Nà28 îò­v½)¨u"ߎYæÝ¸ Ëäˆø!“Ã>û†Eè”*Gvº̘öØ&ÒÜx—‰0£Äº^›¢!' ñ&£øÚ¤7Ø.*tÕ›y‹ýïB¸A&)øüFi½É„€–yiR(´U:€©ŠP£4 ‚dwƒðc‚7¶MQ b0z~ æ¼ùÁr²ÈjlÅÝk R2ÜÄ$>Xg€u Ÿ“¬ñå™ 4Õ4c3ýæí'¯S/"¥f™'ükªŠFɯÐã[%Ð(´Iü–èÕ †í«ŒPžŠ¥>4ë¸ô1Jôð£z¥`3Ж®Å?$5ÈB}ÊëEC×’^ ;K=O÷ˆü~M6§sD|;½4Çw$ò¿2KÊ[×CtØ=øŠùÖƒÏId¾tycøNxuuwÕgÂ@øMóĤòU ±‡S‡ ;àéìÈçli~8:ý‹#ÐL†/šç…"ÿ5²¦€B=Å…Gõ$6 D¦Ð}挖pjÅk¥œÐz%£òåŸÛkâÜÜf°P~ª@ÌŸžØ2’]¸…›ŽÞ£¡/¤+`—í x¡G7^r2 ÚèôÇlC0˜gÝV‡KsÛa÷™¬Ùû¾90}&o­yJ}—’Ô᱕>­ƒüèqˆDñ¨DÅ1È àÈô¢à8¢A•âÁf¯bÛ]íàÜæ” Jñ ‚ˇÆhdlªPûÝ•HÕÖÒBQR„JÁÐIê€(M“{$°BºØýX"DÅqx"P‰ä‚:ô-œžÿˆÂm0agy¬È_Ú¡né¢~/[%;<ð\ÔYÉŽl¨ +JD[Ûâôê˜õy*¾ (8c…¨0Ziþ AÔ’s`ýèB°HwM; É0Mã•tªô€l(s­e„XQ®Ý‚‹.•9A±¦àÃ0ÐE´4 ô|7vƒYæ h8:w†XÓŽÅž!*²Æv{PU.ˆ‰M)‹‚%,Th1†äÐ}Ñ rMB1þ“œ 0)„uûá‚Ð}PDûâæI¢`_Ó¾x§}°Q¢¢± (Zì=•ö2Q©tTX\Œw#¸Þ„¡l¹I"ä^  v 2Ž·‹ì“•냩  º¤é-Y È0HB¾ˆ.ì‡Ø«Td”Ù©èQg>ÑZi¯ÑámÉñI1aLéÀµ] Vô1K¬ïLY‚Jƒ´*ŽA[‚öèÄ%Ðp êQq,ò’rR•¾•8: 4ÂD4‹Ä*Ccòت|("ôñ1¨LlÆ™Ì ït&Ø@ŽAh‚Cè”&Pq RxAkÇ 6àçÔ&Pqtr8,Ao"*ŽEp"*ŽEq‚‹Þ1HNpÑ ¢ZD97r"‰Mù19[J§t΂»"mÐA#R’¤‰xÐàͤÆö¯®Q!Gc8:½@³DXX’BÉö#KÇ¢KÇ"L\-ï/¤• âmCÂs×8÷ÉŠW=И|o.¤õT'&ó…ýÃ`à‰žšÙ7¼f>h4²¢¶J³Ó¬x]z5ÍŠkôø.³‚Å­Ñ·ÍJï:†dÂÑK©Ã‘©^ŠŠ#“½\Þ‘é^ŠŠ£¾ G¦|)*ŽLúÇ })*ŽAüsÔ/øà©NEű’BÅÑÓŠ†c$<…‚c¤<ÇJz ÇH{**Ž‘ø Ž‘úTTdÙG5ù©ÊÄËxuÐù gwDT*Œ-„±lÙ Ántzê"~O ?²&Ù!Ý}‹ ¼Ó¢¤‚aÔ,…QN`Îå`%ÇÌ ÇÈÃ**Ž‘‰u8F.VÔáÙX1×ú¶C•fÄà|¬lèIæa§ÔÙ6§©õ˜£Á{tÐôï›V4°Ã%Ê-’“ѫѩ‰­G;õ9Ö1µV‰$V ù@›A*Ìy½Íö^·JèxD\6X[µ±ÅBƶƒŠhNþ@ƃ3Ô¶–¶¶ë[´c&—-T+›-«8j>[ùòq2ÚŠ†ãä´ ÇÊj+*Ž“×V4'³­h8Vn[Qq¬ì¶¬âùmkéÃf¸5ÝGÏq‹1“ðÊ‹ÈéËŒ°år>l²ªÚ·FˆÈ’ÛE㠛ͬ Q’•Dê ö`¼Ó4¼S+ Ýè‰À¤§È‚Oé”öcÒƒÀ!9¶Á„œÍåíÓ¤RÕ”­–ΊXû’$¨&džf@ó€Hî›àÙžk©£Ñ“dhV(®·k µYlÛ)O-LWo¹ÚÇÂ&áý5Ghh'ü<ýá¾D‰û*ŠŠ})÷ãj܇ÖV/¤µ¦Xwe‘ôðÄ‚Z¡ \çu²{ƒY…, \Ò Dt´†˜”®S-züÔ×”§\úKG 5¥%Xåã@Ùw`7••!9‚[ Ý*3JAо£˜L n›'£Lë’æ©óN\ÕBB  ²;Ë[F)Ðô.Øt1z®/Ãá*îQ½©°!SÑÆ­ù995å9úÝ©p¹TSLÏgîV÷ñrw›Š£gcäï6#ùÑ3xC²®öx÷sŒCï!ì=ªÆÉâDSmªï"øhõœêÙŒÒÅç0⣭´à®™9½eÚ (ø>WžŒNНreð¡*ÈEJ‚*R·pœŠŽ‘Œ*†c§•oMŽ%fáaöaiÆÐ|åöÅ]fÜeK¾)‡J°­¸äô"J¦LZ’ncXÞ'':T#+:T`±7b‹S¡ÜjªL´´’\êÉÑ,2 LYêÌlŠ‹l¦g¨ˆ±×:w #âØFoRº¸z2ìAÊ MnÃR —ñ{‘ÕªùÙÕ¾O~v¸z}¼Â.*¥Ù8ÁzâSHØx­îp¦ÕÞâag×|Á@YòãÙéÌâ×—gh·‹Šè‘¯—[öB^î,>1(”jŸu‹Yk1Ì“¯s17û¥Š‡ ŽÍÝš2i„‡¬§¶G¶yZ妧0‡R‰¦Aþl$¯¤˜ÝWÌf·ƒ9¼÷úzm Ä ï¢Ä‚=Ä$a4­8BMƒ·“,hZNŠÍïœmΨdfSÖCÃhøƒ¤hl )Ñ}°3¸ƒ ¼nyì7¨j!&·j¡b8Œ°kB›92øª!³ÔñÌÏÒCžôõûÝϒ⛊ŒãÍûB¡„êgáî“P½orw6zlâH ‘×<›š 5/ ËvC&§ä‘£A¯œ À©°" šK`*æ“ ì›v`Ÿh²J$‹&aHÊͤÀ‚Äq{z]!·jiF×1:èofNˆÊׄ4èIc-dªT¸G2Àˆ‰ŽãñkISh·«)B\MÛÑíˆ">=¦½Þè‡ØâðÏ^±W á APºÐ-av[@Otn°‡uFY 6ü1†”3>·z*d„õSŒâåÔ¿ÎüT+7,tìá"cžÅ›^ýY¨ø8æçGÖ Ú× ¢Cåè!ôº’î €Í5Ù@#g.šA¦ö¬À£O†¾dOOÆ”jÉÛ5 ±©H¸+XVõ¨1ûž³á´!«AÈo UÁi¦‘YÞB¢˜¡ä$-€\%çcÛÕô¢IÎdtö 1§ Êzþ q; «x¢ÐÉU”å޵Р\Û”Zgv©U–ËJEÂQœJ&y¼£’dö¡Ðižc77Šbà”#8u}q-4f"”<(”µºð g‰×#í¤»<((ž Á‚jçúÖLd>ɲâx…&Ž<Ä«ëUh¬jü_ÕÂf Xàè-¹E«¡§ô®¾€æiÞ\V³>8]/öÀsh û2]}5ʯÃ1G=’øª]-TWT¯þÚÄ+UI+Ñ•¨‰þžÐ}bü í F*Ú˜ ¢Sä¾dÉðÈ žuò’V*zŠîñòâyˆíNï×w³ ÑG2úêÓ‚S9Rk¥“ž?!&ÉPQ¡=ôA¶EêbÒÔ›MPNp– çT]‰áÑ­§‡Ú£ý Ç3ŠÔŠ‘Š6’έÔ1t°)Š*ÂX§Z¢Ü³º ’«b·j,AK*ÔÒ â{IXrÚ:û1¾8,šŠ¶·ÜNúè"ܵDܱ0Œ­)³è¼­B ŒÝgå=T_ÇtAù ‘nˆþÈaœ¤B6rÊ]lãŸ606 n乘ÈQʱ%½>vúøŽøDs[¹p³É*jÌ9[ìŠ X®2eÐy éêéÈHÄËÅZ’ª¹[³EÓ³Õ ßâ¡Ê»€sT°glA#¼]9GC›ñAĉz±ït¶yì—ÿK4ì›-lß¼bûä ´[eµÁ²Bœí=Ø(°QP`t6â HEHè†_è5ŠZÝ(MDÒ(ÌÄ_Æ Rº"qÎ.¥(@W4f¸Ž†Þ/—v«}2¿í›#nŸ|r¢bßìsä©›Ëió ðöË”·_V=;=öÍÁ·_¶¾ŠéES$Jš½§ŽL^%8_´ñÐJ ?ˆr¤«„\èE4ë{ #Ž:› =•PŸRÉ®Õ',1J´WÝÅ<ò*ÐYÍZ>˜/i9Yu=œR*[oÖUf*• Ë ü^I<›¢B3ýУWH\D…E£Ó#Wk¾WDªgþ4å÷î,!‹>ÿ¡¢“è%ñâGh7&A û®"ÓÌ©¦Á>ˆj ð–øƒRˆ +ù»XnÄB †GqÞ‡ ¨9 Q³9*Ò@ mûð4“ó×7v'g.^wÍdys}ksoce²órik:Yß\™ž|4”údøgøß£‡qYwgiwwº½q{owmuczesûÞÖöÒ›évU̧I÷ÓË+÷Þ¬?Û\Ó¿_š¾XÝPÉ™ÛÛ/ÎM_.mïN&‹›ÓåÝÍí³'šÉE¢„ûõÄÞ‰ö„^Žùã~'¬lQMã4^‘©ÖGb¡âI’ö#‘ׯÓÝÈRâ6Ø<v,Û¬ò*$¥xY„‚.*kºOFÕëø*MÇ‚”0.Ôž”%&nQù(;1æÔe£íÞÑùÉ’—ûn®û~«9ÂhUtNÝÃQ“H'E¡KxÍ[bRë®›û÷"e(ÝwVY [os8;9ow{uãÅäÌ¥K——÷Öïnî.QÙj¦|ðà zŒß;‘î Óf}²¸¶¹·²3š>2wîž 8Gd‚œ¦!ÌŸ'jÁÉWã å† åœP™£ˆö”%"Ì,QPÂŒŠÄ^ ÊöçÈ1¹J]Àáè‹Jq3Œ‚‚¡…,r9èî£^a&ÊÛáUº^†žQl)„J¼ÆbÎ/ { ÖAom3ßteCñ²ƒ±^תŽ×Õ²‚=Ö–emÙ|×,ž¸ôŒÈll,­OW&/¶—VV§Ã¦“û³ÜÝ™zÞé¦_zqbaú›´QŽô° ˜Iý€]€m°vis­ÛWÛIO! î·¾Ú7b`¹´<Œ¯\Úýoýš'Â¥õC…sôeù™ óp¥|ë7œÈf‰K¿»I@]C“žh'—.YÖ…^‘ |ܬƒßJ-„­ŠoQ®JZ B.䙲Ä"£×Û$׎ÇTv¨é0Ã[Æ; ÂŽîBÞ›‚"äØ`e6.Ê$ë*ñM·))s–"ˆ[FÉë–ÄÌÀÇõÎ̾+™Êtåu ²S¶òˆ§4 ºï°å§rw˜©ôöÏ&òáâÒÚÚê0™¶^®.kÉû››kç'Ýdkwr—îdç÷)zv²0¨¨Ë*emiw²_ùQÑá¾7”eþÀø ž¾pûõÒÚ¸(«Ø§|Û 2¿©šUtͬþa4oo 7Í—£ÂÃ=qíÕäÞòöê³gkS”e~a{ysim¸[^™N·÷ÿV±Ï—î¿\Ýx{•®ì­HEXÅÅ®o õÞâ›óÁúX•þziûÕ0Uhü_¼|{¾]t.o®mRùûÒÕåW“óg'çdÒ³|4eÿà©ÀÐS\æO1úÍ;þŸüSvÊæmU=Ú/Û„•öô?ßÐÿÿO7ë?ü‡ËÌçþÚJK‡}møŸ¶øÿÙn¦£'Þº9 ÿGÕø“zº,]4¸ç6ÇF{ÝýIM.ûÿðpØëüZ æ.²ÍäBØo}uoZ4G†×)9|iâÎOð_š%ç'ÜsîØ‹äàZÍìŒÖ¬ýÛjFÛïÕêÿÚjÑFP]JMèEIð…Øò½eà‰ýá¼ÛnE«£æÀ¾‹mßϳk•þÚZON>4¬š¯«F™DŒ¿¯†¿{¯ÉòÉPý{»oÖ¦;'ε±ùëÿe¸á+eugº6]9;9k¨ïä£ç/7à×S”8¿¨f½+«kC[å;K«) Ry¾œ×"í÷¥{»KCç¼õK—–vV—«ŸÙÜXÙ[Ý= ô''&çïÉoþ‹ÃŸÖÞþKõ-høæîÝéòæp©^¡éëÚúÉá“Np:•ó_NŸO>™œ˜œ1%d¨~ûÒ0_†—ßÎôòëéÆí•2áŠLꦩ·gÚ/3ööóç;Ó]šy/Ïr+ÊÎÈgôѹ¥Õ­aìež ¦: ÎŒ¾~þþêîÚô·z®UkðÏ»[Ô¾~rþît؄Ϭ¯­®“`!B²ù|g÷ .˜iͽÝíÍWÓ·v@Ë^»½­ek„¥Xc2ì O÷ÌoG›m$ &½»YÓ&A;? Üì$¨~ç•¡»²÷¯½nð;¯æFŽ?ºüüù°8t8Œ9lîœÇ°Ü]ZY¥—̾uý/š¦çºîDu^áÿ˜›ÃlþÏ™ÿ››£¹Ùÿsgf§H—šžzë\:x~¶Ìýß°ÿ‡½Ÿs‡ÙÅéÚ—þ7ìÿ€agz, áAïèmzÀ°wÿ9‡Ñ¹îpw¥ÙÊ^Z›n¬ãMÂß/ýOÐÚC½KJ ÿ[TÿÜE•PÐ’»°¿!4ZYÿ9×¼ö?óÙ»ìpM¯{ÇþîD”Ƕ üæH}¹½¹5¹÷rieó×¹¡¢Ïä£GjôõÃÖ>•"'Üî(B#Y8’0§Çv–×¶µ³dn<[ÛcÓEþlmcålýJØÜZZÖopåmþ»7+KÛ¯ô+2[K«ò#çb‹B¯§Û»³²—›Ûÿú»¶ûøÇïö'Î_þ¿éòU‚?àïΚ«¹1¹·ù|÷h&ü væ#ÚÿÎûÏ0yÒr¦€HbVó”1·!ž¾ÿíoë0í‘?`¯ëk¯öÚ¹íÎýþí®›Ý뺿£;\×ýñÛÜåõg›;;ä­Y[ÝøGøBþˆø_tg%t•æØnÞb”ü3 æ÷·—6vžon¯Ï­ûäÀå_}÷ÀÆ×ÎòÒÚôÚÓ;ÓíåéÆn}ïØØ[_ÜÜZîŒöºíéóµáÒüˆŸ!¶ˆ×7_“’ÝÑUg›ÎÓ§t*¨;ëÞZݸ³¹*¿7Rò°R¢?¸´±²¹¾ú¯ñ–»‹&+ßJ>©ç–>|ze‰¡õuqþäæê†4u¶sÖãfúm¤mÔê/§/¶§Ó¿ÊÚû—-”žUº»Vþõ7¬•ÂiI)~º “‘Ðÿ©‘é€ÿ€´rh|†Fÿ[gh÷Ûg¨›=CÝ!ÎÐüýï¯uyÿçß.®-m¯on¼™,n®­-½˜þ®ÿ{CýAGÇüð²Ø=™'Nô9ë?úï÷UŒÀ“ÉÖ_þ"ûÓÍ­ÿã—ê¿×¸wÿ•ãÞý·{øïöÿúåÿ+Ç=ý‰ÃþŸ­¸ñÅ_ö–&·¦ýßx­¤wuKÉeöÔ…~2g€B06Wþ)ï꿨™=eaàf¦·5Óý›7Óõ 5Ó9Ÿnfû'aÿ¢VJqÉ­ìÞÒÈîÊý]!bkâVž»4³ÿcÚøod xsêÖøo2¬æ¨þÏžý_ððø~.í­í>©ž÷V×·ÖìÉ1 ‰¸«;"¼O½¾bï »ÂnUj¼¼±RB3.òÎÒÚtxgs%î<;á4âòÌ÷w‡Owv·™Qê Å£³Òw–«¶œùöåêî´™ØÐ³ÃÓ¨.Iî¥W%yô!âÎ\åxô‘&JZB]Üy9’v$¼·>ì"fbK~3ržÑ‡7ÉŠ€£ð((ɧ‹K[{ËË«›Z¢#ßcŸ8Ê÷ƒ¡Ì×›Ë/—êB=é÷­<ÒÏuÉ éç­FåÓ^qtîÎäîteæSúèîÞ³7Úž"CIé)•ÞÙ[ßzEÑÚú‰}poxã–NíòÁÞÆÎËÕÒ‹¦i{:y<][ÛüµÔ¨|:Ý^]ÙÜÕOªn®î’;óÞÖöæÞîäêötº1.¤­½±´‚îŽãO¾¦¹zcomºÅŸ;«­~~y}º½´¶RÈÊõã{Ó¥êg­WžG’¦K“Kk{S”ÁÌäF/¾YY>»¶ôëÒêêÌÏÙÇ÷]%Ž„—»ãÏ£ÞþÛÖtk¶ŒC/§Ó­ Uß>”¯W:®lOw^Nn. »'Ó× Œ«°µ6µ7ùÅõéîË7;»õäÒî.í<›5³ V÷Å×K/¦»2c/Ï,Þ&²\'XÀ•™—âU Ø.½œU6a˜ÆÚïЉo”ÊÝÛN׆$N†UÍ.Zx“Ž‹»Ã¶ùŒ|ôoU3[šô`°ï½zs«d]œ¿~uX]“áü ÿ?”‚ÑêâÌÕµÍgKk¼±È‰A;g‘7 |¢»ÅìÆ›Èèõv1ûµù­$Í|[ìì÷F˘ÿ;ÒÈëtßߪV°}o¼Äf¿;¿ï\²“àï¡ ¸9œõY?ïÇž7AÎ!éöAWœsg9ÿæQhÆLޤæÿŸÓÒ³éÎ/{ÓÉÂdø`ØE¶W—™dæÚæÞΔy.žÞ™›Ó¥çgæá…œ¡“;¸ÒÚ­_n.ï­ÛÑ—K»KÄ5†¿3ÍØèÚGôõÍ[›+Ó}?üdræÿÖ×6††s8öv)Å fÛKŠ?@UjùåêÚÊöTi=ƒOé_»o¶”NöÌ{;O_ŽO*zкèë%^ \–ä;”#ŒòˆNPð£ûÞy6¬»¡©î3tâ½éî-î†ßôGo767ªrݾµÍåWLmò›mCÉ?høÙz÷ÖÖj\W—ž­M3ñs$ÿæ…¾¼·³»¹þg-õ§]ìãׇn=üTþóæáÇ;Kd 3oØ:;ÿôu1ÔåT•ÿ„Uºóü×ðiü7/ƒµÕå÷½Ø Ï5òÙæî°Oßœ>ß½½½:Üw3Êóßù{÷ä–¸ï‰S_Aܵõ×ÕŽGÿÍjÁ¿·U”ùæ7ôrJ†Ã´%ÿærþÜoŽÒ›Ã´çÍßÝ×S^áæ7[ó‡Ú6ÿÇ>ïw÷6÷¶—§—ÈÅ÷·ŸûÃéôwWa}º»´2\ƒŽ[|ÌzœZQ»Ãa¦SU˜$U¶71ûÅpƒÙÛšÜ\Úx±·ôb:¹³¹µ·5sfðîlOw¦Û¯§“ûÓÿÛ\^YÝ]z¶º¶º‹8³èÌá¶Î ²‘a‘l-­¬ÌüÆÎÖf©¦ˆ–ÖVuÖG¬Á•­Õs"òˆöÙ\Û¶_¼>¹¸·»9¹»´³;ÝÖ°¹J#72YÝÙ\[ÚNž‘uèÉñr¿x=O8Ðnki½å7“dæÜ1¥®*·´½ûlsi{eÂT¢ZÁ–ÒTfÒ?‹QýÍ¢/ÄDy¨²ÛxO‰²,éª üfѪg¾ÿzº²º·>¹;úoO]o6÷›\DѼ;ݘnË$Ú#ÄCójcxГçÅö¦MÇMuüš¼höõU5Ò ×Œ¾q{owkPùöïTÊ“­¥­¡Ò;«ë{kUÖšßì-‚z5“çÖ [XK›¯§Û[dnÔ‰ÞWjµ×¨W¿Ù[¢•6¹9}=]{»êMÉÉ4Ùa¤ÂÎLáW¯ßYÚzè‚p Ù±†ÅÒª‘Îmî±…×lO<[Z[ÚXž½WŽ4ßùò )ú¬Þ"ªØÒQé{{φIqesè…»ÔÍ_Mß¼½Ëk«[œ®jmúCg¿°S†&h#F¿qyýÙtåÎöæóÕµ©éo÷+ùíËÕå—³%›ßèíÝaOÄ.t¾rùÏ싳ˆ€Qódc³LˆÉê†däÚ!/ó‘öïó—Vñ³ï-^¿žü—ÃO¯¿ÿôÉ“lúÝwNŸ;ùøóÏ»Ëm½w!<|ðäa¾ýðÒ7§n^¾úàä©g//œ<}aムß¾°ë÷>¾tû_ü• ÿ9yòìO_ž<ùÁûŸ¼Xþpjgø×;.lsÝ :ý}zóê¥ Ó«T—“§WIàýö™g? xïÌðÏÓ]úëã¿>þ4•¿†´ør(üÑíá¯~aJ>½ðýšýuøîý—ßó_Oœ¾Ôûǃ®—{7†o¸È5ãJ~òéÅÓÝ{^ºõÑO^X|ÿÁ•ÅéÞ ÛÚÅ—Öo9÷Þ/ßÓ68]5ð_WŸ?ùì_á»°õòò³ûÍ;W>½üÙzsãÊÃt1=Ûzñ᥾zz(õ©;ß\¿uú«ë?=ùìÒ½ç_¿ûþå¡#ÞÿîòP™&yîûµ+ÿz'ßÛvÜ¥Ü}Õÿ}ôé§¼;Töý«ï|záûwN]¼r}çÝ´¯žþབྷߞ^{çÛÓï}?nß¿ÔüÏ|ôÅ g~¾{råìÝ·û>¾²µõáû—ž^üðÅ­O¯~ôÍ¥÷âÂÇ—ús§Þw_ûéÑ™÷Ï_ïv¾=qºq߯´Ífüî©{¸wòƒöó'ŸÞìÞ»õd£[^ØIýgÝ#ßÞ¸}Òo|s¥®¸«ñÓ¯ÏüN=9½“ž®Ÿòùª{ïÖÇçN?ÿþãÕKÝò'·_|ÿêÓÎí~úË“oÏ~öèÜí‰ÓŸþãO¾x÷«ü?¾ºöÁ…/C·sñìÍç——ï?ºtí—þúâÂÚ“°øâæÎ«/¿jî_¸|î§s//¿pÒ•—÷_]ø&º:½±øÅµk_{týƒ»çŸ]_:ùɳ—>½øô«S·.~wâôWoùon~üÉöå››{÷Ã×w¾iNßj6ïOoM¿}pñö—[Ÿ­ßy÷äæÅ;Î|µúMøå—üÍÏÏ/þx÷úw/îùìÃ[÷~8sã—û?]ùøþú·÷n>øê³ðýóî¾zøýóGï}›\ 'N»öÉ»WÝ8ûìÛÇï¯õòñw?øw¿K÷ßß½ºôìÚ÷×Ï\~øÃ{Ëg¦?<¾öÓî“xîËsOVWßÿüÇ«ßNo==ýÙµŸ>úÈmþäŸÿ|ö§—î}¼tå“pýÙ©½Ïž^øv¹]óOœ^^y±øpåâË÷VvòÕÛÓÛÓÏ®=ÿ¨[øâù“›kÝ‹|ÿÆ©?ß;ùüå•k×î­¾Ó¯~¶zwýüéŸÏ}þÙ㟟,Þ;õ*†>{5ýîë;kŸ/ôÃÚÚÕk?®yã£õíöÔÆ×—ž^;qzó}ÿrióÁ{¿lûüä;[ßOÝ;¿t‹Óg¿üøõ•sÛmþjoûQzÚï¼êú{´,zçüò'wO=é·OýÜÞÚ}÷ÎÏ ?Ÿî¾ õ|usë½wV_¾ÿ¡ÿêÛ÷J?~ræ‹o®,Ÿ8}fçòÚWgî]Yû ý²õË¿¬<ÿðö×|tþÙÓ/>š~tþ£…Ë?<Ý>÷Þ«ÏÏýp㓟Î6½øäüν³w†©ðüKçãýOÜ« ·B{så»Ô»}êB7}ßÑ_¹ôÉçþÌ©{‹ÃnôãÞ™Ûáb\ù)žZúv/~ÿÍ“˜>»Õ^L»÷žÝÎwo/}œï^?õñ/—n}þÉý/Ÿ>ù4ÞyçÔ§îžÿìÎJ÷Ùçíöêןÿüùÿ¸ùtñ— ç?tç.<ðîŋ׾¸téÒÙkŸ~:ì)O¿û4.^XîË“k͇_~»öî©ËéÙóËï/_¹µ±sõê¹/_žºúló‡û×.}úÕÂõ“ºï®?XÿÅÝðgîýpcõ|Ó|uí£ï¿½ùÞ7/7o>¾þháëxñê_ÿœÃÝ[×Þß]9qúöéÝ•wn?Ú{ïÄ“·¾¾óó‡×W¾¹öùWgï¾÷Å…|÷Ñ‹µË÷—×ïÝ[íÚéý«ý™÷œ¾sþÒƒÇg/={WŸµ×ÞýòÇo¿ºÒåGžë¶ýtæÂýÇ>¼÷éã½§Î~÷0>Ý=qúûïm|¿þýÓ­nß>ÿîwÿiûdõìÝ«?~µñí³§ç¶Vž¾¸ôÙýŸn<üngiáöóO–¦+ç~|vÝ?j–?š¶—§ßl4+ׯ~÷ãtᳫyúüÖåõç7^Þ¸ýâ|xоxùøé«§_~ÝlÝYuç—O­®žÙøüç¯VÖ¼:—zùjú͵Sk×??÷dýÜWË7×_úû›üÏ›ÍOç®l®þ¸··õusãÂ/ç¿øðê0e~°½øî·Ÿnï¾zšh_<óŽ?¹üó©æÝÍoNœ>µÝ®.¿û8ÿ4=ýéöÅó§w¦Sÿÿi8¯Dee à„"Œ(9ç ˆ9çù_ö9÷<îýÝU«ÖjQÈ”»Õ^9,UÏihÕÄZ®×¦b\_7Q¸1ÿ:0 ðõ  P¹Ù߀Pó å6"Oe¸ÕЯ•.­ö¤¬íw½jiÖ>† ‚mµŸßY´ àJÒõU¢÷›í3~9¡ !oÆX~¸Þz¯útfHƒò¨I ‚ú©M’õU| We¤§ê°#ušÃS™i¤ Æÿã¦ÆÁå'¬†ÚÓj¼_ºÉ?f³Òå-ߢÃì5˜W=gqá »:ÓM‡¹F'ÕJ›k7N*·k¬ž½±²ªu!Fü›8RªÁ?P|­9Z2·!$cJ¸”÷°3PXO8© Ð_¨! ¾µÁþ¤h·néJ¢øF§q#;æÌ æO[–›îvo¸HíkóUíûn»ï¦îžë=þžˆô¿IÛK×¢ºh2÷°¥ÜVáñ—úK½ñ[EDî\£×ÛBãе͙.¯k—níµ½‚±ì^o/Ѻ­Ÿ¯ôî&ØCm–Ãçœê?_ÄšÞ¼¡`W}_ {¿g¦"5ï«‘TeÅyîKÌ Q•J“ÅÛ*WÝÂõ‰öS%±™™E¨ q¹m Å‚\s> Ô¾ËÑwåû™š®fj/§BÑó^øix´B•(@ äB¬À]¾–+[ZOc¸ð.ŸÛ»Scg{Domj¹€|««ÃŒ^yåÔ ˜J5Fß^ÙdÂHôî9"å°,U!ÅM<…N÷s¨kÿ@ÁîÔý?™ã‘ŒWBÙpÝ´æ‡ü¬²˜PMí»<ŒV›ÚèÁ­7ߣë²õ_B4 ‡Õ—“Ý´cÓ®«`>>ìžãˆóƒÖQæ~ñ¬a«˜b"1½ò]¿pœN$cqrœr²1¾ ;{q @¥»›i× ÷ÌÕŠçw•ª«Ç,ó”Æh1—S·WÕz7â ‹x‘ç1ö*­LnèjI Zá.j´¿lɬ"“J'›éÛöaõl7”dwWŸ¹©$ÚÚ$šroT7Ù¬(•âWˆ ·&^6KŠbžtT¶²y ·°ëÔžÉX¶›9?³‘ù8‚d‘,àqQÙJ76àÍ…•® þ½ŽX®-©:%Ù²T•¨:Êþ°rÜÜ“ÞÆëµH\®úÖ9ÀHÛ½:*e,ÖeK/âjÊ*©JN„y]¶&gÅî?O¥±ôy…«s⿈êó¸Ü|µq%Ùoügˆ¥è`JpxkίXƒbߢÑTÈuË0Ÿ‘Äí‘=t¨ÇC­ºTy¥M}£îâWŸ¶¤óå S­kØÿ¾Òb¡€ 3^Ékn¥~ÈÀ7Z†íëÆ®I‚rœœK{Îׯ•N”FÓŸê%ÈN|Hs~Æ*ÕlÎ.ÛÕÁLêŒÉíðŒï~=?éÿ@ yC4MŒ²ºþm@¹’µ“\utóJ>[IêÁ„­æ¯I ¦öOjíùÉâ‹WnQc¨u%9;×v8ÆöÅ ð·ÇúóÜ+Ç÷Igþ–·sQÉ—Â’j“-êÉäKm/æTåIÄC9:"ÑMfjõ–™º'_R}ðTô°>îd~ʜ仹Œ4ñw‡¬ù1—e‹‡ª©*•±+·¥w‰ÄŠ€j½ßA¿UUº­š7U'+Úþ3ͧzк’Úò£j!¡Ú@)›j°qtÉ웄ÚKN˜òhþ\j'¨[E •¯¢—ƒÜw€T¡6õ–öQ‰Qš"ÏšU ß…Ž©ÇHÉL“) ¹‹j }÷çZu%kºuU˜f `v•j@6Ÿ+ë&öÕvgWÌ®×SCÔ*Œ²Ø´ Æ©­Ól#n6|÷ùð×Ðå¬M_Í[¿/¸s$äú¯$y÷~g¤_„zæÿÀ»YÞ%÷Á—4–Š/•V9¨È•#Y|6#­æEÁPª±gUm°zÕÔΔ+ë‹R6Ÿ•¹£( m¬ÍäÈm/qc«ô%¿¥-ìÕv-åòÑb³÷4ÉÂØ;Þ½´3†RÕ3ÁÔ¸giioM$5‹Ý­»œ«¿f5QŸ-¸lI¬­äógÞñïv¹ 2§Þ¬ÁF¿qY©j«>± pðÔîòê4S5 ¨1îËêcqø´»t>Ôj=SW·•­'504¢e\ßÀ¾¬±»ëI}vÅÙb[>rª† ‹¼o _G󨄪ù# †MT>kÀ´H´ÈbËæ›ˆ—íØÒŸZV¦¶õ1psÓáó™Ü³¶æäókYµ¿Zëú6Ê7';à EøZŠ²Ý“áˆaÏ{÷K¤ráV¯¥»_v{ýV­¢+_!üí÷–NÏc¯«\%–Ÿ)0A±œ˜ùМk£è<³žq[_É„¦Hì͉#dèhô®ÍLÌÕ ï²îªôÉL[ATÛÙ3û5SnÙk²:@NI˜®ÁÅvgÑ;#V F`#·bôæ¢Y“Mör–zÃOs!œ½þÍÐÏ ,‹Ë§µû‹?ãNú¶‹´µUÀ—tË!^Ò¶ï†ùXmŠù2^D>!Ínˆ?@°ü”¯ÑÖÏQ=~ݱ¨1u ”XOæ>PÛâ5²TwÓfÊÝÓWázíØ8¯§cb§‘’RA/Œ^åÉäÂÈ`kR¤$—yÈoYBcþæovúö¥~9™è@ÍfÍEPþŽN/g¡7«¤ÿÚ5é°‘¨¾$¼£# Ä£ì|tðK½íT‡yÅ ’·fõL ´ †,æÎÓ)jÌk~Æ¢­ÄäæÝt &;º:}„e\#ÒG»ÍœßºÓ÷êãëo‡S´ð­¯’½¯“Uã·žýFÓ­{µ “|Ô­öð×¼~ꎉ—v?Íœ&å`”å3~É— ÍÎ䦧É÷Í*Ý6SªÍŸFYqÛÜÇ3j$ê@àÙ×éÒ[éu]F$s%2Xs²Ž‹»~ûìEÏ|>³Ìè½q7Q‚ÓWŠŠgɘueP+Å‹Â} SwºÙŒGÀÙ˪ÖÎØk4<^ër÷'ÙÊ+|èÓǨ¼êî߉©¨cqn§·ÑOsýÚe |ª±¯«kíE¯œrmËv‹‰|ñG‡Ðx[6†©/†lÚ{ý’:Ïd. íq\ ©ø`B‚,ö1kÇÔ÷ðØÏáç4·f«ÖkÚ½ô•^²û;+©XgâJLîI.µ÷ÿ@0£„Þ¡³MM¡^ác㻄¿ ÐšžÓ"'÷©y ‘°F/+¼7µ³Ô½Ñ§êsßGÂ)´!Ìœ²¼¨þ0å‡ÝZX¸æpùôZ)­NkQ¬}­þWÕC³g=ŸÞZеeNùÈ|i¦}T«Æ„µy„ÇnõôTcˆöÍ]«  X³q&V§¼S`‹ÑÕ½µ: Ç꨸Ë.I@Ûh"*y©®hhÕ\Ÿš·Æ¶±ËôÅþè› Qöåq÷H~y¿î€QZRcà@ú±çHÌ ý²HŸ;ZÓF¬vò½Ç›2Ù&Í1p)ú¥¼*#©µ;LlÂfª,`ÿ|Û”]­ÛS¸ŠI—\±ÍŽìŽU!I…¨níS|©™³âÑaè~ô¡oîýj¤ßc†oÕùåƒç²a= …ëÄÒbš÷¡wM$«n<’ŽIWwšãWò.%HŽ>ª<@ÿ{’“qõïÊ凜Kµt]_‚ÞRŸ#ë»k$åÑ×À—Él·û»†Öl·‹³,×ÑKЧ⌌{$T€Ú'š—­žÈÔ‡}:BÀ§3jüË„‹Ð"Ɔûx!VÉõ— }iÏí\Üg±9Zl6Š#±škÉ>It…ž†æJ/œÒ"†TžïMoû%¿}ï~†Ä¯,^8Çú5µŸÒ,LbYY²ËáP¥DÇ^î *6â__™µ¾ ©ÁØø­¼ûõ|wx¼bhr-yYŽ‚bÅ(:(õj‚X1ß[Ú¢Ý}ëK §$–a/ÉÌ<+ÿ@ÖØ$ñÎ!ôòW#u*ùxe1ƒzPM&Ã]×âå¨|cݳK%ðç ±›žöG[Ò·l¤pýšm5!“S¨D„°B«øj@e2¿éÙË;Þª¨ODN¤ÃT#(€Õ¹œ”tf¾ÀV[È`Y28³jm·K¬)÷2uþ]l|¾OZ­v1Ôá¼ez /U€,“t4ë'Ò(ZÖl\¬G´]ÉÐô|îéú¶½jz&F¸V†c½v^‹p`±OÕõ"ÑúzÌÉ©ò²yÿmŽ·L"{çJdÖ*¿r%ˤ>óCØF<ö7D™Á¹3U¤Wïˈww>Ðôu«yé ©þz—ƒyãÇ_z54Þ_z^B«g>*©e,ê~?‘ƒ#4ÊQ„z`ÛZ#-f´?Ö½¹êH¿»I¬ñä¶O_§'F7‰AEK¹˜l 2öÝãKÑNÑ8¼’ ˆÝESj »®J/’¹¬VuFñᅽ栴EŸ×ÜQNwÙp¶¿tß‚gŽLÏÂó/çäæ »¹<–"ë‡T‚ ”[¡°—ÞuS Í=—hXC›,ÇZÚ.†ýèïÐK¥wo4Ò§¿*öü8€ H†–Çr§R:GÒÞu-•c+/YÆèªeÛRbÒû8‚õÛu±?’¢öµGÛÖK‚„Ë^:ƒìwÖiǦ¯eÿ$üYä 7¹ø ™Ö‰¸îŽ£øÞš ¬ .ïb<üb¿Ë†3¾l7 †"º« v;H™DR•ZêTf> ç‘kÒ˨*Ó'Q´RcÖÑ“¾Û%‡6ˆÍ·aã{Jà³-L©“·ý¥Uš ÷RBøÿÀ¼ñP.Z’/¨W>i‚bPZiåH¸‚Sv">º{IÄD¤îõ¨Ž*‹ÄJ“wiõ±ÇW,¦e%kÁ¿•hé®E5€']ä—I»›pKÛÍRö²<@Æ«WQ‚Éêxcr u|üu…Qœ\AÔ–Þƒ˜p—†?^µÀÇÄŸáZ‰DÝ¢+U'öŽÏü¦qãú¨õ5¿ô‚º(ݯjŽ|-"þÚæ”}«¹ŽËǘÛN;Üy6¼¹µtõ’UâÇíaÄvÏÛº+Ϥ=«kCâÞÆìöä7A¼L~y)ïý¢9§yê6"Ì^eãŒáîoñ¨|00ãþwÌs—ã}äìÜ¡G¿ƒ? W-kÄMë„· G.šÌf׿}6b9{´F…+n<ñ‡]Œ¯¨¦Î¤Âð±” *àÍñõ×í¸/Öã[‘Â3GF:9€ÍðšÖåawiF¢ý†øµÑåÊ®¸™¼¢öB>Ï‹l½FÜ‚±MèØÒçð+”¿Jߥžl›Mék ‚dJÊM‘V]¬o§#Íýì&éãÊôîÛ¹ÔªŽ¤Wçóë)¦Ž!VôQyò†¦Qí·Ä\¹ÅÒÛô[*S“ñ"¿*2•£\C³Õ$lc#Ãh‡ÑED¨ÙÒðÑ£!í⫲ɿ»6}™ëv¯™­Qk"~Zem›ôU×í&^ßyk!›U_Ìø‘øÂ…´3ñµb÷‡«Ò["§AvPšÊÃ5}o.愞²<Ú\gDD£j­LbL~Ä ’C6ݺŒMq3eâBÔÜ“·¼U¥1ª¸îHV¦ØQixÌaS¹¨˜Y©se×Ý ^5ù0ºAl¦ «¸ÐЪmŒâ¤¼|L¿ƒ/eI\¥ûÛDVÜ}¥2 Ç+…šÐ–òìj¸W@{ q˜Ò†Û-mW¿LÞº•ewöãfLUõ³™“2Yx´4¿{Ú«Ä×dúhÆ9žx?§ÏO…úˆ¥ ;8=Ç.ïæ²ÿª‚üâ"‘Ö{¸Êä.®ˆ~ÔÌöZ*Z|•_Ÿ9r”Ö#ÍÜN#ãý|…¡rûÈyÐ4ݾ½U5ód<¹Ó+Ì-lÈEW^ïú¦íjµ¶eÝv¢tþŠßupê(É […òOñI'¾°Ï¨‰¤}yx…†ÜÌÆþå »Ò}qsг#¹±)±R rW ;ù÷b~ I¯Ò¨1é5ë»))+ï{M €Ã.îÊs鵇SqíwCä_%ÿçí1öxØ.Hê©¥¥ÓåbÊå»b¤ïj·° Ç7v%K—µí†}]b€×uV“wqçØ_ìf_¡>ª=´z9¤d­DpPÊÍÊ!B`¡Åbvï<õ’ʼ+\E§Ö¿kî=OzŠÞQþ©{¼Š·t¡Åݹ_Vw·{T¸=R¾Ò¡xý×zç–ä׊|8À;ÚôÙá÷–ÈË>Ϊ§w&ôŽXø5¿H ü ë•sEFî#Í]h4 ó‹.eA´úM^ÊÈUÜÏsõË<'ãïåT¨¥:/ÿ**îd z7j©ü’•ïŒ4W‡;ñ³‡¥ßQ§‡¸b&Úenj굡uNð›ñÈçÛ(i©ŽýJoøN*ÚUÓ-å.oµ²Wé÷d¢ ®ôc´‘ c|ž_—Æ@R3j·±ôñØŠGá^UEç3f²[dr{>V6‡ç‰’dlø2pTfI%Zu‹ Ü”ùµ^r¯}³±ÑZ>8Rêá(„LM1DÇ€¢+_άKA½IwÑŽÐêœwú¼Íeƒ<·DAìhö kLµ­Õ‹”è×L«òóæ‹Úu R¦j`åMqwã—‰üuëaÊoJtuàHõÖtö´Ïw‰szËGG•ÙÆ¡m]àæp"KV5Tå²ò™Ú—Û€ÔÖéæêǪŒVë¼ÆŸ§A(>Ùº>éN¦–·«Þ´&÷;j8 ÌŒW ôÎýÍÊÉ¢öÓƒ…ãÅÖ”à3:hýÒ0 &Òä‘€ö`}³l'asSóñ)—[M~Ëú¼]°£þ–•>õü ´öŒ?švj]¯°_)ä$¦O5»:ñ?0¸·AØßæ y:B³ï›®â C*9º¯¬UÓ~©Þœw6Ý•ÖüviºQo—ú·ÊPMßGë¾úùvc©Æ>OlnXž|ó=çvPÒ¢+쾦ÔØp[u5~ü\Ãóñ‚2[?:V{Czƒ;y Õ2ÏÏq¬Âì½dñ~f .ˆÌΕËÇ#‡þ[;µ¶Ë¦cÚ9C¾¤¡Õq£Dàx«PKJOVtD×Ö:ò†+BS'ÆÕîݹ{ 1ËZž”õi•ßSÝ×óTÅ$ÕºdåwºÑ׬4Ú}åø’›Œ¡Œ›6 ß ÚìP.1µo~qáú€Ê?p:.Q¾Õ¶ÖªÆ×;H]òqÜˬa¿Úû;5QÅ#Í£¾üz]>L¨"ØL·*¶xLøisÎî\¾Ùà@F7±Ù[=Í,\îë®~n‹³Z©pZ/³n·48Ë÷ïÍsQ'•ì¸ÊÃw±áé=yúOz—JŒ>ú,¿Ò\{¦qY<‹œó̥敽swðÒ“ i­eØv¬ôUb<%Q‹ë%ôÖrBAÌ£ÙXYÖÀÔD.t·NÓŒ£l&t_•ז欆ϒ)säËåcª.NÕ7j­©fGdiÂ¥EE¼ÌÒÓT¯ûãèÙA›ýгñš}’¿÷ÑÁ˲@éU½¹õÞ{ù³¹Gœfãb2H©™k·~³àí!”7í–¡­®QÜbSïÀ„£›×=¯V$£ãPêÁð)¡”¸Õþý×|æV'|‘Ŭۧ<›@rÙ=I&̆yžcX‘·-å0% G£ä ßkuN{ÜÀNP$Ë>`=u±ÃÙ“ÌÈÜÃAµŸ†ÈÊ­µŸgƒ:IJ½VÓÿJžp‰’Ø)aÿl7YÑ´ùvN´\ø¿2:ZÒ¾ªZa+?Ž7»_=€µk`œs{„•ÂOßy¯à†<¬Ùýók=BÝÓUÁ‘!ÉMîóz ¡ëH¯76Å¥àäÕz Ó+n¾ä{$³q˜®ß…:›ñµaU ý8Æ/ÄÂ)þ0¡t9¿¸_¯VÞ¡äݨå`øÍ ac˸³zçíÑtÁ ßu·HIŽ{zkr/PŽë¥±cEùÁb†Üž¥Ž¿Wxš?kRÚ½OÜùfV&vþ^’Ìó2´£Ñ;†ÎZÉ”¶ ã+Ù‹”ÐVa­n0ïà<¼Ñœ}‚ˆ¢ÆÏùãõŒãlèæRQÛ/²ìþ¡]C?%e8–M{[}]ÿÖdT€ì¸ð7½©²Ö„<2 Ÿ?hHgºâ=žÚ£‘5îœ YfGvÌM»vºS ÚGt[õa—T˜Ü»çm~¶ƒÅöþàð"™Û‡]r·) ÉË©dh`f›^óÞº9EµõïæÔ†‡JÑP` ¹ºR–ñZ޹­•Y(¿wy–ƒYÆcœ=qÐa1…&È ‚X£ÃìiY~Ô†¶y…ÔÀ/M(è~Ž€dUÃÒí“uxs¥íŽôü‚¹ìt`¡É;¦¿²»#ÝkåɨX1›m!Ë­]šJvù;ƒm‡óÛò!WjMl©¿z-Ïí(äLßÁ» ±ÍKN#•G÷ïžsp«¥žhËm¶˜Ýb˜º©r®Ošôª¦ …SZL*•”»æb‰€>xÏ×s.OßS?œ{|sI™¾ÕÚÇ~PJ× I2’¹ô¡x!_Ñ\áQ¯½¡&ø* Ü”£ÆŸ]òÿ>“‡ÅŠ98د0x_¾¥ª+®JW ÷Ù@®ÎŒŞ%mÞûI­5¯! ãô w:¡Dv×Gï2yÓ¶€†4r™Ÿ§|8¡IÈì²Z…è„¿æŒXÔä¢×¥™cöø+e¼*¯ü¤3»tžñ쪔[Ås ó\1Ÿ•OàA•·GÍP„l•“Þ‰Žy¡'wh'àó v5µ5Ы˜¢Ávèõ§Øý¦ÚŽ/ZµïÑ®»iÿK¯æÊdµÂ[8‡—ãÊÜ—Ö*Gƒqö¼Æ•m|öŸšø¯?jíUÑ€é¾Û]iqÇK ‚ü|jw7ÚRÙœåÃ-´c_â§sŠÂL Ê¢ÐYI$u¼ÊÈdÍ Ë~åXÔxÞ;©Œ)µ©q˜ïl=nǵ ¼!"%ÿÊ™ÿ(‡½ê¢_¿!x*ßewîv~ørÿ²'½ý1-×€´íW¬X®ãS«]}®^ÞQÙ¦øüX ì`Õœmì »ÉÃrÎú?y¬|ô…àÌk×Â…—Òä–èêTe Ë`!Ž8…%ˆðîºûí@áÝ@ÈšNÕ{¦÷Q?kò,òK&~.034lO¯Æ;¾¹Ÿ•ÎØüÒÎ>t›>ö>~ÉŒª&ã«“Jƒ‘¥÷µ#7â\P‰aâ¥ÌÇHäHîNÕ×LuvÕ²»üì­‹ä¢Ð±ë-…(Ï' dÇMÑj‚x£l§ü¡²v~h6®½˜ß¤wýÄZ‘‡¨Ú¿“­êR7#mIY§´ª3œ¿”ýß™þv¸0É)Û‡]·¢¦åîãÆÎcWšíß婬Bœø •x£ºŸŸsÀO‘_À~¨óBÅcEj¦£J+`¯_ÙO¾ë™¦²êsúÄ[‰$‘æ‰KÃ<~ÏvRÕŸrØz}ùÛøœHy¹&ï†öÞËí÷P¡Û$èšH$–Žxá-EfA\ÄÇb»k£ûX4ëK™b¹/+ìš"ª‚ï‘âøñ“…mñÉ|ÕÜ+Èñ ŠÈieã7‰5£ÂÒßs|‘ó¤"ŽÅzQ«ð–Òaq)‹kWÞ¹A®¿±+#ðÀØ÷±ÑÕb!„·¡×D(ÕwªçÂùr6ȵÙ9+Ù]qÄ&é—ÁRԉ䬊î`ÏOV ¬ÂYÊàôù*拾ÛR{c-ìQ17,Ý u½Gb¶°ú+S­Õ! ±DÑà {ÌsSþðÖ:ÞXº މT{Bù}í …ýîYSê ÃC3%Q+â ûû9OÁPW¯Šõ,,¹ña#^OûxyµÂòeðqãrÔëhU÷š…Vñ¯IÀÏB¹ÙNkà=)UÑAÙrÍŸoôÁ«ù‰ý*ÊYh£¼›‚ùß|±·› ïÊþ’OkpÛÝÊ:ÿÜ3ŸA–{粡B¡Ù… E‚geÆ2;žÄϧw?ótõ}fü),²²˜—Moº¬}ÐܾYMO&~GPn©>T覸”®dI÷Ç»ÝÏ܆\ÔX‹'éçw€Sš$Î'yZ­@¡·ÈyM®ŠªôÌM9IeAUH©+-a&›¼g˜¬¤£vS2jq§uzï¢pg´”7!mš•²Euš´½ƒl‘øÞªeä%+”„´Ûc—¤Aèãõê)QïWÒGÁ³®á‰Ÿž÷@sšvdKñOÒZ&„àpzŠŽ[¯HÒ´IèJíÑúZ–Ú%¥F· N&«[hì¯x–râ-¾Zµô—]ÙKͰ±NÄ®Ï?VhHãÓ‰²(å {ÜÏ݈¿¤°ÕAoNmyõˆ°´±#$œ«@]:—¶‡H=ÖömµÈÕ>¾–nœF«§w8-†¡àJ6}]¨uçW0´,ö……Άb}@¤yíiéïUB…áÙþòÞêt4ÔEvê溲¨¬Ô‘LÿÔ>>Ì¿««8œ(B"DܧJ­ÉÔª³ÿ•ÖX“‚®Çkµ•Ø*|ò¯¾Â OjÛ6Ú"Àîh}r8û ?>Ô‡ïÑx¤‘ ¼$}FjŠ£Æ\½C·¼ŒÏ»eW fŽ0?ÍÔpô´ƒÔ¬%³èMçSþ#›¥>Z.ºòC!îP•–¾ß?"9Ø’÷š£’9¯ªÿjjÎü8±<½„ûJZé Å.mJv~J¹³š%å–Y7¥et_Í6}Þ˜µþ–‘N„ÙúZhòòæIÐÝH}çp€®+¥ýÅÇôï‡î¨d»ù>á}ñ&9ÝÓV“Ioµ+¥l&)ÖžWéswç”åë2.¦õB˜k*”LäêÄ—W$$ý‡0RÕ|A/2®ì ø±EǦšl0¬±vÀ_ýFÐ_¦ÿy'IùZ½™È7KÒdŒ3»§úZ©Œ÷®Ô÷÷Gýš6ˆªfE—àÑ+ömluv­ãOªMüµæÃüß/,lŸRóÊMû“lÍæ`«©U9íÓlϾBw¢,¢MWûFý)ÓõŸü[]­…ˆåÆð²Ñå 5̤zß¹r²iƒþpC‡¹¦<•™šN䨩͵>uàEënPXë ù¸³XûŒjZ¯H}Z3ú/ÿ½j9M€íà†åPËÞŬîn³>;}Ú™ žÜ"¿h¬§-ÉJ·¦èûƒÕVZômT’YWGªÌ\V­ÆÏÕwËÌ[Ü«˜KìVº0EÝ1¬:Õvô7EÚвJ]Ÿ«¿Nõ¿ÌÕ[ ÔÅúE !U¬Xó:é±8!ŒÖ ªêD:™&óˆ.3÷Ñ’U­ú™}Kp~qðùv£v?ç]ý$›-V[®+ݲKð¨Rdè×®¯Kò“ÃK}sÓÔ.øN6ZÚ÷™åPPÅÑÄÄöóöÚ»“… ‡Å« Òý®¶S5Û®Xæ+g*Ó½E÷'b¬×˜ý,æCíúÃð⦩X6Ç!¶«AŸàÅ~ú* ìµ´æ'·ÌS÷Mäxæv#ð›á‰×N'È:’7}<ˆy‡?½dÍœ­-tQÞz2¦¨t'fÌœK”Ñž:J’•ø´¸–=Ú…Ÿ6Xáú60ù1#¼‰ôž•%/æS:3Ì_T©ža!¦€-³æ¾a¾8(Sv#…°ï%áÝJCi{ylÁ&ŒvˆìË« —уOPˆÙ\d1ÚÌ ÿœkÿ9ƒ ÊÊ3w¬a¡^[+õJ\[Yñ$µç=Rékj1Áñ©ÛÓJ•‡ÊD¤?oguùsCµ¡‚3鼇¦xÌ k^‡Q{¦ÿpžƒ3ÇøíÂó›6nTF4êðúfÛÜÒí]é|Ò)æ»×_Ù+@ì"˜_nu§¹¶· ³ÔQgz\½­~ÃvèÓí[¾ª• [6õ^·TçLJ7:ã‡U} gE%›ÃzY20ån"ÆØêÚ`¸~ñAÑØå»ƒ™øÜ›Ž*`ïàtfwTÏÑ6Ù6wµŸ]ÿf:ý½ šHröíÛ£ö.lÊu>ϧ©UšdÐ?Ö;ÎÊ/¢iP¬8%^»)áÕØH‡Kî¢Ê³º&Íäž4ŒŸ†Íj-fÚlî‚FœW˜íœbX0·÷uø.(âr Ù\´*NÛ=-{Üè8üû¾X°ª& (Ú2(Vú"Ê×ý¯¤B¤æwj6WužV€ºcÕ‚÷ü>Âg8PµÇ°Ÿ‚½EcÊLù"­ºÈD½÷€²è¶è…ÏŽ™Qhê[ÔØât`\ìªä›s×"½'L{^¾ˆý"î"o0_[½<ÿ+Ì¿Ã`yô ÎqfÈ·ÖBwº˜¢;,”·ì³¬ºïKîËm£Ö·Œ}¢)©÷œœdØ®eÒÈ ÑvZÛ ÒË5$bª€xPofî:º¶CIû1ê©1iZéú óÏÃTë![Î×ë Zaµ.ÂÈO:ï£{]ãW ãÎÍ£8ÙõÌŠ¾œÖi{XªèÝøÖ\j¯ñ2Ÿ½€û=SËÉU).Ñ(«DÄpÒ–xo‚X«ÅÚ¸î,ËÕM§ÎwrØ:wÍÑRÀ,|/‘Á«óùÇe25/“¶ñ‡òw®äÓŠ¦ Ú¡_u_ŠÕtôq›ú®ä b©b]­J¹+}:W{ ƒ-S0b Ô?¢ ô ó¿ •j2 S°ÓóêM¢ú\X5‡ó &#ìœ~=ÈúeVò€R]0¯§ê A:sÅúkOsñ©¶þR›Ä›žš²<ž1ÒÈÝ,á°úu­ ÛZLY-alÎ1CvÛ‡Å|qI(ûW§nþPÄkÙó¹øVûEõ› Ð%¸´ãnKHOÚè—&:Éã}Òôm\õ[›gµ–éU±ô?èÃð…cù7æ5Žs2œˆã¢¬ƒðÖäÌ{”ŒâÊm±b×®;‘@?"ÝÛÌÿ ²šŸ.²“ŒÂåä¢UfoöäZg›ø+™÷6×îEÚ9ߨµ5©PËÆ©©M¤ÝÎ*9·W`ÿ¥r˜V±r½,R Ë£Ã7ÎÎUçÊÖÃ>›'Ö$Ôb=LÙÙ½LÀãI"û_åÿWDÔý…a^ëE jÍôÿ˜:Ï-U¹¦]Á:TL¨PDrÎ9 朳ç¿éµ¾~Þý³Çèn.&îªYLÊ­–/j UwèÀc–5Fjrðlu¬ú–ûÀ–.­üÏþ³ý)ÓOZ¼ˆÀë2÷ø#$½Òô…ûzqJQ'سÚ)Ôvnc3„/­¯©ð€ê³]éÿÖ@n˜*’2‹¸ËЌ奼‹¦]¸>•çÖ{ñu'0>R_™ÀÙYôï7ãü×/¦³Iió㌈ź<‰Ïg—ÀÕË8 ³*Ú ±N»Ù~hø9àHõ§´,ÊŒW×7é£ôD<Õe—ÿÂËÂìñIôATp*¦1©û¥oon;bKWò¼?~•d§*ŽˆP-^-üÿPNÑrÑ;­a;I> fÓz} W• e0à¥4ÏÕ[tÇšHï–?k+ï ÒÊM>ÞË ‡½•ë1eyM¶³îÖ=dÇß(æCÚd½°zííª%^É%ÜJ»oåbä°•PBôØ—•ÿ@‚9q9µØð©0Ú*&Û“aÉ›ÓáWи°¼+Åü[ÌF{kDÇ4ªØÑúF ;wÿP6ET1(OÅåp@vñÑÀõõ;V¯·è•KÌñçlݰ*X.ÕŒA-¯ wÂ;ú ·ÀÙÄ.ÔY§íFvou2_8Ά>E4,:Œd¾x•[\ep´ZÇâ#©jˆjwCsRRù2qК£îäºÿ.È6ûš8×°vï‡æµ7ÃfÍÜÆàaÅ죪T;dåjûÞ×ú¥2#áÅœµ6æï:“auÒÁÐ/‚ŒçÚ)A1+)ZõN-å¡é»Å9Õ²Ï~úä(ƽì—Ùž?q‚Æ›ì¬PN1çfaoö¨~3ƒWÑýl~«X¡~¶Ë4x ø,ÞüÈ ëˆêá-HúI ba=ð;ÜÌ%.y™ËFøÊåZãÆÓZIÂoõ©¼âºÝ®Y†f…>M°ÙÈ ²9ëGâ°?i ĸ oNå¾Ôø-p yÍy+ô¥'¼â@LÌuùÚÊÁAø”ù†GKE”±Ð¹Z³y¿úÝk7³};5ìî* chö‡íI•%?ã‚«#h¤.î¥Ë¶)wŽ-ZÓ à¾‰Ç¬¼…‰ò6©Õ‘Ð}{£ø‘lx3I/±}«y´œDz±ŠmAª;"²ýÖ(Ú7RZXð\Q›»Þú, ü`ܬÍæËUR²)Œ’'æ(Ú¡cŸ çD^ž<»7µª¥+¯‰#ókgTç&ëîs‘ì´,lz oÞí%¯À$úî·S?ESAyÅMåâU÷®—:ž(wü65Ú ½}ŸÏRI^tÁÑ;bL½¨\ò!_SEФAli~²<íIEÈŸKHÓgZ˜k-¶ýî¼óuŠÁq•´w'jì"ïÕDüOjFÉi =è=ÖƒÈñöëÂü‡û ú†­(¨Cªðy”¬»Aq®E£GÀÒçBÆþ–Òùí_&Ï‚Q™bpÇSM¶[£â$}Oà—€×`’™BÍ$Eµ&öè ÚV û+àëõ—ÉÃáªT©Ù¼[LM… Ï9V„‘y ¦VùÓ3,-§H*FË–£{`…åFYòø=£Jõæ¸ÄSUúzfC¶–=$ ˜&÷ŠÜM~Jý«v^pž"8@!Î‚áÆ…X)Å•¡2wöµvõä Vᆚ¡rÛú{YÅDA‘-÷²¬YŒÕ:î¸('ÊW”ýfiàðÍ(õš·òµ`­¾6ˆªè\Ì– ÁÕUMßJZrcS{t;›‚q1¤÷Êc²™NZ #.PmYq'C:ÑÊeˆi:°iª´®Å_WѧïÚ¢ŽŽö.ò°Ž™û£¿>µköYöi•"‰ßÅŽº¨œûâÝŒ%ÞÌ5>š{åTK¾Å%æ$ú£-Äe£ç³(­ùó K¨³‰ŒƒqÝCŸ:K1¨Ï”ž;Íz“qG `ðÑâìzT åíZóz´M p°—«ËѯЅŸyËI%´1‰Å%±íûtã#H{”NPœ2Wmõr­F-‹zçTÑ÷„zñÁ7J•$mNÜv(Õè?H>nã¹ü&ëÛ„Òú­sàGKé¸ïæ_k¯ïòÂò)æ6tC]“—ÓAÁJÛEå(A=”žN.Êîcu¶ Ú꺊ڞÚ}Ô±9[««)_#¥"{RÓÁ¸¦ž¦ÓV3EÄ»šXS#(\˜€jÓ3>0ÛT©ž-ý¼“¸€{™K*™A;þrªâúÁq#UÌØ^¤‘.”’“êi{¶0Â\]›’ò®Åç¨tHU;Z¤òj\<õwË¥®©Z@á&±r/3@ß“j$öKùÂ®îæ¾oLußü²úT€—̸ˣ/{Û€'±ý6†á`2ˆdN‚ÎΘô—?#ÛºŒ“FO¿i_$‰ƒ1›Sy[öïÒÃL£¿ç0¼í³Ü÷µ`èŸç3|éÉ;}³Ô Pˆç}ªBˆ6lDͼì°ÔN=…ÙóËbž©(SšéÉZv{‹Žk©L·—èóöäGÓ§uüi8[bê@¥\M/}_íœäšYjéæ—ƒôüÑÀ#£l}ôŽ_+êðVã¡^ùUÔ ÕÍD»Ó0wû½µÝ/} ^4é^¾Žì!‹‰›gÃT§j^#k÷ïë ïŠhäÑó¨Ý¸ýÏd…÷30fhú¤3î¬7*ºY’Ñzëå>%Ლ:8@Úòvа×b Øu1v5ÛñßõÓÃ-Y¾í¡Zc¸(®£y½Êl+Ò;]ù ¿î/ÓO•[Q›\Ï_¦æ…{u¬¦Æ-Y³{ßËg ÞûÚçÌÿI…Ô±zƒvðŒíÍ:ÑÇk,Þ÷öcõªß+üĬ¦ úüýi5zY©G«ÆÌIdÝþ«×"üÚɲcÇnj×ÕÑí6{aý¤Qw—¥3F‰Úik¥þøÞ ›s/¸¢©©îŸ‘ú Ò!rß¿/ÔF0†æÅõ¶—õUnŸ„&aÖ©®<‡êcg‹ŠTØY䬉պÒ@ŸÖ×ðFö—¸[—“²Q@¨‡ìs‘(uÛ±ŽƒSÚ×ÌkdévóZV|ðÉo/d!C1‹(´ƒŸN’ ZNýc?ãnÁÑTÉBjc]IŠ;ç£lq+³ Õ–~zKyO’ÄT£Ò«znq'å[^ϵªæWñaUüèꢘYï} ¨­££ë°ªØV,ò•ÚålìÌ Î;%h k³bQ0™~û]“òÚ†º`~'§wþgLתψç‹û³9¬wòhi¢eXB-¦ÿ5Æv¸5æç_ áùÐÐ%+úûp<ÿÞ&]Ürk1ŽQ%hž{lÖ®&Ûm³$ßÜl°æy…@zí¬Ø/ZB§71E"þ‚üíÁúVhéç<Å7ï¾Ùg‡fð >ÜÕ‰8÷Q°\#¯.Î(¤–'½4£] ºUk<ìFÒ þt½B<ࡳù”.'†0)$<®a¼.Ø÷H|f#ÑW'gô#ëÚæ¼/èÙzqcµZé· ý˜qÙŸÌÎ~;#ƒ aâýæ…3mf“kpK—üœµ2ÁCßÉ©ÚÕ‡ œ¾?3½?(¶S‚\ú­f>rÍb©o ;~]Óî~²íàfèȪ×Éœ¹Ýšµniñ ÚÍÞÕÕÜý ¢JP…ñãV hç.ɋҕöjÄbN™™+%‰HÛÙŒ§|Ÿy”ZÒµÃלJõy/÷Uº5LäHó"M”Öfyöø,—"›%vVðÖ)r¾"pÇë<”(ú&Ù—Qâ´‚çÅSR,(9£çþÛƒý»&Qè-Œ¢Ê׿Nûã¢YÚghzºÕ ¤GÛ_õ!<-j¬µºØýÕäP®òú…zùÿZZVLåáÝù–D7ž¶C±÷¹XÆ+¾wr¯¤×Âh\M4ƒ§©¡Ýš÷½±ßí&Ý4mœ°ß¿ ìÕÆd¦ ÂÓ>>'¢ó•9-ʤu† œM —*’(‰½7kË–66øMÕ\Áš½Öšø‡Ò?ôA:pE·9¾Ü„Ùi»›»·g¶²¡óàØáºg͆ܪ_Ï5ö^²e¬^Ü/ˆÝrgöx©Zg0›Ç#à r¡ù¤ML¯û’N=¬Û¾æ"ä\x2Öƒ¬rÖáÁÛá<7,‚»kßݰ•ãºsÆ®`…u+ºôžÍÁm {ï«& ߨ^4¯kyÇ×h–ßËçÕ?ü¢ ã˜|½ª2P‹|QS¡ˆtŸ¤Ûÿ~…¢ûYø›{2îzÃcGø9LܯM”s1Æ%±ÔhLþ‚èЪîŠÐ’4ÃOÛ 9‚¹œòyR%… yËžÃnÓC¥á¶ÚñæïÁ úèuGŠ=齎›æ/HgY_•–²ZË+ÿ‚e<#Q|Ö’ßPzw)ƒº4ÖJ”îäëzuìtþW ûR„Ù‚ÿ‹¢­Íx«BÚ×]½ÎÛu­ô=Ÿ¿ ô˜½Qõ9[ÝëÕ¼@ÛÕ@Rï—oêNKtü Òê†ËÑ~+¡ÔY7¬+ŸG~ÿxXµ‰ƒ|n`+þzp7NåÃùª/b±äbŒ*nS9Ó™J üáÑÑæë.0y{Íšmkf¹c÷2| ¦ÐÍà 麽˜À¡1¼Ïc²¹Y0'Ó‘Ñ/ 4 ÕåG|®»y9~ÊÓ+5Ÿø„qw{•Ë7:ްΉê©öôõœ@~šÅã¼”å'ü ³Ky/ h$\®ÆÙ_ZùCaXñ{³A‡>ôÊÝIä,„Y\¸pÁJ­bßC„ù©)ÁGeÚy°÷QÒ:È~±û¸ù]ÏO;uL';cõ{ôQšç}§“VšÅã„ÿ‡"7oÁ…C¥d?Ž›T™š—8ß_Ýj±”ô~mP|MF€pTŸŠÞ´€î„Ã#<ømß,_© ˜;¨GÍÜÆŠÇÎ*±soTîÌ·¢ï>QsÒ `+H¾Rõë:¡l—X[XÒlŒšA¤Ç'©È=1Ñ’3zQnxÊ Ò"¢¤¬ȧ޽ÊQUßHèþk¨>“Sdaù«Ìÿe~Ãö—›ÕBE5ÝV/9ò ÛÁÓ®*L}ˆ–dæGåš*Á·G`¥ë8×:=Îÿ))‹…šQT¦?`RþTZÔ |Zºo¡ððY…È"4t ô¤®hõs6jéç*µÏ/ÈÔIžîÖáTýZ±G¨Å=„Ù’K›ŠX˜N»cÁ(òYç6–sßÏl®Y–]VÛ-ß×(ÊñF:ïò†‹{ËPe£;s€ù- ±¶=@ì=p±Ñ‚ãú–p'ªŸ!Y‹µ²rÇ&Dþ‚dïÄ>y-Æ[qç]–[8ê|xc‹oÞ»Y3¨Dk ®g—– Ø/‡n±ÐˆIN»AÇÝ5‰|…¨\ߨ1r/Šä'õ Ðlp"‡=D"ƺ¿*°¹‚õÁV?…o[¨]wËñaO$5ㆵ€nÎÊ*'e`ð uàÁ/–Ç_Õl|¼_ ,ÿ+þ6çç㜞 Ý¥¶‹AøÒ1ʯ"²)LŽR:Á st!œ+íEJ¹ÀÙ3-Ld‡“4™Ôƒ 8;jC›EhÀ/ÑšNQ£«š‘J+€ ³ºu­ <½\“^Dc¬½™÷lˆÓÒ\nv©gbõÝ^ŽbËʶOQ¸—–,•/PxeÏQ¿ì\Ù×/»1çÐfg%oxe q¸»àóð•íÿzO—~Aðöprð[êÅ•‡:¸Á´¾—‰¸ÊÚ¼6»Æ§£5¤bs¢ÞŽÙò ÊAÔªÖØ¹ÿò0w¸ôJ¦´†YwJ£ÍÁÙŸ3¹O°òéL‘>ú4ÜøêF =ÔËuns2FLoáÑÝçk2B&#lLS·Ó³­Ñ`>ö’;ànÎÉZí-6îÀÛzCù»5KŒJ¤h»<•á ¹-Ÿ.ïaÄ®—ÎKÎQô£‹?†hn«N:V}gíQsʶ˽+p7ÇWÙ endstream endobj 21 0 obj<>stream wŸÝÅoÎ9aiöÍzõPÒCÐ1OѸyÚk¹L¿=ý†À(Ó¾½† •a÷Z¯qá™ô~ÞybÎÿCY}^È=ºWAè/•hÔf‡üq†¢ï Å^Õ<Á‚; ‰UÎUÌÙžTq~Ó¯rcê@Qœj¹ë´Ñ7_ºèÉ î´Å•ÐY (b¶íVHW$™ª•Dbæ:Ìyr=ÒÒ¯›í¤¿ä”ê rüùžd®ê”÷‰—øb¡Æ„ÔôÖUÞóëD@›|ÅäÅú.©åY¼ñÉ ¯ÍŽ«¶q„— ø˜-]¹ÅD-šÍ.XÍjMmaÀ¤;ç«ÅEÅê@Ž«ûöª$`ÙlÆ4ŠáXoí¶O‘_^»â±‚¶ìM¶ù½´Ðéq1^ôCûÛÖïìc7¡t¶Y›õåÍ#-–Î#Y5'»%$HØ0¢Ö56D‚Š =Y—t·ïèæ}Õdvq™Oáò'ôbè˜pÝ™fç1Ù¹Fq‡W—K ‘>³)Ž ÎQâa?€VV?mâ¢Ö®yókRpâB*¬ØÞúû†ß·ƒùR‹8«c¼¸9ž 5~õäct°–“¶{3Ó Á°Ô“;±ÏÞ/fÀŸËcÏ©]ưr„Ù˜˜.Œ±¢<#¼ö¹[Ü9RßüõÓ‡@ÕvpߨÝ7ö.‰…˜^=í4+˽³Â_R‚B:Ý·r¥Ä•§ï½8>Š|¬t “ÇÝ]7&lŽê*?5€j©hGw£ýL¿?§tÄë/Gµ÷–\žVž‡ü.儯D*ý UὯ â›­} ò\ù¥¾Ú\é~Sª ŸÊþ"UÁó0iˆkzÁH‹çá&’Ü—ÌÎõ&s96 »‰Üý4ù ^±_'UÙW7uL'žžE^‘¸öAÜHó¨ë'{£„øx+Ù   €yWöÄȳôjaÆæ <ÐýTi©L:ÙÏ­²žÎ3á*—wXg$;41Åâ¶ ?¯öl~mI4£ã#™àIü2À]ÓÆ%ò8l7wð«oôâw[fRŠËÞ݉ï1ØWŠÓ#éˆí ÷}ç1Ú)ÂñŒøUp˜Úz4GÅñr"öîák‘×°,¾:ÛWa‡:žÂm ý¨Ø/¡Á¦¿] M­£ÞH[ñÖ.ÞÖjM,§÷‚óµb:ÓkÀ¦ŒÐý5™¼ÃLGì¸>~j¼6Zí#Þ¢±.ìöžò=Û§¤ºxˆ ³SëËG òÔùò-b‹•^ðé{OïQÁœ;ÂoŽ+“¬ò…¹? ?Ùˆ*– 8)uPA0à®EËâ64¾Û–Ø£.B³YySõN²•ìxÚŽ,K_µû}1ÖGÙRÜq7ÑTÆ©®¹‘§Å–›¡jÀ³kä£÷ÜÆÈhÅM0¢y+‘0ØuW¸³gŶ¿W2,“”t9Y‹GqÆ+÷5 ãk¶ªJ‘òùªH`Ï$}+É¿´TÂ’W´ÆåÅÖ äÏÑÿ€òöe¥RdžW¾a-…¶:_Åõü"6Æ„Q±§·ÉP§‚ª¼®B*£S†ô±òÕö 9ýñ9’ÏßÔÒŠªÉmëˆ754ÑÄá9ÏÈ Öômè Õ¦Zÿ;T©ç„IU1«bé C“€ï;“4[&f÷%Kzç§‘µÖº<SBï²6X"ER>UÎu€^Z;áæ’€–^žÕÉŸ=ñr±'­GWn´G­} ÆzÇ‘»{ô,öxÅdsKù7væu/Õ`ôbùò¨ZmšJ¸aÌŒ¬ü¼Ã¾5—Ò¢ýa–å¯îÂc÷&W©ÍôØÓ^Ù~dS.¿V`xL4@bñRXaîwC&Ñd Ò@ç‹R0P*ÞTÎRôÏG¡5½ø±?I®t…P‰ú:gäýRg:ŽëÓM_Çl™?ý»MLŒA‰ÏžÆ Éh“!ö <×Б”Ö¢×jœKÁ° ÷$í£ÜEʶ¹úWõhGB‰}uᆮçWqÖ@Tžlò_]Â#ã³´žë1W^ªºâôkuhy@þ*. ù4?Á#Ô8¡³-z§=YiOX‰ Îw´ ¾iùÀvÄw£áh×:št‡Òî"¥#jª÷ÇWñ¯ P¤é´¡Í)äý´çívQÅD³´zC,d³ª¼ÝDEMp\{xŒWû&m«óÚ¢F ”^?£i€ÄÁYkïG}­Öˆ &f}­ÙžUÔ·â©ÃrIjedÓüùj†ÔE:'É4`t¾k5ç2þí®µËù§± è²ñ6œPõW‡‚@4›/Cl‡¦jI}lHht¤?–˲ê 矚(¢†¾Ìžÿ¤´o3×]ncH ÕÑÄTc¤/í‘ÛÎ}Ú/(ä:ò,¼q¨]ï­uÄÑnoF|RavÛÿ©ïÔòbjX¢‘,¼ˆéô•×%ÛñKÛÚ¸ðª+7#Îãzé®ýˆ?ŒrëP­]- ÖMâÿu’üÚ½pÈ`ì+ÛûR‹ ×Ü*Y·]&× .y ¿”)tVéÔG§Ì=Ì V‘Ïᤒ« %;öÏVyÝ¿'BÌÏwG3GzÐWÏZ°ª©Ÿ“_B/ûžÉ„p•ã³óa|›úˆ²Þ,¶³¤e÷òZ¬> Œbw.ÁŽÓ¸+¢yÚcB-JÀR…DcSmÛÎÇùÝÏ9~ó¼Ÿ~ ²G0Ðu/½ˆ“‘œ„AÁ¢l%·t¬—JØ¥N­"Xø¬í Gùù€íC= Ë¿ ôg}&Õú•^c3dñvW­u&fuà Çîôö3~ˆ¨»{žKíë]«°²Î¾ü‹òi§­å©H j­«ŽÝ›Õ i‰0¡+¥8‚èî©Î úUûXò7Œ·„ùsZ7ùÿ÷`é#Óo˜½ùMÖÃÞfHÀDWV {Ü0[Â)~n”¨â«jôûû¶Å*ÕÕ/È»=N•oLôŽ¡n/§Ç}ÌÇÐiTì†ÝèËyõ*ï—S§ÎÆÈ:S3%XOAèçljí(ôêõ=æj2X:CJlÈnöì{Q Ñϰ ™‹&P?X´SâeÈê@ÉüNØÖ ö*\Ú2ãX“˜™_xeMàÆ²”M9;ÂØ{OhÙ,ø÷ê§>]^˜‡Ù¥8ªÒ§¥É3‘)÷y²ÝŠØ×(ÿý¯¼~ï@<‰‚B^#ÏN—³( )x…†ŠºAKìiæ‰#­•Šöú#ͷ錡Ïß~[M¹X;ìãvºë—Ùs ËæåÿŒîQü>Â囨l½r­µ´m)½÷‹Ë¯r;¿¯ÓÚ`×Z2Z£9uC /hå+ÖáŠð'úyuTŸ‹ê’æös°Ñý¹zºœüw_AгNﮎ!¦¾ëÍ:.Õ¥‰#ÈL ïƒv›lòŒlxÝkÄ!t’iåè/+ò Z¹¶¨ù>Ñå3Ô×ïx2\-ön=cpš Í¥3í€s{,lá^º Õ€-/*_9½z> ú'ïk:5.実{¾bEí¬pú¾ö±¨Jº¶"LDd?ù–2:×€Ö­šŽ»½Ø,+Ä>DÖjÌÆ+l…·ÙvóSšÕì^kH¤ÛÊRÄ ãOõݦ²S8v þ9 #Yå†ðGo^Ç’OÖÅŒ=`L·Àü£ë‘m•+O«…"i%¼>k|]Ò^.³ð´¶ÃñážîÂ~ŠÉ|ïµÛvã¬|Ö| ›GÚ²=ȵ}{bСÃôêÿ|Íd..¹xD5ßsk#î|ªI#ûÚ{¸õÔã—ÅZò’Âû§@ûylqþg|ßqæx¨‘G·XhY4W® 6³ ŠAð<+ßZÕ ^8RÜŸÓ´$¾ÆÝ‡H8$‡Š6EÔ©.¯Ž+ß4©¦Ägid ¨¸Ò½£4ïTé‚J,f,{²ŒÏÙËP:ÃVÝ\ö =ýç4Ÿ~ð]9åOæ¹_ír‡jÑçâ÷>§hi\«¨M ÛH±óÒºÂ=iªý¸6’–åöo8jbé¶Àwª?åöpžßËny8‹ÍÁ‘žåuª+’Ñ÷Ý1¼L_5½1ோ2‡zstí>ŠsNÐئ]>P+$ôx<-ì£"¨<jë4dS©šâÜ$´ŸÓæ kìŸüUt—p÷¿6_ÂÛ‡ÝÆ.hÁ ×%½ÔHA±Q%(‹`6Ì?¿»Ñˆž¢[%µS±(Z" ÿS&þ´ˆÁ!Ùof@>*5¥“{+Eàú1…ïù{«N§bÍüR$lŸûþ ‹zZùiR<8ÄÎVÒ±R—*üN‚ü5ä°[Á‚¡5í!˜‹ïÜÆ>Õ…oŠÛµ``.ì2(üEq_å@1’¨/m¿VœÃ f•]M+ðè“tàFÀewç¬uV¡ÒžnŽÿm¼†Ú xÿÛ”•K‹¨ÝõþçvP÷æq¯ª#¯¡sà0P•F_DaSDø;é«snÉWûTío×Ê­äÖr‡oŒû`VÜŒjËÇ%6•€s"+K0°ˆW«cH©ù“_”¯=HÚ£V•‘;™£«¨oÿ3XU=Κò¹žŒÑa3UòÄÿRÀ½pƒmþc@A„‚÷ê U¥²¡ÅmQTåmûÊü±þ7‘äÒlòóÍG"$dÞécruU«éÀð8•ÓJãLЊi«ç¦ ã_rªóåEþÿµ´V3i{zô¸Ý`ÍÃZnÉõmMgݤ91;“Õ^æe¦øÀégbq_—#éV«øM3†ÒÓú×]{е‰[î´4)LôT2\žq*û]Yº®˜&¾?êv`&rwkÒ°POKØ[¶\mP¿jíBÓóÂU|•Í<òëBäÞ:J~ÆžõêIàA¶Œ %Oï¶ÿ®‰±=†#ÙZ²†6í^Šü³2ò³^w5Ó4 lÌ=eÐh^5åa8M¿½¯*bKßj3mcü¯K¿µØ+ÝE4jp{k5jÃåU~Ö†>xSßéïU;Ò:q£¢~§¥8|N­>8ÿëÔK™50¨+L«óûöe³É¨!ºÍs%†¸Ôœž€j?zYß!¸Qpo¢š ²ÿ&ñVî>á@ž!ó©Ü“J½ñ7…*@hÍLEEFÍMO®gÒ#Mmìal/ãÊ™ÿëÁê›êcí-/±¤ÂYàÞø÷î&ăU¾2–Ï’Pp”kû­Ü[…sœSP`H¹.ÿõ‡ˆZhÝ_2Ç"t𚿦Ê9nôÈ[Ö r£ÇéH™LÊç^SO–ž‰^ÿ׃UëƒçÊð°'2àr£×ж ÒèÔ~yæÕ‘¥›Ïc«Ó ãæAäqÓ*­R±ŒUs«Ìbèg /T+°:Fu|aõ§ÓŒYÇJ&BÝM®”ÌpÀTТû艇•È›ý•kAÅ)P’zÒ1‘Éå¿îÚ‹0ßãÔ–SÝ’; iR8ýÀ³2+Û“²cì)Ôé ¹ø+­ª±¹$Q±Úíòh ½Éô_›Oß㩪/£ÙlôL7¹ŒÔðBO w°ÿâr0U£ýáktVï´~`AQ >£}ÿ¿™¤+ekÇ»€: a”ûèÒüBÿˆ3,"ësï*é׉së€Fá¢+&ééó6/Ö%¯¤ƒûaýÞDk‡î1C¸Àzçž÷Ö _`õ­/Íý•|2½Â[ÔYScêÙw12ÍÈþ9®*{ÿu?ùµ#™öG·.M@ýøŽwxaª³Neç.ut7bÚÙgfØÖPq´xpŠ5ï~ÕÃù÷¦¬¼ žaÐy7 úgÙ(ÑÐór+ûX¤ã2Ðé¿lªç^%™ÑöîáZ×Êɱw@CÓˆõ¯Ážü«_5¾6»üvçtÈ\c÷½dÚXw´³ØË<ÝÖn´Öî<×ÉÓóÙpÕë•»îsŠó¢ø\9‹xcÛeñs qŸÕUƒ4HnÏÅ®îWºÏYëèì®ïýðÄšáÛ ]û)dt+ˆ²…è`ÏéVË] ùsÞ%%^ßÿÚ|yÈg¥þc8ËxËXý9>¹Uµ×öøÛÛ_ª¹‘_ÇîŠJµ(—ë¹êkVW¤Õ¨O¿(:é,7Å)s¬’¸²c«²½j½KC¾'×”ÇôÙ´®bmÝ"Âq]Ö`}šöèŸ&w•u¿ÿ¦ùA2½',zö¹ÑÒÿ€„g ½6¬­Ëå­ö4‚S´KBøò¾–+WÊSµ›sfåzøÏsäS,}yA½@L)6X¸o†¥m÷h‚¯b`5GÅb«~Í{W¸µs¯|Á & T£µç¿c„ú‰åÁgY±q©‚T~WvÀ¼7Ú;^{È>[×ÿ4íû¹WY 7ÃêÌ:GƒÌíDôm_̨Qͳ˜§aË‹å%T=ðèŠ áhº/ùÞ¼_[ç‘ë¬{c…UkMÿ²ÞÜ"(å€ á"¾%#¹€ôG«µº¬r¯{Òì€ôZmnÀÒ‘NÚ¬ö±uKßâÿ½QÝØ„ï:ñ"w­‡ÇJ1—Ηúyä!9‹>c¾äwß·ÄgP«w~šë/_¼BÆâHǾGŒw?'„L6*¶Æì­Ph/W>‰£ö­ŸÖ„i{%yóÅ£ d&d¥km÷¿yÍ – Ÿ Û܉^¸ú\ÿ€ö¹Xâ$ô€<Ô”RH‰¾y,™[KõÌ}ïÇïŽGe7îÿÓ&Ì¡ÑÐåÓm{ó÷ÃØ´UPêìä œï¢xYA+‡¶ë&–J“PAÙëÃHøð?2í|î•dí´5´[»yŽWúÕò,¯Cˆuñî ‚È®jÐ[ÆÝAÕùÑz«ÉÿZZŒÍÄ#Rn-ïXz@Xsw»lï9q5i´…Ùó`TûÄÏþþäÒâÁJ2Ô—ÛÂÌä®þ‹RjùƒÚ ®h¡fíã£{1¡rvÁ¯5,öNb¨ÔXS=+_~ÅÁ.¥ŸÒdúúÿ@è+•{¥«,TÉã„c +f;sš­óhr8~ÚÄh;ÌùË9%²Šƒ5ôy6näXÕÃóÛ©?ÎÞiíÙ¥Gµ1 Be’DgEê"átÉ€Úü-ùVò¤ÁDÔ ‰mÿñ»#!ÆÅ3þ…«zÌ£ó4¹‡ö`p´e–I<5f¡LÚ$‡Ô4*LëÏ"U¦œ¹]¶ ÞÿqÌrm9®×Õv0µw?'ÍXsØw·öÔo|ÄhP0ÀjµùÈøSÊÈaö¢~¬d¹Q4Íý'È6›”…Eèq†§óPùÌEDÝï£ÆÜtšÚ'èþÅ‘µp;~t ²¨zâ«Ãõ=ßþMDZ¿ÐÚ Š›¢\cÝ}DÕÎ…­Ôeœ÷ã´"¥Z-ÍyD䂥ι?3´öÿ÷`‰×.©½HœE³M}Û?t³’:ìFõ°áé«&·* j“ ìT¸Bà&ªiÞzïôß+Çxw&Û'¦¦[—•Ã"´L¤ÝÙx»‘ÞÇ/Qî•0Þ>Uëí" ÛáÝ;\ûç÷(Ä6S æÒ€í¨¼ýuèvM­°*Âirk’õîÆÄ~ßßò¼:9 k[븶=žGÿ)Øc”F󓻯rOçíw>Ÿ³é¬^²5 Á|³Y½V¡†'YÁMܯ:ùÙÒõ‹ÿÉz;bBî¥ÈVnîÒþÒ÷:}·¼#ç¢V˜×ÈããîËž‹G“€ê·ÿ¬¦|‚pw!bß‹bkr´„~öèfú9„Ý¥ßf¿ÏºÀ\Øâ\õ4àùóàÂIþ®A¤)Àsr„ðÓ25ÝÒ—ì+¯Ä¥´Ð‡ÆŸ­ÞR×êÒõ­ÎÙੈŠzqôbNé€å.¨±F¢p"PbúÄb{“‹»ç–ËíýYx âQÞTŸ ³qP‚M®ny‚î}„/Wµ\ñåQÊ|à„?¼ ŒÇ;šÃ÷íg³ò”ýè´–Þ¦ZMê6Óù±W&íšÃZ@•ôêRWh4Y®œ mC ŸlkɽeUH5×îîY¼hÈÀ–Û´¡É®ñ=ÔéûÐî£Y”ç¼ÉçåÖ‘7ÏâÞÔè¹Fï2ð‚¦Ð4fÊp̶¯€ÞÈ>ýºjúZîtkLR`ºBÇ'Btܧ‰Ý™­3Gºå? %¼èÿ‘õ][o*K·Oà‡ J‰œsNÊ9çnþ§?h¶÷^ëÜØÃcTtWÏš³ººZ6ôC;”opAÂÑy‡àÃ…ðd1/•@6ŽKãÐ¥¹Z9 ÚPºÝöˆHå‹Z%1Ir°Jbâ…Ϩ*1GQb£Û<ד„)éaºˆeÈ^ôæÇJ}ºùò»?ŸBwv;–wÄ_L—T—w~®"59¯4ôô5Wû¢?­Ö u׉ۿDF­æÁnnºÍŠWÆñp¿‹—º°.<ªêþ¢‰Ù쿺9GZ_μvû ,&\K'¥\(ýX$+hœhõ…ß[ÿì ]oΑҋ'Ÿ ëâ9y°Å1z5XX©ÿd§êq[\jý}çÖ°Ú¬Ãð%ã–Úç‹™ÚAþ.5¥Áæ<‰¡’ðÖF{¤ bx6êÂm®'c­«JbãHßÛÝ’¡5¦+MØt´2"óÆõ Ev”Ût:f,ÖLÍ·›Rºg‹.½+d˜lnÃCCè\<ó¹UEH¥>é?ïæ]ˆ™dΰà2Éj½]8!RO¢ü~H9I)ÃÐ~0Ktö¨öíu”ŒÓ4Sd‡î”Z¬~†¿ Ò*gâNõÚoÛ½i%ó.¾õw^ˆL1¤2…8»ù v+K»ä¥‰µædî…ÏŠ¨T#ƒÇ ­2ò ó¸+v} ðÝÜáâÌ{n €„'‘;þr~±ýêzÚ¨ØBnSú^Çåo¨Í`} ˜ô.+EðU+¹árëÈÁÈžTÖiú®~m¢´-Ýiö=o’öq‰¼® ÃwÇŠKë-K£+‡#ÛRô½•ÉÈtsYúD@³=f!5yâèÖƒ;½Õ»y? w ‘µÖÚ´ñB—•´ëˆ£Ì²[KÜÓh“‘n;.µºû|¤ŒÖžÐmrn6O|j¯=Þ³o±™Kû(N&%Æ`¯cGÀí³œ\9Û„T—¶ý‚Z‡n+Ó=Þ~¨´>ôRLÃñt䟖õ¾l«ª^cšF—ŠòOúe†x‰ .ç²½,xrúAßÑsv”èðx¶¨R1û–p×êUtٽõfu´ÕòO‰G9ȳ Ò­³ÔiN¥,L¥ï6¹[VäYI‘ÙG4¯&~J£ÊX^†ÕXq_ʾ éôÌÃoeÙf’æÈªöJi«fôÌg{¢•ºÅqÓ¸TJã‚6ÒÞÂm"”ãô&}O궸õ%u÷Ι¥ÏÕ½Y3ߥVÙL®.Ãë…ª*^a!‹bÅ q¯Œµ\Oӯ˽5¶„Ÿš$«EÁký“ž!{¦ìkêQùXFL¶†R Uí4-ÌMäÞíÏ´è ¦R0CÚ ãëИ}K-K~g5Ê´˜Q›5=>wmºåŒí6OØRü0ΘüiãusP©haŽíÉÉlÍ¿)-ã 9a¿`=Ñ…gã­IEÇ7äF4@hs×þMߓ߳<„ymTluz˜ø¡or z¶¥©Îÿd×ι§æ¾ÎüGãòüSƒ{î.fTYf¸G_+å­«ƒù«žZX«üò&'—ˆâ—Q¹6¦ ‘ë‡1N^Ï È Ò±Ãf")çëM÷»I¬]š¨I@!/øMmøÒ±i§Ù¥äqý1D•n@¼x¨kÕÏG5)LçÑ € 7Œ6mƒ&•ùXçèÅÚºÊ<Ëã2: [k¹§kÝàω¿TÖŠÔ7?…:Òz”¨¦t<%¦×&5"ÉËéå~u-õ5 IhÂÓŸ3îÂoëÌ0çÕ|!t⸬*bÎCE­înŽ÷ (¹}ÚÈÕµUsvƒªÕñÜ\ÑØåÃíö¨Ÿ:X+wõ‡ö´7Ð ­\6¥ûüð¶×Þ4åÙØª(™øVDÜ×Àw‰êN휾¥dÅ8wPoõrào©%ä@*È(Gs-ZÏe®!O±Î^}û[ÌÆ <ç\]{X‰-^kô‚G=´*gû½ÿÍÁB+ Ú°Þ¿¨ˆþX uK€T˜ËÓº‘ÊäwCÂáµs7‘ ;·Ö—æ*·NOo“D•ŸL½ÍÇÁÇbžÍØLœCœÅ‘AßêB¹O|â{· ) Ö¶µ,dX«£½f"YççänÍÌ}üGû½ûƉmA:” [` ©‰¡6WzxçÂÌJ¦%*åú[žÙ£­˜A!¹YbNü¬µç`­ÕÝüͨ¦Ý¢¹‘¼D¥}i>W˜eZ7º¸÷vYX6ÑEOCåò–÷¦¯UÃÜKÓ?]<Ž÷À(8ÄI딄\„»Ëƒ¡sɇt1ó1Zz˜ÆÐtÑ:×ß®ƒÑ™ÀŒèYÝåÆUvŸƒzòcˆIèzÊä¸m©’ZÕ¤P#ƒŒåV»ðêÅ3! £ˆ/QtìÉQ]¹L² þÖÁ§?‰G’rÅ‹¬@›‚_{vV ¥g ÕdÖÏy—buÉoO²—z–?èÚ@×ç ¦v¾oØP ·´ê%ZÇ‚Ýþ.ó«àø òø{½ßÄŽ «ôoÓ¶'œŸ‚YEeÁÇËpè§™¤9UϽÝó¸Âµ6òê‚¡;¨½ø¥–Ë·önüPŒª]~´ÝÜ-º÷Õ)æ¢eºR^¯²kúJì?´g³–sKC‹ä¯#k«OÄùÒyK’BËšÁÍ…ÄyöŸø*Œá¾_‰[:oþ6 LY'$R^aÎWïè{ þÑ Ü³Š»éÔá"º[-ùþÌ¢Ÿ–àXÅ{XéqÏZN:?' tÜÁ,•*¼ýFÞW^>ö\§¼^ö±È}ëоïy‘4xUîN©õÌV¥M¥¿i¾`bÇ~–Iúîx½†.Û^·ð öMðZáJ´%óTNØåîùGÓ&”ר™3î¶V?¹µM¿keÔNØÚÄ}ñP%`AÁ’yÌíâõñl{¸GüeålòÂQÞ^+Ïš—9ÏÛÙ@ñžä¯Mï¶L²ãlUf ê?çvÿÍÈ­pc¸éóƒ{Ã>Õ¢OÉ–w»åUçÛ¨^k«´Ky§¢{8¼ЙºÎܺp•ÿóìCJ´.ùˆïì°ô›é]Ö^ á3Ê_{&~q–•+&ú _D ×e®àñ÷Ó³k¯cžŽÒK»ä•Øe…>±E”3:°ë'S²ž»\Ë¡6linqÓÿö^žSÉ—jêâM9‰6Œí9ÖhÝ{¼S(~Òrß6ºÛ²$¢¬&'}'ê!fÙP%¸¥ÝRb„3sKCÃéOâSHò³T¸­6ß|òí…|ȸµ,KÜñôI UnÚБm×I’z?Çæðå–çúâèlð矪úÃfœ Z`Á)ñWèg/%mpˤ¬#þc‰Ë#ªº*e†AéY ão ˆh“‚s?­i…Jm3WÝEx‹Ýî(D¯5z‰v¢Qj*ÝeMÐ. NGÝY̱™ Óó¦0ûÞ:õçh÷a1‰™Ï÷D*ïÞ¦QÔòëÈ6{ ~›å*†Ìòá6èt‘ÆŽÞ¼©Õ~ÖÝIþNóÍ'{ÆÂžËU¤’ ½µ`7˜¥ìôuï‘jEqÐr&íŒó‡ürSÈqÉC´ÖþöúÉ™J‘,LgLëQÀœÀ".a†í2Þã³c€S6Ø?è)¯ z/&äF ú//áÍfdž¼ë½ñpè0£–»ÐÏ^÷S"‚M³+½Å=eÜA‹>9æ4ÆÜqK(ýÃq=\™Þ‚)^r…°šƒ†Áû2Éá.š2A*œ¥ù€_’£KÏ ¾s^>6©Qÿ2…¹1džCrûS¯¶ëµˆÒ™òëwÙ÷᎚ñÜNãÙ½‡= ƒ·ìi69ÉŸùAYþ‚z5Õ£IíÛÂ3Ü »…è>î0#UÞk§ã÷­#4_ê¡ä~ÎÍ4í:S×åƒù1ÄZ&‰d[=¦sü 1u}TvÖùFû²ë(ËÉ/HiäüCG˜Ì2ÝYpt5zå¿jƒâ²3õN-²Pv†j®~2Û}§ËT馢NÌøÒ·%šª¨º˜PóøîüÇKÜ"mÿf°LåÁîµ­S}´#Ç“òˆ2uþ¸ŠÓˆ€;ÏÖz—¾ôÓª@aZPŒ•wþ19\ö¬Üï·VÐ3 ÒROO«Fuý2uý­ýd‰,h™P¾)¾©}ä×ùé¿&‡>Ÿï¢M=û‹´‹ˆËF£Þme@7’87X£  Nla3œ'uÊõ¾s±•Ûÿ¸ër°Ì>]-ún«Ën\ý’irFª¼vm¸r²èÇ'³@@“ÁUt[—ÚLÏü·!3pXÈFžHR€Ú¯hjÁþ¨~Úŧf%S¥÷ëÝðãQ Æ±ú ª7qnW£þwLÎÉMhL U¢Ð+ŠGsû‡>Ϊ)øëœh­žyŒó‰á‚ÜÇÄ›š+Yo,ª*ß¾£`çÅt¯·&¶ÌŽÇŸ¹ÉÆ‹ÜJA.ÌGyq#¿)éMåÇÊ’€O²{ºy+4…5úåpòŒ¹³`CXöu)Ùös׊ãÝQŠòÛ\3¬;d±R)¡’¸dÈÃð]Nwõ†"W]¹€îLob°ƒúÌ*×Y¡3NÆ ýúy£ìä^¥\7`«F8þZîw$l ”ÌJÇaÄu>Óæ–yñÏ3Ë×ZÁòQ`K{(he<ºZ¶Éê8Ï~´BOæ™bpÔʇ~îb¡iOÚ‰ññ )Pv@²Õ„÷«voÎ=·½x3¹z\qz½è†hÆ-9Íi©¢¹½èn¯Ò} ÚLñãú4r¹ó(/D¥X‘g,:û’ÍÏÅÐ õ…a‡Œ8o0}¡ÐÕnB |á½âxÉ¡+¥óÝw;·—À]!­êðìÛMkÜŠ-¦×¦7j¥à©}”Ä(®3Ú⬈œ'ÂçïDh$a¼ÖGºx¸>ŽÂš2Eù¾Ábm;Ç8¿m½Îk#x› Sq$½H ,›—°ï8i“2i”¨="ãÎ1ò_ÔJÏ U‹šËîÀäÒ=ízÃ<»¯]a™ïu{c+¼Ð¿Q¥?ã`a4SÖ’å•êÍ{Oë÷YVÔòàýJ}èœþã°o@M‘˜ª‹ÀȃoñÍOé¸\jZi¿ÉóuÃWx-úP\2~¨bßªŠ£¥È¦wiŠsfÀÔãc JC­,„L¨qÖľç÷Ý÷úójWÊb[É÷¾‚ˆÑ¨n\°£>¦hY¡¥æø§ˆNýPcîiƒKŸGÓ¾Ëá’«ÕF¿t3ìU$JÉÀ`ÉÞ¡51±ò’»¦fȯÞä±iKNø¥ÓØpÏï죭:_œVGæ[«§ÖÒÀHáÅõTžfwë9=¥0îµú@lìÓò¥Ëiö£‡í½“ë±õ…Sõ,'fÝpËõA¼ ؈b³·KŽªM±z|5‡Gl´S©2)@:Æ çÝ«þlÞGƒqVí‡ÀŽªÄÎä1 *,ñÓü4á¦$û ×Da™Nj=YÍ”…·Å­ø8›öBOëýnÅU÷²•Œ]#®y‚¯ò+_ó¢œÀB…n÷Z±BP‡1ï+=øa­€¾·Cˆ®qnß= dV&à}»5ŽwŸ”È?oÜaÖïr¼ãÎ+|.þØÖDÛ"¢Ó‡Í‰üù›Iš¶”ç©¥¸Ìðñàf´Ñ@¸É.¸"uÚÝõ¼³¡[%¬x•™˜Ì¸¥~ÔvQR/’"?Q69m?làP(l›"Hç¹QÇ6]ipí¼ÕX©ì¤f€Š ®—Z<š^ª ;:«“5Ði ú][Já±.ß„£‹n+} U’Ÿ^¦ãÖÛU×]ÄSk¹Æ®™nªyíf[õ† ë"–«ït¾—ÿ’àrOÛÖ E‰-fª=JŽ>*[y"¯¯ln€†¾÷Ê aè_På¹eö&@˜º)ôˆ£lÙ¥ NÛžN# Ü7©¡¯âëâØ–¨çrº·› Ò‚¬î™âÓŸ¼èYÃÂù‡ ûÒX8kqý‚„ñøðÐ"Õ©8³×ΔHs'1†Ò_:ÉîNʶQ*ißL<<”YRü{hW×ø úV¬í5ûáu ™4ÃE|:Þs.@’©1‘¢¯²°KV*×y¼0бÔ+ŸÒOvm×x%Ñ m1|¢± u6\éó–Øhá1ý~oÁZ?_$ýuŒ*ì³OêbÖ’?Ó¿‚ë$÷9bÜÛ};´Ã…Q ¾+@ éz‡y6ƒa\%¨@4#O}nÄݱ~.x̳ëo³¤o Ý&ñkìBH}§,ß*e}ởbDÅ‹D7>+J*Óó 2I»—áê'–g>o™GõçÄŸq(¬CÁ‡€É› À«^Ù ›s™®Kwý%’Zƒº¾ŠÊšÿF ¥ü¤­ *õ [ßRËĹ™vý$k¾ÚU'iu©m V6‡} õ}zOõCkªå†¶ ¥0ÅfjÞÕ.Êbj,‰ð§[¡Íǧ’Ѫ¡½mβU•¡6oã­Þ9g2©%=à_¾»¥[ƒO;±ÖÃ&ã|÷´ô ~þð5Rj¸ ó}D¾j¨<›>gfûÞx©94ïSÅå+5?ñø­™VŠÉûVÏj–7wÝëRêoNÐ÷TZ <óú„ô÷ðºå­Õ‚¸•6ù8àÍ+)7õpñr+:ÀÌLU~äònn#8…YðSAn«Ï'í-lÔ‘Ú׸&W‚†î™½\K^¿\ŒOj†É^ÞëPJûZ0L>Ùî­ÜkÆçOáö @DÅq½qxA!y)Þ¤…W±9^× ©¾Ûòvu-×ß­ŠáŸ_ž±RÞà;¤g™ó›ÁÚ9-#‰¢æëâœHi9à·1³ÄjÒƒÙ$¡­«Q]³Iyrz)8Ÿí¼foüúߺ‹UÛ5-߬޸í´û¶’PXfW„G¡”;õ^kµym¤ÉnZ·»óPM;ÈFM|e¯8²¦Ø9ŸÇ“i­1ܳT)g8¾~l«Ty¾í,Æï5KUça(Ó3q·Ã6ð§ŠÀFŠ·D#=S¥»ë§<=åæF‡FÌ“sj>ÍßÍ*´/ÔÄBy®!:£›nÿ˜‚ökß×’íüë%ÈÖuj‘:xl]!ŸKaC<3!ÞÐU‚¡L%5ƒÖŠÕ='„h!ÈYšíô›Mܬ’oýA“ãÑÊðŽSüFË6†Á"¯=±~Ÿ)š]ÐÄÓÔ3Š{©¾ó ÌLëÏ·Þq Ð]]×Viä¿s°úlÈxïÕóüÓpà Ø´+æ´^ ¾6 XnbKþõ #>š}¶Ð9ÚZGfojþÍ­ueó69ù='îÄb#uútk¹_kÍ“£&í-¾ÚÆ,×¥/ž¦áÜ!Ú‹øž1Tü1Äí¿3¤²½‘²ü‚Ûþ¸uÔös"ýe¹î‹ƒÞFý0È8#—O[¥£Ùó¬×s° ,ßúÈCîò3*šËgQ9gD€&fÇc¸AÇ®êÆ#·ÊnˆW¨.‘ÊÁ¨e\ÈEÌáïªO²{€Ý¼Ä 8u?oñƒ¼Î¾¥z©ƒ r>ëˆ•Ýø~ëáÝý(‰»íÅ­éOêÓ:\«¾ýî9)Ÿ;§Â½Q:å¶U!÷*Hm¬•d˲•‡Ç[[>®é¹‹Ð•ïÅ7q+Õ:Yýø{*q7¥0×üØ¥Vcw¥D—ïëbÎ)l„tt¨–ÞÒÕ„ß×-^™bÆóôµ¦‡úÞJê`6Ï7° ÕÞCk²ù\L{þ»ŒÈö°OúcP®=œ•ÂFýR2cçbf¿2©½FL>pp˪“L> 1ÙnaèÞ1§»°d×j7]=ƒíHw[ cý¹/Õ[Ò‹Îy“[×1ê£Æ ›Œ^3/IÏ®¡‰±õ×Çþ¦ùú¶…Ë¤è’øh1âç։χÔgš Ô§!zž=Ô‡w+_phØõû¶ùaþIÌOÆ\Ÿˆ}ŽbŒóûgeÓ%6ã!4 ¾í?Ø–YêÛóTôûïA°ìÞ~ö>”Ó(ú¢ ÄŠ“$ómœ |(xÃÔÐîE®ˆ½'7iUß×Ò^š+fݘa7èV/‹•X¬”³‘°é?¦Ü¯7{*7s°•¹ØŒšn¿œwÿeHkur{¶Øò°ðÇš3^®mG@J¡éü/¶ ±u|t:]õ‹E}ñ¿Oÿ~Ùþ¹ ÛS±×eˆèÎÊm(°î['O7<=ÏÁ«ŽŸs³ !ºj)Óy1+ý×ß ¶à6Àgr¯îXwÊ4rs`*¥ºæn‰l_¨IÓö ‡»ÅÊ÷µ&5ØnËPµÃàÀ4‘u'˜²&È×·Æ…Ø3 û/9‹•’½ÊB?(bÔ0Æ‹Š†6šRþ4É—‚y6[Çܵ™„V’¥*’R|›ôf}»R|”²_õ8L¶!Kíê" hkfR¿BcI{ ²ðn#ÓŒ]x£fÄÕqH¶Låå;ææÙ´(±ªné ·`„Óùò|£1e,€ñËΧ]ªøUÓ¸“Ýnåj¶rŒYtökÒ3DÀBÏ—§a£ù/ˆiÕ •ý®ôÞuÎlumÀ–&>ìv, $¡-Õ<± ^šº-Ô¡$?þµ  ÷ã‡Áô¤›K:Ê”q$eOé@EΗ|†cŽ0÷F6×(¡mÖwQYm¦…iÙ´Ž‰ä݈ë†ê>›Ÿ/–EOãZ3æžs€:zÖ'^‰ô\.ž†@\lŒ@Ôi¸§†>‹Šx^oyÊ9þ)ÍN sôÛ¥ù;N’X=Úlm›¯!³÷ðoŸŠbW3±~r–Žøâ‚ ÇGÓ,L¶dn›]Òä„[¾åK4Z£}úXµÕÅ£\ Îâ>{ï7 iå–NP=šB˜î®]NY¥SÞˆ\É÷kÙäßó &›nXiµo…$6ЬâåÑ&LãðI>;‹ú·¿.jÏ;_A''Þ‡V´1(ïÑ_È\×Q)( ‡7N]™ž'éqë»5Ðô>Ê<Æòe«ülAêÇzçÊ|ÎP×Y¯;ŽÖ¾îß¹Œ=ÇJï$R"ÂrX äé³9¬%AÚ÷„]ñÕ¥1í€ú÷oó©B‡*ÞU‘9ì¬@ï6è†f1Í„/Ÿ2«FëH·Žó¹°.àxÕÑÔ—ÁFóHR;ú!°†'aK‰IaoÏ› e,8Ãdæ^‰i@«LΆ|±ý6õ73wWzÁï©K©8.'‰…dú![Â…ƒßÚ’”&;jô"4mg–ŸvOÞWØš­ÙÌæ ö¤¹Ïy)TÑósñ±µÓE~nÿÑM[ܶɨ <Õ)oé:á‡â¬žá7Ài}Öës›f¾¾i¹ã+ëqðã=/Ž™AÏrøI½kR,„íÚ¨I–˜äò ÒØ+&³FH¯û#£„ÆÀ¿‡½:ÛÕJ•SØßûí²0kkñïÕ B<úMÄŠ›Ê$>C![˜mD”Y”ŽÂ™#3*G&ÄR Á°'<êßË®Eù‚ÕemÿDoîÞ Œ[k¹œ-õ.¥7¸pÅ¥›Sú°&b±Bèê@¯/Ë{‘ä\ûéôú‰9zÈXŽpz˜¢ùfÙL‰ Ecq–Üb, SHheÉ·™4.,¹–ï9{«¤j%ÔTær!£ÃÇ%êFÇk^|`’-ˆË䦢½ECN6O*@rB7+g@-–=DJßjÛ²qúŸl5ŠW?{w–¼V6ôÌçŒ'Ú,©6>…"ÚÞóSë©%OgšToÂÒ3üÙJ%@ u‡¾ô‹1ýÖßäUÇ÷ ¬¾¹îÙlU¾£ ®Ô¶mÇð–A‘Ë •`þÅDÕöZdsî´ î|ÚLˆ}EÙ,n:!Kzž&*•LëœWbÖø”o&ðÈ.ž½3‘<~‰ßl™c¡æk!DݯÛÿÊP{Õ¸\ݾ°1eOåø™O]s}¨p,[ò©BµQp ð}géc+bŒºõ|WÓÊŸSK§|ƒB÷'î¤'¶¿ š.Ž2a}í+6㇣ڂ ˜ë ÷…2ïÃô¡Îk“D`óšgn1âw5ßâŽÇü ¯PgïcÈ5"DìÐ$Ør»V%gx„…¬²­}wßÒaŒù÷ÂÔ¨¯–Inô·šoªœ×¹™¨ð†WR}ú…CkC‹_*ØT{‚£G=ŽT<õû =ƒŠZަ„´§ºâ÷¾ Ë2 Ê6û•íƒ>( |ÿHü³u.Ç´©5imý[IZ7g/­’Ðgª½d¥t=­ŒðX½UBDB|€z¬ZäkWWÖêñžÕ „¬DtR:AtÿÕáqMQ¹õ¥¡ìç*›#˃zƒÐÆ7eù0õŸ+’Ú_Š•EWf™¼Œ¤çJßµšaÕúµÜM¾ w¿´ÀºÎ•™Ô` ÿ¹µûíÖèEµvBgzÔ¬ÄÆ{(0“e6ht8”’&ÆÔ:+·iœ*©*ma¾‘ktŠ©åÏÿLŽ‘<=ܼ—Ï;^ãŠya]ÑgK¶±8ÙzÍ¡ö­S²âSÙ_ЪRÒ¦0h-k^ÓÐñÕí)Ã= C)CžÃÚ™0÷˜÷#eªfÅwÚFÁîKôSky ïDà,J¶5Éá`žvRYüf°F¾!l|ãcötÃG» ^¯èX†~pj é>ü,/•ÊpÂMœŸsÌG0éM;ƒ›Þ:d#6]s\õ©ožuöª‚qßžsY¤[º þ´ÄÓÉÂÐbr“éNߥ'¯_o NLJ¼Ñ~¿¢1{ä„ö2š<69Àäv ‹§çB´WËÒŸ~°æ>)Z•º2w¯|×8iÚãšúÔ¢NÄb¼wE}9j•v?ÉåF›4èWÈ<´WÊR«ýõx_klNM‡¶¨Úè—]nB,yi¯Q ˆZÑ/¨1J—9…’Á’vRç…âçMËÊó¡\í?øÝ<j§mYÂK©ŠŠ‘b¢,¬t[œB¤¯vÙÙ[ÍÞT*Z~©yÏNU«†­#À¼îåSä7ƒUÅÂÌÖŒP¥‡;h³W«êL¾Ì*˜Â œ©"Àå¾·3ôÏUyÐ÷gåM/ )yB•N¿1ú@Y{’ùé}ªŒ‡Û¥=±V²X½k(«•½Û,aÉÞ\:øÄjõì}ˆƒÒò“n‹±=ÙyŠÙ>Ùüo?Ø#YåÛ í&¼·ª×Êá=‘À]˜„Ö7Û½AS]ªícºldŠ×]Û.'Ç„²óÊ;Ê»ÿÂÌkÝàl *[$< ^‰| /jY|)ÉšãÊP<ù›~м¼t‹ÜÄ|¾3ØÑyðwLÊ¢E4ü?]…&›VGk¼ìÇÍ â|Sè%6t-™hvˆµÃßë—ß>&÷ŸÛo1ϳ(]Þa£:Û®Y%©)=§ë–ÐJ(Ù\n2 €½³øt;‹¿†µ¹/Ƨï=1ퟤԆ„yÝ¿n|qr"Åh¥ æ™Ó~AM¶R>Èp`àÆùBMQœŒ•2äTÍW\œülü¯âÃÏäHEÃûÈ8YG´Œi@§óŠES Ž/š‘sÕí.kúÑM¬üõsÄÔùaÒÿOvò§ªþ𬩵AÌqœ ‰Zùv®kUàš#u·ª½…¦-O¢ƒBwÿ¢;Q2×Ûïæ¥Dû¹âHÛ¯À¨ž²Âs;J¦Õ aæ“ùXí©m¥–߈³¬CGuBx~Ÿš˜I·6Ëï‰?µÁ‡³"s]iÉ.½ÙÖÚ×V¶â r/‚ ÷¾õ' 5O? ¥u7ìÂeVÖnåÛêÿËÁ Ç\¼s«e1'SñsI¾Á÷Å-…NIÁÛ¼:ìGçYoSJ1üôòj9÷Ä~ÿ#Y±Ÿ‹f³eÕæ)ö£ÞVÉfŸ‘¯ŒÕr>챑\½ÐZIŸ¤ÿ2„O¡ªO‡^÷éÒ[nß{¥»(a¶Û‰~>‘ ¾ÝVE/šà¨+D†ü‚É"ïï•5?šÖö? a_÷}ç,n[#ö‰ ®¾TWh7aÄeœ–Ö¹¦Ø1^W¿‹¿ËCì6ú“æ›UI(ï®u>÷†¿ Vþ æÅ¹ù¶m&oåž`=d { ª ͳ(¯ñÌþßdp š&òtµ>Je,\ÍÏØdê»ôV¦V´$·{„AÒƒ•ÛɬmÊIçgë¿=|¯Lɵ¼²‡Wº1A>`¶§‘º"àY;!J¹úÂÊše÷4S+EP¹WÖÚ³³ýŽÈûÏ}÷ï®K+¸F…vÀdL)µ­+Ü®NU×7®û†NñₚQ§òæk5oükrXsÏwÌDüÌ´"ëÄAã›æM6꺟WØrBØm }d3%Z£ÌO‡ß+Pÿ×O,M]ô§)…Ö9Þ*}M8ýUíÙÎÙö'š.µËEÏZ‚Nž.ŒÍe{JÿÛâö%{Rrˆ¿·f´™6õׂ׈Œ¦F¯O–òØ×L¬EÝÏ”_zèõŸÙ5¦ø…ë£Õ\v 6@¦ýF”ªLT†Öå°¸¼ï!0tž{ ½«›áO7Yõvýw§éÑa}ó9rõÀ/WÈ}í{éZ-yÝ},Èá´ÍÑ7ù³p%L}|“Á©÷ÇüáÐë"ñ۲ äÙ÷ZÑ­,ÃÛmræõ'Óe~{Á( þŒd_é?DÜDÊèOcª'óy±sßnn/=ñ.¦Ò©–«¹d’8¥¼rÝËC ÏXŸÛ„_2yªàÜß‘ÉSÊ5{ýÈM†yÊŠxëW¤Jƒ)µ†H‚#[À#ß>ÜlUÞ|¹ó1úÉ7Ú3s=ý1 ‹ßÊ.ô‚mí¢ä•ëm3Ö6^ÄÛ|«0@†ès¤cÍË#cÛŸú37ö•LÜ2GÍ"Ö*o=R-«cUË»ÜbhÜžƒ¢å¶Íå/(o͉Y¨”¿ÙÊûú_~B¦›Fj –ûº÷8¡ÎV†µ¿næ±} ¸[°²±„ þs—‚ýbÿ¬ ÎïKŠ4mD˜)â¸Y+˜´æÕÊí¡ÕpN6X6 ‡:Ÿ·WØY#xûŸþcHs±ÉW)‘·“Â+¯V›ñ›á=s“PÖN-ܧ@!Ób0|$ÒÿnÖûâÜÍ¿'.þT›ì7—mŸ¸Õ|A, ¸a\<µÇ¨L+nÉ>& 4JIàõn–ùr^;ÃyàþÞ€Ôlå7ƒmKÁ欻< Ÿ¤8ª^G–¿ÝÖXTîxAhÒ%¡ÝÏ?Âjþ0eÝh÷3CN„ù~ëA¥^Ï ë·ù2¸B]ZftK*Ë•ïÉÇðr=‡=±Î‹ôðÝ!ûÉ/ØtËþÂîÖi4Aîþ&ž¸RAžr;}Žƒ<{ ¹ò‘¯~½™ÑÑÊüç3h-Ñþ•ƒ¥ÞèVYÖ©Éi¦Éúî}Ú¶Ä=Ä:ÚßA¿I<8à ÎÚš†C_g?vÿ59OÉüèP)ly…¸0*¨[Ïp9õ ‚ÖÕÔÓ>»Ã*ôжä?r°½¾ ZD«vl}S­¯&nx“ë%è|ÃMó Z®wW`¥wÏé¼ÿò’ß ¶Ñ¿w;„³4Â]9„e;Ò¶›§†:4üˆŽÁãÓ¯ÛÿúŒÿþóEEà¿h•ÑÙø¿ éôY€Rü¿ÿû¿ü p\)@Ñ9iædÃ~å©'mB¥Â¾ÁTè‘ ^TjsÆÄqÆRác¬‘¤%ƸßÑ¢2“Ñ]À™X¬È2£×J®Xw+ó>\¬ÚW¯V­ñÚÎêÝPÂ… ç5 ÁäÚX•_TöÅ~wB y ¢Õ1êæ/ˆä|xLå&Ћš]rMÚ¬¦mGÌAi¬Øp7:q-ªòæ“Â÷+Ù[…qŸóî¸)NOVIÒZ—Œx×­¼ZµûŠõ lµ|ž´Ô÷:in­-eñ°2¯ìõ]½OŽþ˜å˜Ê™G-‹±úv)©.íÀ.…“gn.‡î hÆÃ>uïöi·ü(®AAíÖÞ›^Gµ;‰òÀMŽú°{ˆ[ý Š[yšØÃ]9…y4Hǰóh3³5Ó¾ôR¯ãò­QAß§îhÛ/ôèŽÜêÙ¼ÑweoP¼¸ûÁpÜÌ©vžž”¥5²a½;.¬àÍx`Íß²¢U~A“á(LÍÞ&˜A¼5õ±l6·Gd¾ï¤ÌÂ`[ö2÷¹v–]¨Ü[áçfwµÞ©ÝµééúE›á&ÜðÖk”ÅíÄ;7vtÛÉíŽ)°Ý–•@âÀÿ‚É¥ +?8NÔ4w"[cþ´úÑYXaãóÙ´¦Í‘ú—çÏ]}efÝŠÍýâÖ‰Òǽ"à}´©ƒ†ºY>¦¾Qyâ´ûyö©ñ*æìBæ‹…yæ±Õ›ä ùÌñàŽå#ÔøOÇóv/8Ña_D›n¯8§¦,,ÆÆ ~égé~Œs‰zÜ¥ëc½EC_ê`ÕåLÄ6X+ëãÙ³RpÌmeì°Ù¯Tù<©¾R$Êœa«Õ›d›­Ÿ¤ …{ë!Õ¨„9©±)6EÂPX¡ çRµ9ýÀaK&×s2·è}Èo£~Šp™z§Ëî¾ÃC'vŽy(À¶µÙ$cdæ¸k'©òѺÁ øóà G¡;½™úÈ„o½"m;yY¶DEQ‹ã”Ù#UiÕªkÀ¹†j½s>§SËíU¿Ú+#¸¾L³¢ísæò6n[ ÷½IÆ:¡Ý¹<êNNÇΡZ«¹6êeж¿y»_öIÙý#ÝJ«ø^‡Ð{ †ýÏ€ŒH ð£#j¯cKp‘¤ JtÒßõ´¥Ùizhà›¶IÀY¤ê@QUé eÙ%K¼{ÎkÓžk4è>ZiÜûsXj$4å'‡ »äì="Éô:ºŒf÷qVó“z{†OHbNÝko9«ÜåÙNáÛs§;|-Êá–ý-6ëÊti7ûµ¶Á«M|­­ms8Ý”y“Þl3¹¶uöN¸«¶:øn?˜ö~íêÕUîp€¯ÂÑ]_:§ =ߟ6±•;ÛBer©¸+ï²o¢ÄÕë7¿ [m^1n‡éçs÷kŽô¨Š¨™9M·ôTó=îù>ͨ/2Â`3¾¹Zþçžøa•Ðó Ä=å*ôÚlš…Ž6Š-p³AÛ“ˆÀ¢=FX ý•”wEs&rBûTÍÅÈTÀÎ…eZvE­”Âr·2Ý*UôûÕ'R*×bjÑ«×,­\_Ÿ®î¦µFŽð¦žß$ «‰Ó¡æ5Ý_o¡·Î-Ó( ò”#U CÏ€Ú¼àÒèBoêõ~AFÈD4ß³»XŠ8+þ8v%éÌv״Ū³ôŒ×{mß'{*Ù™u¶Fëֵ˭f“ÓaoSa};Ö®ƒŠw™ öŸYo–>“QsÙ>Ϥ6Ä»$CKyjÀÓR½5˜îa‘ÅpÌf?]亄½XB#béÊ…çŠpØÞê)käzx Öe5Æ·%úän·PÔßyÔy¸¯¿ŽéþœÓøC„rçcCÇcÀr¿ “T+g´Uœ§Iëya}í~¹câúcôVC¦Û²ü<Ýyù£ßÏMdðP÷SöqÉñ'ßÉçŒSƒâ üc° XÇ\î´ïåÑú˜×ÆE(ã)y¿A=í±*4Ã{aG^ïE5[.Å÷ •Àw:§ÈÆ+Jj}ö.}DD“zÀª9âƒÍܧÌo\ |;Ì -Uª¥ñ˜­NhÚª1ÇS÷T»DÁ¦îŠˆ#d±…eÐo0íÜ®qÍ׫„g ^ãssº|0->`§­‡»«‘‘Í÷¨ªq(Q+_Oie# °¤LçÅÁl3‰¿^ pær¥ý‚ø‚^Üðâ\¨N;ÎÐâ,:έ!Á;À—F»ÓB¦g÷|´šâðeY…ÁM¨ÛÊX£Š×­v4Å›n¶O#îžF—:ÜÌp:›ëÙeoÉ­U¦·¬çr0´Ãš;hJ›Îø’c]ê!îa=ÝWº> T?©6+A%?ºÓ[y2—¡ž>”YÅS-ÎËBÜÉTw‚kÒ5Y—•s*×»÷ôenÇå!Ñ©VB·³tþEצ* „OðaÁN±ÐBï öÞõþ=À~Ìüm%ïèq½éýÖÆwžê4è|²fpæ»4®›¨EìÓh½*m³½ýŠ«Œ@Ä)¿t“ij.«u<]fKQJç›"5Å™íeì-ÕÖVZwˆÅjý|儹Ό㠴«÷WáîªÓ½ÙÍúF]“ÇÊ÷RªœÌ§¶9sÅUíBÔ^Û+÷šG3ë¶z¾Òû_jz¨­bøœÐdž_Ý·yW‚]õ}©tð÷{üç>ï),W5]ØTWÕ…´j‘–\¸¬Û6ò”dÉ+" ¹½.Ó.„ÑR^2ÉW¯Ä ãNeDµ>R Uð³RD¥§ùŽI.’™ÑÒÅ Ý[ÒB8xò¾ò9Õd6ÒÅäwô³Åèò7D2%ªÍ—uì’æèûL¤nù"¯±Vû£ë5â.1Í¥l±Zµ¤AU–À7³'ª^*üƒ”tn—¤Ã±B´WêÛƒÎïj :MÒ“dÇU_‡ò/Ü]¶œ9À„‰Ôš¶šr• )´ k‰ïz<"µù¸eÒK—ا°ÐÀ±$_ ±6—× çN›íޏIÏwSKfz´TíæÜcPZé‹všïÔ£©·&RÆÃ½,ŠZö=NÏíWÔù2‚„ Þm‹ñ¤Ñš—®KܬGYÏß|A©þ²uê.í\½9AoR”ð÷‡i¸Qz©¡H F%Nïv.µÅÙöç†F{çSm'®·ÍMc Ó\ºº¶j&]í:oGl—¼Í!xî‰P¶„ĈËÏgy!~š‘Ȼͪx+lXo¾‹RñÂ\pÊl ÿnúu|Iîûƒû#é®Ñy‹Õ͵›.Žåuöc½Ú¦1èÔËÑwõ&D}ñ7W˜« Úyrã0ß¢Ë ßÂTY½ Cùn9zO>jiæo¯ có¡/_»Ôÿ ؾ”»¨—:¡4/mû`ªOeÊÑš´­¤&@ê=õú8´ åÓds×§´ÓGw©rº«”’&ÂúÃÒ}€>ój}k€ò ìxñ®\ä·6ß‚ÒsñïbÆÉñÁû*ÈXî¨òt¨äLÆïzõ2üÒuèýÐöÿïôÉËê5ä{ò›äïð&ÁQDò¶÷/ÇéngoÈê è4vJ¬q6 –ú€*Ê&ÚYŸ†º+Nxy·bˆqÜuWšä€Á›¸í!ÈžÖ Ø¿]Îü[¦#6s&€`¾æ*p:}鹑ª ×\•sj‡åÅÃ-‰rÜïŠn3­Îý~’enGŽyC<û O¹{¼¦ý>ᘺQŸ|dª,OÏþñ–ãE–Ð|àK\Ñ~¥Øxà™ësÕí]—þ…d|ëB,9æ/ɪ‚ {T¯ âS]µ>(&~gý¦;õ<çàŠ,~J Ƕ[T,WO¼Œ$¥¿É\õ =ƒ–+q=ì—^ðÖø%þSnZÎq¼þâRuš,trìÂѪ¤Áâc{еæÖA•«Ä©tìTäÅñ£»z9IÜ>L²¡Ø8êg¹É0¹Šé ¶FW0ã•À©ÛitºÙØêu Bo^ÔAµÿ™[ *Èç{T]í‘i³ÇÈ!›/ägyÔÅÛAÐÔ×e•ÂM¨U+QG [!l]É{ìk®Š;»k£á Ü”Êp:‡g¶ÇNþ~Ð)k‡+¨e¤[ÎÌ0»¶ÕEK^Z™2bôÝ6F•¢Ò³—sS´¶óì(Eµ‘Ìí|VÌ!âúvÏ9y?-¾{C7†VˆP$D&àiG/Xù5µÛl|ÌNi·_Ðð<[ÞµøŒîÛÌ9üx¥ú³YmVæç©˜§¾²D#•b‚ŽUœ¶®Ž uíü]&î7ãîݽ)ÿÊ_°hee²P,Âs±KZÿä]¸ãÌx_y5¢~Û@®Ér``¥ÜYÆç@~íKŠóh$mp½þP¦§¾ §¼?õ6¿UöçýòDk•»­åÅʘdƒL-"È”p™ ^â ­ÀŒ0œþ–ÄϱžT à«õ6ÅiEßÞë†|9"‡\[ÎÖ”ƒU)/ýß ¹%žûàþqË}²¬U30¬M$•ÈvfW×îOý¨dŒ1çéXe=ºlØe=þ†æSôž Ô¬?†PžÅ”²éQQ×êayÚߢ}©Ð÷$­¥¨WëŸ I*¹½È‘²šÒ¥Z“zeu"TÈ ¿X­£_e·«äF0+1ñóu r_Á/lRÛkç¯Çàû[{µh’­È±‚„‚«QôÊÈ<Æ"J=\WŸBën&œvÍMjåèúñq¢?–A¦OH¯q· Í‚1¡xaÐèMµøÉCH(ýÝWƒÞÁ z{]4s:^-À©R°õ áêop¬åËTsT[4Ù?9“¶nÓ:½æ*Êïn†**R)Á¾¨ø«^Òšû+­Ó5œëÇuÞmì\ÙR¾Š^ÊV‘©2u +ÿvj¨ñ “QRYŸ2NÓÝ¸Š§0Ó{ËZ#:º^¬~XJ;’î»FS›¼Á †ãPï§1· æ‘EOR¹Ð'µ«m7Ë,ìpjñ/‹F”lŠÈÞõ­º#:óN¸œMoÚÚPá:.nŠ`O•–DFöj¢i¨û/ï(—óú^÷f6úm)c _ÎÞ׊>GŽê?HýÉ©&—ÑPýa2ÄèŒ:Ÿ±I*I#„»“úè¨ßɸ³œOF°8穳“f߇,¯¹Ä|ÆeK/ŸiûºèónjZЧ×Ù–àùÞÌß…®Ã ÚŸ–ªr­Þh¸Vôqƒn²™ÈÏU°©*yTÔ<ÌÉJ¾ç&^%õ±ÂÑC™Åu½u?:Y äKÊM‹^‰õ{ZEJ.NcŠ-xɼóû(2¢òdÒ Ê0žþxÎHz|V @;Ø¢zÊ,Å7v JeºÅï·è[H·n”‡tÓÊž§xrK3’L5$¹[ÕU¤ÉkñUϱßQ° §Ô„›¢øàõ¡¿fgÛ§Õz¼0íw4eÄTçÉÞXë‹B§¯ƒ"éÒ%¯öV‹ä­Êwæ¶ÖÝØÿ~‘㌾C¿t°‹?Ã5Ú¦<à¼ïÖ ’a× ÕO…õL¯ià'ßÒF$èuû Q-£UVhæÞŒùÒ‹YéDØŒ>fiP@<4mñ&òús¦¥÷ì†>ëèm¨ø¦6{ò’wòsÅÕ%ÐzkwUxgwsØ¢ {¶½±£Þ÷¶·jŽZ‘Í,ñþ>J5*åLgGájb²ÂDk´gt‡hàš¶ï*¤Ò„NÓ¸ÆÃå|+v-£yxtéžE¯„&æ/G»¯|ô"œ}(×=.ÿîq;«•Ô¹ •m—T®•q+øìœ©ÓÞM$îÕÃ)& íâR‘äÁþÐõÜY&®³n®ÈÆz0G A÷÷¨­§j2î®C6nÃò}êÕ|r“Yšÿc:ò´’LÕE'SÏäž2&c¼yi&û¾Ï½<¹íÌÚ:wˆX®dºúÁllìMxÌÙR-nn-×Úb;ñ…íUa‹7ë9M‡ÃÓç€9YV ²Qª×8‚&ȵ:l©à À?Ëý€—žªµ¾ùÓÄáq Ã.1ÅŠ*ÿ’¯9‘ªì?¨Ïîȵ2ýÙªæ7}‘w× `éÎÒ÷§‘Ýo>wæö𺻈âvD#ýKuKžÝßC½CÓzMõÓ ÈÆ;’ªÊgyïc¬úu…ûó{£Ei¥.ÌnjvÖØöˆ15ÙRåÀHçÖø¡Ô‡;X¦Š¯ÑL #ʱ­+Åúô]ñúÈ3^£êIÇÙµ®X›‚¦mÒ®…”…ɰ¿›y]Ná<·OUöÕc¶~+Ù üO×8EawÏ{•ßñ®rYó[pÖ³‡‘ühø8µS©«+ÄËú…IY1ˆ5’޵LjÖ,=P£›þ¬ú$s¼8â µ€‰±å˜Öì"+ƒÐ¯uÈ|vÞ°á|*vy½®éÃßÅ!JcÕÕvh)6Öî(s"±um(‘h9G€õ(Jl’ÏyÇ> VœÓ•¼ÇìK“ˆ{/Â*Kų¢ýG©ÇP‘Ë¿*±¸èÙ¨ñ§Ì(ŸÊuþ5†¼\Ï°Û lŸÙ<ì·\œ”¿æñJ¤íZpåîí‡i¥1¶u­o®•jcËFáMlŸäË[,*È/á<;'òqÒ+TöâÇ6S_zY¹UÍ'êë>¹‚œ”oßérÁ¼¸‹¾0çc‡Mÿ«pÞÜ¥ô›j¿?¢“¤Hž_%gÅù¶9zl» êO_ÕË~œ#m¥³U|n;á\Àú²|‘!_#¯¹ùŠc.‰-Í97ÖIbÝže£sµ¡=nú¸¹ÉàèÖ€Óvïÿ è©Ì }tf›J‚…om¥áœÆô®Ùtµ»ÃA‹¡½æJ¯ÄúÄxëKº]xއÊë ,uT_r²ïVïuêyFäN”öœFµRq7żaÑ(É}²©ÞÌ\ÔêI¯)¤ø×W‡ZÅ!R*¨šÒÜ#päºÞZÒšoîßUŸ„˜7öƒ¹Ãº›ØþAwƒAßśىķkÐ.T×õåØ@…»vôWýHû-¼ZûÝu-W;[¹ ë‚! ¡Á~í¼qÁ"µ´×ã™ÏÁ )®§WRí"¯Øj:²CTD¥#üЕ¼»%oZpRl 6¿ï/3j)ë²èE§‹-¹e»_€•¶Áæ¢ñþ]1yúðjI«Ý… )ÚÒ“MÎ!)6ö£þ°‰Hûúvûš|í¢©(}±>cÜï×+ŒÁß™c‘)–k7ñ”vgì)]—â¢{ùx×™ ”ÊÎö~¯EƒÒWKÔ‘EѺP]€½éfQ¾H<ШîR7²léëE-Çæß]¸ÓòQ“2ñ "OðÿA#è¼_(‰Û{;‰ò¤ºµþ×}%2fEgsä€6|—½áÙ?×ß“ã‰8}N\ã玂óDn{ fšûä߯±&m¢…F«‘ÒÂÿr¥ú¨Á=C£x׶ʯwÜ,ÆBçÌéÌ,Bû9¼ÇIQ— ¯ìõe¿[þ$;ÕÕ”QZ0y8è?Ë`ì‘ä>hº`ÅžÃGUøCJ• xë9^Ì—â^-®ÁÔè&u+Ti«¨p*^¾@ŠÈÐF ÛñÔ¡Ë‹ÿu±Ïb£ïBKµŽÎᔈþ%¬ ‡§›,˜ïž}°ßî®[º}özù’ôŒíç®ö[›’‚M6ãÄcC°ü™÷Õ0<öñ‰4Ù³N°ë(îºRxQ,áÑæ&÷æºB_ðº ÃêCj¥ª¼ÃÞ*ѸX²ájÆy¿ÓL.»oáå[×ÐâgdOætï""5ŒÚþàö¨vîZÅW¬&l6[ÂrÉÅ6»[Óý²%® "}ZIš<$ó:®Þ¸Ž.Ÿ­Û½icš.­uDT£çËïï4pÓÈ»Ã_Õ:AÝ”yZ'Ò~ûÍÆ…{Þ…3“^°—1Y-Ø€2ìqžÿ^ 'º(ònoMié¯[Û½“wÚ÷±ò{œ#Æ×P¯8ï&tý›öý+TëʶsƒeÙóIC‰¥È±‘}l™=¬(åÖ‹n¨˜¨ZUêˆn–aŠ“=p<¤õƒ-ͳÃ$ÞÛV£«Õö Û#‰pü8+rç;–«!Y‚Ë#œsøÔ_5GO\ÌMÚŒn*Nžce\@7}‹ž~ZÛIûqs´šXÉlVÚªÌòGe.Ý# ¹¾kjÁGXg7]SË%ë)³Ñ±÷˜ÕßZvÔå.1³Ö‘‹Qk½‡®Ë"8‘Õ‡+õ±0æ†?4x˜¨çÄ™¿éôX2 uý°ø Àž”³%Ö›ÏjçJêês;Ô”çð%¡Ñ›.Ç\Ó›MëÛƒ ·ð²:^˜KuãZÐ >¸L6Z§Jo —ätcÌFål†Ç¢‚ÙÆ!”:G©Ø¿<«YèX¿‹'!¯ÏTšŒŸ¼·Ž?I•ºÁÌ•Ô_rc6Çï¬5RÁ¢?®‰}¥ÿI—ÉoªT?ó@ÞvÕ“£aÃ’ xæf¯×ß §yu\“”µYŽ>Èý"÷¢CÛÝè¦ÙLg,–ò寨ßQ¯?”(N¿1xɉ2ñÚ@ü¤ö’²¼áÌn$-ÖO놑ë³uÉÀG,<ú-ã9´3ŽÌë&<˜u_ß*¼©WÜùEä°5Þ5¯3•ÛÃ_©6*UðgèƒÙ¥© ÅþÛɧøàV+-U˜µÝ¹w(pº%•K˜pÿÅ[á™ ¶QYÇùŽiåM50ùªÊ—ÁG½ßú•¨÷îQ‰k6ùÏy\M6ê˜óÜW\æ}q¦ÃìeÏG•X<ù³q¯$¦’¸êû2îü Ìá_ß.ÖZŽÊ…â¼þgz”WUz‰²ySÐFZ(Œ|Oµ?‰„“ÌûËw}¡¸ÅNªÓ±yÑØ·¿ª;j›ô÷5iNZPL]J¸P3¿ŠÆ÷>ªïMæ2Y®ûìk_Ê2Q%´Î]5Nm/]žŸÀ+g‹x6¹Ú&—>ŸÆéÕU×½RLOôŽÐ‡ðŸ;7*ï÷ƒ+–qS™;rÆÔf¸®o|É_9°ü…å:zd”œ­æ¶¼ îWgÊU™“`XV6ä–—›Xž’äöóåË·J÷) ýd 6ë²¹µ^ÇõîuÖ&ß´*ÏJ§ß‚ÝŒž*9Á?r·vÌÔ^¬”ñ¤d¼×Þ²•rö‰nˤN“8†¾XyK·D‡7ÕÐ*¨ ¾qa™ôÙÎûÖ[s:>­¤»±Îw{XQS[¤oƒ&ÉãrrQˆÖ”Û³ûâ°ýÐ…£SSÚ°o!šöz}kee„ÜÖ¾"•'cCUºý”pà>Ò-¨ ±Ó„‘®þ¸‚Ý ‡v^Ï—"7ä³®üB•ëKÒàÒ±ëñKpJ"/IÂR^ÍqOÙ™p–¾$gfI¹^´Ê{Õ•ø;>” —mÞc—õs(q|ëF?' Ú‡ÅI"«œÞvs$V©œFM+÷ß••\èc ƒž+ÞkkKchËd˜qè$ð˜Jðò,°CWAÌËm &¹<ïÏ2­óuÆ‹ÞZ ˜$¬ÆFN-EJî–¹×÷Fm­4%!Åg)D­›ÈQƒ"—{ÅîŠc¤æ¨\î·å®Ü'¬4'Ý>¦?LKíu;ÏF­#viêjE`éS¨NÏÄ F–,,æD‰ü‹2£›§Ø—לRBP,œ]_‚²îätál8GÈœüÁÕYòýc8ÈÕ³¹Q‚CÞÔÑùàåuy Ä…RZ„¯!û2Ò'0[@:z+lÊK¸Œs÷›*–äY²ŽD­ÏúkÅ7†ãÝìáJOB|¥êÍéâV·€ãŒÌüo×j/Ïu]P<}~jqÅÐFLû]c}-”Ø*]üâp‰êÝ ·W -i)}`u Þ¬Þ ȶ NxWQеbXÓó±ÉLå苽ø.ž§Ö*®”Ê6Ç'ìlã8Uòº™óÈi½-äßR1Pióµ^oºs•3íOåeB_×ÑþBûÍÓŽRˆ}`y½Ë+pøòj tWHƒƒ„›»ßßüMÌ|­íêH_åä´{ù`…CóoNjõ‡ÓŠ`vkqou[Áä¹ XyéÚAÝ‘2®Ý(O¼e¯lAO䢥š½BÅ 4i®à²¬릮` ï<fä&l5{É€.2É=¿xBå—«-¹HÞëö U~ Í™xqd0¹ªèõ¦ÊJÖ™M‚–‹}:— ¬ˆ€¿xc½ŠÔåÐm ùŠÊïIÿ%ÎEšb²ö°ZݽLuôõÚs†¬ßzzo(­NC|Œ §ëœ-L–_n†ˆXYDج­>ËS—qÎÏT·¬«,w™„ÚÎk-¹J™5vÇS3Z×ëâ“1öõ7â¢tø=ÁzÇ:/”KMšÐ«²U‡ªàÒú–Ða:Ý §º7˜`‚‚ãUYcÐWK±)ϰº 1P1ƒ™ÕŽé—l…)x5;ÛÃ/wêh_ÑA·‡—“ciòØ—–µ-¢u¬Asˆ»¹‡o«†y5ù!ó[Ç ’)·Îhqßõt‹ÅÀ.!,Ú»í'JoBpú¨Óþø¯Wz Û!®çÐ7ïä¦MM=6Å~ÊO˜1zùý¬èiCàI–Rihqû¢ƒ2€Ï‰m÷Ëx¸Zng3óÎ:‘Œ× êß;ó÷±–z-e³Q˜Ç¡Ew;âÏô{X+Gåt&h{v˜(+ÇfŒîáñ˜òg_XÝ„éË«ÄCV‚ a0ÎXZþfÉá}-„ªSò ²øÜ‹[%óŠóèL`º$ï/}ëèÒ Ʊ¿clå"š…~ô˜n^šÜK'¥¬Dñìš”<åyW%úÁ!q›mÊŸÙ²U¾»v¾ƒ—n¹¦é~ì\!o7í‰~,×ï£Ë°ð¿B¼Öš·ËæDl¯ç•7¦7…áx/"ÛôM¯5÷©ElO]]0Šzçõ­1å&Õ3ÊZµôkfT=X˜à IJZFA çJ—öÙºƒæÙ‰ÔË,½ëÃ<ñ•Ñ‘*E ªéÓyeª3D ð—U/¨¨FñîE¸3s PmƒO¤ôÃÄ‘NÌBSsU(]µßJîZ²Êúú›²¢éá-ºÆ(t®cç©j¯…D®/ ו…[9!þ´Þ¨Ô°ŒšµvÚÓWÇ«Ÿ}͈†SY".%Ñf79}<ü=jðÈpû¿±:Êšå‘Ú–Ÿs5¤&Ã(jçÑÁ”´”¯bXêÝ-c¢G•×i*åÄ6+Fƒ\¹ÒwÙîɨý*ÂÇ#ñŠ¡ ‰^Ýz¯›}~”¡E±CP†0¢2ñ¢e¿äX5-½ Èð\Ï"ëçV~9^zèK„ZZ[¶€YO.^4_Á¼07÷{¨wU.ðÏ·½²§ÕŸ ¿iCÐÔ÷Üìêï=¿žÈ¦ã¦¶´É9|?žd=‡ïAüΦr¸åÉBj,¬f4çG¡¿ùݤF¹€XÃà4HûfMÄV_d¦m¶]CÊ´'®Ö—ÅŽ‡w9ì¿ià²åïAé÷" †°>ÉáÈí–ÎU>|¶´éDòc•]¬[ÐÚ/µ eø"k`!yÔn˜E1Û«—nÛçJ‰à÷Êí§\M(2õxË&åæI©‰Û»Nœ,²-L*(ˆ±¢,žæ&[µi¯Ó%C3탥1]ë²U]Zbu qºŠj5«º0з:! „ï+é»ôSwÑBJçb jk?Gï'ç°ÂXît7·gÀ)ò×Ýþ O›ujQÔ2&w°ZB ž¶ô˜ö¸Õ¾+1QÝ(¢†¹ƒ½ûöˆÅ°â:ócqvµieUÛ¯*WYm_ÇúŽÜNÉòéÑ×|úÓPeh{E*Ç÷<êzÁ5Ìr^}ƒ\ño¿Û,_ìæ€•øjˆVd8 ]ƒy3ç,îš•û”ÓÔãµÖf¿·º¯¾UÓ‚[FIjAŠRætkÖÔÖ1ìûH©gË/j|°'mûuèåùE·8Eë=°f઩Ô©"µ å)Ã×ï†ÞGÍv­%o/'®?iáµY¿~0„º³&áTæi[n…Ó¬°7YÉRñ‘\Xˆ—ޤÞîð×jû£¿yœÏ#‡×Ä—2ª‰G=ºÎÏØ‘?æ/+.,w¹štw'›”¸¾Åë“vƒ) äò7„鮸U¥=µ•9òV£ïzV ½’< {²s­¤ÇçëWwÜÅX`ƒºbWžËý†:åë{ó†fEõ  *þ‹A+¢ÝÆ Êá‚WŸ÷„Ù"Æ•j­Ý³ „ »!TÞƒùе[f@ðüÔ_Ê—:š;ØÓ:]µl/º²_#±í SÞ45l‘Q6E-4Ü\U”ßÔé”oqÚ}ÀŽß!jI+·MýÉøV(ø \ì%½…±:MG?÷ƒQºÛçÕ×Ë‘›ö9]uõæl¡Ò+û¤)—; kI#*âÁî˜ÅÊ¡¼^Úçí‹sû™r¼b›&5Èù—»u¨oO¹êt“þê×£ËàÔ& ”Wçí+«{ýù7›G®ˆ>·÷rMO>¸½;G3ˌӞ5ä‘Ñ!s©˜“ªÇ®8y´Ë ØZ'øT`gÛ‚Ö’{Ï´•€ù>‚Â{à»VŒãÓöã<È…q‘ë‹å¾>êL‡fçgjzxÂXœŠ‚¥º;¯iÅ:£wmx:”ùAiW_l¹2×Ï.ÿ‹€a¡áàC´0zÁ¹ãðu¶ƒ¿JŠHN-Èp¾†ß2ýkî“%ƒM_IO^ØÒç¾jŠ.“qaFü.QŽ‹bTCŠ«T‚P7©¸ Sk”ÛP¬½ý…’#í:ZsÌc²Û,@\Â&ß¹ÃOY+¦ïKËÑ?h°Ð=Cî­—¸ý­ ¤>+ÉÝ>6 CÙmfä@žgÅ0¶­-­¾»¦²©btX'¿ûño«žÀ—¦©<¢¯‰>‰<ï`ÞAæ*u¬¿¾‘ò·ÙBsæ6®~îØXW{Ø+²¼BeNñcTÃWåCÄÚ€Ow¤V¿wÅž—&×NC|-•êdÐеú§ Õ ZÕA;n¶öOÉØ± ã| 63´ƒñ®§Lò#jÓ¦[ªmú}DE†jÔ]›&-®ËØP|?ÞØê :HÕÕºñ°ß\ãáç´5oþ¦Ws-¾fžw‹Žn²z"æv±ŽZÇjÈmyµNú?†ìl;V7¥Ù[:«_£Ljçd!|¢»ÁÄ7Þß2ƒqíéL…RQkú-ø%³‘ã„RkªüòÛ#6Îd+¸FçÛú6:}‡`2ä êÙiJòlükKcœÏ6TØ¿£­RXcl…î5J=›Ç—“~ÂB{ Ô’¢˜eÔ׊ýº˜ÔO‹g åÙÌ[œEïAç>ê7á•þ¢'{oyÛoz3·hÍá%´z¿CîùQõ¤Ÿ•ѰeªæL¦äáÙo:W£×û;5ØahM7Ñ4¯S›¦Ë‡•Q}Î8iÛ‡c±¯z7Oß„Ú:îZ.X‚¸L?ȳå£èR;eöŠÜé¤9¢¯¯¥5-emërtOjS˜­ƒ«ù­7ލKLÇjÙ˜¢êøbXø¡ ùÚéSæ‹—_SáÃÇÓ¾ƒ¢•õ\To”¨_ÆqF&yÕW •z³g2+¡'ªÏëßoºY!SÒ?Vh[{Þ] ¨…$š*ÑPÀ_½–¤þœ›¨¯Á§¿^¸#iÑÞ=%9—ÓÃèºjX2?ëý}¥Óª£0ÉÖf¡AT3þ^ï 'ž+°aQÂ@ÅaCq‰a®‘kJžw#fîý*ñÚÓ™µþ”U«Ã½“U‹¦&ð|M€Ë.Í˳¡b…BŽ}á÷ÈÉ…ŽÊ<Øa_ªöøxz7fNoúó÷äÚjY%ˆ»óós•QÛ¿ÝWWð¯@ËAÌÖ~ö@}ÕF†H7À ïw jy^Ü÷ôU⻹î{´_uçÄŠìËêï–³ÕíÈ;»º4ßíKc™{KÁüôDòŽliu£Úš˜eÅå±Ö˜Å‹¶s¼pjD ³SýhqúÍßo”Vô`æ;øàÞ寿–#WÏDÃE÷¬ðÕë^hn:ŠÈSÇYXóíU£>Ç5ææ“eLÛ=·žk—¹>ðÝìãÎS¶âÔz [è›±Dº8QÓÅT¶Eåú®œïö±útž‹ÐìáDŨpôà¤~—®óà1g”ò<ƒ‚f©øâ]þÎúuün}ÁKX}Þ4vôK*Ò*„Òqó›¤ç¨rãKÞ–ÎûYÏÊ\hΧ"@¥‘çÍÎ Íë¢ÍËk¹æ”9R³j9U‹œ<3bcŽºT~®Ò(\ù½“T)4G’X ÎÀ+ø= ß’wVÐQi²zK“+mIOIYbY”JÒÆ)TÅ#QÌ3òòK¼sM긼ø9˜ùîÛ@šI+ +~©™ørQPÂ#\’¼{“¬“®ì4 éS¦ÁvqÙœõ,f›¢">Рz MXW1!®œ|œÍu•f'“¿9ÜDØʵÂ^ÁýÃ#GÅaòøŽËwMÊĺÕ1–ÅÛ¯`5f>&Ry7k'ûetÁ…M®]œÚ}H92œè%›åIÑ­Žä0åçæèóôêŸÆTxd^×'KÄ>ËÑCDbó(Ã56Ç„žãî7ƇE{khGÔÑ¥ú §1Ê]OÁùD7ï·,$ƒÄAãyÿ {3fyõÁ;O¼l‹0“:ÿ )#t3Ýfªè‹ŒØ›@_#÷ç4\Àü¦h$ñ]Žg‚9jjÞјn¼K¶XíK®¥<ÝîéÛ;¿ýf•QÓ$(Íï­!õFYqKM8¯>7ªVâ&ÆÉŠz‚¶Eý)2åÇkáÔU…Éi Å­5§ÓÞª×þ1”¢ÔVBêWoEmu>ð·„Âj¡äºÆ·È7Á\™Z[ªã ç1þö©Cð“t0nÐáLÚ*À>Ÿ/ú<‚„â;FAXK_töV4íßD¶5×e¨&¦×<»Óãîk2d¨Tš~Ú ¼@÷|îR’À ùsµP¦}{ˆ–!¤×)t^ ì °‹ZîDá+'ò¾ßË»OaÄ\d?“õÙšƒ×ÈB³ze(Ó—í 0¼sˆ¦ðÖ¨rÎ)·b!'nzrW»†ÿ÷›…›É=îÁGe%ž,*nž¯ŒQš•.Rêa>Ç]^ ÜÔ©Œ°¶ÁÄlθñ¾)¬ˆ½¦%5‘“ûOåÍÌÁ¬©¶rò–»iû…Ú”fþƒµ¢95o—З¦ûóc òUCÕ›‡3O˜Ü˜ã"Ç™¦U\ÈPmêuÉúq­ÖoIn­Ûi ©Ì2@`ú%½™Í׎˜;þˆy0‹Vb^}bÈz–\éš›Lm;²u0]ºÒÓ®ÔÐ|…ºR]‡MyRü‰a«·|…–Õ°¥ßtTRëàTðÊÞ $­§ì`|o®¿¦xiq·²Îí½± ©•ü[[.zÆ}IcM®1•·õkǹɴuWJ»ˆßŽå§û,’ªä ÜŒ>ô'SÍž”âÎJ㕜^‘4ýê/=k¢E¦Íš“‘RÿQ•¼Çè“é2IhcÊ7¡#ÏEÅNzëŽsàûâ³-°"ŠŸ˜Æ@K¬ƒHSB:2µl°Ìe«Æe[¿Ö³TtJýÿT‡n ÑQ‚ ˜ ®¯Cñ„| d(-{ªy6®xQú>Èç®þUýjë ¤ã·'xñ¢l–HÊn;,*sÍ5ô7Œí ¨F ÷ag(å°^x¸?TÉU31Úûʸoê¯ûRN’þì¼çïJÝØ´¨=bTn•0Ër}Óœ"L]}"B×ýÒòÅè\ºòµnMy7?µ½ ãJ*=– ª’*ˆÏ!Po®Ø©ë\+Áo½ÞÉY‰>•ñǾt—}µ=NÞú óá,e„|»³mLÃú#>›Àw©;%µúEõÊmL…o9,w00v•PáíëÎìCâBPLè¼ÊñÒLjõIšØžÆÕÑ-ºÆ#E匸;å·*7•®Ž·|¤V?Ìû±£\ÞMXOȺåYiûªz½ýŒ#7¨= «-0¶qC¾ús5äóU¶ã‡lëãÜ”’â\í '·RµêQÚ½F©¤ó³¶÷NFìUî¸#;ý”¬‹%sò‹ÂêÄúìµ@e™ØÅAµf÷™º2­-”jõ’üƒrímFmƒ)ûüÞC¶=Í×§Õ>h¨/!F_5™>-[˜o/«XÖ[OŸÂé[ !‹Ѭ”P½:ÃWD¯w¨ö*»þƒˆš}¥Þc¼WZì#^z]Q+µôÚ¾›ªüöú[¿Ø¹÷5'M£èá„íé·ò²ïmm3a6ÚºÓ«N¦Ó­£+1UEc½!¯l£žwòØ¢"K‚àx†€J´ŒdÞUÍ}Àó¾šÖõŽR‚¤Y”ÑòkžzÙ°Á-J[SHÅC¼½éÒ¡"–—'À¥ÓÄSôý!gf…Ñ7&üÌWÉ ·;ÖƒÔXÞ¸ß4gϲÕZÓÌÅüÐTµYgà Ü"‚Ó›¤êˆ1&ƒ dÎË•»·;6í¾„Zi¨Ú× 3WÍ^8d×f¡öw?mm¶Í[W]à«@Žï²GXÝc´;p]†[±f±/ôlK«—‘3=¿‘}°´¯r¸f7RjőѸwSÜ*²z+ ºî´]˜ëh_öòk#ŸÈf¼©37v­59·ŸÉ¤wÑÈ^¨8û±Þ‰ã1~L{qX)Þ•ß|5±Õ[»'SB´V‰—ûÇBSÈØ¤a~Öøn<­w6"†Dýmïrë)Îû,n‹ƒŽzŒü,ÛšÜÞž© ¤­Ã/½V3Ór§îqŽ>û¡´×nOÃç©;ÓŰŸt¢Ã¡æ‘§ ž¥R$ꨬH›çÕ®»UAñ»Ãù?Ȧ{HÚ£øÖ«ºIGëˆý½´ àÝ3¤›a¥G-9Wþ~;Eux>°Qû4dm¤NY“ëZI~s¦-ÙVomg±-ªÁ”Q)Ý|ú±¡¼.ÚµåkÍ{±‚GF>ÔšSzXáx84Wu@YÊ)I£ÓÍCæûal7™Åú>÷Òr›iço!î5ëþR-”mJy¦_vPïRÍv˧Ã?(§Yïl÷µìlÚú'˜±¥#k"üÖ}°ЋÆõª ÜDM«Û7îªïŸ²jRØÝ§mk´]oe ¢%±÷µ™éÌiS“Ô‚ýŽe™NËøéï×cy6»ŸåTÒ–—{Q R¼¯õhcs©½R#ªAûIÍ‘¯­fÕp@9BZ±õ±´ »ŽÙŠe43 7‘2P“³¸^òtkBày²ˆ¾ÛŠTbƒßÄátÝqÁã>¼$Ó*Ï›oÍ|ï„Kç\ù­§Ò?èµ¹ßi¥ôi,5?+:@šôtÇâDÂêË5ø*=aÙmQX68`½µ¥úw2)Ê"Ý?F§±`y"«I<¹ª=OêÌ…à¥6` -’OT—d„‘íûû$ýUÍ% D&µÿV;< ¤%n4Y«²­G½÷“kUIúù<.(òµB« }\žÎYï“’Ò #׋voªP¤}ùONº?)U1§v¬ÉNû×U6ؾª}ûxG›O×À=“7Šgž·Š:_'°óÄd8úyÅ¿k=FÚIèŽW0=°H“®VÄå' ½*‚|.Á¶÷h®1YßߨYGÝaçƒ#óv EíªhnkbÔß|X¥äÐÑqcýÄÁå](snçÕĶ[dör´îóe–ÐLRÔ4ërÀÒa³<ºêlë{4ètíuŒ–÷Qgâ[RýdE©€ÿ/ÏF³‰ÌŽÌ­Cuð‚S¬QN^î1óø9MÿAæô#怮—}ZkYÚ¡k˜“b#åæ(ž‚î®–Ý…bÇÛ¾5âù%nÉΡQïZæ{Þhslm. 7›íÂAÛ—4EQ_&’–»‹Sö-,%…Åâ‚Í^IA ´îaÁ}âÍûàŽ”ŠDbãù‡.ÌóŽ P¡U_‹Ô\µò¹TÖSü»4x†+ES‡WU¡wÔ‹žs5þA ]/M…í#í>1¯D_ D³™‹c è¹Q›gÉ©ÝïÑ+üà‚+ ¡ÿc–ëv òWÇá-‡l¼æUiœÍ_&ºèP#dÒڬ犬ŠG€¹l @†äAXfkÊñ§@~뵃{ÅÓÜJ]9àÎEËþz.buYúȆ^£–R¯Ñò\5wùÂ0D vlÉðÑÈ­°0¨uþNØ-Ä~ï¢#YþXïbÕpB¯ú£e*ãÛI-ù•* F¤ß¤~.cÈ|>ESÈÔ^,¹ÃQóFºsSå*Ϫ·Î7¨Ò¶£‘æÉxéÔŠ(aªäážðè5%]îZ[q¨÷Pfœºê ù>hÜ{ºJsuh(Ë}a*D*8­7Fð~ÚŸ–½àa2lùrÞÍÚŠ>1»·¾Ÿî3±:~f¶ê›*­ÑmÝom~ghþ  \„Úõ›g6±x³àŽnåÍÈjËǪ ¯¡w)MºŒ¾~æ~4SÓ0ß±G]œ(jšV…/3é¶è&åRi2žÿúæ¼ûýméxýK÷¼á{Ýè펖$û×NMPìkœµÞ´_µ…Ô(³¥ŠÑñÚ?øãKU¢ûõZùû?3¦ g~q%׺íö¶$í7i­Ûo Qê Kü¹ƒ£†¶Ÿ¢pÇ–xÝÂn<¿1\­Ä•yMû×t=ßôìÜuŒ¯îÛ¢ÄõûßÁ"^Ø´.ýâ­—dþEžÁY–"Z/äI†”G­àçõ cß%ú3RîuüUe3dç2Ý÷ªwzç~ó·$ÔBÍþ¸sCûï^G¼Yÿø×ä}íÅsÚ¶g_ŸÉ?\£+¨ò§žî(­F Oý¶›¢’À™ÝšÕ|4Óøß‚ •û¦<йÕNe^mÃõ+å¨Û)7 cœ¦zUs}AL©&aEíÕ°é°YªÑé¬Ã1óžžtñ}×|öf.ú‡êu ¾·ÈÓž°ñ¿ »%Ek‹:~èÍ[ã(wmD–.ãíffUqt3¿‡Šö kÌ™èàè¿ÑÃpÛb t;_ÖªäiÂÅËy¼’¯Ò#¬ò+,ÂR* Ζ÷jѡ٘‡]³f̱í}7ƸPšgý딫6Ô}üyÒòUÔóÚ³N:-9÷)Àªç@vûgv¼íí™S9¶yY»ø6ÐjìÜy“iÖŸó…X^ó‹ÉŠÎ+MU ˆÂ+¸‹0`P ’CÓädÎ9çý_æqæ›QºëTÕùªÑlä³óæÖxö«&èäî~Ø_Fœ§§í“l-{f¡7|úÓ%ÐÒm:8>Í.L6g÷¸>< ’¹|ÜlÓ£H¤Á Ò€zu¶³ÝÐië‰vVøW/¡ÇÆeswñÃSÜX µë+`µæ‹–uÊú ÚjÄRA0ÃnÏh²um6ë­U¾ªœKîÙÑßW+êTWŠbãõÆÃ4²Xmc…N5Y\”E­1\ãR.*nOõøÙÔ¬±¶ùúKÜpõÒ]yÿCx}í‘®ÈEp½<žæ Ž6%R¾sJ0û}3óý“¤‹N×ÿnšÝ˜±S#ÒSY÷¦TÐ%¼¯î³gÞÂOÇÍU޼Y_´ÛüU®LkÉ–ü;eÑ®ƒÞ´K íaØU–笚r߯«õv®Ms)Á—ÎBàßäåËÀÇèNý`[?ï'ÇI…Ê Ÿy›õ ½V¦~;òÁeJOÆÃUÏÍTúîGȪeÕc½»°xÚÏ KÏ"5ÌxñkgmMgš²‚aøœ–F ¾ª^¥Ìã¬&;8ã]Zûü4X¾ÇÝÙYÞÀO‘ùñU„3@É›sç½4Ržúý}Î_J'§.*f©>mzŸu€ë2Ó6a¹=Uʰ¸2{ß¡ m¢F³êûe¾ú_l®u%Ãà}ÎRÁøeð[¾—l´qÕj ã¢q¨LJ qÌz!ò˜fNÉ”¶=‡“ûÖü®_T†ï^z)xŸF¢ž¬hfÒM)ÌéìÃ¥Q7·’W¹¿S»+c>b‡²6Hzp!I;Sýùõ<|"ëKº3ÐÏ5›ËT3óŸËg]‡‡w.>ÊîÁ³•æÙ(KŸ§©Žî”[E+c}h{ì}buí©^¦Ì¶“æ­æ\añ/´û­Æ&‚#|¸Št‹ª^]N—Aíûí˜mûÿé´n\½âæ¸0ÞŒkSƒ!U²÷fɹJ­½xíûÞ@bV-í½,~ãf+ñ*Ø=u¿†UŒC2i†ù©\Jë¬+äÞÞÊ6¿RZs­«?øp¿ßŒø¬E¾6z„—òð³¿tdiaYäÉAþ6²¾èI“rVˆ®ußH}…¡4¥&»¢éÕÌ•åU¸6fizúiÙŠG³_»5ZbM'.dÝŽñù’ÄQ2ò;Ãa©fo°óí“HÎ<öËùÕ¦ìÙ(èì¬7ÀŠƒƒÝž>x32¶9ÁŠCh`wþ©ìÝþ›ª1')o0iúõí½'”uPÐó78¾U·¾û{â±ð™vœ¿Óm @![ÒŽg8¾|Yp{Éä;£ïá·Êæ|ÞßÕî£tž2·àãÿMü8O#·ï´ûL~x):^° òíëÍJóÖ†"Rn™V™¥âìÅ·7M{;ð`µw£C«5-šãvÜïµï}÷ä”Ñdµît•­ÿwGD‘ö'¶âáÏíœL.äº~T"ý´öx”LÉ¢P­šV¥ðË6æhúªöîIôævɈ/b›ù#/Û¥û,1ñS^J²Ü.Œ;lie|r¶F“ý‡¤ÎÃl™}¹Å D÷ †£á¨l.5.OÖý’ãºYéB¬±#q9”ÞÙ®;ü:]xr¶VÕ+{{QOU쾡MÐãÜFíc¯M4#¯/&0ÎD¹ ë¾^™óývÚì[©r«­÷ÓÕöñC L ÑØh1RþvÖ§ï2*kÜÂZíò#mG2’˜ëÖòÑÓØnî™Ü›ûmÓV±ÊÔ]!Ô ÐnEúã—AJ('þw"Éœ¡,&j÷hŒ— €ó×M«¡ªœ¾GÍîÊ)Ùr» ϳëÎñ÷aʠ؃ÔÕm÷+G{nýœ¾i]o Ý–®ò,ÓX$„5FÑʰR?SîÛðó0 ok™nîü»@ ﯔW¥íïµaY›Ã¶ÑµK;~¡Z·2Øü5”KN·ööކÉÝʇ×c¬Äʰ2âé¿3ÓÇÞó½aÇšT(––Ô©ó¼PeK[ÜÃ6¡V© \Õâ+Ÿ÷ÀM-gL ±òqlüe„£«2²†ìL”÷É"ò –Vj]Ú²ÛÖOsœÄqCZøgE‚¤ýi‡F›¥Vn[³|‹7¾œu‹`•ïZÌ™:òŒ<'ý–îVM+ÀvùT’Û,­Êc|P{SÝgß:=3ÇVåŒ÷«Ó*´øZe+›ê„ŽB’³c¯Ö-$‡÷ÃêøºSÐû‰k£ÍãÐÄKÝ÷ôQOٶӚǯû;}—·ºê'-!.ÕsVœ±2@x ôTÉvŒ©fÍXÿÎm»È½Ãx_Ê#Úû²NÓÃ{Ð{™!r9Û• ª i*ip³òÔáz%¦Óyhâ\Õî,R=ß9èiäØކŒŸWæ²¹aÒÌó»ŽrÉ뽟7Ÿ¯àညseê·„!ù6‚)AÜ:UÄ9 Âo~Ó›0€ ÿ¼»ã8YëûË·iÍI@õ"¾íf­ß²l¸J?¯³^gFíàÂ.€úâ'¬B›îÙ[OÞ®5g^ÛÎÖá_Úœ‚uûs†½{Ÿ×ì¬ÕŸØˆ8¹ÁÇ Y•¡jAüU8Ãj«Ô湦å。‹$Œœ½‹ŠÝDÏÁ†{§° Þ"7rŠð(«/<âÖi¨Úˆ} XlÙˆý/Ïi0³Ñ­Öítí9ÉϺ¡éü“ÅN”’{”¤Â^úúfÎåÏ'ª–j¢ áû§É=(.rU,¥ˆêK&žyëÎqÊ (†Q›æÜJ³š´ ;$5Óþâa÷˜îk›ÝçHËÜø¡ûÉÊæüT49@|¢¢ý¨–+šk—Dܨ9]QÂòÛ­Æ9²ŸUzU/·O°Ò»qHž=ø“™‰5‹¶Ÿ"ÆZ)&÷£e–Ž7ñÞ\où[ÏYp¥šÔ"Ä?¿ÝÓ"_½<3‡–Aµ']Œþ*MíÁ›gÎBôÛöOï†O8ß7R¦ðéË„Ìp·uqÝ­7ÉÚÜJj²$·ŽžE߯{o¯×›~±¶GäD¿ènµ=Ý»`ó-õl2\ÙWT^Ù_ñg-˜ÊÛ´"RõR¯•„Œr“ýTÒÛFNEŸþ, G^á¤Ñü¹ýÜ7;ÈÖâ87-¥ý„pš>V¶KÁaP'¿7v‡O–„=ìbq>ZÜ#ÒœH抿oæ ˆœ[5Îí^·„Ó^ÓhžíAÓð[duìÕßÔÐf<ù^ÿd+÷ï{_ø–úúBØ/c§ôعó™1å‡a$Ÿ#çÏ$L^s§Õï ¨×»s¡­Š›Zð«™ozH)ÞSËŬ ´ÄÁ½K©ëÜŽke5Û±n.îtô:†Þ¢¹z5Ï…’l,‡õ»Ó’ߌ½¼f$ù|R¬»œº.*®Ž­ax< K޼sý=Ì}<Û»A47>íSêb²À¬úTÝq2o9W%ÖÍ˜ÈøüÒgä‰ëŠ(=ÇìvÍbÀ¯ÍwçÔtsáM¯ºlóæqSÐï•vv\˜”mÕ”,rÝ cªWª²oÌ3žP;aÙ!ëì{Xf2ó+F´wé7µöL+­ü}Pw| ÈX(7þn¾ãø]Æì‰Y?ï¦[ÌG,$ÆΉ`înÕ¸3,–°}ˆ×,JóA+%k9%»A/þfv•ùNÓ½±Ï]4¤ø®Z*Ù5çÑ|öØ~xìÔ`Lûº®=öSˆÚi{ðZ2–NuÞèa3I±­Ón2ÁÕ¸˜9óVóí|Ù …Áñ,¬L$õòh)#>¿µÞ÷:ð~ú:`w œß}G5_Í4€÷W^€G€pð”WHYÙ¨×" rvà8âá (o7Ö&áʃ üâ> /hg]u jÙk/:aÛ÷ÈòEü¾.1‰Úk㼨0±S®C䉿„ð%ï‚Ïûzǰ4눽ZêIÓãÌ&·0»¸eoOã.LW‚ *×½#è¸5$ô) jVYÍQ;ñnŠøé™ëXc¹8Œ:›Amæ¶~œiž'’}3sÛaËœqêiD7WMD†¬fÆQê-Ö*?¿×®:ÓÚ#Ñ´\xQ¯¶ÞùÉ«¢7/ebÚìɲRhbÀ¼ùÜ0û›êÀîü: W®1w‡d¼ø”§½åáD™-¦ƒÝøá]CÙšÇ=»ã_F£î ŒKÁo¨¾g²VÛ[ˆtÑK–ùŒâà fóî­røð=êÌÇ_G%ïù»!×pýYsŒmsL6ðH“Ët9œ$ÒU Pä^8wîæz!—Ògzàƒú©kú±Æ¶4pÑÉŒú‡`Dçf[ú­ ¶³¡ÞÎw".É'¨Úhó,{.¬˜¯ÔzhPð¶>®=%7›…f‘€hÌ›¶j€† š#ů%ÅvÚIO˜TZ·î%«,ÿjû[O›/ŸŽ¯éG˜¨¥ìR†–Ý4Ú™ËÂúîo ÕMm JG]›I Å­^<;Æ/¾yœ^âÝ©à&NGÔxÕœ;‡P™z¹8ù6+³1üË—îÞ´ës³m :‹ë;ËMÞ{l'þnL.¬.{‡eÓ^[³¼5vÊù=j·&:%^r\¨‡Žv}˜>ì¡VÏ+Ó‘vºK¿'+´ºF©ü!þ!Ì;p*,!—´q¾+íoç@iŸóôöÈ©/®ç£1gt±s¯ )"ÿU_R‚Œ/¢ëÛ³ãPK6×íÀ­:°mŽõ€2Œè 3|ßçKÆ*~ïþ!Þþ\€¨ìY%ÐbpmšŸ";éÕ!p¯}óÃC.¯0Ÿþ…6"Îk'½=ê“%‚/™ÝF}+×?ïJÔÙyÕÎßÔ²Ó³jcå7.ô «¾’c3wŠ·šŽS~ÕÑÁÕí–gFEÚÃHjÀo£¦×PVStò¢m« våIëN×¥Ãp ­‡þ¼ ó12gNoÿ`E m;OeD–TY±´h±ð÷}É(©^PK¦ûWß5Rë¢^¹Q¿÷!û<Ö¶rnÉOD ù¤\á|Q.‡Šx ðïûÂÂF—ݺÃ¥ ÷3²2¿Ž'HÒ—¶ëMÞ úÓMú±òb½æhŸi+úø+Y¶Š¦-$†á³ÈôÜèÄl†°­××þ¹¯5(tã¿5f5¼ov!LÑsôÉ+±ñ¢Ó‘Š®ó:È÷àÓÏV‘ü{¾Òmu{ý[C B¬$Ècùð!¥=ž‚g~d ž80yÕõ‘ùß°BVP qžYOð>› hð Ù°«r·µÊ»·Q•«\í5Êê­²µ´Ÿ±©¸TRÑVZX"nµÕ§†çõKröyÎ9–t=˜æÌ¦¶¿ããÝL7{q°S˜R.?½K_í±ª£jåÖ¾EäúÈâDmS/QŠÊ?TÄÌ'tfÓãm”33þš“ò¬©Â‚|)&¾§)§®RP2/u0îÇ`€w? áT‡Ú§ÏÜæ@¸‘žát ŒëÕg ¤[t/#ÎLvžŸüeåyÁ(@;_½°¸ú@k‡cê¥j–åãiBÁü…›ë²Ž~hƬ|-w4~™­ßñ´jrP÷V:Ld6YZ ƒn¿®}%FÊrê˜æQí>ÎJ3‡þ[ý}3Ò}}%»™(‘‘³ç+œ&ú‚µWçŒÔ|UOãû†–BoüeÖOÝ…Ç|æÕU¼u¡dÒO\ƒÕ vVB@}7ÂÙçúÈ8¨{©Ç\*>Û·HV6ƒS*V#zÄû½‚®?y“Hƒ$2ã­®fk½XÞ]}5AO{A ¯]÷u¸‰Ð¼8Èô0ä-=D…;”ëg½ï6úé6¾ƒ)P¦CM—ÖóæŸO®]ÍšewD³Ìr÷²ÀUFÓUݽIb#ǘڡF…ƒO˳ŸlËÍf”Ž©*Naƒ¼m9!äuárÑñ1íÚpu=¦Þø?d¤ÕN59} sƒºòŽsÀP+ÏöÕ¸£kZŠÆ±¦…„0G üQùŒnu8ãèç:ZV´ú}ÅëÝg´ü’Ñ~ÿ›¯‡[Ã¥Š~tø4ÓØ.’<¶—%£±9wóæ¦Eõ›¿³0?ùÊFë”s•ap>„¦½õM½ZDvN%gÙæ<.!ú³M¿¤Bž¾ƒ<úû·é§D5Æå#ë`%˜Î´“¹‹ÄºªZc°”Bsº°}îïõ"…]ôé­u±NÙ%÷[eöUY³Ü›„V/4!l߬¦qÅUrsêREv]Î4´f<,ØÔ¡:D ½®ªÛˆ¨-ϻͣI&yAW"dçÂÉœ} ßé ÙxÁ[þPj6Íãâní«ä–ÓXcrÕ¦«ºëVÕµõd”×tíÔô†n¬ËQ¥)»TF´ã·úQüéô–~/#ÁRuç°“z˜ v›)¦EuÛÞ!{0Õý4óZäÐWN¾V|™ÊláLÑÕð8¬ïw’r„c$Àü;ÑòÏžº¯V¾šoBð ÍÎn«çÛF—©ñ“ŒB+uÜ0’vÒäú5~ßÌÓ6•†•Jmä5âŠZV°ÙJÉG/â!ã¶/¥fÈ”Vß^<Ÿ$¨  W´ªÙÚ<–ÿ1ðDSmª*è4VyŸË—d…îèÕ}ªaóÎH-Y&_‹ïÍon¬sƒ=j•\¿qH&ŒÉ!ÔÁô¼Ã&! Å£FŸ'[sc7þnS·zÓýS2(#n[¨w©QÏK0¯¥”ÌÁúÙìÌM«Ò} £Õþ»3Ný¾aV¯$á%ã$“ñ¹š!ŠªWÓ——Góø®!=~ï<Ìߢ·Ú¶Um,·UãÏøÎPòg:^û§µíˆ-cýø>ÀŠcê–èqf»;Ï÷ïZâÝ9™Û‰~h¯B²iµÞ qëà ïû¹˲Ñpƒ‹»nCÅ©ûVÕˆ¨¿}3(ì¢6íŽÙÐ}¥æ" Œ7Ÿ¹BÔ˜øáÍŠRq©GNí¥©¶ó;Z¸2 çE”Å}ËÍܾføôën7qŒ-b›ÝÃ`Ýö{ó|ˆv–/, …!÷.–£ý Öu÷@žÜæŃRo¹W¼R¤·Öó^/²oŒåmÚUê—Ìqy]Óg[߯àY¡v(½r4?Q}Õ[$¡ˆ¼u/¸,Ì(^¶3}GñĨMÁ‹ßtlÃïÖG–ñ`‡z[%'GÀÁüJ9eð»ÊÁÈ‹j²Ž³aÁYGÌ-õ» ¦§-î¤ä^ÍnÔVÊ£Ÿï¼ºª$_2óM¶ÜÉ<#P¶‹£áÞ&Æ=˜¬¦¸,P·´å5¶ËÎL9ÇÇììʾõ¡dMë\X©§Ä~å< rÒúB«yɳ aªñ;o!ºD/vP<4ÓÔ²šlÝ8á$wúº­^®n-ÓR»³í¢áŸ³’2‡XýG*_óIòxö#øùÑbo„=4²àCóŒfsx3 €ÝY­,¹U¥˜˜n°t-!÷é`ƒeqÁ®Ó‹e¹ÓnÒ¡ÇŽ…'ŒmUû›kŸp%³hÞŒþÛÚ ¢ŒÄ£ö‹¿˜'¼s÷¯ZÅß[ ä;¼Mÿ )ØïéDì$dÒ0ìq‘¹ÞŒÏž©ßÞéâôY›3>Kó1Î8Ñ> æÂøL6À]©tˆôè«¤í žÛ¦÷80àþ©äæ›±£ýJ˜1¹ªºáÆ·§£'If֌ȓp‚¿»[¨·K#hò^q±\;v†c¨3²ØÍ¸’÷ÓƒjO¬‹6_õgvÚ˜}˜CÉKõcy_ƒo¹}lm©nbiío¸ FþÈÛê×f :m¹™÷ƒ‘3Ôy§c;N]Œ£CßJÀ›U¢¨·§Œþ!æ€=˰¯¾ÎõÞÙÃ&(§ ̽“ÏP„»eÛV¤¯|‡^Ý wâ±ËXuFóã¸{ÌÀjI¿ÃœM]µ.™qóߤ Øx—m«|²waÜ) wÅgáµ*_, ¹)Âv.Á¨55¬kžšZû}P¯÷3޲äöçls`l{Œl\-I pz† øà¾c’¹lé‘Á]ú“e¡•­ÅZ5Þv‹Y|fPT©_ÖB;’›J(§‡Wç^l\ÌEÝ/'WfeäÝt:‘ 'Õ5—Ù+²Ï†}]ÉkK/区¬MSˆÖÞ4<'zÉÆP=SrT&(ìįԚÈ%(þÞ–5ߟÐÞµïxîEŒ·–œ³û-jž`v\MÏyñ–~{{9§®P®8ó÷¸²y¿¬§ýþ³ Þu,¹¶ÏˆRQëèzŒ;²ð²Ÿ««Wæø}¸ö¶ýîƒÈu¶óó[$ñ“–¥„RÆ’“wŸJ¸êî¹ØÔ˜Ÿºsâ'9ęə0Ý;Ø kñÎÉ+åÝú›ëK£®¡]s×¹úÓiÇÃ…Ï×¥ ¢W¦•™s¶‚ ©âgô͉õr3,*x=ó†*YZX– ™Ó×_ÌñzñÕ”fÇb¦\·ì ÊÝà•›dÑ/}ë¬}^żW™ÏÌûõÃÁÉHœ9rç97?¾ötšHg銲«‚Ûá:n=yÐ{X¸ƒO”¤Ù=ÿÁ_“íbs#C®Ëf;ñÒAìe†dHYÍ+¹ Îâò!ÌI}Þá:ê²ÄùbÍäsdw¸å§—5ÃÒóþ’q8·וí\f#‹PÛëÃi•ÎM'ºÐ5Î@Ê[¨\³¸ü©±E¢”€î¼h@G¬±ý%:X#ð6=„’7æùšûz²=tÉÍ=PÄ]°.?íuº•wáhÙFá–¾89››p¦k‚u[E;9ÙZÂaœÄ.‡©¨:¨ÛYކN}#Ö¹f%¼F)ÜÚµ×+lÿܹáPì…€ø…³±«Ë>!5vGî|¿ ÍdùÇ9^:¦ÑbÏÒÔ`X €­ï†YëÜϦ‡Ûë´"ŸÇ‰NifOŠÍ5aòÐj?î¬Dq;r+Ô[ÞÊœ¼-®ªÁúæ~™µøÜ«Rß+{—áéGéWYo>çܵdô’Æ“OÿNŽóÝEO7µÜJ%±ŠRٟͩý4Ucß˼¯€Aƒ-æ‚`tÁãö¤‰?k'³pim›Ò$påN^é1³p„ͦ2Tí‚>ã=ÿºÁXÆ¿P›Œ,4ƒV<ä|[–ÒM–ÎÇNƒ¹?°ê±ó¢¿FÅmØÖgC™öe[ øoÊ÷å®e®‚ÁÆ ·›„†¹Kjy®™ý"7)§bŸý¾áëÓúfƒãÚšnäv°¯é®\©æ,Ëkû/¿:Êo¦XèXâ®A»"1ƒ½Õ­;Æö¬‹MKV»Ùª‡|ïkiÓOÍ·<§ù£IiÔGÎÈÅ®•›ëˆû|-Uš¿Ö²W‘Ö+§}:EÍnïÒ¶ÎJêBêhŸŽ×NW› #>i»Ú]ÚwQÏïOY¹ˆƒÊïµsâtƒïö7ø-O6ÞÃë˜Üd~Yµ5;Œ[¢B  ’Ü3F¾ýº¬–b9™öZky4gêàå–ÓÈ2g.;„׸Îkû öÃd:Dxz÷;<ø·Ffn ÙVi»yZ•µ‡¶>ÙÕoÁˆ™Ãí*Tkœ´ýKVarzÿÙ-JÍl+*éÅøSn‰ø/µöWÇvGP@ïÏYÙ2“|šdþú*[Ô·íìOœ>(tÉZ¬ú±µÉÆ÷äEúýýÜÎGtèÖ{W¬¡{ÅkFâné÷ß¼¡-™k¦U":°qÿ\|/’aàjõ~çöö'AÕ•×¼W…– ±Ýy–7ö¶DXQŽ]ësâñι¬dõ®ÈAæ/¡Gv+¹–“–ñ´EÚJÃs·öÂÙªíŒr.Þ~›J £>’‘ÑøŠ¯‡ Gížñæbüsõ0åSyÿ0hÄŽÕzsF5r¿iž)GÖ«µjæÇ<= µãT{›|ËŒÆ-vðv¬ÞPûes`ÔI´Ç^õ@†\Ìq­2qïË9½“8ÿÞDõŽþêÏóêæ¨¸êÈçÎþ©eŽÌ*ud¹.zü‡h÷'ƤîÓeñ€èÇgaåçÏ‹èÆøQÁ]Ý4mÊ0!ÂŽ¨Zév–Êû^JaH”z”BËÆ©²oEên-O0cMXÒ>¢‹ÕÍ—^xìF|ä91ê;ŒÖ?sâ·øÝÓé‡G·KçÍÌr«»Ê)ÐFû3^MN?0ËûÅ,ÒÓ&jqË*WMzÈ™+¸bÑ…Õ’²ø‡$‹6zu|®Z›Î›§XãK¼Hôcùyǃ«ž]O´ñÓÒ¤\Ùñ¸)Çr£çÔu.M/ÍÙãG›¡íÈæ3zwù+õy•Gp7ò8ÿ$ .Þ¼ÒLc-¤Zw&; éllZƒóz=ÌŠ ØÞfêN$mB¥{¨hv]ÞŸC|šæ³= ͽ¢¾Wª˜‡ú|¶aVq¶véz½ÊîQwüµªR`,¤×OÅ™g˜žÙ=íE}Z.pŽÜWñ î3Á‰†êÚ}O9Rké£Ë%ÃâŠd}j4F_iJ¥üRÎòÀs)Ù*ÈÇåõ¬Q¬IŸªêpe>Y_:ðFÛFW/Ø…~tu‘mJJf Y Ÿ£h[zŽÕ AÜ”KBc'¾"ípeM_á"›ÒåŸQ¾ú±Ajk¼Àž>f,O⺆Ÿ†‘Eßh9L6ÖoÜÑÕžm ÊL­<©Ì¾*]“°}_»rÌ‚÷e^ÄßÜÌ«jiv±¯#‹–>ñ3R¸E¡b•¹eUžéqÃ(hh >†©.¦YVbVÏB®©GvÕ¼$ÒÜ'° X­ösðØ®ÚN¦·oÉEÛp²-îIiö‚¦¸üUÊŽFHÄj}‹¨õà:#¨5¨é ­ßý¬6d¾”¸ ž#1òT8ò¥cóVÖyå1tó=qª›Ê†™õ™ÔNdn¯×4^n®I´ ó÷³ÐO _´qëKU_ôõ /Zóêª$Û]U¤ŽßÌ'»±Q§z#?>ŠÙs?3Èg¤L…¸ƒ0É+ ¼<<Ò wbÏ$ªd÷µÃsvöǵªÌÈcäïæèå5×ÑÖ á7'³õ^Q>éc]ýðI÷Ôk4Lí"–im d{N¨U«$#ƒ‘$ÜÊÄ<8tT^ú¿¹ù¬–nsçFnþªOø6ò>³iU±VÍ¿ßUB:§õ³ÎFó¼–’ÀVFZcŸEŸßL/ Ö( ZTSþÆE,—ÍÖµw4µcUEc<¹aY9IªÕ±ï –ZÎZC6D ·wIˆjSg¦hû¤OÊõäl,nŸä‹Za¬`@Δ¬nO®ò ú;¿^JU£0,ÚZý ê Æp“oëBÞ·{3…"LÑ*Æ©ýÚ7«£¨iŸ—׋_î–™ae/5Š-’×5]ò‚Ööv¥,úy«,‘íôiÈïÈ6àÀú7¾˜N/#]ní1zëÊ«ýºë‘Ènf×ñ×Z­04«²à A-àæ¹[”1˜ç ƒAn»fAô–ÌȈ”ÌÖ—¸,”%w| %&¡[ºì4Uß}{;ëÚç㯣£ržj_ÇýŒÅ¡jÖÅÜpõͯ3”vé[¨1nø:OlÇ<IGæÊ׳¬ôX«?ôr¹râhí] _#êÜø\ý2d×ןøÑwÈwd<[0±¬TqÛüN:JÈ”÷Så–@}\oGѤ6{¨v{q>´lœ#X¿þ!C¥`܇ã·P’l^ŠÝæÈɾìå»[ü)›áøðh«±TºË¿ÅÍÅ–Ò“ÚáÜxÞ¼üõΚ¡Âú¥#/žl¾`œ÷”iÂ2¹“'vð7CUY ¿,9SÕû¨SPYyÝv{rõÑ7y[DàÓ]ÒßÊ÷ôúÖ&n9l›áTrŒ´ gÛ/Ëç äjð3"MЉê]ºUÑõ[Ú¸ìá.\ïö7é(räv{”ßÁ.ˆ=+¢[=¦À8Nä¹Qp+£Ï‰u¾×+Æ6)=Lºc0íü!:™“â/:çÎ’o¼cÌ{Åhi£ö4¶íoüµàÍý=â¬ÿCdºË„ ë•Þ†”>Û_Yƒ¬Ò7mú41è‚õa3Wçø‡ð?å*g…¨µ7ªLw 9éàêñvÜf úÖcØ¿‘±˜ûp´œ®›dkùîÐ$!o ê®ù¨«.è7÷í;æ<ðiCK)HÓ¥¤Ø<–ÏÄ>¨v"ñu†·Ñ3 ;?mt¿1°–Ë1®<>Hû}Ïÿ TCi¤{_›È4fÜ–SíÔÏ¡œâä—Îå·F5ípÄD¯íêkË›Ãã$ŠWß×!6ñv]ÅèÙòÆ¡Ú|û¢•¸«+uiê÷΄¨Ó%eÐÒýËͱÄÛ˜ü’¬Â4ºùçZ;¯˜‘¿ñsƒß+Í ¶[U.t¶z³6æ#ºLÞ5õMn¹š§é¾”“¡¾©’%ÂÙy§ín¦^b¥¨F 7a;¼{àãG+Kª;i^hZ¿B4Ógê)^Ü"-|VXÒs—4÷%–y “º3h¶Œ·C@|7nè²E˜S ^_c¦«Ž?¡ ‚;°Z¹\ÔK#Û—B,µ.L5Ë}cØžn,é÷Ü„ÀðÍ‚64'òîL1ÐùÊ»dÞLjî_ £~Áh@ŸªwZ_Ú,·°¯zÎ~ )³ã-)çP6¡ [4i0hþCÔY.[ðú\­˜ñïÆ±E•×@µTöÊ •Ö*ŒZÀÊxp:×™`yI °TåÚFÒù Ø\Ž­e²Æ—sîBJ¥š5ºvì¬n|ç¼ÄÒ}c™Ñ+!jŸz ~V‹ÞçŒBîC;DÈŽ[ý. 廼ªÕëñb¯—Ìøl‹f8Ì2þÝ!o¦_y²­ônfæNø-I}ð€Xo¾ýuõ[¦1y¦1‘û)—iÿ]†ÎOÐCãÅïßÔg+ÙZ[›[`~êiô®Z?¿àéZm?³7e.J3~Oò¤¬LÕçÏ·ÏUÇjÕÓO¨Ôu¦¿–Ù@Âû?¤åÛxb«¯¤ð‹_òo·Lf¿ä¬›.4ôç9ü£¬_­½Ó¿ „£ÿvܬê#j‹´Ë¥-Át8ºY|O  ÙΔoCÚ­,ÄÙçïî»õ%×ò¤ÚÙÈR‘à‰˜zöp0U-6sx®Ö<ã³í{£ç/ –‡¹·\ý'ëmîD´¦s(¢ìÍ‚c~Ï?†ØF#®á¶Ûø™|iÝLÉúâ´Áân¿ÁŽb¸6ƒBÁ>k”­±«šL³ÚZEg¶5]߆Gë´Ãô^ësîòUXXón<Á‡ß5a¶ÛÖÂp0·÷#ÖÆ¬KÔ­òw¢NpZÅlŒªŠ!à?¸™!ÁV,ÉŒäbf¤ Ô÷–óyì•§C0P$Å¢” °›„7ªõ¬ê8GJÃÆÚ³è+ÿµr} w½²kábùïž^$ax¦•]–ÐnÎôFÍ[Ð b^¹ìDݵŇw~ ·ZäúÚþôS\¯¶ÈQ‚{ªèŸGkï4ìGÚNÖÈd׿ <Öã,.F!ßÕô(^´ýœGÇ"N¸'£5;(îÒ–‚î=7NŒSk—sŒR§Ð:`ƒ’™È݅ݸþNèÑU5àЗ¢i“ºò¹Žùyª÷u¯49ÙÄuÐ FÌ?ęڑHáÓ' Ôí§jƒ`‘4R^þ›.=kCnöÀõT¾maU–^ëI^…C;lYÏÄê9ßtIw‡#ðÆÌ£a¯unÜZ“ìÅÜÛƒÙYDÞ/[‹Õ ЪgtÓŽÒÈ §x›t\vê‹\­ÞmAÅ.NÕ®Ô(d?\Â}מÛ5FïåÊzQhb}*Ó¼.ƒ¶§Z#ÖÌ ¬”¡äš&:lŒþ!]À§Í ‘Ͱo³5{ë=»ÈT<؉&K¬ªsÖ©1<Ää¶+ø7e~tîX¾Ï¾þž#ƒ—gQ‹|åªÇFF6&¿Ržpôš­e>£jjíüí Úö¹ŠYênðsD0¥Ž%ÂÌ /è×é!*yøøÜ¹¬ãjK±4ƒÞneÊLjŸIz3~Q2Žo¹#žÒòG–s¥jøÈ4†Üá?D¹íߎ!׎z¦ùì ¯ŠÉ§ìhۨfl§;¹¯¬¾¢\û5b¾§"Áóª>°N¨÷Ë”>¹LY¯#ORònEÞË0OnÅé¬ù?í2nØ9ˆ’>$E+Ït¡f¨Á…¦dw FYà¦Þ»k ÛŽtg?_vÞ¥MPŸËf>­kjç[)£˜ÃÊÄôò4dÅ–ÄãíÕ4g5åâȵéI>ÌÃஸQw“âÐ(Š€m5{´µ ™Rœ›C'\çrs‘†?Ï¢bÓ ÊõѨwЯÀj|ŦG¾Ñ6x¹`aÊoápûñ·¾Ç“G—ælðƒAÕx)TÊv·KÁ`Tù–¹_-Âë¡pòNËžE;ãqŠìÑqsù©ƒÛÏb=ˆo×&1F‡Î¶fYê„$·Äò¸–wÍØô=ÏTÿ!½±FTì_Ëï»ÓzáÖîshgÈïÙÛê·|õRMR'¯ ˆ¾ôë‘uhÇXp·ú÷ ODô)Ñ&úÂO‘8ÓwnþÇn-î·¬ò_Ù…®šÖÊzDaØF—;~µ¥N"‘tòó?¿ÎjrÏÉÅå4Žúò‡km’³¢’.±öå4/bþÍõÉ„ï9fþRÿQ•$GEÒÙcÕfæ9͈o7(œâv€wÉeðú©À7ð@.¼‡Mläcº¿Ë®QóˆÚTk¯LGyÎ]–íòÞ ?*/7XÄß‹îŒÛG aˆ'…œ;ÅZ§.¼èÞâññ@âLþ!ØÞŸÝÍÆª£Ø³ô£‹ì]hÝ:%i%=0Ž ½¹Ô#Üm,Èñ¾€5ršó5ø5iñÖ7Û®’mPRDsõ‘öÓ6^¨E#ÞŸÛÿè;·FG¥‹fY1¹@µîiëÔì—Í©Wyºó»µÇ~ÐÓ€¦ gvc›[‰X']Lûñêjßù&áàÖ+ì_G™Ü&8ˆªFß[ÀžÐä~Äß9#ÇÜfê`Ö1Fɨg¡õ³˜ØF•§7úâËõzÑ1>þ׺ÜÝÌKзqëŒÞ9+]¿Ön£Î›u4:¡–¹¥pSb®ÛSœ c¢ÕÍØ ©K†‘6€;£ûöÈé4¥úýq%éÛ ŠPѾͬdQn%ÕîcË“ÜZs-¥w÷WíèaÔw„¶å÷Œ%ß:ûuÑ&¥Ì[:ëGõQ'rÈ’?Ó€@‰ÉãÖ²ûíô9’ÂîT:f*‰Ê¢Ì(ÔuKkoø`d¿µ µ|=a0S:êwŠFQ.³©¨†KW=a4lxi«zÍz¥Ì»kÉËRrÍe]9}VOEùf±»~ºœ¦mZͼ†9×ZªAxoɸcuo¼lSõòi†ÂºÒøÒ·<×V$ñ‘V¼–j®#èãU~¦œíž‘íX>÷ÝÓ½SÓ;ùß„áh¾'&ÉßÒKª"Íš¿^‘ã½mÚ\4½¼µ”Ûp$ ÝMp5o¬€©q§¢zå×üªèbPEGêpý•nÿÍ‚Öq2[ŠZ‡…ê»)ú÷SÝû"µfië'¿‹ì¹&›‰e¼FPvˆmSS~3ë?Ug±í,×4Ú+x."B ÜÝ%JÜÝ…Î{õ?ûëœq:{7ÔªU5'Y‚¯³»Ð| >a;“¨¡•îÒkãLÝÉë†pö»©Ü<.K›Š7*\Œ¸õ¶ú{µIü†ã>ƒWë“sïì‚ÝÕtÜ<¾D‘UÑ Ãˆ®±<[/Ûz^ë Q7„Peªc–¡©BY³·aâ³ÀC•Ããç‰ÝãÀñ[Ì—lµ>õ¦ eHè½ ¹m6S"e¼@Ö’:Í¿1}#º7ÿ•IàÛ‚ûóó²&㢘‹²Äb„ù½ƒGRÅ=÷oãAÂæ ×Gتխ.EßW£ÕŽ­¶»|.!ã¾ñš¨¸8Ùþç$`zäÜ¿K23n 1¬Î3—ÕºôÎæèXK$ðÔôÑAÈlr¢;jÇV ý1η½~ÌèU/ž"Œ®ö"îžAB¸ªsß7È]˜›:ZfFô®fáGòiwÕÌŒÚÕašŒ¢b7ðÙ¥6öÂøFÌY[?ëM‡,ÛEÆ÷/¶!oˆbôÅ¡4»Ø¥Ç=³0võ!äÈFÂÞÍ9žV†Æé½°cn ¨”…FÁÍ©ÒöÏdPíIu­/?@Gðc‘+†TRÑyÜg5ëNòd:iþ\lÙËE# QÎCw…8oUoÃ7„-ª¥ÝoA #Y\¾1Û÷ÕwE°Íh]_™·³zÔÓæ¦ju­Ê† å£Ùù){¿×Ž8 Œ:6|+®Üû=4ÅY£Vkª}Ù ž¢9¼‰z㉩†û‘•ì’u;*ÖèúP¨«èÛ¶Sr~'ø¡Í,ç¾Q÷Úsg®#;y6³ù6 dß8š¸›$ö‘]¹¦½(Õx›GEGïÊ=ëû^ xóyQÝÆÿ~KröÈìrØjìžc}¡½.ŽîF¥ÒÇ}SË ÁËY©ƒªì>Vû޹uz8•”ù¡û^l;ýŒ}ø™ÏA¯Ì+êB.”qz1jAðûÌõÖcÖ4’S§[0ÌwLºF¯=¶x`º/L ë–X4¾ö÷oÃ~>+9Ú¥úI'U#ŠC8"´ÒnX*&6D‘RZèöDäþ¢C%ru¦¾9%&e7h7_š Øù€ß¨]òîd²Tž³×$$Œ0I£÷ÍÐt¾LPyCǧ«ZÓsŽqKÀEõg®š·og޾ݭ€ Ö¦ÓŠJj*(Ó^ÿÍ›ªy˜Uú^t÷Aö—cO e¶yì&Öo±4æY&PwIF€¼¿Z§¨_†?åßÓbCvJß; ù×—É¥:Н¸º•Mîª6ã×Îe=P¸æ,JõA¾~ºÞ£ ·Áé³xŠÓgßSÓxïtj ÜoËV¤FÏöCëôo¿à)%¦µ5ô8ý›QîVÊXÍVĸޞ™Áð»á:LÃnYì$V|[*[=«Ö{ýëÈ繚6š’öÄ»¥ìrtêX<¢œni¶«­ëÔ.¬â®ª±åÚÛ2ñül¾feÚº_Œ« ž{knfk©>æKöNo¬íÑ‚-upÎö d/Û9Öêš0i‹wר­ñ$so™ s—ÙÐ#sãßnÅ×jÂukVýìYù½\¹=³lÚg°÷hwp÷àt)³>‰äµ*Ìx=6.Ð5²8“ø»%³ ´[æö^Ù‹}Áø¨Ü)[÷õÅ'¿†æm§ç°ð`³”ë{òô¯W9xíŽÊDÐ9——Ø^©Ûª…Ø9›¹¶]°µìQ˜OÿØÜ>(Ì»5ëUŸ9¡s·¸FøøâvZEÆ¢7ßMóšªf¼--ö&ô.ÝEŠtnµ)K‹}žÜW‡Y0ïó¤ý°×#XHF°_~]=Ï=äGwvm]ÿ†f“†j}I2#ë¾à{‚9zÞ%êQqÙzkñÛOwi`¼»¡3.œ0P´ .5NTÏ‹àoÇØ飰;æâÅ0Tô‰iNÿxñ†³VH<“ñßɓNjpòN'ÄÔå/³3º6q×FJ9F®ŽÔžðî© —Ó*mtV÷gD.ýî2M³NÑ\ß<ôõ!h»¹;øÞÔßý¥@ºHkO·>ýßSÈ76ºÂQwÙÅjÁÿlklçÆÜí]‰±îr°Mè"×ÒYŠ,áàœ¢ÖÊ¡/ÔÜ^¾Ö–Å£I⤮Ðéþa7ZÊÒyµ1=Z¦}Ÿôþöñ\ÓFó,pNêèç5oUÓoˆHϱÁhmŸ‰W¬÷nZÙÙó³–C&ÚïÇí¦Û0¶3guÚŽ‰AH|\“¬F®íËkhôJA÷Ô,Y™¹Ý^–ÿVÛ~¾Gßîå-B6kí«W”øƒÓ`í”Öƒ†'egÛÐ1ôF}OúÞwÂ\§^7š¹¡­Šª]üBƒúIplj¡íŽL'Ã;ÀÈýꀟõ \õ}mSŸº¥àB‹ìçyýÔº[æ·¼¶öÄ2޵‰íXïºû•ë~´Ž°»ó°ƒaÈÒPDƒ;öØ8Â? —ìû]©jµI×=FãÙ.RA‹ˆY.*ô´KN’Iû%Zß“s?ÿ!G'uÏÚóš=&Ä—wKUwf]:¶•óÂGpä2‚Š™lóÌËpú9›OtïËRSåÍ_-&K›jj|á/zÃßþ‹ aäl«m:M?›à€£ûÓ—ùžðŠi«®ˆZuŸŸý·Ùê°×Úþ`Tœ1æ÷ëe¨cþú¹çKá~žVáÅ¡E8ó×Ãa£È±õÓêC²ûÞ}¶aY5žãñ‰•?éñn·ãæ°ªx›øáaÊv»Âvú¨æI¾pŸl…£HòðÀ±póšÐ0üýö`ìww‡¢?Ó§°?ÍwûïVe öwuäìvÑQap°}j.zî"ÞQÈK1ÇÞ 9"^m× ¬pžFã­ÿr¥uý­à±)†×¬ÃºœZǘœúdÁarø¹úsð:Íü=¸š»sà8„:Û×Ó[+q¥˜• »Ô“©zN¸W¡ë-$í ~8`¢ƒ<Ýí:ò9†Ô’]¹ÞX"ãÎýEP/»‡+÷3aZ ÅϛŠ‘ƒW‰u¥…Ëi4ZÝ"z zÅèkÒöž…#Ƈ°ûlGb¼ FëM"ôµnOžÕM,ÜíìJEøm#ò†ÌžóçS{5>p˜¶‰­G5ãá`d…'øú6ú6`ìjþ±~(hÜk“Ö½ŒŸ=<Â’„}-ýytãО±Ó‘)+Ì9èo¶ö°ë7ëž>þaˆ ‘¦kg«½7á÷7æTaøì˜B½] Ylwà¶Q-š‰ûwÚ|øi²Zkmed9þžî¶á}ž:½Û{ê·c`à¥sn×ß~Ø¢j'ñö s;ë@¿ÀÔwkš>“ºCž9ÞßÔB»øªï<&߯‰£38h¹;ë'3ÞLU^`ßqµt·ä îs6ÀMÜHþQ§Ä«Ùظ3/|êÊHõ×ÝXšyK{°ÐÍç룠ð^o,v¹õÃ'¸ïÒŸú «~òn׆ìƒÑàƒÝŒé !uèÍäA\êmOF]º(ÊtUáCfµýU·ŒqÔ¨>¼Úø-·f&œùóM}éPCšƒþÖ˵åßY7ÛR[ïj':%ªˆwBÄ¢±Zœ£ö&EÄžê51ÑxIŠ7~Mì/šAYYWŠâC·ÀQ˼—^º×Y]’.@0“ÎûG’úa¦2ëá†.¼(<3þ’q‚{hÒ=J˜G¬î ;V-ü)BÁ,×AտǤRÊÙwÚüP~i‰]uý‘ ¦ „e}Z*r·‡v*èЯ®Ì£×†¥ƒUô—Ö!9oªÏÒ®l|¥`öªi§¡E%¼Rj2ѹÜà=ŽN±Æ{Û4_å‡B]ÃMYøÙ›utŠý®¿¬9þÄŽ@æuŒÝϼÆaêâ-ñËžƒÆxd—ö¥|ï¹'%Q#ÄD#ÇùB =&ýFþ7å]˜;ïS…6^³°ïìM ¨2­ÚÓ-÷h™Å{VY8ŒÙ†ß©¥í¾o¶îP O XVÛûÎßÙ4*B +/(O·QNœ›âŠå~áïæá§?ó *RÁÈkÁÄ"Cœm(?ïN~2æ°ªÔ‡>Øï¬‹™3}Jæær{ãÛ­ÿB÷[oŽÕÂ÷绉Ý}O” Üì§Ö,7‘dðêeÇ`‰± åyD^øy ïù¹=Ó9zÀ …œd\‰<øÜ³«Á™"¢ÅH+²*J)öÛÁŽíY¡^Ýù7ºŸ+ÄåoåÇ –å½+Õ°}K&¦ÖÛ¶ˆsÄ&‚íÃSº¯ä{¢ß3ãø”\‘.bד¥5>x(á¢ÔJKéÏYzx(N¿ºäù‰Â><êɈd—ƒwñ½õ:F³̰ý>´¼qYʋʿ7y›Û½ç=‡´OjöD´?É&,ÇýSJÓÜÑܺx/×mÔ„zÝ`üU)y„Q‹Ù#££Óó¡ÊXõ÷È‘!H ½žA0Ò¹w¤{¡ÕþbæC ådä…|•)HA­-©Ýî_ò~Š®-f½AsæHüÒ0“Ò²¯ùÀ%GÎæ6"ÍÉÆ$ª§¼SRžw‰×»‡ ª»ïÅCçH¹ˆØ§;¡ÍP .V…)PdÆö—iË‚ W>]ïÈ$z|âgÒ­7>;. ÆÉت<(‰â“ÿ®,œsšFs2tˆ…2Ïì5{³ljå Ãl7ô¬Viñ·>yS¥êa}kpÖÁYŠ÷[í¬ú‚hCDƒ¶`‹‰‚1éçän2öç…6mq%k±ã¢7ÙMˆÜ¸|všˆÂ ›ÛÃó„uá®@0Þ•{£ X7= uºˆ(ƒÐÝwPÉÚHØ|J³@ â=ÏôjQÀZ#Þ”yL‚Gë»F“ÐÝ7z+_ítƒÿDÝûÖ ‡1¿ ÷hÿ0{<XDúÿ€dy&:у-áB[½|íú”†‡s6”)ò« yÒeƒ%RÚhZ>òY^ú½°ñ¶ J®ôs6:uµáýÆQñÎß~ÕS²k¼È‡¾z9<…¸ü­W†Ål¡›8 Ù=62¹/¢À«Úôµy}Ê0?¾—ð[bÙoìž8oþÚZqF+ÝIIÍ0LX÷íØÝ1”O3‚ršã°RËH ýæ×~¡¤Å»êásRõƒçU–^— ©G_ú¦öù¾¨Z‚s3ÅíqB'ê…0š™Þ°Í{»„°'¤jÓõÏ]~l^~¼Ÿèß§¶ºB ª%[T ™Æ2Ö ¾½O‰Œ3 ±÷37¥ác¼iYÙþ:Ü'ê÷†ÇéOëBSY>gÁ[Æ“®þYôÖê%ji?L©ÉWš«ç4‘f u®Ö«4?oÁ¤3®Í‹ˆ‰gIT£-ŠïŠL6R¥ºùÍÍ$m.­ú׺yü.FöL ãxË/¸3Î,ú {=§Ýag£:½×öñ÷£ìžr«áܨûRñOHSÑûú_¯T΀^+µÆÔíˆÊ®-/«æ;û¶Áß-ÝKà3RŒð›6¾µ -iERuãzœ;>ì3•>Z^½ CïP½î °Ïp±P/œ«6ÿƒöÿ€ôž¬ÈÈþîFÂïo5x‘á9Ô¸\~1õ^° ®º&8ù”šÀ‹¡¿Oô¦é®f"Ê‚ç©Á•Çü%´éV?é_Y<~ãаEsƒƒƒ]äXRòÏ|-«ýÂAü"ô¡ëxgcn‚êQ—ìò½(fž­&½Ïl ø„œ9W?y¥ùzì¥òpÓ¢â{g{V-œ < ®‡›-14‘Õûˆ·Œÿ;{ðÑtûк"½šˆóþõkdàbTÉ“¢à¶0¿•_Èõ¯­­©¿‹!Ò¹=š sP¤¦«¶_l9a*KÝÔËήï{á¡JÂ'2lrî¹Q™pºÀR# ¨¤sžVª¦í*eûq8þ<;gW•fÁwPÀéHËÇÆW»\KÝì\ÃB##BwŽÐ“·ùÚâ¾e'õyÛ ÚM¥b\œBªÇñ "p&š7•Ø /ÛÜ. «^jÆÚwU*Ia <¬\(××çeuº†tʵäeã÷Wî~í±K{KÙ¿->î›¶ª>)´¹¹Чtñ[GW‰Æ…ÝÒ§¹“7«º™)ˆÒæ÷ ìzÖ-Þ?F‡®½ñV¡1“Oè®f­ð&QxUOûK U;iQ¸v»ÑÐÑjGºy-OéÚˆ•-/ÁÃg¥îQ{”’:ýá ¸ù/$>úY‘Ø~E#ÐÑ#xK‹ayÍ:{²âïŠ PaÐî,Ú€_ë!+ûR_L"ž ôÅWÒ­ž¾-nyêÆå1¸*h¼úæ q|™åáüºzê>EàŒ^^¶Mîûðxzìú•Ѧ$Zr·æQ2˜¤SÆqóêÕ‰gIãÞܪ_”4Yr¸'"bœ5L ßm$ŸÉEGæP7´ì‡ò¾ÝÜCt³:zM2ûKç!åP9³›‡| ´©©nãÖtš¿ù´pùk P+p¥æ¬ -9çe‹]¯ll.SÝí$ùW!óþÜÜ<™‚ùUpýêj¤ø„­ 93AÍ>Üâös`oaÒª¹²FŸ–\xº±ù{«¯Ùýi(E6>yÒO™‰Ì …ž!Fn’ë¾æ’|ìB+;Ô æwèz†.õhã Z‚¡]~¹ì˜ËvÇD÷ÁÀbª$çòËjÿ²–Ù»>4û(}›vu›ÔNŒî†ãaã Õ¡Ø_AÑÀæIMÔŽ]àbPt¿¨cö-Ä[óºê´Ý‹ŽN³só]¶êdåíÀNÎõ/ÅÐvèƒî49oTó1ÙÛëtëUªÏ¦–wTTþ‰ Ò«Få‹1d#>O¢ÌŸ´¢~« X¬“#}¯ùþ%Ît`˜>ÒæŽAÈýru~Ø|ôü˜Ð*ér»1à—öé÷" f’œ·›ŽùuòZ±ÕðbÁå÷¨äEµ6£X ãdKÃG#îþn•ÕàV¹/÷çö>& ¿!¡»'qŸ>`UûŽ«aa „f;ꔽ=oà©nÖ»J.‡+]WXô@M[,+ïÜ?H¿McEøgbyYþÝe³UÏ®EM®M-Òê[GA—‹u^Wq½þ¥ÎººK¥UV1ñXÞ]HGÔJ²7Ú.¯;î­Y>¡”¢˜æìñÓ¼Õ©³vÕ!1“NµÈÞ{[ûûBÂ,`µ¥ ©CŠþ‡+äÒÐ}´v^Fâá§É€7µN6uOòÁ‚ mSsJ'µÔí 7º¦™çÆ×†´r.QO0Jd¶²Ÿm—£Ü—Ëšc]Š»êÞ¥3plGG‘ö€úfàLˆ¼b »“l~·'U™í¯ÉíĺuFé‡BïºeQÆÙ¾V>k|Ø‘=å߄۸<×»Œ6.Mc“p¸ñ:ÖkáFå¢åÏ ¸ü`©=Á«u`»9E>¬ª£<`Õ©ÑeúÓ¾‹JðÞ ŽwÔ©Lg iü6Æì~bTlRÇ\}ÌídZaÕÛÖM,øbWY¹èbx Žîf›¬œpfn={^Å|õÁì'…ô(~àk¹±öŽ(öxÕoïªUn.†!Þ…ïtm'ß+(=?^BóSêKv¿!Âá}j:ÿýØ\ö•½5ø†tÕ¼˜•ËZdó4 4íˆ[^Ÿ8‚~bÖ\§õadÈ«1º7Û¦˜v‘O àk6UØ€ù(÷¸Éú}k:Õ#ÒÙ‡Øßl¿²HÙu4ñÑNƒûƒÒqntô°¿ó‚n6ñžñ”ÇWQ‘>ðë}ÖbÀøÓW1føå[¹Û6Æ}Ò Š‰îãT¸õc­kkôAôJ`cTäØúPòôÀ¿‚ ðïÉô¨æh­áqïq›Üq~l`Hªxñ÷\G:“aÁ˸«{?;›éhª«çò.Åٌɯ½,tÃÛ'eÚO%5Á”*Hé‚Þm…í1–£¼=O|CUpdç7'9.#‡^½+”Vƒ +gÚ?©¼?U@3xNon‹ê}ÉT¿ ­C—ãÜLæž§dS‡m3O”‡ñÅÍ¿óa*ÓÍÏ>¶¥¥4¸VVÖéx9¸»£¯Ö¶GÊ=qžŽÄ´™Cüu"©Ëºõ@‚‡úPtÃ{M°^ç!¯zÒI·ÙNdçÈ×_‰é<èMÅAKËèo­µk.}“ÖΛ™‰€&îlO*î•jD†W.1Þ`ˆ–¬½ÅGÅäš×{ÛZsÝG†gåÓ)|Tmw8øäɱr1ð=_‚²÷èÏ¡ÿ÷.µÄP™mFÑrhmoƒÛßðJP2MÛ߬Û$ñi·}ÓÌiÇRíQìnÙ;[Ÿ¿“êAË@¿ã(º/mËŸƒ“ø}˜Ø×kÖÙç}Z¿OÿNj}¤OÔ^.¥À åwvÏ9×ì T®îAo'×;áHÙjòåýäÅ‘îa»–=ØÁ`±RZa%–e $³{YÛ>0 ¶3&!4·Dùç?_½‚Æ5j®¤yéä}rƒ sTÖÝË9 ùí‡êØÜP{ŽQÀ¿q‡9VkÖ-“_‚™ß»Ü÷`‰BÛN©<ßù×MËJw¼Q·7 äÏ©©Ì2{7Ö}óli×Ðÿ…Ó¶);÷ƒ_àÉV^{Ê6/LÓG‘íPýsZGg¦ê׎«P€‰UËpåá½gè¡óÕnó´é•¼ãõˆcUï1µe‡¹x¿Q;ËIçï~ä¦Òó´f6“®-¥ižÅóŒM8fn¯dk­e±í©0 ã‡Kx·7pRöLMa§ ½Þ|óP=6ÞÚñ¡Ôqo¸ÝîYrš¥ïÚ}¾+è? ³èæo§ßºÍ½’$Ö°2%m]l<’|Ö@ÃQE÷ø, .×Ý÷%¯"Bîz—]_|¾˜ÞçY‹øºº½Mèá‹K‘®¯ìÔw÷ ´€£Çkà5r¬ q¯íÀSÒ3ÀŸ½J¾[ßwÛEj´æ¾ÛOF.~¿í:]~'ø5otw N°Ò«~ñÖà äî–ç:y¹ä™‡9Ýõk$Ñ“f=´]ðâÜEwÇØÝ¬]äXß\¾Üªoíðì5ýÍ–·‹V7^À]Ùú¥ü¶sŸ'|+û4ÕèŸ`ÄïSsÉ5JÍ¥4£ +.õÚɲ»*Ôìiøœ÷dÝšm "O´àòu ‚m)r<·MââÞŠ¦…a˜>e+ÊÒhû¸Rt}¸¨}l•„G¶¬·u­ÔÐ…§†—58øYƒ>÷ JàZ•K-¨¬„ሬIgJV)p¦_Œ~˜%܉ñ¯e ¶y 6˜@N®s´(q¯øÆ[ÓIÊ9ÁF´ÃiGB[ÝuÎù4C”©í¦93VØF–‡¶…¯Yâ³¾öïîë ³{^täFnÉ>¿ÆP©»M c²úÈa}‡³¬è/ls±’Ž[-ÇÄkfÖ©?"üƒÅõKÇ;‰yõ©pê´ž§kÉÕœÝ7XôdŠ?fœo×oï4à†½Íÿî¯õíu[Üûs^·é/YrBôbøè Ó¡ÂÞ%WîÄUï aK‰ìšugÎ}:A«±»°õ·Øu«;ºì¦ê‘ز½ƒ+tŠßMä!µ·î¼ü·gÄ[vl¼±<1Í?¾F$Ÿê–7xY=?é¼XJx¢¼ç5Ê¿Öø‰m4J瞦i7ºŽjÐé~kyòZx®[߉yûT Üðô]>’™WZÛýÕ¹hwýjÒˆMiÊûVÛöÒݬ‚|ó{ÓËëë«'_ÖWo ¶KY¯çöi;†HÎBz{9ò ×îòfŸ:Ig–Ãèý»Éµ¬öêFö(šþÀî† ÌCã¸.—”JL–Hµêú~îH³PVWÚô‘¸cò Ç¥%lŠÖ”Ëó©·3ÿNÂ[8lA§kçJ÷”nÒ× õU ¼p®ûH’gsHNzãšv¦Žç¸„J%ô.’€‘·Ÿ×P“ðÌVζ@˜ ú•~ªf;õ÷©(‰Ó›ì¨OíV0ÝŽ b4}8NSM%#/õ*¼¿8…‹Ùåè}.`¡óiYßóÁyåKÂq¢ÉâÜp`øƒÆtõ»%m4 ÍÅò< ïnÈ¢×à‘ÙàKѾŒB3_8ƒyõå[<æ•Þú`ž¶ô.æ`¤YäØÂ\kÖŒÜ\"ðî’xã{ÚÙý^"{üÞ‚oÊÌu²‡Øó3áZã¯Öt'».øüÌ|еsêDÒë“ưŽ[¶‡aÓ_ÌÐ-Ü]`ù ÿÖZ/§„õ§;£Wk¿\íôyp{m¸áumD~MïPé’.»3õ „ÆüòÄ+øûãî;TtNÃÏíýêU²…ïãJý×:lN¹b䦽ÙWWÉ߯ ps®nÓ;Iñí=î¤ÄÙ=EoŠÄx“6ðõŠ7„:wHñü´bzKÈ® )W¸¾6’Ä_ËxûG¿1]‘Na[ÛªïïW$åQ×^ŸQá•ô;ÙºZá…b¹kd5Ù¶­èìx¶°í¤¼ÿ¶¥÷ñyïý¶º„©dý5T²ð$PõD¢núâZàxe²-4)›È„cï:|—”ܱÉ/Y‡Ä{‚ ©MÊL¢;ä@¥>£‡¡ôÇQawðŽŽœa”½4òMãŒlÔ“à˜ç|Í ¹ë4zš‡¹1ùM5~û(‡æJFs›ŒgruÅpZÆÃ|Z}PËøWŽŸ:û·ÃËU×å主¢¥Ýqˆ%ñßÖýéÁÞ^Ÿ§W¡_C$eøç÷nojÞªÒx]œ›d'<=d;nÝ¥”¨ÀWÝ@T‘°³Ggí¯%Ô¬#È#î3];b-¯3ýÌ-¢ß™¥Ži„ôã0¤KðìªZR F±û嵆*(íÔyåg·Y{(]j•@ß@¸·¾d7$}oËýîäúÔŸhb;ÅtÏ/)™ÆvîYš9XÂïÇca/Æ»ý?@hÓ\¶{oôxßiÝ »¤·!án?†ZV*vf/Tù·>N¹Æ› ɾxº©œ^íÉy"»(ÔŽl”¥»8f䦣N¿ð(´ò‘Óu§Ù—××SG?ÌÝfÜ]ÅŸµIgª‚ ÷õ#³ìFŒû-•ŒAáãÞÛïIо.>J‚æû¼ì/™¨¨üÒMqv—É#Ÿ9Cj¡fƒn»—¼3øY{°ÉEZÝábÈK,;V]+š†½î×5aã šTªüša+Þ¸JhõóNø‚ Ùì1Fï [Hl³Ò/;9K—6øÖS­3’ü¨Ò8<®µ'ÍO¬2_Sbû¥ÛKv¸ïà#M¨î’v7˜ÕÔŽ•àü$"?'„;A•—V-WæV;­oÄÁ¸ëóî±ð1Ù}<Åš•¾fÿTŽÉ›îðºs‰Ëö‰zl`H|ªvµžåÓn3qOyo O]úu˜}—*X²ÛúZ˜÷›èþùcY5ç5ÆV[¿eµ[úæïìBhº”`º^É£vp0]ƒkÜg÷S÷êö*Öˆ5ZÁðh´o—™IUÁªýêóBö|¦pt6m‰êê4v½¥¨»5JÞ»-å;Ì ê3©¡yÕ¨žî0I)«Y½š@åùÂ&Àûç@íãÃgQ7Àëiµš«“8&×ec´áÖ-}Û …öM!b‡K{ÜŽ8½É£KRo^–Nxpß]VþN:Côë&ùãà#;HÚ*9ù—ªìU(Š¿Ý¹ûª›üdÈ{·âúËSj0ƒãT“›{î_—öäc¾wË*~(/κõ£Õþ´}Ö_&.7‰æ^}gêý:æAc øEÒð÷)…šk°ÅÀÚ(*{îÝ™põt<´'to®OÑ@å&*çõ2Æ–¡þÖZ ¶Ø„¼Ù*¶×ÂÑUrk³³xF_ªØxGiëžKç:ãéå<žýÛ[£¾¿jÇøŒŽ=kÑg4;¾¯6qg·©3GW2Y{Â7W¹ÞKãóù0ØÊíªçÏÍË¿†9^«c`cFÛánz‚†ë à|6Ãtcú޵¤±™«½¾Zká¤DKðÕºbÒTç¥jFÍ–½ß²3óô(Ô‡}¼ÐPœq’a­ætB3Á^õ'ãóÆQ&_ʉפ¯ÆÁ]àŠ²á:Ïïúg´²ƒ]rµ¤“X¯(‰ ¥.ÍÜwk÷¹þC3>WâîbË*Æe ¨°x°Ÿ˜|‡œ&iµe¨,áé·cÕÄÆß:~¼§T{oý¾Ó@Nû°à´ºTêÞç*ó{ÉA©}¥÷¾•ØÏpõôo©è–¸›áçÓãÏ÷YdÚ±‚jp…ö*£y“ XMŒÁû=Š>‚·—øy)†*†»>=Q'ÁĤˆÃñsd¬=A»ŸÛÁ÷SÈ~âðÅVC±ÉWõ=hi¼sÿ(Óâ²Ñ]Ù2ðî²íÒý®DÊLtÌSãÝ~ñÜóo…~ê®`b.)˜·ÁRÐ2fyÿ¬gÔ/”Æ^:6OTö&2(¿]¼²¨wd¡’é6Ýÿ»ñÓŽÃ72üFU‹V²×8 ‚e[Y¬”#83 ª3ä'~h¨·åãgvUïÁì¡÷P?œïs»ñ}=Û‡š&›¯„ÉSS.ý³—¥¾€4G?¹Ú5lÿÐN·²Q}© ^Æø^VÍá÷ÐïÔßúÑ"dme;)XA²|»³?Ý’æÚõRÕœÌ.ªñ‡¨¦‰P¡’VÉ4?s¤c´Îr±é’aý*ƒ¦U¾…½¶@N9-u;u ¤ŽB͆Õuu —”é;Ûjôz>·§Ùí«u7ÜŽ_1Ï!ä­e„«Ù‡¼ìYÀÙeËŠ5S ™ìŸ¼ëÎzgç{²h³9@¦îzx.¨O-3•t8{÷Ö†½by ÓôPÁ}îwc“l´Ýö™b0•Êö ×!\‰ï~òbY—#T=·>ÿéKu5ÆË/zôÒ÷RH×—<Ÿ’Yy½-r¬¾ JSd–to®æ¤“áíÌXáGSj¤,w±º‡±UT5§¯½n=š5&v°o‡Ü¦îë«žÍØ÷*ÄØIËÛj)í8(rì¶ê‚ ˜W§(;ÎÌgrKßܤRî³ ÀhÓcºÝåĹd1itx`$÷¶£²ñLBA¨‡œ ÖÍ…U=³gkG7Šw!¸“"ٴ×Πrá8›:ƒ'Ǻ¬ôÖ0ì6¶2Ý Ô*жòG¶ôî˜fZjµ)fu>;Õ÷äk×NO Ó/êÚ¹´ž³”ö%pTéuÝåaô÷[Òš-ÿd(p:nuw§ ÁT¶m^w.}»Åæe!• $7»nÒâi;=§møI÷ñ&G®ì·Šøt½½_î ®^}õzð×'îÜ»iL:dFUúo}r¶ŸÍ,CV L ·¹Ö$Ýa'Ÿ¸j¦–§Ú¾hŽÏP:vÑipU³@÷SEc>; Ðú3I.ZyLú¾~ÞÙ{ÜÀ'ܯ{÷þtâ6¬Û¤È±±&¹<é~?Ñ|­œµÄìö¾øíCPëT£ñH ÆØ×çd¿v¸m¬±‡êìŠkõ*§¹>*c÷}®=ÅþÃ$É«o‹„D-úfßʪm™ì¹•ë§ýSІ. ºŽ·_Bh;q«VGùþ]â‰òëÀ/dM¥.Ô [\""™ªŒ±‹›@\™Ü eDwÙ·íæ»G©i5·ŸåÁKö¯u½“¿¿Žœ­öÔobÉø@šZ†NÔ+Ÿiw<Ù˜+»­t¶½GlNÏÝ5K,ô訦½ï¼ÿÈX–~õ•¾ÚÎRÛ"è„«}ÚøÉúÞA[fó@z; µØ2L9ïÇYGIp;µ—òrOJù6eÝti·'Y n„€>›–ð·Y¬Ñ´°›Räõ|מåÖÙi¡³½[–G”ÏiÅ…Uÿïšú-•®f5³¿×‚-¡ß0e³|wÌ盲¡ç÷NR§šç\gÚÊA¦TXè`èšæeîr€rº»¿öŽ5ò_ä ¨”–½Ú¦ó¶ÈŠ?¢n:t,žR Ñ¡Íä ÙîWÌ•×lŽ5ÇN@®·ìGŒÉƒ;[%)ùhÿuýîÌÒª°–}÷üÁ/YæÙÞ’ðL}8jÓö`FµP¢Ç×½}ý:¯‘®ÿ@©§“ž»¹Êá*.¤Ry‘ÒLB¹º¹wÎ[—Þô½WÐã¬y3+Ö*Ð}¸Ðž¯Ã83ÍV¾ PvÅæ¥ò:² ‹Hd:à^“9,žH·ñ‹(ŽŽz%ûÇ ¬7p¤Ùv=c~ìÌý­Ôº·8Æ ì-ØÇüéE)sNL-”˜c~¶‰òŽS§ÆxïÀ¾«÷[˜^Æ»†ã‰¼/¦åÔkáß÷±–¿ñ¥æ¸%tS§§V™,ò= 7ç^O[S×;ÌßBÍž1ÀòÈ;µ_Ígª•1”í='­}«ë޳õÁܽ6ØA–ÎQ×¥ÃßÙ6kmo7ßMßu,`'³ƒúƒ²õ軥EkJ^Ç›S‘¢½«Të8図î4@wS{ÒèVçn4ßr›o~mO®Î·ú;ùÒ 3ÂÿN5Ÿ8瀉 ÜjŽ}×W—G"‚ÙÌ=•æª{°«Ös8t=]À¶V#¬¼÷¼ýëä9½HÉUr`¼4>¶ånch5ól.U\Î=\ÿñú”<íÐѼÒfsàÄßåz'M“킪œ+%QÀ¬m Ït[.wlEˆ±NT5Þ9T¤5­Oœ–Ç'¨9-Á&ø¾÷†¿ý´MF\¯’¢ïGç|ù&Üô+B¹&†·cBKÛZGG)ø<ÔÞdiìeQ âˆìïØÍª¿ü¹ÿ*àÐv‚뼨jò GûìÖnÔ²^Y,NÁf´mÂuâæ^9Ô{Ó R}¶Zuæ÷i´F´¤RQEáµ ªŸ{‰n^>‘q‚Øm_9þ tݪ/zšï“Øy‹ÄѶ¤WRƒ„e0ÊÎ%8Þõ¸þ²åù¡nÁZië;‰v#o'úg}™[Ùg²O;íð›}m)Gï ·p§ñh8·Ò§íÍ&óF+ÜÓ'w7¿×¼mP¨c½Vd²Ó¶À•_Âü;¾ÝDœ3•zÞ Èª¸.Á^ú^NÎàf¬¯Ýý¦"xÁϘ-Xݺ³ƒ‘{Éë“ón½ánW]ÃëÍ8¶ ù™{i‰§™Ê©0qÚ2Ú^ý`!ž¸dÛ­ i’^gø_&ª—þß™ÞÌÿJ_mã–J­zù¿ÿþûÿþÿŠp¡Ëûœ®tƒ“]½ÓQ yFǺ=ÔÊ•ØÁ[ÕjC…å« ¬í~ÀÃÚ>{0æ%¢ØÞÒXHÔ¾•9)¯÷N¦,Ô»Þerk:lè1Ù?€;´Á“мý*¢Ö;Ò”›èò¯öTz®lµÄ ¾ú¬#&txJENm"{Anéå<Æçâ}´Vþš[G|ßÛËöd×Zp—½n"Àa•:Çßñlž™h6¸¤x=¿µügöxXrSy.wò.¯w«ïŒ^E[@iô‰à¿PR•ªäÊýøvªñÎJöè>©!s[Ûož÷¿È–Æî 6kkƒlUž?¹5¹.˜¡­>4'Ë¿æð B¦ç¢=ä/ÔBÛ>~]|Ædµ3>w„wRû 5Ë$ø$â¼õ» Q“ ·>¸*}Κ™¬]ï¹koˆÎ©ðÝi}úDzãæ úU€¹qšµ'æëëά¹(BÔx/DViå+­ÏËC´…Ådú¢ó¾ž¿K€éÂÇrB0EœúéSR£sïóÈŠ`Û+ÑøÞn”nG²ÔúÜwZJ>¬N.>¸gýÅ.~ÍH7{Kõûúÿmgº¦(²5Ü+ð"pžçyV™AA@P&Qôþ¿0Oõ×}úT×›ÙUõgÁä“.ö†˜š»Þ3?Åô½8þê(‚+Õwâø«£ƒ¾ÇÏF1ª@—FTæŸÜü?gnüZ¬«‹8mC=¹óS%?"cêMEm-Içø(­#ùù¬C’ŒîSµ‘OŠë–ʉgšoœÑê¿ècÿ´é³¢ŸÐŒA?-ú ÍôÓ¢ŸÐüAÄ>+ú Íô›ÿƒ}ù…‰ÿÐü×ûR<Á™ÿ÷&þ_gÿëñŒA¿9ñßß—_øŸ;^¾Ïô›ÿoöå_Æ3ýæÄÿϾü–Äÿúìÿ£f ú͉ÿâ¾üLŽÝâïŠ/}¾³bVt©µ´·~5¢JÙn€ì ®Á+™|^7P9kÝÜVý|4¶½4Ná'¬E+yô‚c|#Ü«™þÌi5Á{ÅvÈñLÇa cË Ë|[ùbÐ?nú>D£² ú§½‚¼Û€ª?¯3ÊÚm­]Rª9ÖÏ» ƒôò½«£»oNû*˜çV¸'²Çû®»?¹l2{1(};5/%þKÄ ÜD/õo¢ûÂõ6ë/ß ³¶¯_kfb½º3#T¶Ú%e—ÕÄÒªeî ÌôøÖmè±/dqaÒcV»øÚ§àp÷«U:WOÚ*ÉÖÊ×Û¾GÞÊ9eò>ª[ƒCgªWè*˹-"Ý´',MçÛ­•Í=´Ðb“|áD縥LVÃomRÜ?"ýxû?âÑXëöÝÛÃb~æ–O»86ì~¢½P»h¸8F]ý=ÙÞó»°Õ>îzóê…=0ŒÁ¤¯O•*žê"A@{»M2ÌÏ }¯5ªL ú€€(:uÂÞF}5K¤¯¦h4Ïù“Ú–gØs¸w_¼ Å*ËEó”ÌÅ®ÎÕ‘J瓪DnGÅ=îñ4ûžçÞÎÓ¿@óZÿ¦)O/1( ÷µ0ÏȾgVImKâÅ­tva.¹QZ¡X©¡ˆljºShÍËJT©Šî ç’äpzI3·éÑ?Æ{_þÏ?ú¢ Ô£Jb£j3îó®[Q ÎÅv-.+ùfŠ^“:—è’3FAš[pNÎðMŽ>Õ;ê\¼‹äöó!§Y¼=à(¬7’? °/ÿÝU˜;EËTT=IÇ`vN endstream endobj 22 0 obj<>stream (¦ÌšÊxWp«Ðƒ“J‰YøÍ½^&6Ô¾R’ v¤Õ“w„;Zr¸ßMÒXX?€Jo?>,~!¢Ê%Q¡ì£áQv%7àZÙn òárN)»ø&éÒÆ°–¥ÐŽCâIuFÖæ2BÖª:I4 Kgf ùŽõ¼¶ÚÛÏ }ö/?UÙzTË0‹«ùlµu‡sçr^_òü`¨ïè3;4Hbw­#[Áo¾³kj "ÆÏºó­Xw&Û‘gÎP¹DOQh1œ j¶7û5ˆA®GÕQ¡È/*w†upWüìbß{Å1¦¸½QD0‰T,âÖ>6$áôöÀŽ+èq•¬!ZûPCrئ¶1jóú¦Wë°™Ì4`ôo~ ý¹þÓ¸³ñðiB–)«qJ ¬[Ÿ±ëYa ®/í4M`cXPµ92Ñl¥sß mùcÙÙsíŽë¯uƒ‹ÇW~7J®hÇM®Ú«Sjæ%賈}ú/­ø®½Öz—”&zÅq†[†Õ>ôñ9&•W[4 ÜÆì.T¸Þ¶õU £—å+^–}çaÅ …ØpœÅH:8‹Äté¾uçS~ãýBÄ ¸¼³Ù¨<Ð᨜{žï¤%>‚Äþ”vÑ–Z±:¶98Cë>!LŸÕ0¼¯ª$ݱf‘Ž\°ôä‡ê9òà°u%q—wrSº¦¬ðNçì-},~?Ö5òÏŠ~ŸÚ—ŸŽg úiÑOíËoNü¯Êþ'4cÐoNü§öå×Ädÿ÷&þCóýßšø_ýÏÆ\÷oâÿ¯}ù…R ú͉ÿÐ|gÿ·&þç²ÿ¥xÆ ßœøì˯>ƒÆ ßœøÍô›ÿ¯³ÿWÑF¸“¡ í¹=¨XÝò­ž>óëÓ%¿f4Ìž¾¿I$¾¥0J-<îFüMÞ;I_:LV׃ìºîº071K,ã¼¥¼‰ô·†o¢K{•ëOýN¥ä0W| ú|–-VN÷Îòn¸Ò ŽDkx9ªTna)lªûký.Å›4ÙÁ!-¸˜« ÑûS0ùÎ\Åý5ø«æ0¡ß¯ûƒ‚ñ,‚®Åe¡lÝFƒÞù˜Ú,uõ)Í> ²zµ%[a7}f_ò]FeÂÝEíY} ¥ŠáX³2¯¼áü#@õúÃí¥2@ô¿‚€(} ÑÌM¾V¶[Þ»Œ_ÆR7Z%òTÙG²V—ãv RnK÷qäC<)›^ê )¡úÉ•_ÌA(Þé9DÛ?ƒôçzT¶ùì¢ í~=@ô–O^7åiɦ9µw9h饱ÂöôɼmÍ­<ÕoJ‰c”‡2ÒÎ¥Åâ4žà›Î9bG°z§3Aå ê—snãþüU“€€¦Á ¦bÐÕÈ’í·î]3ÎΖç̹Èègµ¥ëeþòT;£0%§TB,úƒ'OÝ7Vä!—ÒGi›°Ú¨µWÞñQü?ÿèßDñ+è¡û¬ö¨7 *Γ^~x.;W³k>k øÉOþœ›c®FMà𘈧Â$ž+—pO,¼ÛÇI‹VÍ剰ñác«–†±ý¶ûÓ•ø{DYÐCqDT+¨úª܆ÙmÂ[Eñ’s-K=ëîIˆy@ªG½Âç£Xi\ëVÂڻ圻»™“+›Ä³: I §àˆß ‹=ú¼0à<ö±øiD廸Žçûˆw Êw:Ám¯hIïĵK1ÈÅGÕ} hì’Y„¢ÚÝÒAÏfe¡ê×O|›¢/Üpè^˜´¨$ê;v+†,úJLYt<›î?°/ÿ÷ýUôQ>>œÙ:¸E“GÂ_ˆûÒ½9#§ÓŸÑ'7.“òl)0¦uy¾ý¤en¥´Ħ µFçn¢D8ˆ±Ã¸dD£¯I£ÉnŸù5xß)ÝyxôÐJ¥)G•€ñÂݰfnùZ¥ÇÃKv-”ao¾Ñ‹òÅ–â„yF`'gåÈdê5ù=Ê( Hc1 }‘‰&Y„þÀû7ÿXÿ—ˆ* âɃþY™uQu¤¸÷«ÇýÜ}–·ž‚Ñ÷ÉÍ!Ü9taȆ¹âFhˆ1 ‚°Lï ïQÆYuw¸w7¬×n“èËu 4ya>÷¾üh{T)«@T @<åÑ>ªº¾yK6žÃpAdTvdá˜rüžܸ•š0 i½¡×ƒ2IÇÏUâ. DÐbñ6nÐXo³"·ñlG'k÷!ªtôìÇ7‰ÏUTmbܽúáu«_ŽgØ8ºÊ«ýŒ—£ÜaÑ(3¹üºG]ÙUn[›ëá’8ûh…ÂÂ¥In£É–Ø•!Žžù¿D쿾„¨2Õ3Q…-Ì£j¤¾Ö¶Q3 ¤Í,ëPéôÌ]ܘùà*fhX–t²A¸å!AeÄ%4Ñ v¯T6Ûg΄·£ £Òn²FS×ÒQ¨üæKˆAÿ¸)ª0v„²Ù•òÈz®œ†6]â`õ*ÒN<ßeA ‹l`Ï8~;Ê%¼+Pml€Ûñà1@eZ¢EŒÞ¿Œ‘í 7ú83ܬƒh´)°þ/BT9™‡!5p¶l\ìçÉs¥ªtY&p~hZ4ºÑQÂ&lÉ`+%Æ)ô¨å ˆF¥mË›¢Þ+Ãæ¸Z+lTY;·ºÆsm]_Iõ¿áý{ÎÿÛú DU2õôsVÖ2*&çÈzûÙàŸwmÅ”<%zù ³•MAB—‰¸‡A Cèƒ[ÐûÚ¥ºuÃÌ=WLÚ{®Ú{ãµ ‡§Ä’ó…ä²Çì ETÆþbßm½=Õ©|†á vT¼óuÿXkŒ™PÆÄ½8Xo•\ƒ@6#f¿©5uM)º±êçå “6âг#ß° äàÌeˆvßã–*áÍ¡ÁÊ›)¯‰ÿkp>ÍŠr8á6ÿ*kô ɕ = :?fÈ9ìma²ÂЫÞÎfsÌÎBŽŸ§ý›0ÓGšåÔƒ45´ À)SøE«Ó"½Ñ&f{¥1è7ý#À}Ýô•^T?*p%ÍCnÈ諸?•ȼ[ž³ «S7§giœAõS~ǃÙ|•U­Ú.˜*QÕmÅ+Ì,¥½¬c08ZGÆ c§´ºÊánJ\ºKÃKxûbÐß¾.ú ÍôÓ¢ŸÐŒA?-ú Íÿ‰Ø×E?¡ ²ÿ{ÿ?ûò[ÿ¡ƒ~sâ?4cÐoNü³ÿ3ñŒA¿9ñÝ—ß—øMð)¿7ñšàºÿ{ÿùìÿt&g‰*!úi(pš•+ÈZuS3ÕFÄ“ ºæ1°=óÈæö¶|/My‡5<¹÷lÜ“ÇÜÁŠÊpqýÍчæ0*y 9Ì:a°`_¾²ª[[î类=37).ŸïºœpöçÝÕþ1bзÿ!Ê‚x¾l º*Øa€ñÏ áø@Ô€êv«°_F! ÙYÄœ„ñ|õÏjÃ*\•v~_+»ã¶í‰#‰Ù¸'% îCX·ïWƒáËνÏ?PÀ/ß&ÑrÊDÁº·R—gLGÙkqÙoØÔ‰_ă *ô›þKôÊEe­fÞ)ú DÍvöj BÝi” cóqa‘ó)rFN4ÕŽê¥3¡Ò±šwi:L¾—<œñöÕüôºk]í€φIÏC•†^måg4ßÇ{||“Q§y¹S‡ç#8´æY/Ÿ÷á-ÆVOx¢—‰&òÆ©ŒúƃoªÇ¶Cy<Ò¯âZÙZûêcgraÿb²ñLסÓ*g‘F»¤‘F)¯| ý¹þ%ü) ©;•ËÝkÔžÁK§³ÞJÈ7ÆVh­· û‰b_¼@ÛÝõdèMé-Cï U`{oSÕó®ƒÔt6~ƒõ÷ówrãѱ]Ä5¢š ÕÏ"}¯õtÿ|÷†Íè6ì9ïÔ›4]ŒÍOm¶‘!­Át¨Õ0îk¤U¿ÊR‰´ÅR¼xá[hxbÅÅô1záÖ5²< Nø5E¸˜?:«xƒt Q™_ƒþ9AÿÄŸì{„¤2:?êÚèqÛ[¬Ÿ¹qÍkùÄÍ:á±V”XÆ&c]•»àÙRæÙ¹ì Ëѹa~§ÒZ’•IqdœšÌ5¬›;ÛléÛ0pO"ý­á¢ Ï8xO§£Jw¤?ˆ.ö¸EH=ë+¯dË+¶[+·É‚wYpN>èÔ<&Ó+C,ÏìÓn×Z)ÌÑîKT1š‰¸·ä„-ÿŒÐ1ëjè¸]ÐqÚ5¾„÷èè5üUTKQtqz8ÁéöóËL #|ÇÛ,ƒÓQ›ãlLŽJ”•ƒZ tZ2?e$ú”«IÓ1nÒfÞcJMAÒÄ”ßh IÛhCÿò3ˆÊ*òø¦ùÈRQEF@‹ªdt¿w¸DÎ×:zÓm¶ï‹‹J¼H­]IiÕHÑ{Š`9NLnwÌ¢#ì©s;!é‹Åzí…N ¤µ)µY5q“óéoˆAßkýGÑ5ˆçR€c(KDÕ£<\1å¿ ,q­¨¢•LV†'ª·˜É¶1Û{¨¼×‘"Pf!Iu>Қ뻉ŒÛ¨='ÐÃ)Ä‘ùlGlV+’v_Çû×½þXÊ6DqˆÎÊÛ¨ºV¤{G>› Ý}ÏפNÔ¢æqjj ¡A^ÚÜ¡F˜\\YPˆWFHŒ»’D31&°wðm´¡ TÊ–°÷(\ÂÇ7§ô „USèŸÁ7MUïE•K‰ª‘Ï3©#Æ ûÞ NFÅrÊø>K ×R!ÍB®HC©MUêµ1qÝ^–D“dìžÎm¶ÂáoãÖjƒ¦ôüÉÈÖf³NŸ¶þ=€ˆýÓ¦¿!ª@äÀnGÕÑzòÝê’E1ÌÉQT¤Utq›ö8ÉSCzã(i’”«Dk«vcÞm¢cl®L· ú0A§ÖûW­õêt£'¢é¦Ð=Ï`„Òê_"},¢J™¢râ=1Tz›Û:ë/b¤ŽÒ¡(ºëÖi—œ•OtÕl‚©ÇŸxo.ç±abYÛŽµ\ MOŽm$W›´70\joŠÉTF»Vwmï•~ Z×|rÀ Qeº»^YËß’õKÖ„î³—¡Òè€O| ÚMÜ3OWÄ¢ˆßùŒŽ%2˜·MÉ㢽¼ôưè,lêÃ<\M–Šk¢×uÇ*­èü®´jIdeÉÓ%{_ü3bз ªH’gü(´žÃÁAã‚ÕKªäãL[ºê$¾GVÜvÆ)GDGGö1®Õà`Ý,Öï1hÅt_eHѲwæž‹aâ B‹¡ºN-âƒiz~xõ ï³¥.Ìð-ôÚדüØöº´íKü™)"Û̦D!¥#ÂD<«¬nYJ[ò\ÝX<Ý´¹ÇMs.Oö|zçœ9„oÝ™š›_g câϲ“¨Å¦zªü ¼"Ùšé5©Ù– &ó/D2Y*ý:Þ.!œ-‘r­„¯}bM/÷O‘^L¶n>%ù™Æxâ,gScÉIÓMŽ>N‹‡21'+õ=‚yš áê<©`=ãLjA?ÞîÈç1½ÎÕ÷ƒ3%2æˆpˆ}M…¶ÚhÐF*m¶fÁg-Gva5_ñլЬl¦ÈôN,ÞÄ&Õ׈Ac—æÈ1Ù¦éqÃÚ0[vä/æÜˆÉÎù7ö?PÂAý’±¬D¥ »kWåažá-4Ÿ²§eɈ=˯?—½8ÁãÊÚéË;©œ`:«ihOÖU{´<«˜\¿¨µJÚT«´£¸ËÇUq믛BœÓOPñµ±Ãý_âCôš FþYÑOØü`_>+ú ÍôÓ¢ŸÐ|gÿ·&þÿŠØ¯Iü‡f ú͉ÿÁ¾üÂÄh‚ìÿÞÄh~û¿3ñÿ:û_g ú͉ÿþ¾Då\Áz³·(…F%ïzŒÊùBx»'{)‚Ö%éÉË_¾æ—ýuŽ“h§¯ L>é²®¡ÛËYµ×ðEÅ.-ó­iÅ Åå®Bæ<_!¼Çû£¸P’Uÿ_⯚4‹¼ç[ß#$ÃÚ-ìP«¤?•„’{IÞ;v³Òš_"Œ@Ï©^ŠÓWSF:¦®U¶öEÅGKJ¶b*$nZJ㥹G²÷txŒ¤øÌ÷D¥Šþÿ÷èè5üÀ, ïÁÕ¨tà‘÷4F9* d³\Ò—‡néZ8”Û6yYNÍ~Û@Ï“[ÔûúJ’¤S)×?i•cDIÔT(èeý×Á>2Ú;¶-ú!ÅQ×NÓ¦µ?/îÆ—ðýc˜•AD½w5Dä=‘”xû޲ýC"H¸©âLÛö•'&O"gIÜ0úiN;iÕRÁRë$n)Íûã=ιrh½[ŠÄv oQ¼¾sKí_⯚žŒ¼§1MgêÇ 0°œD0ÞöJWýδœz/˜XÝô½$0ƒ1ÛÞátFκ¶5F@ÔícðHºò>’ðÞEÅ9…¼%²ç]³ZW¹Î(yüÞ££ÿÛú=üUô¥nÞóEPÑO¯÷Ö4 ÉMÉË1VÛq&ý©Åúö"J-ÎPᣠ²_X7 «#¦B ¼-Œ£u˜ÁqKÌ:Âu™N.Èu¶ÏGæÙ9J_G úXÑè¡/ôЗ ¿çŠ ¢_Q$-¢à­šùŽ[Íífv;ÛÄ./MåÏ3{¬éð|oªÍIÓ…tN?Ìûm]€Dçíðiì(X}ÿš÷9¨LßHôô5?üKü¡ WÀ!¥~Ì¢JeíÞéx7ƒ‚—®=ÍtÜ­Îlr&Íh¼>œçŒmhN¡­ùŒ­ú Y9òÄR8®«ì@¨ŸéÙ`¥PËIC¢r©’ð=Ä Üô'¢ò f~­¿gXkÙ}Té"ÎÝ#àÄmØ¿ýÌ–ë\ˉÍÊ!µkõñ¼jäyJS[¶ ú˜œpY,ôÛ"O6:{Ž»²"sØ¿ô¼¬©¤Ñn«dq‰„™ …‰ñä?EÕÕ{"#UPÒ~Ôlâ¶¿×K¾B§û×Kõ;ÔÌáÌ„‘WNؤ"s8,÷EaÂwOÝ9FšWvÔ©³ß“c.Õ~Iõ>1:p¢yþ%þª9ÐWïiŒ@“e¬G£"ÆÃžO•Aö§<>¼¢‹lß¶-þ¼Ü*¢ÖœßDy¢txÁܘ܎Ýc4›YšÒã&MX^ÅÉEJÀ:Ÿ†µYEÂÚ³Ýþƒ~¼è•/ s¢•÷Œà%èœ ż[L$ÂÝþZ [¸FÁVT…yÝlNy¥l¹Ãºyex?»¡bû’F$ëµpÂV  vqjË9'ö; ´ø/äšæÇwIoQÜ¢ÝUÊ%ªêDÈg e?‡Û=·aC3uI3§FbdYkÐö`I.2«8“Yfq²ZH¢Øbèk}&™†±›åywܨÌ{¶-2=“ҿćè7MÞžƒ®9b£êÈ2$ÕŽnãá3{µò‰ö{|ŒŸ"Æ%·'”hÂã‡MÉÂyV`,D„(iÝtï@7dǪ2—OløS.•amªÒ †UìøcÄ ÜDk ñuˆÚÁìýˆ<U…P ùŠïù¹û%á°P¶~Y®‹c-XïVò¢y[ j½áÆWoC¡L\{:úØŽ¿mPiÑ€‘ «À›<Á`p AèõÖ+·.©ÿ ÙÍÍ7·TÓ¨Z ÉIFr0“HÃm–p£ñxåNÔÍm¡°ÛÈÙã&Ø­Ooâþ˜¬—Sœ-ÀË­ài tº.‘l"ZoòŽÃHCÁá’ñk¬l3ÌÇâëéîƒÄ/©2ÈyvUI û’¹nòÞœÍäËÉÓ£äqžÃó1H &LŽ›¶_Eº4ôë„·Évpö$޶O'7F§ávü`œlÖr8ƒ‘½´X[>³^×:»-€Eï±¾ÿmÊꈪ|!ªµîÃu­µ¿*VÖ¸€oõFV;•òù.xüãÁÍò…ei~’ l{œøÚö®´Ð­u\vØA›Â-ރъÕ_ãyr°ºN×ãUS]Ì—Á`±ú—½rtùÏ|à*¹nÅ ›¸/·ì;®éÎŽØ(P!u|¶{áæéŅ»_™º<´MUZß&]n²“2ŒÞRS-ÿ3ËrEIXsܧíew0ê/î^gðôçúg•ïS z¾ÆÍõ"ﺭòÃØ¦ÚEe:¶߈©ý1ÚÖçâ0÷þ-´öŒ²¤Âóuç“x¦Yi¿¨Åû-ìÆÔ‹oêÖ¶¼ÚwÃÖ"­ö»³"'w'Na<_Éá¸U÷&#vsœŽº¥ãbxWöË!¿àÖÃþs³<ÅåÔ>å.¬¯¨©Õüìþ%Ä Åψ~B3ý´è'4Á™ÿgE?¡ù-b?#ú Íô›ÿm_~sâ?4ßÙÿ­‰ÿÐŒA¿9ñŸÊþ_DK©ÁèÑÀøC´”õ'ühžd IÔæÎšÛ<Ð<ïvš1HWà@¢—ãé”aÕÓŠDO§ÕšµÞ¢å­ø` ƒ¯ãCóýIâ•ÚË1pT©¨ä=‡%eè±ñ'w¬zÍÏíží8­…Õ² ü2àìyœ?í hÙõü”O§­¬œV.¥kçÄØÐŒv´Ílék›.ÿþ.ÉO½nrÞ¸_GT‚ñÝ7ÍÉÄÓPÉ÷üUýaù…GØoÒ¾ÄH F¾®KPש¢Ë¹Õ.™èe`6ès2â HJzv|?žÖ=^ÕΣ™®m.cK+uWÕtfw¥1Mߥ¨5¹&šoý#bÐ?nŠJ˃tçâ0õT<* §¨¼ê?BæºO‰†_¾žŒNÇÁšâÜ¢ý4zÙÃsêœ$"AWÕ…tÒ[wPWž Uþ¤!ÍåEµº-GÝj­›âÆë‘Ü£VÞ\ñMauïë_Ç7Mº’xgŸFÁ¡ôÒñ÷ÄPP@í§÷0Àœt0rK”¿]ÇŠ‚™åïè%ªí©ó¤Zt €è{Ìþ’áuÕ’»¦º}T®juÕŠdîº €¡d y¾¬Ç Þ‚mõëˆJ¢¸ÿ]ÿ˜Æˆ¿§…‚rÔY‡÷”„q;){Ëò©óžk­”§vsÆ¢f/ôÈóá6ßiI‘Oº×¡SÅкyôiÍ‘Ãw;LËòjÙà±–ªîÈ9.ÿ1è{­ÿ_4 DÑÁ{#ÕšJTI“·;%uÓÁ«È•=5ÈtÝ‹ÇÌì+•@Í{cÉ\âº&™¼/kèí*+Ô,ýãS+U¢Ó!å(¦°.÷M¾z£TÎwÇG6 Òâ×ñMóÐJcï̵¶ïù–2¨–IÿNù³ôm ;emû×¢Íúìn÷¾3Ô$·Ó¬ÁˆWÚ‰/è­p˜N‚ 7úÒQ*__ ®3ÊÉl¹‰Œp7÷1ècñ%D%]¾‰zT”õ÷í{¾¥Uf;ïî­(èö°»Uÿx4ûW#Ø,cí…gür^Y½àöÅ7Fâ}HŸBF(k,/T~×¼Á®ã.Ö§ZÎ{¢W»O ý­á¯¢/¶ÿžˆ‚PN(«xb¤ÃBÕ|¥”î»K/íö=Cš:#4œñ‰cŸD±Ã"5Á…RÁùº¥ƒ{~®ËU(æ•÷vLrdjYjì©lØæI}×ྎ?4ëÉ÷Ý÷ì@ô=BÒŠQår¾>œ[6}‹¾ê”t×­±ÆÂ|Ö㘾1r[å6ÀPIžUÔ­¾q†6*vQf’×0JL(Òh÷x=ù;B b?ƒþ\ÿ¢Òõº©ÑM½'‚wß/âD¢ ŠˆQ5á:¥nñ;Uò »zÇ¡¸ôòqä&iîö¸>Kµµ¨{ÚŠ¿Î˜%×ï³ &µwÖÔÊ^! 0œ|ó.góX…Ëôçú_Eë|çýâHäÙGÕfäÜ™^"LU6­ô-›ëµ–<*/ÔÎhµŽÑu.T”Õl׎fÌôÖšR…)1'jÅh>…Bu×ÅH4"vûm ¹-·gدãÍVœ“øöûµ‘+q’Ï ¢òV¸ÓÂÈ_.ŬK`jÛŠçoÓ“S¾Nb%?Ï(:æÛã̈‡Ïï#¢öªŽ±Ž+ÌP1Ý_!Ós Û¨åõ™vFg쟵Ø7ü#¢Òózø&º[ k–WQµ í¢êµgÝÄ¡ó6¹ äøv³}> æ}­õ¢†’zP1hmÔÜ(}îÓ+QîÄôÐúf4@“³Ñh³”sÞ=‘5jÔ8®÷ùÍBô±ˆÊYp—Pò ñ¼Ú³6ªk‹½É”Ì$×½VÏPÂzŠÏ†nYñ¶2Ä*Ñ\¬»»{xë0 ×%k=¸ƒõ^«6š"ϽM~Õy?¿úœÅ !Þ7KÚ*°+¢=ÖèaÄhvA¾K‚dÐ9¯÷X‹QUØõoãáhì6SÐü’.ívÓ.²¶™zõz„ÜŒØ=)<ÓŽãý”ÜNäYYMŽyØ„«¥5þ°ÀÍòž·¨NÛ‹û«®È‹A»3™?Cl3w õuÃ÷×ÅïÖÕD!B‰Õ¯æU,^T§Ø=µÇ4¸¾È§:vh­ræ2é“MÕ·]ï{ o ’7¼8leç©5Á¥2«v^È-¹)YZìëÍòüµy–šyrÑÍŽÙéâ{ˆAÿ¸é࢞—ÉãƒPŽ’Áì D¦Œèá‰{íc¶¬àÃ.y.›Ì©Æ˜U°×r¢¡*¹³6—FÂû˜t Žÿ˜{Ï·4Ÿ‹hŠÅC~‘š¼Nfž*r³£R(Í2ÙB}ª‰åÎ×BY–Þ×Jÿl‡w$tìÝߟ<”GÙ)ÖØ¿á²ú„¢šƒÄw´=š;IâÕ:úšÂÄóªskYËþÞs#æàÍ%uÌS¯a8[´«Ñ,ÖâÓu-›ŠAÓ¼žÍN"Tü:ÀáÓ¢ª›Q¯Õ…êDàŽ ©ýØHms¹Ý~Nµ: pÝÇÍ Žæ•*³©Î˜ýê¦èÂr_œI‹ñþuœË¾§ÏT•ÖgÙ×ê2Õé¹=-„=wrÁÞ¤¬g‚±=Î<ÆØ-õúGÄ ÜUó$å/üÌ(k»ÆqAŸv—Y?€ã¤@µÎH;føZ0øšñÕnZÀ“ÛŸÏ…5[175Ô#¸·œ_´81é­4©„óãØÁ†ê˜È¶OãºÞ»Œ¼qÛÑÉöõë¸D¶§[%惔äQ¬ǬÓ6p¬¾°c¯ E-7„½±Z »å¢ôÅl}¬¦›„'n cרccrÂ}Œ„Ò#¦¿bGíë†ÔîŠmaØ3{ ²Dó†òuèf5°”¸?p„`XépË›IRt>®àI®ï!æRƒ`º6¯.C¡ƒæ«\¡35«Tg‚_ºƒ1Å?†£À3Ç£né0Þ­Ãÿ ݾGB·È@lÍÑ÷X&6Hl‡D_®é#}¯õø 9I¬¹% 8nÚ–x’½ÓÀq¦Â-÷q]NâípfÀ»hâõø˜î¼Ò#nàä‡ûÉ¡4x)\upXpARß¶À§áM§?/nzý´¹lG=m>÷V™ù¬—†ó¯#*θIT앨˜Ù¾çZÃÁ<*•Xp»ß¶­Çv!¿n7!žó_ƒi݃¢ËÀ]?º3§\ÒÖ– ·«±M&Mœé ×YЗ®:Úõ¦pæ¦|æ£ÓyОšçA‰ôÄszõþ’Kx_ÂßD?¡ jäŸý„×ÿìË×E?¡ƒ~Zôšï’ßšøïGìW'þC3ýæÄÿϾ|×U`»ÏGx yPN®@tgÆÃv&DñuÍKW¯®Ì¶zkŠÔô»q ã;êÂMîüÀûû3ÿª@ö›ÂÑx¥Êºñ û6êéV9Њ+Öù¢"z˜FÅmWÐrÀñ¤õÝÇøXpyX$W3þËÆª^z{ï¹0Šщ[$5ÜšL%$.œ¿cÎûtw¼ ‚ñÚd†&4cŒeMc¼èøÀ0{SÍê½ÅíòôçúYmö=EÅ£D7øü=j ÊQš¢œg‚!"U¼y)ÛuဟÛöùýN{‹¼®¶f§Q—Þ™aÏ{µÏ/#{0Æ·»b$ç÷³‘ì—ÁÕ_l>Tsˆ{GºfšÒã8Ñ?‹ô±ø&ÊÁÚíUQħïçä騜Ï(ôE.ˆÒͶ»iŠSÛÉ7Õß—{:$Ï‘D²çø ¶7&­à`$¹ëI?f+Çl¨mÒêíè펴߶õC*~V¿„¨(›à|\Q)•šj j‘hßã–`1zÜ›}'Dnµâ)õEË5\{ìT´lQ; ¿Üç)ê,0$gH9óTò*ëóŒªëiÒ¾jFW •”¾J{®wgEVüTþ1èo ßÃ_EÛ•"%?y?~NFe¢yŠÊ{äq'ïéÌ­Ïm*>Ú×ü.;vªxmÑ)‹A—û±DÏ ÔD=ÓåS>ëªIÔ-…è¤=éq›˜âÑW´ý9W–x«u?| ïkåÅ[DE=ƒC¼D_ü”$O"*k}5*;dx¿J³ìU_.”:דÇLkt][Þ¹ˆ_½ ¡«Ë¥Ý%£VmgwôÛ[QæÄêQŠ’}qÎ0À±^;òÕ£*î.¾ÿþªIJ çâèý2öž¿ªD•Š®ÈúÏÞ¹\ÍŸ­ç÷BïÆ6y¹®.ÃëÖWd£Uz8ª4ÕãVî/R¸—w”¨4¦¼p*ŽûÒ!qܹ[ñÀ1ëٞݡ¹Ý߃¾×ú'¢bðX‚cˆºÑnäüý¸´–ÅßCQµnw:N¥‚õ*y9¹×tœÒn`Þ}nd3ù©¶5 ;ÞÛBz†¥õb‘°¦ï辜I¾–äyÎ?ÁvÇæxFP=Žá_ćæ;û¢‡Aáý\w¤;»*3RŽ*²ï‡7 O©ä--u{5›Þ)ƒój Oˆ)LI¯×f,jr²¿Á|w¥Æ+Žy¼vç?(F°=>ÑÒkÏÒІf(µ´¡¾„¨”L®€&oŒó kªý¨’®¡Q…Ýrô÷nQyÅ ?ÃÝ2.ÖÝT­žÎtœîtUj9íÉ‚œî2Xª¿7µÚpG=ÇCö‘ö¦Ì¸³]Ò³Ü|K-K–Ô š„k  ý]Ä ÜôÑR’}O­ŸåßóûïiŒHT¹(‡G£ë:·8Þ¹y…ê-å}õ2í•§ívÓ8>ŠÏ¦áZK('pŸ¼óÛj‡Ý³.}œÎTŽ&dqÊ:"q'R¸ø@ø5ü©ù¾V¾f9P/Û]óþ&ª&¬Ã~œ/Át9 ®h6´YâP6ôø¥¢ú£jMGbM,¦†U¾I”«lt×i¥ÁµHpaïÕª0Ä…£jÓ߇¡fþÂ]]§6K‚kå@Út‹J:Úe\ÚãÏL™ã7A™ÐW…<Û*NÎ…Ö6Dk]TÈC4ŽÔ`D‚Fº—Ö8úð±F ú^ë_Eëp&ª@w zAÖQ•Êìo‚/(žîa¶ãgÅø%} !íêµr²ä!Y±¤åò;ŽUò̱Æç©bãXõ>Õ²Š[¾0ª¡‰Á½µQÂË>]/KxMgñÍ"WÆÞù¢R«¸P-p áéo­¨ZØ­ä8Ã2²¯æA1í݉Œ ÇÄ•ÇÜLJY«“Þ7'Fš•†ë4eÜÆÜ㇙í>³Ë!3þY„u‹¯­Qí®ð-(÷ëÕ;±.swpƒ mhû%D¥qŽJ°mƒcˆJ½ç[6¢êú´¸wX÷µÎiç6K‘nNÝBp"› PïS ø)8Íkœ{^7IZ‡Ê ‚\'“[¡I"syš†7´[9Wª²¤·Ëö‚#ÑÉ•£q±yܺ¹Áá¼Ê…<·GîŒ6/Fd}|~`ƒ²ýD‘÷‚ËDôäUs¡g»#Zš '¼=“.ìd6EïÛ™4ÏÒó½ü$¾„¨DßO#•¨R–^àð™–c&Ùò6ƒB×zêåŹȰ¼ÆFœ./M[ RŽÇ¥îeŸªJ†Eá†hñW/ZµÎ‹äb ?3óäüRžjµ=Í¡×ÉĨv0p3¹¦ ÷ý~þÅg•Ä%úŸÖäüˆª'2ÌègƾWÕ0¬Œµ^ åU©/ -Ú”¹tþý& ªµ L,åMäô¨9p­ûËPsÂ…PÞ<ç“C-5›c‰ÜTÓÕi¾XèN s:p‰±y²öŸ@ ús=*])ì=ƒÕˆªñÈï³|è’ɾ{† -©õ¸ÉPÎoš›}˜{\&}æ©F’=`ã×\Fà ¦ÂõÒå¼ê˜k!ø÷=Àx›)t\Ŧ§”˜æÅDv‚$¡ò¤Ä•[c«··‘ Q9+Q¥³V@¯l[žÕ—\½ î`µ&åB®ßÙ‡NqΞØ%}ìÖòvàvÃÖ}W]Wâ)©óãe¶GÐTo÷üÉ%›ºM1ó[Á39®õ¹‘ëª#’ìw>ƒþ\ÿ1¢2v§@(á&â Ú„,o®q­È¾“ÚóÝzÕÇà_|Æf‰1 X‚úØr¯SÌbR­ðó´äfKû Lac«OÌÔÜœTú=gŒSUo\/VÃ5ÏD£fTN ¡“ÿ,bÐdz¼}+ik¦H·¤……üBº,,mÏ _'’+clæÊK`¸ÉºèRPè\Ù法ÿ ¦Û`&æ‹ÛMªà>yL`iäéï_–Ñã†>j'ÛæðƵÝa×­ƒÙ~| QµÑŸ^f¶ûÐü'†‹õ~p¾+lQxùà†+7!,-,+È6÷¬oãÞl9žN§óeQÏ ä`9±Ë¯õØ}7ãf›ÞŽl…:Ù9=ÜÛì°Ÿìí×> „^ï8º½Ó ¾nŸÿD ú[Ã÷`&ð©­Ñ(~‘³jÝ?É¿އÉ•B–oHÅà 5×Ê——I ©Ï øÞšV¸3©£õ>8*[Ë×hÔh“!¿ãfÃA^Dx¾Œ‹+d8N¶}¹7$úÓhHõ!rÈõÔæDøÀñÒªEé4Jûžûˆ€cow[,½¿îãÀXwƒãu1OEÁ¬h"Ñ„hVãÖý–>‡Üp˜Ú—‡]$õMã=ÚîÏ‹Û~OÛ·½Uu>ŽA½Üi8íëᢻIôÖÝ¢Ì,û ¯{ îõZÁeĆ—šµz×ôË»«ÔaáÙ ì[=Ô¾p%Ü.»)Ú. yÞ²›%ÙÂ.Àû·ŸÌk…»ƒÏ–l}–™ŸET(…·(ö/+*nÍRTJ-AARâwQ1”AŒ•Ë3ô2pÏÜñ>ë@T÷\íu›8ÆŽ˜;EqÛè1¿µ+™8iÙBœ³ðB\´jrF3¯Ý† ·wã¹;_OËjâ¢ãüé{gËï´F…å¹VómTpsvT4_•÷¸í"*MäqpP7§‚è^?öÒ·n‡)ù#3hxPî»§úhZÜÒ6áöÆ®lSànÜ ‹²êq‹7¯ˆ%™&ùèç~hù'•+X*ŠÀúñú|?‹¨€»¥¨@l0Ð5ëλFNå*߯mikW=*M¡èÞHΡ[W:•|‘®5=hDõÝuý5q6 ½´·ãÆÆrºnÕ‡gƤE0›÷“z –¾}¾3ñP‡n5GEØõK 6¹ËògñMtOà kŽ]Àúûq~vþ~[, ð÷¯êÅÇ/GêêiÒàÔ8Æ~$ü#bÐߢïÿ!º…¯ € j°Ó¨ôºRï÷8œ¢r¼Þ]ìÝÂj¯ä¿T²îͶ÷¾«wÇS§œ:®ì*ÜCMo&.]¾Cƒ3Ì«”؉èzÔg­„¥šqÜ<¶( 8º IœC/¬ê Þsi£‚ÆQñHyïQÆòlj8‰Êƒ'•WMð«õíîÞ‹Ðm7_ý ÏT¯«Ìµã Ded‘ÏÕì×scBé«“F¶6šÑyá*Ꙝâ”nGù6Þk‡Ã(%‹i›ö›IÜÁòÛí•þ,¾‰:{ j²×÷ 'JGïÇùß“XêÃ^!~ØÑ/Ï 1*¥¯§Ã´Î–Û [·Z¡Ö9ƒú´§gÇ|_CšÉ±âÖ·ó#½+­å^âŒJƒÇ™9Lâ®$¬Ó=oޞ܎8‰4ç7qêLjA®ÇTå?¢¥¤ê¿ß;Pz?…ü-Ñr¼_ý…{´ä»§²ñ„[VšYËàÕó„KUOF-¨©ø(Ù<2^¯#E'©˜8Íñ{<™~.„|ÍFö:»Û¹™åüN³»Jd"ü…}ß4G2*µì÷[<ÐbTæƒáûÛ„G‹*ÝÞ:M3Hn)ï ßO§¾˜f/#ËÉêëü® ÛeñØÅWeiœQjâBƒšû³‚wx¬XîÈLeÉ1‰:äŠ$#,÷œž¶÷h úX|À1_ý&:¾úï§f ïSé¿_É>œ®$ÝjÙð3Êu·ûäÃâÆå”¡Šôþ¥<¾œ>îâŒ4)¥òb®[.îË!ZÞ‘Á£ÎÞót›‰î›Ñ0=ìqJ±¶[j±Û¢T¶¿ú @%þ^üG´˜6(p%pøà9ÊE±í£þØíoñìSñòe9ä°r¿)Ò‹óâK `;!Çí}J\ »ô¾âéÙ] NæØAcS¢åA Ü[RjÑïz-># T !.c4™Ù¼À°Z‹Šçý¬4q>÷žoÙ*2®û÷öႉ—þiï¹­¨Ò6ìÁ<*Á¬H&‚¨ ¢ˆ`V’ ¥ç¿Ë~ÖÞë}×xV=ö÷ç‚ÁÝóšwÅ»fQcus¾/Ïèãœ_2É^©{¯U€UàjosZ.~ rH¥—ŸýYôï¦ãuQ‘¡1›ÉSfx â ±wxˆÃðƒü}ÿ¯øK´BѰEW›Âw¿%}l¥ÄH ‹h(¥×þ¬q9]߯É?Ž»ïЉŸÒc»KãßïñÉ/1¢Ïí¥1éç{‘ïURj‘0™Ò¨¢Ó¦—®LÚçt[6[=^~Ǥ½ ¦üŸâûׄ2Yƒ½|FƒýfŠº›,ó *›¯ÇÌ4³iÝ YäpÉe:çC•µï;úTô7§Õ1X…¸iocüX Íy¬– !˜Õ}&=ÑŸANN‘+âg««†4˜=iwÂù1WkŒÆÖ¨5üSÀPÒu@è¹%lìÕ”žG¨yé5_umÝlŸ ñ d_Üuù²;‰~êàj•Ñeëì’Ûº"ÉwýµïøË[ T¹×gë"–ß­è5îIóŒxØÔòÂY¯•…R~F ãN0ùës(²éÿäþ¿D¯e ¶¡VÊ¥{TÒBíÙÊ©t䮺CßKÆÊu‹Ìƒ·4ìÝæ’Ûo.éqÕªÖ.ZvœºÂöRÌ=n³Eás—?Š?ΡÛXÄßUÀßõ2 Ô\iÔxPwÄWwÀß—? ú\ý;V¬[ãòøÁ¨Äo^ C íÒ^«;–ÏÂð£¹I­»ÞîG;Û ^-Wgña~ŒÃ,Zj§ ½Û_Æùrö.\¡Ï×3øs¨×¯©Ù á(Öÿ˜ÙÿìÂà•³GC­oÿ€ùÆ^N*¹Ã;,óüçå¯üÑ_¶Š~=i4®¶ŽÀÌâX½šª“º>µÍ­(m Szn—(oî”ù¤·›l¨‘;.‹ƒpû$—QÞ°[)Åýí8NõœQŒö†uŠìRÐsRÈåÿø»ü—§¿{A‚bà ŒL/°ùT’d•«¿ƒÉæü¹¥.q*¯jœ»ºå­ˆ¯`ÒÏf5mð^­TÅí˜SºÑ°Æ|ö»Ö'xí‰3Ò’ä8øê­ßZQ-7ÓQ§pV^Κl¹ð¬\Æ'Þzÿ€¸˜-Pê>¿»ÓËãõTüAãrcÓøåè ­œKã©ööÔy ̸hŠz.%ÌæU¿¶˜¾É¼6>x¸)V ¬52h}7ØR•c?¯ûwîÌvòZ¥Ÿ¾Lý‚·:ÒÖ•}©ySåOŠéS–9®ƒ v³ã÷j½¹'ÞF9•æÉ¥Í$·•vš©/vÝDÛ+ÓžNX~ʆôxLȽ©0¿Ù‹á§’ѹ–µí‰ nÏ•«•[#°˜™w )ú¡âºõèV!¶ õÔë3ê9PÖÿ ?È{ ŠÂ‡å3ùf¢}7†Nr¼“Ü”©œ¶¥Ì=ev>{BrÛ¦‰.3åž×ḸND<—ä!we'ýCêµèI3 – 7á&6«T;{&dëW:îäZó+€z5ZYjuéá%oIŠš¤¸?,s‘¡Ä`Pò9ãò¹³²ugÓê=:>5\ó ª†¦ëSD#ºã’ÃêçmGC»ðúŸ’zãV<á*§ïVK‡×™E@¯é„ wtgP9R/@Þ)ºQºŸ ~®%s]®¼Äÿ L>˜ð˜2‰S±8Ž]JtQk& ³;³÷Ë+þ‰Õöª‘ŸæÔYEò¤+¬cüKǘ¡ýì2}q0g{¥GsÀ£g¤.2­©2¥£4§ÞN§˜NgM¥|z×íáõ}7k“—ŽÓ„Ákü+~R\>¾twBèwöò.ì žWBA›ˆŒÔwiMZ[”ôVN*ÔÎ{>Ûz3´íæ‚;S¿Çò÷ýFNV#ƒ™ôÅŬê\gU}OÐ-Jˆ‹ Ye¬n£O\´6 ÁЯÍ~åx¡;ÀéI‡/WÔ¶TO-[×Eb´Ê‰¿&=Ãß’µ÷öüÍpsÞ7ìùÔ$3·k#Þù~CøQýu¸%ÉûOÐë2hÒª,{›<µ»\åˆïúØÚâཧ÷vÓö·W㟉RxgâùÎÆš0ªDO"£®‰vÃ7–aÃõ63 ™âKSÎgl©Ì<ØÖšë€ Gû +iw;Rþµépsiµ—?À¿Šþæò-ú†ý.ÿ7¢  g°ÿ·¢iÆë2u€‘‰ðúÕøA‚šþ‰û–þáS}&¶vñîÏ[ vf U@ây|„¢ªXVý&¾ùL7\‡/6d¸x¦’X ¶Ó×,è¡-à>Ím]ŒN~Þù·›öòÎÆ ;ÖÇï7 ~]~€eœ`Åa`K *)Ÿà»¼\DçÓDµ¼ø‘pÞÌùÏ=š«*7ã ñh«2ìÇ"ªLá†ÎÐaš»ö‚mâ AoxÙà¤úŽ®|‡#\ˆyp/erÁù‰×ã6V÷4v1Œ8?þ=ס¨_18•a”ádzJ- -ë|Óô_¥Üé•(ÏV6&‰;½±~r(²hL6y=c'øN`Mý!k-üa3Þþ ~þFœïç \–ÛÁý”n.ûcý½ÛãK×ú¬yƒš¤Ð€U“†JùvˆÝ«üŸÝËÄMþ~!—0æ{@ÄðU’_¯Dmõ²„¸ãÑk-×ÂÍ+× ÓŸ˜ úÙýÐw ÑÎ3¿@ìVÞA¿:ÞÁh‡WÕ4óq·‚švœûˆZ;Õ°lþÂò÷ýÃ_¢Ü´ `Ÿ¨ÁPŠPÌ•¿¶5(Ÿl\ÙMô*ÅHÔíjŠO<2×r5´Úµl/v²r³Fþ0Pdæž0Yl<<=ßn/:­ß‡Ë¡°N»Î}FmìÇn¯Û튮ýÆF߯eaÒ’„•> ô9åÚPT’9[…ÊÇ´½¯ò\þ$ÈÈ<’ŽGôa^ ¹v­ä¤=ã£~èá×úø^R€r«ŽÁêò@#çÜ5¢ïÙóé:3ªiÙÚÄ4¬Ÿ[¬œýL Àë6À½“ˆØM@qÁ~a]AÍÓjZß³m_•éÑKÈ ?¨ýí ¹ îIɤvóì[óÚÜ23Lí™Óf²mFܶ¼€†h8jÚv»£;‹õ]ÎÖ¨4œþäþtÌ>f9@äB柗ø{žqé{º)û=W%¬ºK¢ÍüüXcW?ÜYXâ‹*uŸ'Èu©Ð3í°ç?îvlå€n¯õ=1Ztœ{B³N­ÊK»&1YnWnµÙ!·Å] •Õ$ÿ¯ÊþãOð·æ·½´?+˜¾aD?³Lëö{ŽÃôïulÄ}7BÅÅ?nÁ]QÒÏËêáS/y¤€Ⱥ“'Ÿwêdаãõºº5Ë=Ò²R]ÖÊô¦Òz_Sç?ˆIÜJ3Ã[_d}!Ë¢N–ûÂ:b/€…·. &(Ô´ (Õ4âû:ÿwÕ¶5IN`<Ø|Ù‚íå8š¼éá|¿vn3ÿ4¨sý%î&NЛ½í$>§¶ô£…XÙÚ]ïyÉ<ÍÅæêªÏ{«2¸Oõ…&Jš¾oŠK3ÊðKzÿ8·ü/Ov*BÑ ~W3A1lüúê ñ=/”~Ý÷Œ¯Žšå˜ÜÊ—Oüîö¸ç3B䮇âð|s˜ëÛ«ÍçaÙxý ëØá¤s\­e ¿}*èf–´¤´ok%ͬ_laÕZd k8wº‹þà?šx=EÁ6D™¿þšÐˆa0m컃µû ±ÿ°š³Iˆ>2KO‘”íe¥wGáµ;¸js|¶M—½Z}Ÿ¿¯Å‘®fä¡?r³—fŒ+é%ƒfÑE/›¯Í!ÇÍó#¦6ƒŠgê=òO˼Îc4(fX–95Ý úÝ¿ÚNâ%Òd33)(jèüN4ü]Î9Ƕö÷-·ÛÄÝfçŸÃZêÓj–´nº¦iÞrÓËD‹ìÐæ…Î8«â1¡Œm¿«”Ùþìž½Ùt±ÿŠäþUŠ(6åï1¬½(=ƒ(kB;~%åõÙȯ¶k³ëZLiGIdWns–µìôÒµ7ÂÀrV~mí꺗V½ù]sß–¯ùúcv×RŸi ¤Ñi#ê6'íš›<–KÂøbý'€U³óøž„ñµïé¦Ãè»BRzç_žk™é~f\®õÙåœP©Yw°ªÏ;¿Çòëð‘šÅt‡ÉUu Êçèœ$® O…åÝkUÎÉùHz…ýr,ÔìÁùÓ]+º§[…æpA”Rüì¡ℱ2²t¸T¦Â”Sç£eÑëúÆú®ÁÞgÇÞà4 8þf¥8lU®@{½Ü]£{ýçœú|µÍÂÆNô`™3+P©'N[KÛ¯ëßwß.#>}?q'í¤-¤d•¨i³Ñ]òö‡UÂã¡?±ZöP:UKtó<éù¹'ü¾3¥~6JÆe*Ør§ÃÂð–^|¨C¸Þ)NÁöÖDhE«—ÓÉhèGÕ9È”¦ì"_íj[˜3føöN½òäÅžHb3ö®ž—L ÝlZ£ß=ŠÏK*¦¨r+×}¿œF÷“WÆÝwƒŸSÝïºÎÿ Ø˜Àa²W<£hØ¿ ä^bíCÞ¦_@ìdEßjÞò\ï¼UR§rÓ,ÅÒ-­Vø¤xi ¹ ÚêóËÃ]?ÒˆUzÂbeAJ~C¥Ø¡ËÙtØqrÓTg°?<ƒµ;yÕ:6³ü…ïŠâÿ{ÿßJù‡õ²J]rè8<Ôx7”ÔîFÝ?dc› ›åxÏß”gsùœ¸È‘îÕ"Á?é^yˆˆZµ«5ò᪫S—ypz^xžÚƒY×Îw–]¤Q_w†2¹ïÊü½}Ø/’¶Àß²m—“w3•Õñp™ŒìB,Í%Ë›¹C~°¯¾ÑÞ$/l(×jL; Išºí)ŠÝLØn_ç†×§¥Šw”¶Ø'µ¤ G>«u1'‡–\_ÜZ¥ó>!ïãø\SÍÑfß8ñ†'²«õœÁ\8•=5µ}‘Ÿ}æª6A·ßsá¤Úº>&ï øÂ!ä<°ÍçÐ&7ISÖpïîDïæ®d¥ÃWH²}RIªM<È^kÒî¤gv&¤RçdíÀq¬ðt>Ó:<Àrõ@ù¢ PŒö_"RÏñæ‘Mn× žTüU%ö™×µ9œ?¢ÜŒ{„/[x,”»ò ñ´érïXÖûêñùtõé«ss°þ€‚÷€A=0/€­À¶ßo Á|Ùƒ¢‰œ‘àü/=&óK€îI(JsÞ ÿ|i ÉTwñØ?¬ª1ÌÝZ¨/Ó…'÷$¯£$u\Fñ£`‡4]¸yû·|¾Mó9Ø^ζ=fý¡ñ…׊úÃ7¬šœë¥Æ–—q_Â~°à3a'ìaê+ó;X$ÿy%ÑÒñ$Õ‰MĪ:¯="[l?–e‘º?ŠôHžDúÖ5¢N¿töw ¬l·z>TÑ>ö*csÃlç_ñƒü}Ð|z `üXqÚ8­@QÐŒQ1qˆŠúñFö EmËíJñ^Ä’ÉýøÈÆÁ`CÄ aV,å~'JLŠ‹ Œ…󱨳Õ”Üm`…û}œi^ÏÆ¨â³ ·†?þ¢;U©­î‚bYù=þ£‰æ§PSÚÂ$ÔÜ™€èô¿92¡{PÔ@i@ k2Àtp6sx©Ï%Q†É#nêóÔ£Ýh¢îýS ™Å¾l ½d‹¾?Ìè’wèì—¶©/­ÒàxDò½{~Úú. ËódûôÉ ŠV´ÀN>eŠîVñwy¹Á2€Hf3@Låͳú2íxé€C&C8V†ÖöýPIù£a%ïá—q/)FíVí ­K6˜srkçnui‘ÊÐvK#Yß5v/uÛ} &{”ˆ¿ÇòëÐ~èä˜8–ba03kPÌ|—C¥__MÓXPäÜéSkZÜÞrf´×vàDÏ£Y¬wŸ¨×øòup~´Ôé}eóG»þÁ.âU¿ëÉÔ«»¶MÑ-ÍdÃÖ*{ÕÚô+òùœESœ2Ã?@Õ#@wÔä+,ìÚæ{Lðó{ºé¯Ý¶'›~Unš'ý—YnEF€1=y´rnêáz<ƒ…=Áè{‡=½‰ö¢K·L€´Sç®ñ8Wm­“¢·ÏõDÙØ«D^£Å±°º¼ñ¡1{ýä×å÷€¢%Ïø EÍNñh ŠVõõ=4”øžã@%Ñ»?|0´%…ù#P¼[º¤Ýš·ÚúÌ¢`óƒ MÜÙ±ÙÉñÞáuGæyû’ó±õ¡ž)+S¼6¹BP]¤FÏ$† Áð¡¾ÈÍ{š^gÙ?Àw¬œ4ް±#Y€{ŠÄì{ˆ`÷ûQqMÃ{;^e&B–ÊÐ_Ò-rålÙÊâˆǺ{W´õîQí-XWö–õtN›|¶u_£¯®ýï í«ò:ƒJšmé‹ò¬¯u°6·4—³°ŒúTïžÆ•²€(+=Pd76(¡½ïbè}ÎÉMŽ/=× Ž÷ëÍôD¼¬J< ©üÔõì·ºÓÝthsã<×ÖKpg5yh£ÎS7lÕb­S«§—æB©,SÙ˜Yd«;j>Ø,ºó<;iÿÂò÷ýÃ_¢‹Ö7ÿ´ 8?BQJx€ÒýYH4g^Žú^Üð¯3¾{‹™iÿŒ3£ýívRÙL¶k*°UŽ–·…) ºàóµÞª£»%0öÇÅ–P¼¹“Wžó¼pCU>¦»*¶£»Êy@¶•¢_lý`bNß¿%z9@È»>(oS@¹\ÈÇf¡…<}-{~mÒº|¼}µ]ßmlÞ^÷XÉÊWhÙ¼ŽÆ3c~°çÚs_Ö—Ìm·™;1¹S!ûýtR6ú®ÁòÕ̬Z¿‘S?úŸœªËsóðK`Ÿ1Ô´½á÷˃PÓ5ÂWmtO=¬y ¤è„ý ÷ÈâêçÁÂnʦÄîž»R‹Ô2£uq F”Åeí¥õ§Ë wšÏÑLQS.Jdͪ®êN–zŸ´ç-?G2ĸ 1… Æõ¿ñƒüãÁßèuxxm™ÿžŒ1ü~à Š>·þ³yZ¿"'ƒüÛÙËݺÓTé„bÃ]Œ‹]›UîÌFÌìz+uµêÿÈÿ Ëlí#ÍÑ7?SÊ{1߇ƤÍUíñû]8Y–I${çbãL¶Ú§“R}̵?À_š£má×~Ktô}]ÚåÖÍK:E! “tìã8}±z˜ŠåêTϤµïÍ»æHŒþ\ {Ëž<êϱ›9R*zVš’½ñT6¸6Î.)g"jÞƒDp*'œ„ .¢jP]ð®þ`ç)œ¾:¾oÉó ´jY ¼L®qª[½—ÜÓ»kwûy.¼ZßÝé 9$ì-»¬mŠE®š—JWc§%f~TÚ=eHƒi‹>ð2ƒVÇ’Ó¹«"&ËÃú»‘ÿýb˜rÿ¤G°iUùJ{S寚]ù~ÿö`™)Œè3A¿¯Ÿ °Ì‡›Wí¹uÙ àø3åqº~Nýð(Ÿ’³¢uÔ:€VÙTI´¡Ó³¦€ £x䇞¶EØ'ËlIHÃø-ã‹<©òb=ËÖ ù´Ïƒ®dƒAw,ÖÉY¬#zVùŒX^ÑÆ0P*lÄï_Zc#IjÂ:ÓwÃ#ëOû̯÷—ý¢«&¶ý$³›Ò#¸V–CÒ¨©“—ÖœêG«-sõ„’P«Á eÕŒæ{V¼Tío6³ŸÉÖN½þpþüAz¹Z³ÜO»b½¿~Žª€±Û+ ´JËÊÛå"N]ŸSßk¯¦·ÔS\a öŽWë´y}àøS+Dë÷yl^:2¥YkÙ¯ÉÛÒ”°û–*N‰‘Ú¦70#VègkèŒÛ_?‡U›VšÏl‘kÙÓbÖäÜ\ÿoøAþñ`GÿЏ^‚eŽˆ/e9–£‚¯ î‰Ùœñk<Û·¶)ËòÁm­æõD·nÝÏ¢˜ªäfñ €M2T­$‰Wª§1|Î p|0Þ‘í¹%qÄ 'jÊ–†5™Å=4ïzži? ºÌ$Y5™ÉmÞø=`c¯x ¸öJ <. c\Ø[ê–T>„ÔÙkû¼´ë‹ÓÕæîÎÆ[¦ƒ%ÞDžÊ²ë§&\ Ò9›C…zŸ+_‰SdâÙãëOš#îÇã-ì)NmƒŠ7¥sLBuJi8£Ú÷iz¬pêd€R—(ƒ V¥¯;û:IŸwjß~nI{φ›Ú}´0>‚¾[ŠÎò¢6á ã.³cJhh~øæ%|€ŒR•ž°[“ì=Ý£ußÑËsW¡Œ{Ïì¾kÆ©ËlS¯nz¼­tÓ}IêÒ.þ+~¿ï½P.ŠåëzÕ½eÿru íý°1Æ­­÷rßàÔ‰º,’Ž¥èæå4°±'Mú؃ׇÝç0ãíR}¾Äå¹ë+±5à7èØþžkM½öΨû9fÝÌÓ_utþØÉc“¸½?´Ík×A'§ç&œü‘P³ÏMwžî±¤e¶Ž)v[áýºþ fâ\˺³æ¸ÅT:(J·ƒl&´}”ªÅï’‡`àìð¸7k€«Öx„YEŒî2 B1“T»ÛS×j)©-ìálç‚‘ÛVi©ÜÈ{Ë{‘³_þAÈê¡=† äßã>7Fúq\Zh»·ïÏ-˜~+ÐØ…ÚQÀÊóÀ:ôgPo*ÝùZ Àë0ú`•3ìv¾_.î•é·ÏÎïÇ'ý"ŵywîŽ ñÎÈÏWÚâ#ÛjMrXôøºDÖ¢Á¢¹h)V#vO—Fl¢ ì…uÂ$þ?ȯˉs³Ýg$‹°ÞãUW TࣴKju–ÑV–ÕDlú'uÄ¥²Zÿ$MN©[F§D‡ú8ı»âÛ÷ùà»#4n]—ú‡ôV*ò]ƒµ¦D#vƵ†>\w‚?¬¿NÙIÝ”êZ.*ÎÀé<ÒƒÍÅ 8trƒÅåŠjû=§ý— Çýñ¤ׄök Ù!Õ»ÊGŽ]´šÚd¯•9Ld¨×QÚR=»hMÈÈ •îyÓ\°Û]#ÞmON~{¯›‚ó¨Óø#U³äw¡ÆUðr-ã·šÕ:†£Ø¯ËïaáWÇ0i¾½[ÙÎìÝ£V“ÑǾIµË'}VõxÀç×ÎSrYFï. ”5(ýØ)·¥Ú´þÝÓ›´H²öÆ;ÿY íäîß•Ð_§±à¯EÐÌ=Ъ;%ýŸõÏÊ~Y½VÐg#,ŸVÃ÷f|¯V_H±Z›~ÊÕ†,e3!VòÆpÁ½ëX[±Í$cQ{ávsçÊ©-Uýééªß\0Ì£¡÷«ÏºÉ§Aísú¤k\1†š†h5\‰Ê~¹‚Æa³|Ò?ÌG?½Òuƒ ¥J•‹Þ®½ü€ü’0@)ï@~û|ƒÂú’êTè09´†ïŠâ©„ƒ×hƒBVAÞ˜ÂØ]ï@îí\@îè?@ÎBR 'áyãZE#‡u+.»/×q/´àOžG«¾N.N݉kȉ4Ïp )X~ÿ}‡Ùë¯Ë¿âŠžßPÔv £1è@ÑQ>û´PZP³( ï¨È·ÈÎ7 ~í…ËYi(º( -S†¶ãæËM–ôk4Ý¡h¢°Z¸ãñ͹uõÎWãÈÅ/ü ßÿP´¹ùëÂÊ9ÊÀPöh€õòÀ–“+ÀÆN Ú:%€Î¶]P Vƒkªãi$>ÈSYðÚŸ ¹äÅ“â…Þªç©Ûè>Å 7x¢1Kä]b?ÂÆùRQÃõö{w«ÔcóÜ‘ò‹£ÖÊïòã9î»ßöæÌ)ýkù»Íú°(Ï´,œ­"€Uà,@ÛH‡U ¢ÏlðâßÉë…±Oä)M"¹®Õdgú±'?û°ï(M‹ôpµ½1ÌÄýÜÛunúµ92µ<883ÛóÏ·ü{€BŠ…¢[yÐŽûÝê°ÇxàüËû®‚#Çi8WÕÈï^kô…JgõçÅ88ɽ9½&Õ ÅõË\y JDú6S _Ï\7¤kåa`-æKе¿†¡uZgý0x4wŒnÆN%CÛÿ‡ä~°ÑÚ®ÕƒÜw9Š*Ö à B(y€¯õ&À‹Þ«hbbâ9†ÏãÆúÑ®nÔ½kב¨0ØN˯$Èn°¬Ÿ—Ô㩪‡1uê.ÙÊøê×÷ë}½éûC?­8Sn4¶#?æ·†½ü P—7 @°Ä ù_MÀzÅk@ fÑw›uù*=t.iHÿ0ˆÒ8J¥6‹`Wk®ýÑÄs=‡Ãn‰/z·* âKtt>çD×r' Î‹'úqï9Кí±g ü ;ÿVoŸ¸5²³ÞÛôN€ý= ã Šš(Ê5`ìLnåÊ ®.ÔLPô5©fšIÓ¤©U]ÂÒ{æeäfÔÌ+v¬å­æ¥V—ö±NïËÛ=ÚõÕùà"¢(ÔúÉ/rwÜo–&»?.¬Î5\p ›šf]ÝÊøŠŠå¹òïÛm4ž^¿çb°Äkâ÷¬CŽ/Óà=Þ—•¢-4öjúä}a‹¹Ì¯ÝP·n»%ûuóêVßôɵXÃ;«{eÎ6:Ô Î—ô±3]d;ymžod·*¯ÑwåôrÒŠt «³ž‡#òlòÈ—¿(ýPt³aÜ`ÊA‘e%ʆýœ“¥Ó#Óž]âžóoñLN.8~öwnß%Þæ/Û,Ë—×§ñ´ºòˆ;©?.µîò-)ÌbTóBî&)çåR™ÝFSsêKëãT-_Óúó\žD«mÂùâðïøA~]@aÿ}ùƒuî€(×K 8¡è¬k%šþv¢Ü¾¿÷+ÃÏåJoþQJÏ^n³ÊdlfÛ,l“:aVF­²¯GÕå‡Ú7ýa§«å§”–߯ÌL—'K'½”ci'wÅõcü&{Åñ»Èà=\îrÂÿ à]¶›ÃÉ$ѧ˰jΡ¦Û[Ç+àš°·ÄêMëm®îÙ©¯‡J®ùؽšùå½ÌºDGcÙ|â­•Ë‹9©©R:"g&PÓ&UèË«‰+Ž7ÌF•ìþÅ’CÉ]õKÈÁ¤ÞÇ~©Ðß^w(zŒ`<5¾ü=”Q|ÝÝžñàpyé߯ífÄÊæ$£Õs¡Íåϸ٧WóÒ2ûƒhïŠ]X8³˜P¥ Xš)¦Z›Ä÷R[¦b›‘vx(Žö͉ n)ƒ¿"›-kyèQA”áhßÿøÎ.ÊOvŸY½JÃ@zÎOi%hmÙ Šåb yípÏ?§›Ýß¶ùúòaz“Ð_h/½ìã"¢^Š‹ÂLÕ||bôZe95¿7¤"µ¹';¡=ÈzêÚ«ß,c¥_NË‚¥ßÔjß§Ýê&–³füϵnš÷óÇÜ0~5±M¾ª½¨“Ü~ ÷~ö$ì§,qÍm˜«n‡Ì¤Ú/²¢Áâ\!aÑß`cˆmü¥i»štXª~}_²¯ó!×ÍÔÌG·m–þA¬¢ÈWúJе.;ªWí§¯Tï&÷›Z(^z§˜Wì54›ô µ ½áðUâðÌ•dn‡Gû¶'Ó|Ù¤"ÿâSQ`—èúf^¢½@&~áùûþx79‚"Ó LÎ*WpïÝO¢‘¾êA7q6yÛâRHšËC~¤÷Èê|~ã‰õL1GÞ¹Õ£x]³7~ABXÇÌj=éïʇO‹9öжKÌÌ!šôüXëQÚ•’»¯ÊjÝ]½[Awõ©–»+ ‡éû¬ýv® ”7Ó?È­S=:'œiîöÍ=êî¶gÑ·.¡…˜q†®ë¶»í/dá1UZI¬M5eI%®àòK= òtï;s>îa~þÍN[÷S7E ¦ÒÍ.Øl¸.“yÀq¿³66^Õ;ÛYTíd·)¦ÃqÛÎïˆèÜçÓ‘q⣓ájdG·wGÚÚÜw»ëêe'Y=wWësoý€ulföPIÞ¸¹¨ ‚>z —í0ó‡>:}Ý8ùjF,ììßtÜfr”™j»Òju3#¡ßé‡Î¬½o¥¬6,‚6Ÿ“ÊmT¹2­cdõþÆò¿õ]ë<ÀÕ]NS;WîM×þx¨­RÚ.Ö0—Aæu?¨Ïè¨ÍÉBÆ”Äúý¦ŒÖݪ6È›òªWts[V%®G†ô¿û-) I*e ©nö<Å:ùû´Öjkª5æÎys³Kr:›ìÉ*yBÄͦA™ßãÂ֋¾> [µ?Ⱥöž ºŸÍ÷jª­Ã1?µëýÆø"zœ µ³£QÚŽûGù¡r³ž¨1±¦W“—C±ý©›Ë™^Åq›(©©V™20rfͰØfsV”~†öh¶µß×_cêY7Kqù÷8”c¦ogÃc†éÖ³K›+èkªPëe2Ù×Ù‚ä‰×ÿÒ°Ö0ç°í÷®ò£Ï†Ë™@¿,T¦¬A¨v¸¥wPOZ·‰ˆÛµÊOò@Ö>õ{sÁuâ†>ì¦ë¯ã«Ó„Z¯Y“-]ã*‰PËeu7×à»:ú¿Øœ…¶Ì ?hh;#i¨AÇiÏ2¥•#Nÿ*6½k8²¨ 7ËyJeôî¾H}vßp¬ÙAïQ·u]lYÒ3Ô~3Üpk’™¡Üèäµn ½UÍ’»–ñ„s5ÃÊ~¹~WÐç1_>™éjY¢«íßc]-+zf¸­¨*ƒ—'}Ë­|דó× ÿZD«Á~€¯z“’m³0ó<Ðt:¼uØ$hŸf•¸5YΧI¦WH£“óu“‰š5¦ÊµÌ½]¯jT§Â“M¶|2(¾L¼ûÓR%Ó×~¢·Óì¢28ž‹õ|àý:[ÕÇ|Ò/ÂYE0«2£Ñ÷%¬=bù5‚rùQw€nŶTe&¤§#ê÷\ú®5ôž»®Ó¨lÕ¸"LevSêPÙÏËç £·²ÔÉ¥ë:—*éÜ»¨ôóYbÁg1‚Äê5\wÚØëÎq˜9“Fÿ ?Èß÷ 7ÌòVtx÷q@~§@!='A¡™–A!Ó°@~×ó@~ e@Ø[4ȱˆr™Ò ×î »ñ úúÉ-È0‚#2Òm ©Në©å‡A ÄÎ|H}“Œzó˜çÎz¸ê1Ë*uÿÿSÓE]¿äÒ À¸íïúؼ:¶·ùX€¢ú* ò•#=|Eůh³±HÌXÐvz„¶[ÚúO€L YhË¡«Ñ‚šEBY¾œÐÚ<ñ©´«×ìú‰ÚØÒÒïÇÜ·7õ_rÆbr…}–]ÊrÖAf ›© ]×€Uj.P<Ûàß“ZslK9b¸…¶ê ÚBh›€¥<´–¡íÕ™BQ}õ<+¾³Ø&ÒxclV…¥7Ògª‡vFÿ?ȯ È9:íZÈ·Ø &•…wº ÐêxЂã@Ûs Ä%«À£ò]Š¥1ÈÍ»P“:Ðu}…®‡º‚@œjº Õoé7æåÖÈÙóHÒFréÒÛG3wÞ¤axn ' rô™]½Öiò¯¹›¥À ^W ¿”0”bö?Ë˨áÌ¿sþ)Ø´–€‚…ÀÊP,TAÞipЖÿú=6`l—PTtnP9I^î5ù¼FC¤ð*¼«•§Øì¶“‹¾•âûú¶|¶¿ ©1cz£¼¸•·±gãí$+žÌÎÿWü%š¼LPHÙg€æWPî6fVJ-†Çïr}Pª—‡®Ý(Bäoêôu(Läyºví'Zçä*´ü¤l·ž±W¦Òq§ ÓêfïÂ…/ô= >­’᮲v­ÝõÙÉøÒaÐïŽù\uø¯øÖ±d§À2G× @_Np Mn9€-Iý»ü °žõè}ÂȪî´˜g‰EĤš Ô¸¾ÕŒÇâ>ßEñG>Gbß Ía? ©·’ ¬¦Žÿ AF[~nÓï§As~YP¼r´Öëñ~ïFÎ-;ë9•iŸûW€|ö¤Â2on@á¾,[‚èsjpì»)¸^¿ûÇ¢ØÎ+Ùn%ñKë¡ñr?꺄2¬§½¼iøNcaûùþäèñ ¿Kc.¾]]!}« Nù²˜Fì¹ÓL¤c$W:¹Ãò.sÛD¶º?ÈÖh›ÝȯP4ê—ïW€ICâ{>ôà&¬µø¡|¸J}ÿ³Î=õE4MUƒ]õÚñG©ï‰iLüAî¥ÑY¹ú7ayY6 «³“ÙÓ:u9žR­À?rfáspRZ}Ïß/=g’Œ6ù81Öš§;› È ’Mþ O†ßöR¨Ï,Xæ½ÀNË"À÷ ˆ úÝ¿,Þžµv&y<ú¥Ûäo/Â+vÈÚM)9‹æ¤éÓÛžõ6VNò™íÇÓÒ=ëæÚ-úÖÞ™âWÿ»ž<)fìhmµ¶Ý²Âlzh¯ U£¹ºdZÕÕøÚªý+@ž‹ç  l¶ïAÖç Ê'áûq·õkR™]cº°OfX ó¾ßY3m!KXA*né8(7›ûSq×ue±Ã:³Jv´klc»5[ª[ãd˜ÖÚ1\+]H¢MOR‹ëìþWã¸Q7f¹wUŸ×e½mJ?ȯËÈKŸÅ_‹MÍsð(BŽ¿'š¯“o)rq xÍ÷½ò¯múó>õ®ÏìAh×Pwr›”œ:‘oü ¶Ž©í-5+Ñ˾›~å>^Ò¶j ¯¹ºÐÏóªdÏ2FÕ jÚc;¯,Ÿwª¸¤¨±xPü_ñM4|¿)Œ‰Qp¯X0……¢âÑŒvÎéÀõ‹¯ÃùFÎ]ÿ´£ÑAÔ·[]X™] …í:Õ#¬láQ]ï'ó–)>`¢&ï3c¶%}>õæš¶ÈØ?ˆÖ&çåÊm–›0CÌíxÍsý¢ð¯ùmжß6¬šù–9]Å&%<}}®=˜ÑÕ„c}sêß·ž/©CùxÄŠyϽ ]»Ð|oÓô0µvƒ¼yî°Äj²}UŒ:ª7µØ ©¥Iäû +Ÿ—^Íû—ÝežÓ¨:ªœ® Hx'¯—Jî~¿ïÿlìå%lCÈw±©ò€e.AQ±Ï'è«Q/´æ¾ÌbÚ­T×§á2t÷p¸ìâÓÑß²¶oF­âÛ_GiÃbøStò#áK0Ä`´°ü’VùÖ”W$ÊPg×mÊMÆ~zV)Á™÷„PVòEö_ X[è®ô]lâ¾­&ì=ÎFñ*Ê!šŒ½š–Ì.¬h/jb9ÑE8Ø´!Þ6{E Lù¸}s!ýÒž£IzÉLS¹¹£©¸*`ÝšR\!íYe‘îMëSDž,‚áæ™Vça r©Yˆeæ÷€ã«,Ã8° ñ1(¦wÕï&ÁÑcÓó†1­oñ~ÉŸöVÙÏ$ÎÇvÆ«åZŽX>¯‹½úÍwB¨½Zv¼ÌdQ0áëŒr©W ³©ó(MÍMCNü93M3å§1NC4N½™1Sm¥!º_0ÿ0³øß`¯$BѦàÜUPl\kÏ€è÷"ûn±~¥€±WzÙè¥FNv›Ó¬n§OÏíFÐ^‡•¿Ê_ôŽŠß—\M ç#à%Ê5ǽa¾_+>²cr×§ªã´\îH߉Ãóüÿ¡ëL—TUš¶}}Êä<# (‚LЍ Žˆ8¡ˆHéùåÚO¼û‹½þ\Ett·7Y•U™iQJfØ8C\>JÿôN);K)ÛgêóWÀ9i re²Ì}â$©ý`q¤•ÙPüp­ë£s¡Ž[ú ³ ꬸ‹ÎÁXïâÝrq»îŒRŽžé î§é¡X ÆçÈ~ŒB'õÒZ÷yz°e\å-¤¬d³gR. ' Ų.^CïðƒIåú*% ÙÙ[:·œ.Ÿ¿d’9êm Ð P¼ãÕç|R÷b”/4/—ü<2¤vfVëo¸áD_<ÅþÁædOZ[+a²32âÊ_nÏóè±`oCÐßFÎ½"²Ê¸y©|×Äšg°}òì„çLÜÏyçÓ70ù#Ö“·Xë Àðƒý{ g%Æ™‡ ΀RµP‰ºG­Ü´~ÂT?ŒÙš âJw}`ƒÅØ­ö‚©ÌM\îm&Cu¸×ÑÞ¾{èyЛÎBEWJ}õ'E-Óo®Ø –æÙåXâSJyɧÔ|Â/ÂÎGh×:@hg©ä¯Y+‚‡ž;b¾öNª‡O!”úô;¿·ØÏ¿»éÕÛ—6½[L¯JTZžÅ‹nn‘‡9-–ó+Ý [®ÆìÇû^½øJ ¯’NÝÃ~¤ažá0¾ã6K=¬S¡¸þF¹Œ€Ì!ÞñÆõGµTÝæA‹«ï¿:{ }±P\ª©'#Sgöþò}Ï~]öaÙ‹ÝUØ&ÖÊÐ$çÑjÞ³Ó=w0=Þ¶0Ñë“­- øj@PÍR,8{©ž.û6sºñŸ‘÷ÜB;͉‡JNmu²3ÜKB§;‡Oî·l©8Rû–^ÖÕŠýÚðBAOùþP{ÏVÓAÌ”SYJ¶ãöéréÀ;êõÚ#VÊ~ʱÍ|:£t;ÇŽ¶Î‹¹™ðÉÏVú4GûIá6r»é¶V¥‘¹l˜7w¶*î¦Wi¥'\-7ÇÖà0O÷”Ê­%C¯Œõ½.8bÊüvΩÇÁ¶[>û@±cÞ€^œñ ª0d››XBíVíÖE-÷2È´`RXn ™A寀³¥Aš«Sç‘’•ÂLqÓXÔ_Ñ<•nóÛŽk´êmBê›Ï¨»*æŠ#×å¹²â|ÃôžÛzÞJšre¢8ïÜdžµÄÑ™«‡îV´ØfzÏ·v³t³%öR+[Cç”OÊsš•¿²µæIo×ÿŠ‹ÙÊ ^A‘—ÝM;«]èÌÛxس2T¨Lƒä#¥q[Ÿß5÷^O«—”™—›jºÖ_Gb‹—Œ Ãi+µßy•!kŸPƒY\Á’^‡ñ¾íÆñµµÇq+§V ª8¢*Mímvš•ÐÈ›joÉÛ@ü7*,ÿ`ä­ô¬ü~Æ£:nråÛ«ãÁmÎ’:K™Ò'ÇLÈ™¤èqè ÷B¨ÜsöG¢L¦uæåÞ)W »wÚ§Ù— p?³Ê×ezS.ŽÚ;¶h·¼±¦N"zh^U4hVa¢C6ÞL#òœFã[-­¿baRŸoŸ»:Ã,R>öWlm¬ÕüÁÖ¹‰T½ÖŠ™CäʘÚP¤¶óË«A¹dë(\D¤ ž¼Ÿ×SÜ8UÈtìê¹Ä|l­N»²@6í¶ÔzN¢4*5hŽéǘ W`Þxºñæ{ éñ«³…\T[kTº†ÜäBÕZU$Ä*þ´ggç¯XKr³4§ÔeÁÌÚù¼ï¬Ü0K3EµvRâgæÌ‰(­¾û“¯Þ®KÆâ™eüN»’ÿjg¯ê»U{h3˜•2ß'ù‹dÁj65ë éÅ~·®òßG÷U<|‰*9eNË*3‰Ê…Ï)]:;ùRIëå¡¿üi~ÃÜäY3[¾zÌ0øÀ›¸…”Ðw;‘Ò;jr× ÷*˦Û-dãqË-MJ#Ëf Ð.ÙL—öPvúZ,]k\Ñ»WÝ‘÷­FxŸJö¹FËj{Ÿ/—çZ1ØœÛÅ:þé© Y´ Íüj›žVû¿ÂÜñ¦?Cäõyy#-µâçGð,Å«*Å&‹#I»"ÝlùZÔj–N“ÛíÖ“Ò«}¼§XuµµTÙOÆj%i£²ÚR'%eÍbà´gÅ:Ö^ ± …ø¼—|»(…¹ÅhüÎ~î‘åÈC)‹Ä) ‚ ÿ €É `éx0Oœ~îþÚ|Q.מðÀ– pÖÛ«pW0«Œ¬Õ­42 6"@÷Ñ ËŒ Ð åTù—€³% ±­”#ºœ aëU÷“WÎkjÏ<¾ô0ÿ¿ë°I A¢£oÝ g€(yP(ßj¢C`<ÙYPmtxƒ2£µëPë¼0Ü“ à7üä[iï=t6Pòäq‹:­"G F‘ƒPUw’[cú¼œÑÑ#J ÔpvÍKÅÿd*¹4¥ûÝm‹_ˇêàÄF$aíd¨önhBàßãð†˜ØI‡B­]`|¤¬™ŒhÌ![€ç u? Ì; ¥{(Ó¯óI¿Èª?Øë0Æñ [G i©…ô<£Ü6…¹øWl•’aŸ7õÿ•C)ÞDT€éS~Õ™Bz›¢]‚2Aïõ½—‰ž…j7$´í•˜  ³À„ÎJí €US1À24–ô§ñ’µc7>Þ€ò¼D±Mö‡qHïJÃf¥«’G„ñƒýçP#*<#ü¯J8Sd:<2Ë 2+Z™nˆsÿaAìò_^›ï¼{/”†{Òf²Óz«$sèí Å¼Ž|~ÉÑäñÊ[×t\G…gÕªÒQcA êØQïo=? ÄŠ¨\ÊØ^8F1Ñù+vÏ)ï'ДøfËÞ÷Ò™Ûw‡FµÁBLt¹;È|kÇÄF„vÏ'ÒäÚ|ù–ǽ ‹•Öè`–õÔç«utWûhªz—G´½>–XÆÂ¹ª“÷nUïÜxr c˜«·$ÕÓtÍ >3q:o´ÿ è>E(t»€BÖZ1sYá•Ùí¨ qƒ¬žrA6‹‰|Þ¾^¥†N|O; ˜Ê³nÚQ“~r[ ä0±ýQÈ\ó¾N¯—÷®åïn›äy½á2ÄÍ¢|-H.}ÖwjïØš¥xö:û¬Ñ[VšÿÁöï5ìóºúOÝ6“SV KÐ7ã.ÈõŠ+±Û×Y‰/q­Ó{D“¤ôÌΆ©g³|G—Dë&8q7ôCÿê¯áµ;Æv)ßÍùy\XnOá\ŽvC|PKwèý^Â:[­¯´6aô!{¿¨ý¯6¡L5™þo‹ m† §ŽJêÉ9äSšñºèuçi€Éþ±ÐïçéóÑMäãTwÌìåò©–ÏáNž¾aر½`º>kÖDo½+ î7ÚÚì÷ÛU°SU„ØÂ¡æÖ»Y Fãíñ¸¾rJÅÊr[½þ €èÓǬåû&MÇÈ…ÛÒ÷-t|2LÙÓgÔóÇòD;÷>ªïÕ /—`ð­öœZ ñß›,ê97wèàâ$wëäí…ü¶b¥T·¾ ÌñhºNLÉHÅÜÊ¡Šµ%á9¥Eî)çç%¢šý 0ÿ6ppªØç¤ Çe~™Š ÆÔ÷eO >¾¿ØáãC,'÷þ¶ƒÁ½µ>?îpdµþɰÝ}ï£äk7”ém5˜nä JÌÔºûnÁxl©½¸•#¿Ôz®ÚË~Å9/än>=?ºÂ¬Ê¾²vc°!,óªcš6”)ñP¦KA™~%ù RN†ûŒ-Ÿ­C!Ýgn£_ÈV0;¦»³åá`Þ÷» š=nëiû¶±sÅØaFÇϺKêØŠ'º…e?*WòiÍëOovÅÈѬ*Î{rlÄVDYsž%a&n¼bt‘Oú¯DÓ‚ÌB1aŸË¯ ¯o9´üª=:JnÜ=Ç7ú×:-*Çu©¢{@Ù»Qȯ]S^ÃÙÒ,q\sô$Xánõ¹ðs'0ÎÇèLW¹œ=í·«–EVÚæËD“¾m¬ºb`¤Ï2åÛûôdwX¤&¢¬¿ÿŠï“)ª…&Ö÷pè™òú8ù–CËÏ”á¶=k#ñÍžÀðÌy{ï¢îËæ}âF[dæ,“úzµ™»eÎÆŽóKjÌÆ"ó´ÉsÌ¤ã Æ§5+@‹!u³1ÅK³îDÔcm’­»þØO3ïqaH¾õs¹ ôa€¿þ @¬C dË+(sº…2¯.…“QŠ€žªÝåI¿ç䆱j{¬ÆŠöHÜâTs>µ±ÆB°X敆3¯æ¬mÖ²¾Õ¶÷™Ê«Ï©»¨¼'û†}1]ÖÏÖÖËÛž2gS›Q-\D£Ú'H´píÃY387þ+&P(ïA¡÷Û`À‘TÊ\þáL—ù[i“)œçýVÉó°"µ»-½ h¶Ôµ;T'Ke»´æ5ü¾øÁl có]F¯Á§Ä"u‹ÛX×VÃÔhl+9͘ ëÃgtâ‡ívǶûõûT…z÷ü"ú+ «ã£ïw¯›×·*N Ð{¾_õq‘wÈ€¸Þ¯;ì¸9ù™Ã°7¶æ)Ýqœ>.­rlQ›ÓÎÔ¶SË|ß?K[ ÎDÞ=vãRsvݼÞC3Ûy0l?>8ŒÆ—åBUuêLGåpaE7‡«ÚCŠO•{ˆÜß2la²ÏÌäÅâ6Èû¯oÈ]©äS;Û¾üy»\tª›·¾j¯û“@X\ÔX™5µŒn±%Ñ0øó~6Q¬âJ¿®—î¨q§¼á‹_ˇ«=}(}uQÛ°-çk¢&çë£,¡,KÛ»|X¿g|›ßW"rr…êäwí (¦Ëïh¹U_·2»Nkíz…G3½}¶ûEg³VšËopó½-°¸ ÷“Õ'ª,ÀµRôÇ|DnÎp~NïHj~Rvs%”•bë- 3íŒxUŒ¦X½ Äû ê¥Q(^{“»T2gÈì(Sé­¿ß&`Ò;­÷£w/†Wƒ¢ÎG¢¡\öãY¸l>“Y‹²¶ÐÇcÏÉ>oöÌ•2Í#OM¿ ë“QÓØÚCV©.Uw¼Ù(¦øÒ™+¢~Kâþôœ‚½/<+íºÐš¸}¡5]¹‚Ò¡}è{Ÿ¬unÈâŠrÞh ‡¦ÄfÍ/ÖŠ_P¢æxÅùó°•qä¸/ÎÉ˳‡TfÏA޲Jµ;U¾?®Öꈣ£a‡–§êVKÏ”œc­%-¬íú"< öfñ‹ÅáSi¢Òãx­×ãÅéq}ìÞû\Jwž‰K·?øÁþ½þÐÙ­1ÈW.(÷·ëÄËZ'Dr-ïX²gûFQݸ0¹®sáè3ðë¼Êj†ÔH3〫õFÖI“†]î2PÅBC‡cìÄžL©ªóó¾yÁ]þÞû|*qCnk.>ñŠK]™e;]¹ÓZ@DA÷Ðyß9ÁÃþ=& ?»Ð}`–tZ±ÜÈóõâx?i¦&î»/œŒéøËê(ÿ´ß97‰ç¤4a'jW>쓚¼*U—²¬™övÓ~Ë`l~uû¬{<ï{\6µºlÿé”>·üÆ^ŽaõakÎêüýÊ^µ|Ô)iéð¯€ëPÆL†#°½Px]öÅÑMÝ×Û²â.7%ÙÙŽ±ÔÌföŠv7s7úžÞ0¹Ê¬NÃêÐ9í)Uîå:rå9€ c>- ËìTã¹m×äöQ²èªcÛÑÌ `ë5?a “ÈÓÏ—JÓÏ„·h{i[¦^ ¹¬>ÿÅöŸ€Ü»? ´N?ö¶3aTß]–NüÚk*½eͳ†³ä`-,!GúS­°~ê6öF‡›w­ *c£.×2qKlƒ®Ðy½„Þ®iÁ¼’“ïÝq·¤•çì½o™¨Œ_èW½œ´ß—k/_Ýîì7V»3¡Ïít~òj§N£÷_ñÒ ùé ¨2s8¹™®›¼ôïþäÃi/¦–ÏÎRõ o˜³>­x¶£Ïò•ëp[œ$j‘1éqÅ>@bR@Óº'±ù^÷<óäΘÔ5Öhë3¦ñšI”K›KM“–Û r-ïÒ?X ¿U­~¸]¨=‰&”xΤÿŠk0¸°ž—¾·¶6ÆPëCeÝXLqŽ´»¯\Ë4‰î8šæ”ÑûP™Åìá \*üÁ$+wNõ;~;Ã÷·2wÂGdwäÐNCÌ‹Ì ‰†ô›ˆ¬¶s:­ÛX%}ieù%o†9*Ï¿™æ©r±¨<­›ƒ©ñl– Nú?øÁþ½>r·¨¹»»¤#´µÊb¢Ç%©Î*Ó Ñoèór‡Ö\ö¡ÔÚv!‡+z/.Øk YñÕS«Ú ¬K¡ÓL™u¶hú³¦8Ù~ßùØÆï´Ñ’HÙ¡ÔöàØj) ?=iQž_I=­Dª]òy±lZЮT·ÛÙ XQçéq× ìí‰ —³ ñÜŒ¢z²ï'u6'"5®ÔÍ|÷ôê|©²7x²’õnY¥7ƒÒyÙ%«nKtƒíá]‹ùü_aƒÉ)=R™÷ˆmåš âþg*Å|A5`œÜ §,Å.ØK‹vÅÓòGù.UŽî.VRÃî õ…ÈëµµJN«î¨`Uñ{vQÉF§¬¶>»Òy‰œJ•t6,Öñ,(R“È?R5o\6—\CéË%Ayœ[Œùù_aäÍ 1 õTKÙ}Ô_#•7¢¶6YPíö¯DË×ÄL3°,I~ö…ú¢¯–k\¡Y­ •"ùí—Ç£Y.¼íRù3cŠcÎìÂíD(43#)o+£An¡Éãìç6°²\Ãt2®µõ3xò ©ƒ~ zY"—žTþŠoÝ’§»`éÇ` klµÞ,¬½ ìÀÖÏ.Àz0ZŰî »é âîPæƒ4s4'RMY]€<< QZȉšA˜ßçÄ7÷„á—2@¶9 –IÜQNð7AÇÅ–I=ÏÉ ù:ì@™ÖÊl(s%@™ïóà5<ë~ŸßÇS80§5†j•5T»º@µ× cœ¨Ôª”¶Z_qPòUh>3hšžC,÷Eê/€óŽåPè½9xßüÚ:¢"€Àk €ï»<ÀÇó)Àsž °ãë°aþó-×ç†ëðÿ$ê¾÷zÀ†´ Ðåhl;?!6 úÁ^¹e ‹‹§NùY :d4©÷™ÇìÒá¬mÝzírý†ÂŽü =zÿÔÁqZÒ~ ¿g$ÀHlÊ0ÇßèM@ð«?{G ]¼á˜è”îOwÓÛ É®<%“Œ4e^^j.¼ds£ÆÇëJúu—²o÷y9R—èvµRÓ˜çÂÙvW»ƒ·Gß;Ýi;è?䥤 Õì< +åßû|…Þ ùŸÝËD¯¼Äã€LC$ < dÒo6f¢RÝ'R£t)IúŸ>I&.Ÿå§Þ6á»OÏL4-„Â#åaeIøêâ³pŽð‡û[8½n›F‚»rR¾zõ„ºœJ6yjœï½iä¼n9“ý Ð}اtó{ÊQô¿Ç9(ÈÈ™Èܼ,ÈÜ3ío\MOÊz»ÕóVúQwçªü  %Bf™*ÝWи#؃¾mö(ÃS¨ˆ12/auU?€»nÏïYØfü×Á,ûL¾_>ðb”ß)³.±=½ Øo€}~„^2ã ÅŒd2ÒÎYB~€ì(“‡èÓ‰²ê+±.ÝafEL×~Ðíç&LmÖçÛ6'<‚ýµò²Ÿ<~-œ_…ËÜkg=ÚQ§i0gÖq*øIi7ò™qzåuMù~àçVz/®WPÜVÌ»ãô“pžcqì:#¥?Ͱ[Ì+ “*OA|Ïßµèû^¿|â_ft\¯¤{Që5T®è7±Ì΂¼ ÜËHOIæv´_»§¿ð§0æ÷Ö3ó;—?®¶ß ½ÏÆýšvÇ[(ÜqCynŒ–:ÏŘX³T]¡™cj)(Æû7¼ŠB™ÜZýSeüVH„Ʀõ1 ÷I>¾M©zÔ~¬Ú!Ê!\àoùp—É©Õz[þŠ®½ž‘ݰ?ïs'#ÜB²Õ=ÄïªÙMøiT6Í&ÝvìÙH\'ïØ†Ñxª(]WhÕH–Ât‰,rBû3»Ôãdvé¤~ÀGk ,dÏò÷ÐÐ\œ T3û¤l¬ Ó3¾o‹ÖeROõ~°#ËßE‘£½÷Ü[»aƒ]n«s°ÝDEçèÄïÑm ÎxÍ‚ÆgÅEeb¹-“•%1V˜…ô8 çjBogÉ g•ãíc×_³Ä¢²½ØŒ}êù?Ø¿×ý¼ …~ž*ȶ®s#gßÓ8ÙW|ïSÈ£[·ð›¢"ùË}#Ôi•òˆ£Âí‹]_ÞÖ¢Ühc…¦á0tc±†‰åv…7>Ì÷3½áu‘gøh^*’ŸÙ¨Ïfí›§ÕíFáÌ[æh¸4ãwt6i.Ë évôœ:àôø YdX|²Ö{r«Ë÷»¤¼¨½ž­Æ-¹ïKÔçh{ôÄNÎ˧ھ$âŒûX¶yÔfòš«fF+ÜÚ ?Õ]̇:¾™éÝÀ³§7°¬¼ý4縙6Þ¬S0Ò½G{ºÁíÉ6Å&åÃd×Ðáß(¸šuïc¥Ìü 8 <ÈŒ Pè³´‚I(8'Ú?>¼ù¸©búyiv˜Ä2º?§†¥mã¹€³¥ó.ÝØ5ziKé´QæçGm4Ói“®:·Z“öÆøà)ÏHâ`ŠÅd"ÖÒ°ï›Õú8_}(jˆO —ëø}¤Á" þÌ,þïz‘-0tŸÆ ä™ÜùUkï¡;¦®Aeµ N)ݽ‰¥vµk9·™ØÚšÏš­¥¼Œºó‘ÄôíG¯XöYÐM¶C˜r=.a¾¿çFîØ¯öŽú¹ÐyŒ¢›ÕäyI›ž3œFÚñB#gêiøìWûï€ó¦!€,.~«bý5ÈÏëç˜tÌ,îÒúå]LÜû[C»îµdùríU€;ˆ•*-½˜j̯֜¶£æ‡³è®&ŽœR§Âu¦Or\ÇÒÏwl9 6ÑN3Xï2|š÷× YàÙÁ‚µè›Aß°ÔS?çâù‹#Dåôá¯û ËÏ'pp Ðkû%‡™+^¬Íiùp×^žÎwœmØóYíwÇüBËd`¤4#%¦i1™5cl*•Þ4C9âx R½Þí1Ü̆1;u‹—xTס©hq)‚ޓаÈаßîáÕíñøÿ?øÁþ4ÐÙ÷P¨µƒBßË (”¤K”Ê÷v×Û»µ8bsv¾¿v.{÷U*ÝôÖ}/ÕÐ$fa䕬…Ô ‘ZÓl.5YÝûiE3OsmHKŠ-–zÕVÊÖÀòa„ßåœ×NKƒÂº* ŠpÐ (zaúÒq°ü;@†yJ {ºNAž>ºO ô6³,h§Î± ×JÆIænÊOÜMç}¿¬¼t9™ß¶4jÏÊó‚ÉÂêTj·›c s˜QX¬rZ«ã‰ƒÕ¸«ª<–(¸€Êyí¼¯y÷"Vùç»?9°¥þäÎ Þë¬? i¯ûбÊô½ß‘¡¥MÝÜà¼4§¥z“}1ã(‡²0»I½±rðÂê¸,]ƒÇÌ|—ÒV:ÅÓƒ²(ý`ãK­ÂL “[ÄÖ¼%¨¸Y–e?ޤ¡½°ÄZc¼é“åñIhå옟S9ˆ§Èϵù‚]òž@Åp­…Øÿ†ï7ïA UJVô:®Œsœ=ðþöÞ§sGÜ‘§ü`ÓOöJÝý|êÛ7ë=€!belRÒÔüèñ:”‡àÒ \´k+‡Ó•‹t؃³=è²4ýÁ„6Þ^òlŠõ{Ý—ðà\æ˜á\vÝãÜŽ8ƒ¸z]/íõºË×á7€l™Q@îÞ±¯AiËj£ãåÝ ·›>vÝÍçc‰pE–¦Êt1„+;ÙrgO¢É9óIëd£BhLvYôîXU‘÷zSº¼pZœL^ˆªÌ/ùö¸Ç=ˆ'¼*û®6ïÝœ±Å;GJb:ÇVËêË«-ÌÄ%+òºÒðzø Ї†ê3ª+óÍQmï°¹Ò»ûQ§]6[k¯Uœ[V‚çp6«3 UÐôØëÜtC³^ ÓÉrÐ+•ST’t‡¯÷£÷§%Ì5·ËwóšÄíØâ°ëQ9«3øä¶ìµÙØêÌA™;ö˜;K̽>wÙ*{õÙjÝó~ÈåwÃ,ö&ÔíìÈý•Rîüý!×û›Z]VËRkö* }«7+N¦ÇÄqÆZæ¤-eñ1 Ö.PŠÓ&Õ¥U¶oB²çN4'•%¾[86l Œ Õ¦Ë[éJÛÕ38¢[G˜$½Õ¦PwŸn ¢_ñµ†òÙF^õÃqÁÔ¶­jXsðW^V®qÑ~o·U Gޏ"ŸNËÁ˜,5lm¥mvƒÌ¿È×þø)FmôÓ§Í Á;!Sèe*Iµ{<í[‘4æØIOU*+4ªN{Ùw¯í”O¤ZŽá7[Î`5mq¯»Óâ‚üñûÓü†àÔ“I_2åÝM*ŽK4 ËŠ¸ÌÚï*•5³íLq2汦n«o^ãHOW} .šãæù Ú¤tÖÔ‹ÇõòƒqÊ…ÉtË ^bCüÜ`ž¹s‡žïb{廓6R|:-¼†Ÿ©]8NQ¢Y&)ÑÊO¨,ÞÛ4½ÅèØôÆò¯8%íUeY'p†ÙtÛ•Üò¼[fftÃÌL°ÁÇÃd´^/ ‰'ÙRKé²$=üpÚžáè­yìÉ¥øÞ½¨³¤3©*(Û<×rLûV®Ñ) §Ûèï·ú)rLÉXwõƒ5âüÜ䲩fñq"›Å“3!/<ØÚ =’•1ø^NBŠîœò+åeâ³ñBÌÌXL,Žhèd)WIÍÊdo#%q°¹µžÚ3®Ìçv0 ®¬u¹<fºIÓ]{žmó½Ü7V›òñÐ<ç¼Q³m\KÎkˆ§ûÖ;g‰Í áò1ûl)ëËtjÅCað|ÈwT{ô­™ðòE ¹Ñ³Èt"XúzÐΙ´ÅÌdÖÊ?e‡*Þ¡YË÷®ätØÖ¸ó®')…¨}0¥TëŠV«º ¯ý*Naã¬"îzN%+‚²_§²ò84ÊKÓ “ß°¨¹—·¹e±x<í*ÑP ü»<ÕÏ.ÜèÔÃ:O-E2ç@ÓBvÂA¯ôGtŸÒÈ’Ú¬%ïÙLEF£fu6»û>Î?ßVÝÑÜ«â÷Õµ"‘»çwëjªt^>óß³VÉâXèòÅ:±Ò ¡—^ ¥s.4 ÇO¡YLãðƒý{ý·ÏÇã{·ÝÞþ&×8 ¼49wB{¸e>j„и·!ZjEÉ5«V" ¯×“­OÖ>Þº]u5•©ì'WÉF¬P.$uù»§—­‹SŸ`"jšÙú:o«ì!· ·ìçn¿³ë)(d¹fû»kuÜ˸³ó"ÿ†ÉÈC ¸<©¦ Bv³¤ŽÑæ]+v­B0¿5Ç”òlØÝOTg‰sRCN‹Oe?–Óe•j@IL†(Ö‘k¦`§|Þ–W¥\ršWslÙjd¹úʸ¦ÞÉà/«Od?ó!î¯ï0NÆ‹Xf‹wýâ0MJ¥üoˆ¸kd÷fÚêñµâ1¨Ývêú@GD 4Gäm‹ñ‚ïÓµˆ‘u¢òg€pV¦Ÿ‚ø)•K"ü·¥U ØKÞ·!@ˆfa|Ryd’ÍíH$xÃľÀ_¢ÕÃþÅÏÿwý?¡I†…òF@O`H΄ÐvÏ q;ЙÖhß—šù˜ aŽ‚øÃ @Ö›ªÓp½Ç³L ½ï¾>Øì8€ð˜ 1˜D@OÂ3q‰%òÚ硲¬5Àc¿LÿÆì7D?QДU(ó4áÖˆS8û[úÀÔì `œZº¦zI ½õ² PFÜ4kùœ^y ( {è(Ö V4@œ+Mi1™%®€ž_{9Åþ°øŽ I‡øÁž["žåðGqÇálŠþØçw(Ô¢¨q+l•ìmÏžEŽÊ`¡[˜ñdFÁ4Ãøù·\øÖ“uïPñý([#Zï!,2q+&'!!ÊéáK—ÌX5åÃóürÂh¼^&êafŽ‡Ï·‚‡öª‹ßÙáù`^ùmZÆZK Šå£ðL{ðQ¸øœ9C¸)€‹Ï2Às…À0?ÅLk %{~Ò½ðuX{à%7C,>Ž‚\<È<+Ï‹ò$Ÿ#a¡Å*ÛZ?ºõ‡ã¨îœ0Ö^—;Xåã{ÊÆ‘„è ûh < är³ŸßÐa Êì˜,Tˆ ßM¬c@”j ¨yð­Žò8 œ¬|Ïw“}n¨½„ËWvŸ:ñ9F÷.Fa’<"E”LäÂWºX éV®q Û¹wXM¾§Slƒ²w=ÉÇe Þç‘~~°ÓD3ÀÑœ4_Þ»t‹~—z8t ëý?ËÂQ\@<¢Ȥy'«þRúÜý~d´ÑÃN ³p´]Ø/+§x¼§¯¹ûϯ`ÇeÒA?.e®]-]óÓy<ûÜùZ1‡§ilü—t;zïÞíá¥E'>ôüA´ß5;Ñ.¸ß~Ã×_rà•¸ T•q,›ßóbw߆ ³\ᯌ=£Ç{Ñx´A¹;ØM¼ êL¤ª<»ª½¹ oyï¬;¯ë‰d6áÑ26‰ÿº¬æøY˜½®”sÍK_ðî¯N§û,âmwypºnËéÍÝÕùámsºc­?çß°ÉÊ¡@¨k*Tf sûVm+0O+ó4ì—è‰D¸Òê…ÛŽ:6¯Ç˜ê\*ÑI<5MrSìdê}žç…‡îAHÛþ~_Ö®û¬¤=w…úÙw“¬d W?Öû›éu1sZ†{XÏãóuõé¯/?ت멧%ÿ¬û¿`7 ëОŸd“ÐÍü{º©—¨3|6³Q®§âç–u¶è%@óÅS ç~gæ¶= ‘øýA&”l§¾ŽúVóg–Ä“õ&¼÷w›f¡vl¡ÿX'ËajͦWùÕºQKWèKütqÙçþâqœsV)Éûß{üØþúK“킌TÖ@¶u_| õãñ©t~°ýr“’gx¹Õ¸÷q1좿]ä÷ž[¬ïJβíÞk}~cÎ0Ù™É×ÑzÙZ™+'7\®Ðž²] ZH†øøÁæ~l§çÅjPžik]²ohdÛu½±·Œ00ãî{gÎûö7\¸µa¨Ü?{Ų.¶¹îÒâÝõpï+øþ:rÆ0‚=‚Ûìî þì‹… ¾­9“ÂÆò3õõû¶¢×iKì-w¹¬´8ÄOm~ôÜé¼ø\,f•›±µë'íd™åulÆÒƒ0Û'¡m,ÛÈØèCÇH¦»i¯!B¯œ¢ãü8¥h@„ þ»WlrHuùºh½í£cˆëà4ܯO¯ÕÍñv8vÜúJä>¤õÇI>±æ«´Üãx}¡> -6¤5nV=×E»±D‡eƆI‹‡…±\_öSg{ ¦è‡øLúܨ2É”Xu|x‹±<ÿlÆy1qôS6Xÿ84 djgáûm?CcÒËx²Ì¬ï;!±®5¶i‘м8ä?§ÃvŠdošâ^kÔ^¥—’UÈÌÏëui6ΰ ›´S´™äÎx¿F’‘ö;ÚÛRÖ$3ͯÆy»êÿ`úàÖ‹Fׯ)7ÒGU/ub¼Öîp8hSZXþ@+ ȈÏ>ÈnNS[É«'åìf7ebë§d4xb„™;ý¢l`Æ÷ ö§õ¦–‹–²Üó‹âö£ÚÌY¶u+›lnBȼAOqë=àIú)Úè£k°šk÷ã|«‘Ø)ZR ¶ynØê§ƒ!–_,þàû÷ú_‚kB¡pÙè>}]Üü,ä áèbdý#òÌ‹‡"\3¶ä½¼tÖ©±·‚kÿmQÚT_³g¤-:pérSaž)ÿ`“\áDŽ ÀbF%öµP"Ãg¯f¦æ ˜µrQW±ŸR»»£"cJƒpæÛ?˜ýèC”™Ôd#ÓÆöXÞÃÁeºî±'6gü}råwc_Ô6‹M`¯ñ]e»8WÌËlªßÖ¼JÃI–éi+ããôZÐG„^Áp¤¥5%¼;h(«Ÿ»?V‘³¿PðÛö¾¼Ÿò‰œ³¤,q¯,õú6Ä`öWÂWÙ?U±¤8ôÆW=Û N "jùîi×>¥³m^ ŠÃíéÒ¿ú˸Ó;Ú­õêf"ùO<ëÚg|bÒ˜^Õ¬œ¥[åáLÿƒê2*w7ú ¡Išœ“%[ROëƒxÁ“HÔn~UÔîSYÔ´ ‘·ÅK­ñ`&þ×'x£²CEÚoƒ¿HÔ8"›aÃËùæn"féÍr²ï¯‰7^ŒÃÒŽËØÞ\ÏÄËtßòãs©™è5ÒKk–Ü%†t‚0uS´«Êö­¶eÙn÷¤\QÅ*Ný‰ÄºÂÃ1n‚9ä ‚©ÕúÂã|2 ^v¿¼­ß݆öåç½ÅÛ”Cûf%—ûÖ“K…O1Kª‡'\wŸ »¹ÂvÞQGè±S¬.Ó"ìÐN1—vŠ)Æè¨¬ø+àôŽwƒRæTôáì˜ÙWFjÖ¥5"óƒ­Ej€,Æh›µ‘LÅBŽ/vê«se\;g -éWƒÍ3Þ)ÞI>Ë¥Ïû.Néù«OÙ¿Ê¢×ÛŠ\ߘ‘Ý|uÐé” #…­V–3™€Ó ÷Æ4ŠÍ4ÐDec0õ9ý qþÞÙ"±±5•fÆÁœ ²,«© ò#`nsznzd¦Ôxü&y °{mà†u蕊;n¤`O{b®Â‚>øî=|˜B»~ö˜ï ·³«¯L†!Û#‘¶–£ çî]{ö|»n·™êGn3YÆø ?ØŸæ–ÛFИWŸØïl“f—ÈòŸ™-³ŸKÇ“Ñ*@õ¨’Tµe²gý9')ƒYj"M†“E6ȸBÊÛù½­0 89MÆÝâüóaoÍ#Ì+™}©ÒöÓi·à(¶S 0mqv{ÛBÛá«…Ò!E¹aK¦Üµ>¥N1~Ã¥¡ñ¹C!æ0—nÝЕÂ?sòf&憟Ð_Fžò1r2ÜÍŒê½* 9@SœøL;á“¢ ž§ßKγçÛî°£œ:Õ¤vglÂP/k¿§B;mªÕ{Wú”ˆ°“¦',6M%S{6=±Ký`M9ÜÈͼzŸ’'Ôû>¯¯ñ­YH¡ëþ«ù™‡íebqú;š\îü}ÄÔƒ›êR(Wm 5µQ¡¿8õ›Z§ùž4Ï °îùy2;ãåjÍ6ùái³Ý Íö˜g›Ûé–À5s”Ôo7š¾7î5‹_'µQÖ!+ô."+ŒG’•\CjNÒSã7ü`ûJµ‚:›Ô$½ÐíåËZÏ_i)#B9÷¢újý"5O‡«ÐsF!ß¿îÒ½üúUé^û/º3-D"KÝN:ý¶V6^Ì7mÌÔýVf®Ü(ù3Í!jÃÞ'¯£ Þ¸O“ncÚìŽêÑvçÔ-‘~Ô-‰nÔ­úV¨SÎE«½¨Ûô7l–‹ezYF¶/›ÅÓé ÊßFsvr¨/57¸"ó;,säÊa?îÖâ)Æ>WÓ³Ð,Šæ:ׯ^jårʘRú¼©éʆ BýHÖ¹Õ£Ñ컩ºíùh¨;ãûµ}2«œßð ^©*:ØÂÌ¢Š¶rr-³úoXå½Gb'ÃÌcz¤»Áè5öÿÑ(Æ|gÇgú«Mgz¨¹,]¥ßL§«dhŒ+­CÄSÔ`Ñê4«ƒ2Œ`Ɇ^P懜Ô_\kV{÷këZçÞõªR¹U1wõ©ˆD+{J¶YÎ?±tr#«4ì÷ýR9Š×ðÐ*^ÿfVT‚ù‹!Áüvôb'Õ'÷GcÏ«ZûÌçto8¼´³ílŠ:çq¢©_“"9ý|êÖåÙ†ùrЩqÈY¨ Ä^®ì'çQ%f¹øó’Æn1p˜¿Â=ò(‡æŸÇE%o>|»ÌsIpZæ“Æ9Ç6®èo0‰æô¦›dÕTØ¢¶=^mXëèÎZ{û6¡ÊƒÂù{,S‹myÕY"ùÔÓ«âÁ![öÍI¾tž÷KÅ`MW‹u”& FŸnçm¥ÚÉ%ç†c+´šåiƵF« žŽÄ~™{Rgôݵzià¾[ä~0Øhƒß0n´‚ó@œ‚ƒ—«î?[0$jåˆí˜l gF}!äœrŒ÷•½îÊjsà—4ºw.Ž»TPhé{¾»Ã~ɱ¥Ý3»Ö7I ÝT „h;‹û«E W»gÓ„€Å*™‚ŒŽÞ@ë…Ý /X€£@šUû m€d‡ß]ŠÈüÍdÑ!Ì @¤›Nóü$ ÒÑ¥ ÒnŽi[R@Z[ÏH÷³;æ Òôð± ü¦ÿ‚™·AšmÀy 6³D¼éNýœ`CâüÚ•ÀùÕßO_œHû *Îë¹¾ZIò€â} âhäF¸9Hw€L¶è÷^ºh …6¼wÄ€ô3°@ú‚;ŒÒ[å ±z‚ôìúéy6ÁW v4H/:Äa‘ð©Çî%–âSìé·K¬Ô—8ï›p*VpŒýiþþtËÙyJÿlaΧ> »h{ý(p€Ü›ð†Vã@”ý 2ƒõ­1Å#Ä*üÞ zJ‚!D+1…ƒEÏå/qð=ZG¸Ï¡1ð£k,_"}Ö¹D5ºqyÜïØù7„VŠÝ¡ÌažúÖ`O0ÄòßýËv0dáôü­ƒÏêY€öU Õ½w¢Ä/Ï!”=@Ö«kÂÇV˜à³]òÚWýôK¼?³¯¬‘­Ä~³ÛŽ 3KŒ‚®÷ÍÅBᾟ“·¶N÷ó=z—û¢¼ºÜ™`zþâò@S®ªPcº°t§0ùИ×Övw×[=Sk ÀšZ`èþ{²1º}öb ç[éüœÅGâéÄÅÎÓ{ž£ÏõYi}Qpƒ‰ÐxRG£zCÈ? k\4[A7lwjã{ªÌ,oh®µ„^ítÝo?§«ÔOß[ûðƒý{ýИ»ïFÛ**(€½Ñ>Àûöô{>´p±uxMÉÎXä_JF#ã’Öì<«¢5ÊèèaJ„Æá„3ªx¸=ÇØ}Yk>î)ÆÝœb½qÿ®;ÝRÖüõ¨à<ᄊ È ‚L2ˆâ* úþûœ{ú®Z}ÿ|¡ºº–›„$;) ÎFýº=‘‹‡¡ì™-aÊ1œÕíàN½ „îAeç0ܳÿ$-°V v ä{ë÷}IÅÂmc'-‚Ò%)߸׳iòéÔïÈ@ìEïÃrZ— ³9ayÝç»Êµ4l›ZlìÎÁ±œÍvtZRí×Qdá\p¿õ`?pÿ V…г­œæ…’ã–Š¾½÷<ÓÚÓ´dî«Õ…ñ‹ì‚Ìeß7òé8-ÖÕÅ÷õƒJZ ¤]R¹(çX,&á]½ò¯ÈÒK…:³uååЕzgnÓŸ¶<;öJ1 bG8è-Köߢcú“£³÷¶x uº»ûj%ï–8ª½¯nʹ bÑioÊæ¶ktûÁ¸[©oô¿ü€³Êl·S¨(wSèÙš¤Eëʦ¥©&~e¿‹Åø³»½Êw»ûõðìë>…@ÝQ•Z«´üi’"S—Ô5rïßdn_«‹Ò¸ãæ¢î\|Ùqà¼l¥Yð°~ ²‘š=¶Æ­'kN§ÕØnSÕ ˆP1 È“ÿE Š£,Ì™ÝM‹Ìw—±SæÒ’«k?àó²G6÷ñ„Ñýu7/w]:rÅOìÍ!p+l·´¯K-çz:ö8ÝŽ·½‡2³Õ¦ÄX %‰ÖØ–4Ó|)ޱýèGƒ°s鯥¶~(?²F¯ÉݕƽÚk­©—$õJ‚â¿HAoÒJ¡Ó½—o‘–²…NZnúê#žž¤Ú?W—f„¯ƒW Ÿ˜ÝöîÂ.»K=}þ€N·'öÓ€‹VÊå0>uÌBß³¹Šm\S¥õƒÊ/õZªjßuvêUIBNg²ž|Ær|"XYåQ¹Õ:I áËò/Y¦ô-²6gÛÙuYèÿÙgLKÉ”{ñÀtu³ŒÖâš-©ãp¥³þlúY»µíÌÜÁÌó°Ej“«ev±‰ëÒǘ3³â†µê:[:Ú ‡jˆ†ø¨Ü­ô…`%™`³Þ\ |*Y÷VO*àê\Ü×¥8»œø/œXöY›pÖæ$- É÷^Fo焊¬å0§»¸p°IºLª.wÐìħ+O]Æþ"D›ê3ë /Ì©"BÊ£‚×å端ӈ¬'õ!á¥#µXt&ΊΆ1!Xà í¥Ù§õçŒ]žw}æËâ)¤î²@³QZº–É畉©[õÐ˲õíõ…3…^øÓ´r ¥~[—½jÔ¯e#L¯’öm“‘1s—ØMd­› exÄœµu }i6/b9îÞ…õJ—×›çoð¦ÊÅõu‡}½™óÉó$“K׫ÅÖø8 (/¼Pëf¼‰p5ªä´ÿIZì¥Y ‚ƒÞ>›IëÜñòÅ 7^Až¯µÀýå‘–·IÃîXÄr„5(¢µH‹Šªª $uKš×wî¸ zÝ@àÝÇuÙ(.¾6Ùu æcÖ›L^-XÄiòØ_R‡æÚ¢j"t£j&ÔÎP0jñŽæ_fSzÍ‘õ¡Bç{¿åÞ_™)\8Žë¼OZy—3žù]o#ƒöôƒ7ͲYêÂ]š©ÈôÃËÓ*#KóÛ}³ Þó­Ðn¾=þn›'Nƒ§7ÝåŸ –Mx‹™r¯Ñ•Ž×ý)†=OIž¼³ókÐÙÌWìá:_qnc¾â4C˜Í¯'ýÄ/²)¨¿8í_ZÄ'ä`ðjÅ'°»«÷vÃŽòV±VÀ Ïù}­N1ùÃÒ>©¯Vdz¡ í¸aòJ6q# Ø\½|]ì¼kL{Šõ¡ØÎ²D.l{.–ÙÑL.ˆñœŸeB+S'B«ÌªɈxÒÓläÿÄüYêtîzÒ­äŠøóøóÞ_«ÖÛVZ/ˉ¼Ä`ÂmQïlXÙÜòãõŒ^‘"ÓxaUZÊ|–Õì§!m¿ûÉVÏ_­øLW·ê¼ ³d &ÐìQî6ˆW¡‹àïNâ“©,á¹BÝÇì}¡ˆç@Ás„ã¢ùO²>„v²d+‹Àz©WMÝd×»¢/Ûz†³â̺Hôrê¨QnÈ…“;bˆ aÿÌòÏÚDäà¢13˜´å´§N]7 …+Î{xçI¼>`?sU<åz? žJø”lá´>Ýi)zBÓÒéMÉr‚ÿìiI_õ/¼šÏÀé'Ù Gæ¹ÝØÀÃô¦óP€è¢jŸK*ã¾Sþ%Ú㻫6UœðÏ·Hq@òÌ4e:ÀÆÕ¯ÛùZy3Õž‰ÞŠq¬öü`³â£<-oð„)‚zš x´¹ÝmѦ³Ë£MmØA¹çC¹³;ýÿ¿¸'P»z|²‹··h¹/'v‡O» ›s^T}L21"biÁÏ Ü,6ø×Ùp¹ÓgJö…¡Ù·"£6¤Ìœcfר˜íàÕ?b»u!šÒ­0°ÕK]B—ÖX¬¼ÑÑh³#òì‘\ô€ÑúuFëÈšd¸Øhí[Ó_„T‰öúOUþ€[Ô®<à„GšÒ0O24ûø"¹Wá&R>±ì2ëLGíÅ}©ëXš‘=­ÇÍ’îG"¦ÔZÃ!µ±Ò§•¥ jzA/FúGÊ )KcøRJãp8ºNä½ MÄìºoĬamÄÌ;(bÄ.ö/Ϋë5÷ŸªTWý§UŒŒ».‹2e@<)«ýR}U|ή"¶h6òÙ˜\ßãÍ2l„ÊûC%¦ëzË'lÙÒpd.Ù¤GE(û$P€ff}Ü"p¿†`~3Ƨl`Ñ“6I-Ñ.ƒ)?àx0ï[£Ñ¢ã'³zˆàtë=˜s£JßsÙ~¿Z È^ð˜é=V…ã;»6zõw9[ Kåi÷¼ÈO~‘–‡d»¹×Ÿ«N"õu1Ïßý±âç È@gÇ5Ö¤að¸™wÂv6ü ©—;Lnå)Ú8pFho¯£„a˜ág9‡ùE_Cˆê Èl%×_ÀtxVÔʯÙg=§® }`#·p¨«@‘ò6C¸d¼Þ:Ì¿HsùS)Í->å4gÕjiî0m§¹5ÙOsÌOsxi™æs3^v.ðLͤ˜+­ñÌæ—;d Л±–2zÆÇIE/û™…p˸|R€™62¢I °ÝEb7hñµÏ•WÑj¯_ÅuU~zýÜú‹ü‹ïNoïZÌÂ+g~zš//Ú[$͹yš F«4gvšcÓsšCúišƒ–Ù©Aa7ÒJö¡éŒNp-d”Œ•즀Oœ2ôÇ÷\üO>d3±™húÚé óô,PxVë %fg‘üE‰E_‰ëéVþEš“’b\Nó$YKó‚Òþî‚Óü_¤yJûžK¾swÒ|®uIsGææ¶AVó|¶òÏñXVé³5“q’ÒÜ0ÑÓܨ¹Í z˜Øoÿ™àV¾ðÚàÆÓ/ h|¬éÔc™êË{4Ù*wñ!d³Ø½«ÊíŒÿIš»AY ä8 ô¢dõùòá´€|·—ƒM ÐSMóakŸæ &Jó´—Kó= ‘ækè0Íç×ó„®Ù0SGz‘]K{•ëé+7÷¹æOÏjÚ¼ÅÜIãfN-?`(Fî½*4‹^I™Æš¾ïy%œÖÝu8ퟔ0wÞ¬‘æÇ½ï;…ó®’ûzZØ6ziá¡é2-œúzZPW~Zº÷´P*€/wûl¼Ê×gÿY ïdÜÜücâ–‹Ú]Ê.º{O︷xŒnˆÅÜÀ(Á‚|4Þw:a~=îÐrÆ\ʵ>/Nuétj>ÅSsµŽ×Žö›¬‘§¥,B= Ó¾ÔRpÂ")(Þ¿w/£«”T3{‡Ãø¢éUø¬'³ô²]è~W·g¿Ô¿ —ÕI´ñK³È—˜ÐrÚ«0Ÿ6”«cŒÌk1‡ï/î6›—+÷:3t»~¼^Ã`-ÈÃpÜàýôà|´wä~@ÏRæ_¤Ëµ÷å,ÆF3ÃÝ(…Ú-2…Fk1;ºšOŽîox·×\##ž§¡íÁën‹4.ÞªÖ½T‚Úè<×wìÄ¿?ÔQÌߨà>¼®‚¾k-ŸwC9ùFQy{v¯ »³´9ÝSæb >‹]]?PÎylý“´€KŬDßÖÃy+…–À8…²óN¡çI|ò3T¾ÇúN‹¬RÛ !äå_¬ž.käyìzÙXñ"¼âa´²¾Ø]?#'mÜÝYí– ;aOvʾòœpÇbý«s>ß+[q]زV'¬ç»HZš‘έÑ$œ™ïœGü"-û,P±Tùn‡vÒb¡?I‹Ø†zÕMŠ»?Y› ³w9$Òú<­È¼ éjï[PýäëûÝ%çÞ{ï›>´;ªzu×uت ²i²ín$ÒV·^¸¯ZZºæ]¾Ìûnàª1ÞÌïm|S²¸îã öþ)~‘Uæ% 4lWþ»Ê̲@o'êqOÎD„/^Ó ËM‰ã ´Y£%zEr§ï™åd·kåKG¾>¢mÏÞ¿lååf«WK¿©eóSX5Íé|Ý7¶æ5ÀX%7äÐtßH }1%/Z¶d)©—hÚWá7U¢˜˜(’Š ŠäL'¿HAê]J¡!]O‹ýÊ÷wIÅÛzúj̇ӛÙ(õ/Gº/øø5Å\Z»å¼$nïŠoذØY¨Ð Llú‰ŒÙðúܸ´èÂ(êµÑи»ÑS¯ƒÝD……€R¤; ý€r<Àö2²)ëM…i­ÇÁ •>ò•¬5ú)èUË)äÍ´¸î ^Á³?z ¶’S¢v||úEû¸·ÝZƒ:Ñ.—eãö‹“8k"×Öfá}26¿ÚéÁ=hg¤©aˆÕžË)ýQT”UéÑ\'§×@úxLÂj%VtxÚgíV¼rÍ]mEaÅÁªR¯ ¿ _²ûSü%Óv9-æƒVV•èàföÍò¥Ùá>'éÕû¬– ¸Š®íàص“‰>±ò•&emw©‡¨¬-€¡Šúy¯ ê˃¬ÍÙ,ç_½ÑS²[0 h¸,‰ZkEmà¡$)Ôñ½¼äÝÁqÙÁ"véNŒ/æÄÞ¿H¡Ö ³wnÆQnR»ÝÅë<ª¥k|øœ6OÏÝö“Ýõù†¶Ã¡Ò´ò׿À(k®sÎp¡F÷çJQÆ¢,Îs=ñ«{ W8_ùáŠÆ•§ÀŽW¹åy½®ò¡¦vùNäN9¹ ? ×ê{ö¹çr¬F¾Z¬¶j÷¾tÿEÖÏ'Y RÚŠ¶í\z†ÙÚ7Bþæ»õh†Ï§ïë9Ë®"Uƒ²®]_`Y¦¤ÞŒ© {™]›Ï¶(“£"’ˆi­•Å^àÀñq¹üÀ7^§;òæsá|XDÂâ* >+ßkXygw¦5_OšKŒo“.=Љöj˜ % ù JYë#S}‹úû§Ùè“zuÚ/¹_î8÷ž,€=Û©õ|¥^ý…ç‰ë6©‹g“RsGM&›{)k%¬5•û(Ç}.]Ù˜üWÂ,Ý:¦N|Þ8Ý0¾~¦õ§WBCIlŒï*›¥ Æ<[‘*ƒÙØt9¤ 7ÖƒÙkd÷©ÛäÔ úrÒ«kZ—ÿŒÆÝ%Pºü=‰º-Í2ØNQÕÎ5Á~³‹„óÅrÌÑYeÁW&ÎÁ¹ `ð›ECf*ìtI†<Ï?‰UÏájÚøT¬‰€a'´WBc¤†çFãÖ¤œ]c¦8o#[e2ì7ƒÉ  L¨~õ5zܘ6º&:Ñ.ˆ;½rµ?ÚVؾ?¶ã+jWŽ/ÏùDxOf£$éáçQ] ­­¼šá)vîñ€Rr¹þ!)•ûu´Ñêµðê »Ú·§;]lZŽç{­b÷umºq#Ë`›•Ù8ߊ\µQu¸~î^Fõ–’51ËÝkp·­Ê½bTä5¨¢Í^eÔv¸ÊÖƒrj½^åTnæ!oÕØ]­ÐŠÍNý¤"a±&œîf9 =´)Úo,¤ƒLø~‹ø¤Ý¦_D„f•FÖ†25êË„ÜÕ"JjÝ»V²ÿ¬"`œ«èä§T~ßkÍò#¥íž#J|Ìòä¢ Œ¶EÒnÅ27)A‡æ)ÃC‹7âgl¿›×þ–³§ó ݾHò,oœV“°ÿd²‰0Â{—um ´×¤ú»v}y)¿÷ô*µU5vËruX)ë´þ1ËXû¶-9ÒÍ-Añ-(RÃøZ,¿¡b¦å7xr:ÈϘfáêYÃB§“ùÛ‰Pók> rqÔMrª¤Wr꺊ä†ýy¶ûSü…GßšI_X_MÓXœ¶‚?Äܬ'¬{“¶… ý³[Õ»ÓnV’uqR¶ø/9â,A3],'ÆbPO¶,€ }ÉÒäÃV‹óf†ÖÏ8£ÉO‰äC´²Ÿ f«Œ–;Ég6Î~Œÿ€ÉgIf³X’—È R“'UœNŸdŠLŸe£ùORÀ!?i./dô¬\š«9…ì˸šÏ^?v‘Ë#Ÿã’žeÜM>;úž Pø$Ÿû¨œ!·3ÎÃäó(`2ƒâ36댛‘|bØË¢$Ÿ^ ¯bîÓxVŠP?®wkèãô(c^þd°1öh5NÓ?ü€³ ¸wš[8@š“Ü/×,P«×Hski˜¥†2Í5ª«x}÷Á÷Æ!6À#V£üw¼žÙZ$èÂ8c8KìêŒI°#Ÿõ—¤À©òk×t×ìïŸ^:?+ <ÎèºvY§wï\®Ó›\ÞLoýà ‹ž 5´:ú›47U²0}?«Ï÷ Hóp³˜æÇRû»;:~MÒ|¥M§¹;»Ns¶·Mspúîƒ?ûÊ‚ Ø‘ë¯9+wžÞECž´°›>«å`³L°ˆõ»ð8_ Êc)t¬{x›î¢u}Ýd±¾ëEø 'Ëzµ£ vÅ%»‚Ýûô²{¿ÉbÜ¿Ó|;Ê à¿[·à£› Á4Í_E6Ío%ÍÓÅÝkÿzžž Æ»ÅÇÝùµËÅôÁG;ö«÷H}uîÝôÜRnrÄ9"z©E¤G«ðm̵М»0w¢Ë^g_™·O\g4< ƒÒ(F>tß&rx˜Òà/?àŸâ¿1ê¹4 ÒëW¿O d|·—•OŠT ?ë0®?VóªsïçsÁ IÞ·hÓÍ¥¡ÕH ažL*W§Rn_!ê]\°9¾”IÿÏ‹C> ˆpjÎúQð·^ÐÓJo?™6«Þgw½©W¸N%î»Dpê»PvEüâ¿6ºï´`+…¬‚õ¤ÅïÝËá컟ìjô#Œ^‹ÛÓS„M¦jXçâ•¡Ã9ÈÂÓ)ŸÇ•â|‚ÛÕƒ~gW=¨¬Ýò“Ë®ïo„pâ}²µ¥‡5ÞË_0Ããh_+…]½ÜÉÖ•N«^él¯g ³]ñwxÛií_¤ùW5 TžR°¿w^6S0Ý!/ÿhLÒ2šDo™^÷ã+y>¶yî+R0úa{YváOêÆÑÃKbäî¦Ë—[T9`ï õÒ¾"*õó0»Î¹iŽþú ·a·ºÚvÖ±ûð²†ÇvÙ4𣶠¬JMÃ†ß »Eõ_|ïèÆGYeÞ—Ÿÿîáµ–­âÃA Èj~ZײÀw³åÐ9èùÙ°²p÷üKÜû“£¾;6uÛ¹TßiãÂe+êÜþ„·=èó ¥iëÚh¦Ñ6 鄚@ü¡ |4U7;óêÞ)èÕ6×ÐX ©k^³ú/²æž¿SÝY„“j ©FëUÏMZ· /‡=ûý.ù–]j¹®ä#ûšÇáŽÔè­tø¬ldä(–.9¶iòk×Ìyë“AäV·Íá“MiµÌëô]«idžÑÑØKŠ©—N©¶íä H‘Ê,ËüåÁ}]ùÃú%3å_¤ fUé>òY-Î+ñõ²‡nÀd›†3yåb!ò±ýv+&YÚµŒf{Û'•œÎ­w?8š^xàVG‡#º×œ­é몜‡cö‡› ¥áz_2êõÖæÕN½!+½ôµ‘Õîk·N¸×Qú¬7i¼²O(Ÿ},Ã+2à°U™ËIÂ"ñ.BÍèË=/.ùêü)HÉIV•ü è"—óy7;£¶÷·®ãú½‡ëDŠyým}@¼Ìm¿nüœ]Ó¼£†ûêX‘{G\ÖZÛÅÚÈqË5€,d©ÐâŒïW™¥s«wê…YnÙ|S5þj†|§³ÜíR:pkAN¸þøRøîŽfÅ—ü/²6·“„jU³ª»ÁQ~„;‹wm×7æîâq[;js}îß³>z#™—T©Qjɯ龿6Br,Ù[˜Èjl'|è•Ç\y!˜»²P7sÙR7.¿ ­ ·~8/öÙ ‹ìP¬t˜´»¡T: ºc=sX¹ïÑoR0ñ’ÇíVŠÀ ˨ÁÁDiÛ+·_æîÚ"õmŒ@†5=öFY]_ô¦‚½ÔóÎ˺©WÖÓKà¶Œ¬|ø€ ǺJ,Ïï͇ñPàîa]áÕ–ÍŽ Ê1¨áã\Øø(·(ìå&½£Š8u ‹žwõ=ïA=ŸÖþI 5ïïÈÎõ.§¨=ô}ïZûSo»qz¼l?ÅpMÊÖOvúî'»•‡œh»Ï:Ï!ÑÍAU ÞÀB³@!|d¶&ÜC-ÌÙufØ‘}–˜‰¾Ó¸å¹ô…)UígË£ài $«3ɺ½k†ùÎØfWò·H‘B3wt^\°óÈ}ÕÚ­† ÍNÁëÚtΨ´©Ï ­£ž2\á[Ì_¢k” «ÚÅ)/¯Õä¥w«Ç!ÜùÙ1eO™).S bLó4ÙÇÊ_Òy\ÌOdã¤%s¡x)Ï¢E™ELEžEëø<‹d"ÉX¤óö]úMâÎù+=¾žæJv~@·æ?L§O5Ë.«¢Qï¼R;Eyê» ìijTTÛUõ?ËÕøþ¨Uc“cØf,Jî/œ>¦]¸KP‡z•!O%P"›Óª5‡gí`&£ì#âœR$$êáIq·Â“Ò* ²üÌ€SBÙ¯„ÑëÒÀ6GŸñíîzÚvÊ•UsÞgD}Iˆ u0˜Kò„Á-i.uƒï~òêu[†{=åûÏ~ž5ºÏ ƒ¹ZsQÄñ.]«U¯½§d«QóN­‘hC¨ÈÃ7ƒ÷ û¬šyÌêè06}Llw<ÌêÉ û¬¡äüSüå¶I¥è$•ЃWÖ¶³¹eë‰jT稨>:Jžøï¥´›Õ‘x¸ËWÎüÀšÆ¬~> Ø´!Ú³ñ*è]˜\ö^ýït[Gt&W·$¡Aú7EÅÁvàýu:[€i±A´&nR¥'nì3øÛ´Ø:¼¾<¶½k0FBw:äì­6YÙŒN)½è, Tã2¨m lÍC¿K¼ºú7ÏUHAb=-~{B÷¥3hÇôÌV«Íúøl ´~?;hýEhýÈÇ([Us¥…ÏÅw*Ú~·Š#ÛÎ!ˆaTŸ–ªÆÐYXCS}¶âs=j¹îÔ.Ù7 «—½l„qéë…®¹ë˜¼â80—n¥â ᵬ÷˜0>%#P›’ƒ1=YÀˆˆrý©9Úäq-”çHªCÕQ÷¼ÅFÝ‹mºnë:æù%þÃø÷ø,Ô³W~á»í3ÜÚæ~›ºñª‚† Ö‹älÙ'8‡jÃìj®² BwKõHvdì6{Âõ”Øœùløñ+ØŒšS %z?à„ôÆ(?î‘ãUFë6¬ãá‘“#›Ö§ŒŒ#}‚Œ²l€ÖÑï³Ñôñ‹`Ìþ¾e5vöä(ØFÍ›ª:«Ë?àº8ðBçÏX[ë4_œÑIG £&jÌå KÁßpñ‚Û§ðí<ï3õŽÛÒ„¥ÈºÄxî§£ÑÝêçsH*õTP§û–šAAÊC?`×3Gý]ßÞôw`åÔw^³¸ï\ÐÇ/|èn{Î`öÚ™û„s´›¿ÙÈ6®Åzüæø‘ð™Ñâ!¤ÄÊÓ926ħÈD¾}ßf½ròÓ…h„N‘_¨°â²¥ L–GŠ€4‡¯Ûx€¼Ï½)’óáÅY\8=Ÿö£^õT»G~tKOíÇ {„Wq—=`÷/?ü€Šý²J‡(‰€ˆu×ÎÎÖ•ƒb õ+µñ¼ÇÌ«.O+Vçz|\:+žÈw:­W¯Ó)=eøfÍðÙÜáuÿÍö5]³ìJ{­o¬õÎNU!ZV³ŠéÀ‹nÆC|† #dZ ­ñý^ŒY?i{e9|ÃÑf˜ë?ö®ç΃ݧô”°ê»_—¡ë7ëÝK éw¢Öëté ËÇ­Þ~µrA[ Ù´=’JÙJ<Ë%¡õ®o¼–¡¹×–±<ܾÜÿb‡¯w„üV¶áfuY/eîC˜KúäoÈY*SŒæƒñƒÊ·¨6lôÅÙ ¿ð,¢wê&YžÜãâžÞk:’Û]õsçFïÞñøÕæ­#a¹ÕÞLÆÃÖg+P- :®›Ýp›Ðq7\¾Zo¸Ë Ûpç§]ƒŒ’s£¼ˆÃ/Ñ_²l¼ÅN÷Š¡ª–xο©¾ÄÅáUfç]Ÿa~„¢½&ÙCœÒªÑã©´ke±Ñ6úr·=)<±6°ï°-[X)-víäƒæÎîÝš¥ùnx—ï3îÕñ ®Þ´ÞÀ¾vi‚v­½b£j4©–«Ñ˜UÅÓÆ¨ŠNr¨vGåèê¨wÚJ>W7–jið·ægë^ºi8ÚS¶Ãq–'¸×¢žUxTÆKÍ} ¬Ô›Íc½vm5ú5!œc5ذ™êN×Õu­eV{1ãWbÕ‰*êìó® ÛX¥œDV¯¼±jó2Pàä’u)%Lߥ:êþ€Å]u¸.ÎË-Έøú‹5YÅ,¡·cUÆ«H+R>¹,N’áí=(2[ÆÝn(V² è,O.Oå¢d»š„!w÷»Uœoë>äCý+D_×)TÝ<Ëàq‚öA®z¢ÀFLn —]îZæX€áî°w²+ Öþ/„fëY>6»^Öä£óø>©ÐèZêâHQ/ºÝn¥ÙÎYlµ~ÊùPµw‡setåKWê]h0)–W#b€ žð ò¥6/šZXwVþv½|¿þ};CnžÚo2 @ýyÆMûÞµzÐa9—afßM¨ œþ WàA…o5€ˆ!ƒÞKì™Èqç1Â-b­5êÍã¥ôV†x3_Üõ”7ä Tû˜mÇöƒÂugó71Ì÷³‰37lÁ(€vËXBf|ÆQÐ^ÃÉ/Y˜À'ClfaV²ÿ7p×Y¬ÄáÏݶ—ì\†Óò/’Or»§t»eÄ÷äãž2P7N>ÕB!y?ÐFòÞnFÉ›‹Éä=CÄä=”ŒŒ‡Ÿ¼GÝ(ƒM2öÙZ,+åä=®63FÝŒeöƒcHÞ(Àd`rÆiŸL¶ðã…»hî9ÐRì°ZL¿úÿR ™daŸïS¾ÅŸH>i9M>VL>â¦|&É$ùÔz‹äsRò>­ä}nì=c÷ÎxCÉûÒ®eàí yL’÷ sÕâ“i‡RÀ1X9Or|»Å ,«N¨”î—[±v¤ô¿À½ð7)Àç³à(ü/jùûåê»7îVS`”ï¥@iŒ'ŸHá²û˜%ù0¥íwüœá=“ æ«Ñ.'y²Z{9ånûEF½ÄÌGOòLcÏòR£ãÃè.Æ5«b>š;æz»-ø$ŠU£©C¯&†X 7ºú~‹Ú/R nFi®‡Íkšë‘qš›ž iƒ[i®@ )p6ç) ½„ Ûz‚Y£ýk¦ ŽO7EÏJŇXÈÅõ¡Püùæ¥zíÁûö=Ìùýûjï8»­½{ëÓK-r÷SL€çµ@T¡ËÌ­V³ÄíQ9S‡cå\a¶å_dqõ²¥q¡9ý>6÷ö“4_þn0—8ÍÝüqš[¿É×¾t៴jJq£+mí¦àÜEJ n÷ÀŒnƒÆöi‚ D£ò ÓíNêq3.PïŠÃµñµð!ÉË3ÅðL“ {<ŸÁ[ J¹ÏAvòÿLÜ‚¯m6„®ò¿ÈÂ#²@ßä%Íô(Íëàû»½\þ>!Nœñ}."{Fy~{\NÙ¼錳 ͹¥evØ^AÇñ/dñp9û÷~®nɉƒ‚Üñ‚zбmµ@Cøð ÓÑAé`´ÿ’ºgRÐÉݲp²ß ­Â¾”}øÎ—ÂÜnÑó€ð[äþ’æKB˜æçß&?ßqZL¿ÛËYUðW;>—àö½ßYw""×Y»€]ÊÛ:ЄuZ z½9(ÏùÖOF´ï¥ùùô>=ñîMU9u·¡”w q_Ùïx_æÆ»CqÉ;§°ß a1²oÝþÇî)…·žoKyÓ_dêY˜çý5 ®ûJ w=ÿ½Û¸”â³óoÕ)„ÓÈ–ù4ÝÂí§cŸ®Û‘zØì8Ñ/Ô Á­T,Ñé`¨n%Ô71±xݸ—ð¥3Ø÷­Z3"Ë*|BšJÏ(÷dDNFkýãÒ§|£¥) "1¿*«½y³Wåü'óæcyô)pÉ-â>9ë+^ÐÛ;/¯_.Ü­Ìþáü‡ðO‘õðÃ5ît9ð¡ ×{ÉÛM›Â> TÖ ÇuΦ÷µY¸ö†nvÆæ‘Ú1©ülÞòël+KŸ×º)åoTW„ÎÃÑŠ*õqá0ý¾ÁpyÖ…eÓèë¼ð@wÜ á¯\oã~ØxÒi±È6f˜„—,&YæNÌf”;9ý"kóA}›ý¹5Ñ ßžsâ>¸º¬#êEò´5Õ Lœ£—Ú¦7ÚÒjï•û;w–GÍí} Ød*îÆÂÊë+BP B}rî-[ˆ=âW+çÖ²Á°ñÅ–ØaÙ3™ ó ŸKë¹À`±²ÈßÑY¶s¶ùM†ÐÎÑ<}9þâ?m]ð¤Jª7_ «Ýò¾bì×Â#¬="6ôç½Ð„ö[V|dË££y¶Àô*ÎõZœ]cÕÚõ½<{Z•y™ï\ñ׺=vxiŒ£Ü&ë.…ùH§gæÜ¥¼¼q£¨]µHU²¤‰ `U%ƒNÍËèþ‡ÿ—,‡Y4JÑ•Â:ÎÁ`"Å­òàôÀc™ªFd#BµËN™+XäñDØHÛÍx'–ÎÙÕÆÕœpÙ6¨'ßUF7XU!v„=*Ìd~i/ló‚Ð;ue5V Uyd)9Û|oçg±{/»f~ÞŠGƒY¨Õ¥y»pu3>‡/þ/½a/¸ÔçÀÖÇ—¦¼»lbÁNÊ­…Is\?~äT¥ˆ äMqÊKN³©ˆeæc œiyKxÈ_¸Ç±ucuòùbLì˜[àÑ¢@ï{Bò[D‡ªÒ$J6‚œ/]AœE€iͺøãDÈn÷M ¨¨C èóê$dŸw9rý/Þ/n öObÕ¶¼y$ÉŽd;K˪¥´Q>p Þ5{r¢|&ë|Ó"5NÖ?²6üM¥vœZ­Øñþ™å0L¾¯ÝP›Mérmœ§jE¸B6sPk.ÍáLBk3â!Ã<1x‘\‡•ö^¿ÌH-ÌD–<öV;våþÅ«ÿ‡ÈÂOYëÏ+n¸ÕxºÞª º4õ¹ÐOIWâ(ß[c”3)}=Îuu¹ì,(•S½–ÅàÝ]8kíD»KöF1µî‹ä‹åÜ|$ÅÙm7ˆxð¤þ€øx™°˜y(«X¾>õ¦ÄrûœB0RŸB;%V©9%èÖ~ºõ†¿ ‹eÞ=LdPß]ÒšdoH~iP^°ÐÄò—ÂêˆÔk8ø…e½2áïf}Ái³Öšý>÷f1û]Ñ耪K£p¶Àxv¯<>³>~+ñ[ÃѾÕ۶:ž: ‡žB§XžP¥Ú=,w”©ç+(ÓÆæD°ÿ²›”·•ý_.As}P»hκò‘,l-7l×cÔAÿ‚K%` K)„yÙÛ ¹‘’Ìøغ­QÇk“KsàÍEµšÉ3yõ¾ÿ‡­;]RØF}u¨¨8+ó 2‰( *¨€â,Šèý¬½¿·vtœ?VUt°Ì„Ì• ¨Æ:á\Ñ/ôV=«Â”ÚꆨDv+ÙyÍÔ Ç ‡‡ËŠn ‰ˆŠZ—2µ¯"AòŒn‰ñšnÑ'ÿކûE±³õ‹GâsQ:‘Ù ¡­“EÙî/¸3´[r}ÀDc.Ë!×MÒTy"vʸ+Ü}0àçÌyÏ-p/êy´ý`טòa˺ZîV•^“i N·eÿÖ`½ñˆ¼KïOÄ+ç€Ä+¿àIã¦$^_ùÿìÞLw\qºF;Ë9”áñÔfdÕ*æÅžnšÏö ßË dÝ;? tì¿iqŒ•¥>úG|bß§Üǹ®¸üd»e7Ñ‘…,óÞ­éâ›i*dîp2C%mé¯d8$hfçâ :â,1Íá,9ïál±p¶<ñ~@¼û6¼ØÁêÂ{V;ÓEßZNæ|auD˜£l…UFÀ\ 0ô}#[»×¡Ñ…Ó¥¦ù‹B:¥Ë˜øÈÉŒ`y÷[ŶAò ²‹T¹TrÈÆjðgP¸“ póv4Ú¼´í—÷hÛ‰ ·íHÖÛÙwsÚ¬~ÀßÍ¿;œ¦îÏmÇI-³²l uœGEµ¼…å„ãS´ÆŒÕVždl ’áÂ>„ñ’]a1)!¬²±LtPqä4ðý¬ÅZçÝ6:—k'¶’´ƒ½*¥öŒ&Û­ti±-æy¶€5»j®ÄkÜä*óF³w š-œ5 |¼jøI°øÃÝÍåt:%§Vim#Dž«?à€Çv‚4J"šï±g¸{“™†q“WÀ i/¶ŒÏåÎ}Ö†;ø›cÚ¯­+µçJ4jÓõÒ¬õ~2~‹¥¤C+÷vâ&Ïî>uTb_ êÛë.ËúêŠE8µÃÓ;Õ´¹X®icN¬iL8©5âhñ³ÛÕw'…U4·õœ®±ªü·ì=çHvÐU:Ôì©VðòFÏÁ×wðj-‘ï5ñÆf~O•J¬ïb¾YW's¢^ÇÏ\íT¬jÃMתµÆ³e5‚£]Õȵâ*ì…ʤ·+XÔã §q³ *ÏïÊiåËé¼Ê—ÓÑÌ*§tèdDYïÿn~±› «ojŸæHûOáÛÅW]öP:ãÔkyiâ•`«¿[Ky4*#ïV5út Q>ô,wSè]Î…B¹œ‹v’g|¨Ïý0ÛØz©X{9Åõ“Ú7…ý£(®Û¥¢xŽHpÇCp'×Ö Z]'`íhb…c¿k€µY°kúÞûìŽ{˜ ÷±¢ê¥OU |¯4²õ •Tj0ùõ*ŒÑ|«`pI½yÙÔH¡Q™%vçâ¦âߊR8,‚ûª ê}Ùëö/œ¨WÐ[¬RhE¶™7º‡E.ös»ÜDà9¼t†€™‚“? @å÷C€*¨@5ˆ7@5‹hÆU(²aÿ¡Ûת™õkGëÏ\Rì)XŸ¥‰ËˆÀvG¦ÑyŠÝb3pOMÿœŸÐëÍÆ%þ²»€»Õøü‚ ¤™Fò±–75§ž»_¬fŽ€- šá0‰ÐMb ÐÄz Ðd㘱ú4Eµ3R é¥ ÐÍHŠmØxÆû%û.ߺ‰Åÿç!(è©vfðŠéÃçyVi–Ým¡zÀwùcòâfó¸õÁ4Êk'ÎÙ ôœ1 Ì@ÃÀTÆ­Œ%’ý˜Ðß,Ò24-ã<Yg¬nƒá¥ŒˆÜÒ†èë`Èf!ƒ¯ü‘|˜Þ.ƒ “O¥µIÞVì'ïz”}á똤g#—¤ë¸ž¤ãž¤ÒXȸéI*£óŒQ±=$©’»e I’²,1Êþ-»®f¼ÚIÚk:Ÿ¸…ý0Dxõ*¨½Ã#l3·ðQ1¥ô¾g…ô>È“µÞû’£f:Bè˜Ù$ $ï=¼OÞ5NÞÜ>Ÿ¼›¥Fò.Jd’^–Y˜Qq”ÁgaFÞúû]¢×1I¯í8£ŸfØùŒ”¸æµžkûµšå°G!ì3Xô•Gèóû>|nc]‹/·(*$7Ã’Âį"¥Éõ^‰^|k°Éx›!­“Ï¥d!÷²hå%kåË+ùTëÅä}èµ’·ý[O~ëàã ÛI¥Ã:ÉÉ×ËóçÈ¿îÏu)—<Ër>[,TkŇ|@«Y‹U5¾}\4âÞo…¸mƒæõ.á~ôôOõš=/ ºÿ¸°÷_r;üþG Ó0øqÍÞ*ûÑÙ¦€ð­6·ˆOò‰Ôò÷»¸;8ù(E6a§ô*‰ömhòPÆyç~ˆ!ÿ®MÐ]|~¡§x4go·ë‡}ÞÌ¥ò¹> CðjNõJô/p4ßå™Ë§Îkgïí-O›ÚýxT¢sÖû‡aξšží/<íÇEâòG x›,ÐÃ2 Ô³¼4—ûÒ\ž¾g,ó)àßjI/J§´™’:.±YG‘ýÛí„ ®+f\I”™}«ÖÓÞ2bÈáæ²4Ôý¥‡X—³o[ñY üô´Ù|ëV•´~Tµ:vŽ…þæ6ÓíÚaŠ=Î!3óO!@MO›å{xü‡,®Ýú[OFŽAš“?ašÛ²ç û‘æ·ü«MK÷s¥ÝâwиR­÷>u)\8î\Š9ùT9ãÚ±~C̃Žá³}4£–{øM­w–Úíð¼|ÙÎ=›ÅÂ4œ|BW¾VCàØÀ7¹××åjº ª­ÊÁŒŸï»ÿ OfÿC\²Isn¤ù2½Oó”yIóýÃã‘ì3¾Þ†÷+]M³#ùîçÀIé˜ÐaÔF»û´ˆl_ã¹¥îE.\æÆEmÃű'è|Ý¡Ëuy·üQNþ¡gÞ}­åUgjzíÛZ\!¯Üt‰góÿbÞ+gëJ÷í_7ÿa!l×dmWÜd1ý4ØÇ4ÿ<_¡íÝâÛœÙFì NÊ3K€¬–m[LC6†ó›â¼^YCV©(§æÛæô›J‰÷FÇŠ²ºµêúÊ áÉòQ%Kû ­Is|ZÐãåÓý …’ËÚCÂáÃüh.:‹9¤±›™’tÖ³šÿæÛÍušŸÁ÷nÛúbàáêš²«y´ ‘éq¨Ç;r¼q‚8ݬ¥“ù'TzyãˆÊ­¬C»´|ÛE ”áÃUI÷ój÷ÜHŽoµ5'[€Næ›™œò66?àLE³¥c½|¦Ã~¿i_v%er{öfk6 &5ô­Ç[ðþ!ÍëM/‹Ð ãxÏ/}é5<žn„ºCG̶º´)C€áŸÒÈÍV|Ú.g«ÙyáÎ'O—Ãú'ÐùâË”Æ.ÿ!ënÂUuÄMûæqÔÕ]ò¡GgSʶ­÷üvD)+¢HMl£ºtÁ¸o…ëyvèÓ3á}ì+lld0þÞÓ;Y[Öó£¢ÕÒ¦; &ðžjÇú“qàß¼q¹ FáÖÊd•&õýóªë ºêd´Ã3Ôpÿ!-´ÍíùªÌÏÕ{nüîæÑQÜl` Ë]Âïoj9?/8×/,†”-¤gZ(®¦ m”iž'^¼[tû‘š %.žB豘 ÑÑ–éQÕ‰D}?õᙨ8?à°í0[íÊlžšYv÷!$lÒžexÎOíù—ÙiAÝî¯9%œn9 }mÜŽK{7ï.“‰†ºB½IÏU¶&M/a1û.¶Å}æV²Üxæg¶Ü™ys|6ŠsC2–ŒÉ뇤 Ï1Øv𦙣6;¸ßºê€À–:×]O¥éúMY,]Ha9UPX­h)ùfmöåûf–lcÿñÜ›èæ²žÎ¦»dÖl* )øðb@/Sf/ P¾5W]›Ž/KnòħªåÜÆ–Yh“s£Tkù£Ý&ÝêÇÕé¤7_ûxع¹É¨Yõy~0m›š(fK¥}›P–¥m_É˯‘Ì®´i Ž’x dÆ] ZZãŒÝô‹ýeòG|†Ës­KM¶½îM N\‰ÿWÏc—^p ±ãT¦ãÊ4ÒzÉsEÒVÂD#ÐëúXÎ='£ººÃ×=-îp[ S»çÙoǪ³h¤ÊÒ‡ J>…ª²ÐEQicÓ¬¸sxUT™u6‹õ¸ëù9Ðo•T¿Õ®3¤É«?ÔÇ“?ns\ÇàÛ …ÃEõ~Ä-ݨJ¹ešèÌt.Ùx'mXÝ~ŒÁ#æÆU$øVàO—Éxh úS ‡Ú‹U•I¯[¥w_Ÿä éÝåÒxý‘*ƒeITÏ»vÿݲhEIŸé wæÞŠ/Þº7ˆŒý€·ë‹ùÅø7¿\bk±ìãMåâ(Þäzâ’£æµÖù¾c´…UÍX£<®†“®>*rý!²ÂµÁ‹.›ªû8O•Uä-åà`®¥pÃï¤jEÉ2X±Ò¯¾N÷ B´Tëü´~Bmî¹øU ý^\½t}ÅzéFW2"óKö×bjþñJê2 N±$¯æhÀ»"w¥²1y4|´'ÔÇ-˜à•ƒÆÕ´ÚÐGZƒÐî1È æú]Îήµ®€áÈ’Ë?—ªÚ«æ¶¯¿ “`\?1ÇJëõ 7»2hï]S¹^wèØUôYþ€,gš7–³L˜å&ˆ”13ØUüˆζwEuÿŠ3ò’%uÎQÎgzŠ~Ëô‚nn\#Îy½3X@Úƒ> :ð5¯,ÄïÙJÚ@ÚåxCÔœšÝYŸ…p}å7üýz;ðDírãèÖ1í-ä¸ÜËù@‡åK0Û]w…A·ì-³ÙY@/̶¶2^ýny=0¾Œÿø7§aWŸ‡¥G~èÝç°¼àÃ?vÖô$;ä›d–}\¼µ)ÍÕωm*¾Éâ²DÒ=©žC±™ÔFýÎí3ÐçÃå‰ëÎçœÚfß[¶–ÑØËËË[ä]°+nöMf¤4Sãa•ÖuF7™Ï‘nv“Ýd=ŽÖ–øˆÖ,äý&¾'ëCñ6\Íw%Ù•Y˜Á=›¶zÖøG­æþ£M×àCíMo9¥$'UiOæñÔ…ºýñ+é Öç¡ñÓçÑäœ÷fÞ[>¦«^¡e…l ž»’6|0ª$ôq?«Ó-0$¨±TÈÛŠœwÜÿ€$Vtʤ%˜=Ò"_Cò6«ŽÈ›êì˜çÜ Ú±£-ÙÇSvê<%س6KÒ3® '•ÙGåòó›,#Z*ž.Ãb?Š–pwÿ‚¾ï|äÜ“¯öV[kÔóc›-—ÔE·šcfÀ÷´Î7*š0 ~éU»(1ÃNAž[&îv¦!îÂjw«4ƒ§ÝC6uï:ž"gí,ƒ ®Šé=ÖpQjEÊ,rþ$—‡ÈÑéÔîºû–«2}í_¥üC°ñÀÏE¬Æ-, ëy3•e× Uên§Ì [M‹i懤O™p}KÞ'pÖû$~Æ‚ºuKø¢®ÃxNßó·+d+ku ëñÁ@ž 1ðT ln‡ÿ°ÖZÅñŠé¨º³7¢ÁŸ€}³<ÞàÃûP®ªàùdc2*>"žž©g.o:i¯èïK¬Ô.uº*Z§˜!YçéKÖ(ÔÍ«(4©OÉ)ÓZ^XãŸy儳·ÖãŸ8ˆnÚý& ™‹(Ï‚ŽÔfc>Òh6‹!5©C 5f¡ 5x;ü߯Bxbú¼m‡Ú„mo…q³¡bƒOµQ‘k3àëvcÃ|ýØ­»­Ó:P9Úhê5*vBŒ|®Bæû]0 W| `—Z8Wxα@|¬´+íÑJP¸!ƒ2À'eЀ[Çîå oÇËl ëÜÛ1×DÛ1>Û1¸ÖþaÅŒ–ÙÈÿ[¡·_1§šâÃtô†aj1ÉUEXNrWHŒî¤'ò%gb"7[çqO,7ð¬Ñ1lmV~ÎT¡\9,iæ÷ x$D›ÎÕ}žÀš¯$m[à Ö+\á­¹RWšïãxÞ|Ÿè[󽦑æ¢3š è¬5ÝÏvðÇ¢¯N­™i§c˧AeV†3ñØS¶Õ˜èÛýC³·Ž%ú6=¾‰žÝrß·Ÿ+"luiâÒ\e£D“ëMóM°~«ý€à !þœeeÚëág«×å=8«m¿68ëçZc}ªzŒ4ªíIÀVÌ"lTÍeWAÜ[­‚(bºçmŠsõ)‘¤¦BÈ0Ë.â;/©ë¾ÄŠæ¾qþPk2QÇ*“€7|£ݸupÇ;4ùr²®¢ñ¦Ú±ÕCÅL†Qu6)ô"4­Â ˆ¸ñrbû½²C<”2S"&¥Ohû?`i™ÍÄ¥:Kù'ˆý`5( "ãK•V®(tkLQ¨ŠrQÈ´?¬ 13FQº <õ(Hãâ“á{æíêD±AvDtˆ˜0Í"ÝÙÕ†-g =‹¯´ª‡~±Oí·`¸N ¬î]¬Ö (#† ûÜ- æC¥Ðov¡!±›ü¹rxäÛ6]Í]‰;›3Ò™C¶­`×ÒlýØu‹Î¸‰ŒÏ…ÆHc™¦üŸÂ7 vÉî9§Àä¢/UQm‚íD îÍ|t®F¥Ý"8(õpÊocUh¢³M¾#¸ÇœN¾w¨¢ÆþLs/ üj Žz ) IÈzâ$nž’h’‘)Ìt€Ô³ÃŒåÓŒM EúcHÚ@>.¬þoÙ;Ëaî'?õc =2n±íL¤Q-®U¤ô9–ÝDÚE¼°)Ëûuî6•}€ìVW)Ë;€4‚ Ýç ·­@^õ2@¾£6@A PôN¨1;ÿÖ“û B;P[¨0¨ï4@Ç]¹•ºÊ"(jÿ"ÿ¾Ùƒ^¥)§‚¢è1ªm·vÏÕ÷ëû£b—;QÉ»,OàŽc?`þ²·À4â€L „Óá¿è… fÌ  ¨ç)ÛXi4>&ZË‹í™Àäñ-ÀÔ¢äÿÝh ÿï¦`í˜qO¾•^’(ý‘¼—§eò¶VNò®÷í$ I’RíY’¼ûA’,Üs’°q’$½.” I奯 AÉXy’ðM?ƒÝf˜Yïg›uœÐïùZV¼÷+?ØžüùXyl:IçMšÌ}‡¯Çw%)/ã#Óã!€þCsÕØÿCòþ<³0oá<‹Õ°“w7¿5ØÓÀMÒY&©X¸%)„}’äfT’deîá,Е*gì²@½|¨‡z 4ׯ%Óܽò«Úñ)€µè±k÷´,¾îj¡ž‹}²7·cô¼ëyåÖ9±“«EÍý+Ö>l£Ç{»žåóɧsš%ïnþ7ÚÞj‘5ïs›¼A枤çY>Iç¿Upϰ²_ÂÄKõµÂwÆ«0ÚØOá¶s!¶óÒó>*³äpWßÉ%>¡·[Üš>^·ñÈ]'ù=‰Èð¨\\´9=¯Ú?s-1<.±ùýnsóþn~I>NÁI>£Ó$‹v2ÎâŽçÉ®É;&É{2¼ÿ§î&…ú ÄNGx ˆG=õî r/ƺi·k.6nÛ×{ p¯“°’–Ñ+WØDÙŒt¼¼‹ðõÒ•È×%W1À378µOeîgr¼×?’³3 Øb‡œàÅö®WÜÿ`·ç—ä“”fÉç•fažc+û±îüÖÿõäÍòœ|¤Ëó¹þéýp-çã‘ö†nhåܸà‰hhK^ê¹wÉîÒù[å>­Í×ø$b }Üβäáà¾W‡f>·Ù„òqw¨ÇEìâÖöÛÙZ,¤¾ºa½™½ö‹Æ|]÷gÁ¦¦ÿ<Ÿ^ :ä÷Ä%Ø ç°}ZÃk˜Ó4²&Ûp5·²·¹.…+$«+"¨N=ÐŒ²Ÿ_ÍÓ‘‚±Šìº³2x5\Æ›åu9‘ëàbfû´ë:‰êæª5ËáÓGã²;ÍÉ’•æBþ¬~ÒI|5‘Ñu‹jv$‡)ìë4ØRÛ½½ñȽ·.{î6¨nV‘ߨ¯ž^û¼V&4WÈn[]ÚõC{ñÒÏØbÞ~3î[yñî¢^ÍÑۆýû®.‚Ý\,”’ÙVß#?àô`•úÓÆ“ÛçÛ£~}dwÊýÿƘîæñ­M .>^dOÊC ç8; ¬o¼GŽ ”ø¥yún¯¬Âuµœ–ïÛ…“?g£¥»,mon¾»MÞ;æ"ÿ(ÏEçVŸí€Gg¦x5=›ü´)ª}©Œ&vg°ö&·fã:ALJšExí®é“¾èCã3îkÿð½š:ÓgÍiM¢ž4—ŽÃ‡Åìȵ‡KÿÞÜZËoá(±ÂÔŽ°HÛ„î.èÔÉ:z9—lh3SGÉ~zŒó×i«ž<ì±þùØ0T'–Z©ZS«óZd›¤Ìd+}o³†Ær¸›= ÝýÅ.7.Õr$é[yTi_T}wõ”?Ò|ëáÞHžö£NGeɦ?[Á€' /RoÕìHž±ËŽ»2¦´S.:Òl¿²FS]Nm£'¸“ EúÖsÁì-òA^L·…ÝMÀÀR£wÀ ã Ù­Ž…‹BØeF•É^ÒÕ0‡'†ô‡:pyh‘æÀ? f´ Aƒ£Ž¢Á)ñ//)·t¢Yîïä’ ÁÝ š¹uÓCv·â’2{EìªóªS@§#`md(ÖKˆFæ»N̸? Á9+Äîv¾Œã¨ÚÑoúþæ¦z£îC]ßÖµèzÇ4¤žë &:¢©Ï÷ÄUgËÊE¥ziCy7Æ=Å=ûÒÿ!þq‡±8;÷Ïa|жïîký.桎ÒX|Úè‚—ãgv˜ë }= š‚æ§4àÍ|NVÆk¶“ª5ª¾ŽÞ¸åVÃQíj×áû¨!á;Ø5𭾨ôªTˆ¶”EU¤”œ6—eîrŸÈ !ï¥5ËU$1S’XÀú’XgÄ/ý?nÏ~hÏ4¯„¼Sêú³-“=Ýp…šÎkó°oX#÷}ï›VLöòîÅÉ›í:W^?bÙ‚åÒ^´[Ͷ’2²²R瞸Q>E夰Œö½Õ4'ƒ¯eUé *nWE^¬ì¸X_×}m|.fgŒNd+q͈…ÿƒÿãê*†¹¿ŸòÒZFŒgÙot±|5suœæ¦ëóf%®›˜ù˨0Þ¬æQ¡z«n³ÚmË ƒ‡O(jâÖôPùL>¦Â¾>sÙï$+¹8Éï$ñœÄ]§–Š5‹,õµ“Ô.m§+ṫÆß0Åã-ÏñV±Œfüî~¯wü^Føƒã)`VäæŒº}(ߘµV§Üd:Ef¡‰ÜÇÒªñÑO&4?›m 3‹Ä€œ{*_úÙÒÂWdAttIR-KÜcG¬—­ ?d­ƒpñ—w.E…o –ÜÇ)n*LUŽ,×–½dûJ{Éí€ô’ç2(Ž#áþÿp)»mcËÞ§}?jϘe·²FjíX·'âðcÙQ4–>÷«®—çp?6…ÁÓÝÔT—÷…Ƥ܇=IúôúâcÔþ‰‚Gý–Ù²…ñ[ñq Ûò˜Ñ»rÓ»ôÒæªÚcÆO¢ ŒÌölÎö¦öƒíÍÄVÆý»²X¾Ê½/ì§Ãê=‹‰ x±©3 n0GgçÒ¸:¡Tòmô›àI?ÚQ‹ôm0 ùÚÕ$Há^K.7HTÜßZtÿt*pýv»$ÿ€R5~¢=Mî¹y:UÖ=—/œzÀN²SF†º7C»ý"Ðï–6Ã)Êè• •Z£[Ú®™Œ3û¥ûÇï…™ßë«ç£ÏdóKÿecS³ÊT¬œ^JGk¾"&¨Íç¢xËCîÒ‚¤€…š¨A¸?Ê? Á,Å,oçÂ>÷â÷Žr‚q¯»ZÍØÕkå± ½?tûËôÉ„¯jñdª4ס÷Ÿ§+Ì¢\r¢Ä¥F¦ •awéýÃûöÄ ü^ñXºi›vZÃl¢Y  _ÃkŸß èâÒWxÜ:ÈdÝ~@ñpš~úçw ·|Øâïé ã’œËp4¿z,c(¬·2t|vW¤g+FÁŒ-}˜1ݸ^óÔ«6©öÓè‘×yvè˜ôrGšð"¯AfˆY‹QíPaþØ.Ýêú“_xrƒ™7U³>¸<®ÆS#ØÎNá'ÌJRvõPlÎ*'á¦À/þ1å@žÈrŽÉ à^¯(“¬ÏôÙî†ëfgeZs£|º&}ìõ]êBu×Tg¡G¤ùp?ă|Õ ûJÑaîu<Á¤ žàj™ ´"ž2Á7©?Â’¶Q<|±ç]ÑÎ1Ó›^ËÖ/¦PpKú¸B=T6yl%µSXöÇýÏ?s«—6£˜º9 ×óÚV¸ànXApfßhw™úéÓÃ][¥¢:bPp™‘˜‚øÄÔïžð´d¤8ÓÝV~@lé— ¬'LX¡ ûX&ÁŒ Šõà<…-¥âÿ°nTTù÷F§v~u'inwÛ.¨M×¹»¼‰7[!&g.—Úíyƒ‘5¬—¬ÅÂó,éVék‰,ßMú ‚(u…r4…°oŽœ9™x•A Xp‚»~c…­ÜÆsý'Ú endstream endobj 23 0 obj<>stream 'æe´”‚8"wû"³õ%"cõ"×—D.ÜÈ_~@$Ää/¾ ’ò‚OgýYÔyõ¬ÞeÜÑ#, sKõ—³ãÞÕÁ‚]w^³nõôòéóâ¾£;õö2u PjQ%íźC$ùAЙÅá=ë}<Ÿ»0ž™è:,/Q(ר"µ"Údá&ðB:#¾Û’ÛQÅOgÔvÚQùFuô÷‘üc5¿ÕgŸÓÅß›¾ ™kµ†8sÍÆd¥?]ÜûY ¸ïñ¼î1Úi;§Ð#ïI¨¬ YœñÏý•à=¡YÄ %¾ ²‚ ›ƒF¡’¶à‘ÝÅS:|ÃÃÉ}Þ¹\rë ã×¶51³\íõ½ º5wù ?§-ù$-2?n¶ˆÇ…lÇñå÷¹ð@·›y’Ëf½Ñ¨œ¶,¸(HͪxççOõÈB—Éš²¶ž‹¯àd‚•’¢‡V|˜õË~ÏßFCKáÓkW‚õù§Ù¹E´c¬P¦ƒp¢Øž¬5­õ‚æ“¥¼¦{Λݑüi¬n‡Fƒ›t¹ˆ?ízp9ÞëA–ZÔÃÇëì¿ü€¿gÐ= ìפ!™P«ÙÚǰ¥@–XècEöÙ½3ÓŠ'[Â=z+tËççëIš¶ –Y¶’üxÛš/·æ§•¤Íŵ6Ù…PoæÙ)Úðó»l„iðþGlûè¨.nÅyR¶»šr*?k5Ý®VµO™©6­É¨rÁÕsåÒÄ*•s2ÎV¶—)ñÇ I\ÍòËwit™\˜A¯«·Ä¨‚<°ÿÖù»!s%_k〭ÓíîìŽNË1[“F‰ÙOkûF¸¬©çxS=Á…sUÈç÷L¹JÄ­*£ñìTàK‹†â±$BØCx®é•Ÿž•©R,¥¡‰ý€%Wi JÝZ¼)u Q©Äœa¸Ä¬{ä“eƒêЇ³Î²+ï7T[˜×ˆUÄæ‡zȽ.ôg¤e{ÛV:Û-ëáæiWõsß(¿†/3ÛËB¾ÏJl \•rG|Wô¦ú5cŸy*W,ò}¹ ®·3 \ï UaBØ-,l_bRPFFþó½¼fƒÓ¼6-½ò‡Ç>ûÝ©„gÔÉ_²ÑRZ‚}Â×µÍ&ëX…¹bØ©Ñq½U ›Ö ÑMäÒzãM}+ôÕN#˜–çϲQô»Þ¬4=;Ìy~¸Z¬ò-î¼ÍEÅÜ%7¾à¯<? ÃÛ€y ™¡ËæfÎÀN`Á°µ7°¼°H.fÄpFŠþ22ä‘<³ Y¼Á‚óýy›1:Ë ÁÙnioqvV.&£C]ñ—AÅj<Ý2Pà¦Å’ü² ƒæÜÈ+Öð1ÍP>÷Ö¾~üÒ}xâå¢ÕnéҡÃŒ sþN±ô½Ëï{ï(áÊc€ØÖÃŒ] ; Éð‰_´ÜîÑÿoá{ bL”›„ÇJÈhöL[l|ŽjGÿ¶…žì—¸º»e™çGÅë 8m+oöÝËþºˆ{c¹þ «³+@"Ñ HÓmä®NäÇÌ.2®g€êÚE€R8 Ô’‘±ÜÔ óÈðË—Ú/ò°ÆpY>ŒúTW?ˆ0ÉöÇuä2èZ=¹ý¨zô¢),®±gP8\]?‡º9 {†Üö2ì¯2lþ[¿-²ÝSõlWºô¨™ Ô¹ÐøÞÓ I€æ! moÐGîÐO°0…PÒ¦Ù 2¼`ZP>£ þò[úLÒ¨'©°U“DF…$é*ƒŒûùÓãø,êŸè±é@d5?÷Ö+Ý•ç²éZ?Ö>¦7—WïváÀÝ·:ZxmoàþCòîqfò®W‡Iꟕ$I•l÷®ù t;ÉbDÖî5 ®œËÔ3NxBq÷Ån#áÉOÊcÓ: À‡=Íû‰í»rO{mZòb--¬ã¦Û:Ü.]æzëxÂëjgÅ+–ÐhZJq¸X—dX\\œægq¡/7÷’·Å³XËê·žü8ˆÿ‰6Õsã$m·³Ývƒ$Q&ÿ­ƒ;…v) ¯Z‡¹Î}_±øˆ¨¸9?÷n£Ï¹ë,_êÕ*܇Wt3£‡XžFÄ®º¸$*¾þ/ô‰;ž—mãqΛçâ‰räqCÍÄ#´õƒŠ†ãCíáfgn>ÿ‘¼o}=‹¶,'oô,$o T³æÅì`¿*ø«@ºYï?6‡Áû®ŽE0nátåz»Aõèñ,v"’‚ð‹³€è PkrçåÏ…ªžÕ›;a+ëê íí‡+í°‹×t;#x;©Üùðé!zH5ËY¿lÒó[ûîè:ø%ùtd-y,Ð[ûKWûo1\u×ê*{*üZÇmÈÞ]'}ñÍåyé¶ØÏ™CðÔ'ÈÊQfàÆaÀ}ß°?­ëؾ Õ©]”Ž;¤NŠÛø9nqʲÂÙbé†ûÙmÜ€~®W郎ë(ëo)Vöå7*ùÕEMôlþH>ó‰–|èŸ}Ò¿½ÿ™¯FÉG ÌçúZ6â^Ó£×pj\r3=•'•塱ˆÖ»«îwHô¼mñ{ô çÄ Ø¼Ã\q³µMîÐh­=ÂÖ`Òg‚µcÌT_ì³Y̯5++OKçÕ%W–æ…ÁÆé/ˆýPp“Àÿ§Ar¿$Ÿ×DÉû)€jRè胧D¾äÛ­çw/ìxE•%ÂînÈKÚQÎÈúå3yÏ×¾øöƒúÚÐ9wöUºz÷ŽËFê {D~u èòjÜWËÛVƒ—–2§ÇAÈÒòœ–mÛe”Ièu*7÷ߓμÄFìL:î{³ÊpÅþ€¿›é¾5éþ’…çÊ)0‰÷“;g#wÆtÎï6N›XÙ‡4:I ^"T–EÉ;éÐh™µé2žÖ–K,m®³.zpS\—çŸÙêØðog%A§°ŸVçÁ`ÏKç 9“™¢0«¬>pswÚ("W» jÃkÖ½XíZ“MŽù¸x§ùðq( R´PoÔ©ÖŒÚß'o½âvåÍj>ÎÕ¾PõÚSYÚÕ» .Œä²€4r¸Wo2_Ó‚;//%¦ÔíôÐWOÓÁ{|³Ï¬õ²Gù0?¹ §Ê Ÿmë®´²=?$)Ë.^ÓãĤÞèÖX(Ÿ¢‘;±È˜§ê?€o–ü#ÍUáñ-[üñ§+;²Ó¨o|-;ˆ~úÍÒ-YÚŽ‘s?¸[wø‹Í!ÝýöKÍ\IÓæt¥Û£È5'7d5› v°²ìËjm&ðjoÎãSd|ðøe°N.oä¤6æW2Ú€;×Ï¡¾«0+]¹cÀðH8­á°ø ‡ÍÍ‘øåÔ.’ÿòÐê}5ʯPnoź „CÍ?‰»Ü*.]âE²ÁnޝÇÏy%ÿ§CãÝ´ÇSŸ`Ì»k‘Ü[4ù{`@Î0z\Îû³·;.~rÁ8’zàNßÍÀ‹®RÈkx\ð…a+?ªkcaMhp¹, ,Ó˜ 0Lx¨Ó ®ªÓ5ƒ«¤£ÿ›Ûªr®ˆynÛí à`à‰•Õä¤?àH„«#œÜÃL} n¶QåÞÖÓáËfºÒÚÆJñqÐc»ãR öG•¡èƒ<¡Om [.1׌íi°§ìV¢Eê“™§*¹:–·˜‡æ¢dÙ…¼‚Ϧܻ»¹àwËR ÈÿÿqM¼—r0H•ÙôOíŽwuÐÊb¡4?ó-\fZu=‰ãëÑ¢ÄóÝX=³Ô2x'Õ‘ìß²#Y¸G|¨{;F‹’ ¯!ÌNL&þP}¾6¦JÑ»¹âZ;Ož·ƒÌÑù»,á¼T.H 1 v´(‹ÄP¬ÂÕC ýÝnõ^þÒùåüÝDËËAÙÍj]}ƒ¡~ ·H<ÞÓóÖ=MîÌÂ3àŒ8¶ ŸèZ«WŽ©¦™„l8ë«9Ž1Ê{Ôâ”î –e¯ÞÊ [? Ô¿’®¸E…Xªçþ rÒ~ÃH+‚þÀp¡íïþÚ×Þ„ðov®ÍŒwû.¥•)o»¯”ò/¹s{I?“Ê\¦‰»‡ì¬|Ÿéåx=½y£Zõ¸ž“ÛM3W·÷À^§%u¾KÊâô„eo»Çåb> %Qyqî±– õ¾ÆŸlá¼y®„NµtàM|òhÑ(rö8F8éeëýÞë‘_d¼ß½×sTÏX´¾4ÿ8í׬‚Ÿô¬¦×^äßhÖ…—•¸íƒÁ›wT“Çî°ãô‚ÁƒëU§#=”%¦çdŸÒ¡¬Å6h¿.ASk…õµ;E ¢Ë 1¥ðf̹>˜sö+Üö:{ô¤šg?¸ÞfÙõ“cÙÍrÎæeóɲ[´š!6ÿÆ/?àáZ{ë]Á VÓ±ÝvK¬Ù·Oåaö¸ën´#—óá˜hMSX©LØ*ù'É¥r=•*ùr^¬—@¨ßª¼˜{uøÛúMðX%ÇrÓÞ»ßKÖ`–]ô¨agóº¼f{u7êúý3РvƒÙXnÙLz6³±ùGF1›i³Ù-;?öx4å‚c_&–N¬µç{²WšÌòñÝ(‰‹­ÞªJÙÊbðø„† ´]G|פÐ=Šê!¸÷‡—à-Œãu‘·^‹ ÷ìÌ›i-Оóôè@­yvù¾Øú²ºÙLä1›w÷ÄTØÉ›Þ=î5Z d†®‹…lÞ§ëRñF×™i‘V¤ñ¥þÇö“S9¬ øb…óí™Þ­­niöªjÖåûî½?’K>>÷rcÑ׉v( ~áãý ážg%ÿr¤”{®ª5zÀi„°\Û¤º2êuKG[fä–gÐ{㺠ëÇÜž: ¹ÕŠ™U’4Ð@' l‘ÑdXÌ2~íªµ?Ö ý"Öû=ëXÅÝ`Ív¦L°:¸éºŽnÔt÷´å>ÛÐÅÁøn Wp;ãïÐÙç^ØûÈQóê½×]V߬WèY°Öºý-Ñf¶5gªC¶KB¶O«Šþ­ÁjöŒ46ë ‰ÈÕ;19ˆE×®þjéþjO.ÂùŒqÀiµBLæVõ— ìŠLÞ¸³…ÐÎäE»ù±|iDÚy HM,qpù¾ïU0AQã^kõÞ²èå®ö–åÙõ»öïI*} Œ¢ä!úp,6éf B©‘ ÑäõPãI´‰[b'økoø|ðºaïM§€-¤‚±U\Áعÿ16آ׫b Œ¬ü ƒ°»ÌUÎø\àŽÅºÀ¨q{]~ ß’‚ö-mˆ*7ßå^žÊ»›êgÚ…¦hÀ¨%åDeûA7‹OÖbíR¦:—[´àL<& IIžÃ¸¨`ŸIÇÄØ—â¡~g~Fù¸˜C6¸ÒF6DUDÄ´"›ÖñƒlÊõ ²~— ´Hµ*¿ü^ïp×Üö÷i'á¦e¬¯¥ÏÐ ¼³âŒ׿´‹£o•Z¾ÈìË!=t¦&U.K ¶‹;ÒJ:WÛ()1«Œ ¹÷k¸ÛØ´q@ô±,«ßuÑ ~ÑÒèûFi×YÀûºv„ÕÓýÓ9Ah#ãÎw†û(èœrÓ¤s¼§åÎñðüVÔ´ßu”õ–š8M¦>:òA:pPö(CgÌ,¹1aý'4`êžšÉÔ%âù‚G% 3ܽ9k¼k]N˜æ·† …2ÚßI d["ˆ|Z2ð¡ì pC¹ ;ú rÚ×6¿k#æ:iÝëµZkròØÖä¬Z“”e°­É8,fœÊ­‰–~Yx.ÅÎ.»múË´ªÃð Q ­æQîJ—j Ý­–‹CÊH† þ"ãÙxˆŠÃØD¶ïÊÉÖ-RSœ+|¬“nã|çÒ.U:£+ÜjßP†h›1×zþ E¸iÓÉ£a“ö½Wc‘~ »0é»Ìì‹,·*6X<(ÿáìl„³ŸºB÷Ôª’e}ä¹ý’åÊç(L¦O¿Šï=b¡11¥V\ìExhô¥Ì÷õ¶u1ì66Þ{­'œîZ³vk¦<“4Ýâ ßd6«j?áÆ i1‚Ý“ê±ÌæýzÉùµ°«ÝkûXªîIž¬ªïªYÝwZYŠ·” UÕ2ÊÌ¢qC°VÇ"©Sª¬®nåDÔ_—·÷A·Ö»;äÃïL0aÎ áÓ0T~À6NT…†W8È Pêý[ή—-dUÛö»šRp£Z58½ª1—¯jR­6nZ9[§^¥ý*iÐu>t!“þœË÷•”/ÛÜ-EoXÆÓàRÆ·Õ,·,ã‹.Tž¼åÊ/ö¼pŒjìàÚ+Ä+²"œXn.YІTܾ.ñ•Ñœ!ƒ`´ín 5ó•²TS® WéD¨ Y]zX~x¬Yžò¦[&›‡ÍXJ.ïSÉ1÷ƒˆ¹Ó=×K@¾ŠgÃÈ _ì ±ú[&Ìø¼AAµÚ`©Ñ‘ÀR±½‹É>û]« ePµ_,Þ\£Î\ÂUþuÿ>ðûL{® û7¦ ïÄ}¯QEë,:h ÙÍüe¢×ÔuN…bJîàØ+‚ÐFûÖQËØÃ(„¯šSçtP¨ÒÚ!¿ÿ¬ïùÁ¾˜Ï7|#§Ÿm"×çä¸Âú@&é @l!†ˆ^g¼Ï"fKMD4 ¿ü>B[sžu\:©Û*ï^6ù®†úOrþÚ_0(}ï:1Üñ›\›ÕÝ€&í k16‡Jàz~ µž/å:¦¤èd¨€ú;@ƒâ:ƒ?èé苨dx€&mÀŠÑÀJÃ3€•áRÆ0È€o,—ËeßËQ•_tì•pjYȾ­_[=([PÏÒvѽ'Þ¾Ém7^­Ç3ˆè5Œ¢_i té¨ù¶“¾ˆ`Û¥–q3ìÍ2ˆåw/{ àÐ=p˜z¸t®e«ñ>•«Y4CÀwµì¯·GÀã9 àw܈\ºˆš•D½RÿE]S½îî¥.•Ä&[jï;LÖû0ò@®Í"T «^–UžãnÔDñé1ðÙgà¯Î @ÂÜžwõBC€ð¸3@Ü@æË€D&@þtÝ險<»(ê#¨ƒˆŠbCߊ´‚`‡¢ ö½(v¨ç¿©z¿¹Þ¹¾kíñã¦ÊªqIž<£]j>Zt?ãæÙµðû×ð÷yð–„|}’±8Æ^6ü‡IAY<¶¤Ôï&žŸ`r0?kê«{*÷ú½ÕïvûSx3ÅÇP'^ W•³kNüß³üåm)8úÏŠà>»|¨üfp—' ów àÌú0;ßÔ€ðò$ r„ Dõ<¢Û¹qLaOˆ«ÅˆkîÄxõÊøB¿™Þì¾Ý­•¾ †š¦ÒCHÓÔÈ[‡QšÊì:c–¤i³ etªÿdBS¥”諺ùŠPÒyÉ;©ÿ\TøáS=5'O¤cÏk¼·úÍŽ^ýݬã»õØÝoG>þÜœOM²N…Nzy¤}MtÑ¿zÅÑ2c²ú‘¾×¬˜š£¤©yd²²&|VBZÏøÝw4+cyžÑÿÍ„¾?©¸¬_ò¶Z}ªÇ2ùX×qþö)ù¾£ú ­Û‘ÓÝ›“¶ûI,µGIôƒk¢ôgWžm.csºp»ç3NÛB!Ïñ>GdÅ:Ë7ÓËðÆghhûœlsôGúοiÚA3MßPVO½—•;m8NÆ+ÈJ¨ì^ò†ÍNçwë–ûÞœ„$±ˆ”à„ˆÐúÕË£Ô•^üÅ/ ·åÔ8À83ªsŽêjï õÑ ©Ù” í®6˜^ö.‚öµõ€ÙÅæUÝõJŸÖŽØ_ÍmÒÞÿò»ç0¶U³ju¤ôíËBöXòžƒ¾ee]yO¤Mø·#ýˆ"\¯®ô|w¼pë]VÎýâyŽªëïêîᓚìÑãšÙ`‡ÖØ4$÷.þ~&W¬…âŽØ,Õ­WÞ[›‡óìo¸Keº(ÿ²õÂ*âMb%¿}~m<~¹è÷þéÇ:+Y¥ªl†#dL›Y©Wzö0Úõ.nýæùµ’§«qV1öxxÒ„axØ-”ùþ¸ilvñ=ìȬ¡o½@ylž@yoü™­ß°SX«¶è_5í9»Ì.L^„Ok±þ6†‹’wÛÏ÷Ê8ÿÏN“71ÃK.ºìÞì‘~¶)+­E§Ÿé<+¨µ•³:^)÷}¤±×!7fÏÍë•;ì[yw s;Tdw36dozj°Okñ¯ÁÙ.—Sç¸ÔåÑu±9NŸ‹–{óý%Fæíþ›1ëøœ] ]#¢ZÛþôNëÛð¥}rÁgÀւƃ"‚Ü'&s­ˆÿKú-^Åß|2þ’^/2ÉÀŸeCEõ.ãÕ>næ‡ï®v‹a)Õ×¹Æ/‚¤,¬²Ôš;œÖs8#€D×™7hØßLïçÝiÊÇ$|e}E(²ù¬‡ ¾0_dÃ$'ó$&ª÷µÇ«—ŽÑþô±¡U¹ð¨>ª­œÚÃØP«¤_£(?M¾+\ýS¥z.˜pþP/Ÿo»Á ‹7¯k¯Ô°÷þVÚ)Ìâv§ybŸ›úÍa3 ô¾|·c'hÒËA=Nã‰Æ_¢ ò~¯Æ¦ öãT¹ø¶Ë¿üJ½“¹ýÆ÷==ì-HÍ»|Ïcêe0†bøo¥¬/mvåùË~'CñÈœ‹ê¬²Aìw“c¹ëª°¶‹Ýí¶›õv³Ët\œ}Bé±-ùp[Ÿgv\ŠÏ ¿MÞõÑiø²²ºx½:ÃK{C 'ÞmF-<f·ƒçª}èðÕ½Üo°ÅZo6„žb\ÜîrßÛv³èîÓiR©S–Hô¿x´ sù’÷˜xOët­îÏŸ…³XdzAu¶ˆØ&µsÔk;Ñןd\¡`t–âðª 5ïÞ­1›…íƒI…PúŸaôWÚéçr¿§Y‹µ‰üIqY!ºïÈwÈc(ŸðÙd5·ÆãlX›ºùðiÛz RÜý/í¢}ˆwk½ìÁ ºëœÇwQÕov¬µ¯g-ȳ\g¶è91¼9„GíÁ.ݶé6Ø£—›³Rq]±@4,qÿµ¾ÎòÚ’ßå¬íg ù/®¢DË{¯=ÄWJ.Ìɧø›Éí0ÞÝ·S¿¶KúC¯¸ -ûÍòâÔÓ¸øÙ5¥[®c+·¢ë—Šïn¤Cæ/YoÙöô‹ØfP Ù¾ÏzáS¡cIxÝo}¯æ²Õ¤ý“¹ðw/S*Ec½õ8ôk®QªæF‰}÷Zåÿ‹xQù6¶!*Ô—ÕZ­ðO?åø9)[ÛQŸTÏ¿Úݨ3Þ6¯„Ý’YY»'–Œ‹È<Û·& Ú̲Q°ÇE¥b½-°¤…´fElå[ºbf±eœ°g˜ñ>Ð÷ØþÀº}—îÚ‰æ5÷ H­¾‰,õb ¶êÅ®¦j¿ÂåþàÓn»6ù'\›÷¿$TRÿáwøÆ¯ q¦•Üév*Épè\–á,«±¡5ÞÚcsµÞïKjårç\Kásœ1³Îu£¥\}?9 z[ÊiÚiVlk8L Õ˪¿T)tsV†íüWaÙ~½ùL+zóùÆVÍñfõÌøæ~³£E4×|~ ðÇáRçùÕæ}®ÎFÍ#2ÙÎøÛð\WƒÜ`ç÷ŠäÅqO_Ör(½Ú³_tul…ïê¢5/³‡ìè7³ØSR£u3 ýPU zµ«fã¾ÖI \½2£öŸY¹ «–½æ‹)N›ÂR?Ê}ÿ‘»2–±Wä\{1“s#ãž±rΙ~þeÏæòÜÒÉM*‘؉±3×؛̦˞ÁÛÃNuÒÊʸ8k¶p_9Vn=˜«ö<4¶ÝÕÊ(ï'½ú<'ZÖ¿Ôëô‘Siè(#-Å®ˆ͉Uã›"¦jòÔíºr4æƒâînÀå)­ü*‚Þ Q›J†„\3ŒÏ?¬‚î?lÃÕ’YtQu*_=Äï~n×¼²]¬ÁxΠY6m‘²š­ùÚ°L´J¸&ÊYœ¬×šêL#tu£¶ÎYy`ݛ¹ƒwsrñ!ùK¨<½ïj2ÄÅLcþFš ¤AØ’17Fªn×¢µo"Öê…#V„c¥dìbksSˆl|ù=¤læè˜™b§"G>?¢ã¸Dµ™«ùzkžb µ¿šî|bKëaßêáP ø4²l¦>¶oŠoâ"G ú)CsîÛX¨&’Õ²¶1im”„î×’hWSÄbÂ\ÒZµÛ5á{‘ϸr<ñÞû|OðÏ|OÓˆ»È?¬ŠNÏ|R­Nv—ä¥oýÜÝ-Òèw‡ãÔ·äû@3Ñ]"éµO¯¡&Çž¡ø}Ûi¾sѨ E$7{ɶ±¸¥çFýÞ¤uŠ}¤’TÏ‹{ •ÅŠ¢á‚;19¡.Fß‹’.wƒ±)ç­~ßaÇ1&±ÏÒ€bŸå¡Ç>1éÈ>¡Å‹cäcúËßW¯†ãT$±µÊØÝïÁ º—w³ž¶y{Ü3×kQÕÝq ªÞ±Î7ß’ÒNÝ’ó=òw_˜´QzK©tŽâ¾'b%IRá4ÌCBýU@ù¾X©ñd³Ü1ö9\–ÿ$ó޲;ln¿L ¦=Fzçwî“ ëÞ?üÀ‡E,ÃÔ´¹Âª>yö¾}íu?¸ä¡Z3\è•!¢¨CŒç›¡¹§åükÓhѽ.µ† #¶'ù‘X5¤¹ÐÙi[·½˜ïŸü;OuÖ_nxÝgÑû¢/+øo’ùdƒiLM›ž=ŸVÆÈކ…nJ-¿HÒ£«M-oû5µ¼ów.kÏ™{Î ×ou8¶ëiwvíg,i﬇¹œ¾j3̦ºÜ¡¤rÔÄê©­øµÝâò¬ÏÓØ;äFŠãpæÈN¦Í„e7e¦‹až‘µM™ž‡{‚FrO2´ŠI¡…Þˆ´Zñ†Ä úñ‡Å®LN+“8¬Æ+âä²×ÿ½Í59@qÕËñÏW׹ݘ&Æ¡vwUv{T«öž'ù¤ð¢8ÊIlª5V¼nv_¾áÐgš¹ÙŒæ—-½pKZ«3OjÝoʤ:(¹ë$–nxÂ%oQ»ó¼ÇùYTüFïõ$ JuOVÕzâé‹zb_®õ¤ùÌ~À\ndcåï2zÿÚw±~qÞ¹;#Z·VÓXïJ[·ù…Öšd÷ŸŒ«4Œu¦Ù›ò´6›ÊÔ¦zµ(3.öɽDMÈ6ÐdeˆSû”xõÏî>Þ'¬~¶èúÝ(µgPèÕÆ’;¯¾‡ÇK5äšH5äkjˆW£jXÇÕà³¹WƒëìöG°ív™ádG»5²šØßZ¼61yè«väÊZ!Ð3ðßÄñÛ2ËäãIî_4EtvDvóYÅù©‹SËó°>*ÞÃ:›T×µ—×8Õ&Lç^ž³oõ3~¡Õ©ˆÕ\¤K5¿t*ðª>ÅVFcF‰Ì®+î"VœßC¬è6²^Uëß±"ß¾ý1©E7PŸCÄ¥O׫…ÌÜ¥û±P«#í)ßä‡ö©ÉÌ¡ª@•÷] ’zmò>²Õ¨|”ªòÉf¯•_s+ê[VÍ`Še7e™å×Cø³¼ó­|Ùæç•2öù’+7ÌR:ÑxÙ<¢dqŠI¤ÑÅdæø(q(Pb®Í9«ðâÒïû,r5éÝÈÕ0W£Å}Æ(ùão íöG™B¦SU*Û† ¨ÿ„Œ1£Ã~ŸÄùS».ÄU£bèN³×b¡è³ƒDÓ ²`²ïC!;K=hˆà"µUС ÈÙ©È9ÍðvéG ÎHÈß…|öà’3éå¨|Úlçáü'•ÜŒ·ßNþáço©%àûýà7—ð× xÖ–#OüîÞ°ŠT ¤¢Dä³b}€(´ Œ›‘,€ØS/Ûïi"bšJ;æøË„rFÆ|¦ru‘1ŒÓ´ ²_n*¥¿Õ¶32—þ÷ò ²Nús=í'âÞÜǃ‡q-ø÷îÖ£2¿c>³¹9oþxËúŒ[ÒËùß„X€ÊÕ+xê•ÞBƒËÃ’gçîHds±¿Ã¿¤ïñ[Ѐø~KÛÀ”ŒA'ãfmÒZ>^òfžêa^xñ»ïÈ9~dž«ßõ«gñV›ä¤û=hÙÑkëêåÏí+½|õ.~ñ5¼p»b•êòüídz|í¿N ®žq[>Ÿeû°“—Ý?ŽèôÔË^{öÿHßš˜3Xÿ–ЭfDäoIiöjCµ^_Õ<Õ½>Œ³³¾[Éà|«­[BLôêA.tñ §-­e·vþ:6q–c›9-H“?©·^V†—©¬oÓÜ›¦»¯-w›ßÛh¾õ*P¿œ¥™ —ÐÍÿéÛ³;®kiÚëU²zõ¿J}}•X¾[×R3‰ù¼uM•ÁÅG “8 Öç?ðY>½7'õz;Qy>`áøºwsãÇ.V‡éŽXÀÖ+à-½Ÿge¨Î«ë´»¥ÖbrΞN楮 IÙYªßV°X+…Û„;È]íëb¾36øüwø#} *}sQ)#ÎJ›ÆYÝšqÇúòåÑœWbq;É®¸>hv§îk3´µ#Vˆ»¥wÐ`ÃSÔÓp-^‘Å*Ê‚®äCûx¹à±x‰„µûÂÌÕÒ:oæç6b–fGÓ#fµýZŒz5Äž&½ébê5ðÛ”Éu¡ðq˜B4ú_¤¨ö[V¨–¾çiõY¿‘ûîÑÉÚ~Ô'ד†¨¯½+‚ÜÖÓöÅ O]ðÕ7ݳ«<Ø7–…ê^[˜Ý“5ß%—μÂ\³ãóéÏêÂ3Œz»ü2"íÊnêÈxÊŒíWèú¹à-ÏJt|Ó?pƶ1QP,šä“ím¬+h~\¬bˆ¿9Cð?´:|úÁh"ÍqßzråOQ!9é-u؋͎”6ë¼ÅËe÷ö^´šŸÂ¼Z¼Wf8vÏžäˆâ_üt8Í5ÔÓÃñ¢lŸB¹„väÊìd2»·“¬Û—éæ:.šÏ·ß:¿ìèø¨ž”á¹áCüÅÞ€×€Gš`pßÐß?~àÁ¨…}ÒÏ ËÜ;_Š¡Õ ì{œuÞL>äl˦¿«¬KÌôkùÛ€OÓ÷z†bé rõ‹NTâ[¯f(=FaLð·+ºéc(­²FkjµûÏÏ‘?$„iä]?×­GÛÅë`tb?n<-÷'Ÿ×w›~O~ñ»îˆ^] Ò@v½×ëö /R¸/ï/Sö½/ä¼hƒñtÖ³ÙY¢¤@÷ÔƒüBËñÚ@OþΣŸ£ã˜Ï ³»Y’Tñ<×$‹Éü~Oê§÷žÒFQ«c·­¿~/_Fg]Í¡wÝB68uÌàuJ-1ëùÝ}ùÞrNüpétŠ¥»SßV^í‹•þKr#òÔ ôÒf*m_ §®í§¯fn‚;äN–¨iÍe³7:ÑÒdØ/˜k¹Û矺~(yÙ}éƒYˆôxVî.»›z·l¨ÎÆ» Òó&»ûIÁt+ߊëtš¼ïàÙîwv§6%{¹e›UPÙŸï¡%í¸õ‘†÷˜‚ö­Þô$ëùÃ¥FîîײB»Æ3òáç6@¨?.'3ê\Nêâfö`¼öúIô”ÝiÓÕO—s§u½ÜÝ}{»Uÿ9Ý"Œ:ø¶Zm°*ѦŽgêJó¶^ý–iM¨Y¯õ&­,<Ú´rûnªå lÂ3Vcndúõ` (œüç•U'7Q]Î/ê ñ ›ÍþÚ?öjY,þ!íÁ+Õ³³ôåjQëÁIÎîXÚgà:ƒòÔéúÕuûúfOmºÑ¸Ù£¹’Z)bä,Ñ4Ö·4ÀZr{€›óל3Õɵi¬AÎ2Œ™0Ôwpg®cÝÓY;’МÛ>k•Zm¾î«±&n2¦—ÿâè¬÷øºP®ågÌ&¾OÌ+¾Þ*‰7¸S«§>ïRg‡9’ë¼Ý!æ–c?zÎÐæn“È’àù¦ÛÓÜ‚v‡ÄÔ*ç—‰œ¾9ÃÄ¿ˆ¾ó L·™¡Ç¯¹BWWãé¼£’Ð=P’Sc¯xMª0„Pm>÷¼ògñ¢éϹøÿpþcO¿ÕßÏãã ü4tz‰]çƒ÷´×ïiû¶Ñ±щ7Ófª†•~F+:¥Vž@}³À ‘aމ¾ûÐGÝžª‰v‚Ô§V׌¯z)x•lù˜r+©Xa|HnúoÂjòáÀ—ÃÜa%KGá!÷\–Açd5f„=Ëxœþ‹m°+V#ɇ0I^F”4ˆú³…Ôëì'”î\x‘·Ÿ¬ŸµJKÚyB+ß±›ÆFv-}¯õzzeŒµNy1S/£x«’irRn½ÇUané³ùœ×¡¦€Eù½6q¹Qòx쳡ÔÐ~#; i|Iot‹RR²F*æëÓŒàÿeÓ<^±9eGÐßjjï¥ÈÓž¾)u]\¾«m|Y 옺© Æ(C@ЫõŠ®áTÝQ)®>P†3i¾ŸÅcÍñÌÞÊØ>Ê Ã½Ê9bñnÌ’Ü€Y€IËÃHEÑTÄÍw×[{z&ªƒ³p¨°ÐŽ?²Ð¾\&BûÚÜg˜‡8à½ãºp™–gì3ÈfIc_žŸI-ì–g'·}׿Šfc¶©AM?ä–¸Ö‰g¬J Ç …]-Íæ=uä}ÊÓ;lÌ °hÀØH+¦r’Œ¼ö”ŠËaN´ŠaQ,oŸY{œJ©!TOv›?w’ïŠê‰Ç¿ˆ»Î&w}ž€È=?þ7«25(G¢ÐËû]«ìϧiàžWcÇž´œf ¶›¤~hÌ*+•ì),Ùœ,/O=E•s϶ÝP…¬s_MǾ„BáTÜ/kÑꀣp¸n‚3`>Bn!|××y‚¿ Ü`Z·8ZöÆì£‚ìÙÑiôeGgƒeG±žE}ìh}Ùd¼wì£PØÿ±8«Fy ÑLnDkì¾gøÑØìô¶%;œlXx׈Z SFѧ(ñ.Côn z®!Û²!î0Ê1_ G¾f5V û >nÌv|¯ü¼r‰ RΫãy޾´ª¬O…Ë=ò-&à¥!#¾w[ú;åRú¡ý•=ú;.ñvÚý‡ýf;¿®ÅrE _/mý¾Ã®‹…¶ßæ–e«…ô†—/¸â¼,Gø$ûšT$ô2 D›šò‚«®¡Ž¼l¾×/öy’¢Æ\r×çõ6ì Ϭ¿>=™wé•c‚^f²'ˆùé(Þhtž* ¨Å½·¢4yeÄ¥u]Jë* j±nÿe6ºÕÊì¼Qû¼uãQ}h}7÷–±óbIõ¸%.G3Ú(`"Ú!f5Vwˆß‹9š»IVƒcö“}¶–?_‡Ì;(N™P¢VLèGz¦´:X¿ÔÒ8)½T&ÉM[o’­ê©K–b~Aì{Ç{6‚¹Ù0†Y±·«Y4Nì›Â†,Eú–,yM$ÁPÙïM¤W¿€Z+Ç›¼½Öâ07ÿßÍ7ÙÇ¥ 6(Š•M æûìâX"ÁX9Ö™O)1.§Ò³D¶hÅëöh¸¹üÀÔ*ŸSúª¸£Š{![;åE–í B´Oç:QíâÞIú.ŽAT¿²½kýÊñåúµ.¶ë×ÂyZ¿‹kÊÿ0Í )6|6Á£k?‰¥ý¶—ƒØ,–¡Þ,MgŠŽ‹mÍAùþì ÿÍ֙ܨ.ÒðÖ®PÐTñq”HKû$VÄâpU‡„3è†Dž¯ðóã~»ãò£~ýp¹ú`:¨ÔЙÿk£¥`×8}VS”?W'»w±:™}[ÕɨT_‡ëú_‚½Ã²¾d˜¸ýÆnf)¸ÞÓO{ÑPÆ>#4ôIƒðSf_«¡ç§fŽÜÑ¥¬#ÜB¡„ÇýzïQ‡“YÌZ÷ÔE«Î q§ö¸ ~Íïs³OYÛjzŸ_«Áèõ©JUrä±Pªa =Ÿ€v;õ>JàZP¼~›â`š^ŠtS…G~Q-ŒVµÆŒ¤è¨‹LöÕ2™Þˆ¨Î8dâöÈDKfÈk‰­‘×YõWŸ*pF[õÐ2V…©–÷^òw†x\=œÿ©²ô2ÄOªuöÍ •ùy—w ›ûÑ^ã•/<ÒC±À›× ò.çÈ AD‚C[C¤ÑÒA$??BÏÌàèÝ;ÀÍ0yÁy™GóKhÍåµ¥è@ëÏt ™›@¦÷Á sÚé˜h=_/àìoºµ4|Û‘[;Çémª¼ám¿Qê/ZüíTfŽQ"é´»L݇b¼ ÝùJy÷Ý h‚P›xv›ò«ê˻Ӵ%4ÔJ>TVõ8×~±N®:éŒÀÙ¸,¾/œ3†àóB=c¡|¡ŽîN¯ ï†Ùk=f”áÍnúKç©4R«ÐGŽÚ°Nåe6•³ ¾ÃN—ïìîSvmâŒ1È¢ÄwB—÷±„£ÔrSA>G …ç—\1¯å\m7¨â¤V3$ žW¯²–¡;€„÷> ‘ú*ÿ²PÊg$ ‹œùg‡Ïh˜%@æ îIˆ·Ë0NíFWøçj”ɹñ\r–ó1˜»]òòmüvoÕy•‡T@陯 ßí…€5·_‡ì{¹ò{–ïzÇU*2”(²­dÌZ€j€ ZZ¨þq¨qÔtWT$²÷ß<öx¨yyQ‹| P~¤j¬N5)^2¨{[¢•ò÷ŸÕÔ%d¹˜ëuÆèshL\Oü &Çm«çÊ„P™uíÿä“»¹hD ͵èÿ .%@;o Ð~ÝôBëú~óÉï 0yõæžFq0À8E)cÖŒÛ\¦ƒ~3b0“AÖQå0½ñ)ãö0z[Rò§ÇC¼Jï3;?å6d¼¦çuikN°ý~œõü(ëOmD­~õ¼åyÊo.€ÿO>Y®4ÿ“¼ýckꀹú`>q°Dͬ(‡€íÎ×€ñ+à¸sp~›ܲ î´îlœ÷UHi4ã#îz€ûTV^ö>ë§úq‘BãˆÖÌù'Ýô . Å vè—‚bš‡{ˆzwè¸{´þSš«kü'•¼B:©Ûß³ü­¼ýÛÎa8ñÿ“ÁÍÁsÀSúð­ÙðSÕŸ~b…Â$¶€°îNp¡ ¼?e |– Qw Ä´Ï0ƒwšJ ê/£øÿÊ„Žºi*ÃQFû˜qyý³3BoU_QQ'_Õâžê±%=Öõ–ò0.}ó¾£:öݺ;wlnNú·Z°™þÀI,ÝV 1{®Rº]¦]ürž‹SǶã ÿÿwH%ÏèÕþÍ„f|¥ÿÙÂá:NˆÚüÀ¯¨ ÄOõ@=FL}ïÖ­–¿YMb«$D„áפIÐÿ¬_}è\ãâe5N-ùwýªÜ>]§–/ƒñI½æÇ5w8v ø½?ª#rïr꼯mpû]Ü*Zÿò?Åk–2´òÿdBì+‚ͧº‹í¬_H½;6H§·šÿ]_“Fr¸øÈ:ŽƒRt;ÛÑë,Ÿ£ï|Z!tB¼°p4žãÒÁút*û£ÜÁ÷µE‡Þõ }a›´ÆÊ–>,­_» ÖiŸ\¬Å{òY}ýfuñÿŸõ«¡ËýóÕ/iØ¿%,äþî>SȰ+/ÈØÝº ëI7›d_é™ÞŒSCi£ŠÐ9©WÜ;Xéy´wA6míÁóÙ61æ«-½›n7~ezÜp§Õeà«ûZ¼žßÙL+Vÿ(f3qõý­.Ö2J/Ð'ÏíÂÀ™­òræb³g»/$Š;åò‘¦ké·„yð?0…$fÛÏ‹Ÿ‡Ó³|XçŽèÐ.îkÑïg@l½NmV]XõBsõí—Œ4ÖRM»XK ¿0Aa4ß)…`nÃõùìhÔ׳ڎ£U,nÐÕÁzVæÛD­Öi»}XEDû¶TŸ­ÏÂø8È܆læŒz·,:"?õj¿{©M鸫†>Ù5Cî6q‚€ôñµõ'‘xŽ&PôÚŒ5¸ûkƒzù&:*ŽvÃ"?²•çpTáìÍ𘮯Cw½øuÓ¿¤ou]¾·å>¸†pý›²Ú‘—ñ`ã‡îJþý¼³^ógÇymõzÄaêÍä{èŸÕO$Í|šviÒ\ÚÕI^÷ȱ¶õØqa°nøæc­ú%?±FöûÑž,Ôv01›Yx¿{ðÈ÷ü>¸mk…‹ØþóÙôý¶î}ˆzÜ “Âùƒ÷éYdyôò:€ÏáX×ßò%XOgÞž¯•ÙÉôÌémÒtB1ý WtÙ}1ï0.Ö½«_nø¯Q{‚á™!ÃÎz_ö®ä¥îõoozpgßü€ €ÜIu³/ÌøNïÓö'½Æy·êΉôÜU :+%!:ÅxÞq·!»p±²¾ÿÿÎá ìþ¸ò=­£ð³y+ÐqQa)úX§VðÞR C}a÷•¦oÕZíQ t†CFM„›ÁÈÛœû¯çþÖ…SÚ›n﹄ݑlöšmå.‚çjÕµJwPYÜÔ7]ÌÝôçò œÚTÚµ{Yûj'³“ fÙ :þ¾™akùöaó/— œ¡»Ûüõ\¶üæv:ö'^VcKÃ6}{ÓF®r&‡ÝdʉÒäy»¹çaº|¢.r­:¦V<º»Mùêf1óÃ9¨S¯ÑP;ŽU´MJN;)c3ʶa=keÛâ{Bv–VÆ‹–4—p†ˆ9«Ûª™ŸB¾±”åÕ?è½üã\ˆÅMã6zÌ®³ç:€çDt€î 'n äe¼/MQª—W¿|gC!šÛFPçvN&=tê7#j“/yigmfo3ßnl›Ý›%d´êQ®ÕÀÔœ Òš©05ÖX. ÕÐõUGßl?ÞòZG½Ì¼€v€/’V5ÍVí}Wê™L²8Y=—Ž‹?øø¯Œ‰ú˜Šž2÷ßc÷÷SÔ¾œŸ²]ýp¬vZ=·êV«M²}ù6û^quë…÷K˜.†­)´ [9í¸0•Íqc­ôdè‡ô÷ó’Š.úÒ[o2§—C Õœ\ת‡DR»uÔRñ‹5RÃZ¡!á©ÐŠjÞÏùnsÔ5£ wþ/Û×À.ƒÞ­˜‹†É¸×éË7ª™=c¨ÌÑn­dbíëøV°Gô¥f‰…=Õ’ËÉT¹·a¬Â‚k ¹Š§[j}¢cˆ4לž¶Ñjdï¤v‡½«J°‹TLöB›¥Js´çÙ&×ö59å,“ÅìYj|Íû­ñmeó¦¶Q¥6äS)ú‡¨BÎ6ò¦–›%ï]ò·HÙãeÒé®—Ù­¥_ªM¯*ekrÔ¡–ÜWJ&¢ 55ŒŽµ•l.¦9¯¾©ÆâØU‰lÊ«$ÍýD¡—§Yó¡?×M.ÉåÔ#orÀhŸÆw9F‘~#Ю"K Ïs%ùFòr.âzM—Åõ†²2ö“Œg$®ÃKÃüÖÈÊEüܾønì v§bM¥¶7‹+°Nh «9ì~K®e­ö¼âj6_àφ›ÍÇ©l6ywåô£eIn2€úóFSf1L#_Øœ¥Å<¥]Í‹ëG«*š‹‹(–tÆì­7*vÊx…Êðnð'N÷…Êh6*Î8üc¹{Áõóˆ¼q“ÞÒÜÛÎŵD›_ÙxÖ*óõNÁ(U÷_ͺ@%uQ˜Siò~—’ƒ÷HAcª4šóU«‘W¯I‹_žTèqC±K±•k„½:L„6rBå‚cü©ßçøúýbrŸ÷²(V;î¹¾îg_ë›ÔˆëKJøKðÇß–'ÁÒ»½çéëw[J§Õ¾]dñ/Ÿll(!kãßþG¹uÊ¯æ˜ÆòrÈ#ÅÆ¬…ÕùÍüÀ’^%qÓS5±t3,¡Í®ÐV¶¾P…۬‹W.ÜåÖysýÙå(•¢Ù;ê,k¾=–í;æEó9æÅÈ óª\Ì«ZX¶M…¿?ÙÄqå&­ñì0¯»Q§jdÁø€ðæò”¯é•óRnK*m Ôö.ç#–û /Ù#&–Å.´£˜ª $ó3fðx—s¸+ay\ÿ; 9*:¯~`ö®À'vTU^Ì«;@˜ q'áÖPèÏp? §¿¦e$ýÐrjÐϨGO…O@Oñûä—ñßÞ,ãê@ßõç˜?tñ¨lXsÌ­Ë©ªö½ø›BÿójÌ‘îMÒoV*–WZNpP»Èw+v•»Ž}:ëlw{ŸUvdC6ËUj=æu’ÇÌdm(©L«TÉÚQÉõd ›“צÜÛG öõ ¦œS–þ ›Ž,†ŒlsíV ëð¶%r ÛKeå‰ìI9/ÜËÂIúBóåR¼£¹E*1~¶—Ç:]œÝj¾ªª¢öB+ßb±V™nY¦"Ú D‡6\:˜:.ø¢kY{)[ÿ\F­ôSÚUÌjÉ:¥ÍÖuè±”Û¢ÎþŒ ÇÜ^)a´Ô+aXsð‡ÂÙ%GÚ¤µ,ßmí¢/Í IicmË|øÈ3Ó|íMåàwt,]ëôxv®|ÂÓÔ½¼žã¯²éXùr©6*•vñª^²ƒWª4ªMô”k´Pw>ì£uõ{—Ò®HöÝgáF½KïáŠÆM]䉖ˆŸÈYƒüQ6+xŠT¸±#p®Uaóó\`ç•åaþpÏ+ã—Wºm+?[ùÙääuðŽ¼µ”åf¤ãCµõ»?ÌÑ•¥m·MóƒpRýK|“¶U‡ê7ÉÿTC£ðÄt|+UçŸpß ˆØé^ay;xÂ5ýf< ùE­æÕG瑎%Ak|nBèàÚËí<‹.rÖ³GáöηUµPAmè@ÍáN ærUPÓÎMPÓ«vF£Ûž8ñÊ´äöP£Y§-«}^b;Ó‚ù§Ìg\Æû>S¨N«Ãf4KY?Vªµ†ÏÂ#(ß©y¸Âyýð„J¾õ§‘‚ún1c]õÊejÆ¡êO*x~s8ÜÈ~ïuÁA=õLP¿Ô‚ŒëÔ·ìõ¨½Ý_ÆLbV@/Å2T׆ÜØ4¯_ÏœMž¿8o€¿×ùŒ¤˜…(bÕ ™>oB„[úÆm³yɸåÑê1€°ˆ6 äköƒæð–­‚«;‹) jɪUb{kõIQ~cÓÁ\þN’F6¾¨´.“µÙV¨½ómÔf½æ7XaB (<®HUyÛ¹/ +$C#Èæ¤HûL²9T@ÎB‡¼È{o“ñ½g×BA> ¨žÜ•Šþ!Ä!¹LA¼žpXÓÚ5È>ÀØÿÉ'‹ PÝWPA®¨u•ÈP~×€J÷  Àt]êZ[O=¦€^n߀^‰@Ÿ?M@ÇcÐoû èYÌxH€þv»¿û*xž1¼ª““vhؤ²àù£ЭIàá£þ¥SEfe«Ô[ˆj!d Ö=F€ªá’ùO>Yíd_öÂR·¹§ 4CdÀX¿;ƒfà;€™ûÿìéÀ¢Î°fîØõ4Ø K®˜]‡/"À‰Îp’ˆ®Ule„ÀY…-àvÒÔ>ÞU¤Úã=‹VK’ø¦ÓZóQÏ"ØrgÕè>¡eÁ†qÔrÝO¥ñŸòX¤òŸ¼íß:`=nÿ‡ß .{ƺÿ;;»fe¸ãÀ—;gÀ·Þ)à·ýþw7`AL»@&k ´ô/“ñveCˆ0ƒ²{&>ÿ¯Lè¿™Ð"ÿÏ›øÿÝÌvsOè^QáSx.Ê÷òüDœWÖ˜ã}ß‘/înÝáÆ•Õ›“[-ÀÛIàÝ„˜ ë7‚ËÃÐâÔ¾ƒDþɃ~“xª;žûï;¼Þ¼iÞNºo¦¥çõñ…[×gço;¿:C÷î„ .Ç£ñ¸\Ö{™ìÝÜðþÏúÕ2ÛÄœþŸõ««Ú:í赘ܥUÄÍ4Q¼ßìè÷}\"³a~±VÞøÂ„ßäñ%Aóàéaîn]ÊPBLVÈ…[:ås„©ÄI½Èü‰ÊÞ¨±#–kKoc÷ÞøX2Xõõp-^â`QÇhv‹å‚K¶K$HŽ <®ó’>ç6RÉÍŽ&ƒÎj{“ˆzÕ¨1MzhwJß¶ûð1¢Þúœšÿ—Ÿÿ­£ãçæÜØcœjÎñ„t‡}mÊœ¶^¡rßp‡Òw-ÆÕÂJ¾áÕ¥úª’ ã[dç»fQœcËbsæa-Š­œõ°²3MÜbwêÕ©Ñ>úlú”¾ ÒQçˆé8™DÒæ3æ¹ÒXC²áÙÔ=ÝŠ6¾YN¯ßä_þJøD¬Â-!ƇÍùk®ƒý‘6>zî¯ä«‘Ý—ÅšùãV3‘OQlZ÷iÒ¶>ᣫA!—h… `´r >íÚ$lr"zìx!÷ıöûÎʵ™¾Yˆ;£]+°#:ºuzçÅ}çî÷#ò$<¡:Пö,c¼ú£ÿ˜v–/è¹þ&ä~˜œ–}z½eTgÕÔòÂHùÆÌÍßäibmŒðá^ºA@üIÄ]fã…tÊBžÙíè›ðíòvÆí>Âv·4›9|ÀЭ/îK^ÀkƒÄcéýlˆýÇrlôùâ¦Ó <0é~ŸÌ¦-×Ïn^´ñβDÛ%¹ttpŸu ³CôÇítÔ¾Y«T¯xó o“EëJ˜Q_ÂçVÀƒw=GO¢á”ˆ©ì—ì{{T™ä¼a=Ê^¿R]n|7`®ø©?–Ù¤/@g/ÔŸ^£`廳–ƒvj^ÿ;ËÑíè<¬¸›à¸år{ä´G§µSåùGûôÉãmÜZXö•©íþ›Øƒ<üñ—TÞ1w\씢7åö=m¢ú ão‡ƒÊè€Bè¨m£õ߬õûË †ó¯Ü_ÐVï“UN/§r~WY‹ÓΪ$/;úÞÚ¹Ûªur[¯ÉÍ9ˆ“—S"Ð>7…6¾|Tík—æl*±4kÄL;—£ÖÄhŸ["É–~`ó›+é¦ì¸^†7ú¨fOk»“®gE ¡QRßÍQ½Róÿ‘õž ª*]×öôA” JÎ9#ˆ ³˜sÎzþ/íZûÙû»¿?—vÑ6eÅœ£'£rY¬ñäÅL£çÐùÈDóx=P¾Ž œ^à ±X­výZ•Rã¸;½49g;IYp;ÓàF¯ÖÜXíKOþv-iíÏÛÿ¸JÁ7>íMø‰æ978(Î]¯SôéǺˆœÚYw•4,·\ÉE)è–Kùø‹57Þ_'ëHó—A&ƒÔÛõôð5UÂc#ë#õùgêÈ®ü©áCªj6^>*|YÌtõ@¡néyØUJ:wŒüdtoûV:™x“y~â¹>½,Î×Ü®è·Ê7wõh¥™…[žÝqg‡¢S»ÄEû(vvf6·È¼¬Kã­Z—f«fµ„Aã_,Þhx5¡î¸»Ô&ÕX:ðzYº¶¾äá*Spßn¼¾”ÅhžÉ¥—=K£IoCøÖù-xS© {ùéKˆT.¢+;t+„;»z±ç¤)ÃÈ¡ßÓ¥Ý0×{›Oç«U— KbºŒyÿäLS-»5ãMã- ïÆàÙNïb†1()Œè_Ìȼ 5‘¶÷;«Ü0­“ZÇá9U9Õ×PðpÁ³4XÛ'Ô“îÞ4á?ÅR…ÝõÉ$]Ò¬¦±Ó¤©Ù§|ϱ‹Yš¿XWl™Çõ[R§Ð7»/llª {m ±ÊÉ0®{`d: ¡Ý¦C‹{ Íšå¾6‹©“æI8—békž …ÿb†hòµ?~íû-¡™K÷Î M¹®}"xfKÙRæ2¸{3¯p,ÙÍÉ­¼–‡ÙL€Ý¤¶ëÚÿЖœÉ fÏA4SƒÇú‚o˜¨S32—f¬[³C§™6›vš•ž?†pD Ƥ¨âNËS¶ù\[ÙÒÛƒR=­¥zŠ)–õ¿Xkjr8õüL¯×|¶w~½Œ›RùÖ£ñ’yd2ž×3®îæ6Û;aCÛØ‚,ŸÓ“uönöÖ~Îø5Ô0ØÖÇ玠;ÉV׿¹ƒ£yÓO !RWW¬ÙQñØK”­5[+5(sU¨}ˇpÏÉ‘n¸2vmé«ù9SWE‚VËŒ%)Û¦û»žxMˆ\…º%eù097䨈ôeŽñÒù4>Iq‚g%Ñ iñNþÖ2ïëMQ‰Ð•¨ 8\TKTšrí/¶štÚÊ®}x;r[†[¹ >½^’Û-®‹s˜\ÏÖmÌnL/Œì½³ÑæË訡xç®tüQj¬Ðü—£ñ…•.ð]’.yÚ”â£ëKb#®‹wãлYd**Ûà ¼j›ôªŒ@ ú{f á#~d­çüÈÞø‘üÈÍVÐÿ`´×¦ßqˆö0§|¯Ìyß}µ?z²h„SŸk}š«Í5).T¢Ãí~Gì%žåF†{H—ª•ZTïQƒ»ÜˆUp×…×8ï G¬µp˜'üh€oyÛ¨>y(søé6иbíZãŠõÖ”+°uˆ+F®ÎýUù'}ïo+_ô§âh+ï~³Nœv0ðʬWâ‹§a•Þæ«êô©Ø_jèIœ¥c™È ÿ²–Z•õN¼?îWQÕÁ[xŒŠŠ ²Äò£}+`y»·³yH7tÄ×µW¨¬–ì’¢nlé™ ,6ÀefcôÊÌÆTGL5Çfc£ ³‘j~Š8`±J'蕘⢠nVT=ÞfVi´²Ø")3ùÈ–TòiŒúÂAà îB©OÀTæ£ÁH|H­…ðöÁ8ÎüX\Ôéu|R§ÓT¤YV÷iÑKtèùAgw+Ì¢é‹+­c`øÅižvNÚ6߯ã¡×ÈA ³ÜBJÓAêP0YiÂÃ9f™¯®îÙåɾ²Á°õaqs3ÕÉg¨z†£ £ÒáÉvhvØ­PgóØ¢â1¦„it oÅW†ì°GÊ—l:8—qx¶+WRÞÖRžÜ]²“#ÒÙ’lßó~›ï/'!ÖZTËêUÐ=lq¤ìkr‚ÍÌæúÔ°ûó t~!öÖ£)?þ`Cλ]‡,¾¸Î™ÿÞЇNæHG®ô¤Î -CÅ¥ @‰iDÞ®{1ÝK§“1Ò ˆ÷‰W¾Ñ ú‹ÝÐnK¼ÿÆ“AáV=±ñ+´ðW8â9cq«4°qËXxx28ú±™I-ôê•Ò¸wSÝýf@Z½éÒg‡ñ#½^…íA’èJ0)ç[؈© z}šk÷&äÝdím‰Wky!ÒõEèO8G€¾€á#?`qªxn}r±4‘©aE¹ÒÃòÏÝ] ”Z2Öø„bYÝ@Öé†TÔæY÷Æ$²ŽEç¥â_¯ï4,”|ÄJó¡_$Ls¤¡+h>ässuA&·æóZcÎ]hL]Æá€x§£TÃàÇ.±bî±B\½¡K±÷AK÷ŒbÝ'lÎ%Ø<—û˜ië iÍk±z~æ[þüà¸Î%‹ŠfòÀueH¾xæSÇNz¯äJóÜž>Õ‹+²×>Íð Æh¹p¢Z­ ßùÚzU£4 :›‡3¤³/4è\nÄ»xκvø\®}6³S…*gÝWØÉ,ŒÓ2SÊÚÏ :y§ß”ß¶ ˆá« ÊçÛ”×}¬1\IaZåÑmxÄwì®’“Œ©W Uƒ!Iµ÷WøfÂäu$Ÿ±Á'ýÓMC©Y¡!|Æðý•$1ŽÓ£Ÿƒúµefi‹« 6ã¶`ãYgPEjO@®¦ /(•¢¬¤8û€¼š­§ o•ôWî ÈݺÈ™ßä\¸r@q€lT3¯T ø0`ݧcþEÒ6ø‰”Ûr6ÿU¼ØÕRéëBä:ź^?¶…Ƨº‚{Ex™¥Ã,;§’ØVÜ öú&Eí¨Çü¨'ÈÖÑ¿ëðš†ÍA%ŵh¦´4  Ð\9Ý€!c@g6@g72 îR)E#òªt&t¤ÓÙ5×€¾D À€Ã0rKÁ>ÃûÀI0¥ ˜¦&§º€I°(Ek˜zL1…3vÀLð(ý.Lg³L·™~:”$ÀDùô×#PdýGd™Û­§QŸ* 2{žÇ ,I_k.ú-¤F·õ(ˆÕÖ 6ÿÈë§[¦r ΀Ík)”à X·ùëxÀº³Oz>0`» Ø©Cv×{€#ípÒ® 8Y™Î9ßç–1Àq3Å)Ýà €ÓÕ<à  ¥XÅ€„™£Ø§¦VA:[JÖÑ<:£2gMH«Ñq¾à©©`~À9DªfA„_ßõätÜ*ÈÿÅ9,î3ÆÏe8Àë’x¿”~»hTüýÕ`ùW<BÙ~€ÀÊLŠkút#ºA É¢ÓLñ^˜Ó󬥞Æçº” s%Ž.IeXUÛTçR¡½Ï±°…èZ’ÈÿÓ“½øyeóÅÛ/ª- íüW˽åþqtâ:ƒsˆ‰9âçz×ÎÉàe •î5 ýâè× XjÉRŠkHU»Ÿb½Òk¹ë@î¿ð6¿>[Ýk7*2ÝxH|„-xÔ‹ôÖÍ)»ôíÿUÀ_Kà_éö~[èÿú'ÿGÆýµãýëÄÛë¹ Í|-í¿ÞWMKt(ël(—娙tT¼d•@Û@û‹ŸÓ?:¨ñÕǾ î߇øÿ1³e¦_o„G’¯ßî¬ò¾ÃÕ&tC¢*r .U⊷Úì¥úh çƒÊçðÓÖOg«mŸâÜØ?ÞŠãÊQ^΢Cßt¾«eA“}ÂH»}¶Ùýü³ZÖ¢ü¯½À·_¤b½öJCÿàÛï•øìgçaÎáòÝYSñÍÛ Ã+S³èBuñõ™"‡“0É^Žòüv?ôÑÛ{ÿ©\2{s„öÙðŽìÒ+…ØÎÅ;³ ÞSn½5×ÊššìÌU”•–ç€h,…my¼è0øk!ŸæÌüãæ¼/fèûò¿­ÿ£„~5æû¤pÁ®Á±ArQ8õŠq¼Ù ÿÐG*µ}¶.5¶sko‚磷®ýpu°7ã;ÛÌ—1²\ý@‹[y¶]tˆÍqþ¬oþ¯‚õ–›e;tê¼f27eu‚LB¼*úc|¹»¶eÕƒøüzCª÷Ût:kÌõ -z×sp^›àAçÖT‚¢+vJ0‹[çÏÐfŸènÍÌ˽8H÷` ÷.Õ‰÷9†$¹ÇãrîÞm‹÷ᨆägÉ¡Œ®vdž1£?ÕÑft„Óv9»¯½ŸÃÞ'©ÿSºúõ«úØûÜ>×àÐØ;Yy¼Ebb°<;Fwþ¬’™yºÎ¦Îí½›xïÌu¼2±4m]J¥,’°›,1²טYÔÏ.ïFëV©Æ³äæÂñ§–FõYçr¨‹Smqܪ•ùTê—%Rn<–TpÕNb ­ÞzéQÁÜ’ºÇJþ;äk¾qæ~&6:ž“+=hÚš½Âhç.›—»ˆ<ìlºÆ©/fš‰ïÏzh‡ñyf‡£OÁf¦j©}ñ_,@¡6vŽxµC4Šjã¥<ñ0¯Ý3Õí)w­DrqW>³×EY Nû@fö—’f>>¾é>ao|BˆÈsš2_œÝ4¥èu<Ó]å«E7X´ËÎë…Nu3kÙù4´ÃWaa þ`ÅX÷cÞÚÜì(¶j*ùcÅx.ý‘Ñý¬¡Ûˆ”¢êþ‹hZʃIß&çåCr8mÇhu×>å58—^Ö{S…`æ[Yyé¹yaWô1áâ®ÚÞÇÅŸQÞ©é1nÒÉÑŽ*[Ù:ï·º‡7Ç980;#*”LÅÖÚF_z¸Üè#Ýukô\å*jSÊö5÷ùêkùÁù¥å—^˯(ç/Ä×[ƒQ·”¸¥¦Å:¹hùšFS%£"½é°Þ_Š%ø9v×èdìì þÂ>²ÉÎæâÕÕjånóîØì"n¼Ê4c DK2@×Õõ‘ZstëÝ´i°Š´"þéiù»¹PKjó¤bH6§¬Ï!§Tâw:b i·: éÄwyŸW˜+K!ݳýEÒúðƒö¾˜÷¢q1ª¡”/êóþôfZæPÄ\yáÔGÉÈ>Δ¾Õ*‹S³[§—Æë$î ÃôïúhRNg~Ýv»°6] 0­Ø8²êâzÕRè*¦®²É»U¥²è´ä=Ëõµûþ ^:Õ)Zj2=Kâ?|, €8IB&G¥ˆÍtÃ52ïɵ÷µš¥c1Dpœ+_ß Ø¯Gb`nöNÈgçÖÕ³†æÃ|uaþ˜ècl=Õ¡êq­÷£ºäÁ]ÅÆP6Ž”Wª°Ë{¿ÈÈ!Údæ²0¥SëžÎ–RÓ’@ÅC±m×¢lh/á™™ãÂw ¡·}4­>Ú Z8À…ÞAÑSXæýñ ×‰åêÀ­ãΓ žæö¼YñæèæÎ¤íÌ앉ÁddŽÝ¶]ë=­ð¬ŒTgJµÒØÊû}÷,³ìà‘&[K 5ãk^¼Þ¸Øž‘œ({†*<Ù–+ôÎ몠ˆ.ÿ©ÄK>!?wÞ|ÖP>Ûÿ¨|vЫ§™øÄ´WÜIJÓÖH[G¨ñEï×W¶ññm»zðçL)Qì\±Œ¨7û\r¶æÓKfF–Þõ´y¦ÒVƒ9ÙR¨ Ô—Ã=4’šŸÂBi/vrêåžEõ!ô AFÐNC„ÿ47ŸXÄ[9Éâ³»F™›Ôw-ÎÕÄ’ ;_s…+™õ«f•EihÎúuI1MÛŠkO/zïãq4± æ¯ã´]¦üÉ@ʹµ2s³:Ujc$åòT›óÝ®ŠÏÉX>Ä›HŠÕYG¼-7Cá¹MÞ¬øÏñqà-þ}åsYæÃM&&̹µ&ÁåéÏÎõ‡|zôYÔ¬7˜5~3åudÊ3D¯&Ò;=¤ØOéq‚éY¢9оh’[ó[^îôÒó[ïŒÃ¹×‹Ù?ÀÝ­‹•€íŽÅ×fzމÅf(¼„ €âtykà%Ü 眻nÙ5>±þóúdÑœeÖ†€2¬Ê2Äf¨Ð»êÕ¥ëŠÒô«;¤ŽKtO5‚V†j”iŽâ‰¹O^ö^òQ<ÕÎQ–¤Ü»-fµÁC4^g—`Ua6ä9¦÷Ú¡K3ÉaH*È‚â÷ø–¼¦IÙf½')}ú9â‘l1¢gg9B#Mï{i&ŽÃw7¹âÏ\.l<®“ØxBؘãn»˜£î_ظפñÌþ$Ѱó Zi•(Å[ Z¨Ã‹•™½“VªÇ+ù¯ÇÂ[½vx{4Ù¥þI¯J†|t*ÔéGä-·I¹õˆÞ©?&´æj‰„ÛÞ‘nNu€g‹µ6)LhÌY> Ž5‹Ã&ê= Séµ®ÈJÇP¤ F:‚­Á'A] Á'QÓmm),UZAð&R±2¶ë¡Jo}†²G•lZKéêÆBfyêržâÅLµu ©3U‰g—®àIšáÙÝÆ\…îcù¼?Cç‹(ÆQ¿49¡(vx «šCÊG% Û×Á*Ô–r=ÄÛÃ|´ÃŽ)6…<çI2|Aî!|Á²ç— èþÒzPw°ßAªéå Õ*H¹×}Pͽý-”F§yH…·,Ôu³b¥ín\/(ÒœÝN§hé^_jµû<ÊBMY ÙšrÈö4 £¶Ð&;ŸmÝ4ºÀ YPEH¿[ÎóûJ·µF –>ÝôHc¨W~­ D)ügî½@¹ax!s&G˹Ì%ò²Žtˆ³ÐÓ\dfýë+ãñ–í«“)l×ÃŒGlß?Pƃh4…ÏfÛ´ÜgÍOqëH4~*Qávû%tÍçÙÊŒ©½ö yŸ³]"C¬ZX¡i5òy¯ç»^ž^=Ê%åz;;©Ûݬ˔†™y³2M÷â Ýu¹­O`Õ/€¿I8Eƒø˜)ju@d’bóø}–”ø,|{|º}|¦à)"ÎGÎOþÍ[´1i†°F ³·tÏÎOéý%W„oêŠmÆ„ „†0«.Bu¬V^÷ÔŸuÃÜÄ™E±ØëâÆR”¦)k@f_g@æ”OŠ H('¤(;)>éœ H¸½d^z²áSLË€øøiç/n.Å“ĆҊt=Ñ­¨ÿq;QPó-ÊêúGönKkâ#Ÿæ˜Ojc„6ü¸ð{РMwõdíØÎ¹n§Jïé8Ån($·«¥už). |…J‘¨€*áAŠ^P¿Mqͪ§‰õÇÙÙÓ­õ:÷š¤§)¬ ¥xh{~tåùøÕ“Û\ÐãôæÆúfZÊ‚™œ=J‘Ž7ýh!€~Zé†Òôq™þ‰S3m[Ý»ÈV'¾¡/5ƒ“¯Wœ]9ÇÒòöC¾zh:aË|匰Ðû÷sÕ-”= ›,êœÓþ¬ËsÀpó5`üó0Ñs˜rÌÂü­ n~þÔ³L¬ª1€-UÀö0°³A°sb‘bþüUz> Ø%•nZ¾Ç€MwÀ¶T°mà¦Hºª©#BÅäàPñî£T½@¸Ká2Ý'<Ø-7íî¯ÿÕ“ÝðØÉì»—Ûé ¸ì㟲`‹Ê®ì÷HÀ­®<à.˜x´â^¿×ÿ1søìßìäŸÈ"àG™ôPŽvKÀ[ÀO”´­³-¾«uÒhœpDGV™¢Æ )Ð7áÌn•#ã´ÀïZ†`te¨þ[šŒdþêÉÿJ·ß*à/$ø'Ïþ•M¿ŽÕ…þëÞÐɰµª@ÄWm –Í9ãë ˆ£&Äd¦xµ€xÛ€xï§m-m{œ" >ÕD¹F~ ÂÁÀe9ûdv‘RÐ}¿&äµå‚†òt‰úõOÞﱿúíÊŸŒ§Êßê߯xû¯Ã¿2î¿v¼ÅsH3³dr?rÛ>ü]5 Ÿ¦Ñ—U«ü®bV&@iC¯§´u2¨eJÒ­­þ)Xý–ƒ~ŸÿÚn¥çÓ`ݽèù43ç6a–l Ûßæäû|]±ÇŸKõþÌý:¨Ï™Þ°ÓÙÊÒ'aòᎷ""å%¢žë´­ìÚ wÞü]2«9Ù"ýÍqSÎ4ÉõÖÍXëZ^­üÇpàwݬÅ- œŸßÿêŒùÌ·xõ[ü0g‘r‡Ë5û†Ôãòoö›çƒ÷NqÆOŽØú¨²LïôfŸ éÃÎ9çí\Do›• ž|ðú¬k™wnup3ȯì"—1F ‹Ejógdxó>7gŸ¶²™™/P˜eei:1Ü¿p3Š8…Ǵ𿥫æt‘½ÇBæ>–Ðñfõ°C¿Ðf ý'˜©;çØ´6ÁSp×ÔöWìôSY ËsýOýê³vhÏûô­?û4ÎÉ̼ž§³lû³š:ÏÏn27àËã¯qVàÑÖ÷ÉQ ]©É¡*Ôö˜Ùüªp&Æü8?®mø~ü·wgI_Ïl÷´:h y½Eâòbu0óëeœÏ,ÿœ÷),73/dêÜßäÄ{Ÿ˜ñÊ< c|rR¾êèÃQ‹«Jo/a7ïòŸ VáXˆžìä«=ë÷åʶ÷én= œr݉ó]7Ÿ¯wæ¥þ¼3ËJWü·‡?Ð×h`;gAs)Ì6ÕYÂÕÉ\>×Çe°mjÐa˜¼Ï"a×È~(ìáË@>=ïýgŒ‚¾vÏçz‰šË÷Ì7Šõ²CšJCšëÂEîøyEo¯J–ûµñM¹ÒÚV'­u8$ñ¡ÁncöZ}6c%K7…×µÖ¸ íä[°ú³8ùöñ$ «ÓõV±«ó>þ1&HïÂ'Q¡(:Ô[ì÷ùŒÑKdÈûº½Pëº@ju|ˆï·Wž4nã+uѪÒºEíŒ}1ê)fOÅ{óܬ¼›Â­šmÜ:íBC~ Éè98‰‘žÍ˜aâ2Ahåíú¤´›Õá­x«Íë´øÕ|&)Õ|6Û¬!§[ã‹óAʬ¾}LOâHIÅ6B¶gÞ¹ŽŸ-CírÞG[5¬ÌÄU–šç(6›Â¥ï5:RR‰ž½IiŸ$?ɪ÷…‰uHÂìt;©OŠ·eÝE²»Ú¼œ=Õò¨®êz®ŠŸÊx¥&$b…ºgÝr¤Êa™}o¦Á9fƒØ–Ä@„ZNúná}±·ŽÂl’f)ásSáêÙ¨Sh—oì£EsµCó§F'=Q_¹¿ÂÄxCavRÀënždkó#Õ ¯WWÕ4~ņ_ÙFÅJ…ºØõò¡U‰Ë‘Ôêç^+ bm±(Ý’ãþ*)Pîá?gvÞב.ë}ÖÀò,ÒMCÓ'»õry)NŽ¡˜b¬}±âÝWw´Oõž}8Q­ú-Ê4ºÚ%m§›0w,®ên»°NÃl]-‹³cšï׊›GùpúäÊœ£A<Å©@,ÊB©sÒ”’ÒôLÿ%„E_ïTK>p‡uÏZŒc/W: Šî­°(æ;öÉ-åÇ=a”SJºCÜ.5{7¬ìݾÿ[§Tï#iÛ—Õ/fãˆozÝ—Ö®öL¼¡UžïºçÕª\XT˜$Hʧœ9.»æSÚTªÆ£&.žJäStø‰øÅ¸z k=xÒPšw‹Ôçq”F_¡6è½YIk|¾)—[¾q¨õ½1Zgdyá.ÙòÎÅ’ÎÕÙX«CNw½/ÞQ;Dr”uŠQÞjŠœb^»¢i¶U×3˸nô‚mWßáY] »ÁY϶9m¼’9͉÷žK­‘;ÝŒ»4›Bä¿HD¯´wRŠ’k9_­ˆ{ ´2?'°“â¼÷Ü•kºxqÑp6Ëu×ÞßÖIz\Xå²°šƒ×μeÁÙlo¹—ñ¤¥¬Ñ;ÚC4H=É4XÝdm/LÍ9‚’7Ćêg¢DE6Ÿ½²ªùé}þµ¥äíдåíŠȵ úJ1" ôeÇÊÛõè£U_¼__ø(Tn9ë«o†«":?Œœ¤tíh9mXç­Zµ„—›ò•é}ÇéŸyq‘†¥­ž]·ÎÚ¤µ~iðc“Qç½kzŽ©¾ÊjMrJ¹¢* !µ\¹Ö›VeÚG{Ò­­¤èòyŠÇÇÅ‹ ›b+?k‹-f÷[l‰HÑeÅÒ`zEÄòšªXåj¤x̕Ҝ÷ì„põ9õV'±.Ë{Ûì*vh ÐkÙÒ¦¦[ém^s“MW]äN#-^çÊšÅvJù,]ä(=äÚÝËÈt7ÌKÇô<‘¸å†/qÁ[¢ˆRnѺ!:Os1•®ü hЉÆÆN“lëiªµÃ0~0•hþ³™.FÅhtBèÊIdý1)ýVü² ›ï¹C³{[· à Óioß.iù³¨èά+ÆLs1y7 z2“ ÇÒq2\J|~¸/‹ÍYl5ÞOá~Ëf„n‡EÕ þMÏT~p|ych7øŒ¹žpcB9sönç ž%³3=²3£pâ Áá aþ¾/íúba‡Åë™*·x³<9¡,ÌGB ãÕji3h_UŸ ¤T¦YW®/‘ªÔØ|BñJ}bQjÀ}áÁScAm³ þíx{~‡Þ˜_?Ÿ‰n07æ‚s2ŽÈA›™ÃÎjPõ”ƈ-¼Á‘Y.”ó"ƒóƒ“›T›ù{ŠYŽÓ)“ß4¬z ¯¨@SˆO1N»ÙºÍO.?H¯J8cÇjÀŽ« 9Å=éÔX9âµ=/ ~¿"h òC{Òæ3³IŸsØí„ƒÎ·%;kÁ{Ö³µ;‹@µ ‹ŒY`Ž úžÉàú¬BoÓÃJW7£ÝDS)K”5O…o¿L…Ÿê–:èrº!ê‘_4sɨQ\(™ÑëíV·Ëƒ%÷&3#«\úâH±B‰ÕŠÔlœ‹¢ìD¶ ù®Ë›+àœžRM ¬ùMÖKÊ]f•+™`Ú™1x}»¥·ÌóLW?ì;ET ©Õ–¡D£"©PìãÚ%Ï}{MÆþýCŠX…!n[Ô'n;vMŠÄ'KƶC|ñ5>(iTÎ$‡ùÎzýr¢|{ojçhªÃƒu_Ùjï†t.šQÏ‹|Â)7‘r&;÷PŸY¯€Á·¯½íÒ-šzs}ê0´&TÄkŠÃ'Gò¼=§92w‰\ŠIŠÅƒBÜÊ#:«v‹PZØIƒÞ2®÷wE\œxÿ=ø‹Åñ/"gºTË·Å‹]é’[6„þ6[æò¶è0kæbÒu¼«S ¥a‘­RÃ#ºÕbé"T¹âƒ~7Æ }ÑÇ3à2ÁFtÙUå„ATí…NŸ»Z ,Z0|Yf5¤41GV{\¬ÞF –7 •5š6èóŽ`†ŸGJƒZ«Õé¯Û‰s$˜»©Ï‘íáû¨«Ý¯ðÍäO…-‘z‘Þ-ï6Å+è^1ÂŒƒ9Ìà UЙ­F¨•:haÖJe¸^ ûÚ#Ø…NG¬°i•r…ª½ Œªùý<*çÃRvg±æ>mq8ÅIƒ›õu>Íú×< Óp>”u¤ránÂ×íħ«‘[7dïËˆé ¯e³ÁMûçʯž¬ÑEªq[ÛÄ£Q4p“ʨèlµ7UîZ,l™_¨ž®ÕCÍüAdzùðnŒóì´µ†ÏÅõŽ‘Ü'E ƒ…ÕZ‚n-ч:Ò¼ ¥1ï6Å-Í^sÏF(åžÍb’Wî)Å%uНYÌI‚Ì×uxÑ»d­0òn,> BWÈa“-]¶Uš9s>)ÓS^‹G)=%5C Ž'AšYÀb­¤Ø„Ð~´¡Î K ¥©.Rt¹—p|åúw²Ó».›¼VÖJÄF6gm™)ä¼2îìÃdÜþ,ÈL^»ufòVÙ3€JAÐ_î¥9ò×èDÝ0ñZæûÓ±ð¡7s&C‘óy¹ÿ4¦¿ÿ-:H9y›ù£ÚN£œlÕʽóU/g”¼R.ƒU«ÙѦ×ÌÚÕe/3=ìÇ™bZg ¼tþ@©]“78ÀUMq¬L&c©{Š30nè ,†i^Ê~m¾­žêÝCµ³šþZ’ÑÑ„/ß}/É1uç!ÑïréÑÇÜñÈG*¨ä滇 KÍž ©·¡›7ÂR¦ðD<€£Ù [O´Î-Gç¡UŠâ%Å& p§RL €‹J˜â9¸4|œ2kGq«¼ßì=H¿Õû…þq;ÉâØGÃ%ê,Ÿ³þFøØÝÿßÄ«œ4°i“¨!•ù¨œo’’Ë,äå>¾˜u^=”e³ð§ó«Ãp3L1ŽA¥»!už¢±Kq¼B•`@ 4ÚN1oB÷V€0¨lŠ« ˆ4NáoAê  ˜±å5‰ésùýQkæÈ’’×·„oz±IÈn_èáP=i!› ×È7/‹:ô앪¹$á+Ù|í]ĵé2³¯§x7‰3]@ öfk Èà¸dL_™4@Šûï“õäÈ’SJ€{=@N }ŠMӮȞÒdÙÈÒ€,9š™LߘŽÒxVŽÏÈíktÂ’beII›Íw*ìÙ“^>ˆmh@^âôªÌ}Í VW#@ž˜P£ (µÞN1ªþšªG,5Ó·€ÚÇg@=/@SbÐrÂZAÌí: Urœb}´Ö¢f,€æ‘ѯҋmî€Æ—" s¼gLµ ¡2à“»ìƒÃæÄ‘º1õ->‰6 ”è9³|«sCC¾3ÊÎæâPÝQ÷¯žlÓé^ZúÐ#wöWÄ“ÍoM/ú<†O¯ ¦ä}Óè§mË, ˜wUláá)µ‹‚UŠþ°˜/6ˆ)Þi[n–ÌÃóDkßZê¯{6ï-á}¾èéœLŒÌÑ­l }¾‡È|³ë,*o—ÿÕ“Ù=`^ °´sù[\kßÛ>»Ý¼{ÏfG˜è?Ž'pkÃ<ØÕ«m3z’âv|6.>§€‡°NŠ×pÏ. ø¼eîµ­+Íמ&É ýšRÝ90ܽ¼ò·ƒtƒFvæ–ÅÌðü·KߎÜNïßjÛ¯€œ8ðßà_ðÈýëèð¯–ûÕNáºùè¡F—¿&¼@ÌÉ˧É6DJõ¨ £Ï´­¸â}<ÓK±‰¥ I\åA1ÔS‰ÉtFY#…V“áÌ|eƒ½—ý+lÿvéOG~]%þcáð­»ýÕoÿãã äÍß½|íþOÁ• ó <¶ýwé´jåä†y²Ó¼ëÄ@~x; À2”«!³O03óÞS§õZšÂIq0ñ!î5Af êßűþ®–õ¿Å«¿…¡7o nçðaߎòätÛ'Øì³s ¼õ.b½Õ"vÅNaq eþ¬åô¹vÌÙ³„Ïýã¿úxU'síþ[¿ziþ®ÉeƒîŸå’Q AçÉ¡Lov§_‡çz7;NGrÐs ?ؤÿìí¯ý¾ƒÿÁÿÇf€ßúðs¸ n÷Þ·tõš?Ëïþìf¦³l m¦Î¹L!ômëgDÍŸP®·ùaLn±¡°?Sƒ{`òù&öŸñGík÷Ùûôp¯g~¨JwbÉÍ®› ‡yq¼ì ËÇå÷Éú²·ñÝ[kmÃc¯Uã¬íPqóÅw¿}ܛ먻f¡;Ë6úƸ òFr(®­á9Ø•·Ú®Þ6v­~_È%½D³îD¿§ùþŸgùç8uÙëÚ^ù¹g»Œb µ­r­É ñ!dˆ8bm¾yŽ+Z3§^ãÖ½„ ùC ¢¾å¯#ÊeÂÏìc…‰ßŒC öþ ñ—ýè[^»sö\+;į´)3Œ±a¾÷iQHw¢>±ŽŸÝRír~+´¶¥›Þªá¸jl5flÔŒy¡Ý¸µÙ^£#ËIôì “¨¯k‹ð3’×ab;‡(´ ðVŸxÍwÝEVùÚ¼|£jÈWª«0ðªøyW¶-iQ©ÉL¡B=wz…z)•ñµkøêÉ#jÊàý>—]xH][[¿snžÓT=Íønq Ëw)io¾&¦A…V¶"Ô'n]­Ã‹†U›—ºÅ²éÕUuT«–©E£²¦­JÛõ+Ôå>.G2X–Ù'w bÝz–n£V¾Ô±ï\Iuûòû~ù:欽ÏV@R,åWý‹åy“)¶ŸßjíàÃ¥)ªÇUÔW $´ÀuZ‡g³EÍG–Ûj™˜*Ûúþù[.’)b)³w8Í^ƒs—bá ¥ÛUJS3ýçDvü¾ë”|=_­yI©{¶'Õë¢èÒüÙ7¬ëóWÚEn¶å¬º í”ÕóÕ)ke$Åœùb:­³Å¨ÿºATkwó>Ñ!õ†Íª-Tj·s«|t:Á¹í÷áY•:z¼ôŸ£þÞסäâ%^òð,d Š“ò*ºÄ)»éÎÃëú,!9«˜Ö §,ZE{Û-WíZqÕ±«ìÌŠâêÅâÄ3dÆ37ãy¦lŠ °1ÅÁ˜â2§@‰ãëzg)™h£'Mîµe©´.ŸÊéw”&mÿMÑ¡?èç£ô¸è«{:õV³89úî";¸¨»X:kúupˆÆëbï„üÓ®g¥¬MOì‚ÕȘŬyiŒdSʬMã>ɆJ+±þ:ö'ú`ˆœôLÖÏj£É-“5»Þ4;ì®5H§?)èƒ^q§´Xáa‘»TØ(³üÊ´ÌÑÍbá>¨ºØó\Ì$ËÎzKÖíݱдžìY6?6¯°±4[óÊþ2%¿u1èèi¨•1ÐßäÖ7®}’ÓÆ€W4{TqÕ9­«…~n ,õòV Àí£`c—’75Ü—« ´H1zÉU ʧïÞpV$¡ñl”¡_gããý\zîzs>tzζ¾Žì(Ë—­æ|ìZêY¿}Sš9e£ÇV#ý7;ºqoõLw6ÓÆê>‡áé ÎÊÐMõò­v¤Œ‰*Ø»—Ž˜\5gªLXI ëv,±êq.ž>úMl®.˜(T"KÚé(tŒGŠ!ôE__¹(£Ù ç´Ž¾5tfnyí÷l.èFf§ÿŒ¾í9ú§øIÏ1Ý V†žÍž‹œ_•Ôt UD€ÛJÐA ®°yó2Wru¤^¤p3|Ilû‹Íç……& ·RÏäë#䟓ʄï»÷3¯3õ÷9é^¸Ï…MxÞ7îs•³¼Î;¹VÔ²uµA•öÅ… OìcˆvÌ.­Ö P—´É¶´|v¢©>í+ʪT³|ìº2upéÅ‘Ä^â–xnM?Ûç©(BŸ•ν{Aá„ÿ¼øi¨7š ¼n?9.9°gEí*—3°„bƒ#ën˜Í×Ö ›¯úl>lžX÷€d¿ˆÅØ¡kÄ.þ” Úý@nÅ?Œ­VóÒ6 ¾PÓ¦aÕWKÙ›¥”eU® aTÏŸ»)ŠÖÝ:û\YPB:â_¬ÒæõXéóÀªM¹Q®¿æ¬éêÈåÂ쓲"ĺŸ˜ú˜…µR˜) úXöéu_ÚÑ}™¡+¥†D“x¹MWÊæ1Å6C¯“C¦1Pa²r\*/ß®?vßúd³»¶t»õ®©¥Xö’^Y2}ñ.Ò¨O¸Ç]QPî#¨‹ÑÇÙÙQ™ºÓ-æw-6Ê ™E“ž1%3),Û¹Òëí%íHÀhR$j_øøT}t(¦üX“')ÍOŒ#/"aÈ“ ïS„Š©w@dó+¼|Í¢O¯ 7vŠGÆî¶´BoYU*wÊû5o1ÅVï. ªUçx£(±œH2;Ýò[ y‹)5ø"ƒñv…®´íð¢I§Õ¡ÉêeLíéü*ÍðôÅ â7y*]²‰s<Éß—¸vñ˜h«Ã%!#ü ¬ö þXïBBÆV[BÆ…Ñ6ÍOXl'xЃ/"6©®­¶æ&éõ2.•b;·+2s<»b›RtA]­%>S·9vƧ9ÀR~ Ö¿Êt}èÔ¾òv¨*”ÈS„ÕȦ®Æ)ZCR@w âº{¢ÝV„,·`ü ¿Øï-, ×JÛûÞÞlxÒ˜Ù+•±á³¶Æ>Ôç}häý-£/ õéÝ%_ÚÊìÅÜP›¥¦B^Yø•+ô"Zç3÷Äz&Æ2³IÏ1º-9*l%òôè)¤àMâ†ì=¢½zTð§5R¨=¼÷¨Lpm¶ØbïuÅÎÈaæe@aÙvNG'N\GÝ<2AáEïŠÌGæeÌGá5½øP]ÝQ^Õ}‹F|Ç®ßìsYÃ;:TW0Ù”ÃWåjÇᇗ¼ÎÎÞ%‘ÞR'†:è=Š<ÛIÜÂôï>GÆûV cŸi`cI}`³LóJ,{z´ÑI\¢®e/Ñ|®uDæ»ûñC CÐ4V-ü?²Îs=YµëÚ[¸è½÷"‚ {ïbï]ÔýÿÐÜë¹×·Þ?grD#3(pÍ‘Á˜« áx>"ÂIöB°þ›Âwø2 Xk=%Â^p!VûN\TÅ5–%måâÝôÛÂñ»_ÙûÕ›„ª}¾È‘ötÄUÊÕøC/qÍb‰gM›a'ä%Úë25%“JZ›…ü,¹P%2w›5Iªsêáó5%Ø¥µÇw…ú¯0W¯°ŸYi¸p¿ç±c¯<ÀêvL°"1ª¦±ºÚаcS8cÇÐybµ…[:§úvÒ4ä”iÿ+|k~eoiÞ=:ÂvkéÜ…ÚÈlçQÐü¬”¨iùÆ“yw+ëÍA'Š¥›ïâw¯ ˜<.ºF%A£ƒ å«oÑ ¦”Ý[‚ ޶N„œ`Iv‰ÜMpÞ#=D‘nÌÛÈÃÔ¨^¾$+XT¯ÈI{ˆ»ˆŸ´‚'×óÊ3+,%‹’¿Âwt qõZ8üÑÔ öÞZ*Œ+ù"²dRá"bð½ß±S¿£b gdb*X¥Ðë:΢íÒ'Ó5x£™ =B‡ý éÕ‰3b+Y~]7<<ìè)8eîÐdh. ?u~A¾ÖQ IkÒ„&m}C›Á)›+^w§KϘSS¨¹]ínµkÊ;~Pi¡›°+L]®•§ f°Ÿ¨4ÚYÀo<¾ßtX¬1/ h‡êhHŸ ÄÞ—mø]íûðHZàÔùV…"î@jG6kï@ŽÜ<¹æ‰3#é÷ÉMºÈ™&ˆ’‡¦e ½B }bž søÆ²¤œXÝ[ëòEéªÏa©¦ ‡[Q\Ï´ _)ÖÚÐíK\îl…àëo k#!ÙcZ_FœV߀Û3ÀÁ @U('$蔜[€ªJãí- jP ¨~ƒÔ€°UW•tí€j2o@…[PÅeP~e“àxûAÓ—õt¦«÷ÎÜÝ©®§Åžê iIJ‚¸b³ìãØM3°!ºäÊš„@¤t¬¹…UÔœÏe¬û*”Ɇ 5ÍLà9€öš~‚yÐEìsÏ;]´» †3@— C‚ü;Áƒt§žt…ª'8¬]í €ÎÙÉëäÅ Sø9Aú¦ØùûagœŒûTë¡bÿ_²wûNå“s²µŠ’iºk¥| µÞ„'ÔA‡ˆ}Sô»l‚äìçFºeãÀäì `jí6`ú×1`â*Aý’à…fX”3~‚þgö3ö÷€i“D‚S 0åA0•è ˜,E¹¾±|X<í s&‰Á×ïÍ«ïN…Êc­!êt€éËeymììѳ ˜ÇíãQdyÞO`çkTK€-%ïÛ~´‰CÀn‹sÀÞÖ{À!òó[0k$«ÀáÐ°Ï ØS% س3ìÚœe‡Ìõ>i'ÕÓê Ùëõ\&o¡ —Œë²£µ„© !n3ªzyPš‡ÉëL²ÀA½<à”e¸üµ¸ZÜPonYìÿ:ƒyâ¾¼ýÉ |µs|$ßÍC1Aì~­~ˆÎ,ž€oÖUÀ·¼ àKä2Aœ<9˜Øvè,_úí6:*ÁlºEŠØWÎÐ$ué(41³øÑa4Ù­ƒõ -'UÐÉk‹™&à+Ýà§‹àï—lÁŸÈ!íÌÐêl0Þž€p%@¤s0Ý ÄFÊL°É±™î1¼ï€X`¥×Ϲ@,§’Ÿš¯#­ D©˜ò¬ðTǃæYâF‹-Ã肞·JS¢F˜•¯ ô @i7íþ©¦¨E¢%þ?+ðg+ òðG3ýìP^¾4%q Ý}Èìì“Ä«û ¦5 —’“KçËÈ•BÈY} d¼Œ% »fF·Î5H.´;÷”¿M'&xŠ;R¬öÖ˜á—v½-õíߢ>…üJÉ_ùëþúnÿšoÿ'âþK¿­¾>a¼®þqÛb‹4P¡Ôh;ê4µKðF€:›@íçk@˜[ 6p¨Ã• Ô‘]R±{ÿ–ÀNHáùÍzÆžqE2Öìò§®¯?ùžªÈ#~Ý¿‡º}#þ*¸m¸_éö5/ÝV»@ßï@ó`à ឆ5}¦˜e{10ru1LÐíü_%ôk¹ý&#ܬ¸IÙÇÛ÷«8—íü9@F¾ /ÎÒ ÞœÔÉa4æÑñ;7ëã-öïûÔ¾óÜERÚaÍ.¶M>ÜÔ†Vø5•U ¸Ë&=Í-ne¤µ0Žýݼ¯æ˜ßpûvs¾øZW¿rèÊüAã> Ð»¿ãו!/¥«ËŸ«qF?úgZ–ìSÛWn;Wfá†ég‹k~lWVÒŒ¯-›$Ó\ÜB²³è°ü`WøÉÜ>ñóÙH•63¸cœ¦þ3õøäŽº54"'7 ±·5ÞæK•q™ÉÆüŽ þ5#«&BÔ7†õ_ÖÕˆ0o¾E¯x¸ÛÃ%x³%›Ñ~]zÕ.«Ü|-ÕEù¨£¥49É"3tZ˜b=â ¬¨5a¦;.ã¯ô˜_¢ÙQA?þU´2TtkÐQ”a?n§};nzïþêy+öàH«v£ ¼IMŽ—n@Ø·_`Kéú7wõxKùÑ–l¬kKu6 gïŠQœbís)"û·æ$„àÁxë3³Ñ!Çl†M6Þ:âùÜç{ß¾ž½‘¹½Ôóø™õ¹;¼@w¦3÷/|'‡#j{•Ç­vH›Ak[ Ë­dEÛiÖäó¬)]Sׯ¹s¦Uê«ýM]ýâk]=?^\´0ƒë¡ññôzEa¨nb?®ÍäïMü=¸7Iuý÷&×ÅF¯J‡œ>šmfyê¶¶…רÅoQ³&\çMéøZ7Î h×PoЩ~ë·ºñ¤_µx` 5ò™ê{ÒS?ê(¶÷*Qž(Uº2(ÏKÏCy^¡”rNœ‡¿ÖÕÿá×°<§gÙ(û¸ËIq ¬—º·ãöÊ?ZejûjJû.h4¥ä¤zk®¹zG{&[©Ö©Ùo<]}„\ÕCذe¨r% „z[jírŽ‘{erkŽJ¡àÌJÌ1ÜËJó\ä¯ÛwX3*”žVhºQ¦ ÁR;‹^§ümú’ò·YÅÿAólÞÿâ»#²·“’}Ç@rr85kXÕ›;­Ž\zY‰Ò¯u›C‡rŽ¢ï¥U‘{—B.…·Õ]äϾš%¬iU£pî–ìBÓjx?hA}õ2ùÛpæMxVÉÅѵsð×0û^*ˬÇäÏYx»G2H ìÔMg°³× æ­Ô3AÌó6¯~1OÿzÛI[v¬›LfšÔ•íü ery®·åQ3¬)åö j\‹ò·~´Î›`~ÈÅãó-ç çgö=pv”Ãñ,¼F¨LT¤¸LÀ RÛ›z“L; Ïaà‡Z-ô™ûª™ÞöÈI²¶äßþÞ;Œ¶À«¥ Á“ÑSÆ“±û“ñÎ+u^\È/FG¶%ur¯ö»n‘È®œ×—ãðØ9´ Ú„*åÍl+›s+Ÿe¬R^ZµLÀ¸í`^N~Ð 'T¦y¬ýPéî|æ:=§·íõ=]6Ž/ïÐ?Á^Íyž lêsáÓé².å¼CO-yÒÛ¨§Î#¿“jz¥¡{›–"·“i,\“nø´9ý N¿ñx8ŽÇ@öh*¶W)‰6"Î,+A9 ÷òmsÁÞ—fnèʰ²KŒ¬$, â\È=Åìós#ÞU…iff‡%g~Ûímø²-A|ÙA-¾ì"=~;mlÕ@š¿ Ñk¡rýׂë5g̵sVn»r-èzm6–´fSaÕ[gC¨Æ±G(}eÆËïRO”S‡¶’ôû‘3±¤l< _³âÜGKbŽWªfõ„ЩO,’nð;_.¥Q^0ÖwÄ€«-¶-N.¤VìE}¶yŸèló1í°Ã[sr©y¨Pl'g~gº\ì8ìýÉö4›ÍšEaäêÇ®kÚª(ªfb”þbHÈ£‰HÑÜ $œRY1W”aµW“½SMY+<~ûæùòhYæ…"ÔæŽœ˜¬-¹Ú£¸âäÞôÌ^r4Ìjë4ÇÜ[—Ó5‚cÆ·ý\4bú¹ôú¹Ê4™ä]2]ÇÙ—v¢öÈy¯ö2}ì ]wP+ÖbegJ¾ìh­êQS-6-&Ÿ10ØÐ2RJa^ƒa‘jÞ0!¼Ç4¿³Î,/ Ï"W‡Ï*'Go‹½T$Ÿm‰©«½5æ¾Ü÷™nˆÎKKèç}ü¢3š¡Ýl˦!ŠªPãK4ýA©ñÕPé&Ré.]§Æ÷õœ†8|W¬ÓÏ[6£fÞåwñ*›„ÉèõMà¨r­)nF¤é¤M‰‹¾„ Eoñ•L⎧ˆd/·&Ͷ:.é÷ïÏŽÄtsƒ±ò·ýb°,=¸ÙÚí”Ú4l"jB [*}ÊÇÚØäLÓ 2‹K$1 ÆÄ2_ˆenÅËü¾JÃ|Df^»m¨cãK†6¥ùšz¨—Ž=ã®ecoÆÖÆd[yy]UN/ A\b%J(®1ìkb┡ÿfõÈCëèô«î%{çê 4ÔUjâÊǶõù‡>9««M2«†?(IB›5±ŒèQJÁˆ†oNõ^jRë3Îë!ƒóFµ„—:Êßl[›¯>HÞ±™û*OÛÖ2;+}eoõÑgmšVT) ]ya“ó©ä¨w”mBˆé•™=à ÓAaÉ7å_Îo2‡^P"”v¾m®é/{OP\Ã3ÙIPÎbµê¼‚ÉÒ»‹É²?G›­ömNÕü¶„Üq:“`ÝC:Cs‡˜©;†˜^œA:ãY¹]¹e6K¼^»Z›Ø³›\ÅŒRø#|ÃÚÑ’²CW6ñŒç¥¢A³í×§G¦S‚’BGO|ûîBØQà˜<P v<Ú"Ž Ú")ÕVšÜð˜`ÕBº:ý ˆùÈîà=yÂ.`Œ‡.4ö•:”ÆvKx/È{ålhlÍÃÉ7æ;e7±µâ•¦~¶ŒPµç¹´ìïÖ–¸RuõWšW*Ã8ÌOŽÊèè¡dn’…Ðl °ãh£­n GD‹B¬B…_Ì@‚Ûµ»å{ †D*ONBSµ˜Á‡ 2ä9ADÖ0¼*€pº3@¸Þ§'R²lBËŽ¾1ß.Ü¥FfY†Z'…rÒÒ¼²¶…m‡S¹óº-0O’dh/ŠH2O›ÁaÁŽï)„¶‘Šô¬ §˜<ù¦ûñ(f]‘$”ôö$T·ì@Âl9A¹ H&^’-ܼI@ríä)˜^$V ¦ ^5 ïR7Áuñ e±sùãеM]íOâÂ'…fíøâê4¶ù#Nkl­Š XIy±“ß¹\@^M@n wxòèôìrvržÞ¹£÷ve±¥Á@׺“º ü8”ñ¢|=éœNC:ãf«2•Ù‘QRF,vŠ=ú£'–Búi„‚á×””™¡ty@•×2 :OP]ÊÔÔóµ¼[€Ú§& f;@”w‚¨£ëê„wµ\µj&/5N%] &ù9 ÚÉßïšKãØ¯ 4‹6”´—~…o¥ÜM1¯6aQ³QC#JKXÂÎ핈vúMqÆM­'hx@Z½ €öXСgºYv?zòhäzu+ú"Õª½§9` ëœ`‰N> |Éé ýH]} ùä×÷5 —-`‡ÎB¿RÅ¡:X›dﳜûAYÛ-þš½‰í´abUÒQ3>«ðxÝWÀR’E@Ÿe 0ÉZ0vYL6²S½¥?)Ì9ÀREÀÄ`ùS°&7lPß&xÆ€Íä©Ò›yš€µËEÀæÔ°.ô¬²TËTÊ€eË;À¢&iVs©ë—úXA·–ÈëÛ gìØøÅ€Øy/»œ’Õ¬µ-¸°ï’I!ŸÛû™ýÁþêÉX °%Ãl;üʸìµWøã Véà ™à†ƒp§çðdpM°FOib‚Uð´ß< %Â{ p÷® ¸}ÐÜœ?}œÃ ^2N7o­¦zîXb¥w{G5RŸèV»ÎÄòN]³Ð|P þ”ô5)»ûâ¯t˽ôúýÖ*¶þˆ¸.¿{~=½¨¶ø“éÐ:_½‰Ðœ"Ì› &!k„ûý“ã0ephæ°°'@B'E‹òFÎÜ© _f‚lÛd©,Ô±[kQMŽ`׫P>C—“}‚VþÔó× üoÿåî,ÿ-ã~m¸Gþ$¼É< @êª î Ȩ˜I0n~tKÌYHϹ¤eµ¤sf¤5i<5Ud#ïÅÏ‚ŽÎ{Šï!®Ë}òµ>İÓdïìvýß’~ ùJ|åc³ð™Èö ðoŽÃWÁýʦß$Þßqj'(5]ÿ3:Í4« Vc ZÙ Pm’ª´I•ê€ … ÜX!A”NV㛃sáâaqGçÁiM(#‰¦ï´:ôÿÙEŸó+g ùº€?›ÿÕŽ¿ÒíwšÛ_ýöoïdj~ܶ_çíßä„ס ôlvô9´KЃžœ>Ä“ÛÐGsèã’ôÖ«üÛo<Â7a¥=ÞéCê}ÀÙs·ÊµpоÓéžÎnnp¼ùÎøhÌÙÁ^ ‹}j¬v‘¶Û¹z9l ÏÁq½uæfIó!¼T×CrÑáöÒ¼/]­Ù»¥‡³Ôc|’§‘3EþÆ DsWÆÛ0Ϥã•ü¿iµøF–Ù÷…o-Á©ñn ÇÒfŽÆt£ìGLÏÜf¯¼µ.½WöJšvRKuYNÎÉ cëeæ}ÁÉÏÞu³8K]åò42äúÔN4w¼aDŽƒé$DkÛ¤Cn^F‡p ¤=Î%gÄš7¸µJÓÁ­m½FlÀßñX}ûýxÿM]ý“Þp]ñƒÃWÝÃÅÑx]z.ú˳_-n¹úba¬û¹½\§‘–yDÙ—þž„0·ùCj4ùÉ_Å„a“g”Á­Fêã‚Yý¾Nz?hß~ùÞÈö«=xTívd6ë̳ЩC®²h;iÅÜvÈË“6shî“ïF‡ïw_ëêãíEÏ_ë*\Ìu–M´—™%§5Y9ìgþÔÝIËuæ6™Ki¨î¨Oøª0èÛ7dÒKÅ÷_ë?³¨Ž‡ö*»;·Còxk3«û³UfP‹ß£x³&ÑlãÜT”†zO;õŽÕÊ×׳]ë{΢æ ñû­¾ç˜_å&Ýÿä®~5ïmöt©ÏííÙùF®þsÿíÌSM¬CFºâ‘ÔÚæWF«LÇ^³ÆŸ3sí6ÔË­RïèçúW“ÍÚ·^Í~ÇÃêÈ»Mª /ªðŒÙV’?•ç¡—sl +­*s¡Äœa§¸mJEþ~‡‡Þ ý]*< „ð/¾a ôäá9¿$º‘åßÛ̼¶o4ÅõGïkö³~¬ŽÜÖ­ Oï¢`/¶<ÏCR™Ü@ZiU"¬s@Ýâ¶FûEþ‚fÂC‹.„5]©Î=¥QhÚé^Ò‰ßFÅ(ßñ¦Û\<½ßs)bÙ÷ª«dGE6—õ¸ó$ë ‘`h&˜X_ÌÞå•ýÕ“;9(>'ÅçÕw?¨`3©U ™¸[, ‡Ax¨&?hXSÞ˹ï M“¿Ô§ýÌw\Ê›P€åú¾Gæ,Çfßó²˜åšj^׌LT¥2·Íóê¹äd¦í¯Z©ÈõÙ1½ícPºìTÅ´qÉê"Yy»´€àX‡ýâ×ð­±ÞQÓÑ·¼¤2¯T8·v¹|Ç®|”Ðt˜eÜr^ºõLT(v3Ó'Ø-‚yy· rÂýè¯ê—ËÇ¡ª<>sCÞém‡FÒü“À½Ã@a½š›–SçIÞL5ýqàÞæÇ²ÛÉkפ£oàôËsÙéW– §_œ~ƒ¾è½G§w£9C6å×þÌ–¹j®ÿ®|F,Μ`Þ–´€<ð–Ï\07½m‘é4ÿ`>J¨Qöj¶ßð¤då:Ô†4"÷6í-ÜNf²qMbypâåéêô ¯§ã° b*j²‚µ=± [QcèZ†–,ì^˜óîsoæì bæÇ6s®?LpM~–".í"lÄÕq¹² w¬›ƒÈu1È×~ºRS-¯î­ÔÔÅr„T³ÀJî-B”Ô5“k…/(ÇéçµÀqh¯`JNÉöø\݆å¶Õš}+G »¬æ¼uÞšä#>«>ó4B'Àõí¸#êåtìê–­h‡ùu¢Õò™³V+ˆìªÕB­œ`5ÒjEfݸ\¢k™N?¦yk’kKËÍeZ÷‘iÎàF ÄïX{\$ º‚piÁ lQ´°·¥™9ϲL ÉxÆjWÏaePLºWVœVõíëÒÖ…Ô¥¯$Òj;m­É•ð¬6_£·ª­$ ©©tÙ[¨˜ÒP~ö¡£&ýþ¹>½!·Í8FL¾û‚ãÆûµ= ;ò‹‡ÞWNƒ¡±\|AH+ Þ³“Mõt‚”ôÈxŸNJ™×ó îI¡‹`šà|ø²F|¥º]“ÆÝ ÀÛi à “àÜt_Û{Ïb¤ME»Aó@I…K"UNJµË0Á…frTÒ©ö&çéQL0oó†üŠ^Ì˹×w7xPšÆP:×z‚Sb@èé!žàÊÂçÔÅ JÇe³“ š¢¢Þh@dKŸ»k“+{òsßÂ]P€PWÉÓ5»ïøƒq×8hí²ûýàWø.l ™?È Ž½eÞ$ýŽÊ(ä˜g£v ½½L…ò ð<„vwíw?ù–ĺ’z™À€'4ÁRq%@º+Á=dʬRíôé1ë½:Ï&8ù€ä»}@ Á$g¤QÄ{3µV¥|GoZ~éUF¹œÿGø.ÊדÎô—oššâeœX—p¥„^µ:@z–ó†S*ò³xúdmýäB¹I@ÓÉ–ŸuPøB”ˆ¸€²‚Ïôʊꀲ™q‚ÆPú”Ü¥XY@©Tòsx éË€|LZ€ŒÓSpĶfÔ’‚P¹àÅÂ×Êšû’H#·˜%i·FáâœJŽý?š÷}A‘ªCÉKÜ“­˜ ¨@OjèÔ“+P4åµ½+€ºã: YÇ´Ö Æe@Î?¦`ú h¿:H>t° muf¥×!@Ë’hšKžƒ‹~)¢mÕÙ2%y*wr¿~o]! zü.ÈdAx ¸ä×X´CÉ4âè8 ÑT“ÇÿˆÊ©# è&à=¢ÄÏVVf²ÙwÓþã ¶ßYÀÔŒ`æí&`¯1`Žî&Á☥B%X[€Y…UÀŒ¥`&$þxÚL&zi÷ÔQÁÍ®J4—K:>îj¶Rߌr…4\†bí" §=,΀KêÁ…¤Sþ#Þö"ó«à~mÁD\ßøÈ¦¥`'Ë*`ohpjf¸ÂbùÑ`¿qÍ.¸+®Øç]Àè p扜8Èîó¯ „¨Ö}Ð=9ó”j‚Dzæí¶|Š|¿\¼N4l´샳ñGâž­¬ÿéÉ_)ù+Þþ5×_åÿ#ãf=ÀÏ)àÞztþÁÛîs@è0N‚Yw„,ò‚}üxGyTí¯óØ7FDäÛpïN‰Zøã<~⸠ÚkìØVýdïHé?%}«ùFK|U䯀üõÝrÈèo˜Ãg+ÿQp¿êéÑ¿IØ"@ªH ¦H31Ÿ`ÝR?8iÀ’@ªÇ> Ë!´üH:ÇJaù4äµß¡§¯\¨ÖŽÉªg•2ܹÒoe¿ykò¯!ùo„Ãïæùã_÷~Íâ;pÿ'Ý*äæ£Ú¦?@y:Í·%P^í7PΆ”5ZJë¸J{<¯cêßiŒ, R#²¬Žz˜y:ZÝ_Éý[×_=ù×ü›üßQn_÷o²2øwpÃ_ñöë»ýLMûä%mæ€Nb- W“c_Ïq×{ènݺjöÎ’·Ò{ß @Ûgƒÿ+Ù~³rÌãvøœõ´»¿*§nd%—½”nrx:;Ïòñ–¾7}rÚÚØnw‰Åþv®ºÃMáIŒÖ[~ÐÕ!}­¤ÙuµLz‡ÝÂØmÎó¾øxÍFŒO#‹¦Ø°àF9jNVYð˜„ä@˜0«:?<×7Ä÷þýïªiµ#¤½¡¾•>ý 'u]}|ö‰X}jó&·syË­ù‘Æ-›øSX›…4·u–ºTôi¤­)ÖË»QöIOV^:3 ‘b8Þf*Õ1¿¬·FÒ¶56…Årp«?Ï?èÀ¸épß~våÞ(Õlõ<${îÁÓêãëZýÊ¡­m-Ü}ƒ¾å«÷ër?¢ú½5?ÐË‹[v_Û»jm6{Ýi¤öÆS¬3YLB¨´—±ìáÕ¨ÔeØä¤ÛàV•žã̼ûqSFúö]À{#‹¥z©—Æw£”ö¿ÖÀk¯òͰÍl¶íVY gÍC½tmJ7^hœ»n»Ñ´¦óä»Ý¢nÂÖä3•) F7²´8~õäYêØ4'̨ÂçO :üIî÷åÞ{·NnïÝó½T¬WºØ˜¨wÈé«Õ‰W¯µ-<†-~{4kÂiÖ”Ž×e£©œ6?hC½¾ŽõŽñºÖ'÷®õ]«¾'Y¾êa=³容 ¶±:åyé¾/çDV/“§Cõoêj)T£ê×^ûBøÆ |µÚïMümfþqD4ÅÚ½)íËÏFSj! õ¼ ë·æ%9®ºG­f¿ŽVu”:¦ªp´ó+QpI6º8†åyþR.çèg½´*=Û¥PÀÅmŠŠeÅ\‡‡vx ¥x šÎ3éÅ ”sóÿ\Ë›øæ˜‹—{%o’nú/¾5ŽËˆÅ~µ­2ålë·FqZõ@¯WÁf¥Q™\ùQ)dýE‚Þ¾Äì6·â¶òxùÓ' :¬©1Jw˜)4Í7_P_˜œï¸o5o˜™‹#>•sp>Ⱦv˜õh¿–…7½~&à÷‹`^§/ANiãy#tÕ9ÖýÐz?üUï }8é_¾oòWOnœ+ëÅ·¼RÈŒªá¡Î†ù[oÏïi%×÷µœƒ,ÚÙ÷ô2̾gì<ë‘ì: ¯´C&`åsÛ™÷`^ñ^ANÌÃyªà~¨©Ôgn->½íLÕ4ÿ\ÛÞaˆd=Öj©sÔ§4<Þ»·eq;!c¸¢;r;%ùéÞ6-ì‹Þ»¹y}+¬¨Ýk RÈÅ#ÑËzøÐÊ`#¹ŠäA²ýP–<Ÿ¹¨AzÛJ´ké²>i§ùDzïÕì娓ÞûYê<º®RMï±Mi(zr;Yèêš$ýtâ•8ý°@Ûï][¶G•“kÃg®hEÍnÒYXNí-ì1F-,î§-친[ØËºY•ùUå«ð¸Ú ku­”á¹’ª§Ë^È{5 §Sç!`SŒHnÇ*®‰#Ư/¼ŒÓÏç ?¨ãÐå²=*•ë¶Ç×Z6|èô¬¨­@^Í,ìrÛ˜ó6v2ɘy«¾‡¡3âõíøféeß/êvê^?k‡¥Îj‡U®¦ÖØ\¨TòY|}Ö0%¶‰µs.9.øëvÕñd¤¸ÝÎ9ΡB8@Ûc¨U®„ˆÚÂÎoΛ´bæ4Ñ0É»å«nÚ7B+Ÿ3˜W¥¨o‡­ª^N[º¯û 68FšL kõ¼ÔÎj³Ð‚”ÛvÇ*Šé(¦¸ª(¦”*¦,¾äø*º .M9¾™“*²Pf…V½ÙÈ–’õêkÌt^ª,Ú¨Ó¢ÍÅBMš˜A?¨±.ßF¥ ƒy’@/»0¬ ‰k‡‰Äh5ß4K)êyž5TÊ:Êm]J+b;§˜Ü¬,ÇûSSî×ÐìÈÖBz_ºgÉÓOÇ®(FýÿƒŠÑ l‹A ÛŠ‡± NY1H[Òz?çÜ>Rñ¹ö,íöľf£ý5gÒ3ŽÐ÷©!¬ñ©)¹ë]½\ö±z)._ªÖ«>•;™})¦çAòÉa?¨Üß5iÙ©ŒˆsE¶†ä`OB<&+NY¿"»vGXX›HȽé½@­êo~]„x¾ÈÕÓ<{À›Ü®Ö_q»zãv ßK°)Ŧ?ÌÌ´jí5œlê«'›…t‘Ñ«…=ö]9(ñþ¡XûÒE¼ù£<8WyÐ42Ø1±”ÆßO Yâ8mh„ˆßdZXtL^È›"ÐxÇæ×‹¹Ïó·ðå9UJJ¹•Æœ,·ì‰àžl}ÙcY¥©xÌU[4˜ÖÃ[1zGÄ.£üb¡-¼{AÁʇ)#-¹6fÊŠÁguZSƒ¢ô6ÐKNe«7iÒü8"$4ÚîÄ̳Ÿ`1:Š„;ºùIç–,jGO¾8žË-0nOi®²~ œØtöd8.[k9æêŒªL;i[ýš]Ó=cr§­§DS¯ÁÌ¡†)«öƒR)ø²  é£RhߥR~mß>¯ryçmÝls%ß%]”j, ˆ9ÃŒ¡þ½¹O`+öƒ«m¢«åä-c†—íd*3Ê+ˆI·í_“Ïrn6ÆÃõrŽíôÙ+?6[¬‚L˜‹1zÌ¥`´.÷˜W•¯œ‹\&õä ƒ´ücÑqmßóÜ-8l1ç4l±6ôÜ+{è9ç’Ÿa 7]k´ªb«¾QdCí²:/#í,.R£à…%sg/~ÿÄt»¥ÈnE‰Ê<ùŒ[bBPóÍg/Ã1VIOfèq?[¡õÞ~‡*öõ„\ú@Zc z:EÀ®'ÂÝýÉ‚­—MN%Å:4Ï)äNr &xÇé!Shjóq¦GW¤[iËÓ:éŠ_¯ˆ® 2'áŸÏ {o¿¹ºò¾ýѼ[ø–ÝÅŠœ2sbÑá¦x1·I*Ï"ôÄ-ȵºÙ úy¶ƒ{Ú0YóÃÖ}y…^Ýë Ú A«¤)ž„øìÌèž('É`ÐX;ôp$zL EOv Ë× k”KÐM¹Ï:Q2׃÷5¦ËãÁ•ó9ûèɕ꛽ln7¦[+ŸèAKØSik±& &³À78=ê`ŸÔXÜÌP=­àÇ{¹…Þl{ Ábvüaá°Tû‘àÌcè`áÃXñ“C’|¹LV Ï+ ÉãÁÁX¦Ý˜m椥ÏŒ3nŠÆî9÷T«9P¥´aÿX½‰Â›mMâ;cåjç_i>³œn:ʯ°ý€[$Gåéòš£júº@ŒÙk ´áD™ê`§Â`¯á%Áé °7%(p'÷À)%“`P8-L̯gBà$¸öö$¿/> vtB›ÈöB½ÕRŠ»+*âÒè1üÞ{c_-†yøñƒv/å˯4_H-v8o7˜T·Ö¨º¡Wpœ´¿Ðhµß‚ ÛÛ<39¼²¿¼}æ%á3ø¾M%Ø‹?ˆv‚VàGÐJPžüD>¾Œ’?cUÍ|¬>Ác€w¨äÉmÝ܄قf`Ž+ûbZù#{ë0Î^‡åd¥D¿·˜òÓá•X¾ñÎG‹&=[{ä¥wðÓ·ÐXº®~ŸmJï´ôD\C@ÔÆ3@äso@ši@xvÏ,>¯¼)Ê‘² ]ù+|31Â4œ‹_$9 ï¸À"L.ß?Š÷ô Ú•„Êôþ³•ð±KJá’/™; AëHj Ò…@æEƒ¢ÈÅÚä’Ê$(×ÜF€¥v n Çmm· È2»dpGi}@Ú§(YÁvè[N[¸ûu| |mȳâLУrˆ’¹Öàåwù‰)ˆÿjÞîfq³ZþH9ßçýi ÈÃòI£€Â­=¸Î}Á=yŠ€ºé£P¬ 4ÔþzÔ¡„jA˜ . \t÷€j–)@³9@ùù•êðQVÆîOW Õ´þë÷v1M჎ïöϤ¯Ä”ÑFz™ €&7äõ§¨¿¢r'j[!uk‘€f¦ôop(¨€…6 ÏQ0ä;˜\¡‘`3ŒK¯tcÀ¤î“Þ ®=À°å`ÐÔÐ1Ÿ¼Ä*zI”Q¼ÊKóîñGAÔ™g¯ R™ò™%¸M™ÆT‡%{·Æ¡ •Gÿ”ô­F]3ôä³üùÿË¿ÁeÜ› XLÊÖo”ÛÞ7~½qÌ` 8¿©`€}°û~ØCjØ÷ìॶ±¨6ìï•4Ò³Ù×3Í>hÚ¤}²§¥A,bÖÿõPƒÅðøOQõä”ü/+ð¯ ø#–Ò“ÂîW¿ýMäÍò.øÌqø™¶]€`ø¦IŸµr7€_qà׈øÖ¼øRõ*å×ó"¯ÂÏÌo~‹ -LÛ2:âÖn:(ØòÝ7ÿÓ“¿áßR¾U|ä¿à¯Xú7ÂáëÀýʦŸ ±˜»í~ç§IÂR×€TY:@ªº eï¥Wr:1hSÌW€¸Ý/€¸k¡ºŸW˜÷ñž'׎`WqŸF†Q; BvÿÔõÝ;ß’¾êè_ðÿáðIoøOï?cÔþønÿz^¥—”~ÅÊÔ@Y&ke¸"€Ò¬&-OÑíŧ.@á§4g®V¿ÙÉz¬Ñª‘÷Y/‚u}Yøzñõ'ÿG·ý&Hü½ûG;þ›¾ûµýþ•n?¾ÛßÈ„Rë›ÞðJøºmOóò£mö´ºS€€®ÐÐéch·æhSZ÷müG }¤¦åÇãØ="vämά¹[rµÖ®…âþ çjµ£‹;¬~-oVư²Þ:ÕÚêö+i–j/Õ•Ô]tXi8ï‹L4©ärw¤ÃØqDNrØ$ÄVʸLKùÑ¡l¾á?èw<ÖWm¯J«ã¿”ÐÏ-ò_ëê74ô¤Û‹ï´¬]ÄÅ›mö|8nVZüX—^G°lâudÞç9t–:?ð©ßSQö5a&«Ôÿ(WQO—ñ¶:æCsT£{Îð\úCõ0+ ŒË¬Úïë×^ïÝç=xœ¾ttOvæ¹E¡“£WÛoqÍC‹]çOÕâHuÐïl§C`£ô;âia¬$o×W~47š™ˆìwÂI¢úx›^uG5²?ª»r40NÁ¼ßWƒuïÝñv½ÔÓ9v#×L¶ 9÷ÎÜ7ŸrnAÿ¶ó\TÕŠÖö¬‹˜R¤ŠØ{ï ˆ ]ÅÞP¬¾«ÿ&¬½³sr’œ]òãÕ  cL`Îw ʺ݌*̦ÏN†±Iê“Å„Q{ò¥;Nß㊤Õµ”ULÔëã¡X‚“˜°åêÐy°ïÄðYaymØÓ4´ñ ÐÅ´·ü@4dêª[™QP¼ÚF9xî«ä¼XìºLC>ñŽœ8áƒÏ VòK¹»?ÚûKýêÛFfBÃW£Y‹Üdî:t{½ÈÜÏØAçû;¹ÞûRº GHïhÝÂ’ÕðáS!5¶ë´-„?‘ C§õWΟp›ävœ>OâCíoÄâ³³¬rç,T#Ó”3\ÉÕ¯äÐmo™!¹ÙÆëþ95`‡l'\‹Á³Ÿ¯jï(ß=1éôwzØ•‹±qÇ·RZG­öíÇ|~j—àYزzÍx«Ê>-äàÍ›3‰d¡ rÍFªžýö#þ°ÍÀd×nï!W ®øB³qÀìäQï(åG½Äµ:éʹÒŠhCY¯ºé‡·ï¨%ïüõ—üÇG뽸V•¼ -dý$š³>Ê41*ÞÄÉt£È¤×®×{¹¸£·£R97xص*ÖHºšÄj2š¢NÑåK±šJ2EįKEäÖô‚ÚÑÌü \ÝëGÁ*-ôÐJñ “®3ž¯§q¦šx±\E®°ÉJ‰g T‹eÖ®BÑÛe~½ôX΄’ÞYË¥}œß[/¨î°§XãËÂL·…F*q.à×ú#ï*:ž';.·6¸b®W6‡9áìn¶ñ³»ù2¶|#»sLJP¤œŸuÂÚßÖ{v.Õ×Â.QM<Ÿð:VV묤·éHÑêíßÅ*û ³ÑütB :^À=>¥YÈ»r¿’og¤Fn=í·r½‚ÔË1¯é(»3çrvXÙkÙ8òt2Ç9»ÎˆÍ†—öVòûKËÝ“ΰbÊßû£”*‹”*Ö#)Uš¶Sê¸j¥ü³ºÇbGÕ¦­F{Û-T.Íj¼Tr;Ñœ½Fòm³|Ï­«—ëåÎ×ìN??²ÃÒõÎù¿:¡ëi.“ċɴçÖ³i¹Ý-¦3”PMù­•Rû‹~òqX‰I]¸O“¥$?O¼/ýCšì_‰j®K }•Ÿ ™Ÿ™ÌŽŸY•$?³y8Æ(0´þp··Ð9ߨžÖlÉpž±\@à¹Ó|eNîÕÏ$/ãsZ¾sût†RþêqJ©Ý‡—Ê3o?ùØãO($©JÑd‰¯R k\bÕtÎúˆ?Ìð3U/ñüºÁãÏ÷ I¼]8q 9¸õ¼ázÍC’cÉf›c) ÎØiäɱ Y‚¢ ºÙHIhÐôªZ¾óbª°}*ׇw¸Œt"XêxI¸9$Ë•Ý6 vÖ6aG{ÛDµSÚ%ÐHfÏÏ”øoä2?J·¸«7^ñv©Ä) E¹µm0\¯¶ä9»åb;—­Å†íj/§ô {Ü"‹ŒáÊ&ó8Åx§q‘ñÎ)‘ñ¼èŽñ.,Ū´  k#·^*™L&‘ïbY2쟺OV·dÙãN‰Ún½ã›ËÆ*¾Š°n¼3@—ñÖqJ;Áµ·Iì·Û3¶±=jbÃù܋ś›{âá¤WôœMZY†¹T;If‚E&³¶é›ÓÓâlFçQO{FPF=‡rQ¥çÈ¥J/‰ J ç0-,#u«© W,Öñg<{½¢i¥C¿’¦0¸&°wˆ¯:5·­ƒÓæNläIPÖÓEŒÏŒ\ö4¯¹¬Ô¬­˜‹™Ý0“JùÀd™þ…¾í&z:t‚Õk!%©ç‹ˆSƪ–§Ê]£IE2¨DÚ·¶CÖ¦Þ™˜¿K8”wžhÚ€ ê±9A4bAä§ÉƊ϶Ë÷é.—_v,›Hoñ”fߟ g]¼ÄWKÎ-¹AZÆ„â|ÆžåŽÅ¦ö¼Á(/ðØæ€áº“ªèW³ô:ëÙ<“±™ôPÃ’æ}õà]”ñâLYÜÅíæ²cYre3èûé®ÑEz¥Qf]ѨòCÐ?0*¢-ÒIl³…±¨i¢…-ޱ8ûѼéE»É ¥/JßÚ÷ >¨gû8‡Û:ÎÅKL6(&ŒÛ,‘~÷°«Ùèù ,Áñ‰šPß6>°Âô2¹Á¡Ã†Æwb–Pîñuþq­dÖKœ\FÙ×lZ;cõ¦WS Á» Y/¥'$va&D+KN£«é[‹v‹ˆeÈÄß®+[|Мñ¼}ˆqYÇŽXÇ„…YÄ„#ÝÅâHE½2ºAåˆüFÓ3^"òzQ^i QÞ©â'αêX×êE¼‘O‡õÞ)=UDøZ¸Ç™åî¹ü–ñ{6<+éG³`SïÎË º¢’x)--›”£kÔG™¦§àƒÕnŠscßÄŽé÷ nä ÑÖ KÌÇ7ÔQÔ8•‹BM¿MÄ·Sc$3‘Ç1xöSD7±H‰ÎWÁ{ë+à=Û^"%tLW”K·V *•‘«´L„ogê7.Ѭܦ6L.èâ+eS•ëA'ëA%ZfÞc|×ÜqîuT׺²ƒã†ñ-ÔÛù*%šá™â¿êWD5Ço$ßõ¨È“e’‘Ò¨^‰€Âa¬wÁUkï´Ö§š£*Pv€Æ¸oÑåâ«ä™Ë- ïbþ-B'á`ŽÄ{£„ùzÞ´>êÏ)k³ÉÙ`¥®ØU ò’S¢Ìí-ãæ?ÁDó¨¢樣ug"êÓµ#ÏÎz1ho)í°ó\àUŸ  †è*Q‚böºÎZPn€nl N©Ð>¨z÷ S¼TMà•\<»O¦žñ.Ô¸=Áøì…ÿìxWŸŸlÔ·AQu5Êf™ >\à &ž=K®Í"o+ò<ÍÌH9¥ZÀvÔÀpu åxX°o´“o¦/¼\€'^À“§zn”ªRÏ}6Î/Ý\ôO¶w*i0ßoÈù¸¿$èhd†ÀÂ*º'¦¥ Í‘E3òFqÈøôL€K¾p“„;87u÷ Ê/.P®M$0(Ê9¢ÉB Êf¢©ê DÓÈD™uDÑqàG±æà& ðS¾›¹âT>iŸ1.¾äã;[?úô TOTmtÙ+¤³ŠÆ l'À}¥³«9òH œˆ•ÉÙ › Jˆ*Km Áó’¢ÓÕ DçWÈx=ë"P Ê+®V†²ì"žÑu·€ Úˆ¾¹<ˆz/D7ˈ:sDgG)ìïh^±ÏzïÀ<úÀ˜{λё~éL«ý>:ht6x¢“ZzÞº°]Fª=a¡Ò3HÓuAô¦¬Ánw€¨ag@ôS> ì~P¼ú{¼H@¦R”QÊ)èx@¦ó ™™H6}$zĉ™ðý) Nù V™ ¬ú4ìðÍws‹XXïZo¡íM.¥Kt—¾œBÇË”ûÄÀc;0ï-B×:hÙñÅT&Ž'u†<µ KÒ íyà˜¾ ã)K*:âÕ8e5ŠWÕlw '€*æP¶W@%[4 R± ` 9u}äÞÊòp·’xAÊ~it’eÈÐø¦ê—Ýó³Ô[Ü£Wôfl.Hy y€˜D_BSY4î€<ž^$¾ø·Ã§cøÉ») h亚ÉÚ’+€ö¼6`@NðnoúŠí½•Þ€žÅPN@ô9 [àK•" éŽ“ W£\|ð8ð¬¯14]m qb;ÁìãR¯÷Bï…ä‰lO÷/Nw'"_x?ùÓJ+‚ÃâÛ5ËqLí4`+˜Å»X¼Þl}!v3 HA^Xõæv:¢+D‹€mÍDÀ–[À¦*$`ºÿi%(b^Œ]À"6÷&;!‰ŸÛGè‹Ì*eäKœB¤ÐOh#9ð“Cóv±.{—›cªrpÿÔŽ÷Ó¼-OWØ®m~ ¸ûÌÜ‘ÂçÊ)ÀLp• ¸Ê~)'‡Qƒ rø~tãñݨȼ°E3üg!už*±‘Æyóµr:lzñÍOþVrZ¤A·„?×þJÊ·¼AµmhÞQûô(K^Pî:x‚D!¡Ô“ Áê A6' ¢;Ào–8འñnq øfäËžFOlóѣɥ±)ç§# ¬÷™µ ba½ô7ßö[pØ*!d»7„æí§4nûʆŽé7×ö[±kh–Š…H=öÍ Úö”ƒÔrí‚Ô¸þ©*ž©Ìa’wi ’nüÍ [éKwŽàù†H]JÉß§Ïr…®mXÒ„ ¡} ×ú/…¿ÔÝþ©iBø˜´°Ú6hpûYh»êµ@V€Ëj dÅì dKdS“&Èøqdfþd¦*û…¿ŽkB?ÐîQ:øäàæû­]!r]ÇËÑ+#ubNé¤Î2HåŽ:q.*»Eeç¦ZÕ-£“µ g=ëÄ|×Z¥WVg©2zßÕãÃáâ- ¥l(meŽë cÖÃ…ÓÃÔƒ=$݇%ÆPÚô¹b¦/Î*lzµáó§ÂêÐO'´µ=C'ô<~)‹O¿1¨_ݹ‰’¹<÷pv±#ËÙZD¢»•EÏ®³/óY¦pµ^ôÝé!‘—½«¿#ŸÏÍ)Ÿ0½þ‘2Ó‡cÌP;^ÈÇŒ^¼ù%Í*"M ±£)>¯ëj›p6J%ÞØd7º—&Ü]ȉÛmÚ¡£Y¿«†Õ¡!ÞW20^ªd±6¯_3‡±Œ¤Íͼ%Ó’éuí†)3§¾¡Æ÷¢^¼²VyL¦ÓYI2§eIŽÚÆF eÝê,fÝÜLv½þaÂíûž,òýÛØÞã´¯E%5¿‹“(‰%¤Ù¬ÆÞÕð6šõŽÍ~HOú;u8„çɳš¡!ÜöÙw5èiúéÖ"ÓÁ=llª0îñ>á6î Ê›pÛ +äXN&3’š¥ò”„·ù¬ Vm ÈtF³ft0ÂW¨0t»”<$wÔô¬‡{Àœª«þ05<õŽŠûî%žT¬+—‡åná&ÞEÂ6«m½GWÂßhø¯ðY!\h5†vhXÕ8t[éé°M¶œ`/½úв…rðÌþ|ïùó»w{h/á£]OõénúéÅ:¾áóaýjûá¼óm½AVZï%ÓlYâ …l»“&\ Ìšø‰>7Ú)k>ûÀêë)ªÖ{ÅF´Î¼õxøûýêqždþô#þÀÃd¤ÜçN™þ§V‡¾ç±VËjfûPš”©ådµÕiþí—üawÓÓ¡Ažn^}=·z/}Õv*© ó±h{‚_ò7SÕddZªÈõ}§’‰fÔ²ÚÑ×å<“x—»w®ô8ŒÖ¥Ç1‹„¿ß›™ªn¿„ÏîúÀB·¶£›õæ¬ÓÍ5Ú’ íÐwkóÕãTÎVÅ‚Z€âV ‡Ö'‡fw[¯•yð“aÁjÙw$¼ôpSH©Da‘¢ÕÇð`/1š‚’Ai& LsEä`— „Q-àÞ¼™wåM7ßΜ†yòv“rk (¹^‘2rÌ;3Ï«¥M6ŽÊ—Ìq~ŠdÄV†Ë$I·šö6¹qZîß·;:x±é ŸQÒòh· %Ìt'÷.ÔBÆŠgœHH—­ ¾vË·ÓØ%·VçóX]>ÐþzV„Ë\J…ÉÆ#­xæè RA…j}œË$q¥˜ö\§–ÎPf3åoV½”Ú¿Š©° h$ïžk÷ìî±8gÄ>·M{so•γeÊ_ív)µ{<~uB×TžežPò‘¤>Ê`É_"ïsƒMX㟨¦Åtñ­"?Swu¾‘÷>0¥å¸k v¼]9ïãZÜz~Mr½Ö¨ÃõÚy‡ëuT†ëuÇ]n½ºJíÇ:[«³­GºôÌ©ü²¹Ù÷òÓ“lå˜|ŽÝu4òó„uBíD5y²ör™ó³ÉmÉÏt…Ýó\üÄãÌ5îê¥G¼]ª¾ãè ÜÚ–H®W³9ŽÅöéØÎ¥Ø°iÇâ”(±Çg³âÎx’œ‡³É¸R`¼sÞÅÏËœïÒβÉÞm¡Wµš¼©Éb­Ô's±tÿžØÚ%i˜þ.Qk W<œrÎâ˜ar›bMçÖï‚Áõª´Á±(mAIÍb»yj6³«Xœ(ï>0ö¸ªY±Û¹°IFz0ÞÎAyx ™ ñ´Îæ¡ØmZ•Q™Îgz êq{ߨÇ}ÆQº^iRº‘r(ÝìÔãÍÚ,—§fžÏ/ïþÕO.h•s¢6›m㫵àú ÛŽ¬‚Ξn••×)›\. HŽÆ\hMgd¥«AQ,Ú­êŠK«¢³¡óÉí‘z\®WJwà¤T¯“ÀµÄFZîµDV;Ù”N¢Lé@Ìf'Œ˜Íå<1[ÔÇÄÌÝà€ãcµý±R,•UÀåúç-šV¨ë=‘ñ#Oí5׿ïg1^.lj™2YI“é;=žl½>¡ \E¡žzB¡Œ$ …b¦èã:iÇ›¬ (­-‰ ‰˜'œ;Ñx¿1"j§cPÌBt9 ºÑ7šF©ºÃ7’â›n&ƒo*>œ'ã›Ìn)xXö]ÄÚ“q$U¸¯aÅoœÞÆ—1!a8ljÓé»´Pè¶;¦Ê.#R‘.‘5ˇÒóÆ$†îdb>u'D³0Sˆèk­`Ñ¥y´£ÊÃvz¹C”f»>¾Ù[|sgbx_ëæñXëÚÅTyŠ6§6ÚN0ŒoD3PÜ>Æã‹u¤2¹í²¸Ž¥ÃŽY¡íÍO=ð“9¸ì¸Ú´˜ìó:¥^Î@¦":)µ÷C wD#y]ñ¢í¬ÚB”®”|‹”$(=ïÏdïïŽ <6BvØO\°ÑKF0Þ<²o¥á½=÷Ì6:Ž š:L7¼vE \ÒˆB7:ˆÂ$fHvw• g1§)2ô玕öâÝÎpK$–sæz+[´&¦T…«ŒÉzˆ;FW#5¨ˆ Wpù·íVGøIñ˜J ±Ñã9Ä„h|Œñ§ªEvг4[AyŸÐq%÷DÓˆL ×™—D”Q±†äø•¹{7¢É—g¤˜ñàuD›PŽÁ3 LI{”*H>™´bdêÁ^ <ÃyÜÀ)mØñÚžÓ‚0(ÓQÒqscbay0€Su¥_=H8®B8?9Ä*;ÄøÇs€ž—¨€Ž;¨„¦é(ÉÈõš1  á„Y±vH®þð#Ú’E"EIäÀ;W7¦_€ŠzuR€+9¤˜å’¸4’t-€ÐʳXÏS‰¬`¾ˆä;{~òdÃ?ÅŽ\|ÍøiÏ—ÐóFr‚BâðCìzí6Õ¾]õ`+Õv˜±L²CôüD‡hºD¹<¥È#{G´ûs)º¬ ÞíÒ XIõ *ï 'Ï@ +ŠÌŠ}(/:Ÿß¢ux€èñ@à” ’ZâÏŒým4Y9lŸñîóxŠ%\jÍäöýYèx“3| W’¢«ÛZˆ2KÄãöçҥᆠ³äõâd4Ð’»Ü„H [ À–cPMl€x7  ³„"Ÿ <Þ¥{,”G Œ0(ËϡܞŌ$@ñ6DæV9òÝÍ2žVã¦sÔudÓïÛŠÖ eçÓóÆõ–B´.Ì8ÚÝ%|G¨Î{#Lð3ÔBÌô“!ù*D¶´hmíe(O8O¨˜q ˆ(; R2PcÆÔL”¡¬à×­Ž Ð `òÌt0ƒÛÊ M%ö÷Né.Æ·«Ý{Ø5„QåÓŠ.ñµ…lÏpeA¸íºB6#G™ùNć„:ÂÄt2îJC4“O‘¼D" ƒÿo †=ËÑùš`b©EËDîë„1g>¤é¨0† ß=&D"ƒŽ Ÿî´å‚è^Û½ž‘ù€è7_€Ø¬p(/ækY°Q„ ¨ FÜMDqÑDr²=‰Ù ÃþÞ?Ò#p>T|ß¿Ùô°°Ä…äë«ç]Ï"Èœ±@”@¬¯HõÅWSùïüÛþ %˜:RŠàaG‡Àƒ}N“Pn%@ž3(3^zÈõö H{¤Rrß²@&Šb|@åÈ/NføƒŽL^Ø…?F;Û/Ž·v^9+¸AÄöÂòÏPiúÅO†÷’/ÁqpËAî<h6´ãm—-»-@OHÐýèÚëèÜtœž”G` ¨ó.èl±€šhƒÏßãæ£_÷ó³Ç ç_Θ¼4Nˆ‘+@S¾î>ãô‰Z·îæù…&èµ6sŠoƒ½„vi÷öµ}BhO†æ­æUó(v[_ÛÀ Àæ;ÀÆ/Àò£`ÞÑ`¼£[ó3è&Ó(Œ¸#5`™G×ÂÃÝýÆ×Õ;6iFoŸ5ÔŸdAœ>¡B?9,-ÒÀEþ¬þŸ}¾´pÓoÖíg§‚ò$¨¶-œf€[T÷€Ó¬;àD–\I/ŽN €‹\— ¶sP›öK &$'±L¶Ë…³ÃžÙصg#ˆy®}íÈ)ÿÉOþ⎆Vò->)¾™·¡)ùíùi¡c6MøæÚJxÐÛÖE@¢À0 A r€c}À¯§6àûÉÀ·ä³OðœÛñgwΔ‹ÝInð Æ¼oOê‹Ý)‡ÕÒŸîvˆº£aãÝе kC†?ï Á^J»í—¾²ß|Û°¹lh–†>i;Â>‡,u|ö@j94@j •Ö B+\H Ë3EfŸ½9P£d%Aç:„0‚žûÌÛ§ÑúÛTÛ~–!óm¿õlA¾Èß%=> m#¶Aǃ ~&«qcÃpµëÒ'MdSÙÈ\O"ÈÌÄ5È4ãÈÿƒÿ€’Þ‹En+¡J—‰glî™ û;šœ©ç*]ZÜ”à9 gä2ç˜X‘_×òãdcXÙ¤ÖB2÷è$—'t¡À•eqÝ[¾Ë å”®‚¹ß¯M¯Y# Íc*η{Õt»ÛØ6­>¸õü†‹±QšW˜p,ÙºÔëºg9:ÙQ{w¯ª…P¦>ïõ£˜Žš=³P²£›êرýÖf^ÄtáÇ'¹¥XÔGkVZ-7KkÿÞÕ¶—Ô¡˜ÅûG¿AÏÏ¢\X#óp]®+[íÚ´îo´w}ætü'ù›¨Á{áßÄíWGíû»¸ýê¨}`·_µì{FÛÏDíûÞÑö3QûÀ¾w´ýLÔ>°ðÞØh$¿}g‘ÉèÐEÏI[‡K?qíjá–Ó E‰F» 3í¬Wì•…Ë þ8`ãƒq¹Ì¯³q!‰?‘Yªjž/i£¶ >£˜Z·{Á<9£°ãéC‰ô^ æ>Y± V³ú‚RÏÎjëÆ¸•|6t4Öfv~¥ÓVbwžšÎƒ ^½D• —yX¤/rîÉ„‘ǢŒNÐS Ž)¥,g[ª–£ÔéõùØè kû2†u“37ĨDYrjÃÄbf&0~¿\)7­. 0Ðê`µt­ 5/œ¶Ív Û9 Hï_ûcû˜éINKÛóñÞx`AÐã×N•¬ù ì>¾G–÷Qìé·VÌöÚÿ<«>î¶Á)üç×?G¹¹h}`¨´é+ØaXZG™÷$ZW$F6âf‚+ñýTª›-$Np âwp®éøö%դݓFz™²Iâž~nîL6;Ü”‚!;Ê®N—Ë^©]âáZ°Ñîe˜Fǽ¿&=ÔØ¯úåªõF0;¼®êe!ÑO â0Ië³ÃxMLjy-§ï~O½;%CK79¸ÐE AŒÝöš¶Ú·[מëk}©h{8¤‘…²,'\¯o¬â2Y÷NçÕ6ú¾ƒ]ÍÙð{³©×j ŸÒ»ò2ÚwoŸB™+¼ýV¿Eù ã ãHa@ˆlÌ ’y U䲿÷`<;2Æë íÚk|»ò/ÁDkãÓ$¾l¥(ÄUƒðöiƒ£T&kñã”|œÀ)±àyæãr‰ïîŸý„+îÌš6éÒ}ŒC:£l‰…Áò¾+µÛºb7wýzv7:¶8£ïF•þr q³Œp/s9jû1Å$§¢–å<8è ¯"'çp(÷E®LÇ\yV–ÇÅN\³å± Åãgˆ°Ü„ÝGÆÉ»æáêâQy\ 8(Gës’xz^<;0b€ºlrêÚI¿Ë>‘t>° zÒÍIõ{%zYÂKDãôмÝãFÞ»ÿ&Ž¿:Šðüþ›8þê(~`ÇŒâ¾ßÔÏ»“òöØè¬· _ð$Rû¼{r6ÒüV›og¥ \Uן´n4W½<+-ßÁX…Æõ½!t_ÚI×h-¹©³¿F>°oïô;0ÿ¼—Ÿ–ÄüÀ~ô?FìA¿fÿ÷&þÏÇòûÿK³ÿï˜ØoNü÷ËOÇÞ+oâ¿ËoNü¯Êþw`~`¿9ñßu,¿&ž0û¿7ñ!æö›ÿ ²ÿ½ñüÀ~sâÿ¯cù…'ÜËïM|ˆ ç0¿7ñ?—ýÿÏì7'þ_ŽåW_AéLé1á•ÿ÷&þ‡³¿{ŸìÚyhOHkÁxN#sÖ‡‹ùí>À´¿bnß”ÕÛ0ûf7s …QÔˆuù¨>Rθv:šQ-Z¤z›>ðŸ–ì/ÐêIt7H+wö¥èa»êïú1WRæÂüÖŸo÷­ö† Ò"“%¤oÜ迚¸~`Hø0Q-•l¡ÓlŒD•çÊŠÀõKðò egI“ÊQ>ø—Ó‰n·wïePƒ¿ Rj óüAÚ8Ö´ð¶qŧÌÕ% C9µáôÓ,ÀûÐàÑRí˜Nì4P ¼óTÀ®øøÇòß %Ý?«íÃ)©dšð_ÍÕjÀLbnªn³g«¶vªþeãƒ#ù‰9(LPx¯ hÒÃŒ›ÔSÎÏwÅ0…Û}"×_#Ø·÷»jYªìKûüî0%—åríº«Az[Lôæhf…µƒ¼ˆ—år.av'L·YÚypyO¯¥ÎC½g±›òâëÄÞ¥Ï2A¹§P>°oïZvh¤SÚƒQ|»/£ýâ¶Q/.–5ø»ÜüRÃèÑk»Q¾>­ÖQ‡9¿]¨$_ZêhܧÙMÖW ó³§D*­“<<öãÎDÞ}¯|`ßûÍíÌ)wvÝììf*»q]r±äO1f^ÈF†Ž¼V6~]ÜÍu²\Akçú˜*¥>Ì‹Z¸½ÎJù¬&ØÙŽW”µ–ú‹üêʾlƒBq‡·Õ=™ ù^ÏÜÔæ@ÏŒéaè ÕÒríf2“$ ¥Ù~jinï«ZŸ?)fs»ŸÔ‘ÊV&ôãRÚfÛ ñ æßäûˆ”m”K¶óÎe¹m¦Îéu¯*:‹ìAcfଠàL©±Ô–æZ¯øÆCÞšÇdnÓ\I:)¯;¶Ÿ8ãñFnÅqwÜ¥fs)¶ÈØÂ¹{ûoò}Ç—6îƒÏo£×åbÓáºÉÕp”wæ…u…uP¿>°ÚNnaìl䬛»çÔÏ==µ8©„X­åÅ,·€c¬[Ú9Ò &Ú"ÿŽBÊ_ê¿Z>° ÕÆ²›NNZ¬ûI&ézŽm;NÔgíè‰{rmëÇýú¨ycñª>ÚóƒRYkÙEóqWÛÒ`¢›¢ U a,ƒéHÚê_äû»­ÿIÖ=ïš^÷Kü|¿ÍóÇ³í¦£Ç½Ðèèâ¾aÀ;²l¶7Su˜<*V­¹žàæ2>–4¸ Q8ô¦ÂØ‹+#ewš qûäû÷ÏWûŒ™^ñèjîN*ñ„SŸ¥m3–yÆ´‹zjN§‘“¢>¹çB-•N›I£HÏÇkulKî‹bl6äDîeä÷XyøžÆÃâÒ~µ,%¢˜þÀÜɸ8Ÿm‰·˜Úl¦e<­>·µš Ħ Ø`j)hvâÊTúlI»S2ö}U}2ò×Õñ(ÏÆ¥¡ÞxJƒ÷r#þ|`ÿøÑwˆ›¹ú™ù ß-œfáÌëò»1P#öü5™ËNaÝß{ò²HÀˆÉËDÁ³Ã…!Š[FäÅZÝH2öÚã¡>‹ÃR“Öò&ü Àcù§æ†8ÌΰlÆ5ùeW&›“7˜d¹f ‘!/íwfÌîΪxê TáRg&£[ÑGyK‡Ú†¥y îešqP5ÁèWËMË–ÕÛ}bÂùØ=;¹Ž¼?¬Öàwë×`1.³yöF{3 ÞŽ¡´nÐÞ¾]µÔ«5›'/¾ÜŸM—žœÍ–Ò¹˜$^ð•˜z]* þ"Øßmýùú˜ØOƒ~‡üý±ü'ÐïÀ„sþŸýL¸Fþ½‰ÿáìÿ÷xÂìÿÞÄÿý±üêć˜p/¿7ñ!&\%ýÞÄÿHö0žpÖ÷{ÿ¿Žå·$>Äüá«åŠ'¼ïÿÞÄÿÇìÿLo…»Ó‡ Éݪ{‰?RÕxO–÷œ×™˜Š± ÌåmLšÈF öz€3X}Äi¨v"4XÕ)‰JiØ}ÿñM“>0ÿuï¿ ¨Ùó:Jf·b&‹t!hÌ ±³óz1Û訵(ÅQsÅÎQcó*`úÁ¢¡a;½l*Q5ÿšEcü 'Õg|“ì/þ“ø‘×UôM­üð_ ¥ëuœ<Ä´W0ñI b.xˆ™áÏp¦ô&8ê¬q«•Lâf]âFlœÂ´3î Ó+¨DÔéôüR€_yÈsƒyÊó“Œý'ùøç®õŠ3òÍE‚´Ž×Ù–ÐëK=daâ{Ù³ó.äÛ¹ú¤ÕjW cÀPwî`zM6_ê=ô;WÊÝîEž»þyÜéëç1]{<~\ZÃVϯe¸8-šß®˜Í‚qm:MÙóœU† £b$ðÁ)³ÛGqý0.D´”;¹«÷qUŒ—vžÔTæ0^k'õµÒV<ã_$ðÇþ÷Öï¯kpIð¾_)¶š^çšß¬zÉÄcóž…˜ïæÉyﻼW†vè`dí<ÏiöR¸(¯Ñö8qÒõ½Ü<úik,Å‘u…s¬þ»þØÿÞzæj³úÕyÇ|!+ ¯KW!hû AõX{!Ç Ö\]'93 °Ca(_â{z=ίj1F•ÈJÙÊ‹³w¾øÀ¤Ø"?Ε‹3º6ì_$DZ—,]ëkâr­[é\%uSÕõª'žÉeœ+´ ™3ý]Û[íœò0vÙ(]Fõ:'¥R8l'˜_YŽWº?—Ùž- Ê Ì6c¤ä óï$ðÇþᣔ½¦/nåå]Ü YñV'y³ÚÄ#Ä2^/7ÝwÒíÙs±1Yðu‘˜Á¹åTyœÎÊ;›ÚNêcm)“qf&m7–% S8¯QmtÝm´áý$MP>°¿lØO“´·Vo=Üå½u\_¯6ú•'õX­d³çâ®~œ¯Ïšœn_U=i&3âìÊ­]w6fÚSâjª.&Z%MHWžJ±ÙF>¢Æ/’Uî$þ[´ÏCILŸwFޱ5ÝÍ‚ÅäÉ[ÔÆuq?t4yÜÞMóqê T±ÂRv+Ž3îE‹–40Ò"¦N¯XUF~5:åÔýx¨=mùFì_?ÿ‹lgušÛYÏ‹º/£rg‘ñšáKwkùÐ3ºÄ²ƒé-ê3Ž.U–ëI£ üäµ:¶ŸQ“#d†ŠöJ“‘ÊF«ñ2OségËï7®vg·ët¼›º¡DfèÔ£•‹žJiõ©tÚ*h&Š lçÓelw¯ö§ËxÜ"p¡ËB†ìÉ#µ——Gy”ú´?Eé×Èz½vÈ åfGë~)Ü ƒvtmoáÜ· ]ßë“y-%M‡²./É”=îÍV†/çT1Y{LY›É#8vÆ£|µ:êÓ¨0,Pq`§ÿCGñÿüR(«Ý­‹¯F™­°L=`õw㜊æ6Ê„$µˆÜ)™:¯úãM÷:oª„) ŸÊTL*Ì^“åûc2º%,i”—‡âð™iKÃÒ4#O ëŒþ¼Ç_–É1‚»“nBtš‡äuZ-q)yÛ^6$ ­-DoÜEı*¤Åq\kˆ)Ié Ùz¢?*½þÐõÞ°Ì{C°o÷v3ßÔˆd€®ØA^ý,|ùiYL9•˜G¨ž =_™§BǺ ÉÛfªB±ÐyEâ©Õ°zåŸC”KÓ}W^³½u³Çõ˜q2ÞìÐDçˆïÁ]&;‰’‘j{`’jŸ/“L{<}|`ßñ¥gü±”Ÿñ'õzÆ¥lç¦ö‡ÃXŸ¡Ë:nº<±.¤¶ž_ö±ë<ó<\gêµî9ƒrŠëáá³ßlæ`›ÓèÑ.?÷;Ò±O–}•Ζ½úV­n<͹޼ÿŒ|`? ú˜pÅ÷³ ß ×È? ú]ûiÐïÀ„Ùÿ½‰1ƒìÿÖÄWÄ~M<áù÷&þÿ:–_x"ÁìÿÞć˜Aökâ.ûÿ)ž0û¿7ñÿr,¿ú ³ÿ;}>ãF¡óÝTY€ ®‹-c¬AùCYÍ'sú2»-·þ,¿­_}áŸí·5<Ù•9{´‘èåh9ÒüdÕ®£³…Õ› Ë&‘Ì>ŒÎ„ð¿Éö— ß!OßÈO>JAÐeÆS†ñL·UdËh_1åÆs65¶Áß’ž\¨–4ÿb[rïl#SêlÕåÉÂ#ÒÙ\ š³ù(ßÌæqô-{¿iÞôþ“|`Ùð¿@-Ï´¨£_@ gº¦×óÉ-v™MO÷Ç×Vð¯vU¯ÖlD],\Zzù[Rö©oûØKãWãËôÜx?#OžÛCÌ8 1Oµs°ÿÀ hѪ€ÔEJŽ,çÙ9qùômËõÊݶ[»5gÛ¾%ÀÕlÓÆÕ$Í«ÑÕS¡aÑ„æâ1M#OU‰Ó_ÎÆÿfë?Ê Znßò½ÖîÖõSk|Á´0ˆ¹‡ãóמ/µâãa5ÑÞÝ\Ñ»IÑó»Ñãjw}Wâß:7IàÓtW¸+(sVŠíÇá¿Ëöíýãt´¥'ŸCÐg³Aë[ªF ¨Rwùæ‚®1÷Ó®ÿâÚŠ pmßVôÖ{šÔ }½­ýÒw.ÐãTŸz ‡{y ‹÷‰EùçIÅ^~F§Çrü8=£ðÜÖ`<åînï·ÅÈ<ã{&Œèè¬,R¶˜çØÔå‹oëXHàÛFÌå~ŒI}¯¬P=~ÔH-¹iÅÔ¼yÄ'–ÁÜäY}’˜uø;ùÀþñ£¿ÈCÒ é”v`<åÖ‚ÄÔ`<§çÉ"õ& f&Àü³k‹Ákrg?EþªÕùÜ6°l‹˜Z ÖˆRN yžâžc÷îzã¶ PàJ°ÿ<”OÐTût}H_¿å×]ª –Sw…>1^Œïåù<÷î{Î{?@Ã"Vc»ß ÚY¹Á•Å4{)ûŠI˜§ Ö wcºÖ[‹2¾y9Ò{ÀwÖõgä»_“’eã=$#Û¸å½Áf¯–ê¯el½€ 6!.äZÇ™«‡¥÷7v¨¯¼æ÷cXo9^•ÖK)¦%ô6]wt±;¸z½N矑ûäRÜ0‡C «ÝòobŠÝ÷rP<ÔÜc;5„«¤KinÍJVùði‡n·6Þ±7U³ËG%òZlåVžq¥íDv¾:¡s”}N­¡VžÎ†Zg¿üw ü±ûüžµËý{vcœ ò«r+ƒÕ^Õ[Ïå`q(,ãƒ~w‘MNu;ZV6ÆÎ&¯ºHX÷iN_žóNoå…ß ü1&y´'Ôø“ªIýéàuíSéX?#¾Y¸¶áLIËvvö^ºŠãÕ>/V+–&RËÑsYuÐ21Ù6²ÔŦuÔÒ~ÉS‹¾úùàŽ×ñ´- 6k#pB§Bº‡ª£\Þ µåD˜Ûš2¨ Êê¾ü \ˆ^ò_‡òöVÄÌÜmz_@L·x[ÓÝ>1+O»“=ÌÄLOŽÚ¶–I—¶êãö rÈ.å6c:Ò®Câ±6› ^«­~qBg9¨=¬H_Tœæ÷Hp,ÿðÑÁGöœ$b+¿Òj%}³%ÌÊ(²_ä°ÂÓìOª9m¿ ¦y禫úñ¹T,ÛXÉ®ywƽ†`Jñ2wKùÀ„ô»1©ÕøxøPŸÒ°øÜH«lHƒjdòS²/JeÒ[7û»¸„½âUrº¡ÜœfÑ ÏײùQV-㵎b'GŠ‚ÖúÖ¤¡Õf㵿2¤¡Q×DqòV—q2ò½¶4Råª4|ÜâÒ°T_,ÂjÊ…#öÇûÿ$ÛvFwïç¦{:Ñ tgOk…y„šôµÜ8¹SjE'9i²‡†¼l¾xGn¿ U¦dÚ’öqMO©¢"\bYÈëq`5Ž«Q>Ùª8,â¡ÕiÏ@ø^ Åÿµuã°Ökõí\zRbŒtªUU¢í½/?£—t’Òh7®I£¡9”öêgÑ¥"&„,LpDÝZÇqXy ¯0Ïê0(Àl‹Aå¥0°‰8Œè**üŒ¬{™æsÝ{¿Êî•»pv!®§´âNý‚4Nô»ÂmUp…|#û=¤ ;z¤ùáëA†•„_ÔQ±4À¦ír¿ùÊ”áí‹­ôVéhµ×ÙÞ*=zpªv·ø2Mý›|`Ùð²<.ïþÞ4ËÖÖ‹NÕ…/ÅÆÒð´5tüš¹do‹Á{Ù£Wså!æ+òt gð°í¢çÛh¦}µðÓ%øeJk;º«cöftKň&œû4åÏÊ]ï”"8®P a?ˆçid?ÝfÿÝ$—1tÑÿ´C¥7½œ+,TÛbïÀ·}Úµ„w··ÆÍtOÏ›±ôo#fß:W#Ñi:Ýò•û“¾üwùª_àX-ÇBÌ%ÄŒ>¿`²‹^`†Nc’†sþÏúå"ÁEœòVŸÕ¶Ñ}^!¥ÛÓ`s£— t*ó;Dy4r·‰¼£ìÜÕ\†Ëï¸û›­ÿ”ÎAÐ ñ› ž»4³èv¨¼y7,byüÙµ½M"F¿AôgâaǃVLy¦gè¤ZÆ}¹›Çn±··¼êò޾bvø<Ì>wÍ~õ7‰e¬ê´]!†Áˆ ©ÅúU^•Ô}º1<]h”:à†! [ü]îú_K»­)È»">ýXÕÝdò\´üšÁ>-‹öpXr~M„íT£¥?!†üÕÕ¿¨¦P´¿BÛ!=¬”[f: œö»p¿8÷^RšïïÝC%XóîyN.]8Qðcg5DÙ8v¢Ñkð£ÞòUÝ7(ºbildn™­ŒÎÙmZ\ ¿øY¢Ã«1X-^åE{y ]‡a]É’sœ‡ÇågNŠÞûÑâ‡ë†;¤¥=\áþL¨?‹./}áçÒîÃ~Õ[â/%õ£D2Ê(ôVÆèÝ6í®˜á99ê<ÛÒVzîãaéÕhT>~Ðöúñ:Àï‹ó¹Ü;Qnî¥ey¾O±í¯¢Ë›Y Ïÿ­èò³'[ýhi÷x@á¢R¢þ«Þ’ÄR‰ ½Mù¿ŒØßýêœ#R÷·Óýò>sÓZÅ‘QvÕ‘´ú”·ü 8¸²êÂ)2E3yßÄþ(ºD_E—°·¤Âæždž÷]´Â{÷£èR| ȯ¢KìôŽ’„4 ·rhÿ»€ß—÷ ¼=ò)®Â4ƒ€ë*@ÎTä ˆè”Í_½íòÛ]a%Êçv=j—QÑ%F¶§è†àµäcƒ[Ô?6kL"klRm­·Ê.³†›Àz›1o›æ”dV2œ´£-1%9["ÿ¸uÙÍÈS¡q `ŸüN6bàµïø)ìgðq§ƒbiÃ*o—)±²Y¿•Mqת­1+^]£ÓÛWùe}EŠJãGù¥£›ËÝvÕú[Dõ–ÿô{Ã(Uýk¾æW”÷,¹:ìëÍ×¾X¨ÖèvÁãùmƒ-À|¿Õ͉¾1—oM(û`Eïú÷%;ý<–­×Ä_×Þ‹îõŸƒ Ÿ"9óÔ<ÞŸ¤g§ ™7Õì¿ ½8°çWùÎ)}¬§R³½Ñ]zô}ãˆó%ÙÅôÜr¹-y7jMi~ÉÍÏâ¢ouNó‘ø‘gç[ ÏÒˆ¨OU1§Ù`fMtfæNÖ¥®7)Ø-RPZ·1–-Á§ØxëçŸÿ&´VºožÊòàÉ-îc|×4h™Ý«O<'}Ð-ÊÈ£õn]‡÷Øâ=i¯gŠ…­§«FŸl—Û5‘W687òRqDñ³ã¨ÞKÃÀïÊCf×R‡Ìº{¶ŠÝëà.×­F ùÛ_t‹Ì V*@Ëz”…}Òù fº_´ƒ@²Hš¥?ÏZ¥ø6TW~;jí"ØJè[Ênš6•†j™pÌß [¾}8ƒqdvŒ{2[Úø2›¢î2óÁ¹{ì>~¿4£qò(ú Íò‹~C3Êü‡¢ßPúëÏò¿Øð_špÌÿÛð_š°õÿoþ"ö¿Øð_š°û¿mø¿þ,Ð11ýCT-²úÞCQìdÖjÞfNL$J¾6OZ¥•€ñ´PÓ;BÍÂjb9Ki8%‡5Ñ’Ùµ>»Ù|‰úrËrKÙ<ÎÞò% ÎÛï lÆ“ÝBͶ5Ý?½Å=ÈìtØYof}#Sâ~tŽZe“5TÊÎzj=£» “ÙJ³“„Ž‚?Œ-·7Kçü°ëJ78?ˆnxæ³Ý§40÷SŠ¢½/Ä_çßtD`<Ù•ЉÞy³ÏÆ|ýð/£3ÔdÆ=ý¯n5\wZ…At•NUØ[@ýJ0;ò½ü±åýB¶ÏÏÍÌŽ2Ë|Å;÷²™àÜ}W"GïqT+ÿ°B²öwÕŽþqP) endstream endobj 24 0 obj<>stream E¥­ EMÑWâ¿Dë±évôK>õMAõFOM­ÃxFéeOižÌ!çü (û,´ιÇç] ½M8¬n¡t¥tœ‡UqÄÒ[¿þ>þUsë|iîŸ {ÆUÜå¬E—·ìFÃß&¯zLBS©²¯°'‰…åÁݳ`àιŸª;ÒÜ\i8¼R<¼>O)mu?¬ÚˆÿÞÙªEÒø…ò§ ‹Ÿ¢Wâ§(šFö°:ºû«‘5O­–¾Š#k¨:œêªÚ(•½¨zù¿/\8òà{îŸpW:©¨¸Zñ¢råð4™JïÃj’ÄröhóÞ}jpa¦yù-įt,ü!Êú‘h‚ý)º²Ö#´ô¼ñ\jDÏÙ«^TËx{ ŽÒî!¨z98‹ê+ˆòàþÂåITUt¶ÃŠEàHI°ß‚Çûɩű^Nß?ë/å÷ñ‡æöüSÍÂxö¦Ps'd¢7‰ŸnCÏÞ ˆòŒÞQ”°TpågyʽÂîþ£zy\D…Ëרfy³âü#8U!àé{ßáÚâÇØ÷®–ÆË'ùO€³×¿¸ú'@Çì 7:ЧS„¢Œg/ŠçQH[ÏÚ ®rÏ™FðÎNõkYY ÇeG~ÎËàü.Á}{'ÙnGm¨D™åÞS,?|ð+©Ì¾%MgGˆ¨2ç~þ}D#¥[ùQ),ý/¾^53ֳ߭ê…þ{ª9¥7]ÎJÈ4 (_}õóc3‡Ùcö<æ×—h-ûI¾¹Û}ywÙÑD¼Ææ¬R&[*;Õ˜hðLòa<;ÙH6¼Þ3ëI*1D_¹(:~“ª¯VOJôlYààÒK’×höXœda7½½öǪêíVs¥càBÈwÒSº6éÍ+°·$© PIоI¿hX†ñÌóPóö†ñœfa<{ý0ȵq›ËË#·šwcÈï¬Öš×y*»*YçT5å&.’:¸çmâ1*Ž^(gQ‰´_bß«8ľ:öö˜7 v.›ðä¿E”ý›_AÇÆ$îÕ'Œ'V`¡½¾‹[åcß]7ch²ÔÐK{®ùÍúþ,³ÊÑxMÝúø¼øû,ìGÄÓˆö·\ç¨ÔRÄŸZÄÞ&qÆû£Œ…÷‹ïó{Oý}@Ã*Œgýpþjýw û2ó¸—H?ÐÄpØf3uUœ.ª›Æl,Éy¼Nѣ襌«èâëßX‹M¯JToyŒs¸p öØhÚã±$JHX²s3°d%ç•Øðå]~бE¼W ¨y.3O&§»·Yh<]óŒ[§#–Wz§CŽ×«»éÔ’Zë®Êw»•¯¢Kmģ¯z˯RK¼`w_%’[9=ç·iŠ8mÓ¢§oÓËÇõŸeÿçUèØ†¢KŠ6y€šUæUïìðœZÜüJãó¹P; œ U¥ü‚ç 7†_žÄÅó¶ÎhFB¦­CSøYoIp­ÒîG•å8Áî¶Ó×p·Mk[n³Ì‡MîvÑ~а5)å*+$µ~¢±{Ñ«Õ%0ˆ¾vÕõÃõ,+_×W”;ì瓽4˜“ûÔv%° B+»kÒ9FYFáG½e·Õ¢ñAåAF%’äVÞ³Ô6ý"vMd¹M>/cÈ×á·*âŠjW(z(dA…â÷díLZˆ 0µ?º‹J›^¹Q£aã9ˆö·$ü5³Ê! “gñGÑ%6¹¨Þ’‰6¹Œª,K?ë$S…+¹aµÑ\~·YŠî€Ÿå¿_w E_öT¼BúÙ6}û=è–´îÁNhkNpR—£ï6?Wi§)Œhû®c41ÓÊ£I–¼ahToiÑD×8E»ü*µëyr«µÍ`½¹ Þî÷q?-JÜË…¤ç5Èö–Ì¡Q’Ê×’]§+f{Žïé:OÛT+¹N’{°¨ûîOXg„Ÿ vnq# !fãíܯ7z1>ެηñ¦0õ¦ë­¦L×å?[½øB ùuþ ØÏ%¸?žì„¾iM_ÑÉü\”Lb]†º7d¬ûgNíI‹+Ÿ >žÚw°‡É,ÓÙm¾¥å6¥ì,¿ÆGõÂÊåâÅU͵KË`©”—Í+[^Ü'[tÁ!«ê¢#LjsáÓn|1ä×¹5BXßF[4ÏK8˜NåY†EÑr›â÷Á„Hõ38–óhn[œÕµc¼¯«]oo/Ûj/ø×Ë¿ë†?n¹`ž@¨p6YÌà8y–ú žSåÔÓy«¦;ÿ™\ˆrê÷q]Œ³¶QJÍŒ°³¢Ø—:2‹'¢ù>õ"ô ‘.$‡[³5^mªµjÝÚ»Å@vóT¥ÆÎfä0ÕØà8Í9Úyb,NʤxÂÕ±ÕšicÌèc”è^Gn¶nÈcÉÕF•àbÈŸ.ü-tì°×åñòDŽÞfYk˜¢¡áD'Ò‡t|k-¬ê¦fkÓ¥àÚÓù™,̦zw=›˜…Ú*†Œíç};®Ö bDrÔH1ÌðÆãû![]òÖ>õø8à“]iЕ»Jt[—ßB ù:ȧù@<4n‡3k .5ºcggDZü>@y^«²€ð ¼X'@ésœƒÒÆ4\IÆ[ò„ ®5m­ûœÂ®#íÁëBË—b+qÑÐÌñª:«ÅU%ÂŽ©çš©VÑ´¥V^IG­¨WñúwOñj¯›âå“Å‹£o™±­ç/ÀÙë¿ðWøgÑohÆÿXôˆ2Šÿ¡è74cÈ,ú ÍòÜðßjýÿxÂÖÿ¿mxP&:õ¨õÕl$ºˆCQaEuýXõÔ-dQïÔ†W]n¯IêÊé9a¥jV+kjhW·T‡^_U2ч†Ó\¤™´OlÅ[_šâÕ“¨õó9 ßJÁëÜÝo¿…/Q¨‰p L®ã œ;/@‰ñd¸|2DÙ­¤“ýb¾ôúÚ˜åÜe“«*j½-Õ"J®ÖPïŒ^ÿËÑ¹Û Ý7…ΞR?i7¥¾1ÐЊ ¡ŸÅý¿BTmû7¿e~Ôe'‰Î?P4jø“}0V)Èþ»èV:é¾)î2+#}#ö—⧬j•TÖVÝ(žµÆÔTü= g í¦B“†¥Ô?'G¾m8_¾µÄ:Qö{p—âÓ‡œÝë·ÊÊ¢ù¥ùõ6ƒ­#QŠÞKñ@É%ŠŽWþtMñ˜Zêš4a5|ýT´J)k©TE·ÕÚ ³ÿ\³•†`Yòí#Úòíĸ2[™y03÷ž=¡¡çG;Ôiç°BÚæo!…ñ|`<…Œg_‡ oÀx²Å:Ôìg¡fûÞ64˜Ç}Éö ß…g­2.Û*5ó%hL$ìåp¡ýÈÕËíÔØ•[ö2ªÇ~…·V{_æÐ¤{˜åW¸' öý8Ï·oâ¶§ÛBµˆ|£Û׸ö0-ïùëGúgÄ?]hJh´\Ýÿ! ¾œ{Æ×û¯@Eª·J£P”H õB¼ŠiÄ"!ªžQЕ›]äÇJˆvñ€ÓåO©ëJ ú Ç–§ ¦|Ärõèò´Ü¿rì%§íùÛ]aßmCb‡ª|ü-ü¡Y†ñ|ÒP“4Që×ÞÆ#ì­_7„¦ÝªWCÍc©>ÐWâp«ÙÏ‚ ú¹êE K@æiõ~_é›4²+QfyŠ[Û¼sa7gî…øW>Y”Ù¡#ž™sŸ91“~€³×èð]üOQØðåþ[„óõã†ÜVˆKâÓ²yÜ´ººÞÙ®4gÒ€ý˜ê“CM ™ÉM²Èûw‹ÏÓŒ¨Ükmøæö8°Ç­h0gr©0H0vêi|Ú-ƃã.—êŠß@ ùuÐÒ¹Ðv•…·) Eg[ÿ­=áq›.Ù”ë÷eóSÛ´\AY^Ðü„ÑjVUî9—e—ÎS&y\ñDR¨_± #o5Øú»ÅglÐF©¤Ðk»t¦×JéDçù]ìåÅßÂÿÔ4aö¤{ÛÐæùùGZs½Œ¢2få¦tÅjú´xÉ¡ñR»ËídÓåœRø£eR•^F#ÝËãLº´w$Ý•'Rè_€s±ÿ:ÿg´¥w:iïaëóPTõa<Ý‚úÜ~&Ï áá’·ùÌ´yUúòDßö–”^V›°O–ssN˽~mx¹ÍC“"s™ÑönW‚}·‚>¢ü§-Œy9Ah‰À´Åï"†|þm°ˆ:s€¦Ëò3$náx]ûÛ:_pö¹lÃJVÌ©nåk´|Dhþ”7IEôRw‡çº—YÈÓóW©%vÜEìhÅM8ßË){£W ï¡çQå„?:—Ão c§ÐmƳ}€šŽ5;UéUO7àù>x?Á:Ù-x5Ðj›³Gc¬ôôìx QB¬Û”ÈsVý²?±¬±+^jGâÞŠ3Øh?d¶Sm{ÚN]`nÏÚÃÀÔEņKþ„–ìáàgùïþ Ýø‘hƳͿá×>œGkTDP¡ïÑÛ 0ˆWÎ~¯ê¨Ö"ÆÕÓz6ê ·GkÍývk\e6S«Ê_뺿ŒØ($èmZ²QZñ¸ÉÝl}³¸^/[ä&)ÛÉ•=ý¢wI6<bÀÖçlý÷T sîÕh°z˜fÇáA'ÔÉÆ:.i¶Ÿ›µM‹bìlŸºN¨»HæGÏ#EÓû(ÁHa'úJmgšÞh"Ïe•Óz³½jëMùG±íƒü[(ãCMi5Yj\Xú>Z"{·Ým¿¢»3`É“ð䈷¸þáFô¥ÂÎoí³Z QIã{OÛݳ@Þ:Iæk-÷Wnq+›—ÿJ+^ùõ5~=®lD‘W8©hB ù««¿ÐSE¯(*)/Êrç¹/ gÌ <'•TIUþz¨rc9cÐÈí°ù³C;MsNœ Ÿû½"wd땤p°¡ˆ¹ÅÔ:EþH+.Ýën“§5,È1èc)öái‰Ð ?íG(6ýÕíÂfj›õ±^_cûG}帗檖çÛËÝ–è.BuØ[ì“áüi 'sa³]ý¢Œâßü T–Õ.¨Pt´i‹}±l}©,îœÈã¾ÁO[ù)C”°5ÕÍi"Yä˜:œ˜X¶Ó{l¶cýµ®è}ØÈ™x Y2®—\<ò²èNèÌ\&ÙÙçÓÎÏNL£4—ª•©LjÓYµÑù-ÜÍ\ T^Ѿ ¦|ž”µ¶/ô cÏãåÚ8ÏZ¯Kõ¸â Wú]| §‘û ŽÎÏ« ä¨ËýÓýJî:Å svn‹Î !7Þtn ‚ivÜ '+>ÿ˜ª©×øêgãQ½å:›Ù0 ¿û™—ë(=€Ö2çÉr´.4Lª •®¿©¾¯Öp5̶Xiï±µŸÔ’ßV©¹Ô$©ÙìRÜÁáŠËN G&¥w['J£™Ñc9 [â&† ÛŽ žUœðú’ôFc¦ÿNθþý8h{Ý’ š/h)¿ü©6‡óèH4É®ðœD6T©f/_ûÓ}>CR¯é¦($ÆTEFL']rý{e ŽFÿ£Èíþ©wê÷“;|Г‹›qo*Ϧ½ôl¹ìª`¶é.èÖÑÃ.C:k¬Ëþ¤ÅkˆóïI@ÃÒ<5¦iÌZ›šuZ.û¯81Óæsv‚£ÏÃŽágv>£+4+ºýäåsëÍ ¯WWÉnÎõŽAÝrMýVl[¬¶ñ¶Wo£Ï[»å ^‹êƒQ«Ï,þ1äO@ñz€Rã5¥æÑ¥TE¾O‚b³žnr ŸÏm)˜Vœ®WК3‡PĵÝ(Vó!^wW0™³×Yå¯ñ\á`Œ›þ1†IË‘$gªº\Ñu]Îø¶>½„ž>="÷ËÂ|>µ¢¸¿}¥ {þÿTôšpöúŸŠ~C3†üÇ¢ßû×ÏòÒð_šQëÿ/6üíó¥QjŽÔ+(•Ð*(*Sê«õΓ¼w“¡ð$ÊAºâ÷\Së,lÎak•h³W—Øë™ð†T+Ô(<é²eÊúl¦jzÚô‹¶Ú›mxö.Zà /‹Ð©x}*u$UBF‡o”é(­scPÚù(µš5P´×;ˆ³ó¤ŠƒDØwV%_˘=Óú+{7 S¨Ä™r=Üx΄öAWÖáQŸÝMùrÉìÕË’ÆôK¾°65ã¼p4cOÞ4;_®_2CXÁ¹;Ú¸ß@Tm  TÈAÑ:¥ãÓ¥q¿Š’8ÛOj4K†d[‚“¼sÇEÅæÒºgÒìWRûk‚eEéWOz6iž/« 4Ì0]»¦¦¶9x•Ð~ •Òë§Z©÷¡£â†(ÜÓé¬ïÞš(€†ÍéOÍͨoÒo݆sdj·L„ƒ6Qô—µã¸ËÜÂÚ¿)êzôâ¼1-oú<ÈBGî¬h× vÑJaÇPíiÍVq·è«¸X»«85ŠòóÁãÜÝmø—ÖQÉ+æ¢ìèç P6ß ¤÷g d$œH´IFÖ´ž”¾‰‡ƒ-]ð—3µåPýÏÔâªyi@0ÒeúC.:ƒ(šÙ=^´òpj¨Ä´h©D:çª*¨•ú”o¥×KÍ’ÒÀ9ήìõ°|/ßü¾”Vý(ù#(dá}ÀL¡èxEо±O8ؼ¿”ͦC‘Ÿ‰ùÒØ5)zœ¾p¶?ß‚”½¡:éo>¾^zÔ>¡BIɯµ »qpk¶sÌlW×C^¨^Ä’þV¿‹ÕüþÐdŽPÓ¯Oº·Çp?äüå]¯9”›™¯÷`sMºÞ^Ï©ó³fµèè fô$z¥ð²:gù |^gþÐðâ.íáUÜæš@U™÷8áü 1äOþP¢gqPz/¢üg6üiEOG þø¾>=[áAôrþªéTÍ MЯ Y»0zî9—4¼•Þ%¹™³¥VÍš©ÐBðõ6![<÷:Ý‹wX!+ Œ*÷£Â72k‰cWãwJ‡M"Ê(f±(çÊ0¢§)ü** Êõ„þôSú+<¼ÿòÉV/ì¬^ŠY]SØéùöö¤á›ÂU¥2ª­ì¦¹¯W ŽÜ²7÷“„^‚C^ELhµh÷†ÙZæXº#íŸ ô¸ïM>âwñ% ÊÕÝj`<5ŒçGÅAy™½¼ªR„o®”‰!AVVÜêëZ¼¡Í¯©{ŠÔó}Ðp£|Q)ßèÖô=uÏìá)ÙÄB<0çš(2ƒó;µµÜ?5{Âê+Ÿ\† ¢W!}s ÊnUy9îäy|*huõP£Ñ±ï«óÂIIÒX¬©Ãkd Õ¯ñÜ=OãVŒ?¹}&m±Ã'£0ÓÜFÚ©›¸[”º0b»¬Ýâh¨°õo”<.õ% å0žlø2éošnËÅØÇ£ó¸#·Ù¬ G}~iëuÛx¾°À®Êš)1Tâ„jÓÁQ/‰÷è™×¶ LzmgÎtqž:RV6%Ræ;ÅCd8Êô3{ˆ<ûWˆ!uõ§èü¼†¢UϽü|®ÚéI5¥ðñˆwRáøT‚BWxÕÚ:÷Np¶’‚èkþxêH3¿`Í=ˆö·Ôë/‰lÌ6Á„Ê™ÂË‘¬'l‘¬…6OÖL›#©ÄmO’¡Ç| D¨IèP^´Ý¯ÖßAÑç{ Ðýü* ;x²=uJ»êM}êSÏKé´Ó#ºngnº|J—C•Ú)¬‚LŽ$ScD,9õ4lèÂg)p% ïj¬ˆÃ¹"ß_‡èßo¥¥=Át.ìwÊÊñ¼! b_(š˜4Ü  rΓ½#‰p*™%¿r2û1ÄÈe”O­½2°GÜÝõ8î½> LÞ¨ŠD·Õ¥7ÚrȬ öªoT–•·Ò>bÃ:ÀušÇÀ€åðî’eÿ1äO@¹b¤Š’m(*å¨Ðv *C~ÿj oú=Y?ÐKØÇ]§f d}¬ ™æäXéµgܧª­Ù,«Ñ®‡ûhkÃhÕs婵q“+˹\Öú“•7 d{Ü"í•°•Ø-‡ÅÙ9û]üÔTà7§, ]ØâjékïŽÆT€GßâVôñ ªÙ‰P½éTä•9*«¥^…§¬›\G´³AVd˜Xø0µÁ¶3óFnò”½_Ùíëiéå$meõ i½^Ì›¬0bÈFyιï”g÷,(Û!U‡N´Š*m9Ðy¶Mb”ªþN÷z=ËÙJª}LI’‰þ5Æx¤ý–h2@ZT3sž=-9Çjw±YMíÕz;Pð•-yû¥'\ ¶uP—Ôf+­°`u\sáŸC~ƒ2þÉòã E‰U¬§@5ÃÖoZK­Ù£D²´‚äö‘b?Ÿx!6³ÅÜ]'Ëi’ëž«D?êbÓ–ØÛèëÒ`]¥Q YU·Ûé’vèͲA^èE›Qøy8œç|u~\0DOø.`› -#ðþ|N,Ê ¸ÉË~_z”êÔ<߀ŽúH_H™O%ˆ3ƒ6>*Å:%—8tÙ7~2§y,åÍú=®|­å^q¾¹Igþ zù°™ÌæýÖŸyØûŸ×üazN®Äòuø`(;%ØÜì2%Z{5Àòêgò »¸ìCÃIó¸ƒcQéåWžêHË‘°.p¤„Í÷íÛ6ø`¿g‰U} RËV]Ê,ºe¢0äzåÙiܨ͒|µ=¾b1Më69ÉqÒþˆ!_€¶0 ÛÂ:ª°>Ür²ŠØ}F(“eþvÜÝÕ&Ÿfä%CܪÕu?4.3ak¶òÍ#æjWÝ9Ë6Wôçïø)˜ÇŸøc6É Àtž*ÃñØäÒCIž~çÆ×f¡2ÞÜ­q‰[Fv÷°ü.Êa—y­.ï‰ãyllë…œ2©ñ4œ‡ðû’ffy¦¦ÁyýÛ"çøœä°í6g×”6¿Ö Ï?xí4O^Ê,]–õi.‡›“õxæŽM¾ŒË~å1"‹ù÷П!É! ²™aãÐ(ÂF¯þ…òëüoÐ_ÿ*\6Šv#P†¢ú96±††9vßäg§Vðܾ6Ú¢0«pjo'‹ÍnÁ{lÿ“ÍÓbÆvN䯕1uQü2Zy>€]íz`üX;ÎuëÞ º÷¾Ø¨¿úýp’ú.àÌBJ3ˆ±®%ÞrµcmFÝ8­).wÁÂÈSsè`Æ$Hn¨SYuî¥Î"Éý©‘ÔûŒ^ŒÆä´8íjîl¸/‰ËÁsNmü'úïæŒîñœï÷•Г.ƒSo2(]å<0ºóÎØù.®óÙè$ß©ýÁ³·@¯ÈŽÉÍ;ä(t6ØYŸ`Ÿ\³QgÙmn3mîÁŽ_}Ƶ0—Þ… ;x´Rÿ£p•þ8K5zòzÓîÍŠx¿«Íf£îŒ§c8XvÖawÓ)b]¢m¡3¶i3ábÈŸ.ü ò{E`/åo¸t…ÄwMBî4s[kîvWwz°X$Oüvº)&È1UöC®_ƒäGê3®Ú›d#†t—(eus.ãu6uüÖ¶Øå£·7ï6ú$’-ª¿Í´j¢Ð Nl¥ÉŒ¥Vã®zßÅ%¦“Â!ƒ×ŒnkKLŸº¹Eõb¸ÛÝ×l™!ãc—üd†w^,C½Y«'¯2½®†Å§Mí²l[Ìk£‰jQ½Û ެÐdFü©q—Y¥ÁÍx½ÑÍHv ©¿.— >((÷ÚÇ´?µöL Ð(,Ø$(Pƒ%( Œ+ȇ©<(ð9„q„?Þýò¬H³Ï½µ{æoâ«cíúÓÀy Øy{¹êfé®G­[¸·HÇœ•h8¼Éï2òªu¶Ä@‡à<›8k«€Ä=cèì_ˆ!ºð ßý†f ùE¿¡ GJÿ©è74cÈ¿-ºH]A<¤@Aœ­@aéš È@au‚?î’gP¡÷‡w%àg »wñ.꾬%»žÆ×è-çnqÝZ;潂;h¶#Ö&óoW¥ÛÉ®îSª]ÅZ6ó¸>·™P?æöeQAÌ?!†üÕU蘢êÞ«Úf ƒz· ã﾿¦¾Ìuçù ¡hÈ3‰r ±–?ÓrC/_:MÝ¢?X:x²´µ]0b¤xc,ÿ*í-Ÿ½­]ùªX Õ3¬†V¹]áà쮟×WÓEÓT±íZÿ@A(AWdžš.µ‰Z_ü8 p¡ª XÍá Ø[\^¦¾Æí{§B%˜ ÉŽwY&Gp*/|]_Û.—Âíšx¥¬Ý•gÍð¹Ìýb~4÷}V3Ûd›í[꩟w8ß×tM·çY»ÈAö¥~0”uÀç-Šé£Xô@1#×A‘è Èï—U=~Í—½½Oåj •ÐóVËôÄ-)ÜÒ©¬[[»Ž>H‹©KŒ¹NöfgÑ;\ŸŸ‰r…ã:B Ä{u×ô—ã).R»Êͦ;2®übÈŸ.À`¶,PD@Q PóAq4AñÑQzŠÎÏïGS¹Û'7¬ûêJè{ ;ÄœZÛt²„[ŒfïLn»e¯/² Ÿ/×þ© ŸRùb|RðõVOÍH›¾B>‹Öù¾>éRß+ɧqüvú`(64Lå@±cÀvÎt‚èm‚’l‚RiGC¨úËRtðh‚Tövʵ+¾ê™׌D«·µnr†4ù8»»‚èåÂÇÈSñ­#1dµ^rXxWjÊÇ>wîKýô¹dà|ÿ8k¤ƒ&¬ß åÌŽù<(N]+£”Rµv”µ%Aiã\^vÊV7Ÿ¾ÈyÅ_€h޽^XÚ>/ãkU £D°×x¿,ãf(érW¿èÓ‹ã\ðnU¨vÑ“^Öøznê1SfeÑʱ4FÄ¿ETmûÇ9(–7.t,AQìoÉÙú§P: P2ž(] àÁ&Çé0^fQ_ãÂŽ‹§aǤ\Â|r¥Ýõ Ñœ1âW4iïõ0Ë„yW\©y“^÷±u”¯’vÈ÷’XÚ$NB…3Ež{þ€šKO¬^Åý‡En5™E;Ê*Êù„Ñx>n:—‡qõ/%¤åZ&9³ƒÍ‡0_É{^yÁHÈérÉÚ%Ÿ ­øÚ $öq&ññZ«*‘tN<]ÛñÑ~°‰÷ €b‡ñÜw‹ (§á7ç®>a±(碤Î9ƒò²w6 ^ æýUË+t8†±ƒ[zk¾v8{MÜ$AŸïÞÒ% umƒaáù‘ƒãìÊbéøVxº»?rì°/ìfß÷:9ޝäþŸC¾ 8a¼Ÿ¢VqJEÿe ¼ˆæöbùÊî6|îÚEäÞO2h ¶í¶·UÊc‡î[«KXÌ5I=D={BÎZ)ìQ}dHß@u™»]Ç=¿Ï ìùðìpaíÙDÍ`)™oà§æy\ú©¹AÞ0”d´äù•}µíðþ«¶Ü!÷W?W¹Þõ×Âmê’½!n¾Ë(£/%e¯…&'³)ñ˜ÏUÞãHyÿsGöà›è39q,ƒl8v§–ðÝnn/éòuøg€âV„]¦¹,Ã6¯1ðëS†¢ý}5Ú¹%*œ=_½—Ë%Ò÷×sZ¾eºVÇÃÝîÔævœ%éºÅ`ÊíîcR*ÕÂDìô$¸}·ÆEÕÆa6ün‘šíwYeÌÒú¼»£×Ù Qÿ6¢Þ’=AÑGA)ÙaáÍY~2y¬-@Ñ3̓J8Ï¥¼ÃI®Ÿ÷¯àÓtÂ3¹Îóþ\«…©…tÆÐ™hï‰Ù$aäµþ€ ¬jE¤ÐaT=€¡Ð )´‡(ŠB‹ñ/ßÀš›2¼5G{Pú4ž ¬ž£ä]c *‰h¾*»ŠuÇ•Ç-{Z¤=ÒŸÖ­ãs0¸8µÑPœæÃƒ5æœÐ »Õ‘õËa‰wµ‡s"ÏÍ—´#ôBLZ¡ˆ s¥ÈæE¸‘_ˆ!¿Îÿ  (iÑ+d Ƴ¹àA¹Ö{Dé»hùy{*+yÞîùKxÞ^|ßÚœÎc}¬wh¨®Û9­èh5zô¯Œ·m„µÉ“éb ±<^ëý,½Eù‹oç;L¼ni¼[giœ[(œ«Ó8~§$âÅ«=+K®J£u´8i´íä`so òÎÓÞëv¼åÛôíÊÇBVÅâ¥~.—ϳt½"ú.VÛOÄKòèb ¯øúºøðû‹@öñ¥›ªrë•QÞÁÙë¼ß ¶ãç„ÚžžC‹#C ´çß(ÞÜ(5NUPZ“üžO€²Ï ¨Ð|÷Ù>_–·%BÀ;Ù½=’,²¡Ö`ó>fþh½÷±?…¦‹ø[5Šk¥+ V{³ƒŸ f`×A/ˬʽ.Œ äúr*›Ù§Šm”Zû_eGÿÛ…_¥ø>Ô‡=EØæóh×úBêEÓ‡Z8•¯‘*O­4jîuªÖ±•O'žÌóñ#ôäl‚Íß„äSÙL Ù.ǧܪ&*èüù©¶g£jv>=ïxa·ªÜœ[gw‹ÝåM.ÉÊ_•‰ïæpý €RþŸ•´[ûz“è‹° f Üßnñèä.mªn³} |—VÆ“‡|BÃÁÖ‡1ßN@ ýÍ›O{`mW7©e+ÈÍûA£2KÎ ½©œå·“…¬¦H·¿•³ø ¡g¯ó“˜ß ávÑ,8ëo¶yÆóòiüXå‡^¥Ë3Ld\ßòWSUá…Ù ²²õp8ó†ÇŸÞƒc=Ëùb-Sá ±)Uy“s¯h³ÈÄl¼)g§³^¶2YŽýI>)aã"ðcý°å&óU–œŽµ76=‰æúOˆ!u”Vè”ÞůÅ4»h×úS˜—÷âäè s¸‡òœ=4´§.ø “Œ}£¬Ð¦ñqiƒim}Õxcæ¢'.Œ˜¤nîÓy©ôžäõDf¼M*#»ÛîˆÌu;ôF)a„š‡ýÈÜ·Éñê\À¿ÊìÙ{ý@¥¼“ÏÉ|kIʲyaèñNÎN*÷c³¢VùéØ3$ecä(<Pì?óÂò®è‡E_îȳóÕÒ§‹nO J=—w™×¨Š'RCú’-«yg®‹(£XœñƒÛ,Å ëè•ù@ ¬(+û>¨ˆÛ©9K#ñËIÎzêÀ¸ ñàÓŒVdjšÝ!?Lþ<ûJn6„ž'Víü„žKÅ55ËÔ?û‰!ˆâØÚlä‘;è£Ú®å›x)ì/Õø 3æúÂy[…¸ ûýÙŒè ¸{ü+Ä?]器ñì˜ÓÜÐÕnÇ=ktæÐÑÞ,·x ×]°\¾ÉSS-`Æ´ÖÙy¾|º—ùüÜO,¦zf±ž”Ë÷í¸ò9‘£º½abȰ¥„h©ù ®÷«ŠÝÆ÷Þx:÷Ri6×K¾®|¨ ¿P¶‚„u ‘‹Ö\¸Ò9ã3pþ">K§—ãäíŽÉÇäè>q° â|65/.û¯kužVÛ͉ÕݷƤÙéšýûhØÓúA?‹/ûÇæxÛOàª7¹t¹®šh»óý@íf;«sq™[ 鬨k¼SÈ{éoÀi•Ì£FVZvøØ~nÅ=üz•éûf5 䎃o­Eÿ°nzîu1Ž—œYN?„1d‚z׈ißÃÎGN÷? ^è³xµ7+Ž] ÷º9o<îl Ýyޱ6öÐm”s-·ŽK-òÊé­Úödý-bȯó QËÒ¢ÿ\ ¹b7~â@w,'N¤ÅNy‹êZoÕ ó³ù,µÚL,Ì!G»f¡zèä—Ü“WÚ¥«aœåAÝNñ¶¼µñöìCÚès’ éfpښ̘¯7î ßipó˨ÑÍÞ–n.ƒ’cÂ![xž¦Tß+_ðÅGpbÈ:À¬pqê§^ScµHk›vÞ8Ú?ÍêÍ^úzëtsÎuÔ¶vÖFôªEõ¶Ûfp\QÍVrÎ6¸ÙD¨¿.ÃS]\ÍÕÚÇœ_k'Œðjc”Teê!ðिážÆÛÌÕˆwˆÏ™îb›äK\¾žš-Ó>vÉ"3ìNèÓ]¹«mS×NÑ¿8-—cá=Ö ÛWã~ÅÝt©‹Ëf¶ö¹ÖJµq¹X©%Z³:«¡Ýj:èŒ+ËVs^É=F[Ôà±Z|“„zþgįÈÝ GãzÈáNäæó„§€œ³MB\; '<6 7ÈÀÿ.ßu_'óz–aúQÅÏÅ;}ØUÛ9m†ìtÚ»=ÄÎèÆ×;³ïÃùË­+-ˆ´É}G·R j ËO×¹6;¦E×5ÝdÛKõŸñÏšð¹ÿŸŠ~C3†ü†h[9ù9bEÕÔäËä;ñȧ+ȉ•È-—þÓtJŸÙ43÷]fWŒ!aØX×Ãö´Ó¾=^Á­—Ï Á¡]܇r Ô… „£êOºã.ßk×®¸îõÚ«eTã°óäŒX>Y…òFÔFò Ç+G*:Èo¯ßÃn6?PÐv&¿ŒÁ,xbN9þ¨5ܽvhØ6ûõÿB»Á;Ÿ)9 †¥×*ˆ+Ü—ú98Kò¥ZÿäK9Át/½…k—såÉüEŸÌVg©Ìÿ?ùbjZó+È= SØ5ÈOÆdÁáè'ú,&Å@[F{"~{¢N5qŠf>ÜÓ ô&LkÍàM¥{Á1žœ‰’;÷%ÞÚø“j@Gf¼Ÿ‚4Oia®Sº'½ëãY¿ê’E(šµ•äbÈ×áoòͽ¯ O•¡èCÙ‚ü•³A¡g›…!3…g½]ãµÑ˜ðá:Ô½i©…°C¯«·~mÇ`”{ üsI›ø^^yŠ/âÞ|$î¼9ì>½ŒÖݼú&+Í#ÑäõKv•8«ea-*ħÉÿ3@~4‘¢ˆYä[½È—l òš ‡e ¾ñ²#œr/Å»«™¬¸«^΋!-2¾‘Ѻ¦×}Yqà£NnÜ]îrÚþŸò빃ÊCÍñ¤ òlŠê¥—E{é(V›‡(7î÷W{Á2DB>é—oƒáº$ÅdÏO·NcoÑ£V®¾^noíœ+œ-Í6±×Bc¨ó¦¦U!ûÍÓ9´ Aêì铨ï¾C~ÿ ¿ÛÂÛt$Y ¿Y¡ «SQz9Eî^E{´E…<"!x/4Y{?,‘{Ű|‹¯È–/‹é¡·xpÓè]Ò®»rL®D:åCjo;…ŠlgÊ7Þ„íi:åëJ-—“Î.%œŽf†=N… }L÷Ô?äÔ\+VÔúÌ…A”Ô™­£¼-Z¥¹%8ÑŇ·˜x4ëv6ì²h Ñ»¶ŸY|†®bŽÕlm´’ÙÙdþ!Z~'c˜m)^²¯§)ûþ >_$Á‹G¹²‡E°¥ÅMªAˆE¥üÿÈë¬ ƒzµAÞà«  r (ZÇûjð#¬¢]g—å]«VÍØ)5ÂO§aJSƒã] î8Æ\1dϽj É5;0^k6¾q—ÿŒŸ¢>pA!g7à×'ÇEÉ»'4 ¦ðž‚²;„š.}}ì{!)…‰Có㯌UÚ­„ÿ±7ÝV•IÂu¯`^„J‚¢Ò#¢ bƒ *ö¢Øa ¦ÞÿIWUoï5×>r±Ó—ÈÈ$"HÒ{ðgÕÂÎê¦K›3õ’VÂ)¥-4Ó±f«amàgt<º[}oŒqÝᔵ†©yä *ȼÞ_×\«¿îŒþ?è4±Ý@c"@ó—tN ý䟀í.¿/Óञ—ô÷Êæñ)oN7ëÀÄQ”í¡Gåλ:5¦7<(e—ª€p³Úä]ø³CHY÷ðRÝ‹[¥þP'£Î "Ì[ýõzÐìDµÞÛî »WoÈ5íÿ@çO4%´(m§èšæäÏzKñØówÿ]I,n¹îÇ2›ŸÝ«íÉîrâ¸ëéù6>¡5¤6WE–ÚÆEgäA''|^ÊzªÍ·‚Þ¯ívoG­ÝÈ5ÜCÙ®sü¾É”å²m¼úÿÿŠC{ú”²åÖ°Vå8ôA}—…jÉ-ê´Ÿ) õn4¾YG½W Þ_H°~‘ÿz®T¹fÛûL ƒYjø Xßšíi—£k¥Î5Ú6!öÎ5Ø×;WkAœ Ü}âòæÿÂúOÐÊ å³Ð¢QZt6ù–ïêWÀ™iäÒC%Sºu¯õ“îå¼}ÌOªð wû$^’öeTÞwŸO»Ooºc“>µÉ|º=ý -ø9Ιw ³¥&»å£5«õZ[r†•žÙö†Ó?¨ü€®Å[@«x â d߇Éw_ŒËw½å’F_z*4%2,ÃÞ,sÄ|ߘï[!ãæ×™îPŸ·–­ÆdÒ(t‡õÝfg‘,x­ê+í×ÝÃq^ó7Ô¶L;—ò1hdôhô·”[ëuôP«Tʼna–“rU-Ì´ªšêÊÇ÷^‰ÊÀ°«o±¡îî´ãDì´¿ Ck{ÆÈôƒÑ{¬p^$gÑÁÆŸYV2ã¤æJðٲêÃvƒG–ƒÚ;xNMb.lÊçFêª/ª‰‡ŠðϦ§ ¢K_ç5±Yf­·UÞ[»Šlfz;O´¿0¢}Ìð ïtó‡ÖIÃ÷äž)7å@öš0[Öóà<½{Lfl\³ìà$æEWî1z+ˆ³ÕFAË7¬c¶MÛ‰FF[°—ú­œ=hÏ\.Q_´N¨ª¹TµŒÔx+ 5!5t´ë]´ôN˜úéö(ÿ ¿0Ž c¡º‘Ü>­ßÃÓcwB:ñˆ{iqÈ/†Sq™>ŒÑšôtöªû–[…ÖŽ\©ÞãnZú…÷s{Q›Æirì– kÛÓb&·P_ {Pµ¢–(óVP2Q,*™ËÓSÞÓÕP•TGU†¶útzÖߘ{ø-Ùê9+•ÃŽ+6¶kàwÏ g—ýÉb×YãÒ®£šqwöÜá­ãò›Ò–¿ï kæî¹Ñ*샯”ûdT×’¼ÝRßm¨¦€‰Î="ëåá,eÑi—{â¾-¹ðƒþÓþ/Ü—¹Å*¤†n5+vÚ³ö"ß¿?º?<ê×e‡•ÎJþÆ Vk^ç›ÚʈC“9*'ƒ¿?núHõ³®ÂÙRÍì4JÁŽBN&/9Ab¹²Ø–亹š+ðûê¤tsü 4@£K©äR¥’ðŧöQÿŽýÊnwVàñ­ÀϸN£:Nã¼=èæ·'×Ï‘v ™¼ÃížeÛ—RÕjPë.šµË¥DêkZæ6V3ÛÕBZíºÕ½xj‘KŒDà?Jª40*dñ¹vòE™Êßõ–»}­à7S‚–Æüç4ÚAÇ¿c=N=Œ»½É£ùæ.¼Ó»åG:l…ÆäÖp·—Uþ)³I›èZ¾ BRóË åá%9pîªÔä†ÈÅNí_•ÐA¹âŸ«ŠW”ñÊô?EPçÈÜðñ§þ™¯®d{ ù\àéDÝø?èøƒÙ~;/æ"Rì]å©Ð^{÷ŠÃmý‰õ×zU2Ø —çÆÚk:š«™@ÞÊ6‹œÄc{\y˜”z+U™eä[%ÐÿTBy>¿êrB»ñÚ·Zå±ÔäšJkÀgý)Û.o6—I"6‡ ·¿côAö¹Þ¥Çrm¬¹Ì}ëÉÎÖ²2ÓYáNsU—^QYY¢$5sEˆ<¯RhzQF¥vA#¹>od±Q¾š{ú¹ w[äÈG´ášÒ1d~xbÛÚíž·W¶€ÞÓÌ-Àáµ0Eqôs/´ÌV ˆ¦ùw–z€H•}€;VðÊ øci¢¬ø€h,®€(=@ ¬ ðSíûëØøx ?®¬·'.W€}R`!l^¤_ æ_ÖI,½Èš®BŒ­d÷ÞvFHMcNA6þa½¹½´Êúš'‹ˆ–+NÜzöÏ(w ¥åxwý,ØZ,˜MV§¶û™ícRðþŽ Õº3€ï=h¢G vò•ýO¼+@ªujut¨u e÷ï/(|C½^ö E“}æA&Íö#—dñDˆ³´·KD5æŽbûU1œm§»Û˯ì/Ue³9¹8]c¦ªëÁÿÂúO…Ú}hÑû$„Þ ©Ô€Ü¤6~÷¶¦y¨vás‚^²H­!â—×v‚ƒdßx Ivt ã~à㜾ŸÑa£ñ§k^í§+³½Ç­§Ïï#©¶¿fâóòë}¬ ~˜j¯G[|Éöþ@D-¨Õ@_¤v@lg ×ãïx¡Dy¨Ê" [÷" Ïqªû€LQT+Ü_´šú$N#!âNn™sÓeñé<ùY0g•Ç-Ú4ûíÝŸKew/ÒÇó÷â>¶„ùÎÎè ¶­t“ýô; ^](ÔŸA¡…3ì‹Ü•ýWÕ–Z´C@ÝcP‡œ¨–Pä«àÒ¶¯ÝB€ÑEr°ˆt|ÎÈçå2É= F ÆQ-í!¸VõS“î}´¸NošMœ"ªaî÷ñD^íKmÐèy°Î RgùÀŸÎ¯€±å÷HÌÂÞßÌaï''@މÔHu]€®0ˆ¶ hzДçN Z{û )ã‘pD’ŠóÇõ,Ö[ùǰUÿõˆFÞKÐÇn€}¼Ö?DÔv¨L7Îd2\õNXw‘è¾3Ÿqrý老„2£”ÙKŸ…(y@S2”¹Í|MžÁ]Ð Pà‰[ÐÅãª]í_MÍ~Ä‘Šfž×oÕÞ£Mþžp’rwÒ¼ME®}KYª5ÂÃåØÓæûŠëó kµ¼¥‡‡ÝùÛÓœÙÒNÕЩ•š Íö¯ó:'ªÙ)Úô#«gÀŒŽ$`Æ$Œþk|Ðo~þ¯š}óåC™›ï›\ÏþsG?$Ú,Ü•€Qoºñ¬]µ—{Eüêœ}b—?Ï9ÖgÞ/Å‹ïÎÓâL7óuÝotjµI«OÇ÷é[ëŽK–Ð9õ+ në"`°°˜£wÙ,À¬Ð(÷Èp³ž¬’ó“<<¢pyÈÏqr›/1äjÞæÙ IÈ¥³óÚ«§|el†ƒ^?œî¶»ôÏ#ŽE2m÷f¦ºwü]\¯OZ;º6îƨÿòô¿ãß2åô íÎý[¼ƒ2[ŸÈ–Î×ï ÌwýØ|Vþ˜»‰»3§Ï‘÷rÿ´¿ÖÄ5r œÜåÙ¿:;<Ìà\v»q^bPÿÜÌ »á½Å¤gf¿nOŽy¶>vÓ‡ê¨u+Þ¨P._‹Ì‘ÿ~ ½ëºéÚó8…B}\øV=(޾8)Ѐ%ÏÚ+ŸÝ8ÏqÜĘ^©\o}ŽÔÝñ0‘Ú0ß‘wçìS“×:¤2«RoL/&A­8Ÿ-Öõ©5wÚnú¨R¿æÉTÉjbFÌÇ7u`Ôþ_äòñÝ š¬¢+@1û _‚Ùø–CÅÛw[[°>¡Æ^¾o=ÒnÔ¾Öo¹áùò¨ÍZïµÚY§ívs¶—Ç•X ¯ m‰Ç³ªÑOùaC¥'m¼¡ŒnKŽO.pæ0•}c|Ôû«÷\íãå¶ÜÛ2îÿ€<¼Ç°Ï (³bÀHU(³?V­]¿›†É5<ÐLJ‘ô›µêQ”ÍvÊçìí¶®áoܽX¾øÌfn¦ñ½¿?±§ñ¥5yx±(§‡~¨qƒ9ÌWúë¼oô¶e[ëQ+Yq÷Õ‚ì:xVt³[JøƒôŸöáßBGìPsä Ó•@özþV;àÐ7{ñ„½¯Úœx9&«Ê ÎêÍpó–ºA'އ+ù>™Ì1`ÀxÌo…µÕèáµ¶ÃiúëU3îÕ‹Âuª¸æ²9JëvÜXîvz)¹›/Äb7OÅB粿ÿ@>ÓPæªøýUYêSHsXÉ€åÓ>`ÏÃÓ+âÐÔSË7ˆ›}!óÑå|ÓF$šÛ£÷tÖRÉé.P•ø§Jìž—«?,ï3«ÞnUØvÏÎéÒ)†‡t[LêRÛc¿YhY—NºÁf¤¥¶nœ¹9Ë%£5Š ½ïM›?¨úJM'ʇK”ŒÖÁ”LýÙQtIh*¯ÍÔT½nQQù‡ õò3þï´Ý.«gîçÒz6 éÔkºñBÇ ’döóÜËä&`#üPô/ñª;-N-ûùz6 Aöc¥¥´iß礑›Ëy}HP0áo§lŸƒŒ¹@¢îƒ—¸_É1]Ùäü†¼°ñêªhüBW&¡(þ€N¨àF˜¨¿Ç «áFŽ%v8y³ü6·ž¤nÖ£½¬Ñ/®§½nzš^´èÐ<6ŠùýµÒëSl6rù·‘OT—›Qg ¡¤  gHV®%¶` t‡££ÀsT¦t½p–pº¨m FáMɲç5i½Ï•Åúçð:Þ›Á¡ìÛ­Í0ç4þ,ºôïʹ=ZÍÁsâlOZËÞ œ£5û–CëÚª‚Ë¡õcù6L®ÚkÞÕÌ®’ƒ6EJÌ=ÎýÙmó»zp×KªyÅç&‹2ÅŠrš×‹Þ¡Õ,]i«!œh¾öwœ¼ôÈ Ü‘^]ÔVÙ/^eo}Zýþî~…÷—OíT£Øt™H·})[ûnÚ¨pÑ¡£?'R_ý¬nc¥JæRèØ Ðvê^6U”‰"]ðŽTИ½ÅÏ;ø€7ò£7ø6Ágî˜ò­õžõwlåš¹X Ñ/qMÁû¸è>ñ‹ÚY‰ÉÁ9Ö¬kýé•™³ˆÙ¤=ª||Xí5ÕÌ6'~ßßgïÚwahEàߊU‚«]”ñâ° ÑÅ9?oUÂüÊ­ßóØ}–ÉÃ7—³%]Ï‘¯u;G‚êš gÙÔßsd£ñ*ùEŸÊƒ~/犇<ßÚÉT½Éì‰5WÏ íóÄpys©KàµS lp‚âr7ñØ¿ÇÆïâsie ¾ÍãüÜa²|æÌòØQþ”@P.—[óîOþ]ÿDÒ×l´VSY·6Éf]+_þ;ü˰À™n|žÑNã c†gw\¯aK¯jDÕ÷)p]ÍlÆ)ìÐU‘{\¥6ée´1à?aiœ_u2³\Ð{®räã¹ãšÒóÄý׊ X e6•¥Ÿ{YüSÚ¤^ç C½"lBùnyûƒþ9ü Ï,Ѥ+L,ÜaŠn+ž7C+È—K}V5P‚–¶IÑðEŸóSÐã3Çl!¸±À…ÃŒ-Ùãd¡e£y¯œ- ½3¨uêôs×iÑ2ÓéQ~»7"?—ñ‚4ŠëXy—Q•©L‹ĸøw<ë~ßãÃÆn ow ÐÙ| °‰Ÿ8V’Îͺ°õv€M»4Àô¥0:±ú¤û=*S€®œ £é m˜k¡Uð¨’'šwx€òH ~ JV]ˆ•Ÿlãö4fû…éF0¡c•áµÌ§û¿âP€­G]€£ ÔzÜ, €·ZÄ~¤JwkÄs5ÕNX¨öª¬œnŒÉ¡Z}ÕvvPíâÕ^^í @k"1•ªæšPmÛ{Õæþ<>äµù£Ïí'·‰S]–³C?Úûß·Ÿ¾‡ÿ€ (ô4w–÷'S>[€‹/ à‡Iâ=ø(¿x»÷Zw9¨5ÑÖ'¨Uô Öú `™ñw-úÜß¡ä¯1×_cŽëy(y«Ô’»óiR›‹g—Aæ·äîL®â1<ï€äžŽt¦ó+nøÐ,ñêûN"¦¬|€møàK޽3QÊ{€ÈÔ?ÎRPí5ð›ï¯ùB÷ ê.—€Êl€æïߪíÑL»qÌ(ʦúâž«ªOq½€ÑÅ]ç’æu•˜ý y¼ÍÎ-OÛ¯ÍýaŸ””k8¢¯]…}áÛZ¡$uñÚ[·Qs¶¤RWëéöIHc» £åñÞãîþ ?è?mhG ½óß:øõOùî è  Byß—å3˜ç <’¸½ˆ{Ê©œxÏ”kúeçô«çÓóÖ:ÄêÞ çõ··Ã4k4` ´aW«Ì_®ÅA¼|p[r‘«Õ:¿T'‡™¨yî,{ÏT·4|±?T»L~ðQÉܯ„F¶‘*ý»¼L…Ù0œýg÷†Œ9Ùzzu²Rú9–\âŽtöL¥iá̇œ¶Ÿã 4NRœT©³víÁrDÅþBí.6³åX?N7}ø»Ñ·ÿoÍ{R qè£|i0Ïx˜½fúÇ\ß|úÙ~5p¿6×þ·Ðo•‘&e(´5’@¶á Kê§ø'ÏGZÓÒ×úlJœ/÷$wHí"œ“ɱ¢lξYY‰ ÛZh÷ukVÐ=?ì-'Î7×£›h^¼§â×S’å÷±Ø¯2>ß Fn®gËMÖ §2¡ýOü Ð/KØû*úT6€¶š/À<"å[¾Î¤>•‡wºY2ŽÎÏaú8á-r·íÆì&zŠ+i©ó¥½×§õ9Z›tô†3|ž}èòZl>jïú«éíÝ Žíb’«¼Ûœ ¹î‰Î²Ýögº¹ LÁ ¨_eòОnk (¦öÝǃlñ£6ÿü I_@— gWfý:ŸK@Kö¦ƒsvH­Æš™[ £4mœ+òøºmé^¢FÖ0õ–[}<¸ \]/ºTêÚ¹8—\§ÇîÙNá¼ÍBì™ö½»…óXûn­Iˆíï„/A{ýC½0h…ö(t’<_ølt ÜÒ<ºäŸ»cŠ]G;fiõcWÄ‹$ûeº·ãܤPJŠžÏaòÀ¬ÉzŽÖv·“TºíG6ï·Æ;ýÐR5ÂhÖ™–bÔé–"ÔH"['~Å÷þ”»p°O ÐÝb ˜ HÁ>—ä×yÂvó¢Ù¹6ÃÏà,–ýÙŸëûÀu™çòc^Ó³]ŽO®èñÀ´ŸT~±ÇKz¢Ð¢gù²½æ·Î¸‘ˆæ£ë@æ«V,l#ƒ­¯U›ÏwU<ð‹ä2JmŽqŸž¾»ƒÚ(Óšx“,]iû|(jžpTÌwU¯,åçä­ 3F“6§–IVGI¯ b «Ý†]Äâ÷Þï$ÖrÿUµe*ßâ¾B’!q'ÅYß+3Ÿ ³‘ûA7£éÌXb§ÐvïÛÅè}釃оº=¿ölëŒ švÒÉØ|GÔF.ÇšF> ê×ÊMú8Ô#ïZfÆ&cXÙ2U© TÜL…jËBLÀ«ß•ÃßÃÿtN¯¨7Œz™{t{¼ƒû(ï]¸“—á®Ýï˜éb+æú³S©ÚœÈVm< Zê¦Ç÷³ûö¥/q)=¿ûÁ†ö»6~Ì2feXbŒzãVÒOÛ£©õZŸ¾V”¯õ>›åõÑbÊŒ¢å]GÂŒ ¢"4û²µz¯ályçÑñUâÆa=uóƒëæ¶XM=¬ÐÅõ3g×~~’hqÅ«U“n?wûL;Sì¾vìþc_w[ä¥öZWŸæJ:§ŒFb‘z$H%­4“ªª´ê?¯_PE×$%)sê½ì1šÛ°½uµpýpUÑ_¨ôû»©¼=÷.Ïn í^PÞª<Þ¢^jnf|‡“É °0†Ù|êz¿ëMš]5[Äþ2¯_åëÆR\îh®wÍ«±ßR@¿œ¯„&f7\Ϧ’FÄ‘\é¦n2JQ²l Yþ Å‚#« Ï%¥ž}ü~ÐÚÿP×Êøn 7ýýrÔƒBÛ©/—XÚž‡DÇ&½éIÉñ°ÙDéÞÀë+ùøYwš:Þ­ eT››ý™i£™Àh3ÁåÕÅæK}¹"¦Ì+•¢\%ë)܇…Ž"1ôQ SaE“”$­ÖÓ¢œQŠœ\Σ̯t¼,gm98<ÐåÂê—gÁy$Õ=› fƒ|f¸ã–Ew$£8,nTë"¿hÕ*ÅG¯²_¨£òe÷ZhñÅÕ©ç^”rRÒöÜÉŠûÏZÎpJW¾º(õSò-[ª)´—\E8¢¾"ÒV¶$ÖówþWDíiµ¶k4ÄòJ³$iÆÖWâXKUå!ÍFÏ«ê‡n™Ë¿ÚDü¢›|® #%[U×ju³£Í §yrÉ⻚ڎ%’_‰RéWlJNY˜5—xv¬œzLÿ¼a Ó™‘ã8û…Õ(E¹±U~w&fXOÏ —÷¶úH‘`8gÞrà¸@jòDˆÆQèh;ó\,hÔRæ viæ±Û¬•#ãØc>émJœÖßýƳ®Õ©g ”½cnûÛëï˜Siœ×²Ô–xG¬Éynû‚bWm¬U3¢NTÕ% Yª‚¦lgÇT<ö+CĤø\<ßÚü¼99ä«ùF”³Kæ“kÊåÛÖ«DÖ5›yf`tzä[´ÌñSÊw½3¥9ŒÒJlüÅÇo$[ÈLFÀ»-Ó&Eù­r–œ»¥<™¹—JDU”<˜”MœüX ¬iô{X9ÏѶE~P4GÖbˆ3Žæ(4û+z9•ªŸ,€xÛ6@ž”ÐR{Ð9óh8ÊtŸ±:TG¿;-¢ç@"’‚1 â«E€¸Ý2@ìM ÚÃH‘ž@À¡@2Eø¹Ì42O ‚L,À¯BšM€£Vb¿åƳík÷¡S¬ü/ÀLü{ø?….÷m¨Q€zúþ õ 02à–"¡Ð½9†j—G¨öŠq4Tk Pk߀Zwð›í¤zqÝÙA­Ûoí)UH€0Û@²Ù ÔXu¾;¯êÉíÄÙgªù(Ruëú&ÎÆ¯(¸@™õ ”ù¸w Â*TóŽ€Yî·¢ˆu_%€Ùj`T×èýp¨—þT*ÁÞÀZ2T;«$¸ÂÞ˜#€ô”%Äø%Ç @ÊhPœ`C¸]€ ŽÃx?“»¢6lþ 7¥›¶.hµlü €á1TÛ‹mhJ ½¶ÇP#¶Øy•Ø‹5šsgS€g€>˜4ÔZæjzê·žÌ`Ÿ¿ØçÖȶ@É‹+@fD ýô&U…hv ÆÀK¨wuø(ÚÓÎõm¡Íh#›µS‹]é¿âk±€B§ ºÞ˜'KÔý¿×ƒ{ àæ²pì:Ø–¾L—à¤[Ðu—KØ­‡P™4§/ŠwhÊ«Hdw×¾½?×Z W£d»ù^t\g*Ñ=ïz|ýÈ“¶N¶kùW@])(óŠ×FT]€žßeëÝ Ò%Åïûb€È¤»_±K€ËÊ `Æ0XoY}†.~LÃŽ'm;[(ùû\!÷-×è$Uƒô_DÖŸ=®Ò}t-ïÞ™¡±æÞ;á•Ý<݃ þ-ý €ÕpøUï,ôÀΠ÷ïrhjwÄÔƒYþ•6 œ! ¾É3‘?>:Ï%"Àv„°†ØÿöKÉY,3…3ÂñòèšE^µ·Â&ÌÔˆÙé¶ý¸¶.ãkYMN­Å³ªÛµ¹ÅVß0ß…·nƒ+ý €sæ÷[ˆÜ÷ÉBÐø^BDÈê;ûÝÅ£ qRMA+‡© ”x,*¯m^i$á‘è%Ì%=Û©wðŒ$4zò6š<ú »?’Fá6™Ÿë?è5“ OÜðÖÝÍõamÎå•;ãåEÌÅù4UÍÿ €­ &Àò…Æ¿Ê˄֟R®ß…è9@qPù[§Øæûób²4Ÿõ]éÙó[Æc(JÍûèCöoþñ3»Î{áæš9DçKû¼¢@—és[G—õۻ̣f­q·¼¼£4ŸRFq†ŒïÜß-à}ÿÏẤ\…}n4¡)ÉÌ– @×@Í¿ïô§„ ©ùP÷è’äÂë9¨/Ñ»Ÿ"³·r>¯hÛ®DÛg˜³Ãï{§v<öwFYîc\?… ]…)<]ÜV[lmë”aHµÅrŠ þv6ä&N[„qÃ¥~ìl Ê<µ¿{Aiðï:£‘Š̓ï²àQÐl™ä7£Ã#ÉÇma³à¼xÄ\ð܉·qŸL7Z8}•«»Jkmñk4¨U8ßd§·Ã:·RË{ï(ÿ s¤)AL ¶Ê²£káLŠC¥‰›þ+ŽTkÏú \kM©l’oÕ¶øÝzÀI¢ÂgöxZçäåazº4²É㜗s©=(¿Ñ0ó(g·V6‡¦¬óѽ²|ˆãÆ"!{ýù/æ©÷å2C³cΧ˕Â8ï_YÏcÔp¢–ˆÁ;dðA™y!ðƒþÓþP¨Qx3€B£îP¥ÞÐj@í?ïô;Ïg2Þ‘<>»4íJpº•[§ýÌ’ï;¢XyoN†‹¬ ¥³”î5þ»CŸ–f¦<)O‰C£áÓ~c0aË`œ,Ô{,D#dJŒazîâ=²g£nã!g\Æ+¤»G‰ùü € mØñŸOû_ˬ©ëeôøY:*Æb*0në8kEgsÚ>ޝ³áâ›æ"ÈѵýJ—£E:rŸÓ±ýLNS&#Ú­ üàs¸Èý•¶®AA—¾ÚÍ£Ë< x·mRh'Ú€Lǵî)ˆ8Õá?!ø0³ø¿OÀ É­Á ‰iÿkµ-­âGÀ8ŸÏëT|Ó³!]áݳ|.ÙzuoâLgË Èd-éÍÂ(gŽÓů“nUŒG:ù §kF°ä0Íöì»RìžHTï\b»}'ëöà¶@ÚÂ`œnÅÂ0ÕŠ³îbônN.øÿ–ù-/ÿYtIO ÞM8dSIÏôÙ»IR|{ÅÃg¼”w᪱)^Ã¥nÌæ3û5ßM¢Ýâ8QÉmX6˜¸oÑã”ëìQ¼syïrm1×—pðlGÏÑ3'õ.¦Ôµ˜úAÔ®ðq´·üv´«ð‚Ð~C# ÔþWUŒNªçï"ÁÔ3)ˆk˜YPgAb©=ÎHÅ ê6k«É²Ò…ãe£X¾ºÛë±pìì‡ówîÛxtw9·:%eƒ´&U“qÒSjÔîX¥¾½Q½mßõwz7éôjÔZñ«±^¥’Æz”Šÿ ?è?m€| X£û]$8ŒèFßßõK=fÆñsá@ö}LÍû©]óõâ6‚‘5–ŸmMOl8~tñ¹§÷ŠAÛ”B7çµÏA¸?œÏJyÿ MløÄëpž³9Å×,ÞÈt-ÞÑcë|¿mö>|Ù{ûªÓî6®×ƒËïø|eÒô\@ç×KÀ,V—g|sa4~áìúáºÅS¸Ý&Ï ç¸ÔJ»¬å9%ìÉÍ]u½Oi?Xb²tÏ tD­°o¥v½¨±-$OûD2VA1˜êóiHæ -Óß%·êȪ½k¥I%ùAk7Ô‰-žíÄVWì<~Ào!z8ô=›øvËîOæ <ã‡Û©ºÞž¥Öe=þàÈ¢Öª§¹w×Ñv~Ð!` Å…“iÇ;ËV:ÛÆ®ªí³x¾×†k ˜ïL–¬,¦¹’±^F­ºªO^¿ÿ/ü €P_0Ü(¥pBÊçKoÞ:dRFw&öp›·FþF¢piV}0coIv"®xÕCÉ‚Ý;yb·+Ò eØm¿ö Û¥é]ÍûÌ"sv• U0GËÎë‡h`ë­Þì úùOy{¥_ƺ–O*Ƙ}V>1{ûp qM蚢÷ð ×ááMkæ/NPX­Û?èZ¹lÝe5SXÍŽ-ü6yÖ<Ü[ÞÃR¿U½]×[Ë ÙmÒ¬6´{Õ¡_KôÚ4N°G¶Œù,gë¢]09¯Þ©yM<Î{uÐ63Zw•ë-†}ý eºLÇåm½ÿ x'²@×:£s¡…TB‹pÌ €k+}Ô$ùnÎr•Êh µý‘Þ`å ¦û\:b;3^ÂìµÙž ûú)tk“ébdšzn4ò›~n÷oZñ`§•ÄäåÕä÷ª¸—õíPäK7£ ¸þVo¹|¢u«ôóW|ï•éMû¶¼­C꤫A„%úJëZê¼¾æ4ÿÖP­±žkt¼õc¹°•ÖÅå{¦])sM‡iHö½š5mm˜UoêÍ¡âëî<½Ñ9¹(þògKy¾er2BOjÒêy:H8Q'%³ÏRrZß!òTï§¹^yý x¯L·O·óZÛÑË«¼òUF˜SÛAÁ/amidTl˜¿ œßèÝXnÞ_ç6& >MNy¶7-je5ÒLâmXûŠÛz_\ŒÔdÞY)³Zï"›Ì$-Y¹k^ÜÍê¶Øh"}Îâ‚3œH•R´ŽŒ”$tyHýŠ+‰gõpÝ{ˆkoƒævOã&>æ<ó:åûÜPì%ìwÜhá„/ãØ(Ôî‰å_L´Šó!cßZáÕïxJÓFû»­¦øEW^ÅÓï³Û½¸g@"œòyªt)µR/kK…I3U¼“!W¼5 ¦Ôeb¼tj×R¿âðŠ f|ù»Z\`[!;¹Ï‡”‡e²ç.vtG¿íøV}ª šy™Ùãëx[«LÅ«Iwo#?ຸ*°êŒ%œtig¬ëâ¡¶í ÝÒ~^êËñ±è5rpæ/$ÇWP•¬ÅÏÂÒ‰Ÿ5opˆ#’§V­å̯Ø:¾YX¬pñ ƒî¡Þíñ‰Š´+ÕÒÌ•[¥º4˜öàœ¼bđٸ_g†KÎvú(o^ÕÏŠ ¶¿ RØ]Ób[èå8 H%!S¯eÜq¾ïï{|&šùj’.¼j •‚lgÓ‚xìTuËÅQEª4’¬ó™ãÍÉc—£›#Ç1¯ù”Í¥üU¶€ÎÌÀŠbzä øw…jW.‘Ÿ›o‘ó!9" qw!3¯%O¬¦zãWŒ´CçÝë*»¤U~öcÜ~˜va}Ñ=~úT d dò(¥Dî~„3L©ô±Ó¿–Eù̦r» ¹¦è°,÷sÙÂ@EZ¦…Ò¸«AÎÝÄ&VÃw|tŒS)}‡5+‹Ëb,…ƒ±‚·Ym×oÁü ÿ´ÿAï¬Ìž­Õðv³Š|ý£Qƒ“ðV¶é÷ Ê+ŠÏ™¿ã?[yŸÇÎ{èT‚³g¹·xdn+4¢GöáBilÿJ¼õøA‰ª Ÿ­p g¹4–Í´]•Y$ÚVKH Zi¹ð§^r˜ò½Ù#åxâWÄ£€`´2ÐÕ¿•+®×ˆ´ïDÆçí+@r „ Ì®]™þq 2¶™lù2È( Òñ‘é„)ôÙ,ƒôfÖé†7i|é)’@Ô0î9$ü–ï¤/ drwöµÂã\B.{lÌD ó¿%û¡/ш9†2½xQaÕê1NDÑd¨Õÿæû™Ým2~2F#†’Wð\öÅ‚ [‚ׂ¶L(ùÐé—2éh’Š)Þvhˆ1ûUÈ~æažDò0Î?Ûv‘{¸Íó?è?í?È¡(B+²´b­ ÿ¹wš¡†Õ%@™Û ˆ@dÝVR Zá±ÈÜÔ#ÈÌ=GÈ8pÌTÊ*Ȉû{-ì£2\m õÀ<ƒëð¾à N…¯Æ"ÈŒsbbëñ™+äù»ÐY²7yÖ`þò¡L)e.‡5€Ò÷ïûûhCöþ]Ÿ“1@Í,@° P4ÓÈFZÄêF!7€¤2°ÿîR dö­2Ä¡ 2KÚÏ™åˆzA )ˆø8õ~Ð$Ø!êãRPÄÛ˜˜ð—E•a£Z!¤ÿš†ó"ÒÒ¡†ô eÛ}·=€åŸß:xë 0>Ì,…™]¨}€Vúß÷+Qt}bóAâK@l˜œ"Úv‰ž†×R'¡Ç;€0Âb?’Í)®•ï\åÑ£tõ:mt…¨f?ó'V˜Cï¸'þÁúOš°…zºÐÞÝ‚òŒÀÆá`çRpöögÙz `ÿמÀ+ ®!@DЖ ÿ€Ô-Û”¿Uð@.y8·õùwTn/'€Ìä÷ _Msñ¾¾Ÿ'ïR}ô4Ǽ¦™®z:°£âÞÃÇônfÒøviÿ€k4eÊ|ã6ÀÖƒÀEÒÿ®ONŽH8ÀžpïÜ8÷övÉV×Àè.ì’ÇN|YØ®’ì ›FRߟ{ñ}Lc'`wÏsªrô6Kê.®ÂM¿+—ʪa»¤£‹ÝÌÙ`.ÉõáÍ kN¦ÿZï)‹2Àj àBØøÝšBG/€˜ÎÈï2k åbàOeðvýœ„"øAã¶úÁŸ‘ñÊ?nùH~”ÊGóî"ç–\nƒ›Jæ×Y•Û_Ó—#YÒ-¦ï‘v(e)ykvß¹õ1/QË›¹úÿèúÓ5ea­ =‚:@ì[E@”F‘FP[숞ÿŠïœë›k×U»~ÜIUqÉ“f$ƒpϪ³¨›xuä 'þM`sPèå‚ôSAfMAvø zWàE‘¹êbúŠ”ÎâqÅW›»!¯7êÚüÄñÌ^SȱzáË{ê<üxÜ)$×òñ]Ì~ð#ÁWQœ-Ýömk \”kl‡ñµáO›é²GåùìÒ?±/éogûÀ_øbÞùÏãûë³t{rtrÖâö]ó§zE/íÙW¥(ŽïQ ÇŸRm Ww‡ý9Èóñi4Ì|ÞNG¤Ù.í)h†t £¶úîø6ÝnŒ¿ gï÷šx§‹+’+K÷”É/2’—þÁmè`ó róŠ·ý€ï¼.´œ2a(‚ìyf‚œÏÐ×åW5ktîsÄpp_ñ`ˆ}e™Vk÷ƒ‡o#:œÎ9*5K ,Ƽ—r3ãU.ú[."³¾Û$Ú°0ƒ56 ÆýÛñ_éÌ •eXŸçöVeu Yð}¡£›Ü)ó¹ Ü ?M×éâþã!Í G¸š«É~«'Ï×É)~\þHS·ïóÊLèð GH—¾ßñUKÑK ÙÛmÏoçã°šæi*ؾ'Ä–¸mº¾yxjƒñ2Ûá §t^:óº]ôMË÷÷]à/:æTm[Æ3S)D«?¸zHq}•PéõDýÄÏIÍ=ÜØéoŠžò¯Jsíœ!Ü?Ò €õùñ¡Ì±9ùOð®p"£ÇÃz¯»zãpj0›ó¾ç¦é÷®ôhפÚoy®8å–9Ö“í“yU­{«išæv©sh}3Ë o‡©<7nj¥8D”x7,Ž+»3¦*ÆbLuäû(yóñ(¹òב3£Ï#G¢Ž?8Lèã_€“PŽãÝxøŠi°ÍÞ÷dÆÃÝÙ-ÂK¹À©bAìñ©ß7Úö•]-Øtm¹Mò]Gé †óæÔïk =>_ÐsM´žz<Ž‚Iý‘=çùÓkDo™ÝçH95F iÝ~^ä”’‚àSg9E!G9E€HNUÃ_€¦^‚2Õäû}±|á5…Á~uûwçT¿»ÓÃk|6÷iÜñ¶§ ~ö_†y8u ¥øÒšëœ5éVWÔÓ–®hÅÖs¦ÖR[1›¸?zÓ«HæÔáMÊ–xL,d-ØúÂHï…‘1: ûýâ$æo‹ƒ(æwÈ:wôåð ±S=hCEvÍ‚W_¨uŒOO>Zxˆ¼ï·*jPÔ+ö¦iÞ _¹ÂrU°,D|ÎÖŽó† έóפ¯•z”¤Ö> Ui_Ëæˆq–Kisbvb1•» OÚç=¸ZTyÐá ñɆƒëƒ=_å¢á 7Ããi´Êø÷­ÿ’_€ÆÎö  5¡Ð a\н VcÃMv2ŠŒ!më™áÓyqã Øýî¨ÛnÙ³^ÅÀ µ­í!£jý¼ PGq ûk^5I máàæüaír>ðVÚyôü3Ï}Æ:Ç}”`Û·Ÿå#ß&«þîv¢A#ì„íÃíÿ4õ)œ¾ÇŒð¼$&¼ËQÏ ¨p-¡Ý]¤àì&ÖpÞíêÄã7¸»P³óÜ’/ˆ‰Yåâ¬ØmÖÕ™(w”N¼çFܲ*H…º9ª¹¢>0*á²ÆVÈyyýήñ}†Í<ýƒ³q¹ayñuä˜7qŸA!êwxØ·çÙà/€lÍgA‰—Â~ÞÚ@Ô í µ™yjǧ»L×”TaYÆfs»•.†?¸éU§¯Ù ÒÓz #§M6Gýã‚–Ší'ÔÊ’4hcµ¿ì…‡O• #žøKo{8}jQúÔžù½rû}fò«×ÙÞï{–o¼BÖßÁ?À²ü_þ@ÖŽ9×"ùçÍ0cŽk›«Ñ%WéPww·±˜ÜcÖ6óŸ©…ÊþJýÊeªÙ£vÛÜh€dªRi&¶†·ü©Ç'Ze»Ä#V \“)î-Ÿžæ”SWO­Ñnó¤P‡`zG#{í^5ôLOœkÔ+OûÞ(} ÿìš{ÍÖæÞÕÊöxËU~p¿ËX„+ô*%ç²Eˆy—Ëfß%½ÈdÌéÌóåýÌÞGCBFÅÓ`— \á¯M‹[›=¶Pøˆ½‰°Ò Üw;Ï0vîû{Ômì£à/€Ü½ÏŸj¹B=ÈOsåuëj•ÜmÉ;Ó‘³–Ù^&½ªvAEZ}æGŠâ†Õ%´—ËíEb+áßûÅ’’Û]°Ï “ Ö*óØ¿[ûÅ*CW›jó²…=îvGGõgRµëa~¨-îe¼ÖóóýZÅ65äÚ¡:¯aDZWM_¥]: '¢Ô¤\AÝïþÕYŒw}©H¢Eáq˜< Öă=¹@ÕÈY>‰Iãÿ/ìÐ^FFnªÉ¯rÒÇáG®TOí„"™] –t4òŽò„îÈ,sÈa’å©K%›~ó|f릌À则úYæ/üà†ÿ9ÝÔ»’»Œr1uvúZȪ÷]—æÎËv!<¯ÉÚó4,Æ?Ô>;áTå‰Ì¹’‹Ÿ·òa¾~”¦Ì÷DÕLç]  54O9<ÇÖ±|–'“rFè<ê?x:t±Nº”j ¸2PõÔ9¸oSSyðJÕK¯ŸÄ¦OK&Äáð¦Ú!w 9*l‚ÿ(Dʇ%9éíôzâWà˜\có »"Ô²F:œóÒ´gÚE2Í8ùd_tsî$ö²|Óò2%ûi¹GoðÊñJš>¥¦Çô PªÖI!4É!.„n B·±„ÿàMÓñ6”Ê ‡u€~ì6Àº÷Àèì`ùÆ ûPc½h?õ(1($Ùu²ËH‚ …û=ÝY|Y¶™M1ˆ¸½ ¯Ô¯c€-b¾…8þ@¼Û hþÐyKðq&þ SUâé¥:Ô¸Bœh 6'«s€!· Q=¨i” ä' Ð 9‚°æÍœ7Íg€¼û/? Vh€Äo ·Áò[–Û.È=uý*‹¿€¹BæDþ•à«úë)u÷¿0{FÀªC™öÊLÊ H¥ÌPæöèlño &jÀ— À°:ÐÃT¨^tžƒÅ˜0ð~ûñÈtHÔ f @…²±XC5©3›|uAh2øâýÚ˜äçÅ»×~¯M¸Ç_ØÆ†w.PNÔ˜cAÊœ‹0·WAJùÆÁy뮦ö®7¶”y€Iá `$¶‚èŸV²_ß²¤Î)€áEXé¯> ±é4i@¡É%( osô^N'«Ý:ýšþ ô‰³òëò9/ï`§%”y:5¿qËq ½OX€ö"À›B_¼ø¸ƒÔ“ÌÔZ‡— HÕrÀ>ýÀbû °ðú˜—ËAôk3ì.Ķ‹90¾áåCâSrò'÷4ü)ƒì³¸mdïµç¿:æësæ æy”¯çø/쵩‚TëÝ8:ø†×Pf­$u¾§x$À?ÌwÛº[þF{ä˜x«6©×p R›eRêý RKJ÷ËËVÂË^’iÝ¥×ö\6žám<”Íúq¯Ëô•ÏÅV0Ì^Øí!ue?`ßB‘KÐëN?ø¿ä@ª|ªýçÈ¿˜h:‹ôAz"+ }ü,@úÔ‡®é适´ú©€4Ýæ@QµdÙn’U—‡WÝŸ£¹ƒ=ŽžýÁÕ¢[½_ü°}¯ƒ3w»-‰É­…—×…\.ž™ çõ4Îv#%½¿hM‹·Ù ~ZQ3ü °*¯UØÎXŸ`×ùwrK¥2¥oÜÖè{›ȘE dúÃz"}îyPÓ£‡ú8[÷Ùî°¹™cçÛ‚õ¼¾ ½öNFyÕ .ï¨óŽöç¬ÊÇÑÓ"íñ} À¾µѰ³* Ûìºz÷O¦zZ5ëÅÈ}=ýí_)î…Šƒ&Hó·Îw ÞdëKdÅòb†¿FN»òÐß]·y…çcÚ¬¨Wìó´ÏÛ·9…Mãxù6ÈÏýÿF™†ýƒ?õ“ãÖÇ-O¹Nç/€tFƒBe’Ù͇¹h£¾*ç@¿w6ÌìRlÈJ”LÖ“`Ûè,7çÔ2òÛéÏËC‡\ú_ìfÑ> 鯼>˜vLKÉ÷ 9Ê:6œLµÍ³cO¥Yu£Žùòy¢Š}D¹F¯¦2›#¦ÒèÁø‘•7csIyã6SY~áüÂþ/ij…º4rib˜Èc[¹®/öx {݃U°ûÖ’¶pıÖÍ÷0ð\d{_æ°7bŸúݼuO¹³ƒUZº—_÷f™no0 YEU‘ñÝÓ{^yã7Û’aðu÷ÝŠü÷Tùcå·²K!¾ìO÷‹¥ì¦/ö_€6´o€LÌC™íÚàN g Ö`Þ¤Ó³óJ:·½ÔµÝi@MK;Ñ ¦¨N:å¼UXÜJþº}“2ÙCA܆§‘¸½-|q }Ô\ÜzÆRJ߿ޔÞkó¿Ò‡[H jvçQçZŽ^;‰ý>Sƒ »ÍmåÕíùóIs⥜p¹ÃÊaGƒ‡é! ýý¾•Éi7!Ô“Œ““ÆbIçÛ&?êÁSZK[C3îJ¡‡óðÈÓéá¤*‰ÃI­áCÎJjo!ÈÎd»cý…ïÓ @¡ªE=ë%¥sª2vq•?…]Æåmåx¨¬[RLy+ô / -Þ²5~¿³¨mùj¤ªê[ƒãtZ=;EåQÙTÇÝ>Ó–Wòƒ‘²KK"JÑ~ðá$â—m«D¼±¿¡|kœôyãñZð÷TÖ4J¸3ÐØì|p‘qó/€ ›'AöäS× ‡–¢—Fä‚áÇÏm+s«¸n1|ñ_õ€Üt³gyਵ’n½zšopòõ8Ë?šOõÂÍQåYB³cUË2ŸO7İãwBaùÁl•Wø6š÷»­JÀ-mçÍ1ô–嘞9çÞ»ë²og®Ð^ú¯ÊÉâ[üÕü ІÈÈ•ãî¹t]öèk›ÞŽBfmHt~Õ;ƒ¬›+ßç\ÌÜ<ìK·–³`²ÚO«NrU^9 ®-LjRræÜ-ˆòó\^Šrk@Šu¶ïØO‰cÉ›ÁòµÔ–HþÉä^r—ˆ¡ÉlÛö‚í›¶Í¡wÛäÔÔÿÞ)h/xR! ¾ +3ÖÓ›ú²kqºN¹9\Äœi©•[’Ø2ÙBKÐsáËœª¶?i¶Ç1–*=äì}‰ˆå}1=l,"?¿Põ>Šƒ.»v/#v޳¼Wz\Vô¤CßéÊÖqåÖÔé ¢.zòtf÷©d2ó¤ÿ8ÀóËöy*ìÜÇ·Ê žò;íKÊÍnêG}\Þh,‘ÜLMO=o_Ùé¥3›L¨éǧròN —“pžrÁc#|×׳Üê^'Ø\ ´{ÑñÒ§Ué¨v›™›Û1%6î´I¡Ùiãm­ÓzÍÛ‹±ºZ‹ã]µµ¿rø¡sš0j>ÈÉ|jMF7ÌÝ”©sÆŽÀJîÜ";Ú)—ËN“fKyÉ`´>éš4d\Aë{á`ު•Rßk/.£É#Ÿ+…^e”jtoYÀv,ÿ ç­ ´ ¢sm»O¿Ñf»Ãi‹M§½üHÕÍuuêÕmj!fóÙâ~ÙÚâ?øæ|Í`+4?Acæ˜ÌÛ÷Öã_dgzmvcåƒïñê,”äàÅvÄÓ3/ï÷½Á¿oâªÇhÈJ•Õ¥wz–'ÓÝÖ©BPo9ߡР%·ñÙÚKkðøœa?úTÉ MIQ¿;¤H®æ­ ;3Z|©;ý çR`æwa‰ÂüNz. Á-™[hãndXû:½bų²ôü³\JQW8&O—ìG •EeàDF¯ïßz—¯ F±î«^½±Ùw-gwèó¡Ø®PhgRÙÊg­!)K‰Õ<¥cS±ÕjSÄiã<âìFm“7ÔÉÉhœªêôÿ—ü¾÷rRë[ᆺƒMØM±s7üpu^¢ÏQaÊü^:(·ýpNh‡þ¦Ì]ûY;¹‚‡75ûfzÃ[é¾´û¼³lGëœânö¡µgVÁup²¼kÍjœî7fäpÖhâÙ¨~?Êõ»p‘k¯ÖŪÍ7s³ >=£fŸö¶J5ƒzÞžÿ8µÊèí…­W­ŠaP#N‡’Rñ¶0-o¸ ì˜zª|ïé §©â˜è|.cŠòWc¾-ÃqKI +kÝœº³cC_ÛIýYM 5@Û5z>–ª^ö W}U6Þ'U6B¸jŠàgN¾•L>e[}¯ÿ…ØÎçdiÓín.Ú¤ð9(½HJf¾,jïk ¡E·'ÀÞÁ+9œÊ6ˆr+J$9¹L³aÃA©æ”zç˜3kËN{U]1LTÙ(p–½„YBbjT9òÍQ™¨V×¥Ó§•+ö8s–ÉIiòÊKUQþáÿ_þ³~Z~¿ÎJËâQY–©@"v“õÑ—-ûE§ÛµY£½s}¿u¨orŠûX³ûùFûéWkŸÀm×°ƒEW¶šÜ'BSp¢˜L§å 2—긾*’9ÿX°F¤@•õZÞQ?|ž®/Üç~Ïæ\kÎ@‡9–Zþ¼=z_gr;(oŽþÂ|€¸'Q©´ÓaÂüŒ§fÃâ\”M?±s&qZî}üàg0¼’©RõÕÀHBfQkkß]«[Ä1ï BSc¡; ¡»üáøFGÿß<ìJ(*Æú¿µhµ]Š/!³fÝÁGUŽ)òDñaN ®´Txl¦|Þ‘y1çNH9Ë7¬§öqœ–é…‚¼ù4uÞŒf©zîûŽ!Œ,q’\«B7;Ä"Fh2‹AU„nUxˆó¡Ûã#T›F!–õ¿P&Îäq.”Í•*·k0×ÿžq‡<û]€LÆ€díIò¹¾—É'“¾û$£Z†Ð(ˆË ù˜%x‰É[Égly(ù(íĹ|&Ý6Ä’O>* ¯³«³/àªï_’|6-ý #ù¼s€à#û7þ E›Ÿ"@Ý&а…ºãT;£¡Ö¥õ[ˆÚñÒ]\RÇSÉ*ß²ä÷=€ )‚Ö tâ¼VzšAŠ; êGÅ.ÀOàEÒ©ÇtRþ!©I) R¡RY¿°k¢&¾\t’ô±¹ymÌñ×Û÷gȨŸgÑw2WájœˆÞ½v0µØêÙË+\Ï…¸Æ.,ÒÎ|ê¾² Ðèd˜¿››ÉƒTkõÝfïu ÌÝ÷Ä‘75†p¿»mñà\.ÞÎNóI¶ª4Ÿ{ŸeG’•5»Ovy»ÑÂîFÂ1~¶¬GL© äêÄûÜ•6*­ œÇçŒ|pŽûluä0ª `Z¯¯½ìRV4߈F_ïÇEí`oæ@Ê;¡Æ2 Œ&HOêÅñ½p~1øØ5ÁÖeØ+Ù&´—Oî•?ž·!Q'%µïu§™ Û¡K›É…¤W¯ÜEv½g-D$ZÛŠ[‹¬xÞÌv¿õ‡ã³Õ5*jß®O¥Þ˜VÇD8©îÛe†—c3ðÑk´¬Œ^¦&ŽìþNùb4ê$† ¿Ñà þ@:Ó+‚Ls]LʬŸ¥ûý=[ýï[¬>ï Ët;."yßäŽ-Iß÷#g•ìÌ>¾T׺YI`€>ÒY#õœ¥ßKd*쪠EbRS¤Ò”cn”d#ùƒÅ–Ì Ú{i Òê–@ ÆRßèHRÔJ}®ÌÑÿÁÿ%ÿP¨´+Üï«NáTIŸ=²L^» ã'Ûò} Ö3ÇH{Ÿ®ÖXn®-Î 'uÞˆÛŽÙÑܵΠõƒ¶›ìnÓ’ÕI&—–úÁÝ cŠ´êò'à»’ÏÓ‚¸í º˜3·[AÎXiAÎÎXA®¡²qQ;ï¡Vïý/¸_€64‚2P¾¦«Mô@Ž˜äÖ‡ð¹7¦¯õl[®œruùRµ²(FïÞb–ÞoóžWm¡z*Γý¾Ÿ§Õg´`å¬Ì^ÉŠ”áS-a€þð¤ÔÁ¡Wƒéªø¾ØÔ¯ÑKipÁqX)nà ¶äþHŒ"Ž*ÕsØÄ=}}6§uóÛáåꥲ“ËbOõöeÜO[óV»a°‡˜›åûüxZ!5!±7îÞî;ÙÏ©')×)Þ…(:ÃÖ-ÃßíA¥ÿ’¹·Ìr"‡J;›åŽì•åNz‹]Mø·vmÀõúDŸ[Œ‹ VÄo€ ãåcô9Ä¢g¹ùÚ‰—é}Ýœ¦âÜs×Þu™· G[­ŽÖ<ŒûÆÄLÔôϋòíÍÆô¥ ¼Íj-†Ïn$T ñe;N·_\ŠûÈÕëg -f‹5†LŽŸ[=)¨Ÿ{’Ë6~p˜|„^&<3Ì%‹O1†Å‡IïþuÎË0 ÐГÎÿ©Ê•#_âå®Ù;Û—ýro¾õâÎÀ¯ÝçL¢„ÜTm“ä¤õ¼@«÷¢"g¹«!Žti9¼éÍ •ÞûÀo763Éæz{ôÝ ™r¿{A9­;=”ŽÝ險u§óǰ;œyZIÅ}H…½^‘<üËòM^eÞûO›C×ïþƒF`—|O.ÎD¸,;×ôáÂßh„ãœÕxôL)‰¼#Ƙ4êHaD¢»R‡ÍjÍäíqìõ™¼°›!{aÄgþïRž¡éî•xW;÷F™é´Æ£)5¥=5¿Òj¾| ¨ùìÌSÏÙ–ëèÛëÄW‡þ…x©Ûø¨Å׿±÷’ÚÇ‹U8Í[ö0„öÒçãíô<-y ¨>ƒ±—*=F©š‘ä^¦›Mo`­û`é)ÇÓÛ9›{MýÞAg#zZ­ÜºÍC¥/µ?ãÝf΋IÓØ åC#kõ­l—V_‰û­•²ížï÷Ú‹ƒKÿÂ9” Žèî÷ê©ÛrÇ .vc´ŒLô‰í4…`}tæ YÔ² ©ÜïDÂ5?Ö*åùű ûXoæXVœ$¦\¶4úËNטPpyP,¨^¥Ú\¡Wh "ÅúQ&ó÷é†Ì?¥æ¾Óäšò5×o–zg¶Š>Mæ4·û ?x4/3`£šôÝc×û›S¥ïGs)Á¬¸RÖëytGÙLv.4>C“_^›.1ö©Ÿæc„•¢°ÀÓ-IÇe‹íš±"wì#?£˜½l÷-6l 5ööƒ“’©¥›cg×hœÑŠÐP£dÕP×µBýz5Ùzk3µ»•ëÕ懮7úçî/ìʇC¹‡Ü#¥u±ìîp? {þvò$ŸÞ([)Û?¸0ëuÓÎ3Fñ¨Y¯nóKú6|œ»ÏQ é•,v—%ÛëŶv%“{…6šGõš•»~jÔ“í§nôò•Ús5í׿ ³¬Íf¶ f÷N•öWô^E(•®¸†®°"Ñù…uóL>–bS¼Î[§Y¤/çªï3«Ñ@i9Âl86xlq˜2ʾ¤tÀÃPÚÙ;§µ‚è¸jI yi©5œ+I¢·/5ÕCªÝˆ+•~ýÑ£”z{%XµîVßVÝúãQÅL*WáÓa·’ÞI:±yb[j5‰Ü A—ƒ7N—%1ê–‹…UçÜug ÛÅnxÑÑèϱ@½Áeæh}àÂL™}_;k½ ‡Œ:=¾:hñ“М&s§q£w›¥.õ9QµÝËÔoDTS'­Utw}bçÞFåý)c•˵ïùc¥‰»}–ªU*j§3Wl8·ØÐÞ¹ÂíÐ 7¿L oÈäJþ‚SÕ𳉕ˆp:uèõ/Ž–Â̶­>/ƳžÖJ©U¦:üÖXWåêT5ÍÔ˜²¸¬®lc[Ù¸óc%WÚ?ˆb犔 æ”)©‡w¹8{ã̓)ÓùDéˆù.0ôœÛ{nsØAxeýy†È¦ßÖ ³uí ³56¥Œ€_¡Uf†§M-3Ü,«¿`.Ýî^«òfÌI†+Äxd÷y-ÑéÛ+¥´7ZYhÖt†­~îN§’õ‹C¢øxAÇœ–¥:øE2½ T~yøÁótÙ¼äØšzÏúºùÎlç:žÉ½ýRZfb?¬ ¯dÕYêfÃÔTÞ ©zyÐÂâ³`cº6|CòA;¬¬­‚f÷ßgâ5îîôù%fÐ÷rEmµ–Ôh>›lÅOªt<‚VQç¶Ã‚5Ô…<]F9¶J)Y¾YR3…hép˜øÁ»Ù¸ÒO­RSÙaº ¨¥"7„&‘Ï7KN„nå9ˆƒõÝ· ×Q“GèN•Gè.@8×_Pó§/ªÆËéûï"ŸFü¬;rÝš79bGÓTQ›iõ|÷qãX»T6}o‘éÐ~“é‚vq…½Ó©zÖìbdqH£T¥Í tƒèCô%ˆ¥ñ^ t³÷ÚîîPk' q£ Vg µ2ðmè4Ó”]ý·ÛöÕù€Tš€P4kšˆ2Åáß”lòÙ)ÅäSkÉ;òéäm¥åäÍçÐuvÉ»S!fĵ¼»x]wË“q%oºn$oÁÝ$o±ý„ð3É[ÊÁ+¥a÷‹Î4_ô¾¿ÂÜrÆþT؆2ýïî݇“úÆ-ß-²þ6Õº¥ä³ðÉGÂØäÓìO’¶r’÷ ÄD”JÞ§B‚kB,ˆ›¼Ï%B¶“wÃRq‘ä“÷»O~Ëò^ÁOÌžøÿÃà‹!üG0L>Õ»ø Ềb߃"š>Pæœh1†2ý¸ A¤:„ŸòÞh \£~#½;@ìAò1Ê9ˆQ b×M>&ò †“cE‡8xÉÇ"";I>ó6±‚×mÊRâË£„Íᣠ^Ë뿜òø™üƒÿKþ€Êó¡Ðå ¾QV7¨ÎÔÊš=€–îðºSÙˆ=Úd¸»„.À®BOJÇ@zy‚…×õ,íÛ.ƒf^ÎŒÏ Ön&©AĽ2³—üÌ[‘òØS«ÉC¾¨Ê“û±×ŸÜ꧇ü °(óúÀVK§6lf¾1Øn÷jÞßýà}€! ûù ÆsP8ã´mdJÜj­ÔaY2²á«;á$l•àÅZøZ†×W¶â ÏB«=Ê|—¹] ]ñ¿5ÆÌ46¶i5n õúÊÕË⩌ϸ”Öâ…º0ˆM }õÓ Uj—)"FC€%; `»Ì `"}XÏ}ÃÖï×¹×f{¬=ƒý¥û”úÈàm3ã‘ÏÏî'¯îÜk8åß®åp› ¯Ø4êÅk·+w.XJÎý>= ™Ê䬀r”ú—qTkU‡a[²ÙøÁÿ—X6ùj$Pj 12l(ô^¨¼`ôŽÞd:” ²„õKˆê‡g‰ÎÜïçŠÝâàU¼‘)´SY”¾: Ê_i¬:¾¸|KÿÁ/Ø¢ãœýÞd{NGûëi«´ðcñ>iEµ[§>ìª$Ë«ÐØRØ}ü™°Mß>Ü:ÜÀÙñÿ°u1V`ÂSQ€×_9€/¾oÇøåö=2˜%CŒÒŸåÑn~o°¢Ï—ãµW)?/©(:g¶Xé”w“ÆQ~~èƒrûÑôŠû[%Öö¤öqBëAì@ï"å*Ûu†èm„¨[-ŸCÿX³x¿¢óœgdž´;oxÔ/ìTþÀZ”¨1HAq­"HSëox¹Ä&Ã+)=jÆDŠíÃK¹¬¢ÍüxÃõ±á\5vÛ{øjO?Á»>ʽѤ²ã†r»GÌ6›šˆq0Ÿ®÷˵³.§½?ÌS«F^«SºÞ¥¿\¬ìM‹=g}ËRv:µþ¸Rú&°2[€#6¬Lç…ƒ4¯з~ÃË4ó˜nµ^LKsÞFÌàX)%“½E±Và–Áj×wwÑ6WÕn›bqôY™aÖW ±šµ™–wŸ2 ô^[û¡èÚåÙlù«eo_ÜëZq†H™µ¥Ô‹µ Ç;3WW]«†1msÆ›¿R#ʤ ¤+Õ H?öUaK­Wi±ƒcr¼è̈³XOªÑmͶÂ^áwÛ˜läucîŸï¯ÍJVÏjÍî®S“>K7Eg–X‡&é&I:C…fíà"Ëv±àXó±’Þ[ê"Ìš1Öì˜M¾ ýJ®`ºzRÛz×Û’3ŸÖ¤ö³oU^¡P¥“IvØž¸=]¿râ» L¸ˆº7/XˆŽ½ÊV<õºëÉW†iÏ\à5|éÕ°í‚÷·GGЬ»-'Èü°ÕòÖÙT¬ÚIl›ÍxÂVi¡ê‰šZéÝøˆÎXœn̰ʹ«ùªÒÑÒ1Õš d¦>ͧRµ_ø÷4a…Ì:Ê!\noûÀGŽÐ^¶a׋׵«{ÉBªº˜£¹Ž/ÚcžÖ¬«ñœ›fÎóÎ|°×{Rã2ãø2Ð ŸŠå¤¤Žr 9™”s¼r2šRßÑøf¼ c£/¶Ç­t¯ùƒ“Æè¹mTGs¡@üÀ§¬J¥€Þædöu*»çÓ¾« AöÁVîrÁú|lV”Òø¸©vº¸È—¶M<è¾ÕôŽ##©Æ÷ÌáAu1ë7Ñ­–ÝnÓ‚gßÕ²:þ(כ߳luÜb¦½Q‡ßŽåEÐÝÈ=¹›–{ú»õESFÉk틊Œ–¢ò/|{ýwrþ¡‡_qTŠͬ>½ÛmKµÖf==¼Ö«9º ] ž 1·ÍÙ•%]·È)` ÇÖD;V§Ú¶wŸO¥³½R Ž ”ë§xߟçèµ)ùí#Ä.£‹%áfEÉÖ³»&fµ!f¯fý‹Ú÷WBÌ.¥Ò/À®yG@¦¨eÏAºyÝÛÊ~—ÇÅÍúÒ|¯VÏ…íyH2Þ}÷'¿Æ7û”’q˰2c1ò:zJï 4a÷RÔC2Ó'ÓQÓQšïd=J¬ð Dç&ùiå#n‘I^^)kÇteY{H´ûï!Á×êÍÚpì3p<[mb8VjÅ_iâö~L_Æç4Îc—s.ÁæXëlüVfãy½qw±ÌŽàÒ³ÏóÆ5ï鱤ãC±¥‰œS'}SšÔomö±y66G´e¹2«)”I“g1`x°Ë™ÁYoÔøx±¼^ß¼a/žDÎ^ï¥k¼^ÿ|,be>¦“â/üëšñ‚?=~ðÃlîžv[o±[kdví½¦·ÜÐiÇ)¿ugޤܽÙo½?ÒršÄVëêI»ö”;ÝåÇÉc4B‹¾.­ÂB‰ÒZ(…à0¬¬ŸþÖŒ°þ³r…­Ïf–æhËÐ8z¾}p´=-sÎ+¬r | ¸äåûTÙ/üHû­Ôo˜÷½ƒ‘ÑV>Mv~‹­Ý>1ôE2† ­’avïôÄu_Z8láꙺʃ·Æ]®ÈÉ«ÙV”²A¢~ÞN>7wИ,v|KZÄÜ;£}8µ‹l*‰(fÐk)Ì€‘cfÀREf­+6[Ë~ôÒÎz¹iá’íAÌœ¥4s ± ²__ÜÖÖ[ö‚õ2G·=»LçÆçæMõLmïiòú ŠØå­ßU™Lîâÿzí&ÜL†Zè-µûv!ׇë9)9 #å]Œi•ºŽ;mjãÞ-€^Ò߼ϒ”:½…ãä†_ãçI†ê÷ôKŸÃ« ™ÙD­7[=é7vÝR¾vÈW¥¨Zm¯ ´}8/ˆgº½ÈTÊmäKmÉ(* r?ø¿ä8cõdhùf©ºéÕ5°§›ôÊDv¤­í?£Ù¤.Çòp RQú"1gvCëÞí…öÝtªÀõÝKÍuÝ^ôùœVµÆ¨;3F§]/¬¨n¹|l3µÞ»Õ/©¥þªò䯩oɘÂÉÁ½T$Qb…Z©Û3û ‡æú|ÝOëÈ[¾«{爌¡½XÌug~±ÔfŸŽü|SêT…PfeÌ/Òú¢ïåÈãOáƒÍËÖ;V"==põ®~áè5.(zZUÛì¨l·xµ’‚,>›òd•o–ºô,G„]5‰5”6[lÛ|¾A8©\ƒÞ2¿¬3äÉo—Äh™OÁœ||}ƒVœi­$c&1'âáŠ<ð.,+®[,3ºN”¼wbž.}d¢î]ª<;/¥‘¢ÞZ£H¡ãr£O˽VÖ¨JdÁnͲÞó“ç"®kï;^o¸ªvé‹Ú½=þÔZÂ4W}þ?ŒÝ‰’¢LÚê+¨‹ÜwT6qAA@QMTP\QQ@îÿ¤õÍLÏé3ĉèx@K‹H’Ì—ì¬'‘«ëÓV×ûÙøAþ¬»õÙîìdîÌÅP*=Oƒ‰•£TCL7w…/Ï2Ó‘®4Gìí34>°IbÝáûD/:HÝí¸bw‡ùÔw¬WÛ7NYü¼>ñZ6­‹V3÷é5—B]l¼.³ßSnciÊîñÚÚݪµõÜkÇǪÛÊ­\©¢T-ûj7½˜zãküµSN·¬%™|´.øc‡]…`<éçRg@ãÚ† 2ÚÆ/ļÝ|†ÝTµ›Ðì »z#ÂŒ}C>ú§‡Ãu;#ë°ä¶ký TÝ©Tsç½W9ÈDT)~‚ZùäŸå¤|šžîåé EÊêœ-]f¦$ üvABÎ+ÝGÝÅaC€ó‘믄Âq¡Œ¢ázÚÏSOŽÆÃîõÇk QkÆ¥Vußß6uŒ´‡ÕüÕœWêaUÊÜ/Ÿâ£,©7¸ ùRiîqÝâ³érÅeX_ÞçTÐkýl>Y@dÞb)/o¾c(OËLž3¹ôcÂøA~ºêKŽ‘6òk§¤é.GÑê,±~ã=¦Þ™ÛÅŒ|§¥XD½Þkì*¿Þ*–ë ¬WR|bR ÛãY±£ÏW#·Ýä?‹Ç1ßËæŸ¹ÍOÁV»Ç¸žcùlƒC—“òÆ4@KãV9 ä\Ÿˆ(QD$ÖYD¬­2¡@guöX?í)v‹4î;o ë1žÒ3õïSž W%šZ‹nÖk§Z–p¸Pl߮ŵ}³y¶^rÛEY¼¦`ù¤°íʲœ7M‘ãKöæ-_ÙfaŸÉ´+ï ¼š4?ý9dj¼ÑD5ûÍ(’õDSó DÓô¿˜Ï›ÙõtTCVœ&T•~>¦EJï¸ö‰¢èF\ÚÕüE©–šƒ{!OG $‡v®5,EMT aâAÎÌ µlØË6s‡~¦]²G0Q[L º5“×Dãõ@ º]ü]ÝãÝ‘DˆîRûï4à=2×±¶]À#ú Ð sŒçËþx É”në|ûäjýλA×ë…÷Ü-ä<Š ü/ çõ¬š½í¥ÌcÿÈÃ+q]„èæð˼ 0¿ Hif—û±ÖBD&ˆvt$­þhË‚êV·€ßaÁ‹ï°àþä/â”^?ãÔ»…qz{½âtÂú¦Ë8N"”ä8qßÕ8™·É8¡W“8a2*€Û—8éåÞ€ Ðò€ø0‹´ °À7ú˜ØžâdPŠø¥¢_úåŸß7ÊÿB»Uÿ&5Ïa¡1 –Æñ7ÚÛ;þ<·1ˆö’?U¬P‰Ž“Û™“ l7Nîð @F߭ܵ,àZŒ“R]€ÚBœ<‰àuŽ“pÎ…8y¡õødJÍÿЊ?¥þ Âô;<4DA «ê+¤ê;°ÌD'q ªë8…çàÛ¿¤üwÎ7~¸ºñgÔºäpB㇔$ø0§P€ã0þŒ @2¾ùäIþ”-Û8Z‰6ÚŠïÕüÒz»ãó/øÿâ_žagºÏz}ç³X5@¬’”Çx[ŽÓO†øæ“m|§üb§øÕŠÓvç§e›òŠÓÊ7Ç\ÕV7N;I?N»m0_^NœaòçHðËo®Já¹³ÆC1ZâaÕðçƒ:ù»èÛx#Þ"“@ºË'« Ô 7 ”·® T€âx}l!1;T~h{6£áÌ"ßÞÃé¿ÇËËäå¿ß³—`ÔŒð’ŸûÏùåöy´×Pá®g›í !’v@ï/íšìŒ…ßXiÝØÍä¿ö@\ñû7ì`PKf÷o JI¦á~‡YGývZR÷§F´KG»÷þ=:½Ž÷ÑóUÁå4”Wö ’MåÙbø#„CêÑ|÷«wr¨Á§¸s›“”£ëhÓɃ»>Ó:]ËaóTõ£ràjÇOU}õœ/ûú_$°Í?’LÝÈ.`¾’,2È~ÓË•$ÃÝ$ã‘È‹áy‰gw6&¶ñx¡ÚîC‹S"Zô(ãsÛ¬=ì†fÏ•+7º5/ûF\J™xpG%ñ4ã)ã¸X]¿ÛËd÷)†Öö™Â¹æ ¦«ªë^‡×uipíטּãIþI&§ðôà}$Ù)™$Ùã|*IöÄtßåM>ŸÞ»'•×8`võËÕE ›³ÄŒ§&Jßm¨ ®}Õg²‡Ø ó*í×ökvÚݳÙÝÐÛŽ’™‡úcwçë·d+áïâfNìËÎÃRJÎ’™6Ìä×D5‡Ùñõƒþ!ÉŒ6 ¸lôæ¾óÁ"òÍ8†X‚L*å׵͗úÍ,ýѸIŒ:)s¥ï¿¯}ñ` -uïŒêko×+\ÐÆ¿º+÷Ú a Þ^ºü¶6Çk› )’›¦º;ËYý k½°{Øô5D-§ñ)[Ùå¡hß‹Ü/Æøƒg‚]Êü!É\Â0Éöሠd~€$ÈaQ ±Ñ‡!Rñ«/ãólB¢¾± AO|¿YØ]/ˆÃÝiзWº¡nîÒÚ Ïéèu­ïЗýÉ•a›éÕò–³¥›V6sÄœ%cÖNú1H¡Õå…VõÁ+§ÝÑ3öUÂî/ªzB‹÷žïÓµÞ׈ç߸KÙ»yåñù´„¦§Ãše"o\ªb;©76Σí=­©+Ù½aSµLÁ6]­ú/fîV¾Åcö¥‹•zfuå:¥UÝŸ´µEyÏ©álè¨g&ZR[|Ü&¶°¹²è塌²YÐ_€C‰<¤P$ÞÇ÷ èÉý ×rí霖^Ç:®Ø:° wë[î}«@KÈY¥li Õ±–µÝŒ9¦±!TdY—ò#m5Ï2Žö ™ƒúÂ;Ú•Èxiìè"-jõE¦zê)›`´üAæî æÜÖAg>&g¿df|0…g%…Mås«ýùC’u* Pšy„øŠ¿\ý ¶9¾çýàŒ4u?*u—îQ)™Û]=9$—ìþð‰‚#¶×¬šQ>’U@!¬öÄ#^}×®ó%¨DV‹4Ö6 ¶iœ”aeñ æ54ó¯8+íâŽ,åù©tSûgiÞ‰`©‰Â™/°øpŸqÉã_@Ké?ëIöYçÜÓßwÙîÏÁäèøpö¤y‡ ®¸•ñy¶mÍæËõG7]Ù®fq3‚tùY,¬Zò§¥ê[ƒZZ ?\ô«øTA¨2ßwPó™ë©+_JñU °×[jö0TlÛé;§¿Ù I»ÿÌ7 VVN¿|_NbÖ™÷~Ïyt8Ž^ÖXîú¼cîs œ—ÝÕ|Í6¡ËNªÜTl´T[›%¦yÑgf!Ñ4ù€©TI«-6 ÞQFט™OüÛx6Õײ,/–š¤H’#ª“±?Õã‡`ÑSH€œ}•gã2èÁNÐïX…ÝäMv E¨|¾$“Ÿ{ÿÅsáÝv}¸îiK-·øt-;ÔºÀÛk/š%s§ëóJàk«ö.\¦¼˜ùA«ZTòŸü-%ÏÈa_Zà„ jµš2%O!0ÆsÇ÷—Áe²‹ ŸñþÑ*Œ‹m‹âŽÑÊâ¦r'ô”~I¾Dà,»¯?ü ¿ PMÇɔNçàíöîè¤ïfAuéÄÆ\¶·R01…n¢ÏÕ‰ª½óª§B¹Ñ}1Ö?s_}äfU^•#º#j¯,35nÏ‘`¿1,Ð{pmy=æëò‘KJ8ºJWlT¿wºÃû²¹ÞÕüÀ'_¢Qý¹Å×—ð ¸çFw¶ÿ:£ªêxüÂÖ·ø3^¬×þô^­ÂÄ™èAþ3ÐôÜg¦BzÑYŒ2ÅËüHGѬ63i¹#J"ÑÃZBzÛüvªô'7áÇ~›T¸s½cn¥ÎaøÀÈÇàU³ Ú ñ~\»,úqÝ~~ܨ&ƒî¬º\ã5Ð <ü‹˜›;q€Íü£Ï<;¶[]ñ+'AÎ {ønËÆES&Ú{§1*ô2¦‹‘zÂÇøêÏêM(©ÂÔÉÓäP(N÷Rç‡Oµ3)p$Ã]²¹Ñè–|¤á#ŒVƒ×íãöã°©WLY¶°¨³™S_d3çñ™eKi̲™×›]Ùt‰†lʧÏ?ü á⵸^§máp@‘¢½}ì©ÕÚi¬V±^›é­y¢Â8N)‡Vu<«¼&ƒ3äJu›Úu4ú› 29@ri<5È&' ErÔÂîýa> ýÄ´ÁUÙ‡TÛa³3÷ÜÃpÍ¯Ý S˜#¦ ÔNÌx¿¾¼/ñÂVóŸ_xw=·xÈõøûÝÚè0®Û#aµ4fð[ÖŒ~qüƒ(óEÎf†7qá5cªäL{«ôÄ»¡÷œðsæ®W2?º¯sÕ¡FÜÛ2´™>sÓÆ,2åä^Žã-¦ÈÎ|zª»oJ^£EªÎž†T½óÜS²¶mJ¥ºlæOº.qw`üê<}»»7–]Ó•UÜÍÕUïååæsåf WêJD– §ëË ÛíÚà Å•7>{Òk‚~Û÷¯˜­‘ìÀ$®Åþºµi°ƒ(³Ü‘0%®;¥«lW£äÀ# íI„ïLžè’6KtG—ÐÆã7¡ÑløütLßÉ–7~üá6¡nçïì@HËÙ¶÷3Ëv©aÌlVUSu*)þÖक?$„áIiNŽã]|Ѳs.0›Î¨A‡Ab¿}‡ØØ]ËF{ãWb„#Õ¢¥+ÅPM¡:&Û£Æâ›ƒíu7]skÜ»P.ƒuXÞf:,{ÙuØ v@GõÙYwˆGg]iÞÿâ¼ÈѾ{öáÇü>CXþâb‰5êâLñáÔÑÛä2® ŸêHËçÈ¡QîŒ]×ú›žµe]B?÷xX™inµNºu6¯ñTO@ïß‘ÕEƒ¾‰u—zÌë—„|M‹!ÏJp7]æ ÝŒœ©wÐEžn祗jÕCÛoވܧ9K®íæìYÍ+=wÐSjÜw5€^¸ý…W¦:;‡ 5p3¥Jf­™Imµ(¤ý¹ÜÙð¼À‘Ë-!¥Ûß®5zþ0ò-/$q?3D²ÆE‚ÉŠz׻Ύ·Ïì|xµ ãÓ֣ؒ»1Þ ¬ê ñÜ ”¤ÑŽím]ŸÔßu²5êd¶¬×Ù¼ÕÌÏøV£íkækóûÜÈΛânõÆWÖrÔ9ª³Öþ*MËt<žXo°~äÚÌE«‚v2IŽšXû0VQü¤îk¸Ø-ÐxO[³ñVm5Z趹Р'Sa£;^‚þ×Ñ«ÔÒJJÖzsJ¨nž«Šv+AÅC?åŠûi.*\o}ªä^ËKù0¤O?Hù@´O±lžÑÅŽÚoôù¬Ì,Ä ÝÆ·3=BÆ”êU˜E‹4Ê«R'îæƒËÁµõ^ËÔ²­C±º}åÚÕáv:¬bÃãì©brÛ®ìÉ¥_)Øþ³|Ê™ò´<¯—.òƒ-É”¨ƒõçXT¦'¬¨ ³b30÷…'³<ž-éXXžhÿ/ÌZ¿ n8µ±¥ˆyK­¾t`ËÉ^‡LçÈöD,"HнÕÚ~õ™k.¹"\c÷£¸|4>q±µó¡|t¿aù(]"c­1yãˆLó”:ZåÒÎÎÍ¥ƒö3·®:H®—4ñ\ÆòùÛòâ¶; †!$¡Þp‡¡sóŠzጺOúôZr6׋¢è’YŒþIÍ­SvØGš¤Ž¥V[–K7ÕAª;eúùAJׯý]è’|˜ËHÕ7¶kç˶«6нÌSè¤n£}—‘£OšÈtéøÙËûfew’ËÖçY2s§=%³(ÎÎp(áyXË)K(šW(j—¯p‡-€«òwñ‡enS³äüMÍ? 1>K¤Oªƒ_jÍJ=yXåÐÒàâýñIòÔ]|c–y¢Åá FÄ]¯‘½ÕílÃæ©Ì2#öÁVVµÙ2[¢QáA‡¨WÅX!D½;ˆF²,DE>øAl× mnh\ :ó‹å3|Ãö'ÍeK\„›gVóqæ¡xü:­ó9þ“ ]7·.D·J}'*Dã-÷ßCWGÅov´S|'ˆµÿ ˆ¦š;@œü•Yžbæi9Š$OdK~0&é8dqùuîÔ3K­\ Ã|Þ¼f`t?ìÅH¥•à3ÃïVšYèÿKý%oC~€Í·Ãemqdýá¢eòßAÁ, µ@¬×7ˆU«A4©H€§þ›ê¿ÄŸ'qŠS¨íš‡ø£f÷ñ'ìãD>žâضnqÜ{&qÌö‹€€ˆã>1˜ µcÐpÜWÀ!|>q<ÄA,Ä2à€Çñ¨È¬ysÍÀ )øäƒþÿ6‡ Ìñø§4}±Ö@˜ìÛûæ`/'3ì'~&Ž:ØèúÝc•Ö`£jjƱFy€ÅpŠQÇR# à €M#Že„ÈS\Á,Á^qqòƒDéòü‰Òõ#R?¢ô™ÍÄTÈþMj.Ïqz[‚@=:‚ƒú,xñ§ãO…}ÅÉÕQ{ÙzœÌ¿eg¼žÄÉ]~÷eÂ9t_'Ÿ{œð­ f› ßZ@’YœL×ûÈiø÷ðí%¯ýè˜yíå ûš—_¿øùg§±yJ êêXîÁKÁѲ`^ÞÀöãø³ÉæâÏ€hÄŸ®ÉÄôÅÇŒRöð9ÅŸ\ç ?€òp9f¤ö.×»Q_fúBîä×! mÂé¡|}Êçvô¸ üX`$ühíëð=œä ÿE ¼ciÛ=ÀtÁKiû¯÷†¥ßÜ8Æfât¿,Åéä܉S¬=·Ö¹GYˆ ¬}2¾9çììºóõš+bëK±Šyçé¼p>É*v?Q9:¶¨èïûêš)¢¬‚ô+6Þ3ë¥ã!£íÍÍñë×nrÂí©Ö~n§Aù±î±û¶2N‚?€¿³9‡$“Ëï’Œ<;'™Ýõ™dô(zû5ô,ž¼—Ü)žÉÜ“bár¸!ÍÓLw‰#Þ³û~—Ð&ÃÚÌ÷)|2ö½Á}ëmÌëÁC¡ðærøíæQ<»ãÇ\e{:ºÔ¶ÚjÎrüõ 9†vœŸÞÛðûw›:•–+׿1vI†Ä=^ÏM²åÃ%Évàg4¶Ç³M±Ç s’ýK©Çå*JææœÛ³c¿æaˆÙq ùuÿ;¦—]O¶ÒÈœmnözµif<Çyl_¾ƒ'¯ÛzÕCc;Þ¶1›Ææ-+=ࢹ]Ù;ó‡Q€7wÝßh7]ˆW½Œ._Îöüïèô]w›dÛÆáuo›;t-n£ÂG ²“úê¤äÚÁš ®·óJ·XAÓ­Ì?seÔœìtÖzwÇÚíLlHufíWæ®±wLløÆ¾òý¿¢FaÖ‚tá1-¯.í„Õδ´æ½ªj9¾-ß²wùr^êuóøàür‡$›½¨pïíƒMFU/§éU>†R<9v”íäÓ¬øƒ¸|~hmgäðè„[6\Sp²™¸X°eT3sò½kLwV?•"~uÅ®³U¹®4emÕgŸÔS-õˆ-É!L,˜‰£*ΫyT¢y™ï’h'ÇùÈ‚ü/‡?$™·ødx8>ô¨i]KÅÊâØÕóü!3<÷‘°n©~o³X›ÕãÎÎL‹é5¬Èà/³¬^íu‹«Qµ¥¶Pª„ª‰hÝJÂ’*T‹’7” ‡{ ²îs.»‚f.SŸý«,‹‰'W"ý,] ù(]]Õÿ®íÿÈÅ>ÆÞ.Ø—`³xƒ†IÞž2ávì »·½Ù}rƒ'ÖNã¢h §Ëð­ƒ^«#wíq ?êË;£K³oV©±j-2K‰RPy8˜s‡±8ó3‚*Ÿ1É‘«Œ ¶"Í6H|`DIÄyt2Õ^®3íêðñËáËþ‹÷ÅýC’e7~د7WSuŸ&¢W˜¹­’³GG£öêØ¤…-7cPÆÊ÷“ºRˆÓNk‡›ËÒjŠï…ƒÐ2\ró±UgþêÈçS@K7ïÈIMè"‹mäiLW4ä f¿öàScŠðë1Ëòl±añ™Ð𿾀ÖÅwá~Ùý!É®Ãó#Rç›K5dVû]1žîä~mäD™)³†¡CÛÂݶ~¹7ú«Ö°7Sõ[/™yï¨ì®ùû|o¿âÙ”Øee¹¥ƒ¶¥¤T§uQ-ô»S!ûBB1‚µ™%Ïê ¼úuì½>ðx¬ïˆqótîX¨¾xã¸ë~Ù}Ùþ!A âíÞãçøJO‹Ä›tÏÓmk–­íÃX£HkÐË^µ67Z5T\Âj(\ö±›mï"_‰åKRÂ>$ª·6ÕÅŠ`¹0Î;vHóÙ×g<Á‚h>.œ>7­uÎ?Èè2Q’QíUo ½¹œ½Qíýr¿ì¾l¿lþIã ¶ö­²½p+ôJp"û9²L1N~_áð°¤RÍag±¹®¾ù1ní«³Ógåȳ•àKx‹¸O£ Ÿu˜å7¤çÛmLr+›mÀUDMÕdž>Tœëa¢õhÐjƒÎä© :üÒû²¨‡õöËæù.œ?„w"ã]})°Ù{o¾½OamŸ÷#+/"ŒÞÐó-•šCùÅàŠáJÞ§‡3©NÏ䯋µÄ—ÒÜO©ëû*ôÖûGI%äq´“Ç¥UæªÅFkÔ@«Ì/àÂ@ëƒ%ºìg} Y»/–ÙªÈlkƒ x8´Ã~Vã¿y†æË»ÔÝòö¯ÒlFã)¸‹m‰gœÝOO[MnÍÅV¸äçBO¯ÍjDÀHÏRVW¦O¡J°å·¾sœŒGÓûXè11'xv4o•ŠÃe5Ó¬ò1Ù7³1ꌌÂfÚø¦‡’bðƒ0nZÊ3œSŸ2œÝ2n˜?j•Þ@i&µõÆÑ÷~¹"šÎ3OL­ñDåôùãÚSéßš v•çI§,µÃIwšx8û‚3uü(¯Ú“Ânäq—^ý2 ˆ\8\>ïé`uõоé›ev½[µ{ÛÃzÐÃ2g™É'±M =êJ·7”:»ˆ@Ýš.Eï ]ºkZ¨$äiý ¿‹_‚-5Þý><Ú5š·Ùšm—§fy#Wò]Œšã†¬ +¨HöO¹)܈š¼‹ÙɡїÇÓKGçê|n3 «Ÿã *\ƒþqã>”~ÿ· ›}Ï‹=ì.4™ÂY`èr°šRµÓV'•ZþD6/K<ùG<Ù©E6×;‡l.-›œûŽõWÿ]ÞîG÷…ºYUÖ3“1ѨwþQ­Ï¬7?UÚ ‘<^ñ)x“ƒòX\¸7[…ügîʰ۽Zýr½>igyˆÏ^î2ø0Å;‹Ñ•3]£ê{š$[›á˜èxKµkâC—ÜÌ¡¤óƒÎ‡ì]RV.9’í®®+Ö_œžšb»âª§:Pc97wL^užÉÂ]áŒ|?$uasuÑqÕ:$£e÷–®&hsŸ ¥Ô_›¼ÈnUNíy·fü%µ§Ïz÷FÝÕ7ù0ˆx)…b7 x—òˆA§w””ö¶òpÛƒÛ,i£ŠÁ¶Ñ£·ÑÒÈn£ÆjzÞ7ùA~¿O¹¶K¦¤Ú£¶ õ0™©ö57™Ÿ›1-ÆÒ¾>ñ×6$ÌAÜg¯ù”åÙbo/¬»½Â;1å4#Óõ,ªS ‰nHµ—ñ }]‹~lÚ`X'kbõ6æ´{ø8’äÖ‘zlÀ%ýZåA7/µŽÖ<'}«yH³yÞ·Œ¿ø}xäX•T3O£ñR‹›ª´ðøÓX~D ®—,×9¥ÞÃúα÷a*«áƒZ´d˜j…A…Ô†5’ˆöCŽ ŠóY×M½ ß¼mynm®s~â|ÃO['*5¯FhÖS‰o,Ø—ÕÀ‘ųzv÷©‡“þ¢®ÁS«®ž£®n:³}$¼aüóJ_œ 5õ¥¹ˆœh =©Ð­úÕõg=š»ç*’æýÒ¹ßJÕEæUªÚZ¼õüZq^Î“ÅÆeÀº«–\Ñ)´óÓKþõ„áüJUšy¢[žäôæä̽çÌÅÔ09“e´õ®¨9j/ÿB_òsãwðüì^ ¥é@xqãFœ0ý])ÄéàšV˜y#xåýŽë1–»W<Š:•j5oŸ'¼¦‡õ;ØñAw×ö̈́›-äPXõ‘C1##“P\#“|CŠ[CŠ»=íUV¤Ñg¶ZäûY±T7²'üKY}Ñÿ : ¶mþk›TÄo*ý7ñ=èç’©kƒfwc· ­[¥ÕiŒ|U þZlî}?g™MuÛïRª¿ýÌ _3ô„£f /ëJzÙû&´Ê,D´—òýêpxB„¸(CÄj2†ØB„;u˜wU "˜¸ÿ åÔÐU1íjÒoÚ{à¸ViÀv§»ÍÍ+ßGHmL@ S.?÷BG‰/Øf.)²Õ{°‡ÞØh~™s¼A w,‚ˆÏ( ‘¹c")‚„ÈÙM€HO´ 2¨™Üsù±z•_YÕ\ÄÅz`_(;¤ð/¤¸Îùò(†påÒgfÖ‡"2ï´ÕjªN¾–Ml¨$§×wžâÔ£Í+RFè3¼|í‘({ˆ*ӈʶïß­”¥°ƒ!ªýÆ ªS(AÔtÙ¨ :‚¨ÐVÿ5tµ@ÿh»š}§‡=gFÈÿk¬*5¡nï?ðG¤*m¸Æ6Ì­Þê¬Ju[­b¶RuGV|ŠiŽ-Q/äy÷L0Þ ’Ø!r•\ÀžÎ_ÿGê¶„2`UÿwÖý޶u—ßim÷ÿhû'Zþ¢ÅÑM…@ªòâ{Ü;þ”3NvŒÇdÇLhÄq9.ï8fÉÜ7Ëîñ8î—ûIÜÀ'¥ `à´à >>D!@Ì*€k'ŽGà ~-7æÎ¯ÿ•œýnå¤l?ë't} º²£UœŒ*Ô]‚ë;€óV²µ‚ƒh;lßô²‚Ã]€xþne°„1¯ ¾3䊀M36sp/¦òñÃéÔI½S޹Ç+ç¹ÇYÞÜý¸mÓ6 i$P5«& ©ß|2Ú4ìâÔ\ßâ”~ÄšWà?êçž×m½ò¸ï;í{x"™ º‘£€jö§7[(78’õëÆ°œ+’:Þ…c÷çóá’¼N§ ªì¨ê?ê¨a«lYÛ›uzç­qÈñ2Úqín»Žý¿H m ØÐ:XÔ `nÀ{Þ>f½íå%,’ËãqšA|lE·õ =‹ë°Ý(^ ¹Fãt>—ºÇ[ïùùË %Þhoq Æœ±7âfO«‡³·ŽÂÐËÒ ÄïÔ®`ÖåmÙ™¬75·b;J.2æáúp½ü.~I`xµNàâPKà½H`emÛ¸¿ÙîB™ŸwÙ˜×ݨ»9Okèñت¼‡wöÖîíá|¶â!m wGz™Úí?Íá®Ø#„d{Êʶ2œyon7õÉãâ(çjâ´V~ÍŽzøÄúHšaÁ g™ý°a˜ˆ–×MD̬þ"ÓqIj'¾ñ.Q‰òè6à¼Ü©Â€ 7ÃOÅ&çkíd¾·—Ùµ‡æ²þîð*<·¢•ýlnpuh±äàt±±Öœ:aÇH§oî„·Ò¼¢X=Á2­Lù¹7³òÃp fäûìàYó«åª*˜¦6»Œõ/+­!ÓÚ_$ð~kü+F³¦kÓ_üÏ­wjÞãâ:m¨]‹t½aq¼=Ÿ:ê¦I“Ûõ!O ¿§§ e;‹õPsØÃ‹†·¥šÆx(Rºo‰½ kÓ•4Ø,µ›ww´ù¤~Q' RÛ5†\­¼ÅÌX@è~õESÖžµüÃò»ø1ÉŒÐõƒXŒf×B4ûï#öβS÷vØ¡²;¢bs£ |o­³ ÉfêÓʾlר[ÚY?j³çêbŠŸUí)!šÒY–ÕçlÙTÛ“úA–zy=\$òYZÐ÷ÔPœvc¯°oû=ßQ½ÆlÏÞùYáÚZÉÇYQý²”§ xñEùC’!RûUƒ05È&9ù¨af?ÈﺻÓäjËm}^Ê;ª~.ÛÖëÖµEflðºÐ+'ÔÖîÜËSCáuU;»×kIÚçtaglAEA˜Ÿ´'3Û'ÙɬØ*ƒÍk¬#]âõM’-6/ÞKøø[’¡MÃÚlùEù2ÿ‹$£76O5›h—Sg#ì ˺%yÔÙ,âEugϘ o‰œ™‡‰†.š«=*’¨jI[ióƒ,ì»à+›3ÌÝ}û=ÏÃ-hVBë9Y¤[5éê0„x7ÈØJ§ÒTk[†éÉQ0(=ÃŽó>o‹ù%ß«f”/ó/³/ò¾OÞœ{·úò´pÞóh¬·÷*íuüT­moŒ~á’Yݨ}IÃßobû…Éb-eˆgÍù¸šìfB!8ɲ¿Kspì&+âú¦8íÚ›&软ÃÛÁiÂgpD V}o‚I2æì€ç…ù `*_~×ä1·^KxcÉ úÛéÓÇØ-—/Œóî~Ú6{mT ?)ƒÚrus‡‰úz÷sKz¡à‹ìp7œï‹;i&Ü,M–ŽêZjr}O\®û×éjG‚jØ®øôÕÀøLPªL†-Š{"7âüùbΕŽ'gtGᨚŒº£ê§,ý `A̾È_¤‘Dÿ‹0 ‡æõ ´¶è·A]§×ÖøÚ¶°­êµg’Ußø;\B QFµJ}^„F¾x /)ý–"ª\ËüA¦:[Ü ññy§uø¬x}O°ù93.L½'¸·ÖHòcv %iØäx{°ôÃ`ОF­A[ÜOoù‹4Xž³â—éžO‡[¹T;áÜónãÑæi«ŒíW4ÔÃK(°žJÕ Ù :•eù ö·µü §I¿k¼ØÖdÞ$WÕ.ãbA|rdðÉœ”*¬TÿAO}Eõß¶/ô‰wFg]»°eÔY‹žLŽôEdpû2ýÃC¿–Íî/d÷ؤGŽ~ž0‡Ø½¬ÊË0‚”Ü€=‹YE­ÄÒ}Öˉ;kM Ùí ½’ÆóH0S&¹gŒ‹µá*GÜÍF0TÒR4PßX¶‘Í ûÁÛ]–‘„qÏ |­‡àø‘Ù½»f¹Ò‘ÁõÒC*“i¯?U~þpgîoÃ7e\ü}ð›Ÿ7ù™ÑÕ^°P^ Èr:«<¢›„×á4.½2BJâu~›éRëqcþ„KœèU5PÆfNÆ.v©7ÐìÛ¹½nOöø) ‡A¡7¨A8à ú Žš¯¦º¤EºxGtѯLi>ߙғ´ÎÓŠü/nîÖÑY&‚Úòû ០½˜j„JyåâÜ/>?.Û×)uîÝøí„K&ž¶-Ž}óÑáÎNÜÝÜt:|¬ÊൻýØÞnØtµ:°kôá*a¸›ŽÑüs×øA¨såÍRÕy{FΞ[—lhk”lH –œm?Ó/y}Ãü—É®%e²ò&UïŸ ¶X½Yæ‰Åvù,Ìjèî#¤çî™Ç þá nüâ.MýycøäLzðL®ŸÈ¦Ü‡ø¹Êf‡C³7Ü 3Þ°gZ0‰’œ~†¼Er•x¤;šh·“iweŒ.AÓPw¥p½îjrº¯ý´aº/ë4!ð$ü/NíÆu±»–ÂÚ~]8³\­ôµÕ§ÑU #+/-ŸÓ„Õ w1æ‡Q«<¿;ä6ü»Ø·ÞÍë|ˆ~ÏÍ|/GsÐ{-2Í]éÖ”…À€…f šà–¸É?µe)ÿâÃü2ÈôóK/˜Ðßÿ]übVscUMEVŽ™+/é³GŸ/jûÎÐàÅR7h˜\µèW+O®Íy,z5&gÚåÉü©îÔDËEzÇÊäÄÍ£ ÈQùB‚}Óü‚ÙË}ëõ =,ƒ" µÑÍm ¥šC6Ì"^ÆÒÉb(ŠÜX‰^Ct€<þæw`úbŸoI²ªu9!w7P-ª´~vÌ”J”šm"Q3ûn/øRc\Ô-ƒ¦UXª†¥2¬ hxXfhhgËãh—¹+çŒt½'$S[Õëp@( ¬ä²2ܗ̳t4šZÙÞ2áÅüªC]gxÞ-ˆ€[{ˆ(N/ÁCˆà+ð7Ÿlëeˆx”IˆÌ{Sˆ¤¹5DNŠOÀµ‘‹ý"×["3 ‘[X‚ÈÕ΃Ètùƒh{½¥½³’¤[q·Ùñp¢ÔxÝ?ÐRÙWîÏb KÏ9xLì‘Ãîéff¯É" "”Î"‚©÷Oò–¬9>DŽ "e:Ð3A%ˆªˆÑ1DDgäD—ÉïÐÕrÿ›ý¯¶×DSØ>þ0‘+î7ñMßÃM·‹~ÖõfÛ`•ý‰L Ù{`Ó¼ ¥¨}‚Û’êý×?!­’ Ø ù®¿¹eˆjŸÿ¤q©õ:‚h¨ür+Uþ=Úöw–~úïimÚö Úæ„™wþ«Q‡hr"üá›…{÷WÿÊ(JŸY[3!ŽQœ´8îµ\ÀîÇlý›°ÕëÿG&´±ð'€}Ü£8æa@/ÿ;ÚÖ_Áà‹#Yü÷@ÛõýŸl¬™ÿÎrðŸµÿŧ<ÒâO¶¥ÄÉö#Å fð Â.0æ ÂÜw>ظ§Þ@Œ˜–¿#‚»ÿ¯LèìÐ]¨ï°àÙà‚]DIlbùlLí»Å(ÌZѺxïGi¤½·µ£÷Ü ÷7º(<—‡Cÿ“ø³T@ ,9Ñ""8¨›1ˆíýû F&stÑoà4ApY柃j"ËùwL/·Ò¢žoZQFð¶ïmùvx.ñååÕÓÇ‹{T“ÐoHÈ¿ÍúóL•FOÐÒUŸÕõÇ}̳ÑáÑØ]÷ÿ'ñç¡«ß|òšùfí>NΛ!ˆÖ€c{’ãX¹ÿçìÿæÁ‹€\‰Ò‘‚¿·¥ ùòj“~è·ú\ȇ²øGñÿEñИü§QŽçUž|ç»pÉXWx¼%Ç)¥Ïßyø ?îòK l¾¸nPÂ8:åíñÊ'¾×±û!<”ãC·ÔÊìU¿à}’IÍëM”¶—)îw ÜÎEi—g  Ç·õ‹’»-‰·ç¦jÍëë‡è³k<Ž{E{›€Ì±;sî/¨ÿž%PÇš€µí  I§.ÖÐjï®}šÝë`Ê´OUéÓçå%†Âž.|TíV6.V¨ø»±ÊÜ·‚A¾7—<o$_Ë;AÙ®:MÙÅ×OòìÛëg¿Yfn;Ų¬zr± ¥•7³n60¿9Ö'eh¤ÎOÐN^¥ãà/Èy‹ ¤Ów±ÝßIÿA\ÝbR;õÂé|ç³~{’Ï{NÅwûY¾¿­”Ò¦NöVN‹ç7ëŽÄû¶ÌnÖ‡±ß?ˆÅl<ØÜ >fö½´j¸E´mäÄ*£ª¯çÆr5}F»UEsR­¾ï´ÕÖIæ–Z·?ZvâÎpÍsì_$0\ž%p‹PÝîbðƒ\ó ¡{ÄÝziŸÖpxOÄͱmhså‰ò:ܳ„mlÀÙèÍW3s šºáFÞF?¤Ûƒ^býëJÜÃU•ƒ mæc˜ú(תêbÇv—¯œÔ_vù­ôƒ,Œ7j/(}óTzëA}¾-߇sTÞ f^]ëagÜcþÀ »¯;F¸m§þqù ð}V:wGäo«çøé,N«È6›fngûæbŒÙgOf˜°ªµ!E›ëS]ÚØvùÎü%An Ó*¿Ü•õf’W2±\Ÿi‡šyÎs2+ 5Mö=ï$ÃeIªF¼%(+Î͸÷…ùA¾ ú ¼7W_üØ:ÏU•m ?A? FTr"I‚ ¢b@1çˆúþ]kµÏ>÷϶ÝRTaÕœ£'ƒæ®2:ÈKàmà3+ÒJ“Ë]{ž¶~Ž×ùó@_Þ_ýÊŒ¨Çvév–Úé®ÝÚnÇŸèêÀׯÔS«Öêj-4ëÐ*­ü»kUF ³Sã´=Ë+eû•²b]\Õ³ºèsÞ¼wvù&éœùŒ=Éjºððæ—¹/î0vñN@íÚ\Ó"ÅÇKµŒý@Q[€‹£×{‡ê$è¯GÖ¶‡"Ö­ÛÝŒò.ÜãíŒu}¨õнBçᶌݣëZ§SèìÉGì ÎumûÇ4¸¿Â™§E;µB“óIÔn4ÁÌÔ"ë2&Gbl@dÐãì‘ÖÕ(~ |ÀÀéjïÉ~q«uÖÞ!?iËQ-ÆjÄ 'TR ãdûìW_“]à'׸3¨^í4÷L£xHI£q¯X´w³3ëÎþdšF¶<›D”À |mÔ|l´¹ù:(;S*iW#²:YÚÏ+ºV¼±ÚÒ ­¼ Ôç'ª-ª¤ZË …xµzí²0?ÐwóÅþÎjñúz/Øè¬ÄèhìžKxÝI²§n;iž1õ£UkëÕÁ£Þ%çÐxcöÙÌñÖÍÉ©ÍÄÏZM~ýöÍq-ièŸÆ0F®ùNW®8{ÒÌUî¥nA¼¨ÖTl´–sU9Wà®ÒÞg. Ù:¡ éqüܬҞ‹Ìôç;Ú÷7ÄôЈW•>;éy:lŒæ¥tó£Õ?Åø¨µRk+É’GЦÄiÍb•ÓôUÝ”ëcÝhh¡«ÏÇ½Ž¶šy¡¿¼™êHá®á±½›rîr yÐzd9Ný4 %{'  ]Kñàä°±0rH½¨¿8 7®µø=eæp;m,,M½b@K÷6H_×­Õ4;ÇÌvnwçƒÅFÙWS8P鹘òEÀÆCæuý-4´5Śꎣ<±ý†wc#¥sÄWõ;!_ê¬ífeÁV¥ñú"H²ÝpÅ鳸§§œ"b%Ý|AK`!&¿ø¾›#”¯¶–RШOq‰fF«…÷w ¡Ð:Ç›·Ð–kçHô†ÖÝ“'Ía]_›“ÁüaÌVϼ¾Øƒˆ¶>çu·}Š*Š‚zƒ žŽÒµŸÝúýŽÓ{®Ÿ YÌÇ4O®¼ÅY],‹ùxÈ F ´„Òz5J›[I(m[éϲmæJÐo6),ÈàöÆåê.r!"GÔ–`‡³½†÷üM)ß®ûÃëGO¦Z+ë~Âf<öÙ;¿Ð—ö¬m87£îÍIEE·k²A,f¼”×ú 74å—>óåL½Û“êñd*ÎÞë°¡Ìм5VinŸNdœ{ÓˆsçÓçæšÛyò? ¾Øî¯Ö <~> lh%¢ûh­!¿§]`–ÍŒüì…‘ÕÑ6½ÉTÝ/.ûÆéVz6Ȇšf c¨H}°qy4W%9[²t)‰¶¨ijWXŽ1¿™Y+¾úê_9,»Ø6á,ñòU&+C&¨ËÐoйÅv–`‰ œ"Êá_ü@ß['fH-3Ä ìOvFã!Ô²uôl=nÙ…Q,,úZ­Awí+1Rz5cU…áU~ONYYÎe`iª— qn8±¸¯*B³X6y§RhqM3q[Ò1KnÕÓË:1(ÍoE…z»`H‹¥ õæÏõƶÍ·n)´þßÌD—ÓLÆ“ß;«9¢sUÐ9SSSš¯æ?æd»}¥gíý:PŒ¤ö‘Ôˆ«{qO±Ôä…æ=®ñ;nOóÈè$rÞí¤²çÞbîâ£Ë°=(¢…auG¯õ'2q•l Ë"™w±È&ïˆÌWÆ8™Ç™»÷0²AMq²Q ±/æúÁÓ'Ü­_ÍÇUXb‹{M©šµYty2æ“Þ¼qÉ[Y>·<Ñà`W¨Âä€w{­6®Î_Ó|Ÿ½’|‰íÞlŒy°m–áü@¦‡×‘IM’‘GAÂ~HªÝ׊0Âê ß­"nEûÝܰížÛÛ-›(¶98¶kë(^I_þÅ ¥ñÏÓ£§« í%wäyu½ä”iNàà¤Wbg¡påz(3ÅçNöÜf™Ò´ÃðôvD¿sX:‰xæÎâÓ,]ne*§ ržcx²(ð œh6¾…‚Þ„ŠÑ ìÌmïµµðãHÛëvŠoÔľ_¢ŒY@ì³J4Ù…\OˆáÄïOR‡Iô±KåÎ@“Xí*]¢‚²c|û 7¸3:_q¤‰g±cE/cÞ.ÄÑ ·åÑÎ;§#w™ôvfká+ÞÕª0« F7« î*Ó+Rù*ÓG+Ó ‚T¦v¾öãìöiÐœš†æ¯A½Õ*<K|YmÔNõw¡´ÍKuÌÞ¶L@Í §…ïz»&J+†]{áj»6¼ G5qòL#¥ZFÁÏÕ¨æÕúaQ¬B>€UbQ*Z&4+…èÀf^ZÂåÅéY¶a©V®î2ZißBv¥½À¥}©„–öˆ–v«Kí/µ´‚G·ª§¬6ÕêÎ >¢ÆªBf=!w‘tû²ú ßôdHˆjGöQ&Ó·ªÑê¥Áp{Ô,צ‘W:4®ƒ’‡óv2öÅs{ò(väL®HR¸Íú|¡×ʧ‘Rża>¹ù°;/æÅ–ó@ÞšæÞK+Ÿç_G,Ï/gÈoŒ†µ/úmfát¦…«î9V·d£‹jø¨ÖÁÝí& ú}ÇHÙGLÂLmô¡7UèV§¡ï–w…Q¤Ž5%ì·j*&4[;)Ì ¤ZÑRí *0&.’ CTËâ°•Ýdñ8kMÏlUõð̾¨´²U}ýÌZÃn:[f×Ç>ž]/| ,=»¿ÐW9ËoöFºÓçÓlÑ EL±Ù¼X#· ËïwGrµx¬0j’‹ª3çó,Ç=×*¤_k3)Y*Wj¶¦öšÀnØ?о…]€ìÆ9#×)7€ÜÃù BOq ò^ò¥WòÍtO•ébyÝqÿB[C–Ûµ±_µÔiÔǸ/LZMn%®Ÿ¿d¨28¹`´Þ^UÕ›3.cÐ0(ðε•S®¶ 6…œ™ÁÝžPË´¡ÔòàԹب·6MoG-Œ ísLšß^šé¹Ð#gÐ+þÐkMñ²úlúÞ úQtRÔZÑòýÀlÆ®#«7K¥e}¡!Üý.(ãRy¢ùi_-Jçy©S½óã>Úý }ûYä‚¥¦Ò<0`ªR`è`0Öc0º˜{ØÌý °¤làv-Ñgvöª4ß­c±õV9­òŒ³ØŠ~·ìÛ¨…ÿÖmKÚ3pÿ[ºýÖËÍ+Àw´!k„R³úÛÛö—=BÔþèÉß'‘Q…ÌŸ‡m@`¢3 °vå·Wð/ƒßIžÎÃMžùÀø#+Ö”ÒçåÈO©¥è“D.d¾’]ŠËÇÝôÿWB™ù·‚õëWMø=‘þ™ Sx»$,žŸ ¿:¼þ…Ç»9ÿxü-^ý%Ô~Åd¥ >m#\OÑJÛ ¾ÒO”¬íÇÂ!ùX8”R̈´qyé¼z)Îý?EÁßúÕö>=—07º<Þz”<Æ¥Cö‘µ’Ò}Zã©{Î[š·9Á oÚu²¹ƒõñºb&‡ïÞÿ‡ß2ív©%O„ÓfÎÓsN3’OýêÖ¯Î-þK÷kI®™Ç[=Jiy×ÙfÞ¾+»’Ϲxï¦ðá­Ø–g×Ù\]ážw¸ØÏÞíRÞ¡³—¥°Ó¹q0 S§Àô7S›žÈeköÝ;ö`>ú’•1“W6V’gO’$ܦ%¬¨?—@Ðúêà)üýCZ·»²ienÚ¡Uø®æ¥U½l逸ÔöÜz¤36^ª§¸ižÈÙµuìÝCb¾Â¿+Ìöc4 гmÿ¹SîU|«½Ôú¶8Z·6ÍlßÝÀS×YoªýiœüÙ$¯NÁH^d,§Ý*1é%@¦`ù´ÉÃÚç‚Ūݛ¶‡—-•›[¯ìæÔÉfOÇ^>û8„eØ¿í|~/òåÝ/!»\·Bnµ’ŽËâÚÁÆê V¬¶d;ËÜ™.nnñ¾`N½ÊÔ¯K WŸ‹Û¥ .Øú¨4ã™Å Ë—ƒ4Ýœ5n0]à•Ý´4Ù¥ãUŠ™¸:ÂNÒ˜“/ ó/$o¬¬$¯SÌ&¯åˆI^£€~Dùõ¨0wq‘#vxÊWd—wLr½Sq…_H}q™Öüy–ÒØr.Ræ$®«ö"† ƒÝìóTð´·6Ï©Ñ{CѦÃQÕİÉ6ù Ú‹ô±ÿ|uÆÄ¨¿>úD>|-}2”HƒD=ÿ°¿øèÉ¢ž¼ùŒøPnîÜ©€åÃ[€}$s÷}}Ý×»5v_ÒJn.žt7njЬÙvÙìÍÎø 8ḽžÇ£[uµ1ƒÛi˜Ådȯ)ð ßV¥}Lùƒ4h¤ÓŸ[ËioÚ™`;Ù R]âÝÃ~„u½Vízštñ¢Rû"y? 5yïëóE[‘ð:ƒ7È«þZÞqf¿HÔñ&í±,‚l§+O&‡.]wZ>be‹†»‰Ž_ 'ÍKwÐØ>‡ý Lûú©²ê­%öÔ³²Î3Ø5úPàæÕî±]a»ø-]/½Û }_FôK•ƒ _ä`Ô^YÄ›ø‡ê¿ð¾¯;¿-3}Z·ÝGa! §çl)ÍwÓ*°žFˆfÍGw×8E8B(¿„û‹ëžìmr±Wõ?~}{E»]"äÂÎUwgzÝÝ´ÕɹÍíïo„Š~¦Ëá^ýáKæý–Vº\³&œ×¬96.W~¡z¡à¿xÌ´ÏÎAM‘¶ÛÚ_Œv~ÖäídÒ) ÛÑ ‰Ž†âp3ÄÌ~Ý/_^÷`ÀòÝö„A:·ªÍ¶Ì–Û|§mø£{àøYnÐñ”Qz9é·´ékë® …ëäÂ&“qì­]±HÌØ­aYg9¿¶ÈÙ jö —Ê/0Ëuù7F³Ò·õ½ª¥nN\Ý! ŸŸ\úX2¿ëÁÜØ ûæœO3ñ õÀf]òlžÚɬýö߯mÙ³gÜËçÏ\K7’º»Ú¼ ·‚dÇñ‹]ûp­lœ!cëœØ‹FÏf¯»-˜IR$LA0U(s‘!;À+Í’ôé±^þ ô ®øÅµ…ô½ÎÄÅDN 7ÌæFÃëö>0TÕCB3ìžï«vû™üñó°ö·Ü½eäÙœkªã2 Ò>†MþSÓ x «K;fó>ðZMöÝë™Cy™@µ6äWrÕg2’ÕÓ!C´…z«k¥U«¯®-ë¡Z «•Ç£¤Vö§ÂÿâBšcsdåtNžØGmrírChÞ¹õܺè< xÐn”ëÍ ªß*ç„Ø­â“ƒÖço›h]ŠV÷ ÍþýI›/LqœW,YÄ•|]!m™b­Ì6i4n¥CÕØgž•Úxå”·•¹)DgTVˆfPü ðA^!ä4,ÿà2K}ußÌÌ.GÕñ`6Í `¿t}·3íUÏS½§ãZñºó9èø2¶®-pcÑoùÑä+.dJ¨ Q»‹ÐmÈê;‘µåp¦kåëÌQmf4öÞq¢œºÏB$ø£n±ÎOV(^Kæóí“̘b ¾øÉÜ‹Ìû‹#XjiK±5¡¦­`TÑq¾wàs‡ïF±§9½žkW'¶Ý–Õ–Åpî É›‹¥)õžCY–}Em…5 öi2í1{CpCS˜'6•öºî×oUwXgZ“•OçŒ\CäΊCê sºÜÐÄ9–rÛuïÖW¤'϶(G…®‚ô]àžíFýЪ¸ÙȺc—Ž –7†^HEu¼Óð‹fO¹tâX¡¡Ì±Þת‰ü\1,V$Xš¸ úQ­O&#ª¤- ¢éüÚo{|e3rní±a>ýdñë Â\z´Ât9yÉt±Rš{q¹hB žÊ~ùbÅgä_Eô#0&‘Í2é*6³«{çèo'Í¡¼èè¥ÐÔTäžÔ•nûfÖû³¬/¿Pi"‹£ÁVŠ²Ë«5΀¨.’¼°„³U¡ìäÞ:Â<·OÓ"µ›õö€é®ƒý¨^o?Ý?(%ê…_EêE–bêŸßÔ Á²4Gå3±P<@ˆ('C †vEðÊØ~kÓJglB¨ÛVQº¦ÖdG’GˆÓ”Œg<"ìm_,<‹sa¹ÐŽ\n=xÛAn9 Ÿ#l»»¥™ëã&3 ö6éA·Ö¥^3¦$,¾Q. ó$”¬Ç$tì%$´ØeÉúó˜ùâ"ëÇ5ðE¼jî~•Ñ6Mëˆwêí¶À`ÓáÂH7³´¯|N“¢!%ŠZš °‡˜¼4ÚÜ¡ÞséI­Ø³—;³@¾˜ÛDÏ3,ä¤ë j‚z{<%ƒsœª‰OæVdDè }ÀWêÄá•FãðÚàp¤ßq8˜dqØî¸ S÷ÓcÁçGõÉ’îcìõã%ð²¯'iý™J©ûgÁ¯óãœ!£ŠÄV}ŽíÌ& ¦wZXôS{ôd§´°ëí¨ :½Rò)?°S*’;R#K¥‘.ãV6´±]ãbÈ’ß¡~vðN3q|ÆÈ¥Åu‘‹€_‘KÉ ¿‘ó…}¡8Þx1¹ßT!\îc6`6^­µe†‰Åokk}Å£y¹úÒ´w6xÄdæÞ·xª®•ßw|씵µ—©ðrɈ%Ì ™|2(90»#A}±æ³Í¨/f+ÊNÏìò`+ãå8ÞG󮇀÷ðLŠ9 à}EðA!Lq¼x8©øðÐðöé àð&–pÎ|ÑQF±ê!™¬ÔœDåW-u~Ô5½[±°Ù§°•ž°´´X¥–Ø$¬ †)Þ Àz’šâÕXŸˆ¾hjAT{UŽ’Ö¸Â>_ DÚ•g‚Œ&Áö[¤\;nÿJãÂS;ëâ¼û»Q{¸0V;˜õòS^¼×Ý~\¿>ØÅl°ÇçàP# pê¥ pqGøßxZ<»^]ˆßš?¾ Þ(øá€øÑ¤ðc|ý…F^º¬¬?Û7½2¹Œ,ò–/0Ân—á}™@F›dÚBüžüUmóýå×(á£'ÿK¼ýUr¦Gžäó€8ÈŸB[Û²¥ØÝb€@{Îÿ:#ô[_$É‚Wþ£(¦›$³b RMÑv“DÊŒR¸»?7ñ•Я3Âÿ§„~ïäÿWýêo[Ûò9ʯBÛY; ‹ì2áWÓûc\ “@Úy›v½œþqÿ3¯Ô“D?ÐDÐígï-ü’ìñ”^ª¯R¬o_÷"÷ÛA¾|¬w‘ô4ëMëOYðmðñmüxëÙø!­sëGÖªîÓªt¿+ûNö6ÇæðM»Ô¸_†fBÇÿòø.@o¾øGñêÓi¥ }昴y=ô>­ýÕ©_¼:ý£ƒï$ßJqCY³NÝ•­!Üæˆ¥Üо¥ÿ@×ѵ¯pÐ÷/[fÖ»ÔÂÅè|.ñ›<7§N®r=‘s?wì•+ü!±;Î!¬%ÃýÛ[…_øÃyø/$ÏiKJž,œ¶K÷ªßÑoVRŒñ?—€i=ÞÊ ÷ÈêËÙ=gí·×¶¹\¶Ôæy>p[ðŒÅS'{®o~d7ú–oüßæ”ý)û¬;;åJv·Z¤+ò¦ (˵ÅÉê KØ [GõåÙZjÿ@§:Rÿ"yeƒê I é˜ B1…Wûvê=×d¹+Ü.)ç[±Og‘ ~Ò¨6‡üºï¥}i³SÎàa[ìÏx¸¾¯Ìúµ:({p…ÍOÅe§t­.nÖ‹X0ˆ›‡8Úˆß]Õ¥Çb<› Íd–›ìÊÓ¹’'¦:ôÄ¿øþ`NžÛl-y*óròL3º$™k÷iáX:ùtHT»²—¶¹¼°Þ 9eåosI.Ïî¢ß:ó9â·ÇÒõÿ@q¶—ÛÌ”gñ8‹ðmªg Z)z!‚çdâ”VÜø`ÃÍ1vØÄ£óP}Œ¨r\Þ®QaØ‹FÿFò2Mò—¨ü¼‘ëºÝM×ý3>qO§ó€8ï³vn»ûãòì4’›Qsñû`TgÓ®JNç±%LKX_šas²ÞQ×Áøˆã1ÞãÑEfw#jÖ¸ûhŸíY1Êê ™£ ê3íÏV¤_ ±|Ïè¿¡^™;ƒÿÂo=YRˆË~|ýþÚiÈr¿vÇÍÉÊ{>Ç 6ô§180¶Sƒò“ݲþ@ããmT]ž1¢ý«0ì__ðÅfÌP\”[aÆ ƒA}“¦{íÎûj2Ù÷–ÂîÞ3Ëh.ØØTk¹»NÇv»¶¯ÏF¦,äL›1¨4d(ÃiÌï'™Üë‹ä]8ñ7órûøï/Jç„>O*ÙÄJÒÌ ÷½?-K­îød˜““koÃ×etDéi rü»Ò/Êo¼gî‹l°åÉz`¿£{hÚîÔõ*£ svãQ§ÃC«ömŒžÚlÅxûÉnûVå|¬†§VÛîü<}»z§÷ú…å<¿ø-{¿{ø®,pÅÅËÛ1½ Jí´{·í¨D×&ÑËñªç8zh{’»²ÎÛÅ¥y;.žMV¼Bf½`Sh”1c¼¨ÒXFE½asšž¯¹-M×û}uµ>.ÔJ­tn8ž•k b%.oš*x#:¥8ÝêçgtùÎ_G“¬°|Ñêt¿¡Q&×<÷Ð\¶´S®™]Tm)4-gÛQNÇ÷X!ÓX"í±`ÊëŒÓJäÁ±—•ÞDX”$;¬ŠÑaJŠ9ü ZmòË„ xÓ æÜæò¸q5F+³ûg½Éî_ò*ÅôÌîOáñ ®V¾X±a:M[Œ ²füVS{óì!t0­ï4y#Pô¸ãQêæbÖ4Ï)í#Ò¨ßÄf«Îl¦¡Ö±ôfw’œ)^¤lD¾ÄFN€„¹.—…⺉óMÈa n«M5®¶JÚ¬Wef,¶¯LÇJ y…4†Ü‚óÍCN¦“uŽLû¦ï¿XfŠ.µçZ%œ;H¶“ ÑM«™Ö­©ÚfÖVêê¶€¤çÒÀ¢5Zïá}R­µ$½“¼%ÉÕ§ëæDlXã•0l‚>x'ü3|¥^*rΠRcoŠfqYW˜ÎlêÑ·W2¡Y™?POðœ£Âý²N…ó]ÃPá?R¡_ÙSÉ‘:PÉÙ}1©:1a.LePÁ@{>stream eå]ð:+¸ˆ T9Tœ¾ëœ˜oö5A¿=~­åCÞ*²éQøÊÙÛq.Õ»°ÇþøÅúÜbÒ…¶ÂPw€¤û"QÏ‘nSbv>$'*¼'ë…)D‚«–DÌênD‚x Aë¹ÿ`G‚õË–”#`Ã…2> ¸òõŽtøöñre_jéª Š¦Vi¾å:ÎpI~5aa.˼ÕxPÜîT•9TR-ö”vY{Ÿ0W\2Ý~ ${£û7+C¥­-Pâp‚’QæÈÿ@$Ô¨˜„ºhöñefµÂ© àeãð²&Žñ2¿;àel±ÃËÅÉ7øÙ/L½ÌÎø\5 Þ³µnš ‹}?}aoš Ÿ›K2p‚Ñ~T?UÐG³Ä›Æ̈¥ó«JóeÈ¡^×zŸ~DIÊnCFóˉTŒ|BÄ"4Û¨âËCŸÁaü¢a¶]é ûCg¶|ø‰œ®[9mä4sÓ99õ-Šî¬3uóÅäžÛ¡Ñ~×:bš¸(‡ÍÍÉnÖÕªBÛTèöXãj—äö½} "¾L}LÖÉi5‡“¹#s¾¥zqãá«æ5Í÷ñ&ÎpøQß`ÛA÷‚9üúÆ"ŠCU9Ç®ŒPÅ£WëY쬚ìç·jèyX54¢^5”Ä]5„ÑM5Ì–×ÕD"6_Œt.ïïmÍ×2ý4¯´éÍaf¨¯n·q²4S5tI0[]š%‡1Bõb™ÐÝNˆÁ^=²õóg Å—E¹´é’AˆP·å¬vï½¶5®€ÞªÏ¥™­Íeµ ì t­¬ÔQçV)ý çx δ.œB[8ï½6p^¿¦ök¸>6_Kò Øè•–Š×æh>ži››ÚU‚XjJ9C¹CÇbhÁPbA%ð„¹¦S¬=ð{®*îïÕJ$€DEX±MŽëcÖªI.°YyéiÛ²),e8SÌ—6Q‹,ÕrW­¸_¤KXËÌ §í¬T8ͯpj VE4ŽÓ¹ˆF›"Ú Ö_ ìs+­V÷’Ó¡¡‹™›83ÕCÄ@–©bS¨(”ÂôQŽ%U½…c{.©!L^(U¢Ç"Wn‚j¾x‰•¢'YxÏNøÂyûÔ~ BÇEÜ…6zùÛ)œæ{ãì!ÏÊÒ+÷W•\3bNÐNíPr×ÐxC@ìèV ñKè=3·9þn§Øi›/z9½5Ú/ZáiyÖ×3Oc6*¢fmö äTý†ò¸mµ(„™Î‘Ê4@àrs<,.í˜{&û4¹œ*éJþ ˆA9p–¨ T‡à,ˆÂ<»ÌŒÏÙ²‚™M¾™æ•k™3€=ŒÔ­^7¦)`Ÿó†À.yo3–ï2ëiíºb[\¿ÇšuiSý5—!íÕçNÑÙ¥¥ ð‘‘;Öâªàâ@–«x©–öØU¹‘S.@9üTÈ­ ´îRÀú&`³½`qUOáú¶Nì ïSÜ;:(€°ôÝÓc `«ÉÀÖC À¢[ú{Óàš"zü@ÖÜ¿ø>—Ñ~,è’¾¶oßjjÁ¯C&œ¿;ĺ™·QZAÕ*Ô×Är­6g =!r2ð/ýŒ_Öé\/û'2®öŽ7­™•»>ð»áuÿnå½t>*»)û?ÐNyPÝ]nPé|±ó`ûW-«“ç¬ä™{úS.¥ òö:È÷xŒ¡[ã>-åÜÛ¼Š ®+Œ™]jýâꌊ‡9Í¥_Ãù;ùaÌüWk¾¶ËuKĶ8™ ƒß´­[¸l 9ca9ö Z>„EÑÜg]´µ“…î÷ýum²¯°8š.;Åx¹¸5ãí‚ÙÅÇyˆ.osþt}Çcòû¨£ýkG6ã;i6¥Yn°6§Ú{çF+y׎šàs0ÙjÀdR[ó±W)mÇØN¸Ž:¨ oíaiÈÜîTr sðÃóÁXÒØr ƒƒä²³Öã/’g”TÓÑ÷ 7}é¼Îx×8¦)'9ÝåZòpåeüpÁ¬ÑI,3ËY®Ÿ9N‹£B2Ù6²ÙñÁÈ?·1ÔFœf|Û3CæRäË4Bþ!5ïí ¤wÐïOå(ê7ÀǦ7×Ê×^ñl炦U`ƒ ö»Î¡³í"áüÜ9êÓsÇ/õNñ•ïª% SPž»¸±Ù¯̇­«ËÙœjIhN¶VØãÅéxxëð‰&çh_y‡@ýÇ–ûùeí°NõJ·P ,vÜ*σÕuÍl§‹ÂÌøêøŽ¹j_žñµÝÁ9ÿ‘0>çú}oT,í¼LØ·"ø²ûêÛõöåä‚IÏâ>wž¼–½N²žéLöÛ¬>ö/?Æ%%|ÞîÍt\&K°ÛW{•¨W6u`]ås×Mä¤sÒ­lº¸…öµ;«µéÇ‚ðƒ çó¥|Ã{­YÛ“h'hEƒqÔR„ìÞ×ÊÛ-VϘc†ßÞ–ëK»Ô7?u`èõoÔÐÕ·åe‹cX\u•ým¶˜ ‹qµÃñ^W¹žÅôc¿ÊôÌ$u÷ëªÕiÇ\ÐÎF䇠¿öÞîììI¯]ÒšJ§ÌÔÊm_wî–«nñE“ÎjdNîköv{ñl- -oÔXY¸´}4;3¶bÞ1Ò1Ùñ>6žòcm ÁýÊú£Å_\qz:]Xd&íôJž´éÅ,¬oj^ÏrîJ÷h—™Îùm£íÛÌæ|A²žìD­VÞØ \ý–‰5[Þ:•}±]¢þ´Ž–µ|¦]l^æÒìê'Ú¼¯_’ÙDËx&~𢰎õIT:ëu{VÔfÇž¡Hl¢.nÊR5zÌâ7lþÅ©OéØê: ÀÙ ão÷,F½Í{Ûê\7CÅÉ#Ê› “jkfßH×>¾ N•)š6ª3Ë¿Øãæ•M:Ž÷æÛ_Mîüz#:™¸VÖ#MÂtheóZÜŒ5­°{ùª‰ãƦãïv½ 6j¹|]ié«¡‚•³‹úi}K3‹úirˆÿâ0yáØâÝPÀè°Ë^ÃÜ št;œîøã-·4“$Üò¡Wqª“&jZM¦Èžbú+×xÞ}Cj#=º“+=Çñm^hÝ ­h¶ßê žçUØÙVöñF6jmLVZ7ͪŸÙhP'—…µ|3ûo¹W±8)i±ýÓ…b½X ‹Þìïæt· îè¼AÀÙñ]Ÿû;ý@í'ŒØ­ùì%9’%¬3ÍÂÍ`y,™|ïŽÒ ‘ôFV0µ¹ÓéhÅãx¨6Åm¬V2ïmÃqŠç‚‰âùX?_¥z'èaò-Yñ2+fM)Œ˜î$ J¼Ç‹òC”)‚ð½+LwBü3jú}$Ú`V½2KûìHÌÉÇÀǕЗ“»åìÈ`uÖsÜLÎ@ÙÒDÑJµáÇW¡ÞÕÆ®Œ´H ÷/Ñ' >¯êÝÒt_§Öç›Ü¯ÞÞÒÓrÒÇ«Ðm0¢üUaÆß|!?!§ü¢¾¼òF®ò¥E·Í­MpÆ­Åçô‹ˆ/µè‹U/ÃÓÝà†³5¸ïÒtmÐZLú¦í7lÁ|Ì{“¢¶(iã®Ú@Ö4¡ø´/×/ñ¢Y§‹—¶Üïæ‡2Gã3é5·’¨9Ÿ Õɪ“ˆõæf»cY(` ɶΗ+½g¹É„ݽµëNjUˆ‹2ëéoÔfë*‹_Xð©ùãiv`ìv»ö‹Kú®«ÆGO6Þ˜ŒYT3Êb¾±œ²ŠßÜëÝþ•û«'½(N•F`¿%eÔYOŒÐg$B`!IJ }üÊ/¹Æ›/üggg»oÜ]R6s2§é5Æ;ø@_ÝC‰°‡C%?ú…«ÐM»“/æ36.O‚ÊìW—þƤyÏi9Ã|Ù9N/¸ ÒØ%…œB4yP0!iD¶+Rfº¡ÓSÐL]ˆÛÕ¦ IF‡_NÝ7“#— gûÏW#+O¶ÕãrÌéiÔ’è³tÜMšaj0Ün)^òòä4É׃›|AñU1D§«ØwFPÜœ¶âÚÓØf×&+݈ZVÝø»ZýÚŒA™/H€”¹Ao!^ÀE¡HHoFmž‡í“ÎÙ‡—ËÕ†D=ˆê„õ2Ý%sVú»´Ç:¹Ý¾é ÍlÊe*¬ÕiòíM4Rº‚™ :kbʲ¡¼4ƒPÎ…1¡¬ 1½ pÎŒfÕÀ,²’íÇòª‹T§™ 'M×:aú}i´¢IMæÓA•iÚÆ¢%<<9ç¹ÚþVa=¡F³xÉVÒÙ4h2T:&ô-É„t/DgÔ ×T81Nu_ä8ÞH°T ˆ†e4ðù~ÝÆK8žÎ–Øêr°Õ­¦a«íi„­¦§1¶êmÒ='âÅí~æ|9ÔóÐ~w7 ç €msLŒT ž9ŒBüšØÈ2Y¾),_’&7Ì¥ØÌÒwÊ)Ò½ûKÇå©&<5,ÖTJ8kt‚.)ßGCœ¥+ýL+ï‰üоã‹f;‡—v³°²„î:®‡º4#ÇAøBŽÞVAŽF;DŽb0BŽDkˆ"þ Eú³t­ì$Üß®Ç/¿ÁÛ±MakßÈ%’Ò8,YZ~jM(±È!ÝèÍPgìA $!'£*QW³Ð¯llG&²Ò>,rb¤C™ßáÜÙ‰Þ”ÁÂ7"mwÎø®†ì±®¿» ýÉî‰ö§8‚jM“L0‘áia Ãs6v;E¤y ä¶Â £FN„JãÈ…pE§/ü ÎKPÉÉ„Ð4$CÙç~áCþ*]zÓ}¹4ņö‰»xfœ luµ)\Y¾ _ †WH”RÃà‰ïùÖ ôÔ ðú Û‹Å3ÙK¦Þ~§Üd† ¶|”õˉ¹€ÐA.îº 7Az ZK›fž æ9 È ØäÚ©Èù…"ÈUáä äè¾ë2Vu³¹ÿAÇF…p:ôt÷R/ɽFCг©È‡{šzb–ÀO÷©¦ì«Ï¤ ¤îpºx¹&V{f¤,1Àq:%æµ°óÎÖ‹† 6CnŒ`³:X¯ZO `îg0ûÍ 0bŸ|ºû¢ÁcR™ÔkGûŸÇ¿^j~ï¹"*4 ¬Gõ•¯š(ÓzîÁ[“A}i ±ô%!ÙßfýŒB ´ àÈ& 8q!®€è€«–Ë€ëlÛ€ëq‚ÍpqIð–7™6×o­PÀ œRò[¸áâðÇüµ>ŸÂœZV;Lc;Õöj¿'E£ É5rƒ2ýbw¢"@*Þ^åô=\1–+Óôäw|éH¾y§ï¥r=9T%ÀÏZà÷«"àŸX 9¯å1B£}B“È$Xè@[>öCB$¸@î@è™=é í¯Óvà±WcEŸ“1YQÍݘ_7—AîÁ~Mʸÿ$ è¨éjð‚Ì©àØ-ÿ•’»—ƒÄÔM"Œ?"®©—€ØŽ@\<:@|kØõH^ùýIo˜g™ó"ŽÞÈxíäLEr¶àYp¯@cÈ’ð‘Zµ–ÃÀãl©šoM0r'1™-®~“/Ò¹L/Ã/³Mt<Ê0áÖ·5=Ù$ó@æm ¥Ãò‰´q­ýñÝ"r È…Zç×é*¯S1P²å Pʇ+Pe ¨lNªvªUïÏ€Z®¥€Ú®@õPG•sXW4 ÆF 7¶µö6êM“G5÷ÅMõHM‡§iFèz¨Í›P}¹à;Öÿ6éŸ ø«ÚòHô×üIß§ßô†ÿ+ÞnsG %ÝhU2 ´óF:ßm]fL»%Û¤kèòîöŸa¶Ú'šàWýªŸ_Ì„nÛ7ñK³¿q¦ÿ?JèŸx„™Ÿà>'(­ô]ßÚì Ýße™¼›ë®úI<øM‰½­nÖ‘»|Sb¿ø:X¿Bí>¤ßÃ?Jè¯LûUB¿øj‹ŸÆÿÞÄÿ'Ìö¯ø›Œ a?ÿ/r`"ÞßÅ•~7«ÂªÜÊ7ks«ÝÐܺÎ2¸âíÜð²ô酜͹öô/gzðDOTWNìDhOÅñôÛ®ßÀ¯VûÉZýxG¡^cEÏ÷¯FkgÿÚA¿Jè×hûuWªuSçwsNmoh-}¾â^úy©œiø\»ãéÓ^#ÈSó-°ÇS^ÂDHŽØáZ´ ya•ö!Q©íÞõf{g†ƒmÌ[4î|pÖD,•¾ºì?,ÙÕÑ™¬Yø £GÂuÐï³:õIÐ-Ôù›µ´µ+Þ°‹ç`×O{Åíý”=<È3e²×VârgîrÛ­u›™˜¹®+Ïó}µ1Îï=¾#K}e§rŠ^ë¬8hÞ˜=¼re¦çÉ›F²{šB™Ø)Eü:Î _üZñéýÛ¼ÿÄ ­äßçÚyŽBT÷ÚBÈì ºÀnf<«¬6ÚÃ\zð¾øƒ,„ETžË›°> sakún…Ý©y ÃI,Gã‰õXÎã™¾ßÆøèz»Èû9&f"6¢W:yT  OÚúÜ};.5hÈü‹k·†|ñóûðxx9è·Z´y]–ô`l¿ºÓ¹zÌW53]øèj5—WóãôÝœ?§¿Fâ™:ÎŒ—æñ˜Õ±©íËS#b×SkèÓ‹òPØëÉ^îîäKv†2?í¿Ã¶Ÿ­[/.¬Ñ:c„`VÎø¾öÝemyø_Hú…‹Ý#8xœëNçW«]W®ÆB˜NÝÏyI¦ ñL¾6ÇÄhDûÒf<<¹ûåàÚ8òñq µëõÝ”܇O¼›ÕCcŒ f6'ø\4ºË²ët‰µßèÔé8ð÷Þuâ³b×>uCèi OKo]‡ˆß ÌbÜR uü…÷ˆ™ÑIçöð 9ï½á#û%o?{Ó‚X+ÇKWF›ü\ž*Eu T«ÿîJn vMª–Ÿâ¤ëâåegãVwúÖ:ûžÚyø\zµýÊ:ÝE$× zY±¥Ë/\ôªÎA3ß#§ŸÕ¯ ûíñ le6êeiÕ³Èø¿ñƒÜÒ—>Ü×àµj>„õ$)Vü¨íx…ºh!xL‰~~Ôfz«ñ]wkÜ¢Vñ¹k·ÕîØ‹°u;ܧ-•­¼Aœ>x),}iŽæü«‰de¸1¹4‰¤‘–û\}þ8êõ¬‘.תë‚_£ºÛiµñä.UfH .¿Y6*]êW¤çµ÷_8ï†ÏôÖÉ·ž³èåÍ£3ÑöBèåܹÎî„â?H‡ |Ä?<#²-u#Á{933™¨Ÿ*M$é;RíÕv\ÏÞ…y­V2·5¯œªM¿û¬²â vÛ½}¶rÅq¡Ò]– å‡8m”µ~jà¼K½e Éo)Å2Y)ÙhÐ+¡³zPBC§ûG›ãËóø~‹«Þs2H¥ðFw;è¾U˜–nx˜gÞ¯oÂÏhcz;“õÊ –ju8W¨zŒâº§¡ÛþA\òú•ëfW”Ül^~<»²n¼ÏeÑ/'_Ïcœ ™’=¸êÅ9DWŠNÜíÙI ¶¶Ýãµ¶â h5.°’RºkåúpçO×Êédn¬š—èÒo{<ªùÒ,™ZoºQÖI´îÞ¼Wms4@Õ $Ìõ ¶ÒK ´ò€žË ¼Õx¶xÍ JEZŒKØÃ]Ëz}_Ì‚èf¯VOø±):CX //YŒž×Ö÷ó´6ËwæÔ;/µUËì]ç³·ùÿ‰¸×ÞT;)t:Ý•®ƒá6=ì6{ºÛ2óGµ‘}DTéÍa÷Bä’™Eå¶ŸßÊÏÕvFÉeÐA8J,¥ ’Y,ïÊåb¶ÙkÚÕ÷¤kSÑah5ÉçÔbvä¦plêçÿ®¿óÝü —á'göKbÞx-ý¦1¬¢±aJë§>Æ¢[FÑ×-¾Ðþƒ¬Úúbyi7¡xã—ì~}–›¥cS®±›te¡ •‡ÎêîŒ%ãT*¾ ïb…¬`öº7f¬Ýb­X¬ð² ÇSýA BQmå¯ér/ß=ÆæC˜,Ìþõ¼7Þ*¸QÚ@ ¨ÒÉéÖæ`èhC©k¥ci¸o^Õ¥TRÕÊ#ÝJ@ùjeŸnÿÁ,ÕZhus¹Íéé¹V³ßz?&N}Ë’”H¢l˜Ti†4nÅÅ 9Úµ ò°šG.øLæ¯õš˜—]Ã| ŽeSO]êÆ{“íQ]ÐÁ˜èñ ³Ñ±Ôè¬ÍƯÔGƒÅRuËUE%³7W©×õPÉåGyB%ÙóMÙs×­?ÈO=yíZshÀBQp©º‡ xÐ(Õ¼9*VôÊ-ë`)$U$–ÌÅÚׇäˆùÆð’jK`†á 7A bŒh­©,×l=~ô]s-mž¹ô4gk™š´TÝGù¨lõÎSi€{V>X¼$s³Ž#ËXO×ÁN¼Õc^¼kÉU,yè·’’´í}!‰®7­Qh¨?”}§C¾»Í2¢«âjŸÔñõI¦èîÖÀò‚û9K•vføÆ˜®zˆnß“7/]E­œ!LuÕ‘D­J¥ºJÞ»e;]?NåÃ*»“yJºIç]?-Iì…{ÉUiÕ¡¾ Ãfê‚!Xž`ZSTJž00ÍæÄÝíSáÄ?o|•Yv’1™ÂÓvå¹ ùÒ|ÐÉØ¹Sç¿ý£©?„/Ok»ã7-‹“@­úùŒJ‰>«4&3UaŠWK>²tUn´–Ìûµ¾Ô¹µÇ’Ô[¬Ä>žºˆêÒLª aHY!ÕLøÂ©Üæ‘¶â¦2IsSúQá¦Ñä&O´Á# Ýä‘Þˆsï8Õ/÷FëvЍ·kGh]¨¤X/VǼpËo3©šúdùÞjåI¼NŽÕŽOJÚ?åc 2ÌQÒ¥m‹R× MI†6ŽØ·OuQcðŽð:j‘0l7Bê:>ò–ryóÈˤ¹’96ØÅ$Ûd+Åù<™Îo –‘“àÑüAØìù”Œ€™ë/ƼA=jX]yӜҪv±nþk¤¶›¨„çûiþ¥Wø^]ãÒòK¹mçwR·å\ÅGª—µÚ*#¼s€†OQÌc%G 2—·Ö±Ç£µkŸ›åˆ ‡·´-»äû–è>2Líiª =8ÖsTœäØI9cûùbŽmõ\sþE߯E÷žuÛJzÞ¬ð˜çjYËL®b5ÃZBI›¦~iÖô6R÷€-Dmu^ æùØ!¼) I¯h‘œ#Mx¿Ÿ5v9#‹¬ëè5–Ìx¦^ ‡LNz¯r^(\sœ%×Ú£•Ì*T0ÏŽ(¥’†(%Ÿ±(E´kTà:u*Èç“g¢Rš%å?2»Y}l›ˆ¦"mœ™üƒÜa_Ù[¥ûèIºÖíð^<ÆV“y%—Éw¶,Ù蜘-³z1õ7‚1¹H¢s‡|YÌqÛŽAŸóÝaž ZgqöòÎ,ÎTFfr=/´%|ƒ,òxmŸ®â´W ÒÍó`šf»Øk?ÉÙÇ„AFC¯Æ¬…Pwvo;½"… &HÅ¿ ŒrG‰WçúÁˆ†åIöâÚÞËÓòúªÊèε™V¸{÷-öþÊ•÷™=ÃÜ:kê!s"Î4“:9³l£´<æØ9 m0AŸ0±b½Ð›bhpÝÓhp£eTéUlä©.šHøÎ=jmPÈÂð™Hp~–¯Cð˜Ã°i2pÞ§*p1.ü~«ÉÙ‡ß'ÞmMÆêá¡ídÑ©kI‚«›RdÕÆ@Kï†æK||cš+øH=ÚÅ ‡ÇEÆÝ•¦é–ð£½A#Æx¹‚Çèrf× Œ”IM³zrÄ tÍÍ¥ôLM•¨Ö¼ÖÕËt¨@ºª—¢ÌK€jz#@9Ë  Ê] PÆÚ?­|Ѥ¢õ¶2–@¿Øm· nꦞ]2¬ÜM Þd„±&6ÄÒàA+Û™˜Ø…}¦ZÝ­Ó|d-P {L(»™A¸­Aí®¯Ý·÷€žÆw@Ï è½M%X*€>°N‚aÐGfž`ûôé“ ès¾ è5>tLã€îñn‚AèF§ûEíš®mÊ8³íÛíѰn¢†hªì$Ë‹y 8²GéÛÊ“HåyÏԌ⻲»=ªÃÝ/äÍ’r÷³È­¢ Èg»àwÀ¤ò)Àd£ `ˆK`€1wUÀä0Áa˜BŒ%Ê€±Ñ`”õ0Ì‚Lö„ ÀþERG°)m†çaAgKum‹’i`"Ÿ-L®k;YÒêL]E<ÊdTMßà4³¸€Æ“ØÓN€ÍYgÀ*ÃW‚ØlÏJ.½¡üÑ“wi°÷–Ø<ž‡)x‚·Ø×´ Øw/ÙZ `/×!`7ýK‚Åãk ®1mow”IdÌ·¦§H+²$๬ÎoY$')7—ô—F~žÅú…!co@•©™ß•´8OÎ×ÀE ¸eÜiH>“âÏñ àõjðÎ6ù£”.à§à¥;àO(ø÷ÚD¥÷RþêÈ€¿u‡€¿/’mûlî‹Ò΂öùq·5ÖØa©+ÆS¥Æ¶Œb‰“mókRÆM˜Cìz+—Ú^IØiö”üàÙ¯tûIo°"j錻Þj@¸fl BvˆBÔ¢OG@<-v@¤,"‰ßÖ€$3 åHRÓ’ܚɾÑ@*úÉËâÆµ• tNFKÒ-äAÜxêvéwmÔÈn^S'­fÞdŠ× ˆzÞ”? Y¯Ô?*òGµõÒô_ŽCï]ÿ£˜Jµ.«ÇñÇÓ»V×@áw ´[P"1”å» ”óîÔÔš*qh•ÜlJí“—ò%y©£ü”^ê5…EGM¯’!Éò!ÓÇe1í!3š­¤<5ÿqtÿº’?ú6å?äÿ™Þðwé´_éÖÞ®:áÎ@#W0Ð:6´ QÉ<`tb~º8úô}] = ËÝ=Е t•·®eF•ЯþùÅ÷å¿›øÇí¿a¶­]‚Ûó«„þ5Ú~WöÊä¿ñ_·­ßH°ìü.G¢Ää¡Í„å=Êhû»¹ªÝn1Á7k27Ô[»×ߘ|þEÁ~µ_×ê¦ôºµ~ÃLÿÈ´ñÕ“¿r¨Cüiíoþî7Ìöë63bÓ©¿‘oÄÚá´WK—;¬Ï·}±¬·®½žÓ’_+Ï óð°ùžä7ͨ&´Ü[¸juT‚ÿ†·àxî´Nk w‡Ó‘ÛLF˜ÑV‡¥¡o¬ñðáU²}óN“=4¹ªM…°ý}p}öÀzmŸ—ƒÖµ« [òC‹½P׿žJÉî •c3t︥6~ÊÔgU”«;Ôg.V[6ûÕqº÷«u©¼«æÐëî™’ë ”šëÍóõ¸TÍØYpê03Ñ‚½z>4â,Ìw(Ú]U*¯ÎfŽߣF -œé–¯’šßÓ™³ÒÌ›ÏB#Þbå¦rÍúfyáþȘ×ÙÔ2gQ2}\ü‡oüE¼šƒIßc×?ïS²_¢lœÔ_U®68V®çÔªÓEù¡®ND,n¥Ø~#ÉyA,Ut™·—qI³]»mY›Ã°bÕ[ëfáºt ^œŽ œ-Íóþ¡z0oüèe×4a<íªj °[Õg¤DÓówÍÔá~©¨ÃMÓþâù>,nÅuÔº·F½¬ïTZ/w*Õל‚…ÚòólœQq±*MaRÂmSÌ”­³M~ò9hŒÎ’.´xHÊŸÇ´™ïXZɼÍ̪ÙóÚíÄT¹qßtÖ±aXÙ­>šwÉôÓÚä’•´´Ü(«ógf¨–‡$¤fÍ«¦¬aÜþÅêYjV$ì¹qî^¿)Å]69ò²„‹Àéòkv~ü ÒDöÅrl-ìªw­íê±,v×]þÐ{^ªŠ°Ù»;„©öÎâ±bË}ÞHuðŠ^¸ ék]mªÕ"-½œ®ÔE¹ªÙ‰*5mÊ+t2WüAäfaÔ“Y4~É,©Òq~²¥ã`cIÇÖ¬ 3‡½5C‘Êu厡ß]Ï‹JŒrn÷¸Âœñyþ(V*ǽµkóB› Çù.îÄf_ô7ÆkŸ “¹%W1}ìÃiÝÊ+9m:Ñ­Ôð g⢺8î«*a¾ÛÊf ]4gò>=<ʬAÒI¬±’Ð;Zb÷mtDy$^Dy¬K b[”»a2ªù…/~¯÷»?ã‡ý¶¶oÙuz¶g+Úµƒ–ð~9)”þ® N3óþ¶GÆp ˆQ–:jê{­´ñ^Ÿ#jåy&TbˆqJÈ) ½Ñóò¾^/Ëž2ó~é4Ø÷$ßÄ'â5Övb`ßÂãHÐBØîçù÷-ëóQïyäó:ø<—/ð‘cÿ…®çcúú>÷ˆ‡´ ³aUO«)CÏR$ÞÆ­à¥mò{4g3ÃÜ’‘ŽV¡†¯o3ÕU°­²ä.J.[ò~ÝJËœ<¢¥Óc+Hþ3$±ÌÅ[Ö®‰J­î Oy?ôº€Qyòùñ†à&˜ sö|ü« v윜pìÉä9L"ÿ‚ÂÌ‘ß Ý ºÍÙ=[po”Ç”æ) ¶pöšWjòÖÈçëSm68U·Öê+õ°3–½Õ`)¥ÕAê ŸäIñæP°ØËYQ9w8áÙ™(Â@:0ƒ+üÈ[|!Sp“j¼à°=teç^g³à­2«q»ÁP˜´bÈW1ÇǃÉT™gž©¦Ï&³Roæð)+»äŠìßö~Ã=îÌÊ€ÕsÅ•…À…v¹$g—ÞêX#?UÉîd(œB_êHÌ@¼M 3Qeà÷.‚‘?!… i¾PÊR<Â795t®èŠ\º>lyJöØlÉ1Õåì”ÛQ$škì"‰>rt•nïsºuehºµ™ôš˜ôá:0¾äßϯ¼Âv=wíå SvC[¤ò½òúbÀ§ÇF] ¹éÇ)„âI÷„s „T>ó…mvÉMþÀ_Õ—a¶M3lvsg˜u#+35Æ(0Ô±åæšæÜϱ06¦ÛE{O é3Lu]'ïÛM™ì7»“„ì{;‚ì—‹y”´ :%Í‹z>¬Z£X÷ªçgIwÒ¹-iµ¢aÊ4jݳž÷¥±Á¦â½ ãuéñȦÝaƒæ€%²ý Së.Ö -ßO?Hn1¯\sn¡9¶Ü&éSvÊÓB÷¨QW%[¢ºÏB“| !°&Þ¶ý""ìÉPÅ-fcRe­•ÎÆhV' ™J@§5¬1z°#ø¹—.ƒÆâªc\-®Y¶Í”Qx´/_á[n+ðL6©‹K”e?··ˆ.ísø6£‚‚µ¡ª!»õ› ›”Ô9š"¨HD4æ Ù%ÕE6žQÝ,–©Î2³Õó–ÉÐe_à«)•¾ËWññÌoy»?˜3ÛbjLK´’†ÿ²é¡ÓÆi 41¡:o¡òôÐGBö!Ú›ÃKàßáHZÁ°ù€I(ÖE ²APüA tôn§Ôš‚¥s¼blR€ˆ)=nˆ¾H€Ê.–Á™É)¼°WꇔÛ/ÛÝ¡c‰œdF;„ЖO’Åöû"R⎭º}á1if´äìgqfÙÃé ßÁÄ,h#ánåÃùÓ6LÍÕÆT!iȸ8M0Úr‹Ý”Ñ;=Ÿ`Óä¾4äz&¸p€\ ª€Œ‚5 ;ËOº)ÙÕ,@Ö„ÂÕžŽ¥*g• =–ŒI)M)‡Ñ úõÆ•¹C®],¯Èác1Íâ;v”>@³z+ë=ıš¼ç°V[}@-:Q‚ÉçnêÖ€zëçÁÐ8›ÀœŠ€Î–:€&RËÓ É–hDiêAïu¨(€:fÉ—¥Q)Læ]ûH±¥üàTnÕÍâ“8}ïo¾Ôº>s§*|¢” •Îy½LNÚ í=—c$µöF®ç†€žÌû€¾ƒQnrˆ»9*<‚œt}€œ%" W iK&‰ Ú.HþÑaò[r½ÑäúE äB1rÞ»r­Ëä\Õ¹”Oévs·Cµ‰µ†ã6±úèɳ(iÔÙ›†›­£oÖ€qÞ{À´>+joÀ–(`^Ø´%V=Z€Õ °¥Û°ŽwlY¤k¼K€5/É6q K=Àæ åGéÅäã¥:1èç#—pµœv0$Ð]ðìö5#h- °ìR”’n·õ@õ3uƒ‹ã5é;ìáž\ïÞ~­À¿ú-tŽ„àòþñôº}pÑ]ÜŠÑÀó¹ AòÓxÁ|ÿÍq8Ö@r}[Þšg¯Ì’ϱÈðxÿºµÊ¡‘M£u¹OÞl¾â]ÔœBBüB8•¾¤Ë8j¢wÆ møOS\þU‘ÿC¼ SIá;Kçþȸ¨ÊAnH@¨ò@ˆ¹ ®~ ˆ"1b~|bÕJtËnVOpî1X&[{KˆýuòÉAæ•à)q˜”¸–\©>Äú"Æ’U¦S£lrZ´ üÄy Ïœ“Ýkkâ·!¿©ÝÏ]itÛ¯åöáðUp¿ÿܯݵO·L-Æ@îJ ¤^(DŠhW€R`c Ôˆd[ÀçÒãF@iæR@ñ¬×Z _¾å:sÙ¨w#n· ºtí5²¹á´ŒÕS^ø®ù«iÿº’¿­ùª¶ÿܶßà†¯tû/¸á¯tûÙ˿Є¯å¶§ß0 UCh]« ´˜_m›M¶ÝÉ"ÐQat ‡Üu §ŸÃÿsÿþ7ÇôûòÏMüßÕ²þ)¡ß”ØùåñÈg¡Ål‚—à¦>²ð7Ö6h>´iàßߥ¸7—³Ñr¯‹›µƒö×K߯¥“—¾â\½TîŸ ¢ –7ÿb¿šèn½_cèµY±þÊ´ßû÷¿"è×"úµ®þó“˜É¯¼B«û=Âà•wØrCk‹ìµ´_ÐWÜ;ò—Êù(Ÿ7ÒÅ8×)û´×‘ʉe›Gá#ö·ºÞ‡äó½{7WÚ.âœÖ×TûÅ7aàëZšÏ@ùzC¿zò?ßê_Ýö{€gÂC=òwsUnÖ o]ñ&Ú?o„÷ø´WÞ‹£ŸÚ¬WkØ?œÙy¯­f÷]DÍÞÛ˜@[Ô¥7ÉD~VËv˜UHK™‹Sùì.„M.˜¹å~öhô×J;}틯aõ{OÿWýŸÖUkQ¢•Jš÷Ï; Ñš:È“£¸×wsçÅuå¡•Vôˆv—ì­/„Å»5ˆGgö¨?ú3íðˆ¦ÿžN¡ZýÍ_eï1>ÎÃcõÈÑÆÙ(#z-×"/—Ýü {X ÃSkþj´_Ãjê(èGùéó?Úø ¸Tö­Ý'£n²©ålµQ±Éâdm—ó«s>ÎÕÛcún¾àI,ñ¸ôã¥9e~ÑÆîó#zÞ—#/Û×ÿ:X§Îàê-jƒ¤{µÃPº‡ýw˜žö#½°ïC£Þ«g£)*˜9Ûjàd“£‹¯OǯWõ÷™KGûÎÆs·õäw>~žkg~½{;³p¹7ÊLÛÒ¥ Ú± êÕQ²ÏVäáÁ`è“Ád0Á* ßÁ¥ ê÷žª¿{è¸ÚIølDvÝÌ„ílª+ù£ŽÒ àï=ÒõÙs¾Ó>uâI[x §V ™–’êW½ª¡ŽþŸm¿-ÜpÆfkí’1ê£ÕÆ3NŽÍD¢×Ú‘ µs—ûAúP¿©ôШ]œäÔuÝôØëÔ‰a×ß×ÇŸ=ŒÇíä„ÍÚÂe½nòb×’—‹ê—‡§§p¸Yl¶ Í,¾‘üö|]ÝkõY­0¨ãûí¾æòó¤RªW»\Ýõzò,hüÃÕÀylk6{jÃòh‹Ÿ…BWоyë>bŸóþ¾zCÛ§æ“l]ý'ç=zOÅÓÞX¡å3Nš|Ü ;Mz tÁuêÁõëøFÕÜ\~V#Þ¶ZçË»ïnS®§då4°åŠolÊåk,ôËA‘9ÅŽwK>ÿ_8žG½ó²5Áú?ȸ:žB#@rÝÕqù-}yi‹M°nÉ×Á¶ù”÷Mh\¾6ÐY ÔñU3]s©.UÝ4‡|•> ewï¯M—½}´ÄÞ¥R^—zù!~Y³¡óØ“šßљξ”\êÞ¥|^"Šñv¤íf®nÏÞïµíœß„]Nµ5;3®¨ÿ°‹Èa:Up¿czw=Õ²m9‹¾šcìé²±¨— —I=SZ,’óB’µ¥{H·•³9}UÄÍ -÷rÂyqΘ¬ì€l”FõR±?knq2¶ŠéÔ´gÏ7©‰Íñ;kuè¼,ʸ…F¬ªÆÞÖóÇôl›ç}ŸøAÌ‹x’þ kº[Ù~EåÞ¬ÞPÚ×`Ÿ “Qý^«][· '•®Š†•Î *’‰NWZ;)=%ƒ¶ð*Ni-¦=—°\üÇìì(–­uacXÔtovZ-0gº?v¬Až¿wf·t¹˜rÆÄŒ~u,è¯_чl®›•LF‡GøO@y~þ„7Ëoøo·¾Î&³$/?v°Z}]+· µqÞG-.ÅrÔ/Yžâ—•>(¦ïù‰MàîÆªùᥰ»Å¯[< ùˆ¼àgXó*r’ÀŽi<Šõ’¦£ºþnŸ=餿ס^å Ùé=¤¡KUrQTñ]k¤,æ¸Æÿb9È Ê²•á§!? G…¥ë‹ï!ÿõþºkuùʴŹüÛî(ß³6“[Û¢«îRðˆs”÷•çܼ.Ƚ©ÊÍx\«)C·;i`J7A‡ù§ªÅWÒÒ0[qÕ9æùj¦GÊŠÀ· ÔÞrýy¢åܰTyf µ¨"q»mR[JÜtÎI-äÀKÞ}ÅÅUç÷æ'§ÜlK\mGž‘ò‹kKi¡¹´¶çxThiX2u#z-ó¦[¦Òªö }Üë#z´Òá0™’L ø©³¢ÎkjæQËrƒQ3¤Tõ‰¡P™§#7j™¦ÌÐv(µ¼h)ñû;ã€îd½ùº'¨• T·Åý¢u~1:RQ@õ2%Òl•?v ¤WZˆz²k˜¼(ðS72ïÂ90žÏ‚g€ó«¦ÃtW+:ÌPŸ s5+UwÊ]ª4Ë;ö…És–”™‘ÁKm¤¨J|ÒÄKéP¥s¦'ô%{þƒê}ㇺ˜áM°Ô¸±Uò¹±=xqãbûUe¿ˆ¤“4ìçbc1~0•ûµ*áxúh±<±0ï'=2LlÐÕ ëlSK7ÇUµü>ú?ˆRƒw}y×xÅrS“6Ò12NRÛm=%Ãb·1ÅEY}1ÂýMÉB?2òü®VøáöÐå!–œr–_?s¨Òl©ï*,®³mf™RïÌJ³,.d“^ù}`qaÃàú²Õ±êµÙ,W>)`oˆã!•®scxË u”otÕEÿØPjn³*7¥†t|uI¨Œ#±»YÏE¹‡ì…þ+}´… øw¥–Ô0|DôIÞ¼.V^:g½x‡™åë@«³lˆG†8ÜÆç¤}Û7sô#}ËÑûu.WGÌ/ju.´Ó~ë­«ù;r)'6ðÇŸüÕ“õXCu)«…vûué¤Ê®x­Uá¾ cfÈ¿çÍ Ÿç‡kºìN\Ü}=8Ûfaì,ë”+ ›ÉfyyR¡¹ú <ÈåŒÛ¸Ñœ}(áÕ(Ñž(Ô¤tsÔéÜÏÑ\f˜ë-e³›|6mº×©H–iþ*œæÝ½ñ>…³¯ž¬lfRWòU«&*î ºµ/óyïÝúA¸øüîr˜EDìÕæ¬³oï™×½0îyúbÈÑËm-šÊ5PK¤NÓ¤[Ü¥F»LŸ­yd©¦:,ñŒ—+Gb ±ñL>K*S‹þA¾A@~Ó)J¸„‰"©µžù`míôøæLUw<ÈÞ éˆJ[«óùÙ¬ÌÙçz‰-SAY5Ã6C¾gýÜ6ºÆ9†‚–ôaÇèVӼѼ|ÖK:¿—ª½YòŽÐÙÛ5ËÄ‹]w£Ã̉”4f !Ogýæd&Wh›E„w6‹(•-äq*;ò ªãOâV}K´µr~³ÍÚ¹¨ü4´¼Óæª>MúKí ¤yï ¦ë\Dfu·\cI:të&6©KQñ©nÚPÒ"œ’÷ö~CöEèL¼zø“ª B˜iŸ"R‹½œµHÔÎ"ÛJ+SbÖ1¾ð¥Ë‚WÄ#‘^÷“ sM–éuËOãÙù’ÄËÏÍ/Ú϶ëÕ¸ƒ 8Ø¡—)œ'üÃ(pèö+|Ë-§:UuÝá‘Ñ`³ÕÐÍ5qÑ¡.ñÁ&5cå&óýáúì}îdÇÏÌ0k ”Y5œMf– /™ÒxóÎàu2ƒWI¿&Z‘®]NÕ4XC¬ùÜ0vXÃQF ÔGô9Ú~äôD»ÆZuk&ƒìÒ‚ŸpÝíÞr±ÚUÓùÞ1ýЋ#h§ìˆÜLêœËCÁŽ;좌6s»©_¥®0æÚ`dgm´`g2 XÅÝj¹‰“T§›®7ÃtŽ]M±ýl1¯Ã]Œ+4 ôŒ¬HÔŸedTt¼2rËB}$XwwˆRgÑ䊱Páp1ápyNÁO “ˆÂåI$pl²±¦:n%ÕœI63£Ò¦q9Þµìd³•ul&ö%c˜Œ0ȵßejk“"»JêØ³œÇ"¾ÊPìÐx•ÐNå⢙j&¤×0¢½¢2Ûü4‰Z-°NÔßcr®¨—úY³žN·ú€fVc@k`覲tß¿zzKzŸ'ÿØ‚ŸVЇãÐÇÖЧBòÆY,ÿõ› {…Æ??°ÝšBvÞpÎI¬QJ3#¾\óÍhþL_‹ƒÏîK¼ L²÷cĸÔ#ÏÀaò£ÈÁÏ!Èrcëè“?X…k;ŸŽ€ÉÒwÀð6Ly†¦M|<ŠÌ°_Ì’o'XÍ3²€s<`ÜL/µL3•Œg‡€qökÀèË•Õ-Ž‘¾$¹»¶~Öp‘œv$Îø®ðÚ¡²²F ý_zòWJžãÿ× œÔ¿2n0~v‹"€ƒ-pdŸ\5­nÔq7Æú ¢íŸ‡ ¼ÑOõ‚O07€Àµ­àÜôû»¨[>=ʪçwT1ÿh³,S ²Tê>€3õÜó)¡qG$uKQqéô§!ñôñG@þº€ ÀÍ4àñaæãéýʸßL‡¯Œ»W   p€¸- lÑI‚á÷ „S"FN€˜& â„ÄŒ±Â%ùG—­ª¯§ªôjL Ü,”¤†Ñ•eråá’NÚ'ø4by,E¿eèO£¾¹ÿ|À_ðx¢üâ?"¾"î?³ë7<¡Dø@š¶?þdÙ2@R(ã¹ ämàùÞL¶=š P°^ (éàüªÔªãmaöÎTIÎÚdú¥ékÇ‘ qàSÛ‹Á$G„bþ4éòI›ÿÓŠ¯vüÏøûÞýún¿ î7¸ác¾ýßíGºU±Õ¨ û4„¤Fím Éã!ÐìÎhŽ´~üIÖÂa²¡UãÖnø½ªÿîßÿëOéíï²^ßd„oFlgÿ×hûM´mPÖ!Ë?µßå½BD)”«’R»G¸Ó¾C®Û»Y[ot1á⊷—‡ËR$Áy£º¹3ÉõÓ>™~Ca¿øÊ¡_­öWtüÈ¡eÚ#‡~ÕѯúÉß5X;A·ù7#¶¸zhqãx‡Ê…ëÍZ—ß×ÒÞ‚/KÎJ_ˆŽEœkw+wÚkb£’rôáŠy&}ç /úõ}H,º»wýÿ ;¨Í¶hp¡6¥W«ô€ð1þ~­«ShP—åÐ;ô)¡¿j³6rrw¨”o¨ë毥mè^ˆ¶ïöJ=øAŽ~*?8È3nüwÉ,x¹Y°ÙÌ„ó~]yŽŽ«zªw]î­ÁkqrúðBXM³sy·`g!{צïŽäN¡þè³ZÖúp¢}#›ýsÿ~øéÔµñnNê÷Ë’Þ^Nl_½yìÞå+´ƒjÌÖ:Üj£ü’ØòüZá´Ù£Næ§ïlOÍ p&± ª4üø.b¼,Àý11ÍŒGuœ[F{×>EìÖ}æ@ ®¾¢IŽÂGÿxý*´¡ö¾¿¿þÕ`VÁÏ_MôÿèɹË7f`Sz÷ù5¯^Tg¦mwáÔ<'ëzYÇ¥çå8&ÆëÛˆžM_»Š _ÿêµeÿúWC¶ÿî…â_ÿêÞîÙУÌŠ¸à mÔu‰öæélê÷w§ÎŒ¥}õü}‡\ýV?Ö¶¯Nf­ë°1ù×€rLVµ§Ti›“ã!Fôd¤}¢¨äƒa‡!_­õßݎ߇ÂVÒ+{è¨1 ¤5ë.K­U—X¶v:Ù8úûFãê³ÇƳ}j÷¡¶pã­kpaZò Q¼Ð”ŠÍwÜj5#û7óéàÞˆ]_kØÛj ;¡“<3»_ü ß ·8­$ç’Ç‹SaZúªµ‘‡½2aÈA g½B8ÀcëlÊz¶C¯]Î÷h_mŸ¼°Ðºv§%ßÚj¡×|Ga§™‡ƒ^šÄQÃNÇ“Ï^›eÝ!Nû:¾Åï5—áê¦íRÕº°×Ü}v]O]ö=NUüBQM0/ýÎt'»Zѵã»'?ÜC‡ô¥³qœíâ³;lÛ „íÁÓžƒs32æ¯Fl-’ÝÏvÙº“¹0µeõ.ÖˆÝ]­ÖÙ»Y¥ÏHÑÝw(×eïT£rêK~Exa9Èã²¶NX<ßWñRäöĤ”§2å´ÛÇÅØ;aE›·¤ÿ®÷\S•[·µ ¢KÎ9# ŠbsÎ9‹zþE½s½s¯oï?÷uI½?m4Zÿ_8NŒÂjá%}ñð¹6…ÎvÔ- qÏ àgµY»Õ¯. …q%d”Yy_Ó×á©¥CñáÜK‘Qøü ÅǰŠL•âi— l´+¾Ë™VpÉ™U€¶§\~Vþ–òè‰hø¤ô}âÖYçBírÏѱ…yûÁNóøL¾æžfÁÅ=ÍI"Dÿ‹ä~¹Àü`R;UÞ.Q-m{zÕ|oWa ýIx~¢½Ò­Ym–¢ŽÝ.vmÐâ 9*|ä¢àŠê>?‹ìkƒý—¿<ô ŸzXnóÙ2¹pt½ôÄ«x×= FÑm|º-çæœ&N›±NÙgmœÉöDN´ßÑ¢hËÏ£=ìÌq;«¯¨? ;gz9Ê•ÛÃ~ïmµEç×s‘}/c|]|}Ðaà v2·,x›m¥€0Ãjž›ylÌ ÉÇpœ+«•wXÝŽ^­E>Üóƒù¸Í®»²_$öªÌ9Z±§d{»‰•5» °‡o¾ag‡±5Íœâ‹_s-…ÄÄKNÑX»í“±ö4,A–ø³ÒáØHã›ñ°V鸕 x´,ÌrË¿QßÍÜîS,ç8(SȱÝLèÕΙºÛÊ çžcÇŽv2W?HöÕ(³hßíÏdò¶GÞ¶3‹ aM8o!7V5í¼kȰl” ·®A“öZ¯”ÇOíó´V\}Mt2[M,]Ðw,ùñˆ¦HZÀ\õéìï¸ZŸÅ Þ¸æ9pG¹E*ÔzVrG>:]²ã;zÙñ²¯ä¶µ¿D¥n;a§kCêqjåæŸ…¨“Yذw“ˆ¼¯±Q+ˆAÏû´¾Ïï’y²Î­_–v å@ŸÍHÌó\U¾î]éº[B1БãÓh%š¹ŒŸ;¨¯êHŠ‘Ñ„ÊÑÍJº4r|È”L`žò«*=÷Îu²ë<«ùzvŽ¥Ä/¬œ ]â¬5 ¹¢…ĪI|”ÈØŒ Cƒ¡ës}¿Ÿîôj÷rÑNïûSk¬éŒ&•,Bö9NU«}]é¾/¾bŒä†<„ÚSøï‹ä®ó¨GŒýƒˆsMŸ‹s tD‚+ÖmVjõÜ’X©ÕÚ ˜Að£ÏJû©Û½»Ùl–­Ùð±S´°õÌ`¿Éáy–Óò>ÔùΩ®}¢§IÉ”áQoÍÜZUï¹½òœvnJ/·þ(&ú@äa“`ä¬l)Ò¤Sq$O¿TÅùJ‰859 «½Œ¿5øíå1á·×õ[ HþCÑFá>öõƒf§ù¤,·Üoa_9a²™9ælÕ±½)R3WßRÑ(W¯ž~6lí¼ õv ªf7*Ê Ì"Å,ïò‡ýÎåá‰ÞÊÙs‘3vå%y“(#!å=)æñ¯‹7[(Þ*%~§{|-¸cp‡8aWTÙKµ1à„C+æ„ùâjÏͺ;˜/ÔÔƒ+½ªØ;_¢G{÷Þ¯NR=ÙÂǪQa¬¢. —Þ¢É×V^ÖSWÌ-ïË#–/Ê™¾]—¦…¨'åˆÙD\„Ë¥XPト¿è»°îë¡dU1~·™ñ|%üšÜñ¨œ(v:l«Ù°ŠÖþ2%1zVJæcŒîp¦Óªf˜û¥ 1÷u#Ó†Û\­ÄÍØâçô~û•jkŸú“í\±Ù1ibQÕEÔû®ë)ý€´dG]éÒtþôÄÅú\ \ UŠ„ÒÜNú}·3~w7|årºð\Å\ýÉÀœØó6«¬¿y¦Ë8×Ö+ÚºÊ1õî"5Öž5æ®7ê[µ3´5st ݧm¯ÊIU&5}ÿ ¹ú*·Ë~]cb•ì?z²ÒüJ?=iú\â¯iÂF)[=ëù|•yî|¨s§æ»Ã5~Ì^gê’|ϪüàÎ<ÎgÀ èøaÿz{l#r©ñêÛ ÜR}AΙ‰ -ŽXnŠU#ÇWÒÏbà³& ZV 9i2u¡ðj¾ç7ÚrqUà²òƒ ÷ù³€t Õ>¢“Ä ~m—8lq¥¤ ð'køÕó¿ˆvþPå}]üUKMßö\¬Cn2ÒÔÃ1Rì‡X•òä (0Ÿ·ÇÞ±¢Í˜S$9ûÔÔ©$þÔ%œs »\½Jm½"ª ëuä‘v‘næ2AôµEô}û ø5 [V€¾­ž9ûw33ªë A_°TOF­PÓ¿ëVgfö …ü”ÕÛCÍ—uqÞ÷ÑÍ*æ«ký|ŽÕ^íØ–=Ÿ«‰”V-rå–cúY/KMû#™}µ4¼òádô:¤»üZðà»°ÝòÐ8FÃrJ‚íB?3£Eóv,3/@"ÁKd±WdÉ]ÒE¿ bº0KpK~G@Š4ò$w!ŽpvŠÖofyí¯µ»Ôÿ Êð³ëHxªñuÑ.²º±õi(§9$±9Z8;í!1NW·‡ÉY@1î/¢< ÔkP×IP™&¸¥›ïk P†ù»’e¼ë€2gk@‰!(ɱ%Ï7€¢Ë0  ‘¢°Î'³’¯-åniЉúJzŸ?Ù›Óö56¹½BÚ¥†y’”(ççë,Ú.•¬ä3}΀¦äIëúØÔwæ&Øû€&¡ %«h{4HðZ:›='X@;2›`ëÚ Z€öÄ= s(hý’´À-’4  ûW룾ªèŸ¨³àŒ.È*Mœ»~…‚âô³‘^Uº\T?5éñ‡,“EnXÄòQm½öàϾåB¨LÛ€^lL@ãd§±X Zª†ë7“»wõäª<L·½ÌìýÌ<¦wÓ÷ó€@½» `†S0­f˜p|Œ·W’Mp.`tÂñË6Ÿõi6÷åÂSWÒN "mÆ'ƒaÿ7!D]Fdqհˤ¢z?Â.ý)f‚f+ÙKÇñ›é+¯C!.UÀ–„6`[ù`ד`/·5àã8qüœÍÐ &à²bpòú×=È)ÍàÔ² 8ÖnÍÝû^xɧÙzjv‡ &Ø+¨‚éÑ—{Êó y“]0#Û‘ëϲ‡]‡L„ ^«& oj P^g’jÖTpB>úÝK­×ýÇ|8 @rÝϪKÀ{ÑðåÍðSâ ø{ É ê>¼`¾R„YÀ¿õà/Vð›Iðwžâq3`®˜µ¦‚©Ù9‹•€¹°ZÞR¤VY`·îfŒŒ2á*ØØôdÿ©Èè®ÿ±×=ñáOÄÞʈ|å DŸùõôöhˆ‡Š$øe‰-–Ä%Û‘¸ñH|È ×ô" “â}ñѹ¦öº^Vt½¢S©ðÊ=5éIã|ñ‚· ë2”mò„ :Í?E¥õ¤UøõÇ?‘À©x›æ8¤æÛ4Çá? î?ž× ùÔÎ…E T£PjÜ6Á)”B]ýÍUòMð÷BŽãK@q[] hG(œ)š’Z6”¹íð‚\5pË!Q“7šò *^Öôä´$—ƒþqÿk¹EÍß»òÏy›Ê¥é ÿ“œð_âmTšH´¶˜ÎAÒ^ÝöF’¾;ç.,'@·öÐíä¶×‹·ÐCžz ´‘Ðs‰+÷u`K‘¬…ýìeÀÿÓ“ÿ4í´¨4 8U‘ÿ's÷Oºý7x÷¿‚þ[ºýuÛ¦âmš—ð¾]€YkÃÀìZÒñp `¾‘=°p„AV€%q`ÉDò£ÂVþãZMm¡úý6µ®¦‹z¥ÉýFºZ2NPÜýÇh‹€Yâ? [õ/ÖÖZï5&@á…pù™;`ÿŪ“;ݵ7iF쵑9c—«¿ .ÊÚž¥ÂìI³aS94]wêï%þÿ{œiúNZí¯¼ü—ŒfÄ»©¼œÌ¤åÝsFá§GáøºÝK×ãóVy.Þ?Èõd.3Wq´D/´$ÏÃõ¤: ¨«ysÜa&Åá~©£Ñ.âl[EÖïMƒ¬ëky]H#Ҙ馰R9ô½Äÿó Ì*ö‚òOò±¤·ìƒ¨¾µ{éÂx7®‹ÿ9ЬÇL9:ä.fwOtñþŽ|F[nrœlÈq±ŽˆõfõwÇ•~¸Ü—ÖåòùAÎ#Ææ3“fKDZgÄìØ˜†øá>¥7e&U‘Sgm¾šºV{>n=þ×ñü{“¿þ|mÎú¬s8:;ñ¸_ŠßëvoΞéjYgha|¥ïšôâÛÈóó™&ˆ³¥…+3bŒÓFìÉ>xnÆdÊ9ºVÙæH9kýaW..½yì‡OßÍÈlšIµžÅ»´¤_Ýr-ÞSk»*¹û_âOíµ©1ô8&ý?ëj:Áj~K³B¼¬LC°lMöÞu8áßÅ(b–ëaW˜qkvùó¯:ïnÒ¿ôfÙèÛó3“d"•›]b9g;!¹’:ôömµ«SˆN ·‰·Á¸ißcó1èâÍnvZþ_©«õïò2¬»ä¨ŸZW¯'-³Ihý Iy„3ÝXsat-ÉAÜh±ý±æð½™å¨Ý¥ëØÝ®ç;›|¿ÒÞ—ZèT­´#ñ\é·"¹2n>:¥YSK«F<¨ï6hëc¯ó¨C‹¨%_šüUG·œ\ Ø’WÙ$¿S ¥üªBßkÌ¿ÖÕÿBÕð+©Iy_¸Üš ç©VÛÿF»O7ÈÄ×6· ¯­kÝx4‘ônêÏ,òƒ4fžjXŸ¶Xw¡¦Vó±²U]Ën5 Ú…ʦÒ,UBnX+ï½f¹*­z᩽‡âë¼,]̹¤÷SìzCªh ˜ ‚j9 ›À¦ë\ỿÛ?HúGŠÀf2Ù“µ< ßêÆEI¯ªµQƒ›fWñfõ±½ÕÐEgV%6•e%dê»ò¾Ö¿–¹Ë4O­Tºv7X)2®tñ1¼òE#sMúÊ žÆz0ðÑlá»Bs…qQ ÐÎjä}®ÔÏ£§õÊdäæ÷ š õ»š y=Gö÷ýXo?np)’ü¦Ñ4«“êf+÷üÃ)Ój#êñ©ÃÅÌ´²Y£r•w+aCVë%%&£bׯºÁÀƒGH˸`ì ÐÆ¾ägaðÌ£‡àã/kMØ'.5,·iõè\¨¬DoßÝj^Õx;îiD݆$sç:›Íœ(Ï]cÙn(šÙn9?Í'ðà?t+e$•Ã΋šƒï«ŽðµMYp•Añ•Lß‚,1)&°+@«{>ïS÷’¿¬Ü«?ˆOœ>Q.”‘·ïàS‹ñ¥{;·a›gç:1ïNäåßŽŠ´àìc1%³±ìx‹˜¶Íjk\o¶,W ºUæ¬C2¦ï‹u½‰™µä®4±|ûþ}Êænwô‘åßÊÇún^´2ƒN~áÎ+>ÕBò¹òtêz‡e.ë$'çñç»’…h#Ö5*t³=¸>Îóþ ӭm_Žç$¹‰^kârÀ‚ç"jÎkÎÄ.}ÍXµ>yƒ‚³-½œŸÌu–Úas`´ZySÑ}ºÓ_ˆÿŨ£aV[¤7h­Ð—RçY™P[MÎK®2ʆnkÐÏ9°²¯ÚR˾„¥™}~N®ý6y;ëŸÊÖäümY^‹î›ó=6ó3geâ~io¬±ÎՠУXßQ'Xg»­ ]Ñ„aÝS[Ô=‘•{Õœ)~{“_­,%÷U¿*÷½Ü>Áô!÷µþ]~µÓš͸èÕ*5<ã=ñéç»åFRÊ4dzõÆ´¦{W±r<,XÞ[5Ì…ÌÛ¿ªõÔÎ%Ô/ë»Fµ©W¤A/™Óì'Úq¯4ùîÕË’¾ª­Fá«Üo Lѵ1'Ç(aËVP(K£ín(Aœ|§§ &¢òª ¢Îi-æÆÖ-Å"N¯Î­WxkjÃå°L ÌCÓ¯c¯±ž7³oéR²a‚pÍå¬k›"&¥ÛA0hm.é•þÖÐNÄÍÕÄðYP¯_S•>ßR–ÝWºDc¦è›ñæ‘Ìì([ÏïK[$$9_ŸgáXÑÃ7±ÐˆëkχZæéØsy‹–<ý~\øÐ„®):Uï(Õ–ß(|ïoíñÈU÷µ†=ÑFÅ䈭”Ø5˜¦kè¼w“µF¡Ìiâ×ãÔÈ­iÊc^³Cèåäø² eÛ9×eƒŽ4>HcÉ­¹Kqv ö¢ßêÞ„”Lùƒ9Fò[ÜVx¦4ð¹ê“îü ßmÙÆW̰Ò±YiªÎÌ.lã¾¼°gùtmK…¾X-ÃÝoÌ/»\Í ‡ŽÉçÖ¼ß*ecéh磫·úJVÕ(Ë)F/C˃%ÉÀaõdëîå¬WóÑ×*"6ì5…UñЊÔ{*{f×yõÌ3ïÆ›«eç{ž¾E¶éûs[í[ŒFë+ºW]¿iSèë´)Æt¯žéç²ú‡¤Õc,¾Âìwa¾m½æÂf3²P7‹c'ÐkãÞbXWzQS’‡5–“&Å5%Î; NL¦аZ~,¢2¿½Ë%¾Üñê<«×:\mÙqB°]þ ì…|X¹B>˜»^Fm0çé~ÎÒæ4j$C ´ 2ÅVLNéœJN™Þ(Ùžt¢²ûL oî¹™.¼Cdœ_C•Ûþò©djFùÉ´V¦á$w寔,gçyIB²wVÄsJ %š/ßZwô:WGYNX\òlKü”YùF5™{[ë1¯6ctd¾£û…ó¶H6CÚe–ʼ¶™³¥*‰‚M2O& 9뉯W„¯“^ƒÀ?Ï#±¨c§ D¾²¥>z{¥¦oÇ‚Þ} ?ÞkzÝD j'8òg|Ð¥nJº²fùŠä\Ý#pör´6y$½Ó;£»—Ž™i‘îŽ5Úª}ÚÔèK(gœ]QÛ>“¹ùêM,‰ A®Mߨï2N÷à V¹^¯מñ×ùt±ÊcuÄöôöˆÓN²­büûžEѽG®^äÖYÇØöLZÜÕ´Ö0.(ýš•!x®‹…’ ñ»Óˆe¯,G2óÓqéJÓÖã+Rc#V(çl Z[>9+•BÒWFMbÙ]ôˆÀxý1â#ìñ°T~aûýê5VAO—^mDÒ•ÔÓ ‰êU‰ë*ñ“*a½#Ú0†Ç*\*@‘üÝSÊñÊÎ '½TöVòµ “•Ð|/¹_„Ò—’¦«Î2>Mу։ \?ÂI¿9àˆUf,%MØL÷Ü)‹‡§ogš\;d m¬–éÑsn½F›~C¥U FnÅ»„´éb~VŸ}¸'4N?l$ƒllKu¸Gy;ø™mžµÙ>••üÏ—®ì-5}[Ä´ÜM…o%îl 24a‘X×t¾Ê}$6*W8úM4åÎf‰  /ë*‰%2þAÏ7CB›m_O0pQÙ»–;Š6öÒ ZÐZÂ/òx†{;@®ÎBÙÆË2r3ÊxU°óóÎ Â7Ì âzžñêX;–Êó¹ÇoFDv5&ƒzÝTø–¿ñ¸ aìa©fpÁKfº¯OM\ˆ!±÷€ÄËĆ#÷6É":ˆðk!©p¿àÚÐgøÐ(ì–!‡ÙG™i-ý ™œ¨lÀ"ªÜþÜ£•t€Çl-Ás ðóøåüz\|KR³Uñ¢Õôbûs¡Ÿ%¹ûß²÷vy¾ë©4ÿƒÐY1'ùnÌâå{HbB¬Èýpÿ…q³>ó´;1lÊ ¶ FX>_K°ìbL¯±=± @LÖ& ¦µ& fÆsæ÷}d¢oU1ÈÑè=Sä·ÚrÞÒÙ"×ü\»µ©®2T¬š”Q 0—›Ë¶›Éx9|­Ur¡ê"^É.YôŠ4Ò%% xÁø›¤Ñæ’½þVNpÓYã@ö¥û& ûÜ(AgÈ'hQ€ ÙÏ6 [³ £ˆd¹_då|O¶"@)rͨ²^ žŒÃžÿ š¦Q=%åÂwó±õèÏ”µÈŦ¯á{A”Ñkg# ÝAÄÃv2qËäñ' (hËŠe@©ª(7È*çÅ@M¬N‚Ñ PSäwvjZûj†p &9@̓> úâ PZT“mª$¿Rº1€r´Û̯µö “~ñÁBí#Â@Ê¿Å/n‰éŸç>…ð,¾Ÿ· ô¦ˆÚ¯žŒÆ*4Ùd°%PWI4á+€»& ­“è*zœ?zÙj:~ƒemÁó; ?’`’|âk|Ç€¾߀¾¯u@ï·¿j½à @÷Çz ¢©¯¹;|ϺÂc+yºþ „Ên±l”)¿Ó+à‡2â¡íQ' ªŽ ¡à›TSˆ4@O`8ÔLNüMƒÐs€™¶J¿zònW,„w«d‡€uz ÀFð °ãð“ 9ì¤j¶Õ¬W€íŽÀÖÚ` Ñ °YHü'˜í¥“[Ð7Õϵ¸™Ý“»’SP›†?v?JÍÚ©³<¦/… Iårÿ­'geÀŽdW­ 8<ÛœYn.ßë®÷œî¨n4N€÷âðOpýMjå»…à{Hðµùðõ6x; Ÿ­ì¯flÀÃÛn‚çк’FtÈØâ°ååìqJO=¨OpU#B»ísv¯å:Ø~êŸ?ù·_=9U‘Sñ¶¬Î?ñÿ˜oÉñæ«Ü€ðî|h|q Örçwˆ‹rˆKr ÄÁò Äf¤±Ôê1l?¨­œ_¥—û®ÓôSiT™b§§PGfÌÝWÄ ƒž£<­ãÿÖ“«ù“’SpjþóþŽ^ÿˆ¥in‚JdÒô†ÿÄ'üy^m\ò – †•t‡@Á•3?ä_¯SÈÛáÈ äî²ä¾|Op¡´þâ‹K!Ùwþ}§¨¢vÆ’Å.Åf#qjÒoÞñïù+*õ§*rªÛ¦Úqj¹M‘š\Óà†¥Ûtý´tÕ´?Õv\š¥÷Ö¿l×JÔІš ´\Z€Ö&D Uð&Ъv ´Z`+Ø„fù»¡âtaœÍàÑnòA¼²g8¨ÿ‰;UmÓ’~MÈòtnüOzCZÀÿ2þ¦âmê»eÖ[nÓuʆµ 0qæLaËÓŠ|`• 0›Å/0[5˜ãî˜Ûîïy1wÓÜÿ¡Ü¥6ÖÔh›f#¤ÖUÂMP©$¸ôþ³Yj´=¿âØeá^ò ·'ÄÖ¼§¼ÆxÏxA¥^ö9£Wùß,‚ê6|ÍUý^ºßz·Jüž]òp‰Pÿ{~mçWN4ö{©í­«Óò©úÿ°®þ³¨×¿k¥é…£flMÃ,f%ÛYÝ7bk«<ãµþQ.—«£<ΟŽÏúЧŠÇ1‡G¨Áóû¥†)»Ò¶·Ü 6âÚˆÖÊ~¿ÿAV]a/¤RrªÖ¦RrZ^*‡¦Ñÿ[¡¯1<þ<ÑR¹—Î2zã:s=éEõrµËÙS\`½#T=æ÷…{+øA¶{[)nNWY_ Pm­l ÖªK;Ëÿ,¾ÍxºpÐzž{CÇY!žÓMÎE'û !L¸”‹§×ftm.Бrï C=Ö¡4pµPßk‡>EÇÿÖ“ÿ–¡ú}“?u‡flw²ÝÏñ¦‘ÙÎ×Êr¾]u“󵰇׊zßÙÒ,AÓ“Ã&{_''ÜJaÆâŽæGGHÃGƒÐ†úNúýÁ@ýþ·o•ûηÒîùpgÒ]æïÇ.±±2E¬¤fš& ¤•ýYW•Oo‘j¢ÿZW/ʨ2Oêò*ËýÍΖ:£Méñ;Ù˸³£kiU)ûsuø¨au?ôûN¼÷|0™w—ÞdÝ%Ã]'¹¨Ní}Ø»¶«Ìüjóo$^vh+RîLóÑC”¦þ1½ÆÀi×êßÙ{RwñÆãç7wu餫uhÛ꥾Õê²NG•Mkßx•Õùûèx!ýü¬ðzJ©ÔØ«Ówwé8ßÎÆ7àö¾(ámngsÑ©RU#ñÙ-åÖÈ5»Z#øUG­ ¬ÇA­>v«­:4¯vk>ªËRuZ èÁº²©ÎŽú|}•« ‰†§®/†â{é•®#§SŠ\/.©ˆgý—kUE†ùb·PÌNnö›l¼¨û“½›gSµ¶³É-Ï‘x¸­q×\ÔÇYvS›å}ÍG…kuhq5 KpeS®å}½À”¹kAOQ] ÅgÅ(]{­lIù´rÅÇhT,Тöƒ×l™Æ%mW€öÍW~VËPyôR´üe$uü@ 2þ²Ã)ÿ ©I99¿5®õ*¯T«mXÉ §†.Äv%¤ÇõðÔ Z?HéÚ±;%%¶ÅÇ :/ ± âÉìØÈì^fqÁ%™ü,< yŸ¹‘yô8?äWÆÈ…ªäzûž[òªæ rO£xî6ÜÜÕ¹Î÷˜s]t²?ˆ‡µ‡p‚-þ/Rá{0°‰LtÚÚ‡:LîFåý¬[/EÚ¼PÔ¿¦Wø&íJZ}‚¼O½BYyÕü€ÇÛ¹M“äBY›yû޶úu¨êÞÞ= ²'·aﮚo'òZGE¦xö±¸pYƒÌhv¼5s¶Í¶ëÖ÷O-W ¯tÇH zpe zjǽø®:§¢r—U>É5–¥çÛr-ûÁûø®äç5Ö÷ƒ{ÝÊ…õ‡ìí£¥êqÏ¥é6Ì亽Ž6y'reG…¡F¶›‡ÚY§ö DOl›V–Öwïì¬q5é såaΚcðƒ˜¾ü e—ŒÀ¨xúfxlè¡ã-tz¾´ý|¥hûÅw¨UƒÒAÛ/[ÇC“ƹÖlUª’Yû™F”ÏÊ%ïȵWcÝÑ̪”}ŽÔß@º{L²ãåJ´mr¥ZãòÖ²\ö™³ \4} ®˜èiˉÝ3/ë›cc©‡õñ^gÄÓM«N0 ñžO«Å@S¥€.)ѶÞWÔ ~”ŸÜ…úAäî®Ë=|¹”{Âc+?ëÐ.™ÃÖ©ÆH´¯á%ªL 9 k¤~ÚT¦µGŽ/[Sðb·)s¾­1æ¼ÜLÿU–Œ•UÖ rÓsô2ÓóuæùûFªvèÝêZÍ‚;êyCÕf¨ÎU™ vJ»]ÍÜåÞ&eÓ 4ix¸–¤Œh ÄÉõr­NŠˆ>¯‰ˆ_]%ˆ6¢×ín:ü‹Õ ÆöXŒq:™'ûøPw•ÆÈ·GŸ½i.Þ¤d¬·CVßõB¯à/T/¯?¤Îº§ÕæQ½àˆ¦6/š£Ê­|Ai?ò¡¢u› ùå¯zr»M¤O ^K#E=K™®ÿ ¢÷âÂ"û”|fçùµêòÔÚÙsÂ¹Š–­q,¸]‡\òÔŽYF­jWöTó8÷ë0Ç]ÚµìÀ+ä,tFH¾%íTðõªÜqµÕíÀ?H2S+@Ê}Ø"•ŽÜbä×t$É:Õ¥Ï)¹{FÍLAÊÜ‘²8íM1—Ë÷…Ų< Ád˯·ç_êh0·‹ÛÇÙo­OýsE¯k¦µ#ŒRÚ%ý ÓÚ gÌ•XÍY±p^4)SOò®€Æã{}xÕÔök’|hè<»Õ(di¥ë¯q9nàt‚'}u‘œAH­sbnbÉ"Z®[BáXw¨~c]j|2mnïQ#®Êæ×ì©Þ<³ ñ˜k[`åÕËÒ]kPñ$Z&;CÙX©@ òÙ ÏË3:gæ  MRö· ì;Ý7[ùA,CxúAVuõ&6…?ÖnöqÉM.^ Z?"z]aÅ„@<4æ¿Ï´Æí7ŠÍU£Rž==+!Û蚬”¿˜hƒ,54t÷Ð|ÿ Ô[8’”i&ÔCtûöœ˜}ã1Ï(ybeF¤;2gäø’Õ1bó-ž»M®úâ»Ù¡ô)›Eúë¥z²òŒŠ‚lŸ”w ˜ˆ5 HÆ£ä9Ƈó\Ì„áøVD°geÀ°Mè$37ÿj0mìë0êE èg+W£G¥C½gë)5Ì#{ ¬µ'éÑœ˜×2:]Êe¼¨‚)N>g1¶í_=œŒw¿k£¹×„Àö쬺…«ïÀ½ÔWi:‡=i_ÊFÙß»jÒVkòû™$O^P"[¿öîP+¼Ùóˆ{±2$¦]µ1úy6Hº7 yÚÌvUê“Y&sj¸‹óT¶JWÈÉYl‘^³4"™é†Às÷¾Æ§Šk+ïµ=ò«1Z»T_hm3sÑZò¸ÂØà2Åʃû´Â¯ùW!¯Vn»uëXóã4Ôk«Yr©Zá¦ÉåÅ|§O ”D£Üá9˰͑þf´ÊãI÷âÇ›ú1„Êî`œÊtx†ôbI$‘«‹ r‰¹,âëò©Ž—8´‡Sqa‰UìÑ=N¾Ð‚Ösu1ª„´ŠÃ1¢@êQàÐB$×CZZ‚ ·ã,¼íÞÏЈ¦2dyO¾Âvšà–”Id>AQûÕ`3sVNv]ë+@0¥ à/ d‘ü+ÚìümßþñU€_ûãd;Â9…+Gñ‰Þˆî-e0K~ïÐ)êœ$­Å„~‹CÁÝ%IwÅë¡òxÁ¯^@£‘ôKô“D3ƒ& ’‡&ˆUSÄûfâÃçTk ®@|m‚c HPb™aý_¥c@<ö1 {'!ù.ËUœÂ¢âÁ ¦Î“6äâP\!Œ— ßLOI”çÒA»&œx¹_ßÜ®Pa@ÄÏß5ëICþ•Ë «ݳ È9¬ò麀‚Ç%@±h” 4²; u@‚—(lXä'˜òëfys\@îVG@Îòh {>~$ý¾! “±Ú˯#ÙCãòŸã[+Ê&5; Q2Qs éJ ÛFe°RO6QÄ I@)[P!àI  6U P×™h"m[õ_ 6õ]Ì,”o€.e°=ЮZ´Gl­}q@sŸä3xøL]ÀÉvxÁ¢jã.æSå#;âš½ÖÝÏ.Rðm®¸ö´?¦µMWd+5)gVs¹ö?9)éWµNëùלZnÿËýû? î¯bú¿Q»ö) K” äAÏòŠi$X.€<ÊÅ@Žh Èîç÷J–uìdƒQô©/“æ`Å[-üåÐÛ3Ð`½ÄÏN:û’ºÛhWuËÆúš¬Õ£d;+}oûKëÌc9éNf:V£²5 ߟ†?ì þ~| Ïdt­­°á#"µ¡þǃõz§å¥Bm›»©»ßäÿÓjWñºo¸á)•CÓ`Ó-74k«GáÒXÆá®½øÖvÃ…s¹/ÒÀdF ×§É>׿OAý9º– ïá£nƒ¡~5àÁ@5ðþ·§R}çcð=R•îÒwí.±jÚ´ÚUî;NÍÜ%4׺ö²¿p_ÿj}¬?Èß TéKü¿a©y5]Çë/wõWŸò85Rvw~7¦âÀº-´þ·ýrûc*öÐñ¥Ü%æÇF‡^/¢v•^ô¢Su1ú7õi)÷õ¶ÙÕw§F<8Þ6x}ëãס¥#Õ|räU—¤Y%N½Mš»úoÌjxòaØÈb¥Òur.WsºÜ­mc5C}t-®ñ4põé„èà5XþØŠDæÖLÎг©?Ј{Þ˜M®>vÊRšÕôšÕì?ÿ*±+ú•+ËûF±R®JÍfxj·»¡øŽK‘µ]p-v½"òë]äÀ&íbá»SÖ…qµ"&ØY€Î#?kVôZ'£yCý¤@©VÛR.íEý;8«ËU6!1(ï«ßq¹*‹2wQvá©U¸þ ¡ø(½JÊÛù»Y*™¹€ l´ÁÆAU*¸dWÏÏʃlÞg“ËsYk>qãú¹M»µÉѯWìUíëñ6pO³êÍãa›ù?Hú)1ìrœæ ¤jm•X_“ƒÐdÂ’òê僫å ß¹\\«æg%­™ ÖÏûôpê/«“•Oœ‡Ûܦ¹:åèûêæí;‡—WÕ_àw/ƒâ6²8å\§¬àD9ÏÈ>–í|¶¼[v¼³çö r}Ú6ñÖ÷²îZßëö•àùµm )&UØdºÄôtI+L[X-v­|®àb#3™ó/+´’ÛÔO’·öºÇ=7–{ê\·aÆWüç:›Ž ‹ìcn ³®Oìx[ÚƒRegÛtçl«ý‡åò{`Aˆ0}EMôÑqÀx%ceÒ–çúfLÆzèÁ†æœy‚õù›éå’ŠÊ­hï*[Qïã9ÌcÃãćâJy•uÔÌËvs=ÒŽ—CÎÑún‡Š5.¯’ïb¹ìͳ ÌY+›è «Ë6¦ö âåOõM¿±Öéo÷¨íÇû§VõHD=-\^mö®rÝê-%*×JTYcŠÊ¿«Š*Ì–JTÛ¯Rü ÝàRÿÔ=>¿*ÝÞÉ阼ÀlÑ̾ðP²³ú–¶<2‹™sæž1ýü1ÑË3eJÄcÍê›î]ÖCã£kûáÇÖªžÓxˆ ÔÓL«¨f6åº*ö”¨Ø›ÊÝj+w«à&|‘Í•$ÙŠQ¿S_÷ZWѵ֖èÚÍ(Áj<\ÏÃè|†^UJ»Ì‚*5r•ÌÝw´ÃI·¦Ü“3ñvžüAô~„Óÿ\Õ³ìW;ø9X㋤žî¢J:J*טã”hiÉò“´t¹{«8²Ñî䥷¶(KCäÕ’ì%;'¤¶Ýmó$̵;°Æñ+{ëý |1ã¶y²ï¹­‰ŠÜ6ÿ©reÑìqÛz¾ß콪·²0.ó‹p[u[Aŵ%PLLXý|0õÒ­d”{1+íÛú¡´·÷Ò.?2òs±d“Ø$¸ô¾ÆŒ”UcA/T' ŽB΢Ròa«.àê±Ï{Ÿ9OYÚ‘+›öß¶¶(»Ì…x¶˜æ¶»£ï\—§ïF½ÌÈÝO—i>ñ^§üƒ”tø´P.;zYw,Ô7½²ðhµµ_ Šže¿²¥­_Ò¨P¸IÙ¯~•²›ÜKʸ¹8…CHDò!&,ð.#८À¯•½Î,O͹€«àJõáØu©ÃÖé΄¹Tw;F¾à/º£T(Z{"Yªo6›ägLn’@åÉQ…ÉÏ´Ô¢¬äªáçÞ>øRû¾wR´ÐþÖÑljûÕÄ K)]¾JßJ&™KP¡ÿQ•» ‹Ùã$øýYÀÏñ“_· O=@†«0Æq˜Ä°Ç•+±õbÕ`.»†Ã´:›"£èßÝr*ÎäV”UYÜÉ/¯¤ÓœšÄô!Ô~5VK|ñ¹1øâ»/¨D4ˆ\ClVv÷ü®0㺽ÔMmÍZ'[ßOn’ª2%ÛrgõÝGX†…'¿ÉCWž.OÜ>ì8®]ÙÚ}²bcðùA˜«´‚™¼)úá½9º›\¹´¾T-*n4 ”uTɱ¶ï’NL/ˆYP¹èöŠâçhئq,c!Už£ûjÇèCµ€…Ì£mܸQø&H~÷qºƒWÉ\>–¶vF¶’bT_”äVXX^§~s°ž\µ¸¿°§iãÈŠ±ºc"[:Ò‰z£»e?¦â£û¥õJÙÖ„&¿ßƒHŽ'À a–ñˆÙÑ/'G D›)NjÜ =HF«“Qˆò¹ì i¬49ã~åÍM­ö’Gù~6>Ã’íìà¶.[>²Ô›Õe{µ&EÿDÃö?ÜA“ùÛØÍ.Ltòtw ¶Ô[}î(».ä„€¤»!ß$Ê1W‹$õŠ,¾2{ |Yl‚+3F=Ôª#´&<( 2HS½JˆôªáÛ€ÿ p; ¾p[Á\øÖš5i½lãçt•ãë mOØN`0«ª• ßÒ$;%…U€Â<3/½Ùs z0·ÊìJ÷$ãHÙÏó–ôðÞš˜·æG‡¶7¼èÏ?Na‡¶½ (Vn 4Æ*Y=<š&Z› ¨gHsí¹´Ü%÷»øµÚ˜‡^¢ž‡ÌpÝÏ µGæÃ­,Èôƒ:Ô›EÍ4™Å½•æ-k^¯ÉÓR |K1Õ¢(Î;u‚ߎ¯WË—>¬œ‰ôsÙ¸Pï­t$½üaGàJySÕâ+¿›ôXl?Ð:Õ‹Qa·†PaŸ!‘pHË(ˆüæàNöPIŽ˜1=¨ï«ÌgµydZ¥À´ºq²Ö#€lä+@¶Eä2XL³F£€Í¸¹óÜ÷Zf1󚜓L9[Ó×ë$Ϫ{ˆ=r¦Ý¹>hÓ/¿z2K‰~Øã%¨¹ÅØwv‹Š²wBZÓü Qråü@›_¸³œ¢°\¨ÏÈÕ‘íÌ(ÎÈî5Anr›4çžêÃx‚½P³Õ¨UKÎ @¥‰ PÙn$¢tIÆl¶i6ŒòÈ+¯Â7Õp®öÜìܲ>ôK¿>©ì6¸’H;á%e²Ç8>ŸTX4wH”ÉŸaõîM ¿)ã2õÊ@G€YÝÂzÍ1ý®5€ÖOÐn,ƒM ®ƒ\  OÔKpô¸z&ý›@W›¾wѺ™² ]xÇyù³¹?ÈŸðýköf/µ%ÌtëK}›'™Óü¾¾‚3VÙϨ¸*î‘(›?ÀF.…€$ÜÀ~ÝV{=ÖA‚ž`Ál€ Š…ç߬NlèÎ<îý´½×‚êHº4úõ)ï-Hxï…á½ðÜüORYÕ³z÷ôžÓ³§g]ÄŠЗ2™Q‘‘}Г2|«™ºÁ]¯—áv4ø4¯ÍÒ16=±7ËgÓô±U.‚‹; ÉÞòqã$ƒ™°¯}¸ÙmþdÙfâN×…Ç%Ô“•Å™4K­aÍ2GlZŒ\ýx^CòÀHö0Ñ&˜ÌžLMŠ@¨&!Ê€©›=«5`ñ'€£0…M 0Åé 0É#Æ\~kËÉÔ¸–Ü™5Œ ;ÊéÙÃÎV…Ú[û¾cã9ŧÎ"`‹Ñù‹®wtŸÒàNš¯ÛÝW,3²Ï€éòÀL“ám öd¨'so°É¨ ØR7 á–lÙ¬A˜[Ñö6Àf²`³ø†Åí«`ÙZnÀ¾ÀE/ñUëàF¯‹v#ò9õóÚª±‹+^‰À«e(|ó“¾C±kŒÃéCaòAš7ñTÅOÞ°tJ7Àê¥;Üî°£ ä¸&!ÃW’Ý Âëà\pƒJ>Z9€kÂæäš³PQ䜸âÅ\ißJõ€3;ð‹29u{Ax}l1Û™ýK¡I;ý‚Æ©»„¬ïÁe5‰£Ï–>IE¶;‚6ª6ó‰7¤´Š¤"ါÛä·‚Ëù.xü¬ÞT¢€¯€ŸÌs@BBmøÛqø{òáÉÞkÁÒ=À/cðµQÌ| |j®cÅk>ÖJäGÆk\sô…Þ/* aíèÆà–„ ÐG8䦌¢ÎñÇ™Áh!Ùô3dÓeôä¿ÕýV+@(ôC ï5tu '­D¹ÝbíÞâ<³bzâž/bc­±.±(„“ È 2 DBYáÙ‡[Ó)K=º•â³ñM E‡ÀóÅŒm5T2(•?¤6ù'3ð·¸ÿQp‘búíÀ•Z@z·F@¶K ÓG /·/ ¯,È#/ú`[È)f dãÍY% ”¤ó07Õ£½Äb®/ûÍ®|e+U!usÌØ$¨¨² ¬…[?%B”5y_+ü¤Jlø&J-ÀH¼E9¿Ì·(‰Ù]‘lš¤®@]wÐT6\5­KV€zíŽ<âüŸàÝœÐj>ò*»€ïgÇ/©cu®*X¼'&¹»;¹eªW` ^ç¾™}Wé¶ÈŒˆ H"ýåýuñã?I·Þ>LÏþN‘åöº”@$µ@d´+‚HËêƒHéêHjDƒˆYË€YšýT¥îŽj@oß}m—N.¥'Up¹ÍØéÒ&x´ˆiÜm}[¦Ó“Qu ý+½±@Ú1ŠJøµjÚï2¸Ý_y·HµEnÛ±Sþ1ÚÆá2 Ç ¡Û–gL`ÞÏ0çÞ˜ /ÌÂ¥L^¥CÍï„7\2º¢$ePîOƒ!0Jo@”~e$ürÛÖºá_ß~'Þþ!/EÝ¢”´:2Ú¢XÛõ`lF뽓õé—€u+/5ËRÀªçá]ÜÎmïÈ6mÿ€2bÛ ÷áo‰¶­#„➟ܓx¦ÖOæ1çïüƒª=¿pzFîÛf߼Ǖ7y$U®Ú4Ò>û{r *ƒÓq¢©Â!ûxÕöÛÔ¢‰äЉv¾³ßKO…ÆP4UþëO¡9è DèÀi(xîK|ÆæŸx¯ú…Ãɹ íy÷z²:ÃË5YŸýlzvqââ8‘Àê0Wo[¯àO÷{Ám·§lþ¶¹Kïµ_m3« 9Ó–ó˜ZÌãÉî|•IVûE"µ µßÆÐ0Ý´}Ö¿BaýÂþ|AsБ&zÕoïbŒß×ÓˆžÝOñµNð’Å{ØõÞžÒ4¿1Ö;qÛ/ÔUü4ˆ„‰·Ft‘}f¬ù*žIÎÙI&;«ùÒ´Îdê“S¹Ú_ëÝ©ë·ûQÐ{<‡7)Óx®5È1òEÁ"^hÕ)$‡"ƒ(ÒjQÌ@¸¾Ø¸¶øNpÀ³´†×Îôoy¹Eö~ #¶õ9;úôfŒLN…Ó||­x×oÌá¶ûÇá§_¿ S¯Ê}Ãþ*›x÷ÙU†èU¸<Ûõª å‹ìÊÇ©ÕÑ®çB»U:-Ø_·, œQ¶]wÔ{ŒZ$‡Vå—UEš(Š3E«xídWª ©ñWêê0õØbj<¢ú«ÔŠÕÜ×ú삵º^)HvNµk¶}u¼bÛ¸yÕV?ºm8ÁpÛvFñS¿ù™œÜfš8Íó¼¿iP›Ï±^ågmÛÈQ5ᲊT릯œK·¢}î g¿HdY-Ž*|ê{&¨‰ñj±ÿm] 5<ä¬EZm»£NWÎÈb`ù“̺‰Ï˜}cž•Nð7’C¼^äÚtm[móU¯Y–õ‹¬8fÁ(_ÙX¹c×’%\Ë–ú©a¹ÌgÍb‚¾ “2³*à^þ–Ÿ×ïLžºäíܪ“åŠÑŸcŸž­ÄW*š¿fò¯ýB!‹ÄnX1êªÖ¡Z‹O›ƒÚ¶¼u*N„(—;Ñ[µäŠ3…ƒÑ-SkQerÛÂgY<ÒlñšŸWr~ž:¤ƒÜ vZrEµÎäïòÙŠ±PfòÛ ª£c½šÖñú u]à^ÊdêXÒ߯ÂIüÓšµÿ ÿ˜É?+ ŠBhÅüè iµåk÷P,&ðw²€¯ÛVnU“ÍìÖâÙŠ®Á_É ·X>ãu³ÃVF~{éÓp馵Ïlšê¤gË”Il¶Iq9&-ærM[ ^<*ÿâ||ÒšqürÉÚóN¦cçÌ×Φž.a­Fתµ“ç/þ§Þ:Q#£"µ6ŸãSѬpí+éÓ@RW÷Ì&ýÙ‚OZÔZI«žÏÑĨD' ^ÉÅ'5¥OËf-ŽŸNèPÕ]›ºGÖªë̬bt²‰m‡«c¬1˜d´ž©+Q…üdÌÓªÝ5’ꙺÀ‹¦.:S—ð­éT…$Í£v.wºržŽ4í/2£¤;jò­ÙDBg°xZœ¾ìy£õ²©K·Ví!e1û›zÔbë o,õÆ|&ªàLÞ<ÍÕŠéä즩ӥžq]&†É/Öß—СZÏ`zp^(ú6›ž0ü¡öyÌîÚ'r^c=aÑíëìjbv?¦é|!ÓH°±¤mprœ¸Ù´UbŸXÅ—Q/X^¢õÄðfž¦½Çi:™áËÔaÇÛ¸.W$„€7LÖ—"þ×#ý*Õƒ#×GM-£'´TIû\›MmÒY´t[ªóaô¬æâKB¥AÔPVÓ[U)fûK…£O²Â1{8ÞW8k+Åßq@¿º.w[v®ÔzfSÝÃÊŒgFSÁâóO2ªæ"/ã–w#*eÏ‘ÇP;EúWü±ŒëE<ïªêׇžP‚·ö¹Ð„–6ZÃ}Qø"Õy_WÔœ•6UêUO(+w’W8Ì«ËÛ9Õ—+¹ÂJòÖ›»T/Ç9IîIñtèvE§éø¢ãÌã¢Ó’+ F.Šî‰ndޱa:16ºµÉd¸/ÈÑkbF»?#ö²pÕ“ü¨MýÕ^ËäFž–¡G'h9guÁׯ*ÍÝ•µì¼”âÉÅÎY3ò.ñä*FèÒ! G( ÊÊHÊ©_[ú¶'êwvñE ÝXù*˜Á‡án/Î[>Ùä­8r¯&¡s¯á¼È½–^¹&ÅÛ“ÙY×Ò‘›‘@ù HO6îëÈG{¾6«°gu™›{*ã·J RJ3}ªÖ5ó ð”y–«Eå*Kzâ)5º‰¤FK¤x!¼ØZ®U1RxÄ„îŽH ѪUáO§ËÛÃë‚Ãã†Ã2s†Í¬4›%‹G‡Yb­=“Ÿ&°r_$³$ŠÅJ›0ÜܦQ­$ŸO°#>Þz»_$7ö±9~3kvNó{6»VO,U²ïÌ*Òø0l¯MÒÛØF¤ËÁÛ ¼R$MÕùV’÷é(ÖžÔÎ@\ÛÅaøA÷ãî7î;$a¬°õ ³ ÒK«}Á^Õ+±¨Îf¤oá›úŒ_ŠÈà7ÉÉ¢ñyl‹,ù‘œq“6æðÙ~Äæ`/ˆY9—ÃË–ÞNŸº’%¯´H©päx*°bu§ÇSŠ~ŒN÷ õl¦BܨEŸ0KÄðýnÕ9­ûy Æœ› –Ȩ66š¶rùÂMé¤,nV°¶k+jšiUÔ'û©rf-ënp ø }ú“Ç– ZKn2ŽÌ8Ç&ðàè¨h±Ú›S‡èrC)ÃñÂåL:Ÿ»O¶8#õ]%nÕ¡J˜Ç…?¦€[·d s£î #.\ý'\³t}ÁĠ̢IÚì,ÊfI²‹x%jô¼¨-dƒT*‡B 9÷íU4ëÀ¿Ìó–juɆ4céì}ÂpÎØ¥Õ2l}JyÖfd«Ù[·ksKt;½5—7üñ8ø`ˆØ›Õ,YIE0L§A¦q¯RËŒ©W|'H¡<$1ãI–2€xv‹™Ó{Ýú"D!ž‹ž³ÀŒ¸6&"á[>äSÁæÍéÞo;nÊ4VlΗæL‰ºOiñÖv)U*ÉÖ²½ ºŸæŠÙ ön¤öXò?‚™‘º,Þ Ç•äÜc¹5aq–dÂ` È•uäš–éžJ€oV€ì’ „|Z}ÔÒ]¼åØë ›5oË›©O[GAå>B:oŒ@ŒR£«Ç´Gx…‹ÃŽ]”ó+¦d‘sºê\fTc7›’m²7#zñö›å –ÊÇ·€â?@Ú³RÆì¨4ËA(G \2€Ê$›ns@e;@Y 5Ô“m­(„›Ð«&ÜŽÞ€n'_g»‰Ò³Ávjh‹ûRP¤ô•")9Á䯻]åÈ‘ÌbǬýÌš®ž™%Õäî ²YΉް7Çãòò‹ÄðF| `Orܤ<@]šg@½÷O@}XBV€°4Í©9Ó6 yshìŸÀ=x4!ùgõ¨Ó-¨õ¤‡”åD¦û®ÿ¤gGÆb×P7±¡€„oñnh/apšß¹)žX¦=ÝÓ5ÅÞPÍ¿&ÌqIÄ–KXÅO{æƒøÐjjh»éº±¹zðô}Œ| Ôh{%Ô“O’ ¡Uô™èAèÀï\ ø¡+ôöÙôô|t? ÷¥!OgÙÞ4÷udúÖ³j&¢òÁP”ÕÉ{‚ñæS sg qúLïýé!ôÀŸó{Ò¸«;<8Þ7Øä:[ÃíÄ€>´áï=–`Ä÷0™è0ÕÒ0Ó ˜;&@°#Ü`|º¯>̇ß8Ì À,Ë6`V¥pþ>ãæÀ´¯ÀTö[À¤û؉(W¸c¥´Â8i(5§-JíÆ‰â9ùÃQ™Îƒ&p_Üú[ñÆ]9rÀˆë})-wpSÏdÜs‹\žÜx6±€-¾)Àº°¯®8úfŽÑC[0쬱j¡wìMc ¼S€Ý߯€ßàw‡±*`ên¥åG‹VùIχ.hEvƲÛli¤¾2•¦P΃ó‰Çú|Ç“µÖõ©QÙq!¯Óù ‰`àG¿ÍÙ¡‰×ç¿"€u ð•~µj°ÕøÂfø¬>v‘o¹À«%à>uøíÛ²7!ÂÍö“¤ñ„ª>ß%²êvܲ¤N·­ðÅ2»MP­Žó!žyëc÷G€tî°bˆ”Â`?z²×`/,x€Dýß+¸‰â“8FTA¡ÄØ¥DE]@p/@d¤0ÇaaáZ¬aßa–’B¥·žw€`¿h h¹Èw6unWÌËç\ÒÜfMcKë¹@]F"Cæ™ÆrF†ÈLÿ­'#6!‘ßI·¡ X$?IHDWdûVp‘fŠäÉ2ææVG@V+ Òg ëuS2çet¯ äÙw ì(šiø4((½ÁH¦j-µ:´ â³”Lp…tÙø"imï©Ä‹+Ê}¹ý=y8·~øüŠp(Á[Ë÷7ôÝ"±4Ì'øt‹–N»uBÕV¸õ¼ ÿ2¢^X¨xÑW'R ¨•ݨÑ.TÊÉå\[e|ÔR%F:s6`/)­”Âå4}V›6ŠyƘgßü©Rm%¤Ž2I´º²ÿŽÅ?‚þá»ývºþÊ»EnÛ0å6¢“aA“qsï’íÄFœ ä:T¿ºsð|ºäüV±o2ªªNX˜o>ˆÊ¯l[äøýƒå©¶¡Û6ªÎËßÙ¶ßFÛ_‚í«µòæØö”¶–N`íÞ>°ú˜¬Ü ~\ýüqÿó“^½ŸxF øë*ʈEK-;Èh !³EnÛÁ9áëÇsB»¯'^cªÖ&ý©ÍÞ·zOº Ý¡~“‡CëªMÆ™‹±ØTϱͳü4¤Í!ë÷ð}·ók¿Y΢ÀÕo[h(5¢0Óp¡Çcókþ>š"æ #€Oóà™‚×³ >íÏ ¹J>²ÛIþ¾U+å›Ü×k—k’vÎ~æÕ9Øuï˜:´‡ì¥äî·ãîêà>ý"‹ŠÝïÖ}ñxYÔç{™zàì"ûŽ™sv>†£˜ÍúþÍ1̃EôЪSHoüŽ3E x…2íUì×H EpŽÍµYèé- p¯Þö@9øå=•?;y<¯ý’ùYd_¦®wj‘}ìÙyá=fÛÔXž ó±>­ÓãèÄá{ññµ6κ¾3.»±Û¥3Šäl˜öi#gd¨[rƒbo[yH­EBí÷ü}$‡†q¦H­E“ø‘éòWÚÒDgåÏÁœzé[brÊïÒ“S«LÖj¹~ƒèŽ‚Ö Þ‘‡“Øn<˜'¦³þ*ÓZôÙekÓ«°}׫4N]ùкwµ.™5#Û†‘~[-+_n~æ‡QßTüƼr- rH¡-ùËV®l#i¤ˆ†+®FßÁµ!=$‡Žâ×û)޽ 59wå]Ç“7„ÙqdZhwtBmõÍ—áC`7?ã[²™ÆÏ™Æ«Jè_í|×·óóê6›§Ž~5WÔåþÏ"T1,È ÁX gÖ'ÍŒByU¿çï›ü”Núû.…VCDAHÃCY«h1˜¨éÂ$·Oðõ%—Ÿ—ž¥|NÀj"í<åe†¹¢’™|‘Ùm+³ÈV"ÕmÆë•¼L=Ö8§O£Æ=í$¯Ôu:ÆSÌ‘KúË·–ìíd"Øu«‰QMœ&òꟴŠJeêΑF§ð‘ “£´ˆ¿ÌHvÃõàh¤õQ3[ÔZ»¡}®›¾6é’ Ú'u>Üàj.‘1U#êÊjvÚ)«EÖVVËHW¥ÉdOÍeJ}TÊ’ÿ\á1¶£ährÀ?{a¾q$Ԛέ|2:‹Ï.â_F«ˆ%TVzà9;}Tï!Ì/zBYÝ!ø/mÒº-y‘î¬:ï‹’š³L]¥^9K)&+éPƒÅ&ey; :r%ŸË"½¼HÞ&ÅJõò;))âz )ðUIQŒ„lMª×kõZ¥t éG$—n¥·F|:êrè6lFôÍ=2hÊG=)L¶Z†¶à¸R#Н©:ßçj.º^¨Ôs·VVÃÝÂã à¢p€öåíT|É")a’·ŒÒR½%…íFÄÓö*Wu©Ø:ÍÕR0õø“÷oÂ÷{a†*ßï/v|È™œï?GùJK™´s¥Ò%ƒLÊ6†1Qµn¿#ƒgùªcÆÉSónb­”º¹¼;º¹oLäʧ:“ÅJf.yÈ\ª7¤…¤¨‘Í¡^lOtÊöIÔ…ü]¸z—Щ Á´ž"ï¿%ƒïKiî…»Un´ G`œ#;™p›Noãl:³²éC³=µá£]¼4è™Í¬”í¥É9­„þdûM!=YO^峚9;…ïKYjºSIí$]±u`†bk!ÅVC‰ú›œ ·Ö{.tùç’Ôî~ `ÞzIWîåÚç&Ë8—ĆöÏÈÉf>Éçj•ÉGvC†öz]?tIu,šÛj-j—IÔ.ËëìX1Ù|ÕÓm Åãäh'E›ÆŒˆ 3ˇ–>'¥Io¥cs=/ÒD¸7Hx¯¢çcŸ&—~pùÁ~9æíìx½©ÙœKÇ+Ó÷{vz»ŸÙL|°dÌÀ˜EP`¦8Ôè ÷LÒ|M­P{y0¤¤} ‘)I6ü„EªõÀù"Iµ)= ÜRu¢v¬L«©žX6sˆf»ÞÄõñ°í«,=?ȵš²/ÛîL¸¢cþ¹¾ ø8Öërãl­Ça£X—Ü8¼¾é©›ÙÅÇ,Ù ×`òÏša†í½)lît™}~¨}•¢©š”R)é8NMí^&Õ›Ý'.ÝÝŽhÇò~= ¼—Õñ¾¹á1¢)âÑÇ1šÛØÉR2®®b– •£·Na(Ù8{WÊîè 5W`-éÆŒÆå>جϥb…›MÈm–¼Qm¦`úm†y=z3ø érSû >§jm ¡|¦dqÍÆ– µ8%—O ŽÄ‰öd–Ç}kã±B~‰ñÂâÕ>”UãuöR)œãqÓÈÖ ²HÁë|L.Dyä®@²·\»W<ñ¬…Ø 9åãcÌåR½aŸÍ:F;Ôùol›aÍ M—Ûå1«UÛxJn_]²éŸ¦dóA­Im ˆ«ºfp¿¼eñ˜hØHÕ’Xü2¬ƒ‰INAê±x¼™”î(e€·Ê¡v— B/šÑbÇ|<;Ï™Èöf"á[:ÕržàwÖ+~¤F§Ü„¿ŒØ¹Üî3+N† «8dx8A†ö¶MÉ›y‡tRÛqÏGD'· =½&í-ð~Ëßá–A±Q_~b +G€‰Û—Áû6 „r"3±{‚tu€•:À_ÈûÒÖ \â(™Å.¼tÃ4ñ7§ãÇûÉÞ_¤¤S O°ÄéŠûlÔé·ÜM =°ºt…Ú”×8AŽïU›tÚÛq÷Cü¡ŒFØ+Yw1ëÌ0í¬@ú4ñáœn€h鄾ˆ6®õL´‡5@t¢3@té ªgµm yò ûD\J'ƒn9k‰ˆ–µg58‚ÿ á[ìŒLî )Þì¼wt™•SîÓ[x¦¼Åµêɪ9n¼.qƒýüQŸ17Y‚)ì™"°ÆêK@RÞ4ëC¨N2 ™xÂ¥H¶±$—øc€ÄÙ e¸G;ôÂÇF!‘Ž iäN$Ü‹ßÒ9r½ ]ñøD£»âÒeuÆæ²{—áôò€£B—Rlé·×&nm¯‹ê£æ®ûC@Æô>€½ã1 {£y¨'Ï®[@Î…3„BaEý&/ù”‡5 W.H·É·³p;•=Èê®È̹§ËŸ´y+Lu˜ÕE<4ßß²·µã¼POÎÖ‘ŠÌ™âjæÒb75 ”£Ü'[q¼GtÛ'ÈÑ›t°äÚéAJiÈñÞqÅ{s@E>k@•cµ„ÍP–…P‹@xçUm„+Q5e¨ìTî Ǽö~ (v}¾•eÌjYUe’4l1£j •eß[ìfW7þ5ÜÔv7ðRÊÏéª>SjÍ%[Ëøˆè~„!nû§þ‰a¯Q’rú€*­ G÷9^Œ  ™ÚÐêøhûþt\# 4E𸣙"„ÇÐÉüœ‘`-j9@“êŽÏ]¸/çU)Ë_dô‚ÌŽ¨*_Œ1Ò…)~ ßìb3ØÒ»¹ · ŒI½)Ó²ì#².Èž·C¸o¨W0†l´0»¢ .f‡g° ½£L¦†AX²€É’„R˜:q¨ÆJ»€±ñ `Ôv\ p·€¾¿"€>ħpc…¥=)qܨš"íd¸Ñqö# ‚­Ïe–Ä™ÑC=9I®æ…áK‹ñ¬Úž ÈlQ^AR½ `Ìýþ7W…oÕ°ÜlcÛ‚—G¶åÆÛ&ò€-[‚`+=¤[fbðý˜Z¬¢~ËšxnQ€qäÃq M>N5ð)n䳬Æ]¨“Ò]ÞQä,Dx‹¢Íõ¥.va:Ò“3·ßÁ‹à7—Ä—+q€ë¯UÀ=è(àaG ðĶxRî9Ûî€[= À¹‡àÊÛëÏÚsr÷„¬ÀúÜ S¿Ó³›Ó8/ ý"Ž2NhE$àXøµ»ân­tLúâ!R?”~éÉ¿¤Ûo+ð?Ì·å‡ô›bê„YB!ÈáT¨C˜õ€°f–@pa[«Ê»$Ò£!¤Þ ðÁ8øMÂ|û/çWR<ÕýcLDù!ÈFMvÖ Oa·'ҹÊ­v¯R¡ø;\âwTþ!Þ†béw„CLHÿ>9!ùUÛ† àe)\5-}ÒuMij@ª"m\ªÍV@Rz4·ÄíLJ›€ã:cfeÝ%Ml5™©îs,yßÞ(ËçoJßJ6Zª­pŸÓðã¶E »ÿ0Ú~ÇÚþ’loÇÑ÷êc6=Ø8½{à’À.èQ`k~Ø`sÖl,+7h€Ø»rüƒúE~+¡xÀÄ3µäÄß2bÑ"d½æoF[u¡ê=?¹üù™ZçïìÞ~ú+Ùþø¬'îå[œ¹Õž1ñzЧôË5]ˆŸûL!ÿEžâ^Ó9â­åÌ+¼Ô×®N½3(¸  ¥§Lûku§o%yUà òh:øT=Þ· ýyÌ™‡ðÈnň¿-x» m:smçÂÙÏtK§›¯ñSó ÷emç% õí)w6ׂÖYûy¸ŽŒÙ*~‰m—)?{]Pn̶ى<õJr~rªÛ'×ïÕÈ^Ežœ¹Ÿùûuöâ·zœÒáÜÇc34‰É¡(mà0—=¯p‡;ÙuC¸Íwµwâ°1V·Ó*~l]sÓ¾ÏW¶úœmSügêe?ØT^}¨/r¢í®ì¸#]E×o^U7v ¢£øã“NâZe0Og{ýU~¼îm+dÐõïdW¾‰T;³Šæï#9´d±ÉÌiDc$Ó"Ó%Z&ë‹DiHwø36öOøS§cÄí+jBµ0üô"åÁræ% TÖÅQ¦²/|–•S!ÍVnß+QåDçά×¢*ª.›Ý¶§RVðwFÆ©Œü6+i'Õ¤uB>¦®‹“ꎥ”ÉçÞ‰àÅÑ$~¤‰¢LS­ûÇIüaÖꉄ¼<µ7Ìì¶éiÙŠv‚¿Ò¹Ú¯K¥!åZF~–´/wS×Iaꤛ“¤¿¨Í“ý|o“6=/1*on‰„ð|Ç' ŠŠ§Õ¬jÏÛ³Tè5#-›zÜvÖj¸f­b2>²8ì}Eó÷Å™"{-âˆj‡ÈAJs5­½^\²Ÿ-‘‰`Á ŽÄâŸDÇ'Õ¨!¯|‘ð…©OK®Çë”ÓY›ºîŠVÑÜU-öqsb°›Ú‹Uââ8êMôe´ž®ÍÓbô4Í™:Û±ëÎhêÛ3LÅŽ¡ùûÿÒ_Fúíúâ‹DÑ1ˆêX˜ä6q$%#zßJèª-ÝcÛÞñ‚á)êÆW— ZOÜ?ÑzÇ£žg£ ÍÓ,«š:•Š×U!ftŠÍdø+»f6Ò¯ŽËKº´ôQó=Ôzt¥}nîM›ô$FKÇv 9= u>UëZp$àóL¡ZUiµvNÍ</äPew†ÉLV‘~¹²ˆXBq ¡¿Óor„° ¡×»>ªžP  MÚ 4†ÒŒ†ûЍÎû–¦æ¬bLY¹õ”RL®Ê ‡ãy;ÏÎåJîxý"e‘©ñ²È&ó’·Sæ’·?E%Ïë5È¢0k¢R"á;u]?¸8A,Þ11v¼"™Vá¹…6q®:ï6j.šï«Ô³êBÌ „ T <²6Î{¥œ€›\I¿²HÒÉ[ª¤T/$yIašxÚ.lÑ©‚‚¨Ké¶p=zK¡ãÁŒº`d“÷U ©Ÿ‚]„N÷:íÃ`Žleø1.Õb,n\z™ú­}ÑÝÔ|«.7WŠÏÆH®\ùž,¦.mÉ›[R=7ëJ ½@8ºžSñ´~/D§Œ­E]`öÂÕSÏB§nû_¤`*¥4ßo]Þ2$› üj‘õo=.aWöìç£Pìd¤ØÉŒ_²“yW‡pKp€É"0#ÙtKéȤmÔÕ 2'¤sk¥T=û˜tØF‡ây~é 7·æÝHÖÌž!+·x?`Û¼º|ßú¼¥Ë#.¸SnÔ/¹D´°c?ÏÞ… 7›ŽH–1™™O‡q&—%« Mu'_$½Z[zµá4ºXÁºXmt±&ôj5ó¹×=ŠªEÍZ1ÒŒï=ÙÊã–²TèNÄÖÑR»Íö)‡{SlƒsG”Ã%Yßá×P!á@eÛâ@Úë°SâÔg‰üvá3c,µbr[ãÀЕÂ^‹#@>Osͤvì°@UvÒ€3‹#%ÆéÍé]fÒ»ödJÔ–jŽÇÂëXâ-ˆJ¬ºYâ‘gfx×Èúd/xIÛ®Ð}í{¼=˶¸äŠj°ÓWcÉô¼Î,£³8ŒšLÞ®‡Ði1ô»ß¥×ãÑ€.¥æcšÇ½µ›‡K¢v ãJUóµ%1[Žqi'&k"r_ð{ïóÀ{–EbO×Q°a2H÷<ë€}_l3Æ6)ÙëÖÇëõáÓ>.§zÄ5fmª¥ð/V½ÿÖ²iáò-|fiÊ[LJñ6K^ýÃ<úUº¬«Ô¾€ «NIžy) FªÁ«F\F:Ñ.-Âàé.~ß‹C¼W³fØ3(nÊ&Wð§Ïtà”cœ–ëžè{Cìã&vó–»_€ù†–´ß}3V+Hld8}¾ÔB?8K'ŠÛ½…=á>üfÀf‹r‹)TN xV–óõ*Í¿a1k©D’q«A6stÔ¨W•h;ç*îƒCU× ,ˆžÛX|xèOŽø&@\¼š8B˜¿^Sx«8ÀëÙ&ÀóÌ› õäø9𤼸!‹²”ÍmŽßŒ>~n¥|ÞžðìÓßš7•ÐB±ÛkЂêÔ©ý¦Ò dÁª“GO -2\= CýGâXP]×Ágé6@šmAÛAà×› ð›‰Þê'×7Àï9Ø' p¿íü‘Üüe~R _7/7u€·Ç±8¥ˆºÙö÷´6×zOxóJó“h\Ïk>~‘&¿4ozKxMZ°'Uëä ׫¤V§+D;xUpß÷‘`º®‚ɰU…7Ïn…C£ˆ¢8PÜÂñ®¡û-0Od@´4 Ê{xít=@dª< ²•2 ¬ËêÝ‹%­­þÐ;]]ujO"ô+»57)36GõLá&„ª¼çPžÚ‡­OÉã"¬£§TˆŽEWð¾ó¨`£é¢ &ÏA° ˆå¹ˆ€ë’²\•9„ÕŠàCpH L9H–éB¸ v î«Z¸/õ ·cÃÝfr1…œª‘D²F)ÛGö‰üÞü‹X¬¹´ANXêÔ0ìNîP^cÕ¤äw¿AêBºFtúz –Ø­K Cº°Ïu ÒË õä¬*¸Î÷í‚¿¤/C*~-€Oò‘2 \ €<–€<é@®EcÁd§úù¥,›7¶ªèD6F¢ Ñ¥Crbà®9B`¦ÌjÕÒ•ªÜ¥Ûk‘Îfâ]¼ÞÄ­—^ÇÀíQ…ÌÖ¸±ä8áÜÓ]@ñý JÁPcm ¨Máax‡à@mc|¨'o—1@í¢e@M. f}ø~߉*_ë*¾Ç1¿=ˆõˆÈÈô-Ûìã;ã$”½Ùr\±7¢êO¡G¶Ô KD…I{+x¯3^ir¯8€Âm@% Z“ ÎWÐŒ0´Ýz°<úˆù€~FÞš¡-ø¨úMBØ5½NÃñ' Û¾ èÊ{蘄‡ÎaÅëšþŒõéú-)ÕŽOHƒ} 6—8ñ`°ÞÂû3§Óææàlœ›C6|în©ßÿ¢²<ƒ”²Ë”oC=9ý<¦¹æÖýVÒ€¨`ùjÂ-X<ÝŒ æï>̨̲1LÉ¥c¦\2¡åïGéÛKÝõð' :a—)¼##³7ÙŽŽgD,^žb©îþ ‰ÊßNåÔÿt³À¾þóíí8Åf~rx !‘Ü`RÓšÂp…Ùp‰üÏ÷pq؃Îvøœ¡çÔrv/Ëê盚›eÒWFÀ]ÒJ‘-{^Ö!ß:wX§Jÿ¤'#™‘ÉõÏ’>u …ON¬„âp„¿B¤WÀû¯2àþð_|¤þ•‡Ç¬âQ{EÖ¢ËáòÜO9õÃ¥†€Åäò£tÿNOFш ÊF.à?“n—ÛP…ûvº"Ë-’'Sd Hw áµÒ$ñReÇ)šNIz@<½ï@tßQ ¦Å)ÜÀ$¢x9L-æÃqtDÄ©s§ø"â –£Ò“CÝý[OF¤Pu•€$ÒŽÞý‘n‘2©æ;ÿ¼$Xpªë ¶®aR«jÄl â—&PÕ PšI (œYòÝØ¹LJ·ÄÓà3ÂG¤1“!céV}é7^Pm‘¦Ø "ïhxîg6<àÍñÛßúËrûK·E) ¿re‘Nê¨ÆO¢mâÕ¬²úœ}]Y@{Ϻ@ÛN@Ëœ3ájŒÇ}”Ù¿)ì‹ÒÏÂaˆò·?9l°ï!M±ADPÁ/ÇïT[$–þdÛþŠ”E:i¸üŠE7S=Þ· Z´x–]T`öZ`Ò‰-06–ŒIªÎ±Ÿw’êq Ï‚ëO¤3JßøÖ¹a©B=é¶(‰Iɨ0¿bmQHÒmm­H†’~í÷‚­›\ÛZï€ýPÎ N¬‰Ðm{T4`7½2°õöXû8¬\$ bbþÿà?U$ì±iæˆÖ­;„ݶՅa«ÏÎû—4ŸX>zÂã‚¥6`iE¤ø©n3V[ÏÕS; ¸ù¤»±X[5m99[Ç·•õ'™ëa?cáW3ƒÓ{ž3X.ÈŸ"ŠZ¬¤b9·ÏOªàQñkCÊ‘†ÚË5O‰é¨U)¯.ºëq_dwê=Ó}XçÞÀg¨Ãèäô¸2¶Sz—nϦ~a·ˆ“Mbé+ÝØÚ‰[±µYïÖ“ÃÇËìo‘cçLp9Qe¸ñ¹Y^z^²ü8nvlê¼¼V_§y@0×Ö3`a˜õ§+aw|¨ïjÊß ˆ&ì‡ü§DÿÍ/ò?&úh~‘ÿ1Ñ¿ÿb_þž†G4¿ÈÿrÃ#š°õÿ» ÿŸµþ¿UOØúï6ü¿Ø—¿±áÍÿì|ù«õ„­ÿßmøÿsëÿûõü"ÿË ÿçûòw7üv¾ü[õ„­ÿßmøÿ˾üëùEþ—þŸöå¿Òðëÿ¯4ÃÖÿ¯6ü¿¹/ÿI=¿ÈÿrÃÿ~_þ{ ÿ·¶þ¿¦ùEþ—þ¯ï ¤ÇT~ˆJ·ÇKIH4ÿ™¾4ÉcÃÁË÷¹aÎÎZûxô°­~ßT =ÙÙëþ¯Ì"¶™²æb<Št>Ý>8 â¥]qN·N©ó»¹žÙgÿ ¾Èÿõ­¿ð¨ŒÔ ÛÖì%ßÓï—ª:©§¯sšž°×}{T>¯þî‹ÜÖØëfò…éXn«ývê]&*Z ‹Í4q:Q›¬£ve5ÇÿðEþ¯oA¢j5$:})|ýóR«Ìcdâ³;cWè‹Ö¯Ÿçk¾ºoÄñtÝv‡þ6{6GçÚÕ÷1ÙìîV±º[~˜_d5wgôre[ûÛá%g¢ft0 ûÉ¥\§¬ŸÎ]'WÉñSßµ {Ζ‹ñªÕ72beH-Û)ßq§]¯ ûÙ×jdn!WJ5^*5Ò5ñ…/ò_¿ÿ¿ÂK®&aÃgÜÙKYßðg,ÕIÝJXgxò«Ïaš%r}•mÌØ|¸žù(ZdztûdµNËj¤”ârס²q§lY:ñL±Môþ#ø"ÿìÕ—ÜÍÃó©»[ÀƒS¡üÔËŠŸÛ@ézó ð· ÷]‚M1;ÖÎx¼?k©Ñöá\W›Š-Ö'÷W-¦;tÙ+݈’6JÂQR¡wØã7¼ä]« Mqý¼·ò‹¼VŽãw››sM:/ß;AžV§È0Ñ,ªOëñN/kÒ ,%kŒÜ$*UóŠ•Îå(v‚3È¿¢éÏ¿†/ò/|èðR€ ‰®ëÛû\ᅫö[¶JfS[&ÍýÔ³D|ôìé÷Ú-3_dß±ï[N¼*rÂ}–.ÇHP¼/¯ÂP)ù1ƾþc€ûò?_x)ú®õìñí9‚/öÛzTc–É[žÊ£ùl÷»>[XÞZwG¿62µ÷µÆåkEéׯ¥O\‹ý¥{-Œ:ö5?i`·<¾¾ÀÑ+úïo„—âëvPíî„Nm¼tû6\ÙÒÉe‡…/÷„‰Öj{x®g/¿í×åvšZ—¢çɶðÎê›BrDïó™ÎnŸ[‡ÔŽ¾È¿úI¸´nì ùSréf½É´6¢™á§ö”ºu|¢9#Í6¨±”­Ê»a­äw´v1þºÂ;rŸFùlPŸäVzbšc«â,[>ˬP›¿”èßïs³*¹²öJòÿ£íL×E¶…}^„Ž ÎóˆŠ"‚ € † ¡÷ÿ…¹kŸêS§ª¿Ì®®?¯4T?ù²1¬ÈÀT¦‹¦"µ¦{>Ûö á”IV^co®¥†R“*B¹r‹2†Ñy`®‰žMš8Ím†˜íYßá”yŸ­*ËDïÇ¿ oM» ŸÖ _*ZoT2 PÅÞ«£Ë9ƒÂ«_¼ßæYæ¶ÇüãLš»ÓfèîƒfG5™EkÿWr¿¯æ ]½÷1SÀ<)Ñ£èoSÌåú÷ˆ ŸøGø¥è'4#Èo‹~þ^~GôšŸØïÄóý?šøÏßËoÇ3‚üáÄ»—?œø+ûŸÐŒ 8ñŸº—'žä'þCóý?šø!ûŸ'¬‘ÿlâÿ÷ò/6¤ò‡ÿ¡ùÎþMüïeÿKñŒ 8ñs/mןv³ 0nN@1w@±Í–ï¼X›Ýõ˜ì°<¥·7˰¬TÇ0f¯¼±_ª¦úhÏ,e; OdG'îv ÏÍÙ"/ÿ¾i,ÈÓ-ë½B²ä@ëO¡#î‚âBªÞ׉{KyÅ)Û‚uŒÛ—ƒ•ýƒ¾\¥šÃÊë@v¤¬8Ûô£næÏ±/ø×ùgˆ ¿¼ôK€ü€ë}]0žêjZÌ 6“;©ò:sQ ån'ö”±¤•ÖZ)à·Štþ‡ˆ ?œø«èfdü¸DAÁe¡¨Nû „<š÷Fßà½C”·.ë¬w±¹œk8æÌÝ7˜º§örÜ]A¤Z\žp­¸È#yXWò;½¯’úìòïà›fË…Óf}~¸/bï™ÒS˜ƒâ}<¼d¼J˜±öìõtit3Lz=0–)#Ô@Æ~*ÚèÛ¢D4¶©86XwÇú}•òñçcš—_"‚üýõòóMÿ›è…?ÁŠ~bÑ`A)¿ ïí5ƒ×Y[{Ø\ιÆKþ gJõÑ.Töé´'ÏjG öyÝk¹gÎêÆÏìü%ù‹å¾ãþ"È÷ão¢ƒ;pD¢;Š­ûðòú=|ŒFh‚;ï&®çŽ<æÂ‰ùZ¬žås'cˆÂtÿ^°å$-ï6 ®w•f›ÊÎùg›qôüï௚yv™£°ŠóÖbª¾ Ã(&ÔnæV®\,åSzpÓûöqg+Ú†o1ÿY²å ñTSpJwÊ÷ÆØYúÔõáD¯2U'¬p˜%{Û}¬æ ²ó\Î…ÞvEsÓâócɶ>ëVoÕIJEJcl5.YóU¡Wê¡þ DOü#?IØ+åV kÂ!hÀV‚]s5ó&êéâf¶t‰ªµ•쥕’Ó2ÓMÓ¹S|æšm³ÜI­Âöò¼Hʼn^ØcãcAGÅÚ¥ùqˆä©ðïà=S ](z)ò°­ü»¿e*·¡Z;k¾i´W=œŸ¹‘¦ -WëT½×ÉÆòZ?—çÒrŠMIo•eƲ-Ø|rXM¨ÉÁ¦ZJQ[ü‘þ@ù~üðÄ‚mh$€ð gFó×åáF’§¥f-§ïï£5Z·R{WØZ 1>K«|Ï/ă˜%ÔE’±±]b\èeãÃ;ÒM$¥^Ü6FÅgtü³€÷ò·×¡#2øí,=*Vüîaô$u"¤m•uKÞ«ƒÅ]E )l#+‘Å4Û8 ñ9˜D'9G~çwöü£Êxý¤C€‚°OJ¡‡/rßÇþ%ÀV^¤ßc¥ÜT|òÖ¹œ{¹¥o±:ÝÞnFرQá$Ièù¾ÎK6 Åpž`¹pÂp‚?f;¡?ª^&>ý`ÒþàÕ´‚A¼2 )rÚ¤n AùáÄ—p›ÝëDz| Ï•ÅÎUoOÈZcëØt_"«õø5†ã˲a ód¼{œLîôi\™i§aè×δ¼¸]èèa‰¥KQnÑ%ÍjÎ'³Ó{ð%À{ùÕ%P0n3÷t=R–#³=±Lz»’-‹Zy[[±©Y‹•JçÁÌ赌3ÑÅ‘€á[úÕÝíèxƒÑÉ,¶§è>€U•A¢rÜ:ÛÄ‘“Ä´*_þ=:ß;LrVâH¹6ß•v+:`U2“¯E/DS&IçÆÞüUJM©GÇÕþ€2†Ø˜ÊØ©Éä£,qš‡+bV wC©ÏV¯;ˆPý«£ÿçì'`ö­Û¾^2ÛU\^lâln¿*š6ך“ý?¬­QÃ\è¸"„0bÃÌ!Ñs7¥ºÅ¾ÃÕ+ýRP¬÷<¡Øê­šÅn¯ Šýn W]¡[¤¿Žò³³“€õðÀªSÖ ËÖt£:Àƒ² qéðÓµxqt#cÁòŠ=—üy5iÇö¬)Ôú|k ÆîÎÌšmöcÌ1©ë³…fípѼAßS×¾yúü ùîùSôš°Þÿ]ÑOhFßýþϽüÛ‰ÿЄsþ?›øÍwüGÿO²ÿãAþpâÿϽü‘ÄhÂ>ùÏ&þCóý?šø/fÿwâAþpâÿz/.ñšä_Mü¸ Ǧñ¡ 1øtY´³yÏúªÆ°D#ðÊø–D“kg¾§°ÞìÞ5%[t»¸3sÔB1ò±ä^/l$c_îwlm5¯¹JÛ!Ž»]§~ø%"Èß_ÿÀEKÀ¸-Õ÷0€ªÒ…ñL†Õrð…U³6ÉÑÜ¢%éârKù(/P办áXi¢½‹¢/rIm¿Ü¬t­¦,U·‹Ò!—žlìá¬;[Ü¿1ÌŠCQ®oYÈ߯€ûç6(l…-(xÙİ€é’õ²=R¹TǼrŒµ3{+;‘U×6ÿ{ÁÖ>+Q•÷åì`zÜ„÷_O¯Í¤ö;ø«¦{‘Ž„ÖŸW¨é (–š‰÷nÛöŽ äµ²r'(©NÑmÄ‹æ¤.{ŒM­±Ê3Ä.JÌŠ;-&ÅëúuêYM[‡¶¤ü="Èß_‡z™*À¶=ø„>}àyE«Ñ¬èéaòá¶ *ØÆn‚;áÖÆ¹96­ƒþBmc~áûšIÛ°UJ——«ôkÒ}Kûá]:Eç¯õ½cØ|wÓQùÝQ~šïì¿Eóéçàdö ½T[/ u!ýàÚ':è¡ ÉÍ[Öá¶à|Èx¥³QÊŸ}ý\ EBýmvœò¤B–pŪ{ñù^=pú*«rt-±‹ ÿ‰g¾ƒšÓl9c¬C×Þm3wÿu€3Ø Ç5w׋ëŸN²‡]-;Czº§vBu+»ÞÖJ©ðOBØ:¾¿d¤áp=;-Qê¬@ÜvŸ¬Å~u雨EA¾†¢ëz¶¡Ýàúý™{cgоÖë(W‡.^O1¯é[ùÒ&Ø7éÐÛøø"]¸̾XŸ­u4[ï7ðŽKŒ¡Î v´Wlw¯üàS‰×>4?æÉù앺°‰[>ÌyUTZ&ì$$ÚO¡õÊnˆÛ1Ù/ÜŒeØðT¥&^¶Xµ7Õih®·ƒ»±J/3ú2ßfÍ…›`¯óš*kóÚZT>A¾ ÿ%aâ7-àGÆÓ¥˜sÒ¼7¼U:èê–Õš°sj»ôõÀ¤Î×ý]öÎJ:Ý=IìÙ±„NVÔWºÕ–Ó‰£.¸>eÌîVó2•QŸÊÒ\ý,"ÈÏÎBQ&ÞÃÄë„{¥y6v–|p‹†vjäO=ʽ4)ý, —‹éøó“ÇK¾àê^låŸ*ÞÅ嬛#È¢z苳¶|•'êCÞOÈ¡iM¯ÿ`+/Õ¾iÞ'ÚÇ{IrÆà¾öp=蟇IïX®Õ ¦Ó*iëÂë®ïÐÁ\ïƒǧ.È”½–ñ¼Y½ÑÓ~®5dèב£â–£z]3uÅúŽòÉOà›ès1‚§¨ƒÂÈN‚¢è ‚—¨7Ó*'Üէί…"Y Æ€÷¢%¶%QZá—Å1ìÁr.´{óæ+ëéXº6fV½êÐ1ƒ]KJº–Ê0ôj6e¿„÷êèÿ:òÅFÚ®¡(a `‚ä}=HŸZJ[wÑ£Nú”}0Ý¥ÞžÚ«]>;œÁ˜âwBíEýT§„`™rÏæ5: ŸsðASbKTGYµ¨(!t ßê5 ëv ÛPÔÅb-{Ë]ªÙuÏFS¼<&ÌýDˆ†ycÛ5#úC©¾5 Þ¬šìŠI—f=ý€1–ifFI+ûijp¯f2”ìœP’˜HEAØÒˆ ?;ûK€ü€n‚üüÂÀG³v¸û\9}ËÖÃÆå†Ü1[XºVïá{bLõdÏL6…d ©Àñ¥Ø¥ s¹àg&†wJŽOÛ2ôØAœ÷8õªŽãT<…' ] 2Mx¹¯#‚|?yqÑ„Sü ®Ò)ˆ÷Q‡?Šöa›™õŒuÚ“i6µ›ß[¸Ø?ÔÐ~X¤ KNõÊ3ÎLøLt´_ÃÚãõ€ û¢v¯ì FŒŽ1b¸\#D67ý-€üù½Ü—w¿+Ùn ¯ÇÌpš…sËšGO4ºšÔ·^}l¶2åóáÅ6­<˜QDòÁœ¨l8òò£p¸Þ>Cº]àîƒ^® (2äÀ3^Ä輌¹Á ö3ÀˆýêÒ8vé‚‚œâoFß–º~TÍÚ6Èié㎖ƒAÈ‹ZQøS|f7|ô<ÓáÜo’/eØÃ”sŠùðJwvsw° ŸÒ¬ØJÅ.™y¬C‚)OŸz£ÿ)ོ?Χûá¦n/Î1¥D˜5Uµ´ÚÌÈBšoF}Ú[•L–f¥r‚› ã„Ì8u]­µ×ž~ú3Žes€ìÀ„ç#iå3™Ïb¢néŸAåQ~ àìéS¢»O›µQ§§Z»‡†­¨_pžÌUí0=×Z1lÊ$×µ±·(‘Çà1t\efƒ¤Ñ_Q»,L“IôRx©DjOà‡¨ÑgÑðÐ/iá¹çQ×_#‚üýõœâùs`ܬV¨ŽJ_n˜â:nÌ¥ï[3£Û=2,Æ]¡\üNÇ•s’2h'Œ¯³â¨#æpƒnŸ­ŽÈ~)Ñ=O˜Œ{«ædÚ«‚É¢+tGÄ„ÿD£jdt5­£gIÊêÉtŒÎgÃèe>^–ÞuÊ•±”-1+ÌÍ~É9½Uc~ïÒ4Ú: ¤óPÆ).בët®Ð~é\¹½£×µ?6õß@}* Pu×(éM`½äšp’g¥ž\^ˆîß³>Pü²[ù> g®NâÒî€u¦Yzy¾º;þÄ ›cs"Ëv§TßvýôþŸù–¥ÿb%sn¨™Óñ—ˆ ý¢ŸÐŒ ¿-ú M±ßý„æÿ/bÿN<ßÙÿ£‰ÿÿeÿßIü‡fùÉÿÐ|gÿ&þSíå߉gùÉÿ›{ùÿ¡AþLⱓû¦¹~Mß+$‡ØV ~àä~ðYÁxsùë¤Ü1š¾%¤þüÊT+Üe1©BÇ€l`ï%;J×·‡Dü¢ZTak˜Fel›²wÕqlwÑ8®l}Ö/ÿsüY,Ç¢=jPô”™앃šN,ëùœéŸ:„’z8)¹l˜í$‚xi¶rf§Üú ¢ý4òXÔ·VJÛ*f¶[ÝXú,£ö°¢¾)\4w»(¡}ïÕÑÿu⛨h,^š|©~8^ADáL¿º:‚zÍ>Øæ™ð_}}îŽËCá²l<Å£Äiòäå­iU ¶ª^X¬ô²/ך¶¶”ÝÝ«“³¶É½«ÉWßýC¬²ú¯fµ·€æàýnNvQ¨—€gœAa•Åìú»•ϹèPϼsßÚ *(}©FþÚVö×ûN×x,k©á»* —åaqªoN§ÆnS zÛïˆ ?œø{üG‹9m€õH(º>` Ð«M¿m´õšøý6O ý¾®³òjÇÊ»ñT{ÑL,“×ôR×5_wNZÝ;ŠüìÜ·{Iô7ò¡ ·Ž·j¶³ù"È÷㿊ŽÇ°ZÖù |8—8 %5ÅLò Š%¦†ÏèÈOÜŠ›kahìO7iŠ1y¦{دäÍEm´óNµ²—mÚ‘áê[Ú&uÑ•„wÐeFÝk–@ö‚€Žõu[.Ù+Ä«©Kkn–ãXäããDaS²6KX(›(äì(<%öc£í}ÍPÅ žŒ‡]åR· ëÝpº¾Êƒ½ó§Ê6תm7Ër]w½åwÒk·¢>vÚ/Çç”Æâ]Y€°×ÿiyø>`<]õ½ßò|…ʵŠÅ³_BÖAø¨ K>éÆÅõüî´]ôuó¼k¨Úã%ïv´”ÙH‹\( ÷Ä]à 9³.IKæ@© ç öóUc"ÎWørý3D_^ú(ºCÿ#šO¡(\P(<îQ¥Ç~Ø©Òm8dz\ÉÖƒÛΨ̲Úß×a«”OÌI×ϯcÛõг¢§{öšëÅrçu4jLA¹%NA¶ËÿC¼ÇÊï¢Ew{¥„ÛP¶ Š›øêÞ8´½ ?è½I!:¹ÁV< ò\Üo*‚°u}~sK3Üú¥t—« Õfًβs_Œr³ÖQ\O»3Ìþ„ êÒ„ÈWÖÿ[ðùìÅ;°—­aŸ„AM·Vypíø*ì`%ØÃø)«Vp‹l89)Ëo–ñÜJU'_*'€SaÁ§èô|YÈŧó`Õ™O_#›Æ|Íж¨Çí¢<¶Ú•Í/Aþþú7ÑqŠnòlìMÓýʽÑ;°¾vuÎÞ4^+:º2²sg¡7Öbwà£ìf­´gkDp³<3õÃxªcÆLÎ'c¬GŽü)CÇ›ì‡ÓÚþCL>½{KŒC»°û¬ °1Á¯ì ì̳×Òñê5 ø9Îä Ó ‡Œ†´¦™}ŠÌZë Ôòb=;ó–.Ô'{S®'%·:¼è]Ó2­ASN’-Ø2÷sí`¦‡Ãγԃ}$‚‚lÜïx³|3ü&såÊCóÒÉó°â;œŽtsÿZÛän:CiQ–cýVIÔ s\œ&:ž&ó™aeN¦¢êe¨nG@ÉÄ}X$m¡M"xoü÷x¯ŽþâÀ®ì•ÚP”ßË ˜z=‚ø0į×Ù:÷,S=œsݧ2FIÍ•¦ÔÐ; ÞjÓö¦Ûølç³ÌAì§"ÈÇkü/ÝS¯x;Aªì#Iè“S®o-N¥þ8ãÕÿ!^lÈ÷X™K(÷º =Œž§Ï½^¥}˜ñþÆhÕÖ¾6˜^SòíÄáB*%¢\ižÌη}%51q|¼Ó pe4Ÿ¼õós©„‡±h겈óê¸q:m¹â-ˆ "q1b«‚“‹.$ÕzMé'û`ðŽrU3±½iNƒm±19X-£ÄhÞMô'½tªwÖÜ'ïå'gA~Þ.Ü1á}ŠÉÎM«o3ìrÓå™×PŽÆl!7¶æV$í§µº€×uñœËî,]»Ìݹ£•Ÿðh™{ƒWX÷Bi#˧’ê&$3ù Põ§—T¼ç¤Cää÷ã*(áÌÃR÷ỽԒ3èØ ”é«HJôׇvc¸*™»åâÅGåYfVß3‹mŒÖ̓I?§Ã@y…Gj*g*]\:äh<ð[«ûra¿póAï:ñ¢€ûŸãÏà»{3èµs={äÃh7É,¼$ݤöñ™\£ÛSn)䯅¹ÖÊ×§¨¡Â'yì-zÓ¡Ôô–t\]­IƒÙR¥¦’ã{vOœŠÀ ¦Vxè;qûØ_hg§ç‚½×ã–JðYÀ{ùß'îü$Ý<`‰¿Òèn±=³›×tió§yf¥RÙ™eÔÖa1ý9jýÝe‹P.Ú$ŒÝ%Ns™$pW¾_âŸöK¸x¯Á "×[5e¡WŠÜº²ÚmÆýâksß±áL·¨nñM"?‹yÛv÷Ü”AT~\½Ý6U*cMâ4;{}¶²=o­'zÕ‡šî’…u…αØmF•ÎN;qiu:ˆÛk¿ô;ÕÞÑ÷áw|¬ŽþõÄßC{µ0a{I%¶¢Vô0hÈ´/®ÒšœèLkÔðËAr?êC¹Ø°·ªs“nã5†³¾ŽÔ_ÈíÝ`¬µûiîÐŽ[ësKoÜ…nnú½•<é i̱æ°pB ‚ô—ùËÿÐü5rN ¹a¹ P¡Kñ`¡ìÂ>«Ü‚%sV<LÑcCÔJ輎7Êô-V1î¾qœ]‡|ƒu˜¢Ã]NUA¸àëÊóbÙÔÎ¥\çpâȾ{\—kKñŸÇ¯ã—šo¤þžè'4#Èo‹~B3‚ü¶è'ðí^þ\â?4aöÿlâ?4ßÙÿ£‰ÿ|ö;žä'þÛ½|}`ckPT«BÑUîöM´Ó…¢eŠÚÇÀêÇZ¸Jy]Æžò$&î ©Ï¯Ù:Ê:¨k¬.¸Æˆç…Y–Ï¥nM?qSÌŽ GßÀ<»š¾…Gûëh=|kfa6t^³7ÞÈ:¼Ýóa+ÎÆè–9ì/sGÿ"È//} d4Ðd¡ÁBÑÞZ‚¡œ„ ÿhÕŽÛ°d.`È_»è£8M÷| ?F5‰²W´qY^ŠâããwITY°!ʇ——Wqá¢[¤¼9˜ú‘»êSlwÔ¸qGW©”òu”ïß¿ x­ІDÀzIß T|@ǰ¨À)±pçÈ<éw—¯‰; ¯ÜÅ®W'ßÒD[¶•Í¡ï![+•šªfæX2±?ëxmwU×Ó=ŒØn{›ì¶Z~$}&`<ñ2Œçô@̺@ÍÍj’ËæöãÁêc§½f–îÕu—öcnuyµÏ7á|‹.Äc[èKâBlMsÆ)Fxš>£G‡…ŒÚPm{'ÒªL?]Ibªá—ˆ ¿¼ôM´Ñ„ñT½÷ÆPëÏëàk¹ UJ‚ÐÂG¹ ”Âf²2¼‘V›¿æÅëæNhÙî§ÊŠ•ö÷›)slèóiõ¼/{ž«ÕöZ¸‹ßZ–Ä ð!˜Q¤ ²2É]goÍ÷;‰è1 @>ƒ¨GÀ àG»ýßÁÞã¾J9è°¹á-ùœÂr~îŽO¤§Re §êSÛsdRSï5FWº½¨µ#ðóYÎΟ–ÈJ°º½Öïªd|õu|%ûEØØ“ïý–iÀÚ+ ±[¬Ýöqå »KØóûD46tm´*\¸§½³‘ž¶1±Íh³_u{µ½šÉ;2gʲUn)ÒDGŒMÝšë¦N­y¹Í®ø¨'°8·üÉY˜nì¿¢hŠÒ >œÅLw¢ ÏÃîQ齞Á3Ç—o>6ºŒÃêø’î¼•»6y½‚>WjgqXí’fÛ¾ŒvŠëÍb oÄJ0Þ õ+m®ˆ~jÍíÏØ’ˆMöëø¦9–VÅ?ö[.Z{øp¶ è¸ÐÅb Þ×ñÇ3èú|Ù'üÑåf3¬BÆ cÁßZKæ»A¢?—±Æd±)­¥ÐpŽe=‘#Žº]•Õ2'_ÙeÎʈ}|| ÿ¥`<{¥÷~KjªD¶Íþ{£­Þµø$9/»ÓùÞ˹µHM-;SšíšŸ**‰OdÛ2›²LÖðyŸòý¬1çŒvŸ[jÍÍââ/W‹ÅZf!΋O ‚üp6Ÿ2lCkF”ë`cŸè÷ç(¸CòcÿjØž=ž7£!V¯%nAɸ26 7Ö:Xq´Ë”œáÆ%yZhµÖ>!9°~ᆗá„=`¾`åÛz^}Œø™P&ØY0äç_Ç_5·ô6uÑøX!‘ÿl ­¼âj°k¾žÞÁá+—@hËlQ:/Ï(E.%ãç%6:]’'‚*Áå–b‹(Îù.ÏÌÄÆ’›vnqÍçÙi‡ æˆ ß?€úÍ$Ì>[†'Ç<¯˜ Ð5“ ØÚQ÷Æø¥úÚõõtçÙIùÜYÆ»¾Žõ#ˆöœ–û[{½èmjc8àöÂg—K.[ÊÔúóúU&§Ûdk8!ìâœÑá¨Â¤^±%3ÈäçŸEù~ EkÈDóéíà“« 2H?*–D»‚$ÝF9ïq­L¥cJgÆŠVÛj2smKn¹ÔºøµµÊŽ·-–­ÙCÛÓ8ÙíŸB+È`<Ö‘éhz( £|ð\&alñu,Öñ<® fë8…m(z€Ý–‰ á=`ú~*Ljîü¡…—v)òL­ºïìõíi>©‰Ä«Án|mYlŽkóVfVŸ&–v“ÉëíÑlÿ$‡å±ÏЫs~M×Òiæž÷䇿ÀrT Uª€¼øœÁG³v|¸éf&ˆR-÷Ìf9gm3Þ‘¾N3†ož j:ç•$>^,ÃñEãvå¥Ón•æ/M‘s§<>’ûúЭ›ts»ƒÖìHSÝÑqFuÇÄ–’«uáKˆ « S'8ã¼Ãç °œ`_Mz‡û¹æ4·ùÑ F‹¥è>ÎÖ³Û+åÅ®‰VJ(,ÄD>?MzZfä4–Iz½·êyj¤HuGß»:‘S¡oÑFßNG„®É»¯`ÝY6öx >š“%(¦NŸ¼­^àp6N;Ï¡U^¨{½c>üÝɼ6]Hñ‡úeý#“)n:ÅL°SlTñ@ê1ªª12iÒHÿÐȤ{§N2ßÃy¼ÖÕíàDŸý[ i/öš 5Wá}={o ½9Gý±É˜·L{°WÌ×V™L¢IºÞÚ¤O®¼Ró]§ +È‚qñ^ú¶Ù~<©Ä‹y’©°ïÛ#?Ñ;“V¦{Z…î2ê7¾Ž÷oL# ò¡ÇókY¸ ŠtBîÅôž^jO, rwá³+©b’0x5,Î%)wÑ×oÓRòÇ×Tó6 .ân‡ˆ?ˆ¶!i${‚³«þñ|…³ñ>ž¶“½R\A»\S.|Nàv… Ûˆ¹8o³mÒô\\Ù#•Nj·°1ØÃlv©4½ÐÇù3q±KÜô©eÆLñ€Fõ%l+²‘8ˆšìPƒ4á’£xÞ'˜‡ôÏå#è&Z´W¦WÉîj7Ëþ ä——>Ûyo œv ÌZåÔ°§ío+eWbLdgU”ŸÅµÒ²q¹6æZ«KNQýÅt=”š/‰ŽOÙ]$;MÊÔS‰¦m‹˜ö”cÿ"ðNÑ”ýž»\Þ{•ãäÕ]'Éø×ðÃ¥k±8búæ²5yhƒÝ¹¿]%Rš¨•ëÎÊ¡J·Åk…ݧ²eXÌKÁªDïºT{4²$•±£#=ßfĬxãúwú¥À–{žpÕzU`Ý@¾ÂJ¼ÛŒ]¯‡_Çé‰tÆ*Y2T=_=ËB*ÝIO_­J†$.z/MNôFl,_:Ýmj˜ÁüéAG"sãN'Yœ·_F‹o÷³uñ—ˆ ¿¼d¸´°QSÕÔF –C[ ƒC•ó†X®5ž}Æ?ˆ¡Ô( ɽȧY~Þ[ÕõUWhë»Îcw±:ÄåÒ~íýÛ{ vð|´û™Ø«?$-ɤ[†æZÉ3Ž7y£ÒÛ¯CM6ˆ™ÄÏŸpÜ_;lÀ­2|vž”È S:uÒô®=Ê’‡‘…õK·R¡ÛxzµöK3:í¸¹£ZÉ£0nqaÞÌ8»UãÀjBƒ)r½”ú‰?éõYýdBòýäTr%> VaEÿ˜ÂŠþhAGùa±ò¹òQѶGôîèV°öê¶íŸw¯ÞgסÝ[:èóð±²¼9—FøSNÜ:{8®ipµ7µshîëƒ>¹£ê¾è¾¶_Èm˜f_N›­ÁŒ'g0”±wo™o[pzj$„¹ƒÊ·äséâ}q=_š²Cœ‹³ëÈØ,.çy°:—©æ{eù¼µíÉÞn÷»ÇÃvÞ½™éaÉÞ_Æ^«ÆÙ­r}ñäûñß㯢F¹sÞ`æåŽ ¿pÓÇùÀ“7ä¯ÙÇ£Èß !ÏÐ}?Ú˜½›@?'¬“¿Ár­R­bôüÞ\ÝRqÊÒ-r´=›éíjW…èn·µmq«!&ÿYDÓgP”V è£ÓX•dA>S?¼ƒd>5ß—±ýãÊÏÐ×uÊ-fß2xž1¦Âf¶¯èÚLÅÔB‰ªòj»/ÙÌû÷¢²(–+øJ¨MK‹µ˜l̾„÷øò]tº‚ݺ¥®@^€¯'P´Z`Ëøê6Øë¶OŒ ד4ìœ×Ó'uÌšÔû·ØÔ¾zŒÓï/Eíõ„‘G«ûTʧUnSŒo¥÷žÞc\ä-±|çu˜ñÑC0ý@î.=`k:CMUkìy„šwó ð£ø±xöþ&pµ‚n#ñôF­vÁa¬uŒí¶9¹™=ßäºÊëÅô¶FnÙ—ŽŸÚ-r(ð×d-Þߥ5ۋ؜̩)—.2ãA~vö; ¨ã¹±áz4Z Ÿvy€ç¯.(ÄÌ(X³Yx/ MŸÐÁÓXÕÂ9œÛõÃ0ýhè®>j¨2œÈF]jmJ'£Ø¹g¯³~$=‚ï凃™¡f1kö˜3§ì±—°Óxaü%|h¾³¯_Ó‹yØŠb|8£Þ{kÓÚ"lÆ|¿àº@“Ø)”ÍS UöU®ª £*çc|U¼ÕôúZZ?+ Ú\f úK” Ç,>ŽÂqî£ÉÜuöcˆÛèK(²{|ÓÌ=º° å æ»Áœ§ÊJo6 ¶òЀ³‹C9ñrª µ&‚e¹VPwM½°÷©ÂféÔ‹kàöJ«}Y¨.¯Dƒ-äÎÜSGÔ,0æ³écRœ@ŒÆ³†½ý ä——¾‰^ 0“PT¯oàÃYóaÎ åû:>›úZŽ‚1Îá.c'ÛÜ^œ„¨’ª,òÒâ™@… 㢄G¦/|i_Ê…Å’’«³pZlLå,ÒŸ(ùܘÑ\—™ôéÊxÒowé/ yÀ>>šýØoY‚ãùØ€BZÓT%¼ŸØéÍXwöW6¼ÞÚ¦0Km2­ÅÚrf‹™Œ(¬•4¯7Y-k¹W=£³M®[œ(/·Ê Dµ=6Ýã`dŸŽÓ2ÕÒÌØìW†_@ëÐd" û¤v¶!8í(Œ¤ðQá:å '׆㔘Ö}çc6j<õF+é°•*Ì)¹V:£$gÇéôÂÓ©ô¬mÎÓróDÇÖySMÇÓÆp1ãHÚwvX¼Þ'ÃK1=ú%"ÈÏÎ~m`9ØØÀ'Š æén¨~’ 꺴³ò9¦ <ójC­¿Ü>·ø‰Ší"ùJŒ].“±™\KÅß-ë8J±þ13d¹qž®5ÉÚ Ùˆ¹óAÃÎë Æ| %¨¹nBÍ:x•·p÷XÊÁÝײvîz]‰íK{pm”°Žú¦‘õ”ì£lB|ÿàþX–Æ×Çìy?>'têñçÙz|X™_ÒñÄaTwDWHÅW i<ç$Ѭ¯"©¤òó/ À>‰Å@þ|œ×ÔpCJž{zµç§ÛªÙ¨}dÍjß«z89F™«=®1!<®`Ÿ<ø¤ÈþÄ8¨á¸{:à‰Ø í!iRk^ò„Q¹Ôû‡†Ûï£rnÚ_÷RßZ.ù¿Gùá‰â°Zž '*cPL­´›QÏ/-S¹Ù¨2-a hÚ£°Ù:ª»wUÖ^2-‡m4ðÛ q !3ÍŽžCå^™?½ßßß÷‹Q"»´½3Îez…áºÐem«Ù-O‹ã•¿€úX>šh¢K&lÝœÁ:7!/ØèÊu 1îµt²Io¯ÛÊ|Ó¹£oW0uY‹‡y¢Ü¸LNòG¿÷éG?â¹ñ¤Û/@äÎJ´Ÿ·–É^Q rÝ%•:~…owêë3l/Ÿìàk1˜óE 0óPpØã]f Û-=í¶—h‹j¾JòÇÂp²ä=ùý¡ú»Éi›ã¥fœ†âsèèJ¼R”•÷ÈlãXyú„ŠöJ¯r¢»ê×r@ì”;ð1h~ð^þçæœy¯3>ßCÓ]ÛŠ…˜ÑTÙ©:ºK9(Ž2"©Œ +'EUÙGIéΓ½ôh2µ×Ë1çµ·ÃöÒPªÑÔ)OÙä8½?“`çÉýKaà÷‹£î£W!sÏ./eÎ=Š£V-~ ¿G³¾"$ó#nF£uO*ÇÁöɲNœ£ž8o‹]­˜˜Èi–aó™ò¨hz×e‡ƒ¤Q›R»°"ÑKjCà.Púl=OÇ^õz»vƒÑÍï6Ô+èl—x§-Ý3€ûŸã¿‡ß/gž8™1ö ‹Z v¤³’”ËM:ÜÈ\Õfvs­¹ÜOfÝîлŽ ’:Ÿ€íåÀ̱÷›–ú×m@³z¯WõA7»L·ë.:uÀw$r.·_Æ\kï†2,ó²æõ³øX5¯SÎÈûö »ÞM¨Ôv³CP|=§ÞRÀnƒ™Ñ¹ÐLéôÛæ|ÜÛ+â4ëŠý’Ÿ×zÕGþÔ:•[ç¡T@§ƒTãí—ÞN·w4oÇd)‚´4f\oQØ¢ÝJž7dÓ˜[LsXt_Â^òl{R©¸ß9~½!ËÆyP˜e”jŽÈÕk9O÷^Ëy=k}¶¼hu…6Úëtña»ŸzÍ[TÎãZÉS\jñ—ÒÌ\“Fã°D ¦Rr¨ßðë§uû^Ÿ5¨hÌ’5GÐïøXý뉟a‡b R”)”ZÖ‹Û¾.ý)“Xû#¡¼º ’š|#ðË3ìââÙ~i…x‹ÊÞRÍaþŠ5˜’]Ž õÓʬ×ñÐl×Ñî×JOsPõ¶ö¨ºê§ÕZüº¨Ú«+ÍtjQ3¾8Vf{Ê d;™™ŸÙ•Ù¹¡ ÒkÉháëæ'Ú¹-É\ua‚ìI}€ì»˦‚Ș/âNwô}Ê2Lxákóp”WÛ.HA…I©ä^EÕ*±wû7ÄrÌôöxÁšqý³ø„æ{Îÿ›¢ŸÐŒ ¿-ú ÍòÛ¢ŸÐ„û³‰ÿЄõËï‰ÊGŸ¡æ>–Y/lƒœ´[BCòÐÙÖÍ­F÷#û 中 rèñ ²ÚÙæ«õ@ýqÇ¥>.”Â4p÷€ *îyíû½óÖ¯ÏLÝ{ÆÃUè§yM‰Ûãyæ8Öquo*? ‚üìì@v¼?ýG4›È§A®œíÀI~'SÂÆhˆgzæH€Î- iÿr»$´Æ2åf:ÝÐyô©Àã£Lñƒ–2÷½ wÛPuÁ{.‹Š×Uó—XÜÏŽ)N/§ëpe·W,…šÈŸÈröŽE×÷_”Îö»Ùom©Ì å¬Oc«Y¨|—ºH»ÍT3c ¯ß‹9‰øhbè7‹sæÖ>åæ^½ð®Êo6.²™ª×ÁaztFbÏ=]Õõ½ž<žëæ ó”Œ\^> Ýž¡h5¼ÃGs”ûÏF[Tkˆ«Þ]€68ÀvO8·"òï¿&Þë>´¥Ñž@[ß H¿•ØnÑjqæjÃíòj µcm²“;yúeç\œ÷C·Z4ÍtYßéyš5·–á~†ò³³ßDûQØ6<(.‹O¥o—3ÇÈg‹ Àn£=À&ËÇÝÙ¡¹»MÿnÔÞ;¬'—rÔù5sÿ”Ë©*‰ç˵³;¹jùpª8ÀR޾mŒ”ž¶¿´3²êÏ ^Ùtgìg²Öí²L ÖÈýøîƒ‚Á\ËóºÈÓÏȳƒ)Èwdó~Õ‰GXœœ/MûÍ[¼fÜA€Ì›o,/…ž œVÙÛÆÞìŠÛÃVÌ›–ʯú±×5ÉÊÝlÂì®G¦Ø-IßfŸ½Âx2‰ȵm vÎû‹b­-È—æw7ò€'•ÅcQÞ[!ÿª<`{‘—BÎÛg@ãzèÁ™æ¢§âP¡;×ZÉkobfÖèR?e¶ÙgÄrÎ} ûŠ:ß4ßo`èö[fÒê{G0€Ž|ýÁ6ÂeظO ?>óïîx˜H_–ª…Û»+X™E¬¤_d´ªù™N]¦ÒÚ)ÉzoKñ1ZΟ3éàU$‘íöæÂjMN×!¾€ýغÉÒôgñMtWxþgÇ:ÖkŒ@¾]Ta(Sû›÷[,ƒÎbdxÆõrwœš’„}ò“G³–9TrºsZ`ÚúÂâJ/µ/n›gY²÷‹úfŽ–:â2…Ó­ۆãDI›ðƒ3æ£||¸R”þ{Dïǰ¥® {(??¶.Ç“ƒüf ¿7Ú~ìn…áð¼ð‰ÌÈp'±Mp©¥‰¸<¥„q¾×“ZØM¦•>–Èn3<*åÃi^\ú8Oê©Îƒû¬ÇG=vÌíå17h1#.–KÓ5¨Ïj&œošû­3>×?~›@Ä×h…­¬½¸ vã:'§·Sgk|êD÷þøS£)±Ê|BÂ=+-VÇñ̺]f°•ÚN9½Õ—V1J²“ãuÄNN©!›jç0ŸÈ•²0ž^óõmcèó½‘÷þÕø£¬‚VÐå÷3o\#t§Â6\{†#½`Û×ÚÍ9Ø v§4DZ—X´cüËX!+ò’Í.­@ÆØéhTY,¦óîœcápTÍʃ97äœe‰OVâïo¢¯ŒèQ(ƒ|Ñš¼þþ~ËŠ’¸ódØð‰»8u§û–v¾+çCŠ®^#„›¢åŠ<-8ègnu7æƒUŠ(D—*" ¶R„uå¼ê ÅYÃFšS©>MÛz—šJˆL@ØýÏö›º_‹iøï?{Z °¼ÁöŠÎµ~Ó/ûé•-ÖÕ£ê®æÜõ/š\ê\w™»ën¼œp[?÷s5¸`™O{`Q¾vc³æÆB¦ÑÚ$Š› Cq>ÉPLŽb´ALâÞ²÷òýø—€¢˜rô2 °ŠSƒm(6‡í–KÉö““Ž­$ê铪!k1v¦û.S\mÏý•$>n韑 å„‘Af[zj0V…5GóÃͦùíN@. •uµõf_w§½)9šõŽ büY€Ü}vX—M¼vï=®rvuËìG«s̾K–3·îºtU"ˆšM´:òªŒõqs—Óf5îú뉕¬oF×'¹¥EÖÐ(¢T¶sv;÷'•sØ+<މî²óÌwnj½Ýá×á¢s£°uÇs®‹A~vöÍ >ȧ((D[D°¥‰Ñ¥Å¶{Ðô¨Þ{µÄäšCWÄĘj¯fú€^€9¥ÒŠÁ¶8 ô.¬+/Í·(*¶¾‡!ôgùZ´·xeS].Lä;k7Zm?ª5¢½ œu»26Ÿ@ùSòç6+ñ«Ä§DlËWªßÒ£† (oH÷[6·*|‘mQnk–Î&IŽ2“{(ZÞ˜ÒIÌ5Ò´ˆ#1™UÜþ|”{ô–d<ÞåK§äû‚­²Ó<¿jm¹Ô¦ÛÆû,¶ìÁ©‘w)ÉÒÈ5¯Åº¿'JfkwÙQÚ¨ÿ´7ÝVTiÚv`„ =ö=¨(Š‚ ‚¢¨46Ø! Bêùï´žgïõ½k¬Uoýý¹`0f7A6ad²ö ¢d¿4Í:¤~i—¿!“£ÏÄ2si ÆsÃî¤8æwç´?^ŒÞdãZœOßÏÝv¸wk÷Õi6—ŸöJ] ìûiçÙ7Ù´ôþ ?È?]y'A.© <ì(á:½}Þ<2%vµ-àúbü;3#Ïï•>˜Ÿ%™‚Q¤±ñð³Î¢twÈ÷=q]ï]”y‡ó5eðkýþHêÖ€òÝÄt¾n'öz×6û§ ûÙ_,G>›9çqÆ™tŠŠk«¤­÷AY4lgœ2~u0#¥S¦kóKç1Vå*ÊB*TÄò•Ö6Œê‚mŸ¾¬œ?›ß»Å<éÖ’U¶c´Wd;±6Åv±¿Ûî:,G„㈱Ìðy\gÐ[uý]ó^îì[ÄctùSSì~“™¬+n,¼w:è*r§§*OèQE³v}˜Ù®™¾7Îw¿ßäªØƒŽÁvŶÉu5v;`M6sì: O÷=½LüÖ^^D-â¾x7½ÙmŠUŸnÒá§Ü[™f£jýº¿f…Å7;ú?.ؽé®o>´·ØU>­v|=¦ÝP’Œ!™« ¿çï^Á/gºµ—·Û9Ç8£J©µŸMOÅØ&ýÄú ¹ B\”á]T67«—?u£öØrۚΉûZ=«Ÿ«‘» ªÆàW[ø3õ§X—)¯µp3«-±ŽÒwÇDT)ÇnËî‹d`w: ÛXÇ÷G¯MoJÞ=ÕÕÖÔë[ºVOŸÑªÑ?’ÕzËWLáXª´É[­ü9…Ly+½»e®€ðåŒOKŽÚ€£e‰¯tô? Ziàwê ðY#„‚äY?õiñ R ôùÏm‹mÍdPþfz‰uÿ ˆŽšå~Þ×¾ð;—3À[…)À¡Å'ÉÑ_ò‡_D•e}ÖÇ)ëaî—vÀ5ÎÝYQö¿âùëüÿ§Ð? ŸåÿVèÈüæÇþ/…þÌÿÓb&¿üÐB¯Õ Å;´çS^ªCCŸŸ’)¨ußä䣲Ø<â>ùÖÃ3ªéxe@¤}ªú72Àù‚žP•Èx]Wâ"º‹u3¬¯_Ö–N°=1®¿?žŸ¤WÛßú–ß x …Ó'€cd®…>É ÚŽ ¨C÷ ¨õ>%ú€Œ @Ã3 [«´ì%µ^ꀨ>¸äh?Æ µw”ø\qæq¾gÂÑ2š‰ä:¬ƒ“õX”CíáGŸ¬w—;™lÎÏüvõ„L¹Paõ¯ßДJ*ä@í“Í×ëÃ&!D¯ P|·»‚j'W¨vŸ…j#hÊ{ÒIÆ¡7ˆ'ª0~ݬ¶ú*íŠF4{䬰Ñ:¸u¿±»»õðtÂÞYØxë\ÊðRòuþƒü:ü€0òPh±…:׌è­oá²:t±lZÞÅ€Vè KýÔ:Ý@­›j½ É©õ¨A&WÝsqÁF¯²„M¢Zé4 µõêóK¨ñ̃ì#8ߤLárz±)ÛKËÕ;—fûÃ$¯þ¾mÌ©î`3íø€ˆž@W(4qÄo…µè( —Öí®$@3Gª=?㦢¯»Ý®¼**֎깓6’üdy endstream endobj 26 0 obj<>stream J{lFéu`ço»aÿ¹6µàÔ ¬Ý1{È›ûQ㬻Š>QÜR}8ùü¿2™ìçxP*%õ*\ì@Ž+}¾Dâªrõpš\”pOé3 Ùlnñ¹fæÁõw\ÐvG÷á4£øcڙߤ»º½–úÂé´TÜÓaÐ>owÒ´¿pf×ÌÔŠ;{ÑZ¥·£_øAþ:ÿ'âÒ€BùÞ7}WýnàQÿVÓ ÈuoóÆ0Îû„-;ågqE³ÝȂ秼ÌYõªbޝ iUØàCã1‰{†^»áùÛ…¿ÈÌà›éì(vù]Ü»ÿnlºÑ@~8º€|‚cñƒ¬²»9*O´Z³ïù%y¾ÖÁÃsT1<еA¼+Y+Ø’Fí™¶ÚçRv›-߈õ~9Í›ž6©¯.²Ö[ú³d<ì…°ˆ|ŸƒÔ´;7­IûHzeFß]gaD@~·Š ŽÚ·Ðö ÍþŠæy&äj;9‘hsÓF‡ã©7¦OÑ}Þ܇p¾Û«Í'ÜÚT%^¼0%œN¯Š‹a<ÉmañBœæÂðkâ2oëŸn!NÏѶææð¡$}xêöüÖ[~: _ŠuP@®~â7{D”Äéæ368#ËÎê²Jzîñؼv³®âÙ_¶NQõ×ã¡ûXMq$4Btš,–R%3o¿®÷²XYsB_ÃŽbovÐÌLbÿwü ÿt5åÈîý ûP íPè_€BãåÇ=ƒG©AÜxPØB¼=9Õ8ÁPbs(²ãÄÅÒÞÊjŸÃÚ³±Ójúj|óc‹ÅŸoz™§Þƒã­†·¤ìŒª*9U²Ÿìô†e¹é­ØîN•ך–F\óð• í9~>]ÀˆÿÔ[v¿…¡ß Vò×…fƒ ägÓñu©´u,-V;-.nìn*°7#~ë¬î¬ £éYpœo+µ‹¶{oï3«„ÓÛ"õQ5MÈá¼Z“CË…ý^m9´‹Œ¼hb?4å ݦ =ûE6Íaï[úk¿Ðû«õ,!O¼{®ÜËé‰p¶Ó/è[”Lsî$›ër»»ikóVå¶Ð7bì¹U˜î´ýÕ?ª£u™–­{ /³x²z­Pió>—¤Í‡iKvÉJŸò¡!}ˆSýŸðƒüíÂ…>0(Ôæéo½e¾óÙ2¹§… êô¨ÌƒŠÎ¥[Thò'|?÷U,£Úœ¬èz[3–¡ŸZ-:ÇôZ;œè­zÕ¾;+óÔó'<é*q õùõïan,(HGIJ=VD¯RCD]©ö€ï|y„ƒg:F¡œûÖ[òß_æî*~ö[·°wË~‚‚¯ì'ê'ó†à2Öv²=ŒªYiEºÁ>® }8ÙêMñMeçˆÉz7wEwIyãÞG¹ý9 %„b¸a„ëýe”Óªõ‘xìý ©­¡Ð!\u›y7€b ¬_K3w~%øO,È1Fnîƒ7oÛS~ ãýO–Ëêv:ç—3m&W&s%êšÆdsz™â°Þ؎Σp/”Lí<{Z4hì.(«ýú äÓíaµ…4†Õ"RûWü rãzÿYü‘›ùE8 ¥¡ÐQÎŒº)Ì äîõycfGÜË]°² 2«ÎÖ«“ƒUèmF‹Þž“´<]•§õ[y:ÙÞÛ3QZ‹‘\¢Ìï7¹ ¶Í'½¡×ÿ 'Ï~F43=§Q®ô·dÜíRq“g©ôŸÇƒè¼ƒÜ-Á7Îñóœ]þ Ïáõ`ß^÷‘w&RDjV¬œív õµºv;Æ–éöuº‘NÃý{,§Ç‰(Ž9yTÊ)³a#“6øu{gõ³+èŽ`ú4àFY?Ó= ken„"}n¿‹Ù¤‡ÞâæÁõhëóy¥[ÅÊ|mØùô^±ßÓ3AØöáQë'nwØ!¶R•WLaМ ÑùAÔÇûÞ“·Òm z­ÇhTVsÒ Á•)ßåK‹ÞΊ-nÌžÝBöüèL‡h¦S.¯*©*;7²Ñë\ŸùÎïñƒü: aãl¥@!·ª%³özø Á¦s&ð¨ÐÇÄÖåòòs{M3fsÉÓ‹a/ÏáÑT:²ÅJawG³N2€yeÄgµ“ÒîÊ¢{-TaüÒ¹W˜SûÙ„íúÊFÙ—Ðh°¯QNe#ë ´k–5øÀ¦Y¿‚pPPxÄõ+[-‚¹odõ*cdÇÍW[ù¾¼™-}—,öþ2£Uè¥|vNEò:‡Æ¸lQÝaÒÕ¼“ÎH}‚ufÜÄ•ÍnyÌï:5Y¸µ›3°fúN1¾Òb¶%bÁl(sʬϲüƒü:ü€žosÒÄu))7æß·ý\cbÏZ½Íô«õvw\P¨s›=§P±¤ð#–mroýÂò×ù?áÄWDÅ]®Gâvì…ãÕë«‹ñ¤µÇðU™v#¼!]†…Ö(šÉÝaf{åûÞ¸3æ|õ­tkñqÑi~ŽöÒngw»ïlæx~1Î8I3è5C´„QjA³Õký^F‰RãbœçÂ;í@T½?À®¾¦ú?Èvœís«V?áæã^2šôë¥ô“nJôÇbF0ë,¿çßxO.LsPZj›]¯Îr˜ÙfxÊà[BA›žª«Mú©/—¹³mâý¾î¯×zù“„?HíaÑŸšÞkãÕh'ªÆÐlBxí?ÀöàfZ«æ^nê§Öš‚«§È{Ö>õ‚~vß§c_¤¨ó7¯k7( ØÌþòj yõÝËÒë²®2L¾öØ4ʵz¦Q¯|ƒ­¶°^¿bŽzB¥M)Jy;™ÏË\ÁÝ”3þs_â«©Dîñ¾ÙÑÿqá/¬B±¢ŸèyyÊö«Õ íì#£üœP;œrþ”P:M Î 8lÞ"®Ö²!×FÛzTjd§a¹ O•6@?¹¼oA9s=G%¾tLJhà§‹B킉(¢ Þ2S,ˆ ]Ë_64“—»lb8ü¼Ò_ÌêÛß¼¥eß>ë§½K€(0|^eM9{ÅAVÚ?‰2ÀçÞàýÌàÍfpT€ÿAbä¶÷ê3£6À„¤°*:ÕÕcoõ™ÃèU®;‹H-É˰vÉD¸þ þú2¿ñþÿ¥Ð?ùƒüFèiììy„B“4 ¼ ˆårˆ …ÆÛ' ̈v«ˆ”ª@­¾ ðá|Ò…[SÆ¡Vó»÷ –ø-¨6á¦~†ë“„ló8GøFä»ú*Ô»uóÙL^fð±¬?ÀÛC(ó9uN~3WИ« \¦ ÈìuÈ·dωæh@ì‚£AËF;€‡…Àm>Õª44/4%^ˆº`BN„çG‹sÃË*R—¼Ök$œ÷¦°Þ\~°¹£Ÿêúpa²‚B'ÀGiü9 Ž s*a -Ýä9áŠP«úÝÓžØ{s¨ösDµAµ<ÕêE¨ÖiAµÉàEZI³ Ô¸3æÑ½.|³ßYëÑn+V‰«Ž¿÷ÒÛë,–ÿ„äo®NWOiТ‡lˆNüÝÇÁ‚qÞ³­Šô\@Uk¡Z†j ‘ˆ{á ˆlšDU&¡V½µ:däo…$¡Úûi,IÎ2ºë•UX_?¡FuäÞ¾¿‰òpsQ­ÏòÔÚª³?Àe’‹oz¹ód.ÿ­N'/Pmu (õ³ÔAMjäÕ•Ž`c0ˆ5 ‹µ[âjŸøRÈq¡ü*½nú“y•–‡^4;ºbT­]ça;@…~ïpÇ7ï*›‰uz•9ã›OVRÚa¶ä?ÀÍl¦•Í7Ë(=¡) *,¶µ÷4@c,ôù[^PïLPZa’H2±ýAb%u¹¼Ô•‘DzŽAÃÅá{Æç[íÉøvû±~.†µÊAÖ›¬î˜{¼žŸù–íµ/‡åÁ팴=éãWo£Åò×9À÷«o²¡Pg …>fÔÈw¡<ô[a½¸úŠ¢€^vÙ¤P+ȯ@ðÖQƒmž@~FO8IñÁﻥQðGQ±z“Ô;Œ+¯Jï0¸ÌØëôÜ@0ûȪ¹'ãã Þyפo£¾ˆ;ñh$'ò0 kóÁ|Goù¥Ç^~ž>n‡õA£ój:÷€õÝMªxûnlŠ‚üuÕŒŸHgô€Xöuõ8?ó¯Œ}¨Ô¯-3s9µ)P8¾\a~~>àÖ¥™‚njŠ8 ×I±"á1ÝQa}ä‡5•ùÕ õ7±éÙ×Ú©‡–V ç ·F6úr“óÃòOWá¨Tµó>ȸ[ëÅLÂIÿºIi’—¯ê+lF‹dˉYƒséÂMRË¿G¹iÃ'=Y¬ˆrmü Â]¡˜Á«¿âø¶Õõœ1åã³êzï¦×Íí¤+>n Ž$Þunø‹ØÕ %ç ò­äû[R‘Ì3!âL×ÔU(yÙà÷MÓí]‘:¬ïÎå±L‰3 ç*­ì42J¸œÖh‘îðE!x¸•ÁjL5ùôþÜí âñ°{æšJçÆ°«Ni³ðÚZ.ü m­‘n´ƒ|©ÕQòTõ‹ÊïÈ·»9 }B–¥ï¥ŒN{bo©*ºK†§®½§;êfºÓìå;”a›ÞH/?@î‘ïŒ(ei\x69j`^žsaj=’Jwºòô<ìTrö´]/׬¡#'¶Å-? È϶…\{ìb·dØÅjþwü »¨v¹ûø}{X¥Ã çW‡C9\œwLÔyÛ$3ëÇm8Y~î—õ\Ìvj$쮲“¹„â9I½G5¦‹ 6æ–ìï¦ÅbŠ^ðíw§Õu·SMf#6¶yï–Ó%ž7&ý”²-Ûæ:LÚ¾HLø? çêåŸGë½V6LØ_¶WǵrM4k¾VhcÙÃ.’~,¼M™Žx­ª—Q]…ÃTWúðü¡†÷NH”çdÏ«w+ʶÛþŽ,à·Û>ø[†;.LÖ¿[þ -þ}”Zh4üâÊ®}ù馘'G–ƒ‘a|óÉϬ5èÖ©lI^Þ®®ä³x'œ F\k´™Oc»¹®ÄØÊdÁ ÁÆi »ï{‹È³Íã­Únއîâ þ~¿Î¯ÐœŠ]kl÷V·ÁÚ_Úã冴ù…|!ZM?Ô§·¤É§ÐU]f¬Ô„'ŽK­W¸3f÷±(í;‘YòÛ‰•±Ÿ‘b9¢@üZ¿ß,1èµÏ´„ÒtÐô´Òk±Ù¸,ódžÌÌ_ÂgPƒÕ£ˆ[CÛN;ëéìÓ6¬ÊžÓ I >‹šÈ¯¼o³ˆ¨Ò*.°ñâ÷ƒR±'vµ®Þè2ídKôØ‹ŽÙÌ1£2èù³l EÔnz3ÂkŠÕfи,ºÉ–î«m³P¯¤üfíaýšÞï+?H­ŽÎÀiO»­µª5ƒËc5mšyµ¦ÝùΈÙáy\ó·×afóôû"ÕyråGwšoZ Ë!Ðbè -âö*6éǵú]ÉÏÔUæÀ}ñ 5½ ”jäfÕNn+ɱíUÚ´ø(.Ûwy+?ñ2W*–!*•Åòë°¾.*E£»t‹ZtJ²C„eIÆö¦è§¿çÓ ÎŸvŽÑz¬Y¬Ö^Êíštp÷ê¾aÝjõüQléUm¡Ò§b ãLùsC ùqî)9ÓI¹„>´VQ¨¯¸"ñº‰‘ Õý¡Ìüe;8üŒ·;ÏiÅvHɶ®åÆÁªÔnDèÓ'¢G˜ZÔî²ÛÞk ¹F¿qÑÒ£z9ÙIU£7V*æ°«•¹1/ñÅdYÜÏ’M‘vAlú»üżxùbêrÍ©½K« IBëB*M×É"IR½Hµòbóùuø=–ÛOºô–Ý¡.À¤Í`a9 pjSx œVVϦ€¹ 0e]Ø05X¹þýB.FÈ[€~ (è©ð†P)€Z~   ´ÐIyÐ~Whs. kê×ÉÀ^ªu›~…Û:ÀXÃZ÷g¨5y,UOô©ÒPë¥P›øÖÁ¢‹æªíËÉpßTcšKÔWqfQ¹«jaoM€Õ=(Ó½,–¯íž Q€Þ €ß/LÁÃ} ðm+87'¡m¯-€ÝÈ1Àvü‡S>ßп¬Æ«@#õ”ì3 TË*É0)ÏbZ´È/z¨EÜü¹Åù#é¤fß|2<ü+Æù*@¯|ç}(´š~ü¾ÁQ*5!æ †¤BŒîr—Rm€ç+€#ê Þ{ß÷²zÀ†¡€ mhô¶^†’ýÀÒåI²_°z,É<òú"¬9ÅųyHÁg~šÝx9û=~Éü¾—«ÿ̓k€¯«! ŠgJ„{ŸâÖÞbj@”_E€?‹=€Ïyà :ï_^Ûç²3¹ÔªÂFܾ|3õM-‡Ñâùf¿—a-Ê­fÅ]2[ÞùòÈð®¤ýО¯è›µ½K„dvÝdSÙ߈ñ?€ØçÊ€h·ùoÂ^¸åÀwлøPíçÌ,–ŒH,ŸzX=oE.Î åiä¿DóE©Mð9)Û»³êl|2—^]åµ=¿TúMå`,öÿÿ ÓhÖj\¸y€àg s õH‹Óyòàˆn³€lr5@ø²Á4ÜxBpþë–«¼~W‰Ég¢Y7MD• ^çņõ3z¶&s3ØZÇÆgëZì4Ó«¼W½uVž­R[ü=¶ý@™ó²ùí/ûøˆËá»AÂ,(²Â+¬—€W@uD¡ÙJr?zù«¬=j'; ï³ó3žTƒ'£âàÑ©ûÙÀb*ÈŽê7<δÌì–+~3½P¿ðR 6; ҇ɞô•Ñ.Ÿê ~Ø*QøöŸÝ5l•yh¶zê»ïÀ½ (UÊÿ˜€}Â#¾ùä„oDÏëk¶ŒÞôñ9Åæ#Ã.ö÷B_ü‘m7Iàâ«’Ïg./Mžë.R9µŽž—âí€ÙéNj§%·”; öó­õ¬8Ómÿ…ïÞ¶ÿãÂ/@4lh•ÉÊ ºm¤¾Á@£û ùæÐÆî«i‹§\ý¹©I½GöyžÜÉzF¿ÉiμhºeŸâMãøƒx4¼­çîqpw °?l tO¾¼Ò.÷iŽœÙ²&Z1•ðÛwÓç66i0d®7(“Ð`ÓÔ ÌËèû¥<оŸ k× ¼ÌБf%Å¢ýˆ^ynn)ªqÛÏë™áå¹ÈMNíAiztú›ÅèÖ{\÷&ëG'è¾6ùØn¨3ÔZ†©Æ¶³¯ÿ'Ÿ\äÌ£“ žõÕ¤{¯þpl/@{îw[@Òó  †ëïç¨ô_;K 7¾Ù¯çHóÃì Á~_ÎO›—fµÝñzn£¦ãÝ5)n%Ãk¶‘ºÖêfm·]n´ßôKÛz7–ó(ï(“z÷:«BmÀ,Ë­jÍÐÊ"ªVKÃò· p@*C‹&g(t|€ýewýÚ:Pèx2I”nlGËóäúD$ôsÏcyêZ×éªç”ÝÆNÛn{ôì—SZmk-m3Ÿ*“×vœ›ãpµYMö“ýrjM}ãøi£¦.Z‹æiSŸ›ùEyÎÆ»¢¾eW¹ßã?2‰Bhòøò¿e¡ßß’réGä‚WåÝ&ì$ÍS0\â›– ±“5’sQi”ÝG¥\·WcžÝÚ)‹Û`|`Š`1^ÞQZ1tñ¢/ŒÁ~37kÎQÿŸHçp³ g>ß(Iã9¢¨a¹Za¶¿Öèßö¡¦ˆþ ýd!ûw¿Pæû½{åÕ«Õ­Ðû{aã„—ÕJËÉ·vtwïħ•K*[;yÕ×Çi•YÝŠZgY-døÅ²®æíc{ªg[ØBê˜=&­›ê%WD=’*Þ·y57ÛSÓkÕ#ÿ ?È_ço³P¨[€*çîß#‰ï‡Ï™äƦ•ˆMâD¸·ÇE¾Ÿœ,yŠ‚&”óâ´,¯|úV7Âs™Y0žÙÕ­ û‹†%‡±zšÏgÓëP1•»hyÊ,_y+³>Y€hå”*Ê‘2ñ{üWæ¥djÚ~:I{÷Y8Z››vñäz¨u5@ëê÷c´ ^óŒ½I±Øæ I³8läh=,Í?ì?ƒ3Ü®šŸ÷J@äeyî"‹ÉòXr¥7½Œ&ËÏ)èd²|bÄ„™“ØïG¥þvöŽûð9J%Až™¶_½?±Bsêß—‘y¶¤ûñp §·y¬¿-äúÉÀþ’‡êr^‹©E{QÈë|].ÏÄô³>õÉ«ÔX¼?YÉGQê¦5U´ûgKDÕ@ì3½œh+K âDˆöàŠþ+~_€«C(´;rÈäÝ x[“ApjgÄÛüíÍOxYrö•}ùf",ÞŒ^j¥5ÖÙÅ»hcº;虹©jÎÊrtË7¥±ú~-Ë¡úƒ1t‘•ÑØê®„Kþ|‰™|n4ŽäÈË °1Q›!¿<§ @næ;@÷¼È|²·vÈÊÝä®lýÁå ÊQzQk÷gK‹ßž¦oŒc#)óŸy¿:Ef纉Og‹+)/{‚dÕvë°­‘h¢=¡˜{ˆÃJ9³èzÿ0¬;b¨®rèJp„  ó¿èÆøOVŒ¶’öóL.~0«Ö;g¿Vw:§=yöÁál8é±ÛH½ÁmU_7ÃW¯Ø_ÆI-5 Þ\V^ KL²Ëij|ĦÅQ¾Yh gâ¥=hàûÏd¼Y­Ôöýõªœá—RHñ¯‚ê6…üßß’úgè1Ïlœ0 Ë/˹(‰èR_©ÅËç],/«QÏMúã™5ìr–°¥³Ñé}îº@¤ª§4“K.%9= /GLðÓýü |D~¥|ëùû]z;ì!sÊí´‚Ë »ñ»×/ßèžMÜð~º¢¿ ìЀ}(wú®ê~'·+› ¤Ò3sÉ4SàDª=8Zîõ(nÙÎö#m {°\®.Á~>,_®³Ò fp %WM’±ø©|õn#c_&øT6*õøšÑà ÷»bÕ›v.NÙîÈrœtsÙ ßõê1ÅõÿA~þ€¬•L@7„ È·ék䆻“½ãe€ßUf—qÓéae+•ÌÁêÕXÎ|gºÑ Wõ $é2AéÅýOÞS¨^sÉ€9Ûé¾bñÎf ÝSôht”٥מ-… ±¾ÅÎxÜ®K•ö}Z*tŠÓ<ý{2P¾;ƒåR—»?åìõÉÅ ›Ã­÷±v†Z>:ö y[Ô')˜¡\o=½!i×}m1]ÖêÖ„ß5öã ˜^„zÙ»Ú¥ö«Ï£§7çõ¦h·à±ùöcP¨³Ñ¸ÙÿA˜DO³: §@ÆdÝ“Vmëòï¨åÝÛ@²Îݽ9;(å–î²E Ûؘ³7>ÇÆfóR„c²Ñ¿¹¬^݆Ó$ûQ'»5¶ßô†-4ÎSè sѵwÅ''­s s¤=ßžóìÒ½5™õñ=dÒ¹ªÖê-­} ΑVÏäš-Ë4º-‹l·~áùëüoô¼î^g]:æð§ä¼Ó±E¨ e]Í–«TÓ|-„ÕˆÒÔCXŸ¶%¢;!‹•áX®§ÃäM­™Ävú$Ò=Á6vÙÒn{$íè|BÙÄ¿˜ÏóÞb2ñkÐâ…ºÖÜŸt·),jIS0èzSàµASÀ&üïá+Øvìkðƒ¸-+èmÜ´oÖk]ÁèÅlžg±x6?”Ò›Ó%)ßjÕGóÛ¦Kù7oJO²VWNN˜ëŸÛq©û`ßµî‡MóÁ #±ÜœÍNóØŒ¤¤I­ ËÆy´»6&ô„hä/ïV#¿,õ~Sïµì¹ÑiÃnG|Ô\E“Y ò*§UüÍZeGs õ$+–ù6ìû»r tШõ.…3Û}4†½Ns[·ÙkSg»AmÍ8µî¡µçû~‹8Œã¦HHã²ðKBòa¾ òGõJZ›×NúPÓùc¦¦JÅ¿ðƒüíÂ/ìËæ™ÝŠfeš•Ê|´Ê³ê}ÝTúññ(]}©ûÇ0³Å¢¾HÍÞ\ùId;s!Ø-/æg$ÔZû Ç6=µ =¥&ýäÄF!n«u•ÌzùcB…óüjä& Ú"H¬’x|©bŠÛv¥§eˆ£û{X<¯—V!qÏÏ÷µNîQçó8?Ùoß5Q¥TS`_‡/`Ô†ó§šå;vÛߟô$ûMoÚr=ê*ƒ¤k ŽW#ûMW[Xº\1GH³ü9ç{e®Ðø.Ýh%¾bY?Hq?¿zE¡™}@ŒÒE"±¨ß:.5ß]B­ï&ø„(ÈqíæŽ‡™õ{Ü»Hô°[‹Ô!û±I‘A=WþZ,èÍê¾QZÔôNÚ¬¶ó¶Ò&l·ÌåÇ’£h—h÷¢PÓ¢‚g,>lѼÜñò9ßŽê¹ †rôãÐÓúhªÓuÊ^ÿ ?Èß.,úé7¦ê+‘Ž#Z\†¤Â•ƒzµÝN)%=ÆÅ&}_Têå¤\«\ít4Ùræ¢rÅý¬Õ/x‹â01³ã|1•šü 9•*ýp_PþZQÆøµ%“kjO¶KØ•ØjÅÈDõ7î £`–ÿ=ŠçFÑr @Þê +ô»ËOC"x–”+õWC€( 3é ÐQ˜h­T0bšq‡‰À ¯Ê WÑ…ðnÙÑo3‘4²/tb6yˆáÞQÇb‚Ïi!¦–—þëÌ8½@KÅÿ E™-zƒ³8ÖØ<6¡1€õÇu€5Ï#€aÕ5@ô˜Î~ŸEcJ/;íÞÇ­c@s-øG9ýÐìåP¤’H¼-$É0ñË}ˆ>¼ß~"ÇG©0yÞ(ºi*MkBÿoøAþ:ÿ¯ÐM U¼Àòì`ós°s‡Ø4¶ˆÇ“GÀZ'hhœB  ¡.|Rí)TÌ- x  œq‚ªýç÷Y• @óüËÁeG%>Zå5a.r4íÊãP“냰VÌõÿЊ(3hMzL€Iã#Àžñ÷ ìxuJA ÀéÒ`ÑÒ˜à ªð J 45~ô‘…ÿÚ«Ãf±\€ê&lâãP©¨çÔÚ/À¿k¡Â'­¾ %g‘0ýAžV” y¾î^¯${I4À–ëÖ7ŸÞµê$@çF#! »Óº?ü’©‡5¹®Ûjð‘“ 3 ïN¹Ãÿ¾;QÀ|Ým(t «Ð˜…5 CoPè}QJÁ|×Q3' y¸Ç¿.ZE€çî€Ý²ÐЫú*9-7ôö%ö®íg,2Ü;¦ÿV§ÓëräRƒP§SÊÓ@Á"øÌÝÅÝJ3¯W'7‘†·väÿ]ò"|çÎ7ËØßü>‚w?€p¥¯Ïµx@ܲsñˆ¡•øç^IÆÙ{/–6KéuufóWñ.m#5ìÂ'Ú¸…ºÙ{=£S7ól!“üÃdÏ ûºIwžHÏ}£Œ«<[MÏú~ÔŽg¾äö¿ ®(,w™ý7ËX¬B5¯tܲ H)+@ð+ˆý-ñvw$.¸RñGÒvª¼Ë3†qÊ<úËGûU³ƒí›ðîÎ9òïhòˆ}|¡7oR¯^ 'Ž??nÆäd<œ©—RñàÖR½ý]3{r?kþ+~ýš ‹ à¦mÂQüoEð·pùYÉUñ¶‰4î¯Y]J‡/:²Ïaý‘!2½û®¥ýÑ"§Þ¤òÕ¸]è{>kÌîô‚ÏìªB‹µ'SôÈ aóÀÛÁþПw¹gƒwînܶŸ]·çÚ¢ò¯ø¯Ì¡Ãø3´¿«ºƒo=0(¡ØÔþ».)9«ŸíKcõKÈlRÉ£Gv±» ™ÅÛ¥“m]‚G¯{ŠgÇ·NÆÒÑ:5gwE,÷‡qbíN|äírôé*rfÅc?ß“¾µ¼4ÛÛ5 [;å—MÏÚÿ}©"ÀÉl| ÕSO@ ¯ ‘tó#ÇåùešÙ–÷è÷­èN)ÌuÖŒ‘¢—±ûµä0ÜúÌžz‹=÷&GNPyÉv˜¿Î­×ÇÝXLýîm׫J²±¶.¼óI`׃¸]7ÇD¥²:ëÅâjRÇòÿ €e é;ZþJ79y(ô‘ ågI@Oöl"·ˆId¬ ã™-åöw‘ìWÍè‚SÇ«fØ™Å÷9ÎÌ»j—¬Ø‘°nZ«ÓÝntd°écgi½«5óX8n~“šá×U~±ÂV…̬¾,¥²¡­GùE”îQƒìC¦›æxÈLÇËÇЊuÐaÒŽ+j"†)Ó~`T}Ù7õ†\OÛžó<˜ v·ò#ëÌÇn¶”ÛrL\ڠ΢azU¶½š¬’þrªG’¡)Ñ|z´»hæ6ñ¢9?–æ&rÎÏÙ]@ëÛr@@„Ðÿuø'ŒÛOîk @v•= V*ºàië:ÑËÚ¡çSŸú·‚»¾0ôâxÜ?Z·}aÑ…Ò[SIoÜ厖kÒÓ+ÙJŠË aÔÑ’kÏ“qe øŠ¢g:­•Ö?_nš#9¯³´†¾ºÄL`šûï€]Ý›À>´ú®I$7ÖP± 1õ\¢Ð…v¸Žõ^0.‘ÒMæËSo]p9œÜz9¼[Ûtn† |¿å›^ÞŸjÔ?"5²¤oϧºÆ ËîLh(‚*²–þƒL/vPsSs#˜^)›Êg8ýÊç(ó¯ØÖŸü'‡C§# ó^rU'W›QóÙ'¸ö½0z /«˜šý 0ñ7»Ùl½·×ÙÅe‹úÆÝ¼à§h(°ˆ‡rzÞQR¨æ.fÔlD2e5·BšÓ¢ŽðJEÁeY$K~N¯¥’ð¸ü4EÂÈ@˜ÿÁò×ù_0–•± @áOÐRò¹uTx5L§únë-¿B={'§»’…²l8q¿çXÙ€õÖ≻­*™Ùc‘ôŽÑ<“%¾ù±!µÎ¨çJ Ÿ*n˜Wª5»6yݵŽÎ+QêÓ¦Ô±ôÎ=éDzÒ¡?…“2Pæù½„Ãvþµ¿%ñ¹w¦¾Ob1 _Ùêu‰ÎYOàû£ÝƒkéöFÍo6#û³[ÝWØÙ0îÕÛœ+Úø/õ‚rïi9fåEW£&Ì-IéI™¡)Œ§oã‹ÙCDŽó¬ˆl¬´Ø ˆèßÇ$ZYþw2Uû$×w&÷tzοO…³%¥+‡kåÝV)¥þ Ê«u>ñeC»©Óû¬re_½„ÆSyX©Xn«´´Åš¸ˆ6¢ü˜ üºpv=N(´:¼=âóˆæ™ìˆn R£±¬¿!Œÿ?Èß.\-˰³WM@#<:ê~âêÙÄBéŽÜÕâ‚in_EöÛJ[ÒF,ió•vR׋ÿjßÊܯ]õ}¶Ùu|Ì;eÂ]>„–…ù½¡y§YÕHnüjŽÎÖl¢OwÓZúrš¼%ò*!5%FøK¸®ö©aå*àükÜ*öϱýÔH÷¬ZÓþAú`dø–ŸNñF’{ó†O‚ “)ìCk Ð'/ßu>¸6ßçœvGo¬P}­²ÏÚö UÙH'ª·|Ý3p[dur®åšÔjªXKf}c/¡Ìó4¦‹½›PFnÁ¢>IxæXÏöÓ|1Ïí¨b“Ã'ê¨{,ÒnÇmÒ½ž÷Îô¬SêÓ³¶ü ?È_ç°³ï4@)w'Vwâõº‹¯&æQ²3ÖþÑŸÏ´¶ãóœ6k¥c¤­‹ ±ÓtúôκÜÉ ¦„Iœ=ºf\81„¥Ó E}h±-3Œzý¨•áˆY‘î\š•z§`êBÛïÖ—Þ]z•F»cåîoTæ_Hê­Ãq³¸¿Ýž|rR‚z¸²-8&ï¹ÊÂÙº¦c Æö±®Tò¨ñqúUÝ+ËœªÙ³±¼QVS 7/óÑ­\4‡!¶¶ù7Z:ô{õó•;hÓ°+ùT§rT»â 5v^ñ†l#=Ù°óîö—våÑ ÛªWBÛþ§ñïä±±ó=?¿…ÜèHWÉ}$Éî÷ÊVô¯æºšy˵â¾ç£Ô'7«,‹-%EV{°¿Ý©8òçž:4rEƒßR—/ß玟9>ÚÚzóa ‡bV¦_o}Òe¡µ9‡ÛÖæòú0,·Ì1+΢™X\Sÿ„ä×¾seq«ØEÞ#ð¿«pÞFÊ›þ¦°ÜŒW¯ã[7ìeg7óh¦±®tÂgYíft}~È”·"ß+Uf½Qá´ì^¥‘Õ™•;^»~Íð.@£>LʨQ-L›M·Œ›zé4ÙYºéöÈ\+Û«[ÙF1ÿ¯†‘18õ–ƒÎî!œÛvV/3ëÛ,i/MÓ‡ñþ_вæ›çƒj 7/Ù§ÒâEêP£ÚeW|&Íê‘У5YéNA}ѩ٤Å&ìëÈ|8ð`2Ãtª…ê¥\søµs"!Ú 1ŧãç%ÿƒ4Æg´ú{\^¬Õ9 7ÆæÆIm­,¸Ê’µŠõ9é‘íYݪÓ1>OFÕè1¾ÏÛÿ]gº¥ªÎµí#¨ƒPZ±o°ïEDQ¢çÿŵŸñîñíQëÏEªŠQÜ$™ÉœÓ˜$Lq±±µlæ†)®þ`ƒÒÛìö"SaºêŒå;»%«¶÷+æÐ²6¬×"1ãÕÌfNXc±HUê××`Xç±T/3ç°^î51úæ %úvÊô.f®ß<|Ö^ewå}Ý$V–„ײQçŽRn¿(¦óL^´üi:>E£ù¨‚”`=YW²1(wl·ÕÆ›ãq+Ó,šó=#5²•Z< †µfÔ—jÍGÁ¯&Ë-qÄÿ 3)Ç=߈²Ê{2¤¤\ð¢„vG ÎóÕœKÅÖö›~Ô‹>fˆ¶5,úw§«Ók·‹£¶ÉÄ ÅNH3ª™Fñ)ê«ö†¦C}×­ÅænRk'®ªÍžjåãQÇŠÁ1÷Ê tJ—Íu*±ê–Çõþöûýýº°ÿ+tgQj»œÅ¥£ãü®Ž ¬ë“ ÚÌdœ¾³C®PaûtìpÝnšÛcŠ›Ý58zgÖ+`qú®éM½Z oß«] ¾»±¨}*ˆß„¯Œò%¦>ªuÝ/æÞçEÁ3H¥À †ÇB Uý|pÄR5ü¯PŸü÷“DiÞ]"¼æ?ì²8HM»~ ±î‡ëV£ÛMíè6î”M¶C°USÐõÔtRMŽ•´wdY6¹/Ù¢³.eŽZÌ%Æ®Àu 3ìÍs.<þ7›ñ^Y…(•ø¥"¥ l‹êVÌqæ~„Ì'ÂÅ¿B:WÛ>ñ¶€-L“×ÄèŸ_\¤»‰VH·Ç¤Ž6s·úíc/«)†¨|Îyª<.^³%¦j‹¹_ÉF£š¯¢µz®N’­¬2ǺTâaÃÌ'xM3ƒê‹%M9-’x’ÝL·aáÎþûûp÷ÄÙQÃóxšøùçò–Ýô*o€õ `÷ÕàdhÀ¸=|—ñMؤ_hÂÖNb€uÂ/ÔÅá u;ãd²Ï _3Ëé>g¶û¹zí oùå°Þ íݘÒ¡¸j€€ÿ 7D³’x2j½ôÆ|.eËýàÇ•ZzО¢v>y2¹ë/~rG¦ÃÁ —²í`?êÿâûÏ/&žo×瀨"Ô¸4¹Ë€: 2$Yä{2äy'rþ¼$§+ñ~]Ä7õ¼6Ýê³Ô=vãja=y„[™{С ãÊHA=LÚ‚nïÇûý“KÛᜫǸßõ’0òs§õðÊõ–=7 úE‘”Ò_°Ýu{%Ãb|“¡gó›On-BQáÀ•±f ˆËd„ÔöåÆ×˳üXÄGµˆFÏkRÁÚn„©ÖªGÓ­ém\¬òÝÍËAfAè~NÈ;×eÈÄ^…ßg/ bUœÄ¢Úßìè¤ÞvRíVód¥o%›±gÔ_°ÓmTbÿ·H[ßõÀ1 ê½  §& †ûâô«K³™m?÷Û¦ï£÷íXBÉ`6Üý¼Ó¨{78c¹’{_m=w´ÍruþøëíyP9ŸNæ¢ l¦2ÍÙ©Fú.²ó¦Þs‡H_ÿÁöoÚyjˆ¹€òè»ö®qú˜ö”£R Kå;¯«ÎãFi±ŽRÂݸdÇ r+åq­T°Ôå%ö1gç'Ùóp`”O’©Û3¤Ûƒñ {ƒ†wÍV9«´d¶æÊ6œC}I¤öÏ¥ß?ã½oé¢Ñ[}2ú>rп™ù1 ÊLdPÈâü=>éÏiòÓg.q™A'~è—IÔO×øÛ¶>ßôNnk¾wA OÇp™ØÙ7š¶üÑž4ïÔ,ˆ^êþ–;°`T×#k¼¾ïÏ´5Ñn2±ðÝä8.ý`Ú¹3ÈiY#o—Hüù+®V¡ÐO²™æ÷¤¼¹å‚l‡ûž~^-¼*C¢}Æ‹Þ}ê¿æ¾°.nÜö‘ÐÏ–X°0›5:®윻Ik­ç>A_)CŸË¸~hMs»‰›+kg¼ØÞº©âx[hŒV*¿õmµ¼²ÞjðYå~R3 ][ òã1xÿY|/¿v¡9w3P¨üP¿'»A¡Gór£q†&·j8ž5Z'éc7YIÜùh.d{áë†UŽuhi%×0ÔÝMÇÍr¬9”ÿÞº/Wv c1eÝ®—åÇzÐݼ8f¶ißE1+!”X[—‘x´‰•8Ýá¾hO2iÑæçз™òðóÅ므ã&;¤ÝäE7tØ+óW[¢©g”J¡Åµ3ïß‹îΛgJ¿ŒÕÂyyØ‚@2°ð©þ`»ì¼flyæ`+‘P¹È-Å6©,¯M­ôíF¬œ)V¼ÙŠŒ¤‚ië$pË%®‚œ™~ ¥Ñ#þ+¾ó +Mà€4åaç°Í[P¨›OÅjÞBútf›qŽU¦bóÜ¢o*Ÿå|¸+a7·ÔÍV½wŠŒuö›wγ¥ampYZ궺䭧ÀéBúãWÊ2ËI¢@/ãÇ}²lµDƒ«É“ÛT…·¡dðÅ㯀ƮA™MA€]SÜÃ6gü?YÆG¯Í€[1u=Ùëð™ôy>¬5±Ü:¤®Å‰ÎØ­å6Ї¢Wueó¾4 Û÷âìW…ºêÁñaq›V,[Ñ_t¼Ìî«£;xê"ugÂÅݶGx¡ B{ 2Ëí dI˹¡rKJrDØœˆü°1 /ã´NÐ9ΚÛá6, ´«fªäx¹[˜J0~y¶*Îå¼.øÆÎäk÷Æyù§ƒÅ.:?Ù¡ !ó käg'éβ•µ8'9â6?ÒN¿Xlþ‰þ @f‚ïÙ‚×A¶}B÷æ-~Ìý~>\/¹?.gÇn>`œ,⇾p¨êY×ènEë4–ý`%+S\‰ìl, myÚZì—[/m/ÔÖ·Ëh6Ï7a»0K²KM…ܪ1-_sË©ÙxŒ{c_³¡Å³,пÓÏ쟬XVÇg=}ñ^TÜOó³…º;֩Ćp®4PKö`TÐ|ÕR^º8Ü ÷‡Ù:‹ÄKᶬ®¸g]•—ÝyyÇš«£9ÏûgÆoSáöI&k%Æò­^7Eo6ާ5gÊõ×´â2ÏiEÜa$þ½ühìEÚPv;gÞ®­Xpß·ºàûÕæ¼ÀÌݱþf.‡A€žoç²j¼/Õä¾9ì­ÏGa²*Ÿ´ßÐ(á[ö&¼ÄNšouv.u¦$厓¨”\ÇŠ]?JºÂFv…ÃÖ€¾‹ú¹ úóñøø.ÿWþ€J–N!7s;ëœçtmp¬§üÁa?•Ƽ.Ov•õYRµôö$ã…L,ú§&4B¹°lšÍ6¨sóÃi#Í~°q÷#sC«\Y÷£õó tIo…àÖ‰2á»ý,P¹¶â›ƒ¶œ:§†(ŸÝjŠÿ @íî ?ž:Îdö‚‘ø1¤¶íƒáäšú„-^}5•E2QÍèëRNò„%K³Ý$Xèá™0“ªO¶§YwœNÒ£á´~`ûîz´ê ¥Ê¶[{äŽF Úí¨ùié ­øƒµÒZfØJï fKo§­7?x·ÛÖ8ù+¢÷Ĺ]>]?‚mãðÑãš~éËÛ‡Ö­+ˆ_jK…|i$Šú`-´{y Úˤ.Þç×åãÍl 9ézÏòhì.ƒ Uè÷KwÚ-ßQN‚ÒÖ‚Õ2ìmÐ4/çO“(f ;q' Üì&Qæâ&Ašïæ¸mƒñƒýç¾}Êól´®™ ” ªV-l7Î)/t¾´æÀ¢.låýGª‘¸8öûy¥_p¦ å?ÇgŒÏ'ñ]µ·^LÚÝf¦ü]Ÿü¾’ËvúžUZX\¶š$hyoª»î»\_*;¦¾ä»¾œâQ}ÙÀ?ÌßqA{zõX{~Ê“E³ÛHâ3ÐëÑÙŒ\ÎY~ÊKf¿›³%v&1O:«Oö©ãiÄ8ÀÝ>Ï^Ô¼ ]%R³îQ¬µŽØk¯"Ódî¢Ð¸Ð–^¿¶.çzéL=éÛ\¤èê3£¤ZdÅj-–×ZÔq“ZTñÁ_aó—\y?:å³Z•íáòÐõ1qUè£Üž Qvyˆs3­±ÓžûZÉÍZøƒâZeíŽ\ºíĸµÃqÜ:N'éæYše®:)7 o¾]¯ ü˜^s_{Üž»Z“Î;Õ­É>«qDU>åU¯¢‡#­¢;w¯¢ï³ÿàû·|@ˆ<¥­Ø*—Û´(ø¹7¸ ï¹Ðͼ§ïÐ3øv>,ú4×§ãdÝí¦5µm2ã}+ãçí†'¥¼z wJ™xäÙÖ2.p½U:Ì\¾Š'\xêLsÒl»þ³Bõ}ÈÆÞ0€x …Ò=Ì€èóî‹ôŠñìž_EãQÝûâqÿ€â x{Lºd“-2õUÉÕbÃ)Vµ‰òg_…Ó(ã·j«”yP½bî…âç6ÉWÑÓ,'M.|6>_%*ñ.Õ-=™òIS©rÜR)MØziÁ±¿áûsY/®î“3zx4»]»·ñ(¸Þz’w<·GzúÞd‹zP¯¼ša­…QŘqQªqÑÙ¤’×¾¼óUDüäêÄɶ²œê‹dÆX岤¹AàhIâ/¤J0¼‰;Fn€çÑæã&ó5V"ºš¿\tŶc´šÒ@±w xù›µ'K?9€åª ÀÖúæ`=óP+KNâëäb~t£~àÌU¼’@GÙæ? {ìŽ2Ÿ°ßôr¼økz…ðRß~òg:]€Wuà©·0·áì°yLö¿;PaVظÑXk6‚°¸Äº]7Й§¯× ž ‘ýļ,’Q у‹Qc3É…¯F› ·Xƒ ·…^æ7À/×ôþ/Züi®1¤÷€Ø@È9£Qøºðà%|W³¾yð09>ôt’ÁõìkÞÕ+¯ltn?—…ãðY8úó˜ÿøB\Þ“»Ç½1¼ü`Ñæ£¾Ã¶ºÆï½³ž¿úçâm”;æ‚£"g‚éxMü°ÍÛ°9o7(ÓÏ`P‹€LÉ kŒ¡jS Ùcíï» ”†œP½‚õôŽ/?¤{W¬Ðk3ɦV‹š-³nEs|4öÞÇÍ=½Ã­tbÿ̬Ы»·³žÿrrn˜Y.-ÑK<¤~°KÌ2éß°Úw"¿šA +ßämø$pI@ÞÉz2G²“§Oùb\ËÌwÑ“§P{$áÝМÏÍnˆì† |!È Ú5®¶;W÷Þ{¾×^¸÷ÛL¹<WÏÙjàuÖ5äÜlÈ“¹äÑÓ¸¹HœyÛ¶ÝM~lqÊTóß=UÉœCKdJed¸ýd¬2•Ì߯³²:öÍNö@ Ü¬ »¨kä^¯ô&ôV§¸Ä¯â$Ž—qº¨S<÷ï}2i»w¹`nOïhûǹ'_-Ï«T^¢æRæê¾fUŸÅ‡¨ß{üØæ§. ÐlÓOe&‡-Ș³  ò©PƒEöY]ÞËQaO¾Kö>3/\ËoXE¯îÙpzÓþéŒ^ÿD삇M-÷1ßå1‹Ûð9s%̪‡Ð»‡zþºØ+cɶÃ.5½Ô=êðÔ÷›uøŒ‘ÿ\þ€—6 ìLf£»÷PôÞ”Ó}¿Êd´»rî>éÇÕ ôÝøÝ›:Fu+œŽçdcgo+Ýò›UÛ›ûG~îÕ>ÿ2v­)b¤f#JGGýÊnlË}í”ÅD’-G£bö¡eéà¥eûñc»€3ÖþoøøÙ„¡Œt¸o†$.€ÒoÈvVïXÎ>Òá¨ÐÁƒeÉ(¸¯ü†vPûз{8µ±Å™´pÙì_ÏÙÎÐû¤¥×ÙMöÛ@› óx»`Ç)õj±”ZzkuE ôÆ#ë°—…M ÔÜR¬Ðén$?U_–G”û`çLA¡¡1þg E· ͠ח϶žÑ§¨¾nóûã}¥å:éæÙÒvÊ;-Kl±Ãƒâ_f†Á8}ôp7»Lw®m]¿hªþ:v”uÉ d9-Å›Ws‡HïªUz2Ñ[ï[‘Ò¦{‘ú>’tg“úÒÎûÂýƒìßòüJtYñ&°Íõ¬Jþ»)cõú¤ÇÏ{8¦w?ˆ·ËÇÙ§N~ÌZw=¨ÔÑ1†ùöhwÊžçZž¢yuÕ6Š„H¬±¦Ø:l:£üEJÀm]o‰8­™Õ™íÑ«¬ŸVs¹x3³÷]œ¾k˜9—Ý/œßm¨Ôä4†2] ¨÷þûYRö5ö‰¸ónô~ñžbñêíúË.FSÂlr«’q˜î»3‰õ·W{:Q¢‰=“oÌoº=b#!þe·Æ ÕZ9å‰+x¹áƒˆQš¯ô¶Ení5¦?_1V>Ðæ¾P*žÿÀáƒ@?ý@ÔëP¨a•Ko@¶}µ’å¶åEƒQÍJ÷ÑÁM½Œó Z~dIÇ ²7zÕ´ÊL½WÝúò¶¥<êI_n÷¹©´Ÿ¥ØõØW‘ôdÁ»“:^'NêºþRiøÉ"ÑrÙE7µí-’ЖÊ5¾põýôúÅyùvì#ñÿ+ÃIhðݾº…ö³2Èò‘õHfµý úuã&ª31Z¦]nZ·X»c¼Le4/—Õµ=­ËRkK‡R~°&ûéjÁ6B ¼ÅïšÞåA]>»ks¡½æk„ó˜Eó&1oéÖÜÂg »ï¯œE¯‚{_œ¾°4v¶m¨9ƒ]³¡ÄíõÍ8uç?˜§2Õ¥›ÞÔW'—{ê–œê¹û½)'»Kgm«½{NNöÅêésÍu†Šº«ee2âï“ôœÛ¸[nÙfæò"õªèsKÂO³Ÿ ™Ë¼Ž0‹œSc.{RúÁf§[ÞžOLÓýâOéø௠  M瀺·åÛ &žžÆ—!¿cœiû¶´+5Q=¼¯oÛ Åf¤•ë³´¢6uèmj\Z3­:½â°]‹ó(ºwž.ôUŸeGXFœ“ë`˸%ÓšúYÛŸÜñà=o\e"¾ea*ö&³¬ .Œ+²öÇÿàûsÆnB¡îš}Ö»†S±sÙ—k½ó™nŒNKsÈXr’÷#]?ì–Ã$P“*{+XŸÖF~uí>Ê,Ëävï,ørÄâ›âl6?;Üwǃ–$Oîf?~¬;zEZ2ÚÊ¥Âh«Ð˱ì ÷“u’¿LÂfÝž„Å’õ)C@euövf®-7¹f›™~ul_s¿ŸWÒ—óà`°úRw¸þnvLWéÌѧ4-ÓbAá(þ]KKp­ÕÃô¹5?UûýY~’L§+EZLêÙÁz”ØÕÝð³¯;CäÈÄs rƒ1Ά†ZÞÿ`£îàêŒ@ µGI¬ßH?&—ÚŽB›¾ ½#}ZØrÓŠ±Nó`HHÃ`ÎEF»Q‰ £±½O¡è•ßoîU1h•ïp“]`»wi> Ö4ãc¹Î´FÛñ*2³Q¯®†èžØˆcõܧŒî£w\3½fOû³ì]÷Íy`ñ—ãµ®ÖoøÎ•M|îMV&çVÎTЯk¯Lí`äÌŠAÍÆeífKU8AFÏÄ~ÍF3OÌíƒë6‰ô¿ÎˆyNösLe3ªLäsÒwZFox“Á´Zå°~Ö§Ô^ÁÉ»åk7ìÜùÙYWœIW(Þw½B¼qzîúrê¹sëø`×쌂±VuÌC¿h—xùðÉIEƒJ9 vÖï÷÷ß|Ô”1å9[»MKìÈõz£`A„Îsv—ÓÓˆ9’“Ö¶SqRY©Õwìñ¨Ç «‹îªSW:u´nµ•‰¶'E@|&íuß¶ãúÁ:Rkoqü ç„éxMîP:-(¤`¾t)o0)@i«'•Ý»AIQ.¯‹òp ÄÏõ9}ÇžƒÌy&L¤ûTnÉ6Ö„IMjp.ãå~ai7»wjÕï<°ÛVnÓÚY’ÙJ“Á½9d»Ds¸™N›{·¬µÒéý¹Õë]ìV¯fY¿!p±ZåsðÏk¼™ßãÕˆÔ‚p‚+»Ýû»OÆWõʈâ»ê´¶´a²z=«‚ý ƒËMpÈtvï¾§v°ÞŠÎäºt’ÔÚÉÆë¶>Û`ÖB¤Ž–M|‹˜é§odœO¦î,^³Fæ°×=7¦a7¦fêøÜíiš·ùº“;¤o)rW Û¨²«RҜ꧄x K«gÀxî3Rnv_„Ýé‹5ç“ôz%Èu,ü§×»çÕ¨»9O>6×$Ú=±Yn —t»9Y5'Ùfº®/ŽÛC½À!ÍG[è»<,–æÍ’Fó gÓ<ÇÁ¹’æÇÌñ7œ©J˜5Û^5³ó*mDm‰û4»dÓòk9>“Ù}ÒÓäÈ•'ƒ<×1t—p=bÕ ·mWa/v§[Þû?Xn\ k¤I¥×¹;Òé:ÇtpyqtµÙÐk’¶¹Öê³2Z}f£vU1 ¹ªpÉ¡ªLðÓ_amÎ ¥Ï…vúSq¤Ó%ýd³ÿXØ/'œÕøq4Aâ:šMªµÁ5.õzÔsÚmOO\{¥ÖD_èÍì¸wlf½kw'1-&ótíÑ]g«¯á¶VmûaE¯„¬ÒO©‡òaø Ê£¢š)c·SÆNŸM›Óˆ¦ùŒicléÛ&Ùáû)<¼N´°ÚÙœQtŒ&î@Èî¨^Ü|ÒßÙ†ûN{ä,†­Œ:›78¤&Ô+'L¢é¹«5“´UíR˜[1ä½l dRÆÃ VÊ<;Å"Û^wй÷ƒ-pƒ²R(¡»Ëw]j*ØùN~Åh„#~¿Y/ÿÁ6lí’Í8¼?„‡R¼/ì­0ÚÅM7íKO2õtŠ1¢Ÿ]ª™»Íóõ@îWèz*S¯&VÒ©|Îá lr ôDú0EG^qÅ\"I…RŠÛæWC铦Ê%;^œm(œJ|®FiB8¢ºÕæ*ó‰fƇ Äÿ 2Úy=Vk„† §ÌÎȬuee§«ÌrûÖožÞjÒá¶×ZÈçYùœ¼wÙ\î‘S]àÅÜ«)?…l¾ŠbÅ\xU²­¬OSÚòÞÎ+wA¢ÇŒÄ_¯Át » wö³ ί ÎŽÚžÇUóìçóNóV÷\å¶Ä…±Ç4Ò;gx~‘çn«–Ù7.T¦¥²v¬jc¨ —›Ub*<œÅйgÛÎ:éä¤ÑÃ˶¨­Gu K?3¨ôoä¸^‰[­¼pGϼq¶å{f‹ÂJÄ „V³ã&"-•qZY™\>j—J£sJ“„ÿúƒìßò$3/dz ’`€{#‘…?Z@lpˆØ½¤·G’CáÍÓéØY‚ôW úˆ­ Ò–{é#G~xé¡AÚÆÚ*¼ÝðöS Þ~Óàí7Ãû?¸ÿ‡Ë¯øGæöLCqY(s9ûž0….w,@GÑ %èX!€ rºaYW«é¯¡C uz üòq¾¤Ž!š)v†ÿ/t!, ¥Ò‚;Axß3¹Rxÿƒä‚[r¸9A2ëoHe ÿÙëQ‡âP¨»ôq]Ô£ d²'€rN Ð6E”dë¹;ßr''ĘêG Ò >tSN æð¯›o2|ñªdÙîCDk€p]Ø8¬@DEâßñ‹IkÑ+sXݟΈ¹}ü‹ìß2ls¹Ðf u¿ëŽkÖ`ýÔ`sFƒ%ç0h>½v3U&@' >¬íÊÖ„x]JÓ@S2 qÿž•†¦ -α§”˜ÊØ~Ù§|²»Šc/¿âRµ=n©|øXíÑû·ßÿ\è¡Üø'ƒ‡ínã?éåïúdÒ6öÁ=€9ý7ÀX%°zÜFÃnñ’ÿ/^¸T€®d<±ªÇ|2¾¸Õ„X¼;/&ÈN^Ôj&>ó‹½ù¸uN×(‚SFT·®Ð^Bè-Çaë¾}@ï÷]ü€îU€¥ÛPèéÔx™øî@ ‰÷s&ÀóÀ3 ðLPxª9ØeÍ'ÇÆŽ0¯sF?½²ƒCð\¨Ç׳PöÒ1?wȸœKJqœÔ5²8ˆ"}º ŸæyßÍ|÷¶WÒÀ:¥_ÁdõŽýsÊýÙþøÙáöúü`.]¼¡ÐÙ¢ðR…^Ç Œí“Íwg ì-ÜMxB—† Ÿ^gãEäÇý¢ÇÁ»DÀ¹‡[ÊNîïá ½÷¶Væ¶-Øú·!µ˧˜€¬¬ÔëÊõø³ã»5Ó /rÉœ×nå:Ûwq:Ùñé7@£)@™7ÊTÑ. ÆQó{´Ÿ{þ³wìydzŠ¿Õ\1^½íVô$˜I¨-Kü½>ÕÛȺ˜Át¾¹øóñâ~uw‹ÄóåQÚ½¯šäå±é”. Úr¶•ãü¬7 úé0œOØÇ ì©´ó~0;3P£“ßœŽóëÂú °_6ªo]¾{‚·ú€ãï"Öï©i·ì€¾ Iy<& înTåfm÷Ý€RÓ+w¸ÃÈ /Kù¢thÝÑòøñl‰wFzIt›^bOW7ôx¾€ü1W¬·­åÊ[™Â¡¸?„MÁ9HEÝ9Ôñƒ½Ýúâðþ|š0©\‰ P‰N; ƒÏPâ&îËë ÃGÌž_!2&ÒÁÙßä®ñ¨]^T®íôÊöødµ û”¦Ä£“¤¶–ç\f`Yg³rßÚÛÄ?Ø^)Q#™=ŠFÇë t£d¹3¦Ž’޽3ßž¹³Èp¿³Ê‰ñ`›óPæmâc ™Ì…ï^œ Õ¥ãÝ…V9Ðé p"ãé…ÊuôÏ'{:®;«ŽÅÅ‘YË—ç‡ú;-ì[®¯]M×õÁf 5ø²¿#2ÛXcØß:ÇbMõœãR½RâNå)`©| …1²Ê÷(ø‹YIû Ð|v4´œRë黦¼‚kúëÚž¢»<Þf#ït­eJ³Ç ¯Sæ=@ŽEíš7éN­ºßŽÏ­Ì€ÁáPjôlGæN£ÞŽ´]ÐŽ®ò„vTĬáËÑÈKäú)ŸÝ¨i{´QûÛÍF5Ú‡ê w›WGýõ7|lÑ>Mè¶ÿIßeîú»èR£èaÜÄGó…*k\z§™}š ô»uÅ-cÆG9ôÑ¡YÓÎŽ×Úºª2P…\—QDçäÍHõéÒθÁ¸RJ=Á}=ì´QÑ2¢–hE°Æfòní\m=*cÛõ¨U~ìšXŸ!×…½’ž*ý’uGû8—o¹ôJtò´ùÁÎÓfzäßMïðJIOcOûéý I-÷qŠêŠlUzùlÉÍîi(½ýÙTJ;C~©5Y$×c5óÚ®°¸-^BaM–„‚SZËN¢nÐß®r£ïÉ’«ÜR—À½ˆdF‚BGSP}Lz¨Ç"?*6çW¶`昭2o{•ãÎ|Ĉ³ïùõP'K"Ø^…U«|7#+ò­ø=‘k²­µ×8‹ WgàÎ÷qXñ¾-«Üýr°9{DK™é“KYœŒ9šg$NBC… ø†¯D´ô¦ê€ì(o†DžÏãú5d|!Óhzq¾ÖqµI­¦RîüXyöåCÇ6úQ®Ú2]‹ÕÚ@øÈêœ 6©Õ&»oÉ¢Hå\z•r‡äé„ ™æriy‘th8°ŸzÿÊêÏeûÇ{Ÿýž«…¶^)‹ämn–­I(ýhCT[ÖçCfo³a¯æ=¼}1jzÝ1ÝsVë|b*gÆ/†¹ïw9ewQïþã.¿Ôؤ›'d=6ÈÕeíçžÊ|U¦›\ÁûÐù gìçî¬XÄóvsüöqg =zϘú´3'ª<7·ˆ’ÌÙQÉÁ“Nõt©6i+’ðÁ!%›œÎK»mpZœ•¦£û›þ×Ó*÷Y¹4&”9™úÁ¸GºY\ªÂ‡^ôP³Ã¢új2'8†›Q3VeòKå4ånÈkZã:“?fÌesÝÌf=j=;Zâo„Qo€L!éÝ­ê°üƒyNÈ;f1W8±FR:ÞT§d¶[ZÛ°ln¡]×7E­ËsóyÎ/k{ä…+¯PO„ }Nsò¬O,Û ’gy¥<Ÿèƒæl¦´†L!ĶeœÚLjTÝüÁÆ›…ÅUõÛ¯àŸ„ÝfÊ¿®ë©ßx®~àÇMYfúÁ¢íç/ïG†:g>Aîx›H9ó•äö‡l«®g7ùé¶6æW?˜¼†4~w`äÚ•à¸U!bNimދϲˆ±#ÃÎÌ3e¦È¸f©>z©Þ¤æ_¦ã†sGí+ØõÊà6ìEÕâ¨C³ÑëÚXeI'tå´úƒìßò@+bÏ*Ê´®wDÈ:££GÚœÅe¬Ý¢éÕÐçSY«û²í5¸ ÆnUñ#– Ç.§ÒQ¸Øg‡ KTÂÔ̱¤ïº%¤š›„«ge¬.Ñö³Ÿ ûªÊFúi7Àõ ochv0réÉY§Å¡Qn¬†u&ühC«ú¦ó“'Gú>ÅŠÖUâÐÓ.˜~>öÒZEmäÔ¦ÙnoLì5[ÏùùF¸ÛÞžÛVJçÅØóSRxÌ ù#˜ÞtÔo©Ì,.Åá>³ķ8ì3ºÈõœø¤õòm zJ]ï}#{y÷©‘¿êŸreq@ÌÛÂoÌkù»«R0p»4éâ‡7~E Òo§4!¾½•äq&d”òéµãlG«*’ž—lmaæSæÜIóÆß·)M®ãñËì¦F½è‰1ÁÊ÷Ïù ÝsI±ßåM~ѹ­S›çÝö#wÃ;5ö3êÜ©ƒÐåOéU×'²Â¿€ïòå‡R;U¼G©™9±ù1f53ŽaJ +€‡/é´H¿×ùO%¿ª¾shÎlaUZë9{:형Ö8NâçÃwsËûМå^{"?X?gœ²Ý ½©tBzÓmÇ-kÑJjW¥ÕQª—VÇ¢ˆVg‹ ZIã,´›‹‡Ð–Ý4ÿnŒåfÃVÃŽ«3…î)1½[Î#}˜Vº÷ÜÒ9ZÝé~Ä¿Dåz‰T]Ûz^PÀrúhòò¤½È£ýÙ= Ib~í_•Gï|ÞÝêóJtêï[¹”S»•ÚE³æ ¦ä†5–œÆ„ìb?XÃêô‡MTxðMt•šãÃU4§Ô)wm¡f»yCõì5žMž›±q ÅrŸ¾qúÆXgÀ=çÞä’™U¼kcÚtEïû—7´É—<Èq‡}/È.îÚnÞ:ÍEîÕîL ¬Õg©bs4¡šé¼ÅÔÏž$×s¥Sϵc¢žËœ‡õ\ª&Ô³Ñ?àÿƒìÏÅMÌÚäR°K Ø®o‹§ŒVî‘ȯ›7î}Q<–Íç¯ÓçÒ &;æÆÃ"–Q:ÉåפwSÎ|wS“•N+™Ú½ÔÔm ^°9þ|Wª4f蘪/ÈU¾Î ]ºf65±,œkbG k"ÕBq³¬U7;¡V]løßp î²n­ÒŸ²±}EâúÆÂY,çEçés´pF“#æ–F#î ÖïÑs¡ÜIZÛ^ûÓÓg-—¿Û¼É»†SXÛu¯²öëEIÑÕÆkë÷§ZÙΨڼnÅJ"ìŠÖy¤*uëÿ`•Î!¿(š¥UùS¤„ßpØi»´æ›êSþlýû:oBû•ûÂVP¶†grkö$Bpº*Y{wºq?ÓFwró4¢›°ÆÕʰÎ7*sZìWµÈéï`ßìXÕvyîWvºž”÷¦C”‡“"]²îëi‰¤rñŒŠ^ñŒ©Åâl…гî`YœU»‹ßðÝÔùå¥hØã¾fß´Ï·# j4¯§ X‘æ0«Ï®|1ÕöÐu£™|R ÷ò!ë~€”èµ×kÍIЩvæÞ¨ÒW¼yùÂUÉÎÆJ)³ü싹]æòƒ¸tó‘Fž¯q5Š£INê=ä\á¯Ùøº(dcô²J%Ïüµ¹xß%jÒñùmjuùWáÀOÎöÅÊ?X“±ÐM=ØLCZê4ŸµZüT>g­ ^Š*Ù«k¾èlN•‚·Ý×ó±i嫨:ÈÕÉÍ4«Ì÷¥q–œùÜžff@Wo¤©ˆirÜNUHüÍŽ[O¤ï Uãx%˜aý ’}ùü«*]Øy|ûŸÆ%=2ÚŸiwÓÈ×|MnîåÊç”:”ÍEt*1•½SÌ=y¯P|Ïnù*Ò{ü`Ùø”}RÉåd>þý“TbŒ×аհˆ;zHãì ×Ç<«Ïb%Rߢ“ý®ZºZ`9´Z˜4‘Ð?Mƒ°Ñ4Ø.¬ƒ\í `Ò‡Á²?ß·Î@®s‡WÙM¦ÐÙñk›"K„|°›Š9iDo² ƒËT7¨ä®lI)™¥l€Ôº!@Ò;¤]Pi³ +]Qf±Òje1?‚4/_ ü;H YØ`Â2ñªƒôŠÿîœÖÀ&9ôªÆë8¢ÌyŒöÏóô¢?ç™ýîdö€ô§…å@ ~ ËÂÿV£ò…è˜ÐZ8¹)ßïW"»'yý›W†ß<ø õ |—üt¡Ã;ó@ … Ø…8ÀN…g[ £W¦¡nž¹ÎN‹ÕzÖdÿ¨LÚÆ£Â(,7ôì{Ùý°2GY¨ñ…0(ôÑh,»Œ¦VË1:@=ͨ’$´àÍe Vù;˜$Ì K=1YÙNÆù#œÅÜrÃCúÉ+ã èÓaéÜ3wÖc®ìÏ•ø±ŽèwZ[HÚºkË»yïÏûÛ'97CÛî~lìu ›GŠ+WþäÇÄæwYðwý2»†%ç0ñ6h~†®ò½zí×inOž—±É=ó;G‰¹‡cÄ¥exz¬‚Ø"* ᜿£ú¨J„Š=.ßeöo†ŸÀÈ"°R9Í?aEÓ§|eß±î]û¦êñˆ"ÿX•z`i Ý}·Nþ.hÄùÁü{\ž ðmÎúî3rxFJ½²ïz滫Ƙ¨>Ö)Ћ6~Ä„ªqâïàyQî½òeÛÏOö 5O×`B\±{§üRÈ^/ãYÓ+¹;öiÉy^ž»3xYêywÜËçtf!žöálõ?Ø¿å?€•éB¡³ïvÙ„…ZTÆöæâ»M° ˆáü˜0Гz–Häù  ;ÇvîŽä1:8îüž^™«Û•yÏo,7®6µìòÈÓæ¥Áw.ŽzîßÏïÜò}îqvö4\WúöD™/³ÛQ¶ÜÞac-³ºh[Áôeûbù4z@™§6”ÉYU@ ˜Á7?æ$ ©ù69]ôc,rñ9j%ƒëåÁ+ ZkìZLœK_•Š“ô­³~£†g$ÎNØëÉÛÓJ´9ž%`³~êd-3D`úlëm–¯ûâ¡æ¡»—Y…7ÔYÛ«-Û§ÇÕdÀjéÀK|éŸTá@;&™ ”©m·Ïrˆkáû0Ðo°7¯>ãܧ3ýî ›‚ÃÑi¬m26U蕎¹O¡a½wϬœîÓÃúá.÷rpXIõ¬…oëz€Ýu„ê »ÑâÕÒl|1Ó¦I$h™àÉiZ|1û?Ø¿eh9(”S¡P¶Ú„Ñr8ùî$Ƚ¼ÔTŠ’Öj}›:Öú*xeíÒ©ô­Ó±¦yG7UŠ­2yN"nNîÕt±`hþ§¦NØÑ‘§7†þ~7YÉ™âÖá‚Ý6wJÎ*—k>•€‹ËJå=(Õ ¹TªÓÆBŽ*µ™uÚÓß°[;pïTDÈviãÓïW»¡Ï‡|°¸››ã—Ê…ù¥Û˜®NS`hÇb—°MšTƒý–ÈÆFºá¤w–ÁÚ‰¯æ·—9US¯ÍgK-­ž#¥º¸±²tŒÖňt `%OÒŽTJUW­ovTl2RÈs©GèS 6Íø7@óæ‘‹*€¬HÁ‹ÓgåjN"8wŽ6,wÜV0ê‰u¼8–š%é[»½ñg¡£ã˜hózî¹]€(¥–—\©1‹‚Üh´k›v¥Ü–z(6ZïÛäB´úY$”áqÅ€ËsE­Új6ÕÆ«™OWgøä/†«s‘ý‹ìÏàc±ˆ9(R0:ñúoÎ]Ï_E¢“÷¢Ó´ì`ù°ivbÖë°OѵíÎÞo--gä\U87…nŽ_›×…LIoõAJéõ¹°ÆÆríÉžÐ]e›Ë©P¨.ž_è:w È€wéw/=û|Ùb'¼×F¼P7¼0pþ €+*”i åä,íS^×Èð2I8¤;uÊêLÕªˆÁ~wú¤ø’µ¼ÐÔÕj˶eeÔò6çJH[}‰Çx”^ORpe¤ÈûBRçîl&1»l8Eu±Í¯]ö-ô3‹íhÒþÁ¯85^6û¥áR>ú¿vN ÚPH”âõÎ*ù^œCÝvAA¡ÑEÏ䵎…1Z·TU¢E?A? IÅˆŠ (A@ADÅæ€‚YÂûßrí}Æ:·Ç¾cÜ?´Ý6“*¨0-u¡õŸâ¬pÆäÓ\OÆ0Vrm™Úl­S> ŒÝ34«É³ÿº‹i/ÚT1=u)0Ó'ËhØ0+ªd¿dvµp´êæ‡BÒ=ÊvM%?lGÝ-Çm Ïîùÿ"Ækæ@¯…G­ˆøÍäWš€½dcGR ÚätVÆÜœ«Î‹sWp&GL»ª1´åûujùDo=(“½ñXºçþ´"Ü{­ òÖÛ‹8£áÌ)§f«ûZ—*ì¥D^z²Õ+~ºðzÉá+_QŒ# úåR¡…®þ1ù/­_€{èB½ÍK)0ú|‚Éb¼ÏÅ»hsgºÑj®Ç/OÒnÈ‚¢Åé¨'°î*#L¬›Ã<µ™ * ÆcÆ$»ÝôÙ™rêÁj›}øRUÆI»½êTÌ‚Y‘‡¤Ù’Æ™±&¾å÷Ll«ø¶Î%i,­x™F^êq÷Aý wAw±ó£:KÛ|mCØx¯›Ùìk™a÷…Ëñ¬ºû®½VÈÆh}uġނz«<“(™õÒ‚½ÒW^m¯)¥×EÍùÞC ZR$? LßiPûâôB7;‹«tàübÒ^^ZAnX…Ž ‹œÈ.V-q†ß8ñ#%¿‰ñ4[ºîÊBæoP”×ù{S 믥÷¾<Üì¹Ά½Œ“éÃÇá\µ³O‰\ÛÕx×:V‚ü‰.UDW=šÈ¶kÀë“R±¤PzJo1"sHÇu>ùöjø© ['' D¬ÚüÁÅO‘ÖsÂv—gÛ¢Øoý í•ï²ÿE¤K•BHäˆÖ^ŸíÀ×ß«ùzº{­w›—[Ï‹Ãû×q'± [»«<ÇãSK}(F{:ØCµGÕfß|òâµ’G¡±—š½úEl)Ô³ƒ¼©°ú$ì4Ÿ¿b«øä‡\8‰­â›Ê¶Î£¨Éç5Ž?Î`ñà*~~´Öõi¥ÝgýšWAuO/Ïù%Î…Îg FÛëý8‚ð¼N<žªZ8*¦bØXú0ó¹¸xHëNgP:µe¿ Ùøµ.“-Æ]çsÕ'ÚfÇLgÀÖchÏÖ“,ÉŽÙsƒ«~j-nØØÿ↙z‚R2ú§([Ëì{q:wnÓIÁ=E#Ú[᮹6_ŸVî—V[†z’@ç5½õitÃÁ¬#¿ÌŠ&qþÝ‘îÜiïPi)h£ìŽïOñ°U¡ß®V|¢,“MÊM®X×2MF ³;FÈS8ãj÷“xy®É¦5Ðò7Í_%1EöéøY;Výíá·ÅcfCÏ`"èÌixžX[³¹9y=¹9>è9xóT/»SÛIIf3BS\ ˜ÔÁ绞pjÔ7îÍY˺”Ö\Ýþ¾/Ï€žÍ– ÃL»_(6$‹çxõdÔwÏî¶Þ5Úx}·A <#´Ø›iþ'ž«ÄÛʤû^¶ßop¿ÌÍká:IRÅ·uz·7ßhՓƼks³¹2ÑŸ'™«‘¿óDG¡£J;…Œ=¹es–Á5ÞÍË&u·É¿J{¦W¯ ùYOëj$çk~k J¬VXá=:×k:B‚Ê\¥/‰Èü µ\Vóõ^ôþæ|÷2êâéq0†ª›>ZzjÝN%­L;Ùbä»R2Á˜ô¾Ú2ÈV½3ª²1©s,”‘äf†h žo;l©½®S´t®}ëC[Ö†¬ÞŸ™Fu´rzÕºÄlªu–Ã+¯Û¶^y¹>[qj3æ?èßý?lê˜ôq÷îô1}.Ÿá›æOVuÞÝõ;öb©z·™äÉä¨MYÖˆ{§ø˜u©ªÇÂÓyØì$¯”Ù¶©|ã —èFîÖæë…W» JlÐÔ-Úæyõ¹ò•Ïîø¨p4…•“§S/ Lª–|»*É•V:Q-­ê ®ÔÙÀÌámÌëkfg“p¼¦ß²Býû.›Ž»Y©ƒñg.yÓÚD¸t¥7½]MFQ{VCרMý|nõRsתü§ëýS¡ê„z%¦!¡‰¸ZnïJVi“m/Jøx~*v?¯O1»ëæ ½ì´–Ê-êâðWê"ç(êRV”qà™ÿb^^ä®a$øÃ’èì ¸|]«ƒ¼¼ ç ƒµX7?ÖÚø£ÔèâfNc|ÿƒVg¹RXq‹ÕwžËH]ÊÙ¨¥¢V1ë…~{ÈSÁf*S•òe·GÐ,÷Ê´O9Fö>Ù¨R/d¹Ñœ'ÓŽ0&=Œ}‘nô¡Hw_®“OüÃúw’’ýóðüÜ ÞŒ7jç\©m2ŽP®êC>{õ~p«M6߮˩[Æ‚ý¾DÞ—~1ÿ^Þ »yßÉçGÒÉ9ê€ÈFþ¤Ž’†v•lWgMBj¸"¾›=M< •ØŒf1],#€S =ïë*z>`kÀ3EÏGù…­«÷£±ØB­ÈÓžÔž S¡ÜuF [­§ýšEN¤JK½óŃ„È…³c(‹×Æù‘(LsN·¶ÈÎ{ù%Ù.¿Ö„T;ïðs>ád|0¿?Ñó*JÑŽãK­‘Q¿Ý„_¡§ÂM›þ Pô´}hîÀ ÔjjÔbQP–~a² j«õ‡ OòÞÚL(Ïw“¦è,ŒZ•\)å¶ä©ËæQÏ:;%×$[2½à"±>”oÖz²ébÇùPÅ(¨§£FG52áV¶û‘Á¯KÙ¢[nµjå `Þ1‰,àÑ„Z ÀZ ¶ Ào› ‘¿€sùnbèìdb¸vÆbX‹ˆÖ±| ׋åÚµbkB “~”Þž³(õÇ(ÕÇO@’‰Ò_LQÚ9ñQ*f@ÓX#ÀqñƒF©”?&¯(5+Y€MžàÏ9ùÿ—F<¦¢1|Ä@˜Ç"sT+Å0ÅÔ¿™Þ÷DŠ¡i0ˆ!¥°ˆ¡ŠéGizùÄDã€q9J'&JŸ¸hj˧QúB@­¿DðŒ×á¥o1C™€‰!´ þ)ÚëEm¥¡sÉõ/Ÿõíþå‰áC„ÆY$b¤Âåb8A ÷Ã^¢Æp‡Å0Ú[ÅPp bhGÅ147³1dªßsfy@[8 ÇMºapá À-ÅÐ8ÇG™YYùàGºÿV)´÷Ξ?úëdÚÿ“o¦×½g@xy,Ft¦ån%Fæ(#]¾#Ù±ÃÇ.†'Ùk ÷M8†™ÃMŠèb —ÀøSÂ.çgq ø.¸.ž Ä–÷òÙ¼û¥÷>Yq¯Þù <Í«o½=Qôû“áÔÿ"†“„9c°8ƒÈò­Ôïjðå÷ýÈHÏcdQ=Ĉj½b„¾€³ÊSßõàz+W¤ êÃë~mPço9/ß¹(=¼üE1|a!z«5ù°»sgLºq­|ÿêziÿ*´ïú®.;틊æ¼û‹Qò£í͈8szR1šS›€“£HvgÖ-/ÎÎ9ΔÂè³[mÐ÷q¾)¼ÎãMýU öüú´*åq×/ýGírµï/0º3Ghu‹ôÒéÆ]ÚkjnÐp]ÏÔ%Év.z¾®ŸRFó­ÖI9Ý—cé4êô:_Ú¿ˆ‘€û~§p¦g£1 DŒªt)F÷.FoÙnŒºvŒÚëÕgë‡×e‡‡Ïa'“<ê·v‹máÖÚûk{µj…ëh%‡xuÕ vÀ²…`vÑŸÍÙ%þê‡úsy6ulÊ«æ¡eߤý¹ÉûŒävv›ÒLØI×Ak‡îq¦¡ò|¬@˜Ý„øfm+1fâ|ŒMuìíÆï3^mòÓl¼ûL–7Ø)\Cùt‹‚z‘ËÛÊûC­Y>¥RãøÞ×ÛG®*‡¸$м9Úw ÉÝm:s'cd²Ížôò†ú¬¹µ©„Õõ¾æWCÏã~ÐÝ5¿0¿ˆ3c;£­'£q#÷])HÇx¦þM/{Ú‡$óñúŒÍ[» Û!¹›¹—â ²?½ðupäéu€OTºGgßÏßÉw¸°UÏOzã—>ì42âÚ\}´Õ G‡+ZmxËgnz¼@xìbQwÝÜ[páɉuáÕµ¹X‰ûúbÕ¿ü¥ ÂÜÄwuº1,Ä8•©WÛ ‘J9ʳ‘Š·Ìù&=LÔýºëYG(GÍöØ}¹ÙåÞyÓÑõ`Æ+{¡ËÉ,ÌyŸû¹ìqÔ™q]9l» åÓb=ò|+ ›9qøÄ3­>(Ný˧9õ?DsÚߢõi?ÈÕ¦Å\ýEŒV}!^uþÚA„ÕFL^ûuË]ÙÛŠðkA¡—ÖNÓ[ŒÇhö¡nÁµm­¯üs¶}7;Šï¦÷üÍE.H´ã7§õ»úøt‰ÂÞ¬¨PkbÙÓçMåöÛù²¶íWøÎš^øú’í ¶»4_ó…Œx›yv(fT¿~ýA§¥þv¬1 OFfBŽ_‡¤4nfÐæˆK`Ñö„ÆÀn#ûõp-›Ðp=k‡ë`]®?ÇÊ4 å/Å_€:ÿ~ ·Ó@cÜ‹?èߔӠß?g; ÁívâsˆnûŸriõ*m›^q²‹nBc®¾ŒÉ4€3sç\7“±>=§¬zŶüAÛ¾H¥Wµºs†šúƒt07ÏÑòm^šãœy‘3•u©–Ô»YüBýÜ>ô%c¯«ba.ŸçÚôþ8¦ký~D®­ÇŽ"ßñzd²^ê ô7Ÿ½úNm>ëÍñîJ÷àÖQ[Eõ›º}T•,trÝ<)×”¾¾‘•b¡=WŠŒ)ç¼’ïæíÕÕn~®«% 3üòƒþݱ3Þ4º NùÇ1Sª^vÔgyZ/…ýÒ͹k—X ÇY0â^Τ†£cZlyTnX§ÅA”BQ1Æ™¨×oÚs«á­‰žKîªa¾WÉvó—8RŠG˜+´"ˆNGªâ‰T{/é>OIÙ’´¼žg¹/ä/b `^ã;1’ã;-ijÿ –ìÝ;qÃÃEçIæÄ7Ïd¥úB$ãÚ>w%ž«Ï1}IÁ®×¹ž×Š?.‘\°[h§¼7å½õdN;—Ѻ5J†Ú½€ûCé›O¶jõ^²¹ ºˆXŠF «=5'BCå’î§òõ½XIc»w§†zï,Ô>Ü^Šƒ|;³ Xa£ª–°ÑŒk»SѱörpÎv OJvx†$þÎå»y]ÇÏLП‹¯Ã¯›[eê/“„8¸J4ÙÎ,9t'óEi>Z‡Õãðø)½á+A˜÷Òe¾¦‹·§ñ¶ØíO2ªR©œL¹F-&âÇí€Úï$»ïÀC0®Bûl*––çÕÓªÙò‹…~˯¾«þPwHANï ~qO(:9 ÈcŸ}B—õ¤Ýó½u >Î^mýƒ:΢dt9öêûÍ`(l®Æ{1MûÅ:.‡%U_[Œ>³¼<\eÉi/z"—¨vqèY6ÙÏ]ø|·µŠ=Žä[»ÎUº¹{Ï}WÛrƒCáBB'[Ey„·úï77tÿ‰OPÞºnÍàrY¦,ë/Ž;w?%`øºVgV@Ñ–9Ar ƒÝ7N½U±ñÖ™WF-h“•á¢MKï fÅ…¾ét:DOmËo ݘvxjB¬Z% õ¹jx³õC4û¤ÞlŽ :3§¦s†àæ;¯gÙº`_°_ü A§½÷{• Ö“ÑôâIBù<»vÄÝdá8ž­Çdhßì­ƒ±®Ìfkõœ™ÝŠfÇò ïÇà¾_ëí­9m Z­'óýßo•ýœÍÑ;Ô>ÛX¢‡&»-¿Þc2UfF7:Û²ÚèìêÇFgþJËk›dà’N|Áá7Ùûck~ÁÒcåË‚²¶Gç’Û‘ü¬.··<½2ïªa{Êù'÷ÒüZ|ˆí>µwÇ!èò´ÄÚiUq^àê0Ýe›XyÐlA…ÓFé}CL·ú®mgêäæY­•^·¦gõcM{bÉZ;æ ò Q;Â]ìüÚº®}¸Ý5qž>a?îÄÎÊ ÒÓ¬Ÿú[Óƒ|_fé¬$¢UÈèÈãÖ¢­Î,_(´­'_–Ǹƞù^ŽýàJ3ÉñlÆèƒfËzƒ@ £ºªtÖµžn†ôåâÃt¹R(U¯÷½RŽwûêP’êñÈê°èàÕ!fa¿Ø–ƒ7è+—¢ήËÉqŸÃÍðŒ•<#ºñŽž]ö-¥!´ÎV9I­{ž¹W“5¹I¼ñØHË\š©‘}7‘aa°I!×P¢]×¶vn4d:äX“®xæâ­Ö6K¿âP\a޽By^€Äò¼˜ß—gÑ6)sÖ‹(sÝ/¥‡þbÕÊ,¯ *üœöXÜÛÚJZ™Ît:×÷ÝÃH™ wCÄ0¼ûƒòÁvX(;Ù##ÖO£™Yï5`·v™5N5S™¾éëñ€Ð4uËUÇ3”®L=¢UN2 µÌ˽qiyØoK(•}7ïe¶(ÏZí¢<ïo‹Döó)ì'$˜WÔB@ï¿q³ër0mÌ”ãHÎ7ƒzýâöðQÞ1±©óU¢#6—Y›«÷´¨Yðk¾Â­"µœJ5»,\Ë2²¸¦´ ïv3Å1¡Šäu[+]B,PkP†±p©R9ä-wŠæ«íR#÷ÈDÃÜhv»çF]&“«C5Rðã Äê ånÛ\ gÝ ;†ü2†”åå›OnAŸª²`¯:-¢)ðÍ1ÓŽµ's;Ê0çùgc»Î3×wVô°ç%».<,ï£:;²÷Q:bîuOoÜÞívý/?èß}Ô,ŠÂ°·/Ÿ4Fâw%³[‘ æ P£ÃËžýÓ6†üÃE):Ýñ‘{½Â‡@Çô[UÜët\´_=ýz±WzOsžåJÝ{ Gúé>ž†éÕ3ù+oRµpyË6C”~4y²¤ÿ`ÆÕ_Äp²zLjùüÄH€Fqåà8ÓØæ¿ÙQ†hÄ™¢,ÆH¸0cĺÎ"¬sݽ÷åùÕ7§Ïç@§Ûz†?jø¶pŸð«êí³Ú2·™xk_“ݧ{r°y…}Ú Åbol­øsÉE0áôÌ_N¶ù¤ÏÛª|djýâ!B´Âa¶¨_Ĉ€@?è„W.'™…‰"@fâÌs#Gæb¾õ c?-'™Ý_O}›wg`Æwõ:³{¸VfIˆyÓQî¢%Nù|®ê~Ø´Z~eáȧ¼î_âkzdöÌqŸö'É™ßó;l–¶Ýº°%'¿9ŒìF¯Hä_~Ð?PŽ0ˆ±CƒOjòoNtÁÿI/³‘Ÿ¤—ù!¤û;V”Í¿„“K/?_úW¾µ?"êrtøó7¨ôU`tïÝËÔ>C*?èN2éævwãÅm¶fö7Ç×Û]Ÿ“îcuE–™å£ô(,ë‹}Î{ó Ò›æ¦øìq¦ažäD¸‚b4¦³ÿ¬dÅš\cýY¿¥8YÎa/…¤)&Õ~pI~¸ïLs³l£›­Úÿœ6½np]_–Ág]F_ÈjÈ݉åct¼Óº÷ž1¢×LmË]tˆÃb©ô¢E&ý€›Ë퀘”}Agû÷ùEœó Æê÷‹Ã'c’œ‹±õ¦ü6¢poÁw<8*8îמfáàÐún—?´·y¾¯­ƒ½ØÊn§Îr¾VÞǾÜÄ8.¿?>+ø˜.PñŠÏåù£8;Àf–›ÊÔÇÎS'ȉ7Ç|¾`pTðÉÍ 3»‰Á_ _|ï—‡ b´†oP„ßVï¬àûüºýÜÚívG¯×éMCïC¦½B·'D)®Ã'É,_ÇuÛ›³ºæ çê`!î³Î\?ÜÙ!xì¦þqïO‹Ôåá äë÷;¹nîŸÔ2hi<‘ÙÖ¸‘,—iìäF¶»mel7`Ûýè@K~£ ÓE¹ü|ŽÝKzÝ /? ÞúÉøïƒ_–ûô¹Ó—mOË%k:^ìuËnû€3ó]´iÏô±©N …7«MO&£2<¿4x;fÎÄeÄí’‡íÁhj#LžŠs¶vÐJ¶”•¹¶H£ú¥ ˜¿ ŽÆ10ùý"F»ÃOŒÉ=Æ×à4ýF³>ò§ÎúÐÙ«mï:Û¯žÝþÃsÉ:¼ØÄïÜ~_MpÊÈuSHÏçá!»; ïí‰$Xl}G™®í~eå¥( ~^‡ñÌÿ®è½uˆÂ¤aok£×8{¹ªt†›AÚµöúÝ´²›p2 Üg–ooX×5˜‹õGþ:꽋o²×ÖzL‡†¾@_õq¤Ç£}Ôk¦ïÏ—×/þÔù+œ5Þ¡Ê…çÓŒÙoöÛ€p·ýó`º¾ÓØx9K¿¯V»˜=?ÎóCãéܳ4aX?;r ­l£+¬n*;nàSŽh^I5®¯æ ÿ¸–œ~#W]õXŒ:é‹Vý©-;Œ–Ù.+ê¦ÛTU9WÙ©}j(!~P­cŽß_ž¿ˆ1ìÿ©óK±NG¡5\ïòn°XßµÉ2ÚÎ-wm¶¹.5·Ó*– 'Ì{¼¼†w0’·´Á®:(fºÔ¸¹%¾ÿt2rïÓ½è=vy±u~¶_hÑÄó~Ü»ûÛêæê¢rz_D¥7Û­¿èÞ»9ŒN4„~}yü"Ƙ8½-s¨—3}¨X‡_mÂõl¾r|râµGms‘ðñôZW“wåry·ÞËÆñ bå7öT0ì¤Të3ý ÓãºKA:ã®&r=SUêI÷`ªkÅ×zÁ*’É彟•nZ‡—lªåÊH¸Êƒ®ÿ–ƒÝó)aòøÅ?—¦\$ƒÓ¬ÿØíŽJn¹~àƒù²ÜÇ‹½œ5f¥p:pèÔþ˜Ïô¶Œ4î–þ¸%æ•´0£ÎR¹^ä_Jº××´u£Ã©» -vTNWÎjË!ƒh$ú,ÕøÆ[œ¬&¤ÈH9®šñ©È˜Q ¾öûËã•jËíýïâ§ó s•ûå(XËíÖОÞjJ‹s/“îÆóÞ06œñ²Ñó£ÂÄÞ$ôÎ:EI`^ƒÙÇhdšHoA?½½SÞá«?¨šåÊÍ.•O¥„ßT¹ û–T‹s± Ý9?Úé\ÀÛmèÐh#«å÷k™v—vz¬<;­ŠøèÌýÛ/o$x\‚öîrÀƽ è÷«ÎÁ[òbm¾8Ô½ÉôÖ?c— {+ùCËŸ«AùäúFã(… Uy|¹þâÞºNîþD«wºB¯WïýÌóP‹œÏ‹Dwì0­aßÞ¾´ŽÕ_q}ó^Ufà~a¾ç^ò¡ŽÁ窵†H·Є|Ó’‚ô”‚šøáW\gõÅöò¡ô„M ŽAoª¬ù\f¶zòâ.G®Â™½ò€»øÔ¡ÕSÏÖiÿºñ9çògó—ëf%ÜŽntÝoK#b½ta{¹8œÅÔ~•FcáÓèY f¼«ýù4õÚµt¥í†g_͇£‡bš‰\;˜Ä8·|'¥g`fÑAŠ}¦eŶ@¢œÖò½â°ÜK®œhgÖ¶Ió¹)›Ïm®ß|Îâk3Þƒ½MŽ÷/á/‚^…ûÝx¼[dã‰LÆ0Åéq>™[ÛîÚ‰n¼AAô–lWÒñµd¨'Õ˜wÍ¢u½f(MÉìGl­Ÿp§½8mœ…lU©óTã[%²Ö媙ʀ­œÛl"≙K«èeZD­ØH°ÖH½÷–iA£3¯:7&²Ö×_ø·ío/\g·L†þf¡=*Ëi½fÌF›Âth•bWëÔÁ«~qÏvËË“¢Ð»ÌÜ•Ÿ¾]">u:çÇ£M¨ËXȉv†/´´|«ÜµJs Ë6ê±É–+Ã׸Y£SRõÍpû®Ë5†ªão´[Ç/ñ¦.£Ö 0ºÕ7 çú‡ôïþam=ŽëñÝz˜èng–ùò&Ð0ë OGÞ2>¢ êDÒdf†VE/·DÄìô:˜=žµIg±åÏ´yn…ŒùäîU9e_ ‘hF•J,­×ê R. ¬VÓëŠ!NjÚÐÞÑþóù¢ûŽ–§‹,-ÓÅJiKÒÑ.Ü­+ݯ̳£¶ÃÃÒ]$ûùù$lœæÙZŒˆÂeÆ0ôõiöÄQÚíZ%ˆÛÚ“¨‰PãKs ô\ÙÀä}bÁ¾­Â¾ A³”ßLû^„Ò;OÖ÷l¥\;ÕŠÍå ]ZôíªõÜn*&ñ¨Œâ'WꇞT©$0ì¥v·ò;³¾•_ïùõëÆ…>¸Ýâv?ÑjŒÒÕ¹UÉtF}a§õUC³diQ˜¶„Ó~F³Ÿ¶G1+Á 9·ÐÆÖ,š ¥ÜŸ×ölWϽA­ß¼½é`ÁÕÛ*ÊVk8Y­LT®]þø¶Q抠u‡°$Ð^Be»_œUqž®ÅÎí;‡õÿâý³ñÖqš Qf;K–7,¤KÇàžÏ¡FÉ‘.³¹ŒØV/9–›tóšy:\îóÕ:·©VÞÄWœ“Ô«4{k§3Ȧ<˜Kj)ïÒò2?h)Ó»ŠRH2…}UìºÛŒ:1 ŸêaO„¢ö›EÙk/A¢KÞpîaÞ0ÎÁ/æÆc°Ÿ$ùpmç"hnDny¬œ)O÷ß5½íÃÈls“P©3ØÁ*ÒWhO–c%‹ËR}æY¢ q¡Iñ…šöo;?°›KÀÜÏW„ô»Sm,g_Ö•ì‹ÃÚÙIjÛYæT8óÂ4&¹°SûA‰TíΈ”¾ûDšÇî„»º_áLÝtc&U×tXùŸÔ¼üi:zûpßHœÃ¬ØÆî¶®ÐÕÓ%W†©VÐèU&w¯ŠXöýglv Ó-2îË Ù Mƒ„æ'‡è@%‘ñ«>¾™ŒÞ8Pl¿¯V0u¸“0ÕV¦¨$êS>‰ö‚©„ºÖ-T£Z€^Ï_ü £íÐZ jïéìŸä|ãícåÝåœU"4ºÉ½V/ãBIÌ4Hªšž¬SOR 8‚Å2‹owe;< ¦Y=£²…ö·ãi&¬lV™Š÷öPd„fŸ°Sá30“^ªPt’¨…ž§P „×HˆKè.Ä¥Õ=`÷?ÜG—EOÆ’‰2©#ƒ¹+éÜ)‹‰1•Ï$ ú—¢2esùJ8@É–¤¸ŒØ ¦Ũ(ž7›QÜuºQÜŠì(æ…%`u$÷(è enð,Gqhx°ÔÁQâFiØ£˜ÉxŒ™“ÿ"®sÿOb o1ļ®ÿ‚ÝïQÚƒ0Î+JÆ×L”0ß÷¾E ¦sQÕ(¾VÆ{x‚ƒÞÊO@¬pÀ3ÅG¢`À¸x÷£øÔažÒ Š}%‰ý5ùéTõì…ºÿðƒþÙ¼7Ëù‹#Þ$ ÿE|… dCíK¢”¯Q •(ñÏB”8¤%’8ÖQ"ç.œ;ƒ¾çÂÞˆ(ሀ¥Cp’¢¤E™kñËôòA­|ô:4²™WnF‘OŸËÏ^ò&ž…Ãã?‰¡3yÁ¤,ü“O&ƒz‘ Úuåù'CÍ¥qÚˆR·"F©60£´æÏ¢”"¶œµ¢´€‚˧Àæ#aÀ–"¤¢Ö?«ûû`õ©øÞ¾/½7ÉAãô•o·Ð÷{m‰Ü^Íq›ÄCâÆìMâ©2~çXì:‡iô/1œ/†1¬Õ‚¶k°WØ ‚`í…Åp½RŽ¡·ÆÅÐÔý~?2$'v Uh7ÊPôþƒ—˜+²Ï×ñÜI^TICŸç«}–èIñ>·µG•ñ9p1%ҽΗ͛³z×–õ¸…™Æ; ¤9Š_ºG=Ÿ¨ rÖ/}Ì+)S„üK¹‘þÅ€oÂ%F-ˆ‘òä# œÆÇ‘1BNè>ú|Ôy?Õ÷™¯Þb0y–Å}ÐUq{o4Äóm:o×ø®™øu1rà+ôža‡õ¨0“„t wÙoŠÝKŽ8¾éøþñ ^‡OñXËM÷‹‡ïù±íáFíý‹NœlÌIðç[ÿ’Wœ)ßo!œåb$ªr3h>ÃÒº¿ÐµtãÚ†~…É Ñ—4 ˆXZ_rÏæÁæÔÙ¯@ÕÇÉn”¢ãsFÃÇFÊ’‡Y[.¸Ì‚Ý»ò[ýAw«‘±Ú*ì<ØhZ¯ý³÷YKúk\ÛÿÄ8»ÆÈeÆ IfÌ~S·$Î,ýì»—©å£ÐÈÝ ".†8¾}å…ÂLþtßÒÑ>½Ã¼yî=>˜í0ÙÛ‰Ñí°ÝUoÁ–?Ÿ›#C¤›ü¼B¬ H(¯ÂΤµ²°²½¬Ì½Ç|Nw®œ^n‹\>éq|[xzÜ/6‰‘Í„÷ý|ì̽ÆhÖü&oýÌ'ÇÕ GC¬D×Ì­ý¹ 95(;{àóLy·Q1fÛý„힆ÚÚxïÌÕµ¼›¬ªÚÌ÷—£óqç½ñï5ÕóÝû¯Äm%rá]»ô"Cå¹ähÞ¬»÷/ÓýyLõgpR“mðå2¥V~ð—8“ñAQŽ?F«Û»OÀ¹Ü?§ûéΡÇó5¡½ëä‡Ä¹Ýw[ ]üN—\—½jiù,C ï“{n‚†–ýE§³±ç›Ùf>Çï›õL­ŸüéɼܧÔ-N³^Î9¥÷‚ýA'C®5?Žá~Üh䯣J_Î_üÑt“žþgÚ7í Þýò!¸®î”䇽é¹2‡ßöÎApw{,æOëÁ;z.'çh-Ý4'‹Õ®Qš+õ¤6ÓÊ7nêk7É ¤­æ”«ÁĆÓñ“ñWãÆü ŽüHö÷›[íE4«Ø0OkÃŽÿXQGº ѵq±¶’t²¶†~üÃúw?ÎxÏ3¨iþ~K £M —ö‹Ó+õí#DpÖñïÆVoX£Õý­¯½ùºyq‘'þžw+7dz–„ Jqrorõñ+Gr£:#®‹€¾Òv—ÈІ?Ètˆ¦ØÆRêùóà0¢Æîr¦ïÕx³ß!ff±±9™ÅÎÃÿrü²7‹½øð—ŠÒ7oáUL[kœÃ’U,pWªØ®·¥ÆMuõ¨=úÞ‚~Ï2´ßÏôÔ k™þLF«7[GrÔjx%»MêôPÊ´XkǶÄÁQhꃼÓšýk{a„´±7*ýù½o‡ïLïEK`œÜsÁî9ºí9uþØsÚòþËîËö/®ËÇd݈—ÇEÛïögÌܘK Dx;‰Þb¨ª ¹ÛÍzvå Mô4~ûÁŒ`y¨Ù™Yâz6ke¥¸8 øKÍ,1KÖ°¬¥Ø¿Ÿ6½Þ+ØŒ{Mò²Òç½ÌEKƒV¢µ+û’†<jŒÚÙ]{¸›…Æà<;f奯úN.{èqÛG #õéCÃʽX%óÒÍ㕬RÌåËò@,6PÉnå%ñ9® :Ÿ™èvØûÄo'cj»ÛvÅǨœGë—÷V™v\~ñþr†Eÿ|]¼×{âæ:ëQ6µ=ï(™óSnÜuõ¸ÆF^¨—‡Ým›\(I5«vÛî;×’ÛƒÐëV[{ _í–;·®ž§?Š“°lA.ÙŸ3%¾¸W£ÕïívZ¾÷ÚÂ(?Vá(`åmÌoS».`­…ýƒ ⢵Ö¸±j#’³üâý忣Óiö¼í8«f#´]é]7g¦hª“©ióÃ}*ÌÚ»a<ÔŸY«Þ3MJ§+5;•?h—²ÙP¾–Àèä‘}¦â=b0•ÉuZun·Ës^jkß÷ OÞŠû–^³?­ü›©´ò~Ð:N²Kž|Öÿàò]ºý¿¸âÊ´üGx\Xl¬’è,!em/rDÖœÒVGÚÈâZ0Æ×1ÝKÄ1¯¯²ËžF(ÃQ×§zžbºôN¦™Ä—Õà&²…էÓÒîdtR ½Ìï‹ûA[§¦Õå.¼7âJ“ûš½6Ái%d‘µÒ‚Á^¹«Ç•æ3"ÊýEЫ뇽b&‹u¯9îÆ›fLf½²j`(jLŒ!Údɵí)Ǩڠ¡t‹õ†%ßn…™4é'+qÖ½;Ba¶EÒ~ JFIùÛ%Z~­]ä‚R‹ao´$±td5Çá}Í|hæÁLŸÅLÏIùPK0†i6ô‡÷ÅmŽOÐÿÂ?¯›íYó˃9 õ=OkÌu0FØO×2 W«‡Lr9õ¨OH%t¥šv¤×õÓçý`Ôñº‡E[*¸;puÉÁ™×3â­ufŘ …ÊÞ›õ|óEWkLÄ´: gYƒ†û8/S¹ÖWÑ=[_]?z!ÆsÀÆmòÀî9"ºúóšÌê¡\4‰>™p±i“/W1ëŠÃéx¿S’vãyJ‰A…étŠ}¥-W'– ‡§îʪeRÊ‘–…çkïæ§ &VëY«ÕF¦Û~к´´ŒÚ ÝZ¶[ éSöEÒ'8Ñèã˜ղù÷ÅýÅN'ao?ÅÅBÓ_sç唯#iÀƒ+/È}èÒdÕB‹.‹|¢ ÄŠ„ó¾®ùÂûÜj 8Lã@×>dŸ›Ú¢ùqó&Y“'FÀó·†cQ}+–°Ú¡Ek¹¥Ô¢ Û‘^5Óó´Z^ —Ê­O•›TP+ÃëpZîîZ.ÆóÊ5^.þ²©®ƒ¥‡†œ7«ÜœÙLFÃ÷é‘4 ~7åÉôSnï²w‚5×q3ò÷D³UŒ+Lzm L›¶ôÆzâXô}U´Þm…ÛÚqù:×( yÑ¥lªZ*W¹o¥Fùutºå&9¥(ÐN¥¹UDKs•VJÜs1-qþÞ-q«åâK77[ÍÏ̛ĥªÆcû94ÇϾ¦o§£Žro-š"òrË|Iq@xO+©ç2¸V¨ 8}¹ËUº\·ª·Ì[«·%»ò$›óÊøhìÊj”Yóø)-n1V‚ëÕJ±3µ:?ha“¼†ÙÓö¢Wƒ „ÈKÔ>Ü;”ÚÚÌ)µºø«„ƒÍ´®Í£Íø1ÜdtÐ[=Hµk5qAôÒBƒ¿LŠÅfBd±ºU“ïšÞ¼ü, +øS\+™¢ŠEÌò›…Ÿ“ ]¸cH9£Žý÷–ÒKÕÊÇNš7ø•/!íVÎ’Žf®J›ìýN$Ùû©!fGÍ$[ÛnÙÚlî—ïfñ—YUŽþgñ¼®ŽúnÔï«¥š!K<ºà…‚:«±\fNÕ5kœ©ÖÜMTjÓèƒÒƒ{öq¨½È÷«–ÓµE¬t®I9z1°hÄ" FïV¬C|E%Þù +8º+u±­u÷0…w?˜"<Û˜üîØ˜¼Yx˜<LÓýË„/uC_Ù;·: Ô j G^,cQè—a–åôW¹®co²òº%Pq“+¿óopË6\$ àè|ú4–`]¾¡Gß*ª;E¥šJ?sÁÓŒqÈí3%{üB®u”Dª¦ ú}øQÁðè¾;@ïF79Ñ  5÷… ³š vý[Cã™iè?kÒ¥„®*Bߤy¶1õ:Õ,Q•潌ö>çníÙ“ä„üíÅ1Ë P½Ó½dÚÀ2ežGì¢S„'Y½}z±#"bCaðw{í¼IbobïÆâ îqp¥ qùÎ Ž¢.?èŸÍL‡hŒõìXÈìBR…s¦×a[­~³v‘Ú¥òâÈ…œ?€³/Êd`Ùìúš1>z?ëÌDu(‹Aܩ𴠫ú=ÊãÞ‚¸gQ ,¨…ÀK¨•†P‹* € óýxXð F9A­fþÿÐuŸ ª*[诠/sNDA2"UD‚`ÂŒ¢Þÿ‡®5wï3Ï~ÿ<0{Ú:º(`Ô°,?Ë  GÀ±²ó‹væ*ó —#²ªûi¨ù3Ñ‹öV÷l¥E­&íVùRâ^…ÒˆÁÚvÍ\/ÈÀrý3€wrÀÿ‡æJ·J#eÙI¹ ª¶ßÙ¶¯Ï ràýzî;Ûö;-XOÿ ÆÂÏšµÉ¿5fÄnÿ’¼;È:yãH˜¼ËµUòÒ¯^òÊ…~òda’œÃc’÷g’ÃJJ'É0=ù’átò¦›xž$TÛO‘ö)î%å–$ ]ͦ¥³™rC’„AÙ”{ú,½IÙÇI€Û_ÿ'é«|÷ß–¸I¡Ó@Àf/{gT¸x/vÙzÌ›R'®ÀëÁm´G×5\žëpsz@iÒ†®F·ã‹^v ºüÃ`S?ÿò©Áº^ðvK?ÝÓÝ' ‰Î0»'0nÄO €g’w¨T’7¿é%ï^šªg Yá¾Ú&“{)ŸÆÕrvy“F¥àz8Tw×É>_Îì~éõ±×ùvÿ|úé £zõôxû'Œ¬ÒÇlK›EAÖ öB¸:í&{ØN’ö~Û¶J»Í{oÿ♩ƒg¦»÷S÷™Äé?‰FôÌôÒó'“ >k¤ý þ(Hz:„sHäz¼}–cÏS NI\Öïga~$5÷˜Ë ëMáQä%*—¹d/ŽäÜn<1ªÛãû o® 9^O/ÓeˆÏ¬Màõíär½ò«ýpEïkÁª0έ~yfø$l‘¤†±û̱mŠtüÎN¨ìˆGI.{í2jþŒÒhõ踕ΡXz!û­ v²°bÀ­:^I›ëi­n îa¾ž™g'|&· \,À(Ìdê·`HaÀÊ´ÚŠáÓû{–u÷®Û-BG=ð¾Ó ¼å­Ýuÿâ™9WÃO=¹˜McdÞ3ëk»ou4¡^öõ69(‡ó|±=óÀðºß-‹¯m¯€ëÇѪ„¶¡·w®#xÑÉUñ®°¾€ê’_y†'Ë=L7žÛzÓ±˜s¶KW§W¥³Ks´íÇ™-lo>_d kßrCÛµòÁþ2_íˆÅ/Ïl«±zfåªóÌÞÙÕƒKÓÝ›²%—7ÅW§wÍ#1÷™u³‰­Ä߇øäïÁÝߨ~Ö#jÑUjÓÑa¾·Œ-_Â×e[,ØØÃQ˶3]dõ­kQ÷ëÖÊÏ;÷9ûV‹³Í°3œî'–6m¼ß®y\^–? ©›…ÙÉ-çñÌÎ`ÿã}”y{g fÔC¸]KQí ‹û(óë'‡HSêÌýÚ9·rUøypú×ÓÝ~Nœ· ènq‘“µêhÑk­3çö<Û$b&†s~eìÉ´I¥]A Ξq­†¾½õ{3ÓÕ‘E8ÖÒkø¾¶Ð€qn¦Óòß<³á?sâ:íÉçWñ4=PÙÞ¼„]¿\r¸Î´Oƒoó”×R™‰Ìºá+i?,4¦ûqKÍe$õvHZÕV¥îþ`JÝøöùäcºÑ?h¿|óò€pûP Æ/æÅ \® ½ã™AÜ^â¶í7ÛîYÓΫûöxÚ¾eM#žÄŽnÕ6kXë•ò¸«Â.䜬oPVÞ+E¹Ñi5Ç“Q’·ÁPê•xidг©øˆ®¡ˆµ‘‡ðº6!Áv.#ÁÞÆM°o¬úAù%ajëÝ™(»Ëä þ€!mz¼/çžCç>®ÀK‚Và­Ùþ¶DÍkyÉÈÄRµeÄÍUZè»J¹PØLjÀý 7Ûë¸}Y$’^›gG13/àµÛ1ÏF…eaÇ ÙÁCùÓ~Ôuù<í_8v=jqì…ä9ö}Ñ8®”¨\Àå•“_âVãèò½ûbóÌI“ èŸz²O.Ö ^0íRc Èšitš=ý9ï¤c1m˜kJJ8xê1‰rÓ˜yãÎd´‘úâà0B˜ÖU´ìúSXz¥œ}V«<Ým÷¹À¤†ìƒƬØY[ÌÞ¬G̘zU˜1}g˜±¬hÌx6U˜ýÝKó±ÏFþå¦þaƒøÖÚ)²]9ÞyÎÐ<ßUãÆ´ÛJú+µ4°á ¯úܤޘÉcu44$ƒ…ìšËx"þ<¯ò¶J³qÞo¸7¾ l®»q"Ñ[ð¤é|q'X\%À\¶î4ÖŒü¨hõü¾R·~9CAr³2Dµ~\ìé!™i.b¨e=ì¹ ö×(1t ‰p­üA"3øUú¿›/ç,K{›EÍÖ¾o$8óM_pt8;.MÔ°(±¡l*×—<¹ÎA)ÆÌú‹æ°˜´!XÛd…•¬ª™^aóKúüÈÔí|I3X ®/C¬y|‘6/îè`X#l…“ñµ´qp¡)Üq¡5ðõŃ:3iÀÖ£_Ž\­à¬‡èDóÎÎTZñ·D ¢~À©¥·kRÁòÑRiʶñ}o”φ»Âñ)ÛAú͇èé­àƒˆ\"è~Àïf×?Bó•„TU/ÑãEy‰³n§ÎèN\E•:ólˆCâó•nïÌÊVïͨ[±B«OÍ.9\Ü=tÎS™ð÷ccž¸Å R¡Wx=¤Gk•ûTâoÄ`™ |_Î`Í]9hÁö§Ð tIÄÛ¸ 26 -ˆŒ-ºzjà±ÉÔÎSïÒIÔeŽÄåyt G&i­xü´˜ÜË:uí_ŒÆîÔã¾ _¯;8ÌÖš-’’iœ`5šc|„ïN´†výz>6´Wn®,á9ÛA6 ¡Œ¯öûT1bz+²fôØÚ~ÿöŠ«M£Ç$rõV³øAø%Xkšé$@]ðLg2ë‘î®]ZiŒ–ˆd5M¾õ²”%îÏd>F.D¹À½"ïTðýíÙO[ìx|X§[àÑ>œ“‘©U0àäZX@ïGn‘íBÔ§ûå{/¡|¯tV»]±w¢;ûYGïŒÑã®Óx_êÆV¢: g%v¤ëú‹ðËè+Ì\Kž>?hMÕÄF¨¨nh–’ûmisÐ`;v)GúLpÅ[åp‡ÿ†Bx1‡ÌœA~2 Ø9_€ÀÚVé3òiÖ ×'§W©i>Ö­·r׎,´Òl?j¶»ÍˆlZGiA½ýºõ“jó¾’Èæ}¾›÷‰+4ïìœÿÅEÜêt!ä,s7®ŠN·‹âäTiS0«Á\t?+N¿à$*ëã…ë~Qr÷Øg5èÞ[ÇØ¦ëF¯Ê‘®´îR݆ÀKÉ^ÖÚ—ælÑî©þªeÞ®Çf‚ÔÞMLVöÍÇÄ´/7²ÈqUw_qù¬»sX§ÈµX§únJm.üòO}¾-à†±LSGUŒÏâmoH¡b†Ý:É:^Ó›Vyº|èŽM3h÷ 6jÍ@3n!«8ñ5Ÿ\£ÞÄ·X¿ &Ùp ƒØ Pkä,Ô®3€¼­…Ã0®ñùV±ºå ¸:ª”GÕÚmïW¢é±X‰P‰¨ŒÏ+±2^Ûb¥IHü/Ö>w´ÒœÿŸ‰éoH– —àD¶ElÏö‡ù\Õ ‡FÿÑ«½Ðck¶%ÂúªçùÕªo«Œw®Ü÷»rðÈreBëíJ»yÁËçs•+k«–{Ä.ï—L¿•`FŠI©Ø.Î/>WÄ Ò.ØIãUxÚxáuÒF…W(‰{€ ¿Lã˜žé ¸Ð&êi'(òȰe‹ ½xÝÁOócÉT¶ÙÏšÃ3?n͹uT_]²aåÈ“n i_Ýé‡AÞoöy¿ÝŒóô…Ïæ ˰†Ã”"2 no^zúï.¹­J•r£î ÏÕâ™–fÜ1Í­ô¬ÌFJOÌÕ,büFÎ9ŠU&R¶\å9…®‘ù†AKJ³Ù̺Sê5 Ú»……ÅK½téí*^Š‹öÝÉû¾aƒÛð³o–ž/ÙvavÈœO×GFÓ*¹Làë€é¥), Ï€WuÊú ÀÁ¤À§Á€Ïå_ €0À×yú¸ënþ‹Z×M²ì(ÍÇ>…oÊ™Èø`Òu!$‹êõîqÄäZ@yÔÄ‹p,üf[pò \Ï"?× /Ó{vé¢aŠÈ ¼ˆPxˆ6*ˆ}êÈ…¦´ôÖ~@혀vëw<š*l@ ê  &è´k¨çø¿Œç·Ý„ß¿6<=ž†ƒCø@2—tºŠ³(6ɧúªFûZšÙã§žÜw`uUÞd.{c ‹Aú<…Ùú_û@™NÃLͨ¿-è£ß0Е6+fžóÔ+€EPÀ¹!€ƒ ÀóöÀ›lõSmIGïó_q•Ñ‹[™!hk€,·ÜU»@­ "ç\µ]Î<‹Ëlõ’ç:Ëc®Évör¥-Òt6éþŒ¬O_ÿ…oŸz²¨Ä¶¼gÿ)5ãÀ¸ àø³Ț¸€÷º«?‹9|§÷‡³öwZ0€#íÏÌàyë—䵌–ÉKw¬äÕM?ó`#ÔL’çCO’Áaš$Ä`²“„D‹)~7I†µaÊXJÙ§¦JN ‘>ŽÒ)ë[Êë•$tLª)«ôט"‘2ûVzÙŽŸX%å˜ÿS™}¼ÅàùX֬䑼ˀ“¼Þ§Eòb–¼r¨ž<PK’uf–FØòSœKa=—b4¿õdO!ù”¥š’XÊËì6e~J9ÜÓðò@ VL°ª?–•IÿAìÎôÝkÌ;uòƒ{^N1{»žÿ¡dnO_~Àßý/É›+,“7v§Ñ:fò-mÔVÊŒ·“'êl’ä|JÕ+é‹’Ì·¥Á5©?º1Ò¸òË8H¬<›f7ǞĖ½Ý½ºðŒƒ6‰KºR¾ ÷ {«Î á*½íéåH¼‹’{¬/mÿ^ÚÑm}¾È»ð/’wP^$ïù}šÆêhÉkÃ|ŽËk9›&/rë&/Ø%ÏU?NžóE>yb§FòìtÐM¬­7N€úF“£u÷.÷^¨íWq¹ln¢D×}¼¹\›È1¹t§ìY÷ÊõÓ½0MG¯'„O”ã"K¹G`*…‡a¹°·:äNXùj{õËÈ׿)…4ÐÃIKÞ_MÞ `%o¼$¯+}H^#åž¼ k!É”Nõ»ï‡Ýô¸ð‚ƒÞFcŸºF¡Ï_[•­|Q¥H?_§ùê\Óý– O(\ØVírÌýça8”K‘äðÝlJéïà³–ë/Ö7&g­ÍBšŒ@§ë<|¨ÛÙ>xúå H¸•ÒI÷ §ú¨fºãvü8HÛÛ;>+ÿòÌ ôy ©=3 Ý|fBoþ(Ùß󋡬”#ïåý(Ï™›ëªï®Ñ~8vùü®|¯œøaXÉzÛ]±èÕ•º++­®Ûê PG5†äòúàù¥1_(öýÎlt‹W»-J®nCšœ3+o2[—”ñŒ¿ŒÇ³ŠNK³Šˆ¾ü€ßÍŸð¬é£D‘æ9¡VìÑ«½VPðãõ±mwÉB›ˆ«Õbhz» µt'Fwãh“úaiêõØžÏ*¯ÅëÕD¯ZZdb¬eQ‘fóÕB æ¥Ì„›­Ýµ2«æ‹©Äw·ÓFe˜m„‡ m z\‰$ÝÜù¢K3áÿË3óÜÌŸYäm_^K:„uŒÙ)Ï>²™®äθNˆW# vf×Û$Ò¹,%i‰´$sñŽÇòT8˜&ÍKÇÞy&v°dº7Èì´qÀ‹¦Ò¦ÆE{F/ãz,鋞cM³ú GÃs뛺d'íPÍ^3´BCEA)€ ÿû‹oŒ7E¼ë§\ðv]Ú"׃y }«¯ÊR»èžr›êr–  …Ó h«ãÙvä™S¹ô‰›jNô+3Þêw‚>êˆÇÅšõ¤_0àA•tÕºšƒ¾B[9 3ÀhR¦úSy›vrMVÆã¸„›žÀ}`¥MÐÒiÌþŸw|ػ̊ -Úš¸¶¥Î`µö=o UçV›fígÜ)Xþ­ÜœíÊel*šœqëçdýÑ|¦m·µ´L#½Ðeg­0#ÿ0 WÎmR)…oyD®ó?à8òoq«"’JÖéÑÕg”‘Á\}ñ~q²âÌ !ÅôêÃð—x³s&;Ò¾eï0ÏåÞ‘»ÎèUmÛÆ3? ÅNfV¿ŒJ¦Æ=ý±W ÍVe^¥CYa;s"Ô[–,•@g|‹ëqË#©»ÎÜFf6ót£$¢‹^K°3. ÜÄ»…ú‚ž®1jŸÚ¹IÒ†ˆÿ0ør;uðù±¨V” ¦z̪zw0·Ÿ»ör–T,®³tÜ™qó•Ó1l¨^%+ì1CMªâ—Ì:½‹Û‚kH=Z›ÌÅÄç® ¯„—bÞ5ô >‚Çb ®6Ç C{Ƥgåمݳ;ÝIf÷* ?¿\ ¨œ^ù£óRBiïTT±å“[uôùRE@˜½8¼joW~©tÇ,O6«yW“>n¿(j{° &‹ª,b·’.IÖâ½vâðy#»áØCöÄnÚ×ÈVE¤ÄHѸK[E·õ’F]ú«-¥ƒë*¥çŒºH>ùaðÿå‚2ÏÙNÛRÀq}ʽ WUp|ª•ê’~.A#Ä|D\‰mžf-™ãD]g7¾b±µ¢î3cbº§žÓíg”£t¢ÐÆ>"…¥L¦w§€´D¸H&× ú¦"øhðệ}9Ö§ÙŽzŸùÞeÊ™MQl±µÞìМVGITú‘fþ5ß¾ŒÕžý–úÏ ,>Ý #8ÜåP$8îM2i‹mû¸ÈDhgÂ4µ¦I+qß¡®Íþšê«ôe8½Ò:Ϊ$®(±¼‘#‚4È! Hþ&ȈXÇ> ¿|ߘY¿ÏŸ9ð~óPËų…YB‰èNµXÕíþ˜l7övÜíõ£Yؾ‹ °ƒÔø"„÷Øí¥†2QL«Uàénå*Q†t׆÷àn Ñ °"Tá@A?=úDnË” hô… Çã¡â98ßõ²x¨Mz);lP8ßÐÈ/aÁ˜!ín¯‹^)Ûåëø\Ò±žiFÉhf|f¨ÍhÞHv? àBÁ™gÞû7'Ô2+Ÿ-fR}´V8 (³±ÃŠä‹srà83ÂC±h?`àóóbÛ¾‡]l´Ü²X}H[è!O½±:Ýë¤héÑÇFž|€Ù©¢þ}ÇÃy!µ`Í >Srpÿ[TVKv=3zÄÙPpqÅ­7Èž•fô™Ø*HkÞ¬NÅ¿?L23Œ|çÕ4·$ \æ ×QåÁj΃â[^â¹Øb»YxCö D[÷J9ÏT é•ÊS¤Wn$Hˆ[ˆ6 0r^HÿÅvªÏ•ïûK{:£Ò«¥¾S}†Áߢòdl¾2bÖÚ‡œX|ÚŒÒ<­i½\¨ØC3Ã$d*ä{Ç´I²1Bº<$Áˆá¥ÕP«›Žsƒzdø¹£3ÒóVÙž3M(!P²ªwÂ¢Ë ²ÀM²ò JG)púeí´ˆ‰§ÕIÁöš fÞÄn„‰œ{È·¨,wŽ·,–/[FÙ‡65½©«ÏšÃ‘N9JÈœY)«Þð@·PÇ¢ôðaM½" Ê½¥"ú¹8…ï½®#ãÁÂÕÑ«¿¼íj}r ¥7¾§¯ô¼Wpîy—i½ç]³H?WÎÃ?àgýòýè„“”šÂ¢\1³Îå1Ô÷ ‹ÊÒìºËq»LõHÍBÇ!ÁNÅ„âzPa™>Ú˜ìÐ?T±–|h£jÚã‘[ïE~æôŽ,œÞìdhgL(Ó,ºý¡ í{ŒÉ$Ýðh—»¼ZA;Û›!wvYëÐÙFbµ³õ/ð¨³íû¿øn3^’µ‚8¤g΢õçÝ·¢µ‡eØ6DwnæØ‰Ô¾ ³ßÇ%Ùœ¢—¬é¡=z!q«õD`ÈÃóXªÃØÔîCös…CÙÁŽI/Èg©·Jnzw<ìn•ªl:’5¸·€ýùü~›‘Ö%?·´Û¶4›.·4í·4aµ4Âëÿâše¼›ÏÑwÒ·îjÚP‘‘¬‚Ñà7¢ÒS®z#Êy?Du{nÁ@·½ü¡Üú~Þ¼ô ÜúÝKæRÛõZÝmƒº5…":QÇä;MÃUÚÊã`µ®8¶útmNóBã‰g Æ0F Ü¥× |J—@Áƒêï§Õ¯¿OzšÁ~7_–Ë‹8™*×±‰Au^Ý4aRÖÙñ•‡Ã\ã2íàÅÞuzü*0;òÝrÚg4X·µRéÚº‰½wˬ‰Å-›Í‡|IûXsŽ5¨Æk‰6©™Œ¿óëÃwæT[‘l®ÆænÝêšeøªPnúU!Ó/UùݪV(%û¿,ø©NMÅô¼}à&Ç[ž”¹¥9L´yÕ©E²Ï vBpGah{質éµ/}}Úx›w£N—£E=¿ËµÀ$O5ž>k¥$ÊW7‹B£*¨Z«Xte¿‹å4×ìYåãIÛ–­ø.]âIó,é³ Sê£W§Ôï䊥>0†Š±AÃÅx„C¿ÌÛ½¦fà@Rkôœ£%àw £GÏ©JlÀqUîr裄ßÄ×ܼÆwí,Ÿ.-­É•yñÑB½âì¬î‹¨Þ ¯~&S°sƒjaàÏú… s2Qͻ틗^Ù[4³UpÛCy2Èœè¿ûè_pô7}äËøÝ˜xÙW´²˜ÉÜ`Ä¢]ÃóPì\7_Áô¨…|ˆ;§ÝcßȱW«, ó²ÆòzáÝÜÉyêæj¹eÏsbgåäª×Ç&»7[—ìæß?`¶™ßU2ǰÒO™±™Nå®—=ºœ}ýÖ²ôK”ô;üèW˜jÊ Iyâ¿è… 3™tÚ¿s©{[­…]—JzVB~½;gaxifئº/ˆn)žøó‰u0̬Õl¤ `Lµa+Eò;ìˆëÞH±ó´¨´(\ èÜ×RŽ!]&/ºb½€n ”r]нPO (zT唯ä‹Ò¢ã‘»LXöbð!Ÿ{xwòn@+i v´µóhxÐüPm–A ±'ï3Ã9XéUf™3nêé«ÀCÉà‘=`ãå°ÛÝðntÌõ U¨ Dاd²Õ6²k½$¡”“ ÷iú³‡˜Dbä š)õù—P"¸žÀ)ãÎÊ]P×XÎýJGÇ@ AkEm&»â€k®òÅ™ïfñ` ÀÛuú]p |Ëý§t‹„|>íö ÅB  (ùP9,}êÉ«N@ÞÀ`J0:ØØØlÔ°9° ±N¹j][3rŠ¡áÇÚ”¥œ¹1ÀϮևé¢Õìè&ß(Ü ¤Ò•áÓXp-e ÚŸz² yÿÖm‘p  ãë@ý\Þ½y°~°¾˜xʘÓüTmõ6€w³ƒa”ò°þý²~7ŸrG?õd(Ðÿ¬PÊüYÁí|I^µ¡‘¼r]5yNã$ %>I¬˜²Ò“„è®Rük’-0eÖú_uÐOuôÿ®„Â…­ñg¢í€K6g'V‰Û'ØÆ»ÿ]¡%"åñÉKäõOE±ß$Ïýc”<›fú<ƒ62WÒ‹NŠqLc?•ÐQ-åôœ>d¨Œÿ”—ÿTB¿“‚­¼yN°À½?ÞÜîýX–ß…ð‘•Jõ»×`‘;u|ã ;°ã’©n¾%ÙÛvŽ7!1·ª5Šþ"ymd-y騜¼ª/!mT—M’ˤa £”‡•†Él?-FœêàN' /7ø6ëãÍâã±!µ»W£gw*/ã 5öcöòRÉ‹Úó·Û~zç%lõo‹ì¤ÌK>X™îµzÏTè.‘Þz»œ>¥ê’fqEU}o+S•¬×—ŠÇV|%¿ií&\-MŽJÑè%‹­yq¼×víqãÒìâ8É’‚5×£Ë(Œúu²+ÆèüE,-ÃÉiyÜ [CE°€ñ+-ONz%’‰·'ÈÑ¢eç8«Ñ|l*· ¨ß9­‘ŽøõI_uÚ¡øý4A [¬8)k‚"‹±dŽ£&k›ªäKÊMÛ®ùuÔW6€8½&IG:‚•Ì9KÞ©ÖÞ<‡Í”SûC‹ÏMÃ4çÿn¾Ü”š¯ÂÑ„_Û4£‡¦cêIÑÎÄÙ×|]»¦2’YÆèvÒžïÇK2qQ)¦£¢I¥Cr½Æ-øHKª²F†Èâýà¥9¿ˆ¶ƒ¹ð¼Ä¾0€²ïLªw>w!óÓŸ¶¹Â#K±_ÓÃÙ?3qµ ÙÛ(̾N*T±"%®=º)4$>F.¼&Í¡0¸txÞ­5Ç<(wtŽ9ã6»®’[+'f×+Y’Žé|Ms–8äÓ›oî5Áö£–-^a>Ÿõ1Ž¥CŠ]/|ž­fB™‘¨È¤ÁӥۙžÒ(ä1¼jihrOxw§cò›Gòq' d’[5>Ô?Ô¾|ª£éæ”{åõëF“~ãŒBKkË6­°:-MOõÖŸ…ÑQa÷{KnHœ#õ$½±øYxëã7ï¡£Ÿ×F5®4å;lUEûŒtC1ú(º­ ÄÒ®Œ:L;ˆ5„çΚLÚϘČnž°j— ‚¦@dùê.%ÉYªÄYJY³•_kà<ݤIx^ ²ˆjÍGˆX2 vœŽÅ4§;8Êû…>—ú`‰x+ò„l|Úó…bîΕ³`†­2E¦Y~ÕieøhS—Õ ¦úå 1œ’/†LVà˜ÄK­)±‡+"ç'¿rƒümã~â~@œƒ6!ÎÁVç|¦Ê(‰$Ж®œ#ܾW‡þnÍä+³ËP :;&=­»cò~vds\(¯Yñæ\˜q¾Ò>¦\]ÒvyxÇÜæÑíiÝ]ŒLÇAÚ;qàÅg}P@Açl(ÂË„¦ü~¦‰Õ•B£ç¢Q™xc5.®~¨|((}ùw½~[X‰âX>ƒd­K½öT«àeÝ&ùŒR±*§ZÎMy_è*ìVgŒ ƒ­r݈ºn™ûð~`3C´-É…(Õ Gf;İ¥¡_3‡ƒÂÞäÓã›+ Ûª·ÏO‚;TnŸÈIu«ˆJ $ÒÍ•鈫úDÔaþ Z–?”>¿læÏ ç7g[b™éÜàùNowLÓ%«š1ÙI£S¿|êɹӔÝå}®»e\l{8»¯×ä‹Í\ÈÁ¦þ"ÜZ/O€2V0k¸…¯«„WÆÄX=T¤ Ú’æ¢ÏøÖm=`Èœ”¡âÐìMÓ‘øìuy@³ ]‚íñ/Å/ëìÎbÝëzAØ sFf?ß1¬^S¹â 7Ök¯ Ï2§9}v´Ñð±ÁÒ–{SµYŸÈgç‡;ÞÝÓ[Ÿâ,.h¥2¶ÛçX£Y꡵#ç[oÇÆ†;„ Í 3è¿·[ßV°b? ìОëªzÏê·~掔û™¨SüPè5¼ø%à‘M³‹Y,Öú°B¦:Zêé$ׯO¢l='!ÌíÊUÏw›šBî„ðXp™£†oèü¯ž°-6îJWôhš/T¡ŽEäbí«H¸tàé0F dõB8OÏýþrØ3úÙ•ä÷èÒîÒ †%°[:˜P·täÕΆ'ÏÝ’+¤ŠÝ’äñåô°ÌœÄ|Ü^aæôÕ†µ‚ÓlÈ*REGØÝØæ¦éÿ€C€µU|[Ñ9ôÔ¡e´ãLgˆîWHÿX=³Nï#W1 - ¥ s½Ñ'ßV¿Ÿ[‰}¿p]î•(-Ùs:5_;¶#6›k77B·uµÆ­õùÆÏÖ Žò­S#*´›Ò=…:忸fñÉ,ÒàpÖÑWˆ³°2š éѹBqìÆô­ß f³6±–é`tžAƒMYë»5ÄîïÖ¶ÎŽiOî­°ü«W\ÖÀîšÄ«ÝŠOw:RqŒ¶‚Å´[ûý¤¥µJvó&û¦Y=‡ ·óÖKlÌ;µCc8`cvõ Ùv‘ÿeiïCƪQhšó›³ÙœÐŠJÉgûÚÐ.Ï5ºR<|·š\ŠÖs¶<¹Ÿ|¶[]ãÎ8ãÆ>çµcdßVšã[ë¢ê¯–ÞÝZýl¡ÙŒ=n"ŽjX]úÔ`Ýý¬¾¤á]=Ú¯]­6kùý¯åýgTËÏ °–g¿`rþË"n¦ZNw –P$Â¥„všBi£åéøˆÝ‰ .ìÐkëü­'–j'¢>M:‹|c1寠MÀAöêÎÄßÕ‡íûµ] æ;|©Æ v­Þ±*ÏÕ¸j¥¬›•Ñ(+õ†ð,ËJÜ(·ºs®Üª†ûró>Ìý€¥“<,”N ú_Ì£#šXzgQ7…6!ë‹´Õÿ-*׳w\¶žlg^w‡YFËì.FuW?Е]Lq•ÂJåÃsn”'áÃýËm¡¾-]ªÃKIÛ¯Ro|.ãV½S„mž($ÄI.X9Ò-`~œY¥š_–{tžpÑMÞÞƒÙ¼íuKy{Zÿ/¦&΋z^p¥Y)‘i 0@Ÿ“Ås›Ü@êywd¾ZD½Meâµ{>gÖ=Ž‘ªµÖš+õ•„(“%'ß1?òèÛ‹”I2àú2ùú,B9r»~ޝtÓ+Lv+ÍÌì¨ÙÜe"ÕÏfäô‘‘k==#×÷L4¼•³5ãUùÅÈÎë¢ZC4Vz.œßåå.U© QY©÷~¹UÙµûúÛiä¦ó¬D«®\|X.ïÖ/ȶ7LV’§b¦]ÅG€6& ‡XVJ=”8§ÐcáFÊzô¸aú>—ŽtÞèbè‘ØèAü èÁÅʘn˜î/Z™xˆãûáM k"‡2°üjãXúN£ìóµÅ¥ áÒº¾ÊŠveRŸÅùô,ç)—s.›Þ^å1 ôQHYNRŽFú*}½±úKm›r¾ý+• àÜ  3 jNOYn¨Æe¨ÞFR^*5î'j>ÛT$‰ý"_oÔ?s©™x8è“Ü‚HGè=B }~[HÚPr;ÔYá¸*_ «UxG] n®’px @-O 9–h•—è@˜ º×!SЀ¥EÀ^¥À±ÓÂ¥géß‚@Ú@`¸ tL¹Ï„ñÎ2ñZ¢HBÊNû2ïKŠÕ;:,L×] Ò—ÕþÚR³mx:¸}')—ûTÓ-wÙ+UpšÑé3§†X€7}nà¶òËAÅýL¾]DrzÞ´Ø(ê”tÒìèáÈX^³¬Ð:XóQ°–O6N]Œ¯VRÖƒÏkA·ëtòZÛp­ðùº< IØ%ÓWÌ#'µÙ[­•ö´Ø™±‡÷†GžÌ»×²¶c¾èn³²^ë¸ï@ñ"ÃÊ=°V•W€OˆüjyùÌç_åúB˧gì/wè•…×Øï¼ãÖøËi¾ýÆRÕï}½û=ۘͺ¶á;=bŒî—ä=I‡öïÖÿò ÆD?^¼ö½ý‹Ê/š?àqÑ´Ò1Ûßœ¬¾†êy6x^²ã “++°˜·|F(¹^¸¯†^éEîh_œC…}:òNÏ-ÏeeÙU6mÛÞ˜ ¹„°˜çÝ™ew™ÛÜ•>ßÁ=Ÿ™ÖŒÅwY p둼<“¼W(ukBqïôlÞ«ÇlRÌF«zDŒº¾mÎõê#D# ¿¢ª@Ó[§×uW’€4ik_¹¥æ&? m®}‘”ró¦×\ëÝGÖ1#V–™ÞçÔÚfA5*ÍØ{­3Ý ä`Z]ï'æ^œï }gõË®ëºØ¨éý~µ¦Å÷lõ—'0ô…0ŸóÁéUÓ{QEá+c_y†O£qÞk}·Ê«åÈÝ+¹Çò²Êäm¤÷ª/€b¦oåzbNO[ìŒ »Òt[Ô©¸NͨÁ/ͦ2Z§Îbotœ(íɺ¾2z?èV´YyÔWŸÆ‰U°¾T¾ýPr7«:ñM¥2a`®<)$xéCñ˃)1ÜåF±Ä¡Ôë÷Ö á‚üÐNüJ¼ŒÜèùNg‰®~ÀÅÓî­Ü³ûœ…;¢8)XÔªo¨+ ×o%–Ò!QàµY$Éê«5ÑÕ=·Ô qX)Cﱟ¬ŠÅx¬©œ¼®šu¹2¾aãjhãú†;K“Ú)Ÿæ–­èTå0ÿZk~‰G~…=F~°ÕGF+ U"ï5Iø±Œwxdc"êXÃÛ|960síbôjÚ[‡[VQ}g­†JÐ^O¡ø%úNV»%9)5,ˆw”©‰ˆÍ·…Ev¥YóŸoçüŒ*rj¡²aþ¾dË|mLj;úÁÔ¤m‰Ž§›voA7—à:‰Tæül€!Ñ÷—ÓR1ÙÍlt…|)3¯-Ñ´VÁò1kÃO­VXªÎ¸)O¸‡£Žåš:—:¯E0‚ªÑID›§‡0èÞ1oEηéÕ’+\× 64n}¶üx`ÌÏÐtäÔÇ´¢0Þæ„!tÂyŽpü8Ïë|F«¤R…ì"ŸÛÿÀludؼ¯‰l¾×±ùVñÄæMæöÕ>ýbNÊ=e<޹!~ÿP½D”Ðî²Z‡;ôU¸Û ÚTc÷ô´¬¨ ¥ÎÉŽL)Òy]µÒ>ơݎØVQ”^‘ð|“;Ai¤ þ vÂkín–‡Èy‰3ë+š]ì [ ÉÓè¶ôîoèV`~hBÎq4¡°Cš OGš`MÁõ‹ø»™õ¸ª2²à±\¤ã’ áÚc#×zàÔ£QA»ÊåT´(¸ÔâÒ“Dñv“%9kü¤^²y½dø\ÔŠ8_r¹äz`—#äÆ3دWçffä,×!évm$QñöjQnKí“—8Z“<‹&Äý¶¡ˆûýÝ'î‡Ñ¸ÏWâ>X]þ÷ˆ~¸/xéU}8¯reˆÎ) rÍ‘C%éü²Þ÷¦\2ÂrñtoJ=~ZæõḏuØ’™­Ó¯0MúØf°+ܧÓòŒî •N<'ªkmŸTÚÜ,Ùkâ()àu8Ó þºf=|ÔsW8x&Ï›†‰å™\uP÷òS®÷ã\&¯\¨ôÊ™ànY¢Ý{QùÆ‚{'Õ³³9è3³:Q¨Û½#¼ç§ Û`fåé9ìW¡4†!Å\³Ú<“o^~‹” }»äæf7ÓÎn”¤–a¨Š xOJqn[€ûµßšÞü² ò€ ˆC 8Þ ‹çIõD)Sbž•8—š). Çw Æ- ˆ'Ùâ™q}@ÜÄ*¯Vû ;¿fÔj³iÓ¶“e ¹ò}îÿ)‹ŸÞ W©»Y,4;ikÂú=YÄ5ˆM¯ÄÞ0ø«“~õÛ>R¹³R÷pÒšüé=ýu<Iru€¼œÍ¼2ž@>S4?ÅvŠû( @É(,P ¼ó…Å]{’^;µ(ùÉû%-V3”r¯è~Ÿlò£Âi¯ÆÔ¢ÂYïÿ«'uÛÿ·ÚVzuWÅÛÊa÷W¼=ýní'PøC(=Êu/ÿ]‡ìϪi«Û?gɪˆÎ~«mÅÝýŸ™íYü"y!–™$µ»”$j,þÓ¿¥«^'I4xò•ì’DŸ/ñoù$1Šú?ô[hûõ³ý=Ê?ƒçbqýgΩ mßJæ›íçÇó竜ÿÓjÿ¸Å~‘óŠ×?5­¿å¬É«í¥Í<å~›±¿GQ—Ü¿Ö~+‚Ï¿ÞÆ&Åá‘¶Q@þVëù_¡í×r`é'!e‘LŸ“B²xjÛÜöá¹ãÙ"HÛ î…´…Üo¡íÌûgáðUÁáßõÅ”9[|jk–|D¨Ì?rmC½['øºú­që´®{±ã^[É ‰ÕÑèâ‚íü|1NÛ3·—SP2qÒÜr±óõã„q{GíêŽPϾøÿÛÿ"yݽrò Äôž‡>–¶ÑÆþÊËåܯtßj='9/xDÅÙü¾Äw‡Û†>Þ®­Çâu‰å}ö|Ñ6…3íñS€ìé8©ïù8Vv{ù8!bý¹qõ`^ïÍýRøtwÏ%ض³Ÿh[ÚyCo>èÚO£ÕÝi˜К±/œþ’7êÈéE…Èä•sóIOðïÝw‰ïe}˜›JÚ÷¹¬yq^HëìgÈþI\b“ã§™]!l÷KîtÜ5^£Ó¶éÝ6±ÙK6ôr˜YûÅanuoŽK+ñ8#—!½ÿ¦-´gþ×*RªA´ÔqTƒ›pTX¨™]‘3tÓ%þþÈ´¯{!mè,Á“4{ÇÒ&ÇTÚ¥³÷q²qRmaG¨­q{ëÆ©ÛÖçcþÀz~o¬îM{™´£îR9-ƒÅ„ÝŒPÍÍd¿Ž–j|ˆ ÓËef§ç>ÝײДØbʼn‹«Ìøâ„Ƙ»ÒÁè¾}ŸF’¨eÂá a˜´P ÍtÞÿn¾HÞã¾¼9…yT§vérF˜÷éq4Χ`ü>¡ïÐÇþ¶¾ìƒÏJb»ùÅdÙ!ç•fjæ:³'uszÀº)Ùéu&îyà¯Útøùh>=Ú¯ÍH:gãpÄaDFvh ]l˜=gÕAU ½`u0AIŽ¡~s<ÉôñF˜éQü‡ä“?+«–Ðnÿ(#eõÞµf¿!›³nÏ6Ì™-_áh1Ÿ{ñl{h>§Ï'lÅAÇB·ÏŒä¾'†£¤_3µYuhlö`¯AÞÙõ‚5ý¥)¾ê·`áØÇݤçÐ;Ä?÷Jéã{ÆÖöú®»î&éÐ×Uš÷—ûÁ÷‰;>FÏÿð4÷žtu‡sœ›ÍÂæºÏý\3 …&[Êv¯Õ=4ÉôÖ„½ëÿÁõ´3Õcþž¥WŸvž£å1¹÷ÉÝhüÀ'?ð°ú¼w‚íkôNýSÇЧAw4<ÍÝéœù³xï¬>È»SÒq¸Ýœã…Ö‘ˆåÉlóÌÕå&t »÷ض0:ù!„Lëï¶¾¯Éå»^>Kdš‹Ít¢S3³çu >²Wká”.¿8[9}q29e{i6‰Åò†f§WésƒZv?¬ußÓ~¬GŽß7;FwŒSužàngÝaÃvK-§m¤1ó|jÞšÛyÙý¾5žI?ßPÔ>ZOÇL]3vRm¶¸µƒ·¬Åµ9´ Â|U]'Å[­õ •}I¯TZw%ªÁìô…Kýø/H'`ãÙa#¯ÃM‹N Mäòåæ±Ã>èˆë©ÿ |·«Ùè¬ïžÑ&êzó"zž}¯ÍƤ¹X6”çíX×>ÇK-ÒÏÏZ†2ÖÒÊ!VaSÀªŸ—*zÐäJ›r¬ q>vM—ÏOM&Û;~õ5xz¥è÷k4Òï7%Öƒ4ý?8Ö¼ÊGtÖÝl²ãLkù쪫C年g¸ëîì«o½å– ŠX±ÑPù{³®[¹^-ÚÐkùWVQÖU{l^*È|TÚ‘ Ìâ#&S1ãZŠ9ƒoCºþ µ–.uûCí¥åwš5?¨â¿±%pôayJ_ö)î‡_ìÿ¢ïvñ «Õ úŠÊã þ°×Ü…¤{íNãlØÒb"Ô§Y[­UÒèØ*íNµ‰DƒÊ¡¾O#¥ ¹‹Wf—¸ì«{?ü5yè~1£K ™×^K›ÖÊÅPÑÀ6i” ‚ë—³ñx­VËù§šÏ¬)5]}e5ooRø;5ŸìñÝÛmÆ<½/óæ®Uš(²›nŠþ³ïC½£7½¹ÓèJ~óV™õéDg¬:{å«ÍJV¯P,Ò0Ó´kôBf`je¦¦µ•ö†í½V¶Úg-CG¯òôr…˰°X?%AÍ+튲ú\ºJÉàæò_ßäfÜÀe¼ÛtdÜ#W)Ôí4ϵÝë‘Óc#*ÑJcm݆ûž›ü•gÑ!f˜o»ž‘>•ùA‘ª‰)gv¯=ÙèÃóª>,¬ZÚÛ>ùZùðË3ê5+Ã>X© ž<ªV¶òPóó^Fiä§¥´~±r #u?øÉ‘?3‰ú´.âyŠ–DϤÚ?pº¹.D¯‚lÄsDnÿÃÊð fÆ©\iTA+pp‚Û/ÿ% Îîªà­ÚŒHöPË4ª­ú‰4¹b•Ö‡V‰Óƾ i™Gµ^6厣.ƃ4S Ðh¬¬÷§¥Ò耽¼;#W¹åñoéx7r’Œ(ñ‚6Q;­¿Xæ8=·ô¯ßx-Ðs³h¿Ó+Ò»8[ßY·ø˜Ô–!gTèÙ–Ò•Á+GК.ç*7Y-ÔŸ¦Ò¸ã- ʾÜzUC™u#)®¯¶’[zœÅK$¢O²°pïi<&ˆ·Ä'hðÊKpŸÕýÀM~ŽÓ±aÓñê”›ÓõÿB¬æ»u†ž¨xÚ/>×hûãÁåÁ­sļmSVÉ¡e_ Óxä~=UÊ‘7,ü.ÂM(XÆáå¶9Ö¤8>7$· »âåV DfÌDÞ쬅Gn Rmõà_Å7Ä«­R‰›Ä†ÀéîÊb£[±ÏVÒiŽE**Ĭòf•Y~Ji&žnª+¡ëÿƒÈ¹éqVNÐÁohOÞt2]«4}´ÏgggzŰÚ鉖þŠ_‚Z‡ú™ì£¨Ä„Jì5Ex4a ,Ú‚ôüõçGÊ{Ä—Ai΃­±ç¦Íî•ËG¶J ,rÅ9¦.4+ôvxð親¯i<‰¨Ã>gP‡èÒØƒ]þÅ_|1㉮¼ x¾Æ0šÞͺ¨9x¶úçÆ¾‘ñq…ƒµ†6c^’‚·Çhšy^Šü[â|¹sáùŒBèœ1ë¬7vÍlõpž±yÞ0õK)fJ¾‘Ð͇“£ñÁ™þ©Î‡Òɳ=è’Ž-Iö¸|7w©·z@ÜÊ·ÉŽ3éºÏÅ“QqÈ|}´û¢É—<óÑË}ýŠ›*jj›šâÑi—­]±,]]:#óšäXK“ŠÌz_£˜F{"3(›tk 5iB£=*†ÌröÃE·òBå$çqqçú!·2>|Ë\"ì£×د‰Ø8{Ø8Ïàïûäf‹/Æ0î°§}§zjNÇÝ͹škû׿ËÎ¶ÍØ"ýìÌJßU9Ì¥úål”§âå!/×Jú}Œ%yQW‰{âV‰`¹ïüÀ„TûôñW‰˜àjK\á@쟱IrX¶Œ–Ðy¦/£ˆùn–VHgRª­±[©h¦T4 ¿T‹R7祚aýAØPZ|ÿ>º0Þ¼Èÿ.ÔWͧQŸ,4?õzW#28µAIA½Âx¦Ð-`iH„£óÈE«ƒGÍ+E«´ú¨á T²÷Qq‡çöÅæÑ|qg™/t®¹t®,P½~=ßMà0φ£r+wäÆÝ<«£ó<Ëç¢?èúÄ|Û ±7*%|·„cdû&É{¦˜À¢sÐéµA5z¢Òäl#|+׸S?0 '¤Ô˜SÙ‚s{æ tÇóIàò>ÒÕòÜj^Cîõ‡ƒ(9DĽ½Ì%A|É…2å”÷„†?º OøÅÖžå# …¥ uù¬â¿s«Ÿ>Ë/þà©Þ<Ù ŽCg©–R¦Šu´“ù˜!?‰Ë›°»‚€ëóˆÂ´¨+~,ã“׆)mék©À¬KÙÜk¹€áio\„ aGÂÙç[€³‰œÎbÙyر³Uuågó™ìZÍô=TÊ…If»*¢WoL”÷‹ù®ÑÇvÆò‰Ì8Тtœž_Ó ¸–ãìL|ªõä·_B5nþêÉê€Q篂û5sø*¸»L¤Ly $vt’‡ WiÛ²Šö€\;ïÜ!@özéw~mä}KqÇ€Ü_X)Þé}©Š‹«Ù3•F£G–ç'©5½}É-ñSd2úp±?ë‚ëáÞÂàÓþÛšÿTÛoµíWº]Uÿ[wû•nÙøWO>Ô `§Pš:”[Î*{ þ-Böë dË).ƒf¶Jþß‚iðo­ê†ÿ§~~ñ«Úþ‘ì¾/ñ¿Gß÷÷ë»×äßKü#:ÅKùWhûO ýkKD)ÌMŠ~üÏ¡ùSh"3.QÖ¥ês‚®ÆO¨S<|Úøaž™Ûø–±~•Ðó¥ºX&IxáÿéŸ_„ô¿Ö*¿ö»~ÚBaùÏ¡ýsFøÊËHzB†ú[9¬,ôÖócÙݧ¶±ûOÈöG›D\'Zß—T|¼[è~Ûð tC6~m} Ö•˜ 7{[}ía¿Múƒ_‚o9ëŸÒÕñ_E±§¨¡ÿ”ЈMÛˆ)úοÒÕÎ! ¡Còœ çì#*‹÷%±Ãï÷ÌÞ׳xÝ ·òµ•d*—XÍÔ/ô4Ó:_ Ü;s jðŸî–1‹»º‰•ÃàzœÐäùSí<Úû¥’õö…ñÁÝÙРó?@£N;yIPÚ¤š„¤Ã²)ôâ¿+{—Ÿ8©>Ì-äüÀwëˆoZ[^[q¡ÇÄùÌEèã$®rï8,!ÐñÓ*æZ\DS$¹^‘Ým䇰CÇ/uKDsãæ‘æÚG1uoÛó•xF?iÎPKå~OGþÅDŠäÿH^­8½€!ÿÛÆ,ø×Úz/´«Èµu+:¬J§»Q¯Äa¡ÚÝ×o£)±ïÞ&.yÎM\*SœÐ§[á‹ñ¥»ËñG¦Mù½ûik暼ݭÝëvæÆÏóñSïß9·¶{C6ô<‹¯î À-Câšž)sÒç‘°­ÎsÃYŸCg¶ÑÞ ŸÓvþ4žÄë|Bï_Û±O!çxt÷Èd$¦Ù]Jjøc¨CËñšsñ ªZA%¯Ü¹5}ûÉ"¨çTµ ×C¤¾O…|:NqqÈ9j¸‰Ë£Ñ*(–£ÅÇù­Ÿ›êÆø{º¯ä²“¸žKÏW Æ\ 1£€„0éAJ¨³mŸ~`ïÚ³O^OÐãÿdˆ;qk²ùø^»Ý­±_÷åâhù&Xw øa'Zö“öt¿ûƺG£‡‘;„#:wNùÜ{0¯á²ÆŠAÅÒ¼²¿ x¶½x±wU´Urk~·´}–ˆ¯ç~fÝgFµ:ŸíÿÀB¶¶h7ªÑ¹ÒÒjMÑJ3Æw£&Âkû¢¬ö—¨ž‘>›š1új°†^­jD$Õ5ÂCÕú©]ªìØ [iÞ>ºy¬(iÆg:ÈllRg66ÎÞ­`pÙÓïªPö$…;û_ íéÍmÉe…E¡¯¨<Ò?¯ýÛÝf=~°ôºzÑ0;ë{!M<EÌ¢ÙO¿~JõÌìU©™$Ù¶]Þ·ò75¬6ÌZTÙ-íu…(Ú{ó¸ .&Oãü|å N-âúÔd½?ÝÔµ„ m7š2Ò òG3*å †„)˜iy’Å&?ðwóÅÖ{²è| _2“A=¾‡yþzèŸsÇÈ{½—=g… •V¼LØFÂÍ u¨d`Ö"1ØêÔÕÊïZ´Lç³ò‹¾~ö1ÓïÕW[êA¡xП¿i!_ûhÊc^*OäWÖ zEìIW­àÄRÍ=oeÞte¹šÊrt+µòjôgïëdý.E4V—ûÑý¨ÜgfÑÜq“~§éV“ŸnØ:ô2àêÆ:ç+mþL˜®üŒË¦¤ë÷C©¦KÕÖ’sÙ×TÎjêÎÊze°.g‘m¬F«×C­xeDYÞ»”R š¼Í«éÝ—íõf&c~ë)G‘b¹—¢7ú ¢~±šÜ¥«™‘™›<¾®þp»X¸‹( ÚNA®7^ψ³j7 6OY6üµUÔƒ}#Í‘µðåI(²>›ÕÊYóÜQ+ñÓW‘n>TV¬0Wê™Î^Þšƒ«ÜÌ32¶¢0©Ãve‰¼ƒ–x Ú±[E¯"[ ‘-fº)Ê£_„" „áüÝ,«È¬4æíLhÕüGÿ¢McïÓ\,  ZœÎ6ê3:䫸H!ÿæ2ÚHLàò´žÃÊÙÍ©UBQ••«™Jñj5ä¦`µå¦±d¾¥}L:ÄøZ¢!O×î[ìNŸ%á–c¡·œ6¡Ëø'ŸùÁ=fùÁcáðƒg>üÅ3ƒ/¥R«8Q(6®î³ÏCÓ“=g«Î~†?p3àVͲ}Á<×`Díί2ÌDš¢‚RR–¤ÜœÄ‚Œ&uލ%QŽØÏtûŸqza&Ç…p3àƒ å'ÿt†y^¾ÜXîÝ3ªÜØx¤Q§åÜ#—9¹$—Y[­Ç!—¯®ü>¾ˆŽ„Xkž ÚF;éIíѹ[9·²íp^n[è &ýÉ;_†ãáC)-Ä·Œoø¬äð6–Þ—óÀgEO^*Âm¼7…¾ Ù‚ˆ.ÿ³Øƒxv¹â¨©Ù?ê÷Hš_ݺ²ÛµÙRzc¦²áTâ³.êaGÕ‚;K$g%¢½€p§È¢ zÅïºÀ+«qŸÊ²ÆM{‡ÓÖ…>yÚôfÍ{cÍæ‚Ù™YÊ` k‹¤7³N£¹Kí;§ÕVV9ªÍìkÔ¾kÔ¾®õÿô¿-ÃZ[‚ûסûñ¦§ÕÝÙÑÏcKèG³zÕ“ÝtL¾z¶¢MqP0f÷îÑæÎ«%ÿÅMZ£,§‹ŒFY–­”…E2ºÉ,wA“©µ6S$’Þ¼¸%•­˜:doЬä0ò„8*Éx‡¸r½t®$üG"ü§[%®Ú'®¹\ï.Ï?Qa¨4ÄVL®÷¤{™î¢¾}v}w´Ó@=ª5вg<µP/W’NÓ Ä¤å­ÄüƒY©`ŠÓfþ¦·Æ”¤±ãA .ШCÖ(òªwÈÓ4È®±Ÿ‘l®°'z5åA̾ˆú´„Ë⢅½^r„ÆÈMxùû6²—>öÚÄ=ì5Ùø£è—~àUæóþ{3Ⱥ›ÌáÕæ‹Ø†j“…ÕÚ×ûê€KŸ2+öEáŒÓþAãöãJQkBvÏoˆL§ÅqÓ«4ÑÏö$B˜¯ üéd›øf<ìíë£_ –ט§ÙÜÌÒs¨YˆyÞš’…ŸÇ¥|>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 2 0 obj[/Indexed/DeviceRGB 255 1 0 R] endobj 3 0 obj<>stream 8;Z]"Yml4;$j8$4`VGDikK#]8%YBAk<@I8ZG:5L4f?cSZ!!'gR(1T&3 F(O23!!!"KAIJPWB.pL~> endstream endobj 4 0 obj<> endobj 5 0 obj<>stream application/pdf Blue Square Test File - .ai XMPFiles BlueSquare test file, created in Illustrator CS2, saved as .ai and .eps. XMP Blue Square test file Illustrator .ai Adobe Illustrator CS2 2005-09-07T15:17:48-07:00 2006-04-10T13:36:32-07:00 2006-04-10T13:36:32-07:00 208 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADQAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A5YqqFAAAAFABnU4MGM44 +kch0cKUjZ3boMs/L4/5sfkGPGe91Bj+Xx/zY/ILxnvdQY/l8f8ANj8gvGe91Bj+Xx/zY/ILxnvd QY/l8f8ANj8gvGe91Bj+Xx/zY/ILxnvdQY/l8f8ANj8gvGe91Bj+Xx/zY/ILxnvdQY/l8f8ANj8g vGe91Bj+Xx/zY/ILxnvdQY/l8f8ANj8gvGe91Bj+Xx/zY/ILxnvdQY/l8f8ANj8gvGe91Bj+Xx/z Y/ILxnvdQY/l8f8ANj8gvGe91Bj+Xx/zY/ILxnvdQY/l8f8ANj8gvGe91Bj+Xx/zY/ILxnvdQY/l 8f8ANj8gvGe91Bj+Xx/zY/ILxnvdQY/l8f8ANj8gvGe91Bj+Xx/zY/ILxnvdQY/l8f8ANj8gvGe9 1Bj+Xx/zY/ILxnvevf8AOMQH+P7803GlTAH53Nvmp7Uxxjw0AOf6G/ASbt5COmbbT/3cf6o+5onz LsuYuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV69/wA4xf8AKfX/ AP2ypv8AqJt803a/KPx/Q5Gn6vIR0zZ6f+7j/VH3NM+ZdlzF2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KvXv+cYv+U+v/wDtlTf9RNvmm7X5R+P6HI0/V5COmbPT/wB3 H+qPuaZ8y7LmLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVevf84x f8p9f/8AbKm/6ibfNN2vyj8f0ORp+ryEdM2en/u4/wBUfc0z5l2XMXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq9e/5xi/5T6/8A+2VN/wBRNvmm7X5R+P6HI0/V5COm bPT/AN3H+qPuaZ8y7LmLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs Vevf84xf8p9f/wDbKm/6ibfNN2vyj8f0ORp+ryEdM2en/u4/1R9zTPmXZcxdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir17/AJxi/wCU+v8A/tlTf9RNvmm7X5R+P6HI 0/V5COmbPT/3cf6o+5pnzLsuYuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV69/zjF/yn1/8A9sqb/qJt803a/KPx/Q5Gn6vIR0zZ6f8Au4/1R9zTPmXZcxdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir17/nGL/lPr//ALZU3/UTb5pu1+Uf j+hyNP1eQjpmz0/93H+qPuaZ8y7LmLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVevf8AOMX/ACn1/wD9sqb/AKibfNN2vyj8f0ORp+ryEdM2en/u4/1R9zTPmXZcxdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir17/nGL/lPr/8A7ZU3/UTb 5pu1+Ufj+hyNP1eQjpmz0/8Adx/qj7mmfMuy5i7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXr3/OMX/KfX//AGypv+om3zTdr8o/H9Dkafq8hHTNnp/7uP8AVH3NM+Zd lzF2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvXv+cYv+U+v/APtl Tf8AUTb5pu1+Ufj+hyNP1eQjpmz0/wDdx/qj7mmfMuy5i7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXr3/OMX/KfX/8A2ypv+om3zTdr8o/H9Dkafq8hHTNnp/7uP9Uf c0z5l2XMXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq9e/wCcYv8A lPr/AP7ZU3/UTb5pu1+Ufj+hyNP1eQjpmz0/93H+qPuaZ8y7LmLsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVevf84xf8p9f/APbKm/6ibfNN2vyj8f0ORp+ryEdM2en/ ALuP9Ufc0z5l2XMXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq9e/ 5xi/5T6//wC2VN/1E2+abtflH4/ocjT9XkI6Zs9P/dx/qj7mmfMuy5i7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXr3/ADjF/wAp9f8A/bKm/wCom3zTdr8o/H9Dkafq 8hHTNnp/7uP9Ufc0z5l2XMXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq9e/5xi/5T6//AO2VN/1E2+abtflH4/ocjT9XkI6Zs9P/AHcf6o+5pnzLsuYuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV69/zjF/yn1//wBsqb/qJt803a/KPx/Q 5Gn6vIR0zZ6f+7j/AFR9zTPmXZcxdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdir17/nGL/lPr/wD7ZU3/AFE2+abtflH4/ocjT9XkI6Zs9P8A3cf6o+5pnzLsuYuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV69/zjF/yn1//ANsqb/qJt803 a/KPx/Q5Gn6vIR0zZ6f+7j/VH3NM+ZdlzF2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KvXv8AnGL/AJT6/wD+2VN/1E2+abtflH4/ocjT9XkI6Zs9P/dx/qj7mmfMuy5i 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXr3/OMX/KfX/wD2ypv+ om3zTdr8o/H9Dkafq8hHTNnp/wC7j/VH3NM+ZdlzF2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KvXv+cYv+U+v/8AtlTf9RNvmm7X5R+P6HI0/V5COmbPT/3cf6o+5pnz LsuYuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV69/wA4xf8AKfX/ AP2ypv8AqJt803a/KPx/Q5Gn6vIR0zZ6f+7j/VH3NM+ZdlzF2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KvXv+cYv+U+v/wDtlTf9RNvmm7X5R+P6HI0/V5COmbPT/wB3 H+qPuaZ8y7LmLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVevf84x f8p9f/8AbKm/6ibfNN2vyj8f0ORp+ryEdM2en/u4/wBUfc0z5l2XMXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq9e/5xi/5T6/8A+2VN/wBRNvmm7X5R+P6HI0/V5COm bPT/AN3H+qPuaZ8y7LmLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs Vevf84xf8p9f/wDbKm/6ibfNN2vyj8f0ORp+ryEdM2en/u4/1R9zTPmXZcxdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir17/AJxi/wCU+v8A/tlTf9RNvmm7X5R+P6HI 0/V5ArKVBBBBFQRmfgz4xjj6hyHVrlE2dm6jLPzGP+dH5hjwHudUY/mMf86PzC8B7nVGP5jH/Oj8 wvAe51Rj+Yx/zo/MLwHudUY/mMf86PzC8B7nVGP5jH/Oj8wvAe51Rj+Yx/zo/MLwHudUY/mMf86P zC8B7nVGP5jH/Oj8wvAe51Rj+Yx/zo/MLwHudUY/mMf86PzC8B7nVGP5jH/Oj8wvAe51Rj+Yx/zo /MLwHudUY/mMf86PzC8B7nVGP5jH/Oj8wvAe51Rj+Yx/zo/MLwHudUY/mMf86PzC8B7nVGP5jH/O j8wvAe51Rj+Yx/zo/MLwHudUY/mMf86PzC8B7nVGP5jH/Oj8wvAe51Rj+Yx/zo/MLwHudUY/mMf8 6PzC8B7nVGP5jH/Oj8wvAe569/zjER/j+/FdzpUxA+Vzb5qe1MkZcNEHn+hvwAi7f//Z uuid:DEC81B9D214411DABD12D45BA291F212 uuid:b1f408e4-c8d1-11da-9cb6-000d936b79c4 Adobe PDF library 7.77 endstream endobj 6 0 obj<> endobj xref 0 7 0000000000 65535 f 0001174968 00000 n 0001175479 00000 n 0001175524 00000 n 0001175815 00000 n 0001175865 00000 n 0001186066 00000 n trailer <> startxref 116 %%EOF exempi-2.2.1/samples/testfiles/BlueSquare.jpg0000664000175000017500000005721511745673651016177 00000000000000ÿØÿàJFIFHHÿáVExifMM*XnÆÎ(1Ö2ô‡i2XMPFiles BlueSquare test file, created in Photoshop CS2, saved as .psd, .jpg, and .tif. ü€' ü€'Adobe Photoshop CS2 Macintosh2005:09:07 15:09:51  h Ø€ˆ(½HHÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ` "ÿÝ ÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’I%)$’IJI$’R’I$”¤’I%)$’IJI$’R’I$”¤’I%)$’IOÿÐõT’I%)$“”äu­¿Wú.C1zžXÇºÆ ZÍ–>XK˜úìoÒcÕ/üqþ¥ÿåˆÿ¶oÿÒ+†ÿÇþÈñGýÒgþ}È\4®›áÿ幎WiÏ(žHÜ„L8wéxäÃ<¤HŠ>åÿŽ?Ô¿ü±öÍÿúE/üqþ¥ÿåˆÿ¶oÿÒ+Ãe)V¿äÏ'þs7øØÿõZßz]ƒî_øãýKÿËÿlßÿ¤RÿÇê_þXûfÿý"¼6R”¿äÏ'þs7øØÿõZ½év¹ãõ/ÿ,Gý³þ‘Kÿ©ùb?í›ÿôŠðÙJRÿ“<ŸùÌßãcÿÕj÷¥Ø>åÿŽ?Ô¿ü±öÍÿúE/üqþ¥ÿåˆÿ¶oÿÒ+Ãe)KþLòç3ÿU«Þ—`û—þ8ÿRÿòÄÛ7ÿéc§}vú±Õ3kÀÀÍõ²­Ýé×éZÙÚ×Xÿ}µ2¿ Ç~rði]/ø¸ÿŧNÿ¯ÿç‹Ôßü^åpòù²Ç&^,xç’{¶/ñýò½˜ø¾+ÿÖÿûWý¼ÏïKÿÿ­ÿ÷¯ûyŸÞ½©$¿å=Ûø‡þù^Ì|_ÿÆ¿ëýÇ«þÞg÷­Ÿ©¿Pþ±ôŸ¬¸}C:šÙG«½Í±®#}VÒÏc}ßNÅê)(ó|{œËŽx¤1ð䌡*޼3?¼¡Š ƒ®ŠI$–K"’I$”ÿÿÔõT’I%)$’IJI$’R’I$”¤’I%)$’IJI$’R’I$”¤’I%)$’IOÿÙÿáÍhttp://ns.adobe.com/xap/1.0/ Blue Square Test File - .jpg XMPFiles BlueSquare test file, created in Photoshop CS2, saved as .psd, .jpg, and .tif. XMP Blue Square test file Photoshop .jpg 8 8 8 ÿâ XICC_PROFILE HLinomntrRGB XYZ Î 1acspMSFTIEC sRGBöÖÓ-HP cprtP3desc„lwtptðbkptrXYZgXYZ,bXYZ@dmndTpdmddĈvuedL†viewÔ$lumiømeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ óQÌXYZ XYZ o¢8õXYZ b™·…ÚXYZ $ „¶ÏdescIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view¤þ_.ÏíÌ \žXYZ L VPWçmeassig CRT curv #(-27;@EJOTY^chmrw|†‹•šŸ¤©®²·¼ÁÆËÐÕÛàåëðöû %+28>ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿÿí,ÌPhotoshop 3.08BIMéxHHÞ@ÿîÿîRg(üHHØ(dÿh 8BIMê° com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:09:26Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:09:26Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-09-07T22:01:49Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMíHH8BIMó 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIMÁxWXMPFiles BlueSquare test file, created in Photoshop CS2, saved as .psd, .jpg, and .tif.Blue Square Test File - .jpgXMP Blue Square test file Photoshop.jpg8BIMÿü8BIM@@8BIM 8BIM Ù `à´½ÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ` "ÿÝ ÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’I%)$’IJI$’R’I$”¤’I%)$’IJI$’R’I$”¤’I%)$’IOÿÐõT’I%)$“”äu­¿Wú.C1zžXÇºÆ ZÍ–>XK˜úìoÒcÕ/üqþ¥ÿåˆÿ¶oÿÒ+†ÿÇþÈñGýÒgþ}È\4®›áÿ幎WiÏ(žHÜ„L8wéxäÃ<¤HŠ>åÿŽ?Ô¿ü±öÍÿúE/üqþ¥ÿåˆÿ¶oÿÒ+Ãe)V¿äÏ'þs7øØÿõZßz]ƒî_øãýKÿËÿlßÿ¤RÿÇê_þXûfÿý"¼6R”¿äÏ'þs7øØÿõZ½év¹ãõ/ÿ,Gý³þ‘Kÿ©ùb?í›ÿôŠðÙJRÿ“<ŸùÌßãcÿÕj÷¥Ø>åÿŽ?Ô¿ü±öÍÿúE/üqþ¥ÿåˆÿ¶oÿÒ+Ãe)KþLòç3ÿU«Þ—`û—þ8ÿRÿòÄÛ7ÿéc§}vú±Õ3kÀÀÍõ²­Ýé×éZÙÚ×Xÿ}µ2¿ Ç~rði]/ø¸ÿŧNÿ¯ÿç‹Ôßü^åpòù²Ç&^,xç’{¶/ñýò½˜ø¾+ÿÖÿûWý¼ÏïKÿÿ­ÿ÷¯ûyŸÞ½©$¿å=Ûø‡þù^Ì|_ÿÆ¿ëýÇ«þÞg÷­Ÿ©¿Pþ±ôŸ¬¸}C:šÙG«½Í±®#}VÒÏc}ßNÅê)(ó|{œËŽx¤1ð䌡*޼3?¼¡Š ƒ®ŠI$–K"’I$”ÿÿÔõT’I%)$’IJI$’R’I$”¤’I%)$’IJI$’R’I$”¤’I%)$’IOÿÙ8BIM x8BIM8BIM8BIMIØh BlueSquarehØnullboundsObjcRct1Top longLeftlongBtomlongØRghtlonghslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongØRghtlonghurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM!UAdobe PhotoshopAdobe Photoshop CS28BIM%*hù-£l3n=®¥ÒZ. 8BIM&?€8BIM( ?ð8BIM ømaniIRFRì8BIMAnDsÌnullAFStlongFrInVlLsObjcnullFrIDlongs‹«çFStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslongs‹«çLCntlong8BIMRoll8BIM¡mfri8BIM' ÿîAdobed€ÿÛ„ !!3$3Q00QB///B''""  "334&4""   ÿÀØh"ÿÝÿÄ  5!1AQ"aq2‘±B¡ÑÁðR#r3bá‚ñC4’¢²ÒS$sÂcƒ“âò£DTd%5E&t6Ue³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö/!1AQaq‘"2ð¡±ÁÑáñBR#br’3‚C$¢²4SDcsÂÒƒ“£Tâò%&5dEU6te³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†ÿÚ ?úU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTÿÐúU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTÿÑúU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTÿÒúU@UUUTUPÒ1Ç"9žßù.ÎGö§ý?èM-P>oþ°ê?þl?øÿÖGñÿ͇ÿxUû\)ÿäÿé<³œßõ‡QüóaÿÀ—þ°ê?þl?ø«…?ñ¼Ÿý'–$îÿ¬:ãÿ›þ¿õ‡QüóaÿÀž\)ÿäÿé<±'wýaÔüØð%ÿ¬:ãÿ›þðªáOüo'ÿIå‰;¿ë£øÿæÃÿ/ýaÔüØð'…W ãy?úO,IÝÿXuÇÿ6ü ë£øÿæÃÿ<*¸SÿÉÿÒybNïúèþ?ù°ÿàKÿXuÇÿ6ü áUŸøÞOþ“ËwÖGñÿ͇ÿ_úèþ?ù°ÿàO ®ÿÆòôžX“»þ°ê?þl?øÿÖGñÿ͇ÿxUp§þ7“ÿ¤òÄßõ‡QüóaÿÀ—þ°ê?þl?ø«…?ñ¼Ÿý'–$îÿ¬:ãÿ›þ¿õ‡QüóaÿÀž\)ÿäÿé<±'wýaÔüØð%ÿ¬:ãÿ›þðªáOüo'ÿIå‰;oê?þl?øì~šy¡#3¸‰ä_š~ƒð‚_Õÿ‘|Ùժ˷eÿ‡øʪ¿8تªª¨ ª *ªÿÓúU@UUUTUP£ûSþŒŸô&îáÔjÑ“þ„Úµ@øÕU~éÈUUUTUPU@UUUTUPU@UUUTUP ïþðKú¿ò/€ûÿ„|þ¯ü‹åÏÿ£·ýB­OeU_–tU@UUUTUP?ÿÔúU@UUUTUP£ûSþŒŸô&îáÔjÑ“þ„Úµ@øÕU~éÈUUUTUPU@UUUTUPU@UUUTUP ïþðKú¿ò/€ûÿ„|þ¯ü‹åÏÿ£·ýB­OeU_–tU@UUUTUP?ÿÕúU@UUUTUP£ûSþŒŸô&îáÔjÑ“þ„Úµ@øÕU~éÈUUUTUPU@UUUTUPU@UUUTUP ïþðKú¿ò/€ûÿ„|þ¯ü‹åÏÿ£·ýB­OeU_–tU@UUUTUP?ÿÖúU@UUUTUP£ûSþŒŸô&îáÔjÑ“þ„Úµ@øÕU~éÈUUUTUPU@UUUTUPU@UUUTUP ïþðKú¿ò/€ûÿ„|þ¯ü‹åÏÿ£·ýB­OeU_–tU@UUUTUP?ÿ×úU@UUUTUP£ûSþŒŸô&îáÔjÑ“þ„Úµ@øÕU~éÈUUUTUPU@UUUTUPU@UUUTUP ïþðKú¿ò/€ûÿ„|þ¯ü‹åÏÿ£·ýB­OeU_–tU@UUUTUP?ÿÐúU@UUUTUP£ûSþŒŸô&îå–;á(µCþ\VàøÅ}ú¢ÅùËÿTOø£ÿ9úÞö_úÿù!Îä+ëÿÕþ(ÿÎ_ú¢ÅùËÞËÿ_ÿ$Ï!__þ¨ŸñGþrÿÕþ(ÿÎ^ö_úÿù †y úÿõDÿŠ?ó—þ¨ŸñGþr÷²ÿ×ÿÉ3ÈW×ÿª'üQÿœ¿õDÿŠ?ó—½—þ¿þH!žB¾¿ýQ?âüåÿª'üQÿœ½ì¿õÿòA òõÿê‰ÿç/ýQ?âüåïeÿ¯ÿ’g¯¯ÿTOø£ÿ9ê‰ÿç/{/ýüC<…}ú¢ÅùËÿTOø£ÿ9{Ùëÿä‚ä+ëÿÕþ(ÿÎ_ú¢ÅùËÞËÿ_ÿ$Ï!__þ¨ŸñGþrÿÕþ(ÿÎ^ö_úÿù †y úÿõDÿŠ?ó—þ¨ŸñGþr÷²ÿ×ÿÉ3È}ÿÂ> WþEçÿª'üQÿœú]Jzx˜È‰n;ž¹”½8Òßè*Gzª¾bª¨ ª *ª€ªªÿÑúU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTÿÒúU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTÿÓúU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTUPU@UUUTÿÔú?TÐüýP?@Wóõ@ý_ÏÕô?TÐüýP?@Wóõ@ý_ÏÕô?TÐüýP?@Wóõ@ý_ÏÕô?TÐüýP?@Wóõ@ý_ÏÕô?TÐüýP?@Wóõ@ý_ÏÕô?TÐüýP?@Wóõ@ÿÙexempi-2.2.1/samples/testfiles/Makefile.am0000664000175000017500000000336612144603625015443 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # EXTRA_DIST=BlueSquare.ai BlueSquare.eps BlueSquare.gif BlueSquare.jpg BlueSquare.mp3 BlueSquare.png BlueSquare.tif\ BlueSquare.avi BlueSquare.indd BlueSquare.mov BlueSquare.pdf BlueSquare.psd BlueSquare.wav exempi-2.2.1/samples/testfiles/BlueSquare.mp30000664000175000017500000037630411745673651016121 00000000000000ID31vPRIVPeakValue‚PPRIVAverageLevelÏTIT2Blue Square Test File - .mp3TCON(12)PRIV ìXMP Blue Square Test File - .mp3 XMPFiles BlueSquare test file, created in Premiere Pro, saved as .avi, .mov, .mp3, and .wav XMP Blue Square test file Premiere .mp3 ÿú’À`”{,íë))5¬a$‹ä¢ r@ŒŽ,°‰þˆÆ 35‰kTk9'išl  bÓ¡™ fæ!0dC.¬YqœLa„œ%…ËB5€JÈ-ÿ‹ÊBÁ o"b|=Z‹¸Ò tÐ4àE™4O*4„#qf拏z8Ý}EÀÿÂÀÿ—!—z€cŸ¬¾·½C^»! ¤rÈöÒ¹X!”ª7PÈ0©ŒidTH°~LÁæFª^¥0@a‹Ê ´€‹-R°'úg¥Û^ PØ2FUx–q„{N——Y*Ã_¤ì*¤À!'ªù*Xu¸·O\  .|*0¡ñcà&nÒHyôúþ™”-;Ÿ°±+~àm$m‡ åg†)5SvGøò"&YÃ)Ve‰É!PŹéù@èàƒ_—QS‚QDºD¼."ö êæ¾\ÂF‰ )YÓ› iwŒ¨ŒÊí8NÝæêÛœ&ÍLgýèÎú„÷¾d–$Kiþÿ¿ÝoÞöÿú’À"Z=˜áSLeërz*uÌamÆ*D¡0˜Úõœ«bïèbP[¯€ˆ˜KÿP ül@ÀQdÀ „•Ì+0XÅÁÀ`q¨a0“Ie… -;+Znù)“ö:Ä4S¡¡µVA#ü§H†Mˆ}ü±„QšqU×<„dÇWˆIï'·±9ÄQÁ©¨¸-´±2Ŧå°41ÃIŽJÞ%ÙDàWçO^Ô?ÉG;…ïçî’1Žq e#éguíæ~»ÁD è  „& È|ÜÄ£1ÀM:”‚ 5h"qk—ý†1D9‘Õ¢m³dY¤ò££$nL._8êtÈÄ-H~€§2`p }?$‹•4¸n•êÝT­Ï“R?Qªþž^Úe-¤3‰.÷ÒjÄ‚Q—^©aÛ‘ã+•åøs÷ܬJå©f.ߣ½¬¬yˆÿ«OúÂJmÐ$á$ÐÄN l.02¤çP“$‹an¡ye°”q&)“¢oSWHtæP'™µ•¢j©¦ÿú’Àù‹l€ØåW-g jª¢ª©½½uÌP ¢©«ÂPÀ×àˆJ6Ë‘%B‚lé;FY.=‰2¨ž‹SæÄ;­ãB~§KâÇ[“—fâô¿Ý…$‘$~­Ã•\›[SP „Q¤Ô†!LQwâgw¦ØágëT‹1÷Z v?\‚ÜšyÇV´—@wu¾¢à¡v˜‘@¥@‰5iKXaÖ*g(¹2×L¨»<%³Œ>&ƒPhãJ¹, ”×~³Š{ñ:ý;/® I/RƒRa.… V¹„C³u{Q”ñyc•VŒS. Ûjä:–Š–uòìàÝ ³Vj­™p¿Àç?˜[UgñáÁÝbÞ­Wš°<õ·r§ßðñX;í»x¾ª€n¡ÀdZBÅ’4å“i’ÊbëtÄìŒÔ’ºÊhÂã‰í5·å²7æ4)MH€Ä—KZ!\–놥âK9¨¬4* Þw¥qY{T }¨çÖö\U­ ÔÅò¢O£¼?O2)<§4åЛ-+XšÜbbÿú’Àa¼‘ñ#SMåíª¼$j¥½=¶-JÅšÏaJ~-¨¥¹F†Ÿ¥õã©ô+ÀrÌHQàFþ¿8Ý^×UþµÿY{ÐLDùWѨœ‚ú ê˜ -“Žõê2%ú?*¼ XfÀIr_uU/€$üËC” ž12 1Àà"@HMkË]'†“[£¸°’X =Ë‹áGiƒBá»V\ò?AðtUŠ»Ág?“Òè”~ë³OA8ÿ'!6!ªZ7Ù±¨<ì %¥o’¢ÞdQª/¦CØØ¬ù»¬é®°u‰%>F¤Õx¨\ËHr5R),«ÎÏ1ÿ»Ìía¬ûßÿÝqz9¬â‘šªõS°ØYksG8iÏ>% J°@Vý,Dš,a€˜!Cç`Â&W–’À¤v‘Ý8åL-Ú&Imƒ>±p„CX¼BY(”MÙœJ[±P&A´/«:SPHéh"i%íBš]>ÕÒu¿2ˆÊïrÓE³.öŸMz¢›Cל֫ Ãõ!éu<ªbU-–Êš¥w‚–ä² uá¹Ýÿú’À«v«-QMï ²Ãê©­awg…¼?™ãWÙX”½ÂkB—ïý−I]ßÁ•£ëYKcÞ7" CÐHB× 1ß3> L"ú5P!£`A~–¼Ñß! /€ Ч±qf™*¡01[óïgÔ¢¦z¢Ó^|B]VÆ>Y~`WʤåÉ¡„%†!d­°E_v˜QšGùR‡›‰(þ¿ñÅÞU 9ç«sÔ¿±K(yáã)FÒZdÊh.ø»èÊ^”åBa@Y«²§}·zåÊÔmËPËÓ,™iE­—8õÛçYú\Qªâ\Öµº·¹Ë߬­ì*a H£€„p„‚©ÑfTUþ¾Š¤P ûCã·ÕNaòë&¸!–°Ú‰”L6†oñÅßµoyªŒ‘ Ëç¥JF@ØYü4ì2q¡²wÚz© ‘#É>¾Š"Õ˃‹7Af–ò諜&’\4r×¹-o_G¡eôÓL•h‹D£bPgi @‰B—>3ïþkÞ°—¡cð  Ú"ãD²ò8¢6TåHáÆ¡bãõ»R[}³­Þ³c¼§·W>ïÿú’À/»€ÁE-ïK³ £i)­evUœN]êqtôìfi¯ú‚Þµ¥–Ra”& aî,iˆîˆ€ò %¤jH3RAæÔ+ZåCD! H mv´¹Ì1-¤¦”€‹··¨ÒBÒPáe±f;Ÿa«E‡ UO=ŽÚl¶¶-e¢™Á#TÕ¹;L.ºÔ`¬TÁ/„Ë­ÿ #ÀÊ™»í‡ž»rj;¾Í›Ñf­]ú-«–:B’nv­Ê¯¼²Yn¶¦7Rþ­ýÎnÏ=÷_kÔ“µ íÆì54IJÆžLšM(ÁSƒ€‰T¾°Yµ0V’\†%¯~Xözœ2$z‰d_pÂévµØüµ…™ÂÐÓXP)LH*> vÝé|SÇPfŒL…haÁLJGÇy)LÄV7ŒÀ\$˜0¯Là”9;Ù; gÆ CÁLŠƒ^ ¦*ßa›ÁiëZ#›ºÀ*9˜ ½ý š@Rê),3jî<‰[ÖµøW«®ïTÝÏzåʪ ÐR$¦Öx1ÿú’À÷GÀ¥!KLë+’à#©)­ewô`™Eã¾kŒµ‹ú8¥Hà:¼H46¾¨’«¶|²ƒBܸëÐ8vÛ c"çþfǾ†0R€LO…éVQè„ÓXâœ×4¯¨ð‡»-Pòf^ªòKŒÀDœüóC©”HY‰ÅÜÿ(P1(­D+RJR^™ùx\›²ÀI̱Êq¢Mˆ€f™jÅãÓ²Šk{ʃðÇ÷»â`È¡c`Sþ—oBU$””§cT #€Á€j\¡8àät×è@EZ×Ñ)Ç’: «˜8iÅ#êé7XŒT”AêËŽ¶Ñ%^JÌP¥×Q²~R@[ìÛÙ¨’çiÕtš$fN$|ä4ÂᲡE­á´Å~ï<ò*‰>P#í-'¬@Ú{iÖ ÕHìv^YK2–JªÑÜ¢¤vÙc`§ýâyK¬œ5)(²˜ªÒeÎݳøaûà 0×wýËÿ?¯hÔm’”Ñ€ j.׆›òA ß/9²!.… “+Úª)£a£»¯ºeª)ÂÕ$Tbÿú’À¬;Ê€CMë+’Ä$)5Ìåv:4BÃÂLõ€Æ —ȘuØŠ`ô—PD¼ëè+ñ5ñGi>첡ä§êÖúÉ•Gza<Úb*‹K;P¹á-ʼ}±m©R”úöAæjÕ ¼…¶`ˆ%¨8ÌVẂWì?«DÔâÏQ×çi¾·÷·ïk=cžcÞÝ$]Ag‰.VˆN´ú$ †>¤!*Ö¡¢€á¡]&Š™%”±ôƒMÔ:†~fVÀœØ ™ºÑ¯Ò™…”#Fa§©æ¥Á`Ž%–µ¡V2gØBF½zò±Âã:³‚æÍHЖõž‚Œ¡ªD6”°nÛ¯c I¬0§¼hT ¡4ãê`¡©1&EæeÐÕH•RJV¿¢É倣ïå=ÉÍ×½ó_‚BãC°¬êœJu+K+eŠ.]­¨•XF‡,쩚¤ùoQ¤«9Bصààßè z¯%±#¼€çhH±†´ÕU4 ¾úäÓÜ¡’jY]2ø Š<óÆ)‚áht_A2¡ÿú’ÀI®ßK­ë+ºÖ¨i¼áv„qˆM;ó“tøÍ‚4¸Õ¼oÊñ¼x×Ëh»”%hªe@TeÂà¤ÝX5Òÿ¶'r1òØrf­HÎ3 мr œWup œ àЀ"hrÒ òOÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌ3Tv4¤ $ .£ Ç—9J¡Q#Å b•“>‘72ß)ñŠ]:¥£€aËEôgWh‰ÃÒ€hZi‚õ±h4TTZ_LŒyE…[(›C½ùPÀH¿SŽÛÈ€ ÷¸Ëž”¶¼§xÙaÅwL°ó8nb7‹! ! e³ŠÄâCî…šðÔIÕµMkM<Å-% » „JåSÔQ¨>US[ÊŸŽ¹½çŽûk½SÇŠD¨‚ìD ó¾<Ý]éÊVÎ GÉ)[ˆV6–kXìaòùHèzÊ€ٶ佘\§‹a,¼ëÖÝ®ñ›ibTµ5;2\Žr ‚ßލ”¾!Èôì´øšûLÀYÊ$jË t+ì•Eÿú’Àïӳ攼äD`vñ“˜¸59iB¹šÊ§!àZ×¾Zþ3æj´ITbs„…¾Î Y°ŠVB+2l‘p•±Ì  fâœö€Â£ù‰Ö¶b`”&”E’ÙåKÒÓCò•Œþ;mÿú’À‚Øÿ€$ñ;¬ç+²gçuœáoä9—FéáÈ6õº·³œ¡¯­SêÞu.\©R¯ëz°(í ÁÕÉW&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÐQÙJÚÑ Ü³–‚ C#¢×Âd¢À»b¿£NF³’â:uŒ)bŒ©ÚsCò&PJId',#m= Úm]Ón Uº²+¤Nd»¸]Ī¿›éDW7ÙXhw•Èe‘W–¿²¶ Ê"¯T iö}àúgzVýF/ážÈéóµÜ+ë õo}Þg[¢pÉú@+ƒ¯ªNˆï¨(”I¢œd€Bê¦þŽtH¾Ýir5-Ó!’°c ~$³tBD³IÉ{ FEޚʒŸTÝX`pëÖX Xé3“|}sÒË܇™ß8-^’*†í°„…;~²‚ëûÅv{¡JÐ11êº,¦9{fÿú’Àÿ€ðëE¬ç rm¨µœán×ÓA)‰eËùßÂYgaëï7žñ¹[*÷ñïrÃË“až\팶ע”¶T”ã$P*T—±d“˜9ˆœ[Ù‹ä‘°'.¸8SxÄ!±BÃXhÁ+!c g¤c†ûu†5 §Ò‡ §rj¬Nއßùu'ÎÓî!ùX3:WÕŠÕUX‚œ‘xsÂ(u3Qc±bB0Q³4 މ̬F$—h©(˜u–^Õ((žÿú’ÀSÿ€IMïK³•$ju½a¶*PÓ*3Œ™Š¨v XÄjZ¨J’@%aµ ]q Q8Tõkn È„¿C¦¯ðL€æJŽÒ¤“^Íy÷nq¡QµD"o]˜¨ˆ\©V° •qÆ™ƒxEA¸`°…†ËJ²ä»Ô•_Ø:$ÕZ‰†$£™³ÌIƒ/µÜõ¶ôn@Òê@qú—g OÊãäTr#ò©EZ¶âÙU¢ÂýB$O¢Ááœmß$¥aY\*r@  ¾ ™‹˜!q§Ö©CƒH–ÜólYk\ 8âÕ&W\­¥˜Q ¹Ô ¹i€D}€į"‚Ù2X{–-> X1à…Öƒt¡n9…P¬„‚–$hÐD¸YŒ2v<üÎÎ8 $©‰Ð¯ñk&,£pR,`.¦¨Ǫ¬ ãýH¨F°0>;ÀÁY Ç6‹è²€ÄKôÂIX¡Ëc!™1ÚŸk-IöøÈcCS3ÈpÛ—O 3£ÙÙ*úñíõ|ýQO®‚¥Uhÿú’À…¥ß€õ)SMç ³o¥ê]½=·”m€2í,´03@†c‡¥ª F4^35Ð1]#Dж!À¦ðd0Ó– 745™°÷d¾¬%•µ'úirÁ"éÙ¨´MºªŒÒÌùЮh+YƒšQH²·=ÍóUi ¥‚À§mE"·5å†•Ž „ÈœY…еutÄ–¢Ù¸œÉ&‡TÕéS„í+\eÕ~Y;ÖÒ™Óÿ  h893´¹ÃÑ«XMF³öî8Ô¥§¿—.`ÍR€zož…n¢Jr45wF€à¶æ3„Mh8QHAÐÔC9XÀGñj›ÆªØ†%@l97!ÑàŠ¥ýUEŒlÇ>ÊØ—kýÉ‘^²¨ë{+H‚è¶=èbèô“{,Å»¯°¸ð?¦‹=)ŠÓo5¤rc`AÓþm³®úµÙÉtü°C8Ðä>áANôUöCÒN¶l wñc 9Œ­.°`I¦^!`ŸæZЗÂW”ØÇ kú«—ý¬µž<æÏçQÏÂ÷'X‚ŠŒ¬ ÓÖÿú’ÀÀêǹSMë »#ê)½evPz¨µ\$mÓÜ¢8[À»¦H(Ò(2ÆI5ÊŸlÞð(ò±ÙZtP@¼¦Ê»\¯Ô¬ÔËÙ#žPõ–½‘•Ü….àYc¨¨3"§y>nÔ’¹4MÙ^+YÜŒ¿0óñg嘶L8 Ù–Ó´€H”±»ÎÔ yÔyÚËo9µÄÖPÕìú K•Û»+gÊ3ISî?•r±Û•üÑv”Z[ÞZ¥#@bJv4°ÀyÁ€ò$ 8QKY bÕ¢•¥k:D¤¥Ü!€Á¼mòöº$¨#'KsMår¥ÐVáÄWšƒ#l}V·C„špÐ)Ám‚µXeozz¦¹œétúµÈäôlõAK…²èpÞÏ£|]Ç^— ¢y„56«_¾›c Êb²©¶Q%_ìæ}ŽA²Æ"»×>â´7¾!G~O-ž¡¤åmwcU5{·Iµ íÍY»­©Á¨¥ÿÕ.Èð(œñ•‰F:8Zÿú’ÀrœÌ€™MMg+³!驼áv…¹@;¨œªdœÂI„ 2B•Q7‘°pRŒ€0BïH¹<ãIºÍžT%¡Hß•¢ÛFÆRÌC®\³ Æ²öU @)ªè‚! Ÿ›u#pôZ+åaÑàµ#€Gи˜Ú{ ’ºêd­E@2'08 dhSeè¸ÃOû‹ÃÓ v•TZ/Ã]UEŽè€Äß(n“ò{vf²ßë·?+¹[Ýpe´úÎuð ,RØ`2+bŠ1‚°Å‡-$ß@h(˜ Bè=öT âIC2Ža´PE¤Û%,¼š¿^•e! yys*ÍzÊ…†§«k2ú‡QE¢î@ˆSà,¡}]…ª,úÌÞGm6ìõù‚‡ Iª«²ýÊè1E|b,æ4 <¶Éœ" Úˆ¬ëCÐmÈ5g¶)<¶(ªIiž1¢2Iš,šnP[”ÞLY«/Œa†ïV™§£ì91Ü·•,Å5JÔ_ÓO½ ‘¦l:G½3Ü áî £B‚>ÿú’À»ÊÒ€E OMë ³-$i©¬å¶éŒªéžÌÚá½g`5ig¤GDPZ^Fçì"ôô"Y4í+dÐÃp¤©Cèq\ˆ ýBpÏ«ÖÌaA–™„û&Ã’IøûãEVŠÆÜÖÀ’ð •ņiÚxX`¸àù|ªH P»·–=܇¥Q¶$¤C‚`Ñ–á¦2°³‡Š·ç*œ™³WXÿ,ó¿ÝÜ¿rÎ<ËÂØLëùXóè¯UH Aq¢@ˆø¼ËÐâ PŸ& ºÈv‚±) tuMT Ð;pûƒ9ŒµÑõ€&ê@’º *t–“û2ŠD¹rg´çúèܰóN¿2g(½&ŠE~YvYnf×d‰âz#¸D[ÖTÚU/ši:®ìÁŒkÁðÙ¯Û)“Ih»vÔÆU „(Íy³ëÕ«^WËvË)FDMlZ÷°ËîûßoßóˆS%€ ­"„šâ8$v±`iª?†ís‘ |­¼;Ò´wHq=úðRhgÖL$S*?EÇ)löe(±l‘"Ϧ³fÏL@žÇPÄ *‹þv;ŒåqX[þ‰Ò¨MHë©^30ÎKF9´FøÊÙ‚ä3ÈüRdçiÇÆåˆå´¨¶¨D½Þ±•-ûûÄP:q“û¯éáfl’îÖOb­Øa¡š«AÁ¥d "DQ¡˜±´F$u%²IlB^£¡@ âéÎÁ P‰ É é ‰bU~Ú‚¬JËê&u>1j´-ÌåŽEtÿ#[ª¾oWœ£Á9Sb ~¨hhüNÿú’À7ðû€AMë+’šèµÍaj3"’7ä ¹SnDy¦Á g 1þÞ£¦½ªhvP=ì7z´Øæåµ3¼&4fXøåÅFŸ–ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøA 2 ÍP8&ÒVJs°Šo „ Œ>U.xJ‚œç˜ùï³9ÀpÒ&ç2v… ‰-“V–ã+ Åð©Ÿ^ Q\Ø®H"ù]IªNT|` N𚸹'«)\¯lÍŠÆææ%Ò¶IEÀh• BŬ?h²æ2àI磰$ÿÇ­Ki!ˆ0JC PÄØÌ33fk<*ÖaÀˆÀ´UI:0XôÕ„K ’UúÀÏF€™H@b“’µ(1›ÔJf©!…Mæê6vÄ’'Ö–«Ì«jÎjÍé8ì&öË—ÈFÿú’Àùÿ€4áE­ç R…¤()¼erpÚ8ˆ›*j/Ü7ÇÛ•;W¿‰C×oU»Öë¯ÚšÖyo mVXëkwžý]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþˆ¬Y$¨ˆçKB¡! HQÔXK‘¨­À£3“ß'§M·õÐ<‡yiZã°I ù8’a £©,Öe+ÕˆÃbL¨ŒëOŽœM-¦QYÛ&¿¤b¿ÚiTiøEm»yíç“übܲªÎÂôôª)?¹«ŽõÃÐDv Ô²y+F'g%6îÓÔ·5 HªÓåUÞ2Ë ^Rhµ¯°Á¸©ó””(’¤DoJ%+m˜uôlž˜8Ð`ÐyJá↡*HÏ€mŧZ48ÓÂäíFÖ«ýÏÅYŸÉ«…JC•¢W`‡lšìäâν™ ív–{‰! p[‘Ø~R=ÐéuœUÎB]4¶i¤sІ”ÿú’ÀŹÿ€|ë?Më+r{§©¼åoÈüÜa© 6· JW*=-yÛH¿"•ªê¼Ä·Å,›‹^’ËqË-ײ^|FSÐgÊm»¢7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéëI9! õð*%¥œäXƒ!ñàb,F0‰õ‰Xpº¢fBDŦ—©0î(4Pùž‚ç–À)Z°TU¾—•‘œ¥®ÏYŒ,› zB•r.ê dˆè7)U©Vq©ÊØÏNQ¿ 9––£´xÔå›’ 9ãÍe5Ïʶyã½ÚîßÏ ?÷ÏÖ÷ýüsÞÏ›þaÜ2ֱϘ]ëMä¦ì‰]Èð±Ëìð—ðs²¾^™t»—ù¤5%ü“619Xì-Ô£†<õ×¹«äÒ€\–Èga!`‡ž§y¦.¦@Z¯Èï4Tm§ªkÊøër®JùXíÃ2ª7õÔœ¥í÷ê–zÖrÝÊc6ÿú’Àÿ€HíE¬ç+za¤(5av®ez~–vÞYêv»Îá9ž[þå¼7ýÏxW˘ó.ïõß×ïyåø}^9"ïµ£ èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú†}\–ØÐ.¹U¨àL )1àÖ* 5Rè’þGEW4.àíÝ™Çoæ" XêÒQ[n†± &±k%)‚D‰K) Ã.˜ˆ;RåêWmR>nD@.U2™¬9Œ2´éÄR^É›[Môí‰nt•p¯Mzœ‘FìØP×Ç:¥9PÓå)³ÿûn¯ÇUp0p7^G&xœ¢ [øS» ’zÖæ§mTÏdM¸0ãôÖLµã4ò«X;¶ÚŒº —ÅdrJIM<×(²‡ìÌÿú’Àtíÿ€qA¬g ²^¦éœij»ñ¯œ»·ùŸnÖ¤Ç ÜJSpQÌÚŒ 0%àXv–Àï§öýûãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ Iqñ°MÒFUα>Ãy×™vAŠ Co P#cUs²Y£´&»=2*lôŠŽª˜ô]˜6‘X3–ü"Æ»;K†¹\û¿žëT®Ÿ’€¸ÀÑãÕ©KVËH€Tr'?ÑÄȉˆ":RhèTXQh~[õ‡F”ÌP3Dñ$ ö2Y4*€Ìxø¸kNsÓ@£œ•åY4¾ =‚™#h¤ØbíŇ,+ud‹Ž!4ÂÉİ0Áq„@@ 9«2åhðÃÿú’ÀÙ×ÿ€Tñ5¬ë+’Á浜áj€©ÔQTWSNESbl‰·Y­UýÉÅšt½¾_Ó”ó6):ú[±[—aœºŠÌ¢š§¥”_½œöÒÓÖ½­k›ïw¾ï ŽKÁ°åö°Wÿÿÿÿÿþœ”ݱ `üŒÐ1œZe‹ûF2Ø”NrY¨ë–õJ`&4*›¬0 Â2C8- RÎáwXpq€ÁUŒ +t²YRW4Iâ"LÔË›@tô£5׎CB°@7qö²¦£*ƒ§còæ/PQÒ­¹¨£¢°k­Toš¬Y¸¬”KBèaÕ{dmf޼­¸³JHF­È3Â!–û;«c^Ÿº•~\Ö÷ 5Û ‚è¬$uÔ>;ˆ€I¥­¢CÑ|ß©8 …â±"!áÑœ^â×ÀÃB¥K”ͱ‹º(0ÂAðhwž‚ ‹N``D,báÃè;^MDÓ—½EÀ#|]]ÆÊ¦•Dæ¹i4Bû«¥0\¼…œEâS¢ÿúÀT(ÿ€Ù /¬ç+£ ¦]¬érD̬èP¼ê'ªrã'"D·Ø« ¹~£Ï;piëK‰òžÇ8&#¬lã{î×Þw,Ü™çì/v¥yü¹s©¬/aŽó¤H0¾ÞœI2èÀ- ð ;˜øxh™蓃–Pi¥á@‚öŠP™çœˆy˜e@naÀ†P€J ¢Íe¢1 èe¢‚Ín32,\οP&Th 7õ½ðQ2 ð¥¶(!Ë<-ÂôTç$¹¦l2iÚô´B@ 1(“‹ ,dz;¨EAŒ‹Iñàã'J“DÒ—PªŒ—ìÄ 3@€—ñ g ŸkYwÁ0#èüN'"À+F_s”Q Æ]÷ë’ÍÊáÈFŸ«Yk¿†T””–Ž$Ð{Á‘x«hÀ9@ñŸžý™™®sp(',ƒSlµ ‚ÀÆ»R”d(j'#l„@Z{:pLI–LCXTkÍ”@íÕ3€ÉŒP†<ÏÝ)P"0Uô§&xÿú’À¨®ÿ€ÑG­k ³v¡©)½iw ]µ~¾ÑI…ÊÕV*ÆT\¾LDË óK(@¤º!ÔéK…൩…H1S –,ò?—Xºæa*[Qqµ‚ŽFD©JðÂÑí Ô4jÌ%TǼl¾T»Úe;w˜wf¦Ý<µH°wþÃñL;ÎjUS;Zª¿¡ ÅUTœ‘†@[ûC‚&¼(N(i.†:HaF§BgFæ*>k¨f<ÖÜÄX@‘¡k,A“Y(Ô&J­£ƒqWðàâ¨d©„ ¨DæŽ*”ʱâ©{N ”ƒR]$«YF>µ÷ÌÈ¡ÿLW•‹Ë"ÊXÀò ª]&hèËÚËÐÉU(@:VAeò-’˜3$Šf €\`@öºÅâ Ί»Hg’ âÀWœ#L*@:•ÆŠeç"S{Ü©,%ëw=Ƀ£O¼3~w¤ñ÷êWÄ»w¶(î^—Ky{¸á—,jóvs|µ¶‘¤œ‘ Q}špà,d³Žt52È$ ]宂ÍÃlhœx UÊë$ ÿú’ÀÌö€¡!MMç+³›¦j)¼a·hC ‚d×BS90!4ïU$RO( „4˜Q—õnÀÁ‚–—ó“ @ :¤Áa¬4* öÒ#ÃjìB*èCÛšbÔm%–êÝn©Ä 0q’ÀI΃¬Ájâ†8÷?ÊêDÇÌáÙ¯Ôúhð|<é¹¶Ÿ'!ÙNÕc8hq÷t apZ°¸cD®¾Ì†Bñ:o\=È VmGå6%o¤ëò‰Tߎÿ—·v퀲À,hE‹ÒMé©H9©¸  P 0ÝŒ7ÅÛ8¢@·E–Ñbi !=E“QêM$¨ Ëðå'¤¡‘÷[‚^–0@S™}"¢Á˳5v"™‚7½©As®huÉ•V¯-1ˆÌ•Ž ®WAMÅ!¦Wm£Lä.iJg¬Pàc-g†3.BRW'ª€²§)²£Š\–DƒÊ¬€t€—ASñ)~«=ó¸å¬õ­e.9~òýg»;:êz¾ñ¨“.±nZ­,!´x2p–ÿú’À^$ÚONo+»£éi¼ávÒÁ—ܸ¦ÁIÁ%SÎ`Äw†®˜C»&y Ä@#ìÎA¿³ÓRNÇ‘ª¿”ÍVr¥¬ÚÔÔ±Š“\.ã¨ï‰D(pe–ÓL.cª¿‘ ›)¦!8èqBF§«¬»¯@H k„ÈDEÖ0PT“á}ªV|HPŒF%>KÉ6ó>´jP…ˆP¨D±“ Ùt’âõøÿ_‡!Ìns=wkž­ï,0îõ­Tè^,À,h5R@ðÉn’„@æ{F„«˜Xé¼bÎ.†ò@Ô”È*^˜€0`Cð²Öú’M¤ÂE¨ppœ ™ˆ —©Eˆkê¾!Ø4Á‚×ëÓÓ`T@nô^¸ ÏI9 VYA,s§µŽç¨T,u–"¤g*¦+ÅÄŒ %D†¾ÊéÀ†VdWŸv[¼ïCL’vXñ¤"-‹†ÇyTðäÕ2‡38§#WmË¢¹jÝ»™óû¯ÏÿYÓÔÖîmí<ÏK48¬¥§S%@³€Î~ÿú’À SÏ€UOMç ³"$ii­á¶pÒË"€°ppP™`VüQ2QªèÐVØûÊëµIú:z ˜>ëÖÁ€`ik¬¬ëf0Ôn+ `Ã$C_H¦ä£Ä¦;z´Ç¬±ýh (/+ »%æEçg~_“AÿV{žZÕÌ©ðÇüóÇõ÷ñRÛ˜géŒJM^ÿP‡Gý¯Î:<ÿú’À9Ï¥MNk ³£éi½åv]µvËDäRÅT9$8PsHè¨ÝÙ› £Yfa®´öxX}ž9~aPÛ62«Q)Šã”ÝÚŠ>uE¾mnÀ€A‹>výzÓ>7•A¬²@p؃º¼šK†Hr¿²šg¥} f´æ<3)jÁ_)tn¼¢ŒºPŠ(— ¤ÊÜfì‡"ÍÃðŒ%QØìÅjÜÆ­¯' P³=}‰”R’TÖUeoÁ€€À &P®KÉ:â!¥…¤¿B¥uýÀHrû, qA"‹¦`‰Hf õÒÈÀü7,ª#S,àXFOIÙ}Æå  +N9ážßïøeènE†²ø.®SëÅVŠžT:%vOô}àI×6µžÆéK9ÐÍR¬±!÷ЦЀ…ˆ^³fíI¼0×5Ì™osù®ïPšÏ €^Ñ„é-«¦<@Isñ(_—H-€1'¹È:Eº™UÞK:n† aUð© Š¤;%2Ùÿú’ÀTƒÎ€@ùK­ï ’µ£*5½awã)g.ä´ÞÒ^úò kV‡x='ÜHkÕ¨üPQ¼{ÍÌ<¸êíËmÙ¡[Ïê-Û·whüå…Œˆq‰ŠÏã”Öé©à˜„­"Cù 4íOÊMEiö*JþfGó)¦WMos´ÿÿÿÿÿÿÿÿÿýˆ’à> @°GD9hrøP°}±!’Š€†KƒðKÜF–ÃfN‡Õ#‡só.¢°AQžÞ¸rÌÈQX¤sö82–Yªöi±™ ÈðÕšv Pÿü’ßu5M]æî«Ê4^Ýiæ°f¬#J<‰ŠÐÛ8æŸ÷K'ÑîŽaƒ¼íBóÆžÇæ Ef®¹$—ÔÙa­s¿­ÛÞzæ¿ðþW¯ õ’¦ÔÛ—Ì&LœÒlö¨KXše"ÁKL+hØ7#LlÌ,^wÎ’ ÃËZM£µ·ue9Äeðò›Ë ±‰f%ZÀêClH-¹t­ÄâÕ–¡8J‘5Tô—u5 Må[‰ÔЮÉ'é¥êi_µÈ4Pÿú’Àã»ä´ï?Nk R˜#¨iÌåsø¬5Â_#BJp«V‘Ê¥¤ŒR`0BÓm¤”xU[rºÕ³Öp¼jþ{Þ?–¿ïŸÊ½¨¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔIe”À.HРД< 7´ª'º_2À°±Ôù¨á¡Š˜®S ¡Í¯DìÇHG™z¼úR† ½]â¯ã¢ NÐcQö[1¶ék¾T QäÔð(ð‹¡ûÓ ˆIùUûå8‘¤ÍÀ-]ç•3Ñ%dÊ"“ĵ.æ÷Z”?¹ØÎïh§hf!øqA§½7„¹$fénåÈjEwóþß#@©Af5Â#몛eˆ„I €J­ º àxº£kgO€ãPâ̱Ñãñ ÈZÅQ0n]Y3‰n‚CÙ ÂD ‰¿†8LBR–¸N—L ½»•bAÚµç“ÜuÊ‹ñÒ¡pÁ–u†43ýìþ7E'yMÉL¡Ö‹æë—•FJÀU úv¸AH³žxä)|é@VÅ– ºqµÖˆ,:]Y¥ãup”9›Y€Y¬Ö; «nâžÑPâÕÃëï6ÒÖ/\ý’<’\#°Èé¬.‡øCîHäð›ÊÞàÂ$ß$xhó³¼£"0_ìr¥=øUåßÔ·§M…Ê@­4\±“ÁZ?ÝOÕ6\’hƒ€ß±ã,ÐXã²aØpT­€ƒ…Z §_I;&FS„%³OƪÉ@!C8St.«.1àcu ¸ÕBOžJ8«b ìv!É_A×Í€–e0ƒ&(%)ù-‚ B“1z™ê&½¬ÛÆ+AšÁDE(Scvñ™j4 Ÿe¡ÇZPÃàÕö^Ü¢PLk""h‹llóJq!˜½Ì`þò~¬r üÄ£*5Ì9n~Ù™ƒa6‚u%aÆ÷+¯K”W¸œHiÑåÕB§gPâü)[ ”‡¨³ÌY—U±˜šKJ0KÚXòƒZT` Ik(fôA|B ²©³xÏ@ýhê_k ¹RŒD˜=¸‹nÒ ¦ŠÍ.9*´²ûõí6%¦Ÿ¯'»”–*¦Lc)TCÿú’ÀsÑÿ€°íEMë+r´¨©¼énSQfï^¦³5Í~æaú}Sáú­ŸçùÌcÎk™ÞËŠwŽ K˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý@«@" qlB¥†f ,©þÀ5™hÈXpšèPÿgãÁÀR§¡ üf&`å@I„l‰¡®õ€Prªd7V¨˜€#S¿Q°M²Á~‘Ѽž.á(¬¨20¾†“*â]·eBb *Üõì -5ü@ÎÂBóØvà†’‚ö¥¯¥,ü~Ô†ŽQ;V›´Õû3—Õ«/þ¿r³kæÂ‹´ŒPB q _ÕÖèü’íh€(4,‘a‘X¥­9e‚EJ®zÏ ¥²ð«†JË[F÷ÅD%©šÐ¡€Ž!$°Xt„ri·“5°ÿ‹©b>rØÑD·m:Ëa‰ç„²šûZlÜA:£\êP‘Î}<; -œÿú’À]Ùÿ€TùAMç º¡g©¼ánhâQ˜ÔÃp¯rå°Ó•v––Y97{õ„äfÆ©')b0Ø]C·´Ùçkjÿú?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê@œ„—t`!$¨4Á¶Å58#T„N8 ôß?Ooð3µyâˆ$J``D Ã¥€"Ö•.Jó@Å3onl½˜Ö¡h™åšë ÐðèîO~Þº·Úƒ¯u°(„¢ßÊ+C°6›Š”4à± V¥R3ZW¹/áÚ×X¾|·näb“*]”œ¡S QQw„€‘*Ñ€ ÉårGP‡UÚ0ï@ÄiÈBWÒÖ|<>p „œ„%Z© ê’™Ï#®Š+>Xþ&'ôvD‰ZT‹®ëN°þÛ'¬¶âÇÑÜ™éû”™`È2Ñ`JYçé¨TniI+ ·ºÿú’À%Üÿ€HÝGMç+rc©õ¬ánþVǤ¬)ƨ—ÜzeøWËæ©¥W“õJNÑMaSé­÷W¥öúÐÓ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿQ’TI;£@ÀPÑÁ‚|Mú^–L hLmöOëú®Lµ&¥)¸Üa$À<$  2 $4Þ*v`ð†…€¢ÍÇMiÆ‘¸0¶4zV HE) EPkµ,xÛÙÈB"°2ÚÌ%’PÁSó÷e’ ôÝ"ËÄæFßðàçkÊ¥Óp\ŠjšOŒÂ©×°Öû…EÓ÷šûõ?>L_ä×kU³€ñ ZX+Èÿ§­Ún6îÑ€J¢k€µiRXšKWh9Æ´¡ûø&ÆŸ`ZôwFQÏI–VKîÆÚ"íOD†ñ§¤IPÇj¿$åËãÀ £PiSn³°¹!æŽ5Œ'Ö䃋ÎQ'U ¥ÐûëFÂÎÉ¥åéÿú’À*}ÿ€tíM¬ëKz|œ(õ¬ánÚ‘ÐHpµ,µªçZ¥ûÖäy÷*’¼ï‘Ÿùmz4ñüõ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã€4’m9´`ñ‘ŽSðtqó¦âB5Ën´+­P˜«Ey Å­ÒƒœÎ ‚w„Û¶€åÊ©P²ºÌÊA𨠥0`#Ç“‹fBØ$€ ¹]›åu’ZÚS”:–Z™°#1bï«Ei–}À“N$Ýè’y¶Ñ¸¤ œ=fÖ®nwW)>ô~®zî4¹Ô½s0©Huµ·7〛r¶æÑ€Ë€¾çxÈ$”mŠ'LÆ(³Nâ‹%DŸÃJÄÔ ²H5zR¡È·ÒÂGÁÀf;Á«,z0¬£ÅÛºDQ• ©YMxuÒ4Þ Rü¨9‰bv"-Óx5íé™2©äï/ÄäØÐ0ówïÿú’ÀSÁÿ€áO¬ç+zj©µœáoGYóÙ8ÿRE  7–çVYc„»ìÌܹ; ü#ueSøo•ùc:ºáœf«{ø˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì  JDÓ¶4]x-Á&jASoh…Ë=OB悇‰"±Ü…ç©9HÀK` ¨¡É*º=Ò T+LJÐW Ì»RfXl(`Ò˜mµƒXA¡!J<•‚ý"Ms”¼Ü†l=I¾¬íoÉžÈ ³÷¾b’žv|íᫌ^%R¥œ° Ýº˜R<¹Ü,}¹v;–XU¢B·`8ó3Ž×÷¦ 1¨¦Ö° Ð/E”@:DÅ.2´—‹ÁIpà@BYd¥Rƒ . )’­¨,¬t O¶ìhÀÝp —Cà’e‡2pñ@#"_µ“^—f$ÄáÜ¥lÅZ2îgãÌÇ'–aÛkwæÒÝcMÿú’À2xÿ€lñM¬ç+ºéu¬ån ¥—;EüDFž˜à¸nšH¥÷È2œfK$½ä®1z%Ž¢+z%” &•¬¶f‚‹:”¶µúæXçøç®Yâ¹dð¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„Ñ€GÄÞ&Mk86’!VÆgÃȼ<c„‘.—•Ô˜ÚEË?Á`‚%°eÏè$iÛˆã„ÙC† !W†ßÚÒ²f߈W·±jÎÓ: tåŸp^|ß–Y.êt0iH$ªÄŠæ)BÏIŸÙ2àE]:¿âŠ>X"HÇT©®ºuáˆja¤©eXô;zû\ÆQ{’×Çz¦Á=B´ª1À¨æ­@¢†‹<‡348ßjN5)5( 1Ñ„P…°bͶ`±ã[‚…F)ÓèDZ@*‡ÇF†Bfiü¼\´d"°fÊ&t:‹1¤ÍX³âÓhÝ•pŽ 8„ýް&mz‹·îºÃ"¢J פéÿú’À3[ÿ€á Q­ï ºÐ)u½aw†‹ÉÉœ¸Ó Š$B® ™1Äe%¾-øú[<0ºcŽƒtB­Â" &*5FtÌ êןwjgn_˵.K: 93YÚ—ùÿ¨PÝb@BËÆE€È‹‚âfkZ]ņ0Añ@‚Cʺ¬2L—œæ¼E0àìff<”ÎË@ª0‹½ e‘•|ÒÝÉx\këw¤];AS¶´0#t*îY@ñ´Ù‰ÛŒŠ9!,Ì‚ñ¤”#`¥ßD$Œ Ñ{»å‚‚¤ßm(ŒA¤š&)·u"̳Zx¬6¥˜‡Ù8à’X ¥XA‘·ÌÙ“=Ñ^©úiMÛô³]µ•œ1jÿ2îxóxÒã÷®þÐ|.­ rýÎõ†`ÌÆÙZT ¾©Š™—»˜c¯ø-DŒ ºY™|’ĉ n %.}­1ªjAiwR=zšÈç­ßpø¸@ þ@ç’4ÉÆñ)3 ›L6Õ­'r©%á`EBÿ³¤vB†ÿú’Àçñÿ€ûMMk » $)õ½avš²çÂdhQ`WíMg Å[TMgpó"µ £\°óÊ¥ÌVDÑADJP¾ƒïg¶‘bÓ`Æ•1†7/šœ7 µ Í9±Ë…Æg®³H»ŠÚVúwý½AÝ÷šûßÌ·s–?Îÿ¸,µMïÛ ‚Œ\± ¦eÈ$ f¦žféb¥µ1©}Âà0BKŒòh ÝYZ!ˆ,i•-Ð ,ÑóUA`rHQ"ásuj—.D„"ôW¼ú2¸J퉲¡›<ž ÝtK]ÿú’ÀØÿ€IIMg »£éi¬avâY’Õ]­hŠœ°DˆÃ?˜JÄÍa—êü â ZÕ‚ÈP¸2ù¶¸ àÈ ¯E˜…X9à›‰§À `¯Q½fp™J-òÊ5‡šâIKEŽÉÊLëcO_+U®gö1ÕÌùÛúÏ3ÔQ$’I¹daf§3A3$ƒ0óP3´ ŒåÉ@Êï9œ¦ùT€÷’ý4°0#1 BwÅd è,µC¡êha»‰.d™ô‹(8‹ŽJ7¸è#+]Ä,ÂâÓµ›4Žƒƒ—˜5ÖÁƒº UD ›¢Â\Â9ÜyÑðÐ%H-dˆBCÒÏ 5P°jl±Å‹hOƒÈËÑݱð€…Gµö“èoUòh¦ 3ƒ”űÇi#8Dß÷ú´?ZM;=ÊX„¢üž÷Ê7nÖþ-1zç+ç[ï¤Ð¸œÃFÄ‘ñTœ‘†ª+-pˆÂA†yØ–*< ‚Á¤d2 ÂBÿú’À€ù=!K­ë ³¿¥ê5½e·" ÊÝGhPb Ÿgí¹7@%$ÒÕnˆ ³¶-w#“ü„•NÖ AÆ ‰¨]MUuK4djö"¯€‰ªA4´ÁR—à¼ËP@4è rb©¨e2R¬8R– `n•XžL1…%2A¸®ZP)£Á]èhÍt»bó…n´#¡Õ!p“´yD]qç!ÓhÐØÿȤ2H\*G()¢-’6ìI%”×*RåzĶk’ûýÆäÑEاWû+쮨IË+êó¯Ò¨ €£A­áŽFÉ€•J‚‰¢Æ„PçÁÆ‹…c†A½ªil4þ“¢Ê[ŒQ¹‡Ž:)@¶ZKM AôZÌ¡¸†èÒÅÖ­*ìn°éœì9´²þ¨º¶ í$ÕQI -–¢dËEYÃKTIbÒF·R‚¡A¼£å55ÒЂµ$«C²¢É„¬Jv›ÃØOôÔˆ2…7A)…ñkËÖ!/Kár+0tÂ݇¶©…GÒ¤ÙÂç!‹°MœùEÝÿú’ÀªÙ€-QNk »S¤ê©½a·?–tO±«hñ¨¥‘†š’MHX5‰ÁH–ÏíA™ÚP¨X̳g„lÂm÷[ R1Þa€õ¢±¶nà'ñsX†Uù$|E‰Ùl©“Êi®Š ¯YÚôŽS¾( ØâÆócNÛ(:åJ´p†ÑNUëHL'eÓ˜$kK  KPÙ)Wb‚¢*·(8A(úÇ—ËYvSÜHÎÍÙ˶±U´PÖx겦гM ½Lõά=@1šzÿKì7^ærº÷*õÙn±r-GÜésÆ™wì¥ì®ßŸˆ*¥'wø=Áhœ(O±)ö-ÃÎàðJz¥ñ€´,‰@Ð7Ùô[€  %ðdjJç8!2¨2·/€°T7pßæG¡K;if++ Â×"”- n„©vnÓÎÝ}†=ÐÓD¸×Üž&¤ÅwéÚ‰¼K¢M·JÛ¤ •OFPê›æ f¾´ RÀ*‹] ²ˆÀÜ]èz=œþÌn¥l"PÃ}”rÖê¼1þÿÿú’ÀIB•'QMï-»¤ê)½a²sÎ寻WvɈ¦¸Ù‘Aœ‘tŠrÙ-â¨1 Ð²A JD,~ÔŸs6ðÂV(aLfYJC¨Eð™»k­®ÀqJËÛÔà2³F%zßvÒ ÑÐG›qšCl0È\£Î–6ßÍ´çÁ@¯H¡Èü]ÇH䬄w ýDq–Ê%×éù_“¥Tuå"‡Pý¿Ll€’œ‘2.ð1’XD<†ÔÕaX HpòèÜ¢°éÔ”–Äo4'þ24!ôxì³§(Á€2tÔ2ù4X’"V<¸µ_èSdca+•Ô¢bOTH¬[Y¢»§úî-ÖŸ2ÓX+„„M‹¼ãSεå¤ö:Î’ÃCðÃ’CÈ«µr•íœXYÊFa!‰6" ¤R°¾œ6"ȘHÐfÏ£½_þUÿúÀ[^½€õ!MMç+³#iõÍiv¤ù«V1î±µVQ#¦ßòæY_0ÁSÊÇ JT• ` ^dÍV _s‹“Œ‘ä±Àxc±v0`z@í¥ÊµI“3çptF”*¦~_vB·ŽbÂ`Îl)…8.Bgî­zÒ† 2§`XÛ\ш+¿ÉeÛÒ¤;,Å ý³&޲R1\Fýß°Â¥Áy¿‡½’“PÿÃ1)t±»”%=3q›q!’·Ñ—‰ÂÁžA4ïœ;jä:Ü›“ÃÿøW»ýïþ¥´J¹ÿÑYD$§#BZ¬\¶–ɉÇ"¾ƒŠà˜YÓzÍ-Q¡2(_Ú¾HÄ™Ýü5-nUB EŸÉúÎÁPL¼ œ‰ÚhÄÅšìÅ~5C‘²Æ ŠÛŒ œ­ÐöS’Ôí[Òëtí)L‚„S*¯ü¶z,RŒ½µks(“›Ž»ŸþËõøJ¯cýûĆ(kµtZI„Z€*ÿú’Àvƹ€= M®ë+²¹"©µÍavBR))˜ÀàSˈ€îš¤ 3–Üôdyx«Îs¤”üÝé«@J~~¥,p ŠÓreÒè»M_Em´ø•j׊¢ž¡Côñx"m¨¬[ySË%Í! eW7nÒúž-ŸáõZì 77-—¾¤2“ ìÄåSµ*`Pî–Us¦H ¤*ýj8Ð%{˜ëYÆûüÖYOÿpïþ¨¸Õ$,H‚ÀJßð2Kåp]4ñYÆ@LŸJŒ^–´ˆªµÿf@ˆp ]mSØ$BLÛ?û/êÈ«7zf&¥¦*°«}߆ Å œµZ«¶ÓNpÅù'ÎŒC-f½Vå‹  ïº¶b0˜¢w˜ñÐûýf¥šuï]§ì÷–½±¯×uqKqí‰ÚgÔ(¦|ð‡·/YJ‡ãý¤‡µïû;Þÿþz¢üõÝv÷¶_b&µ"J›’04nªb!²@¨$PÜnˆÙha=«»³NÆ»+³ÝäH’gcú¿Œx¢ö¹)§ˆfÑC!sÔÝhý<Ì<£c¢Í+ÿú’À“ÛÊ€i M®g+º”#i±Íivæ/ Ÿ,OX›IáâñkØGd-I ]ÌßÎÓ9fºµoµˆ¶kÖ¯Q}¢€tøÛµeÖ ( nkXÌDŠ[·,Üc¸çÿ—iµ¿ß~ä#÷¼°ú™ž$zd?Gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýˆ„ ²å£‚a(#7ÎŽ ºe¸`NS–k ‰rdݳ¢ÀÔ¢ßî]d @ÞÛ½Bô7/¾ öUY¹ VùvÜ¥yš8Jìdë§ ´Ê1g]“D‰º†äáè»Ä¤û£»WEŸ¼£Rú­Œ@y4e\¹¤ü+Ì¿Æ)‘k[¢ÅÚÞ{”ÌÅòÞ<Ör›}ÚíY¿œËsj²õœh˜^ÎÉdPh0ÀH3ïJ„‚-€X*…³Ð'H ô  ]ò]E’·Ê‘Hu¢V®unGZiœQÎ,jbšNáfïÚÊÆyÑÂoÕ}ÔÝšˆ]ml×Ζ³ê-3ç U‰È›Y‘yg$—e‰vQÙšZÿú’Àêú뀕Q®cK²™#)õÍewÛu6•Oo8áŽ/Þí-™jb«™Š´v#4©óKž9cW&hÞæ¯e¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ,¥h@‰©1P,xT`åµ.åœ]„B±à5,è92†\å›õ«nÄf‚ ˜l*\dˆþW•ר‡„R½Õr„³áê¹l®S0­ÇM}-FÙÃ9P»Ù]ãÖ™ÅÑ£Š¬‰¦‡]Õyk˱4 —¼’NÀÌ.=4ã¿>‘ãJ:þÚ«3ÈÓ{a_ìZÝL²æWïaýÿï¼ß7«Â®”±S)’]±€š‚À•^[ÅÞ` ‚§a) Ù8*Çíñ2¿ží¨ÝBLżårîLø˜Z•pëÅ4KFEË}¦Úν†yP=DfÅ2ÍØ« $¿§ïçºh6iýZðü µ`ô«(A¡ ·¬åϱÿú’À€Øÿ€`íENg+z !h©Ìév3sØÝ¦“Ö-=Že^~˦òÔß)ªW­øî®¼rÿæîè)˜UHÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJT­€ ¦°"ë Žx…¡0U*AâõÀBÅ7wð*6<¥/q”É'…‹·~Û’-nÖ˜oë?€­Ò|Ä¡—èº÷«Ü¹&Ék›Þ±jH iS ‹–S0ææi³JíZ¦¾ÏÇ®€åñ>öð wwPmºÚ©–sT½#G"{>r÷½÷|·€ "eÑ€•i ˆ*DHª„Êɪ%Þ5õàV‘÷–5/ã²êÃæ§‘H(ªŒ·:>çH£ä%`5Ùe[Y¼ 1÷Ý54ŒDÉ¢Uœº¬4)´-¦îTQ©Æ– ž%kAp Ši Ã63†—P`Yÿú’À_ÿ€àýM®g+²Oœ)5ÌåoӚĤ,–Mç~Ì Ÿ  ¶½ªÉÜ·õV’µ$zÍ5›xï Ö~óæþd].š‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú‚UÖ )BKS  !ž“ÁkZŠ Œ†‹&ç…ñöbò<¼$$÷¿Œß¿4'q,_´=Ý0Ä ã–Or¬¸Zžž˜íæÂp`Lµ½ÒÞ°ð÷zÃxVn/ÈÄ®zyÒ¤È_†`LdºôBIŒ*WšAz¤·8Æ7q¯KimHeu'pÆ!G_–»½Ý­`à©ìéP« T%$H@’‚BLœhÀƒB¢Ær s#@f2"` d ¨QÑÒ MƒEI8ˆ¥N´jÍìY¼>PhÌÔ ‘ƒ®EÕLÎ`© qYhp µ§.¶`¡&3ÎôF‹‡ØáY aÆI1‹mÚ{s‚ôÜ{L›×ÿú’À57ÿ€LñK­g ºbg©¼åsì—;F¨Ú§µ‡¡å¥Aµ±Õ–”åÕ§±/¤šˆÐÔÞup‹Æ-Rc 5S|þïó¹ýÿü¿-o—;3ï9¬¿—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáŠI¹´`"ä@±±Ž8ñή1à@0 ¸Á*Õ10"¾Ïਦ[êó?¤ªX#]v> 3=1ë™Ëè\Ŋ䈀,€pDë¢SU—;æ†B‰q%(øôªx»ûCÖ²Èt.Ë:L5Ž0 Ô€¹Í*B‹ð–¦ÓÞú®³œúYù1*’E·Ræñ”ãE¡9ǧlQnÎ÷•œ?ñáš!°oZ ‰)$¥Õ ý—Q±€PAÀ ÂÁqB`ÊŒ`ñ‚L™ÅåðÉ à¥Ó@ÙƒŠ¡äIâÆÀ§Œ€ Œ†¸* UzêSCÚÛ pYò'®÷‰±Á¡½ŒjÇ™¤ †Æ™<èO¸rxl¿HèLG®ï;ÿú’Àô‹ÿ€I!AMã+²Âéµ¼éoéÐß¶IØC*)—CsZï“z!èf¤ŠC;’á(€Þx%JزÌ-|N0 T±Ü”Ú§ûÕ\ö E§?ïéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€’TÑ œ"Á«‚ˆÒeHФ0U¼ó•6¢àT£CÔè»-¼0(,.}¸ªèÄ` cª@ 1(5C¬0r¥ñ+h.(áÃ;¢"‡ Êa법Yá…vòÔ%„/‹4~Ml©j®ñ÷^ëÓ.Mv$n"ávW€˜ú€$[mDR+0±Ñ1X¶Œ8‚2¼²—ù/¨§áŒ>×ݨä®Û´䳘b쳕+Päfd§¤"Q8çóýSúÿçÀž‘!’F0Ð4 Ɉ‚EL<BrÆ 8LJ‘ÁD¢—³¼ªA“å)î¦Ìµð —¦)jT¡©…ÊT~ƒ¸‚ã’ :Æe¦Þeñ+v„†©»òÇùx`"ƒ•%=T ‚ânŽÓúzO’ÿú’ÀÄ}ÿ€@ïO¬g séu­aoaS`P¢B!Ç ˆÂ7§P0zí¬s¼ Ì ³4¥Ìiðƒfa¸dg†µÇ{ÃdÁƒ° aB‚'3Ø2= Æ0R„€Cµ)c(oyD‚-kq&q{ßy=H ÿÍà]¦Ü¹êXœ¾ž=,ŒE1ã6µÕõi$’I@ä¬%`Тæ0+1`sc1™ ¸Üy††»Aƒ_”ÏåÐ9g=Ñ¢»Li ĉï¬Ðg/ðŒ¡¦ØÌXzv±-&žmž¨F bñS ÐÖàA¤N@# ¼­¬%#.sWbßm‡œP‚è‘+Ô´ J +™«*¶± T¿Ûb#©L—õR¿¶íÄ!RÆäñ« R„ `•L"J!ÀÃAô¯wTá±v[I‚"P˜‰‰²è-™´æ¼ú+ ¾XÛC‘H3wà–·(©¼ow*û-ƒ÷Œ IRް[s5 ¸©™èAáD áÀ*xÆÈÈž^E”LìÁˆÎˆ¡½ ÿú’Àó3ÿ€)!KMëK»“%êu¼á¶“.¥vÒÕÏ ¸ù²"BiÚa´*P¯^¥å#g‹¦ëÑU²èÙBbÎŽjƒ¶ðííœrý§nKœ€ÒÀ6ô$z°½ ¶¤Á£i ÒYÐqˆ>»™ :¬€€ \D,DÀï?YŒÀeV@„ÔH‚€Ã :U¦!=ô•Ç ×Óÿ9Úòû1ÊÊŒ0•.ncZuÇŒƒáøOÊ€ÅßÀ€—½UB "že¹úŽZhSX|Ñ)® ª£‰ú!HxU‘E@Euò°)Ï_’ò ªDŒ®>„!&a!É… ŸË¥Îd]LbðÛÄÌt^Ñ%Ù~jŠ‹Ñ)‹B‡œ˜:YÅ#Rç™Ðùÿú’ÀÇ6Þ51Q­ï »j¥©iÍe²Õ½â@‹¥ç%-é*¼’Lq„8—UÚ0Ø|H¦'O$›sÌ Ac5̪BJY&c.1r ˜Ðzè/¶^X ø fL„tÒDÜ%N bIl ƒë1Ë}CŒàô;&$>ÎÍ é¦L0¨ãˆB:LÓ=‹1””·eŽÆ"£.9—ž–DJÝ4™Wµƒ h‘ aôIrˆ›ç•§?X³‹EÊf’‚sBV£©¢3fv nsîÇjô fÅæ]Ì×kWŒ/yÜuRŸ”K÷Z’›½½ÿw¶0ª*¢"$¤*8\2ÓÌ!Œ Ìó …‚cæ80_J&5&ÓO€hµKÑsAh AKk=)ž0Q4Ó1ä!ôÝGˆ%ò¦–FTª]Nì ²ÖؼÃM1V»J±ÝQt¼»Ÿy“FË ? ‚ %ÃR=iAETUð‰B M*ÜŠJ¿˜ˆ$h¬».ÜIíMÚÇYGÏÜ~»)PØw*nceÜñVsk,Í)ú)e•!m#Z&0xh 7eÙK¸„‚ù‰H(‘´`Âö™ÁØîà i~O  ñÆÅnŽ£w1b¥ôe%€¸B`âµå <¦QNÿS´ƒ3 Y7 ¼”`™¬†ÖXö7!ìV–¼¤¡ J3ž4æ ;ÏË®›´T"Ó ÛLò v„@ëTÂ?HªOlôoqë#A)e“—(k7¡¯¯¬øÕ´ €˜ÑcÔ‘ZÐÄtHòr±†¦Öù(‚ÀU¥€ ?ÃAàH0H‰C# À¡`ÌB9èž{ýâÿú’À〾€ˆí?Nk+R¨è©ÍinÉ„ÐT½•R"´[X¡Ir!µ¡ØÔÚŠ‚©Â÷ ë=01ÅšÏW_R僭_2[9Þ’N_dã$ŸžÎ`„æ5ÛW D9Cû˜ä´t6pÍit½Ò„ÎA²Ü&P¦Â\é-·?,ëe}ŒacùËW¹—w…âm`”Ùá^mêuFœ=ÄQ(*4CÈD" —¥Hˆ€æÃ=¬´ ‹‰\r"6–(7Éý ¿Ž~X<¤S¬G–Sl€k5˜×k¬àÕj[¨ØÁ¦¼²0ÿÞdb_Hñÿ¬Ù'¯At•R‘¿¡ç°ŒˆI„ëUêµ0b´–n×i3¶ªêìc»–gZ:Gaç—Gn-ÛÚÕ+wË-ïw0(¡°Ê 4±¤;w¾®ùk ‚]h‚¨ w¤ú}0°0 ÄWÖG=T£Ä´‘H[­|ËXfäu‡™žß’’±›5Qð"”¢9l„¸¤ÕȱԼ¡ÓƒãÑ´JôRGj: "[÷ùï´æ (µ)`Æú6×çáúÆÿú’ÀÐXÜ€yCNkK’‡(µÍevSÎç¹M$q€³ôËãÉ”òEšjW¡³ç=3O ‚øüK¸4W¾å»W}ô‡O9ÄX<ò¶}?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿs6‘$¸Ñö‹—n °^³+ÝŠl¸„ÿFŸ„O1 ‡S¼ØšSËó$ Zøn3Ú­„Íh“˜óÈÄJ?†ámÄZ.úµËÌ(C00FfC“DœË÷µ—w²¸RÏ„‡Á1Ø¥~IE²ŒÖ´*0ý6oÅ-’ûëµ3©ŒÖZ¦÷Ù‹5ôž_¸^7ëó“v9úæìZiƒÜ¡dž“fOÖéWd\h†,]RL®ñ@1¡/æHD`‡äˆ;"fFu1Ÿý‚e©%ϲ!ÃÉ“™³6*ÝÈÍ.0’ƒ¯WÎÆA4H%p%xppÓý–rnObî½íƒñ‰Þ¤Ž‹u&ÆÆãí%¼¿K„ý´\Êìf…Õjÿú’Àe…ûüëENg+rˆ(©Ìévö5V®v.ò–¬}ŸÜ³Aö;jîóÃ1 ‹…ÒÇÚ÷-ž†}_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôî]Ú€†r8„¹¤9šN<~60ÒŠ,fh &¢m¼×  *Xwiu¸ÈÚ2YØô@,Q2ØÙ©µöy\õVþÍ”'•ªm‚`„¤ŒÊ#qi¢V?ÒÙ-yha#ŠRʧÜ£Öi(M" ZK4mxªŠ–îç9.µR ¹/Ë~þH,Ç¥ïÄÝë™_­–µ{W;—ã¾ÛÕç`ÉdèG¦°CiI–‡4óNÓxYÇc"ßÃÂÀ0j£^Á Èi52‰ÇAÈ\̘,AÒºö>°*x>=3Kp•g{QWe2*Û“j¸Ên¯xÿIX,W²î]ÁÚy+Hè®Í‹^7 IS.~µ·j iȾQ˜Ôÿú’À|kÿ€,ïENg+r† ¨)Ìás©ê†Õ¥õ?Ÿœ£TôŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíImÂK»X ئ ˜ $€xñN“œ»¢ P@’F–RZ:]’º‡rÑ †— È@1’ ­©¨ zÊbÔ¿;;4*RLg—i˜\ 4ܲVD˜~fí¾oÀ9Ü»ú¸’ÒÌâTó¬ø¬¸Å5Z,êϤ­f‘±%{6¿&™oØa…k¶£b O,­ÙH]o£¯±§V%0P içq6ôµl”n‰ P €¹Pè É¥½˜@G T²é>ÁGµTè"%![¡£råé ˜L.˜Ô9V3ÛªÜP­»×¦#hÇ,«OV™ô#Üž– µ'ÚËmÙ¨ö·î™v¥ú‘"¨—žûµœj<ÿú’Àûóÿ€¬í=®k Z–è5¼åj)()—Å5yEº•bs–-2(:·õ^Ëþý›»³½o¸ç{óνîᆻý˵o×Þ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH‚“Rdˆ€‚ xS£®‘0bª…Ã/ƒ,Ás &ÈD*(Ã&¥RÉr \À¢ÉDsZ l $ŠÅs3!˜²^Q®Ê¾öÛQ°L²Î2P {9I¡"À*¤XéZÿLUŒªº¡šˆÛ˜–»±ùDüºhcF‘ÖÝéÖ¿õh«vƒ.ÙÃ+4{Žr›€ ™t( H4ǵÉ\ ¡ýߨ„”R$Y”ãwN«PŒñxêe#¡~›áe HÜ‚€§ ÁØòºÝ[ZQ"JF#±Œ\Ë&¤v#²€¼Ê^¥«°ÀHšêi{¥ǰ/¡{—9u£ã›2™²Üȇb# œôTkݪ\¯L[þTïá_ûÿúÀ½]ÿ€A!?­ç ²_'õ¬ánÖ<Ö0Y׿Uî]- d:?]ö÷Ñzÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý$ QFr$ ZhHœëˆÅ;f_ë ŽªÎ ° :AÉwšsFßµfI‚é³ÂŽóy#œ”’…KUvX ,}ê8r“ÙsWéᆿWó¦àðé¯rǸ3ýÊSf"™–'i®Ð‘Á˜¿ÍJË•,åkëÊqÞûÊÆg*wùvŠ«Ãlô´ ÒÚ˜ü|/m‚”‚\‰‡J¡ •g'ð‹P—¡‚)¢+FzE LÔÜHU'¦6Q¥f6H¼‚SбrØSUEMŽåƒöK˜­íZ™š÷g™ý$l)ÛÿÞ°‰:+sÉã„o ë,Ý{SrÄäô*¦¨p©ÿú’À¸ûÿ€¸áE¬g z4(5œáo5ku+e{×ÞI3Ï_—Ùæî~¿.w=óŸ—?òÿÞ¾õ5¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷˜QI"NHÐp[3ˆ2øÓѦi#8›¯2³Øxz3¡BuÁ”@åËããþaÈë^µ1Jì‰+Îm”˜‚CÀ¡Æî ¬)FåŘ,û=2ƒåy[µaTœûvqå%|ñçZ+LíúYÞÑá…ŠÛÆö5¿ s–õ–Ý%ËÝ©Kìoð0Sù¦î}ßiB·YËm²¤h€` -LÇw ¬ýž—ÔÌš„à ‹†CÑ1ŽeГ6gA£;’Høˆá¤cn»Ñ"gªD™γ!ªA}Ìþ“#V¦Ñžtº7›zô-‚Ò/i¾Jv›êh¼JQ~+„¦b¼B4-ŠÜÿú’Àç´ÿ€ñA¬ç ºM(uœéo³-îyw-s|ß*k™ë¹ÕÇÞ­r{û†¾¦­´JV‘§D@À¥Lvšþ¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôˆ,´b&6H,ÛcÈdtÚ¤ÞtJw‚nN¹•bR‡’Rá:V¾é@Þ¡ uîa&^-92V ”P–ÎGz0Qöš–Mb04F4ð¶²¶d>êWˆ¹Î¤†“|Ãf¥·^b†qéõÊj–ž–Wj[üêêÎ4úËYsYþû½þz×u[?þþ÷Îþ¾[ÆÕ>;Ýkì{* Ä˜…4¢Tg¬“ °d €Ó%LΙ~`IV!ï×¹HÆÀaƒ4jô°]³ÜGÚz-€oöò=}ù´j‹s2P„±li¥4å€ w9!}™¼¤Æõa‡¡ºð^« RÓs‡Þ(jÜV¤ƒUÖÊä3qÿú’ÀœÅÿ€Ðï=­ç+r‘$'5œåv,²¯CnYZfþXT»OR¾xÕ±k\åNç»avï”\"/ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ“âIÆÉXÄQ@°¡Šì%•ŽI‘=j‹‡Å–‹ _eÐH‡I:$L:#=(Š>¦œª½Š;´¯ÐŒJc;÷îÕa&nÓv[ø5ˆƒL!‹ZŒ­æ„Ù„¼Ô0ÔËí@Ëâ”^7&eT¶°µ³eý¿ÂÌj’Žç)-Óá—Þ©?žyª±[?1„¤Ž¡œáC–lݳ&½%Û°€ÅO’Ä9*;ê‡èÈT(¯Øz Jô4~Ï@^÷è9bõ¡ä 'Z³GmV'¸ÐƒA¬øš`ÔYc\3Ú]bT!ÞÂÕ,t94oÜ) awV…²WVŽuÚ5œv;¡Ã)ût¯¦6&ùÙï™ÿú’ÀjEÿ€\ç7Lç r`'5io«©ºyÊç+Òs\Ë<ÿ{îúýïûÌ?Ïü¿Ÿÿm÷—>^Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ¶Ÿô”l€ELõƒLä'—¸ÈÝÒŠUaPRUa`‡BWE½8hMÀaÂÇ0è‘T’rœ˜ý?®¡‚cš×‹Z6_#µÈApéÉKœð ØÓ§¢¬å9žÀ²gRþ²—}Ò¤­v峦¢Ô5~g;ÿ’œ'êÓRîgÙ«¼«Õ˜KÊ3Ùÿ6ô37ëô$bY'$hƒx„{Ëâeì^u7 D(%ÈÆ_ìõ/ÀÆGÌï)²gÄÛ À *©TîžM4?šVu(FøÒäë)xâðä¼À…’ÙQí}<€ 0éjc8©ÐÕ‰ÌÊxÈœ×Æ=ºÒXM—æ_nzÜzÍÿú’À¤ªÿ€Ù3Lç+²PšféœáoÇŽ¾6h`h[õbŽSM*¤§Î{ï]Ý˳_Ys®HPiù#Ë©ÿ]‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð‘I$¢n6@˜]‚ü‰Z^$&ׂŽo§’ñ ËŠr"›% X鑦!Ùÿ\‹¸@*)c$DQ¬’T”j TAÓp Db›¿J<Ḭ̂Ðq]Ât#b*Æ'ª›Œ‚©Œ­‘鈋JxŸ¶tÎ ØÌVŸ(»@†åÔç`heÝ“Rß±*˜Î;¤‹ÒÛ«)Ët¹ÔÆæ5µžxá—Ój¶”“˜ê &ÚN9@$„PzûO”v:j* < 5]ÅÖ ix¬µ!^ªä¸,EµL”¿/ ©ïÒ=!zš—ź,’Ì®´Ù‡‹ªˆ‹Ì¼¥Ùi©‚Ì™rG‹5AFdJf½•%ÐËó›Êvýú›­=•lsçqÇòþVÝl·ÿú’À¡^ÿ€ðã-Lç R¦µœånŽ5rzÁÏ|µÉß-vEFÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑ·\âˆ@½Ö‚Cš‚!#7‘²Lèj´œ‘€EW/ļ[y&*K’"¨Éb“W”5X"سN¡O[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀIÿ€)¨·3¬ã põ£-‡¥$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÀP³ÿ€1@. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÀP³ÿ€1@. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú’ÀXcÿ€1`. %ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿXÛnG@f‚ŠæüæØ¨.å0„CFV qÀ‹+< Æ(¡Fâ, ö¾# 1Œ»n¾¥tî -ºÿÁŒBsq5‡CES1œ²å« y³‡aȳ•'Ô–[Ï=ç–Ï™çOž°Ãt–0ƒïG圚+m»kuˆ YaÑ ˜fnDÒ9˜1’h9cx„*6á˜9b`=üÓ3 @áF á ©F\`:azÞÕû´ìE €XɤÈh‚22К" $H(›X ñ„5:Tû¶8CH‘!\²•µ5MÐQ;ÿú’Àäàÿ€"`.!à#uœah ðÃλ±ÁqY¹—B"ôS¿×¯µÞU§»nržý4ŠÍŒ{Ø…œ+cšJJz¸~êÖÏ×ÃùÎ]Ý.Cô¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒ®r9eÞÔ@ ’<†õˆÔ "ŠCK’¤zi—ô03Ì`áW‘~)Vع‰^I=Â! ÝZ `un€<:¨!‚D i‘EÊA؈0tZlJíf§ªã§&ª#2CJ'žÓs.¹Êõ]˜½‰<ûÊðù}4Õ<¶1RgI3IK;ùg;)Ïùö¹Úœd×w è¨,çeò †ZÚRÉ}¨€¢(ÒDB`™PÑ¢Zátµ·rVÜPK@I ‚šÆrYR Õ©AÒ^ß,©k ¢ipóP•×xªY†m¿ÿú’Àå“ÿ€¥)¬ë ªw嵌ám6(ç°€))ÝùjìÏÌN?² ¶)é.ó.aúç~½oÆ´gȘ¤ŸÌ4+I#7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ ‘¤“rY@¸pHÐ3V ã¾¨2­$€E·ek$ŠD£’D9HMX°ñdŒÅPÉm¤ Ò4¤8>o`¬‘ˆuŠ26,O±56qYxA#MdaÜ= ʰ@Y[ÐÀ!NÛïiqhjž–žÔ–ìFÝùê¶1ÆQ‡,Ía–ïüš9[DKûJµÕ8¤SŽ+ð¶ޕN„÷©ÿ].ûïÝýØÈ%¤å­®Æ‚ÉŒ@`˜’¡Á™ŠŒêæ ´ÔHÀ‚21™Xh„0ÐpÀc$fRJc &X¨t,¥DCP2Ӱㄘ˜HˆÛ ,A”Cä.ݧm‹8ÊÑ>e0ò€ÿú’À’¢ÿ€<á+¬c j„™f5ŒakV3­P@¤Éƒ$»ï{Xe•á‹\‚)éCT!ˆÛ×…Ú)Šò, èÍšô”Óõev¢´Võ;*µßÖ…½á®ã`œUbæÕ¨.e¥ãS )9lŒ 3¦¤ˆáb_ÍÔ2“;S9[P¥A¡^·©ÀÔóDÉÎ `å&•Q².`—¤²†D@)c>8À0A h…~_`’è°€ƒ #,a+¥4 7\07ÄÊlJúfɩà < {9¦ º›:Ô|¢NÌ8Ý.5Û DÒ]iL;I$PY|ýÈëÀˆr!”jÅýß©fæycŸe7)öêEÁr&ÖT ²9šwÿÿ<§Ø´‚±´Y[ä ´Þ –|–ˆê®¦åþ.H4ŽHÁ‘‘È’M„îS&  ûC’EŽi(â 8²¥¤@^!'¢P Æ1ûP@.xz(ï¶'²e°kèFfÅRóºÖr¯ø2ŠŽû§3 …„Ø›H–¸•$ÿú’Àguÿ€Èá#­ï+C'5½ikü:ë­ÉheUdR:“ÓõkKëçKW=ÞËw਌žn1–*w*µq^òªÉVY÷0gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿĈ $‰NV€‡@`Èó6|I9†¾I–ÝiQTº6p@!ƒ˜p"¦ `3(­a…*¯ÌˆÑ%à…ƒAWiŽ<<±Z˜ˆcöO4<10ˈb×(Å‘±Y`4ÆŒÆ1ñ”¢Å,’Èfkiìì%:—¬3·b~ƒE»°[EzÛ3KšeKg¦–ð]ÞO·­r³¶f÷9ÎÕ©;ãKÛVjµ¸å¸ó±=%©ÑãvÞðË•¡|3ÿ—½óˆI$’µ€‘($%jTرP ˜J€ Õs08dT`s"¥F-1‚ÇÊ ¦¼¼Òƒ¥AXr´™0"dm.Ö˜ ˜Ð%ÎÄ FÅ ,yÔ‚Cj 9Ž$ ”e€W™ñYÞÈpò÷ö `+½ÿú’À\ÿDë;,ã zߨµ­aoØó\5M“¶µ0Ye£L •K¸c‰åŸiK…„€AÆBó0A$ÛMváçÞ§•ñòalàˆv2 l߼¨ø±N#yO!­S÷ܬ>®¿ÿÿÿÿÿÿÿÿøŠ@"I)ݤÂ_“8šT—;´1ˆYãéƒ/_C Zi -Ô ,éfX#ÜéUuË ØæR*àÍ$’‰c5)j}BÉ8ÒI¡L½†;“0‹&š#¦+ÙW93‘×yÖŠ1 ©%¥1 -ÉŒA-I `çVëüŸ1¢îŒh"´VÚåxp$Jì?ôðëL}žéLÔô©]X³”ã»®©¹G7>é0°Zóšþ RêUhíhƒ)ŸÊa%7ÅÝjãÈ{T£¨Ê £š(/¢û¡ÝC—K"@à5ò±GjlÁ°æTY,à*ÎXØò¼Í¯GÞb Ý— ðf¬p丿e©qP…Üä"Ü’ÅÇ[%ʆán4^RÖæšÿú’Àž¹ÿ€0ñM¬k+²å鵜eopÐpWjru¢°jzh ¼fšššžÜ•øÍ?1T<¹1W±û=Ö÷÷Z(‡–I_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý@¡'" (RH§r$£ Ф3Aƒ“A}ƒ@ÐÙHÈĆa*°.Dg!ÂÔÙÑ €×"ŒÇ¦y ¯`kMâr–è¡ÌÄ– ÁÔ2¦H¡ªA¼Æ!5ÜÁ NFD`ÄKšu3yUÒ–Ó8kåÂyÒ¢Sx;0´*‘C,B° MꂟVY}·—[¢˜š˜¥±z¶©ú a3½ÔιÀÙÄZô—E„w×ìX¤åh€;MKc!0Xb’¢ã–¦ÉîjMÃÈ€¦Pƒ,µaq…¦Ó‰0Ða QQ<¥"I ´¢«I>Á0X0¬Õ­0ƈ‚ÅY‹TUÀÓ^€ÿ®¦Z!ÈŽ)èjÎ@q‹ð=Ý{ôõÆã¼¬ÿú’Àî\ÿ€íGLk+r©'éŒinì¶’ù¤7dïs”; © K_wž‰_Æ«ïnôärÍHk+µ¥“œÖVì6 H6iˆT%»Cm­?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõ€ID¢Sº4 ½ÇS’8#Æ QlÔîºÙP•^cXb³&JìŠ6S$(¾ˆ g!Ê€—NEÞ¾ªˆ¢ÈÆÝw p>‰„ü+.%AXY|™|.p㟣Q`/Ü-"»55$Ö1YJ0!Ô1AŒ/º´+Æ´žÉF,, `1)£$*ÄAý}p`Ržg"zܶËÙSwš–Å5ZYsŸZư«ó µÏ»®~<î:垀ڷE^çkéBT’åhƒP™²7ŒÈT[ætXÒ(\,C(© ÒaVjo¤1( h)†i[?/L Š˜jM 0r¸ ‰¡¿ò—Í‘d-33ue €ª,Çõ¤¤BαCV›IôÑg\ )‰õNfäóu}0jÿú’Àhëÿ€¬éEMç rö£iuŒávg _h2š¬2Ô"1vrïÁmQ߉?¯µ-Ù¸öqùªiTÔ3!Ê–ScROeܳÿÏõ½_ˆÐ³+RAËpâ)«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇ¥± €ˆ¤8DÇø¿Á* "m0Z@%ÔÆÊœ½ÂDÎSLÀ± (@9æ%+o ÷Ø*s½U[â †ŽÐ©±M¡ÐéמTÒ™Z*…t <;,/b)©rfXåNuß”EvaÆeYçávÞØã©=É&ßþ?lB"ë;ré¡Óº1Ø„ŽS*å>\hçù=_ ¹«—ïÿyÌ »žõʘaú¹ì@û•gíQ¾‡¤·$H‘f©RŽmÔuQ0ÂàŠ„¦g³gys pIº*$í‰\Z-œãR#j©ÛøF¶º­lˆ†6,Ô¼| ê±ÒØsy: 5ÍQA&c¾%½ Ù™¯BlB©YdS—…±:êÞö³¨r‹:Óÿú’ÀÞÿ€yCLc ²»¢æŒárpÓÛ16ÒÚä]ÈÅÆ†àÊK•mÖ¾Ù'aŠÖþ_MA/¹—Ù˻ܳ»k:¸ë\©‡ó½Ë{þþv7ÝãnÊÕÿBÿÿÿÿÿÿÿþù P“q X ]˜aa ÄAÜcUaÜ]à0XÈ HcÆ00G¤Ó22 Ãm9Só"4dã- ©ô·nÀ·0°U ( Mp©ƒ›³)‚Ü1iÌT=æi…c‰1dͪQ4Å 0áM t0 BÊHŸxnTíiAWõ[äoD ,³~ïûœn2XýWA–A.KJ?o³ßW®ëT•Èû1®ËìYŒýY]ûw/Mëwý‡æÅÀ‚ňTz{ë ]'-5-yŠ\A×gi‚ f ˜Å,A:åÑ]UÌu¼Ñ¥ 8xĨĉDIàb€&8- —¦š‰š  š(y¥™«ÃE 9¨ƒb“ $†‰ ápÌXQPÖ m$ÊÞMö,Çÿú’À›Çÿ€9!?Lc+³Eg©½évÁŒœÏ l<š¹°Dné}æìBF†Ù!¥^pÙš“+ÜÝ×4æÄC‘`î0:¬E›™eÇSQØhŒ,­<‘€XÍ3M²c <Û¹4æÇ…²£@8#ˆÏÚ› TŠhdÊš•¦|I Ò€€ ÐaÄ–\Ã-9fØ3@@("uµûPûIe˜„²ŒTœ›ÓÎS߯OžyÛ¯o ø>L§/D*ª 7p @"Q„˜`1²+ŸCS„jРs#'-Ž›ô2 BÃFfÇ¢V˜)j˜[„s8˜ÒÀ½êÖ\°¨EìH¤àK¡§ L@.y+‚Öòs—±úaè0@ Ò0 *¤LŠ1íÊr)et'2g‰êÔT1•& ‚Š Oƒˆ]j"NA ÕhP 9–ÀTJ‚b/„Cdø `é¿M¡¨Ô¤hCÖ$]R%+h¶W°HPx%pMH98%ÍB‡í@®ÃUu¬=…x~Y$¾ô7îëO«"|`©l†f–õÿú’Àï1ÿ€#5'MMoM³Ã&j%¼á¶Xw—ëõ†[¬¹1€ȶ‘0B9’'ŸAƒC|ðÄL\àÂ€Ì 54FD‚TÄ6 eBfºdD6JUs få©P—)c˜p<ËA##¢„Éæ4ÀL^³€Â«øP0À#BÄu”@uHPºM.YJbF•oLÊ8m¸ChjÄæið´dWnVÊ¢.¹p2ÐÁØlÍ%N“:—¥ãEv[$ÛLc”Ú»IüVt¨BhXU»£ûYWêØµÜØiØT”CÒø=ëáÈn䦖gMaÚˆÏec+þý¾P' °Hô»ë†•T’¾‰RD¯³ 1€->>C5F³\|3Q@ƒS3:f Ã A±†&ºÁ("˜‰\Ô{O¶D+•˜ä73@!¨££0"a’Iå¨,3Tä³AÙÒeT5]‰€À|Ap´°v¥Ã€I0 TR}W’~5 Þj딥c·3í”ì3¹ Z4!'T¥ÿú’À‚¹¿€¡!LÍï ³@%*)¼½´-ÙÑÈÁ‡’2LŒ'ñÚár›£\‡êu¹-ÌýÚî/¿Ä(3 ªFo}g°4B¨ X’¦¾…÷º† à—ðàŠL`)Î~±L@´ÉÂɇTµT+•ï8¤F¨Û*šÓ”MœÎ®vn3ô“«c §.&s)s‹VPSGfë ÎÂì›C ^ŒÀÆ=ÀÚUML£I^/[XÚ "F’ûk yHS/¢ÃtX ›™* r ­B‘ËšÓV~ª€µ#QMåí¢ï¤*e½áv¦=17á¾ó}îáþà×íå&£ÜµßÂY/½Ÿ2ÎÞv£sc œ˜ %’œÛ€ÒÕº!9È™8:‹‚[S‹-QÅ@[ˆæ¡™22ªCô#¬©ê@Z˜ 11Fæ3’"´§l:–³< T¾„ÕÄÊjRˆòÁCµ‚”h¡`Us^.r›f Ög•h=qf1I$žu¡—BSgI÷{”Zž"š1—¹âw_HŠ';ı‡oßz H%RÂ6r“1‰ÅvhåTò™fëÐSá|wgº£ÜÕ¼+g–s ê·@Z‚ j+ABV¸ é‰[‚ø0Fbû)I,”)]@Á±VìBXT{XKåƒ~:1ÀNbýS©¢âöµÑ€`¤.Ú2ŒvŸ5*eª¤#~S‡ÐB'Wzüw—ŒªÄß"³v£ª×¬Gb T-ZØ™Tò›¶ \1Š@ý´wɽ’Å$0ÔÏnš–#4-¥ˆ*T…)˜µKðÒçÝ ƱZ½Ç ¹†°ÿú’À-)³Q­g+ªê¤)Ù½avŠýé›yØÊÏãÜð©Ì€èÝ€Ã@c5Né TêHÉÒ]ê6”pÉ&-<­ãk ÷ásº­Å?Å‚¥â Óê ŠOvYyT‘ ÿº)¹ À/šAÁ Õ ±eÚRuØ)&¶ÆEaòö»2wçåb`­À·Q(Ó)X'½S2’>þ0UlÃŒMZ³wq”q³± wCÐë{LJí‚¶i(å+\Ò¹Sb‰Ó]¯èvzÔÞ6)®RãZ¥,ªÍÞkó«Îó·"$”‰Dä`+rD$æžd휒’p+ €«&³AW Ò‹N\tÍhEe@ÀtïÃn4èS^Nƒ†ü$>Þƒ;újÐÎ<¾©APüReo J…qT; ŒêÆNëIV hè0—˜#">¯……CX)`ÅC5’Í68a`Eÿ/@ÒÎ3¬´Û×Ö‹.h¤™Ê€S¹>\¤XH uMæ¸Ã—öòší&_îã¿Ë»k—6o… ÿú’ÀK¾€é!M-ë+²ù¡ªu½ewíÀœ §#€Ã3’©ÃMr p;±ÔÆ£jéhœr©@ZÆ•‘ûÉ ãÁ5²è,è¡*@èÅ*ióOápI‰–=07¯þB[äÃk+LC ˜’À²M” HþÁNtZS(i¬‡z^áA 2ްyt¡µ„ •<íÅÄÃ"ˆîœ.9$–¿o¬Y¤H$ë8½‰ˆ°…Ó0`ä‰ , _¦ãKa;üúRY”_úû¶·•Ú¿Ë1 !™¶ï×€J ©c@€Ï0„a)Ø@ëËL„rñ¹¤2,ë$ 9ÞÀÍœ²h‹RXë—HŠö~9‚Eª΋ˆ OÀ°›øß¬ÑŠî!=n×JÓŠ‘!áS ÚeÁÙmZ,í<Ün‰¥3e†å±~F¸Ñ˜UòÛ/wÐ~ $DHÔÌ,²ÚÖC*d–™ã{_ušô@á èݘf ^'¡…Ôw%íí¡ìÿ/Ëj¾ðÏyWdHJ—§¤€ $”›± ²˜Üÿú’ÀÅ= MMgK²ï¡©õ¬áv‰ö!~þ´¬¤r¥¿#Íl˜y£Uœ.c\õ§I;ª>Ù¢‹˜À†uÁ© °9s*1£V{ø n4 BûhiÒ,ia`¨‚Tö.zÖ}.¹]kvW3Äü5’‡X^åâvó6oœ„âloÊ©B› j¥e3d/FÒ¬–¬—ê(ÿÉšìA=cºÉ,Αͨ©ati ”8ÈuynU”a^¦|ϽÞ8ÐùÈáa€ÿê© \¶ `…¢É‘¬Kœªü CDòVœ béÍ%(°ADßOhy'^ z'MbÎŽHû} ñ*ÂDòw1Xºª‰¬¹–b;ÙL ·äbƒ ·4i¸Ý%°õm•âý+ A[ª ]P¶*` Õ œJ(H°–º3ÊËrÆ­È75Ö‹“[SU&]£ „ T¬d–ÅÉ»·ôV_ÙYfU)¾§kçüipþ×üµ«5»}²…"@\Ñ* Ì@Hç]ÿú’À ¼Ë€! O­k ³#éõ¬áwU§ÒѨ‚•#zµó¢ÅÁa”Ò­ˆ”è¬|0!4Š\º¶¶Uºe×XsJ\ö˜‹.i!@R9f$¡|Ã2ua•R娍ÈÞ¦’FäiÚeáa¶ÈT•Ø›T[)„ˆ`¤}¬4¸`(¸¼äϿҵìÕeì®#&Ij ÖXè?æimò{’ Ð’qn\•Râ¬IRÆ€3µðjà œ"Ó’ú˜h茷L¦§OıÕsl|áäó’¾¢£1ZLÝÍ* 8ÌÑQÑ¥Gb‹¯€Õ¦Ö(4h¼ð$Xv.‰³o˜ÀH ÀÙAœ·7zØ(’uR%”9¸³˜a^+aA ÙjË%à~–Aªª¬‚i¢KwU°KÎ&b@Ä¥D•ÍC Àñgb•pÕ^n÷åýåìâ3 y¿Iå׫ü€dhjk£ c9¡€cm˜sE… L B2¤5VeòY'‘÷8GñC&\ÿú’À<8ÐíM®c z÷ ©)¼åw;y tö6Ëqê!ëèÿ L•ˆj½Èиñ¦HᇠÎfzR­æ±Hß×¢ö”V–º¶+q€DÊßÖM(ä]¤9±eг™ed$¥ã Awuf°†ÊZÓ½Ç9’Õ€i— 8_%8rã©BãG$õÌ®ÎÞ±Wëݶég2Ïå4Õ\Ñ€‘kõ‡ —Œ:˜Ù{†C  $Œü¶ˆYƒ !-wF&‚ÿ¤‘FaŠhD¢1IÞ›ìô8<(eê|ï8 oCpZ˜p 8Mê°äìR˜v,Àé'ÕEÏ•%a3bé¤.·ÑáIÚ;Mu&Yüa0ºÝK¤ð€Lˆ¸¼Äeј¥–Œ½židÀaÖ8t)ycŠ1(‹¿3×)é1¹–µ[ÚÖõýæ\ªò„ê€JE\­:XRù ,;¿Ëxü‚‰-‘‰ w˼Zø¢«œ¥ªe²H +Ö¾ÊÊ‚æ+C ½QÚe€Ø×£°"¯H†mÅc (ºí¼Ã§³¹ ­´ô«»±•Åÿú’ÀÀ»Þ€LñEMç º¶¡ii¬av(ˆH,±æ1 ! ej•Fµ[ª•¯VåOh‹Ê¸–Ä™e1Üõ Ä šx­‚‚êFÐÁ™¹¶æ.ÒòÆïßÃV{ÝXÂÖòÂ¥üyËzaZœ×?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð–I9ZÃgËÂ×1g:¨1‘)ñ6`;8a¦ÃÓu  FÕQ&%ÙtVl@Tãœå~,„½¤™e Ñ‘J2’ ­”)cƒ“tÐ`0ÒgðCÔLn('8N_ýB7im3k$… à-#@5Õ@\dh› ÀŽZ²Çd Õ$Öx˜X\3jQVËhé^¤‚õ{iê®Ìª»Iëd‰ Í¶Š¬œz€h’¥hü0VÈ,]®ä±c¨nˆÌ„ïR/!šdÞØã@TY…U&& Mø~ZÑ@™R©¤«ª×©+4hŒ¥°—1ì™V Ú@ÊÎt¡ý+:ÊÃDô6^Únªg]©½PðzL©û- »ˆ$Nÿú’ÀQø©G­g º¹(©œån×õ^ÈÝH˜9`$æÊ)`yMË6Þ6±_–Àжþ/G.v›ñÛÝízjZÚïu½÷?ýjËë4ºÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ:¼’íh…;V†æ[äÃDêFÙ" Tˆz_%.:Â)©†œHBfÅžBÖ¦©éÙ‰™q/ËIS&«5’xõ™F©¯Û„ÊuJѤÕq nCÆP¼¡ëÝØÒ „ + :®êš9H¸ñ°|Ò)ÙgÍB`Ë^K˜ ˆÀíï$¼NTÏÓýdneXbKËù›"pˆ<,4'i¦)Éý1½+À7¬•mh‚_¨‰Xذ!×m•ü ßߘPV>ï=+*6ù§xEFÊLHuÒaÅE…XÉ}ZkÂãYÇ>U)'dé‹ ;¥P"CÓUÊ  ufȘ…Þ.ÈpÁw‚­MÕTBhvg ò›íþÿú’ÀJ©ÿ€!CMg+º¨h©an ‰ˆ8ì©FŸ†ùÛŒARàÜ)`¨¦mÆs;4Ò+2Ë.ÕçrÎï7•¬jC.‘Í?X¹v c_ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà¶’¶"ðAV`\–º0,áZwPe=FŽÊ ƒÞ‘ã åòA;‘À;(”¼érb®@6@…¡ ðfhE]ÇAËq–Ùvß6b T,5LSau¥²‹ ¤6¤ÒNè?e«æ€Aß*…#1y–Z=¡xâÅŒ $ÂT_+u#±ˆ\N§e³Ÿ* ·)e.¤sÔ’ì-Xh }~NúÃ3rÀq˜z=-$Õ{ c‹œè&DÁÑ!êj/\å(Û6PÄe2 ‡¢_]ÆL=P¤êøO‡•ðKÛxĽ•ã^%nÏ/Y±f©5ÛX»{È*ãÿ—õ¢÷€W™%dD1m¥âè°Dwdƒ¡‡HႃªI¶ ­AÏ(áZ¸^[â1PŠ>Þ(]«”Û Œ‰mlJ`ó;ðSÑ(e–N˜¢6¹h˜*1Q7WÙoàºE¿*•ÈdSK]‡:l‡˜È’¯PgEÿú’À!mÿ€¬áG¬ç z•œgé¬áoÆDFº¹žØf™Ý–@²‡»tѸn!@”v­n–šîW0—M]åyåÎa4£‡Âª¸PÍýcYu_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ€.nÛ.ã­!!ÚÉ&$1kÔŠMƒ†L™Wp1bÖ$Œ-4^¤>ýÒ’Š 91A‡±¸›¹,(ˆv,Òx‹Ë%ËNâ¡,5v1˜¢Æ1¬.iYÌ“MMžEæÁXºê/.Õ2zÙu*-¸n½<:û4·'ÑAq¨.;O5K-ˆÊieq™‹4ÿW•­ZÂÜïw[]üðßr¯çÇA6ì…·ýéÔY'-h‚Á³“ßÿ&¸Œ‚“m¦ìˆ€[abW¹ 9£pØt ¸jH°å1,øÆwˆGééJˆâ¦êÆk^o‹ñ‚w"\>Ø“½’$1šÅót×*©àî«é|2^xº’©ç\ÒŒ¢å×”¢ãjüRÓ3¥š‚f²óÊØJrVÝ$ÿú’À?åÿ€Èß7Lã Z’çiœáoô»)žÊ/œ¦];h%{¥¯??—ÕæXwXÔÏîVÏV1¿œBº«ßéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõ/êøD—P«A±Å‰V†f™€%úŒº4-Ŧ=aC`"°Î†¨%T©]¢arÄ¡)1+R!F©“Ë ¾Á¡ÔÈkdëO”6lAíÝ[ÈÖ2eÚªì<¥-iÇq/ÝiíúæV·B"ÃÕºÀ ’´ =^’ìäÔu§¥´ö(/e3[ÿ,¹{;Fízß'‚yý/¼(Î"©·lm Ãâ0³ˆ}úÎØ !6Íy@÷ô²ÃÙP49‰!á—A%°>”˹Ô_ÀÈ â.+Ô8й!á…t ;Me)ý(1µV›‚ý´*Ä ÖGVê“m§#évCÐëÊ¡è}Ü‘Kÿú’ÀwÈÿ€pé?¬ç r|›&eŒáo¢W%E%²Ê::2œ³¿nõÍåÊÛ×.1ü5Ýa½þ¿šÏºýw aÜ7Ü¿,*àÕ¹Õ•©ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿhš­Ém‘€èJÞÒðµÁÖÿ"BÕŒ”/‰½5(gÄ9î8ºÂáA ý™J‚´Þ̨%"Q/¥ém™ÈÙ›bLçõ˜ƒ HIy_r „ºË0Tá“J· Lòó C‘]u]ê* ‡_èæU¥ªj±yeIn1:YElªÚú¸eS.þXasFuVXtG\„XH1³­¿Íßøïë·¼Z­9[ ”m° o$‰ 3ΉF4b0[¤5.º©#ÂÏwO¢óŠP;þ®Kô53 †A©‚П@PºxV‚^`ƒîQÁYæf@sùNE<Î]ÿ\@}DŸ- ¨2¢¨dèsŠ˜mÿú’ÀÒsÿ€3Lc ’{šç)ŒákªE\<¥/´54èºdtέù.8MáV+(ˆjcV±«ò÷áõ»gšÃ]¤ë®QuöëKOlÚp’I9#$p Í~Á ·{àca1• ²‚HÑ(10ˆ„Ä£‡Ço€ƒŒ/ @*(,4€ƒì5’ˆBQi‹Df ܘæ3š†J* ˆÆx`XÈ(Ѱ3F£ŒŽ/0ÄÎAƒ?’L¢5ÀÀ`³$Bî3ÿ5M€ËG`‰Ò0tÃ@P9eÌ$ ìIt7$¨cð»ÙÜv½¨n£•Ô¿On®uðÏ.ÕÊõ¼?ýªýà a¬w†[ýþ:ÞóçáÍþ\Çò¹ãؽíÑJ4€V¬¥-h  ”t$ØCMÌÌðBÌ`ÇM(¾@æ–‰F9 ÄE—|Êd5@ŒpS8ÐNÜ{Y§bjˆM€0éVãÎÌpƒiIòjG›8! ™> &„x€C€± òa‡Äÿú’ÀtÖÿ€4í7Lç+{®¤g5Îe¶Ti… Á0¨Ž1ư,l°ž@F<™k©¸‚ƒŠJ‚‹–p@p LÓý7’Ä¥b0lW ÑBêMP± ýÊkJ¡ˆƒ\tcoÃÕPyn9Æ,udž‘Ѹ•®Sz)DL$‚]² ÊCËÈŽcD‡½$Lêfáã ¦ 4µÌðÖ101”˜¼ær–IƒÆF"‘†Æ˜ ‰†‹ Îó8&¢€° ¿L,LDJ& „'™ð@ ÀAä7¤BS.‚%¸€¹™4A{¿†8¸±3Je„œ¿kª €¯×:{\œS§ ®@eu&ß Ù~j—!4Ó1¡C…˜ô&¹±"]FL¨”%*r„@Ê:Ë×Âl8kizB’1, ÏSÉxð˜X¥éŸ»©¼=ÄÉlmº2È~†_ôópýÈÄžQôóäìN', ÛЧ•UT”•„Û0 `A„€S&×d¡a¦ÿú’ÀØ|ú çEMëK|$)µ¾ivð_97VR%É01€RežD3ÄÒç0ƒ*]—M4BeÀÑ]!P‰ž! •Ec-ÒrªÌ\¢ª œ«–x¬AaÉ’vbCB05öZG!9 š—)q0ŠR€÷A² , Dô-C]k¢!“+–ô±….á dd-!š»”\8(ùvÔ19\æ`ýƒŸ2Á˜£aÁ3‡PCGEá†ò TÐD,étÖ“É"ÁåðAx1P¥šÊ.ÄÊÕñ€ƒ û†Tv:ÿCS6ö_PZ »<íª›Õ=•þ IºÃwBØ¥™i«ÓøA”“˜îé–"˜ª’-ˆV!€ÀKàtyà PxAŠ6< >ÑÝ*Ó :.‚êéBÈÀ“(:ÌÚ+=ˆA °PTâÕ"˜Fà‚\D)<9©0†ÑfˆìÃËÕ¥³6{ΰ(Þù¼S-úU=ï¹pŸu¾(r,ªòë 1C—¡|`V3+ˆƒ¨û>à!’ÿú’Àe5Ó€Q1QMç-»Þ§*½a·z8eI¯¢®¬°â¤"ƒ<.ß•¾”–¢ŽšÃ.ÔäDÂþ·„ÖeHÈšªT´X‹øò=îÓq]m:3=jW/Õ ýZ¿…¬ý¾æÓkõ…UTKU…×,Ré™.²™£˜âQšf{¡…„€VÀJrÁQu8;ƒ€4ZHn(˜`À²aTf^¥Ó`„° R@Ie/ˆ²dÐ-ÃreK½‘°  8( 6Ês `Ó€O³N[ ¹ˆØ/“ÌŒìå¬3t H7‰‘¯Å…WÉÀ öÌ„AÔÄ È0µn>±\ðÉÜOH¥‰ ‡eÖš‰t é“u–¿‹Éu¼4ðŽA*†ÊèˆC— (IÓ•(VR9|..^»«aõL-dð(×b}¡º¶+ò—˜ïW~þpJMÒ´ÔAI¨Ä2„*8Í’Ä8ïPG€A%ÂC)¨Z-ÇÊÞ"(o$£Ëj幩E³±,LDÛb&b‰€‡µÿú’À½ÂŸ€å?QMë »Y¥j©½a¶)s>N§Ú@,ürú˜ÈGKÌþ¡"+ñ4ˆK¹8H…8ް»¤"ìªÉ­%Dâ0¨ó`_)$µ[Ö%0töIèz_;.y§a ‰çzWj H•Žwb‰V£ÌŠ—ºó²:Û~b*ܼ`xC„uÜrß9èÌf–Cv½YtIû†eUëÖ§ ªëaØÂ‘”©¦î¨ ì„R00e8.ƒÌe_– ›rBþBÌ$~ÂÄ¥ß~'ËÖ0$E½ˆÍ0–c Bœ p#„?Ó––BÜ­!©ƒˆ L¾U+V¥°¦êFC)“ÏCIg7Ø´"o”ƒáJ/µ…{‡¥’¹#»bnn¼jõý¥¦å[Ue¯Ä•ÆnÊLöÑÑW‹uœ¸/õ[Ûû¬æ÷ÙlZÖxóRJj~~ðÏæ\°NÜ܈ÍB7pÌë @4^ã#‰-eÔÂ-<ŒÎì À](š°¿¢N^ …A%ZZÆÒS•Ó%19Ü(v ÇBâ,•ŽZbºÿú’À¬Ë~µQ-ï ºÕ¤j¥¼á·°  FMÖ½LT´B3@C…{)i¡r¸¯Ç"(LdèR0ãõ+x§Ÿç^žtXüM` Wå¹9m1Uð‡äLÙ}c¦©„Iס=0% };1Gf¾}»ôÿ)­•i_+MÞÞ£9RÿêµÒòÿjûdn]ûàªR·m Œ0©©üaÁÏ‚­”tNâg·Ñ=&ZHÀ#´Ç¨·-Ýš<+ÅšK¬2ò—‘DÝç$”;ߨbµ¦ìP x¤‹$C87aÚzDEbÒ\Žš’”Æ<-d’kSGØ,¦6R¼Ÿöobë2Üžˆ|»õ)b5ríY§ÞK"UÐVnìovÞ7w÷{wõ«¸e½ç¾gžU¶iø…€&¾¶ýÀ€´ö ŒDi  NsVkéFŒ ˆ„1· "{ G t“CE|–Áܤä¸^p°1ÌX'E¶fj¾0ha}H&!CرI ±>`•wöGj N¨ß—§*ZU£+õo⌅<étùE›ÿú’À&Ž… Q­k ªÇ$)å½avº¬—HéSÜžíì<Àž­ÄSÊš¤^ Üü¢…„× ƒJÃE:ø@+JÄÆ6u÷ñÔì·:ž§Þ·I„ÅjØ÷VpÃ.Ûª¥˜æúŒÓîAgÜ(úèJä'/’ì±H t¿(*4:Äç@ðL¾ªÊ.ZD#PåtÐ’ýÁ( ”ÆnÆŸ¡ 2|JîcêÜr«g+åVšzÓ(GQâC´ï"£ûYƒO\$-Y™QÁª¾U¸üÁh©æþ³`gOâ&5ØjEˆ»rSTUsRÜlˆ›÷ZK+& ÉÙdŠ_¹myܲ­_<µû½Rî¯áóÂÄÞ5w‰™Eª²Ä6ÔAbÀÉ&vH…Nºu¾^hI]…ã1fÑ`úG$˜‰Š¢Ã0ª™ÀŽ5–6IØ”UÂKBP·ê3³ôB‹=‚ðÍáE»XعJM>_WJRNãö9@>^Ú1%–h ic>„Á+mä•ÀQ-¨h‰î4i¾‡®ÿú’ÀN¤€•OMo ’é#é)½ásKØÌ9V´3ÍZ¯·†uM;ÚºÕÿïipäÏfs{nßÙó{‘X’¥Öšrµ†´övœdÆAuˆJ&LGeŰ"gƒk!;àÖ‡gu†Eи½1S —Õö ‰ƒ ²Ú”òÉ*F•؇hä3&œuÚ•¿±6ØÞ¨ÚÅq¹&eB%0J;ð.J¨øb%BàJЖM¥¨~2©‰R~[9-¤‡bðÃ#˜*¤ÒÈå,ýZÂiöjÙ‡XÌRþóæ2ÎåúÜÞ?»;8.6Wžõpª¤IJ6B ÔÙu£a‚GÙv©fI Òæ"P…n 25=¡ôqƒp¯pªƒšê(c@©”àgeŸCF´`#è.ñÀT°c+ ÞÆ¢q•†3ƒ‹N>3KõÃ<û§aÕ7¹*Þ‰– ˆG¥°Cö‰YCÖ+O*•:ß/GQæKqQpTÕªYeû½N﹨wªk&&Ï6­¯5%»{*L±«V¿qÿú’À…޲€e EMï ’û£¨é½évÛWên½ºL»z½¬ÎjýjtÕË¥¸¨h³2ƒ ¬S ¬Æ ñ‡@F°pA Ëù Ç3Ъ‹IB2`W‚ô%ÔƒÄr;+ ^èà*1ç%um›$¿Ú­+¤1ôb‰ Š "³úáÓÀÏcR©†}EÈfÎv0PÇil¨®°•¿§Ù[W)ŠsŸ6)€£‰ç9 3Øy¦ /'v(é‰À¯TŸ%ô•Rï–©>ÏýÞ_Ëe¼µŸç\çSИ‘ 29Ò~"›Xx'­tDD98àTpª®T0ÁŠ^ÎÒÊ~ëHóΜ”ŽäMʱ ¢\R”ãòŠ˜þRÙë ­-†_PÍàW…©Ã²sE¿-¼`½eø¡%¶Ë=¬óÚ·1?9\¢r–P€åœä¾¿ƒ8{*åÍPC½æzÂÖ3ü*BïF€”)´œÑ€$>„V㘈»…KI*VRE*Z2¥S†NàžY{¡â‚‘<ûDUrœ€HŠÓÔìÿú’À™ËÙ Q­ë º¬Ÿ(©½ew¨JöHVrgO $ÝVNáõbAw”bBéSUgà€™%¾Ó[Œ*þ’Šm²5ø´X*#ÆÞVr\Át6Œ‰°¦,âŸeŒ5׫¯?ØÎu_…EQLGösÕ°½Ê k?©ÝáŽ<ÛÞõÎë[¯¨"‰)ÖˆÃMÅލ°)ä7¡)H@bà üE’`ÞvfÝ(á¿sóoóQn«KNLE C$zJý ¸KøbT‡˜\1» ±:Ô· lžä€¿=YÆš:æàLë2æ¡ÞÀŽ©‡RFñAu%¥DµÈëq€R:'ë´½Ó‡ËÆP«)eQ’«V,ÅœŸHè:¡w#.6­LÝÂÀQàÒ_5&U¥Á<‚¥h€0bÇgˆ@€sÑZ ´p "—$"’#d0a”`2£“Ù“5"x¡Lj‘HÑ4P@™ËM* ["e-‰ß‚Z/IIˆWðÍg‚jÄoÕKSn°/üˆ ͺ .2ÉØëCièÿú’À—Ôã€Q!K­g+²•h©¼an¾‰é)dIæã´TI›¢+¯W‚<Ðêð Y¨fì7·–Ú†`JL&7Û À €|2Æ\.¶ýý/B¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP]¶K¶0 pä6"`u ÂV"Ë „4±ìÊMÊUC¡6òVòߨ ¬,ÝæùàL¥À }:€ÅÙa"NØ»ž¥Ø=µ¥´Ú,=(êJ“>‚ˆ|¯ÝÂÃ’þÔ\êñx½Á®K”áJæ&±MäeŒÉ¹Qu †aù×Uø­v-Jgp³1¦›‘)72Ê÷'«š­³Ýnß-}M÷.VÞ|Ë>ëXýΈL-²]Ñ€¤Ã¦ O ,å`u‡•@)0–ŠRžw–¨ :o…iLa¶pUV™ƒ®åˆ–"*å¡(;÷QDäó .OØwRW 6lÝinZ…l×`‰ÞÓßä+3‰îÐ,Eÿú’À…·ýxëEMç r©#©)¼áwK‘~¹éL›ËZY°r€©ô[†áÈ›u· ŽÇ$±$DaQYkö÷°¸Ý4ÍÌð­g:YüÖÑ?Á@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEí –4K²<§ž`¹@@ZR1CS!ª êb $<èì©Ð§—…ß&1¯*n@éáèÍ}b¯”÷Õ¿`„v—[òÝBQáJÝ]QÉ o)t )¯Êõ%ñZaP‡öîàórй¿ÏÊÇ•JgÚTœRid’f¦R8½µuÂExë‚þÃNSc‹Îê›*J¶ìY¹ùïðÞ\ÖñýÿëñÆò$VñjK3ÔN€\Ñ€”),بQꩱ+% 0BÑôÎU;Ô<-˜£©Æ:êHêP(ymC SÈVVñ-õ~Mÿ &wXë4‘Î î !J gz%¿[¨ñ/¢ÁŸë9ô•÷* §špP^i 8úŒ.®i)骮C¼úÍŸ¡+Æn ~HIŒ‚®Ûç”õ¶Ž¢±ˆŒ®—­ ª¹_Y}õá Ìÿú’À½Fÿ€ó=Lc+’gž(u¬áw^©•U›"©ª´Ú”ö¾{Í奯Îav‹ Éðti‘&|T ¢œ13»Ê©Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿön€Sˆ€­/›Ö„êžÂÚŒ/`° t (@$Ԭ “š’¨Xp4Ñ©lÆì­³K «Ü•ˆ î;ôžj+Q3UcÛ¥½¬~2µŒóóŽáË.ÊØ~br™|ež@üÖR<˜2·ÃÕ+?ðL.†1©«1ŠK8Òå~éì_­(—cÚ÷´d]Ë„lh˜ˆ¤Yèoûèlܤä‰aF&ò D„C#¡ƒÇ*&*÷„€ÒX4ÄTˆ+ÄÏáØÂ%”šj0ó¼‡QvæÎ¥Ñ7PtK•³jÅ£ö/ƒ±´<=§ÆáȈ€ÑFîÛ~¥ñY$Ž«uŒ¹wÓ¿pSN”öÿú’À”bÿ€ÌáAMç+rrœç©½anE(‡YÔs;3s²ÎÅ;fnII—ræTÙX±›£Ï+<.!$Y?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ!'A»"  5AOpâÈ2pô!×™$ˆpäF×gÄÀ¬i *+½9ʃ™@±M贓߆OP$âvæ»"芶î*Ͷ#ºK»œ´¼ 2AЊ¹ïBoÊ#rw­áIwßpý®Á+~Y—MSÕ¹ŽÊ*Á³Ö.]–ÀÖ¤–ukv0·2Îà© 0غ„'òÖ‡®Æ /H„ÜI&ä‰_w” „jŒEùZ?€(fêæ}‚–íßÅM•¿tª`¨H›¯õ éZrµT¯{V )% “ª¤“ÐF¹Ìx¯GÒÈ(ÃrÛüj6³Ê@ÞSÞZÒ&ñ`ßgùzQ[|Ôy>’¹ÿú’Àáÿ€ÕA­kKzjçõŒán–Âä=´r÷ŽÕ57ÒÉe²Ê\·w²ÛzÊ÷ç_ô«€Yd[dÉ,mñ9Ê>‡Uì $æÝKU!ty=‚â¦î¾Žy­JÜvÞ" At%$»¨­¬H…(}àgnÊE‘("8ÓIµøbœf2BP`ö2Ц‹&q{ê]EŠX’âïsN|˜»9`“eñ{Q¼È4’ÿú’ÀÀTÿ€9?¬gK²Ã¤g5œá¶nPó´ù7glPNƒ)Ž8𩋨¥‰\³zµôNÖ\Üõª-c¬­ïÿ¸÷ºålù–±îZæÿ/ûáчLU«ew”ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,’O+wñ€“ð=BÊ$uÐE!СNО¦A Óc„ùç Ý‹¦„óBA€ a/i÷Ý{Î1íë2``ÃY 4/hˆLIÓ9B CÎ'º Z·±4'™ÊÁFm_f-Ó½ï¼Mû^¸´•¤ «jÈØ‚•:NÌ>‰Û‡^âuƒÏÓÀ3nì¦TäÚ¥í~Ùʯ.Û³„Þwùõõk<;Ÿó<óýc¼ùŽ}çÕÔÏn2ziX¦äD µÆ¸ 2–s­<ÔÐuª‡¦Šv˜Èp`;Œ†0cÌø ¸ÆÈ^EpL+€ÀÀ#š³b!ÀÖkø²\Ô@ôÖÜ‹¹ C °iÃX× 0Œ30ÈÓ|˜qa#¦ hЦé Gi&^ÿúÀ¿ÿ€¡1Lç ’ó#&5atGÛÅÐÝ*ÜW*®dŠ‘Z×ì}©ÀlB»¯ ~,Âç"O#­Ã"Õ{7®áÔÊŸ æðÏš¯Iö@7Ùj…ÁÊF{Y`$DXöÖÛ`Ÿ.FAc Á \Ë5ˆÇ Á@(Ñ€PÊ ÷ ÌÞ¥uÀá€F˜¬˜$š@CEÑ Îe„S÷¾ƒ€X¡! H"S½ŒxP€ÁØâ^¡«FG†>€`3>ÿªaÒÅ~e„Æ“AU»öÉäÄFÑ&…Ò@-‡a¥/¼ÐgbÚñ†êÁˆ"D P[ [¬@ -?L0gœx#_zë>Äž/fü§ëJáR—úÆwb®êêsô9®ÎÓeV¤²QÎRÎòž‚’¬«ØÛ»€NÒc…@Tä±éP$° a¡æn¤`¡Ç“ž`‰!@ƒ«UA‘2¡–…ÁUŽ,TÈ;AP¦0oÒÔ6ìDÞ4z6§ h*…ºÕ °<¸y¬?OÃÀ]wùaÈŠšÿú’ÀI)ÿ€ï=U½3§¤ç«; š‡S¡[“®™„ D0…¥Û[ÍÝö‡ x³ ¨,h0 X»Ö¢Œ%×ÛScfz‰-ʆh™Ì€VÿÑá;6˜êX#cWK’_4¨€ ƃ ½Q>„†)w"›†ãrùû|Ï9Dì®7G©V9OOIõ¬ª¨Ék ø\“ƒÂ& ´.t™‘ @æ™ÐdTŒÈ0PE¹€‰4GWÄ À ´J¦}¦ž,úÆ´ú“ ]™kÖÆˆŒXÌ´l7¾³_¿u¤ÅükoPèȱí}˜9ãM qBȲ ™ˆ@ø€ƒGÅÈ0áŒQH  (c€¦X¡˜8cˆ•ˆEÃBÁݺà!ÀȨ57Š7Z|Þë‘EÈfÒšRÄÐJ4œ¦tUð( ²(h=¦„zA¯DP7¿ìYYXšïNÈzVÉÑþNÇES«{ÐóIÓœ‹:Œ ‚ƒA/ÐÖ€H.ûØ“öÔU˜˜ØÊV@K¬¢@³šã„oV ¤ xM-Vuœh9 û.dw:IZ\Lr¤)ÈË£ìµ-Ù¡h™óŽiøÀæX‹¥uåÐ\Hzà–ãjÉ ÖP¹’ ”ÁBfˆRê‘3W¬ÌAT“ M Õ±ç/š:Ý`ÿú’À»>ÏE7SNg-³®¦ê]¼e·FMùGÝ‹pnôÕ‘%<ÙÓesÖéѽ KÔZqdCbjpÁi\¥ÖÝ$û}›$S yd«»[Š…ÕÎÓP&’:;j¼bÝYŒi¨äUmî3;~Ìn[f‚~U¼ò«øgc*›.¿ù¬‘X’îÖ†î8H\– „“=œ±Ð ‡·¦P÷†Ø½èD©Øq†°†°ÐÒÓ ã6邪ÍUâ fë(“vYpmxȬ&D ”ÓÌèQ2 ¾®Êѱ¡ÒƱ³JÙ$oCÁFƒKµ3†e-É+ŠÍ›—be«„¾òFFÝð{â³w¯ÈìeYºR.æå@ë¹Úk¬;´÷ñ¯¬füÐÜJ'»Ö÷£U` v6]M"ƒDÝbõ(l¤Ã–p¸Àek˜Pà–]øàiÌéF&º@5.d¦U1çÓïRqÒÆ Bc%ëæJ&(%2·¦XDb¬™Ûa‚)* Ê·%ؼÊš[+£PÜ75ç&qá ì=ŠXžåbŠ•gDe0ÕÈžÿú’Àž–€˜ñQMë ’ë£*)­awâò†–ý/å„[e®[ÄE‚óå,² CÕ]ç3ß÷/î9wÿÿ œ]òâ›ùt:¢ïÙÀHœ@%îY*t¤KHwML§@Ô@¨% Sh¬ˆ°áf¢¡LZæ¿ ¸ë[ƒÎúU8¨jUžÐˤ¤ðQ°Áõo·Tî"6ÚG !h3g,uKA¶Zðã…j<Òœ|`D¼L8ب‘A/ŸD"lCƒK ÓQˆ%y¤s„+$wœ~zA5;òa§/e!‘eНÖÁÓU žˆ¯\~!z‚õî÷:Ø÷=ÜÞîï/¾–±'4Úº0Eª9c`¿¥º›Ið Iò"žÌÌ ù 1ŒÊFËjùBiøZocH¤–¢£•j!3°€¯[1Q½.ùF0=—ô’,"fãvaÚ$Õ.'4¤¸Co™§ú0È!–ÄB6¶Ü„kLí³#Q߈ƒ6O(ãì<Èq¶Rµ!<‰s¹;^P؈%ï”I©YkB}”ƒ²õŠ ÿú’Àö ¬IOMk ²ó¡j)­avÎwßìfi%½•áá¾cܽös(ñ°Ðüºœ«-µ—ÓßÇòíÜÿú’Àà}µ€u!AMo ’ð éuávm\,D8ë]ð刀J)’K‘ 0d$߬".9ñg† q)(ÉBƒS >Ù©ŠÕŽGQ]Ôv‰&TíÅÈLõR",vÛÜ!%ü!Nÿ4+ih|Sƒ~KLè)‘1ªÃrÙ±À”¦W¾¼ƒþnOˆvœRm5×é)D ý{qh‘VPüU‚K¡äÓBDºÕ™]_ÆŸ‰3„ý7Uš2Àf´”eW:ûŠLDåõñÿÜõ]ó}©ŽVÞ ŠˆAŽ×ºYªÁ&’¦úçºÒ2°kü0<ðØiEê€aRCRàFRH а³ŽÒüöà‘Á£Æá˜KÞü?Ƥ+¿&_®TɃš¶$²)BÀhÈ'äRÖD`lênë9ÄÒ.Å ©ëî4ͳÝt,‹|°µM 1nZ‘L˜.’ëL)ª½M³É ÒÄå`eß5èÚ›†— ˆÖ¾šË<¿GE`h*‚jãwˆr±OµŽ±•Êð§«IwëÖË=X°~¹eô’¤Š(’]ÿPÿú’À–1¿¡ K­k ³£è©Íer ©œ‡©ý î4ŽÅC€ ؈*exh ÌÎŽìDå(™” Á1I‹*.§ˆ¡\ !¶ü‚`}•AC‡.¨ök‚×P›x7'qà•5$[u4‚³ªË¤e‰Ã‡B³ªÆ#„×{Ýõ\è™P)’И PÇ5GƒTo¤¬½‰©³¶±›g­Â¡v•G%ð’|©é?ùŒóçîõ‘)5¼ }Ê "­=t€ $¢J–´ 9ÆÊ´KÄýXqeF>X@v 2éüÍC ôÿ$±ÝFÓ¨BÃwG‡—¬‡šéVh›f0„/RÁ±$ *•´(ÔpOÓÖŽö<´ÇƒjQ¼(%dNVÈ,”(’Èy^&»Þ’€UZZ‚\PAf¤À""DŸªd+‚)2±›ÑG¤hиÒõ&ˆ¯S˜!²®I$Ü–Ô50ÅãöðÞxïõ—óõ®ÛžvÑÊÔ„ E€\Ö  KÒ 0ŒX(l3.N&D@Lÿú’ÀÐÉ€K®o ’é!éµ­iwF!¸o¦ò]ñMægÕËCJzT; a„ ‚¹¯oûåÉ©ÒÀÈsåt|V@r,Ó'‡t¡C§ch¨™h'& íÍ1‰TÒšÔûˆNÛ E+™Å:»„R#Òg¤ÈDZk$‰]I[Vëlõþ Qi],2¤Ü•6}Å}¡’T(¤5ˆÀÖ¤®DÅL²½—ë}ÃîãZßqË9l±ý )"Sº°Í¤@è@8©Œ´ów4âCF’`@¸sWG…O%1žÂäCDÁŸˆ’¾( à='¨ÌI;¤­Ïì¤F(r“-úޱØ2q[Ž ä†ÔÈzP…µ¶ *ëjÌD- ùßž–Ï«¨Ve+‘dUkÒhn™€8•e^•¾swÆäÃ6˜`uB4ž"Ëôû` $¨`§::$Ž€²5µA(~§A5¹‡`ˆd:­£ã¬<`.­¡é@ªzßN$*Xè†aÑàdbˆN'T”¾¡3A­”´Í伓ÔI——Òƒ…BØ-\™¥E[º%=ä:€ò÷¡ä ¥x‚.Ö g9B9ȳ9 >Z¥B¤ÐE[¸@ß+”VŽ49"kÛÔnSiÍão>Kóü?:ö5^§ý&²ç{ËU¦H!“Œ‚ÁlY&ÎíÇž%!1]w¤jÕ¯L´!¥,ÍgèZ´ õ‰õ;Dº_ö9©ÀëÛHõÀ¦CTÆ©RWj"PrÔ3z$23 †ÏbJÿú’À gæ\ïQ¬k+r¼£§é½ew_½DH°H±˜Ž8†*a ˆ }`Hâ·ÔhArä‡?ÆÝöîÿòó•®Ò¤0Ó“Ù‚c8}%Œ‚ðÌ‹ Ó·2_?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøH´Z&;ÄÖ¬,MÆDC éÍ|LC„4F‘҃ź—ÉäÂÔ<Ï¢~ãìR®(q.ÈÇ„«*h,ˆˆ…±©!eZßßHŽ·~>Â8'Ç$§ 7ƒ.5ªvèFà Ÿ’S‹ rD¯¤É¯ê0F)=ÇÜ>!AÙqŸŒ`ÈT¶ «q°Ç¨à´kí-2Ôõxc+ákÕÊ­\dÃ…Ô“¤ ×Ù«¬PÔ¬”îmˆ&,–挹Ϻ¬K@Ñ¡ }€‚ )($h°†ÖÄ*ƒÓKÜ‚díŦ¡&0À€æbEA åÿJr‚l=,Û-£4ÝrîÃ/€‚‚%îð²× Z*ó›*ñ×W+ÂÑ(ó?e’w•ŽÀΠq ÿú’À²Xú€ïE­ç+zÁiu­avz:ïñY4r”,Æÿ1•A&‚%W¨Gz)^¢F2ê6ï-–Lµúµ,a^W‰ikbñ9öý¹Ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø¢Q)ÍXƒRmÁ 1,xl?,´æ4VI“ $e¨á޲—¾ÀQäMÝ–g,I¿p|4׊Jz– [L¥C‹ÍÛûŠ®?,9+Lëd¤ž³£L 5ß“D Œ0…™b˳,| ÆŸ'$ˆ«¡9¼Q»¦|M¢àM(] ŒPd'Qk!{ ¹D1 'â|r" ­Q&zËžZÅ ”qX¬; ›±VXYp4íÙªÿ{€%\Ö— ² ꓃™úSˆLk`¾Iº˜ÅI_Ò!4œæ˜Ò—rK;0:„Á@žH¥¡òéafÄ ùå¦åÜ]*s82 ÏA±‰Cøn.—tb—«z‰HܬEà¦Q;KB•Ú®•t#N´fUÿú’ÀÐXÿ€píMMk+rÞ鵬åoÍS<É&ªï@‘ X²Vرª´WEh¬Ì70ÜP–—´ arPupªƒcnŒyd°ù7RŠ~q¤ÕjÔ×.Ýǵ2úÛýïuù ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ¤SFƒ+̃‡§0…«Ô2ZĤ%©vجڸ@Ѳ‡í²)´ùeÈO•)«Ù8—°ü8 7tȃâ¶•êMìøÞÇ]!ÞAõ_éOZ"Ù©5Go Ræ©e+´&Vìï# Ï$²i÷ Í!@0(’_Q6DH“”#÷Ÿ¿ëÔµž­ˆRá0$ätcc"M{òš+u!yÍd\(™4(eÓMÛÿ^÷÷OÚˆII’¥Õ€((² m„(Y‘zí}™¢#4#M8\iB†çŽ2©ú8I p¨vð–‰~ŒAæKb‰¨˜S•´<<,ñ_¸¥‚‘¡;wQ‰5ãè­Í;ÊŒõ‡íõ–+"lÂঠÈqZ’ÿú’À7¥ÿ€O­ç+ºçž)u­aw†U¥û`:(›v­I+<2ˬ¥nB¢/Äë²ZRƒ¾ˆ¤¹ÇZß/áÎÿÚ>ÅžÑOÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ² 5ShÐCÙÚ@ÆÉAHf¢ LºjP—dWC¸«µ'K2TŠP÷2ªЉ€˜ ]E¸¢@k¦kqýD»Šr,¬T1C,JàæÙ!m•šš M ôAY ÷VÍþ‹YJ °Fæmÿ=S :×-Ên ΰµÙkŠáH¬OQÆf/c{rÏ=q¤T”aM1”s:k<¥Ó÷˜Ûö#¥ŽS„€ I¶æÑ€”Maè0‡ ϱn°8:#F…¿¡Ò‹lêÆW¨˜c!YHŠSv1 ¾ÊàáuTÄažÂ‰Š†A0–›>ë8 ¦eB­WIh.e22Öë$Vö É  Å}°i\A³K%†0è)8$H„Iÿú’Àñ ÿ€DñO¬ç ²¢鵜anhÓÅ×ejä l¾©aÁ¦„1}®Ëí®¶‡O Rã®êì9Ví=mSnäÜ÷ŽåOo?±Ã‘Ô-Îkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü©ŠnhÀJä„ËÔ®@ hè–*OÜFPpHÐ, KQÁÿ(p¨¯&š"þÖ¶œåÆ•­„ävÙ0à‰™@hû¸ ^ÂKØ[öE ɺ§„BPÍ´Pa¤Öà”ø‹ZnTÑ! eþë¡Ìº[~ÑjËøßNÃ.H’`2!¯Eב'Á\²vumˆC×ë¾U'߉Uwí§L¨¼†ÌO/‚ëåŒ¦Ï Ï©HâXQ麄 *$¦Ò ’aŒ¯0à¼Fi«›.ZFj¡À†3XEFq:ÁµRÖ;·W¤±Ú*¸qï/© #fÇ!«w4ÁQ@ƒ "¶(|Ôá¨òo¡sغ›œ˜ âýÔnλ€²À¢œh±Û m~Í™„êèªóJ.ÿú’À*ºÿ€píO¬gKr¼©i¬éoRMP£ÃÄÀˆHà¿ÐRHCñ×&õWê©AõâÒÏ Ë4Ö#tÓ’xÔýå{}®abþu°½¼5»wrüïsºåM\ÏúŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýQUÉRûxÒv(21Òã6€a˜€B¡(úÐYHºÃ€‡“øÖAIF1%kà8©¦žÁ`„,ÊÞ§E_¥à¡-NÌ]ê sBÿ¨ÖX:_ ¬^¢'ˆB[;9½Õá„TŠ×ijQ*M4ênŸR =•¡.l*ÆO0=lØAÅÎÃÂíkOÄB"×á·Ë8mÿ÷Œ³Ëú } ˜@©YtÖsÓ¶'*ßÿÞ_÷õö50ꈖìÐ(’å­–^`FÐÜ g^2!‘APª eÑ8eì0™C÷0Q^½Ðî”oêG !—ºHh*,馅UÅÖ@Z„y;\‚¶è aÄo_vŒü ïF d½`â0Õ3'œ¤Í¢;xûŒ‚É’¬*ŠÏÿú’Às3ÿ€‘!O¬ã ²Ø ª)¼áwYvªÄPT#PHºµµtY€‚Ùd‘f®ÆÐd'¥û—Ãòúx:Œ€·î0 ”°´Bk)¨#|V7hôvÛž÷ÞþỜüòÂîkmÌvÆ]Õÿÿÿÿÿÿÿÿÿò\± ˜*¾é Bþœ0Ï[&*Н!bÆ&K|ÄJ6i ~*ö7w¬°(a­äm˜>Œ|VFò§,¢¡ÔŽ?pÛw;Eþ$*M7‹æ¨f "P‡ÐLÊùšUB·£Éê§×ñ‚é¸üEÚRçIA@³vu° Ù ³ iêbÕÁXÑ Xû_Õ}›¬U¬:¢12ŸÎZâì‹¡|W²«0[—YÕÝ~µÞ^×7øUÝý¬ã‰/p´ïFl."¥Õ€]d‘)Q¡8#`¢" ò€2B Y a-Д¬L9k†.{(QŒHP1&Ÿ²Ï/К(Ñ( aŠÌkö¤ðëð–çxÃLéB̃ɀ©쪩œL /ŒÝ³BåŠÔ -À`¬ÿú’ÀÊ2ÿ€­MMk+²õ"ii¬ávÅa,Qß+‰C4Žì8§lå‹Î»­eºÏW‡$gZ³ÓËcq™b=“*Ñ¢Še$KvPßIs­IlS~¨ßÆ#Éþ^aÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü’Ñ€€öAÄ å >‹^Zutˆî¢ÚKÃÃq6í*¼0ʨ$ÙjV1EðaQi·ë ’±¦mÈcL@«j"ÿ}×RØÕ–ÃLV)Hø…={ò·I:/J#B \ÙXÉë d(F%ǘì½P©t9íÁ‰;r8×>“Û4Ðän”¨ìw(a1¶r¿õýü·Má~í^&µŽëŒ ’¥Ö —%Üw©2̈#„@ X Ü4»ÇJnÑf¾$‹oB²P ˆÈ j(K¼ì¿Ì¨©è´,­+²HA-+CrºV uaæàÌ*Õ Êr²Í‘ÌXva²éS0œ€F@Šƒ)»H4ô€ÿú’ÀA´ÿ€ŒñO¬ç+ººž)©œéwÐyWsQaU<¥ÒnjÞü°Šbý4¦±w©#ð굈a¥¸kímÚUU|¿جWaÌž©»rêZ˜ØŸÃ=ÛÃ<°æÿZÃû¾ÔÓý›éõh¥.±IâB¨ zÓ¼¨Ù‚<„Š‚’8Jì‚HÊ$CF\P‚,‚àCЃô'‘Š 5:D!!\à*rr¯¶’ 52@UF…†¡qåðÄ_eœ ©LSF"¼™¼aš-:K¦<„uN…©G" ÉP@*“-D 2ieûy^%,Kèr&ê7”ÏÔe«²¦€Ãçs‰-e…cÂÄX$ƒ‡#5ß'&š ž•MóË”?w÷{¿Ï,msv´ë‹]€Tæ¨wC™TFž0–ÑTbÅ‚‚ŘØ!Ê ce>Á„$*‡¢á@Lu…”ƒÑúRÁÈA[È!ò€#¢¡…ÃS7ìD:vµ&ê§nó-©5¹cY/¼±~LÊÓPK²Ù䞊;sß\˜…ÿú’À£øÿ€!!O¬ç ³,#©é¬ávõ:(ª¿eI|ñ£‚R«½%E$ÙgÔ1Ä46 º°”³µb†šÌµ#ŠêV79œ¿ÌU U½0åPìû©ø¤¾Y!Ǹ~7óç |¯cI•®çÞïÚAƒ®© Ñ%7þ…Œ5á@ª 6˜¼Hpé…Ã0P*p+ó œÊZü®ËA L#Òí6Ã]"~71y´E ÁéÝVh ÎM›*™Žõ`â54AÚÍŦ»B0GŽ‹Æ4»¼ÃL¶|ÿú’Àfüÿá#KMg ³Ÿ¥é©Ìå²v³àÉ)IŒ,\5Ö”Fdgê¥ -VäÀ­‚,xƒ²Ólõ» …Óbº›A“¦³4vÙÔÊç·Ò¢K„ñXG YƒKn ›`ƒZót|å/t2š,ôº ê¥* "_øX¯ƒ³œVz¢ÊË-}Þ X1Ô»”1+~¦Ûœ^{-RLC”•©¦çqFÝ3_®  Gvéjꔽ à™6d ì§Èð ÅÂÓ-_‚Êuv3¾äjÏ^ˆÂcÄ!¾Õ)Û‹£¤Š8Iqè^+ðÝ ])È"'v•Èm…¯yâ’×H¶ÔEgfe®`cåKÐ'”4ûÀÈæÓÆ§¶îæËØŠ«2qÓ–ÉP fr‘*H_Ö²¿Ò~J ŠW°[Ñõ( Ã’Ñé ˆkí}¢Äå4ªíô {UÝÂí¸fpؼ¾]-¿²ÙçïÝ•GïÞ$ „L±Üzp¢’$„“²±#1¡p 0Xl ™’±Ñ¡Ùw–ø¸Y|ßOÇŒ¸k¾…ÿú’ÀOé‘#UMç »L¤©©Ìá¶ÆÅp‡€¨eùærP2’§s¤‚AÁ©‚¼¬-Úh"3cÃUó?§¢f„70Å¡¦ã"¹V ‹Â¥í+K/Fâ%ô'@°³‡ œÄTwHH0E!”áìyÒ¶F‡.0â¹ÍܼýMi"¤ IÔC/{h¤d!×ߔTZ0í@JnbÙh)H*S;7Vì®UÙµ-Âݤvœ³SßŸàžª´‚S’0¦åº{€æ Bcbg‚¨‚t˜ˆ‡¡¹£•£Ì…¸±†~ñ[ÌvF§Pµ´˜Ý¨Ï¬® ‡$ï:ó!È8[¥36äµÊD÷=ýu¢‹¨€I@v“:ÓhÙ *Õe.m"àÆŽ@]ªYtü¢ ¤æ4e ¾ÒæÖˆ±¦2íª›ðÑŒ˜<%Zö.rM±ä!“Ž´J0y OPñ έ%ÚHâá(ª“.P0õºË¤q&! :-^C¾þNÊ™V}·”Un4Ÿn¯*g=ÜiäÈ3%í %8âšS¸¯‚å Ÿ ‡%'ºŒ¤éz#f¾ˆ‹Á«VRB¤ —0 —Ëà1¥‹`¬8¿ÈÞXœº!ö’ì¶²$1&ÿÅcØCJObžC™S302Ô¶ŽšxJ¤Iˆ}·¯ÝP»ißW¾—¶7U®Ã”î´¥b l´Ys¹ ¯qrÒGâÁ纚J…ügIè¥Ò’ç¸Ôïío¥”@ßW:8,˜¶èã6-(Û}ÊœÞ3tÔµ­œN²éTÜqÃAèÿú’À›Ìʽ!Q­ë+²î£ê)ÍavHž F'9+Å@( ` ¬Û™&Œu/êÅr«òeyas+tÄ(®Y£šž1iÓ¦‚›tŠéÃ+ª°cªï§ð4å³›-KTÁWý°X]éSδSL~ ¢òÛˆ²"U&;rc5!4æ#APÌfUÝ@I8ŸH…>uÙ2äVi¯NÈ M~_¨uÂgÃ_ýµ~´û Ô,Ó_ÝHº/X­ú«M±æ;³KÝ~_èû~Õÿ-JrHæDleú\¦˜â{æð!r(J²» 1K[p5Ì —•³†¿ Ù;¿#ìÌ„î&Ÿ›u³–Á¥aª8 øžƒÞShh+äŒJÊ9ß±~U4ª„hR¨»Md9že´²§ët’­Ö½%šæs*Ôº”Ü*.¨é"u ×V„R_ƒŒÈJTôÑßÝüŸ5¨ëó:±»Vè²VF¯E®o9œÃŸ¿‘uRIo\U‘¢ ’S– Zx¼¼p‘ƒ€.EK,ã BøyÿúÀxºÊ€…#ONk ²î¥*)Ìá¶GY‰Æ4]eù’3(•̹-€'ÊMÒ¾Út3JÉ3%5rÍÆ””„Êã=”¼5Õ•Éè\¨h)©¨\öw)Pð °Üj~&ÿ8ü"',ÆžJù¼ð—®eú² 0“i|²¬¹7C™^Ò¯x þ4P¾ŽBY%ë/ðÎ Vš’™—z3AŽ]˜­fš ǵz™‘<ØþêýhÍZžÁ+ò2" "RRÆ Ž/0PRx„`PiÈÆ fÝˈ¢leo™x"D.1-ηI”:çî].VÒÎRî¯cê<0þ3ž2êòpÞ9¹ežœý43k( @ÛÙëÝÕµR+Öé©®3 ïÈ·g[Îu÷³ˆÌqɱ™–T›°-e·-/¯µ°Q„ˆÊ˜ÕnP§‰…-ŠÃ´’ù©}|3Ýʱ«9aŸÚ†;Îå­~µ–ÿµP‹È± "S“’0¦u", ²8ªxF °„$ µîGc£€Û¹…^(]îÅwÐV¥ºôw]Óÿú’ÀÔÓ€ O®k ²Ì$ê5Ía¶AQ]µI•h  “k¯7x`îd”ÓY~A¿zË\Á» IùÆ~¢Js:±Ê¿Ë¥ ™î±bìÌl`ä͜ԣ[ >×ö;S„‘[« ¡€E]#§Ç yHîo.kUÛ­|÷®öI‡ñýN~±çãNr´£uª¢ ’R‘ ËAÁu‚ÙðÈ Á Ãm]@hLy—#¦db‡5x¦{bÁÒ&ÛË/¡š9DìbˆÌ¦Iˆ~WÌ©Ôl ôO éb(ÌkÇnže¿“Ž)r·ç›Ä“7éuKJú;ü¹…¥Y”•-g4yš¶(5a÷.õ¡Ù$¢0[óq©{Ìþœó[¢±fz>ÓræµÝAæ<ÿ ûlsJÐÄþ‘I›± 1¡ kp  S¸‘€ñ4kðÄùˆdBáˆyhªtˆö?†vÜWùÛšx‚ðV5©× ”óhüg8¤0!lh5÷â‰5 8 lkÝÍ'X*õkð q-UÇš2t¿Ú¤ÿú’Àûãa'Q®k ²œ¡iµÍev”Ãâ“#$ržUVj Í÷ë¸ô g–»«IêU3xŸÒZäËSî<üsÎ÷ë÷º ÿÿ½ý÷Ÿõ½_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"@–$©cXN4êRK Z# ‰Ó’“$¡‰©ç8YpŒíIcb¡"r!Yër( aá”.j°f †+Nj.¶RÊfŠG-¦n(¬"†UzŽ©P¼®cÿ—Ti³¾îKý-|W(1®6ö?ðó¸j~bSl1™‘!·RX¯?¯vz‚m ¢ÙlZ¬·K¢“ùË+J,_æîW¹¯Ï-Pl[Œ­Z´D¨ ¤DH£IOËøºƒi‡)–€I#ícÚ·p“Qc£4LïptÑíÙ¯j>˜£Íto,D;‹G)åML>ÃñE¹œ?R§É@r÷¯^fJ×ùÖ¹M&K¨´ÄdpxqzÈÞæ_ÿú’ÀÃwÿÝ)M®k ²«¡)uÝiv.D™g.¤Ü"®D–%†UiX¿/—@Ðõ-úM~9ÒŒ$m¢ J—_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖ€%I)Ö€2 àx `PIÇIµ‡&Òó€ÌŠBµ úú$¬8Éeì3¸ИîjëÄõ¶3.»³iEÔf¼¶’"Ø•”öRÎv««L:ÃúÏ;“ÂtpRŠaÉT¾fÒ¶-ÛSôñxì­L»ý7/¼cƒG§Î’û½ff–5õ#’*øa¬s‘*lú¥Ê[‘¤­ <(²© ˜µ¥Ö014ñÊ  8Ž,ÖÞC,´]ÍcÒư³[v£‹(„\)©ª@s¦eaÃëCq‹é!v½œ²ÿ@B „±aÈ›Í ÉÀʉ”FàéùlÒ”‹~jMSém ‡}e´R©îˆ[ÿú’ÀNîÿ€$íG®g+rf¨õÌånò—¶VÙeÄ!R!›Æ#–ðÀ(?^’ÍÚ•®ÒÿþmÙηËYã„£2ï“<”Ú]šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝ$’À%)k@ÑÉ!=Î #§˜¸FEo,¼@)¨4§lt‘2dqÖ¯T› ÝŠIùÊEÈV·.zІª¤‚r"ô(¸ŸÂÿ™Û5€@‘‘#†kËâL@µ¨t ÛƒI@5 qœWÒÔJ|¸iFñÐÍC²ÄÇ𣥥|–3VÝ®ñªÑSÙžÂS<ßÏç3§½ù—ÔD—€J$‚\­<a`¬ùþŒãÌCnÚ,—AÌ@I†|ËjZ’b4k÷n› úDL»å»…·Cý̾ÜÉ^ñË'$?Ãå$žf[(ˆË©måï™<5 y›ÍØmjÕ7;n–¥ã NÁÖa+!&^Îÿú’À(Ýÿ€hïG®gKr}èõ¼ånÈäz+Z¦V2Æ;O¼jýÔ[;ÿÿó­@iÅ}ý?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòD¢ÝÚ0À®š‡§Ð€·'D´– ñ£!°\DäÔŠÞu'Œ©;jýÓ8'r¿žrÀ¡D‘HˆM4¾Ôd(RG,IÚY+HŒEü4±ã-Ív¹%4Õ#¬)c8 ‚+{^¶­•)¢×©×‘AKf&WX§©^zq9(ÃvkÌHµ9Ê|)°³¯þvÛ]"C­hŒZ)¤®Ñ …ë½ìIä™A`!Q£÷¡Y(ð$M$DþØs÷57¢AŸ˜ÕⲘ½E)JMmŸÙ–‚£„Eq¸œüË… ³3D0å6~"mQ ³±K´÷†@ì;r¶Ž#iHÀA–O/æ²eñ'‹¨ÿú’À¦ßÿ€ŒíG­ç rZ©õ¼enä|±Èkmnëò• 3w*ñè&4òRw±lR-éˆç`+´´ØÝÎåÀ¸áà5„Ï…í]_¢ŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÀ%”š&]L ¥˜)h€p\ˆQ xðhT ˆx”ý,ù¼5.ƒ€P“(Côy}¸2˜Iƒdnl1´ÜpBä-s¬[Vrän^Ò—ÈÎOªÓŒŠhHP®"i)²†ÄàN.·¹€õÔ4O.õ€°orªŒ !YTÁ°1ib Y/U¯ó±)Xw9ƒÕ‹8ðÛ³Æw(„7Œ¾^í1 ‰7¢µœ®½L~ʤ,ô5¹5Á ”‚æ jæ‹``À³Eƒ "#"¶ˆ@fï†ih¤†Øú&ñ0ÀÀp CÔâJàœU\0X!p«ËyçŒx!Ý›¤™‡æ‹VM·†xüIÊAXj­ûÔû—äÐ+肨h‡ýÿú’À•ÿ€0íM­ã rÅ鵬åo:ʧ´DŸ2`ÀBlŽFE™‘f4‰©n$p  þP8x`9ŸŠ€˜Ð& lÀL_$ÇiIY!„O‚¡½S¸ÆjÓQÐMËæ'91Rþ© ¸Ýê ,ê_Ý{ÿ…=ì ‘.ÿèXC™À1 .6ñËð²Ìˆ`±€ê8¢±í~$d–˜gâ–(/1bÂâ–­L †" 8PtH”9E *j ´ë-ž Oàªb禼¥Ûg²Èd½î4kí×VUT“u…LÖä"&1p+>9“ž%˜HXT¼Bdd‰A0h!ˆàô‘„·K¢ôªÿú’Àoÿ€±!MNoK³á¤iéÌé²a¢õÂD(µ.Ëj pŸ A‘B¡Pa“H•ð”lb0èÒÚR²±é•Æ÷-a¬"ö‹:‘¦«CZ¿áœÏpµgG»|¾Å›ðIF`<À(ÎAÀdÝçŒYu–Æ"¦b‚i¼I‰´ò —ԸɄ°­cÙ¡ynÔ"qMHvÆYCUî 12ÙHöù±)ª× 4MÁ 7‘`\öÝw Ù1#Ò­RI^ê&CMA^§“„Ý€T+™r”qÅmDóNPž•kŽŠ>Påè×V¨ˆo1zX*Ün,†@ÎË"`ʘ˜ ˜î2–aIzkT1VÊà·nM-YCuED ú\Èÿú’À%FÞ¥9SMç »¾)j¼á·³`e‹¬to– xnPûÃí!ШÊé!÷ﱉe¾òÕ}ažwz­÷€¿UXJ1ˆ™pŸ °i¡ˆ¹™òšÊI¤–HÄ (4(z8a€TñPJx“:€ÂG†F„‚0:¦ÚeaÀDcžÔ‡&d4µjb ~í˜ÍpZcXŽ™(µ("fF“*Z«y®Úkj‘…–ÅAU?í•ÇU”ˆ$*Š3Åîø°A#3ôtK’PE,A†ÊÒxTlEÐ£Ž«†¨ZƳW^4•`šD^ISÅ/©–W磨+z†ŒØÚSBvU‰ÔYÈà»Óši¯ËMrœVùœL·gzG'•J¯a^Î|Ê›Ÿné,ŠÊ«Rj°ØÈ‰¬9‹E[1™2‚dq¨nºŒ0à”ˆ\,% ˜ð©4%8,,a ­êúŒ©Ê+'r‡ †ÔíàU`Hƒ^X° œ@ ¸hªý¦9*š(9! „ÔŒ‚¼¹ÿú’ÀÄé±mGQMë »×%jiÍa¶/ÊûN‰±åRH%À_@L‹Z­IgŽ&¤œ\‰ª€TÑèDb]ë Y:tAUdF ñWJ©,:£-QPCÅ&Ó[A>Åæni"˜‚E²èÓåSr(z\‡©©)ÚìÔ¶ÄHZîê¦q_Yés4ÔÌŸf쬹W­SH¼DxÖö–(” ± €Þ¾‰¤¢bìeâ³7.#jmÝ'YMÀüm[dÞŽ5¡ ‰­vã*ƒk „4I•²–i"zÂÆû¤Ê! 7qKÓ2†‚¬MùPðศŸb´ë?nkMÜHEE¤ap,gî6º¨i¶ÆÝlWfoê¹BJ¥lžì; 鹫SzĽ*^Tx¡MT÷YLØÐæ2•× ?¯Åi ô/:“³VŒØ¹)¥«=y¥Tòš;]­YÛ¶6ÈþR@)6Iè}ÒZ\}#É“ €³¢22bÿ¡§ª*ŽY¨×8ÝÁ¹,UÌÅÐÚ K†/¥ÉºŽñ%ÿú’Àéi€E#OMë ªÿ¤éõ½a´40G n\ì¿ñ©`0;³È ýr•#qPä>bm5>aõÐ_µ|°ìŠ©ÓƒÎÛwd€`£/ùD¦¹Uw"DІ£•§ꇮ};¤ª2•¡Rbn6ôµfJi­ávÍ%>:ø. ‰5üòûv©2žµ_¬^rþ:ïlЧ’„ Iq¤¤³Ðð®ˆêÍ~E€D¢ó ÆA@yW¯ÄÖ“%‰‰)\Q}¿Ë¹„ ¥#À×”¾Lf@^4²S˜ôWÉš Œ7Ð,îGHÌŸÖ$ªËRÒXxa¡SDbƒhòù[ÿ(goSúÖž˜î4ñ'Ä¡2I(œ³b¯ýf±¡œW(ÔNDÛ¶²JIÌ(*ËQƒ+s<Ë•µ‡ÿlc\©Ï»Ëîãßï&/€Bh¿þµU‘YÒ•~À é(C Lpã @Íj.…)Èž­¢´:ºîR׆“ÔT»¦*Ímµòã2Æñµ,Ú* RþiH,­hwx!U`º8³D3m¹<ÑÆš÷/RâŠFÒÿú’Àij†QS®o ¢ã¤*%¼ávÞÊkÃ*E–új«&Wª-~`÷Wvn0˜í;›IiôZ®KI§†¤m9aoí¨Äyú]Wá˜Å‰\µ)Yn^¯Ê×ç/|η˞¤äåíZ«.‘Ë­v·ÒOçÝU6ßýwˆ0€I¤Ü—>´Zºº~DXí0nœIÕ ˆB¼NÙˆHäD›°• »Œ0²—ª?Ç}$Ø:U¹eÇ€$Ó` °óË.·4Øqî:PFv¶5»=Ÿ,R¼ùv2¹%ìËwu$ö©«àÿ)–Òjíü© )tg´Û¯-%üï7ÿú’ÀL·©©S®kK²Ð¥i©¬á²OaøW½lO=­~7k¨œõîs˜vvcº×VðmnmBlRj2\»á—½ÖCRÜ>æ!hæœvK¦›%ÄM%«ÛôØ/YóéFÃ2öjµG™0Ê jL Õ_ÏðYgó»AÌ{lìÐÙœ¬0 ‘ ¶OIfõAÔH•z©7‹W¦°[õŽ2è›ÐP›C›åŒ^ÇŒ WÊ’´&yÜp˜´å4B¢gD°ùS¾®³ÐÒ†_!Îg’„Ë—DlaŽm¹ Û³ÝMS¿é‘×,ëæžêßë I÷p‰q}I ÝžygX TÑRû£;èNðQPÉ&]·N`N¾}Eú2ß…©aÐù6'±-šÐŒˆ!0u"˜@!´˜,¥’.@OªÉNpTH£ï |Yš®NBáq¼©H.«g0¦Á¸+ꤒ)šµã¬@œîT±h-,qšïs3.z$Êäú¦n¢éÃW.TgäÖÇ:¼äÓ£óÜšµm¦57r’þÕeP 5ÿú’À@$µ€+Q®g-’ë%)e­a¶OÃêå»Ëzï/½CÅl©Ð©þ –‚hêdˆØa¦¹€„³w¹8 ¼ ÜÊNl,RUN¡FÇÆ &˜Ôè‰T0°æ¿¦r£[ ]9gs'¥ ǽեM)LB#à%ƒH"ðÅh|Qy ½í¡ŒÔ$$ÙC©¬µX$}Õ–šC¬ØÖâ¯ìN}ë{'jJ¦ìA²/Ö2ŠvňoÝ«Kº’°C©=KKZÛ{,Ø—g„óã;빉sìÚ·¸*M¸Ý‹Š; ¦túz3Ô¯¡¡"pÒ]õ°ü*XüEZšdžv%-¡@2ù͹ÌáÈ@…îŶ I…âÿÛŠðN’rÆ\ˆ2±§r+´T«8£B<*XÈ™BõòZÓôø!¤3†ÎÂä²4 iH¢éF[äHM±B Ô0•Èv_Ä}âii®)1AZôaëŽ$X0A¥š+áé\X¥BЇwÝ—…ÿRÁÀi¼€ÉÙ¡>`qsB)ãq¤<]ñ rþ¬‡­·~Ü9‚ † Ø5ÿxßu@…IH¬†]BÁYDÓÛA΄٩ÏËU)¿¼Þ8Ýæ¹{žUô´d‘N"[Ñ ¹Rj ®,H"«Cÿú’À0µÈÄëMNg s £©)¬év¼•€‚AÈ™Á l! ²Zb€Ø*P"Ã%^@[@&LlP*’„H «9Òs1H´‚ ö`šxBNÍ”Ømv¼ï3ú , I@ r×úF^Êëî¶ìC†ð:\vl°Ââ„‚jÝ€]‡:}Ò•Vû»ÍˆÝí§—Áß›²Œ3×°”ÁíÁ'ÉŒE]¦= oÕiTpìÂn¿OȨ!§/$MÀaÎýöPÖrjnz¶ouîßå|©¨y—ï«cí¡²¿tPˆi£±€[ˆ ¼ff〆L й$…È?¡äZlî À¥Ñ0 BGãzÏâTÄ #‰Ö ™¢oZIR‰Zƒª¢¾%(ï8[_CåiˆH+×!a}X•zí-‹X‘Ï08²²š8tÖa‹ÿú’À Óò¬ùK­ëKºÉ¡iµ¬évRø13÷Ä—tå–äâÕ”3†fò¯ƒFtß0$·nïàÈ(u!1K4µ 4é«ÍÕÆ¼fÝ œrÿ­†êC_"FÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþE¸’·Fo“6<()˜ÄC&q|,¢Ô-Â±Š¡a׆¥ix@¡„B‘È™šÀ#šíe¡Ä:ñeg%¥¼·0 ‰o–j@VecßyýDäo%ÅÐà†ë-,8u-¾»ÓÅg7>ËXï¶VBí=i´[NÔË@{¦ŸäĤ¶k“í59âÏsìûE^VùSY”J!øbWHŤxÒÙ×å_Ïïrá„I‰¤¥Ñ€<½,%䡌08¤Œ bÌ -!¶gl9XÛÊ Æm@‰¡ùáû¥ÛT 32Ecùhêºï‘DL9¨°¼“­„¹*.äI㹕‰“P²bO~`¬TyˆÑÀ ¥^ËV›!n>.ùÿú’ÀB?ÿ€ØùK­ç+º±©µœánI!Åç%.r>COÒÖÕ‘Äd´ŒqWTä´˜S.ÙÛ;¤C7¢tÓÔö±ûWÌ%,ÂKæ ÿ«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀWöÔš0aLSp{;‰RnF Í…¨ØË·ó U ¹Z}0Z‘`|™ìuFA\ÏͯW((·C„· h‹}’Ý”‡’a¸ƒP¨ú³ùæÎŸÃs§Š2‚€_Jâú£97@Ï—”¤€”„+,\ö´–‚ÐÃO$XXV2„e‚@Ä:¡`”Ý–qçUf¥a浦5¸CIzg#i–Ct’é_g;^µ'‹ïßrïrFðý&Œód,èÇË”…@<EFa‘djP¨(ÈvühH"J±DôO–Ä)E…ÈHt‘“AX¯S-˜!”«)_¿T×éy ÌÓS•Z rg‹ÞÕ›*ˆEVu*³§ÒB³šd2ØÚTqëAûÿú’ÀÁ|ÿ€øíM­g zËž)©œåw¡O£;p40äÊ@å»à ,øHDóÞÚx¼2Á 4)“4¥ö×$YÞÎ[vÕ«É\fݪÔ)DŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ€ R4•Ú0 ì®l××)ÔîG—qP‚ŠÃ€Î–$éZ„ÂC€.¨sÁÙôöT/ÝÇt7&Šð°ó–¼`ST¾ÕZx¬Ì;¥P{(Uº–<‡!ìâÇ¥_t€)ÒúγèCHU ´Xìÿ"Œz/k ÌßÅf¯¤ÒQ6]u¢Rêvˆý×±.¯Ï¶ëÊëV¦”Då7êVî[ÎÍk?JgWRˆ n$¦Ñ /!€H¦`A^Ädä€&¤bÏqчVrˆx££áØãŸ(!æ‚P–)3ßçÔ©è•¥A5I—)|(SÂC‚6 ~!'yZØBcѨE<ôAª±HRЍ€‡†ã*_lμòèÿú’À¸&ÿ€¬íKMg z•)õŒáv3%­¹P,ó$@c÷F)§:Ÿ’éUÈ´¶ž’S=©7VÜv¤‹:l»ÍV¯·?(•œyMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂY&]` ´¿X$X4LcÊf._2g†,ÀÀƒM¡C„ª¬ N0"ì;.€\@šmðkæÒðJ, ”½!˜dh"žPÖ­:Š©0q…kl ¬:-îåðu3è©DÌüË3R„pqY1yfdV¨1jZ’'’”7ía;™,¾¥ëÓ+ྙȤ„1JƒðÕ.y˜Ô×gõ•jûÏwsÇêï¿ö>¿q×,ÌÀD¥Œº8À 4Ž‹#Mx0³d i &+QâT/hn¥£ $cîX Ò *Zƒ œHn׃®Í ™ñT`˜T~ ™ˆ® S®mZh%ÏŒ.¶©0š—éñ§·žõž †$¼ryÚä,s;N<ÿúÀšýÿ€<ïO¬ç rà#©é¼áw@AF޼a™ANÔ"ˆÁä’Ánóné3“tJKî7®Ër­¥°®Ò9N/+×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû ’Q)ÍcdK #¼ø7: É%W¨J2=8DÔ~]¶YgË(ŽÓÉ•@²¥: Ay§S9 $ZSÀ¢-ùêgE¦p½ÎŒ½}â!W°X 6I[CÒ ôëf'uäæ:È}­C.9¸ÃJ Œ8²†°üU,˜«9™zhEªDíC/ʺg(Қࢠ=UA{²VÙrœf­Ê³—ÐÒNYËÆ§Ç–}¹Hß|§/ýýêŒ)’eÑ ZFÈ×€ И 8Q¨–xa”å.²Š IKœ÷ÀEÓ¾£±pšJ'‹ôº“µH÷X±¤ë¿–8qiºE g‰ó©n­€`J¡ŠA:P°+QþnMã öDĵkÀÀ—1]ÇØªÂÎÿú’ÀˆWÿ€°ïKMc+zõj5¬ew)ÀQkY‚D˜z–S ³ôÜ«F“ROi#øæ¿ ª[dÑ'ém²ÓZ*¥n£ù†Š~*ÝŠ 58h²9¬, hÜóO_ª#!$ •(>U×IŒD¶ÖC9ŽcÉ Y–š˜=Púb¨T@pA!Eˆ^ËfÔ*á–"œø*á¢ÿú’ÀžÀÿ€uQ¬ã+ºýéõ¼en£_lÕ Úm0¥®#[HO1©•`…1§Ò¨ˆ–„ï¯[*ýÃiqiäôUƒAó²`—b–K ºiAUX„¹Ä”ÍѤ0€ *g¡ÌHät,<µrš*dzoÉ`A„Ȏ‹dÊ_¹XZDÊ2ê†3äØ,ëÏí ¸K›€²C”ÿú’Ài˜ÿ€•O­ë+³Z¢iiÌáwŒˆÎ4c3–²à²7•a˜R×pÁ2ÝVæû@´ )#ê×k zñ0e+ðRD(Dp.qp’¹uÂti`ÁWU¹¢qoiÁ¢!Ò”µÆ%.¦¿J£6ie¶pǼζ6)g·1»ÿfí-ê^| ± ‚iS*HXs^{æ%ˈ¡æ)fLP–††«á äË-Z>¹,xpÑ K×hº9©f†„D-g¤.Ô@™Qò&JÁš´NA¶ pqXšÌ8¥‘Vz—ïÔÄßeŒ €f9²±$1Fq-YfÁ?®œ #v‘%–ñÕ¬Ô!«Ë hë¨ÐŸ †9i©ïVTË”Xmv7?ÝÍO[$… ”&(#“Fêô¶Ÿ€ïô2&{D@BÆðÀsMq€jÅ`a¦P 4h†™f5XâA@LLÍ”-ëL¢c‰níDXeJÕµªˆ‰µò ,uæG ‹4¥ãðzú0ÀBqk/VH¡ðx³]BÓÿú’Àå.ó !OMc ²ä©iœán¶I€Ô””ûOXHÚÔqV_‰¼ÀÑ …I2RèIÂÐrÿ1Т  Ù–Ü.ÕƒS£3eíÕDн®§»7‘ :ì5/à ·°Qׂ´°‰ æÏXr[œ¶/¬ÿW0×w†ëï\ÿÿæûý» %Í_v…ƒ[MìsZàdå(<ª|›/Y«¡¡`ZQ„9lF&Å .¢»m™øq`Ñ<,`p á^7 #‡‚Ò-á|ÌB¢ñ Ix³dnG†”]¥8`™…ìR¦0ÐvÅq§+KFDkCnž¨JYÉ^â7()¯$ÚÃ2ć¤Mâý:%ëeHK‰r¶P‘(m:â'2„ÄS}Cd©ÖÍ]—CîS‰®Ó:B,"€ƒ‰ "îÏŠ‘Tæ­0@9V41ê$àìqB8€` äÆN˜â3*ñæÒeÐDAθ\7î0‚C×Y´LÚt%9Aâ„Äe (áæÈÝ ðÿú’À'M÷€!EMë “&éi¬ánÒKÖÆY¸Z‘ù ¤ÎàhPµÆQU®H¼lª£`\! ¤Jhô¿–[$*W“+0@`È¡„¡°w N”T(rOÂö6t¼z>‘Å/úš¡ ¼—­N2Œ‰šªÖÛ§‡¨93ýá÷:!¥#„ËC‰ku”¤$ïþ…:B$j.¹À&Ÿ‘Ž™a’–P ”2Ò 0áYµ9ƒlM!€†AQ,Ù¥AÖ›ºªy£Vß¶îÂÅB ²Ç\eTs\µ‰’®ž Å¿ °\©Ö_öÌ34Øiª"‹4/;rbH¦\¡Í¯.‚}‡ !êࢠ½M«Òù@‡N+ #ù+X2ƒ eh‡8:SÀÖ—]X‚Ë™Äê‹a…CHCzìF)!Q{2(¼±ú…RÔ±*¦}wœ®­Û3ÕìÅëÉa`9Eýûç åUTœ•„§& ~FI ´ÉÖÂP)àÆ%ùPˆsK÷I©)$”S„ÈHLe ²4/CŠ®X~‘þKô*|ðNVÜh£Ž-t6èÇYPÒ‵­ymHr¶áå/†ß½ÃJ4¥Ð ™\Ì3mïm<‹ã¥Ë»¿ª·]WÍAz†0 ‚«v‹%” ˆ@D‚ÁÏ!äÅ”4Ðp `Æ rF[Àà ¹²"QaüëÂîÏ%Ò§€ …æU”Æ•øÐᆭ·ýæD1¡‘›KQìgÈ[ðˆu¿††©ATå L¨Å½:ʃP“à%ÉDŒÂ@¼`¬1†éº âhFNuÓ“0²’ü­.,+¦x4‘Jòøÿú’Àfµ€å5OMë ºÓ$iå½=·™ª€ÑZ‘_‡oW3j±"½Œ‚Ö7QÕñ¦…þ³|b H í !æ§P`r$ ¾²PÌáKËeHÝÍHôaÍf7 ËB“ĆĤVuâD6£¸² p«3B‡ÞAQìR,âËk½ Dhì»?9@ÀÂⱩMËùµ%ƒ<ñ©ªc'cZg®zóV%øÁ\ÉÆ‹%*š¬§*G!”$úÃAu£¬³0Ëw[©~ú¶‚0CØÅ£ÿ”Øì¢ÕÈ”Nšµ'w[†÷³ÖSV•¶ jáY[þµ¨'Ù0I‰$!‡E' 2‰¥Á0D @bDÒøh†úH/ %ä’¬Ò`Ï"2´×òhŠí\2¡•µ³ªfÞ…„– «8 y£WËÌÆÈùQ&‚úk‚66°Š T•e6u3 ¹•:i¨á&‹º¿Þµº©ÆÚ*â·P1#GmQÄZfqèД9å†$*VÚ:ï;ºñ°YMŠøLvw¼Ïv>—yåžÿú’À4®µ!#M-k ²ù¤j%Ía¶ù[–wù~Ϻ»êý#ñ¬’œ†ê†É¾ªA¨L䤹€•P8 ­‚h§BI/%Ô‰ÂÔ³NUmoP$\e–<þ½4F↘‚*AÏØZ0Kð(<¾ge³‘@ç(ŠÖoÈ%Ψ${k –Ä ( ÇѺŽeóŠ»hILWf16¼cø“*èñ/¢%Ýg~+xˆˆ;4΂Í}Ô»VÖ^Ó[¢˜«q  e²Éª³òÊÝîVïó)ß­3å(¡7>Nÿ ö8P§#@@~Ö€¬ù ÈÉ(ˆâ Úó93-H€ÍHlç)*_s:'GÓµN/cÔË ±"ÊnÏ»,d t} å*S¢¡ã”µN$wè¥ÌÍ ‡çjZ‰C‚€²”Á, ¶j©>4²7Ö^Æùü*ÍôÎ%“°0éâƒl:ŽrëÒ* ójô¯¦`DN}iT™¿ch2çÀ¸F¦+Béÿ›Õëyþª·|-aøÔª·œQ>ÿú’ÀÉ"¾€I QNoKºö"é)Íiv«Ï¯‰HS‘  ’'ÒXp[SŠNîf0è¸aÀdú¿f:£²­ÛÊG‘å†w/¼e šyF.Ò¦35QÆ=R®¥S+ÑáŒæ™ò!kkTÞüØœ&jCZS79T&iÀôµa‚FŠyáÊ·çaâ°Ùã´±R&|ÊkÈ(à&|=4*šî3¦|…?»£x‡^õ)îØ”ÛŸ­¼uª”š×ã­Òãß×ç¾cÝØÿ²æ©º¤(€D”ähh f¥â̼…Üã1k+JjÌ,‰Ü…²µîÞc È›Þ×(]ì-OhíÑÃ2“d!,ÝYÚ÷c+l¡A”gßÓÌ哱gr0 vëZ³-´‡Ê¶kÄ€¨( ‰Ùëß«ËÉé!ýÖ&b/=Z´ÑD’‰çs›†Ø»”îEå/b%È;A^Åk_Ígú—ÿåÿªÖñÿï×.?V_p¢‚R‘ ƒÑbQ˜™tm,)e!X8ž4Çcÿú’ÀË¿Äé'M®k-²±¢éµÝevMöî\¬œ{[äݨ(i8×嘹’’xK,eb-(™á‡%”s)r<3WëÃø²›ó»fB›ÉAj›-Ò²lË.^ïñçv%0 3~«')Lý üDÙŠ PXž|> -"«*‡˜qRI] Â¥5hg3×þ¥›Þ:ßÌ[å–;;¿ýߺÕõ%ÜàÐá’”½4 6ì1Ç‚¢Ä†’eËå5ZÃ~àe.œ³JU0”ú×·/K`qr¨)Þ¯f *¢ÿú’ÀcÉÿ€M M­ë ºâ¡)u½ev€DűÈÙr†žÍZ“]ŸÛþ«"‘mi]!iÚhf[ažÃ5ùs»»\sZq¦f9ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐ N4Ax)ÂSÁ©`Thª™ã‰Ì†ÅÈ.xŸóh0$KÎÉ) tã*ÑŠHh \þt³%ÐeU‡áÒi®QC&|m¶}en¡Æ>:›Ÿx™bŒ\~+å•”¥_œA˜0È^aÂ$›±iôy!òÌÖC‹#ˆ<òÊîÓý”¿–eѾH>áË ÙÚ9úÏöæXÉïë›ßs×óû–ìrÁc¡ØÝÑŒ€’œ­, (Y ‘c ~B§  WD¥ÓTcBûÅïUÐ3¤Xå ªQjvœp¹ g"€×1zÍGQe _êiÂÀÉDLÓôÇ«ÁaT² ÚXWA•·Ëü…!åÜ™¹¸ã¼š*ÈïȰ_l†Xÿú’À¨ÿ€¤íM­c+r·!¨i¬év £¬—uå”\â`Ú2†¤"¢Â,º$¤’ÇZZëò£½u¬ÏÇ`l9œ–élŒù\aö¯UíŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÁ"ZJ]À`g  ©ôa%g$TÉÒlº¥ä- XXòÓ ž3*1À5Ù“^Æw\ó©%ª·Yü‰¢ 2KbŠ8ïÌÅéšõ²Æä2õ¹xÀðþv»?nöwfxý·RŽ®Ì€Q%eÑ€Û‚…%Åà@Y¤L¤•˜˜Zg§Qèà5 ,l´ ‚J€Vù0‡ñ¦Eœ¡ Á¤ ¨L!`Â!˜1<ƒ"χ›)²|-ÊSDÓXÑF˜ʵՓBÕTHŠgÙ™&Âb›B_õ ÿú’ÀÎÅÿ€åG­ã+z¹)µ¼ávN¤T êU·‰E` Xß~á• Ì”.}“K¤òÌ~-E^H¼1Zi™»k1ÕvdN%N] ×mTüZÞ:ÿֳ˜üµÎóíeÿÿÿI$¹«@ÖÊ3ªð Q¼ àr_ôû5ÆŠÈ;ÙÊ7‰Ê Ã=[Nj,”H@dðäÿ‘ §`A`Œ(y˜EGLHd>!™|n Nð Ô½ìAîOÂd”çn,0ôZ{£iB!Õ,£~š:fŠ) \4SAf©wÚÛ?Kf­WàzUþ¿ÁŒT-|„/ãü«[èÎÄÁY\œ·ê&(ŒÀ?”p¸n ª\gp<Œ‚1¢ àJn†È[0ÞÔ¤ÁDD求@4p@  N‚ €Ì %4Ü*™âdph€ <âEDÌë… ŒX ¼­ÜJ%fwF£rДd"Lc 0I-CÞ@yMÍqé‡Y™¥AuʪjÍp)ì¦ap°‘Љ¬0pá‚ÿú’À<.ÿ€ý!M­k ³+ž)µ­ávKD@ÆN*³– ÇÆL `„ÂÌ šƒŒ„üÓÊL|<ÂJHŒ¸º(03203à³B2âƒDB4§Žˆ, KM4<¸f $XA  8DT0ÑŒð)>À†F¸TI—ÐòF3BÖ'Bì‡`´-Â(2Çñ܆gŸIf™C‰«.«NýÍÃö©_v¾ýÒNöµOÏ;bhcZ@„%UVÜa%…@!Æ4Œaífõ*B 58ã@1¢C~¬0ÐD”2°‡¨½æ1± ÁPî ]kQPª˜° å0«²n¹ a)$½2" —>2Æx\&k€à”GŠ¡ ¸HØZ…B8:xºÍÀH†,¢oƹoA2”"›ÁSFŠAjZ Ÿ¦¢B¬Yn‘P£(¡‘×ËR—Ut°øc p¢!N”Çè&LYÓ-‚@‡‹˜Ö1­ƒ\PÀ×úÁ5µRÅzž,‰X®e4uÚ)¥„@-zŽ>Öÿú’ÀhSÿ€"é3ONgm´'j)½e·Qg¬W°ª’8»õ_U§·¼/غ}ÈוYTKV¨„/ጊXa‘… ¾€G…… 1Tº&DnüÆèh˜CÀŒ°•¤ƃØ(s:a†‚0^Õ é…’¡D±c‹aTCE^7ä=R;´ãAm/TŠA 4@Øâ+4ZžÁz£vZm8 H_.‡CÅXð·Y°ÄÜ'<Í͆µØ K@(]ˆ¾[ _Ö`•˜ó#ÂÑXÀÕ ‘<èµïÉmZM&Rmu„²¨•$ïÅ`™ÄW Hå$ 5!M`ÉDþ$PÃÈ ¥(&SG)—ÒÅ~!ÑP8’È悟xfEEeÓôÕ©,h®Âk`EDž"ÀV` S7p€"“EH“;¤ŸëÆ@ V54kž{i‹„‡Zkðð‰Þ(¦doB[•/Ú6"ÙZ3w +„IÔÒ1"]ªºS‚ò®ñàH#sl5-Ì$•aKyž™œ·ÜèL ј2µ²§f7ÿú’À@«¹!ESMë »A')å­a¶Hû´`¨Ã;Ì*}çYËX^1&Sv1a"GxõŠðЮ©De7lõ× 0!âÌDaï”°¾~ݸԦ]*íx–vQS+Që9~ïÎp㺃¥EDSvÙjª¢‹¤’ Ä¥õ#cŽçKÌ÷[ Òù?¿µêÑ|ÄFÂõ6u¤Ùg«ØŽÛŒ5ýôiZì‹ö%øoR²]­„!eéTl.‰¤©@çèp@†üj¢>7íè„1N§Í~Ž šµ‘0= ÀcFf iíˆÇuЋÅY˜1E?œL¥  Jº‰4écˆ "¢”¸5i¤ŠJ˜ryí¬FÍ`Óÿú’ÀO¸›€¡M-o+ºÐ$*%av…CíÙU`X}(Ú‘+uèº8·¦F×Ùk…-ݶŠ5v¯5s;ÕnÏYßî¼3{eùåϫڹYˆ’I!TºÀ„…RkÅÕfÀà£Ä-C6‚¬1øJ‰°!Ù^Aï7ù¥ÆìaD݆@‚–P§k Bká*¹±¥T4”Äô^îÔ‹C·Uõ§pM Ž›–7y1nƒµf´Ý“JUeà›¼,fP4[LùåS²©–e/‹ÐÅL£2ëit™Òi$E×bo[UTä`Ò¡ìwr«»pyKû×mÿpçØ¦Ë_ùSrýU;*ÿ¢$J(–Wm@$0Qmo€A]EÏ´P»1’ÖˆÂ`ltÎÙÈ ’°SœaU¯EhĶà Bî %¦§¢v™`´ì®þy …±^ãq‚µÌîÌ\êgƒi XPxk …º(\·_QfDºáøýS.žKp*íÌC.¿Nû¼ŽÁHµ ͆”µ÷úC*—ºL4è¶rú2ùTX°ÿúÀ“¦¨€ùI­ï+’ô£é5½ás&ƒ,ܺ¶œ+{Ï󔨱{õaü¹ú³gòÇþÁ¨5ÌÙ÷³ÿ÷ºÛX®ú…Þ<QòÐ%˜`@ê€EÄ„n:;¯“>œjÜË ~—‘Í-µŠ ¬€˜pxT*e¸¾„cßkŽ…çž8ZMì'i¬¨r,gS,)E»-µª´)·¹ÈW‚Ò›¢ýJã…6ûÒC6ßÒE‘’šËüò²‹z¤Ü®–=!}˜¢ú"ΤmÙ{X›!eû‘U{!ïÃ-ÒÝç{õ¿óïþXþ9kíkÚ·T @Û@[iî΋¶Ø S¨‘Ä`¦Z4 *€XYû‘!Àodp4L²I)•ÒŒvËÛ¤^³ÖhO:òØ%:(˜c2*°ÈÓêv)54ÒŠ v:X*îx Yæð—%ª£‡©R@îȈš FYH"r grhÌÄn-ãw#p”†sbT8Ù‹?p¨³›Z$æW⑗ѯl(1ï$¸s¿¶óþrµ¬»—{Îëò»¡¤ ¥Öaÿú’Àt$³qMNk ’È$(©ÍarZ*ƒA™Ú;âp èkuA„Õp*†€¸åŸ/taÛwÈ@à¡<>òÀ™»§l"€lÆaflXQ»€Vp‡«GB¥Q'Slá‰A ™ç©œ”¦T q]4êP¦:î·‘©(©N<¨šÚ;/8}½vØÂ±…Ë]0uYªdÜ[êæq„2eŠr®$k.e.-¤ËÝ]¨´vµL®ÝËì~ñ†hûŸßß–ÿR‹û.£ç÷õÜ£2Smj H.€Õ†‹Àè'i¨"0jA*§e§£Hˆß“™jpœÌ€tV€^¨lY­ï–F`ãÀÔVn؆Ðwó­zV(k÷{&wmÁB)–<¥^‡Ÿç­)‚UâáTX½«ª¹£¢h™ïûdX)C)–¯â“—«*öÀã9rIˆ|žÆé`(‹I•{µ4¶]fìRzÆ<ÇPÆWñïçw–¨ë@Æ^îÁÜ3]¥V îögQ4ŠEXd82Iÿú’À”~É€#AMë-’ý#è©Íåsʉ\%1xÀp´6Í,¸É('(õ•1(R™ ¹ò{Ó.ù|?EP”YÆ¿Rì:†Gs9›÷Ó¿@±”ó$…;,4ƒŒ©K/¦¢#ôûæuîã—k~æ»Ý᪽­ ÛþÌÇÉõðñ‚¨]ý¸ÈX¡èÚs!2N‚€ïŽ! PZó”Þ“ž̺#Ñ`¸v" Yž7ñ—2¥p¨;œ]bã¤Õ¹uØa-ØÃÉ/”S¡‘Šâîÿú’Àe›â™!K¬ç+’飪u¬ewuÞœÞTÛlýìùk²ÝÅÚ[­Ñ·NÓdê+;±~2õ@˪·fLó©k ?Œag3V0Å—G¿n:Fœ¡¨(ìÉäI’%\'oL׌ÓÅóÎæsZÝ&z­ùÖßnZÆ¥^÷œÎ×i(öïYfLg† ’Kš4ì¼*;†‡ì¥œR³`Q‘€'¡@_®ôc 0‡—KÝÚVz)H°’·Êjq¬ù¦ÛroÂÆ¯H:´š~”É)Kœ­?J¶‰±M+ *„½´iþ‘@,嘂£y±6;2ˆûÒÖm³{ÓÉ>8 ‹ûòÀ%J¹y¥yÁУ¡6$T˜]³­QÉzÖ¬ËøóÆY+èîF\7MÖBÊͼQ½Yÿú’À%âú¨ÿELçK²ÊŸéuœáwlÊ»½KB߈)û¡ü-¿ÒyÙÙÆNÃç_•.å{z¹Io–xÝ­Ÿ9We†”6N¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ƒÔ¤h€2.p4”ëš,ñiÜ5 ]ud B ~ v*‰qf‘‰ÌÅ32IU+·–¬°£TzZPh #TíN´½Ù »‹Ó2¹3”½¢· è'’Ç(iÛ%\¯D`‘aãÒýÛ†³D)[ÙÊn^ˆ¿5*·*‘XÔ¶j6ÿÇ%ш­ ,š‡;ÕíEðµZQG…Ìsîÿ¾ë/äÎ=Öyë—õbÖ:XŒ•WØ•$H†<åB<¡DhXBAq‘|V1êhLAÍÓ€ w‡pÄÀAÐ¦Ì œ 8>^£SŒD„r"¥7£z–›')Äy‚ÁD]ƒŒ‡ê ÃE –MNç%€"Û#KçáÉgA§@Yÿú’ÀÈ?ÿ€áG¬c ²Î¤()œav̸ô’ø~_8ý\‘oáù=æÕº2»—-SîšÔš’;fîªÊeök÷: >í»¼×ms³÷pß7s=ó*<{y°wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþª bK‘ X Ð›×,ÒÜF3BHTVÊZ±mšB‰Ô©¤ÝÓ<`Har©’I ¦\¨þºÁTðôiš1µÎU^T¯oV¸Ï£ËÖ;”0݉f€êÕGÐWÄšÖlÍK›ê¹ƒ8Ú%³ e,N5Ö¾ív6À'šó³<øÓ¼Ó4•ŒË£7R_j’îåñL*ÞÕm]ÝŒû–|Õ&]±oµ{Ã?ÆÇl[ióš:«¹–„$HQÕý‘‚Ž6 (Uz!ªTpE•‘d(~Œ¸á •…¯Oã±ÐÁ¡÷R/§Vctð{%Hag«ò⛹³ssã‚êöŠÒi± ¦Sµæñ©K†@êÒ˯ >ÂÁKº†qèmSâybÿú’À2ªÿ€Ù!?Lg+²±"çéœávlvA%†\ŠJx6,Í*Ç£Ì)°F+91˜ ¢vÖÝøbQc™vjn­=7#ZƬÇ˹Ü2¯{,©?¸çr—jêßòøµ÷h–A)¥­Xý "(G#ʺ4¹—€aóp4Hr(p(Œûæ]aâ!“ÊaiŒ49GÅÁ–ѕȱ$, 4ãÚò?I¢e´òA£³i=X•" ma‰„égv¥—é[‹ž*F¢í(5絇ÿú’À Šÿ€U#?Lï ºÁ£géav b9.C&LK€6+uò.ë Ø.w53fbôîê?[¸Z©Goyã–wëï-a̲ü)sýs oxkì‹u*Ô˜)$S·XÁtåàC˜ŒÑÂßf°¨g…ƒ@˜ì®"‚`ùáiÐsöð9k,ÉÖ’eQ6ðÃ12PQ»•FÄk4aæ[ߤd& <É%nŽF |c•¦úb#GަšÜ¶cp I²H¹ƒAæ!‡$QÇö—'uŽA&+†ÖâB Æ_‡šZÖsL.0 (Á@z½#ÒÉÙÅy\Vm˜ƒuh ¬wò ôÂh–þQÓ@ Ù"Œ{aŒ0Ç>ç?Çù\ûÙŠ¸Ô¼Ÿ`ɵ&ID‚K’°# fˆ%h„ &bÖóCÕö0(1c9ƶ”Ä '‹–F2¸áÙ:*ª“Ñð@ˆ‘UFjk¢£­ÒÃï+‘UÃŒ\„ˆÁ‰Lü!HUÁ÷)>);í!™µk¹ÿú’ÀdVÿ€¹G­k ³‡$j5½ñ¶b0A—¨voƒÓ,b)^¼—cÓ(mÀ@s)¢ë‡¢àb bô¥€—¨6_=€ vMôÞ'")!1à;˜mgÙ”‡Nä‘~íS+¸ÜÖ¾ p ik¹uû—ǹ>…ª\Ÿð"Ã>fÓlBÿú’Àžãµ3Q­oM»¢§ju®á·Õ¦)´µÁ™Î9iLê5'†/ÃRÎVÞÍòå\º¦\úÞ­"J%Ij0ƒ±{AaT ð†*u/AA¦šÐa¦’^£"#XÁ`9 ‡@¸6\w7«ÁÁÀsCu0* nÛB\{d@Zkß±2‡† €/t­x…ó GŒP & €#A¡à’\HPŸK¾ç'Ëd¨Þ.S°¦l©DQw‚ª˜qu¦é§Ê§‘(q2P€²I0# ÿ€5oCI…& Œ)'N¼>-dVHQb ƒ1ÉØ9ÝÈfC]©Q”«G'Zˢžo'Úã×'‡â°ÝÈ&šg1)4¶E^Y®Ã£$þéÚ¨’I$€ j°a #±ª˜Æ„Œ\65žå.,z­˜ÔZ9 ÊoAq™%©l·wÏ3µžÝŒ?½¸@CFÀFH”¥¾‹p'4 ]ã3 dæqlÀ%¦6¤r`w´íÍ1òË‚¢ì|´ËIB^à¡ Õ}¯eÚ² 0ä}.ʬ, êødR¥ Ƀ ´Wå ‚€ù'[:LÕ§/ÇYÞˆ¯H@ä¶é„²Z£]¦RÇf\ÖÕº_nñˆû´·ýáŠ-ÊWv~æ·[­-;¼´±kI2©,¡ÜŠG¯—JuVíi‰FqÊZ™Àwi«ÏãVžåzœýáÝ>ijЉ%;4 Ñ›2ô`*fb @à£,Í2ÿú’Às5o%QMë «¤j)½=µ°îD & 4F[ $R堙ЖLJÊéu« *£‚g©x€H@0@ÓD!B•ŠŒ@Jy C³%PÕ1x˜1 Zó"QG Öª Åy!Â\‰(â«Âuà ð/‹…C*´‚0•ãÒX 2LS¯Fùâ¹H3)è§2tÚmC¥À¿%—nPšá>–¶ÌtËÈkuÄEªC³N£ýbñcgî@¥º¨Ü_êRLL2†LÛE˜šB©B‚0öBÅK–ã³èm­=é.jù«j—)¦4•Ø£é¬ÎÝF¡òØænÀ'è†_Ã=öä!ÆPæ|‡›¡jCô2)ú64ˆ¶ŸS%Séµhñ2“¥`‡ §FœªUµrÑ ''[)¢\QCí¡DèC¸mW,rHäÅ6‹‹F­'‹;Ö'®'¤#uçwWô¿^ôýu1MhlÃWkP€à4a£1åJdBŠmЖÊÞaÿú’À½»qùOMeëªo*)­=lÐN2d)6ǃl†,Ýÿošâƒ#Šó zÁBM€·_¨zC „…@²Ã(ê‚Í2[¡Ü[ˆG—"TŸ¨Êä]•GJ»K*h/Ì –ŒÓWÑž¶Cxº4¥Û Ç̵†Ï¸yïÂn¯¢ïRTææh§H&*7–Z†æE"s¦€‚ÑHæÆ™{PD"H TæCxÞÑt748 ÀõœÅÀÝK†äwð\2ò"²WOQhø´wž®OµŒÒ\hëG¾S% º†Æ]çèÃ@LHD=%3AXyr9þ¯‘HFÁ‹¡cjá$zq'Yo%x3„!@B‘¥R<3Œ2V‚@ ñ «b4uœ¡Ì[cf)‹`à;ϵ då7“ŽDµ¨ì#Žr;éQ·i•rÿú’ÀmLŒ€èëQ,áër¥œª%¼=nwŒ¾œìÑ•š$Õ»ÔâuÍv|µr_ ³^ÃÁEÔ£é ›B†ýŽ¿»C€@íK†¦¦bá"€ˆ,šXÓžaˆ?‹®,+\§ÄTÐ_ cÄ€"9 µaLv¢ãаh&ȈÌÈk®U;‹2Ô·^Ò× ª ¥'¨HöceÙ\‰’ÏaåÄ¢Qg±ÃXmÔiO\þk^HÅ›³2[)—¬•ˆ©«ˆº`­1Má‡RUr&ÝÞI+™eŽ» ‚Ÿhïn÷{rEV‘Z|§(Ìõ,Z“ÿüõô•aQ”D”£HAê8ðˆ“„d ,ѸfcÍx €€IˆÀ¯ 8G%Yk¤4·J®Ñ‘0Vº?-Ä9„±ÔéÌ#4‰1‹¤ˆï²`+ZíN„'ËÔ"&ºJÙz[)(< ¢ªæŒ¿Ž ‚Ä~VVx„5ª‘eýy°µØÄÕ÷ñsCÐ+|Ä™2ä`Èåfî=’9LãM5†ñ²¨ûfÿú’À›5­€U!O-ç ºÇ)©¬awUvr¦øºMšO[9Uì2½ÓJYãƒ*w?ø¢‡€’åŒL,˜aògˆtà-„)»4Ay[2ÁMÒÙ0ž¬¢uÅž’õE-àõæ‰mÕ¡§¬]ÊQÙÆÃ—b?2èqŒ¢Sc]p5uÙv/6QcÉœÎ&”; ºláà‡³pÙ³¦í‰)ˆ–ÞfŽªÖÊ’_kõµI•ÏÇ}×? 5Ž:ÿú’ÀûÛ¸€MMc ºþ£©©¬avÃÿ\¿ÀübÚ‹+Ò·ÁT’݈ño)A‡ˆ‡/¥Ã0•…–HèJŠÉÊxÒÙp§‹|­¥yEâAS¦ bÃCϲ•Ú·Ö$ z¥ëà4Á1’ì77p„c×vfÓ ¨L8ÃWI‹ÍQÅ€ '•ÛaP%gô­ áº)”R9)”¹¯P¿QÛëå­»‹ò}Ys~Å–ã™H×u$Uö‚:ÎJ‹©ºSW@Vq·„MÏçì®ÕËÿ¹ë÷ޝ` aBG¸±L$”ãH1lq#£Á£¦†6"`BàÁãA€.ˆj$»T† w %qìyU]k€ó¿-œk%ËELŠ- ÖžÕ›’L?‰"dB|³ñVÛÂÚˆ. BCéÃw^§}â«Z©xÖÊV;ΪÓx™šŠ¨39]Ópë`‹Ãpãrzx —H YCõÈÈ”âé93’‘ÞÎazÂeÖ#“òÞRý&Í<ó`Iû@ÈöWߢ€’]Õ  vŒx ÿú’À ^¿€5 QMg ²Ð驼an9t¦8×8Àj_l™JƒÆEÂÁ!7):ZrQPÖMâ€X¶Y7n<¥eþWLœ©åÿ .°Ù²ºTíV™ –^qÓT›&t&´á Õ2Ö|§ ˆU"]Â$¤Y²†$½Ì±˜8XÈÈHhŒ9+T?Ê‚4aP³’ rý.k1ˆ ÿ5ålÒÓ,/YeÙB÷3ÁIάÒ'ÑÿxeÑYÉ^(Aâ A*0óÁõçz:õDV%KcAªÛ*21ppŒ€.Âp¢I*šæ¤š“UPuÓ { 4ð#K5æzÓð1¬Ò /*IGÝh´–ÔPÄO™Xth£x™)A‘¸ Ê({iCÚué €8º#ÈE&NB™EVÅБ›. ýBr`°Hˆ•-LD¸XD6¨¤Ù”‹Zwª!º¢&-£+™æ¾óDÞ‰t7'¤]Q).s²îC0—æ[ÆšŠ·uNZ”Pê.L séÕQX•&¬€ ΄ÑÀ<žÅ©€:'E8ØI@¨!ÿú’ÀÖgÎHñM­ã+²ßéé¼enAC:X34ø‹»Ö¬æ¶JåódSf’½QE(€Ë#lMAZûqè,¢,#…u·DÁR³V° =y¸ä€4v žˆžÔ™©€=)™¡9NaÆ ªø[*i.zpŽc€@”cKaÒ1`›Æ•RIz¨1gŒºÔÍ)˜%s°Ô‰*‹­#§†%÷%”ç–ïD~¯ã{\I(“&­l2 š €.a éÚƒ´I¼cÆñA –¹m[•RÀ’J^ì ¢õÁT TÝ'MËxã-(²°Ë¦ý%=%bϵó4ìô:Äbµ¡BCR6D"ëB%E O•2‰§«bV³ô#íS-x—iB/iÐb”®hä<´­¸¤È‘B HXå­YÃ8_ió,ЏüÝŬ÷»Ã2*C¬é€¸n¤4öÙ—Qö#¤‹¨^÷IŽwý;Áˆ„ãQW¤Àãuú–àDa…Ž,¼»F•Ú˜4æ·aWO ’Y$ìwz>ÄÓ"Ýÿú’ÀýQÖ€TïOMc+zç)õÌaväž5ÂVãu-ÅÅN³q– \ˆ `!åÛd‹œ$§²–j•ìñ™-šÑ«ÎA¢ƒC‹®„iÍYÚú™°ô³g®H $ Mt.D¡Àe›rØ›Êë=_mú[¨X0JÔh×µK;in}…ZŽWƒ«ØðÀxéó¤PDúìÿª@nÆËÛÀ@¦,zfEãDK %N80(öÑô$G)v¸‡ˆíX­¿±PZ nUΗ.rvR_h«Ò•æÈ9±ü*†,:d8"ΠW…†J¥)6é¾ä!.Aa˜B=¹´ÐJ›EáÕRm]x40Ð…DÂ0Ó "Ò±§¨ZÑVfñ¿-&K¼!/U‘…PÀƒ.ê@©ƒÐãSK²³˵Ÿ*oï1Ï<°æYêÖj¥s„–@%\Ñ‚O¸€Œ‚6›A²D€@'Ï«AÀ©š¥TÎÊ"‰cn”„ê„ÇL›]tËOhÿúÀº¿á€óENcK³£¨õ¼ew1ü*¶3×àEYû£†‹€Óf€+”+bVE¢(8ð— ¿u-T+7dº9L!Õ§dXˆ¦Dm˜d‘4:d¶h„(° ñâ’qöO˜Æ_Ð=¦'Y¯c¼|4Ê[ü±·Ût™ãÝgùåÖÏ.a¯ÇÞ7ñ©4-2A,’îŒx^I€¥È“œQášÌ (¶!­¦ÊæÉB.ùt@A‰E˜àïÊo‹¦¶Â—ŠÒ\ÆMÑ^»’$Êg˜mbÑv~õûÎ4¿g˜÷ïÿ9Îï÷w„¡`n¼“kïJÁåh„(Š‘A“7B“ëœOróˆÉ¯ùµ¢\Ib‹ZOU`‹½ÅЇÃOŽOMxË:0núŽ ãZ!BxÖl(¿~i–“ÒA6›ÃvR-0TQh-3´,°w¹ƒ¨Vï%¥~¶ƒ ¾Fâÿú’Àmÿ€|ïG­ç+rû"(i¼evËÜŒlDPÀÄÛA!1v‰“&9,Ù\] UÉ`ÿ'”¡ˆJ刅™ŒêÎZ¿–÷w&\›–+ÔÞ{½ö³¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøI%"HK@`˜Àò²£Î$ ‡JØëSL€Ç?ˆ€¼%•¤©â¹^Ô°ˆÒxÁ,ks…WI#Ñ[eÙ2¤ð€®X×ã¥SþEÔHÔ.ͳy£)¶æ.§(,Æ´™1"q¸îÂoö ‡€ˆ¦všuÚC‹5ŠZ_2'©ìu)ž.nûmO#gHU^ZhÜë«»Ñ(r[/]˷̾þe_\î5·Ì¾îÀF÷ÖÕˆ°£ ‘›ˆã'ƒ÷/¥TËiqRÑ^/´kuŒÇuäu¥²Õ¨™N¦RrBê•7ÆÍjT#Š$Æ ÀBíYIà“öR̉ª×å¨LœË:´ö j%irÕ#jüÃL8,5y°_Ö/ÿú’À[Áÿ€0÷CMã ºä£èõÌavUbÄž"ò&¤篥heòöðÕ¯µBì5 \Iœ§ÌZmí±–rŠJ9üw¾s²Ë×ã¯ÿÏïþùö¶ªGWj?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàA‚$½õmô:bx° 0XÄå$¤kS2È5ÐGéð^gµJÈ—GUþ³¸àTÐDêR†5ò´é(„ô°‘'êtoÄnßJ½‚û' Õ2çVohϬ÷~›í•œÈ•}:wT&9 P–)-ž& ‰íe5¨ìP æ8åËVüZ8´›ÚŽÖ¬Uëo/€¦;*‚7½^Ç:Þh¸^Q©bßEy’d’JJT­€˜Ê<ÕLÑ„X-£‹ÏAa°Â“ÔÊždÍÞ%€Én*G>ÓƒsOG„*P–­z:Çu6!ÔÈõ³•§x À†žh•R¸Á!0ì¶•;¯ÞˆÂþ¥üa·Ðxˆü[0Ë=ž{c®«ÿú’À øÿ€i!CMc ’}¨©ÌekH›S§¶eÃ$'Ä\h!LæH驦±ÛõZe8³f{ RܲÃ|Îý~w÷Íó;ùs ÖÃ|ÎèhÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø@d‰*Vˆ/£‚§@†¢Ù– ŒÉÕ€] \jmË"* u·‚ˆ6IýT. ÐTÍ8Ý6’¾U •¶h0úM„ƒ¯ã¨01Zm0záñHÏœ‚Ü•›„èÀ5úÝãbñÏ«Ùh*§&!oÄÕ°³ªÕ gsŒ÷,sªÂÝ5Šœ.‹üÝ›Yu,¶šÌ6–xãQ¡–6[zîS$h}ôDÙ›N‰%vu¾Oí>oÑû€ %€ö ÷2ñ² ÛÅß=Ñba'x-$ÜÕœa¨Ö]ž-F##Ý'zF”DÅ0%°bù·8½×½9DLJ¦H½©èˆ„[mÙŠÆÖhhÅDcbJæcØ…¸„ðq¬´Š¹'€Ýÿú’À±'ÿ€ÑG­ç+ºÒè)¼åoÙ aÝ‘$¤ f£¯EMZ[*¿99&zøô4õ*Ú(iNê“TԲƳl<þÒíÔ5Q•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü™0ähePi’‚…ØAT¼Ü’…‚G€“ÄVHúå…Þ2•¦_“è.b#ýw„UvÏaâò‰«Å¡Ü´M™fŽ„XCC(d˜te—­ ( ±Êê< ¢_JD1½•àÀr›k é†fÍ߈¹Äؼb‰Üdò{˺Q1›Á;ºÓ˜R4êÓÛý;YÚ\””ó–¬ežçèï蘥ý xß6:`n\­‚TÁvÈ”õ…©"‰(fm ›K†—é¶Ú¡8ãwT¬PX"ñ`¡Q Æ/$ZK%3á (T9ŠÔéÖ4NÑŒ«›*L-Ý4]““K~ ‘?VNÚÌÊ%Rưܑ:{S±¸ÿú’Àó…ÿ€´ñA­ã+º”¨5¼ao¥$Ói= ær\•›ÍÉ›˜p¥ñÉog+ÁÒŠ–ÞÊÕ,ÓÑRãûÆÔ䯃DyåÓ­±Ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(ŒÑ%ÈKZd0ÈX22‰À0`0›€ 8bÌ :®ÌD‹‘ÕPì¹$šQ‹"&5ý²0‘0¯ã0¢LÖèÆ[¤uú,"œQ˜h8ÏÌ€B;Þi31†.Òå²êylQüÊ™X¸?Žläëóm£²(Œ?¶œóenÿÂ’­íruémâ,hÿú’Àðÿ€|íC­k+z›$'é¼áv8SñYéIãÐ+–ÿÀÎϹ°Ô=ümÔ±º*zòúZ ·,j·jgÝoË;¿ç5Ïï?û®Zþ³…Äz¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæ—$¹ 5…@Èè0¨šHСT†fì‰Í·brÜDØU]T­o½¥¢»5Û]즋Çù¹l¶½lSë‹^{a…'¿ÿ‘;X½7­‘5"u ºiŠ!…‡¤½Œ»ªHÌD`Y ‘% = ™«¦ja ƒ^…ý®šZHš¥È–Ÿ£DBãÒ¹¬„qe áfߟà÷¹ Dp+\Iç%”5 æ±V 8´,6aÊUxä¤ÿú’À'ÿ€} G¬ç+º¼穜eo“>s¦_‡ÁÃvYõæÆýCnƒxcT~ ‡£2¸Cõ1nÝêû³Êõ)¹+›ˆLS\­®çÛ57•̵–ZÂÕšÚ©ˆ%û5ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔVۺȂA3S†\_ÄeOБ òx `À*ñŽžI$Á0 b¬$Zë¿"%ÅËZß „Hja/e쓆‚ …Šh.&H¥ÌhʃSžå¹Ä%] ÕßOâׄ‘,"½/"V¥mØ ؘŒå›°ˆˆAÁZQ¼ h‘m®ÇâG¢¦z¨iê•>•ÛX~[+½MK(½9b¦rš»¿/·Ù¾ånÍ?f?Ÿ–8îîYeosù–ëcwûi¨ ©7-jÕ`´¯B@è–ª37"ç!ȤbÃtL*3e È:$KK¶˜RTç&sK@€Xa€tÙòH&sº½L6 zT¡ƒ!bži‰šÚ‹ ‘GC p(æHf$ÇÀC¡–J×Ûcnj8ú1WUN‰Bl¯Ìÿú’À„ðÿ€¥7Lk ’÷¤&éar sBä†F \ˆãvÚ; ÝhØ«„ö.7™¸¾îãÚèÐʤV3–j÷öÜJÕˆœåv;MÛ{ ‰ƒ"ãO>Àm/J?ÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒ /dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = samples DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = source DIST_SUBDIRS = source testfiles all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign samples/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ cscopelist cscopelist-recursive ctags ctags-recursive \ distclean distclean-generic distclean-libtool distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/samples/source/0000775000175000017500000000000012163706253012757 500000000000000exempi-2.2.1/samples/source/xmpcommand/0000775000175000017500000000000012163706253015122 500000000000000exempi-2.2.1/samples/source/xmpcommand/PrintUsage.cpp0000664000175000017500000001042612150230672017623 00000000000000// ================================================================================================= // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "globals.h" #include "PrintUsage.h" #include "Log.h" using namespace std; namespace XMPQE { void PrintUsageShort(const char* exename) { Log::info("%s -version",exename); Log::info(" Print version information for this utility"); Log::info(""); Log::info("%s -help",exename); Log::info(" Print descriptions of all available switches, including examples"); Log::info(""); Log::info("%s [switch [switch]...] action mediafile",exename); Log::info(""); Log::info("This command uses the XMPFiles component of the Adobe XMP toolkit. "); Log::info("Copyright 2008 Adobe Systems Incorporated. All Rights Reserved."); Log::info(""); } void PrintUsageLong(const char* exename) { Log::info("%s -version",exename); Log::info(" Print version information for this utility"); Log::info("%s -help",exename); Log::info(" Print descriptions of all available switches, including examples"); Log::info("%s [switch [switch]...] action mediafile",exename); Log::info("This command uses the XMPFiles component of the Adobe XMP toolkit. "); Log::info("Copyright 2008 Adobe Systems Incorporated. All Rights Reserved."); Log::info("NOTICE: Adobe permits you to use, modify, and distribute this file in"); Log::info(" accordance with the terms of the Adobe license agreement"); Log::info(" accompanying it."); Log::info(""); Log::info("Switches:"); Log::info("-out Writes output and logs all warnings and errors both to "); Log::info(" standard output, and also to the specified output file. "); Log::info(" If you specify the output file without this switch, stdout is not used."); Log::info(" You should check that there are no warnings or errors (return value is 0) "); Log::info(" before using the output; stderr is not used."); Log::info("-safe Updates safely, writing to a temporary file then renaming "); Log::info(" it to the original file name. See API documentation for "); Log::info(" safeSave(kXMPFiles_UpdateSafely)."); Log::info("-smart Requires the use of a smart file-format handler, does no packet scanning."); Log::info(" Use of smart handlers is the default, if one is available."); Log::info("-scan Forces packet scanning, does not use a smart file-format handler."); Log::info("-nocheck Omits readability/writeability checks. Used internally. "); Log::info(""); Log::info("-compact Writes extracted XMP Packet in compact RDF-style, rather than"); Log::info(" pretty-printing attribute value for readability (which is the default)."); Log::info(""); Log::info("Actions:"); Log::info(" info Prints basic information about the file."); Log::info(" put Injects the XMP contained in the specified xmpfile "); Log::info(" into the specified mediafile."); Log::info(" get Retrieves the XMP Packet contained in the specified mediafile."); Log::info(" dump Prints the XMP Packet contained in the specified mediafile to standard output. "); Log::info(" << ?? >> USE dump ONLY for known-good-output tests, do not use get. << ?? >> "); Log::info(""); Log::info("Examples:"); Log::info("%s info Sample.jpg",exename); Log::info("%s get ../Sample.jpg >onlyFileOut.txt",exename); Log::info("%s -out alsoFileOut.txt get Sample.eps",exename); Log::info("%s put xmp_mySnippet.xmp Sample.jpg",exename); Log::info("%s -smart put xmp_mySnippet.xmp Sample.jpg",exename); Log::info("(Smart handler would be used by default for a JPEG file even without the switch.)"); Log::info(""); Log::info("Returns 0 if there are no errors. Warnings and errors are printed as part of the output. "); Log::info("You should check the return value before using the output."); Log::info(" "); } } // of namespace XMPQE exempi-2.2.1/samples/source/xmpcommand/Actions.cpp0000664000175000017500000003601412150230672017143 00000000000000// ================================================================================================= // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // actions.cpp|h // performs one of the XMPFiles actions as indicated by the paramters (and evaluated in main) // const char * XMP_EXE_VERSION= "4.4"; #include #include #include #include //XMP related #define TXMP_STRING_TYPE std::string #define XMP_INCLUDE_XMPFILES 1 #include "XMP.hpp" //NB: no XMP.incl_cpp here on purpose, gets compiled in main... #include "XMP_Const.h" #include "globals.h" #include "Log.h" #include "Actions.h" //must come after XMP.hpp/XMP_Const.h // utility functions ************************************************************** /* does NOT include path fixing (unix vs wxp) on purpose * being readable of course implies existing * - note: this utility is also used by cppunit sanity checks */ bool fileIsReadable(const std::string filename) { FILE* fp = NULL; fp = fopen( filename.c_str(), "rb" ); if( fp != NULL ) { fclose( fp ); return true; } return false; } bool fileIsWritable(const std::string filename) { FILE* fp = NULL; fp = fopen( filename.c_str(), "rb+" ); if( fp != NULL ) { fclose( fp ); return true; } return false; } void verifyFileIsReadable(const std::string filename) { if (! fileIsReadable(filename)) Log::error("file %s is not readable or not existing.",filename.c_str()); } void verifyFileIsWritable(const std::string filename) { if (! fileIsWritable(filename)) Log::error("file %s is not readwritable or not existing.",filename.c_str()); } std::string getStringFromFile(const std::string& filename) { verifyFileIsReadable(filename); //figure out length FILE * file = fopen ( filename.c_str(), "rb" ); fseek ( file, 0, SEEK_END ); XMP_Uns32 length = ftell( file ); fseek ( file, 0, SEEK_SET ); //write into string std::string content; content.reserve ( (XMP_Uns32) length ); content.append ( length, ' ' ); fread ( (char*)content.data(), 1, length, file ); fclose ( file ); return content; } /* hand over the fileFormat and get a fileFormatName (2-3 Letters ie. PDF) * and a Description (i.e. "Portable Document Format") back. * see also public/include/XMP_Const.h */ void fileFormatNameToString ( XMP_FileFormat fileFormat, std::string & fileFormatName, std::string & fileFormatDesc ) { fileFormatName.erase(); fileFormatDesc.erase(); switch(fileFormat) { case kXMP_PDFFile: fileFormatName = "PDF ";fileFormatDesc = "Portable Document Format";break; case kXMP_PostScriptFile: fileFormatName = "PS ";fileFormatDesc = "Post Script";break; case kXMP_EPSFile: fileFormatName = "EPS ";fileFormatDesc = "Encapsulated Post Script";break; case kXMP_JPEGFile: fileFormatName = "JPEG";fileFormatDesc = "Joint Photographic Experts Group";break; case kXMP_JPEG2KFile: fileFormatName = "JPX ";fileFormatDesc = "JPEG 2000";break; case kXMP_TIFFFile: fileFormatName = "TIFF";fileFormatDesc = "Tagged Image File Format";break; case kXMP_GIFFile: fileFormatName = "GIF ";fileFormatDesc = "Graphics Interchange Format";break; case kXMP_PNGFile: fileFormatName = "PNG ";fileFormatDesc = "Portable Network Graphic";break; case kXMP_MOVFile: fileFormatName = "MOV ";fileFormatDesc = "Quicktime";break; case kXMP_AVIFile: fileFormatName = "AVI ";fileFormatDesc = "Quicktime";break; case kXMP_CINFile: fileFormatName = "CIN ";fileFormatDesc = "Cineon";break; case kXMP_WAVFile: fileFormatName = "WAV ";fileFormatDesc = "WAVE Form Audio Format";break; case kXMP_MP3File: fileFormatName = "MP3 ";fileFormatDesc = "MPEG-1 Audio Layer 3";break; case kXMP_SESFile: fileFormatName = "SES ";fileFormatDesc = "Audition session";break; case kXMP_CELFile: fileFormatName = "CEL ";fileFormatDesc = "Audition loop";break; case kXMP_MPEGFile: fileFormatName = "MPEG";fileFormatDesc = "Motion Pictures Experts Group";break; case kXMP_MPEG2File: fileFormatName = "MP2 ";fileFormatDesc = "MPEG-2";break; case kXMP_WMAVFile: fileFormatName = "WMAV";fileFormatDesc = "Windows Media Audio and Video";break; case kXMP_HTMLFile: fileFormatName = "HTML";fileFormatDesc = "HyperText Markup Language";break; case kXMP_XMLFile: fileFormatName = "XML ";fileFormatDesc = "Extensible Markup Language";break; case kXMP_TextFile: fileFormatName = "TXT ";fileFormatDesc = "text";break; case kXMP_PhotoshopFile: fileFormatName = "PSD ";fileFormatDesc = "Photoshop Document";break; case kXMP_IllustratorFile: fileFormatName = "AI ";fileFormatDesc = "Adobe Illustrator";break; case kXMP_InDesignFile: fileFormatName = "INDD";fileFormatDesc = "Adobe InDesign";break; case kXMP_AEProjectFile: fileFormatName = "AEP ";fileFormatDesc = "AfterEffects Project";break; case kXMP_AEFilterPresetFile: fileFormatName = "FFX ";fileFormatDesc = "AfterEffects Filter Preset";break; case kXMP_EncoreProjectFile: fileFormatName = "NCOR";fileFormatDesc = "Encore Project";break; case kXMP_PremiereProjectFile: fileFormatName = "PPRJ";fileFormatDesc = "Premier Project";break; case kXMP_SWFFile: fileFormatName = "SWF ";fileFormatDesc = "Shockwave Flash";break; case kXMP_PremiereTitleFile: fileFormatName = "PRTL";fileFormatDesc = "Premier Title";break; case kXMP_UnknownFile: fileFormatName = " ";fileFormatDesc = "Unkown file format";break; default: fileFormatName = " ";fileFormatDesc = "no known format constant";break; } } //fileFormatNameToString /** * GetFormatInfo-Flags (aka Handler-Flags) * find this in XMP_Const.h under "Options for GetFormatInfo" */ std::string XMPFiles_FormatInfoToString ( const XMP_OptionBits options) { std::string outString; if( options & kXMPFiles_CanInjectXMP ) outString.append(" CanInjectXMP"); if( options & kXMPFiles_CanExpand ) outString.append(" CanExpand"); if( options & kXMPFiles_CanRewrite ) outString.append(" CanRewrite"); if( options & kXMPFiles_PrefersInPlace ) outString.append(" PrefersInPlace"); if( options & kXMPFiles_CanReconcile ) outString.append(" CanReconcile"); if( options & kXMPFiles_AllowsOnlyXMP ) outString.append(" AllowsOnlyXMP"); if( options & kXMPFiles_ReturnsRawPacket ) outString.append(" ReturnsRawPacket"); if( options & kXMPFiles_HandlerOwnsFile ) outString.append(" HandlerOwnsFile"); if( options & kXMPFiles_AllowsSafeUpdate ) outString.append(" AllowsSafeUpdate"); if (outString.empty()) outString=" (none)"; return outString; } /** * openOptions to String, find this in * XMP_Const.h under "Options for OpenFile" */ std::string XMPFiles_OpenOptionsToString ( const XMP_OptionBits options) { std::string outString; if( options & kXMPFiles_OpenForRead) outString.append(" OpenForRead"); if( options & kXMPFiles_OpenForUpdate) outString.append(" OpenForUpdate"); if( options & kXMPFiles_OpenOnlyXMP) outString.append(" OpenOnlyXMP"); if( options & kXMPFiles_OpenStrictly) outString.append(" OpenStrictly"); if( options & kXMPFiles_OpenUseSmartHandler) outString.append(" OpenUseSmartHandler"); if( options & kXMPFiles_OpenUsePacketScanning) outString.append(" OpenUsePacketScanning"); if( options & kXMPFiles_OpenLimitedScanning) outString.append(" OpenLimitedScanning"); if (outString.empty()) outString=" (none)"; return outString; } //just the callback-Function XMP_Status DumpToString( void * refCon, XMP_StringPtr outStr, XMP_StringLen outLen ) { XMP_Status status = 0; std::string* dumpString = static_cast < std::string* > ( refCon ); dumpString->append (outStr, outLen); return status; } // ******************************************************************************** void Actions::version() { XMP_VersionInfo coreVersion, filesVersion; SXMPMeta::GetVersionInfo ( &coreVersion ); SXMPFiles::GetVersionInfo ( &filesVersion ); Log::info("%s", coreVersion.message); Log::info("%s", filesVersion.message); Log::info("Executable Version:%s", XMP_EXE_VERSION); #if XMP_WinBuild Log::info("compiled on Windows on %s, %s",__DATE__,__TIME__); #endif #if XMP_MacBuild Log::info("compiled on Mac on %s, %s",__DATE__,__TIME__); #endif #if NDEBUG Log::info("Configuration: debug"); #else Log::info("Configuration: release"); #endif Log::info("Edition: Public SDK"); #if XMPQE_BIG_ENDIAN Log::info("Big endian machine"); #elif XMPQE_LITTLE_ENDIAN Log::info("Little endian machine"); #else Log::warn("unknown Endian !!!"); #endif } /////////////////////////////////////////////////////////////////////////////////////// void Actions::info() { if(!this->switch_nocheck) verifyFileIsReadable(this->mediafile); XMP_FileFormat xmpFileFormat=kXMP_UnknownFile; SXMPFiles xmpFile; if ( !xmpFile.OpenFile(this->mediafile,xmpFileFormat,generalOpenFlags) ) Log::error("error opening file %s",this->mediafile.c_str()); std::string out_filepath; XMP_OptionBits out_openFlags; XMP_FileFormat out_fileFormat; XMP_OptionBits out_handlerFlags; if (!xmpFile.GetFileInfo(&out_filepath,&out_openFlags,&out_fileFormat,&out_handlerFlags)) Log::error("error doing GetFileInfo %s",this->mediafile.c_str()); //FilePath (just verify that identical to what's been used) if ( strcmp(out_filepath.c_str(),this->mediafile.c_str()) ) //that's if it NOT matches (!=0 ...) Log::warn("media filepath %s does not matches filepath %s obtained from GetFileInfo", out_filepath.c_str(),this->mediafile.c_str()); //openOptions (also verify that identical to what's been used) std::string openFlagsString=XMPFiles_OpenOptionsToString(out_openFlags); Log::info("openFlags: %s (%X)", openFlagsString.c_str(), out_openFlags); if ( generalOpenFlags != out_openFlags ) Log::warn("out_openFlags (0x%X) differ from those used for open (0x%X)", out_openFlags,generalOpenFlags); //FileFormat (resolves, usually by way of extension unless specified) std::string fileFormatName, fileFormatDescription; fileFormatNameToString(out_fileFormat,fileFormatName,fileFormatDescription); Log::info("fileFormat: %s (%s,0x%X)", fileFormatDescription.c_str(),fileFormatName.c_str(),out_fileFormat); //FormatInfo aka "HandlerFlags" (show what is possible with this format) std::string formatInfoString=XMPFiles_FormatInfoToString(out_handlerFlags); Log::info("formatInfo:%s (0x%X)", formatInfoString.c_str(), out_handlerFlags); xmpFile.CloseFile(generalCloseFlags); //(enabled again now that bug 1352603 is fixed) } /////////////////////////////////////////////////////////////////////////////////////// void Actions::get() { if(!this->switch_nocheck) verifyFileIsReadable(this->mediafile); XMP_FileFormat xmpFileFormat=kXMP_UnknownFile; SXMPFiles xmpFile; std::string xmpDump; //really just the raw string here if ( !xmpFile.OpenFile(this->mediafile,xmpFileFormat,generalOpenFlags) ) Log::error("error opening file %s",this->mediafile.c_str()); if ( this->switch_compact ) { if ( !xmpFile.GetXMP(0,&xmpDump,0)) Log::warn("file contains no XMP. - says xmpFile.GetXMP()"); else Log::info("%s",xmpDump.c_str()); } else { SXMPMeta xmpMeta; //get meta-object first, then get serialization if ( !xmpFile.GetXMP(&xmpMeta,0,0)) Log::warn("file contains no XMP. - says xmpFile.GetXMP()"); else { xmpMeta.SerializeToBuffer(&xmpDump, 0, //NOT using kXMP_UseCompactFormat - Use a highly compact RDF syntax and layout. 0); //receiving string, options, 0(default) padding Log::info("%s",xmpDump.c_str()); } } xmpFile.CloseFile(generalCloseFlags); //(enabled again now that bug 1352603 is fixed) } /////////////////////////////////////////////////////////////////////////////////////// void Actions::dump() { if(!this->switch_nocheck) verifyFileIsReadable(this->mediafile); XMP_FileFormat xmpFileFormat=kXMP_UnknownFile; SXMPFiles xmpFile; std::string xmpDump; //really just the raw string here if ( !xmpFile.OpenFile(this->mediafile,xmpFileFormat,generalOpenFlags) ) Log::error("error opening file %s",this->mediafile.c_str()); SXMPMeta xmpMeta; //get meta-object first, then get serialization if ( !xmpFile.GetXMP(&xmpMeta,0,0)) Log::warn("file contains no XMP. - says xmpFile.GetXMP()"); else { std::string dump; xmpMeta.DumpObject(DumpToString, &dump); Log::info( dump ); } xmpFile.CloseFile(generalCloseFlags); //(enabled again now that bug 1352603 is fixed) } /////////////////////////////////////////////////////////////////////////////////////// void Actions::put() { //need read and write if(!this->switch_nocheck) verifyFileIsWritable(this->mediafile); //first open regular to see if injection possible XMP_FileFormat xmpFileFormat=kXMP_UnknownFile; SXMPFiles xmpFile; if ( !xmpFile.OpenFile(this->mediafile,xmpFileFormat,generalOpenFlags | kXMPFiles_OpenForUpdate) ) Log::error("error opening file %s",this->mediafile.c_str()); std::string out_filepath; XMP_FileFormat out_fileFormat; XMP_OptionBits out_handlerFlags; if (!xmpFile.GetFileInfo(0,0,&out_fileFormat,&out_handlerFlags)) Log::error("error doing GetFileInfo %s",this->mediafile.c_str()); bool foundXMP = xmpFile.GetXMP( 0, 0, 0); //construct the to-be-injected snippet std::string xmpMetaString=getStringFromFile(this->xmpsnippet); SXMPMeta xmpMeta(xmpMetaString.c_str(),(XMP_StringLen)xmpMetaString.length()); // append metadata if we found XMP or if we didn't but can inject if ( foundXMP == true || (out_handlerFlags & kXMPFiles_CanInjectXMP ) ) { if ( !xmpFile.CanPutXMP(xmpMeta) ) Log::warn("canPutXMP denies I can inject: (xmpFile.CanPutXMP()==false)"); try { xmpFile.PutXMP(xmpMeta); //void unfortunatley, must close file to figure out result... xmpFile.CloseFile(generalCloseFlags); // close the file } catch ( XMP_Error& e ) { Log::error("puttingXMP failed: %s",e.GetErrMsg()); } } else { //handle the error //FileFormat (resolves, usually by way of extension unless specified TODO) std::string fileFormatName, fileFormatDescription; fileFormatNameToString(out_fileFormat,fileFormatName,fileFormatDescription); Log::error("the File %s of type %s neither contains XMP nor can it be injected (at least kXMPFiles_CanInjectXMP not returned)", this->mediafile.c_str(), fileFormatName.c_str()); }; } void Actions::doAction() { //do open and close-flags one for all (add ThumbFlag if needed above) generalOpenFlags=kXMPFiles_OpenForRead; if (this->switch_smart) generalOpenFlags|=kXMPFiles_OpenUseSmartHandler; if (this->switch_scan) generalOpenFlags|=kXMPFiles_OpenUsePacketScanning; generalCloseFlags=0; if (this->switch_safe) generalOpenFlags|=kXMPFiles_UpdateSafely; switch (this->actiontype){ case Actions::VERSION: version(); break; case Actions::INFO: info(); break; case Actions::PUT: //PutXMP() put(); break; case Actions::GET: //GetXMP() get(); break; case Actions::DUMP: dump(); break; default: Log::error("unknown command or not implemented!!"); break; } } exempi-2.2.1/samples/source/xmpcommand/PrintUsage.h0000664000175000017500000000114012144603625017266 00000000000000// ================================================================================================= // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #ifndef __XMPQE_PRINT_USAGE_h__ #define __XMPQE_PRINT_USAGE_h__ 1 namespace XMPQE { void PrintUsageShort(const char* exename); void PrintUsageLong(const char* exename); } #endif exempi-2.2.1/samples/source/xmpcommand/XMPCommand.cpp0000664000175000017500000001426312150230672017510 00000000000000// ================================================================================================= // Copyright 2005 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= /** * A command-line tool for performing basic XMP actions such as get, put and dump. Can be used for testing * and scripting automation. */ #ifdef WIN32 #pragma warning ( disable : 4267 ) // suppress string conversion warning #endif #include #include #include #include #include #include //some global constants / sanity checking #include "globals.h" #define EXENAME "xmpcommand" //XMP related #define TXMP_STRING_TYPE std::string #define XMP_INCLUDE_XMPFILES 1 #include "XMP.hpp" #include "XMP.incl_cpp" //include in EXACTLY one source file (i.e. main, in Action gets you trouble...) //QE related #include "Actions.h" #include "Log.h" #include "LargeFileAccess.hpp" // -help output #include "PrintUsage.h" namespace XMPQE { void InitDependencies() { if ( ! SXMPMeta::Initialize() ) Log::error( "XMPMeta::Initialize failed!" ); XMP_OptionBits options = 0; #if UNIX_ENV options |= kXMPFiles_ServerMode; #endif if ( ! SXMPFiles::Initialize ( options ) ) Log::error( "XMPFiles::Initialize failed!" ); } void ShutdownDependencies() { SXMPFiles::Terminate(); SXMPMeta::Terminate(); } } //namespace XMPQE using namespace XMPQE; int main ( int argc, const char * argv[] ) { Actions action; //create Action (to fill up with parameters below...) // ============================================================================================ // ============================================================================================ // ============================================================================================ try { // on try for all //clean parameters (this is not elegant but might avoid some macPPC-side bus error bugs whatsoever action.outfile=""; action.switch_safe=false; action.switch_smart=false; action.switch_scan=false; action.switch_nocheck=false; action.switch_compact=false; action.mediafile=""; action.actiontype=Actions::NONE; action.xmpsnippet=""; //////////////////////////////////////////// // parameter verification if ( argc == 1 ) { //aka no parameters, just command itself. XMPQE::PrintUsageShort(EXENAME); return 0; } else if ( argc == 2 ) //single-paramter-call? { if ( !strcmp("help",argv[1]) || //only "help" and "version" permitted, ... !strcmp("-help",argv[1]) || !strcmp("--help",argv[1]) || !strcmp("-h",argv[1]) || !strcmp("-?",argv[1]) || !strcmp("/?",argv[1]) ) { XMPQE::PrintUsageLong(EXENAME); return 0; } else if ( !strcmp("-version",argv[1]) || !strcmp("version",argv[1]) ) { action.actiontype=Actions::VERSION; } else { //..thus fail anything else Log::error("unknown parameter %s",argv[1]); } } else //multi-argument parameters { int i=1; // "for (int i=1;i=argc) Log::error("missing output parameter, etc."); action.outfile=argv[i]; } else Log::error("unknown switch %s",argv[i]); i++; if (i>=argc) Log::error("missing action parameter, etc."); } //check mutually exclusive if (action.switch_scan && action.switch_smart) Log::error("use either -smart or -scan"); if ( !strcmp("info",argv[i])) { action.actiontype= Actions::INFO; } else if ( !strcmp("put",argv[i]) || !strcmp("inject",argv[i]) ) { action.actiontype= Actions::PUT; } else if ( !strcmp("get",argv[i]) || !strcmp("extract",argv[i]) ) { action.actiontype= Actions::GET; } else if ( !strcmp("dump",argv[i])) { action.actiontype= Actions::DUMP; } else Log::error("_unknown action %s",argv[i]); i++; //only inject needs an in-file parameter really... if ( action.actiontype== Actions::PUT) { if (i>=argc) Log::error("missing parameter"); action.xmpsnippet=argv[i]; i++; } //last argument must be mediafile if (i>=argc) Log::error("missing mediafile parameter"); action.mediafile=argv[i]; i++; if (i!=argc) Log::error("too many parameters."); } //Init =========================================================================== InitDependencies(); //Do Action ////////////////// Log log(action.outfile.c_str()); //will start logging to file (if filename given) or not ("") action.doAction(); // Shutdown ///////////////////////////////////////////// ShutdownDependencies(); } catch (XMP_Error& e ) { Log::info("Unexpected XMP_Error %s\n", e.GetErrMsg()); //throw no further, no Log::error.. ! return -2; } catch (LOG_Exception& q) { Log::info("LOG_Exception:%s\n",q.what()); return -3; } catch (std::runtime_error& p) { Log::info("caught std::runtime_error exception: %s\n",p.what()); return -4; } catch (...) { Log::info("unidentified error on action execution\n"); return -5; } // ============================================================================================ // ============================================================================================ // ============================================================================================ if (Log::noErrorsOrWarnings) return 0; //else Log::info("%s finished with warnings",EXENAME); return 10; } exempi-2.2.1/samples/source/xmpcommand/Actions.h0000664000175000017500000000337312144603625016617 00000000000000// ================================================================================================= // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #ifndef __ACTIONS_h__ #define __ACTIONS_h__ 1 // Hack because of the defines. #ifdef VERSION #undef VERSION #endif class Actions { public: enum ACTION_TYPE { NONE, VERSION, INFO, PUT, GET, DUMP }; //the params to be set: bool switch_safe; //asking for closing file with kXMPFiles_UpdateSafely (safe+rename that is) //these two mututally exclusive: bool switch_smart; /* Require the use of a smart handler. (kXMPFiles_OpenUseSmartHandler) */ bool switch_scan; /* Force packet scanning, don't use a smart handler. kXMPFiles_OpenUsePacketScanning */ bool switch_nocheck; /* no "sanity checks" on xmp-side i.e. for read/writeability, only usefull for testing "proper failure" */ bool switch_compact; /* ask extract to extract xmp in the compact (non-pretty) RDF-style (attributes rather than content of tags) */ std::string outfile;//output goes (besides stdout) to an output file... std::string mediafile; //relative path to XMP snippet (null if none) ACTION_TYPE actiontype; //inits with NONE std::string xmpsnippet; //relative path to XMP snippet (null if none) //distributes the actions to the different routines... void doAction(); private: void version(void); void info(void); void put(); void get(void); void dump(void); XMP_OptionBits generalOpenFlags; XMP_OptionBits generalCloseFlags; }; #endif exempi-2.2.1/samples/source/common/0000775000175000017500000000000012163706253014247 500000000000000exempi-2.2.1/samples/source/common/DumpFile.h0000664000175000017500000000133412150230672016037 00000000000000// ================================================================================================= // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // ================================================================================================= #ifndef XMPQE_DUMPFILE_H #define XMPQE_DUMPFILE_H #include "TagTree.h" class DumpFile { public: static void Scan( std::string filename, TagTree &tagTree, bool resetTree = true ); /* dumps file to output, no strings attached Log::info() */ static void dumpFile( std::string filename ); }; #endif exempi-2.2.1/samples/source/common/Log.cpp0000664000175000017500000001644212150230672015414 00000000000000// ================================================================================================= // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // ================================================================================================= /* * * a little set of functions for logging info, warnings, errors either to * stdout or a file (this is no class on purpose, to avoid having to pass * a particular instance on and on...) * * you can call the (static) log funcitons right away (resulting in stdout) * or create one (1!, singleton) instance first telling the outfile * recommendation: do that as a scoped variable not using new, since ~destruction == proper file closure... * (following exception-safe RAII-philosophy http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization ) * */ #ifdef WIN32 #pragma warning ( disable : 4996 ) // fopen was declared deprecated... #endif #include #include #include #include "Log.h" using namespace std; //static variables //////////////////////////////////////////////////////////////////// FILE* Log::logfile=NULL; bool Log::noErrorsOrWarnings=true; bool Log::mute=false; bool Log::muteWarnings=false; // strings for skipped test information std::string Log::skippedTestsAll; std::string Log::skippedTestsWin; std::string Log::skippedTestsMac; std::string Log::skippedTestsUnix; ////////////////////////////////////////////////////////////////////////////////////// /* standard log, use filename=NULL or filename="" or do not construct at all * for logging to stdout only * (otherwise stuff gets logged to stdout *and* to the logfile specified) */ Log::Log(const char* filename) { if (Log::logfile) { //enfore singleton printf("tried to create two logs (forbidden, singleton)"); throw LOG_Exception("tried to create two logs (forbidden, singleton)"); } if (!filename) logfile=NULL; //OLD: logfile=stdout; else if (!strcmp(filename,"")) logfile=NULL; //empty string else { logfile=fopen(filename,"wt"); if (!logfile) { printf("could not open output file %s for writing",filename); //do in addition to make sure it's output throw LOG_Exception("could not open output file for writing"); } } } Log::~Log() { if(logfile) { //info("logfile properly closed."); fclose(logfile); logfile=NULL; //BUGSOURCE: null out such that any possible following traces do not go to invalid file... } } /* * outputs to file and standardout * (Note: it would be wunderbar to group the essential output into one function, * regretably that type for "..."-paramter forwarding doesn't go down well with logging MACROS (__DATE etc...) * thus this may be the best solution */ void Log::trace(const char* format, ...) { if (Log::mute) return; va_list args; va_start(args, format); //stdout vprintf( format, args); printf( "\n"); //file if(logfile) { vfprintf( logfile, format, args); fprintf( logfile, "\n"); } va_end(args); } void Log::info(const char* format, ...) { // experience from TagTree, not encountered in Log. //note: format and ... are somehow "used up", i.e. dumping them // via vsprintf _and_ via printf brought up errors on Mac (only) // i.e. %d %X stuff looking odd (roughly like signed vs unsigned...) // buffer reuse as in (2) is fine, just dont use format/... twice. if (Log::mute) return; va_list args; va_start(args, format); //stdout vprintf( format, args); printf( "\n"); //file if(logfile) { vfprintf( logfile, format, args); fprintf( logfile, "\n"); } va_end(args); } void Log::important(const char* format, ...) { va_list args; va_start(args, format); //stdout vprintf( format, args); printf( "\n"); //file if(logfile) { vfprintf( logfile, format, args); fprintf( logfile, "\n"); } va_end(args); } void Log::infoNoLF(const char* format, ...) { if (Log::mute) return; va_list args; va_start(args, format); //stdout vprintf( format, args); //file if(logfile) { vfprintf( logfile, format, args); } va_end(args); } void Log::warn(const char* format, ...){ if (Log::muteWarnings) return; //bogus warnings or neither output nor do they 'count' noErrorsOrWarnings=false; //too bad... va_list args; va_start(args, format); //stdout printf( "warning:" ); vprintf( format, args); printf( "\n"); //file if(logfile) { fprintf( logfile, "warning:"); vfprintf( logfile, format, args); fprintf( logfile, "\n"); } va_end(args); } void Log::error(const char* format, ...){ noErrorsOrWarnings=false; //too bad... va_list args; va_start(args, format); //since many errors in test are caused by intend in testing //(so you don't want to see them), do not output directly here, //but leave that to a particular dump-Function //(which should be part of any catch(LOG_Exception)) char buffer [XMPQE_MAX_ERROR_LENGTH]; //let's hope that fits (see .h file) vsnprintf( buffer, XMPQE_MAX_ERROR_LENGTH, format, args); //if not existing on sme unix consider going back to (minimally less secure vsprintf (w/o the n)) va_end(args); throw LOG_Exception(buffer); //may throw exception ONLY, no exit()-call, for cppunit's sake } /////////////////////////////////////////////////////////////////////////////// //convenience overloads void Log::info(std::string s1) { if (Log::mute) return; info(s1.c_str()); } void Log::important(std::string s1) { info(s1.c_str()); } void Log::error( std::string s1 ) { error( s1.c_str() ); } /////////////////////////////////////////////////////////////////////////////// // skipped tests void Log::printSkippedTest(const char* filename) { std::string completeString = "Skipped Tests:"; if (!skippedTestsAll.empty()) completeString.append("

    "+skippedTestsAll + "
    all Plattforms:
    Path to Testcomment
    "); if (!skippedTestsWin.empty()) completeString.append("

    "+skippedTestsWin+ "
    Windows:
    Path to Testcomment
    "); if (!skippedTestsMac.empty()) completeString.append("

    "+skippedTestsMac+ "
    Macintosh:
    Path to Testcomment
    "); if (!skippedTestsUnix.empty()) completeString.append("

    "+skippedTestsUnix+ "
    UNIX:
    Path to Testcomment
    "); completeString.append(""); // print to console if mute is off /*if (!Log::mute) printf(completeString.c_str());*/ //print result to file FILE* outputFile=fopen(filename,"wt"); if (!outputFile) { printf("could not open output file %s for writing",filename); //do in addition to make sure it's output throw LOG_Exception("could not open output file for writing"); } fprintf( outputFile, "%s", completeString.c_str()); if(outputFile) { fclose(outputFile); } } ///////////////////////////////////////////////////////////////////////////////// // mute vs. verbose void Log::setMute() { Log::mute = true; } void Log::setVerbose() { Log::mute = false; } void Log::setMuteWarnings() { Log::muteWarnings = true; } void Log::setVerboseWarnings() { Log::muteWarnings = false; } exempi-2.2.1/samples/source/common/Log.h0000664000175000017500000000636512150230672015064 00000000000000// ================================================================================================= // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // ================================================================================================= #ifndef __Log_h__ #define __Log_h__ 1 #include "XMP_Environment.h" #include // (xcode needs stdexcept to accept class declaration below ) #include #if XMP_WinBuild #pragma warning ( disable : 4996 ) // Consider using _snprintf_s instead. #define snprintf _snprintf //#define assertMsg(msg,c) \ //if ( ! (c) ) { \ // Log::error ( "- assert that failed: %s\n- message: %s\n- " __FILE__ ":%u", #c, std::string( msg ).c_str(), __LINE__ ); \ // /* Log::error throws the exception which either fails the testcase resp. terminates dumpfile */ \ // /* important to do it this way such that both testrunner and standalone use is possible */ \ //} #endif //8K hopefully does for any type of error message #define XMPQE_MAX_ERROR_LENGTH 8*1048 class LOG_Exception : public std::runtime_error { public: LOG_Exception(const char* errorMsg) : std::runtime_error(errorMsg) { } }; class Log { public: Log(const char* filename); ~Log(void); // trace is identical to info, except that it can be turned of (soon) // ==> use trace for any non-crucial information // i.e. bits and pieces in a test // do not use for parts of known-good-output, essential summaries, etc... static void trace(const char* format, ...); // be aware of bug1741056, feeding 64bit numbers might not output correctly static void info(const char* format, ...); static void infoNoLF(const char* format, ...); static void warn(const char* format, ...); static void error(const char* format, ...); static bool noErrorsOrWarnings; //set to true, if any warnings occured //identical to info, but immune to "mute" // be aware of bug1741056, feeding 64bit numbers might not output correctly static void important(const char* format, ...); //convenience overloads: static void info(std::string s1); static void important(std::string s1); static void error( std::string s1 ); // mute vs. verbose static void setMute(); static void setVerbose(); static void setMuteWarnings(); static void setVerboseWarnings(); static bool mute; // NB: public on intend, such that i.e. copy commands can decide to // send their output to nirvana accordingly on mute==true; // (getter/setter on a static boolean var is fairly pointless) // strings to store the skipped test for different plattforms static std::string skippedTestsAll; static std::string skippedTestsWin; static std::string skippedTestsMac; static std::string skippedTestsUnix; // function to print the skipped tests on console and into a log file static void printSkippedTest(const char* filename); private: static bool singletonInstanciated; static FILE* logfile; //should only be temporarily used, i.e. on selftests that //inevitable yield (during selftet: bogus) warnings static bool muteWarnings; }; #endif exempi-2.2.1/samples/source/common/globals.h0000664000175000017500000000744612150230672015767 00000000000000// ================================================================================================= // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // ================================================================================================= #ifndef XMPQE_GLOBALS_H #define XMPQE_GLOBALS_H #include //sanity check platform/endianess #if !defined(WIN_ENV) && !defined(MAC_ENV) && !defined(UNIX_ENV) #error "XMP environment error - must define one of MAC_ENV, WIN_ENV, or UNIX_ENV" #endif #ifdef WIN_ENV #define XMPQE_LITTLE_ENDIAN 1 #elif defined(MAC_ENV) #if __BIG_ENDIAN__ #define XMPQE_BIG_ENDIAN 1 #elif __LITTLE_ENDIAN__ #define XMPQE_LITTLE_ENDIAN 1 #else #error "Neither __BIG_ENDIAN__ nor __LITTLE_ENDIAN__ is set" #endif #elif defined(UNIX_ENV) #include "XMP_UnixEndian.h" #if kBigEndianHost #define XMPQE_BIG_ENDIAN 1 #else #define XMPQE_BIG_ENDIAN 0 #endif #else #error "Unknown build environment, neither WIN_ENV nor MAC_ENV nor UNIX_ENV" #endif const static unsigned int XMPQE_BUFFERSIZE=4096; //should do for all my buffer output, but you never now (stdarg dilemma) const char OMNI_CSTRING[]={0x41,0xE4,0xB8,0x80,0x42,0xE4,0xBA,0x8C,0x43,0xC3,0x96,0x44,0xF0,0x90,0x81,0x91,0x45,'\0'}; const char BOM_CSTRING[]={0xEF,0xBB,0xBF,'\0'}; // nb: forgetting the '\0' is a very evil mistake. const std::string OMNI_STRING(OMNI_CSTRING); // if plain utf8 conversion, mac/win local encoding is a different story... const std::string OMNI_BUGINESE("ABCDE"); // if utf16LE const std::string OMNI_BUGINESE_16LE("A<00 4E>B<8C 4E>CD<00 D8 51 DC>E"); // if utf16 BE const std::string OMNI_BUGINESE_16BE("A<4E 00>B<4E 8C>C<00 D6>DE"); // degraded version of omni-strings // (sometimes useful for asserts after roundtrips, for setting values see OMNI_STRING in TestCase.h) // ==> filed bug 2302354 on this issue. #if WIN_ENV // a *wrongly* degraded omni-string (non-BMP-char to ??) const std::string DEG_OMNI_BUGINESE("A?B?CD??E"); // ditto albeit MacRoman encoding const std::string MAC_OMNI_BUGINESE("A?B?C<85>D??E"); #else // a *correctly* degraded omni-string (non-BMP-char to ?) const std::string DEG_OMNI_BUGINESE("A?B?CD?E"); // ditto albeit MacRoman encoding const std::string MAC_OMNI_BUGINESE("A?B?C<85>D?E"); #endif // -> #issue# the non-BMP character in OMNI_STRING between D and E gets converted // into two question marks (wrong) , not into one (correct) const char OEAEUE_UTF8_CSTRING[]={0xC3, 0x84, 0xC3, 0x96, 0xC3, 0x9C,'\0'}; const std::string AEOEUE_UTF8(OEAEUE_UTF8_CSTRING); const std::string AEOEUE_UTF8_BUGINESE(""); const std::string AEOEUE_WIN_LOCAL_BUGINESE(""); const std::string AEOEUE_MAC_LOCAL_BUGINESE("<80 85 86>"); const std::string AEOEUE_WIN_MOJIBAKE_BUGINESE(""); const std::string AEOEUE_MAC_MOJIBAKE_BUGINESE(""); const std::string AEOEUE_LATIN1_MOJIBAKE_BUGINESE(""); #if MAC_ENV const std::string AEOEUE_WIN_LOCAL_TO_UTF8 = AEOEUE_MAC_MOJIBAKE_BUGINESE; const std::string AEOEUE_MAC_LOCAL_TO_UTF8 = AEOEUE_UTF8_BUGINESE; #elif WIN_ENV const std::string AEOEUE_WIN_LOCAL_TO_UTF8 = AEOEUE_UTF8_BUGINESE; const std::string AEOEUE_MAC_LOCAL_TO_UTF8 = AEOEUE_WIN_MOJIBAKE_BUGINESE; #else // windows local encoding will work for UNIX (Latin1), but mac will result MOJIBAKE const std::string AEOEUE_WIN_LOCAL_TO_UTF8 = AEOEUE_UTF8_BUGINESE; const std::string AEOEUE_MAC_LOCAL_TO_UTF8 = AEOEUE_LATIN1_MOJIBAKE_BUGINESE; #endif #endif // XMPQE_GLOBALS_H exempi-2.2.1/samples/source/common/TagTree.cpp0000664000175000017500000005245512150230672016232 00000000000000// ================================================================================================= // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // ================================================================================================= /* * all legacy metadata comes in some hierarchical form * these routines help generate a tree, which is subsequently parseable (the "classic" dumpImage) * as well as queriable (primitive but workable solution) * having direct access to particluar legacy fields through unique keys (like "psir424") * enables efficient testing. tagMap is used for that. * * if keys are defined multiple times, the are named sameKey, sameKey-2, sameKey-3, sameKey-4 * allowing also specific queries on those * */ #include "TagTree.h" #include #include // silent by default bool TagTree::verbose = false; #if WIN_ENV //should preferably be within a #if XMP_WinBuild, not doable here... #pragma warning ( disable : 4996 ) // 'sprintf' was declared deprecated #include #ifndef snprintf #define snprintf _xmp_snprintf #pragma warning ( disable : 4996 ) // Consider using _snprintf_s instead. void _xmp_snprintf(char * buffer,size_t len,const char * format, ...) { va_list args; va_start(args, format); _snprintf( buffer, len, format, args); // using bad windows routine from stdio.h // and indeed named, _snprintf, no such thing as snprintf buffer[len-1] = 0; //write that trailing zero.. va_end(args); } #endif #endif //private - duplicate of Utils routine std::string itos(int i) { char cs[31]; //worst to come is 64 bit <=> 21 bytes (more likely will be 32 bit forever) snprintf(cs,30,"%d",i); //snprintf does buffer overrun check which sprintf doesn't return std::string(cs); } TagTree::TagTree() { rootNode.key="rootkey"; //all never seen rootNode.value="rootvalue"; rootNode.comment="rootcomment"; reset(); } TagTree::~TagTree() { } void TagTree::reset() { tagMap.clear(); nodeStack.clear(); rootNode.children.clear(); nodeStack.push_back(&rootNode); lastNode = NULL; } // verbosity control: void TagTree::setMute() { TagTree::verbose = false; } void TagTree::setVerbose() { TagTree::verbose = true; } void TagTree::setKeyValue(const std::string key,const std::string value, const std::string _comment) { Node* pCurNode=*nodeStack.rbegin(); //current Node pCurNode->children.push_back(Node(key,value, _comment)); if(key.size()==0) { // standalone comment? if (value.size()!=0) // must have no value Log::error("no key but value found."); return; // ==> do not add to tag-map } //find first free foo, foo-2, foo-3 (note: no foo-1) int i=1; std::string extkey=key; while( tagMap.count(extkey) ) { i++; extkey = key + "-" + itos(i); } //add to Map ----------------------------------- lastNode=&*(pCurNode->children.rbegin()); tagMap[extkey]=lastNode; if ( verbose ) Log::info( " setKeyValue( %s |-> %s) [%s]", key.c_str(), value.c_str(), _comment.c_str() ); } void TagTree::digest(LFA_FileRef file,const std::string key /*=NULL*/, void* returnValue /*=""*/, XMP_Int32 numOfBytes /*=0*/ ) { if (numOfBytes==0) { //0-byte requests *are* legitimate, reducing codeforks for the caller if ( !key.empty() ) setKeyValue(key,"(0 bytes)"); return; } //do we need own space or will it be provided? char* value; if (returnValue) value=(char*)returnValue; else value=new char[numOfBytes+1]; // require all == false => leave the throwing to this routine if (numOfBytes != LFA_Read ( file, value, numOfBytes, false)) // saying 1,4 guarantes read as ordered (4,1 would not) Log::error("could not read %d number of files (End of File reached?)",numOfBytes); char* out=new char[2 + numOfBytes*3 + 5]; //'0x12 34 45 78 ' length formula: 2 ("0x") + numOfBytes x 3 + 5 (padding) if (!key.empty()) { snprintf(out,3,"0x"); XMP_Int64 i; // *) for (i=0; i < numOfBytes; i++) snprintf(&out[2+i*3],4,"%.2X ",value[i]); //always must allow that extra 0-byte on mac (overwritten again and again) snprintf(&out[2+i*3],1,"%c",'\0'); // *) using i one more time (needed while bug 1613297 regarding snprintf not fixed) setKeyValue(key,out); } delete out; if (!returnValue) delete value; //if we own it, we delete it } //////////////////////////////////////////////////////////////////////////////////// // numeric digest routines // XMP_Int64 TagTree::digest64s(LFA_FileRef file,const std::string key /* ="" */ , bool BigEndian /*=false*/ ) { XMP_Int64 r; if (8 != LFA_Read ( file, &r, 8, false)) // require all == false => leave the throwing to this routine Log::error("could not read 8-byte value from file (end of file?)"); if ( ((kBigEndianHost==1) && !BigEndian ) || ((kBigEndianHost==0) && BigEndian )) // "XOR" Flip8(&r); if (!key.empty()) { char out[25]; //longest is "18446744073709551615", 21 chars ==> 25 snprintf(out,24,"%lld",r); //signed, mind the trailing \0 on Mac btw setKeyValue(key,out); } return r; } XMP_Uns64 TagTree::digest64u(LFA_FileRef file,const std::string key /* ="" */, bool BigEndian /*=false*/,bool hexDisplay /*=false*/ ) { XMP_Uns64 r; if (8 != LFA_Read ( file, &r, 8, false)) // require all == false => leave the throwing to this routine Log::error("could not read 8-byte value from file (end of file?)"); if ( ((kBigEndianHost==1) && !BigEndian ) || ((kBigEndianHost==0) && BigEndian )) // "XOR" Flip8(&r); if (!key.empty()) { char out[25]; //largets 64 bit no: 18446744073709551616 -1 (20 digits) if (!hexDisplay) { //not working, 0x1244e7780 ==> 609122176 decimal (== 0x244e7780) #if WIN_ENV snprintf(out , 24 , "%I64u" , r); #else // MAC, UNIX snprintf(out , 24 , "%llu" , r); #endif } else { //not working, upper 32 bit empty: #if WIN_ENV snprintf( out , 24 , "0x%.16I64X" , r ); #else snprintf( out , 24 , "0x%.16llX" , r ); #endif } setKeyValue(key,out); } return r; } XMP_Int32 TagTree::digest32s(LFA_FileRef file,const std::string key /* ="" */ , bool BigEndian /*=false*/ ) { XMP_Int32 r; if (4 != LFA_Read ( file, &r, 4, false)) // require all == false => leave the throwing to this routine Log::error("could not read 4-byte value from file (end of file?)"); if ( ((kBigEndianHost==1) && !BigEndian ) || ((kBigEndianHost==0) && BigEndian )) // "XOR" Flip4(&r); if (!key.empty()) { char out[15]; //longest signed int is "–2147483648", 11 chars snprintf(out,14,"%d",r); //signed, mind the trailing \0 on Mac btw setKeyValue(key,out); } return r; } XMP_Uns32 TagTree::digest32u(LFA_FileRef file,const std::string key /* ="" */, bool BigEndian /*=false*/,bool hexDisplay /*=false*/ ) { XMP_Uns32 r; if (4 != LFA_Read ( file, &r, 4, false)) // require all == false => leave the throwing to this routine Log::error("could not read 4-byte value from file (end of file?)"); if ( ((kBigEndianHost==1) && !BigEndian ) || ((kBigEndianHost==0) && BigEndian )) // "XOR" Flip4(&r); if (!key.empty()) { char out[19]; //longest unsigned int is "2147483648", 10 chars resp. 0xFFFFFFFF 10 chars if (!hexDisplay) snprintf(out,18,"%u",r); //unsigned, mind the trailing \0 on Mac btw else snprintf(out,18,"0x%.8X",r); //unsigned, mind the trailing \0 on Mac btw setKeyValue(key,out); } return r; } ////////////////// XMP_Int16 TagTree::digest16s(LFA_FileRef file,const std::string key /* ="" */ , bool BigEndian /*=false*/ ) { XMP_Int16 r; if (2 != LFA_Read ( file, &r, 2, false)) // require all == false => leave the throwing to this routine Log::error("could not read 2-byte value from file (end of file?)"); if ( ((kBigEndianHost==1) && !BigEndian ) || ((kBigEndianHost==0) && BigEndian )) // "XOR" Flip2(&r); if (!key.empty()) { char out[10]; //longest signed int is "–32768", 6 chars snprintf(out,9,"%d",r); setKeyValue(key,out); } return r; } XMP_Uns16 TagTree::digest16u(LFA_FileRef file,const std::string key /* ="" */, bool BigEndian /*=false*/,bool hexDisplay /*=false*/ ) { XMP_Uns16 r; if (2 != LFA_Read ( file, &r, 2, false)) // require all == false => leave the throwing to this routine Log::error("could not read 2-byte value from file (end of file?)"); if ( ((kBigEndianHost==1) && !BigEndian ) || ((kBigEndianHost==0) && BigEndian )) // "XOR" Flip2(&r); if (!key.empty()) { char out[15]; //longest unsigned int is "65536", 5 chars resp. 0xFFFF = 6 chars if (!hexDisplay) snprintf(out,14,"%u",r); else snprintf(out,14,"0x%.4X",r); setKeyValue(key,out); } return r; } ////////////////////////////////////////////////////////////////////////////////////////// // "expected" Overrides void TagTree::digest64s(XMP_Int64 expected, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/ ) { XMP_Int64 tmp=digest64s(file,"",BigEndian); if ( expected != tmp ) throw DumpFileException("'%s' was %d, expected: %d",key.c_str(),tmp,expected); } void TagTree::digest64u(XMP_Uns64 expected, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/, bool hexDisplay /*=false*/) { XMP_Uns64 tmp=digest64u( file,"",BigEndian, hexDisplay ); if (expected != tmp ) if (hexDisplay) throw DumpFileException("'%s' was 0x%.16X, expected: 0x%.16X",key.c_str(),tmp,expected); else throw DumpFileException("'%s' was %d, expected: %d",key.c_str(),tmp,expected); } void TagTree::digest32s(XMP_Int32 expected, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/ ) { XMP_Int32 tmp=digest32s(file,"",BigEndian); if ( expected != tmp ) throw DumpFileException("'%s' was %d, expected: %d",key.c_str(),tmp,expected); } void TagTree::digest32u(XMP_Uns32 expected, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/, bool hexDisplay /*=false*/) { XMP_Uns32 tmp=digest32u( file,"",BigEndian, hexDisplay ); if (expected != tmp ) if (hexDisplay) throw DumpFileException("'%s' was 0x%.8X, expected: 0x%.8X",key.c_str(),tmp,expected); else throw DumpFileException("'%s' was %d, expected: %d",key.c_str(),tmp,expected); } void TagTree::digest16s(XMP_Int16 expected, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/ ) { XMP_Int16 tmp=digest16s(file,key,BigEndian); if ( expected != tmp ) throw DumpFileException("'%s' was %d, expected: %d",key.c_str(),tmp,expected); } void TagTree::digest16u(XMP_Uns16 expected, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/, bool hexDisplay /*=false*/) { XMP_Uns16 tmp=digest16u( file,key,BigEndian, hexDisplay ); if (expected != tmp ) if (hexDisplay) throw DumpFileException("'%s' was 0x%.4X, expected: 0x%.4X",key.c_str(),tmp,expected); else throw DumpFileException("'%s' was %d, expected: %d",key.c_str(),tmp,expected); } ////////////////////////////////////////////////////////////////////////////////////////// // CBR Overrides void TagTree::digest64s(XMP_Int64* returnValue, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/ ) { *returnValue = digest64s(file,key,BigEndian); } void TagTree::digest64u(XMP_Uns64* returnValue, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/, bool hexDisplay /*=false*/) { *returnValue = digest64u( file, key,BigEndian, hexDisplay ); } void TagTree::digest32s(XMP_Int32* returnValue, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/ ) { *returnValue = digest32s(file,key,BigEndian); } void TagTree::digest32u(XMP_Uns32* returnValue, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/, bool hexDisplay /*=false*/) { *returnValue = digest32u( file, key,BigEndian, hexDisplay ); } void TagTree::digest16s(XMP_Int16* returnValue, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/ ) { *returnValue = digest16s(file,key,BigEndian); } void TagTree::digest16u(XMP_Uns16* returnValue, LFA_FileRef file,const std::string key /*=""*/, bool BigEndian /*=false*/, bool hexDisplay /*=false*/) { *returnValue = digest16u( file, key,BigEndian, hexDisplay ); } ////////////////////////////////////////////////////////////////////////////////////////// std::string TagTree::digestString(LFA_FileRef file,const std::string key /*=""*/, size_t length /* =0 */, bool verifyZeroTerm /* =false */, bool allowEarlyZeroTerm /* =false */ ) { std::string r(256,'\0'); //give some room in advance (performance) r.clear(); // safety measure (may be needed on mac) bool outside = false; // toggle-flag: outside ASCII for ( XMP_Uns32 i = 0; ( i'); r.push_back(ch); outside = false; } else { if ( (length==0) && (ch == '\0' ) ) break; // lenght zero => watch for zero termination... if ( !outside ) r.push_back('<'); //first inside else if (!((length==0) && (ch =='\0'))) r.push_back(' '); //further inside (except very last) outside = true; char tmp[4]; sprintf(tmp, "%.2X", ch ); r+=tmp; } } if ( outside ) r.push_back('>'); //last one if ( verifyZeroTerm ) { XMP_Uns8 ch = (XMP_Uns8)LFA_GetChar(file); if ( ch != 0 ) Log::error("string for key %s not terminated with zero as requested but with 0x%.2X",key.c_str(),ch); } if (!key.empty()) setKeyValue(key,r); return r; } void TagTree::comment(const std::string _comment) { setKeyValue("","", _comment); } void TagTree::comment(const char* format, ...) { char buffer[XMPQE_BUFFERSIZE]; va_list args; va_start(args, format); vsprintf(buffer, format, args); va_end(args); setKeyValue("","",buffer); } //adding a subnode to tagMap and current node //(do "go in", pushes onto nodeStack, making this the current node) void TagTree::pushNode(const std::string key) { //TODO: adding fromArgs("offset:%s",LFA_Seek( file, offset_CD ,SEEK_SET )); <== requires file to be passed in setKeyValue(key,"",""); //_and_ push reference to that one on stack Node* pCurNode=*nodeStack.rbegin(); nodeStack.push_back( &*pCurNode->children.rbegin() ); if ( verbose ) Log::info( "pushing %d: %s",nodeStack.size(), key.c_str() ); } //formatstring wrapper void TagTree::pushNode(const char* format, ...) { char buffer[XMPQE_BUFFERSIZE]; va_list args; va_start(args, format); vsprintf(buffer, format, args); va_end(args); pushNode( std::string(buffer) ); } void TagTree::addOffset(LFA_FileRef file) { // 3 points for doing it here: shortness, convenience, 64bit forks needed #if WIN_ENV addComment( "offset: 0x%I64X", LFA_Tell( file ) ); #else addComment( "offset: 0x%ll.16X", LFA_Tell( file ) ); #endif } //takes a Node off the stack // - addTag()'s will now go to the prior Node void TagTree::popNode() { // FOR DEBUGGING Log::info( "pop %d",nodeStack.size() ); if (nodeStack.size() <= 1) Log::error("nodeStack underflow: %d",nodeStack.size()); nodeStack.pop_back(); } // takes all Nodes from the stack // - the right thing to do after a parsing failure to at least dump // the partial tree till there void TagTree::popAllNodes() { while (nodeStack.size() > 1) nodeStack.pop_back(); } void TagTree::changeValue(const std::string value) { if (!lastNode) Log::error("lastnode NULL"); lastNode->value=value; } void TagTree::changeValue(const char* format, ...) { char buffer[XMPQE_BUFFERSIZE]; va_list args; va_start(args, format); vsprintf(buffer, format, args); va_end(args); changeValue( std::string(buffer) ); } void TagTree::addComment(const std::string _comment) { if (!lastNode) Log::error("lastnode NULL"); lastNode->comment=lastNode->comment + ( (lastNode->comment.size())?",":"") //only add comma, if there already is... + _comment; if ( verbose ) Log::info( " addComment: %s", _comment.c_str() ); } void TagTree::addComment(const char* format, ...) { char buffer[4096]; va_list args; va_start(args, format); vsprintf(buffer, format, args); va_end(args); addComment( std::string(buffer) ); } // ============================================================================ // Output functions // ============================================================================ // this is essentiall the last function to call... // - fileDump "end-users" should call it by just saying dumpTree() // - dumps tree to stdout (by way of Log::info) // - recursive calls, depth is used for indentation void TagTree::dumpTree(bool commentsFlag /*true*/,Node* pNode /*null*/ ,unsigned int depth /*=0*/) { if (!pNode) { //NULL --> initial node is rootNode //check (only needed on first==outermost call) that push and pop match... if (nodeStack.size()>1) Log::error("nodeStack not emptied: should be 1 but is %d",nodeStack.size()); //no need to iterate or dump rootnode itself, for( NodeList::iterator iter = rootNode.children.begin(); iter != rootNode.children.end(); iter++ ) dumpTree ( commentsFlag,&*iter, depth); //to not iterate on first level return; //...and then finally return } std::string indent(depth*2,' '); //read: tab 4 if (commentsFlag) { Log::info( "%s%s%s%s%s%s%s%s%s%s", //fancy formatting foo='bar' [re,do] indent.c_str(), pNode->key.c_str(), pNode->value.size()?" = '":"", pNode->value.c_str(), pNode->value.size()?"'":"", ( pNode->key.size() + pNode->value.size() > 0 ) ? " ":"", // standalong comments don't need extra indentation: pNode->comment.size() && ( pNode->key.size() || pNode->value.size() )? ((std::string("\n ")+indent).c_str()) : "", pNode->comment.size() && ( pNode->key.size() || pNode->value.size() ) ?"[":"", //standalone comments don't need brackets pNode->comment.c_str(), pNode->comment.size() && ( pNode->key.size() || pNode->value.size() ) ?"]":"" ); } else { //if "NoComments" mode, then make sure, there at least is a comment to avoid blankline if ( pNode->key.size() || pNode->value.size()) { Log::info( "%s%s%s%s%s", //fancy formatting foo='bar' [re,do] indent.c_str(), pNode->key.c_str(), pNode->value.size()?" = '":"", pNode->value.c_str(), pNode->value.size()?"'":"" ); } } //iterate over children (gracefully covers no-children case) for( NodeList::iterator iter = pNode->children.begin(); iter != pNode->children.end(); iter++ ) dumpTree ( commentsFlag, &*iter, depth+1); } void TagTree::dumpTagMap() { for( TagMap::iterator iter = tagMap.begin(); iter != tagMap.end(); iter++ ) { Node* pNode=((*iter).second); if (!pNode->children.size()) //supress node with children Log::info( "%s%s%s%s", //(no index string this time) pNode->key.c_str(), pNode->value.size()?" = '":"", pNode->value.c_str(), pNode->value.size()?"'":"" ); } } // shrinked copy of dumpTree (which has faithfull order) // just no commenting, indenting,...) void TagTree::dumpTagList(Node* pNode,unsigned int depth /*=0*/) { if (!pNode) { //NULL --> initial node is rootNode //check (only needed on first==outermost call) that push and pop match... if (nodeStack.size()>1) Log::error("nodeStack not emptied: should be 1 but is %d",nodeStack.size()); //no need to iterate or dump rootnode itself, for( NodeList::iterator iter = rootNode.children.begin(); iter != rootNode.children.end(); iter++ ) dumpTagList ( &*iter, depth); return; } //make sure, there at least is a comment to avoid blankline if ( pNode->key.size() || pNode->value.size()) { Log::info( "%s%s%s%s", //fancy formatting foo='bar' [re,do] pNode->key.c_str(), pNode->value.size()?" = '":"", pNode->value.c_str(), pNode->value.size()?"'":"" ); } for( NodeList::iterator iter = pNode->children.begin(); iter != pNode->children.end(); iter++ ) dumpTagList ( &*iter, depth+1); } std::string TagTree::getValue(const std::string key) { if ( !hasNode(key) ) Log::error("key %s does not exist",key.c_str()); return tagMap[key]->value; } std::string TagTree::getComment(const std::string key) { if ( !hasNode(key) ) Log::error("key %s does not exist",key.c_str()); return tagMap[key]->comment; } unsigned int TagTree::getSubNodePos( const std::string nodeKey, const std::string parentKey, int skip ) { Node* parent = NULL; if( parentKey.empty() ) { parent = &rootNode.children.front(); } else { if ( ! hasNode( parentKey ) ) Log::error( "parent key %s does not exist", parentKey.c_str() ); parent = tagMap[parentKey]; } unsigned int pos = 1; NodeListIter iter; for( iter = parent->children.begin(); iter != parent->children.end() && ( !( (iter->key == (parentKey.empty() ? nodeKey : parentKey + nodeKey)) && skip--<=0 )) ; iter++, pos++ ); if( iter == parent->children.end() ) pos = 0; return pos; } XMP_Int64 TagTree::getNodeSize( const std::string nodeKey ) { string tmp = tagMap[nodeKey]->comment; size_t startpos = tmp.find( "size" ) + 5; if( startpos == string::npos ) return 0; tmp = tmp.substr( startpos, tmp.find_first_of( ",", startpos ) ); return strtol( tmp.c_str(), NULL, 0 ); } bool TagTree::hasNode(const std::string key) { if ( tagMap.count(key)==0 ) return false; //no such node return true; } exempi-2.2.1/samples/source/common/TagTree.h0000664000175000017500000002073712150230672015675 00000000000000// ================================================================================================= // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // ================================================================================================= #ifndef TagTree_H #define TagTree_H #include #include #include #include "EndianUtils.hpp" #include "globals.h" #include "XMP_Const.h" //needed for setKV convenience functions #include "Log.h" #include "LargeFileAccess.hpp" void LFA_Throw ( const char* msg, int id ); using namespace std; // TagTree routines must be able to throw these.. class DumpFileException : public std::runtime_error { public: DumpFileException(const char* format, ...); const char* what_dumpfile_reason(); //no override, but almost.. private: static const unsigned int DUMPFILE_MAX_ERROR_LENGTH=2048; char buffer [DUMPFILE_MAX_ERROR_LENGTH+1]; }; class TagTree { private: struct Node; //forward-looking declaration typedef std::list NodeList; typedef std::list::iterator NodeListIter; struct Node { std::string key; // node structure name resp. tag name std::string value; // value if applicable/of relevance std::string comment; // comment string, add-on as many as you like NodeList children; // children of this tag, if any public: //default-constructor is an std::container requirement. DO NOT ACTUALLY USE. Node() { key=std::string("unnamed"); // should be overridden at all times value=std::string("no value"); comment=std::string("no comment"); children.clear(); // be safe (std::mac-issue..) clear beforehand } //the one to use Node(std::string _key, std::string _value, std::string _comment) { this->key = _key; this->value = _value; this->comment = _comment; children.clear(); } }; // the map (always alphabetic) to collect key-value pairs // - Node* rather than string to have access to value and comment info typedef std::map TagMap; TagMap tagMap; //used for changeValue and addComment //(NB: not null-ed or such on push+pop, thus stretches beyond) Node* lastNode; //we need a stack to iterate in and out // during build-up and dump recursion typedef std::list NodeStack; NodeStack nodeStack; Node rootNode; //TODO: ("root",""); // control verbosity to ease debugging: static bool verbose; public: TagTree(); ~TagTree(); void reset(); // verbosity control (mute by default ) =================================== void setMute(); void setVerbose(); //input functions ========================================================= void pushNode(const std::string key); void pushNode(const char* format, ...); // add file offset as comment -> own routine to better output 64 bit offsets... void addOffset(LFA_FileRef file); void popNode(); void popAllNodes(); //sets a key-value pair and optinal comment. value is also optional and may be set at a later time //can also be used to set pure, standalone comments (using key==value=="") void setKeyValue(const std::string key,const std::string value="", const std::string comment=""); // convenience functions ////////////////////////////////////////////////////////////////// // these functions read bytes (assert in file-length), dump them to screen (as hex or as number) // and optionally return the values for further processing //read, convert endianess, dump certain values all in one go: // * key - may be NULL if you just want to obtain the values but not make a KV entry // * returnValue - returns the bytes digested // * numOfBytes - 0-byte requests *are* legitimate, as they may reduce codeforks for the client void digest(LFA_FileRef file,const std::string key="", void* returnValue=NULL, XMP_Int32 numOfBytes=0); //////////////////////////////////////////////////////////////////////////////////// // numeric digest routines // // same parameters as above, plus: // * bigEndian - set to false, if the number is in the file as little endian // ( correct return value according to machine type is taken care of for either setting) // overload signed and unsigned, 32 and 16 bit // Note, again: key may be NULL if you just want to obtain the values but not make a KV entry XMP_Int64 digest64s(LFA_FileRef file,const std::string key="", bool BigEndian=false); XMP_Uns64 digest64u(LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false); XMP_Int32 digest32s(LFA_FileRef file,const std::string key="", bool BigEndian=false); XMP_Uns32 digest32u(LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false); XMP_Int16 digest16s(LFA_FileRef file,const std::string key="", bool BigEndian=false); XMP_Uns16 digest16u(LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false); // "expected" Overrides void digest64s(XMP_Int64 expected, LFA_FileRef file,const std::string key="", bool BigEndian=false); void digest64u(XMP_Uns64 expected, LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false); void digest32s(XMP_Int32 expected, LFA_FileRef file,const std::string key="", bool BigEndian=false); void digest32u(XMP_Uns32 expected, LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false); void digest16s(XMP_Int16 expected, LFA_FileRef file,const std::string key="", bool BigEndian=false); void digest16u(XMP_Uns16 expected, LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false); //CBR Overrides void digest64s(XMP_Int64* returnValue, LFA_FileRef file,const std::string key="", bool BigEndian=false); void digest64u(XMP_Uns64* returnValue, LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false); void digest32s(XMP_Int32* returnValue, LFA_FileRef file,const std::string key="", bool BigEndian=false); void digest32u(XMP_Uns32* returnValue, LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false); void digest16s(XMP_Int16* returnValue, LFA_FileRef file,const std::string key="", bool BigEndian=false); void digest16u(XMP_Uns16* returnValue, LFA_FileRef file,const std::string key="", bool BigEndian=false,bool hexDisplay=false); //8-bit string (whichever encoding -> "buginese") to std::string //use length==0 to indicate zero-termination, //otherwise indicated lenght will be grabbed also accross \0 's //(length is counted w/o trailing zero termination, i.e. length("hans")==4 ) // TODO: length default = 0 not yet implemented // verifyZeroTerm // - has an effect only if a length!=0 is given (otherwise things go up to the 0 anyway) // - in this case, asserts that the string has a terminating zero // (_after_ bytes, otherwise that byte is not read which has an impact on the filepointer!) // would throw if any zero (\0) is encountered prior to that std::string digestString(LFA_FileRef file,const std::string key="", size_t length=0, bool verifyZeroTerm=false, bool allowEarlyZeroTerm=false ); // (wrappers) // standalone comment void comment(const std::string comment); // standalone comment // be aware of bug1741056, feeding 64bit numbers might not output correctly void comment(const char* format, ...); //sometimes its worth changing (or actually setting for the first time) they current //(aka last set) key/value at a later time. includes correction in tagmap. void changeValue(const std::string value); void changeValue(const char* format, ...); //adds a comment to last prior entry ( which could be KeyValue, Node or standalone comment...) void addComment(const std::string comment); //adds a comment to last prior entry ( which could be KeyValue, Node or standalone comment...) void addComment(const char* format, ...); //output functions =========================================================== void dumpTree(bool commentsFlag=true, Node* pNode = NULL,unsigned int depth=0); void dumpTagMap(); void dumpTagList(Node* pNode = NULL,unsigned int depth=0); std::string getValue(const std::string key); std::string getComment(const std::string key); unsigned int getSubNodePos( const std::string nodeKey, const std::string parentKey = "", int skip = 0 ); XMP_Int64 getNodeSize( const std::string nodeKey ); //returns true if there is such a node, false if not, error if it happens to be key-value pair bool hasNode(const std::string key); }; #endif exempi-2.2.1/samples/source/common/DumpFile.cpp0000664000175000017500000047351212150230672016405 00000000000000// ================================================================================================= // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // ================================================================================================= // // DumpFile is suitable for both dumping an entire file structure to screen _as well as_ access to // specific to specific legacy fields (as much required for auto-testing). // // Currently supports // - JPEG // - TIFF // - PHOTOSHOP // - JPEG2K // - WMAV (ASF/WMA/WMV) // - RIFF (AVI/WAV) // - PNG // - InDesign // - MP3 // - MOV (Quicktime) // - UCF (done, including commented zips and zip64 (>4GB)) // - SWF // - FLV // - MPEG-4 // // DumpFile does depend on XMPCore and the packetscanner from XMPFiles. #include #include #include #include "globals.h" #include "DumpFile.h" #include "LargeFileAccess.hpp" static const XMP_Uns32 CONST_INFINITE=(XMP_Uns32)(-1); // converts a (supposed) 8Bit-encoded String to Buginese // - suitable for UTF-8 or any other encoding // - stopOnNull does just that, exceeding length is declared as |R:1234 at the end of string // - len is the max parsing size, defaults to unlimited // - having set neither stopOnNull nor max parsing size is a bad idea (checked and yields error) std::string convert8Bit( void* str, bool stopOnNull, XMP_Uns32 byteLen ) { std::string r; //result r.clear(); // ...I have become cautious... :-) if ( byteLen == 0 ) return r; //nothing to do //provoke access violation: //if invalid length leads to access violation, I want it here and now... if ( byteLen!=CONST_INFINITE ) { //if not "CONST_INFINITE" char tmp=((char*)str)[byteLen-1]; tmp=tmp; } if( !stopOnNull && (byteLen==CONST_INFINITE ) ) Log::error("must set either stopOnNULL or specify length of string"); bool outside = false; // toggle-flag: outside ASCII ? XMP_Uns32 remainder = 0; char buffer[200]; //changed from 20 to 200 (whatever reason there was to have it so small) for ( XMP_Uns32 i = 0; i0) { sprintf(buffer, "|R:%d", remainder ); r+=buffer; } return r; } //same story, but for (UTF-)16BE characters //note: length still to be specified in byte, thus must be even (verified) std::string convert16Bit( bool bigEndian, XMP_Uns8* str, bool stopOnNull, XMP_Uns32 byteLen ) { //if invalid length leads to access violation, I want it here and now... if ( byteLen!=CONST_INFINITE ) { char tmp=str[byteLen-1]; tmp=tmp; } if( !stopOnNull && (byteLen==CONST_INFINITE ) ) Log::error("must set either stopOnNULL or specify length of string"); if ( (byteLen!=CONST_INFINITE) && (byteLen % 2 != 0) ) //if neither CONST_INFINITE or even...# Log::error("convert16BitToBuginese: byteLen must be even"); bool outside = false; // toggle-flag: outside ASCII ? XMP_Uns32 remainder = 0; char buffer[20]; std::string r; //result r.clear(); // ...I have become cautious... :-) for ( XMP_Uns32 i = 0; i0) { sprintf(buffer, "|R:%d", remainder ); r+=buffer; } return r; } std::string fromArgs(const char* format, ...) { //note: format and ... are somehow "used up", i.e. dumping them // via vsprintf _and_ via printf brought up errors on Mac (only) // i.e. %d %X stuff looking odd (roughly like signed vs unsigned...) // buffer reuse is fine, just dont use format/... twice. char buffer[4096]; //should be big enough but no guarantees.. va_list args; va_start(args, format); vsprintf(buffer, format, args); va_end(args); return std::string(buffer); } #include #include //fpr va_list et al DumpFileException::DumpFileException(const char *format, ...) : std::runtime_error("dumpfile exception") { va_list args; va_start(args, format); vsnprintf( buffer, XMPQE_MAX_ERROR_LENGTH, format, args); va_end(args); } // overriding, since the buffer needs to be constructed first... const char* DumpFileException::what_dumpfile_reason() { return buffer; } // REMOVED ON PURPOSE: #include // define two assert macros, /w and w/o msg // (we don't want to slip malformed files through. Neither in release mode.) #undef assertMsg #undef assert //TODO: integrate file pos in parse failure description (LFA_Tell ()...) // this method just #define assertNoThrowMsg(msg,c) \ try { c } \ catch ( ... ) { \ throw DumpFileException( "- assert: %s\n- message: %s\n- location: " __FILE__ ":%u", \ #c, std::string( msg ).c_str(), __LINE__ ); \ } #define assertMsg(msg,c) \ if ( ! (c) ) { \ throw DumpFileException( "- assert: %s\n- message: %s\n- location: " __FILE__ ":%u", #c, std::string( msg ).c_str(), __LINE__ ); \ } #define assert(c) \ if ( ! (c) ) { \ throw DumpFileException( "- assert: %s\n- location: " __FILE__ ":%u", #c, __LINE__ ); \ } #define assertEOF(file) \ if ( ! LFA_isEof(file) ) { \ throw DumpFileException( "- assert: feof(file)\n- message: end of file not reached, still at 0x%X\n- location: " __FILE__ ":%u", LFA_Tell (file), __LINE__ ); \ } #define fail(msg) \ throw DumpFileException( "- failure\n- message: %s\n- location: " __FILE__ ":%u", std::string( msg ).c_str(), __LINE__ ); using namespace std; //XMPCore related //! no use of XMPFiles //! no "XMP.incl_cpp" here, happens in Dumpfile/main.cpp resp. CppUnit/main.cpp #define TXMP_STRING_TYPE std::string #include "XMP.hpp" #include "XMP_Const.h" //scanning routines - needed by PacketScan(...) routine for unknown files #include "XMPScanner.hpp" // needed for logging #include "Log.h" //disabled warning (take-over) #if XMP_WinBuild #pragma warning (disable : 4996) // '...' was declared deprecated #pragma warning (disable : 4244) // conversion from '__w64 int' to 'XMP_Uns32', possible loss of data #pragma warning (disable : 4267) // conversion from 'size_t' to 'int', possible loss of data #endif #pragma pack (1) //the tag tree to be build up, // then dumped (dumpfile.exe) resp. // resp. queried (testrunner) static TagTree* tree; // specifc 'state machine' for QT/MPEG4 dumping // * false by default (set in DumpISO() stub) static bool TimeCodeTrack; // ================================================================================================= long kOne = 1; char firstByte = *((char*)&kOne); const bool sBigEndianHost = (firstByte == 0); const bool sLittleEndianHost = (firstByte == 1); static bool beTIFF; typedef const char * ChPtr; #define CheckBytes(left,right,len) (memcmp (((ChPtr)(left)), ((ChPtr)(right)), len) == 0) static XMP_Uns8* sDataPtr = 0; // Used via CaptureFileData for variable length data. static XMP_Uns32 sDataMax = 0; static XMP_Uns32 sDataLen = 0; // storing XMP Info 'globally' for a later dump... static XMP_Uns8* sXMPPtr = 0; // Used via CaptureXMP for the main XMP. static XMP_Uns32 sXMPMax = 0; static XMP_Uns32 sXMPLen = 0; static XMP_Int64 sXMPPos = 0; typedef XMP_Uns16 (*GetUns16_Proc) ( const void * addr ); typedef XMP_Uns32 (*GetUns32_Proc) ( const void * addr ); typedef XMP_Uns64 (*GetUns64_Proc) ( const void * addr ); static XMP_Uns16 GetUns16BE ( const void * addr ); static XMP_Uns16 GetUns16LE ( const void * addr ); static XMP_Uns32 GetUns32BE ( const void * addr ); static XMP_Uns32 GetUns32LE ( const void * addr ); static XMP_Uns64 GetUns64BE ( const void * addr ); static XMP_Uns64 GetUns64LE ( const void * addr ); #define High32(u64) ((XMP_Uns32)((u64) >> 32)) #define Low32(u64) ((XMP_Uns32)((u64) & 0xFFFFFFFFUL)) // ================================================================================================= // ahead declarations static void DumpTIFF ( XMP_Uns8 * tiffContent, XMP_Uns32 tiffLen, XMP_Uns32 fileOffset, const char * label, std::string path ); static void DumpIPTC ( XMP_Uns8 * iptcOrigin, XMP_Uns32 iptcLen, XMP_Uns32 fileOffset, const char * label ); static void DumpImageResources ( XMP_Uns8 * psirOrigin, XMP_Uns32 psirLen, XMP_Uns32 fileOffset, const char * label ); static void DumpIFDChain ( XMP_Uns8 * startPtr, XMP_Uns8 * endPtr, XMP_Uns8 * tiffContent, XMP_Uns32 fileOffset, const char * label, std::string path ); // ================================================================================================= static GetUns16_Proc TIFF_GetUns16 = 0; // Keeps endian procs for the "current" TIFF. static GetUns32_Proc TIFF_GetUns32 = 0; static GetUns64_Proc TIFF_GetUns64 = 0; enum { // Special TIFF tags kTIFF_XMP = 700, kTIFF_IPTC = 33723, kTIFF_PSIR = 34377, kTIFF_Exif = 34665, kTIFF_GPS = 34853, kTIFF_MakerNote = 37500, kTIFF_Interop = 40965 }; enum { // Special Photoshop image resource IDs kPSIR_OldCaption = 1008, kPSIR_PrintCaption = 1020, kPSIR_IPTC = 1028, kPSIR_CopyrightFlag = 1034, kPSIR_CopyrightURL = 1035, kPSIR_Exif_1 = 1058, kPSIR_Exif_3 = 1059, kPSIR_XMP = 1060, kPSIR_IPTC_Digest = 1061 }; struct IPTC_DataSet { // The 5 byte header of an IPTC DataSet. XMP_Uns8 tagMarker; XMP_Uns8 recordNumber; XMP_Uns8 dataSetNumber; XMP_Uns8 octetCountHigh; XMP_Uns8 octetCountLow; }; enum { // IPTC DataSet IDs kIPTC_IntellectualGenre = 4, kIPTC_Title = 5, kIPTC_Urgency = 10, kIPTC_SubjectCode = 12, kIPTC_Category = 15, kIPTC_SuppCategory = 20, kIPTC_Keyword = 25, kIPTC_Instructions = 40, kIPTC_DateCreated = 55, kIPTC_TimeCreated = 60, kIPTC_DigitalCreationDate = 62 , kIPTC_DigitalCreationTime = 63, kIPTC_Creator = 80, kIPTC_CreatorJobtitle = 85, kIPTC_City = 90, kIPTC_Location = 92, kIPTC_State = 95, kIPTC_CountryCode = 100, kIPTC_Country = 101, kIPTC_JobID = 103, kIPTC_Headline = 105, kIPTC_Provider = 110, kIPTC_Source = 115, kIPTC_CopyrightNotice = 116, kIPTC_Description = 120, kIPTC_DescriptionWriter = 122 }; struct DataSetInfo { XMP_Uns8 id; const char * name; }; static const DataSetInfo kDataSetNames[] = { { kIPTC_IntellectualGenre, "Intellectual Genre" }, { kIPTC_Title, "Title" }, { kIPTC_Urgency, "Urgency" }, { kIPTC_SubjectCode, "Subject Code" }, { kIPTC_Category, "Category" }, { kIPTC_SuppCategory, "Supplemental Category" }, { kIPTC_Keyword, "Keyword" }, { kIPTC_Instructions, "Instructions" }, { kIPTC_DateCreated, "Date Created" }, { kIPTC_TimeCreated, "Time Created" }, { kIPTC_DigitalCreationDate, "Digital Creation Date" }, { kIPTC_DigitalCreationTime, "Digital Creation Time" }, { kIPTC_Creator, "Creator" }, { kIPTC_CreatorJobtitle, "Creator Jobtitle" }, { kIPTC_City, "City" }, { kIPTC_Location, "Location" }, { kIPTC_State, "Province-State" }, { kIPTC_CountryCode, "Country Code" }, { kIPTC_Country, "Country" }, { kIPTC_JobID, "Job ID" }, { kIPTC_Headline, "Headline" }, { kIPTC_Provider, "Provider" }, { kIPTC_Source, "Source" }, { kIPTC_CopyrightNotice, "Copyright Notice" }, { kIPTC_Description, "Description" }, { kIPTC_DescriptionWriter, "Description Writer" }, { 0, 0 } }; enum { kTIFF_Uns8 = 1, kTIFF_ASCII = 2, kTIFF_Uns16 = 3, kTIFF_Uns32 = 4, kTIFF_URational = 5, kTIFF_Int8 = 6, kTIFF_Undef8 = 7, kTIFF_Int16 = 8, kTIFF_Int32 = 9, kTIFF_SRational = 10, kTIFF_Float = 11, kTIFF_Double = 12, kTIFF_TypeEnd }; static const int sTIFF_TypeSizes[] = { 0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8 }; static const char * sTIFF_TypeNames[] = { "", "BYTE", "ASCII", "SHORT", "LONG", "RATIONAL", "SBYTE", "UNDEFINED", "SSHORT", "SLONG", "SRATIONAL", "FLOAT", "DOUBLE" }; struct TagNameInfo { long tag; const char * name; }; static const TagNameInfo sTIFF_TagNames[] = { { 256, "ImageWidth" }, { 257, "ImageLength" }, { 258, "BitsPerSample" }, { 259, "Compression" }, { 262, "PhotometricInterpretation" }, { 270, "ImageDescription" }, { 271, "Make" }, { 272, "Model" }, { 274, "Orientation" }, { 282, "XResolution" }, { 283, "YResolution" }, { 284, "PlanarConfiguration" }, { 296, "ResolutionUnit" }, { 301, "TransferFunction" }, { 305, "Software" }, { 306, "DateTime" }, { 315, "Artist" }, { 318, "WhitePoint" }, { 319, "PrimaryChromaticities" }, { 529, "YCbCrCoefficients" }, { 530, "YCbCrSubSampling" }, { 531, "YCbCrPositioning" }, { 532, "ReferenceBlackWhite" }, { 33432, "Copyright" }, { 33434, "ExposureTime" }, { 33437, "FNumber" }, { 34850, "ExposureProgram" }, { 34852, "SpectralSensitivity" }, { 34855, "ISOSpeedRatings" }, { 34856, "OECF" }, { 36864, "ExifVersion" }, { 36867, "DateTimeOriginal" }, { 36868, "DateTimeDigitized" }, { 37121, "ComponentsConfiguration" }, { 37122, "CompressedBitsPerPixel" }, { 37377, "ShutterSpeedValue" }, { 37378, "ApertureValue" }, { 37379, "BrightnessValue" }, { 37380, "ExposureBiasValue" }, { 37381, "MaxApertureValue" }, { 37382, "SubjectDistance" }, { 37383, "MeteringMode" }, { 37384, "LightSource" }, { 37385, "Flash" }, { 37386, "FocalLength" }, { 37396, "SubjectArea" }, { 37500, "MakerNote" }, { 37510, "UserComment" }, { 37520, "SubSecTime" }, { 37521, "SubSecTimeOriginal" }, { 37522, "SubSecTimeDigitized" }, { 40960, "FlashpixVersion" }, { 40961, "ColorSpace" }, { 40962, "PixelXDimension" }, { 40963, "PixelYDimension" }, { 40964, "RelatedSoundFile" }, { 41483, "FlashEnergy" }, { 41484, "SpatialFrequencyResponse" }, { 41486, "FocalPlaneXResolution" }, { 41487, "FocalPlaneYResolution" }, { 41488, "FocalPlaneResolutionUnit" }, { 41492, "SubjectLocation" }, { 41493, "ExposureIndex" }, { 41495, "SensingMethod" }, { 41728, "FileSource" }, { 41729, "SceneType" }, { 41730, "CFAPattern" }, { 41985, "CustomRendered" }, { 41986, "ExposureMode" }, { 41987, "WhiteBalance" }, { 41988, "DigitalZoomRatio" }, { 41989, "FocalLengthIn35mmFilm" }, { 41990, "SceneCaptureType" }, { 41991, "GainControl" }, { 41992, "Contrast" }, { 41993, "Saturation" }, { 41994, "Sharpness" }, { 41995, "DeviceSettingDescription" }, { 41996, "SubjectDistanceRange" }, { 42016, "ImageUniqueID" }, { 50706, "DNGVersion" }, { 50707, "DNGBackwardVersion" }, { 50708, "DNG UniqueCameraModel" }, { 0, "" } }; // ================================================================================================= struct ASF_GUID { XMP_Uns32 part1; // Written little endian. XMP_Uns16 part2; // Written little endian. XMP_Uns16 part3; // Written little endian. XMP_Uns16 part4; // Written big endian. XMP_Uns8 part5[6]; // Written in order. ASF_GUID() {}; ASF_GUID ( XMP_Uns32 p1, XMP_Uns16 p2, XMP_Uns16 p3, XMP_Uns16 p4, const void* p5 ) { part1 = GetUns32LE (&p1); part2 = GetUns16LE (&p2); part3 = GetUns16LE (&p3); part4 = GetUns16BE (&p4); memcpy (&part5, p5, 6); }; }; enum { // Objects for which we have special knowledge. kASFObj_Unknown = 0, kASFObj_Header, // Special top level objects. kASFObj_Data, kASFObj_XMP, kASFObj_FileProperties, // Children of the Header Object. kASFObj_ContentDesc, kASFObj_ContentBrand, kASFObj_ContentEncrypt, kASFObj_HeaderExtension, kASFObj_Padding }; static const ASF_GUID kASF_HeaderGUID ( 0x75B22630, 0x668E, 0x11CF, 0xA6D9, "\x00\xAA\x00\x62\xCE\x6C" ); struct ASF_ObjectInfo { ASF_GUID guid; const char * name; XMP_Uns8 kind; }; static const ASF_ObjectInfo kASF_KnownObjects[] = { { ASF_GUID (0x75B22630, 0x668E, 0x11CF, 0xA6D9, "\x00\xAA\x00\x62\xCE\x6C"), "Header", kASFObj_Header }, { ASF_GUID (0x75B22636, 0x668E, 0x11CF, 0xA6D9, "\x00\xAA\x00\x62\xCE\x6C"), "Data", kASFObj_Data }, { ASF_GUID (0xBE7ACFCB, 0x97A9, 0x42E8, 0x9C71, "\x99\x94\x91\xE3\xAF\xAC"), "XMP", kASFObj_XMP }, { ASF_GUID (0x33000890, 0xE5B1, 0x11CF, 0x89F4, "\x00\xA0\xC9\x03\x49\xCB"), "Simple_Index", 0 }, { ASF_GUID (0xD6E229D3, 0x35DA, 0x11D1, 0x9034, "\x00\xA0\xC9\x03\x49\xBE"), "Index", 0 }, { ASF_GUID (0xFEB103F8, 0x12AD, 0x4C64, 0x840F, "\x2A\x1D\x2F\x7A\xD4\x8C"), "Media_Object_Index", 0 }, { ASF_GUID (0x3CB73FD0, 0x0C4A, 0x4803, 0x953D, "\xED\xF7\xB6\x22\x8F\x0C"), "Timecode_Index", 0 }, { ASF_GUID (0x8CABDCA1, 0xA947, 0x11CF, 0x8EE4, "\x00\xC0\x0C\x20\x53\x65"), "File_Properties", kASFObj_FileProperties }, { ASF_GUID (0xB7DC0791, 0xA9B7, 0x11CF, 0x8EE6, "\x00\xC0\x0C\x20\x53\x65"), "Stream_Properties", 0 }, { ASF_GUID (0x5FBF03B5, 0xA92E, 0x11CF, 0x8EE3, "\x00\xC0\x0C\x20\x53\x65"), "Header_Extension", kASFObj_HeaderExtension }, { ASF_GUID (0x86D15240, 0x311D, 0x11D0, 0xA3A4, "\x00\xA0\xC9\x03\x48\xF6"), "Codec_List", 0 }, { ASF_GUID (0x1EFB1A30, 0x0B62, 0x11D0, 0xA39B, "\x00\xA0\xC9\x03\x48\xF6"), "Script_Command", 0 }, { ASF_GUID (0xF487CD01, 0xA951, 0x11CF, 0x8EE6, "\x00\xC0\x0C\x20\x53\x65"), "Marker", 0 }, { ASF_GUID (0xD6E229DC, 0x35DA, 0x11D1, 0x9034, "\x00\xA0\xC9\x03\x49\xBE"), "Bitrate_Mutual_Exclusion", 0 }, { ASF_GUID (0x75B22635, 0x668E, 0x11CF, 0xA6D9, "\x00\xAA\x00\x62\xCE\x6C"), "Error_Correction", 0 }, { ASF_GUID (0x75B22633, 0x668E, 0x11CF, 0xA6D9, "\x00\xAA\x00\x62\xCE\x6C"), "Content_Description", kASFObj_ContentDesc }, { ASF_GUID (0xD2D0A440, 0xE307, 0x11D2, 0x97F0, "\x00\xA0\xC9\x5E\xA8\x50"), "Extended_Content_Description", 0 }, { ASF_GUID (0x2211B3FA, 0xBD23, 0x11D2, 0xB4B7, "\x00\xA0\xC9\x55\xFC\x6E"), "Content_Branding", kASFObj_ContentBrand }, { ASF_GUID (0x7BF875CE, 0x468D, 0x11D1, 0x8D82, "\x00\x60\x97\xC9\xA2\xB2"), "Stream_Bitrate_Properties", 0 }, { ASF_GUID (0x2211B3FB, 0xBD23, 0x11D2, 0xB4B7, "\x00\xA0\xC9\x55\xFC\x6E"), "Content_Encryption", kASFObj_ContentEncrypt }, { ASF_GUID (0x298AE614, 0x2622, 0x4C17, 0xB935, "\xDA\xE0\x7E\xE9\x28\x9C"), "Extended_Content_Encryption", 0 }, { ASF_GUID (0x2211B3FC, 0xBD23, 0x11D2, 0xB4B7, "\x00\xA0\xC9\x55\xFC\x6E"), "Digital_Signature", 0 }, { ASF_GUID (0x1806D474, 0xCADF, 0x4509, 0xA4BA, "\x9A\xAB\xCB\x96\xAA\xE8"), "Padding", kASFObj_Padding }, { ASF_GUID (0x14E6A5CB, 0xC672, 0x4332, 0x8399, "\xA9\x69\x52\x06\x5B\x5A"), "Extended_Stream_Properties", 0 }, { ASF_GUID (0xA08649CF, 0x4775, 0x4670, 0x8A16, "\x6E\x35\x35\x75\x66\xCD"), "Advanced_Mutual_Exclusion", 0 }, { ASF_GUID (0xD1465A40, 0x5A79, 0x4338, 0xB71B, "\xE3\x6B\x8F\xD6\xC2\x49"), "Group_Mutual_Exclusion", 0 }, { ASF_GUID (0xD4FED15B, 0x88D3, 0x454F, 0x81F0, "\xED\x5C\x45\x99\x9E\x24"), "Stream_Prioritization", 0 }, { ASF_GUID (0xA69609E6, 0x517B, 0x11D2, 0xB6AF, "\x00\xC0\x4F\xD9\x08\xE9"), "Bandwidth_Sharing", 0 }, { ASF_GUID (0x7C4346A9, 0xEFE0, 0x4BFC, 0xB229, "\x39\x3E\xDE\x41\x5C\x85"), "Language_List", 0 }, { ASF_GUID (0xC5F8CBEA, 0x5BAF, 0x4877, 0x8467, "\xAA\x8C\x44\xFA\x4C\xCA"), "Metadata", 0 }, { ASF_GUID (0x44231C94, 0x9498, 0x49D1, 0xA141, "\x1D\x13\x4E\x45\x70\x54"), "Metadata_Library", 0 }, { ASF_GUID (0xD6E229DF, 0x35DA, 0x11D1, 0x9034, "\x00\xA0\xC9\x03\x49\xBE"), "Index_Parameters", 0 }, { ASF_GUID (0x6B203BAD, 0x3F11, 0x48E4, 0xACA8, "\xD7\x61\x3D\xE2\xCF\xA7"), "Media_Object_Index_Parameters", 0 }, { ASF_GUID (0xF55E496D, 0x9797, 0x4B5D, 0x8C8B, "\x60\x4D\xFE\x9B\xFB\x24"), "Timecode_Index_Parameters", 0 }, { ASF_GUID (0x75B22630, 0x668E, 0x11CF, 0xA6D9, "\x00\xAA\x00\x62\xCE\x6C"), "Compatibility", 0 }, { ASF_GUID (0x43058533, 0x6981, 0x49E6, 0x9B74, "\xAD\x12\xCB\x86\xD5\x8C"), "Advanced_Content_Encryption", 0 }, { ASF_GUID (0x00000000, 0x0000, 0x0000, 0x0000, "\x00\x00\x00\x00\x00\x00"), 0, 0 } }; struct ASF_ObjHeader { ASF_GUID guid; XMP_Int64 size; }; struct ASF_FileProperties { ASF_GUID guid; XMP_Int64 size; ASF_GUID fileID; XMP_Int64 fileSize; XMP_Int64 creationDate; // Number of 100-nanosecond intervals since January 1, 1601. XMP_Int64 dataPacketsCount; XMP_Int64 playDuration; XMP_Int64 sendDuration; XMP_Int64 preroll; XMP_Uns32 flags; // The Broadcast flag is bit 0 (lsb). XMP_Uns32 minDataPacketSize; XMP_Uns32 maxDataPacketSize; XMP_Uns32 maxBitrate; }; #define kASF_FilePropertiesSize (16 + 8 + 16 + 6*8 + 4*4) struct ASF_ContentDescription { ASF_GUID guid; XMP_Int64 size; XMP_Uns16 titleLen; XMP_Uns16 authorLen; XMP_Uns16 copyrightLen; XMP_Uns16 descriptionLen; XMP_Uns16 ratingLen; // Little endian UTF-16 strings follow, no BOM, possible nul terminator. }; #define kASF_ContentDescriptionSize (16 + 8 + 5*2) #if 0 // ! Has embedded variable length fields! struct ASF_ContentBranding { ASF_GUID guid; XMP_Int64 size; XMP_Uns32 bannerType; XMP_Uns32 bannerDataSize; // The banner data is here. XMP_Uns32 bannerURLSize; // The banner URL string is here, an ASCII string. XMP_Uns32 copyrightURLSize; // The copyright URL string is here, an ASCII string. }; #endif #if 0 // ! Has embedded variable length fields! struct ASF_ContentEncryption { ASF_GUID guid; XMP_Int64 size; XMP_Uns32 secretDataSize; // The secret data is here. XMP_Uns32 protectionTypeSize; // The protection type is here, an ASCII string. XMP_Uns32 keyIDSize; // The key ID is here, an ASCII string. XMP_Uns32 licenseURLSize; // The licensed URL is here, an ASCII string. }; #endif struct ASF_HeaderExtension { ASF_GUID guid; XMP_Int64 size; ASF_GUID reserved1; XMP_Uns16 reserved2; XMP_Uns32 dataLen; // The header extension data is a sequence of nested objects. }; #define kASF_HeaderExtensionSize (16 + 8 + 16 + 2 + 4) // ================================================================================================= enum { kINDD_PageSize = 4096, kINDD_LittleEndian = 1, kINDD_BigEndian = 2, kInDesignGUIDSize = 16 }; struct InDesignMasterPage { XMP_Uns8 fGUID [kInDesignGUIDSize]; XMP_Uns8 fMagicBytes [8]; XMP_Uns8 fObjectStreamEndian; XMP_Uns8 fIrrelevant1 [239]; XMP_Uns64 fSequenceNumber; XMP_Uns8 fIrrelevant2 [8]; XMP_Uns32 fFilePages; XMP_Uns8 fIrrelevant3 [3812]; }; static const XMP_Uns8 kInDesign_MasterPageGUID [kInDesignGUIDSize] = { 0x06, 0x06, 0xED, 0xF5, 0xD8, 0x1D, 0x46, 0xE5, 0xBD, 0x31, 0xEF, 0xE7, 0xFE, 0x74, 0xB7, 0x1D }; struct InDesignContigObjMarker { XMP_Uns8 fGUID [kInDesignGUIDSize]; XMP_Uns32 fObjectUID; XMP_Uns32 fObjectClassID; XMP_Uns32 fStreamLength; XMP_Uns32 fChecksum; }; static const XMP_Uns8 kINDDContigObjHeaderGUID [kInDesignGUIDSize] = { 0xDE, 0x39, 0x39, 0x79, 0x51, 0x88, 0x4B, 0x6C, 0x8E, 0x63, 0xEE, 0xF8, 0xAE, 0xE0, 0xDD, 0x38 }; // ================================================================================================= struct FileExtMapping { XMP_StringPtr ext; XMP_FileFormat format; }; const FileExtMapping kFileExtMap[] = // Add all known mappings, multiple mappings (tif, tiff) are OK. { { "pdf", kXMP_PDFFile }, { "ps", kXMP_PostScriptFile }, { "eps", kXMP_EPSFile }, { "jpg", kXMP_JPEGFile }, { "jpeg", kXMP_JPEGFile }, { "jpx", kXMP_JPEG2KFile }, { "tif", kXMP_TIFFFile }, { "tiff", kXMP_TIFFFile }, { "gif", kXMP_GIFFile }, { "giff", kXMP_GIFFile }, { "png", kXMP_PNGFile }, { "swf", kXMP_SWFFile }, { "flv", kXMP_FLVFile }, { "aif", kXMP_AIFFFile }, { "mov", kXMP_MOVFile }, { "avi", kXMP_AVIFile }, { "cin", kXMP_CINFile }, { "wav", kXMP_WAVFile }, { "mp3", kXMP_MP3File }, { "mp4", kXMP_MPEG4File }, { "ses", kXMP_SESFile }, { "cel", kXMP_CELFile }, { "wma", kXMP_WMAVFile }, { "wmv", kXMP_WMAVFile }, { "mpg", kXMP_MPEGFile }, { "mpeg", kXMP_MPEGFile }, { "mp2", kXMP_MPEGFile }, { "mod", kXMP_MPEGFile }, { "m2v", kXMP_MPEGFile }, { "mpa", kXMP_MPEGFile }, { "mpv", kXMP_MPEGFile }, { "m2p", kXMP_MPEGFile }, { "m2a", kXMP_MPEGFile }, { "m2t", kXMP_MPEGFile }, { "mpe", kXMP_MPEGFile }, { "vob", kXMP_MPEGFile }, { "ms-pvr", kXMP_MPEGFile }, { "dvr-ms", kXMP_MPEGFile }, { "html", kXMP_HTMLFile }, { "xml", kXMP_XMLFile }, { "txt", kXMP_TextFile }, { "text", kXMP_TextFile }, { "psd", kXMP_PhotoshopFile }, { "ai", kXMP_IllustratorFile }, { "indd", kXMP_InDesignFile }, { "indt", kXMP_InDesignFile }, { "aep", kXMP_AEProjectFile }, { "aet", kXMP_AEProjTemplateFile }, { "ffx", kXMP_AEFilterPresetFile }, { "ncor", kXMP_EncoreProjectFile }, { "prproj", kXMP_PremiereProjectFile }, { "prtl", kXMP_PremiereTitleFile }, { 0, kXMP_UnknownFile } }; // ! Must be last as a sentinel. // File convenience wrappers (now LFA-based) ==================================== // skip forward by bytes and verify not beyond EOF void static Skip(LFA_FileRef file, XMP_Int64 size) { // assert no more, since LFA_Seek does not return 0 to say o.k., but actual filePos // OLD assertMsg("unexpected end of file", 0 == LFA_Seek (file, size, SEEK_CUR) ); LFA_Seek(file, size, SEEK_CUR); } // going back in the file (use positive values!) // (yes redundant to above but "makes a better read") void static Rewind(LFA_FileRef file, XMP_Int64 size) { assertMsg("use positive values",size > 0); LFA_Seek (file, -size, SEEK_CUR); // ditto to above } // overload, no size parameter, rewinds to start void static Rewind(LFA_FileRef file) { LFA_Seek (file, 0, SEEK_SET); } XMP_Uns32 static Peek32u(LFA_FileRef file, bool bigEndian = false ) { XMP_Uns32 value = tree->digest32u(file, "", bigEndian ); Rewind(file, 4); return value; } // ================================================================================================= static XMP_FileFormat LookupFileExtMapping ( const char * filePath ) { std::string fileExt; size_t extPos = strlen (filePath); for ( --extPos; extPos > 0; --extPos ) if ( filePath[extPos] == '.' ) break; if ( filePath[extPos] != '.' ) return kXMP_UnknownFile; ++extPos; fileExt.assign ( &filePath[extPos] ); for ( size_t i = 0; i < fileExt.size(); ++i ) { if ( ('A' <= fileExt[i]) && (fileExt[i] <= 'Z') ) fileExt[i] += 0x20; } size_t mapPos; for ( mapPos = 0; kFileExtMap[mapPos].ext != 0; ++mapPos ) { if ( fileExt == kFileExtMap[mapPos].ext ) break; } return kFileExtMap[mapPos].format; } // LookupFileExtMapping // ================================================================================================= //*** used by in-RAM code? needs replacement? static void CaptureFileData ( LFA_FileRef file, XMP_Int64 offset, XMP_Uns32 length ) { if ( length > sDataMax ) { if ( sDataPtr != 0 ) free (sDataPtr); sDataPtr = (XMP_Uns8*) malloc (length); sDataMax = length; } if ( offset != 0 ) LFA_Seek ( file, (long)offset, SEEK_SET ); LFA_Read ( file, sDataPtr, length, true); sDataLen = length; } // CaptureFileData // ------------------------------------------------------------------------------------------------- //*** used by in-RAM code? needs replacement !!! static void CaptureXMPF ( LFA_FileRef file, XMP_Int64 offset, XMP_Uns32 length ) { if ( length > sXMPMax ) { if ( sXMPPtr != 0 ) free (sXMPPtr); sXMPPtr = (XMP_Uns8*) malloc (length); sXMPMax = length; } if ( offset != 0 ) LFA_Seek ( file, (long)offset, SEEK_SET ); LFA_Read ( file, sXMPPtr, length, true); sXMPLen = length; sXMPPos = offset; } // CaptureXMPF // ------------------------------------------------------------------------------------------------- static void CaptureXMP ( const XMP_Uns8 * xmpPtr, const XMP_Uns32 xmpLen, XMP_Int64 fileOffset ) { if ( xmpLen > sXMPMax ) { if (sXMPPtr != 0) free (sXMPPtr); sXMPPtr = (XMP_Uns8*) malloc (xmpLen); sXMPMax = xmpLen; } memcpy ( sXMPPtr, xmpPtr, xmpLen ); sXMPLen = xmpLen; sXMPPos = fileOffset; } // CaptureXMP // ------------------------------------------------------------------------------------------------- static void PrintOnlyASCII_8 ( XMP_Uns8 * strPtr, XMP_Uns32 strLen, bool stopOnNUL = true ) { //wrapping to QEBuginese // - NB: remainder (zero termination earlier then length) is catered for... tree->addComment ( convert8Bit ( strPtr, stopOnNUL, strLen ) ); } // ------------------------------------------------------------------------------------------------- // this wrap and the LE counterpart can only be inferior, since // its always added as a comment, even if value was more appropriate. // ==> callers should make use of convert16Bit directly. static void PrintOnlyASCII_16BE ( XMP_Uns16 * u16Ptr, XMP_Uns32 u16Bytes, bool stopOnNUL = true ) { tree->addComment ( convert16Bit( true, (XMP_Uns8*) u16Ptr, stopOnNUL, u16Bytes ) ); } // PrintOnlyASCII_16BE // ------------------------------------------------------------------------------------------------- static void PrintOnlyASCII_16LE ( XMP_Uns16 * u16Ptr, XMP_Uns32 u16Bytes, bool stopOnNUL = true ) { tree->addComment ( convert16Bit( false, (XMP_Uns8*) u16Ptr, stopOnNUL, u16Bytes ) ); } // PrintOnlyASCII_16LE // ================================================================================================= static const XMP_Int64 kJPEGMinSize = 4; // At least the SOI and EOI markers. static const XMP_Uns8 kJPEGStart[] = { 0xFF, 0xD8, 0xFF }; // 0xFFD8 is SOI, plus 0xFF for next marker. static const XMP_Int64 kPhotoshopMinSize = 26 + 4*4; // At least the file header and 4 section lengths. static const XMP_Uns8 kPhotoshopV1Start[] = { 0x38, 0x42, 0x50, 0x53, 0x00, 0x01 }; // 0x38425053 is "8BPS". static const XMP_Uns8 kPhotoshopV2Start[] = { 0x38, 0x42, 0x50, 0x53, 0x00, 0x02 }; static const XMP_Int64 kTIFFMinSize = 8+2+12+4; // At least the header plus 1 minimal IFD. static const XMP_Uns8 kTIFFBigStart[] = { 0x4D, 0x4D, 0x00, 0x2A }; // 0x4D is 'M', 0x2A is 42. static const XMP_Uns8 kTIFFLittleStart[] = { 0x49, 0x49, 0x2A, 0x00 }; // 0x49 is 'I'. static const XMP_Int64 kJPEG2KMinSize = 12+16; // At least the signature and minimal file type boxes. static const XMP_Uns8 kJPEG2KStart[] = { 0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A }; static const XMP_Int64 kPNGMinSize = 8 + (12+13) + 12; // At least the file header plus IHDR and IEND chunks. static const XMP_Uns8 kPNGStart[] = { 137, 80, 78, 71, 13, 10, 26, 10 }; static const XMP_Int64 kASFMinSize = 16; // ! Not really accurate, but covers the header GUID. static const XMP_Int64 kRIFFMinSize = 12; static const XMP_Int64 kInDesignMinSize = 2 * kINDD_PageSize; // Two master pages. static const XMP_Int64 kISOMediaMinSize = 16; // At least a minimal file type box. static const XMP_Uns8 kISOMediaFTyp[] = { 0x66, 0x74, 0x79, 0x70 }; // "ftyp" static const XMP_Uns32 kISOTag_ftyp = 0x66747970UL; static const XMP_Uns32 kISOBrand_mp41 = 0x6D703431UL; static const XMP_Uns32 kISOBrand_mp42 = 0x6D703432UL; static const XMP_Uns32 kISOBrand_f4v = 0x66347620UL; static const XMP_Uns32 kQTTag_XMP_ = 0x584D505FUL; static const XMP_Int64 kSWFMinSize = (8+2+4 + 2); // Header with minimal rectangle and an End tag. static const XMP_Int64 kFLVMinSize = 9; // Header with zero length data. static XMP_FileFormat CheckFileFormat ( const char * filePath, XMP_Uns8 * fileContent, XMP_Int64 fileSize ) { // ! The buffer passed to CheckFileFormat is just the first 4K bytes of the file. if ( (fileSize >= kJPEGMinSize) && CheckBytes (fileContent, kJPEGStart, 3) ) { return kXMP_JPEGFile; } if ( (fileSize >= kPhotoshopMinSize) && (CheckBytes ( fileContent, kPhotoshopV1Start, 6 ) || CheckBytes ( fileContent, kPhotoshopV2Start, 6 )) ) { return kXMP_PhotoshopFile; } if ( (fileSize >= kTIFFMinSize ) && (CheckBytes ( fileContent, kTIFFBigStart , 4 ) || CheckBytes ( fileContent, kTIFFLittleStart, 4 )) ) { return kXMP_TIFFFile; } if ( (fileSize >= kJPEG2KMinSize) && CheckBytes ( fileContent, kJPEG2KStart, 12 ) ) { return kXMP_JPEG2KFile; } if ( (fileSize >= kASFMinSize) && CheckBytes ( fileContent, &kASF_HeaderGUID, 16 ) ) { return kXMP_WMAVFile; } if ( (fileSize >= kPNGMinSize) && CheckBytes ( fileContent, kPNGStart, 8 ) ) { return kXMP_PNGFile; } if ( (fileSize >= kRIFFMinSize) && CheckBytes ( fileContent, "RIFF", 4 ) ) { if ( CheckBytes ( fileContent+8, "AVI ", 4 ) ) return kXMP_AVIFile; if ( CheckBytes ( fileContent+8, "WAVE", 4 ) ) return kXMP_WAVFile; } if ( (fileSize >= kInDesignMinSize) && CheckBytes ( fileContent, kInDesign_MasterPageGUID, kInDesignGUIDSize ) ) { return kXMP_InDesignFile; } if ( (fileSize >= kSWFMinSize) && (CheckBytes ( fileContent, "FWS", 3 ) || CheckBytes ( fileContent, "CWS", 3 )) && (fileContent[3] <= 10 /* 2007 latest is 8 */) ) { return kXMP_SWFFile; } if ( (fileSize >= kFLVMinSize) && CheckBytes ( fileContent, "FLV", 3 ) && (fileContent[3] <= 10 /* 2007 latest is 1 */) ) { return kXMP_FLVFile; } if ( (fileSize >= kISOMediaMinSize) && CheckBytes ( fileContent+4, kISOMediaFTyp, 4 ) ) { XMP_Uns32 ftypLen = GetUns32BE (fileContent); if ( ftypLen == 0 ) ftypLen = fileSize; if ( (ftypLen < kISOMediaMinSize) || (ftypLen > fileSize) || (ftypLen > 4096) ) return kXMP_UnknownFile; XMP_Uns8 * compatPtr = fileContent + 16; XMP_Uns8 * compatEnd = fileContent + ftypLen; for ( ; compatPtr < compatEnd; compatPtr += 4 ) { XMP_Uns32 compatBrand = GetUns32BE (compatPtr); if ( (compatBrand == kISOBrand_mp41) || (compatBrand == kISOBrand_mp42) ) return kXMP_MPEG4File; } } if ( (fileSize > 30) && CheckBytes ( fileContent, "\x50\x4B\x03\x04", 4 ) ) { // "PK 03 04" return kXMP_UCFFile; } // ! Do MP3 next to last. It uses the file extension if there is no ID3. if ( CheckBytes ( fileContent, "ID3", 3 ) || (LookupFileExtMapping (filePath) == kXMP_MP3File) ) return kXMP_MP3File; // ! Do MPEG (MP2) and MOV last. They use just the file extension, not content. if ( LookupFileExtMapping (filePath) == kXMP_MPEGFile ) return kXMP_MPEGFile; if ( LookupFileExtMapping (filePath) == kXMP_MOVFile ) return kXMP_MOVFile; return kXMP_UnknownFile; } // CheckFileFormat // ================================================================================================= // DumpXMP // ======= static void DumpXMP (XMP_Uns8 * xmpPtr, XMP_Uns32 xmpLen, XMP_Int64 xmpOffset, const char * label) { if (xmpOffset <= 0xFFFFFFFFL) { tree->pushNode("XMP"); tree->addComment("from %s, offset %u (0x%X), size %d", label, (XMP_Uns32)xmpOffset, (XMP_Uns32)xmpOffset, xmpLen); } else { tree->pushNode("XMP"); tree->addComment("from %s, offset %ll (0x%X-%.8X), size %d", label, High32(xmpOffset), Low32(xmpOffset), xmpLen); } //bool atStart = true; SXMPMeta xmp ((XMP_StringPtr)xmpPtr, xmpLen); xmp.Sort(); //FNO: could be reactived, but makes the dump naturally very long - harder to read for dev work //xmp.DumpObject( (DumpCallback, &atStart); tree->popNode(); } // ================================================================================================= // DumpXMP // ======= // an (old) wrapper for above function relying on static, "global" variables static void DumpXMP (const char * label) { DumpXMP (sXMPPtr, sXMPLen, sXMPPos, label); } // DumpXMP // ================================================================================================= // DumpIPTC // ======== // // The IPTC (IIM, NAA) values are in a sequence of "data sets". Each has a 5 byte header followed // by the value. There is no overall length in the sequence itself. Photoshop writes this in TIFF // as LONGs (4 byte chunks), so there might be padding at the end. static void DumpIPTC (XMP_Uns8 * iptcOrigin, XMP_Uns32 iptcLen, XMP_Uns32 fileOffset, const char * label) { tree->pushNode("IPTC data"); tree->addComment("from %s, offset %d (0x%X), size %d", label, fileOffset, fileOffset, iptcLen); // ** Compute and print the MD5 digest. XMP_Uns8 * iptcPtr = iptcOrigin; XMP_Uns8 * iptcEnd = iptcPtr + iptcLen; XMP_Uns8 * valuePtr; XMP_Uns32 valueLen; while (iptcPtr < (iptcEnd - 4)) { // ! The -4 is to skip terminal padding. IPTC_DataSet * currDS = (IPTC_DataSet*)iptcPtr; if (currDS->tagMarker != 0x1C) { tree->comment("** invalid IPTC marker **"); break; } valuePtr = iptcPtr + 5; valueLen = (currDS->octetCountHigh << 8) + currDS->octetCountLow; if ((valueLen >> 15) == 1) { int count = valueLen & 0x7FFF; valueLen = 0; for (int i = 0; i < count; ++i) valueLen = (valueLen << 8) + valuePtr[i]; valuePtr += count; } XMP_Uns32 dsOffset = fileOffset + (iptcPtr - iptcOrigin); //key come here =================== tree->setKeyValue( fromArgs("IPTC:%d:%d", currDS->recordNumber, currDS->dataSetNumber),""); tree->addComment("offset %d (0x%X), size %d", dsOffset, dsOffset, valueLen); if ((currDS->recordNumber != 1) && (currDS->recordNumber != 2)) { //LF only 1:** and 2:** bother us } else if (currDS->recordNumber == 1) { switch (currDS->dataSetNumber) { case 0 : { XMP_Uns16 version = GetUns16BE (valuePtr); tree->addComment("version = 0x%.4X", version); break; } case 90 : if (valueLen == 3) { tree->addComment("encoding = 0x%.2X%.2X%.2X", valuePtr[0], valuePtr[1], valuePtr[2]); if (memcmp (valuePtr, "\x1B\x25\x47", 3) == 0) tree->addComment(" (UTF-8)"); } break; default : break; } } else if (currDS->dataSetNumber == 0) { XMP_Uns16 version = GetUns16BE (valuePtr); tree->addComment(",Version = 0x%.4X", version); } else { int ds; for (ds = 0; kDataSetNames[ds].name != 0; ++ds) { if (currDS->dataSetNumber == kDataSetNames[ds].id) break; } if (kDataSetNames[ds].name == 0) { //LF } else { tree->addComment("%s", kDataSetNames[ds].name); tree->changeValue(convert8Bit(valuePtr,false,valueLen)); } } iptcPtr = valuePtr + valueLen; } //LF if (iptcPtr > iptcEnd) { tree->comment("** Too much IPTC data, delta %d", (long)(iptcEnd - iptcPtr)); } else { while ((iptcPtr < iptcEnd) && (*iptcPtr == 0)) ++iptcPtr; if (iptcPtr != iptcEnd) tree->comment("** Too little IPTC data, delta %d", (long)(iptcPtr - iptcEnd)); } tree->popNode(); } // DumpIPTC // ================================================================================================= static void DumpImageResources (XMP_Uns8 * psirOrigin, XMP_Uns32 psirLen, XMP_Uns32 fileOffset, const char * label) { tree->pushNode("Photoshop Image Resources"); tree->addComment("from %s, offset %d (0x%X), size %d", label, fileOffset, fileOffset, psirLen); XMP_Uns8 * psirPtr = psirOrigin; XMP_Uns8 * psirEnd = psirPtr + psirLen; XMP_Uns8 * irPtr; XMP_Uns32 irLen, irOffset; //irType replaced by irTypeStr below XMP_Uns8 * iptcPtr = 0; XMP_Uns8 * xmpPtr = 0; XMP_Uns8 * exif1Ptr = 0; XMP_Uns8 * exif3Ptr = 0; XMP_Uns32 iptcLen, xmpLen, exif1Len, exif3Len; while (psirPtr < psirEnd) { std::string irTypeStr = convert8Bit(psirPtr,false,4); //get in an endian neutral way XMP_Uns16 irID = GetUns16BE ( psirPtr+4 ); // The image resource ID. const char* irName = (XMP_StringPtr)psirPtr+6; // A Pascal string. irOffset = 6 + ((*irName + 2) & 0xFFFFFFFE); // Offset to the image resource data length. irLen = GetUns32BE (psirPtr+irOffset); irPtr = psirPtr + irOffset + 4; irOffset = fileOffset + (psirPtr - psirOrigin); if ( irTypeStr != "8BIM" ) { tree->setKeyValue( fromArgs("PSIR:%s:#%u",irTypeStr.c_str(),irID),"" ); tree->comment("(non-8BIM encountered and tolerated, see bug 1454756)"); } else if ( irID == kPSIR_IPTC ) { //**************** tree->setKeyValue("PSIR:IPTC",""); iptcPtr = irPtr; iptcLen = irLen; if (iptcPtr != 0) DumpIPTC (iptcPtr, iptcLen, (fileOffset + (iptcPtr - psirOrigin)), "PSIR #1028"); } else if (irID == kPSIR_XMP) { //**************** tree->setKeyValue("PSIR:XMP",""); xmpPtr = irPtr; xmpLen = irLen; if (xmpPtr != 0) DumpXMP (xmpPtr, xmpLen, (fileOffset + (xmpPtr - psirOrigin)), "PSIR #1060"); } else if (irID == kPSIR_Exif_1) { //**************** tree->setKeyValue("PSIR:Exif-1",""); exif1Ptr = irPtr; exif1Len = irLen; DumpTIFF (exif1Ptr, exif1Len, (fileOffset + (exif1Ptr - psirOrigin)), "PSIR #1058 (Exif 1)", "PSIR:Exif-1"); } else if (irID == kPSIR_Exif_3) { //**************** tree->setKeyValue("PSIR:Exif-3",""); exif3Ptr = irPtr; exif3Len = irLen; if (exif3Ptr != 0) DumpTIFF (exif3Ptr, exif3Len, (fileOffset + (exif3Ptr - psirOrigin)), "PSIR #1059 (Exif 3)", "PSIR:Exif-3"); } else if (irID == kPSIR_IPTC_Digest) { tree->setKeyValue("PSIR:IPTC digest", fromArgs("%.8X-%.8X-%.8X-%.8X", GetUns32BE(irPtr), GetUns32BE(irPtr+4), GetUns32BE(irPtr+8), GetUns32BE(irPtr+12) ) ); } else if (irID == kPSIR_CopyrightFlag) { bool copyrighted = (*irPtr != 0); tree->setKeyValue("PSIR:copyrighted",(copyrighted ? "yes" : "no")); } else if (irID == kPSIR_CopyrightURL) { tree->setKeyValue("PSIR:copyright URL",convert8Bit(irPtr,true,irLen)); } else if (irID == kPSIR_OldCaption) { tree->setKeyValue("PSIR:old caption",convert8Bit(irPtr,true,irLen)); } else if (irID == kPSIR_PrintCaption) { tree->comment("** obsolete print caption **"); } else { tree->setKeyValue( fromArgs("PSIR:%s:#%d",irTypeStr.c_str(),irID), "" ); } tree->addComment("offset %d (0x%X), size %d", irOffset, irOffset, irLen); if (*irName != 0) tree->addComment("\"%.*s\"", (int)(*irName), (irName+1)); psirPtr = irPtr + ((irLen + 1) & 0xFFFFFFFE); // Round the length to be even. } //while-loop if (psirPtr != psirEnd) { tree->addComment("** Unexpected end of image resources, delta %d", (long)(psirPtr - psirEnd)); } //NB: dump routines moved up into if-else's tree->popNode(); } // DumpImageResources // ================================================================================================= static void DumpOneIFD (int ifdIndex, XMP_Uns8 * ifdPtr, XMP_Uns8 * endPtr, XMP_Uns8 * tiffContent, XMP_Uns32 fileOffset, const char * label, std::string path) { XMP_Uns8 * exifPtr = 0; XMP_Uns8 * gpsPtr = 0; XMP_Uns8 * interopPtr = 0; XMP_Uns8 * makerNotePtr = 0; XMP_Uns8 * psirPtr = 0; XMP_Uns8 * iptcPtr = 0; XMP_Uns8 * xmpPtr = 0; XMP_Uns32 psirLen = 0; XMP_Uns32 iptcLen = 0; XMP_Uns32 xmpLen = 0; XMP_Uns32 ifdOffset = ifdPtr - tiffContent; XMP_Uns16 fieldCount = TIFF_GetUns16 (ifdPtr); XMP_Uns32 ifdLen = 2 + (12 * fieldCount) + 4; XMP_Uns32 nextIFD = TIFF_GetUns32 (ifdPtr+ifdLen-4); tree->pushNode("TIFF IFD #%d from %s",ifdIndex,label); tree->addComment("offset %d (0x%X), tag count %d", (ifdOffset + fileOffset), (ifdOffset + fileOffset), fieldCount); if (nextIFD == 0) { tree->comment("end of IFD chain"); } else { tree->comment("next IFD offset %d (0x%X)", (nextIFD + fileOffset), (nextIFD + fileOffset)); } XMP_Uns16 prevTag = 0; XMP_Uns8 * fieldPtr = tiffContent+ifdOffset+2; if (!path.empty()) path.append("/"); path.append(fromArgs("IFD%d", ifdIndex)); for (int i = 0; i < fieldCount; ++i, fieldPtr += 12) { XMP_Uns16 fieldTag = TIFF_GetUns16 (fieldPtr); XMP_Uns16 fieldType = TIFF_GetUns16 (fieldPtr+2); XMP_Uns32 valueCount = TIFF_GetUns32 (fieldPtr+4); XMP_Uns32 valueOffset = TIFF_GetUns32 (fieldPtr+8); XMP_Uns8 * valuePtr = ifdPtr - ifdOffset + valueOffset; XMP_Uns32 valueLen = 0; if (fieldType < kTIFF_TypeEnd) valueLen = valueCount * sTIFF_TypeSizes[fieldType]; if (valueLen <= 4) valuePtr = fieldPtr + 8; //===================== adding key here tree->setKeyValue( fromArgs("%s/TIFF:%d",path.c_str(), fieldTag) ); if ((fieldType < 1) || (fieldType >= kTIFF_TypeEnd)) { tree->addComment("type %d", fieldType); } else { tree->addComment("%s", sTIFF_TypeNames[fieldType]); } tree->addComment("count %d, value size %d", valueCount, valueLen); if (valueLen > 4) { tree->addComment("value offset %d (0x%X)", (valueOffset + fileOffset), (valueOffset + fileOffset)); } else { XMP_Uns32 rawValue = GetUns32BE (fieldPtr+8); tree->addComment("value in IFD (0x%.8X)", rawValue); } if (fieldTag == kTIFF_Exif) { tree->addComment("Exif IFD offset"); exifPtr = tiffContent + TIFF_GetUns32 (valuePtr); // Value is Exif IFD offset. } else if (fieldTag == kTIFF_GPS) { tree->addComment("GPS IFD offset"); gpsPtr = tiffContent + TIFF_GetUns32 (valuePtr); // Value is GPS IFD offset. } else if (fieldTag == kTIFF_Interop) { tree->addComment("Interoperability IFD offset"); interopPtr = tiffContent + TIFF_GetUns32 (valuePtr); // Value is Interoperability IFD offset. } else if (fieldTag == kTIFF_MakerNote) { // Decide if the Maker Note might be formatted as an IFD. tree->addComment("Maker Note"); XMP_Uns32 itemCount = (valueLen - 6) / 12; if ((valueLen >= 18) && (valueLen == (6 + itemCount*12)) && (itemCount == TIFF_GetUns16 (valuePtr)) && (TIFF_GetUns32 (valuePtr+2+(12*itemCount)) == 0)) { makerNotePtr = valuePtr; } } else if (fieldTag == kTIFF_PSIR) { tree->addComment("PSIR"); psirPtr = valuePtr; psirLen = valueLen; } else if (fieldTag == kTIFF_IPTC) { tree->addComment("IPTC"); iptcPtr = valuePtr; iptcLen = valueLen; } else if (fieldTag == kTIFF_XMP) { tree->addComment("XMP"); if (fieldType == kTIFF_ASCII) fieldType = kTIFF_Uns8; // Avoid displaying the raw packet for mis-typed XMP. xmpPtr = valuePtr; xmpLen = valueLen; } else { for (int j = 0; sTIFF_TagNames[j].tag != 0; ++j) { if (sTIFF_TagNames[j].tag == fieldTag) { tree->addComment("%s", sTIFF_TagNames[j].name); break; } } } XMP_Uns8 value8; XMP_Uns16 value16; XMP_Uns32 value32; XMP_Uns32 denom; std::string tempStr; char cs[31]; switch (fieldType) { case kTIFF_Uns8 : if (valueCount == 1) { value8 = *valuePtr; tree->addComment("hex value = 0x%.2X", value8); tree->changeValue("%u",value8); } break; case kTIFF_ASCII : tree->changeValue(convert8Bit(valuePtr,false /* internal NULs OK*/,valueLen)); break; case kTIFF_Uns16 : if (valueCount == 1) { value16 = TIFF_GetUns16 (valuePtr); tree->addComment("hex value = 0x%.4X", value16); tree->changeValue("%u",value16); } break; case kTIFF_Uns32 : if (valueCount == 1) { value32 = TIFF_GetUns32 (valuePtr); tree->addComment("hex value = 0x%.8X", value32); tree->changeValue( "%u" , value32); } break; case kTIFF_URational : for( unsigned int j = 0; j < valueCount ; j++) { value32 = TIFF_GetUns32 (valuePtr+(j*8)); denom = TIFF_GetUns32 (valuePtr+(j*8)+4); snprintf(cs,30,"%u",value32); tempStr += cs; tempStr += "/"; snprintf(cs,30,"%u",denom); tempStr += cs; if(j < valueCount-1) tempStr += ";"; } if(tempStr.length() > 0) tree->changeValue( tempStr ); break; case kTIFF_Int8 : if (valueCount == 1) { value8 = *valuePtr; //fno: show the hex value unsigned (memory representation)´and the decimal signed tree->addComment("hex value 0x%.2X", value8); tree->changeValue( "%d" , *((XMP_Int8*)&value8)); } break; case kTIFF_Undef8 : if ( valueCount == 1 ) { value8 = *valuePtr; tree->changeValue( "0x%.2X", value8 ); } else if ( fieldTag == 36864 ) { // ExifVersion tree->changeValue( "%.*s", valueCount, valuePtr ); } else if ( fieldTag == 37510 ) { // UserComment XMP_Uns8 * encPtr = valuePtr; valuePtr += 8; valueCount -= 8; sprintf(cs,"encoding = %.8s", encPtr ); tempStr += cs; if ( ! CheckBytes ( encPtr, "UNICODE\0", 8 ) ) { tree->changeValue( convert8Bit ( valuePtr, false, valueCount ) ); } else { bool doBE = beTIFF; if ( CheckBytes ( valuePtr, "\xFE\xFF", 2 ) ) { doBE = true; valuePtr += 2; valueCount -= 2; tempStr += ", BE BOM"; } if ( CheckBytes ( valuePtr, "\xFF\xFE", 2 ) ) { doBE = false; valuePtr += 2; valueCount -= 2; tempStr += ", LE BOM"; } if ( doBE ) { tree->changeValue( convert16Bit( true, (XMP_Uns8*) valuePtr, false, valueCount ) ); //PrintOnlyASCII_16BE ( (XMP_Uns16*)valuePtr, valueCount, ", value =", false /* ! stopOnNUL */ ); } else { tree->changeValue( convert16Bit( false, (XMP_Uns8*) valuePtr, false, valueCount ) ); //PrintOnlyASCII_16LE ( (XMP_Uns16*)valuePtr, valueCount, ", value =", false /* ! stopOnNUL */ ); } } } if(tempStr.length() > 0) tree->addComment( tempStr ); break; case kTIFF_Int16 : if (valueCount == 1) { value16 = TIFF_GetUns16 (valuePtr); tree->changeValue("%d (0x%.4X)", *((XMP_Int16*)&value16), value16); } break; case kTIFF_Int32 : if (valueCount == 1) { value32 = TIFF_GetUns32 (valuePtr); tree->changeValue("%d (0x%.8X)", *((XMP_Int32*)&value32), value32); } break; case kTIFF_SRational : if (valueCount == 1) { value32 = TIFF_GetUns32 (valuePtr); denom = TIFF_GetUns32 (valuePtr+4); tree->changeValue("%d/%d", *((XMP_Int32*)&value32), *((XMP_Int32*)&denom)); } break; case kTIFF_Float : break; case kTIFF_Double : break; default : tree->addComment("** unknown type **"); break; } if (fieldTag == prevTag) { tree->addComment("** Repeated tag **"); } else if (fieldTag < prevTag) { tree->addComment("** Out of order tag **"); } prevTag = fieldTag; } if (exifPtr != 0) { DumpIFDChain (exifPtr, endPtr, tiffContent, (fileOffset + (exifPtr - tiffContent)), "TIFF tag #34665 (Exif IFD)", path+"/TIFF:34665"); } if (gpsPtr != 0) { DumpIFDChain (gpsPtr, endPtr, tiffContent, (fileOffset + (gpsPtr - tiffContent)), "TIFF tag #34853 (GPS Info IFD)", path+"/TIFF:34853"); } if (interopPtr != 0) { DumpIFDChain (interopPtr, endPtr, tiffContent, (fileOffset + (interopPtr - tiffContent)), "TIFF tag #40965 (Interoperability IFD)", path+"/TIFF:40965"); } if (makerNotePtr != 0) { DumpIFDChain (makerNotePtr, endPtr, tiffContent, (fileOffset + (makerNotePtr - tiffContent)), "TIFF tag #37500 (Maker Note)", path+"/TIFF:37500"); } if (iptcPtr != 0) { DumpIPTC (iptcPtr, iptcLen, (fileOffset + (iptcPtr - tiffContent)), "TIFF tag #33723"); } if (psirPtr != 0) { DumpImageResources (psirPtr, psirLen, (fileOffset + (psirPtr - tiffContent)), "TIFF tag #34377"); } if (xmpPtr != 0) { DumpXMP (xmpPtr, xmpLen, (fileOffset + (xmpPtr - tiffContent)), "TIFF tag #700"); } tree->popNode(); } // DumpOneIFD // ================================================================================================= static void DumpIFDChain (XMP_Uns8 * startPtr, XMP_Uns8 * endPtr, XMP_Uns8 * tiffContent, XMP_Uns32 fileOrigin, const char * label, std::string path) { XMP_Uns8 * ifdPtr = startPtr; XMP_Uns32 ifdOffset = startPtr - tiffContent; for (size_t ifdIndex = 0; ifdOffset != 0; ++ifdIndex) { if ((ifdPtr < tiffContent) || (ifdPtr >= endPtr)) { ifdOffset = fileOrigin + (ifdPtr - tiffContent); tree->comment("** Invalid IFD offset, %d (0x%X) tree.", ifdOffset, ifdOffset); return; } XMP_Uns16 fieldCount = TIFF_GetUns16 (ifdPtr); DumpOneIFD (ifdIndex, ifdPtr, endPtr, tiffContent, fileOrigin, label, path); ifdOffset = TIFF_GetUns32 (ifdPtr+2+(12*fieldCount)); ifdPtr = tiffContent + ifdOffset; } } // DumpIFDChain // ================================================================================================= static void DumpTIFF (XMP_Uns8 * tiffContent, XMP_Uns32 tiffLen, XMP_Uns32 fileOffset, const char * label, std::string path) { // ! TIFF can be nested because of the Photoshop 6 weiredness. Save and restore the procs. GetUns16_Proc save_GetUns16 = TIFF_GetUns16; GetUns32_Proc save_GetUns32 = TIFF_GetUns32; GetUns64_Proc save_GetUns64 = TIFF_GetUns64; if (CheckBytes(tiffContent,"II\x2A\x00",4)) { beTIFF = false; TIFF_GetUns16 = GetUns16LE; TIFF_GetUns32 = GetUns32LE; TIFF_GetUns64 = GetUns64LE; tree->addComment("Little endian "); } else if (CheckBytes(tiffContent,"MM\x00\x2A",4)) { beTIFF = true; TIFF_GetUns16 = GetUns16BE; TIFF_GetUns32 = GetUns32BE; TIFF_GetUns64 = GetUns64BE; tree->addComment("Big endian "); } else { tree->comment("** Missing TIFF image file header tree."); return; } tree->addComment("TIFF from %s, offset %d (0x%X), size %d", label, fileOffset, fileOffset, tiffLen); XMP_Uns32 ifdOffset = TIFF_GetUns32 (tiffContent+4); DumpIFDChain (tiffContent+ifdOffset, tiffContent+tiffLen, tiffContent, fileOffset, label, path); TIFF_GetUns16 = save_GetUns16; TIFF_GetUns32 = save_GetUns32; TIFF_GetUns64 = save_GetUns64; } // DumpTIFF // ================================================================================================= static void DumpPhotoshop (XMP_Uns8 * psdContent, XMP_Uns32 psdLen) { psdLen=psdLen; // Avoid unused parameter warning. XMP_Uns32 psirOffset = 26 + 4 + GetUns32BE (psdContent+26); XMP_Uns8 * psirSect = psdContent + psirOffset; XMP_Uns8 * psirPtr = psirSect + 4; XMP_Uns32 psirLen = GetUns32BE (psirSect); DumpImageResources (psirPtr, psirLen, (psirPtr - psdContent), "Photoshop file"); } // DumpPhotoshop // ================================================================================================= static void DumpJPEG (XMP_Uns8 * jpegContent, XMP_Uns32 jpegLen) { XMP_Uns8 * endPtr = jpegContent + jpegLen; XMP_Uns8 * segPtr = jpegContent; XMP_Uns32 segOffset; XMP_Uns8 * xmpPtr = 0; XMP_Uns8 * psirPtr = 0; XMP_Uns8 * exifPtr = 0; XMP_Uns16 xmpLen = 0; XMP_Uns16 psirLen = 0; XMP_Uns16 exifLen = 0; while (segPtr < endPtr) { // ---------------------------------------------------------------- XMP_Uns16 segMark = GetUns16BE (segPtr); if (segMark == 0xFFFF) { segPtr += 1; // Skip leading 0xFF pad byte. continue; } XMP_Uns16 minorKind = segMark & 0x000F; segOffset = segPtr - jpegContent; tree->pushNode("JPEG:%.4X",segMark); tree->addComment("offset %d (0x%X)", segOffset, segOffset); if (((segMark >> 8) != 0xFF) || (segMark == 0xFF00)) { tree->addComment("** invalid JPEG marker **"); tree->popNode(); break; } // Check for standalone markers first, only fetch the length for marker segments. if (segMark == 0xFF01) { tree->addComment("** TEM **"); segPtr += 2; // A standalone marker. tree->popNode(); continue; } else if ((0xFFD0 <= segMark) && (segMark <= 0xFFD7)) { tree->addComment(fromArgs("RST%d ** unexpected **", minorKind)); segPtr += 2; // A standalone marker. tree->popNode(); continue; } else if (segMark == 0xFFD8) { tree->addComment("SOI"); segPtr += 2; // A standalone marker. tree->popNode(); continue; } else if (segMark == 0xFFD9) { tree->addComment("EOI"); segPtr += 2; // A standalone marker. tree->popNode(); break; // Exit on EOI. } XMP_Uns16 segLen = GetUns16BE (segPtr+2); // figure out Exif vs PSIR vs XMP if ((0xFFE0 <= segMark) && (segMark <= 0xFFEF)) { const char* segName = (const char *)(segPtr+4); tree->addComment(fromArgs("size %d, APP%d, \"%s\"", segLen, minorKind, segName)); if ((minorKind == 1) && ((memcmp(segName,"Exif\0\0",6) == 0) || (memcmp(segName,"Exif\0\xFF",6) == 0))) { tree->addComment("EXIF"); tree->changeValue("EXIF"); exifPtr = segPtr + 4 + 6; exifLen = segLen - 2 - 6; } else if ((minorKind == 13) && (strcmp(segName,"Photoshop 3.0") == 0)) { tree->addComment("PSIR"); tree->changeValue("PSIR"); psirPtr = segPtr + 4 + strlen(segName) + 1; psirLen = (XMP_Uns16)(segLen - 2 - strlen(segName) - 1); } else if ((minorKind == 1) && (strcmp(segName,"http://ns.adobe.com/xap/1.0/") == 0)) { tree->addComment("XMP"); tree->changeValue("XMP"); xmpPtr = segPtr + 4 + strlen(segName) + 1; xmpLen = (XMP_Uns16)(segLen - 2 - strlen(segName) - 1); } segPtr += 2+segLen; tree->popNode(); continue; } if (segMark == 0xFFDA) { tree->addComment(fromArgs("size %d, SOS", segLen)); segPtr += 2+segLen; // Skip the SOS marker segment itself long rstCount = 0; while (segPtr < endPtr) { // Skip the entropy-coded data and RSTn markers. if (*segPtr != 0xFF) { segPtr += 1; // General data byte. } else { segMark = GetUns16BE (segPtr); if (segMark == 0xFF00) { segPtr += 2; // Padded 0xFF data byte. } else if ((segMark < 0xFFD0) || (segMark > 0xFFD7)) { segLen = 0; segPtr -= 2; // Prepare for the increment in the outer loop. break; // Exit, non-RSTn marker. } else { ++rstCount; segPtr += 2; } } } tree->addComment(fromArgs("%d restart markers", rstCount)); segPtr += 2+segLen; tree->popNode(); continue; } if ((0xFF02 <= segMark) && (segMark <= 0xFFBF)) { tree->addComment(fromArgs("size %d, ** RES **", segLen)); } else if ((0xFFC0 <= segMark) && (segMark <= 0xFFC3)) { tree->addComment(fromArgs("size %d, SOF%d", segLen, minorKind)); } else if (segMark == 0xFFC4) { tree->addComment(fromArgs("size %d, DHT", segLen)); } else if ((0xFFC5 <= segMark) && (segMark <= 0xFFC7)) { tree->addComment(fromArgs("size %d, SOF%d", segLen, minorKind)); } else if (segMark == 0xFFC8) { tree->addComment(fromArgs("size %d, JPG", segLen)); } else if ((0xFFC9 <= segMark) && (segMark <= 0xFFCB)) { tree->addComment(fromArgs("size %d, SOF%d", segLen, minorKind)); } else if (segMark == 0xFFCC) { tree->addComment(fromArgs("size %d, DAC", segLen)); } else if ((0xFFCD <= segMark) && (segMark <= 0xFFCF)) { tree->addComment(fromArgs("size %d, SOF%d", segLen, minorKind)); } else if (segMark == 0xFFDB) { tree->addComment(fromArgs("size %d, DQT", segLen)); } else if (segMark == 0xFFDC) { tree->addComment(fromArgs("size %d, DNL", segLen)); } else if (segMark == 0xFFDD) { tree->addComment(fromArgs("size %d, DRI", segLen)); } else if (segMark == 0xFFDE) { tree->addComment(fromArgs("size %d, DHP", segLen)); } else if (segMark == 0xFFDF) { tree->addComment(fromArgs("size %d, EXP", segLen)); } else if ((0xFFF0 <= segMark) && (segMark <= 0xFFFD)) { tree->addComment(fromArgs("size %d, JPG%d", segLen, minorKind)); } else if (segMark == 0xFFFE) { tree->addComment(fromArgs("size %d, COM", segLen)); } else { tree->addComment("** UNRECOGNIZED MARKER **"); } segPtr += 2+segLen; tree->popNode(); } // ------------------------------------------------------------------------------------ if (segPtr != endPtr) { segOffset = segPtr - jpegContent; tree->addComment(fromArgs( "** Unexpected end of JPEG markers at offset %d (0x%X), delta %d tree.", segOffset, segOffset, (long)(endPtr-segPtr) )); } if (exifPtr != 0) DumpTIFF (exifPtr, exifLen, (exifPtr - jpegContent), "JPEG Exif APP1", "JPEG:APP1"); if (psirPtr != 0) DumpImageResources (psirPtr, psirLen, (psirPtr - jpegContent), "JPEG Photoshop APP13"); if (xmpPtr != 0) DumpXMP (xmpPtr, xmpLen, (xmpPtr - jpegContent), "JPEG XMP APP1"); } // DumpJPEG // ================================================================================================= static const XMP_Uns8 kUUID_XMP[16] = { 0xBE, 0x7A, 0xCF, 0xCB, 0x97, 0xA9, 0x42, 0xE8, 0x9C, 0x71, 0x99, 0x94, 0x91, 0xE3, 0xAF, 0xAC }; static const XMP_Uns8 kUUID_Exif[16] = { 0x05, 0x37, 0xCD, 0xAB, 0x9D, 0x0C, 0x44, 0x31, 0xA7, 0x2A, 0xFA, 0x56, 0x1F, 0x2A, 0x11, 0x3E }; static const XMP_Uns8 kUUID_IPTC[16] = { 0x09, 0xA1, 0x4E, 0x97, 0xC0, 0xB4, 0x42, 0xE0, 0xBE, 0xBF, 0x36, 0xDF, 0x6F, 0x0C, 0xE3, 0x6F }; static const XMP_Uns8 kUUID_PSIR[16] = { 0x2C, 0x4C, 0x01, 0x00, 0x85, 0x04, 0x40, 0xB9, 0xA0, 0x3E, 0x56, 0x21, 0x48, 0xD6, 0xDF, 0xEB }; // ------------------------------------------------------------------------------------------------- /** * helper routine to get past the version and flags field... */ static void digestISOFullBoxExtension ( LFA_FileRef file, std::string isoPath, XMP_Int64& remainingSize, XMP_Uns8& version, XMP_Uns32& flags ) { version = LFA_ReadUns8( file ); flags = 0; LFA_Read( file, &flags, 3, true ); // read only 3 byte! flags = flags >> 8; // (move to bit 0-23) remainingSize -= 4; tree->setKeyValue( isoPath + "version", fromArgs( "%d", version) ); tree->setKeyValue( isoPath + "flags", fromArgs( "0x%.8X", flags) ); } static void digestInternationalTextSequence ( LFA_FileRef file, std::string isoPath, XMP_Int64* remainingSize ) { XMP_Int64 miniBoxStringSize = tree->digest16u(file,isoPath+"size",true,true); tree->digest16u(file,isoPath+"language code",true,true); (*remainingSize) -= 4; if ( (*remainingSize) != miniBoxStringSize ) tree->addComment("WARNING: boxSize and miniBoxSize differ!"); tree->digestString( file, isoPath+"value", miniBoxStringSize, false ); } /** * dumps one *or several* (ohter while loop) ISO Boxes within the indicated space: * * maxBoxLen is :== fileLen on top-level, otherwise available length of outer box (exluding header size naturally) * * (NB: reading (and displaying) box types, compat brands and other 4-letter stuff * as LE is somehow easier (might need adjustment for PPC though) * * practices: * compensate endianess using MakeUns32BE() prior to use as string, NOT for numeric compare */ static void DumpISOBoxes ( LFA_FileRef file, XMP_Uns32 maxBoxLen, std::string _isoPath ) { XMP_Int64 endOfThisLevel = LFA_Tell(file) + maxBoxLen; std::string origIsoPath( _isoPath ); std::string isoPath( _isoPath ); while ( LFA_Tell(file) < endOfThisLevel ) { XMP_Int64 boxHeaderSize = 8; //assertMsg("No space for ISO box header", boxHeaderSize <= maxBoxLen ); //// certainly not enough room for another box? // could be a 32bit zero trailing a udta // or, uhm, something garbage-ish... if ( LFA_Tell(file) + boxHeaderSize > endOfThisLevel ) { XMP_Int64 numUnusedBytes = (LFA_Tell(file) + boxHeaderSize - endOfThisLevel); tree->digestString( file, isoPath+"unused", numUnusedBytes, false ); tree->addComment( "'free' since too small for a box" ); bool ok; LFA_Seek( file, maxBoxLen, SEEK_CUR, &ok ); assertMsg("skippind to-small space failed (truncated file?)", ok ); continue; // could just as well: return } XMP_Int64 boxPos= LFA_Tell( file ); // store here, output below XMP_Int64 boxSize = tree->digest32u( file, "", true ); // NB: 32bit <- 64bit XMP_Uns32 boxType = tree->digest32u( file, "", false ); switch (boxSize) { case 0: // A value of zero says that the box extends to the end of the file. boxSize = ( maxBoxLen - boxPos ); // *** could be errorneous below top-level break; case 1: // A value of 1 says that a 64-bit big endian size is written after the box type field, the data follows. boxSize = LFA_ReadUns64_BE( file ); boxHeaderSize += 8; break; default: break; } std::string boxString( fromArgs( "%.4s" , &boxType ) ); // substitute mac-copyright signs with an easier-to-handle "(c)" if ( boxString.at(0) == 0xA9 ) boxString = std::string("(c)") + boxString.substr(1); isoPath = origIsoPath + boxString + "/"; // TEMP // Log::info("pushing %s, endOfThisLevel: 0x%X", isoPath.c_str(), endOfThisLevel ); tree->pushNode( isoPath ); tree->addComment("offset 0x%I64X, size 0x%I64X", boxPos , boxSize); // endOfBoxPos saves the hassle of keeping the remainingSize up-to-date // (which is only needed and only done, if usefull for the specific box) XMP_Int64 remainingSize = boxSize - boxHeaderSize; XMP_Int64 endOfBoxPos = LFA_Tell(file) + remainingSize; // --------------------------------------------- // for FullBoxes: XMP_Uns8 version = 255; XMP_Uns32 flags = 0xFFFFFF; switch ( boxType ) { // container boxes (FULL), that contain (relevant) boxes: case 0x6174656D: // meta, FULLBOX if ( isoPath != "moov/udta/meta/" ) break; //no area of interest (and navigate around some malformed files) digestISOFullBoxExtension( file, isoPath, remainingSize, version, flags ); // intentionally: no break. // container boxes (all non-FULL), that contain (relevant) boxes: case 0x666E696D: // minf - "simple container, no direct content" if ( boxString == "minf" && isoPath != "moov/trak/mdia/minf/" ) break; case 0x6C627473: // stbl is a simple container, no direct content { TimeCodeTrack = false; // assume until we known better by a relevant // moov/trak/mdia/minf/stbl/stsd/ of format tmcd if ( boxString == "stbl" && isoPath != "moov/trak/mdia/minf/stbl/") break; } case 0x766F6F6D: // moov case 0x6169646D: // mdia case 0x61746475: // udta - user data case 0x6B617274: // trak - track case 0x74736C69: // ilst (contains cprt box) { // store and restore current position to not depend // on sub-level mischief... bool ok; XMP_Int64 keep = LFA_Tell( file ); DumpISOBoxes( file, remainingSize, isoPath ); LFA_Seek( file, keep, SEEK_SET, &ok ); assertMsg( "seek failed", ok ); } break; // known boxes, that need content extraction case 0x70797466: // ftyp - file type { XMP_Uns32 majorBrand = LFA_ReadUns32_LE( file ); XMP_Uns32 minorVersion = LFA_ReadUns32_LE( file ); //Log::info( fromArgs( "major Brand: '%.4s' (0x%.8X)" , &majorBrand, MakeUns32BE(majorBrand) )); //Log::info( fromArgs( "minor Version: 0x%.8X" , MakeUns32BE(minorVersion) ) ); tree->setKeyValue( isoPath + "majorBrand", fromArgs( "%.4s", &majorBrand ), fromArgs( "0x%.8X" , MakeUns32BE(majorBrand) ) ); tree->setKeyValue( isoPath + "minorVersion", fromArgs( "0x%.8X", MakeUns32BE(minorVersion) ) ); remainingSize -= 4 + 4; //Log::info( fromArgs( "remaining Size: %d" , remainingSize ) ); while ( remainingSize >= 4 ) { LFA_ReadUns32_LE( file ); // TODO: Concatenate for KeyValue... //XMP_Uns32 compatVersion = LFA_ReadUns32_LE( file ); //Log::info( fromArgs( "compatible brand: '%.4s' (0x%.8X)" , &compatVersion, MakeUns32BE(compatVersion) )); remainingSize -= 4; } // odd bytes left? if ( remainingSize > 0 ) tree->addComment( "WARNING: %d bytes left, considering FREE", remainingSize ); } break; case 0x61746164: // data (within itunes Metadata) // all data atoms start with two common fields: a type indicator, and a locale indicator. // each of these fields is four bytes long: tree->digest32u(file, isoPath+ "type", true, true); tree->digest32u(file, isoPath+ "locale", true, true); remainingSize -= 8; // rest is actual contents: tree->digestString( file, isoPath + "value", remainingSize, false ); break; case 0x64697575: // uuid XMP_Uns8 uid[16]; tree->digest( file, isoPath + "uuidValue" , uid , 16 ); if ( ! strncmp( (const char*) kUUID_XMP, (const char*) uid, 16 )) tree->addComment(" - the XMP UUID !"); break; case 0x65657266: // free tree->addComment( "free space" ); break; // FULL BOXES (w/o container boxes, above) ********************************** case 0x6468766D: // mvhd, FULLBOX, movie-header-box { digestISOFullBoxExtension( file, isoPath, remainingSize, version, flags ); if ( version == 1 ) { tree->digest64u(file,isoPath+ "creation_time",true,true); tree->digest64u(file,isoPath+ "modification_time",true,true); tree->digest32u(file,isoPath+ "timescale",true,true); tree->digest64u(file,isoPath+ "duration",true,true); } else if ( version == 0 ) { tree->digest32u(file,isoPath+ "creation_time",true,true); tree->digest32u(file,isoPath+ "modification_time",true,true); tree->digest32u(file,isoPath+ "timescale",true,true); tree->digest32u(file,isoPath+ "duration",true,true); } else { tree->addComment("WARNING: unknown mvhd version!"); } // COULDDO more fields, but not needed right now. } break; case 0x726C6468: // hdlr - handler reference { if ( isoPath != "moov/trak/mdia/hdlr/") break; if ( remainingSize < 4*4 ) break; // box too small... digestISOFullBoxExtension( file, isoPath, remainingSize, version, flags ); tree->digestString( file, isoPath+"quickTimeType", 4, false ); // expecting: 'mhlr' - media handler tree->digestString( file, isoPath+"subType", 4, false ); // expecting: 'tmcd' - timecode tree->digestString( file, isoPath+"manufacturer", 4, false ); // e.g. 'appl' break; // rest doesn't bother us... } case 0x64737473: // stsd - timecode sample description table { if ( isoPath != "moov/trak/mdia/minf/stbl/stsd/") break; // version (1 byte), flags (3 byte) - must be 0 assertMsg("stbl: version and flags must be zero", 0 == tree->digest32u( file, "", true ) ); // entryCount - must be 0 assertMsg("stbl: at least one entry needed", 1 <= tree->digest32u( file, "", true ) ); remainingSize -= 8; // only dump first occurence // ensure there's enough bytes for at least on stbl: if ( remainingSize < 29 ) break; // MPEG4/al_sbr_twi_22_1_fsaac22.mv4 has a box that is smaller than this... // hence can only break, not throw XMP_Int64 entrySize = (XMP_Int64) tree->digest32u( file, "", true, true ); std::string format = tree->digestString( file, "", 4, false ); // must be 'tmcd' tree->pushNode( isoPath + format + "/" ); if ( format != "tmcd" ) { tree->addComment("irrelevant node"); tree->popNode(); break; // different party... } TimeCodeTrack = true; // we're in the right track Skip( file, 6 ); // [6] reserved bytes tree->digest16u( file, isoPath+"dataReferenceIndex", true, true ); // (ignored) tree->addOffset( file ); Skip( file, 4 ); // uint32 reserved tree->digest32u( file, isoPath+"flags", true, true ); tree->digest32u( file, isoPath+"timeScale", true, true ); tree->digest32u( file, isoPath+"frameDuration", true, true ); Skip( file, 2 ); // skip ignored frame count, reserved // ////////////////////////////// dig out 'trailing boxes' // comparing "atom remains" vs. "entry" (probably must be '>=' // deduct the already digested... entrySize -= 34; // ( 4+4+6+2+4+4+4+4+1+1 ) remainingSize -= 34; // (the atom-level value) assertMsg( "entry Size must be 0 or positive", entrySize >= 0 ); assertMsg( "must not overreach atom", entrySize <= remainingSize ); XMP_Int64 endOfTrailingBoxes = LFA_Tell(file) + remainingSize; while ( LFA_Tell(file) < endOfTrailingBoxes ) { LFA_Tell( file ); DumpISOBoxes( file, entrySize, isoPath ); LFA_Tell( file ); } assertMsg( "did not boil down to zero", LFA_Tell(file) == endOfTrailingBoxes ); tree->popNode(); break; } case 0x63737473: // stsc - timecode sample description table { if ( isoPath != "moov/trak/mdia/minf/stbl/stsc/") break; if ( !TimeCodeTrack ) { tree->addComment("not tcmd -> not of interest"); break; // not of interest } // version (1 byte), flags (3 byte) - must be 0 assertMsg("stbl: version and flags must be zero", 0 == tree->digest32u( file, "", true ) ); // entryCount - must be 0 assertMsg("stbl: at least one entry needed", 1 <= tree->digest32u( file, "", true ) ); remainingSize -= 8; LFA_Tell( file ); tree->digest32u( file, isoPath+"firstChunkNo", true, true ); tree->digest32u( file, isoPath+"numSamplesPerChunk", true, true ); tree->digest32u( file, isoPath+"sampleDescriptionID", true, true ); break; } case 0x6F637473: // stco - timecode sample description table { if ( isoPath != "moov/trak/mdia/minf/stbl/stco/") break; if ( !TimeCodeTrack ) break; // not of interest // version (1 byte), flags (3 byte) - must be 0 assertMsg("stbl: version and flags must be zero", 0 == tree->digest32u( file, "", true ) ); // entryCount - must be 0 assertMsg("stbl: at least one entry needed", 1 <= tree->digest32u( file, "", true ) ); remainingSize -= 8; XMP_Int64 absOffset = tree->digest32u( file, isoPath+"absFileOffset32", true, true ); // recklessly navigate to that timecode media sample, grab value, return to old position... XMP_Int64 oldPos = LFA_Tell( file ); LFA_Seek( file, absOffset, SEEK_SET, 0 ); tree->digest32u( file, isoPath+"timecodeMediaSample", true, true ); LFA_Seek( file, oldPos, SEEK_SET, 0 ); } case 0x34366F63: // co64 - timecode sample description table -> 64 bit offset { if ( isoPath != "moov/trak/mdia/minf/stbl/co64/") break; tree->digest64u( file, isoPath+"absFileOffset64", true, true ); break; } case 0x74727063: // cprt, FULLBOX if ( isoPath == "moov/udta/cprt/") { digestISOFullBoxExtension( file, isoPath, remainingSize, version, flags ); // 1/8 byte ISO language padding = 1-bit value set to 0 // 1 7/8 bytes content language = 3 * 5-bits ISO 639-2 language code less 0x60 // - example code for english = 0x15C7 tree->digest16u(file,isoPath+"content language",true,true); tree->addComment("(0x15C7 == english)"); // zero-terminated, actual string: tree->digestString( file, isoPath+"value", 0 ); } else { // ISO - copyright (?) // a container box, hunt for 'data' atom by recursion: bool ok; XMP_Int64 keep = LFA_Tell( file ); DumpISOBoxes( file, remainingSize, isoPath ); LFA_Seek( file, keep, SEEK_SET, &ok ); assertMsg( "seek failed", ok ); } break; case 0x64686B74: // tkhd, FULLBOX case 0x6E61656D: // mean, FULLBOX case 0x656D616E: // name, FULLBOX { if ( isoPath == "moov/trak/mdia/minf/stbl/stsd/name/" ) // this regrettably is a diffrent animal (international text sequence) digestInternationalTextSequence( file, isoPath, &remainingSize ); else digestISOFullBoxExtension( file, isoPath, remainingSize, version, flags ); } break; // (c)-style quicktime boxes and boxes of no interest: default: if ( (boxType & 0xA9) == 0xA9) // (c)something { if ( 0 == isoPath.compare( 0 , 20, "moov/udta/meta/ilst/")) { // => iTunes metadata (hunt for data childs) // a container box, hunt for 'data' atom by recursion: bool ok; XMP_Int64 keep = LFA_Tell( file ); DumpISOBoxes( file, remainingSize, isoPath ); LFA_Seek( file, keep, SEEK_SET, &ok ); assertMsg( "seek failed", ok ); } else if ( 0 == isoPath.compare( 0 , 10, "moov/udta/" )) { // => Quicktime metadata "international text sequence" ( size, language code, value ) digestInternationalTextSequence( file, isoPath, &remainingSize ); } else { tree->addComment("WARNING: unknown flavor of (c)*** boxes, neither QT nor iTunes"); } break; } //boxes of no interest: break; } bool ok; LFA_Seek( file, endOfBoxPos, SEEK_SET, &ok ); assertMsg("End-of-Box Seek failed (truncated file?)", ok ); tree->popNode(); } // while } // DumpISOBoxes() // attempt to combine dumping of mpeg-4 and quicktime (mov) into one routine... static void DumpISO ( LFA_FileRef file, XMP_Uns32 fileLen ) { TimeCodeTrack = false; // see specificition at https://zerowing.corp.adobe.com/display/XMP/Embedding+Spec+MPEG4 DumpISOBoxes(file, fileLen, "" ); assertMsg("truncated file/last box reached beyond end?", LFA_Tell(file) == fileLen ); } // ================================================================================================= static size_t GetASFObjectInfo (LFA_FileRef file, XMP_Uns32 objOffset, ASF_ObjHeader* objHeader, size_t nesting) { LFA_Seek (file, objOffset, SEEK_SET); LFA_Read ( file, objHeader, 24, true); objHeader->size = GetUns64LE (&objHeader->size); XMP_Uns32 size32 = (XMP_Uns32)objHeader->size; if (objHeader->size > 0xFFFFFFFF) { tree->addComment("** ASF Object at offset 0x%X is over 4GB: 0x%.8X 0x%.8X", objOffset, High32(objHeader->size), Low32(objHeader->size)); } size_t infoIndex; for (infoIndex = 0; kASF_KnownObjects[infoIndex].name != 0; ++infoIndex) { if (memcmp (&objHeader->guid, &kASF_KnownObjects[infoIndex].guid, 16) == 0) break; } std::string indent (3*nesting, ' '); if (kASF_KnownObjects[infoIndex].name != 0) { tree->addComment("%s %s Object, offset %u (0x%X), size %u", indent.c_str(), kASF_KnownObjects[infoIndex].name, objOffset, objOffset, size32); } else { tree->addComment("%s <>, offset %u (0x%X), size %u", indent.c_str(), objOffset, objOffset, size32); ASF_GUID guid; guid.part1 = GetUns32LE (&objHeader->guid.part1); guid.part2 = GetUns16LE (&objHeader->guid.part2); guid.part3 = GetUns16LE (&objHeader->guid.part3); guid.part4 = GetUns16LE (&objHeader->guid.part4); tree->addComment("GUID %.8X-%.4X-%.4X-%.4X-%.4X%.8X", guid.part1, guid.part2, guid.part3, guid.part4, *(XMP_Uns16*)(&guid.part5[0]), *(XMP_Uns32*)(&guid.part5[2])); } if (objOffset != 0) tree->addComment(""); // Don't print newline for the real header. return infoIndex; } // GetASFObjectInfo // ================================================================================================= static void PrinfASF_UTF16 (LFA_FileRef file, XMP_Uns16 byteCount, const char * label) { size_t filePos = LFA_Tell (file); //FNO: note: has sideeffect on sDataPtr CaptureFileData (file, 0, byteCount); tree->setKeyValue( label, convert16Bit(false,sDataPtr,false,byteCount), fromArgs("offset %d (0x%X), size %d",filePos, filePos, byteCount) ); } static void DumpASFFileProperties (LFA_FileRef file, XMP_Uns32 objOffset, XMP_Uns32 objLen) { ASF_FileProperties fileProps; if (objLen < kASF_FilePropertiesSize) { tree->comment("** File Properties Object is too short"); return; } LFA_Seek (file, objOffset, SEEK_SET); LFA_Read ( file, &fileProps, kASF_FilePropertiesSize, true); fileProps.flags = GetUns32LE (&fileProps.flags); // Only care about flags and create date. fileProps.creationDate = GetUns64LE (&fileProps.creationDate); bool bcast = (bool)(fileProps.flags & 1); tree->setKeyValue("ASF:broadcast", (bcast ? "set" : "not set") ); XMP_Int64 totalSecs = fileProps.creationDate / (10*1000*1000); XMP_Int32 nanoSec = ((XMP_Int32) (fileProps.creationDate - (totalSecs * 10*1000*1000))) * 100; XMP_Int32 days = (XMP_Int32) (totalSecs / 86400); totalSecs -= ((XMP_Int64)days * 86400); XMP_Int32 hour = (XMP_Int32) (totalSecs / 3600); totalSecs -= ((XMP_Int64)hour * 3600); XMP_Int32 minute = (XMP_Int32) (totalSecs / 60); totalSecs -= ((XMP_Int64)minute * 60); XMP_Int32 second = (XMP_Int32)totalSecs; XMP_DateTime binDate; memset (&binDate, 0, sizeof(binDate)); binDate.year = 1601; binDate.month = 1; binDate.day = 1; binDate.day += days; binDate.hour = hour; binDate.minute = minute; binDate.second = second; binDate.nanoSecond = nanoSec; SXMPUtils::ConvertToUTCTime (&binDate); std::string strDate; SXMPUtils::ConvertFromDate (binDate, &strDate); tree->setKeyValue("ASF:creation date", fromArgs("%s (0x%.8X-%.8X)", strDate.c_str(), High32(fileProps.creationDate), Low32(fileProps.creationDate)) ); } // DumpASFFileProperties // ================================================================================================= static void DumpASFContentDescription (LFA_FileRef file, XMP_Uns32 objOffset, XMP_Uns32 objLen) { ASF_ContentDescription contentDesc; // ! The lengths are in bytes. if (objLen < kASF_ContentDescriptionSize) { tree->comment("** Content Description Object is too short"); return; } LFA_Seek (file, objOffset, SEEK_SET); LFA_Read ( file, &contentDesc, kASF_ContentDescriptionSize, true); contentDesc.titleLen = GetUns16LE (&contentDesc.titleLen); contentDesc.authorLen = GetUns16LE (&contentDesc.authorLen); contentDesc.copyrightLen = GetUns16LE (&contentDesc.copyrightLen); contentDesc.descriptionLen = GetUns16LE (&contentDesc.descriptionLen); contentDesc.ratingLen = GetUns16LE (&contentDesc.ratingLen); PrinfASF_UTF16 (file, contentDesc.titleLen, "ASF:title"); PrinfASF_UTF16 (file, contentDesc.authorLen, "ASF:author"); PrinfASF_UTF16 (file, contentDesc.copyrightLen, "ASF:copyright"); PrinfASF_UTF16 (file, contentDesc.descriptionLen, "ASF:description"); PrinfASF_UTF16 (file, contentDesc.ratingLen, "ASF:rating"); } // DumpASFContentDescription // ================================================================================================= static void DumpASFContentBranding (LFA_FileRef file, XMP_Uns32 objOffset, XMP_Uns32 objLen) { XMP_Uns32 fieldSize; if (objLen < (16 + 8 + 4*4)) { tree->comment("** Content Branding Object is too short"); return; } XMP_Uns32 fieldOffset = objOffset + 16 + 8 + 4; LFA_Seek (file, fieldOffset, SEEK_SET); LFA_Read ( file, &fieldSize, 4, true); fieldSize = GetUns32LE (&fieldSize); fieldOffset += fieldSize; LFA_Seek (file, fieldSize, SEEK_CUR); // Skip the banner data. LFA_Read ( file, &fieldSize, 4, true); fieldSize = GetUns32LE (&fieldSize); fieldOffset += fieldSize; tree->setKeyValue("ASF:banner URL", "", fromArgs("offset %d (0x%X), size %d", fieldOffset, fieldOffset, fieldSize ) ); if (fieldSize != 0) { CaptureFileData (file, 0, fieldSize); //NB: not yet tested..., not sure if stopOnNull needed, thus using false tree->changeValue(convert8Bit(sDataPtr,false,fieldSize)); } LFA_Read ( file, &fieldSize, 4, true); fieldSize = GetUns32LE (&fieldSize); fieldOffset += fieldSize; tree->setKeyValue("ASF:copyright URL", "", fromArgs("offset %d (0x%X), size %d", fieldOffset, fieldOffset, fieldSize) ); if (fieldSize != 0) { CaptureFileData (file, 0, fieldSize); //NB: not yet tested..., not sure if stopOnNull needed, thus using false tree->changeValue(convert8Bit(sDataPtr,false,fieldSize)); } } // DumpASFContentBranding // ================================================================================================= static void DumpASFContentEncryption (LFA_FileRef file, XMP_Uns32 objOffset, XMP_Uns32 objLen) { XMP_Uns32 fieldSize; if (objLen < (16 + 8 + 4*4)) { tree->addComment("** Content Encryption Object is too short"); return; } LFA_Seek (file, (objOffset+16+8), SEEK_SET); LFA_Read ( file, &fieldSize, 4, true); fieldSize = GetUns32LE (&fieldSize); LFA_Seek (file, fieldSize, SEEK_CUR); // Skip the secret data. LFA_Read ( file, &fieldSize, 4, true); fieldSize = GetUns32LE (&fieldSize); LFA_Seek (file, fieldSize, SEEK_CUR); // Skip the protection type. LFA_Read ( file, &fieldSize, 4, true); fieldSize = GetUns32LE (&fieldSize); CaptureFileData (file, 0, fieldSize); PrintOnlyASCII_8 (sDataPtr, fieldSize); LFA_Read ( file, &fieldSize, 4, true); fieldSize = GetUns32LE (&fieldSize); CaptureFileData (file, 0, fieldSize); PrintOnlyASCII_8 (sDataPtr, fieldSize); } // DumpASFContentEncryption // ================================================================================================= static void DumpASFHeaderExtension (LFA_FileRef file, XMP_Uns32 extOffset, XMP_Uns32 extLen) { // The Header Extension Object is a child of the Header Object and the parent of nested objects. XMP_Uns32 extEnd = extOffset + extLen; XMP_Uns32 childLen; XMP_Uns32 childOffset; ASF_ObjHeader childHeader; for (childOffset = (extOffset + kASF_HeaderExtensionSize); childOffset < extEnd; childOffset += childLen) { (void) GetASFObjectInfo (file, childOffset, &childHeader, 2); childLen = (XMP_Uns32)childHeader.size; } if (childOffset != extEnd) { tree->addComment("** Invalid end to nested Header Extension objects, offset %u", childOffset); } } // DumpASFHeaderExtension // ================================================================================================= static void DumpASF (LFA_FileRef file, XMP_Uns32 asfLen) { // An ASF file contains objects of the form: // A 16 byte GUID giving the object's type and use // A little endian 64-bit object length, includes the GUID and length (== 24 + data size) // The object's data // Objects can be nested. The top level of a file is a Header Object, followed by a Data Object, // followed by any number of "other" top level objects, followed by any number of index objects. // There is legacy metadata in certain nested objects within the Header Object. The XMP is an // "other" top level object. size_t infoIndex; XMP_Uns32 objLen; XMP_Uns32 objOffset; ASF_ObjHeader objHeader; tree->comment("ASF file Object layout"); // Dump the Header Object's content, looking for legacy metadata. infoIndex = GetASFObjectInfo (file, 0, &objHeader, 0); XMP_Uns32 headerLen = (XMP_Uns32)objHeader.size; if (kASF_KnownObjects[infoIndex].kind != kASFObj_Header) { tree->comment("** First object is not the Header Object"); return; } XMP_Uns32 nestedCount; LFA_Seek (file, 24, SEEK_SET); LFA_Read ( file, &nestedCount, 4, true); nestedCount = GetUns32LE (&nestedCount); tree->addComment("%u nested objects", nestedCount); for (objOffset = (16+8+4+2); objOffset < headerLen; objOffset += objLen, --nestedCount) { infoIndex = GetASFObjectInfo (file, objOffset, &objHeader, 1); objLen = (XMP_Uns32)objHeader.size; switch (kASF_KnownObjects[infoIndex].kind) { case kASFObj_FileProperties : DumpASFFileProperties (file, objOffset, objLen); break; case kASFObj_ContentDesc : DumpASFContentDescription (file, objOffset, objLen); break; case kASFObj_ContentBrand : DumpASFContentBranding (file, objOffset, objLen); break; case kASFObj_ContentEncrypt : DumpASFContentEncryption (file, objOffset, objLen); break; case kASFObj_HeaderExtension : DumpASFHeaderExtension (file, objOffset, objLen); break; default : break; } } if ((objOffset != headerLen) || (nestedCount != 0)) { tree->comment("** Invalid end to nested Header objects, offset %u, count %u", objOffset, nestedCount); objOffset = headerLen; } // Dump the basic info for the remaining objects, looking for the XMP along the way. infoIndex = GetASFObjectInfo (file, objOffset, &objHeader, 0); objLen = (XMP_Uns32)objHeader.size; if (kASF_KnownObjects[infoIndex].kind != kASFObj_Data) { tree->addComment("** Second object is not the Data Object"); if (kASF_KnownObjects[infoIndex].kind == kASFObj_XMP) { if (sXMPPtr == 0) CaptureXMPF (file, (objOffset + 24), (objLen - 24)); else tree->addComment("** Multiple XMP objects"); } } for (objOffset += objLen; objOffset < asfLen; objOffset += objLen) { GetASFObjectInfo (file, objOffset, &objHeader, 0); objLen = (XMP_Uns32)objHeader.size; if (kASF_KnownObjects[infoIndex].kind == kASFObj_XMP) { if (sXMPPtr == 0) CaptureXMPF (file, (objOffset + 24), (objLen - 24)); else tree->addComment("** Multiple XMP objects"); } } if (objOffset != asfLen) tree->addComment("** Invalid end to top level objects: %u", objOffset); if (sXMPPtr != 0) DumpXMP ("ASF XMP object"); } // DumpASF // ================================================================================================= static void DumpUCF(LFA_FileRef file, XMP_Int64 len) { ////////////////////////////////////////////////////////////////////// // constants const static XMP_Uns32 UCF_HS_CONTENTFILE=0x04034b50; const static XMP_Uns32 UCF_CD_FILE_HEADER=0x02014b50; //central directory - file header const static XMP_Uns32 UCF_ZIP64_END_OF_CD_RECORD=0x06064b50; const static XMP_Uns32 UCF_ZIP64_END_OF_CD_LOCATOR=0x07064b50; const static XMP_Uns32 UCF_CD_END=0x06054b50; const static XMP_Int32 UCF_COMMENT_MAX = 0xFFFF; const static XMP_Int32 UCF_EOD_FIXED_SIZE = 22; const static XMP_Int32 UCF_ZIP64_LOCATOR_FIXED_SIZE = 20; const static XMP_Int32 UCF_ZIP64_RECORD_FIXED_SIZE = 56; ////////////////////////////////////////////////////////////////////// // variables: XMP_Int64 curPos=0; bool isZip64; XMP_Uns32 numDirEntries; XMP_Uns64 size_CD; XMP_Uns64 offset_Zip64_EndOfCD_Record=0; XMP_Uns64 offset_CD; typedef std::list OffsetStack; OffsetStack contentFiles; contentFiles.clear(); //precaution for mac ////////////////////////////////////////////////////////////////////// // prolog: tree->comment("len is 0x%I64X",len); tree->comment("inherently parsing bottom-up"); if( len > 0xFFFFFFFFl ) tree->comment("info: >4GB ==> most like zip64 !"); ////////////////////////////////////////////////////////////////////// // parse bottom up: ///////////////////////////////////////////////////////////////////// // zip comment: XMP_Int32 zipCommentLen = 0; for ( ; zipCommentLen <= UCF_COMMENT_MAX; zipCommentLen++ ) { LFA_Seek( file, -zipCommentLen -2, SEEK_END ); if ( LFA_ReadUns16_LE( file ) == zipCommentLen ) //found it? { //double check, might just look like comment length (actually be 'evil' comment) LFA_Seek( file , - UCF_EOD_FIXED_SIZE, SEEK_CUR ); if ( LFA_ReadUns32_LE( file ) == UCF_CD_END ) break; //heureka, directory ID // 'else': just go on } } tree->comment( fromArgs("zip Comment length: %d",zipCommentLen )); //was it a break or just not found ? assertMsg ( "zip broken near end or invalid comment", zipCommentLen < UCF_COMMENT_MAX ); ///////////////////////////////////////////////////////////////////// // End of CDR: LFA_Seek( file , - UCF_EOD_FIXED_SIZE - zipCommentLen, SEEK_END); curPos = LFA_Tell(file); tree->pushNode("End of Central Directory"); tree->addOffset( file ); { assertMsg("expected 'end of central directory record'", UCF_CD_END == tree->digest32u(file) ); assertMsg("UCF allow single-volume zips only", 0 == tree->digest16u(file)); //volume number (0,1,..) assertMsg("UCF allow single-volume zips only(thus directory must be in 0)", 0 == tree->digest16u(file,"")); //volume number (0,1,..) numDirEntries=tree->digest16u(file,"number of directory entries"); tree->digest16u(numDirEntries, file,"number of total directory entries"); size_CD = tree->digest32u(file,"size of central directory",false,true); offset_CD = tree->digest32u(file,"offset of central directory",false,true); if (offset_CD == 0xFFFFFFFF) tree->addComment("apparently zip-64"); XMP_Uns16 zipCommentLengReverify = tree->digest16u(file,"zip comment length"); assertMsg( "zipCommentLengReverify failed", zipCommentLengReverify == zipCommentLen ); } tree->popNode(); ///////////////////////////////////////////////////////////////////// // Zip64 End Of CD Locator LFA_Seek( file, curPos - UCF_ZIP64_LOCATOR_FIXED_SIZE ,SEEK_SET ); //tree->comment("offset is %X", LFA_Tell(file) ); //tree->comment("peek is %X", Peek32u(file) ); if ( Peek32u(file) != UCF_ZIP64_END_OF_CD_LOCATOR ) { tree->comment("no Zip64 CDL -> no Zip64"); assertMsg("offset FFFF FFFF indicates zip-64, but no Zip64 CDL found", offset_CD != 0xFFFFFFFF ); isZip64=false; } else { isZip64=true; tree->pushNode("Zip64 End-Of-CD Locator"); tree->addOffset( file ); tree->digest32u(file,"sig",false,true); assertMsg("'numOfDisk with central start dir' must be 0", 0 == tree->digest32u(file,"disk with start dir")); tree->digest64u(&offset_Zip64_EndOfCD_Record, file,"Zip64 End Of CD Offset",false,true); tree->digest32u( /* deactived while bug #1742179: 1,*/ file, "total num of disks", false, true); tree->popNode(); } ///////////////////////////////////////////////////////////////////// // Zip64 End of CD Record if (isZip64) { XMP_Uns64 size_Zip64_EndOfCD_Record; tree->pushNode("Zip64 End of CD Record"); LFA_Seek( file, offset_Zip64_EndOfCD_Record ,SEEK_SET ); tree->addOffset( file ); tree->digest32u( UCF_ZIP64_END_OF_CD_RECORD ,file, "sig", false, true ); tree->digest64u( &size_Zip64_EndOfCD_Record, file, "size of zip64 CDR", false, true); tree->digest16u( file, "made by", false, true ); tree->digest16u( file, "needed to extract", false, true ); tree->digest32u( (XMP_Uns32)0 , file, "number of this disk", false, true); tree->digest32u( (XMP_Uns32)0 , file, "disk that contains start of CD", false, true); tree->digest64u( (XMP_Uns64) numDirEntries, file, "total Num of Entries This Disk", false, false ); tree->digest64u( (XMP_Uns64) numDirEntries, file, "total Num of Entries", false, false ); //TODO assert agtainst each other and above tree->digest64u( &size_CD, file, "size_CD", false, true ); tree->digest64u( &offset_CD, file, "offset_CD", false, true ); XMP_Int64 lenExtensibleSector = UCF_ZIP64_RECORD_FIXED_SIZE - size_Zip64_EndOfCD_Record; tree->comment("zip64 extensible data sector (%d bytes)", lenExtensibleSector ); //sanity test: Skip( file, lenExtensibleSector ); assertMsg("numbers don't add up", Peek32u(file) != UCF_ZIP64_END_OF_CD_LOCATOR ); tree->popNode(); } ///////////////////////////////////////////////////////////////////// // parse Central directory structure: content file 1..n tree->pushNode("Central directory structure:"); LFA_Seek( file, offset_CD ,SEEK_SET ); tree->addOffset( file ); for (XMP_Uns32 contentFileNo=1 ; contentFileNo <= numDirEntries; contentFileNo++ ) { tree->pushNode("File Header No %d:", contentFileNo); tree->addOffset( file ); XMP_Uns16 version, flags, cmethod; XMP_Uns32 crc,compressed_size,uncompressed_size32; XMP_Uns64 offsetLocalHeader = 0; bool usesDescriptionHeader; tree->digest32u( UCF_CD_FILE_HEADER, file, "sig", false, true ); tree->digest16u(file,"version made by",false,true); tree->digest16u(&version, file,"version needed to extract"); assertMsg( fromArgs("illegal 'version needed to extract' (must be 10,20 or 45, was %u)",version), ( version == 10 || version == 20 || version == 45)); tree->digest16u ( &flags, file, "general purpose bit flags", false, true ); assertMsg("no zip encryption must be used", (flags&0x1)==0); usesDescriptionHeader= ((flags&0x8) != 0); if (usesDescriptionHeader) tree->addComment("uses description header"); tree->digest16u(&cmethod, file,"compression method"); assertMsg("illegal compression method (must be 0 or 8(flate))!",( cmethod == 0 || cmethod == 8 )); tree->digest(file,"last mod file time",0,2); tree->digest(file,"last mod file date",0,2); tree->digest32u(&crc, file); //crc-32 tree->digest32u(&compressed_size, file,"compressed size"); tree->digest32u(&uncompressed_size32, file,"uncompressed size"); XMP_Uns16 size_filename,size_extra,size_comment; tree->digest16u( &size_filename , file , "size filename"); assertMsg("unusual name length length (broken file?)", size_filename>0 && size_filename < 500 ); //discover parsing nonsense... tree->digest16u( &size_extra , file , "size extra field"); tree->digest16u( &size_comment , file , "size file comment"); tree->digest16u( (XMP_Uns16)0 , file , "disk start no"); tree->digest16u( file , "internal attribs"); tree->digest32u( file , "external attribs"); offsetLocalHeader = tree->digest32u( file , "relative offset local header",false,true); // Int64 <== Uns32 // name of file, optional relative path, strictly forward slashes. assert(size_filename != 0); std::string filename = tree->digestString(file,"filename",size_filename); //NOT zero-terminated if (contentFileNo == 1) { assert( size_extra == 0); //spec guarantes mimetype content at 38 <=> extraFieldLen == 0 assertMsg ( fromArgs("first file in UCF must be called mimetype, was %s",filename.c_str()), (size_filename == 8) && (filename == "mimetype")); } if(size_extra != 0) { tree->pushNode("extraField"); XMP_Int32 remaining = size_extra; while (remaining > 0) { assertMsg( "need 4 bytes for next header ID+len", remaining >= 4); XMP_Uns16 headerID = tree->digest16u(file,"headerID",false,true); XMP_Uns16 dataSize = tree->digest16u(file,"data size",false,true); remaining -= 4; assertMsg( "actual field lenght not given", remaining >= dataSize); if ( headerID == 0x1 ) //we only care about "Zip64 extended information extra field" { tree->digest64u( &offsetLocalHeader, file, "64bit offset", false, true); remaining -= 8; } else { Skip(file, dataSize ); remaining -= dataSize; } } tree->popNode(); } //now that regular 32 bit and zip-64 is through... if (contentFileNo == 1) { assertMsg( "first header offset (aka content file offset) must (naturally) be 0", offsetLocalHeader==0 ); } else { assertMsg("local header offset (aka content file offset) must not be 0", offsetLocalHeader!=0 ); } contentFiles.push_back(offsetLocalHeader); if(size_comment != 0) { tree->digest(file,"file comment",0,size_comment); } tree->popNode(); //file header } tree->popNode(); //central directory structure ///////////////////////////////////////////////////////////////////// // Content Files (incl. Headers, etc) for(XMP_Uns16 cfNo=1; cfNo <= numDirEntries; cfNo++) { //vars XMP_Uns32 compressed_size,uncompressed_size, crc32; XMP_Uns16 version,nameLen,extraFieldLen; tree->pushNode("Content File %d:", cfNo); assert( !contentFiles.empty()); XMP_Int64 fileHeaderOffset = contentFiles.front(); contentFiles.pop_front(); bool ok; LFA_Seek( file, fileHeaderOffset, SEEK_SET, &ok ); tree->addOffset( file ); assert(ok); //local file header tree->digest32u( UCF_HS_CONTENTFILE, file, "sig", false, true ); tree->digest16u(&version, file,"version"); assertMsg("illegal 'version needed to extract' (must be 10,20 or 45, was %u)", ( version == 10 || version == 20 || version == 45)); Skip(file,8); tree->digest32u( &crc32, file, "crc-32", false, true ); tree->digest32u( &compressed_size, file, "compressed", false, false ); tree->digest32u( &uncompressed_size, file, "uncompressed", false, false ); tree->digest16u( &nameLen, file, "file name length", false, false ); tree->digest16u( &extraFieldLen, file, "extra field length", false, false ); assert(nameLen != 0); assertMsg("unusual name length length (broken file?)", nameLen>0 && nameLen < 500 ); //discover parsing nonsense... // name of file, optional relative path, strictly forward slashes. std::string filename = tree->digestString(file,"filename",nameLen); //NOT zero-terminated if (cfNo == 1) { assertMsg("first file in UCF muste be called mimetype", filename=="mimetype" ); assert( extraFieldLen == 0); //spec guarantes mimetype content at 38 <=> extraFieldLen == 0 assert( LFA_Tell(file)==38 ); tree->digestString(file,"file data (mimetype)",compressed_size); } else //not the first mimetype file thing { // FILE DATA ============================================================= if (extraFieldLen != 0) // may indeed not exist, and lenght=0 must not be passed into digestString() tree->digestString(file,"extra field",extraFieldLen); //NOT zero-terminated tree->setKeyValue("file data","",fromArgs("skipping %u bytes",compressed_size)); Skip(file,compressed_size); } tree->popNode(); } tree->pushNode(""); tree->popNode(); } // DumpUCF // ================================================================================================= // AVI and WAV files are RIFF based. Although they have usage differences, we can have a common // dumper. This might need changes for other RIFF-based files, e.g. for specific legacy // metadata. RIFF is a chunky format. AVI and WAV have an outermost RIFF chunk. The XMP is in a // top level "_PMX" chunk. Legacy metadata for WAV is in a top level LIST/INFO chunk. Legacy // metadata for AVI is in a variety of places, don't have specs at present. Free space can be // JUNK or JUNQ. // // A RIFF chunk contains: // - A 4 byte chunk ID, typically ASCII letters // - A little endian UInt32 size of the chunk data // - The chunk data // - Pad byte if the chunk data length is odd (added on 2007-03-22) // The ID is written in "reading order", e.g. the 'R' in "RIFF" is first in the file. Chunks // must start on even offsets. A pad byte of 0 is written after the data if necessary. The size // does not include the pad, nor the ID and size fields. Some chunks contain nested chunks, // notably the RIFF and LIST chunks do. These have the layout: // - A 4 byte chunk ID, typically ASCII letters // - A little endian UInt32 size of the chunk data // - A 4 byte usage ID, typically ASCII letters // - The nested chunks // reads maxSize bytes from file (not "up to", exactly fullSize) // puts it into a string, sets respective tree property static void setFixedBEXTField ( LFA_FileRef file, std::string propName, XMP_Int64 fullSize ) { char* descriptionBuffer = new char[ fullSize + 2 ]; LFA_Read( file, descriptionBuffer, fullSize, true ); descriptionBuffer[fullSize]='\0'; // tack on, in case not contained // parse till first \0 std::string description( descriptionBuffer ); tree->setKeyValue( propName, description) ; delete[] descriptionBuffer; } static void DumpRIFFChunk ( LFA_FileRef file, XMP_Int64 parentEnd, std::string origChunkPath ) { while ( LFA_Tell(file) < parentEnd ) { bool isOutermost = origChunkPath.empty(); XMP_Int64 chunkPos= LFA_Tell( file ); XMP_Uns32 chunkID = tree->digest32u( file, "", false ); std::string idString( fromArgs( "%.4s" , &chunkID ) ); XMP_Int64 chunkSize = tree->digest32u( file, "", false ) // NB: XMPInt64 <- XMPUns32 + 8; //adding size of id and length field itself // calculate size if size field seems broken if (chunkSize > parentEnd) chunkSize = parentEnd - chunkPos; std::string chunkPath = isOutermost ? ( idString ) : (origChunkPath + "/" + idString); // check special case of trailing bytes not in a valid RIFF structure if ( isOutermost && idString != "RIFF") { //dump undefined bytes till the end of the file tree->pushNode("** unknown bytes **"); tree->addOffset( file ); chunkSize = parentEnd - chunkPos; // get size through calculation (and not from size bytes) tree->addComment("size: 0x%llX", chunkSize ); Skip( file, chunkSize-8 ); // Already read the 8 byte header. tree->popNode(); } else { // only RIFF and LIST contain subchunks... bool hasSubChunks = (idString == "RIFF") || (idString == "LIST"); bool skipper=false; if (hasSubChunks) { //get inner ID 'type' as in 'listType', 'fileType', ... XMP_Uns32 chunkType = tree->digest32u( file ); std::string typeString( fromArgs( "%.4s" , &chunkType ) ); if ( isOutermost ) assertMsg("level-0 chunk must be AVI, AVIX or WAVE", ( typeString == "AVI " ) || ( typeString == "AVIX" ) || ( typeString == "WAVE" ) ); chunkPath = chunkPath + ":" + typeString; tree->pushNode( chunkPath ); tree->addComment("offset 0x%llX, size 0x%llX", chunkPos , chunkSize); if ( ( idString + ":" + typeString == "LIST:INFO" ) || ( idString + ":" + typeString == "LIST:Tdat" ) || ( idString + ":" + typeString == "RIFF:AVI " ) || ( idString + ":" + typeString == "RIFF:AVIX" ) || ( idString + ":" + typeString == "RIFF:WAVE" ) || ( idString + ":" + typeString == "LIST:hdrl" ) || ( idString + ":" + typeString == "LIST:strl" ) || ( idString + ":" + typeString == "LIST:movi" ) ) { DumpRIFFChunk( file, LFA_Tell(file) + chunkSize - 12, chunkPath ); // recurse! } else { Skip( file, chunkSize - 12 ); // skip it ! } tree->popNode(); } else if (idString.length() == 4) // check that we got a valid idString { // now that LIST:movi gets dumped, // skip some very frequent, irrelevant chunks, // otherwise the dump becomes unusably long... std::string firstTwo = idString.substr(0,2); std::string secondTwo = idString.substr(2,2); if ( secondTwo == "db" || secondTwo == "dc" || secondTwo == "wb" ) // nb: _could_ colidde, requiring additional numeric test { skipper = true; } if ( ! skipper ) { tree->pushNode( chunkPath ); //Log::info( chunkPath ); tree->addComment("offset 0x%llX, size 0x%llX", chunkPos , chunkSize); } // tackle chunks of interest ////////////////////////////////////////////// bool isListInfo = ( (origChunkPath == "RIFF:WAVE/LIST:INFO" || origChunkPath == "RIFF:AVI /LIST:INFO" ) && idString.at(0) == 'I' ); // so far all mapping relevant props begin with "I" bool isListTdat = (origChunkPath == "RIFF:WAVE/LIST:Tdat" || origChunkPath == "RIFF:AVI /LIST:Tdat") && idString.at(0) != 'J' ; // just exclude JUNK/Q bool isDispChunk = ( ( origChunkPath == "RIFF:WAVE" || origChunkPath == "RIFF:AVI ") && idString == "DISP" ); bool isBextChunk = ( ( origChunkPath == "RIFF:WAVE" || origChunkPath == "RIFF:AVI ") && idString == "bext" ); bool isXMPchunk = false; //assume beforehand if ( idString == "_PMX" ) { // detour first, to detect xmp in wrong places assertMsg( "XMP packet found in wrong place!", ( origChunkPath == "RIFF:WAVE" || "RIFF:AVI" || "RIFF:AVIX" ) ); //be very linient here. isXMPchunk = true; } // deal with chunks of interest ///////////////////////////////////////////// // a little prelude for disp chunk if ( isDispChunk ) { XMP_Uns32 dispChunkType = LFA_ReadUns32_LE(file); // only dispChunks starting with a 0x0001 are of interest to us. // others do exist and are not an error if ( dispChunkType != 0x0001 ) isDispChunk = false; chunkSize -= 4; } if ( isListInfo || isListTdat || isDispChunk ) { // dump that string: std::string value; if ( chunkSize > 8 ) // aka skip for empty chunks { // first check if the string is zero terminated LFA_Seek( file , chunkSize - 8 - 1, SEEK_CUR ); // jump to last char bool zeroTerm = (LFA_ReadUns8( file ) == 0); LFA_Seek( file , -(chunkSize - 8 ), SEEK_CUR ); //jump back // some strings are zero-terminated (so despite initial length they are "c-strings" // others are not ( "pascal strings" if you will. // must cater to both: zero-terminated-ness should not affect resulting value. // Samy: also dump out the zero termination. Needed for testing if (zeroTerm) { // read string without zero (last char) value = tree->digestString( file, "" , chunkSize - 8 - 1, false ); tree->addComment(" zero terminated"); LFA_ReadUns8( file ); // skip the zero } else { // read string including last char value = tree->digestString( file, "" , chunkSize - 8 , false ); tree->addComment(" not zero terminated"); } tree->changeValue( value ); } tree->changeValue( value ); } else if ( isXMPchunk ) { tree->pushNode("XMP packet"); tree->addOffset( file ); tree->addComment("packet size: 0x%llX", chunkSize - 8 ); Skip( file, chunkSize - 8 ); tree->addComment("packet end: 0x%llX", LFA_Tell( file ) ); tree->popNode(); } else if ( isBextChunk ) { tree->pushNode("bext chunk"); tree->addOffset( file ); tree->addComment("packet size: 0x%llX", chunkSize - 8 ); // I assume that the minimum BEXT chunk size is 602: // > 8 + ( 256+32+32+10+8+4+4+2+64+190+0 ) // ans = 610 const XMP_Int64 MIN_BEXT_SIZE = 610; assertMsg("minimum Berx Chunk Size", chunkSize >= MIN_BEXT_SIZE ); XMP_Int64 BEXT_CodingHistorySize = chunkSize - MIN_BEXT_SIZE; setFixedBEXTField ( file, chunkPath+".Description" , 256 ); setFixedBEXTField ( file, chunkPath+".Originator" , 32 ); setFixedBEXTField ( file, chunkPath+".OriginatorReference" , 32 ); setFixedBEXTField ( file, chunkPath+".OriginationDate" , 10 ); setFixedBEXTField ( file, chunkPath+".OriginationTime" , 8 ); tree->digest32u( file, chunkPath+".TimeReferenceLow", false, true ); // DWORD == 32 Bit tree->digest32u( file, chunkPath+".TimeReferenceHigh", false, true ); // DWORD == 32 Bit tree->digest16u( file, chunkPath+".Version", false, true ); // UMID has 64 bytes: tree->digestString(file, chunkPath+".UMID",64); //tree->digest32u( file, chunkPath+".UMID_0-4", false, true ); //tree->setKeyValue( "UMID_5-59" ); //Skip( file, 64 - 4 - 4 ); //tree->digest32u( file, chunkPath+".UMID_60-63", false, true ); tree->setKeyValue( chunkPath+".Reserved" ); Skip( file, 190 ); if ( BEXT_CodingHistorySize ) { setFixedBEXTField ( file, chunkPath+".CodingHistory" , BEXT_CodingHistorySize ); //tree->setKeyValue( chunkPath+".CodingHistory" ); // not bothering details. tree->addComment( "( 0x%llx bytes ) ", BEXT_CodingHistorySize ); //Skip( file, BEXT_CodingHistorySize ); } tree->addComment("packet end: 0x%llX", LFA_Tell( file ) ); tree->popNode(); } else { Skip( file, chunkSize - 8 ); // skip remainder of chunk ( id, length already digested ) assertMsg( fromArgs( "inner chunk size too big, curPos:0x%llx, parentEnd:0x%llx", LFA_Tell(file), parentEnd ), LFA_Tell(file) <= parentEnd ); } if ( ! skipper ) tree->popNode(); } else { //dump undefined bytes in LIST tree->pushNode("** unknown bytes **"); tree->addOffset( file ); tree->addComment("size: 0x%llX", chunkSize ); Skip( file, chunkSize - 8 ); tree->popNode(); } if ( LFA_Tell(file) % 2 == 1 ) // if odd file position, add pad byte. { XMP_Uns8 padByte = LFA_ReadUns8( file ); if (!skipper) { if ( 0 != padByte ) tree->addComment(" (non-zero pad byte!)"); else tree->addComment(" (pad byte)"); // Samy: add pad byte comment } } } } // while } // DumpRIFFChunk // ================================================================================================= static void DumpRIFF ( LFA_FileRef file, XMP_Int64 fileLen ) { DumpRIFFChunk ( file, fileLen, "" ); } // ================================================================================================= static XMP_Uns32 crcTable[256]; static bool crcTableInited = false; static XMP_Uns32 ComputeCRCforPNG ( LFA_FileRef file, XMP_Uns32 crcOffset, XMP_Uns32 crcLen ) { if ( ! crcTableInited ) { for ( int n = 0; n < 256; ++n ) { XMP_Uns32 c = n; for ( int k = 0; k < 8; ++k ) { XMP_Uns32 lowBit = c & 1; c = c >> 1; if ( lowBit != 0 ) c = c ^ 0xEDB88320; } crcTable[n] = c; } crcTableInited = true; } XMP_Uns32 crc = 0xFFFFFFFF; CaptureFileData ( file, crcOffset, crcLen ); for ( XMP_Uns32 i = 0; i < crcLen; ++i ) { // ! The CRC includes the chunk type and data. XMP_Uns8 byte = sDataPtr[i]; XMP_Uns8 index = (XMP_Uns8) ((crc ^ byte) & 0xFF); crc = crcTable[index] ^ (crc >> 8); } return crc ^ 0xFFFFFFFF; } // ComputeCRCforPNG // ================================================================================================= static const XMP_Uns32 kPNG_iTXt = 0x69545874; static const XMP_Uns32 kPNG_tEXt = 0x74455874; static const XMP_Uns32 kPNG_zTXt = 0x7A545874; static XMP_Uns32 DumpPNGChunk ( LFA_FileRef file, XMP_Uns32 pngLen, XMP_Uns32 chunkOffset ) { // A PNG chunk contains: // A big endian UInt32 length for the data portion. Zero is OK. // A 4 byte chunk type, should be 4 ASCII letters, lower or upper case. // The chunk data. // A big endian UInt32 CRC. // There are no alignment constraints. // // Chunks of type tEXt, iTXt, and zTXt have text values. Each text form has a leading "usage // keyword" followed by the data string. The keywords must be visible Latin-1, 0x20..0x7E and // 0xA1..0xFF. They are limited to 1 to 79 characters, plus a terminating nul. // // A tEXt chunk has 0 or more bytes of Latin-1 characters. The data is not nul terminated, and // embedded nuls are not allowed. A zTXt chunk is like tEXt but the data string is zlib compressed. // An iTXt chunk has a variety of "info tags" followed by a UTF-8 data string. // // The XMP is in an iTXt chunk with the keyword XML:com.adobe.xmp and 4 bytes of 0 for the info. XMP_Uns32 chunkLen; XMP_Uns32 chunkType; XMP_Uns32 chunkCRC; if ( (pngLen - chunkOffset) < 12 ) { tree->addComment ( "** Unexpected end of PNG file, %ul bytes remaining **", (pngLen - chunkOffset) ); return (pngLen - chunkOffset); } LFA_Seek ( file, chunkOffset, SEEK_SET ); LFA_Read ( file, &chunkLen, 4, true ); chunkLen = GetUns32BE (&chunkLen); if ( chunkLen > (pngLen - chunkOffset) ) { tree->addComment ( "** No room for PNG chunk, need %u, have %u **", chunkLen, pngLen-chunkOffset ); return (pngLen - chunkOffset); // ! Not chunkLen, might be bad and cause wrap-around. } LFA_Read ( file, &chunkType, 4, true); // After read, memory is in file order. LFA_Seek ( file, (chunkOffset + 8 + chunkLen) , SEEK_SET ); LFA_Read ( file, &chunkCRC, 4, true); chunkCRC = GetUns32BE (&chunkCRC); tree->addComment ( " '%.4s', offset %u (0x%X), size %d, CRC 0x%.8X", &chunkType, chunkOffset, chunkOffset, chunkLen, chunkCRC ); XMP_Uns32 newCRC = ComputeCRCforPNG ( file, (chunkOffset + 4), (chunkLen + 4) ); if ( chunkCRC != newCRC ) tree->addComment ( "** CRC should be 0x%.8X **", newCRC ); chunkType = GetUns32BE (&chunkType); // Reorder the type to compare with constants. if ( (chunkType == kPNG_iTXt) || (chunkType == kPNG_tEXt) || (chunkType == kPNG_zTXt) ) { CaptureFileData ( file, (chunkOffset + 8), chunkLen ); XMP_Uns8 * keywordPtr = sDataPtr; size_t keywordLen = strlen ((char*)keywordPtr); PrintOnlyASCII_8 ( keywordPtr, keywordLen); if ( (chunkType == kPNG_iTXt) && (keywordLen == 17) && CheckBytes (keywordPtr, "XML:com.adobe.xmp", 18) ) { if ( sXMPPtr != 0 ) { tree->addComment ( " ** Redundant XMP **" ); } else { CaptureXMP ( (keywordPtr + 22), (chunkLen - 22), (chunkOffset + 8 + 22) ); XMP_Uns32 otherFlags = GetUns32BE (keywordPtr+18); if ( otherFlags != 0 ) tree->addComment ( "** bad flags %.8X **", otherFlags ); } } } return (8 + chunkLen + 4); } // DumpPNGChunk // ================================================================================================= static void DumpPNG ( LFA_FileRef file, XMP_Uns32 pngLen ) { // A PNG file contains an 8 byte signature followed by a sequence of chunks. XMP_Uns32 chunkOffset = 8; while ( chunkOffset < pngLen ) { XMP_Uns32 chunkLen = DumpPNGChunk ( file, pngLen, chunkOffset ); chunkOffset += chunkLen; } if ( sXMPPtr != 0 ) DumpXMP ( "PNG XMP 'iTXt' chunk" ); } // DumpPNG // ================================================================================================= static void DumpInDesign (LFA_FileRef file, XMP_Uns32 inddLen) { InDesignMasterPage masters[2]; size_t dbPages; XMP_Uns8 cobjEndian; // FIgure out which master page to use. LFA_Seek (file, 0, SEEK_SET); LFA_Read ( file, &masters, sizeof(masters), true); XMP_Uns64 seq0 = GetUns64LE ((XMP_Uns8 *) &masters[0].fSequenceNumber); XMP_Uns64 seq1 = GetUns64LE ((XMP_Uns8 *) &masters[1].fSequenceNumber); if (seq0 > seq1) { dbPages = GetUns32LE ((XMP_Uns8 *) &masters[0].fFilePages); cobjEndian = masters[0].fObjectStreamEndian; tree->addComment(" Using master page 0"); } else { dbPages = GetUns32LE ((XMP_Uns8 *) &masters[1].fFilePages); cobjEndian = masters[1].fObjectStreamEndian; tree->addComment(" Using master page 1"); } bool bigEndian = (cobjEndian == kINDD_BigEndian); tree->addComment("%d pages, %s endian", dbPages, (bigEndian ? "big" : "little")); // Look for the XMP contiguous object. // *** XMP_Int64 cobjPos = (XMP_Int64)dbPages * kINDD_PageSize; // ! Use a 64 bit multiply! XMP_Uns32 cobjPos = dbPages * kINDD_PageSize; XMP_Uns32 cobjLen; for (; cobjPos < inddLen; cobjPos += cobjLen) { InDesignContigObjMarker cobjHead; LFA_Seek (file, cobjPos, SEEK_SET); LFA_Read ( file, &cobjHead, sizeof(cobjHead), true); if (! CheckBytes (&cobjHead.fGUID, kINDDContigObjHeaderGUID, kInDesignGUIDSize)) { // No Contiguous Object header. Could be in zero padding for the last page. XMP_Uns8 fileTail [kINDD_PageSize]; size_t tailLen = inddLen - cobjPos; bool endOK = (tailLen < kINDD_PageSize); if (endOK) { LFA_Seek ( file, cobjPos, SEEK_SET ); LFA_Read ( file, fileTail, sizeof(fileTail), true); for (size_t i = 0; i < tailLen; ++i) { if (fileTail[i] != 0) { endOK = false; break; } } } if (endOK) break; tree->addComment(" ** No Contiguous Object GUID at offset %u (0x%X) tree.", cobjPos, cobjPos); return; } cobjHead.fObjectUID = GetUns32LE (&cobjHead.fObjectUID); cobjHead.fObjectClassID = GetUns32LE (&cobjHead.fObjectClassID); cobjHead.fStreamLength = GetUns32LE (&cobjHead.fStreamLength); cobjHead.fChecksum = GetUns32LE (&cobjHead.fChecksum); cobjLen = cobjHead.fStreamLength + (2 * sizeof(InDesignContigObjMarker)); tree->addComment(" ContigObj offset %d (0x%X), size %d, Object UID %.8X, class ID %.8X, checksum %.8X", cobjPos, cobjPos, cobjHead.fStreamLength, cobjHead.fObjectUID, cobjHead.fObjectClassID, cobjHead.fChecksum); if ((cobjHead.fObjectClassID & 0x40000000) == 0) tree->addComment("read only"); XMP_Uns32 xmpLen; LFA_Read ( file, &xmpLen, 4, true); if (bigEndian) { xmpLen = GetUns32BE (&xmpLen); } else { xmpLen = GetUns32LE (&xmpLen); } XMP_Uns8 xmpStart[16]; // Enough for " (4+16)) && ((xmpLen+4) == cobjHead.fStreamLength) && CheckBytes (xmpStart, "addComment("** redundant XMP **"); } else { tree->addComment("XMP"); CaptureXMPF (file, (cobjPos + sizeof(InDesignContigObjMarker) + 4), xmpLen); } } } if (sXMPPtr != 0) DumpXMP ("InDesign XMP Contiguous Object"); } // DumpInDesign // ================================================================================================= #define kSWF_FileAttributesTag 69 #define kSWF_MetadataTag 77 static void DumpSWF ( LFA_FileRef file, XMP_Uns32 swfLen ) { // SWF is a chunky format, the chunks are called tags. The data of a tag cannot contain an // offset to another tag, so tags can generally be freely inserted, removed, etc. Each tag has a // header followed by data. There are short (2 byte) and long (6 byte) headers. A short header // is a UInt16 with a type code in the upper 10 bits and data length in the lower 6 bits. The // length does not include the header. A length of 63 (0x3F) indicates a long header. This adds // an SInt32 data length. // // All multi-byte integers in SWF are little endian. Strings use byte storage and are null // terminated. In SWF 5 or earlier strings use ASCII or shift-JIS encoding with no indication in // the file. In SWF 6 or later strings use UTF-8. // // The overall structure of a SWF file: // File header // FileAttributes tag, optional before SWF 8 // other tags // End tag // // The End tag is #0. No data is defined, but a reader should process the length normally. The // last tag must be an End tag, but End tags can also be used elsewhere (e.g. to end a sprite // definition). There is no standard tag for free or unused space. // // SWF file header: // 0 3 - signature, "FWS"=uncompressed, 'CWS'=compressed (zlib, SWF6 or later) // 3 1 - UInt8 major version // 4 4 - UInt32 uncompressed file length // 8 v - frame rectangle, variable size // ? 2 - UInt16 frame rate // ? 2 - UInt16 frame count // // FileAttributes tag, #69: // 0 3 - reserved, must be 0 // 3 1 - HasMetadata, 0/1 Boolean // 4 3 - reserved, must be 0 // 7 1 - UseNetwork, 0/1 Boolean // 8 24 - reserved, must be 0 // // The Metadata tag is #77. If present, the FileAttributes tag must also be present and // HasMetadata must be set. The data is a string, must be XMP, should be as compact as possible. // // The frame rectangle is a packed sequence of 5 bit fields, with zero bits add as padding to a // byte boundary. The first field is 5 bits long and gives the number of bits in each of the // other 4 fields (0..31). The others are signed integers for the X min/max and Y min/max // coordinates. The frame rectangle field is at least 2 bytes long, and at most 17 bytes long. XMP_Uns8 buffer [100]; // Big enough, need 32 for file header and 38 for FileAttributes. size_t ioCount; // Dump the file header. bool isCompressed = false; bool hasMetadata = false; XMP_Uns8 fileVersion; XMP_Uns32 fullLength; XMP_Uns8 rectBits; XMP_Uns16 frameRate, frameCount; ioCount = LFA_Read ( file, buffer, sizeof(buffer), true); if ( ioCount < 14 ) { tree->comment ( "** Invalid SWF, file header is too short." ); return; } if ( CheckBytes ( buffer, "CWS", 3 ) ) { isCompressed = true; } else if ( ! CheckBytes ( buffer, "FWS", 3 ) ) { tree->comment ( "** Invalid SWF, unknown file header signature." ); return; } fileVersion = buffer[3]; fullLength = GetUns32LE ( &buffer[4] ); rectBits = buffer[8] >> 3; XMP_Uns32 rectBytes = ((5 + 4*rectBits) + 7) >> 3; XMP_Uns32 headerBytes = 8 + rectBytes + 4; if ( ioCount < headerBytes ) { tree->comment ( "** Invalid SWF, file header is too short." ); return; } frameRate = GetUns16LE ( &buffer[8+rectBytes] ); frameCount = GetUns16LE ( &buffer[8+rectBytes+2] ); // *** Someday decode the frame rectangle. tree->comment ( "File Header: %scompressed, version %d, full length %d, frame rate %d, frame count %d", (isCompressed ? "" : "un"), fileVersion, fullLength, frameRate, frameCount ); if ( isCompressed ) { // *** Add support to decompress into a temp file. tree->comment ( "** Ignoring compressed SWF contents." ); return; } // Dump the tags in the body of the file. XMP_Uns16 tagType; XMP_Uns32 tagOffset, tagLength, headerLength, dataLength; for ( tagOffset = headerBytes; (tagOffset < swfLen); tagOffset += tagLength ) { // Read the tag header, extract the type and data length. LFA_Seek ( file, tagOffset, SEEK_SET ); ioCount = LFA_Read ( file, buffer, sizeof(buffer), true); if ( ioCount < 2 ) { tree->comment ( "** Invalid SWF, tag header is too short at offset %u (0x%X).", tagOffset, tagOffset ); break; } tagType = GetUns16LE ( &buffer[0] ); dataLength = tagType & 0x3F; tagType = tagType >> 6; if ( dataLength < 63 ) { headerLength = 2; } else { if ( ioCount < 6 ) { tree->comment ( "** Invalid SWF, tag header is too short at offset %u (0x%X).", tagOffset, tagOffset ); break; } headerLength = 6; dataLength = GetUns32LE ( &buffer[2] ); } tagLength = headerLength + dataLength; // Make sure the tag fits in the file, being careful about arithmetic overflow. if ( tagLength > (swfLen - tagOffset) ) { tree->comment ( "** Invalid SWF, tag is too long at offset %u (0x%X).", tagOffset, tagOffset ); break; } // See if this is the FileAttributes tag or the Metadata tag. if ( (tagOffset == headerBytes) && (tagType != kSWF_FileAttributesTag) && (fileVersion >= 8) ) { tree->comment ( "** Invalid SWF, first tag is not FileAttributes." ); } if ( tagType == kSWF_FileAttributesTag ) { if ( dataLength < 32 ) { tree->comment ( "** Invalid SWF, FileAttributes tag is too short at offset %u (0x%X).", tagOffset, tagOffset ); continue; } XMP_Uns8 xmpFlag = buffer[headerLength+3]; if ( xmpFlag != 0 ) { hasMetadata = true; if ( xmpFlag != 1 ) { tree->comment ( "** Improper SWF, HasMetadata flag not 0/1 at tag offset %d (0x%X).", tagOffset, tagOffset ); } } tree->comment ( "FileAttributes tag @ %d (0x%X), %s XMP", tagOffset, tagOffset, (hasMetadata ? "has" : "no") ); } else if ( tagType == kSWF_MetadataTag ) { if ( ! hasMetadata ) { tree->comment ( "** Invalid SWF, Metadata tag without HasMetadata flag at offset %u (0x%X).", tagOffset, tagOffset ); continue; } tree->comment ( "Metadata tag @ %d (0x%X)", tagOffset, tagOffset ); if ( sXMPPtr != 0 ) { tree->comment ( " ** Redundant Metadata tag" ); } else { CaptureXMPF ( file, (tagOffset + headerLength), dataLength ); } } else { // Only for deep debugging: // tree->comment ( "Unspecified tag #%d @ %d (0x%X)", tagType, tagOffset, tagOffset ); } } if ( sXMPPtr != 0 ) DumpXMP ( "SWF Metadata tag (#77) XMP" ); } // DumpSWF // ================================================================================================= static XMP_Uns32 DumpScriptDataArray ( LFA_FileRef file, XMP_Uns32 sdOffset, XMP_Uns32 count, bool isStrict, bool isOnXMP = false ); static XMP_Uns32 DumpScriptDataObject ( LFA_FileRef file, XMP_Uns32 sdOffset ); static XMP_Uns32 DumpScriptDataObjectList ( LFA_FileRef file, XMP_Uns32 sdOffset ); static inline XMP_Uns32 GetUns24BE ( XMP_Uns8 * ptr ) { return (GetUns32BE(ptr) >> 8); } #define ReadSDValue(len) \ ioCount = LFA_Read ( file, buffer, len,true); \ if ( ioCount != len ) { \ tree->comment ( "** Failure reading ScriptDataValue, ioCount = %d", ioCount ); \ return (sdOffset + 1 + ioCount); \ } static XMP_Uns32 DumpScriptDataValue ( LFA_FileRef file, XMP_Uns32 sdOffset, bool isOnXMP = false ) { XMP_Uns8 buffer [64*1024]; size_t ioCount; XMP_Uns8 kind; XMP_Uns16 u16; XMP_Uns32 u32; XMP_Uns64 u64; LFA_Seek ( file, sdOffset, SEEK_SET ); ioCount = LFA_Read ( file, &kind, 1, true); if ( ioCount != 1 ) { tree->comment ( "** Failure reading ScriptDataValue kind, ioCount = %d", ioCount ); return sdOffset; } if ( isOnXMP ) { if ( (kind != 8) && (kind != 2) && (kind != 0xC) ) { tree->comment ( "** Invalid kind for onXMPData tag **" ); } } XMP_Uns64 time; XMP_Int16 tz; switch ( kind ) { case 0x00: // A number, IEEE double. ReadSDValue ( 8 ); u64 = GetUns64BE ( &buffer[0] ); tree->addComment ( "float = %f", *((double*)(&u64)) ); return (sdOffset + 1 + 8); case 0x01: // A 0/1 Boolean. (??? general Uns8?) ReadSDValue ( 1 ); tree->addComment ( "bool = %d", buffer[0] ); return (sdOffset + 1 + 1); case 0x02: // A short UTF-8 string, leading 2 byte count. ReadSDValue ( 2 ); u16 = GetUns16BE ( &buffer[0] ); ReadSDValue ( u16 ); //Samy: restrict to string under 4k. This was crashing for large XMP packets before, because addComment // uses a fixed buffer with the size 4096 if (int(u16) < 4096 ) { tree->addComment ( "string (%d) = \"%.*s\"", u16, u16, buffer ); } else { tree->addComment ( "string (%d) ", u16 ); } if ( buffer[u16-1] != 0 ) tree->addComment ( "value lacks trailing nul" ); if ( isOnXMP ) CaptureXMPF ( file, (sdOffset+1+2), u16 ); return (sdOffset + 1 + 2 + u16); case 0x03: // An object list, triples of 0x02/key/value, ends at 0x02000009. tree->addComment ( "object list" ); return DumpScriptDataObjectList ( file, sdOffset+1 ); case 0x04: // A movie clip path as short UTF-8 string ReadSDValue ( 2 ); u16 = GetUns16BE ( &buffer[0] ); ReadSDValue ( u16 ); tree->addComment ( "movie (%d) = \"%.*s\"", u16, u16, buffer ); if ( buffer[u16-1] != 0 ) tree->addComment ( "value lacks trailing nul" ); return (sdOffset + 1 + 2 + u16); case 0x05: // A null, single byte. tree->addComment ( "null" ); return (sdOffset + 1); case 0x06: // A undefined, single byte. tree->addComment ( "undefined" ); return (sdOffset + 1); case 0x07: // A reference, Uns16. ReadSDValue ( 2 ); u16 = GetUns16BE ( &buffer[0] ); tree->addComment ( "reference = %d", u16 ); return (sdOffset + 1 + 2); case 0x08: // An ECMA array, 32-bit count then any number of key/value pairs. Has 0x000009 terminator. ReadSDValue ( 4 ); u32 = GetUns32BE ( &buffer[0] ); tree->addComment ( "ECMA array [%d]", u32 ); return DumpScriptDataArray ( file, sdOffset+1+4, u32, false, isOnXMP ); case 0x09: // End of object or array. Should not see this here! tree->addComment ( "** end **" ); return (sdOffset + 1); case 0x0A: // A strict array, count then that many key/value pairs, no 0x000009 terminator. ReadSDValue ( 4 ); u32 = GetUns32BE ( &buffer[0] ); tree->addComment ( "strict array [%d]", u32 ); return DumpScriptDataArray ( file, sdOffset+1+4, u32, true ); case 0x0B: // A date, Uns64 milliseconds since Jan 1 1970, Int16 TZ offset in minutes. ReadSDValue ( 10 ); time = GetUns64BE ( &buffer[0] ); tz = (XMP_Int16) GetUns16BE ( &buffer[8] ); tree->addComment ( "date, time=%ULL, tz=%d", time, tz ); return (sdOffset + 1 + 10); case 0x0C: // A long UTF-8 string, leading 4 byte count. ReadSDValue ( 4 ); u32 = GetUns32BE ( &buffer[0] ); if ( u32 < sizeof(buffer) ) { ReadSDValue ( u32 ); tree->addComment ( "long string (%d) = \"%.*s\"", u32, u32, buffer ); if ( buffer[u32-1] != 0 ) tree->addComment ( "value lacks trailing nul" ); } else { ReadSDValue ( sizeof(buffer) ); tree->addComment ( "long string (%d) = \"%.*s\"", u32, sizeof(buffer), buffer ); tree->comment ( "** truncated long string output **" ); } if ( isOnXMP ) CaptureXMPF ( file, (sdOffset+1+4), u32 ); return (sdOffset + 1 + 4 + u32); case 0x0D: // Unsupported, single byte. tree->addComment ( "unsupported" ); return (sdOffset + 1); case 0x0E: // A RecordSet. (???) tree->addComment ( "** record set ?? **" ); return (sdOffset + 1); case 0x0F: // XML as a long UTF-8 string ReadSDValue ( 4 ); u32 = GetUns32BE ( &buffer[0] ); if ( u32 < sizeof(buffer) ) { ReadSDValue ( u32 ); tree->addComment ( "XML (%d) = \"%.*s\"", u32, u32, buffer ); if ( buffer[u32-1] != 0 ) tree->addComment ( "value lacks trailing nul" ); } else { ReadSDValue ( sizeof(buffer) ); tree->addComment ( "XML (%d) = \"%.*s\"", u32, sizeof(buffer), buffer ); tree->comment ( "** truncated long string output **" ); } if ( isOnXMP ) CaptureXMPF ( file, (sdOffset+1+4), u32 ); return (sdOffset + 1 + 4 + u32); case 0x10: // A typed object list, short string class name, object list (like case 0x03). ReadSDValue ( 2 ); u16 = GetUns16BE ( &buffer[0] ); ReadSDValue ( u16 ); tree->addComment ( "class, name = %.*s", u16, u16, buffer ); if ( buffer[u16-1] == 0 ) tree->addComment ( "name has trailing nul" ); return DumpScriptDataObjectList ( file, (sdOffset + 1 + 2 + u16) ); case 0x11: // AMF 3 data. (???) tree->addComment ( "** AMF 3 data ?? **" ); return (sdOffset + 1); default: tree->addComment ( "** unknown kind = %d **", kind ); return (sdOffset + 1); } } // DumpScriptDataValue // ================================================================================================= static XMP_Uns32 DumpScriptVariable ( LFA_FileRef file, XMP_Uns32 sdOffset, bool isOnXMP = false ) { XMP_Uns8 buffer [64*1024]; size_t ioCount; LFA_Seek ( file, sdOffset, SEEK_SET ); ioCount = LFA_Read ( file, buffer, 2, true ); if ( ioCount != 2 ) { tree->comment ( "** Failure reading DumpScriptVariable start, ioCount = %d", ioCount ); return (sdOffset + ioCount); } XMP_Uns16 nameLen = GetUns16BE ( &buffer[0] ); ioCount = LFA_Read ( file, buffer, nameLen, true ); if ( ioCount != nameLen ) { tree->comment ( "** Failure reading ScriptDataObject name, ioCount = %d", ioCount ); return (sdOffset + 3 + ioCount); } tree->pushNode ( "%.*s @ 0x%X", nameLen, buffer, sdOffset ); if ( buffer[nameLen-1] == 0 ) tree->addComment ( "name has trailing nul" ); if ( strncmp ( (char*)buffer, "liveXML", nameLen ) != 0 ) isOnXMP = false; // ! Else keep the input value. XMP_Uns32 nextOffset = DumpScriptDataValue ( file, (sdOffset+2+nameLen), isOnXMP ); tree->popNode(); return nextOffset; } // DumpScriptVariable // ================================================================================================= static XMP_Uns32 DumpScriptDataArray ( LFA_FileRef file, XMP_Uns32 sdOffset, XMP_Uns32 headerCount, bool isStrict, bool isOnXMP /* = false */ ) { XMP_Uns8 buffer [3]; size_t ioCount; XMP_Uns32 actualCount = 0; XMP_Uns32 currOffset = sdOffset; if ( isStrict ) { for ( ; headerCount > 0; --headerCount ) { XMP_Uns32 nextOffset = DumpScriptVariable ( file, currOffset ); if ( nextOffset == currOffset ) { tree->comment ( "** Failure reading DumpScriptDataArray, no progress" ); return currOffset; } currOffset = nextOffset; } } else { while ( true ) { LFA_Seek ( file, currOffset, SEEK_SET ); ioCount = LFA_Read ( file, buffer, 3, true ); if ( ioCount != 3 ) { tree->comment ( "** Failure check DumpScriptDataArray, ioCount = %d", ioCount ); return (currOffset + ioCount); } if ( GetUns24BE ( &buffer[0] ) == 9 ) break; XMP_Uns32 nextOffset = DumpScriptVariable ( file, currOffset, isOnXMP ); if ( nextOffset == currOffset ) { tree->comment ( "** Failure reading DumpScriptDataArray, no progress" ); return currOffset; } ++actualCount; currOffset = nextOffset; } if ( (headerCount != (XMP_Uns32)(-1)) && (headerCount != actualCount) ) { tree->comment ( "Count mismatch, actual = %d", actualCount ); // ! Not an error! } currOffset += 3; // ! Include the 0x000009 terminator. } return currOffset; } // DumpScriptDataArray // ================================================================================================= static XMP_Uns32 DumpScriptDataObject ( LFA_FileRef file, XMP_Uns32 sdOffset ) { XMP_Uns8 buffer [64*1024]; size_t ioCount; LFA_Seek ( file, sdOffset, SEEK_SET ); ioCount = LFA_Read ( file, buffer, 2,true); if ( ioCount != 2 ) { tree->comment ( "** Failure reading ScriptDataObject name length, ioCount = %d", ioCount ); return (sdOffset + ioCount); } XMP_Uns16 nameLen = GetUns16BE ( &buffer[1] ); ioCount = LFA_Read ( file, buffer, nameLen, true); if ( ioCount != nameLen ) { tree->comment ( "** Failure reading ScriptDataObject name, ioCount = %d", ioCount ); return (sdOffset + 2 + ioCount); } tree->pushNode ( "%.*s @ 0x%X", nameLen, buffer, sdOffset ); if ( buffer[nameLen-1] == 0 ) tree->addComment ( "name has trailing nul" ); XMP_Uns32 nextOffset = DumpScriptDataValue ( file, (sdOffset+2+nameLen) ); tree->popNode(); return nextOffset; } // DumpScriptDataObject // ================================================================================================= static XMP_Uns32 DumpScriptDataObjectList ( LFA_FileRef file, XMP_Uns32 sdOffset ) { XMP_Uns8 buffer [3]; size_t ioCount; XMP_Uns32 currOffset = sdOffset; while ( true ) { LFA_Seek ( file, currOffset, SEEK_SET ); ioCount = LFA_Read ( file, buffer, 3, true); if ( ioCount != 3 ) { tree->comment ( "** Failure check ScriptDataObjectList, ioCount = %d", ioCount ); return (currOffset + ioCount); } XMP_Uns32 endFlag = GetUns24BE ( &buffer[0] ); if ( endFlag == 9 ) return (currOffset + 3); XMP_Uns32 nextOffset = DumpScriptDataObject ( file, currOffset ); if ( nextOffset == currOffset ) { tree->comment ( "** Failure reading ScriptDataObjectList, no progress" ); return currOffset; } currOffset = nextOffset; } } // DumpScriptDataObjectList // ================================================================================================= static XMP_Uns32 DumpScriptDataTagContent ( LFA_FileRef file, XMP_Uns32 sdOffset, XMP_Uns32 tagTime ) { XMP_Uns8 buffer [64*1024]; size_t ioCount; LFA_Seek ( file, sdOffset, SEEK_SET ); ioCount = LFA_Read ( file, buffer, 3, true ); if ( (ioCount != 3) || (buffer[0] != 2) ) { tree->comment ( "** Failure reading ScriptDataObject start, ioCount = %d, buffer[0]=0x%X", ioCount, buffer[0] ); return (sdOffset + ioCount); } XMP_Uns16 nameLen = GetUns16BE ( &buffer[1] ); ioCount = LFA_Read ( file, buffer, nameLen, true ); if ( ioCount != nameLen ) { tree->comment ( "** Failure reading ScriptDataObject name, ioCount = %d", ioCount ); return (sdOffset + 3 + ioCount); } tree->addComment ( "%.*s @ 0x%X", nameLen, buffer, sdOffset ); if ( buffer[nameLen-1] == 0 ) tree->addComment ( "name has trailing nul" ); bool isOnXMP = (tagTime == 0) && (nameLen == 9) && (strncmp ( (char*)buffer, "onXMPData", 9 ) == 0); return DumpScriptDataValue ( file, (sdOffset+1+2+nameLen), isOnXMP ); } // DumpScriptDataTagContent // ================================================================================================= static void DumpFLV ( LFA_FileRef file, XMP_Uns32 flvLen ) { // FLV must not be confused with SWF, they are quite different internally. FLV is a chunky // format, the chunks are called tags. All multi-byte integers in FLV are stored in big endian // order. An FLV file begins with a variable length file header followed by a sequence of tags // (the file body). // // Each tag contains a header, content, and back-pointer. The size in a tag header is just the // data size. The back-pointer is the full size of the preceeding tag, not just the data length. // The first tag is preceeded by a 0 back-pointer (not by the length of the header). The last // tagk is followed by a back pointer. // // The FLV file header: // 0 3 - signature, "FLV" // 3 1 - UInt8 major version // 4 1 - UInt8 flags // 5 4 - UInt32 size of header (offset to body) // // The FLV tag header: // 0 1 - UInt8 tag type // 1 3 - UInt24 length of data // 4 3 - UInt24 timestamp, milliseconds into the playback // 7 1 - UInt8 timestamp high, for a full UInt32 playback time // 8 3 - UInt24 stream ID, must be 0 // // Only 3 tag types are defined by SWF-FLV-8, 8 = audio, 9 = video, 18 = script data. There is // confusion or missing information in the spec about script data tags. In one place it uses the // term "script data", in another SCRIPTDATAOBJECT for type 18. Then within the "Data Tags" // section it talks about SCRIPTDATAOBJECT, SCRIPTDATAOBJECTEND, SCRIPTDATASTRING, // SCRIPTDATALONGSTRING, SCRIPTDATAVALUE, SCRIPTDATAVARIABLE, SCRIPTDATAVARIABLEEND, and // SCRIPTDATADATE. It isn't clear if these SCRIPTDATA* things are FLV tags, or substructure // within the data of tag type 18. XMP_Uns8 buffer [100]; size_t ioCount; XMP_Uns32 size, time, stream, backSize; ioCount = LFA_Read ( file, buffer, 9+4, true); if ( ioCount != 9+4 ) { tree->comment ( "** Failure reading FLV header, ioCount = %d", ioCount ); return; } size = GetUns32BE ( &buffer[5] ); tree->addComment ( "FLV header: \"%.3s\", version %d, flags 0x%.2X, size %d (0x%X)", &buffer[0], buffer[3], buffer[4], size ); LFA_Seek ( file, size, SEEK_SET ); ioCount = LFA_Read ( file, buffer, 4, true); if ( ioCount != 4 ) { tree->comment ( "** Failure reading leading backSize, ioCount = %d", ioCount ); return; } backSize = GetUns32BE ( &buffer[0] ); if ( backSize != 0 ) { tree->comment ( "** Bad leading backSize = %d", backSize ); return; } for ( XMP_Uns32 tagOffset = (size+4); tagOffset < flvLen; tagOffset += (11+size+4) ) { LFA_Seek ( file, tagOffset, SEEK_SET ); ioCount = LFA_Read ( file, buffer, 11, true); // Back pointer plus tag header. if ( ioCount != 11 ) { tree->comment ( "** Failure reading FLV tag, ioCount = %d", ioCount ); return; } size = GetUns24BE ( &buffer[1] ); time = GetUns24BE ( &buffer[4] ); time += ((XMP_Uns32)buffer[7] << 24); stream = GetUns24BE ( &buffer[8] ); if ( time != 0 ) break; // ! Just do the time 0 tags for this tool. char label [100]; char comment [1000]; XMP_Uns8 kind = buffer[0]; if ( kind == 8 ) { if ( time == 0 ) sprintf ( label, "Audio" ); // Don't normally print, there are too many. } else if ( kind == 9 ) { if ( time == 0 ) sprintf ( label, "Video" ); // Don't normally print, there are too many. } else if ( kind == 18 ) { sprintf ( label, "ScriptData" ); } else { sprintf ( label, "", kind ); } sprintf ( comment, "%s @ 0x%X, size=%d, time=%d, stream=%d", label, tagOffset, size, time, stream ); tree->pushNode ( comment ); LFA_Seek ( file, (tagOffset+11+size), SEEK_SET ); ioCount = LFA_Read ( file, buffer, 4, true ); // Back pointer plus tag header. if ( ioCount != 4 ) { tree->comment ( "** Failure reading backSize, ioCount = %d", ioCount ); return; } backSize = GetUns32BE ( &buffer[0] ); if ( backSize != (11+size) ) tree->comment ( "** Bad backSize= %d", backSize ); if ( kind == 18 ) { XMP_Uns32 endOffset = DumpScriptDataTagContent ( file, (tagOffset+11), time ); if ( endOffset != (tagOffset+11+size) ) { tree->comment ( "** Bad endOffset = 0x%X", endOffset ); } } tree->popNode(); } if ( sXMPPtr != 0 ) DumpXMP ( "FLV onXMPData tag" ); } // DumpFLV // ================================================================================================= static bool PrintID3Encoding ( XMP_Uns8 encoding, XMP_Uns8 * strPtr ) { bool bigEndian = true; switch ( encoding ) { case 0 : tree->addComment ( "Latin1" ); break; case 1 : if ( *strPtr == 0xFF ) bigEndian = false; tree->addComment ( "UTF-16 with BOM, %s)", (bigEndian ? "BE" : "LE") ); break; case 2 : tree->addComment ( "UTF-16 BE" ); break; case 3 : tree->addComment ( "UTF-8" ); break; default : tree->addComment ( "** unknown **" ); break; } return bigEndian; } // PrintID3Encoding // ================================================================================================= //static void //PrintID3EncodedText (XMP_Uns8 encoding, void * _strPtr, const char * label) //{ //} // PrintID3EncodedText // ================================================================================================= struct ID3_Header { char id3[3]; XMP_Uns8 vMajor, vMinor, flags; XMP_Uns8 size[4]; }; struct ID3_FrameHeader { char id[4]; XMP_Uns32 size; XMP_Uns16 flags; }; #define _U32b(ptr,n) ((XMP_Uns32) (((XMP_Uns8*)(ptr))[n])) #define GetSyncSafe32(ptr) ((_U32b(ptr,0) << 21) | (_U32b(ptr,1) << 14) | (_U32b(ptr,2) << 7) | _U32b(ptr,3)) #define GetID3Size(ver,ptr) ((ver == 3) ? GetUns32BE(ptr) : GetSyncSafe32(ptr)) static void DumpMP3 (LFA_FileRef file, XMP_Uns32 /*mp3Len*/) { // ** We're ignoring the effects of the unsync flag, and not checking the CRC (if present). assert (sizeof(ID3_Header) == 10); assert (sizeof(ID3_FrameHeader) == 10); // Detect ID3v1 header: if ( LFA_Measure( file ) > 128 ) { LFA_Seek( file, -128, SEEK_END ); XMP_Uns32 tagID = 0xFFFFFF00 & LFA_ReadUns32_BE( file ); if ( tagID == 0x54414700 ) // must be "TAG" { // Dump ID3v1 header: tree->pushNode("ID3v1"); Rewind( file, 1 ); // read one byte too many... tree->digestString( file, "ID3v1:title", 30, false, true ); tree->digestString( file, "ID3v1:artist", 30, false, true ); tree->digestString( file, "ID3v1:album", 30, false, true ); tree->digestString( file, "ID3v1:year", 4, false, true ); tree->digestString( file, "ID3v1:comment", 30, false, true ); tree->digest( file, "ID3v1:genreNo", 0, 1 ); // ID3v1.1 trackNo byte dance: Rewind( file, 3); LFA_Tell( file ); if ( LFA_ReadUns8( file ) == 0 ) tree->digest( file, "ID3v1:trackNo", 0, 1 ); tree->popNode(); } } // Dump ID3v2 header: ID3_Header id3Head; LFA_Seek (file, 0, SEEK_SET); LFA_Read ( file, &id3Head, sizeof(id3Head), true); if (! CheckBytes (id3Head.id3, "ID3", 3)) { tree->setKeyValue("No ID3v2 tag"); return; } XMP_Uns32 id3Len = GetSyncSafe32 (id3Head.size); XMP_Uns32 framePos = sizeof(id3Head); // The offset of the next (first) ID3 frame. XMP_Uns32 frameEnd = framePos + id3Len; tree->pushNode("ID3v2.%d.%d, size %d, flags 0x%.2X",id3Head.vMajor, id3Head.vMinor, id3Len, id3Head.flags); if (id3Head.flags != 0) { tree->addComment("%s%s%s%s", ((id3Head.flags & 0x80) ? ", unsync" : ""), ((id3Head.flags & 0x40) ? ", extended header" : ""), ((id3Head.flags & 0x20) ? ", experimental" : ""), ((id3Head.flags & 0x10) ? ", has footer" : "")); } if ((id3Head.vMajor != 3) && (id3Head.vMajor != 4)) { tree->addComment(" ** Unrecognized major version tree."); tree->popNode(); return; } bool hasExtHeader = ((id3Head.flags & 0x40) != 0); // Dump the extended header if present. if (hasExtHeader) { XMP_Uns32 extHeaderLen; extHeaderLen = tree->digest32u(file); extHeaderLen = GetID3Size (id3Head.vMajor, &extHeaderLen); framePos += (4 + extHeaderLen); if (id3Head.vMajor == 3) { XMP_Uns16 extHeaderFlags; LFA_Read ( file, &extHeaderFlags, 2, true ); extHeaderFlags = GetUns16BE (&extHeaderFlags); XMP_Uns32 padLen; LFA_Read ( file, &padLen, 4, true ); padLen = GetUns32BE (&padLen); frameEnd -= padLen; tree->pushNode("Extended header MajorV3 size %d, flags 0x%.4X, pad size %d", extHeaderLen, extHeaderFlags, padLen); if (extHeaderFlags & 0x8000) { XMP_Uns32 crc; LFA_Read ( file, &crc, 4, true ); crc = GetUns32BE (&crc); tree->setKeyValue( "CRC" , fromArgs("0x%.8X", crc) ); } tree->popNode(); } else if (id3Head.vMajor == 4) { XMP_Uns8 flagCount; LFA_Read ( file, &flagCount, 1, true ); tree->pushNode("Extended header MajorV4 size %d, flag count %d", extHeaderLen, flagCount); for (size_t i = 0; i < flagCount; ++i) { XMP_Uns8 flag; LFA_Read ( file, &flag, 1, true ); tree->setKeyValue( fromArgs( "Flag %.2d", flag ) , fromArgs( "0x%.2X", flag ) ); } tree->popNode(); } else { // ADDED tree->addComment("unknown major version !"); } } //////////////////////////////////////////////////// // Dump the ID3 frames while (framePos < frameEnd) { if ((frameEnd - framePos) < 10) break; // Assume into ID3v2.4 padding. ID3_FrameHeader frameHead; LFA_Seek (file, framePos, SEEK_SET); LFA_Read ( file, &frameHead, sizeof(frameHead), true); if (CheckBytes (frameHead.id, "\x0", 1)) break; // Assume into ID3v2.4 padding. // FIXED: there could be just 1 or 2 or 3 bytes of padding total !! frameHead.size = GetID3Size (id3Head.vMajor, &frameHead.size); frameHead.flags = GetUns16BE (&frameHead.flags); tree->setKeyValue( fromArgs( "ID3v2:%.4s",frameHead.id), "", //no value yet, tree->changeValue() below fromArgs( "offset %d (0x%X), size %d, flags 0x%.2X", framePos, framePos, frameHead.size, frameHead.flags) ); if ( frameHead.size == 0 ) { // NOTHING TO DO HERE. // i.e. on 0-byte frames, including known ones... // ( i.e. the testcase of a (errorneous) TCON 0 byte frame ) } else if ( (frameHead.id[0] == 'T') ||(frameHead.id[0] == 'W')) { // Text and URL fields CaptureFileData (file, 0, frameHead.size); XMP_Uns8 encoding = 0; XMP_Uns8 skip = 0; if ( frameHead.id[0] == 'T' ) // URL field has no encoding byte { encoding = sDataPtr[0]; skip = 1; } bool bigEndian = PrintID3Encoding (encoding, (sDataPtr + skip)); if ((encoding == 0) || (encoding == 3)) { tree->changeValue( convert8Bit( sDataPtr + skip, false, frameHead.size-skip ) ); } else if ((encoding == 1) || (encoding == 2)) { tree->changeValue( convert16Bit( bigEndian, sDataPtr + skip, false, (frameHead.size - skip) ) ); } } else if (CheckBytes (frameHead.id, "PRIV", 4) && (frameHead.size >= 4)) { // checking on the XMP packet CaptureFileData (file, 0, frameHead.size); //NB: has side effect: sDataLen, sDataMax, sDataPtr tree->changeValue( convert8Bit(sDataPtr,false,strlen((char*)sDataPtr) )); if (CheckBytes (sDataPtr, "XMP\x0", 4)) { CaptureXMPF (file, (framePos + 10 + 4), (frameHead.size - 4)); } } else if (CheckBytes (frameHead.id, "COMM", 4) || CheckBytes (frameHead.id, "USLT", 4)) { CaptureFileData (file, 0, frameHead.size); XMP_Uns8 * frameEnd2 = sDataPtr + frameHead.size; XMP_Uns8 encoding = sDataPtr[0]; char * lang = (char*) (sDataPtr + 1); tree->addComment("lang '%.3s'", lang); bool bigEndian = PrintID3Encoding (encoding, (sDataPtr + 4)); if ((encoding == 0) || (encoding == 3)) { XMP_Uns8 * descrPtr = sDataPtr + 4; XMP_Uns8 * valuePtr = descrPtr; while (*valuePtr != 0) { ++valuePtr; } ++valuePtr; size_t descrBytes = valuePtr - descrPtr - 1; tree->changeValue( convert8Bit( valuePtr, false, frameEnd2 - valuePtr ) ); if (CheckBytes (frameHead.id, "COMM", 4)) { tree->setKeyValue("ID3v2:COMM-descr", convert8Bit( descrPtr, false, descrBytes ).c_str() ); } } else if ((encoding == 1) || (encoding == 2)) { XMP_Uns16 * descrPtr = (XMP_Uns16*) (sDataPtr + 4); XMP_Uns16 * valuePtr = descrPtr; while (*valuePtr != 0) { ++valuePtr; } ++valuePtr; size_t descrBytes = 2 * (valuePtr - descrPtr - 1); size_t valueBytes = 2 * ((XMP_Uns16*)frameEnd2 - valuePtr); tree->changeValue( convert16Bit( bigEndian, (XMP_Uns8*) valuePtr, false, valueBytes ) ); tree->setKeyValue("ID3v2:COMM-descr", convert16Bit( bigEndian, (XMP_Uns8*) descrPtr, false, descrBytes ).c_str() ); } } framePos += (sizeof(ID3_FrameHeader) + frameHead.size); } if (framePos < frameEnd) { tree->setKeyValue("","", fromArgs("Padding assumed, offset %d (0x%X), size %d",framePos, framePos, (frameEnd - framePos)) ); } if (sXMPPtr != 0) DumpXMP ("ID3 'PRIV' \"XMP\" frame"); tree->popNode(); } // DumpMP3 // ================================================================================================= static void PacketScan (LFA_FileRef file, XMP_Int64 fileLen) { try { XMPScanner scanner (fileLen); LFA_Seek (file, 0, SEEK_SET); XMP_Uns8 buffer [64*1024]; XMP_Uns32 filePos, readLen; for (filePos = 0; filePos < fileLen; filePos += readLen) { readLen = LFA_Read ( file, buffer, sizeof(buffer), false ); if (readLen == 0) throw std::logic_error ("Empty read"); scanner.Scan (buffer, filePos, readLen); } size_t snipCount = scanner.GetSnipCount(); XMPScanner::SnipInfoVector snips (snipCount); scanner.Report (snips); size_t packetCount = 0; for (size_t s = 0; s < snipCount; ++s) { if (snips[s].fState == XMPScanner::eValidPacketSnip) { ++packetCount; CaptureXMPF (file, (XMP_Uns32)snips[s].fOffset, (XMP_Uns32)snips[s].fLength); DumpXMP ("packet scan"); } } if (packetCount == 0) tree->addComment(" No packets found"); } catch (...) { tree->addComment("** Scanner failure tree."); } } // PacketScan // ================================================================================================= // External Routines namespace DumpFile_NS { // ! Xcode compiler warns about normal offsetof macro. #define SafeOffsetOf(type,field) ((size_t)(&(((type*)1000)->field)) - 1000) //assure that packing is 100% tight //see above: // - #pragma pack (1) // - SafeOffsetOf macro definition // // calling this at least once is an extremly good idea, // because among other reasons, the #pragma pack directive // is not ANSI-C thus things could go wrong on one platform or another... // // returns nothing, but asserts will be triggered if something is wrong. static bool selfTestDone=false; void selfTest() { //only very first call at each runtime runs the selfTest (mostly verify about structPacking etc...) if (DumpFile_NS::selfTestDone) return; assert (sizeof (ASF_GUID) == 16); assert (SafeOffsetOf (ASF_GUID, part1) == 0); assert (SafeOffsetOf (ASF_GUID, part2) == 4); assert (SafeOffsetOf (ASF_GUID, part3) == 6); assert (SafeOffsetOf (ASF_GUID, part4) == 8); assert (SafeOffsetOf (ASF_GUID, part5) == 10); assert (sizeof (ASF_ObjHeader) == (16 + 8)); assert (SafeOffsetOf (ASF_ObjHeader, guid) == 0); assert (SafeOffsetOf (ASF_ObjHeader, size) == 16); assert (sizeof (ASF_FileProperties) == kASF_FilePropertiesSize); assert (SafeOffsetOf (ASF_FileProperties, guid) == 0); assert (SafeOffsetOf (ASF_FileProperties, size) == 16); assert (SafeOffsetOf (ASF_FileProperties, fileID) == 24); assert (SafeOffsetOf (ASF_FileProperties, fileSize) == 40); assert (SafeOffsetOf (ASF_FileProperties, creationDate) == 48); assert (SafeOffsetOf (ASF_FileProperties, dataPacketsCount) == 56); assert (SafeOffsetOf (ASF_FileProperties, playDuration) == 64); assert (SafeOffsetOf (ASF_FileProperties, sendDuration) == 72); assert (SafeOffsetOf (ASF_FileProperties, preroll) == 80); assert (SafeOffsetOf (ASF_FileProperties, flags) == 88); assert (SafeOffsetOf (ASF_FileProperties, minDataPacketSize) == 92); assert (SafeOffsetOf (ASF_FileProperties, maxDataPacketSize) == 96); assert (SafeOffsetOf (ASF_FileProperties, maxBitrate) == 100); assert (sizeof (ASF_ContentDescription) == kASF_ContentDescriptionSize); assert (SafeOffsetOf (ASF_ContentDescription, guid) == 0); assert (SafeOffsetOf (ASF_ContentDescription, size) == 16); assert (SafeOffsetOf (ASF_ContentDescription, titleLen) == 24); assert (SafeOffsetOf (ASF_ContentDescription, authorLen) == 26); assert (SafeOffsetOf (ASF_ContentDescription, copyrightLen) == 28); assert (SafeOffsetOf (ASF_ContentDescription, descriptionLen) == 30); assert (SafeOffsetOf (ASF_ContentDescription, ratingLen) == 32); assert (sizeof (InDesignMasterPage) == kINDD_PageSize); assert (SafeOffsetOf (InDesignMasterPage, fGUID) == 0); assert (SafeOffsetOf (InDesignMasterPage, fMagicBytes) == 16); assert (SafeOffsetOf (InDesignMasterPage, fObjectStreamEndian) == 24); assert (SafeOffsetOf (InDesignMasterPage, fIrrelevant1) == 25); assert (SafeOffsetOf (InDesignMasterPage, fSequenceNumber) == 264); assert (SafeOffsetOf (InDesignMasterPage, fIrrelevant2) == 272); assert (SafeOffsetOf (InDesignMasterPage, fFilePages) == 280); assert (SafeOffsetOf (InDesignMasterPage, fIrrelevant3) == 284); assert (sizeof (InDesignContigObjMarker) == 32); assert (SafeOffsetOf (InDesignContigObjMarker, fGUID) == 0); assert (SafeOffsetOf (InDesignContigObjMarker, fObjectUID) == 16); assert (SafeOffsetOf (InDesignContigObjMarker, fObjectClassID) == 20); assert (SafeOffsetOf (InDesignContigObjMarker, fStreamLength) == 24); assert (SafeOffsetOf (InDesignContigObjMarker, fChecksum) == 28); selfTestDone=true; } // selfTest } /*namespace DumpFile_NS*/ // ------------------------------------------------------------------------------------------------- void DumpFile::Scan (std::string filename, TagTree &tagTree, bool resetTree) { DumpFile_NS::selfTest(); //calls selftest (will happen only once per runtime, optimization done) if( resetTree ) { tagTree.reset(); } tree = &tagTree; // static "global" helper to avoid looping throug 'tree' 24x7 // Read the first 4K of the file into a local buffer and determine the file format. // ! We're using ANSI C calls that don't handle files over 2GB. // ! Should switch to copies of the "LFA" routines used inside XMP. LFA_FileRef fileRef = LFA_Open( filename.c_str(), 'r' ); assertMsg ( std::string("can't open ")+filename, fileRef != 0 ); LFA_Seek( fileRef, 0, SEEK_END ); XMP_Int64 fileLen = LFA_Tell(fileRef); XMP_Uns8 first4K [4096]; LFA_Seek ( fileRef, 0, SEEK_SET ); LFA_Read ( fileRef, first4K, 4096, false); LFA_Seek ( fileRef, 0, SEEK_SET ); //rewinds // (remains rewinded behind CheckFileDFormat, since that call does not get the fileRef handle) XMP_FileFormat format = CheckFileFormat ( filename.c_str(), first4K, fileLen ); if ( sXMPPtr != 0) free(sXMPPtr); sXMPPtr = 0; sXMPMax = 0; sXMPLen = 0; sXMPPos = 0; //TODO refactor-out XMP_Uns8 * fileContent = 0; // *** Hack for old file-in-RAM code. if ( format == kXMP_JPEGFile ) { tagTree.pushNode ( "Dumping JPEG file" ); tagTree.addComment ( "size %lld (0x%llx)", fileLen, fileLen ); { fileContent = (XMP_Uns8*) malloc(fileLen); LFA_Seek ( fileRef, 0, SEEK_SET ); LFA_Read ( fileRef, fileContent, fileLen, true ); DumpJPEG ( fileContent, fileLen ); } tagTree.popNode(); } else if ( format == kXMP_PhotoshopFile ) { tagTree.pushNode ( "Dumping Photoshop file" ); tagTree.addComment ( "size %lld (0x%llx)", fileLen, fileLen ); { fileContent = (XMP_Uns8*) malloc(fileLen); LFA_Seek ( fileRef, 0, SEEK_SET ); LFA_Read ( fileRef, fileContent, fileLen, true); DumpPhotoshop ( fileContent, fileLen ); } tagTree.popNode(); } else if ( format == kXMP_TIFFFile ) { tagTree.pushNode ( "Dumping TIFF file" ); tagTree.addComment ( "size %lld (0x%llx)", fileLen, fileLen ); { fileContent = (XMP_Uns8*) malloc(fileLen); LFA_Seek ( fileRef, 0, SEEK_SET ); LFA_Read ( fileRef, fileContent, fileLen, true); DumpTIFF ( fileContent, fileLen, 0, "TIFF file" , ""); } tagTree.popNode(); } else if ( format == kXMP_WMAVFile ) { tagTree.pushNode ( "Dumping ASF (WMA/WMV) file" ); tagTree.addComment ( "size %lld (0x%llx)", fileLen, fileLen ); DumpASF ( fileRef, fileLen ); tagTree.popNode(); } else if ( format == kXMP_AVIFile ) { tagTree.pushNode ( "Dumping AVI file" ); tagTree.addComment ( "size %lld (0x%llx)", fileLen, fileLen ); DumpRIFF ( fileRef, fileLen ); tagTree.popNode(); } else if ( format == kXMP_WAVFile ) { tagTree.pushNode ( "Dumping WAV file" ); tagTree.addComment ( "size %lld (0x%llx)", fileLen, fileLen ); DumpRIFF ( fileRef, fileLen ); tagTree.popNode(); } else if ( format == kXMP_MPEG4File || format == kXMP_MOVFile || format == kXMP_JPEG2KFile ) { // all ISO formats ( MPEG4, MOV, JPEG2000) handled jointly, // - no longer relying on any advance "isQT" flagging tagTree.pushNode ( "ISO file" ); Log::info("size: %d", fileLen ); tagTree.addComment ( "size %I64d (0x%I64X)", fileLen, fileLen ); DumpISO( fileRef, fileLen ); tagTree.popNode(); } else if ( format == kXMP_PNGFile ) { tagTree.pushNode ( "Dumping PNG file" ); tagTree.addComment ( "size %lld (0x%llx)", fileLen, fileLen ); DumpPNG ( fileRef, fileLen ); tagTree.popNode(); } else if ( format == kXMP_InDesignFile ) { tagTree.pushNode ( "Dumping InDesign file" ); tagTree.addComment ( "size %lld (0x%llx)", fileLen, fileLen ); DumpInDesign ( fileRef, fileLen ); tagTree.popNode(); } else if ( format == kXMP_SWFFile ) { tagTree.pushNode ( "Dumping SWF file" ); tagTree.addComment ( "size %lld (0x%llx)", fileLen, fileLen ); DumpSWF ( fileRef, fileLen ); tagTree.popNode(); } else if ( format == kXMP_FLVFile ) { tagTree.pushNode ( "Dumping FLV file" ); tagTree.addComment ( "size %lld (0x%llx)", fileLen, fileLen ); DumpFLV ( fileRef, fileLen ); tagTree.popNode(); } else if ( format == kXMP_MP3File ) { tagTree.pushNode ( "Dumping MP3 file" ); tagTree.addComment ( "size %lld (0x%llx)", fileLen, fileLen ); DumpMP3 ( fileRef, fileLen ); tagTree.popNode(); } else if ( format == kXMP_UCFFile ) { tagTree.pushNode ( "Dumping UCF (Universal Container Format) file" ); tagTree.addComment ( "size %lld (0x%llx)", fileLen, fileLen ); DumpUCF ( fileRef, fileLen ); tagTree.popNode(); } else if ( format == kXMP_MPEGFile ) { tagTree.comment ( "** Recognized MPEG-2 file type, but this is a pure sidecar solution. No legacy dump available at this time." ); } else if ( format == kXMP_UnknownFile ) { tagTree.pushNode ( "Unknown format. packet scanning, size %d (0x%X)", fileLen, fileLen ); PacketScan ( fileRef, fileLen ); tagTree.popNode(); } else { tagTree.comment ( "** Recognized file type, '%.4s', but no smart dumper for it.", &format ); } if ( fileContent != 0) free(fileContent); LFA_Close(fileRef); } // DumpFile void DumpFile::dumpFile( std::string filename ) { TagTree localTree; DumpFile::Scan( filename , localTree ); // (important test in itself for validity) localTree.dumpTree(); } exempi-2.2.1/samples/source/XMPFilesCoverage.cpp0000664000175000017500000002573412150230672016512 00000000000000// ================================================================================================= // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= /** * Demonstrates syntax and usage by exercising most of the API functions of XMPFiles Toolkit SDK component, * using a sample XMP Packet that contains all of the different property and attribute types. */ #include #include #include #include #include #include #include #define TXMP_STRING_TYPE std::string #define XMP_INCLUDE_XMPFILES 1 #include "XMP.hpp" #include "XMP.incl_cpp" using namespace std; #if WIN_ENV #pragma warning ( disable : 4100 ) // ignore unused variable #pragma warning ( disable : 4127 ) // conditional expression is constant #pragma warning ( disable : 4505 ) // unreferenced local function has been removed #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif // ------------------------------------------------------------------------------------------------- FILE * sLogFile = 0; // ------------------------------------------------------------------------------------------------- static void WriteMinorLabel ( FILE * log, const char * title ) { fprintf ( log, "\n// " ); for ( size_t i = 0; i < strlen(title); ++i ) fprintf ( log, "-" ); fprintf ( log, "--\n// %s :\n\n", title ); } // WriteMinorLabel // ------------------------------------------------------------------------------------------------- static XMP_Status DumpToFile ( void * refCon, XMP_StringPtr outStr, XMP_StringLen outLen ) { XMP_Status status = 0; size_t count; FILE * outFile = static_cast < FILE * > ( refCon ); count = fwrite ( outStr, 1, outLen, outFile ); if ( count != outLen ) status = errno; return status; } // DumpToFile // ------------------------------------------------------------------------------------------------- static XMP_Status DumpToString ( void * refCon, XMP_StringPtr outStr, XMP_StringLen outLen ) { std::string * fullStr = static_cast < std::string * > ( refCon ); fullStr->append ( outStr, outLen ); return 0; } // DumpToString // ------------------------------------------------------------------------------------------------- #define DumpOneFormat(fmt) \ format = kXMP_ ## fmt ## File; \ flags = 0; \ ok = SXMPFiles::GetFormatInfo ( format, &flags ); \ fprintf ( sLogFile, "kXMP_" #fmt "File = \"%.4s\", %s, flags = 0x%X\n", \ &format, (ok ? "smart" : "dumb"), flags ); static void DumpHandlerInfo() { WriteMinorLabel ( sLogFile, "Dump file format constants and handler flags" ); bool ok; XMP_FileFormat format; XMP_OptionBits flags; DumpOneFormat ( PDF ); DumpOneFormat ( PostScript ); DumpOneFormat ( EPS ); DumpOneFormat ( JPEG ); DumpOneFormat ( JPEG2K ); DumpOneFormat ( TIFF ); DumpOneFormat ( GIF ); DumpOneFormat ( PNG ); DumpOneFormat ( MOV ); DumpOneFormat ( AVI ); DumpOneFormat ( CIN ); DumpOneFormat ( WAV ); DumpOneFormat ( MP3 ); DumpOneFormat ( SES ); DumpOneFormat ( CEL ); DumpOneFormat ( MPEG ); DumpOneFormat ( MPEG2 ); DumpOneFormat ( WMAV ); DumpOneFormat ( HTML ); DumpOneFormat ( XML ); DumpOneFormat ( Text ); DumpOneFormat ( Photoshop ); DumpOneFormat ( Illustrator ); DumpOneFormat ( InDesign ); DumpOneFormat ( AEProject ); DumpOneFormat ( AEFilterPreset ); DumpOneFormat ( EncoreProject ); DumpOneFormat ( PremiereProject ); DumpOneFormat ( PremiereTitle ); DumpOneFormat ( Unknown ); } // DumpHandlerInfo // ------------------------------------------------------------------------------------------------- static void OpenTestFile ( const char * fileName, XMP_OptionBits rwMode, SXMPMeta* xmpMeta, SXMPFiles* xmpFile ) { bool ok; XMP_FileFormat format; XMP_OptionBits openFlags, handlerFlags; XMP_PacketInfo xmpPacket; bool isUpdate = ((rwMode & kXMPFiles_OpenForUpdate) != 0); static const char * charForms[] = { "UTF-8", "unknown char form", "UTF-16BE", "UTF-16LE", "UTF-32BE", "UTF-32LE" }; XMP_OptionBits smartFlags = rwMode | kXMPFiles_OpenUseSmartHandler; XMP_OptionBits scanFlags = rwMode | kXMPFiles_OpenUsePacketScanning; ok = xmpFile->OpenFile ( fileName, kXMP_UnknownFile, smartFlags ); if ( ! ok ) { fprintf ( sLogFile, "Failed to get a smart handler\n" ); ok = xmpFile->OpenFile ( fileName, kXMP_UnknownFile, scanFlags ); if ( ! ok ) return; } ok = xmpFile->GetFileInfo ( 0, &openFlags, &format, &handlerFlags ); if ( ! ok ) return; fprintf ( sLogFile, "File info : format = \"%.4s\", handler flags = 0x%X, open flags = 0x%X (%s)\n", &format, handlerFlags, openFlags, (isUpdate ? "update" : "read-only") ); ok = xmpFile->GetXMP ( xmpMeta, 0, &xmpPacket ); if ( ! ok ) { fprintf ( sLogFile, "No XMP\n" ); return; } fprintf ( sLogFile, "XMP packet info : file offset = %lld, length = %d, pad = %d", xmpPacket.offset, xmpPacket.length, xmpPacket.padSize ); fprintf ( sLogFile, ", %s", ((xmpPacket.charForm > 5) ? "bad char form" : charForms[xmpPacket.charForm]) ); fprintf ( sLogFile, ", %s\n", (xmpPacket.writeable ? "writeable" : "read-only") ); fprintf ( sLogFile, "\n" ); // Remove extaneous properties to make the dump smaller. SXMPUtils::RemoveProperties ( xmpMeta, kXMP_NS_XMP, "Thumbnails", true ); SXMPUtils::RemoveProperties ( xmpMeta, kXMP_NS_XMP, "PageInfo", true ); SXMPUtils::RemoveProperties ( xmpMeta, "http://ns.adobe.com/xap/1.0/t/pg/", 0, true ); SXMPUtils::RemoveProperties ( xmpMeta, "http://ns.adobe.com/xap/1.0/mm/", 0, true ); #if 1 SXMPUtils::RemoveProperties ( xmpMeta, "http://ns.adobe.com/camera-raw-settings/1.0/", 0, true ); SXMPUtils::RemoveProperties ( xmpMeta, "http://ns.adobe.com/tiff/1.0/", 0, true ); SXMPUtils::RemoveProperties ( xmpMeta, "http://ns.adobe.com/exif/1.0/", 0, true ); SXMPUtils::RemoveProperties ( xmpMeta, "http://ns.adobe.com/exif/1.0/aux/", 0, true ); SXMPUtils::RemoveProperties ( xmpMeta, "http://ns.adobe.com/photoshop/1.0/", 0, true ); SXMPUtils::RemoveProperties ( xmpMeta, "http://ns.adobe.com/pdf/1.3/", 0, true ); #endif } // OpenTestFile // ------------------------------------------------------------------------------------------------- #ifndef OnlyReadOnly #define OnlyReadOnly 0 #endif static void TestOneFile ( const char * fileName ) { char buffer [1000]; SXMPMeta xmpMeta; SXMPFiles xmpFile; XMP_PacketInfo xmpPacket; std::string roDump, rwDump; sprintf ( buffer, "Testing %s", fileName ); WriteMinorLabel ( sLogFile, buffer ); OpenTestFile ( fileName, kXMPFiles_OpenForRead, &xmpMeta, &xmpFile ); xmpMeta.DumpObject ( DumpToString, &roDump ); xmpFile.CloseFile(); if ( OnlyReadOnly ) { fprintf ( sLogFile, "Initial XMP from %s\n", fileName ); xmpMeta.DumpObject ( DumpToFile, sLogFile ); return; } OpenTestFile ( fileName, kXMPFiles_OpenForUpdate, &xmpMeta, &xmpFile ); xmpMeta.DumpObject ( DumpToString, &rwDump ); if ( roDump != rwDump ) { fprintf ( sLogFile, "** Initial read-only and update XMP don't match! **\n\n" ); fprintf ( sLogFile, "Read-only XMP\n%s\nUpdate XMP\n%s\n", roDump.c_str(), rwDump.c_str() ); } fprintf ( sLogFile, "Initial XMP from %s\n", fileName ); xmpMeta.DumpObject ( DumpToFile, sLogFile ); XMP_DateTime now; SXMPUtils::CurrentDateTime ( &now ); std::string nowStr; SXMPUtils::ConvertFromDate ( now, &nowStr ); if ( xmpMeta.CountArrayItems ( kXMP_NS_XMP, "XMPFileStamps" ) >= 9 ) { xmpMeta.DeleteProperty ( kXMP_NS_XMP, "XMPFileStamps" ); } xmpMeta.AppendArrayItem ( kXMP_NS_XMP, "XMPFileStamps", kXMP_PropArrayIsOrdered, "" ); xmpMeta.SetProperty ( kXMP_NS_XMP, "XMPFileStamps[last()]", nowStr.c_str() ); nowStr.insert ( 0, "Updating dc:description at " ); xmpMeta.SetLocalizedText ( kXMP_NS_DC, "description", "", "x-default", nowStr.c_str() ); xmpFile.PutXMP ( xmpMeta ); XMP_OptionBits closeOptions = 0; XMP_OptionBits capabilities = 0; XMP_FileFormat fileFormat = 0; xmpFile.GetFileInfo( NULL, NULL, &fileFormat, NULL); SXMPFiles::GetFormatInfo( fileFormat, &capabilities); if ( (xmpMeta.CountArrayItems ( kXMP_NS_XMP, "XMPFileStamps" ) & 1) == 0 && ( capabilities & kXMPFiles_AllowsSafeUpdate ) ) closeOptions |= kXMPFiles_UpdateSafely; xmpFile.CloseFile ( closeOptions ); fprintf ( sLogFile, "\n" ); OpenTestFile ( fileName, kXMPFiles_OpenForRead, &xmpMeta, &xmpFile ); fprintf ( sLogFile, "Modified XMP from %s\n", fileName ); xmpMeta.DumpObject ( DumpToFile, sLogFile ); xmpFile.CloseFile(); fprintf ( sLogFile, "\nDone testing %s\n", fileName ); } // TestOneFile // ------------------------------------------------------------------------------------------------- extern "C" int main ( int argc, const char * argv[] ) { int result = 0; char logName[256]; int nameLen = (int) strlen ( argv[0] ); if ( (nameLen >= 4) && (strcmp ( argv[0]+nameLen-4, ".exe" ) == 0) ) nameLen -= 4; memcpy ( logName, argv[0], nameLen ); memcpy ( &logName[nameLen], "Log.txt", 8 ); // Include final null. sLogFile = fopen ( logName, "wb" ); time_t now = time(0); fprintf ( sLogFile, "XMPFilesCoverage starting %s", ctime(&now) ); XMP_VersionInfo coreVersion, filesVersion; SXMPMeta::GetVersionInfo ( &coreVersion ); SXMPFiles::GetVersionInfo ( &filesVersion ); fprintf ( sLogFile, "Version :\n %s\n %s\n", coreVersion.message, filesVersion.message ); try { if ( ! SXMPMeta::Initialize() ) { fprintf ( sLogFile, "## XMPMeta::Initialize failed!\n" ); return -1; } XMP_OptionBits options = 0; #if UNIX_ENV options |= kXMPFiles_ServerMode; #endif if ( ! SXMPFiles::Initialize ( options ) ) { fprintf ( sLogFile, "## SXMPFiles::Initialize failed!\n" ); return -1; } DumpHandlerInfo(); TestOneFile ( "../../../testfiles/BlueSquare.ai" ); TestOneFile ( "../../../testfiles/BlueSquare.eps" ); TestOneFile ( "../../../testfiles/BlueSquare.indd" ); TestOneFile ( "../../../testfiles/BlueSquare.jpg" ); TestOneFile ( "../../../testfiles/BlueSquare.pdf" ); TestOneFile ( "../../../testfiles/BlueSquare.psd" ); TestOneFile ( "../../../testfiles/BlueSquare.tif" ); TestOneFile ( "../../../testfiles/BlueSquare.avi" ); TestOneFile ( "../../../testfiles/BlueSquare.mov" ); TestOneFile ( "../../../testfiles/BlueSquare.mp3" ); TestOneFile ( "../../../testfiles/BlueSquare.wav" ); TestOneFile ( "../../../testfiles/BlueSquare.png" ); } catch ( XMP_Error & excep ) { fprintf ( sLogFile, "\nCaught XMP_Error %d : %s\n", excep.GetID(), excep.GetErrMsg() ); result = -2; } catch ( ... ) { fprintf ( sLogFile, "## Caught unknown exception\n" ); result = -3; } SXMPFiles::Terminate(); SXMPMeta::Terminate(); now = time(0); fprintf ( sLogFile, "\nXMPFilesCoverage finished %s", ctime(&now) ); fprintf ( sLogFile, "Final status = %d\n", result ); fclose ( sLogFile ); printf( "\nresults have been logged into %s\n", logName ); return result; } // main exempi-2.2.1/samples/source/DumpMainXMP.cpp0000664000175000017500000000677012150230672015505 00000000000000// ================================================================================================= // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= /** * Uses the XMPFiles component API to find the main XMP Packet for a data file, serializes the XMP, and writes * it to a human-readable log file. This is preferred over "dumb" packet scanning. */ #include #include #include #include #include #include #include #if XMP_WinBuild #pragma warning ( disable : 4127 ) // conditional expression is constant #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif #define TXMP_STRING_TYPE std::string #define XMP_INCLUDE_XMPFILES 1 #include "XMP.hpp" #include "XMP.incl_cpp" using namespace std; static FILE * sLogFile = stdout; // ================================================================================================= static void WriteMinorLabel ( FILE * log, const char * title ) { fprintf ( log, "\n// " ); for ( size_t i = 0; i < strlen(title); ++i ) fprintf ( log, "-" ); fprintf ( log, "--\n// %s :\n\n", title ); fflush ( log ); } // WriteMinorLabel // ================================================================================================= static XMP_Status DumpCallback ( void * refCon, XMP_StringPtr outStr, XMP_StringLen outLen ) { XMP_Status status = 0; size_t count; FILE * outFile = static_cast < FILE * > ( refCon ); count = fwrite ( outStr, 1, outLen, outFile ); if ( count != outLen ) status = errno; return status; } // DumpCallback // ================================================================================================= static void ProcessFile ( const char * fileName ) { bool ok; char buffer [1000]; SXMPMeta xmpMeta; SXMPFiles xmpFile; XMP_FileFormat format; XMP_OptionBits openFlags, handlerFlags; XMP_PacketInfo xmpPacket; sprintf ( buffer, "Dumping main XMP for %s", fileName ); WriteMinorLabel ( sLogFile, buffer ); xmpFile.OpenFile ( fileName, kXMP_UnknownFile, kXMPFiles_OpenForRead ); ok = xmpFile.GetFileInfo ( 0, &openFlags, &format, &handlerFlags ); if ( ! ok ) return; fprintf ( sLogFile, "File info : format = \"%.4s\", handler flags = %.8X\n", &format, handlerFlags ); fflush ( sLogFile ); ok = xmpFile.GetXMP ( &xmpMeta, 0, &xmpPacket ); if ( ! ok ) return; XMP_Int32 offset = (XMP_Int32)xmpPacket.offset; XMP_Int32 length = xmpPacket.length; fprintf ( sLogFile, "Packet info : offset = %d, length = %d\n", offset, length ); fflush ( sLogFile ); fprintf ( sLogFile, "\nInitial XMP from %s\n", fileName ); xmpMeta.DumpObject ( DumpCallback, sLogFile ); xmpFile.CloseFile(); } // ProcessFile // ================================================================================================= int main ( int argc, const char * argv [] ) { if ( ! SXMPMeta::Initialize() ) { printf ( "## SXMPMeta::Initialize failed!\n" ); return -1; } XMP_OptionBits options = 0; #if UNIX_ENV options |= kXMPFiles_ServerMode; #endif if ( ! SXMPFiles::Initialize ( options ) ) { printf ( "## SXMPFiles::Initialize failed!\n" ); return -1; } for ( int i = 1; i < argc; ++i ) ProcessFile ( argv[i] ); SXMPFiles::Terminate(); SXMPMeta::Terminate(); return 0; } exempi-2.2.1/samples/source/CustomSchema.cpp0000664000175000017500000002243612150230672015776 00000000000000// ================================================================================================= // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= /** * Tutorial solution for the Walkthrough 3 in the XMP Programmers Guide, Working with custom schema. * * Demonstrates how to work with a custom schema that has complex properties. It shows how to access * and modify properties with complex paths using the path composition utilities from the XMP API */ #include // Must be defined to instantiate template classes #define TXMP_STRING_TYPE std::string // Ensure XMP templates are instantiated #include "XMP.incl_cpp" // Provide access to the API #include "XMP.hpp" #include #include // Made up namespace URI. Prefix will be xsdkEdit and xsdkUser const XMP_StringPtr kXMP_NS_SDK_EDIT = "http://ns.adobe/meta/sdk/Edit/"; const XMP_StringPtr kXMP_NS_SDK_USERS = "http://ns.adobe/meta/sdk/User/"; using namespace std; /** * Client defined callback function to dump XMP to a file. In this case an output file stream is used * to write a buffer, of length bufferSize, to a text file. This callback is called multiple * times during the DumpObject() operation. See the XMP API reference for details of * XMP_TextOutputProc() callbacks. */ XMP_Status XMPFileDump(void * refCon, XMP_StringPtr buffer, XMP_StringLen bufferSize) { XMP_Status status = 0; try { ofstream * outFile = static_cast(refCon); (*outFile).write(buffer, bufferSize); } catch(XMP_Error & e) { cout << e.GetErrMsg() << endl; return -1; } return status; } /** * Client defined callback function to dump the registered namespaces to a file. In this case * an output file stream is used to write a buffer, of length bufferSize, to a text file. This * callback is called multiple times during the DumpObject() operation. See the XMP API * reference for details of XMP_TextOutputProc() callbacks. */ XMP_Status DumpNS(void * refCon, XMP_StringPtr buffer, XMP_StringLen bufferSize) { XMP_Status status = 0; try { ofstream *outFile= static_cast(refCon); (*outFile).write(buffer, bufferSize); } catch(XMP_Error & e) { cout << e.GetErrMsg() << endl; return -1; } return status; } /** * Writes an XMP packet in XML format to a text file * * rdf - a pointer to the serialized XMP * filename - the name of the file to write to */ void writeRDFToFile(string * rdf, string filename) { ofstream outFile; outFile.open(filename.c_str(), ios::out); outFile << *rdf; outFile.close(); } /** * Registers the namespaces that will be used with the custom schema. Then adds several new * properties to that schema. The properties are complex, containing nested arrays and structures. * * XMPFiles is not used in this sample, hence no external resource is updated with the metadata. The * created XMP object is serialized and written as RDF to a text file, the XMP object is dumped to * a text file and the registered namespaces are also dumped to a text file.* * */ int main() { if(!SXMPMeta::Initialize()) { cout << "Could not initialize Toolkit!"; } else { try { // Register the namespaces string actualPrefix; SXMPMeta::RegisterNamespace(kXMP_NS_SDK_EDIT, "xsdkEdit", &actualPrefix); SXMPMeta::RegisterNamespace(kXMP_NS_SDK_USERS, "xsdkUser",&actualPrefix); SXMPMeta meta; // Adds a user of the document // 1. Add a new item onto the DocumentUsers array - // 2. Compose a path to the last element of DocumentUsers array // 3. Add a value for the User field of the UserDetails structure // 4. Add a qualifier to the User field. Compose the path and set the value // 5. Add a value for the DUID field of the UserDetails structure // 6. Add a Contact property for the ContactDetails field of the UserDetails structure // 7. Compose a path to the ContactDetails field of the UserDetails structure. // 8. Create the fields of the ContactDetails structure and provide values // Create/Append the top level DocumentUsers array. If the array exists a new item will be added meta.AppendArrayItem(kXMP_NS_SDK_EDIT, "DocumentUsers", kXMP_PropValueIsArray, 0, kXMP_PropValueIsStruct); // Compose a path to the last item in the DocumentUsers array, this will point to a UserDetails structure string userItemPath; SXMPUtils::ComposeArrayItemPath(kXMP_NS_SDK_EDIT, "DocumentUsers", kXMP_ArrayLastItem, &userItemPath); // We now have a path to the structure, so we can set the field values meta.SetStructField(kXMP_NS_SDK_EDIT, userItemPath.c_str(), kXMP_NS_SDK_USERS, "User", "John Smith", 0); // Add a qualifier to the User field, first compose the path to the field and then add the qualifier string userFieldPath; SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, userItemPath.c_str(), kXMP_NS_SDK_USERS, "User", &userFieldPath); meta.SetQualifier(kXMP_NS_SDK_EDIT, userFieldPath.c_str(), kXMP_NS_SDK_USERS, "Role", "Dev Engineer"); // Compose a path to the DUID and set field value string duidPath; SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, userItemPath.c_str(), kXMP_NS_SDK_USERS, "DUID", &duidPath); meta.SetProperty_Int(kXMP_NS_SDK_EDIT, duidPath.c_str(), 2, 0); // Add the ContactDetails field, this field is a Contact structure meta.SetStructField(kXMP_NS_SDK_EDIT, userItemPath.c_str(), kXMP_NS_SDK_USERS, "ContactDetails", 0, kXMP_PropValueIsStruct); // Compose a path to the field that has the ContactDetails structure string contactStructPath; SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, userItemPath.c_str(), kXMP_NS_SDK_USERS, "ContactDetails", &contactStructPath); // Now add the fields - all empty initially meta.SetStructField(kXMP_NS_SDK_EDIT, contactStructPath.c_str(), kXMP_NS_SDK_USERS, "Email", 0, kXMP_PropArrayIsAlternate); meta.SetStructField(kXMP_NS_SDK_EDIT, contactStructPath.c_str(), kXMP_NS_SDK_USERS, "Telephone", 0, kXMP_PropValueIsArray); meta.SetStructField(kXMP_NS_SDK_EDIT, contactStructPath.c_str(), kXMP_NS_SDK_USERS, "BaseLocation", "", 0); // Add some values for the fields // Email: Get the path to the field named 'Email' in the ContactDetails structure and use it to append items string path; SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, contactStructPath.c_str(), kXMP_NS_SDK_USERS, "Email", &path); meta.AppendArrayItem(kXMP_NS_SDK_EDIT, path.c_str(), 0, "js@adobe.meta.com", 0); meta.AppendArrayItem(kXMP_NS_SDK_EDIT, path.c_str(), 0, "js@adobe.home.com", 0); // Telephone SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, contactStructPath.c_str(), kXMP_NS_SDK_USERS, "Telephone", &path); meta.AppendArrayItem(kXMP_NS_SDK_EDIT, path.c_str(), 0, "89112", 0); meta.AppendArrayItem(kXMP_NS_SDK_EDIT, path.c_str(), 0, "84432", 0); // BaseLocation SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, contactStructPath.c_str(), kXMP_NS_SDK_USERS, "BaseLocation", &path); meta.SetProperty(kXMP_NS_SDK_EDIT, path.c_str(), "London", 0); // Add a user edit // 1. Add an item (a structure) to the DocumentEdit array // 2. Compose a path to the last item in the DocumentEdit array // 3. Add fields and values to the EditDetails structure // Create the array meta.AppendArrayItem(kXMP_NS_SDK_EDIT, "DocumentEdit", kXMP_PropArrayIsOrdered, 0, kXMP_PropValueIsStruct); // Compose a path to the last item of the DocumentEdit array, this gives the path to the structure string lastItemPath; SXMPUtils::ComposeArrayItemPath(kXMP_NS_SDK_EDIT, "DocumentEdit", kXMP_ArrayLastItem, &lastItemPath); // Add the Date field SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, lastItemPath.c_str(), kXMP_NS_SDK_EDIT, "EditDate", &path); XMP_DateTime dt; SXMPUtils::CurrentDateTime(&dt); meta.SetProperty_Date(kXMP_NS_SDK_EDIT, path.c_str(), dt, 0); // Add the DUID field SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, lastItemPath.c_str(), kXMP_NS_SDK_EDIT, "DUID", &path); meta.SetProperty_Int(kXMP_NS_SDK_EDIT, path.c_str(), 2, 0); // Add the EditComments field SXMPUtils::ComposeStructFieldPath(kXMP_NS_SDK_EDIT, lastItemPath.c_str(), kXMP_NS_SDK_EDIT, "EditComments", &path); meta.SetLocalizedText(kXMP_NS_SDK_EDIT, path.c_str(), "en", "en-US", "Document created.", 0); // Add the EditTool field meta.SetStructField(kXMP_NS_SDK_EDIT, lastItemPath.c_str(), kXMP_NS_SDK_EDIT, "EditTool", "FrameXML", 0); // Write the RDF to a file cout << "writing RDF to file CS_RDF.txt" << endl; string metaBuffer; meta.SerializeToBuffer(&metaBuffer); writeRDFToFile(&metaBuffer, "CS_RDF.txt"); // Dump the XMP object cout << "dumping XMP object to file XMPDump.txt" << endl; ofstream dumpFile; dumpFile.open("XMPDump.txt", ios::out); meta.DumpObject(XMPFileDump, &dumpFile); dumpFile.close(); // Dump the namespaces to a file cout << "dumping namespaces to file NameDump.txt" << endl; dumpFile.open("NameDump.txt", ios::out); meta.DumpNamespaces(XMPFileDump, &dumpFile); dumpFile.close(); } catch(XMP_Error & e) { cout << "ERROR: " << e.GetErrMsg(); } SXMPMeta::Terminate(); } return 0; } exempi-2.2.1/samples/source/DumpScannedXMP.cpp0000664000175000017500000001073412150230672016167 00000000000000// ================================================================================================= // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= /** * Scans a data file to find all embedded XMP Packets, without using the smart handlers. If a packet is found, * serializes the XMP and writes it to log file. */ #include #include #include #include #include #include #include #if XMP_WinBuild #pragma warning ( disable : 4127 ) // conditional expression is constant #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif #define TXMP_STRING_TYPE std::string #include "XMP.hpp" #include "XMP.incl_cpp" #include "XMPScanner.hpp" using namespace std; // ================================================================================================= static XMP_Status DumpCallback ( void * refCon, XMP_StringPtr outStr, XMP_StringLen outLen ) { XMP_Status status = 0; size_t count; FILE * outFile = static_cast < FILE * > ( refCon ); count = fwrite ( outStr, 1, outLen, outFile ); if ( count != outLen ) status = errno; return status; } // DumpCallback // ================================================================================================= static void ProcessPacket ( const char * fileName, FILE * inFile, size_t offset, size_t length ) { std::string xmlString; xmlString.append ( length, ' ' ); fseek ( inFile, offset, SEEK_SET ); fread ( (void*)xmlString.data(), 1, length, inFile ); char title [1000]; sprintf ( title, "// Dumping raw input for \"%s\" (%d..%d)", fileName, offset, (offset + length - 1) ); printf ( "// " ); for ( size_t i = 3; i < strlen(title); ++i ) printf ( "=" ); printf ( "\n\n%s\n\n%.*s\n\n", title, length, xmlString.c_str() ); fflush ( stdout ); SXMPMeta xmpObj; try { xmpObj.ParseFromBuffer ( xmlString.c_str(), length ); } catch ( ... ) { printf ( "## Parse failed\n\n" ); return; } xmpObj.DumpObject ( DumpCallback, stdout ); fflush ( stdout ); string xmpString; xmpObj.SerializeToBuffer ( &xmpString, kXMP_OmitPacketWrapper ); printf ( "\nPretty serialization, %d bytes :\n\n%s\n", xmpString.size(), xmpString.c_str() ); fflush ( stdout ); xmpObj.SerializeToBuffer ( &xmpString, (kXMP_OmitPacketWrapper | kXMP_UseCompactFormat) ); printf ( "Compact serialization, %d bytes :\n\n%s\n", xmpString.size(), xmpString.c_str() ); fflush ( stdout ); } // ProcessPacket // ================================================================================================= static void ProcessFile ( const char * fileName ) { FILE * inFile; size_t fileLen, readCount; size_t snipCount; char buffer [64*1024]; // --------------------------------------------------------------------- // Use the scanner to find all of the packets then process each of them. inFile = fopen ( fileName, "rb" ); if ( inFile == 0 ) { printf ( "Can't open \"%s\"\n", fileName ); return; } fseek ( inFile, 0, SEEK_END ); fileLen = ftell ( inFile ); // ! Only handles up to 2GB files. fseek ( inFile, 0, SEEK_SET ); XMPScanner scanner ( fileLen ); for ( size_t filePos = 0; true; filePos += readCount ) { readCount = fread ( buffer, 1, sizeof(buffer), inFile ); if ( readCount == 0 ) break; scanner.Scan ( buffer, filePos, readCount ); } snipCount = scanner.GetSnipCount(); XMPScanner::SnipInfoVector snips (snipCount); scanner.Report ( snips ); size_t packetCount = 0; for ( size_t s = 0; s < snipCount; ++s ) { if ( snips[s].fState == XMPScanner::eValidPacketSnip ) { ++packetCount; ProcessPacket ( fileName, inFile, (size_t)snips[s].fOffset, (size_t)snips[s].fLength ); } } if ( packetCount == 0 ) printf ( " No packets found\n" ); } // ProcessFile // ================================================================================================= extern "C" int main ( int argc, const char * argv [] ) { if ( ! SXMPMeta::Initialize() ) { printf ( "## SXMPMeta::Initialize failed!\n" ); return -1; } if ( argc != 2 ) // 2 := command and 1 parameter { printf ("usage: DumpScannedXMP (filename)\n"); return 0; } for ( int i = 1; i < argc; ++i ) ProcessFile ( argv[i] ); SXMPMeta::Terminate(); return 0; } exempi-2.2.1/samples/source/ModifyingXMP.cpp0000664000175000017500000002312312150230672015707 00000000000000// ================================================================================================= // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= /** * Tutorial solution for Walkthrough 2 in the XMP Programmers Guide, Modifying XMP * Demonstrates how to open a file for update, and modifying the contained XMP before writing it back to the file. */ #include // Must be defined to instantiate template classes #define TXMP_STRING_TYPE std::string // Must be defined to give access to XMPFiles #define XMP_INCLUDE_XMPFILES 1 // Ensure XMP templates are instantiated #include "XMP.incl_cpp" // Provide access to the API #include "XMP.hpp" #include #include #include using namespace std; /** * Display some property values to the console * * meta - a pointer to the XMP object that will have the properties read */ void displayPropertyValues(SXMPMeta * meta) { // Read a simple property string simpleValue; //Stores the value for the property meta->GetProperty(kXMP_NS_XMP, "CreatorTool", &simpleValue, 0); cout << "meta:CreatorTool = " << simpleValue << endl; // Get the first and second element in the dc:creator array string elementValue; meta->GetArrayItem(kXMP_NS_DC, "creator", 1, &elementValue, 0); if(elementValue != "") { cout << "dc:creator[1] = " << elementValue << endl; meta->GetArrayItem(kXMP_NS_DC, "creator", 2, &elementValue, 0); cout << "dc:creator[2] = " << elementValue << endl; } // Get the the entire dc:subject array string propValue; int arrSize = meta->CountArrayItems(kXMP_NS_DC, "subject"); for(int i = 1; i <= arrSize;i++) { meta->GetArrayItem(kXMP_NS_DC, "subject", i, &propValue, 0); cout << "dc:subject[" << i << "] = " << propValue << endl; } // Get the dc:title for English and French string itemValue; string actualLang; meta->GetLocalizedText(kXMP_NS_DC, "title", "en", "en-US", 0, &itemValue, 0); cout << "dc:title in English = " << itemValue << endl; meta->GetLocalizedText(kXMP_NS_DC, "title", "fr", "fr-FR", 0, &itemValue, 0); cout << "dc:title in French = " << itemValue << endl; // Get dc:MetadataDate XMP_DateTime myDate; if(meta->GetProperty_Date(kXMP_NS_XMP, "MetadataDate", &myDate, 0)) { // Convert the date struct into a convenient string and display it string myDateStr; SXMPUtils::ConvertFromDate(myDate, &myDateStr); cout << "meta:MetadataDate = " << myDateStr << endl; } cout << "----------------------------------------" << endl; } /** * Creates an XMP object from an RDF string. The string is used to * to simulate creating and XMP object from multiple input buffers. * The last call to ParseFromBuffer has no kXMP_ParseMoreBuffers options, * thereby indicating this is the last input buffer. */ SXMPMeta createXMPFromRDF() { const char * rdf = "" "" "" "" "XMP" "SDK" "Sample" "" "" "image/tiff" "" ""; SXMPMeta meta; // Loop over the rdf string and create the XMP object // 10 characters at a time int i; for (i = 0; i < (long)strlen(rdf) - 10; i += 10 ) { meta.ParseFromBuffer ( &rdf[i], 10, kXMP_ParseMoreBuffers ); } // The last call has no kXMP_ParseMoreBuffers options, signifying // this is the last input buffer meta.ParseFromBuffer ( &rdf[i], (XMP_StringLen) strlen(rdf) - i ); return meta; } /** * Writes an XMP packet in XML format to a text file * * rdf - a pointer to the serialized XMP * filename - the name of the file to write to */ void writeRDFToFile(string * rdf, string filename) { ofstream outFile; outFile.open(filename.c_str(), ios::out); outFile << *rdf; outFile.close(); } /** * Initializes the toolkit and attempts to open a file for updating its metadata. Initially * an attempt to open the file is done with a handler, if this fails then the file is opened with * packet scanning. Once the file is open several properties are read and displayed in the console. * * Several properties are then modified, first by checking for their existence and then, if they * exist, by updating their values. The updated properties are then displayed again in the console. * * Next a new XMP object is created from an RDF stream, the properties from the new XMP object are * appended to the original XMP object and the updated properties are displayed in the console for * last time. * * The updated XMP object is then serialized in different formats and written to text files. Lastly, * the modified XMP is written back to the resource file. */ int main ( int argc, const char * argv[] ) { if ( argc != 2 ) // 2 := command and 1 parameter { cout << "usage: ModifyingXMP (filename)" << endl; return 0; } string filename = string( argv[1] ); if(!SXMPMeta::Initialize()) { cout << "Could not initialize toolkit!"; return -1; } XMP_OptionBits options = 0; #if UNIX_ENV options |= kXMPFiles_ServerMode; #endif // Must initialize SXMPFiles before we use it if(SXMPFiles::Initialize(options)) { try { // Options to open the file with - open for editing and use a smart handler XMP_OptionBits opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUseSmartHandler; bool ok; SXMPFiles myFile; std::string status = ""; // First we try and open the file ok = myFile.OpenFile(filename, kXMP_UnknownFile, opts); if( ! ok ) { status += "No smart handler available for " + filename + "\n"; status += "Trying packet scanning.\n"; // Now try using packet scanning opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUsePacketScanning; ok = myFile.OpenFile(filename, kXMP_UnknownFile, opts); } // If the file is open then read get the XMP data if(ok) { cout << status << endl; cout << filename << " is opened successfully" << endl; // Create the XMP object and get the XMP data SXMPMeta meta; myFile.GetXMP(&meta); // Display some properties in the console displayPropertyValues(&meta); /////////////////////////////////////////////////// // Now modify the XMP if(meta.DoesPropertyExist(kXMP_NS_XMP, "CreatorTool")) { // Update xap:CreatorTool - we don't need to set any option bits meta.SetProperty(kXMP_NS_XMP, "CreatorTool", "Updated By XMP SDK", 0); } // Update the Metadata Date XMP_DateTime updatedTime; // Get the current time. This is a UTC time automatically // adjusted for the local time SXMPUtils::CurrentDateTime(&updatedTime); if(meta.DoesPropertyExist(kXMP_NS_XMP, "MetadataDate")) { meta.SetProperty_Date(kXMP_NS_XMP, "MetadataDate", updatedTime, 0); } // Add an item onto the dc:creator array // Note the options used, kXMP_PropArrayIsOrdered, if the array does not exist it will be created meta.AppendArrayItem(kXMP_NS_DC, "creator", kXMP_PropArrayIsOrdered, "Author Name", 0); meta.AppendArrayItem(kXMP_NS_DC, "creator", kXMP_PropArrayIsOrdered, "Another Author Name", 0); // Now update alt-text properties meta.SetLocalizedText(kXMP_NS_DC, "title", "en", "en-US", "An English title"); meta.SetLocalizedText(kXMP_NS_DC, "title", "fr", "fr-FR", "Un titre Francais"); // Display the properties again to show changes cout << "After update:" << endl; displayPropertyValues(&meta); // Create a new XMP object from an RDF string SXMPMeta rdfMeta = createXMPFromRDF(); // Append the newly created properties onto the original XMP object // This will: // a) Add ANY new TOP LEVEL properties in the source (rdfMeta) to the destination (meta) // b) Replace any top level properties in the source with the matching properties from the destination SXMPUtils::ApplyTemplate(&meta, rdfMeta, kXMPTemplate_AddNewProperties | kXMPTemplate_ReplaceExistingProperties | kXMPTemplate_IncludeInternalProperties); // Display the properties again to show changes cout << "After Appending Properties:" << endl; displayPropertyValues(&meta); // Serialize the packet and write the buffer to a file // Let the padding be computed and use the default linefeed and indents without limits string metaBuffer; meta.SerializeToBuffer(&metaBuffer, 0, 0, "", "", 0); // Write the packet to a file as RDF writeRDFToFile(&metaBuffer, filename+"_XMP_RDF.txt"); // Write the packet to a file but this time as compact RDF XMP_OptionBits outOpts = kXMP_OmitPacketWrapper | kXMP_UseCompactFormat; meta.SerializeToBuffer(&metaBuffer, outOpts); writeRDFToFile(&metaBuffer, filename+"_XMP_RDF_Compact.txt"); // Check we can put the XMP packet back into the file if(myFile.CanPutXMP(meta)) { // If so then update the file with the modified XMP myFile.PutXMP(meta); } // Close the SXMPFile. This *must* be called. The XMP is not // actually written and the disk file is not closed until this call is made. myFile.CloseFile(); } else { cout << "Unable to open " << filename << endl; } } catch(XMP_Error & e) { cout << "ERROR: " << e.GetErrMsg() << endl; } // Terminate the toolkit SXMPFiles::Terminate(); SXMPMeta::Terminate(); } else { cout << "Could not initialize SXMPFiles."; return -1; } return 0; } exempi-2.2.1/samples/source/Makefile.in0000664000175000017500000010340312150231002014722 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = xmpcoverage$(EXEEXT) xmpfilescoverage$(EXEEXT) \ dumpxmp$(EXEEXT) dumpmainxmp$(EXEEXT) customschema$(EXEEXT) \ modifyingxmp$(EXEEXT) readingxmp$(EXEEXT) \ xmpcommandtool$(EXEEXT) subdir = samples/source DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libsamplescommon_la_LIBADD = am_libsamplescommon_la_OBJECTS = DumpFile.lo Log.lo TagTree.lo libsamplescommon_la_OBJECTS = $(am_libsamplescommon_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = PROGRAMS = $(noinst_PROGRAMS) am_customschema_OBJECTS = CustomSchema.$(OBJEXT) customschema_OBJECTS = $(am_customschema_OBJECTS) am__DEPENDENCIES_1 = $(top_builddir)/source/XMPCore/libXMPCore.la \ $(top_builddir)/source/XMPFiles/libXMPFiles.la \ $(top_builddir)/source/common/libxmpcommon.la \ $(top_builddir)/third-party/MD5/libmd5.la customschema_DEPENDENCIES = $(am__DEPENDENCIES_1) am_dumpmainxmp_OBJECTS = DumpMainXMP.$(OBJEXT) dumpmainxmp_OBJECTS = $(am_dumpmainxmp_OBJECTS) dumpmainxmp_DEPENDENCIES = $(am__DEPENDENCIES_1) am_dumpxmp_OBJECTS = DumpScannedXMP.$(OBJEXT) dumpxmp_OBJECTS = $(am_dumpxmp_OBJECTS) dumpxmp_DEPENDENCIES = $(am__DEPENDENCIES_1) am_modifyingxmp_OBJECTS = ModifyingXMP.$(OBJEXT) modifyingxmp_OBJECTS = $(am_modifyingxmp_OBJECTS) modifyingxmp_DEPENDENCIES = $(am__DEPENDENCIES_1) am_readingxmp_OBJECTS = ReadingXMP.$(OBJEXT) readingxmp_OBJECTS = $(am_readingxmp_OBJECTS) readingxmp_DEPENDENCIES = $(am__DEPENDENCIES_1) am_xmpcommandtool_OBJECTS = Actions.$(OBJEXT) PrintUsage.$(OBJEXT) \ XMPCommand.$(OBJEXT) xmpcommandtool_OBJECTS = $(am_xmpcommandtool_OBJECTS) xmpcommandtool_DEPENDENCIES = $(am__DEPENDENCIES_1) \ libsamplescommon.la am_xmpcoverage_OBJECTS = XMPCoreCoverage.$(OBJEXT) xmpcoverage_OBJECTS = $(am_xmpcoverage_OBJECTS) xmpcoverage_DEPENDENCIES = $(am__DEPENDENCIES_1) am_xmpfilescoverage_OBJECTS = XMPFilesCoverage.$(OBJEXT) xmpfilescoverage_OBJECTS = $(am_xmpfilescoverage_OBJECTS) xmpfilescoverage_DEPENDENCIES = $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libsamplescommon_la_SOURCES) $(customschema_SOURCES) \ $(dumpmainxmp_SOURCES) $(dumpxmp_SOURCES) \ $(modifyingxmp_SOURCES) $(readingxmp_SOURCES) \ $(xmpcommandtool_SOURCES) $(xmpcoverage_SOURCES) \ $(xmpfilescoverage_SOURCES) DIST_SOURCES = $(libsamplescommon_la_SOURCES) $(customschema_SOURCES) \ $(dumpmainxmp_SOURCES) $(dumpxmp_SOURCES) \ $(modifyingxmp_SOURCES) $(readingxmp_SOURCES) \ $(xmpcommandtool_SOURCES) $(xmpcoverage_SOURCES) \ $(xmpfilescoverage_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CXXFLAGS = -fexceptions -funsigned-char -fPIC \ -Wno-multichar -Wno-ctor-dtor-privacy AM_CPPFLAGS = -D@EXEMPI_PLATFORM_DEF@=1 -D_FILE_OFFSET_BITS=64 XMPLIBS = $(top_builddir)/source/XMPCore/libXMPCore.la \ $(top_builddir)/source/XMPFiles/libXMPFiles.la \ $(top_builddir)/source/common/libxmpcommon.la -lexpat -lz \ $(top_builddir)/third-party/MD5/libmd5.la INCLUDES = -I$(top_srcdir)/public/include -I$(srcdir)/common -I$(top_srcdir)/source/common -I$(top_srcdir)/source/XMPFiles/FormatSupport noinst_LTLIBRARIES = libsamplescommon.la libsamplescommon_la_SOURCES = common/DumpFile.cpp common/DumpFile.h \ common/Log.cpp common/Log.h \ common/TagTree.cpp common/TagTree.h \ common/globals.h \ $(NULL) customschema_SOURCES = CustomSchema.cpp customschema_LDADD = $(XMPLIBS) modifyingxmp_SOURCES = ModifyingXMP.cpp modifyingxmp_LDADD = $(XMPLIBS) readingxmp_SOURCES = ReadingXMP.cpp readingxmp_LDADD = $(XMPLIBS) xmpcoverage_SOURCES = XMPCoreCoverage.cpp xmpcoverage_LDADD = $(XMPLIBS) xmpfilescoverage_SOURCES = XMPFilesCoverage.cpp xmpfilescoverage_LDADD = $(XMPLIBS) dumpxmp_SOURCES = DumpScannedXMP.cpp dumpxmp_LDADD = $(XMPLIBS) dumpmainxmp_SOURCES = DumpMainXMP.cpp dumpmainxmp_LDADD = $(XMPLIBS) xmpcommandtool_SOURCES = xmpcommand/Actions.cpp xmpcommand/Actions.h \ xmpcommand/PrintUsage.cpp xmpcommand/PrintUsage.h \ xmpcommand/XMPCommand.cpp \ $(NULL) xmpcommandtool_LDADD = $(XMPLIBS) libsamplescommon.la all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/source/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign samples/source/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libsamplescommon.la: $(libsamplescommon_la_OBJECTS) $(libsamplescommon_la_DEPENDENCIES) $(EXTRA_libsamplescommon_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(libsamplescommon_la_OBJECTS) $(libsamplescommon_la_LIBADD) $(LIBS) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list customschema$(EXEEXT): $(customschema_OBJECTS) $(customschema_DEPENDENCIES) $(EXTRA_customschema_DEPENDENCIES) @rm -f customschema$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(customschema_OBJECTS) $(customschema_LDADD) $(LIBS) dumpmainxmp$(EXEEXT): $(dumpmainxmp_OBJECTS) $(dumpmainxmp_DEPENDENCIES) $(EXTRA_dumpmainxmp_DEPENDENCIES) @rm -f dumpmainxmp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dumpmainxmp_OBJECTS) $(dumpmainxmp_LDADD) $(LIBS) dumpxmp$(EXEEXT): $(dumpxmp_OBJECTS) $(dumpxmp_DEPENDENCIES) $(EXTRA_dumpxmp_DEPENDENCIES) @rm -f dumpxmp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dumpxmp_OBJECTS) $(dumpxmp_LDADD) $(LIBS) modifyingxmp$(EXEEXT): $(modifyingxmp_OBJECTS) $(modifyingxmp_DEPENDENCIES) $(EXTRA_modifyingxmp_DEPENDENCIES) @rm -f modifyingxmp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(modifyingxmp_OBJECTS) $(modifyingxmp_LDADD) $(LIBS) readingxmp$(EXEEXT): $(readingxmp_OBJECTS) $(readingxmp_DEPENDENCIES) $(EXTRA_readingxmp_DEPENDENCIES) @rm -f readingxmp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(readingxmp_OBJECTS) $(readingxmp_LDADD) $(LIBS) xmpcommandtool$(EXEEXT): $(xmpcommandtool_OBJECTS) $(xmpcommandtool_DEPENDENCIES) $(EXTRA_xmpcommandtool_DEPENDENCIES) @rm -f xmpcommandtool$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(xmpcommandtool_OBJECTS) $(xmpcommandtool_LDADD) $(LIBS) xmpcoverage$(EXEEXT): $(xmpcoverage_OBJECTS) $(xmpcoverage_DEPENDENCIES) $(EXTRA_xmpcoverage_DEPENDENCIES) @rm -f xmpcoverage$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(xmpcoverage_OBJECTS) $(xmpcoverage_LDADD) $(LIBS) xmpfilescoverage$(EXEEXT): $(xmpfilescoverage_OBJECTS) $(xmpfilescoverage_DEPENDENCIES) $(EXTRA_xmpfilescoverage_DEPENDENCIES) @rm -f xmpfilescoverage$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(xmpfilescoverage_OBJECTS) $(xmpfilescoverage_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Actions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CustomSchema.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DumpFile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DumpMainXMP.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DumpScannedXMP.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Log.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ModifyingXMP.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PrintUsage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ReadingXMP.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TagTree.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPCommand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPCoreCoverage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPFilesCoverage.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< DumpFile.lo: common/DumpFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DumpFile.lo -MD -MP -MF $(DEPDIR)/DumpFile.Tpo -c -o DumpFile.lo `test -f 'common/DumpFile.cpp' || echo '$(srcdir)/'`common/DumpFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/DumpFile.Tpo $(DEPDIR)/DumpFile.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/DumpFile.cpp' object='DumpFile.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DumpFile.lo `test -f 'common/DumpFile.cpp' || echo '$(srcdir)/'`common/DumpFile.cpp Log.lo: common/Log.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Log.lo -MD -MP -MF $(DEPDIR)/Log.Tpo -c -o Log.lo `test -f 'common/Log.cpp' || echo '$(srcdir)/'`common/Log.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Log.Tpo $(DEPDIR)/Log.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/Log.cpp' object='Log.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Log.lo `test -f 'common/Log.cpp' || echo '$(srcdir)/'`common/Log.cpp TagTree.lo: common/TagTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT TagTree.lo -MD -MP -MF $(DEPDIR)/TagTree.Tpo -c -o TagTree.lo `test -f 'common/TagTree.cpp' || echo '$(srcdir)/'`common/TagTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/TagTree.Tpo $(DEPDIR)/TagTree.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/TagTree.cpp' object='TagTree.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o TagTree.lo `test -f 'common/TagTree.cpp' || echo '$(srcdir)/'`common/TagTree.cpp Actions.o: xmpcommand/Actions.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Actions.o -MD -MP -MF $(DEPDIR)/Actions.Tpo -c -o Actions.o `test -f 'xmpcommand/Actions.cpp' || echo '$(srcdir)/'`xmpcommand/Actions.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Actions.Tpo $(DEPDIR)/Actions.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmpcommand/Actions.cpp' object='Actions.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Actions.o `test -f 'xmpcommand/Actions.cpp' || echo '$(srcdir)/'`xmpcommand/Actions.cpp Actions.obj: xmpcommand/Actions.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Actions.obj -MD -MP -MF $(DEPDIR)/Actions.Tpo -c -o Actions.obj `if test -f 'xmpcommand/Actions.cpp'; then $(CYGPATH_W) 'xmpcommand/Actions.cpp'; else $(CYGPATH_W) '$(srcdir)/xmpcommand/Actions.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Actions.Tpo $(DEPDIR)/Actions.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmpcommand/Actions.cpp' object='Actions.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Actions.obj `if test -f 'xmpcommand/Actions.cpp'; then $(CYGPATH_W) 'xmpcommand/Actions.cpp'; else $(CYGPATH_W) '$(srcdir)/xmpcommand/Actions.cpp'; fi` PrintUsage.o: xmpcommand/PrintUsage.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PrintUsage.o -MD -MP -MF $(DEPDIR)/PrintUsage.Tpo -c -o PrintUsage.o `test -f 'xmpcommand/PrintUsage.cpp' || echo '$(srcdir)/'`xmpcommand/PrintUsage.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PrintUsage.Tpo $(DEPDIR)/PrintUsage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmpcommand/PrintUsage.cpp' object='PrintUsage.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PrintUsage.o `test -f 'xmpcommand/PrintUsage.cpp' || echo '$(srcdir)/'`xmpcommand/PrintUsage.cpp PrintUsage.obj: xmpcommand/PrintUsage.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PrintUsage.obj -MD -MP -MF $(DEPDIR)/PrintUsage.Tpo -c -o PrintUsage.obj `if test -f 'xmpcommand/PrintUsage.cpp'; then $(CYGPATH_W) 'xmpcommand/PrintUsage.cpp'; else $(CYGPATH_W) '$(srcdir)/xmpcommand/PrintUsage.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PrintUsage.Tpo $(DEPDIR)/PrintUsage.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmpcommand/PrintUsage.cpp' object='PrintUsage.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PrintUsage.obj `if test -f 'xmpcommand/PrintUsage.cpp'; then $(CYGPATH_W) 'xmpcommand/PrintUsage.cpp'; else $(CYGPATH_W) '$(srcdir)/xmpcommand/PrintUsage.cpp'; fi` XMPCommand.o: xmpcommand/XMPCommand.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT XMPCommand.o -MD -MP -MF $(DEPDIR)/XMPCommand.Tpo -c -o XMPCommand.o `test -f 'xmpcommand/XMPCommand.cpp' || echo '$(srcdir)/'`xmpcommand/XMPCommand.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/XMPCommand.Tpo $(DEPDIR)/XMPCommand.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmpcommand/XMPCommand.cpp' object='XMPCommand.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o XMPCommand.o `test -f 'xmpcommand/XMPCommand.cpp' || echo '$(srcdir)/'`xmpcommand/XMPCommand.cpp XMPCommand.obj: xmpcommand/XMPCommand.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT XMPCommand.obj -MD -MP -MF $(DEPDIR)/XMPCommand.Tpo -c -o XMPCommand.obj `if test -f 'xmpcommand/XMPCommand.cpp'; then $(CYGPATH_W) 'xmpcommand/XMPCommand.cpp'; else $(CYGPATH_W) '$(srcdir)/xmpcommand/XMPCommand.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/XMPCommand.Tpo $(DEPDIR)/XMPCommand.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmpcommand/XMPCommand.cpp' object='XMPCommand.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o XMPCommand.obj `if test -f 'xmpcommand/XMPCommand.cpp'; then $(CYGPATH_W) 'xmpcommand/XMPCommand.cpp'; else $(CYGPATH_W) '$(srcdir)/xmpcommand/XMPCommand.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ cscopelist ctags distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/samples/source/XMPCoreCoverage.cpp0000664000175000017500000021752512150230672016341 00000000000000// ================================================================================================= // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= /** * Demonstrates syntax and usage by exercising most of the API functions of XMPCore Toolkit SDK component, * using a sample XMP Packet that contains all of the different property and attribute types. */ #include #include #include #include #include #include #include #include #include #define TXMP_STRING_TYPE std::string #include "XMP.hpp" #include "XMP.incl_cpp" using namespace std; #if WIN_ENV #pragma warning ( disable : 4100 ) // ignore unused variable #pragma warning ( disable : 4127 ) // conditional expression is constant #pragma warning ( disable : 4267 ) // possible loss of data (temporary for 64-bit builds) #pragma warning ( disable : 4505 ) // unreferenced local function has been removed #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif // ================================================================================================= static const char * kNS1 = "ns:test1/"; static const char * kNS2 = "ns:test2/"; static const char * kRDFCoverage = "" " " "" " Simple1 value" " Simple2 value" "" " " " " " Item1.1 value" " Item1.2 value" " " " " "" " " " " " Item2.1 value" " Item2.2 value" " " " " "" " " " " " Item3.1 value" " Item3.2 value" " " " " "" " " " " " Item4.1 value" " Item4.2 value" " " " " "" " " " " " Item5.1 value" " Item5.2 value" " " " " "" " " " Field1 value" " Field2 value" " " "" " " " Prop value" " Qual value" " " "" " " " Prop value" " Qual value" " " "" " " " " " " " " " " " " "" " " " Prop value" " Qual value" " " "" " " " Field1 value" " Field2 value" " " "" " " " " " Item1.1 value" " Item1.2 value" " " " " "" " " " " " " " " " Field1 value" " Field2 value" " " " " " " " " "" " " ""; static const char * kSimpleRDF = "" " " "" " Simple value" "" " " " " " Item1 value" " Item2 value" " " " " "" " " " Field1 value" " Field2 value" " " "" " " " Prop value" " Qual value" " " "" " " " " " x-one value" " x-two value" " " " " "" " " " " " " " Item-1" " Field 1.2 value" " " " " " Item-2" " Field 2.2 value" " " " " " " "" " " ""; static const char * kNamespaceRDF = "" " " "" " " " " " " " " " Field1 value" " Field2 value" " " " " " " " " "" " " ""; static const char * kXMPMetaRDF = "" "" "" " " " bogus packet" " " "" "" "" "" " " " xmpmeta packet" " " "" "" "" "" " " " bogus packet" " " "" "" ""; static const char * kNewlineRDF = "" " " "" " ASCII CR" " ASCII LF" " ASCII CRLF" "" " " ""; static const char * kInconsistentRDF = "" " " "" " PDF Author" " XMP Author" "" " " " " " XMP Authors [1]" " " " " "" " " " " " DC Creator [1]" " " " " "" " " ""; static const char * kDateTimeRDF = "" " " "" " 2003" " 2003-12" " 2003-12-31" "" " 2003-12-31T12:34Z" " 2003-12-31T12:34:56Z" "" " 2003-12-31T12:34:56.001Z" " 2003-12-31T12:34:56.000000001Z" "" " 2003-12-31T10:04:56-02:30" " 2003-12-31T15:49:56+03:15" "" " " ""; // ================================================================================================= #define FoundOrNot(b) ((b) ? "found" : "not found") #define YesOrNo(b) ((b) ? "yes" : "no") // ------------------------------------------------------------------------------------------------- static void FillDateTime ( XMP_DateTime * dateTime, XMP_Int32 year, XMP_Int32 month, XMP_Int32 day, XMP_Int32 hour, XMP_Int32 minute, XMP_Int32 second, XMP_Bool hasDate, XMP_Bool hasTime, XMP_Bool hasTimeZone, XMP_Int8 tzSign, XMP_Int32 tzHour, XMP_Int32 tzMinute, XMP_Int32 nanoSecond ) { dateTime->year = year; dateTime->month = month; dateTime->day = day; dateTime->hour = hour; dateTime->minute = minute; dateTime->second = second; dateTime->hasDate = hasDate; dateTime->hasTime = hasTime; dateTime->hasTimeZone = hasTimeZone; dateTime->tzSign = tzSign; dateTime->tzHour = tzHour; dateTime->tzMinute = tzMinute; dateTime->nanoSecond = nanoSecond; } // FillDateTime // ------------------------------------------------------------------------------------------------- static void WriteMajorLabel ( FILE * log, const char * title ) { fprintf ( log, "\n" ); fprintf ( log, "// =============================================================================\n" ); fprintf ( log, "// %s.\n", title ); fprintf ( log, "// =============================================================================\n" ); fflush ( log ); } // WriteMajorLabel // ------------------------------------------------------------------------------------------------- static void WriteMinorLabel ( FILE * log, const char * title ) { fprintf ( log, "\n// " ); for ( size_t i = 0; i < strlen(title); ++i ) fprintf ( log, "-" ); fprintf ( log, "--\n// %s :\n\n", title ); fflush ( log ); } // WriteMinorLabel // ------------------------------------------------------------------------------------------------- static XMP_Status DumpToString ( void * refCon, XMP_StringPtr outStr, XMP_StringLen outLen ) { XMP_Status status = 0; std::string * dumpString = (std::string*)refCon; try { dumpString->append ( outStr, outLen ); } catch ( ... ) { status = -1; } return status; } // DumpToString // ------------------------------------------------------------------------------------------------- static XMP_Status DumpToFile ( void * refCon, XMP_StringPtr outStr, XMP_StringLen outLen ) { XMP_Status status = 0; size_t count; FILE * outFile = static_cast < FILE * > ( refCon ); count = fwrite ( outStr, 1, outLen, outFile ); if ( count != outLen ) status = errno; fflush ( outFile ); return status; } // DumpToFile // ------------------------------------------------------------------------------------------------- static void DumpXMPObj ( FILE * log, SXMPMeta & meta, const char * title ) { WriteMinorLabel ( log, title ); meta.DumpObject ( DumpToFile, log ); } // DumpXMPObj // ------------------------------------------------------------------------------------------------- static void VerifyNewlines ( FILE * log, std::string xmp, const char * newline ) { for ( size_t i = 0; i < xmp.size(); ++i ) { if ( (xmp[i] == '\x0A') || (xmp[i] == '\x0D') ) { if ( strncmp ( &xmp[i], newline, strlen(newline) ) != 0 ) { fprintf ( log, "** Wrong newline at offset %d\n", i ); } if ( strlen(newline) == 2 ) ++i; } } } // ================================================================================================= static void DoXMPCoreCoverage ( FILE * log ) { int i; bool ok; std::string tmpStr1, tmpStr2, tmpStr3, tmpStr4; XMP_OptionBits options; #if 0 { // Use this to be able to move the app window away from debugger windows. string junk; cout << "Move window, type anything to continue"; cin >> junk; } #endif // -------------------------------------------------------------------------------------------- #if 0 WriteMajorLabel ( log, "Test global XMP toolkit options" ); fprintf ( log, "Initial global options 0x%X\n", SXMPMeta::GetGlobalOptions() ); SXMPMeta::SetGlobalOptions ( 0 ); fprintf ( log, "Final global options 0x%X\n", SXMPMeta::GetGlobalOptions() ); #endif // -------------------------------------------------------------------------------------------- WriteMajorLabel ( log, "Dump predefined namespaces" ); SXMPMeta::DumpNamespaces ( DumpToFile, log ); // -------------------------------------------------------------------------------------------- { WriteMajorLabel ( log, "Test simple constructors and parsing, setting the instance ID" ); SXMPMeta meta1; DumpXMPObj ( log, meta1, "Empty XMP object" ); meta1.GetObjectName ( &tmpStr1 ); fprintf ( log, "\nEmpty object name = \"%s\"\n", tmpStr1.c_str() ); meta1.SetObjectName ( "New object name" ); DumpXMPObj ( log, meta1, "Set object name" ); SXMPMeta meta2 ( kRDFCoverage, strlen ( kRDFCoverage ) ); DumpXMPObj ( log, meta2, "Construct and parse from buffer" ); meta2.GetObjectName ( &tmpStr1 ); fprintf ( log, "\nRDFCoverage object name = \"%s\"\n", tmpStr1.c_str() ); meta2.SetProperty ( kXMP_NS_XMP_MM, "InstanceID", "meta2:Original" ); DumpXMPObj ( log, meta2, "Add instance ID" ); SXMPMeta meta4; meta4 = meta2.Clone(); meta4.SetProperty ( kXMP_NS_XMP_MM, "InstanceID", "meta4:Clone" ); DumpXMPObj ( log, meta4, "Clone and add instance ID" ); #if 0 WriteMajorLabel ( log, "Test XMPMeta object options" ); fprintf ( log, "Initial object options 0x%X\n", meta2.GetObjectOptions() ); meta2.SetObjectOptions ( ); fprintf ( log, "Final object options 0x%X\n", meta2.GetObjectOptions() ); #endif } // -------------------------------------------------------------------------------------------- // Static namespace functions // -------------------------- WriteMajorLabel ( log, "Test static namespace functions" ); fprintf ( log, "\n" ); tmpStr1.erase(); ok = SXMPMeta::RegisterNamespace ( kNS2, "ns2", &tmpStr1 ); fprintf ( log, "RegisterNamespace ns2 : %s, %s\n", YesOrNo ( ok ), tmpStr1.c_str() ); tmpStr1.erase(); ok = SXMPMeta::RegisterNamespace ( kNS2, "nsx:", &tmpStr1 ); fprintf ( log, "RegisterNamespace nsx : %s, %s\n", YesOrNo ( ok ), tmpStr1.c_str() ); tmpStr1.erase(); ok = SXMPMeta::GetNamespacePrefix ( kNS1, &tmpStr1 ); fprintf ( log, "GetNamespacePrefix ns1 : %s, %s\n", FoundOrNot ( ok ), tmpStr1.c_str() ); tmpStr1.erase(); ok = SXMPMeta::GetNamespaceURI ( "ns1", &tmpStr1 ); fprintf ( log, "GetNamespaceURI ns1 : %s, %s\n", FoundOrNot ( ok ), tmpStr1.c_str() ); tmpStr1.erase(); ok = SXMPMeta::GetNamespacePrefix ( "bogus", &tmpStr1 ); fprintf ( log, "GetNamespacePrefix bogus : %s\n", FoundOrNot ( ok ) ); tmpStr1.erase(); ok = SXMPMeta::GetNamespaceURI ( "bogus", &tmpStr1 ); fprintf ( log, "GetNamespaceURI bogus : %s\n", FoundOrNot ( ok ) ); SXMPMeta::DumpNamespaces ( DumpToFile, log ); #if 0 SXMPMeta::DeleteNamespace ( kNS2 ); SXMPMeta::DumpNamespaces ( DumpToFile, log ); (void) SXMPMeta::RegisterNamespace ( kNS2, "ns2", 0 ); #endif // -------------------------------------------------------------------------------------------- // Basic set/get methods // --------------------- { SXMPMeta meta; WriteMajorLabel ( log, "Test SetProperty and related methods" ); tmpStr1 = "Prop value"; meta.SetProperty ( kNS1, "Prop", tmpStr1 ); meta.SetProperty ( kNS1, "ns1:XMLProp", "" ); meta.SetProperty ( kNS1, "ns1:URIProp", "URI:value/", kXMP_PropValueIsURI ); tmpStr1 = "BagItem value"; meta.AppendArrayItem ( kNS1, "Bag", kXMP_PropValueIsArray, tmpStr1 ); meta.AppendArrayItem ( kNS1, "ns1:Seq", kXMP_PropArrayIsOrdered, "SeqItem value" ); meta.AppendArrayItem ( kNS1, "ns1:Alt", kXMP_PropArrayIsAlternate, "AltItem value" ); tmpStr1 = "Field1 value"; meta.SetStructField ( kNS1, "Struct", kNS2, "Field1", tmpStr1 ); meta.SetStructField ( kNS1, "ns1:Struct", kNS2, "Field2", "Field2 value" ); meta.SetStructField ( kNS1, "ns1:Struct", kNS2, "Field3", "Field3 value" ); tmpStr1 = "BagItem 3"; meta.SetArrayItem ( kNS1, "Bag", 1, tmpStr1 ); meta.SetArrayItem ( kNS1, "ns1:Bag", 1, "BagItem 1", kXMP_InsertBeforeItem ); meta.SetArrayItem ( kNS1, "ns1:Bag", 1, "BagItem 2", kXMP_InsertAfterItem ); meta.AppendArrayItem ( kNS1, "Bag", 0, "BagItem 4" ); DumpXMPObj ( log, meta, "A few basic Set... calls" ); tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1, kXMP_OmitPacketWrapper ); fprintf ( log, "\n%s\n", tmpStr1.c_str() ); fprintf ( log, "CountArrayItems Bag = %d\n", meta.CountArrayItems ( kNS1, "Bag" ) ); meta.SetProperty ( kNS1, "QualProp1", "Prop value" ); meta.SetQualifier ( kNS1, "QualProp1", kNS2, "Qual1", "Qual1 value" ); // *** meta.SetProperty ( kNS1, "QualProp1/Qual2", "Qual2 value", kXMP_PropIsQualifier ); invalid meta.SetProperty ( kNS1, "QualProp1/?ns2:Qual3", "Qual3 value" ); meta.SetProperty ( kNS1, "QualProp1/?xml:lang", "x-qual" ); meta.SetProperty ( kNS1, "QualProp2", "Prop value" ); meta.SetQualifier ( kNS1, "QualProp2", kXMP_NS_XML, "lang", "en-us" ); // *** meta.SetProperty ( kNS1, "QualProp2/xml:lang", "x-field", kXMP_PropIsQualifier ); invalid meta.SetProperty ( kNS1, "QualProp2/@xml:lang", "x-attr" ); meta.SetProperty ( kNS1, "QualProp3", "Prop value" ); meta.SetQualifier ( kNS1, "ns1:QualProp3", kXMP_NS_XML, "xml:lang", "en-us" ); meta.SetQualifier ( kNS1, "ns1:QualProp3", kNS2, "ns2:Qual", "Qual value" ); meta.SetProperty ( kNS1, "QualProp4", "Prop value" ); tmpStr1 = "Qual value"; meta.SetQualifier ( kNS1, "QualProp4", kNS2, "Qual", tmpStr1 ); meta.SetQualifier ( kNS1, "QualProp4", kXMP_NS_XML, "lang", "en-us" ); DumpXMPObj ( log, meta, "Add some qualifiers" ); tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1, kXMP_OmitPacketWrapper ); fprintf ( log, "\n%s\n", tmpStr1.c_str() ); meta.SetProperty ( kNS1, "QualProp1", "new value" ); meta.SetProperty ( kNS1, "QualProp2", "new value" ); meta.SetProperty ( kNS1, "QualProp3", "new value" ); meta.SetProperty ( kNS1, "QualProp4", "new value" ); DumpXMPObj ( log, meta, "Change values and keep qualifiers" ); // ---------------------------------------------------------------------------------------- WriteMajorLabel ( log, "Test GetProperty and related methods" ); meta.DeleteProperty ( kNS1, "QualProp1" ); // ! Start with fresh qualifiers. meta.DeleteProperty ( kNS1, "ns1:QualProp2" ); meta.DeleteProperty ( kNS1, "ns1:QualProp3" ); meta.DeleteProperty ( kNS1, "QualProp4" ); meta.SetProperty ( kNS1, "QualProp1", "Prop value" ); meta.SetQualifier ( kNS1, "QualProp1", kNS2, "Qual1", "Qual1 value" ); meta.SetProperty ( kNS1, "QualProp2", "Prop value" ); meta.SetQualifier ( kNS1, "QualProp2", kXMP_NS_XML, "lang", "en-us" ); meta.SetProperty ( kNS1, "QualProp3", "Prop value" ); meta.SetQualifier ( kNS1, "QualProp3", kXMP_NS_XML, "lang", "en-us" ); meta.SetQualifier ( kNS1, "QualProp3", kNS2, "Qual", "Qual value" ); meta.SetProperty ( kNS1, "QualProp4", "Prop value" ); meta.SetQualifier ( kNS1, "QualProp4", kNS2, "Qual", "Qual value" ); meta.SetQualifier ( kNS1, "QualProp4", kXMP_NS_XML, "lang", "en-us" ); DumpXMPObj ( log, meta, "XMP object" ); fprintf ( log, "\n" ); tmpStr1.erase(); ok = meta.GetProperty ( kNS1, "Prop", &tmpStr1, &options ); fprintf ( log, "GetProperty ns1:Prop : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); try { tmpStr1.erase(); ok = meta.GetProperty ( 0, "ns1:Prop", &tmpStr1, &options ); fprintf ( log, "#ERROR: No exception for GetProperty with no schema URI : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); } catch ( XMP_Error & excep ) { fprintf ( log, "GetProperty with no schema URI - threw XMP_Error #%d : %s\n", excep.GetID(), excep.GetErrMsg() ); } catch ( ... ) { fprintf ( log, "GetProperty with no schema URI - threw unknown exception\n" ); } tmpStr1.erase(); ok = meta.GetProperty ( kNS1, "ns1:XMLProp", &tmpStr1, &options ); fprintf ( log, "GetProperty ns1:XMLProp : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); tmpStr1.erase(); ok = meta.GetProperty ( kNS1, "ns1:URIProp", &tmpStr1, &options ); fprintf ( log, "GetProperty ns1:URIProp : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); fprintf ( log, "\n" ); tmpStr1.erase(); ok = meta.GetArrayItem ( kNS1, "Bag", 2, &tmpStr1, &options ); fprintf ( log, "GetArrayItem ns1:Bag[2] : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); try { tmpStr1.erase(); ok = meta.GetArrayItem ( 0, "ns1:Bag", 1, &tmpStr1, &options ); fprintf ( log, "#ERROR: No exception for GetArrayItem with no schema URI : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); } catch ( XMP_Error & excep ) { fprintf ( log, "GetArrayItem with no schema URI - threw XMP_Error #%d : %s\n", excep.GetID(), excep.GetErrMsg() ); } catch ( ... ) { fprintf ( log, "GetArrayItem with no schema URI - threw unknown exception\n" ); } tmpStr1.erase(); ok = meta.GetArrayItem ( kNS1, "ns1:Seq", 1, &tmpStr1, &options ); fprintf ( log, "GetArrayItem ns1:Seq[1] : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); tmpStr1.erase(); ok = meta.GetArrayItem ( kNS1, "ns1:Alt", kXMP_ArrayLastItem, &tmpStr1, &options ); fprintf ( log, "GetArrayItem ns1:Alt[1] : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); fprintf ( log, "\n" ); tmpStr1.erase(); ok = meta.GetStructField ( kNS1, "Struct", kNS2, "Field1", &tmpStr1, &options ); fprintf ( log, "GetStructField ns1:Struct/ns2:Field1 : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); tmpStr1.erase(); ok = meta.GetStructField ( kNS1, "ns1:Struct", kNS2, "ns2:Field2", &tmpStr1, &options ); fprintf ( log, "GetStructField ns1:Struct/ns2:Field2 : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); tmpStr1.erase(); ok = meta.GetStructField ( kNS1, "ns1:Struct", kNS2, "ns2:Field3", &tmpStr1, &options ); fprintf ( log, "GetStructField ns1:Struct/ns2:Field3 : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); tmpStr1.erase(); ok = meta.GetQualifier ( kNS1, "QualProp1", kNS2, "Qual1", &tmpStr1, &options ); fprintf ( log, "GetQualifier ns1:QualProp1/?ns2:Qual1 : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); try { tmpStr1.erase(); ok = meta.GetQualifier ( 0, "ns1:QualProp1", kNS2, "Qual1", &tmpStr1, &options ); fprintf ( log, "#ERROR: No exception for GetQualifier with no schema URI : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); } catch ( XMP_Error & excep ) { fprintf ( log, "GetQualifier with no schema URI - threw XMP_Error #%d : %s\n", excep.GetID(), excep.GetErrMsg() ); } catch ( ... ) { fprintf ( log, "GetQualifier with no schema URI - threw unknown exception\n" ); } tmpStr1.erase(); ok = meta.GetQualifier ( kNS1, "ns1:QualProp3", kXMP_NS_XML, "xml:lang", &tmpStr1, &options ); fprintf ( log, "GetQualifier ns1:QualProp3 : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); tmpStr1.erase(); ok = meta.GetQualifier ( kNS1, "ns1:QualProp3", kNS2, "ns2:Qual", &tmpStr1, &options ); fprintf ( log, "GetQualifier ns1:QualProp3/?ns2:Qual : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); fprintf ( log, "\n" ); tmpStr1 = "junk"; ok = meta.GetProperty ( kNS1, "Bag", &tmpStr1, &options ); fprintf ( log, "GetProperty ns1:Bag : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); tmpStr1 = "junk"; ok = meta.GetProperty ( kNS1, "Seq", &tmpStr1, &options ); fprintf ( log, "GetProperty ns1:Seq : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); tmpStr1 = "junk"; ok = meta.GetProperty ( kNS1, "Alt", &tmpStr1, &options ); fprintf ( log, "GetProperty ns1:Alt : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); tmpStr1 = "junk"; ok = meta.GetProperty ( kNS1, "Struct", &tmpStr1, &options ); fprintf ( log, "GetProperty ns1:Struct : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); fprintf ( log, "\n" ); try { tmpStr1 = "junk"; ok = meta.GetProperty ( "ns:bogus/", "Bogus", &tmpStr1, &options ); fprintf ( log, "#ERROR: No exception for GetProperty with bogus schema URI: %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); } catch ( XMP_Error & excep ) { fprintf ( log, "GetProperty with bogus schema URI - threw XMP_Error #%d : %s\n", excep.GetID(), excep.GetErrMsg() ); } catch ( ... ) { fprintf ( log, "GetProperty with bogus schema URI - threw unknown exception\n" ); } tmpStr1 = "junk"; ok = meta.GetProperty ( kNS1, "Bogus", &tmpStr1, &options ); fprintf ( log, "GetProperty ns1:Bogus : %s\n", FoundOrNot ( ok ) ); tmpStr1 = "junk"; ok = meta.GetArrayItem ( kNS1, "Bag", 99, &tmpStr1, &options ); fprintf ( log, "GetArrayItem ns1:Bag[99] : %s\n", FoundOrNot ( ok ) ); tmpStr1 = "junk"; ok = meta.GetStructField ( kNS1, "Struct", kNS2, "Bogus", &tmpStr1, &options ); fprintf ( log, "GetStructField ns1:Struct/ns2:Bogus : %s\n", FoundOrNot ( ok ) ); tmpStr1 = "junk"; ok = meta.GetQualifier ( kNS1, "Prop", kNS2, "Bogus", &tmpStr1, &options ); fprintf ( log, "GetQualifier ns1:Prop/?ns2:Bogus : %s\n", FoundOrNot ( ok ) ); // ---------------------------------------------------------------------------------------- WriteMajorLabel ( log, "Test DoesPropertyExist, DeleteProperty, and related methods" ); DumpXMPObj ( log, meta, "XMP object" ); fprintf ( log, "\n" ); ok = meta.DoesPropertyExist ( kNS1, "Prop" ); fprintf ( log, "DoesPropertyExist ns1:Prop : %s\n", YesOrNo ( ok ) ); try { ok = meta.DoesPropertyExist ( 0, "ns1:Bag" ); fprintf ( log, "#ERROR: No exception for DoesPropertyExist with no schema URI: %s\n", YesOrNo ( ok ) ); } catch ( XMP_Error & excep ) { fprintf ( log, "DoesPropertyExist with no schema URI - threw XMP_Error #%d : %s\n", excep.GetID(), excep.GetErrMsg() ); } catch ( ... ) { fprintf ( log, "DoesPropertyExist with no schema URI - threw unknown exception\n" ); } ok = meta.DoesPropertyExist ( kNS1, "ns1:Struct" ); fprintf ( log, "DoesPropertyExist ns1:Struct : %s\n", YesOrNo ( ok ) ); fprintf ( log, "\n" ); ok = meta.DoesArrayItemExist ( kNS1, "Bag", 2 ); fprintf ( log, "DoesArrayItemExist ns1:Bag[2] : %s\n", YesOrNo ( ok ) ); ok = meta.DoesArrayItemExist ( kNS1, "ns1:Seq", kXMP_ArrayLastItem ); fprintf ( log, "DoesArrayItemExist ns1:Seq[last] : %s\n", YesOrNo ( ok ) ); ok = meta.DoesStructFieldExist ( kNS1, "Struct", kNS2, "Field1" ); fprintf ( log, "DoesStructFieldExist ns1:Struct/ns2:Field1 : %s\n", YesOrNo ( ok ) ); ok = meta.DoesQualifierExist ( kNS1, "QualProp1", kNS2, "Qual1" ); fprintf ( log, "DoesQualifierExist ns1:QualProp1/?ns2:Qual1 : %s\n", YesOrNo ( ok ) ); ok = meta.DoesQualifierExist ( kNS1, "QualProp2", kXMP_NS_XML, "lang" ); fprintf ( log, "DoesQualifierExist ns1:QualProp2/?xml:lang : %s\n", YesOrNo ( ok ) ); fprintf ( log, "\n" ); try { ok = meta.DoesPropertyExist ( "ns:bogus/", "Bogus" ); fprintf ( log, "#ERROR: No exception for DoesPropertyExist with bogus schema URI: %s\n", YesOrNo ( ok ) ); } catch ( XMP_Error & excep ) { fprintf ( log, "DoesPropertyExist with bogus schema URI - threw XMP_Error #%d : %s\n", excep.GetID(), excep.GetErrMsg() ); } catch ( ... ) { fprintf ( log, "DoesPropertyExist with bogus schema URI - threw unknown exception\n" ); } ok = meta.DoesPropertyExist ( kNS1, "Bogus" ); fprintf ( log, "DoesPropertyExist ns1:Bogus : %s\n", YesOrNo ( ok ) ); ok = meta.DoesArrayItemExist ( kNS1, "Bag", 99 ); fprintf ( log, "DoesArrayItemExist ns1:Bag[99] : %s\n", YesOrNo ( ok ) ); try { ok = meta.DoesArrayItemExist ( 0, "ns1:Bag", kXMP_ArrayLastItem ); fprintf ( log, "#ERROR: No exception for DoesArrayItemExist with no schema URI: %s\n", YesOrNo ( ok ) ); } catch ( XMP_Error & excep ) { fprintf ( log, "DoesArrayItemExist with no schema URI - threw XMP_Error #%d : %s\n", excep.GetID(), excep.GetErrMsg() ); } catch ( ... ) { fprintf ( log, "DoesArrayItemExist with no schema URI - threw unknown exception\n" ); } ok = meta.DoesStructFieldExist ( kNS1, "Struct", kNS2, "Bogus" ); fprintf ( log, "DoesStructFieldExist ns1:Struct/ns2:Bogus : %s\n", YesOrNo ( ok ) ); ok = meta.DoesQualifierExist ( kNS1, "Prop", kNS2, "Bogus" ); fprintf ( log, "DoesQualifierExist ns1:Prop/?ns2:Bogus : %s\n", YesOrNo ( ok ) ); meta.DeleteProperty ( kNS1, "Prop" ); meta.DeleteArrayItem ( kNS1, "Bag", 2 ); meta.DeleteStructField ( kNS1, "Struct", kNS2, "Field1" ); DumpXMPObj ( log, meta, "Delete Prop, Bag[2], and Struct1/Field1" ); meta.DeleteQualifier ( kNS1, "QualProp1", kNS2, "Qual1" ); meta.DeleteQualifier ( kNS1, "QualProp2", kXMP_NS_XML, "lang" ); meta.DeleteQualifier ( kNS1, "QualProp3", kNS2, "Qual" ); meta.DeleteQualifier ( kNS1, "QualProp4", kXMP_NS_XML, "lang" ); DumpXMPObj ( log, meta, "Delete QualProp1/?ns2:Qual1, QualProp2/?xml:lang, QualProp3:/ns2:Qual, and QualProp4/?xml:lang" ); meta.DeleteProperty ( kNS1, "Bag" ); meta.DeleteProperty ( kNS1, "Struct" ); DumpXMPObj ( log, meta, "Delete all of Bag and Struct" ); } // -------------------------------------------------------------------------------------------- // Localized text set/get methods // ------------------------------ { SXMPMeta meta; WriteMajorLabel ( log, "Test SetLocalizedText and GetLocalizedText" ); tmpStr1 = "default value"; meta.SetLocalizedText ( kNS1, "AltText", "", "x-default", tmpStr1 ); DumpXMPObj ( log, meta, "Set x-default value" ); meta.SetLocalizedText ( kNS1, "AltText", "en", "en-us", "en-us value" ); DumpXMPObj ( log, meta, "Set en/en-us value" ); meta.SetLocalizedText ( kNS1, "AltText", "en", "en-uk", "en-uk value" ); DumpXMPObj ( log, meta, "Set en/en-uk value" ); fprintf ( log, "\n" ); tmpStr1.erase(); tmpStr2.erase(); ok = meta.GetLocalizedText ( kNS1, "AltText", "en", "en-ca", &tmpStr1, &tmpStr2, &options ); fprintf ( log, "GetLocalizedText en/en-ca : %s, \'%s\' \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), tmpStr2.c_str(), options ); tmpStr1 = "junk"; ok = meta.GetProperty ( kNS1, "AltText", &tmpStr1, &options ); fprintf ( log, "GetProperty ns1:AltText : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); } // -------------------------------------------------------------------------------------------- // Binary value set/get methods // ---------------------------- { SXMPMeta meta ( kDateTimeRDF, strlen(kDateTimeRDF) ); XMP_DateTime dateValue; bool boolValue; XMP_Int32 intValue; double floatValue; char dateName [8]; WriteMajorLabel ( log, "Test SetProperty... and GetProperty... methods (set/get with binary values)" ); FillDateTime ( &dateValue, 2000, 1, 2, 3, 4, 5, true, true, false, 0, 0, 0, 0 ); meta.SetProperty_Bool ( kNS1, "Bool0", false ); meta.SetProperty_Bool ( kNS1, "Bool1", true ); meta.SetProperty_Int ( kNS1, "Int", 42 ); meta.SetProperty_Float ( kNS1, "Float", 4.2 ); meta.SetProperty_Date ( kNS1, "Date10", dateValue ); dateValue.tzSign = 1; dateValue.tzHour = 6; dateValue.tzMinute = 7; meta.SetProperty_Date ( kNS1, "Date11", dateValue ); dateValue.tzSign = -1; meta.SetProperty_Date ( kNS1, "Date12", dateValue ); dateValue.nanoSecond = 9; meta.SetProperty_Date ( kNS1, "Date13", dateValue ); DumpXMPObj ( log, meta, "A few basic binary Set... calls" ); fprintf ( log, "\n" ); ok = meta.GetProperty_Bool ( kNS1, "Bool0", &boolValue, &options ); fprintf ( log, "GetProperty_Bool Bool0 : %s, %d, 0x%X\n", FoundOrNot ( ok ), boolValue, options ); ok = meta.GetProperty_Bool ( kNS1, "Bool1", &boolValue, &options ); fprintf ( log, "GetProperty_Bool Bool1 : %s, %d, 0x%X\n", FoundOrNot ( ok ), boolValue, options ); ok = meta.GetProperty_Int ( kNS1, "Int", &intValue, &options ); fprintf ( log, "GetProperty_Int : %s, %d, 0x%X\n", FoundOrNot ( ok ), intValue, options ); ok = meta.GetProperty_Float ( kNS1, "Float", &floatValue, &options ); fprintf ( log, "GetProperty_Float : %s, %f, 0x%X\n", FoundOrNot ( ok ), floatValue, options ); fprintf ( log, "\n" ); for ( i = 1; i < 14; ++i ) { sprintf ( dateName, "Date%d", i ); ok = meta.GetProperty_Date ( kNS1, dateName, &dateValue, &options ); fprintf ( log, "GetProperty_Date (%s) : %s, %d-%02d-%02d %02d:%02d:%02d %d*%02d:%02d %d, 0x%X\n", dateName, FoundOrNot ( ok ), dateValue.year, dateValue.month, dateValue.day, dateValue.hour, dateValue.minute, dateValue.second, dateValue.tzSign, dateValue.tzHour, dateValue.tzMinute, dateValue.nanoSecond, options ); meta.SetProperty_Date ( kNS2, dateName, dateValue ); } DumpXMPObj ( log, meta, "Get and re-set the dates" ); } // -------------------------------------------------------------------------------------------- // Parse and serialize methods // --------------------------- WriteMajorLabel ( log, "Test parsing with multiple buffers and various options" ); { SXMPMeta meta; for ( i = 0; i < (long)strlen(kSimpleRDF) - 10; i += 10 ) { meta.ParseFromBuffer ( &kSimpleRDF[i], 10, kXMP_ParseMoreBuffers ); } meta.ParseFromBuffer ( &kSimpleRDF[i], strlen(kSimpleRDF) - i ); DumpXMPObj ( log, meta, "Multiple buffer parse" ); } { SXMPMeta meta; for ( i = 0; i < (long)strlen(kSimpleRDF) - 10; i += 10 ) { meta.ParseFromBuffer ( &kSimpleRDF[i], 10, kXMP_ParseMoreBuffers ); } meta.ParseFromBuffer ( &kSimpleRDF[i], (strlen(kSimpleRDF) - i), kXMP_ParseMoreBuffers ); meta.ParseFromBuffer ( kSimpleRDF, 0 ); DumpXMPObj ( log, meta, "Multiple buffer parse, empty last buffer" ); } { SXMPMeta meta; for ( i = 0; i < (long)strlen(kSimpleRDF) - 10; i += 10 ) { meta.ParseFromBuffer ( &kSimpleRDF[i], 10, kXMP_ParseMoreBuffers ); } meta.ParseFromBuffer ( &kSimpleRDF[i], (strlen(kSimpleRDF) - i), kXMP_ParseMoreBuffers ); meta.ParseFromBuffer ( 0, 0 ); DumpXMPObj ( log, meta, "Multiple buffer parse, null last buffer" ); } { SXMPMeta meta; meta.ParseFromBuffer ( kSimpleRDF, strlen(kSimpleRDF), kXMP_RequireXMPMeta ); DumpXMPObj ( log, meta, "Parse and require xmpmeta element, which is missing" ); } { SXMPMeta meta; meta.ParseFromBuffer ( kNamespaceRDF, strlen(kNamespaceRDF) ); DumpXMPObj ( log, meta, "Parse RDF with multiple nested namespaces" ); } { SXMPMeta meta; meta.ParseFromBuffer ( kXMPMetaRDF, strlen(kXMPMetaRDF), kXMP_RequireXMPMeta ); DumpXMPObj ( log, meta, "Parse and require xmpmeta element, which is present" ); } { SXMPMeta meta; meta.ParseFromBuffer ( kInconsistentRDF, strlen(kInconsistentRDF) ); DumpXMPObj ( log, meta, "Parse and reconcile inconsistent aliases" ); } try { SXMPMeta meta; meta.ParseFromBuffer ( kInconsistentRDF, strlen(kInconsistentRDF), kXMP_StrictAliasing ); DumpXMPObj ( log, meta, "ERROR: Parse and do not reconcile inconsistent aliases - should have thrown an exception" ); } catch ( XMP_Error & excep ) { fprintf ( log, "\nParse and do not reconcile inconsistent aliases - threw XMP_Error #%d : %s\n", excep.GetID(), excep.GetErrMsg() ); } catch ( ... ) { fprintf ( log, "\nParse and do not reconcile inconsistent aliases - threw unknown exception\n" ); } { WriteMajorLabel ( log, "Test CR and LF in values" ); const char * kValueWithCR = "ASCII \x0D CR"; const char * kValueWithLF = "ASCII \x0A LF"; const char * kValueWithCRLF = "ASCII \x0D\x0A CRLF"; SXMPMeta meta ( kNewlineRDF, kXMP_UseNullTermination ); meta.SetProperty ( kNS2, "HasCR", kValueWithCR ); meta.SetProperty ( kNS2, "HasLF", kValueWithLF ); meta.SetProperty ( kNS2, "HasCRLF", kValueWithCRLF ); tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1, kXMP_OmitPacketWrapper ); fprintf ( log, "\n%s\n", tmpStr1.c_str() ); tmpStr1.erase(); tmpStr2.erase(); ok = meta.GetProperty ( kNS1, "HasCR", &tmpStr1, 0 ); ok = meta.GetProperty ( kNS2, "HasCR", &tmpStr2, 0 ); if ( (tmpStr1 != kValueWithCR) || (tmpStr2 != kValueWithCR) ) fprintf ( log, "\n ## HasCR values are bad\n" ); tmpStr1.erase(); tmpStr2.erase(); ok = meta.GetProperty ( kNS1, "HasLF", &tmpStr1, 0 ); ok = meta.GetProperty ( kNS2, "HasLF", &tmpStr2, 0 ); if ( (tmpStr1 != kValueWithLF) || (tmpStr2 != kValueWithLF) ) fprintf ( log, "\n ## HasLF values are bad\n" ); tmpStr1.erase(); tmpStr2.erase(); ok = meta.GetProperty ( kNS1, "HasCRLF", &tmpStr1, 0 ); ok = meta.GetProperty ( kNS2, "HasCRLF", &tmpStr2, 0 ); if ( (tmpStr1 != kValueWithCRLF) || (tmpStr2 != kValueWithCRLF) ) fprintf ( log, "\n ## HasCRLF values are bad\n" ); } { WriteMajorLabel ( log, "Test serialization with various options" ); SXMPMeta meta ( kSimpleRDF, strlen(kSimpleRDF) ); meta.SetProperty ( kNS2, "Another", "Something in another schema" ); meta.SetProperty ( kNS2, "Yet/pdf:More", "Yet more in another schema" ); DumpXMPObj ( log, meta, "Parse simple RDF, serialize with various options" ); tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1 ); WriteMinorLabel ( log, "Default serialize" ); fprintf ( log, "%s\n", tmpStr1.c_str() ); fflush ( log ); VerifyNewlines ( log, tmpStr1, "\x0A" ); SXMPMeta meta2 ( tmpStr1.c_str(), tmpStr1.size() ); DumpXMPObj ( log, meta2, "Reparse default serialization" ); tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1, kXMP_OmitPacketWrapper | kXMP_UseCompactFormat ); WriteMinorLabel ( log, "Compact RDF, no packet serialize" ); fprintf ( log, "%s\n", tmpStr1.c_str() ); SXMPMeta meta3 ( tmpStr1.c_str(), tmpStr1.size() ); DumpXMPObj ( log, meta3, "Reparse compact serialization" ); { SXMPMeta meta2; meta2.SetProperty ( kXMP_NS_PDF, "Author", "PDF Author" ); tmpStr1.erase(); meta2.SerializeToBuffer ( &tmpStr1, kXMP_ReadOnlyPacket ); WriteMinorLabel ( log, "Read-only serialize with alias comments" ); fprintf ( log, "%s\n", tmpStr1.c_str() ); meta2.SetProperty ( kXMP_NS_PDF, "Actual", "PDF Actual" ); meta2.SetProperty ( kXMP_NS_XMP, "Actual", "XMP Actual" ); tmpStr1.erase(); meta2.SerializeToBuffer ( &tmpStr1, kXMP_ReadOnlyPacket ); WriteMinorLabel ( log, "Read-only serialize with alias comments (more actuals)" ); fprintf ( log, "%s\n", tmpStr1.c_str() ); } tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1, kXMP_OmitPacketWrapper, 0, "\x0D" ); WriteMinorLabel ( log, "CR newline serialize" ); fprintf ( log, "%s\n", tmpStr1.c_str() ); VerifyNewlines ( log, tmpStr1, "\x0D" ); tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1, kXMP_OmitPacketWrapper, 0, "\x0D\x0A" ); WriteMinorLabel ( log, "CRLF newline serialize" ); fprintf ( log, "%s\n", tmpStr1.c_str() ); VerifyNewlines ( log, tmpStr1, "\x0D\x0A" ); tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1, kXMP_OmitPacketWrapper, 0, "<->" ); WriteMinorLabel ( log, "Alternate newline serialize" ); fprintf ( log, "%s\n", tmpStr1.c_str() ); tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1, kXMP_OmitPacketWrapper, 0, "", "#", 3 ); WriteMinorLabel ( log, "Alternate indent serialize" ); fprintf ( log, "%s\n", tmpStr1.c_str() ); tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1, 0, 10 ); WriteMinorLabel ( log, "Small padding serialize" ); fprintf ( log, "%s\n", tmpStr1.c_str() ); tmpStr1.erase(); tmpStr2.erase(); meta.SerializeToBuffer ( &tmpStr1 ); meta.SerializeToBuffer ( &tmpStr2, kXMP_IncludeThumbnailPad ); fprintf ( log, "Thumbnailpad adds %d bytes\n", tmpStr2.size()-tmpStr1.size() ); tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1, kXMP_ReadOnlyPacket ); size_t minSize = tmpStr1.size(); fprintf ( log, "Minimum packet size is %d bytes\n", minSize ); tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1, kXMP_ExactPacketLength, minSize+1234 ); fprintf ( log, "Minimum+1234 packet size is %d bytes\n", tmpStr1.size() ); if ( tmpStr1.size() != (minSize + 1234) ) fprintf ( log, "** Bad packet length **\n" ); tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1, kXMP_ExactPacketLength, minSize ); fprintf ( log, "Minimum+0 packet size is %d bytes\n", tmpStr1.size() ); if ( tmpStr1.size() != minSize ) fprintf ( log, "** Bad packet length **\n" ); try { tmpStr1.erase(); meta.SerializeToBuffer ( &tmpStr1, kXMP_ExactPacketLength, minSize-1 ); fprintf ( log, "#ERROR: No exception for minimum-1, size is %d bytes **\n", tmpStr1.size() ); } catch ( XMP_Error & excep ) { fprintf ( log, "Serialize in minimum-1 - threw XMP_Error #%d : %s\n", excep.GetID(), excep.GetErrMsg() ); } catch ( ... ) { fprintf ( log, "Serialize in minimum-1 - threw unknown exception\n" ); } // *** UTF-16 and UTF-32 encodings } // -------------------------------------------------------------------------------------------- // Iteration methods // ----------------- { WriteMajorLabel ( log, "Test iteration methods" ); SXMPMeta meta ( kRDFCoverage, strlen ( kRDFCoverage ) ); XMP_OptionBits opt2; meta.SetProperty ( kNS2, "Prop", "Prop value" ); meta.SetProperty ( kNS2, "Bag", 0, kXMP_PropValueIsArray ); meta.SetArrayItem ( kNS2, "Bag", 1, "BagItem 2" ); meta.SetArrayItem ( kNS2, "Bag", 1, "BagItem 1", kXMP_InsertBeforeItem ); meta.SetArrayItem ( kNS2, "Bag", 2, "BagItem 3", kXMP_InsertAfterItem ); DumpXMPObj ( log, meta, "Parse \"coverage\" RDF, add Bag items out of order" ); { SXMPIterator iter ( meta ); WriteMinorLabel ( log, "Default iteration" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); if ( ! (options & kXMP_SchemaNode) ) { tmpStr4.erase(); ok = meta.GetProperty ( tmpStr1.c_str(), tmpStr2.c_str(), &tmpStr4, &opt2 ); if ( (! ok) || (tmpStr4 != tmpStr3) || (opt2 != options) ) { fprintf ( log, " ** GetProperty failed: %s, \"%s\", 0x%X\n", FoundOrNot(ok), tmpStr4.c_str(), opt2 ); } } } } { SXMPIterator iter ( meta, kXMP_IterOmitQualifiers ); WriteMinorLabel ( log, "Iterate omitting qualifiers" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); if ( ! (options & kXMP_SchemaNode) ) { tmpStr4.erase(); ok = meta.GetProperty ( tmpStr1.c_str(), tmpStr2.c_str(), &tmpStr4, &opt2 ); if ( (! ok) || (tmpStr4 != tmpStr3) || (opt2 != options) ) { fprintf ( log, " ** GetProperty failed: %s, \"%s\", 0x%X\n", FoundOrNot(ok), tmpStr4.c_str(), opt2 ); } } } } { SXMPIterator iter ( meta, kXMP_IterJustLeafName ); WriteMinorLabel ( log, "Iterate with just leaf names" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); } } { SXMPIterator iter ( meta, kXMP_IterJustLeafNodes ); WriteMinorLabel ( log, "Iterate just the leaf nodes" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); if ( ! (options & kXMP_SchemaNode) ) { tmpStr4.erase(); ok = meta.GetProperty ( tmpStr1.c_str(), tmpStr2.c_str(), &tmpStr4, &opt2 ); if ( (! ok) || (tmpStr4 != tmpStr3) || (opt2 != options) ) { fprintf ( log, " ** GetProperty failed: %s, \"%s\", 0x%X\n", FoundOrNot(ok), tmpStr4.c_str(), opt2 ); } } } } { SXMPIterator iter ( meta, kXMP_IterJustChildren ); WriteMinorLabel ( log, "Iterate just the schema nodes" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); } } { SXMPIterator iter ( meta, kNS2 ); WriteMinorLabel ( log, "Iterate the ns2: namespace" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); if ( ! (options & kXMP_SchemaNode) ) { tmpStr4.erase(); ok = meta.GetProperty ( tmpStr1.c_str(), tmpStr2.c_str(), &tmpStr4, &opt2 ); if ( (! ok) || (tmpStr4 != tmpStr3) || (opt2 != options) ) { fprintf ( log, " ** GetProperty failed: %s, \"%s\", 0x%X\n", FoundOrNot(ok), tmpStr4.c_str(), opt2 ); } } } } { SXMPIterator iter ( meta, kNS2, "Bag" ); WriteMinorLabel ( log, "Start at ns2:Bag" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); if ( ! (options & kXMP_SchemaNode) ) { tmpStr4.erase(); ok = meta.GetProperty ( tmpStr1.c_str(), tmpStr2.c_str(), &tmpStr4, &opt2 ); if ( (! ok) || (tmpStr4 != tmpStr3) || (opt2 != options) ) { fprintf ( log, " ** GetProperty failed: %s, \"%s\", 0x%X\n", FoundOrNot(ok), tmpStr4.c_str(), opt2 ); } } } } { SXMPIterator iter ( meta, kNS2, "NestedStructProp/ns1:Outer" ); WriteMinorLabel ( log, "Start at ns2:NestedStructProp/ns1:Outer" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); if ( ! (options & kXMP_SchemaNode) ) { tmpStr4.erase(); ok = meta.GetProperty ( tmpStr1.c_str(), tmpStr2.c_str(), &tmpStr4, &opt2 ); if ( (! ok) || (tmpStr4 != tmpStr3) || (opt2 != options) ) { fprintf ( log, " ** GetProperty failed: %s, \"%s\", 0x%X\n", FoundOrNot(ok), tmpStr4.c_str(), opt2 ); } } } } { SXMPIterator iter ( meta, "ns:empty/" ); WriteMinorLabel ( log, "Iterate an empty namespace" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); if ( ! (options & kXMP_SchemaNode) ) { tmpStr4.erase(); ok = meta.GetProperty ( tmpStr1.c_str(), tmpStr2.c_str(), &tmpStr4, &opt2 ); if ( (! ok) || (tmpStr4 != tmpStr3) || (opt2 != options) ) { fprintf ( log, " ** GetProperty failed: %s, \"%s\", 0x%X\n", FoundOrNot(ok), tmpStr4.c_str(), opt2 ); } } } } { SXMPIterator iter ( meta, kNS2, "", kXMP_IterJustChildren | kXMP_IterJustLeafName ); WriteMinorLabel ( log, "Iterate the top of the ns2: namespace with just leaf names" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); } } { SXMPIterator iter ( meta, kNS2, "", kXMP_IterJustChildren | kXMP_IterJustLeafNodes ); WriteMinorLabel ( log, "Iterate the top of the ns2: namespace visiting just leaf nodes" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); if ( ! (options & kXMP_SchemaNode) ) { tmpStr4.erase(); ok = meta.GetProperty ( tmpStr1.c_str(), tmpStr2.c_str(), &tmpStr4, &opt2 ); if ( (! ok) || (tmpStr4 != tmpStr3) || (opt2 != options) ) { fprintf ( log, " ** GetProperty failed: %s, \"%s\", 0x%X\n", FoundOrNot(ok), tmpStr4.c_str(), opt2 ); } } } } { SXMPIterator iter ( meta, kNS2, "Bag", kXMP_IterJustChildren ); WriteMinorLabel ( log, "Iterate just the children of ns2:Bag" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); if ( ! (options & kXMP_SchemaNode) ) { tmpStr4.erase(); ok = meta.GetProperty ( tmpStr1.c_str(), tmpStr2.c_str(), &tmpStr4, &opt2 ); if ( (! ok) || (tmpStr4 != tmpStr3) || (opt2 != options) ) { fprintf ( log, " ** GetProperty failed: %s, \"%s\", 0x%X\n", FoundOrNot(ok), tmpStr4.c_str(), opt2 ); } } } } { SXMPIterator iter ( meta, kNS2, "Bag", kXMP_IterJustChildren | kXMP_IterJustLeafName ); WriteMinorLabel ( log, "Iterate just the children of ns2:Bag with just leaf names" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); } } { SXMPIterator iter ( meta, kNS2, "NestedStructProp/ns1:Outer/ns1:Middle", kXMP_IterJustChildren ); WriteMinorLabel ( log, "Iterate just the children of ns2:NestedStructProp/ns1:Outer/ns1:Middle" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); if ( ! (options & kXMP_SchemaNode) ) { tmpStr4.erase(); ok = meta.GetProperty ( tmpStr1.c_str(), tmpStr2.c_str(), &tmpStr4, &opt2 ); if ( (! ok) || (tmpStr4 != tmpStr3) || (opt2 != options) ) { fprintf ( log, " ** GetProperty failed: %s, \"%s\", 0x%X\n", FoundOrNot(ok), tmpStr4.c_str(), opt2 ); } } } } { SXMPIterator iter ( meta ); WriteMinorLabel ( log, "Skip children of ArrayProp2, and siblings after StructProp" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); if ( ! (options & kXMP_SchemaNode) ) { tmpStr4.erase(); ok = meta.GetProperty ( tmpStr1.c_str(), tmpStr2.c_str(), &tmpStr4, &opt2 ); if ( (! ok) || (tmpStr4 != tmpStr3) || (opt2 != options) ) { fprintf ( log, " ** GetProperty failed: %s, \"%s\", 0x%X\n", FoundOrNot(ok), tmpStr4.c_str(), opt2 ); } } if ( tmpStr2 == "ns1:ArrayProp2" ) iter.Skip ( kXMP_IterSkipSubtree ); if ( tmpStr2 == "ns1:StructProp" ) iter.Skip ( kXMP_IterSkipSiblings ); } } { SXMPMeta meta; meta.SetProperty ( kXMP_NS_PDF, "Author", "PDF Author" ); meta.SetProperty ( kXMP_NS_PDF, "PDFProp", "PDF Prop" ); meta.SetProperty ( kXMP_NS_XMP, "XMPProp", "XMP Prop" ); meta.SetProperty ( kXMP_NS_DC, "DCProp", "DC Prop" ); SXMPIterator iter1 ( meta ); WriteMinorLabel ( log, "Iterate without showing aliases" ); while ( true ) { tmpStr1.erase(); tmpStr2.erase(); tmpStr3.erase(); if ( ! iter1.Next ( &tmpStr1, &tmpStr2, &tmpStr3, &options ) ) break; fprintf ( log, " %s %s = \"%s\", 0x%X\n", tmpStr1.c_str(), tmpStr2.c_str(), tmpStr3.c_str(), options ); if ( ! (options & kXMP_SchemaNode) ) { tmpStr4.erase(); options &= kXMP_PropHasAliases; // So the comparison below works. ok = meta.GetProperty ( tmpStr1.c_str(), tmpStr2.c_str(), &tmpStr4, &opt2 ); if ( (! ok) || (tmpStr4 != tmpStr3) || (opt2 != options) ) { fprintf ( log, " ** GetProperty failed: %s, \"%s\", 0x%X\n", FoundOrNot(ok), tmpStr4.c_str(), opt2 ); } } } } } // -------------------------------------------------------------------------------------------- // XPath composition utilities // --------------------------- { WriteMajorLabel ( log, "Test XPath composition utilities" ); SXMPMeta meta ( kSimpleRDF, strlen(kSimpleRDF) ); DumpXMPObj ( log, meta, "Parse simple RDF" ); fprintf ( log, "\n" ); tmpStr1.erase(); SXMPUtils::ComposeArrayItemPath ( kNS1, "ArrayProp", 2, &tmpStr1 ); fprintf ( log, "ComposeArrayItemPath ns1:ArrayProp[2] : %s\n", tmpStr1.c_str() ); meta.SetProperty ( kNS1, tmpStr1.c_str(), "new ns1:ArrayProp[2] value" ); fprintf ( log, "\n" ); tmpStr1.erase(); SXMPUtils::ComposeStructFieldPath ( kNS1, "StructProp", kNS2, "Field3", &tmpStr1 ); fprintf ( log, "ComposeStructFieldPath ns1:StructProp/ns2:Field3 : %s\n", tmpStr1.c_str() ); meta.SetProperty ( kNS1, tmpStr1.c_str(), "new ns1:StructProp/ns2:Field3 value" ); tmpStr1.erase(); SXMPUtils::ComposeQualifierPath ( kNS1, "QualProp", kNS2, "Qual", &tmpStr1 ); fprintf ( log, "ComposeQualifierPath ns1:QualProp/?ns2:Qual : %s\n", tmpStr1.c_str() ); meta.SetProperty ( kNS1, tmpStr1.c_str(), "new ns1:QualProp/?ns2:Qual value" ); fprintf ( log, "\n" ); tmpStr1.erase(); SXMPUtils::ComposeQualifierPath ( kNS1, "AltTextProp", kXMP_NS_XML, "lang", &tmpStr1 ); fprintf ( log, "ComposeQualifierPath ns1:AltTextProp/?xml:lang : %s\n", tmpStr1.c_str() ); meta.SetProperty ( kNS1, tmpStr1.c_str(), "new ns1:AltTextProp/?xml:lang value" ); tmpStr1.erase(); tmpStr2 = "x-two"; SXMPUtils::ComposeLangSelector ( kNS1, "AltTextProp", tmpStr2, &tmpStr1 ); fprintf ( log, "ComposeLangSelector ns1:AltTextProp['x-two'] : %s\n", tmpStr1.c_str() ); meta.SetProperty ( kNS1, tmpStr1.c_str(), "new ns1:AltTextProp['x-two'] value" ); fprintf ( log, "\n" ); fprintf ( log, "Check field selector usage\n" ); fflush ( log ); tmpStr1.erase(); ok = meta.GetProperty ( kNS1, "ArrayOfStructProp[ns2:Field1='Item-2']", &tmpStr1, &options ); fprintf ( log, "GetProperty ArrayOfStructProp[ns2:Field1='Item-2'] : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); fflush ( log ); tmpStr1.erase(); ok = meta.GetProperty ( kNS1, "ArrayOfStructProp[ns2:Field1='Item-2']/ns2:Field2", &tmpStr1, &options ); fprintf ( log, "GetProperty ArrayOfStructProp[ns2:Field1='Item-2']/ns2:Field2 : %s, \"%s\", 0x%X\n", FoundOrNot ( ok ), tmpStr1.c_str(), options ); fflush ( log ); tmpStr1.erase(); tmpStr2 = "Item-2"; SXMPUtils::ComposeFieldSelector ( kNS1, "ArrayOfStructProp", kNS2, "Field1", tmpStr2, &tmpStr1 ); fprintf ( log, "ComposeFieldSelector ns1:ArrayOfStructProp[ns2:Field1=Item-2] : %s\n", tmpStr1.c_str() ); tmpStr2.erase(); SXMPUtils::ComposeStructFieldPath ( kNS1, tmpStr1.c_str(), kNS2, "Field2", &tmpStr2 ); fprintf ( log, "ComposeStructFieldPath ns1:ArrayOfStructProp[ns2:Field1=Item-2]/ns2:Field2 : %s\n", tmpStr2.c_str() ); meta.SetProperty ( kNS1, tmpStr2.c_str(), "new ns1:ArrayOfStructProp[ns2:Field1=Item-2]/ns2:Field2 value" ); DumpXMPObj ( log, meta, "Modified simple RDF" ); } // -------------------------------------------------------------------------------------------- // Value conversion utilities // -------------------------- WriteMajorLabel ( log, "Test value conversion utilities" ); fprintf ( log, "\n" ); tmpStr1.erase(); SXMPUtils::ConvertFromBool ( true, &tmpStr1 ); fprintf ( log, "ConverFromBool true : %s\n", tmpStr1.c_str() ); tmpStr1.erase(); SXMPUtils::ConvertFromBool ( false, &tmpStr1 ); fprintf ( log, "ConverFromBool false : %s\n", tmpStr1.c_str() ); fprintf ( log, "\n" ); ok = SXMPUtils::ConvertToBool ( kXMP_TrueStr ); fprintf ( log, "ConverToBool kXMP_TrueStr : %d\n", (int)ok ); ok = SXMPUtils::ConvertToBool ( kXMP_FalseStr ); fprintf ( log, "ConverToBool kXMP_FalseStr : %d\n", (int)ok ); fprintf ( log, "\n" ); tmpStr1 = "true"; ok = SXMPUtils::ConvertToBool ( tmpStr1 ); fprintf ( log, "ConverToBool true : %d\n", (int)ok ); ok = SXMPUtils::ConvertToBool ( "TRUE" ); fprintf ( log, "ConverToBool TRUE : %d\n", (int)ok ); ok = SXMPUtils::ConvertToBool ( "t" ); fprintf ( log, "ConverToBool t : %d\n", (int)ok ); ok = SXMPUtils::ConvertToBool ( "1" ); fprintf ( log, "ConverToBool 1 : %d\n", (int)ok ); fprintf ( log, "\n" ); ok = SXMPUtils::ConvertToBool ( "false" ); fprintf ( log, "ConverToBool false : %d\n", (int)ok ); ok = SXMPUtils::ConvertToBool ( "FALSE" ); fprintf ( log, "ConverToBool FALSE : %d\n", (int)ok ); ok = SXMPUtils::ConvertToBool ( "f" ); fprintf ( log, "ConverToBool f : %d\n", (int)ok ); ok = SXMPUtils::ConvertToBool ( "0" ); fprintf ( log, "ConverToBool 0 : %d\n", (int)ok ); fprintf ( log, "\n" ); tmpStr1.erase(); SXMPUtils::ConvertFromInt ( 0, 0, &tmpStr1 ); fprintf ( log, "ConverFromInt 0 : %s\n", tmpStr1.c_str() ); tmpStr1.erase(); SXMPUtils::ConvertFromInt ( 42, 0, &tmpStr1 ); fprintf ( log, "ConverFromInt 42 : %s\n", tmpStr1.c_str() ); tmpStr1.erase(); SXMPUtils::ConvertFromInt ( -42, 0, &tmpStr1 ); fprintf ( log, "ConverFromInt -42 : %s\n", tmpStr1.c_str() ); tmpStr1.erase(); SXMPUtils::ConvertFromInt ( 0x7FFFFFFF, 0, &tmpStr1 ); fprintf ( log, "ConverFromInt 0x7FFFFFFF : %s\n", tmpStr1.c_str() ); tmpStr1.erase(); SXMPUtils::ConvertFromInt ( 0x80000000, 0, &tmpStr1 ); fprintf ( log, "ConverFromInt 0x80000000 : %s\n", tmpStr1.c_str() ); tmpStr1.erase(); SXMPUtils::ConvertFromInt ( 0x7FFFFFFF, "%X", &tmpStr1 ); fprintf ( log, "ConverFromInt 0x7FFFFFFF as hex : %s\n", tmpStr1.c_str() ); tmpStr1.erase(); SXMPUtils::ConvertFromInt ( 0x80000000, "%X", &tmpStr1 ); fprintf ( log, "ConverFromInt 0x80000000 as hex : %s\n", tmpStr1.c_str() ); fprintf ( log, "\n" ); long int1; tmpStr1 = "0"; int1 = SXMPUtils::ConvertToInt ( tmpStr1 ); fprintf ( log, "ConvertToInt 0 : %d\n", int1 ); int1 = SXMPUtils::ConvertToInt ( "42" ); fprintf ( log, "ConvertToInt 42 : %d\n", int1 ); int1 = SXMPUtils::ConvertToInt ( "-42" ); fprintf ( log, "ConvertToInt -42 : %d\n", int1 ); int1 = SXMPUtils::ConvertToInt ( "0x7FFFFFFF" ); fprintf ( log, "ConvertToInt 0x7FFFFFFF : %d\n", int1 ); int1 = SXMPUtils::ConvertToInt ( "0x80000000" ); fprintf ( log, "ConvertToInt 0x80000000 : %d\n", int1 ); int1 = SXMPUtils::ConvertToInt ( "0x7FFFFFFF" ); fprintf ( log, "ConvertToInt 0x7FFFFFFF as hex : %X\n", int1 ); int1 = SXMPUtils::ConvertToInt ( "0x80000000" ); fprintf ( log, "ConvertToInt 0x80000000 as hex : %X\n", int1 ); fprintf ( log, "\n" ); tmpStr1.erase(); SXMPUtils::ConvertFromFloat ( 0, 0, &tmpStr1 ); fprintf ( log, "ConverFromFloat 0 : %s\n", tmpStr1.c_str() ); tmpStr1.erase(); SXMPUtils::ConvertFromFloat ( 4.2, 0, &tmpStr1 ); fprintf ( log, "ConverFromFloat 4.2 : %s\n", tmpStr1.c_str() ); tmpStr1.erase(); SXMPUtils::ConvertFromFloat ( -4.2, 0, &tmpStr1 ); fprintf ( log, "ConverFromFloat -4.2 : %s\n", tmpStr1.c_str() ); tmpStr1.erase(); SXMPUtils::ConvertFromFloat ( (int)0x7FFFFFFF, 0, &tmpStr1 ); fprintf ( log, "ConverFromFloat 0x7FFFFFFF : %s\n", tmpStr1.c_str() ); tmpStr1.erase(); SXMPUtils::ConvertFromFloat ( (int)0x80000000, 0, &tmpStr1 ); fprintf ( log, "ConverFromFloat 0x80000000 : %s\n", tmpStr1.c_str() ); tmpStr1.erase(); SXMPUtils::ConvertFromFloat ( (int)0x7FFFFFFF, "%f", &tmpStr1 ); fprintf ( log, "ConverFromFloat 0x7FFFFFFF as f : %s\n", tmpStr1.c_str() ); tmpStr1.erase(); SXMPUtils::ConvertFromFloat ( (int)0x80000000, "%f", &tmpStr1 ); fprintf ( log, "ConverFromFloat 0x80000000 as f : %s\n", tmpStr1.c_str() ); fprintf ( log, "\n" ); double float1; tmpStr1 = "0"; float1 = SXMPUtils::ConvertToFloat ( tmpStr1 ); fprintf ( log, "ConvertToFloat 0 : %f\n", float1 ); float1 = SXMPUtils::ConvertToFloat ( "4.2" ); fprintf ( log, "ConvertToFloat 4.2 : %f\n", float1 ); float1 = SXMPUtils::ConvertToFloat ( "-4.2" ); fprintf ( log, "ConvertToFloat -4.2 : %f\n", float1 ); fprintf ( log, "\n" ); XMP_DateTime date1, date2; FillDateTime ( &date1, 2000, 1, 31, 12, 34, 56, true, true, true, -1, 8, 0, 0 ); tmpStr1.erase(); SXMPUtils::ConvertFromDate ( date1, &tmpStr1 ); fprintf ( log, "ConvertFromDate 2000 Jan 31 12:34:56 PST : %s\n", tmpStr1.c_str() ); SXMPUtils::ConvertToDate ( tmpStr1, &date2 ); fprintf ( log, "ConvertToDate : %d-%02d-%02d %02d:%02d:%02d %d*%02d:%02d %d\n", date2.year, date2.month, date2.day, date2.hour, date2.minute, date2.second, date2.tzSign, date2.tzHour, date2.tzMinute, date2.nanoSecond ); // -------------------------------------------------------------------------------------------- // Date/Time utilities // ------------------- { WriteMajorLabel ( log, "Test date/time utilities and special values" ); fprintf ( log, "\n" ); XMP_DateTime utcNow, localNow; SXMPUtils::SetTimeZone ( &utcNow ); fprintf ( log, "SetTimeZone : %d-%02d-%02d %02d:%02d:%02d %d*%02d:%02d %d\n", utcNow.year, utcNow.month, utcNow.day, utcNow.hour, utcNow.minute, utcNow.second, utcNow.tzSign, utcNow.tzHour, utcNow.tzMinute, utcNow.nanoSecond ); SXMPUtils::CurrentDateTime ( &utcNow ); fprintf ( log, "CurrentDateTime : %d-%02d-%02d %02d:%02d:%02d %d*%02d:%02d %d\n", utcNow.year, utcNow.month, utcNow.day, utcNow.hour, utcNow.minute, utcNow.second, utcNow.tzSign, utcNow.tzHour, utcNow.tzMinute, utcNow.nanoSecond ); localNow = utcNow; SXMPUtils::ConvertToLocalTime ( &localNow ); fprintf ( log, "ConvertToLocalTime : %d-%02d-%02d %02d:%02d:%02d %d*%02d:%02d %d\n", localNow.year, localNow.month, localNow.day, localNow.hour, localNow.minute, localNow.second, localNow.tzSign, localNow.tzHour, localNow.tzMinute, localNow.nanoSecond ); utcNow = localNow; SXMPUtils::ConvertToUTCTime ( &utcNow ); fprintf ( log, "ConvertToUTCTime : %d-%02d-%02d %02d:%02d:%02d %d*%02d:%02d %d\n", utcNow.year, utcNow.month, utcNow.day, utcNow.hour, utcNow.minute, utcNow.second, utcNow.tzSign, utcNow.tzHour, utcNow.tzMinute, utcNow.nanoSecond ); fprintf ( log, "\n" ); i = SXMPUtils::CompareDateTime ( utcNow, localNow ); fprintf ( log, "CompareDateTime with a == b : %d\n", i ); utcNow.second = 0; localNow.second = 30; i = SXMPUtils::CompareDateTime ( utcNow, localNow ); fprintf ( log, "CompareDateTime with a < b : %d\n", i ); utcNow.second = 59; i = SXMPUtils::CompareDateTime ( utcNow, localNow ); fprintf ( log, "CompareDateTime with a > b : %d\n", i ); } // -------------------------------------------------------------------------------------------- // Miscellaneous utilities // ----------------------- { WriteMajorLabel ( log, "Test CatenateArrayItems and SeparateArrayItems" ); fprintf ( log, "\n" ); SXMPMeta meta; meta.AppendArrayItem ( kNS1, "Array1", kXMP_PropValueIsArray, "one" ); meta.AppendArrayItem ( kNS1, "Array1", 0, "two" ); meta.AppendArrayItem ( kNS1, "Array1", kXMP_PropValueIsArray, "3, three" ); meta.AppendArrayItem ( kNS1, "Array1", 0, "4; four" ); DumpXMPObj ( log, meta, "Initial array" ); fprintf ( log, "\n" ); tmpStr1.erase(); SXMPUtils::CatenateArrayItems ( meta, kNS1, "Array1", "; ", "\"", kXMP_NoOptions, &tmpStr1 ); fprintf ( log, "CatenateArrayItems, no commas : %s\n", tmpStr1.c_str() ); tmpStr2.erase(); SXMPUtils::CatenateArrayItems ( meta, kNS1, "Array1", " ; ", "[]", kXMPUtil_AllowCommas, &tmpStr2 ); fprintf ( log, "CatenateArrayItems, allow commas : %s\n", tmpStr2.c_str() ); SXMPUtils::SeparateArrayItems ( &meta, kNS1, "Array2-1", kXMP_NoOptions, tmpStr1.c_str() ); SXMPUtils::SeparateArrayItems ( &meta, kNS1, "Array2-2", kXMPUtil_AllowCommas, tmpStr1.c_str() ); SXMPUtils::SeparateArrayItems ( &meta, kNS1, "Array3-1", kXMP_PropArrayIsOrdered, tmpStr2 ); SXMPUtils::SeparateArrayItems ( &meta, kNS1, "Array3-2", (kXMP_PropArrayIsOrdered | kXMPUtil_AllowCommas), tmpStr2 ); DumpXMPObj ( log, meta, "Set Array1, cat and split into others" ); SXMPUtils::SeparateArrayItems ( &meta, kNS1, "Array2-2", kXMP_NoOptions, tmpStr1.c_str() ); // Repeat into existing arrays. SXMPUtils::SeparateArrayItems ( &meta, kNS1, "Array3-2", kXMP_PropArrayIsOrdered, tmpStr2.c_str() ); } // -------------------------------------------------------------------------------------------- { WriteMajorLabel ( log, "Test RemoveProperties and AppendProperties" ); SXMPMeta meta1 ( kSimpleRDF, strlen(kSimpleRDF) ); meta1.SetProperty ( kNS2, "Prop", "value" ); DumpXMPObj ( log, meta1, "Parse simple RDF, add ns2:Prop" ); SXMPUtils::RemoveProperties ( &meta1, kNS1, "ArrayOfStructProp" ); DumpXMPObj ( log, meta1, "Remove ns1:ArrayOfStructProp" ); SXMPUtils::RemoveProperties ( &meta1, kNS1 ); DumpXMPObj ( log, meta1, "Remove all of ns1:" ); meta1.SetProperty ( kXMP_NS_XMP, "CreatorTool", "XMPCoverage" ); meta1.SetProperty ( kXMP_NS_XMP, "Nickname", "TXMP test" ); DumpXMPObj ( log, meta1, "Set xmp:CreatorTool (internal) and xmp:Nickname (external)" ); SXMPUtils::RemoveProperties ( &meta1 ); DumpXMPObj ( log, meta1, "Remove all external properties" ); SXMPUtils::RemoveProperties ( &meta1, 0, 0, kXMPUtil_DoAllProperties ); DumpXMPObj ( log, meta1, "Remove all properties, including internal" ); meta1.SetProperty ( kXMP_NS_XMP, "CreatorTool", "XMPCoverage" ); meta1.SetProperty ( kXMP_NS_XMP, "Nickname", "TXMP test" ); DumpXMPObj ( log, meta1, "Set xmp:CreatorTool and xmp:Nickname again" ); SXMPMeta meta2 ( kSimpleRDF, strlen(kSimpleRDF) ); meta2.SetProperty ( kXMP_NS_XMP, "CreatorTool", "new CreatorTool" ); meta2.SetProperty ( kXMP_NS_XMP, "Nickname", "new Nickname" ); meta2.SetProperty ( kXMP_NS_XMP, "Format", "new Format" ); DumpXMPObj ( log, meta2, "Create 2nd XMP object with new values" ); SXMPUtils::ApplyTemplate ( &meta1, meta2, kXMPTemplate_AddNewProperties ); DumpXMPObj ( log, meta1, "Append 2nd to 1st, keeping old values, external only" ); meta2.SetProperty ( kXMP_NS_XMP, "CreatorTool", "newer CreatorTool" ); meta2.SetProperty ( kXMP_NS_XMP, "Nickname", "newer Nickname" ); meta2.SetProperty ( kXMP_NS_XMP, "Format", "newer Format" ); SXMPUtils::ApplyTemplate ( &meta1, meta2, kXMPTemplate_AddNewProperties | kXMPTemplate_IncludeInternalProperties ); DumpXMPObj ( log, meta1, "Append 2nd to 1st, keeping old values, internal also" ); meta2.SetProperty ( kXMP_NS_XMP, "CreatorTool", "newest CreatorTool" ); meta2.SetProperty ( kXMP_NS_XMP, "Nickname", "newest Nickname" ); meta2.SetProperty ( kXMP_NS_XMP, "Format", "newest Format" ); SXMPUtils::ApplyTemplate ( &meta1, meta2, kXMPTemplate_AddNewProperties | kXMPTemplate_ReplaceExistingProperties ); DumpXMPObj ( log, meta1, "Append 2nd to 1st, replacing old values, external only" ); meta2.SetProperty ( kXMP_NS_XMP, "CreatorTool", "final CreatorTool" ); meta2.SetProperty ( kXMP_NS_XMP, "Nickname", "final Nickname" ); meta2.SetProperty ( kXMP_NS_XMP, "Format", "final Format" ); SXMPUtils::ApplyTemplate ( &meta1, meta2, kXMPTemplate_AddNewProperties | kXMPTemplate_ReplaceExistingProperties | kXMPTemplate_IncludeInternalProperties ); DumpXMPObj ( log, meta1, "Append 2nd to 1st, replacing old values, internal also" ); } // -------------------------------------------------------------------------------------------- { WriteMajorLabel ( log, "Test DuplicateSubtree" ); SXMPMeta meta1 ( kSimpleRDF, strlen(kSimpleRDF) ); SXMPMeta meta2; SXMPUtils::DuplicateSubtree ( meta1, &meta2, kNS1, "ArrayOfStructProp" ); DumpXMPObj ( log, meta2, "DuplicateSubtree to default destination" ); #if 1 // The underlying old toolkit does not support changing the schema namespace. SXMPUtils::DuplicateSubtree ( meta1, &meta2, kNS1, "ArrayOfStructProp", kNS2, "NewAoS" ); DumpXMPObj ( log, meta2, "DuplicateSubtree to different destination" ); SXMPUtils::DuplicateSubtree ( meta1, &meta1, kNS1, "ArrayOfStructProp", kNS2, "NewAoS" ); DumpXMPObj ( log, meta1, "DuplicateSubtree to different destination in same object" ); #else SXMPUtils::DuplicateSubtree ( meta1, &meta2, kNS1, "ArrayOfStructProp", kNS1, "NewAoS" ); DumpXMPObj ( log, meta2, "DuplicateSubtree to different destination" ); SXMPUtils::DuplicateSubtree ( meta1, &meta1, kNS1, "ArrayOfStructProp", kNS1, "NewAoS" ); DumpXMPObj ( log, meta1, "DuplicateSubtree to different destination in same object" ); #endif } // -------------------------------------------------------------------------------------------- { WriteMajorLabel ( log, "Test EncodeToBase64 and DecodeFromBase64" ); fprintf ( log, "\n" ); unsigned long m; #if UseStringPushBack #define PushBack(s,c) s.push_back ( c ) #else #define PushBack(s,c) s.insert ( s.end(), c ); #endif tmpStr1.erase(); for ( i = 0; i < 64; i += 4 ) { m = (i << 18) + ((i+1) << 12) + ((i+2) << 6) + (i+3); PushBack ( tmpStr1, ((char) (m >> 16)) ); PushBack ( tmpStr1, ((char) ((m >> 8) & 0xFF)) ); PushBack ( tmpStr1, ((char) (m & 0xFF)) ); } tmpStr2.erase(); SXMPUtils::EncodeToBase64 ( tmpStr1, &tmpStr2 ); fprintf ( log, "Encoded sequence (should be A-Za-z0-9+/) : %s\n", tmpStr2.c_str() ); tmpStr3.erase(); SXMPUtils::DecodeFromBase64 ( tmpStr2, &tmpStr3 ); if ( tmpStr1 != tmpStr3 ) fprintf ( log, "** Error in base 64 round trip\n" ); } // -------------------------------------------------------------------------------------------- WriteMajorLabel ( log, "XMPCoreCoverage done" ); fprintf ( log, "\n" ); } // DoXMPCoreCoverage // ================================================================================================= extern "C" int main ( int /*argc*/, const char * argv [] ) { int result = 0; char logName[256]; int nameLen = strlen ( argv[0] ); if ( (nameLen >= 4) && (strcmp ( argv[0]+nameLen-4, ".exe" ) == 0) ) nameLen -= 4; memcpy ( logName, argv[0], nameLen ); memcpy ( &logName[nameLen], "Log.txt", 8 ); // Include final null. FILE * log = fopen ( logName, "wb" ); time_t now = time(0); fprintf ( log, "XMPCoreCoverage starting %s", ctime(&now) ); XMP_VersionInfo version; SXMPMeta::GetVersionInfo ( &version ); fprintf ( log, "Version : %s\n" , version.message ); try { // *** Add memory leak checking for both DLL and static builds *** if ( ! SXMPMeta::Initialize() ) { fprintf ( log, "## XMPMeta::Initialize failed!\n" ); return -1; } DoXMPCoreCoverage ( log ); } catch ( XMP_Error & excep ) { fprintf ( log, "\nCaught XMP_Error %d : %s\n", excep.GetID(), excep.GetErrMsg() ); result = -2; } catch ( ... ) { fprintf ( log, "## Caught unknown exception\n" ); result = -3; } SXMPMeta::Terminate(); now = time(0); fprintf ( log, "XMPCoreCoverage finished %s", ctime(&now) ); fprintf ( log, "Final status = %d\n", result ); fclose ( log ); printf( "results have been logged into %s\n", logName ); return result; } exempi-2.2.1/samples/source/Makefile.am0000664000175000017500000000610612150230672014727 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # noinst_PROGRAMS = xmpcoverage xmpfilescoverage dumpxmp dumpmainxmp\ customschema \ modifyingxmp \ readingxmp \ xmpcommandtool \ $(NULL) AM_CXXFLAGS = -fexceptions -funsigned-char -fPIC \ -Wno-multichar -Wno-ctor-dtor-privacy AM_CPPFLAGS = -D@EXEMPI_PLATFORM_DEF@=1 -D_FILE_OFFSET_BITS=64 XMPLIBS = $(top_builddir)/source/XMPCore/libXMPCore.la \ $(top_builddir)/source/XMPFiles/libXMPFiles.la \ $(top_builddir)/source/common/libxmpcommon.la -lexpat -lz \ $(top_builddir)/third-party/MD5/libmd5.la INCLUDES = -I$(top_srcdir)/public/include -I$(srcdir)/common -I$(top_srcdir)/source/common -I$(top_srcdir)/source/XMPFiles/FormatSupport noinst_LTLIBRARIES = libsamplescommon.la libsamplescommon_la_SOURCES = common/DumpFile.cpp common/DumpFile.h \ common/Log.cpp common/Log.h \ common/TagTree.cpp common/TagTree.h \ common/globals.h \ $(NULL) customschema_SOURCES = CustomSchema.cpp customschema_LDADD = $(XMPLIBS) modifyingxmp_SOURCES = ModifyingXMP.cpp modifyingxmp_LDADD = $(XMPLIBS) readingxmp_SOURCES = ReadingXMP.cpp readingxmp_LDADD = $(XMPLIBS) xmpcoverage_SOURCES = XMPCoreCoverage.cpp xmpcoverage_LDADD = $(XMPLIBS) xmpfilescoverage_SOURCES = XMPFilesCoverage.cpp xmpfilescoverage_LDADD = $(XMPLIBS) dumpxmp_SOURCES = DumpScannedXMP.cpp dumpxmp_LDADD = $(XMPLIBS) dumpmainxmp_SOURCES = DumpMainXMP.cpp dumpmainxmp_LDADD = $(XMPLIBS) xmpcommandtool_SOURCES = xmpcommand/Actions.cpp xmpcommand/Actions.h \ xmpcommand/PrintUsage.cpp xmpcommand/PrintUsage.h \ xmpcommand/XMPCommand.cpp \ $(NULL) xmpcommandtool_LDADD = $(XMPLIBS) libsamplescommon.laexempi-2.2.1/samples/source/ReadingXMP.cpp0000664000175000017500000001377412150230672015346 00000000000000// ================================================================================================= // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= /** * Tutorial solution for the Walkthrough 1 in the XMP Programmers Guide, Opening files and reading XMP. * Demonstrates the basic use of the XMPFiles and XMPCore components, obtaining read-only XMP from a file * and examining it through the XMP object. */ #include // Must be defined to instantiate template classes #define TXMP_STRING_TYPE std::string // Must be defined to give access to XMPFiles #define XMP_INCLUDE_XMPFILES 1 // Ensure XMP templates are instantiated #include "XMP.incl_cpp" // Provide access to the API #include "XMP.hpp" #include #include using namespace std; /** * Client defined callback function to dump XMP to a file. In this case an output file stream is used * to write a buffer, of length bufferSize, to a text file. This callback is called multiple * times during the DumpObject() operation. See the XMP API reference for details of * XMP_TextOutputProc() callbacks. */ XMP_Status DumpXMPToFile(void * refCon, XMP_StringPtr buffer, XMP_StringLen bufferSize) { XMP_Status status = 0; try { ofstream * outFile = static_cast(refCon); (*outFile).write(buffer, bufferSize); } catch(XMP_Error & e) { cout << e.GetErrMsg() << endl; return -1; // Return a bad status } return status; } /** * Initializes the toolkit and attempts to open a file for reading metadata. Initially * an attempt to open the file is done with a handler, if this fails then the file is opened with * packet scanning. Once the file is open several properties are read and displayed in the console. * The XMP object is then dumped to a text file and the resource file is closed. */ int main ( int argc, const char * argv[] ) { if ( argc != 2 ) // 2 := command and 1 parameter { cout << "usage: ReadingXMP (filename)" << endl; return 0; } string filename = string( argv[1] ); if(!SXMPMeta::Initialize()) { cout << "Could not initialize toolkit!"; return -1; } XMP_OptionBits options = 0; #if UNIX_ENV options |= kXMPFiles_ServerMode; #endif // Must initialize SXMPFiles before we use it if ( ! SXMPFiles::Initialize ( options ) ) { cout << "Could not initialize SXMPFiles."; return -1; } try { // Options to open the file with - read only and use a file handler XMP_OptionBits opts = kXMPFiles_OpenForRead | kXMPFiles_OpenUseSmartHandler; bool ok; SXMPFiles myFile; std::string status = ""; // First we try and open the file ok = myFile.OpenFile(filename, kXMP_UnknownFile, opts); if( ! ok ) { status += "No smart handler available for " + filename + "\n"; status += "Trying packet scanning.\n"; // Now try using packet scanning opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUsePacketScanning; ok = myFile.OpenFile(filename, kXMP_UnknownFile, opts); } // If the file is open then read the metadata if(ok) { cout << status << endl; cout << filename << " is opened successfully" << endl; // Create the xmp object and get the xmp data SXMPMeta meta; myFile.GetXMP(&meta); bool exists; // Read a simple property string simpleValue; //Stores the value for the property exists = meta.GetProperty(kXMP_NS_XMP, "CreatorTool", &simpleValue, NULL); if(exists) cout << "CreatorTool = " << simpleValue << endl; else simpleValue.clear(); // Get the first element in the dc:creator array string elementValue; exists = meta.GetArrayItem(kXMP_NS_DC, "creator", 1, &elementValue, NULL); if(exists) cout << "dc:creator = " << elementValue << endl; else elementValue.clear(); // Get the the entire dc:subject array string propValue; int arrSize = meta.CountArrayItems(kXMP_NS_DC, "subject"); for(int i = 1; i <= arrSize;i++) { meta.GetArrayItem(kXMP_NS_DC, "subject", i, &propValue, 0); cout << "dc:subject[" << i << "] = " << propValue << endl; } // Get the dc:title for English and French string itemValue; string actualLang; meta.GetLocalizedText(kXMP_NS_DC, "title", "en", "en-US", NULL, &itemValue, NULL); cout << "dc:title in English = " << itemValue << endl; meta.GetLocalizedText(kXMP_NS_DC, "title", "fr", "fr-FR", NULL, &itemValue, NULL); cout << "dc:title in French = " << itemValue << endl; // Get dc:MetadataDate XMP_DateTime myDate; if(meta.GetProperty_Date(kXMP_NS_XMP, "MetadataDate", &myDate, NULL)) { // Convert the date struct into a convenient string and display it string myDateStr; SXMPUtils::ConvertFromDate(myDate, &myDateStr); cout << "meta:MetadataDate = " << myDateStr << endl; } // See if the flash struct exists and see if it was used string path, value; exists = meta.DoesStructFieldExist(kXMP_NS_EXIF, "Flash", kXMP_NS_EXIF,"Fired"); if(exists) { bool flashFired; SXMPUtils::ComposeStructFieldPath(kXMP_NS_EXIF, "Flash", kXMP_NS_EXIF, "Fired", &path); meta.GetProperty_Bool(kXMP_NS_EXIF, path.c_str(), &flashFired, NULL); string flash = (flashFired) ? "True" : "False"; cout << "Flash Used = " << flash << endl; } // Dump the current xmp object to a file ofstream dumpFile; dumpFile.open("XMPDump.txt", ios::out); meta.DumpObject(DumpXMPToFile, &dumpFile); dumpFile.close(); cout << endl << "XMP dumped to XMPDump.txt" << endl; // Close the SXMPFile. The resource file is already closed if it was // opened as read only but this call must still be made. myFile.CloseFile(); } else { cout << "Unable to open " << filename << endl; } } catch(XMP_Error & e) { cout << "ERROR: " << e.GetErrMsg() << endl; } // Terminate the toolkit SXMPFiles::Terminate(); SXMPMeta::Terminate(); return 0; } exempi-2.2.1/samples/Makefile.am0000664000175000017500000000311412144603625013430 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # SUBDIRS = source DIST_SUBDIRS = source testfiles exempi-2.2.1/install-sh0000755000175000017500000003253711657666561011765 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: exempi-2.2.1/ChangeLog0000664000175000017500000002317412144603625011512 000000000000002009-05-26 Hubert Figuiere * source/XMPFiles/FileHandlers/UCF_Handler.cpp (UCF_CheckFormat): Mismatched new [] / delete. (Closes bug #21934) 2009-05-15 Hubert Figuiere * exempi/exempi.cpp: Catch unhandled exceptions in xmp_files_can_put_xmp() (Closes bug #20622) 2009-03-11 Hubert Figuiere * configure.ac: * exempi/Makefile.am: * m4/ax_ld_check_flag.m4: Detect proper ldflags. (Closes bug #20554) * configure.ac: Bump to version 2.1.1 2009-03-11 Lars Holm Nielsen * source/XMPFiles/FileHandlers/Makefile.am: * source/XMPFiles/FormatSupport/Makefile.am: * configure.ac: Some files missing when building on Mac (Closes bug #20554) 2009-02-24 Hubert Figuiere * exempi/exempi.cpp (xmp_set_property): If the value is struct or array, if the property value is the empty string pass NULL. (Closes bug #16030) 2009-02-22 Hubert Figuiere * source/common/XMLParserAdapter.hpp: Remove an annoying warning. 2009-02-20 Hubert Figuiere * configure.in: * m4/shave.m4: * shave-libtool.in: * shave.in: Add shave to make the build output saner. 2008-12-28 Michael Biebl * tests/utils.cpp * samples/source/XMPFilesCoverage.cpp * source/common/XML_Node.cpp Fix build on gcc 4.4 2008-12-24 Hubert Figuiere * source/XMPFiles/FileHandlers/P2_Handler.cpp (SetStartTimecodeFromLegacyXML): Don't compare string pointers. (Closes: #19312) === 2.1.0 === 2008-12-24 Hubert Figuiere * exempi/tests/test-bgo.cpp * exempi/tests/test-xmpfiles.cpp Remove serious warnings. 2008-12-21 Hubert Figuiere * exempi/tests/Makefile.am * exempi/tests/test-bgo.cpp * exempi/tests/test-exempi-core.cpp * exempi/tests/test-serialise.cpp * exempi/tests/test-tiff-leak.cpp * exempi/tests/test-write-new-prop.cpp * exempi/tests/test-xmpfiles-write.cpp * exempi/tests/test-xmpfiles.cpp * exempi/tests/test3.cpp * exempi/tests/testinit.cpp Migrated to use boost/test/minimal * exempi/tests/test1.cpp * exempi/tests/test2.cpp Split out for the above change. 2008-12-19 Hubert Figuiere * exempi/Makefile.am (EXTRA_DIST): Added libexempi.sym 2008-11-26 Hubert Figuiere * exempi/tests/Makefile.am (TESTS_ENVIRONMENT): BOOST_TEST_CATCH_SYSTEM_ERRORS=no is set before running the test. This avoid a failure because of system() on boost 1.35 and later. See https://svn.boost.org/trac/boost/ticket/1723 2008-11-24 Hubert Figuiere * source/XMPFiles/FormatSupport/ReconcileTIFF.cpp (ImportSingleTIFF_ASCII): Re-enable the conversion for UNIX. Disabled in the original SDK. * exempi/tests/Makefile.am: * exempi/tests/fdo18635.jpg: * exempi/tests/test-bgo.cpp Don't crash on not so valid Exif. (Closes #18635) And test case. 2008-11-18 Hubert Figuiere * exempi/libexempi.sym, exempi/Makefile.am (libexempi_la_LDFLAGS): Use symbol file. (Closes #16139) * samples/testfiles/BlueSquare.gif, samples/testfiles/Makefile.am: Forgotten files. * NEWS, configure.ac, exempi/Makefile.am, exempi/tests/test2.cpp, exempi/tests/testcore.sh, samples/Makefile.am, samples/source/Makefile.am, source/XMPFiles/FileHandlers/Makefile.am, source/XMPFiles/FormatSupport/Makefile.am, source/XMPCore/Makefile.am, source/common/Makefile.am: Fix the build system. * source/XMPFiles/FileHandlers/AVCHD_Handler.cpp source/XMPFiles/FileHandlers/MP3_Handler.cpp, source/XMPFiles/FileHandlers/MP3_Handler.hpp, source/XMPFiles/FileHandlers/P2_Handler.cpp, source/XMPFiles/FileHandlers/SonyHDV_Handler.cpp, source/XMPFiles/FileHandlers/WAV_Handler.cpp, source/XMPFiles/FileHandlers/WAV_Handler.hpp, source/XMPFiles/FileHandlers/XDCAMEX_Handler.cpp, source/XMPFiles/FileHandlers/XDCAM_Handler.cpp, source/XMPFiles/FormatSupport/ID3_Support.cpp, source/XMPFiles/FormatSupport/ID3_Support.hpp, source/XMPFiles/FormatSupport/RIFF_Support.cpp, source/XMPFiles/FormatSupport/RIFF_Support.hpp, source/XMPFiles/FormatSupport/ReconcileTIFF.cpp, source/XMPFiles/FormatSupport/Reconcile_Impl.cpp, source/XMPFiles/FormatSupport/Reconcile_Impl.hpp, source/XMPFiles/FormatSupport/TIFF_Support.hpp: Enable all the file formats that Adobe disabled on purpose. * samples/source/ModifyingXMP.cpp, source/common/EndianUtils.hpp, source/common/LargeFileAccess.hpp, source/common/XML_Node.cpp: Other misc merge fixes. * Merge the XPM SDK 4.4.2 2008-05-29 Hubert Figuiere * exempi/exempi.cpp, exempi/Makefile.am: don't define UNIX_ENV in the source code but use the CPPFLAGS. * exempi/exempi.cpp (xmp_files_get_xmp): CHECK_PTR should return false and not NULL. 2008-04-06 Hubert Figuiere * exempi/xmp.h, exempi/exempi.cpp: add new API xmp_namespace_prefix(), xmp_prefix_namespace_uri(). * exempi/tests/test1.cpp: corresponding test. (Closes #14962) 2008-04-04 Hubert Figuiere * Start 2.1.0 === 2.0.2 === 2008-08-12 Hubert Figuiere * exempi/exempi.cpp (set_error): Use pthread for the TLS if there is no compiler support. (Closes #16598) * configure.ac: * m4/ax_tls.m4: Check for TLS. === 2.0.1 === 2008-04-28 Hubert Figuiere * exempi/tests/test1.cpp: Check that errors are unset. 2008-04-24 Hubert Figuiere * exempi/exempi.cpp: RESET_ERROR is called upon entry of any functions. error code is local thread storage. 2008-04-05 Hubert Figuiere * source/XMPFiles/FormatSupport/Reconcile_Impl.cpp, configure.ac: Check for iconv constness. (Closes #14613) 2008-04-04 Hubert Figuiere * exempi/xmp.h: no stdbool.h on Sun compilers (Closes #14612) === 2.0.0 === 2008-04-01 Hubert Figuiere * configure.ac: This is really 2.0.0 * exempi/tests/test1.cpp, exempi/tests/test1.xmp: Add a test on "Rating:". 2008-03-30 Hubert Figuiere * source/XMPFiles/FormatSupport/EndianUtils.hpp, configure.ac: Fix the endian detection. (Closes #15263) 2008-02-22 Hubert Figuiere * source/XMPCore/XMPMeta.cpp, source/XMPFiles/FormatSupport/GIF_Support.cpp, source/XMPFiles/FormatSupport/ID3_Support.cpp, source/XMPFiles/FormatSupport/PNG_Support.cpp, source/XMPFiles/FormatSupport/PSIR_FileWriter.cpp, source/XMPFiles/FormatSupport/PSIR_MemoryReader.cpp, source/XMPFiles/FormatSupport/ReconcileIPTC.cpp, source/XMPFiles/FormatSupport/TIFF_Support.hpp: Add some missing includes. (Closes #14615) * source/XMPFiles/FormatSupport/EndianUtils.hpp: endian detection on Solaris. (Closes #14614) === 1.99.9 === 2008-01-30 Hubert Figuiere * exempi/xmp.h (XMP_OPEN_OPNLYXMP): Bad API breakage fix (introduced in 1.99.8) === 1.99.8 === 2008-01-23 Hubert Figuiere * source/XMPFiles/FormatSupport/GIF_Support.cpp (ReadHeader): Fix a nasty buffer overflow. Closes Debian #454297. Closes Gnome #484105 Patch by Michael Biebl (ReadBlock): Fix another possible overflow similar to the one in ReadHeader() 2008-01-22 Hubert Figuiere * exempi/xmp.h: Fix a typo. (Closes #14200) 2008-01-18 Hubert Figuiere * source/XMPFiles/Makefile.am: Disable strict aliasing. This fix some nasty warning. 2008-01-13 Hubert Figuiere * configure.ac: Allow disabling unittest if you don't have boost (Closes #13712) * autogen.sh: Don't run autoheader. (Closes #14049) * autogen.sh: re-order commands in autogens.sh === 1.99.7 === 2008-01-12 Hubert Figuiere * configure.ac: Fix the soversion. A mix-up occured in the last release. === 1.99.6 === 2008-01-11 Hubert Figuiere * exempi/tests/test2.cpp (test_tiff_leak): Ensure that the file is writable. 2007-12-22 Hubert Figuiere * configure.ac: make boost optional as it is only for the unit tests. (Closes #13712) * configure.ac, m4/boost.m4, exempi/test/Makefile.am: Change the BOOST detection macros. (Closes #13713) 2007-12-20 Hubert Figuiere * source/XMPCore/XMPUtils.cpp (ConvertFromInt64): Fix format for long long int that was causing a failure on ppc (big endian). 2007-12-19 Hubert Figuiere * exempi/exempi.cpp, exempi/tests/test1.cpp, exempi/tests/test1.xmp, exempi/xmp.h: Add setter/getter for int32, int64, bool, float. * exempi/xmpconsts.h, exempi/exempi.cpp: add ACR schema namespace * public/include/TXMPMeta.hpp, public/include/client-glue/TXMPMeta.incl_cpp, samples/source/XMPCoreCoverage.cpp, source/XMPFiles/FormatSupport/ReconcileTIFF.cpp: Some APIs use long and long long. Change that. * source/XMPFiles/FormatSupport/TIFF_FileWriter.cpp, exempi/tests/*: Fix a memory leak. See http://www.adobeforums.com/webx/.3bc42b73 And test case. * exempi/tests/*, configure.ac: detect valgrind. Add leak detection support. 2007-12-17 Hubert Figuiere * autogen.sh: added for convenience for non-tarball builders. (Closes #13707) 2007-12-16 Hubert Figuiere * exempi/*: added new API for get/set datetime. * exempi/tests/*: refactor the test preparation. 2007-11-13 Hubert Figuiere * exempi/tests/*.c: Add a bunch of include deemed necessary by suse factory. * Add a bunch of include deemed necessary by suse factory. 2007-11-08 Hubert Figuiere * source/XMPFiles/FormatSupport/Makefile.am: add -Wno-multichar to remove warnings. QuickTime_Support.cpp is in the dist as a noinst_HEADER exempi-2.2.1/configure0000775000175000017500000215430012150231003011625 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for exempi 2.2.1. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='exempi' PACKAGE_TARNAME='exempi' PACKAGE_VERSION='2.2.1' PACKAGE_STRING='exempi 2.2.1' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS VALGRIND WITH_UNIT_TEST_FALSE WITH_UNIT_TEST_TRUE EXEMPI_PLATFORM_DEF BOOST_UNIT_TEST_FRAMEWORK_LIBS BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS BOOST_CPPFLAGS DISTCHECK_CONFIGURE_FLAGS HAVE_SYMBOLS_FILE_FALSE HAVE_SYMBOLS_FILE_TRUE CXXCPP CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC pkgconfigdir EXEMPI_INCLUDE_BASE EXEMPI_MAJOR_VERSION EXEMPI_VERSION_INFO EXEMPI_CURRENT_MIN EXEMPI_CURRENT EXEMPI_AGE EXEMPI_REVISION AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_maintainer_mode enable_silent_rules enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock with_darwinports with_fink enable_unittest with_boost ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures exempi 2.2.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/exempi] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of exempi 2.2.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-unittest=yes|no enable the unittest. requires boost (default is yes) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-darwinports add /opt/local/... to CPP/LDFLAGS (Mac OSX) --with-fink add /sw/... to CPP/LDFLAGS (Mac OSX) --with-boost=DIR prefix of Boost version >= 1.33.0 [guess] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF exempi configure 2.2.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by exempi $as_me 2.2.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.12' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='exempi' VERSION='2.2.1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' EXEMPI_REVISION=3 EXEMPI_AGE=2 EXEMPI_CURRENT=5 EXEMPI_CURRENT_MIN=`expr $EXEMPI_CURRENT - $EXEMPI_AGE` EXEMPI_VERSION_INFO=$EXEMPI_CURRENT:$EXEMPI_REVISION:$EXEMPI_AGE EXEMPI_MAJOR_VERSION=2.0 EXEMPI_INCLUDE_BASE=exempi-$EXEMPI_MAJOR_VERSION pkgconfigdir='${libdir}/pkgconfig' ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac $as_echo "#define CHECKED_ENDIANNESS 1" >>confdefs.h # Check whether --with-darwinports was given. if test "${with_darwinports+set}" = set; then : withval=$with_darwinports; if test "x$withval" != "xno"; then CPPFLAGS="$CPPFLAGS -I/opt/local/include" LDFLAGS="$LDFLAGS -L/opt/local/lib" CC=g++ fi fi # Check whether --with-fink was given. if test "${with_fink+set}" = set; then : withval=$with_fink; if test "x$withval" != "xno"; then CPPFLAGS="$CPPFLAGS -I/sw/include" LDFLAGS="$LDFLAGS -L/sw/lib" CC=g++ fi fi ac_fn_c_check_header_mongrel "$LINENO" "expat.h" "ac_cv_header_expat_h" "$ac_includes_default" if test "x$ac_cv_header_expat_h" = xyes; then : else as_fn_error $? "expat headers missing" "$LINENO" 5 fi ac_fn_c_check_header_mongrel "$LINENO" "iconv.h" "ac_cv_header_iconv_h" "$ac_includes_default" if test "x$ac_cv_header_iconv_h" = xyes; then : else as_fn_error $? "iconv headers missing" "$LINENO" 5 fi ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : else as_fn_error $? "zlib headers missing" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 $as_echo_n "checking for iconv declaration... " >&6; } if ${am_cv_proto_iconv+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_cv_proto_iconv_arg1="" else am_cv_proto_iconv_arg1="const" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" fi am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_t:- }$am_cv_proto_iconv" >&5 $as_echo "${ac_t:- }$am_cv_proto_iconv" >&6; } cat >>confdefs.h <<_ACEOF #define ICONV_CONST $am_cv_proto_iconv_arg1 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thread local storage (TLS) class" >&5 $as_echo_n "checking for thread local storage (TLS) class... " >&6; } if ${ac_cv_tls+:} false; then : $as_echo_n "(cached) " >&6 else ax_tls_keywords="__thread __declspec(thread) none" for ax_tls_keyword in $ax_tls_keywords; do case $ax_tls_keyword in none) ac_cv_tls=none ; break ;; *) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include static void foo(void) { static $ax_tls_keyword int bar; exit(1); } int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_tls=$ax_tls_keyword ; break else ac_cv_tls=none fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext esac done fi if test "$ac_cv_tls" != "none"; then cat >>confdefs.h <<_ACEOF #define TLS $ac_cv_tls _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5 $as_echo "$ac_cv_tls" >&6; } if test "$ac_cv_tls" != "none"; then $as_echo "#define HAVE_NATIVE_TLS 1" >>confdefs.h fi cat >> _ac_foo.sym << _ACEOF foo _ACEOF flag=`echo "-Wl,--retain-symbols-file=_ac_foo.sym" | $SED 'y% .=/+-(){}<>:*,%_______________%'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts the -Wl,--retain-symbols-file=_ac_foo.sym flag" >&5 $as_echo_n "checking whether the linker accepts the -Wl,--retain-symbols-file=_ac_foo.sym flag... " >&6; } if eval \${ax_cv_ld_check_flag_$flag+:} false; then : $as_echo_n "(cached) " >&6 else #AC_LANG_PUSH([C]) save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -Wl,--retain-symbols-file=_ac_foo.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "ax_cv_ld_check_flag_$flag=yes" else eval "ax_cv_ld_check_flag_$flag=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" #AC_LANG_POP fi eval ac_res=\$ax_cv_ld_check_flag_$flag { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval "test \"`echo '$ax_cv_ld_check_flag_'$flag`\" = yes"; then : : cv_support_symfile=yes else : cv_support_symfile=no fi rm -f _ac_foo.sym if test x$cv_support_symfile = "xyes"; then HAVE_SYMBOLS_FILE_TRUE= HAVE_SYMBOLS_FILE_FALSE='#' else HAVE_SYMBOLS_FILE_TRUE='#' HAVE_SYMBOLS_FILE_FALSE= fi # Check whether --enable-unittest was given. if test "${enable_unittest+set}" = set; then : enableval=$enable_unittest; ENABLE_UNITTEST=$enableval else ENABLE_UNITTEST=yes fi if test x$ENABLE_UNITTEST = xyes ; then boost_version_major=1 boost_version_minor=33 boost_version_subminor=0 # Check whether --with-boost was given. if test "${with_boost+set}" = set; then : withval=$with_boost; fi DISTCHECK_CONFIGURE_FLAGS="$DISTCHECK_CONFIGURE_FLAGS '--with-boost=$with_boost'" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boost headers version >= 1.33.0" >&5 $as_echo_n "checking for Boost headers version >= 1.33.0... " >&6; } if ${boost_cv_inc_path+:} false; then : $as_echo_n "(cached) " >&6 else boost_cv_inc_path=no ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_subminor_chk= test x"$boost_version_subminor" != x \ && boost_subminor_chk="|| (B_V_MAJ == $boost_version_major \ && B_V_MIN == $boost_version_minor \ && B_V_SUB < $boost_version_subminor)" for boost_inc in "$with_boost/include" '' \ /opt/local/include /usr/local/include /opt/include /usr/include \ "$with_boost" C:/Boost/include do test -e "$boost_inc" || continue # Ensure that version.hpp exists: we're going to read it. Moreover, # Boost could be reachable thanks to the default include path so we can # mistakenly accept a wrong include path without this check. test -e "$boost_inc/boost/version.hpp" || continue boost_save_CPPFLAGS=$CPPFLAGS test x"$boost_inc" != x && CPPFLAGS="$CPPFLAGS -I$boost_inc" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef BOOST_VERSION # error BOOST_VERSION is not defined #endif #define B_V_MAJ (BOOST_VERSION / 100000) #define B_V_MIN (BOOST_VERSION / 100 % 1000) #define B_V_SUB (BOOST_VERSION % 100) #if (B_V_MAJ < $boost_version_major) \ || (B_V_MAJ == $boost_version_major \ && B_V_MIN < $boost_version_minor) $boost_subminor_chk # error Boost headers version < 1.33.0 #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : boost_cv_inc_path=yes else boost_cv_version=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS=$boost_save_CPPFLAGS if test x"$boost_cv_inc_path" = xyes; then if test x"$boost_inc" != x; then boost_cv_inc_path=$boost_inc fi break fi done ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boost_cv_inc_path" >&5 $as_echo "$boost_cv_inc_path" >&6; } case $boost_cv_inc_path in #( no) as_fn_error $? "Could not find Boost headers version >= 1.33.0" "$LINENO" 5 ;;#( yes) BOOST_CPPFLAGS= ;;#( *) BOOST_CPPFLAGS="-I$boost_cv_inc_path" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boost's header version" >&5 $as_echo_n "checking for Boost's header version... " >&6; } if ${boost_cv_lib_version+:} false; then : $as_echo_n "(cached) " >&6 else boost_cv_lib_version=unknown boost_sed_version='/^.*BOOST_LIB_VERSION.*"\([^"]*\)".*$/!d;s//\1/' boost_version_hpp="$boost_inc/boost/version.hpp" test -e "$boost_version_hpp" \ && boost_cv_lib_version=`sed "$boost_sed_version" "$boost_version_hpp"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_version" >&5 $as_echo "$boost_cv_lib_version" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the toolset name used by Boost for $CXX" >&5 $as_echo_n "checking for the toolset name used by Boost for $CXX... " >&6; } if ${boost_cv_lib_tag+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_cv_lib_tag=unknown # The following tests are mostly inspired by boost/config/auto_link.hpp # The list is sorted to most recent/common to oldest compiler (in order # to increase the likelihood of finding the right compiler with the # least number of compilation attempt). # Beware that some tests are sensible to the order (for instance, we must # look for MinGW before looking for GCC3). # I used one compilation test per compiler with a #error to recognize # each compiler so that it works even when cross-compiling (let me know # if you know a better approach). # Known missing tags (known from Boost's tools/build/v2/tools/common.jam): # como, edg, kcc, bck, mp, sw, tru, xlc # I'm not sure about my test for `il' (be careful: Intel's ICC pre-defines # the same defines as GCC's). # TODO: Move the test on GCC 4.3 up once it's released. for i in \ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && !defined __ICC @ gcc42" \ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 1 && !defined __ICC @ gcc41" \ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 0 && !defined __ICC @ gcc40" \ "defined __GNUC__ && __GNUC__ == 3 && !defined __ICC \ && (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw" \ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 4 && !defined __ICC @ gcc34" \ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 3 && !defined __ICC @ gcc33" \ "defined _MSC_VER && _MSC_VER >= 1400 @ vc80" \ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 2 && !defined __ICC @ gcc32" \ "defined _MSC_VER && _MSC_VER == 1310 @ vc71" \ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 1 && !defined __ICC @ gcc31" \ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 0 && !defined __ICC @ gcc30" \ "defined __BORLANDC__ @ bcb" \ "defined __ICC && (defined __unix || defined ) @ il" \ "defined __ICL @ iw" \ "defined _MSC_VER && _MSC_VER == 1300 @ vc7" \ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 3 && !defined __ICC @ gcc43" \ "defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ == 95 && !defined __ICC @ gcc295" \ "defined __MWERKS__ && __MWERKS__ <= 0x32FF @ cw9" \ "defined _MSC_VER && _MSC_VER < 1300 && !defined UNDER_CE @ vc6" \ "defined _MSC_VER && _MSC_VER < 1300 && defined UNDER_CE @ evc4" \ "defined __MWERKS__ && __MWERKS__ <= 0x31FF @ cw8" do boost_tag_test=`expr "X$i" : 'X\([^@]*\) @ '` boost_tag=`expr "X$i" : 'X[^@]* @ \(.*\)'` cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if $boost_tag_test /* OK */ #else # error $boost_tag_test #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : boost_cv_lib_tag=$boost_tag; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_tag" >&5 $as_echo "$boost_cv_lib_tag" >&6; } if test x"$boost_cv_lib_tag" = xunknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not figure out which toolset name to use for $CXX" >&5 $as_echo "$as_me: WARNING: could not figure out which toolset name to use for $CXX" >&2;} boost_cv_lib_tag= fi # Check whether we do better use `mt' even though we weren't ask to. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined _REENTRANT || defined _MT || defined __MT__ /* use -mt */ #else # error MT not needed #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : boost_guess_use_mt=: else boost_guess_use_mt=false fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/test/unit_test.hpp" "ac_cv_header_boost_test_unit_test_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_test_unit_test_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_TEST_UNIT_TEST_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/test/unit_test.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" # Now let's try to find the library. The algorithm is as follows: first look # for a given library name according to the user's PREFERRED-RT-OPT. For each # library name, we prefer to use the ones that carry the tag (toolset name). # Each library is searched through the various standard paths were Boost is # usually installed. If we can't find the standard variants, we try to # enforce -mt (for instance on MacOSX, libboost_threads.dylib doesn't exist # but there's -obviously- libboost_threads-mt.dylib). { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the Boost unit_test_framework library" >&5 $as_echo_n "checking for the Boost unit_test_framework library... " >&6; } if ${boost_cv_lib_unit_test_framework+:} false; then : $as_echo_n "(cached) " >&6 else boost_cv_lib_unit_test_framework=no case "mt-s" in #( mt | mt-) boost_mt=-mt; boost_rtopt=;; #( mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "Xmt-s" : 'Xmt-*\(.*\)'`;; #( *) boost_mt=; boost_rtopt=mt-s;; esac # If the PREFERRED-RT-OPT are not empty, prepend a `-'. case $boost_rtopt in #( *[a-z0-9A-Z]*) boost_rtopt="-$boost_rtopt";; esac $boost_guess_use_mt && boost_mt=-mt # Look for the abs path the static archive. # $libext is computed by Libtool but let's make sure it's non empty. test -z "$libext" && as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5 boost_save_ac_objext=$ac_objext # Generate the test file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include using boost::unit_test::test_suite; test_suite* init_unit_test_suite( int argc, char ** argv ) { return NULL;} int main () { BOOST_CHECK(2==2); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_objext=do_not_rm_me_plz else as_fn_error $? "Cannot compile a test that uses Boost unit_test_framework" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext ac_objext=$boost_save_ac_objext boost_failed_libs= # Don't bother to ident the 6 nested for loops, only the 2 innermost ones # matter. for boost_tag_ in -$boost_cv_lib_tag ''; do for boost_ver_ in -$boost_cv_lib_version ''; do for boost_mt_ in $boost_mt -mt ''; do for boost_rtopt_ in $boost_rtopt '' -d; do for boost_lib in \ boost_unit_test_framework$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \ boost_unit_test_framework$boost_tag_$boost_mt_$boost_ver_ \ boost_unit_test_framework$boost_tag_$boost_rtopt_$boost_ver_ \ boost_unit_test_framework$boost_tag_$boost_mt_ \ boost_unit_test_framework$boost_tag_$boost_ver_ do # Avoid testing twice the same lib case $boost_failed_libs in #( *@$boost_lib@*) continue;; esac # If with_boost is empty, we'll search in /lib first, which is not quite # right so instead we'll try to a location based on where the headers are. boost_tmp_lib=$with_boost test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include} for boost_ldpath in "$boost_tmp_lib/lib" '' \ /opt/local/lib /usr/local/lib /opt/lib /usr/lib \ "$with_boost" C:/Boost/lib /lib /usr/lib64 /lib64 do test -e "$boost_ldpath" || continue boost_save_LDFLAGS=$LDFLAGS # Are we looking for a static library? case $boost_ldpath:$boost_rtopt_ in #( *?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt) boost_cv_lib_unit_test_framework_LIBS="$boost_ldpath/lib$boost_lib.$libext" test -e "$boost_cv_lib_unit_test_framework_LIBS" || continue;; #( *) # No: use -lboost_foo to find the shared library. boost_cv_lib_unit_test_framework_LIBS="-l$boost_lib";; esac boost_save_LIBS=$LIBS LIBS="$boost_cv_lib_unit_test_framework_LIBS $LIBS" test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath" rm -f conftest$ac_exeext boost_ac_ext_save=$ac_ext boost_use_source=: # If we already have a .o, re-use it. We change $ac_ext so that $ac_link # tries to link the existing object file instead of compiling from source. test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false && $as_echo "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5 if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_executable_p conftest$ac_exeext }; then : boost_cv_lib_unit_test_framework=yes else if $boost_use_source; then $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi boost_cv_lib_unit_test_framework=no fi rm -f core conftest.err conftest_ipa8_conftest.oo \ conftest$ac_exeext ac_objext=$boost_save_ac_objext LDFLAGS=$boost_save_LDFLAGS LIBS=$boost_save_LIBS if test x"$boost_cv_lib_unit_test_framework" = xyes; then boost_cv_lib_unit_test_framework_LDFLAGS="-L$boost_ldpath -R$boost_ldpath" break 6 else boost_failed_libs="$boost_failed_libs@$boost_lib@" fi done done done done done done rm -f conftest.$ac_objext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_unit_test_framework" >&5 $as_echo "$boost_cv_lib_unit_test_framework" >&6; } case $boost_cv_lib_unit_test_framework in #( no) as_fn_error $? "Could not find the flags to link with Boost unit_test_framework" "$LINENO" 5 ;; esac BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS=$boost_cv_lib_unit_test_framework_LDFLAGS BOOST_UNIT_TEST_FRAMEWORK_LIBS=$boost_cv_lib_unit_test_framework_LIBS CPPFLAGS=$boost_save_CPPFLAGS ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else ENABLE_UNITTEST=no fi case $build_vendor in apple) EXEMPI_PLATFORM_DEF=MAC_ENV LDFLAGS="$LDFLAGS -framework CoreServices" ;; *) EXEMPI_PLATFORM_DEF=UNIX_ENV ;; esac if test x$ENABLE_UNITTEST = xyes; then WITH_UNIT_TEST_TRUE= WITH_UNIT_TEST_FALSE='#' else WITH_UNIT_TEST_TRUE='#' WITH_UNIT_TEST_FALSE= fi # Extract the first word of "valgrind", so it can be a program name with args. set dummy valgrind; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_VALGRIND+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$VALGRIND"; then ac_cv_prog_VALGRIND="$VALGRIND" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_VALGRIND="valgrind" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi VALGRIND=$ac_cv_prog_VALGRIND if test -n "$VALGRIND"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VALGRIND" >&5 $as_echo "$VALGRIND" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi for ac_header in valgrind/memcheck.h do : ac_fn_c_check_header_mongrel "$LINENO" "valgrind/memcheck.h" "ac_cv_header_valgrind_memcheck_h" "$ac_includes_default" if test "x$ac_cv_header_valgrind_memcheck_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VALGRIND_MEMCHECK_H 1 _ACEOF fi done if test "$VALGRIND" = ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Valgrind is missing. checks will run without" >&5 $as_echo "$as_me: WARNING: Valgrind is missing. checks will run without" >&2;} fi if test "$VALGRIND" != ""; then vg_ver=`valgrind --version | sed -e 's/.*-\([0-9]\)\.[0-9].*/\1/'` VALGRIND="$VALGRIND --tool=memcheck --leak-check=yes --num-callers=10" if test "$vg_ver" != "3" ; then VALGRIND="$VALGRIND --logfile-fd=-1" fi fi ac_config_files="$ac_config_files Makefile third-party/Makefile third-party/MD5/Makefile source/Makefile source/common/Makefile source/XMPCore/Makefile source/XMPFiles/Makefile source/XMPFiles/FileHandlers/Makefile source/XMPFiles/FormatSupport/Makefile samples/Makefile samples/source/Makefile samples/testfiles/Makefile build/Makefile public/Makefile public/include/Makefile public/include/client-glue/Makefile exempi/Makefile exempi/doc/Makefile exempi/doc/Doxyfile exempi/tests/Makefile exempi/exempi-2.0.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_SYMBOLS_FILE_TRUE}" && test -z "${HAVE_SYMBOLS_FILE_FALSE}"; then as_fn_error $? "conditional \"HAVE_SYMBOLS_FILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_UNIT_TEST_TRUE}" && test -z "${WITH_UNIT_TEST_FALSE}"; then as_fn_error $? "conditional \"WITH_UNIT_TEST\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by exempi $as_me 2.2.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ exempi config.status 2.2.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "third-party/Makefile") CONFIG_FILES="$CONFIG_FILES third-party/Makefile" ;; "third-party/MD5/Makefile") CONFIG_FILES="$CONFIG_FILES third-party/MD5/Makefile" ;; "source/Makefile") CONFIG_FILES="$CONFIG_FILES source/Makefile" ;; "source/common/Makefile") CONFIG_FILES="$CONFIG_FILES source/common/Makefile" ;; "source/XMPCore/Makefile") CONFIG_FILES="$CONFIG_FILES source/XMPCore/Makefile" ;; "source/XMPFiles/Makefile") CONFIG_FILES="$CONFIG_FILES source/XMPFiles/Makefile" ;; "source/XMPFiles/FileHandlers/Makefile") CONFIG_FILES="$CONFIG_FILES source/XMPFiles/FileHandlers/Makefile" ;; "source/XMPFiles/FormatSupport/Makefile") CONFIG_FILES="$CONFIG_FILES source/XMPFiles/FormatSupport/Makefile" ;; "samples/Makefile") CONFIG_FILES="$CONFIG_FILES samples/Makefile" ;; "samples/source/Makefile") CONFIG_FILES="$CONFIG_FILES samples/source/Makefile" ;; "samples/testfiles/Makefile") CONFIG_FILES="$CONFIG_FILES samples/testfiles/Makefile" ;; "build/Makefile") CONFIG_FILES="$CONFIG_FILES build/Makefile" ;; "public/Makefile") CONFIG_FILES="$CONFIG_FILES public/Makefile" ;; "public/include/Makefile") CONFIG_FILES="$CONFIG_FILES public/include/Makefile" ;; "public/include/client-glue/Makefile") CONFIG_FILES="$CONFIG_FILES public/include/client-glue/Makefile" ;; "exempi/Makefile") CONFIG_FILES="$CONFIG_FILES exempi/Makefile" ;; "exempi/doc/Makefile") CONFIG_FILES="$CONFIG_FILES exempi/doc/Makefile" ;; "exempi/doc/Doxyfile") CONFIG_FILES="$CONFIG_FILES exempi/doc/Doxyfile" ;; "exempi/tests/Makefile") CONFIG_FILES="$CONFIG_FILES exempi/tests/Makefile" ;; "exempi/exempi-2.0.pc") CONFIG_FILES="$CONFIG_FILES exempi/exempi-2.0.pc" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo " Defines: EXEMPI_PLATFORM_DEF = $EXEMPI_PLATFORM_DEF CPPFLAGS = $CPPFLAGS LDFLAGS = $LDFLAGS Thread Local Storage = $ac_cv_tls Run unit test = $ENABLE_UNITTEST " exempi-2.2.1/AUTHORS0000664000175000017500000000037712150232562011003 00000000000000The package is based on Adobe XMP SDK 4.1.1. Maintainer: Hubert Figuiere Original XMP code by: Adobe Systems Incorporated (XMP SDK) Contributions by: Ian Jacobi Jason Kivlighn Michael Biebl Tim Mooney Misty De Meo exempi-2.2.1/third-party/0000775000175000017500000000000012163706252012261 500000000000000exempi-2.2.1/third-party/MD5/0000775000175000017500000000000012163706252012646 500000000000000exempi-2.2.1/third-party/MD5/MD5.h0000664000175000017500000000326212150230673013322 00000000000000#ifndef __MD5_h__ #define __MD5_h__ /******************************************************************************/ /* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. License to copy and use this software is granted provided that it is identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing this software or this function. License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing the derived work. RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this documentation and/or software. */ /******************************************************************************/ #include "XMP_Const.h" // For safe fixed integer sizes. /* MD5 context. */ struct MD5_CTX { XMP_Uns32 state[4]; /* state (ABCD) */ XMP_Uns32 count[2]; /* number of bits, modulo 2^64 (lsb first) */ XMP_Uns8 buffer[64]; /* input buffer */ }; extern void MD5Init (MD5_CTX *); extern void MD5Update (MD5_CTX *, XMP_Uns8 *, XMP_Uns32); extern void MD5Final(XMP_Uns8 [16], MD5_CTX *); /******************************************************************************/ #endif exempi-2.2.1/third-party/MD5/Makefile.in0000664000175000017500000004641312150231002014621 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = third-party/MD5 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmd5_la_LIBADD = am_libmd5_la_OBJECTS = MD5.lo libmd5_la_OBJECTS = $(am_libmd5_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libmd5_la_SOURCES) DIST_SOURCES = $(libmd5_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ INCLUDES = -I$(top_srcdir)/public/include \ -I$(top_srcdir)/public/include/client-glue \ -I$(top_srcdir)/build/ \ -I$(top_srcdir)/source/common/ \ -I$(top_srcdir)/third-party/MD5 AM_CXXFLAGS = -Wno-multichar -Wno-ctor-dtor-privacy \ -funsigned-char -fexceptions AM_CPPFLAGS = -Wall \ -D@EXEMPI_PLATFORM_DEF@=1 -DXMP_IMPL=1 -DXMP_ClientBuild=0 \ -D_FILE_OFFSET_BITS=64 -DHAVE_EXPAT_CONFIG_H=1 -DXML_STATIC=1 noinst_LTLIBRARIES = libmd5.la libmd5_la_SOURCES = MD5.cpp MD5.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign third-party/MD5/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign third-party/MD5/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libmd5.la: $(libmd5_la_OBJECTS) $(libmd5_la_DEPENDENCIES) $(EXTRA_libmd5_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(libmd5_la_OBJECTS) $(libmd5_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MD5.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/third-party/MD5/Makefile.am0000664000175000017500000000400012150230673014607 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # INCLUDES = -I$(top_srcdir)/public/include \ -I$(top_srcdir)/public/include/client-glue \ -I$(top_srcdir)/build/ \ -I$(top_srcdir)/source/common/ \ -I$(top_srcdir)/third-party/MD5 AM_CXXFLAGS = -Wno-multichar -Wno-ctor-dtor-privacy \ -funsigned-char -fexceptions AM_CPPFLAGS = -Wall \ -D@EXEMPI_PLATFORM_DEF@=1 -DXMP_IMPL=1 -DXMP_ClientBuild=0 \ -D_FILE_OFFSET_BITS=64 -DHAVE_EXPAT_CONFIG_H=1 -DXML_STATIC=1 noinst_LTLIBRARIES = libmd5.la libmd5_la_SOURCES = MD5.cpp MD5.h exempi-2.2.1/third-party/MD5/MD5.cpp0000664000175000017500000002445612150230673013665 00000000000000#include "MD5.h" #include #include using namespace std; /******************************************************************************/ /* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. License to copy and use this software is granted provided that it is identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing this software or this function. License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing the derived work. RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this documentation and/or software. */ /******************************************************************************/ /* Constants for MD5Transform routine. */ #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 static void MD5Transform (XMP_Uns32 [4], XMP_Uns8 [64]); static void Encode (XMP_Uns8 *, XMP_Uns32 *, XMP_Uns32); static void Decode (XMP_Uns32 *, XMP_Uns8 *, XMP_Uns32); static XMP_Uns8 PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* F, G, H and I are basic MD5 functions. */ #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) /* ROTATE_LEFT rotates x left n bits. */ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. Rotation is separate from addition to prevent recomputation. */ #define FF(a, b, c, d, x, s, ac) { \ (a) += F ((b), (c), (d)) + (x) + (XMP_Uns32)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define GG(a, b, c, d, x, s, ac) { \ (a) += G ((b), (c), (d)) + (x) + (XMP_Uns32)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define HH(a, b, c, d, x, s, ac) { \ (a) += H ((b), (c), (d)) + (x) + (XMP_Uns32)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define II(a, b, c, d, x, s, ac) { \ (a) += I ((b), (c), (d)) + (x) + (XMP_Uns32)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } /* MD5 initialization. Begins an MD5 operation, writing a new context. */ void MD5Init (MD5_CTX * context) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. */ context->state[0] = 0x67452301; context->state[1] = 0xefcdab89; context->state[2] = 0x98badcfe; context->state[3] = 0x10325476; } /* MD5 block update operation. Continues an MD5 message-digest operation, processing another message block, and updating the context. */ void MD5Update ( MD5_CTX *context, /* context */ XMP_Uns8 *input, /* input block */ XMP_Uns32 inputLen) /* length of input block */ { using namespace std; XMP_Uns32 i, index, partLen; /* Compute number of bytes mod 64 */ index = (XMP_Uns32)((context->count[0] >> 3) & 0x3F); /* Update number of bits */ if ((context->count[0] += ((XMP_Uns32)inputLen << 3)) < ((XMP_Uns32)inputLen << 3)) context->count[1]++; context->count[1] += ((XMP_Uns32)inputLen >> 29); partLen = 64 - index; /* Transform as many times as possible. */ if (inputLen >= partLen) { std::memcpy (&context->buffer[index], input, partLen); // AUDIT: From public MD5 code, assumed safe. MD5Transform (context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) MD5Transform (context->state, &input[i]); index = 0; } else i = 0; /* Buffer remaining input */ std::memcpy (&context->buffer[index], &input[i], inputLen-i); // AUDIT: From public MD5 code, assumed safe. } /* MD5 finalization. Ends an MD5 message-digest operation, writing the the message digest and zeroizing the context. */ void MD5Final ( XMP_Uns8 digest[16], /* message digest */ MD5_CTX *context /* context */) { XMP_Uns8 bits[8]; XMP_Uns32 index, padLen; /* Save number of bits */ Encode (bits, context->count, 8); /* Pad out to 56 mod 64. */ index = (XMP_Uns32)((context->count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); MD5Update (context, PADDING, padLen); /* Append length (before padding) */ MD5Update (context, bits, 8); /* Store state in digest */ Encode (digest, context->state, 16); /* Zeroize sensitive information. */ assert ( sizeof(*context) == sizeof(MD5_CTX) ); memset ( context, 0, sizeof (*context) ); // AUDIT: Safe, using sizeof destination. } /* MD5 basic transformation. Transforms state based on block. */ static void MD5Transform ( XMP_Uns32 state[4], XMP_Uns8 block[64]) { XMP_Uns32 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; Decode (x, block, 64); /* Round 1 */ FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ /* Round 2 */ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ /* Round 3 */ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ /* Round 4 */ II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; /* Zeroize sensitive information. */ memset (x, 0, sizeof (x)); } /* Encodes input (XMP_Uns32) into output (XMP_Uns8). Assumes len is a multiple of 4. */ static void Encode ( XMP_Uns8 *output, XMP_Uns32 *input, XMP_Uns32 len) { XMP_Uns32 i, j; for (i = 0, j = 0; j < len; i++, j += 4) { output[j] = (XMP_Uns8)(input[i] & 0xff); output[j+1] = (XMP_Uns8)((input[i] >> 8) & 0xff); output[j+2] = (XMP_Uns8)((input[i] >> 16) & 0xff); output[j+3] = (XMP_Uns8)((input[i] >> 24) & 0xff); } } /* Decodes input (XMP_Uns8) into output (XMP_Uns32). Assumes len is a multiple of 4. */ static void Decode ( XMP_Uns32 *output, XMP_Uns8 *input, XMP_Uns32 len) { XMP_Uns32 i, j; for (i = 0, j = 0; j < len; i++, j += 4) output[i] = ((XMP_Uns32)input[j]) | (((XMP_Uns32)input[j+1]) << 8) | (((XMP_Uns32)input[j+2]) << 16) | (((XMP_Uns32)input[j+3]) << 24); } exempi-2.2.1/third-party/Makefile.in0000664000175000017500000004405012150231002014227 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = third-party DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = MD5 all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign third-party/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign third-party/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ cscopelist cscopelist-recursive ctags ctags-recursive \ distclean distclean-generic distclean-libtool distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/third-party/Makefile.am0000664000175000017500000000001612150230673014225 00000000000000 SUBDIRS = MD5exempi-2.2.1/INSTALL0000664000175000017500000002231012144603625010760 00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. exempi-2.2.1/TODO0000664000175000017500000000042312144603625010420 00000000000000Things to do: - allow providing your own IO - add handler for Ogg (need to be defined) - reconcile CC license from Ogg to XMP. Check for other media format like MP3 - add support for QuickTime without having quicktime - bug gna #10110 - add support for PDF (using PoDoFo?) exempi-2.2.1/exempi/0000775000175000017500000000000012163706253011302 500000000000000exempi-2.2.1/exempi/xmp++.hpp0000664000175000017500000000200312144603625012656 00000000000000/* * * Copyright (C) 2011 Hubert Figuiere * * Distributed under the Boost Software License, Version 1.0. (See * accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) */ #ifndef __XMP_PLUSPLUS_H__ #define __XMP_PLUSPLUS_H__ #include namespace xmp { inline void release(XmpIteratorPtr ptr) { xmp_iterator_free(ptr); } inline void release(XmpStringPtr ptr) { xmp_string_free(ptr); } inline void release(XmpFilePtr ptr) { xmp_files_free(ptr); } inline void release(XmpPtr ptr) { xmp_free(ptr); } /** * @brief a scoped pointer for Xmp opaque types */ template class ScopedPtr { public: ScopedPtr(T p) : _p(p) {} ~ScopedPtr() { if (_p) release(_p); } operator T() const { return _p; } private: T _p; // private copy constructor and assignment // to make the class non copiable ScopedPtr(const ScopedPtr &); ScopedPtr & operator=(const ScopedPtr &); }; } #endif exempi-2.2.1/exempi/main.cpp0000664000175000017500000002307712144603625012661 00000000000000/* -*- tab-width:2; c-basic-offset:2; indent-tabs-mode:nil; c-file-style:"stroustrup" -*- */ /* * exempi - exempi.cpp * * Copyright (C) 2011-2013 Hubert Figuiere * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include enum { ACTION_NONE = 0, ACTION_SET, ACTION_GET }; static void process_file(const char * filename, bool no_reconcile, bool is_an_xmp, bool dump_xml, bool write_in_place, int action, const std::string & value_name, const std::string & prop_value, const std::string & output); /** fatal error in argument. Display and quit. */ static void fatal_error(const char * error) { fprintf(stderr, "ERROR: %s\n", error); exit(128); } /** Print the usage, and quit. Exit code is 255. */ static void usage() { fprintf(stderr, "Exempi version %s\n", VERSION); fprintf(stderr, "exempi { -h | [ -R ] [ -x ] [ { -w | -o } ] [ { -g | -s -v } ] } \n"); fprintf(stderr, "\t-h: show this help\n"); fprintf(stderr, "\t-R: don't reconcile\n"); fprintf(stderr, "\t-x: dump XML packet.\n"); fprintf(stderr, "\t-X: file(s) is XMP\n"); fprintf(stderr, "\t-w: write in place. Only for -s. Not compatible with -o.\n"); fprintf(stderr, "\t-o : file to write the output to.\n"); fprintf(stderr, "\t-n : create a new namespace.\n"); fprintf(stderr, "\t-g : retrieve the value with prop_name.\n"); fprintf(stderr, "\t-s -v : retrieve or get the value.\n"); fprintf(stderr, "\t the files to read from.\n"); exit(255); } int main(int argc, char **argv) { int ch; int action = ACTION_NONE; bool dont_reconcile = false; bool write_in_place = false; bool dump_xml = false; bool is_an_xmp = false; std::string output_file; std::string value_name; std::string prop_value; std::vector > namespaces; while((ch = getopt(argc, argv, "hRo:wxXn:g:s:v:")) != -1) { switch(ch) { case 'R': dont_reconcile = true; break; case 'o': output_file = optarg; break; case 'w': write_in_place = true; break; case 'x': dump_xml = true; break; case 'X': is_an_xmp = true; break; case 'g': if(!value_name.empty()) { usage(); } action = ACTION_GET; value_name = optarg; break; case 'n': { std::string ns = optarg; std::string prefix = argv[optind]; if (prefix[0] && prefix[0] != '-') { namespaces.push_back(make_pair(ns, prefix)); optind++; } break; } case 's': if(!value_name.empty()) { usage(); } action = ACTION_SET; value_name = optarg; break; case 'v': if(action != ACTION_SET || value_name.empty()) { fatal_error("-v needs to come after -s"); } prop_value = optarg; break; case 'h': case '?': usage(); break; } } argc -= optind; argv += optind; if(optind == 1 || argc == 0) { fatal_error("Missing input."); return 1; } if(write_in_place && (!output_file.empty() || action != ACTION_SET)) { fatal_error("Need to write in place and output file are mutually exclusive."); return 1; } if(action == ACTION_SET && (!write_in_place && argc > 1)) { fatal_error("Need to write in place for more than one file."); return 1; } xmp_init(); if(!namespaces.empty()) { for (std::vector >::const_iterator iter = namespaces.begin(); iter != namespaces.end(); ++iter) { xmp_register_namespace(iter->first.c_str(), iter->second.c_str(), NULL); } } while(argc) { process_file(*argv, dont_reconcile, is_an_xmp, write_in_place, dump_xml, action, value_name, prop_value, output_file); argc--; argv++; } xmp_terminate(); return 0; } static XmpPtr get_xmp_from_sidecar(const char * filename, bool is_an_xmp) { struct stat s; if (stat(filename, &s) == -1) { perror("exempi:"); return NULL; } off_t size = s.st_size; FILE* file = fopen(filename, "r"); if (!file) { perror("exempi:"); return NULL; } char *buffer = (char*)malloc(size); size_t len = fread(buffer, 1, size, file); XmpPtr xmp = xmp_new_empty(); if(!xmp_parse(xmp, buffer, len)) { xmp_free(xmp); xmp = NULL; } free(buffer); fclose(file); return xmp; } /** Helper to get the XMP for the file */ static XmpPtr get_xmp_from_file(const char * filename, bool no_reconcile, bool is_an_xmp) { if (is_an_xmp) { return get_xmp_from_sidecar(filename, is_an_xmp); } xmp::ScopedPtr f(xmp_files_open_new(filename, (XmpOpenFileOptions)(XMP_OPEN_READ | (no_reconcile ? XMP_OPEN_ONLYXMP : 0)))); if(f) { XmpPtr xmp = xmp_files_get_new_xmp(f); xmp_files_close(f, XMP_CLOSE_NOOPTION); return xmp; } return NULL; } /** dump the XMP xml to the output IO */ static void dump_xmp(const char *filename, bool no_reconcile, bool is_an_xmp, FILE *outio) { printf("dump_xmp for file %s\n", filename); xmp::ScopedPtr xmp(get_xmp_from_file(filename, no_reconcile, is_an_xmp)); xmp::ScopedPtr output(xmp_string_new()); xmp_serialize_and_format(xmp, output, XMP_SERIAL_OMITPACKETWRAPPER, 0, "\n", " ", 0); fprintf(outio, "%s", xmp_string_cstr(output)); } /** get an xmp prop and dump it to the output IO */ static void get_xmp_prop(const char * filename, const std::string & value_name, bool no_reconcile, bool is_an_xmp, FILE *outio) { xmp::ScopedPtr xmp(get_xmp_from_file(filename, no_reconcile, is_an_xmp)); std::string prefix; size_t idx = value_name.find(':'); if(idx != std::string::npos) { prefix = std::string(value_name, 0, idx); } xmp::ScopedPtr property(xmp_string_new()); xmp::ScopedPtr ns(xmp_string_new()); xmp_prefix_namespace_uri(prefix.c_str(), ns); xmp_get_property(xmp, xmp_string_cstr(ns), value_name.c_str(), property, NULL); fprintf(outio, "%s\n", xmp_string_cstr(property)); } static void set_xmp_prop(const char * filename, const std::string & value_name, const std::string & prop_value, bool no_reconcile, bool is_an_xmp, bool write_in_place, FILE *outio) { xmp::ScopedPtr xmp(get_xmp_from_file(filename, no_reconcile, is_an_xmp)); std::string prefix; size_t idx = value_name.find(':'); if(idx != std::string::npos) { prefix = std::string(value_name, 0, idx); } xmp::ScopedPtr ns(xmp_string_new()); xmp_prefix_namespace_uri(prefix.c_str(), ns); if(!xmp_set_property(xmp, xmp_string_cstr(ns), value_name.c_str() + idx + 1, prop_value.c_str(), 0)) { fprintf(stderr, "set error = %d\n", xmp_get_error()); } if(write_in_place) { xmp::ScopedPtr f(xmp_files_open_new(filename, (XmpOpenFileOptions)(XMP_OPEN_FORUPDATE | (no_reconcile ? XMP_OPEN_ONLYXMP : 0)))); if(!xmp_files_can_put_xmp(f, xmp)) { fprintf(stderr, "can put xmp error = %d\n", xmp_get_error()); } if(!xmp_files_put_xmp(f, xmp)) { fprintf(stderr, "put xmp error = %d\n", xmp_get_error()); } if(!xmp_files_close(f, XMP_CLOSE_SAFEUPDATE)) { fprintf(stderr, "close error = %d\n", xmp_get_error()); } } } /** process a file with all the options */ static void process_file(const char * filename, bool no_reconcile, bool is_an_xmp, bool write_in_place, bool dump_xml, int action, const std::string & value_name, const std::string & prop_value, const std::string & output) { printf("processing file %s\n", filename); FILE *outio = stdout; bool needclose = false; if(!output.empty()) { outio = fopen(output.c_str(), "a+"); needclose = true; } switch (action) { case ACTION_NONE: if(dump_xml) { dump_xmp(filename, no_reconcile, is_an_xmp, outio); } break; case ACTION_SET: set_xmp_prop(filename, value_name, prop_value, no_reconcile, is_an_xmp, write_in_place, outio); break; case ACTION_GET: get_xmp_prop(filename, value_name, no_reconcile, is_an_xmp, outio); break; default: break; } if(needclose) { fclose(outio); } } exempi-2.2.1/exempi/doc/0000775000175000017500000000000012163706253012047 500000000000000exempi-2.2.1/exempi/doc/Doxyfile.in0000664000175000017500000015136512144603625014113 00000000000000 # Doxyfile 1.5.3 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file that # follow. The default is UTF-8 which is also the encoding used for all text before # the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into # libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of # possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = @PACKAGE@ # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = @VERSION@ # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = . # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, # Italian, Japanese, Japanese-en (Japanese with English messages), Korean, # Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, # Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to # include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be extracted # and appear in the documentation as a namespace called 'anonymous_namespace{file}', # where file will be replaced with the base name of the file that contains the anonymous # namespace. By default anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = .. # This tag can be used to specify the character encoding of the source files that # doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default # input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. # See http://www.gnu.org/software/libiconv for the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py FILE_PATTERNS = *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the output. # The symbol name can be a fully qualified name, a word, or if the wildcard * is used, # a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH # then you must also enable this option. If you don't then doxygen will produce # a warning and turn it on anyway SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = YES # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = *.h # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to # produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to # specify the directory where the mscgen tool resides. If left empty the tool is assumed to # be found in the default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will # generate a caller dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected # functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the number # of direct children of the root node in a graph is already larger than # MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO exempi-2.2.1/exempi/doc/Makefile.in0000664000175000017500000003151512150231001014015 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = exempi/doc DIST_COMMON = $(srcdir)/Doxyfile.in $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = Doxyfile CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = Doxyfile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign exempi/doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign exempi/doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): Doxyfile: $(top_builddir)/config.status $(srcdir)/Doxyfile.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/exempi/doc/Makefile.am0000664000175000017500000000306412144603625014024 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # EXTRA_DIST = Doxyfile.in exempi-2.2.1/exempi/libexempi.sym0000664000175000017500000000212712144603625013732 00000000000000xmp_append_array_item xmp_copy xmp_delete_localized_text xmp_delete_property xmp_files_can_put_xmp xmp_files_close xmp_files_free xmp_files_get_new_xmp xmp_files_get_xmp xmp_files_new xmp_files_open xmp_files_open_new xmp_files_put_xmp xmp_free xmp_get_array_item xmp_get_error xmp_get_localized_text xmp_get_property xmp_get_property_bool xmp_get_property_date xmp_get_property_float xmp_get_property_int32 xmp_get_property_int64 xmp_has_property xmp_init xmp_iterator_free xmp_iterator_new xmp_iterator_next xmp_iterator_skip xmp_namespace_prefix xmp_new xmp_new_empty xmp_parse xmp_prefix_namespace_uri xmp_register_namespace xmp_serialize xmp_serialize_and_format xmp_set_array_item xmp_set_localized_text xmp_set_property xmp_set_property_bool xmp_set_property_date xmp_set_property_float xmp_set_property_int32 xmp_set_property_int64 xmp_string_cstr xmp_string_free xmp_string_new xmp_terminate NS_CAMERA_RAW_SAVED_SETTINGS NS_CAMERA_RAW_SETTINGS NS_CC NS_CRS NS_DC NS_DIMENSIONS_TYPE NS_EXIF NS_EXIF_AUX NS_IPTC4XMP NS_LIGHTROOM NS_PDF NS_PHOTOSHOP NS_RDF NS_TIFF NS_TPG NS_XAP NS_XAP_RIGHTS NS_XMP_META exempi-2.2.1/exempi/tests/0000775000175000017500000000000012163706253012444 500000000000000exempi-2.2.1/exempi/tests/testcpp.cpp0000664000175000017500000000430712144603625014554 00000000000000/* * exempi - testcpp.cpp * * Copyright (C) 2011 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "utils.h" #include "xmp.h" #include "xmpconsts.h" #include "xmp++.hpp" using boost::unit_test::test_suite; int test_main(int argc, char * argv[]) { // this test is totally useless without leak checking. // but for compiling. { xmp::ScopedPtr ptr(xmp_string_new()); } { xmp::ScopedPtr ptr(xmp_files_new()); } { xmp::ScopedPtr ptr(xmp_new_empty()); { xmp::ScopedPtr iterptr(xmp_iterator_new(ptr, NS_EXIF, NULL, XMP_ITER_JUSTLEAFNODES)); } } BOOST_CHECK(!g_lt->check_leaks()); BOOST_CHECK(!g_lt->check_errors()); return 0; } exempi-2.2.1/exempi/tests/test-exempi-core.cpp0000664000175000017500000001676512144603625016277 00000000000000/* * exempi - test-exempi-core.cpp * * Copyright (C) 2007-2008 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include "utils.h" #include "xmpconsts.h" #include "xmp.h" using boost::unit_test::test_suite; //void test_exempi() int test_main(int argc, char *argv[]) { prepare_test(argc, argv, "test1.xmp"); size_t len; char * buffer; FILE * f = fopen(g_testfile.c_str(), "rb"); BOOST_CHECK(f != NULL); if (f == NULL) { exit(128); } fseek(f, 0, SEEK_END); len = ftell(f); fseek(f, 0, SEEK_SET); buffer = (char*)malloc(len + 1); size_t rlen = fread(buffer, 1, len, f); BOOST_CHECK(rlen == len); BOOST_CHECK(len != 0); BOOST_CHECK(xmp_init()); XmpPtr xmp = xmp_new_empty(); BOOST_CHECK(xmp_parse(xmp, buffer, len)); BOOST_CHECK(xmp != NULL); XmpStringPtr the_prop = xmp_string_new(); BOOST_CHECK(xmp_has_property(xmp, NS_TIFF, "Make")); BOOST_CHECK(!xmp_has_property(xmp, NS_TIFF, "Foo")); BOOST_CHECK(xmp_get_property(xmp, NS_TIFF, "Make", the_prop, NULL)); BOOST_CHECK(strcmp("Canon", xmp_string_cstr(the_prop)) == 0); BOOST_CHECK(xmp_set_property(xmp, NS_TIFF, "Make", "Leica", 0)); BOOST_CHECK(xmp_get_property(xmp, NS_TIFF, "Make", the_prop, NULL)); BOOST_CHECK(strcmp("Leica", xmp_string_cstr(the_prop)) == 0); uint32_t bits; BOOST_CHECK(xmp_get_property(xmp, NS_DC, "rights[1]/?xml:lang", the_prop, &bits)); BOOST_CHECK(bits == 0x20); BOOST_CHECK(XMP_IS_PROP_QUALIFIER(bits)); BOOST_CHECK(xmp_get_property(xmp, NS_DC, "rights[1]", the_prop, &bits)); BOOST_CHECK(bits == 0x50); BOOST_CHECK(XMP_HAS_PROP_QUALIFIERS(bits)); XmpStringPtr the_lang = xmp_string_new(); BOOST_CHECK(xmp_get_localized_text(xmp, NS_DC, "rights", NULL, "x-default", the_lang, the_prop, &bits)); BOOST_CHECK(strcmp("x-default", xmp_string_cstr(the_lang)) == 0); BOOST_CHECK(strcmp("2006, Hubert Figuiere", xmp_string_cstr(the_prop)) == 0); // This will modify the default property. BOOST_CHECK(xmp_set_localized_text(xmp, NS_DC, "rights", "en", "en-CA", "Foo Bar", 0)); // Ask for the en_US alternative. BOOST_CHECK(xmp_get_localized_text(xmp, NS_DC, "rights", "en", "en-US", the_lang, the_prop, &bits)); // And we only got the "en-CA" as the only "en" BOOST_CHECK(strcmp("en-US", xmp_string_cstr(the_lang)) != 0); BOOST_CHECK(strcmp("en-CA", xmp_string_cstr(the_lang)) == 0); // Check its value BOOST_CHECK(strcmp("Foo Bar", xmp_string_cstr(the_prop)) == 0); // The default property is supposed to have been changed too. BOOST_CHECK(xmp_get_localized_text(xmp, NS_DC, "rights", NULL, "x-default", the_lang, the_prop, &bits)); BOOST_CHECK(strcmp("Foo Bar", xmp_string_cstr(the_prop)) == 0); // This should also remove the property x-default. (SDK 5.2.2) BOOST_CHECK(xmp_delete_localized_text(xmp, NS_DC, "rights", "en", "en-CA")); BOOST_CHECK(!xmp_has_property(xmp, NS_DC, "rights[1]")); BOOST_CHECK(!xmp_has_property(xmp, NS_DC, "rights[2]")); xmp_string_free(the_lang); BOOST_CHECK(xmp_set_array_item(xmp, NS_DC, "creator", 2, "foo", 0)); BOOST_CHECK(xmp_get_array_item(xmp, NS_DC, "creator", 2, the_prop, &bits)); BOOST_CHECK(XMP_IS_PROP_SIMPLE(bits)); BOOST_CHECK(strcmp("foo", xmp_string_cstr(the_prop)) == 0); BOOST_CHECK(xmp_append_array_item(xmp, NS_DC, "creator", 0, "bar", 0)); BOOST_CHECK(xmp_get_array_item(xmp, NS_DC, "creator", 3, the_prop, &bits)); BOOST_CHECK(XMP_IS_PROP_SIMPLE(bits)); BOOST_CHECK(strcmp("bar", xmp_string_cstr(the_prop)) == 0); BOOST_CHECK(xmp_delete_property(xmp, NS_DC, "creator[3]")); BOOST_CHECK(!xmp_has_property(xmp, NS_DC, "creator[3]")); BOOST_CHECK(xmp_get_property(xmp, NS_EXIF, "DateTimeOriginal", the_prop, NULL)); BOOST_CHECK(strcmp("2006-12-07T23:20:43-05:00", xmp_string_cstr(the_prop)) == 0); BOOST_CHECK(xmp_get_property(xmp, NS_XAP, "Rating", the_prop, NULL)); BOOST_CHECK(strcmp("3", xmp_string_cstr(the_prop)) == 0); xmp_string_free(the_prop); // testing date time get XmpDateTime the_dt; bool ret; BOOST_CHECK(ret = xmp_get_property_date(xmp, NS_EXIF, "DateTimeOriginal", &the_dt, NULL)); BOOST_CHECK(the_dt.year == 2006); BOOST_CHECK(the_dt.minute == 20); BOOST_CHECK(the_dt.tzSign == XMP_TZ_WEST); // testing float get set double float_value = 0.0; BOOST_CHECK(xmp_get_property_float(xmp, NS_CAMERA_RAW_SETTINGS, "SharpenRadius", &float_value, NULL)); BOOST_CHECK(float_value == 1.0); BOOST_CHECK(xmp_set_property_float(xmp, NS_CAMERA_RAW_SETTINGS, "SharpenRadius", 2.5, 0)); BOOST_CHECK(xmp_get_property_float(xmp, NS_CAMERA_RAW_SETTINGS, "SharpenRadius", &float_value, NULL)); BOOST_CHECK(float_value == 2.5); // testing bool get set bool bool_value = true; BOOST_CHECK(xmp_get_property_bool(xmp, NS_CAMERA_RAW_SETTINGS, "AlreadyApplied", &bool_value, NULL)); BOOST_CHECK(!bool_value); BOOST_CHECK(xmp_set_property_bool(xmp, NS_CAMERA_RAW_SETTINGS, "AlreadyApplied", true, 0)); BOOST_CHECK(xmp_get_property_bool(xmp, NS_CAMERA_RAW_SETTINGS, "AlreadyApplied", &bool_value, NULL)); BOOST_CHECK(bool_value); // testing int get set int32_t value = 0; BOOST_CHECK(xmp_get_property_int32(xmp, NS_EXIF, "MeteringMode", &value, NULL)); BOOST_CHECK(value == 5); BOOST_CHECK(xmp_set_property_int32(xmp, NS_EXIF, "MeteringMode", 10, 0)); int64_t valuelarge = 0; BOOST_CHECK(xmp_get_property_int64(xmp, NS_EXIF, "MeteringMode", &valuelarge, NULL)); BOOST_CHECK(valuelarge == 10); BOOST_CHECK(xmp_set_property_int64(xmp, NS_EXIF, "MeteringMode", 32, 0)); BOOST_CHECK(xmp_get_property_int32(xmp, NS_EXIF, "MeteringMode", &value, NULL)); BOOST_CHECK(value == 32); BOOST_CHECK(xmp_free(xmp)); free(buffer); fclose(f); xmp_terminate(); BOOST_CHECK(!g_lt->check_leaks()); BOOST_CHECK(!g_lt->check_errors()); return 0; } exempi-2.2.1/exempi/tests/test3.cpp0000664000175000017500000000632412144603625014135 00000000000000/* * exempi - test3.cpp * * Copyright (C) 2007-2008 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "utils.h" #include "xmp.h" #include "xmpconsts.h" using boost::unit_test::test_suite; //void test_exempi_iterate() int test_main(int argc, char *argv[]) { prepare_test(argc, argv, "test1.xmp"); size_t len; char * buffer; FILE * f = fopen(g_testfile.c_str(), "rb"); BOOST_CHECK(f != NULL); if (f == NULL) { exit(128); } fseek(f, 0, SEEK_END); len = ftell(f); fseek(f, 0, SEEK_SET); buffer = (char*)malloc(len + 1); size_t rlen = fread(buffer, 1, len, f); BOOST_CHECK(rlen == len); BOOST_CHECK(len != 0); BOOST_CHECK(xmp_init()); XmpPtr xmp = xmp_new_empty(); BOOST_CHECK(xmp_parse(xmp, buffer, len)); BOOST_CHECK(xmp != NULL); XmpIteratorPtr iter = xmp_iterator_new(xmp, NULL, NULL, XMP_ITER_JUSTLEAFNODES); XmpStringPtr the_schema = xmp_string_new(); XmpStringPtr the_path = xmp_string_new(); XmpStringPtr the_prop = xmp_string_new(); uint32_t options; while( xmp_iterator_next(iter, the_schema, the_path, the_prop, &options) ) { std::cout << xmp_string_cstr(the_schema) << " / " << xmp_string_cstr(the_path) << " = " << xmp_string_cstr(the_prop) ; if(options) { std::cout << boost::format(" options = 0x%1$x") % options; } std::cout << std::endl; } xmp_string_free(the_prop); xmp_string_free(the_path); xmp_string_free(the_schema); BOOST_CHECK(xmp_iterator_free(iter)); BOOST_CHECK(xmp_free(xmp)); free(buffer); fclose(f); xmp_terminate(); BOOST_CHECK(!g_lt->check_leaks()); BOOST_CHECK(!g_lt->check_errors()); return 0; } exempi-2.2.1/exempi/tests/test-bgo.cpp0000664000175000017500000000433512144603625014617 00000000000000/* * exempi - test-bgo.cpp * * Copyright (C) 2007-2008 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include "utils.h" #include "xmpconsts.h" #include "xmp.h" int test_main(int argc, char * argv[]) { prepare_test(argc, argv, "fdo18635.jpg"); BOOST_CHECK(xmp_init()); XmpFilePtr xf = xmp_files_open_new(g_testfile.c_str(), XMP_OPEN_READ); BOOST_CHECK(xf != NULL); if (xf == NULL) { return 1; } XmpPtr xmp = xmp_files_get_new_xmp(xf); BOOST_CHECK(xmp != NULL); BOOST_CHECK(xmp_free(xmp)); BOOST_CHECK(xmp_files_free(xf)); xmp_terminate(); BOOST_CHECK(!g_lt->check_leaks()); BOOST_CHECK(!g_lt->check_errors()); return 0; } exempi-2.2.1/exempi/tests/test-write-new-prop.cpp0000664000175000017500000001051112144603625016740 00000000000000/* * exempi - test1.cpp * * Copyright (C) 2007-2008 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include "utils.h" #include "xmpconsts.h" #include "xmp.h" using boost::unit_test::test_suite; //void test_write_new_property() int test_main(int argc, char *argv[]) { prepare_test(argc, argv, "test1.xmp"); size_t len; char * buffer; FILE * f = fopen(g_testfile.c_str(), "rb"); BOOST_CHECK(f != NULL); if (f == NULL) { exit(128); } fseek(f, 0, SEEK_END); len = ftell(f); fseek(f, 0, SEEK_SET); buffer = (char*)malloc(len + 1); size_t rlen = fread(buffer, 1, len, f); BOOST_CHECK(rlen == len); BOOST_CHECK(len != 0); BOOST_CHECK(xmp_init()); BOOST_CHECK(xmp_get_error() == 0); XmpPtr xmp = xmp_new_empty(); BOOST_CHECK(xmp_get_error() == 0); BOOST_CHECK(xmp_parse(xmp, buffer, len)); BOOST_CHECK(xmp_get_error() == 0); BOOST_CHECK(xmp != NULL); XmpStringPtr reg_prefix = xmp_string_new(); BOOST_CHECK(xmp_register_namespace(NS_CC, "cc", reg_prefix)); BOOST_CHECK(xmp_get_error() == 0); BOOST_CHECK(strcmp("cc:", xmp_string_cstr(reg_prefix)) == 0); BOOST_CHECK(xmp_prefix_namespace_uri("cc", reg_prefix)); BOOST_CHECK(xmp_get_error() == 0); BOOST_CHECK(strcmp(NS_CC, xmp_string_cstr(reg_prefix)) == 0); BOOST_CHECK(xmp_namespace_prefix(NS_CC, reg_prefix)); BOOST_CHECK(xmp_get_error() == 0); BOOST_CHECK(strcmp("cc:", xmp_string_cstr(reg_prefix)) == 0); xmp_string_free(reg_prefix); BOOST_CHECK(xmp_set_property(xmp, NS_CC, "License", "Foo", 0)); BOOST_CHECK(xmp_get_error() == 0); XmpStringPtr the_prop = xmp_string_new(); BOOST_CHECK(xmp_get_property(xmp, NS_CC, "License", the_prop, NULL)); BOOST_CHECK(xmp_get_error() == 0); BOOST_CHECK(strcmp("Foo", xmp_string_cstr(the_prop)) == 0); XmpDateTime the_dt; the_dt.year = 2005; the_dt.month = 12; the_dt.day = 25; the_dt.hour = 12; the_dt.minute = 42; the_dt.second = 42; the_dt.tzSign = XMP_TZ_UTC; the_dt.tzHour = 0; the_dt.tzMinute = 0; the_dt.nanoSecond = 0; BOOST_CHECK(xmp_set_property_date(xmp, NS_EXIF, "DateTimeOriginal", &the_dt, 0)); BOOST_CHECK(xmp_get_error() == 0); BOOST_CHECK(xmp_get_property(xmp, NS_EXIF, "DateTimeOriginal", the_prop, NULL)); BOOST_CHECK(xmp_get_error() == 0); BOOST_CHECK(strcmp("2005-12-25T12:42:42", xmp_string_cstr(the_prop)) == 0); XmpDateTime the_dt2; BOOST_CHECK(xmp_get_property_date(xmp, NS_EXIF, "DateTimeOriginal", &the_dt2, NULL)); BOOST_CHECK(xmp_get_error() == 0); BOOST_CHECK(the_dt2.year == 2005); BOOST_CHECK(the_dt2.minute == 42); BOOST_CHECK(the_dt2.tzSign == XMP_TZ_UTC); xmp_string_free(the_prop); BOOST_CHECK(xmp_free(xmp)); free(buffer); fclose(f); xmp_terminate(); BOOST_CHECK(!g_lt->check_leaks()); BOOST_CHECK(!g_lt->check_errors()); return 0; } exempi-2.2.1/exempi/tests/test-xmpfiles-write.cpp0000664000175000017500000000672612144603625017035 00000000000000/* * exempi - test-xmpfile-write.cpp * * Copyright (C) 2007-2008,2010 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "utils.h" #include "xmp.h" #include "xmpconsts.h" using boost::unit_test::test_suite; //void test_xmpfiles_write() int test_main(int argc, char *argv[]) { prepare_test(argc, argv, "../../samples/testfiles/BlueSquare.jpg"); BOOST_CHECK(xmp_init()); BOOST_CHECK(xmp_files_check_file_format(g_testfile.c_str()) == XMP_FT_JPEG); XmpFilePtr f = xmp_files_open_new(g_testfile.c_str(), XMP_OPEN_READ); BOOST_CHECK(f != NULL); if (f == NULL) { return 1; } XmpPtr xmp = xmp_files_get_new_xmp(f); BOOST_CHECK(xmp != NULL); BOOST_CHECK(xmp_files_free(f)); BOOST_CHECK(copy_file(g_testfile, "test.jpg")); BOOST_CHECK(chmod("test.jpg", S_IRUSR|S_IWUSR) == 0); BOOST_CHECK(xmp_files_check_file_format("test.jpg") == XMP_FT_JPEG); f = xmp_files_open_new("test.jpg", XMP_OPEN_FORUPDATE); BOOST_CHECK(f != NULL); if (f == NULL) { return 2; } BOOST_CHECK(xmp_set_property(xmp, NS_PHOTOSHOP, "ICCProfile", "foo", 0)); BOOST_CHECK(xmp_files_can_put_xmp(f, xmp)); BOOST_CHECK(xmp_files_put_xmp(f, xmp)); BOOST_CHECK(xmp_free(xmp)); BOOST_CHECK(xmp_files_close(f, XMP_CLOSE_SAFEUPDATE)); BOOST_CHECK(xmp_files_free(f)); f = xmp_files_open_new("test.jpg", XMP_OPEN_READ); BOOST_CHECK(f != NULL); if (f == NULL) { return 3; } xmp = xmp_files_get_new_xmp(f); BOOST_CHECK(xmp != NULL); XmpStringPtr the_prop = xmp_string_new(); BOOST_CHECK(xmp_get_property(xmp, NS_PHOTOSHOP, "ICCProfile", the_prop, NULL)); BOOST_CHECK(strcmp("foo", xmp_string_cstr(the_prop)) == 0); xmp_string_free(the_prop); BOOST_CHECK(xmp_free(xmp)); BOOST_CHECK(xmp_files_close(f, XMP_CLOSE_NOOPTION)); BOOST_CHECK(xmp_files_free(f)); // unlink("test.jpg"); xmp_terminate(); BOOST_CHECK(!g_lt->check_leaks()); BOOST_CHECK(!g_lt->check_errors()); return 0; } exempi-2.2.1/exempi/tests/utils.cpp0000664000175000017500000000670612144603625014237 00000000000000/* * exempi - utils.cpp * * Copyright (C) 2007,2010 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "utils.h" std::string g_testfile; std::string g_src_testdir; boost::scoped_ptr g_lt(new LeakTracker) ; void prepare_test(int argc, char * argv[], const char *filename) { if (argc == 1) { // no argument, lets run like we are in "check" const char * srcdir = getenv("TEST_DIR"); BOOST_ASSERT(srcdir != NULL); g_src_testdir = std::string(srcdir) + "/"; g_testfile = g_src_testdir + filename; } else { g_src_testdir = "./"; g_testfile = argv[1]; } } bool copy_file(const std::string & source, const std::string & dest) { std::string command = "cp "; command += source + " " + dest; return (system(command.c_str()) >= 0); } #ifdef HAVE_VALGRIND_MEMCHECK_H # include # include # define CC_EXTENSION __extension__ #else # define VALGRIND_COUNT_ERRORS 0 # define VALGRIND_DO_LEAK_CHECK # define VALGRIND_COUNT_LEAKS(a,b,c,d) (a=b=c=d=0) # define CC_EXTENSION #endif LeakTracker::LeakTracker() : m_leaks(0), m_dubious(0), m_reachable(0), m_suppressed(0), m_errors(0) { } LeakTracker::~LeakTracker() { printf("LeakTracker: leaked = %d, errors = %d\n", m_leaks, m_errors); } int LeakTracker::check_leaks() { int leaked = 0; int dubious = 0; int reachable = 0; int suppressed = 0; VALGRIND_DO_LEAK_CHECK; VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed); printf("memleaks: sure:%d dubious:%d reachable:%d suppress:%d\n", leaked, dubious, reachable, suppressed); bool has_leaks = (m_leaks != leaked); m_leaks = leaked; m_dubious = dubious; m_reachable = reachable; m_suppressed = suppressed; return has_leaks; } int LeakTracker::check_errors() { int errors = (int)(CC_EXTENSION VALGRIND_COUNT_ERRORS); bool has_new_errors = (m_errors != errors); m_errors = errors; return has_new_errors; } exempi-2.2.1/exempi/tests/test1.xmp0000664000175000017500000003036312144603625014155 00000000000000 Canon Canon EOS 20D 1 3504 2336 0221 15/1 -3906891/1000000 8/1 6/1 1 2006-12-07T23:20:43-05:00 2006-12-07T23:20:43-05:00 0/2 3625/1000 5 32/1 0 1 0 0 3504000/885 2336000/590 2 100 False 0 2 False False 2006-12-07T23:20:43-05:00 3 unknown 2006, Hubert Figuiere night ontario ottawa parliament of canada 420103070 24/1 85/1 0/0 0/0 24.0-85.0 mm 176 -2/1 unknown 1.1.0 False As Shot 0.00 5 +50 +25 0 25 0 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 50 75 +1.0 25 0 False Medium Contrast 0, 0 32, 22 64, 56 128, 128 192, 196 255, 255 false 0 25 1 0 0 0 0 0 0 0 0 0 0 0 50 75 25 25 As Shot 0 0 0 100 0 0 71 0 25 0 5 0 50 0 0 0 29 false false false 0 0 0 0 0 0 0 0 0 0 0 false 1 0 0 0 0 29 0 0 0 71 50 0 false 0 0 true 0 0 1 4350 aGllcmFyY2hpY2FsS2V5d29yZHMgPSB7Cgl7CgkJZmxhdCA9IHsKCQkJIm5pZ2h0IiwKCQl9LAoJCXBhdGggPSB7CgkJCSJuaWdodCIsCgkJfSwKCQlwcmltYXJ5ID0gIm5pZ2h0IiwKCQl1dWlkID0gIkU1RDEwQTFELTU3QUYtMTFEQi04RTMzLTAwMEQ5MzVDODY5QSIsCgl9LAoJewoJCWZsYXQgPSB7CgkJCSJvbnRhcmlvIiwKCQkJIm90dGF3YSIsCgkJfSwKCQlwYXRoID0gewoJCQkib250YXJpbyIsCgkJCSJvdHRhd2EiLAoJCX0sCgkJcHJpbWFyeSA9ICJvdHRhd2EiLAoJCXV1aWQgPSAiQjgzMTc4RkItNTdBRi0xMURCLThFMzMtMDAwRDkzNUM4NjlBIiwKCX0sCgl7CgkJZmxhdCA9IHsKCQkJInBhcmxpYW1lbnQgb2YgY2FuYWRhIiwKCQkJIm9udGFyaW8iLAoJCQkib3R0YXdhIiwKCQl9LAoJCXBhdGggPSB7CgkJCSJvbnRhcmlvIiwKCQkJIm90dGF3YSIsCgkJCSJwYXJsaWFtZW50IG9mIGNhbmFkYSIsCgkJfSwKCQlwcmltYXJ5ID0gInBhcmxpYW1lbnQgb2YgY2FuYWRhIiwKCQl1dWlkID0gIkU1RDMzMEZDLTU3QUYtMTFEQi04RTMzLTAwMEQ5MzVDODY5QSIsCgl9LAp9Cg== 4 3 inches Parliament Hill, Ottawa, Ontario, Canada exempi-2.2.1/exempi/tests/test-xmpfiles.cpp0000664000175000017500000000711312144603625015674 00000000000000/* * exempi - test-xmpfiles.cpp * * Copyright (C) 2007 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "utils.h" #include "xmp.h" #include "xmpconsts.h" using boost::unit_test::test_suite; //void test_xmpfiles() int test_main(int argc, char * argv[]) { prepare_test(argc, argv, "../../samples/testfiles/BlueSquare.jpg"); BOOST_CHECK(xmp_init()); XmpFilePtr f = xmp_files_open_new(g_testfile.c_str(), XMP_OPEN_READ); BOOST_CHECK(f != NULL); if (f == NULL) { exit(128); } BOOST_CHECK(xmp_files_check_file_format(g_testfile.c_str()) == XMP_FT_JPEG); XmpStringPtr file_path = xmp_string_new(); XmpOpenFileOptions options; XmpFileType file_format; XmpFileFormatOptions handler_flags; BOOST_CHECK(xmp_files_get_file_info(f, file_path, &options, &file_format, &handler_flags)); BOOST_CHECK(options == XMP_OPEN_READ); BOOST_CHECK(file_format == XMP_FT_JPEG); // the value check might break at each SDK update. You have been warned. BOOST_CHECK(handler_flags == 0x27f); BOOST_CHECK(g_testfile == xmp_string_cstr(file_path)); xmp_string_free(file_path); XmpPtr xmp = xmp_new_empty(); BOOST_CHECK(xmp != NULL); BOOST_CHECK(xmp_files_get_xmp(f, xmp)); XmpStringPtr the_prop = xmp_string_new(); BOOST_CHECK(xmp_get_property(xmp, NS_PHOTOSHOP, "ICCProfile", the_prop, NULL)); BOOST_CHECK(strcmp("sRGB IEC61966-2.1", xmp_string_cstr(the_prop)) == 0); xmp_string_free(the_prop); BOOST_CHECK(xmp_free(xmp)); BOOST_CHECK(xmp_files_free(f)); XmpFileFormatOptions formatOptions; // the value check might break at each SDK update. You have been warned. BOOST_CHECK(xmp_files_get_format_info(XMP_FT_JPEG, &formatOptions)); BOOST_CHECK(formatOptions == 0x27f); BOOST_CHECK(xmp_files_get_format_info(XMP_FT_GIF, &formatOptions)); BOOST_CHECK(formatOptions == 0x46b); BOOST_CHECK(xmp_files_get_format_info(XMP_FT_PNG, &formatOptions)); BOOST_CHECK(formatOptions == 0x46b); xmp_terminate(); BOOST_CHECK(!g_lt->check_leaks()); BOOST_CHECK(!g_lt->check_errors()); return 0; } exempi-2.2.1/exempi/tests/Makefile.in0000664000175000017500000007507312150231001014421 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007-2011 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @WITH_UNIT_TEST_TRUE@check_PROGRAMS = testexempicore$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testserialise$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testwritenewprop$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testtiffleak$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testxmpfiles$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testxmpfileswrite$(EXEEXT) test3$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testinit$(EXEEXT) testfdo18635$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testcpp$(EXEEXT) @WITH_UNIT_TEST_TRUE@TESTS = testcore.sh testinit$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testexempicore$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testserialise$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testwritenewprop$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testtiffleak$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testxmpfiles$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testxmpfileswrite$(EXEEXT) test3$(EXEEXT) \ @WITH_UNIT_TEST_TRUE@ testfdo18635$(EXEEXT) testcpp$(EXEEXT) subdir = exempi/tests DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am_test3_OBJECTS = test3.$(OBJEXT) utils.$(OBJEXT) test3_OBJECTS = $(am_test3_OBJECTS) test3_DEPENDENCIES = ../libexempi.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = test3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(test3_LDFLAGS) $(LDFLAGS) -o $@ am_testcpp_OBJECTS = testcpp.$(OBJEXT) utils.$(OBJEXT) testcpp_OBJECTS = $(am_testcpp_OBJECTS) testcpp_DEPENDENCIES = ../libexempi.la testcpp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(testcpp_LDFLAGS) $(LDFLAGS) -o $@ am_testexempicore_OBJECTS = test-exempi-core.$(OBJEXT) utils.$(OBJEXT) testexempicore_OBJECTS = $(am_testexempicore_OBJECTS) testexempicore_DEPENDENCIES = ../libexempi.la testexempicore_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(testexempicore_LDFLAGS) \ $(LDFLAGS) -o $@ am_testfdo18635_OBJECTS = test-bgo.$(OBJEXT) utils.$(OBJEXT) testfdo18635_OBJECTS = $(am_testfdo18635_OBJECTS) testfdo18635_DEPENDENCIES = ../libexempi.la testfdo18635_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(testfdo18635_LDFLAGS) $(LDFLAGS) -o $@ am_testinit_OBJECTS = testinit.$(OBJEXT) utils.$(OBJEXT) testinit_OBJECTS = $(am_testinit_OBJECTS) testinit_DEPENDENCIES = ../libexempi.la testinit_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(testinit_LDFLAGS) $(LDFLAGS) -o $@ am_testserialise_OBJECTS = test-serialise.$(OBJEXT) utils.$(OBJEXT) testserialise_OBJECTS = $(am_testserialise_OBJECTS) testserialise_DEPENDENCIES = ../libexempi.la testserialise_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(testserialise_LDFLAGS) $(LDFLAGS) \ -o $@ am_testtiffleak_OBJECTS = test-tiff-leak.$(OBJEXT) utils.$(OBJEXT) testtiffleak_OBJECTS = $(am_testtiffleak_OBJECTS) testtiffleak_DEPENDENCIES = ../libexempi.la testtiffleak_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(testtiffleak_LDFLAGS) $(LDFLAGS) -o $@ am_testwritenewprop_OBJECTS = test-write-new-prop.$(OBJEXT) \ utils.$(OBJEXT) testwritenewprop_OBJECTS = $(am_testwritenewprop_OBJECTS) testwritenewprop_DEPENDENCIES = ../libexempi.la testwritenewprop_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(testwritenewprop_LDFLAGS) \ $(LDFLAGS) -o $@ am_testxmpfiles_OBJECTS = test-xmpfiles.$(OBJEXT) utils.$(OBJEXT) testxmpfiles_OBJECTS = $(am_testxmpfiles_OBJECTS) testxmpfiles_DEPENDENCIES = ../libexempi.la testxmpfiles_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(testxmpfiles_LDFLAGS) $(LDFLAGS) -o $@ am_testxmpfileswrite_OBJECTS = test-xmpfiles-write.$(OBJEXT) \ utils.$(OBJEXT) testxmpfileswrite_OBJECTS = $(am_testxmpfileswrite_OBJECTS) testxmpfileswrite_DEPENDENCIES = ../libexempi.la testxmpfileswrite_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(testxmpfileswrite_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(test3_SOURCES) $(testcpp_SOURCES) \ $(testexempicore_SOURCES) $(testfdo18635_SOURCES) \ $(testinit_SOURCES) $(testserialise_SOURCES) \ $(testtiffleak_SOURCES) $(testwritenewprop_SOURCES) \ $(testxmpfiles_SOURCES) $(testxmpfileswrite_SOURCES) DIST_SOURCES = $(test3_SOURCES) $(testcpp_SOURCES) \ $(testexempicore_SOURCES) $(testfdo18635_SOURCES) \ $(testinit_SOURCES) $(testserialise_SOURCES) \ $(testtiffleak_SOURCES) $(testwritenewprop_SOURCES) \ $(testxmpfiles_SOURCES) $(testxmpfileswrite_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = $(am__tty_colors_dummy) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ INCLUDES = -I$(srcdir)/.. -I$(top_srcdir)/public/include -I$(top_srcdir) @WITH_UNIT_TEST_TRUE@TESTS_ENVIRONMENT = TEST_DIR=$(srcdir) BOOST_TEST_CATCH_SYSTEM_ERRORS=no @VALGRIND@ check_SCRIPTS = testcore.sh check_DATA = test1.xmp fdo18635.jpg noinst_HEADERS = utils.h EXTRA_DIST = $(check_DATA) $(check_SCRIPTS) CLEANFILES = test.jpg testinit_SOURCES = testinit.cpp utils.cpp testinit_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testinit_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testexempicore_SOURCES = test-exempi-core.cpp utils.cpp testexempicore_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testexempicore_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testserialise_SOURCES = test-serialise.cpp utils.cpp testserialise_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testserialise_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testwritenewprop_SOURCES = test-write-new-prop.cpp utils.cpp testwritenewprop_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testwritenewprop_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testtiffleak_SOURCES = test-tiff-leak.cpp utils.cpp testtiffleak_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testtiffleak_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testxmpfiles_SOURCES = test-xmpfiles.cpp utils.cpp testxmpfiles_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testxmpfiles_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testxmpfileswrite_SOURCES = test-xmpfiles-write.cpp utils.cpp testxmpfileswrite_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testxmpfileswrite_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ test3_SOURCES = test3.cpp utils.cpp test3_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ test3_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testfdo18635_SOURCES = test-bgo.cpp utils.cpp testfdo18635_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testfdo18635_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testcpp_SOURCES = testcpp.cpp utils.cpp testcpp_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testcpp_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign exempi/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign exempi/tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test3$(EXEEXT): $(test3_OBJECTS) $(test3_DEPENDENCIES) $(EXTRA_test3_DEPENDENCIES) @rm -f test3$(EXEEXT) $(AM_V_CXXLD)$(test3_LINK) $(test3_OBJECTS) $(test3_LDADD) $(LIBS) testcpp$(EXEEXT): $(testcpp_OBJECTS) $(testcpp_DEPENDENCIES) $(EXTRA_testcpp_DEPENDENCIES) @rm -f testcpp$(EXEEXT) $(AM_V_CXXLD)$(testcpp_LINK) $(testcpp_OBJECTS) $(testcpp_LDADD) $(LIBS) testexempicore$(EXEEXT): $(testexempicore_OBJECTS) $(testexempicore_DEPENDENCIES) $(EXTRA_testexempicore_DEPENDENCIES) @rm -f testexempicore$(EXEEXT) $(AM_V_CXXLD)$(testexempicore_LINK) $(testexempicore_OBJECTS) $(testexempicore_LDADD) $(LIBS) testfdo18635$(EXEEXT): $(testfdo18635_OBJECTS) $(testfdo18635_DEPENDENCIES) $(EXTRA_testfdo18635_DEPENDENCIES) @rm -f testfdo18635$(EXEEXT) $(AM_V_CXXLD)$(testfdo18635_LINK) $(testfdo18635_OBJECTS) $(testfdo18635_LDADD) $(LIBS) testinit$(EXEEXT): $(testinit_OBJECTS) $(testinit_DEPENDENCIES) $(EXTRA_testinit_DEPENDENCIES) @rm -f testinit$(EXEEXT) $(AM_V_CXXLD)$(testinit_LINK) $(testinit_OBJECTS) $(testinit_LDADD) $(LIBS) testserialise$(EXEEXT): $(testserialise_OBJECTS) $(testserialise_DEPENDENCIES) $(EXTRA_testserialise_DEPENDENCIES) @rm -f testserialise$(EXEEXT) $(AM_V_CXXLD)$(testserialise_LINK) $(testserialise_OBJECTS) $(testserialise_LDADD) $(LIBS) testtiffleak$(EXEEXT): $(testtiffleak_OBJECTS) $(testtiffleak_DEPENDENCIES) $(EXTRA_testtiffleak_DEPENDENCIES) @rm -f testtiffleak$(EXEEXT) $(AM_V_CXXLD)$(testtiffleak_LINK) $(testtiffleak_OBJECTS) $(testtiffleak_LDADD) $(LIBS) testwritenewprop$(EXEEXT): $(testwritenewprop_OBJECTS) $(testwritenewprop_DEPENDENCIES) $(EXTRA_testwritenewprop_DEPENDENCIES) @rm -f testwritenewprop$(EXEEXT) $(AM_V_CXXLD)$(testwritenewprop_LINK) $(testwritenewprop_OBJECTS) $(testwritenewprop_LDADD) $(LIBS) testxmpfiles$(EXEEXT): $(testxmpfiles_OBJECTS) $(testxmpfiles_DEPENDENCIES) $(EXTRA_testxmpfiles_DEPENDENCIES) @rm -f testxmpfiles$(EXEEXT) $(AM_V_CXXLD)$(testxmpfiles_LINK) $(testxmpfiles_OBJECTS) $(testxmpfiles_LDADD) $(LIBS) testxmpfileswrite$(EXEEXT): $(testxmpfileswrite_OBJECTS) $(testxmpfileswrite_DEPENDENCIES) $(EXTRA_testxmpfileswrite_DEPENDENCIES) @rm -f testxmpfileswrite$(EXEEXT) $(AM_V_CXXLD)$(testxmpfileswrite_LINK) $(testxmpfileswrite_OBJECTS) $(testxmpfileswrite_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-bgo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-exempi-core.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-serialise.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-tiff-leak.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-write-new-prop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-xmpfiles-write.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-xmpfiles.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testcpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testinit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$${col}$$dashes$${std}"; \ echo "$${col}$$banner$${std}"; \ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ test -z "$$report" || echo "$${col}$$report$${std}"; \ echo "$${col}$$dashes$${std}"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_SCRIPTS) \ $(check_DATA) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool cscopelist \ ctags distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/exempi/tests/fdo18635.jpg0000664000175000017500000064743312144603625014264 00000000000000ÿØÿá¤ExifMM* † ˜¢ª(12²‡iƈ% 2NIKON CORPORATIONNIKON D1X,,2008:07:09 06:06:01&‚š”‚œˆ"0220¤¸‘‘Ì’ Ô’Ü’’’ ’ ä’|ì’20’‘20’’20 0100   À ¨ ò¢£££¤¤¤¤¤¤¤¤¤ ¤ ¤   # 2008:07:09 06:06:012008:07:09 06:06:01$ ´ R980100Œ”(œ,,ÿØÿÛ„   % #!,!#'(***.1.)1%)*(  (((((((((((((((((((((((((((((((((((((((((((((((((((ÿÄ¢ }!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùú w!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÀx !ÿÚ ?ü³h&QóE ú©¨Ö)  irÿvÞfú!5etËöû¶WGé…H4D¶Ñ§Ý–=¼–Ïò«‹áýeÆWHÔélçúP‡µ¡×GÔðÿ«>‹ªÇ÷ôËåúÛ¸þ”À„éZ€ëaw×ê[¯åLeùéeuÏý2oð¢ÌWû2ÿþ|nºgýStü¨]ù £‘‘û–ÿ ,ý™Çú ×=?tÜþ”ŸÙ—üÿ¡]q×÷MÇéE†Ù·ùÇØ®r{yMþÏìûÜöKŒ§Êoð C Ø YÆz~ìóMûÖqöi²?Ø4X}š|gÉ—ýƒL0JLO÷M=nêÔKså¨ùG'éX#I.“iBs†ÍSÕØKc¡:yiL z9SZ]ßX6/b-ë" õ¬uBLî-ïî%šÞ@Z>O®=+Ôô=P4 “Èë[­€ëéqŒçüÿ…qš£,Œöý?ýtÐT©ÆqŽ>µP¯S´øõìÒµ3±óøõ=ýIúTËâõçpÏâ}MAC|²ÍŸ^ óø{Ôf.zúúŸjC+Hœ·ùÿëÖLã9äwõ¦#E^¾Õ•(ãéÒÌ™ÎZÌ‘0OlôíŸèi úcáÿ…aןí7®éhÀ…Ty§^Àz÷5ìš§Áûsn%Ò æ,ž`ÝõÓ_*ß©‹“µ‘á·U½­Ó[¬¬Íl+p¾YVôlʬ>‡VÄy»ÖA‘+/ÄÿKVhÌ sIX¬ãMb¦5Ï_˜÷ Ÿ^¿^•Ïé„r*¸p$#çPzúVn×6[ÒݾÌîÎÞ>”­r]pÔ\á‡óý)›œšb-,\޹«¦#:úÔØg3€¦´dŸjHMÓFTtèk˜œsþEY,¢²%ÒœãÔõ¿ÏáT]NO¨ëïþ~”€öÏx®m ÞPñù_*ƒòäg­}GΈvr„I®<²p8“µ¾¦V¾§¯^i:‹íKJÊgôˆñæqÓ?ÞZóMoáþ§£XæþÒ³Îï>Îø›Y98ìOLu#šµ½ÈØùJóP•e”Aòœ`‚qÏcŒv¯›L•'ibv˜äãåX³diA¨_ÙœMGppk¨²ÖífÂÈÞSwqúÔ^ÅØì"Øê 0#`æ´¢‹46RFÌäžEhIoÑqÒ²¹µ…K\žŸ¥$¶ø?Î*Ñ“9+ä*1\tÞµ¡™‰7 à‘Ž”IÔŒûqôÿ>ÕQ“=Ýý 6/¯muKXÌì±\àbB>_£cñç×ÓšâÃI¤n*ÊqÁ©“»¹qIhz¿…•Ú!X pI«†0ÀçùV„—VQ¸;—¯µpZ‡‡-æùkŸ¥KCG‘jþÀ%#Эxµþƒ5¤Åá@ã£&Gò®YDèL©­ªØü³µF?¿÷¿?ÿ]nÚø‚Òá‚Üfô“§çX^ÆÖ¹è¶÷¨&F 8 äU»¿ \íß ‰ýžj£%-ˆ”\NBm xþúøVÆžËÆÒ? £3æy¤’âg–g/#±fcÔ“P¬ÎÂ2´l4…cjÀ²ðë_[xœiª³D@9(øàŒô®¨­y=l}l@\šé` è9YÐÂÜýå[‘œŽMP‰7*„mÉ}¨¼¶R¹"¸ ý2)A ‚¡¢*Õ|5‚Èæ¼Âo ÜÜÜ­½¼>|Žpª½Oã\³²WgLnÝ‘èúoÂ/[\#Ûê–v™¦Uws÷v“í“^™¥øwÄúΟ»¢_Ël›ŒBo&f8nÒ ©çø™Eyð\ëž:Ó|žäµ;;o ëWc…³Iä_Ïä-Y—~¾rFý5x<´²côJìI³‚é˜:½‹X݃å?(ÞÞ•Š9©:Q&)((èô+d¼Ôííå‘£ŽIH껊.y8ïÚ¾Û²„Y´p …UiCT€Tb®È­=½NÞ'qŒÖ½¼á@ÜsŽæµ3=@°¸Ô§›ÛÚN¤×Uâ(×GºŽ&•fßl‚¦1øœW–æÛçè´=5—'Vv¶ÚUœöÑJ²Ê7 npzŒúRÉ¡ÂGÉrA÷L×:ľ¨ÑÐ]Ï3Ô ’ÝÌs)SÔgŒQ\eÆÒØï^îêç³9;ÖUSÓÞ¸=?[—ÓÚñ’§ðæ± ø1® bÓnyfÜs‚£åü:×Íú|+ãY®š5¸“ì«$mm/+¸ àüÙ>ÄS…ùaµ‰¯9=î}y¥Å’¯!S0ÎSpû~•Íêªf’8B¶ÐrOLö‰®ß$yþlü¸SÜF+Fz‡ŠómoIM>UәÂÛvTvç½dìu+¦rdpAÐÓ â³5oC¿Ð¬äH~Ó‚ýÎ;z×®Ykżvkj§Ê“rÌì@ s¹Hþ!œÏw¯QmM&{EËÑ lžä×[ˈ-ÁúW%zœªÈë£Nîìïô¿ͤZËJ¥‹eYÝ=3Žõç×:¼·S3É#HÍÕ™²MxÕ*]%mb0³¹éÞÔüE}lÐitÚ“A€ØœÇµ{ àÌŠîbµñ“0[Ï N±É‹&? S…7%s ÔQv:ý{B¸‹Ã)}8‘eŠLHŽ*‡uô9ÿ¾«Âçldƒõ¯¨¦­Ÿ›¼®pœ˜Vç¥|Ýâg‚çÏ·c9\ã5•XóFÆ´äã+£Þ~_ZkÖ3é÷eÉ7\D_fWŒd÷RsŸËóîš\:g‡üC+è²C;ÌÖ ÃŒ|Û¿„cùÒ§/!T—4ÙÚÞÞ‹[VXæÎßyºdŸjò_V´Ò¾Î·rÀ­#ýì¡7éŸBA¦š‹»'•ËD~sÄü…i#îB†Sü,2+–çY º}¥Â`DZ€ãø‡ëÈüê$Ð! Ÿ!eAÉ(ÌHþ¢´V3gQj#XÕaT ®’ R$ÈâºQÎtzUñv‘³Â£üþUÐI~rOÐz×ÏVÖl÷é+AÛPk™±óí]^‘h÷sƤì›ñŸÈw®4¹™Ñ)(Fçè‡!Òl´˜íÔÚÛË‘·s®üžàõêÏ$6êL÷¬ãܨÿÐ@¯v4åk#Àç¾²Üøïã7Œô[ DŽÏQ®à¹XîmL2ªÊŽ0ì¸ã^:oâÝ%Œ²(e'®®ØOÞåfSŽœÇ/w͸"³c®kƵûC“’GfùVò")žig}w j_n°–XdÁG1»!e=GÊGëÅ{†|QŒÍe(ó[†\üùëÐã?†kÔõ=#Ä#ûJ1{μ‚¡FOwõ¯øÉq&£âŽ‹`…øI»¡-à‘ºšÐV>¹¬¢ürã½tv0Or [Œí<üÀb´I½ˆzh†öuÛuj³Ø€Ãþ?ŽjI´ie„›vhÝzÇ)òa×ñºÔds6Š–º}þŸ¦Ë4ðmUbÍó©ÇAØÖ}µß™&]²I¯´Z–§¹JIÇCÑ,,¯gpb€*­7ËŸ ë^Ÿmmi _·ÞŒ}B¨?Nõ´i5’¤Ô¤z6›âm3M•DJ|¬Áä{qSÞxúÊÛÁ,îSÁ÷MwÓ¼U™Ç%vr:Ô-… Õì`–(Ø2®æVžàŠùâŸ}­ê~‡i<±Ù£*Ƥ|„p;žžõÔâ¹yº“fÚè„Ò>x’þP5K˜¬¢ò?˜H=‚ŽsõÅq—~H›7O+É`ª¸á½Ö«’ÚÈꤣ&ãÔ¹}‘3Œdf¶´]?³ÖGBL±õöý+\ÂvRj;¶°_é’§ÝH€9‘â§KIîîÞêø—™ñ–Àü¨Hçlù–9zÐG#¡®3¸º’ú×_áùÈßÇý+xne-EŽå°>oÖ´à»Ã}î¾õê&pؽ}t³¦õ\W%ÂoY(EÇ̱øã¦~‚¸*¤Ú:é¶‘º5™縗ŸG8üªxç àŸ­asSA'uÅlYOL©$›sè2hZ»õ[‚Ïq„ïß™—úV¼~ ÓôÍÞt–öÌÿ1 gí£–?@kÚŒl¬yÍÜço|up Kxí£çmÆ ÅyœF9<ŽEx¦µiwzâcuq}q,æÀ#G¦ÕŽžõÍR¢øV¬ê¥xJ3{µÐX“l£hQ†ž½«Õt­JÆöÙ|‰bà¶@>™õö8>ÕŠõm£RH—=gÌÁ¨Äø)]>ëbµa¾#ýbþ"¼ãÑ6!ºÇ ϧJët)p²cûÿÒ´†äKcÐã—+×µJ’qšï¹ÈlùÁíÙXnsYá`1±€B’9®:»“v¶ Ó`’æ@«µþ6$-uK§”`¯qQÝCËR Ú:Ü’6!²°S™n.d葪Ì“Tîâ·€G-¥¼‡æGrJÃó­œ9UÌù¯¡³<¢æ$‰5 mÿ¾"Q¹†:n#¨¥³¶ÓìKIo232;³1'®XóÍvK™«DæI_SÄvÇUµEY`Ycl©çî:VM—Ú ¶Wšæ3"aS¯^ÝGá\§(IɽRUc*jQ¬Üý¡¤•a…RGÈ Ã#<Œâ¼Nâk6ñ®leh˜ü­ŽA„ö5¬Ï> µ©éZ/ŽþE‹RR­ÓxåO¹î?Qì+ÔPŠáÄᕆTƒœQI;”Õˆ¨®3¤( Š( Š( Š( Š( ÿÙÿÛC (B+(%%(Q:=0B`Ued_U][jx™jqs[]…µ†ž£«­«g€¼Éº¦Ç™¨«¤ÿÛC(#(N++N¤n]n¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ÿÀ¨ À!ÿÄÿÄ@ !1AQaq"2‘¡B±RÁ#Ñðbá3CSrñc$‚%4T’¢ÿÄÿÄ 1!A"2QBÿÚ ?ø` % Œˆ‚ôB Ã@@–P@Y@"€,¢¤±h)eì P¥°P(P (€  (€$£`s”Z2T[4˜S€0)´@¤u†U\ÚqeR Ò’e¤Ê‹C!VËdÀÀ¨±i2ަÌId"Q"¡l ˜Ã8ø#L¢"Ù²Ú`GG‰TK ©–À¸dÚ€ËDÙSb“8ø2Ó(Ȳâî(a˜”/€Œ¸4b˜ *H© )™p-!UHÒ˜F”ËiòpOƒMôZh€U#J@iH¶˜Á3M‡…Ðq¥ 4¦iI0)˜z~ËD™¥ 4¦iH i‘Á01-3-004¤iL ©–âÀË‚f%¦ÀË‹D™¥ 4¤iL ZdqL =3-JLÒ‘”)"¢Òf^š ÍA`]Æ”ˆ)›R(a™p°2àÌ5AR²ØLéeEta¤\L¸…Fˆ¶AT)S4š`S0à\LÐT -„U#JEREÃ8£.!Yq% @²¦R4¤T[€Ë‰ ”JPÀªF”€·`Ñ–‚¥€”Â*f·¥ h(J%@©lÒ`[%#ARˆÐ,¶R.àŠ( Ñ Ê‹eRØ ”F€”@ €€…²Ùl¨ Q „( f¬¡b‚¥€”(‚'@^[t  ”…ƒ F¤vBe ¨^À "€E,ä e²Œ0 °‚eL¢Ø°-„²®@ Y@"€(  (Q`T€$¸9>@‹e°Šš-&hÊ ªFã*`uiJ6chkAI 6¤m4ÀRbˆ,l ŽmpieR0ÆÐ e°.—JhEpÈâ˜Å™à•0*eÃ(ˉZ ™±`)3> 2Ó3dÍ)pi02áàÃ@g"ÀªF”€¶Ÿ!Á>ÃÓðe¦€™*R£J`\2=4øM£ 4ʤ”Í)m>L½4ÀÃÓhÍ4ÙT€Ò‘¥ 5i‘Á02ôüqk  °4¤iL © 02ôÓ0ôÚ-0²©¥#J`\28'Àzmi®B¡S©RaRÁm02à™—¦ÀËD ¶U 4¤iO<„jÓ)‡§àÃ@f€2©¥#J`kr˜pðeÀ+-*:G€$¤gpF”‹†m™p ËD !HiH£JF”‚.× Ù3JAR.ë(´Œ¸LÐRˆ@³JEER.”F‚£Dh@2 ™wR(‰´Ñš ” ¶TÀ»‹ih”(Í(”`[4¤±€%ÄÑ(*!@ ¶jÀX4F‚£B€”€”e°Š™m(J#@J@°@-€L©•ÐT¢4A@RË`P¢4hPˆG`QP€ …ì)Ù@ŒŠƒ#X2BÀ` X°¡l‚ØYUŽ[-”TʲޢÀ SP @"€ @(åå€ÉJŠ0‹t¥"§|i1@uÒ—ö²Oé`—f°ÈBM]ÅR² &0¡Le°*IÈꡚ(Ì•3 €, b A`[˜ÇÁ) ˜R`G̸´Ê S-€i3.%¦‰d €¶»2â™Q‡ZaR軀ҙT€8¦aéøËD°*f”€ªE´ù@G¦Ÿ›@f«‘aWqµ:Ò¨°2ôü–›L£5C‚ ¤iL )—éz~ 84Qœ„Ȫ¤mL#JE´ÐÁ3M”e¦‰’ ™T€Ò™µ$¢Ì½?aÁ™j€YT€ªFÔÀÖûäR`G§àÃ@fˆnФAµ#jVTLËÓ°0àÑš`B¦wRÒ‘«O#‚fŸ€2âÑ(*2 ¤iH#[‹h¡I™pm-Ò Ã 4™”&™P¤Èàš PeLƒJER*5¸a|q ËD¢¶TÂ4¤U"Z eÄÎÐ%€ U 5¸¶ š#AQ¢4TË`U#V˜  2Ñ ”J ™S ¶iKAQ¬h D ‰@Š (Y«»‹€%€‚¥ ‹`,©S/! #@J# ”@[*`,¶P¢4h”AF°)l¢ØQ( @‚Q €Xذ-— (¢hD`v`B€ü‘ó€¡@Õš +=€@…(,•<\1E¼ ذ*eL eP°(ذ(P ¤PT @µHÊà"‹(©–ІB‰šRÚ–N¿üÈ…rqi„ÚÒ™µ$È«†<(»ˆ4™B”Ÿdª£kR²ËvL€¢S, ™l#.%©[€4™|%wp“2à\Y,âîVGÀǃ-4ln¸¶Ÿ!Å3. £-4K ªF·[LŽ)™CÁ–šYwT)yáòeÁt\3]ÁZS6¤˜CldbZ^ÃFxf”€Ò™­À6¦fZ~ÃF@¶U 6¦iH †G§`aÁ˜ªTè )Œ€Õ¦SLË]T)¥3JI€qLÌ´ÀËFh*¦U" )SÒi‡Ê0ôüph+5BÀ&iH#JERò°Ì¸& ¸…@²©iHÚY$¢74(,ÒeHÒF­28¦\ 8…J,¶3[‚4¤[LÔ̸—4!ʘ3JEF”†‘—©D¢ @ Ò‘T€¶…(fˆÐ[-wRiŠQ–€”JÑ…L ¤U"#V(¢4e %‚¡(¦TÂ*‘lYQ ”€Ø°Š™«° %‚ h @ &[e²¢*Q @Yl bÊ( Ñ#@{”¢€R¡e 4F€”Fˆ¨îÉ@(€fB¨aˆðFEB0€Õ™  , ‚´ãŒ˜€8,ª@tNÈÈ%” jÀYl ee@P€  ,  @X€¥"HÞQɪ¦TT+Áh(›4¤m2×€:iÏl‚ºj*ÊàÂiv¦M­pASh褱I6ø&Pʘûn1iPj˜Y€”Âذ-“j8²[Ùl i“j`eÅ’¨eL ˜¤Àˇƒ-tº*pÜ‚#ŒY‡¦Q—Œä*©H"ÚxhŽ ‡‰”³J@U"Ú|2ôئ¹R*˜R²Ò`eéø0âÐà&ÐS6¦”“äŽz~ 8µÐ4TÀªFã04¤™Sà ½3-t*`U#j`iI>E)—¤aÁ 2ÕÀªF”€Ú™m0#‚f^›-T€Ú‘µ0-¦GÀÃÓf\Z ”, ¤iL#Jf­0 ˜zaXq¢-U#J@mI1I•p0àÐVhPQa–™K fÆ.!Rˆ@-S£J@iH¸eDpLË€V\I@@AlªEHÒEÃ# í ËB€…L•H#JF“@ZLŽ eÄ”!ʤ“Ñ Í #@[©•H ™~”J k (€l¶¥"ò¢8–‰AJ#@@ʘ2ØEh”¢PT*`TÍX@Ph”((B `[-”¢4ˆÐ¢ l¶ F‰@J%E°˜UL¶PF‰@F…Ü€@À @# ED 1Ñ_$°  @€ ëh´A 8´Q–‡@@N§dK(YSÙPËkÈ0˜ʘJ½€( @€(€9ê,Š *F°ÅxL©¥"ªa]à÷Gk9J.,“FÔÈ4še %47R*vEZL›_@L¢¦hÉaF›ÁQŠ%Yº*`[.Ž>ÓYS¦\0#†e¦€[€ªE´À8£.-›¡¸ ¤jìãa龊0ã$ø%€ÜU2 ¹>ˆáŠŒ83 4˸ )‡L ¸#. pÈL*©SÕ¦Gø i  •H ¤iKȳ2Ó-è ™TÀÚ™«Là™‰i´Z HÒS5i0ôš.-€-•H ©šÜ˜³OÁFZ&QÍ)j36¥d Ë…ðTaÂŒ´ÐP&·SÒŸ’ý,àº0àÐV(³J@iLÚ˜ 28.€Ä Ì´ ¥"©iL»“*#Š&À¬í,V@ÛtŽM°Ò‘¤ÓÒf\Ë‹D ¨[ Y¥ )´P¤Ì¸‡PT ËdHÒ‘Q«B“8™q ÎÒP !²ØHÒ‘Qm °#‰(+4J'’îÒ‘lЈÐVZ–Al¶TU"Ú`(Ž F‰ARˆTʤR-€ä–‰@(P[*a2ò¢4h”¢ `,»‚*e4f‚”J_` ™Se*J È œ ˆL ŠÀ‰ED¢4Etll&Fhì…D B0Œò޲ #@¨ºvtQR.Á–š5S:§` A—ÌJ †(¢:iØd‚Š™l eÙl•0-–À  …JÊ€ , ½€“V€ãÁS*.x”T´¤\0| h#Q“Mß×@c lðEL£Jl‘‘pÊ#‡ƒ4ÑR4¤´Å.€e*º*.ãVEGLË€%4©À®™—Jh&L©€Ã#‡€2ÓBÀ»Š¤Ã2ຠکdÒÓ2áQÎZO£-K.તjÓä#. ðaÁ 2ír.€»)¤ú#€qhœT)¥"á—§àÃ@eÚ T)­É‘Á02ôüqh—pS4¦­2=4ø›ÓhÅPè&ÔÍ©q#/M>Ä´Ú0Õ*aZS6¦«O’8&%¦Ì8´ÉT‚ª‘µ0nE¤ÀËÓ0àÐVi€ šRÚ™¥$“2ôÀÃFh(Tè )S Ò•†“*2áàÃ…f˜ÙS¦iH#J™v 34r ¥€i2¢©Rá‘Å02àaÅ…*ˆ²¦”Фm1I—.!Rˆd f”‚4¤[LY—¬¸‘ %€TÀ¶iH¨ªVPeÄÑ(*P,#JEL d ¨Ñ( D @L"Ù«È 2Ñ(*Q[¦TÂ. V€”J- €YS Õ”"QQ()D,¡eR»‹`(FŒÐQNAÂ*bÈh¡D ”€DØ2¦J#^Š Ø -@ˆÑQ(€™—€'eH䀨ˆù €i; ˆ Œ¨°i¢¸¦A6ôÓ(~—¹µ \Ø !SGú9ËN¸ ‚fÓ°# ʲ߆Al¶P-Ql Š€¶¥€*(@T01¨•è TÊ.âáv€*f”ˆ«†tÒ{qÑCR;]® ©µ$ù-'ÁÛà™ES4¤@¤Èáà MH ruIJ™Fe˜i %µÉTˆ*•ŠLáàËR^à7y5¸ YL ¸xd{ ÅRJB“. ´Ð ÅSJA¤ÀÃÓðaÆH¢ni—qSIò—³/MôUa¦‚aHª`jÓäË‚|‡‰”2©¥$)02ôü3.-.Ф”nÒf^˜”3”LªL ©–âù@GÌKM–šÜiL+jhµ—¥àæàÐtR6¦÷ Œ€ÃÒðaÁ 3A6”)µ2á—ø0ôÚ-4ŠF”€Ú™­ÉòqLÃÓ Ã‹D  •04¤mHˆ¶Ÿ!Å>F™—€Ï"ª‘T€Ò‘«ECjfe¦‡%*`j/'UÀF%":`M¶G¨Ó iHÒER-&Q—.!Y YLÒ‘Q­Ö0ÀŽ$q Í€€‚Ùl¨Ò•H ‚m@G-J#DP³JAHÒv Ž F‰AY -l©„TÑB¥€”f€4@Â-šL È 2Ñ(*4Jl¢¦[¶ #D  L"Ùl ÐhPT¢Q`[-„9(È@PY²ÙQIAQ¢4A €°˜Ê«2ЈÑ@œ€ E²ØÁD @aòF¸ ˆœ„G…‚ V’³¦ÕTJ®r‰ˆ€Q•a4Àè‹Hˆ¨F‘–¨,GÌ=?Xq¢p³%X1òL©Ð2¦±» U#I[*eÊAQ@)l@…@ @JãGh”¢Ñ2€©šR¸b‚®QT€ôiµ8í|˜qWîØúÓJ~N‘i„b̸5Á-®M)¥+-&ÛàÔdÒ(Ìdß&œ‚‰±>¬¸´75ÈS*•€i3;+€'Ô‚R²ÚãaÁôú—()¥"© 1f^›è£-4¨ƒJeܘ¤ÌKO´Ê9¸Év@ªF”Ÿ(Ž ð0íU"©iL¿Kè+. £.-›hªL"©³[“åq‹2ôü†š%¥#J`kr|‡´›èË@N ¥î”Í©y‡É—¤¹@aÁ¢d´iJ€Ò™µ$À8Æ]z^ËFr‚ª•RÒ™¥$ÀŽ1fŸ€2âÑœS*˜V”ýÍ© ‹I™–Ÿ€0àÑšeR Ò™µ0‹i‘Á02ôÙ‡‚¡S »)¥"á•Á”(+ S-iHÒ™QpÈâ€Ëƒ%X¬›“¤AÊÅ”TÍ&˜“#€qd¬€LÒ‘”…¦T6¦eÀ ¸²PP,Ò‘QT)¤Èâ\IARˆDTÍ)jÅL¸…F‰@J *‘QT)z L´¢PP€[*aH (FˆÖ”@€™«ØäFh*Q(ÀYS»‹h VJQ()D@(°-–Â(Q–‚•DÈlXË`0ÅJ#X „`¦lXER‰@J%;l¶±`R4kØ„²Ø¢Œ ËÈ+°#x ÉäP ް+5FZFbQ ¨Q Tè GQ§gxMKä X")Q@”€(Òg9iø-tEE af@¶[ÙleY ´\ ¢‘¥$¤ËeÀ¨ ;(€(€( %I$×qk#%BÍ&pÅÊ*L¸`n ÆVtÕJ”Œ©'È ©ð]­ÜÑTÈ-¦"ÀË„—šä )š»@tý8¸£:š[x(å”U2 )YpÀMteÆH抦­4G°#Ó}39ˆLÒü‘Æ/Œ‡¦×¶žPHÒ˜ÓèŽ|‰iµÁ—k eÞÜ™bÀÃÓkƒ 4TK4¤Þ\02àŸ Ãƒ@L¡¸+Jf”‚ &eéø Ë‹D¶TЦ­28§ÀzlÃMº4¤”Í)&pLÃÓ}–š%ÐR4¦”ü‡°3-?è •H )›S[“#„Xz~ 8´ʤ”Í©m>Hà˜–›0ã\ ¨U )S Ú’dÚ™Fe¦eÅ ¬ä¶ÀªF”Â6¤0ÀMp ¬´Ðf”ˆ4¤iH¢Òfe9¸’€ ÒeR(Ò‘i0Š£àÄÐVd YS©R*5i‡(ËAP,©”iH»‚5†G\|h)D ¨Xq¥"¢ÚaÄâe ©D ‚ÙT€ÒÁP¤M J3AR…Pa3J@ku€#Dh+4J@L ¤i0‡$ #Dh*Q[©–Љ@e¢PRˆlXF“*v‰@F‰ARˆ0!@¶, YQQ(Ùl¨¨J%@!@-,©”Tð %ˆB€ ÷Ùl J(”JP !Šõ‚¢D`bD] 2òË „PÜ#l´FeP€eÆÌ5E…@`uÓ›¼”°l¤ –…ç’8EôQÊZn<ÿ%U·Ñpú.$¦, X°4™lŠ`P )ÐSF“*4™l”@  (€p’¦**hW¸ h©…iH¸`+ÃiHí¥4þ–Q% d¦6©¤Ô¹+ÓO‡@aÂI…&¹°4¦jÓ Ž ðM®,šzŽ©‡«¹ç¢…¦G² ½6¸%ÉTÍ)X¢Èô×L 4ÐSh )š´ÀŽ ˜zme0%ÉL )´ù@eé§Ã£NKŒ”fÚåS Ò™m>@ËÓOƒœ´äŠ2í ÄOÜÖåÙQ—̽6¸ÈV)¡`U#ja“2ôü00âÑ2‚ŠFÔ½Â4¤Ÿ!Æ, ËOÁ‡¹ –iH )–Óä"8'Á‰A 3”aZR4¦«LM>ÃÓkƒ 4º*—¸S.äùãaéø-€4¤iL )š´ù/M3M 3M `]ÔmL )— ôÓàæôÚ-48 ©šR Ò™«L¨Ž ðeé°1µ LªDS4¤™P¤ÌËOÀphÍlƒJESi®ÃŠeF\ ¸´š3qy*:® 9[,›B£‰š[ ©šR*.á†q3´*4BQELªAÜ0ÀŽ&\B¥ ™T€¶\0†Ó.!R‰D Ê™Q¥"© Š.$ ¨ÖI@ʤw´¢4¢PT¢PaʘÀ‰ARˆÙQS-pJQ(+4…e°‹e°- DhÑ()@¶[ YJ…Y(*Q P •0-€JQ( C €-„È-”¨Q ”F@@, TʘEˆÓ4JQ¯X* 3/  +äI02B*¬³´!V) jÀÃ4€j€Œ€ X¬‰FŠ Ô9; 4Š™C(âJ@G¦¤ÎZn9NÌYE^ÅÃ.>Ë`TèÒd2€°¨ A6»j~M)X*eB”@R€(i5“ŒÒRÀ¶QTZa ð2‚ª•R@ZO€­;@w—×§k”sSÉÔ“ämO†Qhnh£Je¸Ë’ ±>—"‚“FÔük(¿£‹]”fZr‰•6€Ò™¤âÈ#„_2ôÚà rEZ€mM ‹/OÃ0Ô¢Sk“J`[LŽ ð%µÈLÚ˜ék(ËÓ‹áÐÜ$‰¹®@ªtiLÚÌ=4ø*0àÑ›h*©SÚ|‘Â/€0à×v‚ ERJI†¢ÀËÓðaÅ®€]H )•I0)™zo 0íÚJF”€:|‘鮘phÎPuSje{Xzk¦sph ”˸+Jf”Â5i‘Â/€0ôÚ0Ó\€²©¥#j`_¥™zk¢Œ84f¨€™¥ 4§îkw-E™z`aÁ£5AK¢©iLÚ™QpÈá|aÁ£5@B¦A¥#j`jÓ1ezfXU#J@iH¶™QWDp ÎÒÅd ÎTŽv@²©TÊ`eÀËAP[-•HÒ`)3.>Ž$¢* ¦[(Ò‘mPB“#ˆThÍ*`U"¦T\28#ARˆÐ˜3JAФ¢PT¢4 4˜ER4¤ %Q(*QÙl ey4F€ËB‚ "²…–À¶(Ñ( D … ¦]À[QQ„@)oÜ—¹l"‘ %*Š.€¶[A %J%Q€@ `[-€%fƒ@J ¤¶Ë`,¶°£.4UJ ²@f&ó@CKI<Ѓ<…BtÓ³«%Td … ƒ%‚%“n8*1(ø0 ;~ž-+M09Ê` 3´XOÉHŠ,@¤ À™A?9ËI® [\•U;.Åôg(SIà¶AS-l¶¸&o€ŠE(@E°(rÔŽl p,¨  ™¥ .vø ™ERí¥©LºJV» Å4U&ˆ5O'DÔŠM5ƒ2ˆ6ÇSÈúYŸh‚e4õQEz»ŸÓ ÃÓ]q”@)´mj«LN/Œ‡¸&æ¹JfÔÓ8ÆF^Ÿ€0÷Dª`iL¶Ÿ Gø0á%ÀsESkP¯l€Ä´¯ƒ›„‘Fm¢©ky^ÖQ‡¦ºfZ–ʤ”ˇÈé§Á‡ .€–ÑT‚´¦]É„S0ôü–šåÀÖãJ`[L›/M£9@£J@iKò‹LË‹@L•H ©šS°+ŒY‡§à 8´K *‘¥06¦_¥ô^š|zmšhXV”)„iKÉZŒ€Ì´¼qh —pUR6¦­Èm‹ÓðeÅ ¬–ÀªFÔÈ4¤ƒQeF\ 8ÐTªR4¦A¥3XeDpOƒ—¼—pR4¤¥L»@ÄÑ΂¡H*eRJEÃ*#Š2âÐVhQ¶3JEE´ÆÛ.$ ©@À²)H"Úbq%R€`U,•H¨Õ¦)0#D ¬´JÅ€LÖà‹¸¶‘ ËD %Â-•H `h D TÀ¶[@(Ñ£€²ØF¬`Õ‘ ¨Ñ("¡l–Â-‹°J@Fˆ%dËe@P‰ARˆ>‘K-€²ÙE#4J VÊ Ø Yl"Þ eP`‚4F€”F TRBØʘA2”(z#6sä ŠÀp¬Ç %àÉ –@í¶%2¨ÈŠ,F;™¡­”òQ𳂠5Dn¶QÙ,žL=;àƒ.4€ßL"ÙH ™Xaph´hË@â¥Êœ´kí1REULaò\|ª™«Ùl‚Ùl ™o!]`Õ|„RÙBÊ €@ PÔŠ«¬œö„(&U[EpTèŠÒ‘pÊ.Ö¸;Ãþ¤)ò€åm:f”“ä‚íO‡A&™EÜÑ¥©ä‚ÜYšé)Ä)´”ü—( úmý^I(Ê<”E6-K ¿LŒ½/e©G ¦ÐZ†®2]—¤Ÿ%&æ­@4¤™"ÀÃÓkƒ?T|TüšS÷ý2äËÓO†\d‰¹ 4µ<—zÔY‡¥á”si®‚•TÍ)€j-z~FZè[@U#JAWéhËÓ]aÅ¢]iHÒ˜E´ùÉà =6¸3MR4¦”Ëj\š|ph ‘¸ )RMS2ôئº T²mL nO’8Æ\—¤ú0âÐÚ*V”Í) ŠÔdfZ~Ü'TʤÔÍnOf%¥î\Z UR*‘µ3V™DpOƒM‡€QK£JDS5i•Ì=?eÅ¢plªDR4¥ä¨´™—ø.   Lƒqg^F‰†L¸…JʘR4¤TZLË€V\Y𠲩iH¸aÄËF‰D²©R`L´%(²©iH¶#ARˆÐ€[©–À¤h D ¨Ñ(P[»Š ÐVh4d[Y«(+- %!H •2¢Ø°)šQ((@  ¶TÊ4¡ è‚ÝÊ‹`Ñ(*P!@ˆ-•2Š( D 2(!dBÑB–TÂ-Š 4giDh” !D-–À©–Ê;‚ˆFA‰ø"¡ØY" æÀë¥Ù+QÑ‘™4X@ÌH",¼Ko†ïr2ÊË *8¦s”(ƒ'M&ž ; Ðh&©28С”AT¬Ò €&PàE h ´Ž-(Ÿ( Ê ®(äàãî2᢫. À ¬©TʘŒ½ÎŠVˆ£TTʘÁE@ÊTšŸiÅ?!LRe ¤à ™SAV¼  *“:iêT¬º°Œ–õÙÇkè´n3 6š– ô×LƒZ mn:—ɪŒ‘^Ÿ‚f<ÛJwŸE–ªž+‚Œ5ìeé¾™~¤U¨ÐZˆ­B]‡§àËR@Ú:-@/Ó.ŒËGÃ2DÞ× mj´ÀN/ƒM®Í´U06¦‹ôÈ =/ ÃŒ£ÉDÜʦA­éòG²Œ½7ц¤€n*˜FÔï’8Å—¤ï) ª¤U06¥a¨È#/KÁ‡€–Ñ¥&”Ëi—¦Ÿ\< 4¦mOÈ¥¢=5Ðqh€]ÅR÷[“äŽ`eé´e¦€YTÀÚ™­ÉàÃÓh S ­Æ·µ$ÃŒd%¥\qhU ­)›SÕ¦G¦˜Þ›Fi §ÜA¥#j^JŠé™zwÀphËAL•2 )S(¶Ÿ$pL#ÓfZ …L‚©R*5¹4JL ¸hUŠÉg 1a2 ¤i4Ê…&G2âN…L‚©R*- â˜p2Õ@@²¦Q­Å´i3. F‰DT Ê™Qw°ÚÚJ ”2£[‹¸ É  %€(¶U Š˜h‚²Ñ(&[ªF¬  ,"ÙT€¶…(ÍJ% ˜E²¦R4J „ Ùl"D ¨Ñ"-„À©”ª”F€”€Yl e ”F€”J(€€X@[-S)D«#@fˆˆD@P™G¨FFAÍå„Q§à”AžX“¥@a F6wJ•­@•d È‘…e³<²ÄtZiS¼†i…'™A38°;ÂVªDÚ¦Š›@)?’8°2â2ˆŠ¤i4*”€@)@!@TF#ˆq#@aÁ3›ƒ\Y¶¹5i/ƒ4Ð`[ɤȪ™¸È›­ÜS4˜Q¤ú("€EØ€*(2‚–Ê*tkp L›@pU 5iŠðßBV¶¶fW S )"Òož Û@U6[‹äÏ ÍJ=TÚ6µ<€Ç(¿§'•ÙFd¥L)´Aµ¨Ÿ!Æ2à =6¸É.IV¥Z‰òldbZMpÀÏÕ­FE©|Š„€ÃÒðÌ5(òSf– ¸¾HôÓᇧ$fÚÁES4µ,‚5z~ÃM>ê(Ò™­Éò"Ì=6» Ë´‚4¦krk G³/M®ÎPR Ò™¥%Ú8Å™zo 0ÓBª‘µ0‹ô³Mr€ËƒDÊaUJ)„iJù1`eéx0âÐÙ¥ 4§îk ½4ø0àÐ()04¦iL jHM>ÃFrNФÔÍÚ`eÁ> =6€ËLU#JaS/ÒÀÌ´×F ÍQl‚©SJWÈi2£/OÁ‡‚²TÈ*‘¥2)ù.F\<ph*P°*eR Ú‘pÊmG9 ¬4Bl ¤iH¨Ö.h*È*eRJEÃ*#‰—š% ˜2©Á6§ÀÄJ%”TÍ)[B€›HÐT¢PD[*‘E´”F€”F‚„©•H &0ˆÐT¢P [-¢Ph”RØÇ #@f…FÊ-•0‹b€”JQ„ ÀYl¢Øä Ñ*0@ `[ ( ´J@–È-”FZ(”F ERÇ` `jÁP¢PT¢P€Á°TFfOV¤€‘, "3'l+!vÒ+6b´Œ|!‰"œ™­´j!d**F€”M Gi®@¡Å52 âði06™Pgin€¸dØ\Y>¢“4¤S4™ h#ÈhŽ eÄ›o 1(YÉéµÁU2¹E»8®Hâ×@DPEŒˆ7l*]H#jF”€Ò)@¼JÊPÁ§td¢‚ eR(Ò’ù˜ ­ h FTzjÂû@q¯(ƒJFÔ“(® åq’ ŠMZž@×Ó%“/OÃerz4µ>ŠðQ%ª§+kqŒ¸dF“\;FmÅ…ij3[âÖ@8B\32Ó’÷6×&–£@iN/á{‰iÉq“6â–£6µäŒdaé5˜°0Ô¢U:kP·r^’|3E¶Š¦ûJHŽ1`eéµÁ—k F”ÀÖäù#„^SÃÓkÜÎPJ)«O’8'Àpkƒ6ÐUR4¦­ÉòGÖÃ\¦€ªERj} ‹/OÃ0â×(´U 4¦kr|€qLÃÓði ›Jf”€µz~˃FrLÒ˜VÔÊÔd—§àÃ@g‚îh ©šS_K2ô×@aÁ®ŒÓAK4¤”Í©&Æ,ËÓð‡ˆLÒ‘”Í)&PpOƒË‹DÈ˸ƒjER²…&eÀ#.4(Š‹Èn‘ÍË% hi(‚ ¦iH#JE¤Ê¨àaÄ @€™S*4¤kuò“2à—P@²¦”‹‚¢m#ˆVh”@,ÒeEL J%3D !E²ØER( %(Fˆ±`]Æ®Â#AQ¢4h•Ë`, FŒÐT¡@AdÙQl¶”¢P‡aNÅ,¶T[(”¢J!@XÅ[.Q(¢Q0„À2¦TJ#@AÁ²¦AS#‰Fh”¢Pø€*`TËaÑU–ˆÐ‰DÒCœ²®y`G…îd Ù¨E¶ˆ±ÝaR#2¥€ Îrà¡Ó:¦™Qà ™@  )Gm`BЋ”HÒ´M G Ei?1(Qš eR"*‘« h# *EP &ÔfPLç-?`¬84±‘º¹(¸&ÕÐÃÁš’è R肳;Š4¤n3¢‘¤È4TQ@JÉÂKê`@Ql (¶”™¤Ó@6¯&ô¤á/`5­²µÃ0¥ä a• -°¦A­Ñ—(Ž ðÊ2ã$š Úòj-'h¢½,®MÉr¸ê4kz|«"£„eã/NKŽ 3¹®lÜu Öè¾Qœ_ÚÀÄ‘74ã¨Ñ­Ñ—(ôâò°bZr\›hÒÔjiá«#„%ÆËÒk(øòQV£í›Z—Éí—F%§á”aÆH›¨ )×eÜŸ "øÁ‡²m¦iI )—2ôÓà˃ˆº4§@iL¿Lº@G¦ŸZ[*S-¦pO†aÁ &B•µ3JWÈÆ22ôß@a¦…´”™µ0-§Ê#ÓO€2ôÚ3”HÒ˜ܘq‹/KÁ‡€&U 6¦iJù 8¦aéø(Ë‹]!UHÚ™”ÃQeDz~ 8´œ–È*‘µ0nO’mL£/N¸0âÐS(ªDJ© Ž ð— 1LNˆ*‘­ÅE´ÈÒaSib²›9ÙʤQS5I 8(¤ .à4¤iI2¡µ3.Yq¢QXLªEF­2mL+.$ %L ¤[EE¤É´ ´J"¥ÊФ[°.Ð…e¢PØE²Ø”h”(€lÒBìPŒÐT ˸ ˜Ñ–‚¥ Ùl J4J ”!QBË`,¡ %(” ¶D,¶%F‰X(”F P¼•0-ŠQ(‚ X²S¦TÊŠJ"¥Š2ÐvÀ¨¶ð[‚‰Dhƒ5D =„f‘™:F*Ey`G„er—?XTG}8Ôl•cF[2-€(-Y6”M¦’4…ÄE ™@Q( @*42‚*Ÿ“V˜Ê€8Ù—€‰ÑLâÑ(*?`¥DF”)&A´ ùòPÚe¦Ÿ(ç-/rzuÊhÎÖ¸vP¶¹_±T¯Ÿä)†‰±t¦e¯`2™¥ 4§“¤fE+4™“R¢Š  bpmÚ›N, ¢‡°.ª@z4äµ àÿ' µØš*R³N1¬02âÑš ÚÔ-Æ\<2+\”z#ªÿJÖhç½>P¨¾ ¸>€Í´j:½ê\¢=8µ†A— G¢)4£ªnã.PziðÌ8Ê=Ú4µ5º2YDzIý¥p”H¤Ñ–£5½>PéÂ\–œ—(͵ÈS`mNÃŒeÐz~ͦ¹@)ûm>HàšÃË‹D¶‚´¦Í)à!Q‘—§á—ˆ¤”Í)^Öeéø-ÀªFÔÀ¿K#ÓðZ HÒ˜´ÈáÀ–œ‘œ *lª@mOÄ€M>‡‚§H#jf·'Ê Ž ðbZl#4Ñm…U*6¦m28&^i ¢eRJf÷'ÈÌKMôZ 6iLƒje´ÊˆàŸ ÍPº ©šRJEÃ*#‡ƒ,+4-•H ¦m%EF&Œ4(„ʘR4šeAÅpaYh¥*4¥‚¢á‡—-JTʤTiH¸h ¸‘Ä*Q(€,¢ÙS·b€”F‚¥€**eܬP‘ ¬Ðh[¶TÀ¶‰@(”š,¶l¼#AQ¢@P²¦l¶ˆÐThÍ[°ÚJ ”… …°jÊ %€„ ‚ e°¢Q( @# ‹a2"”¢Q(*Qe° š°(¢4F°h(°-–À©‚¢QB½$y+.ry" ׈‚K,p€æÀV´ãlìfª2Ñ^ @R6o%»4‹eY(»K´"m%(P€Qy &[ ¢ŠJQ6ø`L¯sJ^@Ò•›.&v°' âe¦€Ïð2» Ò™µ04™Q‹E F’ Å&Ú»V„%Æu4%|£‹ôQ‹¦*KÜ(¥\šÜ˜ ©™pðÚÐM¦”¨Üué›R÷H¨ €@窰™Ì)QE -ªeT¨7Z;j­ÑZ‹òÍH¸`]¾ n€›Ÿ“[“å6'â8ÉRhÒÔ é +¯&ž„©×EGš mZÞŸ(8F\02á%ÆH¤ÐZŒÕÆ\ #ÓO1f\e€ŠmZ¾@ÕÆ\£/JþÖQ‡D)´Aµ©ä· t^’þÖaÆQäæ-F·F\™zq|2Œ8I¶€Ò›4§`G³2Ó}fšé…* ҘÎ ¦eÆK ¢tU06¦Ÿ#lXF›èËMr€n4¦”ì5e¦ú3Mr6ЧA[Sò*2ËÓ}qk ʤÔËq|—¦Ÿ ˃@g(ªL )›S°¥E™z] Œ¸´K©S Õ§É—ø˃DÈÍ)…iL×Ó Œ½5ч€ÎQm ­)S Õ§Éà¨ÃƒFj‚…R Ò™µ;*Œ½?Xqh€[*‘”)'ÑP¤Ì¸eƺ%j+'Fê%Ü‹v¤Ã€V\Y04¤Í)•Ó#‚.&hŠ*lªAR.Dq0â¢,©¥"ÙB“&Ð2Р eL ¸¸a #AR‰DE±aL¢PT¢P€Bʘq@”J QšDØL#J@ ¬´F`[*‘QHУ4”TʘE°hJ²ÙA0D#ET¢@P²¦L(”¢0Ð@,¶T[(F‰@+èà‚Ø°-–À¶P%h¢Q(ÀYB[¦R«»2ð™Ys*AUø‚ òI>€À\…w„vÇÜÓ0¬»ä'ä.ú(TY.ÒÄ6/’¨¤i$‹h!h›€]‘ P¨f“**h´€”JJ^åVŠ*—’òA qLˆpÀËM²EU&ÇSɵ$ÍT!H©y6­g „óxÜSe‚8´Ì†ƒ. ûÙ.˜úÓʰ k»4ª^ôÓDzm,ú—F”è‘Ô:©Y¬¥ (Òj™ÎZo 3T,¨¢€e0/"‚ªlïéõ?¶\03« “hÍ0 ´mH 5Œ¸x`O©j? [O”L‚+‹=OY½-Ñç†Trr¾IQ~ÄV^›»F~¨”ijr—(‚8'Ã&Ù "“FÖ ú$eéßÚÀÃR^J¦ÀÚÔòŠÔ%Õ02ô¿ÚìÃR]U6ijyÉjꌽ/ £ J=6ˆ4µ q—(£/M> 8J MÌҘܟ$p‹à#/M£9@U"ï µG§à#4×!H )šRO”Â2àÃÓh SER©šÜ€8ÆF^›\œ¢©0*›7¹>@Ž \zmq3M `iHÒ˜£.L½+à 8´L¥#J`iI>Fذ2ôÌ4ÐQ6ФÀÚ—ö´z~ íh š°4¤Í)XB”Œ½?eÅ®I”LÒ‘Ôˉeéø2àСlƒJLҘܟ$Ú™Q 8° LƒJF”Š.Ú˜ dÌTÍ)m28¦TG4EBS4¤±I•ÄÍJË`kqSEE¤Ì¸…J%l»Š‹‚4€8™h)D[¦,"’‚”F€”@TÂ-–À€Q(*Q(°Š™S( ´J €l"ذ-Y4F‚„dÙP²îÚ (J²ÙQS-(” d -”[ %J%(8[QS/!‰AQ¢P@ ÅÑE²Ø@PTh”¢aðT´˜²… 3D %t E°êg9¾€†–”BKÁaÞ@†ô£l•c»0Ù•UÁ*À¨G‚n,EÜMÅDÜG&qc" #[|!¢¢QRd £D¦¡ 4¤“ @JEÊE !j̸Z2È«mŽ­r¨#¬fŸf¬€ !H* Ü%_t’UŽÏÖÍF‹R5jE"8ø2âÂP@-v?N/ØŠŽŽbíx"ÔkîÑN2쿦˜z^[¡Èc4ΉQP€Ê_q쨅Ù@ªf±ùôót±÷DóÛ\…iKÉp®‰º€ª~KQdV\áØ¶¹JgM6¤öù*5©éÜcvpjQä(¦Í©§ÉÆ/Œp’ã%Úy4µ-Æ\‘é®™FZ”z lƒkRËQ—°zOûYª<”U6»6µphÎPHÒ˜S¾CŒdŸƒ.-¶U 4¦iI0 ˜ph ÓA0­)Ròi3/OÀ¦‰aUHÚ˜F”“)…a龌´Ð‚î Ò™µ$ùI™p(Ë@äÒ‘”‹i”G̸4h™ ©›Œ€è¸¶bTÙQ–Œ´EJ[€Öâá•ø3·Y AlXR-¦P¤Ì¸(„¦LªEE´66™¢(&TÀªEÃ*F‚³Bˆ%Š˜°‹eä D ©D  eÜE(F‰@ÐA3V‘@e¢4-–À °%‚¥ )l ™@”J ”@€(¶[r:Q  €¢ô¦P(*Q(‚H-”¨rF€Í „ …” [ ÕŠ;I@J üû–È-•0h¢8×kȬ†-ë|¹vi•\•ø ,#$ aQ€ïíFkQYš¼N /!@yFx ·EF\­`Îà†âî ®‘ž0n:žJЦ™w/%BÈÀŸ€E,^J‹µ4j€ʘLJ±L …Þ ,€SOÁ—ØQ_F£©%Ê":-DÑ¢ ‘J«[ižoSj^KÇ+œ‹ðTmJ©F^À]ž™qö &ÔÇéÄ ÆX–“Î,+›Ñ‹öÓ”xd3(SU%ü˜Nñ$Ô‚Z{àøå†²ìÑšfì , å4÷ʃò‚~@¢‚¨°‹C tÑÔpšgMd“Ü–W*O†)üTšäé¹8ä#;Sá’¤½ÂŠM{S¾HÀIÅࣾ¤œ£_Ê99„O¥‡Ó²+7%Ê5FTkz|‘Â/€¬¸II¦–§’ýä‚=7_K¿c/tz©´mjZ¦Æ22ôÚá›k”XêW`oz|‘Â/‡@fZr\d͵ÉESf·§Íp‹áäÃAÊ*iO FAz~ ÓAUHÒ˜Eµ.HôÓᇠ"[@iL»“â™—€™ER ­)–âúVš|p’è tU 6¦[‹=4ø0â×@Khª@iL×Ó.@ËÓðeÅ 2R ­)šRO”p‹F%¦Ði ›AUHÚ˜Ó#‚|eÁ¢d(™¥0.äù)—fšÙTˆ6¦[L¢8'Á‡€•BÙR4¦·"8ÅðTeÁ™¦¹ YS ªFÔŠ/Ò̸[ÀÚÑRÈ“¤sleL¨´™p–¨”AET) ޲âJ …°*eR(ÖPq%L»ŠŠ¤\0©´Ž („`U"î*.ЉAJ ØE²€¢PThBË`TÊhJ#@BlXEZ#@J E[*eE°hF‰DP-„-€%J% .‹`, J%R€-•ÅIAQ¢4B,¶²ÙUHÐŒ´ˆ TÍ&°hf‰@ e°*f“*2âF‚¥=St¨ÁQ¸¢r¤*"DnÛf@é¥~Çc¶d.šT„2VTd%Ù‚8¾JXH‚ǰ-‹»™wÑEÞ7&¿ÐE°§œ…mI 2¡µk@, [öC+Ü Z(ËCg¸ô䉔ò€Õ34R`eÂ̸´Edªr¹Ò:‰ó†tNÀ  ­Ö·§^<Õ|¨ÐVQ¨¶ŽŠWÉ5ŽQ×IFq´þŸ‚åÇÔ\jI|œãªŸ±Dí¦žW5cýé|•WFjéðÎ:º*¤êø Âß‹:C^¹À㪙ÑI0)@ä’`AE@¶¿%  4Ÿ“Ñ¢Ö¤›üp”\eO ¤ÀÒhÖÀÆI_DRh ¹>†Ôò˜(ªLú?[Øû,´cµ»¦°ÁÆKÜ›šä+jb£/fpkŒ™¶€Ò›F·F\¢ôÓûY—G¢‚›FÖ¥ó’ØK¬™zo¦~¥É¥¨·§Èp‹áÐzrDÜ×%F–¡­Ê\…G¦žS0á$ÌÒŸ5¹5”GøD¶Sf”“èȾôÚà å<•H+J~KQ| Œ½;àË@,ª`jÓäŽ ðqh‰T¨Ú˜£#KÀqh&”Í©ß!F£#2Óð‡…ÐI£j`*22ôßL ´Ñ, )SVŸF^š|‡¦Ñ2‚‰ÑT€Ú™~—ÈDz~ 8µÐS‚©U#VŸ%Dp]qh*eÈ*‘¥"‹†G§à 84N¶7mL¶Ÿ%AÁ> 842B YTŠ6¥fÒ@bhæÐÍ)ÓQL´&Lª@kra¤Ê2àeÄ@•H ) L¨Ž$ª Œ„YF”‹¸!B‚¥€”@-šR]–€”JP ¨©–Â)( D ©@[Ò`Q€!e°9Q( Bˆ©@¨À¶[4J ”F€ÈjÊ€« Í‚  ,¨YpQ ز v ˆÑ(*4€e²‹e² (¢4JÀT¢4¶E,©l J#@f‰EB²ŠTÈi2¢ØQš ”Fºï'l$Tiá+/$“¤A†!cÑí‰L4„¯ @’ 6j úošNEF^œŒ¸°% "„ì Ù,•: ©•H¡fâÓí}2nh )›RÒdÛà¨e 0-4/ÎR&W¸ËEˆ2ò¼U¤ÀæZQŽ ˜qhŠÍ&X¹G†Duޝ“¢wÀ«TDyœ)Ò‚…P©QP¥ÉëÐÚá…AcUN™–©‘YœT¢ÓìñJ 5”tŒ­}\v)­’ö:5úÚ_ú£ÁÅ7Á0þåû65˜»4µe0:Ã]>ÎÊI«15›EE¶[ò Üdš ï­õÅjGòq´ù@6®™U ŽŠ_IL*l¾–š©ôÊœX7š|µ¥¹©®ù帪Iò‚£‚|28Ê>ÿE&)®Ð ±~Äpk€&æ-B \%Ê2ôÿÚʌԣÉV£@mM>r"ødVœ—%µÉF–£5º2åš|3@E&-@-Æ\‘éß #2]* ÒÔe¸¾PDziðÌík "lÒ˜´ùN/‡@aéÉ{’Ú©S]\c#N–ËM&€Ò™~—Ê=;á™q”ztiN€Ò’bÀÃÓðe¦€ªF”ÀÖôù1zMq“-5È 4¤”“ä8'ì^›\¦º &iH#jeúd^šèÃAP&¥3jk°¥&G§à 4ж€ªFÔˆdpðQ–™*‘¥ 4¤Ÿ"“(ˇƒ.-2[ ªTmOȵ‘À£.$삦vN¢ì—e ²m-P 04˜Ã*&Z ” •H )Ó*#Šdq Í–ÀªE´T)28…J% @³JEE´0£4EJ ™Qlh”(PˆyJ f…(BÅ€%@LXˆÐVZ%eE³V‘ ËDh ¡@YlŽB%‚„ €°*e°ˆ(*Q(€B€ ¶[ØQ*³@X²"Ùl*¦9*F‚²Ñ( ØeØL‚¦[É(¢8™hD eL"¦[(¶P#Dq éF¢ŠƒË$*)“¶A“zq¹",w a¤2ÙQ‡4]É—’±L¸%1’`Ô#¹špk„j%n MeQ¦ŠŒ¸ûÇØ‚=4̽³ú*̽ÐzR0ôäºm~2@À¶7j:SO’ŠÒøÐI®MÆ`m4Ê|§©_ koqdh×’[¨ÉIx eª%µÈŒÓ:Õ 3©£*Iá­¾ µå)ô@$¡jÌ84AŸfTÚxdWHêù:)'à"¢²:·hÎW*Í*íO†G,‡§|ŒNÍhËl¨¨õ^ådy#Lœ}FžøÚå䎣‹Êü#¨¿r+wÑ/ÿ•œâÞœÀºðãR<>NaWŽ wʰ‰±^ƒ”}Àï Z7Xœ•2 X²2±€.€ïéõ¸K‡ƒÙ&¿`3”U 6šj†ËV˜V~¤]Þ@Zcg†ú‘èôÍOt%ËXÍiÊÄÖÁŧ†Ê4µ·rˆá|0ˆÔ£Ê miM>PpŒ¸t— !¹®@ÒÔ/Ó/`¬½7Ó'Õ@ªlÞèË”p‹á˜p”}ÀŠMZ¸Ë”eé¯í`aÆK¢©4´§Ð{dz~†¤¹)4mL*ý22ôü0‰Mt‚´¦jâùAziðÌ8µÐ6iL )'Ê|` =6½ÉMR£j~@µteéø4×AH )šÜŸ(áÆ Ê œ¢©06¦iI>@Ž ðbP’÷9ERJF­>@Ž ðaÁ ©”€Ú™¥4À­FHÃÓ.-tL *•S Òi‡ÑF\2ÓY¥&A­×Ȥø.¢SE ¤A¥#V™DÚ™—2âÑ4™T€Ò•ŠL¡³%ŸAÉ€*f”Š5†G á—f¨€[ÈÍ&P¤Ì¸¢Q&”‹¸"á‘Ä+;I@LªEEÃ%HÑ(X*eE²€¢4h”E”Tè©ØEÀ ©D¢Ñ 0‹eP £D %…‹’€”¡¢Ùl ‰Dh* TÀ¶[ÈhÑ(*Q([¶‚‚¥ ”…–À Q(¢„È*e*J-  Í AE¤Æ ÄÑ–€ BÀ©š¼y#AYq&Ð#Y'`BËxx*dU²ÙQ´oˆ•“¹[¥g&È¡ßJ5òJÔl†™J‘ÂSrãƒQtàÙ¼ÍNæŽÿéF%é<§é¤¸AZn9¢Å× nі†äE- @0J@6¢8XzhÃÑ€#ÐF†y ÃÑ’2ôäº4ÐÏDSgHêtÐF®2|0¢r&ã0©Y\Sà£4âÍÆJX|€i|Ä£.…kÜ ,›ŒaÚ°J…F’IRðpŸÒÈ5§©\ðuå_E¼¯ eªœ€ÚŸ¹‰ixdW=²Nš*m<:éZÄŽ©¦°AJ0Üêèˇä°geðFšÄ¸(ÍW7™E\1-(µh¨±n97îEŒµ›2Àñú*{’ÁÂ,Šï§­Ó\3M~¬]ªšä¢iK˜O†rœ^œÜ_CH¨É¦Õ<©tΩ$¯&^Q È ¸b€d^2U]ä¿WJ×Ý®ÑmW±´þ&ï#éaÃÁ- ­-NžMBIIIa ŽºÐr{ãýÇn‹Êh§äµìÀŽ/§bÚJeú%Ê ËÓðÉõD#JlÒq| ¨ôâøf\eB m3J}6Æ\`˃\;[F– ¸Ë”G¦º`aÆHŠmmjé—AYz~–¤º¤kz|€qŒºÉ—¦× #9ERh ©ôÅEûŸ‡fr‚ª™¥0+Û#/Nøaqh–ÐS5iòzið̸4¶U:JIó‘¶/Ø ¸>ŒåTš6¦ú_$zi凈›@iMù6¦A~—Ê2ô“à£. rL ª¤iH é™z~2âÑ´¤iLƒJIò*0ôÙšh)f”½È4¦jâú(M> 84A+Ȱ4¤[LÔ̸4¡`kqT€Õ¦Gø(˃Fh¤èƒ¬2&×G6ŒÐT AlÒR™DqðgiTʘÑ(¢8’ˆ%-•H ™i2¢8™¢(Yl¨»‹†Œí"£D Ê-š»€Q"¥¢¦U Š™@”F‚£D Â*bÀ Ì´,"Ø`FˆÐQ¢%„TË`[hË@(AaʘÇ F‰@J!  ÅØE'$T¢4@YS(XQ ”( L e°( ¨@-‹ Yl ™nÊ€ËDh DYm„[4¤E[#EÄš E[*aâ²WɤI:‰„­5æEj¶‘êªTfµ™WŸVVéFâ:éÆÙô}/¦ÝMðmøÁ%ƒ[HÉ´M01-ú9OÓ'П¦kƒœ´dºM¦aÅ %2d*d\ˆßeZž@Ò’}–À`»@›I±0#ÓFŠ}eè"§^X†„o,ºúJÝȧ”\7†Tš:CQ<Mq¼¢Š¥Ô¿s.N<ñä™Ö5k ‡•ù×À6P3,£„ò'†uÒÔ¬0;<­Ñà&žŽ> ±ô–$×#Ù…GÖn>Äq²%(<u†¢—<¤é§Ó7”ÄDÅedmOÜÒ¹Î;2‹-àµ!ØŒ³“¼%äˆ5L±u‡Ã(¬ÅQ™E5M m'§7áð˜J™Ý·*Ôܹ÷ N*qß{ kiítxŠ}vŠ€–6þÇx;@hÄù¨¥ ”2La„(é£7§;ë°­ëÅFV³”ÎT€S*yjœrf¼L¢©ùý/ØŽ-p§ÓË~”´ß+(Ìõ\×Ö’“Qdpk‡aSs\à»Óä Q}ÑZà ¹£kRùôÈŽ pÀ–ãÉ¥0-Æ\¢=;ûXjQèªm¥4ùAÂ/‡2á%ÆI¹®p–¡^Ùu2ôü3-J ­KäŒeìeéµÀvº*˜ÞŸCl_ #. ( ¦Í)§È£%ƒ pœ®J¦Â6§äµ^›é˜¦€ªF”ÀÖ%É—§à+2Bè )šÜŸ!Á> ¸4Ê*•iL­FAz~ ´×(tiL )ù+QV^Ÿƒ 4ÉT©…mNËQ`bZuÁ–štU* Ò™«O’¢8'Á—‚³MÈ4¦iJÀµeÃÁF\Z!N)m28”GŒä‚ÙT€ÒÃEªií‰Í¼Ù²©¥LŽ> #‰’ eL ¤jÓ(Rdq4J 0.âá„M¨Ž!R€`iH·e 3D #@S*ehÑ(‚ (¶]ÁÅ %‚¥L¨»‹` AJ%(Ë`(B²ØA2€2ÐRˆ[-„,`‚¡–Ê‹c €”B( –ì ‰DhŠQ a0*` 3@[ Yl È #‰–Š#D-‹ÙS*/"‚£Fh D‚ ~åL¨©”*4eÄÑšÀtAIaÅ…fQ¤fnÝx mÙ"»èG™x:­£g-YÒsp³¤G»Òè¹KƒêéÅF)•ÑŒ­ P #‰šð9h'ÑÊ~šò'éÚèââÓà OÀÛ}U¦ßEý ðÿMO“Ok¢Ôù4’@nW“¢Œ|ž’¬Ö›°$´ßƒ›‹4âÍò€ËÓ‹éz}¦q#2Ò’à8ó“¬fŸ £inä’ƒXjÑQÏôdó ûŸK£+{•*(š’zZ›e”T”³ø ZáàW¸qg)Áßqœ_ƒštÀôijm«ûY×RÝ0µ:gE%ä‹МT€ä°èÝZÈVðgc\«D¤žQbÚä#|ªcNN8":-³ç ËÒ—ö³Cœ´ç&•墡é”{Y(ñúÏNàÿR+“”$EwU$eã¾yA¢+'=]5©¿`>|¢âéôkKSkÎSµþœíe?ðI­²S5Vè­X¯”sATTÎð–}˜—«TÈT(W‚*a^*ÖÓzm磄£(¶Ÿ(›-ùKØ4ÖB&ï# >†æ€Þž£Œ“;êh©8´éKü…pÔÒ–›kŸƒ M07¾ÖI¶/Œã(nh ½>PÚŸ µ ¤× mNùÈq‹ãG¸É74ÀÒÔó’Ô%ì^Ÿû]™ú— iM¢îRåá™q”}ŠMjyµ uF^›éØÊåM 6¦šÉ#.—¦×¹-®B4¦U$ùAQÁ>—‚"mS`kr|¤G¾$ŒÛAZS~M)§ÈAÆ2ã^›\d åL ©ß"¢ÀËÓðÌÓ]™µ0‹†GÓ Ë‹DM 4¤kw°AÆ-zo #M"+Jf÷_%Dq‹2ôÚà Ó]¶¦Ê¥|€q‹^—¦ÀÍ4JTiLƒ_LŒ½?qhU#J`kr}¢Ê2àe¦€pU&AT‹I”G\HÀÒ‘Ò.ÊX98J :4¤“ò)2ˆáàËD`TÍ)m0Òeq%@³I€Ã@ P[**i†¬*4Fˆ@U"£VJD¢*Q2Pà¶l¸P ¨Ñ([ Yl¨¢‚¥ %l!e`J2)P²ØJ%d Yl¨Y@rJQ€²"ز€4¥€¢Ê‹` D £Dd¶2• %J!€,¶²ØÀD¢4Ue¢@¶Al¶T[4F‚²Ñ(` e ¶TÀ»‹eA«3´*4J4õ?´“eeÍe–\Q5ØXí*b´Ì¥JÏ4¥¹Ù`%g§CNΑ[Óhì…¾Yè"U*dEEE…(QB‰´àŸG OLŸ@yµ4N9‹ ©›‰¶s”T€æâÑ–½9tù: 7~H©ZMšV™A4cc@+rU ¸Øg BV•¢*|:~:Âmrz7nI”sšÙ-Éá´õ 9úšÔº<ÐÔp•2Rœf–ïÜJ\->HãáÎP—jÑÇ[J•®Î‹Ëƒátu6Méj~u4·PAÂ/‡F\d½ÂŠMS¾r@j/ØËƒ\d¢[\šS¶¥Éšoò—G¦Ðß|ä8ÅûeÁ®2Kh*©´or| 3²/†G &74iM…_¦\¢=? # 5ÐRh )š¸Ë”pO†eÆK  •M­Éó’8'à#„‘›h )ÜŸ c.0eé¾€ÎW%R ­)ù-E—§Ú2Ó@7SîO”GÂ2à×r‚´¤U05iòpO€2àÑœ *•S Õ§ÑXeF&PURf”È6¤Ÿ(m‹(ÃÓ}i *•mL¶™AÅ> ¸(œU#V¼¤Èâª:iù`frÉ7Y.Û(Ë‹D¢•H )Ó(Ž)¢8J%J˜Rò\2‰¶Ì¸² @–À¶*ÊJ ”…L &‡% #Dˆ&TjË`2Ñ%„[-€ (”2Yl"ØQ ”F¶²ò£-PXEL¶Å(”(lX@J'aBÅS…(J P²Ø0£4¢!¥1`\¬%@PÈ«e°f\J#FhÉXʘ2• 2âZ#@@ì½ ™QTY›J¨âe¢IGš4ÊD'yªÒMY¥§]™RŒË5æÕºF5vÒÓ¶}OGéømG½"Ñ(”F“H@€¬ ÑQ‰i§ÉæÕôÉð–zN&2™Ô‹qdEÁv*àZ±¦œMÃ1°(`[2d«9*V‚›Q— *¥4fZq–j˜Ù(s”tƒ‹áД^ÚjÑæÞô¥Rà­î§hóê®ÀšZ»]3Õ WýQ}t¨ÏêƒüRIÓÃK#b`sõ–/O|>åÉæŸýX_÷Ç=“Sõc±ò¸gu-¸ÔŠ’òQèÒÙW&¾žøÚû£”*8¦§ ìá8í•®­EÚ4gX3jŸ$‰ Ÿkö:éÊ™`ìò¬ÊÃ(ë Ôè­}'åeó`Ü[Œ¹\žˆJ×°JIS´jÕ$Œ<NQäõ:4íyxÊ=ZsZºtùDjþ‰s×¹+|6¿º<È¡T« 0N›´m#M¼Rœ ¾/îìT)>) -®ÐÚŸ€™A0)×ÓË;%Ã ç© “q}¯3IþÀWVŒÓ@7y/Ó/`#‡†]98M0=:²„dî6¦­{i%x ”ÐRh iò†ÔÖD¦‚›AZÝÊáÐFZ”J¦Â­§Ê&ß ˜òij­ÉòˆàŸ µ$Ú[“ä8§Ã8Iq’nk4¦ÙtpðÌå<„ÍnO£‚|qh´iL#Wre鮘VjQå Ô¥?"¢ÀOÃ3MRfÔÀ¿K#‡†ŠhªAS-ÅòziðeÆH¥F”¶¤Ÿ(Ž ð&Pq¥$q‹2àÀÎQT‚4¦jÓåeé§Æ ¸´À‰³JDS5ôÈ£/MrŒ¸´A-•I¥"ý-<qh•H )š´Ê ™ph ÓHÚ Ž%q#TÍ&AVMU 9´d¤À»‹†p#‹@g%°-—pÓ@ÎÒP¶R4¤ÚQ(”@-€²Ý”(Q¢P`7² (*4J €¢ÙS ”JP™l"Š4F‚¥ •0P‰D #D Y,"Ùl‚¥‚(™l"ØQ(*Q Yl!b€VÐT¢U -lt…¢PB`TËi„(”EF‰E;( -”Q@FŒÖ•‘Ø@²Ø2§eE«&Ь´NÀŒ€Qd1¸¨Õ–ÀQB²Ñ( D`°*f®È/!¤Û…g—f™$é|– ȯ\U"®ŒK›[S¤ÂŽºplÔiô}'§ÜÑôáÒ-JÑHÈ(@#DUPG9é)..¯§ð€ó¸8¾ ´Ñ%*GxÉ8 &%†j1IUvvM€G4ZF¬E, 9ê\®µ<•[¸È8x Í5ɉi¦ð©€Œ§r=š‹4?KnbñàÄôïÙ”yu4äŸ7¡©N˜¥§$ïMþ²WçÏ€39'zrµàì£-·(ÑDi֨іŒ–¢Xd½´œ÷ðûGE&µYòŠ=Zq‡Ý _FÚójGôõ7l¹ö3©DWŸí•S°$©Ú%jÑÍIÅûªÝ©!LDztåj„‘¡bÎÐ_]éí~¬{<Úrº{‘•ôº²’q¾Ñ9V8bQRY"¼:úN.×Ü%qÔëV*QådæîÔÖågU+R_l¿†` …ÛF]ÓŒŸÉ0Ê…vTÚÚ`Jšð- ;ʵ´”—Ý}Ï?[* 5Õ F×j†ß mHD?êémî9G9èÊ4Ó´òÊÚäÒ’|„M©ðÃRˆQM¢Ü_@M¾W("©–âù8xd© ¢“ì¿K›|1mj:ŒÕÆ\ ˆááþ ´ÐQLÖå.Pb|28É{€RhÒŸ Eü™zo %µÑTÂ5q—(Mr˜VZ’è)4ÔüŠŒºËÓðìŽ×!E*4¦ÛìÈôßY Ë´U 4§x-Eûeé× Í4Tš4§ä ô¾Hôüfš MiL×ÒÂ2àŸ Ë‹\…*™·'ÈÚ™F\3””Ц~–ˆôüe¦…°4¦iKÎHìeÁôQ–š@iIšRL€ÔY—¦ú(”Ñ/$R4¤­28.Š2âÉD ¢©¥1†TLÐV¢²jn•"nC( ˜R*•i28Š.à5¸ReÇÁ6J[.à-ŠLâJB€]À¸%(J,©”[(ÍFBËaÀRˆÐˆÀÂ-€% ¨Ñ ÙyQ–€”J  ™l"‘ #D ƒ€°‹bÀQ( D,ŠÊP‰D B*2¢€°-–À€„0Š™S’‚£D  (™«©Š*£Fh @‚ÐELÒU#EF\IARˆ@ùE²¦E[-•Lí ”NÂÈ²Š™T€í¨ñF*F$í›ÑÌ‘ëEèˆóëê(áežL¶"ÇHBß¿Òú}Í`ÛO«¥¦¡‘²2"€@¶,‚ذ-‹ qå©¢¥Ò<ºš.=çœ0bqtÈŽÊšÁ¦ã7Ã:&˜¢4Z%Tm–5( 8î‰æ”\}ÂÄLé´UmMv‹q`G.®@Š×%mr(N2X9¿OÌ`r–”é«GiêZ®˜ Ë:nŸƒÓ§9¸Ó^ÀgnZàji©é¸>ÀùV†­YêRs©Dv†¬gJŸgVTsœTââÏ4-IÂO+r+ðb4Et#*3{_±'јѶ­Z0.œéžœIˆÇ éQÙ}J™ó}VƒÐÕ¸ý’þ! œwÇ%|ö¹÷7¤ím¡-9kGºÇgWOcµ˜°&”ö?fvšIî\>H0’̃—Ÿ(–ð¢éÙꃴ¼€ Î ‡Ál ¨pÀX@Ҟɯš×ÓÙ+Û, ®\”"®M] !( t0Àë¡7¥¨¥ÊìÖ²pœœs”-É“l_˜ÆKŒÍr«‹åj|0‰˜•H*ý,›_YmL ôËØŽœÄª@_¥“kè´iL ô¼³.Üy*Ÿ-Åô/†i®Š¥@iM>Pq‹ãeÂIy%µÈS-F]Ÿ†bœyJf”×i6ÆF\9\¢©´Ô“ä8Eðè =9"eTÚìÚš| ¨ãÆàÐÊ*“jióAÆ,#/Môg(*©›Sò~™z~²ÔM 4¦[LÓOƒ--šR¢ î1~ÅpðJhšRdR¾Hâ™F\)¢ lª@kraÅ> 2àÑ2ˆ Ñ¥ 4¦\2ˆâeÄÕÚ Ò‘¤ÓÒHÌ–B¹±ADÍ&i3.>”¶U -¦6¦q3@ ˜H·|„V‘J¬íA `[-ÙB¢ D  Ø(Ph D¢²Š™yD #D,"Ùl(F€”F€ &[Ñ( D ¨[¶,D %  X°-Š4@£!VÊ™P#^y VÅ•@J%@@Ql©RQQ(PXEL¶E\ЉD ¨Ð "–ªe*% ©D %@¶[ªeÄe¢Q@,¶L¶«±Eq#ˆVh”€Å„w“¹X“¨àµ#gN¾²+ÐÙÇW[lqÉåmÉÛ7§ f£Ow¦ôîM`úšZj ‘hè‹de,XÆâ‹(Yl–È[(YH-‹(¥"”@yµ}:yHòjé5ÐF"ÜY¹ç(ˆÉ¥*¢šeè E`â×ýP7gR¿M)®; 7ÆDã†Ü]ÅZ­ެ^$Ú^l%Œgdeö·s–›©¯ÈF¾™—ôweéœ]Ç“zr’yåuÔ­Ëòa}]”y½f†èîK+“É¥7¥*èƒÕOÓkR?kä÷ÂjpN%Dš¿©rŽ:ðß8ýȃ ­HZ8jGk´Fš„­¨’V‰Ó"³(Ó´j,ÍU”{FôäÖ5—Iû.™±Þ5©êé¸Ë°—(ËKQÂ]tä J4ìF*/_&xdU–Qç”R{_Û.¼šzR®™ÓKS§Á”züŘÔú£½sà wÑ•®B»ˆK]€¯pT XÀ¾“ýH=7ø âÕ:á¢S4˜EÙ‹LÍ´4úº`JhõèJ3Ñm«qè<ÔZµ‹1Mq MÞš¦ ±|:2ã$I–â×€¦ß ™@U/%¨¿`&×ж‚*Ÿ•ej/Ù…eÁ®-§•@iJùŸ`G†æ€ªb“›Zà&ÓÈL¿KöaQÃÃ&SJf·)r€ËÓO)™q”@)4mOÈ Œº£. pÂ3mL îO’8Eð\$¸D¶‚´¦jÓåGøÁ—‚¥³J`krxdpO†\ALÒ’|€pO(Ã@-¢©PV”“ä8ÅàÎPHªD ŽFi¢¦Àªf“L‚8'”eÁ¢ˆU" )´ù8'Á—Š MiH¶˜ ‰ðeŀȰ4¤U -&G‰´U2é‰ÍÈŠ´ÈPªA»˜Ú@°4¤0À8™qPÙT€¶…q2ÐS4¤Ê¢P‡,¶P…([-€#@J#AaVÅ„RF‰@( -€ J% *aÅ(” ØE°h(@¶T,(PT AQl¶4hJ8TÅ„Q@J%@[-TÅ(Í(”l©‘Ëe 3.!Q¢4A@¶@³VQS/A£.!Q¢PAS5`[)Q2âhÍx BF5B9öz}?l*kj¨ðÏ7Üò!4ôÛg·Óúw&­WÒÓ‚„i,‰K±`K-€±`Rh´¢Ð *@ZhQaF¬ã©¤¤‚PWuõ*g6Ü]#+y5DX/'ÑÛûyåÿR.2ågBTÿp;B[ã·µÁ8yáár’qtú ΚR¦éL¶%` Õ¡b€@Uº5 8µ%е৫ù<àTÂÚx%ôi24úÈ gM Mš—Óæ¶ƒVã$—†yš”^@ª^KµK‡@Z MrwEòˆàºa¦º*l)†M¾€¶nòj/ŒkAI£[“ä*m‹áÑ$€[E´À”ŸjH‘­Þ@RdÚ×¹£J~Bìɱ®2¶‹¿_¥ò‰³ý¬ µ(òU6‚.äùCl_‚²àÑ- )Ñ«Rä*=4øf\d€ŠMS¿KDz~°ÓERh )š¸Ë”—§á™qk¥´iLƒWteÁtQ—.…´”&Ÿ M‰ð̸4Ê*•mI>FزŒ¸5Á2ˆ šÜ°Ì¸x(Ë‹A: ªFÔÀa‘ÃÀqhSeRXdpðQ´N*“4¤».Ò„Ó9²T´¤0Â#‰ !S©SW‚P`Tʤ Ž F€ʘR- e % TÊ-‹P¢*4B…‹¶P©Ci¢,¶h” Å„[FF‚¥, b‚#D ¨@…•0-”*Q4FXELX %JXXÇ!F‰DƒEEP”J QQS ©‚ˆÑ( D „À©”¡Dh Ñ(!ÀABÙS-HÐThËE€*x-„U#VŠ#VG¬¸’€*eO!La”#ˆV\I@z8Mœ!”:GSf›}’´ånNß'M8[5ïôÞžé´{ᨬÖì–D,X ¨ QRѤ€´T€´Z ©ˆ(¢Ñh Q3‚’àñzMjâD|ýHJ'6ýÈ%‹"–Yc'§@w޾ä£.»=v°TkRå r#ÔWõ+!«¾ S&\ âÜ[ø å>™Ö²\¤ÍAÛKOKRY…3Ó£§§¦ð~¦.ÝÅÿÒÓÕyTüf3—¦ÖQ“¸ù>®œ¡«¦šv!\5Ò•® ¾2ÊÅ•µcµï‰¥Z"¹¯¢Tø&®’Ôƒ_°3R2iᣦœ¿Qlmß@z´µÜWéêüYßI©E«´TIÅJ.äáMÆK(ŠÎ¤lçâé‘]Àç§:þ×Á¹+@a:tv‹MWfj´¹ ±”N™Þ4;EÙâõº;%ú±X|Ê58îV‡Í›»þá`×a«DW›^-=ñü˜qZ°®$AçR”%îŽÎ§]áüÏS1Rü3Tv«N[¢™«Ùo$BÌóÑBˆTTèXU&»zyÓp–c,Ô‹Ó›‹8*^áîmSY  ¼Œékõta5÷Càá);v~—ÈÚú`U)D»“YASl_ƒMÚ-Åò‚¦ß ™AKÈà Sè[AÓå—L(ÓAI 5¹>QáZ&怶Ÿ#j|hªMw'ÈÚŸ‚%II *’|¢í‹ãYp’÷%´ÀÒ˜{XDÛà™\ ª¤jÓäàŸ ËŒ&)€úeÊ'éø`f¤Š¥ASÆKQ—°V\+Œ™Êä ¦Í©ùQ‘›è ÓAI 6§ä¿K/OÃ%46iH‚ý/”GX`eÅ¡`iH©§Èø2âÑD¶U" )“.i®€©•H )'ȤÀŽ$j€pU 5ºÅ&Q„¢:ÃŒ—,“J#APXF”‹¹0™@”8 &i0†@QYSß‘IIL¦TÀ¸ÚM (…Ë`RP¢Q±e2ØI@J°L´h”AË`J#ARˆÅ„[.h @(, e¿!4(”"–,¨  D €([(YBh Bˆ¨> (¶PˆJ „è€ -‹¦\(ËAQ "Ø2ØBˆÑU °˜²¦AlUL´¢4LÒ`[*’‘¢Œ¸™ %Xe°]òEÒê>Ž,#6fí…tÓ³ßétmÛàÐ÷ÅRÁ»#%‘° Š#I¢¢ ‘¤hÒ@P€´PZQh‚¥ 4fQ².¿¥S\7[ÒÊ Ò"<ò‹\™"€€@ï¡«±×EG®3Láê4ÿ¹yÍE…rÔ[ekƒQ•–°Ô¦z¡ê"ÒF‡e,{meúZŠkíÀ}GýG_±Oê54¥¶È=ñÖZÑ©rr„ªNðQÛNYÚòfIéNÿµ­Hï†èòŒiÏûeȽ^Žõ¾<®OSN8¢”µ=š=^›R2UÃ,G¥}Kݵ¡Ä—(ͤÑËR=£-v"£Ýý‰§+ÃåVqì‘–IV;'¹Y§•ÍBTÍ#¼$tiN.2Êe3WMèjí|tÎxeª~Ä‹Û/`‘ª§_±W‚4Äãv™ãiéΈ3¯ÑýE×&tgRÛÓR_||«9&°M9ì»àï'ð4) ²¢ØÁ¡”T0+ÀUM¦Gÿ?G® p¬Œ ‹~M&˜ÅÕòK®PLW†×ÓMCV¥öË é¯KQÆQT–=Â<î1|:%Iwy#Ú”×*“@[Oã|0%47y¸~ÄqðÊ-ß )1TÜ[Oˆãá“( ¦Êš| £…ðÌ´ÐI¡ô°|2eU6jâù@Mž©.@)´jÓå6'Ã2â×@š4§ä*¸Æ^Æ\$¸ÈÚ*«‹åÃÃ2]J‚4§|•¨È+/M® årShÖäù8Åð̸4-£Jt”Óä5{—¸É2€ªTmM>@T_±—ÑÊ*R€Ž Ó\m•L ZdpðZh]TnOb̸5Àš@iHÕ¦¤Ì¸°%4-¥"Ú`]¶Všˆ˜ &m0…&G2Õ*ÙwjÓW@eÄ”.à‹b“mÀ©–ì€Q8e°*eL VG3D(¥L€JPt[€%€”[(*4e À©‹„ ”@°‚eä‚¥ˆ ²¢¦TÀ¤ ©D¢!@¶/ J#ARÅ€±@FƒDTË`,©€h€ *dËeC’4hÍX2î(¡ 3·h CüASÁl &98™q4J(Q,‚Ùl"¦TÊ-†‚²âF€Í ¶TÀªE¼•nÙ†$úV"½~ŸKsàúPJ)#EnËde@ M #HЍ¨ $T€©€)@¨EE((”QNSÒRè#Åê}ìÄùºº2ƒ¦ˆ®L@*y(泌wRµL#Ï­§µÚáœÑZÝ8«‹¢ÎPLÐ(>m´ã«”Ê<Ž.2pŸ+†r×Ó|®‰Ut5xòzd¿R*KîB §=ËÝ…Z°¦iá7£©¶\tÉ­ {£ÁNNKýÏ'ªÑÙ-Ñ_KyÖ£¼U%8~PˆkÆi<©›µh¨á(í—³àYÆkk´m;Då©{ãù ÜZ”Nr[X£p—gDüª?áƒlºBTv„Š£Eké×\3çE¸·*k ßthçìÂÛÚàÕöeÁÃ[O|mrˆ®k‡ÃÃ<Ó‹„ÚñÁ£uÊÿrÉÂJ¤×€ ©áüc+ ‘ÖœpÕ£¤5á.]? ƒªk”íª„°€e°.x([Fôµ6M07ê4ÒjqûdqÊè òT—@k4MÞ@”Ÿ°¦¸[=i-m&þÜ7ìçœ6æ2R]3;šwÉv®˜S(nò¢øÀjKÜ›\–âú8ø%5ÈE¿%¨°¨â×ÐE´ùDÛ|¦†à«†M¾ hªaí~Æv¾‚¦QwyIû ¯ ‰mSaWé—$p}03õ.ЧH ôË”MžšåM­É¬‘Â/†—…´”ÅEûG ™@XÌÒ’|bøÁ$€ÍµÉ¥05j\“b|02âÐM 4¤jÓä‚|3. {-¢©krk!Å>Ë‹BØHÒ’|€Ú™ä¢etˆ5»Éi0#‡ƒ4Ð2©«L›S(Ž-€]RòAm2m²†ÒQ¡vjrè :d ¥´iH"Úcj`G4*t¥ ©€qðeÄ[ ªEÔ@”&TÀ D ¶]À\¬Ñ.Š*bÀ 4@Â-—©Dh‚Q( ‹a P@PèXŒ D À¶,"à%AÀ *À‰@F€@Yl #DT X E°(S-€ 3@ÀÀ©–À¼’‚#D¢*Q RšL¨©Š8™i ¨ÐbÈ*e°-” X#‰F\HÐElÕ„TÀÄËAR‰]¶Ì2‘Ï–vӲƟGÓÁF7äô Íh¨ AB(Õi@i@ThP R€(€*J.+³Í¯éc¨¸æzŸE([\7¹Í0EBbéá0:¶¤©žyÁőԫAX‹£xåU`í£«µ£Hï­Õ‚”~äq_\iò…]X½9î\L+¤Ö×ú‘ã³¶–§÷. #®®šÕ†9èÆ‹M8K’ ;ÑÔ§Á¹¨êFŸ ¨ùÚp›‹\p~ÆZm\e¹pÏf”ídÒ,ãj¿c“u‡ÉgG%q•2 †°%ÿNuxgYEJ!\³n,ÍWDï œã±ªc#pw„7­ÐÿêÁùÂÁf¿¹r‚W9f¤¹:EÞz|…‹ìg‚+ͯ ²Ü–Ç]n‚Ÿk’ ¦ïM{3ʵ@+JìŠì"Øtù@#ºl¿HúšûУ«pÍ?€!2Áh Ám -Œz4$§¥. ÆP“Œ¹@L½Â5ÍM¦òŠðÉ”m3¯¦šŒÜ_Û%L¤% IZGÀ0˵õ¨¶Ÿ 6øbÚy nO•eq_ÚÀË´U?üaédØ× –ÑT¯ ŸšYp£^Ê™pÂ&×Ó±”TüäT_°AÁ®2fÚä+[“˜˜Rk5¿¢ý‚&ÇÖImiOÈú_°gûY2€)3IÅò‚ ¦f¤‚ŠNÍoO Eñ‚8>€–ÑTÀÖå.Qá—‚“@iH¿Kå<2S@)[O”MžDqh–Ñ”Z}WF\ZtiH iôSà ¸´@4¤]Éò€Rdq`B¦R. |ÚÓ(…Lƒ[Š©¥ɉe‚ØUL´˜Dq3@ ˜V”‹†|¦ ‚*‘m4“&Ð#@²¦Ã¢P¶²€¢P€ÙE²á6’ˆ%…‹¡@(” L¶’4( a4¢PT¢±aPT¢PʘE»F‰AP,X2•PTh€[QQ(„T -€²„(R‰Y(…¦ ¶(¢4e Blf¬ b€Ž&Z(”@Â-•0ª™y Ž&v”J C%"–TÀ©•2¢ÑB²âe @ –Â*y*dU²• F\k€¬´J ³xù*FW'«ÓÆÚÁUô"©O–“4QHT¢ ­#h " )@¥P)PÊ P h”'¦¤©£çú¯G†âŠ©¥(¼Åœê>Ž+É6xÉ0M­tiZ"»BLÜ£½pq¦®sŽ×}1"´ÐF‘éôúÔéð]}=²ZáòQÎqZ¾™åéNŸ^Í)¦©ðÄéÊ¿µ–#×£,×ìMx?¾¢Ôeµ­2‰¦š{XÔèo…Çî_ÉóÚ"®œöÜ_ í¥©²[_@õÁîFu#ÙG:9êG ÌeѰ3©Ñ3§.Ÿ(‚êÆÖäsƒÁ*º&m»V¹FJr­‹£q¡#²jJŸ?Ôi= L}²à±• Žr[%ìÂú]tÁçð’4Ì’”\YäÛ™B_4°ÜYuþð1c°*äGQÈoŒ3¾Œ¦å¶NÐZdºhªúß`U&ž™5¯¢¦¾èòQçÃ-xa6¹7I¬†ŸDÜÐRÓpÂ=S“ž„'Ÿ¶G 5'”v®˜©D ºùB“ãR¤½Ê¤ú_°Úúmt->@mðÆPUSò*/Œ6µÆB“AÓå ©ðÀ4Ÿ`\25á…-¢î¾B™6´6)'÷ ¦ØËŒÂKÜ m2îO”Å5†Fš)Q­Éò¬*¸Åñƒ;$¸ÈuS¾@m‹ãph"&Ñ­þB¯Ó"=? ´ÐRh nO‘±>0qh–ÐSeúeòz~šh ¤iO¢ Q~Æ\E+’¦A¥2ÔXéø2Ó\€M£J@\28x-5Ê*`iHa€ÙàË‹]²©«LR|6´LS* 2mEK mº‰Àg PT ¥"¦Ÿ! ©‘Å…e¦P*‘w\28–‡KeR¶…X4€˜L¢4 Ë`\0hPYEÜ[¤hŠ(Â5`D ©D¦,"‘…FˆDAeÀ‘…B-lF‰AR€©„[(”¢v(1`J#@@E[-”,U ”Tð[X#A‰DT²ØÆ %ªè D,‚ÙT€¶R¢5f\B¥g‚Pd -„]Ƭ Ñš ”J€*¦Ëd 5eE»#Hâf‚¥v@È-•2£[Š˜Rˆâ\L_9;`‹lú–8²I¤Th*Ùl‚š@SH #h б`,¶²î¦i0 –À¶[¦¶  @fQMy}G¦Ü›\Ÿ3Z2Ó—ÕÑG/úO”Ñ6i¿¶tZSþÙ¦6N?t-{n*úiš¦º%ˆÆ¢µhæÑ‘*Õ3‹N2 Ôn¦VŠ‚tzý>¦èì‘¡ÏR/JúYÏWMI\ôäâöž¥S2Át¦ã-¯®îMN¿%GšIèên_k7ª”¢µ!ù iËr<¾³CkýHðÞ}…FA¦¶·ðEwÑÕÚöIÓèõ&¦½Í#ŒÓŒ¸#É)*vŠ˜“–¢Û%%ù"ºAÚ9êGd­pÀ'Ñ´èÍT¿Ó’ÿl¿†l±—HK'hHÐÖ®œu´Üd|êzsq—( ?ª4c•µò‚5üö"¡Ç^ܹ\…y5j©u"kýȃ˜¢7mQ@c*v¢.ÒÎJÛX`L2¬v趘`S¦ŒÞ”ׇ†Ôi¨NãöË(ætŽNÊá Ž2‹\;3~P Mø%4K5¹é·÷R0ÜÖÝ­`+•2©I[Rå žTÌyL¶Ÿ("W†- .ï%¤ý€Ž-q¤×(*ºdÛံº*’| †ÔøtJh)¹¢áòn0É•ÈBÅ'ÆS\ØÓä8§Ã IsAÓå ‰ðÿp¬´ÐÜÂ-§Ê|L¢©°5¹>Q6'Ã-5ÐR 5¹>FÔøÀÅ¢[@iOÈ¨ËØà×&W6S£I§ÉpO†GŠ MSÆH F^Äpñ&W%RJIò†Ôø;è–ÐRhÒ•òl_\ã L¢©PRÀ¨´p}ڦʤtÈáà A` ¤\0| “h òT¬ÎmB¦Çcj|M¬€[4¤m2m]e¦‰AU2©PE´ËI—P`U"ÚÑ( µ€ʘ@J-l(4A(…E¶]ÁKE¢ ¸’Š%  -–Àˆ2Ñ( ,!v”F‚ °PJ4BbÊ-‹°…€„ ÀYl!ÉQ,Õ•% -lU„F‰DTl¶±AQ¢P²ÙL¥¬F‰ABR¦R-”Z2âh”dÙl‚ÙS*q8‘ ¨8Yl ™T€¶¦Ó-#@BÊ™¤ðU"¢‘«ÁÉòEŽšjÙô´UE+¨L2ÑS"­–À©šL &i´Ë`TË`[Ål©€³J@U#[€ªBÀ¶[ذ-‹Õ‹ 5g OHå'ÔúYi¶ÒÁåx &ü•JK‰0:GR^M­I5O€ £œãN×’N6¯°±Å:uÙÑ;TËŒ°“‹´XluôéòpÚàöKðÊ8kAÅî]4u-/$Šîãº6¹7éµöº’ùF‘êÔ‚”|¦ya'¥=’ûY§Ó’kífñ8ÓáòQóµôž–£‹ã£‹Tðdt‹ýHãîG£CSvÜ‹ ôIn®Nš5ÑÏít‘$­P´å¶TÎòJQ¦Aç’iZåuäÔejÑšÔiT–Ùpɧ'~œþåß‘®‰Ó:ÂFÇxHåë4R©õGùÇ ®×(‰Dï+ò‹Š ‘å4âõ0Ù‡ƒ–®d¾0«’v‚Ø<u„ÕSgDÿ ,«Ø{V(²©_ 0ôèÊ:°zSç¦q”dâðÑ`÷ÿMôÑÕýG5q„o'ŠZÎ]QzHÎöU$ðÑ•6ÅðèŽ-{”©§Ú=:‘Zª3½»¹~áyFPtÝ‘KÊTŸ±*KŒ…U.˜Ãö8¾šÐ O‘·Ãm ׆i>0)¯p†êYìÚúšaVã.R|0#R\… ‹ô¿bm}d t[O”ÚŸ ”ÐQI¢Ú|„6ødÊ|Tè¿Kä*8xdi Š¤>–Ã8vL ª¦[‹ä ²ødiÄ ¸¶Ÿ("lO)’¤‚ª“4¤Ÿ(€ãÃ2âÑDM£jd¥‘ÃÁDÊ*“ Öëä8§ÀpkmTZ|ᙦ€'F”è ZxdpOŒ—…´R5iòÅ> ¸´%L ~E&ÆŒm–ÀRÅRm‡+%Ø #A@¥!†q÷2Ó@2U 5ºÅ'ìqðf€  4¤[LÒmQ2L©pZ;I¶€ÀY@”J (¶TÀ¸d   °*‘pjÌ´¢S-HÀ  °…€ h*dlX’P¢@l¶À ¬Ñ(€Yl¨ P ©@ [eä Dh*PÈ‹`¡Dh*QjÈ(¢4J , ™l"á‘ ¬¸’€–È4¤Tʆq ËDh, ™TŠZ#@M¦hÐl©lÖ #F\@ͶAS*‘Qn-ø8¢,uÑåGO„h­„èˆÒeL"ÙS ©šL ¦TÀÒf¬ ™l bÀ¥P(‹ÙSeÜwpUR‚-—pp°,)dÜ5!ªhùÞ§Ð帕éJ(Åj&ÐXvXI<3(Äã²Tø" ç©ýŒÅˆÛW€2루á+=s„u¡k¢;[“Œ±$yZzSµÁìÐÔÊo†o[IÅ©Çði´5ig‚ëéï®z%ô§¾/NN„_éÏl„×ÒZÚt¾åÃ>k:b‘œÆVu·‰Ç•Ƚ)©E5Ã&¬;@b¿s2Š`e>t=HZ¸ò‹¥=Ñ ³Ž-rŽ2ú^åö¾}‰V4™u"õ!kïø!M-MÊ»:ÆTj#´Ú,£ÅêôN[ãö¾}™ÉJÑod½™Ñ¯‡(\µá¿M®Ï›o=`ùL ¬€ª-J¤× ­_*Í)'ÃJMÜŸ \>ð8JTñÉꌴµâ–£Û5Ã(õ?Q¥é=ô¡5=]L:ð|¼Ð 4¤Ð ɼ£¾ƒZšrÐ}å|•ç'ÁÎÀ"åU%ÃE¤øt©"©yÈ ‹ö&×Ð ÕÈú_°SkéØÜÐEÜ›ÊWL*SERöµ2S@U6‹q—(ãá“( ºÅ'ìXM «iò‰^eHÚú–Ñ­àÙ{ÅôÂ¥´[Àl_±ã DÚ4§ä Q—±›éØÌyF”À¿K&Ïg+“JtAm>Q/†Q)®‚‘”¼Š‹m}Úä )´À›/†G€‰´iL ‡Ñ<) ˜R.i®B–U -¦6ßÅ ²Ø ¤ ¤iáÍ([á‘ÇÀFi€*‘¥ ™@˲ØUR-¦¤Èâ¢S4˜ 1@F‰´°-”&G%¢Ùl€F€•2‹`€€ ¤-pF€Íl!`(Ñ( °Ê(”±`[š@¶*5’P@/E…š @¶°¢PˆTËe@Fˆ[*`[Dh(BØÍXÉV¢4ö' tL»ˆ-Ø¢ˆÑ–ˆ% [ ¶U *v\02Ñh£4À¥°*e²¡I‘Ä+4e [";ëÃg§^^O'b4í£Ê=Ðf’º¦…•0)PFX*`[4˜3VË`jʘ P[±`[Ql»ˆ7]ÂʦHÓaç£ò.¯¡¿´,ý<áÊf*Š$³Ÿ Å£Z°Û.z8´á'ZÝ9J-u”„^ QPážO«µí|ƒ¾¶žõ¾?rþO.¬TãuòJ±$Ò}ÑìÐÔU²Oø Gôå}3¶”º»LÒ9z&žèò)kB×ß+Z3þ×ÉÇÖhçõ"°ùÆÑ!' w„¿NV¾ÉsìzâÔáA¤œY–¿`9ê*v¹vŽ3['¹pÈ:ÅÚ9jGk¾Ÿ"«+é{o‹iÚ2©­ ­HcÊ.ž¦äXô$wŒ+RJqq’´Ï© hêm‡äò‹¥;[_+ù"5Ãù Z !âõ:[e½pù âqî PTÀ¶Ò“]šS¾@Ò~­Î².MW€ /´†o 1b€q’’åzõ¥uª¾Ù.=Ï;q—("lO†>¥ÏKO‘·Ãr\—r|€Û|1õD"îO”6§Ã &Ù.27yIû ¯ä*©5†[Rä ·ÃRä!iò6®˜T{‘wú_TM¯¬€¶‹iòj|28µîR}š[_!So†L ‹»È¨°Zà‰ÐV”ºb¢øÀl¾B“@]Éò†Ôø`eůr©4”“åXÛÆ›Y%´”…F^ÀG¸vL®@ªEà lðÉ”R¢Ú|€ÚŸˆâÐ:4¤Ã#‡€#MØRò¬T_°m( ¤iH*ÒdØú”, ) 0| (°/% *Yvh”)¥%ؤÂ#‹3«tU ‹cj8´L ¥²©[]Š4J’¦R. #ˆ¦2LÒ`- © #‰)¢€°-ŠDÄ”Ql©€ä8f…KeÜpÅYh”Q t²(J ÂD #DbÀ¶F‚¥ (¶f‚”@°P(*Q(°-– #D¢( –À¢€Í %ÀÀ¶^‚ Ú@²¦OÈä"8’‚¥€ ©–ÀÕ€%Ä+-Q(H[¦^Jƒ™Ú%ʘEL©IAYqä+$÷zõô8ÌW]Qí‹6WH³VD’X3i«*`jÊž@©šL eL f“ÙSI–À¶P  R( "€°ª™m0‹H›@Ì´”º<šÞU¥#zsÚø|?â=*µ#O“ÊÓÑÔÜ¿+É(Ö¢Jµ!ö¿àéµ#O>@ñkè½9×]3„¢­9/¶\3¾ŒÜ^ÖïÃòÞk|w.N]×2ÕÚí¾ÙW@m2J*QiÏNN.ŸGf”£O†EyÚtãÚÊ•¬òf«¤eÓáœgiÏrãÀŒ×m9¦“;Â^æàëõkVë(m6Ÿ\’X{—(…tŒ·Ç¾ÂÇ)z8ݾ:šêqiG²4JÀ€ƒÏ P*empiM 4¦ŸTm? ¤û5i ×´…ùá€(þž§iIóö¿ äá·å¶iM…_¦]PØúv¹,0ö¿`_N˹®B-Åó‚W†m¡iòjå2}KÜ ¹v‚Š|:M*ý,mðÂ%µÈú_(Ûá“(*©y.Ø¿fÚ× T´ù&Ï ”U/ Z‹&Ö¸È k’î¾@›S㦀)2©'Ê⟈ã$€)Qn/”o‚eU&kr|6'Ã#ŒÚ4¤Ÿ( µ>âÐ ¢©i2mh mR ¸|‘ÇÀ¦‚F·yÉj, ì}( ¤i4ùµ>âÐTÉT‚4©ðÚÐ Y«ò¤É@ZZ\[2Ý„eŠ …L I‘Á8R-¦ÚŒ¸Ð˜V”†AÄŽ-8-€ÜjÐ &Ð%   –À¸˜Ä•@,©w Dq(&\2Dh£4&iH†(h°-€ˆÑ(Š‚ÙBÅ„ AQÑl"‘ ©D ÀX°ŠJ ”…e°¢ÐeXE±`RŒ€Ë`\¢Ql¶°L´(¬©„9#@Jd ¨[(ªF­Fˆâ–ˆXʤATŠTHâ–ˆAE²ØH¶Ai3.%¢VP™l‚ÙSÁE% #‰–€÷úÈÞ›>W`ë¤òzàͱf“¶e° ›L ¢Ø2¦Lª@jË`]Æ“I–À©šL ™l e€(P¢…… ¹.à‹¹ LsÑŒ—ƒÕz6ó>t âé£Z3Ù##¦¾’’ß{9ÁÖ38Ó¾™‡ô¿b7øÜx-n^æ™#'g¿NKVýš]m/Ó•¥ô¿àâïN{£ùFUÚ‹[¢ñàî«V;_>MDkMµô¿¹ÕŠÔ…®Qj8é=­Â_lˆ¯GRŸWmX-]?u”xeÃY@q”s¤嵺k‚+Ñ£¨ß<ö‹©Ÿ³4Œµßg=HÚ´A7fú–¬?½sØŒ·G Š’Wòe¬ï_”J)¯¹Wk‚-r§¦Ü—ÛÚðv„ìÔeÞ2:&Qæõz_ýHþO-äÍR-ÁÚຓ¨ºìJ<Ï.ß,•@(P™(€ @ÈW¸à t[„ß@iM›SOØ ){–ð­0ì \MÅÚg¢o~’Õ¤ú‘G%Ñ’Sh )ùìPÛ%ñº¹I’šã ]õ†_¥6¾•I -§Ñ|0†PÜŸ((¢ºc( ¥|†“ö8µî7V(ÒÆ×Ó[LÖäÖP ©ðÉR^à™~–ÙÚbÚ©'ÊŸmh)4´ùCeðÀ•%ÑTÚÜ_(›LÔ‘T™éaÇÀ+“J`_¥òG Ô—(ª@[O‘²ø`e¦†ê[“ämO€#M î.kè™AZRe»ä!µ> ¸´èÒUÃ&ÜcˆÓAiH¶š”Fš[¦T€ÓûhæÂ °-Y`B¦»S8²lªA ›B³T©—pEÃ&Ð% ›E°)i—S@ ˜2á€ÚŒ¸(S4¤QpÈâ\hÈÅ€AšP L nB“ ¢ˆ-€¥¢ D(¶,Q ¶@J €l (*P•0)(¨4f€жTÊf€4B)eL¨¶”@¨Ð Yl¢¦^H#Dq(”è€BØE²¦E\1V–‰ET¢l¶l¶¬FŒ´²¦A¤Ë`0ÈâQ–‰A{€-TÍ&U0Å—Q¢ d2ÙQlrí×ú Ñò¦ªLÄ™ëƒÁ²º¦U )`Œ6´ÊL ,¶LÒ`i2¦LÒ`i2زØË`[*`[(€J€´(¢í…f‹L)l:k!oQé!¨›K'ÊÖôòÑ—ˆ5£©Ó3­¥µî\3(Ê[£LçÃÛ"7íuѸ³P­5hº:Nv‹í¨êÃÙž-]7 m|tÅ#‚½)ãƒÓ§©tH¯JkR6¾õü"ûýͲ篧Úá˜_õ#µò¸"®Œê[[àž§Kÿ©;Í8Ú´rªvÖ<¯¹'¢Zqxÿ€ŒÇ¸¾Q†Dá+èÒv€ZzsödV¬—NÀËú_³*fjµv­|3›OIã1ÁY®ð£´Y¡®U3ï¥úrÿÒø%Xåx¦fW%¶øÊ3 çYh+òFçH¦@¦J;.PذVBÀ¶P*“F–£\å¸Î,Ò~Ý|„¿!Pº©ml°ÑEÕ‚SqX£W†ªäTÚ*—.ؾ0J’ã% ׆)>0š÷.ï$¥ñ†)¯rФ*/ØÏÉmr€¶Ÿ(›|0ÑwyÈCl_…4Ýå¢ÀmiáØRh q|žêERò¨¿bmk‡`-¢Ú| Sá’œz©4./•@6xdÊ©—é`GÓ²e>ªE¨¿b µ¥ä&ÐSK³ÆL¶× iH}2ê€8xd¦€ªE´ù@M·Ã%4?s[¯WX-{,Ò•\2mSC€ª˜Ãm%lX -+ &òf”J`,ª@\28øS%¥"Ú}6‘¦€…L &)0‰´”"ÀÕ—J@4, ™lI™qSBØH©pÆÐ2âN]R©'ȤÀŽ&Z(‚À¶(‚Q(¢ ©Ð¢Qh… -€#@J  %l(F€`,¡ %J‘; 3AR€Ù°TJ BL¼„J%(B¦AS-”S. G @²¦Ql¯!£-J#e°Š™l*ᆂ2âF‚¥"¡aU3JA2âf‚¥S©û—qUl5`giQ™S÷oS‰óýDjl‘§8òztå„iS5a Ű 6i04,–À©•04™¤À©•H n*R*`[5`[*`TÍX *`TP‹¦i0*( -J@›Hâ)œµ4£5RA_?[Ñ8»Î*ÖÉÄr”%LΤ7Æ×(ɾåL±m:b7]WÂ,e×Óêítø=:ºqÕª<šo)¬£”„©™W«N}¬4wŽ¥ýKÿæF¢WtÔá\žY§§< ‘¿ú‘Ãìí¥-ð¦žpý9×Oƒ”áÚšn´zaRú×ä ¨o\®~ ÷+2JqÉÂ7m`u1«(µßDc+Th'a\^×Ñ*Æ“¦\/¦Y‹¬ýZR§•Ó;éÎÑYuLjEN.,ªðjAŸ¾Q>—ž$¸dä÷;JˆÛBP[·Wµœõ)͸¬01A Fˆ _ȯr9e@T4—×%8™oTýË5Ø#kWÊ6§pÀÕ”Á@ôNµ µ/êXgšä¡`´0ù µá ]ͭɯ© «¬”Fäù@)tÇÔˆ.åÚŸ ¡”]ÞP OØ›Zº°Ëô¿`#‹\;*mrÜŸ(›W@h‰ùIð) *›/Òú ›|1m7'ÊSáÐÆH»š‡É6ød £J^Jž ±õ%µÉ¥/ ]±dpk‚ mr]È.°Jh ¤Ín¾P ©ðG¸È6)ã )?b8>€e ÁW mð2Š¥AVÓämU€%4 4™pú›|  §°™( P)¤±`aÝ(,‚Òdq(™A0*‘i0ˆáà4L¶ApÈãਔÀUL¶«#@(œl©lRm%0-„À¸S8Ñ) %•H£V…&q#‹d'@iH¶™ÄˉDi¢pËd¬Ql·`4@ ©B€‚À €”[ €  ¶[J ”‚À©”!Dh*QÊXÀR¬(”-€³V¢4Z%«.â!Èq( ¨0‹y.5àËARˆ¶LªDE±EÄËARˆLÒ‘´Ø¤Â#‰–Š©DÉYE²Ù¬G8š%• Ò8ú9,±G:;é¼v‹5a`TtL e°4™l•H eL eRVTÀ¶[¦iH ¤iH n*L¶LÕQS€( @²Š¤iHƒI” PJ(”M eé¦pÔô±—Yá«éx<’МQ1}]7¹pÌ5kÜˤ"ú|+5$©Ú=^›[ûY¨:z ëty>v´·_(ÍTÓ™è„øbD%±¦¾×ü3¦¬¤M£„%µí’Á–ÞŽ¦3ˆ;I-Xcðyë”ù@sœ éÉéʺךÁÆW§¨—öË‚Šð´-ZåpA4椳ÉdèƒÏªœ%½pù‘ZwÊ䚪œX¤DËJJŸàŠÔ#¹lœ±×±„å¥=²+/L'hèšýFžøî\ÄðË-Ú"¥€P %‚°P¢%(”ü°î äpJÅ‹`]Ű*”—gE«åµ(¾¥ ;hËr”yFdݰ ¢†P´ú P¶¹†)€ùk{E´ù@6øc+”Q->Fß m Éò€»WL[@7_(mO†©"îò“㦽À)QpÀ›|1•È ö&ß2‹¾ùÒ~ÄÚúÈ h¶Ÿ 6xd¦€)¢ý€Ž/¡mU$ùÈÚŸ€›Z M­Éᡵ>Ž-I«O ¾š*“VŸ$ÚŸS] 5iò6§ÀkD°«e¤À›X© Òl©„)1´ ’ØÅ4ÝE 0@ ¢Tè¢Úcj|GN­–ÀRdq:¶0À*«BÂ-Ùh &K`TËv“#ˆš±€Q—Q:-TZd“2âQš s4¤Ã#‰Z!D-€#Dh,XCÂ¥€…°”F€ ` @%l ”J[àF‰AAdûT9(„¶P³VD(J%@€¶TÈ.ÑQ%PT[*dÆ #‰–€€°*f“a‘ #D ¨¶U ‹eÀ-–€T*d2¦”†QHâš% €L¶A¥"• ³;B²Õ k¸³ž»Ýšx^:iºa]âͦFì ™l bÀ¶TÀ©•0*eL YTºÙS¦TÀÒf“¦i04™l &[I–À¶TÀ¶P( %€Ê*f”ˆ4™¤À¶PJ(PÚp0ôÓåqÕôšj¿ôùCíÊ =M)Eý­4f.þL­k •;EˆöèjîŽÖcÕh_ÕòZ>lã²^σ¤&e^­ DKí|ž¨}/kwáù7ÏZ£ §ÏDÒÔÙ=¬Þ¼?ú‘üÅåZ9Î7òFn.™è•N4ø›N©™OûX£Ã9==yWÁ×ýDe‡dg©9ZO2™¸ê4Íêkn\ 3§Ù¤È¢–}ÑÒSޤRk+²ÆHIEUV+™"ŽZÞ¢ÓŽž}Ï;ó䊘]•ðQ…AÃ.ÀVÓ@D²(Õ£È-`´Q+8%d€ÖH¬ ð|¯b5à—u *5Évm dµcxÉÓQ¥6“ì™nÀ¶-0Œ1mr€aû }0å“L€^ )¾Àaò†ß ¡mr† ñ‘¹ Kä»|0 ´->@m]1”ÓämO†¦Š¦ûÔ_°ÚúÈÚå >P ¾ m¥$ùȤø`Fš UÈéaÇÁÊ.ëQ|`›Z÷¤Ñ«O”ÚºdÊJE´ùlðÉMr€) ß(*©—éag†Jh*©´ùAÂød¦º &jïº#M²§ä"á’€ÀX¤* ©@d„˜ 8ø(Í4JEÃmðÈÕ* ЦYl!Ið( EÈ (›lâ2€'F”€¸dq;XÉA2Ù¤ÈâQ¬€U&U 4©‘ÃÁ\Z3E hªL nLRdq3EaPTh%°¥€% P!(YS‘„(”l AP-„R‰DˆT[À ©D  °*e°.У4²¦NÅ(”oF”€ FZ(”Fˆ (ªEL"Ú\rJ ŒX 5aqSHŽ eÄAÀò]ÁR*hF\B³D º*d2¦T\hW·”bzi¬—ƒZeàÌ24ôA›°ˆØL &i³VXË`]Ű-•0-šL YSÙS£IS5`iHÕS5`TÍXË`TÍ&E(Š!@©šRJF“ ©”Z&Ð#‰—8êúXj,¤|ßSý>P{´Àò¸J.š¢„œ]£Û§¨§'«ôö›]ÿ†-¦Óû—&kNЖ0{=>¦å±¼ô˽ ë5žÏ6¤%eœ7­Ë“®„ímuRÑkàÃ}ÏS:hjÚ©0:ËŠ\ÖÔ›Ônéø Ä­»|²R¼€)Xqý‚³¶×¹Våî@•MrÓDV¸iåS%†¤8 x ‚àˆ Õ»%äPè „6¢y%_ 4J  ,°–{Ž€Q(Sö °-äÖæÝÞ@Üu$¹É¸ê§‡€6åÞ†æÃöúvs\ð>èK~P“ጀ-´Rò0ýŠúȺå~á LS\7>ˇì¦–çØUÃ&ß mr0Êá‹h ¥äµì\Zã"ß §ÖHš.äù@6®˜Ê¥äT_±Cc\Ú »“å ©ðÀSAKÈéco€&QT‚¯Ó"l}0‰”U/!V“]` mR|j/ØŽ5ÃeH †6øa(©…\v("QSÙ) @+K˰2TÈaÇÁFx*`]ŤÀ›LðLª^@¸dqðà&²á„JX À°-— âº3LT€¶0#‰*Š!wm1I—P •I¥2Òdpða¢…1mTaG\YFZ¢l€J ’Ø - @J,¶4¢P`[„(”(,¡B0#De°‹¸ BËaK(FhPT *`TÇ%ÄËdLa”2Ѐ TX ²8…eª#@@‚-šÜ»`G-¦T½Í&äŽ G-(VËtTTË`\Ä+.&ZVÅlÕ„w†ª|;:)&TyýT-YäXdXïƒV²Ø3I„[-€±`,©l©lÕ« S5`TË`i2¦¬©¤Í&LÒ`[4˜ʘ²¦¬¶L Q@J @L©iHÒ‘FÓ°³Ih›@›Hâž}oG Dñ“æzE=6ÚV‚<®-<4§¶BS©ÆŸgÌõš.ß•ü’«”&šMpÎЕ2E})þ¤×ܰýË©8Ú7YyàöJŸÚľ‰ÚàŠº°ZúN=ô|Õ©(7 < 7¹IRq‘IkJ©wÁÆ«=€"YÐŤ:5nÐV€©VZŸ>Àö •ü’€ €'`V:8D ¶J¦¨;(4e€¢5’ L€Bõ@;ä¬;Ø´“k‡FÖ«\ä‘ՋÚò0í<Rò\>è4/ȼ0­MvZðÀŸ‚Shª^J›´ÉM/ȯ2‹ºù(R| h!~KQ~ÁRŸBÚä|0 µìkr|¢ µ>¦€_’R`)•I KämðÀ[EÜš¦j|Å  T\>@mðÉ”Ýäµì6´- )_#l_°TÚúÉ- 5ºù˜š ´·_#j|` µ ›V)(Xˆ¢l(V›¨˜`JÊ“¾FÔÀŽ,„I–ð“àË‹(À¶ZL @°‡"€”( ¤C€]À\28øSD°*eM]©‘À ´Ñ, ¤RâFŠ3ÁSh )–Óâº0âÀ•Dº¤Ñµ0™—2Ñ8XF€”Yl”–[Ø %ˆ!l¨Y@€”N–[t(*Q(°‹`()D …°*c ¨Q–¨Š¡tTÈ5c ¡Fv„J P¶S-€¤e %lŠ©•2¢à4Z2ð'ËdL` âeÅšAa²ØР2âe %¢-S4¤AII”G-(€Qdwà맯þãHë))GÏ•H„uƒÁ« ¶R¤Ê –Â-’ÀYl‚¦U"ªÙSªF”€©šÜÍ&“*`iHÕS4˜ .à.óJ@iHÒL©¤Í&LÕS( Q(¢À¥°4™¥ 4™SIš@ @J$ ¤© N¬CU¯ì“:EÑ•z½.·éÍxg¾’ãíf猹êBÓÆ|xjFméÚµŠ|¢*B{'Mžo^¡-T×Ýà ã´êè­d‹Øh”x¿”  'b¨ ›'|…B¤~HÀeYPªx@Êà€;~àB4¬’€ŒV›Wd¢¬y¤Y¥7#¬ûVtŽ¢|<øXe¥ÐÝò]ÞP ]:.P O”°ØÃ^àÃ*m]Éò…x`2…§Ê^ mw.Ð¥Ñ(n(´Ÿ S\Ró‘IJ}I -§ÊWL ”ÅùK¦) *“ìTX ­ÚÚ}j逦‚U¤Éµõ ´]ÞP“ᑦ€)Q«O”ÚŸ#MM–Ó^¦¹©2Ú`6ø@,¶€m]še´ÀP.@K“RQµ2ˆÓD ªE´Ê|2S@B¦Ã#ˆ¦€2àU„PÚ¦  Å«)—;EÍ)[LŽ+¢Œ¸´LT‹h—Õ‚Š¤Ñ¥Š&ß [@[]¡K¦(_’.…4Rò>—ìPÚúvKh†6ø`2‹ºùÒ|`•$RK mðÉ”R¾Qj, µ ¤´ùCo†Ê*¡·À(ª@\?a·À(©pÆßL•0.6øF¥YA I'TËŽÀm]šp ›|J¡dÆ †ß"‚Ê(¢€pØÀ &@XL É— 1`U"Ú`Gø#‰DÊ*•­þEEG.4Q8Al4€Ë‰(†”˜F·§ÈqO€¬KM™q 2TÀÖàé–Œ´¢Q-”TÀ % -€% Ål(”-€²J#E,¶T,4¡AP²ØEÅ ©D È*eR*5É G4²¦nÅXV\h”³IT‹†TG-J ÂaÍn rG3µ¢PdA3VL©…*Ìí(Í , e°­&kÆÌÊ_F21­¡XºÃ:Øå7[FZr¦°s9WH±tÎTRl–À (€±`[*eELÒdULÒ‘QlÒpÜxÜR:&²¦Ô¬Ò`m3I¤Í)¤Ê˜LÕS4˜2@ 2ЦQ¢§@i3@TjÀ©” J8¦pÕôêK€<:Þ‘«£ãPô’w4¾¥üåÒÔsŽ~åÉÛNn2M:hŸ£êèêþ®š}ðpõ¸îK+’ÔxZià‰+àŠ´§òM—°.û@ü…ØUä?`£Kh"€¨~Gü<¢5@^Y*ø¯ÁØÆ@W`UÈŒ¨Š™NØ(2q€ X$6F‰µF²J¬CÁ-XÀ \€ 'Mö¾Ñ¸êIpì‘Ö_ܨ褤°ì ‰^ªMÓä ]¦[†2¿#2 ²ȧР}Œ2…47y ¸ckè´-0|1m"…§ÈÛ|2Q¥/9Iûk@-ŠL5À·`[O”6ø`2Š¥ä)Iû ­q"mÓåÚºbšeÃmð- 4¥ùŸ°k\d[@U"Ò`)‹ؤý‚&ߨUL (ÔFì(™@,¶˜ ¾ MÉT€¸dÛà žÊ˜Å&TM¢ˆ¥‹òP¡@ØE±I(|l¢P¶²5`Gd eRáòG¡mTÙ¥$È)öaÀ¢4Émw 0&\X*l )¾Ëq`Gч4,” % bÀQ(‚P(©‹ ¤¢ˆÑ8e°)ˆÐØ PR‰ÁÊT(€@ dEL`ª4e ‰@*•0‹hR`M¦Z`J[4˜U´Å&L´Â¥TÈ5c’¢Q–‚¥ –Â*‘«F\@ˉ€"¦U" i†¬ªŽ$ !,"Ùnˆ*e°.6•YÚJ4™´Di2I”wS£¬ggXçbÏN:±§Éó½G¦–“t°fƹ®'H»FPAl¶À (X -€3V*Ùl£I•H!¸›‚›‹¸ƒJFã"£v[I›L &i04™¤ÀÚeL )L ™¤ÀÒf“¦h #FJ*fÓ°-04™ ÕS)#@bP³Ëê=$uÆJ>¬þ™-9þ¤¾×“Å(¸Ë)¯bR=ÿÓåqÔ_ õÎ \š¨ùZúRÒÕq\<£šM»ìʯ~ÂbÊPàcòA8ùº^IÇHU¢W`8X¬ ÀT±Ð¿q(¬X@”•|8-¦X÷¼“ºâ‡aSîO’Ђ4è?%Ä3~ÊÁd1bè ~ÂÚîòi5ä ÇVKœ£¤u¢ùÁÓO‡eä TØ4\ôÀ_”0À¹BÓåkÁ8\€¿"‘Bšå¥ÐÊ »¼ŠOØ47yáŠ}¶† } h ¹>PÚº`)Ç¡¸'Æ4Ý\— !µôÉmy Ò’|©ði ¤× UO‘·ÃeH I“k^à¨ÒwÈ ©‘Å -–ÓäÕÓÐ ˜—BšÇ.‹*ã0Ñ I‡K¢¦Ãä›@”ÑSؤQ(p2Ø L”¤EÈØ´ÀP À¸% 2à ´ ¸¢©“ ˉ*Š ´iOÉ Ž)ðQ—Œål»€4™—2Ñ2€ªMu€t̸š,»€¸dq ËD¦P¢d–Â¥€X°Š˜ Q ¦€„ذ‹‚0% ‚À©– &ˆâ(€,¶l¸m2ÐP–ÍnIŒ0#‰–€°*e´Âš2â(€ d 4™EÃ#ˆq%FªeO1ÑAÄˈD¢R¦AS*`iS(¨Ã‰6…n€Žfl#ÖÑbèÜeÖ2:5HÓ5~ã>WƒÔúWå2¸³Ž’¶;2¡@ YS €°-€, &[(YlḀä7TnÙTŠ:Ff÷`"©R¢‘¥ *tmH ¦[Vi06™l YSI›L e° 2ÐNŠ7¬ ”iH ™«‹ ÒeJ–¦’’¦—ë¦)¦à²QàôÚsÐÖ”fªÑëÔš„7ô‹QóýTÖ¦¶8K$Œª5nÉØ*­[(V° ‹Ü«àÇf•2§I•çŽBÌrB¬ µP®•_² ¬*‚Ñøì)òF^(4p”U/ àËÈ¡L(#XA€JƒX/È %fÈÕ„*Œ×DTi’³)W¸Ù€åä[h)XRk†tŽ´—9¬uc.èÚϸõîüäZøð/Èà[@\xÊ-®ÀRèe´É^(n@)7‚åÝ|Œtšä&) *“E´ù@6xdÊä iò…'à ”Ñw¨¾5îI¢áò€m]2eT‹Q~ÀM­{‹h Z|ÐÛ|0%4U .(m𦊤ÀaŠð%M¤eÛ|)•0|–“SBÀ¶0ÇÁ(–ÀW‚P”P( (€[ I@*…la6‘¦€–TÀa‡3L[ER-¦q2âx.æ€ÒšìRdÃÁ†¨¢[ERÚdi>ˉ[hm°#‰–Ë`[`M¦h°-Ž@€…°…”*Q ÈEL¡P”¢l¶ P¶hA`TËaHЙ‚ÀÒe´Ú™—©De°.ãWa¤G3A…BØ3I„)Ä+4Jv[ÙT‚5h›lâe ¨:e² ¤jì¨Rf\B¥2P ™Ó4ŠŠêŒ:,Ë4½ÍhÓ“Lë Ù©RÇTÔ•3Ëê}*û¢N¡ÍxÚ§LÝ€@²[e™l¢Ø²‹YS•04™¤Ê4¦S¢¦ã3¢ÜU 6¤m;IšL &jÀÒeRIšL &i05e°!UJŠ6¤™@YT‚4¤T­•H &[ ”SÏ­éã>bŸêý,–žØ«‰Qòµ âøàÏQ“Žyì©wد$¯Øà«Á2IWÀ^ù4¸€j¾–[²qÐàU°äfƒAQÅ¡A‰T‚‹,0*¹`(S 2µ`O É@ò, Ø^@…«@Fˆò`0pÌíðhÍ[ ´f™h™Xø (€6MRk†Hë¾Õ#©pÀØÀS(»‚*¦2€¶€ë‘€ÀÉm |Šð(aôŸBÚÚ} ðÀ[L¶»@6§Ã@.ùŸ€T‘T‚­EûÅò²Úäaôo†3*•ò)> h)pÆßKhÒiò@ÚŸ ”ÐH¸}Ûà™EH¸`M¾POÉpý¦0¦L -Œ0IÀ ¢óÊ´Pv  ( ¢€ Ú|–“8ÑYSRdq}‹Ú`Ghª^H.<a¦€ER4¤ŸAQÅ5ƒ. U `]ÄtÀª ‚袩y.ÄË@@˜Ü[ ”eÄ¢Pe°% À©‚Š%…–„¢ @ [ Q¡l ˜ Š ¶TÀ¶J°#‰PXE²ØUä›B3D ÒeL †G¬¸™ i2î"®q*2âf‚‚TʤTiH¸.$h+4‡eL¢©LƒT™—Œ8„‚´4ˆ2æÈäT[.ˆâô³ a–ˆ0®°™Ñ;UÑ¿\ïÓÉê´sº(òœìt”&Z À„ذ%”@‹Ø,a0-š°*4Š4™ )B*gE 4¤iH )Œ²Ô)µ#I«*`i3I¤Í&“5`[( #@M¤Ê(¶Å°*²ä &ʤÀªfÔÐR-0ÌÊ  <~§ÑGQ:Y>N¿ Ôƒò#Ë-9G Ú¦JœÛdTAªH €5دz¼Á—ŒRÝÈéX <éðn¹iÐK)ðÉVè•ß‘O JÀh(D€P|€(®k ¢%€(…V@¿< XPÜÐâú&ßW+¡iò€•à¹@]×Êbø´Àm’÷DRÒb¼¶‹iò€mðÆQRóÔ^xµ®2šÚ|¡·´Ê*—’‹QdÚúÈ hªDV@IäÍ…^HÓ–ÑnÀRdÚÀ[-i2SÁl¯J EJÁPB„J/È € €Ü[@(0'Ri†€ ¤-0(Ë‹(™ER©&6¦A—-4P¶)ùi‘Ä 8Ñ8bÀRdÚh€]ÍrI‘Ä ´À .à.6J' ”[#P X²¢à”ËaȈÐT¡aÆ;Ñ–‚£ `jÇ G5A¶ÍX ±VLÐC€NФ»`G42©±VQ—5]e Ê™”ŠšeA«2âh€ " ¦ip“FU—f@SÒf“@{ƒF‘‡ 2žŸ“R³crJQ<:ún2ãê¹vnŠ„`P9( (@`K(4[W‚¦QS4¤wšR &i<iK”€Ò‘¤ÀéRjF“jEL &TÀÚf“¦m04™¤À¥JP¢ŠP4™¤i›Zì—4ýF-T­Ñf'§®˜W“ÔzI:Š>O©ôRÓn•¢£ÊâÓãâÈ¥0ù •ûŒbÀ;\²˜ó`D»/¸ó‡ƒ\ #Àà°ÂHÕ¬ŠW`^W Lа3B¬ D …J|„ä>€§$ ‹Hž AR‚Q(*‰Ø ¬Õ’€x#Mt@AØØ Ž€y'TÚ-«7 I.ðHê®Ñ¸µ. ­`T™SL"¢¦Ár‚äW€K`0)€¿"¼2Š¥ä!Iû kÜ*î~ÀZà[ápÉOÈÚ-§ÉÅ>)¢‹k†)) ¤Ã_@-¢îOSá’¤€ªT_¥6øc+.ë-'À *.™(1`[O¢m]0Â`[L›o°ÐL wР  E  €XÒ%±`\28)‹(ªC ‚8™¦ŠERÒf\B2Ó ´¥?%´Â#˜qh*e ̂٠3D¦@º€©¦.$ª*ʤm @eÄ”-l02Р °…”Š–ì ”@°…ŠQ2 eÁQ(” è©qD #^HE,¶Ql¸a¤F€”@*t[ ©—q#L*À©šRÙi0ˆâŒí Ë,ÒtT‹€¨Õ™q ˆÑ…°Š¤m0-#.Àpa/!VèŽ} 3¸)i1Vq#ˆT¢URØôÍ¢ƒVbQ¢²ÃFh+¤5+ Ö¤¤M{ò¼q‘ƒt…”€F?ä>€ i0«bÂ.á`[*—¸R4¤Q¤Í&¥#j@mHÚŒŽ›€Ò‘¥ 4¤TÀÒf”€ÜY¤ÀÒf“IšL P   )S 6™´@¡´£.$ØØM²\0¥Ú$£ ¬ ¨ôÔÌQó5}¦›xÀW™Å§L”ÞH%.‡ž:׸í0#~ÅiÚ~à)ò8tÀ$í–°€Ï !rp‡ ZÂ"Ñk × JÈYLË%4ÀU²q+Wi &EbÀ%b¨*ÐBƒ®‚0§c ‚+Y <2€†õî()Tˆè‰ *DVC@J€#X%FˆÀ”Fˆ% X@w`f¬ ¥\3I¢ ­IGÝ#«ìÀÚÏ¢än ©£\,¨׸  ‹~‚™C%x-´¿"½Àe -'Æ5îüŒ)¢©P ãá-®Kiò€mðÆPp¨¿Zà)0.(lðÀ™L©ùÒd¦4ÒK=š%±ŽÂ¦ß eTÆo•È2á(p%D¢ŠN Š˜ ‹`@”X°%x;ER -†ÚL *‘T“2âQ总“)ðA—eÙAI¢ïa™q ÎEl¶ˆ#VeÄ¢ ¢ ¥ä¸ei–šQl ¥ä¸`GZ ØÀ FZÁ, `¶B(Ñ Â-€%ˆ à¨Yl %[ Za #Dh°‹f“ R#ˆFZ P¶AT‹i• ¶eÄ @)eLˆÒ‘m0©F\JˆÓ -‘VËeB“#ˆÚÅ &ÑÑR Äš2ʬQÒ`jËÈi F‰@{“4™Q´ËEF% a£P›B%]M5¨­rxõ àò‡Pæ°TÌ6¤`e€¨P€" AØE/¼rÀÂ`i3I¥#i•3Iä ¦n, &mH ©RIšL )L ¦jÀÒ‘¤ÀÚf“I” ¢¦mH ¦R€Ž&\ 2âщÃr¦‚<>£ú|fî'ƒSÑN6©Ð%®«(åTk²*_¬‹t‰NØ aŠªðöØÛ†¬áŒÖ@5œpWžÞ²1º€pÆX]qɬ¯¦²hmà–l?€%*‚¥2Ro!Bo(’¯a]€€‚æƒ@J `*Š„  5È5ì]‚£Dh ·¯È¼€,=ÐËä ]p#ä©à n™“k†Î‘Öܬ‘Ô„»§îo ‚ªÙSL"Ùm¯°¦>‚€Ê€W†2‚˜à ¹¡†ÛþÖh iò†Ôø`2¹äK¦2€ªE¨¿`_YÐ >Fß-¢î¾@mO†Jh ¥ä¸`(¨($½Â2[ –¼L¢©yaŠ[F¯È D¦ÀR 0'E°(Ñ(”¡D †J‰@ ’PE %( e´ÀŽ&Z(™L»€¶™H2ÓBÊ‹‡ÈÇÁ‡ aK±@G [¡¸ †G2Ð¥EÝ`LŽ!hU&]ÖAÑQK-(NE…Ad0P¢PD[€¢P€ʘ  ©C€‰e°*c (âe ˆ-«*`\2m°#D ¨, ¤kpC Ž F¨€dV”¨ªVp̸”eÄ€aVÍ&ÒMp¾Ë…0•r¢9°‰a0-Ùh*m#@f€:*aHÕ€¤eÄ+Й¤Â4™Ò.Ê)%£›UɆ‚–ÖjqެmrTxõ ã#+¤TÁf@¡E? è@€€!@XÙ¶i:I•H£išL )L#JTtOmHÜXLÚ3i¤Í¦“4˜LÚ`m3IQ@¤2މšL‚† bÀPÚ˜–šg)é/G—[ÐÂnÒÉó=G¢ž›´­y𫵒RwѪY§ìJ}¬Qœ?”¾@§ø(AŽ‚Ÿì Ѝè<ä"SOØ¡QûJ îhU ¨×±?ƒ-Xƒ^ÔHâEGjŠ¢2ÀH¬ t3IlÒœ£Äˆ:G_ýËö:Fq— +@ tŠ&[ªcà)ò\) à¶äS¬;~P¤ÀSEÝÓ aüŠk‚Ф×%¸¾¨‚mð-®@¸} ðÚäªWÈ“áÑ6´ÝäR~ÀkŒ…&€¸k(”ºä¡U{`K-6ø&PpÃmkÜ[ß‘H4 BÀ·ä”ذ( À¤¢…4,! …À ,  °(Œh•@Khª^@´š#‰Fi¡tÜ)02âJ %–À”e¯Atw *8™hÜM0ÒŽ&j€[ER ¶™°#Fx[Úd¢Ñ [@#@€ [*F‚ &[‚P˜ Yl b¬#4J ­–ì!I‘Å !­äªDE²ºeV\YÈ‹¸Ò‘E´@gi((©q®ÈâTga 'DVâm4‘Q‰I3/!Q£-eL#IšÃ Ž6eÄ"Q2©[4˜4™F“6˜Vã/&ʉ$r”h¬°Ñqx8­Hã“Ë8Ó%j2S*„h @ € À(ö, ™l ¤Í©­Æ”Š4¤iH#jGHÌŠERišL Ŧm0*fÓIšL ¦i0*(i3¤X F@K`iH&²Õ‰i¦sžªeÔxµÿ§ÃRÝQà×ô3Óv•¢3„ªš£‚(ׂÉ$ïØ ‹¤ËDû@µ×B’—ð©7ã€î¿¯qµÙD|Š·Žˆ 8«Aåq%;+Ê`¯ -a‘òÊiQZÅœ§äwKšíÇZARšè ¹%VB*‰X #‡@T°ªë®‰ì¼ |„V(äV+°¨:ÑÈB‡aXkkŸÁ[ø3´ŠŽÀ`SòèUເªF­y Ôu%‡û#¬ŸÜ¨+ªj\0h[ Ò‘WÈÆ /!@r²ÒL_ºDI>E.€SERÒd¦¸È k’á€Úú ´M>K¶ø`L¡~@RèUJþÚ2‚¼2‹¸!Iü“k\N‹h!M²á+Àà ˜À 'Q†¼À€Æ ˆÐà ` C ,¢l`—#D %–Àa‘ÇÁDÊ L i©—@‚“E´Â²Ñ;QšL©Ø“2â¦@‹eä*Q–¨ E°-hL `‚Q( , Q²¢زh¢Q–TÀ¸aÇÀDh€S.iP¦ ¸dq•’²¦”Š6™qQ3ÐU²©i;.q3@ dU³I´ÃôTfP%PQÊŒ6ØÂaL¸âeÄ*Q**`U#Wd“2âQ—GK4˜VÔ&Ó7Ñ4ø Y¦\¥ àæÐv¸1¨·#*àÑ 9(C° @(T@(\€F€Y 4™J4™¤Â4™¸ÌŠFã :)°7n2hÒ`i3I¤Í)´Í&Ó-@5tLÑd`@Àœ "›Æ@iHrTGÌKI2èójú8O˜ž-oé˜úà¨ñÏÒjBY‹Hã-7pEe§â˜¬û{“m«W‚7O*È+¹v«ÆP|Wö¼t^d¨ü.Š© Àº%.Q¬à¥B«žÃçþðe'ÓLX]Ñvª=| ©°#_ºk gjWî+*mö}Àð BÕðx ñ€¹û“žÀv;° màÁ2èu‰A,d DÚì Ó&УDÚA¤§^àWŽÉÞ@ `‘òx{•05eR ©ø7Y®r¼c­Î‰§ÃÀPPʤ€Ñl¡‚äx¹Ajø@0ùàmÓäxbÚß”ZOŒ)¢©yIû h ¥ÐÃê€W†P\…É,H”×a ¾’ÚؤøM à”(¶P…00™(K`(QBÊ¡T±È %ÈB€…°JbÀR%Jh]m24™h™@U!i”G4ÐXI@Jbè— âe¦€epÓ#VZ'[-9#@fBË`*É@f€ÅÙ¢P B…,¶nÉETh ™lU”GPPXEL¶¬”š -…[²PDh” ¥"¦i3. J£4²ØUR.lŽ4š#¢5¹Dƒ2™r²ªQ–€”J•2 &TÑA£. G¤ÍX ÆÀË‹#A]ItA¤Í&”¦Q¨É£¬d™Qª³–¤P ¾Ê ¶Ÿ(Uð(¶«K¯Ú(Z} ð+¡~B-&JÝ >@PʘÃ@i)¢Ø@) ˜W‚ˆ, A‚ØP›BB˜8€‚À¤ &Ql vF€Í2pQSdÄËM71¸I™hX¤Ê#L€-)2m(‚À©Œ2âf™BÅPÒ-‚…–ÈŠ%!bÀ¤ ©@€¢ª!`* …²‹b‚#D¢(,¨©” €¥–À¸dh µD Š,*Ùpq#AYS4¤T-0â\rF‚ˆXGH³\\ª Ë—ƒ ¶T&¤G¬´J °*‘¥/! Ž!Xq¢4XE³JDÓ YUµ’5`eÅ ¥äƒI•2©#J^ë O'L?‚Ä®zšjK'–q–›ò…H›”–N3TýŒ´ÈÈE@Q@@ì(@€ À3I -‹(¶iH Å›R ©# :FGHÈŠF“Qf“Iš°4™c 6¤mHŠF“€# I”t‹)3µ…F…^ ˜R*eF¬¤@M¨Ì´Ô¹V]moC§>²x5¥É?¥šG—WÒOO˜³Œ¢âÞÊNšhŠŽ²^.ˆ*lËX¶.4ø@e«¿!,Wž@"õÇ8⟠FóŸeª·–~•„šÀ\|©SWAùªD¬…;ö <0‹Ï&k(”°F€‹Ü%ÐjƒIFàî˜CØ•aW€€A.Å`P?P•¯d¯`aª •H”¢4jˆâh”@" Žò°ë@Tß ëØ ¥äÕj2”xlèµÚûWXêF\3@ mw°-Œ_~@að\¢ ‚ümŒ0ú-ùIñ”Rò)?`×*“†)ô—’òŠñÀDmv+ ™Bü€¤Å42áôÛàg°-¡AL¡a“à[ò—B˜ ¡€2La€ÚL -— @¡` @-а¨Ñ8¶*À”2€_‘I(±†ÚÆl¡b“8™ªl·`FZ9@À %( cJ%ТˆÑ¶,HË^ °-€#D À¶FˆJÊ€ ©D ¨* Ø” L XÀŒ´€…š°dhȰ™m>EˆÀ‚­–ÂJQ­šRÒv‹µ4\Líh %äÖå KQ²n(r( Fh)‘aLÒ ›B²ãFh² ¤iKòQmF\L´ÀP¶Í)ËOY£Ñ © ­µƒ2ŠdiÅšŒÀÖ[£î€Ôf»äë Jø)]£%$IE4V^yúI4å§×Gå4Õ3*äð逡…"¡J€ì (P€ …¶Ë`TʘLÚeLÜdÒ,éÒ26¤”¦“4¤“*`i3q`m3qLÒ™h(ÜY´ÈH P $¢sx"—fXÍ©¥#JEH¶D â˜F\"ðÕœ5}ŽªâŸ±­;ÔÿMÔÓ·©9ÂJM5L (´¹C<ÖH ·›+[–9+î¶kšq6ÓV½‚ãàr×\çä 5ïîeÞ u.ÇÀg%ë<Y®ýK<ˆ®Ÿ*ÀS»BqIä+-U¼G”™tç‚%LY#])·Dqñ€ pÈÕà*5à´›.? ªÍ€¦@Aò=û{!ObyµÙ(*<¢V*_àp¼…D—%k!H•W|…J¢5€‰Te ©H4ZÅ‘¦Ñ²vƒ°€`€,&À»¨ªDNø7ILJ€:Ç]?¹~ÇXÊ2ûZaT|Sh¶“ð[\€º`2‡ \ô/Êàd kÀ¯2‹wÈ ]€§È¯ A°F˜ a ¾PW€.QS RÂ0ÀW€±Kò¦…E*Š˜^pTü€Ã#‰C(¶«XB‰@.‹†¡TØÃP¦€–\0%(–ìÒ%4PR*iS2âÊ€:d 3BÙˆQ(ŒP°  ² d( t,€J4Y@„h¶9(”B²€ Q l A  "– …c‚ °-•2*%*ذ‹iŠ4J[ ¶0Â#Dh @*Ùw\28ømh”QÑ7ÐGD—f$Õà+ Ù†‚%³I¤Å #‰š , ™T€¶Lâf€”&i0*‘pÀŽ&Z4@<çHM¦êÓžälVbPífÚäÜf©H›ZûXެ£Ê£Ñ§­ªmLz!¥9C/ƒŽ¿¥Ž¬SÓ¨¹÷ ùººrŒœfªHçté@B„ rH€Z@E²¦“6™FâÑ´ÐÁ¨È#JFÔÀÚ‘µ 6™¤ÀÒf“I›L ¦n, ¦m06˜4e€FâÊ6²n(‚Ù@œS ãÙh+-PL‚¦]ÅqT€Ò™¥ 5bдE,•¤Ññ?ªi-9©ErÀùï§ÐºYÀª™¤ë’*fšW/Š-vJMÓàý´—È«\Xc7hÒ‹´Q.!Öæh±Ò²Aqø¡YK²†Ü‘&Û`k g¢5õSȰ6г^rM½øÐq¢*%gŸÀ sY#VmEx(mâÿ&Z^H¢¤fUÈ,×|„ гìK¾À£>r¼Å„2)þ£Y*U^XBŠ—-…gÚƒV¢%ÈD¯(•ȰF¨ãƒ4(Ž$¨™²2²‘Ç+<¿`%4뢧î”'›D†´ãݯs´uàùN,+¢iðì 8à¶Ð4jÀ¶>YpÀW¸ù‚ä)~K^à2† í$ËEذx _LR訔Ñwy ´™)F;^ì”%°`ßÊØÀ @,´€Q`[ŸJh&Ê.fš-€À &EpÉ@@  LY( t]Å 28øe Þ@a™q- cF‰@[ˆÐXDˆ°Q%P¢d `€J(QYHˆJ(‚€©@ , (*Q["‚ŠˆÀRË`\28„J P©l`"8’€ª™l"V0M J7ðÉú}6ÐÝ\‡6û%€ÜTÀRaÄ+5@!e°4¤\0#™q5Ee°4¤\0#™q4–U )ì HŽ!^BuÑ•HötQ(„¤Ì8´ð3§àé¾Iúq~ß]ý2–œ®3ÇižÙÆ3IÆYŽp òÊ1ÕKOV5/÷/Sée§&¤¿÷+/:´é†ˆÒ0 P¡@P¡Ð@P@:+IàÒaLÚeR4¦¥#J@tŒ':FGDì E›° # 6™¤Àét‹IšL F€ËÁS(íVA,©€Ü°3(.L<XlŒŠ&, bÀ©•JŠ‹¼oo#™Qc©Š<Ôc¿I¿|ЧÁ÷›óø R]Ð'·Ã/ºðNujº(%N‰•†«)~ yðÚád¸oðYKØVÜT®\ôg T•¬à%\”Qxvú@e¢®—L;^à[êì>>@Ê^8+Æ@+wàpˆ€¯¤ËWÇQ(Î×Å^ih L­S´hËW/xÁjÀg,—Û•å²ñaS– ì¢t¬û‰*L*,×’$i]¢P«dÛ‹ãƒ. gi ›Z#L€a—œ*øZ% "*`iK·y"´¤×Úèëy/»(±Ö„±tü3¢ãH´×¸/%NÀÒbÐ †Z}dùCám‹L -…ZCà‚ÚDÃO¡t 5à¨e L)^ À;Ÿš-…(S˜äZd 06øeÀRb€[Bü€¡”ˆQ(U±ÈD¢el(dа%P°ˆÐ"À¤¤Qšhn -¢4A–…€²RQ*Š\2 Dh¡‘dE™€(€ X(”(‚ ( ` @ °¨[ ”@Â-Š ”XL X«›I@BØÆRˆÐD¢pS4ž*I‰@ í,PG’KW¤7+Dä *Ù¤üpÈâ—PØUR5~B%&G2Ñ¡0­)ì!µ3.!Qª @XR-Ø0EoMÓ=ËíE ±ÙeÌT£î€°Õ;FwØR;ikJ‹ ôGWOY%¨©ù:ji©iµ*—†òýG¦Û•ÁåiÇHŒŸPŒ((€‡((  °ªŠ‚6ž )]Ãq¥&iH£¢‘Ò2¤dm0:&iH &i07qfâÀ虤ÀÚe-à– YBÅG"Åä )Û"²Ì‘@XÅ€ÜMÀMäs*2¦ï“rKR >Ê­¦á«(³š||ªà±YþËYeÅÒè¡ýÍ4ˆÎ+œÙ”ï° JªÍ5–ßeªÌ¥L ¿¥,X^XåsÀ¯“V±‹ä¢tšYìwo²LEÁEü*²8\m>%IñòG^Ì Õ*EV¹Ï ZÂ~ÄjÀ•c›þ¤Ûb¢ÿu€"ŽIµ©pQÂ2Óðk&$­€irvñdk®˜a‚¯¹iS%õÚ "x¦^B»2ÖkÈT§~漄D³A®Â¦Ðó`f¹Dq•üÛ]…qÉ6Þ@Ž$q ËY÷ÈŸÀá‘.€P>Í)0.åÙ¸ÎQûdÑÖ>¥ÝJ7îv†¬%Ä’ùwb—@T™nÀ¶[†\ù~E.€e×`TP¥ ¶»èQÊ夸bš(Yi0… ‚ÐRËi6ø&QE%2…€ÁhC QH µŽX ÅpJ(eÀa‘ ‰’€¢S”XÃ4N¶JL¢4Kh h•`Ge,a%0%–ÑB‰@N0FŠL„['$RˆPE!`¡`D¢€° #DX² J( „ € YB%`@˜E°¢P¶l¸4J*Ùl¨r6ø •DÜM¥|gµܼeÙš€ Yyâe  Ùl b“8™  º©R".ãeq%B¦TФÁ@ˉ((<ÀŠÜOB“(éÙ@„aÉdV%øÃ0§(<ðhj¦uŒÀè¤v‡¨šƒƒxÀME¬Òg“Ôzzn– ËÇ(¸á'É()ð € ¡@Bªf“ÀiHÚe7Ö2:F@tLÒ`i:4˜LÚ`n,è˜R:&Ó42Ђ©¤Ã`d×QÛ3µ(Ë –,e’02̶nŽºr³Q=w§rKQ~OjöþB&]¥“]ä ©Ç ÊVH5›²:UjÊ5Û®óò@º‹K® µþùMRÏJ+ÁFd±ò2Þ¡?¹PWhÎ2ûd™¤è Ö •òèÆJËŽ‚™-ù/b «eAÅ‘A‚…  ‹kÀ¯L¢Ø LSA ˆ¦K`0ÅWDº.†PÀ`P|€i2S@,c°-€ä¸(” P°‹‚P€@@i)¢…ù€i %±É¢U²Ý€£4P4h ,”ˆ@F ˆ,€” Ž@Qƒ , AAaDT!E”,¤T¢4TL¶T(”ETË`)24TJ,éä‚ýÜ"8QPµ.o 2äÉ`[.ˆÐR…„Tʘ Ä LVÂt«aQÄ 4¤«±H ¸ø3@BØÍ)lPq%å*A]£‘ª`j-£[È*’!Dl–A,ËÈä©à±œ—,±Ö;ÇQ0:ÃQÅÚ;ÇR:Ÿv¨•ÃÔz{·x$¶º‰ŠÀ|™TB è@À@ EULÒ`n2:FEGE#¤dTði04¤m06¤i0:)"ÀÚfâÀétL P#FZ *c7m .Ô@ˉ‡®r…qhƒ.ÐÜE]âÐe0Àĸ.”‹êU8Sìù^«CôµxÃ*<ÿY(8¨¶ÐÛN¹ ‰S¥”§Œ”j—=xk¸t«‚¤ÒO®€&Ü(.*òÔ•ˆ¬<€}?ª-"ZTtPkÈ_V;ve¤ñÊJÐ ´¹u€+ŠóvŒ«¶ÚÕÖ{äCk¯ Džä+§À¨5ty¶³à{Ö@Ž9ã±H‚SjøPq冈%*t̸ÿMªòÅa]q#X®ÃT€Uäu¥aUø$jøËœ">' 4•,™I€§düXÇ®Ñ+  gÜ›rÛõ3.)qäÍ`*5dhƒ<`¬Cù }d(ln´Ð šR Ò’ëXëÎ>÷ ëQÎÞ2O‡h é¯ÈKÜ mÐV¬_‡ÁS¶pÈ(XU@0ZeÃ^µÈ mðÀ™E´e P¦,&)€ºÐà€Àc±^àNpÉ@2…”Zð@@)(DJ•È´äËŽpQhX2…€%2…€Q(„Œ Ñ”B€(‚( 4J(ÈJ(” A %A`QD¡E¶#[È % bÀr( @*ÙSJ˜”1µšŠò¿QEpbZ…fì% ‘ZL©ÙPÚŒ¸°©D©•H h•ØTh€„iH¶“2âhVè©„iH¸`G-PˆlªAqpÀñtTnØWu©´ å-dø1ú–j3¤geèË22 ‘ )4Xk5ÉÚ©¾J=ÖÅK(ζ”5>¨ÑS-M7R1‡É•§Éx 0t:½…@‚( &@v^Ài‹*:Á"ÀëRJViH §fÓjTtŒ€Ú‘Ò,‘‘Ò, ¦P)š<ŽXb°l ˆÐp9ÊW9@ÃILŠ–ÆæAŒ¹X«2•2ÁßNdõZkWIùF™|©J¯ŽK&ê’à Õªö#Î;»O T¹þmô<ñÙ¶½€ª¯žZOîKéÇ)¨ü€ËDM¹7D§ÂdÕ«è¹® '9ö"·m]í÷ä&’—°*i„ü‡íìí0³/ Z²f?F±ðDåRú±ÐyÈZÿ±c`3³£wž:òñÙ9ÒckW›mÁ]e–²JðAwb¿`JßÀÚ~Ïø€½·Í‡„&ݲ é™`ÁRʺK.Ñ/Ê $Út‰J©p®KXUqÙ+ê Sö#Yªè*W!¼pvÞ µ@Fº#в ´+6ãÝ'ýÀUä]â¨È`2U*`iJÍFU˜º"»CÔÉ}É4v†¼%‹ÚýÀêŸå 2)•ÆMÅãêY*-!À É«6@E¿`V¹Ò€²òE `0)„,R*”ú °†¶PàS@>E ¦P , C 2d b¬¢U‹‚P`(”À ¢#Ešä djÀÍ¡4L€°@h… …œ€€(Æ J,‚àl‚¥ ¶¥‚À¶”BL¢Š"¥¢*Ù*Â5Ñ(+q6•rÈ$¦º0Þâ£-°*~M`âG%P°ª¤iH!†G2ÑÀ©•ä ´J,*î-„\283L*ä¶R-ØB“#ˆVZ ¦æ5Â"¥¾†ÖØZl=9 1M2¦¢R^åh£ Os,šN€ë ZÃ;CSÃ(ÓjR‹÷ÏÁçÔÑÚ­ Ž_<Š" 1(Ñ;€(€;€¡(€T¤mn™Õp¤é›RJfÔ€Ò‘ÑH ÆFÓ¤dtŒ€ébÀè™´ ¢,0;Åà TPŠ Œ¸˜p*¹¸p Ç+FÈ ÀÔS³ªûrT|½JZ“öf[Xq*#dJÒ¹EñdKêçk+)*#ohÛÃo ÎEµ*ð[‹IÑk<Š*»t¹÷þIµ·MÕG‡É¤þ”Šc¿ 7LV1ß \òN¹ç mùÿ…ÆlxoÜI'o÷IÞ9—( ²¿ó’Ö.€Š5/ƒUIÅ«¯‚Ó¾ißãÜ‚EÛÉj›uÁCm¤ø¼‘®“-}<–±ò¤MªÀÌ—4J¬ÑUÈq¤ß €œ³Æ@¤Kë<Îêï •*ºwŽ‚V‚ŠN6EVAóñÉ1À¨Ê^{sÙTq];~I¯&d›ä*U™iØ 3@M¼çðióä4@&|Èè*vJÕ$½ßðL ,eš6Ÿ”En’‡Û&½ŽÐõM}ñü ;CVâ_ƒv”—gMÑ ¤UÛ x”@Btl¹èŠ_’áð(X €¿"€d¶¤Jh*ØÊ‹†(PSBÀ¢€–À`P+ÀÊ(XÃP(Qše:4g‚ŠE¡À &P @@±`BP”P œ„ €5à”-Ð h”I@@2ØD¡@@±‚*P¢¢ "­‚ˆÐ¦57ΊIXFwW\› Èy(‰@Aa6i;I‘Ä ±ÀÍ)l•`G5@ `TÆ5àBe[4¤´ÅeÅ’€…°Š¥F“†G&Ó4ÀW’ ~çä CQÅÙê„£¨¯†ÏSI>< âÂ$eLôéÍMWe DÅ™|d€¡tUÙ¿¢°¤Ýá4æå ÀqÕÓO0Ë9'Ó"”@  @ª…  ø  ( #HÒ`i3¤dTt²Ý  Tn2¢fâÀÔ]T€ÜdmH‘‘Ú´YÑQ@ŒË@oNU†u° ” (J8˜p(ËÎP æàaÄ+!" ÀÓà¨øž§UÇÔÍV,CR.J°½Ë0Ú}šx µ\™è¢ÝÕpip@§X_Ê´PuDY•§†w–3,ƨ‚𫱆¯°'my*V«ÁA$ÞU.‹Iû¬õtUI´û®hË’µôГ´J¦©rªäîUùWO!¦Õ¾€‰V<–³—È,dp­º´Òü·ÊòA¹¾ÑSÿÜ¢Õó‚. µ„¸#+°3•†…SÕ«ì&’º2Šü Â4+¡\y(UЦA*¹#cÈo Ù?IÐYä-þä¬__mJWAßì¡ ¬¼¢Ë¯ X%X¸DÛÓA®ˆÖB¥fÿ$ #Dkà •ÑV_ÈSø'Ç]€(DÍבðÀ'äÔgà ¦™¸êÎ~ šµ@j+m?àÊX«ð\g²wŒX³ìÂnÿ€+J¾ µsù•ðY\‘Úè³Æyù@^reF÷yL†Àg,r×€#˲m¶À5TfQ¶kDiÝ|mج‰Uy@F²È’ð§^ŪD¬Ù( ›¢Ð$ú-[° R÷&,Y ”»ÒL™å»Ù;L2ÏCœôÛI+ P ¬tLð(Š*èÕ> @gi¾²A+# Lv‚öÀ›a«%xø ÀªÒÀÝ\µ#P–×qtÈ­éêÊex=õ0—Ýô°:ÆI«M2Ý€§Ñ~@´ºÀÊ÷ ¶»’ l&€¿’ßé—(% ¢À`QBˆ¡t‚(@†€™…À€@BÙCh ´@'$ @hE€#@@(– A@€ A,X #@€±VK „)1@J,d,жJ(!bÊ4’dkÀTIÙºK’ -N’0äÙ@ Uä4h€R¦m1AYh€ aÊÐq#T „iH·`M¤q`f€ £VÄ ÐH*©»VeÆ€”@‹eLm ö2Ùµý8¾R/ÓAÿi—è£Ö¢/BÓ¸È×èjAg€®SÓM]H8²²Âtztµ•2‹(ûÚ¹ml ³Ø€lWÁh+2¤H+8(¥¹{škmhÙÉ:äŠ×(„œ…PP:¡À€@" *bÀÚ‘¢…´iH#JF”€é`éxȲN™êј˜ÈéDÍ (2¥*4¤²Ø€±`,©€&\lç=$ÂPÚÌj:ƒ üö«½I?s%mG0®ÚZÜ)ñäôañÚ+ˆâ’k‹ÒË*·Þx¾X4ãU’VWYî•rZiuxgȼ¯`5‰G䎚mö@OÅÃV°Q#Ž}Í:Ýo=u»‘T³îÀW±È9Ïa«È:¢.? Y'„º"W~@»~›ì‘l ÂÇ8²Ÿ*æ¿(ŠW:}ÿ+»3•Ç`\¾yòyòæÿbU¦€­4ý¨œb¹5j ’–y²4Ö@W mtQÃöà‰)uØiR3·ÈkÀ*žHÕ|2¾×ä%ÍôjhÍcäú~@ÿ`;-&ÓK!K4Z]0#_±+€m¿ÕiÙ; W}’ªÂ#ÄIŽ@Wb©I'VÑ GDq¥€3Cihmý¼(p±ð©’º@÷`'žÍ}K/°ª¥îiJÕj2qûeGXz™ÇîJHð×ÓŸ÷W³:§ù ¸a&¸*–»A+á„2‹iü‘L¢îÚ(¼0\0-xäÀØ¢†E„) a@-0 PQ¤¢l @Œ‚6ÈQ(Ph€@ J P@Q @I@@U—ÈÀ`A`[.x%BØL4¢lXI@Nl*`W3Y"´“fÖØsÉQ‰NÙ‹°§$  ( ш&±@J&@¶V9 °¢‘pÀ4f€À©Ñl"Òf\B¥–Â*b€”JÀ©²Ø‘@Ë@yR2ÙF£Š)€© +åÔÒÆ6¦òX•åÔÓÚa:eG«GUOé—&å (‰Q²¢µTº"»ù®Žz’¤ˆ94äÍéÇn¢L°zéµîŒ<&(óMî•£¢¥Ú°<ó„´Þx&•@ R e ¨À@”°6˜¿"Ê4TÂ7a ;Åš`sn™éÐÔ÷×§;;ÅÖ,Ú`hd  ,TÊ™²¦±`,X1eÁºà>©ãõ2qÑ›ö%WÁ|‚¶ÓOUÁ«à=I©æÈ•K’¹•ž8.×k4ú²ä\¼Xa«*Pô•ZJU†|߸k>Äo\¡^ø(Ÿ o.k+Vþ ×w›°#‹é•>ø[K÷+´øÃ·Í†¼r¾òD»æÉ%ITÕö)¬·àÕÇÉ*¢•ð’Ý›ç49ã°œ3-w\Õ›ÍpYuû+¢Id Ãÿ‘Î( T°V¸-ßîI&¨Rjÿ€&ÚÁÕ#.êüTo9`)¶Ìí¬:(”Eíɦ¾›'VÀUªFxaø•@OßÀv/8\*ù`Oa·Z¤J°$šL•€¨Ö)’®‚2Òº ce ëj]Yi_Á4ºY"ý€x?à ‚| ʯNFR »¨Ú‘•KÿsPÔœ>Ù:ðxz¥ýñýŽðÕŒþÙ/€7»Év§ÃhÔ½Éq|á…]¯§bÚyD 2åS(2á€Ê-ù—àe´P+ÁPʰ$°‚…   d`B6 Á€ @Àˆ¨€ @ ²¢ˆ %–À•àP[ؤZ²Ý„*É@Ayß‘†h€t®«4VãùÂ,öERË ÃŸŒy*!†€€ ¶”B²‹` ^@E}ÀÒ‘m0… ¨-T‹a #@f€UL©«L›B3D¦^@Qš Q, lªAµDjÀ÷QhÃm$i 4‹@PÀç$qÔÓͩɩ¤ÖM2Âm<­e%¶\”jqiZdÓõ .¦˜GX¸ÉZ}ºÁG-MD®Ži9°;GM*òME•?ÀâÓŠg=F«8A\Û=MFÐ?W&¤¢þN*TeZM0r ª@@€ A(¨ &l ™l &n2ï 7Îliêma^í K=‘QÚ ê™“(PÅS-”KAlXqwl–9ÄùßÔf¡¡%Û%Xø`­—‚ltÒÔØéðzâÓI¦V,1ºƒ¦ªWÈe‰t*°ŽVQi'_€2Õ6•{€ÃWeþÛðAmn¯bí~ *YÃ#ç€R¶¨Ü€#I?’ñŸ`%îXä­ã \4L÷š·uDry¿Ü,¿`Õ¶Œ¦Ûi¬¯žKJíö]Ú]›¬ôZ[Ÿ±oéÀýÛ£ÅÞÕû^:À5Œ‘+ç”xÁð퀊¬¯†ud’¬€ä%ÎUàUàã߃)'†Kø2•|°"­ÔÈãœ9 ò˜–G<ªïjšðÈ%Q6¿{%ØY÷×·FW`^~EU…ee²®B*îˆî€Í^è*¼t¬’¿îÆÚöFj€Ì¢úìVZ|™!O¿Ø*8ûd”èí¿bVi*‘=€©.{3؈Ö9æ²OÀ k³j~pEiI?TÝp€ïmH,;^Úª/ïN>àz#8Ë1i–ÓÃ@]2Û\…J‹âÓd½È…ùÁkÜ*¦ÑS@Rß°(kÃer0€ (pP€QD(@P@ e¦B"¨ €¢ @«dDbì!^ @…\2P†@YpÂ#D  °.|F€ -€¢m~É´ã Ì#/l^²äþ °ˆrZP ”‰–À€…™l"P 2[©Ql I™q5@–À Q©•0-ŠL D ¨-•0dqP ©f®‚>¤Œ6Ñh "Hg6€å8_ŸRX•äÕÒqÊ9¦âì¨õèëo[dò5´»*<ù‹ä×êͬ¿È s=‚‹¢Šù¾É:pþ@Ô%ô´qÖ–( ££ÒÓQuÚx}e­U|Ñç2­FTtäÀPRè@P (P "Ž€Q¸°(£I•`ÍØ ´sn˜W£ÓêåGJvŠNœŽÉm3IJXe±d Ãp ÅÜÌÎð°|_ë·5òJ±óPì­¨”(tÑÕÙ*|€–=Xï%æÊæU¿b?§ 7Mâ̾ßIZ´N?äI«º*ᮀ8½»’ Uâè¼2¬•WKÕÒ¼Xçáqð ár9D4ÿ%º_ÁDåc¿à®8Çàºÿ!4ïÈ×½‘¼Ðÿ©»Šý¬5iPQ¼ßc7ž€ËT®ìÕUæð"IWÆx*_Èñf]^«ù%_+ Oî->EkerÓE¦€ËM:_±và Öì‘Ç+eÆ—ol ¸«ù <«¶EǸ¼™^ý’ÍX|Ðj×€¼tA+>Ç_Oµú’v¢êŠ3¯ôÉãö1@Düæ‚uÉ8´ø Èv.òØ+i_±T«äV½Ì;òeó\€ìbð¨*8ÿÜÎÔ*û&×·Ø ÓTêÃöd²JÆgž‡_ȰÂ*ý²ÐË¿k³Qt€ªyäÚšk$UO?Lš;CÔêCîú—¸áêtåIÜ_¹Ù;X¦ˆ-¯ƒUằµy S\¬Óe%OÉ».PE´> û`ZkÜX ,ùH°…€ %ˆ#XP(€ € @%@@!@@` @‹Q)  °%Å&h -€¤JªvJL Ñ*€#vÞ*ÀÓҨ܌Zeɾ̅K÷(E¢PT-‘Å*(4@©(Ð/ R4€ÍX hDªäpLªA´É@F¨€ `TÅXnI@BØKÉpÀ”ˆÐ€UL©„^Egi(¦‘¤Œ4©4˜ ´9ËOp54½®•;HÓ.Qn,öhj©­²ä¡«£hÄ}>å÷PFe¥=<¶«ØGVqywòXêÆJ»5V¹2µ+ðrû¦QëÑUóÁ©¼X£Ãꥺj?íG*N€ÚvR/@ Ð/`P(€4€ÚÉYFl©nÁÕH£I˜™Ò“Œ¥éçhÒ=ºr;&A¥#¬XL‘,–r&à&âo9“õ£Ô0õ—’ ÏÔ(Ŷø>©ÖzÚÎ}t9Ùl­@T +Óéµ~’åpvµÏes¢o¾ ÷<VÚmôÝÓå{±k8à ‹àpÚ *o…Øá7Ьq›%%iuyLJ䫎@­ó]Š÷UÒé˜9mIѯî©{.©{*fšµÎ@¬ðZü6ì~IIÓöµ!«¤~ø5|y5iþáÝ? X÷È«€ ÿ|ÂŽ;"J袣TÞp·îqéurèÕ¶—F³ÐQ÷ØþJÕãÚ€Ÿu{dJÚMx:Û…ƒ-4’}€¤ÕqdŒz`IGš#O—È —p×T¤¢ÚäÍ^9 3ͪ&Þú|þæTZJÀÕÜ7mâJšÃVZpªR¯$ž¤çi$¼"nº.-Úè«"âÀZ_°¼öñ}²5ANxä.rT@%d%õPR»3þ@?r8(4¸2J̸öy%wÁéreó|€«ä©öæ†<_+t(W€‹S®YRLÜ&âîh+ÑW(ãR¼£¾ž¶”ø•? ƒªxòU’©mO³ 'ÐUpk‡d¶¹@0^-‚ la•Jh_/ÀÊ *@€ PI@(€,˜-xdàØ   „( €(P %!A¶0‚­’¬Dذ…h(¼’€U*Å›ûÝ$éíydÞ£ÂÈ”¥,¶fÂ-€% eL€ÍPÊØÀ‰AP¶ì¡‰DP&QmÑ (L hP ʘE±VkÁ¡l"Ùp¢5@@LÕ…9%FˆKdÓ YQôR4‘†Ô #@s‘#Èž–åhñêèµÑbWWJ­£’n/Á¤{45TÖÙ<]6Ó§H#—èGkËo§b'úsK¦™éËMç…Ú5 g¯( BN)ûàé£ y,G³j\3Ž®¤aïà”|öíÛì„PShÚv`€Š@ª@l Ñ@€ &H³wh£Y!‹ÉÕJÊ6žv‚1ÙëôÓèéKtÀÚ‘Ö2¢f–É`a³.@aÌ˘z†^¯¹ÎZÉvcõ׬KÔ*äã?T—d]myêbéKª¶P-–À¨böÉKÁì‹Ýמš¥+kžˆ¸m,¿•i:¡ÒKð€«§X –|ÏÉeÍòµ}ÝQ§öµÕ²«T€8ý-~Å|SË+òL~@>-ÓÝùÒ| ÖóÐ}¹S–_ÀÂKÇ@^½¬­,¦¾ ª&U?p'âÂVÕðï> Ý{°2šxç²ðì[Ÿ‹.+mÍ^:-$À‰vJ}vš^J—· U¼sfií`oØžþ0£$›µð®rb±oðF­ mù.×yšŠ’hÍÓÇUªµîD­g€ cJÞ@Nժǒm}µ-ÄiãÀ ^+²K€qTŒ´Ú÷-}©—Œ…÷&È{²U*° XçL¶êÂ#M2EÕ€^PY»JïÁ<…9¨»å¬z°'Â3NسY'.ûWù¢I[ÉØgh #UÀ Ç›à¾]†¾‚ÃVü§àÒ“K ikW8\dÖè>©û]tõu þ‰Zðw‡¬ëR?”¢°šú$Ÿ±»òç²îj×`f¢ý‹Mw`/ÉkÀ }‹L*Óä&^€R€X ‹D ‘¯p&I` (tJ@ˆ„@ (Q (² J*€ @À`PT`iJ,`(Ñ(L!ÉKÈ‹ò]»ßÒ‚¦ÊyeýM«éœ¤Û¶ÉaK@f‚ÙpÀ”NÀa†‚£D&[D ¨YHJ*0¥”€Ñš( ÕŒ2*4J(…¶wÓ4F€ X°-Y@¢eÜp*Â¥š’ØUAŠ0Ò€ š’€Äјrx¬ÕÒRX(ðêèÑãÕÒðŠÃŠn öéj~¤sÉUeÊX<úÕ»uÓèµÔ£š³–¢Iý=”z½;Të”Q­mXéÆ×4Ÿ©79[fU*`j2òh @@`¨ €€ t©äÚ—¸“,mH ÆF좥hë¢é„{ô¦z#"©c"‘Ö, l I˜r™Êz„eªŽrÖ÷ å?P—g OVøA\%ê&ÙŸÕ›\ŒVwIòØe Q¡@/OUÁP(ôzYý.••ð»í¼‡Œ¥ìVM:Á\s„¼‘áqÙf¨‹5eŠŸK†ºªEY‹° µØæ6¤ï>ßV9åªUâˆÕ/.’]üeuðUvO¿aÖ@‹´Ëv˜ m¯"Ø WYÁvá+4ðû׸/·Iô‡dø[m§uE¼dæ¨Ï`‹ì)®ì)&Å]°'$T’Æ{í§‡ÎCU¦‰‡õ,{To!¦¹äîŒíW\v®L§mô€´ëI5޹$ûù#…§2Õã°Õãø$”W“bÀ¯’5išj9]«Ÿ`14óî]µž˜#-fû ufsÈR^åT‘”¸ «Iã‚IPDIÕþåæ—`FQ$°û$£Ç`+^?¥†ÂŽ&î¸Wd«h‘—ŸŽ€ŽšÉ6Û®wÈqµ†A+´+Ü íEŀǴòÉÕ°Ü5€*“^æÖ¡¨Ëµƒ¾ŸªÔ†/r÷ÑW§,JàÎñ–ìŦ€¸|á•_Yü¡€×#Ø O§bü€Àà v*¸~PÃ, ( 4Étà €(EŽ@XJB PA@€ ^ É(P ‡Ù(À£J U”T²ØC 'ÀÜiò‰³sú@(×&ž®ÕPǸW7&ÞIa %¢¦Ã|–¨€Tè·äVJ ‚Â-а&ÒPPXEÁPà–À`PT Å„Z#APplZD¢*P**eL"‚¥TðpÅJ3^5`[ %ö£ ³B€Qi#X1§Èˆ¬ 8ËKõ,ñki4Þ ¼zº^ A¸K™zá58˜ÔÒMyË©Á›®Á5Ù\öå\å''’4¤“€@@èì„U @(PPv@@¨ FF¹4G€ TtS¦œ­›xvTvÒÕ=ºS´QÞ,ÜYh3´dÓlÃ`rœÎ2ÕDW)ë%Ë<šÞ­t<Òדº0ç'ØV[}ŒDˆâã-Ù@‚ E°)P0¤á%%Ê}=ÐTïvQ{esK¬2<7\r–môˆÞ]viÆUìT•g*•xká)_·.)Vjú¢¼g°'<¬¾C@YuÚ'?ãøãK.ü«övše\8øà¼»ê‹wŸkW—ðJçà^Qn“°/Dçä ÔmqÇàípº2íçºNW%KUkŸÈ¥NÀ;A¤Ö¦íüðt’XòÌñÖ7º‚Ç+Ø"üp‰?`ª»´eÓ~c\g1›-wØg9ÀÛJ˜xa­Ö“øŠãVi¯§ä+?kxà[}0#M¼„•S^Àf’<+!¬03²éEñü€K¡Hƒ ?Á+îQ”®8·ù §Ê#ç‹ X—?!…B*²>l‹‹O¡Y¿ÈœÿR–£Y#\WäÂÉ–¼à óJˆÕ¦Â£DqðâêÈ¬í¿‚W`:ÊU‹åâ¿$yoØ.†<`ÊÚàªMiNù:Bn.âÜ~»ÃÖN?zRG£OÔiÏû¶¿ éºò†ð"ü (¿ Z_(ù/À ö0/ ò ”Е Ú%§ÐitL€@Ød @"„(…Q d@” D`!D %‚`€€”´ª²69e+(¥÷êÒ¨ªA\Û¾@D ÐÕ€«, –À©ŠL*8‘  Ä ›JˆÕ\0f€…°(D y¢²Ø’PD ²Ø ¢l¶ä•a€ʤ´(Ñ((,"ÙpÀúèÒ2ÙD¢€ ’Ã9é}Àz$ðK†rõ)U•+Ã(©+G—SM§ƒQ„œ£Ó¥¨¦ë°‹­£‹£Ç©¦ÓÂÁ"Òå|…@PTͦ˜UÙaààv@ €P\àÔd­@ËDàšR©¥õ"‚;=2à¨öiËXu‰Ö,‰–ÀË‘Æs¢+Åê}TaÌ ýcé\g­9òÌ)bÊ¡@ åhѤF·€*eL "ò‚»úM^aÚàõ$Ûå|•Î[ö-\^yÐ\ñòM©Û_°Ý÷d 4úh;¥ßE…vݯƒ2’vúD–i¬:tQ¥ÂD^À¥ñß 9uÅÅÚϸ‡àUücôôÿ kìsÇš;´×!÷ñÀ ¥t[¼€yOZÍ_`[üm^ v¼x/ïLÕ<ÙªÅç‚×ÓÈ«¾ ²€WoäIIº]6-êWÏEâÓ\«å_ì…åPTîTÃ]£9aL–»­K+ Ö-vI>CŠ·}·7’Óx Ì®Òk¾IV€˜¼ðIG‡Ð®-ŠIä_É"€­[µTs¬û*…[ÉFy?JOš¤¬Ó~›óׂ snŒ¼d»ú€S úVU‘å„T«äŽòûŸà« ݶcû°¥Ã²m¶®äÅR¤htÀ”ˆÓ%N„“/øèd•äLnX`ð+-8å |áŒ4=‚µÃÒÔk•ûSLƒ¦ž¬ôþÙ5ìzaë:Ôå^ˆjéê}“OØé~QB—LerV½ÀZ|–¼0%´[@Q`Z]T“Bû›dÃÀ˜b¼A€%$ ¢4L€Ñ@ bÀ”@B˜% ) …°  ¨6«±únYKQÌ‹-g[b©rnù¢P`¶‚¥&*‚!Sa % e´À8ß\@™-[¾E&Q—²ØC ©Œ¢PP&°(”E ™EÀ¤À”J[@J%,¶°¢PC!04˜Ñ ”>ºfцԥQ…Xh&º1 N€íx16´¾ÔŒzµ„¯™¹ÅûY©EMZ6ËË©irq§0¯N¬Ýôêå e˜ðR“ÁÌ€€ºjE  H¢€Daô:(DP@P€-l¶#,3Õ£©ä£Ð²jÉQêÓg¢ Ñvm: »¨Rˆ<úþª:jÛ£çëR‹½¹"¾f¶¼õ577ø,&¤X±²• J Vj€;P€ÒfÖPKf¢‘ô¢¾šóÁYéši¦¸²´ª×ì7e2®@Ygƒ/<.0“–ªí°+XºtaÇtqØš†]û›¬{Ö'j¿pÞ? ZË-*Ç@a7kOÈ \Øé{U_Ó^; ,&òÀm«]P^pÂW•@ÀJÝ/Wn?& êQÝä µù ³ð“ÇÁi4$¯®…7ö€iù¢[â€ÒTØU^àv©/‹  cÜ^2¯ªß~B¦ûàS_ä }4bv€‹ŽlÔq~´ÓøÚt¨ Ý&*äï•€‹xx'€©%mæÉ] "Ý®CWà ¸§Ž1F]'ž%†Êø¾, ^I·jKÈ’ëò"“|íòGMÓ@Fº#‹ÝVš¬"8ÚKܪÚ\%Fvµ$Ÿü hÒM'ùœ—„³Û"vþQk +ü9AR9Áª¥È™®»ÒázÊmMä4¹4‘—ž¯°z2ÖZ #M*düLûÚÚÿ%åÿÈ×<†ý‚Ž›±ð‚ l*Wò8'$ù7ú”EiM:§“¾Ÿ©Ô‡÷n^àz4ýd%÷§Ó Æjã$Р­pÀ_’¯f·ØÀ }ú`UìÍ&×¹E´T~I^Œ€GF],Z€’€4K(`€€J €…( JKÈh€‡$ Z¦ ˆµYeZnJÒÀ¢¾ì‰jɪX@s~à"Ñ(nÀQ()e°†6(XU¿"“m2³[‚™@ÍP°.âá3À€˜U´ÈÐDhPRËv‘4YH…¢ªQ@©Œ0%»-&6’‚‚À©”!H”(p²€ ÐW²ðÌ4ÚvP„2âÊ'÷&€è˜ÔZd×_H+æN<»ÆIÝ£l©.6¦•e\hÔueW€0Ý»d ‚ ´ì¶B”@ApBŠ@È@ù v [  ¸XT³p•0ŽðÔ=:s³HôéË'¦ªf÷QÎÚÛbÝðf«âúw­?c‡‚5dº`u†§LÝ•­R…8(VÀÀœ” È2 €Òfâg¿B{ô£Ÿg¦¹ˆMGœ†UÆ×ø3 5_¾»\g°«.š4«µÎ@»k¡%µ¬c %'€³i0*ãøÇ@#.bÑ¥ÃKgíV¿!瀟C4ë/JûAðŸ¸Û¯+ºðºVg+ d ÒögÞ€¹W~D]þR¬óaõ倕'ÁÔª±ÈE\dw‹ÀU¿b%|tµßb5º€&®Ñ^[J*×ìi.ÐDæ40­/Øqv7&Þ eçÀ%vŠ–+Ȥ¹íÍ7ðOª¼šuoêÇ$—ä+)WÍ%Œ›´“ìJÒöí'Š~ôJVÝcÀºª$Ÿ@¦º@g;‹I[ðª^RF“®+°/-õDq´¨Ò´IÝÍ,d>}¨4Ÿ$[[¢ ×nì;‹¦­ ¨®Û|´+Ça’¼ ©VI 8\ä5äï>XI×øÖrJ¾‘_ŠX#ì Ĭ ÕòG†ßà ¬Ö @6à‹Š Ëuò-¬$Œþ@7dº~@ÀÅ{€é~Ä`*©•6¸`ij|›Œë1•?b+ѧë5#÷T‘éÓõzSå¸?p;§jÖPÃå >@´>@Rè¹^å ]šJøa }—àý̶]  `äW‚‰m ‚Q8(X 'À|(“ IdE¤–“(€[ @O‘Ž‚°)0 *Ù:DÊÔ]rii¹ç„Gœ‰êÊJ®—€9ØP À‚§°‹†G¨.‚-Ø #D ¶->B #4ÐîÚdÚ€€[]€¢4¦0À4dl ‚PT`ÑSò” ²Ø4 L J 3V%RÍ&õ&›¥ìa±3vP(ˆ4E«2àˆ0ðíÔ•´ôÍk} ¯™ÎZ‰Êš"Æ5t­\r+ä‚]READ€ @‹‘ù €€€äP,X#*g}=J(õiêž­9ØGu*F'¬‘Ë|ŸúƒÔŒpJ>z&J¢‰Fá:TDËa¡2ØU±`,X@+6ˆýÀ…  "À²àôú9ýZÌYbW¥ý­qA% Û^Ș`XÉí^xùÓuؼWUwaT²Ýà<'Î2s…Lc&°î€$©Qŧˠ¯á‡Û  ^|Ö_€2묕v€Ó¦—’?lP7Â1r“ü06Þ)¬y#åW UæVºù¤°€6🚠<€v—7|šV• Œ·ßîj<4·y2¸÷°.h' WU€¸öè²›DÊ^À[ð`"YSI»çÀTK>æmò¤ï ´“\r¾ ÒžüeEîm=€Ë»#V“dà̾ê@T©üy÷`O2¾nÀ>/ –7.Bá`U%‰Óq$ÃËxD`T©©+.^PQŦF±@6ÚWÑ—T¥Ñ*ù +Æk€%qc/€'öØ®2ëØÍv4À¿= [U“KQ2+¤5ep“G§O×?þ¤oÝéÓõzŸl×Ã:ß Ø©µÊ(¸c( k´M¾E¶¹D´À;òK,ÊPºh A)1L¢XD†Fˆ°J 0PÉ, 'À€ D @€ÀRƒOÀE¹µ¨î©y?L_6INR\Òð’h”(R‘˜dqœ Ý·ÀT¦8 YpÊ#‚SÀ:dqØqpÀˉ(L‚á“iD La€¢P©Ð E ¨Ñ( , ( Dì*Ùl (Ñ­‹¢€”@¥–È/"ЉDêÄÛÌhÃl)S¦u\[*´ &ŠdÈ9Éœ›È4¹:j¯ ó&¾¹y²/µùäÛz²Ú™çm¼°,µ!IóƒÎE3i@ @H À@@TU@(P€ÕšR ;iêQëÒÕ÷(õ)9Gv6òAÖ9úÝ%= `QðÓ¬-Z(ËT( 'FÓ BʘRË`/ ~@XL @¡ˆj/!]::ú7S’ö,KãÚ㋬™“jO°ÂÓ\²÷Oð§šeUiõØ:ikãÿI%‹÷&Úã "Ú–x4ž?ÈU|pWN•d•ÿp5ïWdQšX}ò^ZÆPƸã©Õà ›^öUÃ*¤ù%e×@ÛI4ÓíEõ>É&°Â›Ú¸à x®LæÂ njͪ ©jñÀnÝ€r¶ò-Ò•|€®rU|0"NšEUÃÎ8”º®‚%fºB-nú¸òI.×fsšòŠ«¾J«þ6¿rZÊ\òÒ 8ã´e$™.ЦþŽ•'’qÐU¥YÇVF¼¶ŸŠÆrÀIg‰nt×TÛÝœW6~kk®ìYDì £x3·„€Ë‹n½øWÒë 2Óº2Óü „žô¯p©¶ž~LÉfº´gkü¾Íd?(‚:¥Žy"_w–ù%Òi ‹Y^v¦YsYÒ¯à‰¤²J¿Ü\怸k“5€XòI,à•¦Å` ¤›XäŽ8Á“2â¤f˜ dÇxL Î?b€èc°ì@ø[êÍ©µÈV”Óù;iú]?¶v¼2NŸ­‹Æ¤\}Ñ醤göIH#N¼|”7yC0-´³Á-0#%`,2P°(–@¡’…’(XdŒ)‹:ȰÆ¢]l”$°/$ ‰À°€‚À ®€Iκ^X¨EáÙ—6ûÀVX ä8û„Jbªh”¦…la„(”²§`JD¦XEÃä(€Tè¶¼¥Ñ— ºAЫ4@[ò(d*Øä Ò%la(”Q2[ ¶ …‚‚Â-Š ”JTÀ¶>’7 š‘´bÚéÕ@œ°, ™“"¹Iàåy¦›£¼ó¦ ùº˜œšòr”©ûaÃRVëÁ˜«a\g-Ò³$@ ÀHÕ€-…¢‚ B¨;‘€€PÀJi3¶›¦îÑÖ¥LíØc#R[ Ð£óºËf´—¹°4‹XÉš¢€XI–ÃAl–­” ,(;TòH¼=3ÿ®½ð"_ëç<zK+ö NI¤Å5*h¡ÇÅ•º´À’¦­x*|¥€$¥{ŠéE>|ó]§]<;—ŽÈ+j¼y%ÚþJ,[¯sy»RÁ”šï€,]_⊠ß ÄRèqÀÍ Ú×€‹/<|€Xm™|ð»^Âû@-[¾Ã¬¦]Ô}©¹*Xè F?Mà5‹K<ºmtÀ‰rˆ¹ɾ‰[Z4”—‚ÚXx@FñUîgŒä Öm‘+M~ÀnðUÝ+L ÚY^Bxʦœö+sÀBºeq¤UW°Ž V­’6¥ž¢x§Ø¬c#¼ß¹Ÿ·&p³îfÿÚZòJARXi®Ì¥Ï5Ê2‹nû.Ü]XjÚA«^@5ŠÞËYÊdvŸŸ6ÛO5J¸tQ¾x2Ö8É6'ÞBÿ ‰òM7ްh&’á€ë‚5†qÁ$¸ðK Q×‡ä ”•vJ«J¬žxDk ¿#iñÑ*½È2M¹ #à%h[ë8TÍdÕ&³¨NB'%ú ÀÚÔòn2\ÅÓö"½~¯VmM{ž?Y¥?ºàýÂ= ¦°í ¢©8ðìŽVøðÉ`oÉ ( ->‰^e L€-”K+Ár( ÀDÉÅ"‰L]-ŠÂ™2±€%0 Xªfâ›T°¼gúqT¾§äæäåØT5`AaPT -e¢Ø ò)0ˆÕ¥Œ0ƒDm0dj€Ÿ°§!Ç8”, b“.$¦U «I™q”@*eÃQ, †(*Q(–Â)P &[r(Š”&R…€P°-Œ0@!l#é›LÃm#3ÓO+3 8º‘ÙIqh¢Ý•*Yl*‘GG–:ñr’“J˜XôiÉ4šàô'pa+æÍÔ¥óÿ' Yá¤m‡ž6¢+˜€ N˜V“4 ÐÀ  P@   € TÀÑÒ +¼&w† GxNÎñ• >/¯…ëɯ'–,u‹É²‰A«(ÍS8(jPð耀7tÑÿçG"%} $ãVž,œRóEa¥ÅX\ÝÚ`Rã¿ûn¹*d_ªŽRNW…H~¾ºXÑIW,¸Ž2õõ_Jøõ:©ýM4ìRRIÅòž ÃýÀÚª®ù'/@;OØ?tin~2nð“åpÀ>0û%4¯ÜÞx503›{Y¼5ÿ©dSbÝåd U`×€Õ¯à þHî²~ %uXòFÿYç”\<û™‹ï°5›jÕK¦úºv-¼~á«·Ùif‚¢µÉ¥ä JÍK‡KÈDQI¬Ø‹¤Ò}PVcïÜ%MÚÀäËO‡Ê8Û¶ñDi§IR[xX3+wåWÛòa᪠4«™—~ ® €J³Ù$®Ÿ°½ŠírÊÍ—oW„“Æ ò÷ƒN>{<>L·Â@>:d®Ð¢4¿/ ^²e¬ðF€eokG_‚4@j‰ÏaøvZ ƒÈC‘Ç`NÂý» Ò›\åSOÿpŽÔ”Ñ7Ó]%H©{¢Fž¾ž§Û4Ÿ†t¦º²ˆK`, ,|PÀÈ ò™~À `0ìL’±†‰d x¥Ñ2€XÀ…°Šp 9¸¢Æ.ü|\¡Kê—“Mü‘@p(,`)DÊØÀD ±€@^@•à aR—’SÀa’€0-Š@J-(0&J¤´ÃŠòZ'`[-¦E*ÌÑP[aR‰@ aò:m%à©€@¢0¥‹*/! ©@"ØD ¯¦# 6"ƒŠ}§§ÜpÈ,%XgTÊ32d}FéÑóÖŒ÷SAe{t!²ÝÖ¦ÄÛá •ó§'—å¶yÛm›a‰Ê±ÙÈŠ €€ (¤ÀÒvP  B€P  *  (*eº Üfΰ›(ôij;G²2{B>f³RÔ“³Í« Êàf¦vM3B’ˆ Y AZ _Ȩà[#­DÞŸÿ6?"ô75Žå+ æ«j—!*¬Ò@yõ½^Æã§—äÎŽŒµ¥»Vn¼‘+Ýi鯡½Éª­=HdàðEz}&­=²àôáY½ËÂÉ0ØO²«Xy&U¦ýÀ«»Áyî¾§nÞBã*ÀÃ…ÞMEö¥ïÑÍ>»¯áäÓÃæýÀËÄ«òTÖÖý€]¥ìF›ÇUÈwÐeµV¹%‡à±ãŒGr¨Eu.£m5ìi4è ÕË䔞T¸BM¥Å°…×?°¬P]•]&è*ÄŸuy«Ök„Už€cv:쫟È«2¹y¿U¸—\ZXö%.BµÞx å$±AÍ"rï°¨ÖsM1¶ñ\md(á°£M|Q››dÛ´©jQ—·ASn2-&ñ€ˆ’\r9ë!JÇ‚J.ñÀý*ú9¥kÜ uò%,–ž#ïÉ™§iWäÖ›L̳J€»nÉÊÍY<®ÂQ«k GäEt“Öl[þÊ_[h¯ë$ãò|*%ãÜ[§r Ž…¶y5#DW5ižý þ®ŸÕÊà êšÚLR ÖQi4¯ E—uT H»Çìj«<äóÁRúmsÿ°Ñ++<¦îÌÉ·ð’å²e5áò“V8UØ%v•Y+ûxÝü€ybép§NÅ·ôþ@5›e«LË·à»iP ÁSiÚ`G/¯8òJù3îTíøýÐ.#¹Ò€ôiÈôÇ(¨²Ž.¬9"¼²TÍhj==DúìŠ÷öšû^H–RK)0Ý4À)'‹5áû˜®/ØÞ×q~9)å|ðVéá§ÁªÅÐB©ç°ñ`£ãÊ儘’í—¥|ù*´Ó Tž-W>rÁ Û/Vº´Ö¯žD³uà O8fŸÔÿ€3WßviÇÀA«ã([iy ,rF® f¸òt§Òä"bø%]°+ûS_œV>¦Þ÷pZN¬!›òKaK\÷Èo„¸  •¼»@f’’ $åJÕö4ýÃ\¦Æ:,}Þ’â—$qiÔÕÉd(抱µUßAº·Ï±~žR¤Â²:è7—}„E‡œŠ¥‡AG…}¢$Òò€ÊXöü02šmãØ©TPIrŽök ¢<*å€i8Ñ–’–pÚY¯s;Rïà Ò]rìÏ ÜÖLíú©€Q¥l•‚*8¶ø aoÌXQ«ä,'ì<0âò8Ç VÌßALЬ´뾈ӯ~‚ŒžX ¼t<؇te¬)®2O°¨wÚ5ìNPÆçÜ(߀ß5ØD¦ŠšÀ°Siç?ÔÓç$„å¶MãêåýñMy@w†¾œø•? Ý”*ÆP -€°T-“ Š ( €²±† €ÃÀ–d|)t2Æ‚À`€E’ª§l©> J+_“M¼° Z®–- Æ¥))€ • ¨Õ€ ©@ŠQ­€@\J U°¢pË`JL4À…LqP°¥— #4@-•H@”8 ©ŽBJ, hR £D !SàPD¢VvP‚ `#é,›Š£-´[^ ™AðqÔdb÷9ÐV—Í×–ýi|–3\'.‘‚  € €°4¤nìè*‹£©@8‚e  (@iAZGXìÑ£Û¦°T|¿[¥(j¹>™|˜Yå‡ÕPGŸRMû„Í+wf“"¨£H8Ú,}ÂÆ‡¢ˆ€V‚ °Š™vا gƒÕé¶©¦ø,+´æå…„tÐôÒÔ|`ÔŽuîZZZúšrÿÎõZòÑÕýmiâk¢ZG•Ot߆ìéWHK'«NF™wÔcZ´hãy2¯g£ÕÝý¼†šøaQaRkù--ׯ)•a~(U?üä±iÓ`JO<3Kо^@˜\óäÖêTSªµù+OÝ Õßà–“Æ@7\/Àáó`<†ÒÊY¦¯@Uo5É8»`TšO²¬ç€-S°¹öàY·’G¾¨ †ògê¾0žxtÈÖ/»îS^äö°Š–é.(¹R4ÛA¾©<ø+W*o ¬å{ûMíM¬ò·È‹¶€‰ç‚·›@EœôŠ•^@b­'î¿Ü ÖðOIñD«Ïa÷c=ç!YÍÓátW–ð5›¡·tià#;z÷4ÒÚû Š8ëà©cŒŠµWòMœçÇ< /öº¯ I*¤–x3Ég„üÙ$î’´Ò +ÚòÖWòaƪ +OÁ%_àò—€£þ@“Yå3.?Mv€‰^CXÀ â•{–ÿܸÀQÅÞ Çd¬…eâðJO!ëã!Qÿ$  ášÏà DùÀšCß°\k%h DkÈ«Êép3Ù·à)M7‹Fk FªèÝOÀè Må,¹\vpK°‹Àk84«¼„½ÀniŒÀÚ’gHkjCí—áv‡ª_ß½ÑÚ3Œ—Ó$Ê6O€%ÑS°-€QÈ%€¢e@e%(PWy[$Tö}«>Nm·ÈEàa€¯)k±K ‰LX …”…00¢dÃD€@0ˆlr¡@,¡AAa %N ˜EÃ%SaRˆlZ`% ˜×b€”J [-„)Œ¦±ÈR‰@N aÀ¡DYE%¢õR¤im@#kÊVqže@Yã ¤s"š’PÓr}&R¥îÍFk*(TÀÒ‘S”l(R D¢‰ò, 2 HÂ…@ &ÑÒìÐä÷ieut#«¥¶Hø>§Aèj¸µŽ™š9§ìm6º I&³“Í©¦ípX,$tL«F–DJ¯ˆ­E* !@”€”F‚0탰5÷9<%ñô´=¥)áuu¡¤¶ÀÕ®o&Ùj»“j?ä³”#·³¸ù©hj8ÅÚëØÒÖ²ÄzbÎúR*=zYjŒkú,J[¥â"Ÿ­=mlƧsÏúRåêg؃ݣ§¾PÕ‹§Ä‘ëm[WÛ¡TmªµÓ#«úXÚ~VM&ÕþÀW‡DO jš :µøÅÞ_9ÀOwÊWÒX¦yøäÊ·Ž0»²|ivÿ"]%ûcH<×^@±o…Àt˜DR´ðjü;ÝeyÇà)ǾÐi7Ê Ë`JÇ%Qm[”’}–ª)¾Â˜J×!^ëayö ¥óÈ<„ßä)ß%“§Îx $iæÊØO›-sOØ!OÁ)á[§]î´òò§Ç±•Žr‚ŽëöXÝ+ä"e'Û4’Kä+=rGâN‚¦©¡µµ¶ªÀwe¥iÄ+5õ7Õu§O4šMáç²V­cÛ‚<¿‡$VÕk?"I>ʂ랩*v‚¿ä´·.Tïù%tqUìL¦Ân‰(ßÈ’Û–¸ã–Jš&*À̢ݲ+¬|m¼tA+N‰UÀ ï²>@œþŶeÛÁyqÈVÐM©?]§ÀC81€©TÎ@—\õà+V«3Î'_Á2Û_©Y°Õ:VZD¢®+ “¼€ã$ÃXpˌм’º`F²*€RÁ¥&Ž¡¤×X"»CÔjEe©#´}D%ÏÒÊŽ©¦°í¬ M ©À|†X,‚¢`Wh `°àY`*,šJ×ÔéG$ŸÒŒ¶Þ^@…Qx ¼“à”ÐBˆ¡”±@Fš÷ à"á’‚¡l$ l*Pp,)@@¯€…ù Q,!@BØ 2P…,Uhd!eÃDª dXE¤Ìí@ ˜Ã 4JÂQ8"­ŽJ("PØ Q(²€ ú‹fT²…%€ ˜ã²´õe¬÷7k7Ò;i=òY¿pµ­U“š"<¾·Y(ìO,ù회 (ÀÒ‘¤Â­”@!‚m •Dè ‡@  AâuG¯D÷h²£Ö¾ÓÇýCÓ-}+KêD£áÉ4Úá®K}¶djü"J¤Âpqv¸,&ŸÉV:&tŽšŠs(Sä   (R´>@Ì¢ÖVQ½§Ab­ý2†ƒÕŸ7ƒSÆztÖõ2’Û…(ýRw#6¤Œjjã/¨×{^ Í·gm¦ï‚Äz7Q¯õÓYËðTj:ºÚËêŸéiøF¿Ôèh&´â§/,ž§SUÜ©{í¶ïôªPÓÏ-ÝœrÅÛ|•U$Õò¼ä·‡å øüšjø~ô}ëä¹OhÓdQI,nžFUøœ\xŸ€&RþJ,òé×qþµ‚ÒnïÚ€Ôpš"¤êì ;d«öt×¹k)ô«–3Ùz®€r«¶KÃ]  \r%¹] T–  -gÊÌmÀîi7E_!—äŸsN³AL/ø*ú–pú‹¯b'¹:ǸF«Šì+n‚£îŸþÄ|Ó¶ºÓu-»ºXïØi~J·Êí`u]ð2ÚMg¢'s¦¬"ºkøwÒäÐUJÞiù#w~aq“/ÔnÀ>RªéŒø_•å;L°ˆóTT~¾:²5rúp€­SÁ6'ÎZi> NüX¥Owl›WÈ BÕöŒI°%qlI×OðkÁ—\5oÈ¥Md”Ó¯Üã|re«Âü€q¥O•ÈQ v¼øI]32MàwîJ¼…?’+ånÓÀJûȬ|‘ÛXÇ d½²NoÙ3à䕆ØTqý‰K5”åÑ ’JðoÈ’¬¿$«5wìGǺñûã°ë²öäW`1ÙSÃ&WÒ›ìÒš`n3qÌ]ãêd¾ådc« ñ/ÜÙ@d–ÀrX( @J@,€[ +L"ÇâØpqûŸìOj¨®{3ÈT¡À àP²H”P±€… †+À(¶¤ÉM°¢[(@(„J0(P’€P 4-ŠL*PXÃD À‚ ¤ ˆÐe² J(”8Ø Q( ,Š (” –Ê(‚P*¾§EFZ €¥Œñ(ê½vÛv»êˆ±Ó_QjiIBYâÇ¢i¦]CË­ª´âÛ">f¤ÜäÛìÁ´@@J)®ÀÒe°¡B("„¢ˆÕ  @(R #¬ =:R=Úà¨õîÁ#$ðÈþ§¡³W|UEž+0 “I€i3„ôéÚ*5§&¹GdìÓQQPU¢PP` Õv¨£-£X`Túf%PUƒéi6´c.ý3G%ôþç Mjã/É”y§;vÙä×ÔRi.€æ²ìíETG¬Û¨–o/È–¤¥Ë ïéôœžæ¾”Q팮\”“Â^ŽëŒy*|4µŠä«-^@+jê‚WûÚ–ãä Ã-ßG&øèÒx»ä©c¦ZÆ9`V­®¬{–—]–)R¶èÊ´ò±Í«ÍšÏHjÚª¬ã5`/ö.s€‡ÓWÉ-¤åÞ{ '~ nè ÊÚùÂ"¸ð¯ÈM.9#V±€…ÓkÏðgû¹ ÒK¾‰Yù;i'û•*Uü…6¯Ø?,£|0–8ä"/¥ù,-î\.VyÏ\2âÚ],—í_!ªÏ±^¤ÛIP¥iuØU›¤ÝqÙ•âüU%kžI<´»åxüò/ãÿÝv]¬á$•ã ‹„HÛ½ª¾K›çö $î25žhO•ù#Té`²­‘*ïòxyäI]PVd±µ WàòŒ6›ñ`RI/ÀQwwîi¤F’ø);çWÓžÀJ;p‰\{©KŸvVˆ'< c/ÁBŒ´®È 5Žùö VÔM¾àFí]m«¾B-<¹aXj•Š(㞇o!QúØD¿(Õ+&Ü€K$¯ð»|it“&Úà Õm¼Jv?GÀ€¨Ý1^á¿€ÀϰéàÒŸ­)&n:³‡µá„v©_ܨì§/¥Ø€[-û€±ðÆe°*ßÓ’ãû¸ðË?JÚeß!B”K@,a€¢]pÉAŧ€8 X¤i‹à B€–^@”)((JQXѶ0 ±€@¢l¸a‡,ZA ¨[r( @ b…BØEaR‰Tˆ¢4@UJHÐI2ØŠ(PFèá®ÿSEì—ì<ž–U&ŸkƒèhEGM$R³¯%6߯×Õz“o®‰®%4€ € šR`U3i¦²Ø ŠR#‰F ÙP (R #¤àÏVŒ²iø5 g_Q¢µô\{>¬&âùFhÏrú%&ATUŽÍEŠ[+AX@¶—3±®h©×B)ê+àõÏP3^mMW,,e*Ë ¼Úº®M¨áú"‹nÝ"£q•×NÕ£Û§j8â©”wX¼|K5ǸŒŸ|£·ü€¬û‘E㦺ß^QS¤×`eI6±NÍ,¼ð\W¬‹¿p\ðÂY^À)6±Ù¬dÅf“);j¯“\ºV|að-ÒÆ, V¾ +ÊÀ¥ã,?°ý‹º¯¬µ]-ñ€.%áOŠè"¥õ5Õ°:ªã„“ÚÂíWTîµÚÉTk—~Õ«È“ãÛ€"Í>  _7EQÎxf–°óŠWŽB¶¼4‚YÍ•8¬û¼ø-ÕF­.V_ »«ä³ku% ¨Ò—Éi?ØX3̲¸×ö¾ Œ³ÀšZ»#rwÚ -Ø{WýÁÚ¶¾yADÕ6²)ßÀÝ¿reåõ€3Î*Òx-W*b6±\™ÅïTsÅž¹ÊèlXuÃWÇÀk<›ó›%*k $¢ú+\'Ы\‘§„¹%jÚ&×tãŽS"ª·†Ç‚4ñîi¼þæ]Sd–öå0Ó&Út¼2¾â€39°e¬û€WE¼/ Jå ~@J/’&­ü³ü]j»`F’t¸3XJ«’Uò’Aóhƒ-¯p pJ ª×dë€ï8µa+ÀƒY]ØRJf”•ÚÀc¯8óRGhkÂ\ý m;ã%, `‹ €EçƒM*¶òÝJ– €,ä He,Êä¡HS–ZL*P°à]‘JðJ*P()ÐP J PX %8(ò ÅÙhQQ aJL”a” Ë€‰B€¥ P°‹`‚–,!A ©@!`D,+è¦iiJL¹V[¢«t´žÆy½6£RÛÓ ~,#^ªº»=É¥¥|¿_ê7Ïd^'–0…(€(( €4¤Ñ¥5YjI•2*€q°3M…€"®B´"Àíz´ŠŽŽF´äìz´Ý£ÅýGÓ[ýH¯‘Qó $UK©'£}"TT(…h€TìeS/JCht¤´ã|³3“}†+ ø8jg q’2OéÁ¨,mU–uÓÓmêŒ]6øGx¥WT«‚޽W Ò¤ùÀ±ô¿a·sÏ€þE·,€O›|µÈÚîÓ4›Y°Ü×]*–^@'kßTêKÇÀV„±OÈŽY^U#å•? ¦ÿtªÅÐMºk²+Ýì¹mWÃ#·â«? :ÆYp¾8Ö2\b€rébÕ­¤ª¦©*&§Àkö*mESü’ÊÏ%ºWY 7Y¬1.“ü–0TëØ µ›~Jä›K  tssý6”“§Úè›ÛÅû†Þ mU‚¥ì‹¤ý‹I:ì¨6šN„«íçÜŠ‹œ‘É´ÛUîRIZå—uä —½{’Ò~{°—VÈ’V×òjÚëéäM®WA5K9'šmdÊM*ªkG”©$ÖB{›pÀa;éÝÈFZÚ›ŽWaJÒÀ Ï&¯éM°¬É½î‰Ãö`M®í ÕqÅXvü¥–Ð%&ßå27ç&¸xAFò_uVOÈ®’ðD±ž@dËUȈAsMtÌÒ\”D—$u ˂óÝ ð¾¥~IÍà"J“Á:÷ ¼§û‘að®=‰Tò¼8d<'+ *쟀ƒ-~Ô±Á–³Á»²W°¬.ù •AðR¾ û€~E0@ Æ ÐVk\„U*4¤Ÿ¸Œšx“Ghú‡ýÉ2+¤uc.² \‚ú°—ä­SæÊ“xá,àŠ÷”Kׂ[D 1^ лäxÅ ‘)€pJ ^@€€PQ¨‚§ ˆ[P ÀP  °b‚ ¶0€„¢lrˆÑ-”0Å(€[(_EËJT/¬ß±mã²,sôÚØý9qÑÆQkÔ5!§h'úÒ“ëzïQ²"òÃó!¦BPP@@Jm¸êy6¤ŸaT¤ˆâj@@&LÚ`u„D5(ªvtƒÑ¥#¼’œiðV_7_Ҩɴ°4ý>œ–PWQéÞ–W{}‘¨*¢”€[¾CV¦™@VKvÀ†£È²r²fX8Ír‘†°**²FÛ:ÃNÂ=Ó¥TŽºpñíFöý.×À¿Ý«_ ¥ÿž ÷u@8ò^_†v¼ö8O ;kò[µþ@9)%þC»TÀ·A<*|dé*è—„«Êemê‹·•,|3YQ ©+•جÛI"³—wØ*UûN×RWÈ}{>¤³š5*ì"(ö#aZºÀá+ì#-¾qL$©¶²—1xaa.Ðcé|0ñš°¥[Ãã’Òoù¯>Iq¼¤€>׸MÞiœ[Æ€ù·ö„U—iÚiÝß„\·\šI<Þ@›”Z¿ÁcǸVd»\½ÀŠ«wCž‚¯~ÊuÏ4¬'vo¶JÕ7RE\¶ŸÈD“ÍÒ¶W••𬕖ÓÃ/S`e¼ÓÊWš «ŒÇÉ]7—ÀN.ýˆø`e*uìi¦Òýè ú¬²+Êk62û+ŽÕW%^eÙtâþ5V®ŒÊñà œRK®ˆíP ©e*%VR Ç|àmO,•pLÞh ¸æ»ì®Ôj°g/Ž€U'…ìe+“ð¤ž|“ä YÁ$+|äR­Zdë!­|jðÀqÖAR¼pÃÈ*‡ü\rUž@>ÈÃìµàƒ-m¬2ŒµàZ ÍgØW]h4bºa޼)\¹ù#Yðk“Jy@iHÜug%~̃¬uÓû•T”–e²Úk E•†iyy‚d¡c°ü€Á2I†AkÀ°&ÉBüŒÈ°ÀXÃSÀa€¢ExQPR€   @*€ ±@Jc ^IA@Ã%P€¡A@¡DT0((ЉD -€J …°€ % ÷¦Te¶Š><¾¢nm'µ,Ð×ßôMÚa¼yõtÞž«J룾”6C?s kº›"ÙàÔ›œœ¥Éc ‚ @ *€  € Q›^çE¨Ÿ8 Úi¬Veă-0Pi¤Î±£#¼$èÓ‘éÓ•¢‹©$pý=²šðÝ¢ìøòû™€*©l €‰WhËThÔbß+[T[RÉ%ãòs‘ÊH+ tgk Š.òmiÿ‚ŽÓÍvwŒª*;Füø:BÓ¢ú^86­üt€ªêޏy««ýÇ÷_5êÖC„“\4â°µü"uKÀ«.í«‹šn¨Õ¥m›óâ¤DIeErJóð­ÎšhUSXèŸcme;LÕñTZ¦üð·Â5Ðîj°ø-šJÿbóK°*ÈËj³Ðá%ÑcX|ô0ÍZ¥› .o,º( £·¢Ö?#»øÆSÀQ$Ñiüö-ZY&).€pÖ1ÙRì!n/ Q¾{í}©yŽ? |ò™i'`^0Êš‹Oòy¾Œ¶økÝV’uäTkÚ”¯à˜ÃWTÝ>‰¥NýÀbí¢ÚOéü„MÛä:ã>‰¶¸à|€óà&›¾z Î7,–Mì¾Àœ4—h¯-epªYË"µÞbíX]W@:oÆCyÍq@"ÕY…m»ä"¸ÜóÑ–Ÿ<ªª [MZçø¯©Zö^8\+YNëð.ãÇÈ“ê‰IºH ÉsûÞÚYl øàËê— EYoÁ-®<"g$’®@6Ú⫲m¬>X¯ðˆ×D-©–~‰4^~y5mçj¹UîU•uAQ¥”Dªï +7|"uÆ,òfü,½Ð($åÛk–J  R bÈÓäVGÍ”¼®ü‘~À͇ÈÃÍ;Iß`E}K©û›Rðé…tŽ´—9:-HÉeÕôÑ4¸àÒ € ˆ9/È ”>EàZ^À¢‰’ò@¯ÊØ¥ÑBš(P€” )D*‚  %JQ@-€ ” ŠP¢ ‚€ÈЉ@(Š€DÀ€Q,‚ØÃ(€>‚*2Ú¢©Y㟨ԓ´é©N¡95%ÊÁËZ¥©KŽ‚½wÚəʓ Wƒ[QÎ^Ç#QTÚᛎ¥rHÍ> FŒ¸š TP Tn,‘‘ÚôiêtzôæQÝJÑyýTÔt¤ýŒù²7•BJÀPÓ†ì¶tiE=®º Ö_f\rØe¾Æe¬ìÈÛyH -;VãFÖ•U Žª~N±ŠOÁEí££‹¯äîÕ#QwWÓi×á‹J׌¦¾´óà ›/Ó_òx¥EÆêè šUÙqYí)Õ–ÿ€*ã+ò3YH Ž‚ò ¬Ö $«ž@ŠêžM(§@JVß‘9ÅXT°‘oÏ i'²¸n‹yø;§K=šJ•òoÁSíü)Ë$ã*V|®×!U.Rù@fYÊòZ©qÐEÏ?€®›AKqùÓÊæ€’y¤\ã Lå„éSÍnÓ#¯}Nïݯ%MÝ~ÀFÕø²ð,´žþ˜ -ÛVÑWG¹>0]7Žx ‹w2U²šO( â“óhb«µÐF_¶<“í{RðSÜ’XvU©KöN+ò"ùK¨ßЫȬZá„YRü+"[m¬'š &ŒÝ<ðò¿J«6´­¯€ÒK0#ËÁ8å Oko†F¥”úð x\•5µZ,É¥V°f*¢›Xì·á…ÅuÈ•:ò9@L·B’ü€®ß$Šçö7xエ+äÓ·\#*6³ß@M¬NI%XÈ kòfK9Ç€2òšdkµÈ»~FÜáðkÉšŠd T‘s`Lev… 0Õ«]U4M¹çF±k´e÷œ€JÝ"®ï &âÉÅ€ÂÉ*ø/qI€®Ó#M&À•l5îk#®OÀž:&Ð#TJ -d$I<0°äVXAßþÄk JBª©¥/*æ¯,dãÃ:GYÿrý€ëH¾îk °-€(€Æe Ql¯ kŒ‹ úØÀ \ ’á€Úú €‰B€ ”("PÈ¡@JJ @ %((”¬€ ”¤ P¥ " p”(" Š ”@‚eÚ#-¨ ñkêOõx]ÐÓÓœ$ŸÜž<óRÒÔ¯ÙžœjB2h%<ž«Qýˆ1^FÁ¤P@RLÜuç uŒÓ5vhˈFi®@PQ¤Ó:ÅÖ=›EGxj:äßêâõºÉ­¨ð²5R©É@€žJŠ QPiP\›ŠÜÒ]„v¨ÁUð{Àe—Ýw‘¶ùòpM½€JÖhÒ‚ivµ.q“Pá¢J?ܲÓàê ³²þ»V>ixÂ`T¸°•,û·íÐyiøf¸+—LÕò…ÖR´ó}ÿÔ¤ßð[Æ^?À ¼.Tÿ+v¨Šºì Õ,wȵŠå»ãÁ"ë XRÅ——ÈÍç†iUð%ÒK%ªÃä·ñ\…᫬ºö\k6ÚÚý˜ô×<‰,ç„|`Ó~x·à^AQð펲ígÆêO i¾‰msÐ5žØãžDIF×’/4]6M©öÓOÂÊèŸv8’ùxè/€¤ß„WÚ®¤’TÒüˆÅ5i€xÃ͇퀃mò…»ê‚¥´ðV@·$ïH›ñÈFš¼¾È²¸öaWéé]vf©Ø Iñb–ÕšóÅrYyo%…teÉ:mw`ZMc ß†¼k ¼²M:ü6«¥û¾rt‰u m*¤ð mºBKé_-úný‚ºn€,pV›áðmZ|2¨ÆÒ» %å‘×>^•iµÐ¤ß VªVžîéâ»,´‰OÀ…o Úx)nÊÀ¬å`éßÑ™4•/Ë.Ú{]Р%QÎrA™,„©,e '7å—`*«!…fX™YMdŒþ@­Ð c‚5Ò ŽÐkb‚®IÕ2 A”GȾH$—kV2e¬d¢_þÁSñ€À Â!×ä(F€•ûô¼:aZ‰âqü£tš¸»D+”j:’ +¬uüª:))pÊ‹^ -–À€p0ÀW`\Xä T/È Bš~Ex”[¾@´ºy )ð¦‡%‘*‚€S ”‰@ˆW€#^Ä J( @ ¨À@PØ@(@A@ %@ @@”¡tA ¨Ñ=ȨËke 嫤µ¹ãÝ-)× ¥w’ެc'ò_øå­©²-ž JݾËd¡@H@(”³Q›]Ò:‹³iÚ QH%Š‘R Ú6‘GHbÀëÕ×Ú©r㔜¾L¦PQ@  ËÊ@ ¾ã¼#KÜ3Z|y&! _%®/ù8ã9‹¬„V“çÁ½ª8®J$Rþ뾤ùQ½Íøµüм_ REI[¾€­~J°î€©Wº*ÂoGuÆh‰]®l Åù¢¸á«Y@Ý‚'›`WnX%r«€.;$¹¾^=¬mÂó|UÞxE¤²€ŠJí— à øç†ú`=½Ê• -ZÃÈO†À‘úms‘Vx`Y&¤T“ŽîüE—tðGœtVbŸ|5AۊɾR®˜»3)áZÉ©4𸠕œ>MR¯d”Õ2>€+Ú¥ÈxŶ;JÊÒç»cqpûø–)ñ}…§¯Ø!M®2Xóoö ’Y¢Ú@G–Ÿÿ´»x#ñNÀbì$¼dÕðY7MV©Y¿©^¢º¢¬/ÀÊ|Šåþà%㎠¯2XAN®ó‘©ÕÐUo,J)J×a OXbIy¦so„I$–k,+Ú¨‘âû%”ÿ7vI5m¿Ù——ìiÒ]•ñŽÀźX~楘ý,’§}«Y}à 4ñhÔb©XK…çü ïòýÂW.@ÊúSÇœ <ʺÀƾI¯vZ¤Ë‡ü–©aT±Ë@6¨ö»/à ¨îkÀÚ©+ Ë‹]óÉt•tnñF~Õä+-tfV‚ VII>£Vu qð‰xXÉ=€^> !ˆYh¡M×@«¼‘¯r ´Vh”¿r5쯠L–´^í…OaÝ€ö¯pŒä«rxKRIç&”á.pÈ*‡dÌ}‚ºGZKœ£¤ubý¾B6ë‘’…‹Øä ”,oBÓë ,2[]„=ÐÊ ¸b¼Ê. ¬¹\„\2íð6‹†PÚ(P ”("PRèP…J J ^P:@h Q ‚¢(BŠFAJ  !†JP Yyö"³ ¼’œÖ¶zx=q{¢¤‚× OUSÛ#R1ÕÛ xa,a“¤á×Ôß/eÁıP @  @¡@¡@ˆ*“@tŽ£\›S‹ì+X}’€©€ÒFâÖýH®À̽GQ9JNYa@‚¨E@ˆ˜òTlͽ8çsX:Ý:æ!Š©ßUì-UxbÓX4©Å'–€´š·Éi«]$ ä×Yè£J5*¤Õö¿r “MºÁ¤“•Ç’ˆÕ%ò^–oðkûZOi%æ¼ô€>•äŽúÅ I»Mø-^{ÿØ}5x*Uà ýªžH»òÀŒÒã ~»öÀËОQ¨«TðÐCrgÛ—ÈV¸²¶ëã(ã&—䫟(uÃÀi¤o¦;  _-"[ª}U%ue»m&$¸$šË]ôm𨜠«t­ô~Þñ@+þÚã!Õå]c4â®øŒö‰}Uû¥€Œ÷}šiþ²ØI·I×°¾ éËOtøä’jÀ+|…j·dýXÁwRiåtVÛ|ò)¨Ý¨ø²[Ì^W!my3J€´“3YöÈÚ¸ªÛ*æÿ*ÑDª@( `”áç‘O +iš¤€Q)tºà"{•î;–£#KžB ¸å6­WÊÐNáÓ÷ 5îEXÉLJGE¬ÿ¹~@éÅðË‚¢å ™ll)†\€à´\¯°-0ËI€¦¸-ùÒÐE²Ò|¦ŠP %ª B€QÑ( DÈqPVF€”J€( " ( € ‚¡H Š@…€ªJQõõƒÉúÓÞÛnütNqÕŠ•T‘ÓÓêWÐøa«>])¦y+¤© Íe³Ïêu)R ׌@@B@RH@TRQ° MvmjµÎ@ßê¯U¬¯€­=d¸0õåXÀêÉöÈäüS:EØU)U@‚E[-ù^ZÀ7§ Ù|¯DRñH”­Pdirí>ÒNîÀÕb© ÃwT¦•Ó—}¾š¬ù+[[÷\<ðF¸K”ÀµIg¬–±_ÉEÅg éò½€%_”SËu„À<5î[_¨«°¥A;ÿ¸+)¢¥-®À4ãÏ‚6ÕWÃÒ{U[-cþžS*uV¬ t?Ènû«ã²¯=?b¬S¼2ÓýÀ+¬ÆÃ¦X6¸®ø5›|·T‡~ ’x¼„òù"¶í»´•µx\r¾9FWš÷ ã›ðuÕ·Ø_K¾V®²¹H‹ß°‹WÏHš´»òe‹ò?àêÞ +®‚*ðÒðEvï€/9%=½XQ\¹uð1µ¶®9Åä’¬¤²¸ &ÿ(Ô’¬œ:}®ˆ”œ‚-¾³ì%%ß6•I^ÛK$ºåYQÇ4XÉËž–¢Réø-ÓáPB7ßEåÛUîEe7¹¶®Â•ªi„µ‘$òÐSzNÙ7;x¶[þpLÓϸ W[¯¢,ºj» ¸Iô^žçxšÃjê;I.¸°öqkÉ—ÂÿkÀ%wÒ#VÒ®B,½–<Gêté…çÉb–ÛìÆ2ñÀ pñLwÏ M¹Jø‹¿©æðoÁ–»K—ðNZñ‹F– %x 3æ«>L¸WÈ ¤Ûø ¼` q¶»-a¾@—Iªf6¥ 8²I5W"K Áž"°q«òaçØÖ~Bvð‚ Û’5 ¸—f¸°}!ùðAþCÏ%Ár¹ ”Øwà Ð ¿ððÈk D¬€ i|(4ZïȬ€¡W€ó€£¢5„(Ôg(ðÿp­­HO S5¶þÖA)¦Xê5ÝÒ:˼µ$QEl¶ [ ¡†¦Tœ—( šìR´Ñm0 xeÊä¢Úco†r\0 †ß2† 6øäh %#@M¤¦€ B€”J B€V( € €(Q #1Öš“oö.«ŒÚœqåvGMjBâþ¥Ñ4ôç¿8 Zí&bà jMF-³Á99I¶X•T@ U P@X€-€#AP€°©…Tͦ:FFŠª* Š(T&êÅo~Ç¡r¢¸Jƒ5ZvÛDZxa•WÙ¥ ï€.×A¦•P«¬>˶¤íc€5ñà»^Z(©=¯É>«mþÝ)Iû’ò¼;°#¦ðk„Ô_k)ðËÖ2–{«|cÇýÀ&“Xº U]»YòiÅtì «ÝEo¤æ8ÉRó†€'ž²WMg –“ýÊ¥Šk"ú\¨}V»µ“KÊá„ýŸ"mV—MY$³]UXwÉiU…WÅ.² Hð¯!ýÍù:§ä/ ­Åµ’7ºØD|¦ßÚÈUç$µyà ªÛâ†jìKuÀuX|p“iS }9ÀÖë\ðNV»@)¯ )føÅªY nyaR.žqÿ!E»}Sé+^E^)©/¡JÌêÛ-®6€VÝ/&êÕ<&ÕEgüš…òÖ@gŸ’¬×ü^RìÒÂNÑB8’o„%wÛðŠyùÀ—ÚüP¾®pU„»^nþ *xxã¢É.–r^o‚»o÷Tša¥YÏ +œÒ\ª’ðÕ„U|¾Œ5€¢N5üšmÉà jòor”¾0^$ú•*WXk‘Ì_*¤¬·„»_’Kœj5|×üE³µ”î§vÃËÏL/lšãœÐ HªX¾t˜îÞ(#/ÿOÉ»L*|û’¨ ÚÛO–aŠÁ)*TZN†wy@D”r˜M6ºOø­µt¿#ªwÃÊ»¯!W»$c/¥^V*rñI<;éà*eËr§›k Z¬ÛlŽ«aþœ¢<ò•VÕà‰¶°’Å…%Mµç€’¾*¸$í»¬¡‡}jÝ4*·x”«1´³dOêq¾»·ôñ›þ Iý]ÿÈq¶•¦J[ë4x—Ë¡•Õ®@ÊUYq]m熿–+9ïø"‘o/ÌܶªÁÒÜï%Û}Øòƒ­Ù°®âðÚòÕv)«rísØi]…I$ÝU¯ñø&ÚM&©äÓyã&h©+¿!Çsÿ’e5|« Kê—ÒÒo¡Ãk G¶I>ù#ŽcÂqû R»`E•i)®V­[ÿÏ&^¾Ê·×ÁRMZ}~àD©ío1+ëÛ]ང“w^H"¾þ—MqüðD—aQ,Yš¤—`LÒSäUwìKy {¿þ@ÍXJßðj˜ ª¬•õ]>° ŽÈ‘E|Q—€‘O® ]м @NÉØUXdè!Û|†‚¥t”^GHjWÜé›´ÖH©µ4Úd¸¼3¬u|µ(ˆP*e°­&[ OÈ ()†Z¶û–üit2Š-ùE¤ûeÓ*-xaZ(¨´r9퉴Ñ(¢P¢âM¥û“mGˆ¡@ÚJP * B€  ¢(”(‚ (P€”¾ŸSrÚß2éYn–m‘giíˆG»vC@(ˆP  €P P  €”)WÁr( )BªfÓ(é Š@)@]"[“¤¬ô$¶W ¬Ô‹µ‡É¥ÊÎ*N*“ìÒÆB5®¾ ­ò¸eIÞpÚ4ïüGV—vk8¿‚‚J’üˆ¦«Ã᪕t\*Q¦þŸŠU@f:\µ†ø¡I  —·òFŸ)€¶ÕH­W ZÃÀX@pþ®8ç5aÇÁ.“°ª¾Úeï \¦KVâÀ|ST˜©äU4Óè櫜’ë7Tò–§¹Œ›mÖ:@k=ü ñÞy[Iº»ìmM¶°¼ŽrËK§Àe]éà*Maßb)>²»Óª¤ò1Ãt€E^/(,$Úà µŒd}I´øèZn¥À¥ñ†ÚŸ~>&z_‘%ô¬$s„#rÏMª¦îŒµm¤ê˜U§ÎìòeðüØB*’—1x£UíÁD’y^Ä‹}Òö ®.6Ó¿c9o­YE;Ë‹ÿ$i¾•pT\nú_M<^©ya·…%XÀÖÚ® $“]b€T—+ø*´š-7TU‰eõ`.Ýy b×=yà:wOíKm¬ç¦t©ð€+¼¾QT³oòÀ(þÆVº®}€ÕÛK ûmpY—3/)6×¹ª·ò^,A'ÊË·L é?Ë‹·+§àòé~D’®3ä çªM¥îk~z-e¦Z[˜yX@FŸdî—‹…òF³^ÄÅUy#]/ b¼™i7Ž€Íf¬›P tíóàË^xð•vì +wHZýŒ¿uØ< ¦@K²WžÊ&y €+wdO¢UûXQZ|!I.m—H€*Ù+J‹‚æú'Â#ÈÊá€wä)?!WrERO²#J^æã«%GV/œM>¶TÈ­"ß**aVì òZA"¯Ám .;ਸ਼Ëh!^ Ÿ”Tk S(©— "ÓEH8”A@M¤ % m&Ð%Å2 ´”¡@ @(”‰@@TJ¢Qˆ%…@E€¢PTÑ„·x£ÐÙ†ë ™a“£Å­=òöE‰\Á@@@R@@@*€*(o” €€…AT« §‹ìëZ(P C{ •ßlTvÖÚíq¹T_ä2”ã™D¸ëÈŒžUp]­Fº`]¸à©;Iº®J’y÷u{Y«º@_¥q›#•$«º(E%$×%Û·ü_PM¹uEá$°¸2•5L –îÅ}<ò­"­Ztð-ŤÕôvX¼{PÞ+ºA]c ÂÇ#¼;Tç’ýˆ éÅ[êËø¼"ÿbôä€5Š~(EÓV¯®úRi¦WKŽ˜þÜ%î¶[ÆzóÏ$|r7iv\ó@EÎHí;«Ë?R°¯suŠi[{»&$ÓyIPò«änÚé%`;d]+ªè!u„òNjùì :ŒiG’%Æ­Óä4›´ì"·Wy š´ë #á5Ê*é5ÏaDÜ9dåñL"¾mf‚rðŠn–yÚ´»ø÷à­ÜR–_° ʬ~HŸo ¨ŸÒÚºðVœ>2«®Sɪ¦¢¾Û¦ê‘V©_@~ߨr¾œ*Å6°øDR¿ãÈUŒ[WÓþ ¤¾­ÜôRÊkŽÍ[ro 2’½Öì,»ó­'JV¸Çäç_Wùo ?fqn‚+m¯«=™’j¢•¯!Lá_¹É6ºò¤±—mþçžÀ’·…ÊÀÝkÞÀ+n—Ác}öJ•]‰y_°.Y~ôW\%Ý~ÎØþRª&å+Ý`maSV¸$i·Œ]\ùï‚:Ïíògœø0Ý'y`FÚã!+|ð‚=¹¥X"V²SªK,‹.Ÿ€#Šåä<á_¸ MS²8Ò8Ýß<øéµtD›œš[±ù&íPø¶íçFœV0L¬,º@J¶ðµrA%•ùTJÂk›(?$’Á6‘¬„M¸&Ü`Ñi_Y¤Ø¬Xü‘ò¼²ª?ñ’ˆ/=„³”m^H¢<Ž$ŽJÒ5y&Ð#A 2ü¯Jö'Sü2âø³ÀCj¼`¡]9|*•¥%Ù¥&¸d#¬ûGHÎ2E²*¦&lÑL¸‹[ò¥KÉi\¢ÙQRLªÑQnËEÚ-„Zð ‰@6ø%4¢P¢PƒDÚ( D (Р%€QP ¨…‚‚€ @ B‚Dh³f[2Û,Ìy}F­-«“Ì € € ( € (Š/ GüvÚÁ*€”JD¦‚‹äéQÒ,Ú ;@i, ¶¯Íig2"ºX§ÀFóM<£iFQ§È ­K(›¯kðÑ$ÕÞW%ÃLJAYKcJÍ„L'f©&Úä¢e>0W5^mà‚¬>CnOÀ¬>ú#Çà ž±_ü€ŠÅ>8§J˜¬çÁ\Ucÿp,žªwÉžùÀVÚúxu} ’E´Õþd©[H íMÝái+WÀW•Ó5Ú;mt¸.8`Fë¼viôñ”XñM~@­J»ö{]^5XtÀ‹ü/Ø"{>Dmö-^SýËv¸¾Õ=©§–T¬!XjèËÇAV-‹|„GÚXAÖÛaUªÏO*ø¹óÑ)PRê\Z|2µsö* $ßvN-?Ã"´Ú_ n¨×uH'™dŠêè!÷†x¯”žE¾$ñI<ò±ò9+ûkÜm¼qÃ+Nªý€Ä\SÏ+ù4½¬¨˜Y«¯à‘oê}¾H4žÅjŸtE›Í{ÓwŸÃ4¯ÍßÊÛIgÜ"$Ý¿8DÊ®üüWM¥Y#M´ÿðRÇ ùi5Ž€¿v{äkOË©Ûçïª ™Qª JOŒù²§ÇÁ„Ò¥OÈU_{mwÁqy®X3Û¼^+K$Îsì7øey“®±@+Ž‘•$ù\S§K†Fݤßù¥Â~åŠUU‡#M&âîù^ ý2qÊ”jÈ–o÷M7Çä?º¿QÖëJ½ÈÖ¿ü°#N?þ<…iRÃÕ]xÁœ^9 E¾^hÍ:þ4¯×Óh ¾=òY4ÞV:_²-c$\w¹ä´—È\Yœat²«YéÙž~©>k£-:v²À‹+‚Kã²*U0ü„Jï¿#°¬a¼uÙ¤¨·~BW€#V‰Ëã›2IÕD©RË …°dë U´(lyrF€cþ]ÐŸàŠ %Ä>Bœò;%åÙxd‘ÙPï(PTa6ž*–2i4È7IG¿ÁÖ:Ëû°]”¸h©‘¦”¼šOÁL©l¶ 0Ë*e¦[]•/ »«’¢¦™~ Š˜²Š[¸e¯/ȤÊ”M¾”JQ(‚P #D #D @‚PPThJT¢P%!@Q@”%@P‡§|Zo¼ ]n:Qå«9ú™ÃKI¶—°©¯'ºN^HEP@(   €€XfU*B“ Ë‹Y‰SRåd âe % € ¦LëUi£tí¤»g^}ƒ4M?òU÷gÀ_R¥äÓiRIç° ›F㕚vTJŽå·Á©&š®È3”›åÙ¥NºòvŠ×Õh ^m§Á+.À¼7‚·Iðè,µò¬i¬ZUDr¼¥—ÐYêˆãJï/ #“x¯É[«°.®QjXÅÿú€in¤©*ËVÀ(Úú½èÌ’r®Ò[nä±m;ÿƉo( ·,$Ššm¯v×7þC’xà{÷7^5¹ÛäfšNÂ.îßA¦Ÿ³Ê 7MÞY|¥Í>ÈÕaÕxV<•_ÀU[ˆ—+öÅ*å›Vµk§ÃçE†’à×OÜ ‹Í*©ÚèU´—eʯ9òxÈ ¬~Å_LyÏ/è'o¢(Ÿ°Ãu%ÏRÂã‚wóÈ Z\*¥v¦:3‡$ÓÔm§ôÕ L(’iŒº¾xaµ\2Ëß ëQã*ù&zeFî)VßDZšk”YëòZ\þäQ¯ëä̯7ÚËð|´–©:i ‚ƒOî¥äIµ*u\ZÆyFR}sí\™J×v©*–ëøI0¨Üiôø4û´m¯»’Zçå ŠžI/º¸ðÝ–NÝ®ŽéfØ´’îðžb“Y2­ÜjºÊ~(]SåQ»XvØ•ªu€-$óÙ#õZªj²T©Ý¾(FãUà­?j3¶±tÅ½Ø Ú¶Þ@)E·ã²g”YƒÇL‰ZIö¦°úX÷&µËߌQÇç O·öTíáPQµá•$ø`aG?Éem5J&VêèV•V¿ÉDnÓ]äÎÛ° ;jóÉ%mÖ¾Þ0FªðRúRCj¿rÕrJµ@g†¼ ûjšsìF¼ð¬„»à+<¼vV/ö%«'°ôG•l‚]âˆòù€¸Ò¢ð€œ°½€ªî¼‘äò*ÀË]~Bà Ã%`)Ç‚<`ócÞ€´ˆw4U+"´Ÿ†tŽ´£ÎE#¤uc/gît^ÄUÜÍ)ZL¶J˜R…R„R©y(aö\••RòR¡t[*)Sh &d¶‘( M f‰@JA%#@J‰@A@Fˆ@@J Q”TP%zàði«F‘–öŸ'×kþ®®ÕÂ3Uæh`P ( ÀÒtjÂÆ‘PU3(_º‘ª(ÎÒ8‘ Š*:)t‹6‚§.F.Oà%v‹KöÁ¤ÒMPejʯ=ØOjÊ÷erª¬„8j»5xIjÈQEÞxE‹©«xµhlí5EA¦¹ÍóìE+tˆ*·ŽrUç#¼WŒ·/߀œ*èÒiÕç% ÃwìW`W}ðGÍ/ä ·$¯|ØêIýWÀ;O¦$Ûºò·µ·šX"~Ùº‹¥á„Tü.pVî¨)~äI0 69µËá”(±—r%U\° îºà·qÆ<jÛ¬•¶•46Ò]ù*y]6itû5MǞȓiµÐ'F’ $óÊ÷3nïØ"¦”“ó‚®ýòZº²ÒO8Å=µÅ3X¼p-a‘>ø(²¶þL¾ÛtA­É+bê©®¸Ë2â»`+˜ßà ZN‚´ÕRòl µ'< ålŸÔÚ¼¾ µ. NSq"M:ao> '%OÏ WšK#J /<…]ÊMÚÈrwažÿ%\ßæ‚’ŽÛÚÿ»ný€;ö÷渗ÅgÜ>YO°¨©a¼ nÅ?`.vK‡ŸùJÛªUæÈ©Kr¶Ÿ°“m㼺ŠXOȦòø]’ºÊo€5m*®ŒÍ5%|ô\¯5B5T¸xvíðWÚ¾—“WY`N~i^¦ò³}{„¥6ú] #ʺü!5טjTÚX->SµX`W$–²5M´I}Õò#+ÂT¨ã%^(Ì^Ù.pOÜRÃçV¸£-[ã#¬·ÊðV›‹^@˜xyèV+ÀªWù S~z×f~Ùó„À5\sà$þ@”×\%®º-fÐÅ¿p&Tð½ÈåÍöÀ<†ëŽ€a°–/†A—ôÕ‘¬×#Æ*ÑqŽÀW±+÷ •’8ÛøQ+ ×TˆÒǰpFä%Ÿ F³’ü¢ªX(2YDKȈP®ùdwÏð@¢5à Aò¢PTqÀ¨B…@¦kw’*§f”ä¾ÖXëôÑÖ3Œ¸h˜ÓI•HŠÒf“ Õ–À¶Š¶Å”TÍ&T.ù/ÁQl©•ØF¬¥BËv%”,R8™¢ B€€ DhÐh DD "”J€)@" P €”   %(L]3¥¤Š¯õ!¶?s>_fV4 € €€  @€ € € T·mdªÒàIE4e7>Ò¦@İËT­¨Ù¯Ó¾ŠË/KðM®>ä]i3¢wÔX&ÏDŠ¥•yŠâù4¯u~ã’¯µ½¼«÷"UŸØ”žÚaZ‹]€W* ›uÁQSæ-~Dy¾º÷IÒ¸¸ÊT°Àµ\ÊXéYMW³ &¾¬d ­'|2E6ü 5ýùö ]g´@IÿÍt²QkË"^V@yýÈ—¦.ì´²ýÀµµm±óȦÚWt\Vx—Vo´*’|‡·w°*w|t;@Ypÿqkäãk_ÓOŽ2€%Œ`5Ig ·Ç"›ç„®Uö?©Æ åm¥Êku¯,áÒýÖîabùËMróäËrÏUçiSiä!»4×ĥϰ—)àÒi§àñÚݯ(þXm«µu’ƒk¤FÚWVA¦ÝpGîï°«Ž+®Ij’¦ÜSiáp€){c î«È>Qsû|„UIRòËÿ; Ž-á4Óä"m’º¥x|®qxvÚk€+Tía‘Ó{˜ Ü~Ä“©'ãü_{­§ÐFšJ7àŠ—ÀR’êÑ™µŠ¥…\+j«ì"æÒ|„ªNŸ!Q%/«¾TnãÅä ð¼øòn1Iý<ûøËwÊyž9 'íîM—ÃSn½ì[Ëh(éÚå Ü’O2“ÝïðÝ·/`M÷à[Ÿ/¥ªyªÞ9  ·¼òìÔSi§ð€Ë¨«y|ü–÷p­7&škÉ+šIæº\£M_µ<eÅGaùî¿ä*&“Á®1\ 2š\+Ƚ¹îÅSþý€\o‡à”ë {³É$¿pIæÙ=« ©fìI~àL¥fRoç€ïk²8·\W$®ŸI’’ÂX`fóƒWx~@Ž9y¾ÉVþ2î9k‚*T€<'|"5yµW†fꤿ„Oüa 2ù°¡)¯€#ø"Ï+É*úªº%`Ö2JòÀyDÈÀPäaä’JØ¢p€%Ù*øFZþVI^à:"Ç!R²ZÀ ö#ÈE÷%_(þ@”˹®*šì¶®Ö®‘Õœ}ÑÖ:ñ|à˜ºêšjÓ²ÝUHÒ‘¥"¦²¦€d  `TÊŠŠ™SL¨¹*‘¤P­jÁQK`ÀX 2Ðh€BPJQ‚€”J €ªQ( ”ƒ #D²v¢Š{ž¬¾N¾§êê¹~Ç24 €  (€¡¤ €¤€¥X ˆR ®‘›äª¡« Ë‹´©d ,åš+-&ÍFm#4ù5±>ð\rF¥vÒK³®Þr­dÕ6ömv˜mm‼Ð\_†“¶åÀNݾ@¸´½²ð¸ÈEyä˜|,Š”[\¦i}Éø(Óyâ„x®P—þRä .±Ò­Ïo ‚Õµì.ä­ˆ¬æ±üVR*í¾ ÕñìW†ŽyŒ÷'2oÏ%m¥~àTíñìUI×\[ùè ®³†º3Vì#J׺"Or¾8M®¸òU\ÐTµ.‰wƒæø+¦²²‚˜M‘º@SIb€Ã¿Èn;{ðR¥ä;aZŽ3Ó|®‚#ÎÔ’¦û ¼$6×<0бë5ÙN•X<ý¿%¥•üþ•H¶¤êÚh«M²§qNú¸Â~á4Ýôú”½Šîªÿ<ðXÒ–j€)<á#5IÓä+q“ª‘µÇTUòø5.=ÖB'Òø*ús߀¤y¬Sì(¼çÜ´¼–5|%í<‘·yí;»²©SO„[et²aÝ]^y¶–lŽåÿjšÉ%|,vV_ÝŽ ´ùX©¿k-§+Î[Wk«4ÚU@Eœ'žÊ7~y -xð-E¬ÚXßtöódŠú•yä!mä•][úyüüÕ[éf*ªŸÕAßÜ—Àâ•s$Èëb^ÀTÛKÆ2:¾­XÛ—Ô—\{+ ÿ05U@WNßðFê¯ÈIá{ØXo HôÚä­×y”ë-<n«°®v¥;ðJT×@j •uÉ“’O7ØmqÃþÔì ùDKø`J·ÿ$«È’Ûìÿö"_KK»Èwt­·”%©W4©4«¢g¤§Xeª¥wxéWƒ6ß*ç–{[yÅ Ó\¿f]˜ÇL‚5ùòe¥YxÕôN1Ø’t¼“^ÎkÍ“à_°’ÅC?Œð•äqЃÆ:2;ÁÉ+°øóø'°Èœ“°5‚~Ÿƒ4¢{…JKeèüPXÈÃ0¥døaR£IÚ"ª“\3¬}D—ܬ˜ºëXˆm?UR4¤¥#VAS-ä €¹@,¶TTÊ™QK¹¢¢ÙJ…–ì¨ ÙX%xpŒ€ @JFˆÐP(Rè*4””( % €¢Q (·LòúÝ_¥Av*<`Š  ä€à(€ €B€ @r.´eÅ MÆEWDíL*4r›¹`%  QS6¤×`tŽ¥òiÅIZ=<>DZtÓ¸‘WoF³šYWoÿ‚íI+®ëÉZÆv9\›‹Oç3+ÍsÁµi 2—?€J¸(&¯ÇhÒJKœ€O ÅâºweRià 6¥ðe.«äVÕ߃]€»LµkéRæòÿÓçµ|XU»®º%ó^@5ŽrÑnßT—!¶ßO$O”©<§Yʱ—1qï‘yÚ0Õö͵ì³(¨ÊŸÊ¥Ž@´ªšÿõ3K¬Ð¤­ñÁJrTðì *T×$þêê¨ ÒMSÍ7F±ºÍp¶—Ò­K¢eªªhªä&ó`UWD’»^r¢í[Tú3M?©ß \SÂÏ>Äk Ö:•â²[N/UyY#TÒNÕr~Õ]ÿ’ãcþÍ>òÑ~îí€RkÙpNp˜ñI“Û‡ä *®H­Ç( ÅÖè/nÀ^N;Z“oÎ=€é›«»*µ}X¸ì'ápµ¨®Œ¦¹ÏÀ ú’kšV¼vÀ˺OÃ.çT–`$ü~ Ý·y8þÞ}Ëí^à%Ú¬U™Yë J¦ÿrö™v«ñÑZ® 2“¥~)Žh êß¹ª©€jÑ—’ÜÑè„JY®@Œy3~@•mxŽ@;#N­…N²ŒÉyÀ¸|¢Ubˆ Pá:öœŠ Ãè‰` ÉÇ=+F€•‚V§È¯Ø/°¬€†%à¿Á­ÈŠrn:’ð0u¨N·*:ÆJ\3-5f”ˆ­)L ™Sذ¶TÊ-—qYjÓH¶ŠÊÛCqBа…€!lY0dƒ%* …‚¤ð@  %(‚4% „(€“t|ÝYoÔoö"Fh@@P¡P (TR@ S°¤Ía…G0ÕF‹:'hª’•D伄­² € 7 ¸¾@ôÆQÔ31“ÒŸ³À”ÓIù5Mç®È­%Š Útù ,jé ]\9ä $ݧ„uJ—(TùÉU§‡†á¾»+Kwü”kŸf•abè Êø*W~šy-]Z§ì\*îÐ<2Z¾5›\5BÚÈ·—Ë÷Âk«¿kµË5CÙ Š•/b-Í»h*¦ÖëY6–}˜ *^L<Ü‘_Mù3yÕr7]Z«Uᇄó‰ŒÐxT—`U5M'Ö­f‚«x¿`í4€.dšå…ËMÒ7Q¢ºjû ª—´ž~B+”mû“ì Ëê|ÕW¸Rëî‚&\šx笤۴®™s|ð»Y벬Z ’^cÆJ•;Kår|–Júì ¬4šÉ¦“Ká'îV­-ßU*K²§ùèÚo¼:Ž­×!QÊÿ‹x´åä®®øl7;te½ªé^ç*V[^)?à#.“5Ÿø ™Mº²wOè çß"°ëžAeSxì±jš¯ÈÂi;³Vï((Óm®Ì®-Z§rɹW~*Ľ†xÀ•¹¥ô¦ûx ”«ù-¶±ÊͼWÃßà(œœ+ÚÈ‹oj–:4’Ú×]˜ÛK}¦ŠîÖ-ðÂÅcA5TîŸü…ZÝ+ê‰JÒxWÈA[ÅÙ»’ý‚ª§ŠÈ›Iµì“¸×–\(W}UF{óå¥JÒâðsšuqv× nêMWaçðOlŸŽÈ–Ú®-<%ì$ŸÀAÖ2"Ý.ñûG',q“6ÿ· nþsdn“¥—”œÝ.,ç€4–ä”>r)¥ÿž@ÎßäÊ…¿`p±X cž€ŸÜ­S%®ºüRÍ™vÓ¯ü@[m]*З´˜OÇ3ãÁß½&冰v£tF¿î¥Idƒ;ZK’K ex5@F¹%0©¶“²5@J2ãÐ UÀJ€ø3+k^—DÏ`NJ¸ $±íT¬`•×`F‹\ÙFkÉküa!ÙÚ݇ðZì+|ûü’¨)ÿoÈ» Ö„þ@pU&w"§ÚtEt޼£‡”v޼%Ž>LØÔ®‰ã ªDV”Í)T‹`[( -BeÍYQw¢Ý *ØE°P¶-Ð@À P@hŒ J"”@(¨œ)D¦(D¢PPU”M¤  Ñáê§·Mùàùä € €P€ € (((@ ¤ t €"•0­E•ÅK‚Žr0™“7bnåÎ ‚P¥@¨€R‚(Ó“³®«N wÑéGwI¥’ +»|RXWì‹[*8 ê—ÒÊ,W]3àƒJ7¸«  5îJÄ|öQ¨º¯Å«µË4•'L ã%KŸp,qžC_P ®9ž@½Wò¦âžêNÖ r¾À—xxdÎrûª­<–÷%ä!t±ÏQð‚®VW>“O+[ic‚(âž@©çņ«6¯€+Êä˶’ñËJ-ÚC.²åµÇBð“°"éÖMÿ>Àe=®¥Àï *·Å W ᪰Áaç +vÚìÌí7•ʱQ¬r-n¦ðûå¯ä’XÚ¹òà[nú ±i<1SµÕkéyçÅåZ 3Õ+®ŠÒMøgu¢Ý&S»Rç›X »®rÄ©e*Ò®nÿÌUV|„+a‘Æùä ôýJ¨Ò[_6‚’×U†m«x ¥ÎµAÞeyhŠšùŠñŒ…j]r·µgÝ“”ÓçȦÚNÍ(¥YÏ`YWbW¹ÒÅXTR¦¾Õe[@YFÓÎY>+ÜÜÛÎl^Ôî5ÐDwi÷tXÝ¿€,—XóÊâ°áy]‡'I¤­ŒU¥i½ª×È[qŸr&¿7ÀÚŸyçòG”•S}~çO¼£*ojkÈEmÕ?Ü'q_€4ªÞE«Ïn‚¢iþ0‰N4ÀEÕâ¼û•ykà"VxÃäF.š’°¨©½Õ^ì‰}IÞB+VùUÐMVêö 'mõàu¤d”›é²]*îùž3Øi] "®U—ŒX _‹ì¤–‰.¿ýL»µŽÖÔ Ù0ÛKå€i«Ïaº<ýK¢%ž][¾VÓY~širGi¦ºàu‚^*ºÀèž´ïß$”^×l µ‡N™i.UôÈ3ïᕯ©’Œ¼¬vJt»óì§ø#M5îÎsžŒ¸ã9ɯ«Ø*ï#T—ù%ޣ͉*ydÍ~áF•PuThçµ€íòA(NÈì¹/h W%| þDh'‹¬Z dÉY %oì Â§¾ ÈC¿` b¨*5CŽÂ*—’ÚdŒåµ³¬}CþäK×XêF\3vF•HÚ‘R4˜ÅlXÊ™EL¥ER-¢¡l¶(XÀRc( d €²©Dª(ˆ”ÁT¤!P€SR“ Jm’¨!BŠ©´ÍPD%|ÿ[+’äó€€ €€ ( B!B„(  *£I”k ç85ÇR5~#EeAE bnNéíЃZKçlü&­Š,k"Ÿ(‚$ûäÓʼXé_4E…œ¦€+òWžÊ Ê“ì]ß@^hÕq]rÀ>pZw@Õv‚Ë@UxXÆ îËîÃÐÚyൗ–mŠnë£)_…ÛÎWRÿØ(ÓŠüR%5ÇAcsy³jUð­[Ç<Ùp­Øí;4ùÇÀ¿f\8Û_þ¡ˆWfUùè*Û\dÊj«ŽÀ´¾{"â“ä ’q\à®U.=¬"7nú¢õà(©rƒ¶½èZÏîJüöZV‹\¯(+TªšÊáœþéä#U|åX q¶•sÈŸ)еÿ6ÓN©]Qb•Ýädè™¶šà(¤š®ÑS>hm$¼bé{1ØÌ]·~=€‰¼>/-Yª@>«ºÁ^m ªŸÕY§ƒ6Ói¾éå´G$à¥'þXâNò‚5+VúäÎd¿€*Ol—|…ÞJrY¥ìTÚn™FRWºñÚö*¸Ì‚Þ-~ †›`#‹\ªiûfÚÏh,:øÓU¶³‚+·kJ¿ªí¯WîTVÖì™R›íV®\ª®D©§O5ÀB ÊöððD× ç·|gfé\¸ %µg¯N2ëä°Êðîì!v¯Á—öß’YÎ9$¶¥yö ‹må4ÍV8Í…3ÒìŽk7Ö˜æéû‡†ša7†Ëóä+ umå"á%kÿfiW³Én•Gù Î×wÊèŠ_ϰASJï’*º|0ªé´šáÐò¼0•¥Â3,:y¿@<»•|§û„§|‘Òç®PV°ãá·›«@"øñþHþ‰&ó@M%Ã,d•ûd¶Û¬éÒàbéõ’Z¿fZ¸ÓjË·/97øß¬¥f)}ÀJYAãöÒŽ{£.>üt¤Û¤fškÀšë—ÒòAù#ºÀºò+èâŒóÐkÝXÏ€µ^Y‡©øË W+Ø{šì;kAY ‘¯bŠ—‘Å"øèŒ †(€-¾0'Ëþ9r9üÑ(ÖGNLЉ]€C°Ë-d B€'EÜETד¤uepk¬uâùÁÖ3‹X¯Á–µ­ÅS Ò‘Tˆ-–ÊŠ…Ð -l¶P¶i5ÙY>´µØø([-„ `0(ÃBÊ’™,¸P ¼(aF¼"«¢†Ö&h*eh0‘­-Ú²ƒP@@(@ P B€ @ ¡BPPE@TÍò‚¹ÏO´a Ímø*)J„è¢j v¢^⪒ŒRðN¦Ÿðnv@I9ãðIRwî¶c‚𫢊±,¨m~x e¿ÁE4šü*•Yjñ`e»ü¼e|ãž5Î×B«( —ÿ”ß©Ö@pŸ^—XÛŽyNÕñÇÈQM[DQI4°,[Xà^¶ðËÖXV]ãÅ•~›üQn—»Ót—!IÉ«§AFÒªüŒÓQ¶Ú¶°D묅_‘Ø2JÞx ˆ›\—ã>ÁL?%åÝ×ü„-®IKw9è(÷W4Ñ\›‹ó@á‡î´°»ãä¹û¬(Û®; *M0/XYÿ’on÷F¬ F¢›ª¥Ç’6”i#óËì×O!Yi8Õewäµõc®B+›"v€IâïÖWyÜžš¿‚¬òÏ"£ùÀUµÂä‹)%ðn¿ü‘#|×@VñªKšh žZ|¥nÀŽ*Ò¿oÀQj\ݯØMÒUà±XÏÈV[â)sOr{¿¿«ŽE}Y ¸wLÃxK6µ]ö^rè &³…“;k=*¢Òå8Kv; ¶–.— ‘GÏÇ'Ó ©ºÆLýΚI$©$¹¬²/ V,’Mûø"NMñ\€ÚÛ~/ðI7tÖý‚vûì¶’I~ ónÝ]~ &›,05(¦®•Ñn½Â—Œ‘ÝRMZ_øÌ´åçÀœ )V@±m97Ê2–mºè·ˆððÄT¶§Íaük6—ú“÷5KñÁ8¿~üöÉ„›ç´»Â®(4›Ý!R’&†?k°&W¦¾Àmvœ—³ F©ùÈïÁ+ ûet«šË0àÚö}\S_J }^[;yÇ/!á¿!ñfm¯ž¬(Õü™¬rïÜd©ðÃK Yt2šxv[tø]˜kòÀqUÏÉkyoðQzÎ9+X÷ ÏPk¿Ø*J5Éšj¬!µsnÌ»ð®ƒåà*7ìJ|tj™)€Çtxàö 'ùÛ rÅ'¹EEk’ø'ü€¬N‘(¹áøFy^0e ¥ò¡þ@®Ç¸T%¬ aw±¥&ÅÑHëÉ}ÊÎÑÕ„»É1©[OÃ*‘¥#[€¶[¦E°‚-³W` ™QpÅ2‹~F(°-x@,P ‹ò™("e Q8ؤÂ% ˜L &äeÈ î Ae‚ € ) P¨¤ t()À‚H (@ B€ @P €)¤òQe,׸‰Z²€Š×G_L¯Q0=¿©“¢v°·NóÑpóÐ}¯î¯äÒOû²€°«~ÄmÐ%mÞJŸìA;ÇEê»ÿ%Ûâ…'Ï"¾ªç¢Òåu+¾_LpæIV …î¸@X´¹ç›Xk°*WJÈÓÃ×ÚÖŬ¥MÇ”iÕGMÙ¸Œ¾š§ÿ`+N“JóȾùðc«¹f8÷6ãFÛ¯€*]rFÓjí4×}¤êº·ÐqÂÏvJ²ÉŒùAW5Å“Œ/€ÂF°èŧä}9Æ@]/pî× 0’ì´žPRf¶ç=d#2˲5'‹^®^W$wÛËì!KrHg¿5wXªàaw€¤–=è7nÒç F÷4Õù4Ûm©qÀ¾•äŠ9ä CÙárGk.ᵈûùçÈDªWåŽúy ¼¯fUá?ÈBKßIc=€Ü—›5QŠúoÙH¶‘}×à ¶×-׆‚-Z~ÊÌ«Y|¼°*xÏ!Þz|…L¸Ú]`©µY«®V°¸$]¿ ÁAÚo>åu‹ÁV”Ÿ]·$³ŸI]*Çevš°"ËÊ¿áb«‚uþ &îJW@k}°²í+î‚«¥J×a¦þåŽ@Ìx§T²WIñH tóÞJÕ "ŠmµÇEºvÐC ªWÀ¥_K¶ðŠÝÃá¤YRŸ°;Ç1’T’}'Um®„ ­¹'਩Óú‡‡]qø"›S²TyxÏFþ—'Ë¿Ü^9îÙ‰Ô#Ű4žî’ÁZÇœ€¨ã^Ù°±yÂlë5äIT\“ø@b±Z§À4³d¼¯` ;U*®Š’”yä’\sd®qÎ@SËü¥ä;WË ¦ß OêÚ›Ï "­øÉ;÷4Ú«ý‚O·ÐÒFeVä€6Ú§ÒÏì+î~ØÓ¢%ž?»Inþ@miý$^«ÏF_·([Yç¡æÀÎÚ,“¿=slˬnè(+IIT¬ YOÁ—h_ärT”oƒ4£,DJ€:%ªä€‡,°›TéðG–á{’»ý€>@ÈP¬A)‘ÄUD #É+ è(S±€%{ ŸÀ «m ÞQHêJ `(XEÃ%P `,·`eÒ%‰¸‘— ˆäEG"nbÀn-¢£â€B €@( @)(Š@ P € !@  €QÀ¶iš/E™J €ò iðnQU\ÚâÙèÓ‘4Ç_t/dP¬ÙSUDµc’§€¿>B–WîÆ+à ³†\5L¾,µœà Ö±¤¯êÓäÊ¥”ª…Òh Þo> šÃ°+úVÙe–7mPGôÅæíâ€ÊI®r.I·ìS’KxýŽ–Ö_ ggÕÍú›iEµÐ•<‘·y_,œT³tY8¬Ç( ÉÚUÑ¥N<€ºI;â쪒ñ.£õr€'›¬P»m/6S¤»+_Àeü‡`UiÒVÙRtúò¬(,S2¥«¼|·àwK-Óæ‰v‚,r©g¥eŠo…ÔRnòGi°«Êÿ’'Æ®YÊšž#j¹¸ÜñÏW¶±ŒZ¤¿‘y6ž+‚¦•EüþB*ÍÅæ•›—Ÿ¹ã”^ÓxÖ2GJ¤ÖÛF)¬ßWŽð^ï’¢Ö)rfëݪ¼Ý&‰š@)åâ—cî©fÈ«,+²>@nÃOø"ã#Q½ÞÊ _ù ¶Ú¥•äÍÛxÊÿ ;R‹¾{’—A:§\¢Š¢ïŽxeM×Õ‚+9^í‹JuÀ6º•}à §ŸŸq{SO¼•7Ÿ9em·Me6Ê.úâ‹|¦°˜Cr|b•¥\ù ³ŠÎk=j©W,Üw$Ó»¤Ë$›TøÈDŠi[Eo*žl*8Þ_5 }¸â¨ ´¤×WÉ#uißuà©eá¼PJ]µŽ%4­~ %Óí¦–¤í¬æ¨¯—à¥I7’6ÒÝ×_ ;¾Åý+9  ÓKÉ›å·@Väÿ‚Òx|ØAU|™ã[’IŒ×Ïý€ËÂç4Ö@—yò^ÀS]™kî¬ $ñuîg»öX¨¶ä–mšª`L»vXÖr¯øÈ²ýè«Ç!Å'ÏTõÿ”sUÀIå]–¥c¼öã¢WÒÿr Ó¦¨±ñä¢<¤ë°×¿`aªoص›òAWŠóÈjk‚m« ¯( ¥±<+6GËPö4JTÈ¢#/@;JwDÃë%<:'ÉC’SìB€5tJ|’¬#AJ%~ À °Ð ò+8¶Åf‡à-¥*ÊÁÒòXyDWhëB^ß'Dñ†EiHÚ`iK@TÙpQ~Qn‚-®Ål˜,¨ ,x`ZK aÉÃxV\†òÙ7,²Uð2‚`^@B€B€ € P€@@. € •,6+FŠÈP(pq*ù’+¤èÒž(”L%fžM •Õv^W‚POþ¨qª^á“´ø%e¬¶«Ž¬Ú÷²‹NI>Ò%ß/i¤ ï²Z|yß]&þÚkƒ*Wl – ¶½À×9äÎSnÀWÀWŠá ƒK¥Áú]0ª¾’«rmpo×°X“-µû Kœs€Œ¯`žÔî¼|i6ïø§Rtñá€Oû_=á$þSXü€WTÑ[Y’àÊÿu+`jÖß“+žp€röË ò§O²%±ç!Q»§ã%å„Â}™ï<cûsà7šn¯+UKœŠiù müQVdЫ’¥îJ’þïÀå™IµOWv¿ÛÂÂçºx+Ym«‰5ÂàÓÄyçR©ªyì²I¬óà Õ/Œ²á´¸ù’Ý%ˆíÎM&—AG•Ž:¿üÈŠÍY§uÐA5X¼Ø¦³v–ÞÚk»WÃruô¦Ã¾+Æ»¯À_ÃOä)w×ý‹ßL)5i·¹|¥ÍÉ|£›Ôÿ©Kí»@k{QÆ]Ñf“|„F—7“N“i¯†žcyÀ¶±_¸ woçà]ÛÿØ#X㜋®³ÐR\$ù"Nÿî\`ÚŠü‘Fãóÿ`£i:—à©_µÛڒʺà‰;uV@Òm'uŽ :µ|+¯p5ÊnëØŠâ¬ 'Nºx+¥¨× *þ@œ«ª°ÖÙ6¸h ÓKžÇ^B«|$ò¹ö3YÏ4¦ú.Õ_!§jð‚Æ€ÒòÙ/Ú{Zt% s|+^àLÛ^CiÊ¥ï€ñ,Sa¥Ç¸ðï‘y÷èÅ5ÇbO8}—Çù¾?)€KÞÛ'-¯Õø'kà ;Iµà‹JÀ‹Û¢U¬<€ËŽ9í4©?Íñƒeø§kÍ‘ã@¶Òx¢¨Ó &죿bU®1‚4ëòI$K ‰P¥`8 ò©Ï@U‚ôIr- '>’]€¬`%ÒMþºGÒëÍ\t§_×ôÿW.4$M‹g§þ‡©?«^§¥LôÓ“1zYÿ†z ½°Ü¥ìeÿBôñw=f—‚ÊXíéНdš]›н,âœ!$n2ã«ÿìôkþœ¤¿óËÿÙýd¾ò£†§ôOWj;¾ý¼g±éOwŠ.%sÔÐÔƒ©ÂQ~èç±®† ¶±C(˜º_±¨êJ9Œ¨˜;GÔ¿ï_”v†¤d¾™".º&U" ©ÑU¡aÛvT²€Ê.;µtÆQP°Üj!-@¬~¡\ìƒ;†ë „°«vB"YJ€°€ %#Dv°Ò`JÈ€T€ R@R€Pì¡@@å•* JP(4ž°Œ¤Ý+ÖiûÚ´=0—gtí áDÛ“éXÝÕ{ZI{ŽS]…j.Úè<«¾2Â’ùþJ.U"õþ@—røÁZIWLë Y`•ðº¬r8àéµÙ¤¢³ÓðsxÝìÒ¼ \€o†¸ «„<Œmÿ€*\û–ÓÇ€"®ód‹Yó`kž1Wd÷¾¨¹j˜%ù’nËÏtå¬{ N5Ça©/$SÝ×î­$».WX`G{hÓYMüu^ôEuOð®s_&’JN‚#]®CN¯–$î·*5|S¿ù ‰ùeyuAÚŸðÀ©7›Árí]o9º"“i:¯p-Úä'šElM,û²§Åg°­mÛåÃÊÏ`¹{PN.\ä ÛËášRʵ€#jV×<Œ®^^¬RwÚ]&öÒI Š÷5Èoén]]¯´‹ý¼^B+ÝÂYâÄdœé§î[J³Ç$mp ªÇ!ÕÝà*«‹yÍÚ¬}=°%^ã³\sI„K<3-·M+ 5/œxËÀ¦‘)ÖH%Ufù )S$—5Ð g5’N’ò¸«'núW†D‘€ªT™ø!D-0);À`OÉs€ »L CNrX„ŸàôCúw«š[t›¼“W½èZÓδ֚ñÙîÒþ“èô²ÓÔ~æoMN]—¥ô±û4"¿£¥£PÑ¿c­âËWOIÓ«ð‘%êé/„€â´µ½OÕ­7utýÂ?ô?p5O˜¥}º:iúhÞé½Ò÷:óË—]= I:Ýǃ¡¦ 3)Æ<ÈrÖo_“—¨ú4ÓÔ}× ñÃVúu´ã8û£·ÿ ô¢7%ìMmoÿgt¤¿éj8üž oè¦bŒ×±©`ðëO×Òûô¤¿šZM`a¬8´/ðfÅt†´£ŽNðõ0“©*fÙ4þ×f”š Ò‘´ì H¨Ùl’òVÕŸÔWõs`cõ3ä9ØÝL9X"À  «b¼Ê‚­_l¼1‰­-=Iqû^›UÿcEÄÖá赤øGEý?Sº/éϹ_Ó¢¹™QÓOú~›•7hé?ézOí•^MéóÓÊÊ>¬¶»À*^Ŷ¾¯íOø±±'né…L„½ÀÕ:}v%—Î@‰e×á7Û4ÓNí>_jâ×àÌ"ÚRæ]Ò©ÚÉ•–« €‚•ß cÙ–ëñ`IVdÔ–×xfW»²+¾ì!MrtV¢¥õ]XQÜS§Ç$I¤¿“i«J‘#QJ²˜U]FÇ5ϸÇö²÷~áNåmãÀ«I¼ -ÝW ÈÕ?{ÈR¹®x%·.:`[ EEÛÊ`Ibyù^âJŸÆ~@”—·ù }KÀm]‘+§Ó«n¹Én.+rã*€¦—d•»Å #x¤øÉWÛOžPÕ¥^ä|x@U\¥À\㞀˻Ýx¢â¶¾Ž-G5Ùvág‰$Äý»ä*m´ý‹+`G_‚á; ¬þÈ´ºo,Õ·‹Då -7Ý+"´æýòF«óà¼Õ¾2[®]repaU;æÒä’§> a§Ñ*²Qž¾Vˆ#˺¢fïÀÕ­X’5]…F¿€ÒmqðGñò¬«àŽþ@Ò^L¼:ÆLö ð>œÑk?ÙÜð­ø@z4½¾¦Tv¯sÓé2–e©_Åé¿‹Ù£ý3B:{$ܳmù=z~B mÑŠ÷fuqÞK $¾ ïQX Œ7|ä/Ü'/•îx½Wõ-=9~–“möÒžž2“R«“òzšÓÐW7ºb[½G¨–*=::.*›¿s¯<¹õÓ²Q‹f£8·QNOÉÑÉ·-ªäÒ9ËÔ%ö«&+”µ'<]/bmK,£®œT#¾_„yµe½¶ÀóêhÞcÏ‚ijËJTðe_CGÔ).OB„1%M~ç›ÔMô¾£îÓ§å`K†>_©ÿö{—£;ögÊõ?Ó5ôצÒóÑÒYGŽZm3׺3bêÆn.ÓhíU(ýÊÑ‹Ú:ПŸ†tS®Èªµ¨ÒÖ‹\Óõh-\—6_Ôt¶]̰-/$à ³Õ—ôÛûbÀÜtu_ÿMÑÒ>“V_Ø\Moÿ‡ëøKòn?Óµ_2Škkúe}Ú†£ý:̓]¡Ð–izMþË*k¢ÑÒŠÄT"¸Šà€„TÉeVà»:XD³–¯§ÓÕ_TrâÖô. à­In†6 ®2nø3¹ôèÍWÆEP @C  €@€ @€ì(t@C`NY² @¨®@X!Úèz]8êB·,tÉ(-)Ú’UÐõ:I¥­¶_r]3ÌÕtÓ•ª;BtÑG¦-4^ -[$šº"¥Ñ·Í®QQU¢¨á4À¼€þ§žˆ5ÿâñÞ $kŠ£Wÿ`*ÂæÌÉ»° ûuÂùÓ_UVÀ·q÷3jÛà ›ÍôÊÕ%@#i¤ÞHݯRò+®À·Tÿp’I|Ž"™kŽC…k<Z¬…9ñÈDË|nyü Ôi_;¦¹Ç$ºv¹j_uYqm©Uôq“ËóÑ»«_°»år^®‚6ªÌSrwä*e¾x5®r¼rÛ²wMfÀÒR´ï(5„¯Ù$œ\o’Æûº “¶ú¢ZKŠh F[©‹tï Iðº¡IGu}_ðºTSýÂÚ®Bý€±®°×6 ß ˜ëîX*¸õÂJI·µUQQ_ÎÆÕð™mjS¯zö ·ã b‚´é OíI¯v]ISÆ€´ûÈXŠ—à ¦êׂ¿—ÈVTZTòø²ßNñÀþªKòT­<«H ío—IàÒXIÛ¬„fšû×îX5(µøJU…ÙaÒkQ$›Vø²(ÍÅ|ð.óîT±\:  (×ö+Â^;N×…É–¯üSj2i7Õå7Àâ+²wžÀ”&Ût[éð1|cšf»I`ÇF[§Æ2Ry|+þ 6žVmXC)Û使à(ß*òGöÝcÿp µ/5ÿrî͵ÐÒi"vžr“ã¿æÈ›´šç,VrÈí»|°,›ÿ¸j©vß!Y¾ó¢×I'.@(î¦ùä8+{[¥À•·Ž‡Ù«`\.Y$ëž*€:Ú×árë8aªwÎMeFúµÇü–÷V2€5ûòNyì–ÜÞŤ›`\¨äIaµ]µìx•1$Öo°m'Éb•$ÿDʟҀ˴ö‘:•þß°“ýÉŒ{pU‹ä ñvö IqÇ`M¯mö]´ýž ¥áÉ}>@Ì—K%J¢ë=S;¿“)G¯üè Tÿ†ˆS‹— £/€®ú|‡—Ž@Í ŽØ ®³XëÉzAEÏ’=Éo¥É8nÀžÄo÷ð¢+« ¢O40ßÀFZ¤F±aS¦N€Þœ~é5j(é¡éõåmB“å³6µ#Õ§ý22Τßàöhúm=5ZPKÝ£ºÜ˜ôÇGÉÚ:v©ZPŒC’é~áü‘ʹ 2ä«t#‡ú™N[`ª+–§¤õ´$÷Tk›Cúz„¿SQ¤Š7«ëT?éèC|½‹¡éµ'5=Yn›épóú¯£(® 9(GqÖ9¼‹Vçõpwzî’‚QDÜîYÉ/ÐÊlínvø@qõ:®öÇ„y÷¶J¦ñPš¦A%¤ïMÚð{}6¬e÷:a¤R4”T•I&½Àðz¯é›^Ú[%åÕÿC×Ò·¾>ÇIÖ³—©éçÓ‹_ƒ‹ƒBÃPÔuáÙŒWXë^ƒ¢wÅþÄÅ×XBr⃢ôú×)~Ä#èýD¿úOòmOõûU”tôÍz¹J(ܥɼêÖ?ÒáVÿ—ôýËl‹Ðúeý³QôÚ+ûpÓ_l"¿à’þÕûÊʘ¶ûK²  F@rhá –sÔІ§Ü‚¼³ÑÇJ;“äùÒTÉZ|`@   @(HÀ P¨€*)¨Šà0 + TPÈм"Ûlƒkœ3¥)´Ôª‚ºúmT¤ô¦÷Fx÷3­£-IB\¯å¬¸V×kƒ´]¢+ѧ.ŽÉ®Å"§k’Ë5œQÆ2™§Oü„jUxF¾ë^<]y%:¤ø¶ãšù.qbˆ¥mà¯ú[ü–©dæÇþ¤_½•U/ L¬¬ þÛé®|0"û·Y,]÷xà#\4ì’Nšòvþ§ÂDwn?È¿«ð?´"Ë1O÷ ŒqÈVwWù4ß°ïœ{—ÙS+ÂeM_<Ü“j²\RÍ?]ίŠ2ÞUtis~æsWàMvnRn9¯ˆù¥ÁµÌmã ©ÞMw`;k€•`Ö›k¤j9Kö¸¥Jé<‘Ò|»›-ҧȦøèœn¾ÓUÅNëÅXEËXÁ´º|^ݮʻ¦3‡HÓ‹të„7reQ¤ÕòOÏEò²Ÿ·±cI¶¸ä"8¤­v4¯kAUÒeoðš9TZ!F­7aRJ­ì^#¶úE¸æUXÇÈRéù/ܯÀwíØt¸XìÊ«´]ɾ}‚#í'×J6Ýf‚œ¤Þ ¾åògIEù䛩; *”«m{–©þl×àJM+jû‹¯b;r´¹ÊÕºYù +êü…b[šUÊæ†vÓ~ÀT­5ÎrZoà §YO8áSÍsnì–ójÛïÀ ¶¼¾ðDÕF¼: Òn«¾Ì¶œÚª¾YvDóŽÛ»ÂÉ{óaW}ä²·JÒò[µuø4ñv²€nù\7ùÈ-95X+Pé|…aÅ6«$“‚§ü–â‚t¨¶¿à”¥‹ä󀓬ðú2ÂoȦ²¯»•^äO”—î;Ý\t8^á7~è˜ WN¹"N+Ø—»]Ž_°“­ÙIÓºº’T©™JïkÏ J÷ 5í€w„¾”ÿ€ /Qyòû!Ó¦º.S|#V¤šª`8Ëà˜Uû_ùþ@”› qŸf|0«•ß@e¼»ÿÌŠþ@»c·ÝKé§Ã ‰4í§à0#V¼v$³eŸ6V9ì Ò¼¥D 7ðfI7ç!D¯ª˜çØ,¬OÇ&[·tb€SÊ7¥éõuž/&mÅ“_CCÑÇMq~lõÇNÎVë¤˜í§¢»V½Î—ˆWŽY­ûq@—^ìË—¾B²ä’Ý'Qòs–¼Tn©uî%§-]'=Y8¦¾”s†“qÙÚ—Ôü”tÿS$÷VŸÈùEI>q@2©&GjÒá¶j8è ,¬wh7RÏÈ¥”iòé€}Žrå¿–c}®€y{C½®¼yT»%;üSºDn“kµÀ ¾K‰<ÿWå2m|¾€>ü®áÞ)pš÷Êy@i+vf³€,¯û’^ñ&³ê®€o¦£%LÒt•?`ƒ”žj,ì ,Ïkà{üWÛòKÿGÂÚú¦W⤒®<šãYþ²Ú·±bøTosÇ‚*tÖ0&Ý£VÕæÚ5Âï @*·Y?¥ÊüpTÔ_á _)`±Q\|…D¥Î9Á^‹Ê|°0òžpk ~'2wTérb­Ôžn¹4²­DêXTš¤Y}¿ e®³f¤êt˜¥—|/ÜÖul*NåšIò]ÕËÂÀAmÚ•Yiïn³ÐRun=y3Wûµ—N²Ã¤ì"'ÆB¿l©tfÓún¾$ýß’Ëk\acDéªá•+ì"Vr׺/ ¤{Iwwùíɰ 8óŽŒýX]>B5y‹áwû‘(¨×k -«I[¥’%õ[ *‹¶½±×E»ÅfÀ˓ʔH«j·X¬„ióåWü§Iò¤N¾Ûå…%ºžIŠÈ y¬a‡k BYãŽIÂV€}Õ%–¿î1¹[ãÀräWŽ€ÌiN‘SúW°íñÉ{á€VÓ·ð`IKв.n‚4¸ÿUËÅñû…c8®™[®9:¬ú~ÄSK›] {}Øq|¼ W³¾Y¶9Âi„©dÂÏ$IÝs&pºexuyè‰ó@|ù#ÊÈ¥«÷w4€•ËY¢csoÈK ¬àg°&;%xòAûŸÈwÓ÷(–ÓÏš+^9 Ë·Oª ã}üï²IÖH©šCšð‚2ÓÆs@GÍy ~^§Y5Ic&}Àœ§œÒÐÔÕLiyd·‘îÑôP‡?S÷=J*4’üm×Y1ÑGÉÖ),¾Jmüt‚ÇÉQ~ÞòËöü…bsÛßË1§òûz^H<ÓÔ–¶¥ÉÔ#ÑÛB rýIý‘áÑê-Wº°¸¾ OUÊ.i.ÙQÇN[ª?õ%Û|#Ù¥¥·-W±Ó˜çÕuÜJòÎŒ9ÍÖ/,•QòjuHºqß2£×83çëjï›}9ï·AÉ'H*·ÑÛËH ËWMs$T×’ Gm—\¬§Lí§ê¤•I&Tv¨„¹Ã÷:¦š´ì‚€¬Êš©+Gž~s^Å•Yéʤ¨‰ àŠ¨Ð(*  € B¤Í&TTjÀ̤£&é#åz­w©>qÒ ò6û%‘_@B€€P U%Q´PˆP¡ EJÐå( P@T®GÑÓŠŽœPm§Åû–.\©RKV}JÒòn«WM§±·òYS_ê³õÙ(-:í3Í«êgUmyt´ë—ÉÙ}9 Úó|Ýù ½ß ç/=ö¾€œðû5NðQkrk„:Ï(,ØŠ®ñà Õð³ŽÀ4ã#pOØ;¿àeªºá“þ@{×6ñÓ¯¦5ÉZT—"å_îi;yøþÏjʯ W?$MýÈ &ïœ<™·‹á 4©Õº¢4ÿ4IR§œϵ¬|QŽ0I¼r3 ‚¯<¼’»ÀVªÂ»N«Ø n§òDðšÈ·<º%.WÜ€J2ipü—l\¶·V²©$íbÄ%)ÖÖ¯ÀOûtk“_ ëêDÚ“R‹ç / õeV»»4ïø¡œ–qîénû*mE.s@föµ›LÝÕ6‚+ke®Y't¶¬µ¨×ÒÛYeÎÕÕd óµpø4±ô5€Kbåªk(Û‹ÿ&äíb¼LÊ-~l}«¨ý’¦74«oÈªåø¡%xK/€$ãBéRN4¯ªI0×i™ƒrVð»@iÆ«¤I6£Kêº_Yr©6»"ãŽ1L mK§ãö,d¶ÚË@s—žQcþîSÈ[¶¸a>l#N“ÿƒ>ëø •)5}»ª¯ä ¥Ûím¼p¿©ýí®–#Ý…WxÓ¬Zç‚mY»R’|ŸÛuŸZûžó³4é§Ó`WT“åïxµ`3Õáð²ÃM·’(ÊåY^Àþ”žir6ÆNß7tEÚ¦78¤« „"±^_bQK=¥£XµÎ.Å]¦dšýÖ Rkáuà!wKž2øsW‚Æ*Ÿ¿ $¬®Ó’ý‚²­å{µ ‚o¿ÁRú±ù žö%—Œ¥@FñitFÛK¤x¯Ê/Oö &ÝÚ3\«°†Z÷#¥ðRi§ý½Œ/f€‰ZÊ%$XNømR~ÀF›lsš¯ù/¹Ùrš®?À&'Á^UË»af¿¯À ®t†}< $S¦ŸœØ k»_©¬ÚªŒÒwþ®–<’_sU„À>+§Ù•œß¸.¿ —Jˆ\®I,¤Q/-uÉ/$ i*|ªuÈ»¼‘Ug3&“tW…¬Ë<ˆéÊ|pKp‘êôþŽ1§,³Ö–ÕI~Ç+uÖFî°–MG.¿’-uŠJÝáï/ðŠŠ²ÃÇÈ=ªß$rǹËVÞØ.ÞLkkéÅì´ß %ÓƒÔ–ÕÇlï©8(íoé_É óÎzš‘ÂPÓ]³”tµ598éÿ“r1kéú]==4´Ñè´•4uŽUÎIM%ÉG ;d\‘PÔH:_G§F ²£ÅýOÔí‡éÆTÙñ%굓Ä_ÿ[êh×zŠû•˜Veë5åΣ$u¹6þH;ÆI¬c9%I×O[…&z´õkžïšävT s†a&€ÞŸ®’Ƥ(ôéú-N%Ÿp:Ø Ž*Jš³„ý2y‹¢ŽÓ”9G‚ˆ¨ƒH¨h Ì€*  (SÚ‘wãõs”ñµ:q•å˜~ä øÀŠ à€PÀè:(€:8@P½„*k„QÓÓCtÏz¤³Ÿ-ªIµqðgü‘G†ë³Nîì –Ó+Å t¬¼ò°È,W‘%n¼U)8ò0PÃEŪvEm*}"qI把×ÓòOÅOëV¾@­Þ  .S} ³”þP–¼,¢ž ¤½ôþäWh Ò¯%º¯”‹À}|×ò¤ñì™8á•æíòkŽ8;ò7:J¸ì \‹|ô:x pÖPB÷KÍU˜µä”ä×Õö»¯/Á¯8 ‘w[‹tnÅíj—Àï,;nó@U•—dXIå°%b4øfœbÒieZ¸ÝñÓ&VfžÚ»@]ßûOŒXŒ7vTÔ£|>@ý¸çÈB•¦!J;§ù ±•ª¬r·\ßð]'iábŠå»1óû)9U×Y'|„]¸¢´²XÍà=Ý* 5…žreEíßÎÕUw›Ç€îüøí¬a¢)NM¦½À³¬"ÆId ´Ú¤òÍ'iç#MË•E¥jžl,â$¦“UÈNÌÉÓÇH »“{8äÓ—ÕM]_ϽԒá]#”íU-mXª\]qY"Ãj±ÿJo•Ébš]gi;á¿ämý®€%šò¬}•ݹoÂ-^UøŠ£~z:I¦“ï¬ý5msþLÓrIqïð¦¤Û|2¼ÚþÖr—»àrߊàÃ#¦{„Vñöá„Ü¥yà*«–igþæ[©<ùÛ‹muϹ\²›º`-?`¯í„ZªWh•µã4Ê#ŽOeR\¯Ï¸p“4âß>¬¸øY3µóäY®¬>ï–îëIùå“iß"í6³\m_þy Óü€”Su}ìJù\„¯¾P ?dû é»ÈAýUà˜·ÏDé5åRM´©sfjÝþ±YËÁ]` ,[^ë€Ê»Áš»Ïiæüò$šjŸe¶­òRém;ÎæŸ4Ò3n³Œjù~á®—>@•m×¹3œÓèóîJ¬¾W>à*Ý>ÛJÖZrºiÎKêI¬_&SV¯/€-Z¥ÊÉ•‡ü «((Ónì‚5ç­ûvÍ^|‘ãJHÄÞ9`uÑÐsÌñ·ON5á#­Èé'(pUŽ 6±M¼ru„3AÛ}á^ .’/,6È£»R“ù"¸êã[j|`低´õ[TÞ :ÓÓŽÍ5õ>ÎZÚš™^¬·Ï¤$JÞŽŒýL®®û`z£é­gëÌrµ½¶.+¦tfØb~ç Êøc%FU G;èÃsÝÒ:ëê(i·àÔGç}f¬µ5ªÝž e4÷!V9­GÚíbÌ*î5S´egE&Ÿ uŒŽúz1G§KRB’bEÑQ‰Ç³¸ëjéý³uáž­/[këì¢ðŸϹÐÒ’¦¬ójú\\?`4 âé¢$+J¢( P‘€#€ ¨Y5%Q¯$WœšK³®§¤KBR’ú¨‘_+Z4ÎFª>02Ð( Ð rPPŽ @À€À)Y€^9i=ž–bäz9V²Í4ÿà‚>U–¾ª¼PS*š ¿p‹”þzŒu yâÊ–Ü&PIÝ·’¬qÀó‘Ž<kîç†L«l¢¬/bñû=ˇoöÕg´DÒ疸 ú`TÚtY<ý)5Ýj[så|ý­mîoiS§ðáb)'×e­ÉõÀ¿¿ù·UŽpL_ãþB'VÊ£M®‚¬©Zº¼ò—ã [KÉ–@+¦—îJ¤ÚþЋtéqÉ]5ÏÀ’ªÌ¼%œù.ê’¬€R±O¾|HÕß=Ý€©q‹uÖêXóAE‡ì7uÆrÉ6Õ iÒn€'U¿»¼Òµ@Fûxù*ÈBå5%ɨ«n•>( ZÇàÄ»ÅXÝ5yX4’«IkÉgé·i4ò¨+/êÃ%vÿb£r_½2nRŠ|5‚*ã/¿%oü—J±F­4š.¸Ãã\¯‚&¹ÊL[£MÛXL©>â5ù%SmvÀ©§O¾h©¦€&Ý6í®D•É6ßÇ»Fk…NûSŒT],‘FÕØU·äËu$×ÈF–SNó€¸çG«YE“ñðmµ~2j­$°¦ÛÊYÁ©Ò·`Ô÷_ÿ¡i»‹ç…çæ³îEôÕ;j€ÖìÛ¦EÏð"Òv–9e¥YwKMepawœ` jM·Õ†—ò“NJ¸à‰´­®p£õ:oÿ(6ëåÀTwYIÕ/º¯ Oíãä®V¿ó‹qxª»ÿ66Ûïm'Tüºî×9¬>HÚÂ^z(+] ]áVå×xе”Þj˜þ•îLI*ü›¼v»ü·Z°UHÔ-ØW<áðÞ 9mi{E$×»*Uúd)$ÒY´‘“t¹°ûJø^Pqk6Ç„øV+Y>Ý*N‡¼á¦ÞD“kÍ…{qÁZ¥ž@'Qùuþ@^*¹ fù +/¡/äÓ_S%¤ý€¶ß „fÛåe[®3äÏ 6pOŒÁr›iÜ®ëåñò²•ðÄ•U¶›²,ð€>}»2ïh XL¼ÀURJ‡ü9ì’JÇj9à oñF’}Py\•S_šÛ¬eØi´ÓXäç_þ*‘Ëè T—ÁZi´ª² ØN¸y®¸-?9·mZ&ÿ"’‹O¶Êùy­^/9+Êü…Eµò?À s¶è¶œ|ز¨cI?!É);x»O$m,P’uÂ5wà i¦—DT“ùI~; e{„µTYEnm0§++!¯ª¯¯)5•Œ]5à#/RnMBüš“ÅÉSÿ]9·Œ¾‰B-6›‹ RƒnT×MõnU•Ã(î’“x6Ú¼ð¿d]ÛÚ¯–*ÇD–0n-4ã.Ï~Ý$r”œýº÷1,¤Ö,éëjÚ¶ƒáºâ¿ 2äïŒyª`SmWeŠþß ÊÂÄ›Nû .msÁ1,>PŽ Ýå†ß3O8 *‹Ü©{™Kk{¹`j1wÝ«û¢éÛú¥Úï°3ýÍAe,QUuÂ&šª¤±òJ\þ( õUã£i7&—Ú€ÅÉ7Ù¤©Ò.=¹xüSi4– íF±ø=²{kðŠK-.bv—›%5rárb’xªÿ܉7Ÿüä*§µÚ¢¶¥ª „’|tùòFâ“Qï ©Ü–rÛW·ù7ÚY"§ÇÀ Vÿ¶’â×òn8o/²[o.€±t’äs–Ót¢þI»ß k-§}$𓿀Ërv“ä²Víb€J-.y#ò­?p/Oä[¾1ÏÈF_²•a…\~ÿ¹¬óARºü¢—±å’)¿—ÈVå%ÇKùa=‘syöòȃŒ”ç÷Ë?œ÷9KÆQç‚ý=Óþæ8’Ý™> ôµ-Š× õèÃwÔø;GîÌN;¢ÒÁc.?¦×,:HÐá%“,Ê”T» K'§GM­4Òç!RP¶øJÙð}_¨zš­óf¿ó¹æí˜iÇk“¯'hƺ ÓTbíÊo!07 Jvz!¨š¢yG¶.ÀÜ'µž˜»Ba«EG)*fXV¡#RW‰µ†mm!=H?¦n¼3¬}S_|(#Rýv¥%ÁàÖô“ÓjjR¶Ê¯6£šœ§¤Îš‘Ùé£̰0ç»õ5 éˆôúMj·'ˆ+ íé–íÚû™é@P(`0,#“ä•FoCQÁJ‰ >f»¶p5QòdªMx!•P((€PØP 8ôQ@@t P¢ž¯G nMZ@{I,‘:’H‚¼õȽ­wØ×ÒÚçf(¤óÃ4°öçºðOŸÉEöì_±®¸Á-]øÁE}ºÁm4’ð‹n^ '}ð_ÀM®Ve¢§…„¬Sè[¥|´Ûü¤–]bëà/Ù€ò//WmsŸmØo/´óf©´ú¯ä Ž‹$×9ø¶±ÕS|pÝÒ|dRuïÈÈnK®»›wüg€ ÝZÎZ_œ /2»ã‘n/mZ}€]_8 “ý€wüÕWž½ùÿô5ç %„ÿ$åõ@WÎzÕR°„Rµše‹µå ¦9K-ÝØ ]_|‹µî Ýt/o-8…8L»“{i„ý¿ùÀ½Î¤“] 3±>Šñà.\eÀŽ›x|i#WIÈa¦ÓR[_àᱩ´ÎœÖ:í¾ø#¥IrÍ26ïã’öÝ{•†ï£W›¾y`2¼>¾E/»‹¸´GjÞ)€Âã%еŒ{‰&­÷ÉxI_„HáäËŠi&À´¾Û´Ã[c—u&*¢ª»’Û¶O+( ‰VÉ$Å5]Åa“Ž~´­4º.nÇx8nâTÔ[]¾>@²Î[çÛ×ò>ÞiŠ·xÈöºTQ©%ÚºÂ,\»»£Mªwy*štù%s|„¶Ýyúrû°¢åæ¯×v—µ‰ºWýÙh¹”œV6”·aa7cŽ1Wù ŽšúpÑv§ü€’N×YÂã(ëá_bÒTü8x}`W^ *»ø+§WÐóŽJ©W.ùnÚy¥aôñ—¬ÅbYì®m%_!¾HßiVpºçÿ,ºo´ì2뜕S•5AG«D}Ò ß*¬*eÇ„Mv¶šÏA§Ëwì$ŸÜ³B-'åd"ºM?%tò³\PVkêöç$¶¢³„6©7~6¸U€ 24×`ZÍxÉ1|V3vJKrK»Ý&ü¢+Œn¿UWÍð+ߎ@ËÃòÍ%ô¥àªùøïÿH /ù%f–l Àí%ØÕyè:Â]rKÉš¦•€½¯Míø6“m–Òà ¹6í.HÕ7—kø ™çÀwØÛÅ5’èé¹eðø'W"òöB4ÒYgj\'…Ë9:œº-âÿb*Ý`«ßä¨ÎíÒãÿ:,幤¾T䢾Ø‘ }.^p€Ë:éÖ¦·þ?òEbzÛõ%.¸CSI%©Ok‚úxËIšåžžµƒÝ þ„¼«£2Þ ŒOƒŒžMr3FUh?*¥m#èAmŠ^ Qàþ­¬¡¤ ¹‘ð'–Ù¯Åsi³.-QDÒ°#x3@cQ&av–2q`z4§úG¶}È4™èÑŸL£± ‰%g)*bî fHÊ´XJÍ)Y'©8pî>G©(Ò¤¥lÇ®yKý¨m~žžœ_ÿ“:Jôý/þ©²F”6AGÂ:€@“¶fˆ«Co`yŸ¢–¤›ºV%è! ¹äÓ/ÎúˆÔïÉÄËQ¢€ B€ (ò"¢€€ @ •³èhÁÃM.Ú(ß9£^"«Ï’»|tÝôZ¥þQA¬ù*YÉmKž²\ /~äIðÀ©_%’nëPIÇœà±UÏ$µŽÞ=Ê+EKðZÊôü^_ʲ_ö OÂ-ÒòÃöHýíÞ?à G>êɜߥôüä’Mñ†ŠÚ¼¯ï+æ‚ sDâI¼ÐVš_‘N’`)I¬²$ê4ò°M¾¸§eTØ)ä¯êI×MÕõG)†©{ªçصiá[Âò¸%í¯€­F·[é 8´ï §|²Õ·†Õ‹Ã°–éE‹oŠ Ð ì)U5ä“áñä,~5ÛIöJÂÏ *Jxãºg9¦›o„Më9Vn3·j²m«Ã»²_UÃä)õ^†×»²uVGAg'D-€³M-E_Ü»,©\žë®=Šºš:¹’JïðÑwaRÈ¥¹xx4Ô~¤‚3ÛOði?à+6îšàZ‹TíØv«µœû3ÂÊòX]ÿÈ6ÖsERX¿fŸ+É[Œ¤ÞoÀ ZJÚ¥ƒ-&ÝÇ7ËI%ÂI¼Ãj=yðiõâÊÝ« #Ý,ݬ’Uç( ð­ñvV“ù@NÒ¼‚Sqv겊n¶®{+j-¨¤ÀÌVZtßLµ+L ¦ñgNr•ö×#É®¸#Nr‹Kr¬Ð”–‚ß¿½ #ú•?" áñYþ­SOÀµÍt-7»ÏòæOŽÀUý>süå,ãÿ`'Õö¬?%ÚÓjì[›OœšÊì °³Á]á¥ä*x|< ø¥Ë%þ«&X§û—)ÐA=ÊÚö ¥áI,rDÜ¢Ýc²Ö0)µ~×ù Ò½´ÌÓr»¬qxâÊ×Õü?ÜJß!/üöU:]2Ãsí_€3R¥Mx ¼ ƒO¥idÌÞiað¤òãVÖLɧôû¬ójŸðe?=0¥·‚ÉWÅà¿tÒ] %Uû„ë|ZÇø/_¸íx¢ZK-/9òHã,J•ãÜËËþ%yçËY<÷Èé¶V%Ž˜¥+®À‘øÍ~Ä|Òæ€©ZC)W`D’ÊY>€Ê»»²ïxþ@ç×9V½€çµÎJ+òzôãIQ϶øwŠÚ¯·Àn©uÙŠé¿§<È©¦ý‘Níù-ý-ùuø(EÔ\ŸÈÓæSÚ±òEHÞÚí–O;WX¹lÓoÆѧ£ékûš¯&ƒúÒñ“¦¶¦v®^Q†¶8éÿt¹=PTòÇM#èh&´ã|Ñ·:Û`¨ç¨ú83C°ˆ£d^H:zu»WÙÞ GÂþ©9jkÊ¢ÚXT|×·öHÕXÕ8¯¶WðaÆOûeûUQ¢J’› yÁgBn]ÒQK’>žårxð£CÓ¨Ïzá.NêVéÖ1ÆM&ÓÓ nF¬°[³2…„qi¦X:a[Ÿ“6c*:) 4ü˜š¸´4¾ßEÎPŒ¹“¶uÕõUý«ü#:ººš’AÔ^ =úwµ_&è€@F@’t€ÁR"¶‘km,³zmÛ’´nFm~kÔFá~!†Ä€  !@(ìèÐ;@E+ € ((ïétܧu…“ÞŸðUÿp¸`VÓËéJÓ¯8J7>«WÍ€®ˆ¾ådT[¯M§ƒå«Ï%ú­mü”iKÈo4ðŸ) ñØŠo$»~Ý€§ÍšË~ÖZ¬ Ie•-éÓ¬šÙ÷Õrбj¯F©ãV>ÖÕ×É–²üªÚ©Ý2. *n»VŠÛ´ª“é;¼…›] .¶ê‚wÎ:þ@Š^ÕžCMax›Õ·ÞýÍuû…/óaâ’`WŠÿô*¤ù`MÖÚ¬[3;¬« >[ö ·@\%€–_”Ræƒûnè š³K/o€0ípiJþ—ùšWã‚»rö|éö_Š@Wqxü-ÏÅ…%–—áQÅ? "°êðFÚãøŽNž-Þ ¢å[m_‘n,uŒT~M­×I0P±tšÞ¯´añºŽ’¹Ø$¾ì§Ù7$öµNìÒ5(îi'l7œp—ýÅv[­²fò€«¦ß(EÚjK>@/¦½…\¸ÒŠ»Oº2ŸÈUir™ʧÎ.9ö4×~à3KÀJ±åà©ðÒi™Vã*礵»ªã°¨Üko&U©'w`U”’t®‘r±vÜãÍÝ•W– ê¯í.Wl îwo‡öîâ€Õá>)E/Ž¿p+qK/ØÊû¹ã€5²Úé‘Ô_ÓÖB%&þx Z^ΘSšl©ãÙ '·K"Òjí¿òw'XÉ……쌕USMdÔqv–í¥u_À•ËwðÞë—þ`¼?üðÆÖ›Á$²Úù@´ëø‰¹:µÇýÀ%m®<©)€k÷'÷nð€®5‡Ïø#mRMZþ@:êóFVUT,t9y_ù@Ov[Ož]bû êöÀTÍòù–pŶ¶ßÀÓnŒ¾7/ÊJ–I7¶þÐ$5?R;¶×°–å4—y`#+u*ðiÓ^á i´MÝÕ'€5QM:©<‡Icàa»ÁjWå…i5ºÝ¿%J×ø«4Fÿ»9[“Å> iµÐD¼7Y5H+T¥Â¦ÈÚÚÕ]-¥ç¢&ÜŸ°Ë~PX}*Û\–šã+š7iÚÉÝÇË’”¯ ØÚt±«½’R§‡`D—ÇÓmÓªé£{åt¼e-ÎêŽvýºIô€ËH° Ó,–åiþ sRÇ8êTšŸ,Òæ_'G6àä–xè‰S¾˜kžý‚n³ÖªWšÇ"“–õ<Çà;rÊÈKsivDÓ§ÃY]¬Qœ¥Ç4•ñUì0ûRú–tª»¤K/¦ï.ð"¢êâ‹%õ6žAß] &ûÿ¸RÕqLËnîÕ&©.?ñ‘Ëv.€Ó]ç+rIí†î;¨ø¢ÊœmÉÝ™;M%‚ÉT¼&ßä"e<¬Ì(ÒjÛâÿÉR«O+7àŽ–[ÇM"K¥Š°5o¯ª„’µY͆³ŒXµâ]€…ÛOŽ2ZN¶ß»aîŠk‚],÷€+±•Îj™Bð¹ä¯ŒvE:wÕ™û¯à¨7|¼ 4ú² šÓù#«íOÉSj©}@MÉgÜ‘¯l~UÊß„ÝPîéátE'¶ûjÀ<¼*Évóð¥ß(Kêã®V]>ÔRÍ'š êÛËaEN6N8ü +¾ÒM™iù°‘»|äyj­ÙV>XB’à””“²ò½Ã¬ÖB£Ï¼ç6¨¸üÙœ·ÆÕ;µÇ?“/› /ø3n—]€k 6…RO J‰vjOx4⹺ ;3,ðx9ÎMá.pˆ=:k¤vJ­yÁÆ»EíñÉ#äŠÜ<šj¹è Uå—™ Y+qŽI'L~#›•¹W!ö«÷#MËèz~é³PÕæ7O’²Êå.‘ÇÔ·©«ß×,ôõhAE#Ñmc•{½<R;2²Ë3©*Â,¤ðry €,°[¦—DÔ©rxÿ¨z•¦–šË\•d|Éú‰ÎÔpŽ.3•¶Û~çºv“dšÁËR-Y†åOO©úZ´ø‘ô¡Ê³¯.O·Æ×ÿæI{³·úHíÄžê/W<öâë9èúH)è¯ÔÎï'-iCNn•E—kXëéã)ÃtS”_ ôi©)fÍ2éú:¬!8ðû(ÄÕ3p•z#-È¥D²4¥òs’µ»=€JŠA &QÏwÔzSº~@  @ @ ÍÖ £5ZHÒ@SœåϱbÒøóKZ·Uü’^¡î[qyË…éóŒÎ;“Ló=/¢âÚ!€@   |¤è;°x*Pö¶*ežÿK§¶YeénUû‹ÓÃDþì>@{þåIß°'¿Àþæ¼6Õd²¤UÏhsÑEOù4šq|ü*>rX{ü[©SòJékø_@·|²¥x\€x¼rUÃÈJ·*tëÁ$ª×ìSü‹®@+“䵄ÚÈ ¼$Êtûì ¾ä_È 6—838n‚ÏH*Œ¦þ”ëÉê‚Ù¹ 4›Å®‘Zxiª÷rÓäÕ€]¦ªø#ë8¾@Ò¶—±k ªÈ ió‚g¸ì#IÓÁ:K‡aVÿ~ RNÀFÔ¯¯¾•ôÝ-¬¬>Í&›·ËsïA­¯/ŽH*l(’u×h¹yAºIõt>¬çà JíÅ·P!V:ÃMBß,ÙÊÝt“D À S,’ÛŒ#|Öz‚úªú¥‡Çø6Âl’V¥úžS#qoú@ªQvù\rV×üæW%öðßþœ³*SMpÛkØ&·ç‛^ëo%iE(Ýõ€ æß½Î¸— jšË«h6ê×<€¸«t¸ø*RŠ”å€1k1¹c{qò[¥oÁõUÛ Õ=¿’M;´ú¦€Ë·”ºïÁ¥”l*qÿ¯ª¼%Dt¤Ÿ4ŠºWV©û“I¾» Fø¼“-$âñ@R|veF¤åÊè §&²²ˆóRO/ü€M[T¯8©;¼5†SŽM^œÔqÞ@Ÿt·p×ÿ ¹<<×i«ûqo'7:’A[·mcö2þ¥ÿž;¬åv3¿êT¸EF¥<ñŠF?»œV“Êw‚wžRêë›É9_`TÔ}Þ(”’Ç KÜ¿j5oÎ /Ø›Zm§Ÿý‚³ÆÏA.X¾C§‡Å[K”Fén|0¦/vMÍ5†ë“rÅd‰+oà)K ¬³utVùT¼nísÑQ¤éRø#Oªç.•UÕ†÷<à*y§ø%Òh ÓI'ׂ6Ô²­ä³ø"jIÖ;A¢Õ/(+.üc¢â6›ìêN8d¥~ôj׈š°*m+Å–ñÿGÃ3iÊûö-[}tWþÄr¬r€]®92©gòZL’µ•@s—yɽ¤·>Ìwã\úõ7Vü#­­4¯îg'X©á/bÉæ ÚÄ+§~ô„$¿RRðº‹ö_ä©íÓ„¿¢+‹ÉÊnö§ýÎÙ+P‹ãÞHÖœ¯Õç µ}V—ë\íÜhç飳r^rZË´’ý8èÆU|³¬#%¶(éËŸO\ÑWGHç]âª!„s™ÌÐç'Fz²*/,ÔWdnÝà£ÉýJ{t ¯–Û<>µ òÌ÷ã|»]’»8¶U, $ú ã¬’ŠÆNž…ÿÓqo)›äïNj֯úÚŸ,é¶/wö¬íÎ<Þ¡V¬«ÉÉð?ÑÝÿFOÿIóZݨ¢¹m#­ñúu¥áQ(éFŒKØ ½ÍpeCqx–Àm!E ¤JÉ ¤¤üèd#B0!@…@TMIÒ¥È#‰¤Em#x>©“œð8õžüpP—†kôåþÖz6<ù^y·ŸÔCûŽ!` €!@… €€€€@²h¬€è €¤ì ?tІéŸIRJ¹à¢îÍt:R²ºJÑÞEf8yÓh[»ýÂNù ¯²»\^ÞÂ@9Yå—ÙV^F,ìpT“N 8Ï‚¿ÚÀ‰+ö.xã÷'  iãº&®×jIaßµVï¿¥ãýÆçmPF£+ã…’â²úÿ¬´ÛTZx¦M§_~8±Š„^^Æ­v¸ ÍîŠk*Ë_K[±à%Jé$åø`LåuÉZúZj³€.ÖàIa_È®ÓxòOfò¦è­R¯ä r¦o 'œ:V­Ã}•ÝàžqÅ~áZ^B&êã–IK„Ö@»÷K í¤ê’¬…e}­7žŠúÈE„\¼#ªJ*‘Ž«§1Ha °%€v B¸ËiPxÊàÖê…¸àé¬îTßžEÛÎUU2£”¢ª¿cqýKM+1œw핦ði%¹\°:Ž0×g]= êÇrqKŽ £oÒËu©Çö2ý,ùÝr|— ziñqÚÈý.¤UE¦º#~ŸY7µ*l~–ªIm·äºbKOQ¼EÒ"†¥}­?q©‹¶{špojoû$4Ä©'N/ö"Y¨©dºb¹tÓXð9㎻“m^y£-/5š¶w‹|ºÇ‚©Wn“¶/ü²ááþ=ÀNI¥†šNŒ·Ou~+SíYSJéUæ¿%SϽIG(Š•Œ¼Q™IEûmqоŸäÄw5Žd £õ&×Ô¹ go ?¹§†ñü•¼.8<Õ>¿›YþB¢Ü“k•V]±¸ûvÛ´ë<Š]g€'Ó-¹¢8ÛYÍ` é«VúT¿MÊ”T2ûWìjí¯’Sdž‚%¼µ—ÐÝçÈh‰5)_†Ê ÛIüœÿɱ]Ø•mw‚çnyg8øqµ_QÚMW±oòï<¥F^{\ªëàªÓ¸Bc„Hºë{¢¬ªn¼GiÒá•e4ÿEIà™júË}Ýã!ð^pŒ¸}W_€ª&ë!á/p2§xx+¬|äÖ-.Úu@e^,±QoŸ°ÕUqQWvÚöãîð¥~€&ÖóŠ$“MeÐû]`Íâ»ð±f€#Ã]‡Àd®J¹g£—K…ƒŸnœ:]i»1¬ßêÆ>͸ԟ#uëû*@®â–b ¸7y`nNÝy’CR_B÷a :üEÿ½é’µ?tðÙa‡yléÓ[”×tyt¾;¬òTkRß5“¾…¹$Α˧½ ªŽ®n£9jrslÐç&e²*Å[7'@sYv(õ8KVP‚áDóEFÚÝ%„síÓ“õ#·O6ñbòivDqÔi§dôM-yGʳ|¯^<þ·ÿ©ÿäÍÁ/Ó‹|Ò£}¹ÇŸÔºÕ—ÉÂ?\”|“ð} _§EþÇ—Ðéþ§¯Òþ«3Ï…~’HÃGV«Gaà,j,Ñ•¤€ÔPÁh¨4e¢‰ìtФA €€5@$ÔUžvíØª¨ÜH6‘Z*9êpsŒð‹.6¡µº˜üà2¬Î7£RkÁ €)(P @(( 0 ¬Ÿ¸@!Ð*VÊ=š{cmdê¤ÐV²Ÿ€°×€5¹²§ž, ªéWemµÈÓŠ¼0¸yì‚ÞR¬pi?)7lsÇ€ºMòÀn¼•W/ -&K§@[úCþa¡/»ä ²’3vø¼Ók$TûͶ¿l—”ÒÀö¦Ú´Ãi4ü€¤î¼: }XÊð±wÆ/À““ü¢VyÈKdÎoòŠÚŸƒIRwž€8Þ×_ŠÚ}‡ö»­»¯6-%Þ@$’¸’´ßž‰wx?iéÿÆ3YN¥\ÿƒ 8ª`´’v¸ì š\ù§žmÆ{"[¹YAÊégÁ—õ?v­É¬=¼†šYfmjG@st KȱŒ§-±VÏv‡¦Ž–eõOüæ~³ÕcÖzw_«Ê’fyT¤{¢K rM¯Ø.zå 3Îk³2uÞšyÔ¿ÉÚ89uë§>•ÁpMW~¥ü£ ‰Ü£ÿˆËþ¤Ÿ¿üt“ÄüY7…òˆ:'õ/ÿ&ÌêKé‡ÀEÔxŸ½# æE¿¯â&µe³OMÿê¡ íéµ/RIg†goÖ£îT]Gz²GOüc•õ킳´0ÕÝtˆ8MäæÍ 3&U×N5“vÊ"Â*YËêê´ºÁó½Bÿ©K„réÛ†)Å3g6ÛŽ²\£_­˜ç«8˃ GÔGߡ׎^»£SäÎŽ¼kQ;]£§S\c†¶®ù¹y•nõð™¾+Ûê±¥å“ú,¿¨9u¶9ðé÷¤Œ¨Û:°²‚Ú߃ÆÛm’¬XÙ¾Œª£H :i¢£ªF¨¨’ ©“D€@F„2H›êØyÍÉû«Hé6ŠTxýTêtŸjKýÌÍ­ã_©/,Ÿ©/&tÇÊFC†¼1¹yÈS@B€ /@B€è @Ð*\ö”£Qð}éßÒµ½T·%QYlÖ}j=~£CTá†F­7oÃFúö(¯Çà•i „û*»YÞJ×5äz*å{0' ÞèÕ«ÂÀÛë ÓI:_ :]‰7„ùÝ´Š£Xè k°±‘ÐÞ3Æ Yä U†s`ù }@m×(™R^àY>_Lü -Ry1©¹¾€ÛY²Òã‡Å{rÍ$š¯Lþ_Õ™ÂRjnWåðXékF_N¢Qív8jCÔ~µéÍ~Ÿi…kfµ­º©.Ó&»×‚Œ´ï(#kQR»LÆ®®¦šRÓ†ø÷ì嬔–ZWFt}BÕÓzŠ-W@#¯+Û$½Î‰©+Ã.ŒÏJ‹[R¾Ï#=¯ &ù¬ØªKfy|’“W|*+)oŠògS+ <_Ç’c;WþáW+¿6ªïžÀ®5M|3-´’yH"á|‘r­ô‚¥.à ¥V²û*&äÖV ˜Þ0EDÜ“þµ%û´¾’5,æÓ Ë“MþPm]€Y—5f–=Ò ËmV> T•óØFSJÓžp“|öÄ’–mìNñÙį÷ª·Á]7åp)Ô¸.Ö–óÕôD²Ò ¼$ˆ²ýÀ­µnú2ùtí€ÜꚇݬS¿,µDmÒUÀnMf×ø$±TUwä>0ºFRW|„X¦ÒM•*x ÍÓ2ó›ËfªÉ,¶rULå:Z?Ý#qyçÉǯ]g‹t¡ãÿrOÿîd½Ì¶Ê–cøÿ%ãQûËþ Ž—iøÑ4ÿÃD$¾Y\B?]F­þ Iýÿ•¨·ÿQüµ—¦ÏöÙbW›Òjÿ×»æ'»OêÕr|$?QÏIîÕ“|Y鎦Ù/Xã^ý,«]â°ÙN%.Œ7‚« Ø‚¶I}*ŽrMrJ×¹bêÛë |ùÊÝöÙå‹Ý6ë–qéÛŸvG³›Ó®L¬®RŠRª0ôÓû]·79mYg«Óú))ÇRrã4tæ9÷^?êÿq?“ÆÛ:W8ËÉêô1ÿ¨ß„sëÅwõ1^êÿö~üíOuωÓëȈêËŸªžÍ\³À§œŠ±Ö,èž *” "NúqÁR»$P£ž ª@*‚ @  QÏ[WˆGòäTe[‰Ò%AºM¾Š>n¬·I³çÓqAÌVI&²AãÔ†ÙQ€ "‹ € : P P €ÀE‚¡ÀÐP)Q`é¦þ¥gë¡jÂ^Ÿb­Ü/ß þºRô¶¿_M}Kî^Qð½F–×¾?k9F«Ö/uNÝd'T©`,:¼2¹É¿ª“¥‚‡NÞB}0g–j×`æ†0üqE«È™$¼Y§”Ú| "Íø-¾DIÕ6½‹•‡\XQ&û–¬ ×€£T«Gõ:üc?øÀ+¯Å¡×Ê'KŒ–®«Ž@%xà©§Ø挷„뀚ø5KÎqT°9wo UÎ91¾q•8©Eá{ið³ÁSËaHÊë¬äV)>€uÙi¬K/å ©[»°ic¾ *iä {TS4¤š®Àû+$³‹±¸þ(‘{žy\…_¹oýÝ„D¨´­c'árvI. u[æ)L6…dì @=:•ê5)â><ž©Î:KlVzHëÌcÔÓÒsÿ©¯ÏŽ‘u5¯é‡Kíf³£=ŽŸ ï©êÁÆ\1bGÉÖÓ–ŒÜ%ø~L[ÁÔ]iò¿c§5Ž“Âá•ÆM2›²‘9Ï”®Ïg¢x’1Ó\½E0Ð(X÷€, Iò‘ixH ½8K˜þÂpÓ_J )Ç_OrܹEæ³^xç4—®6»Ê:0pÓöýÈÛWîÊ,£k(ËYç++Ü€ºÝ݈¬I»i:9$©gä7Çä Œ[âËir±Êb^þãz¬.9ö4øïUJúòR¥€žÄ¯4ÆåÃ÷±Uk†Q9kf°ºÿÊ ÌZX¬Œ½É` œcòU–”jß8ýÌI¿ÂÈ O#Šý€BÒkª«3/~.šáOŒPU†±aW!o(éÓªÃüò“A³*ýÈ­]~«Œå„òšTµŒro‡ž€,UáöIeW@<§TGYè {w?p³Vuyò„|KRø%.°n™—/à*Õ*ìÅy怙¬òg ð[혛^ºOè%…ßîq¾ºÏþÅíf¤¾¥/92Û6ëÞµ”ÿ!ŠÊ^åªÔ¯ªú¤MXÿÓü‰«I™å¼r¨•a_R~Ôtq–¦Œáõ>+Í¥¡©éä¿QSlöÂTœW2eEÓU»±Éô=#½4zâðnxÅ1&XŽ3Y9É…dÞ’Ë}'+vIJãL¢'ÁŸQôhMûPYëåORJÆ–cÁï]ÿM/©d0Äô×Gé5Ñ+r¹µøg}PÓÛ©øeæý§S_3ÕÏ~¬åæLó®_õ±õÿ¡Co¢Rÿsl¼§Ot³“1äêÃÇýCZqŒ]µ†y3ÓQÚ ò í{™VÂe¬³×¥%uhËF‘j‘Áå§Á ª€@ €@ „“I[‹›>]’«i¢ Ž‘(Ú9z™mÒ®ÙHð;l$s­­ d,Xõ´÷GÝF©@U@ €)¨ ¨P ¤€!QP( A RC›>‡ôÿW/O¬¤™Ó‹øÍ~·ÓëCÔè©Ç)¬£åúÿJ´fñÿJÃ9Y—|]7§7f2Ú죣wMPº¤òjåÎ J€œ6U„€–®Ÿ“®Pã«BÓø«é–­®¬meRMÚÁªÃšÂ]r<з¾rïØ j?¦“x9ÆMc÷Ñöûyò•’r—³ßLG)û`"q¾Ôm/¹ÐÆ? ®ß¹cöÓâ Àn˜Kmgÿ,Õܯ@e¿«Á©,'wJÂ#XÊȒͬ0ßK %†„ä£ñÛ¥| æ€}W($¯¹©d­Ò¿Ü)‡Œ|€k•äWŽh »öãv•t´¾l°ƒnß·“]RIR-œÛ,@ Km¨¥mô{t=*‡Õ©™xðo˜ÏUèu(º–x9éAi®\¤ùlê‘Õ;Tøg EÆ[_àŒT=2rTúàTgÕh-m<}˃å5M§Ê9XëÍBhàXÔ%Ó,©NíÞ?îKi;|+GW4¼ûpeáy 0ßÌõúõKàÏMröƒ›@(X € …€(@€B@‚.®žÉÝ}<™[¿±Í+‹^ÿ%ã/Ü wOýÆW8^F›[T{¬þÄÚíT“¾Š"K Y£J)§·Ž€ÌÓk äÌ^ëmb°@tÓ¬]ŠTí?pË\‡jT—¿Às¼,í]ôR¦ßTq¼s`móò9•_@#MÞo‚»ú}À5ŠO‚R¥øÀ6ï‹k¼ù,·?@—Ê\µd|c  ᲨÕü….»à–÷WòÛUÅ…š·€3M'òi¬û0‰ã!¿Ü)“=¶˜I9SxTñÀ4¹ã‘yÊ»_ÓKfo ß‘M°†6â4Håç®§üä;¿! x®HñÈTjñt¼˜’¥M÷ÈUµ%ÑÊ|c°5¤ª(Úû½¬ã}vž7Û^.£ñ-.?Q|“Qԗìkõ_ÊÿNç'òjð½èMý {…fTãÿó4s]|Ыê¾Nšôu—‰+­éjGYKN|Ç ZñWxé¿é¡fŽÓÇ*÷z‡ ö§F£±ViµZG²U'K¨bÌØ?V·il}°³×ÌÕÑÙ÷7šFô›G ë¿ãµ§ÉR¯€Èë“Io~Àc[B¹áÕ†×]¸ñkèìnIá³Îβë—S*Áy>‡¡Ñ~]™ëÄ/©–é7埥þ§ú~“J UEY¾Yéèqú[8j=r/“ê¡:“·É”îŒÖ£¼#¾›2®…@i7¤®h÷i¢ÆkM²hsÕ—F O Ê…@ € 0 ÊJ*Ï<¦äÅXËt‹dm@Z7£G—ÕNç^ ±çä¦+A@ù Û Ñç×Ó§¹/’( ¤ ( P½€€ @ TRT/d`Pö ’V–Ží&ÿ¹ðsWá–\£ìÿGþ¡ú:ŠCäý¤!ê4\^c$kúOÔçþ>ªôî2zR_T~×å>K99©N¼›ù(©×+À ¿ù+Êk°¯k_ÝှR/@xäÒ\Ø *æ¬ òðw\šú•/“¦.€6š¯ ÊÃRWfa}€ßX3)8ºü_/5ìÝUØDR]£Ið¯EÏÈ\4úT-T׺7§{~¥î¹Ïð.O¯*‹ª\Û2ɧÅ\7•Ûj °£¥Ï*‹Šä!m¼þM7߸V_ÇD{­xy¬Úk<¢´š§^´•.˜t—à žo´*©÷Ð e0êóØ­«‹LZKŸÜ²íxà©ÚÆPD¶¢ÚY uSç ­ÇN›”²üvërËA@EkONzÒ¨/—à²jZ÷èèÃEc2í"å.Þ9×9;KV1¥Ä—ü•{5w’Ê;ãî¸ SOI¼Èêå5œ¿l¤&§ìy}w¦Ü¿V +”»%OªðrÈÎN  §¹S3jûµÑÓšÇQq,'VfwœÚ4Ë’W_àôú'ÿSåé®^òœÚ@@Q@H@ @™Ç|Z<ÍI¼ZÒÊ_“¤*²p¾»~4ú*o Ëp†ã®Í¥jk'—_G ,|íT²™áœjëÉ®NØ¿§ÖÑ[=?DtÄxaÔõ0‡™$~² •xGHçSQÔhùßÔµj*åó%&û³zVÕëo\U ©uTT·¦W+=±X5ªÙ#(ÉÒkà¢jé)+\œWÒ 2S*„ ° Ì¥µçÔ•™Fj¤²ëÁ¸´i"Šnn¬óN”Ý•Qi¸§ÀÙÙÀ€$• <šº{g2AUQ(€)9¶@*÷ X  €Rv)@B€ MiGt’,A*Q®QË_M5¾+=ËNn2Y?KýשÇôuz:ÿ·,ù^ÿ]é–¾ÇïŽS>©Òµ½*kGžFnv;(Ó}Uù¾9NïÉxø`ZOÚò_Üßd‹óð¢•Ý‘árRqç(E·}¤þŸu×Xoݰ#Í•U_ WÉSÆ9y2Ö]þ/(4»@J¾xã°­,¯s-¾y° b» Xã+}²«åÝþHñx텤˻|m_+ê-[ü€MxÍßð[¶¨S¾±þ—¾X²š#§ÿ VÿsR°:pš«\šiÕ¶YY&;–z÷;J¼ M¸µÿ°Q/µþ>Kö˼„ß%\òt„k“=Vù“³›kÐLè,ÚžZ¹—Óò{RŽ”vÅR]#·1ÎÝgCWõ5Ç{å]¬¥b1rmÉý/ìsÌ$ôúæ"·T[ic’µZý[…£)-X8·wËðLÆ Ü'±ýËùG¦2Myªù¾·ÓþŒ÷ÇìÁæ8Öâ(, f¢ÓÏ÷"Ê–&³FZúy£«›1JRo³§¤mkFü´bµHhE@@Q`@P€[>¢nèõÉyõ+…î\`]ÒÉÑÍvçã‚Vnù°-·ÏF\–ÿúKU†Ý®?!fN¹§•oä‰%m¿‚*%MÛ ÓIðÒ*1Îx¾G<,®@›S—äœe÷ÉQÝ›ÿô¢ýÉF]—‰»y‡×œ€~ý¬µ¼r¬£:‹ [VÕaj5¶™™F°­Ü¾oÉ–“xì ”TkŠ"ë8ð%÷¦°/®è)5\ô[µU€"¦ŸiðD®Wòj¢óصw•ÐVŸãðJ¤êÀÊ•ß,¼¯¤"ò¿äÊ~S ÕýI·å/9JÕ×uUî8W⃊¥îžŽ×»"šñÿêo"ïðÝøFuÏbIÛ³K¬ØMÿÓFßöœo®ÓÂþ¿Çü–ò×›FUˆËéOຯíù :éʵ"ûq U­$ÿÝþJ„>©:”½Õ€»Žªø‘†î3_ ‹nÛ~QÓÒO~ŽÉr°¹=%«¥{~¸3Z2ª*:^oɽ7z‰ž9׿Ӻšø=Éý(éêIœe+ÁF–>¦SNš@g}¬aZÑNÏ$õ¦£~Yž¼k—=XnI§Má7M3…vž=:mË/ðwŽšy,bºVÒÉ}%#4×,ƪscæú¸mèùÓM¦o“·8«œcåÑõue³ÓIyÀëØÄrþ—?êmñgéº:rç\5d|]=ÚÒ® 3Š’¦y54ÜlH B (E0 ä ŠBŠ)Ùìô°Kê‘QÝb©ðkª<šÚ{®¿M®ôæšy7üïÚW뿦úÅê´U¿­,œ¨új­kûÑŽ¦\Y÷_Kd­f,äžÙZt»,°¼ÐµÐ§vãä'ß`eðrëÀ9ÇäV8è F±}ˆÚ@Xå5à‹7`1×e|W( *i»ã’$¶ºý€Eðø,{;Mÿ¶—AUv½‹I¾pW~{“@8jŸ ‘|Z¼´ÿ%Ž-7ÒÛÂ¥DxÍáôµM'’¬É¯`#ióäV=€? ⪊ڤš¾©bÓ,o v¬¦Öß_RN²ÊÏ<`ÒÃ~ᕟ’(Ü—i…jºxÁ[¥V”Uû`Ùü{e*WÛËØ ÂI!^@é§ ‘K³vrµÒC E,  9t²ÙëÐô©Tµyê&ùŒõ]õu?N^ȾŸtãºJšgVRŒEPù2ËŽOMìäåîÓQrúÖbRz×ên¼>÷,y|>ŠÕ­íUUƒ–tõ),0ÃzßÑû£”ÌCYZiR|ûçÜvœc©²ÊgÉ×Ò–ŒÜ_3ŸQys!ͰX *Æ@Û[Õ§O³›Í³¬s¬)%4¿MZËÿÈÍXú}Ì4 @), `(€,)  €£Ï©ìêŒE7±®Ž±Î‰}/ž6=ØTŸ»Ã¬{¯Ø£);~nç§<€v“$½³Ïî<‘§É¬õi\“ –×àè||…IÿÀ‹Ë|0Þwu„ãŒxX|е|Ù+o`&ü?r¦ÓÎ@·o?µŒ®PÆLÒ¦¯!Ê›"¿í fðòÎÑŠY¬™êµÌPsm@F¡ jKl²É©kÝ£¡|ËË:Ó|ºGi1ͨénƒSáôenýK¼%M JéòNB//Ó‹ÕÝ|dA­‹{Ÿlל…,Ìá¾ Œi·{2ë²J õ.=¬•¨èçnÔ’Hù¾§Ô=yñQ\û­ràm–@(ä^׃RVÓÁ®k=GŸQ=«ÚVu‹­K÷F«1õ9¶((‚ °@€ …(€€@PP@Ô‚œkö<ËKUqüæ±ÐäÔr¥(;m+4Ê+ÛÝ‹²&•*ºÉAIÚÅÃ-7ÅtÒ-){¼Œ{¦¬ªYìWÕwŽæ5ÕªJðEKV=ÊšnÞ0j¹æßì+¾‚#¸årI\Uâ¼V£Ïa*{¸FUÕûØItùtn™¸ÊV¨vÕe,VÚÇÈVr¹Ì«©f°’ªÏ6i¼R-»o Û¼Dmµ}™U‡Ú®ZÊàtŸtMvºÁ2²¹U߸•«òKGMRTNè6ùk>B²»ÖknòGM? fŸ¤Ö;Nw€Í­©öèŽ6Ý` å_ƒ-ô• 1ÝÞ™pýˆ1R¯&ßÚÕ{œúõן¿¡?®ÿ&Ze]¿sIá oþ“‹ë'Y½ÚQ“è"Eñû2ßÒ×ääÒܹ‹ÜkY}{—ÊŸn»Ê:éÅN2‹ìŠâ§ ʧ”vrZM2„?ùUø.–&™®XéïôóKSü륹#q”­„TiDÑF¿OrË£“ú4Û—X§­í}&cWMG†ŸÀ_S/·Mu““Ôý<³—n¼¢õmª|ù$õ¯ƒ“¯) )úX¨EÒvÙô5}3Ó[¡•Ú:Nv1zÿ&4æùx;9­¸0¸Îø(ýMåæŽoÓGQ^ž·á–}ž}¾w®ôúš_|”¯Š>l–NÙô庚2Û¯Õêµ7mK¤sÿÒþ>ÇôF‹|—ÞÛ=zóÜê*‘Û—'›V?ô¥Í*j¥’ÕŽSäï¡ k=°Vûö0Óß§è4ùœßÂ=0ÐÐÓ_Loä#{â¸Iê>€Ë•““\<yDr²Ä Ø ¥€( ða”FÎSÕ·K„AÊì2*¤fy•Tm¤iE:i¬[åz½]ú’wŽŽÞ’*:IÉs“µúŽ^ôô%Ò*„|#ž·ˆôãþÒ~œö¢é€ 4 (  ji©ªgŽpp•2 B€P †P€ X€D(`¨… …¼ßF5“²âÊ6¸4¸ÃÊKç&5´÷ÅµÊ ò¦âϹýú‡éÍiÍý/ø;sþ\ã5÷µô¡ê4\^SXgÂõ~žIÊ/ï‡òŽ->{M3QuòTi6’k¢ûù 4ü_e¦íqhp[O+k˜ð=À‹k ©ò¨#i*wàŠß!EÞ1੪®l.KJ­:`N_>Åj£O=œÖpù.SjÀʺ\®ÍsKUV­ò8ÿ¶úAµ%kÍ£öóeJž8°¹Èöü…~éóASã´ÀËU×F£—ذÉyM IÓrÏKêkÈÓT‹.lÖÙ/–¼ª@FÛÎÒªï­ß85ÒWMfOéiôø#\®Ë\P‚«}›9WH(*%×GBZÏÄ{gºŽ”T`±þN¼Ç;V_l”°×G]8ý)¼à¶þ%m³ž§Ñ%?8b"¬ò^ Œ¹æ»f&¥_G/–QtGkåvpÔ›ÒÕÇ-ùѤ“\1)RÀ¶ð±dÕÔ‡¦†éfO„Kq¨ùºÚ²Ö–é¿Çƒ™Æº@P€[±•c¢Ä®zñI7ä×÷_äÝf>¤]Á?bœÚ BØB`@Y@@P¶„Õl|ôX•Ù¤ùHñzÝ =8-H-®ë›ŒW’×2MüM'iUf"¬*«¼ÙI׌YÄSníK?Vqÿ Zk®}ÈÖ1ÝO©çÏ‚))7øvµWÎH”xn¿ý*j¯–Fš^NßÇ$šëÂU;ë!Ås_’‰kñîKÂ~2€s‡Ð¶«Ø |®l©Ô¹žqùö$Zd•¾:"v©…Wìº&íÝ_!·muÈol@•‹ºòic° «$º¤pý‰mFžX Üí¯Àµj» ¸¯€®Ÿƒ~å_R©sÍ IÜ¿€3)Vb÷^’á¯î/½à ¶ý¿ìn±€$šÃ9IùãÈiþ Ýás—Ü¥àëÁŽ9EÅx*MsX0ÚIÓµò¦=³ù:é÷Ã˵k³mñ$tj?Vv›ýÑG7çÁ½&ã.H¬ú%¶Rüœ½&¥§Ñè…¨W¹µ{‡)ÓÕé䞬/ÉíÔápuŽUË“®•IZ(ê—Òfé•ÜiMI84©öTÜv¥mwìGÓYO<áõq“©W^OŸ«¬åŒüê:s~šÓôÎKtÛôoOECQn“”Iñ>o«¡ê ’QI#Õ TÍÇ7Qé­oÒåò4& ÞåÇ^ç.ùýwâìrÖ׌UËð|ékk-_Ô„Ü|aÝütÕõ’õ CR7*¤ÑäÔƒŒš’¦urcJµU"ëÜgž(çú¿ÒÿMÒètb-ªÎÚšI?§£¯>9¸Ê,ù¾§MGQ¢¬ygüsúW¥Z~šä–éå˜ýZë«§µàç’ÔADRƒà õƒ9QY:.¥h P„nŠ2Ù†´úG5Á*ª)‘xVsYeFÐF‘P9ú½oÓÑÚ»ä³Ñòä¥)¥\ŸF*©uuéËŸ]"© MC”ÎnŽrõ)ˆë9Í%^@ø`ËA@(cR q¢¤3B PÀ8(`@À@ €PP ­é‹ªKòo§]…Tݦ&ùì¨ÒU3KÃ_K‘ËKQÂ^渹R¿Sý×­]5¥7•ÁëõÞ›õ¡¾+ëäîe'êt«ëKû{¦f+¤]«îÈ›ãÁEŽl®•ÓË©¿ùýûíe;öÝýKŠ,oØ#Iæ†ìµä(³×,&øîòqð\ðKeâìI´À_މW^ßµÐþÖÐñü•K ŠÖO,”­%‹äoíïÉUeôßQ5•çwmÐ ß"Ó’°&ßaµkªÕ5]‘]ç„ÀÔšQ}ØÃꘄðg›K†è·ŽØ®ü 4ß1é‘UßÈB’T²ßnñÃò™7iÞ;2äëä"Á<äéUòfÖ¹G“F+päK(ôhzW*ž¦ƒ|Íf×±¶+ð'QJ¾ã}\ŒG9j%(¹»rtwÒ–hóñ×ù7gÓwCm¬öz˜RÛq—(Žw…ÉU[V¹YF”Ô£h£”­NÞ3‚êÁjéû®9è­Hi×o£¬SoË G=S GêÔÁó§)NNSvÙ˪ß1,†PU%O‚8ÓWàÔeô4éGàèe@@ÊA PK(PÓMr®SŠhçê´ÿSE¥ÊÊ7|ÌÅWy¦fÒ–_“l¦ç—Á%»7à qû$“Ýž)Iª_KÎYTª4ÑA4ùµY2Öipé~ÄIU{S‚_RµÙ7,5×´«rËìbÒy“´nšUÿ±mµÎÇÝÖ9UîÓWÁEÚé§ÂìrÚ|Fâßò5ºK)"ƒMZH©$¸Á³îH*ÚÃà—_kû‚+KÅy%}.W×gja½¸òjéÞHér¬":à‘ËöÉm§ÀV_Ôñǹ¥¹EyËiqÈJ‚’Ç¿’6¿`3xUŠ/Ú«9æÓ³/à*?‚¯ºßì$©#/+ aÛ'žQ3YÀ¦])n[[àÇMrÝ䵚9º£X¢%€+V“ìÒOò‚4þ¥k”j ÓL–i–/dÔ®—MHí—³2®?‡BF5tvûwéÿGë†cþÖô£»£µ«Ež—Æã&šhõij©ª|šgMµ5ïeGMÎ…³H¨W`Hj~œ¯¡¬´Úß{㔽ÎN)»Ú¾h:ºúzoê–}Ž/×i?í’^H­ékF_k=Z~¡®òHfªX·Gê:úpÛµ-ï,¹­sqòµ5%'’A9%äÎ-ºúžGIV¤#—ü3ÁýR–¼Ù¸ÊÿOô÷«.eÇÁçþ¡þ£QéS8ϺßãôÒõ/ÐéùI#ÒÖ,íÏŽNSK³âúW-yK«5|#¯£ÒÿQ­×ҲϿíŠG8¬êÆÏ4£F†h”eZJ̵E &Ü"RR¢ÀéäÊ2Ù—-ªÙšNäkØ•U" >(‘EHÚAŠQaÎxGƒÕz˜ÏSÙ3|Fz¹Ñ­oQ½,Eå^½g–’3©%%mðe¶#§ot²ÿÁºHÏËJÀFg¦¦©£Ç©¦àò±äƒ˜ ( ÐìP E!EPí¦©XWDü£Iþ, Zº6˜E»ù4žU]©­®Ï&¶›„­p_Iê%¥©'TÏ×zWU¢ýK”tîo:Ìú¯7õKµ½X«„¾åãÜøºúON^Ý£NK:§U.Š [à–[v«¯bøKŽ€p°:}¥]Ñ®’_!ß–_íÊÈUÝÂÿÊ*û¿ä ל–Õ×`ø#¹.>Bvšà;òWÝ㢧Œà«øDæ×Š÷É^/ºK‡O¥dJ«´áß¹~ìÝ'ä–Ö­P»V©všU»‚Úq_½€¿¹x`Yc8º²&¿÷òR¾¸ÉMã”ìø#¤Ðw•ù,i´ü ‹2;yO £IõÊ:GKd»&®0й³Dª)ÙXª.MF*ÙdG·CÓGOêŸÕ/ðwKw.NÒcºš²ý*”xº8ê9(îç98[øÜe%)½Ñ¤ž=αÔY®S8Ë•^˜e)3MžÏ\œµö«¢N;ŸŽ~ —¬Ííõ,~@ºÒPIs7ÂG8o¦Õ·uà.;B5õ?ÜòzŸYW ó#=\Y&ûì‡'D–eªM\’³uI&ì¨õúgÿE/ êAHX€Ð€,¢ü”)BÅ€oJ{&¼<3Ôj3_7×i8k'‰gªéñLÛ#Knتä%¾ž[ì¨:’y¦¸ ­Ü;ñð»'†¿€ڱ͊wHJÛ_#ž9nÙ«Mþ;v³ÿ¸Å(¥îEûWlk¦ù'¼Nérì‰Ö_}y(¯êúo„EôÅÚêÿ€-*ÿÅbÖ^HÝq•ºÊöN«•äé¿‚7J»Y†ðË·ÇN¿ÿPþ¥œ&.¿b;i·†b¢)r¦|üv/--Ç ¶×ÛWîŸçØÍ§‡`mý/ß<_@/ÉUÛW}t•Sì#<+Ç¥Û#XÈ|ûwºÿp#Tí/ƒóûÊ~z1 K&jÇtû4ñðsuV±hÃ"®+ÓÂh!­þ̱ÃÍbÑ–í&€Ú{£O£2ãõEðjû]¿µòÕ‚q–΋´‚:)×&”éÚäéÞ=XÉ}XgxáŒÖ“îÍ'eFÒ ”rù9kN£K°8]žO[ú”š“Qâ *d1Z®3¶–·Ö£>,š=‘¸ÕY5`µ©Í»^ £+Ñ©§·R¥áör©iÊš©"+Ûý/YNsƒ|»G—Ö¯ÖõŽ Ïð]ÉQéÔÖÿO ¶óT‘ãôºê½TtÞW2g.#]?G¥§§¦”tÕ$uv—hæòú¹mÑ“^(øZ®ß²5|Xû¿ÒtŸ¦Stò{îø1(Ä¡f‡ ™{fT£-¤²R(h‚£I s“³,¢IÒ³„äÙ#–k’*£Hƒ Ü"#I„WÁ 9z™µéÈðêim·É׆;z}žÝ+ó“ÖŒõéÏŠŽZn¦ö­U|¦ã%%hÆ£r’‚ã¶ÁZ B€(@Ìऩ…y5t\¬£‘QÐP( B€ ÐÀ0PÜ| Pd  )B¬U³ºá*¨ÓvÀ©àÝø¯>‰ßé'ÝÐÔ‚œhƒÅ$á:gÑþ›ë¥éõSO¸»ôÍ~¯OR£EISŒ—Çõ¾“ôäàøy‹ÿƒ™q¯_.piÓåÛ[YQ¾RIЦ­^PTáaf¸ ýi«´)XäìþØümÏÉH ’’ª È¨ŠØÒÒ–«úV;g»ON1¨åöμÇ>«qêOíeM-JáIZ6ŠàµƒXg6ãRû¢éœ?´ýoŸ§*Ý)7‡Hº2úî±.:½Zs¬> 6åð{?Ÿú¹õéÀ6˚Ĝ/Ý–®öôô•ù“ ÄrZVïtßîtQŒ#úºj®Å/Sêå­ôÂãòy¯£ºÜˆ;2 @¦[mí%F´´cªN丳ªjY@tÐÕØéðÏ]PÅ€(ðd©–ì¢Ì ŸO©¹m|¢Ä©êôÞ¦‹Û÷,£æîáòù:OcêM+ðÿÉ4ïïþJ‹4öƱÀWIË‚ÝÝßfkí·îPO‡,cÎ|>©=Ñxe¶ºÈ÷þ¤m¥I|$ñ*È+]<ÿ%̲¿ó# -ܬ®ê—mmvª¸ ÊM´û*Mµî ^pMÝ®p€­®væ…Ú§ÙA«ÏŽˆÖUå^@F+nÚ§—‚柷ݥГ¥U„šÇ?û½®žiÐCkkØ©RÈ?¥.è%”ì+;›´YVìåòáƒ9¯~ÂQ®< â¦"¿µ<)ójÆçÚ¥ìaYi[Û› Ì•5]‘Û¿d6¨o½Î«Ø ·tÑ—y¢rG9:a]!+GM9\\_Lç] ¼ã÷2Ñ~ AòŠŠßeNÒWkäÌ?º”@N‡†×åa% ÛÊìÏ©Òq{´þךYÐÕu¶i¦tV¯çTòXºfùb½: |×¶OTž Æu3Jeaª–ÒN.6™b8¶yµËà-’mJ5%ià×Ñp¶®Ž0ÓÔŸÛ±¨’{]IUÜŸtE}=9î„eå5F“2ÚÔj˜ŸSòQÃÓîôþ²*XvtôÑz¾¥¹båF:ú‹ú„5RU˜Ç=¿Ò}#ÐÒýYÆ¥<ü"ó>“ªû1ràë->¬Þ²ù¾¾ÿE¯sâÉ[Ú‹|Wê}6žÝGÄQ×i˜….YG)´ðsö ­`IJS#—DTFŒ¨ii#EX°L ÂrÜýŽr¬"¢+h¯ æ‘´QJŠŠðúÝOú›Sáå­(ÀïÌúrîý¾žš¤‘ÐäÜé ¨’JóÀË@  … &©žMm³(B…€ /@@€p€ìE²BÓMwàéæ˜E¼X Ò4žp¨¼Q«wìQµ+.RµÀõ´ÔãÝÙæŒœ]p^nT}¿èßÔ?J[&þ–}ÿQ£S£·ÎS5ý'ÞœÿÇÁõzR’kë>ç…ÿ&¥õa„ú|UrßAÉB-¼x÷Ë?U'ˆ}'===Mgjß»×EŽ/ÝðMOOó+~Á\kÀW·Ój)B¯êGNP O—N°ZÚ•°#»Jþ§Š¸â“ø Ÿ<n="EýALþ Õ°*•,²Ú½ÀZ´½ˆÛIä¸á2µRüà-¿?Å¿¥„êAnŠêÞri%}"·\röÊù 7jÛ£+ÈÚt[RM6¦±Ñ£µ"—ÿ-|…sìuDD«ERÂIN.JÒy^Åž£é¶« (ô‘˜½úŽ-b±òwstF”šøéÊ—0v‚GoW¶?ô•É®ú<úz²Z×'nx'?é7—nfGii9MIÓ]¦tQK ngÊâ[Ž‘ãƒÙ&Lr¨D÷pTcV*Q¯äF±Tƒq–´½'ýMW»Qð¾¼õçºO/>«Q̇6`@Å€ T"œñÜéˆ/p9ÊM²)5ÁÕ5%hõúTá'âÀíþ­ÿöâUê¹½8•êWzh«Ôźp@?^ ûQ¾Ÿû'ëéר?Zì(Ÿ­öÿ%ým?ö?Ü úÚOûý]?ö°'êiøcõ4¼HêiùdߥþçûXþ”Ÿÿ5/”Wu­lzÕî6¯÷Ç÷(lÿÕÜ›õG÷í~Wî6Iç¸P•pM’ðdŸL»%þÖÛ/ T¼0÷ wÀ“å"mý¨È]íEXIB{Zk”ìÓšœýÏ™êôÿGY×Ê:F+‹¿—Dá{¦iÕß/”-qànµ¥ËµVÑ–›k4˜ ý=óû“ŠNøOø"Ÿri{Ъ^üwK6K¹q}ZjŒ©S‹öNžjÿà‘÷í ¥Ÿ’Ro¼€Œ¼ò¹®Å,§›ÊÏ*Ìm”»%¶¿îKoêYY¿byo¦/ÉC óYÉZiUðA#†ŸkWTòÂ¥æÔriÆ2U»Ü W(:VÀ”¦ÚM’¯•äé4oÂkÜV©ðÌÖÒT²¬Ão…Œ/6¸ðK\ 3ñDyXç°3,Q™XxÁÎUd§Få&ªkžÌWN[ÜžWÉY†‘c²ðÓì¨Ý§Ž™4þ±–i’Nšk”EYUã†-µžQD»:iOézSü2 ­+N•Ã"nœZúUŒ­¸•<Ñ®Xéîô‘¨9>ÎÏ“¤sJÕšÉV;(®U—ÂV|¹úÅ»(¨Ëõ‹„­õ)ù_$Õ_ÕÓ’û•™Þ¡ÅQŸY¹·(þN/MÉÒY~IUïÓjŒo…GMëÉQT‘$£8Óœ õZ‹õcö¿'®>žzú²êÙŽÚŽ~š?¯¥)n­HáûŸ¦Ó‚Zq‹ŠÂHÜb´£¬au§Œˆùþ¿ÿ“:èñLô¿­¯¾KèòË׃ô ŒºD§¨Î2vHÈŠœä–‹3UQQ¤n!ðaäÎZ³¥@qDì T‘Q¸’o4(ÐEàÖÑž¤äÓYv=—ÖäúÂ;oø¹YþOzX)ÉÐùàe @@¡@@´EpÖôêYŽä”\]2 €(P Á¨…€ ¨«(ì°’_±oØ žpj8`i;l·\irÙ¤øö(Õ¦²?¨Ó§¹ 1£¨âÓX£ôßÑ¿¨-H­)¼ôÙ×ý¹gÊözÿMú‘ýX/®=yGÀõ:[^è¬?àãpNŸ±­Ø²£ž¦´aóÒJ¸"´°¬Âä ¤PJ)$ê,&´Ôc,Óá½<6i¤t¾1úì[2ÒXÙ2Àüø2  ° €)P1©¥E•Ÿ$-]i¼åyF¨ (¤(t ™aA@Pìí¦»Òà|_È¿`Á¤ò¨³Iÿ€.7~M¦°€©çä¯êM>¢&¬&vôºòÓšiÕâý³_­þë#ê´R¿©,ûžoê>•FNiÓ—>ÏÉŽ¦V§Ü|Mm7§6™ç—¨QuVˆ$æõ×N‹JFâÊ=líÈ5c\ži" 4z½.¥­®í}'øϰQ$£…Ùp¢Þ[逿ۂ)fÓXE¼%Øúe¬¬ß¸Õ[ü‡wÈQ›î²ÀÅÒi/tok–-`"¶.ü†÷$×AZO«÷0¯wØÅÓòJKPFI£kkX µ“-;»Æ’jžy.ŸÔó0Æ’:Å$Šr®ŒKî\×G–¼„GɕȗÁEX Ê€þ’{uv?¶xg¦Q«ìwçÆ[‹rJOŠþI)©uTW65 õ4£©r‹ãʂҕÍ\ßA½úzV2û9z‰mŽþÐs]-Múiº¾Í¬òœ±K’GEJ?V!ÛbµSë’_¥éÕGLJ¿'–e  ŽIrPÓƒÕVàë)Ò¤¨#“dhŠ,7§©NŸvN¸:§jÐ ¥¶@ ”@` ( Š€ `@Àt:I&Â1éâÿ×hß Ùö¥(¸¼§ƒQ+ãêi==YAá'†füVƒ£¢ä—_ä’”pªí×ðêk5~Ä[\m<×ü)§æž?c{iy´«à¢Åß/Íši8µŒô¬;uÐM^ïŸòEi¹%º-ava¶›o>PÆsiÉ $U»~ØJ®ˆ-ºU”ëðTð¨óUß’]¶ž -\¾X¤ëÉZ©¬ßEqukË(•÷´Ò¤Ÿ4¢³×Fr’IwÙ…!USä#-ã<Ê\¤r¤¯ƒ/-Sò¬eÓäŽK‡ÊÞYMð¥|’œB >ÞHÕ·í¦FÞ×`eªuuDÏlóƒ-[ ƒy~LóaQãä̲ÀÁÍû™'Ñ„Ü%íÙ*Æñ%WðÍFV³Êäç]ÉtASðò]ä¥FîÚKà jVzìÃv·/È>¯àXijÁ§†¸g-=MM,Ë)a‘]î:Šã”Íúg»_Mê _MºT'g&ŠÚ(Ë¢áþ©4œaá[>u[¥ÉhôhzIj5¹žØzHC„™™ éú)p‡é" ôÒÅq/O~³É« àñÀW4iUHÚ@n1JJI}K†{t?¨kéa¥$X•ì‡õM)bpqgU« ­Ñ’hÔ¬±sÜz’K IJÎR`e -V”mžfíÙ*ÁV‘¸ $h¢ 3&fÈ8꾎hä±YU’*¾@i"• -GS©úp^Yg©^HKõµb«Œ³ßo¦9h¦B_‚‚^Jç•P „ ¥P¡Å<5g“[Ó5˜~Äv©åQ¡@¡@…/@PQHTP¨ÆÙÚ¨ D@Ë-vÂ+þP¾€«ù4Ÿ_òŠ›yñÉ¥MUÑDœ¤k³Èî¦'¨ú?Ó}d´5SOƒõZZõZ³*héý&Í#ãzÿFãzO¿µûzR„œ'ÊþNJäãLí¦ËЩÑGXJ™èƒ´Pš´yu"dq’“„”—(tík¼³Oÿp¢j±ÇXøðÝÐI)·Xä m¦i]+}bü‹§TJ—ŠšãÀ©,šRk ©šYÅ[¦¼™XŠ»»¦©%Wðe:I­ËÆXUi;Ip¯<‘:yè*¹a·àÍ«·•à iÂóX:á#· ªHÉE7¤êh j*mxf, ip(€ËBy+›‹µÉïw©Í:RVÙׯ.Q¾r:UñFÜï¬'±Å§Ã¦vÕŒvÛVÂTÓ›ßà³Jpq} ?¤„ äåÇIë=ÛnO„‘Ö0Z:oS^Uy£Ãê½dµÞØÜt×^LuZ‘å&À: e=¼e89ýZŠ‘QÒSÅGƒ’*P¼€ ôçý¯ðv‹¦Uœ—°€R€ pF@€Ñ‚2€£Q¦€h/ÿÓöÿ³>±¨Íx¿¨é\ªY?†+«¼›Œ9Å·%â+‡äÓ‚Æp¨¢»I5†ú"[jÞ|Í$¹ãòLþ¢u\`­üeƾ]·¹RËÿ±®ð¯Íü”¾—Œò~æ–U¬Ž-<ÙPôËJ?¹dÿ^rŸJuÇíùãå~ÀHË >ƒ”žH$gW‚î·µVW…yÿ‚Ûx(˶³Ï‚¼[5›nþúOƒ–r«$I<_DÓ|ZdÊ%›–Üxö#«Ú¾ šYÉ)¾•V›Xåñä*<æéøeyÏ!å§åŒ·]mS’]$˜UžxVcãžÀJIZ¯É„ÚUß2ò±äU^@˦¹HĹàò¾L?y1%Š1–Ü3mæ×+ù1[•¤ð2Ò]3IÖJƒÊÿ&´Þm¾2ý–×uk´EYGµö²'x|¯ä ¥µÙÒIMZï¯<ô¤ëì¿Øöú:—ªŒ“ÂM±ú—ǽË&¡–urtg6Q›4³€>Wª“ÕÖ”–màëé}+“ÿ"£éCIB4‘\JŒÖJ•…fK4jžR¬RoEER<úºv€ðëhmw?ÁÈ•ULʺE›HÞ›’uÕ•[ÓÇéM٨˜ŸHæù ¤`N ÏQB6È<²›œ­•´¦‘⤢€ ËxÏ'l«€!®"Ø£¤Qy-` "¢.J'“Ö)NXâ(ß§^1è´ê.o¾jzÏ3éPº#LòT€žæ¾œùðeT (@¥@u}’»Y¦ˆäÛÀµÏŒ’ÅÝ` {mt·rYðfÕ‘ÐlIEåvÔÎ|£Šy¶,*ƒ*`g¢ÂZo¬£§ ]78ÁÏm8ð‹*zjIû³£b±O ®<šÓw;qà øæõœáxòkOUÉ[ƒVðÅKR\ÕÕÒô‘·RÔéÕ™¯­=yn›ø]#‘ÆÖá`Š€,€‰ê(âòÊiéÒÝ©Ç)œ÷ 0@ÜXìë§=ÊŸÜhJ°Î€Pì ¢ˆF;*;¨¤¥€ °ðѶÿ©|/ø>Á¨ÍfQR‹‹áŸV/OUé¶Þx7«ôºî¸f_ ¦š\nM7]ZýÍ)}VÕû— ÔÓª¾D¥Iß7ü´óÓ£+ë€3O—Ž ú¼ÕP.ª²isÅvˆ%áÆº¢7±a___U¯“2º¨®/«=ø/æ˜É‹n7Á®úÇLÌ’M46°¹ª4¯·À÷ö,æú@ܯ‚?Ù>@çŒy ]> ŠÒùäÖ"¼PD·œÕ‘5÷>‚§ö½¨t®Ð}º2î«¶_ùeW¿ša哉XS«ìŠ>ö¯Àj•{…bUø2ý€­pÛ2ü'€2Ó¾VÛfWÉkÃËŽ ÂUô¿Ã%j:§efe¬k°4ªP~[ ‰ìÁcô¿fYEr€ËE„œc«ÿ(õzHéÉKR ºÔëÇ¡!ÁÕÍ®92éöQš$¥¶kšÀM9måŸKKMB4ŠŽn ŒµEÓƒ— È;ÃF:jÚ¹“a\¤Ù–¬‚´cµ!)R7rmݒ„² Í¥ÍàñÎnRahÊ´‘¸Ä#¢E(¤`K ”aœõeKjŠäÓà‚#OíHµ…dQ D ¤ÙäÖ“Q®äèß,ôï§±KÁ²¿H(@)Êm¹ìXŰ>2¡B€B*” P(( %%M"¿§ÙõGžˆ¨P*€ €…!@ (jÜÊ=¤‰îй]á—¯p ´ É@©š¼d!Ѩ¼d dÒÎ<çÖ…;EÑÕp’i›âåJý?ôo^µcúSyèõPôÛãú°_RåyDîe'ÍúïO±ïÚÏ FU¨³e £¬$XD$ªäéygU4’~ìQ✜ÝÉÙ×ÓCtÔºDŠ÷^)®†V:¥Ûœ %T¾2T4²Â *§Â4¸aYj­^:Ãä téݦWù6ê•rnç¹<_j;7W†k«í`åwJ‡,îš3JÞj«/íL?«…GXÃk·Ë4rµÒDRFGÁP*`vnáø9<: ¨P C®†§éê§× ×>¥}yàçéî.ZO./f¶ÛmÉ™–§éênû›YŠò,4î_©©™¾ƒ²ÑzÉ«¥Ûö—¨õÐèèe®d|ùIÊW&ÛòÎ]V¤K!†€– U’Žz“v£rfᦴþ­DœÿÀBrlÊ"Œ (Xt«#++;iËr÷ìï tÀÑB ¯ O%<”€;((P  @O_ÿS›ð«ø>Á¨Í›ýJZ‘§†ÍrÍyàÓ ø÷ŽèXiéEB ÛGuÇ’£/’K‚¢é蹿«ƒÒ¢ °¨ƒg)r™Ž©(ÙÇSIJ-4†Pq•0‘š­$n$WH£éz=-‘R|òX•êrlÃf‘†èYðe´¢Ûu@xõµž¤±ö˜‰+N‰D#¢EF¨#$F³-ÏR{xäàÛo%(¬€O•ì€#}$EP-õõœ3ÙçÒ—ëknþØðt“ëXëþ=kre¦€18[´éðA–‚9$òSL)©pÞ©¿s¨Ý§ÒÝê[J€³ÔÚéÚ¬#›N¢­‡¨ö'ýÍ€Ž£§»”4æÚnO‚‚”œâÛå•)ÎM©RLíÁÁ]ÆW–È7±jÎM¶—å?Oú‰¸,§H+Í(¸:d …€ vP: ÐDQe ;iÆ•öL2&F ôeàÉ{°šM×^ʸÒt©ÀËk†p’Û+EƒÑé}D´æš|®þŸë#êôV~¤²tëïIõ^_ê>‘FM¥ÿNÃ?;ê´^Ž¥>:9+ÎÚL»Ê y/ë¨q–%«)¿©ß±ÍòA½89Ê‘íÒŠJ¢QÑ;Yè·ù 4éÕ26–ª_r,cïØª÷4×9è Î<ð^à}®Ëi­¾à;øÅ‹¦ñ~à"«‡‘,îîÂ&ZK’¨×v‚¥ßä9&³È¾ø2«¾ØF£ IµÑÕ$¸1k|ÀlØT—B*´ó¦×ƒä"¢àK/dÑ`ú:Ÿ©¡ß Ϋý=Hj/ÿwa5få7ríø5§¥[Y“åƒÇXÇ ÉÔW,ózŸZä¿OGíù3ÕÄ“^2RX±`nNrÛ§Ïø*:Â1ÑO¹¾Y–Ȩ(e Ol·'“Ñ nV€ë nF Øè@` g†P e B BŠ@), /ô¿«×ë? þÇ×5¡Ï_Oõ4œ{è±ZqMîY¬¯qµæpm.¢m•ƒq§(¦«-3T—íûI´ßwßÁ6Ü¢Û«Ã@^§Å}>Ý«úŸ¿wÒYvA…Öy·'$ÿt€­%âJÇÝMÂUùM8Óëþ@ž1ÀSRoûõq‚ßÑõg§DyfgpJŠ7/„fIíýÀ6Ÿ_Yf.º}­´LÝ*ðÈY}Ÿ4‚³TÕg²7K­Þ]i§Åö9Mµ‚Ô»v–­ C5ÐDÍsÉSm¼á0"áÖBÂw€3¹7I~Hó*¾9$«Vg ÚÊ >rI<*4ÓÎ%áä íã’7t€Ì¹ö#Xàƒ/ƒ g»DqºœÕdFUÉš±Ñ4ÐO¢4¶;ÇìASµî>9 )ŒºEödy"³çÛŒkN1Jé$k–zuÓ‹ï¥*àÛr•±À´olœƒ¦ÊW«Óé(FûìÝ';*9Í9jÔ{:¨¥*jÂ;$¨ÌÙGíàPæŽ-S>C¶Q¥qܹ\žJ%V¢iz=6Ÿêj¥×,ú‹B%цhNòÇ$µmž/Q­úŽ–"9#qFUÒ(é„uŠ4P ° (€ ²6ŸRW#(ƒK‚¸¬‡–ªY5ÙA¢¢ä (­Ô½J]`íéa³Iyy:ß®\ýéèHmI`ùàe¤9êF߸BI%K²Goð`¯9ŽÝx/µGÉ¥NXè Öé_–waâÿêJþÚŒë¤Yç–Ø—û™QÒiEní*CFöñ€Ï .̺Þëˆ* Þ’šYᙃpr‹ðQ‰¤šâ6Κ-+\U™«š¢Ka@€° @(Q¨E¹#ЕqÐA«È |†²>KX pL€~áeL±x¦ü–í„.Šär3~x„£ý3×ËÓj§xìëÅüJûž·ú§¦ÔôrZZ‘”¤¿còúº’Ô›r–çää®NÖLï;›ö*à ‘¸ÅÉêÓ‹ŠI+;GÛ²ÅÅZY4Ö@•«Ã@EŽy4»ÏàsO‚Z¤üᤛTê‡m{ ¢â€ÔRÏ‚5Q}°"›®+¢:ÛîÀ©4ø|³ŒX»ª¯Ã?S«Ë;GE¥sxðfÜY¼c‚l±`BS£! °QÛC´ûFf¸„ «EÀŸE©¶n¾V¬7Á§Ú;ÏýOO¥'£›û™ÓQCÓÇv«^É QóµýDõßÔê=E¬ãn· #"€XY@6G%Û|tTq[½K[S„W,ô}:QÛËŽvß"ȪK ^@„à5 í•Þˆ¾Ó:ï‚_TÒ~àU(?ïîUU‰'ùµî¿rÓöýÊ_þ1µ€QlSðk«£-?U…LœlJ®€n%€°F€€’ÀØÑ•êëÏßþOªj1@Qó=vŽÝmñÆÿÚÏ+{*Þ_ø6É·uVðIFí5MM’JÔŠ§©VP¼R¦Úx]ŸÔ¹7·o±-§™c "•Åâ­Ý7%òÎZtÒ4²ÕºÿôÒº®Éõ(»\pÉ©?€éÆúx²+5¶’•WýÍ4ü·I¼Q_Ú÷;SãÏì-_oþ@W¸LRæØ[籜õÿ *•<®IO•ÎH¨©¦üp[§Œ ŒµoÜ6â—†Q7S§Áw)UF­º3Œåpž8ÕVqîŒÚüòÍ*\"e(ºÏ)¯rZ¼®³yn½ˆùO„/û‘®ÀÊÆ^}ij+X-%‚;² 2?`2Õ~LüI#”¢A”Ü_&㨟8&.¶šdhmóÙm?’*`Tú|¾¿.”SZí´}Ⱥ/,ôÞüo£l¦ð_”} %Å94° “×_l8òj,/ܨíQ©Gø*2æŽr•öUeÉE¥«àˆÊÝ"¸6€Í^&¾–Éaa…rHï¡¡-Oeäʾ†–œtÕ$trǹb:ts—9(É”V]xõõÞ£¥ö£’%i¸£¤QXDê‘Q¤P#BDd6rÕ•F¼Ä©ið@7l€ThЍ¯‚£# !5'³NRñÁ`ùúqzºéuË>”cHéÛŸ>ꓳ›`(σ-Ž6bPÂH µ;1wŽÛ,ÉøF¾Ý5åa™¯dt”«ŽrIN,°Š“r—3&Ûr\pj4¤¯ˆ £w·sç'{Mc‚£Œ§ÿVß\ý)'ËvÀé=U±8a]“ݺK¼ ¸ÎI&í$iÁ욯 5ý:œ/©vy5454¾å$J € €RvÀ@((*Y(ôhÅ¥fÞ>t(\Ž€à ŽÈð« ¨ ‚` 2Þ^Lô5(´ù\ÞøEÔj2›I[HÖåR“KÉ¢¤QÒ³¶œr€ë{zy:[|2E;7§ê=BYÔþ饯®¦Û’j±ƒÑ=M=H§¨Ó—Á#-$ŸÐ›ø4¤ŸöÇö.&´”[û!ûŽ–šÿéÇö.&´´4ßöE~ ÇÓi¼R_‚|W]¢ÓÜ¿c¤=ŠvÜ¥ù/Å5êÒÓ†œvÁR6@T>W¬ÓzzϨ·hÔJá–î’¦K¼Ò*+Æß<ü[m®X(íñeâ5Ë«ŽûtIF)ÚOðJI[§œPÜ·E§YXKék¾™>èªÂ@U(òÓÎ3K<ôý4ùà'—·‹°%+‹áݾ®ÀTZXÿظesà2ªÃáVûFx‹W]€¿ydºþÜX~ü˜Iå,ض9^è*ñÎ@ŠV£—ýÜ…Nð±C)§‹7xNÈ’¯vÊ#M;|øYðA^WÉ—ÂwÊ ‰yEö\aã9 /ºH*><¢pVþI̼€u·Ž;2×òL¾@œ’» Ëâ̰Úe…e®Ì4X …Rk°6µ5Æ¥[*dW§ú|”}\}ÓG×\šåšÓ)>lôôtã©<¶![–ªG)z†ð¸4ŽnM’¼€-XŒ7±¢£4˜»#@J£œ‘]UEœóȲnIÙã©Ù5=Daè+Á­êeªñˆø1Z­¤uŒH;Bd‚4ŠQ2 e²ˆÙ•DâF–!PþÕî@4ƒ )Ó5`,áê"õ%ñ‚Ë…qÿNú“£¨¸“5ògµãÄ™S]v]LUê5—1±þ®]Ä`Òõ«´mz¸2bëKÔi¿î4µ"ûC ~|QͳàªMrQ¥$Ê@P°QE(€( (”iHFj¤“%3[IGRJ<&rxfZB ‚À… €,(QéÒ†Õ`td<ûÛ°”ðNÀ—߀©^ä mv,€d¡d²!¢Ó *]K¢¨<#„t_NàÚÌQGEJ)×,Ô£N9MWº4镸¬ *Y÷L Ò|<“rO‹ÏÂ*į§€/‚u¬%}–9t·yÂcÅvm§X × OñX 9RY}ŠGh¥ŽEœ« …€ì@aBvTQW'{½4üÉá‚ B("€ €@ì  ÒÉQÇRmÏdUË¤ŽšZ1Óúæ÷MùR““2Eà÷"ä €×k=::›Öq%ÉËÔúzÿ©;@y'¢ëz_'*³LªE EvŠB€mÚ(€Qh€©H ¤m"£¢7£¤N‘(虸¼•¢Î±èŠÐy½n—êh¶¹ŽK¾\šJÛHËm¾½"ÚÜüp MË{‹KⶤïòiW õa7Vž;3rj”i]YSÜ·J;X§<íd²â«›X;¢Óýš}·µ%Êþ@Ìœ”p0¦ÿÝäú›·¶¿îJÚžåØ1K æ¨ÿ»ÍcIÓÃA¤Ó©<O<&°Ä’¾Ñ¾x#OñEC6›ý‚¸ãš n¶Û\&ZïÈQc‘(ñ\ôÚâ«Î O°+Q—·Àû¸ù’ÂW”ˆÝU>€”ùL&ó]M’¯†–Õ‘ÓKøaSYºðGœµìÊVž| wÅyö£7•p#V²aý¼€Íÿ’×]’ðá“°'ÃXAYhÍNÀ‚*“F–§’cZÞž·éÎ2\ÅÙ÷45–¶œgð"W^Pª4Êj]`óÛL+[¬öþ«ª¾JÎïp¥eBòid Æ #b£¥R2ÕðÊ#M{™M¤q`j1¢¶—DVm‘¥Ø“ðe?$V5u£¦­óàñOVZ²·ûbÆ'X¢±‰ÞꑤŠ(É`K%,–Q,Ë9j<˜H¯Š †|/‚lXØ2læ§!b©Åö]ËÈDÃJ^ ²/¢é‰úQðeèCÀù&'úx“ý2é³_$ÇÈ¢˜làÂmv”úfÓO€ *`TR¢”P¿p¤»hêGýÈ~¬÷Ç÷/_Iz'ú?÷ KX iûtUä “®Bç*À¸N×dj7ò€®¶ðÝ×@?#œkùJÓÀù¦’¤Dú¸÷d¶ðÀ±NR®“:¤¢©,˜êµÌ e €T€@P *´ÝÁ 1.HÈ'NØ@Š `° Ù@–QIœå«' 5ÿót‚:éÂ1¤î]¶I6ß$T°@ U °˜È‚ä@E¸Ê×'w)jé:åtXŽþŸF:ÚjQ¯ o_ý:^-Xý’y^ c/Ç໦Âì±—ôÀ~›¦Àlcc°l´m´»@m@´i 4‘´Š¤m‰ÑmA Î±e4˜¨¥2¡WÉõ:QÒ×q’Ç*üx½ªOnR³l—ùðJj“xív¥)EæñeXm× ’Xt—^HÞ^] "úU6äÿÁRMãp#”£Q\§û–ùðÒoéM5dqŽ( ·O)üšú_Ô˜¯œ{‘·O·Õø¶”s—nŒ¸înÝ*l4ë«Å*ç÷ø»]÷:¯N?8~ $׺ìŠÏþ ¯5‹Aù¢·u€#¥vG$^×\šÝuj°ùWË›_W@ ,à’¤ðt¿ Kkw‰|ã‚&äØQª¶f)s~áÇ7ø Òçÿ`¨¢ªÊ®ß€2ó“7‹@%‡”e¼á>Hùö"²òŒò¬+$hÃDVXü'ßéž©hêþœßÑ/á}ʤ;4ŒÍœ&²JRV"Q&i"£¤"儎ÐÒó‚£¢ÓK³TQ–ðg-¿`"` ÊK£ ‘SrFe4}Îþ¦:xY—ø"¼NRÔ•ÉÛ:B&jºÅb€ï§²EFbÀ’Ê ‘BB2FQÆYaiÈ 5.H€ €1¨Òƒý;ÓU‰rJÜŸN«O\3ÉYJ}>J÷%†.}3Q”»ïjÆÿ`4–Òà¢à*È)«€4¥%ɨÍ2X«Š-ô7ÏÂ&ýObhnÔò/SýÃB§þæ6Éó&M\6?,~Ÿ»3-4£“͵x,EÚ¼E\®A£.)û‡™°ª ¤ "$…@ª€"E •”ztã¶ Ë7Å{0вð‰TÙEá…îA9€|ºà•ˆ R½ÉXȈÑt° è4«*^Ù(Ò^|Q¨º6•„n¯(ÒIºEk¿ƒIç&®‹Ãî\>z >À\¤ÉŠ^@×8xIJ¹ÊÈÛ¯ ?ÈtÛ¾Æk„ üðm,àù ¥ôñðri/Ô­¸D´‘Ö?J¤S› €à P¨@ŠŽºê(“ÇàÀ" Š(@),mG2t¼•Teêm%·MwÛ;­ºqQÓU@cœöB*‘e[¢X(|€P'` %%™8û–%{¿¡9)Os¸µË;PÕzÿô£ö'oÝx¿CØ¿ ü ?CØÒÐöj¯Nüý8ÃWý?°ÿOì0Óý7±?ÓŒ4ÿOì?Óû 5?Ó2¦dÅÑúwàŸé߆§è?ý0ÓôXý'à ´Ù¥5´ÒEF’6‘FÑ¥€Žgh²òm,P¨¸^y4@Ï‘’+ÉýGGõ4w%õG?ƒæ½×uoÁ¨ƒM$»H'm[á_ýŠ”“¥_÷&Õ½eáØ¦ÝcÁ-JXãÍåâ¸_'EóxO¼Û"´²±ÐºŽ2ù-4³I<`ð‰¶3´Õ ,£â[£Ý‘É{¤­MIa[å4]­çâÀ—ͦe¯§ ÆoÈn­¥ &ªî‘^)¶Óx _³Dí•Ò§ä’N¹djâþB²’Ë Û䨋„Ù¨¨¬uäŠÏ|âøU|*`D¸ÍßÇ|Ò|Øàƒ)nua,ÚAY§»ê§á„ò—6Uâ¿ã 3*ã÷&2m°ðë°#tˆßÈè „Nž@fZ°¬4 ™ €#ìKõ¯Q~Ž«ú—ÚüŸEˆŒ>NzŠŠ3Ñ낸§ì!]! K„uZUɦ]RIÜPÜG 0ÙHËdå$¾LÅÛ¶L™D_Q꿳OòÏ*M²Vc¬QXÄí„vŠ£H¢€K6–K0…˜ˆJˆ7Â25PÈ@ .3 À媭/“šKu£5ןS#~Ågë äŸ#OŠ`ªª»*aŒd% ٖ®Ø#á ‚n€¸h .W «SÊJIš°(‚Ò*Hʉ 5±¦þ!`…eC,t!C¢8¦A‡ŒE…(TÀ@¨*P!@ˆ @9-:èÇt¯¤Tz}ƒÊG ¨¼xN-×%¯ä_ä™`WG€ø@©,¬)VB@J²¤¨£uá—jü­¸äÒI0.Ûè°TÊ5Фkuíá‡K>@ª·y`V£‹YAø  §/k*…»á¬Ž«Û€sm@ (  N¹ ‚Â)béÙGgõWÅ€ îB(> x%€³–®²_DS”߂ĭih8ÿÔÖw? Î{ž¬±Ð²€è(‚t (0 ö;19¸ýªÛ*;z_Fõ_êk^Þ—“éÂT’HÜbºÃOØôCOØÒ:¨$]«Á4ÃjPÓ¢P (!B…"mEÓ ¨mCCj¦&ÅàŸ¦†ˆôý%àj'é/ô‹¢þŸ°ý1¢~˜Z^dÆŠ¶E}Ï’§r¯`*¯ ~U&kÜ(õ-,-T¸ÃÒ¼sNŒc}>SäÒ:Gœ®ì9gŠl »iSI²rð©q~@;qTéYd©U¬bÀÌ%o/’ÁtùJå*º ;®×~@Ó¾k/é¶è{n–:fc••Mr€ÕGB(¨ÔH2^€  <>ªjZ^Æ9%mª%2¿,»¦»Ÿ«?%ýy j­wYEZêøau¥«ù4§û¯’‚° 2È(L È *d ƒ+†”ë“ji”PSeR3b¸ú–ÝW Ù  _‚Ý:’…Å2 85Á€-€(€ €TJQÛF7+èôu~à^ÉÝRò9`%Ñ*³Ð*¹þTþ@€_±:ȸ®IÏ=€HV©{ *\'Ù¥ž€±·„^9(½×ƒ¥ÖPÍ?Á-b—XºÏä)^0O‹ø7Í4í'à []{€ò™•;@Õ%›üäÎ_%»nÕ5€aW€Vú@(n:¯µ¹Œ¨)B P`Šˆ>J‚èYÓ¾ÑÎ_s*3`(BY€£Ž¦¤¥/ÒÒW.߃®–”4ýÓò”ܹ!Bô €( ;`R_@µ5iíŽdø=ž‹Òîq–·> âf¾œtóG}=#qŠï4@%fì!µU$†˜mO”)x 'Ê%ª bùà“Šœ_ U-=IFi¶:3ª´¼~M"97$¢¿žM[•§ð€””Wß!(ñºñÇ€#‹Q~ù2°ÔµÀ“N-,W$V«ÏVøR~Y9}vîþpE§'~P‹§‹Ûá•ýYŠvIa5ž$ž^/°3:I2ÊÓÏÈÝÖå_›Vœ£‹.ie¿=<øì r×¹—ã¤AmVQ–“^ì $œo8èf€9-¹Å™»“±Fœ’º¾: ˜µh›£hêˆñóä <ðbN’¢ŠÛjâ[¢+7Ç’vº]€¬R˳=ñÀávOíø-g?’p€pg3øå—ËÀ›÷]!Q«É—€2Ñ(‚`€?€}é~³cý G‡ö¿Ó¼ˆ#=ÐÓß¡ ÃÚj%r¹AÑ×O[©—xÉ5ƒEèç)¤ Mt»<ÒÖsx%UP¾CÇ”²D¹jú…Œ2üžY7'm‘U#qD"Ž‘@t‚;ÅtE²‹bÀYY,d°5d´q(–,ƒ”È…ád¨¨¨Òá…d¤€01«=šr—€GÆÖ›r0µ$»%i¥¯/&—¨d^£Ø«Z, ú}—t_`[‘H)´»ùå+%€H­Ø*÷ÈU&»4µ<”m4ø(LÄ´“”´dŽmW*€0 ˜TZ`;+},«9ÑSY@aéø0âÐa@P@ (‚;2¥l£×§±FúbÉî͆¹tÅb€±j³dä]±`¼»ÏÀÅfÀƒ  {d M,šªi5†m®~ •áò”jï•'Ø ·ðis’‹|W<Þkòñ·Ê1únù»P…ŽÍßÕVe–®Øª/‹è˜~Àjšö÷$dӸǤÖÓQŽx%¸²:u€smH˜‚¨A€TB”@¼¨ ú.â×±‰bŠŒ Édª(@)‘ÇtýKzpúaÜŠŽÐŒ4a¶ >L·dTP/ @…Ñ~@ @º9¹¹ËdS¯!OéÔ]¼Èú~ŸFM¢{[Ìttk³¤)c•l&pܳž `/Ø(E¦°î€ùÿÔôœZÖŠç ðµ$ñ*Ún2ÒûTš¦Ý’ŸÒøò» Òqá 3Wâøàß6êŸcuRo‰*—;mp„Z•¦²ó`“n7Bþ›oÏ£×ý}ÿ¾8÷Z÷>Ÿ§w¡ÿ¥%MXnWÙæö5YXê8³Ñ¥êa,Iía\õýT ßÔŸ²<:¾²Rt“3¯2;ÇdVe«àÛòÎZ±]Û8ÏZST°¼X*DŠ7⎑@vŠ:¢¢Ùl‹d°%’À Y, e° ’ð;£HH*—û@€€@3Ëë¥ZIye‹"nÙƒ5`,‚¦]À[.â*©2­I.Ê-i.Í-v˜€¢Ð °. BÇ P«+! ¢©ÉrŠ4¦™»Q—ùDå£àå(Ir~U- Pr^бÖH2àŸ±‡¦×Ài¡`,@€ €ò;hÂÝÑG¥ÀEà&šà¹h­æÀU‘d :h²ûtñ|24ßÀ©‡$à †ÛÏ^¤KÈžsÀQÆJ³]`¢¬á¿ÉbêTó *Ëö*KóØ’4ò‚ I{šJ¯ÈT¶¾¤—=€XÇtTÞ=À¸Ú™¥MXÆ€®)¦•pe¾U^@Ž^{蘫`K\´8Ê7ŒàËT¬_ä e|ù%øaP­õà°2ýˆfY wôzïC]Iý¯@}©Ea®QîôNôR¾0X•èiu4wqɶ\_¦Ô^(ã= O$V!£šy:ÿ§Mfz;V2r{RúÆzÐ_j³Œ§)rÈÓ(´AR4FÒqGX ލՔ[RX±`,–°F̾…H /$(¥¢¿´ ”‚3 Pg‡úŒ¾ÕìX±ò¤íÍPQ`,¶Ë` Р€` ,(”FˆA ¸ðÀÚÔé›M> )@¤È1-(³”´Zv²7k …+^à *é€|PðAVQš`bZm<j€€@)Y  n¼žÈClQF±ù*‹°½Àv˜¤À²¤=À‘çäÕ'‚ˆè‚5Í*€0ø`NÉ@%Ò-?8ð…ç§îÊ’Iû  »óEtÚkòU,pj\ðò/šÕý%®˜¤“ÆQpv¨7šìn¾ ù¥kœÍ-¢&×\¦EÈÙÒ)ÕË“6¬ €(P  ![X …訖֟ÜuÕYùEG Yˆ ¨B@ç­©8ç2|%Ù=N_©¯í)Þ›"ˆ€ B8P€€',™ME[3 7ª÷J×°¿Dû¯f–•ÒŠ>Ÿ¥ôŠ 9rg™µ»r;ëú?My~ã~®sw¶ï„uqµ˜ÿRÔ‹§¥Ç¹ÑUó¦Í2Òþ§á#kúž—j±F—õ-ý_±¥ýCÓ¿î±0izÝýæ—ªÐýD0iz'ÿÔîijé¾'Ü`»ãþä[^H À°7/ MËÊ£åß÷"~¬?܆*=m5ýÈŸê4ÿÜ\õî#õ:k±‚«Ò÷ý‰þ³OÄ¿aƒ/ÖÃý²ýˆýtØÆ#/×ÿû¶Oþ!ÿîßî0eÿQ—ZɉRÔ¼i¢àÃþ£¯xŒj®èá¯ê'¯™*qÆq÷)Þ^:/ýLÉ¥ìÀ‘I;Ç&à骼¶’mÐoj°2î•çÜ©¨ÞìßI&šk¬d±’o+»ü+µÉMU{ت‹÷å™}ô€Ÿsjþw5Áã䪶לYFsI²åÕæˆªç<‘ÝÒë¢U¾1Éq]f¹¾³ÿb«M·Ç@®Ûv˜î¼™(Ö>’}IUÚòQT©GÈNðEE„¼’ÚOr +§ÑšÃ•åp‹ÜÉuÐN²2åŽ@<ò@DOkùóø2ß°¢óoŽU`F×h{{.‘šì‚%’póÉ*À2VGÅ(”¬B€ì0>¯ôßQúš¥,¸qð}B¿éÉôä"W­"¥FÑZDÙ¸*<ººU+Hå©­ 5õK>¯.§¯ý8þç’s”ݶKU’Ñ•(´J 4 :E"TmÀ¶,‹d°KY@€À ¢¾F‚—;"£2 Ï›ýJ_õ+Â,WÍo$³4‘KË`[  1@(  p #@~F”åtn:‰û05c(¤A™E>Uœå¢šÆç-)Eç&8yä¡ð‡€Œ¬0ÆWÀ }”Zàƒ2Ó‹WTaéx?§/¦º …(ï¡ úºG¡c—eAå{‹ö µ_PIÂÈX¿Á[Ź|€x¯’pÙrëÀ«Ëà(áÙd©Úà4›ÀJè¹Ro<`Hà£_ð: *Çä%Iø¼~HßWðA§n6ºdï8(×þ®‚7nº@;å±¹w€$dÍZ¼sä ×enÖ°?Éwpë R_ú¼ Z^Nô^p­ØŒi+Ë5g:éˆØ …†@/ PX@#Éè–b˜x Œ”@E@穪àöÃê›ëÀJihÇN[µs7äÔääòE@0 ´P!P OQEÒ̺@4´\ÞýNO~‡¦”ÚÆ ߺÔú¥££ %o•ÙËÔzßìÑVüõd4_ô‹ÿ¹"ÿ¤ûä4?ÒÇýÒ/úXycCý,<±þšãUÓiøéôü ý>ŸûGú}/öÐÒÿj/èiÿµ ÑÓÿj£§þÔ@ý ?ö¢§Òÿb/Òè¿í<>»Ó-œ.Ÿù5¼—šÈRÚ›ŽWl¨Ê–çšµƒj›¼¼b–Œ²Xâå^@»TZª¦\$žo0îëŸ Ý8òÿÀ¯¦)·o’E»«NÀJVÖ3Ø’iÚJ¨ú¸t^2 0—•ÿêUô§O>Ž›µ%ð-×ð¦•7‡’³Éš¶@«’¦ø%&¾›üú¨œ6¸é.–Pnê‚§ã’<á¯Êò0ø»*\ f’v¿€%®<)X¢;Åe.˜xdjìp€> Ö=ú³È—ø œ „Ff‚¡tA`JoGUéjÆiÕsð~ÓÿSô:z1‹ÕWY,õ+«þ«éz•“ÿŠúgÛ4‰ÿÆ4—rfõœý:?È1Ç_úž¶²ªP^ÇŠM·mصB™Q"Ñ¢R*HÜB:DÚeL¶Å€²X ÈÅ@‘°3e‹ÈEYeЦ€¢\‘Ù– ³äP•ëO拼’òJ«bÌŠ˜°¥‹ØØ@l…@(`,¶X ¶€¸Y@(…4™Êᛎ§û‘FÔ“áš”fZq—(ƒ”´ZàÅ5Ê(Ë^ÃÀ ÈW@T: h N¸.R‘;ÀC°Ò}ŸÓ‹äËÒ"²ôäGºSð€ 3à ¶OûYV”ßT×§}³kF+•eZq’â<¡(üfÊ F.N—%È ’ÁZÀBY1…`^•„€—I¡vÀ©^h•ЭW‚Ö?ÁD÷c 8EëGœö9øô*¾m¬k˜@T»4©núÁ°›uÏf6_ç![Ç€5xªü†«`Eár*å`WødJ÷Á¬>0Àœ>HåÐŒ£žÉuxÀD¤½Ù­9mxì—Æ£k æÚ€€(‰e 2Rx P ŠBŠvƒ½?€9Ë 0DPgÆ9~¬ç¨ã¢½›é!hªY—‘DrmÛE:@<" T P€9OUÞÈ+—Ÿ_OéÛËËb‘ô½?¥¤œSœ4cšEê¼ÚšºšÎ•¨›ÑÐöuëÓÒ£´`‘c-Õ¬“ôãþÔiqvGÂW„Ú¼!KÀ ^ ËÊ&èÿ¹~áMñÿrýÆøÿ¹~àG©Ì—îG¯¦¿¹ÿQ¥þäOõ:_ïê´ßüú½%ýßÀÄeúÍ>“cýd?ÚÀŸë#þÉõŸþêAQú¹u¤Éþ§[­4ÿQê?Ùþ¿¨ÿdB#Ôõ/ÂüÝêŸ÷ú¯÷³—ªëUYú­4›ÕtgÔzxÓ†³¢ŽpõÞ¢)?ÔÜùÉu=v¶¼'¥‡‚â87.÷[€ÿ.j„©;óà -éÖ0…b·g–¬»Å¢¾ïÍ` ‹rO?ò.âܱš 3½F—“[V1N°À‰6ë°¡_K•ù$¼E´©Ýe[|¾=ˆ£JÚº‹¼«š@gœþBÎ0 ©q„Éjö¼c÷×Õ„¶ò$¤×Àm·œ.Hñ†¹ÿ µ^29欂¯µb³fSJï,*7š|'JùX*+ÆVE)¦ë$VZÂý6×büåö˜7jßÛÊád [ÚIÓàjp’æ¨* ½"*ô±ò_ô°ò5Oôð]ÒÑ\Ëù&˜•é×2_¹ý*þøþãLG¯éW÷#/ÖzUßðO’üSý§\&ÿ_õ¡'ø'É~)ÿÄcÖ“'ÿ|­/ä|‹?üFo%ùdÿ]¬ÿ¶(Û'úYrÒ9kz™ÅÓeG7êܱ#VÕb€(âÖSÆLÅÒǽ„iݦš-¥QïÉC–íðJÚÝå0+æ™Ix}}ýÿÉŒôþž¶ñh¶äêÿó° K VŠt¢Ø’þþz+Ip%˜½ÔÓð)åG *üÊ{–ä5O镨î_ùÁ%‡K¾È¬ÜRIá2.VÞ°Tj’³ ´¼€¤ éçÀR©/‹ü€JÛ|Û|ñÐþœ¬ö‰Yosd ¬‰f9Uçä¢Zå‘ðÕòAV}ˆÝ$—€"vî©,2~˹,.­*è º»ïÁ›rš|Ð’uwÐnøaFéÔL¦Ö|€öðe«t)Õ?çÙxdç²¥@f“%PýÄiòè©à+?÷‚'öÐh+,ŒÑ—à€„J;úxâü…zR5@Z(E(¨ ¢£Iš°-‹Ø´Å,X %,Ò`,–²w{QÑtTiH ‘Py23îAh 3«-ºr—„|Q+eŠáÙ(Í À€€@l*ÀS9b˜XAÈ  e %XÊáÑF–£\«7¦€e.QÎZ9½9G”ÌÕ2ƒJù®@ðP"/H µ€%¾ wÀo!s/ü“6€½šé„D¯#¤ûåSé†%nÀ™ì×È–œ|Þ‡†A—éçmx,}<ß4WXhÆåk¦TJÉzç 8‚‡Ç%^¾EâЮ¼1 /ä/>"Ë-Öoû.’€\û‡wä Ò¤}Ê×°è ž(©µ,w|¢ñÏàÎ_€¹ºísÊ*¶°J°ÞEXô²nÆ­ÛÏ")·€ Øø@2êßÀO>@µ‡’7›\L6ªŸ8Ïœ½:¨7噫†Ëä:P(…!`B ‡,YP7¢êAZÕäçîe¼™œ”ydTQzÙÔ[`¸^M9cjÂŒÙH¨P°@¢€(à@ @ðT’’‚¶éÊ1ÔõR¤šô½7¥Žš(õ'G.‘åÖõ’›Ù£Çr+6ºz_M_T²ýÏ|"’Šéi•F‘HÑåõZnz‘kÅœ¿Aø¢ü¨úvizf_¦u€½3ì*¯M›ÁÑhD úP§Û¨øbnŠðŒË[N<Î+òM\s—­Ñ:‘ü—õýÍü"|¢ü\ßõM>£'ø1/êsþÝù%é~,ÿñPøÒHÃõ~²\R'Ír#Õõ’çQ¯Á—S>u$KÕ0^›Uó9¿É¥èæùÝû™Ú­/BûLÒôúJkkÐ{zá~Á5¥èW‚ÿ¢š¢*ô…×—[Ó=-JéåôŸƒ¤e¥¦ü½^‹–ŽêÌsø7|ßÖ‡›ê+ˆ’«z~¥þ<·FjÖ=‹©a&é§ÒþJä©b›òTTšÿÎKöǪ`O«•žò[ê²°¾SãŸû1È .o¾PJÒ¼03§*_/ت¯ácgäy¯Œá.)–â¢Õõ_€ªŸO,Ëûñøj<³•$À%†¢°Âž×…|°­q¶ü“?€*K´[ÿod¸ñ|à‰^V{5*Tï¦UIãáüEû'ü»ñ› ÊîBxt©¯!ïƒ:G/…à ©¯”Z¥ÏYíôTñKb®íß·N럦¹°S©öF×kòuødkß4U·…ެpñ&*¹o#óÀ¯ÅŒ¼žÃvòûvD|†ç’$Î|!2Õ¯yÀh‚ E[KÉî„iPE@R€( ¨¨Ò4€Òe°[bÀ¶,’ÀX<,ŒP5§Í— m"ÑQR-^"dðŒY²X€põÓQÐÛ܇ªí—ð`TR €@ B€(`[ÈòäP%6€¼Ã袩IpÍ-EýÀnÓà  jÌKJ2胜´ZÊÉÍÅåv?‚…ø*axT'–I—°”Úð÷PAÝÚ}ú”-¿k/X'Ñeu@3UØË@^jÆ/ ³‚ZÅ }Sé‘[_TUšÇAw`1Ö« ‰´ß¹o®Ê ¨5ÎH"·„i¬Giª¨É~Atú4øS i%ÀY +o;*Ï EåòƒxÀm•·–O'ØmÞ îëØÔk®@œ;x—üMy+^éyøw€ ڪϓ›ã bxwàôéòãðg¦£eàÃH,@€ € ¨0 ò¤(¤mN,äßXrK Ûb:I?ÔÔ̺D JÙ P"+@v ¶°(… 55c¦³Ÿc:ž~¦[§öx*>¦Ž”tâ£HÞ¦¬tcºOñä¥y&õ½Sî}/'}L¢Ò告÷B;QÕpi’ÍÅ„t‰Ñb‘×a¤Ü…¢iˆæ—i~LK^æq_‘«Žrõš1çQ~ ¿ê+‰7ø'Éq—ýGO¨Í™Ô/íÑ“ù'Éq¬×nŠDýW._‚|ŒJõ’ÿê5ð?Óú™}Ú²&Õ ›ær“Kúrï#ìÖ—ôø¯ס·ìLO’¯EkÒi®‹ñ>M/M¦º*ЂþÔ_Š|•iAj.Èÿµâš»W„ZEøÃJÁ’2õ`¹ÀÀZÚo‰£Jq|IIF:‹9'èÃÁPý(ø#Ñ‹M5†]Gåÿ¨zgé=\´ÿµæ?žð*ÁJŽús"½š2Rû•¥¡¾)éÓ¥ÃäÔf¸¹S©&«È“ü® „K ?"Ií¤ï·ºúæ‚X·Ð_n[¿%k¥ÏL aÚI¼Y¥3ÿ¸Ò·xL©îMó@D’•®9$•Çì7¹4ñn¿bíswtüZIÓûl<~@rœkØ‹›X2·.k¡¶Yv«”ªñj¬:·€0öáså•Kl µžj‚æÝÐVÔÞIt³Ë"”¼òF“\ÓæÂ2“ºåfÆ*8ÃÈó…Èmþ)]³6¸kŽ ƒUÞEºUÁ–« !½Î«<*ò¼m.@ûd•ôó#N°ý‡\q0ùäÕ}-Þ{7Ï@N¨%Oä‚<.Eq`g¼‘Óxà þ |‘ž<  Ï°!=47M·Â=‰K@PTPPPi@hXÅ€±`,X Å,Ò`, @nê=XIH¨© $¹ VgÅÈ!ýGRõÚ|É;eªƒ À të~@   Šä@(òv”Jí:4µç n3Rï&€¤ðО‚k¦s–œ¢¯Øƒ(> à%`:-0Ž@,„¨ ,;bÕñˆ’¼Ž ¶ ÀEáÏȪè߸Šo—J¹‹pV©×`9TVçt€Ÿ&­^EfÀÍç(¨}TŒO”®›iZ TÝ`«Ü¢7›'¹Á-òŠ5Þ}€v)X‡‘wœP-S²Ç0²òN"ëUþP‹å¾ð[¤±ØÿÒi$ÂÀåÛÁ0ØV¯(rØ Sª÷xä<ðd³†aʹð¿sÚ°’1Ó\¨2ÐØèÈÀÀ: EP…E!E䃳ûO ¨œ’ä•Å^h’…¾dMÆZB€ ä*ðPÀ [)õuvý1Ì¿ÀÓúiJ[¦í³éÂRIsÖõQÓ{ ·OÁ4´%9~¦³Ý/ ů\aû ”x,e«4™QMDˆïƒeXýJŸè¿Óûº¨ñlõrÿêQÒkËîÕ¹Ç]ÿ‡·Ì›üš_Ó¡ÞF&·C¤º6½&šè¸šÚÐÓ_ÚU¥ý¥øšÖÈø.Õà¿Òq\…H¢ J¤i5L,ý.íG$’Fá ãÚ3‹®ÐŽÕF ùŸ×='ëzoÕŠúôóø?6™òn¦Ez´5)£Ù ¸å<¢Äz!«UZ‘R÷1?K§%ôI¯fTyå¦ô“Þ—µU,nµìTT²ß]—UWÊKéM%‚gny@V’ãs.yMñ\ 55Ž1‚&íÒ®À—í_=|Û_þ T±ö»#xµÌsžÀÒ[±jÌ<,yÈ]'Þ,«e×ÀÎ$þœäŸwíh EÅeqÁm;µKÈ{p’´°a­Ž’úy 7V©àER¤EF’Áœcœd"W !MË -ö\ôHóñ†_8|sªyL ‹·û qÇû½“1ÊX #çš'<åEÏÒo6Ù—^Í.˜Ü–d½€4¿,Ë®@œ#.×ÿ©c„O#C?'‚< ¤:/ø ‰ËAÐTjÌ´ââš‘ÓMK·f׫Š|0;CÔiJ¾ª~çXµ.eŠ PEL e°, bÀ‰šL °5döG( $i#H´^W);2È!ƒþø¾®{§'åžWÉj 2²ÐÅH  ð¤Ø‚B… ˜«2ÐË€&Ò©IpÊ4µW÷`èšk ¸D–œeÊ9KA¥ô»@sqk•D~Å‚ÆXÖyÀ¬äÀæ‡wØð‚“ÎP¼à•,,²ßÒ]—í@3ºú*@E’€6ùÆ»ä5máü=Š“Í_…Ò®J ðKJXðͲ8¦íô’Xò¨ã–A:¯í”ÎJ€aZ|Ðè°Ê¹Š©÷@Y;°’IµT1ŠÁEºý‚v€)¹|¥Rü¸¬K†öm®1€ Úð¿øðÖ |]:é“•}÷ÇÀ~Àe¼˜“°W4½ÏYŽšåHe  v¤ X;€!eEvAÖ2´s“—࣠ɺŽ ø.í«l~IHÃ`ŠÒj€W@  ,È,3Õs{t³å½7¥IÛNÊdRÒ¹Iávyõ=N¦¼¿OA4»‘K^O飤¯™>[=QI;[³I•Í&‘¸+’@zM Z‰hçØß 7{6›é¯W±sä¢SòP¼ #ÔŠþäOÔ‡û€»âû½˜ ÞÌ ¾€ŸW°iÿº€›eþ÷ûÂOÿ¨ÿ`1-¿þ¬¿b­î“ö°:æýŒÆïs¯lI%$ÓV™ùêú_Y=:{nãðYàó6TÈ®•3Û£«xl#´eOxÎÑFôµã)¸4ù<›vÝ*k“<õ§SÂOu:]-nO-ðteW<÷ü÷[ï1(¬¤Û7ýª±†À7'*K&TÚËH!—ʵÙ~rÚ›¯n|„äéõØm§J-¾ï¬ãk=,|„€¸I4©™Jêi]¥Âà:q¾¸ ©¾8¥ÉR\®È%·œ‘bÛ¿` ËšXèÍ·…Ï%Bo÷ â–-«ÁRÇvj±^Tç’>~žú6î‹Å^@IãùŸaYjÕ¬Übèi:ì’yøºÒþCãÞ€Ç ‰U7ù`e$Õ‘øX’¿Á¦×‹#}P-:ÿƒ/Ÿ‘áò,¾Á ý‰Â !d|_hÉDkØ©µ”Úü¸úhñ/Üí_¨¾è¦Q臩RYZ°}„kr颀,¶4‚€ÀX°,•05`d°%‹g·ÓËt” ô$Z*4—}“¶hƬ¶ª\²+“á½DöhÉûP#âk;‘ÈUø X@@S¨F 4ƒ ˜ -€¢5O ¢-I.rn:±}×È»“9ËF-ÚÁ)iIufx*#Éz —Eå`ò}Wo ‚|~€Ì™, 'Œr¡Ëfîí(5_ N‹Ð¢Þ@‹<¾@5õü”^Ñ^.p(¢Þ Óà MçÉ+¤È+YÀvÞWM{•R€M5ŸØ?å*ðù"ð¿É{§L&”T°¸°×H ÂèÍ&éRîò-µÀ°ò0vå[K§’Õa;wbN€ËfiÕ­z‰žžÌtÜ[P(xB…@,u`kr„\»]Õo^1’µÉFw$©`Ïäʤi!e(¡``B¶½€ 5oƒ‹”µGóä¨õèhmV jú=·™xAkœ4µ½\“Õ“Œ<ý==í„W•ÎÖ¬Òee´Í&Í 6™×K;"•†œ÷ê‹í}»í•Ýñ‚§m¯U‘ÿí¥ý_Nµâ¾­>~ æì]¦uÒÔ¦í„÷++Ö¼.ŽîEæ}ŽMT£ÊÉßÔ}N±âkù1ü¯Ú÷>œª-T®údŒ¾›K?äô¹+I<Ëðjm¤’y+•šêÆTž~?àí+M®ˆ•>o°•_¿¹)¬Û ,’N)çË$mI%@IŶš•7Ò/Òþ|›ýľ—ž=€aýQ¼tX'LxT³É†•s4ÜšÏ}¾:}RO*)uÉRw\䨞Zå·Â¤y•Þy#µY»uœ·€óÂÁ¼¬t0Ÿºâ»ä4·RýÀË]öEm¯ýAQ_Í¢:¾@tÙ6_àŸLÚÀ|¿p2ÚDÂ÷‡•Á–» –×X ^xW6eUä ø"O°§ØcºøN¬ÍJ ñ€ø,(„©[KȨ¬À#VReÞÊ‹¼»‘T‘¤Ê'j‹À%Œ@©–À %€£ÑΧµö ÷¤m"£2fB¤ä¡g—sœ­i d°xÿ¨KèŠ,Xù3äÉ(è( *€P 7@ e(B€ `°@`¤0Å #äXŸ/$h ›_küZ­}È ÆJ\3@8Eò€å- æá(¬›/ÈC+>GrÞ@A˜ ¶Mø¤Óà¨*ô"T‹jÀ«ä.l ¼ub¯}”øa,:I|“¼”\ت9¹ZÐ`^½ˆùæƒYø¸òXîå%†\5v«j¹ äþEÖz©äÖWTM %ÖËvï²ËÈBß avF—l*a»_‚«®'Π‹dMcØ.ƒÇÞHßœblžÀoÓârøÁÝ­ÅU@°‚©)¡B€%…@¡PºA jI(ÅG¥l°¬mJäݯ{ë‚R4§ *œ(ÄÔT¾—h ²ª"–T° P ¥0$ä¡°b¥¯$Þ#àöiéÇOOtšE–®®·Ó¡±ÜÍèzHAî—×/,¬Z÷B)"¾JÊA°5h &uÐì#º)BÐRAG¦¤¹ká™ýwoòiiAj§ö¯Ø $— #IªhI*JŠ€PƤ¦œ¡.$©øïê–~ÔËJ\sårÒ,dm3*N¹TþLOã×XÈôúwúšÑþåõDåÅΛê}1·-<´ªÄî·G“Øó¬I¶²±d«J»wÈl²­c]ϵÞIó¹¥ÜšuÞ÷Ûªi¼€ UYã¶Iº@D–eYDR­gä—W.ŠŠä§i{ U¿‚&ã<öOîIåq‚‹Jïò"“yÉI)7~ôYK¥Ž€”ðï„Igœ #U.=ÃéNn_‚îwK ƒn5Júb); &3Yh›dÊ‹ásB–#⑚ú©^9þ °¬ºDXÈ›üfÂvoÿr<¯p f‘3@3Ãã£-W$­|˜áä9-Õ4lœ(¯‚²_`ƒàèS²W€'D4F€ŒºjõîAëŠ6€Ð€€ %s\2­Y/r -_(ÒՋ䨪Q|3@€€¢Q@"2@³P“Œ“]}m9ÅÅ5œ¶Â!MHé«—ìUx§«-I[7¦ˆ7.L€f@ê?Ú½‹ù’äÉš EèÑh B€ 8€@,¶ÀXP @(€@0(¢‰KášS”{´£ªŸ6މ§ÀbZQ—G9hÉp¬ƒ›‹\à•Qwš*þBy|Œ.XòËòï b½€v-¶À©¶¨µE•à/rX¬¶‘VrQ þ@;οÁ„/%G„>ié„b·T€ X@°.Íb0}á-9$þ¥ÅvKÿ§%õ"øŒ990e ‰”¼ *Ëн(QtŒ@Ʀ¬aŽeàš>šz²ýMWQ*=_JiiF뾉ú;¥»VNOÇH%®ÑðŽÚjÙc„|•ÒE@jÍ,¤wÑÄn²ž¬W"œæð©n©dÔ#› è€Áý[Я[éšKþ¤UÅŸ’œe 8É4Ö/â3Ý"ì7àêÞè_hÏSbÏ[„­ôu?OV3]<ž_+­vÖ[ud— \Yˆâ¼<žév<×Ôwö§ìiª‹ÛÇýŠúžbßä5˜®ºJä©ÅZ"Úí_à ýªëðe'¹¤½€Gs¦â°­Žø³Æ1d®›¾¿îj²Õ¾IÂPqV±`Wµ»âºðI<¥Æ,Vݬ{öf— ÕuïØÒä›s^&íËŠ+]g—o—Ú¬.pœ»–CÝ’£Rûâ°F—ü‘EXdëÃA+ËX¬tÀ^ç~PutžÌ±•”GÃaZÅS2ß@e«èmÅݽðX‘+8+Ã*ã9ÈûÙuÉžiqWhŽÓ`O‘Ï2À0øϹ/ $~ÀÕgä0'b€ËG_OäߌzTMP…(€P@epÊ*œ—f–¬€«WÊ/êEû¥(¾.(@R4YPÿI+Ò^Ø;¶’¶éæÖõ‘Ó ¿'ŽZ’Ô•·lâˆ$¹%”ùßÔeõׄ‹ó›i(€B€-  RQ`0Ê-€Å€ 2‡"È(:ÉhѯµÑFã«%÷+÷:GR2á Så#›Ñ]`ƒ›Ó”oWº*<)!ü€¿ç!€µšoØŠ9¹;Eég*ÕöEÍsƒév¸¯<™­¿+¤ÊúòRÊuÉRNUp©\à˜ÏìÂ|?!W`GŒ^lt•—Xä”ì Œ'ç$÷]öìØ€ÞXTºrñƒ4ße ¢|)‘á`‘Åäœá ÀŸ‚>B§$`F@2Ñc)EÜdÑm?[«õ%$z!ëtg÷\YQÚ2„þÙ&i ¥„ AR…@ @ d ¥%Ãf¿RK°/ê¿]?Q§ÊL Ë×Mª‚Q_ ëNt›(À¢ E´ÖB=1àÔž(ÀFXù~·ÿ›/’Áãd3V"J€¥( æÀ €Vh- P@ ذ ”@Š àRU<`ÒÔœyÉGHêÆ]Ó÷5ðÀO 0ô“ö9½),µaóA§Ø@}ˆÊúñŠ#¯û€÷*°¡¾@,ÿ“Mà£7䵇l‚Òà‹¬”Uœ<†ó/CŒ|¬®>ão®È0#å–šuû^qÑW%‡|ØXŽy éç€*kn]ï /4o#ÀÚŠØ‹§`.Ó2ë ø Œ›½°zɺK/€¯ZTÛ( P€ °“`p×õ[éé%)y3£é³úš¹“-Hï&ºTŒðE8-ØT‚ ¾J”NŠ€©€)Sè  Ø@’JÙÍF~¢T­GÉbZ÷z}8誊ùfõ4ÔâiÍæú¢éš ÚàÌÕ 3¥:tÏv†l£¤ÞØÑÅJÂ4™¤Ej1:Â%-„[6™GH£¬bQ´¨¤h ‰¸n.–B¢ 6‘—?{:GSÉÒ̽HGî’_,˜k†§õI¤ê~¢ üžM_ëþMÔdçð‹95äÖÿö•'ÿKBÿü™çŸõïU5ô(Cã%ÉÆ_Õ=dÖušø9ÃW[R_V¬ßå’Ö¤u–ŒªÛ“ùgƒÕCf¯Ê²Nªõ>œoØ&-eQQ¤Î‘a]9B/ÁËúGNá*i®Qô5^øÇZíµŒ‹ú~Úë V×êgµoØx¨»ò¹¸·ÿc*I6¶ef‰[ÃǃUv˜”Td’øV×𻤰‡‡]]NeAOýË<”×ÒFíÓÀ’¦fRjÜ–/ ]а#æÿ¬?’%jÚç4;ㄨ®¶UXQ®é—ét’ 1¾)|•N‘V¨¡X:Æz‘U^ålÛɸé¶Xéc¦‘qQ°Š (K¹qq57 Ã,YD±`K‘F\‰¸ƒ-€«„MĆ¥3äYþ›©(¿Qé¥&¹”-š•+óí»Ï&dø‰gH<­GXžL¾´ÌV£éÊãÿT[u`¿ô—’øñ²©š@i3h+¤xf;ŸMré CÒIêhOIr¾¨œ¹úê7׉ý‹wþ"4úvÏ[ΩtÞ_~–Þ¿ )5å>Ævßø™=©ºá Õš÷ >8è²§\_ KOo_ò]Û—k¼•Ö:eú£]öS¼×F¥K+ 3rv¼<1,¿¶×@G¬%Žn5’ )R¥Ö‘EÊ^z ê4ÖH¨”_/ŒšÂïðTg®Yióà i;«¡j¸¬‘SÝ<ø2×ò-6Özé6ŸÑAh;¹J½‚µú0\šP‚â$Uáp‹è£”½?‡g'§«Ýø_ S»3YYÀ×DkµÈ ,·–A—?%k‚s€ vOtˆ"äw.Ü`ËMmä•”À*¼‘ç€%vƒÀä`)V@‰Ù§$ Ó›ƒ®‚= WR*á?ÜÜ=vkRîŠ=×ÒŸ¯“ªÏÑ( Q(B‚¥!B‚ @–€©H#qGHáÖ  eÔS”¸\Ÿ'ÔIJm®ÙUç@EJE’h$ ¢€-€€¢P€Vˆ@¶àp°€…jÉ@8 X QE!Q-”J±±|¤õ!Ãܼ3qÕMÓçOÎj'RTÖ(ˆÜ ÕDêÑTÑšÓé,é£ãYÿæÁ¯9/Ÿ±S³L©¥ÀLÚa[‹£¤•«3׋Ϣtz½.¯ékF}.O;«×¯F«9¨á>höKôó¬’OÏ‚InKÇ%D_J§j±EXÅ⬠›Æ:¥òFûëü—«9ìµkê\€qVë.°HÉîJJ›àͪIöEnéþ|nÓkÅ<’“‚N“$›QOšÅ›¥MsØ‚åwÍ€û]…]WËñ‘>-€Š[]rø*’»k5À ‹Ï~äNÛ}krX¡²LŠÚÑòÍ-($QŠá¨Q2ÔŒVd‘Î^«IpíûÄ^¦Rûcû‘êzOöÅrpšú¤í™ì VòEH- +Vì˺ÉY+¦Q+Á´A+ä CàÉ,vN£'a õ`eätd¿Nˆ#Dì€tÓ–v²êÇ—䡤¾›;Fs‡Û&ˆ;ÃÕÉ}êýÎÐõRî¾JŽªšÅ1@(”‰@%¢P %(@P T¤¸›‰GEÀ@(/®ÔÛýÙó&í•RˆdQ@RÐ"Ð E¡@yÁ( /`…@H @à X € `,RD¿ (Y@Å(,”@AEù(–×ÚèÜu¤¾å€:GR/†nÀqMeXå¡ÁÆzˆEè4Эò‚Y([¢ª|+Èi^@5KòVñò\Wätè ?b'o€+]ÏÚõV=€÷Ej€±®{#Jùà ÃK¤7äw„¬—Óªùh m>Ø»ï ie’]> …Xë³6ÿ¥ƒ,}pLd þNþT_É+QÔh €P€!@ 9–¶²ÒXË8CKSÔIOQÔ|•P[b…‘@@4A (©h©P@P€nR”¶éä±+Ó£é㦷<ÏɹD¬, 03'D 4šã³K ‹*ΰ^MA×r^ ½}5Ì¿cC?ê⸃f—¬ÿ÷LhÒõ¯ÿ´_õõÿÓCPÔ'LŸªÕÔá5ð4sß®ørDÛ®ÿº_¸Õ_ÒÖîRýÇé˹Ë÷5IÖçû›~š¾íJüz0ÿ{ah&ñcQÛOÒ®Îñôñ@tŒ#²€bÀ–, dÜA7 €‘°3¸ŽDr' ZKBÛáX¹BI§Gƒú¯ôèzåúš)GUsîQùÝ]M ¸jÅÆKÉ!Éš±ëÒ=Zj™†ŸCIÞ™ò¬G~g¥ñòÂfØjýÊ™¨³¬XGH;TEJ¬„©ž{ŸN/õ½,&³(},¤©fOypëÔ’½Dº*v­ù4ƒo‡Ï$ëÄŠ‚r¬»¯ù3'ãêH,çä©W–¼^Øð2åt©pRŽ[|ÿ“<ð°f?íð½ÆÚ—?O ­ërÉ—+&c×\8ÇOî={ Æü2ÞçŒöÊôå>SK„¥¤ûÃEZK—–¶!¶( ,äÂí–¶œ~é¤)zÍ5ÅËá~§ROèÒ2õuŸ2KàÃMó6ÃR'éÁ¼Û¥Ào0’zjìÒרådÕŒs5%ê7*hÆ\:0éx6§Ú3%ðÊÅç ‡†Ú Ë~9.@–?g–z´•i¢V£@ÃJv,€ Ç_ÕF?FÕ'ËðX•NÛ߬ïØîåŠDT@"€ "€(ʨBÀ¡´¹ÀÖýgQÄ|ž=8ÁTQ¦-vŒ±L¥d •’Q 8jKꢧdE 4°FÒËt‘Gm9ÂZq”2™©I¥i6hq”¦ßÔ±àécH §ªþØÆ?‚þ–¬¹`UéŸm³¢ô¾@×éiÇ™"þ¦ŠÂM²‰úßí‚_$s“æ_±5q.??&ãôAµG5¦ì±!¤»:Æ)pTmÊ-‹bÀ›…,Y,,–AŒîX¯d)øHÚîkðeÎ Ë(Z¸I–´Ÿl#›Üß,Æœ}B—Üš?Ô}+õ^šMÇþ¤2šGçV%à•¨öhž¨#›Onƒúàþ«Ñ~ÔXµñÚ!¦¶“:EÖ&–Vä¸d8wë¯>=ßÓµZÔzoûÕ~Nò‚RrKû—Ž_ÓÖ?¹ù_Èm%ÎhèÊ}¼}O‹ r—NÐD©$ýŠÒIW/¢Œµ¹;µn‚yI?k»|‘V+à —Òò¿à­KnKØþÛåre+‹j×Ô²Š“i*~(‚¨MZå]Ù§‘Ñ]œP’é @KD°Èés@bZÚqæhå/[¦¸NAY~«R_f|‘ÿª’Ì”W°Dz—ß93QÐÓŽZ¿4õc(#œµoŒäcu’Ãkf¢í–'Wéu£q<¯tyVW>)v­Îuê„m¼3²I.Dsí–Óìa«+‚Z¼òà¾Çy k°$o±t‰dD¿`‚(*pFAtˆÐ i+•ÝP!SqâM|u‡©Õv½ÎÐõtv„vޤ%Ä‘°€”( D % ´P -TÅi" 7–´ 8z¹ìÒ®ÙGË›¶`”(T¡ÑF’ €´( B€ò*€ … ·ä½ AÈQ`-дÀȪ¹ä ^l€P‰”%¶QlR¾@Q4ƒVQpMµ”è ÇVqån;CZåí~àuYà´ J¾Nzžž꟔ŸSÓN?kµàæÓO( ž=™X¬¬Ù/- +ÊkÈX(]•ü0*^s‡Ñáû좾£<+`iµÇ^B¤ðY\‘º@/8䮨»ä‘¤škVïI*7‹¡•ȹÉXÃ"§òùX ªà‚Zé•|³/p%¯Éë† ¾ ôÔZÀ2Ð@@aeºE]mwª¿OEc·ä飡o2#£“|Ч"€” dÒVHé½GsÄzEŒÚî•*X*f˜i2¦¬©S,²€òê/¨Ô Ý^:p‚(Ʀ¬tùËð&®¬õ1Ä@ß§×z”jÓãÙ?[ê4¤Ý©&øhº=Ú_Ôã(§=Øê½t_Û¢ÿ&†×«—ÿm/É«Ÿ…ûL©Õ|4¿\æþé6M\-x.æMUL¶AlÖŽ¦ùÊ> x¼š’Íše¤TÊX°,)bÀ–,P².Fm°ûÁ>•ÌŠâºlŸ«\$—«/&›L»«MPAWii¨J°þ×Ê>?õ_éU~£Ó+O2ˆOüž¸ôs­Ç¯Ó¼´y½|wiÍ{2E|6¶¨ TΑ`u°®‘Ìh#ôŽœ7ã%(ò²}xJ3j_Û¨¬×ñ¿xÏôŽZºM7qëØâœyKžŽîDooåi®r–ãê=VžƒK2uoÜòËúŠ»Q¬PÔew´ËõòÿhQQ•UrXÿPÅ8ý+Š`t_Ô4ðé߃¬=nœÝ'Iª =1ŠŸú[³kM.È5µrÅÐ`Füº9Ë[JtÐW)zÝ%öÜŸ²0ýf£û ¿ bZºÒûµNw§õ5[ç飯~Iþ³MqƒõÑðËê\¦—õÞ#Hå/Y&òUŒKÕIôgýD‘ÕÿS/ÿTû@ùê_‚ÇÕ´ð‹ÝKÖ9WÓF«}"ÚÄa뻺'ëKØË¬í?UݦOÕŸ’%ºŽr}ԗɽùß6×OU·“Ð¥h Ñžy(VrÀˆ«÷ {†¬ ^IÀE&xà•î=òJÀTì|—d¢Œ€FwÑFûa(P B€Œ!¯©%kÜ£´}gS壭§>îС@+% %€©H Vðm;óýt¾´¼"Áá|Š%Ñ©Z*@Z-( 4E (  lÈÊT;\H @oÉ( ,  vO€RØ ˜€L¶¡Š2Þ &æ70.ù@#)Gì“Ghú–¾øÚö´54çÄŽ•@@’ÓRåÆ~•k8ËFpû¡~è#ÇÊåòÇ€ v‰Þ@¯Ø©¶íz?rˆøÈXxà ­¥b¬ºÚð‡È †WážòW€›DùÙ8ÿ¸ÁR]™a‹¢ ·„.Û°)—Í—Ô“=~Æzk•ZXÈÀv“œ4£ºn¿äò¹êz©mŠÛHôééÃJ5Ÿ!³* ª(DŠPvô¤·Â*4¢¿&ŠÅPTRØ3IlŸª«‹+?S@fZ‰:N߃?õ%”è úQNÜ•†¡Òl†,iáB¾M~žï¸,ÆЍ¬ªTL©QPIJ‘çôÚ¯OúƒRxš¤X>žã¢jQ**x-šE±`R6‘܆çã÷.^d‘—8ùl¸3ú«¤eêIöTMÍ’›è‚íePJ»@Qh*У*øðƒÖúÊ_­¢ª]¯'–*°ÌtÔz4Ôsõ Ê9íiðZͰ âÀëuPtÍpÌw>›ãÖ‘ïôRÝ¢ãyƒµðsþw:k¹¼½Úr²ËÑij;‹Øßhõ¼ï´–®ÉI·–?«Õý=$òðE|YÍÉå™ãªX²€¥ÐÜuµ#ÄšüW¬Ö_ÞÊ/úÝn7²?Y­þò‚õšÿïf—­ÖN÷"±þ¥©ÃI™—¯Ö}¤QÊ~¢ræMþNoQ²*~¤—©?÷0&öól›ˆƒ²‰bÈ¥€`€‹bÀ—û€ ¶@,]3ÛqL#TÕyÀä dÛª#öDÇ`N<2vì”@ŒÉê…œ…D­¤TcHˆ´€Ôu'¶LíW%÷FÊ;ÃÔé˺ù:)&°Ó¥ÙªQR¤i * ‘t@Yó½gÿ1”y; ( -h¨ P( P<](( @\*J‹`   ª@Š€–T€RPËtÓ!A22P% @а ”}™¸jêC‡kÜÑõQzi£(É\Ze¤Xœô!>R8jzf—ÒÅÅÇ‹HÍ\Ü(WÀ¼[óÀnÙã ‹Ø¢¾21X}k°-.Y8îNW /#7dà—Œ<2‚|ŠtÅŠTÈ'ðh—䫤@5¦®hô¤f·*–Pç«­(ç/¤X•Â0Ôõ2ß©öø=IF¨¡V%‚(‹ÀAB€HA@€;)EDž‘!{é–1k°+!@€€j.Ê+²6©ŸÔWô™“·VE)nìÕym‘qRED  TF‘QJ0Ø”´ë^\§ÐkB_©¥W(ôCÒ“I‹Eä€_„G/- 2ç,ËÔ]/Ü#?«#.M)—k¨@ ¢Z ´ @, g—Õh'õÁSïÜ–i4w)¡®Žn…«Õšñ&f°P $áÒ,í4°mý·àM‹Ïª™êôSÛ¬¼K óÏ]zñô öá¾ë^Ygµæy5ÒÔÕ”ü»>Gõ9í{?!_0va Al `, –"Ø V,@ Ø§§AÜVB»Ýärk²)^HñÀ±î¿ÿ€'(”€qù Qû Œ¿qÐT#T¬%­Üï¤zhB€‚€Pª€€£)Gí“@uªœpé¡ê¡,<2£²”d­4ΉàP  qe`Fð|ßWVQæ @-*@R¤-(ÐáP@:(¡P¡^@©ŽY@” ` DÑ-l‹@Z XP%¿  €, /À°”( |•aÚn%aê5#÷T‘Ú£N\½¯Ã(ëÏASYGúx¾0Æz3Wðr·‡¼c‚‹âÂyÀ ÐwÊ ½d¶¨¢>l0*Îä 'Á0ñî¨+äÈm5Àè?(¢,tÑß"ðiy%0 –Mõ¿ƒÐf·eNÊR(v²/WÒ(óêúªútÕ¿$ÒÑ”žý\ø-Hô7J—Y•, B…:R €€((<OsK9+5Ù$–Ò1[[ì0Ž$¢…6ûÁµ(® 3)g'¹{‚6– ¨Éj_FZt* ¥H TE¥EU(E ¡'Ñ¥ ß2 6½6Ÿ÷[:GGJ9Žš¿%FÕ.0]év”“àè¸5ÝÙ7øL£.^ZF^¤{—ì—ªº_¹—«.©—9>É–¦@»Mm ´(  X°ÀY,‹eÃTÀókh¸K|cŽ´”“¯&,jWÅõQ¯Q?|œŠ‹B€p0ýþÔtµÛÏN—¥õ_e|è¡›û¤‘Ú†æMÒ>›J A¦€ç’‹ Jdšö;ÇÕ¿ïå¡« ý²FÀ(Ñ™iFWq†§¥µôÊŽÓœ9_°FL·»þ嶨7•dîKæønÚeeTñLµÏDÏ`L~Ì·C,€Ýe‡ÇñC=nðKÏ&h€¾¨Whº¶v1[€²(Ô’Ò…ÉþõuuÞÕj>¤z4}:ÓJRäë)xàʲ,l (‚( A @(€¡´–J•tôÞ¤¾¬Dߨ[u•aU"±h™´Ê‹` ÊQ]˜ÜE7²[(º8ê}ËäÒ,Ü3fZ+%H XÁ@¥R¢•E¾€ÚƒìÒ‚j+Á¤T[*`U»Á~dÝ-‘ê.¢€‹RM—KY¸ýIÚm…oõ_I#/RO³L¥¶)]¥Q ª% -@ €X°°KbÀ¶, ÎæõžóIHø¾»Nk^ö¼¤°Žpôúóût¥û^ˆMõå(¡ý.¾ýGø@v‡ôïOS'hú}}ºh¸Ž‰%ÂKð, e²‰lŒçó$rŸ©Ò÷_ÀW)úÔ¾Ø3äú½OÔÔm•pd N€YÁl Q NE„ i&øG]ÉHŠõ®3ɸ+Ã*ã2ƒLÍ×EdOÉ)ZÍ:^ã#ªQ/@0ÉБöD|„B4 ÃvÜÒòÈ=‰Qh!@ªP ‰B€ €€@ €*Ž8(Üuµ!Ä¿s¼=cX’ôCÔiËû’ù;é}MÖ@²0åó$€Ä½F”¹3”½bþذ8ÏÕN]Òö8¶ÙD ( ¤i(PÏ) ` *Rb½À†B€"×€ÀE€ ,(, 2‚‰” a€  ˆ[ € P ((ùDÈØ’P€´Ÿ%4X( P €+¾‘ÖÔ‡׆QÚª/[YÞ-IZi€*‚•dŠå= 9_ÒpŸ¥’_K°Ž2RŠú“L'`WË%d ŽÈ²¾ {‹uîå{•Ö~šÁ;vIU„×l¢_Ä™oË-^J'vNˆ ù'vüû–T½ð}ZvlÅn(V@B€œu}FËI~KçŒ'­+•ÑìÓÓŽ’áX¤¬£‘ØA(‹ € Y*ETºÇeÓŽùepXÍ®ª[gDõN-ŧeaÎ2¢ï~ÁM϶Fì€Q@§-EÁ¸EQÖ ¬ŠœB(¦’°(šQ^Ò^ÅH $üP“è"ìó$‡Ð»°â¸îGªúÀr“ìS`UÍ-4QHÓİeDª&Ñv–ˆZ  À‹ØÜ€om‡¼¸¯ØU E2çó%ûÎ^§J<;~Æ?Õ7öi¿ÈýmyxŠ2Ö£ûµ^ÁYý8>mü“dW#–£u“æjfL "€( :"ƒ²€B­€€À‹¶ÀÒƒgXz}Gý«òYö—éÝzmM´è‹IÅå–Æ¸ûirjo„º2íŸméÍMT¹38´é®JåÜÊÎkœ0™¾Cv€{QQ2€2>|’€2U…J#À@œ…GÁ:'_O›}"M (´JÑ(€”(*P¢"¡ ÓO[SMÜdÑGIz½i¬Ê¾R“o-, ¨ T(€(QAÎP Ø&[ò«  ذ!@ Ëж €À  r…LU°4¯”°°ŸQ@;¶ÀµfxØL¢”VËd   € Ó¸·ŽÑõ3Ž$­¡¯§>éøeG[ÆEIEKîVqŸ§‹ãyõ4u#žL]sü„ò?€%ÚÏAÙEYÂä^0FšY䦲Wwð¿(¼€Ú~ÀWVO`Œô×"Àaöeé†!sf@@qÕõ…Å+“X9hèJr¹¥PU7lŠd Pð/À  TG>R_’Ä®{ë‚ÇR_î䬴Ÿ¹[¸ÐDBªe)P S–¯+ä‘X:,&eR²T€ÒEH¢¨³qƒðE¦üý:å .Ø.Û.è®"ýGÕ"9Éòʉ–(‚×’à(š.ïMÌ©ä ¦i2 ÖA  l€lË’nDÜØ‚*‚¢X°2Ý–ª_Û&ÀÃÕÕn“ü™kÕK¨Å—éõåÌÛ Ò>×ò mzlpÿO/÷ÕÿLû’é¼ÈÓGýÆ_§û˜5Ë[N1ÓvìøšŸs¡V0   €`  U ,*Åv²¨7Ð\miIômh?!©ËqÐ]³_¥Ñ[ÆÔRáQèÓw\¹_8ë8¥ÎMÙôåüîW(Óejòq¯o?iTìôCþ¬+±þœþ¸Ê-<˜¿ßÁ§œb¨tN@œr9ähœ€èRôö«È’(Ÿ€¬¼vzô#·Myy":Š(P( B€”(Ñ ”J‚€€€…BŠBJ€  €ÒEP œS-!Bl …°€  €…(*Â(L(˜€,  °Š@)+ \‹`\>…{€¶\2€ Q) Ÿ /È  ð/ÉB¯‚/r Š2ˆR@PXÇ‚…‡O 5ÏOí—á¡ê—÷ÇòŠ;Fqšúd™¯À@£ÓŒ¹ŠŒý7ûYÃSNpy‹ Œ|a‡wœU"«Dyv w†WÛÉ• &ëગ Jx¡^àù ·€Õ¾@õ%„¼"˜t sÕÕPÄ]º*9hè¹}S;¶–"E‰v8(¨¡BØ@¡Eî¡£‚Œ¹^Ç“›mšd#ià¶J€ Z*@Z9Í}HÐX5´Ê´´ÛèÚÑ“ökE.diGM{”]Ñ\D~£ø97Ù ¤²Ò9þ´¶Çê~U‰z¦¤â´Ý£zSÕ“¹E$[@Z-K”¢ùLê¤Q¤ìˆX  eµäæ—f^¢èõ—6û6K€*)K–Žnl©E)3JM}õà"ocs¼­ì»Øs€Y77À˜l7©—ý6|YòJÔJeJˆ! E@@ @¦]¹ ÖÇÒ4´¤ø_¹VrÚÑòn:1 N[Zp]"¥Ào 7ús«Û¦ëQ&ŠÍ¿KMò”%š.“¦Ñ©ë•ûå½Iíƒg5o-öj¹ñX•³{¹ñnË8»AzûŽòKR;—'™¬ûšy,ûgØ5X"¯:É:Y ÷dª€te… ·I#Ü•*"((ZP4( D %€”( D  H¢€- £@R€ çT @(P…2˜ÀlXÀ .•à°y#AKe°…€.h î  ‡ì°-”P9‘`PPÁ(€XÇÀÀP[P[•"Q(€Z(œpÚ~ÇXkêGŸ©Ú¦ÃúYÙ4ò²PЧéôçÕ?'zYEý2ܼrqi}Q¢^[¿‚.Ê)"a¨ö¦ž82ðò\rOòßì>¡DVn õz sl@H¥uu«é‚¶ü ={õ3!R7)Y P@*R *ò 䢭ðr“zÄ?ɨ”¿Ù ²² TRÐ"¤’*A¢ÑF’3µKR)º õ(iÇÜ»¢¸‰ýGÑ7? €±` '¥Gr±EÜm06¡î­ùf¨ÐT̘!-¾§Ù£×E‹AáÑbPYP°P)’å™z±]ØzÞ¬Ÿ°r“ì–ü, @ŽqŠÌW9z5ýß±—ê—öÅÈ ?Uªð £òeËZ|êWÀG)Æ]ÎLõĶƒ‘Qœ²Qh( ’À ¢#1 <ž±Ö›>C%j%äY•,¹J/ (€¿$ ´]¥äRø7 7/‚5&º­Ù¥¥¸+r4¢—´ƒE‚†”&Õ¨²¢ìuÃ-J è KRn+cã”gõàßýH¸ÉÂÖãúêQxgd–ëÜ©•? ezx<ñ•C’ßRÉÐäöO½-M’ÏMh&·G‚ÇévÌü•É{Gwv9îý‰@)ÑŒv,*?B;zhÜœ¼ !@€”F€ 4JD ( Р@ ((´€ š ª€¢À(’ `0( >D(”ÀR@R0*%r‡È-„,@€ŒãÜ`Øô_‘@”,W€'à È€b€´Xh¨«Ø¢¶N@¢Àv€|¡J?lš´=T–&­yGxjÂ|K÷(Ø â¥Ê³Œý,%•† hNëØå›¦¨"'’زºù+(p²“^>H×@1-û 3Žl`Ö èæd«Řl=ú8ÏUêKfŠÇAÓ„tV3/%nÙ@\°(€(  )à¥NJ*Ûàܦî\.ŠÝüdRJ*@T$H©µqӓጻ¤kô¢¹‘q­8ôÙËÔµ¶ *© 2L¶‘†„í`¹Ñh€Qh€(˜l£Ë¬ëR/Ü÷i=úii*|›’Å£Q@  P% &ôˆõ< 2ç#-·ËP ° KRæiß«Ò]·ð—êïìÓ“[Z^"–µúæÿý%å¿­F1_Új©áÑ«å½ÊŒLôÃí_%iÊŒòÊ"¤Ðܼ”7/$Ü€oDýDýD¬@ËÖ¹ÎZËÃÇêõ7AáŸ:D­FGA@X ¡Å`P  .ÑH!’€¦j.7;9éÎ;aŸ“„•<”oKOs¾JŠ\Û™‘¸IEÛVI4Ý® ¿¬Ø°©eäšZŸ¦ïj&çêg%á{HÍí·Ñ·ÝšÏ§/—ùcS´ò]ï‰EI®¹cVØ¥EZ0QRry+›Óp›Fzj¦×àƒ½Kj 5L…Cr&ôÞÆæQ3䀒å¤s—¨Ó3@r~³OûnOØÃõsf—ÿ¹GàŽ–e¨ØTZi>/äßÓþÔ‚ 0ß±ü— 3Ȱ¥û…î™ÑÝ?¥|%2Ê‘Q£Hl ±"ìEíïªÀrÍP j7Y0õe_oìá-ÍÚF©e¥áh®û›"Uˆ *Ø(@AAP¦Ë@XéÊ_joàè½.µ_é°/úmoö3pôzÒê€ê¿§«_©:6ÿ¦Åý³þ$<£::~“—µ{4½¦¬®z[ìÓþ¢£N)„vÓôš:nÔìpõž“J_SŠKà¸GÏÔôïM}9Fc%܈ïøÃjÀi8Z±l AáûK4Ïn¾ºaó’.hÃÑøè£žžålmQ‚‹wL®.œ&x癚¾'óŸmÄÚ9=°e¤V™c‡ô¦+Üʲ¹û–“4¾ÈX%ä{#éÐ0' Ç@Or8[§¹p ¤(¤  Q(Ñ( B€”( PPP4¥ @åŽLª€ –¥Š-€°( %,@Bð @!v°è¨ð K-€ kÁ2€¶Px#@B€l…(qÈËj€Š™[ð¿akÀ ½È&@PV¸m¡ê5#†·"£¬=D$óô¿sªwÆB¨ ¤ 9jzm9õGž~–qû] 8ÉJ*¤š3òë#àð.€—‡‚VS«;i/¢ü’¬t!†À ¨“ÔŽšmþÇ=²Õ{µ1r¥I`Y ž€ à H¨¶©@PÐ@ìç=N£ÉbV;¶CL¨£IT¯£qÓ“è‹FW–‘µ£ä15µ5ý¶iI.."ïl[(S.ß jTˆ-‹Y‰³ ;E`P (,(»Wl £Õ. ÉvG8¡‚=Aú¢ˆäÛ!@ 3-HÅfi~J9KÖhÇû¯àå/]턘~«Uñ“ž´¹/`2á¹}S“ùeZq\$ªºA?$E¨ôÅx`-¬2<…U"½Â'ÀI¢îO¢† dM5àíqE‰[H©H´!GêÉkì¬y mͪà+:z³•§Á˜ÎU¯€:è¶Ó¾N€eù0åGÏõÓÜ’< •Ppd @ ¨ÙEP·òÚ×X tá ,Ιžp¬#Ó¡»IÛYꇨv“IÕÔ–’Ýi£”}f›û£E¾Ž®.ÙßOJr_Oz!é­-ìí (Cˆ¡ƒu@ cR pq`–õ?NnV¸<úŽ2–v‰¶Ý’:{ŸÒŒµn6½;\´ƒôòå4\sù¹J+Hé.  Ô>ê4©?s|¼ÿÓԚɇ§*´ŒW]úYBrŠ•5$i?ÔV±.Í95©-°g–9c¯þ^º¤ipsz È ¼/’¥K’¼½]©I!ÁYL¡Q®ÂjÀ`™¶€ @Gh”hØ ôwô°Ë—àOB€ % Q(Р% P -@  P)@   +å‚*€!@*ÂÓP(Ëx  †È@R4° AkÀž…€ Ü  ´ÐOÈ@@@ÀØäPä (X 1@@@€À¢[ dü\>‰”Q¾MGtsPcꤱ8ߺ;CZáÓðQÐYÅ%Ë”™ÃSÒB_n8OÓjE¾ÑÁâð×È)xò@ÊGw„ÏDSQJ™*Æ©øcl¿ÚÌ´8¿ m~Ùxeà`l—ƒ3ßF-·ÁSY‡§’{õ”ßE“— ‹P©€PJpL   (P6— r”œ¸Â0åàÔfˆ©Uàè´Ÿ’£KM.Yµ,ÐÁ¤Òáw‚¢¦ÙReQ4¢ˆ-"lTÀçtFuƒÂ4R ,¶ŀ܉½ôÜÆæP(eKuË@s–¾”9š9K×è¬+—Â*9K×·öiþæ©õñ®mêKîÕ‚~œ[ú­ü°*„WÑ*ªÈ/ SmÂÈRÚ*aRknúlFFšu䊻2Iž˜/¥%h"¢Ùl eL¢+Ë'/Öªú|’/QkÊ×ÓÐÜë ø4·là ÛŒêjm~BÉ®ÖÔ“«Âàç)2k¬çOPÏ;%búˆ?˜Š£| ¸ÚÒ~(Ütå•©ËÓ £¦JÑÕhij_鬅Ìgý=Ü^ž‘ÆEÄê9êi¨IZÁèÑÓzKõ0Û–¶¤æÿÅnwU&ÀõèzOS¬’ÚÒòÏnôxÝëM¿dîÒôš:_nš³ºUÁE ;úŽÕ½.y< Wn|]89ºèîÚÓUF{¿„g|›jÒg MÌC\Üpq£4GeŽfœUåšåÇúš‹éL’ß$œ%XÓñ‡þ¡v™„µa-Õò­mhÊ Žz|Yž?œvEF^ˆ¤¬„ëê+É ò+Èo4Q Ïñ‚¯p¤N@7D°ã°#»É–ß~ÀgƒÛ¥ šiС@”@PP!(€ @J¡@J… Р)@´R@>PfZP¡@€@ª,À BÀ ÊaXÀÂ……„,¶@Q~€ øŸVhÚÀ©? µ/ö²‹µ¾†É.‚"‹eØÂ›Ùž@»=Çéû„]‹±±y"‚fÖš. ~Œ|²?Oó€kp‹‡v½ÍîÈ)qPÜ]ÃÌÊ—1DÅE¥§þÔ_ÒÓÿj‚Ó‚þÔ_ÓÓ¿± dE¥á x5ÑpG9ËOÁ1\Ü&PÁ c{]ž}kz™é¨æ 4X€¢ÀU(•(U(ÉG–rmË/‚È–¦Öý‘TåšeRƒIÐF·%F’lÒƒj”h $T€¢€´@a\—ÜΫƒ ÚJ6˜8%¯%Íxq77p!¹” E‹(RæI~Nrõšþûø“õðþÈI˜—¬×—Û¦£òQÎZþ¢\ξ 4å÷jIT ²—îo }¨ƒ<P%[~@·ä˜óA ¾R ´ÉT²sØ (ˆ*3NL>ÅðX•E••±`,©”P¤( @ZÍíÁå“#¯ 24eÑäõž`ãסR°Š£ù*ƒo,ÇI³¢Ð]°Ü奤—F¶ÐjLi,›ûV9 ‘tø;BOî‚)I9ÊjÖMÛXì¬9ÏêƒN6׃1Ðõ:é(ÁÆ>är¯g§þ– ïRM³ÛO¥¨+ø޼pR€( `rõ©¤×}Q5&…uâ»B;!î)´e‹÷RœY»¦i+ž®–åk“ÊâÓ¼]‰GUÑYX/)ý'Ñ(Ô+“‹Š÷â}2â×m)G»FVÇG,a4Ö ZáÑØ-Ïú_¡ºd¯9Õ" ø 22ˆËÑ%H<Ú<‘€£-` § Ú‰ä%A@H@¡@J‰@(R€F€¢€€ùE2СlP…, rP…€#@,²ü9/Q hX€§x'`@Pe²Å[ :þ‡þ¢­ r\EÿN¼‡éñ†0aé5Ñ6ù@ZA(øc¨ûЇ‚àª1ðZ€’§„´ùEÇ‚ãÁmxC@Ÿ€Øä™¹ÙFvHm—dR˜¦¤˜*ª‰¥‚@i"%l&Ql¶@²Ø Å”,±`hFŒ8 9Ê5¾ó5ËÃeà*(ä”–è+@ fsQ÷~97nå–,Üb®J“J6m@ ­?ckL£j”B5B€´Z €€(a\×ÜΖa[µµrú•Ñ£eÜü“p Ãs.!l°*(nIe¤eëéG™ 9ËÖé.-˜~²oìÓýÀË×õíDÃýI/«V@OÓv˲+„šîÅ ü¿#@~ € 'È, ˜°5eÝä!QhŽ NRüð Rè $èôiýˆ±*Š+"(Ò( (ŒËXã«+8Ibú%uåÏu!—Â#V¼ž¢-Ê©œM®Q+žmii!¡,ËðEœº-(ÄÒ. ܘ (˹¼ÒiARË9”0U'+¾œ=F­5òzô½ÞuZ¿b¹u~Þ¨ú}8»QVtI.AΨ(€° , ,*3Á¯éãú÷XaeIÇM,£/gX3QÏV4­LF“54™Ë[M5¹9¹^fjÒÛ¯¸Ô¸f êtÕ–¹ó~™zÝ=#Z?ý²bkÏjrÁ艚ïÇŽŠ7’¼ÿÒí@°Êæ ì‚w€Q9^äyMvØIÀæ€$ä ²0B»úXÚs=!D¢@@@ @(”‰@¡@(´QR)¥ @$peNÊrEL@`P€0 @@P¡/2 >¶À@`P €5Q`ô&jÍ"ÙS0ÒðÚ‰µÚ¼ ˆÄ6 ÚpC` ¨RB€¢€µì6v¨"ЪH”¤)[*H¨ FE @, €ÚeÈA0á`aé³Ë®ªtÌt×.`Ã`°RQ`Eб`R¬MÎZ™j<œÛ¦û~K§&Ô[4ˤtäú:GIöHéQÑA.Š*F¨"Ѐ€ P 便orFTÜ7 BÈQ@”çó$%êt—wðs~±l/Ôë?¶)/s.ZòçR—°boꔟäª_Ú¶®‘SkŠ”,!‘AJ%oÜE€°Ù@€èl—p EXè µ>ZI´Žúb,JØ+ TQJÊZðŒ¶¾Hõ¢¥Y]95“?ªà+“žëÅjQM]¢WNiÂ+*Øz®þܬԔÝÅ¥òrzy˲,lOØæà‚µø«:GM¼¶KX½ckM.(Gý¨šÇÉVœdøÁ·§*ƒ“§žq”^U›ÓÓž¯OäÓ§ÉßOúcnç*^f—£ÑÒâ6ýÊçzwJ¸À+(ÀX°ŠqׯûA^-Wƒ)™¤ZM4ÙÁºÁ+|›)-&hۛͭ ²¾ŽqtôûŽ»“8ê?ªÑkÿÄýIsm;Hš^qÊ ë³ºX3]¿ŸŠ^éU;EYEy:ô䘬•¢ N¬©¯ÉFIDÈ(X 7û Ù,ÈÀöéGl"Žˆ@PEAEA‰@(Q…¢ÑBŠ€  ’ ´*ô(!À­±aBÀ'@ ÃQ@P­€´XYl É­x'! -x`2…@Ååv‹7f‘lÒ>@: RB€P (Œ 4@ Iš@«ÿæ~ ô×.ÃaH ƒ– €(” Zåœç©iÖ#ä°b*RUº:ÃÓIò¨¬»GÓ¤uŽš]Q-Z(E€(²9%ØzDßìÜÉl   ’å¤%¯¥fŒ?UíN@eúGöé×É—«®ûQ^ÀeÆRûµ$ÂÓ»¨Åp‘«U…h ‡ÈàŽÀp[ØäÐL@ ðJ*OȶºÚb€–7²€‰Ÿ.@Y@Øu{2IèÑÿå¢Ä­Ð¢² TQlXW›V1z™Y0å©U"’ÞðsZ‰É¤ˆ¤ew‚û£ŒÒ»F¢ÓYf]`ÒO –V‘¼ñFã¦Þ_¬ZꢒÀ0ä©2¨¹:AÖ•F£–nšO-Ñdáéá¬ê’K Èš@€ °)µA?Ô-®ŽVg¦¢³†®%òEž±¸ªF]bΉ›ŽUD¥ìòK µ¾/ÓY¤ÌO,϶D•Cä‘{ñ˜,šëÇ#3akZ\¦ÿ£Íצh`"¯ ^IÂW O”^¨Eȉآrfô£»Q.–@ö®( P@@€ A@Z%ZBŠ@|²U @ „RØ@€(ü€(X°(`@*’Âà(*ÂJð8), ` ð[ X‹Éb;£IšF‘¤Â)¨   ¶ P@# #H R€@Š(½šL  (Œñz¿þbø1Ó\¸ €‚ 0Hè[j*ÙCN2ÕyÂðz¡éô×*þKŒ×U¸I¨Ò K±` Z ŽH›À›™70 È ö-× eêAs$s~§Mweú¦þØ6OÖÖ— GäÖ«çQü"-4þæßÈB+ˆ¢¤Ðý‹Iö¦@b€˜0!xä< h<Ú`B*‘  2¦¡ÀûŒp+àÔm< 4ã· )tv€7ÐÀ 0ëÀ ]€  FzH±+¥‹*,!e°) ¬Ê)òaéFï°'éÇš2ôâ¸HŠç(¤ðŽrÃA¨Î¦ sLŽœ©Û¬4í[:S£6¸õEŽY¸iJoda臥ÜèíOp¬Ôˆê¢—¦ðPP€DËë!ÄæÌô°z,ã«©Ug¬cÀ³.­Å"ÍG>›<úѧ~MzÂj•äÌ“ñƒ.Ÿ¬œÜ¥¹&Vzt³.Üø¼# ÓZX‰Ó—eyúôã—fZ*4ž%@L.ˆ²š`òKÃ`­$Ê!—Éìœþ–-''Ø„P(!B  P (€    ( ùD2ª, >B€ @P¡(%J^@)0€( ‚à_‹%%…zQQ¤[**e°P*€€(À a@€B¤i@E€ ˜E<^³ÿ˜¾ t×.æØ¤Pìàì B°1)ÓÁ•{•»“èÔf¾§…EÊ€(P¢Â‚ÀZ&ä~ ¹-€ ¥Ë0õô×3ÔǤÙ¶£ûa_,Þ³æIØß2oòZpí~夾Ԁ¶0ÀW†YùüŠ]¶‹wÊH4À… ð-QPpèX·}_<…€‹†+ÀTdh n<2îò'È£æ†W &P@( @X¼rvÑôÑbVÈTP5ˆÊ¨Ì°!–ÊG9pJ±ÏS19vGX¹7¦·K‹%[^¸hÎKéX;CÑ7÷Ëö3&¸ZíM§í³ªIpnDPhP €P=XîƒGÉõ qt“¢QæÏc’+qà¬Ã´fâËéÕ<ÕWlO\aß’Éý9#wýœ”w3–¤¿+€u~×A¹a¨Ë¿>%’A›ëZ}›iy²¸õéÊwedK²?p×dòä‚‘ewÁ8÷(²¤@3Ý#ݧ±H Š*( € €€(Q€ €Š*€€`(@•‘~L¶ {„ Š>B *QBä À (@€@PÀ w’Ø |€€°ìW€`W`K,9EƒÒ¸**4Š)E( P(@`@®ˆŒ €­"¦J€ A¤Ê™iÂ_r²t±çÔô‹˜:8OJpæ7ðsoX¼‚( ² D€º1)Û¨¿Éb&"ñ—äíé4ܧ¹šeôb°)@ Dr@7w° c$P`°%‘Î+™$TbZúKû¬ËõíƒaSõu "5¨ùÔý‚#Òvÿ%PŠéj²‹~@_ä|ù Úèp4Z÷qÈÇ@— `_¥¾Ÿ!P þ@¶Ÿ±hÕ–ñ•a+à Bd*¬ô( «±µ.”8`TÊNˆßà `,–Ê™¡~@ƒÑ¡ÓE‰]6¦  €¤* `e™a\äs|ÑÎwXM¿a§èõõ]Æ+Ë2ܸõéLK:³oÙ½= -5Q‰q‹Öº"—  °%“pp°(´rv•` PózˆZ`|ý]Ö91úÍ™Œ\[²ÑŠíÍ(ÔD+h¯Œ#—ëÎÕN‹/´ß\\¥qä̵e>c—Ö´£´êÞ ½ýG:bEfúÞ›ÉÒ¼p#—~¥;¯ücÅ•€’÷à<ÎPÉ+° ‹¼†«"äUqÙD¬×á­îÔWÑíH € … € „  (€   ª€¤åŒ´B‰•„ùRfù €  £à"€ KÈP¡"œ€ŠÈPPTP¢Çî,…ÁQQ´ P° PP,* @(°Åš–±4   /€Fé’¬9ƒ5\ç£ ò³ìpŸ¤’ûü™Æœ% C”dŠ@P²#tŠ1n|pFÔqÆk1VëÉôý>žØ¤TzJ… &äG2æL¾Â€°Å× IjAs$s~§MpÛüeú—ý°lÏêêË´‚$”ß3‚(Fò›ùT—_€!¤>FæM2à µ€×%ýÌÝl©€´ù€`%á€Ïh–€×ò0 ú[¼¡‡À¢SD”AlýÂ`[ü•1eM€*ù†(¬.P¤øMv‹µ>Ž> mrܘJ ‚¯©XF¶/46¥Ý€i}?Ù‚Ä®ÀÒF‚#AHU °2È‹CR|*:CÑFîrü×¢Zpû`XÄÔ)@ (°™l ÐÝ| ß%IjÐY€!@@†5UÄ ãÊ<Õ8¾èƒiJYg)EÅû±®hX™t®ÑEq7«Í¬ªVfR¾8§µ¶›§Ðî¦}×Z^Š„ŸŠi?¨í—Ùc—~œ¥ìg’°µàròKY áü.D"§Ç$·à˜ò§ÓB¡»Éè „€ (€€ !@( P  ù@Ë@  ذ RP N€°aˆ ˜~B€ ˜ßDÑ *PØä @*~J@ 3`BÁýH°zz**4/ P  Pl@ –X Í& d@j&€ ¢€i0(bsŠ•7L•bÙS"‚ˆ¨âŸ*ÎSô°—dÁÂ~›R<}HäÓ\ª2©i€ @Q$éþìÉÒðX”Ü刧EŽ–¤°¢ÊËÑéý<Ô·NlZH ½Ì X°U`FÒåÑ—«¦¹šÔC¤Ù—¯6þ˜þåDsÖÜ—ÁšmýRl £¹¤ÒèÚ‹h†—4¢ -FÀmòFLr;ðV@”2YÐW¸ +ÀÊêÀYlÃr€¼—€d( @‚Ø(•\$ *e†€–Æ@©” žÑrÅPl‚U¢UZ±Á|€EŸ"×`Á×Óæ’Ä®ÂÍ"€ˆD€Õ™DaA°­­,Ücðˆ4äK(X€(°Y]ÝàeR*€)›¦¬ J€ #XŬªMÜeWÇÈçê4Ṝ%êÔ“‹ŠÏc E,ÑÒ1o4s®²ìuŒZäèÜc»f£äõRªTsÂB¯ã„Ó“v«ÀÓ½ÔЫǯB]ê?$’úBVtþê;§Ñc~¤’®Gv¸+ „\²‚å°žXN@®šà•Ø‘Gà•m*å—ƒ@PP @@HH@ ’S*À¶:(€ @…J—BÀ ä ? ,r°h §@  e K¡EFˆ(TP(¡ [ذ#  CQ`h€7©IÍY*Ç(Êpû%kÃ:CÕV5#DWxêÆk5`,¶LËN2åY,'ébþÜ3„ô5!Õ™W'ŽJ£'ÄXZª6½,«2H ½.å&ΫCMWÓ%FÔ"¸Š-ZS™”¢¹’/_Iu™~¡lä¨Ë×Õ|$Œ¹jË™µðv_-²íŠèÁSH0'$¦¿cI 7Á&Plf›´R£W`f¯[k”U "äK-ù[EL ¸ ¼U]¡^=‹ðÀXEǹWѸ¾‡à¡yÝä&Ç䨀ìg´PDøÞJ•€¦‹~PÑ iÆ/ƒ.- ³À_OMö¿’Ä®àÒ- …BL+§éE+rÉ–¯¢…•KJ²ØØ#`C.@L¿b×/P ´pP†55ar’@x=G®Ó¿¡[ò|ý_S=N[¯G+'öèJ/O«:?Q.™‹æ²õå>0‚WØ‹\u®ÑÎn¢‰M¾(ºM¶Û%k]Q¤GR¯€Ö|sŠúÎñ~8+~Šù¬¢nJÀºèrÈŒ”xE®Ð©ä%]»5Ú3šÉD£~ž;µ_„AíC²Š @( € (€€€”C- ,«Å…( e°ŸP €£€ˆ¯` ,(Pì`Ö H€B0 (°z´TPÊE€ ;( Q P) €!PEoS÷¢UŽ69DTÚ®øø7MH.w :ÃÔEýËk;&¤°Óð[c’+œá/µX¥\‡ ñËH ½XG™#ÔAp›?Q.¡F\õšÌ’ø*3Rys“§¶¯` ø}€Ê€”8>@¿ &®€µù%ûS-§È‘xWîZðTÒÚîäZ°Šî°d*¦P€%6N\ H t9|¾™PžÅ0Ñ0ù·Ã$¶P-ùD…0 @ha€ %&™m® 5Émð¢í} ©®cžJ#H%@ULe{0ÉT^å¬:zUô¿’Ä®ôUHÒ‰­©rÀoŠás`gy,¢Ø°(P(°-‹Ì¥Kú²•·Hµ|Š€   P#iu}Nž—2EÁà×þ¤Þ ¨ðêkÎo2l¨âäÙ –F¡&­&kݳ5¨Ô'µàô)YÇV_W&%M0Ó*éSL•¯çë§EŽHìØ W.&ŸGeûôa¢°5c†K#pY¦óÈï’gž€{‘¬€~ ¿ØƒuÕèá·I?9ÐTQ@@€€@ PGÊZ? à" vT€V@ „« »† @;RP 0°ðA`R>€HEL€%BX–XrX=14T  @*(P€P@´(( °ªŠ-€(€3EËê¾õðf¬qB̪®”5•f.€Üuõ!÷-Èë xKº~àuY÷+t‚±–LG8Ç™#Ôi®-þËõ7öÁ“õµJ%F[›æ_±•vþ@»RèÕà PaPÀ ”i0#^ ­r P‚Ù¤(¢eÀ]p¤\¤^¹2VH4“\2”eºèXÀE¼%à |¬°øh©â€‚ëàäc²x-ùRø {€È×”O†#pS  È×c°,ÀZeÊÍ”7X¢RðQj¹Àº÷à_†”ú ·å¼_¹ÓÓq/’Ä®érF‘—¨ú2åeÅ€[²ØÅ€²€(l›’ºÃ·ËÐ, oÁ¥(2’жèókzý=”" RŠ€ ª@€P   ¯•@Ê@ @A ì€A B„PP  À ,]E% ²ù €2ËD˜›4ˆ¥P!@ P(€ØÉtS-„(€@ EyýOÞ¾ V8Ì©` Á, ^Ò|¢‚s‡Ù'ðW¯ª× ¿Uó*ø'?|›¡ÕpArB‹D²”[*@-‹L[ò8àl&“úr\ ååÅa‹e^ä P¯[%”TÙ«K¢ ÏÊeËäQÛàd¨ (›E‹cžà).À7ì7-” T2Pé‹ò€2 +_’á_A0‹h™@&Ÿ(Ò*}Qœ…_’ØEJ>i†«†ßeÁE¡´TòÍ¥œNz.Â(y7¥DªäK* ( @¨  ´MÞS}Š@P -!¹¾ o–i*’8ÀÔÖÓÓW)$xµÿ©¥ˆ+÷,ˆùúÞ®zœÉžw6ÊŒÛ@T5JoéM°=Z^†RÌÝ#Û¥é´ôø_¹Wt?¬ÓÝÉexi˜œ¯j3Ø›T>ؼ:š-ñ9õêY5Á—¥6„7J°WÎ_¸‘\Óø?’«#ø(S\¬Óapdÿ Fe°:zh^£“ëö" R€¤€"@ ˆP!B€€ ùbìÊ€ J Bˆ€¦ƒTTNŠ e e( d„ƒ€Šð~æX–<–LMP@•ET@E%¢€€Pl PTP*Áçõ?zø%Xã@Ê”( Àû ƒE€@(P ä[HS -•d D‹Ñ1àXlU+ð(‚ä_°™EÀ¢ -:+²üUß@-·ÐÝ䮊2rTü¬2¤ÉI€q]jðAQ`±¶¸`Uò@-  Vü”J`¦Ð»è¯s@BR¾ÈÓLË/à `i>š.$iþà*ÍÇM¾J¨Qp‹‚Y ˆ TJ¶»nð2À(”  Fè »Ái¾X’4 Ò¶ oY¥¥U³Á¯ýFrû~”jDxµ5å7–ÙÍɾ@ËbȈ¡ÓOGSQý1 {4½Y›¿c×§¥ 5ôÅ#*èŠJ;¢Ð7V IÛàóK’:rÍä’#H¸3»)•‰ëÛ¦î)›#ÑøP5dN¨±Ëú5øaÓ+’EgYµØ@PP^‰^5d°˜¢ ÀÀl ™pL0 %¨]pÓ瀄üm L ÂÀ¿*€|ÑDR4š`2d“wL‚R| ¢¶èhl” ¡)h"¿YY šÒÏ(wÀ«àÔ4›ä£´tâŠÝ‘–!Dd € ( €°š´\@¼2ýŠ¢¨  )Æ å$€òkQ„1oÉá×õښHóKQ¾ÌÔ¥ÂÁ-d°máYèÒôššR%£Ù¥èá ¼³Ñ¤©*"´¥(<~ºܸìùò%o”¢HËLÓD¢³úôèÊ£F÷²=ÅÞü åJ˵_ŠÐL·œÅûà2’È §‚Úì/ÿ÷%ØK[XÙ¥8Éa*E**"€€ €€(  €ù@ʃ @R!€àr€^á@  öJ ±a A`È   (@Ã@-G€!c÷LJTP  ( @T€PP  PP@ (P%ž}¿ðJ±Ë¼*((‚ÐQ@ð‡[*È ¡†¦@/ÈØr8ØR(£.…€)0ÊÏ@-€”û.zø/@Jð3à 0¦Ê›@[c€Ç‹軯)2‰Eªà€ì[`]ϲ´¼š¦, •–©6•@[IQ–ÀXÙ¨«Ø*”"¢å,Y-.€$Ñ¥«´ÒÓl#KMô™Ò:WÉqPŒxE5ˆ˜l£6€€!@   ”°)@‘} €KoŒvù-P8Y8êú­-.d›ö·õ)¨Š­{¼‘ª(ø_ƒ¾@æäâí:g£G×u«û{a8Í\Zf¹²B€«@ ˆ„¾P2¨P@©…\~@DF `€…”(;@ ¥PEÆB% !z{ *Ø)€ÀìaÊ,˜ph¨…@ @@tH€E@P (  )ç×û×Á*Ç2PLÈ»€T/ä ‚0÷kƒ X§Øü &ÿp–R¦šæ€$Æhz(…I «°ù”Lv€˜‚Ú† ’ûWà::ò´Ê¢P§B€ŽÐ¶¸ü·Øw‚6ËÀ©HH ‚P´ï ɤÀµhÔc`iF»F¡ Ý—xhÅ"º."ÒD|•Œ<fLæØ B@P°AA@Ú@-оJ$>œ X²‹eLùLÒ`, ¤ßB›å¤ŠfsŒÊIMoê0† ·2È·®ÕÔí¥ìye¨ß,£6åŽMCJNi5H–ŽÚqz5kÜÞý=9Su^ Œÿ«qojäá=IJWy(ÖŸ§ÕÔx/,õézÇ3vÉhõCN0_JHÕT…  K–bZÑ\qž³}žMUõ_“:±ÌÁZoE'*g£d<.T”UpaàŽÜxȰڮNÊjò#Ÿt§mÁ\S¬k‚ˆí¡¶ò]ÝÐüò¶ÚË#m¢Œ7feÎH=›I8n’Y3­è·+Ó€<—­éåËG¯C×EãS ì„£%iÚ4T BD@0@ …|’™T(@ „©…@”%B€  ¤€…£à™`@)¶,¤v¢Ð%‡ÜX=Q/E@ @ ((@@@T€@P €PÀ)ç×û‘*Ç0̪^J% °‹…¯p è@ ƒTNÅ_8eø`W ‚ÈÀ¶ ‹`Pv[¾@›_B¼hË&ì”ì¹@^rP#K²%5ìØîhn7›@kܺ- 2Òè©` D`fÝŠl´[òÀD~ÀU&i+UEH ·Îh©·Ù¨ŠÿsqžÒ£¬u_“´5“ä£nKÉ—4sFe46ì€Ê-‚ h[| ûe¤–f¬‹e°(ÒP7x–U "G^ 8êú­-.elñkÿR“Ä"ȧ¨œÛrmœ\›*5)ϧLôGÑÔm»hΨôÒ‚q¼œÞ»SN®°‰ë9?”ßÓFŸ¢œó'HöizM=:úm™ÑÝ$ŠÉ.YÎZÕÁ-¥¨åÙ‹f-:‘¸™ž«ƒFŠÖšúÑé*<¬œšÛùø”rtˆé^=5º|ø•þK~®Öl‰ô¹+%ä6A¸(—O(¯Â5YdV²ø`Wƒ-°#3ß’vœvÅ/ 'j*œlñëÿOæZN×€<±ž¯§•e{3Ý¡ëá:Ž¢ÚÀõÆJ\2•@  ˆ€ @ äƒ* ( W€@¨ ØQÐD(PË`A`P”@ ТÀ– G”XDM€P €@Š ( Š(( (€S†¿Ü‰V9|ʧàP ¡l kàH ;ج´ÓÃo°šîDr`K(UÀ  N€!ÀXìX@ªÝËÈ ´(ýž€¶ï%~À/É[@FN8[°, w”Ëi %µðZ°)©¦¸@,&¬¢ª`*»dû (£ÙXBßd|C`DÀXyGUÐ×1‹}‹4&i3I”ks.æÅ€E €@mfßHS|² $ŠYB.Ñ‹`MË¡–IšH ‘'8A\¤Moê0…¨+~O·®ÔÔþê^Ƒ喣fm·Y~œ›WÁéÑуM>WfUÕjB ¤Ò¬§êé5 "¼Ò›lºzšéN¼—QêÒô)fm³× (CíHÊ·@ (3-HdzŒµ›àÍ£››l†-™T+„ãMœ«Üè±aq’g©Sm–%+9Ю¿Í¥IˆAi/ýD‹ÝfNîݳѧ'`;ÈÏ`JÀ ‹ù²4¿!RV#˜ä‘œX™lƒÑ kìí¦ðʰÊ&¦žž²©Çòx5ÿ§Ê6ô¾¥àƒŽž¾·§uO3Ý¡ëtõiKé~”ÓáÙJ€ @( €”S* (  €ª@)(),€ QÅx  €¡BG`?„j£,9X,G¦%²¢€P@(¨ ¡B ¤…X€€(áê9D«¬Y•9y-(X *`-ä ù D  Rdh2¸©W(¸é€Ï`2r,à ˆÀpP &[>”ë‘l ¥?%ÈB¬¸bø°«ðEvÈ@Éiùgäv•"¤’K »À´ : ‰Öi>Â%+ ¹Ñ­=F¹Ó¥³[Q.ÏKÓ¨´•`£æ¾ZðQ¤ih¡  K°2§Ã.ï7ÈJŠ‚€(]5d)A &Ѳ 5UÎ:¾¯KI}Öý‹ ñkR“UHñO^Så¶Í#“§VKQ¸é^Ûììã9)5HŠÇë%x0õev•ºo ¶wÓôz“û°‰£Õ§é4ôóVvT°’@W8¡åðElPPñº³@±ÚK,#ÖKƒŒõdû%£ßd£¡@Š h#3…¡§£¦£ry:EršI`•YEFT\¥HVø¸íKN?úŽmÛÈfÝJÉPhPy'\ް”š@×$xfeL [‹:C[9ѧ«ghÎÀÚe¶Š9êèéë*œUùGƒ_ÐjiæT’z>«WEÓÊðÏ¡£êôõW4ü2@€ >X2 Ç@P¶,0À¤èð—E~@‚° @ UK(` BØ ¨( F,y,˜ðR P  €(€ (Š€ @(P!@ @@G/Q‡UŽ Ê•@˜ bÀ4‰@8*`R (è*ä0U@kàf‡W€*mÓö°DŠ€6 €(òU@D…´´° €VNYSÞ Á·È¢à v)®ç °€"ç 2ʾ@¬[ ž6®˜©,©€uدJ F,š›5=ߪÞlÒS¨«€%–ðLÒ~nò‰Ž Œ &ëèn© ~ìK”ÈÀ£œ­02Ý;G³JW죞§ÞÈŠ#H£E¶P(‹ %¾…>Àµ@¡i ÞË- )@å‹Á@#¹¥ËÁGOQ¥¦Ú»ø<Ú¿Ô&ÕGéEÁäž´¤òìæäØe¥Hï ·<’«MCMf­trÕÔOìÀÖ¬’¤ÝFsL[¾Ÿ¢œ³,#×¥é4áʶgUÝF°¸( IßšIüª²J ü”Æ]¨4Ë£5b¬MOQ{ž]OQ){µÒräæÌ·fé¥:Áê}:0G@¬ª ð‹ˆè´_f–œQ©ÊªÆÇYS5b9’HH3´Ô"×Zi®˜U^(¢qÀ¿<€n¹D»ÿ€ ?ð»ž@"~< Fý€‹<‡Ã/Ž ¼2 ³œ“à+ ñ‚ÖqyÉéÓ×O²L5×r ŠTÚÁQÃ_Òik[Kl½·¥ÕÐw·Q½[=PÇß5 ´ÍXL J`>ExL€U’åeT‹iò@•(T¢PN¹ ·b‚ H¼OÈ t(6û„¨ U]€¡o»ŒP40¤ÅW>@_”7 º#l¾ÌÊë9²é½³¼„j%mE¹ o„«Ë-J.ˆåà¢e•"IRMâŽzž«KMs¹”yu}|åˆaIêÊO.ÊŒ[fã£9¼"Z:ÃÓE+œ‹ XéÚk>Ä—¨•}8^.mòQc Íý1³Ñ¥è¥/½Ñ5^½?M§§Â¶vJˆ(;íµÑÏQM%&ñìQÑ%¶—g iÎé.Àï¥ «%¨C/Xå?R–"yç«)rÌÚë9rl˜ÖÒÀ]fŽê-‡½tŽ“}‚\³r0ÓŒW³r’Ê#teÍ.XV£õ+FëÈö¤ðPŠ™«¦Ë`K3,¦™ø0øK¢(Ó±·<¹(cÁ†èW!Àr«³,ƒ/“, IrÎm@5Ê<0;éú'¯O[GhM4m2¢‹MT• ¯6· †¥½@ (,)T((@‡>(k##2Ç” ôǃF€P P € vP@ˆŠ 4 *еú%Xä2©Ù@|¡~Çà @JÈ€A”"з@LÀZ¬—àBÚ©y-¦€Ê½€¶FÀ—e@[*4內üŠÕrF¾à0ÀÊ€´@ EÈR]‘ÓTNB”È¢Ú®$†ÔÕ x% (¶äÎ{@/ä dhrFSÑ\Q¤j#HÒ*4‹Õ˜*Á°*(@Ò%·ÕQ*@R (H§ 5r’<úž¾1Æœ%ÁãÕõSÔy‘Áɲ “— t´ŸÕ‚híii§åy2õÒ_O$WêÊO,Æ[ÂeG]?M©©ÓHõizGîÉ-˜Â1T•"…ŸýEÌꯥÊ2x(iJ* ]¶tœ\Õp» CIC‹7DRèãêè|cÀÞHb»ÀŒ €©Ô“>Ž›Œ šüšŽ}ÆÓ®\Ë%9ÏYEÒM¿`‹nq£Ÿé¬Xôð¨Ó’JÛ ÂÔŒøIM#˩ͼW>I'Èè ÜßɸðFø‚K +Ëo² ¾lÈå’ ËD €¸jJ<2F—¨O ÑꆭöÖ37vQDªj¦­y5ÿ§©[Ò†xÿêúyöˆ¯^®N–¦“×)+‹Mh€@@€|peB€²îI”ƒà ð€¼€€¡)eL û (T€ÀL™ä ŒŒ E(°zcÁJŠ@ P  ¤€ ¢€-~*Ç"™T ä 1Úðÿ È²Ú?$¡WØ ( ( ”TüW³PØ E@-!µy°Ž B¦“²ÐƒI“( c€!xá>KtÐ $ì¿! A¨*Fy Ű*¦(D@ †¦\,XÑ)þ”ÀÄ‘ÎÀë§.ލ±F‘¡Q ˆñ+òjÀ¥P&à­òJ…HÀ(T­º–§ªÒÓãêg“S×NXWkšZŽYm³AŽŒåžÓô£ mÚ2­½HAá*1©®ßB2“|²Â›úbè¨ôéz<Íž­?O§#“*ê‘@œ¶Ö0ÊšXå•9>¨ƒœ¡';¬c¦˜0Œp’FèŠÑ"³djðAâ׃„Î&k´ðP€=>’tö¶k–zŸOY,êâŽKɉ~£Ov›fœcÒ°ÌÎQ¦ï‚ç|ÑÎsnì5"éI©,àôˆ ±y+-š\yu"÷:1DTV¼W Eaº X`EÏø YÃ(Žrè’Òü™¥@GŽìË@a£,*“¤5ep=:^¡>ÏL5EGXÈÑQI8ÃQT⟸W‹_Ð5rÒv¼hêjèJ­ªé{4}leJxg©I> ¨( €a@ P €GÇZ` 0ª¤[A…  HQЀä(,"€§ ,à@(€ª‰bÀ!…ÜX=1à¥@ €(@”d€@€€R@@µøD«X2«b€ °^]„B€Çš ½ˆ@¡`,:`J¢¦À¶/À  ù°¥\ -¢XýË`AH~àj¯$ùÈÑ(š¤øÀðF¼? 2°€0Xè¯ K4€¢0'Ê.e îò7*vFð,~P¤Â˜#öa·d°3#›ÅÓLôİiF‘¤P„²‚v‘m-¾jù`T‡`PE³2”4þù"6¯¯Œq¦¿,òjz‰ê?ªEGÛflÛAžîQ宿µe¨åË*äé+;iú]I¬ý(–«×§èárÏD`¢°¨‚Ñ@Ïê'-«“–®³„’k’ˆµZÕK©ž“”_Ôü½$ö«äéDU¢Ñ²6EK!€rõß íÉ+§)À2Ø!J,e¶I¡ õ-W(ý*ÙÕ}PÎÕç¬íJ)YE¬™Z©:jˆ#úõO㯠:xac“x¿EJšDiÖí³³T‹¨Ú\ˆM9R*= "Å" R%"ŒJ)ôy&ªMX²ò€Ö O{Á³Àd…ú'Kcw›"1*0Ñ([Lë§®ãÎ@õië_g¢…GU$ÊQS£:šzzʧù ðëú E^J'=mMV~ÝW ¤žèM5e@@@T @Pl»€¶º(U €;(ÈPWa ‚ €  …¼@‰Ø,@!cÉ`ôÇ„h¨€”€    ,¨€  Ôƒ’I"Ucô¥à~”¼éIr†Éx l—µølŸûYvKý¬¡²^ ²_ídUÙ/düÙ.â&¿´ ¶M}£d¼ ²ð6û0«µô™+ÊQ):Ù¶TÀ€U0-—ä KÈi¿p%(@hP%°-±yb€‚èÉ`-•4ÀP ÍT(T  uÀËü…UDªp@ Z"¢ÐTÈ¿`‰cà ž²eü-’O¦°tF‘¦ZE tDúA&Í$|`m¬¬¢°‘vi,·GOS¥§ÃÜýŠ<šÞºrÄ^Õìye¨äól¨Ãd §C°ÃKSQâ/äõiúþãÕz´ô!¶£¥R7JÊ9ËUí¸‡n;“Èã-Óµ†¹G]M/Ô^)%»-’ÑhŠ—D²*6 @ `ðkÃl߆Jß.@Ë €GO:´ÏFõ–tåÇ©öššŠ5Ýœž´·g„TÇg¨ÜŠ»3/«”Î7§7†ìë©ÔŠÅsZ)3¼"¢°BµtcU½¶ŠËÇ)ɼ–§f‘ô4åº6mVMlI”rC¯‚)|Ù:2C‡väe1yä:¡Š ’ÆL`ë!YhËË2ESqxgm=v°Ê=:zÉ®NñÔ¾Â:¦ŠPM® jèéë/©Sò€ðëz)éæ7%ìcOÔêi:wð·GÕiê.iÓL  #TQ|€e ½€*HÒ`€€T ¤~ÀU @¶( J ’   ½Ç#tN@…%ƒÓ TPø€€°H(€APP¶fŒØ²!òM¨µ¨ e¶Q-Ø¿pè[\0ÊÐ ŒJ%?%îòc|“«¾HÉP‰€(x` Rh¦P'ÉiPªÀR™T«‹ºù Ÿ`.€Xì ¶ø× L24M¢¦˜E¦(Eåjü ¨!ø FP  `Gä´º €" P[¼” ´1äè µ“ 00ÑèÒJ®¨¨Ò4ŠTTÃÄ€¨ S Ô¨€(UR„Õ$6¯¯Œqì¸@2  , Ÿ“J@TÐô PP€÷ `W€!@)"€Š@¨ ÐpXåˆ=1)¤P (€@(*  ðJ¬3(  FŒJ9/l­Å ) v€˜¨†|€¶[@P))TÂ~T/AÍnòZ*®8˜ª§E» Pä!D §OÈ@P@DFÆ…PD n†à‹wÙ(Ò# 2Ú#Mð˜ÓÔØÎšP”#RTÄ+¢4#H¥€, €ÑËV_§MðDíY@^J'êt´ùvüm__'ˆ*E9êÊnÛ³ •å †Ž¦§ÁêÒô)Vö߱ꆔ ¾˜‘[¢€P54·×°ý8Úu”BÑPdlŠ‚È#KP%€#ÎðëÃl¾N]®Ðà Ç-y,f»ÃJ“LëF*’6äêšFu$¨¨ó~¿Ô•Q×QÞ›~Á¬xá*ÔG¾.Ñ!Ó@Ó.>¢9³ÎXÍtÒžÙ¨ê§D«bòl€sÕ®Ê8É¢$Û èÚÛG6¬+;S4´ãÀF^•p]#Dq¥a\êÙ—É»ÇÑF]öfXÀËFZ}–B(` CRQã'§O]<z!«îvŒì#v·ÑÇ[Òéjð¶°<’ô’ÓWtüšÓõ:šNµ2€õiëÃQaJ @   ˆ ä* @(f·PRE°(P . ÀU±`°²Ø–PÇ`,Œ*<ˆDJi€  @€€@Š@P . Q‚£"¢€ € (ËDž$ì"´ ] p2 €ù€PÀ ¡@N ¤ûÚc+°§ÈW”+À ¢©y ¿K.Ûá„Jk À&°-0#D¦Z¼ ÐNBH,½J% Ÿ’Ú| “ðÈ.ɿ쑵¡ªøƒ(Ü}£æ‘µèŸsÚôzÝ&Í/K¤—\Z:K*µÂC'$»<Ú²MŒF‘F‘QQ@&€¤8å])©ÇÀ¬X;ÖÅÇRúgšÊ À©9b)³Ñ§èç,ËŠõiz]8uoÜì’J–4P –RhY ¨@(€}D7BûcÀ|t†Ž¦§¥îz´ýY›¶MWªq‡ÛЀh6—,*no„òÌè¼p¨:d‚ü—/·Ø:*w)#ʣŭ ³d­òåÁè PˆV  ÚÚq׎ٿÿÿ^M=ÐÏGsQ‹ëÏêbš´qÐÔÙ*3}nxôýrÿÒ‹5ÞJâT¨¥@ókF¤j#™¸6°…Hõéq“¬Y–š1ªÚƒh¨ò?Q4ù*õ2 ëKÕ3QõIr­?SÐ^¢!t–´%1œ;`Ó||œõ¥?¤,p|’DRÉdÉÐ|†Â¥¾åadhŠŒ€´Xk4òztõ¯²£¼uªV€Ôw$¼p†¢©ÅåÔôÓÒ{´¤Úð4ý[‹Û¨©êޤd­3@PP€T $hR@ kƒJ@jÊ™Рc( Ÿ‘@ 4€ðB€@0™` K¡¨…¨@P @  PU P@B|Ž`È ”‚YJ€)8M}l e-&©~PøžÀ€¨P°( ‚ ŒA€M¡`\ôì_°E¾@¶Ël¡¸XD"‰”¨…º ¼‡h šßP›Âƒf—¦Ô}QF×£ŸrGHú5ýÒ±†ºGÒé.›ü›ŽŽœxŠ.&µIp€Ä-ÑDÜeÈ ÞJQ–F@³-—%äËš¢^—sðE<™ù}®3)%Ë9ï[ªÍ£hÒH¨¨ ¸*à P2à·îìØ I+T|­m9-V”nÀÞŸ£œ¾ì#Õ¥étôú¶AÝ*T‘B€"€ (çîEK”º¤UÞYP€ `sso„E}»C«[àÜyDÓšPÏ%S´R}D7FÂÏ^2u P« 8É3¶ºR‚’5¾¹úymy=Rºúy5ë×7 J/s<®á?È«Ý)9EYЬ#’Fa©á2Žˆç¯ˆ)Sɤ{4_ÒŽ©˜WDfjâÊ>f§,ņ ÅR»½Æà«¸nn,dØX5|µ?Ø£à„>=Àœï 3„à —DÃàËY È¢2k€;iëy=ÕO²£¼u°’`a;“f€YM(jª’ü”yg¡«¢ÛÓvézµ{gizc5%†h  €@ ª¢0À(, )ù4¤˜ð8è…@ BdX(@r¡Q‹ȱäAÝpSH €  €( °@…„Q@A*ŠIpJ9ƒ"ØR° (Ñ@)8M\Ýy&JÑe° €P°º €¿’[ ý€YpÀP0°²û ÀR `[@àQ"À4ºQT›éšZzˆ2£qôÚÏ;N‘ôs|º¶½C¤}6šæØÄÖÖŽšþÔmF+„‹ÃEÀ܃’›ƒ‘D°ØÃ,€ ’*Ñ!d— U>û“Fo4pµ·=7-ÎÎ:,õ$âŒîú°¨ìËÒŠ€Ò-•| €¢€© p”aÅ)Ýr(Õ  €ŽQK,ÃÕÿi5M³—.F Ѳ,,bR|"+ål‰ó”w\œx3?¡¦ù(‰¸êx‹ü½N-0;§|F­âÖ†Ù3“3]`J@ ,ÛI,Jå¶[ñÉíÓmÅ_&£4spŽíÕ“Lµi°<ÛÔ–ÕÁÓN‡ÈWQ%qh¨òMS2i—£ÓË£ÒŒÕį€>fº©³ˆ¬!lbÀX°#‘½&êÂóëy'/$l¬‰XÏ’`2Ýô@€#Teò2EF£7m=o'«KVÓ*,u(騲€9júxj.)ùÌôõ´3’:éú¥,K Dd¤±’”@ P@ @@€|eK+ ÊSeS[“.<€x @PÀ´OÀ €l v¸##Ȉð^Í P °è @ (PUIà”`€Ñ@@(á/¹‹ €•àä´À…ää Á­À-1^p2E€©€Pƒ¥hˆn*Ï þÅZzˆ³¤}6«å$×¢—rHÚôQîMŒ5µé4×*ΑÐÒ\AT"¸Š5ÀÀ²YBÉ»! ÃqDÜ,,¡¹yo^Iúˆ ú‘'ê{?Po`MïÈÜü€Ü, bí«Í5ZˆÌ±4yëhíMf‘¶ßàß \58x9[rNΉ¨;Š6Š"¢¢”ŽM$H > %€ %¢B¥€Œ°ŒËQ#RRÄlͪ±ÓoîƒqŠÈÐ*€,#dr3.j9è ½î¦ªÌêCjÝPRÜÓ=›QožÀ²†ä—‚íUÅRH Q ѵÉãd®œ€   „¶ÊÁ^¸%V’³IÛ:Gάœ#hF¤­ä£V—u]GM8(£2Œ÷Ü_఺ɠŽñ§gLÖ¡*’=±v‰V7lƒÃê´òÙãefºhéþ¥Ò¾™ GéfOô³!Œ¿O5Ñ—¥5Ê)Žr:i} Û»É ² §f_!È™`Gƒ   ¤Ù¸jÊÈVµäé RŽñÔ:Fv ç'-_M L¥RÎÖ·§}É´½Lf©á”wM>Ê@EP@€$P &I ¦·y*i…R[9 ( €@ „`±äñਨ(‚@  @€@P " }¢ŒÈ   @+@Àá/¹4Xh KÈ@\ €€- _‘ðýƒö.€Yr]9鿃kNRâ, /O¨ÿ´Òôs}¥ù(Ü}™#é4×6Æ#£§íFÖÅÂEÀRK¸¸†à†ân¸n(–,åÛ2æ€Ë™?Põ?Q€Þü“{¹‹X°%‹e°¶2 8k§vrÔÅ3Ï}tI«i›y£\z•ËQ+vù8¶ÿc¥Hôi;ÕEE(°sòn€´ZB€+@f<Ѫ"”(—$€ç-_~©´j:_î:$— ˆ)  €#àÛ’[ºðbUÇÏ\ãï¢M¬U¢€¡@(P q´ÑáÖ†Ù´Jß.`€Š€ (¬55Héº'8´rÑ)ôTüw¤ˆãºŸ€‹G)éÉÊÓ ­Å4²h#:±¸žG†j%=ZµB£µ›OUæõŽžù+5ÛÓ6¬ôïiatžN‹^ZSŒ¸&ªú7S“Zké#mö2F‘áŒ;'` ÷`/9#`K'!L„Fò@¨ÈA@©5Àa­Xgxj”wŽ¡ÑI0мáœ5}4e˜áÂõtIZ;éëÆkœ”vNÁ@@TÉT*@@@Q``U**ìÕ€èsÀUö(€T=À…òO@€B0<è* (E €P B€€ (¢\ Ž`ȨER P(  @v²Å0Ð0Él ÈÊvP%€ÑT›à ›O†mBOˆ² - WÄM/K¨ùTQ¥èåþämzH÷&צÓ]Yµ£¦¸ˆÄi(®‘n>K‚oŠ#Ô]ýFMïÈÛ a —’‰½õ€'êõÞüÏÈ %€B-€±`F‚À‹bÀX°)P½Ln88ÓzuÙçëÖã3½‹5FáõAd¼úVuTÙç’Ë£­Hí þš;"Ä­#] j(Úˆcý¤Ûî(3;¬+e\dÖJE ÊMp€ç-ìÏéɘ£qÑ]RãÅZCo¹p6¡KÉpJ^E/#—‘KÈÁ) ^F µy¼ŒB—‘KÈÁ)y8¸N2{i¡ƒ[$Þx'è}*žPÁÒ:k“[ÀØ‹µ ¨´†)HRôŒ§ÈÁq-](êW/ô‘òÇúHù'ů’¥“Ó{ŠÎ“ý=v_ôÊù|•zhù/úxŠ|šý"­x.'ÉVœWFÒ,‰j¤¥|E¤2Ì… åQåÕHD®gM)m—%G±;5*áëÓgÏ|•+Óé’ØÎË º"ÇÓ|‘†kÑé»;j}Œ,|ÝNMéý¢‘§”2ÈÒ;àŠ€>Y:È€=€„ F¸ VZ  ÆM0;C[É膩QÖ:‡E$À  éª–O>§¥O:xd–¦¦‹©&Ñ膴gÃE,@„€2€  >H2 `@€ U&RòiH _° €HXÀ±äAÞ&Ѝ €R€   P@ P'`@ ( | 9ƒ"€@@€8>X²´ @v€ P ¡Èe œSoðn>ŸM,„miéGˆ'ö¢àêöcéEÝ`n‘pM蟨ýB9°©m€ˆZ^J#šDzS{&öû–,’ÀYYB€@J‚&ª¸œ#Áÿ[ŒµpcA½¼Q9*êqäóÊÓmvvHÖ†,ô•¤Ti04™´ÀYm”-ùÆâÀ7À–,–ÀYl‹d°%†À–, bÀ6FÀ‚ÀY@À¶,‹d°Kb–-‹ –,"3,*Y,‚ذeÏ9(ÚvP*(De²XPN:ñµb#ÎTéšeëÑ–èQ†œ½VtÏŸ.YR»únKûòJ“2Â=>—ƒ¾§ØÂÇÍÔäÜ>ÑH½„Ñ;ÈÅ‘87yHŽñ`‹€#ª2Г€#!B€  €P Æn?v†·“¼5JŽÑÔ6l%ËVyçé»MÓÕž›©¦w†ª’Ã(Ý€ @€@”   €TÙ¥ *e?B@Àr„ãÁ£H( @€  :@€(v P)TPEàTs@¤P (QÂí±A¢Š–’ÐàZE@z¡”hÒ*Do m< ™Z1ä›’å”OÔ‰¯„?U“õ$7?"–, –,…bÀX*€ €  ôT–byÔjGéëQ+-Òu&ŒEjiWp’¬ø;²iI9qG DªEMÙ\Úè úÀsa{º&ö{º.æÍ¢î`7´¸*“ðsK‚©7Ð ÏÀÞú@7KÀÞï€.éxŸ€Ÿ¹ö€Ž^Ìnöoö.ï`½†ï`½†ï`&î¨nö¸n©¢î@7!¹Ü7 —‘¹yn^Kh ¹y€nCr¹y—‘7/ —“.H ¹pRíf$þ :Eà¶“-„%*dÜMRÍ )™­ÑeI*tdÓ.Ú§G­«ÖW¤Ï%•èôëwmS"Æ?I7ÀÿN˜G]-5‚êýŒ+çjrt‡¤WïÈ®0F‘¾Éÿ NòìUõ`JvNœ¢0{DhF– "€€n:Ž,ÐÕGxêTÍ&QŒÕIYçÔôî9Ó‚ Ã^Qu5G¢3RD( ” ¨-€P(ªMp”n@,+' œ€K2ŽñàÐ@A@( @ …  P¨¨*‘ðÅG0`  U(@PÂK$+Klª¿  ¬ ^SO ®ø×¥öäÚ4ŠJÚ]“rK'ê"~¡C{#möäŒ, (X"€€  P€ ¨¨#K(ã(½Ç/èÜI*‘ÍFKS (®Ž<%yM¤Dñ‡8cS“Ð"Ö‘£L€*EÔJJ‚3¹PrAY¿¨¶¼š°$™¥$O”AÉPŒ•w#1’\­ÈÊ’ÜÀ»Þ€»×‘¹y¹ ^@Zò-yhZòבh hZkÊ‚–… ‹hZà”€R&R‚”¼ A ^ †`˜H ¬Ê«|„¯G¥àï'H‹Z‘ìÜu"ÕØM5ƒ:¿cçOî:GRÙShŠŽK¼ gà”iþáð²>€%‹pì¯ J2è@A€P€R[7 V¹(ï S´u=Â:Æiš», Ο(å=)G0e†½bHí©hPP…,hð@€Ê“`U°ð@N)y ¶™yd¨, ,y@w\¨  ( P@(@   €(@A”  | Ž`€"€R€€   á‘€Ñ@l)>˜Zr}ZÿrkE.YOO²â*Zkûl»£þÔ\?oesü,P D¢À@T€@@U!”rÖM<ûEI´™™6$q‘¤ËH嫦®üž‰ã. î¨ô! Ò)YTN¥“M§à#8±€%¡‚)jÅ¢¢Ú  ­cº*¯`‹a`üÀÀ { @JB E¤¥àÔ)Ú…/GM¨Õàm ›PÚ€mBB…¡WØR½ÙkÜ!·Ü•îÀW¸¯p«DÛîÚJµqm&ÔE( Sœ¾âÇ‚ (°*õpÑ͵Ŝ{õÒ&ìѤè̸:BVlí.²ã¯Vyß&ã4=ž}1QÞ_iàÔû™’»zgôµÒÂÇ—}2¬ÐG£Óý¦õ¾Æó§÷U$¬R‘ÂòENBuÀ¦ÀŒŒ€§òNÀ`:-G‡ƒ, B* ……m#«\Þ¶vŽ¡Q¸ÊÍX¡`bzqšÊÉÂZrÒÊv¼†¾iòwRR€ÀQËP@*` Ø J€Ò’ìZŽPÀ\èE*(( Q@ `¶ (  DTR€)àQÌ@Ev  @( )ZO‚ò¥ÐªÅýHï¹ù,JªOÉ,¢Ø (  ‚(Yl‹ X(€‚Q@€ @€  P\ÓO³RŠ|™³Uh˯c?ÔuäËQ|³hç8ÃÜÇÀ@FWÝ“rЬ 2£Ã@ËY- #å¤A$R(J*Š¢«!ÅSŠ «µE[»Q)níCj÷mú¨»¿îÙî˳݀ÛîÆßvnydkê«`]¾ão¸ ¾äÛîÚüŠ~@SòFšWaDŸ’Óò3ä´ü…)“ \¨EÈ"6Ñm…2> W%KÉ> Œ»B˜R,З j<@AõŸž›•£—mÆš¥ÈÞ’0­iê[;§héÍf’V$•3¤f²oNU$T{´xõþöek~Ÿ:j?¡Ãj𪠽>Ÿí5­ö0ÓçÏî:®"ŽB²—cb°Yp' /išÐj  ƒ,„d  €€(2hë _%¡¨uŒÂ6¥f¬™çsžŒd¼3‹ŒôŸ”Hk¦é”“@–  €@X*l»¯-û”\艢 Q@ (¤`)¤…P ‹*/A0)¤|«˜2€ H (@€R€d0> Ð0d°*iÁb*-”@ (!J  € * ( ©„¨É® ½‘Su™l ` Kƒ #@Q+ê,“®X'äS-;E¦@k(´À’NŒ©Jè¨Þ\H§-Ô¸·$òDÚÅS~HÛM«©¿%§»+¾ld õnä×ÕäÔ.^À>¢\‚¯ÔeîÜn^ÂäØvú…ËÀ߀۠¢n– oÀD·à[ðsð7{¿bîöaSz\¢~¤|„G4ø4˜ ÞŰ½‰»Øïb7ì™7ŒÙ‰¤‘‰òQaÁ«(1«Ulá)S¤Ž]zÜñ‡mÑÁ•kN;^Yèƒ/7ì¾:}häír™ztgq£—¨_S2­út¶åœTÙý4Zqk€5¨¬Öû÷!D" vð¨]; òJ°Àè2:!@(° ¨Í£´u@ëC¬fTn,ܘا¡eaœ¾½'Æë dðuM0(@ÿÙexempi-2.2.1/exempi/tests/utils.h0000664000175000017500000000425612144603625013702 00000000000000/* * exempi - utils.h * * Copyright (C) 2007,2010 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __TEST_UTILS_H__ #define __TEST_UTILS_H__ #include #include extern std::string g_testfile; extern std::string g_src_testdir; void prepare_test(int argc, char * argv[], const char * filename); bool copy_file(const std::string & source, const std::string & dest); class LeakTracker { public: LeakTracker(); ~LeakTracker(); /** return false if there is NO leak. Will print on stdout */ int check_leaks(); int check_errors(); private: int m_leaks; int m_dubious; int m_reachable; int m_suppressed; int m_errors; }; extern boost::scoped_ptr g_lt; #endif exempi-2.2.1/exempi/tests/testcore.sh0000775000175000017500000000143112144603625014550 00000000000000#!/bin/sh # # Test script. # Currently only make sure dumpmainxmp does not crash # Written by Hubert Figuiere if [ -z $srcdir ] ; then echo "$srcdir srcdir not defined." exit 255 fi SAMPLES="BlueSquare.ai BlueSquare.eps BlueSquare.gif BlueSquare.jpg BlueSquare.mp3 BlueSquare.png BlueSquare.tif BlueSquare.avi BlueSquare.indd BlueSquare.pdf BlueSquare.psd BlueSquare.wav" SAMPLES_DIR=$srcdir/../../samples/testfiles DUMPMAINXMP_PROG=../../samples/source/dumpmainxmp if [ ! -x $DUMPMAINXMP_PROG ] ; then echo "$DUMPMAINXMP_PROG not executable." exit 255 fi for i in $SAMPLES do echo "Running $DUMPMAINXMP_PROG $SAMPLES_DIR/$i" $DUMPMAINXMP_PROG $SAMPLES_DIR/$i > /dev/null if [ $? -ne 0 ] ; then echo "Failed" exit 255 fi done exempi-2.2.1/exempi/tests/test-serialise.cpp0000664000175000017500000000562012144603625016026 00000000000000/* * exempi - test-serialise.cpp * * Copyright (C) 2007-2008 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include "utils.h" #include "xmpconsts.h" #include "xmp.h" using boost::unit_test::test_suite; //void test_serialize() int test_main(int argc, char *argv[]) { prepare_test(argc, argv, "test1.xmp"); size_t len; char * buffer; FILE * f = fopen(g_testfile.c_str(), "rb"); fseek(f, 0, SEEK_END); len = ftell(f); fseek(f, 0, SEEK_SET); buffer = (char*)malloc(len + 1); size_t rlen = fread(buffer, 1, len, f); BOOST_CHECK(rlen == len); BOOST_CHECK(len != 0); buffer[rlen] = 0; BOOST_CHECK(xmp_init()); BOOST_CHECK(xmp_get_error() == 0); XmpPtr xmp = xmp_new_empty(); BOOST_CHECK(xmp_get_error() == 0); BOOST_CHECK(xmp_parse(xmp, buffer, len)); BOOST_CHECK(xmp_get_error() == 0); std::string b1(buffer); std::string b2; XmpStringPtr output = xmp_string_new(); BOOST_CHECK(xmp_serialize_and_format(xmp, output, XMP_SERIAL_OMITPACKETWRAPPER, 0, "\n", " ", 0)); BOOST_CHECK(xmp_get_error() == 0); b2 = xmp_string_cstr(output); // find a way to compare that. // BOOST_CHECK_EQUAL(b1, b2); xmp_string_free(output); BOOST_CHECK(xmp_free(xmp)); free(buffer); fclose(f); xmp_terminate(); BOOST_CHECK(!g_lt->check_leaks()); BOOST_CHECK(!g_lt->check_errors()); return 0; } exempi-2.2.1/exempi/tests/test-tiff-leak.cpp0000664000175000017500000000544712144603625015717 00000000000000/* * exempi - test-tiff-leak.cpp * * Copyright (C) 2007-2008,2010 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "utils.h" #include "xmp.h" #include "xmpconsts.h" /** See http://www.adobeforums.com/webx/.3bc42b73 for the orignal * test case */ //void test_tiff_leak() int test_main(int argc, char *argv[]) { prepare_test(argc, argv, "../../samples/testfiles/BlueSquare.jpg"); std::string orig_tiff_file = g_src_testdir + "../../samples/testfiles/BlueSquare.tif"; BOOST_CHECK(copy_file(orig_tiff_file, "test.tif")); BOOST_CHECK(chmod("test.tif", S_IRUSR|S_IWUSR) == 0); BOOST_CHECK(xmp_init()); XmpFilePtr f = xmp_files_open_new("test.tif", XMP_OPEN_FORUPDATE); BOOST_CHECK(f != NULL); if (f == NULL) { return 1; } XmpPtr xmp; BOOST_CHECK(xmp = xmp_files_get_new_xmp(f)); BOOST_CHECK(xmp != NULL); xmp_set_localized_text(xmp, NS_DC, "description", "en", "en-US", "foo", 0); BOOST_CHECK(xmp_files_put_xmp(f, xmp)); BOOST_CHECK(xmp_files_close(f, XMP_CLOSE_NOOPTION)); BOOST_CHECK(xmp_free(xmp)); BOOST_CHECK(xmp_files_free(f)); xmp_terminate(); BOOST_CHECK(unlink("test.tif") == 0); BOOST_CHECK(!g_lt->check_leaks()); BOOST_CHECK(!g_lt->check_errors()); return 0; } exempi-2.2.1/exempi/tests/testinit.cpp0000664000175000017500000000515112144603625014733 00000000000000/* * exempi - testinit.cpp * * Copyright (C) 2007 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include "utils.h" #include "xmpconsts.h" #include "xmp.h" //void test_exempi_init() int test_main(int argc, char * argv[]) { prepare_test(argc, argv, "test1.xmp"); size_t len; char * buffer; FILE * f = fopen(g_testfile.c_str(), "rb"); BOOST_CHECK(f != NULL); if (f == NULL) { exit(128); } fseek(f, 0, SEEK_END); len = ftell(f); fseek(f, 0, SEEK_SET); buffer = (char*)malloc(len + 1); size_t rlen = fread(buffer, 1, len, f); BOOST_CHECK(rlen == len); BOOST_CHECK(len != 0); BOOST_CHECK(xmp_init()); BOOST_CHECK(xmp_init()); XmpPtr xmp = xmp_new_empty(); BOOST_CHECK(xmp_parse(xmp, buffer, len)); BOOST_CHECK(xmp != NULL); BOOST_CHECK(xmp_free(xmp)); xmp_terminate(); xmp = xmp_new_empty(); BOOST_CHECK(xmp_parse(xmp, buffer, len)); BOOST_CHECK(xmp != NULL); BOOST_CHECK(xmp_free(xmp)); xmp_terminate(); free(buffer); BOOST_CHECK(!g_lt->check_leaks()); BOOST_CHECK(!g_lt->check_errors()); return 0; } exempi-2.2.1/exempi/tests/Makefile.am0000664000175000017500000000775712150230672014431 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007-2011 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # INCLUDES = -I$(srcdir)/.. -I$(top_srcdir)/public/include -I$(top_srcdir) if WITH_UNIT_TEST check_PROGRAMS = testexempicore testserialise testwritenewprop \ testtiffleak testxmpfiles testxmpfileswrite \ test3 testinit testfdo18635 testcpp TESTS = testcore.sh testinit testexempicore testserialise testwritenewprop \ testtiffleak testxmpfiles testxmpfileswrite \ test3 testfdo18635 testcpp TESTS_ENVIRONMENT = TEST_DIR=$(srcdir) BOOST_TEST_CATCH_SYSTEM_ERRORS=no @VALGRIND@ endif check_SCRIPTS = testcore.sh check_DATA = test1.xmp fdo18635.jpg noinst_HEADERS = utils.h EXTRA_DIST = $(check_DATA) $(check_SCRIPTS) CLEANFILES = test.jpg testinit_SOURCES = testinit.cpp utils.cpp testinit_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testinit_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testexempicore_SOURCES = test-exempi-core.cpp utils.cpp testexempicore_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testexempicore_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testserialise_SOURCES = test-serialise.cpp utils.cpp testserialise_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testserialise_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testwritenewprop_SOURCES = test-write-new-prop.cpp utils.cpp testwritenewprop_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testwritenewprop_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testtiffleak_SOURCES = test-tiff-leak.cpp utils.cpp testtiffleak_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testtiffleak_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testxmpfiles_SOURCES = test-xmpfiles.cpp utils.cpp testxmpfiles_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testxmpfiles_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testxmpfileswrite_SOURCES = test-xmpfiles-write.cpp utils.cpp testxmpfileswrite_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testxmpfileswrite_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ test3_SOURCES = test3.cpp utils.cpp test3_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ test3_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testfdo18635_SOURCES = test-bgo.cpp utils.cpp testfdo18635_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testfdo18635_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ testcpp_SOURCES = testcpp.cpp utils.cpp testcpp_LDADD = ../libexempi.la @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ testcpp_LDFLAGS = -static @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@exempi-2.2.1/exempi/Makefile.in0000664000175000017500000010654412150236767013305 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007-2013 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = exempi$(EXEEXT) @HAVE_SYMBOLS_FILE_TRUE@am__append_1 = -Wl,--retain-symbols-file=$(srcdir)/libexempi.sym subdir = exempi DIST_COMMON = $(dist_man1_MANS) $(exempi_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/exempi-2.0.pc.in $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = exempi-2.0.pc CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(exempidir)" LTLIBRARIES = $(lib_LTLIBRARIES) libexempi_la_DEPENDENCIES = \ $(top_builddir)/source/common/libxmpcommon.la \ $(top_builddir)/source/XMPCore/libXMPCore.la \ $(top_builddir)/source/XMPFiles/libXMPFiles.la \ $(top_builddir)/third-party/MD5/libmd5.la am_libexempi_la_OBJECTS = exempi.lo libexempi_la_OBJECTS = $(am_libexempi_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libexempi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libexempi_la_LDFLAGS) $(LDFLAGS) -o $@ PROGRAMS = $(bin_PROGRAMS) am_exempi_OBJECTS = exempi-main.$(OBJEXT) exempi_OBJECTS = $(am_exempi_OBJECTS) exempi_DEPENDENCIES = libexempi.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libexempi_la_SOURCES) $(exempi_SOURCES) DIST_SOURCES = $(libexempi_la_SOURCES) $(exempi_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 NROFF = nroff MANS = $(dist_man1_MANS) DATA = $(pkgconfig_DATA) HEADERS = $(exempi_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = tests DIST_SUBDIRS = tests doc exempidir = $(includedir)/@EXEMPI_INCLUDE_BASE@/exempi exempi_HEADERS = xmp.h xmpconsts.h xmperrors.h xmp++.hpp exempi_SOURCES = main.cpp exempi_CPPFLAGS = -I$(srcdir)/.. exempi_LDADD = libexempi.la INCLUDES = -I$(top_srcdir)/public/include AM_CPPFLAGS = -Wall -D@EXEMPI_PLATFORM_DEF@=1 lib_LTLIBRARIES = libexempi.la pkgconfig_DATA = exempi-@EXEMPI_MAJOR_VERSION@.pc libexempi_la_SOURCES = exempi.cpp libexempi_la_LIBADD = $(top_builddir)/source/common/libxmpcommon.la \ $(top_builddir)/source/XMPCore/libXMPCore.la \ $(top_builddir)/source/XMPFiles/libXMPFiles.la \ $(top_builddir)/third-party/MD5/libmd5.la \ -lexpat -lz libexempi_la_LDFLAGS = -version-info @EXEMPI_VERSION_INFO@ \ $(am__append_1) dist_man1_MANS = exempi.1 EXTRA_DIST = libexempi.sym all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign exempi/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign exempi/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): exempi-2.0.pc: $(top_builddir)/config.status $(srcdir)/exempi-2.0.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libexempi.la: $(libexempi_la_OBJECTS) $(libexempi_la_DEPENDENCIES) $(EXTRA_libexempi_la_DEPENDENCIES) $(AM_V_CXXLD)$(libexempi_la_LINK) -rpath $(libdir) $(libexempi_la_OBJECTS) $(libexempi_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list exempi$(EXEEXT): $(exempi_OBJECTS) $(exempi_DEPENDENCIES) $(EXTRA_exempi_DEPENDENCIES) @rm -f exempi$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(exempi_OBJECTS) $(exempi_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exempi-main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exempi.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< exempi-main.o: main.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(exempi_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT exempi-main.o -MD -MP -MF $(DEPDIR)/exempi-main.Tpo -c -o exempi-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/exempi-main.Tpo $(DEPDIR)/exempi-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cpp' object='exempi-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(exempi_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o exempi-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp exempi-main.obj: main.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(exempi_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT exempi-main.obj -MD -MP -MF $(DEPDIR)/exempi-main.Tpo -c -o exempi-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/exempi-main.Tpo $(DEPDIR)/exempi-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cpp' object='exempi-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(exempi_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o exempi-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(dist_man1_MANS) @$(NORMAL_INSTALL) @list1='$(dist_man1_MANS)'; \ list2=''; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(dist_man1_MANS)'; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-exempiHEADERS: $(exempi_HEADERS) @$(NORMAL_INSTALL) @list='$(exempi_HEADERS)'; test -n "$(exempidir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(exempidir)'"; \ $(MKDIR_P) "$(DESTDIR)$(exempidir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(exempidir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(exempidir)" || exit $$?; \ done uninstall-exempiHEADERS: @$(NORMAL_UNINSTALL) @list='$(exempi_HEADERS)'; test -n "$(exempidir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(exempidir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the 'missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically 'make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(DATA) $(HEADERS) install-binPROGRAMS: install-libLTLIBRARIES installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(exempidir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-exempiHEADERS install-man \ install-pkgconfigDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-libLTLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-exempiHEADERS \ uninstall-libLTLIBRARIES uninstall-man uninstall-pkgconfigDATA uninstall-man: uninstall-man1 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libLTLIBRARIES clean-libtool cscopelist \ cscopelist-recursive ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-exempiHEADERS install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-man1 install-pdf \ install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-exempiHEADERS uninstall-libLTLIBRARIES uninstall-man \ uninstall-man1 uninstall-pkgconfigDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/exempi/xmp.h0000664000175000017500000006327512144603625012212 00000000000000/* * exempi - xmp.h * * Copyright (C) 2007-2008,2012 Hubert Figuiere * Copyright 2002-2007 Adobe Systems Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __EXEMPI_XMP_H_ #define __EXEMPI_XMP_H_ #include /* stdbool choke on Sun (bug# 14612) */ #if !defined(__sun) #include #endif #include #include #ifdef __cplusplus extern "C" { #endif /* enums grafted from XMP_Const.h */ /** Option bits for xmp_files_open() */ typedef enum { XMP_OPEN_NOOPTION = 0x00000000, /**< No open option */ XMP_OPEN_READ = 0x00000001, /**< Open for read-only access. */ XMP_OPEN_FORUPDATE = 0x00000002, /**< Open for reading and writing. */ XMP_OPEN_ONLYXMP = 0x00000004, /**< Only the XMP is wanted, * allows space/time optimizations. */ XMP_OPEN_CACHETNAIL = 0x00000008, /**< Cache thumbnail if possible, * GetThumbnail will be called. */ XMP_OPEN_STRICTLY = 0x00000010, /**< Be strict about locating XMP * and reconciling with other forms. */ XMP_OPEN_USESMARTHANDLER= 0x00000020, /**< Require the use of a smart * handler. */ XMP_OPEN_USEPACKETSCANNING = 0x00000040, /**< Force packet scanning, * don't use a smart handler. */ XMP_OPEN_LIMITSCANNING = 0x00000080, /**< Only packet scan files "known" * to need scanning. */ XMP_OPEN_REPAIR_FILE = 0x00000100, /**< Attempt to repair a file opened for update, * default is to not open (throw an exception). */ XMP_OPEN_INBACKGROUND = 0x10000000 /**< Set if calling from background * thread. */ } XmpOpenFileOptions; /* bad work-around for a typo-fix in 1.99.8 * deprecate. */ #define XMP_OPEN_OPNLYXMP XMP_OPEN_ONLYXMP /** Option bits for xmp_files_close() */ typedef enum { XMP_CLOSE_NOOPTION = 0x0000, /**< No close option */ XMP_CLOSE_SAFEUPDATE = 0x0001 /**< Write into a temporary file and * swap for crash safety. */ } XmpCloseFileOptions; typedef enum { /* Public file formats. Hex used to avoid gcc warnings. */ /* ! Leave them as big endian. There seems to be no decent way on UNIX to determine the target */ /* ! endianness at compile time. Forcing it on the client isn't acceptable. */ XMP_FT_PDF = 0x50444620UL, /* 'PDF ' */ XMP_FT_PS = 0x50532020UL, /* 'PS ', general PostScript following DSC conventions. */ XMP_FT_EPS = 0x45505320UL, /* 'EPS ', encapsulated PostScript. */ XMP_FT_JPEG = 0x4A504547UL, /* 'JPEG' */ XMP_FT_JPEG2K = 0x4A505820UL, /* 'JPX ', ISO 15444-1 */ XMP_FT_TIFF = 0x54494646UL, /* 'TIFF' */ XMP_FT_GIF = 0x47494620UL, /* 'GIF ' */ XMP_FT_PNG = 0x504E4720UL, /* 'PNG ' */ XMP_FT_SWF = 0x53574620UL, /* 'SWF ' */ XMP_FT_FLA = 0x464C4120UL, /* 'FLA ' */ XMP_FT_FLV = 0x464C5620UL, /* 'FLV ' */ XMP_FT_MOV = 0x4D4F5620UL, /* 'MOV ', Quicktime */ XMP_FT_AVI = 0x41564920UL, /* 'AVI ' */ XMP_FT_CIN = 0x43494E20UL, /* 'CIN ', Cineon */ XMP_FT_WAV = 0x57415620UL, /* 'WAV ' */ XMP_FT_MP3 = 0x4D503320UL, /* 'MP3 ' */ XMP_FT_SES = 0x53455320UL, /* 'SES ', Audition session */ XMP_FT_CEL = 0x43454C20UL, /* 'CEL ', Audition loop */ XMP_FT_MPEG = 0x4D504547UL, /* 'MPEG' */ XMP_FT_MPEG2 = 0x4D503220UL, /* 'MP2 ' */ XMP_FT_MPEG4 = 0x4D503420UL, /* 'MP4 ', ISO 14494-12 and -14 */ XMP_FT_WMAV = 0x574D4156UL, /* 'WMAV', Windows Media Audio and Video */ XMP_FT_AIFF = 0x41494646UL, /* 'AIFF' */ XMP_FT_HTML = 0x48544D4CUL, /* 'HTML' */ XMP_FT_XML = 0x584D4C20UL, /* 'XML ' */ XMP_FT_TEXT = 0x74657874UL, /* 'text' */ /* Adobe application file formats. */ XMP_FT_PHOTOSHOP = 0x50534420UL, /* 'PSD ' */ XMP_FT_ILLUSTRATOR = 0x41492020UL, /* 'AI ' */ XMP_FT_INDESIGN = 0x494E4444UL, /* 'INDD' */ XMP_FT_AEPROJECT = 0x41455020UL, /* 'AEP ' */ XMP_FT_AEPROJTEMPLATE = 0x41455420UL, /* 'AET ', After Effects Project Template */ XMP_FT_AEFILTERPRESET = 0x46465820UL, /* 'FFX ' */ XMP_FT_ENCOREPROJECT = 0x4E434F52UL, /* 'NCOR' */ XMP_FT_PREMIEREPROJECT = 0x5052504AUL, /* 'PRPJ' */ XMP_FT_PREMIERETITLE = 0x5052544CUL, /* 'PRTL' */ /* Catch all. */ XMP_FT_UNKNOWN = 0x20202020UL /* ' ' */ } XmpFileType; typedef enum { XMP_FMT_CAN_INJECT_XMP = 0x00000001, XMP_FMT_CAN_EXPAND = 0x00000002, XMP_FMT_CAN_REWRITE = 0x00000004, XMP_FMT_PREFERS_IN_PLACE = 0x00000008, XMP_FMT_CAN_RECONCILE = 0x00000010, XMP_FMT_ALLOWS_ONLY_XMP = 0x00000020, XMP_FMT_RETURNS_RAW_PACKET = 0x00000040, XMP_FMT_HANDLER_OWNS_FILE = 0x00000100, XMP_FMT_ALLOW_SAFE_UPDATE = 0x00000200, XMP_FMT_NEEDS_READONLY_PACKET = 0x00000400, XMP_FMT_USE_SIDECAR_XMP = 0x00000800, XMP_FMT_FOLDER_BASED_FORMAT = 0x00001000, _XMP_FMT_LAST } XmpFileFormatOptions; typedef enum { XMP_ITER_CLASSMASK = 0x00FFUL, /**< The low 8 bits are an enum of * what data structure to iterate. */ XMP_ITER_PROPERTIES = 0x0000UL, /**< Iterate the property tree of * a TXMPMeta object. */ XMP_ITER_ALIASES = 0x0001UL, /**< Iterate the global alias table. */ XMP_ITER_NAMESPACES = 0x0002UL, /**< Iterate the global namespace table. */ XMP_ITER_JUSTCHILDREN = 0x0100UL, /**< Just do the immediate children * of the root, default is subtree. */ XMP_ITER_JUSTLEAFNODES = 0x0200UL, /**< Just do the leaf nodes, default * is all nodes in the subtree. */ XMP_ITER_JUSTLEAFNAME = 0x0400UL, /**< Return just the leaf part of the * path, default is the full path. */ XMP_ITER_INCLUDEALIASES = 0x0800UL, /**< Include aliases, default is just * actual properties. */ XMP_ITER_OMITQUALIFIERS = 0x1000UL /* Omit all qualifiers. */ } XmpIterOptions; typedef enum { XMP_ITER_SKIPSUBTREE = 0x0001UL, /**< Skip the subtree below the * current node. */ XMP_ITER_SKIPSIBLINGS = 0x0002UL /**< Skip the subtree below and remaining * siblings of the current node. */ } XmpIterSkipOptions; typedef enum { /** Options relating to the XML string form of the property value. */ XMP_PROP_VALUE_IS_URI = 0x00000002UL, /**< The value is a URI, use * rdf:resource attribute. * DISCOURAGED */ /** Options relating to qualifiers attached to a property. */ XMP_PROP_HAS_QUALIFIERS = 0x00000010UL, /**< The property has qualifiers, * includes rdf:type and * xml:lang. */ XMP_PROP_IS_QUALIFIER = 0x00000020UL, /**< This is a qualifier, * includes rdf:type and * xml:lang. */ XMP_PROP_HAS_LANG = 0x00000040UL, /**< Implies XMP_PropHasQualifiers, * property has xml:lang. */ XMP_PROP_HAS_TYPE = 0x00000080UL, /**< Implies XMP_PropHasQualifiers, * property has rdf:type. */ /* Options relating to the data structure form. */ XMP_PROP_VALUE_IS_STRUCT = 0x00000100UL, /**< The value is a structure * with nested fields. */ XMP_PROP_VALUE_IS_ARRAY = 0x00000200UL, /**< The value is an array * (RDF alt/bag/seq). */ XMP_PROP_ARRAY_IS_UNORDERED = XMP_PROP_VALUE_IS_ARRAY, /**< The item order * does not matter.*/ XMP_PROP_ARRAY_IS_ORDERED = 0x00000400UL, /**< Implies XMP_PropValueIsArray, * item order matters. */ XMP_PROP_ARRAY_IS_ALT = 0x00000800UL, /**< Implies XMP_PropArrayIsOrdered, * items are alternates. */ /** Additional struct and array options. */ XMP_PROP_ARRAY_IS_ALTTEXT = 0x00001000UL, /**< Implies kXMP_PropArrayIsAlternate, * items are localized text. */ XMP_PROP_ARRAY_INSERT_BEFORE = 0x00004000UL, /**< Used by array functions. */ XMP_PROP_ARRAY_INSERT_AFTER = 0x00008000UL, /**< Used by array functions. */ /* Other miscellaneous options. */ XMP_PROP_IS_ALIAS = 0x00010000UL, /**< This property is an alias name for another property. */ XMP_PROP_HAS_ALIASES = 0x00020000UL, /**< This property is the base value for a set of aliases. */ XMP_PROP_IS_INTERNAL = 0x00040000UL, /**< This property is an "internal" property, owned by applications. */ XMP_PROP_IS_STABLE = 0x00100000UL, /**< This property is not derived from the document content. */ XMP_PROP_IS_DERIVED = 0x00200000UL, /**< This property is derived from the document content. */ /* kXMPUtil_AllowCommas = 0x10000000UL, ! Used by TXMPUtils::CatenateArrayItems and ::SeparateArrayItems. */ /* kXMP_DeleteExisting = 0x20000000UL, ! Used by TXMPMeta::SetXyz functions to delete any pre-existing property. */ /* kXMP_SchemaNode = 0x80000000UL, ! Returned by iterators - #define to avoid warnings */ /* Masks that are multiple flags. */ XMP_PROP_ARRAY_FORM_MASK = XMP_PROP_VALUE_IS_ARRAY | XMP_PROP_ARRAY_IS_ORDERED | XMP_PROP_ARRAY_IS_ALT | XMP_PROP_ARRAY_IS_ALTTEXT, XMP_PROP_COMPOSITE_MASK = XMP_PROP_VALUE_IS_STRUCT | XMP_PROP_ARRAY_FORM_MASK, /* Is it simple or composite (array or struct)? */ XMP_IMPL_RESERVED_MASK = 0x70000000L /**< Reserved for transient use by the implementation. */ } XmpPropsBits; /* convenience macros */ /** set option bits */ #define XMP_SET_OPTION(var,opt) var |= (opt) /** clear option bits */ #define XMP_CLEAR_OPTION(var,opt) var &= ~(opt) /** test if option is set */ #define XMP_TEST_OPTION_SET(var,opt) (((var) & (opt)) != 0) /** test if option is clear */ #define XMP_TEST_OPTION_CLEAR(var,opt) (((var) & (opt)) == 0) #define XMP_IS_PROP_SIMPLE(opt) (((opt) & XMP_PROP_COMPOSITE_MASK) == 0) #define XMP_IS_PROP_STRUCT(opt) (((opt) & XMP_PROP_VALUE_IS_STRUCT) != 0) #define XMP_IS_PROP_ARRAY(opt) (((opt) & XMP_PROP_VALUE_IS_ARRAY) != 0) #define XMP_IS_ARRAY_UNORDERED(opt) (((opt) & XMP_PROP_ARRAY_IS_ORDERED) == 0) #define XMP_IS_ARRAY_ORDERED(opt) (((opt) & XMP_PROP_ARRAY_IS_ORDERED) != 0) #define XMP_IS_ARRAY_ALT(opt) (((opt) & XMP_PROP_ARRAY_IS_ALT) != 0) #define XMP_IS_ARRAY_ALTTEXT(opt) (((opt) & XMP_PROP_ARRAY_IS_ALTTEXT) != 0) #define XMP_HAS_PROP_QUALIFIERS(opt) (((opt) & XMP_PROP_HAS_QUALIFIERS) != 0) #define XMP_IS_PROP_QUALIFIER(opt) (((opt) & XMP_PROP_IS_QUALIFIER) != 0) #define XMP_HAS_PROP_LANG(opt) (((opt) & XMP_PROP_HAS_LANG) != 0) #define XMP_IS_NODE_SCHEMA(opt) (((opt) & XMP_SCHEMA_NODE) != 0) #define XMP_IS_PROP_ALIAS(opt) (((opt) & XMP_PROP_IS_ALIAS) != 0) enum { /* Options for xmp_serialize */ XMP_SERIAL_OMITPACKETWRAPPER = 0x0010UL, /**< Omit the XML packet * wrapper. */ XMP_SERIAL_READONLYPACKET = 0x0020UL, /**< Default is a writeable * packet. */ XMP_SERIAL_USECOMPACTFORMAT = 0x0040UL, /**< Use a compact form of * RDF. */ XMP_SERIAL_INCLUDETHUMBNAILPAD = 0x0100UL, /**< Include a padding allowance * for a thumbnail image. */ XMP_SERIAL_EXACTPACKETLENGTH = 0x0200UL, /**< The padding parameter is * the overall packet length. */ XMP_SERIAL_WRITEALIASCOMMENTS = 0x0400UL, /**< Show aliases as XML * comments. */ XMP_SERIAL_OMITALLFORMATTING = 0x0800UL, /**< Omit all formatting * whitespace. */ _XMP_LITTLEENDIAN_BIT = 0x0001UL, /* ! Don't use directly, see the combined values below! */ _XMP_UTF16_BIT = 0x0002UL, _XMP_UTF32_BIT = 0x0004UL, XMP_SERIAL_ENCODINGMASK = 0x0007UL, XMP_SERIAL_ENCODEUTF8 = 0UL, XMP_SERIAL_ENCODEUTF16BIG = _XMP_UTF16_BIT, XMP_SERIAL_ENCODEUTF16LITTLE = _XMP_UTF16_BIT | _XMP_LITTLEENDIAN_BIT, XMP_SERIAL_ENCODEUTF32BIG = _XMP_UTF32_BIT, XMP_SERIAL_ENCODEUTF32LITTLE = _XMP_UTF32_BIT | _XMP_LITTLEENDIAN_BIT }; /** pointer to XMP packet. Opaque. */ typedef struct _Xmp *XmpPtr; typedef struct _XmpFile *XmpFilePtr; typedef struct _XmpString *XmpStringPtr; typedef struct _XmpIterator *XmpIteratorPtr; typedef struct _XmpDateTime { int32_t year; int32_t month; /* 1..12 */ int32_t day; /* 1..31 */ int32_t hour; /* 0..23 */ int32_t minute; /* 0..59 */ int32_t second; /* 0..59 */ int32_t tzSign; /* -1..+1, 0 means UTC, -1 is west, +1 is east. */ int32_t tzHour; /* 0..23 */ int32_t tzMinute; /* 0..59 */ int32_t nanoSecond; } XmpDateTime; /** Values used for tzSign field. */ enum { XMP_TZ_WEST = -1, /**< West of UTC */ XMP_TZ_UTC = 0, /**< UTC */ XMP_TZ_EAST = +1 /**< East of UTC */ }; /** Init the library. Must be called before anything else */ bool xmp_init(); void xmp_terminate(); /** get the error code that last occurred. * @todo make this thread-safe. Getting the error code * from another thread than the on it occurred in is undefined. */ int xmp_get_error(); XmpFilePtr xmp_files_new(); XmpFilePtr xmp_files_open_new(const char *, XmpOpenFileOptions options); bool xmp_files_open(XmpFilePtr xf, const char *, XmpOpenFileOptions options); /** Close an XMP file. Will flush the changes * @param xf the file object * @param options the options to close. * @return true on succes, false on error * xmp_get_error() will give the error code. */ bool xmp_files_close(XmpFilePtr xf, XmpCloseFileOptions options); XmpPtr xmp_files_get_new_xmp(XmpFilePtr xf); bool xmp_files_get_xmp(XmpFilePtr xf, XmpPtr xmp); bool xmp_files_can_put_xmp(XmpFilePtr xf, XmpPtr xmp); bool xmp_files_put_xmp(XmpFilePtr xf, XmpPtr xmp); /** Get the file info from the open file * @param xf the file object * @param[out] filePath the file path object to store the path in. Pass NULL if not needed. * @param[out] options the options for open. Pass NULL if not needed. * @param[out] file_format the detected file format. Pass NULL if not needed. * @param[out] handler_flags the format options like from %xmp_files_get_format_info. * @return false in case of error. */ bool xmp_files_get_file_info(XmpFilePtr xf, XmpStringPtr filePath, XmpOpenFileOptions *options, XmpFileType * file_format, XmpFileFormatOptions *handler_flags); /** Free a XmpFilePtr * @param xf the file ptr. Cannot be NULL * @return false on error. * xmp_get_error() will give the error code. */ bool xmp_files_free(XmpFilePtr xf); /** Get the format info * @param format type identifier * @param option the options for the file format handler * @return false on error */ bool xmp_files_get_format_info(XmpFileType format, XmpFileFormatOptions * options); /** Check the file format of a file. Use the same logic as in xmp_files_open() * @param filePath the path to the file * @return XMP_FT_UNKNOWN on error or if the file type is unknown */ XmpFileType xmp_files_check_file_format(const char *filePath); /** Register a new namespace to add properties to * This is done automatically when reading the metadata block * @param namespaceURI the namespace URI to register * @param suggestedPrefix the suggested prefix * @param registeredPrefix the really registered prefix. Not necessarily * %suggestedPrefix. * @return true if success, false otherwise. */ bool xmp_register_namespace(const char *namespaceURI, const char *suggestedPrefix, XmpStringPtr registeredPrefix); /** Check is a namespace is registered * @param ns the namespace to check. * @param prefix The prefix associated if registered. Pass NULL * if not interested. * @return true if registered. * NEW in 2.1 */ bool xmp_namespace_prefix(const char *ns, XmpStringPtr prefix); /** Check if a ns prefix is registered. * @param prefix the prefix to check. * @param ns the namespace associated if registered. Pass NULL * if not interested. * @return true if registered. * NEW in 2.1 */ bool xmp_prefix_namespace_uri(const char *prefix, XmpStringPtr ns); XmpPtr xmp_new_empty(); /** Create a new XMP packet * @param buffer the buffer to load data from. UTF-8 encoded. * @param len the buffer length in byte * @return the packet pointer. Must be free with xmp_free() */ XmpPtr xmp_new(const char *buffer, size_t len); /** Create a new XMP packet from the one passed. * @param xmp the instance to copy. Can be NULL. * @return the packet pointer. NULL is failer (or NULL is passed). */ XmpPtr xmp_copy(XmpPtr xmp); /** Free the xmp packet * @param xmp the xmp packet to free */ bool xmp_free(XmpPtr xmp); /** Parse the XML passed through the buffer and load * it. * @param xmp the XMP packet. * @param buffer the buffer. * @param len the length of the buffer. */ bool xmp_parse(XmpPtr xmp, const char *buffer, size_t len); /** Serialize the XMP Packet to the given buffer * @param xmp the XMP Packet * @param buffer the buffer to write the XMP to * @param options options on how to write the XMP. See XMP_SERIAL_* * @param padding number of bytes of padding, useful for modifying * embedded XMP in place. * @return TRUE if success. */ bool xmp_serialize(XmpPtr xmp, XmpStringPtr buffer, uint32_t options, uint32_t padding); /** Serialize the XMP Packet to the given buffer with formatting * @param xmp the XMP Packet * @param buffer the buffer to write the XMP to * @param options options on how to write the XMP. See XMP_SERIAL_* * @param padding number of bytes of padding, useful for modifying * embedded XMP in place. * @param newline the new line character to use * @param tab the indentation character to use * @param indent the initial indentation level * @return TRUE if success. */ bool xmp_serialize_and_format(XmpPtr xmp, XmpStringPtr buffer, uint32_t options, uint32_t padding, const char *newline, const char *tab, int32_t indent); /** Get an XMP property and it option bits from the XMP packet * @param xmp the XMP packet * @param schema * @param name * @param property the allocated XmpStringPtr * @param propsBits pointer to the option bits. Pass NULL if not needed * @return true if found */ bool xmp_get_property(XmpPtr xmp, const char *schema, const char *name, XmpStringPtr property, uint32_t *propsBits); bool xmp_get_property_date(XmpPtr xmp, const char *schema, const char *name, XmpDateTime * property, uint32_t *propsBits); bool xmp_get_property_float(XmpPtr xmp, const char *schema, const char *name, double * property, uint32_t *propsBits); bool xmp_get_property_bool(XmpPtr xmp, const char *schema, const char *name, bool * property, uint32_t *propsBits); bool xmp_get_property_int32(XmpPtr xmp, const char *schema, const char *name, int32_t * property, uint32_t *propsBits); bool xmp_get_property_int64(XmpPtr xmp, const char *schema, const char *name, int64_t * property, uint32_t *propsBits); /** Get an item frpm an array property * @param xmp the xmp meta * @param schema the schema * @param name the property name * @param index the index in the array * @param property the property value * @param propsBits the property bits. Pass NULL is unwanted. * @return TRUE if success. */ bool xmp_get_array_item(XmpPtr xmp, const char *schema, const char *name, int32_t index, XmpStringPtr property, uint32_t *propsBits); /** Set an XMP property in the XMP packet * @param xmp the XMP packet * @param schema * @param name * @param value 0 terminated string * @param optionBits * @return false if failure */ bool xmp_set_property(XmpPtr xmp, const char *schema, const char *name, const char *value, uint32_t optionBits); /** Set a date XMP property in the XMP packet * @param xmp the XMP packet * @param schema * @param name * @param value the date-time struct * @param optionBits * @return false if failure */ bool xmp_set_property_date(XmpPtr xmp, const char *schema, const char *name, const XmpDateTime *value, uint32_t optionBits); /** Set a float XMP property in the XMP packet * @param xmp the XMP packet * @param schema * @param name * @param value the float value * @param optionBits * @return false if failure */ bool xmp_set_property_float(XmpPtr xmp, const char *schema, const char *name, double value, uint32_t optionBits); bool xmp_set_property_bool(XmpPtr xmp, const char *schema, const char *name, bool value, uint32_t optionBits); bool xmp_set_property_int32(XmpPtr xmp, const char *schema, const char *name, int32_t value, uint32_t optionBits); bool xmp_set_property_int64(XmpPtr xmp, const char *schema, const char *name, int64_t value, uint32_t optionBits); bool xmp_set_array_item(XmpPtr xmp, const char *schema, const char *name, int32_t index, const char *value, uint32_t optionBits); /** Append a value to the XMP Property array in the XMP Packet provided * @param xmp the XMP packet * @param schema the schema of the property * @param name the name of the property * @param arrayOptions option bits of the parent array * @param value null-terminated string * @param optionBits option bits of the value itself. */ bool xmp_append_array_item(XmpPtr xmp, const char *schema, const char *name, uint32_t arrayOptions, const char *value, uint32_t optionBits); /** Delete a property from the XMP Packet provided * @param xmp the XMP packet * @param schema the schema of the property * @param name the name of the property */ bool xmp_delete_property(XmpPtr xmp, const char *schema, const char *name); /** Determines if a property exists in the XMP Packet provided * @param xmp the XMP packet * @param schema the schema of the property. Can't be NULL or empty. * @param name the name of the property. Can't be NULL or empty. * @return true is the property exists */ bool xmp_has_property(XmpPtr xmp, const char *schema, const char *name); /** Get a localised text from a localisable property. * @param xmp the XMP packet * @param schema the schema * @param name the property name. * @param genericLang the generic language you may want as a fall back. * Can be NULL or empty. * @param specificLang the specific language you want. Can't be NULL or empty. * @param actualLang the actual language of the value. Can be NULL if * not wanted. * @param itemValue the localized value. Can be NULL if not wanted. * @param propBits the options flags describing the property. Can be NULL. * @return true if found, false otherwise. */ bool xmp_get_localized_text(XmpPtr xmp, const char *schema, const char *name, const char *genericLang, const char *specificLang, XmpStringPtr actualLang, XmpStringPtr itemValue, uint32_t *propBits); /** Set a localised text in a localisable property. * @param xmp the XMP packet * @param schema the schema * @param name the property name. * @param genericLang the generic language you may want to set too. * Can be NULL or empty. * @param specificLang the specific language you want. Can't be NULL or empty. * @param value the localized value. Cannot be NULL. * @param optionBits the options flags describing the property. * @return true if set, false otherwise. */ bool xmp_set_localized_text(XmpPtr xmp, const char *schema, const char *name, const char *genericLang, const char *specificLang, const char *value, uint32_t optionBits); bool xmp_delete_localized_text(XmpPtr xmp, const char *schema, const char *name, const char *genericLang, const char *specificLang); /** Instanciate a new string * @return the new instance. Must be freed with * xmp_string_free() */ XmpStringPtr xmp_string_new(); /** Free a XmpStringPtr * @param s the string to free */ void xmp_string_free(XmpStringPtr s); /** Get the C string from the XmpStringPtr * @param s the string object * @return the const char * for the XmpStringPtr. It * belong to the object. */ const char * xmp_string_cstr(XmpStringPtr s); /** */ XmpIteratorPtr xmp_iterator_new(XmpPtr xmp, const char * schema, const char * propName, XmpIterOptions options); /** */ bool xmp_iterator_free(XmpIteratorPtr iter); /** Iterate to the next value * @param iter the iterator * @param schema the schema name. Pass NULL if not wanted * @param propName the property path. Pass NULL if not wanted * @param propValue the value of the property. Pass NULL if not wanted. * @param options the options for the property. Pass NULL if not wanted. * @return true if still something, false if none */ bool xmp_iterator_next(XmpIteratorPtr iter, XmpStringPtr schema, XmpStringPtr propName, XmpStringPtr propValue, uint32_t *options); /** */ bool xmp_iterator_skip(XmpIteratorPtr iter, XmpIterSkipOptions options); #ifdef __cplusplus } #endif #endif exempi-2.2.1/exempi/exempi-2.0.pc.in0000664000175000017500000000043712144603625013741 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ VERSION=@VERSION@ Name: exempi Description: Library for easy parsing of XMP metadata. Requires: Version: @VERSION@ Libs: -L${libdir} -lexempi Cflags: -I${includedir}/@EXEMPI_INCLUDE_BASE@ -I${includedir} exempi-2.2.1/exempi/exempi.cpp0000664000175000017500000005243712144603625013226 00000000000000/* * exempi - exempi.cpp * * Copyright (C) 2007-2009 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @brief this file implement the glue for XMP API */ #include "xmpconsts.h" #include "xmp.h" #include "xmperrors.h" #include #include #define XMP_INCLUDE_XMPFILES 1 #define TXMP_STRING_TYPE std::string #include "XMP.hpp" #include "XMP.incl_cpp" #if HAVE_NATIVE_TLS static TLS int g_error = 0; static void set_error(int err) { g_error = err; } #else #include /* Portable thread local storage using pthreads */ static pthread_key_t key = NULL; static pthread_once_t key_once = PTHREAD_ONCE_INIT; /* Destructor called when a thread exits - ensure to delete allocated int pointer */ static void destroy_tls_key( void * ptr ) { int* err_ptr = static_cast(ptr); delete err_ptr; } /* Create a key for use with pthreads local storage */ static void create_tls_key() { (void) pthread_key_create(&key, destroy_tls_key); } /* Obtain the latest xmp error for this specific thread - defaults to 0 */ static int get_error_for_thread() { int * err_ptr; pthread_once(&key_once, create_tls_key); err_ptr = (int *) pthread_getspecific(key); if(err_ptr == NULL) { return 0; } return *err_ptr; } /* set the current xmp error for this specific thread */ static void set_error(int err) { int * err_ptr; // Ensure that create_thread_local_storage_key is only called // once, by the first thread, to create the key. pthread_once(&key_once, create_tls_key); // Retrieve pointer to int for this thread. err_ptr = (int *) pthread_getspecific(key); // Allocate it, if it does not exists. if( err_ptr == NULL ) { err_ptr = new int; pthread_setspecific(key, err_ptr); } // Save the error for this thread. *err_ptr = err; } #endif static void set_error(const XMP_Error & e) { set_error(-e.GetID()); std::cerr << e.GetErrMsg() << std::endl; } #define RESET_ERROR set_error(0) #define ASSIGN(dst, src) \ dst.year = src.year; \ dst.month = src.month;\ dst.day = src.day; \ dst.hour = src.hour; \ dst.minute = src.minute; \ dst.second = src.second; \ dst.tzSign = src.tzSign; \ dst.tzHour = src.tzHour; \ dst.tzMinute = src.tzMinute; \ dst.nanoSecond = src.nanoSecond; #ifdef __cplusplus extern "C" { #endif const char NS_XMP_META[] = "adobe:ns:meta/"; const char NS_RDF[] = kXMP_NS_RDF; const char NS_EXIF[] = kXMP_NS_EXIF; const char NS_TIFF[] = kXMP_NS_TIFF; const char NS_XAP[] = kXMP_NS_XMP; const char NS_XAP_RIGHTS[] = kXMP_NS_XMP_Rights; const char NS_DC[] = kXMP_NS_DC; const char NS_EXIF_AUX[] = kXMP_NS_EXIF_Aux; const char NS_CRS[] = kXMP_NS_CameraRaw; const char NS_LIGHTROOM[] = "http://ns.adobe.com/lightroom/1.0/"; const char NS_CAMERA_RAW_SETTINGS[] = kXMP_NS_CameraRaw; const char NS_CAMERA_RAW_SAVED_SETTINGS[] = "http://ns.adobe.com/camera-raw-saved-settings/1.0/"; const char NS_PHOTOSHOP[] = kXMP_NS_Photoshop; const char NS_IPTC4XMP[] = kXMP_NS_IPTCCore; const char NS_TPG[] = kXMP_NS_XMP_PagedFile; const char NS_DIMENSIONS_TYPE[] = kXMP_NS_XMP_Dimensions; const char NS_CC[] = "http://creativecommons.org/ns#"; const char NS_PDF[] = kXMP_NS_PDF; #define STRING(x) reinterpret_cast(x) #define CHECK_PTR(p,r) \ if(p == NULL) { set_error(XMPErr_BadObject); return r; } int xmp_get_error() { #if HAVE_NATIVE_TLS return g_error; #else return get_error_for_thread(); #endif } bool xmp_init() { RESET_ERROR; try { // no need to initialize anything else. // XMP SDK 5.1.2 needs this because it has been lobotomized of local text conversion // the one that was done in Exempi with libiconv. return SXMPFiles::Initialize(kXMPFiles_IgnoreLocalText); } catch(const XMP_Error & e) { set_error(e); } return false; } void xmp_terminate() { RESET_ERROR; SXMPFiles::Terminate(); } bool xmp_register_namespace(const char *namespaceURI, const char *suggestedPrefix, XmpStringPtr registeredPrefix) { RESET_ERROR; try { return SXMPMeta::RegisterNamespace(namespaceURI, suggestedPrefix, STRING(registeredPrefix)); } catch(const XMP_Error & e) { set_error(e); } return false; } bool xmp_namespace_prefix(const char *ns, XmpStringPtr prefix) { CHECK_PTR(ns, false); RESET_ERROR; try { return SXMPMeta::GetNamespacePrefix(ns, STRING(prefix)); } catch(const XMP_Error & e) { set_error(e); } return false; } bool xmp_prefix_namespace_uri(const char *prefix, XmpStringPtr ns) { CHECK_PTR(prefix, false); RESET_ERROR; try { return SXMPMeta::GetNamespaceURI(prefix, STRING(ns)); } catch(const XMP_Error & e) { set_error(e); } return false; } XmpFilePtr xmp_files_new() { RESET_ERROR; SXMPFiles *txf = NULL; try { txf = new SXMPFiles(); } catch(const XMP_Error & e) { set_error(e); } return (XmpFilePtr)txf; } XmpFilePtr xmp_files_open_new(const char *path, XmpOpenFileOptions options) { CHECK_PTR(path, NULL); RESET_ERROR; SXMPFiles *txf = NULL; try { txf = new SXMPFiles(path, XMP_FT_UNKNOWN, options); } catch(const XMP_Error & e) { set_error(e); } return (XmpFilePtr)txf; } bool xmp_files_open(XmpFilePtr xf, const char *path, XmpOpenFileOptions options) { CHECK_PTR(xf, false); RESET_ERROR; SXMPFiles *txf = (SXMPFiles*)xf; try { return txf->OpenFile(path, XMP_FT_UNKNOWN, options); } catch(const XMP_Error & e) { set_error(e); } return false; } bool xmp_files_close(XmpFilePtr xf, XmpCloseFileOptions options) { CHECK_PTR(xf, false); RESET_ERROR; try { SXMPFiles *txf = (SXMPFiles*)xf; txf->CloseFile(options); } catch(const XMP_Error & e) { set_error(e); return false; } return true; } XmpPtr xmp_files_get_new_xmp(XmpFilePtr xf) { CHECK_PTR(xf, NULL); RESET_ERROR; SXMPMeta *xmp = new SXMPMeta(); SXMPFiles *txf = (SXMPFiles*)xf; bool result = false; try { result = txf->GetXMP(xmp); if(!result) { delete xmp; return NULL; } } catch(const XMP_Error & e) { set_error(e); } return (XmpPtr)xmp; } bool xmp_files_get_xmp(XmpFilePtr xf, XmpPtr xmp) { CHECK_PTR(xf, false); CHECK_PTR(xmp, false); RESET_ERROR; bool result = false; try { SXMPFiles *txf = (SXMPFiles*)xf; result = txf->GetXMP((SXMPMeta*)xmp); } catch(const XMP_Error & e) { set_error(e); } return result; } bool xmp_files_can_put_xmp(XmpFilePtr xf, XmpPtr xmp) { CHECK_PTR(xf, false); RESET_ERROR; SXMPFiles *txf = (SXMPFiles*)xf; bool result = false; try { result = txf->CanPutXMP(*(SXMPMeta*)xmp); } catch(const XMP_Error & e) { set_error(e); return false; } return result; } bool xmp_files_put_xmp(XmpFilePtr xf, XmpPtr xmp) { CHECK_PTR(xf, false); CHECK_PTR(xmp, false); RESET_ERROR; SXMPFiles *txf = (SXMPFiles*)xf; try { txf->PutXMP(*(SXMPMeta*)xmp); } catch(const XMP_Error & e) { set_error(e); return false; } return true; } bool xmp_files_get_file_info(XmpFilePtr xf, XmpStringPtr filePath, XmpOpenFileOptions *options, XmpFileType * file_format, XmpFileFormatOptions *handler_flags) { CHECK_PTR(xf, false); RESET_ERROR; bool result = false; SXMPFiles *txf = (SXMPFiles*)xf; try { result = txf->GetFileInfo(STRING(filePath), (XMP_OptionBits *)options, (XMP_FileFormat *)file_format, (XMP_OptionBits *)handler_flags); } catch(const XMP_Error & e) { set_error(e); return false; } return result; } bool xmp_files_free(XmpFilePtr xf) { CHECK_PTR(xf, false); RESET_ERROR; SXMPFiles *txf = (SXMPFiles*)xf; try { delete txf; } catch(const XMP_Error & e) { set_error(e); return false; } return true; } bool xmp_files_get_format_info(XmpFileType format, XmpFileFormatOptions * options) { RESET_ERROR; bool result = false; try { result = SXMPFiles::GetFormatInfo(format, (XMP_OptionBits*)options); } catch(const XMP_Error & e) { set_error(e); return false; } return result; } XmpFileType xmp_files_check_file_format(const char *filePath) { CHECK_PTR(filePath, XMP_FT_UNKNOWN); RESET_ERROR; XmpFileType file_type = XMP_FT_UNKNOWN; try { file_type = (XmpFileType)SXMPFiles::CheckFileFormat(filePath); } catch(const XMP_Error & e) { set_error(e); return XMP_FT_UNKNOWN; } return file_type; } XmpPtr xmp_new_empty() { RESET_ERROR; SXMPMeta *txmp = new SXMPMeta; return (XmpPtr)txmp; } XmpPtr xmp_new(const char *buffer, size_t len) { CHECK_PTR(buffer, NULL); RESET_ERROR; SXMPMeta *txmp; try { txmp = new SXMPMeta(buffer, len); } catch(const XMP_Error & e) { set_error(e); txmp = 0; } return (XmpPtr)txmp; } XmpPtr xmp_copy(XmpPtr xmp) { CHECK_PTR(xmp, NULL); RESET_ERROR; SXMPMeta *txmp = new SXMPMeta(*(SXMPMeta*)xmp); return (XmpPtr)txmp; } bool xmp_parse(XmpPtr xmp, const char *buffer, size_t len) { CHECK_PTR(xmp, false); CHECK_PTR(buffer, false); SXMPMeta *txmp = (SXMPMeta *)xmp; try { txmp->ParseFromBuffer(buffer, len, kXMP_RequireXMPMeta ); } catch(const XMP_Error & e) { set_error(e); return false; } return true; } bool xmp_serialize(XmpPtr xmp, XmpStringPtr buffer, uint32_t options, uint32_t padding) { RESET_ERROR; return xmp_serialize_and_format(xmp, buffer, options, padding, "\n", " ", 0); } bool xmp_serialize_and_format(XmpPtr xmp, XmpStringPtr buffer, uint32_t options, uint32_t padding, const char *newline, const char *tab, int32_t indent) { CHECK_PTR(xmp, false); CHECK_PTR(buffer, false); RESET_ERROR; SXMPMeta *txmp = (SXMPMeta *)xmp; try { txmp->SerializeToBuffer(STRING(buffer), options, padding, newline, tab, indent); } catch(const XMP_Error & e) { set_error(e); return false; } return true; } bool xmp_free(XmpPtr xmp) { CHECK_PTR(xmp, false); RESET_ERROR; SXMPMeta *txmp = (SXMPMeta *)xmp; delete txmp; return true; } bool xmp_get_property(XmpPtr xmp, const char *schema, const char *name, XmpStringPtr property, uint32_t *propsBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; try { SXMPMeta *txmp = (SXMPMeta *)xmp; XMP_OptionBits optionBits; ret = txmp->GetProperty(schema, name, STRING(property), &optionBits); if(propsBits) { *propsBits = optionBits; } } catch(const XMP_Error & e) { set_error(e); } return ret; } bool xmp_get_property_date(XmpPtr xmp, const char *schema, const char *name, XmpDateTime *property, uint32_t *propsBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; try { SXMPMeta *txmp = (SXMPMeta *)xmp; XMP_OptionBits optionBits; XMP_DateTime dt; // memset((void*)&dt, 1, sizeof(XMP_DateTime)); ret = txmp->GetProperty_Date(schema, name, &dt, &optionBits); ASSIGN((*property), dt); if(propsBits) { *propsBits = optionBits; } } catch(const XMP_Error & e) { set_error(e); } return ret; } bool xmp_get_property_float(XmpPtr xmp, const char *schema, const char *name, double * property, uint32_t *propsBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; try { SXMPMeta *txmp = (SXMPMeta *)xmp; XMP_OptionBits optionBits; ret = txmp->GetProperty_Float(schema, name, property, &optionBits); if(propsBits) { *propsBits = optionBits; } } catch(const XMP_Error & e) { set_error(e); } return ret; } bool xmp_get_property_bool(XmpPtr xmp, const char *schema, const char *name, bool * property, uint32_t *propsBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; try { SXMPMeta *txmp = (SXMPMeta *)xmp; XMP_OptionBits optionBits; ret = txmp->GetProperty_Bool(schema, name, property, &optionBits); if(propsBits) { *propsBits = optionBits; } } catch(const XMP_Error & e) { set_error(e); } return ret; } bool xmp_get_property_int32(XmpPtr xmp, const char *schema, const char *name, int32_t * property, uint32_t *propsBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; try { SXMPMeta *txmp = (SXMPMeta *)xmp; XMP_OptionBits optionBits; // the long converstion is needed until XMPCore is fixed it use proper types. ret = txmp->GetProperty_Int(schema, name, property, &optionBits); if(propsBits) { *propsBits = optionBits; } } catch(const XMP_Error & e) { set_error(e); } return ret; } bool xmp_get_property_int64(XmpPtr xmp, const char *schema, const char *name, int64_t * property, uint32_t *propsBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; try { SXMPMeta *txmp = (SXMPMeta *)xmp; XMP_OptionBits optionBits; ret = txmp->GetProperty_Int64(schema, name, property, &optionBits); if(propsBits) { *propsBits = optionBits; } } catch(const XMP_Error & e) { set_error(e); } return ret; } bool xmp_get_array_item(XmpPtr xmp, const char *schema, const char *name, int32_t index, XmpStringPtr property, uint32_t *propsBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; try { SXMPMeta *txmp = (SXMPMeta *)xmp; XMP_OptionBits optionBits; ret = txmp->GetArrayItem(schema, name, index, STRING(property), &optionBits); if(propsBits) { *propsBits = optionBits; } } catch(const XMP_Error & e) { set_error(e); } return ret; } bool xmp_set_property(XmpPtr xmp, const char *schema, const char *name, const char *value, uint32_t optionBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; SXMPMeta *txmp = (SXMPMeta *)xmp; // see bug #16030 // when it is a struct or an array, get prop return an empty string // but it fail if passed an empty string if ((optionBits & (XMP_PROP_VALUE_IS_STRUCT | XMP_PROP_VALUE_IS_ARRAY)) && (*value == 0)) { value = NULL; } try { txmp->SetProperty(schema, name, value, optionBits); ret = true; } catch(const XMP_Error & e) { set_error(e); } catch(...) { } return ret; } bool xmp_set_property_date(XmpPtr xmp, const char *schema, const char *name, const XmpDateTime *value, uint32_t optionBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; SXMPMeta *txmp = (SXMPMeta *)xmp; try { XMP_DateTime dt; ASSIGN(dt, (*value)); txmp->SetProperty_Date(schema, name, dt, optionBits); ret = true; } catch(const XMP_Error & e) { set_error(e); } catch(...) { } return ret; } bool xmp_set_property_float(XmpPtr xmp, const char *schema, const char *name, double value, uint32_t optionBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; SXMPMeta *txmp = (SXMPMeta *)xmp; try { txmp->SetProperty_Float(schema, name, value, optionBits); ret = true; } catch(const XMP_Error & e) { set_error(e); } catch(...) { } return ret; } bool xmp_set_property_bool(XmpPtr xmp, const char *schema, const char *name, bool value, uint32_t optionBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; SXMPMeta *txmp = (SXMPMeta *)xmp; try { txmp->SetProperty_Bool(schema, name, value, optionBits); ret = true; } catch(const XMP_Error & e) { set_error(e); } catch(...) { } return ret; } bool xmp_set_property_int32(XmpPtr xmp, const char *schema, const char *name, int32_t value, uint32_t optionBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; SXMPMeta *txmp = (SXMPMeta *)xmp; try { txmp->SetProperty_Int(schema, name, value, optionBits); ret = true; } catch(const XMP_Error & e) { set_error(e); } catch(...) { } return ret; } bool xmp_set_property_int64(XmpPtr xmp, const char *schema, const char *name, int64_t value, uint32_t optionBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; SXMPMeta *txmp = (SXMPMeta *)xmp; try { txmp->SetProperty_Int64(schema, name, value, optionBits); ret = true; } catch(const XMP_Error & e) { set_error(e); } catch(...) { } return ret; } bool xmp_set_array_item(XmpPtr xmp, const char *schema, const char *name, int32_t index, const char *value, uint32_t optionBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; SXMPMeta *txmp = (SXMPMeta *)xmp; try { txmp->SetArrayItem(schema, name, index, value, optionBits); ret = true; } catch(const XMP_Error & e) { set_error(e); } catch(...) { } return ret; } bool xmp_append_array_item(XmpPtr xmp, const char *schema, const char *name, uint32_t arrayOptions, const char *value, uint32_t optionBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; SXMPMeta *txmp = (SXMPMeta *)xmp; try { txmp->AppendArrayItem(schema, name, arrayOptions, value, optionBits); ret = true; } catch(const XMP_Error & e) { set_error(e); } catch(...) { } return ret; } bool xmp_delete_property(XmpPtr xmp, const char *schema, const char *name) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = true; SXMPMeta *txmp = (SXMPMeta *)xmp; try { txmp->DeleteProperty(schema, name); } catch(const XMP_Error & e) { set_error(e); ret = false; } catch(...) { ret = false; } return ret; } bool xmp_has_property(XmpPtr xmp, const char *schema, const char *name) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = true; SXMPMeta *txmp = (SXMPMeta *)xmp; try { ret = txmp->DoesPropertyExist(schema, name); } catch(const XMP_Error & e) { set_error(e); ret = false; } catch(...) { ret = false; } return ret; } bool xmp_get_localized_text(XmpPtr xmp, const char *schema, const char *name, const char *genericLang, const char *specificLang, XmpStringPtr actualLang, XmpStringPtr itemValue, uint32_t *propsBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = false; try { SXMPMeta *txmp = (SXMPMeta *)xmp; XMP_OptionBits optionBits; ret = txmp->GetLocalizedText(schema, name, genericLang, specificLang, STRING(actualLang), STRING(itemValue), &optionBits); if(propsBits) { *propsBits = optionBits; } } catch(const XMP_Error & e) { set_error(e); ret = false; } return ret; } bool xmp_set_localized_text(XmpPtr xmp, const char *schema, const char *name, const char *genericLang, const char *specificLang, const char *value, uint32_t optionBits) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = true; SXMPMeta *txmp = (SXMPMeta *)xmp; try { txmp->SetLocalizedText(schema, name, genericLang, specificLang, value, optionBits); } catch(const XMP_Error & e) { set_error(e); ret = false; } catch(...) { ret = false; } return ret; } bool xmp_delete_localized_text(XmpPtr xmp, const char *schema, const char *name, const char *genericLang, const char *specificLang) { CHECK_PTR(xmp, false); RESET_ERROR; bool ret = true; SXMPMeta *txmp = (SXMPMeta *)xmp; try { txmp->DeleteLocalizedText(schema, name, genericLang, specificLang); } catch(const XMP_Error & e) { set_error(e); ret = false; } catch(...) { ret = false; } return ret; } XmpStringPtr xmp_string_new() { return (XmpStringPtr)new std::string; } void xmp_string_free(XmpStringPtr s) { std::string *str = reinterpret_cast(s); delete str; } const char * xmp_string_cstr(XmpStringPtr s) { return reinterpret_cast(s)->c_str(); } XmpIteratorPtr xmp_iterator_new(XmpPtr xmp, const char * schema, const char * propName, XmpIterOptions options) { CHECK_PTR(xmp, NULL); RESET_ERROR; return (XmpIteratorPtr)new SXMPIterator(*(SXMPMeta*)xmp, schema, propName, options); } bool xmp_iterator_free(XmpIteratorPtr iter) { CHECK_PTR(iter, false); RESET_ERROR; SXMPIterator *titer = (SXMPIterator*)iter; delete titer; return true; } bool xmp_iterator_next(XmpIteratorPtr iter, XmpStringPtr schema, XmpStringPtr propName, XmpStringPtr propValue, uint32_t *options) { CHECK_PTR(iter, false); RESET_ERROR; SXMPIterator *titer = (SXMPIterator*)iter; return titer->Next(reinterpret_cast(schema), reinterpret_cast(propName), reinterpret_cast(propValue), options); } bool xmp_iterator_skip(XmpIteratorPtr iter, XmpIterSkipOptions options) { CHECK_PTR(iter, false); RESET_ERROR; SXMPIterator *titer = (SXMPIterator*)iter; titer->Skip(options); return true; } #ifdef __cplusplus } #endif exempi-2.2.1/exempi/xmpconsts.h0000664000175000017500000000452412144603625013434 00000000000000/* * exempi - xmpconsts.h * * Copyright (C) 2007 Hubert Figuiere * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _EXEMPI_XMP_CONSTS_H_ #define _EXEMPI_XMP_CONSTS_H_ #ifdef __cplusplus extern "C" { #endif extern const char NS_XMP_META[]; extern const char NS_RDF[]; extern const char NS_EXIF[]; extern const char NS_TIFF[]; extern const char NS_XAP[]; extern const char NS_XAP_RIGHTS[]; extern const char NS_DC[]; extern const char NS_EXIF_AUX[]; extern const char NS_CRS[]; extern const char NS_LIGHTROOM[]; extern const char NS_PHOTOSHOP[]; extern const char NS_CAMERA_RAW_SETTINGS[]; extern const char NS_CAMERA_RAW_SAVED_SETTINGS[]; extern const char NS_IPTC4XMP[]; extern const char NS_TPG[]; extern const char NS_DIMENSIONS_TYPE[]; /** Creative Commons namespace */ extern const char NS_CC[]; /* Added in Exempi 2.1 */ extern const char NS_PDF[]; #ifdef __cplusplus } #endif #endif exempi-2.2.1/exempi/Makefile.am0000664000175000017500000000466312150232041013250 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007-2013 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # SUBDIRS = tests DIST_SUBDIRS = tests doc exempidir = $(includedir)/@EXEMPI_INCLUDE_BASE@/exempi exempi_HEADERS = xmp.h xmpconsts.h xmperrors.h xmp++.hpp bin_PROGRAMS = exempi exempi_SOURCES = main.cpp exempi_CPPFLAGS = -I$(srcdir)/.. exempi_LDADD = libexempi.la INCLUDES = -I$(top_srcdir)/public/include AM_CPPFLAGS = -Wall -D@EXEMPI_PLATFORM_DEF@=1 lib_LTLIBRARIES = libexempi.la pkgconfig_DATA = exempi-@EXEMPI_MAJOR_VERSION@.pc libexempi_la_SOURCES = exempi.cpp libexempi_la_LIBADD = $(top_builddir)/source/common/libxmpcommon.la \ $(top_builddir)/source/XMPCore/libXMPCore.la \ $(top_builddir)/source/XMPFiles/libXMPFiles.la \ $(top_builddir)/third-party/MD5/libmd5.la \ -lexpat -lz libexempi_la_LDFLAGS = -version-info @EXEMPI_VERSION_INFO@ if HAVE_SYMBOLS_FILE libexempi_la_LDFLAGS += -Wl,--retain-symbols-file=$(srcdir)/libexempi.sym endif dist_man1_MANS = exempi.1 EXTRA_DIST = libexempi.sym exempi-2.2.1/exempi/xmperrors.h0000664000175000017500000000602312144603625013433 00000000000000/* * exempi - xmperror.h * * Copyright (C) 2007 Hubert Figuiere * Copyright 2002-2007 Adobe Systems Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1 Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2 Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * 3 Neither the name of the Authors, nor the names of its * contributors may be used to endorse or promote products derived * from this software wit hout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __EXEMPI_XMPERROR_H_ #define __EXEMPI_XMPERROR_H_ enum { /* More or less generic error codes. */ XMPErr_Unknown = 0, XMPErr_TBD = -1, XMPErr_Unavailable = -2, XMPErr_BadObject = -3, XMPErr_BadParam = -4, XMPErr_BadValue = -5, XMPErr_AssertFailure = -6, XMPErr_EnforceFailure = -7, XMPErr_Unimplemented = -8, XMPErr_InternalFailure = -9, XMPErr_Deprecated = -10, XMPErr_ExternalFailure = -11, XMPErr_UserAbort = -12, XMPErr_StdException = -13, XMPErr_UnknownException = -14, XMPErr_NoMemory = -15, /* More specific parameter error codes. */ XMPErr_BadSchema = -101, XMPErr_BadXPath = -102, XMPErr_BadOptions = -103, XMPErr_BadIndex = -104, XMPErr_BadIterPosition = -105, XMPErr_BadParse = -106, XMPErr_BadSerialize = -107, XMPErr_BadFileFormat = -108, XMPErr_NoFileHandler = -109, XMPErr_TooLargeForJPEG = -110, /* File format and internal structure error codes. */ XMPErr_BadXML = -201, XMPErr_BadRDF = -202, XMPErr_BadXMP = -203, XMPErr_EmptyIterator = -204, XMPErr_BadUnicode = -205, XMPErr_BadTIFF = -206, XMPErr_BadJPEG = -207, XMPErr_BadPSD = -208, XMPErr_BadPSIR = -209, XMPErr_BadIPTC = -210, XMPErr_BadMPEG = -211 }; #endif exempi-2.2.1/exempi/exempi.10000664000175000017500000000212312144603625012567 00000000000000.TH exempi 1 "February 10 2013" .SH NAME exempi - command line tool to manipulate XMP metadata .SH SYNTAX exempi { -h | [ -R ] [ -x ] [ { -w | -o } ] [ { -g | -s -v } ] } .SH OPTIONS .IP "-h: show this help" .IP "-R: don't reconcile" .IP "-x: dump XML" .IP "-X: file(s) is XMP" .IP "-w: write in place. Only for -s. Not compatible with -o." .IP "-o : file to write the output to." .IP "-n : set the prefix for a namespace." .IP "-g : retrieve the value with prop_name." .IP "-s -v : retrieve or get the value." .IP " the files to read from." .SH SECURITY The source code hasn't been audited for security. The command line tool doesn't have a strong input sanity checking easier. .P Be careful not to run the tool as super-user. Be careful if you decide to use it in an online (web) application. .P Patches and suggestions welcome. .SH AUHTORS Exempi is written by Hubert Figuiere .P It contains the XMP SDK written by Adobe Systems Inc. .SH LICENSE Exempi is licensed under the BSD license. exempi-2.2.1/Makefile.in0000664000175000017500000006325012150231001011762 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ ChangeLog INSTALL NEWS TODO config.guess config.sub depcomp \ install-sh ltmain.sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ cscope distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags CSCOPE = cscope DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 GZIP_ENV = --best DIST_TARGETS = dist-bzip2 dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 SUBDIRS = third-party source samples exempi DIST_SUBDIRS = build third-party source samples exempi public EXTRA_DIST = autogen.sh all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist-recursive cscopelist cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-cscope \ clean-generic clean-libtool cscope cscopelist \ cscopelist-recursive ctags ctags-recursive dist dist-all \ dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/ltmain.sh0000644000175000017500000105152212027535365011562 00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 exempi-2.2.1/depcomp0000755000175000017500000004426711657666561011341 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2009-04-28.21; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free # Software Foundation, Inc. # 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. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u="sed s,\\\\\\\\,/,g" depmode=msvisualcpp fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: exempi-2.2.1/NEWS0000664000175000017500000001275112163706162010437 000000000000002.2.1 - 2013/06/29 - Bug #54011: Use POSIX API for files on MacOS. (Misty De Meo) - Bug #58175: Replace OS X FlatCarbon headers. (Misty De Meo) - Added a manpage for exempi(1). - Added the -n option to the command line for arbitrary namespaces. 2.2.0 - 2012/02/21 - New 'exempi' command line tool. - Upgrade XMPCore to Adobe XMP 5.1.2 - Quicktime support now works without Quicktime. - Reconciliation with ID3v2. - "Blessed" 64-bits support (we already had it in exempi). - Slight change in the way XMP are written for MWG compliance. - Fixed a serious bug with RIFF. - Change in the way local text encoding is dealt with. - Alternative languages behave slightly differently by changing how the default language property is managed. - Probably a bunch of bugs fixed that I don't know about. - Update unit tests. - Refactor the fixtures. - Use automake silent rules instead of shave. (build only) - "make dist" generate a bzip2 archive as well. (build only) - Remove some obsolete warning flags. (build only) - Build xmpcommandtool - New: API xmp_files_get_format_info(). - New: API xmp_files_check_file_format(). - New: API xmp_files_get_file_info(). - New: API XMP_PROP_ARRAY_INSERT_BEFORE, XMP_PROP_ARRAY_INSERT_AFTER array options. - New: C++ helpers in xmp++.hpp. Bug fixes: - Bug #37747: mismatch delete/delete[] and new/new[] (from Meego https://bugs.meego.com/show_bug.cgi?id=14661) 2.1.1 - 2009/06/30 New features: - Added shave to the build system for sane output. (build only) Bug fixes: - Bug #16030: if the property is an array or struct allow "" to be passed as a value. - Bug #19312: source/XMPFiles/FileHandlers/P2_Handler.cpp was using an improper string comparison. (made rpmlint unhappy). - Bug #20554: Missing file on MacOS X. - Bug #20554: Detect ldflags properly. - Bug #20622: Catch unhandled exceptions in xmp_files_can_put_xmp(). - Bug #21934: Mismatched new [] / delete. - Bug #22554: Fix a SIGFPE encountered on some invalid files. (Bug GNOME #586720) 2.1.0 - Upgrade XMPCore to Adobe XMP 4.4.2 - Handlers for additional file formats, including ASF (WMA, WMV), FLV; MPEG4; SWF; folder-based video formats AVCHD, P2, SonyHDV, and XDCAM; UCF - Additional schemas to support document histories, composed documents, and temporal metadata - New: NS_PDF namespace for PDF. - New: API xmp_prefix_namespace_uri() and xmp_namespace_prefix(). Bug #14962. - Bug: make sure boost >1.35 does not fail test with system(). - Bug: unit test now use boost/test/minimal.hpp to work with more boost install. (known boost.test bug) - Bug: fix a typo in a CHECK_PTR call causing warnings on gcc < 4. - Bug: no longer define UNIX_ENV in exempi.cpp and let CPPFLAGS do it. - Bug #16139: the list of exported symbols was too large. - Bug #18635: fix crasher. 2.0.2 - Bug #16598: address the lack of TLS for some platforms. 2.0.1 - Bug #14612: no stdbool.h for Sun compilers. - Bug #14613: check for iconv() const-ness. - Make the error checking more robust. - Make error code thread-safe (ie local to the thread). 2.0.0 - Bug #14614, Bug #15263: endian detection in configure. - Bug #14615: missing includes for Solaris. 1.99.9 - Bug: fixed an API breakage introduced in 1.99.8 1.99.8 - Bug #14049: don't run autoheader. - Bug #13712: add --enable-unittest to disable tests. - Bug: Disable strict aliasing in XMPFiles due to bad casting. - Bug #14200: fix a typo. - Bug: fix a couple of buffer overflows in GIF support. Closes Debian #454297. Closes Gnome #484105 1.99.7 - Bug: fix soversion. 1.99.6 - New: API xmp_get_property_date() / xmp_set_property_date() with tests. - New: API xmp_{get,set]_property_{float,bool,int32,int64}() with tests. - New: API add ACR schema namespaces. - Test: refactor a the tests preparation. - Test: add a test for multiple initializations. - Test: use valgrind is available. - Bug: fix configure to allow building on MacOS X. Closes bug #13596 - Bug #13707: add autogen.sh - Bug #13713: fix boost macros to link boost.test statically (for 1.34). - Bug #13712: skip tests if no boost. 1.99.5 - ABI breakage: soversion is now 3 - Change: API xmp_files_close(), xmp_files_put_xmp(), xmp_files_free(), xmp_free(), xmp_iterator_free(), xmp_iterator_skip() now return bool. - Change: API xmp_get_property_and_bits() renamed xmp_get_property(). - Change: API xmp_set_property2() renamed xmp_set_property(). - Bug: all API should check about input and return an error if passed NULL. - Bug: more exception handling and refactor set_error() use. - Bug: add AC_CONFIG_MACRO_DIR to configure. - Bug: Lower requirement for libboost to 1.33.0. - New: Doxygen API doc generation. 1.99.4 - New: GIF Files smart handlers - New: API xmp_append_array_item(), xmp_delete_property(), xmp_has_property(), xmp_get_localized_text(), xmp_set_localized_text() - New: API xmp_delete_localized_text() - New: Exempi will be visible in the "generator" string of the XMP packet. - Bug: xmp_files_open_new() will handle exceptions properly 1.99.3 - New: API xmp_serialize{,_and_format}() and the corresponding option bits - New API xmp_get_array_item() 1.99.2 - New: API xmp_copy() - New: API xmp_set_property2(), xmp_set_array_item() and xmp_get_error() - New: API xmp_get_property_and_bits() - Bug: xmp_files_get_xmp() handle exceptions properly. 1.99.1 - Bug: store the TIFF tag as BYTE and not UNDEFINED to comply with the spec. - Bug: more exception catched. - New: added NS_CC namespace - New: API xmp_register_namespace() 1.99.0 Initial release of the 2.0 series. Based on Adobe XMP SDK 4.1.1 exempi-2.2.1/configure.ac0000664000175000017500000001677012150230672012225 00000000000000dnl Copyright (C) 2007-2010 Hubert Figuiere dnl Small portions are: dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. AC_PREREQ(2.50) AC_INIT(exempi,2.2.1) AM_INIT_AUTOMAKE([foreign dist-bzip2]) AM_MAINTAINER_MODE m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])]) AM_SILENT_RULES([yes]) dnl --------------------------------------------------------------------------- dnl Advanced information about versioning: dnl * "Writing shared libraries" by Mike Hearn dnl http://navi.cx/~mike/writing-shared-libraries.html dnl * libtool.info chapter "Versioning" dnl * libtool.info chapter "Updating library version information" dnl --------------------------------------------------------------------------- dnl Versioning: dnl - CURRENT (Major): Increment if the interface has changes. AGE is always dnl *changed* at the same time. dnl - AGE (Micro): Increment if any interfaces have been added; set to 0 dnl if any interfaces have been removed. Removal has dnl precedence over adding, so set to 0 if both happened. dnl It denotes upward compatibility. dnl - REVISION (Minor): Increment any time the source changes; set to dnl 0 if you incremented CURRENT. dnl dnl To summarize. Any interface *change* increment CURRENT. If that interface dnl change does not break upward compatibility (ie it is an addition), dnl increment AGE, Otherwise AGE is reset to 0. If CURRENT has changed, dnl REVISION is set to 0, otherwise REVISION is incremented. dnl --------------------------------------------------------------------------- dnl 1.99.0 is the revision 2 0 0 dnl 1.99.1 is the revision 3 1 0 dnl 1.99.2 is the revision 4 2 0 dnl 1.99.3 is the revision 5 3 0 dnl 1.99.4 is the revision 6 4 0 dnl ABI breakage reset major to 3 dnl 1.99.5 is the revision 3.0.0 dnl 1.99.6 is the revision 3.1.0 WHICH IS WRONG!!! dnl 1.99.7 is the revision 4.1.0 dnl 1.99.8 is the revision 4.1.1 dnl 1.99.9 is the revision 4.1.1 (no library change have been made) dnl 2.0.0 is the revision 4.1.2 dnl 2.0.1 is the revision 4.1.3 dnl 2.0.2 is the revision 4.1.4 dnl 2.1.0 is the revision 5.2.0 dnl 2.1.1 is the revision 5.2.1 dnl 2.2.0 is the revision 5.2.2 -- no public API change dnl 2.2.1 is the revision 5.2.3 -- no public API change AC_SUBST([EXEMPI_REVISION], [3]) AC_SUBST([EXEMPI_AGE], [2]) AC_SUBST([EXEMPI_CURRENT], [5]) AC_SUBST([EXEMPI_CURRENT_MIN], [`expr $EXEMPI_CURRENT - $EXEMPI_AGE`]) AC_SUBST([EXEMPI_VERSION_INFO], [$EXEMPI_CURRENT:$EXEMPI_REVISION:$EXEMPI_AGE]) dnl the major version. used for package names, etc EXEMPI_MAJOR_VERSION=2.0 AC_SUBST(EXEMPI_MAJOR_VERSION) dnl the path where includes are installed EXEMPI_INCLUDE_BASE=exempi-$EXEMPI_MAJOR_VERSION AC_SUBST(EXEMPI_INCLUDE_BASE) dnl -------------------------------------------------------------------- dnl guess directory to install *.pc into dnl -------------------------------------------------------------------- pkgconfigdir='${libdir}/pkgconfig' AC_SUBST(pkgconfigdir) AC_CONFIG_MACRO_DIR([m4]) AC_PROG_CC AC_PROG_CXX AC_PROG_LIBTOOL AC_C_BIGENDIAN AC_DEFINE(CHECKED_ENDIANNESS) AC_ARG_WITH(darwinports,[ --with-darwinports add /opt/local/... to CPP/LDFLAGS (Mac OSX)],[ if test "x$withval" != "xno"; then CPPFLAGS="$CPPFLAGS -I/opt/local/include" LDFLAGS="$LDFLAGS -L/opt/local/lib" CC=g++ fi ]) AC_ARG_WITH(fink,[ --with-fink add /sw/... to CPP/LDFLAGS (Mac OSX)],[ if test "x$withval" != "xno"; then CPPFLAGS="$CPPFLAGS -I/sw/include" LDFLAGS="$LDFLAGS -L/sw/lib" CC=g++ fi ]) AC_CHECK_HEADER(expat.h, , AC_MSG_ERROR([expat headers missing])) AC_CHECK_HEADER(iconv.h, , AC_MSG_ERROR([iconv headers missing])) AC_CHECK_HEADER(zlib.h, , AC_MSG_ERROR([zlib headers missing])) dnl Blatently copied from iconv.m4 to remove the crack about libtool dnl But check for constness of the iconv parameters. AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL(am_cv_proto_iconv, [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) dnl end iconv checks dnl TLS. AX_TLS if test "$ac_cv_tls" != "none"; then AC_DEFINE(HAVE_NATIVE_TLS, [1], [Define if compiler has native TLS.]) fi dnl end TLS dnl check LD Flags dnl we need a valid symfile. Make one. cat >> _ac_foo.sym << _ACEOF foo _ACEOF AX_LD_CHECK_FLAG([-Wl,--retain-symbols-file=_ac_foo.sym],[],[],[ dnl success cv_support_symfile=yes ],[ dnl fail cv_support_symfile=no ]) rm -f _ac_foo.sym AM_CONDITIONAL(HAVE_SYMBOLS_FILE, test x$cv_support_symfile = "xyes") AC_ARG_ENABLE(unittest, AC_HELP_STRING([--enable-unittest=yes|no], [enable the unittest. requires boost (default is yes)]), ENABLE_UNITTEST=$enableval, ENABLE_UNITTEST=yes) if test x$ENABLE_UNITTEST = xyes ; then BOOST_REQUIRE([1.33.0]) BOOST_TEST([mt-s]) else ENABLE_UNITTEST=no fi case $build_vendor in apple) EXEMPI_PLATFORM_DEF=MAC_ENV LDFLAGS="$LDFLAGS -framework CoreServices" ;; *) EXEMPI_PLATFORM_DEF=UNIX_ENV ;; esac AC_SUBST(EXEMPI_PLATFORM_DEF) AM_CONDITIONAL(WITH_UNIT_TEST, test x$ENABLE_UNITTEST = xyes) dnl Check for valgrind (optional) for make check. AC_CHECK_PROG(VALGRIND, valgrind, valgrind) AC_CHECK_HEADERS(valgrind/memcheck.h) if test "$VALGRIND" = ""; then AC_MSG_WARN([Valgrind is missing. checks will run without]) fi if test "$VALGRIND" != ""; then dnl due to stupid m4 I had to double the [ and ] in the regexp vg_ver=`valgrind --version | sed -e 's/.*-\([[0-9]]\)\.[[0-9]].*/\1/'` VALGRIND="$VALGRIND --tool=memcheck --leak-check=yes --num-callers=10" if test "$vg_ver" != "3" ; then VALGRIND="$VALGRIND --logfile-fd=-1" fi fi AC_SUBST(VALGRIND) AC_OUTPUT([ Makefile third-party/Makefile third-party/MD5/Makefile source/Makefile source/common/Makefile source/XMPCore/Makefile source/XMPFiles/Makefile source/XMPFiles/FileHandlers/Makefile source/XMPFiles/FormatSupport/Makefile samples/Makefile samples/source/Makefile samples/testfiles/Makefile build/Makefile public/Makefile public/include/Makefile public/include/client-glue/Makefile exempi/Makefile exempi/doc/Makefile exempi/doc/Doxyfile exempi/tests/Makefile exempi/exempi-2.0.pc ]) echo " Defines: EXEMPI_PLATFORM_DEF = $EXEMPI_PLATFORM_DEF CPPFLAGS = $CPPFLAGS LDFLAGS = $LDFLAGS Thread Local Storage = $ac_cv_tls Run unit test = $ENABLE_UNITTEST " exempi-2.2.1/config.sub0000755000175000017500000010316711657666561011742 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. timestamp='2009-11-20' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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 of the License, 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. # # 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | ubicom32 \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | picochip) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: exempi-2.2.1/m4/0000775000175000017500000000000012163706251010331 500000000000000exempi-2.2.1/m4/ltsugar.m40000644000175000017500000001042412027535365012200 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) exempi-2.2.1/m4/lt~obsolete.m40000644000175000017500000001375612027535365013104 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) exempi-2.2.1/m4/ax_tls.m40000664000175000017500000000573212144603625012014 00000000000000# =========================================================================== # http://autoconf-archive.cryp.to/ax_tls.html # =========================================================================== # # SYNOPSIS # # AX_TLS # # DESCRIPTION # # Provides a test for the compiler support of thread local storage (TLS) # extensions. Defines TLS if it is found. Currently only knows about GCC # and MSVC. I think SunPro uses the same as GCC, and Borland apparently # supports either. # # LAST MODIFICATION # # 2008-04-12 # # COPYLEFT # # Copyright (c) 2008 Alan Woodland # # 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 3 of the License, 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. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Macro Archive. When you make and # distribute a modified version of the Autoconf Macro, you may extend this # special exception to the GPL to apply to your modified version as well. AC_DEFUN([AX_TLS], [ AC_MSG_CHECKING(for thread local storage (TLS) class) AC_CACHE_VAL(ac_cv_tls, [ ax_tls_keywords="__thread __declspec(thread) none" for ax_tls_keyword in $ax_tls_keywords; do case $ax_tls_keyword in none) ac_cv_tls=none ; break ;; *) AC_TRY_COMPILE( [#include static void foo(void) { static ] $ax_tls_keyword [ int bar; exit(1); }], [], [ac_cv_tls=$ax_tls_keyword ; break], ac_cv_tls=none ) esac done ]) if test "$ac_cv_tls" != "none"; then dnl AC_DEFINE([TLS], [], [If the compiler supports a TLS storage class define it to that here]) AC_DEFINE_UNQUOTED([TLS], $ac_cv_tls, [If the compiler supports a TLS storage class define it to that here]) fi AC_MSG_RESULT($ac_cv_tls) ]) exempi-2.2.1/m4/libtool.m40000644000175000017500000105743212027535365012176 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS exempi-2.2.1/m4/boost.m40000664000175000017500000007250512144603625011652 00000000000000# boost.m4: Locate Boost headers and libraries for autoconf-based projects. # Copyright (C) 2007 Benoit Sigoure # # 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 3 of the License, 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. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # serial 4 # Original sources can be found at http://repo.or.cz/w/boost.m4.git # You can fetch the latest version of the script by doing: # wget 'http://repo.or.cz/w/boost.m4.git?a=blob_plain;f=build-aux/boost.m4;hb=HEAD' -O boost.m4 # ------ # # README # # ------ # # This file provides several macros to use the various Boost libraries. # The first macro is BOOST_REQUIRE. It will simply check if it's possible to # find the Boost headers of a given (optional) minimum version and it will # define BOOST_CPPFLAGS accordingly. It will add an option --with-boost to # your configure so that users can specify non standard locations. # For more README and documentation, go to http://repo.or.cz/w/boost.m4.git # Note: THESE MACRO ASSUME THAT YOU USE LIBTOOL. If you don't, don't worry, # simply read the README, it will show you what to do step by step. m4_pattern_forbid([^_?BOOST_]) # BOOST_REQUIRE([VERSION]) # ------------------------ # Look for Boost. If version is given, it must either be a literal of the form # "X.Y.Z" where X, Y and Z are integers (the ".Z" part being optional) or a # variable "$var". # Defines the value BOOST_CPPFLAGS. This macro only checks for headers with # the required version, it does not check for any of the Boost libraries. # FIXME: Add a 2nd optional argument so that it's not fatal if Boost isn't found # and add an AC_DEFINE to tell whether HAVE_BOOST. AC_DEFUN([BOOST_REQUIRE], [dnl First find out what kind of argument we have. dnl If we have an empty argument, there is no constraint on the version of dnl Boost to use. If it's a literal version number, we can split it in M4 (so dnl the resulting configure script will be smaller/faster). Otherwise we do dnl the splitting at runtime. m4_bmatch([$1], [^ *$], [m4_pushdef([BOOST_VERSION_REQ], [])dnl boost_version_major=0 boost_version_minor=0 boost_version_subminor=0 ], [^[0-9]+\([-._][0-9]+\)*$], [m4_pushdef([BOOST_VERSION_REQ], [ version >= $1])dnl boost_version_major=m4_bregexp([$1], [^\([0-9]+\)], [\1]) boost_version_minor=m4_bregexp([$1], [^[0-9]+[-._]\([0-9]+\)], [\1]) boost_version_subminor=m4_bregexp([$1], [^[0-9]+[-._][0-9]+[-._]\([0-9]+\)], [\1]) ], [^\$[a-zA-Z_]+$], [m4_pushdef([BOOST_VERSION_REQ], [])dnl boost_version_major=`expr "X$1" : 'X\([[^-._]]*\)'` boost_version_minor=`expr "X$1" : 'X[[0-9]]*[[-._]]\([[^-._]]*\)'` boost_version_subminor=`expr "X$1" : 'X[[0-9]]*[[-._]][[0-9]]*[[-._]]\([[0-9]]*\)'` case $boost_version_major:$boost_version_minor in #( *: | :* | *[[^0-9]]*:* | *:*[[^0-9]]*) AC_MSG_ERROR([[Invalid argument for REQUIRE_BOOST: `$1']]) ;; esac ], [m4_fatal(Invalid argument: `$1')] )dnl AC_ARG_WITH([boost], [AS_HELP_STRING([--with-boost=DIR], [prefix of Boost]BOOST_VERSION_REQ[ @<:@guess@:>@])])dnl AC_SUBST([DISTCHECK_CONFIGURE_FLAGS], ["$DISTCHECK_CONFIGURE_FLAGS '--with-boost=$with_boost'"]) AC_CACHE_CHECK([for Boost headers[]BOOST_VERSION_REQ], [boost_cv_inc_path], [boost_cv_inc_path=no AC_LANG_PUSH([C++])dnl boost_subminor_chk= test x"$boost_version_subminor" != x \ && boost_subminor_chk="|| (B_V_MAJ == $boost_version_major \ && B_V_MIN == $boost_version_minor \ && B_V_SUB < $boost_version_subminor)" for boost_inc in "$with_boost/include" '' \ /opt/local/include /usr/local/include /opt/include /usr/include \ "$with_boost" C:/Boost/include do test -e "$boost_inc" || continue # Ensure that version.hpp exists: we're going to read it. Moreover, # Boost could be reachable thanks to the default include path so we can # mistakenly accept a wrong include path without this check. test -e "$boost_inc/boost/version.hpp" || continue boost_save_CPPFLAGS=$CPPFLAGS test x"$boost_inc" != x && CPPFLAGS="$CPPFLAGS -I$boost_inc" m4_pattern_allow([^BOOST_VERSION$])dnl AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #ifndef BOOST_VERSION # error BOOST_VERSION is not defined #endif #define B_V_MAJ (BOOST_VERSION / 100000) #define B_V_MIN (BOOST_VERSION / 100 % 1000) #define B_V_SUB (BOOST_VERSION % 100) #if (B_V_MAJ < $boost_version_major) \ || (B_V_MAJ == $boost_version_major \ && B_V_MIN < $boost_version_minor) $boost_subminor_chk # error Boost headers version < $1 #endif ]])], [boost_cv_inc_path=yes], [boost_cv_version=no]) CPPFLAGS=$boost_save_CPPFLAGS if test x"$boost_cv_inc_path" = xyes; then if test x"$boost_inc" != x; then boost_cv_inc_path=$boost_inc fi break fi done AC_LANG_POP([C++])dnl ]) case $boost_cv_inc_path in #( no) AC_MSG_ERROR([Could not find Boost headers[]BOOST_VERSION_REQ]) ;;#( yes) BOOST_CPPFLAGS= ;;#( *) BOOST_CPPFLAGS="-I$boost_cv_inc_path" ;; esac AC_SUBST([BOOST_CPPFLAGS])dnl AC_CACHE_CHECK([for Boost's header version], [boost_cv_lib_version], [m4_pattern_allow([^BOOST_LIB_VERSION$])dnl boost_cv_lib_version=unknown boost_sed_version='/^.*BOOST_LIB_VERSION.*"\([[^"]]*\)".*$/!d;s//\1/' boost_version_hpp="$boost_inc/boost/version.hpp" test -e "$boost_version_hpp" \ && boost_cv_lib_version=`sed "$boost_sed_version" "$boost_version_hpp"` ]) m4_popdef([BOOST_VERSION_REQ])dnl ])# BOOST_REQUIRE # BOOST_FIND_HEADER([HEADER-NAME], [ACTION-IF-NOT-FOUND], [ACTION-IF-FOUND]) # -------------------------------------------------------------------------- # Wrapper around AC_CHECK_HEADER for Boost headers. Useful to check for # some parts of the Boost library which are only made of headers and don't # require linking (such as Boost.Foreach). # # Default ACTION-IF-NOT-FOUND: Fail with a fatal error. # # Default ACTION-IF-FOUND: define the preprocessor symbol HAVE_ in # case of success # (where HEADER-NAME is written LIKE_THIS, e.g., # HAVE_BOOST_FOREACH_HPP). AC_DEFUN([BOOST_FIND_HEADER], [AC_REQUIRE([BOOST_REQUIRE])dnl AC_LANG_PUSH([C++])dnl boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" AC_CHECK_HEADER([$1], [m4_default([$3], [AC_DEFINE(AS_TR_CPP([HAVE_$1]), [1], [Define to 1 if you have <$1>])])], [m4_default([$2], [AC_MSG_ERROR([cannot find $1])])]) CPPFLAGS=$boost_save_CPPFLAGS AC_LANG_POP([C++])dnl ])# BOOST_FIND_HEADER # BOOST_FIND_LIB([LIB-NAME], [PREFERRED-RT-OPT], [HEADER-NAME], [CXX-TEST], [CXX-PROLOGUE]) # ------------------------------------------------------------------------- # Look for the Boost library LIB-NAME (e.g., LIB-NAME = `thread', for # libboost_thread). Check that HEADER-NAME works and check that # libboost_LIB-NAME can link with the code CXX-TEST. # # Invokes BOOST_FIND_HEADER([HEADER-NAME]) (see above). # # Boost libraries typically come compiled with several flavors (with different # runtime options) so PREFERRED-RT-OPT is the preferred suffix. A suffix is one # or more of the following letters: sgdpn (in that order). s = static # runtime, d = debug build, g = debug/diagnostic runtime, p = STLPort build, # n = (unsure) STLPort build without iostreams from STLPort (it looks like `n' # must always be used along with `p'). Additionally, PREFERRED-RT-OPT can # start with `mt-' to indicate that there is a preference for multi-thread # builds. Some sample values for PREFERRED-RT-OPT: (nothing), mt, d, mt-d, gdp # ... If you want to make sure you have a specific version of Boost # (eg, >= 1.33) you *must* invoke BOOST_REQUIRE before this macro. AC_DEFUN([BOOST_FIND_LIB], [AC_REQUIRE([_BOOST_FIND_COMPILER_TAG])dnl AC_REQUIRE([BOOST_REQUIRE])dnl AC_REQUIRE([_BOOST_GUESS_WHETHER_TO_USE_MT])dnl AC_LANG_PUSH([C++])dnl AS_VAR_PUSHDEF([Boost_lib], [boost_cv_lib_$1])dnl AS_VAR_PUSHDEF([Boost_lib_LDFLAGS], [boost_cv_lib_$1_LDFLAGS])dnl AS_VAR_PUSHDEF([Boost_lib_LIBS], [boost_cv_lib_$1_LIBS])dnl BOOST_FIND_HEADER([$3]) boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" # Now let's try to find the library. The algorithm is as follows: first look # for a given library name according to the user's PREFERRED-RT-OPT. For each # library name, we prefer to use the ones that carry the tag (toolset name). # Each library is searched through the various standard paths were Boost is # usually installed. If we can't find the standard variants, we try to # enforce -mt (for instance on MacOSX, libboost_threads.dylib doesn't exist # but there's -obviously- libboost_threads-mt.dylib). AC_CACHE_CHECK([for the Boost $1 library], [Boost_lib], [Boost_lib=no case "$2" in #( mt | mt-) boost_mt=-mt; boost_rtopt=;; #( mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X$2" : 'Xmt-*\(.*\)'`;; #( *) boost_mt=; boost_rtopt=$2;; esac # If the PREFERRED-RT-OPT are not empty, prepend a `-'. case $boost_rtopt in #( *[[a-z0-9A-Z]]*) boost_rtopt="-$boost_rtopt";; esac $boost_guess_use_mt && boost_mt=-mt # Look for the abs path the static archive. # $libext is computed by Libtool but let's make sure it's non empty. test -z "$libext" && AC_MSG_ERROR([the libext variable is empty, did you invoke Libtool?]) boost_save_ac_objext=$ac_objext # Generate the test file. AC_LANG_CONFTEST([AC_LANG_PROGRAM([#include <$3> $5], [$4])]) dnl Optimization hacks: compiling C++ is slow, especially with Boost. What dnl we're trying to do here is guess the right combination of link flags dnl (LIBS / LDFLAGS) to use a given library. This can take several dnl iterations before it succeeds and is thus *very* slow. So what we do dnl instead is that we compile the code first (and thus get an object file, dnl typically conftest.o). Then we try various combinations of link flags dnl until we succeed to link conftest.o in an executable. The problem is dnl that the various TRY_LINK / COMPILE_IFELSE macros of Autoconf always dnl remove all the temporary files including conftest.o. So the trick here dnl is to temporarily change the value of ac_objext so that conftest.o is dnl preserved accross tests. This is obviously fragile and I will burn in dnl hell for not respecting Autoconf's documented interfaces, but in the dnl mean time, it optimizes the macro by a factor of 5 to 30. dnl Another small optimization: the first argument of AC_COMPILE_IFELSE left dnl empty because the test file is generated only once above (before we dnl start the for loops). AC_COMPILE_IFELSE([], [ac_objext=do_not_rm_me_plz], [AC_MSG_ERROR([Cannot compile a test that uses Boost $1])]) ac_objext=$boost_save_ac_objext boost_failed_libs= # Don't bother to ident the 6 nested for loops, only the 2 innermost ones # matter. for boost_tag_ in -$boost_cv_lib_tag ''; do for boost_ver_ in -$boost_cv_lib_version ''; do for boost_mt_ in $boost_mt -mt ''; do for boost_rtopt_ in $boost_rtopt '' -d; do for boost_lib in \ boost_$1$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \ boost_$1$boost_tag_$boost_mt_$boost_ver_ \ boost_$1$boost_tag_$boost_rtopt_$boost_ver_ \ boost_$1$boost_tag_$boost_mt_ \ boost_$1$boost_tag_$boost_ver_ do # Avoid testing twice the same lib case $boost_failed_libs in #( *@$boost_lib@*) continue;; esac # If with_boost is empty, we'll search in /lib first, which is not quite # right so instead we'll try to a location based on where the headers are. boost_tmp_lib=$with_boost test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include} for boost_ldpath in "$boost_tmp_lib/lib" '' \ /opt/local/lib /usr/local/lib /opt/lib /usr/lib \ "$with_boost" C:/Boost/lib /lib /usr/lib64 /lib64 do test -e "$boost_ldpath" || continue boost_save_LDFLAGS=$LDFLAGS # Are we looking for a static library? case $boost_ldpath:$boost_rtopt_ in #( *?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt) Boost_lib_LIBS="$boost_ldpath/lib$boost_lib.$libext" test -e "$Boost_lib_LIBS" || continue;; #( *) # No: use -lboost_foo to find the shared library. Boost_lib_LIBS="-l$boost_lib";; esac boost_save_LIBS=$LIBS LIBS="$Boost_lib_LIBS $LIBS" test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath" dnl First argument of AC_LINK_IFELSE left empty because the test file is dnl generated only once above (before we start the for loops). _BOOST_AC_LINK_IFELSE([], [Boost_lib=yes], [Boost_lib=no]) ac_objext=$boost_save_ac_objext LDFLAGS=$boost_save_LDFLAGS LIBS=$boost_save_LIBS if test x"$Boost_lib" = xyes; then Boost_lib_LDFLAGS="-L$boost_ldpath -R$boost_ldpath" break 6 else boost_failed_libs="$boost_failed_libs@$boost_lib@" fi done done done done done done rm -f conftest.$ac_objext ]) case $Boost_lib in #( no) AC_MSG_ERROR([Could not find the flags to link with Boost $1]) ;; esac AC_SUBST(AS_TR_CPP([BOOST_$1_LDFLAGS]), [$Boost_lib_LDFLAGS]) AC_SUBST(AS_TR_CPP([BOOST_$1_LIBS]), [$Boost_lib_LIBS]) CPPFLAGS=$boost_save_CPPFLAGS AS_VAR_POPDEF([Boost_lib])dnl AS_VAR_POPDEF([Boost_lib_LDFLAGS])dnl AS_VAR_POPDEF([Boost_lib_LIBS])dnl AC_LANG_POP([C++])dnl ])# BOOST_FIND_LIB # --------------------------------------- # # Checks for the various Boost libraries. # # --------------------------------------- # # List of boost libraries: http://www.boost.org/libs/libraries.htm # The page http://beta.boost.org/doc/libs is useful: it gives the first release # version of each library (among other things). # BOOST_BIND() # ------------ # Look for Boost.Bind AC_DEFUN([BOOST_BIND], [BOOST_FIND_HEADER([boost/bind.hpp])]) # BOOST_CONVERSION() # ------------------ # Look for Boost.Conversion (cast / lexical_cast) AC_DEFUN([BOOST_CONVERSION], [BOOST_FIND_HEADER([boost/cast.hpp]) BOOST_FIND_HEADER([boost/lexical_cast.hpp]) ])# BOOST_CONVERSION # BOOST_DATE_TIME([PREFERRED-RT-OPT]) # ----------------------------------- # Look for Boost.Date_Time. For the documentation of PREFERRED-RT-OPT, see the # documentation of BOOST_FIND_LIB above. AC_DEFUN([BOOST_DATE_TIME], [BOOST_FIND_LIB([date_time], [$1], [boost/date_time/posix_time/posix_time.hpp], [boost::posix_time::ptime t;]) ])# BOOST_DATE_TIME # BOOST_FILESYSTEM([PREFERRED-RT-OPT]) # ------------------------------------ # Look for Boost.Filesystem. For the documentation of PREFERRED-RT-OPT, see the # documentation of BOOST_FIND_LIB above. # Do not check for boost/filesystem.hpp because this file was introduced in 1.34. AC_DEFUN([BOOST_FILESYSTEM], [BOOST_FIND_LIB([filesystem], [$1], [boost/filesystem/path.hpp], [boost::filesystem::path p;]) ])# BOOST_FILESYSTEM # BOOST_FOREACH() # --------------- # Look for Boost.Foreach AC_DEFUN([BOOST_FOREACH], [BOOST_FIND_HEADER([boost/foreach.hpp])]) # BOOST_FORMAT() # -------------- # Look for Boost.Format # Note: we can't check for boost/format/format_fwd.hpp because the header isn't # standalone. It can't be compiled because it triggers the following error: # boost/format/detail/config_macros.hpp:88: error: 'locale' in namespace 'std' # does not name a type AC_DEFUN([BOOST_FORMAT], [BOOST_FIND_HEADER([boost/format.hpp])]) # BOOST_FUNCTION() # ---------------- # Look for Boost.Function AC_DEFUN([BOOST_FUNCTION], [BOOST_FIND_HEADER([boost/function.hpp])]) # BOOST_GRAPH([PREFERRED-RT-OPT]) # ------------------------------- # Look for Boost.Graphs. For the documentation of PREFERRED-RT-OPT, see the # documentation of BOOST_FIND_LIB above. AC_DEFUN([BOOST_GRAPH], [BOOST_FIND_LIB([graph], [$1], [boost/graph/adjacency_list.hpp], [boost::adjacency_list<> g;]) ])# BOOST_GRAPH # BOOST_IOSTREAMS([PREFERRED-RT-OPT]) # ------------------------------- # Look for Boost.IOStreams. For the documentation of PREFERRED-RT-OPT, see the # documentation of BOOST_FIND_LIB above. AC_DEFUN([BOOST_IOSTREAMS], [BOOST_FIND_LIB([iostreams], [$1], [boost/iostreams/device/file_descriptor.hpp], [boost::iostreams::file_descriptor fd(0); fd.close();]) ])# BOOST_IOSTREAMS # BOOST_HASH() # ------------ # Look for Boost.Functional/Hash AC_DEFUN([BOOST_HASH], [BOOST_FIND_HEADER([boost/functional/hash.hpp])]) # BOOST_PROGRAM_OPTIONS([PREFERRED-RT-OPT]) # ----------------------------------------- # Look for Boost.Program_options. For the documentation of PREFERRED-RT-OPT, see # the documentation of BOOST_FIND_LIB above. AC_DEFUN([BOOST_PROGRAM_OPTIONS], [BOOST_FIND_LIB([program_options], [$1], [boost/program_options.hpp], [boost::program_options::options_description d("test");]) ])# BOOST_PROGRAM_OPTIONS # BOOST_REF() # ----------- # Look for Boost.Ref AC_DEFUN([BOOST_REF], [BOOST_FIND_HEADER([boost/ref.hpp])]) # BOOST_REGEX([PREFERRED-RT-OPT]) # ------------------------------- # Look for Boost.Regex. For the documentation of PREFERRED-RT-OPT, see the # documentation of BOOST_FIND_LIB above. AC_DEFUN([BOOST_REGEX], [BOOST_FIND_LIB([regex], [$1], [boost/regex.hpp], [boost::regex exp("*"); boost::regex_match("foo", exp);]) ])# BOOST_REGEX # BOOST_SIGNALS([PREFERRED-RT-OPT]) # --------------------------------- # Look for Boost.Signals. For the documentation of PREFERRED-RT-OPT, see the # documentation of BOOST_FIND_LIB above. AC_DEFUN([BOOST_SIGNALS], [BOOST_FIND_LIB([signals], [$1], [boost/signal.hpp], [boost::signal s;]) ])# BOOST_SIGNALS # BOOST_SMART_PTR() # ----------------- # Look for Boost.SmartPtr AC_DEFUN([BOOST_SMART_PTR], [BOOST_FIND_HEADER([boost/scoped_ptr.hpp]) BOOST_FIND_HEADER([boost/shared_ptr.hpp]) ]) # BOOST_STRING_ALGO() # ------------------- # Look for Boost.StringAlgo AC_DEFUN([BOOST_STRING_ALGO], [BOOST_FIND_HEADER([boost/algorithm/string.hpp]) ]) # BOOST_TEST([PREFERRED-RT-OPT]) # ------------------------------ # Look for Boost.Test. For the documentation of PREFERRED-RT-OPT, see the # documentation of BOOST_FIND_LIB above. AC_DEFUN([BOOST_TEST], [m4_pattern_allow([^BOOST_CHECK$])dnl BOOST_FIND_LIB([unit_test_framework], [$1], [boost/test/unit_test.hpp], [BOOST_CHECK(2==2);], [using boost::unit_test::test_suite; test_suite* init_unit_test_suite( int argc, char ** argv ) { return NULL;}]) ])# BOOST_TEST # BOOST_THREADS([PREFERRED-RT-OPT]) # --------------------------------- # Look for Boost.Thread. For the documentation of PREFERRED-RT-OPT, see the # documentation of BOOST_FIND_LIB above. # FIXME: Provide an alias "BOOST_THREAD". AC_DEFUN([BOOST_THREADS], [dnl Having the pthread flag is required at least on GCC3 where dnl boost/thread.hpp would complain if we try to compile without dnl -pthread on GNU/Linux. AC_REQUIRE([_BOOST_PTHREAD_FLAG])dnl boost_threads_save_LIBS=$LIBS boost_threads_save_CPPFLAGS=$CPPFLAGS LIBS="$LIBS $boost_cv_pthread_flag" # Yes, we *need* to put the -pthread thing in CPPFLAGS because with GCC3, # boost/thread.hpp will trigger a #error if -pthread isn't used: # boost/config/requires_threads.hpp:47:5: #error "Compiler threading support # is not turned on. Please set the correct command line options for # threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)" CPPFLAGS="$CPPFLAGS $boost_cv_pthread_flag" BOOST_FIND_LIB([thread], [$1], [boost/thread.hpp], [boost::thread t; boost::mutex m;]) BOOST_THREAD_LIBS="$BOOST_THREAD_LIBS $boost_cv_pthread_flag" BOOST_CPPFLAGS="$BOOST_CPPFLAGS $boost_cv_pthread_flag" LIBS=$boost_threads_save_LIBS CPPFLAGS=$boost_threads_save_CPPFLAGS ])# BOOST_THREADS # BOOST_TOKENIZER() # ----------------- # Look for Boost.Tokenizer AC_DEFUN([BOOST_TOKENIZER], [BOOST_FIND_HEADER([boost/tokenizer.hpp])]) # BOOST_TRIBOOL() # --------------- # Look for Boost.Tribool AC_DEFUN([BOOST_TRIBOOL], [BOOST_FIND_HEADER([boost/logic/tribool_fwd.hpp]) BOOST_FIND_HEADER([boost/logic/tribool.hpp]) ]) # BOOST_TUPLE() # ------------- # Look for Boost.Tuple AC_DEFUN([BOOST_TUPLE], [BOOST_FIND_HEADER([boost/tuple/tuple.hpp])]) # BOOST_UTILITY() # --------------- # Look for Boost.Utility (noncopyable, result_of, base-from-member idiom, # etc.) AC_DEFUN([BOOST_UTILITY], [BOOST_FIND_HEADER([boost/utility.hpp])]) # BOOST_VARIANT() # --------------- # Look for Boost.Variant. AC_DEFUN([BOOST_VARIANT], [BOOST_FIND_HEADER([boost/variant/variant_fwd.hpp]) BOOST_FIND_HEADER([boost/variant.hpp])]) # BOOST_WAVE([PREFERRED-RT-OPT]) # ------------------------------ # Look for Boost.Wave. For the documentation of PREFERRED-RT-OPT, see the # documentation of BOOST_FIND_LIB above. AC_DEFUN([BOOST_WAVE], [BOOST_FIND_LIB([wave], [$1], [boost/wave.hpp], [boost::wave::token_id id; get_token_name(id);])]) # ----------------- # # Internal helpers. # # ----------------- # # _BOOST_PTHREAD_FLAG() # --------------------- # Internal helper for BOOST_THREADS. Based on ACX_PTHREAD: # http://autoconf-archive.cryp.to/acx_pthread.html AC_DEFUN([_BOOST_PTHREAD_FLAG], [AC_REQUIRE([AC_PROG_CXX])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_LANG_PUSH([C++])dnl AC_CACHE_CHECK([for the flags needed to use pthreads], [boost_cv_pthread_flag], [ boost_cv_pthread_flag= # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # (none): in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -lpthreads: AIX (must check this before -lpthread) # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # -llthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: GNU Linux/GCC (kernel threads), BSD/GCC (userland threads) # -pthreads: Solaris/GCC # -mthreads: MinGW32/GCC, Lynx/GCC # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # -lpthread: GNU Linux, etc. # --thread-safe: KAI C++ case $host_os in #( *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: boost_pthread_flags="-pthreads -lpthread -mt -pthread";; #( *) boost_pthread_flags="-lpthreads -Kthread -kthread -llthread -pthread \ -pthreads -mthreads -lpthread --thread-safe -mt";; esac # Generate the test file. AC_LANG_CONFTEST([AC_LANG_PROGRAM([#include ], [pthread_t th; pthread_join(th, 0); pthread_attr_init(0); pthread_cleanup_push(0, 0); pthread_create(0,0,0,0); pthread_cleanup_pop(0);])]) for boost_pthread_flag in '' $boost_pthread_flags; do boost_pthread_ok=false dnl Re-use the test file already generated. boost_pthreads__save_LIBS=$LIBS LIBS="$LIBS $boost_pthread_flag" AC_LINK_IFELSE([], [if grep ".*$boost_pthread_flag" conftest.err; then echo "This flag seems to have triggered warnings" >&AS_MESSAGE_LOG_FD else boost_pthread_ok=:; boost_cv_pthread_flag=$boost_pthread_flag fi]) LIBS=$boost_pthreads__save_LIBS $boost_pthread_ok && break done ]) AC_LANG_POP([C++])dnl ])# _BOOST_PTHREAD_FLAG # _BOOST_gcc_test(MAJOR, MINOR) # ----------------------------- # Internal helper for _BOOST_FIND_COMPILER_TAG. m4_define([_BOOST_gcc_test], ["defined __GNUC__ && __GNUC__ == $1 && __GNUC_MINOR__ == $2 && !defined __ICC @ gcc$1$2"])dnl # _BOOST_FIND_COMPILER_TAG() # -------------------------- # Internal. When Boost is installed without --layout=system, each library # filename will hold a suffix that encodes the compiler used during the # build. The Boost build system seems to call this a `tag'. AC_DEFUN([_BOOST_FIND_COMPILER_TAG], [AC_REQUIRE([AC_PROG_CXX])dnl AC_CACHE_CHECK([for the toolset name used by Boost for $CXX], [boost_cv_lib_tag], [AC_LANG_PUSH([C++])dnl boost_cv_lib_tag=unknown # The following tests are mostly inspired by boost/config/auto_link.hpp # The list is sorted to most recent/common to oldest compiler (in order # to increase the likelihood of finding the right compiler with the # least number of compilation attempt). # Beware that some tests are sensible to the order (for instance, we must # look for MinGW before looking for GCC3). # I used one compilation test per compiler with a #error to recognize # each compiler so that it works even when cross-compiling (let me know # if you know a better approach). # Known missing tags (known from Boost's tools/build/v2/tools/common.jam): # como, edg, kcc, bck, mp, sw, tru, xlc # I'm not sure about my test for `il' (be careful: Intel's ICC pre-defines # the same defines as GCC's). # TODO: Move the test on GCC 4.3 up once it's released. for i in \ _BOOST_gcc_test(4, 2) \ _BOOST_gcc_test(4, 1) \ _BOOST_gcc_test(4, 0) \ "defined __GNUC__ && __GNUC__ == 3 && !defined __ICC \ && (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw" \ _BOOST_gcc_test(3, 4) \ _BOOST_gcc_test(3, 3) \ "defined _MSC_VER && _MSC_VER >= 1400 @ vc80" \ _BOOST_gcc_test(3, 2) \ "defined _MSC_VER && _MSC_VER == 1310 @ vc71" \ _BOOST_gcc_test(3, 1) \ _BOOST_gcc_test(3, 0) \ "defined __BORLANDC__ @ bcb" \ "defined __ICC && (defined __unix || defined __unix__) @ il" \ "defined __ICL @ iw" \ "defined _MSC_VER && _MSC_VER == 1300 @ vc7" \ _BOOST_gcc_test(4, 3) \ _BOOST_gcc_test(2, 95) \ "defined __MWERKS__ && __MWERKS__ <= 0x32FF @ cw9" \ "defined _MSC_VER && _MSC_VER < 1300 && !defined UNDER_CE @ vc6" \ "defined _MSC_VER && _MSC_VER < 1300 && defined UNDER_CE @ evc4" \ "defined __MWERKS__ && __MWERKS__ <= 0x31FF @ cw8" do boost_tag_test=`expr "X$i" : 'X\([[^@]]*\) @ '` boost_tag=`expr "X$i" : 'X[[^@]]* @ \(.*\)'` AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if $boost_tag_test /* OK */ #else # error $boost_tag_test #endif ]])], [boost_cv_lib_tag=$boost_tag; break], []) done AC_LANG_POP([C++])dnl ]) if test x"$boost_cv_lib_tag" = xunknown; then AC_MSG_WARN([[could not figure out which toolset name to use for $CXX]]) boost_cv_lib_tag= fi ])# _BOOST_FIND_COMPILER_TAG # _BOOST_GUESS_WHETHER_TO_USE_MT() # -------------------------------- # Compile a small test to try to guess whether we should favor MT (Multi # Thread) flavors of Boost. Sets boost_guess_use_mt accordingly. AC_DEFUN([_BOOST_GUESS_WHETHER_TO_USE_MT], [# Check whether we do better use `mt' even though we weren't ask to. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #if defined _REENTRANT || defined _MT || defined __MT__ /* use -mt */ #else # error MT not needed #endif ]])], [boost_guess_use_mt=:], [boost_guess_use_mt=false]) ]) # _BOOST_AC_LINK_IFELSE(PROGRAM, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # ------------------------------------------------------------------- # Fork of _AC_LINK_IFELSE that preserves conftest.o across calls. Fragile, # will break when Autoconf changes its internals. Requires that you manually # rm -f conftest.$ac_objext in between to really different tests, otherwise # you will try to link a conftest.o left behind by a previous test. # Used to aggressively optimize BOOST_FIND_LIB (see the big comment in this # macro) m4_define([_BOOST_AC_LINK_IFELSE], [m4_ifvaln([$1], [AC_LANG_CONFTEST([$1])])dnl rm -f conftest$ac_exeext boost_ac_ext_save=$ac_ext boost_use_source=: # If we already have a .o, re-use it. We change $ac_ext so that $ac_link # tries to link the existing object file instead of compiling from source. test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false && _AS_ECHO_LOG([re-using the existing conftest.$ac_objext]) AS_IF([_AC_DO_STDERR($ac_link) && { test -z "$ac_[]_AC_LANG_ABBREV[]_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_executable_p conftest$ac_exeext dnl FIXME: use AS_TEST_X instead when 2.61 is widespread enough. }], [$2], [if $boost_use_source; then _AC_MSG_LOG_CONFTEST fi $3]) dnl Delete also the IPA/IPO (Inter Procedural Analysis/Optimization) dnl information created by the PGI compiler (conftest_ipa8_conftest.oo), dnl as it would interfere with the next link command. rm -f core conftest.err conftest_ipa8_conftest.oo \ conftest$ac_exeext m4_ifval([$1], [conftest.$ac_ext])[]dnl ])# _BOOST_AC_LINK_IFELSE exempi-2.2.1/m4/ltoptions.m40000644000175000017500000003007312027535365012554 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) exempi-2.2.1/m4/ltversion.m40000644000175000017500000000126212027535365012544 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) exempi-2.2.1/m4/ax_ld_check_flag.m40000664000175000017500000000605112144603625013732 00000000000000# =========================================================================== # http://autoconf-archive.cryp.to/ax_ld_check_flag.html # =========================================================================== # # SYNOPSIS # # AX_LD_CHECK_FLAG(FLAG-TO-CHECK,[PROLOGUE],[BODY],[ACTION-IF-SUCCESS],[ACTION-IF-FAILURE]) # # DESCRIPTION # # This macro tests if the C++ compiler supports the flag FLAG-TO-CHECK. If # successfull execute ACTION-IF-SUCCESS otherwise ACTION-IF-FAILURE. # PROLOGUE and BODY are optional and should be used as in AC_LANG_PROGRAM # macro. # # Example: # # AX_LD_CHECK_FLAG([-Wl,-L/usr/lib],[],[],[ # ... # ],[ # ... # ]) # # This code is inspired from KDE_CHECK_COMPILER_FLAG macro. Thanks to # Bogdan Drozdowski for testing and bug fixes. # # LAST MODIFICATION # # 2008-04-12 # # COPYLEFT # # Copyright (c) 2008 Francesco Salvestrini # # 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 of the License, 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. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Macro Archive. When you make and # distribute a modified version of the Autoconf Macro, you may extend this # special exception to the GPL to apply to your modified version as well. AC_DEFUN([AX_LD_CHECK_FLAG],[ AC_PREREQ([2.61]) AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([AC_PROG_SED]) flag=`echo "$1" | $SED 'y% .=/+-(){}<>:*,%_______________%'` AC_CACHE_CHECK([whether the linker accepts the $1 flag], [ax_cv_ld_check_flag_$flag],[ #AC_LANG_PUSH([C]) save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $1" AC_LINK_IFELSE([ AC_LANG_PROGRAM([$2],[$3]) ],[ eval "ax_cv_ld_check_flag_$flag=yes" ],[ eval "ax_cv_ld_check_flag_$flag=no" ]) LDFLAGS="$save_LDFLAGS" #AC_LANG_POP ]) AS_IF([eval "test \"`echo '$ax_cv_ld_check_flag_'$flag`\" = yes"],[ : $4 ],[ : $5 ]) ]) exempi-2.2.1/aclocal.m40000664000175000017500000011363112150230777011577 00000000000000# generated automatically by aclocal 1.12.2 -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.12' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.12.2], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.12.2])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 10 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 17 # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 19 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated. For more info, see: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl dnl Support for Objective C++ was only introduced in Autoconf 2.65, dnl but we still cater to Autoconf 2.62. m4_ifdef([AC_PROG_OBJCXX], [AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The 'parallel-tests' driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 7 # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 7 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of '-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/ax_ld_check_flag.m4]) m4_include([m4/ax_tls.m4]) m4_include([m4/boost.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) exempi-2.2.1/source/0000775000175000017500000000000012163706252011312 500000000000000exempi-2.2.1/source/common/0000775000175000017500000000000012163706252012602 500000000000000exempi-2.2.1/source/common/EndianUtils.hpp0000664000175000017500000002712512150230673015454 00000000000000#ifndef __EndianUtils_hpp__ #define __EndianUtils_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "XMP_Const.h" // *** These should be in a more common location. The Unicode conversions of XMPCore have similar utils. // *** May want to improve with PowerPC swapping load/store, or SSE instructions. // ================================================================================================= #define kLittleEndianHost (! kBigEndianHost) #if XMP_WinBuild #pragma warning ( disable : 4127 ) // conditional expression is constant #define kBigEndianHost 0 #elif XMP_MacBuild #if __BIG_ENDIAN__ #define kBigEndianHost 1 #elif __LITTLE_ENDIAN__ #define kBigEndianHost 0 #else #error "Neither __BIG_ENDIAN__ nor __LITTLE_ENDIAN__ is set" #endif #elif XMP_UNIXBuild #include "XMP_UnixEndian.h" #else #error "Unknown build environment" #endif // ================================================================================================= typedef XMP_Uns16 (*GetUns16_Proc) ( const void* addr ); typedef XMP_Uns32 (*GetUns32_Proc) ( const void* addr ); typedef XMP_Uns64 (*GetUns64_Proc) ( const void* addr ); typedef float (*GetFloat_Proc) ( const void* addr ); typedef double (*GetDouble_Proc) ( const void* addr ); typedef XMP_Uns16 (*MakeUns16_Proc) ( XMP_Uns16 value ); typedef XMP_Uns32 (*MakeUns32_Proc) ( XMP_Uns32 value ); typedef XMP_Uns64 (*MakeUns64_Proc) ( XMP_Uns64 value ); typedef float (*MakeFloat_Proc) ( float value ); typedef double (*MakeDouble_Proc) ( double value ); typedef void (*PutUns16_Proc) ( XMP_Uns16 value, void* addr ); typedef void (*PutUns32_Proc) ( XMP_Uns32 value, void* addr ); typedef void (*PutUns64_Proc) ( XMP_Uns64 value, void* addr ); typedef void (*PutFloat_Proc) ( float value, void* addr ); typedef void (*PutDouble_Proc) ( double value, void* addr ); // ================================================================================================= static inline XMP_Uns16 Flip2 ( XMP_Uns16 value ) { value = ((value & 0x00FF) << 8) | ((value & 0xFF00) >> 8); return value; } // ------------------------------------------------------------------------------------------------- static inline void Flip2 ( void * addr ) { XMP_Uns16 * u16Ptr = (XMP_Uns16*) addr; *u16Ptr = Flip2 ( *u16Ptr ); } // ------------------------------------------------------------------------------------------------- static inline XMP_Uns32 Flip4 ( XMP_Uns32 value ) { value = ((value & 0x000000FF) << 24) | ((value & 0x0000FF00) << 8) | ((value >> 8) & 0x0000FF00) | ((value >> 24) & 0x000000FF); return value; } // ------------------------------------------------------------------------------------------------- static inline void Flip4 ( void * addr ) { XMP_Uns32 * u32Ptr = (XMP_Uns32*) addr; *u32Ptr = Flip4 ( *u32Ptr ); } // ------------------------------------------------------------------------------------------------- static inline XMP_Uns64 Flip8 ( XMP_Uns64 value ) { XMP_Uns32 oldLow = (XMP_Uns32)(value); XMP_Uns32 oldHigh = (XMP_Uns32)(value >> 32); return (((XMP_Uns64)Flip4(oldLow)) << 32) | ((XMP_Uns64)Flip4(oldHigh)); } // ------------------------------------------------------------------------------------------------- static inline void Flip8 ( void * addr ) { XMP_Uns64 * u64Ptr = (XMP_Uns64*) addr; *u64Ptr = Flip8 ( *u64Ptr ); } // ================================================================================================= static inline XMP_Uns16 GetUns16BE ( const void * addr ) { XMP_Uns16 value = *((XMP_Uns16*)addr); if ( kLittleEndianHost ) value = Flip2 ( value ); return value; } // ------------------------------------------------------------------------------------------------- static inline XMP_Uns16 GetUns16LE ( const void * addr ) { XMP_Uns16 value = *((XMP_Uns16*)addr); if ( kBigEndianHost ) value = Flip2 ( value ); return value; } // ------------------------------------------------------------------------------------------------- static inline XMP_Uns32 GetUns32BE ( const void * addr ) { XMP_Uns32 value = *((XMP_Uns32*)addr); if ( kLittleEndianHost ) value = Flip4 ( value ); return value; } // ------------------------------------------------------------------------------------------------- static inline XMP_Uns32 GetUns32LE ( const void * addr ) { XMP_Uns32 value = *((XMP_Uns32*)addr); if ( kBigEndianHost ) value = Flip4 ( value ); return value; } // ------------------------------------------------------------------------------------------------- static inline XMP_Uns64 GetUns64BE ( const void * addr ) { XMP_Uns64 value = *((XMP_Uns64*)addr); if ( kLittleEndianHost ) value = Flip8 ( value ); return value; } // ------------------------------------------------------------------------------------------------- static inline XMP_Uns64 GetUns64LE ( const void * addr ) { XMP_Uns64 value = *((XMP_Uns64*)addr); if ( kBigEndianHost ) value = Flip8 ( value ); return value; } // ------------------------------------------------------------------------------------------------- static inline float GetFloatBE ( const void * addr ) { XMP_Uns32 value = *((XMP_Uns32*)addr); if ( kLittleEndianHost ) value = Flip4 ( value ); return *((float*)&value); } // ------------------------------------------------------------------------------------------------- static inline float GetFloatLE ( const void * addr ) { XMP_Uns32 value = *((XMP_Uns32*)addr); if ( kBigEndianHost ) value = Flip4 ( value ); return *((float*)&value); } // ------------------------------------------------------------------------------------------------- static inline double GetDoubleBE ( const void * addr ) { XMP_Uns64 value = *((XMP_Uns64*)addr); if ( kLittleEndianHost ) value = Flip8 ( value ); return *((double*)&value); } // ------------------------------------------------------------------------------------------------- static inline double GetDoubleLE ( const void * addr ) { XMP_Uns64 value = *((XMP_Uns64*)addr); if ( kBigEndianHost ) value = Flip8 ( value ); return *((double*)&value); } // ================================================================================================= static inline XMP_Uns16 MakeUns16BE ( XMP_Uns16 value ) { if ( kLittleEndianHost ) value = Flip2 ( value ); return value; } // ------------------------------------------------------------------------------------------------- static inline XMP_Uns16 MakeUns16LE ( XMP_Uns16 value ) { if ( kBigEndianHost ) value = Flip2 ( value ); return value; } // ------------------------------------------------------------------------------------------------- static inline XMP_Uns32 MakeUns32BE ( XMP_Uns32 value ) { if ( kLittleEndianHost ) value = Flip4 ( value ); return value; } // ------------------------------------------------------------------------------------------------- static inline XMP_Uns32 MakeUns32LE ( XMP_Uns32 value ) { if ( kBigEndianHost ) value = Flip4 ( value ); return value; } // ------------------------------------------------------------------------------------------------- static inline XMP_Uns64 MakeUns64BE ( XMP_Uns64 value ) { if ( kLittleEndianHost ) value = Flip8 ( value ); return value; } // ------------------------------------------------------------------------------------------------- static inline XMP_Uns64 MakeUns64LE ( XMP_Uns64 value ) { if ( kBigEndianHost ) value = Flip8 ( value ); return value; } // ------------------------------------------------------------------------------------------------- static inline float MakeFloatBE ( float value ) { if ( kLittleEndianHost ) { XMP_Uns32* intPtr = (XMP_Uns32*) &value; *intPtr = Flip4 ( *intPtr ); } return value; } // ------------------------------------------------------------------------------------------------- static inline float MakeFloatLE ( float value ) { if ( kBigEndianHost ) { XMP_Uns32* intPtr = (XMP_Uns32*) &value; *intPtr = Flip4 ( *intPtr ); } return value; } // ------------------------------------------------------------------------------------------------- static inline double MakeDoubleBE ( double value ) { if ( kLittleEndianHost ) { XMP_Uns64* intPtr = (XMP_Uns64*) &value; *intPtr = Flip8 ( *intPtr ); } return value; } // ------------------------------------------------------------------------------------------------- static inline double MakeDoubleLE ( double value ) { if ( kBigEndianHost ) { XMP_Uns64* intPtr = (XMP_Uns64*) &value; *intPtr = Flip8 ( *intPtr ); } return value; } // ================================================================================================= static inline void PutUns16BE ( XMP_Uns16 value, void * addr ) { if ( kLittleEndianHost ) value = Flip2 ( value ); *((XMP_Uns16*)addr) = value; } // ------------------------------------------------------------------------------------------------- static inline void PutUns16LE ( XMP_Uns16 value, void * addr ) { if ( kBigEndianHost ) value = Flip2 ( value ); *((XMP_Uns16*)addr) = value; } // ------------------------------------------------------------------------------------------------- static inline void PutUns32BE ( XMP_Uns32 value, void * addr ) { if ( kLittleEndianHost ) value = Flip4 ( value ); *((XMP_Uns32*)addr) = value; } // ------------------------------------------------------------------------------------------------- static inline void PutUns32LE ( XMP_Uns32 value, void * addr ) { if ( kBigEndianHost ) value = Flip4 ( value ); *((XMP_Uns32*)addr) = value; } // ------------------------------------------------------------------------------------------------- static inline void PutUns64BE ( XMP_Uns64 value, void * addr ) { if ( kLittleEndianHost ) value = Flip8 ( value ); *((XMP_Uns64*)addr) = value; } // ------------------------------------------------------------------------------------------------- static inline void PutUns64LE ( XMP_Uns64 value, void * addr ) { if ( kBigEndianHost ) value = Flip8 ( value ); *((XMP_Uns64*)addr) = value; } // ------------------------------------------------------------------------------------------------- static inline void PutFloatBE ( float value, void * addr ) { if ( kLittleEndianHost ) { XMP_Uns32* intPtr = (XMP_Uns32*) &value; *intPtr = Flip4 ( *intPtr ); } *((float*)addr) = value; } // ------------------------------------------------------------------------------------------------- static inline void PutFloatLE ( float value, void * addr ) { if ( kBigEndianHost ) { XMP_Uns32* intPtr = (XMP_Uns32*) &value; *intPtr = Flip4 ( *intPtr ); } *((float*)addr) = value; } // ------------------------------------------------------------------------------------------------- static inline void PutDoubleBE ( double value, void * addr ) { if ( kLittleEndianHost ) { XMP_Uns64* intPtr = (XMP_Uns64*) &value; *intPtr = Flip8 ( *intPtr ); } *((double*)addr) = value; } // ------------------------------------------------------------------------------------------------- static inline void PutDoubleLE ( double value, void * addr ) { if ( kBigEndianHost ) { XMP_Uns64* intPtr = (XMP_Uns64*) &value; *intPtr = Flip8 ( *intPtr ); } *((double*)addr) = value; } // ================================================================================================= #endif // __EndianUtils_hpp__ exempi-2.2.1/source/common/UnicodeInlines.incl_cpp0000664000175000017500000001055612150230673017145 00000000000000#ifndef __UnicodeInlines_incl_cpp__ #define __UnicodeInlines_incl_cpp__ // ================================================================================================= // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "UnicodeConversions.hpp" // ================================================================================================= // Inner loop utilities that need to be inlined. // ================================================================================================= static inline XMP_Uns32 GetCodePoint ( const XMP_Uns8 ** utf8Str_io ) { const XMP_Uns8 * u8Ptr = *utf8Str_io; XMP_Uns32 cp; size_t u8Len; CodePoint_from_UTF8 ( u8Ptr, 4, &cp, &u8Len ); // Throws an exception for errors. *utf8Str_io = u8Ptr + u8Len; return cp; } // ================================================================================================= static inline bool IsStartChar_ASCII ( XMP_Uns32 cp ) { // ASCII starting characters for an XML name. if ( (('a' <= cp) && (cp <= 'z')) || (('A' <= cp) && (cp <= 'Z')) || (cp == '_') ) return true; return false; } // ------------------------------------------------------------------------------------------------- static inline bool IsStartChar_NonASCII ( XMP_Uns32 cp ) { // Non-ASCII starting characters for an XML name. if ( ((0xC0 <= cp) && (cp <= 0xD6)) || ((0xD8 <= cp) && (cp <= 0xF6)) ) return true; if ( ((0xF8 <= cp) && (cp <= 0x2FF)) || ((0x370 <= cp) && (cp <= 0x37D)) ) return true; if ( ((0x37F <= cp) && (cp <= 0x1FFF)) || ((0x200C <= cp) && (cp <= 0x200D)) ) return true; if ( ((0x2070 <= cp) && (cp <= 0x218F)) || ((0x2C00 <= cp) && (cp <= 0x2FEF)) ) return true; if ( ((0x3001 <= cp) && (cp <= 0xD7FF)) || ((0xF900 <= cp) && (cp <= 0xFDCF)) ) return true; if ( ((0xFDF0 <= cp) && (cp <= 0xFFFD)) || ((0x10000 <= cp) && (cp <= 0xEFFFF)) ) return true; return false; } // ------------------------------------------------------------------------------------------------- static inline bool IsOtherChar_ASCII ( XMP_Uns32 cp ) { // ASCII following characters for an XML name. if ( (('0' <= cp) && (cp <= '9')) || (cp == '-') || (cp == '.') ) return true; return false; } // ------------------------------------------------------------------------------------------------- static inline bool IsOtherChar_NonASCII ( XMP_Uns32 cp ) { // Non-ASCII following characters for an XML name. if ( (cp == 0xB7) || ((0x300 <= cp) && (cp <= 0x36F)) || ((0x203F <= cp) && (cp <= 0x2040)) ) return true; return false; } // ------------------------------------------------------------------------------------------------- static inline void VerifyUTF8 ( XMP_StringPtr str ) { const XMP_Uns8 * utf8Str = (XMP_Uns8*)str; while ( *utf8Str != 0 ) { while ( (*utf8Str != 0) && (*utf8Str < 0x80) ) ++utf8Str; if ( *utf8Str >= 0x80 ) (void) GetCodePoint ( &utf8Str ); // Throws for bad UTF-8. } } // ------------------------------------------------------------------------------------------------- static inline void VerifySimpleXMLName ( XMP_StringPtr _nameStart, XMP_StringPtr _nameEnd ) { const XMP_Uns8 * nameStart = (const XMP_Uns8 *) _nameStart; const XMP_Uns8 * nameEnd = (const XMP_Uns8 *) _nameEnd; const XMP_Uns8 * namePos = nameStart; XMP_Uns32 cp; // The first character is more restricted. if ( nameStart >= nameEnd ) XMP_Throw ( "Empty XML name", kXMPErr_BadXPath ); cp = *namePos; if ( cp < 0x80 ) { ++namePos; if ( ! IsStartChar_ASCII(cp) ) goto NameError; } else { cp = GetCodePoint ( &namePos ); if ( ! IsStartChar_NonASCII(cp) ) goto NameError; } // Check the rest of the name. while ( namePos < nameEnd ) { cp = *namePos; if ( cp < 0x80 ) { ++namePos; if ( (! IsStartChar_ASCII(cp)) && (! IsOtherChar_ASCII(cp)) ) goto NameError; } else { cp = GetCodePoint ( &namePos ); if ( (! IsStartChar_NonASCII(cp)) && (! IsOtherChar_NonASCII(cp)) ) goto NameError; } } return; NameError: XMP_Throw ( "Bad XML name", kXMPErr_BadXPath ); } // VerifySimpleXMLName // ================================================================================================= #endif // __UnicodeInlines_incl_cpp__ exempi-2.2.1/source/common/LargeFileAccess.hpp0000664000175000017500000002126312150230673016206 00000000000000#ifndef __LargeFileAccess_hpp__ #define __LargeFileAccess_hpp__ 1 // ================================================================================================= // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include // The assert macro needs printf. #include #if XMP_WinBuild #include #define snprintf _snprintf #else #if 0 // No longer needed, but retained to avoid merge conflicts #include #endif // POSIX headers for both Mac and generic UNIX. #include #include #include #include #include #include #endif #include "XMP_Const.h" #include "EndianUtils.hpp" using namespace std; // ================================================================================================= enum { // Used by LFA_Throw, re-route to whatever you need. kLFAErr_InternalFailure = 1, kLFAErr_ExternalFailure = 2, kLFAErr_UserAbort = 3 }; extern void LFA_Throw ( const char* msg, int id ); // Function needed for reuse of LFA code in various projects. #if ! (XMP_UNIXBuild | XMP_MacBuild) typedef void * LFA_FileRef; #else typedef XMP_Int32 LFA_FileRef; #endif // *** Change the model of the LFA functions to not throw for "normal" open/create errors. // *** Make sure the semantics of open/create/rename are consistent, e.g. about create of existing. extern LFA_FileRef LFA_Open ( const char* fileName, char openMode ); // Mode is 'r' or 'w'. extern LFA_FileRef LFA_Create ( const char* fileName ); extern void LFA_Delete ( const char* fileName ); extern void LFA_Rename ( const char* oldName, const char * newName ); extern void LFA_Close ( LFA_FileRef file ); #if XMP_MacBuild extern LFA_FileRef LFA_OpenRsrc ( const char * filePath, char mode ); #endif // NOTE: unlike the fseek() 'original' LFA_Seek returns the new file position, // *NOT* 0 to indicate everything's fine extern XMP_Int64 LFA_Seek ( LFA_FileRef file, XMP_Int64 offset, int seekMode, bool* okPtr = 0 ); extern XMP_Int32 LFA_Read ( LFA_FileRef file, void* buffer, XMP_Int32 bytes, bool requireAll = false ); extern void LFA_Write ( LFA_FileRef file, const void* buffer, XMP_Int32 bytes ); extern void LFA_Flush ( LFA_FileRef file ); extern XMP_Int64 LFA_Tell ( LFA_FileRef file ); extern XMP_Int64 LFA_Rewind ( LFA_FileRef file ); extern XMP_Int64 LFA_Measure ( LFA_FileRef file ); extern void LFA_Extend ( LFA_FileRef file, XMP_Int64 length ); extern void LFA_Truncate ( LFA_FileRef file, XMP_Int64 length ); extern void LFA_Copy ( LFA_FileRef sourceFile, LFA_FileRef destFile, XMP_Int64 length, // Not a primitive. XMP_AbortProc abortProc = 0, void * abortArg = 0 ); /* move stuff within a file (both upward and downward */ extern void LFA_Move ( LFA_FileRef srcFile, XMP_Int64 srcOffset, LFA_FileRef dstFile, XMP_Int64 dstOffset, XMP_Int64 length, XMP_AbortProc abortProc = 0, void * abortArg = 0 ); extern bool LFA_isEof ( LFA_FileRef file ); extern char LFA_GetChar ( LFA_FileRef file ); enum { kLFA_RequireAll = true }; // Used for requireAll to LFA_Read. // ================================================================================================= // Read and convert endianess in one go: static inline XMP_Uns8 LFA_ReadUns8 ( LFA_FileRef file ) { XMP_Uns8 value; LFA_Read ( file, &value, 1, kLFA_RequireAll ); return value; } static inline XMP_Uns16 LFA_ReadUns16_BE ( LFA_FileRef file ) { XMP_Uns16 value; LFA_Read ( file, &value, 2, kLFA_RequireAll ); return MakeUns16BE ( value ); } static inline XMP_Uns16 LFA_ReadUns16_LE ( LFA_FileRef file ) { XMP_Uns16 value; LFA_Read ( file, &value, 2, kLFA_RequireAll ); return MakeUns16LE ( value ); } static inline XMP_Uns32 LFA_ReadUns32_BE ( LFA_FileRef file ) { XMP_Uns32 value; LFA_Read ( file, &value, 4, kLFA_RequireAll ); return MakeUns32BE ( value ); } static inline XMP_Uns32 LFA_ReadUns32_LE ( LFA_FileRef file ) { XMP_Uns32 value; LFA_Read ( file, &value, 4, kLFA_RequireAll ); return MakeUns32LE ( value ); } // new: static inline XMP_Uns64 LFA_ReadUns64_BE ( LFA_FileRef file ) { XMP_Uns64 value; LFA_Read ( file, &value, 8, kLFA_RequireAll ); return MakeUns64BE ( value ); } static inline XMP_Uns64 LFA_ReadUns64_LE ( LFA_FileRef file ) { XMP_Uns64 value; LFA_Read ( file, &value, 8, kLFA_RequireAll ); return MakeUns64LE ( value ); } #define LFA_ReadInt16_BE(file) ((XMP_Int16) LFA_ReadUns16_BE ( file )) #define LFA_ReadInt16_LE(file) ((XMP_Int16) LFA_ReadUns16_LE ( file )) #define LFA_ReadInt32_BE(file) ((XMP_Int32) LFA_ReadUns32_BE ( file )) #define LFA_ReadInt32_LE(file) ((XMP_Int32) LFA_ReadUns32_LE ( file )) #define LFA_ReadInt64_BE(file) ((XMP_Int64) LFA_ReadUns64_BE ( file )) #define LFA_ReadInt64_LE(file) ((XMP_Int64) LFA_ReadUns64_LE ( file )) // peek functions ///////////////////////////////////////////// // peek functions, to see what's next: static inline XMP_Uns8 LFA_PeekUns8(LFA_FileRef file) { XMP_Uns8 value = LFA_ReadUns8( file ); LFA_Seek( file, -1, SEEK_CUR ); return value; } static inline XMP_Uns16 LFA_PeekUns16_BE(LFA_FileRef file) { XMP_Uns16 value = LFA_ReadUns16_BE( file ); LFA_Seek( file, -2, SEEK_CUR ); return value; } static inline XMP_Uns16 LFA_PeekUns16_LE(LFA_FileRef file) { XMP_Uns16 value = LFA_ReadUns16_LE( file ); LFA_Seek( file, -2, SEEK_CUR ); return value; } static inline XMP_Uns32 LFA_PeekUns32_BE(LFA_FileRef file) { XMP_Uns32 value = LFA_ReadUns32_BE( file ); LFA_Seek( file, -4, SEEK_CUR ); return value; } static inline XMP_Uns32 LFA_PeekUns32_LE(LFA_FileRef file) { XMP_Uns32 value = LFA_ReadUns32_LE( file ); LFA_Seek( file, -4, SEEK_CUR ); return value; } static inline XMP_Uns64 LFA_PeekUns64_BE(LFA_FileRef file) { XMP_Uns64 value = LFA_ReadUns64_BE( file ); LFA_Seek( file, -8, SEEK_CUR ); return value; } static inline XMP_Uns64 LFA_PeekUns64_LE(LFA_FileRef file) { XMP_Uns64 value = LFA_ReadUns64_LE( file ); LFA_Seek( file, -8, SEEK_CUR ); return value; } #define LFA_PeekInt16_BE(file) ((XMP_Int16) LFA_PeekUns16_BE ( file )) #define LFA_PeekInt16_LE(file) ((XMP_Int16) LFA_PeekUns16_LE ( file )) #define LFA_PeekInt32_BE(file) ((XMP_Int32) LFA_PeekUns32_BE ( file )) #define LFA_PeekInt32_LE(file) ((XMP_Int32) LFA_PeekUns32_LE ( file )) #define LFA_PeekInt64_BE(file) ((XMP_Int64) LFA_PeekUns64_BE ( file )) #define LFA_PeekInt64_LE(file) ((XMP_Int64) LFA_PeekUns64_LE ( file )) // write functions ///////////////////////////////////////////// static inline void LFA_WriteUns8 ( LFA_FileRef file, XMP_Uns8 value ) { LFA_Write ( file, &value, 1 ); } static inline void LFA_WriteUns16_LE ( LFA_FileRef file, XMP_Uns16 value ) { XMP_Uns16 v = MakeUns16LE(value); LFA_Write ( file, &v, 2 ); } static inline void LFA_WriteUns16_BE ( LFA_FileRef file, XMP_Uns16 value ) { XMP_Uns16 v = MakeUns16BE(value); LFA_Write ( file, &v, 2 ); } static inline void LFA_WriteUns32_LE ( LFA_FileRef file, XMP_Uns32 value ) { XMP_Uns32 v = MakeUns32LE(value); LFA_Write ( file, &v, 4 ); } static inline void LFA_WriteUns32_BE ( LFA_FileRef file, XMP_Uns32 value ) { XMP_Uns32 v = MakeUns32BE(value); LFA_Write ( file, &v, 4 ); } static inline void LFA_WriteUns64_LE ( LFA_FileRef file, XMP_Uns64 value ) { XMP_Uns64 v = MakeUns64LE(value); LFA_Write ( file, &v, 8 ); } static inline void LFA_WriteUns64_BE ( LFA_FileRef file, XMP_Uns64 value ) { XMP_Uns64 v = MakeUns64BE(value); LFA_Write ( file, &v, 8 ); } //////////////////////////////////////// static inline void LFA_WriteInt16_LE ( LFA_FileRef file, XMP_Int16 value ) { XMP_Uns16 v = MakeUns16LE((XMP_Uns16)value); LFA_Write ( file, &v, 2 ); } static inline void LFA_WriteInt16_BE ( LFA_FileRef file, XMP_Int16 value ) { XMP_Uns16 v = MakeUns16BE((XMP_Uns16)value); LFA_Write ( file, &v, 2 ); } static inline void LFA_WriteInt32_LE ( LFA_FileRef file, XMP_Int32 value ) { XMP_Uns32 v = MakeUns32LE((XMP_Uns32)value); LFA_Write ( file, &v, 4 ); } static inline void LFA_WriteInt32_BE ( LFA_FileRef file, XMP_Int32 value ) { XMP_Uns32 v = MakeUns32BE((XMP_Uns32)value); LFA_Write ( file, &v, 4 ); } static inline void LFA_WriteInt64_LE ( LFA_FileRef file, XMP_Int64 value ) { XMP_Uns64 v = MakeUns64LE((XMP_Uns64)value); LFA_Write ( file, &v, 8 ); } static inline void LFA_WriteInt64_BE ( LFA_FileRef file, XMP_Int64 value ) { XMP_Uns64 v = MakeUns64BE((XMP_Uns64)value); LFA_Write ( file, &v, 8 ); } #endif // __LargeFileAccess_hpp__ exempi-2.2.1/source/common/XMLParserAdapter.hpp0000664000175000017500000001231712150230673016350 00000000000000#ifndef __XMLParserAdapter_hpp__ #define __XMLParserAdapter_hpp__ // ================================================================================================= // Copyright 2005 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! Must be the first #include! #include "XMP_Const.h" #include #include // ================================================================================================= // XML_Node details // // The XML_Nodes are used only during the XML/RDF parsing process. This presently uses an XML parser // to create an XML tree, then a recursive descent RDF recognizer to build the corresponding XMP. // This makes it easier to swap XML parsers and provides a clean separation of XML and RDF issues. // The overall parsing would be faster and use less memory if the RDF recognition were done on the // fly using a state machine. But it was much easier to write the recursive descent version. The // current implementation is pretty fast in absolute terms, so being faster might not be crucial. // // Like the XMP tree, the XML tree contains vectors of pointers for down links, and offspring have // a pointer to their parent. Unlike the XMP tree, this is an exact XML document tree. There are no // introduced top level namespace nodes or rearrangement of the nodes.. // // The exact state of namespaces can vary during the XML parsing, depending on the parser in use. // By the time the RDF recognition is done though, the namespaces must be normalized. All of the // used namespaces must be registered, this is done automatically if necessary. All of the "live" // namespace prefixes will be unique. The ns field of an XML_Node is the namespace URI, the name // field contains a qualified name (prefix:local). This includes default namespace mapping, the // URI and prefix will be missing only for elements and attributes in no namespace. class XML_Node; typedef XML_Node * XML_NodePtr; // Handy for things like: XML_Node * a, b; - b is XML_Node, not XML_Node*! enum { kRootNode = 0, kElemNode = 1, kAttrNode = 2, kCDataNode = 3, kPINode = 4 }; #define IsWhitespaceChar(ch) ( ((ch) == ' ') || ((ch) == 0x09) || ((ch) == 0x0A) || ((ch) == 0x0D) ) typedef std::vector XML_NodeVector; typedef XML_NodeVector::iterator XML_NodePos; typedef XML_NodeVector::const_iterator XML_cNodePos; #if 0 // Pattern for iterating over the children or attributes: for ( size_t xxNum = 0, xxLim = _node_->_offspring_.size(); xxNum < xxLim; ++xxNum ) { const XML_NodePtr _curr_ = _node_->_offspring_[xxNum]; } #endif class XML_Node { public: // Intended for lightweight internal use. Clients are expected to use the data directly. XMP_Uns8 kind; std::string ns, name, value; size_t nsPrefixLen; XML_NodePtr parent; XML_NodeVector attrs; XML_NodeVector content; bool IsWhitespaceNode() const; bool IsLeafContentNode() const; // An empty element or one with a single character data child node. bool IsEmptyLeafNode() const; XMP_StringPtr GetAttrValue ( XMP_StringPtr attrName ) const; void SetAttrValue ( XMP_StringPtr attrName, XMP_StringPtr attrValue ); XMP_StringPtr GetLeafContentValue() const; void SetLeafContentValue ( XMP_StringPtr value ); size_t CountNamedElements ( XMP_StringPtr nsURI, XMP_StringPtr localName ) const; // Number of child elements with this name. XML_NodePtr GetNamedElement ( XMP_StringPtr nsURI, XMP_StringPtr localName, size_t which = 0 ); void Dump ( std::string * buffer ); void Serialize ( std::string * buffer ); void RemoveAttrs(); void RemoveContent(); void ClearNode(); XML_Node ( XML_NodePtr _parent, XMP_StringPtr _name, XMP_Uns8 _kind ) : kind(_kind), name(_name), nsPrefixLen(0), parent(_parent) {}; XML_Node ( XML_NodePtr _parent, const std::string & _name, XMP_Uns8 _kind ) : kind(_kind), name(_name), nsPrefixLen(0), parent(_parent) {}; virtual ~XML_Node() { RemoveAttrs(); RemoveContent(); }; private: XML_Node() : kind(0), parent(0) {}; // ! Hidden to make sure parent pointer is always set. }; // ================================================================================================= // Abstract base class for XML parser adapters used by the XMP toolkit. enum { kXMLPendingInputMax = 16 }; class XMLParserAdapter { public: XMLParserAdapter() : tree(0,"",kRootNode), rootNode(0), rootCount(0), charEncoding(XMP_OptionBits(-1)), pendingCount(0) { #if XMP_DebugBuild parseLog = 0; #endif }; virtual ~XMLParserAdapter() {}; virtual void ParseBuffer ( const void * buffer, size_t length, bool last ) = 0; XML_Node tree; XML_NodeVector parseStack; XML_NodePtr rootNode; size_t rootCount; XMP_OptionBits charEncoding; size_t pendingCount; unsigned char pendingInput[kXMLPendingInputMax]; // Buffered input for character encoding checks. #if XMP_DebugBuild FILE * parseLog; #endif }; // ================================================================================================= #endif // __XMLParserAdapter_hpp__ exempi-2.2.1/source/common/ExpatAdapter.hpp0000664000175000017500000000342212150230673015611 00000000000000#ifndef __ExpatAdapter_hpp__ #define __ExpatAdapter_hpp__ // ================================================================================================= // Copyright 2005 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! Must be the first #include! #include "XMLParserAdapter.hpp" // ================================================================================================= // Derived XML parser adapter for Expat. // ================================================================================================= #ifndef BanAllEntityUsage #define BanAllEntityUsage 0 #endif struct XML_ParserStruct; // ! Hack to avoid exposing expat.h to all clients. typedef struct XML_ParserStruct *XML_Parser; class ExpatAdapter : public XMLParserAdapter { public: XML_Parser parser; XMP_NamespaceTable * registeredNamespaces; #if BanAllEntityUsage bool isAborted; #endif #if XMP_DebugBuild size_t elemNesting; #endif static const bool kUseGlobalNamespaces = true; static const bool kUseLocalNamespaces = false; ExpatAdapter ( bool useGlobalNamespaces ); virtual ~ExpatAdapter(); void ParseBuffer ( const void * buffer, size_t length, bool last = true ); private: ExpatAdapter() : registeredNamespaces(0) {}; // ! Force use of constructor with namespace parameter. }; extern "C" ExpatAdapter * XMP_NewExpatAdapter ( bool useGlobalNamespaces ); // ================================================================================================= #endif // __ExpatAdapter_hpp__ exempi-2.2.1/source/common/LargeFileAccess.cpp0000664000175000017500000007045312150230673016206 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "LargeFileAccess.hpp" // ================================================================================================= // LFA implementations for Macintosh // ================================= #if 0 // This Mac-specific code is no longer used, but retained to make merges easier static bool FileExists ( const char * filePath ) { struct stat info; int err = stat ( filePath, &info ); return (err == 0); } // --------------------------------------------------------------------------------------------- // ! Can't use Apple's 64 bit POSIX functions because frigging MSL has type clashes. // *** Revisit now that we've switched to Xcode. LFA_FileRef LFA_Open ( const char * filePath, char mode ) { if ( (mode != 'r') && (mode != 'w') ) LFA_Throw ( "LFA_Open: invalid mode", kLFAErr_ExternalFailure );; FSRef fileRef; SInt8 perm = ( (mode == 'r') ? fsRdPerm : fsRdWrPerm ); HFSUniStr255 dataForkName; #if __LP64__ FSIORefNum refNum; #else SInt16 refNum; #endif OSErr err = FSGetDataForkName ( &dataForkName ); if ( err != noErr ) LFA_Throw ( "LFA_Open: FSGetDataForkName failure", kLFAErr_ExternalFailure ); err = FSPathMakeRef ( (XMP_Uns8*)filePath, &fileRef, 0 ); if ( err != noErr ) LFA_Throw ( "LFA_Open: FSPathMakeRef failure", kLFAErr_ExternalFailure ); err = FSOpenFork ( &fileRef, dataForkName.length, dataForkName.unicode, perm, &refNum ); if ( err != noErr ) LFA_Throw ( "LFA_Open: FSOpenFork failure", kLFAErr_ExternalFailure ); return (LFA_FileRef)refNum; } // LFA_Open // --------------------------------------------------------------------------------------------- LFA_FileRef LFA_Create ( const char * filePath ) { // *** Hack: Use fopen to avoid parent/child name separation needed by FSCreateFileUnicode. if ( FileExists ( filePath ) ) { LFA_Throw ( "LFA_Create: file already exists", kLFAErr_ExternalFailure ); } FILE * temp = fopen ( filePath, "w" ); if ( temp == 0 ) LFA_Throw ( "LFA_Create: fopen failure", kLFAErr_ExternalFailure ); fclose ( temp ); return LFA_Open ( filePath, 'w' ); } // LFA_Create // --------------------------------------------------------------------------------------------- void LFA_Delete ( const char * filePath ) { int err = remove ( filePath ); // *** Better to use an FS function. if ( err != 0 ) LFA_Throw ( "LFA_Delete: remove failure", kLFAErr_ExternalFailure ); } // LFA_Delete // --------------------------------------------------------------------------------------------- void LFA_Rename ( const char * oldName, const char * newName ) { int err = rename ( oldName, newName ); // *** Better to use an FS function. if ( err != 0 ) LFA_Throw ( "LFA_Rename: rename failure", kLFAErr_ExternalFailure ); } // LFA_Rename // --------------------------------------------------------------------------------------------- LFA_FileRef LFA_OpenRsrc ( const char * filePath, char mode ) { if ( (mode != 'r') && (mode != 'w') ) LFA_Throw ( "LFA_OpenRsrc: invalid mode", kLFAErr_ExternalFailure );; FSRef fileRef; SInt8 perm = ( (mode == 'r') ? fsRdPerm : fsRdWrPerm ); HFSUniStr255 rsrcForkName; #if __LP64__ FSIORefNum refNum; #else SInt16 refNum; #endif OSErr err = FSGetResourceForkName ( &rsrcForkName ); if ( err != noErr ) LFA_Throw ( "LFA_OpenRsrc: FSGetResourceForkName failure", kLFAErr_ExternalFailure ); err = FSPathMakeRef ( (XMP_Uns8*)filePath, &fileRef, 0 ); if ( err != noErr ) LFA_Throw ( "LFA_OpenRsrc: FSPathMakeRef failure", kLFAErr_ExternalFailure ); err = FSOpenFork ( &fileRef, rsrcForkName.length, rsrcForkName.unicode, perm, &refNum ); if ( err != noErr ) LFA_Throw ( "LFA_OpenRsrc: FSOpenFork failure", kLFAErr_ExternalFailure ); return (LFA_FileRef)refNum; } // LFA_OpenRsrc // --------------------------------------------------------------------------------------------- void LFA_Close ( LFA_FileRef file ) { if ( file == 0 ) return; // Can happen if LFA_Open throws an exception. long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast. OSErr err = FSCloseFork ( refNum ); if ( err != noErr ) LFA_Throw ( "LFA_Close: FSCloseFork failure", kLFAErr_ExternalFailure ); } // LFA_Close // --------------------------------------------------------------------------------------------- XMP_Int64 LFA_Seek ( LFA_FileRef file, XMP_Int64 offset, int mode, bool * okPtr ) { long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast. UInt16 posMode; switch ( mode ) { case SEEK_SET : posMode = fsFromStart; break; case SEEK_CUR : posMode = fsFromMark; break; case SEEK_END : posMode = fsFromLEOF; break; default : LFA_Throw ( "LFA_Seek: Invalid seek mode", kLFAErr_InternalFailure ); break; } OSErr err; XMP_Int64 newPos; err = FSSetForkPosition ( refNum, posMode, offset ); if ( err == eofErr ) { // FSSetForkPosition does not implicitly grow the file. Grow then seek to the new EOF. err = FSSetForkSize ( refNum, posMode, offset ); if ( err == noErr ) err = FSSetForkPosition ( refNum, fsFromLEOF, 0 ); } if ( err == noErr ) err = FSGetForkPosition ( refNum, &newPos ); if ( okPtr != 0 ) { *okPtr = (err == noErr); } else { if ( err != noErr ) LFA_Throw ( "LFA_Seek: FSSetForkPosition failure", kLFAErr_ExternalFailure ); } return newPos; } // LFA_Seek // --------------------------------------------------------------------------------------------- XMP_Int32 LFA_Read ( LFA_FileRef file, void * buffer, XMP_Int32 bytes, bool requireAll ) { long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast. ByteCount bytesRead; OSErr err = FSReadFork ( refNum, fsAtMark, 0, bytes, buffer, &bytesRead ); if ( ((err != noErr) && (err != eofErr)) || (requireAll && (bytesRead != (ByteCount)bytes)) ) { // ! FSReadFork returns eofErr for a normal encounter with the end of file. LFA_Throw ( "LFA_Read: FSReadFork failure", kLFAErr_ExternalFailure ); } return bytesRead; } // LFA_Read // --------------------------------------------------------------------------------------------- void LFA_Write ( LFA_FileRef file, const void * buffer, XMP_Int32 bytes ) { long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast. ByteCount bytesWritten; OSErr err = FSWriteFork ( refNum, fsAtMark, 0, bytes, buffer, &bytesWritten ); if ( (err != noErr) | (bytesWritten != (ByteCount)bytes) ) LFA_Throw ( "LFA_Write: FSWriteFork failure", kLFAErr_ExternalFailure ); } // LFA_Write // --------------------------------------------------------------------------------------------- void LFA_Flush ( LFA_FileRef file ) { long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast. OSErr err = FSFlushFork ( refNum ); if ( err != noErr ) LFA_Throw ( "LFA_Flush: FSFlushFork failure", kLFAErr_ExternalFailure ); } // LFA_Flush // --------------------------------------------------------------------------------------------- XMP_Int64 LFA_Measure ( LFA_FileRef file ) { long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast. XMP_Int64 length; OSErr err = FSGetForkSize ( refNum, &length ); if ( err != noErr ) LFA_Throw ( "LFA_Measure: FSSetForkSize failure", kLFAErr_ExternalFailure ); return length; } // LFA_Measure // --------------------------------------------------------------------------------------------- void LFA_Extend ( LFA_FileRef file, XMP_Int64 length ) { long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast. OSErr err = FSSetForkSize ( refNum, fsFromStart, length ); if ( err != noErr ) LFA_Throw ( "LFA_Extend: FSSetForkSize failure", kLFAErr_ExternalFailure ); } // LFA_Extend // --------------------------------------------------------------------------------------------- void LFA_Truncate ( LFA_FileRef file, XMP_Int64 length ) { long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast. OSErr err = FSSetForkSize ( refNum, fsFromStart, length ); if ( err != noErr ) LFA_Throw ( "LFA_Truncate: FSSetForkSize failure", kLFAErr_ExternalFailure ); } // LFA_Truncate // --------------------------------------------------------------------------------------------- #endif // XMP_MacBuild // ================================================================================================= // LFA implementations for Windows // =============================== #if XMP_WinBuild // --------------------------------------------------------------------------------------------- LFA_FileRef LFA_Open ( const char * filePath, char mode ) { if ( (mode != 'r') && (mode != 'w') ) LFA_Throw ( "LFA_Open: invalid mode", kLFAErr_ExternalFailure );; DWORD access = GENERIC_READ; // Assume read mode. DWORD share = FILE_SHARE_READ; if ( mode == 'w' ) { access |= GENERIC_WRITE; share = 0; } std::string wideName; const size_t utf8Len = strlen(filePath); const size_t maxLen = 2 * (utf8Len+1); wideName.reserve ( maxLen ); wideName.assign ( maxLen, ' ' ); int wideLen = MultiByteToWideChar ( CP_UTF8, 0, filePath, -1, (LPWSTR)wideName.data(), (int)maxLen ); if ( wideLen == 0 ) LFA_Throw ( "LFA_Open: MultiByteToWideChar failure", kLFAErr_ExternalFailure ); HANDLE fileHandle = CreateFileW ( (LPCWSTR)wideName.data(), access, share, 0, OPEN_EXISTING, (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0 ); if ( fileHandle == INVALID_HANDLE_VALUE ) LFA_Throw ( "LFA_Open: CreateFileW failure", kLFAErr_ExternalFailure ); return (LFA_FileRef)fileHandle; } // LFA_Open // --------------------------------------------------------------------------------------------- LFA_FileRef LFA_Create ( const char * filePath ) { std::string wideName; const size_t utf8Len = strlen(filePath); const size_t maxLen = 2 * (utf8Len+1); wideName.reserve ( maxLen ); wideName.assign ( maxLen, ' ' ); int wideLen = MultiByteToWideChar ( CP_UTF8, 0, filePath, -1, (LPWSTR)wideName.data(), (int)maxLen ); if ( wideLen == 0 ) LFA_Throw ( "LFA_Create: MultiByteToWideChar failure", kLFAErr_ExternalFailure ); HANDLE fileHandle; fileHandle = CreateFileW ( (LPCWSTR)wideName.data(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0 ); if ( fileHandle != INVALID_HANDLE_VALUE ) { CloseHandle ( fileHandle ); LFA_Throw ( "LFA_Create: file already exists", kLFAErr_ExternalFailure ); } fileHandle = CreateFileW ( (LPCWSTR)wideName.data(), (GENERIC_READ | GENERIC_WRITE), 0, 0, CREATE_ALWAYS, (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0 ); if ( fileHandle == INVALID_HANDLE_VALUE ) LFA_Throw ( "LFA_Create: CreateFileW failure", kLFAErr_ExternalFailure ); return (LFA_FileRef)fileHandle; } // LFA_Create // --------------------------------------------------------------------------------------------- void LFA_Delete ( const char * filePath ) { std::string wideName; const size_t utf8Len = strlen(filePath); const size_t maxLen = 2 * (utf8Len+1); wideName.reserve ( maxLen ); wideName.assign ( maxLen, ' ' ); int wideLen = MultiByteToWideChar ( CP_UTF8, 0, filePath, -1, (LPWSTR)wideName.data(), (int)maxLen ); if ( wideLen == 0 ) LFA_Throw ( "LFA_Delete: MultiByteToWideChar failure", kLFAErr_ExternalFailure ); BOOL ok = DeleteFileW ( (LPCWSTR)wideName.data() ); if ( ! ok ) LFA_Throw ( "LFA_Delete: DeleteFileW failure", kLFAErr_ExternalFailure ); } // LFA_Delete // --------------------------------------------------------------------------------------------- void LFA_Rename ( const char * oldName, const char * newName ) { std::string wideOldName, wideNewName; size_t utf8Len = strlen(oldName); if ( utf8Len < strlen(newName) ) utf8Len = strlen(newName); const size_t maxLen = 2 * (utf8Len+1); int wideLen; wideOldName.reserve ( maxLen ); wideOldName.assign ( maxLen, ' ' ); wideLen = MultiByteToWideChar ( CP_UTF8, 0, oldName, -1, (LPWSTR)wideOldName.data(), (int)maxLen ); if ( wideLen == 0 ) LFA_Throw ( "LFA_Rename: MultiByteToWideChar failure", kLFAErr_ExternalFailure ); wideNewName.reserve ( maxLen ); wideNewName.assign ( maxLen, ' ' ); wideLen = MultiByteToWideChar ( CP_UTF8, 0, newName, -1, (LPWSTR)wideNewName.data(), (int)maxLen ); if ( wideLen == 0 ) LFA_Throw ( "LFA_Rename: MultiByteToWideChar failure", kLFAErr_ExternalFailure ); BOOL ok = MoveFileW ( (LPCWSTR)wideOldName.data(), (LPCWSTR)wideNewName.data() ); if ( ! ok ) LFA_Throw ( "LFA_Rename: MoveFileW failure", kLFAErr_ExternalFailure ); } // LFA_Rename // --------------------------------------------------------------------------------------------- void LFA_Close ( LFA_FileRef file ) { if ( file == 0 ) return; // Can happen if LFA_Open throws an exception. HANDLE fileHandle = (HANDLE)file; BOOL ok = CloseHandle ( fileHandle ); if ( ! ok ) LFA_Throw ( "LFA_Close: CloseHandle failure", kLFAErr_ExternalFailure ); } // LFA_Close // --------------------------------------------------------------------------------------------- XMP_Int64 LFA_Seek ( LFA_FileRef file, XMP_Int64 offset, int mode, bool * okPtr ) { HANDLE fileHandle = (HANDLE)file; DWORD method; switch ( mode ) { case SEEK_SET : method = FILE_BEGIN; break; case SEEK_CUR : method = FILE_CURRENT; break; case SEEK_END : method = FILE_END; break; default : LFA_Throw ( "Invalid seek mode", kLFAErr_InternalFailure ); break; } LARGE_INTEGER seekOffset, newPos; seekOffset.QuadPart = offset; BOOL ok = SetFilePointerEx ( fileHandle, seekOffset, &newPos, method ); if ( okPtr != 0 ) { *okPtr = ( ok != 0 ); //convert int(disguised as BOOL) to bool, avoiding conversion warning } else { if ( ! ok ) LFA_Throw ( "LFA_Seek: SetFilePointerEx failure", kLFAErr_ExternalFailure ); } return newPos.QuadPart; } // LFA_Seek // --------------------------------------------------------------------------------------------- XMP_Int32 LFA_Read ( LFA_FileRef file, void * buffer, XMP_Int32 bytes, bool requireAll ) { HANDLE fileHandle = (HANDLE)file; DWORD bytesRead; BOOL ok = ReadFile ( fileHandle, buffer, bytes, &bytesRead, 0 ); if ( (! ok) || (requireAll && (bytesRead != bytes)) ) LFA_Throw ( "LFA_Read: ReadFile failure", kLFAErr_ExternalFailure ); return bytesRead; } // LFA_Read // --------------------------------------------------------------------------------------------- void LFA_Write ( LFA_FileRef file, const void * buffer, XMP_Int32 bytes ) { HANDLE fileHandle = (HANDLE)file; DWORD bytesWritten; BOOL ok = WriteFile ( fileHandle, buffer, bytes, &bytesWritten, 0 ); if ( (! ok) || (bytesWritten != bytes) ) LFA_Throw ( "LFA_Write: WriteFile failure", kLFAErr_ExternalFailure ); } // LFA_Write // --------------------------------------------------------------------------------------------- void LFA_Flush ( LFA_FileRef file ) { HANDLE fileHandle = (HANDLE)file; BOOL ok = FlushFileBuffers ( fileHandle ); if ( ! ok ) LFA_Throw ( "LFA_Flush: FlushFileBuffers failure", kLFAErr_ExternalFailure ); } // LFA_Flush // --------------------------------------------------------------------------------------------- XMP_Int64 LFA_Measure ( LFA_FileRef file ) { HANDLE fileHandle = (HANDLE)file; LARGE_INTEGER length; BOOL ok = GetFileSizeEx ( fileHandle, &length ); if ( ! ok ) LFA_Throw ( "LFA_Measure: GetFileSizeEx failure", kLFAErr_ExternalFailure ); return length.QuadPart; } // LFA_Measure // --------------------------------------------------------------------------------------------- void LFA_Extend ( LFA_FileRef file, XMP_Int64 length ) { HANDLE fileHandle = (HANDLE)file; LARGE_INTEGER winLength; winLength.QuadPart = length; BOOL ok = SetFilePointerEx ( fileHandle, winLength, 0, FILE_BEGIN ); if ( ! ok ) LFA_Throw ( "LFA_Extend: SetFilePointerEx failure", kLFAErr_ExternalFailure ); ok = SetEndOfFile ( fileHandle ); if ( ! ok ) LFA_Throw ( "LFA_Extend: SetEndOfFile failure", kLFAErr_ExternalFailure ); } // LFA_Extend // --------------------------------------------------------------------------------------------- void LFA_Truncate ( LFA_FileRef file, XMP_Int64 length ) { HANDLE fileHandle = (HANDLE)file; LARGE_INTEGER winLength; winLength.QuadPart = length; BOOL ok = SetFilePointerEx ( fileHandle, winLength, 0, FILE_BEGIN ); if ( ! ok ) LFA_Throw ( "LFA_Truncate: SetFilePointerEx failure", kLFAErr_ExternalFailure ); ok = SetEndOfFile ( fileHandle ); if ( ! ok ) LFA_Throw ( "LFA_Truncate: SetEndOfFile failure", kLFAErr_ExternalFailure ); } // LFA_Truncate // --------------------------------------------------------------------------------------------- #endif // XMP_WinBuild // ================================================================================================= // LFA implementations for POSIX // ============================= #if XMP_UNIXBuild | XMP_MacBuild // --------------------------------------------------------------------------------------------- // Make sure off_t is 64 bits and signed. static char check_off_t_size [ (sizeof(off_t) == 8) ? 1 : -1 ]; // *** No std::numeric_limits? static char check_off_t_sign [ std::numeric_limits::is_signed ? -1 : 1 ]; static bool FileExists ( const char * filePath ) { struct stat info; int err = stat ( filePath, &info ); return (err == 0); } // --------------------------------------------------------------------------------------------- LFA_FileRef LFA_Open ( const char * filePath, char mode ) { if ( (mode != 'r') && (mode != 'w') ) LFA_Throw ( "LFA_Open: invalid mode", kLFAErr_ExternalFailure );; int flags = ((mode == 'r') ? O_RDONLY : O_RDWR); // *** Include O_EXLOCK? int descr = open ( filePath, flags, ( S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP ) ); if ( descr == -1 ) LFA_Throw ( "LFA_Open: open failure", kLFAErr_ExternalFailure ); struct stat info; if ( fstat(descr,&info) == -1 ) LFA_Throw( "LFA_Open: fstat failed.", kLFAErr_ExternalFailure ); // troublesome issue: // a root user might be able to open a write-protected file w/o complaint // although we should (to stay in sync with Mac/Win behaviour) // reject write access (i.e. OpenForUpdate) to write-protected files: if ( (mode == 'w') && ( 0 == (info.st_mode & S_IWUSR) )) LFA_Throw( "LFA_Open:file is write proected", kLFAErr_ExternalFailure ); return (LFA_FileRef)descr; } // LFA_Open // --------------------------------------------------------------------------------------------- LFA_FileRef LFA_Create ( const char * filePath ) { if ( FileExists ( filePath ) ) { LFA_Throw ( "LFA_Create: file already exists", kLFAErr_ExternalFailure ); } mode_t mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); int descr = open ( filePath, (O_CREAT | O_EXCL | O_RDWR), mode ); // *** Include O_EXLOCK? if ( descr == -1 ) LFA_Throw ( "LFA_Create: open failure", kLFAErr_ExternalFailure ); return (LFA_FileRef)descr; } // LFA_Create // --------------------------------------------------------------------------------------------- void LFA_Delete ( const char * filePath ) { int err = unlink ( filePath ); if ( err != 0 ) LFA_Throw ( "LFA_Delete: unlink failure", kLFAErr_ExternalFailure ); } // LFA_Delete // --------------------------------------------------------------------------------------------- void LFA_Rename ( const char * oldName, const char * newName ) { int err = rename ( oldName, newName ); // *** POSIX rename clobbers existing destination! if ( err != 0 ) LFA_Throw ( "LFA_Rename: rename failure", kLFAErr_ExternalFailure ); } // LFA_Rename // --------------------------------------------------------------------------------------------- void LFA_Close ( LFA_FileRef file ) { if ( file == 0 ) return; // Can happen if LFA_Open throws an exception. int descr = (int)file; int err = close ( descr ); if ( err != 0 ) LFA_Throw ( "LFA_Close: close failure", kLFAErr_ExternalFailure ); } // LFA_Close // --------------------------------------------------------------------------------------------- XMP_Int64 LFA_Seek ( LFA_FileRef file, XMP_Int64 offset, int mode, bool * okPtr ) { int descr = (int)file; off_t newPos = lseek ( descr, offset, mode ); if ( okPtr != 0 ) { *okPtr = (newPos != -1); } else { if ( newPos == -1 ) LFA_Throw ( "LFA_Seek: lseek failure", kLFAErr_ExternalFailure ); } return newPos; } // LFA_Seek // --------------------------------------------------------------------------------------------- XMP_Int32 LFA_Read ( LFA_FileRef file, void * buffer, XMP_Int32 bytes, bool requireAll ) { int descr = (int)file; ssize_t bytesRead = read ( descr, buffer, bytes ); if ( (bytesRead == -1) || (requireAll && (bytesRead != bytes)) ) LFA_Throw ( "LFA_Read: read failure", kLFAErr_ExternalFailure ); return bytesRead; } // LFA_Read // --------------------------------------------------------------------------------------------- void LFA_Write ( LFA_FileRef file, const void * buffer, XMP_Int32 bytes ) { int descr = (int)file; ssize_t bytesWritten = write ( descr, buffer, bytes ); if ( bytesWritten != bytes ) LFA_Throw ( "LFA_Write: write failure", kLFAErr_ExternalFailure ); } // LFA_Write // --------------------------------------------------------------------------------------------- void LFA_Flush ( LFA_FileRef file ) { int descr = (int)file; int err = fsync ( descr ); if ( err != 0 ) LFA_Throw ( "LFA_Flush: fsync failure", kLFAErr_ExternalFailure ); } // LFA_Flush // --------------------------------------------------------------------------------------------- XMP_Int64 LFA_Measure ( LFA_FileRef file ) { int descr = (int)file; off_t currPos = lseek ( descr, 0, SEEK_CUR ); off_t length = lseek ( descr, 0, SEEK_END ); if ( (currPos == -1) || (length == -1) ) LFA_Throw ( "LFA_Measure: lseek failure", kLFAErr_ExternalFailure ); (void) lseek ( descr, currPos, SEEK_SET ); return length; } // LFA_Measure // --------------------------------------------------------------------------------------------- void LFA_Extend ( LFA_FileRef file, XMP_Int64 length ) { int descr = (int)file; int err = ftruncate ( descr, length ); if ( err != 0 ) LFA_Throw ( "LFA_Extend: ftruncate failure", kLFAErr_ExternalFailure ); } // LFA_Extend // --------------------------------------------------------------------------------------------- void LFA_Truncate ( LFA_FileRef file, XMP_Int64 length ) { int descr = (int)file; int err = ftruncate ( descr, length ); if ( err != 0 ) LFA_Throw ( "LFA_Truncate: ftruncate failure", kLFAErr_ExternalFailure ); } // LFA_Truncate // --------------------------------------------------------------------------------------------- #endif // XMP_UNIXBuild | XMP_MacBuild // ================================================================================================= /* note! function does not rewind (LFA_Seek)) */ void LFA_Copy ( LFA_FileRef sourceFile, LFA_FileRef destFile, XMP_Int64 length, XMP_AbortProc abortProc /* = 0 */, void * abortArg /* = 0 */ ) { enum { kBufferLen = 64*1024 }; XMP_Uns8 buffer [kBufferLen]; const bool checkAbort = (abortProc != 0); while ( length > 0 ) { if ( checkAbort && abortProc(abortArg) ) { LFA_Throw ( "LFA_Copy - User abort", kLFAErr_UserAbort ); } XMP_Int32 ioCount = kBufferLen; if ( length < kBufferLen ) ioCount = (XMP_Int32)length; LFA_Read ( sourceFile, buffer, ioCount, kLFA_RequireAll ); LFA_Write ( destFile, buffer, ioCount ); length -= ioCount; } } // LFA_Copy // ================================================================================================= // allows to move data within a file (just pass in the same file handle as srcFile and dstFile) // shadow effects (stumbling over just-written data) are avoided. // // * however can also be used to move data between two files * // (having both option is handy for flexible use in update()/re-write() handler routines) void LFA_Move ( LFA_FileRef srcFile, XMP_Int64 srcOffset, LFA_FileRef dstFile, XMP_Int64 dstOffset, XMP_Int64 length, XMP_AbortProc abortProc /* = 0 */, void * abortArg /* = 0 */ ) { enum { kBufferLen = 64*1024 }; XMP_Uns8 buffer [kBufferLen]; const bool checkAbort = (abortProc != 0); if ( srcOffset > dstOffset ) { // avoiding shadow effects // move down -> shift lowest packet first ! while ( length > 0 ) { if ( checkAbort && abortProc(abortArg) ) LFA_Throw ( "LFA_Move - User abort", kLFAErr_UserAbort ); XMP_Int32 ioCount = kBufferLen; if ( length < kBufferLen ) ioCount = (XMP_Int32)length; //smartly avoids 32/64 bit issues LFA_Seek ( srcFile, srcOffset, SEEK_SET ); LFA_Read ( srcFile, buffer, ioCount, kLFA_RequireAll ); LFA_Seek ( dstFile, dstOffset, SEEK_SET ); LFA_Write ( dstFile, buffer, ioCount ); length -= ioCount; srcOffset += ioCount; dstOffset += ioCount; } } else { // move up -> shift highest packet first srcOffset += length; //move to end dstOffset += length; while ( length > 0 ) { if ( checkAbort && abortProc(abortArg) ) LFA_Throw ( "LFA_Move - User abort", kLFAErr_UserAbort ); XMP_Int32 ioCount = kBufferLen; if ( length < kBufferLen ) ioCount = (XMP_Int32)length; //smartly avoids 32/64 bit issues srcOffset -= ioCount; dstOffset -= ioCount; LFA_Seek ( srcFile, srcOffset, SEEK_SET ); LFA_Read ( srcFile, buffer, ioCount, kLFA_RequireAll ); LFA_Seek ( dstFile, dstOffset, SEEK_SET ); LFA_Write ( dstFile, buffer, ioCount ); length -= ioCount; } } } // LFA_Move // ================================================================================================= XMP_Int64 LFA_Tell ( LFA_FileRef file ) { return LFA_Seek( file, 0 , SEEK_CUR ); // _CUR ! } // plain convenience XMP_Int64 LFA_Rewind( LFA_FileRef file) { return LFA_Seek( file, 0 , SEEK_SET ); // _SET ! } //*** kind of a hack, TOTEST bool LFA_isEof( LFA_FileRef file ) { #if 0 // This Mac-specific code is no longer used, but retained to make merges easier long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast. XMP_Int64 position, length; OSErr err = FSGetForkPosition( refNum, &position ); if ( err != noErr ) LFA_Throw ( "LFA_isEOF:FSGetForkPosition failure", kLFAErr_ExternalFailure ); err = FSGetForkSize ( refNum, &length ); if ( err != noErr ) LFA_Throw ( "LFA_isEof: FSGetForkSize failure", kLFAErr_ExternalFailure ); return position==length; #endif #if XMP_WinBuild HANDLE handle = (HANDLE)file; XMP_Int64 filepos = LFA_Tell(file); DWORD lowWord, highWord; lowWord = GetFileSize(handle, &highWord); XMP_Int64 filesize = ( ((XMP_Int64)highWord) << 32 | lowWord ); return filesize == filepos; #endif #if XMP_UNIXBuild | XMP_MacBuild int descr = (int)file; struct stat info; if (fstat(descr,&info) == -1) LFA_Throw ( "LFA_isEof: fstat failed.", kLFAErr_ExternalFailure ); return LFA_Tell(file) == info.st_size; #endif } // TOTEST char LFA_GetChar( LFA_FileRef file ) { XMP_Uns8 c; LFA_Read( file, &c, 1, true); return c; } #if XMP_MacBuild // --------------------------------------------------------------------------------------------- // On Mac OS X, POSIX open() can access resource forks by appending // "/..namedfork/rsrc" to the end of the actual path LFA_FileRef LFA_OpenRsrc ( const char* filePath, char mode ) { char suffix[18] = "/..namedfork/rsrc"; char* rsrc = (char*) malloc((strlen(filePath)+strlen(suffix)+2) * sizeof(char)); strcpy ( rsrc, filePath ) ; strcat ( rsrc, suffix ); LFA_FileRef fileRef; try { // Once we assemble the name with resource fork, we can use // the standard LFA_Open call to get it fileRef = LFA_Open ( rsrc, mode ); } catch ( ... ) { LFA_Throw ( "LFA_OpenRsrc: open failure", kLFAErr_ExternalFailure ); } free ( rsrc ); return fileRef; } // LFA_OpenRsrc // --------------------------------------------------------------------------------------------- #endif // XMP_MacBuild exempi-2.2.1/source/common/UnicodeConversions.cpp0000664000175000017500000015661312150230673017054 00000000000000// ================================================================================================= // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Const.h" #if UnicodeTestBuild #include #include #define UC_Assert assert #define UC_Throw(m,k) throw std::logic_error ( m ) #else #define UC_Assert(cond) /* Nothing for now, should be XMP_Assert. */ #define UC_Throw(msg,id) throw XMP_Error ( id, msg ) #endif #include "UnicodeConversions.hpp" using namespace std; // ================================================================================================= // *** Look into using asm inlines, e.g. count-leading bits for multi-byte UTF-8. CodePoint_to_UTF16_Proc CodePoint_to_UTF16BE = 0; CodePoint_to_UTF16_Proc CodePoint_to_UTF16LE = 0; CodePoint_from_UTF16_Proc CodePoint_from_UTF16BE = 0; CodePoint_from_UTF16_Proc CodePoint_from_UTF16LE = 0; UTF8_to_UTF16_Proc UTF8_to_UTF16BE = 0; UTF8_to_UTF16_Proc UTF8_to_UTF16LE = 0; UTF8_to_UTF32_Proc UTF8_to_UTF32BE = 0; UTF8_to_UTF32_Proc UTF8_to_UTF32LE = 0; UTF16_to_UTF8_Proc UTF16BE_to_UTF8 = 0; UTF16_to_UTF8_Proc UTF16LE_to_UTF8 = 0; UTF32_to_UTF8_Proc UTF32BE_to_UTF8 = 0; UTF32_to_UTF8_Proc UTF32LE_to_UTF8 = 0; UTF8_to_UTF16_Proc UTF8_to_UTF16Native = 0; UTF8_to_UTF32_Proc UTF8_to_UTF32Native = 0; UTF16_to_UTF8_Proc UTF16Native_to_UTF8 = 0; UTF32_to_UTF8_Proc UTF32Native_to_UTF8 = 0; UTF16_to_UTF32_Proc UTF16BE_to_UTF32BE = 0; UTF16_to_UTF32_Proc UTF16BE_to_UTF32LE = 0; UTF16_to_UTF32_Proc UTF16LE_to_UTF32BE = 0; UTF16_to_UTF32_Proc UTF16LE_to_UTF32LE = 0; UTF32_to_UTF16_Proc UTF32BE_to_UTF16BE = 0; UTF32_to_UTF16_Proc UTF32BE_to_UTF16LE = 0; UTF32_to_UTF16_Proc UTF32LE_to_UTF16BE = 0; UTF32_to_UTF16_Proc UTF32LE_to_UTF16LE = 0; // ------------------------------------------------------------------------------------------------- static size_t swap32to16Offset = 0; // Offset to "convert" a swapped UTF32 pointer into a swapped UTF16 pointer. // ------------------------------------------------------------------------------------------------- static void CodePoint_to_UTF16Nat ( const UTF32Unit cpIn, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf16Written ); static void CodePoint_to_UTF16Swp ( const UTF32Unit cpIn, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf16Written ); static void CodePoint_from_UTF16Nat ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * cpOut, size_t * utf16Read ); static void CodePoint_from_UTF16Swp ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * cpOut, size_t * utf16Read ); // ------------------------------------------------------------------------------------------------- static void UTF8_to_UTF16Nat ( const UTF8Unit * utf8In, const size_t utf8Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf8Read, size_t * utf16Written ); static void UTF8_to_UTF16Swp ( const UTF8Unit * utf8In, const size_t utf8Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf8Read, size_t * utf16Written ); static void UTF8_to_UTF32Nat ( const UTF8Unit * utf8In, const size_t utf8Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf8Read, size_t * utf32Written ); static void UTF8_to_UTF32Swp ( const UTF8Unit * utf8In, const size_t utf8Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf8Read, size_t * utf32Written ); // ------------------------------------------------------------------------------------------------- static void UTF16Nat_to_UTF8 ( const UTF16Unit * utf16In, const size_t utf16Len, UTF8Unit * utf8Out, const size_t utf8Len, size_t * utf16Read, size_t * utf8Written ); static void UTF16Swp_to_UTF8 ( const UTF16Unit * utf16In, const size_t utf16Len, UTF8Unit * utf8Out, const size_t utf8Len, size_t * utf16Read, size_t * utf8Written ); static void UTF32Nat_to_UTF8 ( const UTF32Unit * utf32In, const size_t utf32Len, UTF8Unit * utf8Out, const size_t utf8Len, size_t * utf32Read, size_t * utf8Written ); static void UTF32Swp_to_UTF8 ( const UTF32Unit * utf32In, const size_t utf32Len, UTF8Unit * utf8Out, const size_t utf8Len, size_t * utf32Read, size_t * utf8Written ); // ------------------------------------------------------------------------------------------------- static void UTF16Nat_to_UTF32Nat ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf16Read, size_t * utf32Written ); static void UTF16Nat_to_UTF32Swp ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf16Read, size_t * utf32Written ); static void UTF16Swp_to_UTF32Nat ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf16Read, size_t * utf32Written ); static void UTF16Swp_to_UTF32Swp ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf16Read, size_t * utf32Written ); // ------------------------------------------------------------------------------------------------- static void UTF32Nat_to_UTF16Nat ( const UTF32Unit * utf32In, const size_t utf32Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf32Read, size_t * utf16Written ); static void UTF32Nat_to_UTF16Swp ( const UTF32Unit * utf32In, const size_t utf32Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf32Read, size_t * utf16Written ); static void UTF32Swp_to_UTF16Nat ( const UTF32Unit * utf32In, const size_t utf32Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf32Read, size_t * utf16Written ); static void UTF32Swp_to_UTF16Swp ( const UTF32Unit * utf32In, const size_t utf32Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf32Read, size_t * utf16Written ); // ================================================================================================= void InitializeUnicodeConversions() { UC_Assert ( (sizeof(UTF8Unit) == 1) && (sizeof(UTF16Unit) == 2) && (sizeof(UTF32Unit) == 4) ); UTF16Unit u16 = 0x00FF; bool bigEndian = (*((UTF8Unit*)&u16) == 0); UTF8_to_UTF16Native = UTF8_to_UTF16Nat; UTF8_to_UTF32Native = UTF8_to_UTF32Nat; UTF16Native_to_UTF8 = UTF16Nat_to_UTF8; UTF32Native_to_UTF8 = UTF32Nat_to_UTF8; if ( bigEndian ) { swap32to16Offset = 0; CodePoint_to_UTF16BE = CodePoint_to_UTF16Nat; CodePoint_to_UTF16LE = CodePoint_to_UTF16Swp; CodePoint_from_UTF16BE = CodePoint_from_UTF16Nat; CodePoint_from_UTF16LE = CodePoint_from_UTF16Swp; UTF8_to_UTF16BE = UTF8_to_UTF16Nat; UTF8_to_UTF16LE = UTF8_to_UTF16Swp; UTF8_to_UTF32BE = UTF8_to_UTF32Nat; UTF8_to_UTF32LE = UTF8_to_UTF32Swp; UTF16BE_to_UTF8 = UTF16Nat_to_UTF8; UTF16LE_to_UTF8 = UTF16Swp_to_UTF8; UTF32BE_to_UTF8 = UTF32Nat_to_UTF8; UTF32LE_to_UTF8 = UTF32Swp_to_UTF8; UTF16BE_to_UTF32BE = UTF16Nat_to_UTF32Nat; UTF16BE_to_UTF32LE = UTF16Nat_to_UTF32Swp; UTF16LE_to_UTF32BE = UTF16Swp_to_UTF32Nat; UTF16LE_to_UTF32LE = UTF16Swp_to_UTF32Swp; UTF32BE_to_UTF16BE = UTF32Nat_to_UTF16Nat; UTF32BE_to_UTF16LE = UTF32Nat_to_UTF16Swp; UTF32LE_to_UTF16BE = UTF32Swp_to_UTF16Nat; UTF32LE_to_UTF16LE = UTF32Swp_to_UTF16Swp; } else { swap32to16Offset = 1; // ! Offset in UTF16 units! CodePoint_to_UTF16BE = CodePoint_to_UTF16Swp; CodePoint_to_UTF16LE = CodePoint_to_UTF16Nat; CodePoint_from_UTF16BE = CodePoint_from_UTF16Swp; CodePoint_from_UTF16LE = CodePoint_from_UTF16Nat; UTF8_to_UTF16BE = UTF8_to_UTF16Swp; UTF8_to_UTF16LE = UTF8_to_UTF16Nat; UTF8_to_UTF32BE = UTF8_to_UTF32Swp; UTF8_to_UTF32LE = UTF8_to_UTF32Nat; UTF16BE_to_UTF8 = UTF16Swp_to_UTF8; UTF16LE_to_UTF8 = UTF16Nat_to_UTF8; UTF32BE_to_UTF8 = UTF32Swp_to_UTF8; UTF32LE_to_UTF8 = UTF32Nat_to_UTF8; UTF16BE_to_UTF32BE = UTF16Swp_to_UTF32Swp; UTF16BE_to_UTF32LE = UTF16Swp_to_UTF32Nat; UTF16LE_to_UTF32BE = UTF16Nat_to_UTF32Swp; UTF16LE_to_UTF32LE = UTF16Nat_to_UTF32Nat; UTF32BE_to_UTF16BE = UTF32Swp_to_UTF16Swp; UTF32BE_to_UTF16LE = UTF32Swp_to_UTF16Nat; UTF32LE_to_UTF16BE = UTF32Nat_to_UTF16Swp; UTF32LE_to_UTF16LE = UTF32Nat_to_UTF16Nat; } } // InitializeUnicodeConversions // ================================================================================================= static inline UTF16Unit UTF16InSwap ( const UTF16Unit * inPtr ) { UTF16Unit inUnit = *inPtr; return (inUnit << 8) | (inUnit >> 8); } static inline UTF32Unit UTF32InSwap ( const UTF32Unit * inPtr ) { UTF32Unit inUnit = *inPtr; return (inUnit << 24) | ((inUnit << 8) & 0x00FF0000) | ((inUnit >> 8) & 0x0000FF00) | (inUnit >> 24); } static inline void UTF16OutSwap ( UTF16Unit * outPtr, const UTF16Unit value ) { UTF16Unit outUnit = (value << 8) | (value >> 8); *outPtr = outUnit; } static inline void UTF32OutSwap ( UTF32Unit * outPtr, const UTF32Unit value ) { UTF32Unit outUnit = (value << 24) | ((value << 8) & 0x00FF0000) | ((value >> 8) & 0x0000FF00) | (value >> 24); *outPtr = outUnit; } // ================================================================================================= void SwapUTF16 ( const UTF16Unit * utf16In, UTF16Unit * utf16Out, const size_t utf16Len ) { for ( size_t i = 0; i < utf16Len; ++i ) utf16Out[i] = UTF16InSwap(utf16In+i); } void SwapUTF32 ( const UTF32Unit * utf32In, UTF32Unit * utf32Out, const size_t utf32Len ) { for ( size_t i = 0; i < utf32Len; ++i ) utf32Out[i] = UTF32InSwap(utf32In+i); } // ================================================================================================= extern void ToUTF16 ( const UTF8Unit * utf8In, size_t utf8Len, std::string * utf16Str, bool bigEndian ) { UTF8_to_UTF16_Proc Converter = UTF8_to_UTF16LE; if ( bigEndian ) Converter = UTF8_to_UTF16BE; enum { kBufferSize = 8*1024 }; UTF16Unit u16Buffer[kBufferSize]; // 16K bytes size_t readCount, writeCount; utf16Str->erase(); utf16Str->reserve ( 2*utf8Len ); // As good a guess as any. while ( utf8Len > 0 ) { Converter ( utf8In, utf8Len, u16Buffer, kBufferSize, &readCount, &writeCount ); if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); utf16Str->append ( (const char *)u16Buffer, writeCount*2 ); utf8In += readCount; utf8Len -= readCount; } } // ToUTF16 // ================================================================================================= extern void ToUTF16Native ( const UTF8Unit * utf8In, size_t utf8Len, std::string * utf16Str ) { enum { kBufferSize = 8*1024 }; UTF16Unit u16Buffer[kBufferSize]; // 16K bytes size_t readCount, writeCount; utf16Str->erase(); utf16Str->reserve ( 2*utf8Len ); // As good a guess as any. while ( utf8Len > 0 ) { UTF8_to_UTF16Nat ( utf8In, utf8Len, u16Buffer, kBufferSize, &readCount, &writeCount ); if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); utf16Str->append ( (const char *)u16Buffer, writeCount*2 ); utf8In += readCount; utf8Len -= readCount; } } // ToUTF16Native // ================================================================================================= extern void ToUTF32 ( const UTF8Unit * utf8In, size_t utf8Len, std::string * utf32Str, bool bigEndian ) { UTF8_to_UTF32_Proc Converter = UTF8_to_UTF32LE; if ( bigEndian ) Converter = UTF8_to_UTF32BE; enum { kBufferSize = 4*1024 }; UTF32Unit u32Buffer[kBufferSize]; // 16K bytes size_t readCount, writeCount; utf32Str->erase(); utf32Str->reserve ( 4*utf8Len ); // As good a guess as any. while ( utf8Len > 0 ) { Converter ( utf8In, utf8Len, u32Buffer, kBufferSize, &readCount, &writeCount ); if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); utf32Str->append ( (const char *)u32Buffer, writeCount*4 ); utf8In += readCount; utf8Len -= readCount; } } // ToUTF32 // ================================================================================================= extern void ToUTF32Native ( const UTF8Unit * utf8In, size_t utf8Len, std::string * utf32Str ) { enum { kBufferSize = 4*1024 }; UTF32Unit u32Buffer[kBufferSize]; // 16K bytes size_t readCount, writeCount; utf32Str->erase(); utf32Str->reserve ( 4*utf8Len ); // As good a guess as any. while ( utf8Len > 0 ) { UTF8_to_UTF32Nat ( utf8In, utf8Len, u32Buffer, kBufferSize, &readCount, &writeCount ); if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); utf32Str->append ( (const char *)u32Buffer, writeCount*4 ); utf8In += readCount; utf8Len -= readCount; } } // ToUTF32Native // ================================================================================================= extern void FromUTF16 ( const UTF16Unit * utf16In, size_t utf16Len, std::string * utf8Str, bool bigEndian ) { UTF16_to_UTF8_Proc Converter = UTF16LE_to_UTF8; if ( bigEndian ) Converter = UTF16BE_to_UTF8; enum { kBufferSize = 16*1024 }; UTF8Unit u8Buffer[kBufferSize]; size_t readCount, writeCount; utf8Str->erase(); utf8Str->reserve ( 2*utf16Len ); // As good a guess as any. while ( utf16Len > 0 ) { Converter ( utf16In, utf16Len, u8Buffer, kBufferSize, &readCount, &writeCount ); if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); utf8Str->append ( (const char *)u8Buffer, writeCount ); utf16In += readCount; utf16Len -= readCount; } } // FromUTF16 // ================================================================================================= extern void FromUTF16Native ( const UTF16Unit * utf16In, size_t utf16Len, std::string * utf8Str ) { enum { kBufferSize = 16*1024 }; UTF8Unit u8Buffer[kBufferSize]; size_t readCount, writeCount; utf8Str->erase(); utf8Str->reserve ( 2*utf16Len ); // As good a guess as any. while ( utf16Len > 0 ) { UTF16Nat_to_UTF8 ( utf16In, utf16Len, u8Buffer, kBufferSize, &readCount, &writeCount ); if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); utf8Str->append ( (const char *)u8Buffer, writeCount ); utf16In += readCount; utf16Len -= readCount; } } // FromUTF16Native // ================================================================================================= extern void FromUTF32 ( const UTF32Unit * utf32In, size_t utf32Len, std::string * utf8Str, bool bigEndian ) { UTF32_to_UTF8_Proc Converter = UTF32LE_to_UTF8; if ( bigEndian ) Converter = UTF32BE_to_UTF8; enum { kBufferSize = 16*1024 }; UTF8Unit u8Buffer[kBufferSize]; size_t readCount, writeCount; utf8Str->erase(); utf8Str->reserve ( 2*utf32Len ); // As good a guess as any. while ( utf32Len > 0 ) { Converter ( utf32In, utf32Len, u8Buffer, kBufferSize, &readCount, &writeCount ); if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); utf8Str->append ( (const char *)u8Buffer, writeCount ); utf32In += readCount; utf32Len -= readCount; } } // FromUTF32 // ================================================================================================= extern void FromUTF32Native ( const UTF32Unit * utf32In, size_t utf32Len, std::string * utf8Str ) { enum { kBufferSize = 16*1024 }; UTF8Unit u8Buffer[kBufferSize]; size_t readCount, writeCount; utf8Str->erase(); utf8Str->reserve ( 2*utf32Len ); // As good a guess as any. while ( utf32Len > 0 ) { UTF32Nat_to_UTF8 ( utf32In, utf32Len, u8Buffer, kBufferSize, &readCount, &writeCount ); if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); utf8Str->append ( (const char *)u8Buffer, writeCount ); utf32In += readCount; utf32Len -= readCount; } } // FromUTF32Native // ================================================================================================= static void CodePoint_to_UTF8_Multi ( const UTF32Unit cpIn, UTF8Unit * utf8Out, const size_t utf8Len, size_t * utf8Written ) { size_t unitCount = 0; if ( cpIn > 0x10FFFF ) UC_Throw ( "Bad UTF-32 - out of range", kXMPErr_BadParam ); if ( (0xD800 <= cpIn) && (cpIn <= 0xDFFF) ) UC_Throw ( "Bad UTF-32 - surrogate code point", kXMPErr_BadParam ); // Compute the number of bytes using 6 data bits each. Then see if the highest order bits will // fit into the leading byte. Write the UTF-8 sequence if there is enough room. UTF32Unit temp, mask; size_t bytesNeeded = 0; for ( temp = cpIn; temp != 0; temp = temp >> 6 ) ++bytesNeeded; temp = cpIn >> ((bytesNeeded-1)*6); // The highest order data bits. mask = (0x80 >> bytesNeeded) - 1; // Available data bits in the leading byte. if ( temp > mask ) ++bytesNeeded; if ( bytesNeeded > utf8Len ) goto Done; // Not enough room for the output. unitCount = bytesNeeded; temp = cpIn; for ( --bytesNeeded; bytesNeeded > 0; --bytesNeeded ) { utf8Out[bytesNeeded] = 0x80 | UTF8Unit ( temp & 0x3F ); temp = temp >> 6; } mask = ~((1 << (8-unitCount)) - 1); utf8Out[0] = UTF8Unit ( mask | temp ); Done: *utf8Written = unitCount; return; } // CodePoint_to_UTF8_Multi // ================================================================================================= void CodePoint_to_UTF8 ( const UTF32Unit cpIn, UTF8Unit * utf8Out, const size_t utf8Len, size_t * utf8Written ) { size_t unitCount = 0; UC_Assert ( (utf8Out != 0) && (utf8Written != 0) ); if ( utf8Len == 0 ) goto Done; if ( cpIn > 0x7F ) goto MultiByte; // ! Force linear execution path for ASCII. if ( utf8Len == 0 ) goto Done; unitCount = 1; *utf8Out = UTF8Unit(cpIn); Done: *utf8Written = unitCount; return; MultiByte: CodePoint_to_UTF8_Multi( cpIn, utf8Out, utf8Len, utf8Written ); return; } // CodePoint_to_UTF8 // ================================================================================================= static void CodePoint_from_UTF8_Multi ( const UTF8Unit * utf8In, const size_t utf8Len, UTF32Unit * cpOut, size_t * utf8Read ) { UTF8Unit inUnit = *utf8In; size_t unitCount = 0; UTF32Unit cp; // ! Avoid gcc complaints about declarations after goto's. const UTF8Unit * utf8Pos; // ------------------------------------------------------------------------------------- // We've got a multibyte UTF-8 character. The first byte has the number of bytes and the // highest order data bits. The other bytes each add 6 more data bits. #if 0 // This might be a more effcient way to count the bytes. static XMP_Uns8 kByteCounts[16] = { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 3, 4 }; size_t bytesNeeded = kByteCounts [ inUnit >> 4 ]; if ( (bytesNeeded < 2) || ((bytesNeeded == 4) && ((inUnit & 0x08) != 0)) ) { UC_Throw ( "Invalid UTF-8 sequence length", kXMPErr_BadParam ); } #endif size_t bytesNeeded = 0; // Count the leading 1 bits in the first byte. for ( UTF8Unit temp = inUnit; temp > 0x7F; temp = temp << 1 ) ++bytesNeeded; // *** Consider CPU-specific assembly inline, e.g. cntlzw on PowerPC. if ( (bytesNeeded < 2) || (bytesNeeded > 4) ) UC_Throw ( "Invalid UTF-8 sequence length", kXMPErr_BadParam ); if ( bytesNeeded > utf8Len ) goto Done; // Not enough input in this buffer. unitCount = bytesNeeded; cp = inUnit & ((1 << (7-unitCount)) - 1); // Isolate the initial data bits in the bottom of cp. utf8Pos = utf8In + 1; // We've absorbed the first byte. for ( --bytesNeeded; bytesNeeded > 0; --bytesNeeded, ++utf8Pos ) { inUnit = *utf8Pos; if ( (inUnit & UTF8Unit(0xC0)) != UTF8Unit(0x80) ) UC_Throw ( "Invalid UTF-8 data byte", kXMPErr_BadParam ); cp = (cp << 6) | (inUnit & 0x3F); } if ( cp >= 0xD800 ) { // Skip the next comparisons most of the time. if ( (0xD800 <= cp) && (cp <= 0xDFFF) ) UC_Throw ( "Bad UTF-8 - surrogate code point", kXMPErr_BadParam ); if ( cp > 0x10FFFF ) UC_Throw ( "Bad UTF-8 - out of range", kXMPErr_BadParam ); } *cpOut = cp; // ! Don't put after Done, don't write if no input. Done: *utf8Read = unitCount; return; } // CodePoint_from_UTF8_Multi // ================================================================================================= void CodePoint_from_UTF8 ( const UTF8Unit * utf8In, const size_t utf8Len, UTF32Unit * cpOut, size_t * utf8Read ) { UTF8Unit inUnit; // ! Don't read until we know there is input. size_t unitCount = 0; UC_Assert ( (utf8In != 0) && (cpOut != 0) && (utf8Read != 0) ); if ( utf8Len == 0 ) goto Done; inUnit = *utf8In; if ( inUnit >= 0x80 ) goto MultiByte; // ! Force linear execution path for ASCII. unitCount = 1; *cpOut = inUnit; // ! Don't put after Done, don't write if no input. Done: *utf8Read = unitCount; return; MultiByte: CodePoint_from_UTF8_Multi ( utf8In, utf8Len, cpOut, utf8Read ); return; } // CodePoint_from_UTF8 // ================================================================================================= static void CodePoint_to_UTF16Nat_Surrogate ( const UTF32Unit cpIn, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf16Written ) { size_t unitCount = 0; UTF32Unit temp; // ! Avoid gcc complaints about declarations after goto's. if ( cpIn > 0x10FFFF ) UC_Throw ( "Bad UTF-32 - out of range", kXMPErr_BadParam ); if ( utf16Len < 2 ) goto Done; // Not enough room for the output. unitCount = 2; temp = cpIn - 0x10000; utf16Out[0] = 0xD800 | UTF16Unit ( temp >> 10 ); utf16Out[1] = 0xDC00 | UTF16Unit ( temp & 0x3FF ); Done: *utf16Written = unitCount; return; } // CodePoint_to_UTF16Nat_Surrogate // ================================================================================================= static void CodePoint_to_UTF16Nat ( const UTF32Unit cpIn, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf16Written ) { size_t unitCount = 0; UC_Assert ( (utf16Out != 0) && (utf16Written != 0) ); if ( utf16Len == 0 ) goto Done; if ( cpIn >= 0xD800 ) goto CheckSurrogate; // ! Force linear execution path for the BMP. InBMP: unitCount = 1; *utf16Out = UTF16Unit(cpIn); Done: *utf16Written = unitCount; return; CheckSurrogate: if ( cpIn > 0xFFFF ) goto SurrogatePair; if ( cpIn > 0xDFFF ) goto InBMP; UC_Throw ( "Bad UTF-32 - surrogate code point", kXMPErr_BadParam ); SurrogatePair: CodePoint_to_UTF16Nat_Surrogate ( cpIn, utf16Out, utf16Len, utf16Written ); return; } // CodePoint_to_UTF16Nat // ================================================================================================= static void CodePoint_from_UTF16Nat_Surrogate ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * cpOut, size_t * utf16Read ) { UTF16Unit hiUnit = *utf16In; size_t unitCount = 0; UTF16Unit loUnit; // ! Avoid gcc complaints about declarations after goto's. UTF32Unit cp; // ---------------------------------- // We've got a UTF-16 surrogate pair. if ( hiUnit > 0xDBFF ) UC_Throw ( "Bad UTF-16 - leading low surrogate", kXMPErr_BadParam ); if ( utf16Len < 2 ) goto Done; // Not enough input in this buffer. loUnit = *(utf16In+1); if ( (loUnit < 0xDC00) || (0xDFFF < loUnit) ) UC_Throw ( "Bad UTF-16 - missing low surrogate", kXMPErr_BadParam ); unitCount = 2; cp = (((hiUnit & 0x3FF) << 10) | (loUnit & 0x3FF)) + 0x10000; *cpOut = cp; // ! Don't put after Done, don't write if no input. Done: *utf16Read = unitCount; return; } // CodePoint_from_UTF16Nat_Surrogate // ================================================================================================= static void CodePoint_from_UTF16Nat ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * cpOut, size_t * utf16Read ) { UTF16Unit inUnit; // ! Don't read until we know there is input. size_t unitCount = 0; UC_Assert ( (utf16In != 0) && (cpOut != 0) && (utf16Read != 0) ); if ( utf16Len == 0 ) goto Done; inUnit = *utf16In; if ( (0xD800 <= inUnit) && (inUnit <= 0xDFFF) ) goto SurrogatePair; // ! Force linear execution path for the BMP. unitCount = 1; *cpOut = inUnit; // ! Don't put after Done, don't write if no input. Done: *utf16Read = unitCount; return; SurrogatePair: CodePoint_from_UTF16Nat_Surrogate ( utf16In, utf16Len, cpOut, utf16Read ); return; } // CodePoint_from_UTF16Nat // ================================================================================================= static void UTF8_to_UTF16Nat ( const UTF8Unit * utf8In, const size_t utf8Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf8Read, size_t * utf16Written ) { const UTF8Unit * utf8Pos = utf8In; UTF16Unit * utf16Pos = utf16Out; size_t utf8Left = utf8Len; size_t utf16Left = utf16Len; UC_Assert ( (utf8In != 0) && (utf16Out != 0) && (utf8Read != 0) && (utf16Written != 0) ); while ( (utf8Left > 0) && (utf16Left > 0) ) { // Do a run of ASCII, it copies 1 input unit into 1 output unit. size_t i, limit = utf8Left; if ( limit > utf16Left ) limit = utf16Left; for ( i = 0; i < limit; ++i ) { UTF8Unit inUnit = *utf8Pos; if ( inUnit > 0x7F ) break; *utf16Pos = inUnit; ++utf8Pos; ++utf16Pos; } utf8Left -= i; utf16Left -= i; // Do a run of non-ASCII, it copies multiple input units into 1 or 2 output units. while ( (utf8Left > 0) && (utf16Left > 0) ) { UTF32Unit cp; size_t len8, len16; UTF8Unit inUnit = *utf8Pos; if ( inUnit <= 0x7F ) break; CodePoint_from_UTF8_Multi ( utf8Pos, utf8Left, &cp, &len8 ); if ( len8 == 0 ) goto Done; // The input buffer ends in the middle of a character. if ( cp <= 0xFFFF ) { *utf16Pos = UTF16Unit(cp); len16 = 1; } else { CodePoint_to_UTF16Nat_Surrogate ( cp, utf16Pos, utf16Left, &len16 ); if ( len16 == 0 ) goto Done; // Not enough room in the output buffer. } utf8Left -= len8; utf8Pos += len8; utf16Left -= len16; utf16Pos += len16; } } Done: // Set the output lengths. *utf8Read = utf8Len - utf8Left; *utf16Written = utf16Len - utf16Left; } // UTF8_to_UTF16Nat // ================================================================================================= static void UTF8_to_UTF32Nat ( const UTF8Unit * utf8In, const size_t utf8Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf8Read, size_t * utf32Written ) { const UTF8Unit * utf8Pos = utf8In; UTF32Unit * utf32Pos = utf32Out; size_t utf8Left = utf8Len; size_t utf32Left = utf32Len; UC_Assert ( (utf8In != 0) && (utf32Out != 0) && (utf8Read != 0) && (utf32Written != 0) ); while ( (utf8Left > 0) && (utf32Left > 0) ) { // Do a run of ASCII, it copies 1 input unit into 1 output unit. size_t i, limit = utf8Left; if ( limit > utf32Left ) limit = utf32Left; for ( i = 0; i < limit; ++i ) { UTF8Unit inUnit = *utf8Pos; if ( inUnit > 0x7F ) break; *utf32Pos = inUnit; ++utf8Pos; ++utf32Pos; } utf8Left -= i; utf32Left -= i; // Do a run of non-ASCII, it copies variable input into 1 output unit. while ( (utf8Left > 0) && (utf32Left > 0) ) { size_t len; UTF8Unit inUnit = *utf8Pos; if ( inUnit <= 0x7F ) break; CodePoint_from_UTF8_Multi ( utf8Pos, utf8Left, utf32Pos, &len ); if ( len == 0 ) goto Done; // The input buffer ends in the middle of a character. utf8Left -= len; utf8Pos += len; utf32Left -= 1; utf32Pos += 1; } } Done: // Set the output lengths. *utf8Read = utf8Len - utf8Left; *utf32Written = utf32Len - utf32Left; } // UTF8_to_UTF32Nat // ================================================================================================= static void UTF16Nat_to_UTF8 ( const UTF16Unit * utf16In, const size_t utf16Len, UTF8Unit * utf8Out, const size_t utf8Len, size_t * utf16Read, size_t * utf8Written ) { const UTF16Unit * utf16Pos = utf16In; UTF8Unit * utf8Pos = utf8Out; size_t utf16Left = utf16Len; size_t utf8Left = utf8Len; UC_Assert ( (utf16In != 0) && (utf8Out != 0) && (utf16Read != 0) && (utf8Written != 0) ); while ( (utf16Left > 0) && (utf8Left > 0) ) { // Do a run of ASCII, it copies 1 input unit into 1 output unit. size_t i, limit = utf16Left; if ( limit > utf8Left ) limit = utf8Left; for ( i = 0; i < limit; ++i ) { UTF16Unit inUnit = *utf16Pos; if ( inUnit > 0x7F ) break; *utf8Pos = UTF8Unit(inUnit); ++utf16Pos; ++utf8Pos; } utf16Left -= i; utf8Left -= i; // Do a run of non-ASCII inside the BMP, it copies 1 input unit into multiple output units. while ( (utf16Left > 0) && (utf8Left > 0) ) { size_t len8; UTF16Unit inUnit = *utf16Pos; if ( inUnit <= 0x7F ) break; if ( (0xD800 <= inUnit) && (inUnit <= 0xDFFF) ) break; CodePoint_to_UTF8_Multi ( inUnit, utf8Pos, utf8Left, &len8 ); if ( len8 == 0 ) goto Done; // Not enough room in the output buffer. utf16Left -= 1; utf16Pos += 1; utf8Left -= len8; utf8Pos += len8; } // Do a run of surrogate pairs, it copies 2 input units into multiple output units. while ( (utf16Left > 0) && (utf8Left > 0) ) { UTF32Unit cp; size_t len16, len8; UTF16Unit inUnit = *utf16Pos; if ( (inUnit < 0xD800) || (0xDFFF < inUnit) ) break; CodePoint_from_UTF16Nat_Surrogate ( utf16Pos, utf16Left, &cp, &len16 ); if ( len16 == 0 ) goto Done; // The input buffer ends in the middle of a surrogate pair. UC_Assert ( len16 == 2 ); CodePoint_to_UTF8_Multi ( cp, utf8Pos, utf8Left, &len8 ); if ( len8 == 0 ) goto Done; // Not enough room in the output buffer. utf16Left -= len16; utf16Pos += len16; utf8Left -= len8; utf8Pos += len8; } } Done: // Set the output lengths. *utf16Read = utf16Len - utf16Left; *utf8Written = utf8Len - utf8Left; } // UTF16Nat_to_UTF8 // ================================================================================================= static void UTF32Nat_to_UTF8 ( const UTF32Unit * utf32In, const size_t utf32Len, UTF8Unit * utf8Out, const size_t utf8Len, size_t * utf32Read, size_t * utf8Written ) { const UTF32Unit * utf32Pos = utf32In; UTF8Unit * utf8Pos = utf8Out; size_t utf32Left = utf32Len; size_t utf8Left = utf8Len; UC_Assert ( (utf32In != 0) && (utf8Out != 0) && (utf32Read != 0) && (utf8Written != 0) ); while ( (utf32Left > 0) && (utf8Left > 0) ) { // Do a run of ASCII, it copies 1 input unit into 1 output unit. size_t i, limit = utf32Left; if ( limit > utf8Left ) limit = utf8Left; for ( i = 0; i < limit; ++i ) { UTF32Unit inUnit = *utf32Pos; if ( inUnit > 0x7F ) break; *utf8Pos = UTF8Unit(inUnit); ++utf32Pos; ++utf8Pos; } utf32Left -= i; utf8Left -= i; // Do a run of non-ASCII, it copies 1 input unit into multiple output units. while ( (utf32Left > 0) && (utf8Left > 0) ) { size_t len; UTF32Unit inUnit = *utf32Pos; if ( inUnit <= 0x7F ) break; CodePoint_to_UTF8_Multi ( inUnit, utf8Pos, utf8Left, &len ); if ( len == 0 ) goto Done; // Not enough room in the output buffer. utf32Left -= 1; utf32Pos += 1; utf8Left -= len; utf8Pos += len; } } Done: // Set the output lengths. *utf32Read = utf32Len - utf32Left; *utf8Written = utf8Len - utf8Left; } // UTF32Nat_to_UTF8 // ================================================================================================= static void UTF16Nat_to_UTF32Nat ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf16Read, size_t * utf32Written ) { const UTF16Unit * utf16Pos = utf16In; UTF32Unit * utf32Pos = utf32Out; size_t utf16Left = utf16Len; size_t utf32Left = utf32Len; UC_Assert ( (utf16In != 0) && (utf32Out != 0) && (utf16Read != 0) && (utf32Written != 0) ); while ( (utf16Left > 0) && (utf32Left > 0) ) { // Do a run of BMP, it copies 1 input unit into 1 output unit. size_t i, limit = utf16Left; if ( limit > utf32Left ) limit = utf32Left; for ( i = 0; i < limit; ++i ) { UTF16Unit inUnit = *utf16Pos; if ( (0xD800 <= inUnit) && (inUnit <= 0xDFFF) ) break; *utf32Pos = inUnit; ++utf16Pos; ++utf32Pos; } utf16Left -= i; utf32Left -= i; // Do a run of surrogate pairs, it copies 2 input units into 1 output unit. while ( (utf16Left > 0) && (utf32Left > 0) ) { size_t len; UTF16Unit inUnit = *utf16Pos; if ( (inUnit < 0xD800) || (0xDFFF < inUnit) ) break; CodePoint_from_UTF16Nat_Surrogate ( utf16Pos, utf16Left, utf32Pos, &len ); if ( len == 0 ) goto Done; // The input buffer ends in the middle of a surrogate pair. UC_Assert ( len == 2 ); utf16Left -= len; utf16Pos += len; utf32Left -= 1; utf32Pos += 1; } } Done: // Set the output lengths. *utf16Read = utf16Len - utf16Left; *utf32Written = utf32Len - utf32Left; } // UTF16Nat_to_UTF32Nat // ================================================================================================= static void UTF32Nat_to_UTF16Nat ( const UTF32Unit * utf32In, const size_t utf32Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf32Read, size_t * utf16Written ) { const UTF32Unit * utf32Pos = utf32In; UTF16Unit * utf16Pos = utf16Out; size_t utf32Left = utf32Len; size_t utf16Left = utf16Len; UC_Assert ( (utf32In != 0) && (utf16Out != 0) && (utf32Read != 0) && (utf16Written != 0) ); while ( (utf32Left > 0) && (utf16Left > 0) ) { // Do a run of BMP, it copies 1 input unit into 1 output unit. size_t i, limit = utf32Left; if ( limit > utf16Left ) limit = utf16Left; for ( i = 0; i < limit; ++i ) { UTF32Unit inUnit = *utf32Pos; if ( inUnit > 0xFFFF ) break; *utf16Pos = UTF16Unit(inUnit); ++utf32Pos; ++utf16Pos; } utf32Left -= i; utf16Left -= i; // Do a run of non-BMP, it copies 1 input unit into 2 output units. while ( (utf32Left > 0) && (utf16Left > 0) ) { size_t len; UTF32Unit inUnit = *utf32Pos; if ( inUnit <= 0xFFFF ) break; CodePoint_to_UTF16Nat_Surrogate ( inUnit, utf16Pos, utf16Left, &len ); if ( len == 0 ) goto Done; // Not enough room in the output buffer. UC_Assert ( len == 2 ); utf32Left -= 1; utf32Pos += 1; utf16Left -= 2; utf16Pos += 2; } } Done: // Set the output lengths. *utf32Read = utf32Len - utf32Left; *utf16Written = utf16Len - utf16Left; } // UTF32Nat_to_UTF16Nat // ================================================================================================= static void CodePoint_to_UTF16Swp_Surrogate ( const UTF32Unit cpIn, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf16Written ) { size_t unitCount = 0; UTF32Unit temp; // ! Avoid gcc complaints about declarations after goto's. if ( cpIn > 0x10FFFF ) UC_Throw ( "Bad UTF-32 - out of range", kXMPErr_BadParam ); if ( utf16Len < 2 ) goto Done; // Not enough room for the output. unitCount = 2; temp = cpIn - 0x10000; UTF16OutSwap ( &utf16Out[0], (0xD800 | UTF16Unit ( temp >> 10 )) ); UTF16OutSwap ( &utf16Out[1], (0xDC00 | UTF16Unit ( temp & 0x3FF)) ); Done: *utf16Written = unitCount; return; } // CodePoint_to_UTF16Swp_Surrogate // ================================================================================================= static void CodePoint_to_UTF16Swp ( const UTF32Unit cpIn, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf16Written ) { size_t unitCount = 0; UC_Assert ( (utf16Out != 0) && (utf16Written != 0) ); if ( utf16Len == 0 ) goto Done; if ( cpIn >= 0xD800 ) goto CheckSurrogate; // ! Force linear execution path for the BMP. InBMP: unitCount = 1; UTF16OutSwap ( utf16Out, UTF16Unit(cpIn) ); Done: *utf16Written = unitCount; return; CheckSurrogate: if ( cpIn > 0xFFFF ) goto SurrogatePair; if ( cpIn > 0xDFFF ) goto InBMP; UC_Throw ( "Bad UTF-32 - surrogate code point", kXMPErr_BadParam ); SurrogatePair: CodePoint_to_UTF16Swp_Surrogate ( cpIn, utf16Out, utf16Len, utf16Written ); return; } // CodePoint_to_UTF16Swp // ================================================================================================= static void CodePoint_from_UTF16Swp_Surrogate ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * cpOut, size_t * utf16Read ) { UTF16Unit hiUnit = UTF16InSwap(utf16In); size_t unitCount = 0; UTF16Unit loUnit; // ! Avoid gcc complaints about declarations after goto's. UTF32Unit cp; // ---------------------------------- // We've got a UTF-16 surrogate pair. if ( hiUnit > 0xDBFF ) UC_Throw ( "Bad UTF-16 - leading low surrogate", kXMPErr_BadParam ); if ( utf16Len < 2 ) goto Done; // Not enough input in this buffer. loUnit = UTF16InSwap(utf16In+1); if ( (loUnit < 0xDC00) || (0xDFFF < loUnit) ) UC_Throw ( "Bad UTF-16 - missing low surrogate", kXMPErr_BadParam ); unitCount = 2; cp = (((hiUnit & 0x3FF) << 10) | (loUnit & 0x3FF)) + 0x10000; *cpOut = cp; // ! Don't put after Done, don't write if no input. Done: *utf16Read = unitCount; return; } // CodePoint_from_UTF16Swp_Surrogate // ================================================================================================= static void CodePoint_from_UTF16Swp ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * cpOut, size_t * utf16Read ) { UTF16Unit inUnit; // ! Don't read until we know there is input. size_t unitCount = 0; UC_Assert ( (utf16In != 0) && (cpOut != 0) && (utf16Read != 0) ); if ( utf16Len == 0 ) goto Done; inUnit = UTF16InSwap(utf16In); if ( (0xD800 <= inUnit) && (inUnit <= 0xDFFF) ) goto SurrogatePair; // ! Force linear execution path for the BMP. unitCount = 1; *cpOut = inUnit; // ! Don't put after Done, don't write if no input. Done: *utf16Read = unitCount; return; SurrogatePair: CodePoint_from_UTF16Swp_Surrogate ( utf16In, utf16Len, cpOut, utf16Read ); return; } // CodePoint_from_UTF16Swp // ================================================================================================= static void UTF8_to_UTF16Swp ( const UTF8Unit * utf8In, const size_t utf8Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf8Read, size_t * utf16Written ) { const UTF8Unit * utf8Pos = utf8In; UTF16Unit * utf16Pos = utf16Out; size_t utf8Left = utf8Len; size_t utf16Left = utf16Len; UC_Assert ( (utf8In != 0) && (utf16Out != 0) && (utf8Read != 0) && (utf16Written != 0) ); while ( (utf8Left > 0) && (utf16Left > 0) ) { // Do a run of ASCII, it copies 1 input unit into 1 output unit. size_t i, limit = utf8Left; if ( limit > utf16Left ) limit = utf16Left; for ( i = 0; i < limit; ++i ) { UTF8Unit inUnit = *utf8Pos; if ( inUnit > 0x7F ) break; *utf16Pos = UTF16Unit(inUnit) << 8; // Better than: UTF16OutSwap ( utf16Pos, inUnit ); ++utf8Pos; ++utf16Pos; } utf8Left -= i; utf16Left -= i; // Do a run of non-ASCII, it copies multiple input units into 1 or 2 output units. while ( (utf8Left > 0) && (utf16Left > 0) ) { UTF32Unit cp; size_t len8, len16; UTF8Unit inUnit = *utf8Pos; if ( inUnit <= 0x7F ) break; CodePoint_from_UTF8_Multi ( utf8Pos, utf8Left, &cp, &len8 ); if ( len8 == 0 ) goto Done; // The input buffer ends in the middle of a character. if ( cp <= 0xFFFF ) { UTF16OutSwap ( utf16Pos, UTF16Unit(cp) ); len16 = 1; } else { CodePoint_to_UTF16Swp_Surrogate ( cp, utf16Pos, utf16Left, &len16 ); if ( len16 == 0 ) goto Done; // Not enough room in the output buffer. } utf8Left -= len8; utf8Pos += len8; utf16Left -= len16; utf16Pos += len16; } } Done: // Set the output lengths. *utf8Read = utf8Len - utf8Left; *utf16Written = utf16Len - utf16Left; } // UTF8_to_UTF16Swp // ================================================================================================= static void UTF8_to_UTF32Swp ( const UTF8Unit * utf8In, const size_t utf8Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf8Read, size_t * utf32Written ) { const UTF8Unit * utf8Pos = utf8In; UTF32Unit * utf32Pos = utf32Out; size_t utf8Left = utf8Len; size_t utf32Left = utf32Len; UC_Assert ( (utf8In != 0) && (utf32Out != 0) && (utf8Read != 0) && (utf32Written != 0) ); while ( (utf8Left > 0) && (utf32Left > 0) ) { // Do a run of ASCII, it copies 1 input unit into 1 output unit. size_t i, limit = utf8Left; if ( limit > utf32Left ) limit = utf32Left; for ( i = 0; i < limit; ++i ) { UTF8Unit inUnit = *utf8Pos; if ( inUnit > 0x7F ) break; *utf32Pos = UTF32Unit(inUnit) << 24; // Better than: UTF32OutSwap ( utf32Pos, inUnit ); ++utf8Pos; ++utf32Pos; } utf8Left -= i; utf32Left -= i; // Do a run of non-ASCII, it copies variable input into 1 output unit. while ( (utf8Left > 0) && (utf32Left > 0) ) { size_t len; UTF32Unit cp; UTF8Unit inUnit = *utf8Pos; if ( inUnit <= 0x7F ) break; CodePoint_from_UTF8_Multi ( utf8Pos, utf8Left, &cp, &len ); if ( len == 0 ) goto Done; // The input buffer ends in the middle of a character. UTF32OutSwap ( utf32Pos, cp ); utf8Left -= len; utf8Pos += len; utf32Left -= 1; utf32Pos += 1; } } Done: // Set the output lengths. *utf8Read = utf8Len - utf8Left; *utf32Written = utf32Len - utf32Left; } // UTF8_to_UTF32Swp // ================================================================================================= static void UTF16Swp_to_UTF8 ( const UTF16Unit * utf16In, const size_t utf16Len, UTF8Unit * utf8Out, const size_t utf8Len, size_t * utf16Read, size_t * utf8Written ) { const UTF16Unit * utf16Pos = utf16In; UTF8Unit * utf8Pos = utf8Out; size_t utf16Left = utf16Len; size_t utf8Left = utf8Len; UC_Assert ( (utf16In != 0) && (utf8Out != 0) && (utf16Read != 0) && (utf8Written != 0) ); while ( (utf16Left > 0) && (utf8Left > 0) ) { // Do a run of ASCII, it copies 1 input unit into 1 output unit. size_t i, limit = utf16Left; if ( limit > utf8Left ) limit = utf8Left; for ( i = 0; i < limit; ++i ) { UTF16Unit inUnit = UTF16InSwap(utf16Pos); if ( inUnit > 0x7F ) break; *utf8Pos = UTF8Unit(inUnit); ++utf16Pos; ++utf8Pos; } utf16Left -= i; utf8Left -= i; // Do a run of non-ASCII inside the BMP, it copies 1 input unit into multiple output units. while ( (utf16Left > 0) && (utf8Left > 0) ) { size_t len8; UTF16Unit inUnit = UTF16InSwap(utf16Pos); if ( inUnit <= 0x7F ) break; if ( (0xD800 <= inUnit) && (inUnit <= 0xDFFF) ) break; CodePoint_to_UTF8_Multi ( inUnit, utf8Pos, utf8Left, &len8 ); if ( len8 == 0 ) goto Done; // Not enough room in the output buffer. utf16Left -= 1; utf16Pos += 1; utf8Left -= len8; utf8Pos += len8; } // Do a run of surrogate pairs, it copies 2 input units into multiple output units. while ( (utf16Left > 0) && (utf8Left > 0) ) { UTF32Unit cp; size_t len16, len8; UTF16Unit inUnit = UTF16InSwap(utf16Pos); if ( (inUnit < 0xD800) || (0xDFFF < inUnit) ) break; CodePoint_from_UTF16Swp_Surrogate ( utf16Pos, utf16Left, &cp, &len16 ); if ( len16 == 0 ) goto Done; // The input buffer ends in the middle of a surrogate pair. UC_Assert ( len16 == 2 ); CodePoint_to_UTF8_Multi ( cp, utf8Pos, utf8Left, &len8 ); if ( len8 == 0 ) goto Done; // Not enough room in the output buffer. utf16Left -= len16; utf16Pos += len16; utf8Left -= len8; utf8Pos += len8; } } Done: // Set the output lengths. *utf16Read = utf16Len - utf16Left; *utf8Written = utf8Len - utf8Left; } // UTF16Swp_to_UTF8 // ================================================================================================= static void UTF32Swp_to_UTF8 ( const UTF32Unit * utf32In, const size_t utf32Len, UTF8Unit * utf8Out, const size_t utf8Len, size_t * utf32Read, size_t * utf8Written ) { const UTF32Unit * utf32Pos = utf32In; UTF8Unit * utf8Pos = utf8Out; size_t utf32Left = utf32Len; size_t utf8Left = utf8Len; UC_Assert ( (utf32In != 0) && (utf8Out != 0) && (utf32Read != 0) && (utf8Written != 0) ); while ( (utf32Left > 0) && (utf8Left > 0) ) { // Do a run of ASCII, it copies 1 input unit into 1 output unit. size_t i, limit = utf32Left; if ( limit > utf8Left ) limit = utf8Left; for ( i = 0; i < limit; ++i ) { UTF32Unit cp = UTF32InSwap(utf32Pos); if ( cp > 0x7F ) break; *utf8Pos = UTF8Unit(cp); ++utf32Pos; ++utf8Pos; } utf32Left -= i; utf8Left -= i; // Do a run of non-ASCII, it copies 1 input unit into multiple output units. while ( (utf32Left > 0) && (utf8Left > 0) ) { size_t len; UTF32Unit cp = UTF32InSwap(utf32Pos); if ( cp <= 0x7F ) break; CodePoint_to_UTF8_Multi ( cp, utf8Pos, utf8Left, &len ); if ( len == 0 ) goto Done; // Not enough room in the output buffer. utf32Left -= 1; utf32Pos += 1; utf8Left -= len; utf8Pos += len; } } Done: // Set the output lengths. *utf32Read = utf32Len - utf32Left; *utf8Written = utf8Len - utf8Left; } // UTF32Swp_to_UTF8 // ================================================================================================= static void UTF16Swp_to_UTF32Swp ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf16Read, size_t * utf32Written ) { const UTF16Unit * utf16Pos = utf16In; UTF32Unit * utf32Pos = utf32Out; size_t utf16Left = utf16Len; size_t utf32Left = utf32Len; UC_Assert ( (utf16In != 0) && (utf32Out != 0) && (utf16Read != 0) && (utf32Written != 0) ); while ( (utf16Left > 0) && (utf32Left > 0) ) { // Do a run of BMP, it copies 1 input unit into 1 output unit. size_t i, limit = utf16Left; if ( limit > utf32Left ) limit = utf32Left; for ( i = 0; i < limit; ++i ) { UTF16Unit inUnit = UTF16InSwap(utf16Pos); if ( (0xD800 <= inUnit) && (inUnit <= 0xDFFF) ) break; *utf32Pos = UTF32Unit(*utf16Pos) << 16; // Better than: UTF32OutSwap ( utf32Pos, inUnit ); ++utf16Pos; ++utf32Pos; } utf16Left -= i; utf32Left -= i; // Do a run of surrogate pairs, it copies 2 input units into 1 output unit. while ( (utf16Left > 0) && (utf32Left > 0) ) { size_t len; UTF32Unit cp; UTF16Unit inUnit = UTF16InSwap(utf16Pos); if ( (inUnit < 0xD800) || (0xDFFF < inUnit) ) break; CodePoint_from_UTF16Swp_Surrogate ( utf16Pos, utf16Left, &cp, &len ); if ( len == 0 ) goto Done; // The input buffer ends in the middle of a surrogate pair. UTF32OutSwap ( utf32Pos, cp ); UC_Assert ( len == 2 ); utf16Left -= len; utf16Pos += len; utf32Left -= 1; utf32Pos += 1; } } Done: // Set the output lengths. *utf16Read = utf16Len - utf16Left; *utf32Written = utf32Len - utf32Left; } // UTF16Swp_to_UTF32Swp // ================================================================================================= static void UTF32Swp_to_UTF16Swp ( const UTF32Unit * utf32In, const size_t utf32Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf32Read, size_t * utf16Written ) { const UTF32Unit * utf32Pos = utf32In; UTF16Unit * utf16Pos = utf16Out; size_t utf32Left = utf32Len; size_t utf16Left = utf16Len; const size_t k32to16Offset = swap32to16Offset; // ! Make sure compiler treats as an invariant. UC_Assert ( (utf32In != 0) && (utf16Out != 0) && (utf32Read != 0) && (utf16Written != 0) ); while ( (utf32Left > 0) && (utf16Left > 0) ) { // Do a run of BMP, it copies 1 input unit into 1 output unit. size_t i, limit = utf32Left; if ( limit > utf16Left ) limit = utf16Left; for ( i = 0; i < limit; ++i ) { UTF32Unit inUnit = UTF32InSwap(utf32Pos); if ( inUnit > 0xFFFF ) break; *utf16Pos = *(((UTF16Unit*)utf32Pos) + k32to16Offset); // Better than: UTF16OutSwap ( utf16Pos, UTF16Unit(inUnit) ); ++utf32Pos; ++utf16Pos; } utf32Left -= i; utf16Left -= i; // Do a run of non-BMP, it copies 1 input unit into 2 output units. while ( (utf32Left > 0) && (utf16Left > 0) ) { size_t len; UTF32Unit inUnit = UTF32InSwap(utf32Pos); if ( inUnit <= 0xFFFF ) break; CodePoint_to_UTF16Swp_Surrogate ( inUnit, utf16Pos, utf16Left, &len ); if ( len == 0 ) goto Done; // Not enough room in the output buffer. UC_Assert ( len == 2 ); utf32Left -= 1; utf32Pos += 1; utf16Left -= 2; utf16Pos += 2; } } Done: // Set the output lengths. *utf32Read = utf32Len - utf32Left; *utf16Written = utf16Len - utf16Left; } // UTF32Swp_to_UTF16Swp // ================================================================================================= static void UTF16Nat_to_UTF32Swp ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf16Read, size_t * utf32Written ) { const UTF16Unit * utf16Pos = utf16In; UTF32Unit * utf32Pos = utf32Out; size_t utf16Left = utf16Len; size_t utf32Left = utf32Len; UC_Assert ( (utf16In != 0) && (utf32Out != 0) && (utf16Read != 0) && (utf32Written != 0) ); while ( (utf16Left > 0) && (utf32Left > 0) ) { // Do a run of BMP, it copies 1 input unit into 1 output unit. size_t i, limit = utf16Left; if ( limit > utf32Left ) limit = utf32Left; for ( i = 0; i < limit; ++i ) { UTF16Unit inUnit = *utf16Pos; if ( (0xD800 <= inUnit) && (inUnit <= 0xDFFF) ) break; UTF32OutSwap ( utf32Pos, inUnit ); ++utf16Pos; ++utf32Pos; } utf16Left -= i; utf32Left -= i; // Do a run of surrogate pairs, it copies 2 input units into 1 output unit. while ( (utf16Left > 0) && (utf32Left > 0) ) { size_t len; UTF32Unit cp; UTF16Unit inUnit = *utf16Pos; if ( (inUnit < 0xD800) || (0xDFFF < inUnit) ) break; CodePoint_from_UTF16Nat_Surrogate ( utf16Pos, utf16Left, &cp, &len ); if ( len == 0 ) goto Done; // The input buffer ends in the middle of a surrogate pair. UC_Assert ( len == 2 ); UTF32OutSwap ( utf32Pos, cp ); utf16Left -= len; utf16Pos += len; utf32Left -= 1; utf32Pos += 1; } } Done: // Set the output lengths. *utf16Read = utf16Len - utf16Left; *utf32Written = utf32Len - utf32Left; } // UTF16Nat_to_UTF32Swp // ================================================================================================= static void UTF16Swp_to_UTF32Nat ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf16Read, size_t * utf32Written ) { const UTF16Unit * utf16Pos = utf16In; UTF32Unit * utf32Pos = utf32Out; size_t utf16Left = utf16Len; size_t utf32Left = utf32Len; UC_Assert ( (utf16In != 0) && (utf32Out != 0) && (utf16Read != 0) && (utf32Written != 0) ); while ( (utf16Left > 0) && (utf32Left > 0) ) { // Do a run of BMP, it copies 1 input unit into 1 output unit. size_t i, limit = utf16Left; if ( limit > utf32Left ) limit = utf32Left; for ( i = 0; i < limit; ++i ) { UTF16Unit inUnit = UTF16InSwap(utf16Pos); if ( (0xD800 <= inUnit) && (inUnit <= 0xDFFF) ) break; *utf32Pos = inUnit; ++utf16Pos; ++utf32Pos; } utf16Left -= i; utf32Left -= i; // Do a run of surrogate pairs, it copies 2 input units into 1 output unit. while ( (utf16Left > 0) && (utf32Left > 0) ) { size_t len; UTF16Unit inUnit = UTF16InSwap(utf16Pos); if ( (inUnit < 0xD800) || (0xDFFF < inUnit) ) break; CodePoint_from_UTF16Swp_Surrogate ( utf16Pos, utf16Left, utf32Pos, &len ); if ( len == 0 ) goto Done; // The input buffer ends in the middle of a surrogate pair. UC_Assert ( len == 2 ); utf16Left -= len; utf16Pos += len; utf32Left -= 1; utf32Pos += 1; } } Done: // Set the output lengths. *utf16Read = utf16Len - utf16Left; *utf32Written = utf32Len - utf32Left; } // UTF16Swp_to_UTF32Nat // ================================================================================================= static void UTF32Nat_to_UTF16Swp ( const UTF32Unit * utf32In, const size_t utf32Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf32Read, size_t * utf16Written ) { const UTF32Unit * utf32Pos = utf32In; UTF16Unit * utf16Pos = utf16Out; size_t utf32Left = utf32Len; size_t utf16Left = utf16Len; UC_Assert ( (utf32In != 0) && (utf16Out != 0) && (utf32Read != 0) && (utf16Written != 0) ); while ( (utf32Left > 0) && (utf16Left > 0) ) { // Do a run of BMP, it copies 1 input unit into 1 output unit. size_t i, limit = utf32Left; if ( limit > utf16Left ) limit = utf16Left; for ( i = 0; i < limit; ++i ) { UTF32Unit inUnit = *utf32Pos; if ( inUnit > 0xFFFF ) break; UTF16OutSwap ( utf16Pos, UTF16Unit(inUnit) ); ++utf32Pos; ++utf16Pos; } utf32Left -= i; utf16Left -= i; // Do a run of non-BMP, it copies 1 input unit into 2 output units. while ( (utf32Left > 0) && (utf16Left > 0) ) { size_t len; UTF32Unit inUnit = *utf32Pos; if ( inUnit <= 0xFFFF ) break; CodePoint_to_UTF16Swp_Surrogate ( inUnit, utf16Pos, utf16Left, &len ); if ( len == 0 ) goto Done; // Not enough room in the output buffer. UC_Assert ( len == 2 ); utf32Left -= 1; utf32Pos += 1; utf16Left -= 2; utf16Pos += 2; } } Done: // Set the output lengths. *utf32Read = utf32Len - utf32Left; *utf16Written = utf16Len - utf16Left; } // UTF32Nat_to_UTF16Swp // ================================================================================================= static void UTF32Swp_to_UTF16Nat ( const UTF32Unit * utf32In, const size_t utf32Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf32Read, size_t * utf16Written ) { const UTF32Unit * utf32Pos = utf32In; UTF16Unit * utf16Pos = utf16Out; size_t utf32Left = utf32Len; size_t utf16Left = utf16Len; UC_Assert ( (utf32In != 0) && (utf16Out != 0) && (utf32Read != 0) && (utf16Written != 0) ); while ( (utf32Left > 0) && (utf16Left > 0) ) { // Do a run of BMP, it copies 1 input unit into 1 output unit. size_t i, limit = utf32Left; if ( limit > utf16Left ) limit = utf16Left; for ( i = 0; i < limit; ++i ) { UTF32Unit inUnit = UTF32InSwap(utf32Pos); if ( inUnit > 0xFFFF ) break; *utf16Pos = UTF16Unit(inUnit); ++utf32Pos; ++utf16Pos; } utf32Left -= i; utf16Left -= i; // Do a run of non-BMP, it copies 1 input unit into 2 output units. while ( (utf32Left > 0) && (utf16Left > 0) ) { size_t len; UTF32Unit inUnit = UTF32InSwap(utf32Pos); if ( inUnit <= 0xFFFF ) break; CodePoint_to_UTF16Nat_Surrogate ( inUnit, utf16Pos, utf16Left, &len ); if ( len == 0 ) goto Done; // Not enough room in the output buffer. UC_Assert ( len == 2 ); utf32Left -= 1; utf32Pos += 1; utf16Left -= 2; utf16Pos += 2; } } Done: // Set the output lengths. *utf32Read = utf32Len - utf32Left; *utf16Written = utf16Len - utf16Left; } // UTF32Swp_to_UTF16Nat // ================================================================================================= exempi-2.2.1/source/common/Makefile.in0000664000175000017500000004751512150231002014561 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = source/common DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libxmpcommon_la_LIBADD = am_libxmpcommon_la_OBJECTS = UnicodeConversions.lo XML_Node.lo \ LargeFileAccess.lo XMP_LibUtils.lo libxmpcommon_la_OBJECTS = $(am_libxmpcommon_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libxmpcommon_la_SOURCES) DIST_SOURCES = $(libxmpcommon_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libxmpcommon.la INCLUDES = -I$(top_srcdir)/public/include \ -I$(top_srcdir)/public/include/client-glue AM_CXXFLAGS = -Wno-multichar -Wno-ctor-dtor-privacy \ -funsigned-char -fexceptions AM_CPPFLAGS = \ -D@EXEMPI_PLATFORM_DEF@=1 -DXMP_IMPL=1 -DXMP_ClientBuild=0 \ -D_FILE_OFFSET_BITS=64 -DHAVE_EXPAT_CONFIG_H=1 -DXML_STATIC=1 noinst_HEADERS = UnicodeConversions.hpp ExpatAdapter.hpp EndianUtils.hpp\ LargeFileAccess.hpp XMLParserAdapter.hpp libxmpcommon_la_SOURCES = UnicodeInlines.incl_cpp UnicodeConversions.cpp\ XML_Node.cpp LargeFileAccess.cpp \ XMP_LibUtils.hpp XMP_LibUtils.cpp \ $(NULL) all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign source/common/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign source/common/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libxmpcommon.la: $(libxmpcommon_la_OBJECTS) $(libxmpcommon_la_DEPENDENCIES) $(EXTRA_libxmpcommon_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(libxmpcommon_la_OBJECTS) $(libxmpcommon_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LargeFileAccess.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UnicodeConversions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XML_Node.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMP_LibUtils.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/source/common/UnicodeConversions.hpp0000664000175000017500000001300612150230673017045 00000000000000#ifndef __UnicodeConversions_h__ #define __UnicodeConversions_h__ // ================================================================================================= // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include // ================================================================================================= #if UnicodeTestBuild #error "Never used." //typedef unsigned char UTF8Unit; //typedef unsigned short UTF16Unit; //typedef unsigned long UTF32Unit; #else typedef XMP_Uns8 UTF8Unit; typedef XMP_Uns16 UTF16Unit; typedef XMP_Uns32 UTF32Unit; #endif // ------------------------------------------------------------------------------------------------- // ! The UTF16 and UTF32 counts are in storage units, not bytes! CodePoint values are always native. // *** MIght be better to return a status than throw an exception for errors? typedef void (*CodePoint_to_UTF16_Proc) ( const UTF32Unit cpIn, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf16Written ); typedef void (*CodePoint_from_UTF16_Proc) ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * cpOut, size_t * utf16Read ); typedef void (*UTF8_to_UTF16_Proc) ( const UTF8Unit * utf8In, const size_t utf8Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf8Read, size_t * utf16Written ); typedef void (*UTF8_to_UTF32_Proc) ( const UTF8Unit * utf8In, const size_t utf8Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf8Read, size_t * utf32Written ); typedef void (*UTF16_to_UTF8_Proc) ( const UTF16Unit * utf16In, const size_t utf16Len, UTF8Unit * utf8Out, const size_t utf8Len, size_t * utf16Read, size_t * utf8Written ); typedef void (*UTF32_to_UTF8_Proc) ( const UTF32Unit * utf32In, const size_t utf32Len, UTF8Unit * utf8Out, const size_t utf8Len, size_t * utf32Read, size_t * utf8Written ); typedef void (*UTF16_to_UTF32_Proc) ( const UTF16Unit * utf16In, const size_t utf16Len, UTF32Unit * utf32Out, const size_t utf32Len, size_t * utf16Read, size_t * utf32Written ); typedef void (*UTF32_to_UTF16_Proc) ( const UTF32Unit * utf32In, const size_t utf32Len, UTF16Unit * utf16Out, const size_t utf16Len, size_t * utf32Read, size_t * utf16Written ); // ------------------------------------------------------------------------------------------------- extern void CodePoint_to_UTF8 ( const UTF32Unit cpIn, UTF8Unit * utf8Out, const size_t utf8Len, size_t * utf8Written ); extern void CodePoint_from_UTF8 ( const UTF8Unit * utf8In, const size_t utf8Len, UTF32Unit * cpOut, size_t * utf8Read ); extern CodePoint_to_UTF16_Proc CodePoint_to_UTF16BE; extern CodePoint_to_UTF16_Proc CodePoint_to_UTF16LE; extern CodePoint_from_UTF16_Proc CodePoint_from_UTF16BE; extern CodePoint_from_UTF16_Proc CodePoint_from_UTF16LE; extern UTF8_to_UTF16_Proc UTF8_to_UTF16BE; extern UTF8_to_UTF16_Proc UTF8_to_UTF16LE; extern UTF8_to_UTF32_Proc UTF8_to_UTF32BE; extern UTF8_to_UTF32_Proc UTF8_to_UTF32LE; extern UTF16_to_UTF8_Proc UTF16BE_to_UTF8; extern UTF16_to_UTF8_Proc UTF16LE_to_UTF8; extern UTF32_to_UTF8_Proc UTF32BE_to_UTF8; extern UTF32_to_UTF8_Proc UTF32LE_to_UTF8; extern UTF8_to_UTF16_Proc UTF8_to_UTF16Native; extern UTF8_to_UTF32_Proc UTF8_to_UTF32Native; extern UTF16_to_UTF8_Proc UTF16Native_to_UTF8; extern UTF32_to_UTF8_Proc UTF32Native_to_UTF8; extern UTF16_to_UTF32_Proc UTF16BE_to_UTF32BE; extern UTF16_to_UTF32_Proc UTF16BE_to_UTF32LE; extern UTF16_to_UTF32_Proc UTF16LE_to_UTF32BE; extern UTF16_to_UTF32_Proc UTF16LE_to_UTF32LE; extern UTF32_to_UTF16_Proc UTF32BE_to_UTF16BE; extern UTF32_to_UTF16_Proc UTF32BE_to_UTF16LE; extern UTF32_to_UTF16_Proc UTF32LE_to_UTF16BE; extern UTF32_to_UTF16_Proc UTF32LE_to_UTF16LE; extern void SwapUTF16 ( const UTF16Unit * utf16In, UTF16Unit * utf16Out, const size_t utf16Len ); extern void SwapUTF32 ( const UTF32Unit * utf32In, UTF32Unit * utf32Out, const size_t utf32Len ); extern void ToUTF16 ( const UTF8Unit * utf8In, size_t utf8Len, std::string * utf16Str, bool bigEndian ); extern void ToUTF32 ( const UTF8Unit * utf8In, size_t utf8Len, std::string * utf32Str, bool bigEndian ); extern void FromUTF16 ( const UTF16Unit * utf16In, size_t utf16Len, std::string * utf8Str, bool bigEndian ); extern void FromUTF32 ( const UTF32Unit * utf32In, size_t utf32Len, std::string * utf8Str, bool bigEndian ); extern void ToUTF16Native ( const UTF8Unit * utf8In, size_t utf8Len, std::string * utf16Str ); extern void ToUTF32Native ( const UTF8Unit * utf8In, size_t utf8Len, std::string * utf32Str ); extern void FromUTF16Native ( const UTF16Unit * utf16In, size_t utf16Len, std::string * utf8Str ); extern void FromUTF32Native ( const UTF32Unit * utf32In, size_t utf32Len, std::string * utf8Str ); extern void InitializeUnicodeConversions(); // ================================================================================================= #endif // __UnicodeConversions_h__ exempi-2.2.1/source/common/XML_Node.cpp0000664000175000017500000003062612150230673014635 00000000000000// ================================================================================================= // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! Must be the first #include! #include "XMLParserAdapter.hpp" #include #include #include #include // ! Can't include XMP..._Impl.hpp - used by both Core and Files. #define XMP_LitNMatch(s,l,n) (std::strncmp((s),(l),(n)) == 0) #if XMP_WinBuild #define snprintf _snprintf #pragma warning ( disable : 4996 ) // snprintf is safe #endif // ================================================================================================= #if 0 // Pattern for iterating over the children or attributes: for ( size_t xxNum = 0, xxLim = _node_->_offspring_->size(); xxNum < xxLim; ++xxNum ) { const XML_NodePtr _curr_ = _node_->_offspring_[xxNum]; } #endif // ================================================================================================= // XML_Node::IsWhitespaceNode //=========================== bool XML_Node::IsWhitespaceNode() const { if ( this->kind != kCDataNode ) return false; for ( size_t i = 0; i < this->value.size(); ++i ) { unsigned char ch = this->value[i]; if ( IsWhitespaceChar ( ch ) ) continue; // *** Add checks for other whitespace characters. return false; // All the checks failed, this isn't whitespace. } return true; } // XML_Node::IsWhitespaceNode // ================================================================================================= // XML_Node::IsLeafContentNode //============================ bool XML_Node::IsLeafContentNode() const { if ( this->kind != kElemNode ) return false; if ( this->content.size() == 0 ) return true; if ( this->content.size() > 1 ) return false; if ( this->content[0]->kind != kCDataNode ) return false; return true; } // XML_Node::IsLeafContentNode // ================================================================================================= // XML_Node::IsEmptyLeafNode //========================== bool XML_Node::IsEmptyLeafNode() const { if ( (this->kind != kElemNode) || (this->content.size() != 0) ) return false; return true; } // XML_Node::IsEmptyLeafNode // ================================================================================================= // XML_Node::GetAttrValue //======================= XMP_StringPtr XML_Node::GetAttrValue ( XMP_StringPtr attrName ) const { for ( size_t i = 0, aLim = this->attrs.size(); i < aLim; ++i ) { XML_Node * attrPtr = this->attrs[i]; if ( ! attrPtr->ns.empty() ) continue; // This form of GetAttrValue is for attrs in no namespace. if ( attrPtr->name == attrName ) return attrPtr->value.c_str(); } return 0; // Not found. } // XML_Node::GetAttrValue // ================================================================================================= // XML_Node::SetAttrValue //======================= void XML_Node::SetAttrValue ( XMP_StringPtr attrName, XMP_StringPtr attrValue ) { for ( size_t i = 0, aLim = this->attrs.size(); i < aLim; ++i ) { XML_Node * attrPtr = this->attrs[i]; if ( ! attrPtr->ns.empty() ) continue; // This form of SetAttrValue is for attrs in no namespace. if ( attrPtr->name == attrName ) { attrPtr->value = attrValue; return; } } } // XML_Node::SetAttrValue // ================================================================================================= // XML_Node::GetLeafContentValue //============================== XMP_StringPtr XML_Node::GetLeafContentValue() const { if ( (! this->IsLeafContentNode()) || this->content.empty() ) return ""; return this->content[0]->value.c_str(); } // XML_Node::GetLeafContentValue // ================================================================================================= // XML_Node::SetLeafContentValue //============================== void XML_Node::SetLeafContentValue ( XMP_StringPtr newValue ) { XML_Node * valueNode; if ( ! this->content.empty() ) { valueNode = this->content[0]; } else { valueNode = new XML_Node ( this, "", kCDataNode ); this->content.push_back ( valueNode ); } valueNode->value = newValue; } // XML_Node::SetLeafContentValue // ================================================================================================= // XML_Node::CountNamedElements //============================= size_t XML_Node::CountNamedElements ( XMP_StringPtr nsURI, XMP_StringPtr localName ) const { size_t count = 0; for ( size_t i = 0, vLim = this->content.size(); i < vLim; ++i ) { const XML_Node & child = *this->content[i]; if ( child.ns != nsURI ) continue; if ( strcmp ( localName, child.name.c_str()+child.nsPrefixLen ) != 0 ) continue; ++count; } return count; } // XML_Node::CountNamedElements // ================================================================================================= // XML_Node::GetNamedElement //========================== XML_NodePtr XML_Node::GetNamedElement ( XMP_StringPtr nsURI, XMP_StringPtr localName, size_t which /* = 0 */ ) { for ( size_t i = 0, vLim = this->content.size(); i < vLim; ++i ) { XML_Node * childPtr = this->content[i]; if ( childPtr->ns != nsURI ) continue; if ( strcmp ( localName, childPtr->name.c_str()+childPtr->nsPrefixLen ) != 0 ) continue; if ( which == 0 ) return childPtr; --which; } return 0; /// Not found. } // XML_Node::GetNamedElement // ================================================================================================= // DumpNodeList // ============ static const char * kNodeKinds[] = { "root", "elem", "attr", "cdata", "pi" }; static void DumpNodeList ( std::string * buffer, const XML_NodeVector & list, int indent ) { for ( size_t i = 0, limit = list.size(); i < limit; ++i ) { const XML_Node * node = list[i]; for ( int t = indent; t > 0; --t ) *buffer += " "; if ( node->IsWhitespaceNode() ) { *buffer += "-- whitespace --\n"; continue; } *buffer += node->name; *buffer += " - "; *buffer += kNodeKinds[node->kind]; if ( ! node->value.empty() ) { *buffer += ", value=\""; *buffer += node->value; *buffer += "\""; } if ( ! node->ns.empty() ) { *buffer += ", ns=\""; *buffer += node->ns; *buffer += "\""; } if ( node->nsPrefixLen != 0 ) { *buffer += ", prefixLen="; char numBuf [20]; snprintf ( numBuf, sizeof(numBuf), "%d", (int)node->nsPrefixLen ); *buffer += numBuf; } *buffer += "\n"; if ( ! node->attrs.empty() ) { for ( int t = indent+1; t > 0; --t ) *buffer += " "; *buffer += "attrs:\n"; DumpNodeList ( buffer, node->attrs, indent+2 ); } if ( ! node->content.empty() ) { DumpNodeList ( buffer, node->content, indent+1 ); } } } // DumpNodeList // ================================================================================================= // XML_Node::Dump //=============== void XML_Node::Dump ( std::string * buffer ) { *buffer = "Dump of XML_Node tree\n"; *buffer += "Root info: name=\""; *buffer += this->name; *buffer += "\", value=\""; *buffer += this->value; *buffer += "\", ns=\""; *buffer += this->ns; *buffer += "\", kind="; *buffer += kNodeKinds[this->kind]; *buffer += "\n"; if ( ! this->attrs.empty() ) { *buffer += " attrs:\n"; DumpNodeList ( buffer, this->attrs, 2 ); } *buffer += "\n"; DumpNodeList ( buffer, this->content, 0 ); } // XML_Node::Dump // ================================================================================================= // SerializeOneNode // ================ static void SerializeOneNode ( std::string * buffer, const XML_Node & node ) { size_t i, limit; XMP_StringPtr namePtr = node.name.c_str(); if ( XMP_LitNMatch ( namePtr, "_dflt_:", 7 ) ) namePtr += 7; // Hack for default namespaces. switch ( node.kind ) { case kElemNode: *buffer += '<'; *buffer += namePtr; for ( i = 0, limit = node.attrs.size(); i < limit; ++i ) { SerializeOneNode ( buffer, *node.attrs[i] ); } if ( node.content.empty() ) { *buffer += "/>"; } else { *buffer += '>'; for ( i = 0, limit = node.content.size(); i < limit; ++i ) { SerializeOneNode ( buffer, *node.content[i] ); } *buffer += "'; } break; case kAttrNode: *buffer += ' '; *buffer += namePtr; *buffer += "=\""; *buffer += node.value; *buffer += '"'; break; case kCDataNode: *buffer += node.value; break; case kPINode: *buffer += node.value; // *** Note that we're dropping PIs during the Expat parse. break; } } // SerializeOneNode // ================================================================================================= // CollectNamespaceDecls // ===================== typedef std::map < std::string, std::string > NamespaceMap; static void CollectNamespaceDecls ( NamespaceMap * nsMap, const XML_Node & node ) { size_t i, limit; if ( ! node.ns.empty() ) { size_t nameMid = 0; while ( node.name[nameMid] != ':' ) ++nameMid; std::string prefix = node.name.substr ( 0, nameMid ); (*nsMap)[prefix] = node.ns; } if ( node.kind == kElemNode ) { for ( i = 0, limit = node.attrs.size(); i < limit; ++i ) { CollectNamespaceDecls ( nsMap, *node.attrs[i] ); } for ( i = 0, limit = node.content.size(); i < limit; ++i ) { const XML_Node & content = *node.content[i]; if ( content.kind == kElemNode ) CollectNamespaceDecls ( nsMap, content ); } } } // CollectNamespaceDecls // ================================================================================================= // XML_Node::Serialize //==================== void XML_Node::Serialize ( std::string * buffer ) { buffer->erase(); if ( this->kind != kRootNode ) { SerializeOneNode ( buffer, *this ); } else { // Do the outermost level here, in order to add the XML version and namespace declarations. *buffer += "\n"; for ( size_t outer = 0, oLimit = this->content.size(); outer < oLimit; ++outer ) { const XML_Node & node = *this->content[outer]; if ( node.kind != kElemNode ) { SerializeOneNode ( buffer, node ); } else { XMP_StringPtr namePtr = node.name.c_str(); if ( XMP_LitNMatch ( namePtr, "_dflt_:", 7 ) ) namePtr += 7; // Hack for default namespaces. *buffer += '<'; *buffer += namePtr; NamespaceMap nsMap; CollectNamespaceDecls ( &nsMap, node ); NamespaceMap::iterator nsDecl = nsMap.begin(); NamespaceMap::iterator nsEnd = nsMap.end(); for ( ; nsDecl != nsEnd; ++nsDecl ) { const std::string & prefix = nsDecl->first; *buffer += " xmlns"; if ( prefix != "_dflt_" ) { *buffer += ':'; *buffer += prefix; } *buffer += "=\""; *buffer += nsDecl->second; *buffer += '"'; } for ( size_t attr = 0, aLimit = node.attrs.size(); attr < aLimit; ++attr ) { SerializeOneNode ( buffer, *node.attrs[attr] ); } if ( node.content.empty() ) { *buffer += "/>"; } else { *buffer += '>'; for ( size_t child = 0, cLimit = node.content.size(); child < cLimit; ++child ) { SerializeOneNode ( buffer, *node.content[child] ); } *buffer += "'; } } } } } // XML_Node::Serialize // ================================================================================================= // XML_Node::RemoveAttrs //====================== void XML_Node::RemoveAttrs() { for ( size_t i = 0, vLim = this->attrs.size(); i < vLim; ++i ) delete this->attrs[i]; this->attrs.clear(); } // XML_Node::RemoveAttrs // ================================================================================================= // XML_Node::RemoveContent //======================== void XML_Node::RemoveContent() { for ( size_t i = 0, vLim = this->content.size(); i < vLim; ++i ) delete this->content[i]; this->content.clear(); } // XML_Node::RemoveContent // ================================================================================================= // XML_Node::ClearNode //==================== void XML_Node::ClearNode() { this->kind = 0; this->ns.erase(); this->name.erase(); this->value.erase(); this->RemoveAttrs(); this->RemoveContent(); } // XML_Node::ClearNode // ================================================================================================= exempi-2.2.1/source/common/XMP_LibUtils.hpp0000664000175000017500000004556412150230673015517 00000000000000#ifndef __XMP_LibUtils_hpp__ #define __XMP_LibUtils_hpp__ 1 // ================================================================================================= // Copyright 2009 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! Must be the first include. #include "XMP_Const.h" #include #include #if XMP_DebugBuild #include #endif #if XMP_WinBuild #ifndef snprintf #define snprintf _snprintf #endif #endif // ================================================================================================= // Basic types, constants // ====================== #define kTab ((char)0x09) #define kLF ((char)0x0A) #define kCR ((char)0x0D) typedef std::string XMP_VarString; #define EliminateGlobal(g) delete ( g ); g = 0 extern "C" bool Initialize_LibUtils(); extern "C" void Terminate_LibUtils(); static void * ignorePtr = 0; #define IgnoreParam(p) ignorePtr = (void*)&p // The builtin offsetof macro sometimes violates C++ data member rules. #define XMP_OffsetOf(struct,field) ( (char*)(&((struct*)0x100)->field) - (char*)0x100 ) // ================================================================================================= // Support for exceptions and asserts // ================================== #define AnnounceThrow(msg) /* Do nothing. */ #define AnnounceCatch(msg) /* Do nothing. */ #define XMP_Throw(msg,id) { AnnounceThrow ( msg ); throw XMP_Error ( id, msg ); } // ------------------------------------------------------------------------------------------------- #define _MakeStr(p) #p #define _NotifyMsg(n,c,f,l) #n " failed: " #c " in " f " at line " _MakeStr(l) #define _ExplicitMsg(msg,c,e) #e " " #msg ": " #c #define XMP_Validate(c,msg,e) \ if ( ! (c) ) { \ const char * validate_msg = _ExplicitMsg ( msg, c, e ); \ XMP_Throw ( validate_msg, e ); \ } #if ! XMP_DebugBuild #define XMP_Assert(c) ((void) 0) #else #define XMP_Assert(c) assert ( c ) #endif #define XMP_Enforce(c) \ if ( ! (c) ) { \ const char * assert_msg = _NotifyMsg ( XMP_Enforce, (c), __FILE__, __LINE__ ); \ XMP_Throw ( assert_msg , kXMPErr_EnforceFailure ); \ } // ================================================================================================= // Thread synchronization locks // ============================ // About XMP and thread synchronization // // A variety of choices are provided for thread synchronization. Exactly one method must be chosen // by defining the appropriate symbol to 1. // // * UseNoLock - This choice turns the turns the synchronization functions into no-ops. It must only // be used by single threaded clients, or clients providing their own control at a higher level. // // * UseGlobalLibraryLock - This choice uses a single per-library lock. The result is thread safe // but unfriendly behavior, no true concurrency. This should only be used as a debugging fallback. // // * UseBoostLock - This choice uses the Boost shared_mutex mechanism. It has the advantage of being // robust and being available on pretty much all platforms. It has the disadvantage of requiring the // developer to download, integrate, and build the Boost thread library. // // * UsePThreadLock - This choice uses the POSIX pthread rwlock mechanism. It has the advantage of // being robust and being available on any modern UNIX platform, including Mac OS X. // // * UseWinSlimLock - This choice uses the Windows slim reader/writer mechanism. It is robust but // only available on Vista and newer versions of Windows, it is not available on XP. // // * UseHomeGrownLock - This choice uses local code plus lower level synchronization primitives. It // has the advantage of being usable on all platforms, and having exposed and tunable policy. It // has the disadvantage of possibly being less robust than Boost or the O/S provided mechanisms. // The lower level synchronization primitives are pthread mutex and condition for UNIX (including // Mac OS X). For WIndows there is a choice of critical section and condition variable for Vista // and newer; or critical section, event and semaphore for XP and newer. #define UseHomeGrownLock 1 // ------------------------------------------------------------------------------------------------- // A basic exclusive access mutex and atomic increment/decrement operations. #if XMP_WinBuild #include #define HaveAtomicIncrDecr 1 typedef LONG XMP_AtomicCounter; #define XMP_AtomicIncrement(x) InterlockedIncrement ( &(x) ) #define XMP_AtomicDecrement(x) InterlockedDecrement ( &(x) ) typedef CRITICAL_SECTION XMP_BasicMutex; #define InitializeBasicMutex(mutex) { InitializeCriticalSection ( &mutex ); } #define TerminateBasicMutex(mutex) { DeleteCriticalSection ( &mutex ); } #define AcquireBasicMutex(mutex) { EnterCriticalSection ( &mutex ); } #define ReleaseBasicMutex(mutex) { LeaveCriticalSection ( &mutex ); } #elif XMP_MacBuild #include #include #define HaveAtomicIncrDecr 1 typedef int32_t XMP_AtomicCounter; #define XMP_AtomicIncrement(x) OSAtomicIncrement32 ( &(x) ) #define XMP_AtomicDecrement(x) OSAtomicDecrement32 ( &(x) ) typedef pthread_mutex_t XMP_BasicMutex; #define InitializeBasicMutex(mutex) { int err = pthread_mutex_init ( &mutex, 0 ); XMP_Enforce ( err == 0 ); } #define TerminateBasicMutex(mutex) { int err = pthread_mutex_destroy ( &mutex ); XMP_Enforce ( err == 0 ); } #define AcquireBasicMutex(mutex) { int err = pthread_mutex_lock ( &mutex ); XMP_Enforce ( err == 0 ); } #define ReleaseBasicMutex(mutex) { int err = pthread_mutex_unlock ( &mutex ); XMP_Enforce ( err == 0 ); } #elif XMP_UNIXBuild #include // Atomic increment/decrement intrinsics should be in gcc 4.1, but Solaris seems to lack them. #ifndef HaveAtomicIncrDecr #define HaveAtomicIncrDecr 1 #endif #if HaveAtomicIncrDecr typedef XMP_Uns32 XMP_AtomicCounter; #define XMP_AtomicIncrement(x) __sync_add_and_fetch ( &(x), 1 ) #define XMP_AtomicDecrement(x) __sync_sub_and_fetch ( &(x), 1 ) #endif typedef pthread_mutex_t XMP_BasicMutex; #define InitializeBasicMutex(mutex) { int err = pthread_mutex_init ( &mutex, 0 ); XMP_Enforce ( err == 0 ); } #define TerminateBasicMutex(mutex) { int err = pthread_mutex_destroy ( &mutex ); XMP_Enforce ( err == 0 ); } #define AcquireBasicMutex(mutex) { int err = pthread_mutex_lock ( &mutex ); XMP_Enforce ( err == 0 ); } #define ReleaseBasicMutex(mutex) { int err = pthread_mutex_unlock ( &mutex ); XMP_Enforce ( err == 0 ); } #endif class XMP_AutoMutex { public: XMP_AutoMutex ( XMP_BasicMutex * _mutex ) : mutex(_mutex) { AcquireBasicMutex ( *this->mutex ); } ~XMP_AutoMutex() { this->Release(); } void Release() { if ( this->mutex != 0 ) ReleaseBasicMutex ( *this->mutex ); this->mutex = 0; } private: XMP_BasicMutex * mutex; XMP_AutoMutex() {}; // ! Must not be used. }; // ------------------------------------------------------------------------------------------------- // Details for the various locking mechanisms. #if UseNoLock typedef void* XMP_BasicRWLock; // For single threaded clients that want maximum performance. #define XMP_BasicRWLock_Initialize(lck) /* Do nothing. */ #define XMP_BasicRWLock_Terminate(lck) /* Do nothing. */ #define XMP_BasicRWLock_AcquireForRead(lck) /* Do nothing. */ #define XMP_BasicRWLock_AcquireForWrite(lck) /* Do nothing. */ #define XMP_BasicRWLock_ReleaseFromRead(lck) /* Do nothing. */ #define XMP_BasicRWLock_ReleaseFromWrite(lck) /* Do nothing. */ #elif UseGlobalLibraryLock extern XMP_BasicMutex sLibraryLock; typedef void* XMP_BasicRWLock; // Use the old thread-unfriendly per-DLL mutex. #define XMP_BasicRWLock_Initialize(lck) /* Do nothing. */ #define XMP_BasicRWLock_Terminate(lck) /* Do nothing. */ #define XMP_BasicRWLock_AcquireForRead(lck) /* Do nothing. */ #define XMP_BasicRWLock_AcquireForWrite(lck) /* Do nothing. */ #define XMP_BasicRWLock_ReleaseFromRead(lck) /* Do nothing. */ #define XMP_BasicRWLock_ReleaseFromWrite(lck) /* Do nothing. */ #elif UseBoostLock #include typedef boost::shared_mutex XMP_BasicRWLock; #define XMP_BasicRWLock_Initialize(lck) /* Do nothing. */ #define XMP_BasicRWLock_Terminate(lck) /* Do nothing. */ #define XMP_BasicRWLock_AcquireForRead(lck) lck.lock_shared() #define XMP_BasicRWLock_AcquireForWrite(lck) lck.lock() #define XMP_BasicRWLock_ReleaseFromRead(lck) lck.unlock_shared() #define XMP_BasicRWLock_ReleaseFromWrite(lck) lck.unlock() #elif UsePThreadLock #include typedef pthread_rwlock_t XMP_BasicRWLock; #define XMP_BasicRWLock_Initialize(lck) \ { int err = pthread_rwlock_init ( &lck, 0 ); \ if ( err != 0 ) XMP_Throw ( "Initialize pthread rwlock failed", kXMPErr_ExternalFailure ); } #define XMP_BasicRWLock_Terminate(lck) \ { int err = pthread_rwlock_destroy ( &lck ); XMP_Assert ( err == 0 ); } #define XMP_BasicRWLock_AcquireForRead(lck) \ { int err = pthread_rwlock_rdlock ( &lck ); \ if ( err != 0 ) XMP_Throw ( "Acquire pthread read lock failed", kXMPErr_ExternalFailure ); } #define XMP_BasicRWLock_AcquireForWrite(lck) \ { int err = pthread_rwlock_wrlock ( &lck ); \ if ( err != 0 ) XMP_Throw ( "Acquire pthread write lock failed", kXMPErr_ExternalFailure ); } #define XMP_BasicRWLock_ReleaseFromRead(lck) \ { int err = pthread_rwlock_unlock ( &lck ); \ if ( err != 0 ) XMP_Throw ( "Release pthread read lock failed", kXMPErr_ExternalFailure ); } #define XMP_BasicRWLock_ReleaseFromWrite(lck) \ { int err = pthread_rwlock_unlock ( &lck ); \ if ( err != 0 ) XMP_Throw ( "Release pthread write lock failed", kXMPErr_ExternalFailure ); } #elif UseWinSlimLock #include typedef SRWLOCK XMP_BasicRWLock; #define XMP_BasicRWLock_Initialize(lck) InitializeSRWLock ( &lck ) #define XMP_BasicRWLock_Terminate(lck) /* Do nothing. */ #define XMP_BasicRWLock_AcquireForRead(lck) AcquireSRWLockShared ( &lck ) #define XMP_BasicRWLock_AcquireForWrite(lck) AcquireSRWLockExclusive ( &lck ) #define XMP_BasicRWLock_ReleaseFromRead(lck) ReleaseSRWLockShared ( &lck ) #define XMP_BasicRWLock_ReleaseFromWrite(lck) ReleaseSRWLockExclusive ( &lck ) #elif UseHomeGrownLock class XMP_HomeGrownLock; typedef XMP_HomeGrownLock XMP_BasicRWLock; #define XMP_BasicRWLock_Initialize(lck) /* Do nothing. */ #define XMP_BasicRWLock_Terminate(lck) /* Do nothing. */ #define XMP_BasicRWLock_AcquireForRead(lck) lck.AcquireForRead() #define XMP_BasicRWLock_AcquireForWrite(lck) lck.AcquireForWrite() #define XMP_BasicRWLock_ReleaseFromRead(lck) lck.ReleaseFromRead() #define XMP_BasicRWLock_ReleaseFromWrite(lck) lck.ReleaseFromWrite() #if XMP_MacBuild | XMP_UNIXBuild #include typedef pthread_cond_t XMP_BasicQueue; #elif XMP_WinBuild #include #ifndef BuildLocksForWinXP #define BuildLocksForWinXP 1 #endif #if ! BuildLocksForWinXP typedef CONDITION_VARIABLE XMP_BasicQueue; // ! Requires Vista or newer. #else class XMP_WinXP_HGQueue { public: XMP_WinXP_HGQueue(); ~XMP_WinXP_HGQueue(); void Wait ( XMP_BasicMutex & queueMutex ); void ReleaseOne(); void ReleaseAll(); private: HANDLE queueEvent; volatile XMP_Uns32 waitCount; // ! Does not need to be XMP_AtomicCounter. volatile bool releaseAll; }; typedef XMP_WinXP_HGQueue XMP_BasicQueue; #endif #endif class XMP_HomeGrownLock { public: XMP_HomeGrownLock(); ~XMP_HomeGrownLock(); void AcquireForRead(); void AcquireForWrite(); void ReleaseFromRead(); void ReleaseFromWrite(); private: XMP_BasicMutex queueMutex; // Used to protect queueing operations. XMP_BasicQueue readerQueue, writerQueue; volatile XMP_Uns32 lockCount, readersWaiting, writersWaiting; // ! Does not need to be XMP_AtomicCounter. volatile bool beingWritten; }; #else #error "No locking mechanism chosen" #endif class XMP_ReadWriteLock { // For the lock objects, use XMP_AutoLock to do the locking. public: XMP_ReadWriteLock(); ~XMP_ReadWriteLock(); void Acquire ( bool forWriting ); void Release(); private: XMP_BasicRWLock lock; #if XMP_DebugBuild && HaveAtomicIncrDecr volatile XMP_AtomicCounter lockCount; // ! Only for debug checks, must be XMP_AtomicCounter. #endif volatile bool beingWritten; }; #define kXMP_ReadLock false #define kXMP_WriteLock true class XMP_AutoLock { public: XMP_AutoLock ( const XMP_ReadWriteLock * _lock, bool forWriting, bool cond = true ) : lock(0) { if ( cond ) { // The cast below is needed because the _lock parameter might come from something // like "const XMPMeta &", which would make the lock itself const. But we need to // modify the lock (to acquire and release) even if the owning object is const. this->lock = (XMP_ReadWriteLock*)_lock; this->lock->Acquire ( forWriting ); } } ~XMP_AutoLock() { this->Release(); } void Release() { if ( this->lock != 0 ) this->lock->Release(); this->lock = 0; } private: XMP_ReadWriteLock * lock; XMP_AutoLock() {}; // ! Must not be used. }; // ================================================================================================= // Support for wrappers // ==================== #define AnnounceStaticEntry(proc) /* Do nothing. */ #define AnnounceObjectEntry(proc,rwMode) /* Do nothing. */ #define AnnounceExit() /* Do nothing. */ // ------------------------------------------------------------------------------------------------- #if UseGlobalLibraryLock #define AcquireLibraryLock(lck) XMP_AutoMutex libLock ( &lck ) #else #define AcquireLibraryLock(lck) /* nothing */ #endif #define XMP_ENTER_NoLock(Proc) \ AnnounceStaticEntry ( Proc ); \ try { \ wResult->errMessage = 0; #define XMP_ENTER_Static(Proc) \ AnnounceStaticEntry ( Proc ); \ AcquireLibraryLock ( sLibraryLock ); \ try { \ wResult->errMessage = 0; #define XMP_ENTER_ObjRead(XMPClass,Proc) \ AnnounceObjectEntry ( Proc, "reader" ); \ AcquireLibraryLock ( sLibraryLock ); \ const XMPClass & thiz = *((XMPClass*)xmpObjRef); \ XMP_AutoLock objLock ( &thiz.lock, kXMP_ReadLock ); \ try { \ wResult->errMessage = 0; #define XMP_ENTER_ObjWrite(XMPClass,Proc) \ AnnounceObjectEntry ( Proc, "writer" ); \ AcquireLibraryLock ( sLibraryLock ); \ XMPClass * thiz = (XMPClass*)xmpObjRef; \ XMP_AutoLock objLock ( &thiz->lock, kXMP_WriteLock ); \ try { \ wResult->errMessage = 0; #define XMP_EXIT \ XMP_CATCH_EXCEPTIONS \ AnnounceExit(); #define XMP_EXIT_NoThrow \ } catch ( ... ) { \ AnnounceCatch ( "no-throw catch-all" ); \ /* Do nothing. */ \ } \ AnnounceExit(); #define XMP_CATCH_EXCEPTIONS \ } catch ( XMP_Error & xmpErr ) { \ wResult->int32Result = xmpErr.GetID(); \ wResult->ptrResult = (void*)"XMP"; \ wResult->errMessage = xmpErr.GetErrMsg(); \ if ( wResult->errMessage == 0 ) wResult->errMessage = ""; \ AnnounceCatch ( wResult->errMessage ); \ } catch ( std::exception & stdErr ) { \ wResult->int32Result = kXMPErr_StdException; \ wResult->errMessage = stdErr.what(); \ if ( wResult->errMessage == 0 ) wResult->errMessage = ""; \ AnnounceCatch ( wResult->errMessage ); \ } catch ( ... ) { \ wResult->int32Result = kXMPErr_UnknownException; \ wResult->errMessage = "Caught unknown exception"; \ AnnounceCatch ( wResult->errMessage ); \ } #if XMP_DebugBuild #define RELEASE_NO_THROW /* empty */ #else #define RELEASE_NO_THROW throw() #endif // ================================================================================================= // Data structure dumping utilities // ================================ #define IsHexDigit(ch) ( (('0' <= (ch)) && ((ch) <= '9')) || (('A' <= (ch)) && ((ch) <= 'F')) ) #define HexDigitValue(ch) ( (((ch) - '0') < 10) ? ((ch) - '0') : ((ch) - 'A' + 10) ) static const char * kTenSpaces = " "; #define OutProcPadding(pad) { size_t padLen = (pad); \ for ( ; padLen >= 10; padLen -= 10 ) OutProcNChars ( kTenSpaces, 10 ); \ for ( ; padLen > 0; padLen -= 1 ) OutProcNChars ( " ", 1 ); } #define OutProcNewline() { XMP_Status status = (*outProc) ( refCon, "\n", 1 ); if ( status != 0 ) return; } #define OutProcNChars(p,n) { XMP_Status status = (*outProc) ( refCon, (p), (n) ); if ( status != 0 ) return; } #define OutProcLiteral(lit) { XMP_Status status = (*outProc) ( refCon, (lit), (XMP_StringLen)strlen(lit) ); if ( status != 0 ) return; } #define OutProcString(str) { XMP_Status status = (*outProc) ( refCon, (str).c_str(), (XMP_StringLen)(str).size() ); if ( status != 0 ) return; } #define OutProcDecInt(num) { snprintf ( buffer, sizeof(buffer), "%ld", (long)(num) ); /* AUDIT: Using sizeof for snprintf length is safe */ \ XMP_Status status = (*outProc) ( refCon, buffer, (XMP_StringLen)strlen(buffer) ); if ( status != 0 ) return; } #define OutProcHexInt(num) { snprintf ( buffer, sizeof(buffer), "%lX", (long)(num) ); /* AUDIT: Using sizeof for snprintf length is safe */ \ XMP_Status status = (*outProc) ( refCon, buffer, (XMP_StringLen)strlen(buffer) ); if ( status != 0 ) return; } #define OutProcHexByte(num) { snprintf ( buffer, sizeof(buffer), "%.2X", (num) ); /* AUDIT: Using sizeof for snprintf length is safe */ \ XMP_Status status = (*outProc) ( refCon, buffer, (XMP_StringLen)strlen(buffer) ); if ( status != 0 ) return; } static const char * kIndent = " "; #define OutProcIndent(lev) { for ( size_t i = 0; i < (lev); ++i ) OutProcNChars ( kIndent, 3 ); } void DumpClearString ( const XMP_VarString & value, XMP_TextOutputProc outProc, void * refCon ); // ================================================================================================= // Namespace Tables // ================ typedef std::pair < XMP_VarString, XMP_VarString > XMP_StringPair; typedef std::map < XMP_VarString, XMP_VarString > XMP_StringMap; typedef XMP_StringMap::iterator XMP_StringMapPos; typedef XMP_StringMap::const_iterator XMP_cStringMapPos; class XMP_NamespaceTable { public: XMP_NamespaceTable() {}; XMP_NamespaceTable ( const XMP_NamespaceTable & presets ); virtual ~XMP_NamespaceTable() {}; bool Define ( XMP_StringPtr uri, XMP_StringPtr suggPrefix, XMP_StringPtr * prefixPtr, XMP_StringLen * prefixLen); bool GetPrefix ( XMP_StringPtr uri, XMP_StringPtr * prefixPtr, XMP_StringLen * prefixLen ) const; bool GetURI ( XMP_StringPtr prefix, XMP_StringPtr * uriPtr, XMP_StringLen * uriLen ) const; void Dump ( XMP_TextOutputProc outProc, void * refCon ) const; private: XMP_ReadWriteLock lock; XMP_StringMap uriToPrefixMap, prefixToURIMap; }; // ================================================================================================= #endif // __XMP_LibUtils_hpp__ exempi-2.2.1/source/common/Makefile.am0000664000175000017500000000422012150230673014547 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # noinst_LTLIBRARIES = libxmpcommon.la INCLUDES = -I$(top_srcdir)/public/include \ -I$(top_srcdir)/public/include/client-glue AM_CXXFLAGS = -Wno-multichar -Wno-ctor-dtor-privacy \ -funsigned-char -fexceptions AM_CPPFLAGS = \ -D@EXEMPI_PLATFORM_DEF@=1 -DXMP_IMPL=1 -DXMP_ClientBuild=0 \ -D_FILE_OFFSET_BITS=64 -DHAVE_EXPAT_CONFIG_H=1 -DXML_STATIC=1 noinst_HEADERS = UnicodeConversions.hpp ExpatAdapter.hpp EndianUtils.hpp\ LargeFileAccess.hpp XMLParserAdapter.hpp libxmpcommon_la_SOURCES = UnicodeInlines.incl_cpp UnicodeConversions.cpp\ XML_Node.cpp LargeFileAccess.cpp \ XMP_LibUtils.hpp XMP_LibUtils.cpp \ $(NULL)exempi-2.2.1/source/common/XMP_LibUtils.cpp0000664000175000017500000005223512150230673015503 00000000000000// ================================================================================================= // Copyright 2009 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include #include #include "XMP_Environment.h" #include "XMP_LibUtils.hpp" #include "UnicodeInlines.incl_cpp" // ================================================================================================= #ifndef TraceThreadLocks #define TraceThreadLocks 0 #endif // ------------------------------------------------------------------------------------------------- extern "C" bool Initialize_LibUtils() { return true; } // ------------------------------------------------------------------------------------------------- extern "C" void Terminate_LibUtils(){ // Nothing to do. } // ================================================================================================= // Thread synchronization locks // ================================================================================================= XMP_ReadWriteLock::XMP_ReadWriteLock() : beingWritten(false) { #if XMP_DebugBuild && HaveAtomicIncrDecr this->lockCount = 0; // Atomic counter must be 32 or 64 bits and naturally aligned. size_t counterSize = sizeof ( XMP_AtomicCounter ); size_t counterOffset = XMP_OffsetOf ( XMP_ReadWriteLock, lockCount ); XMP_Assert ( (counterSize == 4) || (counterSize == 8) ); // Counter must be 32 or 64 bits. XMP_Assert ( (counterOffset & (counterSize-1)) == 0 ); // Counter must be naturally aligned. #endif XMP_BasicRWLock_Initialize ( this->lock ); #if TraceThreadLocks fprintf ( stderr, "Created lock %.8X\n", this ); #endif } // --------------------------------------------------------------------------------------------- XMP_ReadWriteLock::~XMP_ReadWriteLock() { #if TraceThreadLocks fprintf ( stderr, "Deleting lock %.8X\n", this ); #endif #if XMP_DebugBuild && HaveAtomicIncrDecr XMP_Assert ( this->lockCount == 0 ); #endif XMP_BasicRWLock_Terminate ( this->lock ); } // --------------------------------------------------------------------------------------------- void XMP_ReadWriteLock::Acquire ( bool forWriting ) { #if TraceThreadLocks fprintf ( stderr, "Acquiring lock %.8X for %s, count %d%s\n", this, (forWriting ? "writing" : "reading"), this->lockCount, (this->beingWritten ? ", being written" : "") ); #endif if ( forWriting ) { XMP_BasicRWLock_AcquireForWrite ( this->lock ); #if XMP_DebugBuild && HaveAtomicIncrDecr XMP_Assert ( this->lockCount == 0 ); #endif } else { XMP_BasicRWLock_AcquireForRead ( this->lock ); XMP_Assert ( ! this->beingWritten ); } #if XMP_DebugBuild && HaveAtomicIncrDecr XMP_AtomicIncrement ( this->lockCount ); #endif this->beingWritten = forWriting; #if TraceThreadLocks fprintf ( stderr, "Acquired lock %.8X for %s, count %d%s\n", this, (forWriting ? "writing" : "reading"), this->lockCount, (this->beingWritten ? ", being written" : "") ); #endif } // --------------------------------------------------------------------------------------------- void XMP_ReadWriteLock::Release() { #if TraceThreadLocks fprintf ( stderr, "Releasing lock %.8X, count %d%s\n", this, this->lockCount, (this->beingWritten ? ", being written" : "") ); #endif #if XMP_DebugBuild && HaveAtomicIncrDecr XMP_Assert ( this->lockCount > 0 ); XMP_AtomicDecrement ( this->lockCount ); // ! Do these before unlocking, that might release a waiting thread. #endif bool forWriting = this->beingWritten; this->beingWritten = false; if ( forWriting ) { XMP_BasicRWLock_ReleaseFromWrite ( this->lock ); } else { XMP_BasicRWLock_ReleaseFromRead ( this->lock ); } #if TraceThreadLocks fprintf ( stderr, "Released lock %.8X, count %d%s\n", this, this->lockCount, (this->beingWritten ? ", being written" : "") ); #endif } // ================================================================================================= #if UseHomeGrownLock #if XMP_MacBuild | XMP_UNIXBuild // ----------------------------------------------------------------------------------------- // About pthread mutexes and conditions: // // The mutex protecting the condition must be locked before waiting for the condition. A // thread can wait for a condition to be signaled by calling the pthread_cond_wait // subroutine. The subroutine atomically unlocks the mutex and blocks the calling thread // until the condition is signaled. When the call returns, the mutex is locked again. #define InitializeBasicMutex(mutex) { int err = pthread_mutex_init ( &mutex, 0 ); XMP_Enforce ( err == 0 ); } #define TerminateBasicMutex(mutex) { int err = pthread_mutex_destroy ( &mutex ); XMP_Enforce ( err == 0 ); } #define AcquireBasicMutex(mutex) { int err = pthread_mutex_lock ( &mutex ); XMP_Enforce ( err == 0 ); } #define ReleaseBasicMutex(mutex) { int err = pthread_mutex_unlock ( &mutex ); XMP_Enforce ( err == 0 ); } #define InitializeBasicQueue(queue) { int err = pthread_cond_init ( &queue, 0 ); XMP_Enforce ( err == 0 ); } #define TerminateBasicQueue(queue) { int err = pthread_cond_destroy ( &queue ); XMP_Enforce ( err == 0 ); } #define WaitOnBasicQueue(queue,mutex) { int err = pthread_cond_wait ( &queue, &mutex ); XMP_Enforce ( err == 0 ); } #define ReleaseOneBasicQueue(queue) { int err = pthread_cond_signal ( &queue ); XMP_Enforce ( err == 0 ); } #define ReleaseAllBasicQueue(queue) { int err = pthread_cond_broadcast ( &queue ); XMP_Enforce ( err == 0 ); } // ----------------------------------------------------------------------------------------- #elif XMP_WinBuild // ----------------------------------------------------------------------------------------- #define InitializeBasicMutex(mutex) { InitializeCriticalSection ( &mutex ); } #define TerminateBasicMutex(mutex) { DeleteCriticalSection ( &mutex ); } #define AcquireBasicMutex(mutex) { EnterCriticalSection ( &mutex ); } #define ReleaseBasicMutex(mutex) { LeaveCriticalSection ( &mutex ); } #if ! BuildLocksForWinXP // About Win32 condition variables (not on XP): // // Condition variables enable threads to atomically release a lock and enter the // sleeping state. They can be used with critical sections or slim reader/writer (SRW) // locks. Condition variables support operations that "wake one" or "wake all" waiting // threads. After a thread is woken, it re-acquires the lock it released when the thread // entered the sleeping state. #define InitializeBasicQueue(queue) { InitializeConditionVariable ( &queue ); } #define TerminateBasicQueue(queue) /* Do nothing. */ #define WaitOnBasicQueue(queue,mutex) \ { BOOL ok = SleepConditionVariableCS ( &queue, &mutex, INFINITE /* timeout */ ); XMP_Enforce ( ok ); } #define ReleaseOneBasicQueue(queue) { WakeConditionVariable ( &queue ); } #define ReleaseAllBasicQueue(queue) { WakeAllConditionVariable ( &queue ); } #else // Need to create our own queue for Windows XP. This is not a general queue, it depends // on the usage inside XMP_HomeGrownLock where the queueMutex guarantees that the // queueing operations are done single threaded. #define InitializeBasicQueue(queue) /* Do nothing. */ #define TerminateBasicQueue(queue) /* Do nothing. */ #define WaitOnBasicQueue(queue,mutex) { queue.Wait ( mutex ); } #define ReleaseOneBasicQueue(queue) { queue.ReleaseOne(); } #define ReleaseAllBasicQueue(queue) { queue.ReleaseAll(); } // ------------------------------------------------------------------------------------- XMP_WinXP_HGQueue::XMP_WinXP_HGQueue() : queueEvent(0), waitCount(0), releaseAll(false) { this->queueEvent = CreateEvent ( NULL, FALSE, TRUE, NULL ); // Auto reset, initially clear. XMP_Enforce ( this->queueEvent != 0 ); } // ------------------------------------------------------------------------------------- XMP_WinXP_HGQueue::~XMP_WinXP_HGQueue() { CloseHandle ( this->queueEvent ); } // ------------------------------------------------------------------------------------- void XMP_WinXP_HGQueue::Wait ( XMP_BasicMutex & queueMutex ) { ++this->waitCount; // ! Does not need atomic increment, protected by queue mutex. ReleaseBasicMutex ( queueMutex ); DWORD status = WaitForSingleObject ( this->queueEvent, INFINITE ); if ( status != WAIT_OBJECT_0 ) XMP_Throw ( "Failure from WaitForSingleObject", kXMPErr_ExternalFailure ); AcquireBasicMutex ( queueMutex ); --this->waitCount; // ! Does not need atomic decrement, protected by queue mutex. if ( this->releaseAll ) { if ( this->waitCount == 0 ) { this->releaseAll = false; } else { BOOL ok = SetEvent ( this->queueEvent ); if ( ! ok ) XMP_Throw ( "Failure from SetEvent", kXMPErr_ExternalFailure ); } } } // ------------------------------------------------------------------------------------- void XMP_WinXP_HGQueue::ReleaseOne() { XMP_Assert ( ! this->releaseAll ); BOOL ok = SetEvent ( this->queueEvent ); if ( ! ok ) XMP_Throw ( "Failure from SetEvent", kXMPErr_ExternalFailure ); } // ------------------------------------------------------------------------------------- void XMP_WinXP_HGQueue::ReleaseAll() { this->releaseAll = true; BOOL ok = SetEvent ( this->queueEvent ); if ( ! ok ) XMP_Throw ( "Failure from SetEvent", kXMPErr_ExternalFailure ); } #endif // ----------------------------------------------------------------------------------------- #endif // ============================================================================================= XMP_HomeGrownLock::XMP_HomeGrownLock() : lockCount(0), readersWaiting(0), writersWaiting(0), beingWritten(false) { InitializeBasicMutex ( this->queueMutex ); InitializeBasicQueue ( this->writerQueue ); InitializeBasicQueue ( this->readerQueue ); } // ============================================================================================= XMP_HomeGrownLock::~XMP_HomeGrownLock() { TerminateBasicMutex ( this->queueMutex ); TerminateBasicQueue ( this->writerQueue ); TerminateBasicQueue ( this->readerQueue ); } // ============================================================================================= void XMP_HomeGrownLock::AcquireForRead() { XMP_AutoMutex autoMutex ( &this->queueMutex ); ++this->readersWaiting; // ! Does not need atomic increment, protected by queue mutex. while ( (this->beingWritten) || (this->writersWaiting > 0) ) { // Don't allow more readers if writers are waiting. WaitOnBasicQueue ( this->readerQueue, this->queueMutex ); } --this->readersWaiting; // ! Does not need atomic decrement, protected by queue mutex. XMP_Assert ( ! this->beingWritten ); ++this->lockCount; // ! Does not need atomic increment, protected by queue mutex. } // ============================================================================================= void XMP_HomeGrownLock::AcquireForWrite() { XMP_AutoMutex autoMutex ( &this->queueMutex ); ++this->writersWaiting; // ! Does not need atomic increment, protected by queue mutex. while ( this->lockCount > 0 ) { WaitOnBasicQueue ( this->writerQueue, this->queueMutex ); } --this->writersWaiting; // ! Does not need atomic decrement, protected by queue mutex. XMP_Assert ( (! this->beingWritten) && (this->lockCount == 0) ); ++this->lockCount; // ! Does not need atomic increment, protected by queue mutex. this->beingWritten = true; } // ============================================================================================= void XMP_HomeGrownLock::ReleaseFromRead() { XMP_AutoMutex autoMutex ( &this->queueMutex ); XMP_Assert ( (! this->beingWritten) && (this->lockCount > 0) ); --this->lockCount; // ! Does not need atomic decrement, protected by queue mutex. if ( this->writersWaiting > 0 ) { ReleaseOneBasicQueue ( this->writerQueue ); } else if ( this->readersWaiting > 0 ) { ReleaseAllBasicQueue ( this->readerQueue ); } } // ============================================================================================= void XMP_HomeGrownLock::ReleaseFromWrite() { XMP_AutoMutex autoMutex ( &this->queueMutex ); XMP_Assert ( this->beingWritten && (this->lockCount == 1) ); --this->lockCount; // ! Does not need atomic decrement, protected by queue mutex. this->beingWritten = false; if ( this->writersWaiting > 0 ) { ReleaseOneBasicQueue ( this->writerQueue ); } else if ( this->readersWaiting > 0 ) { ReleaseAllBasicQueue ( this->readerQueue ); } } // ============================================================================================= #endif // ================================================================================================= // Data structure dumping utilities // ================================ void DumpClearString ( const XMP_VarString & value, XMP_TextOutputProc outProc, void * refCon ) { char buffer [20]; bool prevNormal; XMP_Status status = 0; XMP_StringPtr spanStart, spanEnd; XMP_StringPtr valueEnd = &value[0] + value.size(); spanStart = &value[0]; while ( spanStart < valueEnd ) { // Output the next span of regular characters. for ( spanEnd = spanStart; spanEnd < valueEnd; ++spanEnd ) { if ( *spanEnd > 0x7F ) break; if ( (*spanEnd < 0x20) && (*spanEnd != kTab) && (*spanEnd != kLF) ) break; } if ( spanStart != spanEnd ) status = (*outProc) ( refCon, spanStart, (XMP_StringLen)(spanEnd-spanStart) ); if ( status != 0 ) break; spanStart = spanEnd; // Output the next span of irregular characters. prevNormal = true; for ( spanEnd = spanStart; spanEnd < valueEnd; ++spanEnd ) { if ( ((0x20 <= *spanEnd) && (*spanEnd <= 0x7F)) || (*spanEnd == kTab) || (*spanEnd == kLF) ) break; char space = ' '; if ( prevNormal ) space = '<'; status = (*outProc) ( refCon, &space, 1 ); if ( status != 0 ) break; OutProcHexByte ( *spanEnd ); prevNormal = false; } if ( ! prevNormal ) { status = (*outProc) ( refCon, ">", 1 ); if ( status != 0 ) return; } spanStart = spanEnd; } } // DumpClearString // ------------------------------------------------------------------------------------------------- static void DumpStringMap ( const XMP_StringMap & map, XMP_StringPtr label, XMP_TextOutputProc outProc, void * refCon ) { XMP_cStringMapPos currPos; XMP_cStringMapPos endPos = map.end(); size_t maxLen = 0; for ( currPos = map.begin(); currPos != endPos; ++currPos ) { size_t currLen = currPos->first.size(); if ( currLen > maxLen ) maxLen = currLen; } OutProcNewline(); OutProcLiteral ( label ); OutProcNewline(); for ( currPos = map.begin(); currPos != endPos; ++currPos ) { OutProcNChars ( " ", 2 ); DumpClearString ( currPos->first, outProc, refCon ); OutProcPadding ( maxLen - currPos->first.size() ); OutProcNChars ( " => ", 4 ); DumpClearString ( currPos->second, outProc, refCon ); OutProcNewline(); } } // DumpStringMap // ================================================================================================= // Namespace Tables // ================================================================================================= XMP_NamespaceTable::XMP_NamespaceTable ( const XMP_NamespaceTable & presets ) { XMP_AutoLock presetLock ( &presets.lock, kXMP_ReadLock ); this->uriToPrefixMap = presets.uriToPrefixMap; this->prefixToURIMap = presets.prefixToURIMap; } // XMP_NamespaceTable::XMP_NamespaceTable // ================================================================================================= bool XMP_NamespaceTable::Define ( XMP_StringPtr _uri, XMP_StringPtr _suggPrefix, XMP_StringPtr * prefixPtr, XMP_StringLen * prefixLen ) { XMP_AutoLock tableLock ( &this->lock, kXMP_WriteLock ); bool prefixMatches = false; XMP_Assert ( (_uri != 0) && (*_uri != 0) && (_suggPrefix != 0) && (*_suggPrefix != 0) ); XMP_VarString uri ( _uri ); XMP_VarString suggPrefix ( _suggPrefix ); if ( suggPrefix[suggPrefix.size()-1] != ':' ) suggPrefix += ':'; VerifySimpleXMLName ( _suggPrefix, _suggPrefix+suggPrefix.size()-1 ); // Exclude the colon. XMP_StringMapPos uriPos = this->uriToPrefixMap.find ( uri ); if ( uriPos == this->uriToPrefixMap.end() ) { // The URI is not yet registered, make sure we use a unique prefix. XMP_VarString uniqPrefix ( suggPrefix ); int suffix = 0; char buffer [32]; // AUDIT: Plenty of room for the "_%d_" suffix. while ( true ) { if ( this->prefixToURIMap.find ( uniqPrefix ) == this->prefixToURIMap.end() ) break; ++suffix; snprintf ( buffer, sizeof(buffer), "_%d_:", suffix ); // AUDIT: Using sizeof for snprintf length is safe. uniqPrefix = suggPrefix; uniqPrefix.erase ( uniqPrefix.size()-1 ); // ! Remove the trailing ':'. uniqPrefix += buffer; } // Add the new namespace to both maps. XMP_StringPair newNS ( uri, uniqPrefix ); uriPos = this->uriToPrefixMap.insert ( this->uriToPrefixMap.end(), newNS ); newNS.first.swap ( newNS.second ); (void) this->prefixToURIMap.insert ( this->prefixToURIMap.end(), newNS ); } // Return the actual prefix and see if it matches the suggested prefix. if ( prefixPtr != 0 ) *prefixPtr = uriPos->second.c_str(); if ( prefixLen != 0 ) *prefixLen = (XMP_StringLen)uriPos->second.size(); prefixMatches = ( uriPos->second == suggPrefix ); return prefixMatches; } // XMP_NamespaceTable::Define // ================================================================================================= bool XMP_NamespaceTable::GetPrefix ( XMP_StringPtr _uri, XMP_StringPtr * prefixPtr, XMP_StringLen * prefixLen ) const { XMP_AutoLock tableLock ( &this->lock, kXMP_ReadLock ); bool found = false; XMP_Assert ( (_uri != 0) && (*_uri != 0) ); XMP_VarString uri ( _uri ); XMP_cStringMapPos uriPos = this->uriToPrefixMap.find ( uri ); if ( uriPos != this->uriToPrefixMap.end() ) { if ( prefixPtr != 0 ) *prefixPtr = uriPos->second.c_str(); if ( prefixLen != 0 ) *prefixLen = (XMP_StringLen)uriPos->second.size(); found = true; } return found; } // XMP_NamespaceTable::GetPrefix // ================================================================================================= bool XMP_NamespaceTable::GetURI ( XMP_StringPtr _prefix, XMP_StringPtr * uriPtr, XMP_StringLen * uriLen ) const { XMP_AutoLock tableLock ( &this->lock, kXMP_ReadLock ); bool found = false; XMP_Assert ( (_prefix != 0) && (*_prefix != 0) ); XMP_VarString prefix ( _prefix ); if ( prefix[prefix.size()-1] != ':' ) prefix += ':'; XMP_cStringMapPos prefixPos = this->prefixToURIMap.find ( prefix ); if ( prefixPos != this->prefixToURIMap.end() ) { if ( uriPtr != 0 ) *uriPtr = prefixPos->second.c_str(); if ( uriLen != 0 ) *uriLen = (XMP_StringLen)prefixPos->second.size(); found = true; } return found; } // XMP_NamespaceTable::GetURI // ================================================================================================= void XMP_NamespaceTable::Dump ( XMP_TextOutputProc outProc, void * refCon ) const { XMP_AutoLock tableLock ( &this->lock, kXMP_ReadLock ); XMP_cStringMapPos p2uEnd = this->prefixToURIMap.end(); // ! Move up to avoid gcc complaints. XMP_cStringMapPos u2pEnd = this->uriToPrefixMap.end(); DumpStringMap ( this->prefixToURIMap, "Dumping namespace prefix to URI map", outProc, refCon ); if ( this->prefixToURIMap.size() != this->uriToPrefixMap.size() ) { OutProcLiteral ( "** bad namespace map sizes **" ); XMP_Throw ( "Fatal namespace map problem", kXMPErr_InternalFailure ); } for ( XMP_cStringMapPos nsLeft = this->prefixToURIMap.begin(); nsLeft != p2uEnd; ++nsLeft ) { XMP_cStringMapPos nsOther = this->uriToPrefixMap.find ( nsLeft->second ); if ( (nsOther == u2pEnd) || (nsLeft != this->prefixToURIMap.find ( nsOther->second )) ) { OutProcLiteral ( " ** bad namespace URI ** " ); DumpClearString ( nsLeft->second, outProc, refCon ); break; } for ( XMP_cStringMapPos nsRight = nsLeft; nsRight != p2uEnd; ++nsRight ) { if ( nsRight == nsLeft ) continue; // ! Can't start at nsLeft+1, no operator+! if ( nsLeft->second == nsRight->second ) { OutProcLiteral ( " ** duplicate namespace URI ** " ); DumpClearString ( nsLeft->second, outProc, refCon ); break; } } } for ( XMP_cStringMapPos nsLeft = this->uriToPrefixMap.begin(); nsLeft != u2pEnd; ++nsLeft ) { XMP_cStringMapPos nsOther = this->prefixToURIMap.find ( nsLeft->second ); if ( (nsOther == p2uEnd) || (nsLeft != this->uriToPrefixMap.find ( nsOther->second )) ) { OutProcLiteral ( " ** bad namespace prefix ** " ); DumpClearString ( nsLeft->second, outProc, refCon ); break; } for ( XMP_cStringMapPos nsRight = nsLeft; nsRight != u2pEnd; ++nsRight ) { if ( nsRight == nsLeft ) continue; // ! Can't start at nsLeft+1, no operator+! if ( nsLeft->second == nsRight->second ) { OutProcLiteral ( " ** duplicate namespace prefix ** " ); DumpClearString ( nsLeft->second, outProc, refCon ); break; } } } } // XMP_NamespaceTable::Dump // ================================================================================================= exempi-2.2.1/source/Makefile.in0000664000175000017500000004710712150231002013266 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = source DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = common XMPCore XMPFiles all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign source/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign source/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ cscopelist cscopelist-recursive ctags ctags-recursive \ distclean distclean-generic distclean-libtool distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/source/XMPCore/0000775000175000017500000000000012163706252012567 500000000000000exempi-2.2.1/source/XMPCore/XMPMeta-Parse.cpp0000664000175000017500000013770612150230672015546 00000000000000// ================================================================================================= // Copyright 2003 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // Adobe patent application tracking #P435, entitled 'Unique markers to simplify embedding data of // one format in a file with a different format', inventors: Sean Parent, Greg Gilley. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include! #include "XMPCore_Impl.hpp" #include "XMPMeta.hpp" #include "XMPUtils.hpp" #include "UnicodeInlines.incl_cpp" #include "UnicodeConversions.hpp" #include "ExpatAdapter.hpp" #if XMP_DebugBuild #include #endif using namespace std; #if XMP_WinBuild #pragma warning ( disable : 4533 ) // initialization of '...' is skipped by 'goto ...' #pragma warning ( disable : 4702 ) // unreachable code #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif // *** Use the XMP_PropIsXyz (Schema, Simple, Struct, Array, ...) macros // *** Add debug codegen checks, e.g. that typical masking operations really work // *** Change all uses of strcmp and strncmp to XMP_LitMatch and XMP_LitNMatch // ================================================================================================= // Local Types and Constants // ========================= // ================================================================================================= // Static Variables // ================ #ifndef Trace_ParsingHackery #define Trace_ParsingHackery 0 #endif static const char * kReplaceLatin1[128] = { // The 0x80..0x9F range is undefined in Latin-1, but is defined in Windows code page 1252. // The bytes 0x81, 0x8D, 0x8F, 0x90, and 0x9D are formally undefined by Windows 1252, but // their conversion API maps them to U+0081, etc. These are in XML's RestrictedChar set, so // we map them to a space. "\xE2\x82\xAC", " ", "\xE2\x80\x9A", "\xC6\x92", // 0x80 .. 0x83 "\xE2\x80\x9E", "\xE2\x80\xA6", "\xE2\x80\xA0", "\xE2\x80\xA1", // 0x84 .. 0x87 "\xCB\x86", "\xE2\x80\xB0", "\xC5\xA0", "\xE2\x80\xB9", // 0x88 .. 0x8B "\xC5\x92", " ", "\xC5\xBD", " ", // 0x8C .. 0x8F " ", "\xE2\x80\x98", "\xE2\x80\x99", "\xE2\x80\x9C", // 0x90 .. 0x93 "\xE2\x80\x9D", "\xE2\x80\xA2", "\xE2\x80\x93", "\xE2\x80\x94", // 0x94 .. 0x97 "\xCB\x9C", "\xE2\x84\xA2", "\xC5\xA1", "\xE2\x80\xBA", // 0x98 .. 0x9B "\xC5\x93", " ", "\xC5\xBE", "\xC5\xB8", // 0x9C .. 0x9F // These are the UTF-8 forms of the official Latin-1 characters in the range 0xA0..0xFF. Not // too surprisingly these map to U+00A0, etc. Which is the Unicode Latin Supplement range. "\xC2\xA0", "\xC2\xA1", "\xC2\xA2", "\xC2\xA3", "\xC2\xA4", "\xC2\xA5", "\xC2\xA6", "\xC2\xA7", // 0xA0 .. 0xA7 "\xC2\xA8", "\xC2\xA9", "\xC2\xAA", "\xC2\xAB", "\xC2\xAC", "\xC2\xAD", "\xC2\xAE", "\xC2\xAF", // 0xA8 .. 0xAF "\xC2\xB0", "\xC2\xB1", "\xC2\xB2", "\xC2\xB3", "\xC2\xB4", "\xC2\xB5", "\xC2\xB6", "\xC2\xB7", // 0xB0 .. 0xB7 "\xC2\xB8", "\xC2\xB9", "\xC2\xBA", "\xC2\xBB", "\xC2\xBC", "\xC2\xBD", "\xC2\xBE", "\xC2\xBF", // 0xB8 .. 0xBF "\xC3\x80", "\xC3\x81", "\xC3\x82", "\xC3\x83", "\xC3\x84", "\xC3\x85", "\xC3\x86", "\xC3\x87", // 0xC0 .. 0xC7 "\xC3\x88", "\xC3\x89", "\xC3\x8A", "\xC3\x8B", "\xC3\x8C", "\xC3\x8D", "\xC3\x8E", "\xC3\x8F", // 0xC8 .. 0xCF "\xC3\x90", "\xC3\x91", "\xC3\x92", "\xC3\x93", "\xC3\x94", "\xC3\x95", "\xC3\x96", "\xC3\x97", // 0xD0 .. 0xD7 "\xC3\x98", "\xC3\x99", "\xC3\x9A", "\xC3\x9B", "\xC3\x9C", "\xC3\x9D", "\xC3\x9E", "\xC3\x9F", // 0xD8 .. 0xDF "\xC3\xA0", "\xC3\xA1", "\xC3\xA2", "\xC3\xA3", "\xC3\xA4", "\xC3\xA5", "\xC3\xA6", "\xC3\xA7", // 0xE0 .. 0xE7 "\xC3\xA8", "\xC3\xA9", "\xC3\xAA", "\xC3\xAB", "\xC3\xAC", "\xC3\xAD", "\xC3\xAE", "\xC3\xAF", // 0xE8 .. 0xEF "\xC3\xB0", "\xC3\xB1", "\xC3\xB2", "\xC3\xB3", "\xC3\xB4", "\xC3\xB5", "\xC3\xB6", "\xC3\xB7", // 0xF0 .. 0xF7 "\xC3\xB8", "\xC3\xB9", "\xC3\xBA", "\xC3\xBB", "\xC3\xBC", "\xC3\xBD", "\xC3\xBE", "\xC3\xBF", // 0xF8 .. 0xFF }; // ================================================================================================= // Local Utilities // =============== #define IsHexDigit(ch) ( (('0' <= (ch)) && ((ch) <= '9')) || (('A' <= (ch)) && ((ch) <= 'F')) ) #define HexDigitValue(ch) ( (((ch) - '0') < 10) ? ((ch) - '0') : ((ch) - 'A' + 10) ) // ------------------------------------------------------------------------------------------------- // PickBestRoot // ------------ static const XML_Node * PickBestRoot ( const XML_Node & xmlParent, XMP_OptionBits options ) { // Look among this parent's content for x:xmpmeta. The recursion for x:xmpmeta is broader than // the strictly defined choice, but gives us smaller code. for ( size_t childNum = 0, childLim = xmlParent.content.size(); childNum < childLim; ++childNum ) { const XML_Node * childNode = xmlParent.content[childNum]; if ( childNode->kind != kElemNode ) continue; if ( (childNode->name == "x:xmpmeta") || (childNode->name == "x:xapmeta") ) return PickBestRoot ( *childNode, 0 ); } // Look among this parent's content for a bare rdf:RDF if that is allowed. if ( ! (options & kXMP_RequireXMPMeta) ) { for ( size_t childNum = 0, childLim = xmlParent.content.size(); childNum < childLim; ++childNum ) { const XML_Node * childNode = xmlParent.content[childNum]; if ( childNode->kind != kElemNode ) continue; if ( childNode->name == "rdf:RDF" ) return childNode; } } // Recurse into the content. for ( size_t childNum = 0, childLim = xmlParent.content.size(); childNum < childLim; ++childNum ) { const XML_Node * foundRoot = PickBestRoot ( *xmlParent.content[childNum], options ); if ( foundRoot != 0 ) return foundRoot; } return 0; } // PickBestRoot // ------------------------------------------------------------------------------------------------- // FindRootNode // ------------ // // Find the XML node that is the root of the XMP data tree. Generally this will be an outer node, // but it could be anywhere if a general XML document is parsed (e.g. SVG). The XML parser counted // all possible root nodes, and kept a pointer to the last one. If there is more than one possible // root use PickBestRoot to choose among them. // // If there is a root node, try to extract the version of the previous XMP toolkit. static const XML_Node * FindRootNode ( XMPMeta * thiz, const XMLParserAdapter & xmlParser, XMP_OptionBits options ) { const XML_Node * rootNode = xmlParser.rootNode; if ( xmlParser.rootCount > 1 ) rootNode = PickBestRoot ( xmlParser.tree, options ); if ( rootNode == 0 ) return 0; // We have a root node. Try to extract previous toolkit version number. XMP_StringPtr verStr = ""; XMP_Assert ( rootNode->name == "rdf:RDF" ); if ( (options & kXMP_RequireXMPMeta) && ((rootNode->parent == 0) || ((rootNode->parent->name != "x:xmpmeta") && (rootNode->parent->name != "x:xapmeta"))) ) return 0; for ( size_t attrNum = 0, attrLim = rootNode->parent->attrs.size(); attrNum < attrLim; ++attrNum ) { const XML_Node * currAttr =rootNode->parent->attrs[attrNum]; if ( (currAttr->name == "x:xmptk") || (currAttr->name == "x:xaptk") ) { verStr = currAttr->value.c_str(); break; } } // Decode the version number into MMmmuubbb digits. If any part is too big, peg it at 99 or 999. unsigned long part; while ( (*verStr != 0) && ((*verStr < '0') || (*verStr > '9')) ) ++verStr; part = 0; while ( (*verStr != 0) && ('0' <= *verStr) && (*verStr <= '9') ) { part = (part * 10) + (*verStr - '0'); ++verStr; } if ( part > 99 ) part = 99; thiz->prevTkVer = part * 100*100*1000; part = 0; if ( *verStr == '.' ) ++verStr; while ( (*verStr != 0) && ('0' <= *verStr) && (*verStr <= '9') ) { part = (part * 10) + (*verStr - '0'); ++verStr; } if ( part > 99 ) part = 99; thiz->prevTkVer += part * 100*1000; part = 0; if ( *verStr == '.' ) ++verStr; while ( (*verStr != 0) && ('0' <= *verStr) && (*verStr <= '9') ) { part = (part * 10) + (*verStr - '0'); ++verStr; } if ( part > 99 ) part = 99; thiz->prevTkVer += part * 1000; part = 0; if ( *verStr == '-' ) ++verStr; while ( (*verStr != 0) && ('0' <= *verStr) && (*verStr <= '9') ) { part = (part * 10) + (*verStr - '0'); ++verStr; } if ( part > 999 ) part = 999; thiz->prevTkVer += part; return rootNode; } // FindRootNode // ------------------------------------------------------------------------------------------------- // NormalizeDCArrays // ----------------- // // Undo the denormalization performed by the XMP used in Acrobat 5. If a Dublin Core array had only // one item, it was serialized as a simple property. The xml:lang attribute was dropped from an // alt-text item if the language was x-default. // *** This depends on the dc: namespace prefix. static void NormalizeDCArrays ( XMP_Node * xmpTree ) { XMP_Node * dcSchema = FindSchemaNode ( xmpTree, kXMP_NS_DC, kXMP_ExistingOnly ); if ( dcSchema == 0 ) return; for ( size_t propNum = 0, propLimit = dcSchema->children.size(); propNum < propLimit; ++propNum ) { XMP_Node * currProp = dcSchema->children[propNum]; XMP_OptionBits arrayForm = 0; if ( ! XMP_PropIsSimple ( currProp->options ) ) continue; // Nothing to do if not simple. if ( (currProp->name == "dc:creator" ) || // See if it is supposed to be an array. (currProp->name == "dc:date" ) ) { // *** Think about an array of char* and a loop. arrayForm = kXMP_PropArrayIsOrdered; } else if ( (currProp->name == "dc:description" ) || (currProp->name == "dc:rights" ) || (currProp->name == "dc:title" ) ) { arrayForm = kXMP_PropArrayIsAltText; } else if ( (currProp->name == "dc:contributor" ) || (currProp->name == "dc:language" ) || (currProp->name == "dc:publisher" ) || (currProp->name == "dc:relation" ) || (currProp->name == "dc:subject" ) || (currProp->name == "dc:type" ) ) { arrayForm = kXMP_PropValueIsArray; } if ( arrayForm == 0 ) continue; // Nothing to do if it isn't supposed to be an array. arrayForm = VerifySetOptions ( arrayForm, 0 ); // Set the implicit array bits. XMP_Node * newArray = new XMP_Node ( dcSchema, currProp->name.c_str(), arrayForm ); dcSchema->children[propNum] = newArray; if ( currProp->value.empty() ) { // Don't add an empty item, leave the array empty. delete ( currProp ); } else { newArray->children.push_back ( currProp ); currProp->parent = newArray; currProp->name = kXMP_ArrayItemName; if ( XMP_ArrayIsAltText ( arrayForm ) && (! (currProp->options & kXMP_PropHasLang)) ) { XMP_Node * newLang = new XMP_Node ( currProp, "xml:lang", "x-default", kXMP_PropIsQualifier ); currProp->options |= (kXMP_PropHasQualifiers | kXMP_PropHasLang); if ( currProp->qualifiers.empty() ) { // *** Need a util? currProp->qualifiers.push_back ( newLang ); } else { currProp->qualifiers.insert ( currProp->qualifiers.begin(), newLang ); } } } } } // NormalizeDCArrays // ------------------------------------------------------------------------------------------------- // CompareAliasedSubtrees // ---------------------- // *** Change to do some alias-specific setup, then use CompareSubtrees. One special case for // *** aliases is a simple to x-default alias, the options and qualifiers obviously differ. static void CompareAliasedSubtrees ( XMP_Node * aliasNode, XMP_Node * baseNode, bool outerCall = true ) { // ! The outermost call is special. The names almost certainly differ. The qualifiers (and // ! hence options) will differ for an alias to the x-default item of a langAlt array. if ( (aliasNode->value != baseNode->value) || (aliasNode->children.size() != baseNode->children.size()) ) { XMP_Throw ( "Mismatch between alias and base nodes", kXMPErr_BadXMP ); } if ( ! outerCall ) { if ( (aliasNode->name != baseNode->name) || (aliasNode->options != baseNode->options) || (aliasNode->qualifiers.size() != baseNode->qualifiers.size()) ) { XMP_Throw ( "Mismatch between alias and base nodes", kXMPErr_BadXMP ); } } for ( size_t childNum = 0, childLim = aliasNode->children.size(); childNum < childLim; ++childNum ) { XMP_Node * aliasChild = aliasNode->children[childNum]; XMP_Node * baseChild = baseNode->children[childNum]; CompareAliasedSubtrees ( aliasChild, baseChild, false ); } for ( size_t qualNum = 0, qualLim = aliasNode->qualifiers.size(); qualNum < qualLim; ++qualNum ) { XMP_Node * aliasQual = aliasNode->qualifiers[qualNum]; XMP_Node * baseQual = baseNode->qualifiers[qualNum]; CompareAliasedSubtrees ( aliasQual, baseQual, false ); } } // CompareAliasedSubtrees // ------------------------------------------------------------------------------------------------- // TransplantArrayItemAlias // ------------------------ static void TransplantArrayItemAlias ( XMP_Node * oldParent, size_t oldNum, XMP_Node * newParent ) { XMP_Node * childNode = oldParent->children[oldNum]; if ( newParent->options & kXMP_PropArrayIsAltText ) { if ( childNode->options & kXMP_PropHasLang ) { XMP_Throw ( "Alias to x-default already has a language qualifier", kXMPErr_BadXMP ); // *** Allow x-default. } childNode->options |= (kXMP_PropHasQualifiers | kXMP_PropHasLang); XMP_Node * langQual = new XMP_Node ( childNode, "xml:lang", "x-default", kXMP_PropIsQualifier ); // *** AddLangQual util? if ( childNode->qualifiers.empty() ) { childNode->qualifiers.push_back ( langQual ); } else { childNode->qualifiers.insert ( childNode->qualifiers.begin(), langQual ); } } oldParent->children.erase ( oldParent->children.begin() + oldNum ); childNode->name = kXMP_ArrayItemName; childNode->parent = newParent; if ( newParent->children.empty() ) { newParent->children.push_back ( childNode ); } else { newParent->children.insert ( newParent->children.begin(), childNode ); } } // TransplantArrayItemAlias // ------------------------------------------------------------------------------------------------- // TransplantNamedAlias // -------------------- static void TransplantNamedAlias ( XMP_Node * oldParent, size_t oldNum, XMP_Node * newParent, XMP_VarString & newName ) { XMP_Node * childNode = oldParent->children[oldNum]; oldParent->children.erase ( oldParent->children.begin() + oldNum ); childNode->name = newName; childNode->parent = newParent; newParent->children.push_back ( childNode ); } // TransplantNamedAlias // ------------------------------------------------------------------------------------------------- // MoveExplicitAliases // ------------------- static void MoveExplicitAliases ( XMP_Node * tree, XMP_OptionBits parseOptions ) { tree->options ^= kXMP_PropHasAliases; const bool strictAliasing = ((parseOptions & kXMP_StrictAliasing) != 0); // Visit all of the top level nodes looking for aliases. If there is no base, transplant the // alias subtree. If there is a base and strict aliasing is on, make sure the alias and base // subtrees match. // ! Use "while" loops not "for" loops since both the schema and property loops can remove the // ! current item from the vector being traversed. And don't increment the counter for a delete. size_t schemaNum = 0; while ( schemaNum < tree->children.size() ) { XMP_Node * currSchema = tree->children[schemaNum]; size_t propNum = 0; while ( propNum < currSchema->children.size() ) { XMP_Node * currProp = currSchema->children[propNum]; if ( ! (currProp->options & kXMP_PropIsAlias) ) { ++propNum; continue; } currProp->options ^= kXMP_PropIsAlias; // Find the base path, look for the base schema and root node. XMP_AliasMapPos aliasPos = sRegisteredAliasMap->find ( currProp->name ); XMP_Assert ( aliasPos != sRegisteredAliasMap->end() ); XMP_ExpandedXPath & basePath = aliasPos->second; XMP_OptionBits arrayOptions = (basePath[kRootPropStep].options & kXMP_PropArrayFormMask); XMP_Node * baseSchema = FindSchemaNode ( tree, basePath[kSchemaStep].step.c_str(), kXMP_CreateNodes ); if ( baseSchema->options & kXMP_NewImplicitNode ) baseSchema->options ^= kXMP_NewImplicitNode; XMP_Node * baseNode = FindChildNode ( baseSchema, basePath[kRootPropStep].step.c_str(), kXMP_ExistingOnly ); if ( baseNode == 0 ) { if ( basePath.size() == 2 ) { // A top-to-top alias, transplant the property. TransplantNamedAlias ( currSchema, propNum, baseSchema, basePath[kRootPropStep].step ); } else { // An alias to an array item, create the array and transplant the property. baseNode = new XMP_Node ( baseSchema, basePath[kRootPropStep].step.c_str(), arrayOptions ); baseSchema->children.push_back ( baseNode ); TransplantArrayItemAlias ( currSchema, propNum, baseNode ); } } else if ( basePath.size() == 2 ) { // The base node does exist and this is a top-to-top alias. Check for conflicts if // strict aliasing is on. Remove and delete the alias subtree. if ( strictAliasing ) CompareAliasedSubtrees ( currProp, baseNode ); currSchema->children.erase ( currSchema->children.begin() + propNum ); delete currProp; } else { // This is an alias to an array item and the array exists. Look for the aliased item. // Then transplant or check & delete as appropriate. XMP_Node * itemNode = 0; if ( arrayOptions & kXMP_PropArrayIsAltText ) { XMP_Index xdIndex = LookupLangItem ( baseNode, *xdefaultName ); if ( xdIndex != -1 ) itemNode = baseNode->children[xdIndex]; } else if ( ! baseNode->children.empty() ) { itemNode = baseNode->children[0]; } if ( itemNode == 0 ) { TransplantArrayItemAlias ( currSchema, propNum, baseNode ); } else { if ( strictAliasing ) CompareAliasedSubtrees ( currProp, itemNode ); currSchema->children.erase ( currSchema->children.begin() + propNum ); delete currProp; } } } // Property loop // Increment the counter or remove an empty schema node. if ( currSchema->children.size() > 0 ) { ++schemaNum; } else { delete tree->children[schemaNum]; // ! Delete the schema node itself. tree->children.erase ( tree->children.begin() + schemaNum ); } } // Schema loop } // MoveExplicitAliases // ------------------------------------------------------------------------------------------------- // FixGPSTimeStamp // --------------- static void FixGPSTimeStamp ( XMP_Node * exifSchema, XMP_Node * gpsDateTime ) { XMP_DateTime binGPSStamp; try { XMPUtils::ConvertToDate ( gpsDateTime->value.c_str(), &binGPSStamp ); } catch ( ... ) { return; // Don't let a bad date stop other things. } if ( (binGPSStamp.year != 0) || (binGPSStamp.month != 0) || (binGPSStamp.day != 0) ) return; XMP_Node * otherDate = FindChildNode ( exifSchema, "exif:DateTimeOriginal", kXMP_ExistingOnly ); if ( otherDate == 0 ) otherDate = FindChildNode ( exifSchema, "exif:DateTimeDigitized", kXMP_ExistingOnly ); if ( otherDate == 0 ) return; XMP_DateTime binOtherDate; try { XMPUtils::ConvertToDate ( otherDate->value.c_str(), &binOtherDate ); } catch ( ... ) { return; // Don't let a bad date stop other things. } binGPSStamp.year = binOtherDate.year; binGPSStamp.month = binOtherDate.month; binGPSStamp.day = binOtherDate.day; XMPUtils::ConvertFromDate ( binGPSStamp, &gpsDateTime->value ); } // FixGPSTimeStamp // ------------------------------------------------------------------------------------------------- // MigrateAudioCopyright // --------------------- // // The initial support for WAV files mapped a legacy ID3 audio copyright into a new xmpDM:copyright // property. This is special case code to migrate that into dc:rights['x-default']. The rules: // // 1. If there is no dc:rights array, or an empty array - // Create one with dc:rights['x-default'] set from double linefeed and xmpDM:copyright. // // 2. If there is a dc:rights array but it has no x-default item - // Create an x-default item as a copy of the first item then apply rule #3. // // 3. If there is a dc:rights array with an x-default item, look for a double linefeed in the value. // A. If no double linefeed, compare the x-default value to the xmpDM:copyright value. // A1. If they match then leave the x-default value alone. // A2. Otherwise, append a double linefeed and the xmpDM:copyright value to the x-default value. // B. If there is a double linefeed, compare the trailing text to the xmpDM:copyright value. // B1. If they match then leave the x-default value alone. // B2. Otherwise, replace the trailing x-default text with the xmpDM:copyright value. // // 4. In all cases, delete the xmpDM:copyright property. static void MigrateAudioCopyright ( XMPMeta * xmp, XMP_Node * dmCopyright ) { try { std::string & dmValue = dmCopyright->value; static const char * kDoubleLF = "\xA\xA"; XMP_Node * dcSchema = FindSchemaNode ( &xmp->tree, kXMP_NS_DC, kXMP_CreateNodes ); XMP_Node * dcRightsArray = FindChildNode ( dcSchema, "dc:rights", kXMP_ExistingOnly ); if ( (dcRightsArray == 0) || dcRightsArray->children.empty() ) { // 1. No dc:rights array, create from double linefeed and xmpDM:copyright. dmValue.insert ( 0, kDoubleLF ); xmp->SetLocalizedText ( kXMP_NS_DC, "rights", "", "x-default", dmValue.c_str(), 0 ); } else { std::string xdefaultStr ( "x-default" ); XMP_Index xdIndex = LookupLangItem ( dcRightsArray, xdefaultStr ); if ( xdIndex < 0 ) { // 2. No x-default item, create from the first item. XMP_StringPtr firstValue = dcRightsArray->children[0]->value.c_str(); xmp->SetLocalizedText ( kXMP_NS_DC, "rights", "", "x-default", firstValue, 0 ); xdIndex = LookupLangItem ( dcRightsArray, xdefaultStr ); } // 3. Look for a double linefeed in the x-default value. XMP_Assert ( xdIndex == 0 ); std::string & defaultValue = dcRightsArray->children[xdIndex]->value; XMP_Index lfPos = defaultValue.find ( kDoubleLF ); if ( lfPos < 0 ) { // 3A. No double LF, compare whole values. if ( dmValue != defaultValue ) { // 3A2. Append the xmpDM:copyright to the x-default item. defaultValue += kDoubleLF; defaultValue += dmValue; } } else { // 3B. Has double LF, compare the tail. if ( defaultValue.compare ( lfPos+2, std::string::npos, dmValue ) != 0 ) { // 3B2. Replace the x-default tail. defaultValue.replace ( lfPos+2, std::string::npos, dmValue ); } } } // 4. Get rid of the xmpDM:copyright. xmp->DeleteProperty ( kXMP_NS_DM, "copyright" ); } catch ( ... ) { // Don't let failures (like a bad dc:rights form) stop other cleanup. } } // MigrateAudioCopyright // ------------------------------------------------------------------------------------------------- // RepairAltText // ------------- // // Make sure that the array is well-formed AltText. Each item must be simple and have an xml:lang // qualifier. If repairs are needed, keep simple non-empty items by adding the xml:lang. static void RepairAltText ( XMP_Node & tree, XMP_StringPtr schemaNS, XMP_StringPtr arrayName ) { XMP_Node * schemaNode = FindSchemaNode ( &tree, schemaNS, kXMP_ExistingOnly ); if ( schemaNode == 0 ) return; XMP_Node * arrayNode = FindChildNode ( schemaNode, arrayName, kXMP_ExistingOnly ); if ( (arrayNode == 0) || XMP_ArrayIsAltText ( arrayNode->options ) ) return; // Already OK. if ( ! XMP_PropIsArray ( arrayNode->options ) ) return; // ! Not even an array, leave it alone. // *** Should probably change simple values to LangAlt with 'x-default' item. arrayNode->options |= (kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate | kXMP_PropArrayIsAltText); for ( int i = arrayNode->children.size()-1; i >= 0; --i ) { // ! Need a signed index type. XMP_Node * currChild = arrayNode->children[i]; if ( ! XMP_PropIsSimple ( currChild->options ) ) { // Delete non-simple children. delete ( currChild ); arrayNode->children.erase ( arrayNode->children.begin() + i ); } else if ( ! XMP_PropHasLang ( currChild->options ) ) { if ( currChild->value.empty() ) { // Delete empty valued children that have no xml:lang. delete ( currChild ); arrayNode->children.erase ( arrayNode->children.begin() + i ); } else { // Add an xml:lang qualifier with the value "x-repair". XMP_Node * repairLang = new XMP_Node ( currChild, "xml:lang", "x-repair", kXMP_PropIsQualifier ); if ( currChild->qualifiers.empty() ) { currChild->qualifiers.push_back ( repairLang ); } else { currChild->qualifiers.insert ( currChild->qualifiers.begin(), repairLang ); } currChild->options |= (kXMP_PropHasQualifiers | kXMP_PropHasLang); } } } } // RepairAltText // ------------------------------------------------------------------------------------------------- // TouchUpDataModel // ---------------- static void TouchUpDataModel ( XMPMeta * xmp ) { XMP_Node & tree = xmp->tree; // Do special case touch ups for certain schema. XMP_Node * currSchema = 0; currSchema = FindSchemaNode ( &tree, kXMP_NS_EXIF, kXMP_ExistingOnly ); if ( currSchema != 0 ) { // Do a special case fix for exif:GPSTimeStamp. XMP_Node * gpsDateTime = FindChildNode ( currSchema, "exif:GPSTimeStamp", kXMP_ExistingOnly ); if ( gpsDateTime != 0 ) FixGPSTimeStamp ( currSchema, gpsDateTime ); // *** Should probably have RepairAltText change simple values to LangAlt with 'x-default' item. // *** For now just do this for exif:UserComment, the one case we know about, late in cycle fix. XMP_Node * userComment = FindChildNode ( currSchema, "exif:UserComment", kXMP_ExistingOnly ); if ( (userComment != 0) && XMP_PropIsSimple ( userComment->options ) ) { XMP_Node * newChild = new XMP_Node ( userComment, kXMP_ArrayItemName, userComment->value.c_str(), userComment->options ); newChild->qualifiers.swap ( userComment->qualifiers ); if ( ! XMP_PropHasLang ( newChild->options ) ) { XMP_Node * langQual = new XMP_Node ( newChild, "xml:lang", "x-default", kXMP_PropIsQualifier ); newChild->qualifiers.insert ( newChild->qualifiers.begin(), langQual ); newChild->options |= (kXMP_PropHasQualifiers | kXMP_PropHasLang); } userComment->value.erase(); userComment->options = kXMP_PropArrayFormMask; // ! Happens to have all the right bits. userComment->children.push_back ( newChild ); } } currSchema = FindSchemaNode ( &tree, kXMP_NS_DM, kXMP_ExistingOnly ); if ( currSchema != 0 ) { // Do a special case migration of xmpDM:copyright to dc:rights['x-default']. Do this before // the dc: touch up since it can affect the dc: schema. XMP_Node * dmCopyright = FindChildNode ( currSchema, "xmpDM:copyright", kXMP_ExistingOnly ); if ( dmCopyright != 0 ) MigrateAudioCopyright ( xmp, dmCopyright ); } currSchema = FindSchemaNode ( &tree, kXMP_NS_DC, kXMP_ExistingOnly ); if ( currSchema != 0 ) { // Do a special case fix for dc:subject, make sure it is an unordered array. XMP_Node * dcSubject = FindChildNode ( currSchema, "dc:subject", kXMP_ExistingOnly ); if ( dcSubject != 0 ) { XMP_OptionBits keepMask = ~(kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate | kXMP_PropArrayIsAltText); dcSubject->options &= keepMask; // Make sure any ordered array bits are clear. } } // Fix any broken AltText arrays that we know about. RepairAltText ( tree, kXMP_NS_DC, "dc:description" ); // ! Note inclusion of prefixes for direct node lookup! RepairAltText ( tree, kXMP_NS_DC, "dc:rights" ); RepairAltText ( tree, kXMP_NS_DC, "dc:title" ); RepairAltText ( tree, kXMP_NS_XMP_Rights, "xmpRights:UsageTerms" ); RepairAltText ( tree, kXMP_NS_EXIF, "exif:UserComment" ); // Tweak old XMP: Move an instance ID from rdf:about to the xmpMM:InstanceID property. An old // instance ID usually looks like "uuid:bac965c4-9d87-11d9-9a30-000d936b79c4", plus InDesign // 3.0 wrote them like "bac965c4-9d87-11d9-9a30-000d936b79c4". If the name looks like a UUID // simply move it to xmpMM:InstanceID, don't worry about any existing xmpMM:InstanceID. Both // will only be present when a newer file with the xmpMM:InstanceID property is updated by an // old app that uses rdf:about. if ( ! tree.name.empty() ) { bool nameIsUUID = false; XMP_StringPtr nameStr = tree.name.c_str(); if ( XMP_LitNMatch ( nameStr, "uuid:", 5 ) ) { nameIsUUID = true; } else if ( tree.name.size() == 36 ) { nameIsUUID = true; // ! Assume true, we'll set it to false below if not. for ( int i = 0; i < 36; ++i ) { char ch = nameStr[i]; if ( ch == '-' ) { if ( (i == 8) || (i == 13) || (i == 18) || (i == 23) ) continue; nameIsUUID = false; break; } else { if ( (('0' <= ch) && (ch <= '9')) || (('a' <= ch) && (ch <= 'z')) ) continue; nameIsUUID = false; break; } } } if ( nameIsUUID ) { XMP_ExpandedXPath expPath; ExpandXPath ( kXMP_NS_XMP_MM, "InstanceID", &expPath ); XMP_Node * idNode = FindNode ( &tree, expPath, kXMP_CreateNodes, 0 ); if ( idNode == 0 ) XMP_Throw ( "Failure creating xmpMM:InstanceID", kXMPErr_InternalFailure ); idNode->options = 0; // Clobber any existing xmpMM:InstanceID. idNode->value = tree.name; idNode->RemoveChildren(); idNode->RemoveQualifiers(); tree.name.erase(); } } } // TouchUpDataModel // ------------------------------------------------------------------------------------------------- // DetermineInputEncoding // ---------------------- // // Try to determine the character encoding, making a guess if the input is too short. We make some // simplifying assumtions: the first character must be U+FEFF or ASCII, U+0000 is not allowed. The // XML 1.1 spec is even more strict, UTF-16 XML documents must begin with U+FEFF, and the first // "real" character must be '<'. Ignoring the XML declaration, the first XML character could be '<', // space, tab, CR, or LF. // // The possible input sequences are: // // Cases with U+FEFF // EF BB BF -- - UTF-8 // FE FF -- -- - Big endian UTF-16 // 00 00 FE FF - Big endian UTF 32 // FF FE 00 00 - Little endian UTF-32 // FF FE -- -- - Little endian UTF-16 // // Cases with ASCII // nn mm -- -- - UTF-8 - // 00 00 00 nn - Big endian UTF-32 // 00 nn -- -- - Big endian UTF-16 // nn 00 00 00 - Little endian UTF-32 // nn 00 -- -- - Little endian UTF-16 // // ! We don't check for full patterns, or for errors. We just check enough to determine what the // ! only possible (or reasonable) case would be. static XMP_OptionBits DetermineInputEncoding ( const XMP_Uns8 * buffer, size_t length ) { if ( length < 2 ) return kXMP_EncodeUTF8; XMP_Uns8 * uniChar = (XMP_Uns8*)buffer; // ! Make sure comparisons are unsigned. if ( uniChar[0] == 0 ) { // These cases are: // 00 nn -- -- - Big endian UTF-16 // 00 00 00 nn - Big endian UTF-32 // 00 00 FE FF - Big endian UTF 32 if ( (length < 4) || (uniChar[1] != 0) ) return kXMP_EncodeUTF16Big; return kXMP_EncodeUTF32Big; } else if ( uniChar[0] < 0x80 ) { // These cases are: // nn mm -- -- - UTF-8, includes EF BB BF case // nn 00 00 00 - Little endian UTF-32 // nn 00 -- -- - Little endian UTF-16 if ( uniChar[1] != 0 ) return kXMP_EncodeUTF8; if ( (length < 4) || (uniChar[2] != 0) ) return kXMP_EncodeUTF16Little; return kXMP_EncodeUTF32Little; } else { // These cases are: // EF BB BF -- - UTF-8 // FE FF -- -- - Big endian UTF-16 // FF FE 00 00 - Little endian UTF-32 // FF FE -- -- - Little endian UTF-16 if ( uniChar[0] == 0xEF ) return kXMP_EncodeUTF8; if ( uniChar[0] == 0xFE ) return kXMP_EncodeUTF16Big; if ( (length < 4) || (uniChar[2] != 0) ) return kXMP_EncodeUTF16Little; return kXMP_EncodeUTF32Little; } } // DetermineInputEncoding // ------------------------------------------------------------------------------------------------- // CountUTF8 // --------- // // Look for a valid multi-byte UTF-8 sequence and return its length. Returns 0 for an invalid UTF-8 // sequence. Returns a negative value for a partial valid sequence at the end of the buffer. // // The checking is not strict. We simply count the number of high order 1 bits in the first byte, // then look for n-1 following bytes whose high order 2 bits are 1 and 0. We do not check for a // minimal length representation of the codepoint, or that the codepoint is defined by Unicode. static int CountUTF8 ( const XMP_Uns8 * charStart, const XMP_Uns8 * bufEnd ) { XMP_Assert ( charStart < bufEnd ); // Catch this in debug builds. if ( charStart >= bufEnd ) return 0; // Don't run-on in release builds. if ( (*charStart & 0xC0) != 0xC0 ) return 0; // Must have at least 2 high bits set. int byteCount = 2; XMP_Uns8 firstByte = *charStart; for ( firstByte = firstByte << 2; (firstByte & 0x80) != 0; firstByte = firstByte << 1 ) ++byteCount; if ( (charStart + byteCount) > bufEnd ) return -byteCount; for ( int i = 1; i < byteCount; ++i ) { if ( (charStart[i] & 0xC0) != 0x80 ) return 0; } return byteCount; } // CountUTF8 // ------------------------------------------------------------------------------------------------- // CountControlEscape // ------------------ // // Look for a numeric escape sequence for a "prohibited" ASCII control character. These are 0x7F, // and the range 0x00..0x1F except for tab/LF/CR. Return 0 if this is definitely not a numeric // escape, the length of the escape if found, or a negative value for a partial escape. static int CountControlEscape ( const XMP_Uns8 * escStart, const XMP_Uns8 * bufEnd ) { XMP_Assert ( escStart < bufEnd ); // Catch this in debug builds. if ( escStart >= bufEnd ) return 0; // Don't run-on in release builds. XMP_Assert ( *escStart == '&' ); size_t tailLen = bufEnd - escStart; if ( tailLen < 5 ) return -1; // Don't need a more thorough check, we'll catch it on the next pass. if ( strncmp ( (char*)escStart, "&#x", 3 ) != 0 ) return 0; XMP_Uns8 escValue = 0; const XMP_Uns8 * escPos = escStart + 3; if ( ('0' <= *escPos) && (*escPos <= '9') ) { escValue = *escPos - '0'; ++escPos; } else if ( ('A' <= *escPos) && (*escPos <= 'F') ) { escValue = *escPos - 'A' + 10; ++escPos; } else if ( ('a' <= *escPos) && (*escPos <= 'f') ) { escValue = *escPos - 'a' + 10; ++escPos; } if ( ('0' <= *escPos) && (*escPos <= '9') ) { escValue = (escValue << 4) + (*escPos - '0'); ++escPos; } else if ( ('A' <= *escPos) && (*escPos <= 'F') ) { escValue = (escValue << 4) + (*escPos - 'A' + 10); ++escPos; } else if ( ('a' <= *escPos) && (*escPos <= 'f') ) { escValue = (escValue << 4) + (*escPos - 'a' + 10); ++escPos; } if ( escPos == bufEnd ) return -1; // Partial escape. if ( *escPos != ';' ) return 0; size_t escLen = escPos - escStart + 1; if ( escLen < 5 ) return 0; // ! Catch "&#x;". if ( (escValue == kTab) || (escValue == kLF) || (escValue == kCR) ) return 0; // An allowed escape. return escLen; // Found a full "prohibited" numeric escape. } // CountControlEscape // ------------------------------------------------------------------------------------------------- // ProcessUTF8Portion // ------------------ // // Early versions of the XMP spec mentioned allowing ISO Latin-1 input. There are also problems with // some clients placing ASCII control characters within XMP values. This is an XML problem, the XML // spec only allows tab (0x09), LF (0x0A), and CR (0x0D) from the 0x00..0x1F range. As a concession // to this we scan 8-bit input for byte sequences that are not valid UTF-8 or in the 0x00..0x1F // range and replace each byte as follows: // 0x00..0x1F - Replace with a space, except for tab, CR, and LF. // 0x7F - Replace with a space. This is ASCII Delete, not allowed by ISO Latin-1. // 0x80..0x9F - Replace with the UTF-8 for a corresponding Unicode character. // 0xA0..0XFF - Replace with the UTF-8 for a corresponding Unicode character. // // The 0x80..0x9F range is not defined by Latin-1. But the Windows 1252 code page defines these and // is otherwise the same as Latin-1. // // For at least historical compatibility reasons we also find and replace singly escaped ASCII // control characters. The Expat parser we're using does not allow numeric escapes like "". // The XML spec is clear that raw controls are not allowed (in the RestrictedChar set), but it isn't // as clear about numeric escapes for them. At any rate, Expat complains, so we treat the numeric // escapes like raw characters and replace them with a space. // // We check for 1 or 2 hex digits (" " or " ") and upper or lower case (" " or " "). // The full escape sequence is 5 or 6 bytes. static size_t ProcessUTF8Portion ( XMLParserAdapter * xmlParser, const XMP_Uns8 * buffer, size_t length, bool last ) { const XMP_Uns8 * bufEnd = buffer + length; const XMP_Uns8 * spanStart = buffer; const XMP_Uns8 * spanEnd; for ( spanEnd = spanStart; spanEnd < bufEnd; ++spanEnd ) { if ( (0x20 <= *spanEnd) && (*spanEnd <= 0x7E) && (*spanEnd != '&') ) continue; // A regular ASCII character. if ( *spanEnd >= 0x80 ) { // See if this is a multi-byte UTF-8 sequence, or a Latin-1 character to replace. int uniLen = CountUTF8 ( spanEnd, bufEnd ); if ( uniLen > 0 ) { // A valid UTF-8 character, keep it as-is. spanEnd += uniLen - 1; // ! The loop increment will put back the +1. } else if ( (uniLen < 0) && (! last) ) { // Have a partial UTF-8 character at the end of the buffer and more input coming. xmlParser->ParseBuffer ( spanStart, (spanEnd - spanStart), false ); return (spanEnd - buffer); } else { // Not a valid UTF-8 sequence. Replace the first byte with the Latin-1 equivalent. xmlParser->ParseBuffer ( spanStart, (spanEnd - spanStart), false ); const char * replacement = kReplaceLatin1 [ *spanEnd - 0x80 ]; xmlParser->ParseBuffer ( replacement, strlen ( replacement ), false ); spanStart = spanEnd + 1; // ! The loop increment will do "spanEnd = spanStart". } } else if ( (*spanEnd < 0x20) || (*spanEnd == 0x7F) ) { // Replace ASCII controls other than tab, LF, and CR with a space. if ( (*spanEnd == kTab) || (*spanEnd == kLF) || (*spanEnd == kCR) ) continue; xmlParser->ParseBuffer ( spanStart, (spanEnd - spanStart), false ); xmlParser->ParseBuffer ( " ", 1, false ); spanStart = spanEnd + 1; // ! The loop increment will do "spanEnd = spanStart". } else { // See if this is a numeric escape sequence for a prohibited ASCII control. XMP_Assert ( *spanEnd == '&' ); int escLen = CountControlEscape ( spanEnd, bufEnd ); if ( escLen < 0 ) { // Have a partial numeric escape in this buffer, wait for more input. if ( last ) continue; // No more buffers, not an escape, absorb as normal input. xmlParser->ParseBuffer ( spanStart, (spanEnd - spanStart), false ); return (spanEnd - buffer); } else if ( escLen > 0 ) { // Have a complete numeric escape to replace. xmlParser->ParseBuffer ( spanStart, (spanEnd - spanStart), false ); xmlParser->ParseBuffer ( " ", 1, false ); spanStart = spanEnd + escLen; spanEnd = spanStart - 1; // ! The loop continuation will increment spanEnd! } } } XMP_Assert ( spanEnd == bufEnd ); if ( spanStart < bufEnd ) xmlParser->ParseBuffer ( spanStart, (spanEnd - spanStart), false ); if ( last ) xmlParser->ParseBuffer ( " ", 1, true ); return length; } // ProcessUTF8Portion // ------------------------------------------------------------------------------------------------- // ParseFromBuffer // --------------- // // Although most clients will probably parse everything in one call, we have a buffered API model // and need to support even the extreme case of 1 byte at a time parsing. This is considerably // complicated by some special cases for 8-bit input. Because of this, the first thing we do is // determine whether the input is 8-bit, UTF-16, or UTF-32. // // Both the 8-bit special cases and the encoding determination are easier to do with 8 bytes or more // of input. The XMLParserAdapter class has a pending-input buffer for this. At the start of parsing // we (moght) try to fill this buffer before determining the input character encoding. After that, // we (might) use this buffer with the current input to simplify the logic in Process8BitInput. The // "(might)" part means that we don't actually use the pending-input buffer unless we have to. In // particular, the common case of single-buffer parsing won't use it. void XMPMeta::ParseFromBuffer ( XMP_StringPtr buffer, XMP_StringLen xmpSize, XMP_OptionBits options ) { if ( (buffer == 0) && (xmpSize != 0) ) XMP_Throw ( "Null parse buffer", kXMPErr_BadParam ); if ( xmpSize == kXMP_UseNullTermination ) xmpSize = strlen ( buffer ); const bool lastClientCall = ((options & kXMP_ParseMoreBuffers) == 0); // *** Could use FlagIsSet & FlagIsClear macros. this->tree.ClearNode(); // Make sure the target XMP object is totally empty. if ( this->xmlParser == 0 ) { if ( (xmpSize == 0) && lastClientCall ) return; // Tolerate empty parse. Expat complains if there are no XML elements. this->xmlParser = XMP_NewExpatAdapter ( ExpatAdapter::kUseGlobalNamespaces ); } XMLParserAdapter& parser = *this->xmlParser; #if 0 // XMP_DebugBuild if ( parser.parseLog != 0 ) { char message [200]; // AUDIT: Using sizeof(message) below for snprintf length is safe. snprintf ( message, sizeof(message), "", // AUDIT: See above. xmpSize, options, (lastClientCall ? " (last)" : "") ); fwrite ( message, 1, strlen(message), parser.parseLog ); fflush ( parser.parseLog ); } #endif try { // Cleanup the tree and xmlParser if anything fails. // Determine the character encoding before doing any real parsing. This is needed to do the // 8-bit special processing. if ( parser.charEncoding == XMP_OptionBits(-1) ) { if ( (parser.pendingCount == 0) && (xmpSize >= kXMLPendingInputMax) ) { // This ought to be the common case, the first buffer is big enough. parser.charEncoding = DetermineInputEncoding ( (XMP_Uns8*)buffer, xmpSize ); } else { // Try to fill the pendingInput buffer before calling DetermineInputEncoding. size_t pendingOverlap = kXMLPendingInputMax - parser.pendingCount; if ( pendingOverlap > xmpSize ) pendingOverlap = xmpSize; memcpy ( &parser.pendingInput[parser.pendingCount], buffer, pendingOverlap ); // AUDIT: Count is safe. buffer += pendingOverlap; xmpSize -= pendingOverlap; parser.pendingCount += pendingOverlap; if ( (! lastClientCall) && (parser.pendingCount < kXMLPendingInputMax) ) return; parser.charEncoding = DetermineInputEncoding ( parser.pendingInput, parser.pendingCount ); #if Trace_ParsingHackery fprintf ( stderr, "XMP Character encoding is %d\n", parser.charEncoding ); #endif } } // We have the character encoding. Process UTF-16 and UTF-32 as is. UTF-8 needs special // handling to take care of things like ISO Latin-1 or unescaped ASCII controls. XMP_Assert ( parser.charEncoding != XMP_OptionBits(-1) ); if ( parser.charEncoding != kXMP_EncodeUTF8 ) { if ( parser.pendingCount > 0 ) { // Might have pendingInput from the above portion to determine the character encoding. parser.ParseBuffer ( parser.pendingInput, parser.pendingCount, false ); } parser.ParseBuffer ( buffer, xmpSize, lastClientCall ); } else { #if Trace_ParsingHackery fprintf ( stderr, "Parsing %d bytes @ %.8X, %s, %d pending, context: %.8s\n", xmpSize, buffer, (lastClientCall ? "last" : "not last"), parser.pendingCount, buffer ); #endif // The UTF-8 processing is a bit complex due to the need to tolerate ISO Latin-1 input. // This is done by scanning the input for byte sequences that are not valid UTF-8, // assuming they are Latin-1 characters in the range 0x80..0xFF. This requires saving a // pending input buffer to handle partial UTF-8 sequences at the end of a buffer. while ( parser.pendingCount > 0 ) { // We've got some leftover input, process it first then continue with the current // buffer. Try to fill the pendingInput buffer before parsing further. We use a loop // for wierd edge cases like a 2 byte input buffer, using 1 byte for pendingInput, // then having a partial UTF-8 end and need to absorb more. size_t pendingOverlap = kXMLPendingInputMax - parser.pendingCount; if ( pendingOverlap > xmpSize ) pendingOverlap = xmpSize; memcpy ( &parser.pendingInput[parser.pendingCount], buffer, pendingOverlap ); // AUDIT: Count is safe. parser.pendingCount += pendingOverlap; buffer += pendingOverlap; xmpSize -= pendingOverlap; if ( (! lastClientCall) && (parser.pendingCount < kXMLPendingInputMax) ) return; size_t bytesDone = ProcessUTF8Portion ( &parser, parser.pendingInput, parser.pendingCount, lastClientCall ); size_t bytesLeft = parser.pendingCount - bytesDone; #if Trace_ParsingHackery fprintf ( stderr, " ProcessUTF8Portion handled %d pending bytes\n", bytesDone ); #endif if ( bytesDone == parser.pendingCount ) { // Done with all of the pending input, move on to the current buffer. parser.pendingCount = 0; } else if ( bytesLeft <= pendingOverlap ) { // The leftover pending input all came from the current buffer. Exit this loop. buffer -= bytesLeft; xmpSize += bytesLeft; parser.pendingCount = 0; } else if ( xmpSize > 0 ) { // Pull more of the current buffer into the pending input and try again. // Backup by this pass's overlap so the loop entry code runs OK. parser.pendingCount -= pendingOverlap; buffer -= pendingOverlap; xmpSize += pendingOverlap; } else { // There is no more of the current buffer. Wait for more. Partial sequences at // the end of the last buffer should be treated as Latin-1 by ProcessUTF8Portion. XMP_Assert ( ! lastClientCall ); parser.pendingCount = bytesLeft; memcpy ( &parser.pendingInput[0], &parser.pendingInput[bytesDone], bytesLeft ); // AUDIT: Count is safe. return; } } // Done with the pending input, process the current buffer. size_t bytesDone = ProcessUTF8Portion ( &parser, (XMP_Uns8*)buffer, xmpSize, lastClientCall ); #if Trace_ParsingHackery fprintf ( stderr, " ProcessUTF8Portion handled %d additional bytes\n", bytesDone ); #endif if ( bytesDone < xmpSize ) { XMP_Assert ( ! lastClientCall ); size_t bytesLeft = xmpSize - bytesDone; if ( bytesLeft > kXMLPendingInputMax ) XMP_Throw ( "Parser bytesLeft too large", kXMPErr_InternalFailure ); memcpy ( parser.pendingInput, &buffer[bytesDone], bytesLeft ); // AUDIT: Count is safe. parser.pendingCount = bytesLeft; return; // Wait for the next buffer. } } if ( lastClientCall ) { #if XMP_DebugBuild && DumpXMLParseTree if ( parser.parseLog == 0 ) parser.parseLog = stdout; DumpXMLTree ( parser.parseLog, parser.tree, 0 ); #endif const XML_Node * xmlRoot = FindRootNode ( this, *this->xmlParser, options ); if ( xmlRoot != 0 ) { ProcessRDF ( &this->tree, *xmlRoot, options ); NormalizeDCArrays ( &this->tree ); if ( this->tree.options & kXMP_PropHasAliases ) MoveExplicitAliases ( &this->tree, options ); TouchUpDataModel ( this ); // Delete empty schema nodes. Do this last, other cleanup can make empty schema. size_t schemaNum = 0; while ( schemaNum < this->tree.children.size() ) { XMP_Node * currSchema = this->tree.children[schemaNum]; if ( currSchema->children.size() > 0 ) { ++schemaNum; } else { delete this->tree.children[schemaNum]; // ! Delete the schema node itself. this->tree.children.erase ( this->tree.children.begin() + schemaNum ); } } } delete this->xmlParser; this->xmlParser = 0; } } catch ( ... ) { delete this->xmlParser; this->xmlParser = 0; prevTkVer = 0; this->tree.ClearNode(); throw; } } // ParseFromBuffer // ================================================================================================= exempi-2.2.1/source/XMPCore/XMPMeta-Serialize.cpp0000664000175000017500000013064712150230672016420 00000000000000// ================================================================================================= // Copyright 2003-2009 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // Adobe patent application tracking #P435, entitled 'Unique markers to simplify embedding data of // one format in a file with a different format', inventors: Sean Parent, Greg Gilley. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include! #include "XMPCore_Impl.hpp" #include "XMPMeta.hpp" #include "XMP_Version.h" #include "UnicodeInlines.incl_cpp" #include "UnicodeConversions.hpp" #if XMP_DebugBuild #include #endif using namespace std; #if XMP_WinBuild #pragma warning ( disable : 4533 ) // initialization of '...' is skipped by 'goto ...' #pragma warning ( disable : 4702 ) // unreachable code #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #endif // *** Use the XMP_PropIsXyz (Schema, Simple, Struct, Array, ...) macros // *** Add debug codegen checks, e.g. that typical masking operations really work // *** Change all uses of strcmp and strncmp to XMP_LitMatch and XMP_LitNMatch // ================================================================================================= // Local Types and Constants // ========================= static const char * kPacketHeader = ""; static const char * kPacketTrailer = ""; // ! The w/r is at [size-4]. static const char * kTXMP_SchemaGroup = "XMP_SchemaGroup"; static const char * kRDF_XMPMetaStart = ""; static const char * kRDF_RDFEnd = ""; static const char * kRDF_SchemaStart = ""; static const char * kRDF_StructStart = ""; static const char * kRDF_StructEnd = ""; static const char * kRDF_BagStart = ""; static const char * kRDF_BagEnd = ""; static const char * kRDF_SeqStart = ""; static const char * kRDF_SeqEnd = ""; static const char * kRDF_AltStart = ""; static const char * kRDF_AltEnd = ""; static const char * kRDF_ItemStart = ""; static const char * kRDF_ItemEnd = ""; static const char * kRDF_ValueStart = ""; static const char * kRDF_ValueEnd = ""; // ================================================================================================= // Static Variables // ================ // ================================================================================================= // Local Utilities // =============== // ------------------------------------------------------------------------------------------------- // EstimateRDFSize // --------------- // *** Pull the strlen(kXyz) calls into constants. static size_t EstimateRDFSize ( const XMP_Node * currNode, XMP_Index indent, size_t indentLen ) { size_t outputLen = 2 * (indent*indentLen + currNode->name.size() + 4); // The property element tags. if ( ! currNode->qualifiers.empty() ) { // This node has qualifiers, assume it is written using rdf:value and estimate the qualifiers. indent += 2; // Everything else is indented inside the rdf:Description element. outputLen += 2 * ((indent-1)*indentLen + strlen(kRDF_StructStart) + 2); // The rdf:Description tags. outputLen += 2 * (indent*indentLen + strlen(kRDF_ValueStart) + 2); // The rdf:value tags. for ( size_t qualNum = 0, qualLim = currNode->qualifiers.size(); qualNum < qualLim; ++qualNum ) { const XMP_Node * currQual = currNode->qualifiers[qualNum]; outputLen += EstimateRDFSize ( currQual, indent, indentLen ); } } if ( currNode->options & kXMP_PropValueIsStruct ) { indent += 1; outputLen += 2 * (indent*indentLen + strlen(kRDF_StructStart) + 2); // The rdf:Description tags. } else if ( currNode->options & kXMP_PropValueIsArray ) { indent += 2; outputLen += 2 * ((indent-1)*indentLen + strlen(kRDF_BagStart) + 2); // The rdf:Bag/Seq/Alt tags. outputLen += 2 * currNode->children.size() * (strlen(kRDF_ItemStart) + 2); // The rdf:li tags, indent counted in children. } else if ( ! (currNode->options & kXMP_SchemaNode) ) { outputLen += currNode->value.size(); // This is a leaf value node. } for ( size_t childNum = 0, childLim = currNode->children.size(); childNum < childLim; ++childNum ) { const XMP_Node * currChild = currNode->children[childNum]; outputLen += EstimateRDFSize ( currChild, indent+1, indentLen ); } return outputLen; } // EstimateRDFSize // ------------------------------------------------------------------------------------------------- // DeclareOneNamespace // ------------------- static void DeclareOneNamespace ( XMP_StringPtr nsPrefix, XMP_StringPtr nsURI, XMP_VarString & usedNS, // ! A catenation of the prefixes with colons. XMP_VarString & outputStr, XMP_StringPtr newline, XMP_StringPtr indentStr, XMP_Index indent ) { size_t nsPos = usedNS.find ( nsPrefix ); if ( nsPos == XMP_VarString::npos ) { outputStr += newline; for ( ; indent > 0; --indent ) outputStr += indentStr; outputStr += "xmlns:"; outputStr += nsPrefix; outputStr[outputStr.size()-1] = '='; // Change the colon to =. outputStr += '"'; outputStr += nsURI; outputStr += '"'; usedNS += nsPrefix; } } // DeclareOneNamespace // ------------------------------------------------------------------------------------------------- // DeclareElemNamespace // -------------------- static void DeclareElemNamespace ( const XMP_VarString & elemName, XMP_VarString & usedNS, XMP_VarString & outputStr, XMP_StringPtr newline, XMP_StringPtr indentStr, XMP_Index indent ) { size_t colonPos = elemName.find ( ':' ); if ( colonPos != XMP_VarString::npos ) { XMP_VarString nsPrefix ( elemName.substr ( 0, colonPos+1 ) ); XMP_StringPtr nsURI; bool nsFound = sRegisteredNamespaces->GetURI ( nsPrefix.c_str(), &nsURI, 0 ); XMP_Enforce ( nsFound ); DeclareOneNamespace ( nsPrefix.c_str(), nsURI, usedNS, outputStr, newline, indentStr, indent ); } } // DeclareElemNamespace // ------------------------------------------------------------------------------------------------- // DeclareUsedNamespaces // --------------------- static void DeclareUsedNamespaces ( const XMP_Node * currNode, XMP_VarString & usedNS, XMP_VarString & outputStr, XMP_StringPtr newline, XMP_StringPtr indentStr, XMP_Index indent ) { if ( currNode->options & kXMP_SchemaNode ) { // The schema node name is the URI, the value is the prefix. DeclareOneNamespace ( currNode->value.c_str(), currNode->name.c_str(), usedNS, outputStr, newline, indentStr, indent ); } else if ( currNode->options & kXMP_PropValueIsStruct ) { for ( size_t fieldNum = 0, fieldLim = currNode->children.size(); fieldNum < fieldLim; ++fieldNum ) { const XMP_Node * currField = currNode->children[fieldNum]; DeclareElemNamespace ( currField->name, usedNS, outputStr, newline, indentStr, indent ); } } for ( size_t childNum = 0, childLim = currNode->children.size(); childNum < childLim; ++childNum ) { const XMP_Node * currChild = currNode->children[childNum]; DeclareUsedNamespaces ( currChild, usedNS, outputStr, newline, indentStr, indent ); } for ( size_t qualNum = 0, qualLim = currNode->qualifiers.size(); qualNum < qualLim; ++qualNum ) { const XMP_Node * currQual = currNode->qualifiers[qualNum]; DeclareElemNamespace ( currQual->name, usedNS, outputStr, newline, indentStr, indent ); DeclareUsedNamespaces ( currQual, usedNS, outputStr, newline, indentStr, indent ); } } // DeclareUsedNamespaces // ------------------------------------------------------------------------------------------------- // EmitRDFArrayTag // --------------- enum { kIsStartTag = true, kIsEndTag = false }; static void EmitRDFArrayTag ( XMP_OptionBits arrayForm, XMP_VarString & outputStr, XMP_StringPtr newline, XMP_StringPtr indentStr, XMP_Index indent, XMP_Index arraySize, bool isStartTag ) { if ( (! isStartTag) && (arraySize == 0) ) return; for ( XMP_Index level = indent; level > 0; --level ) outputStr += indentStr; if ( isStartTag ) { outputStr += "', and ASCII controls (tab, LF, CR). In // addition, '"' is escaped for attributes. For efficiency, this is done in a double loop. The outer // loop makes sure the whole value is processed. The inner loop does a contiguous unescaped run // followed by one escaped character (if we're not at the end). // // We depend on parsing and SetProperty logic to make sure there are no invalid ASCII controls in // the XMP values. The XML spec only allows tab, LF, and CR. Others are not even allowed as // numeric escape sequences. enum { kForAttribute = true, kForElement = false }; static void AppendNodeValue ( XMP_VarString & outputStr, const XMP_VarString & value, bool forAttribute ) { unsigned char * runStart = (unsigned char *) value.c_str(); unsigned char * runLimit = runStart + value.size(); unsigned char * runEnd; unsigned char ch; while ( runStart < runLimit ) { for ( runEnd = runStart; runEnd < runLimit; ++runEnd ) { ch = *runEnd; if ( forAttribute && (ch == '"') ) break; if ( (ch < 0x20) || (ch == '&') || (ch == '<') || (ch == '>') ) break; } outputStr.append ( (char *) runStart, (runEnd - runStart) ); if ( runEnd < runLimit ) { if ( ch < 0x20 ) { XMP_Assert ( (ch == kTab) || (ch == kLF) || (ch == kCR) ); char hexBuf[16]; memcpy ( hexBuf, "&#xn;", 10 ); // AUDIT: Length of "&#xn;" is 5, hexBuf size is 16. hexBuf[3] = kHexDigits[ch&0xF]; outputStr.append ( hexBuf, 5 ); } else { if ( ch == '"' ) { outputStr += """; } else if ( ch == '<' ) { outputStr += "<"; } else if ( ch == '>' ) { outputStr += ">"; } else { XMP_Assert ( ch == '&' ); outputStr += "&"; } } ++runEnd; } runStart = runEnd; } } // AppendNodeValue // ------------------------------------------------------------------------------------------------- // CanBeRDFAttrProp // ---------------- static bool CanBeRDFAttrProp ( const XMP_Node * propNode ) { if ( propNode->name[0] == '[' ) return false; if ( ! propNode->qualifiers.empty() ) return false; if ( propNode->options & kXMP_PropValueIsURI ) return false; if ( propNode->options & kXMP_PropCompositeMask ) return false; return true; } // CanBeRDFAttrProp // ------------------------------------------------------------------------------------------------- // IsRDFAttrQualifier // ------------------ static XMP_StringPtr sAttrQualifiers[] = { "xml:lang", "rdf:resource", "rdf:ID", "rdf:bagID", "rdf:nodeID", "" }; static bool IsRDFAttrQualifier ( XMP_VarString qualName ) { for ( size_t i = 0; *sAttrQualifiers[i] != 0; ++i ) { if ( qualName == sAttrQualifiers[i] ) return true; } return false; } // IsRDFAttrQualifier // ------------------------------------------------------------------------------------------------- // SerializePrettyRDFProperty // -------------------------- // // Recursively handles the "value" for a node. It does not matter if it is a top level property, a // field of a struct, or an item of an array. The indent is that for the property element. An // xml:lang qualifier is written as an attribute of the property start tag, not by itself forcing // the qualified property form. The patterns below mostly ignore attribute qualifiers like xml:lang. // Except for the one struct case, attribute qualifiers don't affect the output form. // // value // // (If no rdf:resource qualifier) // ... Fields, same forms as top level properties // // // // // // or Seq or Alt // ... Array items as rdf:li elements, same forms as top level properties // // // // // ... Property "value" following the unqualified forms ... // ... Qualifiers looking like named struct fields // static void SerializePrettyRDFProperty ( const XMP_Node * propNode, XMP_VarString & outputStr, XMP_StringPtr newline, XMP_StringPtr indentStr, XMP_Index indent, bool emitAsRDFValue = false ) { XMP_Index level; bool emitEndTag = true; bool indentEndTag = true; XMP_OptionBits propForm = propNode->options & kXMP_PropCompositeMask; // ------------------------------------------------------------------------------------------ // Determine the XML element name. Open the start tag with the name and attribute qualifiers. XMP_StringPtr elemName = propNode->name.c_str(); if ( emitAsRDFValue ) { elemName= "rdf:value"; } else if ( *elemName == '[' ) { elemName = "rdf:li"; } for ( level = indent; level > 0; --level ) outputStr += indentStr; outputStr += '<'; outputStr += elemName; bool hasGeneralQualifiers = false; bool hasRDFResourceQual = false; for ( size_t qualNum = 0, qualLim = propNode->qualifiers.size(); qualNum < qualLim; ++qualNum ) { const XMP_Node * currQual = propNode->qualifiers[qualNum]; if ( ! IsRDFAttrQualifier ( currQual->name ) ) { hasGeneralQualifiers = true; } else { if ( currQual->name == "rdf:resource" ) hasRDFResourceQual = true; if ( ! emitAsRDFValue ) { outputStr += ' '; outputStr += currQual->name; outputStr += "=\""; AppendNodeValue ( outputStr, currQual->value, kForAttribute ); outputStr += '"'; } } } // -------------------------------------------------------- // Process the property according to the standard patterns. if ( hasGeneralQualifiers && (! emitAsRDFValue) ) { // ----------------------------------------------------------------------------------------- // This node has general, non-attribute, qualifiers. Emit using the qualified property form. // ! The value is output by a recursive call ON THE SAME NODE with emitAsRDFValue set. if ( hasRDFResourceQual ) { XMP_Throw ( "Can't mix rdf:resource and general qualifiers", kXMPErr_BadRDF ); } outputStr += " rdf:parseType=\"Resource\">"; outputStr += newline; SerializePrettyRDFProperty ( propNode, outputStr, newline, indentStr, indent+1, true ); for ( size_t qualNum = 0, qualLim = propNode->qualifiers.size(); qualNum < qualLim; ++qualNum ) { const XMP_Node * currQual = propNode->qualifiers[qualNum]; if ( IsRDFAttrQualifier ( currQual->name ) ) continue; SerializePrettyRDFProperty ( currQual, outputStr, newline, indentStr, indent+1 ); } } else { // -------------------------------------------------------------------- // This node has no general qualifiers. Emit using an unqualified form. if ( propForm == 0 ) { // -------------------------- // This is a simple property. if ( propNode->options & kXMP_PropValueIsURI ) { outputStr += " rdf:resource=\""; AppendNodeValue ( outputStr, propNode->value, kForAttribute ); outputStr += "\"/>"; outputStr += newline; emitEndTag = false; } else if ( propNode->value.empty() ) { outputStr += "/>"; outputStr += newline; emitEndTag = false; } else { outputStr += '>'; AppendNodeValue ( outputStr, propNode->value, kForElement ); indentEndTag = false; } } else if ( propForm & kXMP_PropValueIsArray ) { // This is an array. outputStr += '>'; outputStr += newline; EmitRDFArrayTag ( propForm, outputStr, newline, indentStr, indent+1, propNode->children.size(), kIsStartTag ); if ( XMP_ArrayIsAltText(propNode->options) ) NormalizeLangArray ( (XMP_Node*)propNode ); for ( size_t childNum = 0, childLim = propNode->children.size(); childNum < childLim; ++childNum ) { const XMP_Node * currChild = propNode->children[childNum]; SerializePrettyRDFProperty ( currChild, outputStr, newline, indentStr, indent+2 ); } EmitRDFArrayTag ( propForm, outputStr, newline, indentStr, indent+1, propNode->children.size(), kIsEndTag ); } else if ( ! hasRDFResourceQual ) { // This is a "normal" struct, use the rdf:parseType="Resource" form. XMP_Assert ( propForm & kXMP_PropValueIsStruct ); if ( propNode->children.size() == 0 ) { outputStr += " rdf:parseType=\"Resource\"/>"; outputStr += newline; emitEndTag = false; } else { outputStr += " rdf:parseType=\"Resource\">"; outputStr += newline; for ( size_t childNum = 0, childLim = propNode->children.size(); childNum < childLim; ++childNum ) { const XMP_Node * currChild = propNode->children[childNum]; SerializePrettyRDFProperty ( currChild, outputStr, newline, indentStr, indent+1 ); } } } else { // This is a struct with an rdf:resource attribute, use the "empty property element" form. XMP_Assert ( propForm & kXMP_PropValueIsStruct ); for ( size_t childNum = 0, childLim = propNode->children.size(); childNum < childLim; ++childNum ) { const XMP_Node * currChild = propNode->children[childNum]; if ( ! CanBeRDFAttrProp ( currChild ) ) { XMP_Throw ( "Can't mix rdf:resource and complex fields", kXMPErr_BadRDF ); } outputStr += newline; for ( level = indent+1; level > 0; --level ) outputStr += indentStr; outputStr += ' '; outputStr += currChild->name; outputStr += "=\""; outputStr += currChild->value; outputStr += '"'; } outputStr += "/>"; outputStr += newline; emitEndTag = false; } } // ---------------------------------- // Emit the property element end tag. if ( emitEndTag ) { if ( indentEndTag ) for ( level = indent; level > 0; --level ) outputStr += indentStr; outputStr += "'; outputStr += newline; } } // SerializePrettyRDFProperty // ------------------------------------------------------------------------------------------------- // SerializePrettyRDFSchema // ------------------------ // // Each schema's properties are written in a separate rdf:Description element. All of the necessary // namespaces are declared in the rdf:Description element. The baseIndent is the base level for the // entire serialization, that of the x:xmpmeta element. An xml:lang qualifier is written as an // attribute of the property start tag, not by itself forcing the qualified property form. // // // // ... The actual properties of the schema, see SerializePrettyRDFProperty // // ... If alias comments are wanted // // static void SerializePrettyRDFSchema ( const XMP_VarString & treeName, const XMP_Node * schemaNode, XMP_VarString & outputStr, XMP_OptionBits options, XMP_StringPtr newline, XMP_StringPtr indentStr, XMP_Index baseIndent ) { XMP_Assert ( schemaNode->options & kXMP_SchemaNode ); XMP_Assert ( schemaNode->qualifiers.empty() ); // Write the rdf:Description start tag with the namespace declarations. XMP_Index level; for ( level = baseIndent+2; level > 0; --level ) outputStr += indentStr; outputStr += kRDF_SchemaStart; outputStr += '"'; outputStr += treeName; outputStr += '"'; XMP_VarString usedNS; usedNS.reserve ( 400 ); // The predefined prefixes add up to about 320 bytes. usedNS = "xml:rdf:"; DeclareUsedNamespaces ( schemaNode, usedNS, outputStr, newline, indentStr, baseIndent+4 ); outputStr += ">"; outputStr += newline; // Write alias comments, if wanted. // Write each of the schema's actual properties. for ( size_t propNum = 0, propLim = schemaNode->children.size(); propNum < propLim; ++propNum ) { const XMP_Node * currProp = schemaNode->children[propNum]; SerializePrettyRDFProperty ( currProp, outputStr, newline, indentStr, baseIndent+3 ); } // Write the rdf:Description end tag. for ( level = baseIndent+2; level > 0; --level ) outputStr += indentStr; outputStr += kRDF_SchemaEnd; outputStr += newline; } // SerializePrettyRDFSchema // ------------------------------------------------------------------------------------------------- // SerializeCompactRDFAttrProps // ---------------------------- // // Write each of the parent's simple unqualified properties as an attribute. Returns true if all // of the properties are written as attributes. static bool SerializeCompactRDFAttrProps ( const XMP_Node * parentNode, XMP_VarString & outputStr, XMP_StringPtr newline, XMP_StringPtr indentStr, XMP_Index indent ) { size_t prop, propLim; bool allAreAttrs = true; for ( prop = 0, propLim = parentNode->children.size(); prop != propLim; ++prop ) { const XMP_Node * currProp = parentNode->children[prop]; if ( ! CanBeRDFAttrProp ( currProp ) ) { allAreAttrs = false; continue; } outputStr += newline; for ( XMP_Index level = indent; level > 0; --level ) outputStr += indentStr; outputStr += currProp->name; outputStr += "=\""; AppendNodeValue ( outputStr, currProp->value, kForAttribute ); outputStr += '"'; } return allAreAttrs; } // SerializeCompactRDFAttrProps // ------------------------------------------------------------------------------------------------- // SerializeCompactRDFElemProps // ---------------------------- // // Recursively handles the "value" for a node that must be written as an RDF property element. It // does not matter if it is a top level property, a field of a struct, or an item of an array. The // indent is that for the property element. The patterns bwlow ignore attribute qualifiers such as // xml:lang, they don't affect the output form. // // // // // ... The fields as elements, if none are simple and unqualified // // // // // ... The compound or qualified fields as elements // // // // // or Seq or Alt // ... Array items as rdf:li elements, same forms as top level properties // // // // // ... Property "value" following the unqualified forms ... // ... Qualifiers looking like named struct fields // // *** Consider numbered array items, but has compatibility problems. // *** Consider qualified form with rdf:Description and attributes. static void SerializeCompactRDFElemProps ( const XMP_Node * parentNode, XMP_VarString & outputStr, XMP_StringPtr newline, XMP_StringPtr indentStr, XMP_Index indent ) { XMP_Index level; for ( size_t prop = 0, propLim = parentNode->children.size(); prop != propLim; ++prop ) { const XMP_Node * propNode = parentNode->children[prop]; if ( CanBeRDFAttrProp ( propNode ) ) continue; bool emitEndTag = true; bool indentEndTag = true; XMP_OptionBits propForm = propNode->options & kXMP_PropCompositeMask; // ----------------------------------------------------------------------------------- // Determine the XML element name, write the name part of the start tag. Look over the // qualifiers to decide on "normal" versus "rdf:value" form. Emit the attribute // qualifiers at the same time. XMP_StringPtr elemName = propNode->name.c_str(); if ( *elemName == '[' ) elemName = "rdf:li"; for ( level = indent; level > 0; --level ) outputStr += indentStr; outputStr += '<'; outputStr += elemName; bool hasGeneralQualifiers = false; bool hasRDFResourceQual = false; for ( size_t qualNum = 0, qualLim = propNode->qualifiers.size(); qualNum < qualLim; ++qualNum ) { const XMP_Node * currQual = propNode->qualifiers[qualNum]; if ( ! IsRDFAttrQualifier ( currQual->name ) ) { hasGeneralQualifiers = true; } else { if ( currQual->name == "rdf:resource" ) hasRDFResourceQual = true; outputStr += ' '; outputStr += currQual->name; outputStr += "=\""; AppendNodeValue ( outputStr, currQual->value, kForAttribute ); outputStr += '"'; } } // -------------------------------------------------------- // Process the property according to the standard patterns. if ( hasGeneralQualifiers ) { // ------------------------------------------------------------------------------------- // The node has general qualifiers, ones that can't be attributes on a property element. // Emit using the qualified property pseudo-struct form. The value is output by a call // to SerializePrettyRDFProperty with emitAsRDFValue set. // *** We're losing compactness in the calls to SerializePrettyRDFProperty. // *** Should refactor to have SerializeCompactRDFProperty that does one node. outputStr += " rdf:parseType=\"Resource\">"; outputStr += newline; SerializePrettyRDFProperty ( propNode, outputStr, newline, indentStr, indent+1, true ); size_t qualNum = 0; size_t qualLim = propNode->qualifiers.size(); if ( propNode->options & kXMP_PropHasLang ) ++qualNum; for ( ; qualNum < qualLim; ++qualNum ) { const XMP_Node * currQual = propNode->qualifiers[qualNum]; SerializePrettyRDFProperty ( currQual, outputStr, newline, indentStr, indent+1 ); } } else { // -------------------------------------------------------------------- // This node has only attribute qualifiers. Emit as a property element. if ( propForm == 0 ) { // -------------------------- // This is a simple property. if ( propNode->options & kXMP_PropValueIsURI ) { outputStr += " rdf:resource=\""; AppendNodeValue ( outputStr, propNode->value, kForAttribute ); outputStr += "\"/>"; outputStr += newline; emitEndTag = false; } else if ( propNode->value.empty() ) { outputStr += "/>"; outputStr += newline; emitEndTag = false; } else { outputStr += '>'; AppendNodeValue ( outputStr, propNode->value, kForElement ); indentEndTag = false; } } else if ( propForm & kXMP_PropValueIsArray ) { // ----------------- // This is an array. outputStr += '>'; outputStr += newline; EmitRDFArrayTag ( propForm, outputStr, newline, indentStr, indent+1, propNode->children.size(), kIsStartTag ); if ( XMP_ArrayIsAltText(propNode->options) ) NormalizeLangArray ( (XMP_Node*)propNode ); SerializeCompactRDFElemProps ( propNode, outputStr, newline, indentStr, indent+2 ); EmitRDFArrayTag ( propForm, outputStr, newline, indentStr, indent+1, propNode->children.size(), kIsEndTag ); } else { // ---------------------- // This must be a struct. XMP_Assert ( propForm & kXMP_PropValueIsStruct ); bool hasAttrFields = false; bool hasElemFields = false; size_t field, fieldLim; for ( field = 0, fieldLim = propNode->children.size(); field != fieldLim; ++field ) { XMP_Node * currField = propNode->children[field]; if ( CanBeRDFAttrProp ( currField ) ) { hasAttrFields = true; if ( hasElemFields ) break; // No sense looking further. } else { hasElemFields = true; if ( hasAttrFields ) break; // No sense looking further. } } if ( hasRDFResourceQual && hasElemFields ) { XMP_Throw ( "Can't mix rdf:resource qualifier and element fields", kXMPErr_BadRDF ); } if ( propNode->children.size() == 0 ) { // Catch an empty struct as a special case. The case below would emit an empty // XML element, which gets reparsed as a simple property with an empty value. outputStr += " rdf:parseType=\"Resource\"/>"; outputStr += newline; emitEndTag = false; } else if ( ! hasElemFields ) { // All fields can be attributes, use the emptyPropertyElt form. SerializeCompactRDFAttrProps ( propNode, outputStr, newline, indentStr, indent+1 ); outputStr += "/>"; outputStr += newline; emitEndTag = false; } else if ( ! hasAttrFields ) { // All fields must be elements, use the parseTypeResourcePropertyElt form. outputStr += " rdf:parseType=\"Resource\">"; outputStr += newline; SerializeCompactRDFElemProps ( propNode, outputStr, newline, indentStr, indent+1 ); } else { // Have a mix of attributes and elements, use an inner rdf:Description. outputStr += '>'; outputStr += newline; for ( level = indent+1; level > 0; --level ) outputStr += indentStr; outputStr += " 0; --level ) outputStr += indentStr; outputStr += kRDF_StructEnd; outputStr += newline; } } } // ---------------------------------- // Emit the property element end tag. if ( emitEndTag ) { if ( indentEndTag ) for ( level = indent; level > 0; --level ) outputStr += indentStr; outputStr += "'; outputStr += newline; } } } // SerializeCompactRDFElemProps // ------------------------------------------------------------------------------------------------- // SerializeCompactRDFSchemas // -------------------------- // // All properties from all schema are written in a single rdf:Description element, as are all of the // necessary namespace declarations. The baseIndent is the base level for the entire serialization, // that of the x:xmpmeta element. The x:xmpmeta and rdf:RDF elements have already been written. // // Top level simple unqualified properties are written as attributes of the (only) rdf:Description // element. Structs, arrays, and qualified properties are written by SerializeCompactRDFElemProp. An // xml:lang qualifier on a simple property prevents the attribute form. // // // ... The remaining properties of the schema, see SerializeCompactRDFElemProps // static void SerializeCompactRDFSchemas ( const XMP_Node & xmpTree, XMP_VarString & outputStr, XMP_StringPtr newline, XMP_StringPtr indentStr, XMP_Index baseIndent ) { XMP_Index level; size_t schema, schemaLim; // Begin the rdf:Description start tag. for ( level = baseIndent+2; level > 0; --level ) outputStr += indentStr; outputStr += kRDF_SchemaStart; outputStr += '"'; outputStr += xmpTree.name; outputStr += '"'; // Write all necessary xmlns attributes. XMP_VarString usedNS; usedNS.reserve ( 400 ); // The predefined prefixes add up to about 320 bytes. usedNS = "xml:rdf:"; for ( schema = 0, schemaLim = xmpTree.children.size(); schema != schemaLim; ++schema ) { const XMP_Node * currSchema = xmpTree.children[schema]; DeclareUsedNamespaces ( currSchema, usedNS, outputStr, newline, indentStr, baseIndent+4 ); } // Write the top level "attrProps" and close the rdf:Description start tag. bool allAreAttrs = true; for ( schema = 0, schemaLim = xmpTree.children.size(); schema != schemaLim; ++schema ) { const XMP_Node * currSchema = xmpTree.children[schema]; allAreAttrs &= SerializeCompactRDFAttrProps ( currSchema, outputStr, newline, indentStr, baseIndent+3 ); } if ( ! allAreAttrs ) { outputStr += ">"; outputStr += newline; } else { outputStr += "/>"; outputStr += newline; return; // ! Done if all properties in all schema are written as attributes. } // Write the remaining properties for each schema. for ( schema = 0, schemaLim = xmpTree.children.size(); schema != schemaLim; ++schema ) { const XMP_Node * currSchema = xmpTree.children[schema]; SerializeCompactRDFElemProps ( currSchema, outputStr, newline, indentStr, baseIndent+3 ); } // Write the rdf:Description end tag. // *** Elide the end tag if everything (all props in all schema) is an attr. for ( level = baseIndent+2; level > 0; --level ) outputStr += indentStr; outputStr += kRDF_SchemaEnd; outputStr += newline; } // SerializeCompactRDFSchemas // ------------------------------------------------------------------------------------------------- // SerializeAsRDF // -------------- // // // // // // ... The properties, see SerializePrettyRDFSchema or SerializeCompactRDFSchemas // // // // // *** Need to strip empty arrays? // *** Option to strip/keep empty structs? // *** Need to verify handling of rdf:type qualifiers in pretty and compact. // *** Need to verify round tripping of rdf:ID and similar qualifiers, see RDF 7.2.21. // *** Check cases of rdf:resource plus explicit attr qualifiers (like xml:lang). static void SerializeAsRDF ( const XMPMeta & xmpObj, XMP_VarString & headStr, // Everything up to the padding. XMP_VarString & tailStr, // Everything after the padding. XMP_OptionBits options, XMP_StringPtr newline, XMP_StringPtr indentStr, XMP_Index baseIndent ) { const size_t treeNameLen = xmpObj.tree.name.size(); const size_t indentLen = strlen ( indentStr ); // First estimate the worst case space and reserve room in the output string. This optimization // avoids reallocating and copying the output as it grows. The initial count does not look at // the values of properties, so it does not account for character entities, e.g. for newline. // Since there can be a lot of these in things like the base 64 encoding of a large thumbnail, // inflate the count by 1/4 (easy to do) to accommodate. // *** Need to include estimate for alias comments. size_t outputLen = 2 * (strlen(kPacketHeader) + strlen(kRDF_XMPMetaStart) + strlen(kRDF_RDFStart) + 3*baseIndent*indentLen); for ( size_t schemaNum = 0, schemaLim = xmpObj.tree.children.size(); schemaNum < schemaLim; ++schemaNum ) { const XMP_Node * currSchema = xmpObj.tree.children[schemaNum]; outputLen += 2*(baseIndent+2)*indentLen + strlen(kRDF_SchemaStart) + treeNameLen + strlen(kRDF_SchemaEnd) + 2; outputLen += EstimateRDFSize ( currSchema, baseIndent+2, indentLen ); } outputLen += (outputLen >> 2); // Inflate by 1/4, an empirical fudge factor. // Now generate the RDF into the head string as UTF-8. XMP_Index level; headStr.erase(); headStr.reserve ( outputLen ); // Write the packet header PI. if ( ! (options & kXMP_OmitPacketWrapper) ) { for ( level = baseIndent; level > 0; --level ) headStr += indentStr; headStr += kPacketHeader; headStr += newline; } // Write the xmpmeta element's start tag. if ( ! (options & kXMP_OmitXMPMetaElement) ) { for ( level = baseIndent; level > 0; --level ) headStr += indentStr; headStr += kRDF_XMPMetaStart; headStr += kXMPCore_VersionMessage "\">"; headStr += newline; } // Write the rdf:RDF start tag. for ( level = baseIndent+1; level > 0; --level ) headStr += indentStr; headStr += kRDF_RDFStart; headStr += newline; // Write all of the properties. if ( options & kXMP_UseCompactFormat ) { SerializeCompactRDFSchemas ( xmpObj.tree, headStr, newline, indentStr, baseIndent ); } else { if ( xmpObj.tree.children.size() > 0 ) { for ( size_t schemaNum = 0, schemaLim = xmpObj.tree.children.size(); schemaNum < schemaLim; ++schemaNum ) { const XMP_Node * currSchema = xmpObj.tree.children[schemaNum]; SerializePrettyRDFSchema ( xmpObj.tree.name, currSchema, headStr, options, newline, indentStr, baseIndent ); } } else { for ( XMP_Index level = baseIndent+2; level > 0; --level ) headStr += indentStr; headStr += kRDF_SchemaStart; // Special case an empty XMP object. headStr += '"'; headStr += xmpObj.tree.name; headStr += "\"/>"; headStr += newline; } } // Write the rdf:RDF end tag. for ( level = baseIndent+1; level > 0; --level ) headStr += indentStr; headStr += kRDF_RDFEnd; headStr += newline; // Write the xmpmeta end tag. if ( ! (options & kXMP_OmitXMPMetaElement) ) { for ( level = baseIndent; level > 0; --level ) headStr += indentStr; headStr += kRDF_XMPMetaEnd; headStr += newline; } // Write the packet trailer PI into the tail string as UTF-8. tailStr.erase(); if ( ! (options & kXMP_OmitPacketWrapper) ) { tailStr.reserve ( strlen(kPacketTrailer) + (strlen(indentStr) * baseIndent) ); for ( level = baseIndent; level > 0; --level ) tailStr += indentStr; tailStr += kPacketTrailer; if ( options & kXMP_ReadOnlyPacket ) tailStr[tailStr.size()-4] = 'r'; } // ! This assert is just a performance check, to see if the reserve was enough. // *** XMP_Assert ( headStr.size() <= outputLen ); // *** Don't use an assert. Think of some way to track this without risk of aborting the client. } // SerializeAsRDF // ------------------------------------------------------------------------------------------------- // SerializeToBuffer // ----------------- void XMPMeta::SerializeToBuffer ( XMP_VarString * rdfString, XMP_OptionBits options, XMP_StringLen padding, XMP_StringPtr newline, XMP_StringPtr indentStr, XMP_Index baseIndent ) const { XMP_Assert ( (rdfString != 0) && (newline != 0) && (indentStr != 0) ); rdfString->erase(); // Fix up some default parameters. enum { kDefaultPad = 2048 }; size_t unicodeUnitSize = 1; XMP_OptionBits charEncoding = options & kXMP_EncodingMask; if ( charEncoding != kXMP_EncodeUTF8 ) { if ( options & _XMP_UTF16_Bit ) { if ( options & _XMP_UTF32_Bit ) XMP_Throw ( "Can't use both _XMP_UTF16_Bit and _XMP_UTF32_Bit", kXMPErr_BadOptions ); unicodeUnitSize = 2; } else if ( options & _XMP_UTF32_Bit ) { unicodeUnitSize = 4; } else { XMP_Throw ( "Can't use _XMP_LittleEndian_Bit by itself", kXMPErr_BadOptions ); } } if ( options & kXMP_OmitAllFormatting ) { newline = " "; // ! Yes, a space for "newline". This ensures token separation. indentStr = ""; } else { if ( *newline == 0 ) newline = "\xA"; // Linefeed if ( *indentStr == 0 ) { indentStr = " "; if ( ! (options & kXMP_UseCompactFormat) ) indentStr = " "; } } if ( options & kXMP_ExactPacketLength ) { if ( options & (kXMP_OmitPacketWrapper | kXMP_IncludeThumbnailPad) ) { XMP_Throw ( "Inconsistent options for exact size serialize", kXMPErr_BadOptions ); } if ( (padding & (unicodeUnitSize-1)) != 0 ) { XMP_Throw ( "Exact size must be a multiple of the Unicode element", kXMPErr_BadOptions ); } } else if ( options & kXMP_ReadOnlyPacket ) { if ( options & (kXMP_OmitPacketWrapper | kXMP_IncludeThumbnailPad) ) { XMP_Throw ( "Inconsistent options for read-only packet", kXMPErr_BadOptions ); } padding = 0; } else if ( options & kXMP_OmitPacketWrapper ) { if ( options & kXMP_IncludeThumbnailPad ) { XMP_Throw ( "Inconsistent options for non-packet serialize", kXMPErr_BadOptions ); } padding = 0; } else { if ( padding == 0 ) { padding = kDefaultPad * unicodeUnitSize; } else if ( (padding >> 28) != 0 ) { XMP_Throw ( "Outrageously large padding size", kXMPErr_BadOptions ); // Bigger than 256 MB. } if ( options & kXMP_IncludeThumbnailPad ) { if ( ! this->DoesPropertyExist ( kXMP_NS_XMP, "Thumbnails" ) ) padding += (10000 * unicodeUnitSize); // *** Need a better estimate. } } // Serialize as UTF-8, then convert to UTF-16 or UTF-32 if necessary, and assemble with the padding and tail. std::string tailStr; SerializeAsRDF ( *this, *rdfString, tailStr, options, newline, indentStr, baseIndent ); if ( charEncoding == kXMP_EncodeUTF8 ) { if ( options & kXMP_ExactPacketLength ) { size_t minSize = rdfString->size() + tailStr.size(); if ( minSize > padding ) XMP_Throw ( "Can't fit into specified packet size", kXMPErr_BadSerialize ); padding -= minSize; // Now the actual amount of padding to add. } size_t newlineLen = strlen ( newline ); if ( padding < newlineLen ) { rdfString->append ( padding, ' ' ); } else { padding -= newlineLen; // Write this newline last. while ( padding >= (100 + newlineLen) ) { rdfString->append ( 100, ' ' ); *rdfString += newline; padding -= (100 + newlineLen); } rdfString->append ( padding, ' ' ); *rdfString += newline; } *rdfString += tailStr; } else { // Need to convert the encoding. Swap the UTF-8 into a local string and convert back. Assemble everything. XMP_VarString utf8Str, newlineStr; bool bigEndian = ((charEncoding & _XMP_LittleEndian_Bit) == 0); if ( charEncoding & _XMP_UTF16_Bit ) { std::string padStr ( " " ); padStr[0] = 0; // Assume big endian. utf8Str.swap ( *rdfString ); ToUTF16 ( (UTF8Unit*)utf8Str.c_str(), utf8Str.size(), rdfString, bigEndian ); utf8Str.swap ( tailStr ); ToUTF16 ( (UTF8Unit*)utf8Str.c_str(), utf8Str.size(), &tailStr, bigEndian ); if ( options & kXMP_ExactPacketLength ) { size_t minSize = rdfString->size() + tailStr.size(); if ( minSize > padding ) XMP_Throw ( "Can't fit into specified packet size", kXMPErr_BadSerialize ); padding -= minSize; // Now the actual amount of padding to add (in bytes). } utf8Str.assign ( newline ); ToUTF16 ( (UTF8Unit*)utf8Str.c_str(), utf8Str.size(), &newlineStr, bigEndian ); size_t newlineLen = newlineStr.size(); if ( padding < newlineLen ) { for ( int i = padding/2; i > 0; --i ) *rdfString += padStr; } else { padding -= newlineLen; // Write this newline last. while ( padding >= (200 + newlineLen) ) { for ( int i = 100; i > 0; --i ) *rdfString += padStr; *rdfString += newlineStr; padding -= (200 + newlineLen); } for ( int i = padding/2; i > 0; --i ) *rdfString += padStr; *rdfString += newlineStr; } *rdfString += tailStr; } else { std::string padStr ( " " ); padStr[0] = padStr[1] = padStr[2] = 0; // Assume big endian. UTF8_to_UTF32_Proc Converter = UTF8_to_UTF32BE; if ( charEncoding & _XMP_LittleEndian_Bit ) { padStr[0] = ' '; padStr[1] = padStr[2] = padStr[3] = 0; Converter = UTF8_to_UTF32LE; } utf8Str.swap ( *rdfString ); ToUTF32 ( (UTF8Unit*)utf8Str.c_str(), utf8Str.size(), rdfString, bigEndian ); utf8Str.swap ( tailStr ); ToUTF32 ( (UTF8Unit*)utf8Str.c_str(), utf8Str.size(), &tailStr, bigEndian ); if ( options & kXMP_ExactPacketLength ) { size_t minSize = rdfString->size() + tailStr.size(); if ( minSize > padding ) XMP_Throw ( "Can't fit into specified packet size", kXMPErr_BadSerialize ); padding -= minSize; // Now the actual amount of padding to add (in bytes). } utf8Str.assign ( newline ); ToUTF32 ( (UTF8Unit*)utf8Str.c_str(), utf8Str.size(), &newlineStr, bigEndian ); size_t newlineLen = newlineStr.size(); if ( padding < newlineLen ) { for ( int i = padding/4; i > 0; --i ) *rdfString += padStr; } else { padding -= newlineLen; // Write this newline last. while ( padding >= (400 + newlineLen) ) { for ( int i = 100; i > 0; --i ) *rdfString += padStr; *rdfString += newlineStr; padding -= (400 + newlineLen); } for ( int i = padding/4; i > 0; --i ) *rdfString += padStr; *rdfString += newlineStr; } *rdfString += tailStr; } } } // SerializeToBuffer // ================================================================================================= exempi-2.2.1/source/XMPCore/XMPIterator.hpp0000664000175000017500000001011012150230672015361 00000000000000#ifndef __XMPIterator_hpp__ #define __XMPIterator_hpp__ // ================================================================================================= // Copyright 2003 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" #include "XMP_Const.h" #include "XMPMeta.hpp" // ================================================================================================= struct IterNode; typedef std::vector < IterNode > IterOffspring; typedef IterOffspring::iterator IterPos; typedef std::pair < IterPos, IterPos > IterPosPair; typedef std::vector < IterPosPair > IterPosStack; enum { // Values for the visitStage field, used to decide how to proceed past a node. kIter_BeforeVisit = 0, // Have not visited this node at all. kIter_VisitSelf = 1, // Have visited this node and returned its value/options portion. kIter_VisitQualifiers = 2, // In the midst of visiting this node's qualifiers. kIter_VisitChildren = 3 // In the midst of visiting this node's children. }; struct IterNode { XMP_OptionBits options; XMP_VarString fullPath; size_t leafOffset; IterOffspring children, qualifiers; XMP_Uns8 visitStage; #if 0 // *** XMP_DebugBuild XMP_StringPtr _pathPtr, _leafPtr; // *** Not working, need operator=? #endif IterNode() : options(0), leafOffset(0), visitStage(kIter_BeforeVisit) { #if 0 // *** XMP_DebugBuild _pathPtr = _leafPtr = 0; #endif }; IterNode ( XMP_OptionBits _options, const XMP_VarString& _fullPath, size_t _leafOffset ) : options(_options), fullPath(_fullPath), leafOffset(_leafOffset), visitStage(kIter_BeforeVisit) { #if 0 // *** XMP_DebugBuild _pathPtr = fullPath.c_str(); _leafPtr = _pathPtr + leafOffset; #endif }; }; struct IterInfo { XMP_OptionBits options; const XMPMeta * xmpObj; XMP_VarString currSchema; IterPos currPos, endPos; IterPosStack ancestors; IterNode tree; #if 0 // *** XMP_DebugBuild XMP_StringPtr _schemaPtr; // *** Not working, need operator=? #endif IterInfo() : options(0), xmpObj(0) { #if 0 // *** XMP_DebugBuild _schemaPtr = 0; #endif }; IterInfo ( XMP_OptionBits _options, const XMPMeta * _xmpObj ) : options(_options), xmpObj(_xmpObj) { #if 0 // *** XMP_DebugBuild _schemaPtr = 0; #endif }; }; // ================================================================================================= class XMPIterator { public: static bool Initialize(); // ! For internal use only! static void Terminate() RELEASE_NO_THROW; // ! For internal use only! XMPIterator ( const XMPMeta & xmpObj, // Construct a property iterator. XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options ); XMPIterator ( XMP_StringPtr schemaNS, // Construct a table iterator. XMP_StringPtr propName, XMP_OptionBits options ); virtual ~XMPIterator() RELEASE_NO_THROW; bool Next ( XMP_StringPtr * schemaNS, XMP_StringLen * nsSize, XMP_StringPtr * propPath, XMP_StringLen * pathSize, XMP_StringPtr * propValue, XMP_StringLen * valueSize, XMP_OptionBits * propOptions ); void Skip ( XMP_OptionBits options ); // ! Expose so that wrappers and file static functions can see the data. XMP_Int32 clientRefs; // ! Must be signed to allow decrement from 0. XMP_ReadWriteLock lock; IterInfo info; private: // ! These are hidden on purpose: XMPIterator() : clientRefs(0) { XMP_Throw ( "Call to hidden constructor", kXMPErr_InternalFailure ); }; XMPIterator ( const XMPIterator & /* original */ ) : clientRefs(0) { XMP_Throw ( "Call to hidden constructor", kXMPErr_InternalFailure ); }; void operator= ( const XMPIterator & /* rhs */ ) { XMP_Throw ( "Call to hidden operator=", kXMPErr_InternalFailure ); }; }; // ================================================================================================= #endif // __XMPIterator_hpp__ exempi-2.2.1/source/XMPCore/XMPIterator.cpp0000664000175000017500000005474712150230672015404 00000000000000// ================================================================================================= // Copyright 2003 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include! #include "XMPCore_Impl.hpp" #include "XMPIterator.hpp" #include #include // For snprintf. #if XMP_WinBuild #pragma warning ( disable : 4702 ) // unreachable code #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif // ================================================================================================= // Support Routines // ================================================================================================= #ifndef TraceIterators #define TraceIterators 0 #endif #if TraceIterators static const char * sStageNames[] = { "before", "self", "qualifiers", "children" }; #endif static XMP_Node * sDummySchema = 0; // ! Used for some ugliness with aliases. // ------------------------------------------------------------------------------------------------- // AddSchemaProps // -------------- // // Add the top level properties to the IterNode for a schema. static void AddSchemaProps ( IterInfo & info, IterNode & iterSchema, const XMP_Node * xmpSchema ) { info = info; // Avoid unused parameter warning. #if TraceIterators printf ( " Adding properties of %s\n", xmpSchema->name.c_str() ); #endif for ( size_t propNum = 0, propLim = xmpSchema->children.size(); propNum != propLim; ++propNum ) { const XMP_Node * xmpProp = xmpSchema->children[propNum]; // *** set the has-aliases bit when appropriate iterSchema.children.push_back ( IterNode ( xmpProp->options, xmpProp->name, 0 ) ); #if TraceIterators printf ( " %s\n", xmpProp->name.c_str() ); #endif } } // AddSchemaProps // ------------------------------------------------------------------------------------------------- // AddNodeOffspring // ---------------- // // Add the immediate children and qualifiers to an IterNode. static void AddNodeOffspring ( IterInfo & info, IterNode & iterParent, const XMP_Node * xmpParent ) { XMP_VarString currPath ( iterParent.fullPath ); size_t leafOffset = iterParent.fullPath.size(); if ( (! xmpParent->qualifiers.empty()) && (! (info.options & kXMP_IterOmitQualifiers)) ) { #if TraceIterators printf ( " Adding qualifiers of %s\n", currPath.c_str() ); #endif currPath += "/?"; // All qualifiers are named and use paths like "Prop/?Qual". leafOffset += 2; for ( size_t qualNum = 0, qualLim = xmpParent->qualifiers.size(); qualNum != qualLim; ++qualNum ) { const XMP_Node * xmpQual = xmpParent->qualifiers[qualNum]; currPath += xmpQual->name; iterParent.qualifiers.push_back ( IterNode ( xmpQual->options, currPath, leafOffset ) ); currPath.erase ( leafOffset ); #if TraceIterators printf ( " %s\n", xmpQual->name.c_str() ); #endif } leafOffset -= 2; currPath.erase ( leafOffset ); } if ( ! xmpParent->children.empty() ) { #if TraceIterators printf ( " Adding children of %s\n", currPath.c_str() ); #endif XMP_Assert ( xmpParent->options & kXMP_PropCompositeMask ); if ( xmpParent->options & kXMP_PropValueIsStruct ) { currPath += '/'; leafOffset += 1; } for ( size_t childNum = 0, childLim = xmpParent->children.size(); childNum != childLim; ++childNum ) { const XMP_Node * xmpChild = xmpParent->children[childNum]; if ( ! (xmpParent->options & kXMP_PropValueIsArray) ) { currPath += xmpChild->name; } else { char buffer [32]; // AUDIT: Using sizeof(buffer) below for snprintf length is safe. snprintf ( buffer, sizeof(buffer), "[%lu]", childNum+1 ); // ! XPath indices are one-based. currPath += buffer; } iterParent.children.push_back ( IterNode ( xmpChild->options, currPath, leafOffset ) ); currPath.erase ( leafOffset ); #if TraceIterators printf ( " %s\n", (iterParent.children.back().fullPath.c_str() + leafOffset) ); #endif } } } // AddNodeOffspring // ------------------------------------------------------------------------------------------------- // SetCurrSchema // ------------- static inline void SetCurrSchema ( IterInfo & info, XMP_StringPtr schemaName ) { info.currSchema = schemaName; #if 0 // *** XMP_DebugBuild info._schemaPtr = info.currSchema.c_str(); #endif } // SetCurrSchema static inline void SetCurrSchema ( IterInfo & info, XMP_VarString & schemaName ) { info.currSchema = schemaName; #if 0 // *** XMP_DebugBuild info._schemaPtr = info.currSchema.c_str(); #endif } // SetCurrSchema // ------------------------------------------------------------------------------------------------- // AdvanceIterPos // -------------- // // Adjust currPos and possibly endPos for the next step in a pre-order depth-first traversal. The // current node has just been visited, move on to its qualifiers, children, then siblings, or back // up to an ancestor. AdvanceIterPos either moves to a property or qualifier node that can be // visited, or to the end of the entire iteration. static void AdvanceIterPos ( IterInfo & info ) { // ------------------------------------------------------------------------------------------- // Keep looking until we find a node to visit or the end of everything. The first time through // the current node will exist, we just visited it. But we have to keep looking if the current // node was the last of its siblings or is an empty schema. // ! It is possible that info.currPos == info.endPos on entry. Don't dereference info.currPos yet! while ( true ) { if ( info.currPos == info.endPos ) { // ------------------------------------------------------------------------------------ // At the end of a set of siblings, move up to an ancestor. We've either just finished // the qualifiers and will move to the children, or have just finished the children and // will move on to the next sibling. if ( info.ancestors.empty() ) break; // We're at the end of the schema list. IterPosPair & parent = info.ancestors.back(); info.currPos = parent.first; info.endPos = parent.second; info.ancestors.pop_back(); #if TraceIterators printf ( " Moved up to %s, stage = %s\n", info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage] ); #endif } else { // ------------------------------------------------------------------------------------------- // Decide what to do with this iteration node based on its state. Don't use a switch statment, // some of the cases want to break from the loop. A break in a switch just exits the case. #if TraceIterators printf ( " Moving from %s, stage = %s\n", info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage] ); #endif if ( info.currPos->visitStage == kIter_BeforeVisit ) { // Visit this node now. if ( info.currPos->options & kXMP_SchemaNode ) SetCurrSchema ( info, info.currPos->fullPath ); break; } if ( info.currPos->visitStage == kIter_VisitSelf ) { // Just finished visiting the value portion. info.currPos->visitStage = kIter_VisitQualifiers; // Start visiting the qualifiers. if ( ! info.currPos->qualifiers.empty() ) { info.ancestors.push_back ( IterPosPair ( info.currPos, info.endPos ) ); info.endPos = info.currPos->qualifiers.end(); // ! Set the parent's endPos before changing currPos! info.currPos = info.currPos->qualifiers.begin(); break; } } if ( info.currPos->visitStage == kIter_VisitQualifiers ) { // Just finished visiting the qualifiers. info.currPos->qualifiers.clear(); info.currPos->visitStage = kIter_VisitChildren; // Start visiting the children. if ( ! info.currPos->children.empty() ) { info.ancestors.push_back ( IterPosPair ( info.currPos, info.endPos ) ); info.endPos = info.currPos->children.end(); // ! Set the parent's endPos before changing currPos! info.currPos = info.currPos->children.begin(); break; } } if ( info.currPos->visitStage == kIter_VisitChildren ) { // Just finished visiting the children. info.currPos->children.clear(); ++info.currPos; // Move to the next sibling. continue; } #if TraceIterators if ( info.currPos != info.endPos ) { printf ( " Moved to %s, stage = %s\n", info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage] ); } #endif } } // Loop to find the next node. XMP_Assert ( (info.currPos == info.endPos) || (info.currPos->visitStage == kIter_BeforeVisit) ); } // AdvanceIterPos // ------------------------------------------------------------------------------------------------- // GetNextXMPNode // -------------- // // Used by XMPIterator::Next to obtain the next XMP node, ignoring the kXMP_IterJustLeafNodes flag. // This isolates some messy code, allowing a clean loop in Next if kXMP_IterJustLeafNodes is set. static const XMP_Node * GetNextXMPNode ( IterInfo & info ) { const XMP_Node * xmpNode = 0; // ---------------------------------------------------------------------------------------------- // On entry currPos points to an iteration node whose state is either before-visit or visit-self. // If it is before-visit then we will return that node's value part now. If it is visit-self it // means the previous iteration returned the value portion of that node, so we can advance to the // next node in the iteration tree. Then we find the corresponding XMP node, allowing for the XMP // tree to have been modified since that part of the iteration tree was constructed. // ! NOTE: Supporting aliases throws in some nastiness with schemas. There might not be any XMP // ! node for the schema, but we still have to visit it because of possible aliases. The static // ! sDummySchema is returned if there is no real schema node. if ( info.currPos->visitStage != kIter_BeforeVisit ) AdvanceIterPos ( info ); bool isSchemaNode = false; XMP_ExpandedXPath expPath; // Keep outside the loop to avoid constant construct/destruct. while ( info.currPos != info.endPos ) { isSchemaNode = XMP_NodeIsSchema ( info.currPos->options ); if ( isSchemaNode ) { SetCurrSchema ( info, info.currPos->fullPath ); xmpNode = FindConstSchema ( &info.xmpObj->tree, info.currPos->fullPath.c_str() ); if ( xmpNode == 0 ) xmpNode = sDummySchema; } else { ExpandXPath ( info.currSchema.c_str(), info.currPos->fullPath.c_str(), &expPath ); xmpNode = FindConstNode ( &info.xmpObj->tree, expPath ); } if ( xmpNode != 0 ) break; // Exit the loop, we found a live XMP node. info.currPos->visitStage = kIter_VisitChildren; // Make AdvanceIterPos move to the next sibling. info.currPos->children.clear(); info.currPos->qualifiers.clear(); AdvanceIterPos ( info ); } if ( info.currPos == info.endPos ) return 0; // ------------------------------------------------------------------------------------------- // Now we've got the iteration node and corresponding XMP node. Add the iteration children for // structs and arrays. The children of schema were added when the iterator was constructed. XMP_Assert ( info.currPos->visitStage == kIter_BeforeVisit ); if ( info.currPos->visitStage == kIter_BeforeVisit ) { if ( (! isSchemaNode) && (! (info.options & kXMP_IterJustChildren)) ) { AddNodeOffspring ( info, *info.currPos, xmpNode ); } info.currPos->visitStage = kIter_VisitSelf; } return xmpNode; } // GetNextXMPNode // ================================================================================================= // Init/Term // ================================================================================================= // ------------------------------------------------------------------------------------------------- // Initialize // ---------- /* class static */ bool XMPIterator::Initialize() { sDummySchema = new XMP_Node ( 0, "dummy:schema/", kXMP_SchemaNode); return true; } // Initialize // ------------------------------------------------------------------------------------------------- // Terminate // ---------- /* class static */ void XMPIterator::Terminate() RELEASE_NO_THROW { delete ( sDummySchema ); sDummySchema = 0; return; } // Terminate // ================================================================================================= // Constructors // ================================================================================================= // ------------------------------------------------------------------------------------------------- // XMPIterator // ----------- // // Constructor for iterations over the nodes in an XMPMeta object. This builds a tree of iteration // nodes that caches the existing node names of the XMPMeta object. The iteration tree is a partial // replica of the XMPMeta tree. The initial iteration tree normally has just the root node, all of // the schema nodes for a full object iteration. Lower level nodes (children and qualifiers) are // added when the parent is visited. If the kXMP_IterJustChildren option is passed then the initial // iterator includes the children and the parent is marked as done. The iteration tree nodes are // pruned when they are no longer needed. XMPIterator::XMPIterator ( const XMPMeta & xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options ) : clientRefs(0), info(IterInfo(options,&xmpObj)) { if ( (options & kXMP_IterClassMask) != kXMP_IterProperties ) { XMP_Throw ( "Unsupported iteration kind", kXMPErr_BadOptions ); } // *** Lock the XMPMeta object if we ever stop using a full DLL lock. if ( *propName != 0 ) { // An iterator rooted at a specific node. #if TraceIterators printf ( "\nNew XMP property iterator for \"%s\", options = %X\n Schema = %s, root = %s\n", xmpObj.tree.name.c_str(), options, schemaNS, propName ); #endif XMP_ExpandedXPath propPath; ExpandXPath ( schemaNS, propName, &propPath ); XMP_Node * propNode = FindConstNode ( &xmpObj.tree, propPath ); // If not found get empty iteration. if ( propNode != 0 ) { XMP_VarString rootName ( propPath[1].step ); // The schema is [0]. for ( size_t i = 2; i < propPath.size(); ++i ) { XMP_OptionBits stepKind = GetStepKind ( propPath[i].options ); if ( stepKind <= kXMP_QualifierStep ) rootName += '/'; rootName += propPath[i].step; } propName = rootName.c_str(); size_t leafOffset = rootName.size(); while ( (leafOffset > 0) && (propName[leafOffset] != '/') && (propName[leafOffset] != '[') ) --leafOffset; if ( propName[leafOffset] == '/' ) ++leafOffset; info.tree.children.push_back ( IterNode ( propNode->options, propName, leafOffset ) ); SetCurrSchema ( info, propPath[kSchemaStep].step.c_str() ); if ( info.options & kXMP_IterJustChildren ) { AddNodeOffspring ( info, info.tree.children.back(), propNode ); } } } else if ( *schemaNS != 0 ) { // An iterator for all properties in one schema. #if TraceIterators printf ( "\nNew XMP schema iterator for \"%s\", options = %X\n Schema = %s\n", xmpObj.tree.name.c_str(), options, schemaNS ); #endif info.tree.children.push_back ( IterNode ( kXMP_SchemaNode, schemaNS, 0 ) ); IterNode & iterSchema = info.tree.children.back(); XMP_Node * xmpSchema = FindConstSchema ( &xmpObj.tree, schemaNS ); if ( xmpSchema != 0 ) AddSchemaProps ( info, iterSchema, xmpSchema ); if ( iterSchema.children.empty() ) { info.tree.children.pop_back(); // No properties, remove the schema node. } else { SetCurrSchema ( info, schemaNS ); } } else { // An iterator for all properties in all schema. First add schema that exist (have children), // adding aliases from them if appropriate. Then add schema that have no actual properties // but do have aliases to existing properties, if we're including aliases in the iteration. #if TraceIterators printf ( "\nNew XMP tree iterator for \"%s\", options = %X\n", xmpObj.tree.name.c_str(), options ); #endif // First pick up the schema that exist. for ( size_t schemaNum = 0, schemaLim = xmpObj.tree.children.size(); schemaNum != schemaLim; ++schemaNum ) { const XMP_Node * xmpSchema = xmpObj.tree.children[schemaNum]; info.tree.children.push_back ( IterNode ( kXMP_SchemaNode, xmpSchema->name, 0 ) ); IterNode & iterSchema = info.tree.children.back(); if ( ! (info.options & kXMP_IterJustChildren) ) { AddSchemaProps ( info, iterSchema, xmpSchema ); if ( iterSchema.children.empty() ) info.tree.children.pop_back(); // No properties, remove the schema node. } } } // Set the current iteration position to the first node to be visited. info.currPos = info.tree.children.begin(); info.endPos = info.tree.children.end(); if ( (info.options & kXMP_IterJustChildren) && (info.currPos != info.endPos) && (*schemaNS != 0) ) { info.currPos->visitStage = kIter_VisitSelf; } #if TraceIterators if ( info.currPos == info.endPos ) { printf ( " ** Empty iteration **\n" ); } else { printf ( " Initial node %s, stage = %s, iterator @ %.8X\n", info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage], this ); } #endif } // XMPIterator for XMPMeta objects // ------------------------------------------------------------------------------------------------- // XMPIterator // ----------- // // Constructor for iterations over global tables such as registered namespaces or aliases. XMPIterator::XMPIterator ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options ) : clientRefs(0), info(IterInfo(options,0)) { XMP_Throw ( "Unimplemented XMPIterator constructor for global tables", kXMPErr_Unimplemented ); void * p; p = &schemaNS; p = &propName; p = &options; // Avoid unused param warnings. } // XMPIterator for global tables // ------------------------------------------------------------------------------------------------- // ~XMPIterator // ----------- XMPIterator::~XMPIterator() RELEASE_NO_THROW { XMP_Assert ( this->clientRefs <= 0 ); // Let everything else default. } // ~XMPIterator // ================================================================================================= // Iteration Methods // ================================================================================================= // ------------------------------------------------------------------------------------------------- // Next // ---- // // Do a preorder traversal of the cached nodes. // *** Need to document the relationships between currPos, endPos, and visitStage. bool XMPIterator::Next ( XMP_StringPtr * schemaNS, XMP_StringLen * nsSize, XMP_StringPtr * propPath, XMP_StringLen * pathSize, XMP_StringPtr * propValue, XMP_StringLen * valueSize, XMP_OptionBits * propOptions ) { // *** Lock the XMPMeta object if we ever stop using a full DLL lock. // ! NOTE: Supporting aliases throws in some nastiness with schemas. There might not be any XMP // ! node for the schema, but we still have to visit it because of possible aliases. if ( info.currPos == info.endPos ) return false; // Happens at the start of an empty iteration. #if TraceIterators printf ( "Next iteration from %s, stage = %s, iterator @ %.8X\n", info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage], this ); #endif const XMP_Node * xmpNode = GetNextXMPNode ( info ); if ( xmpNode == 0 ) return false; bool isSchemaNode = XMP_NodeIsSchema ( info.currPos->options ); if ( info.options & kXMP_IterJustLeafNodes ) { while ( isSchemaNode || (! xmpNode->children.empty()) ) { info.currPos->visitStage = kIter_VisitQualifiers; // Skip to this node's children. xmpNode = GetNextXMPNode ( info ); if ( xmpNode == 0 ) return false; isSchemaNode = XMP_NodeIsSchema ( info.currPos->options ); } } *schemaNS = info.currSchema.c_str(); *nsSize = info.currSchema.size(); *propOptions = info.currPos->options; *propPath = ""; *pathSize = 0; *propValue = ""; *valueSize = 0; if ( ! (*propOptions & kXMP_SchemaNode) ) { *propPath = info.currPos->fullPath.c_str(); *pathSize = info.currPos->fullPath.size(); if ( info.options & kXMP_IterJustLeafName ) { *propPath += info.currPos->leafOffset; *pathSize -= info.currPos->leafOffset; } if ( ! (*propOptions & kXMP_PropCompositeMask) ) { *propValue = xmpNode->value.c_str(); *valueSize = xmpNode->value.size(); } } #if TraceIterators printf ( " Next node %s, stage = %s\n", info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage] ); #endif return true; } // Next // ------------------------------------------------------------------------------------------------- // Skip // ---- // // Skip some portion of the traversal related to the last visited node. We skip either that node's // children, or those children and the previous node's siblings. The implementation might look a bit // awkward because info.currNode always points to the next node to be visited. We might already have // moved past the things to skip, e.g. if the previous node was simple and the last of its siblings. enum { kXMP_ValidIterSkipOptions = kXMP_IterSkipSubtree | kXMP_IterSkipSiblings }; void XMPIterator::Skip ( XMP_OptionBits iterOptions ) { // if ( (info.currPos == kIter_NullPos) ) XMP_Throw ( "No prior postion to skip from", kXMPErr_BadIterPosition ); if ( iterOptions == 0 ) XMP_Throw ( "Must specify what to skip", kXMPErr_BadOptions ); if ( (iterOptions & ~kXMP_ValidIterSkipOptions) != 0 ) XMP_Throw ( "Undefined options", kXMPErr_BadOptions ); #if TraceIterators printf ( "Skipping from %s, stage = %s, iterator @ %.8X", info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage], this ); #endif if ( iterOptions & kXMP_IterSkipSubtree ) { #if TraceIterators printf ( ", mode = subtree\n" ); #endif info.currPos->visitStage = kIter_VisitChildren; } else if ( iterOptions & kXMP_IterSkipSiblings ) { #if TraceIterators printf ( ", mode = siblings\n" ); #endif info.currPos = info.endPos; AdvanceIterPos ( info ); } #if TraceIterators printf ( " Skipped to %s, stage = %s\n", info.currPos->fullPath.c_str(), sStageNames[info.currPos->visitStage] ); #endif } // Skip // ================================================================================================= exempi-2.2.1/source/XMPCore/ExpatAdapter.cpp0000664000175000017500000004114712150230672015576 00000000000000// ================================================================================================= // Copyright 2005 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! Must be the first #include! #include "XMPCore_Impl.hpp" #include "ExpatAdapter.hpp" #include "XMPMeta.hpp" #include "expat.h" #include using namespace std; #if XMP_WinBuild #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif // *** Set memory handlers. #ifndef DumpXMLParseEvents #define DumpXMLParseEvents 0 #endif #define FullNameSeparator '@' // ================================================================================================= static void StartNamespaceDeclHandler ( void * userData, XMP_StringPtr prefix, XMP_StringPtr uri ); static void EndNamespaceDeclHandler ( void * userData, XMP_StringPtr prefix ); static void StartElementHandler ( void * userData, XMP_StringPtr name, XMP_StringPtr* attrs ); static void EndElementHandler ( void * userData, XMP_StringPtr name ); static void CharacterDataHandler ( void * userData, XMP_StringPtr cData, int len ); static void StartCdataSectionHandler ( void * userData ); static void EndCdataSectionHandler ( void * userData ); static void ProcessingInstructionHandler ( void * userData, XMP_StringPtr target, XMP_StringPtr data ); static void CommentHandler ( void * userData, XMP_StringPtr comment ); #if BanAllEntityUsage // For now we do this by banning DOCTYPE entirely. This is easy and consistent with what is // available in recent Java XML parsers. Another, somewhat less drastic, approach would be to // ban all entity declarations. We can't allow declarations and ban references, Expat does not // call the SkippedEntityHandler for references in attribute values. // ! Standard entities (&, <, >, ", ', and numeric character references) are // ! not banned. Expat handles them transparently no matter what. static void StartDoctypeDeclHandler ( void * userData, XMP_StringPtr doctypeName, XMP_StringPtr sysid, XMP_StringPtr pubid, int has_internal_subset ); #endif // ================================================================================================= extern "C" ExpatAdapter * XMP_NewExpatAdapter ( bool useGlobalNamespaces ) { return new ExpatAdapter ( useGlobalNamespaces ); } // XMP_NewExpatAdapter // ================================================================================================= ExpatAdapter::ExpatAdapter ( bool useGlobalNamespaces ) : parser(0), registeredNamespaces(0) { #if XMP_DebugBuild this->elemNesting = 0; #if DumpXMLParseEvents if ( this->parseLog == 0 ) this->parseLog = stdout; #endif #endif this->parser = XML_ParserCreateNS ( 0, FullNameSeparator ); if ( this->parser == 0 ) XMP_Throw ( "Failure creating Expat parser", kXMPErr_ExternalFailure ); if ( useGlobalNamespaces ) { this->registeredNamespaces = sRegisteredNamespaces; } else { this->registeredNamespaces = new XMP_NamespaceTable ( *sRegisteredNamespaces ); } XML_SetUserData ( this->parser, this ); XML_SetNamespaceDeclHandler ( this->parser, StartNamespaceDeclHandler, EndNamespaceDeclHandler ); XML_SetElementHandler ( this->parser, StartElementHandler, EndElementHandler ); XML_SetCharacterDataHandler ( this->parser, CharacterDataHandler ); XML_SetCdataSectionHandler ( this->parser, StartCdataSectionHandler, EndCdataSectionHandler ); XML_SetProcessingInstructionHandler ( this->parser, ProcessingInstructionHandler ); XML_SetCommentHandler ( this->parser, CommentHandler ); #if BanAllEntityUsage XML_SetStartDoctypeDeclHandler ( this->parser, StartDoctypeDeclHandler ); isAborted = false; #endif this->parseStack.push_back ( &this->tree ); // Push the XML root node. } // ExpatAdapter::ExpatAdapter // ================================================================================================= ExpatAdapter::~ExpatAdapter() { if ( this->parser != 0 ) XML_ParserFree ( this->parser ); this->parser = 0; if ( this->registeredNamespaces != sRegisteredNamespaces ) delete ( this->registeredNamespaces ); this->registeredNamespaces = 0; } // ExpatAdapter::~ExpatAdapter // ================================================================================================= #if XMP_DebugBuild static XMP_VarString sExpatMessage; #endif static const char * kOneSpace = " "; void ExpatAdapter::ParseBuffer ( const void * buffer, size_t length, bool last /* = true */ ) { enum XML_Status status; if ( length == 0 ) { // Expat does not like empty buffers. if ( ! last ) return; buffer = kOneSpace; length = 1; } status = XML_Parse ( this->parser, (const char *)buffer, length, last ); #if BanAllEntityUsage if ( this->isAborted ) XMP_Throw ( "DOCTYPE is not allowed", kXMPErr_BadXML ); #endif if ( status != XML_STATUS_OK ) { XMP_StringPtr errMsg = "XML parsing failure"; #if 0 // XMP_DebugBuild // Disable for now to make test output uniform. Restore later with thread safety. // *** This is a good candidate for a callback error notification mechanism. // *** This code is not thread safe, the sExpatMessage isn't locked. But that's OK for debug usage. enum XML_Error expatErr = XML_GetErrorCode ( this->parser ); const char * expatMsg = XML_ErrorString ( expatErr ); int errLine = XML_GetCurrentLineNumber ( this->parser ); char msgBuffer[1000]; // AUDIT: Use of sizeof(msgBuffer) for snprintf length is safe. snprintf ( msgBuffer, sizeof(msgBuffer), "# Expat error %d at line %d, \"%s\"", expatErr, errLine, expatMsg ); sExpatMessage = msgBuffer; errMsg = sExpatMessage.c_str(); #if DumpXMLParseEvents if ( this->parseLog != 0 ) fprintf ( this->parseLog, "%s\n", errMsg, expatErr, errLine, expatMsg ); #endif #endif XMP_Throw ( errMsg, kXMPErr_BadXML ); } } // ExpatAdapter::ParseBuffer // ================================================================================================= // ================================================================================================= #if XMP_DebugBuild & DumpXMLParseEvents static inline void PrintIndent ( FILE * file, size_t count ) { for ( ; count > 0; --count ) fprintf ( file, " " ); } #endif // ================================================================================================= static void SetQualName ( ExpatAdapter * thiz, XMP_StringPtr fullName, XML_Node * node ) { // Expat delivers the full name as a catenation of namespace URI, separator, and local name. // As a compatibility hack, an "about" or "ID" attribute of an rdf:Description element is // changed to "rdf:about" or rdf:ID. Easier done here than in the RDF recognizer. // As a bug fix hack, change a URI of "http://purl.org/dc/1.1/" to ""http://purl.org/dc/elements/1.1/. // Early versions of Flash that put XMP in SWF used a bad URI for the dc: namespace. // ! This code presumes the RDF namespace prefix is "rdf". size_t sepPos = strlen(fullName); for ( --sepPos; sepPos > 0; --sepPos ) { if ( fullName[sepPos] == FullNameSeparator ) break; } if ( fullName[sepPos] == FullNameSeparator ) { XMP_StringPtr prefix; XMP_StringLen prefixLen; XMP_StringPtr localPart = fullName + sepPos + 1; node->ns.assign ( fullName, sepPos ); if ( node->ns == "http://purl.org/dc/1.1/" ) node->ns = "http://purl.org/dc/elements/1.1/"; bool found = thiz->registeredNamespaces->GetPrefix ( node->ns.c_str(), &prefix, &prefixLen ); if ( ! found ) XMP_Throw ( "Unknown URI in Expat full name", kXMPErr_ExternalFailure ); node->nsPrefixLen = prefixLen; // ! Includes the ':'. node->name = prefix; node->name += localPart; } else { node->name = fullName; // The name is not in a namespace. if ( node->parent->name == "rdf:Description" ) { if ( node->name == "about" ) { node->ns = kXMP_NS_RDF; node->name = "rdf:about"; node->nsPrefixLen = 4; // ! Include the ':'. } else if ( node->name == "ID" ) { node->ns = kXMP_NS_RDF; node->name = "rdf:ID"; node->nsPrefixLen = 4; // ! Include the ':'. } } } } // SetQualName // ================================================================================================= static void StartNamespaceDeclHandler ( void * userData, XMP_StringPtr prefix, XMP_StringPtr uri ) { IgnoreParam(userData); // As a bug fix hack, change a URI of "http://purl.org/dc/1.1/" to ""http://purl.org/dc/elements/1.1/. // Early versions of Flash that put XMP in SWF used a bad URI for the dc: namespace. ExpatAdapter * thiz = (ExpatAdapter*)userData; if ( prefix == 0 ) prefix = "_dflt_"; // Have default namespace. if ( uri == 0 ) return; // Ignore, have xmlns:pre="", no URI to register. #if XMP_DebugBuild & DumpXMLParseEvents if ( thiz->parseLog != 0 ) { PrintIndent ( thiz->parseLog, thiz->elemNesting ); fprintf ( thiz->parseLog, "StartNamespace: %s - \"%s\"\n", prefix, uri ); } #endif if ( XMP_LitMatch ( uri, "http://purl.org/dc/1.1/" ) ) uri = "http://purl.org/dc/elements/1.1/"; (void) thiz->registeredNamespaces->Define ( uri, prefix, 0, 0 ); } // StartNamespaceDeclHandler // ================================================================================================= static void EndNamespaceDeclHandler ( void * userData, XMP_StringPtr prefix ) { IgnoreParam(userData); #if XMP_DebugBuild & DumpXMLParseEvents // Avoid unused variable warning. ExpatAdapter * thiz = (ExpatAdapter*)userData; #endif if ( prefix == 0 ) prefix = "_dflt_"; // Have default namespace. #if XMP_DebugBuild & DumpXMLParseEvents if ( thiz->parseLog != 0 ) { PrintIndent ( thiz->parseLog, thiz->elemNesting ); fprintf ( thiz->parseLog, "EndNamespace: %s\n", prefix ); } #endif // ! Nothing to do, Expat has done all of the XML processing. } // EndNamespaceDeclHandler // ================================================================================================= static void StartElementHandler ( void * userData, XMP_StringPtr name, XMP_StringPtr* attrs ) { XMP_Assert ( attrs != 0 ); ExpatAdapter * thiz = (ExpatAdapter*)userData; size_t attrCount = 0; for ( XMP_StringPtr* a = attrs; *a != 0; ++a ) ++attrCount; if ( (attrCount & 1) != 0 ) XMP_Throw ( "Expat attribute info has odd length", kXMPErr_ExternalFailure ); attrCount = attrCount/2; // They are name/value pairs. #if XMP_DebugBuild & DumpXMLParseEvents if ( thiz->parseLog != 0 ) { PrintIndent ( thiz->parseLog, thiz->elemNesting ); fprintf ( thiz->parseLog, "StartElement: %s, %d attrs", name, attrCount ); for ( XMP_StringPtr* attr = attrs; *attr != 0; attr += 2 ) { XMP_StringPtr attrName = *attr; XMP_StringPtr attrValue = *(attr+1); fprintf ( thiz->parseLog, ", %s = \"%s\"", attrName, attrValue ); } fprintf ( thiz->parseLog, "\n" ); } #endif XML_Node * parentNode = thiz->parseStack.back(); XML_Node * elemNode = new XML_Node ( parentNode, "", kElemNode ); SetQualName ( thiz, name, elemNode ); for ( XMP_StringPtr* attr = attrs; *attr != 0; attr += 2 ) { XMP_StringPtr attrName = *attr; XMP_StringPtr attrValue = *(attr+1); XML_Node * attrNode = new XML_Node ( elemNode, "", kAttrNode ); SetQualName ( thiz, attrName, attrNode ); attrNode->value = attrValue; if ( attrNode->name == "xml:lang" ) NormalizeLangValue ( &attrNode->value ); elemNode->attrs.push_back ( attrNode ); } parentNode->content.push_back ( elemNode ); thiz->parseStack.push_back ( elemNode ); if ( elemNode->name == "rdf:RDF" ) { thiz->rootNode = elemNode; ++thiz->rootCount; } #if XMP_DebugBuild ++thiz->elemNesting; #endif } // StartElementHandler // ================================================================================================= static void EndElementHandler ( void * userData, XMP_StringPtr name ) { IgnoreParam(name); ExpatAdapter * thiz = (ExpatAdapter*)userData; #if XMP_DebugBuild --thiz->elemNesting; #endif (void) thiz->parseStack.pop_back(); #if XMP_DebugBuild & DumpXMLParseEvents if ( thiz->parseLog != 0 ) { PrintIndent ( thiz->parseLog, thiz->elemNesting ); fprintf ( thiz->parseLog, "EndElement: %s\n", name ); } #endif } // EndElementHandler // ================================================================================================= static void CharacterDataHandler ( void * userData, XMP_StringPtr cData, int len ) { ExpatAdapter * thiz = (ExpatAdapter*)userData; if ( (cData == 0) || (len == 0) ) { cData = ""; len = 0; } #if XMP_DebugBuild & DumpXMLParseEvents if ( thiz->parseLog != 0 ) { PrintIndent ( thiz->parseLog, thiz->elemNesting ); fprintf ( thiz->parseLog, "CharContent: \"" ); for ( int i = 0; i < len; ++i ) fprintf ( thiz->parseLog, "%c", cData[i] ); fprintf ( thiz->parseLog, "\"\n" ); } #endif XML_Node * parentNode = thiz->parseStack.back(); XML_Node * cDataNode = new XML_Node ( parentNode, "", kCDataNode ); cDataNode->value.assign ( cData, len ); parentNode->content.push_back ( cDataNode ); } // CharacterDataHandler // ================================================================================================= static void StartCdataSectionHandler ( void * userData ) { IgnoreParam(userData); #if XMP_DebugBuild & DumpXMLParseEvents // Avoid unused variable warning. ExpatAdapter * thiz = (ExpatAdapter*)userData; #endif #if XMP_DebugBuild & DumpXMLParseEvents if ( thiz->parseLog != 0 ) { PrintIndent ( thiz->parseLog, thiz->elemNesting ); fprintf ( thiz->parseLog, "StartCDATA\n" ); } #endif // *** Since markup isn't recognized inside CDATA, this affects XMP's double escaping. } // StartCdataSectionHandler // ================================================================================================= static void EndCdataSectionHandler ( void * userData ) { IgnoreParam(userData); #if XMP_DebugBuild & DumpXMLParseEvents // Avoid unused variable warning. ExpatAdapter * thiz = (ExpatAdapter*)userData; #endif #if XMP_DebugBuild & DumpXMLParseEvents if ( thiz->parseLog != 0 ) { PrintIndent ( thiz->parseLog, thiz->elemNesting ); fprintf ( thiz->parseLog, "EndCDATA\n" ); } #endif } // EndCdataSectionHandler // ================================================================================================= static void ProcessingInstructionHandler ( void * userData, XMP_StringPtr target, XMP_StringPtr data ) { XMP_Assert ( target != 0 ); ExpatAdapter * thiz = (ExpatAdapter*)userData; if ( ! XMP_LitMatch ( target, "xpacket" ) ) return; // Ignore all PIs except the XMP packet wrapper. if ( data == 0 ) data = ""; #if XMP_DebugBuild & DumpXMLParseEvents if ( thiz->parseLog != 0 ) { PrintIndent ( thiz->parseLog, thiz->elemNesting ); fprintf ( thiz->parseLog, "PI: %s - \"%s\"\n", target, data ); } #endif XML_Node * parentNode = thiz->parseStack.back(); XML_Node * piNode = new XML_Node ( parentNode, target, kPINode ); piNode->value.assign ( data ); parentNode->content.push_back ( piNode ); } // ProcessingInstructionHandler // ================================================================================================= static void CommentHandler ( void * userData, XMP_StringPtr comment ) { IgnoreParam(userData); #if XMP_DebugBuild & DumpXMLParseEvents // Avoid unused variable warning. ExpatAdapter * thiz = (ExpatAdapter*)userData; #endif if ( comment == 0 ) comment = ""; #if XMP_DebugBuild & DumpXMLParseEvents if ( thiz->parseLog != 0 ) { PrintIndent ( thiz->parseLog, thiz->elemNesting ); fprintf ( thiz->parseLog, "Comment: \"%s\"\n", comment ); } #endif // ! Comments are ignored. } // CommentHandler // ================================================================================================= #if BanAllEntityUsage static void StartDoctypeDeclHandler ( void * userData, XMP_StringPtr doctypeName, XMP_StringPtr sysid, XMP_StringPtr pubid, int has_internal_subset ) { IgnoreParam(userData); ExpatAdapter * thiz = (ExpatAdapter*)userData; #if XMP_DebugBuild & DumpXMLParseEvents // Avoid unused variable warning. if ( thiz->parseLog != 0 ) { PrintIndent ( thiz->parseLog, thiz->elemNesting ); fprintf ( thiz->parseLog, "DocType: \"%s\"\n", doctypeName ); } #endif thiz->isAborted = true; // ! Can't throw an exception across the plain C Expat frames. (void) XML_StopParser ( thiz->parser, XML_FALSE /* not resumable */ ); } // StartDoctypeDeclHandler #endif // ================================================================================================= exempi-2.2.1/source/XMPCore/WXMPIterator.cpp0000664000175000017500000001254412150230672015520 00000000000000// ================================================================================================= // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include! #include "XMP_Const.h" #include "client-glue/WXMPIterator.hpp" #include "XMPCore_Impl.hpp" #include "XMPIterator.hpp" #if XMP_WinBuild #pragma warning ( disable : 4101 ) // unreferenced local variable #pragma warning ( disable : 4189 ) // local variable is initialized but not referenced #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #if XMP_DebugBuild #pragma warning ( disable : 4297 ) // function assumed not to throw an exception but does #endif #endif #if __cplusplus extern "C" { #endif // ================================================================================================= // CTor/DTor Wrappers // ================== void WXMPIterator_PropCTor_1 ( XMPMetaRef xmpRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPIterator_PropCTor_1" ) // No lib object yet, use the static entry. if ( schemaNS == 0 ) schemaNS = ""; if ( propName == 0 ) propName = ""; const XMPMeta & xmpObj = WtoXMPMeta_Ref ( xmpRef ); XMP_AutoLock metaLock ( &xmpObj.lock, kXMP_ReadLock ); XMPIterator * iter = new XMPIterator ( xmpObj, schemaNS, propName, options ); ++iter->clientRefs; XMP_Assert ( iter->clientRefs == 1 ); wResult->ptrResult = XMPIteratorRef ( iter ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPIterator_TableCTor_1 ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPIterator_TableCTor_1" ) // No lib object yet, use the static entry. if ( schemaNS == 0 ) schemaNS = ""; if ( propName == 0 ) propName = ""; XMPIterator * iter = new XMPIterator ( schemaNS, propName, options ); ++iter->clientRefs; XMP_Assert ( iter->clientRefs == 1 ); wResult->ptrResult = XMPIteratorRef ( iter ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPIterator_IncrementRefCount_1 ( XMPIteratorRef xmpObjRef ) { WXMP_Result * wResult = &void_wResult; // ! Needed to "fool" the EnterWrapper macro. XMP_ENTER_ObjWrite ( XMPIterator, "WXMPIterator_IncrementRefCount_1" ) ++thiz->clientRefs; XMP_Assert ( thiz->clientRefs > 1 ); XMP_EXIT_NoThrow } // ------------------------------------------------------------------------------------------------- void WXMPIterator_DecrementRefCount_1 ( XMPIteratorRef xmpObjRef ) { WXMP_Result * wResult = &void_wResult; // ! Needed to "fool" the EnterWrapper macro. XMP_ENTER_ObjWrite ( XMPIterator, "WXMPIterator_DecrementRefCount_1" ) XMP_Assert ( thiz->clientRefs > 0 ); --thiz->clientRefs; if ( thiz->clientRefs <= 0 ) { objLock.Release(); delete ( thiz ); } XMP_EXIT_NoThrow } // ================================================================================================= // Class Method Wrappers // ===================== void WXMPIterator_Next_1 ( XMPIteratorRef xmpObjRef, void * schemaNS, void * propPath, void * propValue, XMP_OptionBits * propOptions, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPIterator, "WXMPIterator_Next_1" ) XMP_StringPtr schemaPtr = 0; XMP_StringLen schemaLen = 0; XMP_StringPtr pathPtr = 0; XMP_StringLen pathLen = 0; XMP_StringPtr valuePtr = 0; XMP_StringLen valueLen = 0; if ( propOptions == 0 ) propOptions = &voidOptionBits; XMP_AutoLock metaLock ( &thiz->info.xmpObj->lock, kXMP_ReadLock, (thiz->info.xmpObj != 0) ); XMP_Bool found = thiz->Next ( &schemaPtr, &schemaLen, &pathPtr, &pathLen, &valuePtr, &valueLen, propOptions ); wResult->int32Result = found; if ( found ) { if ( schemaNS != 0 ) (*SetClientString) ( schemaNS, schemaPtr, schemaLen ); if ( propPath != 0 ) (*SetClientString) ( propPath, pathPtr, pathLen ); if ( propValue != 0 ) (*SetClientString) ( propValue, valuePtr, valueLen ); } XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPIterator_Skip_1 ( XMPIteratorRef xmpObjRef, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPIterator, "WXMPIterator_Skip_1" ) XMP_AutoLock metaLock ( &thiz->info.xmpObj->lock, kXMP_ReadLock, (thiz->info.xmpObj != 0) ); thiz->Skip ( options ); XMP_EXIT } // ================================================================================================= #if __cplusplus } /* extern "C" */ #endif exempi-2.2.1/source/XMPCore/WXMPMeta.cpp0000664000175000017500000011410412150230672014610 00000000000000// ================================================================================================= // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include! #include "XMP_Const.h" #include "client-glue/WXMPMeta.hpp" #include "XMPCore_Impl.hpp" #include "XMPMeta.hpp" #if XMP_WinBuild #pragma warning ( disable : 4101 ) // unreferenced local variable #pragma warning ( disable : 4189 ) // local variable is initialized but not referenced #pragma warning ( disable : 4702 ) // unreachable code #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #if XMP_DebugBuild #pragma warning ( disable : 4297 ) // function assumed not to throw an exception but does #endif #endif #if __cplusplus extern "C" { #endif // ================================================================================================= // Init/Term Wrappers // ================== /* class static */ void WXMPMeta_GetVersionInfo_1 ( XMP_VersionInfo * info ) { WXMP_Result * wResult = &void_wResult; // ! Needed to "fool" the EnterWrapper macro. XMP_ENTER_NoLock ( "WXMPMeta_GetVersionInfo_1" ) XMPMeta::GetVersionInfo ( info ); XMP_EXIT_NoThrow } // ------------------------------------------------------------------------------------------------- /* class static */ void WXMPMeta_Initialize_1 ( WXMP_Result * wResult ) { XMP_ENTER_NoLock ( "WXMPMeta_Initialize_1" ) wResult->int32Result = XMPMeta::Initialize(); XMP_EXIT } // ------------------------------------------------------------------------------------------------- /* class static */ void WXMPMeta_Terminate_1() { WXMP_Result * wResult = &void_wResult; // ! Needed to "fool" the EnterWrapper macro. XMP_ENTER_NoLock ( "WXMPMeta_Terminate_1" ) XMPMeta::Terminate(); XMP_EXIT_NoThrow } // ================================================================================================= // CTor/DTor Wrappers // ================== void WXMPMeta_CTor_1 ( WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPMeta_CTor_1" ) // No lib object yet, use the static entry. XMPMeta * xmpObj = new XMPMeta(); ++xmpObj->clientRefs; XMP_Assert ( xmpObj->clientRefs == 1 ); wResult->ptrResult = XMPMetaRef ( xmpObj ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_IncrementRefCount_1 ( XMPMetaRef xmpObjRef ) { WXMP_Result * wResult = &void_wResult; // ! Needed to "fool" the EnterWrapper macro. XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_IncrementRefCount_1" ) ++thiz->clientRefs; XMP_Assert ( thiz->clientRefs > 0 ); XMP_EXIT_NoThrow } // ------------------------------------------------------------------------------------------------- void WXMPMeta_DecrementRefCount_1 ( XMPMetaRef xmpObjRef ) { WXMP_Result * wResult = &void_wResult; // ! Needed to "fool" the EnterWrapper macro. XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_DecrementRefCount_1" ) XMP_Assert ( thiz->clientRefs > 0 ); --thiz->clientRefs; if ( thiz->clientRefs <= 0 ) { objLock.Release(); delete ( thiz ); } XMP_EXIT_NoThrow } // ================================================================================================= // Class Static Wrappers // ===================== /* class static */ void WXMPMeta_GetGlobalOptions_1 ( WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPMeta_GetGlobalOptions_1" ) XMP_OptionBits options = XMPMeta::GetGlobalOptions(); wResult->int32Result = options; XMP_EXIT } // ------------------------------------------------------------------------------------------------- /* class static */ void WXMPMeta_SetGlobalOptions_1 ( XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPMeta_SetGlobalOptions_1" ) XMPMeta::SetGlobalOptions ( options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- /* class static */ void WXMPMeta_DumpNamespaces_1 ( XMP_TextOutputProc outProc, void * refCon, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPMeta_DumpNamespaces_1" ) if ( outProc == 0 ) XMP_Throw ( "Null client output routine", kXMPErr_BadParam ); XMP_Status status = XMPMeta::DumpNamespaces ( outProc, refCon ); wResult->int32Result = status; XMP_EXIT } // ------------------------------------------------------------------------------------------------- /* class static */ void WXMPMeta_RegisterNamespace_1 ( XMP_StringPtr namespaceURI, XMP_StringPtr suggestedPrefix, void * actualPrefix, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPMeta_RegisterNamespace_1" ) if ( (namespaceURI == 0) || (*namespaceURI == 0) ) XMP_Throw ( "Empty namespace URI", kXMPErr_BadSchema ); if ( (suggestedPrefix == 0) || (*suggestedPrefix == 0) ) XMP_Throw ( "Empty suggested prefix", kXMPErr_BadSchema ); XMP_StringPtr prefixPtr = 0; XMP_StringLen prefixSize = 0; bool prefixMatch = XMPMeta::RegisterNamespace ( namespaceURI, suggestedPrefix, &prefixPtr, &prefixSize ); wResult->int32Result = prefixMatch; if ( actualPrefix != 0 ) (*SetClientString) ( actualPrefix, prefixPtr, prefixSize ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- /* class static */ void WXMPMeta_GetNamespacePrefix_1 ( XMP_StringPtr namespaceURI, void * namespacePrefix, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPMeta_GetNamespacePrefix_1" ) if ( (namespaceURI == 0) || (*namespaceURI == 0) ) XMP_Throw ( "Empty namespace URI", kXMPErr_BadSchema ); XMP_StringPtr prefixPtr = 0; XMP_StringLen prefixSize = 0; bool found = XMPMeta::GetNamespacePrefix ( namespaceURI, &prefixPtr, &prefixSize ); wResult->int32Result = found; if ( found && (namespacePrefix != 0) ) (*SetClientString) ( namespacePrefix, prefixPtr, prefixSize ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- /* class static */ void WXMPMeta_GetNamespaceURI_1 ( XMP_StringPtr namespacePrefix, void * namespaceURI, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPMeta_GetNamespaceURI_1" ) if ( (namespacePrefix == 0) || (*namespacePrefix == 0) ) XMP_Throw ( "Empty namespace prefix", kXMPErr_BadSchema ); XMP_StringPtr uriPtr = 0; XMP_StringLen uriSize = 0; bool found = XMPMeta::GetNamespaceURI ( namespacePrefix, &uriPtr, &uriSize ); wResult->int32Result = found; if ( found && (namespaceURI != 0) ) (*SetClientString) ( namespaceURI, uriPtr, uriSize ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- /* class static */ void WXMPMeta_DeleteNamespace_1 ( XMP_StringPtr namespaceURI, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPMeta_DeleteNamespace_1" ) if ( (namespaceURI == 0) || (*namespaceURI == 0) ) XMP_Throw ( "Empty namespace URI", kXMPErr_BadSchema ); XMPMeta::DeleteNamespace ( namespaceURI ); XMP_EXIT } // ================================================================================================= // Class Method Wrappers // ===================== void WXMPMeta_GetProperty_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, void * propValue, XMP_OptionBits * options, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_GetProperty_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); XMP_StringPtr valuePtr = 0; XMP_StringLen valueSize = 0; if ( options == 0 ) options = &voidOptionBits; bool found = thiz.GetProperty ( schemaNS, propName, &valuePtr, &valueSize, options ); wResult->int32Result = found; if ( found && (propValue != 0) ) (*SetClientString) ( propValue, valuePtr, valueSize ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_GetArrayItem_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, void * itemValue, XMP_OptionBits * options, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_GetArrayItem_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); XMP_StringPtr valuePtr = 0; XMP_StringLen valueSize = 0; if ( options == 0 ) options = &voidOptionBits; bool found = thiz.GetArrayItem ( schemaNS, arrayName, itemIndex, &valuePtr, &valueSize, options ); wResult->int32Result = found; if ( found && (itemValue != 0) ) (*SetClientString) ( itemValue, valuePtr, valueSize ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_GetStructField_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, void * fieldValue, XMP_OptionBits * options, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_GetStructField_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (structName == 0) || (*structName == 0) ) XMP_Throw ( "Empty struct name", kXMPErr_BadXPath ); if ( (fieldNS == 0) || (*fieldNS == 0) ) XMP_Throw ( "Empty field namespace URI", kXMPErr_BadSchema ); if ( (fieldName == 0) || (*fieldName == 0) ) XMP_Throw ( "Empty field name", kXMPErr_BadXPath ); XMP_StringPtr valuePtr = 0; XMP_StringLen valueSize = 0; if ( options == 0 ) options = &voidOptionBits; bool found = thiz.GetStructField ( schemaNS, structName, fieldNS, fieldName, &valuePtr, &valueSize, options ); wResult->int32Result = found; if ( found && (fieldValue != 0) ) (*SetClientString) ( fieldValue, valuePtr, valueSize ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_GetQualifier_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, void * qualValue, XMP_OptionBits * options, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_GetQualifier_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); if ( (qualNS == 0) || (*qualNS == 0) ) XMP_Throw ( "Empty qualifier namespace URI", kXMPErr_BadSchema ); if ( (qualName == 0) || (*qualName == 0) ) XMP_Throw ( "Empty qualifier name", kXMPErr_BadXPath ); XMP_StringPtr valuePtr = 0; XMP_StringLen valueSize = 0; if ( options == 0 ) options = &voidOptionBits; bool found = thiz.GetQualifier ( schemaNS, propName, qualNS, qualName, &valuePtr, &valueSize, options ); wResult->int32Result = found; if ( found && (qualValue != 0) ) (*SetClientString) ( qualValue, valuePtr, valueSize ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_SetProperty_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr propValue, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_SetProperty_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); thiz->SetProperty ( schemaNS, propName, propValue, options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_SetArrayItem_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, XMP_StringPtr itemValue, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_SetArrayItem_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); thiz->SetArrayItem ( schemaNS, arrayName, itemIndex, itemValue, options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_AppendArrayItem_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, XMP_StringPtr itemValue, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_AppendArrayItem_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); thiz->AppendArrayItem ( schemaNS, arrayName, arrayOptions, itemValue, options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_SetStructField_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_SetStructField_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (structName == 0) || (*structName == 0) ) XMP_Throw ( "Empty struct name", kXMPErr_BadXPath ); if ( (fieldNS == 0) || (*fieldNS == 0) ) XMP_Throw ( "Empty field namespace URI", kXMPErr_BadSchema ); if ( (fieldName == 0) || (*fieldName == 0) ) XMP_Throw ( "Empty field name", kXMPErr_BadXPath ); thiz->SetStructField ( schemaNS, structName, fieldNS, fieldName, fieldValue, options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_SetQualifier_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, XMP_StringPtr qualValue, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_SetQualifier_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); if ( (qualNS == 0) || (*qualNS == 0) ) XMP_Throw ( "Empty qualifier namespace URI", kXMPErr_BadSchema ); if ( (qualName == 0) || (*qualName == 0) ) XMP_Throw ( "Empty qualifier name", kXMPErr_BadXPath ); thiz->SetQualifier ( schemaNS, propName, qualNS, qualName, qualValue, options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_DeleteProperty_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_DeleteProperty_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); thiz->DeleteProperty ( schemaNS, propName ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_DeleteArrayItem_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_DeleteArrayItem_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); thiz->DeleteArrayItem ( schemaNS, arrayName, itemIndex ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_DeleteStructField_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_DeleteStructField_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (structName == 0) || (*structName == 0) ) XMP_Throw ( "Empty struct name", kXMPErr_BadXPath ); if ( (fieldNS == 0) || (*fieldNS == 0) ) XMP_Throw ( "Empty field namespace URI", kXMPErr_BadSchema ); if ( (fieldName == 0) || (*fieldName == 0) ) XMP_Throw ( "Empty field name", kXMPErr_BadXPath ); thiz->DeleteStructField ( schemaNS, structName, fieldNS, fieldName ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_DeleteQualifier_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_DeleteQualifier_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); if ( (qualNS == 0) || (*qualNS == 0) ) XMP_Throw ( "Empty qualifier namespace URI", kXMPErr_BadSchema ); if ( (qualName == 0) || (*qualName == 0) ) XMP_Throw ( "Empty qualifier name", kXMPErr_BadXPath ); thiz->DeleteQualifier ( schemaNS, propName, qualNS, qualName ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_DoesPropertyExist_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_DoesPropertyExist_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); bool found = thiz.DoesPropertyExist ( schemaNS, propName ); wResult->int32Result = found; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_DoesArrayItemExist_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_DoesArrayItemExist_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); bool found = thiz.DoesArrayItemExist ( schemaNS, arrayName, itemIndex ); wResult->int32Result = found; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_DoesStructFieldExist_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_DoesStructFieldExist_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (structName == 0) || (*structName == 0) ) XMP_Throw ( "Empty struct name", kXMPErr_BadXPath ); if ( (fieldNS == 0) || (*fieldNS == 0) ) XMP_Throw ( "Empty field namespace URI", kXMPErr_BadSchema ); if ( (fieldName == 0) || (*fieldName == 0) ) XMP_Throw ( "Empty field name", kXMPErr_BadXPath ); bool found = thiz.DoesStructFieldExist ( schemaNS, structName, fieldNS, fieldName ); wResult->int32Result = found; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_DoesQualifierExist_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_DoesQualifierExist_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); if ( (qualNS == 0) || (*qualNS == 0) ) XMP_Throw ( "Empty qualifier namespace URI", kXMPErr_BadSchema ); if ( (qualName == 0) || (*qualName == 0) ) XMP_Throw ( "Empty qualifier name", kXMPErr_BadXPath ); bool found = thiz.DoesQualifierExist ( schemaNS, propName, qualNS, qualName ); wResult->int32Result = found; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_GetLocalizedText_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, void * actualLang, void * itemValue, XMP_OptionBits * options, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_GetLocalizedText_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); if ( genericLang == 0 ) genericLang = ""; if ( (specificLang == 0) ||(*specificLang == 0) ) XMP_Throw ( "Empty specific language", kXMPErr_BadParam ); XMP_StringPtr langPtr = 0; XMP_StringLen langSize = 0; XMP_StringPtr valuePtr = 0; XMP_StringLen valueSize = 0; if ( options == 0 ) options = &voidOptionBits; bool found = thiz.GetLocalizedText ( schemaNS, arrayName, genericLang, specificLang, &langPtr, &langSize, &valuePtr, &valueSize, options ); wResult->int32Result = found; if ( found ) { if ( actualLang != 0 ) (*SetClientString) ( actualLang, langPtr, langSize ); if ( itemValue != 0 ) (*SetClientString) ( itemValue, valuePtr, valueSize ); } XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_SetLocalizedText_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, XMP_StringPtr itemValue, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_SetLocalizedText_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); if ( genericLang == 0 ) genericLang = ""; if ( (specificLang == 0) ||(*specificLang == 0) ) XMP_Throw ( "Empty specific language", kXMPErr_BadParam ); if ( itemValue == 0 ) itemValue = ""; thiz->SetLocalizedText ( schemaNS, arrayName, genericLang, specificLang, itemValue, options ); XMP_EXIT } void WXMPMeta_DeleteLocalizedText_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_DeleteLocalizedText_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); if ( genericLang == 0 ) genericLang = ""; if ( (specificLang == 0) ||(*specificLang == 0) ) XMP_Throw ( "Empty specific language", kXMPErr_BadParam ); thiz->DeleteLocalizedText ( schemaNS, arrayName, genericLang, specificLang ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_GetProperty_Bool_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Bool * propValue, XMP_OptionBits * options, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_GetProperty_Bool_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); if ( propValue == 0 ) propValue = &voidByte; if ( options == 0 ) options = &voidOptionBits; bool value; bool found = thiz.GetProperty_Bool ( schemaNS, propName, &value, options ); if ( propValue != 0 ) *propValue = value; wResult->int32Result = found; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_GetProperty_Int_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int32 * propValue, XMP_OptionBits * options, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_GetProperty_Int_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); if ( propValue == 0 ) propValue = &voidInt32; if ( options == 0 ) options = &voidOptionBits; bool found = thiz.GetProperty_Int ( schemaNS, propName, propValue, options ); wResult->int32Result = found; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_GetProperty_Int64_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int64 * propValue, XMP_OptionBits * options, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_GetProperty_Int64_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); if ( propValue == 0 ) propValue = &voidInt64; if ( options == 0 ) options = &voidOptionBits; bool found = thiz.GetProperty_Int64 ( schemaNS, propName, propValue, options ); wResult->int32Result = found; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_GetProperty_Float_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, double * propValue, XMP_OptionBits * options, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_GetProperty_Float_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); if ( propValue == 0 ) propValue = &voidDouble; if ( options == 0 ) options = &voidOptionBits; bool found = thiz.GetProperty_Float ( schemaNS, propName, propValue, options ); wResult->int32Result = found; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_GetProperty_Date_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_DateTime * propValue, XMP_OptionBits * options, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_GetProperty_Date_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); if ( propValue == 0 ) propValue = &voidDateTime; if ( options == 0 ) options = &voidOptionBits; bool found = thiz.GetProperty_Date ( schemaNS, propName, propValue, options ); wResult->int32Result = found; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_SetProperty_Bool_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Bool propValue, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_SetProperty_Bool_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); thiz->SetProperty_Bool ( schemaNS, propName, propValue, options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_SetProperty_Int_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int32 propValue, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_SetProperty_Int_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); thiz->SetProperty_Int ( schemaNS, propName, propValue, options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_SetProperty_Int64_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int64 propValue, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_SetProperty_Int64_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); thiz->SetProperty_Int64 ( schemaNS, propName, propValue, options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_SetProperty_Float_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, double propValue, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_SetProperty_Float_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); thiz->SetProperty_Float ( schemaNS, propName, propValue, options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_SetProperty_Date_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr propName, const XMP_DateTime & propValue, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_SetProperty_Date_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); thiz->SetProperty_Date ( schemaNS, propName, propValue, options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_DumpObject_1 ( XMPMetaRef xmpObjRef, XMP_TextOutputProc outProc, void * refCon, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_DumpObject_1" ) if ( outProc == 0 ) XMP_Throw ( "Null client output routine", kXMPErr_BadParam ); thiz.DumpObject ( outProc, refCon ); wResult->int32Result = 0; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_Sort_1 ( XMPMetaRef xmpObjRef, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_Sort_1" ) thiz->Sort(); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_Erase_1 ( XMPMetaRef xmpObjRef, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_Erase_1" ) thiz->Erase(); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_Clone_1 ( XMPMetaRef xmpObjRef, XMP_OptionBits options, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_Clone_1" ) XMPMeta * xClone = new XMPMeta; // ! Don't need an output lock, final ref assignment in client glue. thiz.Clone ( xClone, options ); XMP_Assert ( xClone->clientRefs == 0 ); // ! Gets incremented in TXMPMeta::Clone. wResult->ptrResult = xClone; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_CountArrayItems_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_CountArrayItems_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); XMP_Index count = thiz.CountArrayItems ( schemaNS, arrayName ); wResult->int32Result = count; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_GetObjectName_1 ( XMPMetaRef xmpObjRef, void * objName, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_GetObjectName_1" ) XMP_StringPtr namePtr = 0; XMP_StringLen nameSize = 0; thiz.GetObjectName ( &namePtr, &nameSize ); if ( objName != 0 ) (*SetClientString) ( objName, namePtr, nameSize ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_SetObjectName_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr name, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_SetObjectName_1" ) if ( name == 0 ) name = ""; thiz->SetObjectName ( name ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_GetObjectOptions_1 ( XMPMetaRef xmpObjRef, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_GetObjectOptions_1" ) XMP_OptionBits options = thiz.GetObjectOptions(); wResult->int32Result = options; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_SetObjectOptions_1 ( XMPMetaRef xmpObjRef, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_SetObjectOptions_1" ) thiz->SetObjectOptions ( options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_ParseFromBuffer_1 ( XMPMetaRef xmpObjRef, XMP_StringPtr buffer, XMP_StringLen bufferSize, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPMeta, "WXMPMeta_ParseFromBuffer_1" ) thiz->ParseFromBuffer ( buffer, bufferSize, options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPMeta_SerializeToBuffer_1 ( XMPMetaRef xmpObjRef, void * pktString, XMP_OptionBits options, XMP_StringLen padding, XMP_StringPtr newline, XMP_StringPtr indent, XMP_Index baseIndent, SetClientStringProc SetClientString, WXMP_Result * wResult ) /* const */ { XMP_ENTER_ObjRead ( XMPMeta, "WXMPMeta_SerializeToBuffer_1" ) XMP_VarString localStr; if ( newline == 0 ) newline = ""; if ( indent == 0 ) indent = ""; thiz.SerializeToBuffer ( &localStr, options, padding, newline, indent, baseIndent ); if ( pktString != 0 ) (*SetClientString) ( pktString, localStr.c_str(), localStr.size() ); XMP_EXIT } // ================================================================================================= #if __cplusplus } /* extern "C" */ #endif exempi-2.2.1/source/XMPCore/XMPMeta-GetSet.cpp0000664000175000017500000012403012150230672015651 00000000000000// ================================================================================================= // Copyright 2003 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // Adobe patent application tracking #P435, entitled 'Unique markers to simplify embedding data of // one format in a file with a different format', inventors: Sean Parent, Greg Gilley. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include! #include "XMPCore_Impl.hpp" #include "XMPMeta.hpp" #include "XMPIterator.hpp" #include "XMPUtils.hpp" #include "XMP_Version.h" #include "UnicodeInlines.incl_cpp" #include "UnicodeConversions.hpp" #include "ExpatAdapter.hpp" #if XMP_DebugBuild #include #endif using namespace std; #if XMP_WinBuild #pragma warning ( disable : 4533 ) // initialization of '...' is skipped by 'goto ...' #pragma warning ( disable : 4702 ) // unreachable code #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #endif // *** Use the XMP_PropIsXyz (Schema, Simple, Struct, Array, ...) macros // *** Add debug codegen checks, e.g. that typical masking operations really work // *** Change all uses of strcmp and strncmp to XMP_LitMatch and XMP_LitNMatch // ================================================================================================= // Local Types and Constants // ========================= typedef unsigned char XMP_CLTMatch; enum { // Values for XMP_CLTMatch. kXMP_CLT_NoValues, kXMP_CLT_SpecificMatch, kXMP_CLT_SingleGeneric, kXMP_CLT_MultipleGeneric, kXMP_CLT_XDefault, kXMP_CLT_FirstItem }; // ================================================================================================= // Static Variables // ================ // ================================================================================================= // Local Utilities // =============== // ------------------------------------------------------------------------------------------------- // SetNodeValue // ------------ static inline void SetNodeValue ( XMP_Node * node, XMP_StringPtr value ) { #if XMP_DebugBuild // ! Hack to force an assert. if ( (node->name == "xmp:TestAssertNotify") && XMP_LitMatch ( value, "DoIt!" ) ) { XMP_Assert ( node->name != "xmp:TestAssertNotify" ); } #endif std::string newValue = value; // Need a local copy to tweak and not change node.value for errors. XMP_Uns8* chPtr = (XMP_Uns8*) newValue.c_str(); // Check for valid UTF-8, replace ASCII controls with a space. while ( *chPtr != 0 ) { while ( (*chPtr != 0) && (*chPtr < 0x80) ) { if ( *chPtr < 0x20 ) { if ( (*chPtr != kTab) && (*chPtr != kLF) && (*chPtr != kCR) ) *chPtr = 0x20; } else if (*chPtr == 0x7F ) { *chPtr = 0x20; } ++chPtr; } XMP_Assert ( (*chPtr == 0) || (*chPtr >= 0x80) ); if ( *chPtr != 0 ) { XMP_Uns32 cp = GetCodePoint ( (const XMP_Uns8 **) &chPtr ); // Throws for bad UTF-8. if ( (cp == 0xFFFE) || (cp == 0xFFFF) ) { XMP_Throw ( "U+FFFE and U+FFFF are not allowed in XML", kXMPErr_BadXML ); } } } if ( XMP_PropIsQualifier(node->options) && (node->name == "xml:lang") ) NormalizeLangValue ( &newValue ); node->value.swap ( newValue ); #if 0 // *** XMP_DebugBuild node->_valuePtr = node->value.c_str(); #endif } // SetNodeValue // ------------------------------------------------------------------------------------------------- // SetNode // ------- // // The internals for SetProperty and related calls, used after the node is found or created. static void SetNode ( XMP_Node * node, XMP_StringPtr value, XMP_OptionBits options ) { if ( options & kXMP_DeleteExisting ) { XMP_ClearOption ( options, kXMP_DeleteExisting ); node->options = options; node->value.erase(); node->RemoveChildren(); node->RemoveQualifiers(); } node->options |= options; // Keep options set by FindNode when creating a new node. if ( value != 0 ) { // This is setting the value of a leaf node. if ( node->options & kXMP_PropCompositeMask ) XMP_Throw ( "Composite nodes can't have values", kXMPErr_BadXPath ); XMP_Assert ( node->children.empty() ); SetNodeValue ( node, value ); } else { // This is setting up an array or struct. if ( ! node->value.empty() ) XMP_Throw ( "Composite nodes can't have values", kXMPErr_BadXPath ); if ( node->options & kXMP_PropCompositeMask ) { // Can't change an array to a struct, or vice versa. if ( (options & kXMP_PropCompositeMask) != (node->options & kXMP_PropCompositeMask) ) { XMP_Throw ( "Requested and existing composite form mismatch", kXMPErr_BadXPath ); } } node->RemoveChildren(); } } // SetNode // ------------------------------------------------------------------------------------------------- // DoSetArrayItem // -------------- static void DoSetArrayItem ( XMP_Node * arrayNode, XMP_Index itemIndex, XMP_StringPtr itemValue, XMP_OptionBits options ) { XMP_OptionBits itemLoc = options & kXMP_PropArrayLocationMask; XMP_Index arraySize = arrayNode->children.size(); options &= ~kXMP_PropArrayLocationMask; options = VerifySetOptions ( options, itemValue ); // Now locate or create the item node and set the value. Note the index parameter is one-based! // The index can be in the range [0..size+1] or "last", normalize it and check the insert flags. // The order of the normalization checks is important. If the array is empty we end up with an // index and location to set item size+1. XMP_Node * itemNode = 0; if ( itemIndex == kXMP_ArrayLastItem ) itemIndex = arraySize; if ( (itemIndex == 0) && (itemLoc == kXMP_InsertAfterItem) ) { itemIndex = 1; itemLoc = kXMP_InsertBeforeItem; } if ( (itemIndex == arraySize) && (itemLoc == kXMP_InsertAfterItem) ) { itemIndex += 1; itemLoc = 0; } if ( (itemIndex == arraySize+1) && (itemLoc == kXMP_InsertBeforeItem) ) itemLoc = 0; if ( itemIndex == arraySize+1 ) { if ( itemLoc != 0 ) XMP_Throw ( "Can't insert before or after implicit new item", kXMPErr_BadIndex ); itemNode = new XMP_Node ( arrayNode, kXMP_ArrayItemName, 0 ); arrayNode->children.push_back ( itemNode ); } else { if ( (itemIndex < 1) || (itemIndex > arraySize) ) XMP_Throw ( "Array index out of bounds", kXMPErr_BadIndex ); --itemIndex; // ! Convert the index to a C zero-based value! if ( itemLoc == 0 ) { itemNode = arrayNode->children[itemIndex]; } else { XMP_NodePtrPos itemPos = arrayNode->children.begin() + itemIndex; if ( itemLoc == kXMP_InsertAfterItem ) ++itemPos; itemNode = new XMP_Node ( arrayNode, kXMP_ArrayItemName, 0 ); itemPos = arrayNode->children.insert ( itemPos, itemNode ); } } SetNode ( itemNode, itemValue, options ); } // DoSetArrayItem // ------------------------------------------------------------------------------------------------- // ChooseLocalizedText // ------------------- // // 1. Look for an exact match with the specific language. // 2. If a generic language is given, look for partial matches. // 3. Look for an "x-default" item. // 4. Choose the first item. static XMP_CLTMatch ChooseLocalizedText ( const XMP_Node * arrayNode, XMP_StringPtr genericLang, XMP_StringPtr specificLang, const XMP_Node * * itemNode ) { const XMP_Node * currItem = 0; const size_t itemLim = arrayNode->children.size(); size_t itemNum; // See if the array has the right form. Allow empty alt arrays, that is what parsing returns. // *** Should check alt-text bit when that is reliably maintained. if ( ! ( XMP_ArrayIsAltText(arrayNode->options) || (arrayNode->children.empty() && XMP_ArrayIsAlternate(arrayNode->options)) ) ) { XMP_Throw ( "Localized text array is not alt-text", kXMPErr_BadXPath ); } if ( arrayNode->children.empty() ) { *itemNode = 0; return kXMP_CLT_NoValues; } for ( itemNum = 0; itemNum < itemLim; ++itemNum ) { currItem = arrayNode->children[itemNum]; if ( currItem->options & kXMP_PropCompositeMask ) { XMP_Throw ( "Alt-text array item is not simple", kXMPErr_BadXPath ); } if ( currItem->qualifiers.empty() || (currItem->qualifiers[0]->name != "xml:lang") ) { XMP_Throw ( "Alt-text array item has no language qualifier", kXMPErr_BadXPath ); } } // Look for an exact match with the specific language. for ( itemNum = 0; itemNum < itemLim; ++itemNum ) { currItem = arrayNode->children[itemNum]; if ( currItem->qualifiers[0]->value == specificLang ) { *itemNode = currItem; return kXMP_CLT_SpecificMatch; } } if ( *genericLang != 0 ) { // Look for the first partial match with the generic language. const size_t genericLen = strlen ( genericLang ); for ( itemNum = 0; itemNum < itemLim; ++itemNum ) { currItem = arrayNode->children[itemNum]; XMP_StringPtr currLang = currItem->qualifiers[0]->value.c_str(); const size_t currLangSize = currItem->qualifiers[0]->value.size(); if ( (currLangSize >= genericLen) && XMP_LitNMatch ( currLang, genericLang, genericLen ) && ((currLangSize == genericLen) || (currLang[genericLen] == '-')) ) { *itemNode = currItem; break; // ! Don't return, need to look for other matches. } } if ( itemNum < itemLim ) { // Look for a second partial match with the generic language. for ( ++itemNum; itemNum < itemLim; ++itemNum ) { currItem = arrayNode->children[itemNum]; XMP_StringPtr currLang = currItem->qualifiers[0]->value.c_str(); const size_t currLangSize = currItem->qualifiers[0]->value.size(); if ( (currLangSize >= genericLen) && XMP_LitNMatch ( currLang, genericLang, genericLen ) && ((currLangSize == genericLen) || (currLang[genericLen] == '-')) ) { return kXMP_CLT_MultipleGeneric; // ! Leave itemNode with the first partial match. } } return kXMP_CLT_SingleGeneric; // No second partial match was found. } } // Look for an 'x-default' item. for ( itemNum = 0; itemNum < itemLim; ++itemNum ) { currItem = arrayNode->children[itemNum]; if ( currItem->qualifiers[0]->value == "x-default" ) { *itemNode = currItem; return kXMP_CLT_XDefault; } } // Everything failed, choose the first item. *itemNode = arrayNode->children[0]; return kXMP_CLT_FirstItem; } // ChooseLocalizedText // ------------------------------------------------------------------------------------------------- // AppendLangItem // -------------- static void AppendLangItem ( XMP_Node * arrayNode, XMP_StringPtr itemLang, XMP_StringPtr itemValue ) { XMP_Node * newItem = new XMP_Node ( arrayNode, kXMP_ArrayItemName, (kXMP_PropHasQualifiers | kXMP_PropHasLang) ); XMP_Node * langQual = new XMP_Node ( newItem, "xml:lang", kXMP_PropIsQualifier ); try { // ! Use SetNodeValue, not constructors above, to get the character checks. SetNodeValue ( newItem, itemValue ); SetNodeValue ( langQual, itemLang ); } catch (...) { delete newItem; delete langQual; throw; } newItem->qualifiers.push_back ( langQual ); if ( (arrayNode->children.empty()) || (langQual->value != "x-default") ) { arrayNode->children.push_back ( newItem ); } else { arrayNode->children.insert ( arrayNode->children.begin(), newItem ); } } // AppendLangItem // ================================================================================================= // Class Methods // ============= // // // ================================================================================================= // ------------------------------------------------------------------------------------------------- // GetProperty // ----------- bool XMPMeta::GetProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr * propValue, XMP_StringLen * valueSize, XMP_OptionBits * options ) const { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. XMP_Assert ( (propValue != 0) && (valueSize != 0) && (options != 0) ); // Enforced by wrapper. XMP_ExpandedXPath expPath; ExpandXPath ( schemaNS, propName, &expPath ); XMP_Node * propNode = FindConstNode ( &tree, expPath ); if ( propNode == 0 ) return false; *propValue = propNode->value.c_str(); *valueSize = propNode->value.size(); *options = propNode->options; return true; } // GetProperty // ------------------------------------------------------------------------------------------------- // GetArrayItem // ------------ bool XMPMeta::GetArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, XMP_StringPtr * itemValue, XMP_StringLen * valueSize, XMP_OptionBits * options ) const { XMP_Assert ( (schemaNS != 0) && (arrayName != 0) ); // Enforced by wrapper. XMP_Assert ( (itemValue != 0) && (options != 0) ); // Enforced by wrapper. // ! Special case check to make errors consistent if the array does not exist. The other array // ! functions and existing array here (empty or not) already throw. if ( (itemIndex <= 0) && (itemIndex != kXMP_ArrayLastItem) ) XMP_Throw ( "Array index must be larger than zero", kXMPErr_BadXPath ); XMP_VarString itemPath; XMPUtils::ComposeArrayItemPath ( schemaNS, arrayName, itemIndex, &itemPath ); return GetProperty ( schemaNS, itemPath.c_str(), itemValue, valueSize, options ); } // GetArrayItem // ------------------------------------------------------------------------------------------------- // GetStructField // -------------- bool XMPMeta::GetStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr * fieldValue, XMP_StringLen * valueSize, XMP_OptionBits * options ) const { XMP_Assert ( (schemaNS != 0) && (structName != 0) && (fieldNS != 0) && (fieldName != 0) ); // Enforced by wrapper. XMP_Assert ( (fieldValue != 0) && (options != 0) ); // Enforced by wrapper. XMP_VarString fieldPath; XMPUtils::ComposeStructFieldPath ( schemaNS, structName, fieldNS, fieldName, &fieldPath ); return GetProperty ( schemaNS, fieldPath.c_str(), fieldValue, valueSize, options ); } // GetStructField // ------------------------------------------------------------------------------------------------- // GetQualifier // ------------ bool XMPMeta::GetQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, XMP_StringPtr * qualValue, XMP_StringLen * valueSize, XMP_OptionBits * options ) const { XMP_Assert ( (schemaNS != 0) && (propName != 0) && (qualNS != 0) && (qualName != 0) ); // Enforced by wrapper. XMP_Assert ( (qualValue != 0) && (options != 0) ); // Enforced by wrapper. XMP_VarString qualPath; XMPUtils::ComposeQualifierPath ( schemaNS, propName, qualNS, qualName, &qualPath ); return GetProperty ( schemaNS, qualPath.c_str(), qualValue, valueSize, options ); } // GetQualifier // ------------------------------------------------------------------------------------------------- // SetProperty // ----------- // *** Should handle array items specially, calling SetArrayItem. void XMPMeta::SetProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr propValue, XMP_OptionBits options ) { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. options = VerifySetOptions ( options, propValue ); XMP_ExpandedXPath expPath; ExpandXPath ( schemaNS, propName, &expPath ); XMP_Node * propNode = FindNode ( &tree, expPath, kXMP_CreateNodes, options ); if ( propNode == 0 ) XMP_Throw ( "Specified property does not exist", kXMPErr_BadXPath ); SetNode ( propNode, propValue, options ); } // SetProperty // ------------------------------------------------------------------------------------------------- // SetArrayItem // ------------ void XMPMeta::SetArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, XMP_StringPtr itemValue, XMP_OptionBits options ) { XMP_Assert ( (schemaNS != 0) && (arrayName != 0) ); // Enforced by wrapper. XMP_ExpandedXPath arrayPath; ExpandXPath ( schemaNS, arrayName, &arrayPath ); XMP_Node * arrayNode = FindNode ( &tree, arrayPath, kXMP_ExistingOnly ); // Just lookup, don't try to create. if ( arrayNode == 0 ) XMP_Throw ( "Specified array does not exist", kXMPErr_BadXPath ); DoSetArrayItem ( arrayNode, itemIndex, itemValue, options ); } // SetArrayItem // ------------------------------------------------------------------------------------------------- // AppendArrayItem // --------------- void XMPMeta::AppendArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, XMP_StringPtr itemValue, XMP_OptionBits options ) { XMP_Assert ( (schemaNS != 0) && (arrayName != 0) ); // Enforced by wrapper. arrayOptions = VerifySetOptions ( arrayOptions, 0 ); if ( (arrayOptions & ~kXMP_PropArrayFormMask) != 0 ) { XMP_Throw ( "Only array form flags allowed for arrayOptions", kXMPErr_BadOptions ); } // Locate or create the array. If it already exists, make sure the array form from the options // parameter is compatible with the current state. XMP_ExpandedXPath arrayPath; ExpandXPath ( schemaNS, arrayName, &arrayPath ); XMP_Node * arrayNode = FindNode ( &tree, arrayPath, kXMP_ExistingOnly ); // Just lookup, don't try to create. if ( arrayNode != 0 ) { // The array exists, make sure the form is compatible. Zero arrayForm means take what exists. if ( ! (arrayNode->options & kXMP_PropValueIsArray) ) { XMP_Throw ( "The named property is not an array", kXMPErr_BadXPath ); } #if 0 // *** Disable for now. Need to do some general rethinking of semantic checks. if ( (arrayOptions != 0) && (arrayOptions != (arrayNode->options & kXMP_PropArrayFormMask)) ) { XMP_Throw ( "Mismatch of existing and specified array form", kXMPErr_BadOptions ); } #endif } else { // The array does not exist, try to create it. if ( arrayOptions == 0 ) XMP_Throw ( "Explicit arrayOptions required to create new array", kXMPErr_BadOptions ); arrayNode = FindNode ( &tree, arrayPath, kXMP_CreateNodes, arrayOptions ); if ( arrayNode == 0 ) XMP_Throw ( "Failure creating array node", kXMPErr_BadXPath ); } DoSetArrayItem ( arrayNode, kXMP_ArrayLastItem, itemValue, (options | kXMP_InsertAfterItem) ); } // AppendArrayItem // ------------------------------------------------------------------------------------------------- // SetStructField // -------------- void XMPMeta::SetStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, XMP_OptionBits options ) { XMP_Assert ( (schemaNS != 0) && (structName != 0) && (fieldNS != 0) && (fieldName != 0) ); // Enforced by wrapper. XMP_VarString fieldPath; XMPUtils::ComposeStructFieldPath ( schemaNS, structName, fieldNS, fieldName, &fieldPath ); SetProperty ( schemaNS, fieldPath.c_str(), fieldValue, options ); } // SetStructField // ------------------------------------------------------------------------------------------------- // SetQualifier // ------------ void XMPMeta::SetQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, XMP_StringPtr qualValue, XMP_OptionBits options ) { XMP_Assert ( (schemaNS != 0) && (propName != 0) && (qualNS != 0) && (qualName != 0) ); // Enforced by wrapper. XMP_ExpandedXPath expPath; ExpandXPath ( schemaNS, propName, &expPath ); XMP_Node * propNode = FindNode ( &tree, expPath, kXMP_ExistingOnly ); if ( propNode == 0 ) XMP_Throw ( "Specified property does not exist", kXMPErr_BadXPath ); XMP_VarString qualPath; XMPUtils::ComposeQualifierPath ( schemaNS, propName, qualNS, qualName, &qualPath ); SetProperty ( schemaNS, qualPath.c_str(), qualValue, options ); } // SetQualifier // ------------------------------------------------------------------------------------------------- // DeleteProperty // -------------- void XMPMeta::DeleteProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName ) { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. XMP_ExpandedXPath expPath; ExpandXPath ( schemaNS, propName, &expPath ); XMP_NodePtrPos ptrPos; XMP_Node * propNode = FindNode ( &tree, expPath, kXMP_ExistingOnly, kXMP_NoOptions, &ptrPos ); if ( propNode == 0 ) return; XMP_Node * parentNode = propNode->parent; // Erase the pointer from the parent's vector, then delete the node and all below it. if ( ! (propNode->options & kXMP_PropIsQualifier) ) { parentNode->children.erase ( ptrPos ); DeleteEmptySchema ( parentNode ); } else { if ( propNode->name == "xml:lang" ) { XMP_Assert ( parentNode->options & kXMP_PropHasLang ); // *** &= ~flag would be safer parentNode->options ^= kXMP_PropHasLang; } else if ( propNode->name == "rdf:type" ) { XMP_Assert ( parentNode->options & kXMP_PropHasType ); parentNode->options ^= kXMP_PropHasType; } parentNode->qualifiers.erase ( ptrPos ); XMP_Assert ( parentNode->options & kXMP_PropHasQualifiers ); if ( parentNode->qualifiers.empty() ) parentNode->options ^= kXMP_PropHasQualifiers; } delete propNode; // ! The destructor takes care of the whole subtree. } // DeleteProperty // ------------------------------------------------------------------------------------------------- // DeleteArrayItem // --------------- void XMPMeta::DeleteArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex ) { XMP_Assert ( (schemaNS != 0) && (arrayName != 0) ); // Enforced by wrapper. XMP_VarString itemPath; XMPUtils::ComposeArrayItemPath ( schemaNS, arrayName, itemIndex, &itemPath ); DeleteProperty ( schemaNS, itemPath.c_str() ); } // DeleteArrayItem // ------------------------------------------------------------------------------------------------- // DeleteStructField // ----------------- void XMPMeta::DeleteStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName ) { XMP_Assert ( (schemaNS != 0) && (structName != 0) && (fieldNS != 0) && (fieldName != 0) ); // Enforced by wrapper. XMP_VarString fieldPath; XMPUtils::ComposeStructFieldPath ( schemaNS, structName, fieldNS, fieldName, &fieldPath ); DeleteProperty ( schemaNS, fieldPath.c_str() ); } // DeleteStructField // ------------------------------------------------------------------------------------------------- // DeleteQualifier // --------------- void XMPMeta::DeleteQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName ) { XMP_Assert ( (schemaNS != 0) && (propName != 0) && (qualNS != 0) && (qualName != 0) ); // Enforced by wrapper. XMP_VarString qualPath; XMPUtils::ComposeQualifierPath ( schemaNS, propName, qualNS, qualName, &qualPath ); DeleteProperty ( schemaNS, qualPath.c_str() ); } // DeleteQualifier // ------------------------------------------------------------------------------------------------- // DoesPropertyExist // ----------------- bool XMPMeta::DoesPropertyExist ( XMP_StringPtr schemaNS, XMP_StringPtr propName ) const { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. XMP_ExpandedXPath expPath; ExpandXPath ( schemaNS, propName, &expPath ); XMP_Node * propNode = FindConstNode ( &tree, expPath ); return (propNode != 0); } // DoesPropertyExist // ------------------------------------------------------------------------------------------------- // DoesArrayItemExist // ------------------ bool XMPMeta::DoesArrayItemExist ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex ) const { XMP_Assert ( (schemaNS != 0) && (arrayName != 0) ); // Enforced by wrapper. XMP_VarString itemPath; XMPUtils::ComposeArrayItemPath ( schemaNS, arrayName, itemIndex, &itemPath ); return DoesPropertyExist ( schemaNS, itemPath.c_str() ); } // DoesArrayItemExist // ------------------------------------------------------------------------------------------------- // DoesStructFieldExist // -------------------- bool XMPMeta::DoesStructFieldExist ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName ) const { XMP_Assert ( (schemaNS != 0) && (structName != 0) && (fieldNS != 0) && (fieldName != 0) ); // Enforced by wrapper. XMP_VarString fieldPath; XMPUtils::ComposeStructFieldPath ( schemaNS, structName, fieldNS, fieldName, &fieldPath ); return DoesPropertyExist ( schemaNS, fieldPath.c_str() ); } // DoesStructFieldExist // ------------------------------------------------------------------------------------------------- // DoesQualifierExist // ------------------ bool XMPMeta::DoesQualifierExist ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName ) const { XMP_Assert ( (schemaNS != 0) && (propName != 0) && (qualNS != 0) && (qualName != 0) ); // Enforced by wrapper. XMP_VarString qualPath; XMPUtils::ComposeQualifierPath ( schemaNS, propName, qualNS, qualName, &qualPath ); return DoesPropertyExist ( schemaNS, qualPath.c_str() ); } // DoesQualifierExist // ------------------------------------------------------------------------------------------------- // GetLocalizedText // ---------------- bool XMPMeta::GetLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr _genericLang, XMP_StringPtr _specificLang, XMP_StringPtr * actualLang, XMP_StringLen * langSize, XMP_StringPtr * itemValue, XMP_StringLen * valueSize, XMP_OptionBits * options ) const { XMP_Assert ( (schemaNS != 0) && (arrayName != 0) && (_genericLang != 0) && (_specificLang != 0) ); // Enforced by wrapper. XMP_Assert ( (actualLang != 0) && (langSize != 0) ); // Enforced by wrapper. XMP_Assert ( (itemValue != 0) && (valueSize != 0) && (options != 0) ); // Enforced by wrapper. XMP_VarString zGenericLang ( _genericLang ); XMP_VarString zSpecificLang ( _specificLang ); NormalizeLangValue ( &zGenericLang ); NormalizeLangValue ( &zSpecificLang ); XMP_StringPtr genericLang = zGenericLang.c_str(); XMP_StringPtr specificLang = zSpecificLang.c_str(); XMP_ExpandedXPath arrayPath; ExpandXPath ( schemaNS, arrayName, &arrayPath ); const XMP_Node * arrayNode = FindConstNode ( &tree, arrayPath ); // *** This expand/find idiom is used in 3 Getters. if ( arrayNode == 0 ) return false; // *** Should extract it into a local utility. XMP_CLTMatch match; const XMP_Node * itemNode; match = ChooseLocalizedText ( arrayNode, genericLang, specificLang, &itemNode ); if ( match == kXMP_CLT_NoValues ) return false; *actualLang = itemNode->qualifiers[0]->value.c_str(); *langSize = itemNode->qualifiers[0]->value.size(); *itemValue = itemNode->value.c_str(); *valueSize = itemNode->value.size(); *options = itemNode->options; return true; } // GetLocalizedText // ------------------------------------------------------------------------------------------------- // SetLocalizedText // ---------------- void XMPMeta::SetLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr _genericLang, XMP_StringPtr _specificLang, XMP_StringPtr itemValue, XMP_OptionBits options ) { options = options; // Avoid unused parameter warning. XMP_Assert ( (schemaNS != 0) && (arrayName != 0) && (_genericLang != 0) && (_specificLang != 0) ); // Enforced by wrapper. XMP_VarString zGenericLang ( _genericLang ); XMP_VarString zSpecificLang ( _specificLang ); NormalizeLangValue ( &zGenericLang ); NormalizeLangValue ( &zSpecificLang ); XMP_StringPtr genericLang = zGenericLang.c_str(); XMP_StringPtr specificLang = zSpecificLang.c_str(); XMP_ExpandedXPath arrayPath; ExpandXPath ( schemaNS, arrayName, &arrayPath ); // Find the array node and set the options if it was just created. XMP_Node * arrayNode = FindNode ( &tree, arrayPath, kXMP_CreateNodes, (kXMP_PropValueIsArray | kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate) ); if ( arrayNode == 0 ) XMP_Throw ( "Failed to find or create array node", kXMPErr_BadXPath ); if ( ! XMP_ArrayIsAltText(arrayNode->options) ) { if ( arrayNode->children.empty() && XMP_ArrayIsAlternate(arrayNode->options) ) { arrayNode->options |= kXMP_PropArrayIsAltText; } else { XMP_Throw ( "Localized text array is not alt-text", kXMPErr_BadXPath ); } } // Make sure the x-default item, if any, is first. size_t itemNum, itemLim; XMP_Node * xdItem = 0; bool haveXDefault = false; for ( itemNum = 0, itemLim = arrayNode->children.size(); itemNum < itemLim; ++itemNum ) { XMP_Node * currItem = arrayNode->children[itemNum]; XMP_Assert ( XMP_PropHasLang(currItem->options) ); if ( currItem->qualifiers.empty() || (currItem->qualifiers[0]->name != "xml:lang") ) { XMP_Throw ( "Language qualifier must be first", kXMPErr_BadXPath ); } if ( currItem->qualifiers[0]->value == "x-default" ) { xdItem = currItem; haveXDefault = true; break; } } if ( haveXDefault && (itemNum != 0) ) { XMP_Assert ( arrayNode->children[itemNum]->qualifiers[0]->value == "x-default" ); XMP_Node * temp = arrayNode->children[0]; arrayNode->children[0] = arrayNode->children[itemNum]; arrayNode->children[itemNum] = temp; } // Find the appropriate item. ChooseLocalizedText will make sure the array is a language alternative. const XMP_Node * cItemNode; // ! ChooseLocalizedText returns a pointer to a const node. XMP_CLTMatch match = ChooseLocalizedText ( arrayNode, genericLang, specificLang, &cItemNode ); XMP_Node * itemNode = const_cast ( cItemNode ); const bool specificXDefault = XMP_LitMatch ( specificLang, "x-default" ); switch ( match ) { case kXMP_CLT_NoValues : // Create the array items for the specificLang and x-default, with x-default first. AppendLangItem ( arrayNode, "x-default", itemValue ); haveXDefault = true; if ( ! specificXDefault ) AppendLangItem ( arrayNode, specificLang, itemValue ); break; case kXMP_CLT_SpecificMatch : if ( ! specificXDefault ) { // Update the specific item, update x-default if it matches the old value. if ( haveXDefault && (xdItem != itemNode) && (xdItem->value == itemNode->value) ) { SetNodeValue ( xdItem, itemValue ); } SetNodeValue ( itemNode, itemValue ); // ! Do this after the x-default check! } else { // Update all items whose values match the old x-default value. XMP_Assert ( haveXDefault && (xdItem == itemNode) ); for ( itemNum = 0, itemLim = arrayNode->children.size(); itemNum < itemLim; ++itemNum ) { XMP_Node * currItem = arrayNode->children[itemNum]; if ( (currItem == xdItem) || (currItem->value != xdItem->value) ) continue; SetNodeValue ( currItem, itemValue ); } SetNodeValue ( xdItem, itemValue ); // And finally do the x-default item. } break; case kXMP_CLT_SingleGeneric : // Update the generic item, update x-default if it matches the old value. if ( haveXDefault && (xdItem != itemNode) && (xdItem->value == itemNode->value) ) { SetNodeValue ( xdItem, itemValue ); } SetNodeValue ( itemNode, itemValue ); // ! Do this after the x-default check! break; case kXMP_CLT_MultipleGeneric : // Create the specific language, ignore x-default. AppendLangItem ( arrayNode, specificLang, itemValue ); if ( specificXDefault ) haveXDefault = true; break; case kXMP_CLT_XDefault : // Create the specific language, update x-default if it was the only item. if ( arrayNode->children.size() == 1 ) SetNodeValue ( xdItem, itemValue ); AppendLangItem ( arrayNode, specificLang, itemValue ); break; case kXMP_CLT_FirstItem : // Create the specific language, don't add an x-default item. AppendLangItem ( arrayNode, specificLang, itemValue ); if ( specificXDefault ) haveXDefault = true; break; default : XMP_Throw ( "Unexpected result from ChooseLocalizedText", kXMPErr_InternalFailure ); } // Add an x-default at the front if needed. if ( (! haveXDefault) && (arrayNode->children.size() == 1) ) { AppendLangItem ( arrayNode, "x-default", itemValue ); } } // SetLocalizedText // ------------------------------------------------------------------------------------------------- // DeleteLocalizedText // ------------------- void XMPMeta::DeleteLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr _genericLang, XMP_StringPtr _specificLang ) { XMP_Assert ( (schemaNS != 0) && (arrayName != 0) && (_genericLang != 0) && (_specificLang != 0) ); // Enforced by wrapper. XMP_VarString zGenericLang ( _genericLang ); XMP_VarString zSpecificLang ( _specificLang ); NormalizeLangValue ( &zGenericLang ); NormalizeLangValue ( &zSpecificLang ); XMP_StringPtr genericLang = zGenericLang.c_str(); XMP_StringPtr specificLang = zSpecificLang.c_str(); XMP_ExpandedXPath arrayPath; ExpandXPath ( schemaNS, arrayName, &arrayPath ); // Find the LangAlt array and the selected array item. XMP_Node * arrayNode = FindNode ( &tree, arrayPath, kXMP_ExistingOnly ); if ( arrayNode == 0 ) return; size_t arraySize = arrayNode->children.size(); XMP_CLTMatch match; XMP_Node * itemNode; match = ChooseLocalizedText ( arrayNode, genericLang, specificLang, (const XMP_Node **) &itemNode ); if ( match != kXMP_CLT_SpecificMatch ) return; size_t itemIndex = 0; for ( ; itemIndex < arraySize; ++itemIndex ) { if ( arrayNode->children[itemIndex] == itemNode ) break; } XMP_Enforce ( itemIndex < arraySize ); // Decide if the selected item is x-default or not, find relevant matching item. bool itemIsXDefault = false; if ( ! itemNode->qualifiers.empty() ) { XMP_Node * qualNode = itemNode->qualifiers[0]; if ( (qualNode->name == "xml:lang") && (qualNode->value == "x-default") ) itemIsXDefault = true; } if ( itemIsXDefault && (itemIndex != 0) ) { // Enforce the x-default is first policy. XMP_Node * temp = arrayNode->children[0]; arrayNode->children[0] = arrayNode->children[itemIndex]; arrayNode->children[itemIndex] = temp; itemIndex = 0; } XMP_Node * assocNode = 0; size_t assocIndex; size_t assocIsXDefault = false; if ( itemIsXDefault ) { for ( assocIndex = 1; assocIndex < arraySize; ++assocIndex ) { if ( arrayNode->children[assocIndex]->value == itemNode->value ) { assocNode = arrayNode->children[assocIndex]; break; } } } else if ( itemIndex > 0 ) { XMP_Node * itemZero = arrayNode->children[0]; if ( itemZero->value == itemNode->value ) { XMP_Node * qualNode = itemZero->qualifiers[0]; if ( (qualNode->name == "xml:lang") && (qualNode->value == "x-default") ) { assocNode = arrayNode->children[0]; assocIndex = 0; assocIsXDefault = true; } } } // Delete the appropriate nodes. XMP_NodePtrPos arrayBegin = arrayNode->children.begin(); if ( assocNode == 0 ) { arrayNode->children.erase ( arrayBegin + itemIndex ); } else if ( itemIndex < assocIndex ) { arrayNode->children.erase ( arrayBegin + assocIndex ); arrayNode->children.erase ( arrayBegin + itemIndex ); } else { arrayNode->children.erase ( arrayBegin + itemIndex ); arrayNode->children.erase ( arrayBegin + assocIndex ); } delete itemNode; if ( assocNode != 0 ) delete assocNode; } // DeleteLocalizedText // ------------------------------------------------------------------------------------------------- // GetProperty_Bool // ---------------- bool XMPMeta::GetProperty_Bool ( XMP_StringPtr schemaNS, XMP_StringPtr propName, bool * propValue, XMP_OptionBits * options ) const { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. XMP_Assert ( (propValue != 0) && (options != 0) ); // Enforced by wrapper. XMP_StringPtr valueStr; XMP_StringLen valueLen; bool found = GetProperty ( schemaNS, propName, &valueStr, &valueLen, options ); if ( found ) { if ( ! XMP_PropIsSimple ( *options ) ) XMP_Throw ( "Property must be simple", kXMPErr_BadXPath ); *propValue = XMPUtils::ConvertToBool ( valueStr ); } return found; } // GetProperty_Bool // ------------------------------------------------------------------------------------------------- // GetProperty_Int // --------------- bool XMPMeta::GetProperty_Int ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int32 * propValue, XMP_OptionBits * options ) const { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. XMP_Assert ( (propValue != 0) && (options != 0) ); // Enforced by wrapper. XMP_StringPtr valueStr; XMP_StringLen valueLen; bool found = GetProperty ( schemaNS, propName, &valueStr, &valueLen, options ); if ( found ) { if ( ! XMP_PropIsSimple ( *options ) ) XMP_Throw ( "Property must be simple", kXMPErr_BadXPath ); *propValue = XMPUtils::ConvertToInt ( valueStr ); } return found; } // GetProperty_Int // ------------------------------------------------------------------------------------------------- // GetProperty_Int64 // ----------------- bool XMPMeta::GetProperty_Int64 ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int64 * propValue, XMP_OptionBits * options ) const { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. XMP_Assert ( (propValue != 0) && (options != 0) ); // Enforced by wrapper. XMP_StringPtr valueStr; XMP_StringLen valueLen; bool found = GetProperty ( schemaNS, propName, &valueStr, &valueLen, options ); if ( found ) { if ( ! XMP_PropIsSimple ( *options ) ) XMP_Throw ( "Property must be simple", kXMPErr_BadXPath ); *propValue = XMPUtils::ConvertToInt64 ( valueStr ); } return found; } // GetProperty_Int64 // ------------------------------------------------------------------------------------------------- // GetProperty_Float // ----------------- bool XMPMeta::GetProperty_Float ( XMP_StringPtr schemaNS, XMP_StringPtr propName, double * propValue, XMP_OptionBits * options ) const { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. XMP_Assert ( (propValue != 0) && (options != 0) ); // Enforced by wrapper. XMP_StringPtr valueStr; XMP_StringLen valueLen; bool found = GetProperty ( schemaNS, propName, &valueStr, &valueLen, options ); if ( found ) { if ( ! XMP_PropIsSimple ( *options ) ) XMP_Throw ( "Property must be simple", kXMPErr_BadXPath ); *propValue = XMPUtils::ConvertToFloat ( valueStr ); } return found; } // GetProperty_Float // ------------------------------------------------------------------------------------------------- // GetProperty_Date // ---------------- bool XMPMeta::GetProperty_Date ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_DateTime * propValue, XMP_OptionBits * options ) const { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. XMP_Assert ( (propValue != 0) && (options != 0) ); // Enforced by wrapper. XMP_StringPtr valueStr; XMP_StringLen valueLen; bool found = GetProperty ( schemaNS, propName, &valueStr, &valueLen, options ); if ( found ) { if ( ! XMP_PropIsSimple ( *options ) ) XMP_Throw ( "Property must be simple", kXMPErr_BadXPath ); XMPUtils::ConvertToDate ( valueStr, propValue ); } return found; } // GetProperty_Date // ------------------------------------------------------------------------------------------------- // SetProperty_Bool // ---------------- void XMPMeta::SetProperty_Bool ( XMP_StringPtr schemaNS, XMP_StringPtr propName, bool propValue, XMP_OptionBits options ) { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. XMP_VarString valueStr; XMPUtils::ConvertFromBool ( propValue, &valueStr ); SetProperty ( schemaNS, propName, valueStr.c_str(), options ); } // SetProperty_Bool // ------------------------------------------------------------------------------------------------- // SetProperty_Int // --------------- void XMPMeta::SetProperty_Int ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int32 propValue, XMP_OptionBits options ) { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. XMP_VarString valueStr; XMPUtils::ConvertFromInt ( propValue, "", &valueStr ); SetProperty ( schemaNS, propName, valueStr.c_str(), options ); } // SetProperty_Int // ------------------------------------------------------------------------------------------------- // SetProperty_Int64 // ----------------- void XMPMeta::SetProperty_Int64 ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int64 propValue, XMP_OptionBits options ) { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. XMP_VarString valueStr; XMPUtils::ConvertFromInt64 ( propValue, "", &valueStr ); SetProperty ( schemaNS, propName, valueStr.c_str(), options ); } // SetProperty_Int64 // ------------------------------------------------------------------------------------------------- // SetProperty_Float // ----------------- void XMPMeta::SetProperty_Float ( XMP_StringPtr schemaNS, XMP_StringPtr propName, double propValue, XMP_OptionBits options ) { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. XMP_VarString valueStr; XMPUtils::ConvertFromFloat ( propValue, "", &valueStr ); SetProperty ( schemaNS, propName, valueStr.c_str(), options ); } // SetProperty_Float // ------------------------------------------------------------------------------------------------- // SetProperty_Date // ---------------- void XMPMeta::SetProperty_Date ( XMP_StringPtr schemaNS, XMP_StringPtr propName, const XMP_DateTime & propValue, XMP_OptionBits options ) { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // Enforced by wrapper. XMP_VarString valueStr; XMPUtils::ConvertFromDate ( propValue, &valueStr ); SetProperty ( schemaNS, propName, valueStr.c_str(), options ); } // SetProperty_Date // ================================================================================================= exempi-2.2.1/source/XMPCore/XMPUtils.cpp0000664000175000017500000017540112150230672014702 00000000000000// ================================================================================================= // Copyright 2003 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include! #include "XMPCore_Impl.hpp" #include "XMPUtils.hpp" #include "MD5.h" #include #include #include #include #include #include #include // For snprintf. #if XMP_WinBuild #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif // ================================================================================================= // Local Types and Constants // ========================= static const char * sBase64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // ================================================================================================= // Local Utilities // =============== // ------------------------------------------------------------------------------------------------- // ANSI Time Functions // ------------------- // // A bit of hackery to use the best available time functions. Mac and UNIX have thread safe versions // of gmtime and localtime. #if XMP_MacBuild | XMP_UNIXBuild typedef time_t ansi_tt; typedef struct tm ansi_tm; #define ansi_time time #define ansi_mktime mktime #define ansi_difftime difftime #define ansi_gmtime gmtime_r #define ansi_localtime localtime_r #elif XMP_WinBuild // ! VS.Net 2003 (VC7) does not provide thread safe versions of gmtime and localtime. // ! VS.Net 2005 (VC8) inverts the parameters for the safe versions of gmtime and localtime. typedef time_t ansi_tt; typedef struct tm ansi_tm; #define ansi_time time #define ansi_mktime mktime #define ansi_difftime difftime #if defined(_MSC_VER) && (_MSC_VER >= 1400) #define ansi_gmtime(tt,tm) gmtime_s ( tm, tt ) #define ansi_localtime(tt,tm) localtime_s ( tm, tt ) #else static inline void ansi_gmtime ( const ansi_tt * ttTime, ansi_tm * tmTime ) { ansi_tm * tmx = gmtime ( ttTime ); // ! Hope that there is no race! if ( tmx == 0 ) XMP_Throw ( "Failure from ANSI C gmtime function", kXMPErr_ExternalFailure ); *tmTime = *tmx; } static inline void ansi_localtime ( const ansi_tt * ttTime, ansi_tm * tmTime ) { ansi_tm * tmx = localtime ( ttTime ); // ! Hope that there is no race! if ( tmx == 0 ) XMP_Throw ( "Failure from ANSI C localtime function", kXMPErr_ExternalFailure ); *tmTime = *tmx; } #endif #endif // ------------------------------------------------------------------------------------------------- // VerifyDateTimeFlags // ------------------- static void VerifyDateTimeFlags ( XMP_DateTime * dt ) { if ( (dt->year != 0) || (dt->month != 0) || (dt->day != 0) ) dt->hasDate = true; if ( (dt->hour != 0) || (dt->minute != 0) || (dt->second != 0) || (dt->nanoSecond != 0) ) dt->hasTime = true; if ( (dt->tzSign != 0) || (dt->tzHour != 0) || (dt->tzMinute != 0) ) dt->hasTimeZone = true; if ( dt->hasTimeZone ) dt->hasTime = true; // ! Don't combine with above line, UTC has zero values. } // VerifyDateTimeFlags // ------------------------------------------------------------------------------------------------- // IsLeapYear // ---------- static bool IsLeapYear ( long year ) { if ( year < 0 ) year = -year + 1; // Fold the negative years, assuming there is a year 0. if ( (year % 4) != 0 ) return false; // Not a multiple of 4. if ( (year % 100) != 0 ) return true; // A multiple of 4 but not a multiple of 100. if ( (year % 400) == 0 ) return true; // A multiple of 400. return false; // A multiple of 100 but not a multiple of 400. } // IsLeapYear // ------------------------------------------------------------------------------------------------- // DaysInMonth // ----------- static int DaysInMonth ( XMP_Int32 year, XMP_Int32 month ) { static short daysInMonth[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec int days = daysInMonth [ month ]; if ( (month == 2) && IsLeapYear ( year ) ) days += 1; return days; } // DaysInMonth // ------------------------------------------------------------------------------------------------- // AdjustTimeOverflow // ------------------ static void AdjustTimeOverflow ( XMP_DateTime * time ) { enum { kBillion = 1000*1000*1000L }; // ---------------------------------------------------------------------------------------------- // To be safe against pathalogical overflow we first adjust from month to second, then from // nanosecond back up to month. This leaves each value closer to zero before propagating into it. // For example if the hour and minute are both near max, adjusting minutes first can cause the // hour to overflow. // ! Photoshop 8 creates "time only" values with zeros for year, month, and day. if ( (time->year != 0) || (time->month != 0) || (time->day != 0) ) { while ( time->month < 1 ) { time->year -= 1; time->month += 12; } while ( time->month > 12 ) { time->year += 1; time->month -= 12; } while ( time->day < 1 ) { time->month -= 1; if ( time->month < 1 ) { // ! Keep the months in range for indexing daysInMonth! time->year -= 1; time->month += 12; } time->day += DaysInMonth ( time->year, time->month ); // ! Decrement month before so index here is right! } while ( time->day > DaysInMonth ( time->year, time->month ) ) { time->day -= DaysInMonth ( time->year, time->month ); // ! Increment month after so index here is right! time->month += 1; if ( time->month > 12 ) { time->year += 1; time->month -= 12; } } } while ( time->hour < 0 ) { time->day -= 1; time->hour += 24; } while ( time->hour >= 24 ) { time->day += 1; time->hour -= 24; } while ( time->minute < 0 ) { time->hour -= 1; time->minute += 60; } while ( time->minute >= 60 ) { time->hour += 1; time->minute -= 60; } while ( time->second < 0 ) { time->minute -= 1; time->second += 60; } while ( time->second >= 60 ) { time->minute += 1; time->second -= 60; } while ( time->nanoSecond < 0 ) { time->second -= 1; time->nanoSecond += kBillion; } while ( time->nanoSecond >= kBillion ) { time->second += 1; time->nanoSecond -= kBillion; } while ( time->second < 0 ) { time->minute -= 1; time->second += 60; } while ( time->second >= 60 ) { time->minute += 1; time->second -= 60; } while ( time->minute < 0 ) { time->hour -= 1; time->minute += 60; } while ( time->minute >= 60 ) { time->hour += 1; time->minute -= 60; } while ( time->hour < 0 ) { time->day -= 1; time->hour += 24; } while ( time->hour >= 24 ) { time->day += 1; time->hour -= 24; } if ( (time->year != 0) || (time->month != 0) || (time->day != 0) ) { while ( time->month < 1 ) { // Make sure the months are OK first, for DaysInMonth. time->year -= 1; time->month += 12; } while ( time->month > 12 ) { time->year += 1; time->month -= 12; } while ( time->day < 1 ) { time->month -= 1; if ( time->month < 1 ) { time->year -= 1; time->month += 12; } time->day += DaysInMonth ( time->year, time->month ); } while ( time->day > DaysInMonth ( time->year, time->month ) ) { time->day -= DaysInMonth ( time->year, time->month ); time->month += 1; if ( time->month > 12 ) { time->year += 1; time->month -= 12; } } } } // AdjustTimeOverflow // ------------------------------------------------------------------------------------------------- // GatherInt // --------- static XMP_Int32 GatherInt ( XMP_StringPtr strValue, size_t * _pos, const char * errMsg ) { size_t pos = *_pos; XMP_Int32 value = 0; for ( char ch = strValue[pos]; ('0' <= ch) && (ch <= '9'); ++pos, ch = strValue[pos] ) { value = (value * 10) + (ch - '0'); if ( value < 0 ) XMP_Throw ( errMsg, kXMPErr_BadValue ); } if ( pos == *_pos ) XMP_Throw ( errMsg, kXMPErr_BadParam ); *_pos = pos; return value; } // GatherInt // ------------------------------------------------------------------------------------------------- static void FormatFullDateTime ( XMP_DateTime & tempDate, char * buffer, size_t bufferLen ) { AdjustTimeOverflow ( &tempDate ); // Make sure all time parts are in range. if ( (tempDate.second == 0) && (tempDate.nanoSecond == 0) ) { // Output YYYY-MM-DDThh:mmTZD. snprintf ( buffer, bufferLen, "%.4d-%02d-%02dT%02d:%02d", // AUDIT: Callers pass sizeof(buffer). tempDate.year, tempDate.month, tempDate.day, tempDate.hour, tempDate.minute ); } else if ( tempDate.nanoSecond == 0 ) { // Output YYYY-MM-DDThh:mm:ssTZD. snprintf ( buffer, bufferLen, "%.4d-%02d-%02dT%02d:%02d:%02d", // AUDIT: Callers pass sizeof(buffer). tempDate.year, tempDate.month, tempDate.day, tempDate.hour, tempDate.minute, tempDate.second ); } else { // Output YYYY-MM-DDThh:mm:ss.sTZD. snprintf ( buffer, bufferLen, "%.4d-%02d-%02dT%02d:%02d:%02d.%09d", // AUDIT: Callers pass sizeof(buffer). tempDate.year, tempDate.month, tempDate.day, tempDate.hour, tempDate.minute, tempDate.second, tempDate.nanoSecond ); for ( size_t i = strlen(buffer)-1; buffer[i] == '0'; --i ) buffer[i] = 0; // Trim excess digits. } } // FormatFullDateTime // ------------------------------------------------------------------------------------------------- // DecodeBase64Char // ---------------- // The decode mapping: // // encoded encoded raw // char value value // ------- ------- ----- // A .. Z 0x41 .. 0x5A 0 .. 25 // a .. z 0x61 .. 0x7A 26 .. 51 // 0 .. 9 0x30 .. 0x39 52 .. 61 // + 0x2B 62 // / 0x2F 63 static unsigned char DecodeBase64Char ( XMP_Uns8 ch ) { if ( ('A' <= ch) && (ch <= 'Z') ) { ch = ch - 'A'; } else if ( ('a' <= ch) && (ch <= 'z') ) { ch = ch - 'a' + 26; } else if ( ('0' <= ch) && (ch <= '9') ) { ch = ch - '0' + 52; } else if ( ch == '+' ) { ch = 62; } else if ( ch == '/' ) { ch = 63; } else if ( (ch == ' ') || (ch == kTab) || (ch == kLF) || (ch == kCR) ) { ch = 0xFF; // Will be ignored by the caller. } else { XMP_Throw ( "Invalid base-64 encoded character", kXMPErr_BadParam ); } return ch; } // DecodeBase64Char (); // ------------------------------------------------------------------------------------------------- // EstimateSizeForJPEG // ------------------- // // Estimate the serialized size for the subtree of an XMP_Node. Support for PackageForJPEG. static size_t EstimateSizeForJPEG ( const XMP_Node * xmpNode ) { size_t estSize = 0; size_t nameSize = xmpNode->name.size(); bool includeName = (! XMP_PropIsArray ( xmpNode->parent->options )); if ( XMP_PropIsSimple ( xmpNode->options ) ) { if ( includeName ) estSize += (nameSize + 3); // Assume attribute form. estSize += xmpNode->value.size(); } else if ( XMP_PropIsArray ( xmpNode->options ) ) { // The form of the value portion is: ...... if ( includeName ) estSize += (2*nameSize + 5); size_t arraySize = xmpNode->children.size(); estSize += 9 + 10; // The rdf:Xyz tags. estSize += arraySize * (8 + 9); // The rdf:li tags. for ( size_t i = 0; i < arraySize; ++i ) { estSize += EstimateSizeForJPEG ( xmpNode->children[i] ); } } else { // The form is: ...fields... if ( includeName ) estSize += (2*nameSize + 5); estSize += 25; // The rdf:parseType="Resource" attribute. size_t fieldCount = xmpNode->children.size(); for ( size_t i = 0; i < fieldCount; ++i ) { estSize += EstimateSizeForJPEG ( xmpNode->children[i] ); } } return estSize; } // EstimateSizeForJPEG // ------------------------------------------------------------------------------------------------- // MoveOneProperty // --------------- static bool MoveOneProperty ( XMPMeta & stdXMP, XMPMeta * extXMP, XMP_StringPtr schemaURI, XMP_StringPtr propName ) { XMP_Node * propNode = 0; XMP_NodePtrPos stdPropPos; XMP_Node * stdSchema = FindSchemaNode ( &stdXMP.tree, schemaURI, kXMP_ExistingOnly, 0 ); if ( stdSchema != 0 ) { propNode = FindChildNode ( stdSchema, propName, kXMP_ExistingOnly, &stdPropPos ); } if ( propNode == 0 ) return false; XMP_Node * extSchema = FindSchemaNode ( &extXMP->tree, schemaURI, kXMP_CreateNodes ); propNode->parent = extSchema; extSchema->options &= ~kXMP_NewImplicitNode; extSchema->children.push_back ( propNode ); stdSchema->children.erase ( stdPropPos ); DeleteEmptySchema ( stdSchema ); return true; } // MoveOneProperty // ------------------------------------------------------------------------------------------------- // CreateEstimatedSizeMap // ---------------------- #ifndef Trace_PackageForJPEG #define Trace_PackageForJPEG 0 #endif typedef std::pair < XMP_VarString*, XMP_VarString* > StringPtrPair; typedef std::multimap < size_t, StringPtrPair > PropSizeMap; static void CreateEstimatedSizeMap ( XMPMeta & stdXMP, PropSizeMap * propSizes ) { #if Trace_PackageForJPEG printf ( " Creating top level property map:\n" ); #endif for ( size_t s = stdXMP.tree.children.size(); s > 0; --s ) { XMP_Node * stdSchema = stdXMP.tree.children[s-1]; for ( size_t p = stdSchema->children.size(); p > 0; --p ) { XMP_Node * stdProp = stdSchema->children[p-1]; if ( (stdSchema->name == kXMP_NS_XMP_Note) && (stdProp->name == "xmpNote:HasExtendedXMP") ) continue; // ! Don't move xmpNote:HasExtendedXMP. size_t propSize = EstimateSizeForJPEG ( stdProp ); StringPtrPair namePair ( &stdSchema->name, &stdProp->name ); PropSizeMap::value_type mapValue ( propSize, namePair ); (void) propSizes->insert ( propSizes->upper_bound ( propSize ), mapValue ); #if Trace_PackageForJPEG printf ( " %d bytes, %s in %s\n", propSize, stdProp->name.c_str(), stdSchema->name.c_str() ); #endif } } } // CreateEstimatedSizeMap // ------------------------------------------------------------------------------------------------- // MoveLargestProperty // ------------------- static size_t MoveLargestProperty ( XMPMeta & stdXMP, XMPMeta * extXMP, PropSizeMap & propSizes ) { XMP_Assert ( ! propSizes.empty() ); #if 0 // *** Xocde 2.3 on Mac OS X 10.4.7 seems to have a bug where this does not pick the last // *** item in the map. We'll just avoid it on all platforms until thoroughly tested. PropSizeMap::iterator lastPos = propSizes.end(); --lastPos; // Move to the actual last item. #else PropSizeMap::iterator lastPos = propSizes.begin(); PropSizeMap::iterator nextPos = lastPos; for ( ++nextPos; nextPos != propSizes.end(); ++nextPos ) lastPos = nextPos; #endif size_t propSize = lastPos->first; const char * schemaURI = lastPos->second.first->c_str(); const char * propName = lastPos->second.second->c_str(); #if Trace_PackageForJPEG printf ( " Move %s, %d bytes\n", propName, propSize ); #endif bool moved = MoveOneProperty ( stdXMP, extXMP, schemaURI, propName ); XMP_Assert ( moved ); propSizes.erase ( lastPos ); return propSize; } // MoveLargestProperty // ================================================================================================= // Class Static Functions // ====================== // ------------------------------------------------------------------------------------------------- // Initialize // ---------- /* class static */ bool XMPUtils::Initialize() { // Nothing at present. return true; } // Initialize // ------------------------------------------------------------------------------------------------- // Terminate // --------- /* class static */ void XMPUtils::Terminate() RELEASE_NO_THROW { // Nothing at present. return; } // Terminate // ------------------------------------------------------------------------------------------------- // ComposeArrayItemPath // -------------------- // // Return "arrayName[index]". /* class static */ void XMPUtils::ComposeArrayItemPath ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, XMP_VarString * _fullPath ) { XMP_Assert ( schemaNS != 0 ); // Enforced by wrapper. XMP_Assert ( (arrayName != 0) && (*arrayName != 0) ); // Enforced by wrapper. XMP_Assert ( _fullPath != 0 ); // Enforced by wrapper. XMP_ExpandedXPath expPath; // Just for side effects to check namespace and basic path. ExpandXPath ( schemaNS, arrayName, &expPath ); if ( (itemIndex < 0) && (itemIndex != kXMP_ArrayLastItem) ) XMP_Throw ( "Array index out of bounds", kXMPErr_BadParam ); XMP_StringLen reserveLen = strlen(arrayName) + 2 + 32; // Room plus padding. XMP_VarString fullPath; // ! Allow for arrayName to be the incoming _fullPath.c_str(). fullPath.reserve ( reserveLen ); fullPath = arrayName; if ( itemIndex == kXMP_ArrayLastItem ) { fullPath += "[last()]"; } else { // AUDIT: Using sizeof(buffer) for the snprintf length is safe. char buffer [32]; // A 32 byte buffer is plenty, even for a 64-bit integer. snprintf ( buffer, sizeof(buffer), "[%d]", itemIndex ); fullPath += buffer; } *_fullPath = fullPath; } // ComposeArrayItemPath // ------------------------------------------------------------------------------------------------- // ComposeStructFieldPath // ---------------------- // // Return "structName/ns:fieldName". /* class static */ void XMPUtils::ComposeStructFieldPath ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_VarString * _fullPath ) { XMP_Assert ( (schemaNS != 0) && (fieldNS != 0) ); // Enforced by wrapper. XMP_Assert ( (structName != 0) && (*structName != 0) ); // Enforced by wrapper. XMP_Assert ( (fieldName != 0) && (*fieldName != 0) ); // Enforced by wrapper. XMP_Assert ( _fullPath != 0 ); // Enforced by wrapper. XMP_ExpandedXPath expPath; // Just for side effects to check namespace and basic path. ExpandXPath ( schemaNS, structName, &expPath ); XMP_ExpandedXPath fieldPath; ExpandXPath ( fieldNS, fieldName, &fieldPath ); if ( fieldPath.size() != 2 ) XMP_Throw ( "The fieldName must be simple", kXMPErr_BadXPath ); XMP_StringLen reserveLen = strlen(structName) + fieldPath[kRootPropStep].step.size() + 1; XMP_VarString fullPath; // ! Allow for arrayName to be the incoming _fullPath.c_str(). fullPath.reserve ( reserveLen ); fullPath = structName; fullPath += '/'; fullPath += fieldPath[kRootPropStep].step; *_fullPath = fullPath; } // ComposeStructFieldPath // ------------------------------------------------------------------------------------------------- // ComposeQualifierPath // -------------------- // // Return "propName/?ns:qualName". /* class static */ void XMPUtils::ComposeQualifierPath ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, XMP_VarString * _fullPath ) { XMP_Assert ( (schemaNS != 0) && (qualNS != 0) ); // Enforced by wrapper. XMP_Assert ( (propName != 0) && (*propName != 0) ); // Enforced by wrapper. XMP_Assert ( (qualName != 0) && (*qualName != 0) ); // Enforced by wrapper. XMP_Assert ( _fullPath != 0 ); // Enforced by wrapper. XMP_ExpandedXPath expPath; // Just for side effects to check namespace and basic path. ExpandXPath ( schemaNS, propName, &expPath ); XMP_ExpandedXPath qualPath; ExpandXPath ( qualNS, qualName, &qualPath ); if ( qualPath.size() != 2 ) XMP_Throw ( "The qualifier name must be simple", kXMPErr_BadXPath ); XMP_StringLen reserveLen = strlen(propName) + qualPath[kRootPropStep].step.size() + 2; XMP_VarString fullPath; // ! Allow for arrayName to be the incoming _fullPath.c_str(). fullPath.reserve ( reserveLen ); fullPath = propName; fullPath += "/?"; fullPath += qualPath[kRootPropStep].step; *_fullPath = fullPath; } // ComposeQualifierPath // ------------------------------------------------------------------------------------------------- // ComposeLangSelector // ------------------- // // Return "arrayName[?xml:lang="lang"]". // *** #error "handle quotes in the lang - or verify format" /* class static */ void XMPUtils::ComposeLangSelector ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr _langName, XMP_VarString * _fullPath ) { XMP_Assert ( schemaNS != 0 ); // Enforced by wrapper. XMP_Assert ( (arrayName != 0) && (*arrayName != 0) ); // Enforced by wrapper. XMP_Assert ( (_langName != 0) && (*_langName != 0) ); // Enforced by wrapper. XMP_Assert ( _fullPath != 0 ); // Enforced by wrapper. XMP_ExpandedXPath expPath; // Just for side effects to check namespace and basic path. ExpandXPath ( schemaNS, arrayName, &expPath ); XMP_VarString langName ( _langName ); NormalizeLangValue ( &langName ); XMP_StringLen reserveLen = strlen(arrayName) + langName.size() + 14; XMP_VarString fullPath; // ! Allow for arrayName to be the incoming _fullPath.c_str(). fullPath.reserve ( reserveLen ); fullPath = arrayName; fullPath += "[?xml:lang=\""; fullPath += langName; fullPath += "\"]"; *_fullPath = fullPath; } // ComposeLangSelector // ------------------------------------------------------------------------------------------------- // ComposeFieldSelector // -------------------- // // Return "arrayName[ns:fieldName="fieldValue"]". // *** #error "handle quotes in the value" /* class static */ void XMPUtils::ComposeFieldSelector ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, XMP_VarString * _fullPath ) { XMP_Assert ( (schemaNS != 0) && (fieldNS != 0) && (fieldValue != 0) ); // Enforced by wrapper. XMP_Assert ( (*arrayName != 0) && (*fieldName != 0) ); // Enforced by wrapper. XMP_Assert ( _fullPath != 0 ); // Enforced by wrapper. XMP_ExpandedXPath expPath; // Just for side effects to check namespace and basic path. ExpandXPath ( schemaNS, arrayName, &expPath ); XMP_ExpandedXPath fieldPath; ExpandXPath ( fieldNS, fieldName, &fieldPath ); if ( fieldPath.size() != 2 ) XMP_Throw ( "The fieldName must be simple", kXMPErr_BadXPath ); XMP_StringLen reserveLen = strlen(arrayName) + fieldPath[kRootPropStep].step.size() + strlen(fieldValue) + 5; XMP_VarString fullPath; // ! Allow for arrayName to be the incoming _fullPath.c_str(). fullPath.reserve ( reserveLen ); fullPath = arrayName; fullPath += '['; fullPath += fieldPath[kRootPropStep].step; fullPath += "=\""; fullPath += fieldValue; fullPath += "\"]"; *_fullPath = fullPath; } // ComposeFieldSelector // ------------------------------------------------------------------------------------------------- // ConvertFromBool // --------------- /* class static */ void XMPUtils::ConvertFromBool ( bool binValue, XMP_VarString * strValue ) { XMP_Assert ( strValue != 0 ); // Enforced by wrapper. if ( binValue ) { *strValue = kXMP_TrueStr; } else { *strValue = kXMP_FalseStr; } } // ConvertFromBool // ------------------------------------------------------------------------------------------------- // ConvertFromInt // -------------- /* class static */ void XMPUtils::ConvertFromInt ( XMP_Int32 binValue, XMP_StringPtr format, XMP_VarString * strValue ) { XMP_Assert ( (format != 0) && (strValue != 0) ); // Enforced by wrapper. strValue->erase(); if ( *format == 0 ) format = "%d"; // AUDIT: Using sizeof(buffer) for the snprintf length is safe. char buffer [32]; // Big enough for a 64-bit integer; snprintf ( buffer, sizeof(buffer), format, binValue ); *strValue = buffer; } // ConvertFromInt // ------------------------------------------------------------------------------------------------- // ConvertFromInt64 // ---------------- /* class static */ void XMPUtils::ConvertFromInt64 ( XMP_Int64 binValue, XMP_StringPtr format, XMP_VarString * strValue ) { XMP_Assert ( (format != 0) && (strValue != 0) ); // Enforced by wrapper. strValue->erase(); if ( *format == 0 ) format = "%lld"; // AUDIT: Using sizeof(buffer) for the snprintf length is safe. char buffer [32]; // Big enough for a 64-bit integer; snprintf ( buffer, sizeof(buffer), format, binValue ); *strValue = buffer; } // ConvertFromInt64 // ------------------------------------------------------------------------------------------------- // ConvertFromFloat // ---------------- /* class static */ void XMPUtils::ConvertFromFloat ( double binValue, XMP_StringPtr format, XMP_VarString * strValue ) { XMP_Assert ( (format != 0) && (strValue != 0) ); // Enforced by wrapper. strValue->erase(); if ( *format == 0 ) format = "%f"; // AUDIT: Using sizeof(buffer) for the snprintf length is safe. char buffer [64]; // Ought to be plenty big enough. snprintf ( buffer, sizeof(buffer), format, binValue ); *strValue = buffer; } // ConvertFromFloat // ------------------------------------------------------------------------------------------------- // ConvertFromDate // --------------- // // Format a date-time string according to ISO 8601 and http://www.w3.org/TR/NOTE-datetime: // YYYY // YYYY-MM // YYYY-MM-DD // YYYY-MM-DDThh:mmTZD // YYYY-MM-DDThh:mm:ssTZD // YYYY-MM-DDThh:mm:ss.sTZD // // YYYY = four-digit year // MM = two-digit month (01=January, etc.) // DD = two-digit day of month (01 through 31) // hh = two digits of hour (00 through 23) // mm = two digits of minute (00 through 59) // ss = two digits of second (00 through 59) // s = one or more digits representing a decimal fraction of a second // TZD = time zone designator (Z or +hh:mm or -hh:mm) // // Note that ISO 8601 does not seem to allow years less than 1000 or greater than 9999. We allow // any year, even negative ones. The year is formatted as "%.4d". The TZD is also optional in XMP, // even though required in the W3C profile. Finally, Photoshop 8 (CS) sometimes created time-only // values so we tolerate that. /* class static */ void XMPUtils::ConvertFromDate ( const XMP_DateTime & _inValue, XMP_VarString * strValue ) { XMP_Assert ( strValue != 0 ); // Enforced by wrapper. char buffer [100]; // Plenty long enough. // Pick the format, use snprintf to format into a local buffer, assign to static output string. // Don't use AdjustTimeOverflow at the start, that will wipe out zero month or day values. // ! Photoshop 8 creates "time only" values with zeros for year, month, and day. XMP_DateTime binValue = _inValue; VerifyDateTimeFlags ( &binValue ); // Temporary fix for bug 1269463, silently fix out of range month or day. if ( binValue.month == 0 ) { if ( (binValue.day != 0) || binValue.hasTime ) binValue.month = 1; } else { if ( binValue.month < 1 ) binValue.month = 1; if ( binValue.month > 12 ) binValue.month = 12; } if ( binValue.day == 0 ) { if ( binValue.hasTime ) binValue.day = 1; } else { if ( binValue.day < 1 ) binValue.day = 1; if ( binValue.day > 31 ) binValue.day = 31; } // Now carry on with the original logic. if ( binValue.month == 0 ) { // Output YYYY if all else is zero, otherwise output a full string for the quasi-bogus // "time only" values from Photoshop CS. if ( (binValue.day == 0) && (! binValue.hasTime) ) { snprintf ( buffer, sizeof(buffer), "%.4d", binValue.year ); // AUDIT: Using sizeof for snprintf length is safe. } else if ( (binValue.year == 0) && (binValue.day == 0) ) { FormatFullDateTime ( binValue, buffer, sizeof(buffer) ); } else { XMP_Throw ( "Invalid partial date", kXMPErr_BadParam); } } else if ( binValue.day == 0 ) { // Output YYYY-MM. if ( (binValue.month < 1) || (binValue.month > 12) ) XMP_Throw ( "Month is out of range", kXMPErr_BadParam); if ( binValue.hasTime ) XMP_Throw ( "Invalid partial date, non-zeros after zero month and day", kXMPErr_BadParam); snprintf ( buffer, sizeof(buffer), "%.4d-%02d", binValue.year, binValue.month ); // AUDIT: Using sizeof for snprintf length is safe. } else if ( ! binValue.hasTime ) { // Output YYYY-MM-DD. if ( (binValue.month < 1) || (binValue.month > 12) ) XMP_Throw ( "Month is out of range", kXMPErr_BadParam); if ( (binValue.day < 1) || (binValue.day > 31) ) XMP_Throw ( "Day is out of range", kXMPErr_BadParam); snprintf ( buffer, sizeof(buffer), "%.4d-%02d-%02d", binValue.year, binValue.month, binValue.day ); // AUDIT: Using sizeof for snprintf length is safe. } else { FormatFullDateTime ( binValue, buffer, sizeof(buffer) ); } strValue->assign ( buffer ); if ( binValue.hasTimeZone ) { if ( (binValue.tzHour < 0) || (binValue.tzHour > 23) || (binValue.tzMinute < 0 ) || (binValue.tzMinute > 59) || (binValue.tzSign < -1) || (binValue.tzSign > +1) || ((binValue.tzSign == 0) && ((binValue.tzHour != 0) || (binValue.tzMinute != 0))) ) { XMP_Throw ( "Invalid time zone values", kXMPErr_BadParam ); } if ( binValue.tzSign == 0 ) { *strValue += 'Z'; } else { snprintf ( buffer, sizeof(buffer), "+%02d:%02d", binValue.tzHour, binValue.tzMinute ); // AUDIT: Using sizeof for snprintf length is safe. if ( binValue.tzSign < 0 ) buffer[0] = '-'; *strValue += buffer; } } } // ConvertFromDate // ------------------------------------------------------------------------------------------------- // ConvertToBool // ------------- // // Formally the string value should be "True" or "False", but we should be more flexible here. Map // the string to lower case. Allow any of "true", "false", "t", "f", "1", or "0". /* class static */ bool XMPUtils::ConvertToBool ( XMP_StringPtr strValue ) { if ( (strValue == 0) || (*strValue == 0) ) XMP_Throw ( "Empty convert-from string", kXMPErr_BadValue ); bool result = false; XMP_VarString strObj ( strValue ); for ( XMP_VarStringPos ch = strObj.begin(); ch != strObj.end(); ++ch ) { if ( ('A' <= *ch) && (*ch <= 'Z') ) *ch += 0x20; } if ( (strObj == "true") || (strObj == "t") || (strObj == "1") ) { result = true; } else if ( (strObj == "false") || (strObj == "f") || (strObj == "0") ) { result = false; } else { XMP_Throw ( "Invalid Boolean string", kXMPErr_BadParam ); } return result; } // ConvertToBool // ------------------------------------------------------------------------------------------------- // ConvertToInt // ------------ /* class static */ XMP_Int32 XMPUtils::ConvertToInt ( XMP_StringPtr strValue ) { if ( (strValue == 0) || (*strValue == 0) ) XMP_Throw ( "Empty convert-from string", kXMPErr_BadValue ); int count; char nextCh; XMP_Int32 result; if ( ! XMP_LitNMatch ( strValue, "0x", 2 ) ) { count = sscanf ( strValue, "%d%c", &result, &nextCh ); } else { count = sscanf ( strValue, "%x%c", &result, &nextCh ); } if ( count != 1 ) XMP_Throw ( "Invalid integer string", kXMPErr_BadParam ); return result; } // ConvertToInt // ------------------------------------------------------------------------------------------------- // ConvertToInt64 // -------------- /* class static */ XMP_Int64 XMPUtils::ConvertToInt64 ( XMP_StringPtr strValue ) { if ( (strValue == 0) || (*strValue == 0) ) XMP_Throw ( "Empty convert-from string", kXMPErr_BadValue ); int count; char nextCh; XMP_Int64 result; if ( ! XMP_LitNMatch ( strValue, "0x", 2 ) ) { count = sscanf ( strValue, "%lld%c", &result, &nextCh ); } else { count = sscanf ( strValue, "%llx%c", &result, &nextCh ); } if ( count != 1 ) XMP_Throw ( "Invalid integer string", kXMPErr_BadParam ); return result; } // ConvertToInt64 // ------------------------------------------------------------------------------------------------- // ConvertToFloat // -------------- /* class static */ double XMPUtils::ConvertToFloat ( XMP_StringPtr strValue ) { if ( (strValue == 0) || (*strValue == 0) ) XMP_Throw ( "Empty convert-from string", kXMPErr_BadValue ); XMP_VarString oldLocale; // Try to make sure number conversion uses '.' as the decimal point. XMP_StringPtr oldLocalePtr = setlocale ( LC_ALL, 0 ); if ( oldLocalePtr != 0 ) { oldLocale.assign ( oldLocalePtr ); setlocale ( LC_ALL, "C" ); } errno = 0; char * numEnd; double result = strtod ( strValue, &numEnd ); if ( oldLocalePtr != 0 ) setlocale ( LC_ALL, oldLocalePtr ); // ! Reset locale before possible throw! if ( (errno != 0) || (*numEnd != 0) ) XMP_Throw ( "Invalid float string", kXMPErr_BadParam ); return result; } // ConvertToFloat // ------------------------------------------------------------------------------------------------- // ConvertToDate // ------------- // // Parse a date-time string according to ISO 8601 and http://www.w3.org/TR/NOTE-datetime: // YYYY // YYYY-MM // YYYY-MM-DD // YYYY-MM-DDThh:mmTZD // YYYY-MM-DDThh:mm:ssTZD // YYYY-MM-DDThh:mm:ss.sTZD // // YYYY = four-digit year // MM = two-digit month (01=January, etc.) // DD = two-digit day of month (01 through 31) // hh = two digits of hour (00 through 23) // mm = two digits of minute (00 through 59) // ss = two digits of second (00 through 59) // s = one or more digits representing a decimal fraction of a second // TZD = time zone designator (Z or +hh:mm or -hh:mm) // // Note that ISO 8601 does not seem to allow years less than 1000 or greater than 9999. We allow // any year, even negative ones. The year is formatted as "%.4d". The TZD is also optional in XMP, // even though required in the W3C profile. Finally, Photoshop 8 (CS) sometimes created time-only // values so we tolerate that. // *** Put the ISO format comments in the header documentation. /* class static */ void XMPUtils::ConvertToDate ( XMP_StringPtr strValue, XMP_DateTime * binValue ) { if ( (strValue == 0) || (*strValue == 0) ) XMP_Throw ( "Empty convert-from string", kXMPErr_BadValue); size_t pos = 0; XMP_Int32 temp; XMP_Assert ( sizeof(*binValue) == sizeof(XMP_DateTime) ); (void) memset ( binValue, 0, sizeof(*binValue) ); // AUDIT: Safe, using sizeof destination. size_t strSize = strlen ( strValue ); bool timeOnly = ( (strValue[0] == 'T') || ((strSize >= 2) && (strValue[1] == ':')) || ((strSize >= 3) && (strValue[2] == ':')) ); if ( ! timeOnly ) { binValue->hasDate = true; if ( strValue[0] == '-' ) pos = 1; temp = GatherInt ( strValue, &pos, "Invalid year in date string" ); // Extract the year. if ( (strValue[pos] != 0) && (strValue[pos] != '-') ) XMP_Throw ( "Invalid date string, after year", kXMPErr_BadParam ); if ( strValue[0] == '-' ) temp = -temp; binValue->year = temp; if ( strValue[pos] == 0 ) return; ++pos; temp = GatherInt ( strValue, &pos, "Invalid month in date string" ); // Extract the month. if ( (strValue[pos] != 0) && (strValue[pos] != '-') ) XMP_Throw ( "Invalid date string, after month", kXMPErr_BadParam ); binValue->month = temp; if ( strValue[pos] == 0 ) return; ++pos; temp = GatherInt ( strValue, &pos, "Invalid day in date string" ); // Extract the day. if ( (strValue[pos] != 0) && (strValue[pos] != 'T') ) XMP_Throw ( "Invalid date string, after day", kXMPErr_BadParam ); binValue->day = temp; if ( strValue[pos] == 0 ) return; // Allow year, month, and day to all be zero; implies the date portion is missing. if ( (binValue->year != 0) || (binValue->month != 0) || (binValue->day != 0) ) { // Temporary fix for bug 1269463, silently fix out of range month or day. // if ( (binValue->month < 1) || (binValue->month > 12) ) XMP_Throw ( "Month is out of range", kXMPErr_BadParam ); // if ( (binValue->day < 1) || (binValue->day > 31) ) XMP_Throw ( "Day is out of range", kXMPErr_BadParam ); if ( binValue->month < 1 ) binValue->month = 1; if ( binValue->month > 12 ) binValue->month = 12; if ( binValue->day < 1 ) binValue->day = 1; if ( binValue->day > 31 ) binValue->day = 31; } } // If we get here there is more of the string, otherwise we would have returned above. if ( strValue[pos] == 'T' ) { ++pos; } else if ( ! timeOnly ) { XMP_Throw ( "Invalid date string, missing 'T' after date", kXMPErr_BadParam ); } binValue->hasTime = true; temp = GatherInt ( strValue, &pos, "Invalid hour in date string" ); // Extract the hour. if ( strValue[pos] != ':' ) XMP_Throw ( "Invalid date string, after hour", kXMPErr_BadParam ); if ( temp > 23 ) temp = 23; // *** 1269463: XMP_Throw ( "Hour is out of range", kXMPErr_BadParam ); binValue->hour = temp; // Don't check for done, we have to work up to the time zone. ++pos; temp = GatherInt ( strValue, &pos, "Invalid minute in date string" ); // And the minute. if ( (strValue[pos] != ':') && (strValue[pos] != 'Z') && (strValue[pos] != '+') && (strValue[pos] != '-') && (strValue[pos] != 0) ) XMP_Throw ( "Invalid date string, after minute", kXMPErr_BadParam ); if ( temp > 59 ) temp = 59; // *** 1269463: XMP_Throw ( "Minute is out of range", kXMPErr_BadParam ); binValue->minute = temp; // Don't check for done, we have to work up to the time zone. if ( strValue[pos] == ':' ) { ++pos; temp = GatherInt ( strValue, &pos, "Invalid whole seconds in date string" ); // Extract the whole seconds. if ( (strValue[pos] != '.') && (strValue[pos] != 'Z') && (strValue[pos] != '+') && (strValue[pos] != '-') && (strValue[pos] != 0) ) { XMP_Throw ( "Invalid date string, after whole seconds", kXMPErr_BadParam ); } if ( temp > 59 ) temp = 59; // *** 1269463: XMP_Throw ( "Whole second is out of range", kXMPErr_BadParam ); binValue->second = temp; // Don't check for done, we have to work up to the time zone. if ( strValue[pos] == '.' ) { ++pos; size_t digits = pos; // Will be the number of digits later. temp = GatherInt ( strValue, &pos, "Invalid fractional seconds in date string" ); // Extract the fractional seconds. if ( (strValue[pos] != 'Z') && (strValue[pos] != '+') && (strValue[pos] != '-') && (strValue[pos] != 0) ) { XMP_Throw ( "Invalid date string, after fractional second", kXMPErr_BadParam ); } digits = pos - digits; for ( ; digits > 9; --digits ) temp = temp / 10; for ( ; digits < 9; ++digits ) temp = temp * 10; if ( temp >= 1000*1000*1000 ) XMP_Throw ( "Fractional second is out of range", kXMPErr_BadParam ); binValue->nanoSecond = temp; // Don't check for done, we have to work up to the time zone. } } if ( strValue[pos] == 0 ) return; binValue->hasTimeZone = true; if ( strValue[pos] == 'Z' ) { ++pos; } else { if ( strValue[pos] == '+' ) { binValue->tzSign = kXMP_TimeEastOfUTC; } else if ( strValue[pos] == '-' ) { binValue->tzSign = kXMP_TimeWestOfUTC; } else { XMP_Throw ( "Time zone must begin with 'Z', '+', or '-'", kXMPErr_BadParam ); } ++pos; temp = GatherInt ( strValue, &pos, "Invalid time zone hour in date string" ); // Extract the time zone hour. if ( strValue[pos] != ':' ) XMP_Throw ( "Invalid date string, after time zone hour", kXMPErr_BadParam ); if ( temp > 23 ) XMP_Throw ( "Time zone hour is out of range", kXMPErr_BadParam ); binValue->tzHour = temp; ++pos; temp = GatherInt ( strValue, &pos, "Invalid time zone minute in date string" ); // Extract the time zone minute. if ( temp > 59 ) XMP_Throw ( "Time zone minute is out of range", kXMPErr_BadParam ); binValue->tzMinute = temp; } if ( strValue[pos] != 0 ) XMP_Throw ( "Invalid date string, extra chars at end", kXMPErr_BadParam ); } // ConvertToDate // ------------------------------------------------------------------------------------------------- // EncodeToBase64 // -------------- // // Encode a string of raw data bytes in base 64 according to RFC 2045. For the encoding definition // see section 6.8 in . Although it isn't needed for RDF, we // do insert a linefeed character as a newline for every 76 characters of encoded output. /* class static */ void XMPUtils::EncodeToBase64 ( XMP_StringPtr rawStr, XMP_StringLen rawLen, XMP_VarString * encodedStr ) { if ( (rawStr == 0) && (rawLen != 0) ) XMP_Throw ( "Null raw data buffer", kXMPErr_BadParam ); XMP_Assert ( encodedStr != 0 ); // Enforced by wrapper. encodedStr->erase(); if ( rawLen == 0 ) return; char encChunk[4]; unsigned long in, out; unsigned char c1, c2, c3; unsigned long merge; const size_t outputSize = (rawLen / 3) * 4; // Approximate, might be small. encodedStr->reserve ( outputSize ); // ---------------------------------------------------------------------------------------- // Each 6 bits of input produces 8 bits of output, so 3 input bytes become 4 output bytes. // Process the whole chunks of 3 bytes first, then deal with any remainder. Be careful with // the loop comparison, size-2 could be negative! for ( in = 0, out = 0; (in+2) < rawLen; in += 3, out += 4 ) { c1 = rawStr[in]; c2 = rawStr[in+1]; c3 = rawStr[in+2]; merge = (c1 << 16) + (c2 << 8) + c3; encChunk[0] = sBase64Chars [ merge >> 18 ]; encChunk[1] = sBase64Chars [ (merge >> 12) & 0x3F ]; encChunk[2] = sBase64Chars [ (merge >> 6) & 0x3F ]; encChunk[3] = sBase64Chars [ merge & 0x3F ]; if ( out >= 76 ) { encodedStr->append ( 1, kLF ); out = 0; } encodedStr->append ( encChunk, 4 ); } // ------------------------------------------------------------------------------------------ // The output must always be a multiple of 4 bytes. If there is a 1 or 2 byte input remainder // we need to create another chunk. Zero pad with bits to a 6 bit multiple, then add one or // two '=' characters to pad out to 4 bytes. switch ( rawLen - in ) { case 0: // Done, no remainder. break; case 1: // One input byte remains. c1 = rawStr[in]; merge = c1 << 16; encChunk[0] = sBase64Chars [ merge >> 18 ]; encChunk[1] = sBase64Chars [ (merge >> 12) & 0x3F ]; encChunk[2] = encChunk[3] = '='; if ( out >= 76 ) encodedStr->append ( 1, kLF ); encodedStr->append ( encChunk, 4 ); break; case 2: // Two input bytes remain. c1 = rawStr[in]; c2 = rawStr[in+1]; merge = (c1 << 16) + (c2 << 8); encChunk[0] = sBase64Chars [ merge >> 18 ]; encChunk[1] = sBase64Chars [ (merge >> 12) & 0x3F ]; encChunk[2] = sBase64Chars [ (merge >> 6) & 0x3F ]; encChunk[3] = '='; if ( out >= 76 ) encodedStr->append ( 1, kLF ); encodedStr->append ( encChunk, 4 ); break; } } // EncodeToBase64 // ------------------------------------------------------------------------------------------------- // DecodeFromBase64 // ---------------- // // Decode a string of raw data bytes from base 64 according to RFC 2045. For the encoding definition // see section 6.8 in . RFC 2045 talks about ignoring all "bad" // input but warning about non-whitespace. For XMP use we ignore space, tab, LF, and CR. Any other // bad input is rejected. /* class static */ void XMPUtils::DecodeFromBase64 ( XMP_StringPtr encodedStr, XMP_StringLen encodedLen, XMP_VarString * rawStr ) { if ( (encodedStr == 0) && (encodedLen != 0) ) XMP_Throw ( "Null encoded data buffer", kXMPErr_BadParam ); XMP_Assert ( rawStr != 0 ); // Enforced by wrapper. rawStr->erase(); if ( encodedLen == 0 ) return; unsigned char ch, rawChunk[3]; unsigned long inStr, inChunk, inLimit, merge, padding; XMP_StringLen outputSize = (encodedLen / 4) * 3; // Only a close approximation. rawStr->reserve ( outputSize ); // ---------------------------------------------------------------------------------------- // Each 8 bits of input produces 6 bits of output, so 4 input bytes become 3 output bytes. // Process all but the last 4 data bytes first, then deal with the final chunk. Whitespace // in the input must be ignored. The first loop finds where the last 4 data bytes start and // counts the number of padding equal signs. padding = 0; for ( inStr = 0, inLimit = encodedLen; (inStr < 4) && (inLimit > 0); ) { inLimit -= 1; // ! Don't do in the loop control, the decr/test order is wrong. ch = encodedStr[inLimit]; if ( ch == '=' ) { padding += 1; // The equal sign padding is a data byte. } else if ( DecodeBase64Char(ch) == 0xFF ) { continue; // Ignore whitespace, don't increment inStr. } else { inStr += 1; } } // ! Be careful to count whitespace that is immediately before the final data. Otherwise // ! middle portion will absorb the final data and mess up the final chunk processing. while ( (inLimit > 0) && (DecodeBase64Char(encodedStr[inLimit-1]) == 0xFF) ) --inLimit; if ( inStr == 0 ) return; // Nothing but whitespace. if ( padding > 2 ) XMP_Throw ( "Invalid encoded string", kXMPErr_BadParam ); // ------------------------------------------------------------------------------------------- // Now process all but the last chunk. The limit ensures that we have at least 4 data bytes // left when entering the output loop, so the inner loop will succeed without overrunning the // end of the data. At the end of the outer loop we might be past inLimit though. inStr = 0; while ( inStr < inLimit ) { merge = 0; for ( inChunk = 0; inChunk < 4; ++inStr ) { // ! Yes, increment inStr on each pass. ch = DecodeBase64Char ( encodedStr [inStr] ); if ( ch == 0xFF ) continue; // Ignore whitespace. merge = (merge << 6) + ch; inChunk += 1; } rawChunk[0] = (unsigned char) (merge >> 16); rawChunk[1] = (unsigned char) ((merge >> 8) & 0xFF); rawChunk[2] = (unsigned char) (merge & 0xFF); rawStr->append ( (char*)rawChunk, 3 ); } // ------------------------------------------------------------------------------------------- // Process the final, possibly partial, chunk of data. The input is always a multiple 4 bytes, // but the raw data can be any length. The number of padding '=' characters determines if the // final chunk has 1, 2, or 3 raw data bytes. XMP_Assert ( inStr < encodedLen ); merge = 0; for ( inChunk = 0; inChunk < 4-padding; ++inStr ) { // ! Yes, increment inStr on each pass. ch = DecodeBase64Char ( encodedStr[inStr] ); if ( ch == 0xFF ) continue; // Ignore whitespace. merge = (merge << 6) + ch; inChunk += 1; } if ( padding == 2 ) { rawChunk[0] = (unsigned char) (merge >> 4); rawStr->append ( (char*)rawChunk, 1 ); } else if ( padding == 1 ) { rawChunk[0] = (unsigned char) (merge >> 10); rawChunk[1] = (unsigned char) ((merge >> 2) & 0xFF); rawStr->append ( (char*)rawChunk, 2 ); } else { rawChunk[0] = (unsigned char) (merge >> 16); rawChunk[1] = (unsigned char) ((merge >> 8) & 0xFF); rawChunk[2] = (unsigned char) (merge & 0xFF); rawStr->append ( (char*)rawChunk, 3 ); } } // DecodeFromBase64 // ------------------------------------------------------------------------------------------------- // PackageForJPEG // -------------- /* class static */ void XMPUtils::PackageForJPEG ( const XMPMeta & origXMP, XMP_VarString * stdStr, XMP_VarString * extStr, XMP_VarString * digestStr ) { XMP_Assert ( (stdStr != 0) && (extStr != 0) && (digestStr != 0) ); // ! Enforced by wrapper. enum { kStdXMPLimit = 65000 }; static const char * kPacketTrailer = ""; static size_t kTrailerLen = strlen ( kPacketTrailer ); XMP_VarString tempStr; XMPMeta stdXMP, extXMP; XMP_OptionBits keepItSmall = kXMP_UseCompactFormat | kXMP_OmitAllFormatting; stdStr->erase(); extStr->erase(); digestStr->erase(); // Try to serialize everything. Note that we're making internal calls to SerializeToBuffer, so // we'll be getting back the pointer and length for its internal string. origXMP.SerializeToBuffer ( &tempStr, keepItSmall, 1, "", "", 0 ); #if Trace_PackageForJPEG printf ( "\nXMPUtils::PackageForJPEG - Full serialize %d bytes\n", tempStr.size() ); #endif if ( tempStr.size() > kStdXMPLimit ) { // Couldn't fit everything, make a copy of the input XMP and make sure there is no xmp:Thumbnails property. stdXMP.tree.options = origXMP.tree.options; stdXMP.tree.name = origXMP.tree.name; stdXMP.tree.value = origXMP.tree.value; CloneOffspring ( &origXMP.tree, &stdXMP.tree ); if ( stdXMP.DoesPropertyExist ( kXMP_NS_XMP, "Thumbnails" ) ) { stdXMP.DeleteProperty ( kXMP_NS_XMP, "Thumbnails" ); stdXMP.SerializeToBuffer ( &tempStr, keepItSmall, 1, "", "", 0 ); #if Trace_PackageForJPEG printf ( " Delete xmp:Thumbnails, %d bytes left\n", tempStr.size() ); #endif } } if ( tempStr.size() > kStdXMPLimit ) { // Still doesn't fit, move all of the Camera Raw namespace. Add a dummy value for xmpNote:HasExtendedXMP. stdXMP.SetProperty ( kXMP_NS_XMP_Note, "HasExtendedXMP", "123456789-123456789-123456789-12", 0 ); XMP_NodePtrPos crSchemaPos; XMP_Node * crSchema = FindSchemaNode ( &stdXMP.tree, kXMP_NS_CameraRaw, kXMP_ExistingOnly, &crSchemaPos ); if ( crSchema != 0 ) { crSchema->parent = &extXMP.tree; extXMP.tree.children.push_back ( crSchema ); stdXMP.tree.children.erase ( crSchemaPos ); stdXMP.SerializeToBuffer ( &tempStr, keepItSmall, 1, "", "", 0 ); #if Trace_PackageForJPEG printf ( " Move Camera Raw schema, %d bytes left\n", tempStr.size() ); #endif } } if ( tempStr.size() > kStdXMPLimit ) { // Still doesn't fit, move photoshop:History. bool moved = MoveOneProperty ( stdXMP, &extXMP, kXMP_NS_Photoshop, "photoshop:History" ); if ( moved ) { stdXMP.SerializeToBuffer ( &tempStr, keepItSmall, 1, "", "", 0 ); #if Trace_PackageForJPEG printf ( " Move photoshop:History, %d bytes left\n", tempStr.size() ); #endif } } if ( tempStr.size() > kStdXMPLimit ) { // Still doesn't fit, move top level properties in order of estimated size. This is done by // creating a multi-map that maps the serialized size to the string pair for the schema URI // and top level property name. Since maps are inherently ordered, a reverse iteration of // the map can be done to move the largest things first. We use a double loop to keep going // until the serialization actually fits, in case the estimates are off. PropSizeMap propSizes; CreateEstimatedSizeMap ( stdXMP, &propSizes ); #if Trace_PackageForJPEG if ( ! propSizes.empty() ) { printf ( " Top level property map, smallest to largest:\n" ); PropSizeMap::iterator mapPos = propSizes.begin(); PropSizeMap::iterator mapEnd = propSizes.end(); for ( ; mapPos != mapEnd; ++mapPos ) { size_t propSize = mapPos->first; const char * schemaName = mapPos->second.first->c_str(); const char * propName = mapPos->second.second->c_str(); printf ( " %d bytes, %s in %s\n", propSize, propName, schemaName ); } } #endif #if 0 // Trace_PackageForJPEG *** Xcode 2.3 on 10.4.7 has bugs in backwards iteration if ( ! propSizes.empty() ) { printf ( " Top level property map, largest to smallest:\n" ); PropSizeMap::iterator mapPos = propSizes.end(); PropSizeMap::iterator mapBegin = propSizes.begin(); for ( --mapPos; true; --mapPos ) { size_t propSize = mapPos->first; const char * schemaName = mapPos->second.first->c_str(); const char * propName = mapPos->second.second->c_str(); printf ( " %d bytes, %s in %s\n", propSize, propName, schemaName ); if ( mapPos == mapBegin ) break; } } #endif // Outer loop to make sure enough is actually moved. while ( (tempStr.size() > kStdXMPLimit) && (! propSizes.empty()) ) { // Inner loop, move what seems to be enough according to the estimates. size_t tempLen = tempStr.size(); while ( (tempLen > kStdXMPLimit) && (! propSizes.empty()) ) { size_t propSize = MoveLargestProperty ( stdXMP, &extXMP, propSizes ); XMP_Assert ( propSize > 0 ); if ( propSize > tempLen ) propSize = tempLen; // ! Don't go negative. tempLen -= propSize; } // Reserialize the remaining standard XMP. stdXMP.SerializeToBuffer ( &tempStr, keepItSmall, 1, "", "", 0 ); } } if ( tempStr.size() > kStdXMPLimit ) { // Still doesn't fit, throw an exception and let the client decide what to do. // ! This should never happen with the policy of moving any and all top level properties. XMP_Throw ( "Can't reduce XMP enough for JPEG file", kXMPErr_TooLargeForJPEG ); } // Set the static output strings. if ( extXMP.tree.children.empty() ) { // Just have the standard XMP. *stdStr = tempStr; } else { // Have extended XMP. Serialize it, compute the digest, reset xmpNote:HasExtendedXMP, and // reserialize the standard XMP. extXMP.SerializeToBuffer ( &tempStr, (keepItSmall | kXMP_OmitPacketWrapper), 0, "", "", 0 ); *extStr = tempStr; MD5_CTX context; XMP_Uns8 digest [16]; MD5Init ( &context ); MD5Update ( &context, (XMP_Uns8*)tempStr.c_str(), (XMP_Uns32)tempStr.size() ); MD5Final ( digest, &context ); digestStr->reserve ( 32 ); for ( size_t i = 0; i < 16; ++i ) { XMP_Uns8 byte = digest[i]; digestStr->push_back ( kHexDigits [ byte>>4 ] ); digestStr->push_back ( kHexDigits [ byte&0xF ] ); } stdXMP.SetProperty ( kXMP_NS_XMP_Note, "HasExtendedXMP", digestStr->c_str(), 0 ); stdXMP.SerializeToBuffer ( &tempStr, keepItSmall, 1, "", "", 0 ); *stdStr = tempStr; } // Adjust the standard XMP padding to be up to 2KB. XMP_Assert ( (stdStr->size() > kTrailerLen) && (stdStr->size() <= kStdXMPLimit) ); const char * packetEnd = stdStr->c_str() + stdStr->size() - kTrailerLen; XMP_Assert ( XMP_LitMatch ( packetEnd, kPacketTrailer ) ); size_t extraPadding = kStdXMPLimit - stdStr->size(); // ! Do this before erasing the trailer. if ( extraPadding > 2047 ) extraPadding = 2047; stdStr->erase ( stdStr->size() - kTrailerLen ); stdStr->append ( extraPadding, ' ' ); stdStr->append ( kPacketTrailer ); } // PackageForJPEG // ------------------------------------------------------------------------------------------------- // MergeFromJPEG // ------------- // // Copy all of the top level properties from extendedXMP to fullXMP, replacing any duplicates. // Delete the xmpNote:HasExtendedXMP property from fullXMP. /* class static */ void XMPUtils::MergeFromJPEG ( XMPMeta * fullXMP, const XMPMeta & extendedXMP ) { XMP_OptionBits apFlags = (kXMPTemplate_ReplaceExistingProperties | kXMPTemplate_IncludeInternalProperties); XMPUtils::ApplyTemplate ( fullXMP, extendedXMP, apFlags ); fullXMP->DeleteProperty ( kXMP_NS_XMP_Note, "HasExtendedXMP" ); } // MergeFromJPEG // ------------------------------------------------------------------------------------------------- // CurrentDateTime // --------------- /* class static */ void XMPUtils::CurrentDateTime ( XMP_DateTime * xmpTime ) { XMP_Assert ( xmpTime != 0 ); // ! Enforced by wrapper. ansi_tt binTime = ansi_time(0); if ( binTime == -1 ) XMP_Throw ( "Failure from ANSI C time function", kXMPErr_ExternalFailure ); ansi_tm currTime; ansi_localtime ( &binTime, &currTime ); xmpTime->year = currTime.tm_year + 1900; xmpTime->month = currTime.tm_mon + 1; xmpTime->day = currTime.tm_mday; xmpTime->hasDate = true; xmpTime->hour = currTime.tm_hour; xmpTime->minute = currTime.tm_min; xmpTime->second = currTime.tm_sec; xmpTime->nanoSecond = 0; xmpTime->hasTime = true; xmpTime->tzSign = 0; xmpTime->tzHour = 0; xmpTime->tzMinute = 0; xmpTime->hasTimeZone = false; // ! Needed for SetTimeZone. XMPUtils::SetTimeZone ( xmpTime ); } // CurrentDateTime // ------------------------------------------------------------------------------------------------- // SetTimeZone // ----------- // // Sets just the time zone part of the time. Useful for determining the local time zone or for // converting a "zone-less" time to a proper local time. The ANSI C time functions are smart enough // to do all the right stuff, as long as we call them properly! /* class static */ void XMPUtils::SetTimeZone ( XMP_DateTime * xmpTime ) { XMP_Assert ( xmpTime != 0 ); // ! Enforced by wrapper. VerifyDateTimeFlags ( xmpTime ); if ( xmpTime->hasTimeZone ) { XMP_Throw ( "SetTimeZone can only be used on zone-less times", kXMPErr_BadParam ); } // Create ansi_tt form of the input time. Need the ansi_tm form to make the ansi_tt form. ansi_tt ttTime; ansi_tm tmLocal, tmUTC; if ( (xmpTime->year == 0) && (xmpTime->month == 0) && (xmpTime->day == 0) ) { ansi_tt now = ansi_time(0); if ( now == -1 ) XMP_Throw ( "Failure from ANSI C time function", kXMPErr_ExternalFailure ); ansi_localtime ( &now, &tmLocal ); } else { tmLocal.tm_year = xmpTime->year - 1900; while ( tmLocal.tm_year < 70 ) tmLocal.tm_year += 4; // ! Some versions of mktime barf on years before 1970. tmLocal.tm_mon = xmpTime->month - 1; tmLocal.tm_mday = xmpTime->day; } tmLocal.tm_hour = xmpTime->hour; tmLocal.tm_min = xmpTime->minute; tmLocal.tm_sec = xmpTime->second; tmLocal.tm_isdst = -1; // Don't know if daylight time is in effect. ttTime = ansi_mktime ( &tmLocal ); if ( ttTime == -1 ) XMP_Throw ( "Failure from ANSI C mktime function", kXMPErr_ExternalFailure ); // Convert back to a localized ansi_tm time and get the corresponding UTC ansi_tm time. ansi_localtime ( &ttTime, &tmLocal ); ansi_gmtime ( &ttTime, &tmUTC ); // Get the offset direction and amount. ansi_tm tmx = tmLocal; // ! Note that mktime updates the ansi_tm parameter, messing up difftime! ansi_tm tmy = tmUTC; tmx.tm_isdst = tmy.tm_isdst = 0; ansi_tt ttx = ansi_mktime ( &tmx ); ansi_tt tty = ansi_mktime ( &tmy ); double diffSecs; if ( (ttx != -1) && (tty != -1) ) { diffSecs = ansi_difftime ( ttx, tty ); } else { #if XMP_MacBuild // Looks like Apple's mktime is buggy - see W1140533. But the offset is visible. diffSecs = tmLocal.tm_gmtoff; #else // Win and UNIX don't have a visible offset. Make sure we know about the failure, // then try using the current date/time as a close fallback. ttTime = ansi_time(0); if ( ttTime == -1 ) XMP_Throw ( "Failure from ANSI C time function", kXMPErr_ExternalFailure ); ansi_localtime ( &ttTime, &tmx ); ansi_gmtime ( &ttTime, &tmy ); tmx.tm_isdst = tmy.tm_isdst = 0; ttx = ansi_mktime ( &tmx ); tty = ansi_mktime ( &tmy ); if ( (ttx == -1) || (tty == -1) ) XMP_Throw ( "Failure from ANSI C mktime function", kXMPErr_ExternalFailure ); diffSecs = ansi_difftime ( ttx, tty ); #endif } if ( diffSecs > 0.0 ) { xmpTime->tzSign = kXMP_TimeEastOfUTC; } else if ( diffSecs == 0.0 ) { xmpTime->tzSign = kXMP_TimeIsUTC; } else { xmpTime->tzSign = kXMP_TimeWestOfUTC; diffSecs = -diffSecs; } xmpTime->tzHour = XMP_Int32 ( diffSecs / 3600.0 ); xmpTime->tzMinute = XMP_Int32 ( (diffSecs / 60.0) - (xmpTime->tzHour * 60.0) ); xmpTime->hasTimeZone = xmpTime->hasTime = true; // *** Save the tm_isdst flag in a qualifier? XMP_Assert ( (0 <= xmpTime->tzHour) && (xmpTime->tzHour <= 23) ); XMP_Assert ( (0 <= xmpTime->tzMinute) && (xmpTime->tzMinute <= 59) ); XMP_Assert ( (-1 <= xmpTime->tzSign) && (xmpTime->tzSign <= +1) ); XMP_Assert ( (xmpTime->tzSign == 0) ? ((xmpTime->tzHour == 0) && (xmpTime->tzMinute == 0)) : ((xmpTime->tzHour != 0) || (xmpTime->tzMinute != 0)) ); } // SetTimeZone // ------------------------------------------------------------------------------------------------- // ConvertToUTCTime // ---------------- /* class static */ void XMPUtils::ConvertToUTCTime ( XMP_DateTime * time ) { XMP_Assert ( time != 0 ); // ! Enforced by wrapper. VerifyDateTimeFlags ( time ); if ( ! time->hasTimeZone ) return; // Do nothing if there is no current time zone. XMP_Assert ( (0 <= time->tzHour) && (time->tzHour <= 23) ); XMP_Assert ( (0 <= time->tzMinute) && (time->tzMinute <= 59) ); XMP_Assert ( (-1 <= time->tzSign) && (time->tzSign <= +1) ); XMP_Assert ( (time->tzSign == 0) ? ((time->tzHour == 0) && (time->tzMinute == 0)) : ((time->tzHour != 0) || (time->tzMinute != 0)) ); if ( time->tzSign == kXMP_TimeEastOfUTC ) { // We are before (east of) GMT, subtract the offset from the time. time->hour -= time->tzHour; time->minute -= time->tzMinute; } else if ( time->tzSign == kXMP_TimeWestOfUTC ) { // We are behind (west of) GMT, add the offset to the time. time->hour += time->tzHour; time->minute += time->tzMinute; } AdjustTimeOverflow ( time ); time->tzSign = time->tzHour = time->tzMinute = 0; } // ConvertToUTCTime // ------------------------------------------------------------------------------------------------- // ConvertToLocalTime // ------------------ /* class static */ void XMPUtils::ConvertToLocalTime ( XMP_DateTime * time ) { XMP_Assert ( time != 0 ); // ! Enforced by wrapper. VerifyDateTimeFlags ( time ); if ( ! time->hasTimeZone ) return; // Do nothing if there is no current time zone. XMP_Assert ( (0 <= time->tzHour) && (time->tzHour <= 23) ); XMP_Assert ( (0 <= time->tzMinute) && (time->tzMinute <= 59) ); XMP_Assert ( (-1 <= time->tzSign) && (time->tzSign <= +1) ); XMP_Assert ( (time->tzSign == 0) ? ((time->tzHour == 0) && (time->tzMinute == 0)) : ((time->tzHour != 0) || (time->tzMinute != 0)) ); ConvertToUTCTime ( time ); // The existing time zone might not be the local one. time->hasTimeZone = false; // ! Needed for SetTimeZone. SetTimeZone ( time ); // Fill in the local timezone offset, then adjust the time. if ( time->tzSign > 0 ) { // We are before (east of) GMT, add the offset to the time. time->hour += time->tzHour; time->minute += time->tzMinute; } else if ( time->tzSign < 0 ) { // We are behind (west of) GMT, subtract the offset from the time. time->hour -= time->tzHour; time->minute -= time->tzMinute; } AdjustTimeOverflow ( time ); } // ConvertToLocalTime // ------------------------------------------------------------------------------------------------- // CompareDateTime // --------------- /* class static */ int XMPUtils::CompareDateTime ( const XMP_DateTime & _in_left, const XMP_DateTime & _in_right ) { int result = 0; XMP_DateTime left = _in_left; XMP_DateTime right = _in_right; VerifyDateTimeFlags ( &left ); VerifyDateTimeFlags ( &right ); // Can't compare if one has a date and the other does not. if ( left.hasDate != right.hasDate ) return 0; // Throw? if ( left.hasTimeZone & right.hasTimeZone ) { // If both times have zones then convert them to UTC, otherwise assume the same zone. ConvertToUTCTime ( &left ); ConvertToUTCTime ( &right ); } if ( left.hasDate ) { XMP_Assert ( right.hasDate ); if ( left.year < right.year ) { result = -1; } else if ( left.year > right.year ) { result = +1; } else if ( left.month < right.month ) { result = -1; } else if ( left.month > right.month ) { result = +1; } else if ( left.day < right.day ) { result = -1; } else if ( left.day > right.day ) { result = +1; } if ( result != 0 ) return result; } if ( left.hasTime & right.hasTime ) { // Ignore the time parts if either value is date-only. if ( left.hour < right.hour ) { result = -1; } else if ( left.hour > right.hour ) { result = +1; } else if ( left.minute < right.minute ) { result = -1; } else if ( left.minute > right.minute ) { result = +1; } else if ( left.second < right.second ) { result = -1; } else if ( left.second > right.second ) { result = +1; } else if ( left.nanoSecond < right.nanoSecond ) { result = -1; } else if ( left.nanoSecond > right.nanoSecond ) { result = +1; } else { result = 0; } } return result; } // CompareDateTime // ================================================================================================= exempi-2.2.1/source/XMPCore/XMPCore_Impl.hpp0000664000175000017500000003066012150230672015455 00000000000000#ifndef __XMPCore_Impl_hpp__ #define __XMPCore_Impl_hpp__ 1 // ================================================================================================= // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! Must be the first #include! #include "XMP_Const.h" #include "XMP_BuildInfo.h" #include "XMP_LibUtils.hpp" #include "client-glue/WXMP_Common.hpp" #include #include #include #include #include #if XMP_WinBuild #pragma warning ( disable : 4244 ) // possible loss of data (temporary for 64 bit builds) #pragma warning ( disable : 4267 ) // possible loss of data (temporary for 64 bit builds) #endif // ================================================================================================= // Primary internal types class XMP_Node; class XML_Node; class XPathStepInfo; typedef XMP_Node * XMP_NodePtr; typedef std::vector XMP_NodeOffspring; typedef XMP_NodeOffspring::iterator XMP_NodePtrPos; typedef XMP_VarString::iterator XMP_VarStringPos; typedef XMP_VarString::const_iterator XMP_cVarStringPos; typedef std::vector < XPathStepInfo > XMP_ExpandedXPath; typedef XMP_ExpandedXPath::iterator XMP_ExpandedXPathPos; typedef XMP_ExpandedXPath::const_iterator XMP_cExpandedXPathPos; typedef std::map < XMP_VarString, XMP_ExpandedXPath > XMP_AliasMap; // Alias name to actual path. typedef XMP_AliasMap::iterator XMP_AliasMapPos; typedef XMP_AliasMap::const_iterator XMP_cAliasMapPos; // ================================================================================================= // General global variables and macros extern XMP_Int32 sXMP_InitCount; extern XMP_NamespaceTable * sRegisteredNamespaces; extern XMP_AliasMap * sRegisteredAliasMap; #define WtoXMPMeta_Ref(xmpRef) (const XMPMeta &) (*((XMPMeta*)(xmpRef))) #define WtoXMPMeta_Ptr(xmpRef) ((XMPMeta*)(xmpRef)) #define WtoXMPDocOps_Ptr(docRef) ((XMPDocOps*)(docRef)) extern void * voidVoidPtr; // Used to backfill null output parameters. extern XMP_StringPtr voidStringPtr; extern XMP_StringLen voidStringLen; extern XMP_OptionBits voidOptionBits; extern XMP_Bool voidByte; extern bool voidBool; extern XMP_Int32 voidInt32; extern XMP_Int64 voidInt64; extern double voidDouble; extern XMP_DateTime voidDateTime; extern WXMP_Result void_wResult; #define kHexDigits "0123456789ABCDEF" #define XMP_LitMatch(s,l) (std::strcmp((s),(l)) == 0) #define XMP_LitNMatch(s,l,n) (std::strncmp((s),(l),(n)) == 0) // *** Use the above macros! #if XMP_WinBuild #define snprintf _snprintf #endif // ================================================================================================= // Version info #if XMP_DebugBuild #define kXMPCore_DebugFlag 1 #else #define kXMPCore_DebugFlag 0 #endif #define kXMPCore_VersionNumber ( (kXMPCore_DebugFlag << 31) | \ (XMP_API_VERSION_MAJOR << 24) | \ (XMP_API_VERSION_MINOR << 16) | \ (XMP_API_VERSION_MICRO << 8) ) #define kXMPCoreName "Exempi + XMP Core" #define kXMPCore_VersionMessage kXMPCoreName " " XMP_API_VERSION_STRING // ================================================================================================= // Support for call tracing #ifndef XMP_TraceCoreCalls #define XMP_TraceCoreCalls 0 #define XMP_TraceCoreCallsToFile 0 #endif #if XMP_TraceCoreCalls #undef AnnounceThrow #undef AnnounceCatch #undef AnnounceEntry #undef AnnounceNoLock #undef AnnounceExit extern FILE * xmpCoreLog; #define AnnounceThrow(msg) \ fprintf ( xmpCoreLog, "XMP_Throw: %s\n", msg ); fflush ( xmpCoreLog ) #define AnnounceCatch(msg) \ fprintf ( xmpCoreLog, "Catch in %s: %s\n", procName, msg ); fflush ( xmpCoreLog ) #define AnnounceEntry(proc) \ const char * procName = proc; \ fprintf ( xmpCoreLog, "Entering %s\n", procName ); fflush ( xmpCoreLog ) #define AnnounceNoLock(proc) \ const char * procName = proc; \ fprintf ( xmpCoreLog, "Entering %s (no lock)\n", procName ); fflush ( xmpCoreLog ) #define AnnounceExit() \ fprintf ( xmpCoreLog, "Exiting %s\n", procName ); fflush ( xmpCoreLog ) #endif // ================================================================================================= // ExpandXPath, FindNode, and related support // *** Normalize the use of "const xx &" for input params #define kXMP_ArrayItemName "[]" #define kXMP_CreateNodes true #define kXMP_ExistingOnly false #define FindConstSchema(t,u) FindSchemaNode ( const_cast(t), u, kXMP_ExistingOnly, 0 ) #define FindConstChild(p,c) FindChildNode ( const_cast(p), c, kXMP_ExistingOnly, 0 ) #define FindConstQualifier(p,c) FindQualifierNode ( const_cast(p), c, kXMP_ExistingOnly, 0 ) #define FindConstNode(t,p) FindNode ( const_cast(t), p, kXMP_ExistingOnly, 0 ) extern XMP_OptionBits VerifySetOptions ( XMP_OptionBits options, XMP_StringPtr propValue ); extern void ComposeXPath ( const XMP_ExpandedXPath & expandedXPath, XMP_VarString * stringXPath ); extern void ExpandXPath ( XMP_StringPtr schemaNS, XMP_StringPtr propPath, XMP_ExpandedXPath * expandedXPath ); extern XMP_Node * FindSchemaNode ( XMP_Node * xmpTree, XMP_StringPtr nsURI, bool createNodes, XMP_NodePtrPos * ptrPos = 0 ); extern XMP_Node * FindChildNode ( XMP_Node * parent, XMP_StringPtr childName, bool createNodes, XMP_NodePtrPos * ptrPos = 0 ); extern XMP_Node * FindQualifierNode ( XMP_Node * parent, XMP_StringPtr qualName, bool createNodes, XMP_NodePtrPos * ptrPos = 0 ); extern XMP_Node * FindNode ( XMP_Node * xmpTree, const XMP_ExpandedXPath & expandedXPath, bool createNodes, XMP_OptionBits leafOptions = 0, XMP_NodePtrPos * ptrPos = 0 ); extern XMP_Index LookupLangItem ( const XMP_Node * arrayNode, XMP_VarString & lang ); // ! Lang must be normalized! extern XMP_Index LookupFieldSelector ( const XMP_Node * arrayNode, XMP_StringPtr fieldName, XMP_StringPtr fieldValue ); extern void CloneOffspring ( const XMP_Node * origParent, XMP_Node * cloneParent, bool skipEmpty = false ); extern XMP_Node * CloneSubtree ( const XMP_Node * origRoot, XMP_Node * cloneParent, bool skipEmpty = false ); extern bool CompareSubtrees ( const XMP_Node & leftNode, const XMP_Node & rightNode ); extern void DeleteSubtree ( XMP_NodePtrPos rootNodePos ); extern void DeleteEmptySchema ( XMP_Node * schemaNode ); extern void NormalizeLangValue ( XMP_VarString * value ); extern void NormalizeLangArray ( XMP_Node * array ); extern void DetectAltText ( XMP_Node * xmpParent ); extern void SortNamedNodes ( XMP_NodeOffspring & nodeVector ); static inline bool IsPathPrefix ( XMP_StringPtr fullPath, XMP_StringPtr prefix ) { bool isPrefix = false; XMP_StringLen prefixLen = std::strlen(prefix); if ( XMP_LitNMatch ( prefix, fullPath, prefixLen ) ) { char separator = fullPath[prefixLen]; if ( (separator == 0) || (separator == '/') || (separator == '[') || (separator == '*') ) isPrefix = true; } return isPrefix; } // ------------------------------------------------------------------------------------------------- class XPathStepInfo { public: XMP_VarString step; XMP_OptionBits options; XPathStepInfo ( XMP_StringPtr _step, XMP_OptionBits _options ) : step(_step), options(_options) {}; XPathStepInfo ( XMP_VarString _step, XMP_OptionBits _options ) : step(_step), options(_options) {}; private: XPathStepInfo() : options(0) {}; // ! Hide the default constructor. }; enum { kSchemaStep = 0, kRootPropStep = 1, kAliasIndexStep = 2 }; enum { // Bits for XPathStepInfo options. // *** Add mask check to init code. kXMP_StepKindMask = 0x0F, // ! The step kinds are mutually exclusive numbers. kXMP_StructFieldStep = 0x01, // Also for top level nodes (schema "fields"). kXMP_QualifierStep = 0x02, // ! Order is significant to separate struct/qual from array kinds! kXMP_ArrayIndexStep = 0x03, // ! The kinds must not overlay array form bits! kXMP_ArrayLastStep = 0x04, kXMP_QualSelectorStep = 0x05, kXMP_FieldSelectorStep = 0x06, kXMP_StepIsAlias = 0x10 }; #define GetStepKind(f) ((f) & kXMP_StepKindMask) #define kXMP_NewImplicitNode kXMP_InsertAfterItem // ================================================================================================= // XMP_Node details #if 0 // Pattern for iterating over the children or qualifiers: for ( size_t xxNum = 0, xxLim = _node_->_offspring_.size(); xxNum < xxLim; ++xxNum ) { const XMP_Node * _curr_ = _node_->_offspring_[xxNum]; } #endif class XMP_Node { public: XMP_OptionBits options; XMP_VarString name, value; XMP_Node * parent; XMP_NodeOffspring children; XMP_NodeOffspring qualifiers; #if XMP_DebugBuild // *** XMP_StringPtr _namePtr, _valuePtr; // *** Not working, need operator=? #endif XMP_Node ( XMP_Node * _parent, XMP_StringPtr _name, XMP_OptionBits _options ) : options(_options), name(_name), parent(_parent) { #if XMP_DebugBuild XMP_Assert ( (name.find ( ':' ) != XMP_VarString::npos) || (name == kXMP_ArrayItemName) || (options & kXMP_SchemaNode) || (parent == 0) ); // *** _namePtr = name.c_str(); // *** _valuePtr = value.c_str(); #endif }; XMP_Node ( XMP_Node * _parent, const XMP_VarString & _name, XMP_OptionBits _options ) : options(_options), name(_name), parent(_parent) { #if XMP_DebugBuild XMP_Assert ( (name.find ( ':' ) != XMP_VarString::npos) || (name == kXMP_ArrayItemName) || (options & kXMP_SchemaNode) || (parent == 0) ); // *** _namePtr = name.c_str(); // *** _valuePtr = value.c_str(); #endif }; XMP_Node ( XMP_Node * _parent, XMP_StringPtr _name, XMP_StringPtr _value, XMP_OptionBits _options ) : options(_options), name(_name), value(_value), parent(_parent) { #if XMP_DebugBuild XMP_Assert ( (name.find ( ':' ) != XMP_VarString::npos) || (name == kXMP_ArrayItemName) || (options & kXMP_SchemaNode) || (parent == 0) ); // *** _namePtr = name.c_str(); // *** _valuePtr = value.c_str(); #endif }; XMP_Node ( XMP_Node * _parent, const XMP_VarString & _name, const XMP_VarString & _value, XMP_OptionBits _options ) : options(_options), name(_name), value(_value), parent(_parent) { #if XMP_DebugBuild XMP_Assert ( (name.find ( ':' ) != XMP_VarString::npos) || (name == kXMP_ArrayItemName) || (options & kXMP_SchemaNode) || (parent == 0) ); // *** _namePtr = name.c_str(); // *** _valuePtr = value.c_str(); #endif }; void RemoveChildren() { for ( size_t i = 0, vLim = children.size(); i < vLim; ++i ) { if ( children[i] != 0 ) delete children[i]; } children.clear(); } void RemoveQualifiers() { for ( size_t i = 0, vLim = qualifiers.size(); i < vLim; ++i ) { if ( qualifiers[i] != 0 ) delete qualifiers[i]; } qualifiers.clear(); } void ClearNode() { options = 0; name.erase(); value.erase(); this->RemoveChildren(); this->RemoveQualifiers(); } virtual ~XMP_Node() { RemoveChildren(); RemoveQualifiers(); }; private: XMP_Node() : options(0), parent(0) // ! Make sure parent pointer is always set. { #if XMP_DebugBuild // *** _namePtr = name.c_str(); // *** _valuePtr = value.c_str(); #endif }; }; class XMP_AutoNode { // Used to hold a child during subtree construction. public: XMP_Node * nodePtr; XMP_AutoNode() : nodePtr(0) {}; ~XMP_AutoNode() { if ( nodePtr != 0 ) delete ( nodePtr ); nodePtr = 0; }; XMP_AutoNode ( XMP_Node * _parent, XMP_StringPtr _name, XMP_OptionBits _options ) : nodePtr ( new XMP_Node ( _parent, _name, _options ) ) {}; XMP_AutoNode ( XMP_Node * _parent, const XMP_VarString & _name, XMP_OptionBits _options ) : nodePtr ( new XMP_Node ( _parent, _name, _options ) ) {}; XMP_AutoNode ( XMP_Node * _parent, XMP_StringPtr _name, XMP_StringPtr _value, XMP_OptionBits _options ) : nodePtr ( new XMP_Node ( _parent, _name, _value, _options ) ) {}; XMP_AutoNode ( XMP_Node * _parent, const XMP_VarString & _name, const XMP_VarString & _value, XMP_OptionBits _options ) : nodePtr ( new XMP_Node ( _parent, _name, _value, _options ) ) {}; }; extern void ProcessRDF ( XMP_Node * xmpTree, const XML_Node & xmlTree, XMP_OptionBits options ); // ================================================================================================= #endif // __XMPCore_Impl_hpp__ exempi-2.2.1/source/XMPCore/WXMPUtils.cpp0000664000175000017500000005126212150230672015027 00000000000000// ================================================================================================= // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // *** Should change "type * inParam" to "type & inParam" #include "XMP_Environment.h" // ! This must be the first include! #include "XMP_Const.h" #include "client-glue/WXMPUtils.hpp" #include "XMPCore_Impl.hpp" #include "XMPUtils.hpp" #if XMP_WinBuild #pragma warning ( disable : 4101 ) // unreferenced local variable #pragma warning ( disable : 4189 ) // local variable is initialized but not referenced #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #if XMP_DebugBuild #pragma warning ( disable : 4297 ) // function assumed not to throw an exception but does #endif #endif #if __cplusplus extern "C" { #endif // ================================================================================================= // Class Static Wrappers // ===================== void WXMPUtils_ComposeArrayItemPath_1 ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, void * itemPath, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ComposeArrayItemPath_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); XMP_VarString localStr; XMPUtils::ComposeArrayItemPath ( schemaNS, arrayName, itemIndex, &localStr ); if ( itemPath != 0 ) (*SetClientString) ( itemPath, localStr.c_str(), localStr.size() ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ComposeStructFieldPath_1 ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, void * fieldPath, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ComposeStructFieldPath_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (structName == 0) || (*structName == 0) ) XMP_Throw ( "Empty struct name", kXMPErr_BadXPath ); if ( (fieldNS == 0) || (*fieldNS == 0) ) XMP_Throw ( "Empty field namespace URI", kXMPErr_BadSchema ); if ( (fieldName == 0) || (*fieldName == 0) ) XMP_Throw ( "Empty field name", kXMPErr_BadXPath ); XMP_VarString localStr; XMPUtils::ComposeStructFieldPath ( schemaNS, structName, fieldNS, fieldName, &localStr ); if ( fieldPath != 0 ) (*SetClientString) ( fieldPath, localStr.c_str(), localStr.size() ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ComposeQualifierPath_1 ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, void * qualPath, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ComposeQualifierPath_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (propName == 0) || (*propName == 0) ) XMP_Throw ( "Empty property name", kXMPErr_BadXPath ); if ( (qualNS == 0) || (*qualNS == 0) ) XMP_Throw ( "Empty qualifier namespace URI", kXMPErr_BadSchema ); if ( (qualName == 0) || (*qualName == 0) ) XMP_Throw ( "Empty qualifier name", kXMPErr_BadXPath ); XMP_VarString localStr; XMPUtils::ComposeQualifierPath ( schemaNS, propName, qualNS, qualName, &localStr ); if ( qualPath != 0 ) (*SetClientString) ( qualPath, localStr.c_str(), localStr.size() ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ComposeLangSelector_1 ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr langName, void * selPath, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ComposeLangSelector_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); if ( (langName == 0) || (*langName == 0) ) XMP_Throw ( "Empty language name", kXMPErr_BadParam ); XMP_VarString localStr; XMPUtils::ComposeLangSelector ( schemaNS, arrayName, langName, &localStr ); if ( selPath != 0 ) (*SetClientString) ( selPath, localStr.c_str(), localStr.size() ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ComposeFieldSelector_1 ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, void * selPath, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ComposeFieldSelector_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); if ( (fieldNS == 0) || (*fieldNS == 0) ) XMP_Throw ( "Empty field namespace URI", kXMPErr_BadSchema ); if ( (fieldName == 0) || (*fieldName == 0) ) XMP_Throw ( "Empty field name", kXMPErr_BadXPath ); if ( fieldValue == 0 ) fieldValue = ""; XMP_VarString localStr; XMPUtils::ComposeFieldSelector ( schemaNS, arrayName, fieldNS, fieldName, fieldValue, &localStr ); if ( selPath != 0 ) (*SetClientString) ( selPath, localStr.c_str(), localStr.size() ); XMP_EXIT } // ================================================================================================= void WXMPUtils_ConvertFromBool_1 ( XMP_Bool binValue, void * strValue, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ConvertFromBool_1" ) XMP_VarString localStr; XMPUtils::ConvertFromBool ( binValue, &localStr ); if ( strValue != 0 ) (*SetClientString) ( strValue, localStr.c_str(), localStr.size() ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ConvertFromInt_1 ( XMP_Int32 binValue, XMP_StringPtr format, void * strValue, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ConvertFromInt_1" ) if ( format == 0 ) format = ""; XMP_VarString localStr; XMPUtils::ConvertFromInt ( binValue, format, &localStr ); if ( strValue != 0 ) (*SetClientString) ( strValue, localStr.c_str(), localStr.size() ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ConvertFromInt64_1 ( XMP_Int64 binValue, XMP_StringPtr format, void * strValue, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ConvertFromInt64_1" ) if ( format == 0 ) format = ""; XMP_VarString localStr; XMPUtils::ConvertFromInt64 ( binValue, format, &localStr ); if ( strValue != 0 ) (*SetClientString) ( strValue, localStr.c_str(), localStr.size() ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ConvertFromFloat_1 ( double binValue, XMP_StringPtr format, void * strValue, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ConvertFromFloat_1" ) if ( format == 0 ) format = ""; XMP_VarString localStr; XMPUtils::ConvertFromFloat ( binValue, format, &localStr ); if ( strValue != 0 ) (*SetClientString) ( strValue, localStr.c_str(), localStr.size() ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ConvertFromDate_1 ( const XMP_DateTime & binValue, void * strValue, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ConvertFromDate_1" ) XMP_VarString localStr; XMPUtils::ConvertFromDate( binValue, &localStr ); if ( strValue != 0 ) (*SetClientString) ( strValue, localStr.c_str(), localStr.size() ); XMP_EXIT } // ================================================================================================= void WXMPUtils_ConvertToBool_1 ( XMP_StringPtr strValue, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ConvertToBool_1" ) if ( (strValue == 0) || (*strValue == 0) ) XMP_Throw ( "Empty string value", kXMPErr_BadParam); XMP_Bool result = XMPUtils::ConvertToBool ( strValue ); wResult->int32Result = result; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ConvertToInt_1 ( XMP_StringPtr strValue, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ConvertToInt_1" ) if ( (strValue == 0) || (*strValue == 0) ) XMP_Throw ( "Empty string value", kXMPErr_BadParam); XMP_Int32 result = XMPUtils::ConvertToInt ( strValue ); wResult->int32Result = result; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ConvertToInt64_1 ( XMP_StringPtr strValue, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ConvertToInt64_1" ) if ( (strValue == 0) || (*strValue == 0) ) XMP_Throw ( "Empty string value", kXMPErr_BadParam); XMP_Int64 result = XMPUtils::ConvertToInt64 ( strValue ); wResult->int64Result = result; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ConvertToFloat_1 ( XMP_StringPtr strValue, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ConvertToFloat_1") if ( (strValue == 0) || (*strValue == 0) ) XMP_Throw ( "Empty string value", kXMPErr_BadParam); double result = XMPUtils::ConvertToFloat ( strValue ); wResult->floatResult = result; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ConvertToDate_1 ( XMP_StringPtr strValue, XMP_DateTime * binValue, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ConvertToDate_1" ) if ( binValue == 0 ) XMP_Throw ( "Null output date", kXMPErr_BadParam); // ! Pointer is from the client. XMPUtils::ConvertToDate ( strValue, binValue ); XMP_EXIT } // ================================================================================================= void WXMPUtils_CurrentDateTime_1 ( XMP_DateTime * time, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_CurrentDateTime_1" ) if ( time == 0 ) XMP_Throw ( "Null output date", kXMPErr_BadParam); XMPUtils::CurrentDateTime ( time ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_SetTimeZone_1 ( XMP_DateTime * time, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_SetTimeZone_1" ) if ( time == 0 ) XMP_Throw ( "Null output date", kXMPErr_BadParam); XMPUtils::SetTimeZone ( time ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ConvertToUTCTime_1 ( XMP_DateTime * time, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ConvertToUTCTime_1" ) if ( time == 0 ) XMP_Throw ( "Null output date", kXMPErr_BadParam); XMPUtils::ConvertToUTCTime ( time ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ConvertToLocalTime_1 ( XMP_DateTime * time, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ConvertToLocalTime_1" ) if ( time == 0 ) XMP_Throw ( "Null output date", kXMPErr_BadParam); XMPUtils::ConvertToLocalTime ( time ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_CompareDateTime_1 ( const XMP_DateTime & left, const XMP_DateTime & right, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_CompareDateTime_1" ) int result = XMPUtils::CompareDateTime ( left, right ); wResult->int32Result = result; XMP_EXIT } // ================================================================================================= void WXMPUtils_EncodeToBase64_1 ( XMP_StringPtr rawStr, XMP_StringLen rawLen, void * encodedStr, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_EncodeToBase64_1" ) XMP_VarString localStr; XMPUtils::EncodeToBase64 ( rawStr, rawLen, &localStr ); if ( encodedStr != 0 ) (*SetClientString) ( encodedStr, localStr.c_str(), localStr.size() ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_DecodeFromBase64_1 ( XMP_StringPtr encodedStr, XMP_StringLen encodedLen, void * rawStr, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_DecodeFromBase64_1" ) XMP_VarString localStr; XMPUtils::DecodeFromBase64 ( encodedStr, encodedLen, &localStr ); if ( rawStr != 0 ) (*SetClientString) ( rawStr, localStr.c_str(), localStr.size() ); XMP_EXIT } // ================================================================================================= void WXMPUtils_PackageForJPEG_1 ( XMPMetaRef wxmpObj, void * stdStr, void * extStr, void * digestStr, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_PackageForJPEG_1" ) XMP_VarString localStdStr; XMP_VarString localExtStr; XMP_VarString localDigestStr; const XMPMeta & xmpObj = WtoXMPMeta_Ref ( wxmpObj ); XMP_AutoLock metaLock ( &xmpObj.lock, kXMP_ReadLock ); XMPUtils::PackageForJPEG ( xmpObj, &localStdStr, &localExtStr, &localDigestStr ); if ( stdStr != 0 ) (*SetClientString) ( stdStr, localStdStr.c_str(), localStdStr.size() ); if ( extStr != 0 ) (*SetClientString) ( extStr, localExtStr.c_str(), localExtStr.size() ); if ( digestStr != 0 ) (*SetClientString) ( digestStr, localDigestStr.c_str(), localDigestStr.size() ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_MergeFromJPEG_1 ( XMPMetaRef wfullXMP, XMPMetaRef wextendedXMP, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_MergeFromJPEG_1" ) if ( wfullXMP == 0 ) XMP_Throw ( "Output XMP pointer is null", kXMPErr_BadParam ); if ( wfullXMP == wextendedXMP ) XMP_Throw ( "Full and extended XMP pointers match", kXMPErr_BadParam ); XMPMeta * fullXMP = WtoXMPMeta_Ptr ( wfullXMP ); XMP_AutoLock fullXMPLock ( &fullXMP->lock, kXMP_WriteLock ); const XMPMeta & extendedXMP = WtoXMPMeta_Ref ( wextendedXMP ); XMP_AutoLock extendedXMPLock ( &extendedXMP.lock, kXMP_ReadLock ); XMPUtils::MergeFromJPEG ( fullXMP, extendedXMP ); XMP_EXIT } // ================================================================================================= void WXMPUtils_CatenateArrayItems_1 ( XMPMetaRef wxmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr separator, XMP_StringPtr quotes, XMP_OptionBits options, void * catedStr, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_CatenateArrayItems_1" ) if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); if ( separator == 0 ) separator = "; "; if ( quotes == 0 ) quotes = "\""; XMP_VarString localStr; const XMPMeta & xmpObj = WtoXMPMeta_Ref ( wxmpObj ); XMP_AutoLock metaLock ( &xmpObj.lock, kXMP_ReadLock ); XMPUtils::CatenateArrayItems ( xmpObj, schemaNS, arrayName, separator, quotes, options, &localStr ); if ( catedStr != 0 ) (*SetClientString) ( catedStr, localStr.c_str(), localStr.size() ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_SeparateArrayItems_1 ( XMPMetaRef wxmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, XMP_StringPtr catedStr, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_SeparateArrayItems_1" ) if ( wxmpObj == 0 ) XMP_Throw ( "Output XMP pointer is null", kXMPErr_BadParam ); if ( (schemaNS == 0) || (*schemaNS == 0) ) XMP_Throw ( "Empty schema namespace URI", kXMPErr_BadSchema ); if ( (arrayName == 0) || (*arrayName == 0) ) XMP_Throw ( "Empty array name", kXMPErr_BadXPath ); if ( catedStr == 0 ) catedStr = ""; XMPMeta * xmpObj = WtoXMPMeta_Ptr ( wxmpObj ); XMP_AutoLock metaLock ( &xmpObj->lock, kXMP_WriteLock ); XMPUtils::SeparateArrayItems ( xmpObj, schemaNS, arrayName, options, catedStr ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_ApplyTemplate_1 ( XMPMetaRef wWorkingXMP, XMPMetaRef wTemplateXMP, XMP_OptionBits actions, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_ApplyTemplate_1" ) XMP_Assert ( (wWorkingXMP != 0) && (wTemplateXMP != 0) ); // Client glue enforced. XMPMeta * workingXMP = WtoXMPMeta_Ptr ( wWorkingXMP ); XMP_AutoLock workingLock ( &workingXMP->lock, kXMP_WriteLock ); const XMPMeta & templateXMP = WtoXMPMeta_Ref ( wTemplateXMP ); XMP_AutoLock templateLock ( &templateXMP.lock, kXMP_ReadLock ); XMPUtils::ApplyTemplate ( workingXMP, templateXMP, actions ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPUtils_RemoveProperties_1 ( XMPMetaRef wxmpObj, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_RemoveProperties_1" ) if ( wxmpObj == 0 ) XMP_Throw ( "Output XMP pointer is null", kXMPErr_BadParam ); if ( schemaNS == 0 ) schemaNS = ""; if ( propName == 0 ) propName = ""; XMPMeta * xmpObj = WtoXMPMeta_Ptr ( wxmpObj ); XMP_AutoLock metaLock ( &xmpObj->lock, kXMP_WriteLock ); XMPUtils::RemoveProperties ( xmpObj, schemaNS, propName, options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- // ------------------------------------------------------------------------------------------------- void WXMPUtils_DuplicateSubtree_1 ( XMPMetaRef wSource, XMPMetaRef wDest, XMP_StringPtr sourceNS, XMP_StringPtr sourceRoot, XMP_StringPtr destNS, XMP_StringPtr destRoot, XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPUtils_DuplicateSubtree_1" ) if ( wDest == 0 ) XMP_Throw ( "Output XMP pointer is null", kXMPErr_BadParam ); if ( (sourceNS == 0) || (*sourceNS == 0) ) XMP_Throw ( "Empty source schema URI", kXMPErr_BadSchema ); if ( (sourceRoot == 0) || (*sourceRoot == 0) ) XMP_Throw ( "Empty source root name", kXMPErr_BadXPath ); if ( destNS == 0 ) destNS = sourceNS; if ( destRoot == 0 ) destRoot = sourceRoot; const XMPMeta & source = WtoXMPMeta_Ref ( wSource ); XMP_AutoLock sourceLock ( &source.lock, kXMP_ReadLock, (wSource != wDest) ); XMPMeta * dest = WtoXMPMeta_Ptr ( wDest ); XMP_AutoLock destLock ( &dest->lock, kXMP_WriteLock ); XMPUtils::DuplicateSubtree ( source, dest, sourceNS, sourceRoot, destNS, destRoot, options ); XMP_EXIT } // ================================================================================================= #if __cplusplus } /* extern "C" */ #endif exempi-2.2.1/source/XMPCore/Makefile.in0000664000175000017500000005014512150231002014537 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = source/XMPCore DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libXMPCore_la_LIBADD = am_libXMPCore_la_OBJECTS = ExpatAdapter.lo WXMPIterator.lo \ WXMPUtils.lo XMPIterator.lo XMPMeta-GetSet.lo \ XMPMeta-Serialize.lo XMPUtils-FileInfo.lo ParseRDF.lo \ WXMPMeta.lo XMPCore_Impl.lo XMPMeta.lo XMPMeta-Parse.lo \ XMPUtils.lo libXMPCore_la_OBJECTS = $(am_libXMPCore_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libXMPCore_la_SOURCES) DIST_SOURCES = $(libXMPCore_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libXMPCore.la INCLUDES = -I$(top_srcdir)/public/include \ -I$(top_srcdir)/public/include/client-glue \ -I$(top_srcdir)/build/ \ -I$(srcdir)/../common/ \ -I$(top_srcdir)/third-party/MD5 AM_CXXFLAGS = -Wno-multichar -Wno-ctor-dtor-privacy \ -funsigned-char -fexceptions AM_CPPFLAGS = -Wall \ -D@EXEMPI_PLATFORM_DEF@=1 -DXMP_IMPL=1 -DXMP_ClientBuild=0 \ -D_FILE_OFFSET_BITS=64 -DHAVE_EXPAT_CONFIG_H=1 -DXML_STATIC=1 noinst_HEADERS = \ XMPCore_Impl.hpp XMPIterator.hpp \ XMPMeta.hpp XMPUtils.hpp libXMPCore_la_SOURCES = ExpatAdapter.cpp \ WXMPIterator.cpp \ WXMPUtils.cpp \ XMPIterator.cpp \ XMPMeta-GetSet.cpp \ XMPMeta-Serialize.cpp \ XMPUtils-FileInfo.cpp \ ParseRDF.cpp \ WXMPMeta.cpp \ XMPCore_Impl.cpp \ XMPMeta.cpp \ XMPMeta-Parse.cpp \ XMPUtils.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign source/XMPCore/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign source/XMPCore/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libXMPCore.la: $(libXMPCore_la_OBJECTS) $(libXMPCore_la_DEPENDENCIES) $(EXTRA_libXMPCore_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(libXMPCore_la_OBJECTS) $(libXMPCore_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ExpatAdapter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ParseRDF.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WXMPIterator.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WXMPMeta.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WXMPUtils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPCore_Impl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPIterator.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPMeta-GetSet.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPMeta-Parse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPMeta-Serialize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPMeta.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPUtils-FileInfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPUtils.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/source/XMPCore/ParseRDF.cpp0000664000175000017500000013137312150230672014623 00000000000000// ================================================================================================= // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include! #include "XMPCore_Impl.hpp" #include "ExpatAdapter.hpp" #include #if DEBUG #include #endif using namespace std; #if XMP_WinBuild #pragma warning ( disable : 4189 ) // local variable is initialized but not referenced #pragma warning ( disable : 4505 ) // unreferenced local function has been removed #endif // ================================================================================================= // *** This might be faster and use less memory as a state machine. A big advantage of building an // *** XML tree though is easy lookahead during the recursive descent processing. // *** It would be nice to give a line number or byte offset in the exception messages. // 7 RDF/XML Grammar (from http://www.w3.org/TR/rdf-syntax-grammar/#section-Infoset-Grammar) // // 7.1 Grammar summary // // 7.2.2 coreSyntaxTerms // rdf:RDF | rdf:ID | rdf:about | rdf:parseType | rdf:resource | rdf:nodeID | rdf:datatype // // 7.2.3 syntaxTerms // coreSyntaxTerms | rdf:Description | rdf:li // // 7.2.4 oldTerms // rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID // // 7.2.5 nodeElementURIs // anyURI - ( coreSyntaxTerms | rdf:li | oldTerms ) // // 7.2.6 propertyElementURIs // anyURI - ( coreSyntaxTerms | rdf:Description | oldTerms ) // // 7.2.7 propertyAttributeURIs // anyURI - ( coreSyntaxTerms | rdf:Description | rdf:li | oldTerms ) // // 7.2.8 doc // root ( document-element == RDF, children == list ( RDF ) ) // // 7.2.9 RDF // start-element ( URI == rdf:RDF, attributes == set() ) // nodeElementList // end-element() // // 7.2.10 nodeElementList // ws* ( nodeElement ws* )* // // 7.2.11 nodeElement // start-element ( URI == nodeElementURIs, // attributes == set ( ( idAttr | nodeIdAttr | aboutAttr )?, propertyAttr* ) ) // propertyEltList // end-element() // // 7.2.12 ws // A text event matching white space defined by [XML] definition White Space Rule [3] S in section Common Syntactic Constructs. // // 7.2.13 propertyEltList // ws* ( propertyElt ws* )* // // 7.2.14 propertyElt // resourcePropertyElt | literalPropertyElt | parseTypeLiteralPropertyElt | // parseTypeResourcePropertyElt | parseTypeCollectionPropertyElt | parseTypeOtherPropertyElt | emptyPropertyElt // // 7.2.15 resourcePropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr? ) ) // ws* nodeElement ws* // end-element() // // 7.2.16 literalPropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, datatypeAttr?) ) // text() // end-element() // // 7.2.17 parseTypeLiteralPropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseLiteral ) ) // literal // end-element() // // 7.2.18 parseTypeResourcePropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseResource ) ) // propertyEltList // end-element() // // 7.2.19 parseTypeCollectionPropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseCollection ) ) // nodeElementList // end-element() // // 7.2.20 parseTypeOtherPropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseOther ) ) // propertyEltList // end-element() // // 7.2.21 emptyPropertyElt // start-element ( URI == propertyElementURIs, // attributes == set ( idAttr?, ( resourceAttr | nodeIdAttr )?, propertyAttr* ) ) // end-element() // // 7.2.22 idAttr // attribute ( URI == rdf:ID, string-value == rdf-id ) // // 7.2.23 nodeIdAttr // attribute ( URI == rdf:nodeID, string-value == rdf-id ) // // 7.2.24 aboutAttr // attribute ( URI == rdf:about, string-value == URI-reference ) // // 7.2.25 propertyAttr // attribute ( URI == propertyAttributeURIs, string-value == anyString ) // // 7.2.26 resourceAttr // attribute ( URI == rdf:resource, string-value == URI-reference ) // // 7.2.27 datatypeAttr // attribute ( URI == rdf:datatype, string-value == URI-reference ) // // 7.2.28 parseLiteral // attribute ( URI == rdf:parseType, string-value == "Literal") // // 7.2.29 parseResource // attribute ( URI == rdf:parseType, string-value == "Resource") // // 7.2.30 parseCollection // attribute ( URI == rdf:parseType, string-value == "Collection") // // 7.2.31 parseOther // attribute ( URI == rdf:parseType, string-value == anyString - ("Resource" | "Literal" | "Collection") ) // // 7.2.32 URI-reference // An RDF URI Reference. // // 7.2.33 literal // Any XML element content that is allowed according to [XML] definition Content of Elements Rule [43] content // in section 3.1 Start-Tags, End-Tags, and Empty-Element Tags. // // 7.2.34 rdf-id // An attribute string-value matching any legal [XML-NS] token NCName. // ================================================================================================= // Primary Parsing Functions // ========================= // // Each of these is responsible for recognizing an RDF syntax production and adding the appropriate // structure to the XMP tree. They simply return for success, failures will throw an exception. static void RDF_RDF ( XMP_Node * xmpTree, const XML_Node & xmlNode ); static void RDF_NodeElementList ( XMP_Node * xmpParent, const XML_Node & xmlParent, bool isTopLevel ); static void RDF_NodeElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ); static void RDF_NodeElementAttrs ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ); static void RDF_PropertyElementList ( XMP_Node * xmpParent, const XML_Node & xmlParent, bool isTopLevel ); enum { kIsTopLevel = true, kNotTopLevel = false }; static void RDF_PropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ); static void RDF_ResourcePropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ); static void RDF_LiteralPropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ); static void RDF_ParseTypeLiteralPropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ); static void RDF_ParseTypeResourcePropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ); static void RDF_ParseTypeCollectionPropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ); static void RDF_ParseTypeOtherPropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ); static void RDF_EmptyPropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ); // ================================================================================================= typedef XMP_Uns8 RDFTermKind; // *** Logic might be safer with just masks. enum { kRDFTerm_Other = 0, kRDFTerm_RDF = 1, // Start of coreSyntaxTerms. kRDFTerm_ID = 2, kRDFTerm_about = 3, kRDFTerm_parseType = 4, kRDFTerm_resource = 5, kRDFTerm_nodeID = 6, kRDFTerm_datatype = 7, // End of coreSyntaxTerms. kRDFTerm_Description = 8, // Start of additions for syntaxTerms. kRDFTerm_li = 9, // End of of additions for syntaxTerms. kRDFTerm_aboutEach = 10, // Start of oldTerms. kRDFTerm_aboutEachPrefix = 11, kRDFTerm_bagID = 12, // End of oldTerms. kRDFTerm_FirstCore = kRDFTerm_RDF, kRDFTerm_LastCore = kRDFTerm_datatype, kRDFTerm_FirstSyntax = kRDFTerm_FirstCore, // ! Yes, the syntax terms include the core terms. kRDFTerm_LastSyntax = kRDFTerm_li, kRDFTerm_FirstOld = kRDFTerm_aboutEach, kRDFTerm_LastOld = kRDFTerm_bagID }; enum { kRDFMask_Other = 1 << kRDFTerm_Other, kRDFMask_RDF = 1 << kRDFTerm_RDF, kRDFMask_ID = 1 << kRDFTerm_ID, kRDFMask_about = 1 << kRDFTerm_about, kRDFMask_parseType = 1 << kRDFTerm_parseType, kRDFMask_resource = 1 << kRDFTerm_resource, kRDFMask_nodeID = 1 << kRDFTerm_nodeID, kRDFMask_datatype = 1 << kRDFTerm_datatype, kRDFMask_Description = 1 << kRDFTerm_Description, kRDFMask_li = 1 << kRDFTerm_li, kRDFMask_aboutEach = 1 << kRDFTerm_aboutEach, kRDFMask_aboutEachPrefix = 1 << kRDFTerm_aboutEachPrefix, kRDFMask_bagID = 1 << kRDFTerm_bagID }; enum { kRDF_HasValueElem = 0x10000000UL // ! Contains rdf:value child. Must fit within kXMP_ImplReservedMask! }; // ------------------------------------------------------------------------------------------------- // GetRDFTermKind // -------------- static RDFTermKind GetRDFTermKind ( const XMP_VarString & name ) { RDFTermKind term = kRDFTerm_Other; // Arranged to hopefully minimize the parse time for large XMP. if ( (name.size() > 4) && (strncmp ( name.c_str(), "rdf:", 4 ) == 0) ) { if ( name == "rdf:li" ) { term = kRDFTerm_li; } else if ( name == "rdf:parseType" ) { term = kRDFTerm_parseType; } else if ( name == "rdf:Description" ) { term = kRDFTerm_Description; } else if ( name == "rdf:about" ) { term = kRDFTerm_about; } else if ( name == "rdf:resource" ) { term = kRDFTerm_resource; } else if ( name == "rdf:RDF" ) { term = kRDFTerm_RDF; } else if ( name == "rdf:ID" ) { term = kRDFTerm_ID; } else if ( name == "rdf:nodeID" ) { term = kRDFTerm_nodeID; } else if ( name == "rdf:datatype" ) { term = kRDFTerm_datatype; } else if ( name == "rdf:aboutEach" ) { term = kRDFTerm_aboutEach; } else if ( name == "rdf:aboutEachPrefix" ) { term = kRDFTerm_aboutEachPrefix; } else if ( name == "rdf:bagID" ) { term = kRDFTerm_bagID; } } return term; } // GetRDFTermKind // ================================================================================================= // ------------------------------------------------------------------------------------------------- // IsCoreSyntaxTerm // ---------------- // // 7.2.2 coreSyntaxTerms // rdf:RDF | rdf:ID | rdf:about | rdf:parseType | rdf:resource | rdf:nodeID | rdf:datatype static bool IsCoreSyntaxTerm ( RDFTermKind term ) { if ( (kRDFTerm_FirstCore <= term) && (term <= kRDFTerm_LastCore) ) return true; return false; } // IsCoreSyntaxTerm // ------------------------------------------------------------------------------------------------- // IsSyntaxTerm // ------------ // // 7.2.3 syntaxTerms // coreSyntaxTerms | rdf:Description | rdf:li static bool IsSyntaxTerm ( RDFTermKind term ) { if ( (kRDFTerm_FirstSyntax <= term) && (term <= kRDFTerm_LastSyntax) ) return true; return false; } // IsSyntaxTerm // ------------------------------------------------------------------------------------------------- // IsOldTerm // --------- // // 7.2.4 oldTerms // rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID static bool IsOldTerm ( RDFTermKind term ) { if ( (kRDFTerm_FirstOld <= term) && (term <= kRDFTerm_LastOld) ) return true; return false; } // IsOldTerm // ------------------------------------------------------------------------------------------------- // IsNodeElementName // ----------------- // // 7.2.5 nodeElementURIs // anyURI - ( coreSyntaxTerms | rdf:li | oldTerms ) static bool IsNodeElementName ( RDFTermKind term ) { if ( (term == kRDFTerm_li) || IsOldTerm ( term ) ) return false; return (! IsCoreSyntaxTerm ( term )); } // IsNodeElementName // ------------------------------------------------------------------------------------------------- // IsPropertyElementName // --------------------- // // 7.2.6 propertyElementURIs // anyURI - ( coreSyntaxTerms | rdf:Description | oldTerms ) static bool IsPropertyElementName ( RDFTermKind term ) { if ( (term == kRDFTerm_Description) || IsOldTerm ( term ) ) return false; return (! IsCoreSyntaxTerm ( term )); } // IsPropertyElementName // ------------------------------------------------------------------------------------------------- // IsPropertyAttributeName // ----------------------- // // 7.2.7 propertyAttributeURIs // anyURI - ( coreSyntaxTerms | rdf:Description | rdf:li | oldTerms ) static bool IsPropertyAttributeName ( RDFTermKind term ) { if ( (term == kRDFTerm_Description) || (term == kRDFTerm_li) || IsOldTerm ( term ) ) return false; return (! IsCoreSyntaxTerm ( term )); } // IsPropertyAttributeName // ================================================================================================= // AddChildNode // ============ static XMP_Node * AddChildNode ( XMP_Node * xmpParent, const XML_Node & xmlNode, const XMP_StringPtr value, bool isTopLevel ) { #if 0 cout << "AddChildNode, parent = " << xmpParent->name << ", child = " << xmlNode.name; cout << ", value = \"" << value << '"'; if ( isTopLevel ) cout << ", top level"; cout << endl; #endif if ( xmlNode.ns.empty() ) { XMP_Throw ( "XML namespace required for all elements and attributes", kXMPErr_BadRDF ); } XMP_StringPtr childName = xmlNode.name.c_str(); const bool isArrayItem = (xmlNode.name == "rdf:li"); const bool isValueNode = (xmlNode.name == "rdf:value"); XMP_OptionBits childOptions = 0; if ( isTopLevel ) { // Lookup the schema node, adjust the XMP parent pointer. XMP_Assert ( xmpParent->parent == 0 ); // Incoming parent must be the tree root. XMP_Node * schemaNode = FindSchemaNode ( xmpParent, xmlNode.ns.c_str(), kXMP_CreateNodes ); if ( schemaNode->options & kXMP_NewImplicitNode ) schemaNode->options ^= kXMP_NewImplicitNode; // Clear the implicit node bit. // *** Should use "opt &= ~flag" (no conditional), need runtime check for proper 32 bit code. xmpParent = schemaNode; // If this is an alias set the isAlias flag in the node and the hasAliases flag in the tree. if ( sRegisteredAliasMap->find ( xmlNode.name ) != sRegisteredAliasMap->end() ) { childOptions |= kXMP_PropIsAlias; schemaNode->parent->options |= kXMP_PropHasAliases; } } // Make sure that this is not a duplicate of a named node. if ( ! (isArrayItem | isValueNode) ) { if ( FindChildNode ( xmpParent, childName, kXMP_ExistingOnly ) != 0 ) { XMP_Throw ( "Duplicate property or field node", kXMPErr_BadXMP ); } } // Add the new child to the XMP parent node. XMP_Node * newChild = new XMP_Node ( xmpParent, childName, value, childOptions ); if ( (! isValueNode) || xmpParent->children.empty() ) { xmpParent->children.push_back ( newChild ); } else { xmpParent->children.insert ( xmpParent->children.begin(), newChild ); } if ( isValueNode ) { if ( isTopLevel || (! (xmpParent->options & kXMP_PropValueIsStruct)) ) XMP_Throw ( "Misplaced rdf:value element", kXMPErr_BadRDF ); xmpParent->options |= kRDF_HasValueElem; } if ( isArrayItem ) { if ( ! (xmpParent->options & kXMP_PropValueIsArray) ) XMP_Throw ( "Misplaced rdf:li element", kXMPErr_BadRDF ); newChild->name = kXMP_ArrayItemName; #if 0 // *** XMP_DebugBuild newChild->_namePtr = newChild->name.c_str(); #endif } return newChild; } // AddChildNode // ================================================================================================= // AddQualifierNode // ================ static XMP_Node * AddQualifierNode ( XMP_Node * xmpParent, const XMP_VarString & name, const XMP_VarString & value ) { #if 0 cout << "AddQualifierNode, parent = " << xmpParent->name << ", name = " << name; cout << ", value = \"" << value << '"' << endl; #endif const bool isLang = (name == "xml:lang"); const bool isType = (name == "rdf:type"); XMP_Node * newQual = 0; newQual = new XMP_Node ( xmpParent, name, value, kXMP_PropIsQualifier ); if ( ! (isLang | isType) ) { xmpParent->qualifiers.push_back ( newQual ); } else if ( isLang ) { if ( xmpParent->qualifiers.empty() ) { xmpParent->qualifiers.push_back ( newQual ); } else { xmpParent->qualifiers.insert ( xmpParent->qualifiers.begin(), newQual ); } xmpParent->options |= kXMP_PropHasLang; } else { XMP_Assert ( isType ); if ( xmpParent->qualifiers.empty() ) { xmpParent->qualifiers.push_back ( newQual ); } else { size_t offset = 0; if ( XMP_PropHasLang ( xmpParent->options ) ) offset = 1; xmpParent->qualifiers.insert ( xmpParent->qualifiers.begin()+offset, newQual ); } xmpParent->options |= kXMP_PropHasType; } xmpParent->options |= kXMP_PropHasQualifiers; return newQual; } // AddQualifierNode // ================================================================================================= // AddQualifierNode // ================ static XMP_Node * AddQualifierNode ( XMP_Node * xmpParent, const XML_Node & attr ) { if ( attr.ns.empty() ) { XMP_Throw ( "XML namespace required for all elements and attributes", kXMPErr_BadRDF ); } return AddQualifierNode ( xmpParent, attr.name, attr.value ); } // AddQualifierNode // ================================================================================================= // FixupQualifiedNode // ================== // // The parent is an RDF pseudo-struct containing an rdf:value field. Fix the XMP data model. The // rdf:value node must be the first child, the other children are qualifiers. The form, value, and // children of the rdf:value node are the real ones. The rdf:value node's qualifiers must be added // to the others. static void FixupQualifiedNode ( XMP_Node * xmpParent ) { size_t qualNum, qualLim; size_t childNum, childLim; XMP_Enforce ( (xmpParent->options & kXMP_PropValueIsStruct) && (! xmpParent->children.empty()) ); XMP_Node * valueNode = xmpParent->children[0]; XMP_Enforce ( valueNode->name == "rdf:value" ); xmpParent->qualifiers.reserve ( xmpParent->qualifiers.size() + xmpParent->children.size() + valueNode->qualifiers.size() ); // Move the qualifiers on the value node to the parent. Make sure an xml:lang qualifier stays at // the front. Check for duplicate names between the value node's qualifiers and the parent's // children. The parent's children are about to become qualifiers. Check here, between the // groups. Intra-group duplicates are caught by AddChildNode. qualNum = 0; qualLim = valueNode->qualifiers.size(); if ( valueNode->options & kXMP_PropHasLang ) { if ( xmpParent->options & kXMP_PropHasLang ) XMP_Throw ( "Redundant xml:lang for rdf:value element", kXMPErr_BadXMP ); XMP_Node * langQual = valueNode->qualifiers[0]; XMP_Assert ( langQual->name == "xml:lang" ); langQual->parent = xmpParent; xmpParent->options |= kXMP_PropHasLang; if ( xmpParent->qualifiers.empty() ) { xmpParent->qualifiers.push_back ( langQual ); // *** Should use utilities to add qual & set parent. } else { xmpParent->qualifiers.insert ( xmpParent->qualifiers.begin(), langQual ); } valueNode->qualifiers[0] = 0; // We just moved it to the parent. qualNum = 1; // Start the remaining copy after the xml:lang qualifier. } for ( ; qualNum != qualLim; ++qualNum ) { XMP_Node * currQual = valueNode->qualifiers[qualNum]; if ( FindChildNode ( xmpParent, currQual->name.c_str(), kXMP_ExistingOnly ) != 0 ) { XMP_Throw ( "Duplicate qualifier node", kXMPErr_BadXMP ); } currQual->parent = xmpParent; xmpParent->qualifiers.push_back ( currQual ); valueNode->qualifiers[qualNum] = 0; // We just moved it to the parent. } valueNode->qualifiers.clear(); // ! There should be nothing but null pointers. // Change the parent's other children into qualifiers. This loop starts at 1, child 0 is the // rdf:value node. Put xml:lang at the front, append all others. for ( childNum = 1, childLim = xmpParent->children.size(); childNum != childLim; ++childNum ) { XMP_Node * currQual = xmpParent->children[childNum]; bool isLang = (currQual->name == "xml:lang"); currQual->options |= kXMP_PropIsQualifier; currQual->parent = xmpParent; if ( isLang ) { if ( xmpParent->options & kXMP_PropHasLang ) XMP_Throw ( "Duplicate xml:lang qualifier", kXMPErr_BadXMP ); xmpParent->options |= kXMP_PropHasLang; } else if ( currQual->name == "rdf:type" ) { xmpParent->options |= kXMP_PropHasType; } if ( (! isLang) || xmpParent->qualifiers.empty() ) { xmpParent->qualifiers.push_back ( currQual ); } else { xmpParent->qualifiers.insert ( xmpParent->qualifiers.begin(), currQual ); } xmpParent->children[childNum] = 0; // We just moved it to the qualifers. } if ( ! xmpParent->qualifiers.empty() ) xmpParent->options |= kXMP_PropHasQualifiers; // Move the options and value last, other checks need the parent's original options. Move the // value node's children to be the parent's children. Delete the now useless value node. XMP_Assert ( xmpParent->options & (kXMP_PropValueIsStruct | kRDF_HasValueElem) ); xmpParent->options &= ~ (kXMP_PropValueIsStruct | kRDF_HasValueElem); xmpParent->options |= valueNode->options; xmpParent->value.swap ( valueNode->value ); #if 0 // *** XMP_DebugBuild xmpParent->_valuePtr = xmpParent->value.c_str(); #endif xmpParent->children[0] = 0; // ! Remove the value node itself before the swap. xmpParent->children.swap ( valueNode->children ); for ( size_t childNum = 0, childLim = xmpParent->children.size(); childNum != childLim; ++childNum ) { XMP_Node * currChild = xmpParent->children[childNum]; currChild->parent = xmpParent; } delete valueNode; } // FixupQualifiedNode // ================================================================================================= // ProcessRDF // ========== // // Parse the XML tree of the RDF and build the corresponding XMP tree. // *** Throw an exception if no XMP is found? By option? // *** Do parsing exceptions cause the partial tree to be deleted? void ProcessRDF ( XMP_Node * xmpTree, const XML_Node & rdfNode, XMP_OptionBits options ) { IgnoreParam(options); RDF_RDF ( xmpTree, rdfNode ); } // ProcessRDF // ================================================================================================= // RDF_RDF // ======= // // 7.2.9 RDF // start-element ( URI == rdf:RDF, attributes == set() ) // nodeElementList // end-element() // // The top level rdf:RDF node. It can only have xmlns attributes, which have already been removed // during construction of the XML tree. static void RDF_RDF ( XMP_Node * xmpTree, const XML_Node & xmlNode ) { if ( ! xmlNode.attrs.empty() ) XMP_Throw ( "Invalid attributes of rdf:RDF element", kXMPErr_BadRDF ); RDF_NodeElementList ( xmpTree, xmlNode, kIsTopLevel ); } // RDF_RDF // ================================================================================================= // RDF_NodeElementList // =================== // // 7.2.10 nodeElementList // ws* ( nodeElement ws* )* static void RDF_NodeElementList ( XMP_Node * xmpParent, const XML_Node & xmlParent, bool isTopLevel ) { XMP_Assert ( isTopLevel ); XML_cNodePos currChild = xmlParent.content.begin(); // *** Change these loops to the indexed pattern. XML_cNodePos endChild = xmlParent.content.end(); for ( ; currChild != endChild; ++currChild ) { if ( (*currChild)->IsWhitespaceNode() ) continue; RDF_NodeElement ( xmpParent, **currChild, isTopLevel ); } } // RDF_NodeElementList // ================================================================================================= // RDF_NodeElement // =============== // // 7.2.5 nodeElementURIs // anyURI - ( coreSyntaxTerms | rdf:li | oldTerms ) // // 7.2.11 nodeElement // start-element ( URI == nodeElementURIs, // attributes == set ( ( idAttr | nodeIdAttr | aboutAttr )?, propertyAttr* ) ) // propertyEltList // end-element() // // A node element URI is rdf:Description or anything else that is not an RDF term. static void RDF_NodeElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ) { RDFTermKind nodeTerm = GetRDFTermKind ( xmlNode.name ); if ( (nodeTerm != kRDFTerm_Description) && (nodeTerm != kRDFTerm_Other) ) { XMP_Throw ( "Node element must be rdf:Description or typedNode", kXMPErr_BadRDF ); } if ( isTopLevel && (nodeTerm == kRDFTerm_Other) ) { XMP_Throw ( "Top level typedNode not allowed", kXMPErr_BadXMP ); } else { RDF_NodeElementAttrs ( xmpParent, xmlNode, isTopLevel ); RDF_PropertyElementList ( xmpParent, xmlNode, isTopLevel ); } } // RDF_NodeElement // ================================================================================================= // RDF_NodeElementAttrs // ==================== // // 7.2.7 propertyAttributeURIs // anyURI - ( coreSyntaxTerms | rdf:Description | rdf:li | oldTerms ) // // 7.2.11 nodeElement // start-element ( URI == nodeElementURIs, // attributes == set ( ( idAttr | nodeIdAttr | aboutAttr )?, propertyAttr* ) ) // propertyEltList // end-element() // // Process the attribute list for an RDF node element. A property attribute URI is anything other // than an RDF term. The rdf:ID and rdf:nodeID attributes are simply ignored, as are rdf:about // attributes on inner nodes. static const XMP_OptionBits kExclusiveAttrMask = (kRDFMask_ID | kRDFMask_nodeID | kRDFMask_about); static void RDF_NodeElementAttrs ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ) { XMP_OptionBits exclusiveAttrs = 0; // Used to detect attributes that are mutually exclusive. XML_cNodePos currAttr = xmlNode.attrs.begin(); XML_cNodePos endAttr = xmlNode.attrs.end(); for ( ; currAttr != endAttr; ++currAttr ) { RDFTermKind attrTerm = GetRDFTermKind ( (*currAttr)->name ); switch ( attrTerm ) { case kRDFTerm_ID : case kRDFTerm_nodeID : case kRDFTerm_about : if ( exclusiveAttrs & kExclusiveAttrMask ) XMP_Throw ( "Mutally exclusive about, ID, nodeID attributes", kXMPErr_BadRDF ); exclusiveAttrs |= (1 << attrTerm); if ( isTopLevel && (attrTerm == kRDFTerm_about) ) { // This is the rdf:about attribute on a top level node. Set the XMP tree name if // it doesn't have a name yet. Make sure this name matches the XMP tree name. XMP_Assert ( xmpParent->parent == 0 ); // Must be the tree root node. if ( xmpParent->name.empty() ) { xmpParent->name = (*currAttr)->value; } else if ( ! (*currAttr)->value.empty() ) { if ( xmpParent->name != (*currAttr)->value ) XMP_Throw ( "Mismatched top level rdf:about values", kXMPErr_BadXMP ); } } break; case kRDFTerm_Other : AddChildNode ( xmpParent, **currAttr, (*currAttr)->value.c_str(), isTopLevel ); break; default : XMP_Throw ( "Invalid nodeElement attribute", kXMPErr_BadRDF ); } } } // RDF_NodeElementAttrs // ================================================================================================= // RDF_PropertyElementList // ======================= // // 7.2.13 propertyEltList // ws* ( propertyElt ws* )* static void RDF_PropertyElementList ( XMP_Node * xmpParent, const XML_Node & xmlParent, bool isTopLevel ) { XML_cNodePos currChild = xmlParent.content.begin(); XML_cNodePos endChild = xmlParent.content.end(); for ( ; currChild != endChild; ++currChild ) { if ( (*currChild)->IsWhitespaceNode() ) continue; if ( (*currChild)->kind != kElemNode ) { XMP_Throw ( "Expected property element node not found", kXMPErr_BadRDF ); } RDF_PropertyElement ( xmpParent, **currChild, isTopLevel ); } } // RDF_PropertyElementList // ================================================================================================= // RDF_PropertyElement // =================== // // 7.2.14 propertyElt // resourcePropertyElt | literalPropertyElt | parseTypeLiteralPropertyElt | // parseTypeResourcePropertyElt | parseTypeCollectionPropertyElt | parseTypeOtherPropertyElt | emptyPropertyElt // // 7.2.15 resourcePropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr? ) ) // ws* nodeElement ws* // end-element() // // 7.2.16 literalPropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, datatypeAttr?) ) // text() // end-element() // // 7.2.17 parseTypeLiteralPropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseLiteral ) ) // literal // end-element() // // 7.2.18 parseTypeResourcePropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseResource ) ) // propertyEltList // end-element() // // 7.2.19 parseTypeCollectionPropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseCollection ) ) // nodeElementList // end-element() // // 7.2.20 parseTypeOtherPropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseOther ) ) // propertyEltList // end-element() // // 7.2.21 emptyPropertyElt // start-element ( URI == propertyElementURIs, // attributes == set ( idAttr?, ( resourceAttr | nodeIdAttr )?, propertyAttr* ) ) // end-element() // // The various property element forms are not distinguished by the XML element name, but by their // attributes for the most part. The exceptions are resourcePropertyElt and literalPropertyElt. They // are distinguished by their XML element content. // // NOTE: The RDF syntax does not explicitly include the xml:lang attribute although it can appear in // many of these. We have to allow for it in the attibute counts below. static void RDF_PropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ) { RDFTermKind nodeTerm = GetRDFTermKind ( xmlNode.name ); if ( ! IsPropertyElementName ( nodeTerm ) ) XMP_Throw ( "Invalid property element name", kXMPErr_BadRDF ); if ( xmlNode.attrs.size() > 3 ) { // Only an emptyPropertyElt can have more than 3 attributes. RDF_EmptyPropertyElement ( xmpParent, xmlNode, isTopLevel ); } else { // Look through the attributes for one that isn't rdf:ID or xml:lang, it will usually tell // what we should be dealing with. The called routines must verify their specific syntax! XML_cNodePos currAttr = xmlNode.attrs.begin(); XML_cNodePos endAttr = xmlNode.attrs.end(); XMP_VarString * attrName = 0; for ( ; currAttr != endAttr; ++currAttr ) { attrName = &((*currAttr)->name); if ( (*attrName != "xml:lang") && (*attrName != "rdf:ID") ) break; } if ( currAttr != endAttr ) { XMP_Assert ( attrName != 0 ); XMP_VarString& attrValue = (*currAttr)->value; if ( *attrName == "rdf:datatype" ) { RDF_LiteralPropertyElement ( xmpParent, xmlNode, isTopLevel ); } else if ( *attrName != "rdf:parseType" ) { RDF_EmptyPropertyElement ( xmpParent, xmlNode, isTopLevel ); } else if ( attrValue == "Literal" ) { RDF_ParseTypeLiteralPropertyElement ( xmpParent, xmlNode, isTopLevel ); } else if ( attrValue == "Resource" ) { RDF_ParseTypeResourcePropertyElement ( xmpParent, xmlNode, isTopLevel ); } else if ( attrValue == "Collection" ) { RDF_ParseTypeCollectionPropertyElement ( xmpParent, xmlNode, isTopLevel ); } else { RDF_ParseTypeOtherPropertyElement ( xmpParent, xmlNode, isTopLevel ); } } else { // Only rdf:ID and xml:lang, could be a resourcePropertyElt, a literalPropertyElt, or an. // emptyPropertyElt. Look at the child XML nodes to decide which. if ( xmlNode.content.empty() ) { RDF_EmptyPropertyElement ( xmpParent, xmlNode, isTopLevel ); } else { XML_cNodePos currChild = xmlNode.content.begin(); XML_cNodePos endChild = xmlNode.content.end(); for ( ; currChild != endChild; ++currChild ) { if ( (*currChild)->kind != kCDataNode ) break; } if ( currChild == endChild ) { RDF_LiteralPropertyElement ( xmpParent, xmlNode, isTopLevel ); } else { RDF_ResourcePropertyElement ( xmpParent, xmlNode, isTopLevel ); } } } } } // RDF_PropertyElement // ================================================================================================= // RDF_ResourcePropertyElement // =========================== // // 7.2.15 resourcePropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr? ) ) // ws* nodeElement ws* // end-element() // // This handles structs using an rdf:Description node, arrays using rdf:Bag/Seq/Alt, and typedNodes. // It also catches and cleans up qualified properties written with rdf:Description and rdf:value. static void RDF_ResourcePropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ) { if ( isTopLevel && (xmlNode.name == "iX:changes") ) return; // Strip old "punchcard" chaff. XMP_Node * newCompound = AddChildNode ( xmpParent, xmlNode, "", isTopLevel ); XML_cNodePos currAttr = xmlNode.attrs.begin(); XML_cNodePos endAttr = xmlNode.attrs.end(); for ( ; currAttr != endAttr; ++currAttr ) { XMP_VarString & attrName = (*currAttr)->name; if ( attrName == "xml:lang" ) { AddQualifierNode ( newCompound, **currAttr ); } else if ( attrName == "rdf:ID" ) { continue; // Ignore all rdf:ID attributes. } else { XMP_Throw ( "Invalid attribute for resource property element", kXMPErr_BadRDF ); } } XML_cNodePos currChild = xmlNode.content.begin(); XML_cNodePos endChild = xmlNode.content.end(); for ( ; currChild != endChild; ++currChild ) { if ( ! (*currChild)->IsWhitespaceNode() ) break; } if ( currChild == endChild ) XMP_Throw ( "Missing child of resource property element", kXMPErr_BadRDF ); if ( (*currChild)->kind != kElemNode ) XMP_Throw ( "Children of resource property element must be XML elements", kXMPErr_BadRDF ); if ( (*currChild)->name == "rdf:Bag" ) { newCompound->options |= kXMP_PropValueIsArray; } else if ( (*currChild)->name == "rdf:Seq" ) { newCompound->options |= kXMP_PropValueIsArray | kXMP_PropArrayIsOrdered; } else if ( (*currChild)->name == "rdf:Alt" ) { newCompound->options |= kXMP_PropValueIsArray | kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate; } else { newCompound->options |= kXMP_PropValueIsStruct; if ( (*currChild)->name != "rdf:Description" ) { XMP_VarString typeName ( (*currChild)->ns ); size_t colonPos = (*currChild)->name.find_first_of(':'); if ( colonPos == XMP_VarString::npos ) XMP_Throw ( "All XML elements must be in a namespace", kXMPErr_BadXMP ); typeName.append ( (*currChild)->name, colonPos, XMP_VarString::npos ); AddQualifierNode ( newCompound, XMP_VarString("rdf:type"), typeName ); } } RDF_NodeElement ( newCompound, **currChild, kNotTopLevel ); if ( newCompound->options & kRDF_HasValueElem ) { FixupQualifiedNode ( newCompound ); } else if ( newCompound->options & kXMP_PropArrayIsAlternate ) { DetectAltText ( newCompound ); } for ( ++currChild; currChild != endChild; ++currChild ) { if ( ! (*currChild)->IsWhitespaceNode() ) XMP_Throw ( "Invalid child of resource property element", kXMPErr_BadRDF ); } } // RDF_ResourcePropertyElement // ================================================================================================= // RDF_LiteralPropertyElement // ========================== // // 7.2.16 literalPropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, datatypeAttr?) ) // text() // end-element() // // Add a leaf node with the text value and qualifiers for the attributes. static void RDF_LiteralPropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ) { XMP_Node * newChild = AddChildNode ( xmpParent, xmlNode, "", isTopLevel ); XML_cNodePos currAttr = xmlNode.attrs.begin(); XML_cNodePos endAttr = xmlNode.attrs.end(); for ( ; currAttr != endAttr; ++currAttr ) { XMP_VarString & attrName = (*currAttr)->name; if ( attrName == "xml:lang" ) { AddQualifierNode ( newChild, **currAttr ); } else if ( (attrName == "rdf:ID") || (attrName == "rdf:datatype") ) { continue; // Ignore all rdf:ID and rdf:datatype attributes. } else { XMP_Throw ( "Invalid attribute for literal property element", kXMPErr_BadRDF ); } } XML_cNodePos currChild = xmlNode.content.begin(); XML_cNodePos endChild = xmlNode.content.end(); size_t textSize = 0; for ( ; currChild != endChild; ++currChild ) { if ( (*currChild)->kind != kCDataNode ) XMP_Throw ( "Invalid child of literal property element", kXMPErr_BadRDF ); textSize += (*currChild)->value.size(); } newChild->value.reserve ( textSize ); for ( currChild = xmlNode.content.begin(); currChild != endChild; ++currChild ) { newChild->value += (*currChild)->value; } #if 0 // *** XMP_DebugBuild newChild->_valuePtr = newChild->value.c_str(); #endif } // RDF_LiteralPropertyElement // ================================================================================================= // RDF_ParseTypeLiteralPropertyElement // =================================== // // 7.2.17 parseTypeLiteralPropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseLiteral ) ) // literal // end-element() static void RDF_ParseTypeLiteralPropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ) { IgnoreParam(xmpParent); IgnoreParam(xmlNode); IgnoreParam(isTopLevel); XMP_Throw ( "ParseTypeLiteral property element not allowed", kXMPErr_BadXMP ); } // RDF_ParseTypeLiteralPropertyElement // ================================================================================================= // RDF_ParseTypeResourcePropertyElement // ==================================== // // 7.2.18 parseTypeResourcePropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseResource ) ) // propertyEltList // end-element() // // Add a new struct node with a qualifier for the possible rdf:ID attribute. Then process the XML // child nodes to get the struct fields. static void RDF_ParseTypeResourcePropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ) { XMP_Node * newStruct = AddChildNode ( xmpParent, xmlNode, "", isTopLevel ); newStruct->options |= kXMP_PropValueIsStruct; XML_cNodePos currAttr = xmlNode.attrs.begin(); XML_cNodePos endAttr = xmlNode.attrs.end(); for ( ; currAttr != endAttr; ++currAttr ) { XMP_VarString & attrName = (*currAttr)->name; if ( attrName == "rdf:parseType" ) { continue; // ! The caller ensured the value is "Resource". } else if ( attrName == "xml:lang" ) { AddQualifierNode ( newStruct, **currAttr ); } else if ( attrName == "rdf:ID" ) { continue; // Ignore all rdf:ID attributes. } else { XMP_Throw ( "Invalid attribute for ParseTypeResource property element", kXMPErr_BadRDF ); } } RDF_PropertyElementList ( newStruct, xmlNode, kNotTopLevel ); if ( newStruct->options & kRDF_HasValueElem ) FixupQualifiedNode ( newStruct ); // *** Need to look for arrays using rdf:Description and rdf:type. } // RDF_ParseTypeResourcePropertyElement // ================================================================================================= // RDF_ParseTypeCollectionPropertyElement // ====================================== // // 7.2.19 parseTypeCollectionPropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseCollection ) ) // nodeElementList // end-element() static void RDF_ParseTypeCollectionPropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ) { IgnoreParam(xmpParent); IgnoreParam(xmlNode); IgnoreParam(isTopLevel); XMP_Throw ( "ParseTypeCollection property element not allowed", kXMPErr_BadXMP ); } // RDF_ParseTypeCollectionPropertyElement // ================================================================================================= // RDF_ParseTypeOtherPropertyElement // ================================= // // 7.2.20 parseTypeOtherPropertyElt // start-element ( URI == propertyElementURIs, attributes == set ( idAttr?, parseOther ) ) // propertyEltList // end-element() static void RDF_ParseTypeOtherPropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ) { IgnoreParam(xmpParent); IgnoreParam(xmlNode); IgnoreParam(isTopLevel); XMP_Throw ( "ParseTypeOther property element not allowed", kXMPErr_BadXMP ); } // RDF_ParseTypeOtherPropertyElement // ================================================================================================= // RDF_EmptyPropertyElement // ======================== // // 7.2.21 emptyPropertyElt // start-element ( URI == propertyElementURIs, // attributes == set ( idAttr?, ( resourceAttr | nodeIdAttr )?, propertyAttr* ) ) // end-element() // // // // // // // An emptyPropertyElt is an element with no contained content, just a possibly empty set of // attributes. An emptyPropertyElt can represent three special cases of simple XMP properties: a // simple property with an empty value (ns:Prop1), a simple property whose value is a URI // (ns:Prop2), or a simple property with simple qualifiers (ns:Prop3). An emptyPropertyElt can also // represent an XMP struct whose fields are all simple and unqualified (ns:Prop4). // // It is an error to use both rdf:value and rdf:resource - that can lead to invalid RDF in the // verbose form written using a literalPropertyElt. // // The XMP mapping for an emptyPropertyElt is a bit different from generic RDF, partly for // design reasons and partly for historical reasons. The XMP mapping rules are: // 1. If there is an rdf:value attribute then this is a simple property with a text value. // All other attributes are qualifiers. // 2. If there is an rdf:resource attribute then this is a simple property with a URI value. // All other attributes are qualifiers. // 3. If there are no attributes other than xml:lang, rdf:ID, or rdf:nodeID then this is a simple // property with an empty value. // 4. Otherwise this is a struct, the attributes other than xml:lang, rdf:ID, or rdf:nodeID are fields. static void RDF_EmptyPropertyElement ( XMP_Node * xmpParent, const XML_Node & xmlNode, bool isTopLevel ) { bool hasPropertyAttrs = false; bool hasResourceAttr = false; bool hasNodeIDAttr = false; bool hasValueAttr = false; const XML_Node * valueNode = 0; // ! Can come from rdf:value or rdf:resource. if ( ! xmlNode.content.empty() ) XMP_Throw ( "Nested content not allowed with rdf:resource or property attributes", kXMPErr_BadRDF ); // First figure out what XMP this maps to and remember the XML node for a simple value. XML_cNodePos currAttr = xmlNode.attrs.begin(); XML_cNodePos endAttr = xmlNode.attrs.end(); for ( ; currAttr != endAttr; ++currAttr ) { RDFTermKind attrTerm = GetRDFTermKind ( (*currAttr)->name ); switch ( attrTerm ) { case kRDFTerm_ID : // Nothing to do. break; case kRDFTerm_resource : if ( hasNodeIDAttr ) XMP_Throw ( "Empty property element can't have both rdf:resource and rdf:nodeID", kXMPErr_BadRDF ); if ( hasValueAttr ) XMP_Throw ( "Empty property element can't have both rdf:value and rdf:resource", kXMPErr_BadXMP ); hasResourceAttr = true; if ( ! hasValueAttr ) valueNode = *currAttr; break; case kRDFTerm_nodeID : if ( hasResourceAttr ) XMP_Throw ( "Empty property element can't have both rdf:resource and rdf:nodeID", kXMPErr_BadRDF ); hasNodeIDAttr = true; break; case kRDFTerm_Other : if ( (*currAttr)->name == "rdf:value" ) { if ( hasResourceAttr ) XMP_Throw ( "Empty property element can't have both rdf:value and rdf:resource", kXMPErr_BadXMP ); hasValueAttr = true; valueNode = *currAttr; } else if ( (*currAttr)->name != "xml:lang" ) { hasPropertyAttrs = true; } break; default : XMP_Throw ( "Unrecognized attribute of empty property element", kXMPErr_BadRDF ); break; } } // Create the right kind of child node and visit the attributes again to add the fields or qualifiers. // ! Because of implementation vagaries, the xmpParent is the tree root for top level properties. // ! The schema is found, created if necessary, by AddChildNode. XMP_Node * childNode = AddChildNode ( xmpParent, xmlNode, "", isTopLevel ); bool childIsStruct = false; if ( hasValueAttr | hasResourceAttr ) { childNode->value = valueNode->value; if ( ! hasValueAttr ) childNode->options |= kXMP_PropValueIsURI; // ! Might have both rdf:value and rdf:resource. } else if ( hasPropertyAttrs ) { childNode->options |= kXMP_PropValueIsStruct; childIsStruct = true; } currAttr = xmlNode.attrs.begin(); endAttr = xmlNode.attrs.end(); for ( ; currAttr != endAttr; ++currAttr ) { if ( *currAttr == valueNode ) continue; // Skip the rdf:value or rdf:resource attribute holding the value. RDFTermKind attrTerm = GetRDFTermKind ( (*currAttr)->name ); switch ( attrTerm ) { case kRDFTerm_ID : case kRDFTerm_nodeID : break; // Ignore all rdf:ID and rdf:nodeID attributes.w case kRDFTerm_resource : AddQualifierNode ( childNode, **currAttr ); break; case kRDFTerm_Other : if ( (! childIsStruct) || (*currAttr)->name == "xml:lang" ) { AddQualifierNode ( childNode, **currAttr ); } else { AddChildNode ( childNode, **currAttr, (*currAttr)->value.c_str(), false ); } break; default : XMP_Throw ( "Unrecognized attribute of empty property element", kXMPErr_BadRDF ); break; } } } // RDF_EmptyPropertyElement // ================================================================================================= exempi-2.2.1/source/XMPCore/XMPMeta.cpp0000664000175000017500000012610112150230672014461 00000000000000// ================================================================================================= // Copyright 2003 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // Adobe patent application tracking #P435, entitled 'Unique markers to simplify embedding data of // one format in a file with a different format', inventors: Sean Parent, Greg Gilley. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include! #include "XMPCore_Impl.hpp" #include #include "XMPMeta.hpp" #include "XMPIterator.hpp" #include "XMPUtils.hpp" #include "XMP_Version.h" #include "UnicodeInlines.incl_cpp" #include "UnicodeConversions.hpp" #include // For sort and stable_sort. #include // For snprintf. #if XMP_DebugBuild #include #endif using namespace std; #if XMP_WinBuild #pragma warning ( disable : 4533 ) // initialization of '...' is skipped by 'goto ...' #pragma warning ( disable : 4702 ) // unreachable code #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif // *** Use the XMP_PropIsXyz (Schema, Simple, Struct, Array, ...) macros // *** Add debug codegen checks, e.g. that typical masking operations really work // *** Change all uses of strcmp and strncmp to XMP_LitMatch and XMP_LitNMatch // ================================================================================================= // Local Types and Constants // ========================= // ================================================================================================= // Static Variables // ================ XMP_VarString * xdefaultName = 0; // Needed in XMPMeta-Parse.cpp, MoveExplicitAliases. // These are embedded version strings. const char * kXMPCore_EmbeddedVersion = kXMPCore_VersionMessage; const char * kXMPCore_EmbeddedCopyright = kXMPCoreName " " kXMP_CopyrightStr; // ================================================================================================= // Local Utilities // =============== // ------------------------------------------------------------------------------------------------- // DumpNodeOptions // --------------- static void DumpNodeOptions ( XMP_OptionBits options, XMP_TextOutputProc outProc, void * refCon ) { char buffer [32]; // Decimal of a 64 bit int is at most about 20 digits. static const char * optNames[] = { " schema", // 0x8000_0000 " ?30", " ?29", " -COMMAS-", " ?27", // 0x0800_0000 " ?26", " ?25", " ?24", " ?23", // 0x0080_0000 " isStale", " isDerived", " isStable", " ?19", // 0x0008_0000 " isInternal", " hasAliases", " isAlias", " -AFTER-", // 0x0000_8000 " -BEFORE-", " isCompact", " isLangAlt", " isAlt", // 0x0000_0800 " isOrdered", " isArray", " isStruct", " hasType", // 0x0000_0080 " hasLang", " isQual", " hasQual", " ?3", // 0x0000_0008 " ?2", " URI", " ?0" }; if ( options == 0 ) { OutProcNChars ( "(0x0)", 5 ); } else { OutProcNChars ( "(0x", 3 ); OutProcHexInt ( options ); OutProcNChars ( " :", 2 ); XMP_OptionBits mask = 0x80000000; for ( int b = 0; b < 32; ++b ) { if ( options & mask ) OutProcLiteral ( optNames[b] ); mask = mask >> 1; } OutProcNChars ( ")", 1 ); } } // DumpNodeOptions // ------------------------------------------------------------------------------------------------- // DumpPropertyTree // ---------------- // *** Extract the validation code into a separate routine to call on exit in debug builds. static void DumpPropertyTree ( const XMP_Node * currNode, int indent, size_t itemIndex, XMP_TextOutputProc outProc, void * refCon ) { char buffer [32]; // Decimal of a 64 bit int is at most about 20 digits. OutProcIndent ( (size_t)indent ); if ( itemIndex == 0 ) { if ( currNode->options & kXMP_PropIsQualifier ) OutProcNChars ( "? ", 2 ); DumpClearString ( currNode->name, outProc, refCon ); } else { OutProcNChars ( "[", 1 ); OutProcDecInt ( itemIndex ); OutProcNChars ( "]", 1 ); } if ( ! (currNode->options & kXMP_PropCompositeMask) ) { OutProcNChars ( " = \"", 4 ); DumpClearString ( currNode->value, outProc, refCon ); OutProcNChars ( "\"", 1 ); } if ( currNode->options != 0 ) { OutProcNChars ( " ", 2 ); DumpNodeOptions ( currNode->options, outProc, refCon ); } if ( currNode->options & kXMP_PropHasLang ) { if ( currNode->qualifiers.empty() || (currNode->qualifiers[0]->name != "xml:lang") ) { OutProcLiteral ( " ** bad lang flag **" ); } } // *** Check rdf:type also. if ( ! (currNode->options & kXMP_PropCompositeMask) ) { if ( ! currNode->children.empty() ) OutProcLiteral ( " ** bad children **" ); } else if ( currNode->options & kXMP_PropValueIsArray ) { if ( currNode->options & kXMP_PropValueIsStruct ) OutProcLiteral ( " ** bad comp flags **" ); } else if ( (currNode->options & kXMP_PropCompositeMask) != kXMP_PropValueIsStruct ) { OutProcLiteral ( " ** bad comp flags **" ); } #if 0 // *** XMP_DebugBuild if ( (currNode->_namePtr != currNode->name.c_str()) || (currNode->_valuePtr != currNode->value.c_str()) ) OutProcLiteral ( " ** bad debug string **" ); #endif OutProcNewline(); for ( size_t qualNum = 0, qualLim = currNode->qualifiers.size(); qualNum < qualLim; ++qualNum ) { const XMP_Node * currQual = currNode->qualifiers[qualNum]; if ( currQual->parent != currNode ) OutProcLiteral ( "** bad parent link => " ); if ( currQual->name == kXMP_ArrayItemName ) OutProcLiteral ( "** bad qual name => " ); if ( ! (currQual->options & kXMP_PropIsQualifier) ) OutProcLiteral ( "** bad qual flag => " ); if ( currQual->name == "xml:lang" ) { if ( (qualNum != 0) || (! (currNode->options & kXMP_PropHasLang)) ) OutProcLiteral ( "** bad lang qual => " ); } DumpPropertyTree ( currQual, indent+2, 0, outProc, refCon ); } for ( size_t childNum = 0, childLim = currNode->children.size(); childNum < childLim; ++childNum ) { const XMP_Node * currChild = currNode->children[childNum]; if ( currChild->parent != currNode ) OutProcLiteral ( "** bad parent link => " ); if ( currChild->options & kXMP_PropIsQualifier ) OutProcLiteral ( "** bad qual flag => " ); if ( currNode->options & kXMP_PropValueIsArray ) { itemIndex = childNum+1; if ( currChild->name != kXMP_ArrayItemName ) OutProcLiteral ( "** bad item name => " ); } else { itemIndex = 0; if ( currChild->name == kXMP_ArrayItemName ) OutProcLiteral ( "** bad field name => " ); } DumpPropertyTree ( currChild, indent+1, itemIndex, outProc, refCon ); } } // DumpPropertyTree // ------------------------------------------------------------------------------------------------- // DumpXMLTree // ----------- #if DumpXMLParseTree static inline void PutHexByte ( FILE * log, unsigned char ch ) { fprintf ( log, "\\x" ); if ( ch < 0x10 ) { fprintf ( log, "%c", kHexDigits[ch] ); } else { fprintf ( log, "%c%c", kHexDigits[ch>>4], kHexDigits[ch&0xF] ); } } // PutHexByte // ------------------------------------------------------------------------------------------------- static void PutClearString ( FILE * log, const std::string & str ) { for ( size_t i = 0; i != str.size(); ++i ) { unsigned char ch = str[i]; if ( (0x20 <= ch) && (ch <= 0x7F) ) { fprintf ( log, "%c", ch ); } else { PutHexByte ( log, ch ); } } } // PutClearString // ------------------------------------------------------------------------------------------------- static void DumpXMLTree ( FILE * log, const XML_Node & node, int indent ) { size_t i; #if 0 // *** XMP_DebugBuild if ( (node._namePtr != node.name.c_str()) || (node._valuePtr != node.value.c_str()) ) fprintf ( log, "*** bad debug string ***\n" ); #endif for ( i = 0; i != (size_t)indent; ++i ) fprintf ( log, " " ); switch ( node.kind ) { case kRootNode : fprintf ( log, "\nStart of XML tree dump\n\n" ); if ( (indent != 0) || (! node.attrs.empty()) || (! node.ns.empty()) || (! node.name.empty()) || (!node.value.empty()) ) fprintf ( log, " ** invalid root ** \n" ); for ( i = 0; i < node.children.size(); ++i ) { XMP_Uns8 kind = node.children[i]->kind; if ( (kind == kRootNode) || (kind == kAttrNode) ) fprintf ( log, " ** invalid child ** \n" ); DumpXMLTree ( log, *node.children[i], indent+1 ); } fprintf ( log, "\nEnd of XML tree dump\n" ); break; case kElemNode : fprintf ( log, "Elem %s", node.name.c_str() ); if ( indent == 0 ) fprintf ( log, " ** invalid elem ** " ); if ( ! node.ns.empty() ) fprintf ( log, " @ %s", node.ns.c_str() ); fprintf ( log, "\n" ); for ( i = 0; i < node.attrs.size(); ++i ) { XMP_Uns8 kind = node.attrs[i]->kind; if ( kind != kAttrNode ) fprintf ( log, " ** invalid attr ** \n" ); DumpXMLTree ( log, *node.attrs[i], indent+2 ); } for ( i = 0; i < node.children.size(); ++i ) { XMP_Uns8 kind = node.children[i]->kind; if ( (kind == kRootNode) || (kind == kAttrNode) ) fprintf ( log, " ** invalid child ** \n" ); DumpXMLTree ( log, *node.children[i], indent+1 ); } break; case kAttrNode : fprintf ( log, "Attr %s", node.name.c_str() ); if ( (indent == 0) || node.name.empty() || (! node.attrs.empty()) || (! node.children.empty()) ) fprintf ( log, " ** invalid attr ** " ); fprintf ( log, " = \"" ); PutClearString ( log, node.value ); fprintf ( log, "\"" ); if ( ! node.ns.empty() ) fprintf ( log, " @ %s", node.ns.c_str() ); fprintf ( log, "\n" ); break; case kCDataNode : if ( (indent == 0) || (! node.ns.empty()) || (! node.name.empty()) || (! node.attrs.empty()) || (! node.children.empty()) ) fprintf ( log, " ** invalid cdata ** \n" ); fprintf ( log, "\"" ); PutClearString ( log, node.value ); fprintf ( log, "\"\n" ); break; case kPINode : fprintf ( log, "PI %s", node.name.c_str() ); if ( (indent == 0) || node.name.empty() || (! node.children.empty()) ) fprintf ( log, " ** invalid pi ** \n" ); if ( ! node.value.empty() ) { fprintf ( log, " " ); } fprintf ( log, "\n" ); break; } } // DumpXMLTree #endif // DumpXMLParseTree // ------------------------------------------------------------------------------------------------- // CompareNodeNames // ---------------- // // Comparison routine for sorting XMP nodes by name. The name "xml:lang" is less than anything else, // and "rdf:type" is less than anything except "xml:lang". This preserves special rules for qualifiers. static bool CompareNodeNames ( XMP_Node * left, XMP_Node * right ) { if ( left->name == "xml:lang" ) return true; if ( right->name == "xml:lang" ) return false; if ( left->name == "rdf:type" ) return true; if ( right->name == "rdf:type" ) return false; return ( left->name < right->name ); } // CompareNodeNames // ------------------------------------------------------------------------------------------------- // CompareNodeValues // ----------------- // // Comparison routine for sorting XMP nodes by value. static bool CompareNodeValues ( XMP_Node * left, XMP_Node * right ) { if ( XMP_PropIsSimple ( left->options ) && XMP_PropIsSimple ( right->options ) ) { return ( left->value < right->value ); } XMP_OptionBits leftForm = left->options & kXMP_PropCompositeMask; XMP_OptionBits rightForm = right->options & kXMP_PropCompositeMask; return ( leftForm < rightForm ); } // CompareNodeValues // ------------------------------------------------------------------------------------------------- // CompareNodeLangs // ---------------- // // Comparison routine for sorting XMP nodes by xml:lang qualifier. An "x-default" value is less than // any other language. static bool CompareNodeLangs ( XMP_Node * left, XMP_Node * right ) { if ( left->qualifiers.empty() || (left->qualifiers[0]->name != "xml:lang") ) return false; if ( right->qualifiers.empty() || (right->qualifiers[0]->name != "xml:lang") ) return false; if ( left->qualifiers[0]->value == "x-default" ) return true; if ( right->qualifiers[0]->value == "x-default" ) return false; return ( left->qualifiers[0]->value < right->qualifiers[0]->value ); } // CompareNodeLangs // ------------------------------------------------------------------------------------------------- // SortWithinOffspring // ------------------- // // Sort one level down, within the elements of a node vector. This sorts the qualifiers of each // node. If the node is a struct it sorts the fields by names. If the node is an unordered array it // sorts the elements by value. If the node is an AltText array it sorts the elements by language. static void SortWithinOffspring ( XMP_NodeOffspring & nodeVec ) { for ( size_t i = 0, limit = nodeVec.size(); i < limit; ++i ) { XMP_Node * currPos = nodeVec[i]; if ( ! currPos->qualifiers.empty() ) { sort ( currPos->qualifiers.begin(), currPos->qualifiers.end(), CompareNodeNames ); SortWithinOffspring ( currPos->qualifiers ); } if ( ! currPos->children.empty() ) { if ( XMP_PropIsStruct ( currPos->options ) || XMP_NodeIsSchema ( currPos->options ) ) { sort ( currPos->children.begin(), currPos->children.end(), CompareNodeNames ); } else if ( XMP_PropIsArray ( currPos->options ) ) { if ( XMP_ArrayIsUnordered ( currPos->options ) ) { stable_sort ( currPos->children.begin(), currPos->children.end(), CompareNodeValues ); } else if ( XMP_ArrayIsAltText ( currPos->options ) ) { sort ( currPos->children.begin(), currPos->children.end(), CompareNodeLangs ); } } SortWithinOffspring ( currPos->children ); } } } // SortWithinOffspring // ------------------------------------------------------------------------------------------------- // RegisterAlias // ------------- // // Allow 3 kinds of alias: // TopProp => TopProp // TopProp => TopArray[1] // TopProp => TopArray[@xml:lang='x-default'] // // A new alias can be made to something that is already aliased, as long as the net result is one of // the legitimate forms. The new alias can already have aliases to it, also as long as result of // adjusting all of the exiting aliases leaves them legal. // // ! The caller assumes all risk that new aliases do not invalidate existing XMPMeta objects. Any // ! conflicts will result in later references throwing bad XPath exceptions. static void RegisterAlias ( XMP_StringPtr aliasNS, XMP_StringPtr aliasProp, XMP_StringPtr actualNS, XMP_StringPtr actualProp, XMP_OptionBits arrayForm ) { XMP_ExpandedXPath expAlias, expActual; XMP_AliasMapPos mapPos; XMP_ExpandedXPath * regActual = 0; XMP_Assert ( (aliasNS != 0) && (aliasProp != 0) && (actualNS != 0) && (actualProp != 0) ); // Enforced by wrapper. // Expand the alias and actual names, make sure they are one of the basic 3 forms. When counting // the expanded XPath size remember that the schema URI is the first component. We don't have to // compare the schema URIs though, the (unique) prefix is part of the top property name. ExpandXPath ( aliasNS, aliasProp, &expAlias ); ExpandXPath ( actualNS, actualProp, &expActual ); if ( (expAlias.size() != 2) || (expActual.size() != 2) ) { XMP_Throw ( "Alias and actual property names must be simple", kXMPErr_BadXPath ); } arrayForm = VerifySetOptions ( arrayForm, 0 ); if ( arrayForm != 0 ) { if ( (arrayForm & ~kXMP_PropArrayFormMask) != 0 ) XMP_Throw ( "Only array form flags are allowed", kXMPErr_BadOptions ); expActual[1].options |= arrayForm; // Set the array form for the top level step. if ( ! (arrayForm & kXMP_PropArrayIsAltText) ) { expActual.push_back ( XPathStepInfo ( "[1]", kXMP_ArrayIndexStep ) ); } else { expActual.push_back ( XPathStepInfo ( "[?xml:lang=\"x-default\"]", kXMP_QualSelectorStep ) ); } } // See if there are any conflicts with existing aliases. A couple of the checks are easy. If the // alias is already aliased it is only OK to reregister an identical alias. If the actual is // already aliased to something else and the new chain is legal, just swap in the old base. mapPos = sRegisteredAliasMap->find ( expAlias[kRootPropStep].step ); if ( mapPos != sRegisteredAliasMap->end() ) { // This alias is already registered to something, make sure it is the same something. regActual = &mapPos->second; if ( arrayForm != (mapPos->second[1].options & kXMP_PropArrayFormMask) ) { XMP_Throw ( "Mismatch with existing alias array form", kXMPErr_BadParam ); } if ( expActual.size() != regActual->size() ) { XMP_Throw ( "Mismatch with existing actual path", kXMPErr_BadParam ); } if ( expActual[kRootPropStep].step != (*regActual)[kRootPropStep].step ) { XMP_Throw ( "Mismatch with existing actual name", kXMPErr_BadParam ); } if ( (expActual.size() == 3) && (expActual[kAliasIndexStep].step != (*regActual)[kAliasIndexStep].step) ) { XMP_Throw ( "Mismatch with existing actual array item", kXMPErr_BadParam ); } return; } mapPos = sRegisteredAliasMap->find ( expActual[kRootPropStep].step ); if ( mapPos != sRegisteredAliasMap->end() ) { // The actual is already aliased to something else. regActual = &mapPos->second; if ( expActual.size() == 2 ) { expActual = *regActual; // TopProp => TopProp => anything : substitute the entire old base. } else if ( regActual->size() != 2 ) { XMP_Throw ( "Can't alias an array item to an array item", kXMPErr_BadParam ); // TopProp => TopArray[] => TopArray[] : nope. } else { expActual[kSchemaStep].step = (*regActual)[kSchemaStep].step; // TopProp => TopArray[] => TopProp : expActual[kRootPropStep].step = (*regActual)[kRootPropStep].step; // substitute the old base name. } } // Checking for existing aliases to this one is touchier. This involves updating the alias map, // which must not be done unless all of the changes are legal. So we need 2 loops, one to verify // that everything is OK, and one to make the changes. The bad case is: // TopProp => TopArray[] => TopArray[] // In the valid cases we back substitute the new base. for ( mapPos = sRegisteredAliasMap->begin(); mapPos != sRegisteredAliasMap->end(); ++mapPos ) { regActual = &mapPos->second; if ( expAlias[kRootPropStep].step == (*regActual)[kRootPropStep].step ) { if ( (regActual->size() == 2) && (expAlias.size() == 2) ) { XMP_Throw ( "Can't alias an array item to an array item", kXMPErr_BadParam ); } } } for ( mapPos = sRegisteredAliasMap->begin(); mapPos != sRegisteredAliasMap->end(); ++mapPos ) { regActual = &mapPos->second; if ( expAlias[kRootPropStep].step == (*regActual)[kRootPropStep].step ) { if ( regActual->size() == 1 ) { *regActual = expActual; // TopProp => TopProp => anything : substitute the entire new base. } else { (*regActual)[kSchemaStep].step = expActual[kSchemaStep].step; // TopProp => TopArray[] => TopProp : (*regActual)[kRootPropStep].step = expActual[kRootPropStep].step; // substitute the new base name. } } } // Finally, all is OK to register the new alias. (void) sRegisteredAliasMap->insert ( XMP_AliasMap::value_type ( expAlias[kRootPropStep].step, expActual ) ); } // RegisterAlias // ------------------------------------------------------------------------------------------------- // RegisterStandardAliases // ----------------------- static void RegisterStandardAliases() { // Aliases from XMP to DC. RegisterAlias ( kXMP_NS_XMP, "Author", kXMP_NS_DC, "creator", kXMP_PropArrayIsOrdered ); RegisterAlias ( kXMP_NS_XMP, "Authors", kXMP_NS_DC, "creator", 0 ); RegisterAlias ( kXMP_NS_XMP, "Description", kXMP_NS_DC, "description", 0 ); RegisterAlias ( kXMP_NS_XMP, "Format", kXMP_NS_DC, "format", 0 ); RegisterAlias ( kXMP_NS_XMP, "Keywords", kXMP_NS_DC, "subject", 0 ); RegisterAlias ( kXMP_NS_XMP, "Locale", kXMP_NS_DC, "language", 0 ); RegisterAlias ( kXMP_NS_XMP, "Title", kXMP_NS_DC, "title", 0 ); RegisterAlias ( kXMP_NS_XMP_Rights, "Copyright", kXMP_NS_DC, "rights", 0 ); // Aliases from PDF to DC and XMP. RegisterAlias ( kXMP_NS_PDF, "Author", kXMP_NS_DC, "creator", kXMP_PropArrayIsOrdered ); RegisterAlias ( kXMP_NS_PDF, "BaseURL", kXMP_NS_XMP, "BaseURL", 0 ); RegisterAlias ( kXMP_NS_PDF, "CreationDate", kXMP_NS_XMP, "CreateDate", 0 ); RegisterAlias ( kXMP_NS_PDF, "Creator", kXMP_NS_XMP, "CreatorTool", 0 ); RegisterAlias ( kXMP_NS_PDF, "ModDate", kXMP_NS_XMP, "ModifyDate", 0 ); RegisterAlias ( kXMP_NS_PDF, "Subject", kXMP_NS_DC, "description", kXMP_PropArrayIsAltText ); RegisterAlias ( kXMP_NS_PDF, "Title", kXMP_NS_DC, "title", kXMP_PropArrayIsAltText ); // Aliases from Photoshop to DC and XMP. RegisterAlias ( kXMP_NS_Photoshop, "Author", kXMP_NS_DC, "creator", kXMP_PropArrayIsOrdered ); RegisterAlias ( kXMP_NS_Photoshop, "Caption", kXMP_NS_DC, "description", kXMP_PropArrayIsAltText ); RegisterAlias ( kXMP_NS_Photoshop, "Copyright", kXMP_NS_DC, "rights", kXMP_PropArrayIsAltText ); RegisterAlias ( kXMP_NS_Photoshop, "Keywords", kXMP_NS_DC, "subject", 0 ); RegisterAlias ( kXMP_NS_Photoshop, "Marked", kXMP_NS_XMP_Rights, "Marked", 0 ); RegisterAlias ( kXMP_NS_Photoshop, "Title", kXMP_NS_DC, "title", kXMP_PropArrayIsAltText ); RegisterAlias ( kXMP_NS_Photoshop, "WebStatement", kXMP_NS_XMP_Rights, "WebStatement", 0 ); // Aliases from TIFF and EXIF to DC and XMP. RegisterAlias ( kXMP_NS_TIFF, "Artist", kXMP_NS_DC, "creator", kXMP_PropArrayIsOrdered); RegisterAlias ( kXMP_NS_TIFF, "Copyright", kXMP_NS_DC, "rights", 0 ); RegisterAlias ( kXMP_NS_TIFF, "DateTime", kXMP_NS_XMP, "ModifyDate", 0 ); RegisterAlias ( kXMP_NS_EXIF, "DateTimeDigitized", kXMP_NS_XMP, "CreateDate", 0 ); RegisterAlias ( kXMP_NS_TIFF, "ImageDescription", kXMP_NS_DC, "description", 0 ); RegisterAlias ( kXMP_NS_TIFF, "Software", kXMP_NS_XMP, "CreatorTool", 0 ); // Aliases from PNG to DC and XMP. RegisterAlias ( kXMP_NS_PNG, "Author", kXMP_NS_DC, "creator", kXMP_PropArrayIsOrdered); RegisterAlias ( kXMP_NS_PNG, "Copyright", kXMP_NS_DC, "rights", kXMP_PropArrayIsAltText); RegisterAlias ( kXMP_NS_PNG, "CreationTime", kXMP_NS_XMP, "CreateDate", 0 ); RegisterAlias ( kXMP_NS_PNG, "Description", kXMP_NS_DC, "description", kXMP_PropArrayIsAltText); RegisterAlias ( kXMP_NS_PNG, "ModificationTime", kXMP_NS_XMP, "ModifyDate", 0 ); RegisterAlias ( kXMP_NS_PNG, "Software", kXMP_NS_XMP, "CreatorTool", 0 ); RegisterAlias ( kXMP_NS_PNG, "Title", kXMP_NS_DC, "title", kXMP_PropArrayIsAltText); } // RegisterStandardAliases // ================================================================================================= // Constructors // ============ XMPMeta::XMPMeta() : clientRefs(0), prevTkVer(0), tree(XMP_Node(0,"",0)), xmlParser(0) { // Nothing more to do, clientRefs is incremented in wrapper. #if XMP_TraceCTorDTor printf ( "Default construct XMPMeta @ %.8X\n", this ); #endif } // XMPMeta // ------------------------------------------------------------------------------------------------- XMPMeta::~XMPMeta() RELEASE_NO_THROW { #if XMP_TraceCTorDTor printf ( "Destruct XMPMeta @ %.8X\n", this ); #endif XMP_Assert ( this->clientRefs <= 0 ); if ( xmlParser != 0 ) delete ( xmlParser ); xmlParser = 0; } // ~XMPMeta // ================================================================================================= // Class Static Functions // ====================== // // // ================================================================================================= // ------------------------------------------------------------------------------------------------- // GetVersionInfo // -------------- /* class-static */ void XMPMeta::GetVersionInfo ( XMP_VersionInfo * info ) { memset ( info, 0, sizeof(*info) ); // AUDIT: Safe, using sizeof the destination. XMP_Assert ( sizeof(*info) == sizeof(XMP_VersionInfo) ); info->major = XMP_API_VERSION_MAJOR; info->minor = XMP_API_VERSION_MINOR; info->micro = XMP_API_VERSION_MICRO; info->isDebug = kXMPCore_DebugFlag; info->flags = 0; // ! None defined yet. info->message = kXMPCore_VersionMessage; } // GetVersionInfo // ------------------------------------------------------------------------------------------------- // Initialize // ---------- #if XMP_TraceCoreCalls FILE * xmpCoreLog = stderr; #endif #if UseGlobalLibraryLock XMP_BasicMutex sLibraryLock; #endif /* class-static */ bool XMPMeta::Initialize() { // Allocate and initialize static objects. ++sXMP_InitCount; if ( sXMP_InitCount > 1 ) return true; #if XMP_TraceCoreCallsToFile xmpCoreLog = fopen ( "XMPCoreLog.txt", "w" ); if ( xmpCoreLog == 0 ) xmpCoreLog = stderr; #endif #if UseGlobalLibraryLock InitializeBasicMutex ( sLibraryLock ); #endif if ( ! Initialize_LibUtils() ) return false; xdefaultName = new XMP_VarString ( "x-default" ); sRegisteredNamespaces = new XMP_NamespaceTable; sRegisteredAliasMap = new XMP_AliasMap; InitializeUnicodeConversions(); // Register standard namespaces and aliases. XMP_StringPtr voidPtr; XMP_StringLen voidLen; (void) RegisterNamespace ( kXMP_NS_XML, "xml", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_RDF, "rdf", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_DC, "dc", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP, "xmp", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_PDF, "pdf", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_Photoshop, "photoshop", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_PSAlbum, "album", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_EXIF, "exif", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_EXIF_Aux, "aux", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_TIFF, "tiff", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_PNG, "png", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_JPEG, "jpeg", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_JP2K, "jp2k", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_CameraRaw, "crs", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_ASF, "asf", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_WAV, "wav", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_AdobeStockPhoto, "bmsp", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_CreatorAtom, "creatorAtom", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_Rights, "xmpRights", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_MM, "xmpMM", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_BJ, "xmpBJ", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_Note, "xmpNote", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_DM, "xmpDM", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_Script, "xmpScript", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_BWF, "bext", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_Text, "xmpT", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_PagedFile, "xmpTPg", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_Graphics, "xmpG", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_Image, "xmpGImg", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_Font, "stFnt", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_Dimensions, "stDim", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_ResourceEvent, "stEvt", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_ResourceRef, "stRef", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_ST_Version, "stVer", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_ST_Job, "stJob", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_ManifestItem, "stMfs", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_XMP_IdentifierQual, "xmpidq", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_IPTCCore, "Iptc4xmpCore", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_DICOM, "DICOM", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_PDFA_Schema, "pdfaSchema", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_PDFA_Property, "pdfaProperty", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_PDFA_Type, "pdfaType", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_PDFA_Field, "pdfaField", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_PDFA_ID, "pdfaid", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_PDFA_Extension, "pdfaExtension", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_PDFX, "pdfx", &voidPtr, &voidLen ); (void) RegisterNamespace ( kXMP_NS_PDFX_ID, "pdfxid", &voidPtr, &voidLen ); (void) RegisterNamespace ( "adobe:ns:meta/", "x", &voidPtr, &voidLen ); (void) RegisterNamespace ( "http://ns.adobe.com/iX/1.0/", "iX", &voidPtr, &voidLen ); RegisterStandardAliases(); // Initialize the other core classes. if ( ! XMPIterator::Initialize() ) XMP_Throw ( "Failure from XMPIterator::Initialize", kXMPErr_InternalFailure ); if ( ! XMPUtils::Initialize() ) XMP_Throw ( "Failure from XMPUtils::Initialize", kXMPErr_InternalFailure ); // Do miscelaneous semantic checks of types and arithmetic. XMP_Assert ( sizeof(XMP_Int8) == 1 ); XMP_Assert ( sizeof(XMP_Int16) == 2 ); XMP_Assert ( sizeof(XMP_Int32) == 4 ); XMP_Assert ( sizeof(XMP_Int64) == 8 ); XMP_Assert ( sizeof(XMP_Uns8) == 1 ); XMP_Assert ( sizeof(XMP_Uns16) == 2 ); XMP_Assert ( sizeof(XMP_Uns32) == 4 ); XMP_Assert ( sizeof(XMP_Uns64) == 8 ); XMP_Assert ( sizeof(XMP_OptionBits) == 4 ); // Check that option masking work on all 32 bits. XMP_OptionBits flag = (XMP_OptionBits) (~0UL); XMP_Assert ( flag == (XMP_OptionBits)(-1L) ); XMP_Assert ( (flag ^ kXMP_PropHasLang) == 0xFFFFFFBFUL ); XMP_Assert ( (flag & ~kXMP_PropHasLang) == 0xFFFFFFBFUL ); XMP_OptionBits opt1 = 0; // Check the general option bit macros. XMP_OptionBits opt2 = (XMP_OptionBits)~0UL; XMP_SetOption ( opt1, kXMP_PropValueIsArray ); XMP_ClearOption ( opt2, kXMP_PropValueIsArray ); XMP_Assert ( opt1 == ~opt2 ); XMP_Assert ( XMP_TestOption ( opt1, kXMP_PropValueIsArray ) ); XMP_Assert ( ! XMP_TestOption ( opt2, kXMP_PropValueIsArray ) ); XMP_Assert ( XMP_PropIsSimple ( ~kXMP_PropCompositeMask ) ); // Check the special option bit macros. XMP_Assert ( ! XMP_PropIsSimple ( kXMP_PropValueIsStruct ) ); XMP_Assert ( ! XMP_PropIsSimple ( kXMP_PropValueIsArray ) ); XMP_Assert ( XMP_PropIsStruct ( kXMP_PropValueIsStruct ) ); XMP_Assert ( XMP_PropIsArray ( kXMP_PropValueIsArray ) ); XMP_Assert ( ! XMP_PropIsStruct ( ~kXMP_PropValueIsStruct ) ); XMP_Assert ( ! XMP_PropIsArray ( ~kXMP_PropValueIsArray ) ); XMP_Assert ( XMP_ArrayIsUnordered ( ~kXMP_PropArrayIsOrdered ) ); XMP_Assert ( XMP_ArrayIsOrdered ( kXMP_PropArrayIsOrdered ) ); XMP_Assert ( XMP_ArrayIsAlternate ( kXMP_PropArrayIsAlternate ) ); XMP_Assert ( XMP_ArrayIsAltText ( kXMP_PropArrayIsAltText ) ); XMP_Assert ( ! XMP_ArrayIsUnordered ( kXMP_PropArrayIsOrdered ) ); XMP_Assert ( ! XMP_ArrayIsOrdered ( ~kXMP_PropArrayIsOrdered ) ); XMP_Assert ( ! XMP_ArrayIsAlternate ( ~kXMP_PropArrayIsAlternate ) ); XMP_Assert ( ! XMP_ArrayIsAltText ( ~kXMP_PropArrayIsAltText ) ); XMP_Assert ( XMP_PropHasQualifiers ( kXMP_PropHasQualifiers ) ); XMP_Assert ( XMP_PropIsQualifier ( kXMP_PropIsQualifier ) ); XMP_Assert ( XMP_PropHasLang ( kXMP_PropHasLang ) ); XMP_Assert ( ! XMP_PropHasQualifiers ( ~kXMP_PropHasQualifiers ) ); XMP_Assert ( ! XMP_PropIsQualifier ( ~kXMP_PropIsQualifier ) ); XMP_Assert ( ! XMP_PropHasLang ( ~kXMP_PropHasLang ) ); XMP_Assert ( XMP_NodeIsSchema ( kXMP_SchemaNode ) ); XMP_Assert ( XMP_PropIsAlias ( kXMP_PropIsAlias ) ); XMP_Assert ( ! XMP_NodeIsSchema ( ~kXMP_SchemaNode ) ); XMP_Assert ( ! XMP_PropIsAlias ( ~kXMP_PropIsAlias ) ); #if 0 // Generally off, enable to hand check generated code. extern XMP_OptionBits opt3, opt4; if ( XMP_TestOption ( opt3, kXMP_PropValueIsArray ) ) opt4 = opt3; if ( ! XMP_TestOption ( opt3, kXMP_PropValueIsStruct ) ) opt4 = opt3; static bool ok1 = XMP_TestOption ( opt4, kXMP_PropValueIsArray ); static bool ok2 = ! XMP_TestOption ( opt4, kXMP_PropValueIsStruct ); #endif // Make sure the embedded info strings are referenced and kept. if ( (kXMPCore_EmbeddedVersion[0] == 0) || (kXMPCore_EmbeddedCopyright[0] == 0) ) return false; return true; } // Initialize // ------------------------------------------------------------------------------------------------- // Terminate // --------- /* class-static */ void XMPMeta::Terminate() RELEASE_NO_THROW { --sXMP_InitCount; if ( sXMP_InitCount != 0 ) return; // Not ready to terminate, or already terminated. XMPIterator::Terminate(); XMPUtils::Terminate(); EliminateGlobal ( sRegisteredNamespaces ); EliminateGlobal ( sRegisteredAliasMap ); EliminateGlobal ( xdefaultName ); Terminate_LibUtils(); #if UseGlobalLibraryLock TerminateBasicMutex ( sLibraryLock ); #endif #if XMP_TraceCoreCallsToFile if ( xmpCoreLog != stderr ) fclose ( xmpCoreLog ); xmpCoreLog = stderr; #endif } // Terminate // ------------------------------------------------------------------------------------------------- // DumpNamespaces // -------------- // // Dump the prefix to URI map (easier to read) and verify that both are consistent and legit. // *** Should put checks in a separate routine for regular calling in debug builds. /* class-static */ XMP_Status XMPMeta::DumpNamespaces ( XMP_TextOutputProc outProc, void * refCon ) { sRegisteredNamespaces->Dump ( outProc, refCon ); return 0; } // DumpNamespaces // ------------------------------------------------------------------------------------------------- // GetGlobalOptions // ---------------- /* class-static */ XMP_OptionBits XMPMeta::GetGlobalOptions() { XMP_OptionBits options = 0; return options; } // GetGlobalOptions // ------------------------------------------------------------------------------------------------- // SetGlobalOptions // ---------------- /* class-static */ void XMPMeta::SetGlobalOptions ( XMP_OptionBits options ) { XMP_Throw ( "Unimplemented method XMPMeta::SetGlobalOptions", kXMPErr_Unimplemented ); void * p; p = &options; // Avoid unused param warnings. } // SetGlobalOptions // ------------------------------------------------------------------------------------------------- // RegisterNamespace // ----------------- /* class-static */ bool XMPMeta::RegisterNamespace ( XMP_StringPtr namespaceURI, XMP_StringPtr suggestedPrefix, XMP_StringPtr * registeredPrefix, XMP_StringLen * prefixSize ) { return sRegisteredNamespaces->Define ( namespaceURI, suggestedPrefix, registeredPrefix, prefixSize ); } // RegisterNamespace // ------------------------------------------------------------------------------------------------- // GetNamespacePrefix // ------------------ /* class-static */ bool XMPMeta::GetNamespacePrefix ( XMP_StringPtr namespaceURI, XMP_StringPtr * namespacePrefix, XMP_StringLen * prefixSize ) { return sRegisteredNamespaces->GetPrefix ( namespaceURI, namespacePrefix, prefixSize ); } // GetNamespacePrefix // ------------------------------------------------------------------------------------------------- // GetNamespaceURI // --------------- /* class-static */ bool XMPMeta::GetNamespaceURI ( XMP_StringPtr namespacePrefix, XMP_StringPtr * namespaceURI, XMP_StringLen * uriSize ) { return sRegisteredNamespaces->GetURI ( namespacePrefix, namespaceURI, uriSize ); } // GetNamespaceURI // ------------------------------------------------------------------------------------------------- // DeleteNamespace // --------------- // *** Don't allow standard namespaces to be deleted. // *** We would be better off not having this. Instead, have local namespaces from parsing be // *** restricted to the object that introduced them. /* class-static */ void XMPMeta::DeleteNamespace ( XMP_StringPtr namespaceURI ) { XMP_Throw ( "Unimplemented method XMPMeta::DeleteNamespace", kXMPErr_Unimplemented ); } // DeleteNamespace // ================================================================================================= // Class Methods // ============= // // // ================================================================================================= // ------------------------------------------------------------------------------------------------- // DumpObject // ---------- void XMPMeta::DumpObject ( XMP_TextOutputProc outProc, void * refCon ) const { XMP_Assert ( outProc != 0 ); // ! Enforced by wrapper. OutProcLiteral ( "Dumping XMPMeta object \"" ); DumpClearString ( tree.name, outProc, refCon ); OutProcNChars ( "\" ", 3 ); DumpNodeOptions ( tree.options, outProc, refCon ); #if 0 // *** XMP_DebugBuild if ( (tree._namePtr != tree.name.c_str()) || (tree._valuePtr != tree.value.c_str()) ) OutProcLiteral ( " ** bad debug string **" ); #endif OutProcNewline(); if ( ! tree.value.empty() ) { OutProcLiteral ( "** bad root value ** \"" ); DumpClearString ( tree.value, outProc, refCon ); OutProcNChars ( "\"", 1 ); OutProcNewline(); } if ( ! tree.qualifiers.empty() ) { OutProcLiteral ( "** bad root qualifiers **" ); OutProcNewline(); for ( size_t qualNum = 0, qualLim = tree.qualifiers.size(); qualNum < qualLim; ++qualNum ) { DumpPropertyTree ( tree.qualifiers[qualNum], 3, 0, outProc, refCon ); } } if ( ! tree.children.empty() ) { for ( size_t childNum = 0, childLim = tree.children.size(); childNum < childLim; ++childNum ) { const XMP_Node * currSchema = tree.children[childNum]; OutProcNewline(); OutProcIndent ( 1 ); DumpClearString ( currSchema->value, outProc, refCon ); OutProcNChars ( " ", 2 ); DumpClearString ( currSchema->name, outProc, refCon ); OutProcNChars ( " ", 2 ); DumpNodeOptions ( currSchema->options, outProc, refCon ); #if 0 // *** XMP_DebugBuild if ( (currSchema->_namePtr != currSchema->name.c_str()) || (currSchema->_valuePtr != currSchema->value.c_str()) ) OutProcLiteral ( " ** bad debug string **" ); #endif OutProcNewline(); if ( ! (currSchema->options & kXMP_SchemaNode) ) { OutProcLiteral ( "** bad schema options **" ); OutProcNewline(); } if ( ! currSchema->qualifiers.empty() ) { OutProcLiteral ( "** bad schema qualifiers **" ); OutProcNewline(); for ( size_t qualNum = 0, qualLim = currSchema->qualifiers.size(); qualNum < qualLim; ++qualNum ) { DumpPropertyTree ( currSchema->qualifiers[qualNum], 3, 0, outProc, refCon ); } } for ( size_t childNum = 0, childLim = currSchema->children.size(); childNum < childLim; ++childNum ) { DumpPropertyTree ( currSchema->children[childNum], 2, 0, outProc, refCon ); } } } } // DumpObject // ------------------------------------------------------------------------------------------------- // CountArrayItems // --------------- XMP_Index XMPMeta::CountArrayItems ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName ) const { XMP_Assert ( (schemaNS != 0) && (arrayName != 0) ); // Enforced by wrapper. XMP_ExpandedXPath expPath; ExpandXPath ( schemaNS, arrayName, &expPath ); const XMP_Node * arrayNode = FindConstNode ( &tree, expPath ); if ( arrayNode == 0 ) return 0; if ( ! (arrayNode->options & kXMP_PropValueIsArray) ) XMP_Throw ( "The named property is not an array", kXMPErr_BadXPath ); return arrayNode->children.size(); } // CountArrayItems // ------------------------------------------------------------------------------------------------- // GetObjectName // ------------- void XMPMeta::GetObjectName ( XMP_StringPtr * namePtr, XMP_StringLen * nameLen ) const { *namePtr = tree.name.c_str(); *nameLen = tree.name.size(); } // GetObjectName // ------------------------------------------------------------------------------------------------- // SetObjectName // ------------- void XMPMeta::SetObjectName ( XMP_StringPtr name ) { VerifyUTF8 ( name ); // Throws if the string is not legit UTF-8. tree.name = name; } // SetObjectName // ------------------------------------------------------------------------------------------------- // GetObjectOptions // ---------------- XMP_OptionBits XMPMeta::GetObjectOptions() const { XMP_OptionBits options = 0; return options; } // GetObjectOptions // ------------------------------------------------------------------------------------------------- // SetObjectOptions // ---------------- void XMPMeta::SetObjectOptions ( XMP_OptionBits options ) { XMP_Throw ( "Unimplemented method XMPMeta::SetObjectOptions", kXMPErr_Unimplemented ); void * p; p = &options; // Avoid unused param warnings. } // SetObjectOptions // ------------------------------------------------------------------------------------------------- // Sort // ---- // // At the top level the namespaces are sorted by their prefixes. Within a namespace, the top level // properties are sorted by name. Within a struct, the fields are sorted by their qualified name, // i.e. their XML prefix:local form. Unordered arrays of simple items are sorted by value. Language // Alternative arrays are sorted by the xml:lang qualifiers, with the "x-default" item placed first. void XMPMeta::Sort() { if ( ! this->tree.qualifiers.empty() ) { sort ( this->tree.qualifiers.begin(), this->tree.qualifiers.end(), CompareNodeNames ); SortWithinOffspring ( this->tree.qualifiers ); } if ( ! this->tree.children.empty() ) { // The schema prefixes are the node's value, the name is the URI, so we sort schemas by value. sort ( this->tree.children.begin(), this->tree.children.end(), CompareNodeValues ); SortWithinOffspring ( this->tree.children ); } } // Sort // ------------------------------------------------------------------------------------------------- // Erase // ----- // // Clear everything except for clientRefs. void XMPMeta::Erase() { this->prevTkVer = 0; if ( this->xmlParser != 0 ) { delete ( this->xmlParser ); this->xmlParser = 0; } this->tree.ClearNode(); } // Erase // ------------------------------------------------------------------------------------------------- // Clone // ----- void XMPMeta::Clone ( XMPMeta * clone, XMP_OptionBits options ) const { if ( clone == 0 ) XMP_Throw ( "Null clone pointer", kXMPErr_BadParam ); if ( options != 0 ) XMP_Throw ( "No options are defined yet", kXMPErr_BadOptions ); XMP_Assert ( this->tree.parent == 0 ); clone->tree.ClearNode(); clone->tree.options = this->tree.options; clone->tree.name = this->tree.name; clone->tree.value = this->tree.value; #if 0 // *** XMP_DebugBuild clone->tree._namePtr = clone->tree.name.c_str(); clone->tree._valuePtr = clone->tree.value.c_str(); #endif CloneOffspring ( &this->tree, &clone->tree ); } // Clone // ================================================================================================= exempi-2.2.1/source/XMPCore/XMPUtils-FileInfo.cpp0000664000175000017500000014607412150230672016377 00000000000000// ================================================================================================= // Copyright 2003 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include! #include "XMPCore_Impl.hpp" #include "XMPUtils.hpp" #include // For binary_search. #include #include #include #include #include #include // For snprintf. #if XMP_WinBuild #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #endif // ================================================================================================= // Local Types and Constants // ========================= typedef unsigned long UniCodePoint; enum UniCharKind { UCK_normal, UCK_space, UCK_comma, UCK_semicolon, UCK_quote, UCK_control }; typedef enum UniCharKind UniCharKind; #define UnsByte(c) ((unsigned char)(c)) #define UCP(u) ((UniCodePoint)(u)) // ! Needed on Windows (& PC Linux?) for inequalities with literals ito avoid sign extension. #ifndef TraceMultiFile #define TraceMultiFile 0 #endif // ================================================================================================= // Static Variables // ================ // ================================================================================================= // Local Utilities // =============== // ------------------------------------------------------------------------------------------------- // ClassifyCharacter // ----------------- static void ClassifyCharacter ( XMP_StringPtr fullString, size_t offset, UniCharKind * charKind, size_t * charSize, UniCodePoint * uniChar ) { *charKind = UCK_normal; // Assume typical case. unsigned char currByte = UnsByte ( fullString[offset] ); if ( currByte < UnsByte(0x80) ) { // ---------------------------------------- // We've got a single byte ASCII character. *charSize = 1; *uniChar = currByte; if ( currByte > UnsByte(0x22) ) { if ( currByte == UnsByte(0x2C) ) { *charKind = UCK_comma; } else if ( currByte == UnsByte(0x3B) ) { *charKind = UCK_semicolon; } else if ( (currByte == UnsByte(0x5B)) || (currByte == UnsByte(0x5D)) ) { *charKind = UCK_quote; // ! ASCII '[' and ']' are used as quotes in Chinese and Korean. } } else { // currByte <= 0x22 if ( currByte == UnsByte(0x22) ) { *charKind = UCK_quote; } else if ( currByte == UnsByte(0x21) ) { *charKind = UCK_normal; } else if ( currByte == UnsByte(0x20) ) { *charKind = UCK_space; } else { *charKind = UCK_control; } } } else { // currByte >= 0x80 // --------------------------------------------------------------------------------------- // We've got a multibyte Unicode character. The first byte has the number of bytes and the // highest order bits. The other bytes each add 6 more bits. Compose the UTF-32 form so we // can classify directly with the Unicode code points. Order the upperBits tests to be // fastest for Japan, probably the most common non-ASCII usage. *charSize = 0; *uniChar = currByte; while ( (*uniChar & 0x80) != 0 ) { // Count the leading 1 bits in the byte. ++(*charSize); *uniChar = *uniChar << 1; } XMP_Assert ( (offset + *charSize) <= strlen(fullString) ); *uniChar = *uniChar & 0x7F; // Put the character bits in the bottom of uniChar. *uniChar = *uniChar >> *charSize; for ( size_t i = (offset + 1); i < (offset + *charSize); ++i ) { *uniChar = (*uniChar << 6) | (UnsByte(fullString[i]) & 0x3F); } XMP_Uns32 upperBits = *uniChar >> 8; // First filter on just the high order 24 bits. if ( upperBits == 0xFF ) { // U+FFxx if ( *uniChar == UCP(0xFF0C) ) { *charKind = UCK_comma; // U+FF0C, full width comma. } else if ( *uniChar == UCP(0xFF1B) ) { *charKind = UCK_semicolon; // U+FF1B, full width semicolon. } else if ( *uniChar == UCP(0xFF64) ) { *charKind = UCK_comma; // U+FF64, half width ideographic comma. } } else if ( upperBits == 0xFE ) { // U+FE-- if ( *uniChar == UCP(0xFE50) ) { *charKind = UCK_comma; // U+FE50, small comma. } else if ( *uniChar == UCP(0xFE51) ) { *charKind = UCK_comma; // U+FE51, small ideographic comma. } else if ( *uniChar == UCP(0xFE54) ) { *charKind = UCK_semicolon; // U+FE54, small semicolon. } } else if ( upperBits == 0x30 ) { // U+30-- if ( *uniChar == UCP(0x3000) ) { *charKind = UCK_space; // U+3000, ideographic space. } else if ( *uniChar == UCP(0x3001) ) { *charKind = UCK_comma; // U+3001, ideographic comma. } else if ( (UCP(0x3008) <= *uniChar) && (*uniChar <= UCP(0x300F)) ) { *charKind = UCK_quote; // U+3008..U+300F, various quotes. } else if ( *uniChar == UCP(0x303F) ) { *charKind = UCK_space; // U+303F, ideographic half fill space. } else if ( (UCP(0x301D) <= *uniChar) && (*uniChar <= UCP(0x301F)) ) { *charKind = UCK_quote; // U+301D..U+301F, double prime quotes. } } else if ( upperBits == 0x20 ) { // U+20-- if ( (UCP(0x2000) <= *uniChar) && (*uniChar <= UCP(0x200B)) ) { *charKind = UCK_space; // U+2000..U+200B, en quad through zero width space. } else if ( *uniChar == UCP(0x2015) ) { *charKind = UCK_quote; // U+2015, dash quote. } else if ( (UCP(0x2018) <= *uniChar) && (*uniChar <= UCP(0x201F)) ) { *charKind = UCK_quote; // U+2018..U+201F, various quotes. } else if ( *uniChar == UCP(0x2028) ) { *charKind = UCK_control; // U+2028, line separator. } else if ( *uniChar == UCP(0x2029) ) { *charKind = UCK_control; // U+2029, paragraph separator. } else if ( (*uniChar == UCP(0x2039)) || (*uniChar == UCP(0x203A)) ) { *charKind = UCK_quote; // U+2039 and U+203A, guillemet quotes. } } else if ( upperBits == 0x06 ) { // U+06-- if ( *uniChar == UCP(0x060C) ) { *charKind = UCK_comma; // U+060C, Arabic comma. } else if ( *uniChar == UCP(0x061B) ) { *charKind = UCK_semicolon; // U+061B, Arabic semicolon. } } else if ( upperBits == 0x05 ) { // U+05-- if ( *uniChar == UCP(0x055D) ) { *charKind = UCK_comma; // U+055D, Armenian comma. } } else if ( upperBits == 0x03 ) { // U+03-- if ( *uniChar == UCP(0x037E) ) { *charKind = UCK_semicolon; // U+037E, Greek "semicolon" (really a question mark). } } else if ( upperBits == 0x00 ) { // U+00-- if ( (*uniChar == UCP(0x00AB)) || (*uniChar == UCP(0x00BB)) ) { *charKind = UCK_quote; // U+00AB and U+00BB, guillemet quotes. } } } } // ClassifyCharacter // ------------------------------------------------------------------------------------------------- // IsClosingingQuote // ----------------- static inline bool IsClosingingQuote ( UniCodePoint uniChar, UniCodePoint openQuote, UniCodePoint closeQuote ) { if ( (uniChar == closeQuote) || ( (openQuote == UCP(0x301D)) && ((uniChar == UCP(0x301E)) || (uniChar == UCP(0x301F))) ) ) { return true; } else { return false; } } // IsClosingingQuote // ------------------------------------------------------------------------------------------------- // IsSurroundingQuote // ------------------ static inline bool IsSurroundingQuote ( UniCodePoint uniChar, UniCodePoint openQuote, UniCodePoint closeQuote ) { if ( (uniChar == openQuote) || IsClosingingQuote ( uniChar, openQuote, closeQuote ) ) { return true; } else { return false; } } // IsSurroundingQuote // ------------------------------------------------------------------------------------------------- // GetClosingQuote // --------------- static UniCodePoint GetClosingQuote ( UniCodePoint openQuote ) { UniCodePoint closeQuote; switch ( openQuote ) { case UCP(0x0022) : closeQuote = UCP(0x0022); // ! U+0022 is both opening and closing. break; case UCP(0x005B) : closeQuote = UCP(0x005D); break; case UCP(0x00AB) : closeQuote = UCP(0x00BB); // ! U+00AB and U+00BB are reversible. break; case UCP(0x00BB) : closeQuote = UCP(0x00AB); break; case UCP(0x2015) : closeQuote = UCP(0x2015); // ! U+2015 is both opening and closing. break; case UCP(0x2018) : closeQuote = UCP(0x2019); break; case UCP(0x201A) : closeQuote = UCP(0x201B); break; case UCP(0x201C) : closeQuote = UCP(0x201D); break; case UCP(0x201E) : closeQuote = UCP(0x201F); break; case UCP(0x2039) : closeQuote = UCP(0x203A); // ! U+2039 and U+203A are reversible. break; case UCP(0x203A) : closeQuote = UCP(0x2039); break; case UCP(0x3008) : closeQuote = UCP(0x3009); break; case UCP(0x300A) : closeQuote = UCP(0x300B); break; case UCP(0x300C) : closeQuote = UCP(0x300D); break; case UCP(0x300E) : closeQuote = UCP(0x300F); break; case UCP(0x301D) : closeQuote = UCP(0x301F); // ! U+301E also closes U+301D. break; default : closeQuote = 0; break; } return closeQuote; } // GetClosingQuote // ------------------------------------------------------------------------------------------------- // CodePointToUTF8 // --------------- static void CodePointToUTF8 ( UniCodePoint uniChar, XMP_VarString & utf8Str ) { size_t i, byteCount; XMP_Uns8 buffer [8]; UniCodePoint cpTemp; if ( uniChar <= 0x7F ) { i = 7; byteCount = 1; buffer[7] = char(uniChar); } else { // --------------------------------------------------------------------------------------- // Copy the data bits from the low order end to the high order end, include the 0x80 mask. i = 8; cpTemp = uniChar; while ( cpTemp != 0 ) { -- i; // Exit with i pointing to the last byte stored. buffer[i] = UnsByte(0x80) | (UnsByte(cpTemp) & 0x3F); cpTemp = cpTemp >> 6; } byteCount = 8 - i; // The total number of bytes needed. XMP_Assert ( (2 <= byteCount) && (byteCount <= 6) ); // ------------------------------------------------------------------------------------- // Make sure the high order byte can hold the byte count mask, compute and set the mask. size_t bitCount = 0; // The number of data bits in the first byte. for ( cpTemp = (buffer[i] & UnsByte(0x3F)); cpTemp != 0; cpTemp = cpTemp >> 1 ) bitCount += 1; if ( bitCount > (8 - (byteCount + 1)) ) byteCount += 1; i = 8 - byteCount; // First byte index and mask shift count. XMP_Assert ( (0 <= i) && (i <= 6) ); buffer[i] |= (UnsByte(0xFF) << i) & UnsByte(0xFF); // AUDIT: Safe, i is between 0 and 6. } utf8Str.assign ( (char*)(&buffer[i]), byteCount ); } // CodePointToUTF8 // ------------------------------------------------------------------------------------------------- // ApplyQuotes // ----------- static void ApplyQuotes ( XMP_VarString * item, UniCodePoint openQuote, UniCodePoint closeQuote, bool allowCommas ) { bool prevSpace = false; size_t charOffset, charLen; UniCharKind charKind; UniCodePoint uniChar; // ----------------------------------------------------------------------------------------- // See if there are any separators in the value. Stop at the first occurrance. This is a bit // tricky in order to make typical typing work conveniently. The purpose of applying quotes // is to preserve the values when splitting them back apart. That is CatenateContainerItems // and SeparateContainerItems must round trip properly. For the most part we only look for // separators here. Internal quotes, as in -- Irving "Bud" Jones -- won't cause problems in // the separation. An initial quote will though, it will make the value look quoted. charOffset = 0; ClassifyCharacter ( item->c_str(), charOffset, &charKind, &charLen, &uniChar ); if ( charKind != UCK_quote ) { for ( charOffset = 0; size_t(charOffset) < item->size(); charOffset += charLen ) { ClassifyCharacter ( item->c_str(), charOffset, &charKind, &charLen, &uniChar ); if ( charKind == UCK_space ) { if ( prevSpace ) break; // Multiple spaces are a separator. prevSpace = true; } else { prevSpace = false; if ( (charKind == UCK_semicolon) || (charKind == UCK_control) ) break; if ( (charKind == UCK_comma) && (! allowCommas) ) break; } } } if ( size_t(charOffset) < item->size() ) { // -------------------------------------------------------------------------------------- // Create a quoted copy, doubling any internal quotes that match the outer ones. Internal // quotes did not stop the "needs quoting" search, but they do need doubling. So we have // to rescan the front of the string for quotes. Handle the special case of U+301D being // closed by either U+301E or U+301F. XMP_VarString newItem; size_t splitPoint; for ( splitPoint = 0; splitPoint <= charOffset; ++splitPoint ) { ClassifyCharacter ( item->c_str(), splitPoint, &charKind, &charLen, &uniChar ); if ( charKind == UCK_quote ) break; } CodePointToUTF8 ( openQuote, newItem ); newItem.append ( *item, 0, splitPoint ); // Copy the leading "normal" portion. for ( charOffset = splitPoint; size_t(charOffset) < item->size(); charOffset += charLen ) { ClassifyCharacter ( item->c_str(), charOffset, &charKind, &charLen, &uniChar ); newItem.append ( *item, charOffset, charLen ); if ( (charKind == UCK_quote) && IsSurroundingQuote ( uniChar, openQuote, closeQuote ) ) { newItem.append ( *item, charOffset, charLen ); } } XMP_VarString closeStr; CodePointToUTF8 ( closeQuote, closeStr ); newItem.append ( closeStr ); *item = newItem; } } // ApplyQuotes // ------------------------------------------------------------------------------------------------- // IsInternalProperty // ------------------ // *** Need static checks of the schema prefixes! static const char * kExternalxmpDM[] = { "xmpDM:album", "xmpDM:altTapeName", "xmpDM:altTimecode", "xmpDM:artist", "xmpDM:cameraAngle", "xmpDM:cameraLabel", "xmpDM:cameraModel", "xmpDM:cameraMove", "xmpDM:client", "xmpDM:comment", "xmpDM:composer", "xmpDM:director", "xmpDM:directorPhotography", "xmpDM:engineer", "xmpDM:genre", "xmpDM:good", "xmpDM:instrument", "xmpDM:logComment", "xmpDM:projectName", "xmpDM:releaseDate", "xmpDM:scene", "xmpDM:shotDate", "xmpDM:shotDay", "xmpDM:shotLocation", "xmpDM:shotName", "xmpDM:shotNumber", "xmpDM:shotSize", "xmpDM:speakerPlacement", "xmpDM:takeNumber", "xmpDM:tapeName", "xmpDM:trackNumber", "xmpDM:videoAlphaMode", "xmpDM:videoAlphaPremultipleColor", 0 }; // ! Must have zero sentinel! typedef const char ** CharStarIterator; // Used for binary search of kExternalxmpDM; static const char ** kLastExternalxmpDM = 0; // Set on first use. static int CharStarLess (const char * left, const char * right ) { return (strcmp ( left, right ) < 0); } #define IsExternalProperty(s,p) (! IsInternalProperty ( s, p )) static bool IsInternalProperty ( const XMP_VarString & schema, const XMP_VarString & prop ) { bool isInternal = false; if ( schema == kXMP_NS_DC ) { if ( (prop == "dc:format") || (prop == "dc:language") ) { isInternal = true; } } else if ( schema == kXMP_NS_XMP ) { if ( (prop == "xmp:BaseURL") || (prop == "xmp:CreatorTool") || (prop == "xmp:Format") || (prop == "xmp:Locale") || (prop == "xmp:MetadataDate") || (prop == "xmp:ModifyDate") ) { isInternal = true; } } else if ( schema == kXMP_NS_PDF ) { if ( (prop == "pdf:BaseURL") || (prop == "pdf:Creator") || (prop == "pdf:ModDate") || (prop == "pdf:PDFVersion") || (prop == "pdf:Producer") ) { isInternal = true; } } else if ( schema == kXMP_NS_TIFF ) { isInternal = true; // ! The TIFF properties are internal by default. if ( (prop == "tiff:ImageDescription") || // ! ImageDescription, Artist, and Copyright are aliased. (prop == "tiff:Artist") || (prop == "tiff:Copyright") ) { isInternal = false; } } else if ( schema == kXMP_NS_EXIF ) { isInternal = true; // ! The EXIF properties are internal by default. if ( prop == "exif:UserComment" ) isInternal = false; } else if ( schema == kXMP_NS_EXIF_Aux ) { isInternal = true; // ! The EXIF Aux properties are internal by default. } else if ( schema == kXMP_NS_Photoshop ) { if ( prop == "photoshop:ICCProfile" ) isInternal = true; } else if ( schema == kXMP_NS_CameraRaw ) { isInternal = true; // All of crs: is internal, they are processing settings. } else if ( schema == kXMP_NS_DM ) { // ! Most of the xmpDM schema is internal, and unknown properties default to internal. if ( kLastExternalxmpDM == 0 ) { for ( kLastExternalxmpDM = &kExternalxmpDM[0]; *kLastExternalxmpDM != 0; ++kLastExternalxmpDM ) {} } isInternal = (! std::binary_search ( &kExternalxmpDM[0], kLastExternalxmpDM, prop.c_str(), CharStarLess )); } else if ( schema == kXMP_NS_Script ) { isInternal = true; // ! Most of the xmpScript schema is internal, and unknown properties default to internal. if ( (prop == "xmpScript:action") || (prop == "xmpScript:character") || (prop == "xmpScript:dialog") || (prop == "xmpScript:sceneSetting") || (prop == "xmpScript:sceneTimeOfDay") ) { isInternal = false; } } else if ( schema == kXMP_NS_BWF ) { if ( prop == "bext:version" ) isInternal = true; } else if ( schema == kXMP_NS_AdobeStockPhoto ) { isInternal = true; // ! The bmsp schema has only internal properties. } else if ( schema == kXMP_NS_XMP_MM ) { isInternal = true; // ! The xmpMM schema has only internal properties. } else if ( schema == kXMP_NS_XMP_Text ) { isInternal = true; // ! The xmpT schema has only internal properties. } else if ( schema == kXMP_NS_XMP_PagedFile ) { isInternal = true; // ! The xmpTPg schema has only internal properties. } else if ( schema == kXMP_NS_XMP_Graphics ) { isInternal = true; // ! The xmpG schema has only internal properties. } else if ( schema == kXMP_NS_XMP_Image ) { isInternal = true; // ! The xmpGImg schema has only internal properties. } else if ( schema == kXMP_NS_XMP_Font ) { isInternal = true; // ! The stFNT schema has only internal properties. } return isInternal; } // IsInternalProperty // ------------------------------------------------------------------------------------------------- // RemoveSchemaChildren // -------------------- static void RemoveSchemaChildren ( XMP_NodePtrPos schemaPos, bool doAll ) { XMP_Node * schemaNode = *schemaPos; XMP_Assert ( XMP_NodeIsSchema ( schemaNode->options ) ); // ! Iterate backwards to reduce shuffling as children are erased and to simplify the logic for // ! denoting the current child. (Erasing child n makes the old n+1 now be n.) size_t propCount = schemaNode->children.size(); XMP_NodePtrPos beginPos = schemaNode->children.begin(); for ( size_t propNum = propCount-1, propLim = (size_t)(-1); propNum != propLim; --propNum ) { XMP_NodePtrPos currProp = beginPos + propNum; if ( doAll || IsExternalProperty ( schemaNode->name, (*currProp)->name ) ) { delete *currProp; // ! Both delete the node and erase the pointer from the parent. schemaNode->children.erase ( currProp ); } } if ( schemaNode->children.empty() ) { XMP_Node * tree = schemaNode->parent; tree->children.erase ( schemaPos ); delete schemaNode; } } // RemoveSchemaChildren // ------------------------------------------------------------------------------------------------- // ItemValuesMatch // --------------- // // Does the value comparisons for array merging as part of XMPUtils::AppendProperties. static bool ItemValuesMatch ( const XMP_Node * leftNode, const XMP_Node * rightNode ) { const XMP_OptionBits leftForm = leftNode->options & kXMP_PropCompositeMask; const XMP_OptionBits rightForm = leftNode->options & kXMP_PropCompositeMask; if ( leftForm != rightForm ) return false; if ( leftForm == 0 ) { // Simple nodes, check the values and xml:lang qualifiers. if ( leftNode->value != rightNode->value ) return false; if ( (leftNode->options & kXMP_PropHasLang) != (rightNode->options & kXMP_PropHasLang) ) return false; if ( leftNode->options & kXMP_PropHasLang ) { if ( leftNode->qualifiers[0]->value != rightNode->qualifiers[0]->value ) return false; } } else if ( leftForm == kXMP_PropValueIsStruct ) { // Struct nodes, see if all fields match, ignoring order. if ( leftNode->children.size() != rightNode->children.size() ) return false; for ( size_t leftNum = 0, leftLim = leftNode->children.size(); leftNum != leftLim; ++leftNum ) { const XMP_Node * leftField = leftNode->children[leftNum]; const XMP_Node * rightField = FindConstChild ( rightNode, leftField->name.c_str() ); if ( (rightField == 0) || (! ItemValuesMatch ( leftField, rightField )) ) return false; } } else { // Array nodes, see if the "leftNode" values are present in the "rightNode", ignoring order, duplicates, // and extra values in the rightNode-> The rightNode is the destination for AppendProperties. XMP_Assert ( leftForm & kXMP_PropValueIsArray ); for ( size_t leftNum = 0, leftLim = leftNode->children.size(); leftNum != leftLim; ++leftNum ) { const XMP_Node * leftItem = leftNode->children[leftNum]; size_t rightNum, rightLim; for ( rightNum = 0, rightLim = rightNode->children.size(); rightNum != rightLim; ++rightNum ) { const XMP_Node * rightItem = rightNode->children[rightNum]; if ( ItemValuesMatch ( leftItem, rightItem ) ) break; } if ( rightNum == rightLim ) return false; } } return true; // All of the checks passed. } // ItemValuesMatch // ------------------------------------------------------------------------------------------------- // AppendSubtree // ------------- // // The main implementation of XMPUtils::AppendProperties. See the description in TXMPMeta.hpp. static void AppendSubtree ( const XMP_Node * sourceNode, XMP_Node * destParent, const bool mergeCompound, const bool replaceOld, const bool deleteEmpty ) { XMP_NodePtrPos destPos; XMP_Node * destNode = FindChildNode ( destParent, sourceNode->name.c_str(), kXMP_ExistingOnly, &destPos ); bool valueIsEmpty = false; if ( XMP_PropIsSimple ( sourceNode->options ) ) { valueIsEmpty = sourceNode->value.empty(); } else { valueIsEmpty = sourceNode->children.empty(); } if ( valueIsEmpty ) { if ( deleteEmpty && (destNode != 0) ) { delete ( destNode ); destParent->children.erase ( destPos ); } return; // ! Done, empty values are either ignored or cause deletions. } if ( destNode == 0 ) { // The one easy case, the destination does not exist. destNode = CloneSubtree ( sourceNode, destParent, true /* skipEmpty */ ); XMP_Assert ( (destNode == 0) || (! destNode->value.empty()) || (! destNode->children.empty()) ); return; } // If we get here we're going to modify an existing property, either replacing or merging. XMP_Assert ( (! valueIsEmpty) && (destNode != 0) ); XMP_OptionBits sourceForm = sourceNode->options & kXMP_PropCompositeMask; XMP_OptionBits destForm = destNode->options & kXMP_PropCompositeMask; bool replaceThis = replaceOld; // ! Don't modify replaceOld, it gets passed to inner calls. if ( mergeCompound && (! XMP_PropIsSimple ( sourceForm )) ) replaceThis = false; if ( replaceThis ) { destNode->value = sourceNode->value; // *** Should use SetNode. destNode->options = sourceNode->options; destNode->RemoveChildren(); destNode->RemoveQualifiers(); CloneOffspring ( sourceNode, destNode, true /* skipEmpty */ ); if ( (! XMP_PropIsSimple ( destNode->options )) && destNode->children.empty() ) { // Don't keep an empty array or struct. The source might be implicitly empty due to // all children being empty. In this case CloneOffspring should skip them. DeleteSubtree ( destPos ); } return; } // From here on are cases for merging arrays or structs. if ( XMP_PropIsSimple ( sourceForm ) || (sourceForm != destForm) ) return; if ( sourceForm == kXMP_PropValueIsStruct ) { // To merge a struct process the fields recursively. E.g. add simple missing fields. The // recursive call to AppendSubtree will handle deletion for fields with empty values. for ( size_t sourceNum = 0, sourceLim = sourceNode->children.size(); sourceNum != sourceLim; ++sourceNum ) { const XMP_Node * sourceField = sourceNode->children[sourceNum]; AppendSubtree ( sourceField, destNode, mergeCompound, replaceOld, deleteEmpty ); if ( deleteEmpty && destNode->children.empty() ) { delete ( destNode ); destParent->children.erase ( destPos ); } } } else if ( sourceForm & kXMP_PropArrayIsAltText ) { // Merge AltText arrays by the xml:lang qualifiers. Make sure x-default is first. Make a // special check for deletion of empty values. Meaningful in AltText arrays because the // xml:lang qualifier provides unambiguous source/dest correspondence. XMP_Assert ( mergeCompound ); for ( size_t sourceNum = 0, sourceLim = sourceNode->children.size(); sourceNum != sourceLim; ++sourceNum ) { const XMP_Node * sourceItem = sourceNode->children[sourceNum]; if ( sourceItem->qualifiers.empty() || (sourceItem->qualifiers[0]->name != "xml:lang") ) continue; XMP_Index destIndex = LookupLangItem ( destNode, sourceItem->qualifiers[0]->value ); if ( sourceItem->value.empty() ) { if ( deleteEmpty && (destIndex != -1) ) { delete ( destNode->children[destIndex] ); destNode->children.erase ( destNode->children.begin() + destIndex ); if ( destNode->children.empty() ) { delete ( destNode ); destParent->children.erase ( destPos ); } } } else { if ( destIndex != -1 ) { // The source and dest arrays both have this language item. if ( replaceOld ) { // ! Yes, check replaceOld not replaceThis! destNode->children[destIndex]->value = sourceItem->value; } } else { // The dest array does not have this language item, add it. if ( (sourceItem->qualifiers[0]->value != "x-default") || destNode->children.empty() ) { // Typical case, empty dest array or not "x-default". Non-empty should always have "x-default". CloneSubtree ( sourceItem, destNode, true /* skipEmpty */ ); } else { // Edge case, non-empty dest array had no "x-default", insert that at the beginning. XMP_Node * destItem = new XMP_Node ( destNode, sourceItem->name, sourceItem->value, sourceItem->options ); CloneOffspring ( sourceItem, destItem, true /* skipEmpty */ ); destNode->children.insert ( destNode->children.begin(), destItem ); } } } } } else if ( sourceForm & kXMP_PropValueIsArray ) { // Merge other arrays by item values. Don't worry about order or duplicates. Source // items with empty values do not cause deletion, that conflicts horribly with merging. for ( size_t sourceNum = 0, sourceLim = sourceNode->children.size(); sourceNum != sourceLim; ++sourceNum ) { const XMP_Node * sourceItem = sourceNode->children[sourceNum]; size_t destNum, destLim; for ( destNum = 0, destLim = destNode->children.size(); destNum != destLim; ++destNum ) { const XMP_Node * destItem = destNode->children[destNum]; if ( ItemValuesMatch ( sourceItem, destItem ) ) break; } if ( destNum == destLim ) CloneSubtree ( sourceItem, destNode, true /* skipEmpty */ ); } } } // AppendSubtree // ================================================================================================= // Class Static Functions // ====================== // ------------------------------------------------------------------------------------------------- // CatenateArrayItems // ------------------ /* class static */ void XMPUtils::CatenateArrayItems ( const XMPMeta & xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr separator, XMP_StringPtr quotes, XMP_OptionBits options, XMP_VarString * catedStr ) { XMP_Assert ( (schemaNS != 0) && (arrayName != 0) ); // ! Enforced by wrapper. XMP_Assert ( (separator != 0) && (quotes != 0) && (catedStr != 0) ); // ! Enforced by wrapper. size_t strLen, strPos, charLen; UniCharKind charKind; UniCodePoint currUCP, openQuote, closeQuote; const bool allowCommas = ((options & kXMPUtil_AllowCommas) != 0); const XMP_Node * arrayNode = 0; // ! Move up to avoid gcc complaints. XMP_OptionBits arrayForm = 0; const XMP_Node * currItem = 0; // Make sure the separator is OK. It must be one semicolon surrounded by zero or more spaces. // Any of the recognized semicolons or spaces are allowed. strPos = 0; strLen = strlen ( separator ); bool haveSemicolon = false; while ( strPos < strLen ) { ClassifyCharacter ( separator, strPos, &charKind, &charLen, &currUCP ); strPos += charLen; if ( charKind == UCK_semicolon ) { if ( haveSemicolon ) XMP_Throw ( "Separator can have only one semicolon", kXMPErr_BadParam ); haveSemicolon = true; } else if ( charKind != UCK_space ) { XMP_Throw ( "Separator can have only spaces and one semicolon", kXMPErr_BadParam ); } }; if ( ! haveSemicolon ) XMP_Throw ( "Separator must have one semicolon", kXMPErr_BadParam ); // Make sure the open and close quotes are a legitimate pair. strLen = strlen ( quotes ); ClassifyCharacter ( quotes, 0, &charKind, &charLen, &openQuote ); if ( charKind != UCK_quote ) XMP_Throw ( "Invalid quoting character", kXMPErr_BadParam ); if ( charLen == strLen ) { closeQuote = openQuote; } else { strPos = charLen; ClassifyCharacter ( quotes, strPos, &charKind, &charLen, &closeQuote ); if ( charKind != UCK_quote ) XMP_Throw ( "Invalid quoting character", kXMPErr_BadParam ); if ( (strPos + charLen) != strLen ) XMP_Throw ( "Quoting string too long", kXMPErr_BadParam ); } if ( closeQuote != GetClosingQuote ( openQuote ) ) XMP_Throw ( "Mismatched quote pair", kXMPErr_BadParam ); // Return an empty result if the array does not exist, hurl if it isn't the right form. catedStr->erase(); XMP_ExpandedXPath arrayPath; ExpandXPath ( schemaNS, arrayName, &arrayPath ); arrayNode = FindConstNode ( &xmpObj.tree, arrayPath ); if ( arrayNode == 0 ) return; arrayForm = arrayNode->options & kXMP_PropCompositeMask; if ( (! (arrayForm & kXMP_PropValueIsArray)) || (arrayForm & kXMP_PropArrayIsAlternate) ) { XMP_Throw ( "Named property must be non-alternate array", kXMPErr_BadParam ); } if ( arrayNode->children.empty() ) return; // Build the result, quoting the array items, adding separators. Hurl if any item isn't simple. // Start the result with the first value, then add the rest with a preceeding separator. currItem = arrayNode->children[0]; if ( (currItem->options & kXMP_PropCompositeMask) != 0 ) XMP_Throw ( "Array items must be simple", kXMPErr_BadParam ); *catedStr = currItem->value; ApplyQuotes ( catedStr, openQuote, closeQuote, allowCommas ); for ( size_t itemNum = 1, itemLim = arrayNode->children.size(); itemNum != itemLim; ++itemNum ) { const XMP_Node * currItem = arrayNode->children[itemNum]; if ( (currItem->options & kXMP_PropCompositeMask) != 0 ) XMP_Throw ( "Array items must be simple", kXMPErr_BadParam ); XMP_VarString tempStr ( currItem->value ); ApplyQuotes ( &tempStr, openQuote, closeQuote, allowCommas ); *catedStr += separator; *catedStr += tempStr; } } // CatenateArrayItems // ------------------------------------------------------------------------------------------------- // SeparateArrayItems // ------------------ /* class static */ void XMPUtils::SeparateArrayItems ( XMPMeta * xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, XMP_StringPtr catedStr ) { XMP_Assert ( (schemaNS != 0) && (arrayName != 0) && (catedStr != 0) ); // ! Enforced by wrapper. XMP_VarString itemValue; size_t itemStart, itemEnd; size_t nextSize, charSize = 0; // Avoid VS uninit var warnings. UniCharKind nextKind, charKind = UCK_normal; UniCodePoint nextChar, uniChar = 0; // Extract "special" option bits, verify and normalize the others. bool preserveCommas = false; if ( options & kXMPUtil_AllowCommas ) { preserveCommas = true; options ^= kXMPUtil_AllowCommas; } options = VerifySetOptions ( options, 0 ); // Keep a zero value, has special meaning below. if ( options & ~kXMP_PropArrayFormMask ) XMP_Throw ( "Options can only provide array form", kXMPErr_BadOptions ); // Find the array node, make sure it is OK. Move the current children aside, to be readded later if kept. XMP_ExpandedXPath arrayPath; ExpandXPath ( schemaNS, arrayName, &arrayPath ); XMP_Node * arrayNode = FindNode ( &xmpObj->tree, arrayPath, kXMP_ExistingOnly ); if ( arrayNode != 0 ) { // The array exists, make sure the form is compatible. Zero arrayForm means take what exists. XMP_OptionBits arrayForm = arrayNode->options & kXMP_PropArrayFormMask; if ( (arrayForm == 0) || (arrayForm & kXMP_PropArrayIsAlternate) ) { XMP_Throw ( "Named property must be non-alternate array", kXMPErr_BadXPath ); } if ( (options != 0) && (options != arrayForm) ) XMP_Throw ( "Mismatch of specified and existing array form", kXMPErr_BadXPath ); // *** Right error? } else { // The array does not exist, try to create it. arrayNode = FindNode ( &xmpObj->tree, arrayPath, kXMP_CreateNodes, (options | kXMP_PropValueIsArray) ); if ( arrayNode == 0 ) XMP_Throw ( "Failed to create named array", kXMPErr_BadXPath ); } XMP_NodeOffspring oldChildren ( arrayNode->children ); size_t oldChildCount = oldChildren.size(); arrayNode->children.clear(); // Extract the item values one at a time, until the whole input string is done. Be very careful // in the extraction about the string positions. They are essentially byte pointers, while the // contents are UTF-8. Adding or subtracting 1 does not necessarily move 1 Unicode character! size_t endPos = strlen ( catedStr ); itemEnd = 0; while ( itemEnd < endPos ) { // Skip any leading spaces and separation characters. Always skip commas here. They can be // kept when within a value, but not when alone between values. for ( itemStart = itemEnd; itemStart < endPos; itemStart += charSize ) { ClassifyCharacter ( catedStr, itemStart, &charKind, &charSize, &uniChar ); if ( (charKind == UCK_normal) || (charKind == UCK_quote) ) break; } if ( itemStart >= endPos ) break; if ( charKind != UCK_quote ) { // This is not a quoted value. Scan for the end, create an array item from the substring. for ( itemEnd = itemStart; itemEnd < endPos; itemEnd += charSize ) { ClassifyCharacter ( catedStr, itemEnd, &charKind, &charSize, &uniChar ); if ( (charKind == UCK_normal) || (charKind == UCK_quote) ) continue; if ( (charKind == UCK_comma) && preserveCommas ) continue; if ( charKind != UCK_space ) break; if ( (itemEnd + charSize) >= endPos ) break; // Anything left? ClassifyCharacter ( catedStr, (itemEnd+charSize), &nextKind, &nextSize, &nextChar ); if ( (nextKind == UCK_normal) || (nextKind == UCK_quote) ) continue; if ( (nextKind == UCK_comma) && preserveCommas ) continue; break; // Have multiple spaces, or a space followed by a separator. } itemValue.assign ( catedStr, itemStart, (itemEnd - itemStart) ); } else { // Accumulate quoted values into a local string, undoubling internal quotes that // match the surrounding quotes. Do not undouble "unmatching" quotes. UniCodePoint openQuote = uniChar; UniCodePoint closeQuote = GetClosingQuote ( openQuote ); itemStart += charSize; // Skip the opening quote; itemValue.erase(); for ( itemEnd = itemStart; itemEnd < endPos; itemEnd += charSize ) { ClassifyCharacter ( catedStr, itemEnd, &charKind, &charSize, &uniChar ); if ( (charKind != UCK_quote) || (! IsSurroundingQuote ( uniChar, openQuote, closeQuote)) ) { // This is not a matching quote, just append it to the item value. itemValue.append ( catedStr, itemEnd, charSize ); } else { // This is a "matching" quote. Is it doubled, or the final closing quote? Tolerate // various edge cases like undoubled opening (non-closing) quotes, or end of input. if ( (itemEnd + charSize) < endPos ) { ClassifyCharacter ( catedStr, itemEnd+charSize, &nextKind, &nextSize, &nextChar ); } else { nextKind = UCK_semicolon; nextSize = 0; nextChar = 0x3B; } if ( uniChar == nextChar ) { // This is doubled, copy it and skip the double. itemValue.append ( catedStr, itemEnd, charSize ); itemEnd += nextSize; // Loop will add in charSize. } else if ( ! IsClosingingQuote ( uniChar, openQuote, closeQuote ) ) { // This is an undoubled, non-closing quote, copy it. itemValue.append ( catedStr, itemEnd, charSize ); } else { // This is an undoubled closing quote, skip it and exit the loop. itemEnd += charSize; break; } } } // Loop to accumulate the quoted value. } // Add the separated item to the array. Keep a matching old value in case it had separators. size_t oldChild; for ( oldChild = 0; oldChild < oldChildCount; ++oldChild ) { if ( (oldChildren[oldChild] != 0) && (itemValue == oldChildren[oldChild]->value) ) break; } XMP_Node * newItem = 0; if ( oldChild == oldChildCount ) { newItem = new XMP_Node ( arrayNode, kXMP_ArrayItemName, itemValue.c_str(), 0 ); } else { newItem = oldChildren[oldChild]; oldChildren[oldChild] = 0; // ! Don't match again, let duplicates be seen. } arrayNode->children.push_back ( newItem ); } // Loop through all of the returned items. // Delete any of the old children that were not kept. for ( size_t i = 0; i < oldChildCount; ++i ) { if ( oldChildren[i] != 0 ) delete oldChildren[i]; } } // SeparateArrayItems // ------------------------------------------------------------------------------------------------- // ApplyTemplate // ------------- /* class static */ void XMPUtils::ApplyTemplate ( XMPMeta * workingXMP, const XMPMeta & templateXMP, XMP_OptionBits actions ) { bool doClear = XMP_OptionIsSet ( actions, kXMPTemplate_ClearUnnamedProperties ); bool doAdd = XMP_OptionIsSet ( actions, kXMPTemplate_AddNewProperties ); bool doReplace = XMP_OptionIsSet ( actions, kXMPTemplate_ReplaceExistingProperties ); bool deleteEmpty = XMP_OptionIsSet ( actions, kXMPTemplate_ReplaceWithDeleteEmpty ); doReplace |= deleteEmpty; // Delete-empty implies Replace. deleteEmpty &= (! doClear); // Clear implies not delete-empty, but keep the implicit Replace. bool doAll = XMP_OptionIsSet ( actions, kXMPTemplate_IncludeInternalProperties ); // ! In several places we do loops backwards so that deletions do not perturb the remaining indices. // ! These loops use ordinals (size .. 1), we must use a zero based index inside the loop. if ( doClear ) { // Visit the top level working properties, delete if not in the template. for ( size_t schemaOrdinal = workingXMP->tree.children.size(); schemaOrdinal > 0; --schemaOrdinal ) { size_t schemaNum = schemaOrdinal-1; // ! Convert ordinal to index! XMP_Node * workingSchema = workingXMP->tree.children[schemaNum]; const XMP_Node * templateSchema = FindConstSchema ( &templateXMP.tree, workingSchema->name.c_str() ); if ( templateSchema == 0 ) { // The schema is not in the template, delete all properties or just all external ones. if ( doAll ) { workingSchema->RemoveChildren(); // Remove the properties here, delete the schema below. } else { for ( size_t propOrdinal = workingSchema->children.size(); propOrdinal > 0; --propOrdinal ) { size_t propNum = propOrdinal-1; // ! Convert ordinal to index! XMP_Node * workingProp = workingSchema->children[propNum]; if ( IsExternalProperty ( workingSchema->name, workingProp->name ) ) { delete ( workingProp ); workingSchema->children.erase ( workingSchema->children.begin() + propNum ); } } } } else { // Check each of the working XMP's properties to see if it is in the template. for ( size_t propOrdinal = workingSchema->children.size(); propOrdinal > 0; --propOrdinal ) { size_t propNum = propOrdinal-1; // ! Convert ordinal to index! XMP_Node * workingProp = workingSchema->children[propNum]; if ( (doAll || IsExternalProperty ( workingSchema->name, workingProp->name )) && (FindConstChild ( templateSchema, workingProp->name.c_str() ) == 0) ) { delete ( workingProp ); workingSchema->children.erase ( workingSchema->children.begin() + propNum ); } } } if ( workingSchema->children.empty() ) { delete ( workingSchema ); workingXMP->tree.children.erase ( workingXMP->tree.children.begin() + schemaNum ); } } } if ( doAdd | doReplace ) { for ( size_t schemaNum = 0, schemaLim = templateXMP.tree.children.size(); schemaNum < schemaLim; ++schemaNum ) { const XMP_Node * templateSchema = templateXMP.tree.children[schemaNum]; // Make sure we have an output schema node, then process the top level template properties. XMP_NodePtrPos workingSchemaPos; XMP_Node * workingSchema = FindSchemaNode ( &workingXMP->tree, templateSchema->name.c_str(), kXMP_ExistingOnly, &workingSchemaPos ); if ( workingSchema == 0 ) { workingSchema = new XMP_Node ( &workingXMP->tree, templateSchema->name, templateSchema->value, kXMP_SchemaNode ); workingXMP->tree.children.push_back ( workingSchema ); workingSchemaPos = workingXMP->tree.children.end() - 1; } for ( size_t propNum = 0, propLim = templateSchema->children.size(); propNum < propLim; ++propNum ) { const XMP_Node * templateProp = templateSchema->children[propNum]; if ( doAll || IsExternalProperty ( templateSchema->name, templateProp->name ) ) { AppendSubtree ( templateProp, workingSchema, doAdd, doReplace, deleteEmpty ); } } if ( workingSchema->children.empty() ) { delete ( workingSchema ); workingXMP->tree.children.erase ( workingSchemaPos ); } } } } // ApplyTemplate // ------------------------------------------------------------------------------------------------- // RemoveProperties // ---------------- /* class static */ void XMPUtils::RemoveProperties ( XMPMeta * xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options ) { XMP_Assert ( (schemaNS != 0) && (propName != 0) ); // ! Enforced by wrapper. const bool doAll = XMP_TestOption (options, kXMPUtil_DoAllProperties ); const bool includeAliases = XMP_TestOption ( options, kXMPUtil_IncludeAliases ); if ( *propName != 0 ) { // Remove just the one indicated property. This might be an alias, the named schema might // not actually exist. So don't lookup the schema node. if ( *schemaNS == 0 ) XMP_Throw ( "Property name requires schema namespace", kXMPErr_BadParam ); XMP_ExpandedXPath expPath; ExpandXPath ( schemaNS, propName, &expPath ); XMP_NodePtrPos propPos; XMP_Node * propNode = FindNode ( &(xmpObj->tree), expPath, kXMP_ExistingOnly, kXMP_NoOptions, &propPos ); if ( propNode != 0 ) { if ( doAll || IsExternalProperty ( expPath[kSchemaStep].step, expPath[kRootPropStep].step ) ) { XMP_Node * parent = propNode->parent; // *** Should have XMP_Node::RemoveChild(pos). delete propNode; // ! Both delete the node and erase the pointer from the parent. parent->children.erase ( propPos ); DeleteEmptySchema ( parent ); } } } else if ( *schemaNS != 0 ) { // Remove all properties from the named schema. Optionally include aliases, in which case // there might not be an actual schema node. XMP_NodePtrPos schemaPos; XMP_Node * schemaNode = FindSchemaNode ( &xmpObj->tree, schemaNS, kXMP_ExistingOnly, &schemaPos ); if ( schemaNode != 0 ) RemoveSchemaChildren ( schemaPos, doAll ); if ( includeAliases ) { // We're removing the aliases also. Look them up by their namespace prefix. Yes, the // alias map is sorted so we could process just that portion. But that takes more code // and the extra speed isn't worth it. (Plus this way we avoid a dependence on the map // implementation.) Lookup the XMP node from the alias, to make sure the actual exists. XMP_StringPtr nsPrefix; XMP_StringLen nsLen; (void) XMPMeta::GetNamespacePrefix ( schemaNS, &nsPrefix, &nsLen ); XMP_AliasMapPos currAlias = sRegisteredAliasMap->begin(); XMP_AliasMapPos endAlias = sRegisteredAliasMap->end(); for ( ; currAlias != endAlias; ++currAlias ) { if ( strncmp ( currAlias->first.c_str(), nsPrefix, nsLen ) == 0 ) { XMP_NodePtrPos actualPos; XMP_Node * actualProp = FindNode ( &xmpObj->tree, currAlias->second, kXMP_ExistingOnly, kXMP_NoOptions, &actualPos ); if ( actualProp != 0 ) { XMP_Node * rootProp = actualProp; while ( ! XMP_NodeIsSchema ( rootProp->parent->options ) ) rootProp = rootProp->parent; if ( doAll || IsExternalProperty ( rootProp->parent->name, rootProp->name ) ) { XMP_Node * parent = actualProp->parent; delete actualProp; // ! Both delete the node and erase the pointer from the parent. parent->children.erase ( actualPos ); DeleteEmptySchema ( parent ); } } } } } } else { // Remove all appropriate properties from all schema. In this case we don't have to be // concerned with aliases, they are handled implicitly from the actual properties. // ! Iterate backwards to reduce shuffling if schema are erased and to simplify the logic // ! for denoting the current schema. (Erasing schema n makes the old n+1 now be n.) size_t schemaCount = xmpObj->tree.children.size(); XMP_NodePtrPos beginPos = xmpObj->tree.children.begin(); for ( size_t schemaNum = schemaCount-1, schemaLim = (size_t)(-1); schemaNum != schemaLim; --schemaNum ) { XMP_NodePtrPos currSchema = beginPos + schemaNum; RemoveSchemaChildren ( currSchema, doAll ); } } } // RemoveProperties // ------------------------------------------------------------------------------------------------- // DuplicateSubtree // ---------------- /* class static */ void XMPUtils::DuplicateSubtree ( const XMPMeta & source, XMPMeta * dest, XMP_StringPtr sourceNS, XMP_StringPtr sourceRoot, XMP_StringPtr destNS, XMP_StringPtr destRoot, XMP_OptionBits options ) { options = options; // Avoid unused parameter warning. bool fullSourceTree = false; bool fullDestTree = false; XMP_ExpandedXPath sourcePath, destPath; const XMP_Node * sourceNode = 0; XMP_Node * destNode = 0; XMP_Assert ( (sourceNS != 0) && (*sourceNS != 0) ); XMP_Assert ( (sourceRoot != 0) && (*sourceRoot != 0) ); XMP_Assert ( (dest != 0) && (destNS != 0) && (destRoot != 0) ); if ( *destNS == 0 ) destNS = sourceNS; if ( *destRoot == 0 ) destRoot = sourceRoot; if ( XMP_LitMatch ( sourceNS, "*" ) ) fullSourceTree = true; if ( XMP_LitMatch ( destNS, "*" ) ) fullDestTree = true; if ( (&source == dest) && (fullSourceTree | fullDestTree) ) { XMP_Throw ( "Can't duplicate tree onto itself", kXMPErr_BadParam ); } if ( fullSourceTree & fullDestTree ) XMP_Throw ( "Use Clone for full tree to full tree", kXMPErr_BadParam ); if ( fullSourceTree ) { // The destination must be an existing empty struct, copy all of the source top level as fields. ExpandXPath ( destNS, destRoot, &destPath ); destNode = FindNode ( &dest->tree, destPath, kXMP_ExistingOnly ); if ( (destNode == 0) || (! XMP_PropIsStruct ( destNode->options )) ) { XMP_Throw ( "Destination must be an existing struct", kXMPErr_BadXPath ); } if ( ! destNode->children.empty() ) { if ( options & kXMP_DeleteExisting ) { destNode->RemoveChildren(); } else { XMP_Throw ( "Destination must be an empty struct", kXMPErr_BadXPath ); } } for ( size_t schemaNum = 0, schemaLim = source.tree.children.size(); schemaNum < schemaLim; ++schemaNum ) { const XMP_Node * currSchema = source.tree.children[schemaNum]; for ( size_t propNum = 0, propLim = currSchema->children.size(); propNum < propLim; ++propNum ) { sourceNode = currSchema->children[propNum]; XMP_Node * copyNode = new XMP_Node ( destNode, sourceNode->name, sourceNode->value, sourceNode->options ); destNode->children.push_back ( copyNode ); CloneOffspring ( sourceNode, copyNode ); } } } else if ( fullDestTree ) { // The source node must be an existing struct, copy all of the fields to the dest top level. XMP_ExpandedXPath sourcePath; ExpandXPath ( sourceNS, sourceRoot, &sourcePath ); sourceNode = FindConstNode ( &source.tree, sourcePath ); if ( (sourceNode == 0) || (! XMP_PropIsStruct ( sourceNode->options )) ) { XMP_Throw ( "Source must be an existing struct", kXMPErr_BadXPath ); } destNode = &dest->tree; if ( ! destNode->children.empty() ) { if ( options & kXMP_DeleteExisting ) { destNode->RemoveChildren(); } else { XMP_Throw ( "Destination tree must be empty", kXMPErr_BadXPath ); } } std::string nsPrefix; XMP_StringPtr nsURI; XMP_StringLen nsLen; for ( size_t fieldNum = 0, fieldLim = sourceNode->children.size(); fieldNum < fieldLim; ++fieldNum ) { const XMP_Node * currField = sourceNode->children[fieldNum]; size_t colonPos = currField->name.find ( ':' ); nsPrefix.assign ( currField->name.c_str(), colonPos ); bool nsOK = XMPMeta::GetNamespaceURI ( nsPrefix.c_str(), &nsURI, &nsLen ); if ( ! nsOK ) XMP_Throw ( "Source field namespace is not global", kXMPErr_BadSchema ); XMP_Node * destSchema = FindSchemaNode ( &dest->tree, nsURI, kXMP_CreateNodes ); if ( destSchema == 0 ) XMP_Throw ( "Failed to find destination schema", kXMPErr_BadSchema ); XMP_Node * copyNode = new XMP_Node ( destSchema, currField->name, currField->value, currField->options ); destSchema->children.push_back ( copyNode ); CloneOffspring ( currField, copyNode ); } } else { // Find the root nodes for the source and destination subtrees. ExpandXPath ( sourceNS, sourceRoot, &sourcePath ); ExpandXPath ( destNS, destRoot, &destPath ); sourceNode = FindConstNode ( &source.tree, sourcePath ); if ( sourceNode == 0 ) XMP_Throw ( "Can't find source subtree", kXMPErr_BadXPath ); destNode = FindNode ( &dest->tree, destPath, kXMP_ExistingOnly ); // Dest must not yet exist. if ( destNode != 0 ) XMP_Throw ( "Destination subtree must not exist", kXMPErr_BadXPath ); destNode = FindNode ( &dest->tree, destPath, kXMP_CreateNodes ); // Now create the dest. if ( destNode == 0 ) XMP_Throw ( "Can't create destination root node", kXMPErr_BadXPath ); // Make sure the destination is not within the source! The source can't be inside the destination // because the source already existed and the destination was just created. if ( &source == dest ) { for ( XMP_Node * testNode = destNode; testNode != 0; testNode = testNode->parent ) { if ( testNode == sourceNode ) { // *** delete the just-created dest root node XMP_Throw ( "Destination subtree is within the source subtree", kXMPErr_BadXPath ); } } } // *** Could use a CloneTree util here and maybe elsewhere. destNode->value = sourceNode->value; // *** Should use SetNode. destNode->options = sourceNode->options; CloneOffspring ( sourceNode, destNode ); } } // DuplicateSubtree // ================================================================================================= exempi-2.2.1/source/XMPCore/XMPMeta.hpp0000664000175000017500000002657312150230672014502 00000000000000#ifndef __XMPMeta_hpp__ #define __XMPMeta_hpp__ // ================================================================================================= // Copyright 2003 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" #include "XMP_Const.h" #include "XMPCore_Impl.hpp" #include "XMLParserAdapter.hpp" // ------------------------------------------------------------------------------------------------- #ifndef DumpXMLParseTree #define DumpXMLParseTree 0 #endif extern XMP_VarString * xdefaultName; // Needed in XMPMeta-Parse.cpp, MoveExplicitAliases. class XMPIterator; class XMPUtils; // ------------------------------------------------------------------------------------------------- class XMPMeta { public: static void GetVersionInfo ( XMP_VersionInfo * info ); static bool Initialize(); static void Terminate() RELEASE_NO_THROW; // --------------------------------------------------------------------------------------------- XMPMeta(); virtual ~XMPMeta() RELEASE_NO_THROW; // --------------------------------------------------------------------------------------------- static XMP_OptionBits GetGlobalOptions(); static void SetGlobalOptions ( XMP_OptionBits options ); // --------------------------------------------------------------------------------------------- static XMP_Status DumpNamespaces ( XMP_TextOutputProc outProc, void * refCon ); // --------------------------------------------------------------------------------------------- static bool RegisterNamespace ( XMP_StringPtr namespaceURI, XMP_StringPtr suggestedPrefix, XMP_StringPtr * registeredPrefix, XMP_StringLen * prefixSize ); static bool GetNamespacePrefix ( XMP_StringPtr namespaceURI, XMP_StringPtr * namespacePrefix, XMP_StringLen * prefixSize ); static bool GetNamespaceURI ( XMP_StringPtr namespacePrefix, XMP_StringPtr * namespaceURI, XMP_StringLen * uriSize ); static void DeleteNamespace ( XMP_StringPtr namespaceURI ); // --------------------------------------------------------------------------------------------- bool GetProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr * propValue, XMP_StringLen * valueSize, XMP_OptionBits * options ) const; bool GetArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, XMP_StringPtr * itemValue, XMP_StringLen * valueSize, XMP_OptionBits * options ) const; bool GetStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr * fieldValue, XMP_StringLen * valueSize, XMP_OptionBits * options ) const; bool GetQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, XMP_StringPtr * qualValue, XMP_StringLen * valueSize, XMP_OptionBits * options ) const; // --------------------------------------------------------------------------------------------- void SetProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr propValue, XMP_OptionBits options ); void SetArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, XMP_StringPtr itemValue, XMP_OptionBits options ); void AppendArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits arrayOptions, XMP_StringPtr itemValue, XMP_OptionBits options ); void SetStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, XMP_OptionBits options ); void SetQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, XMP_StringPtr qualValue, XMP_OptionBits options ); // --------------------------------------------------------------------------------------------- void DeleteProperty ( XMP_StringPtr schemaNS, XMP_StringPtr propName ); void DeleteArrayItem ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex ); void DeleteStructField ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName ); void DeleteQualifier ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName ); // --------------------------------------------------------------------------------------------- bool DoesPropertyExist ( XMP_StringPtr schemaNS, XMP_StringPtr propName ) const; bool DoesArrayItemExist ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex ) const; bool DoesStructFieldExist ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName ) const; bool DoesQualifierExist ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName ) const; // --------------------------------------------------------------------------------------------- bool GetLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, XMP_StringPtr * actualLang, XMP_StringLen * langSize, XMP_StringPtr * itemValue, XMP_StringLen * valueSize, XMP_OptionBits * options ) const; void SetLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang, XMP_StringPtr itemValue, XMP_OptionBits options ); void DeleteLocalizedText ( XMP_StringPtr schemaNS, XMP_StringPtr altTextName, XMP_StringPtr genericLang, XMP_StringPtr specificLang); // --------------------------------------------------------------------------------------------- bool GetProperty_Bool ( XMP_StringPtr schemaNS, XMP_StringPtr propName, bool * propValue, XMP_OptionBits * options ) const; bool GetProperty_Int ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int32 * propValue, XMP_OptionBits * options ) const; bool GetProperty_Int64 ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int64 * propValue, XMP_OptionBits * options ) const; bool GetProperty_Float ( XMP_StringPtr schemaNS, XMP_StringPtr propName, double * propValue, XMP_OptionBits * options ) const; bool GetProperty_Date ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_DateTime * propValue, XMP_OptionBits * options ) const; // --------------------------------------------------------------------------------------------- void SetProperty_Bool ( XMP_StringPtr schemaNS, XMP_StringPtr propName, bool propValue, XMP_OptionBits options ); void SetProperty_Int ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int32 propValue, XMP_OptionBits options ); void SetProperty_Int64 ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_Int64 propValue, XMP_OptionBits options ); void SetProperty_Float ( XMP_StringPtr schemaNS, XMP_StringPtr propName, double propValue, XMP_OptionBits options ); void SetProperty_Date ( XMP_StringPtr schemaNS, XMP_StringPtr propName, const XMP_DateTime & propValue, XMP_OptionBits options ); // --------------------------------------------------------------------------------------------- void GetObjectName ( XMP_StringPtr * namePtr, XMP_StringLen * nameLen ) const; void SetObjectName ( XMP_StringPtr name ); XMP_OptionBits GetObjectOptions() const; void SetObjectOptions ( XMP_OptionBits options ); void Sort(); void Erase(); void Clone ( XMPMeta * clone, XMP_OptionBits options ) const; XMP_Index CountArrayItems ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName ) const; void DumpObject ( XMP_TextOutputProc outProc, void * refCon ) const; // --------------------------------------------------------------------------------------------- void ParseFromBuffer ( XMP_StringPtr buffer, XMP_StringLen bufferSize, XMP_OptionBits options ); void SerializeToBuffer ( XMP_VarString * rdfString, XMP_OptionBits options, XMP_StringLen padding, XMP_StringPtr newline, XMP_StringPtr indent, XMP_Index baseIndent ) const; // ============================================================================================= // --------------------------------------------------------------------------------------------- // - Everything is built out of standard nodes. Each node has a name, value, option flags, a // vector of child nodes, and a vector of qualifier nodes. // // - The option flags are those passed to SetProperty and returned from GetProperty. They tell // if the node is simple, a struct or an array; whether it has qualifiers, etc. // // - The name of the node is an XML qualified name, of the form "prefix:simple-name". Since we // force all namespaces to be known and to have unique prefixes, this is semantically equivalent // to using a URI and simple name pair. // // - Although the value part is only for leaf properties and the children part is only for // structs and arrays, it is easier to simply have them in every node. This keeps things visible // so that debugging is easier // // - The top level node children are the namespaces that contain properties, the next level are // the top level properties, lower levels are the fields of structs or items of arrays. The name // of the top level nodes is just the namespace prefix, with the colon terminator. The name of // top level properties includes the namespace prefix. // // - Any property node, at any level, can have qualifiers. These are themselves general property // nodes. And could in fact themselves have qualifiers! // ! Expose the implementation so that file static functions can see the data. XMP_Int32 clientRefs; // ! Must be signed to allow decrement from 0. XMP_ReadWriteLock lock; // ! Any data member changes must be propagted to the Clone function! XMP_Int32 prevTkVer; // Previous toolkit version as MMmmuubbb (major, minor, micro, build). XMP_Node tree; XMLParserAdapter * xmlParser; friend class XMPIterator; friend class XMPUtils; private: // ! These are hidden on purpose: XMPMeta ( const XMPMeta & /* original */ ) : clientRefs(0), prevTkVer(0), tree(XMP_Node(0,"",0)), xmlParser(0) { XMP_Throw ( "Call to hidden constructor", kXMPErr_InternalFailure ); }; void operator= ( const XMPMeta & /* rhs */ ) { XMP_Throw ( "Call to hidden operator=", kXMPErr_InternalFailure ); }; }; // class XMPMeta // ================================================================================================= #endif // __XMPMeta_hpp__ exempi-2.2.1/source/XMPCore/XMPUtils.hpp0000664000175000017500000001241312150230672014700 00000000000000#ifndef __XMPUtils_hpp__ #define __XMPUtils_hpp__ // ================================================================================================= // Copyright 2003 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" #include "XMP_Const.h" #include "XMPMeta.hpp" #include "XMPCore_Impl.hpp" #include "client-glue/WXMPUtils.hpp" // ------------------------------------------------------------------------------------------------- class XMPUtils { public: static bool Initialize(); // ! For internal use only! static void Terminate() RELEASE_NO_THROW; // ! For internal use only! // --------------------------------------------------------------------------------------------- static void ComposeArrayItemPath ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_Index itemIndex, XMP_VarString * fullPath ); static void ComposeStructFieldPath ( XMP_StringPtr schemaNS, XMP_StringPtr structName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_VarString * fullPath ); static void ComposeQualifierPath ( XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr qualNS, XMP_StringPtr qualName, XMP_VarString * fullPath ); static void ComposeLangSelector ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr langName, XMP_VarString * fullPath ); static void ComposeFieldSelector ( XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr fieldNS, XMP_StringPtr fieldName, XMP_StringPtr fieldValue, XMP_VarString * fullPath ); // --------------------------------------------------------------------------------------------- static void ConvertFromBool ( bool binValue, XMP_VarString * strValue ); static void ConvertFromInt ( XMP_Int32 binValue, XMP_StringPtr format, XMP_VarString * strValue ); static void ConvertFromInt64 ( XMP_Int64 binValue, XMP_StringPtr format, XMP_VarString * strValue ); static void ConvertFromFloat ( double binValue, XMP_StringPtr format, XMP_VarString * strValue ); static void ConvertFromDate ( const XMP_DateTime & binValue, XMP_VarString * strValue ); // --------------------------------------------------------------------------------------------- static bool ConvertToBool ( XMP_StringPtr strValue ); static XMP_Int32 ConvertToInt ( XMP_StringPtr strValue ); static XMP_Int64 ConvertToInt64 ( XMP_StringPtr strValue ); static double ConvertToFloat ( XMP_StringPtr strValue ); static void ConvertToDate ( XMP_StringPtr strValue, XMP_DateTime * binValue ); // --------------------------------------------------------------------------------------------- static void CurrentDateTime ( XMP_DateTime * time ); static void SetTimeZone ( XMP_DateTime * time ); static void ConvertToUTCTime ( XMP_DateTime * time ); static void ConvertToLocalTime ( XMP_DateTime * time ); static int CompareDateTime ( const XMP_DateTime & left, const XMP_DateTime & right ); // --------------------------------------------------------------------------------------------- static void EncodeToBase64 ( XMP_StringPtr rawStr, XMP_StringLen rawLen, XMP_VarString * encodedStr ); static void DecodeFromBase64 ( XMP_StringPtr encodedStr, XMP_StringLen encodedLen, XMP_VarString * rawStr ); // --------------------------------------------------------------------------------------------- static void PackageForJPEG ( const XMPMeta & xmpObj, XMP_VarString * stdStr, XMP_VarString * extStr, XMP_VarString * digestStr ); static void MergeFromJPEG ( XMPMeta * fullXMP, const XMPMeta & extendedXMP ); // --------------------------------------------------------------------------------------------- static void CatenateArrayItems ( const XMPMeta & xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_StringPtr separator, XMP_StringPtr quotes, XMP_OptionBits options, XMP_VarString * catedStr ); static void SeparateArrayItems ( XMPMeta * xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr arrayName, XMP_OptionBits options, XMP_StringPtr catedStr ); static void ApplyTemplate ( XMPMeta * workingXMP, const XMPMeta & templateXMP, XMP_OptionBits actions ); static void RemoveProperties ( XMPMeta * xmpObj, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_OptionBits options ); static void DuplicateSubtree ( const XMPMeta & source, XMPMeta * dest, XMP_StringPtr sourceNS, XMP_StringPtr sourceRoot, XMP_StringPtr destNS, XMP_StringPtr destRoot, XMP_OptionBits options ); }; // XMPUtils // ================================================================================================= #endif // __XMPUtils_hpp__ exempi-2.2.1/source/XMPCore/Makefile.am0000664000175000017500000000453512150230672014544 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # noinst_LTLIBRARIES = libXMPCore.la INCLUDES = -I$(top_srcdir)/public/include \ -I$(top_srcdir)/public/include/client-glue \ -I$(top_srcdir)/build/ \ -I$(srcdir)/../common/ \ -I$(top_srcdir)/third-party/MD5 AM_CXXFLAGS = -Wno-multichar -Wno-ctor-dtor-privacy \ -funsigned-char -fexceptions AM_CPPFLAGS = -Wall \ -D@EXEMPI_PLATFORM_DEF@=1 -DXMP_IMPL=1 -DXMP_ClientBuild=0 \ -D_FILE_OFFSET_BITS=64 -DHAVE_EXPAT_CONFIG_H=1 -DXML_STATIC=1 noinst_HEADERS = \ XMPCore_Impl.hpp XMPIterator.hpp \ XMPMeta.hpp XMPUtils.hpp libXMPCore_la_SOURCES = ExpatAdapter.cpp \ WXMPIterator.cpp \ WXMPUtils.cpp \ XMPIterator.cpp \ XMPMeta-GetSet.cpp \ XMPMeta-Serialize.cpp \ XMPUtils-FileInfo.cpp \ ParseRDF.cpp \ WXMPMeta.cpp \ XMPCore_Impl.cpp \ XMPMeta.cpp \ XMPMeta-Parse.cpp \ XMPUtils.cpp exempi-2.2.1/source/XMPCore/XMPCore_Impl.cpp0000664000175000017500000014173112150230672015452 00000000000000// ================================================================================================= // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include! #include "XMP_Version.h" #include "XMPCore_Impl.hpp" #include "XMPMeta.hpp" // *** For use of GetNamespacePrefix in FindSchemaNode. #include "UnicodeInlines.incl_cpp" #include using namespace std; #if XMP_WinBuild #pragma warning ( disable : 4290 ) // C++ exception specification ignored except ... not __declspec(nothrow) #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #endif // *** Add debug codegen checks, e.g. that typical masking operations really work // *** Make option constants 0x...UL. // Internal code should be using #if with XMP_MacBuild, XMP_WinBuild, or XMP_UNIXBuild. // This is a sanity check in case of accidental use of *_ENV. Some clients use the poor // practice of defining the *_ENV macro with an empty value. #if defined ( MAC_ENV ) #if ! MAC_ENV #error "MAC_ENV must be defined so that \"#if MAC_ENV\" is true" #endif #elif defined ( WIN_ENV ) #if ! WIN_ENV #error "WIN_ENV must be defined so that \"#if WIN_ENV\" is true" #endif #elif defined ( UNIX_ENV ) #if ! UNIX_ENV #error "UNIX_ENV must be defined so that \"#if UNIX_ENV\" is true" #endif #endif // ================================================================================================= // Static Variables // ================ XMP_Int32 sXMP_InitCount = 0; XMP_NamespaceTable * sRegisteredNamespaces = 0; XMP_AliasMap * sRegisteredAliasMap = 0; void * voidVoidPtr = 0; // Used to backfill null output parameters. XMP_StringPtr voidStringPtr = 0; XMP_StringLen voidStringLen = 0; XMP_OptionBits voidOptionBits = 0; XMP_Uns8 voidByte = 0; bool voidBool = 0; XMP_Int32 voidInt32 = 0; XMP_Int64 voidInt64 = 0; double voidDouble = 0.0; XMP_DateTime voidDateTime; WXMP_Result void_wResult; // ================================================================================================= // Local Utilities // =============== // ------------------------------------------------------------------------------------------------- // VerifyXPathRoot // --------------- // // Set up the first 2 components of the expanded XPath. Normalizes the various cases of using the // full schema URI and/or a qualified root property name. Returns true for normal processing. If // allowUnknownSchemaNS is true and the schema namespace is not registered, false is returned. If // allowUnknownSchemaNS is false and the schema namespace is not registered, an exception is thrown. // *** Should someday check the full syntax. static void VerifyXPathRoot ( XMP_StringPtr schemaURI, XMP_StringPtr propName, XMP_ExpandedXPath * expandedXPath ) { // Do some basic checks on the URI and name. Try to lookup the URI. See if the name is qualified. XMP_Assert ( (schemaURI != 0) && (propName != 0) && (*propName != 0) ); XMP_Assert ( (expandedXPath != 0) && (expandedXPath->empty()) ); if ( *schemaURI == 0 ) XMP_Throw ( "Schema namespace URI is required", kXMPErr_BadSchema ); if ( (*propName == '?') || (*propName == '@') ) { XMP_Throw ( "Top level name must not be a qualifier", kXMPErr_BadXPath ); } for ( XMP_StringPtr ch = propName; *ch != 0; ++ch ) { if ( (*ch == '/') || (*ch == '[') ) { XMP_Throw ( "Top level name must be simple", kXMPErr_BadXPath ); } } XMP_StringPtr schemaPrefix; bool nsFound = sRegisteredNamespaces->GetPrefix ( schemaURI, &schemaPrefix, 0 ); if ( ! nsFound ) XMP_Throw ( "Unregistered schema namespace URI", kXMPErr_BadSchema ); XMP_StringPtr colonPos = propName; while ( (*colonPos != 0) && (*colonPos != ':') ) ++colonPos; VerifySimpleXMLName ( propName, colonPos ); // Verify the part before any colon. // Verify the various URI and prefix combinations. Initialize the expanded XPath. if ( *colonPos == 0 ) { // The propName is unqualified, use the schemaURI and associated prefix. expandedXPath->push_back ( XPathStepInfo ( schemaURI, kXMP_SchemaNode ) ); expandedXPath->push_back ( XPathStepInfo ( schemaPrefix, 0 ) ); (*expandedXPath)[kRootPropStep].step += propName; } else { // The propName is qualified. Make sure the prefix is legit. Use the associated URI and qualified name. size_t prefixLen = colonPos - propName + 1; // ! Include the colon. VerifySimpleXMLName ( colonPos+1, colonPos+strlen(colonPos) ); XMP_VarString prefix ( propName, prefixLen ); if ( prefix != schemaPrefix ) XMP_Throw ( "Schema namespace URI and prefix mismatch", kXMPErr_BadSchema ); expandedXPath->push_back ( XPathStepInfo ( schemaURI, kXMP_SchemaNode ) ); expandedXPath->push_back ( XPathStepInfo ( propName, 0 ) ); } } // VerifyXPathRoot // ------------------------------------------------------------------------------------------------- // VerifyQualName // -------------- static void VerifyQualName ( XMP_StringPtr qualName, XMP_StringPtr nameEnd ) { if ( qualName >= nameEnd ) XMP_Throw ( "Empty qualified name", kXMPErr_BadXPath ); XMP_StringPtr colonPos = qualName; while ( (colonPos < nameEnd) && (*colonPos != ':') ) ++colonPos; if ( (colonPos == qualName) || (colonPos >= nameEnd) ) XMP_Throw ( "Ill-formed qualified name", kXMPErr_BadXPath ); VerifySimpleXMLName ( qualName, colonPos ); VerifySimpleXMLName ( colonPos+1, nameEnd ); size_t prefixLen = colonPos - qualName + 1; // ! Include the colon. XMP_VarString prefix ( qualName, prefixLen ); bool nsFound = sRegisteredNamespaces->GetURI ( prefix.c_str(), 0, 0 ); if ( ! nsFound ) XMP_Throw ( "Unknown namespace prefix for qualified name", kXMPErr_BadXPath ); } // VerifyQualName // ------------------------------------------------------------------------------------------------- // FindIndexedItem // --------------- // // [index] An element of an array. // // Support the implicit creation of a new last item. static XMP_Index FindIndexedItem ( XMP_Node * arrayNode, const XMP_VarString & indexStep, bool createNodes ) { XMP_Index index = 0; size_t chLim = indexStep.size() - 1; XMP_Assert ( (chLim >= 2) && (indexStep[0] == '[') && (indexStep[chLim] == ']') ); for ( size_t chNum = 1; chNum != chLim; ++chNum ) { XMP_Assert ( ('0' <= indexStep[chNum]) && (indexStep[chNum] <= '9') ); index = (index * 10) + (indexStep[chNum] - '0'); if ( index < 0 ) { XMP_Throw ( "Array index overflow", kXMPErr_BadXPath ); // ! Overflow, not truly negative. } } --index; // Change to a C-style, zero based index. if ( index < 0 ) XMP_Throw ( "Array index must be larger than zero", kXMPErr_BadXPath ); if ( (index == (XMP_Index)arrayNode->children.size()) && createNodes ) { // Append a new last+1 node. XMP_Node * newItem = new XMP_Node ( arrayNode, kXMP_ArrayItemName, kXMP_NewImplicitNode ); arrayNode->children.push_back ( newItem ); } // ! Don't throw here for a too large index. SetProperty will throw, GetProperty will not. if ( index >= (XMP_Index)arrayNode->children.size() ) index = -1; return index; } // FindIndexedItem // ------------------------------------------------------------------------------------------------- // SplitNameAndValue // ----------------- // // Split the name and value parts for field and qualifier selectors: // // [qualName="value"] An element in an array of structs, chosen by a field value. // [?qualName="value"] An element in an array, chosen by a qualifier value. // // The value portion is a string quoted by ''' or '"'. The value may contain any character including // a doubled quoting character. The value may be empty. static void SplitNameAndValue ( const XMP_VarString & selStep, XMP_VarString * nameStr, XMP_VarString * valueStr ) { XMP_StringPtr partBegin = selStep.c_str(); XMP_StringPtr partEnd; const XMP_StringPtr valueEnd = partBegin + (selStep.size() - 2); const char quote = *valueEnd; XMP_Assert ( (*partBegin == '[') && (*(valueEnd+1) == ']') ); XMP_Assert ( (selStep.size() >= 6) && ((quote == '"') || (quote == '\'')) ); // Extract the name part. ++partBegin; // Skip the opening '['. if ( *partBegin == '?' ) ++partBegin; for ( partEnd = partBegin+1; *partEnd != '='; ++partEnd ) {}; nameStr->assign ( partBegin, (partEnd - partBegin) ); // Extract the value part, reducing doubled quotes. XMP_Assert ( *(partEnd+1) == quote ); partBegin = partEnd + 2; valueStr->erase(); valueStr->reserve ( valueEnd - partBegin ); // Maximum length, don't optimize doubled quotes. for ( partEnd = partBegin; partEnd < valueEnd; ++partEnd ) { if ( (*partEnd == quote) && (*(partEnd+1) == quote) ) { ++partEnd; valueStr->append ( partBegin, (partEnd - partBegin) ); partBegin = partEnd+1; // ! Loop will increment partEnd again. } } valueStr->append ( partBegin, (partEnd - partBegin) ); // ! The loop does not add the last part. } // SplitNameAndValue // ------------------------------------------------------------------------------------------------- // LookupQualSelector // ------------------ // // [?qualName="value"] An element in an array, chosen by a qualifier value. // // Note that we don't create implicit nodes for qualifier selectors, so no CreateNodes parameter. static XMP_Index LookupQualSelector ( XMP_Node * arrayNode, const XMP_VarString & qualName, XMP_VarString & qualValue ) { XMP_Index index; if ( qualName == "xml:lang" ) { // *** Should check that the value is legit RFC 1766/3066. NormalizeLangValue ( &qualValue ); index = LookupLangItem ( arrayNode, qualValue ) ; } else { XMP_Index itemLim; for ( index = 0, itemLim = arrayNode->children.size(); index != itemLim; ++index ) { const XMP_Node * currItem = arrayNode->children[index]; XMP_Assert ( currItem->parent == arrayNode ); size_t q, qualLim; for ( q = 0, qualLim = currItem->qualifiers.size(); q != qualLim; ++q ) { const XMP_Node * currQual = currItem->qualifiers[q]; XMP_Assert ( currQual->parent == currItem ); if ( currQual->name != qualName ) continue; if ( currQual->value == qualValue ) break; // Exit qual loop. } if ( q != qualLim ) break; // Exit child loop, found an item with a matching qualifier. } if ( index == itemLim ) index = -1; } return index; } // LookupQualSelector // ------------------------------------------------------------------------------------------------- // FollowXPathStep // --------------- // // After processing by ExpandXPath, a step can be of these forms: // qualName A top level property or struct field. // [index] An element of an array. // [last()] The last element of an array. // [qualName="value"] An element in an array of structs, chosen by a field value. // [?qualName="value"] An element in an array, chosen by a qualifier value. // ?qualName A general qualifier. // // Find the appropriate child node, resolving aliases, and optionally creating nodes. static XMP_Node * FollowXPathStep ( XMP_Node * parentNode, const XMP_ExpandedXPath & fullPath, size_t stepNum, bool createNodes, XMP_NodePtrPos * ptrPos, bool aliasedArrayItem = false ) { XMP_Node * nextNode = 0; const XPathStepInfo & nextStep = fullPath[stepNum]; XMP_Index index = 0; XMP_OptionBits stepKind = nextStep.options & kXMP_StepKindMask; XMP_Assert ( (kXMP_StructFieldStep <= stepKind) && (stepKind <= kXMP_FieldSelectorStep) ); if ( stepKind == kXMP_StructFieldStep ) { nextNode = FindChildNode ( parentNode, nextStep.step.c_str(), createNodes, ptrPos ); } else if ( stepKind == kXMP_QualifierStep ) { XMP_StringPtr qualStep = nextStep.step.c_str(); XMP_Assert ( *qualStep == '?' ); ++qualStep; nextNode = FindQualifierNode ( parentNode, qualStep, createNodes, ptrPos ); } else { // This is an array indexing step. First get the index, then get the node. if ( ! (parentNode->options & kXMP_PropValueIsArray) ) { XMP_Throw ( "Indexing applied to non-array", kXMPErr_BadXPath ); } if ( stepKind == kXMP_ArrayIndexStep ) { index = FindIndexedItem ( parentNode, nextStep.step, createNodes ); } else if ( stepKind == kXMP_ArrayLastStep ) { index = parentNode->children.size() - 1; } else if ( stepKind == kXMP_FieldSelectorStep ) { XMP_VarString fieldName, fieldValue; SplitNameAndValue ( nextStep.step, &fieldName, &fieldValue ); index = LookupFieldSelector ( parentNode, fieldName.c_str(), fieldValue.c_str() ); } else if ( stepKind == kXMP_QualSelectorStep ) { XMP_VarString qualName, qualValue; SplitNameAndValue ( nextStep.step, &qualName, &qualValue ); index = LookupQualSelector ( parentNode, qualName, qualValue ); } else { XMP_Throw ( "Unknown array indexing step in FollowXPathStep", kXMPErr_InternalFailure ); } if ( (0 <= index) && (index <= (XMP_Index)parentNode->children.size()) ) nextNode = parentNode->children[index]; if ( (index == -1) && createNodes && aliasedArrayItem && (stepKind == kXMP_QualSelectorStep) ) { // An ugly special case without an obvious better place to be. We have an alias to the // x-default item of an alt-text array. A simple reference via SetProperty must create // the x-default item if it does not yet exist. XMP_Assert ( parentNode->options & kXMP_PropArrayIsAltText ); XMP_Assert ( (stepNum == 2) && (nextStep.step == "[?xml:lang=\"x-default\"]") ); nextNode = new XMP_Node ( parentNode, kXMP_ArrayItemName, (kXMP_PropHasQualifiers | kXMP_PropHasLang | kXMP_NewImplicitNode) ); XMP_Node * langQual = new XMP_Node ( nextNode, "xml:lang", "x-default", kXMP_PropIsQualifier ); nextNode->qualifiers.push_back ( langQual ); if ( parentNode->children.empty() ) { parentNode->children.push_back ( nextNode ); } else { parentNode->children.insert ( parentNode->children.begin(), nextNode ); } index = 0; // ! C-style index! The x-default item is always first. } if ( (nextNode != 0) && (ptrPos != 0) ) *ptrPos = parentNode->children.begin() + index; } if ( (nextNode != 0) && (nextNode->options & kXMP_NewImplicitNode) ) { nextNode->options |= (nextStep.options & kXMP_PropArrayFormMask); } XMP_Assert ( (ptrPos == 0) || (nextNode == 0) || (nextNode == **ptrPos) ); XMP_Assert ( (nextNode != 0) || (! createNodes) ); return nextNode; } // FollowXPathStep // ------------------------------------------------------------------------------------------------- // CheckImplicitStruct // ------------------- static inline void CheckImplicitStruct ( XMP_Node * node, const XMP_ExpandedXPath & expandedXPath, size_t stepNum, size_t stepLim ) { if ( (stepNum < stepLim) && ((node->options & kXMP_PropCompositeMask) == 0) && (GetStepKind ( expandedXPath[stepNum].options ) == kXMP_StructFieldStep) ) { node->options |= kXMP_PropValueIsStruct; } } // CheckImplicitStruct // ------------------------------------------------------------------------------------------------- // DeleteSubtree // ------------- void DeleteSubtree ( XMP_NodePtrPos rootNodePos ) { XMP_Node * rootNode = *rootNodePos; XMP_Node * rootParent = rootNode->parent; if ( ! (rootNode->options & kXMP_PropIsQualifier) ) { rootParent->children.erase ( rootNodePos ); } else { rootParent->qualifiers.erase ( rootNodePos ); XMP_Assert ( rootParent->options & kXMP_PropHasQualifiers); if ( rootParent->qualifiers.empty() ) rootParent->options ^= kXMP_PropHasQualifiers; if ( rootNode->name == "xml:lang" ) { XMP_Assert ( rootParent->options & kXMP_PropHasLang); rootParent->options ^= kXMP_PropHasLang; } else if ( rootNode->name == "rdf:type" ) { XMP_Assert ( rootParent->options & kXMP_PropHasType); rootParent->options ^= kXMP_PropHasType; } } delete rootNode; } // DeleteSubtree // ================================================================================================= // ================================================================================================= // ================================================================================================= // VerifySetOptions // ================ // // Normalize and verify the option flags for SetProperty and similar functions. The allowed options // here are just those that apply to the property, that would be kept in the XMP_Node. Others that // affect the selection of the node or other processing must be removed by now. These are: // kXMP_InsertBeforeItem // kXMP_InsertAfterItem // kXMP_KeepQualifiers // kXMPUtil_AllowCommas enum { kXMP_AllSetOptionsMask = (kXMP_PropValueIsURI | kXMP_PropValueIsStruct | kXMP_PropValueIsArray | kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate | kXMP_PropArrayIsAltText | kXMP_DeleteExisting) }; XMP_OptionBits VerifySetOptions ( XMP_OptionBits options, XMP_StringPtr propValue ) { if ( options & kXMP_PropArrayIsAltText ) options |= kXMP_PropArrayIsAlternate; if ( options & kXMP_PropArrayIsAlternate ) options |= kXMP_PropArrayIsOrdered; if ( options & kXMP_PropArrayIsOrdered ) options |= kXMP_PropValueIsArray; if ( options & ~kXMP_AllSetOptionsMask ) { XMP_Throw ( "Unrecognized option flags", kXMPErr_BadOptions ); } if ( (options & kXMP_PropValueIsStruct) && (options & kXMP_PropValueIsArray) ) { XMP_Throw ( "IsStruct and IsArray options are mutually exclusive", kXMPErr_BadOptions ); } if ( (options & kXMP_PropValueOptionsMask) && (options & kXMP_PropCompositeMask) ) { XMP_Throw ( "Structs and arrays can't have \"value\" options", kXMPErr_BadOptions ); } if ( (propValue != 0) && (options & kXMP_PropCompositeMask) ) { XMP_Throw ( "Structs and arrays can't have string values", kXMPErr_BadOptions ); } return options; } // VerifySetOptions // ================================================================================================= // ComposeXPath // ============ // // Compose the canonical string form of an expanded XPath expression. extern void ComposeXPath ( const XMP_ExpandedXPath & expandedXPath, XMP_VarString * stringXPath ) { *stringXPath = expandedXPath[kRootPropStep].step; for ( size_t index = kRootPropStep+1; index < expandedXPath.size(); ++index ) { const XPathStepInfo & currStep = expandedXPath[index]; switch ( currStep.options & kXMP_StepKindMask ) { case kXMP_StructFieldStep : case kXMP_QualifierStep : *stringXPath += '/'; *stringXPath += currStep.step; break; case kXMP_ArrayIndexStep : case kXMP_ArrayLastStep : case kXMP_QualSelectorStep : case kXMP_FieldSelectorStep : *stringXPath += currStep.step; break; default: XMP_Throw ( "Unexpected", kXMPErr_InternalFailure ); } } } // ComposeXPath // ================================================================================================= // ExpandXPath // =========== // // Split an XPath expression apart at the conceptual steps, adding the root namespace prefix to the // first property component. The schema URI is put in the first (0th) slot in the expanded XPath. // Check if the top level component is an alias, but don't resolve it. // // In the most verbose case steps are separated by '/', and each step can be of these forms: // // qualName A top level property or struct field. // *[index] An element of an array. // *[last()] The last element of an array. // *[fieldName="value"] An element in an array of structs, chosen by a field value. // *[@xml:lang="value"] An element in an alt-text array, chosen by the xml:lang qualifier. // *[?qualName="value"] An element in an array, chosen by a qualifier value. // @xml:lang An xml:lang qualifier. // ?qualName A general qualifier. // // The logic is complicated though by shorthand for arrays, the separating '/' and leading '*' // are optional. These are all equivalent: array/*[2] array/[2] array*[2] array[2] // All of these are broken into the 2 steps "array" and "[2]". // // The value portion in the array selector forms is a string quoted by ''' or '"'. The value // may contain any character including a doubled quoting character. The value may be empty. // // The syntax isn't checked, but an XML name begins with a letter or '_', and contains letters, // digits, '.', '-', '_', and a bunch of special non-ASCII Unicode characters. An XML qualified // name is a pair of names separated by a colon. void ExpandXPath ( XMP_StringPtr schemaNS, XMP_StringPtr propPath, XMP_ExpandedXPath * expandedXPath ) { XMP_Assert ( (schemaNS != 0) && (propPath != 0) && (*propPath != 0) && (expandedXPath != 0) ); XMP_StringPtr stepBegin, stepEnd; XMP_StringPtr qualName, nameEnd; XMP_VarString currStep; qualName = nameEnd = NULL; size_t resCount = 2; // Guess at the number of steps. At least 2, plus 1 for each '/' or '['. for ( stepEnd = propPath; *stepEnd != 0; ++stepEnd ) { if ( (*stepEnd == '/') || (*stepEnd == '[') ) ++resCount; } expandedXPath->clear(); expandedXPath->reserve ( resCount ); // ------------------------------------------------------------------------------------------- // Pull out the first component and do some special processing on it: add the schema namespace // prefix and see if it is an alias. The start must be a qualName. stepBegin = propPath; stepEnd = stepBegin; while ( (*stepEnd != 0) && (*stepEnd != '/') && (*stepEnd != '[') && (*stepEnd != '*') ) ++stepEnd; if ( stepEnd == stepBegin ) XMP_Throw ( "Empty initial XPath step", kXMPErr_BadXPath ); currStep.assign ( stepBegin, (stepEnd - stepBegin) ); VerifyXPathRoot ( schemaNS, currStep.c_str(), expandedXPath ); XMP_OptionBits stepFlags = kXMP_StructFieldStep; if ( sRegisteredAliasMap->find ( (*expandedXPath)[kRootPropStep].step ) != sRegisteredAliasMap->end() ) { stepFlags |= kXMP_StepIsAlias; } (*expandedXPath)[kRootPropStep].options |= stepFlags; // ----------------------------------------------------- // Now continue to process the rest of the XPath string. while ( *stepEnd != 0 ) { stepBegin = stepEnd; if ( *stepBegin == '/' ) ++stepBegin; if ( *stepBegin == '*' ) { ++stepBegin; if ( *stepBegin != '[' ) XMP_Throw ( "Missing '[' after '*'", kXMPErr_BadXPath ); } stepEnd = stepBegin; if ( *stepBegin != '[' ) { // A struct field or qualifier. qualName = stepBegin; while ( (*stepEnd != 0) && (*stepEnd != '/') && (*stepEnd != '[') && (*stepEnd != '*') ) ++stepEnd; nameEnd = stepEnd; stepFlags = kXMP_StructFieldStep; // ! Touch up later, also changing '@' to '?'. } else { // One of the array forms. ++stepEnd; // Look at the character after the leading '['. if ( ('0' <= *stepEnd) && (*stepEnd <= '9') ) { // A numeric (decimal integer) array index. while ( (*stepEnd != 0) && ('0' <= *stepEnd) && (*stepEnd <= '9') ) ++stepEnd; if ( *stepEnd != ']' ) XMP_Throw ( "Missing ']' for integer array index", kXMPErr_BadXPath ); stepFlags = kXMP_ArrayIndexStep; } else { // Could be "[last()]" or one of the selector forms. Find the ']' or '='. while ( (*stepEnd != 0) && (*stepEnd != ']') && (*stepEnd != '=') ) ++stepEnd; if ( *stepEnd == 0 ) XMP_Throw ( "Missing ']' or '=' for array index", kXMPErr_BadXPath ); if ( *stepEnd == ']' ) { if ( strncmp ( "[last()", stepBegin, (stepEnd - stepBegin) ) != 0 ) { XMP_Throw ( "Invalid non-numeric array index", kXMPErr_BadXPath ); } stepFlags = kXMP_ArrayLastStep; } else { qualName = stepBegin+1; nameEnd = stepEnd; ++stepEnd; // Absorb the '=', remember the quote. const char quote = *stepEnd; if ( (quote != '\'') && (quote != '"') ) { XMP_Throw ( "Invalid quote in array selector", kXMPErr_BadXPath ); } ++stepEnd; // Absorb the leading quote. while ( *stepEnd != 0 ) { if ( *stepEnd == quote ) { if ( *(stepEnd+1) != quote ) break; ++stepEnd; } ++stepEnd; } if ( *stepEnd == 0 ) { XMP_Throw ( "No terminating quote for array selector", kXMPErr_BadXPath ); } ++stepEnd; // Absorb the trailing quote. stepFlags = kXMP_FieldSelectorStep; // ! Touch up later, also changing '@' to '?'. } } if ( *stepEnd != ']' ) XMP_Throw ( "Missing ']' for array index", kXMPErr_BadXPath ); ++stepEnd; } if ( stepEnd == stepBegin ) XMP_Throw ( "Empty XPath step", kXMPErr_BadXPath ); currStep.assign ( stepBegin, (stepEnd - stepBegin) ); if ( GetStepKind ( stepFlags ) == kXMP_StructFieldStep ) { if ( currStep[0] == '@' ) { currStep[0] = '?'; if ( currStep != "?xml:lang" ) XMP_Throw ( "Only xml:lang allowed with '@'", kXMPErr_BadXPath ); } if ( currStep[0] == '?' ) { ++qualName; stepFlags = kXMP_QualifierStep; } VerifyQualName ( qualName, nameEnd ); } else if ( GetStepKind ( stepFlags ) == kXMP_FieldSelectorStep ) { if ( currStep[1] == '@' ) { currStep[1] = '?'; if ( strncmp ( currStep.c_str(), "[?xml:lang=", 11 ) != 0 ) { XMP_Throw ( "Only xml:lang allowed with '@'", kXMPErr_BadXPath ); } } if ( currStep[1] == '?' ) { ++qualName; stepFlags = kXMP_QualSelectorStep; } VerifyQualName ( qualName, nameEnd ); } expandedXPath->push_back ( XPathStepInfo ( currStep, stepFlags ) ); } } // ExpandXPath // ================================================================================================= // FindSchemaNode // ============== // // Find or create a schema node. Returns a pointer to the node, and optionally an iterator for the // node's position in the top level vector of schema nodes. The iterator is unchanged if no schema // node (null) is returned. XMP_Node * FindSchemaNode ( XMP_Node * xmpTree, XMP_StringPtr nsURI, bool createNodes, XMP_NodePtrPos * ptrPos /* = 0 */ ) { XMP_Node * schemaNode = 0; XMP_Assert ( xmpTree->parent == 0 ); for ( size_t schemaNum = 0, schemaLim = xmpTree->children.size(); schemaNum != schemaLim; ++schemaNum ) { XMP_Node * currSchema = xmpTree->children[schemaNum]; XMP_Assert ( currSchema->parent == xmpTree ); if ( currSchema->name == nsURI ) { schemaNode = currSchema; if ( ptrPos != 0 ) *ptrPos = xmpTree->children.begin() + schemaNum; break; } } if ( (schemaNode == 0) && createNodes ) { schemaNode = new XMP_Node ( xmpTree, nsURI, (kXMP_SchemaNode | kXMP_NewImplicitNode) ); XMP_StringPtr prefixPtr; XMP_StringLen prefixLen; bool found = XMPMeta::GetNamespacePrefix ( nsURI, &prefixPtr, &prefixLen ); // *** Use map directly? XMP_Assert ( found ); schemaNode->value.assign ( prefixPtr, prefixLen ); xmpTree->children.push_back ( schemaNode ); if ( ptrPos != 0 ) *ptrPos = xmpTree->children.end() - 1; #if 0 // *** XMP_DebugBuild schemaNode->_valuePtr = schemaNode->value.c_str(); #endif } XMP_Assert ( (ptrPos == 0) || (schemaNode == 0) || (schemaNode == **ptrPos) ); XMP_Assert ( (schemaNode != 0) || (! createNodes) ); return schemaNode; } // FindSchemaNode // ================================================================================================= // FindChildNode // ============= // // Find or create a child node under a given parent node. Returns a pointer to the child node, and // optionally an iterator for the node's position in the parent's vector of children. The iterator // is unchanged if no child node (null) is returned. XMP_Node * FindChildNode ( XMP_Node * parent, XMP_StringPtr childName, bool createNodes, XMP_NodePtrPos * ptrPos /* = 0 */ ) { XMP_Node * childNode = 0; if ( ! (parent->options & (kXMP_SchemaNode | kXMP_PropValueIsStruct)) ) { if ( ! (parent->options & kXMP_NewImplicitNode) ) { XMP_Throw ( "Named children only allowed for schemas and structs", kXMPErr_BadXPath ); } if ( parent->options & kXMP_PropValueIsArray ) { XMP_Throw ( "Named children not allowed for arrays", kXMPErr_BadXPath ); } if ( ! createNodes ) { // *** Should be assert? If !createNodes, why is the parent a new implicit node? XMP_Throw ( "Parent is new implicit node, but createNodes is false", kXMPErr_InternalFailure ); } parent->options |= kXMP_PropValueIsStruct; } for ( size_t childNum = 0, childLim = parent->children.size(); childNum != childLim; ++childNum ) { XMP_Node * currChild = parent->children[childNum]; XMP_Assert ( currChild->parent == parent ); if ( currChild->name == childName ) { childNode = currChild; if ( ptrPos != 0 ) *ptrPos = parent->children.begin() + childNum; break; } } if ( (childNode == 0) && createNodes ) { childNode = new XMP_Node ( parent, childName, kXMP_NewImplicitNode ); parent->children.push_back ( childNode ); if ( ptrPos != 0 ) *ptrPos = parent->children.end() - 1; } XMP_Assert ( (ptrPos == 0) || (childNode == 0) || (childNode == **ptrPos) ); XMP_Assert ( (childNode != 0) || (! createNodes) ); return childNode; } // FindChildNode // ================================================================================================= // FindQualifierNode // ================= // // Find or create a qualifier node under a given parent node. Returns a pointer to the qualifier node, // and optionally an iterator for the node's position in the parent's vector of qualifiers. The iterator // is unchanged if no qualifier node (null) is returned. // // ! On entry, the qualName parameter must not have the leading '?' from the XPath step. XMP_Node * FindQualifierNode ( XMP_Node * parent, XMP_StringPtr qualName, bool createNodes, XMP_NodePtrPos * ptrPos /* = 0 */ ) // *** Require ptrPos internally & remove checks? { XMP_Node * qualNode = 0; XMP_Assert ( *qualName != '?' ); for ( size_t qualNum = 0, qualLim = parent->qualifiers.size(); qualNum != qualLim; ++qualNum ) { XMP_Node * currQual = parent->qualifiers[qualNum]; XMP_Assert ( currQual->parent == parent ); if ( currQual->name == qualName ) { qualNode = currQual; if ( ptrPos != 0 ) *ptrPos = parent->qualifiers.begin() + qualNum; break; } } if ( (qualNode == 0) && createNodes ) { qualNode = new XMP_Node ( parent, qualName, (kXMP_PropIsQualifier | kXMP_NewImplicitNode) ); parent->options |= kXMP_PropHasQualifiers; const bool isLang = XMP_LitMatch ( qualName, "xml:lang" ); const bool isType = XMP_LitMatch ( qualName, "rdf:type" ); const bool isSpecial = isLang | isType; if ( isLang ) { parent->options |= kXMP_PropHasLang; } else if ( isType ) { parent->options |= kXMP_PropHasType; } if ( parent->qualifiers.empty() || (! isSpecial) ) { parent->qualifiers.push_back ( qualNode ); if ( ptrPos != 0 ) *ptrPos = parent->qualifiers.end() - 1; } else { XMP_NodePtrPos insertPos = parent->qualifiers.begin(); // ! Lang goes first, type after. if ( isType && (parent->options & kXMP_PropHasLang) ) ++insertPos; // *** Does insert at end() work? insertPos = parent->qualifiers.insert ( insertPos, qualNode ); if ( ptrPos != 0 ) *ptrPos = insertPos; } } XMP_Assert ( (ptrPos == 0) || (qualNode == 0) || (qualNode == **ptrPos) ); XMP_Assert ( (qualNode != 0) || (! createNodes) ); return qualNode; } // FindQualifierNode // ================================================================================================= // LookupFieldSelector // =================== // // [fieldName="value"] An element in an array of structs, chosen by a field value. // // Note that we don't create implicit nodes for field selectors, so no CreateNodes parameter. XMP_Index LookupFieldSelector ( const XMP_Node * arrayNode, XMP_StringPtr fieldName, XMP_StringPtr fieldValue ) { XMP_Index index, itemLim; for ( index = 0, itemLim = arrayNode->children.size(); index != itemLim; ++index ) { const XMP_Node * currItem = arrayNode->children[index]; XMP_Assert ( currItem->parent == arrayNode ); if ( ! (currItem->options & kXMP_PropValueIsStruct) ) { XMP_Throw ( "Field selector must be used on array of struct", kXMPErr_BadXPath ); } size_t f, fieldLim; for ( f = 0, fieldLim = currItem->children.size(); f != fieldLim; ++f ) { const XMP_Node * currField = currItem->children[f]; XMP_Assert ( currField->parent == currItem ); if ( currField->name != fieldName ) continue; if ( currField->value == fieldValue ) break; // Exit qual loop. } if ( f != fieldLim ) break; // Exit child loop, found an item with a matching qualifier. } if ( index == itemLim ) index = -1; return index; } // LookupFieldSelector // ================================================================================================= // LookupLangItem // ============== // // ! Assumes that the language value is already normalized. XMP_Index LookupLangItem ( const XMP_Node * arrayNode, XMP_VarString & lang ) { if ( ! (arrayNode->options & kXMP_PropValueIsArray) ) { // *** Check for alt-text? XMP_Throw ( "Language item must be used on array", kXMPErr_BadXPath ); } XMP_Index index = 0; XMP_Index itemLim = arrayNode->children.size(); for ( ; index != itemLim; ++index ) { const XMP_Node * currItem = arrayNode->children[index]; XMP_Assert ( currItem->parent == arrayNode ); if ( currItem->qualifiers.empty() || (currItem->qualifiers[0]->name != "xml:lang") ) continue; if ( currItem->qualifiers[0]->value == lang ) break; } if ( index == itemLim ) index = -1; return index; } // LookupLangItem // ================================================================================================= // FindNode // ======== // // Follow an expanded path expression to find or create a node. Returns a pointer to the node, and // optionally an iterator for the node's position in the parent's vector of children or qualifiers. // The iterator is unchanged if no child node (null) is returned. XMP_Node * FindNode ( XMP_Node * xmpTree, const XMP_ExpandedXPath & expandedXPath, bool createNodes, XMP_OptionBits leafOptions /* = 0 */, XMP_NodePtrPos * ptrPos /* = 0 */ ) { XMP_Node * currNode = 0; XMP_NodePtrPos currPos; XMP_NodePtrPos newSubPos; // Root of implicitly created subtree. Valid only if leaf is new. bool leafIsNew = false; XMP_Assert ( (leafOptions == 0) || createNodes ); if ( expandedXPath.empty() ) XMP_Throw ( "Empty XPath", kXMPErr_BadXPath ); size_t stepNum = 1; // By default start calling FollowXPathStep for the top level property step. size_t stepLim = expandedXPath.size(); // The start of processing deals with the schema node and top level alias. If the top level step // is not an alias, lookup the expanded path's schema URI. Otherwise, lookup the expanded path // for the actual. While tempting, don't substitute the actual's path into the local one, don't // risk messing with the caller's use of that. Also don't call FindNode recursively, we need to // keep track of the root of the implicitly created subtree as we move down the path. if ( ! (expandedXPath[kRootPropStep].options & kXMP_StepIsAlias) ) { currNode = FindSchemaNode ( xmpTree, expandedXPath[kSchemaStep].step.c_str(), createNodes, &currPos ); if ( currNode == 0 ) return 0; if ( currNode->options & kXMP_NewImplicitNode ) { currNode->options ^= kXMP_NewImplicitNode; // Clear the implicit node bit. if ( ! leafIsNew ) newSubPos = currPos; // Save the top most implicit node. leafIsNew = true; // If any parent is new, the leaf will be new also. } } else { stepNum = 2; // ! Continue processing the original path at the second level step. XMP_AliasMapPos aliasPos = sRegisteredAliasMap->find ( expandedXPath[kRootPropStep].step ); XMP_Assert ( aliasPos != sRegisteredAliasMap->end() ); currNode = FindSchemaNode ( xmpTree, aliasPos->second[kSchemaStep].step.c_str(), createNodes, &currPos ); if ( currNode == 0 ) goto EXIT; if ( currNode->options & kXMP_NewImplicitNode ) { currNode->options ^= kXMP_NewImplicitNode; // Clear the implicit node bit. if ( ! leafIsNew ) newSubPos = currPos; // Save the top most implicit node. leafIsNew = true; // If any parent is new, the leaf will be new also. } currNode = FollowXPathStep ( currNode, aliasPos->second, 1, createNodes, &currPos ); if ( currNode == 0 ) goto EXIT; if ( currNode->options & kXMP_NewImplicitNode ) { currNode->options ^= kXMP_NewImplicitNode; // Clear the implicit node bit. CheckImplicitStruct ( currNode, expandedXPath, 2, stepLim ); if ( ! leafIsNew ) newSubPos = currPos; // Save the top most implicit node. leafIsNew = true; // If any parent is new, the leaf will be new also. } XMP_OptionBits arrayForm = aliasPos->second[kRootPropStep].options & kXMP_PropArrayFormMask; XMP_Assert ( (arrayForm == 0) || (arrayForm & kXMP_PropValueIsArray) ); XMP_Assert ( (arrayForm == 0) ? (aliasPos->second.size() == 2) : (aliasPos->second.size() == 3) ); if ( arrayForm != 0 ) { currNode = FollowXPathStep ( currNode, aliasPos->second, 2, createNodes, &currPos, true ); if ( currNode == 0 ) goto EXIT; if ( currNode->options & kXMP_NewImplicitNode ) { currNode->options ^= kXMP_NewImplicitNode; // Clear the implicit node bit. CheckImplicitStruct ( currNode, expandedXPath, 2, stepLim ); if ( ! leafIsNew ) newSubPos = currPos; // Save the top most implicit node. leafIsNew = true; // If any parent is new, the leaf will be new also. } } } // Now follow the remaining steps of the original XPath. // *** ??? Change all the num/lim loops back to numoptions & kXMP_NewImplicitNode ) { currNode->options ^= kXMP_NewImplicitNode; // Clear the implicit node bit. CheckImplicitStruct ( currNode, expandedXPath, stepNum+1, stepLim ); if ( ! leafIsNew ) newSubPos = currPos; // Save the top most implicit node. leafIsNew = true; // If any parent is new, the leaf will be new also. } } } catch ( ... ) { if ( leafIsNew ) DeleteSubtree ( newSubPos ); throw; } // Done. Delete the implicitly created subtree if the eventual node was not found. EXIT: XMP_Assert ( (currNode == 0) || (currNode == *currPos) ); XMP_Assert ( (currNode != 0) || (! createNodes) ); if ( leafIsNew ) { if ( currNode != 0 ) { currNode->options |= leafOptions; } else { DeleteSubtree ( newSubPos ); } } if ( (currNode != 0) && (ptrPos != 0) ) *ptrPos = currPos; return currNode; } // FindNode // ================================================================================================= // CloneOffspring // ============== void CloneOffspring ( const XMP_Node * origParent, XMP_Node * cloneParent, bool skipEmpty /* = false */ ) { size_t qualCount = origParent->qualifiers.size(); size_t childCount = origParent->children.size(); if ( qualCount > 0 ) { cloneParent->qualifiers.reserve ( qualCount ); for ( size_t qualNum = 0, qualLim = qualCount; qualNum != qualLim; ++qualNum ) { const XMP_Node * origQual = origParent->qualifiers[qualNum]; if ( skipEmpty && origQual->value.empty() && origQual->children.empty() ) continue; XMP_Node * cloneQual = new XMP_Node ( cloneParent, origQual->name, origQual->value, origQual->options ); CloneOffspring ( origQual, cloneQual, skipEmpty ); if ( skipEmpty && cloneQual->value.empty() && cloneQual->children.empty() ) { // Check again, might have had an array or struct with all empty children. delete cloneQual; continue; } cloneParent->qualifiers.push_back ( cloneQual ); } } if ( childCount > 0 ) { cloneParent->children.reserve ( childCount ); for ( size_t childNum = 0, childLim = childCount; childNum != childLim; ++childNum ) { const XMP_Node * origChild = origParent->children[childNum]; if ( skipEmpty && origChild->value.empty() && origChild->children.empty() ) continue; XMP_Node * cloneChild = new XMP_Node ( cloneParent, origChild->name, origChild->value, origChild->options ); CloneOffspring ( origChild, cloneChild, skipEmpty ); if ( skipEmpty && cloneChild->value.empty() && cloneChild->children.empty() ) { // Check again, might have had an array or struct with all empty children. delete cloneChild; continue; } cloneParent->children.push_back ( cloneChild ); } } } // CloneOffspring // ================================================================================================= // CloneSubtree // ============ XMP_Node * CloneSubtree ( const XMP_Node * origRoot, XMP_Node * cloneParent, bool skipEmpty /* = false */ ) { #if XMP_DebugBuild if ( cloneParent->parent == 0 ) { XMP_Assert ( origRoot->options & kXMP_SchemaNode ); XMP_Assert ( FindConstSchema ( cloneParent, origRoot->name.c_str() ) == 0 ); } else { XMP_Assert ( ! (origRoot->options & kXMP_SchemaNode) ); if ( cloneParent->options & kXMP_PropValueIsStruct ) { // Might be an array. XMP_Assert ( FindConstChild ( cloneParent, origRoot->name.c_str() ) == 0 ); } } #endif XMP_Node * cloneRoot = new XMP_Node ( cloneParent, origRoot->name, origRoot->value, origRoot->options ); CloneOffspring ( origRoot, cloneRoot, skipEmpty ) ; if ( skipEmpty && cloneRoot->value.empty() && cloneRoot->children.empty() ) { // ! Can't do earlier, CloneOffspring might be skipping empty children. delete cloneRoot; return 0; } cloneParent->children.push_back ( cloneRoot ); return cloneRoot; } // CloneSubtree // ================================================================================================= // CompareSubtrees // =============== // // Compare 2 subtrees for semantic equality. The comparison includes value, qualifiers, and form. // Schemas, top level properties, struct fields, and qualifiers are allowed to have differing order, // the appropriate right node is found from the left node's name. Alt-text arrays are allowed to be // in differing language order, other arrays are compared in order. // *** Might someday consider sorting unordered arrays. // *** Should expose this through XMPUtils. bool CompareSubtrees ( const XMP_Node & leftNode, const XMP_Node & rightNode ) { // Don't compare the names here, we want to allow the outermost roots to have different names. if ( (leftNode.value != rightNode.value) || (leftNode.options != rightNode.options) || (leftNode.children.size() != rightNode.children.size()) || (leftNode.qualifiers.size() != rightNode.qualifiers.size()) ) return false; // Compare the qualifiers, allowing them to be out of order. for ( size_t qualNum = 0, qualLim = leftNode.qualifiers.size(); qualNum != qualLim; ++qualNum ) { const XMP_Node * leftQual = leftNode.qualifiers[qualNum]; const XMP_Node * rightQual = FindConstQualifier ( &rightNode, leftQual->name.c_str() ); if ( (rightQual == 0) || (! CompareSubtrees ( *leftQual, *rightQual )) ) return false; } if ( (leftNode.parent == 0) || (leftNode.options & (kXMP_SchemaNode | kXMP_PropValueIsStruct)) ) { // The parent node is a tree root, a schema, or a struct. for ( size_t childNum = 0, childLim = leftNode.children.size(); childNum != childLim; ++childNum ) { const XMP_Node * leftChild = leftNode.children[childNum]; const XMP_Node * rightChild = FindConstChild ( &rightNode, leftChild->name.c_str() ); if ( (rightChild == 0) || (! CompareSubtrees ( *leftChild, *rightChild )) ) return false; } } else if ( leftNode.options & kXMP_PropArrayIsAltText ) { // The parent node is an alt-text array. for ( size_t childNum = 0, childLim = leftNode.children.size(); childNum != childLim; ++childNum ) { const XMP_Node * leftChild = leftNode.children[childNum]; XMP_Assert ( (! leftChild->qualifiers.empty()) && (leftChild->qualifiers[0]->name == "xml:lang") ); XMP_Index rightIndex = LookupLangItem ( &rightNode, leftChild->qualifiers[0]->value ); if ( rightIndex == -1 ) return false; const XMP_Node * rightChild = rightNode.children[rightIndex]; if ( ! CompareSubtrees ( *leftChild, *rightChild ) ) return false; } } else { // The parent must be simple or some other (not alt-text) kind of array. XMP_Assert ( (! (leftNode.options & kXMP_PropCompositeMask)) || (leftNode.options & kXMP_PropValueIsArray) ); for ( size_t childNum = 0, childLim = leftNode.children.size(); childNum != childLim; ++childNum ) { const XMP_Node * leftChild = leftNode.children[childNum]; const XMP_Node * rightChild = rightNode.children[childNum]; if ( ! CompareSubtrees ( *leftChild, *rightChild ) ) return false; } } return true; } // CompareSubtrees // ================================================================================================= // DeleteEmptySchema // ================= void DeleteEmptySchema ( XMP_Node * schemaNode ) { if ( XMP_NodeIsSchema ( schemaNode->options ) && schemaNode->children.empty() ) { XMP_Node * xmpTree = schemaNode->parent; size_t schemaNum = 0; size_t schemaLim = xmpTree->children.size(); while ( (schemaNum < schemaLim) && (xmpTree->children[schemaNum] != schemaNode) ) ++schemaNum; XMP_Assert ( schemaNum < schemaLim ); XMP_NodePtrPos schemaPos = xmpTree->children.begin() + schemaNum; XMP_Assert ( *schemaPos == schemaNode ); xmpTree->children.erase ( schemaPos ); delete schemaNode; } } // DeleteEmptySchema // ================================================================================================= // NormalizeLangValue // ================== // // Normalize an xml:lang value so that comparisons are effectively case insensitive as required by // RFC 3066 (which superceeds RFC 1766). The normalization rules: // // - The primary subtag is lower case, the suggested practice of ISO 639. // - All 2 letter secondary subtags are upper case, the suggested practice of ISO 3166. // - All other subtags are lower case. void NormalizeLangValue ( XMP_VarString * value ) { char * tagStart; char * tagEnd; // Find and process the primary subtag. tagStart = (char*) value->c_str(); for ( tagEnd = tagStart; (*tagEnd != 0) && (*tagEnd != '-'); ++tagEnd ) { if ( ('A' <= *tagEnd) && (*tagEnd <= 'Z') ) *tagEnd += 0x20; } // Find and process the secondary subtag. tagStart = tagEnd; if ( *tagStart == '-' ) ++tagStart; for ( tagEnd = tagStart; (*tagEnd != 0) && (*tagEnd != '-'); ++tagEnd ) { if ( ('A' <= *tagEnd) && (*tagEnd <= 'Z') ) *tagEnd += 0x20; } if ( tagEnd == tagStart+2 ) { if ( ('a' <= *tagStart) && (*tagStart <= 'z') ) *tagStart -= 0x20; ++tagStart; if ( ('a' <= *tagStart) && (*tagStart <= 'z') ) *tagStart -= 0x20; } // Find and process the remaining subtags. while ( true ) { tagStart = tagEnd; if ( *tagStart == '-' ) ++tagStart; if ( *tagStart == 0 ) break; for ( tagEnd = tagStart; (*tagEnd != 0) && (*tagEnd != '-'); ++tagEnd ) { if ( ('A' <= *tagEnd) && (*tagEnd <= 'Z') ) *tagEnd += 0x20; } } } // NormalizeLangValue // ================================================================================================= // NormalizeLangArray // ================== // // Make sure the x-default item is first. Touch up "single value" arrays that have a default plus // one real language. This case should have the same value for both items. Older Adobe apps were // hardwired to only use the 'x-default' item, so we copy that value to the other item. void NormalizeLangArray ( XMP_Node * array ) { XMP_Assert ( XMP_ArrayIsAltText(array->options) ); size_t itemNum; size_t itemLim = array->children.size(); bool hasDefault = false; for ( itemNum = 0; itemNum < itemLim; ++itemNum ) { if ( array->children[itemNum]->qualifiers.empty() || (array->children[itemNum]->qualifiers[0]->name != "xml:lang") ) { XMP_Throw ( "AltText array items must have an xml:lang qualifier", kXMPErr_BadXMP ); } if ( array->children[itemNum]->qualifiers[0]->value == "x-default" ) { hasDefault = true; break; } } if ( hasDefault ) { if ( itemNum != 0 ) { XMP_Node * temp = array->children[0]; array->children[0] = array->children[itemNum]; array->children[itemNum] = temp; } if ( itemLim == 2 ) array->children[1]->value = array->children[0]->value; } } // NormalizeLangArray // ================================================================================================= // DetectAltText // ============= // // See if an array is an alt-text array. If so, make sure the x-default item is first. void DetectAltText ( XMP_Node * xmpParent ) { XMP_Assert ( XMP_ArrayIsAlternate(xmpParent->options) ); size_t itemNum, itemLim; for ( itemNum = 0, itemLim = xmpParent->children.size(); itemNum < itemLim; ++itemNum ) { XMP_OptionBits currOptions = xmpParent->children[itemNum]->options; if ( (currOptions & kXMP_PropCompositeMask) || (! (currOptions & kXMP_PropHasLang)) ) break; } if ( (itemLim != 0) && (itemNum == itemLim) ) { xmpParent->options |= kXMP_PropArrayIsAltText; NormalizeLangArray ( xmpParent ); } } // DetectAltText // ================================================================================================= // SortNamedNodes // ============== // // Sort the pointers in an XMP_NodeOffspring vector by name. static inline bool Compare ( const XMP_Node * left, const XMP_Node * right ) { return (left->name < right->name); } void SortNamedNodes ( XMP_NodeOffspring & nodeVector ) { sort ( nodeVector.begin(), nodeVector.end(), Compare ); } // SortNamedNodes // ================================================================================================= exempi-2.2.1/source/XMPFiles/0000775000175000017500000000000012163706252012741 500000000000000exempi-2.2.1/source/XMPFiles/FileHandlers/0000775000175000017500000000000012163706252015301 500000000000000exempi-2.2.1/source/XMPFiles/FileHandlers/GIF_Handler.hpp0000664000175000017500000000375312150230672017776 00000000000000#ifndef __GIF_Handler_hpp__ #define __GIF_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002-2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // Derived from PNG_Handler.hpp by Ian Jacobi // ================================================================================================= #include "GIF_Support.hpp" // ================================================================================================= /// \file GIF_Handler.hpp /// \brief File format handler for GIF. /// /// This header ... /// // ================================================================================================= // *** Could derive from Basic_Handler - buffer file tail in a temp file. extern XMPFileHandler* GIF_MetaHandlerCTor ( XMPFiles* parent ); extern bool GIF_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles* parent ); static const XMP_OptionBits kGIF_HandlerFlags = ( kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_PrefersInPlace | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_NeedsReadOnlyPacket ); class GIF_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessTNail(); void ProcessXMP(); void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string& sourcePath ); bool SafeWriteFile (); GIF_MetaHandler ( XMPFiles* parent ); virtual ~GIF_MetaHandler(); }; // GIF_MetaHandler // ================================================================================================= #endif /* __GIF_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/TIFF_Handler.hpp0000664000175000017500000000506212150230672020114 00000000000000#ifndef __TIFF_Handler_hpp__ #define __TIFF_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "TIFF_Support.hpp" #include "PSIR_Support.hpp" #include "IPTC_Support.hpp" // ================================================================================================= /// \file TIFF_Handler.hpp /// \brief File format handler for TIFF. /// /// This header ... /// // ================================================================================================= // *** Could derive from Basic_Handler - buffer file tail in a temp file. extern XMPFileHandler * TIFF_MetaHandlerCTor ( XMPFiles * parent ); extern bool TIFF_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); static const XMP_OptionBits kTIFF_HandlerFlags = (kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_CanRewrite | kXMPFiles_PrefersInPlace | kXMPFiles_CanReconcile | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_AllowsSafeUpdate); class TIFF_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessXMP(); void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); TIFF_MetaHandler ( XMPFiles * parent ); virtual ~TIFF_MetaHandler(); private: TIFF_MetaHandler() : psirMgr(0), iptcMgr(0) {}; // Hidden on purpose. TIFF_FileWriter tiffMgr; // The TIFF part is always file-based. PSIR_Manager * psirMgr; // Need to use pointers so we can properly select between read-only and IPTC_Manager * iptcMgr; // read-write modes of usage. }; // TIFF_MetaHandler // ================================================================================================= #endif /* __TIFF_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/JPEG_Handler.cpp0000664000175000017500000011540512150230672020107 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "JPEG_Handler.hpp" #include "TIFF_Support.hpp" #include "PSIR_Support.hpp" #include "IPTC_Support.hpp" #include "ReconcileLegacy.hpp" #include "Reconcile_Impl.hpp" #include "MD5.h" using namespace std; // ================================================================================================= /// \file JPEG_Handler.cpp /// \brief File format handler for JPEG. /// /// This handler ... /// // ================================================================================================= static const char * kExifSignatureString = "Exif\0\x00"; static const char * kExifSignatureAltStr = "Exif\0\xFF"; static const size_t kExifSignatureLength = 6; static const size_t kExifMaxDataLength = 0xFFFF - 2 - kExifSignatureLength; static const char * kPSIRSignatureString = "Photoshop 3.0\0"; static const size_t kPSIRSignatureLength = 14; static const size_t kPSIRMaxDataLength = 0xFFFF - 2 - kPSIRSignatureLength; static const char * kMainXMPSignatureString = "http://ns.adobe.com/xap/1.0/\0"; static const size_t kMainXMPSignatureLength = 29; static const char * kExtXMPSignatureString = "http://ns.adobe.com/xmp/extension/\0"; static const size_t kExtXMPSignatureLength = 35; static const size_t kExtXMPPrefixLength = kExtXMPSignatureLength + 32 + 4 + 4; typedef std::map < XMP_Uns32 /* offset */, std::string /* portion */ > ExtXMPPortions; struct ExtXMPContent { XMP_Uns32 length; ExtXMPPortions portions; ExtXMPContent() : length(0) {}; ExtXMPContent ( XMP_Uns32 _length ) : length(_length) {}; }; typedef std::map < JPEG_MetaHandler::GUID_32 /* guid */, ExtXMPContent /* content */ > ExtendedXMPInfo; #ifndef Trace_UnlimitedJPEG #define Trace_UnlimitedJPEG 0 #endif // ================================================================================================= // JPEG_MetaHandlerCTor // ==================== XMPFileHandler * JPEG_MetaHandlerCTor ( XMPFiles * parent ) { return new JPEG_MetaHandler ( parent ); } // JPEG_MetaHandlerCTor // ================================================================================================= // JPEG_CheckFormat // ================ // For JPEG we just check for the initial SOI standalone marker followed by any of the other markers // that might, well, follow it. A more aggressive check might be to read 4KB then check for legit // marker segments within that portion. Probably won't buy much, and thrashes the dCache more. We // tolerate only a small amount of 0xFF padding between the SOI and following marker. This formally // violates the rules of JPEG, but in practice there won't be any padding anyway. // // ! The CheckXyzFormat routines don't track the filePos, that is left to ScanXyzFile. bool JPEG_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ) { IgnoreParam(format); IgnoreParam(filePath); IgnoreParam(parent); XMP_Assert ( format == kXMP_JPEGFile ); IOBuffer ioBuf; LFA_Seek ( fileRef, 0, SEEK_SET ); if ( ! CheckFileSpace ( fileRef, &ioBuf, 4 ) ) return false; // We need at least 4, the buffer is filled anyway. // First look for the SOI standalone marker. Then skip all 0xFF bytes, padding plus the high // order byte of the next marker. Finally see if the next marker is legit. if ( ! CheckBytes ( ioBuf.ptr, "\xFF\xD8", 2 ) ) return false; ioBuf.ptr += 2; // Move past the SOI. while ( (ioBuf.ptr < ioBuf.limit) && (*ioBuf.ptr == 0xFF) ) ++ioBuf.ptr; if ( ioBuf.ptr == ioBuf.limit ) return false; XMP_Uns8 id = *ioBuf.ptr; if ( id >= 0xDD ) return true; // The most probable cases. if ( (id < 0xC0) || ((id & 0xF8) == 0xD0) || (id == 0xD8) || (id == 0xDA) || (id == 0xDC) ) return false; return true; } // JPEG_CheckFormat // ================================================================================================= // JPEG_MetaHandler::JPEG_MetaHandler // ================================== JPEG_MetaHandler::JPEG_MetaHandler ( XMPFiles * _parent ) : exifMgr(0), psirMgr(0), iptcMgr(0), skipReconcile(false) { this->parent = _parent; this->handlerFlags = kJPEG_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; } // JPEG_MetaHandler::JPEG_MetaHandler // ================================================================================================= // JPEG_MetaHandler::~JPEG_MetaHandler // =================================== JPEG_MetaHandler::~JPEG_MetaHandler() { if ( exifMgr != 0 ) delete ( exifMgr ); if ( psirMgr != 0 ) delete ( psirMgr ); if ( iptcMgr != 0 ) delete ( iptcMgr ); } // JPEG_MetaHandler::~JPEG_MetaHandler // ================================================================================================= // JPEG_MetaHandler::CacheFileData // =============================== // // Look for the Exif metadata, Photoshop image resources, and XMP in a JPEG (JFIF) file. The native // thumbnail is inside the Exif. The general layout of a JPEG file is: // SOI marker, 2 bytes, 0xFFD8 // Marker segments for tables and metadata // SOFn marker segment // Image data // EOI marker, 2 bytes, 0xFFD9 // // Each marker segment begins with a 2 byte big endian marker and a 2 byte big endian length. The // length includes the 2 bytes of the length field but not the marker. The high order byte of a // marker is 0xFF, the low order byte tells what kind of marker. A marker can be preceeded by any // number of 0xFF fill bytes, however there are no alignment constraints. // // There are virtually no constraints on the order of the marker segments before the SOFn. A reader // must be prepared to handle any order. // // The Exif metadata is in an APP1 marker segment with a 6 byte signature string of "Exif\0\0" at // the start of the data. The rest of the data is a TIFF stream. // // The Photoshop image resources are in an APP13 marker segment with a 14 byte signature string of // "Photoshop 3.0\0". The rest of the data is a sequence of image resources. // // The main XMP is in an APP1 marker segment with a 29 byte signature string of // "http://ns.adobe.com/xap/1.0/\0". The rest of the data is the serialized XMP packet. This is the // only XMP if everything fits within the 64KB limit for marker segment data. If not, there will be // a series of XMP extension segments. // // Each XMP extension segment is an APP1 marker segment whose data contains: // - A 35 byte signature string of "http://ns.adobe.com/xmp/extension/\0". // - A 128 bit GUID stored as 32 ASCII hex digits, capital A-F, no nul termination. // - A 32 bit unsigned integer length for the full extended XMP serialization. // - A 32 bit unsigned integer offset for this portion of the extended XMP serialization. // - A portion of the extended XMP serialization, up to about 65400 bytes (at most 65458). // // A reader must be prepared to encounter the extended XMP portions out of order. Also to encounter // defective files that have differing extended XMP according to the GUID. The main XMP contains the // GUID for the associated extended XMP. // *** This implementation simply returns when invalid JPEG is encountered. Should we throw instead? void JPEG_MetaHandler::CacheFileData() { LFA_FileRef fileRef = this->parent->fileRef; XMP_PacketInfo & packetInfo = this->packetInfo; size_t segLen; bool ok; IOBuffer ioBuf; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); ExtendedXMPInfo extXMP; XMP_Assert ( ! this->containsXMP ); // Set containsXMP to true here only if the standard XMP packet is found. XMP_Assert ( kPSIRSignatureLength == (strlen(kPSIRSignatureString) + 1) ); XMP_Assert ( kMainXMPSignatureLength == (strlen(kMainXMPSignatureString) + 1) ); XMP_Assert ( kExtXMPSignatureLength == (strlen(kExtXMPSignatureString) + 1) ); // ------------------------------------------------------------------------------------------- // Look for any of the Exif, PSIR, main XMP, or extended XMP marker segments. Quit when we hit // an SOFn, EOI, or invalid/unexpected marker. LFA_Seek ( fileRef, 2, SEEK_SET ); // Skip the SOI. The JPEG header has already been verified. ioBuf.filePos = 2; RefillBuffer ( fileRef, &ioBuf ); while ( true ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "JPEG_MetaHandler::CacheFileData - User abort", kXMPErr_UserAbort ); } if ( ! CheckFileSpace ( fileRef, &ioBuf, 2 ) ) return; if ( *ioBuf.ptr != 0xFF ) return; // All valid markers have a high byte of 0xFF. while ( *ioBuf.ptr == 0xFF ) { // Skip padding 0xFF bytes and the marker's high byte. ++ioBuf.ptr; if ( ! CheckFileSpace ( fileRef, &ioBuf, 1 ) ) return; } XMP_Uns16 marker = 0xFF00 + *ioBuf.ptr; if ( (marker == 0xFFDA) || (marker == 0xFFD9) ) break; // Quit reading at the first SOS marker or at EOI. if ( (marker == 0xFF01) || // Ill-formed file if we encounter a TEM or RSTn marker. ((0xFFD0 <= marker) && (marker <= 0xFFD7)) ) return; if ( marker == 0xFFED ) { // This is an APP13 marker, is it the Photoshop image resources? ++ioBuf.ptr; // Move ioBuf.ptr to the marker segment length field. if ( ! CheckFileSpace ( fileRef, &ioBuf, 2 ) ) return; segLen = GetUns16BE ( ioBuf.ptr ); if ( segLen < 2 ) return; // Invalid JPEG. ioBuf.ptr += 2; // Move ioBuf.ptr to the marker segment content. segLen -= 2; // Adjust segLen to count just the content portion. ok = CheckFileSpace ( fileRef, &ioBuf, kPSIRSignatureLength ); if ( ok && (segLen >= kPSIRSignatureLength) && CheckBytes ( ioBuf.ptr, kPSIRSignatureString, kPSIRSignatureLength ) ) { // This is the Photoshop image resources, cache the contents. ioBuf.ptr += kPSIRSignatureLength; // Move ioBuf.ptr to the image resources. segLen -= kPSIRSignatureLength; // Adjust segLen to count just the image resources. ok = CheckFileSpace ( fileRef, &ioBuf, segLen ); // Buffer the full content portion. if ( ! ok ) return; // Must be a truncated file. this->psirContents.assign ( (XMP_StringPtr)ioBuf.ptr, segLen ); ioBuf.ptr += segLen; } else { // This is the not Photoshop image resources, skip the marker segment's content. if ( segLen <= size_t(ioBuf.limit - ioBuf.ptr) ) { ioBuf.ptr += segLen; // The next marker is in this buffer. } else { // The next marker is beyond this buffer, RefillBuffer assumes we're doing sequential reads. size_t skipCount = segLen - (ioBuf.limit - ioBuf.ptr); // The amount to move beyond this buffer. ioBuf.filePos = LFA_Seek ( fileRef, skipCount, SEEK_CUR ); ioBuf.ptr = ioBuf.limit; // No data left in the buffer. } } continue; // Move on to the next marker. } else if ( marker == 0xFFE1 ) { // This is an APP1 marker, is it the Exif, main XMP, or extended XMP? // ! Check in that order, which happens to be increasing signature string length. ++ioBuf.ptr; // Move ioBuf.ptr to the marker segment length field. if ( ! CheckFileSpace ( fileRef, &ioBuf, 2 ) ) return; segLen = GetUns16BE ( ioBuf.ptr ); if ( segLen < 2 ) return; // Invalid JPEG. ioBuf.ptr += 2; // Move ioBuf.ptr to the marker segment content. segLen -= 2; // Adjust segLen to count just the content portion. // Check for the Exif APP1 marker segment. ok = CheckFileSpace ( fileRef, &ioBuf, kExifSignatureLength ); if ( ok && (segLen >= kExifSignatureLength) && (CheckBytes ( ioBuf.ptr, kExifSignatureString, kExifSignatureLength ) || CheckBytes ( ioBuf.ptr, kExifSignatureAltStr, kExifSignatureLength )) ) { // This is the Exif metadata, cache the contents. ioBuf.ptr += kExifSignatureLength; // Move ioBuf.ptr to the TIFF stream. segLen -= kExifSignatureLength; // Adjust segLen to count just the TIFF stream. ok = CheckFileSpace ( fileRef, &ioBuf, segLen ); // Buffer the full content portion. if ( ! ok ) return; // Must be a truncated file. this->exifContents.assign ( (XMP_StringPtr)ioBuf.ptr, segLen ); ioBuf.ptr += segLen; continue; // Move on to the next marker. } // Check for the main XMP APP1 marker segment. ok = CheckFileSpace ( fileRef, &ioBuf, kMainXMPSignatureLength ); if ( ok && (segLen >= kMainXMPSignatureLength) && CheckBytes ( ioBuf.ptr, kMainXMPSignatureString, kMainXMPSignatureLength ) ) { // This is the main XMP, cache the contents. ioBuf.ptr += kMainXMPSignatureLength; // Move ioBuf.ptr to the XMP Packet. segLen -= kMainXMPSignatureLength; // Adjust segLen to count just the XMP Packet. ok = CheckFileSpace ( fileRef, &ioBuf, segLen ); // Buffer the full content portion. if ( ! ok ) return; // Must be a truncated file. this->packetInfo.offset = ioBuf.filePos + (ioBuf.ptr - &ioBuf.data[0]); this->packetInfo.length = (XMP_Int32)segLen; this->packetInfo.padSize = 0; // Assume for now, set these properly in ProcessXMP. this->packetInfo.charForm = kXMP_CharUnknown; this->packetInfo.writeable = true; this->xmpPacket.assign ( (XMP_StringPtr)ioBuf.ptr, segLen ); ioBuf.ptr += segLen; // ! Set this->packetInfo.offset first! this->containsXMP = true; // Found the standard XMP packet. continue; // Move on to the next marker. } // Check for an extension XMP APP1 marker segment. ok = CheckFileSpace ( fileRef, &ioBuf, kExtXMPPrefixLength ); // ! The signature, GUID, length, and offset. if ( ok && (segLen >= kExtXMPPrefixLength) && CheckBytes ( ioBuf.ptr, kExtXMPSignatureString, kExtXMPSignatureLength ) ) { // This is a portion of the extended XMP, cache the contents. This is complicated by // the need to tolerate files where the extension portions are not in order. The // local ExtendedXMPInfo map uses the GUID as the key and maps that to a struct that // has the full length and a map of the known portions. This known portion map uses // the offset of the portion as the key and maps that to a string. Only fully seen // extended XMP streams are kept, the right one gets picked in ProcessXMP. segLen -= kExtXMPPrefixLength; // Adjust segLen to count just the XMP stream portion. ioBuf.ptr += kExtXMPSignatureLength; // Move ioBuf.ptr to the GUID. GUID_32 guid; XMP_Assert ( sizeof(guid.data) == 32 ); memcpy ( &guid.data[0], ioBuf.ptr, sizeof(guid.data) ); // AUDIT: Use of sizeof(guid.data) is safe. ioBuf.ptr += 32; // Move ioBuf.ptr to the length and offset. XMP_Uns32 fullLen = GetUns32BE ( ioBuf.ptr ); XMP_Uns32 offset = GetUns32BE ( ioBuf.ptr+4 ); ioBuf.ptr += 8; // Move ioBuf.ptr to the XMP stream portion. #if Trace_UnlimitedJPEG printf ( "New extended XMP portion: fullLen %d, offset %d, GUID %.32s\n", fullLen, offset, guid.data ); #endif // Find the ExtXMPContent for this GUID, and the string for this portion's offset. ExtendedXMPInfo::iterator guidPos = extXMP.find ( guid ); if ( guidPos == extXMP.end() ) { ExtXMPContent newExtContent ( fullLen ); guidPos = extXMP.insert ( extXMP.begin(), ExtendedXMPInfo::value_type ( guid, newExtContent ) ); } ExtXMPPortions::iterator offsetPos; ExtXMPContent & extContent = guidPos->second; if ( extContent.portions.empty() ) { // When new create a full size offset 0 string, to which all in-order portions will get appended. offsetPos = extContent.portions.insert ( extContent.portions.begin(), ExtXMPPortions::value_type ( 0, std::string() ) ); offsetPos->second.reserve ( extContent.length ); } // Try to append this portion to a logically contiguous preceeding one. if ( offset == 0 ) { offsetPos = extContent.portions.begin(); XMP_Assert ( (offsetPos->first == 0) && (offsetPos->second.size() == 0) ); } else { offsetPos = extContent.portions.lower_bound ( offset ); --offsetPos; // Back up to the portion whose offset is less than the new offset. if ( (offsetPos->first + offsetPos->second.size()) != offset ) { // Can't append, create a new portion. offsetPos = extContent.portions.insert ( extContent.portions.begin(), ExtXMPPortions::value_type ( offset, std::string() ) ); } } // Cache this portion of the extended XMP. std::string & extPortion = offsetPos->second; ok = CheckFileSpace ( fileRef, &ioBuf, segLen ); // Buffer the full content portion. if ( ! ok ) return; // Must be a truncated file. extPortion.append ( (XMP_StringPtr)ioBuf.ptr, segLen ); ioBuf.ptr += segLen; continue; // Move on to the next marker. } // If we get here this is some other uninteresting APP1 marker segment, skip it. if ( segLen <= size_t(ioBuf.limit - ioBuf.ptr) ) { ioBuf.ptr += segLen; // The next marker is in this buffer. } else { // The next marker is beyond this buffer, RefillBuffer assumes we're doing sequential reads. size_t skipCount = segLen - (ioBuf.limit - ioBuf.ptr); // The amount to move beyond this buffer. ioBuf.filePos = LFA_Seek ( fileRef, skipCount, SEEK_CUR ); ioBuf.ptr = ioBuf.limit; // No data left in the buffer. } } else { // This is a non-terminating but uninteresting marker segment. Skip it. ++ioBuf.ptr; // Move ioBuf.ptr to the marker segment length field. if ( ! CheckFileSpace ( fileRef, &ioBuf, 2 ) ) return; segLen = GetUns16BE ( ioBuf.ptr ); // Remember that the length includes itself. if ( segLen < 2 ) return; // Invalid JPEG. if ( segLen <= size_t(ioBuf.limit - ioBuf.ptr) ) { ioBuf.ptr += segLen; // The next marker is in this buffer. } else { // The next marker is beyond this buffer, RefillBuffer assumes we're doing sequential reads. size_t skipCount = segLen - (ioBuf.limit - ioBuf.ptr); // The amount to move beyond this buffer. ioBuf.filePos = LFA_Seek ( fileRef, skipCount, SEEK_CUR ); ioBuf.ptr = ioBuf.limit; // No data left in the buffer. } continue; // Move on to the next marker. } } if ( ! extXMP.empty() ) { // We have extended XMP. Find out which ones are complete, collapse them into a single // string, and save them for ProcessXMP. ExtendedXMPInfo::iterator guidPos = extXMP.begin(); ExtendedXMPInfo::iterator guidEnd = extXMP.end(); for ( ; guidPos != guidEnd; ++guidPos ) { ExtXMPContent & thisContent = guidPos->second; ExtXMPPortions::iterator partZero = thisContent.portions.begin(); ExtXMPPortions::iterator partEnd = thisContent.portions.end(); ExtXMPPortions::iterator partPos = partZero; #if Trace_UnlimitedJPEG printf ( "Extended XMP portions for GUID %.32s, full length %d\n", guidPos->first.data, guidPos->second.length ); printf ( " Offset %d, length %d, next offset %d\n", partZero->first, partZero->second.size(), (partZero->first + partZero->second.size()) ); #endif for ( ++partPos; partPos != partEnd; ++partPos ) { #if Trace_UnlimitedJPEG printf ( " Offset %d, length %d, next offset %d\n", partPos->first, partPos->second.size(), (partPos->first + partPos->second.size()) ); #endif if ( partPos->first != partZero->second.size() ) break; // Quit if not contiguous. partZero->second.append ( partPos->second ); } if ( (partPos == partEnd) && (partZero->first == 0) && (partZero->second.size() == thisContent.length) ) { // This is a complete extended XMP stream. this->extendedXMP.insert ( ExtendedXMPMap::value_type ( guidPos->first, partZero->second ) ); #if Trace_UnlimitedJPEG printf ( "Full extended XMP for GUID %.32s, full length %d\n", guidPos->first.data, partZero->second.size() ); #endif } } } } // JPEG_MetaHandler::CacheFileData // ================================================================================================= // TrimFullExifAPP1 // ================ // // Try to trim trailing padding from full Exif APP1 segment written by some Nikon cameras. Do a // temporary read-only parse of the Exif APP1 contents, determine the highest used offset, trim the // padding if all zero bytes. static const char * IFDNames[] = { "Primary", "TNail", "Exif", "GPS", "Interop", }; static void TrimFullExifAPP1 ( std::string * exifContents ) { TIFF_MemoryReader tempMgr; TIFF_MemoryReader::TagInfo tagInfo; bool tagFound, isNikon; // ! Make a copy of the data to parse! The RO memory TIFF manager will flip bytes in-place! tempMgr.ParseMemoryStream ( exifContents->data(), (XMP_Uns32)exifContents->size(), true /* copy data */ ); // Only trim the Exif APP1 from Nikon cameras. tagFound = tempMgr.GetTag ( kTIFF_PrimaryIFD, kTIFF_Make, &tagInfo ); isNikon = tagFound && (tagInfo.type == kTIFF_ASCIIType) && (tagInfo.count >= 5) && (memcmp ( tagInfo.dataPtr, "NIKON", 5) == 0); if ( ! isNikon ) return; // Determine the highest used offset (actually 1 beyond that). Look at the IFD structure, and // the thumbnail info. Ignore the MakerNote tag, Nikon says they are self-contained. XMP_Uns32 maxOffset = 0; for ( XMP_Uns8 ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { TIFF_MemoryReader::TagInfoMap tagMap; bool ifdFound = tempMgr.GetIFD ( ifd, &tagMap ); if ( ! ifdFound ) continue; TIFF_MemoryReader::TagInfoMap::const_iterator mapPos = tagMap.begin(); TIFF_MemoryReader::TagInfoMap::const_iterator mapEnd = tagMap.end(); for ( ; mapPos != mapEnd; ++mapPos ) { const TIFF_MemoryReader::TagInfo & tagInfo = mapPos->second; XMP_Uns32 tagEnd = tempMgr.GetValueOffset ( ifd, tagInfo.id ) + tagInfo.dataLen; if ( tagEnd > maxOffset ) maxOffset = tagEnd; } } tagFound = tempMgr.GetTag ( kTIFF_TNailIFD, kTIFF_JPEGInterchangeFormat, &tagInfo ); if ( tagFound ) { XMP_Uns32 tnailOffset = tempMgr.GetUns32 ( tagInfo.dataPtr ); tagFound = tempMgr.GetTag ( kTIFF_TNailIFD, kTIFF_JPEGInterchangeFormatLength, &tagInfo ); if ( ! tagFound ) return; // Don't trim if there is a TNail offset but no length. tnailOffset += tempMgr.GetUns32 ( tagInfo.dataPtr ); if ( tnailOffset > maxOffset ) maxOffset = tnailOffset; } if ( maxOffset >= exifContents->size() ) return; // Sanity check for in bounds maximum offset. for ( size_t i = maxOffset, limit = exifContents->size(); i < limit; ++i ) { if ( (*exifContents)[i] != 0 ) return; // Don't trim if unless the trailer is all zero. } exifContents->erase ( maxOffset ); } // TrimFullExifAPP1 // ================================================================================================= // JPEG_MetaHandler::ProcessXMP // ============================ // // Process the raw XMP and legacy metadata that was previously cached. void JPEG_MetaHandler::ProcessXMP() { XMP_Assert ( ! this->processedXMP ); this->processedXMP = true; // Make sure we only come through here once. // Create the PSIR and IPTC handlers, even if there is no legacy. They might be needed for updates. XMP_Assert ( (this->psirMgr == 0) && (this->iptcMgr == 0) ); // ProcessTNail might create the exifMgr. bool readOnly = ((this->parent->openFlags & kXMPFiles_OpenForUpdate) == 0); if ( readOnly ) { if ( this->exifMgr == 0 ) this->exifMgr = new TIFF_MemoryReader(); this->psirMgr = new PSIR_MemoryReader(); this->iptcMgr = new IPTC_Reader(); // ! Parse it later. } else { if ( this->exifContents.size() == (65534 - 2 - 6) ) TrimFullExifAPP1 ( &this->exifContents ); if ( this->exifMgr == 0 ) this->exifMgr = new TIFF_FileWriter(); this->psirMgr = new PSIR_FileWriter(); this->iptcMgr = new IPTC_Writer(); // ! Parse it later. } // Set up everything for the legacy import, but don't do it yet. This lets us do a forced legacy // import if the XMP packet gets parsing errors. TIFF_Manager & exif = *this->exifMgr; // Give the compiler help in recognizing non-aliases. PSIR_Manager & psir = *this->psirMgr; IPTC_Manager & iptc = *this->iptcMgr; bool haveExif = (! this->exifContents.empty()); if ( haveExif ) { exif.ParseMemoryStream ( this->exifContents.c_str(), (XMP_Uns32)this->exifContents.size() ); } bool havePSIR = (! this->psirContents.empty()); if ( havePSIR ) { psir.ParseMemoryResources ( this->psirContents.c_str(), (XMP_Uns32)this->psirContents.size() ); } PSIR_Manager::ImgRsrcInfo iptcInfo; bool haveIPTC = false; if ( havePSIR ) haveIPTC = psir.GetImgRsrc ( kPSIR_IPTC, &iptcInfo );; int iptcDigestState = kDigestMatches; if ( haveIPTC ) { bool haveDigest = false; PSIR_Manager::ImgRsrcInfo digestInfo; if ( havePSIR ) haveDigest = psir.GetImgRsrc ( kPSIR_IPTCDigest, &digestInfo ); if ( digestInfo.dataLen != 16 ) haveDigest = false; if ( ! haveDigest ) { iptcDigestState = kDigestMissing; } else { iptcDigestState = PhotoDataUtils::CheckIPTCDigest ( iptcInfo.dataPtr, iptcInfo.dataLen, digestInfo.dataPtr ); } } XMP_OptionBits options = 0; if ( this->containsXMP ) options |= k2XMP_FileHadXMP; if ( haveExif ) options |= k2XMP_FileHadExif; if ( haveIPTC ) options |= k2XMP_FileHadIPTC; // Process the main XMP packet. If it fails to parse, do a forced legacy import but still throw // an exception. This tells the caller that an error happened, but gives them recovered legacy // should they want to proceed with that. bool haveXMP = false; if ( ! this->xmpPacket.empty() ) { XMP_Assert ( this->containsXMP ); // Common code takes care of packetInfo.charForm, .padSize, and .writeable. XMP_StringPtr packetStr = this->xmpPacket.c_str(); XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size(); try { this->xmpObj.ParseFromBuffer ( packetStr, packetLen ); haveXMP = true; } catch ( ... ) { XMP_ClearOption ( options, k2XMP_FileHadXMP ); if ( haveIPTC ) iptc.ParseMemoryDataSets ( iptcInfo.dataPtr, iptcInfo.dataLen ); if ( iptcDigestState == kDigestMatches ) iptcDigestState = kDigestMissing; ImportPhotoData ( exif, iptc, psir, iptcDigestState, &this->xmpObj, options ); throw; // ! Rethrow the exception, don't absorb it. } } // Process the extended XMP if it has a matching GUID. if ( ! this->extendedXMP.empty() ) { bool found; GUID_32 g32; std::string extGUID, extPacket; ExtendedXMPMap::iterator guidPos = this->extendedXMP.end(); found = this->xmpObj.GetProperty ( kXMP_NS_XMP_Note, "HasExtendedXMP", &extGUID, 0 ); if ( found && (extGUID.size() == sizeof(g32.data)) ) { XMP_Assert ( sizeof(g32.data) == 32 ); memcpy ( g32.data, extGUID.c_str(), sizeof(g32.data) ); // AUDIT: Use of sizeof(g32.data) is safe. guidPos = this->extendedXMP.find ( g32 ); this->xmpObj.DeleteProperty ( kXMP_NS_XMP_Note, "HasExtendedXMP" ); // ! Must only be in the file. #if Trace_UnlimitedJPEG printf ( "%s extended XMP for GUID %s\n", ((guidPos != this->extendedXMP.end()) ? "Found" : "Missing"), extGUID.c_str() ); #endif } if ( guidPos != this->extendedXMP.end() ) { try { XMP_StringPtr extStr = guidPos->second.c_str(); XMP_StringLen extLen = (XMP_StringLen)guidPos->second.size(); SXMPMeta extXMP ( extStr, extLen ); SXMPUtils::MergeFromJPEG ( &this->xmpObj, extXMP ); } catch ( ... ) { // Ignore failures, let the rest of the XMP and legacy be kept. } } } // Process the legacy metadata. if ( haveIPTC && (! haveXMP) && (iptcDigestState == kDigestMatches) ) iptcDigestState = kDigestMissing; bool parseIPTC = (iptcDigestState != kDigestMatches) || (! readOnly); if ( parseIPTC ) iptc.ParseMemoryDataSets ( iptcInfo.dataPtr, iptcInfo.dataLen ); ImportPhotoData ( exif, iptc, psir, iptcDigestState, &this->xmpObj, options ); this->containsXMP = true; // Assume we had something for the XMP. } // JPEG_MetaHandler::ProcessXMP // ================================================================================================= // JPEG_MetaHandler::UpdateFile // ============================ void JPEG_MetaHandler::UpdateFile ( bool doSafeUpdate ) { XMP_Assert ( ! doSafeUpdate ); // This should only be called for "unsafe" updates. XMP_Int64 oldPacketOffset = this->packetInfo.offset; XMP_Int32 oldPacketLength = this->packetInfo.length; if ( oldPacketOffset == kXMPFiles_UnknownOffset ) oldPacketOffset = 0; // ! Simplify checks. if ( oldPacketLength == kXMPFiles_UnknownLength ) oldPacketLength = 0; bool fileHadXMP = ((oldPacketOffset != 0) && (oldPacketLength != 0)); // Update the IPTC-IIM and native TIFF/Exif metadata. ExportPhotoData also trips the tiff: and // exif: copies from the XMP, so reserialize the now final XMP packet. ExportPhotoData ( kXMP_JPEGFile, &this->xmpObj, this->exifMgr, this->iptcMgr, this->psirMgr ); try { XMP_OptionBits options = kXMP_UseCompactFormat; if ( fileHadXMP ) options |= kXMP_ExactPacketLength; this->xmpObj.SerializeToBuffer ( &this->xmpPacket, options, oldPacketLength ); } catch ( ... ) { this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat ); } // Decide whether to do an in-place update. This can only happen if all of the following are true: // - There is a standard packet in the file. // - There is no extended XMP in the file. // - The are no changes to the legacy Exif or PSIR portions. (The IPTC is in the PSIR.) // - The new XMP can fit in the old space, without extensions. bool doInPlace = (fileHadXMP && (this->xmpPacket.size() <= (size_t)oldPacketLength)); if ( ! this->extendedXMP.empty() ) doInPlace = false; if ( (this->exifMgr != 0) && (this->exifMgr->IsLegacyChanged()) ) doInPlace = false; if ( (this->psirMgr != 0) && (this->psirMgr->IsLegacyChanged()) ) doInPlace = false; if ( doInPlace ) { #if GatherPerformanceData sAPIPerf->back().extraInfo += ", JPEG in-place update"; #endif if ( this->xmpPacket.size() < (size_t)this->packetInfo.length ) { // They ought to match, cheap to be sure. size_t extraSpace = (size_t)this->packetInfo.length - this->xmpPacket.size(); this->xmpPacket.append ( extraSpace, ' ' ); } LFA_FileRef liveFile = this->parent->fileRef; std::string & newPacket = this->xmpPacket; XMP_Assert ( newPacket.size() == (size_t)oldPacketLength ); // ! Done by common PutXMP logic. LFA_Seek ( liveFile, oldPacketOffset, SEEK_SET ); LFA_Write ( liveFile, newPacket.c_str(), (XMP_Int32)newPacket.size() ); } else { #if GatherPerformanceData sAPIPerf->back().extraInfo += ", JPEG copy update"; #endif std::string origPath = this->parent->filePath; LFA_FileRef origRef = this->parent->fileRef; std::string updatePath; LFA_FileRef updateRef = 0; CreateTempFile ( origPath, &updatePath, kCopyMacRsrc ); updateRef = LFA_Open ( updatePath.c_str(), 'w' ); this->parent->filePath = updatePath; this->parent->fileRef = updateRef; try { XMP_Assert ( ! this->skipReconcile ); this->skipReconcile = true; this->WriteFile ( origRef, origPath ); this->skipReconcile = false; } catch ( ... ) { this->skipReconcile = false; LFA_Close ( updateRef ); LFA_Delete ( updatePath.c_str() ); this->parent->filePath = origPath; this->parent->fileRef = origRef; throw; } LFA_Close ( origRef ); LFA_Delete ( origPath.c_str() ); LFA_Close ( updateRef ); LFA_Rename ( updatePath.c_str(), origPath.c_str() ); this->parent->filePath = origPath; this->parent->fileRef = 0; } this->needsUpdate = false; } // JPEG_MetaHandler::UpdateFile // ================================================================================================= // JPEG_MetaHandler::WriteFile // =========================== // // The metadata parts of a JPEG file are APP1 marker segments for Exif and XMP, and an APP13 marker // segment for Photoshop image resources which contain the IPTC. Corresponding marker segments in // the source file are ignored, other parts of the source file are copied. Any initial APP0 marker // segments are copied first. Then the new Exif, XMP, and PSIR marker segments are written. Then the // rest of the file is copied, skipping the old Exif, XMP, and PSIR. The checking for old metadata // stops at the first SOFn marker. // *** What about Mac resources? void JPEG_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { LFA_FileRef destRef = this->parent->fileRef; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); XMP_Uns16 marker; size_t segLen; // ! Must be a size to hold at least 64k+2. IOBuffer ioBuf; XMP_Uns32 first4; XMP_Assert ( kIOBufferSize >= (2 + 64*1024) ); // Enough for a marker plus maximum contents. if ( LFA_Measure ( sourceRef ) == 0 ) return; // Tolerate empty files. LFA_Seek ( sourceRef, 0, SEEK_SET ); LFA_Truncate (destRef, 0 ); if ( ! skipReconcile ) { // Update the IPTC-IIM and native TIFF/Exif metadata, and reserialize the now final XMP packet. ExportPhotoData ( kXMP_JPEGFile, &this->xmpObj, this->exifMgr, this->iptcMgr, this->psirMgr ); this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat ); } RefillBuffer ( sourceRef, &ioBuf ); if ( ! CheckFileSpace ( sourceRef, &ioBuf, 4 ) ) { XMP_Throw ( "JPEG must have at least SOI and EOI markers", kXMPErr_BadJPEG ); } marker = GetUns16BE ( ioBuf.ptr ); if ( marker != 0xFFD8 ) XMP_Throw ( "Missing SOI marker", kXMPErr_BadJPEG ); LFA_Write ( destRef, ioBuf.ptr, 2 ); ioBuf.ptr += 2; // Copy the leading APP0 marker segments. while ( true ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "JPEG_MetaHandler::WriteFile - User abort", kXMPErr_UserAbort ); } if ( ! CheckFileSpace ( sourceRef, &ioBuf, 2 ) ) XMP_Throw ( "Unexpected end to JPEG", kXMPErr_BadJPEG ); marker = GetUns16BE ( ioBuf.ptr ); if ( marker == 0xFFFF ) { LFA_Write ( destRef, ioBuf.ptr, 1 ); // Copy the 0xFF pad byte. ++ioBuf.ptr; continue; } if ( marker != 0xFFE0 ) break; if ( ! CheckFileSpace ( sourceRef, &ioBuf, 4 ) ) XMP_Throw ( "Unexpected end to JPEG", kXMPErr_BadJPEG ); segLen = GetUns16BE ( ioBuf.ptr+2 ); segLen += 2; // ! Don't do above in case machine does 16 bit "+". if ( ! CheckFileSpace ( sourceRef, &ioBuf, segLen ) ) XMP_Throw ( "Unexpected end to JPEG", kXMPErr_BadJPEG ); LFA_Write ( destRef, ioBuf.ptr, (XMP_Int32)segLen ); ioBuf.ptr += segLen; } // Write the new Exif APP1 marker segment. if ( this->exifMgr != 0 ) { void* exifPtr; XMP_Uns32 exifLen = this->exifMgr->UpdateMemoryStream ( &exifPtr ); if ( exifLen > kExifMaxDataLength ) exifLen = this->exifMgr->UpdateMemoryStream ( &exifPtr, true /* compact */ ); if ( exifLen > kExifMaxDataLength ) XMP_Throw ( "Overflow of Exif APP1 data", kXMPErr_BadJPEG ); if ( exifLen > 0 ) { first4 = MakeUns32BE ( 0xFFE10000 + 2 + kExifSignatureLength + exifLen ); LFA_Write ( destRef, &first4, 4 ); LFA_Write ( destRef, kExifSignatureString, kExifSignatureLength ); LFA_Write ( destRef, exifPtr, exifLen ); } } // Write the new XMP APP1 marker segment, with possible extension marker segments. std::string mainXMP, extXMP, extDigest; SXMPUtils::PackageForJPEG ( this->xmpObj, &mainXMP, &extXMP, &extDigest ); XMP_Assert ( (extXMP.size() == 0) || (extDigest.size() == 32) ); first4 = MakeUns32BE ( 0xFFE10000 + 2 + kMainXMPSignatureLength + (XMP_Uns32)mainXMP.size() ); LFA_Write ( destRef, &first4, 4 ); LFA_Write ( destRef, kMainXMPSignatureString, kMainXMPSignatureLength ); LFA_Write ( destRef, mainXMP.c_str(), (XMP_Int32)mainXMP.size() ); size_t extPos = 0; size_t extLen = extXMP.size(); while ( extLen > 0 ) { size_t partLen = extLen; if ( partLen > 65000 ) partLen = 65000; first4 = MakeUns32BE ( 0xFFE10000 + 2 + kExtXMPPrefixLength + (XMP_Uns32)partLen ); LFA_Write ( destRef, &first4, 4 ); LFA_Write ( destRef, kExtXMPSignatureString, kExtXMPSignatureLength ); LFA_Write ( destRef, extDigest.c_str(), (XMP_Int32)extDigest.size() ); first4 = MakeUns32BE ( (XMP_Int32)extXMP.size() ); LFA_Write ( destRef, &first4, 4 ); first4 = MakeUns32BE ( (XMP_Int32)extPos ); LFA_Write ( destRef, &first4, 4 ); LFA_Write ( destRef, &extXMP[extPos], (XMP_Int32)partLen ); extPos += partLen; extLen -= partLen; } // Write the new PSIR APP13 marker segment. if ( this->psirMgr != 0 ) { void* psirPtr; XMP_Uns32 psirLen = this->psirMgr->UpdateMemoryResources ( &psirPtr ); if ( psirLen > kPSIRMaxDataLength ) XMP_Throw ( "Overflow of PSIR APP13 data", kXMPErr_BadJPEG ); if ( psirLen > 0 ) { first4 = MakeUns32BE ( 0xFFED0000 + 2 + kPSIRSignatureLength + psirLen ); LFA_Write ( destRef, &first4, 4 ); LFA_Write ( destRef, kPSIRSignatureString, kPSIRSignatureLength ); LFA_Write ( destRef, psirPtr, psirLen ); } } // Copy remaining marker segments, skipping old metadata, to the first SOS marker or to EOI. while ( true ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "JPEG_MetaHandler::WriteFile - User abort", kXMPErr_UserAbort ); } if ( ! CheckFileSpace ( sourceRef, &ioBuf, 2 ) ) XMP_Throw ( "Unexpected end to JPEG", kXMPErr_BadJPEG ); marker = GetUns16BE ( ioBuf.ptr ); if ( marker == 0xFFFF ) { LFA_Write ( destRef, ioBuf.ptr, 1 ); // Copy the 0xFF pad byte. ++ioBuf.ptr; continue; } if ( (marker == 0xFFDA) || (marker == 0xFFD9) ) break; // Quit at the first SOS marker or at EOI. if ( (marker == 0xFF01) || // Ill-formed file if we encounter a TEM or RSTn marker. ((0xFFD0 <= marker) && (marker <= 0xFFD7)) ) { XMP_Throw ( "Unexpected TEM or RSTn marker", kXMPErr_BadJPEG ); } if ( ! CheckFileSpace ( sourceRef, &ioBuf, 4 ) ) XMP_Throw ( "Unexpected end to JPEG", kXMPErr_BadJPEG ); segLen = GetUns16BE ( ioBuf.ptr+2 ); if ( ! CheckFileSpace ( sourceRef, &ioBuf, 2+segLen ) ) XMP_Throw ( "Unexpected end to JPEG", kXMPErr_BadJPEG ); bool copySegment = true; XMP_Uns8* signaturePtr = ioBuf.ptr + 4; if ( marker == 0xFFED ) { if ( (segLen >= kPSIRSignatureLength) && CheckBytes ( signaturePtr, kPSIRSignatureString, kPSIRSignatureLength ) ) { copySegment = false; } } else if ( marker == 0xFFE1 ) { if ( (segLen >= kExifSignatureLength) && (CheckBytes ( signaturePtr, kExifSignatureString, kExifSignatureLength ) || CheckBytes ( signaturePtr, kExifSignatureAltStr, kExifSignatureLength )) ) { copySegment = false; } else if ( (segLen >= kMainXMPSignatureLength) && CheckBytes ( signaturePtr, kMainXMPSignatureString, kMainXMPSignatureLength ) ) { copySegment = false; } else if ( (segLen >= kExtXMPPrefixLength) && CheckBytes ( signaturePtr, kExtXMPSignatureString, kExtXMPSignatureLength ) ) { copySegment = false; } } if ( copySegment ) LFA_Write ( destRef, ioBuf.ptr, (XMP_Int32)(2+segLen) ); ioBuf.ptr += 2+segLen; } // Copy the remainder of the source file. size_t bufTail = ioBuf.len - (ioBuf.ptr - &ioBuf.data[0]); LFA_Write ( destRef, ioBuf.ptr, (XMP_Int32)bufTail ); ioBuf.ptr += bufTail; while ( true ) { RefillBuffer ( sourceRef, &ioBuf ); if ( ioBuf.len == 0 ) break; LFA_Write ( destRef, ioBuf.ptr, (XMP_Int32)ioBuf.len ); ioBuf.ptr += ioBuf.len; } this->needsUpdate = false; } // JPEG_MetaHandler::WriteFile exempi-2.2.1/source/XMPFiles/FileHandlers/ASF_Handler.hpp0000664000175000017500000000404512150230672017775 00000000000000#ifndef __ASF_Handler_hpp__ #define __ASF_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMPFiles_Impl.hpp" #include "ASF_Support.hpp" // ================================================================================================= /// \file ASF_Handler.hpp /// \brief File format handler for ASF. /// /// This header ... /// // ================================================================================================= // *** Could derive from Basic_Handler - buffer file tail in a temp file. extern XMPFileHandler* ASF_MetaHandlerCTor ( XMPFiles* parent ); extern bool ASF_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); static const XMP_OptionBits kASF_HandlerFlags = ( kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_PrefersInPlace | kXMPFiles_CanReconcile | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_NeedsReadOnlyPacket ); class ASF_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessXMP(); void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string& sourcePath ); bool SafeWriteFile (); ASF_MetaHandler ( XMPFiles* parent ); virtual ~ASF_MetaHandler(); private: ASF_LegacyManager legacyManager; }; // ASF_MetaHandler // ================================================================================================= #endif /* __ASF_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/MPEG4_Handler.cpp0000664000175000017500000026355112150230672020204 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include #include "MPEG4_Handler.hpp" #include "ISOBaseMedia_Support.hpp" #include "MOOV_Support.hpp" #include "UnicodeConversions.hpp" #include "MD5.h" #if XMP_WinBuild #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif using namespace std; // ================================================================================================= /// \file MPEG4_Handler.cpp /// \brief File format handler for MPEG-4, a flavor of the ISO Base Media File Format. /// /// This handler ... /// // ================================================================================================= // The basic content of a timecode sample description table entry. Does not include trailing boxes. #pragma pack ( push, 1 ) struct stsdBasicEntry { XMP_Uns32 entrySize; XMP_Uns32 format; XMP_Uns8 reserved_1 [6]; XMP_Uns16 dataRefIndex; XMP_Uns32 reserved_2; XMP_Uns32 flags; XMP_Uns32 timeScale; XMP_Uns32 frameDuration; XMP_Uns8 frameCount; XMP_Uns8 reserved_3; }; #pragma pack ( pop ) // ================================================================================================= // ! The buffer and constants are both already big endian. #define Get4CharCode(buffPtr) (*((XMP_Uns32*)(buffPtr))) // ================================================================================================= static inline bool IsClassicQuickTimeBox ( XMP_Uns32 boxType ) { if ( (boxType == ISOMedia::k_moov) || (boxType == ISOMedia::k_mdat) || (boxType == ISOMedia::k_pnot) || (boxType == ISOMedia::k_free) || (boxType == ISOMedia::k_skip) || (boxType == ISOMedia::k_wide) ) return true; return false; } // IsClassicQuickTimeBox // ================================================================================================= // Pairs of 3 letter ISO 639-2 codes mapped to 2 letter ISO 639-1 codes from: // http://www.loc.gov/standards/iso639-2/php/code_list.php // Would have to write an "==" operator to use std::map, must compare values not pointers. // ! Not fully sorted, do not use a binary search. static XMP_StringPtr kKnownLangs[] = { "aar", "aa", "abk", "ab", "afr", "af", "aka", "ak", "alb", "sq", "sqi", "sq", "amh", "am", "ara", "ar", "arg", "an", "arm", "hy", "hye", "hy", "asm", "as", "ava", "av", "ave", "ae", "aym", "ay", "aze", "az", "bak", "ba", "bam", "bm", "baq", "eu", "eus", "eu", "bel", "be", "ben", "bn", "bih", "bh", "bis", "bi", "bod", "bo", "tib", "bo", "bos", "bs", "bre", "br", "bul", "bg", "bur", "my", "mya", "my", "cat", "ca", "ces", "cs", "cze", "cs", "cha", "ch", "che", "ce", "chi", "zh", "zho", "zh", "chu", "cu", "chv", "cv", "cor", "kw", "cos", "co", "cre", "cr", "cym", "cy", "wel", "cy", "cze", "cs", "ces", "cs", "dan", "da", "deu", "de", "ger", "de", "div", "dv", "dut", "nl", "nld", "nl", "dzo", "dz", "ell", "el", "gre", "el", "eng", "en", "epo", "eo", "est", "et", "eus", "eu", "baq", "eu", "ewe", "ee", "fao", "fo", "fas", "fa", "per", "fa", "fij", "fj", "fin", "fi", "fra", "fr", "fre", "fr", "fre", "fr", "fra", "fr", "fry", "fy", "ful", "ff", "geo", "ka", "kat", "ka", "ger", "de", "deu", "de", "gla", "gd", "gle", "ga", "glg", "gl", "glv", "gv", "gre", "el", "ell", "el", "grn", "gn", "guj", "gu", "hat", "ht", "hau", "ha", "heb", "he", "her", "hz", "hin", "hi", "hmo", "ho", "hrv", "hr", "scr", "hr", "hun", "hu", "hye", "hy", "arm", "hy", "ibo", "ig", "ice", "is", "isl", "is", "ido", "io", "iii", "ii", "iku", "iu", "ile", "ie", "ina", "ia", "ind", "id", "ipk", "ik", "isl", "is", "ice", "is", "ita", "it", "jav", "jv", "jpn", "ja", "kal", "kl", "kan", "kn", "kas", "ks", "kat", "ka", "geo", "ka", "kau", "kr", "kaz", "kk", "khm", "km", "kik", "ki", "kin", "rw", "kir", "ky", "kom", "kv", "kon", "kg", "kor", "ko", "kua", "kj", "kur", "ku", "lao", "lo", "lat", "la", "lav", "lv", "lim", "li", "lin", "ln", "lit", "lt", "ltz", "lb", "lub", "lu", "lug", "lg", "mac", "mk", "mkd", "mk", "mah", "mh", "mal", "ml", "mao", "mi", "mri", "mi", "mar", "mr", "may", "ms", "msa", "ms", "mkd", "mk", "mac", "mk", "mlg", "mg", "mlt", "mt", "mol", "mo", "mon", "mn", "mri", "mi", "mao", "mi", "msa", "ms", "may", "ms", "mya", "my", "bur", "my", "nau", "na", "nav", "nv", "nbl", "nr", "nde", "nd", "ndo", "ng", "nep", "ne", "nld", "nl", "dut", "nl", "nno", "nn", "nob", "nb", "nor", "no", "nya", "ny", "oci", "oc", "oji", "oj", "ori", "or", "orm", "om", "oss", "os", "pan", "pa", "per", "fa", "fas", "fa", "pli", "pi", "pol", "pl", "por", "pt", "pus", "ps", "que", "qu", "roh", "rm", "ron", "ro", "rum", "ro", "rum", "ro", "ron", "ro", "run", "rn", "rus", "ru", "sag", "sg", "san", "sa", "scc", "sr", "srp", "sr", "scr", "hr", "hrv", "hr", "sin", "si", "slk", "sk", "slo", "sk", "slo", "sk", "slk", "sk", "slv", "sl", "sme", "se", "smo", "sm", "sna", "sn", "snd", "sd", "som", "so", "sot", "st", "spa", "es", "sqi", "sq", "alb", "sq", "srd", "sc", "srp", "sr", "scc", "sr", "ssw", "ss", "sun", "su", "swa", "sw", "swe", "sv", "tah", "ty", "tam", "ta", "tat", "tt", "tel", "te", "tgk", "tg", "tgl", "tl", "tha", "th", "tib", "bo", "bod", "bo", "tir", "ti", "ton", "to", "tsn", "tn", "tso", "ts", "tuk", "tk", "tur", "tr", "twi", "tw", "uig", "ug", "ukr", "uk", "urd", "ur", "uzb", "uz", "ven", "ve", "vie", "vi", "vol", "vo", "wel", "cy", "cym", "cy", "wln", "wa", "wol", "wo", "xho", "xh", "yid", "yi", "yor", "yo", "zha", "za", "zho", "zh", "chi", "zh", "zul", "zu", 0, 0 }; static inline XMP_StringPtr Lookup2LetterLang ( XMP_StringPtr lang3 ) { for ( size_t i = 0; kKnownLangs[i] != 0; i += 2 ) { if ( XMP_LitMatch ( lang3, kKnownLangs[i] ) ) return kKnownLangs[i+1]; } return ""; } static inline XMP_StringPtr Lookup3LetterLang ( XMP_StringPtr lang2 ) { for ( size_t i = 0; kKnownLangs[i] != 0; i += 2 ) { if ( XMP_LitMatch ( lang2, kKnownLangs[i+1] ) ) return kKnownLangs[i]; } return ""; } // ================================================================================================= // MPEG4_CheckFormat // ================= // // There are 3 variations of recognized file: // - Normal MPEG-4 - has an 'ftyp' box containing a known compatible brand but not 'qt '. // - Modern QuickTime - has an 'ftyp' box containing 'qt ' as a compatible brand. // - Classic QuickTime - has no 'ftyp' box, should have recognized top level boxes. // // An MPEG-4 or modern QuickTime file is an instance of an ISO Base Media file, ISO 14496-12 and -14. // A classic QuickTime file has the same physical box structure, but somewhat different box types. // The ISO files must begin with an 'ftyp' box containing 'mp41', 'mp42', 'f4v ', or 'qt ' in the // compatible brands. // // The general box structure is: // // 0 4 uns32 box size, 0 means "to EoF", 1 means 64-bit size follows // 4 4 uns32 box type // 8 8 uns64 box size, present only if uns32 size is 1 // - * box content // // The 'ftyp' box content is: // // - 4 uns32 major brand // - 4 uns32 minor version // - * uns32 sequence of compatible brands, to the end of the box // ! With the addition of QuickTime support there is some change in behavior in OpenFile when the // ! kXMPFiles_OpenStrictly option is used wth a specific file format. The kXMP_MPEG4File and // ! kXMP_MOVFile formats are treated uniformly, you can't force "real MOV" or "real MPEG-4". You // ! can check afterwards using GetFileInfo to see what the file happens to be. bool MPEG4_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles* parent ) { XMP_Uns8 buffer [4*1024]; XMP_Uns32 ioCount, brandCount, brandOffset; XMP_Uns64 fileSize, nextOffset; ISOMedia::BoxInfo currBox; #define IsTolerableBoxChar(ch) ( ((0x20 <= (ch)) && ((ch) <= 0x7E)) || ((ch) == 0xA9) ) XMP_AbortProc abortProc = parent->abortProc; void * abortArg = parent->abortArg; const bool checkAbort = (abortProc != 0); bool openStrictly = XMP_OptionIsSet ( parent->openFlags, kXMPFiles_OpenStrictly); // Get the first box's info, see if it is 'ftyp' or not. XMP_Assert ( (parent->tempPtr == 0) && (parent->tempUI32 == 0) ); fileSize = LFA_Measure ( fileRef ); nextOffset = ISOMedia::GetBoxInfo ( fileRef, 0, fileSize, &currBox ); if ( currBox.headerSize < 8 ) return false; // Can't be an ISO or QuickTime file. if ( currBox.boxType == ISOMedia::k_ftyp ) { // Have an 'ftyp' box, look through the compatible brands. If 'qt ' is present then this is // a modern QuickTime file, regardless of what else is found. Otherwise this is plain ISO if // any of the other recognized brands are found. if ( currBox.contentSize < 12 ) return false; // No compatible brands at all. if ( currBox.contentSize > 1024*1024 ) return false; // Sanity check and make sure count fits in 32 bits. brandCount = ((XMP_Uns32)currBox.contentSize - 8) >> 2; LFA_Seek ( fileRef, 8, SEEK_CUR ); // Skip the major and minor brands. ioCount = brandOffset = 0; bool haveCompatibleBrand = false; for ( ; brandCount > 0; --brandCount, brandOffset += 4 ) { if ( brandOffset >= ioCount ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "MPEG4_CheckFormat - User abort", kXMPErr_UserAbort ); } ioCount = 4 * brandCount; if ( ioCount > sizeof(buffer) ) ioCount = sizeof(buffer); ioCount = LFA_Read ( fileRef, buffer, ioCount, kLFA_RequireAll ); brandOffset = 0; } XMP_Uns32 brand = GetUns32BE ( &buffer[brandOffset] ); if ( brand == ISOMedia::k_qt ) { // Don't need to look further. if ( openStrictly && (format != kXMP_MOVFile) ) return false; parent->format = kXMP_MOVFile; parent->tempUI32 = MOOV_Manager::kFileIsModernQT; return true; } else if ( (brand == ISOMedia::k_mp41) || (brand == ISOMedia::k_mp42) || (brand == ISOMedia::k_f4v) ) { haveCompatibleBrand = true; // Need to keep looking in case 'qt ' follows. } } if ( ! haveCompatibleBrand ) return false; if ( openStrictly && (format != kXMP_MPEG4File) ) return false; parent->format = kXMP_MPEG4File; parent->tempUI32 = MOOV_Manager::kFileIsNormalISO; return true; } else { // No 'ftyp', look for classic QuickTime: 'moov', 'mdat', 'pnot', 'free', 'skip', and 'wide'. // As an expedient, quit when a 'moov' box is found. Tolerate other boxes, they are in the // wild for ill-formed files, e.g. seen when 'moov'/'udta' children get left at top level. while ( currBox.boxType != ISOMedia::k_moov ) { if ( ! IsClassicQuickTimeBox ( currBox.boxType ) ) { // Make sure the box type is 4 ASCII characters or 0xA9 (MacRoman copyright). XMP_Uns8 b1 = (XMP_Uns8) (currBox.boxType >> 24); XMP_Uns8 b2 = (XMP_Uns8) ((currBox.boxType >> 16) & 0xFF); XMP_Uns8 b3 = (XMP_Uns8) ((currBox.boxType >> 8) & 0xFF); XMP_Uns8 b4 = (XMP_Uns8) (currBox.boxType & 0xFF); bool ok = IsTolerableBoxChar(b1) && IsTolerableBoxChar(b2) && IsTolerableBoxChar(b3) && IsTolerableBoxChar(b4); if ( ! ok ) return false; } if ( nextOffset >= fileSize ) return false; if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "MPEG4_CheckFormat - User abort", kXMPErr_UserAbort ); } nextOffset = ISOMedia::GetBoxInfo ( fileRef, nextOffset, fileSize, &currBox ); } if ( openStrictly && (format != kXMP_MOVFile) ) return false; parent->format = kXMP_MOVFile; parent->tempUI32 = MOOV_Manager::kFileIsTraditionalQT; return true; } return false; } // MPEG4_CheckFormat // ================================================================================================= // MPEG4_MetaHandlerCTor // ===================== XMPFileHandler * MPEG4_MetaHandlerCTor ( XMPFiles * parent ) { return new MPEG4_MetaHandler ( parent ); } // MPEG4_MetaHandlerCTor // ================================================================================================= // MPEG4_MetaHandler::MPEG4_MetaHandler // ==================================== MPEG4_MetaHandler::MPEG4_MetaHandler ( XMPFiles * _parent ) : fileMode(0), havePreferredXMP(false), xmpBoxPos(0), moovBoxPos(0), xmpBoxSize(0), moovBoxSize(0) { this->parent = _parent; // Inherited, can't set in the prefix. this->handlerFlags = kMPEG4_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; this->fileMode = (XMP_Uns8)_parent->tempUI32; _parent->tempUI32 = 0; } // MPEG4_MetaHandler::MPEG4_MetaHandler // ================================================================================================= // MPEG4_MetaHandler::~MPEG4_MetaHandler // ===================================== MPEG4_MetaHandler::~MPEG4_MetaHandler() { // Nothing to do. } // MPEG4_MetaHandler::~MPEG4_MetaHandler // ================================================================================================= // SecondsToXMPDate // ================ // *** ASF has similar code with different origin, should make a shared utility. static void SecondsToXMPDate ( XMP_Uns64 isoSeconds, XMP_DateTime * xmpDate ) { memset ( xmpDate, 0, sizeof(XMP_DateTime) ); // AUDIT: Using sizeof(XMP_DateTime) is safe. XMP_Int32 days = (XMP_Int32) (isoSeconds / 86400); isoSeconds -= ((XMP_Uns64)days * 86400); XMP_Int32 hour = (XMP_Int32) (isoSeconds / 3600); isoSeconds -= ((XMP_Uns64)hour * 3600); XMP_Int32 minute = (XMP_Int32) (isoSeconds / 60); isoSeconds -= ((XMP_Uns64)minute * 60); XMP_Int32 second = (XMP_Int32)isoSeconds; xmpDate->year = 1904; // Start with the ISO origin. xmpDate->month = 1; xmpDate->day = 1; xmpDate->day += days; // Add in the delta. xmpDate->hour = hour; xmpDate->minute = minute; xmpDate->second = second; xmpDate->hasTimeZone = true; // ! Needed for ConvertToUTCTime to do anything. SXMPUtils::ConvertToUTCTime ( xmpDate ); // Normalize the date/time. } // SecondsToXMPDate // ================================================================================================= // XMPDateToSeconds // ================ // *** ASF has similar code with different origin, should make a shared utility. static bool IsLeapYear ( XMP_Int32 year ) { if ( year < 0 ) year = -year + 1; // Fold the negative years, assuming there is a year 0. if ( (year % 4) != 0 ) return false; // Not a multiple of 4. if ( (year % 100) != 0 ) return true; // A multiple of 4 but not a multiple of 100. if ( (year % 400) == 0 ) return true; // A multiple of 400. return false; // A multiple of 100 but not a multiple of 400. } // ------------------------------------------------------------------------------------------------- static XMP_Int32 DaysInMonth ( XMP_Int32 year, XMP_Int32 month ) { static XMP_Int32 daysInMonth[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec XMP_Int32 days = daysInMonth[month]; if ( (month == 2) && IsLeapYear(year) ) days += 1; return days; } // ------------------------------------------------------------------------------------------------- static void XMPDateToSeconds ( const XMP_DateTime & _xmpDate, XMP_Uns64 * isoSeconds ) { XMP_DateTime xmpDate = _xmpDate; SXMPUtils::ConvertToUTCTime ( &xmpDate ); XMP_Uns64 tempSeconds = (XMP_Uns64)xmpDate.second; tempSeconds += (XMP_Uns64)xmpDate.minute * 60; tempSeconds += (XMP_Uns64)xmpDate.hour * 3600; XMP_Int32 days = (xmpDate.day - 1); --xmpDate.month; while ( xmpDate.month >= 1 ) { days += DaysInMonth ( xmpDate.year, xmpDate.month ); --xmpDate.month; } --xmpDate.year; while ( xmpDate.year >= 1904 ) { days += (IsLeapYear ( xmpDate.year) ? 366 : 365 ); --xmpDate.year; } tempSeconds += (XMP_Uns64)days * 86400; *isoSeconds = tempSeconds; } // XMPDateToSeconds // ================================================================================================= // ImportMVHDItems // =============== static bool ImportMVHDItems ( MOOV_Manager::BoxInfo mvhdInfo, SXMPMeta * xmp ) { XMP_Assert ( mvhdInfo.boxType == ISOMedia::k_mvhd ); if ( mvhdInfo.contentSize < 4 ) return false; // Just enough to check the version/flags at first. XMP_Uns8 mvhdVersion = *mvhdInfo.content; if ( mvhdVersion > 1 ) return false; XMP_Uns64 creationTime, modificationTime, duration; XMP_Uns32 timescale; if ( mvhdVersion == 0 ) { if ( mvhdInfo.contentSize < sizeof ( MOOV_Manager::Content_mvhd_0 ) ) return false; MOOV_Manager::Content_mvhd_0 * mvhdRaw_0 = (MOOV_Manager::Content_mvhd_0*) mvhdInfo.content; creationTime = (XMP_Uns64) GetUns32BE ( &mvhdRaw_0->creationTime ); modificationTime = (XMP_Uns64) GetUns32BE ( &mvhdRaw_0->modificationTime ); timescale = GetUns32BE ( &mvhdRaw_0->timescale ); duration = (XMP_Uns64) GetUns32BE ( &mvhdRaw_0->duration ); } else { XMP_Assert ( mvhdVersion == 1 ); if ( mvhdInfo.contentSize < sizeof ( MOOV_Manager::Content_mvhd_1 ) ) return false; MOOV_Manager::Content_mvhd_1 * mvhdRaw_1 = (MOOV_Manager::Content_mvhd_1*) mvhdInfo.content; creationTime = GetUns64BE ( &mvhdRaw_1->creationTime ); modificationTime = GetUns64BE ( &mvhdRaw_1->modificationTime ); timescale = GetUns32BE ( &mvhdRaw_1->timescale ); duration = GetUns64BE ( &mvhdRaw_1->duration ); } bool haveImports = false; XMP_DateTime xmpDate; if ( (creationTime >> 32) < 0xFF ) { // Sanity check for bogus date info. SecondsToXMPDate ( creationTime, &xmpDate ); xmp->SetProperty_Date ( kXMP_NS_XMP, "CreateDate", xmpDate ); haveImports = true; } if ( (modificationTime >> 32) < 0xFF ) { // Sanity check for bogus date info. SecondsToXMPDate ( modificationTime, &xmpDate ); xmp->SetProperty_Date ( kXMP_NS_XMP, "ModifyDate", xmpDate ); haveImports = true; } if ( timescale != 0 ) { // Avoid 1/0 for the scale field. char buffer [32]; // A 64-bit number is at most 20 digits. xmp->DeleteProperty ( kXMP_NS_DM, "duration" ); // Delete the whole struct. snprintf ( buffer, sizeof(buffer), "%llu", duration ); // AUDIT: The buffer is big enough. xmp->SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "value", &buffer[0] ); snprintf ( buffer, sizeof(buffer), "1/%u", timescale ); // AUDIT: The buffer is big enough. xmp->SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "scale", &buffer[0] ); haveImports = true; } return haveImports; } // ImportMVHDItems // ================================================================================================= // ExportMVHDItems // =============== static void ExportMVHDItems ( const SXMPMeta & xmp, MOOV_Manager * moovMgr ) { XMP_DateTime xmpDate; bool createFound, modifyFound; XMP_Uns64 createSeconds = 0, modifySeconds = 0; MOOV_Manager::BoxInfo mvhdInfo; MOOV_Manager::BoxRef mvhdRef = moovMgr->GetBox ( "moov/mvhd", &mvhdInfo ); if ( (mvhdRef == 0) || (mvhdInfo.contentSize < 4) ) return; XMP_Uns8 version = *mvhdInfo.content; if ( version > 1 ) return; createFound = xmp.GetProperty_Date ( kXMP_NS_XMP, "CreateDate", &xmpDate, 0 ); if ( createFound ) XMPDateToSeconds ( xmpDate, &createSeconds ); modifyFound = xmp.GetProperty_Date ( kXMP_NS_XMP, "ModifyDate", &xmpDate, 0 ); if ( modifyFound ) XMPDateToSeconds ( xmpDate, &modifySeconds ); if ( version == 1 ) { // Modify the v1 box in-place. if ( mvhdInfo.contentSize < sizeof ( MOOV_Manager::Content_mvhd_1 ) ) return; XMP_Uns64 oldCreate = GetUns64BE ( mvhdInfo.content + 4 ); XMP_Uns64 oldModify = GetUns64BE ( mvhdInfo.content + 12 ); if ( createFound ) { if ( createSeconds != oldCreate ) PutUns64BE ( createSeconds, ((XMP_Uns8*)mvhdInfo.content + 4) ); moovMgr->NoteChange(); } if ( modifyFound ) { if ( modifySeconds != oldModify ) PutUns64BE ( modifySeconds, ((XMP_Uns8*)mvhdInfo.content + 12) ); moovMgr->NoteChange(); } } else if ( ((createSeconds >> 32) == 0) && ((modifySeconds >> 32) == 0) ) { // Modify the v0 box in-place. if ( mvhdInfo.contentSize < sizeof ( MOOV_Manager::Content_mvhd_0 ) ) return; XMP_Uns32 oldCreate = GetUns32BE ( mvhdInfo.content + 4 ); XMP_Uns32 oldModify = GetUns32BE ( mvhdInfo.content + 8 ); if ( createFound ) { if ( (XMP_Uns32)createSeconds != oldCreate ) PutUns32BE ( (XMP_Uns32)createSeconds, ((XMP_Uns8*)mvhdInfo.content + 4) ); moovMgr->NoteChange(); } if ( modifyFound ) { if ( (XMP_Uns32)modifySeconds != oldModify ) PutUns32BE ( (XMP_Uns32)modifySeconds, ((XMP_Uns8*)mvhdInfo.content + 8) ); moovMgr->NoteChange(); } } else { // Replace the v0 box with a v1 box. XMP_Assert ( createFound | modifyFound ); // One of them has high bits set. if ( mvhdInfo.contentSize != sizeof ( MOOV_Manager::Content_mvhd_0 ) ) return; MOOV_Manager::Content_mvhd_0 * mvhdV0 = (MOOV_Manager::Content_mvhd_0*) mvhdInfo.content; MOOV_Manager::Content_mvhd_1 mvhdV1; // Copy the unchanged fields directly. mvhdV1.timescale = mvhdV0->timescale; mvhdV1.rate = mvhdV0->rate; mvhdV1.volume = mvhdV0->volume; mvhdV1.pad_1 = mvhdV0->pad_1; mvhdV1.pad_2 = mvhdV0->pad_2; mvhdV1.pad_3 = mvhdV0->pad_3; for ( int i = 0; i < 9; ++i ) mvhdV1.matrix[i] = mvhdV0->matrix[i]; for ( int i = 0; i < 6; ++i ) mvhdV1.preDef[i] = mvhdV0->preDef[i]; mvhdV1.nextTrackID = mvhdV0->nextTrackID; // Set the fields that have changes. mvhdV1.vFlags = (1 << 24) | (mvhdV0->vFlags & 0xFFFFFF); mvhdV1.duration = MakeUns64BE ( (XMP_Uns64) GetUns32BE ( &mvhdV0->duration ) ); XMP_Uns64 temp64; temp64 = (XMP_Uns64) GetUns32BE ( &mvhdV0->creationTime ); if ( createFound ) temp64 = createSeconds; mvhdV1.creationTime = MakeUns64BE ( temp64 ); temp64 = (XMP_Uns64) GetUns32BE ( &mvhdV0->modificationTime ); if ( modifyFound ) temp64 = modifySeconds; mvhdV1.modificationTime = MakeUns64BE ( temp64 ); moovMgr->SetBox ( mvhdRef, &mvhdV1, sizeof ( MOOV_Manager::Content_mvhd_1 ) ); } } // ExportMVHDItems // ================================================================================================= // ImportISOCopyrights // =================== // // The cached 'moov'/'udta'/'cprt' boxes are full boxes. The "real" content is a UInt16 packed 3 // character language code and a UTF-8 or UTF-16 string. static bool ImportISOCopyrights ( const std::vector & cprtBoxes, SXMPMeta * xmp ) { bool haveImports = false; std::string tempStr; char lang3 [4]; // The unpacked ISO-639-2/T language code with final null. lang3[3] = 0; for ( size_t i = 0, limit = cprtBoxes.size(); i < limit; ++i ) { const MOOV_Manager::BoxInfo & currBox = cprtBoxes[i]; if ( currBox.contentSize < 4+2+1 ) continue; // Want enough for a non-empty value. if ( *currBox.content != 0 ) continue; // Only proceed for version 0, ignore the flags. XMP_Uns16 packedLang = GetUns16BE ( currBox.content + 4 ); lang3[0] = (packedLang >> 10) + 0x60; lang3[1] = ((packedLang >> 5) & 0x1F) + 0x60; lang3[2] = (packedLang & 0x1F) + 0x60; XMP_StringPtr xmpLang = Lookup2LetterLang ( lang3 ); if ( *xmpLang == 0 ) continue; XMP_StringPtr textPtr = (XMP_StringPtr) (currBox.content + 6); XMP_StringLen textLen = currBox.contentSize - 6; if ( (textLen >= 2) && (GetUns16BE(textPtr) == 0xFEFF) ) { FromUTF16 ( (UTF16Unit*)textPtr, textLen/2, &tempStr, true /* big endian */ ); textPtr = tempStr.c_str(); } xmp->SetLocalizedText ( kXMP_NS_DC, "rights", xmpLang, xmpLang, textPtr ); haveImports = true; } return haveImports; } // ImportISOCopyrights // ================================================================================================= // ExportISOCopyrights // =================== static void ExportISOCopyrights ( const SXMPMeta & xmp, MOOV_Manager * moovMgr ) { bool haveMappings = false; // True if any ISO-XMP language mappings are found. // Go through the ISO 'cprt' items and look for a corresponding XMP item. Ignore the ISO item if // there is no language mapping to XMP. Update the ISO item if the mappable XMP exists, delete // the ISO item if the mappable XMP does not exist. Since the import side would have made sure // the mappable XMP items existed, if they don't now they must have been deleted. MOOV_Manager::BoxInfo udtaInfo; MOOV_Manager::BoxRef udtaRef = moovMgr->GetBox ( "moov/udta", &udtaInfo ); if ( udtaRef == 0 ) return; std::string xmpPath, xmpValue, xmpLang, tempStr; char lang3 [4]; // An unpacked ISO-639-2/T language code. lang3[3] = 0; for ( XMP_Uns32 ordinal = udtaInfo.childCount; ordinal > 0; --ordinal ) { // ! Go backwards because of deletions. MOOV_Manager::BoxInfo cprtInfo; MOOV_Manager::BoxRef cprtRef = moovMgr->GetNthChild ( udtaRef, ordinal-1, &cprtInfo ); if ( (cprtRef == 0) ) break; // Sanity check, should not happen. if ( (cprtInfo.boxType != ISOMedia::k_cprt) || (cprtInfo.contentSize < 6) ) continue; if ( *cprtInfo.content != 0 ) continue; // Only accept version 0, ignore the flags. XMP_Uns16 packedLang = GetUns16BE ( cprtInfo.content + 4 ); lang3[0] = (packedLang >> 10) + 0x60; lang3[1] = ((packedLang >> 5) & 0x1F) + 0x60; lang3[2] = (packedLang & 0x1F) + 0x60; XMP_StringPtr lang2 = Lookup2LetterLang ( lang3 ); if ( *lang2 == 0 ) continue; // No language mapping to XMP. haveMappings = true; bool xmpFound = xmp.GetLocalizedText ( kXMP_NS_DC, "rights", lang2, lang2, &xmpLang, &xmpValue, 0 ); if ( xmpFound ) { if ( (xmpLang.size() < 2) || ( (xmpLang.size() == 2) && (xmpLang != lang2) ) || ( (xmpLang.size() > 2) && ( (xmpLang[2] != '-') || (! XMP_LitNMatch ( xmpLang.c_str(), lang2, 2)) ) ) ) { xmpFound = false; // The language does not match, the corresponding XMP does not exist. } } if ( ! xmpFound ) { // No XMP, delete the ISO item. moovMgr->DeleteNthChild ( udtaRef, ordinal-1 ); } else { // Update the ISO item if necessary. XMP_StringPtr isoStr = (XMP_StringPtr)cprtInfo.content + 6; size_t rawLen = cprtInfo.contentSize - 6; if ( (rawLen >= 8) && (GetUns16BE(isoStr) == 0xFEFF) ) { FromUTF16 ( (UTF16Unit*)(isoStr+2), (rawLen-2)/2, &tempStr, true /* big endian */ ); isoStr = tempStr.c_str(); } if ( xmpValue != isoStr ) { std::string newContent = "vfffll"; newContent += xmpValue; memcpy ( (char*)newContent.c_str(), cprtInfo.content, 6 ); // Keep old version, flags, and language. moovMgr->SetBox ( cprtRef, newContent.c_str(), (XMP_Uns32)(newContent.size() + 1) ); } } } // Go through the XMP items and look for a corresponding ISO item. Skip if found (did it above), // otherwise add a new ISO item. bool haveXDefault = false; XMP_Index xmpCount = xmp.CountArrayItems ( kXMP_NS_DC, "rights" ); for ( XMP_Index xmpIndex = 1; xmpIndex <= xmpCount; ++xmpIndex ) { // ! The first XMP array index is 1. SXMPUtils::ComposeArrayItemPath ( kXMP_NS_DC, "rights", xmpIndex, &xmpPath ); xmp.GetArrayItem ( kXMP_NS_DC, "rights", xmpIndex, &xmpValue, 0 ); bool hasLang = xmp.GetQualifier ( kXMP_NS_DC, xmpPath.c_str(), kXMP_NS_XML, "lang", &xmpLang, 0 ); if ( ! hasLang ) continue; // Sanity check. if ( xmpLang == "x-default" ) { haveXDefault = true; // See later special case. continue; } XMP_StringPtr isoLang = ""; size_t rootLen = xmpLang.find ( '-' ); if ( rootLen == std::string::npos ) rootLen = xmpLang.size(); if ( rootLen == 2 ) { xmpLang[2] = 0; isoLang = Lookup3LetterLang ( xmpLang.c_str() ); if ( *isoLang == 0 ) continue; } else if ( rootLen == 3 ) { xmpLang[3] = 0; isoLang = xmpLang.c_str(); } else { continue; } haveMappings = true; bool isoFound = false; XMP_Uns16 packedLang = ((isoLang[0] - 0x60) << 10) | ((isoLang[1] - 0x60) << 5) | (isoLang[2] - 0x60); for ( XMP_Uns32 isoIndex = 0; (isoIndex < udtaInfo.childCount) && (! isoFound); ++isoIndex ) { MOOV_Manager::BoxInfo cprtInfo; MOOV_Manager::BoxRef cprtRef = moovMgr->GetNthChild ( udtaRef, isoIndex, &cprtInfo ); if ( (cprtRef == 0) ) break; // Sanity check, should not happen. if ( (cprtInfo.boxType != ISOMedia::k_cprt) || (cprtInfo.contentSize < 6) ) continue; if ( *cprtInfo.content != 0 ) continue; // Only accept version 0, ignore the flags. if ( packedLang != GetUns16BE ( cprtInfo.content + 4 ) ) continue; // Look for matching language. isoFound = true; // Found the language entry, whether or not we update it. } if ( ! isoFound ) { std::string newContent = "vfffll"; newContent += xmpValue; *((XMP_Uns32*)newContent.c_str()) = 0; // Set the version and flags to zero. PutUns16BE ( packedLang, (char*)newContent.c_str() + 4 ); moovMgr->AddChildBox ( udtaRef, ISOMedia::k_cprt, newContent.c_str(), (XMP_Uns32)(newContent.size() + 1) ); } } // If there were no mappings in the loops, export the XMP "x-default" value to the first ISO item. if ( ! haveMappings ) { MOOV_Manager::BoxInfo cprtInfo; MOOV_Manager::BoxRef cprtRef = moovMgr->GetTypeChild ( udtaRef, ISOMedia::k_cprt, &cprtInfo ); if ( (cprtRef != 0) && (cprtInfo.contentSize >= 6) && (*cprtInfo.content == 0) ) { bool xmpFound = xmp.GetLocalizedText ( kXMP_NS_DC, "rights", "", "x-default", &xmpLang, &xmpValue, 0 ); if ( xmpFound && (xmpLang == "x-default") ) { // Update the ISO item if necessary. XMP_StringPtr isoStr = (XMP_StringPtr)cprtInfo.content + 6; size_t rawLen = cprtInfo.contentSize - 6; if ( (rawLen >= 8) && (GetUns16BE(isoStr) == 0xFEFF) ) { FromUTF16 ( (UTF16Unit*)(isoStr+2), (rawLen-2)/2, &tempStr, true /* big endian */ ); isoStr = tempStr.c_str(); } if ( xmpValue != isoStr ) { std::string newContent = "vfffll"; newContent += xmpValue; memcpy ( (char*)newContent.c_str(), cprtInfo.content, 6 ); // Keep old version, flags, and language. moovMgr->SetBox ( cprtRef, newContent.c_str(), (XMP_Uns32)(newContent.size() + 1) ); } } } } } // ExportISOCopyrights // ================================================================================================= // ExportQuickTimeItems // ==================== static void ExportQuickTimeItems ( const SXMPMeta & xmp, TradQT_Manager * qtMgr, MOOV_Manager * moovMgr ) { // The QuickTime 'udta' timecode items are done here for simplicity. #define createWithZeroLang true qtMgr->ExportSimpleXMP ( kQTilst_Reel, xmp, kXMP_NS_DM, "tapeName" ); qtMgr->ExportSimpleXMP ( kQTilst_Timecode, xmp, kXMP_NS_DM, "startTimecode/xmpDM:timeValue", createWithZeroLang ); qtMgr->ExportSimpleXMP ( kQTilst_TimeScale, xmp, kXMP_NS_DM, "startTimeScale", createWithZeroLang ); qtMgr->ExportSimpleXMP ( kQTilst_TimeSize, xmp, kXMP_NS_DM, "startTimeSampleSize", createWithZeroLang ); qtMgr->UpdateChangedBoxes ( moovMgr ); } // ExportQuickTimeItems // ================================================================================================= // SelectTimeFormat // ================ static const char * SelectTimeFormat ( const MPEG4_MetaHandler::TimecodeTrackInfo & tmcdInfo ) { const char * timeFormat = 0; float fltFPS = (float)tmcdInfo.timeScale / (float)tmcdInfo.frameDuration; int intFPS = (int) (fltFPS + 0.5); switch ( intFPS ) { case 30: if ( fltFPS >= 29.985 ) { timeFormat = "30Timecode"; } else if ( tmcdInfo.isDropFrame ) { timeFormat = "2997DropTimecode"; } else { timeFormat = "2997NonDropTimecode"; } break; case 24: if ( fltFPS >= 23.988 ) { timeFormat = "24Timecode"; } else { timeFormat = "23976Timecode"; } break; case 25: timeFormat = "25Timecode"; break; case 50: timeFormat = "50Timecode"; break; case 60: if ( fltFPS >= 59.97 ) { timeFormat = "60Timecode"; } else if ( tmcdInfo.isDropFrame ) { timeFormat = "5994DropTimecode"; } else { timeFormat = "5994NonDropTimecode"; } break; } return timeFormat; } // SelectTimeFormat // ================================================================================================= // SelectTimeFormat // ================ static const char * SelectTimeFormat ( const SXMPMeta & xmp ) { bool ok; MPEG4_MetaHandler::TimecodeTrackInfo tmcdInfo; XMP_Int64 timeScale; ok = xmp.GetProperty_Int64 ( kXMP_NS_DM, "startTimeScale", &timeScale, 0 ); if ( ! ok ) return 0; tmcdInfo.timeScale = (XMP_Uns32)timeScale; XMP_Int64 frameDuration; ok = xmp.GetProperty_Int64 ( kXMP_NS_DM, "startTimeSampleSize", &frameDuration, 0 ); if ( ! ok ) return 0; tmcdInfo.frameDuration = (XMP_Uns32)frameDuration; std::string timecode; ok = xmp.GetProperty ( kXMP_NS_DM, "startTimecode/xmpDM:timeValue", &timecode, 0 ); if ( ! ok ) return 0; if ( (timecode.size() == 11) && (timecode[8] == ';') ) tmcdInfo.isDropFrame = true; return SelectTimeFormat ( tmcdInfo ); } // SelectTimeFormat // ================================================================================================= // ComposeTimecode // =============== static const char * kDecDigits = "0123456789"; #define TwoDigits(val,str) (str)[0] = kDecDigits[(val)/10]; (str)[1] = kDecDigits[(val)%10] static bool ComposeTimecode ( const MPEG4_MetaHandler::TimecodeTrackInfo & tmcdInfo, std::string * strValue ) { float fltFPS = (float)tmcdInfo.timeScale / (float)tmcdInfo.frameDuration; int intFPS = (int) (fltFPS + 0.5); if ( (intFPS != 30) && (intFPS != 24) && (intFPS != 25) && (intFPS != 50) && (intFPS != 60) ) return false; XMP_Uns32 framesPerDay = intFPS * 24*60*60; XMP_Uns32 dropLimit = 2; // Used in the drop-frame correction. if ( tmcdInfo.isDropFrame ) { if ( intFPS == 30 ) { framesPerDay = 2589408; // = 29.97 * 24*60*60 } else if ( intFPS == 60 ) { framesPerDay = 5178816; // = 59.94 * 24*60*60 dropLimit = 4; } else { strValue->erase(); return false; // Dropframe can only apply to 29.97 and 59.94. } } XMP_Uns32 framesPerHour = framesPerDay / 24; XMP_Uns32 framesPerTenMinutes = framesPerHour / 6; XMP_Uns32 framesPerMinute = framesPerTenMinutes / 10; XMP_Uns32 frameCount = tmcdInfo.timecodeSample; while (frameCount >= framesPerDay ) frameCount -= framesPerDay; // Normalize to be within 24 hours. XMP_Uns32 hours, minHigh, minLow, seconds; hours = frameCount / framesPerHour; frameCount -= (hours * framesPerHour); minHigh = frameCount / framesPerTenMinutes; frameCount -= (minHigh * framesPerTenMinutes); minLow = frameCount / framesPerMinute; frameCount -= (minLow * framesPerMinute); // Do some drop-frame corrections at this point: If this is drop-frame and the units of minutes // is non-zero, and the seconds are zero, and the frames are zero or one, the time is illegal. // Perform correction by subtracting 1 from the units of minutes and adding 1798 to the frames.Ê // For example, 1:00:00 becomes 59:28, and 1:00:01 becomes 59:29. A special case can occur for // when the frameCount just before the minHigh calculation is less than framesPerTenMinutes but // more than 10*framesPerMinute. This happens because of roundoff, and will result in a minHigh // of 0 and a minLow of 10.ÊThe drop frame correction mustÊalso be performed for this case. if ( tmcdInfo.isDropFrame ) { if ( (minLow == 10) || ((minLow != 0) && (frameCount < dropLimit)) ) { minLow -= 1; frameCount += framesPerMinute; } } seconds = frameCount / intFPS; frameCount -= (seconds * intFPS); if ( tmcdInfo.isDropFrame ) { *strValue = "hh;mm;ss;ff"; } else { *strValue = "hh:mm:ss:ff"; } char * str = (char*)strValue->c_str(); TwoDigits ( hours, str ); str[3] = kDecDigits[minHigh]; str[4] = kDecDigits[minLow]; TwoDigits ( seconds, str+6 ); TwoDigits ( frameCount, str+9 ); return true; } // ComposeTimecode // ================================================================================================= // DecomposeTimecode // ================= static bool DecomposeTimecode ( const char * strValue, MPEG4_MetaHandler::TimecodeTrackInfo * tmcdInfo ) { float fltFPS = (float)tmcdInfo->timeScale / (float)tmcdInfo->frameDuration; int intFPS = (int) (fltFPS + 0.5); if ( (intFPS != 30) && (intFPS != 24) && (intFPS != 25) && (intFPS != 50) && (intFPS != 60) ) return false; XMP_Uns32 framesPerDay = intFPS * 24*60*60; int items, hours, minutes, seconds, frames; if ( ! tmcdInfo->isDropFrame ) { items = sscanf ( strValue, "%d:%d:%d:%d", &hours, &minutes, &seconds, &frames ); } else { items = sscanf ( strValue, "%d;%d;%d;%d", &hours, &minutes, &seconds, &frames ); if ( intFPS == 30 ) { framesPerDay = 2589408; // = 29.97 * 24*60*60 } else if ( intFPS == 60 ) { framesPerDay = 5178816; // = 59.94 * 24*60*60 } else { return false; // Dropframe can only apply to 29.97 and 59.94. } } if ( items != 4 ) return false; int minHigh = minutes / 10; int minLow = minutes % 10; XMP_Uns32 framesPerHour = framesPerDay / 24; XMP_Uns32 framesPerTenMinutes = framesPerHour / 6; XMP_Uns32 framesPerMinute = framesPerTenMinutes / 10; tmcdInfo->timecodeSample = (hours * framesPerHour) + (minHigh * framesPerTenMinutes) + (minLow * framesPerMinute) + (seconds * intFPS) + frames; return true; } // DecomposeTimecode // ================================================================================================= // FindTimecodeTrack // ================= // // Look for a well-formed timecode track, return the .../mdia/minf/stbl box ref. static MOOV_Manager::BoxRef FindTimecodeTrack ( const MOOV_Manager & moovMgr ) { // Find a 'trak' box with a handler type of 'tmcd'. MOOV_Manager::BoxInfo moovInfo; MOOV_Manager::BoxRef moovRef = moovMgr.GetBox ( "moov", &moovInfo ); XMP_Assert ( moovRef != 0 ); MOOV_Manager::BoxInfo trakInfo; MOOV_Manager::BoxRef trakRef; size_t i = 0; for ( ; i < moovInfo.childCount; ++i ) { trakRef = moovMgr.GetNthChild ( moovRef, i, &trakInfo ); if ( trakRef == 0 ) return 0; // Sanity check, should not happen. if ( trakInfo.boxType != ISOMedia::k_trak ) continue; MOOV_Manager::BoxRef innerRef; MOOV_Manager::BoxInfo innerInfo; innerRef = moovMgr.GetTypeChild ( trakRef, ISOMedia::k_mdia, &innerInfo ); if ( innerRef == 0 ) continue; innerRef = moovMgr.GetTypeChild ( innerRef, ISOMedia::k_hdlr, &innerInfo ); if ( (innerRef == 0) || (innerInfo.contentSize < sizeof ( MOOV_Manager::Content_hdlr )) ) continue; const MOOV_Manager::Content_hdlr * hdlr = (MOOV_Manager::Content_hdlr*) innerInfo.content; if ( hdlr->versionFlags != 0 ) continue; if ( GetUns32BE ( &hdlr->handlerType ) == ISOMedia::k_tmcd ) break; } if ( i == moovInfo.childCount ) return 0; // Find the .../mdia/minf/stbl box. MOOV_Manager::BoxInfo tempInfo; MOOV_Manager::BoxRef tempRef, stblRef; tempRef = moovMgr.GetTypeChild ( trakRef, ISOMedia::k_mdia, &tempInfo ); if ( tempRef == 0 ) return 0; tempRef = moovMgr.GetTypeChild ( tempRef, ISOMedia::k_minf, &tempInfo ); if ( tempRef == 0 ) return 0; stblRef = moovMgr.GetTypeChild ( tempRef, ISOMedia::k_stbl, &tempInfo ); return stblRef; } // FindTimecodeTrack // ================================================================================================= // ImportTimecodeItems // =================== static bool ImportTimecodeItems ( const MPEG4_MetaHandler::TimecodeTrackInfo & tmcdInfo, const TradQT_Manager & qtInfo, SXMPMeta * xmp ) { std::string xmpValue; bool haveItem; bool haveImports = false; // The QT user data item '©REL' goes into xmpDM:tapeName, and the 'name' box at the end of the // timecode sample description goes into xmpDM:altTapeName. haveImports |= qtInfo.ImportSimpleXMP ( kQTilst_Reel, xmp, kXMP_NS_DM, "tapeName" ); if ( ! tmcdInfo.macName.empty() ) { haveItem = ConvertFromMacLang ( tmcdInfo.macName, tmcdInfo.macLang, &xmpValue ); if ( haveItem ) { xmp->SetProperty ( kXMP_NS_DM, "altTapeName", xmpValue.c_str() ); haveImports = true; } } // The QT user data item '©TSC' goes into xmpDM:startTimeScale. If that isn't present, then // the timecode sample description's timeScale is used. haveItem = qtInfo.ImportSimpleXMP ( kQTilst_TimeScale, xmp, kXMP_NS_DM, "startTimeScale" ); if ( tmcdInfo.stsdBoxFound & (! haveItem) ) { xmp->SetProperty_Int64 ( kXMP_NS_DM, "startTimeScale", tmcdInfo.timeScale ); haveItem = true; } haveImports |= haveItem; // The QT user data item '©TSZ' goes into xmpDM:startTimeSampleSize. If that isn't present, then // the timecode sample description's frameDuration is used. haveItem = qtInfo.ImportSimpleXMP ( kQTilst_TimeSize, xmp, kXMP_NS_DM, "startTimeSampleSize" ); if ( tmcdInfo.stsdBoxFound & (! haveItem) ) { xmp->SetProperty_Int64 ( kXMP_NS_DM, "startTimeSampleSize", tmcdInfo.frameDuration ); haveItem = true; } haveImports |= haveItem; const char * timeFormat; // The Timecode struct type is used for xmpDM:startTimecode and xmpDM:altTimecode. For both, only // the xmpDM:timeValue and xmpDM:timeFormat fields are set. // The QT user data item '©TIM' goes into xmpDM:startTimecode/xmpDM:timeValue. This is an already // formatted timecode string. The XMP values of xmpDM:startTimeScale, xmpDM:startTimeSampleSize, // and xmpDM:startTimecode/xmpDM:timeValue are used to select the timeFormat value. haveImports |= qtInfo.ImportSimpleXMP ( kQTilst_Timecode, xmp, kXMP_NS_DM, "startTimecode/xmpDM:timeValue" ); timeFormat = SelectTimeFormat ( *xmp ); if ( timeFormat != 0 ) { xmp->SetProperty ( kXMP_NS_DM, "startTimecode/xmpDM:timeFormat", timeFormat ); haveImports = true; } if ( tmcdInfo.stsdBoxFound ) { haveItem = ComposeTimecode ( tmcdInfo, &xmpValue ); if ( haveItem ) { xmp->SetProperty ( kXMP_NS_DM, "altTimecode/xmpDM:timeValue", xmpValue.c_str() ); haveImports = true; } timeFormat = SelectTimeFormat ( tmcdInfo ); if ( timeFormat != 0 ) { xmp->SetProperty ( kXMP_NS_DM, "altTimecode/xmpDM:timeFormat", timeFormat ); haveImports = true; } } return haveImports; } // ImportTimecodeItems // ================================================================================================= // ExportTimecodeItems // =================== static void ExportTimecodeItems ( const SXMPMeta & xmp, MPEG4_MetaHandler::TimecodeTrackInfo * tmcdInfo, TradQT_Manager * qtMgr, MOOV_Manager * moovMgr ) { // Export the items that go into the timecode track: // - the timescale and frame duration in the first 'stsd' table entry // - the 'name' box appended to the first 'stsd' table entry // - the first timecode sample // ! The QuickTime 'udta' timecode items are handled in ExportQuickTimeItems. if ( ! tmcdInfo->stsdBoxFound ) return; // Don't make changes unless there is a well-formed timecode track. MOOV_Manager::BoxRef stblRef = FindTimecodeTrack ( *moovMgr ); if ( stblRef == 0 ) return; MOOV_Manager::BoxInfo stsdInfo; MOOV_Manager::BoxRef stsdRef; stsdRef = moovMgr->GetTypeChild ( stblRef, ISOMedia::k_stsd, &stsdInfo ); if ( stsdRef == 0 ) return; if ( stsdInfo.contentSize < (8 + sizeof ( MOOV_Manager::Content_stsd_entry )) ) return; if ( GetUns32BE ( stsdInfo.content + 4 ) == 0 ) return; // Make sure the entry count is non-zero. const MOOV_Manager::Content_stsd_entry * stsdRawEntry = (MOOV_Manager::Content_stsd_entry*) (stsdInfo.content + 8); XMP_Uns32 stsdEntrySize = GetUns32BE ( &stsdRawEntry->entrySize ); if ( stsdEntrySize > (stsdInfo.contentSize - 4) ) stsdEntrySize = stsdInfo.contentSize - 4; if ( stsdEntrySize < sizeof ( MOOV_Manager::Content_stsd_entry ) ) return; bool ok; std::string xmpValue; XMP_Int64 int64; // Used to allow UInt32 values, GetProperty_Int is SInt32. // The tmcdInfo timeScale field is set from xmpDM:startTimeScale. ok = xmp.GetProperty_Int64 ( kXMP_NS_DM, "startTimeScale", &int64, 0 ); if ( ok && (int64 <= 0xFFFFFFFF) && ((XMP_Uns32)int64 != tmcdInfo->timeScale) ) { tmcdInfo->timeScale = (XMP_Uns32)int64; PutUns32BE ( tmcdInfo->timeScale, (void*)&stsdRawEntry->timeScale ); moovMgr->NoteChange(); } // The tmcdInfo frameDuration field is set from xmpDM:startTimeSampleSize. ok = xmp.GetProperty_Int64 ( kXMP_NS_DM, "startTimeSampleSize", &int64, 0 ); if ( ok && (int64 <= 0xFFFFFFFF) && ((XMP_Uns32)int64 != tmcdInfo->frameDuration) ) { tmcdInfo->frameDuration = (XMP_Uns32)int64; PutUns32BE ( tmcdInfo->frameDuration, (void*)&stsdRawEntry->frameDuration ); moovMgr->NoteChange(); } // The tmcdInfo isDropFrame flag is set from xmpDM:altTimecode/xmpDM:timeValue. The timeScale // and frameDuration must be updated first, they are used by DecomposeTimecode. Compute the new // UInt32 timecode sample, but it gets written to the file later by UpdateFile. ok = xmp.GetProperty ( kXMP_NS_DM, "altTimecode/xmpDM:timeValue", &xmpValue, 0 ); if ( ok && (xmpValue.size() == 11) ) { bool oldDropFrame = tmcdInfo->isDropFrame; tmcdInfo->isDropFrame = false; if ( xmpValue[8] == ';' ) tmcdInfo->isDropFrame = true; if ( oldDropFrame != tmcdInfo->isDropFrame ) { XMP_Uns32 flags = GetUns32BE ( &stsdRawEntry->flags ); flags = (flags & 0xFFFFFFFE) | (XMP_Uns32)tmcdInfo->isDropFrame; PutUns32BE ( flags, (void*)&stsdRawEntry->flags ); moovMgr->NoteChange(); } XMP_Uns32 oldSample = tmcdInfo->timecodeSample; ok = DecomposeTimecode ( xmpValue.c_str(), tmcdInfo ); if ( ok && (oldSample != tmcdInfo->timecodeSample) ) moovMgr->NoteChange(); } // The 'name' box attached to the first 'stsd' table entry is set from xmpDM:altTapeName. bool replaceNameBox = false; ok = xmp.GetProperty ( kXMP_NS_DM, "altTapeName", &xmpValue, 0 ); if ( (! ok) || xmpValue.empty() ) { if ( tmcdInfo->nameOffset != 0 ) replaceNameBox = true; // No XMP, get rid of existing name. } else { std::string macValue; ok = ConvertToMacLang ( xmpValue, tmcdInfo->macLang, &macValue ); if ( ok && (macValue != tmcdInfo->macName) ) { tmcdInfo->macName = macValue; replaceNameBox = true; // Write changed name. } } if ( replaceNameBox ) { // To replace the 'name' box we have to create an entire new 'stsd' box, and attach the // new name to the first 'stsd' table entry. The 'name' box content is a UInt16 text length, // UInt16 language code, and Mac encoded text with no nul termination. if ( tmcdInfo->macName.size() > 0xFFFF ) tmcdInfo->macName.erase ( 0xFFFF ); ISOMedia::BoxInfo oldNameInfo; XMP_Assert ( (oldNameInfo.headerSize == 0) && (oldNameInfo.contentSize == 0) ); if ( tmcdInfo->nameOffset != 0 ) { const XMP_Uns8 * oldNamePtr = stsdInfo.content + tmcdInfo->nameOffset; const XMP_Uns8 * oldNameLimit = stsdInfo.content + stsdInfo.contentSize; (void) ISOMedia::GetBoxInfo ( oldNamePtr, oldNameLimit, &oldNameInfo ); } XMP_Uns32 oldNameBoxSize = (XMP_Uns32)oldNameInfo.headerSize + (XMP_Uns32)oldNameInfo.contentSize; XMP_Uns32 newNameBoxSize = 0; if ( ! tmcdInfo->macName.empty() ) newNameBoxSize = 4+4 + 2+2 + (XMP_Uns32)tmcdInfo->macName.size(); XMP_Uns32 stsdNewContentSize = stsdInfo.contentSize - oldNameBoxSize + newNameBoxSize; RawDataBlock stsdNewContent; stsdNewContent.assign ( stsdNewContentSize, 0 ); // Get the space allocated, direct fill below. XMP_Uns32 stsdPrefixSize = tmcdInfo->nameOffset; if ( tmcdInfo->nameOffset == 0 ) stsdPrefixSize = 4+4 + sizeof ( MOOV_Manager::Content_stsd_entry ); XMP_Uns32 oldSuffixOffset = stsdPrefixSize + oldNameBoxSize; XMP_Uns32 newSuffixOffset = stsdPrefixSize + newNameBoxSize; XMP_Uns32 stsdSuffixSize = stsdInfo.contentSize - oldSuffixOffset; memcpy ( &stsdNewContent[0], stsdInfo.content, stsdPrefixSize ); if ( stsdSuffixSize != 0 ) memcpy ( &stsdNewContent[newSuffixOffset], (stsdInfo.content + oldSuffixOffset), stsdSuffixSize ); XMP_Uns32 newEntrySize = stsdEntrySize - oldNameBoxSize + newNameBoxSize; MOOV_Manager::Content_stsd_entry * stsdNewEntry = (MOOV_Manager::Content_stsd_entry*) (&stsdNewContent[0] + 8); PutUns32BE ( newEntrySize, &stsdNewEntry->entrySize ); if ( newNameBoxSize != 0 ) { PutUns32BE ( newNameBoxSize, &stsdNewContent[stsdPrefixSize] ); PutUns32BE ( ISOMedia::k_name, &stsdNewContent[stsdPrefixSize+4] ); PutUns16BE ( (XMP_Uns16)tmcdInfo->macName.size(), &stsdNewContent[stsdPrefixSize+8] ); PutUns16BE ( tmcdInfo->macLang, &stsdNewContent[stsdPrefixSize+10] ); memcpy ( &stsdNewContent[stsdPrefixSize+12], tmcdInfo->macName.c_str(), tmcdInfo->macName.size() ); } moovMgr->SetBox ( stsdRef, &stsdNewContent[0], stsdNewContentSize ); } } // ExportTimecodeItems // ================================================================================================= // ImportCr8rItems // =============== #pragma pack ( push, 1 ) struct PrmLBoxContent { XMP_Uns32 magic; XMP_Uns32 size; XMP_Uns16 verAPI; XMP_Uns16 verCode; XMP_Uns32 exportType; XMP_Uns16 MacVRefNum; XMP_Uns32 MacParID; char filePath[260]; }; enum { kExportTypeMovie = 0, kExportTypeStill = 1, kExportTypeAudio = 2, kExportTypeCustom = 3 }; struct Cr8rBoxContent { XMP_Uns32 magic; XMP_Uns32 size; XMP_Uns16 majorVer; XMP_Uns16 minorVer; XMP_Uns32 creatorCode; XMP_Uns32 appleEvent; char fileExt[16]; char appOptions[16]; char appName[32]; }; #pragma pack ( pop ) // ------------------------------------------------------------------------------------------------- static bool ImportCr8rItems ( const MOOV_Manager & moovMgr, SXMPMeta * xmp ) { bool haveXMP = false; MOOV_Manager::BoxInfo infoPrmL, infoCr8r; MOOV_Manager::BoxRef refPrmL = moovMgr.GetBox ( "moov/udta/PrmL", &infoPrmL ); MOOV_Manager::BoxRef refCr8r = moovMgr.GetBox ( "moov/udta/Cr8r", &infoCr8r ); bool havePrmL = ( (refPrmL != 0) && (infoPrmL.contentSize == sizeof ( PrmLBoxContent )) ); bool haveCr8r = ( (refCr8r != 0) && (infoCr8r.contentSize == sizeof ( Cr8rBoxContent )) ); if ( havePrmL ) { PrmLBoxContent rawPrmL; XMP_Assert ( sizeof ( rawPrmL ) == 282 ); XMP_Assert ( sizeof ( rawPrmL.filePath ) == 260 ); memcpy ( &rawPrmL, infoPrmL.content, sizeof ( rawPrmL ) ); if ( rawPrmL.magic != 0xBEEFCAFE ) { Flip4 ( &rawPrmL.exportType ); // The only numeric field that we care about. } rawPrmL.filePath[259] = 0; // Ensure a terminating nul. if ( rawPrmL.filePath[0] != 0 ) { if ( rawPrmL.filePath[0] == '/' ) { haveXMP = true; xmp->SetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "posixProjectPath", rawPrmL.filePath ); } else if ( XMP_LitNMatch ( rawPrmL.filePath, "\\\\?\\", 4 ) ) { haveXMP = true; xmp->SetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "uncProjectPath", rawPrmL.filePath ); } } const char * exportStr = 0; switch ( rawPrmL.exportType ) { case kExportTypeMovie : exportStr = "movie"; break; case kExportTypeStill : exportStr = "still"; break; case kExportTypeAudio : exportStr = "audio"; break; case kExportTypeCustom : exportStr = "custom"; break; } if ( exportStr != 0 ) { haveXMP = true; xmp->SetStructField ( kXMP_NS_DM, "projectRef", kXMP_NS_DM, "type", exportStr ); } } if ( haveCr8r ) { Cr8rBoxContent rawCr8r; XMP_Assert ( sizeof ( rawCr8r ) == 84 ); XMP_Assert ( sizeof ( rawCr8r.fileExt ) == 16 ); XMP_Assert ( sizeof ( rawCr8r.appOptions ) == 16 ); XMP_Assert ( sizeof ( rawCr8r.appName ) == 32 ); memcpy ( &rawCr8r, infoCr8r.content, sizeof ( rawCr8r ) ); if ( rawCr8r.magic != 0xBEEFCAFE ) { Flip4 ( &rawCr8r.creatorCode ); // The only numeric fields that we care about. Flip4 ( &rawCr8r.appleEvent ); } std::string fieldPath; SXMPUtils::ComposeStructFieldPath ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "applicationCode", &fieldPath ); if ( rawCr8r.creatorCode != 0 ) { haveXMP = true; xmp->SetProperty_Int64 ( kXMP_NS_CreatorAtom, fieldPath.c_str(), (XMP_Int64)rawCr8r.creatorCode ); // ! Unsigned trickery. } SXMPUtils::ComposeStructFieldPath ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "invocationAppleEvent", &fieldPath ); if ( rawCr8r.appleEvent != 0 ) { haveXMP = true; xmp->SetProperty_Int64 ( kXMP_NS_CreatorAtom, fieldPath.c_str(), (XMP_Int64)rawCr8r.appleEvent ); // ! Unsigned trickery. } rawCr8r.fileExt[15] = 0; // Ensure a terminating nul. if ( rawCr8r.fileExt[0] != 0 ) { haveXMP = true; xmp->SetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "extension", rawCr8r.fileExt ); } rawCr8r.appOptions[15] = 0; // Ensure a terminating nul. if ( rawCr8r.appOptions[0] != 0 ) { haveXMP = true; xmp->SetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "invocationFlags", rawCr8r.appOptions ); } rawCr8r.appName[31] = 0; // Ensure a terminating nul. if ( rawCr8r.appName[0] != 0 ) { haveXMP = true; xmp->SetProperty ( kXMP_NS_XMP, "CreatorTool", rawCr8r.appName ); } } return haveXMP; } // ImportCr8rItems // ================================================================================================= // ExportCr8rItems // =============== static inline void SetBufferedString ( char * dest, const std::string source, size_t limit ) { memset ( dest, 0, limit ); size_t count = source.size(); if ( count >= limit ) count = limit - 1; // Ensure a terminating nul. memcpy ( dest, source.c_str(), count ); } // ------------------------------------------------------------------------------------------------- static void ExportCr8rItems ( const SXMPMeta & xmp, MOOV_Manager * moovMgr ) { bool haveNewCr8r = false; std::string creatorCode, appleEvent, fileExt, appOptions, appName; haveNewCr8r |= xmp.GetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "applicationCode", &creatorCode, 0 ); haveNewCr8r |= xmp.GetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "invocationAppleEvent", &appleEvent, 0 ); haveNewCr8r |= xmp.GetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "extension", &fileExt, 0 ); haveNewCr8r |= xmp.GetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "invocationFlags", &appOptions, 0 ); haveNewCr8r |= xmp.GetProperty ( kXMP_NS_XMP, "CreatorTool", &appName, 0 ); MOOV_Manager::BoxInfo infoCr8r; MOOV_Manager::BoxRef refCr8r = moovMgr->GetBox ( "moov/udta/Cr8r", &infoCr8r ); bool haveOldCr8r = ( (refCr8r != 0) && (infoCr8r.contentSize == sizeof ( Cr8rBoxContent )) ); if ( ! haveNewCr8r ) { if ( haveOldCr8r ) { MOOV_Manager::BoxRef udtaRef = moovMgr->GetBox ( "moov/udta", 0 ); moovMgr->DeleteTypeChild ( udtaRef, 0x43723872 /* 'Cr8r' */ ); } return; } Cr8rBoxContent newCr8r; const Cr8rBoxContent * oldCr8r = (Cr8rBoxContent*) infoCr8r.content; if ( ! haveOldCr8r ) { memset ( &newCr8r, 0, sizeof(newCr8r) ); newCr8r.magic = MakeUns32BE ( 0xBEEFCAFE ); newCr8r.size = MakeUns32BE ( sizeof ( newCr8r ) ); newCr8r.majorVer = MakeUns16BE ( 1 ); } else { memcpy ( &newCr8r, oldCr8r, sizeof(newCr8r) ); if ( GetUns32BE ( &newCr8r.magic ) != 0xBEEFCAFE ) { // Make sure we write BE numbers. Flip4 ( &newCr8r.magic ); Flip4 ( &newCr8r.size ); Flip2 ( &newCr8r.majorVer ); Flip2 ( &newCr8r.minorVer ); Flip4 ( &newCr8r.creatorCode ); Flip4 ( &newCr8r.appleEvent ); } } if ( ! creatorCode.empty() ) { newCr8r.creatorCode = MakeUns32BE ( (XMP_Uns32) strtoul ( creatorCode.c_str(), 0, 0 ) ); } if ( ! appleEvent.empty() ) { newCr8r.appleEvent = MakeUns32BE ( (XMP_Uns32) strtoul ( appleEvent.c_str(), 0, 0 ) ); } if ( ! fileExt.empty() ) SetBufferedString ( newCr8r.fileExt, fileExt, sizeof ( newCr8r.fileExt ) ); if ( ! appOptions.empty() ) SetBufferedString ( newCr8r.appOptions, appOptions, sizeof ( newCr8r.appOptions ) ); if ( ! appName.empty() ) SetBufferedString ( newCr8r.appName, appName, sizeof ( newCr8r.appName ) ); moovMgr->SetBox ( "moov/udta/Cr8r", &newCr8r, sizeof(newCr8r) ); } // ExportCr8rItems // ================================================================================================= // GetAtomInfo // =========== struct AtomInfo { XMP_Int64 atomSize; XMP_Uns32 atomType; bool hasLargeSize; }; enum { // ! Do not rearrange, code depends on this order. kBadQT_NoError = 0, // No errors. kBadQT_SmallInner = 1, // An extra 1..7 bytes at the end of an inner span. kBadQT_LargeInner = 2, // More serious inner garbage, found as invalid atom length. kBadQT_SmallOuter = 3, // An extra 1..7 bytes at the end of the file. kBadQT_LargeOuter = 4 // More serious EOF garbage, found as invalid atom length. }; typedef XMP_Uns8 QTErrorMode; static QTErrorMode GetAtomInfo ( const LFA_FileRef qtFile, XMP_Int64 spanSize, int nesting, AtomInfo * info ) { QTErrorMode status = kBadQT_NoError; XMP_Uns8 buffer [8]; info->hasLargeSize = false; LFA_Read ( qtFile, buffer, 8, kLFA_RequireAll ); // Will throw if 8 bytes aren't available. info->atomSize = GetUns32BE ( &buffer[0] ); // ! Yes, the initial size is big endian UInt32. info->atomType = GetUns32BE ( &buffer[4] ); if ( info->atomSize == 0 ) { // Does the atom extend to EOF? if ( nesting != 0 ) return kBadQT_LargeInner; info->atomSize = spanSize; // This outer atom goes to EOF. } else if ( info->atomSize == 1 ) { // Does the atom have a 64-bit size? if ( spanSize < 16 ) { // Is there room in the span for the 16 byte header? status = kBadQT_LargeInner; if ( nesting == 0 ) status += 2; // Convert to "outer". return status; } LFA_Read ( qtFile, buffer, 8, kLFA_RequireAll ); info->atomSize = (XMP_Int64) GetUns64BE ( &buffer[0] ); info->hasLargeSize = true; } XMP_Assert ( status == kBadQT_NoError ); return status; } // GetAtomInfo // ================================================================================================= // CheckAtomList // ============= // // Check that a sequence of atoms fills a given span. The I/O position must be at the start of the // span, it is left just past the span on success. Recursive checks are done for top level 'moov' // atoms, and second level 'udta' atoms ('udta' inside 'moov'). // // Checking continues for "small inner" errors. They will be reported if no other kinds of errors // are found, otherwise the other error is reported. Checking is immediately aborted for any "large" // error. The rationale is that QuickTime can apparently handle small inner errors. They might be // arise from updates that shorten an atom by less than 8 bytes. Larger shrinkage should introduce a // 'free' atom. static QTErrorMode CheckAtomList ( const LFA_FileRef qtFile, XMP_Int64 spanSize, int nesting ) { QTErrorMode status = kBadQT_NoError; AtomInfo info; const static XMP_Uns32 moovAtomType = 0x6D6F6F76; // ! Don't use MakeUns32BE, already big endian. const static XMP_Uns32 udtaAtomType = 0x75647461; for ( ; spanSize >= 8; spanSize -= info.atomSize ) { QTErrorMode atomStatus = GetAtomInfo ( qtFile, spanSize, nesting, &info ); if ( atomStatus != kBadQT_NoError ) return atomStatus; XMP_Int64 headerSize = 8; if ( info.hasLargeSize ) headerSize = 16; if ( (info.atomSize < headerSize) || (info.atomSize > spanSize) ) { status = kBadQT_LargeInner; if ( nesting == 0 ) status += 2; // Convert to "outer". return status; } bool doChildren = false; if ( (nesting == 0) && (info.atomType == moovAtomType) ) doChildren = true; if ( (nesting == 1) && (info.atomType == udtaAtomType) ) doChildren = true; XMP_Int64 dataSize = info.atomSize - headerSize; if ( ! doChildren ) { LFA_Seek ( qtFile, dataSize, SEEK_CUR ); } else { QTErrorMode innerStatus = CheckAtomList ( qtFile, dataSize, nesting+1 ); if ( innerStatus > kBadQT_SmallInner ) return innerStatus; // Quit for serious errors. if ( status == kBadQT_NoError ) status = innerStatus; // Remember small inner errors. } } XMP_Assert ( status <= kBadQT_SmallInner ); // Else already returned. // ! Make sure inner kBadQT_SmallInner is propagated if this span is OK. if ( spanSize != 0 ) { LFA_Seek ( qtFile, spanSize, SEEK_CUR ); // ! Skip the trailing garbage of this span. status = kBadQT_SmallInner; if ( spanSize >= 8 ) status = kBadQT_LargeInner; if ( nesting == 0 ) status += 2; // Convert to "outer". } return status; } // CheckAtomList // ================================================================================================= // AttemptFileRepair // ================= static void AttemptFileRepair ( LFA_FileRef qtFile, XMP_Int64 fileSpace, QTErrorMode status ) { switch ( status ) { case kBadQT_NoError : return; // Sanity check. case kBadQT_SmallInner : return; // Fixed in normal update code for the 'udta' box. case kBadQT_LargeInner : XMP_Throw ( "Can't repair QuickTime file", kXMPErr_BadFileFormat ); case kBadQT_SmallOuter : break; // Truncate file below. case kBadQT_LargeOuter : break; // Truncate file below. default : XMP_Throw ( "Invalid QuickTime error mode", kXMPErr_InternalFailure ); } AtomInfo info; XMP_Int64 headerSize; // Process the top level atoms until an error is found. LFA_Seek ( qtFile, 0, SEEK_SET ); for ( ; fileSpace >= 8; fileSpace -= info.atomSize ) { QTErrorMode atomStatus = GetAtomInfo ( qtFile, fileSpace, 0, &info ); headerSize = 8; // ! Set this before checking atomStatus, used after the loop. if ( info.hasLargeSize ) headerSize = 16; if ( atomStatus != kBadQT_NoError ) break; if ( (info.atomSize < headerSize) || (info.atomSize > fileSpace) ) break; XMP_Int64 dataSize = info.atomSize - headerSize; LFA_Seek ( qtFile, dataSize, SEEK_CUR ); } // Truncate the file. If fileSpace >= 8 then the loop exited early due to a bad atom, seek back // to the atom's start. Otherwise, the loop exited because no more atoms are possible, no seek. if ( fileSpace >= 8 ) LFA_Seek ( qtFile, -headerSize, SEEK_CUR ); XMP_Int64 currPos = LFA_Tell ( qtFile ); LFA_Truncate ( qtFile, currPos ); } // AttemptFileRepair // ================================================================================================= // CheckQTFileStructure // ==================== static void CheckQTFileStructure ( XMPFileHandler * thiz, bool doRepair ) { XMPFiles * parent = thiz->parent; LFA_FileRef fileRef = parent->fileRef; XMP_Int64 fileSize = LFA_Measure ( fileRef ); // Check the basic file structure and try to repair if asked. LFA_Seek ( fileRef, 0, SEEK_SET ); QTErrorMode status = CheckAtomList ( fileRef, fileSize, 0 ); if ( status != kBadQT_NoError ) { if ( doRepair || (status == kBadQT_SmallInner) || (status == kBadQT_SmallOuter) ) { AttemptFileRepair ( fileRef, fileSize, status ); // Will throw if the attempt fails. } else if ( status != kBadQT_SmallInner ) { XMP_Throw ( "Ill-formed QuickTime file", kXMPErr_BadFileFormat ); } else { return; // ! Ignore these, QT seems to be able to handle them. // *** Might want to throw for check-only, ignore when repairing. } } } // CheckQTFileStructure; // ================================================================================================= // CheckFinalBox // ============= // // Before appending anything new, check if the final top level box has a "to EoF" length. If so, fix // it to have an explicit length. static void CheckFinalBox ( LFA_FileRef fileRef, XMP_AbortProc abortProc, void * abortArg ) { const bool checkAbort = (abortProc != 0); XMP_Uns64 fileSize = LFA_Measure ( fileRef ); // Find the last 2 boxes in the file. Need the previous to last in case it is an Apple 'wide' box. XMP_Uns64 prevPos, lastPos, nextPos; ISOMedia::BoxInfo prevBox, lastBox; XMP_Uns8 buffer [16]; // Enough to create an extended header. memset ( &prevBox, 0, sizeof(prevBox) ); // AUDIT: Using sizeof(prevBox) is safe. memset ( &lastBox, 0, sizeof(lastBox) ); // AUDIT: Using sizeof(lastBox) is safe. prevPos = lastPos = nextPos = 0; while ( nextPos != fileSize ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "MPEG4_MetaHandler::CheckFinalBox - User abort", kXMPErr_UserAbort ); } prevBox = lastBox; prevPos = lastPos; lastPos = nextPos; nextPos = ISOMedia::GetBoxInfo ( fileRef, lastPos, fileSize, &lastBox, true /* throw errors */ ); } // See if the last box is valid and has a "to EoF" size. if ( lastBox.headerSize < 8 ) XMP_Throw ( "MPEG-4 final box is invalid", kXMPErr_EnforceFailure ); LFA_Seek ( fileRef, lastPos, SEEK_SET ); LFA_Read ( fileRef, buffer, 4 ); XMP_Uns64 lastSize = GetUns32BE ( &buffer[0] ); // ! Yes, the file has a 32-bit value. if ( lastSize != 0 ) return; // Have a final "to EoF" box, try to write the explicit size. lastSize = lastBox.headerSize + lastBox.contentSize; if ( lastSize <= 0xFFFFFFFFUL ) { // Fill in the 32-bit exact size. PutUns32BE ( (XMP_Uns32)lastSize, &buffer[0] ); LFA_Seek ( fileRef, lastPos, SEEK_SET ); LFA_Write ( fileRef, buffer, 4 ); } else { // Try to convert to using an extended header. if ( (prevBox.boxType != ISOMedia::k_wide) || (prevBox.headerSize != 8) || (prevBox.contentSize != 0) ) { XMP_Throw ( "Can't expand final box header", kXMPErr_EnforceFailure ); } XMP_Assert ( prevPos == (lastPos - 8) ); PutUns32BE ( 1, &buffer[0] ); PutUns32BE ( lastBox.boxType, &buffer[4] ); PutUns64BE ( lastSize, &buffer[8] ); LFA_Seek ( fileRef, prevPos, SEEK_SET ); LFA_Write ( fileRef, buffer, 16 ); } } // CheckFinalBox // ================================================================================================= // WriteBoxHeader // ============== static void WriteBoxHeader ( LFA_FileRef fileRef, XMP_Uns32 boxType, XMP_Uns64 boxSize ) { XMP_Uns32 u32; XMP_Uns64 u64; XMP_Enforce ( boxSize >= 8 ); // The size must be the full size, not just the content. if ( boxSize <= 0xFFFFFFFF ) { u32 = MakeUns32BE ( (XMP_Uns32)boxSize ); LFA_Write ( fileRef, &u32, 4 ); u32 = MakeUns32BE ( boxType ); LFA_Write ( fileRef, &u32, 4 ); } else { u32 = MakeUns32BE ( 1 ); LFA_Write ( fileRef, &u32, 4 ); u32 = MakeUns32BE ( boxType ); LFA_Write ( fileRef, &u32, 4 ); u64 = MakeUns64BE ( boxSize ); LFA_Write ( fileRef, &u64, 8 ); } } // WriteBoxHeader // ================================================================================================= // WipeBoxFree // =========== // // Change the box's type to 'free' (or create a 'free' box) and zero the content. static XMP_Uns8 kZeroes [64*1024]; // C semantics guarantee zero initialization. static void WipeBoxFree ( LFA_FileRef fileRef, XMP_Uns64 boxOffset, XMP_Uns32 boxSize ) { if ( boxSize == 0 ) return; XMP_Enforce ( boxSize >= 8 ); LFA_Seek ( fileRef, boxOffset, SEEK_SET ); XMP_Uns32 u32; u32 = MakeUns32BE ( boxSize ); // ! The actual size should not change, but might have had a long header. LFA_Write ( fileRef, &u32, 4 ); u32 = MakeUns32BE ( ISOMedia::k_free ); LFA_Write ( fileRef, &u32, 4 ); XMP_Uns32 ioCount = sizeof ( kZeroes ); for ( boxSize -= 8; boxSize > 0; boxSize -= ioCount ) { if ( ioCount > boxSize ) ioCount = boxSize; LFA_Write ( fileRef, &kZeroes[0], ioCount ); } } // WipeBoxFree // ================================================================================================= // CreateFreeSpaceList // =================== struct SpaceInfo { XMP_Uns64 offset, size; SpaceInfo() : offset(0), size(0) {}; SpaceInfo ( XMP_Uns64 _offset, XMP_Uns64 _size ) : offset(_offset), size(_size) {}; }; typedef std::vector FreeSpaceList; static void CreateFreeSpaceList ( LFA_FileRef fileRef, XMP_Uns64 fileSize, XMP_Uns64 oldOffset, XMP_Uns32 oldSize, FreeSpaceList * spaceList ) { XMP_Uns64 boxPos, boxNext, adjacentFree; ISOMedia::BoxInfo currBox; LFA_Seek ( fileRef, 0, SEEK_SET ); spaceList->clear(); for ( boxPos = 0; boxPos < fileSize; boxPos = boxNext ) { boxNext = ISOMedia::GetBoxInfo ( fileRef, boxPos, fileSize, &currBox, true /* throw errors */ ); XMP_Uns64 currSize = currBox.headerSize + currBox.contentSize; if ( (currBox.boxType == ISOMedia::k_free) || (currBox.boxType == ISOMedia::k_skip) || ((boxPos == oldOffset) && (currSize == oldSize)) ) { if ( spaceList->empty() || (boxPos != adjacentFree) ) { spaceList->push_back ( SpaceInfo ( boxPos, currSize ) ); adjacentFree = boxPos + currSize; } else { SpaceInfo * lastSpace = &spaceList->back(); lastSpace->size += currSize; } } } } // CreateFreeSpaceList // ================================================================================================= // MPEG4_MetaHandler::CacheFileData // ================================ // // There are 3 file variants: normal ISO Base Media, modern QuickTime, and classic QuickTime. The // XMP is placed differently between the ISO and two QuickTime forms, and there is different but not // colliding native metadata. The entire 'moov' subtree is cached, along with the top level 'uuid' // box of XMP if present. void MPEG4_MetaHandler::CacheFileData() { XMP_Assert ( ! this->containsXMP ); XMPFiles * parent = this->parent; XMP_OptionBits openFlags = parent->openFlags; LFA_FileRef fileRef = parent->fileRef; XMP_AbortProc abortProc = parent->abortProc; void * abortArg = parent->abortArg; const bool checkAbort = (abortProc != 0); // First do some special case repair to QuickTime files, based on bad files in the wild. const bool isUpdate = XMP_OptionIsSet ( openFlags, kXMPFiles_OpenForUpdate ); const bool doRepair = XMP_OptionIsSet ( openFlags, kXMPFiles_OpenRepairFile ); if ( isUpdate && (parent->format == kXMP_MOVFile) ) { CheckQTFileStructure ( this, doRepair ); // Will throw for failure. } // Cache the top level 'moov' and 'uuid'/XMP boxes. XMP_Uns64 fileSize = LFA_Measure ( fileRef ); XMP_Uns64 boxPos, boxNext; ISOMedia::BoxInfo currBox; bool xmpOnly = XMP_OptionIsSet ( openFlags, kXMPFiles_OpenOnlyXMP ); bool haveISOFile = (this->fileMode == MOOV_Manager::kFileIsNormalISO); bool uuidFound = (! haveISOFile); // Ignore the XMP 'uuid' box for QuickTime files. bool moovIgnored = (xmpOnly & haveISOFile); // Ignore the 'moov' box for XMP-only ISO files. bool moovFound = moovIgnored; for ( boxPos = 0; boxPos < fileSize; boxPos = boxNext ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "MPEG4_MetaHandler::CacheFileData - User abort", kXMPErr_UserAbort ); } boxNext = ISOMedia::GetBoxInfo ( fileRef, boxPos, fileSize, &currBox ); if ( (! moovFound) && (currBox.boxType == ISOMedia::k_moov) ) { XMP_Uns64 fullMoovSize = currBox.headerSize + currBox.contentSize; if ( fullMoovSize > moovBoxSizeLimit ) { // From here on we know 32-bit offsets are safe. XMP_Throw ( "Oversize 'moov' box", kXMPErr_EnforceFailure ); } this->moovMgr.fullSubtree.assign ( (XMP_Uns32)fullMoovSize, 0 ); LFA_Seek ( fileRef, boxPos, SEEK_SET ); LFA_Read ( fileRef, &this->moovMgr.fullSubtree[0], (XMP_Uns32)fullMoovSize ); this->moovBoxPos = boxPos; this->moovBoxSize = (XMP_Uns32)fullMoovSize; moovFound = true; if ( uuidFound ) break; // Exit the loop when both are found. } else if ( (! uuidFound) && (currBox.boxType == ISOMedia::k_uuid) ) { if ( currBox.contentSize < 16 ) continue; XMP_Uns8 uuid [16]; LFA_Read ( fileRef, uuid, 16, kLFA_RequireAll ); if ( memcmp ( uuid, ISOMedia::k_xmpUUID, 16 ) != 0 ) continue; // Check for the XMP GUID. XMP_Uns64 fullUuidSize = currBox.headerSize + currBox.contentSize; if ( fullUuidSize > moovBoxSizeLimit ) { // From here on we know 32-bit offsets are safe. XMP_Throw ( "Oversize XMP 'uuid' box", kXMPErr_EnforceFailure ); } this->packetInfo.offset = boxPos + currBox.headerSize + 16; // The 16 is for the UUID. this->packetInfo.length = (XMP_Int32) (currBox.contentSize - 16); this->xmpPacket.assign ( this->packetInfo.length, ' ' ); LFA_Read ( fileRef, (void*)this->xmpPacket.data(), this->packetInfo.length, kLFA_RequireAll ); this->xmpBoxPos = boxPos; this->xmpBoxSize = (XMP_Uns32)fullUuidSize; uuidFound = true; if ( moovFound ) break; // Exit the loop when both are found. } } if ( (! moovFound) && (! moovIgnored) ) XMP_Throw ( "No 'moov' box", kXMPErr_BadFileFormat ); } // MPEG4_MetaHandler::CacheFileData // ================================================================================================= // MPEG4_MetaHandler::ProcessXMP // ============================= void MPEG4_MetaHandler::ProcessXMP() { if ( this->processedXMP ) return; this->processedXMP = true; // Make sure only called once. XMPFiles * parent = this->parent; XMP_OptionBits openFlags = parent->openFlags; bool xmpOnly = XMP_OptionIsSet ( openFlags, kXMPFiles_OpenOnlyXMP ); bool haveISOFile = (this->fileMode == MOOV_Manager::kFileIsNormalISO); // Process the cached XMP (from the 'uuid' box) if that is all we want and this is an ISO file. if ( xmpOnly & haveISOFile ) { this->containsXMP = this->havePreferredXMP = (this->packetInfo.length != 0); if ( this->containsXMP ) { FillPacketInfo ( this->xmpPacket, &this->packetInfo ); this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); this->xmpObj.DeleteProperty ( kXMP_NS_XMP, "NativeDigests" ); // No longer used. } return; } // Parse the cached 'moov' subtree, parse the preferred XMP. if ( this->moovMgr.fullSubtree.empty() ) XMP_Throw ( "No 'moov' box", kXMPErr_BadFileFormat ); this->moovMgr.ParseMemoryTree ( this->fileMode ); if ( (this->xmpBoxPos == 0) || (! haveISOFile) ) { // Look for the QuickTime moov/uuid/XMP_ box. MOOV_Manager::BoxInfo xmpInfo; MOOV_Manager::BoxRef xmpRef = this->moovMgr.GetBox ( "moov/udta/XMP_", &xmpInfo ); if ( (xmpRef != 0) && (xmpInfo.contentSize != 0) ) { this->xmpBoxPos = this->moovBoxPos + this->moovMgr.GetParsedOffset ( xmpRef ); this->packetInfo.offset = this->xmpBoxPos + this->moovMgr.GetHeaderSize ( xmpRef ); this->packetInfo.length = xmpInfo.contentSize; this->xmpPacket.assign ( (char*)xmpInfo.content, this->packetInfo.length ); this->havePreferredXMP = (! haveISOFile); } } if ( this->xmpBoxPos != 0 ) { this->containsXMP = true; FillPacketInfo ( this->xmpPacket, &this->packetInfo ); this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); this->xmpObj.DeleteProperty ( kXMP_NS_XMP, "NativeDigests" ); // No longer used. } // Import the non-XMP items. Do the imports in reverse priority order, last import wins! MOOV_Manager::BoxInfo mvhdInfo; MOOV_Manager::BoxRef mvhdRef = this->moovMgr.GetBox ( "moov/mvhd", &mvhdInfo ); bool mvhdFound = ((mvhdRef != 0) && (mvhdInfo.contentSize != 0)); MOOV_Manager::BoxInfo udtaInfo; MOOV_Manager::BoxRef udtaRef = this->moovMgr.GetBox ( "moov/udta", &udtaInfo ); std::vector cprtBoxes; if ( udtaRef != 0 ) { for ( XMP_Uns32 i = 0; i < udtaInfo.childCount; ++i ) { MOOV_Manager::BoxInfo currInfo; MOOV_Manager::BoxRef currRef = this->moovMgr.GetNthChild ( udtaRef, i, &currInfo ); if ( currRef == 0 ) break; // Sanity check, should not happen. if ( currInfo.boxType != ISOMedia::k_cprt ) continue; cprtBoxes.push_back ( currInfo ); } } bool cprtFound = (! cprtBoxes.empty()); bool tradQTFound = this->tradQTMgr.ParseCachedBoxes ( this->moovMgr ); bool tmcdFound = this->ParseTimecodeTrack(); if ( this->fileMode == MOOV_Manager::kFileIsNormalISO ) { if ( mvhdFound ) this->containsXMP |= ImportMVHDItems ( mvhdInfo, &this->xmpObj ); if ( cprtFound ) this->containsXMP |= ImportISOCopyrights ( cprtBoxes, &this->xmpObj ); } else { // This is a QuickTime file, either traditional or modern. if ( mvhdFound ) this->containsXMP |= ImportMVHDItems ( mvhdInfo, &this->xmpObj ); if ( cprtFound ) this->containsXMP |= ImportISOCopyrights ( cprtBoxes, &this->xmpObj ); if ( tmcdFound | tradQTFound ) { // Some of the timecode items are in the .../udta/©... set but handled by ImportTimecodeItems. this->containsXMP |= ImportTimecodeItems ( this->tmcdInfo, this->tradQTMgr, &this->xmpObj ); } this->containsXMP |= ImportCr8rItems ( this->moovMgr, &this->xmpObj ); } } // MPEG4_MetaHandler::ProcessXMP // ================================================================================================= // MPEG4_MetaHandler::ParseTimecodeTrack // ===================================== bool MPEG4_MetaHandler::ParseTimecodeTrack() { MOOV_Manager::BoxRef stblRef = FindTimecodeTrack ( this->moovMgr ); if ( stblRef == 0 ) return false; // Find the .../stbl/stsd box and process the first table entry. MOOV_Manager::BoxInfo stsdInfo; MOOV_Manager::BoxRef stsdRef; stsdRef = this->moovMgr.GetTypeChild ( stblRef, ISOMedia::k_stsd, &stsdInfo ); if ( stsdRef == 0 ) return false; if ( stsdInfo.contentSize < (8 + sizeof ( MOOV_Manager::Content_stsd_entry )) ) return false; if ( GetUns32BE ( stsdInfo.content + 4 ) == 0 ) return false; // Make sure the entry count is non-zero. const MOOV_Manager::Content_stsd_entry * stsdRawEntry = (MOOV_Manager::Content_stsd_entry*) (stsdInfo.content + 8); XMP_Uns32 stsdEntrySize = GetUns32BE ( &stsdRawEntry->entrySize ); if ( stsdEntrySize > (stsdInfo.contentSize - 4) ) stsdEntrySize = stsdInfo.contentSize - 4; if ( stsdEntrySize < sizeof ( MOOV_Manager::Content_stsd_entry ) ) return false; XMP_Uns32 stsdEntryFormat = GetUns32BE ( &stsdRawEntry->format ); if ( stsdEntryFormat != ISOMedia::k_tmcd ) return false; this->tmcdInfo.timeScale = GetUns32BE ( &stsdRawEntry->timeScale ); this->tmcdInfo.frameDuration = GetUns32BE ( &stsdRawEntry->frameDuration ); XMP_Uns32 flags = GetUns32BE ( &stsdRawEntry->flags ); this->tmcdInfo.isDropFrame = flags & 0x1; // Look for a trailing 'name' box on the first stsd table entry. XMP_Uns32 stsdTrailerSize = stsdEntrySize - sizeof ( MOOV_Manager::Content_stsd_entry ); if ( stsdTrailerSize > 8 ) { // Room for a non-empty 'name' box? const XMP_Uns8 * trailerStart = stsdInfo.content + 8 + sizeof ( MOOV_Manager::Content_stsd_entry ); const XMP_Uns8 * trailerLimit = trailerStart + stsdTrailerSize; const XMP_Uns8 * trailerPos; const XMP_Uns8 * trailerNext; ISOMedia::BoxInfo trailerInfo; for ( trailerPos = trailerStart; trailerPos < trailerLimit; trailerPos = trailerNext ) { trailerNext = ISOMedia::GetBoxInfo ( trailerPos, trailerLimit, &trailerInfo ); if ( trailerInfo.boxType == ISOMedia::k_name ) { this->tmcdInfo.nameOffset = (XMP_Uns32) (trailerPos - stsdInfo.content); if ( trailerInfo.contentSize > 4 ) { XMP_Uns16 textLen = GetUns16BE ( trailerPos + trailerInfo.headerSize ); this->tmcdInfo.macLang = GetUns16BE ( trailerPos + trailerInfo.headerSize + 2 ); if ( trailerInfo.contentSize >= (XMP_Uns64)(textLen + 4) ) { const char * textPtr = (char*) (trailerPos + trailerInfo.headerSize + 4); this->tmcdInfo.macName.assign ( textPtr, textLen ); } } break; // Done after finding the first 'name' box. } } } // Find the timecode sample. XMP_Uns64 sampleOffset = 0; MOOV_Manager::BoxInfo tempInfo; MOOV_Manager::BoxRef tempRef; tempRef = this->moovMgr.GetTypeChild ( stblRef, ISOMedia::k_stsc, &tempInfo ); if ( tempRef == 0 ) return false; if ( tempInfo.contentSize < (8 + sizeof ( MOOV_Manager::Content_stsc_entry )) ) return false; if ( GetUns32BE ( tempInfo.content + 4 ) == 0 ) return false; // Make sure the entry count is non-zero. XMP_Uns32 firstChunkNumber = GetUns32BE ( tempInfo.content + 8 ); // Want first field of first entry. tempRef = this->moovMgr.GetTypeChild ( stblRef, ISOMedia::k_stco, &tempInfo ); if ( tempRef != 0 ) { if ( tempInfo.contentSize < (8 + 4) ) return false; XMP_Uns32 stcoCount = GetUns32BE ( tempInfo.content + 4 ); if ( stcoCount < firstChunkNumber ) return false; XMP_Uns32 * stcoPtr = (XMP_Uns32*) (tempInfo.content + 8); sampleOffset = GetUns32BE ( &stcoPtr[firstChunkNumber-1] ); // ! Chunk number is 1-based. } else { tempRef = this->moovMgr.GetTypeChild ( stblRef, ISOMedia::k_co64, &tempInfo ); if ( (tempRef == 0) || (tempInfo.contentSize < (8 + 8)) ) return false; XMP_Uns32 co64Count = GetUns32BE ( tempInfo.content + 4 ); if ( co64Count < firstChunkNumber ) return false; XMP_Uns64 * co64Ptr = (XMP_Uns64*) (tempInfo.content + 8); sampleOffset = GetUns64BE ( &co64Ptr[firstChunkNumber-1] ); // ! Chunk number is 1-based. } if ( sampleOffset != 0 ) { // Read the timecode sample. Need to reopen the file if the XMPFile was open for read-only, // normally all I/O is done within CacheFileData. bool openForRead = XMP_OptionIsSet ( this->parent->openFlags, kXMPFiles_OpenForRead); LFA_FileRef fileRef = this->parent->fileRef; if ( openForRead ) { XMP_Assert ( fileRef == 0 ); fileRef = LFA_Open ( this->parent->filePath.c_str(), 'r' ); } if ( fileRef != 0 ) { // The reopen might have failed. LFA_Seek ( fileRef, sampleOffset, SEEK_SET ); LFA_Read ( fileRef, &this->tmcdInfo.timecodeSample, 4, kLFA_RequireAll ); this->tmcdInfo.timecodeSample = MakeUns32BE ( this->tmcdInfo.timecodeSample ); if ( openForRead ) LFA_Close ( fileRef ); } } // Finally update this->tmcdInfo to remember (for update) that there is an OK timecode track. this->tmcdInfo.stsdBoxFound = true; this->tmcdInfo.sampleOffset = sampleOffset; return true; } // MPEG4_MetaHandler::ParseTimecodeTrack // ================================================================================================= // MPEG4_MetaHandler::UpdateTopLevelBox // ==================================== void MPEG4_MetaHandler::UpdateTopLevelBox ( XMP_Uns64 oldOffset, XMP_Uns32 oldSize, const XMP_Uns8 * newBox, XMP_Uns32 newSize ) { if ( (oldSize == 0) && (newSize == 0) ) return; // Sanity check, should not happen. LFA_FileRef fileRef = this->parent->fileRef; XMP_Uns64 oldFileSize = LFA_Measure ( fileRef ); XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; if ( newSize == oldSize ) { // Trivial case, update the existing box in-place. LFA_Seek ( fileRef, oldOffset, SEEK_SET ); LFA_Write ( fileRef, newBox, oldSize ); } else if ( (oldOffset + oldSize) == oldFileSize ) { // The old box was at the end, write the new and truncate the file if necessary. LFA_Seek ( fileRef, oldOffset, SEEK_SET ); LFA_Write ( fileRef, newBox, newSize ); LFA_Truncate ( fileRef, (oldOffset + newSize) ); // Does nothing if new size is bigger. } else if ( (newSize < oldSize) && ((oldSize - newSize) >= 8) ) { // The new size is smaller and there is enough room to create a free box. LFA_Seek ( fileRef, oldOffset, SEEK_SET ); LFA_Write ( fileRef, newBox, newSize ); WipeBoxFree ( fileRef, (oldOffset + newSize), (oldSize - newSize) ); } else { // Look for a trailing free box with enough space. If not found, consider any free space. // If still not found, append the new box and make the old one free. ISOMedia::BoxInfo nextBoxInfo; (void) ISOMedia::GetBoxInfo ( fileRef, (oldOffset + oldSize), oldFileSize, &nextBoxInfo, true /* throw errors */ ); XMP_Uns64 totalRoom = oldSize + nextBoxInfo.headerSize + nextBoxInfo.contentSize; bool nextIsFree = (nextBoxInfo.boxType == ISOMedia::k_free) || (nextBoxInfo.boxType == ISOMedia::k_skip); bool haveEnoughRoom = (newSize == totalRoom) || ( (newSize < totalRoom) && ((totalRoom - newSize) >= 8) ); if ( nextIsFree & haveEnoughRoom ) { LFA_Seek ( fileRef, oldOffset, SEEK_SET ); LFA_Write ( fileRef, newBox, newSize ); if ( newSize < totalRoom ) { // Don't wipe, at most 7 old bytes left, it will be covered by the free header. WriteBoxHeader ( fileRef, ISOMedia::k_free, (totalRoom - newSize) ); } } else { // Create a list of all top level free space, including the old space as free. Use the // earliest space that fits. If none, append. FreeSpaceList spaceList; CreateFreeSpaceList ( fileRef, oldFileSize, oldOffset, oldSize, &spaceList ); size_t freeSlot, limit; for ( freeSlot = 0, limit = spaceList.size(); freeSlot < limit; ++freeSlot ) { XMP_Uns64 freeSize = spaceList[freeSlot].size; if ( (newSize == freeSize) || ( (newSize < freeSize) && ((freeSize - newSize) >= 8) ) ) break; } if ( freeSlot == spaceList.size() ) { // No available free space, append the new box. CheckFinalBox ( fileRef, abortProc, abortArg ); LFA_Seek ( fileRef, 0, SEEK_END ); LFA_Write ( fileRef, newBox, newSize ); WipeBoxFree ( fileRef, oldOffset, oldSize ); } else { // Use the available free space. Wipe non-overlapping parts of the old box. The old // box is either included in the new space, or is fully disjoint. SpaceInfo & newSpace = spaceList[freeSlot]; bool oldIsDisjoint = ((oldOffset + oldSize) <= newSpace.offset) || // Old is in front. ((newSpace.offset + newSpace.size) <= oldOffset); // Old is behind. XMP_Assert ( (newSize == newSpace.size) || ( (newSize < newSpace.size) && ((newSpace.size - newSize) >= 8) ) ); XMP_Assert ( oldIsDisjoint || ( (newSpace.offset <= oldOffset) && ((oldOffset + oldSize) <= (newSpace.offset + newSpace.size)) ) /* old is included */ ); XMP_Uns64 newFreeOffset = newSpace.offset + newSize; XMP_Uns64 newFreeSize = newSpace.size - newSize; LFA_Seek ( fileRef, newSpace.offset, SEEK_SET ); LFA_Write ( fileRef, newBox, newSize ); if ( newFreeSize > 0 ) WriteBoxHeader ( fileRef, ISOMedia::k_free, newFreeSize ); if ( oldIsDisjoint ) { WipeBoxFree ( fileRef, oldOffset, oldSize ); } else { // Clear the exposed portion of the old box. XMP_Uns64 zeroStart = newFreeOffset + 8; if ( newFreeSize > 0xFFFFFFFF ) zeroStart += 8; if ( oldOffset > zeroStart ) zeroStart = oldOffset; XMP_Uns64 zeroEnd = newFreeOffset + newFreeSize; if ( (oldOffset + oldSize) < zeroEnd ) zeroEnd = oldOffset + oldSize; if ( zeroStart < zeroEnd ) { // The new box might cover the old. XMP_Assert ( (zeroEnd - zeroStart) <= (XMP_Uns64)oldSize ); XMP_Uns32 zeroSize = (XMP_Uns32) (zeroEnd - zeroStart); LFA_Seek ( fileRef, zeroStart, SEEK_SET ); for ( XMP_Uns32 ioCount = sizeof ( kZeroes ); zeroSize > 0; zeroSize -= ioCount ) { if ( ioCount > zeroSize ) ioCount = zeroSize; LFA_Write ( fileRef, &kZeroes[0], ioCount ); } } } } } } } // MPEG4_MetaHandler::UpdateTopLevelBox // ================================================================================================= // MPEG4_MetaHandler::UpdateFile // ============================= // // Revamp notes: // The 'moov' subtree and possibly the XMP 'uuid' box get updated. Compose the new copy of each and // see if it fits in existing space, incorporating adjacent 'free' boxes if necessary. If that won't // work, look for a sufficient 'free' box anywhere in the file. As a last resort, append the new copy. // Assume no location sensitive data within 'moov', i.e. no offsets into it. This lets it be moved // and its children freely rearranged. void MPEG4_MetaHandler::UpdateFile ( bool doSafeUpdate ) { if ( ! this->needsUpdate ) { // If needsUpdate is set then at least the XMP changed. return; } this->needsUpdate = false; // Make sure only called once. XMP_Assert ( ! doSafeUpdate ); // This should only be called for "unsafe" updates. XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); LFA_FileRef fileRef = this->parent->fileRef; XMP_Uns64 fileSize = LFA_Measure ( fileRef ); bool haveISOFile = (this->fileMode == MOOV_Manager::kFileIsNormalISO); // Update the 'moov' subtree with exports from the XMP, but not the XMP itself (for QT files). ExportMVHDItems ( this->xmpObj, &this->moovMgr ); ExportISOCopyrights ( this->xmpObj, &this->moovMgr ); ExportQuickTimeItems ( this->xmpObj, &this->tradQTMgr, &this->moovMgr ); ExportTimecodeItems ( this->xmpObj, &this->tmcdInfo, &this->tradQTMgr, &this->moovMgr ); if ( ! haveISOFile ) ExportCr8rItems ( this->xmpObj, &this->moovMgr ); // Try to update the XMP in-place if that is all that changed, or if it is in a preferred 'uuid' box. // The XMP has already been serialized by common code to the appropriate length. Otherwise, update // the 'moov'/'udta'/'XMP_' box in the MOOV_Manager, or the 'uuid' XMP box in the file. bool useUuidXMP = (this->fileMode == MOOV_Manager::kFileIsNormalISO); if ( (this->xmpPacket.size() == (size_t)this->packetInfo.length) && ( (useUuidXMP & this->havePreferredXMP) || (! this->moovMgr.IsChanged()) ) ) { // Update the existing XMP in-place. LFA_Seek ( fileRef, this->packetInfo.offset, SEEK_SET ); LFA_Write ( fileRef, this->xmpPacket.c_str(), (XMP_Int32)this->xmpPacket.size() ); } else if ( ! useUuidXMP ) { // Don't leave an old uuid XMP around (if we know about it). if ( (! havePreferredXMP) && (this->xmpBoxSize != 0) ) { WipeBoxFree ( fileRef, this->xmpBoxPos, this->xmpBoxSize ); } // The udta form of XMP has just the XMP packet. this->moovMgr.SetBox ( "moov/udta/XMP_", this->xmpPacket.c_str(), (XMP_Uns32)this->xmpPacket.size() ); } else { // Don't leave an old 'moov'/'udta'/'XMP_' box around. MOOV_Manager::BoxRef udtaRef = this->moovMgr.GetBox ( "moov/udta", 0 ); if ( udtaRef != 0 ) this->moovMgr.DeleteTypeChild ( udtaRef, ISOMedia::k_XMP_ ); // The uuid form of XMP has the 16-byte UUID in front of the XMP packet. Form the complete // box (including size/type header) for UpdateTopLevelBox. RawDataBlock uuidBox; XMP_Uns32 uuidSize = 4+4 + 16 + (XMP_Uns32)this->xmpPacket.size(); uuidBox.assign ( uuidSize, 0 ); PutUns32BE ( uuidSize, &uuidBox[0] ); PutUns32BE ( ISOMedia::k_uuid, &uuidBox[4] ); memcpy ( &uuidBox[8], ISOMedia::k_xmpUUID, 16 ); memcpy ( &uuidBox[24], this->xmpPacket.c_str(), this->xmpPacket.size() ); this->UpdateTopLevelBox ( this->xmpBoxPos, this->xmpBoxSize, &uuidBox[0], uuidSize ); } // Update the 'moov' subtree if necessary, and finally update the timecode sample. if ( this->moovMgr.IsChanged() ) { this->moovMgr.UpdateMemoryTree(); this->UpdateTopLevelBox ( moovBoxPos, moovBoxSize, &this->moovMgr.fullSubtree[0], (XMP_Uns32)this->moovMgr.fullSubtree.size() ); } if ( this->tmcdInfo.sampleOffset != 0 ) { LFA_Seek ( fileRef, this->tmcdInfo.sampleOffset, SEEK_SET ); XMP_Uns32 sample = MakeUns32BE ( this->tmcdInfo.timecodeSample ); LFA_Write ( fileRef, &sample, 4 ); } } // MPEG4_MetaHandler::UpdateFile // ================================================================================================= // MPEG4_MetaHandler::WriteFile // ============================ // // Since the XMP and legacy is probably a miniscule part of the entire file, and since we can't // change the offset of most of the boxes, just copy the entire source file to the dest file, then // do an in-place update to the destination file. void MPEG4_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { XMP_Assert ( this->needsUpdate ); LFA_FileRef destRef = this->parent->fileRef; LFA_Seek ( sourceRef, 0, SEEK_SET ); LFA_Seek ( destRef, 0, SEEK_SET ); LFA_Copy ( sourceRef, destRef, LFA_Measure ( sourceRef ), this->parent->abortProc, this->parent->abortArg ); this->UpdateFile ( false ); } // MPEG4_MetaHandler::WriteFile // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/MP3_Handler.hpp0000664000175000017500000000606512150230672017767 00000000000000#ifndef __MP3_Handler_hpp__ #define __MP3_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "XMPFiles_Impl.hpp" #include "ID3_Support.hpp" using namespace std; using namespace ID3_Support; extern XMPFileHandler * MP3_MetaHandlerCTor ( XMPFiles * parent ); extern bool MP3_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); static const XMP_OptionBits kMP3_HandlerFlags = (kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_PrefersInPlace | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket| kXMPFiles_CanReconcile); class MP3_MetaHandler : public XMPFileHandler { public: MP3_MetaHandler ( XMPFiles * parent ); ~MP3_MetaHandler(); void CacheFileData(); void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); void ProcessXMP(); private: //////////////////////////////////////////////////////////////////////////////////// // instance vars XMP_Int64 oldTagSize; // the entire tag, including padding, including 10B header XMP_Int64 oldPadding; // number of padding bytes XMP_Int64 oldFramesSize; // actual space needed by frames := oldTagSize - 10 - oldPadding XMP_Int64 newTagSize; XMP_Int64 newPadding; XMP_Int64 newFramesSize; // decision making: bool tagIsDirty; // true, if any legacy properties changed. bool mustShift; // entire tag to rewrite? (or possibly just XMP?) XMP_Uns8 majorVersion, minorVersion; // Version Number post ID3v2, i.e. 3 0 ==> ID3v2.3.0 bool hasID3Tag; //incoming file has an ID3 tag? bool hasFooter; bool legacyChanged; // tag rewrite certainly needed? ID3Header id3Header; XMP_Int64 extHeaderSize; bool hasExtHeader; // the frames // * all to be kept till write-out // * parsed/understood only if needed // * vector used to free memory in handler destructor std::vector framesVector; // ID3v1 - treated as a single object ID3v1Tag id3v1Tag; // * also kept in a map for better import<->export access // * only keeps legacy 'relevant frames' (i.e. no abused COMM frames) // * only keeps last relevant frame // * earlier 'relevant frames' will be deleted. This map also helps in this // * key shall be the FrameID, always interpreted as BE std::map framesMap; }; // MP3_MetaHandler // ================================================================================================= #endif /* __MP3_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/MPEG4_Handler.hpp0000664000175000017500000000644712150230672020210 00000000000000#ifndef __MPEG4_Handler_hpp__ #define __MPEG4_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMPFiles_Impl.hpp" #include "MOOV_Support.hpp" #include "QuickTime_Support.hpp" // ================================================================================================ /// \file MPEG4_Handler.hpp /// \brief File format handler for MPEG-4. /// /// This header ... /// // ================================================================================================ extern XMPFileHandler * MPEG4_MetaHandlerCTor ( XMPFiles * parent ); extern bool MPEG4_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); static const XMP_OptionBits kMPEG4_HandlerFlags = ( kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_CanRewrite | kXMPFiles_PrefersInPlace | kXMPFiles_CanReconcile | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_AllowsSafeUpdate ); class MPEG4_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessXMP(); void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); MPEG4_MetaHandler ( XMPFiles * _parent ); virtual ~MPEG4_MetaHandler(); struct TimecodeTrackInfo { // Info about a QuickTime timecode track. bool stsdBoxFound, isDropFrame; XMP_Uns32 timeScale; XMP_Uns32 frameDuration; XMP_Uns32 timecodeSample; XMP_Uns64 sampleOffset; // Absolute file offset of the timecode sample, 0 if none. XMP_Uns32 nameOffset; // The offset of the 'name' box relative to the 'stsd' box content. XMP_Uns16 macLang; // The Mac language code of the trailing 'name' box. std::string macName; // The text part of the trailing 'name' box, in macLang encoding. TimecodeTrackInfo() : stsdBoxFound(false), isDropFrame(false), timeScale(0), frameDuration(0), timecodeSample(0), sampleOffset(0), nameOffset(0), macLang(0) {}; }; private: MPEG4_MetaHandler() : fileMode(0), havePreferredXMP(false), xmpBoxPos(0), moovBoxPos(0), xmpBoxSize(0), moovBoxSize(0) {}; // Hidden on purpose. bool ParseTimecodeTrack(); void UpdateTopLevelBox ( XMP_Uns64 oldOffset, XMP_Uns32 oldSize, const XMP_Uns8 * newBox, XMP_Uns32 newSize ); XMP_Uns8 fileMode; bool havePreferredXMP; XMP_Uns64 xmpBoxPos; // The file offset of the XMP box (the size field, not the content). XMP_Uns64 moovBoxPos; // The file offset of the 'moov' box (the size field, not the content). XMP_Uns32 xmpBoxSize, moovBoxSize; // The full size of the boxes, not just the content. MOOV_Manager moovMgr; TradQT_Manager tradQTMgr; TimecodeTrackInfo tmcdInfo; }; // MPEG4_MetaHandler // ================================================================================================= #endif // __MPEG4_Handler_hpp__ exempi-2.2.1/source/XMPFiles/FileHandlers/ASF_Handler.cpp0000664000175000017500000002354712150230672020000 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "ASF_Handler.hpp" // ================================================================================================= /// \file ASF_Handler.hpp /// \brief File format handler for ASF. /// /// This handler ... /// // ================================================================================================= // ================================================================================================= // ASF_MetaHandlerCTor // ==================== XMPFileHandler * ASF_MetaHandlerCTor ( XMPFiles * parent ) { return new ASF_MetaHandler ( parent ); } // ASF_MetaHandlerCTor // ================================================================================================= // ASF_CheckFormat // =============== bool ASF_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ) { IgnoreParam(format); IgnoreParam(fileRef); IgnoreParam(parent); XMP_Assert ( format == kXMP_WMAVFile ); IOBuffer ioBuf; LFA_Seek ( fileRef, 0, SEEK_SET ); if ( ! CheckFileSpace ( fileRef, &ioBuf, guidLen ) ) return false; GUID guid; memcpy ( &guid, ioBuf.ptr, guidLen ); if ( ! IsEqualGUID ( ASF_Header_Object, guid ) ) return false; return true; } // ASF_CheckFormat // ================================================================================================= // ASF_MetaHandler::ASF_MetaHandler // ================================== ASF_MetaHandler::ASF_MetaHandler ( XMPFiles * _parent ) { this->parent = _parent; this->handlerFlags = kASF_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; } // ================================================================================================= // ASF_MetaHandler::~ASF_MetaHandler // =================================== ASF_MetaHandler::~ASF_MetaHandler() { // Nothing extra to do. } // ================================================================================================= // ASF_MetaHandler::CacheFileData // =============================== void ASF_MetaHandler::CacheFileData() { this->containsXMP = false; LFA_FileRef fileRef ( this->parent->fileRef ); if ( fileRef == 0 ) return; ASF_Support support ( &this->legacyManager ); ASF_Support::ObjectState objectState; long numTags = support.OpenASF ( fileRef, objectState ); if ( numTags == 0 ) return; if ( objectState.xmpLen != 0 ) { // XMP present XMP_Int32 len = XMP_Int32 ( objectState.xmpLen ); this->xmpPacket.reserve( len ); this->xmpPacket.assign ( len, ' ' ); bool found = ASF_Support::ReadBuffer ( fileRef, objectState.xmpPos, objectState.xmpLen, const_cast(this->xmpPacket.data()) ); if ( found ) { this->packetInfo.offset = objectState.xmpPos; this->packetInfo.length = len; this->containsXMP = true; } } } // ASF_MetaHandler::CacheFileData // ================================================================================================= // ASF_MetaHandler::ProcessXMP // ============================ // // Process the raw XMP and legacy metadata that was previously cached. void ASF_MetaHandler::ProcessXMP() { this->processedXMP = true; // Make sure we only come through here once. // Process the XMP packet. if ( this->xmpPacket.empty() ) { // import legacy in any case, when no XMP present legacyManager.ImportLegacy ( &this->xmpObj ); this->legacyManager.SetDigest ( &this->xmpObj ); } else { XMP_Assert ( this->containsXMP ); XMP_StringPtr packetStr = this->xmpPacket.c_str(); XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size(); this->xmpObj.ParseFromBuffer ( packetStr, packetLen ); if ( ! legacyManager.CheckDigest ( this->xmpObj ) ) { legacyManager.ImportLegacy ( &this->xmpObj ); } } // Assume we now have something in the XMP. this->containsXMP = true; } // ASF_MetaHandler::ProcessXMP // ================================================================================================= // ASF_MetaHandler::UpdateFile // ============================ void ASF_MetaHandler::UpdateFile ( bool doSafeUpdate ) { bool updated = false; if ( ! this->needsUpdate ) return; LFA_FileRef fileRef ( this->parent->fileRef ); if ( fileRef == 0 ) return; ASF_Support support; ASF_Support::ObjectState objectState; long numTags = support.OpenASF ( fileRef, objectState ); if ( numTags == 0 ) return; XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size(); this->legacyManager.ExportLegacy ( this->xmpObj ); if ( this->legacyManager.hasLegacyChanged() ) { this->legacyManager.SetDigest ( &this->xmpObj ); // serialize with updated digest if ( objectState.xmpLen == 0 ) { // XMP does not exist, use standard padding this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat ); } else { // re-use padding with static XMP size try { XMP_OptionBits compactExact = (kXMP_UseCompactFormat | kXMP_ExactPacketLength); this->xmpObj.SerializeToBuffer ( &this->xmpPacket, compactExact, XMP_StringLen(objectState.xmpLen) ); } catch ( ... ) { // re-use padding with exact packet length failed (legacy-digest needed too much space): try again using standard padding this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat ); } } } XMP_StringPtr packetStr = xmpPacket.c_str(); packetLen = (XMP_StringLen)xmpPacket.size(); if ( packetLen == 0 ) return; // value, when guessing for sufficient legacy padding (line-ending conversion etc.) const int paddingTolerance = 50; bool xmpGrows = ( objectState.xmpLen && (packetLen > objectState.xmpLen) && ( ! objectState.xmpIsLastObject) ); bool legacyGrows = ( this->legacyManager.hasLegacyChanged() && (this->legacyManager.getLegacyDiff() > (this->legacyManager.GetPadding() - paddingTolerance)) ); if ( doSafeUpdate || legacyGrows || xmpGrows ) { // do a safe update in any case updated = SafeWriteFile(); } else { // possibly we can do an in-place update if ( objectState.xmpLen < packetLen ) { updated = SafeWriteFile(); } else { // current XMP chunk size is sufficient -> write (in place update) updated = ASF_Support::WriteBuffer(fileRef, objectState.xmpPos, packetLen, packetStr ); // legacy update if ( updated && this->legacyManager.hasLegacyChanged() ) { ASF_Support::ObjectIterator curPos = objectState.objects.begin(); ASF_Support::ObjectIterator endPos = objectState.objects.end(); for ( ; curPos != endPos; ++curPos ) { ASF_Support::ObjectData object = *curPos; // find header-object if ( IsEqualGUID ( ASF_Header_Object, object.guid ) ) { // update header object updated = support.UpdateHeaderObject ( fileRef, object, legacyManager ); } } } } } if ( ! updated ) return; // If there's an error writing the chunk, bail. this->needsUpdate = false; } // ASF_MetaHandler::UpdateFile // ================================================================================================= // ASF_MetaHandler::WriteFile // =========================== void ASF_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { LFA_FileRef destRef = this->parent->fileRef; ASF_Support support; ASF_Support::ObjectState objectState; long numTags = support.OpenASF ( sourceRef, objectState ); if ( numTags == 0 ) return; LFA_Truncate ( destRef, 0 ); ASF_Support::ObjectIterator curPos = objectState.objects.begin(); ASF_Support::ObjectIterator endPos = objectState.objects.end(); for ( ; curPos != endPos; ++curPos ) { ASF_Support::ObjectData object = *curPos; // discard existing XMP object if ( object.xmp ) continue; // update header-object, when legacy needs update if ( IsEqualGUID ( ASF_Header_Object, object.guid) && this->legacyManager.hasLegacyChanged( ) ) { // rewrite header object support.WriteHeaderObject ( sourceRef, destRef, object, this->legacyManager, false ); } else { // copy any other object ASF_Support::CopyObject ( sourceRef, destRef, object ); } // write XMP object immediately after the (one and only) top-level DataObject if ( IsEqualGUID ( ASF_Data_Object, object.guid ) ) { XMP_StringPtr packetStr = xmpPacket.c_str(); XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size(); ASF_Support::WriteXMPObject ( destRef, packetLen, packetStr ); } } support.UpdateFileSize ( destRef ); } // ASF_MetaHandler::WriteFile // ================================================================================================= // ASF_MetaHandler::SafeWriteFile // =========================== bool ASF_MetaHandler::SafeWriteFile () { bool ret = false; std::string origPath = this->parent->filePath; LFA_FileRef origRef = this->parent->fileRef; std::string updatePath; LFA_FileRef updateRef = 0; CreateTempFile ( origPath, &updatePath, kCopyMacRsrc ); updateRef = LFA_Open ( updatePath.c_str(), 'w' ); this->parent->filePath = updatePath; this->parent->fileRef = updateRef; try { this->WriteFile ( origRef, origPath ); ret = true; } catch ( ... ) { LFA_Close ( updateRef ); LFA_Delete ( updatePath.c_str() ); this->parent->filePath = origPath; this->parent->fileRef = origRef; throw; } LFA_Close ( origRef ); LFA_Delete ( origPath.c_str() ); LFA_Close ( updateRef ); LFA_Rename ( updatePath.c_str(), origPath.c_str() ); this->parent->filePath = origPath; this->parent->fileRef = 0; return ret; } // ASF_MetaHandler::SafeWriteFile // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/XDCAMEX_Handler.cpp0000664000175000017500000006411612150230672020455 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include #include "XDCAMEX_Handler.hpp" #include "XDCAM_Support.hpp" #include "MD5.h" using namespace std; // ================================================================================================= /// \file XDCAMEX_Handler.cpp /// \brief Folder format handler for XDCAMEX. /// /// This handler is for the XDCAMEX video format. /// /// .../MyMovie/ /// BPAV/ /// MEDIAPRO.XML /// MEDIAPRO.BUP /// CLPR/ /// 709_001_01/ /// 709_001_01.SMI /// 709_001_01.MP4 /// 709_001_01M01.XML /// 709_001_01R01.BIM /// 709_001_01I01.PPN /// 709_001_02/ /// 709_002_01/ /// 709_003_01/ /// TAKR/ /// 709_001/ /// 709_001.SMI /// 709_001M01.XML /// /// The Backup files (.BUP) are optional. No files or directories other than those listed are /// allowed in the BPAV directory. The CLPR (clip root) directory may contain only clip directories, /// which may only contain the clip files listed. The TAKR (take root) direcory may contail only /// take directories, which may only contain take files. The take root directory can be empty. /// MEDIPRO.XML contains information on clip and take management. /// /// Each clip directory contains a media file (.MP4), a clip info file (.SMI), a real time metadata /// file (.BIM), a non real time metadata file (.XML), and a picture pointer file (.PPN). A take /// directory conatins a take info and non real time take metadata files. // ================================================================================================= // ================================================================================================= // XDCAMEX_CheckFormat // =================== // // This version checks for the presence of a top level BPAV directory, and the required files and // directories immediately within it. The CLPR and TAKR subfolders are required, as is MEDIAPRO.XML. // // The state of the string parameters depends on the form of the path passed by the client. If the // client passed a logical clip path, like ".../MyMovie/012_3456_01", the parameters are: // rootPath - ".../MyMovie" // gpName - empty // parentName - empty // leafName - "012_3456_01" // If the client passed a full file path, like ".../MyMovie/BPAV/CLPR/012_3456_01/012_3456_01M01.XML", they are: // rootPath - ".../MyMovie/BPAV" // gpName - "CLPR" // parentName - "012_3456_01" // leafName - "012_3456_01M01" // ! The common code has shifted the gpName, parentName, and leafName strings to upper case. It has // ! also made sure that for a logical clip path the rootPath is an existing folder, and that the // ! file exists for a full file path. // ! Using explicit '/' as a separator when creating paths, it works on Windows. bool XDCAMEX_CheckFormat ( XMP_FileFormat format, const std::string & _rootPath, const std::string & gpName, const std::string & parentName, const std::string & _leafName, XMPFiles * parent ) { std::string rootPath = _rootPath; std::string clipName = _leafName; std::string grandGPName; std::string bpavPath ( rootPath ); // Do some initial checks on the gpName and parentName. if ( gpName.empty() != parentName.empty() ) return false; // Must be both empty or both non-empty. if ( gpName.empty() ) { // This is the logical clip path case. Make sure .../MyMovie/BPAV/CLPR is a folder. bpavPath += kDirChar; // The rootPath was just ".../MyMovie". bpavPath += "BPAV"; if ( GetChildMode ( bpavPath, "CLPR" ) != kFMode_IsFolder ) return false; } else { // This is the explicit file case. Make sure the ancestry is OK. Set the clip name from the // parent folder name. if ( gpName != "CLPR" ) return false; SplitLeafName ( &rootPath, &grandGPName ); MakeUpperCase ( &grandGPName ); if ( grandGPName != "BPAV" ) return false; if ( ! XMP_LitNMatch ( parentName.c_str(), clipName.c_str(), parentName.size() ) ) return false; clipName = parentName; } // Check the rest of the required general structure. if ( GetChildMode ( bpavPath, "TAKR" ) != kFMode_IsFolder ) return false; if ( GetChildMode ( bpavPath, "MEDIAPRO.XML" ) != kFMode_IsFile ) return false; // Make sure the clip's .MP4 and .SMI files exist. std::string tempPath ( bpavPath ); tempPath += kDirChar; tempPath += "CLPR"; tempPath += kDirChar; tempPath += clipName; tempPath += kDirChar; tempPath += clipName; tempPath += ".MP4"; if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFile ) return false; tempPath.erase ( tempPath.size()-3 ); tempPath += "SMI"; if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFile ) return false; // And now save the psuedo path for the handler object. tempPath = rootPath; tempPath += kDirChar; tempPath += clipName; size_t pathLen = tempPath.size() + 1; // Include a terminating nul. parent->tempPtr = malloc ( pathLen ); if ( parent->tempPtr == 0 ) XMP_Throw ( "No memory for XDCAMEX clip info", kXMPErr_NoMemory ); memcpy ( parent->tempPtr, tempPath.c_str(), pathLen ); return true; } // XDCAMEX_CheckFormat // ================================================================================================= // XDCAMEX_MetaHandlerCTor // ======================= XMPFileHandler * XDCAMEX_MetaHandlerCTor ( XMPFiles * parent ) { return new XDCAMEX_MetaHandler ( parent ); } // XDCAMEX_MetaHandlerCTor // ================================================================================================= // XDCAMEX_MetaHandler::XDCAMEX_MetaHandler // ======================================== XDCAMEX_MetaHandler::XDCAMEX_MetaHandler ( XMPFiles * _parent ) : expat(0) { this->parent = _parent; // Inherited, can't set in the prefix. this->handlerFlags = kXDCAMEX_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; // Extract the root path and clip name from tempPtr. XMP_Assert ( this->parent->tempPtr != 0 ); this->rootPath.assign ( (char*) this->parent->tempPtr ); free ( this->parent->tempPtr ); this->parent->tempPtr = 0; SplitLeafName ( &this->rootPath, &this->clipName ); } // XDCAMEX_MetaHandler::XDCAMEX_MetaHandler // ================================================================================================= // XDCAMEX_MetaHandler::~XDCAMEX_MetaHandler // ========================================= XDCAMEX_MetaHandler::~XDCAMEX_MetaHandler() { this->CleanupLegacyXML(); if ( this->parent->tempPtr != 0 ) { free ( this->parent->tempPtr ); this->parent->tempPtr = 0; } } // XDCAMEX_MetaHandler::~XDCAMEX_MetaHandler // ================================================================================================= // XDCAMEX_MetaHandler::MakeClipFilePath // ===================================== void XDCAMEX_MetaHandler::MakeClipFilePath ( std::string * path, XMP_StringPtr suffix ) { *path = this->rootPath; *path += kDirChar; *path += "BPAV"; *path += kDirChar; *path += "CLPR"; *path += kDirChar; *path += this->clipName; *path += kDirChar; *path += this->clipName; *path += suffix; } // XDCAMEX_MetaHandler::MakeClipFilePath // ================================================================================================= // XDCAMEX_MetaHandler::MakeLegacyDigest // ===================================== // *** Early hack version. #define kHexDigits "0123456789ABCDEF" void XDCAMEX_MetaHandler::MakeLegacyDigest ( std::string * digestStr ) { digestStr->erase(); if ( this->clipMetadata == 0 ) return; // Bail if we don't have any legacy XML. XMP_Assert ( this->expat != 0 ); XMP_StringPtr xdcNS = this->xdcNS.c_str(); XML_NodePtr legacyContext, legacyProp; legacyContext = this->clipMetadata->GetNamedElement ( xdcNS, "Access" ); if ( legacyContext == 0 ) return; MD5_CTX context; unsigned char digestBin [16]; MD5Init ( &context ); legacyProp = legacyContext->GetNamedElement ( xdcNS, "Creator" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) { const XML_Node * xmlValue = legacyProp->content[0]; MD5Update ( &context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() ); } legacyProp = legacyContext->GetNamedElement ( xdcNS, "CreationDate" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) { const XML_Node * xmlValue = legacyProp->content[0]; MD5Update ( &context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() ); } legacyProp = legacyContext->GetNamedElement ( xdcNS, "LastUpdateDate" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) { const XML_Node * xmlValue = legacyProp->content[0]; MD5Update ( &context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() ); } MD5Final ( digestBin, &context ); char buffer [40]; for ( int in = 0, out = 0; in < 16; in += 1, out += 2 ) { XMP_Uns8 byte = digestBin[in]; buffer[out] = kHexDigits [ byte >> 4 ]; buffer[out+1] = kHexDigits [ byte & 0xF ]; } buffer[32] = 0; digestStr->append ( buffer ); } // XDCAMEX_MetaHandler::MakeLegacyDigest // ================================================================================================= // XDCAMEX_MetaHandler::CleanupLegacyXML // ===================================== void XDCAMEX_MetaHandler::CleanupLegacyXML() { if ( this->expat != 0 ) { delete ( this->expat ); this->expat = 0; } clipMetadata = 0; // ! Was a pointer into the expat tree. } // XDCAMEX_MetaHandler::CleanupLegacyXML // ================================================================================================= // XDCAMEX_MetaHandler::CacheFileData // ================================== void XDCAMEX_MetaHandler::CacheFileData() { XMP_Assert ( ! this->containsXMP ); // See if the clip's .XMP file exists. std::string xmpPath; this->MakeClipFilePath ( &xmpPath, "M01.XMP" ); if ( GetFileMode ( xmpPath.c_str() ) != kFMode_IsFile ) return; // No XMP. // Read the entire .XMP file. char openMode = 'r'; if ( this->parent->openFlags & kXMPFiles_OpenForUpdate ) openMode = 'w'; LFA_FileRef xmpFile = LFA_Open ( xmpPath.c_str(), openMode ); if ( xmpFile == 0 ) return; // The open failed. XMP_Int64 xmpLen = LFA_Measure ( xmpFile ); if ( xmpLen > 100*1024*1024 ) { XMP_Throw ( "XDCAMEX XMP is outrageously large", kXMPErr_InternalFailure ); // Sanity check. } this->xmpPacket.erase(); this->xmpPacket.reserve ( (size_t)xmpLen ); this->xmpPacket.append ( (size_t)xmpLen, ' ' ); XMP_Int32 ioCount = LFA_Read ( xmpFile, (void*)this->xmpPacket.data(), (XMP_Int32)xmpLen, kLFA_RequireAll ); XMP_Assert ( ioCount == xmpLen ); this->packetInfo.offset = 0; this->packetInfo.length = (XMP_Int32)xmpLen; FillPacketInfo ( this->xmpPacket, &this->packetInfo ); XMP_Assert ( this->parent->fileRef == 0 ); if ( openMode == 'r' ) { LFA_Close ( xmpFile ); } else { this->parent->fileRef = xmpFile; } this->containsXMP = true; } // XDCAMEX_MetaHandler::CacheFileData // ================================================================================================= // XDCAMEX_MetaHandler::GetTakeDuration // ==================================== void XDCAMEX_MetaHandler::GetTakeDuration ( const std::string & takeURI, std::string & duration ) { // Some versions of gcc can't tolerate goto's across declarations. // *** Better yet, avoid this cruft with self-cleaning objects. #define CleanupAndExit \ { \ if (expat != 0) delete expat; \ if (takeXMLFile.fileRef != 0) LFA_Close ( takeXMLFile.fileRef ); \ return; \ } duration.clear(); // Build a directory string to the take .xml file. std::string takeDir ( takeURI ); takeDir.erase ( 0, 1 ); // Change the leading "//" to "/", then all '/' to kDirChar. if ( kDirChar != '/' ) { for ( size_t i = 0, limit = takeDir.size(); i < limit; ++i ) { if ( takeDir[i] == '/' ) takeDir[i] = kDirChar; } } std::string takePath ( this->rootPath ); takePath += kDirChar; takePath += "BPAV"; takePath += takeDir; // Replace .SMI with M01.XML. if ( takePath.size() > 4 ) { takePath.erase ( takePath.size() - 4, 4 ); takePath += "M01.XML"; } // Parse MEDIAPRO.XML XML_NodePtr takeRootElem = 0; XML_NodePtr context = 0; AutoFile takeXMLFile; takeXMLFile.fileRef = LFA_Open ( takePath.c_str(), 'r' ); if ( takeXMLFile.fileRef == 0 ) return; // The open failed. ExpatAdapter * expat = XMP_NewExpatAdapter ( ExpatAdapter::kUseLocalNamespaces ); if ( this->expat == 0 ) return; XMP_Uns8 buffer [64*1024]; while ( true ) { XMP_Int32 ioCount = LFA_Read ( takeXMLFile.fileRef, buffer, sizeof(buffer) ); if ( ioCount == 0 ) break; expat->ParseBuffer ( buffer, ioCount, false /* not the end */ ); } expat->ParseBuffer ( 0, 0, true ); // End the parse. LFA_Close ( takeXMLFile.fileRef ); takeXMLFile.fileRef = 0; // Get the root node of the XML tree. XML_Node & mediaproXMLTree = expat->tree; for ( size_t i = 0, limit = mediaproXMLTree.content.size(); i < limit; ++i ) { if ( mediaproXMLTree.content[i]->kind == kElemNode ) { takeRootElem = mediaproXMLTree.content[i]; } } if ( takeRootElem == 0 ) CleanupAndExit XMP_StringPtr rlName = takeRootElem->name.c_str() + takeRootElem->nsPrefixLen; if ( ! XMP_LitMatch ( rlName, "NonRealTimeMeta" ) ) CleanupAndExit // MediaProfile, Contents XMP_StringPtr ns = takeRootElem->ns.c_str(); context = takeRootElem->GetNamedElement ( ns, "Duration" ); if ( context != 0 ) { XMP_StringPtr durationValue = context->GetAttrValue ( "value" ); if ( durationValue != 0 ) duration = durationValue; } CleanupAndExit #undef CleanupAndExit } // ================================================================================================= // XDCAMEX_MetaHandler::GetTakeUMID // ================================ void XDCAMEX_MetaHandler::GetTakeUMID ( const std::string& clipUMID, std::string& takeUMID, std::string& takeXMLURI ) { // Some versions of gcc can't tolerate goto's across declarations. // *** Better yet, avoid this cruft with self-cleaning objects. #define CleanupAndExit \ { \ if (expat != 0) delete expat; \ if (mediaproXMLFile.fileRef != 0) LFA_Close ( mediaproXMLFile.fileRef ); \ return; \ } takeUMID.clear(); takeXMLURI.clear(); // Build a directory string to the MEDIAPRO file. std::string mediapropath ( this->rootPath ); mediapropath += kDirChar; mediapropath += "BPAV"; mediapropath += kDirChar; mediapropath += "MEDIAPRO.XML"; // Parse MEDIAPRO.XML. XML_NodePtr mediaproRootElem = 0; XML_NodePtr contentContext = 0, materialContext = 0; AutoFile mediaproXMLFile; mediaproXMLFile.fileRef = LFA_Open ( mediapropath.c_str(), 'r' ); if ( mediaproXMLFile.fileRef == 0 ) return; // The open failed. ExpatAdapter * expat = XMP_NewExpatAdapter ( ExpatAdapter::kUseLocalNamespaces ); if ( this->expat == 0 ) return; XMP_Uns8 buffer [64*1024]; while ( true ) { XMP_Int32 ioCount = LFA_Read ( mediaproXMLFile.fileRef, buffer, sizeof(buffer) ); if ( ioCount == 0 ) break; expat->ParseBuffer ( buffer, ioCount, false /* not the end */ ); } expat->ParseBuffer ( 0, 0, true ); // End the parse. LFA_Close ( mediaproXMLFile.fileRef ); mediaproXMLFile.fileRef = 0; // Get the root node of the XML tree. XML_Node & mediaproXMLTree = expat->tree; for ( size_t i = 0, limit = mediaproXMLTree.content.size(); i < limit; ++i ) { if ( mediaproXMLTree.content[i]->kind == kElemNode ) { mediaproRootElem = mediaproXMLTree.content[i]; } } if ( mediaproRootElem == 0 ) CleanupAndExit XMP_StringPtr rlName = mediaproRootElem->name.c_str() + mediaproRootElem->nsPrefixLen; if ( ! XMP_LitMatch ( rlName, "MediaProfile" ) ) CleanupAndExit // MediaProfile, Contents XMP_StringPtr ns = mediaproRootElem->ns.c_str(); contentContext = mediaproRootElem->GetNamedElement ( ns, "Contents" ); if ( contentContext != 0 ) { size_t numMaterialElems = contentContext->CountNamedElements ( ns, "Material" ); for ( size_t i = 0; i < numMaterialElems; ++i ) { // Iterate over Material tags. XML_NodePtr materialElement = contentContext->GetNamedElement ( ns, "Material", i ); XMP_Assert ( materialElement != 0 ); XMP_StringPtr umid = materialElement->GetAttrValue ( "umid" ); XMP_StringPtr uri = materialElement->GetAttrValue ( "uri" ); if ( umid == 0 ) umid = ""; if ( uri == 0 ) uri = ""; size_t numComponents = materialElement->CountNamedElements ( ns, "Component" ); for ( size_t j = 0; j < numComponents; ++j ) { XML_NodePtr componentElement = materialElement->GetNamedElement ( ns, "Component", j ); XMP_Assert ( componentElement != 0 ); XMP_StringPtr compUMID = componentElement->GetAttrValue ( "umid" ); if ( (compUMID != 0) && (compUMID == clipUMID) ) { takeUMID = umid; takeXMLURI = uri; break; } } if ( ! takeUMID.empty() ) break; } } CleanupAndExit #undef CleanupAndExit } // ================================================================================================= // XDCAMEX_MetaHandler::ProcessXMP // =============================== void XDCAMEX_MetaHandler::ProcessXMP() { // Some versions of gcc can't tolerate goto's across declarations. // *** Better yet, avoid this cruft with self-cleaning objects. #define CleanupAndExit \ { \ bool openForUpdate = XMP_OptionIsSet ( this->parent->openFlags, kXMPFiles_OpenForUpdate ); \ if ( ! openForUpdate ) this->CleanupLegacyXML(); \ return; \ } if ( this->processedXMP ) return; this->processedXMP = true; // Make sure only called once. if ( this->containsXMP ) { this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); } // NonRealTimeMeta -> XMP by schema. std::string thisUMID, takeUMID, takeXMLURI, takeDuration; std::string xmlPath; this->MakeClipFilePath ( &xmlPath, "M01.XML" ); AutoFile xmlFile; xmlFile.fileRef = LFA_Open ( xmlPath.c_str(), 'r' ); if ( xmlFile.fileRef == 0 ) return; // The open failed. this->expat = XMP_NewExpatAdapter ( ExpatAdapter::kUseLocalNamespaces ); if ( this->expat == 0 ) XMP_Throw ( "XDCAMEX_MetaHandler: Can't create Expat adapter", kXMPErr_NoMemory ); XMP_Uns8 buffer [64*1024]; while ( true ) { XMP_Int32 ioCount = LFA_Read ( xmlFile.fileRef, buffer, sizeof(buffer) ); if ( ioCount == 0 ) break; this->expat->ParseBuffer ( buffer, ioCount, false /* not the end */ ); } this->expat->ParseBuffer ( 0, 0, true ); // End the parse. LFA_Close ( xmlFile.fileRef ); xmlFile.fileRef = 0; // The root element should be NonRealTimeMeta in some namespace. Take whatever this file uses. XML_Node & xmlTree = this->expat->tree; XML_NodePtr rootElem = 0; for ( size_t i = 0, limit = xmlTree.content.size(); i < limit; ++i ) { if ( xmlTree.content[i]->kind == kElemNode ) rootElem = xmlTree.content[i]; } if ( rootElem == 0 ) CleanupAndExit XMP_StringPtr rootLocalName = rootElem->name.c_str() + rootElem->nsPrefixLen; if ( ! XMP_LitMatch ( rootLocalName, "NonRealTimeMeta" ) ) CleanupAndExit this->legacyNS = rootElem->ns; // Check the legacy digest. XMP_StringPtr legacyNS = this->legacyNS.c_str(); this->clipMetadata = rootElem; // ! Save the NonRealTimeMeta pointer for other use. std::string oldDigest, newDigest; bool digestFound = this->xmpObj.GetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "XDCAMEX", &oldDigest, 0 ); if ( digestFound ) { this->MakeLegacyDigest ( &newDigest ); if ( oldDigest == newDigest ) CleanupAndExit } // If we get here we need find and import the actual legacy elements using the current namespace. // Either there is no old digest in the XMP, or the digests differ. In the former case keep any // existing XMP, in the latter case take new legacy values. this->containsXMP = XDCAM_Support::GetLegacyMetaData ( &this->xmpObj, rootElem, legacyNS, digestFound, thisUMID ); // If this clip is part of a take, add the take number to the relation field, and get the // duration from the take metadata. GetTakeUMID ( thisUMID, takeUMID, takeXMLURI ); // If this clip is part of a take, update the duration to reflect the take duration rather than // the clip duration, and add the take name as a shot name. if ( ! takeXMLURI.empty() ) { // Update duration. This property already exists from clip legacy metadata. GetTakeDuration ( takeXMLURI, takeDuration ); if ( ! takeDuration.empty() ) { this->xmpObj.SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "value", takeDuration ); containsXMP = true; } if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "shotName" )) ) { std::string takeName; SplitLeafName ( &takeXMLURI, &takeName ); // Check for the xml suffix, and delete if it exists. size_t pos = takeName.rfind(".SMI"); if ( pos != std::string::npos ) { takeName.erase ( pos ); // delete the take number suffix if it exists. if ( takeName.size() > 3 ) { size_t suffix = takeName.size() - 3; char c1 = takeName[suffix]; char c2 = takeName[suffix+1]; char c3 = takeName[suffix+2]; if ( ('U' == c1) && ('0' <= c2) && (c2 <= '9') && ('0' <= c3) && (c3 <= '9') ) { takeName.erase ( suffix ); } this->xmpObj.SetProperty ( kXMP_NS_DM, "shotName", takeName, kXMP_DeleteExisting ); containsXMP = true; } } } } if ( (! takeUMID.empty()) && (digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DC, "relation" ))) ) { this->xmpObj.DeleteProperty ( kXMP_NS_DC, "relation" ); this->xmpObj.AppendArrayItem ( kXMP_NS_DC, "relation", kXMP_PropArrayIsUnordered, takeUMID ); this->containsXMP = true; } CleanupAndExit #undef CleanupAndExit } // XDCAMEX_MetaHandler::ProcessXMP // ================================================================================================= // XDCAMEX_MetaHandler::UpdateFile // =============================== // // Note that UpdateFile is only called from XMPFiles::CloseFile, so it is OK to close the file here. void XDCAMEX_MetaHandler::UpdateFile ( bool doSafeUpdate ) { if ( ! this->needsUpdate ) return; this->needsUpdate = false; // Make sure only called once. LFA_FileRef oldFile = 0; std::string filePath, tempPath; // Update the internal legacy XML tree if we have one, and set the digest in the XMP. bool updateLegacyXML = false; if ( this->clipMetadata != 0 ) { updateLegacyXML = XDCAM_Support::SetLegacyMetaData ( this->clipMetadata, &this->xmpObj, this->legacyNS.c_str()); } std::string newDigest; this->MakeLegacyDigest ( &newDigest ); this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "XDCAMEX", newDigest.c_str(), kXMP_DeleteExisting ); this->xmpObj.SerializeToBuffer ( &this->xmpPacket, this->GetSerializeOptions() ); // Update the legacy XML file if necessary. if ( updateLegacyXML ) { std::string legacyXML; this->expat->tree.Serialize ( &legacyXML ); this->MakeClipFilePath ( &filePath, "M01.XML" ); oldFile = LFA_Open ( filePath.c_str(), 'w' ); if ( oldFile == 0 ) { // The XML does not exist yet. this->MakeClipFilePath ( &filePath, "M01.XML" ); oldFile = LFA_Create ( filePath.c_str() ); if ( oldFile == 0 ) XMP_Throw ( "Failure creating XDCAMEX legacy XML file", kXMPErr_ExternalFailure ); LFA_Write ( oldFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() ); LFA_Close ( oldFile ); } else if ( ! doSafeUpdate ) { // Over write the existing XML file. LFA_Seek ( oldFile, 0, SEEK_SET ); LFA_Truncate ( oldFile, 0 ); LFA_Write ( oldFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() ); LFA_Close ( oldFile ); } else { // Do a safe update. // *** We really need an LFA_SwapFiles utility. this->MakeClipFilePath ( &filePath, "M01.XML" ); CreateTempFile ( filePath, &tempPath ); LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' ); LFA_Write ( tempFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() ); LFA_Close ( tempFile ); LFA_Close ( oldFile ); LFA_Delete ( filePath.c_str() ); LFA_Rename ( tempPath.c_str(), filePath.c_str() ); } } oldFile = this->parent->fileRef; if ( oldFile == 0 ) { // The XMP does not exist yet. std::string xmpPath; this->MakeClipFilePath ( &xmpPath, "M01.XMP" ); LFA_FileRef xmpFile = LFA_Create ( xmpPath.c_str() ); if ( xmpFile == 0 ) XMP_Throw ( "Failure creating XDCAMEX XMP file", kXMPErr_ExternalFailure ); LFA_Write ( xmpFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( xmpFile ); } else if ( ! doSafeUpdate ) { // Over write the existing XMP file. LFA_Seek ( oldFile, 0, SEEK_SET ); LFA_Truncate ( oldFile, 0 ); LFA_Write ( oldFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( oldFile ); } else { // Do a safe update. // *** We really need an LFA_SwapFiles utility. std::string xmpPath, tempPath; this->MakeClipFilePath ( &xmpPath, "M01.XMP" ); CreateTempFile ( xmpPath, &tempPath ); LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' ); LFA_Write ( tempFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( tempFile ); LFA_Close ( oldFile ); LFA_Delete ( xmpPath.c_str() ); LFA_Rename ( tempPath.c_str(), xmpPath.c_str() ); } this->parent->fileRef = 0; } // XDCAMEX_MetaHandler::UpdateFile // ================================================================================================= // XDCAMEX_MetaHandler::WriteFile // ============================== void XDCAMEX_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { // ! WriteFile is not supposed to be called for handlers that own the file. XMP_Throw ( "XDCAMEX_MetaHandler::WriteFile should not be called", kXMPErr_InternalFailure ); } // XDCAMEX_MetaHandler::WriteFile // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/MPEG2_Handler.hpp0000664000175000017500000000354212150230672020177 00000000000000#ifndef __MPEG2_Handler_hpp__ #define __MPEG2_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2005 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMPFiles_Impl.hpp" // ================================================================================================= /// \file MPEG2_Handler.hpp /// \brief File format handler for MPEG2. /// /// This header ... /// // ================================================================================================= extern XMPFileHandler * MPEG2_MetaHandlerCTor ( XMPFiles * parent ); extern bool MPEG2_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent); static const XMP_OptionBits kMPEG2_HandlerFlags = ( kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_CanRewrite | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_HandlerOwnsFile | kXMPFiles_AllowsSafeUpdate | kXMPFiles_UsesSidecarXMP ); class MPEG2_MetaHandler : public XMPFileHandler { public: std::string sidecarPath; MPEG2_MetaHandler ( XMPFiles * parent ); ~MPEG2_MetaHandler(); void CacheFileData(); void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); }; // MPEG2_MetaHandler // ================================================================================================= #endif /* __MPEG2_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/P2_Handler.cpp0000664000175000017500000013551512150230672017647 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include #include "P2_Handler.hpp" #include "MD5.h" #include using namespace std; // ================================================================================================= /// \file P2_Handler.cpp /// \brief Folder format handler for P2. /// /// This handler is for the P2 video format. This is a pseudo-package, visible files but with a very /// well-defined layout and naming rules. A typical P2 example looks like: /// /// .../MyMovie /// CONTENTS/ /// CLIP/ /// 0001AB.XML /// 0001AB.XMP /// 0002CD.XML /// 0002CD.XMP /// VIDEO/ /// 0001AB.MXF /// 0002CD.MXF /// AUDIO/ /// 0001AB00.MXF /// 0001AB01.MXF /// 0002CD00.MXF /// 0002CD01.MXF /// ICON/ /// 0001AB.BMP /// 0002CD.BMP /// VOICE/ /// 0001AB.WAV /// 0002CD.WAV /// PROXY/ /// 0001AB.MP4 /// 0002CD.MP4 /// /// From the user's point of view, .../MyMovie contains P2 stuff, in this case 2 clips whose raw /// names are 0001AB and 0002CD. There may be mapping information for nicer clip names to the raw /// names, but that can be ignored for now. Each clip is stored as a collection of files, each file /// holding some specific aspect of the clip's data. /// /// The P2 handler operates on clips. The path from the client of XMPFiles can be either a logical /// clip path, like ".../MyMovie/0001AB", or a full path to one of the files. In the latter case the /// handler must figure out the intended clip, it must not blindly use the named file. /// /// Once the P2 structure and intended clip are identified, the handler only deals with the .XMP and /// .XML files in the CLIP folder. The .XMP file, if present, contains the XMP for the clip. The .XML /// file must be present to define the existance of the clip. It contains a variety of information /// about the clip, including some legacy metadata. /// // ================================================================================================= static const char * kContentFolderNames[] = { "CLIP", "VIDEO", "AUDIO", "ICON", "VOICE", "PROXY", 0 }; static int kNumRequiredContentFolders = 6; // All 6 of the above. static inline bool CheckContentFolderName ( const std::string & folderName ) { for ( int i = 0; kContentFolderNames[i] != 0; ++i ) { if ( folderName == kContentFolderNames[i] ) return true; } return false; } // ================================================================================================= // InternalMakeClipFilePath // ======================== // // P2_CheckFormat can't use the member function. static void InternalMakeClipFilePath ( std::string * path, const std::string & rootPath, const std::string & clipName, XMP_StringPtr suffix ) { *path = rootPath; *path += kDirChar; *path += "CONTENTS"; *path += kDirChar; *path += "CLIP"; *path += kDirChar; *path += clipName; *path += suffix; } // InternalMakeClipFilePath // ================================================================================================= // P2_CheckFormat // ============== // // This version does fairly simple checks. The top level folder (.../MyMovie) must a child folder // called CONTENTS. This must have a subfolder called CLIP. It may also have subfolders called // VIDEO, AUDIO, ICON, VOICE, and PROXY. Any mixture of these additional folders is allowed, but no // other children are allowed in CONTENTS. The CLIP folder must contain a .XML file for the desired // clip. The name checks are case insensitive. // // The state of the string parameters depends on the form of the path passed by the client. If the // client passed a logical clip path, like ".../MyMovie/0001AB", the parameters are: // rootPath - ".../MyMovie" // gpName - empty // parentName - empty // leafName - "0001AB" // If the client passed a full file path, like ".../MyMovie/CONTENTS/VOICE/0001AB.WAV", they are: // rootPath - ".../MyMovie" // gpName - "CONTENTS" // parentName - "VOICE" // leafName - "0001AB" // // For most of the content files the base file name is the raw clip name. Files in the AUDIO and // VOICE folders have an extra 2 digits appended to the raw clip name. These must be trimmed. // ! The common code has shifted the gpName, parentName, and leafName strings to upper case. It has // ! also made sure that for a logical clip path the rootPath is an existing folder, and that the // ! file exists for a full file path. bool P2_CheckFormat ( XMP_FileFormat format, const std::string & rootPath, const std::string & gpName, const std::string & parentName, const std::string & leafName, XMPFiles * parent ) { XMP_FolderInfo folderInfo; std::string tempPath, childName; std::string clipName = leafName; // Do some basic checks on the gpName and parentName. if ( gpName.empty() != parentName.empty() ) return false; // Must be both empty or both non-empty. if ( ! gpName.empty() ) { if ( gpName != "CONTENTS" ) return false; if ( ! CheckContentFolderName ( parentName ) ) return false; if ( (parentName == "AUDIO") | (parentName == "VOICE") ) { if ( clipName.size() < 3 ) return false; clipName.erase ( clipName.size() - 2 ); } } tempPath = rootPath; tempPath += kDirChar; tempPath += "CONTENTS"; if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFolder ) return false; folderInfo.Open ( tempPath.c_str() ); int numChildrenFound = 0; while ( ( folderInfo.GetNextChild ( &childName ) && ( numChildrenFound < kNumRequiredContentFolders ) ) ) { // Make sure the children of CONTENTS are legit. if ( CheckContentFolderName ( childName ) ) { folderInfo.GetFolderPath ( &tempPath ); tempPath += kDirChar; tempPath += childName; if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFolder ) return false; ++numChildrenFound; } } folderInfo.Close(); // Make sure the clip's .XML file exists. InternalMakeClipFilePath ( &tempPath, rootPath, clipName, ".XML" ); if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFile ) return false; // Make a bogus path to pass the root path and clip name to the handler. A bit of a hack, but // the only way to get info from here to there. tempPath = rootPath; tempPath += kDirChar; tempPath += clipName; size_t pathLen = tempPath.size() + 1; // Include a terminating nul. parent->tempPtr = malloc ( pathLen ); if ( parent->tempPtr == 0 ) XMP_Throw ( "No memory for P2 clip path", kXMPErr_NoMemory ); memcpy ( parent->tempPtr, tempPath.c_str(), pathLen ); // AUDIT: Safe, allocated above. return true; } // P2_CheckFormat // ================================================================================================= // P2_MetaHandlerCTor // ================== XMPFileHandler * P2_MetaHandlerCTor ( XMPFiles * parent ) { return new P2_MetaHandler ( parent ); } // P2_MetaHandlerCTor // ================================================================================================= // P2_MetaHandler::P2_MetaHandler // ============================== P2_MetaHandler::P2_MetaHandler ( XMPFiles * _parent ) : expat(0), clipMetadata(0), clipContent(0) { this->parent = _parent; // Inherited, can't set in the prefix. this->handlerFlags = kP2_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; // Extract the root path and clip name from tempPtr. XMP_Assert ( this->parent->tempPtr != 0 ); this->rootPath = (char*)this->parent->tempPtr; free ( this->parent->tempPtr ); this->parent->tempPtr = 0; SplitLeafName ( &this->rootPath, &this->clipName ); } // P2_MetaHandler::P2_MetaHandler // ================================================================================================= // P2_MetaHandler::~P2_MetaHandler // =============================== P2_MetaHandler::~P2_MetaHandler() { this->CleanupLegacyXML(); if ( this->parent->tempPtr != 0 ) { free ( this->parent->tempPtr ); this->parent->tempPtr = 0; } } // P2_MetaHandler::~P2_MetaHandler // ================================================================================================= // P2_MetaHandler::MakeClipFilePath // ================================ void P2_MetaHandler::MakeClipFilePath ( std::string * path, XMP_StringPtr suffix ) { InternalMakeClipFilePath ( path, this->rootPath, this->clipName, suffix ); } // P2_MetaHandler::MakeClipFilePath // ================================================================================================= // P2_MetaHandler::CleanupLegacyXML // ================================ void P2_MetaHandler::CleanupLegacyXML() { if ( this->expat != 0 ) { delete ( this->expat ); this->expat = 0; } clipMetadata = 0; // ! Was a pointer into the expat tree. clipContent = 0; // ! Was a pointer into the expat tree. } // P2_MetaHandler::CleanupLegacyXML // ================================================================================================= // P2_MetaHandler::DigestLegacyItem // ================================ void P2_MetaHandler::DigestLegacyItem ( MD5_CTX & md5Context, XML_NodePtr legacyContext, XMP_StringPtr legacyPropName ) { XML_NodePtr legacyProp = legacyContext->GetNamedElement ( this->p2NS.c_str(), legacyPropName ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) { const XML_Node * xmlValue = legacyProp->content[0]; MD5Update ( &md5Context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() ); } } // P2_MetaHandler::DigestLegacyItem // ================================================================================================= // P2_MetaHandler::DigestLegacyRelations // ===================================== void P2_MetaHandler::DigestLegacyRelations ( MD5_CTX & md5Context ) { XMP_StringPtr p2NS = this->p2NS.c_str(); XML_Node * legacyContext = this->clipContent->GetNamedElement ( p2NS, "Relation" ); if ( legacyContext != 0 ) { this->DigestLegacyItem ( md5Context, legacyContext, "GlobalShotID" ); XML_Node * legacyConnectionContext = legacyContext = this->clipContent->GetNamedElement ( p2NS, "Connection" ); if ( legacyConnectionContext != 0 ) { legacyContext = legacyConnectionContext->GetNamedElement ( p2NS, "Top" ); if ( legacyContext != 0 ) { this->DigestLegacyItem ( md5Context, legacyContext, "GlobalClipID" ); } legacyContext = legacyConnectionContext->GetNamedElement ( p2NS, "Previous" ); if ( legacyContext != 0 ) { this->DigestLegacyItem ( md5Context, legacyContext, "GlobalClipID" ); } legacyContext = legacyConnectionContext->GetNamedElement ( p2NS, "Next" ); if ( legacyContext != 0 ) { this->DigestLegacyItem ( md5Context, legacyContext, "GlobalClipID" ); } } } } // P2_MetaHandler::DigestLegacyRelations // ================================================================================================= // P2_MetaHandler::SetXMPPropertyFromLegacyXML // =========================================== void P2_MetaHandler::SetXMPPropertyFromLegacyXML ( bool digestFound, XML_NodePtr legacyContext, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr legacyPropName, bool isLocalized ) { if ( digestFound || (! this->xmpObj.DoesPropertyExist ( schemaNS, propName )) ) { XMP_StringPtr p2NS = this->p2NS.c_str(); XML_NodePtr legacyProp = legacyContext->GetNamedElement ( p2NS, legacyPropName ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { if ( isLocalized ) { this->xmpObj.SetLocalizedText ( schemaNS, propName, "", "x-default", legacyProp->GetLeafContentValue(), kXMP_DeleteExisting ); } else { this->xmpObj.SetProperty ( schemaNS, propName, legacyProp->GetLeafContentValue(), kXMP_DeleteExisting ); } this->containsXMP = true; } } } // P2_MetaHandler::SetXMPPropertyFromLegacyXML // ================================================================================================= // P2_MetaHandler::SetRelationsFromLegacyXML // ========================================= void P2_MetaHandler::SetRelationsFromLegacyXML ( bool digestFound ) { XMP_StringPtr p2NS = this->p2NS.c_str(); XML_NodePtr legacyRelationContext = this->clipContent->GetNamedElement ( p2NS, "Relation" ); // P2 Relation blocks are optional -- they're only present when a clip is part of a multi-clip shot. if ( legacyRelationContext != 0 ) { if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DC, "relation" )) ) { XML_NodePtr legacyProp = legacyRelationContext->GetNamedElement ( p2NS, "GlobalShotID" ); std::string relationString; if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { this->xmpObj.DeleteProperty ( kXMP_NS_DC, "relation" ); relationString = std::string("globalShotID:") + legacyProp->GetLeafContentValue(); this->xmpObj.AppendArrayItem ( kXMP_NS_DC, "relation", kXMP_PropArrayIsUnordered, relationString ); this->containsXMP = true; XML_NodePtr legacyConnectionContext = legacyRelationContext->GetNamedElement ( p2NS, "Connection" ); if ( legacyConnectionContext != 0 ) { XML_NodePtr legacyContext = legacyConnectionContext->GetNamedElement ( p2NS, "Top" ); if ( legacyContext != 0 ) { legacyProp = legacyContext->GetNamedElement ( p2NS, "GlobalClipID" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { relationString = std::string("topGlobalClipID:") + legacyProp->GetLeafContentValue(); this->xmpObj.AppendArrayItem ( kXMP_NS_DC, "relation", kXMP_PropArrayIsUnordered, relationString ); } } legacyContext = legacyConnectionContext->GetNamedElement ( p2NS, "Previous" ); if ( legacyContext != 0 ) { legacyProp = legacyContext->GetNamedElement ( p2NS, "GlobalClipID" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { relationString = std::string("previousGlobalClipID:") + legacyProp->GetLeafContentValue(); this->xmpObj.AppendArrayItem ( kXMP_NS_DC, "relation", kXMP_PropArrayIsUnordered, relationString ); } } legacyContext = legacyConnectionContext->GetNamedElement ( p2NS, "Next" ); if ( legacyContext != 0 ) { legacyProp = legacyContext->GetNamedElement ( p2NS, "GlobalClipID" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { relationString = std::string("nextGlobalClipID:") + legacyProp->GetLeafContentValue(); this->xmpObj.AppendArrayItem ( kXMP_NS_DC, "relation", kXMP_PropArrayIsUnordered, relationString ); } } } } } } } // P2_MetaHandler::SetRelationsFromLegacyXML // ================================================================================================= // P2_MetaHandler::SetAudioInfoFromLegacyXML // ========================================= void P2_MetaHandler::SetAudioInfoFromLegacyXML ( bool digestFound ) { XMP_StringPtr p2NS = this->p2NS.c_str(); XML_NodePtr legacyAudioContext = this->clipContent->GetNamedElement ( p2NS, "EssenceList" ); if ( legacyAudioContext != 0 ) { legacyAudioContext = legacyAudioContext->GetNamedElement ( p2NS, "Audio" ); if ( legacyAudioContext != 0 ) { this->SetXMPPropertyFromLegacyXML ( digestFound, legacyAudioContext, kXMP_NS_DM, "audioSampleRate", "SamplingRate", false ); if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "audioSampleType" )) ) { XML_NodePtr legacyProp = legacyAudioContext->GetNamedElement ( p2NS, "BitsPerSample" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { const std::string p2BitsPerSample = legacyProp->GetLeafContentValue(); std::string dmSampleType; if ( p2BitsPerSample == "16" ) { dmSampleType = "16Int"; } else if ( p2BitsPerSample == "24" ) { dmSampleType = "32Int"; } if ( ! dmSampleType.empty() ) { this->xmpObj.SetProperty ( kXMP_NS_DM, "audioSampleType", dmSampleType, kXMP_DeleteExisting ); this->containsXMP = true; } } } } } } // P2_MetaHandler::SetAudioInfoFromLegacyXML // ================================================================================================= // P2_MetaHandler::SetVideoInfoFromLegacyXML // ========================================= void P2_MetaHandler::SetVideoInfoFromLegacyXML ( bool digestFound ) { XMP_StringPtr p2NS = this->p2NS.c_str(); XML_NodePtr legacyVideoContext = this->clipContent->GetNamedElement ( p2NS, "EssenceList" ); if ( legacyVideoContext != 0 ) { legacyVideoContext = legacyVideoContext->GetNamedElement ( p2NS, "Video" ); if ( legacyVideoContext != 0 ) { this->SetVideoFrameInfoFromLegacyXML ( legacyVideoContext, digestFound ); this->SetStartTimecodeFromLegacyXML ( legacyVideoContext, digestFound ); this->SetXMPPropertyFromLegacyXML ( digestFound, legacyVideoContext, kXMP_NS_DM, "videoFrameRate", "FrameRate", false ); } } } // P2_MetaHandler::SetVideoInfoFromLegacyXML // ================================================================================================= // P2_MetaHandler::SetDurationFromLegacyXML // ======================================== void P2_MetaHandler::SetDurationFromLegacyXML ( bool digestFound ) { if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "duration" )) ) { XMP_StringPtr p2NS = this->p2NS.c_str(); XML_NodePtr legacyDurationProp = this->clipContent->GetNamedElement ( p2NS, "Duration" ); XML_NodePtr legacyEditUnitProp = this->clipContent->GetNamedElement ( p2NS, "EditUnit" ); if ( (legacyDurationProp != 0) && ( legacyEditUnitProp != 0 ) && legacyDurationProp->IsLeafContentNode() && legacyEditUnitProp->IsLeafContentNode() ) { this->xmpObj.DeleteProperty ( kXMP_NS_DM, "duration" ); this->xmpObj.SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "value", legacyDurationProp->GetLeafContentValue() ); this->xmpObj.SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "scale", legacyEditUnitProp->GetLeafContentValue() ); this->containsXMP = true; } } } // P2_MetaHandler::SetDurationFromLegacyXML // ================================================================================================= // P2_MetaHandler::SetVideoFrameInfoFromLegacyXML // ============================================== void P2_MetaHandler::SetVideoFrameInfoFromLegacyXML ( XML_NodePtr legacyVideoContext, bool digestFound ) { // Map the P2 Codec field to various dynamic media schema fields. if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "videoFrameSize" )) ) { XMP_StringPtr p2NS = this->p2NS.c_str(); XML_NodePtr legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "Codec" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { const std::string p2Codec = legacyProp->GetLeafContentValue(); std::string dmPixelAspectRatio, dmVideoCompressor, dmWidth, dmHeight; if ( p2Codec == "DV25_411" ) { dmWidth = "720"; dmVideoCompressor = "DV25 4:1:1"; } else if ( p2Codec == "DV25_420" ) { dmWidth = "720"; dmVideoCompressor = "DV25 4:2:0"; } else if ( p2Codec == "DV50_422" ) { dmWidth = "720"; dmVideoCompressor = "DV50 4:2:2"; } else if ( ( p2Codec == "DV100_1080/59.94i" ) || ( p2Codec == "DV100_1080/50i" ) ) { dmVideoCompressor = "DV100"; dmHeight = "1080"; if ( p2Codec == "DV100_1080/59.94i" ) { dmWidth = "1280"; dmPixelAspectRatio = "3/2"; } else { dmWidth = "1440"; dmPixelAspectRatio = "1920/1440"; } } else if ( ( p2Codec == "DV100_720/59.94p" ) || ( p2Codec == "DV100_720/50p" ) ) { dmVideoCompressor = "DV100"; dmHeight = "720"; dmWidth = "960"; dmPixelAspectRatio = "1920/1440"; } else if ( ( p2Codec.compare ( 0, 6, "AVC-I_" ) == 0 ) ) { // This is AVC-Intra footage. The framerate and PAR depend on the "class" attribute in the P2 XML. const XMP_StringPtr codecClass = legacyProp->GetAttrValue( "Class" ); if ( XMP_LitMatch ( codecClass, "100" ) ) { dmVideoCompressor = "AVC-Intra 100"; dmPixelAspectRatio = "1/1"; if ( p2Codec.compare ( 6, 4, "1080" ) == 0 ) { dmHeight = "1080"; dmWidth = "1920"; } else if ( p2Codec.compare ( 6, 3, "720" ) == 0 ) { dmHeight = "720"; dmWidth = "1280"; } } else if ( XMP_LitMatch ( codecClass, "50" ) ) { dmVideoCompressor = "AVC-Intra 50"; dmPixelAspectRatio = "1920/1440"; if ( p2Codec.compare ( 6, 4, "1080" ) == 0 ) { dmHeight = "1080"; dmWidth = "1440"; } else if ( p2Codec.compare ( 6, 3, "720" ) == 0 ) { dmHeight = "720"; dmWidth = "960"; } } else { // Unknown codec class -- we don't have enough info to determine the // codec, PAR, or aspect ratio dmVideoCompressor = "AVC-Intra"; } } if ( dmWidth == "720" ) { // This is SD footage -- calculate the frame height and pixel aspect ratio using the legacy P2 // FrameRate and AspectRatio fields. legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "FrameRate" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { const std::string p2FrameRate = legacyProp->GetLeafContentValue(); legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "AspectRatio" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { const std::string p2AspectRatio = legacyProp->GetLeafContentValue(); if ( p2FrameRate == "50i" ) { // Standard Definition PAL. dmHeight = "576"; if ( p2AspectRatio == "4:3" ) { dmPixelAspectRatio = "768/702"; } else if ( p2AspectRatio == "16:9" ) { dmPixelAspectRatio = "1024/702"; } } else if ( p2FrameRate == "59.94i" ) { // Standard Definition NTSC. dmHeight = "480"; if ( p2AspectRatio == "4:3" ) { dmPixelAspectRatio = "10/11"; } else if ( p2AspectRatio == "16:9" ) { dmPixelAspectRatio = "40/33"; } } } } } if ( ! dmPixelAspectRatio.empty() ) { this->xmpObj.SetProperty ( kXMP_NS_DM, "videoPixelAspectRatio", dmPixelAspectRatio, kXMP_DeleteExisting ); this->containsXMP = true; } if ( ! dmVideoCompressor.empty() ) { this->xmpObj.SetProperty ( kXMP_NS_DM, "videoCompressor", dmVideoCompressor, kXMP_DeleteExisting ); this->containsXMP = true; } if ( ( ! dmWidth.empty() ) && ( ! dmHeight.empty() ) ) { this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "w", dmWidth, 0 ); this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "h", dmHeight, 0 ); this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "unit", "pixel", 0 ); this->containsXMP = true; } } } } // P2_MetaHandler::SetVideoFrameInfoFromLegacyXML // ================================================================================================= // P2_MetaHandler::SetStartTimecodeFromLegacyXML // ============================================= void P2_MetaHandler::SetStartTimecodeFromLegacyXML ( XML_NodePtr legacyVideoContext, bool digestFound ) { // Translate start timecode to the format specified by the dynamic media schema. if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "startTimecode" )) ) { XMP_StringPtr p2NS = this->p2NS.c_str(); XML_NodePtr legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "StartTimecode" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { std::string p2StartTimecode = legacyProp->GetLeafContentValue(); legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "FrameRate" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { const std::string p2FrameRate = legacyProp->GetLeafContentValue(); XMP_StringPtr p2DropFrameFlag = legacyProp->GetAttrValue ( "DropFrameFlag" ); if ( p2DropFrameFlag == 0 ) p2DropFrameFlag = ""; // Make tests easier. std::string dmTimeFormat; if ( ( p2FrameRate == "50i" ) || ( p2FrameRate == "25p" ) ) { dmTimeFormat = "25Timecode"; } else if ( p2FrameRate == "23.98p" ) { dmTimeFormat = "23976Timecode"; } else if ( p2FrameRate == "50p" ) { dmTimeFormat = "50Timecode"; } else if ( ( p2FrameRate == "59.94p" ) && ( p2DropFrameFlag != 0 ) ) { if ( XMP_LitMatch ( p2DropFrameFlag, "true" ) ) { dmTimeFormat = "5994DropTimecode"; } else if ( XMP_LitMatch ( p2DropFrameFlag, "false" ) ) { dmTimeFormat = "5994NonDropTimecode"; } } else if ( (p2FrameRate == "59.94i") || (p2FrameRate == "29.97p") ) { if ( p2DropFrameFlag != 0 ) { if ( XMP_LitMatch ( p2DropFrameFlag, "false" ) ) { dmTimeFormat = "2997NonDropTimecode"; } else if ( XMP_LitMatch ( p2DropFrameFlag, "true" ) ) { // Drop frame NTSC timecode uses semicolons instead of colons as separators. std::string::iterator currCharIt = p2StartTimecode.begin(); const std::string::iterator charsEndIt = p2StartTimecode.end(); for ( ; currCharIt != charsEndIt; ++currCharIt ) { if ( *currCharIt == ':' ) *currCharIt = ';'; } dmTimeFormat = "2997DropTimecode"; } } } if ( ( ! p2StartTimecode.empty() ) && ( ! dmTimeFormat.empty() ) ) { this->xmpObj.SetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeValue", p2StartTimecode, 0 ); this->xmpObj.SetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeFormat", dmTimeFormat, 0 ); this->containsXMP = true; } } } } } // P2_MetaHandler::SetStartTimecodeFromLegacyXML // ================================================================================================= // P2_MetaHandler::SetGPSPropertyFromLegacyXML // =========================================== void P2_MetaHandler::SetGPSPropertyFromLegacyXML ( XML_NodePtr legacyLocationContext, bool digestFound, XMP_StringPtr propName, XMP_StringPtr legacyPropName ) { if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_EXIF, propName )) ) { XMP_StringPtr p2NS = this->p2NS.c_str(); XML_NodePtr legacyGPSProp = legacyLocationContext->GetNamedElement ( p2NS, legacyPropName ); if ( ( legacyGPSProp != 0 ) && legacyGPSProp->IsLeafContentNode() ) { this->xmpObj.DeleteProperty ( kXMP_NS_EXIF, propName ); const std::string legacyGPSValue = legacyGPSProp->GetLeafContentValue(); if ( ! legacyGPSValue.empty() ) { // Convert from decimal to sexagesimal GPS coordinates char direction = '\0'; double degrees = 0.0; const int numFieldsRead = sscanf ( legacyGPSValue.c_str(), "%c%lf", &direction, °rees ); if ( numFieldsRead == 2 ) { double wholeDegrees = 0.0; const double fractionalDegrees = modf ( degrees, &wholeDegrees ); const double minutes = fractionalDegrees * 60.0; char xmpValue [128]; sprintf ( xmpValue, "%d,%.5lf%c", static_cast(wholeDegrees), minutes, direction ); this->xmpObj.SetProperty ( kXMP_NS_EXIF, propName, xmpValue ); this->containsXMP = true; } } } } } // P2_MetaHandler::SetGPSPropertyFromLegacyXML // ================================================================================================= // P2_MetaHandler::SetAltitudeFromLegacyXML // ======================================== void P2_MetaHandler::SetAltitudeFromLegacyXML ( XML_NodePtr legacyLocationContext, bool digestFound ) { if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_EXIF, "GPSAltitude" )) ) { XMP_StringPtr p2NS = this->p2NS.c_str(); XML_NodePtr legacyAltitudeProp = legacyLocationContext->GetNamedElement ( p2NS, "Altitude" ); if ( ( legacyAltitudeProp != 0 ) && legacyAltitudeProp->IsLeafContentNode() ) { this->xmpObj.DeleteProperty ( kXMP_NS_EXIF, "GPSAltitude" ); const std::string legacyGPSValue = legacyAltitudeProp->GetLeafContentValue(); if ( ! legacyGPSValue.empty() ) { int altitude = 0; if ( sscanf ( legacyGPSValue.c_str(), "%d", &altitude ) == 1) { if ( altitude >= 0 ) { // At or above sea level. this->xmpObj.SetProperty ( kXMP_NS_EXIF, "GPSAltitudeRef", "0" ); } else { // Below sea level. altitude = -altitude; this->xmpObj.SetProperty ( kXMP_NS_EXIF, "GPSAltitudeRef", "1" ); } char xmpValue [128]; sprintf ( xmpValue, "%d/1", altitude ); this->xmpObj.SetProperty ( kXMP_NS_EXIF, "GPSAltitude", xmpValue ); this->containsXMP = true; } } } } } // P2_MetaHandler::SetAltitudeFromLegacyXML // ================================================================================================= // P2_MetaHandler::ForceChildElement // ================================= XML_Node * P2_MetaHandler::ForceChildElement ( XML_Node * parent, XMP_StringPtr localName, int indent /* = 0 */ ) { XML_Node * wsNode; XML_Node * childNode = parent->GetNamedElement ( this->p2NS.c_str(), localName ); if ( childNode == 0 ) { // The indenting is a hack, assuming existing 2 spaces per level. wsNode = new XML_Node ( parent, "", kCDataNode ); wsNode->value = " "; // Add 2 spaces to the existing WS before the parent's close tag. parent->content.push_back ( wsNode ); childNode = new XML_Node ( parent, localName, kElemNode ); childNode->ns = parent->ns; childNode->nsPrefixLen = parent->nsPrefixLen; childNode->name.insert ( 0, parent->name, 0, parent->nsPrefixLen ); parent->content.push_back ( childNode ); wsNode = new XML_Node ( parent, "", kCDataNode ); wsNode->value = '\n'; for ( ; indent > 1; --indent ) wsNode->value += " "; // Indent less 1, to "outdent" the parent's close. parent->content.push_back ( wsNode ); } return childNode; } // P2_MetaHandler::ForceChildElement // ================================================================================================= // P2_MetaHandler::MakeLegacyDigest // ================================= // *** Early hack version. #define kHexDigits "0123456789ABCDEF" void P2_MetaHandler::MakeLegacyDigest ( std::string * digestStr ) { digestStr->erase(); if ( this->clipMetadata == 0 ) return; // Bail if we don't have any legacy XML. XMP_Assert ( this->expat != 0 ); XMP_StringPtr p2NS = this->p2NS.c_str(); XML_NodePtr legacyContext; MD5_CTX md5Context; unsigned char digestBin [16]; MD5Init ( &md5Context ); legacyContext = this->clipContent; this->DigestLegacyItem ( md5Context, legacyContext, "ClipName" ); this->DigestLegacyItem ( md5Context, legacyContext, "GlobalClipID" ); this->DigestLegacyItem ( md5Context, legacyContext, "Duration" ); this->DigestLegacyItem ( md5Context, legacyContext, "EditUnit" ); this->DigestLegacyRelations ( md5Context ); legacyContext = this->clipContent->GetNamedElement ( p2NS, "EssenceList" ); if ( legacyContext != 0 ) { XML_NodePtr videoContext = legacyContext->GetNamedElement ( p2NS, "Video" ); if ( videoContext != 0 ) { this->DigestLegacyItem ( md5Context, videoContext, "AspectRatio" ); this->DigestLegacyItem ( md5Context, videoContext, "Codec" ); this->DigestLegacyItem ( md5Context, videoContext, "FrameRate" ); this->DigestLegacyItem ( md5Context, videoContext, "StartTimecode" ); } XML_NodePtr audioContext = legacyContext->GetNamedElement ( p2NS, "Audio" ); if ( audioContext != 0 ) { this->DigestLegacyItem ( md5Context, audioContext, "SamplingRate" ); this->DigestLegacyItem ( md5Context, audioContext, "BitsPerSample" ); } } legacyContext = this->clipMetadata; this->DigestLegacyItem ( md5Context, legacyContext, "UserClipName" ); this->DigestLegacyItem ( md5Context, legacyContext, "ShotMark" ); legacyContext = this->clipMetadata->GetNamedElement ( p2NS, "Access" ); /* Rather return than create the digest because the "Access" element is listed as "required" in the P2 spec. So a P2 file without an "Access" element does not follow the spec and might be corrupt.*/ if ( legacyContext == 0 ) return; this->DigestLegacyItem ( md5Context, legacyContext, "Creator" ); this->DigestLegacyItem ( md5Context, legacyContext, "CreationDate" ); this->DigestLegacyItem ( md5Context, legacyContext, "LastUpdateDate" ); legacyContext = this->clipMetadata->GetNamedElement ( p2NS, "Shoot" ); if ( legacyContext != 0 ) { this->DigestLegacyItem ( md5Context, legacyContext, "Shooter" ); legacyContext = legacyContext->GetNamedElement ( p2NS, "Location" ); if ( legacyContext != 0 ) { this->DigestLegacyItem ( md5Context, legacyContext, "PlaceName" ); this->DigestLegacyItem ( md5Context, legacyContext, "Longitude" ); this->DigestLegacyItem ( md5Context, legacyContext, "Latitude" ); this->DigestLegacyItem ( md5Context, legacyContext, "Altitude" ); } } legacyContext = this->clipMetadata->GetNamedElement ( p2NS, "Scenario" ); if ( legacyContext != 0 ) { this->DigestLegacyItem ( md5Context, legacyContext, "SceneNo." ); this->DigestLegacyItem ( md5Context, legacyContext, "TakeNo." ); } legacyContext = this->clipMetadata->GetNamedElement ( p2NS, "Device" ); if ( legacyContext != 0 ) { this->DigestLegacyItem ( md5Context, legacyContext, "Manufacturer" ); this->DigestLegacyItem ( md5Context, legacyContext, "SerialNo." ); this->DigestLegacyItem ( md5Context, legacyContext, "ModelName" ); } MD5Final ( digestBin, &md5Context ); char buffer [40]; for ( int in = 0, out = 0; in < 16; in += 1, out += 2 ) { XMP_Uns8 byte = digestBin[in]; buffer[out] = kHexDigits [ byte >> 4 ]; buffer[out+1] = kHexDigits [ byte & 0xF ]; } buffer[32] = 0; digestStr->append ( buffer ); } // P2_MetaHandler::MakeLegacyDigest // ================================================================================================= // P2_MetaHandler::CacheFileData // ============================= void P2_MetaHandler::CacheFileData() { XMP_Assert ( ! this->containsXMP ); // Make sure the clip's .XMP file exists. std::string xmpPath; this->MakeClipFilePath ( &xmpPath, ".XMP" ); if ( GetFileMode ( xmpPath.c_str() ) != kFMode_IsFile ) return; // No XMP. // Read the entire .XMP file. bool openForUpdate = XMP_OptionIsSet ( this->parent->openFlags, kXMPFiles_OpenForUpdate ); char openMode = 'r'; if ( openForUpdate ) openMode = 'w'; LFA_FileRef xmpFile = LFA_Open ( xmpPath.c_str(), openMode ); if ( xmpFile == 0 ) return; // The open failed. XMP_Int64 xmpLen = LFA_Measure ( xmpFile ); if ( xmpLen > 100*1024*1024 ) { XMP_Throw ( "P2 XMP is outrageously large", kXMPErr_InternalFailure ); // Sanity check. } this->xmpPacket.erase(); this->xmpPacket.reserve ( (size_t)xmpLen ); this->xmpPacket.append ( (size_t)xmpLen, ' ' ); XMP_Int32 ioCount = LFA_Read ( xmpFile, (void*)this->xmpPacket.data(), (XMP_Int32)xmpLen, kLFA_RequireAll ); XMP_Assert ( ioCount == xmpLen ); this->packetInfo.offset = 0; this->packetInfo.length = (XMP_Int32)xmpLen; FillPacketInfo ( this->xmpPacket, &this->packetInfo ); XMP_Assert ( this->parent->fileRef == 0 ); if ( openMode == 'r' ) { LFA_Close ( xmpFile ); } else { this->parent->fileRef = xmpFile; } this->containsXMP = true; } // P2_MetaHandler::CacheFileData // ================================================================================================= // P2_MetaHandler::ProcessXMP // ========================== void P2_MetaHandler::ProcessXMP() { // Some versions of gcc can't tolerate goto's across declarations. // *** Better yet, avoid this cruft with self-cleaning objects. #define CleanupAndExit \ { \ bool openForUpdate = XMP_OptionIsSet ( this->parent->openFlags, kXMPFiles_OpenForUpdate ); \ if ( ! openForUpdate ) this->CleanupLegacyXML(); \ return; \ } if ( this->processedXMP ) return; this->processedXMP = true; // Make sure only called once. if ( this->containsXMP ) { this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); } std::string xmlPath; this->MakeClipFilePath ( &xmlPath, ".XML" ); AutoFile xmlFile; xmlFile.fileRef = LFA_Open ( xmlPath.c_str(), 'r' ); if ( xmlFile.fileRef == 0 ) return; // The open failed. this->expat = XMP_NewExpatAdapter ( ExpatAdapter::kUseLocalNamespaces ); if ( this->expat == 0 ) XMP_Throw ( "P2_MetaHandler: Can't create Expat adapter", kXMPErr_NoMemory ); XMP_Uns8 buffer [64*1024]; while ( true ) { XMP_Int32 ioCount = LFA_Read ( xmlFile.fileRef, buffer, sizeof(buffer) ); if ( ioCount == 0 ) break; this->expat->ParseBuffer ( buffer, ioCount, false /* not the end */ ); } this->expat->ParseBuffer ( 0, 0, true ); // End the parse. LFA_Close ( xmlFile.fileRef ); xmlFile.fileRef = 0; // The root element should be P2Main in some namespace. At least 2 different namespaces are in // use (ending in "v3.0" and "v3.1"). Take whatever this file uses. XML_Node & xmlTree = this->expat->tree; XML_NodePtr rootElem = 0; for ( size_t i = 0, limit = xmlTree.content.size(); i < limit; ++i ) { if ( xmlTree.content[i]->kind == kElemNode ) { rootElem = xmlTree.content[i]; } } if ( rootElem == 0 ) CleanupAndExit XMP_StringPtr rootLocalName = rootElem->name.c_str() + rootElem->nsPrefixLen; if ( ! XMP_LitMatch ( rootLocalName, "P2Main" ) ) CleanupAndExit this->p2NS = rootElem->ns; // Now find ClipMetadata element and check the legacy digest. XMP_StringPtr p2NS = this->p2NS.c_str(); XML_NodePtr legacyContext, legacyProp; legacyContext = rootElem->GetNamedElement ( p2NS, "ClipContent" ); if ( legacyContext == 0 ) CleanupAndExit this->clipContent = legacyContext; // ! Save the ClipContext pointer for other use. legacyContext = legacyContext->GetNamedElement ( p2NS, "ClipMetadata" ); if ( legacyContext == 0 ) CleanupAndExit this->clipMetadata = legacyContext; // ! Save the ClipMetadata pointer for other use. std::string oldDigest, newDigest; bool digestFound = this->xmpObj.GetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "P2", &oldDigest, 0 ); if ( digestFound ) { this->MakeLegacyDigest ( &newDigest ); if ( oldDigest == newDigest ) CleanupAndExit } // If we get here we need find and import the actual legacy elements using the current namespace. // Either there is no old digest in the XMP, or the digests differ. In the former case keep any // existing XMP, in the latter case take new legacy values. this->SetXMPPropertyFromLegacyXML ( digestFound, this->clipContent, kXMP_NS_DC, "title", "ClipName", true ); this->SetXMPPropertyFromLegacyXML ( digestFound, this->clipContent, kXMP_NS_DC, "identifier", "GlobalClipID", false ); this->SetDurationFromLegacyXML (digestFound ); this->SetRelationsFromLegacyXML ( digestFound ); this->SetXMPPropertyFromLegacyXML ( digestFound, this->clipMetadata, kXMP_NS_DM, "shotName", "UserClipName", false ); this->SetAudioInfoFromLegacyXML ( digestFound ); this->SetVideoInfoFromLegacyXML ( digestFound ); legacyContext = this->clipMetadata->GetNamedElement ( p2NS, "Access" ); if ( legacyContext == 0 ) CleanupAndExit if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DC, "creator" )) ) { legacyProp = legacyContext->GetNamedElement ( p2NS, "Creator" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { this->xmpObj.DeleteProperty ( kXMP_NS_DC, "creator" ); this->xmpObj.AppendArrayItem ( kXMP_NS_DC, "creator", kXMP_PropArrayIsOrdered, legacyProp->GetLeafContentValue() ); this->containsXMP = true; } } this->SetXMPPropertyFromLegacyXML ( digestFound, legacyContext, kXMP_NS_XMP, "CreateDate", "CreationDate", false ); this->SetXMPPropertyFromLegacyXML ( digestFound, legacyContext, kXMP_NS_XMP, "ModifyDate", "LastUpdateDate", false ); if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "good" )) ) { legacyProp = this->clipMetadata->GetNamedElement ( p2NS, "ShotMark" ); if ( (legacyProp == 0) || (! legacyProp->IsLeafContentNode()) ) { this->xmpObj.DeleteProperty ( kXMP_NS_DM, "good" ); } else { XMP_StringPtr markValue = legacyProp->GetLeafContentValue(); if ( markValue == 0 ) { this->xmpObj.DeleteProperty ( kXMP_NS_DM, "good" ); } else if ( XMP_LitMatch ( markValue, "true" ) || XMP_LitMatch ( markValue, "1" ) ) { this->xmpObj.SetProperty_Bool ( kXMP_NS_DM, "good", true, kXMP_DeleteExisting ); this->containsXMP = true; } else if ( XMP_LitMatch ( markValue, "false" ) || XMP_LitMatch ( markValue, "0" ) ) { this->xmpObj.SetProperty_Bool ( kXMP_NS_DM, "good", false, kXMP_DeleteExisting ); this->containsXMP = true; } } } legacyContext = this->clipMetadata->GetNamedElement ( p2NS, "Shoot" ); if ( legacyContext != 0 ) { this->SetXMPPropertyFromLegacyXML ( digestFound, legacyContext, kXMP_NS_TIFF, "Artist", "Shooter", false ); legacyContext = legacyContext->GetNamedElement ( p2NS, "Location" ); } if ( legacyContext != 0 ) { this->SetXMPPropertyFromLegacyXML ( digestFound, legacyContext, kXMP_NS_DM, "shotLocation", "PlaceName", false ); this->SetGPSPropertyFromLegacyXML ( legacyContext, digestFound, "GPSLongitude", "Longitude" ); this->SetGPSPropertyFromLegacyXML ( legacyContext, digestFound, "GPSLatitude", "Latitude" ); this->SetAltitudeFromLegacyXML ( legacyContext, digestFound ); } legacyContext = this->clipMetadata->GetNamedElement ( p2NS, "Device" ); if ( legacyContext != 0 ) { this->SetXMPPropertyFromLegacyXML ( digestFound, legacyContext, kXMP_NS_TIFF, "Make", "Manufacturer", false ); this->SetXMPPropertyFromLegacyXML ( digestFound, legacyContext, kXMP_NS_EXIF_Aux, "SerialNumber", "SerialNo.", false ); this->SetXMPPropertyFromLegacyXML ( digestFound, legacyContext, kXMP_NS_TIFF, "Model", "ModelName", false ); } legacyContext = this->clipMetadata->GetNamedElement ( p2NS, "Scenario" ); if ( legacyContext != 0 ) { this->SetXMPPropertyFromLegacyXML ( digestFound, legacyContext, kXMP_NS_DM, "scene", "SceneNo.", false ); this->SetXMPPropertyFromLegacyXML ( digestFound, legacyContext, kXMP_NS_DM, "takeNumber", "TakeNo.", false ); } CleanupAndExit #undef CleanupAndExit } // P2_MetaHandler::ProcessXMP // ================================================================================================= // P2_MetaHandler::UpdateFile // ========================== // // Note that UpdateFile is only called from XMPFiles::CloseFile, so it is OK to close the file here. void P2_MetaHandler::UpdateFile ( bool doSafeUpdate ) { if ( ! this->needsUpdate ) return; this->needsUpdate = false; // Make sure only called once. LFA_FileRef oldFile = 0; std::string filePath, tempPath; // Update the internal legacy XML tree if we have one, and set the digest in the XMP. // *** This is just a minimal prototype. bool updateLegacyXML = false; if ( this->clipMetadata != 0 ) { XMP_Assert ( this->expat != 0 ); bool xmpFound; std::string xmpValue; XML_Node * xmlNode; xmpFound = this->xmpObj.GetLocalizedText ( kXMP_NS_DC, "title", "", "x-default", 0, &xmpValue, 0 ); if ( xmpFound ) { xmlNode = this->ForceChildElement ( this->clipContent, "ClipName", 3 ); if ( xmpValue != xmlNode->GetLeafContentValue() ) { xmlNode->SetLeafContentValue ( xmpValue.c_str() ); updateLegacyXML = true; } } xmpFound = this->xmpObj.GetArrayItem ( kXMP_NS_DC, "creator", 1, &xmpValue, 0 ); if ( xmpFound ) { xmlNode = this->ForceChildElement ( this->clipMetadata, "Access", 3 ); xmlNode = this->ForceChildElement ( xmlNode, "Creator", 4 ); if ( xmpValue != xmlNode->GetLeafContentValue() ) { xmlNode->SetLeafContentValue ( xmpValue.c_str() ); updateLegacyXML = true; } } } std::string newDigest; this->MakeLegacyDigest ( &newDigest ); this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "P2", newDigest.c_str(), kXMP_DeleteExisting ); this->xmpObj.SerializeToBuffer ( &this->xmpPacket, this->GetSerializeOptions() ); // Update the legacy XML file if necessary. if ( updateLegacyXML ) { std::string legacyXML; this->expat->tree.Serialize ( &legacyXML ); this->MakeClipFilePath ( &filePath, ".XML" ); oldFile = LFA_Open ( filePath.c_str(), 'w' ); if ( oldFile == 0 ) { // The XML does not exist yet. this->MakeClipFilePath ( &filePath, ".XML" ); oldFile = LFA_Create ( filePath.c_str() ); if ( oldFile == 0 ) XMP_Throw ( "Failure creating P2 legacy XML file", kXMPErr_ExternalFailure ); LFA_Write ( oldFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() ); LFA_Close ( oldFile ); } else if ( ! doSafeUpdate ) { // Over write the existing XML file. LFA_Seek ( oldFile, 0, SEEK_SET ); LFA_Truncate ( oldFile, 0 ); LFA_Write ( oldFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() ); LFA_Close ( oldFile ); } else { // Do a safe update. // *** We really need an LFA_SwapFiles utility. this->MakeClipFilePath ( &filePath, ".XML" ); CreateTempFile ( filePath, &tempPath ); LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' ); LFA_Write ( tempFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() ); LFA_Close ( tempFile ); LFA_Close ( oldFile ); LFA_Delete ( filePath.c_str() ); LFA_Rename ( tempPath.c_str(), filePath.c_str() ); } } // Update the XMP file. oldFile = this->parent->fileRef; if ( oldFile == 0 ) { // The XMP does not exist yet. this->MakeClipFilePath ( &filePath, ".XMP" ); oldFile = LFA_Create ( filePath.c_str() ); if ( oldFile == 0 ) XMP_Throw ( "Failure creating P2 XMP file", kXMPErr_ExternalFailure ); LFA_Write ( oldFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( oldFile ); } else if ( ! doSafeUpdate ) { // Over write the existing XMP file. LFA_Seek ( oldFile, 0, SEEK_SET ); LFA_Truncate ( oldFile, 0 ); LFA_Write ( oldFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( oldFile ); } else { // Do a safe update. // *** We really need an LFA_SwapFiles utility. this->MakeClipFilePath ( &filePath, ".XMP" ); CreateTempFile ( filePath, &tempPath ); LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' ); LFA_Write ( tempFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( tempFile ); LFA_Close ( oldFile ); LFA_Delete ( filePath.c_str() ); LFA_Rename ( tempPath.c_str(), filePath.c_str() ); } this->parent->fileRef = 0; } // P2_MetaHandler::UpdateFile // ================================================================================================= // P2_MetaHandler::WriteFile // ========================= void P2_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { // ! WriteFile is not supposed to be called for handlers that own the file. XMP_Throw ( "P2_MetaHandler::WriteFile should not be called", kXMPErr_InternalFailure ); } // P2_MetaHandler::WriteFile // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/AVCHD_Handler.hpp0000664000175000017500000000532412150230672020212 00000000000000#ifndef __AVCHD_Handler_hpp__ #define __AVCHD_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "XMPFiles_Impl.hpp" #include "ExpatAdapter.hpp" // ================================================================================================= /// \file AVCHD_Handler.hpp /// \brief Folder format handler for AVCHD. /// /// This header ... /// // ================================================================================================= extern XMPFileHandler * AVCHD_MetaHandlerCTor ( XMPFiles * parent ); extern bool AVCHD_CheckFormat ( XMP_FileFormat format, const std::string & rootPath, const std::string & gpName, const std::string & parentName, const std::string & leafName, XMPFiles * parent ); static const XMP_OptionBits kAVCHD_HandlerFlags = (kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_CanRewrite | kXMPFiles_PrefersInPlace | kXMPFiles_CanReconcile | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_HandlerOwnsFile | kXMPFiles_AllowsSafeUpdate | kXMPFiles_FolderBasedFormat); class AVCHD_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessXMP(); XMP_OptionBits GetSerializeOptions() // *** These should be standard for standalone XMP files. { return (kXMP_UseCompactFormat | kXMP_OmitPacketWrapper); }; void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); AVCHD_MetaHandler ( XMPFiles * _parent ); virtual ~AVCHD_MetaHandler(); private: AVCHD_MetaHandler() {}; // Hidden on purpose. bool MakeClipInfoPath ( std::string * path, XMP_StringPtr suffix, bool checkFile = false ) const; bool MakeClipStreamPath ( std::string * path, XMP_StringPtr suffix, bool checkFile = false ) const; bool MakePlaylistPath ( std::string * path, XMP_StringPtr suffix, bool checkFile = false ) const; void MakeLegacyDigest ( std::string * digestStr ); std::string rootPath, clipName; }; // AVCHD_MetaHandler // ================================================================================================= #endif /* __AVCHD_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/PSD_Handler.hpp0000664000175000017500000000535212150230672020014 00000000000000#ifndef __PSD_Handler_hpp__ #define __PSD_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "TIFF_Support.hpp" #include "PSIR_Support.hpp" #include "IPTC_Support.hpp" // ================================================================================================= /// \file PSD_Handler.hpp /// \brief File format handler for PSD (Photoshop). /// /// This header ... /// // ================================================================================================= // *** Could derive from Basic_Handler - buffer file tail in a temp file. extern XMPFileHandler * PSD_MetaHandlerCTor ( XMPFiles * parent ); extern bool PSD_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); static const XMP_OptionBits kPSD_HandlerFlags = (kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_CanRewrite | kXMPFiles_PrefersInPlace | kXMPFiles_CanReconcile | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_AllowsSafeUpdate); class PSD_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessXMP(); void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); bool skipReconcile; // ! Used between UpdateFile and WriteFile. PSD_MetaHandler ( XMPFiles * parent ); virtual ~PSD_MetaHandler(); private: PSD_MetaHandler() : skipReconcile(false), iptcMgr(0), exifMgr(0) {}; // Hidden on purpose. PSIR_FileWriter psirMgr; // Don't need a pointer, the PSIR part is always file-based. IPTC_Manager * iptcMgr; // Need to use pointers so we can properly select between read-only TIFF_Manager * exifMgr; // and read-write modes of usage. XMP_Uns32 imageWidth, imageHeight; // Pixel dimensions, used with thumbnail info. }; // PSD_MetaHandler // ================================================================================================= #endif /* __PSD_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/UCF_Handler.cpp0000664000175000017500000007735412150230672020011 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // =============================================================================================== #if XMP_WinBuild #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif #include "UCF_Handler.hpp" #include "zlib.h" #include #ifdef DYNAMIC_CRC_TABLE #error "unexpectedly DYNAMIC_CRC_TABLE defined." //Must implement get_crc_table prior to any multi-threading (see notes there) #endif using namespace std; // ================================================================================================= /// \file UCF_Handler.cpp /// \brief UCF handler class // ================================================================================================= const XMP_Uns16 xmpFilenameLen = 21; const char* xmpFilename = "META-INF/metadata.xml"; // ================================================================================================= // UCF_MetaHandlerCTor // ==================== XMPFileHandler* UCF_MetaHandlerCTor ( XMPFiles * parent ) { return new UCF_MetaHandler ( parent ); } // UCF_MetaHandlerCTor // ================================================================================================= // UCF_CheckFormat // ================ // * lenght must at least be 114 bytes // * first bytes must be \x50\x4B\x03\x04 for *any* zip file // * at offset 30 it must spell "mimetype" #define MIN_UCF_LENGTH 114 // zip minimum considerations: // the shortest legal zip is 100 byte: // 30+1* bytes file header //+ 0 byte content file (uncompressed) //+ 46+1* bytes central directory file header //+ 22 byte end of central directory record //------- //100 bytes // //1 byte is the shortest legal filename. anything below is no valid zip. // //==> the mandatory+first "mimetype" content file has a filename length of 8 bytes, // thus even if empty (arguably incorrect but tolerable), // the shortest legal UCF is 114 bytes (30 + 8 + 0 + 46 + 8 + 22 ) // anything below is with certainty not a valid ucf. bool UCF_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ) { // *not* using buffer functionality here, all we need // to detect UCF securely is in the first 38 bytes... IgnoreParam(filePath); IgnoreParam(parent); //suppress warnings XMP_Assert ( format == kXMP_UCFFile ); //standard assert XMP_Uns8 buffer[MIN_UCF_LENGTH]; LFA_Seek ( fileRef, 0, SEEK_SET ); if ( MIN_UCF_LENGTH != LFA_Read ( fileRef, buffer, MIN_UCF_LENGTH) ) //NO requireall (->no throw), just return false return false; if ( !CheckBytes ( &buffer[0], "\x50\x4B\x03\x04", 4 ) ) // "PK 03 04" return false; // UCF spec says: there must be a content file mimetype, and be first and be uncompressed... if ( !CheckBytes ( &buffer[30], "mimetype", 8 ) ) return false; ////////////////////////////////////////////////////////////////////////////// //figure out mimetype, decide on writeability // grab mimetype LFA_Seek( fileRef, 18, SEEK_SET ); XMP_Uns32 mimeLength = LFA_ReadUns32_LE ( fileRef ); XMP_Uns32 mimeCompressedLength = LFA_ReadUns32_LE ( fileRef ); // must be same since uncompressed XMP_Validate( mimeLength == mimeCompressedLength, "mimetype compressed and uncompressed length differ", kXMPErr_BadFileFormat ); XMP_Validate( mimeLength != 0, "0-byte mimetype", kXMPErr_BadFileFormat ); // determine writability based on mimetype LFA_Seek( fileRef, 30 + 8, SEEK_SET ); char* mimetype = new char[ mimeLength + 1 ]; LFA_Read( fileRef, mimetype, mimeLength, true ); mimetype[mimeLength] = '\0'; bool okMimetype; // be lenient on extraneous CR (0xA) [non-XMP bug #16980028] if ( mimeLength > 0 ) //avoid potential crash (will properly fail below anyhow) if ( mimetype[mimeLength-1] == 0xA ) mimetype[mimeLength-1] = '\0'; if ( XMP_LitMatch( mimetype, "application/vnd.adobe.xfl" ) || //Flash Diesel team XMP_LitMatch( mimetype, "application/vnd.adobe.xfl+zip") || //Flash Diesel team XMP_LitMatch( mimetype, "application/vnd.adobe.x-mars" ) || //Mars plugin(labs only), Acrobat8 XMP_LitMatch( mimetype, "application/vnd.adobe.pdfxml" ) || //Mars plugin(labs only), Acrobat 9 XMP_LitMatch( mimetype, "vnd.adobe.x-asnd" ) || //Adobe Sound Document (Soundbooth Team) XMP_LitMatch( mimetype, "application/vnd.adobe.indesign-idml-package" ) || //inCopy (inDesign) IDML Document XMP_LitMatch( mimetype, "application/vnd.adobe.incopy-package" ) || // InDesign Document XMP_LitMatch( mimetype, "application/vnd.adobe.indesign-package" ) || // InDesign Document false ) // "sentinel" // *** ==> unknown are also treated as not acceptable okMimetype = true; else okMimetype = false; // not accepted (neither read nor write //.air - Adobe Air Files //application/vnd.adobe.air-application-installer-package+zip //.airi - temporary Adobe Air Files //application/vnd.adobe.air-application-intermediate-package+zip delete [] mimetype; return okMimetype; } // UCF_CheckFormat // ================================================================================================= // UCF_MetaHandler::UCF_MetaHandler // ================================== UCF_MetaHandler::UCF_MetaHandler ( XMPFiles * _parent ) { this->parent = _parent; this->handlerFlags = kUCF_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; } // UCF_MetaHandler::UCF_MetaHandler // ================================================================================================= // UCF_MetaHandler::~UCF_MetaHandler // ===================================== UCF_MetaHandler::~UCF_MetaHandler() { // nothing } // ================================================================================================= // UCF_MetaHandler::CacheFileData // =============================== // void UCF_MetaHandler::CacheFileData() { //*** abort procedures this->containsXMP = false; //assume no XMP for now (beware of exceptions...) LFA_FileRef file = this->parent->fileRef; XMP_PacketInfo &packetInfo = this->packetInfo; // clear file positioning info --------------------------------------------------- b=0;b2=0;x=0;x2=0;cd=0;cd2=0;cdx=0;cdx2=0;h=0;h2=0,fl=0;f2l=0; al=0;bl=0;xl=0;x2l=0;cdl=0;cd2l=0;cdxl=0;cdx2l=0;hl=0,z=0,z2=0,z2l=0; numCF=0;numCF2=0; wasCompressed = false; // ------------------------------------------------------------------------------- fl=LFA_Measure( file ); if ( fl < MIN_UCF_LENGTH ) XMP_Throw("file too short, can't be correct UCF",kXMPErr_Unimplemented); ////////////////////////////////////////////////////////////////////////////// // find central directory before optional comment // things have to go bottom-up, since description headers are allowed in UCF // "scan backwards" until feasible field found (plus sig sanity check) // OS buffering should be smart enough, so not doing anything on top // plus almost all comments will be zero or rather short //no need to check anything but the 21 chars of "METADATA-INF/metadata.xml" char filenameToTest[22]; filenameToTest[21]='\0'; XMP_Int32 zipCommentLen = 0; for ( ; zipCommentLen <= EndOfDirectory::COMMENT_MAX; zipCommentLen++ ) { LFA_Seek( file, -zipCommentLen -2, SEEK_END ); if ( LFA_ReadUns16_LE( file ) == zipCommentLen ) //found it? { //double check, might just look like comment length (actually be 'evil' comment) LFA_Seek( file , - EndOfDirectory::FIXED_SIZE, SEEK_CUR ); if ( LFA_ReadUns32_LE( file ) == EndOfDirectory::ID ) break; //heureka, directory ID // 'else': pretend nothing happended, just go on } } //was it a break or just not found ? if ( zipCommentLen > EndOfDirectory::COMMENT_MAX ) XMP_Throw( "zip broken near end or invalid comment" , kXMPErr_BadFileFormat ); //////////////////////////////////////////////////////////////////////////// //read central directory hl = zipCommentLen + EndOfDirectory::FIXED_SIZE; h = fl - hl; LFA_Seek( file , h , SEEK_SET ); if ( LFA_ReadUns32_LE( file ) != EndOfDirectory::ID ) XMP_Throw("directory header id not found. or broken comment",kXMPErr_BadFileFormat); if ( LFA_ReadUns16_LE( file ) != 0 ) XMP_Throw("UCF must be 'first' zip volume",kXMPErr_BadFileFormat); if ( LFA_ReadUns16_LE( file ) != 0 ) XMP_Throw("UCF must be single-volume zip",kXMPErr_BadFileFormat); numCF = LFA_ReadUns16_LE( file ); //number of content files if ( numCF != LFA_ReadUns16_LE( file ) ) XMP_Throw( "per volume and total number of dirs differ" , kXMPErr_BadFileFormat ); cdl = LFA_ReadUns32_LE( file ); cd = LFA_ReadUns32_LE( file ); LFA_Seek( file, 2,SEEK_CUR ); //skip comment len, needed since next LFA is SEEK_CUR ! ////////////////////////////////////////////////////////////////////////////// // check for zip64-end-of-CD-locator/ zip64-end-of-CD // to to central directory if ( cd == 0xffffffff ) { // deal with zip 64, otherwise continue XMP_Int64 tmp = LFA_Seek( file, - EndOfDirectory::FIXED_SIZE - Zip64Locator::TOTAL_SIZE, SEEK_CUR ); //go to begining of zip64 locator //relative movement , absolute would imho only require another -zipCommentLen if ( Zip64Locator::ID == LFA_ReadUns32_LE(file) ) // prevent 'coincidental length' ffffffff { XMP_Validate( 0 == LFA_ReadUns32_LE(file), "zip64 CD disk must be 0", kXMPErr_BadFileFormat ); z = LFA_ReadUns64_LE(file); XMP_Validate( z < 0xffffffffffffLL, "file in terrabyte range?", kXMPErr_BadFileFormat ); // 3* ffff, sanity test XMP_Uns32 totalNumOfDisks = LFA_ReadUns32_LE(file); /* tolerated while pkglib bug #1742179 */ XMP_Validate( totalNumOfDisks == 0 || totalNumOfDisks == 1, "zip64 total num of disks must be 0", kXMPErr_BadFileFormat ); /////////////////////////////////////////////// /// on to end-of-CD itself LFA_Seek( file, z, SEEK_SET ); XMP_Validate( Zip64EndOfDirectory::ID == LFA_ReadUns32_LE(file), "invalid zip64 end of CD sig", kXMPErr_BadFileFormat ); XMP_Int64 sizeOfZip64EOD = LFA_ReadUns64_LE(file); LFA_Seek(file, 12, SEEK_CUR ); //yes twice "total" and "per disk" XMP_Int64 tmp64 = LFA_ReadUns64_LE(file); XMP_Validate( tmp64 == numCF, "num of content files differs to zip64 (1)", kXMPErr_BadFileFormat ); tmp64 = LFA_ReadUns64_LE(file); XMP_Validate( tmp64 == numCF, "num of content files differs to zip64 (2)", kXMPErr_BadFileFormat ); // cd length verification tmp64 = LFA_ReadUns64_LE(file); XMP_Validate( tmp64 == cdl, "CD length differs in zip64", kXMPErr_BadFileFormat ); cd = LFA_ReadUns64_LE(file); // wipe out invalid 0xffffffff with the real thing //ignoring "extensible data sector (would need fullLength - fixed length) for now } } // of zip64 fork ///////////////////////////////////////////////////////////////////////////// // parse central directory // 'foundXMP' <=> cdx != 0 LFA_Seek( file, cd, SEEK_SET ); XMP_Int64 cdx_suspect=0; XMP_Int64 cdxl_suspect=0; CDFileHeader curCDHeader; for ( XMP_Uns16 entryNum=1 ; entryNum <= numCF ; entryNum++ ) { cdx_suspect = LFA_Tell( file ); //just suspect for now curCDHeader.read( file ); if ( GetUns32LE( &curCDHeader.fields[CDFileHeader::o_sig] ) != 0x02014b50 ) XMP_Throw("&invalid file header",kXMPErr_BadFileFormat); cdxl_suspect = curCDHeader.FIXED_SIZE + GetUns16LE(&curCDHeader.fields[CDFileHeader::o_fileNameLength]) + GetUns16LE(&curCDHeader.fields[CDFileHeader::o_extraFieldLength]) + GetUns16LE(&curCDHeader.fields[CDFileHeader::o_commentLength]); // we only look 21 characters, that's META-INF/metadata.xml, no \0 attached if ( curCDHeader.filenameLen == xmpFilenameLen /*21*/ ) if( XMP_LitNMatch( curCDHeader.filename , "META-INF/metadata.xml", 21 ) ) { cdx = cdx_suspect; cdxl = cdxl_suspect; break; } //hop to next LFA_Seek( file, cdx_suspect + cdxl_suspect , SEEK_SET ); } //for-loop, iterating *all* central directory headers (also beyond found) if ( !cdx ) // not found xmp { // b and bl remain 0, x and xl remain 0 // ==> a is everything before directory al = cd; return; } // from here is if-found-only ////////////////////////////////////////////////////////////////////////////// //CD values needed, most serve counter-validation purposes (below) only // read whole object (incl. all 3 fields) again properly // to get extra Fields, etc LFA_Seek( file, cdx, SEEK_SET ); xmpCDHeader.read( file ); XMP_Validate( xmpFilenameLen == GetUns16LE( &xmpCDHeader.fields[CDFileHeader::o_fileNameLength]), "content file length not ok", kXMPErr_BadFileFormat ); XMP_Uns16 CD_compression = GetUns16LE( &xmpCDHeader.fields[CDFileHeader::o_compression] ); XMP_Validate(( CD_compression == 0 || CD_compression == 0x08), "illegal compression, must be flate or none", kXMPErr_BadFileFormat ); XMP_Uns16 CD_flags = GetUns16LE( &xmpCDHeader.fields[CDFileHeader::o_flags] ); XMP_Uns32 CD_crc = GetUns32LE( &xmpCDHeader.fields[CDFileHeader::o_crc32] ); // parse (actual, non-CD!) file header //////////////////////////////////////////////// x = xmpCDHeader.offsetLocalHeader; LFA_Seek( file , x ,SEEK_SET); xmpFileHeader.read( file ); xl = xmpFileHeader.sizeHeader() + xmpCDHeader.sizeCompressed; //values needed XMP_Uns16 fileNameLength = GetUns16LE( &xmpFileHeader.fields[FileHeader::o_fileNameLength] ); XMP_Uns16 extraFieldLength = GetUns16LE( &xmpFileHeader.fields[FileHeader::o_extraFieldLength] ); XMP_Uns16 compression = GetUns16LE( &xmpFileHeader.fields[FileHeader::o_compression] ); XMP_Uns32 sig = GetUns32LE( &xmpFileHeader.fields[FileHeader::o_sig] ); XMP_Uns16 flags = GetUns16LE( &xmpFileHeader.fields[FileHeader::o_flags] ); XMP_Uns32 sizeCompressed = GetUns32LE( &xmpFileHeader.fields[FileHeader::o_sizeCompressed] ); XMP_Uns32 sizeUncompressed = GetUns32LE( &xmpFileHeader.fields[FileHeader::o_sizeUncompressed] ); XMP_Uns32 crc = GetUns32LE( &xmpFileHeader.fields[FileHeader::o_crc32] ); // check filename XMP_Validate( fileNameLength == 21, "filename size contradiction" , kXMPErr_BadFileFormat ); XMP_Enforce ( xmpFileHeader.filename != 0 ); XMP_Validate( !memcmp( "META-INF/metadata.xml", xmpFileHeader.filename , xmpFilenameLen ) , "filename is cf header is not META-INF/metadata.xml" , kXMPErr_BadFileFormat ); // deal with data descriptor if needed if ( flags & FileHeader::kdataDescriptorFlag ) { if ( sizeCompressed!=0 || sizeUncompressed!=0 || crc!=0 ) XMP_Throw("data descriptor must mean 3x zero",kXMPErr_BadFileFormat); LFA_Seek( file, xmpCDHeader.sizeCompressed + fileNameLength + xmpCDHeader.extraFieldLen, SEEK_CUR); //skip actual data to get to descriptor crc = LFA_ReadUns32_LE( file ); if ( crc == 0x08074b50 ) //data descriptor may or may not have signature (see spec) { crc = LFA_ReadUns32_LE( file ); //if it does, re-read } sizeCompressed = LFA_ReadUns32_LE( file ); sizeUncompressed = LFA_ReadUns32_LE( file ); // *** cater for zip64 plus 'streamed' data-descriptor stuff } // more integrity checks (post data descriptor handling) if ( sig != 0x04034b50 ) XMP_Throw("invalid content file header",kXMPErr_BadFileFormat); if ( compression != CD_compression ) XMP_Throw("compression contradiction",kXMPErr_BadFileFormat); if ( sizeUncompressed != xmpCDHeader.sizeUncompressed ) XMP_Throw("contradicting uncompressed lengths",kXMPErr_BadFileFormat); if ( sizeCompressed != xmpCDHeader.sizeCompressed ) XMP_Throw("contradicting compressed lengths",kXMPErr_BadFileFormat); if ( sizeUncompressed == 0 ) XMP_Throw("0-byte uncompressed size", kXMPErr_BadFileFormat ); //////////////////////////////////////////////////////////////////// // packet Info this->packetInfo.charForm = stdCharForm; this->packetInfo.writeable = false; this->packetInfo.offset = kXMPFiles_UnknownOffset; // checksum!, hide position to not give funny ideas this->packetInfo.length = kXMPFiles_UnknownLength; //////////////////////////////////////////////////////////////////// // prepare packet (compressed or not) this->xmpPacket.erase(); this->xmpPacket.reserve( sizeUncompressed ); this->xmpPacket.append( sizeUncompressed, ' ' ); XMP_StringPtr packetStr = XMP_StringPtr ( xmpPacket.c_str() ); // only set after reserving the space! // go to packet offset LFA_Seek ( file, x + xmpFileHeader.FIXED_SIZE + fileNameLength + extraFieldLength , SEEK_SET); // compression fork -------------------------------------------------- switch (compression) { case 0x8: // FLATE { wasCompressed = true; XMP_Uns32 bytesRead = 0; XMP_Uns32 bytesWritten = 0; // for writing into packetString const unsigned int CHUNK = 16384; int ret; unsigned int have; //added type z_stream strm; unsigned char in[CHUNK]; unsigned char out[CHUNK]; // does need this intermediate stage, no direct compressio to packetStr possible, // since also partially filled buffers must be picked up. That's how it works. // in addition: internal zlib variables might have 16 bit limits... /* allocate inflate state */ strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; strm.avail_in = 0; strm.next_in = Z_NULL; /* must use windowBits = -15, for raw inflate, no zlib header */ ret = inflateInit2(&strm,-MAX_WBITS); if (ret != Z_OK) XMP_Throw("zlib error ",kXMPErr_ExternalFailure); /* decompress until deflate stream ends or end of file */ do { // must take care here not to read too much, thus whichever is smaller: XMP_Int32 bytesRemaining = sizeCompressed - bytesRead; if ( (XMP_Int32)CHUNK < bytesRemaining ) bytesRemaining = (XMP_Int32)CHUNK; strm.avail_in=LFA_Read( file , in , bytesRemaining , true ); bytesRead += strm.avail_in; // NB: avail_in is "unsigned_int", so might be 16 bit (not harmfull) if (strm.avail_in == 0) break; strm.next_in = in; do { strm.avail_out = CHUNK; strm.next_out = out; ret = inflate(&strm, Z_NO_FLUSH); XMP_Assert( ret != Z_STREAM_ERROR ); /* state not clobbered */ switch (ret) { case Z_NEED_DICT: (void)inflateEnd(&strm); XMP_Throw("zlib error: Z_NEED_DICT",kXMPErr_ExternalFailure); case Z_DATA_ERROR: (void)inflateEnd(&strm); XMP_Throw("zlib error: Z_DATA_ERROR",kXMPErr_ExternalFailure); case Z_MEM_ERROR: (void)inflateEnd(&strm); XMP_Throw("zlib error: Z_MEM_ERROR",kXMPErr_ExternalFailure); } have = CHUNK - strm.avail_out; memcpy( (unsigned char*) packetStr + bytesWritten , out , have ); bytesWritten += have; } while (strm.avail_out == 0); /* it's done when inflate() says it's done */ } while (ret != Z_STREAM_END); /* clean up and return */ (void)inflateEnd(&strm); if (ret != Z_STREAM_END) XMP_Throw("zlib error ",kXMPErr_ExternalFailure); break; } case 0x0: // no compression - read directly into the right place { wasCompressed = false; XMP_Enforce( LFA_Read ( file, (char*)packetStr, sizeUncompressed, kLFA_RequireAll ) ); break; } default: { XMP_Throw("illegal zip compression method (not none, not flate)",kXMPErr_BadFileFormat); } } this->containsXMP = true; // do this last, after all possible failure/execptions } // ================================================================================================= // UCF_MetaHandler::ProcessXMP // ============================ void UCF_MetaHandler::ProcessXMP() { // we have no legacy, CacheFileData did all that was needed // ==> default implementation is fine XMPFileHandler::ProcessXMP(); } // ================================================================================================= // UCF_MetaHandler::UpdateFile // ============================= // TODO: xmp packet with data descriptor void UCF_MetaHandler::UpdateFile ( bool doSafeUpdate ) { //sanity XMP_Enforce( (x!=0) == (cdx!=0) ); if (!cdx) xmpCDHeader.setXMPFilename(); //if new, set filename (impacts length, thus before computation) if ( ! this->needsUpdate ) return; // *** if ( doSafeUpdate ) XMP_Throw ( "UCF_MetaHandler::UpdateFile: Safe update not supported", kXMPErr_Unavailable ); LFA_FileRef file = this->parent->fileRef; // final may mean compressed or not, whatever is to-be-embedded uncomprPacketStr = xmpPacket.c_str(); uncomprPacketLen = (XMP_StringLen) xmpPacket.size(); finalPacketStr = uncomprPacketStr; // will be overriden if compressedXMP==true finalPacketLen = uncomprPacketLen; std::string compressedPacket; // moot if non-compressed, still here for scope reasons (having to keep a .c_str() alive) if ( !x ) // if new XMP... { xmpFileHeader.clear(); xmpFileHeader.setXMPFilename(); // ZIP64 TODO: extra Fields, impact on cdxl2 and x2l } //////////////////////////////////////////////////////////////////////////////////////////////// // COMPRESSION DECISION // for large files compression is bad: // a) size of XMP becomes irrelevant on large files ==> why worry over compression ? // b) more importantly: no such thing as padding possible, compression == ever changing sizes // => never in-place rewrites, *ugly* performance impact on large files inPlacePossible = false; //assume for now if ( !x ) // no prior XMP? -> decide on filesize compressXMP = ( fl > 1024*50 /* 100 kB */ ) ? false : true; else compressXMP = wasCompressed; // don't change a thing if ( !wasCompressed && !compressXMP && ( GetUns32LE( &xmpFileHeader.fields[FileHeader::o_sizeUncompressed] ) == uncomprPacketLen )) { inPlacePossible = true; } //////////////////////////////////////////////////////////////////////////////////////////////// // COMPRESS XMP if ( compressXMP ) { const unsigned int CHUNK = 16384; int ret, flush; unsigned int have; z_stream strm; unsigned char out[CHUNK]; /* allocate deflate state */ strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; if ( deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -MAX_WBITS, 8 /*memlevel*/, Z_DEFAULT_STRATEGY) ) XMP_Throw("zlib error ",kXMPErr_ExternalFailure); //write at once, since we got it in mem anyway: strm.avail_in = uncomprPacketLen; flush = Z_FINISH; // that's all, folks strm.next_in = (unsigned char*) uncomprPacketStr; do { strm.avail_out = CHUNK; strm.next_out = out; ret = deflate(&strm, flush); /* no bad return value (!=0 acceptable) */ XMP_Enforce(ret != Z_STREAM_ERROR); /* state not clobbered */ //fwrite(buffer,size,count,file) have = CHUNK - strm.avail_out; compressedPacket.append( (const char*) out, have); } while (strm.avail_out == 0); if (ret != Z_STREAM_END) XMP_Throw("zlib stream incomplete ",kXMPErr_ExternalFailure); XMP_Enforce(strm.avail_in == 0); // all input will be used (void)deflateEnd(&strm); //clean up (do prior to checks) finalPacketStr = compressedPacket.c_str(); finalPacketLen = (XMP_StringLen)compressedPacket.size(); } PutUns32LE ( uncomprPacketLen, &xmpFileHeader.fields[FileHeader::o_sizeUncompressed] ); PutUns32LE ( finalPacketLen, &xmpFileHeader.fields[FileHeader::o_sizeCompressed] ); PutUns16LE ( compressXMP ? 8:0, &xmpFileHeader.fields[FileHeader::o_compression] ); //////////////////////////////////////////////////////////////////////////////////////////////// // CRC (always of uncompressed data) XMP_Uns32 crc = crc32( 0 , (Bytef*)uncomprPacketStr, uncomprPacketLen ); PutUns32LE( crc, &xmpFileHeader.fields[FileHeader::o_crc32] ); //////////////////////////////////////////////////////////////////////////////////////////////// // TIME calculation for timestamp // will be applied both to xmp content file and CD header XMP_Uns16 lastModTime, lastModDate; XMP_DateTime time; SXMPUtils::CurrentDateTime( &time ); if ( (time.year - 1900) < 80) { lastModTime = 0; // 1.1.1980 00:00h lastModDate = 21; } // typedef unsigned short ush; //2 bytes lastModDate = (XMP_Uns16) (((time.year) - 1980 ) << 9 | ((time.month) << 5) | time.day); lastModTime = ((XMP_Uns16)time.hour << 11) | ((XMP_Uns16)time.minute << 5) | ((XMP_Uns16)time.second >> 1); PutUns16LE ( lastModDate, &xmpFileHeader.fields[FileHeader::o_lastmodDate] ); PutUns16LE ( lastModTime, &xmpFileHeader.fields[FileHeader::o_lastmodTime] ); //////////////////////////////////////////////////////////////////////////////////////////////// // adjustments depending on 4GB Border, // decisions on in-place update // so far only z, zl have been determined // Zip64 related assurances, see (15) XMP_Enforce(!z2); XMP_Enforce(h+hl == fl ); //////////////////////////////////////////////////////////////////////////////////////////////// // COMPUTE MISSING VARIABLES // A - based on xmp existence // // already known: x, xl, cd // most left side vars, // // finalPacketStr, finalPacketLen if ( x ) // previous xmp? { al = x; b = x + xl; bl = cd - b; } else { al = cd; //b,bl left at zero } if ( inPlacePossible ) { // leave xmp right after A x2 = al; x2l = xmpFileHeader.sizeTotalCF(); //COULDDO: assert (x2l == xl) if (b) b2 = x2 + x2l; // b follows x as last content part cd2 = b2 + bl; // CD follows B2 } else { // move xmp to end if (b) b2 = al; // b follows // x follows as last content part (B existing or not) x2 = al + bl; x2l = xmpFileHeader.sizeTotalCF(); cd2 = x2 + x2l; // CD follows X } /// create new XMP header /////////////////////////////////////////////////// // written into actual fields + generation of extraField at .write()-time... // however has impact on .size() computation -- thus enter before cdx2l computation xmpCDHeader.sizeUncompressed = uncomprPacketLen; xmpCDHeader.sizeCompressed = finalPacketLen; xmpCDHeader.offsetLocalHeader = x2; PutUns32LE ( crc, &xmpCDHeader.fields[CDFileHeader::o_crc32] ); PutUns16LE ( compressXMP ? 8:0, &xmpCDHeader.fields[CDFileHeader::o_compression] ); PutUns16LE ( lastModDate, &xmpCDHeader.fields[CDFileHeader::o_lastmodDate] ); PutUns16LE ( lastModTime, &xmpCDHeader.fields[CDFileHeader::o_lastmodTime] ); // for if ( inPlacePossible ) { cdx2 = cdx; //same, same writeOut( file, file, false, true ); return; } //////////////////////////////////////////////////////////////////////// // temporarily store (those few, small) trailing things that might not survive the move around: LFA_Seek(file, cd, SEEK_SET); // seek to central directory cdEntries.clear(); //mac precaution ////////////////////////////////////////////////////////////////////////////// // parse headers // * stick together output header list cd2l = 0; //sum up below CDFileHeader tempHeader; for( XMP_Uns16 pos=1 ; pos <= numCF ; pos++ ) { if ( (cdx) && (LFA_Tell( file ) == cdx) ) { tempHeader.read( file ); //read, even if not use, to advance file pointer } else { tempHeader.read( file ); // adjust b2 offset for files that were behind the xmp: // may (if xmp moved to back) // or may not (inPlace Update) make a difference if ( (x) && ( tempHeader.offsetLocalHeader > x) ) // if xmp existed before and this was a file behind it tempHeader.offsetLocalHeader += b2 - b; cd2l += tempHeader.size(); // prior offset change might have impact cdEntries.push_back( tempHeader ); } } //push in XMP packet as last one (new or not) cdEntries.push_back( xmpCDHeader ); cdx2l = xmpCDHeader.size(); cd2l += cdx2l; // true, no matter which order //OLD cd2l = : cdl - cdxl + cdx2l; // (NB: cdxl might be 0) numCF2 = numCF + ( (cdx)?0:1 ); //xmp packet for the first time? -> add one more CF XMP_Validate( numCF2 > 0, "no content files", kXMPErr_BadFileFormat ); XMP_Validate( numCF2 <= 0xFFFE, "max number of 0xFFFE entries reached", kXMPErr_BadFileFormat ); cdx2 = cd2 + cd2l - cdx2l; // xmp content entry comes last (since beyond inPlace Update) // zip64 decision if ( ( cd2 + cd2l + hl ) > 0xffffffff ) // predict non-zip size ==> do we need a zip-64? { z2 = cd2 + cd2l; z2l = Zip64EndOfDirectory::FIXED_SIZE + Zip64Locator::TOTAL_SIZE; } // header and output length, h2 = cd2 + cd2l + z2l; // (z2l might be 0) f2l = h2 + hl; //////////////////////////////////////////////////////////////////////////////////////////////// // read H (endOfCD), correct offset LFA_Seek(file, h, SEEK_SET); endOfCD.read( file ); if ( cd2 <= 0xffffffff ) PutUns32LE( (XMP_Int32) cd2 , &endOfCD.fields[ endOfCD.o_CdOffset ] ); else PutUns32LE( 0xffffffff , &endOfCD.fields[ endOfCD.o_CdOffset ] ); PutUns16LE( numCF2, &endOfCD.fields[ endOfCD.o_CdNumEntriesDisk ] ); PutUns16LE( numCF2, &endOfCD.fields[ endOfCD.o_CdNumEntriesTotal ] ); XMP_Enforce( cd2l <= 0xffffffff ); // _size_ of directory itself certainly under 4GB PutUns32LE( (XMP_Uns32)cd2l, &endOfCD.fields[ endOfCD.o_CdSize ] ); //////////////////////////////////////////////////////////////////////////////////////////////// // MOVING writeOut( file, file, false, false ); this->needsUpdate = false; //do last for safety reasons } // UCF_MetaHandler::UpdateFile // ================================================================================================= // UCF_MetaHandler::WriteFile // ============================ void UCF_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { IgnoreParam ( sourcePath ); XMP_Throw ( "UCF_MetaHandler::WriteFile: TO BE IMPLEMENTED", kXMPErr_Unimplemented ); } // ================================================================================================= // own approach to unify Update and WriteFile: // ============================ void UCF_MetaHandler::writeOut( LFA_FileRef sourceFile, LFA_FileRef targetFile, bool isRewrite, bool isInPlace) { // isInPlace is only possible when it's not a complete rewrite XMP_Enforce( (!isInPlace) || (!isRewrite) ); ///////////////////////////////////////////////////////// // A if (isRewrite) //move over A block LFA_Move( sourceFile , 0 , targetFile, 0 , al ); ///////////////////////////////////////////////////////// // B / X (not necessarily in this order) if ( !isInPlace ) // B does not change a thing (important optimization) { LFA_Seek( targetFile , b2 , SEEK_SET ); LFA_Move( sourceFile , b , targetFile, b2 , bl ); } LFA_Seek( targetFile , x2 , SEEK_SET ); xmpFileHeader.write( targetFile ); LFA_Write( targetFile, finalPacketStr, finalPacketLen ); //TODO: cover reverse case / inplace ... ///////////////////////////////////////////////////////// // CD // No Seek here on purpose. // This assert must still be valid // if inPlace, the only thing that needs still correction is the CRC in CDX: if ( isInPlace ) { XMP_Uns32 crc; //TEMP, not actually needed crc = GetUns32LE( &xmpFileHeader.fields[FileHeader::o_crc32] ); // go there, // do the job (take value directly from (non-CD-)fileheader), // end of story. LFA_Seek( targetFile , cdx2 + CDFileHeader::o_crc32 , SEEK_SET ); LFA_Write( targetFile, &xmpFileHeader.fields[FileHeader::o_crc32], 4); return; } LFA_Seek( targetFile , cd2 , SEEK_SET ); std::vector::iterator iter; int tmptmp=1; for( iter = cdEntries.begin(); iter != cdEntries.end(); iter++ ) { CDFileHeader* p=&(*iter); XMP_Int64 before = LFA_Tell(targetFile); p->write( targetFile ); XMP_Int64 total = LFA_Tell(targetFile) - before; XMP_Int64 tmpSize = p->size(); tmptmp++; } ///////////////////////////////////////////////////////// // Z if ( z2 ) // yes, that simple { XMP_Assert( z2 == LFA_Tell(targetFile)); LFA_Seek( targetFile , z2 , SEEK_SET ); //no use in copying, always construct from scratch Zip64EndOfDirectory zip64EndOfDirectory( cd2, cd2l, numCF2) ; Zip64Locator zip64Locator( z2 ); zip64EndOfDirectory.write( targetFile ); zip64Locator.write( targetFile ); } ///////////////////////////////////////////////////////// // H XMP_Assert( h2 == LFA_Tell(targetFile)); endOfCD.write( targetFile ); XMP_Assert( f2l == LFA_Tell(targetFile)); if ( f2l< fl) LFA_Truncate(targetFile,f2l); //file may have shrunk } exempi-2.2.1/source/XMPFiles/FileHandlers/MP3_Handler.cpp0000664000175000017500000006304112150230672017757 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "MP3_Handler.hpp" // ================================================================================================= /// \file MP3_Handler.cpp /// \brief MP3 handler class. // ================================================================================================= // ================================================================================================= // Helper structs and private routines // ==================== struct ReconProps { const char* frameID; const char* ns; const char* prop; }; const static XMP_Uns32 XMP_FRAME_ID = 0x50524956; const static ReconProps reconProps[] = { { "TPE1", kXMP_NS_DM, "artist" }, { "TALB", kXMP_NS_DM, "album" }, { "TRCK", kXMP_NS_DM, "trackNumber" }, // exceptions that need attention: { "TCON", kXMP_NS_DM, "genre" }, // genres might be numeric { "TIT2", kXMP_NS_DC, "title" }, // ["x-default"] language alternatives { "COMM", kXMP_NS_DM, "logComment" }, // two distinct strings, language alternative { "TYER", kXMP_NS_XMP, "CreateDate" }, // Year (YYYY) Deprecated since 2.4 { "TDAT", kXMP_NS_XMP, "CreateDate" }, // Date (DDMM) Deprecated since 2.4 { "TIME", kXMP_NS_XMP, "CreateDate" }, // Time (HHMM) Deprecated since 2.4 { "TDRC", kXMP_NS_XMP, "CreateDate" }, // assemble date/time v2.4 // new reconciliations introduced in Version 5 { "TCMP", kXMP_NS_DM, "partOfCompilation" }, // presence/absence of TCMP frame dedides { "USLT", kXMP_NS_DM, "lyrics" }, { "TCOM", kXMP_NS_DM, "composer" }, { "TPOS", kXMP_NS_DM, "discNumber" }, // * a text field! might contain "/" { "TCOP", kXMP_NS_DC, "rights" }, // ["x-default"] language alternatives { "TPE4", kXMP_NS_DM, "engineer" }, { "WCOP", kXMP_NS_XMP_Rights , "WebStatement" }, { 0, 0, 0 } // must be last as a sentinel }; // ================================================================================================= // MP3_MetaHandlerCTor // ==================== XMPFileHandler * MP3_MetaHandlerCTor ( XMPFiles * parent ) { return new MP3_MetaHandler ( parent ); } // ================================================================================================= // MP3_CheckFormat // =============== // For MP3 we check parts .... See the MP3 spec for offset info. bool MP3_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef file, XMPFiles * parent ) { IgnoreParam(filePath); IgnoreParam(parent); //supress warnings XMP_Assert ( format == kXMP_MP3File ); //standard assert LFA_Rewind( file ); XMP_Uns8 header[3]; LFA_Read( file, header, 3, true ); if ( !CheckBytes( &header[0], "ID3", 3 )) return (parent->format == kXMP_MP3File); // No ID3 signature -> depend on first call hint. XMP_Uns8 major = LFA_ReadUns8( file ); XMP_Uns8 minor = LFA_ReadUns8( file ); if ( (major<3 || major>4) || (minor == 0xFF) ) return false; // only support IDv2.3 and ID3v2.4, minor must not be 0xFF XMP_Uns8 flags = LFA_ReadUns8( file ); //TODO if ( flags & 0x10 ) XMP_Throw("no support for MP3 with footer",kXMPErr_Unimplemented); //no support for MP3 with footer if ( flags & 0x80 ) return false; //no support for unsynchronized MP3 (as before, also see [1219125]) if ( flags & 0x0F ) XMP_Throw("illegal header lower bits",kXMPErr_Unimplemented); XMP_Uns32 size = LFA_ReadUns32_BE( file ); if ( size & 0x80808080 ) return false; //if any bit survives -> not a valid synchsafe 32 bit integer return true; } // MP3_CheckFormat // ================================================================================================= // MP3_MetaHandler::MP3_MetaHandler // ================================ MP3_MetaHandler::MP3_MetaHandler ( XMPFiles * _parent ) { this->parent = _parent; this->handlerFlags = kMP3_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; } // ================================================================================================= // MP3_MetaHandler::~MP3_MetaHandler // ================================= MP3_MetaHandler::~MP3_MetaHandler() { // free frames ID3v2Frame* curFrame; while( !this->framesVector.empty() ) { curFrame = this->framesVector.back(); delete curFrame; framesVector.pop_back(); } } // ================================================================================================= // MP3_MetaHandler::CacheFileData // ============================== void MP3_MetaHandler::CacheFileData() { //*** abort procedures this->containsXMP = false; //assume no XMP for now LFA_FileRef file = this->parent->fileRef; XMP_PacketInfo &packetInfo = this->packetInfo; LFA_Rewind(file); hasID3Tag = id3Header.read( file ); majorVersion = id3Header.fields[ID3Header::o_version_major]; minorVersion = id3Header.fields[ID3Header::o_version_minor]; hasExtHeader = (0 != ( 0x40 & id3Header.fields[ID3Header::o_flags])); //'naturally' false if no ID3Tag hasFooter = ( 0 != ( 0x10 & id3Header.fields[ID3Header::o_flags])); //'naturally' false if no ID3Tag // stored size is w/o initial header (thus adding 10) // + but extended header (if existing) // + padding + frames after unsynchronisation (?) // (if no ID3 tag existing, constructed default correctly sets size to 10.) oldTagSize = 10 + synchToInt32(GetUns32BE( &id3Header.fields[ID3Header::o_size] )); if (hasExtHeader) { extHeaderSize = synchToInt32( LFA_ReadInt32_BE( file)); XMP_Uns8 extHeaderNumFlagBytes = LFA_ReadUns8( file ); // v2.3 doesn't include the size, while v2.4 does if ( majorVersion < 4 ) extHeaderSize += 4; XMP_Validate( extHeaderSize >= 6, "extHeader size too small", kXMPErr_BadFileFormat ); bool ok; LFA_Seek(file, extHeaderSize - 6, SEEK_CUR , &ok); XMP_Assert(ok); } else { extHeaderSize = 0; // := there is no such header. } this->framesVector.clear(); //mac precaution ID3v2Frame* curFrame = 0; // reusable //////////////////////////////////////////////////// // read frames while ( LFA_Tell(file) < oldTagSize ) { curFrame = new ID3v2Frame(); try { XMP_Int64 frameSize = curFrame->read( file, majorVersion ); if (frameSize == 0) // no more frames coming => proceed to padding { delete curFrame; // ..since not becoming part of vector for latter delete. break; // not a throw. There's nothing wrong with padding. } this->containsXMP = true; } catch( XMP_Error e) { delete curFrame; XMP_Throw( e.GetErrMsg(), e.GetID()); // rethrow } // these are both pointer assignments, no (copy) construction // (MemLeak Note: for all things pushed, memory cleanup is taken care of in destructor.) this->framesVector.push_back( curFrame ); //remember XMP-Frame, if it occurs: if ( CheckBytes( &curFrame->fields[ID3v2Frame::o_id], "PRIV", 4 )) if( curFrame->contentSize > 8 ) // to avoid adress violation on very small non-XMP PRIV frames if( CheckBytes( &curFrame->content[0], "XMP\0", 4 )) { // be sure that this is the first packet (all else would be illegal format) XMP_Validate( framesMap[ XMP_FRAME_ID] == 0, "two XMP packets in one file", kXMPErr_BadFileFormat ); //add this to map, needed on reconciliation framesMap[ XMP_FRAME_ID ] = curFrame; this->packetInfo.length = curFrame->contentSize - 4; // content minus "XMP\0" this->packetInfo.offset = ( LFA_Tell(file) - this->packetInfo.length ); this->xmpPacket.erase(); //safety this->xmpPacket.assign( &curFrame->content[4], curFrame->contentSize - 4 ); this->containsXMP = true; // do this last, after all possible failure } // No space for another frame? => assume into ID3v2.4 padding. if ( LFA_Tell(file) + 10 >= oldTagSize ) break; } //////////////////////////////////////////////////// // padding oldPadding = oldTagSize - LFA_Tell( file ); oldFramesSize = oldTagSize - 10 - oldPadding; XMP_Validate( oldPadding >= 0, "illegal oldTagSize or padding value", kXMPErr_BadFileFormat ); for ( XMP_Int64 i = oldPadding; i > 0;) { if ( i >= 8 ) // worthwhile optimization { if ( LFA_ReadInt64_BE(file) != 0 ) XMP_Throw ( "padding not nulled out.", kXMPErr_BadFileFormat ); i -= 8; continue; } if ( LFA_ReadUns8(file) != 0) XMP_Throw ( "padding(2) not nulled out.", kXMPErr_BadFileFormat ); i--; } //// read ID3v1 tag if ( ! this->containsXMP ) // all else has priority { this->containsXMP = id3v1Tag.read( file, &this->xmpObj ); } } // MP3_MetaHandler::CacheFileData // ================================================================================================= // MP3_MetaHandler::ProcessXMP // =========================== // // Process the raw XMP and legacy metadata that was previously cached. void MP3_MetaHandler::ProcessXMP() { // Process the XMP packet. if ( ! this->xmpPacket.empty() ) { XMP_Assert ( this->containsXMP ); XMP_StringPtr packetStr = this->xmpPacket.c_str(); XMP_StringLen packetLen = (XMP_StringLen) this->xmpPacket.size(); this->xmpObj.ParseFromBuffer ( packetStr, packetLen ); this->processedXMP = true; } /////////////////////////////////////////////////////////////////// // assumptions on presence-absence "flag tags" // ( unless no xmp whatsoever present ) if ( ! this->xmpPacket.empty() ) { this->xmpObj.SetProperty( kXMP_NS_DM, "partOfCompilation", "false" ); } //////////////////////////////////////////////////////////////////// // import of legacy properties ID3v2Frame* curFrame; XMP_Bool hasTDRC = false; XMP_DateTime newDateTime; if (this->hasID3Tag) // otherwise pretty pointless... for (int r=0; reconProps[r].frameID != 0; r++) { //get the frame ID to look for XMP_Uns32 frameID = GetUns32BE( reconProps[r].frameID ); // deal with each such frame in the frameVector // (since there might be several, some of them not applicable, i.e. COMM) for ( vector::iterator it = framesVector.begin(); it!=framesVector.end(); ++it) { curFrame = *it; if (frameID != curFrame->id) // nothing applicable. Next! continue; // go deal with it! // get the property std::string utf8string; bool result = curFrame->getFrameValue(majorVersion, frameID, &utf8string); if (! result) continue; //ignore but preserve this frame (i.e. not applicable COMM frame) ////////////////////////////////////////////////////////////////////////////////// // if we come as far as here, it's proven that there's a relevant XMP property this->containsXMP = true; ID3_Support::ID3v2Frame* t = framesMap[ frameID ]; if ( t != 0 ) // an (earlier, relevant) frame? t->active = false; // add this to map (needed on reconciliation) // note: above code reaches, that COMM/USLT frames // only then reach this map, if they are 'eng'(lish) // multiple occurences indeed leads to last one survives // ( in this map, all survive in the file ) framesMap[ frameID ] = curFrame; // now write away as needed; // merely based on existence, relevant even if empty: if ( frameID == 0x54434D50) // TCMP if exists: part of compilation { this->xmpObj.SetProperty( kXMP_NS_DM, "partOfCompilation", "true" ); } else if ( ! utf8string.empty() ) switch( frameID ) { case 0x54495432: // TIT2 -> title["x-default"] case 0x54434F50: // TCOP -> rights["x-default"] this->xmpObj.SetLocalizedText( reconProps[r].ns , reconProps[r].prop,"" , "x-default" , utf8string ); break; case 0x54434F4E: // TCON -> genre ( might be numeric string. prior to 2.3 a one-byte numeric value? ) { XMP_Int32 pos = 0; // going through input string if ( utf8string[pos] == '(' ) { // number in brackets? pos++; XMP_Uns8 iGenre = (XMP_Uns8) atoi( &utf8string.c_str()[1] ); if ( (iGenre > 0) && (iGenre < 127) ) { utf8string.assign( Genres[iGenre] ); } else { utf8string.assign( Genres[12] ); // "Other" } } else { // Text, let's "try" to find it anyway (for best upper/lower casing) int i; const char* genreCString = utf8string.c_str(); for ( i=0; i < 127; ++i ) { if ( (strlen( genreCString ) == strlen(Genres[i])) && //fixing buggy stricmp behaviour on PPC (stricmp( genreCString, Genres[i] ) == 0 )) { utf8string.assign( Genres[i] ); // found, let's use the one in the list break; } } // otherwise (if for-loop runs through): leave as is } // write out property (derived or direct, but certainly non-numeric) this->xmpObj.SetProperty( reconProps[r].ns, reconProps[r].prop, utf8string ); } break; case 0x54594552: // TYER -> xmp:CreateDate.year { try { // Don't let wrong dates in id3 stop import. if ( !hasTDRC ) { newDateTime.year = SXMPUtils::ConvertToInt( utf8string ); newDateTime.hasDate = true; } } catch ( ... ) { // Do nothing, let other imports proceed. } break; } case 0x54444154: //TDAT -> xmp:CreateDate.month and day { try { // Don't let wrong dates in id3 stop import. // only if no TDRC has been found before //&& must have the format DDMM if ( !hasTDRC && utf8string.length() == 4 ) { newDateTime.day = SXMPUtils::ConvertToInt(utf8string.substr(0,2)); newDateTime.month = SXMPUtils::ConvertToInt( utf8string.substr(2,2)); newDateTime.hasDate = true; } } catch ( ... ) { // Do nothing, let other imports proceed. } break; } case 0x54494D45: //TIME -> xmp:CreateDate.hours and minutes { try { // Don't let wrong dates in id3 stop import. // only if no TDRC has been found before // && must have the format HHMM if ( !hasTDRC && utf8string.length() == 4 ) { newDateTime.hour = SXMPUtils::ConvertToInt(utf8string.substr(0,2)); newDateTime.minute = SXMPUtils::ConvertToInt( utf8string.substr(2,2)); newDateTime.hasTime = true; } } catch ( ... ) { // Do nothing, let other imports proceed. } break; } case 0x54445243: // TDRC -> xmp:CreateDate //id3 v2.4 { try { // Don't let wrong dates in id3 stop import. hasTDRC = true; // This always wins over TYER, TDAT and TIME SXMPUtils::ConvertToDate( utf8string, &newDateTime ); } catch ( ... ) { // Do nothing, let other imports proceed. } break; } default: // NB: COMM/USLT need no special fork regarding language alternatives/multiple occurence. // relevant code forks are in ID3_Support::getFrameValue() this->xmpObj.SetProperty( reconProps[r].ns, reconProps[r].prop, utf8string ); break; }//switch } //for iterator }//for reconProps // import DateTime XMP_DateTime oldDateTime; xmpObj.GetProperty_Date( kXMP_NS_XMP, "CreateDate", &oldDateTime, 0 ); // NOTE: no further validation nessesary the function "SetProperty_Date" will care about validating date and time // any exception will be caught and block import try { // invalid year will be catched and blocks import XMP_Validate( (newDateTime.year > 0 && newDateTime.year < 9999), "", kXMPErr_BadParam ); // 2. if year has changed --> everything (date/time) has changed --> overwrite old DateTime with new DateTime if ( ( newDateTime.year != oldDateTime.year ) || // year has changed? // or has same year but new day/month (checking existance month indicates both (day and month) in our case) (( newDateTime.month != 0 ) && ( newDateTime.day != oldDateTime.day || newDateTime.month != oldDateTime.month )) || // or has same year and same date but different time ( newDateTime.hasTime && ( newDateTime.hour != oldDateTime.minute || newDateTime.hour != oldDateTime.minute )) ) { this->xmpObj.SetProperty_Date( kXMP_NS_XMP, "CreateDate", newDateTime ); } // ..else: keep old dateTime to don't loose data } catch ( ... ) { // Dont import invalid dates from ID3 } // very important to avoid multiple runs! (in which case I'd need to clean certain // fields (i.e. regarding ->active setting) this->processedXMP = true; } // MP3_MetaHandler::ProcessXMP // ================================================================================================= // MP3_MetaHandler::UpdateFile // =========================== void MP3_MetaHandler::UpdateFile ( bool doSafeUpdate ) { if ( doSafeUpdate ) XMP_Throw ( "UCF_MetaHandler::UpdateFile: Safe update not supported", kXMPErr_Unavailable ); LFA_FileRef file ( this->parent->fileRef ); // leave 2.3 resp. 2.4 header, since we want to let alone // and don't know enough about the encoding of unrelated frames... XMP_Assert( this->containsXMP ); tagIsDirty = false; mustShift = false; // write out native properties: // * update existing ones // * create new frames as needed // * delete frames if property is gone! // see what there is to do for us: // RECON LOOP START for (int r=0; reconProps[r].frameID != 0; r++) { std::string value; bool needDescriptor = false; bool need16LE = true; bool needEncodingByte = true; XMP_Uns32 frameID = GetUns32BE( reconProps[r].frameID ); // the would-be frame ID3v2Frame* frame = framesMap[ frameID ]; // the actual frame (if already existing) // get XMP property // * honour specific exceptions // * leave value empty() if it doesn't exist ==> frame must be delete/not created switch( frameID ) { case 0x54434D50: // TCMP if exists: part of compilation need16LE = false; if ( xmpObj.GetProperty( kXMP_NS_DM, "partOfCompilation", &value, 0 ) && ( 0 == stricmp( value.c_str(), "true" ) )) value = "1"; // set a TCMP frame of value 1 else value.erase(); // delete/prevent creation of frame break; case 0x54495432: // TIT2 -> title["x-default"] case 0x54434F50: // TCOP -> rights["x-default"] if (! xmpObj.GetLocalizedText( reconProps[r].ns, reconProps[r].prop, "", "x-default", 0, &value, 0 )) //jaja, side effect. value.erase(); // if not, erase string. break; case 0x54434F4E: // TCON -> genre { if (! xmpObj.GetProperty( reconProps[r].ns, reconProps[r].prop, &value, 0 )) { // nothing found? -> Erase string. (Leads to Unset below) value.erase(); break; } // genre: we need to get the number back, if possible XMP_Int16 iFound = -1; // flag as "not found" for ( int i=0; i < 127; ++i ) { if ( (value.size() == strlen(Genres[i])) && (stricmp( value.c_str(), Genres[i] ) == 0) ) //fixing stricmp buggy on PPC { iFound = i; // Found break; } } if ( iFound == -1 ) // not found known numeric genre? break; // stick with the literal value (also for v2.3, since this is common practice!) need16LE = false; // no unicode need for (##) char strGenre[64]; snprintf ( strGenre, sizeof(strGenre), "(%d)", iFound ); // AUDIT: Using sizeof(strGenre) is safe. value.assign(strGenre); } break; case 0x434F4D4D: // COMM case 0x55534C54: // USLT, both need descriptor. needDescriptor = true; if (! xmpObj.GetProperty( reconProps[r].ns, reconProps[r].prop, &value, 0 )) value.erase(); break; case 0x54594552: //TYER case 0x54444154: //TDAT case 0x54494D45: //TIME { if ( majorVersion <= 3 ) // TYER, TIME and TDAT depricated since v. 2.4 -> else use TDRC { XMP_DateTime dateTime; if (! xmpObj.GetProperty_Date( reconProps[r].ns, reconProps[r].prop, &dateTime, 0 )) { // nothing found? -> Erase string. (Leads to Unset below) value.erase(); break; } // TYER if ( frameID == 0x54594552 ) { XMP_Validate( dateTime.year <= 9999 && dateTime.year > 0 , "Year is out of range", kXMPErr_BadParam); // get only Year! SXMPUtils::ConvertFromInt( dateTime.year, "", &value ); break; } // TDAT else if ( frameID == 0x54444154 && dateTime.hasDate ) // date validation made by "GetProperty_Date" { std::string day, month; SXMPUtils::ConvertFromInt( dateTime.day, "", &day ); SXMPUtils::ConvertFromInt( dateTime.month, "", &month ); if ( dateTime.day < 10 ) value = "0"; value += day; if ( dateTime.month < 10 ) value += "0"; value += month; break; } // TIME else if ( frameID == 0x54494D45 && dateTime.hasTime ) // time validation made by "GetProperty_Date" ) { std::string hour, minute; SXMPUtils::ConvertFromInt( dateTime.hour, "", &hour ); SXMPUtils::ConvertFromInt( dateTime.minute, "", &minute ); if ( dateTime.hour < 10 ) value = "0"; value += hour; if ( dateTime.minute < 10 ) value += "0"; value += minute; break; } else { value.erase(); break; } } else // v.2.4 --> delete TYER,TIME or TDAT & write into TDRC { value.erase(); break; } } case 0x54445243: //TDRC (only v2.4) { // only export for id3 > v2.4 if ( majorVersion > 3 ) // (only v2.4) { if (! xmpObj.GetProperty( reconProps[r].ns, reconProps[r].prop, &value, 0 )) value.erase(); } break; } break; case 0x57434F50: //WCOP needEncodingByte = false; need16LE = false; if (! xmpObj.GetProperty( reconProps[r].ns, reconProps[r].prop, &value, 0 )) value.erase(); // if not, erase string break; case 0x5452434B: // TRCK case 0x54504F53: // TPOS need16LE = false; // no break, go on: default: if (! xmpObj.GetProperty( reconProps[r].ns, reconProps[r].prop, &value, 0 )) value.erase(); // if not, erase string break; } // [XMP exist] x [frame exist] => four cases: // 1/4) nothing before, nothing now if ( value.empty() && (frame==0)) continue; // nothing to do // all else means there will be rewrite work to do: tagIsDirty = true; // 2/4) value before, now gone: if ( value.empty() && (frame!=0)) { frame->active = false; //mark for non-use continue; } // 3/4) no old value, create new value if ( frame==0) { ID3v2Frame* newFrame=new ID3v2Frame( frameID ); newFrame->setFrameValue( value, needDescriptor, need16LE, false, needEncodingByte ); //always write as utf16-le incl. BOM framesVector.push_back( newFrame ); framesMap[ frameID ] = newFrame; continue; } // 4/4) change existing value else // resp. change frame { frame->setFrameValue( value, needDescriptor, need16LE, false, needEncodingByte ); } } // RECON LOOP END ///////////////////////////////////////////////////////////////////////////////// // (Re)Build XMP frame: ID3v2Frame* frame = framesMap[ XMP_FRAME_ID ]; if ( frame == 0) { ID3v2Frame* newFrame=new ID3v2Frame( XMP_FRAME_ID ); newFrame->setFrameValue( this->xmpPacket, false, false, true ); framesVector.push_back( newFrame ); framesMap[ XMP_FRAME_ID ] = newFrame; } else frame->setFrameValue( this->xmpPacket, false, false, true ); //////////////////////////////////////////////////////////////////////////////// // Decision making newFramesSize = 0; for ( XMP_Uns32 i=0; i < framesVector.size(); i++) { if (framesVector[i]->active) newFramesSize += (10 + framesVector[i]->contentSize ); } mustShift = ( newFramesSize > (oldTagSize - 10)) || //optimization: If more than 8K can be saved by rewriting the MP3, go do it: ((newFramesSize + 8*1024) < oldTagSize ); if (!mustShift) // fill what we got newTagSize = oldTagSize; else // if need to shift anyway, get some nice 2K padding newTagSize = newFramesSize + 2048 + 10; newPadding = newTagSize -10 - newFramesSize; // shifting needed? -> shift if ( mustShift ) { XMP_Int64 filesize = LFA_Measure( file ); if ( this->hasID3Tag ) LFA_Move( file, oldTagSize, file, newTagSize , filesize - oldTagSize ); //fix [2338569] else LFA_Move( file, 0, file, newTagSize, filesize ); // move entire file up. } // correct size stuff, write out header LFA_Rewind( file ); id3Header.write( file, newTagSize); // write out tags for ( XMP_Uns32 i=0; i < framesVector.size(); i++) { if ( framesVector[i]->active) framesVector[i]->write(file, majorVersion); } // write out padding: for ( XMP_Int64 i = newPadding; i > 0;) { const XMP_Uns64 zero = 0; if ( i >= 8 ) // worthwhile optimization { LFA_Write( file, &zero, 8 ); i -= 8; continue; } LFA_Write( file, &zero, 1 ); i--; } // check end of file for ID3v1 tag XMP_Int64 possibleTruncationPoint = LFA_Seek( file, -128, SEEK_END); bool alreadyHasID3v1 = (LFA_ReadInt32_BE( file ) & 0xFFFFFF00) == 0x54414700; // "TAG" if ( ! alreadyHasID3v1 ) // extend file LFA_Extend( file, LFA_Measure( file ) + 128 ); id3v1Tag.write( file, &this->xmpObj ); this->needsUpdate = false; //do last for safety reasons } // MP3_MetaHandler::UpdateFile // ================================================================================================= // MP3_MetaHandler::WriteFile // ========================== void MP3_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { IgnoreParam(sourceRef); IgnoreParam(sourcePath); XMP_Throw ( "MP3_MetaHandler::WriteFile: Not supported", kXMPErr_Unimplemented ); } // MP3_MetaHandler::WriteFile exempi-2.2.1/source/XMPFiles/FileHandlers/Scanner_Handler.cpp0000664000175000017500000002453612150230672020757 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include #include "XMPScanner.hpp" #include "Scanner_Handler.hpp" using namespace std; // ================================================================================================= /// \file Scanner_Handler.cpp /// \brief File format handler for packet scanning. /// /// This header ... /// // ================================================================================================= struct CandidateInfo { XMP_PacketInfo packetInfo; std::string xmpPacket; SXMPMeta * xmpObj; }; // ================================================================================================= // Scanner_MetaHandlerCTor // ======================= XMPFileHandler * Scanner_MetaHandlerCTor ( XMPFiles * parent ) { return new Scanner_MetaHandler ( parent ); } // Scanner_MetaHandlerCTor // ================================================================================================= // Scanner_MetaHandler::Scanner_MetaHandler // ======================================== Scanner_MetaHandler::Scanner_MetaHandler ( XMPFiles * _parent ) { this->parent = _parent; this->handlerFlags = kScanner_HandlerFlags; } // Scanner_MetaHandler::Scanner_MetaHandler // ================================================================================================= // Scanner_MetaHandler::~Scanner_MetaHandler // ========================================= Scanner_MetaHandler::~Scanner_MetaHandler() { // ! Inherit the base cleanup. } // Scanner_MetaHandler::~Scanner_MetaHandler // ================================================================================================= // PickMainPacket // ============== // // Pick the main packet from the vector of candidates. The rules: // 1. Use the manifest find containment. Prune contained packets. // 2. Use the metadata date to pick the most recent. // 3. if lenient, pick the last writeable packet, or the last if all are read only. static int PickMainPacket ( std::vector& candidates, bool beLenient ) { int pkt; // ! Must be signed. int main = -1; // Assume the worst. XMP_OptionBits options; int metaCount = (int)candidates.size(); if ( metaCount == 0 ) return -1; if ( metaCount == 1 ) return 0; // --------------------------------------------------------------------------------------------- // 1. Look at each packet to see if it has a manifest. If it does, prune all of the others that // this one says it contains. Hopefully we'll end up with just one packet. Note that we have to // mark all the children first, then prune. Pruning on the fly means that we won't do a proper // tree discovery if we prune a parent before a child. This would happen if we happened to visit // a grandparent first. int child; std::vector pruned ( metaCount, false ); for ( pkt = 0; pkt < (int)candidates.size(); ++pkt ) { // First see if this candidate has a manifest. try { std::string voidValue; bool found = candidates[pkt].xmpObj->GetProperty ( kXMP_NS_XMP_MM, "Manifest", &voidValue, &options ); if ( (! found) || (! XMP_PropIsArray ( options )) ) continue; // No manifest, or not an array. } catch ( ... ) { continue; // No manifest. }; // Mark all other candidates that are referred to in this manifest. for ( child = 0; child < (int)candidates.size(); ++child ) { if ( pruned[child] || (child == pkt) ) continue; // Skip already pruned ones and self. } } // Go ahead and actually remove the marked packets. for ( pkt = 0; pkt < (int)candidates.size(); ++pkt ) { if ( pruned[pkt] ) { delete candidates[pkt].xmpObj; candidates[pkt].xmpObj = 0; metaCount -= 1; } } // We're done if the containment pruning left us with 0 or 1 candidate. if ( metaCount == 0 ) { XMP_Throw ( "GetMainPacket/PickMainPacket: Recursive containment", kXMPErr_BadXMP ); } else if ( metaCount == 1 ) { for ( pkt = 0; pkt < (int)candidates.size(); ++pkt ) { if ( candidates[pkt].xmpObj != 0 ) { main = pkt; break; } } } if ( main != -1 ) return main; // We found the main. // ------------------------------------------------------------------------------------------- // 2. Pick the packet with the most recent metadata date. If we are being lenient then missing // dates are older than any real date, and equal dates pick the last packet. If we are being // strict then any missing or equal dates mean we can't pick. XMP_DateTime latestTime, currTime; for ( pkt = 0; pkt < (int)candidates.size(); ++pkt ) { if ( candidates[pkt].xmpObj == 0 ) continue; // This was pruned in the manifest stage. bool haveDate = candidates[pkt].xmpObj->GetProperty_Date ( kXMP_NS_XMP, "MetadataDate", &currTime, &options ); if ( ! haveDate ) { if ( ! beLenient ) return -1; if ( main == -1 ) { main = pkt; memset ( &latestTime, 0, sizeof(latestTime) ); } } else if ( main == -1 ) { main = pkt; latestTime = currTime; } else { int timeOp = SXMPUtils::CompareDateTime ( currTime, latestTime ); if ( timeOp > 0 ) { main = pkt; latestTime = currTime; } else if ( timeOp == 0 ) { if ( ! beLenient ) return -1; main = pkt; latestTime = currTime; } } } if ( main != -1 ) return main; // We found the main. // -------------------------------------------------------------------------------------------- // 3. If we're being lenient, pick the last writeable packet, or the last if all are read only. if ( beLenient ) { for ( pkt = (int)candidates.size()-1; pkt >= 0; --pkt ) { if ( candidates[pkt].xmpObj == 0 ) continue; // This was pruned in the manifest stage. if ( candidates[pkt].packetInfo.writeable ) { main = pkt; break; } } if ( main == -1 ) { for ( pkt = (int)candidates.size()-1; pkt >= 0; --pkt ) { if ( candidates[pkt].xmpObj != 0 ) { main = pkt; break; } } } } return main; } // PickMainPacket // ================================================================================================= // Scanner_MetaHandler::CacheFileData // ================================== void Scanner_MetaHandler::CacheFileData() { LFA_FileRef fileRef = this->parent->fileRef; bool beLenient = XMP_OptionIsClear ( this->parent->openFlags, kXMPFiles_OpenStrictly ); int pkt; XMP_Int64 bufPos; size_t bufLen; SXMPMeta * newMeta; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); std::vector candidates; // ! These have SXMPMeta* fields, don't leak on exceptions. this->containsXMP = false; try { // ------------------------------------------------------ // Scan the entire file to find all of the valid packets. XMP_Int64 fileLen = LFA_Measure ( fileRef ); XMPScanner scanner ( fileLen ); enum { kBufferSize = 64*1024 }; XMP_Uns8 buffer [kBufferSize]; LFA_Seek ( fileRef, 0, SEEK_SET ); for ( bufPos = 0; bufPos < fileLen; bufPos += bufLen ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "Scanner_MetaHandler::LocateXMP - User abort", kXMPErr_UserAbort ); } bufLen = LFA_Read ( fileRef, buffer, kBufferSize ); if ( bufLen == 0 ) XMP_Throw ( "Scanner_MetaHandler::LocateXMP: Read failure", kXMPErr_ExternalFailure ); scanner.Scan ( buffer, bufPos, bufLen ); } // -------------------------------------------------------------- // Parse the valid packet snips, building a vector of candidates. long snipCount = scanner.GetSnipCount(); XMPScanner::SnipInfoVector snips ( snipCount ); scanner.Report ( snips ); for ( pkt = 0; pkt < snipCount; ++pkt ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "Scanner_MetaHandler::LocateXMP - User abort", kXMPErr_UserAbort ); } // Seek to the packet then try to parse it. if ( snips[pkt].fState != XMPScanner::eValidPacketSnip ) continue; LFA_Seek ( fileRef, snips[pkt].fOffset, SEEK_SET ); newMeta = new SXMPMeta(); std::string xmpPacket; xmpPacket.reserve ( (size_t)snips[pkt].fLength ); try { for ( bufPos = 0; bufPos < snips[pkt].fLength; bufPos += bufLen ) { bufLen = kBufferSize; if ( (bufPos + bufLen) > (size_t)snips[pkt].fLength ) bufLen = size_t ( snips[pkt].fLength - bufPos ); (void) LFA_Read ( fileRef, buffer, (XMP_Int32)bufLen, kLFA_RequireAll ); xmpPacket.append ( (const char *)buffer, bufLen ); newMeta->ParseFromBuffer ( (char *)buffer, (XMP_StringLen)bufLen, kXMP_ParseMoreBuffers ); } newMeta->ParseFromBuffer ( 0, 0, kXMP_NoOptions ); } catch ( ... ) { delete newMeta; if ( beLenient ) continue; // Skip if we're being lenient, else rethrow. throw; } // It parsed OK, add it to the array of candidates. candidates.push_back ( CandidateInfo() ); CandidateInfo & newInfo = candidates.back(); newInfo.xmpObj = newMeta; newInfo.xmpPacket.swap ( xmpPacket ); newInfo.packetInfo.offset = snips[pkt].fOffset; newInfo.packetInfo.length = (XMP_Int32)snips[pkt].fLength; newInfo.packetInfo.charForm = snips[pkt].fCharForm; newInfo.packetInfo.writeable = (snips[pkt].fAccess == 'w'); } // ---------------------------------------- // Figure out which packet is the main one. int main = PickMainPacket ( candidates, beLenient ); if ( main != -1 ) { this->packetInfo = candidates[main].packetInfo; this->xmpPacket.swap ( candidates[main].xmpPacket ); this->xmpObj = *candidates[main].xmpObj; this->containsXMP = true; this->processedXMP = true; } for ( pkt = 0; pkt < (int)candidates.size(); ++pkt ) { if ( candidates[pkt].xmpObj != 0 ) delete candidates[pkt].xmpObj; } } catch ( ... ) { // Clean up the SXMPMeta* fields from the vector of candidates. for ( pkt = 0; pkt < (int)candidates.size(); ++pkt ) { if ( candidates[pkt].xmpObj != 0 ) delete candidates[pkt].xmpObj; } throw; } } // Scanner_MetaHandler::CacheFileData // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/JPEG_Handler.hpp0000664000175000017500000000655012150230672020114 00000000000000#ifndef __JPEG_Handler_hpp__ #define __JPEG_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "TIFF_Support.hpp" #include "PSIR_Support.hpp" #include "IPTC_Support.hpp" // ================================================================================================= /// \file JPEG_Handler.hpp /// \brief File format handler for JPEG. /// /// This header ... /// // ================================================================================================= // *** Could derive from Basic_Handler - buffer file tail in a temp file. extern XMPFileHandler * JPEG_MetaHandlerCTor ( XMPFiles * parent ); extern bool JPEG_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); static const XMP_OptionBits kJPEG_HandlerFlags = (kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_CanRewrite | kXMPFiles_PrefersInPlace | kXMPFiles_CanReconcile | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_AllowsSafeUpdate); class JPEG_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessXMP(); void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); struct GUID_32 { // A hack to get an assignment operator for an array. char data [32]; void operator= ( const GUID_32 & in ) { memcpy ( this->data, in.data, sizeof(this->data) ); // AUDIT: Use of sizeof(this->data) is safe. }; bool operator< ( const GUID_32 & right ) const { return (memcmp ( this->data, right.data, sizeof(this->data) ) < 0); }; bool operator== ( const GUID_32 & right ) const { return (memcmp ( this->data, right.data, sizeof(this->data) ) == 0); }; }; JPEG_MetaHandler ( XMPFiles * parent ); virtual ~JPEG_MetaHandler(); private: JPEG_MetaHandler() : exifMgr(0), psirMgr(0), iptcMgr(0), skipReconcile(false) {}; // Hidden on purpose. std::string exifContents; std::string psirContents; TIFF_Manager * exifMgr; // The Exif manager will be created by ProcessTNail or ProcessXMP. PSIR_Manager * psirMgr; // Need to use pointers so we can properly select between read-only and IPTC_Manager * iptcMgr; // read-write modes of usage. bool skipReconcile; // ! Used between UpdateFile and WriteFile. typedef std::map < GUID_32, std::string > ExtendedXMPMap; ExtendedXMPMap extendedXMP; // ! Only contains those with complete data. }; // JPEG_MetaHandler // ================================================================================================= #endif /* __JPEG_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/SWF_Handler.cpp0000664000175000017500000002456112150230672020023 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "SWF_Handler.hpp" #include "SWF_Support.hpp" using namespace std; // ================================================================================================= /// \file SWF_Handler.hpp /// \brief File format handler for SWF. /// /// This handler ... /// // ================================================================================================= // ================================================================================================= // SWF_MetaHandlerCTor // ==================== XMPFileHandler * SWF_MetaHandlerCTor ( XMPFiles * parent ) { return new SWF_MetaHandler ( parent ); } // SWF_MetaHandlerCTor // ================================================================================================= // SWF_CheckFormat // =============== bool SWF_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ) { IgnoreParam(format); IgnoreParam(fileRef); IgnoreParam(parent); XMP_Assert ( format == kXMP_SWFFile ); IOBuffer ioBuf; LFA_Seek ( fileRef, 0, SEEK_SET ); if ( ! CheckFileSpace ( fileRef, &ioBuf, SWF_SIGNATURE_LEN ) ) return false; if ( !(CheckBytes ( ioBuf.ptr, SWF_F_SIGNATURE_DATA, SWF_SIGNATURE_LEN ) || CheckBytes(ioBuf.ptr, SWF_C_SIGNATURE_DATA, SWF_SIGNATURE_LEN)) ) return false; return true; } // SWF_CheckFormat // ================================================================================================= // SWF_MetaHandler::SWF_MetaHandler // ================================== SWF_MetaHandler::SWF_MetaHandler ( XMPFiles * _parent ) { this->parent = _parent; this->handlerFlags = kSWF_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; } // ================================================================================================= // SWF_MetaHandler::~SWF_MetaHandler // =================================== SWF_MetaHandler::~SWF_MetaHandler() { } // ================================================================================================= // SWF_MetaHandler::CacheFileData // =============================== void SWF_MetaHandler::CacheFileData() { this->containsXMP = false; LFA_FileRef fileRef ( this->parent->fileRef ); if ( fileRef == 0) return; SWF_Support::FileInfo fileInfo(fileRef, this->parent->filePath); IO::InputStream * is = NULL; if(fileInfo.IsCompressed()) { XMP_Uns32 fileSize = fileInfo.GetSize(); is = new IO::ZIP::DeflateInputStream(fileRef, fileSize); IO::ZIP::DeflateInputStream * in = dynamic_cast(is); in->Skip(SWF_COMPRESSION_BEGIN, IO::ZIP::DEFLATE_NO); } else { is = new IO::FileInputStream(fileRef); is->Skip(SWF_COMPRESSION_BEGIN); } SWF_Support::TagState tagState; //important flag to stop iteration over all tags when xmp flag within FileAttributeTag isn't set tagState.cachingFile = true; long numTags = SWF_Support::OpenSWF ( is, tagState ); is->Close(); delete is; if ( numTags == 0 ) return; if (tagState.hasXMP && tagState.xmpLen != 0) { this->xmpPacket.assign(tagState.xmpPacket); this->containsXMP = true; } else { // no XMP } } // SWF_MetaHandler::CacheFileData // ================================================================================================= // SWF_MetaHandler::ProcessXMP // ============================ // // Process the raw XMP and legacy metadata that was previously cached. void SWF_MetaHandler::ProcessXMP() { this->processedXMP = true; // Make sure we only come through here once. // Process the XMP packet. if ( ! this->xmpPacket.empty() ) { XMP_Assert ( this->containsXMP ); XMP_StringPtr packetStr = this->xmpPacket.c_str(); XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size(); this->xmpObj.ParseFromBuffer ( packetStr, packetLen ); this->containsXMP = true; } } // SWF_MetaHandler::ProcessXMP // ================================================================================================= // XMPFileHandler::GetSerializeOptions // =================================== // // Override default implementation to ensure omitting xmp wrapper // XMP_OptionBits SWF_MetaHandler::GetSerializeOptions() { return (kXMP_OmitPacketWrapper | kXMP_OmitAllFormatting | kXMP_OmitXMPMetaElement); } // XMPFileHandler::GetSerializeOptions // ================================================================================================= // SWF_MetaHandler::UpdateFile // ============================ void SWF_MetaHandler::UpdateFile ( bool doSafeUpdate ) { bool updated = false; if ( ! this->needsUpdate ) return; if ( doSafeUpdate ) XMP_Throw ( "SWF_MetaHandler::UpdateFile: Safe update not supported", kXMPErr_Unavailable ); LFA_FileRef sourceRef = this->parent->fileRef; std::string sourcePath = this->parent->filePath; SWF_Support::FileInfo fileInfo(sourceRef, sourcePath); if(fileInfo.IsCompressed()) sourceRef = fileInfo.Decompress(); IO::InputStream * is = new IO::FileInputStream(sourceRef); //processing SWF starts after byte SWF_COMPRESSION_BEGIN - currently 8 bytes is->Skip(SWF_COMPRESSION_BEGIN); SWF_Support::TagState tagState; long numTags = SWF_Support::OpenSWF ( is, tagState ); //clean objects is->Close(); delete is; bool foundTag = false; SWF_Support::TailBufferDef tailBuffer; //find end position to measure tail buffer tailBuffer.tailEndPosition = LFA_Seek(sourceRef, 0, SEEK_END); SWF_Support::TagIterator curPos = tagState.tags.begin(); SWF_Support::TagIterator endPos = tagState.tags.end(); for( ;(curPos != endPos) && ! foundTag; ++curPos) { SWF_Support::TagData tag = *curPos; //write XMP Tag at the beginning of the file if(! tagState.hasXMP && ! tagState.hasFileAttrTag) { tailBuffer.tailStartPosition = tag.pos; tailBuffer.writePosition = tag.pos; foundTag = true; } //update existing XMP Tag if(tagState.hasXMP && (tagState.xmpTag.pos == tag.pos)) { ++curPos; SWF_Support::TagData nextTag = *curPos; tailBuffer.tailStartPosition = nextTag.pos; tailBuffer.writePosition = tagState.xmpTag.pos; foundTag = true; } //write XMP Tag after FileAttribute Tag else if(! tagState.hasXMP && (tag.id == SWF_TAG_ID_FILEATTRIBUTES)) { ++curPos; SWF_Support::TagData nextTag = *curPos; tailBuffer.tailStartPosition = nextTag.pos; tailBuffer.writePosition = nextTag.pos; foundTag = true; } } //cache tail of file XMP_Assert(tailBuffer.tailEndPosition > tailBuffer.tailStartPosition); XMP_Uns32 tailSize = tailBuffer.GetTailSize(); XMP_Uns8 * buffer = new XMP_Uns8[tailSize]; SWF_Support::ReadBuffer(sourceRef, tailBuffer.tailStartPosition, tailSize, buffer); //write new XMP packet XMP_StringPtr packetStr = xmpPacket.c_str(); XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size(); LFA_Seek(sourceRef, tailBuffer.writePosition, SEEK_SET); SWF_Support::WriteXMPTag(sourceRef, packetLen, packetStr); // truncate to minimal size LFA_Truncate(sourceRef, LFA_Tell(sourceRef)); //move tail of the file LFA_Write(sourceRef, buffer, tailSize); //cleaning buffer delete [] buffer; //update FileAttribute Tag if exists if(tagState.hasFileAttrTag) SWF_Support::UpdateFileAttrTag(sourceRef, tagState.fileAttrTag, tagState); //update File Size SWF_Support::UpdateHeader(sourceRef); //compress file after writing XMP if(fileInfo.IsCompressed()) { fileInfo.Compress(sourceRef, this->parent->fileRef); fileInfo.Clean(); } if ( ! updated )return; // If there's an error writing the chunk, bail. this->needsUpdate = false; } // SWF_MetaHandler::UpdateFile // ================================================================================================= // SWF_MetaHandler::WriteFile // =========================== void SWF_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { LFA_FileRef destRef = this->parent->fileRef; SWF_Support::TagState tagState; LFA_FileRef origRef(destRef); std::string updatePath; SWF_Support::FileInfo fileInfo(sourceRef, sourcePath); if(fileInfo.IsCompressed()) { sourceRef = fileInfo.Decompress(); CreateTempFile ( sourcePath, &updatePath, kCopyMacRsrc ); destRef = LFA_Open ( updatePath.c_str(), 'w' ); } IO::InputStream * is = NULL; is = new IO::FileInputStream(sourceRef); is->Skip(SWF_COMPRESSION_BEGIN); long numTags = SWF_Support::OpenSWF( is, tagState ); is->Close(); delete is; if ( numTags == 0 ) return; LFA_Truncate(destRef, 0); SWF_Support::CopyHeader(sourceRef, destRef, tagState); SWF_Support::TagIterator curPos = tagState.tags.begin(); SWF_Support::TagIterator endPos = tagState.tags.end(); XMP_StringPtr packetStr = xmpPacket.c_str(); XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size(); bool copying = true; bool isXMPTagWritten = false; for (; (curPos != endPos); ++curPos) { SWF_Support::TagData tag = *curPos; // write XMP tag right after FileAttribute Tag if no XMP tag exists if (! tagState.hasXMP && (tag.id == SWF_TAG_ID_FILEATTRIBUTES)) SWF_Support::WriteXMPTag(destRef, packetLen, packetStr ); //no FileAttribute Tag and no XMP tag write XMP Tag at the beginning of the file if(!tagState.hasXMP && !tagState.hasFileAttrTag && ! isXMPTagWritten) { isXMPTagWritten = true; SWF_Support::WriteXMPTag(destRef, packetLen, packetStr ); } // write XMP tag where old XMP exists if(tagState.hasXMP && (tag.pos == tagState.xmpTag.pos)) { copying = false; SWF_Support::WriteXMPTag(destRef, packetLen, packetStr ); } // copy any other chunk if(copying) SWF_Support::CopyTag(sourceRef, destRef, tag); copying = true; } // update FileAttribute Tag in new file if(tagState.hasFileAttrTag) SWF_Support::UpdateFileAttrTag(destRef, tagState.fileAttrTag, tagState); // update file header by measuring new file size SWF_Support::UpdateHeader(origRef); //compress re-written file if(fileInfo.IsCompressed()) { fileInfo.Compress(destRef, origRef); fileInfo.Clean(); LFA_Close(destRef); LFA_Delete(updatePath.c_str()); } } // SWF_MetaHandler::WriteFile exempi-2.2.1/source/XMPFiles/FileHandlers/GIF_Handler.cpp0000664000175000017500000001777712150230672020004 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002-2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // Derived from PNG_Handler.cpp by Ian Jacobi // ================================================================================================= #include "GIF_Handler.hpp" #include "GIF_Support.hpp" using namespace std; // ================================================================================================= /// \file GIF_Handler.hpp /// \brief File format handler for GIF. /// /// This handler ... /// // ================================================================================================= // ================================================================================================= // GIF_MetaHandlerCTor // ==================== XMPFileHandler * GIF_MetaHandlerCTor ( XMPFiles * parent ) { return new GIF_MetaHandler ( parent ); } // GIF_MetaHandlerCTor // ================================================================================================= // GIF_CheckFormat // =============== bool GIF_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ) { IgnoreParam(format); IgnoreParam(fileRef); IgnoreParam(parent); XMP_Assert ( format == kXMP_GIFFile ); IOBuffer ioBuf; LFA_Seek ( fileRef, 0, SEEK_SET ); if ( ! CheckFileSpace ( fileRef, &ioBuf, GIF_SIGNATURE_LEN ) ) return false; // We need at least 3, so the buffer is not filled. if ( ! CheckBytes ( ioBuf.ptr, GIF_SIGNATURE_DATA, GIF_SIGNATURE_LEN ) ) return false; return true; } // GIF_CheckFormat // ================================================================================================= // GIF_MetaHandler::GIF_MetaHandler // ================================== GIF_MetaHandler::GIF_MetaHandler ( XMPFiles * _parent ) { this->parent = _parent; this->handlerFlags = kGIF_HandlerFlags; // It MUST be UTF-8. this->stdCharForm = kXMP_Char8Bit; } // ================================================================================================= // GIF_MetaHandler::~GIF_MetaHandler // =================================== GIF_MetaHandler::~GIF_MetaHandler() { } // ================================================================================================= // GIF_MetaHandler::CacheFileData // =============================== void GIF_MetaHandler::CacheFileData() { this->containsXMP = false; LFA_FileRef fileRef ( this->parent->fileRef ); if ( fileRef == 0) return; // We try to navigate through the blocks to find the XMP block. GIF_Support::BlockState blockState; long numBlocks = GIF_Support::OpenGIF ( fileRef, blockState ); if ( numBlocks == 0 ) return; if (blockState.xmpLen != 0) { // XMP present this->xmpPacket.reserve(blockState.xmpLen); this->xmpPacket.assign(blockState.xmpLen, ' '); if (GIF_Support::ReadBuffer ( fileRef, blockState.xmpPos, blockState.xmpLen, const_cast(this->xmpPacket.data()) )) { this->packetInfo.offset = blockState.xmpPos; this->packetInfo.length = blockState.xmpLen; this->containsXMP = true; } } else { // no XMP } } // GIF_MetaHandler::CacheFileData // ================================================================================================= // GIF_MetaHandler::ProcessTNail // ============================== void GIF_MetaHandler::ProcessTNail() { XMP_Throw ( "GIF_MetaHandler::ProcessTNail isn't implemented yet", kXMPErr_Unimplemented ); } // GIF_MetaHandler::ProcessTNail // ================================================================================================= // GIF_MetaHandler::ProcessXMP // ============================ // // Process the raw XMP and legacy metadata that was previously cached. void GIF_MetaHandler::ProcessXMP() { this->processedXMP = true; // Make sure we only come through here once. // Process the XMP packet. if ( ! this->xmpPacket.empty() ) { XMP_Assert ( this->containsXMP ); XMP_StringPtr packetStr = this->xmpPacket.c_str(); XMP_StringLen packetLen = this->xmpPacket.size(); this->xmpObj.ParseFromBuffer ( packetStr, packetLen ); this->containsXMP = true; } } // GIF_MetaHandler::ProcessXMP // ================================================================================================= // GIF_MetaHandler::UpdateFile // ============================ void GIF_MetaHandler::UpdateFile ( bool doSafeUpdate ) { bool updated = false; if ( ! this->needsUpdate ) return; if ( doSafeUpdate ) XMP_Throw ( "GIF_MetaHandler::UpdateFile: Safe update not supported", kXMPErr_Unavailable ); XMP_StringPtr packetStr = xmpPacket.c_str(); XMP_StringLen packetLen = xmpPacket.size(); if ( packetLen == 0 ) return; LFA_FileRef fileRef(this->parent->fileRef); if ( fileRef == 0 ) return; GIF_Support::BlockState blockState; long numBlocks = GIF_Support::OpenGIF ( fileRef, blockState ); if ( numBlocks == 0 ) return; // write/update block(s) if (blockState.xmpLen == 0) { // no current chunk -> inject updated = SafeWriteFile(); } else if (blockState.xmpLen >= packetLen ) { // current chunk size is sufficient -> write and update CRC (in place update) updated = GIF_Support::WriteBuffer(fileRef, blockState.xmpPos, packetLen, packetStr ); // GIF doesn't have a CRC like PNG. } else if (blockState.xmpLen < packetLen) { // XMP is too large for current chunk -> expand updated = SafeWriteFile(); } if ( ! updated )return; // If there's an error writing the chunk, bail. this->needsUpdate = false; } // GIF_MetaHandler::UpdateFile // ================================================================================================= // GIF_MetaHandler::WriteFile // =========================== void GIF_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { LFA_FileRef destRef = this->parent->fileRef; GIF_Support::BlockState blockState; long numBlocks = GIF_Support::OpenGIF ( sourceRef, blockState ); if ( numBlocks == 0 ) return; LFA_Truncate(destRef, 0); // LFA_Write(destRef, GIF_SIGNATURE_DATA, GIF_SIGNATURE_LEN); GIF_Support::BlockIterator curPos = blockState.blocks.begin(); GIF_Support::BlockIterator endPos = blockState.blocks.end(); long blockCount; for (blockCount = 0; (curPos != endPos); ++curPos, ++blockCount) { GIF_Support::BlockData block = *curPos; // discard existing XMP block if (block.xmp) continue; // copy any other block GIF_Support::CopyBlock(sourceRef, destRef, block); // place XMP block immediately before trailer if (blockCount == numBlocks - 2) { XMP_StringPtr packetStr = xmpPacket.c_str(); XMP_StringLen packetLen = xmpPacket.size(); GIF_Support::WriteXMPBlock(destRef, packetLen, packetStr ); } } } // GIF_MetaHandler::WriteFile // ================================================================================================= // GIF_MetaHandler::SafeWriteFile // =========================== bool GIF_MetaHandler::SafeWriteFile () { bool ret = false; std::string origPath = this->parent->filePath; LFA_FileRef origRef = this->parent->fileRef; std::string updatePath; LFA_FileRef updateRef = 0; CreateTempFile ( origPath, &updatePath, kCopyMacRsrc ); updateRef = LFA_Open ( updatePath.c_str(), 'w' ); this->parent->filePath = updatePath; this->parent->fileRef = updateRef; try { this->WriteFile ( origRef, origPath ); ret = true; } catch ( ... ) { LFA_Close ( updateRef ); this->parent->filePath = origPath; this->parent->fileRef = origRef; throw; } LFA_Close ( origRef ); LFA_Delete ( origPath.c_str() ); LFA_Close ( updateRef ); LFA_Rename ( updatePath.c_str(), origPath.c_str() ); this->parent->filePath = origPath; this->parent->fileRef = 0; return ret; } // GIF_MetaHandler::SafeWriteFile // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/PNG_Handler.hpp0000664000175000017500000000362012150230672020006 00000000000000#ifndef __PNG_Handler_hpp__ #define __PNG_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "PNG_Support.hpp" // ================================================================================================= /// \file PNG_Handler.hpp /// \brief File format handler for PNG. /// /// This header ... /// // ================================================================================================= // *** Could derive from Basic_Handler - buffer file tail in a temp file. extern XMPFileHandler* PNG_MetaHandlerCTor ( XMPFiles* parent ); extern bool PNG_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); static const XMP_OptionBits kPNG_HandlerFlags = ( kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_PrefersInPlace | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_NeedsReadOnlyPacket ); class PNG_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessXMP(); void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string& sourcePath ); bool SafeWriteFile (); PNG_MetaHandler ( XMPFiles* parent ); virtual ~PNG_MetaHandler(); }; // PNG_MetaHandler // ================================================================================================= #endif /* __PNG_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/InDesign_Handler.hpp0000664000175000017500000000374612150230672021073 00000000000000#ifndef __InDesign_Handler_hpp__ #define __InDesign_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "Basic_Handler.hpp" // ================================================================================================= /// \file InDesign_Handler.hpp /// \brief File format handler for InDesign files. /// /// This header ... /// // ================================================================================================= extern XMPFileHandler * InDesign_MetaHandlerCTor ( XMPFiles * parent ); extern bool InDesign_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); static const XMP_OptionBits kInDesign_HandlerFlags = kBasic_HandlerFlags & (~kXMPFiles_CanInjectXMP); // ! InDesign can't inject. class InDesign_MetaHandler : public Basic_MetaHandler { public: InDesign_MetaHandler ( XMPFiles * parent ); ~InDesign_MetaHandler(); void CacheFileData(); protected: void WriteXMPPrefix(); void WriteXMPSuffix(); void NoteXMPRemoval(); void NoteXMPInsertion(); void CaptureFileEnding(); void RestoreFileEnding(); bool streamBigEndian; // Set from master page's fObjectStreamEndian. XMP_Uns32 xmpObjID; // Set from contiguous object's fObjectID, still as little endian. XMP_Uns32 xmpClassID; // Set from contiguous object's fObjectClassID, still as little endian. }; // InDesign_MetaHandler // ================================================================================================= #endif /* __InDesign_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/PostScript_Handler.hpp0000664000175000017500000000354012150230672021475 00000000000000#ifndef __PostScript_Handler_hpp__ #define __PostScript_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "Trivial_Handler.hpp" // ================================================================================================= /// \file PostScript_Handler.hpp /// \brief File format handler for PostScript and EPS files. /// /// This header ... /// // ================================================================================================= // *** This probably could be derived from Basic_Handler, buffer the file tail in a temp file. extern XMPFileHandler * PostScript_MetaHandlerCTor ( XMPFiles * parent ); extern bool PostScript_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); static const XMP_OptionBits kPostScript_HandlerFlags = kTrivial_HandlerFlags; enum { kPSHint_NoMarker = 0, kPSHint_NoMain = 1, kPSHint_MainFirst = 2, kPSHint_MainLast = 3 }; class PostScript_MetaHandler : public Trivial_MetaHandler { public: PostScript_MetaHandler ( XMPFiles * parent ); ~PostScript_MetaHandler(); void CacheFileData(); int psHint; protected: int FindPostScriptHint(); bool FindFirstPacket(); bool FindLastPacket(); }; // PostScript_MetaHandler // ================================================================================================= #endif /* __PostScript_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/UCF_Handler.hpp0000664000175000017500000005603412150230672020006 00000000000000#ifndef __UCF_Handler_hpp__ #define __UCF_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMPFiles_Impl.hpp" // ================================================================================================= /// \file UCF_Handler.hpp // // underlying math: // __ 0 ______ 0 ______ __ // | A | | A | // | | | | // al | | (a2l)| | // x |------| b2 |------| // xl | X | | B |_ // b |------| (b2l)| | | // | B | x2 |------| | B2 could also be // bl | | x2l | X2 | | _after_ X2 // cd |------| cd2 |------|<' // |//CD//| |//CD2/| // cdx |------| cdx2 |------| // cdxl|------| cdx2l|------| // cdl|//////| cd2l|//////| // z |------| z2|------| // | | | | // [zl]| Z | z2l | Z2 | // h |------| h2 |------| // fl | H | | H2 | f2l // __ hl |______| (h2l)|______| __ // // fl file length pre (2 = post) // numCf number of content files prior to injection // numCf2 " post // // // l length variable, all else offset // [ ] variable is not needed // ( ) variable is identical to left // a content files prior to xmp (possibly: all) // b content files behind xmp (possibly: 0) // x xmp packet (possibly: 0) // cd central directory // h end of central directory // // z zip64 record and locator (if existing) // // general rules: // the bigger A, the less rewrite effort. // (also within the CD) // putting XMP at the end maximizes A. // // bool previousXMP == x!=0 // // (x==0) == (cdx==0) == (xl==0) == (cdxl==0) // // std::vector cdOffsetsPre; // // ----------------- // asserts: //( 1) a == a2 == 0, making these variables obsolete //( 2) a2l == al, this block is not touched //( 3) b2 <= b, b is only moved closer to the beginning of file //( 4) b2l == bl, b does not change in size //( 5) x2 >= x, b is only moved further down in the file // //( 6) x != 0, x2l != 0, cd != 0, cdl != 0 // none of these blocks is at the beginning ('mimetype' by spec), // nor is any of them zero byte long //( 7) h!=0, hl >= 22 header is not at the beginning, minimum size 22 // // file size computation: //( 8) al + bl + xl +cdl +hl = fl //( 9) al + bl + x2l+cd2l+hl = fl2 // //(10) ( x==0 ) <=> ( cdx == 0 ) // if there's a packet in the pre-file, or there isn't //(11) (x==0) => xl=0 //(12) (cdx==0)=> cdx=0 // //(13) x==0 ==> b,bl,b2,b2l==0 // if there is no pre-xmp, B does not exist //(14) x!=0 ==> al:=x, b:=x+xl, bl:=cd-b // // zip 64: //(15) zl and z2l are basically equal, except _one_ of them is 0 : // //(16) b2l is indeed never different t // // FIXED_SIZE means the fixed (minimal) portion of a struct // TOTAL_SIZE indicates, that this struct indeed has a fixed, known total length // // ================================================================================================= extern XMPFileHandler* UCF_MetaHandlerCTor ( XMPFiles * parent ); extern bool UCF_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); static const XMP_OptionBits kUCF_HandlerFlags = ( kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_CanRewrite | /* kXMPFiles_PrefersInPlace | removed, only reasonable for formats where difference is significant */ kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | // *** kXMPFiles_AllowsSafeUpdate | kXMPFiles_NeedsReadOnlyPacket //UCF/zip has checksums... ); enum { // data descriptor // may or may not have a signature: 0x08074b50 kUCF_DD_crc32 = 0, kUCF_DD_sizeCompressed = 4, kUCF_DD_sizeUncompressed = 8, }; class UCF_MetaHandler : public XMPFileHandler { public: UCF_MetaHandler ( XMPFiles * _parent ); ~UCF_MetaHandler(); void CacheFileData(); void ProcessXMP(); void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); protected: const static XMP_Uns16 xmpFilenameLen = 21; const static char* xmpFilename; private: class Zip64EndOfDirectory { private: public: const static XMP_Uns16 o_sig = 0; // 0x06064b50 const static XMP_Uns16 o_size = 4; // of this, excluding leading 12 bytes // == FIXED_SIZE -12, since we're never creating the extensible data sector... const static XMP_Uns16 o_VersionMade = 12; const static XMP_Uns16 o_VersionNeededExtr = 14; const static XMP_Uns16 o_numDisk = 16; // force 0 const static XMP_Uns16 o_numCDDisk = 20; // force 0 const static XMP_Uns16 o_numCFsThisDisk = 24; const static XMP_Uns16 o_numCFsTotal = 32; // force equal const static XMP_Uns16 o_sizeOfCD = 40; // (regular one, not Z64) const static XMP_Uns16 o_offsetCD = 48; // " const static XMP_Int32 FIXED_SIZE = 56; char fields[FIXED_SIZE]; const static XMP_Uns32 ID = 0x06064b50; Zip64EndOfDirectory( XMP_Int64 offsetCD, XMP_Int64 sizeOfCD, XMP_Uns64 numCFs ) { memset(fields,'\0',FIXED_SIZE); PutUns32LE(ID ,&fields[o_sig] ); PutUns64LE(FIXED_SIZE - 12, &fields[o_size] ); //see above PutUns16LE( 45 ,&fields[o_VersionMade] ); PutUns16LE( 45 ,&fields[o_VersionNeededExtr] ); // fine at 0: o_numDisk // fine at 0: o_numCDDisk PutUns64LE( numCFs, &fields[o_numCFsThisDisk] ); PutUns64LE( numCFs, &fields[o_numCFsTotal] ); PutUns64LE( sizeOfCD, &fields[o_sizeOfCD] ); PutUns64LE( offsetCD, &fields[o_offsetCD] ); } void write(LFA_FileRef file) { XMP_Validate( ID == GetUns32LE( &this->fields[o_sig] ), "invalid header on write", kXMPErr_BadFileFormat ); LFA_Write( file , fields , FIXED_SIZE ); } }; class Zip64Locator { public: const static XMP_Uns16 o_sig = 0; // 0x07064b50 const static XMP_Uns16 o_numDiskZ64CD = 4; // force 0 const static XMP_Uns16 o_offsZ64EOD = 8; const static XMP_Uns16 o_numDisks = 16; // set 1, tolerate 0 const static XMP_Int32 TOTAL_SIZE = 20; char fields[TOTAL_SIZE]; const static XMP_Uns32 ID = 0x07064b50; Zip64Locator( XMP_Int64 offsetZ64EOD ) { memset(fields,'\0',TOTAL_SIZE); PutUns32LE(ID, &fields[Zip64Locator::o_sig] ); PutUns32LE(0, &fields[Zip64Locator::o_numDiskZ64CD] ); PutUns64LE(offsetZ64EOD, &fields[Zip64Locator::o_offsZ64EOD] ); PutUns32LE(1, &fields[Zip64Locator::o_numDisks] ); } // writes structure to file (starting at current position) void write(LFA_FileRef file) { XMP_Validate( ID == GetUns32LE( &this->fields[o_sig] ), "invalid header on write", kXMPErr_BadFileFormat ); LFA_Write( file , fields , TOTAL_SIZE ); } }; struct EndOfDirectory { public: const static XMP_Int32 FIXED_SIZE = 22; //32 bit type is important to not overrun on maxcomment const static XMP_Uns32 ID = 0x06054b50; const static XMP_Int32 COMMENT_MAX = 0xFFFF; //offsets const static XMP_Int32 o_CentralDirectorySize = 12; const static XMP_Int32 o_CentralDirectoryOffset = 16; }; class FileHeader { private: //TODO intergrate in clear() void release() // avoid terminus free() since subject to a #define (mem-leak-check) { if (filename) delete [] filename; if (extraField) delete [] extraField; filename=0; extraField=0; } public: const static XMP_Uns32 SIG = 0x04034b50; const static XMP_Uns16 kdataDescriptorFlag = 0x8; const static XMP_Uns16 o_sig = 0; const static XMP_Uns16 o_extractVersion = 4; const static XMP_Uns16 o_flags = 6; const static XMP_Uns16 o_compression = 8; const static XMP_Uns16 o_lastmodTime = 10; const static XMP_Uns16 o_lastmodDate = 12; const static XMP_Uns16 o_crc32 = 14; const static XMP_Uns16 o_sizeCompressed = 18; const static XMP_Uns16 o_sizeUncompressed = 22; const static XMP_Uns16 o_fileNameLength = 26; const static XMP_Uns16 o_extraFieldLength = 28; // total 30 const static int FIXED_SIZE = 30; char fields[FIXED_SIZE]; char* filename; char* extraField; XMP_Uns16 filenameLen; XMP_Uns16 extraFieldLen; void clear() { this->release(); memset(fields,'\0',FIXED_SIZE); //arm with minimal default values: PutUns32LE(0x04034b50, &fields[FileHeader::o_sig] ); PutUns16LE(0x14, &fields[FileHeader::o_extractVersion] ); } FileHeader() : filename(0),extraField(0),filenameLen(0),extraFieldLen(0) { clear(); }; // reads entire *FileHeader* structure from file (starting at current position) void read(LFA_FileRef file) { this->release(); LFA_Read( file , fields , FIXED_SIZE , true ); XMP_Uns32 tmp32 = GetUns32LE( &this->fields[FileHeader::o_sig] ); XMP_Validate( SIG == tmp32, "invalid header", kXMPErr_BadFileFormat ); filenameLen = GetUns16LE( &this->fields[FileHeader::o_fileNameLength] ); extraFieldLen = GetUns16LE( &this->fields[FileHeader::o_extraFieldLength] ); // nb unlike the CDFileHeader the FileHeader will in practice never have // extra fields. Reasoning: File headers never carry (their own) offsets, // (un)compressed size of XMP will hardly ever reach 4 GB if (filenameLen) { filename = new char[filenameLen]; LFA_Read(file,filename,filenameLen,true); } if (extraFieldLen) { extraField = new char[extraFieldLen]; LFA_Read(file,extraField,extraFieldLen,true); // *** NB: this WOULD need parsing for content files that are // compressed or uncompressed >4GB (VERY unlikely for XMP) } } // writes structure to file (starting at current position) void write(LFA_FileRef file) { XMP_Validate( SIG == GetUns32LE( &this->fields[FileHeader::o_sig] ), "invalid header on write", kXMPErr_BadFileFormat ); filenameLen = GetUns16LE( &this->fields[FileHeader::o_fileNameLength] ); extraFieldLen = GetUns16LE( &this->fields[FileHeader::o_extraFieldLength] ); LFA_Write( file , fields , FIXED_SIZE ); if (filenameLen) LFA_Write( file, filename, filenameLen ); if (extraFieldLen) LFA_Write( file, extraField,extraFieldLen ); } void transfer(const FileHeader &orig) { memcpy(fields,orig.fields,FIXED_SIZE); if (orig.extraField) { extraFieldLen=orig.extraFieldLen; extraField = new char[extraFieldLen]; memcpy(extraField,orig.extraField,extraFieldLen); } if (orig.filename) { filenameLen=orig.filenameLen; filename = new char[filenameLen]; memcpy(filename,orig.filename,filenameLen); } }; void setXMPFilename() { // only needed for fresh structs, thus enforcing rather than catering to memory issues XMP_Enforce( (filenameLen==0) && (extraFieldLen == 0) ); filenameLen = xmpFilenameLen; PutUns16LE(filenameLen, &fields[FileHeader::o_fileNameLength] ); filename = new char[xmpFilenameLen]; memcpy(filename,"META-INF/metadata.xml",xmpFilenameLen); } XMP_Uns32 sizeHeader() { return this->FIXED_SIZE + this->filenameLen + this->extraFieldLen; } XMP_Uns32 sizeTotalCF() { //*** not zip64 bit safe yet, use only for non-large xmp packet return this->sizeHeader() + GetUns32LE( &fields[FileHeader::o_sizeCompressed] ); } ~FileHeader() { this->release(); }; }; //class FileHeader ////// yes, this needs an own class ////// offsets must be extracted, added, modified, ////// come&go depending on being >0xffffff ////class extraField { //// private: class CDFileHeader { private: void release() //*** needed or can go? { if (filename) delete [] filename; if (extraField) delete [] extraField; if (comment) delete [] comment; filename=0; filenameLen=0; extraField=0; extraFieldLen=0; comment=0; commentLen=0; } const static XMP_Uns32 SIG = 0x02014b50; public: const static XMP_Uns16 o_sig = 0; //0x02014b50 const static XMP_Uns16 o_versionMadeBy = 4; const static XMP_Uns16 o_extractVersion = 6; const static XMP_Uns16 o_flags = 8; const static XMP_Uns16 o_compression = 10; const static XMP_Uns16 o_lastmodTime = 12; const static XMP_Uns16 o_lastmodDate = 14; const static XMP_Uns16 o_crc32 = 16; const static XMP_Uns16 o_sizeCompressed = 20; // 16bit stub const static XMP_Uns16 o_sizeUncompressed = 24; // 16bit stub const static XMP_Uns16 o_fileNameLength = 28; const static XMP_Uns16 o_extraFieldLength = 30; const static XMP_Uns16 o_commentLength = 32; const static XMP_Uns16 o_diskNo = 34; const static XMP_Uns16 o_internalAttribs = 36; const static XMP_Uns16 o_externalAttribs = 38; const static XMP_Uns16 o_offsetLocalHeader = 42; // 16bit stub // total size is 4+12+12+10+8=46 const static int FIXED_SIZE = 46; char fields[FIXED_SIZE]; // do not bet on any zero-freeness, // certainly no zero termination (pascal strings), // treat as data blocks char* filename; char* extraField; char* comment; XMP_Uns16 filenameLen; XMP_Uns16 extraFieldLen; XMP_Uns16 commentLen; // full, real, parsed 64 bit values XMP_Int64 sizeUncompressed; XMP_Int64 sizeCompressed; XMP_Int64 offsetLocalHeader; CDFileHeader() : filename(0),extraField(0),comment(0),filenameLen(0), extraFieldLen(0),commentLen(0),sizeUncompressed(0),sizeCompressed(0),offsetLocalHeader(0) { memset(fields,'\0',FIXED_SIZE); //already arm with appropriate values where applicable: PutUns32LE(0x02014b50, &fields[CDFileHeader::o_sig] ); PutUns16LE(0x14, &fields[CDFileHeader::o_extractVersion] ); }; // copy constructor CDFileHeader(const CDFileHeader& orig) : filename(0),extraField(0),comment(0),filenameLen(0), extraFieldLen(0),commentLen(0),sizeUncompressed(0),sizeCompressed(0),offsetLocalHeader(0) { memcpy(fields,orig.fields,FIXED_SIZE); if (orig.extraField) { extraFieldLen=orig.extraFieldLen; extraField = new char[extraFieldLen]; memcpy(extraField , orig.extraField , extraFieldLen); } if (orig.filename) { filenameLen=orig.filenameLen; filename = new char[filenameLen]; memcpy(filename , orig.filename , filenameLen); } if (orig.comment) { commentLen=orig.commentLen; comment = new char[commentLen]; memcpy(comment , orig.comment , commentLen); } filenameLen = orig.filenameLen; extraFieldLen = orig.extraFieldLen; commentLen = orig.commentLen; sizeUncompressed = orig.sizeUncompressed; sizeCompressed = orig.sizeCompressed; offsetLocalHeader = orig.offsetLocalHeader; } // Assignment operator CDFileHeader& operator=(const CDFileHeader& obj) { XMP_Throw("not supported",kXMPErr_Unimplemented); } // reads entire structure from file (starting at current position) void read(LFA_FileRef file) { this->release(); LFA_Read(file,fields,FIXED_SIZE,true); XMP_Validate( SIG == GetUns32LE( &this->fields[CDFileHeader::o_sig] ), "invalid header", kXMPErr_BadFileFormat ); filenameLen = GetUns16LE( &this->fields[CDFileHeader::o_fileNameLength] ); extraFieldLen = GetUns16LE( &this->fields[CDFileHeader::o_extraFieldLength] ); commentLen = GetUns16LE( &this->fields[CDFileHeader::o_commentLength] ); if (filenameLen) { filename = new char[filenameLen]; LFA_Read(file,filename,filenameLen,true); } if (extraFieldLen) { extraField = new char[extraFieldLen]; LFA_Read(file,extraField,extraFieldLen,true); } if (commentLen) { comment = new char[commentLen]; LFA_Read(file,comment,commentLen,true); } ////// GET ACTUAL 64 BIT VALUES ////////////////////////////////////////////// // get 32bit goodies first, correct later sizeUncompressed = GetUns32LE( &fields[o_sizeUncompressed] ); sizeCompressed = GetUns32LE( &fields[o_sizeCompressed] ); offsetLocalHeader = GetUns32LE( &fields[o_offsetLocalHeader] ); XMP_Int32 offset = 0; while ( offset < extraFieldLen ) { XMP_Validate( (extraFieldLen - offset) >= 4, "need 4 bytes for next header ID+len", kXMPErr_BadFileFormat); XMP_Uns16 headerID = GetUns16LE( &extraField[offset] ); XMP_Uns16 dataSize = GetUns16LE( &extraField[offset+2] ); offset += 4; XMP_Validate( (extraFieldLen - offset) <= dataSize, "actual field lenght not given", kXMPErr_BadFileFormat); if ( headerID == 0x1 ) //we only care about "Zip64 extended information extra field" { XMP_Validate( offset < extraFieldLen, "extra field too short", kXMPErr_BadFileFormat); if (sizeUncompressed == 0xffffffff) { sizeUncompressed = GetUns64LE( &extraField[offset] ); offset += 8; } if (sizeCompressed == 0xffffffff) { sizeCompressed = GetUns64LE( &extraField[offset] ); offset += 8; } if (offsetLocalHeader == 0xffffffff) { offsetLocalHeader = GetUns64LE( &extraField[offset] ); offset += 8; } } else { offset += dataSize; } // if } // while } // read() // writes structure to file (starting at current position) void write(LFA_FileRef file) { //// WRITE BACK REAL 64 BIT VALUES, CREATE EXTRA FIELD /////////////// //may only wipe extra field after obtaining all Info from it if (extraField) delete [] extraField; extraFieldLen=0; if ( ( sizeUncompressed > 0xffffffff ) || ( sizeCompressed > 0xffffffff ) || ( offsetLocalHeader > 0xffffffff ) ) { extraField = new char[64]; // actual maxlen is 32 extraFieldLen = 4; //first fields are for ID, size if ( sizeUncompressed > 0xffffffff ) { PutUns64LE( sizeUncompressed, &extraField[extraFieldLen] ); extraFieldLen += 8; sizeUncompressed = 0xffffffff; } if ( sizeCompressed > 0xffffffff ) { PutUns64LE( sizeCompressed, &extraField[extraFieldLen] ); extraFieldLen += 8; sizeCompressed = 0xffffffff; } if ( offsetLocalHeader > 0xffffffff ) { PutUns64LE( offsetLocalHeader, &extraField[extraFieldLen] ); extraFieldLen += 8; offsetLocalHeader = 0xffffffff; } //write ID, dataSize PutUns16LE( 0x0001, &extraField[0] ); PutUns16LE( extraFieldLen-4, &extraField[2] ); //extraFieldSize PutUns16LE( extraFieldLen, &this->fields[CDFileHeader::o_extraFieldLength] ); } // write out 32-bit ('ff-stubs' or not) PutUns32LE( (XMP_Uns32)sizeUncompressed, &fields[o_sizeUncompressed] ); PutUns32LE( (XMP_Uns32)sizeCompressed, &fields[o_sizeCompressed] ); PutUns32LE( (XMP_Uns32)offsetLocalHeader, &fields[o_offsetLocalHeader] ); /// WRITE ///////////////////////////////////////////////////////////////// XMP_Enforce( SIG == GetUns32LE( &this->fields[CDFileHeader::o_sig] ) ); LFA_Write( file , fields , FIXED_SIZE ); if (filenameLen) LFA_Write( file, filename , filenameLen ); if (extraFieldLen) LFA_Write( file, extraField , extraFieldLen ); if (commentLen) LFA_Write( file, extraField , extraFieldLen ); } void setXMPFilename() { if (filename) delete [] filename; filenameLen = xmpFilenameLen; filename = new char[xmpFilenameLen]; PutUns16LE(filenameLen, &fields[CDFileHeader::o_fileNameLength] ); memcpy(filename,"META-INF/metadata.xml",xmpFilenameLen); } XMP_Int64 size() { XMP_Int64 r = this->FIXED_SIZE + this->filenameLen + this->commentLen; // predict serialization size if ( (sizeUncompressed > 0xffffffff)||(sizeCompressed > 0xffffffff)||(offsetLocalHeader>0xffffffff) ) { r += 4; //extra fields necessary if (sizeUncompressed > 0xffffffff) r += 8; if (sizeCompressed > 0xffffffff) r += 8; if (offsetLocalHeader > 0xffffffff) r += 8; } return r; } ~CDFileHeader() { this->release(); }; }; // class CDFileHeader class EndOfCD { private: const static XMP_Uns32 SIG = 0x06054b50; void UCFECD_Free() { if(commentLen) delete [] comment; commentLen = 0; } public: const static XMP_Int32 o_Sig = 0; const static XMP_Int32 o_CdNumEntriesDisk = 8; // same-same for UCF, since single-volume const static XMP_Int32 o_CdNumEntriesTotal = 10;// must update both const static XMP_Int32 o_CdSize = 12; const static XMP_Int32 o_CdOffset = 16; const static XMP_Int32 o_CommentLen = 20; const static int FIXED_SIZE = 22; char fields[FIXED_SIZE]; char* comment; XMP_Uns16 commentLen; EndOfCD() : comment(0), commentLen(0) { //nothing }; void read (LFA_FileRef file) { UCFECD_Free(); LFA_Read(file,fields,FIXED_SIZE,true); XMP_Validate( this->SIG == GetUns32LE( &this->fields[o_Sig] ), "invalid header", kXMPErr_BadFileFormat ); commentLen = GetUns16LE( &this->fields[o_CommentLen] ); if(commentLen) { comment = new char[commentLen]; LFA_Read(file,comment,commentLen,true); } }; void write(LFA_FileRef file) { XMP_Enforce( this->SIG == GetUns32LE( &this->fields[o_Sig] ) ); commentLen = GetUns16LE( &this->fields[o_CommentLen] ); LFA_Write( file , fields , FIXED_SIZE ); if (commentLen) LFA_Write ( file, comment, commentLen ); } ~EndOfCD() { if (comment) delete [] comment; }; }; //class EndOfCD //////////////////////////////////////////////////////////////////////////////////// // EMBEDDING MATH // // a = content files before xmp (always 0 thus ommited) // b/b2 = content files behind xmp (before/after injection) // x/x2 = offset xmp content header + content file (before/after injection) // cd/cd = central directory // h/h2 = end of central directory record XMP_Int64 b,b2,x,x2,cd,cd2,cdx,cdx2,z,z2,h,h2, // length thereof ('2' only where possibly different) // using XMP_Int64 here also for length (not XMP_Int32), // to be prepared for zip64, our LFA functions might need things in multiple chunks... al,bl,xl,x2l,cdl,cd2l,cdxl,cdx2l,z2l,hl,fl,f2l; XMP_Uns16 numCF,numCF2; bool wasCompressed; // ..before, false if no prior xmp bool compressXMP; // compress this time? bool inPlacePossible; /* bool isZip64; <=> z2 != 0 */ FileHeader xmpFileHeader; CDFileHeader xmpCDHeader; XMP_StringPtr uncomprPacketStr; XMP_StringLen uncomprPacketLen; XMP_StringPtr finalPacketStr; XMP_StringLen finalPacketLen; std::vector cdEntries; EndOfCD endOfCD; void writeOut( LFA_FileRef sourceFile, LFA_FileRef targetFile, bool isRewrite, bool isInPlace); }; // UCF_MetaHandler // ================================================================================================= #endif /* __UCF_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/AVCHD_Handler.cpp0000664000175000017500000021634012150230672020207 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include #include #include "AVCHD_Handler.hpp" #include "MD5.h" #include "UnicodeConversions.hpp" using namespace std; // AVCHD maker ID values. Panasonic has confirmed their Maker ID with us, the others come from examining // sample data files. #define kMakerIDPanasonic 0x103 #define kMakerIDSony 0x108 #define kMakerIDCanon 0x1011 // ================================================================================================= /// \file AVCHD_Handler.cpp /// \brief Folder format handler for AVCHD. /// /// This handler is for the AVCHD video format. /// /// A typical AVCHD layout looks like: /// /// BDMV/ /// index.bdmv /// MovieObject.bdmv /// PLAYLIST/ /// 00000.mpls /// 00001.mpls /// STREAM/ /// 00000.m2ts /// 00001.m2ts /// CLIPINF/ /// 00000.clpi /// 00001.clpi /// BACKUP/ /// // ================================================================================================= // ================================================================================================= // AVCHD Format. Book 1: Playback System Basic Specifications V 1.01. p. 76 struct AVCHD_blkProgramInfo { XMP_Uns32 mLength; XMP_Uns8 mReserved1[2]; XMP_Uns32 mSPNProgramSequenceStart; XMP_Uns16 mProgramMapPID; XMP_Uns8 mNumberOfStreamsInPS; XMP_Uns8 mReserved2; // Video stream. struct { XMP_Uns8 mPresent; XMP_Uns8 mVideoFormat; XMP_Uns8 mFrameRate; XMP_Uns8 mAspectRatio; XMP_Uns8 mCCFlag; } mVideoStream; // Audio stream. struct { XMP_Uns8 mPresent; XMP_Uns8 mAudioPresentationType; XMP_Uns8 mSamplingFrequency; XMP_Uns8 mAudioLanguageCode[4]; } mAudioStream; // Pverlay bitmap stream. struct { XMP_Uns8 mPresent; XMP_Uns8 mOBLanguageCode[4]; } mOverlayBitmapStream; // Menu bitmap stream. struct { XMP_Uns8 mPresent; XMP_Uns8 mBMLanguageCode[4]; } mMenuBitmapStream; }; // AVCHD Format, Panasonic proprietary PRO_PlayListMark block struct AVCCAM_blkProPlayListMark { XMP_Uns8 mPresent; XMP_Uns8 mProTagID; XMP_Uns8 mFillItem1; XMP_Uns16 mLength; XMP_Uns8 mMarkType; // Entry mark struct { XMP_Uns8 mGlobalClipID[32]; XMP_Uns8 mStartTimeCode[4]; XMP_Uns8 mStreamTimecodeInfo; XMP_Uns8 mStartBinaryGroup[4]; XMP_Uns8 mLastUpdateTimeZone; XMP_Uns8 mLastUpdateDate[7]; XMP_Uns16 mFillItem; } mEntryMark; // Shot Mark struct { XMP_Uns8 mPresent; XMP_Uns8 mShotMark; XMP_Uns8 mFillItem[3]; } mShotMark; // Access struct { XMP_Uns8 mPresent; XMP_Uns8 mCreatorCharacterSet; XMP_Uns8 mCreatorLength; XMP_Uns8 mCreator[32]; XMP_Uns8 mLastUpdatePersonCharacterSet; XMP_Uns8 mLastUpdatePersonLength; XMP_Uns8 mLastUpdatePerson[32]; } mAccess; // Device struct { XMP_Uns8 mPresent; XMP_Uns16 mMakerID; XMP_Uns16 mMakerModelCode; XMP_Uns8 mSerialNoCharacterCode; XMP_Uns8 mSerialNoLength; XMP_Uns8 mSerialNo[24]; XMP_Uns16 mFillItem; } mDevice; // Shoot struct { XMP_Uns8 mPresent; XMP_Uns8 mShooterCharacterSet; XMP_Uns8 mShooterLength; XMP_Uns8 mShooter[32]; XMP_Uns8 mStartDateTimeZone; XMP_Uns8 mStartDate[7]; XMP_Uns8 mEndDateTimeZone; XMP_Uns8 mEndDate[7]; XMP_Uns16 mFillItem; } mShoot; // Location struct { XMP_Uns8 mPresent; XMP_Uns8 mSource; XMP_Uns32 mGPSLatitudeRef; XMP_Uns32 mGPSLatitude1; XMP_Uns32 mGPSLatitude2; XMP_Uns32 mGPSLatitude3; XMP_Uns32 mGPSLongitudeRef; XMP_Uns32 mGPSLongitude1; XMP_Uns32 mGPSLongitude2; XMP_Uns32 mGPSLongitude3; XMP_Uns32 mGPSAltitudeRef; XMP_Uns32 mGPSAltitude; XMP_Uns8 mPlaceNameCharacterSet; XMP_Uns8 mPlaceNameLength; XMP_Uns8 mPlaceName[64]; XMP_Uns8 mFillItem; } mLocation; }; // AVCHD Format, Panasonic proprietary extension data (AVCCAM) struct AVCCAM_Pro_PlayListInfo { XMP_Uns8 mPresent; XMP_Uns8 mTagID; XMP_Uns8 mTagVersion; XMP_Uns16 mFillItem1; XMP_Uns32 mLength; XMP_Uns16 mNumberOfPlayListMarks; XMP_Uns16 mFillItem2; // Although a playlist may contain multiple marks, we only store the one that corresponds to // the clip/shot of interest. AVCCAM_blkProPlayListMark mPlayListMark; }; // AVCHD Format, Panasonic proprietary extension data (AVCCAM) struct AVCHD_blkPanasonicPrivateData { XMP_Uns8 mPresent; XMP_Uns16 mNumberOfData; XMP_Uns16 mReserved; struct { XMP_Uns8 mPresent; XMP_Uns8 mTagID; XMP_Uns8 mTagVersion; XMP_Uns16 mTagLength; XMP_Uns8 mProfessionalMetaID[16]; } mProMetaIDBlock; struct { XMP_Uns8 mPresent; XMP_Uns8 mTagID; XMP_Uns8 mTagVersion; XMP_Uns16 mTagLength; XMP_Uns8 mGlobalClipID[32]; XMP_Uns8 mStartTimecode[4]; XMP_Uns32 mStartBinaryGroup; } mProClipIDBlock; AVCCAM_Pro_PlayListInfo mProPlaylistInfoBlock; }; // AVCHD Format. Book 2: Recording Extension Specifications, section 4.2.4.2. plus Panasonic extensions struct AVCHD_blkMakersPrivateData { XMP_Uns8 mPresent; XMP_Uns32 mLength; XMP_Uns32 mDataBlockStartAddress; XMP_Uns8 mReserved[3]; XMP_Uns8 mNumberOfMakerEntries; XMP_Uns16 mMakerID; XMP_Uns16 mMakerModelCode; AVCHD_blkPanasonicPrivateData mPanasonicPrivateData; }; // AVCHD Format. Book 2: Recording Extension Specifications, section 4.4.2.1 struct AVCHD_blkClipInfoExt { XMP_Uns32 mLength; XMP_Uns16 mMakerID; XMP_Uns16 mMakerModelCode; }; // AVCHD Format. Book 2: Recording Extension Specifications, section 4.4.1.2 struct AVCHD_blkClipExtensionData { XMP_Uns8 mPresent; XMP_Uns8 mTypeIndicator[4]; XMP_Uns8 mReserved1[4]; XMP_Uns32 mProgramInfoExtStartAddress; XMP_Uns32 mMakersPrivateDataStartAddress; AVCHD_blkClipInfoExt mClipInfoExt; AVCHD_blkMakersPrivateData mMakersPrivateData; }; // AVCHD Format. Book 2: Recording Extension Specifications, section 4.3.3.1 -- although each playlist // may contain a list of these, we only record the one that matches our target shot/clip. struct AVCHD_blkPlayListMarkExt { XMP_Uns32 mLength; XMP_Uns16 mNumberOfPlaylistMarks; bool mPresent; XMP_Uns16 mMakerID; XMP_Uns16 mMakerModelCode; XMP_Uns8 mReserved1[3]; XMP_Uns8 mFlags; // bit 0: MarkWriteProtectFlag, bits 1-2: pulldown XMP_Uns16 mRefToMarkThumbnailIndex; XMP_Uns8 mBlkTimezone; XMP_Uns8 mRecordDataAndTime[7]; XMP_Uns8 mMarkCharacterSet; XMP_Uns8 mMarkNameLength; XMP_Uns8 mMarkName[24]; XMP_Uns8 mMakersInformation[16]; XMP_Uns8 mBlkTimecode[4]; XMP_Uns16 mReserved2; }; // AVCHD Format. Book 2: Recording Extension Specifications, section 4.3.2.1 struct AVCHD_blkPlaylistMeta { XMP_Uns32 mLength; XMP_Uns16 mMakerID; XMP_Uns16 mMakerModelCode; XMP_Uns32 mReserved1; XMP_Uns16 mRefToMenuThumbnailIndex; XMP_Uns8 mBlkTimezone; XMP_Uns8 mRecordDataAndTime[7]; XMP_Uns8 mReserved2; XMP_Uns8 mPlaylistCharacterSet; XMP_Uns8 mPlaylistNameLength; XMP_Uns8 mPlaylistName[255]; }; // AVCHD Format. Book 2: Recording Extension Specifications, section 4.3.1.2 struct AVCHD_blkPlayListExtensionData { XMP_Uns8 mPresent; char mTypeIndicator[4]; XMP_Uns8 mReserved[4]; XMP_Uns32 mPlayListMarkExtStartAddress; XMP_Uns32 mMakersPrivateDataStartAddress; AVCHD_blkPlaylistMeta mPlaylistMeta; AVCHD_blkPlayListMarkExt mPlaylistMarkExt; AVCHD_blkMakersPrivateData mMakersPrivateData; }; // AVCHD Format. Book 1: Playback System Basic Specifications V 1.01. p. 38 struct AVCHD_blkExtensionData { XMP_Uns32 mLength; XMP_Uns32 mDataBlockStartAddress; XMP_Uns8 mReserved[3]; XMP_Uns8 mNumberOfDataEntries; struct AVCHD_blkExtDataEntry { XMP_Uns16 mExtDataType; XMP_Uns16 mExtDataVersion; XMP_Uns32 mExtDataStartAddress; XMP_Uns32 mExtDataLength; } mExtDataEntry; }; // Simple container for the various AVCHD legacy metadata structures we care about for an AVCHD clip struct AVCHD_LegacyMetadata { AVCHD_blkProgramInfo mProgramInfo; AVCHD_blkClipExtensionData mClipExtensionData; AVCHD_blkPlayListExtensionData mPlaylistExtensionData; }; // ================================================================================================= // MakeLeafPath // ============ static bool MakeLeafPath ( std::string * path, XMP_StringPtr root, XMP_StringPtr group, XMP_StringPtr clip, XMP_StringPtr suffix, bool checkFile = false ) { size_t partialLen; *path = root; *path += kDirChar; *path += "BDMV"; *path += kDirChar; *path += group; *path += kDirChar; *path += clip; partialLen = path->size(); *path += suffix; if ( ! checkFile ) return true; if ( GetFileMode ( path->c_str() ) == kFMode_IsFile ) return true; // Convert the suffix to uppercase and try again. Even on Mac/Win, in case a remote file system is sensitive. for ( char* chPtr = ((char*)path->c_str() + partialLen); *chPtr != 0; ++chPtr ) { if ( (0x61 <= *chPtr) && (*chPtr <= 0x7A) ) *chPtr -= 0x20; } if ( GetFileMode ( path->c_str() ) == kFMode_IsFile ) return true; if ( XMP_LitMatch ( suffix, ".clpi" ) ) { // Special case of ".cpi" for the clip file. path->erase ( partialLen ); *path += ".cpi"; if ( GetFileMode ( path->c_str() ) == kFMode_IsFile ) return true; path->erase ( partialLen ); *path += ".CPI"; if ( GetFileMode ( path->c_str() ) == kFMode_IsFile ) return true; } else if ( XMP_LitMatch ( suffix, ".mpls" ) ) { // Special case of ".mpl" for the playlist file. path->erase ( partialLen ); *path += ".mpl"; if ( GetFileMode ( path->c_str() ) == kFMode_IsFile ) return true; path->erase ( partialLen ); *path += ".MPL"; if ( GetFileMode ( path->c_str() ) == kFMode_IsFile ) return true; } // Still not found, revert to the original suffix. path->erase ( partialLen ); *path += suffix; return false; } // MakeLeafPath // ================================================================================================= // AVCHD_CheckFormat // ================= // // This version checks for the presence of a top level BPAV directory, and the required files and // directories immediately within it. The CLIPINF, PLAYLIST, and STREAM subfolders are required, as // are the index.bdmv and MovieObject.bdmv files. // // The state of the string parameters depends on the form of the path passed by the client. If the // client passed a logical clip path, like ".../MyMovie/00001", the parameters are: // rootPath - ".../MyMovie" // gpName - empty // parentName - empty // leafName - "00001" // If the client passed a full file path, like ".../MyMovie/BDMV/CLIPINF/00001.clpi", they are: // rootPath - ".../MyMovie" // gpName - "BDMV" // parentName - "CLIPINF" or "PALYLIST" or "STREAM" // leafName - "00001" // ! The common code has shifted the gpName, parentName, and leafName strings to upper case. It has // ! also made sure that for a logical clip path the rootPath is an existing folder, and that the // ! file exists for a full file path. // ! Using explicit '/' as a separator when creating paths, it works on Windows. // ! Sample files show that the ".bdmv" extension can sometimes be ".bdm". Allow either. bool AVCHD_CheckFormat ( XMP_FileFormat format, const std::string & rootPath, const std::string & gpName, const std::string & parentName, const std::string & leafName, XMPFiles * parent ) { if ( gpName.empty() != parentName.empty() ) return false; // Must be both empty or both non-empty. if ( ! gpName.empty() ) { if ( gpName != "BDMV" ) return false; if ( (parentName != "CLIPINF") && (parentName != "PLAYLIST") && (parentName != "STREAM") ) return false; } // Check the rest of the required general structure. Look for both ".bdmv" and ".bmd" extensions. std::string bdmvPath ( rootPath ); bdmvPath += kDirChar; bdmvPath += "BDMV"; if ( GetChildMode ( bdmvPath, "CLIPINF" ) != kFMode_IsFolder ) return false; if ( GetChildMode ( bdmvPath, "PLAYLIST" ) != kFMode_IsFolder ) return false; if ( GetChildMode ( bdmvPath, "STREAM" ) != kFMode_IsFolder ) return false; if ( (GetChildMode ( bdmvPath, "index.bdmv" ) != kFMode_IsFile) && (GetChildMode ( bdmvPath, "index.bdm" ) != kFMode_IsFile) && (GetChildMode ( bdmvPath, "INDEX.BDMV" ) != kFMode_IsFile) && // Some usage is all caps. (GetChildMode ( bdmvPath, "INDEX.BDM" ) != kFMode_IsFile) ) return false; if ( (GetChildMode ( bdmvPath, "MovieObject.bdmv" ) != kFMode_IsFile) && (GetChildMode ( bdmvPath, "MovieObj.bdm" ) != kFMode_IsFile) && (GetChildMode ( bdmvPath, "MOVIEOBJECT.BDMV" ) != kFMode_IsFile) && // Some usage is all caps. (GetChildMode ( bdmvPath, "MOVIEOBJ.BDM" ) != kFMode_IsFile) ) return false; // Make sure the .clpi file exists. std::string tempPath; bool foundClpi = MakeLeafPath ( &tempPath, rootPath.c_str(), "CLIPINF", leafName.c_str(), ".clpi", true /* checkFile */ ); if ( ! foundClpi ) return false; // And now save the pseudo path for the handler object. tempPath = rootPath; tempPath += kDirChar; tempPath += leafName; size_t pathLen = tempPath.size() + 1; // Include a terminating nul. parent->tempPtr = malloc ( pathLen ); if ( parent->tempPtr == 0 ) XMP_Throw ( "No memory for AVCHD clip info", kXMPErr_NoMemory ); memcpy ( parent->tempPtr, tempPath.c_str(), pathLen ); return true; } // AVCHD_CheckFormat // ================================================================================================= // ReadAVCHDProgramInfo // ============ static bool ReadAVCHDProgramInfo ( LFA_FileRef& cpiFileRef, AVCHD_blkProgramInfo& avchdProgramInfo ) { avchdProgramInfo.mLength = LFA_ReadUns32_BE ( cpiFileRef ); LFA_Read ( cpiFileRef, avchdProgramInfo.mReserved1, 2 ); avchdProgramInfo.mSPNProgramSequenceStart = LFA_ReadUns32_BE ( cpiFileRef ); avchdProgramInfo.mProgramMapPID = LFA_ReadUns16_BE ( cpiFileRef ); LFA_Read ( cpiFileRef, &avchdProgramInfo.mNumberOfStreamsInPS, 1 ); LFA_Read ( cpiFileRef, &avchdProgramInfo.mReserved2, 1 ); XMP_Uns16 streamPID = 0; for ( int i=0; i> 4; // hi 4 bits avchdProgramInfo.mVideoStream.mFrameRate = videoFormatAndFrameRate & 0x0f; // lo 4 bits XMP_Uns8 aspectRatioAndReserved = 0; LFA_Read ( cpiFileRef, &aspectRatioAndReserved, 1 ); avchdProgramInfo.mVideoStream.mAspectRatio = aspectRatioAndReserved >> 4; // hi 4 bits XMP_Uns8 ccFlag = 0; LFA_Read ( cpiFileRef, &ccFlag, 1 ); avchdProgramInfo.mVideoStream.mCCFlag = ccFlag; avchdProgramInfo.mVideoStream.mPresent = 1; } break; case 0x80 : // Fall through. case 0x81 : // Audio stream case. { XMP_Uns8 audioPresentationTypeAndFrequency = 0; LFA_Read ( cpiFileRef, &audioPresentationTypeAndFrequency, 1 ); avchdProgramInfo.mAudioStream.mAudioPresentationType = audioPresentationTypeAndFrequency >> 4; // hi 4 bits avchdProgramInfo.mAudioStream.mSamplingFrequency = audioPresentationTypeAndFrequency & 0x0f; // lo 4 bits LFA_Read ( cpiFileRef, avchdProgramInfo.mAudioStream.mAudioLanguageCode, 3 ); avchdProgramInfo.mAudioStream.mAudioLanguageCode[3] = 0; avchdProgramInfo.mAudioStream.mPresent = 1; } break; case 0x90 : // Overlay bitmap stream case. LFA_Read ( cpiFileRef, &avchdProgramInfo.mOverlayBitmapStream.mOBLanguageCode, 3 ); avchdProgramInfo.mOverlayBitmapStream.mOBLanguageCode[3] = 0; avchdProgramInfo.mOverlayBitmapStream.mPresent = 1; break; case 0x91 : // Menu bitmap stream. LFA_Read ( cpiFileRef, &avchdProgramInfo.mMenuBitmapStream.mBMLanguageCode, 3 ); avchdProgramInfo.mMenuBitmapStream.mBMLanguageCode[3] = 0; avchdProgramInfo.mMenuBitmapStream.mPresent = 1; break; default : break; } LFA_Seek ( cpiFileRef, pos + length, SEEK_SET ); } return true; } // ================================================================================================= // ReadAVCHDExtensionData // ============ static bool ReadAVCHDExtensionData ( LFA_FileRef& cpiFileRef, AVCHD_blkExtensionData& extensionDataHeader ) { extensionDataHeader.mLength = LFA_ReadUns32_BE ( cpiFileRef ); if ( extensionDataHeader.mLength == 0 ) { // Nothing to read return true; } extensionDataHeader.mDataBlockStartAddress = LFA_ReadUns32_BE ( cpiFileRef ); LFA_Read ( cpiFileRef, extensionDataHeader.mReserved, 3 ); LFA_Read ( cpiFileRef, &extensionDataHeader.mNumberOfDataEntries, 1 ); if ( extensionDataHeader.mNumberOfDataEntries != 1 ) { // According to AVCHD Format. Book1. v. 1.01. p 38, "This field shall be set to 1 in this format." return false; } extensionDataHeader.mExtDataEntry.mExtDataType = LFA_ReadUns16_BE ( cpiFileRef ); extensionDataHeader.mExtDataEntry.mExtDataVersion = LFA_ReadUns16_BE ( cpiFileRef ); extensionDataHeader.mExtDataEntry.mExtDataStartAddress = LFA_ReadUns32_BE ( cpiFileRef ); extensionDataHeader.mExtDataEntry.mExtDataLength = LFA_ReadUns32_BE ( cpiFileRef ); if ( extensionDataHeader.mExtDataEntry.mExtDataType != 0x1000 ) { // According to AVCHD Format. Book1. v. 1.01. p 38, "If the metadata is for an AVCHD application, // this value shall be set to 'Ox1OOO'." return false; } return true; } // ================================================================================================= // ReadAVCCAMProMetaID-- read Panasonic's proprietary PRO_MetaID block // ============ static bool ReadAVCCAMProMetaID ( LFA_FileRef& cpiFileRef, XMP_Uns8 tagID, AVCHD_blkPanasonicPrivateData& extensionDataHeader ) { extensionDataHeader.mPresent = 1; extensionDataHeader.mProMetaIDBlock.mPresent = 1; extensionDataHeader.mProMetaIDBlock.mTagID = tagID; LFA_Read ( cpiFileRef, &extensionDataHeader.mProMetaIDBlock.mTagVersion, 1); extensionDataHeader.mProMetaIDBlock.mTagLength = LFA_ReadUns16_BE ( cpiFileRef ); LFA_Read ( cpiFileRef, &extensionDataHeader.mProMetaIDBlock.mProfessionalMetaID, 16); return true; } // ================================================================================================= // ReadAVCCAMProClipInfo-- read Panasonic's proprietary PRO_ClipInfo block // ============ static bool ReadAVCCAMProClipInfo ( LFA_FileRef& cpiFileRef, XMP_Uns8 tagID, AVCHD_blkPanasonicPrivateData& extensionDataHeader ) { extensionDataHeader.mPresent = 1; extensionDataHeader.mProClipIDBlock.mPresent = 1; extensionDataHeader.mProClipIDBlock.mTagID = tagID; LFA_Read ( cpiFileRef, &extensionDataHeader.mProClipIDBlock.mTagVersion, 1); extensionDataHeader.mProClipIDBlock.mTagLength = LFA_ReadUns16_BE ( cpiFileRef ); LFA_Read ( cpiFileRef, &extensionDataHeader.mProClipIDBlock.mGlobalClipID, 32); LFA_Read ( cpiFileRef, &extensionDataHeader.mProClipIDBlock.mStartTimecode, 4 ); extensionDataHeader.mProClipIDBlock.mStartBinaryGroup = LFA_ReadUns32_BE ( cpiFileRef ); return true; } // ================================================================================================= // ReadAVCCAM_blkPRO_ShotMark -- read Panasonic's proprietary PRO_ShotMark block // ============ static bool ReadAVCCAM_blkPRO_ShotMark ( LFA_FileRef& mplFileRef, AVCCAM_blkProPlayListMark& proMark ) { proMark.mShotMark.mPresent = 1; LFA_Read ( mplFileRef, &proMark.mShotMark.mShotMark, 1); LFA_Read ( mplFileRef, &proMark.mShotMark.mFillItem, 3); return true; } // ================================================================================================= // ReadAVCCAM_blkPRO_Access -- read Panasonic's proprietary PRO_Access block // ============ static bool ReadAVCCAM_blkPRO_Access ( LFA_FileRef& mplFileRef, AVCCAM_blkProPlayListMark& proMark ) { proMark.mAccess.mPresent = 1; LFA_Read ( mplFileRef, &proMark.mAccess.mCreatorCharacterSet, 1 ); LFA_Read ( mplFileRef, &proMark.mAccess.mCreatorLength, 1 ); LFA_Read ( mplFileRef, &proMark.mAccess.mCreator, 32 ); LFA_Read ( mplFileRef, &proMark.mAccess.mLastUpdatePersonCharacterSet, 1 ); LFA_Read ( mplFileRef, &proMark.mAccess.mLastUpdatePersonLength, 1 ); LFA_Read ( mplFileRef, &proMark.mAccess.mLastUpdatePerson, 32 ); return true; } // ================================================================================================= // ReadAVCCAM_blkPRO_Device -- read Panasonic's proprietary PRO_Device block // ============ static bool ReadAVCCAM_blkPRO_Device ( LFA_FileRef& mplFileRef, AVCCAM_blkProPlayListMark& proMark ) { proMark.mDevice.mPresent = 1; proMark.mDevice.mMakerID = LFA_ReadUns16_BE ( mplFileRef ); proMark.mDevice.mMakerModelCode = LFA_ReadUns16_BE ( mplFileRef ); LFA_Read ( mplFileRef, &proMark.mDevice.mSerialNoCharacterCode, 1 ); LFA_Read ( mplFileRef, &proMark.mDevice.mSerialNoLength, 1 ); LFA_Read ( mplFileRef, &proMark.mDevice.mSerialNo, 24 ); LFA_Read ( mplFileRef, &proMark.mDevice.mFillItem, 2 ); return true; } // ================================================================================================= // ReadAVCCAM_blkPRO_Shoot -- read Panasonic's proprietary PRO_Shoot block // ============ static bool ReadAVCCAM_blkPRO_Shoot ( LFA_FileRef& mplFileRef, AVCCAM_blkProPlayListMark& proMark ) { proMark.mShoot.mPresent = 1; LFA_Read ( mplFileRef, &proMark.mShoot.mShooterCharacterSet, 1 ); LFA_Read ( mplFileRef, &proMark.mShoot.mShooterLength, 1 ); LFA_Read ( mplFileRef, &proMark.mShoot.mShooter, 32 ); LFA_Read ( mplFileRef, &proMark.mShoot.mStartDateTimeZone, 1 ); LFA_Read ( mplFileRef, &proMark.mShoot.mStartDate, 7 ); LFA_Read ( mplFileRef, &proMark.mShoot.mEndDateTimeZone, 1 ); LFA_Read ( mplFileRef, &proMark.mShoot.mEndDate, 7 ); LFA_Read ( mplFileRef, &proMark.mShoot.mFillItem, 2 ); return true; } // ================================================================================================= // ReadAVCCAM_blkPRO_Location -- read Panasonic's proprietary PRO_Location block // ============ static bool ReadAVCCAM_blkPRO_Location ( LFA_FileRef& mplFileRef, AVCCAM_blkProPlayListMark& proMark ) { proMark.mLocation.mPresent = 1; LFA_Read ( mplFileRef, &proMark.mLocation.mSource, 1 ); proMark.mLocation.mGPSLatitudeRef = LFA_ReadUns32_BE ( mplFileRef ); proMark.mLocation.mGPSLatitude1 = LFA_ReadUns32_BE ( mplFileRef ); proMark.mLocation.mGPSLatitude2 = LFA_ReadUns32_BE ( mplFileRef ); proMark.mLocation.mGPSLatitude3 = LFA_ReadUns32_BE ( mplFileRef ); proMark.mLocation.mGPSLongitudeRef = LFA_ReadUns32_BE ( mplFileRef ); proMark.mLocation.mGPSLongitude1 = LFA_ReadUns32_BE ( mplFileRef ); proMark.mLocation.mGPSLongitude2 = LFA_ReadUns32_BE ( mplFileRef ); proMark.mLocation.mGPSLongitude3 = LFA_ReadUns32_BE ( mplFileRef ); proMark.mLocation.mGPSAltitudeRef = LFA_ReadUns32_BE ( mplFileRef ); proMark.mLocation.mGPSAltitude = LFA_ReadUns32_BE ( mplFileRef ); LFA_Read ( mplFileRef, &proMark.mLocation.mPlaceNameCharacterSet, 1 ); LFA_Read ( mplFileRef, &proMark.mLocation.mPlaceNameLength, 1 ); LFA_Read ( mplFileRef, &proMark.mLocation.mPlaceName, 64 ); LFA_Read ( mplFileRef, &proMark.mLocation.mFillItem, 1 ); return true; } // ================================================================================================= // ReadAVCCAMProPlaylistInfo -- read Panasonic's proprietary PRO_PlayListInfo block // ============ static bool ReadAVCCAMProPlaylistInfo ( LFA_FileRef& mplFileRef, XMP_Uns8 tagID, XMP_Uns16 playlistMarkID, AVCHD_blkPanasonicPrivateData& extensionDataHeader ) { AVCCAM_Pro_PlayListInfo& playlistBlock = extensionDataHeader.mProPlaylistInfoBlock; playlistBlock.mTagID = tagID; LFA_Read ( mplFileRef, &playlistBlock.mTagVersion, 1); LFA_Read ( mplFileRef, &playlistBlock.mFillItem1, 2); playlistBlock.mLength = LFA_ReadUns32_BE ( mplFileRef ); playlistBlock.mNumberOfPlayListMarks = LFA_ReadUns16_BE ( mplFileRef ); LFA_Read ( mplFileRef, &playlistBlock.mFillItem2, 2); if ( playlistBlock.mNumberOfPlayListMarks == 0 ) return true; extensionDataHeader.mPresent = 1; XMP_Uns64 blockStart = 0; for ( int i = 0; i < playlistBlock.mNumberOfPlayListMarks; ++i ) { AVCCAM_blkProPlayListMark& currMark = playlistBlock.mPlayListMark; LFA_Read ( mplFileRef, &currMark.mProTagID, 1); LFA_Read ( mplFileRef, &currMark.mFillItem1, 1); currMark.mLength = LFA_ReadUns16_BE ( mplFileRef ); blockStart = LFA_Tell ( mplFileRef ); LFA_Read ( mplFileRef, &currMark.mMarkType, 1 ); if ( ( currMark.mProTagID == 0x40 ) && ( currMark.mMarkType == 0x01 ) ) { LFA_Read ( mplFileRef, &currMark.mEntryMark.mGlobalClipID, 32); // skip marks for different clips if ( i == playlistMarkID ) { playlistBlock.mPresent = 1; currMark.mPresent = 1; LFA_Read ( mplFileRef, &currMark.mEntryMark.mStartTimeCode, 4); LFA_Read ( mplFileRef, &currMark.mEntryMark.mStreamTimecodeInfo, 1); LFA_Read ( mplFileRef, &currMark.mEntryMark.mStartBinaryGroup, 4); LFA_Read ( mplFileRef, &currMark.mEntryMark.mLastUpdateTimeZone, 1); LFA_Read ( mplFileRef, &currMark.mEntryMark.mLastUpdateDate, 7); LFA_Read ( mplFileRef, &currMark.mEntryMark.mFillItem, 2); XMP_Uns64 currPos = LFA_Tell ( mplFileRef ); XMP_Uns8 blockTag = 0; XMP_Uns8 blockFill; XMP_Uns16 blockLength = 0; while ( currPos < ( blockStart + currMark.mLength ) ) { LFA_Read ( mplFileRef, &blockTag, 1); LFA_Read ( mplFileRef, &blockFill, 1); blockLength = LFA_ReadUns16_BE ( mplFileRef ); currPos += 4; switch ( blockTag ) { case 0x20: if ( ! ReadAVCCAM_blkPRO_ShotMark ( mplFileRef, currMark ) ) return false; break; case 0x21: if ( ! ReadAVCCAM_blkPRO_Access ( mplFileRef, currMark ) ) return false; break; case 0x22: if ( ! ReadAVCCAM_blkPRO_Device ( mplFileRef, currMark ) ) return false; break; case 0x23: if ( ! ReadAVCCAM_blkPRO_Shoot ( mplFileRef, currMark ) ) return false; break; case 0x24: if (! ReadAVCCAM_blkPRO_Location ( mplFileRef, currMark ) ) return false; break; default : break; } currPos += blockLength; LFA_Seek ( mplFileRef, currPos, SEEK_SET ); } } } LFA_Seek ( mplFileRef, blockStart + currMark.mLength, SEEK_SET ); } return true; } // ================================================================================================= // ReadAVCCAMMakersPrivateData -- read Panasonic's implementation of an AVCCAM "Maker's Private Data" // block. Panasonic calls their extensions "AVCCAM." // ============ static bool ReadAVCCAMMakersPrivateData ( LFA_FileRef& fileRef, XMP_Uns16 playlistMarkID, AVCHD_blkPanasonicPrivateData& avccamPrivateData ) { const XMP_Uns64 blockStart = LFA_Tell(fileRef); avccamPrivateData.mNumberOfData = LFA_ReadUns16_BE ( fileRef ); LFA_Read ( fileRef, &avccamPrivateData.mReserved, 2 ); for (int i = 0; i < avccamPrivateData.mNumberOfData; ++i) { const XMP_Uns8 tagID = LFA_ReadUns8 ( fileRef ); switch ( tagID ) { case 0xe0: ReadAVCCAMProMetaID ( fileRef, tagID, avccamPrivateData ); break; case 0xe2: ReadAVCCAMProClipInfo( fileRef, tagID, avccamPrivateData ); break; case 0xf0: ReadAVCCAMProPlaylistInfo( fileRef, tagID, playlistMarkID, avccamPrivateData ); break; default: // Ignore any blocks we don't now or care about break; } } return true; } // ================================================================================================= // ReadAVCHDMakersPrivateData (AVCHD Format. Book 2: Recording Extension Specifications, section 4.2.4.2) // ============ static bool ReadAVCHDMakersPrivateData ( LFA_FileRef& mplFileRef, XMP_Uns16 playlistMarkID, AVCHD_blkMakersPrivateData& avchdLegacyData ) { const XMP_Uns64 blockStart = LFA_Tell ( mplFileRef ); avchdLegacyData.mLength = LFA_ReadUns32_BE ( mplFileRef ); if ( avchdLegacyData.mLength == 0 ) return false; avchdLegacyData.mPresent = 1; avchdLegacyData.mDataBlockStartAddress = LFA_ReadUns32_BE ( mplFileRef ); LFA_Read ( mplFileRef, &avchdLegacyData.mReserved, 3 ); LFA_Read ( mplFileRef, &avchdLegacyData.mNumberOfMakerEntries, 1 ); if ( avchdLegacyData.mNumberOfMakerEntries == 0 ) return true; XMP_Uns16 makerID; XMP_Uns16 makerModelCode; XMP_Uns32 mpdStartAddress; XMP_Uns32 mpdLength; for ( int i = 0; i < avchdLegacyData.mNumberOfMakerEntries; ++i ) { makerID = LFA_ReadUns16_BE ( mplFileRef ); makerModelCode = LFA_ReadUns16_BE ( mplFileRef ); mpdStartAddress = LFA_ReadUns32_BE ( mplFileRef ); mpdLength = LFA_ReadUns32_BE ( mplFileRef ); // We only have documentation for Panasonic's Maker's Private Data blocks, so we'll ignore everyone else's if ( makerID == kMakerIDPanasonic ) { avchdLegacyData.mMakerID = makerID; avchdLegacyData.mMakerModelCode = makerModelCode; LFA_Seek ( mplFileRef, blockStart + mpdStartAddress, SEEK_SET ); if (! ReadAVCCAMMakersPrivateData ( mplFileRef, playlistMarkID, avchdLegacyData.mPanasonicPrivateData ) ) return false; } } return true; } // ================================================================================================= // ReadAVCHDClipExtensionData // ============ static bool ReadAVCHDClipExtensionData ( LFA_FileRef& cpiFileRef, AVCHD_blkClipExtensionData& avchdExtensionData ) { const XMP_Int64 extensionBlockStart = LFA_Tell ( cpiFileRef ); AVCHD_blkExtensionData extensionDataHeader; if ( ! ReadAVCHDExtensionData ( cpiFileRef, extensionDataHeader ) ) { return false; } if ( extensionDataHeader.mLength == 0 ) { return true; } const XMP_Int64 dataBlockStart = extensionBlockStart + extensionDataHeader.mDataBlockStartAddress; LFA_Seek ( cpiFileRef, dataBlockStart, SEEK_SET ); LFA_Read ( cpiFileRef, avchdExtensionData.mTypeIndicator, 4 ); if ( strncmp ( reinterpret_cast( avchdExtensionData.mTypeIndicator ), "CLEX", 4 ) != 0 ) return false; avchdExtensionData.mPresent = 1; LFA_Read ( cpiFileRef, avchdExtensionData.mReserved1, 4 ); avchdExtensionData.mProgramInfoExtStartAddress = LFA_ReadUns32_BE ( cpiFileRef ); avchdExtensionData.mMakersPrivateDataStartAddress = LFA_ReadUns32_BE ( cpiFileRef ); // read Clip info extension LFA_Seek ( cpiFileRef, dataBlockStart + 40, SEEK_SET ); avchdExtensionData.mClipInfoExt.mLength = LFA_ReadUns32_BE ( cpiFileRef ); avchdExtensionData.mClipInfoExt.mMakerID = LFA_ReadUns16_BE ( cpiFileRef ); avchdExtensionData.mClipInfoExt.mMakerModelCode = LFA_ReadUns16_BE ( cpiFileRef ); if ( avchdExtensionData.mMakersPrivateDataStartAddress == 0 ) return true; if ( avchdExtensionData.mClipInfoExt.mMakerID == kMakerIDPanasonic ) { // Read Maker's Private Data block -- we only have Panasonic's definition for their AVCCAM models // at this point, so we'll ignore the block if its from a different manufacturer. LFA_Seek ( cpiFileRef, dataBlockStart + avchdExtensionData.mMakersPrivateDataStartAddress, SEEK_SET ); if ( ! ReadAVCHDMakersPrivateData ( cpiFileRef, 0, avchdExtensionData.mMakersPrivateData ) ) { return false; } } return true; } // ================================================================================================= // AVCHD_PlaylistContainsClip -- returns true of the specified AVCHD playlist block references the // specified clip, or false if not. // ==================== static bool AVCHD_PlaylistContainsClip ( LFA_FileRef& mplFileRef, XMP_Uns16& playItemID, const std::string& strClipName ) { // Read clip header. ( AVCHD Format. Book1. v. 1.01. p 45 ) struct AVCHD_blkPlayList { XMP_Uns32 mLength; XMP_Uns16 mReserved; XMP_Uns16 mNumberOfPlayItems; XMP_Uns16 mNumberOfSubPaths; }; AVCHD_blkPlayList blkPlayList; blkPlayList.mLength = LFA_ReadUns32_BE ( mplFileRef ); LFA_Read ( mplFileRef, &blkPlayList.mReserved, 2 ); blkPlayList.mNumberOfPlayItems = LFA_ReadUns16_BE ( mplFileRef ); blkPlayList.mNumberOfSubPaths = LFA_ReadUns16_BE ( mplFileRef ); // Search the play items. ( AVCHD Format. Book1. v. 1.01. p 47 ) struct AVCHD_blkPlayItem { XMP_Uns16 mLength; char mClipInformationFileName[5]; // Note: remaining fields omitted because we don't care about them }; AVCHD_blkPlayItem currPlayItem; XMP_Uns64 blockStart = 0; for ( playItemID = 0; playItemID < blkPlayList.mNumberOfPlayItems; ++playItemID ) { currPlayItem.mLength = LFA_ReadUns16_BE ( mplFileRef ); // mLength is measured from the end of mLength, not the start of the block ( AVCHD Format. Book1. v. 1.01. p 47 ) blockStart = LFA_Tell ( mplFileRef ); LFA_Read ( mplFileRef, currPlayItem.mClipInformationFileName, 5 ); if ( strncmp ( strClipName.c_str(), currPlayItem.mClipInformationFileName, 5 ) == 0 ) return true; LFA_Seek ( mplFileRef, blockStart + currPlayItem.mLength, SEEK_SET ); } return false; } // ================================================================================================= // ReadAVCHDPlaylistMetadataBlock // ============ static bool ReadAVCHDPlaylistMetadataBlock ( LFA_FileRef& mplFileRef, AVCHD_blkPlaylistMeta& avchdLegacyData ) { avchdLegacyData.mLength = LFA_ReadUns32_BE ( mplFileRef ); if ( avchdLegacyData.mLength < sizeof ( AVCHD_blkPlaylistMeta ) ) return false; avchdLegacyData.mMakerID = LFA_ReadUns16_BE ( mplFileRef ); avchdLegacyData.mMakerModelCode = LFA_ReadUns16_BE ( mplFileRef ); LFA_Read ( mplFileRef, &avchdLegacyData.mReserved1, 4 ); avchdLegacyData.mRefToMenuThumbnailIndex = LFA_ReadUns16_BE ( mplFileRef ); LFA_Read ( mplFileRef, &avchdLegacyData.mBlkTimezone, 1 ); LFA_Read ( mplFileRef, &avchdLegacyData.mRecordDataAndTime, 7 ); LFA_Read ( mplFileRef, &avchdLegacyData.mReserved2, 1 ); LFA_Read ( mplFileRef, &avchdLegacyData.mPlaylistCharacterSet, 1 ); LFA_Read ( mplFileRef, &avchdLegacyData.mPlaylistNameLength, 1 ); LFA_Read ( mplFileRef, &avchdLegacyData.mPlaylistName, avchdLegacyData.mPlaylistNameLength ); return true; } // ================================================================================================= // ReadAVCHDPlaylistMarkExtension // ============ static bool ReadAVCHDPlaylistMarkExtension ( LFA_FileRef& mplFileRef, XMP_Uns16 playlistMarkID, AVCHD_blkPlayListMarkExt& avchdLegacyData ) { avchdLegacyData.mLength = LFA_ReadUns32_BE ( mplFileRef ); if ( avchdLegacyData.mLength == 0 ) return false; avchdLegacyData.mNumberOfPlaylistMarks = LFA_ReadUns16_BE ( mplFileRef ); if ( avchdLegacyData.mNumberOfPlaylistMarks <= playlistMarkID ) return true; // Number of bytes in blkMarkExtension, AVCHD Book 2, section 4.3.3.1 const XMP_Uns64 markExtensionSize = 66; // Entries in the mark extension block correspond one-to-one with entries in // blkPlaylistMark, so we'll only read the one that corresponds to the // chosen clip. const XMP_Uns64 markOffset = markExtensionSize * playlistMarkID; avchdLegacyData.mPresent = 1; LFA_Seek ( mplFileRef, markOffset, SEEK_CUR ); avchdLegacyData.mMakerID = LFA_ReadUns16_BE ( mplFileRef ); avchdLegacyData.mMakerModelCode = LFA_ReadUns16_BE ( mplFileRef ); LFA_Read ( mplFileRef, &avchdLegacyData.mReserved1, 3 ); LFA_Read ( mplFileRef, &avchdLegacyData.mFlags, 1 ); avchdLegacyData.mRefToMarkThumbnailIndex = LFA_ReadUns16_BE ( mplFileRef ); LFA_Read ( mplFileRef, &avchdLegacyData.mBlkTimezone, 1 ); LFA_Read ( mplFileRef, &avchdLegacyData.mRecordDataAndTime, 7 ); LFA_Read ( mplFileRef, &avchdLegacyData.mMarkCharacterSet, 1 ); LFA_Read ( mplFileRef, &avchdLegacyData.mMarkNameLength, 1 ); LFA_Read ( mplFileRef, &avchdLegacyData.mMarkName, 24 ); LFA_Read ( mplFileRef, &avchdLegacyData.mMakersInformation, 16 ); LFA_Read ( mplFileRef, &avchdLegacyData.mBlkTimecode, 4 ); LFA_Read ( mplFileRef, &avchdLegacyData.mReserved2, 2 ); return true; } // ================================================================================================= // ReadAVCHDPlaylistMarkID -- read the playlist mark block to find the ID of the playlist mark that // matches the specified playlist item. // ============ static bool ReadAVCHDPlaylistMarkID ( LFA_FileRef& mplFileRef, XMP_Uns16 playItemID, XMP_Uns16& markID ) { XMP_Uns32 length = LFA_ReadUns32_BE ( mplFileRef ); XMP_Uns16 numberOfPlayListMarks = LFA_ReadUns16_BE ( mplFileRef ); if ( length == 0 ) return false; XMP_Uns8 reserved; XMP_Uns8 markType; XMP_Uns16 refToPlayItemID; for ( int i = 0; i < numberOfPlayListMarks; ++i ) { LFA_Read ( mplFileRef, &reserved, 1 ); LFA_Read ( mplFileRef, &markType, 1 ); refToPlayItemID = LFA_ReadUns16_BE ( mplFileRef ); if ( ( markType == 0x01 ) && ( refToPlayItemID == playItemID ) ) { markID = i; return true; } LFA_Seek ( mplFileRef, 10, SEEK_CUR ); } return false; } // ================================================================================================= // ReadAVCHDPlaylistExtensionData // ============ static bool ReadAVCHDPlaylistExtensionData ( LFA_FileRef& mplFileRef, AVCHD_LegacyMetadata& avchdLegacyData, XMP_Uns16 playlistMarkID ) { const XMP_Int64 extensionBlockStart = LFA_Tell ( mplFileRef ); AVCHD_blkExtensionData extensionDataHeader; if ( ! ReadAVCHDExtensionData ( mplFileRef, extensionDataHeader ) ) { return false; } if ( extensionDataHeader.mLength == 0 ) { return true; } const XMP_Int64 dataBlockStart = extensionBlockStart + extensionDataHeader.mDataBlockStartAddress; AVCHD_blkPlayListExtensionData& extensionData = avchdLegacyData.mPlaylistExtensionData; const int reserved2Len = 24; LFA_Seek ( mplFileRef, dataBlockStart, SEEK_SET ); LFA_Read ( mplFileRef, extensionData.mTypeIndicator, 4 ); if ( strncmp ( extensionData.mTypeIndicator, "PLEX", 4 ) != 0 ) return false; extensionData.mPresent = true; LFA_Read ( mplFileRef, extensionData.mReserved, 4 ); extensionData.mPlayListMarkExtStartAddress = LFA_ReadUns32_BE ( mplFileRef ); extensionData.mMakersPrivateDataStartAddress = LFA_ReadUns32_BE ( mplFileRef ); LFA_Seek ( mplFileRef, reserved2Len, SEEK_CUR ); if ( ! ReadAVCHDPlaylistMetadataBlock ( mplFileRef, extensionData.mPlaylistMeta ) ) return false; LFA_Seek ( mplFileRef, dataBlockStart + extensionData.mPlayListMarkExtStartAddress, SEEK_SET ); if ( ! ReadAVCHDPlaylistMarkExtension ( mplFileRef, playlistMarkID, extensionData.mPlaylistMarkExt ) ) return false; if ( extensionData.mMakersPrivateDataStartAddress > 0 ) { if ( ! avchdLegacyData.mClipExtensionData.mMakersPrivateData.mPanasonicPrivateData.mPresent ) return false; LFA_Seek ( mplFileRef, dataBlockStart + extensionData.mMakersPrivateDataStartAddress, SEEK_SET ); if ( ! ReadAVCHDMakersPrivateData ( mplFileRef, playlistMarkID, extensionData.mMakersPrivateData ) ) return false; } return true; } // ================================================================================================= // ReadAVCHDLegacyClipFile -- read the legacy metadata stored in an AVCHD .CPI file // ==================== static bool ReadAVCHDLegacyClipFile ( const std::string& strPath, AVCHD_LegacyMetadata& avchdLegacyData ) { bool success = false; try { AutoFile cpiFile; cpiFile.fileRef = LFA_Open ( strPath.c_str(), 'r' ); if ( cpiFile.fileRef == 0 ) return false; // The open failed. memset ( &avchdLegacyData, 0, sizeof(AVCHD_LegacyMetadata) ); // Read clip header. ( AVCHD Format. Book1. v. 1.01. p 64 ) struct AVCHD_ClipInfoHeader { char mTypeIndicator[4]; char mTypeIndicator2[4]; XMP_Uns32 mSequenceInfoStartAddress; XMP_Uns32 mProgramInfoStartAddress; XMP_Uns32 mCPIStartAddress; XMP_Uns32 mClipMarkStartAddress; XMP_Uns32 mExtensionDataStartAddress; XMP_Uns8 mReserved[12]; }; // Read the AVCHD header. AVCHD_ClipInfoHeader avchdHeader; LFA_Read ( cpiFile.fileRef, avchdHeader.mTypeIndicator, 4 ); LFA_Read ( cpiFile.fileRef, avchdHeader.mTypeIndicator2, 4 ); if ( strncmp ( avchdHeader.mTypeIndicator, "HDMV", 4 ) != 0 ) return false; if ( strncmp ( avchdHeader.mTypeIndicator2, "0100", 4 ) != 0 ) return false; avchdHeader.mSequenceInfoStartAddress = LFA_ReadUns32_BE ( cpiFile.fileRef ); avchdHeader.mProgramInfoStartAddress = LFA_ReadUns32_BE ( cpiFile.fileRef ); avchdHeader.mCPIStartAddress = LFA_ReadUns32_BE ( cpiFile.fileRef ); avchdHeader.mClipMarkStartAddress = LFA_ReadUns32_BE ( cpiFile.fileRef ); avchdHeader.mExtensionDataStartAddress = LFA_ReadUns32_BE ( cpiFile.fileRef ); LFA_Read ( cpiFile.fileRef, avchdHeader.mReserved, 12 ); // Seek to the program header. (AVCHD Format. Book1. v. 1.01. p 77 ) LFA_Seek ( cpiFile.fileRef, avchdHeader.mProgramInfoStartAddress, SEEK_SET ); // Read the program info block success = ReadAVCHDProgramInfo ( cpiFile.fileRef, avchdLegacyData.mProgramInfo ); if ( success && ( avchdHeader.mExtensionDataStartAddress != 0 ) ) { // Seek to the program header. (AVCHD Format. Book1. v. 1.01. p 77 ) LFA_Seek ( cpiFile.fileRef, avchdHeader.mExtensionDataStartAddress, SEEK_SET ); success = ReadAVCHDClipExtensionData ( cpiFile.fileRef, avchdLegacyData.mClipExtensionData ); } } catch ( ... ) { return false; } return success; } // ================================================================================================= // ReadAVCHDLegacyPlaylistFile -- read the legacy metadata stored in an AVCHD .MPL file // ==================== static bool ReadAVCHDLegacyPlaylistFile ( const std::string& strRootPath, const std::string& strClipName, AVCHD_LegacyMetadata& avchdLegacyData ) { bool success = false; std::string mplPath; char playlistName [10]; const int rootPlaylistNum = atoi(strClipName.c_str()); // Find the corresponding .MPL file -- because of clip spanning the .MPL name may not match the .CPI name for // a given clip -- we need to open .MPL files and look for one that contains a reference to the clip name. To speed // up the search we'll start with the playlist with the same number/name as the clip and search backwards. Assuming // this directory was generated by a camera, the clip numbers will increase sequentially across the playlist files, // though one playlist file may reference more than one clip. for ( int i = rootPlaylistNum; i >= 0; --i ) { sprintf ( playlistName, "%05d", i ); if ( MakeLeafPath ( &mplPath, strRootPath.c_str(), "PLAYLIST", playlistName, ".mpl", true /* checkFile */ ) ) { try { AutoFile mplFile; mplFile.fileRef = LFA_Open ( mplPath.c_str(), 'r' ); if ( mplFile.fileRef == 0 ) return false; // The open failed. // Read playlist header. ( AVCHD Format. Book1. v. 1.01. p 43 ) struct AVCHD_PlaylistFileHeader { char mTypeIndicator[4]; char mTypeIndicator2[4]; XMP_Uns32 mPlaylistStartAddress; XMP_Uns32 mPlaylistMarkStartAddress; XMP_Uns32 mExtensionDataStartAddress; }; // Read the AVCHD playlist file header. AVCHD_PlaylistFileHeader avchdHeader; LFA_Read ( mplFile.fileRef, avchdHeader.mTypeIndicator, 4 ); LFA_Read ( mplFile.fileRef, avchdHeader.mTypeIndicator2, 4 ); if ( strncmp ( avchdHeader.mTypeIndicator, "MPLS", 4 ) != 0 ) return false; if ( strncmp ( avchdHeader.mTypeIndicator2, "0100", 4 ) != 0 ) return false; avchdHeader.mPlaylistStartAddress = LFA_ReadUns32_BE ( mplFile.fileRef ); avchdHeader.mPlaylistMarkStartAddress = LFA_ReadUns32_BE ( mplFile.fileRef ); avchdHeader.mExtensionDataStartAddress = LFA_ReadUns32_BE ( mplFile.fileRef ); if ( avchdHeader.mExtensionDataStartAddress == 0 ) return false; // Seek to the start of the Playlist block. (AVCHD Format. Book1. v. 1.01. p 45 ) LFA_Seek ( mplFile.fileRef, avchdHeader.mPlaylistStartAddress, SEEK_SET ); XMP_Uns16 playItemID = 0xFFFF; XMP_Uns16 playlistMarkID = 0xFFFF; if ( AVCHD_PlaylistContainsClip ( mplFile.fileRef, playItemID, strClipName ) ) { LFA_Seek ( mplFile.fileRef, avchdHeader.mPlaylistMarkStartAddress, SEEK_SET ); if ( ! ReadAVCHDPlaylistMarkID ( mplFile.fileRef, playItemID, playlistMarkID ) ) return false; LFA_Seek ( mplFile.fileRef, avchdHeader.mExtensionDataStartAddress, SEEK_SET ); success = ReadAVCHDPlaylistExtensionData ( mplFile.fileRef, avchdLegacyData, playlistMarkID ); } } catch ( ... ) { return false; } } } return success; } // ================================================================================================= // ReadAVCHDLegacyMetadata -- read the legacy metadata stored in an AVCHD .CPI file // ==================== static bool ReadAVCHDLegacyMetadata ( const std::string& strPath, const std::string& strRootPath, const std::string& strClipName, AVCHD_LegacyMetadata& avchdLegacyData ) { bool success = ReadAVCHDLegacyClipFile ( strPath, avchdLegacyData ); if ( success && avchdLegacyData.mClipExtensionData.mPresent ) { success = ReadAVCHDLegacyPlaylistFile ( strRootPath, strClipName, avchdLegacyData ); } return success; } // ReadAVCHDLegacyMetadata // ================================================================================================= // AVCCAM_SetXMPStartTimecode // ============================= static void AVCCAM_SetXMPStartTimecode ( SXMPMeta& xmpObj, const XMP_Uns8* avccamTimecode, XMP_Uns8 avchdFrameRate ) { // Timecode in SMPTE 12M format, according to Panasonic's documentation if ( *reinterpret_cast( avccamTimecode ) == 0xFFFFFFFF ) { // 0xFFFFFFFF means timecode not specified return; } const XMP_Uns8 isColor = ( avccamTimecode[0] >> 7 ) & 0x01; const XMP_Uns8 isDropFrame = ( avccamTimecode[0] >> 6 ) & 0x01; const XMP_Uns8 frameTens = ( avccamTimecode[0] >> 4 ) & 0x03; const XMP_Uns8 frameUnits = avccamTimecode[0] & 0x0f; const XMP_Uns8 secondTens = ( avccamTimecode[1] >> 4 ) & 0x07; const XMP_Uns8 secondUnits = avccamTimecode[1] & 0x0f; const XMP_Uns8 minuteTens = ( avccamTimecode[2] >> 4 ) & 0x07; const XMP_Uns8 minuteUnits = avccamTimecode[2] & 0x0f; const XMP_Uns8 hourTens = ( avccamTimecode[3] >> 4 ) & 0x03; const XMP_Uns8 hourUnits = avccamTimecode[3] & 0x0f; char tcSeparator = ':'; const char* dmTimeFormat = NULL; const char* dmTimeScale = NULL; const char* dmTimeSampleSize = NULL; switch ( avchdFrameRate ) { case 1 : // 23.976i dmTimeFormat = "23976Timecode"; dmTimeScale = "24000"; dmTimeSampleSize = "1001"; break; case 2 : // 24p dmTimeFormat = "24Timecode"; dmTimeScale = "24"; dmTimeSampleSize = "1"; break; case 3 : case 6 : // 50i or 25p dmTimeFormat = "25Timecode"; dmTimeScale = "25"; dmTimeSampleSize = "1"; break; case 4 : case 7 : // 29.97p or 59.94i if ( isDropFrame ) { dmTimeFormat = "2997DropTimecode"; tcSeparator = ';'; } else { dmTimeFormat = "2997NonDropTimecode"; } dmTimeScale = "30000"; dmTimeSampleSize = "1001"; break; } if ( dmTimeFormat != NULL ) { char timecodeBuff [12]; sprintf ( timecodeBuff, "%d%d%c%d%d%c%d%d%c%d%d", hourTens, hourUnits, tcSeparator, minuteTens, minuteUnits, tcSeparator, secondTens, secondUnits, tcSeparator, frameTens, frameUnits); xmpObj.SetProperty( kXMP_NS_DM, "startTimeScale", dmTimeScale, kXMP_DeleteExisting ); xmpObj.SetProperty( kXMP_NS_DM, "startTimeSampleSize", dmTimeSampleSize, kXMP_DeleteExisting ); xmpObj.SetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeValue", timecodeBuff, 0 ); xmpObj.SetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeFormat", dmTimeFormat, 0 ); } } // ================================================================================================= // AVCHD_SetXMPMakeAndModel // ============================= static bool AVCHD_SetXMPMakeAndModel ( SXMPMeta& xmpObj, const AVCHD_blkClipExtensionData& clipExtData ) { if ( ! clipExtData.mPresent ) return false; XMP_StringPtr xmpValue = 0; // Set the Make. Use a hex string for unknown makes. { char hexMakeNumber [7]; switch ( clipExtData.mClipInfoExt.mMakerID ) { case kMakerIDCanon : xmpValue = "Canon"; break; case kMakerIDPanasonic : xmpValue = "Panasonic"; break; case kMakerIDSony : xmpValue = "Sony"; break; default : std::sprintf ( hexMakeNumber, "0x%04x", clipExtData.mClipInfoExt.mMakerID ); xmpValue = hexMakeNumber; break; } xmpObj.SetProperty ( kXMP_NS_TIFF, "Make", xmpValue, kXMP_DeleteExisting ); } // Set the Model number. Use a hex string for unknown model numbers so they can still be distinguished. { char hexModelNumber [7]; xmpValue = 0; switch ( clipExtData.mClipInfoExt.mMakerID ) { case kMakerIDCanon : switch ( clipExtData.mClipInfoExt.mMakerModelCode ) { case 0x1000 : xmpValue = "HR10"; break; case 0x2000 : xmpValue = "HG10"; break; case 0x2001 : xmpValue = "HG21"; break; case 0x3000 : xmpValue = "HF100"; break; case 0x3003 : xmpValue = "HF S10"; break; default : break; } break; case kMakerIDPanasonic : switch ( clipExtData.mClipInfoExt.mMakerModelCode ) { case 0x0202 : xmpValue = "HD-writer"; break; case 0x0400 : xmpValue = "AG-HSC1U"; break; case 0x0401 : xmpValue = "AG-HMC70"; break; case 0x0410 : xmpValue = "AG-HMC150"; break; case 0x0411 : xmpValue = "AG-HMC40"; break; case 0x0412 : xmpValue = "AG-HMC80"; break; case 0x0413 : xmpValue = "AG-3DA1"; break; case 0x0414 : xmpValue = "AG-AF100"; break; case 0x0450 : xmpValue = "AG-HMR10"; break; case 0x0451 : xmpValue = "AJ-YCX250"; break; case 0x0452 : xmpValue = "AG-MDR15"; break; case 0x0490 : xmpValue = "AVCCAM Restorer"; break; case 0x0491 : xmpValue = "AVCCAM Viewer"; break; case 0x0492 : xmpValue = "AVCCAM Viewer for Mac"; break; default : break; } break; default : break; } if ( ( xmpValue == 0 ) && ( clipExtData.mClipInfoExt.mMakerID != kMakerIDSony ) ) { // Panasonic has said that if we don't have a string for the model number, they'd like to see the code // anyway. We'll do the same for every manufacturer except Sony, who have said that they use // the same model number for multiple cameras. std::sprintf ( hexModelNumber, "0x%04x", clipExtData.mClipInfoExt.mMakerModelCode ); xmpValue = hexModelNumber; } if ( xmpValue != 0 ) xmpObj.SetProperty ( kXMP_NS_TIFF, "Model", xmpValue, kXMP_DeleteExisting ); } return true; } // ================================================================================================= // AVCHD_StringFieldToXMP // ============================= static std::string AVCHD_StringFieldToXMP ( XMP_Uns8 avchdLength, XMP_Uns8 avchdCharacterSet, const XMP_Uns8* avchdField, XMP_Uns8 avchdFieldSize ) { std::string xmpString; if ( avchdCharacterSet == 0x02 ) { // UTF-16, Big Endian UTF8Unit utf8Name [512]; const XMP_Uns8 avchdMaxChars = ( avchdFieldSize / 2); size_t utf16Read; size_t utf8Written; // The spec doesn't say whether AVCHD length fields count bytes or characters, so we'll // clamp to the max number of UTF-16 characters just in case. const int stringLength = ( avchdLength > avchdMaxChars ) ? avchdMaxChars : avchdLength; UTF16BE_to_UTF8 ( reinterpret_cast ( avchdField ), stringLength, utf8Name, 512, &utf16Read, &utf8Written ); xmpString.assign ( reinterpret_cast ( utf8Name ), utf8Written ); } else { // AVCHD supports many character encodings, but UTF-8 (0x01) and ASCII (0x90) are the only ones I've // seen in the wild at this point. We'll treat the other character sets as UTF-8 on the assumption that // at least a few characters will come across, and something is better than nothing. const int stringLength = ( avchdLength > avchdFieldSize ) ? avchdFieldSize : avchdLength; xmpString.assign ( reinterpret_cast ( avchdField ), stringLength ); } return xmpString; } // ================================================================================================= // AVCHD_SetXMPShotName // ============================= static void AVCHD_SetXMPShotName ( SXMPMeta& xmpObj, const AVCHD_blkPlayListMarkExt& markExt, const std::string& strClipName ) { if ( markExt.mPresent ) { const std::string shotName = AVCHD_StringFieldToXMP ( markExt.mMarkNameLength, markExt.mMarkCharacterSet, markExt.mMarkName, 24 ); if ( ! shotName.empty() ) xmpObj.SetProperty ( kXMP_NS_DC, "shotName", shotName.c_str(), kXMP_DeleteExisting ); } } // ================================================================================================= // BytesToHex // ============================= #define kHexDigits "0123456789ABCDEF" static std::string BytesToHex ( const XMP_Uns8* inClipIDBytes, int inNumBytes ) { const int numChars = ( inNumBytes * 2 ); std::string hexStr; hexStr.reserve(numChars); for ( int i = 0; i < inNumBytes; ++i ) { const XMP_Uns8 byte = inClipIDBytes[i]; hexStr.push_back ( kHexDigits [byte >> 4] ); hexStr.push_back ( kHexDigits [byte & 0xF] ); } return hexStr; } // ================================================================================================= // AVCHD_DateFieldToXMP (AVCHD Format Book 2, section 4.2.2.2) // ============================= static std::string AVCHD_DateFieldToXMP ( XMP_Uns8 avchdTimeZone, const XMP_Uns8* avchdDateTime ) { const XMP_Uns8 daylightSavingsTime = ( avchdTimeZone >> 6 ) & 0x01; const XMP_Uns8 timezoneSign = ( avchdTimeZone >> 5 ) & 0x01; const XMP_Uns8 timezoneValue = ( avchdTimeZone >> 1 ) & 0x0F; const XMP_Uns8 halfHourFlag = avchdTimeZone & 0x01; int utcOffsetHours = 0; unsigned int utcOffsetMinutes = 0; // It's not entirely clear how to interpret the daylightSavingsTime flag from the documentation -- my best // guess is that it should only be used if trying to display local time, not the UTC-relative time that // XMP specifies. if ( timezoneValue != 0xF ) { utcOffsetHours = timezoneSign ? -timezoneValue : timezoneValue; utcOffsetMinutes = 30 * halfHourFlag; } char dateBuff [26]; sprintf ( dateBuff, "%01d%01d%01d%01d-%01d%01d-%01d%01dT%01d%01d:%01d%01d:%01d%01d%+02d:%02d", (avchdDateTime[0] >> 4), (avchdDateTime[0] & 0x0F), (avchdDateTime[1] >> 4), (avchdDateTime[1] & 0x0F), (avchdDateTime[2] >> 4), (avchdDateTime[2] & 0x0F), (avchdDateTime[3] >> 4), (avchdDateTime[3] & 0x0F), (avchdDateTime[4] >> 4), (avchdDateTime[4] & 0x0F), (avchdDateTime[5] >> 4), (avchdDateTime[5] & 0x0F), (avchdDateTime[6] >> 4), (avchdDateTime[6] & 0x0F), utcOffsetHours, utcOffsetMinutes ); return std::string(dateBuff); } // ================================================================================================= // AVCHD_MetaHandlerCTor // ===================== XMPFileHandler * AVCHD_MetaHandlerCTor ( XMPFiles * parent ) { return new AVCHD_MetaHandler ( parent ); } // AVCHD_MetaHandlerCTor // ================================================================================================= // AVCHD_MetaHandler::AVCHD_MetaHandler // ==================================== AVCHD_MetaHandler::AVCHD_MetaHandler ( XMPFiles * _parent ) { this->parent = _parent; // Inherited, can't set in the prefix. this->handlerFlags = kAVCHD_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; // Extract the root path and clip name. XMP_Assert ( this->parent->tempPtr != 0 ); this->rootPath.assign ( (char*) this->parent->tempPtr ); free ( this->parent->tempPtr ); this->parent->tempPtr = 0; SplitLeafName ( &this->rootPath, &this->clipName ); } // AVCHD_MetaHandler::AVCHD_MetaHandler // ================================================================================================= // AVCHD_MetaHandler::~AVCHD_MetaHandler // ===================================== AVCHD_MetaHandler::~AVCHD_MetaHandler() { if ( this->parent->tempPtr != 0 ) { free ( this->parent->tempPtr ); this->parent->tempPtr = 0; } } // AVCHD_MetaHandler::~AVCHD_MetaHandler // ================================================================================================= // AVCHD_MetaHandler::MakeClipInfoPath // =================================== bool AVCHD_MetaHandler::MakeClipInfoPath ( std::string * path, XMP_StringPtr suffix, bool checkFile /* = false */ ) const { return MakeLeafPath ( path, this->rootPath.c_str(), "CLIPINF", this->clipName.c_str(), suffix, checkFile ); } // AVCHD_MetaHandler::MakeClipInfoPath // ================================================================================================= // AVCHD_MetaHandler::MakeClipStreamPath // ===================================== bool AVCHD_MetaHandler::MakeClipStreamPath ( std::string * path, XMP_StringPtr suffix, bool checkFile /* = false */ ) const { return MakeLeafPath ( path, this->rootPath.c_str(), "STREAM", this->clipName.c_str(), suffix, checkFile ); } // AVCHD_MetaHandler::MakeClipStreamPath // ================================================================================================= // AVCHD_MetaHandler::MakePlaylistPath // ===================================== bool AVCHD_MetaHandler::MakePlaylistPath ( std::string * path, XMP_StringPtr suffix, bool checkFile /* = false */ ) const { return MakeLeafPath ( path, this->rootPath.c_str(), "PLAYLIST", this->clipName.c_str(), suffix, checkFile ); } // AVCHD_MetaHandler::MakePlaylistPath // ================================================================================================= // AVCHD_MetaHandler::MakeLegacyDigest // =================================== void AVCHD_MetaHandler::MakeLegacyDigest ( std::string * digestStr ) { std::string strClipPath; std::string strPlaylistPath; std::vector legacyBuff; bool ok = this->MakeClipInfoPath ( &strClipPath, ".clpi", true /* checkFile */ ); if ( ! ok ) return; ok = this->MakePlaylistPath ( &strPlaylistPath, ".mpls", true /* checkFile */ ); if ( ! ok ) return; try { { AutoFile cpiFile; cpiFile.fileRef = LFA_Open ( strClipPath.c_str(), 'r' ); if ( cpiFile.fileRef == 0 ) return; // The open failed. // Read at most the first 2k of data from the cpi file to use in the digest // (every CPI file I've seen is less than 1k). const XMP_Int64 cpiLen = LFA_Measure ( cpiFile.fileRef ); const XMP_Int64 buffLen = (cpiLen <= 2048) ? cpiLen : 2048; legacyBuff.resize ( (unsigned int) buffLen ); LFA_Read ( cpiFile.fileRef, &(legacyBuff[0]), static_cast ( buffLen ) ); } { AutoFile mplFile; mplFile.fileRef = LFA_Open ( strPlaylistPath.c_str(), 'r' ); if ( mplFile.fileRef == 0 ) return; // The open failed. // Read at most the first 2k of data from the cpi file to use in the digest // (every playlist file I've seen is less than 1k). const XMP_Int64 mplLen = LFA_Measure ( mplFile.fileRef ); const XMP_Int64 buffLen = (mplLen <= 2048) ? mplLen : 2048; const XMP_Int64 clipBuffLen = legacyBuff.size(); legacyBuff.resize ( (unsigned int) (clipBuffLen + buffLen) ); LFA_Read ( mplFile.fileRef, &( legacyBuff [(unsigned int)clipBuffLen] ), (XMP_Int32)buffLen ); } } catch (...) { return; } MD5_CTX context; unsigned char digestBin [16]; MD5Init ( &context ); MD5Update ( &context, (XMP_Uns8*)&(legacyBuff[0]), (unsigned int) legacyBuff.size() ); MD5Final ( digestBin, &context ); *digestStr = BytesToHex ( digestBin, 16 ); } // AVCHD_MetaHandler::MakeLegacyDigest // ================================================================================================= // AVCHD_MetaHandler::CacheFileData // ================================ void AVCHD_MetaHandler::CacheFileData() { XMP_Assert ( ! this->containsXMP ); // See if the clip's .XMP file exists. std::string xmpPath; bool found = this->MakeClipStreamPath ( &xmpPath, ".xmp", true /* checkFile */ ); if ( ! found ) return; // Read the entire .XMP file. char openMode = 'r'; if ( this->parent->openFlags & kXMPFiles_OpenForUpdate ) openMode = 'w'; LFA_FileRef xmpFile = LFA_Open ( xmpPath.c_str(), openMode ); if ( xmpFile == 0 ) return; // The open failed. XMP_Int64 xmpLen = LFA_Measure ( xmpFile ); if ( xmpLen > 100*1024*1024 ) { XMP_Throw ( "AVCHD XMP is outrageously large", kXMPErr_InternalFailure ); // Sanity check. } this->xmpPacket.erase(); this->xmpPacket.reserve ( (size_t ) xmpLen ); this->xmpPacket.append ( (size_t ) xmpLen, ' ' ); XMP_Int32 ioCount = LFA_Read ( xmpFile, (void*)this->xmpPacket.data(), (XMP_Int32)xmpLen, kLFA_RequireAll ); XMP_Assert ( ioCount == xmpLen ); this->packetInfo.offset = 0; this->packetInfo.length = (XMP_Int32)xmpLen; FillPacketInfo ( this->xmpPacket, &this->packetInfo ); XMP_Assert ( this->parent->fileRef == 0 ); if ( openMode == 'r' ) { LFA_Close ( xmpFile ); } else { this->parent->fileRef = xmpFile; } this->containsXMP = true; } // AVCHD_MetaHandler::CacheFileData // ================================================================================================= // AVCHD_MetaHandler::ProcessXMP // ============================= void AVCHD_MetaHandler::ProcessXMP() { if ( this->processedXMP ) return; this->processedXMP = true; // Make sure only called once. if ( this->containsXMP ) { this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); } // read clip info AVCHD_LegacyMetadata avchdLegacyData; std::string strPath; bool ok = this->MakeClipInfoPath ( &strPath, ".clpi", true /* checkFile */ ); if ( ok ) ReadAVCHDLegacyMetadata ( strPath, this->rootPath, this->clipName, avchdLegacyData ); if ( ! ok ) return; const AVCHD_blkPlayListMarkExt& markExt = avchdLegacyData.mPlaylistExtensionData.mPlaylistMarkExt; XMP_Uns8 pulldownFlag = 0; if ( markExt.mPresent ) { const std::string dateString = AVCHD_DateFieldToXMP ( markExt.mBlkTimezone, markExt.mRecordDataAndTime ); if ( ! dateString.empty() ) this->xmpObj.SetProperty ( kXMP_NS_DM, "shotDate", dateString.c_str(), kXMP_DeleteExisting ); AVCHD_SetXMPShotName ( this->xmpObj, markExt, this->clipName ); AVCCAM_SetXMPStartTimecode ( this->xmpObj, markExt.mBlkTimecode, avchdLegacyData.mProgramInfo.mVideoStream.mFrameRate ); pulldownFlag = (markExt.mFlags >> 1) & 0x03; // bits 1 and 2 } // Video Stream. AVCHD Format v. 1.01 p. 78 const bool has2_2pulldown = (pulldownFlag == 0x01); const bool has3_2pulldown = (pulldownFlag == 0x10); XMP_StringPtr xmpValue = 0; if ( avchdLegacyData.mProgramInfo.mVideoStream.mPresent ) { // XMP videoFrameSize. xmpValue = 0; int frameIndex = -1; bool isProgressiveHD = false; const char* frameWidth[4] = { "720", "720", "1280", "1920" }; const char* frameHeight[4] = { "480", "576", "720", "1080" }; switch ( avchdLegacyData.mProgramInfo.mVideoStream.mVideoFormat ) { case 1 : frameIndex = 0; break; // 480i case 2 : frameIndex = 1; break; // 576i case 3 : frameIndex = 0; break; // 480p case 4 : frameIndex = 3; break; // 1080i case 5 : frameIndex = 2; isProgressiveHD = true; break; // 720p case 6 : frameIndex = 3; isProgressiveHD = true; break; // 1080p default: break; } if ( frameIndex != -1 ) { xmpValue = frameWidth[frameIndex]; this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "w", xmpValue, 0 ); xmpValue = frameHeight[frameIndex]; this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "h", xmpValue, 0 ); xmpValue = "pixels"; this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "unit", xmpValue, 0 ); } // XMP videoFrameRate. The logic below seems pretty tortured, but matches "Table 4-4 pulldown" on page 31 of Book 2 of the AVCHD // spec, if you interepret "frame_mbs_only_flag" as "isProgressiveHD", "frame-rate [Hz]" as the frame rate encoded in // mVideoStream.mFrameRate, and "Video Scan Type" as the desired xmp output value. The algorithm produces correct results for // all the AVCHD media I've tested. xmpValue = 0; if ( isProgressiveHD ) { switch ( avchdLegacyData.mProgramInfo.mVideoStream.mFrameRate ) { case 1 : xmpValue = "23.98p"; break; // "23.976" case 2 : xmpValue = "24p"; break; // "24" case 3 : xmpValue = "25p"; break; // "25" case 4 : xmpValue = has2_2pulldown ? "29.97p" : "59.94p"; break; // "29.97" case 6 : xmpValue = has2_2pulldown ? "25p" : "50p"; break; // "50" case 7 : // "59.94" if ( has2_2pulldown ) xmpValue = "29.97p"; else xmpValue = has3_2pulldown ? "23.98p" : "59.94p"; break; default: break; } } else { switch ( avchdLegacyData.mProgramInfo.mVideoStream.mFrameRate ) { case 3 : xmpValue = has2_2pulldown ? "25p" : "50i"; break; // "25" (but 1080p25 is reported as 1080i25 with 2:2 pulldown...) case 4 : // "29.97" if ( has2_2pulldown ) xmpValue = "29.97p"; else xmpValue = has3_2pulldown ? "23.98p" : "59.94i"; break; default: break; } } if ( xmpValue != 0 ) { this->xmpObj.SetProperty ( kXMP_NS_DM, "videoFrameRate", xmpValue, kXMP_DeleteExisting ); } this->containsXMP = true; } // Audio Stream. if ( avchdLegacyData.mProgramInfo.mAudioStream.mPresent ) { xmpValue = 0; switch ( avchdLegacyData.mProgramInfo.mAudioStream.mAudioPresentationType ) { case 1 : xmpValue = "Mono"; break; case 3 : xmpValue = "Stereo"; break; default : break; } if ( xmpValue != 0 ) { this->xmpObj.SetProperty ( kXMP_NS_DM, "audioChannelType", xmpValue, kXMP_DeleteExisting ); } xmpValue = 0; switch ( avchdLegacyData.mProgramInfo.mAudioStream.mSamplingFrequency ) { case 1 : xmpValue = "48000"; break; case 4 : xmpValue = "96000"; break; case 5 : xmpValue = "192000"; break; default : break; } if ( xmpValue != 0 ) { this->xmpObj.SetProperty ( kXMP_NS_DM, "audioSampleRate", xmpValue, kXMP_DeleteExisting ); } this->containsXMP = true; } // Proprietary vendor extensions if ( AVCHD_SetXMPMakeAndModel ( this->xmpObj, avchdLegacyData.mClipExtensionData ) ) this->containsXMP = true; this->xmpObj.SetProperty ( kXMP_NS_DM, "title", this->clipName.c_str(), kXMP_DeleteExisting ); this->containsXMP = true; if ( avchdLegacyData.mClipExtensionData.mMakersPrivateData.mPresent && ( avchdLegacyData.mClipExtensionData.mClipInfoExt.mMakerID == kMakerIDPanasonic ) ) { const AVCHD_blkPanasonicPrivateData& panasonicClipData = avchdLegacyData.mClipExtensionData.mMakersPrivateData.mPanasonicPrivateData; if ( panasonicClipData.mProClipIDBlock.mPresent ) { const std::string globalClipIDString = BytesToHex ( panasonicClipData.mProClipIDBlock.mGlobalClipID, 32 ); this->xmpObj.SetProperty ( kXMP_NS_DC, "identifier", globalClipIDString.c_str(), kXMP_DeleteExisting ); } const AVCHD_blkPanasonicPrivateData& panasonicPlaylistData = avchdLegacyData.mPlaylistExtensionData.mMakersPrivateData.mPanasonicPrivateData; if ( panasonicPlaylistData.mProPlaylistInfoBlock.mPlayListMark.mPresent ) { const AVCCAM_blkProPlayListMark& playlistMark = panasonicPlaylistData.mProPlaylistInfoBlock.mPlayListMark; if ( playlistMark.mShotMark.mPresent ) { // Unlike P2, where "shotmark" is a boolean, Panasonic treats their AVCCAM shotmark as a bit field with // 8 user-definable bits. For now we're going to treat any bit being set as xmpDM::good == true, and all // bits being clear as xmpDM::good == false. const bool isGood = ( playlistMark.mShotMark.mShotMark != 0 ); xmpObj.SetProperty_Bool ( kXMP_NS_DM, "good", isGood, kXMP_DeleteExisting ); } if ( playlistMark.mAccess.mPresent && ( playlistMark.mAccess.mCreatorLength > 0 ) ) { const std::string creatorString = AVCHD_StringFieldToXMP ( playlistMark.mAccess.mCreatorLength, playlistMark.mAccess.mCreatorCharacterSet, playlistMark.mAccess.mCreator, 32 ) ; if ( ! creatorString.empty() ) { xmpObj.DeleteProperty ( kXMP_NS_DC, "creator" ); xmpObj.AppendArrayItem ( kXMP_NS_DC, "creator", kXMP_PropArrayIsOrdered, creatorString.c_str() ); } } if ( playlistMark.mDevice.mPresent && ( playlistMark.mDevice.mSerialNoLength > 0 ) ) { const std::string serialNoString = AVCHD_StringFieldToXMP ( playlistMark.mDevice.mSerialNoLength, playlistMark.mDevice.mSerialNoCharacterCode, playlistMark.mDevice.mSerialNo, 24 ) ; if ( ! serialNoString.empty() ) xmpObj.SetProperty ( kXMP_NS_EXIF_Aux, "SerialNumber", serialNoString.c_str(), kXMP_DeleteExisting ); } if ( playlistMark.mLocation.mPresent && ( playlistMark.mLocation.mPlaceNameLength > 0 ) ) { const std::string placeNameString = AVCHD_StringFieldToXMP ( playlistMark.mLocation.mPlaceNameLength, playlistMark.mLocation.mPlaceNameCharacterSet, playlistMark.mLocation.mPlaceName, 64 ) ; if ( ! placeNameString.empty() ) xmpObj.SetProperty ( kXMP_NS_DM, "shotLocation", placeNameString.c_str(), kXMP_DeleteExisting ); } } } } // AVCHD_MetaHandler::ProcessXMP // ================================================================================================= // AVCHD_MetaHandler::UpdateFile // ============================= // // Note that UpdateFile is only called from XMPFiles::CloseFile, so it is OK to close the file here. void AVCHD_MetaHandler::UpdateFile ( bool doSafeUpdate ) { if ( ! this->needsUpdate ) return; this->needsUpdate = false; // Make sure only called once. std::string newDigest; this->MakeLegacyDigest ( &newDigest ); this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "AVCHD", newDigest.c_str(), kXMP_DeleteExisting ); LFA_FileRef oldFile = this->parent->fileRef; this->xmpObj.SerializeToBuffer ( &this->xmpPacket, this->GetSerializeOptions() ); if ( oldFile == 0 ) { // The XMP does not exist yet. std::string xmpPath; this->MakeClipStreamPath ( &xmpPath, ".xmp" ); LFA_FileRef xmpFile = LFA_Create ( xmpPath.c_str() ); if ( xmpFile == 0 ) XMP_Throw ( "Failure creating AVCHD XMP file", kXMPErr_ExternalFailure ); LFA_Write ( xmpFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( xmpFile ); } else if ( ! doSafeUpdate ) { // Over write the existing XMP file. LFA_Seek ( oldFile, 0, SEEK_SET ); LFA_Truncate ( oldFile, 0 ); LFA_Write ( oldFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( oldFile ); } else { // Do a safe update. // *** We really need an LFA_SwapFiles utility. std::string xmpPath, tempPath; bool found = this->MakeClipStreamPath ( &xmpPath, ".xmp", true /* checkFile */ ); if ( ! found ) XMP_Throw ( "AVCHD_MetaHandler::UpdateFile - XMP is supposed to exist", kXMPErr_InternalFailure ); CreateTempFile ( xmpPath, &tempPath ); LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' ); LFA_Write ( tempFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( tempFile ); LFA_Close ( oldFile ); LFA_Delete ( xmpPath.c_str() ); LFA_Rename ( tempPath.c_str(), xmpPath.c_str() ); } this->parent->fileRef = 0; } // AVCHD_MetaHandler::UpdateFile // ================================================================================================= // AVCHD_MetaHandler::WriteFile // ============================ void AVCHD_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { // ! WriteFile is not supposed to be called for handlers that own the file. XMP_Throw ( "AVCHD_MetaHandler::WriteFile should not be called", kXMPErr_InternalFailure ); } // AVCHD_MetaHandler::WriteFile // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/Scanner_Handler.hpp0000664000175000017500000000253212150230672020754 00000000000000#ifndef __Scanner_Handler_hpp__ #define __Scanner_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "Trivial_Handler.hpp" // ================================================================================================= /// \file Scanner_Handler.hpp /// \brief File format handler for packet scanning. /// /// This header ... /// // ================================================================================================= extern XMPFileHandler * Scanner_MetaHandlerCTor ( XMPFiles * parent ); static const XMP_OptionBits kScanner_HandlerFlags = kTrivial_HandlerFlags; class Scanner_MetaHandler : public Trivial_MetaHandler { public: Scanner_MetaHandler () {}; Scanner_MetaHandler ( XMPFiles * parent ); ~Scanner_MetaHandler(); void CacheFileData(); }; // Scanner_MetaHandler // ================================================================================================= #endif /* __Scanner_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/XDCAM_Handler.hpp0000664000175000017500000000526512150230672020225 00000000000000#ifndef __XDCAM_Handler_hpp__ #define __XDCAM_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "XMPFiles_Impl.hpp" #include "ExpatAdapter.hpp" // ================================================================================================= /// \file XDCAM_Handler.hpp /// \brief Folder format handler for XDCAM. /// /// This header ... /// // ================================================================================================= extern XMPFileHandler * XDCAM_MetaHandlerCTor ( XMPFiles * parent ); extern bool XDCAM_CheckFormat ( XMP_FileFormat format, const std::string & rootPath, const std::string & gpName, const std::string & parentName, const std::string & leafName, XMPFiles * parent ); static const XMP_OptionBits kXDCAM_HandlerFlags = (kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_CanRewrite | kXMPFiles_PrefersInPlace | kXMPFiles_CanReconcile | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_HandlerOwnsFile | kXMPFiles_AllowsSafeUpdate | kXMPFiles_FolderBasedFormat); class XDCAM_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessXMP(); XMP_OptionBits GetSerializeOptions() // *** These should be standard for standalone XMP files. { return (kXMP_UseCompactFormat | kXMP_OmitPacketWrapper); }; void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); XDCAM_MetaHandler ( XMPFiles * _parent ); virtual ~XDCAM_MetaHandler(); private: XDCAM_MetaHandler() : isFAM(false), expat(0), clipMetadata(0) {}; // Hidden on purpose. void MakeClipFilePath ( std::string * path, XMP_StringPtr suffix ); void MakeLegacyDigest ( std::string * digestStr ); void CleanupLegacyXML(); std::string rootPath, clipName, xdcNS, legacyNS; bool isFAM; ExpatAdapter * expat; XML_Node * clipMetadata; // ! Don't delete, points into the Expat tree. }; // XDCAM_MetaHandler // ================================================================================================= #endif /* __XDCAM_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/XDCAM_Handler.cpp0000664000175000017500000005656412150230672020230 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include #include "XDCAM_Handler.hpp" #include "XDCAM_Support.hpp" #include "MD5.h" using namespace std; // ================================================================================================= /// \file XDCAM_Handler.cpp /// \brief Folder format handler for XDCAM. /// /// This handler is for the XDCAM video format. This is a pseudo-package, visible files but with a very /// well-defined layout and naming rules. There are 2 different layouts for XDCAM, called FAM and SAM. /// The FAM layout is used by "normal" XDCAM devices. The SAM layout is used by XDCAM-EX devices. /// /// A typical FAM layout looks like (note mixed case for General, Clip, Edit, and Sub folders): /// /// .../MyMovie/ /// INDEX.XML /// DISCMETA.XML /// MEDIAPRO.XML /// General/ /// unknown files /// Clip/ /// C0001.MXF /// C0001M01.XML /// C0001M01.XMP /// C0002.MXF /// C0002M01.XML /// C0002M01.XMP /// Sub/ /// C0001S01.MXF /// C0002S01.MXF /// Edit/ /// E0001E01.SMI /// E0001M01.XML /// E0002E01.SMI /// E0002M01.XML /// /// A typical SAM layout looks like: /// /// .../MyMovie/ /// GENERAL/ /// unknown files /// PROAV/ /// INDEX.XML /// INDEX.BUP /// DISCMETA.XML /// DISCINFO.XML /// DISCINFO.BUP /// CLPR/ /// C0001/ /// C0001C01.SMI /// C0001V01.MXF /// C0001A01.MXF /// C0001A02.MXF /// C0001R01.BIM /// C0001I01.PPN /// C0001M01.XML /// C0001M01.XMP /// C0001S01.MXF /// C0002/ /// ... /// EDTR/ /// E0001/ /// E0001E01.SMI /// E0001M01.XML /// E0002/ /// ... /// /// Note that the Sony documentation uses the folder names "General", "Clip", "Sub", and "Edit". We /// use all caps here. Common code has already shifted the names, we want to be case insensitive. /// /// From the user's point of view, .../MyMovie contains XDCAM stuff, in this case 2 clips whose raw /// names are C0001 and C0002. There may be mapping information for nicer clip names to the raw /// names, but that can be ignored for now. Each clip is stored as a collection of files, each file /// holding some specific aspect of the clip's data. /// /// The XDCAM handler operates on clips. The path from the client of XMPFiles can be either a logical /// clip path, like ".../MyMovie/C0001", or a full path to one of the files. In the latter case the /// handler must figure out the intended clip, it must not blindly use the named file. /// /// Once the XDCAM structure and intended clip are identified, the handler only deals with the .XMP /// and .XML files in the CLIP or CLPR/ folders. The .XMP file, if present, contains the XMP /// for the clip. The .XML file must be present to define the existance of the clip. It contains a /// variety of information about the clip, including some legacy metadata. /// // ================================================================================================= // ================================================================================================= // XDCAM_CheckFormat // ================= // // This version does fairly simple checks. The top level folder (.../MyMovie) must have exactly 1 // child, a folder called CONTENTS. This must have a subfolder called CLIP. It may also have // subfolders called VIDEO, AUDIO, ICON, VOICE, and PROXY. Any mixture of these additional folders // is allowed, but no other children are allowed in CONTENTS. The CLIP folder must contain a .XML // file for the desired clip. The name checks are case insensitive. // // The state of the string parameters depends on the form of the path passed by the client. If the // client passed a logical clip path, like ".../MyMovie/C0001", the parameters are: // rootPath - ".../MyMovie" // gpName - empty // parentName - empty // leafName - "C0001" // // If the client passed a FAM file path, like ".../MyMovie/Edit/E0001E01.SMI", they are: // rootPath - "..." // gpName - "MyMovie" // parentName - "EDIT" (common code has shifted the case) // leafName - "E0001E01" // // If the client passed a SAM file path, like ".../MyMovie/PROAV/CLPR/C0001/C0001A02.MXF", they are: // rootPath - ".../MyMovie/PROAV" // gpName - "CLPR" // parentName - "C0001" // leafName - "C0001A02" // // For both FAM and SAM the leading character of the leafName for an existing file might be coerced // to 'C' to form the logical clip name. And suffix such as "M01" must be removed for FAM. We don't // need to worry about that for SAM, that uses the folder name. // ! The FAM format supports general clip file names through an ALIAS.XML mapping file. The simple // ! existence check has an edge case bug, left to be fixed later. If the ALIAS.XML file exists, but // ! some of the clips still have "raw" names, and we're passed an existing file path in the EDIT // ! folder, we will fail to do the leading 'E' to 'C' coercion. We might also erroneously remove a // ! suffix from a mapped essence file with a name like ClipX01.MXF. // ! The common code has shifted the gpName, parentName, and leafName strings to uppercase. It has // ! also made sure that for a logical clip path the rootPath is an existing folder, and that the // ! file exists for a full file path. bool XDCAM_CheckFormat ( XMP_FileFormat format, const std::string & _rootPath, const std::string & _gpName, const std::string & parentName, const std::string & leafName, XMPFiles * parent ) { std::string rootPath = _rootPath; // ! Need tweaking in the existing file cases (FAM and SAM). std::string gpName = _gpName; bool isFAM = false; std::string tempPath, childName; XMP_FolderInfo folderInfo; std::string clipName = leafName; // Do some basic checks on the root path and component names. Decide if this is FAM or SAM. if ( gpName.empty() != parentName.empty() ) return false; // Must be both empty or both non-empty. if ( gpName.empty() ) { // This is the logical clip path case. Just look for PROAV to see if this is FAM or SAM. if ( GetChildMode ( rootPath, "PROAV" ) != kFMode_IsFolder ) isFAM = true; } else { // This is the existing file case. See if this is FAM or SAM, tweak the clip name as needed. if ( (parentName == "CLIP") || (parentName == "EDIT") || (parentName == "SUB") ) { // ! The standard says Clip/Edit/Sub, but the caller has already shifted to upper case. isFAM = true; } else if ( (gpName != "CLPR") && (gpName != "EDTR") ) { return false; } if ( isFAM ) { // Put the proper root path together. Clean up the clip name if needed. if ( ! rootPath.empty() ) rootPath += kDirChar; rootPath += gpName; gpName.erase(); if ( GetChildMode ( rootPath, "ALIAS.XML" ) != kFMode_IsFile ) { clipName[0] = 'C'; // ! See notes above about pending bug. } if ( clipName.size() > 3 ) { size_t clipMid = clipName.size() - 3; char c1 = clipName[clipMid]; char c2 = clipName[clipMid+1]; char c3 = clipName[clipMid+2]; if ( ('A' <= c1) && (c1 <= 'Z') && ('0' <= c2) && (c2 <= '9') && ('0' <= c3) && (c3 <= '9') ) { clipName.erase ( clipMid ); } } } else { // Fix the clip name. Check for and strip the "PROAV" suffix on the root path. clipName = parentName; // ! We have a folder with the (almost) exact clip name. clipName[0] = 'C'; std::string proav; SplitLeafName ( &rootPath, &proav ); MakeUpperCase ( &proav ); if ( (rootPath.empty()) || (proav != "PROAV") ) return false; } } // Make sure the general XDCAM package structure is legit. Set tempPath as a bogus path of the // form //, e.g. ".../MyMovie/FAM/C0001". This is passed the handler via // the tempPtr hackery. if ( isFAM ) { if ( (format != kXMP_XDCAM_FAMFile) && (format != kXMP_UnknownFile) ) return false; tempPath = rootPath; if ( GetChildMode ( tempPath, "INDEX.XML" ) != kFMode_IsFile ) return false; if ( GetChildMode ( tempPath, "DISCMETA.XML" ) != kFMode_IsFile ) return false; if ( GetChildMode ( tempPath, "MEDIAPRO.XML" ) != kFMode_IsFile ) return false; tempPath += kDirChar; tempPath += "Clip"; // ! Yes, mixed case. tempPath += kDirChar; tempPath += clipName; tempPath += "M01.XML"; if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFile ) return false; tempPath = rootPath; tempPath += kDirChar; tempPath += "FAM"; tempPath += kDirChar; tempPath += clipName; } else { if ( (format != kXMP_XDCAM_SAMFile) && (format != kXMP_UnknownFile) ) return false; // We already know about the PROAV folder, just check below it. tempPath = rootPath; tempPath += kDirChar; tempPath += "PROAV"; if ( GetChildMode ( tempPath, "INDEX.XML" ) != kFMode_IsFile ) return false; if ( GetChildMode ( tempPath, "DISCMETA.XML" ) != kFMode_IsFile ) return false; if ( GetChildMode ( tempPath, "DISCINFO.XML" ) != kFMode_IsFile ) return false; if ( GetChildMode ( tempPath, "CLPR" ) != kFMode_IsFolder ) return false; tempPath += kDirChar; tempPath += "CLPR"; tempPath += kDirChar; tempPath += clipName; if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFolder ) return false; tempPath += kDirChar; tempPath += clipName; tempPath += "M01.XML"; if ( GetFileMode ( tempPath.c_str() ) != kFMode_IsFile ) return false; tempPath = rootPath; tempPath += kDirChar; tempPath += "SAM"; tempPath += kDirChar; tempPath += clipName; } // Save the pseudo-path for the handler object. A bit of a hack, but the only way to get info // from here to there. size_t pathLen = tempPath.size() + 1; // Include a terminating nul. parent->tempPtr = malloc ( pathLen ); if ( parent->tempPtr == 0 ) XMP_Throw ( "No memory for XDCAM clip info", kXMPErr_NoMemory ); memcpy ( parent->tempPtr, tempPath.c_str(), pathLen ); // AUDIT: Safe, allocated above. return true; } // XDCAM_CheckFormat // ================================================================================================= // XDCAM_MetaHandlerCTor // ===================== XMPFileHandler * XDCAM_MetaHandlerCTor ( XMPFiles * parent ) { return new XDCAM_MetaHandler ( parent ); } // XDCAM_MetaHandlerCTor // ================================================================================================= // XDCAM_MetaHandler::XDCAM_MetaHandler // ==================================== XDCAM_MetaHandler::XDCAM_MetaHandler ( XMPFiles * _parent ) : isFAM(false), expat(0) { this->parent = _parent; // Inherited, can't set in the prefix. this->handlerFlags = kXDCAM_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; // Extract the root path, clip name, and FAM/SAM flag from tempPtr. XMP_Assert ( this->parent->tempPtr != 0 ); this->rootPath.assign ( (char*) this->parent->tempPtr ); free ( this->parent->tempPtr ); this->parent->tempPtr = 0; SplitLeafName ( &this->rootPath, &this->clipName ); std::string temp; SplitLeafName ( &this->rootPath, &temp ); XMP_Assert ( (temp == "FAM") || (temp == "SAM") ); if ( temp == "FAM" ) this->isFAM = true; XMP_Assert ( this->isFAM ? (this->parent->format == kXMP_XDCAM_FAMFile) : (this->parent->format == kXMP_XDCAM_SAMFile) ); } // XDCAM_MetaHandler::XDCAM_MetaHandler // ================================================================================================= // XDCAM_MetaHandler::~XDCAM_MetaHandler // ===================================== XDCAM_MetaHandler::~XDCAM_MetaHandler() { this->CleanupLegacyXML(); if ( this->parent->tempPtr != 0 ) { free ( this->parent->tempPtr ); this->parent->tempPtr = 0; } } // XDCAM_MetaHandler::~XDCAM_MetaHandler // ================================================================================================= // XDCAM_MetaHandler::MakeClipFilePath // =================================== void XDCAM_MetaHandler::MakeClipFilePath ( std::string * path, XMP_StringPtr suffix ) { *path = this->rootPath; *path += kDirChar; if ( this->isFAM ) { *path += "Clip"; // ! Yes, mixed case. } else { *path += "PROAV"; *path += kDirChar; *path += "CLPR"; *path += kDirChar; *path += this->clipName; } *path += kDirChar; *path += this->clipName; *path += suffix; } // XDCAM_MetaHandler::MakeClipFilePath // ================================================================================================= // XDCAM_MetaHandler::MakeLegacyDigest // =================================== // *** Early hack version. #define kHexDigits "0123456789ABCDEF" void XDCAM_MetaHandler::MakeLegacyDigest ( std::string * digestStr ) { digestStr->erase(); if ( this->clipMetadata == 0 ) return; // Bail if we don't have any legacy XML. XMP_Assert ( this->expat != 0 ); XMP_StringPtr xdcNS = this->xdcNS.c_str(); XML_NodePtr legacyContext, legacyProp; legacyContext = this->clipMetadata->GetNamedElement ( xdcNS, "Access" ); if ( legacyContext == 0 ) return; MD5_CTX context; unsigned char digestBin [16]; MD5Init ( &context ); legacyProp = legacyContext->GetNamedElement ( xdcNS, "Creator" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) { const XML_Node * xmlValue = legacyProp->content[0]; MD5Update ( &context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() ); } legacyProp = legacyContext->GetNamedElement ( xdcNS, "CreationDate" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) { const XML_Node * xmlValue = legacyProp->content[0]; MD5Update ( &context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() ); } legacyProp = legacyContext->GetNamedElement ( xdcNS, "LastUpdateDate" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() && (! legacyProp->content.empty()) ) { const XML_Node * xmlValue = legacyProp->content[0]; MD5Update ( &context, (XMP_Uns8*)xmlValue->value.c_str(), (unsigned int)xmlValue->value.size() ); } MD5Final ( digestBin, &context ); char buffer [40]; for ( int in = 0, out = 0; in < 16; in += 1, out += 2 ) { XMP_Uns8 byte = digestBin[in]; buffer[out] = kHexDigits [ byte >> 4 ]; buffer[out+1] = kHexDigits [ byte & 0xF ]; } buffer[32] = 0; digestStr->append ( buffer ); } // XDCAM_MetaHandler::MakeLegacyDigest // ================================================================================================= // P2_MetaHandler::CleanupLegacyXML // ================================ void XDCAM_MetaHandler::CleanupLegacyXML() { if ( this->expat != 0 ) { delete ( this->expat ); this->expat = 0; } clipMetadata = 0; // ! Was a pointer into the expat tree. } // XDCAM_MetaHandler::CleanupLegacyXML // ================================================================================================= // XDCAM_MetaHandler::CacheFileData // ================================ void XDCAM_MetaHandler::CacheFileData() { XMP_Assert ( ! this->containsXMP ); // See if the clip's .XMP file exists. std::string xmpPath; this->MakeClipFilePath ( &xmpPath, "M01.XMP" ); if ( GetFileMode ( xmpPath.c_str() ) != kFMode_IsFile ) return; // No XMP. // Read the entire .XMP file. char openMode = 'r'; if ( this->parent->openFlags & kXMPFiles_OpenForUpdate ) openMode = 'w'; LFA_FileRef xmpFile = LFA_Open ( xmpPath.c_str(), openMode ); if ( xmpFile == 0 ) return; // The open failed. XMP_Int64 xmpLen = LFA_Measure ( xmpFile ); if ( xmpLen > 100*1024*1024 ) { XMP_Throw ( "XDCAM XMP is outrageously large", kXMPErr_InternalFailure ); // Sanity check. } this->xmpPacket.erase(); this->xmpPacket.reserve ( (size_t)xmpLen ); this->xmpPacket.append ( (size_t)xmpLen, ' ' ); XMP_Int32 ioCount = LFA_Read ( xmpFile, (void*)this->xmpPacket.data(), (XMP_Int32)xmpLen, kLFA_RequireAll ); XMP_Assert ( ioCount == xmpLen ); this->packetInfo.offset = 0; this->packetInfo.length = (XMP_Int32)xmpLen; FillPacketInfo ( this->xmpPacket, &this->packetInfo ); XMP_Assert ( this->parent->fileRef == 0 ); if ( openMode == 'r' ) { LFA_Close ( xmpFile ); } else { this->parent->fileRef = xmpFile; } this->containsXMP = true; } // XDCAM_MetaHandler::CacheFileData // ================================================================================================= // XDCAM_MetaHandler::ProcessXMP // ============================= void XDCAM_MetaHandler::ProcessXMP() { // Some versions of gcc can't tolerate goto's across declarations. // *** Better yet, avoid this cruft with self-cleaning objects. #define CleanupAndExit \ { \ bool openForUpdate = XMP_OptionIsSet ( this->parent->openFlags, kXMPFiles_OpenForUpdate ); \ if ( ! openForUpdate ) this->CleanupLegacyXML(); \ return; \ } if ( this->processedXMP ) return; this->processedXMP = true; // Make sure only called once. if ( this->containsXMP ) { this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); } // NonRealTimeMeta -> XMP by schema std::string xmlPath, umid; this->MakeClipFilePath ( &xmlPath, "M01.XML" ); AutoFile xmlFile; xmlFile.fileRef = LFA_Open ( xmlPath.c_str(), 'r' ); if ( xmlFile.fileRef == 0 ) return; // The open failed. this->expat = XMP_NewExpatAdapter ( ExpatAdapter::kUseLocalNamespaces ); if ( this->expat == 0 ) XMP_Throw ( "XDCAM_MetaHandler: Can't create Expat adapter", kXMPErr_NoMemory ); XMP_Uns8 buffer [64*1024]; while ( true ) { XMP_Int32 ioCount = LFA_Read ( xmlFile.fileRef, buffer, sizeof(buffer) ); if ( ioCount == 0 ) break; this->expat->ParseBuffer ( buffer, ioCount, false /* not the end */ ); } this->expat->ParseBuffer ( 0, 0, true ); // End the parse. LFA_Close ( xmlFile.fileRef ); xmlFile.fileRef = 0; // The root element should be NonRealTimeMeta in some namespace. Take whatever this file uses. XML_Node & xmlTree = this->expat->tree; XML_NodePtr rootElem = 0; for ( size_t i = 0, limit = xmlTree.content.size(); i < limit; ++i ) { if ( xmlTree.content[i]->kind == kElemNode ) { rootElem = xmlTree.content[i]; } } if ( rootElem == 0 ) CleanupAndExit XMP_StringPtr rootLocalName = rootElem->name.c_str() + rootElem->nsPrefixLen; if ( ! XMP_LitMatch ( rootLocalName, "NonRealTimeMeta" ) ) CleanupAndExit this->legacyNS = rootElem->ns; // Check the legacy digest. XMP_StringPtr legacyNS = this->legacyNS.c_str(); this->clipMetadata = rootElem; // ! Save the NonRealTimeMeta pointer for other use. std::string oldDigest, newDigest; bool digestFound = this->xmpObj.GetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "XDCAM", &oldDigest, 0 ); if ( digestFound ) { this->MakeLegacyDigest ( &newDigest ); if ( oldDigest == newDigest ) CleanupAndExit } // If we get here we need find and import the actual legacy elements using the current namespace. // Either there is no old digest in the XMP, or the digests differ. In the former case keep any // existing XMP, in the latter case take new legacy values. this->containsXMP = XDCAM_Support::GetLegacyMetaData ( &this->xmpObj, rootElem, legacyNS, digestFound, umid ); CleanupAndExit #undef CleanupAndExit } // XDCAM_MetaHandler::ProcessXMP // ================================================================================================= // XDCAM_MetaHandler::UpdateFile // ============================= // // Note that UpdateFile is only called from XMPFiles::CloseFile, so it is OK to close the file here. void XDCAM_MetaHandler::UpdateFile ( bool doSafeUpdate ) { if ( ! this->needsUpdate ) return; this->needsUpdate = false; // Make sure only called once. LFA_FileRef oldFile = 0; std::string filePath, tempPath; // Update the internal legacy XML tree if we have one, and set the digest in the XMP. bool updateLegacyXML = false; if ( this->clipMetadata != 0 ) { updateLegacyXML = XDCAM_Support::SetLegacyMetaData ( this->clipMetadata, &this->xmpObj, this->legacyNS.c_str()); } std::string newDigest; this->MakeLegacyDigest ( &newDigest ); this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "XDCAM", newDigest.c_str(), kXMP_DeleteExisting ); this->xmpObj.SerializeToBuffer ( &this->xmpPacket, this->GetSerializeOptions() ); // Update the legacy XML file if necessary. if ( updateLegacyXML ) { std::string legacyXML; this->expat->tree.Serialize ( &legacyXML ); this->MakeClipFilePath ( &filePath, "M01.XML" ); oldFile = LFA_Open ( filePath.c_str(), 'w' ); if ( oldFile == 0 ) { // The XML does not exist yet. this->MakeClipFilePath ( &filePath, "M01.XML" ); oldFile = LFA_Create ( filePath.c_str() ); if ( oldFile == 0 ) XMP_Throw ( "Failure creating XDCAMEX legacy XML file", kXMPErr_ExternalFailure ); LFA_Write ( oldFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() ); LFA_Close ( oldFile ); } else if ( ! doSafeUpdate ) { // Over write the existing XML file. LFA_Seek ( oldFile, 0, SEEK_SET ); LFA_Truncate ( oldFile, 0 ); LFA_Write ( oldFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() ); LFA_Close ( oldFile ); } else { // Do a safe update. // *** We really need an LFA_SwapFiles utility. this->MakeClipFilePath ( &filePath, "M01.XML" ); CreateTempFile ( filePath, &tempPath ); LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' ); LFA_Write ( tempFile, legacyXML.data(), (XMP_StringLen)legacyXML.size() ); LFA_Close ( tempFile ); LFA_Close ( oldFile ); LFA_Delete ( filePath.c_str() ); LFA_Rename ( tempPath.c_str(), filePath.c_str() ); } } oldFile = this->parent->fileRef; if ( oldFile == 0 ) { // The XMP does not exist yet. std::string xmpPath; this->MakeClipFilePath ( &xmpPath, "M01.XMP" ); LFA_FileRef xmpFile = LFA_Create ( xmpPath.c_str() ); if ( xmpFile == 0 ) XMP_Throw ( "Failure creating XDCAM XMP file", kXMPErr_ExternalFailure ); LFA_Write ( xmpFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( xmpFile ); } else if ( ! doSafeUpdate ) { // Over write the existing XMP file. LFA_Seek ( oldFile, 0, SEEK_SET ); LFA_Truncate ( oldFile, 0 ); LFA_Write ( oldFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( oldFile ); } else { // Do a safe update. // *** We really need an LFA_SwapFiles utility. std::string xmpPath, tempPath; this->MakeClipFilePath ( &xmpPath, "M01.XMP" ); CreateTempFile ( xmpPath, &tempPath ); LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' ); LFA_Write ( tempFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( tempFile ); LFA_Close ( oldFile ); LFA_Delete ( xmpPath.c_str() ); LFA_Rename ( tempPath.c_str(), xmpPath.c_str() ); } this->parent->fileRef = 0; } // XDCAM_MetaHandler::UpdateFile // ================================================================================================= // XDCAM_MetaHandler::WriteFile // ============================ void XDCAM_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { // ! WriteFile is not supposed to be called for handlers that own the file. XMP_Throw ( "XDCAM_MetaHandler::WriteFile should not be called", kXMPErr_InternalFailure ); } // XDCAM_MetaHandler::WriteFile // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/Basic_Handler.cpp0000664000175000017500000002064612150230672020405 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "Basic_Handler.hpp" using namespace std; // ================================================================================================= /// \file Basic_Handler.cpp /// \brief Base class for basic handlers that only process in-place XMP. /// /// This header ... /// // ================================================================================================= // ================================================================================================= // Basic_MetaHandler::~Basic_MetaHandler // ===================================== Basic_MetaHandler::~Basic_MetaHandler() { // ! Inherit the base cleanup. } // Basic_MetaHandler::~Basic_MetaHandler // ================================================================================================= // Basic_MetaHandler::UpdateFile // ============================= // ! This must be called from the destructor for all derived classes. It can't be called from the // ! Basic_MetaHandler destructor, by then calls to the virtual functions would not go to the // ! actual implementations for the derived class. void Basic_MetaHandler::UpdateFile ( bool doSafeUpdate ) { IgnoreParam ( doSafeUpdate ); XMP_Assert ( ! doSafeUpdate ); // Not supported at this level. if ( ! this->needsUpdate ) return; LFA_FileRef fileRef = this->parent->fileRef; XMP_PacketInfo & packetInfo = this->packetInfo; std::string & xmpPacket = this->xmpPacket; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); this->CaptureFileEnding(); // ! Do this first, before any location info changes. if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "Basic_MetaHandler::UpdateFile - User abort", kXMPErr_UserAbort ); } this->NoteXMPRemoval(); this->ShuffleTrailingContent(); if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "Basic_MetaHandler::UpdateFile - User abort", kXMPErr_UserAbort ); } XMP_Int64 tempLength = this->xmpFileOffset - this->xmpPrefixSize + this->trailingContentSize; LFA_Truncate ( fileRef, tempLength ); LFA_Flush ( fileRef ); packetInfo.offset = tempLength + this->xmpPrefixSize; this->NoteXMPInsertion(); LFA_Seek ( fileRef, 0, SEEK_END ); this->WriteXMPPrefix(); LFA_Write ( fileRef, xmpPacket.c_str(), (XMP_StringLen)xmpPacket.size() ); this->WriteXMPSuffix(); if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "Basic_MetaHandler::UpdateFile - User abort", kXMPErr_UserAbort ); } this->RestoreFileEnding(); LFA_Flush ( fileRef ); this->xmpFileOffset = packetInfo.offset; this->xmpFileSize = packetInfo.length; this->needsUpdate = false; } // Basic_MetaHandler::UpdateFile // ================================================================================================= // Basic_MetaHandler::WriteFile // ============================ // *** What about computing the new file length and pre-allocating the file? void Basic_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { IgnoreParam ( sourcePath ); XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); LFA_FileRef destRef = this->parent->fileRef; // Capture the "back" of the source file. this->parent->fileRef = sourceRef; this->CaptureFileEnding(); this->parent->fileRef = destRef; if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "Basic_MetaHandler::UpdateFile - User abort", kXMPErr_UserAbort ); } // Seek to the beginning of the source and destination files, truncate the destination. LFA_Seek ( sourceRef, 0, SEEK_SET ); LFA_Seek ( destRef, 0, SEEK_SET ); LFA_Truncate ( destRef, 0 ); // Copy the front of the source file to the destination. Note the XMP (pseudo) removal and // insertion. This mainly updates info about the new XMP length. XMP_Int64 xmpSectionOffset = this->xmpFileOffset - this->xmpPrefixSize; XMP_Int32 oldSectionLength = this->xmpPrefixSize + this->xmpFileSize + this->xmpSuffixSize; LFA_Copy ( sourceRef, destRef, xmpSectionOffset, abortProc, abortArg ); this->NoteXMPRemoval(); packetInfo.offset = this->xmpFileOffset; // ! The packet offset does not change. this->NoteXMPInsertion(); LFA_Seek ( destRef, 0, SEEK_END ); if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "Basic_MetaHandler::WriteFile - User abort", kXMPErr_UserAbort ); } // Write the new XMP section to the destination. this->WriteXMPPrefix(); LFA_Write ( destRef, this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); this->WriteXMPSuffix(); if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "Basic_MetaHandler::WriteFile - User abort", kXMPErr_UserAbort ); } // Copy the trailing file content from the source and write the "back" of the file. XMP_Int64 remainderOffset = xmpSectionOffset + oldSectionLength; LFA_Seek ( sourceRef, remainderOffset, SEEK_SET ); LFA_Copy ( sourceRef, destRef, this->trailingContentSize, abortProc, abortArg ); this->RestoreFileEnding(); // Done. LFA_Flush ( destRef ); this->xmpFileOffset = packetInfo.offset; this->xmpFileSize = packetInfo.length; this->needsUpdate = false; } // Basic_MetaHandler::WriteFile // ================================================================================================= // ShuffleTrailingContent // ====================== // // Shuffle the trailing content portion of a file forward. This does not include the final "back" // portion of the file, just the arbitrary length content between the XMP section and the back. // Don't use LFA_Copy, that assumes separate files and hence separate I/O positions. // ! The XMP packet location and prefix/suffix sizes must still reflect the XMP section that is in // ! the process of being removed. void Basic_MetaHandler::ShuffleTrailingContent() { LFA_FileRef fileRef = this->parent->fileRef; XMP_Int64 readOffset = this->packetInfo.offset + xmpSuffixSize; XMP_Int64 writeOffset = this->packetInfo.offset - xmpPrefixSize; XMP_Int64 remainingLength = this->trailingContentSize; enum { kBufferSize = 64*1024 }; char buffer [kBufferSize]; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); while ( remainingLength > 0 ) { XMP_Int32 ioCount = kBufferSize; if ( remainingLength < kBufferSize ) ioCount = (XMP_Int32)remainingLength; LFA_Seek ( fileRef, readOffset, SEEK_SET ); LFA_Read ( fileRef, buffer, ioCount, kLFA_RequireAll ); LFA_Seek ( fileRef, writeOffset, SEEK_SET ); LFA_Write ( fileRef, buffer, ioCount ); readOffset += ioCount; writeOffset += ioCount; remainingLength -= ioCount; if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "Basic_MetaHandler::ShuffleTrailingContent - User abort", kXMPErr_UserAbort ); } } LFA_Flush ( fileRef ); } // ShuffleTrailingContent // ================================================================================================= // Dummies needed for VS.Net // ========================= void Basic_MetaHandler::WriteXMPPrefix() { XMP_Throw ( "Basic_MetaHandler::WriteXMPPrefix - Needs specific override", kXMPErr_InternalFailure ); } void Basic_MetaHandler::WriteXMPSuffix() { XMP_Throw ( "Basic_MetaHandler::WriteXMPSuffix - Needs specific override", kXMPErr_InternalFailure ); } void Basic_MetaHandler::NoteXMPRemoval() { XMP_Throw ( "Basic_MetaHandler::NoteXMPRemoval - Needs specific override", kXMPErr_InternalFailure ); } void Basic_MetaHandler::NoteXMPInsertion() { XMP_Throw ( "Basic_MetaHandler::NoteXMPInsertion - Needs specific override", kXMPErr_InternalFailure ); } void Basic_MetaHandler::CaptureFileEnding() { XMP_Throw ( "Basic_MetaHandler::CaptureFileEnding - Needs specific override", kXMPErr_InternalFailure ); } void Basic_MetaHandler::RestoreFileEnding() { XMP_Throw ( "Basic_MetaHandler::RestoreFileEnding - Needs specific override", kXMPErr_InternalFailure ); } // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/Makefile.in0000664000175000017500000005441312150231002017253 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = source/XMPFiles/FileHandlers DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libxmpfilehandlers_la_LIBADD = am_libxmpfilehandlers_la_OBJECTS = ASF_Handler.lo AVCHD_Handler.lo \ Basic_Handler.lo FLV_Handler.lo GIF_Handler.lo \ InDesign_Handler.lo JPEG_Handler.lo MP3_Handler.lo \ MPEG2_Handler.lo MPEG4_Handler.lo P2_Handler.lo PNG_Handler.lo \ PostScript_Handler.lo PSD_Handler.lo RIFF_Handler.lo \ Scanner_Handler.lo SonyHDV_Handler.lo SWF_Handler.lo \ TIFF_Handler.lo Trivial_Handler.lo UCF_Handler.lo \ XDCAMEX_Handler.lo XDCAM_Handler.lo libxmpfilehandlers_la_OBJECTS = $(am_libxmpfilehandlers_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libxmpfilehandlers_la_SOURCES) DIST_SOURCES = $(libxmpfilehandlers_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libxmpfilehandlers.la INCLUDES = -I$(srcdir)/.. -I$(srcdir)/../FormatSupport \ -I$(top_srcdir)/source/common/ \ -I$(top_srcdir)/public/include/ -I$(top_srcdir)/build/ \ -I$(top_srcdir)/third-party/MD5 AM_CPPFLAGS = \ -D@EXEMPI_PLATFORM_DEF@=1 -DXMP_IMPL=1 -DXMP_ClientBuild=0 \ -D_FILE_OFFSET_BITS=64 -DHAVE_EXPAT_CONFIG_H=1 -DXML_STATIC=1 libxmpfilehandlers_la_SOURCES = \ ASF_Handler.cpp ASF_Handler.hpp\ AVCHD_Handler.cpp AVCHD_Handler.hpp\ Basic_Handler.cpp Basic_Handler.hpp\ FLV_Handler.cpp FLV_Handler.hpp\ GIF_Handler.cpp GIF_Handler.hpp\ InDesign_Handler.cpp InDesign_Handler.hpp\ JPEG_Handler.cpp JPEG_Handler.hpp\ MP3_Handler.cpp MP3_Handler.hpp\ MPEG2_Handler.cpp MPEG2_Handler.hpp \ MPEG4_Handler.cpp MPEG4_Handler.hpp \ P2_Handler.cpp P2_Handler.hpp\ PNG_Handler.cpp PNG_Handler.hpp\ PostScript_Handler.cpp PostScript_Handler.hpp\ PSD_Handler.cpp PSD_Handler.hpp\ RIFF_Handler.cpp RIFF_Handler.hpp \ Scanner_Handler.cpp Scanner_Handler.hpp\ SonyHDV_Handler.cpp SonyHDV_Handler.hpp\ SWF_Handler.cpp SWF_Handler.hpp\ TIFF_Handler.cpp TIFF_Handler.hpp\ Trivial_Handler.cpp Trivial_Handler.hpp\ UCF_Handler.cpp UCF_Handler.hpp\ XDCAMEX_Handler.cpp XDCAMEX_Handler.hpp\ XDCAM_Handler.cpp XDCAM_Handler.hpp\ $(NULL) all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign source/XMPFiles/FileHandlers/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign source/XMPFiles/FileHandlers/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libxmpfilehandlers.la: $(libxmpfilehandlers_la_OBJECTS) $(libxmpfilehandlers_la_DEPENDENCIES) $(EXTRA_libxmpfilehandlers_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(libxmpfilehandlers_la_OBJECTS) $(libxmpfilehandlers_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ASF_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AVCHD_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Basic_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FLV_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GIF_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/InDesign_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JPEG_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MP3_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MPEG2_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MPEG4_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/P2_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PNG_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSD_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PostScript_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RIFF_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SWF_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Scanner_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SonyHDV_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TIFF_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Trivial_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UCF_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XDCAMEX_Handler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XDCAM_Handler.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/source/XMPFiles/FileHandlers/Basic_Handler.hpp0000664000175000017500000001250412150230672020404 00000000000000#ifndef __Basic_Handler_hpp__ #define __Basic_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMPFiles_Impl.hpp" // ================================================================================================= /// \file Basic_Handler.hpp /// /// \brief Base class for handlers that support a simple file model allowing insertion and expansion /// of XMP, but probably not reconciliation with other forms of metadata. Reconciliation would have /// to be done within the I/O model presented here. /// /// \note Any specific derived handler might not be able to do insertion, but all must support /// expansion. If a handler can't do either it should be derived from Trivial_Handler. Common code /// must check the actual canInject flag where appropriate. /// /// The model for a basic handler divides the file into 6 portions: /// /// \li The front of the file. This portion can be arbitrarily large. Files over 4GB are supported. /// Adding or expanding the XMP must not require expanding this portion of the file. The XMP offset /// or length might be written into reserved space in this section though. /// /// \li A prefix for the XMP section. The prefix and suffix for the XMP "section" are the format /// specific portions that surround the raw XMP packet. They must be generated on the fly, even when /// updating existing XMP with or without expansion. Their length must not depend on the XMP packet. /// /// \li The XMP packet, as created by SXMPMeta::SerializeToBuffer. The size must be less than 2GB. /// /// \li A suffix for the XMP section. /// /// \li Trailing file content. This portion can be arbitarily large. It must be possible to remove /// the XMP, move this portion of the file forward, then reinsert the XMP after this portion. This /// is actually how the XMP is expanded. There must not be any embedded file offsets in this part, /// this content must not change if the XMP changes size. /// /// \li The back of the file. This portion must have modest size, and/or be generated on the fly. /// When inserting XMP, part of this may be buffered in RAM (hence the modest size requirement), the /// XMP section is written, then this portion is rewritten. There must not be any embedded file /// offsets in this part, this content must not change if the XMP changes size. /// /// \note There is no general promise here about crash-safe I/O. An update to an existing file might /// have invalid partial state, for example while moving the trailing content portion forward if the /// XMP increases in size or even rewriting existing XMP in-place. Crash-safe updates are managed at /// a higher level of XMPFiles, using a temporary file and final swap of file content. /// // ================================================================================================= static const XMP_OptionBits kBasic_HandlerFlags = (kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_CanRewrite | kXMPFiles_PrefersInPlace | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_AllowsSafeUpdate); class Basic_MetaHandler : public XMPFileHandler { public: Basic_MetaHandler() : xmpFileOffset(0), xmpFileSize(0), xmpPrefixSize(0), xmpSuffixSize(0), trailingContentSize(0) {}; ~Basic_MetaHandler(); virtual void CacheFileData() = 0; // Sets offset for insertion if no XMP yet. void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); protected: virtual void WriteXMPPrefix() = 0; // ! Must have override in actual handlers! virtual void WriteXMPSuffix() = 0; // ! Must have override in actual handlers! virtual void NoteXMPRemoval() = 0; // ! Must have override in actual handlers! virtual void NoteXMPInsertion() = 0; // ! Must have override in actual handlers! virtual void CaptureFileEnding() = 0; // ! Must have override in actual handlers! virtual void RestoreFileEnding() = 0; // ! Must have override in actual handlers! void ShuffleTrailingContent(); // Move the trailing content portion forward. Excludes "back" of the file. XMP_Uns64 xmpFileOffset; // The offset of the XMP in the file. XMP_Uns32 xmpFileSize; // The size of the XMP in the file. // ! The packetInfo offset and length are updated by PutXMP, before the file is updated! XMP_Uns32 xmpPrefixSize; // The size of the existing header for the XMP section. XMP_Uns32 xmpSuffixSize; // The size of the existing trailer for the XMP section. XMP_Uns64 trailingContentSize; // The size of the existing trailing content. Excludes "back" of the file. }; // Basic_MetaHandler // ================================================================================================= #endif /* __Basic_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/TIFF_Handler.cpp0000664000175000017500000003535112150230672020113 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "TIFF_Handler.hpp" #include "TIFF_Support.hpp" #include "PSIR_Support.hpp" #include "IPTC_Support.hpp" #include "ReconcileLegacy.hpp" #include "Reconcile_Impl.hpp" #include "MD5.h" using namespace std; // ================================================================================================= /// \file TIFF_Handler.cpp /// \brief File format handler for TIFF. /// /// This handler ... /// // ================================================================================================= // ================================================================================================= // TIFF_CheckFormat // ================ // For TIFF we just check for the II/42 or MM/42 in the first 4 bytes and that there are at least // 26 bytes of data (4+4+2+12+4). // // ! The CheckXyzFormat routines don't track the filePos, that is left to ScanXyzFile. bool TIFF_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ) { IgnoreParam(format); IgnoreParam(filePath); IgnoreParam(parent); XMP_Assert ( format == kXMP_TIFFFile ); enum { kMinimalTIFFSize = 4+4+2+12+4 }; // Header plus IFD with 1 entry. IOBuffer ioBuf; LFA_Seek ( fileRef, 0, SEEK_SET ); if ( ! CheckFileSpace ( fileRef, &ioBuf, kMinimalTIFFSize ) ) return false; bool leTIFF = CheckBytes ( ioBuf.ptr, "\x49\x49\x2A\x00", 4 ); bool beTIFF = CheckBytes ( ioBuf.ptr, "\x4D\x4D\x00\x2A", 4 ); return (leTIFF | beTIFF); } // TIFF_CheckFormat // ================================================================================================= // TIFF_MetaHandlerCTor // ==================== XMPFileHandler * TIFF_MetaHandlerCTor ( XMPFiles * parent ) { return new TIFF_MetaHandler ( parent ); } // TIFF_MetaHandlerCTor // ================================================================================================= // TIFF_MetaHandler::TIFF_MetaHandler // ================================== TIFF_MetaHandler::TIFF_MetaHandler ( XMPFiles * _parent ) : psirMgr(0), iptcMgr(0) { this->parent = _parent; this->handlerFlags = kTIFF_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; } // TIFF_MetaHandler::TIFF_MetaHandler // ================================================================================================= // TIFF_MetaHandler::~TIFF_MetaHandler // =================================== TIFF_MetaHandler::~TIFF_MetaHandler() { if ( this->psirMgr != 0 ) delete ( this->psirMgr ); if ( this->iptcMgr != 0 ) delete ( this->iptcMgr ); } // TIFF_MetaHandler::~TIFF_MetaHandler // ================================================================================================= // TIFF_MetaHandler::CacheFileData // =============================== // // The data caching for TIFF is easy to explain and implement, but does more processing than one // might at first expect. This seems unavoidable given the need to close the disk file after calling // CacheFileData. We parse the TIFF stream and cache the values for all tags of interest, and note // whether XMP is present. We do not parse the XMP, Photoshop image resources, or IPTC datasets. // *** This implementation simply returns when invalid TIFF is encountered. Should we throw instead? void TIFF_MetaHandler::CacheFileData() { LFA_FileRef fileRef = this->parent->fileRef; XMP_PacketInfo & packetInfo = this->packetInfo; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); XMP_Assert ( ! this->containsXMP ); // Set containsXMP to true here only if the XMP tag is found. if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "TIFF_MetaHandler::CacheFileData - User abort", kXMPErr_UserAbort ); } this->tiffMgr.ParseFileStream ( fileRef ); TIFF_Manager::TagInfo dngInfo; if ( this->tiffMgr.GetTag ( kTIFF_PrimaryIFD, kTIFF_DNGVersion, &dngInfo ) ) { // Reject DNG files that are version 2.0 or beyond, this is being written at the time of // DNG version 1.2. The DNG team says it is OK to use 2.0, not strictly 1.2. Use the // DNGBackwardVersion if it is present, else the DNGVersion. Note that the version value is // supposed to be type BYTE, so the file order is always essentially big endian. XMP_Uns8 majorVersion = *((XMP_Uns8*)dngInfo.dataPtr); // Start with DNGVersion. if ( this->tiffMgr.GetTag ( kTIFF_PrimaryIFD, kTIFF_DNGBackwardVersion, &dngInfo ) ) { majorVersion = *((XMP_Uns8*)dngInfo.dataPtr); // Use DNGBackwardVersion if possible. } if ( majorVersion > 1 ) XMP_Throw ( "DNG version beyond 1.x", kXMPErr_BadTIFF ); } TIFF_Manager::TagInfo xmpInfo; bool found = this->tiffMgr.GetTag ( kTIFF_PrimaryIFD, kTIFF_XMP, &xmpInfo ); if ( found ) { this->packetInfo.offset = this->tiffMgr.GetValueOffset ( kTIFF_PrimaryIFD, kTIFF_XMP ); this->packetInfo.length = xmpInfo.dataLen; this->packetInfo.padSize = 0; // Assume for now, set these properly in ProcessXMP. this->packetInfo.charForm = kXMP_CharUnknown; this->packetInfo.writeable = true; this->xmpPacket.assign ( (XMP_StringPtr)xmpInfo.dataPtr, xmpInfo.dataLen ); this->containsXMP = true; } } // TIFF_MetaHandler::CacheFileData // ================================================================================================= // TIFF_MetaHandler::ProcessXMP // ============================ // // Process the raw XMP and legacy metadata that was previously cached. The legacy metadata in TIFF // is messy because there are 2 copies of the IPTC and because of a Photoshop 6 bug/quirk in the way // Exif metadata is saved. void TIFF_MetaHandler::ProcessXMP() { this->processedXMP = true; // Make sure we only come through here once. // Set up everything for the legacy import, but don't do it yet. This lets us do a forced legacy // import if the XMP packet gets parsing errors. // ! Photoshop 6 wrote annoyingly wacky TIFF files. It buried a lot of the Exif metadata inside // ! image resource 1058, itself inside of tag 34377 in the 0th IFD. Take care of this before // ! doing any of the legacy metadata presence or priority analysis. Delete image resource 1058 // ! to get rid of the buried Exif, but don't mark the XMPFiles object as changed. This change // ! should not trigger an update, but should be included as part of a normal update. bool found; bool readOnly = ((this->parent->openFlags & kXMPFiles_OpenForUpdate) == 0); if ( readOnly ) { this->psirMgr = new PSIR_MemoryReader(); this->iptcMgr = new IPTC_Reader(); } else { this->psirMgr = new PSIR_FileWriter(); this->iptcMgr = new IPTC_Writer(); // ! Parse it later. } TIFF_Manager & tiff = this->tiffMgr; // Give the compiler help in recognizing non-aliases. PSIR_Manager & psir = *this->psirMgr; IPTC_Manager & iptc = *this->iptcMgr; TIFF_Manager::TagInfo psirInfo; bool havePSIR = tiff.GetTag ( kTIFF_PrimaryIFD, kTIFF_PSIR, &psirInfo ); if ( havePSIR ) { // ! Do the Photoshop 6 integration before other legacy analysis. psir.ParseMemoryResources ( psirInfo.dataPtr, psirInfo.dataLen ); PSIR_Manager::ImgRsrcInfo buriedExif; found = psir.GetImgRsrc ( kPSIR_Exif, &buriedExif ); if ( found ) { tiff.IntegrateFromPShop6 ( buriedExif.dataPtr, buriedExif.dataLen ); if ( ! readOnly ) psir.DeleteImgRsrc ( kPSIR_Exif ); } } TIFF_Manager::TagInfo iptcInfo; bool haveIPTC = tiff.GetTag ( kTIFF_PrimaryIFD, kTIFF_IPTC, &iptcInfo ); // The TIFF IPTC tag. int iptcDigestState = kDigestMatches; if ( haveIPTC ) { bool haveDigest = false; PSIR_Manager::ImgRsrcInfo digestInfo; if ( havePSIR ) haveDigest = psir.GetImgRsrc ( kPSIR_IPTCDigest, &digestInfo ); if ( digestInfo.dataLen != 16 ) haveDigest = false; if ( ! haveDigest ) { iptcDigestState = kDigestMissing; } else { // Older versions of Photoshop wrote tag 33723 with type LONG, but ignored the trailing // zero padding for the IPTC digest. If the full digest differs, recheck without the padding. iptcDigestState = PhotoDataUtils::CheckIPTCDigest ( iptcInfo.dataPtr, iptcInfo.dataLen, digestInfo.dataPtr ); if ( (iptcDigestState == kDigestDiffers) && (kTIFF_TypeSizes[iptcInfo.type] > 1) ) { XMP_Uns8 * endPtr = (XMP_Uns8*)iptcInfo.dataPtr + iptcInfo.dataLen - 1; XMP_Uns8 * minPtr = endPtr - kTIFF_TypeSizes[iptcInfo.type] + 1; while ( (endPtr >= minPtr) && (*endPtr == 0) ) --endPtr; XMP_Uns32 unpaddedLen = (XMP_Uns32) (endPtr - (XMP_Uns8*)iptcInfo.dataPtr + 1); iptcDigestState = PhotoDataUtils::CheckIPTCDigest ( iptcInfo.dataPtr, unpaddedLen, digestInfo.dataPtr ); } } } XMP_OptionBits options = k2XMP_FileHadExif; // TIFF files are presumed to have Exif legacy. if ( haveIPTC ) options |= k2XMP_FileHadIPTC; if ( this->containsXMP ) options |= k2XMP_FileHadXMP; // Process the XMP packet. If it fails to parse, do a forced legacy import but still throw an // exception. This tells the caller that an error happened, but gives them recovered legacy // should they want to proceed with that. bool haveXMP = false; if ( ! this->xmpPacket.empty() ) { XMP_Assert ( this->containsXMP ); // Common code takes care of packetInfo.charForm, .padSize, and .writeable. XMP_StringPtr packetStr = this->xmpPacket.c_str(); XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size(); try { this->xmpObj.ParseFromBuffer ( packetStr, packetLen ); haveXMP = true; } catch ( ... ) { XMP_ClearOption ( options, k2XMP_FileHadXMP ); if ( haveIPTC ) iptc.ParseMemoryDataSets ( iptcInfo.dataPtr, iptcInfo.dataLen ); if ( iptcDigestState == kDigestMatches ) iptcDigestState = kDigestMissing; ImportPhotoData ( tiff, iptc, psir, iptcDigestState, &this->xmpObj, options ); throw; // ! Rethrow the exception, don't absorb it. } } // Process the legacy metadata. if ( haveIPTC && (! haveXMP) && (iptcDigestState == kDigestMatches) ) iptcDigestState = kDigestMissing; bool parseIPTC = (iptcDigestState != kDigestMatches) || (! readOnly); if ( parseIPTC ) iptc.ParseMemoryDataSets ( iptcInfo.dataPtr, iptcInfo.dataLen ); ImportPhotoData ( tiff, iptc, psir, iptcDigestState, &this->xmpObj, options ); this->containsXMP = true; // Assume we now have something in the XMP. } // TIFF_MetaHandler::ProcessXMP // ================================================================================================= // TIFF_MetaHandler::UpdateFile // ============================ // // There is very little to do directly in UpdateFile. ExportXMPtoJTP takes care of setting all of // the necessary TIFF tags, including things like the 2nd copy of the IPTC in the Photoshop image // resources in tag 34377. TIFF_FileWriter::UpdateFileStream does all of the update-by-append I/O. // *** Need to pass the abort proc and arg to TIFF_FileWriter::UpdateFileStream. void TIFF_MetaHandler::UpdateFile ( bool doSafeUpdate ) { XMP_Assert ( ! doSafeUpdate ); // This should only be called for "unsafe" updates. LFA_FileRef destRef = this->parent->fileRef; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; XMP_Int64 oldPacketOffset = this->packetInfo.offset; XMP_Int32 oldPacketLength = this->packetInfo.length; if ( oldPacketOffset == kXMPFiles_UnknownOffset ) oldPacketOffset = 0; // ! Simplify checks. if ( oldPacketLength == kXMPFiles_UnknownLength ) oldPacketLength = 0; bool fileHadXMP = ((oldPacketOffset != 0) && (oldPacketLength != 0)); // Update the IPTC-IIM and native TIFF/Exif metadata. ExportPhotoData also trips the tiff: and // exif: copies from the XMP, so reserialize the now final XMP packet. ExportPhotoData ( kXMP_TIFFFile, &this->xmpObj, &this->tiffMgr, this->iptcMgr, this->psirMgr ); try { XMP_OptionBits options = kXMP_UseCompactFormat; if ( fileHadXMP ) options |= kXMP_ExactPacketLength; this->xmpObj.SerializeToBuffer ( &this->xmpPacket, options, oldPacketLength ); } catch ( ... ) { this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat ); } // Decide whether to do an in-place update. This can only happen if all of the following are true: // - There is an XMP packet in the file. // - The are no changes to the legacy tags. (The IPTC and PSIR are in the TIFF tags.) // - The new XMP can fit in the old space. bool doInPlace = (fileHadXMP && (this->xmpPacket.size() <= (size_t)oldPacketLength)); if ( this->tiffMgr.IsLegacyChanged() ) doInPlace = false; if ( ! doInPlace ) { #if GatherPerformanceData sAPIPerf->back().extraInfo += ", TIFF append update"; #endif this->tiffMgr.SetTag ( kTIFF_PrimaryIFD, kTIFF_XMP, kTIFF_UndefinedType, (XMP_Uns32)this->xmpPacket.size(), this->xmpPacket.c_str() ); this->tiffMgr.UpdateFileStream ( destRef ); } else { #if GatherPerformanceData sAPIPerf->back().extraInfo += ", TIFF in-place update"; #endif if ( this->xmpPacket.size() < (size_t)this->packetInfo.length ) { // They ought to match, cheap to be sure. size_t extraSpace = (size_t)this->packetInfo.length - this->xmpPacket.size(); this->xmpPacket.append ( extraSpace, ' ' ); } LFA_FileRef liveFile = this->parent->fileRef; XMP_Assert ( this->xmpPacket.size() == (size_t)oldPacketLength ); // ! Done by common PutXMP logic. LFA_Seek ( liveFile, oldPacketOffset, SEEK_SET ); LFA_Write ( liveFile, this->xmpPacket.c_str(), (XMP_Int32)this->xmpPacket.size() ); } this->needsUpdate = false; } // TIFF_MetaHandler::UpdateFile // ================================================================================================= // TIFF_MetaHandler::WriteFile // =========================== // // The structure of TIFF makes it hard to do a sequential source-to-dest copy with interleaved // updates. So, copy the existing source to the destination and call UpdateFile. void TIFF_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { LFA_FileRef destRef = this->parent->fileRef; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; XMP_Int64 fileLen = LFA_Measure ( sourceRef ); if ( fileLen > 0xFFFFFFFFLL ) { // Check before making a copy of the file. XMP_Throw ( "TIFF fles can't exceed 4GB", kXMPErr_BadTIFF ); } LFA_Seek ( sourceRef, 0, SEEK_SET ); LFA_Truncate ( destRef, 0 ); LFA_Copy ( sourceRef, destRef, fileLen, abortProc, abortArg ); this->UpdateFile ( false ); } // TIFF_MetaHandler::WriteFile // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/Trivial_Handler.cpp0000664000175000017500000000464012150230672020772 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "Trivial_Handler.hpp" using namespace std; // ================================================================================================= /// \file Trivial_Handler.cpp /// \brief Base class for trivial handlers that only process in-place XMP. /// /// This header ... /// // ================================================================================================= // ================================================================================================= // Trivial_MetaHandler::~Trivial_MetaHandler // ========================================= Trivial_MetaHandler::~Trivial_MetaHandler() { // Nothing to do. } // Trivial_MetaHandler::~Trivial_MetaHandler // ================================================================================================= // Trivial_MetaHandler::UpdateFile // =============================== void Trivial_MetaHandler::UpdateFile ( bool doSafeUpdate ) { IgnoreParam ( doSafeUpdate ); XMP_Assert ( ! doSafeUpdate ); // Not supported at this level. if ( ! this->needsUpdate ) return; LFA_FileRef fileRef = this->parent->fileRef; XMP_PacketInfo & packetInfo = this->packetInfo; std::string & xmpPacket = this->xmpPacket; LFA_Seek ( fileRef, packetInfo.offset, SEEK_SET ); LFA_Write ( fileRef, xmpPacket.c_str(), packetInfo.length ); XMP_Assert ( xmpPacket.size() == (size_t)packetInfo.length ); this->needsUpdate = false; } // Trivial_MetaHandler::UpdateFile // ================================================================================================= // Trivial_MetaHandler::WriteFile // ============================== void Trivial_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { IgnoreParam ( sourceRef ); IgnoreParam ( sourcePath ); XMP_Throw ( "Trivial_MetaHandler::WriteFile: Not supported", kXMPErr_Unavailable ); } // Trivial_MetaHandler::WriteFile // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/Trivial_Handler.hpp0000664000175000017500000000351412150230672020776 00000000000000#ifndef __Trivial_Handler_hpp__ #define __Trivial_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMPFiles_Impl.hpp" // ================================================================================================= /// \file Trivial_Handler.hpp /// \brief Base class for trivial handlers that only process in-place XMP. /// /// This header ... /// /// \note There is no general promise here about crash-safe I/O. An update to an existing file might /// have invalid partial state while rewriting existing XMP in-place. Crash-safe updates are managed /// at a higher level of XMPFiles, using a temporary file and final swap of file content. /// // ================================================================================================= static const XMP_OptionBits kTrivial_HandlerFlags = ( kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_AllowsSafeUpdate ); class Trivial_MetaHandler : public XMPFileHandler { public: Trivial_MetaHandler() {}; ~Trivial_MetaHandler(); virtual void CacheFileData() = 0; void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); }; // Trivial_MetaHandler // ================================================================================================= #endif /* __Trivial_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/MPEG2_Handler.cpp0000664000175000017500000001706512150230672020177 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2005 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #if XMP_WinBuild #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif #include "MPEG2_Handler.hpp" using namespace std; // ================================================================================================= /// \file MPEG2_Handler.cpp /// \brief File format handler for MPEG2. /// /// BLECH! YUCK! GAG! MPEG-2 is done using a sidecar and recognition only by file extension! BARF!!!!! /// // ================================================================================================= // ================================================================================================= // FindFileExtension // ================= static inline XMP_StringPtr FindFileExtension ( XMP_StringPtr filePath ) { XMP_StringPtr pathEnd = filePath + strlen(filePath); XMP_StringPtr extPtr; for ( extPtr = pathEnd-1; extPtr > filePath; --extPtr ) { if ( (*extPtr == '.') || (*extPtr == '/') ) break; #if XMP_WinBuild if ( (*extPtr == '\\') || (*extPtr == ':') ) break; #endif } if ( (extPtr < filePath) || (*extPtr != '.') ) return pathEnd; return extPtr; } // FindFileExtension // ================================================================================================= // MPEG2_MetaHandlerCTor // ===================== XMPFileHandler * MPEG2_MetaHandlerCTor ( XMPFiles * parent ) { return new MPEG2_MetaHandler ( parent ); } // MPEG2_MetaHandlerCTor // ================================================================================================= // MPEG2_CheckFormat // ================= // The MPEG-2 handler uses just the file extension, not the file content. Worse yet, it also uses a // sidecar file for the XMP. This works better if the handler owns the file, we open the sidecar // instead of the actual MPEG-2 file. bool MPEG2_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ) { IgnoreParam(format); IgnoreParam(filePath); IgnoreParam(fileRef); XMP_Assert ( (format == kXMP_MPEGFile) || (format == kXMP_MPEG2File) ); XMP_Assert ( fileRef == 0 ); return ( (parent->format == kXMP_MPEGFile) || (parent->format == kXMP_MPEGFile) ); // ! Just use the first call's format hint. } // MPEG2_CheckFormat // ================================================================================================= // MPEG2_MetaHandler::MPEG2_MetaHandler // ==================================== MPEG2_MetaHandler::MPEG2_MetaHandler ( XMPFiles * _parent ) { this->parent = _parent; this->handlerFlags = kMPEG2_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; } // MPEG2_MetaHandler::MPEG2_MetaHandler // ================================================================================================= // MPEG2_MetaHandler::~MPEG2_MetaHandler // ===================================== MPEG2_MetaHandler::~MPEG2_MetaHandler() { // Nothing to do. } // MPEG2_MetaHandler::~MPEG2_MetaHandler // ================================================================================================= // MPEG2_MetaHandler::CacheFileData // ================================ void MPEG2_MetaHandler::CacheFileData() { bool readOnly = (! (this->parent->openFlags & kXMPFiles_OpenForUpdate)); this->containsXMP = false; this->processedXMP = true; // Whatever we do here is all that we do for XMPFiles::OpenFile. // Try to open the sidecar XMP file. Tolerate an open failure, there might not be any XMP. // Note that MPEG2_CheckFormat can't save the sidecar path because the handler doesn't exist then. XMP_StringPtr filePath = this->parent->filePath.c_str(); XMP_StringPtr extPtr = FindFileExtension ( filePath ); this->sidecarPath.assign ( filePath, (extPtr - filePath) ); this->sidecarPath += ".xmp"; if ( readOnly ) { try { // *** At this time LFA_Open throws for a failure. this->parent->fileRef = LFA_Open ( this->sidecarPath.c_str(), 'r' ); if ( this->parent->fileRef == 0 ) return; // *** Could someday check for a permission failure. } catch ( ... ) { return; // *** Could someday check for a permission failure. } } else { try { // *** At this time LFA_Open throws for a failure. this->parent->fileRef = LFA_Open ( this->sidecarPath.c_str(), 'w' ); } catch ( ... ) { this->parent->fileRef = 0; // *** Could someday check for a permission failure. } if ( this->parent->fileRef == 0 ) { // Try to create a file if it does not yet exist. // *** Could someday check for a permission failure versus no .xmp file. this->parent->fileRef = LFA_Create ( this->sidecarPath.c_str() ); if ( this->parent->fileRef == 0 ) XMP_Throw ( "Can't create MPEG-2 sidecar", kXMPErr_ExternalFailure ); } } // Extract the sidecar's contents and parse. this->packetInfo.offset = 0; // We take the whole sidecar file. this->packetInfo.length = (XMP_Int32) LFA_Measure ( this->parent->fileRef ); if ( this->packetInfo.length > 0 ) { this->xmpPacket.assign ( this->packetInfo.length, ' ' ); LFA_Read ( this->parent->fileRef, (void*)this->xmpPacket.c_str(), this->packetInfo.length, kLFA_RequireAll ); if ( readOnly ) { LFA_Close ( this->parent->fileRef ); this->parent->fileRef = 0; } this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); this->containsXMP = true; } } // MPEG2_MetaHandler::CacheFileData // ================================================================================================= // MPEG2_MetaHandler::UpdateFile // ============================= void MPEG2_MetaHandler::UpdateFile ( bool doSafeUpdate ) { if ( ! this->needsUpdate ) return; LFA_FileRef fileRef = this->parent->fileRef; XMP_Assert ( fileRef != 0 ); XMP_StringPtr packetStr = this->xmpPacket.c_str(); XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size(); if ( ! doSafeUpdate ) { // Not doing a crash-safe update, simply rewrite the existing sidecar file. LFA_Seek ( fileRef, 0, SEEK_SET ); LFA_Truncate ( fileRef, 0 ); LFA_Write ( fileRef, packetStr, packetLen ); } else { // Do the usual crash-safe update dance. LFA_FileRef tempFileRef = 0; std::string tempFilePath; try { CreateTempFile ( this->sidecarPath, &tempFilePath, kCopyMacRsrc ); tempFileRef = LFA_Open ( tempFilePath.c_str(), 'w' ); LFA_Write ( tempFileRef, packetStr, packetLen ); LFA_Close ( fileRef ); this->parent->fileRef = 0; LFA_Close ( tempFileRef ); tempFileRef = 0; LFA_Delete ( this->sidecarPath.c_str() ); LFA_Rename ( tempFilePath.c_str(), this->sidecarPath.c_str() ); } catch ( ... ) { if ( tempFileRef != 0 ) LFA_Close ( tempFileRef ); if ( ! tempFilePath.empty() ) LFA_Delete ( tempFilePath.c_str() ); } } this->needsUpdate = false; } // MPEG2_MetaHandler::UpdateFile // ================================================================================================= // MPEG2_MetaHandler::WriteFile // ============================ void MPEG2_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { IgnoreParam(sourceRef); IgnoreParam(sourcePath); XMP_Throw ( "MPEG2_MetaHandler::WriteFile: Should never be called", kXMPErr_Unavailable ); } // MPEG2_MetaHandler::WriteFile exempi-2.2.1/source/XMPFiles/FileHandlers/SWF_Handler.hpp0000664000175000017500000000372712150230672020031 00000000000000#ifndef __SWF_Handler_hpp__ #define __SWF_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= //#include "XMP_Environment.h" // ! This must be the first include. #include "XMPFiles_Impl.hpp" //#include "SWF_Support.hpp" // ================================================================================================= /// \file SWF_Handler.hpp /// \brief File format handler for SWF. /// /// This header ... /// // ================================================================================================= // *** Could derive from Basic_Handler - buffer file tail in a temp file. extern XMPFileHandler* SWF_MetaHandlerCTor ( XMPFiles* parent ); extern bool SWF_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); static const XMP_OptionBits kSWF_HandlerFlags = ( kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_PrefersInPlace | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket ); class SWF_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessXMP(); XMP_OptionBits GetSerializeOptions(); void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string& sourcePath ); SWF_MetaHandler ( XMPFiles* parent ); virtual ~SWF_MetaHandler(); }; // SWF_MetaHandler // ================================================================================================= #endif /* __SWF_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/PSD_Handler.cpp0000664000175000017500000003627612150230672020020 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "PSD_Handler.hpp" #include "TIFF_Support.hpp" #include "PSIR_Support.hpp" #include "IPTC_Support.hpp" #include "ReconcileLegacy.hpp" #include "Reconcile_Impl.hpp" #include "MD5.h" using namespace std; // ================================================================================================= /// \file PSD_Handler.cpp /// \brief File format handler for PSD (Photoshop). /// /// This handler ... /// // ================================================================================================= // ================================================================================================= // PSD_CheckFormat // =============== // For PSD we just check the "8BPS" signature, the following version, and that the file is at least // 34 bytes long. This covers the 26 byte header, the 4 byte color mode section length (which might // be 0), and the 4 byte image resource section length (which might be 0). The parsing logic in // CacheFileData will do further checks that the image resources actually exist. Those checks are // not needed to decide if this is a PSD file though, instead they decide if this is valid PSD. // ! The CheckXyzFormat routines don't track the filePos, that is left to ScanXyzFile. bool PSD_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ) { IgnoreParam(format); IgnoreParam(filePath); IgnoreParam(parent); XMP_Assert ( format == kXMP_PhotoshopFile ); IOBuffer ioBuf; LFA_Seek ( fileRef, 0, SEEK_SET ); if ( ! CheckFileSpace ( fileRef, &ioBuf, 34 ) ) return false; // 34 = header plus 2 lengths if ( ! CheckBytes ( ioBuf.ptr, "8BPS", 4 ) ) return false; ioBuf.ptr += 4; // Move to the version. XMP_Uns16 version = GetUns16BE ( ioBuf.ptr ); if ( (version != 1) && (version != 2) ) return false; return true; } // PSD_CheckFormat // ================================================================================================= // PSD_MetaHandlerCTor // =================== XMPFileHandler * PSD_MetaHandlerCTor ( XMPFiles * parent ) { return new PSD_MetaHandler ( parent ); } // PSD_MetaHandlerCTor // ================================================================================================= // PSD_MetaHandler::PSD_MetaHandler // ================================ PSD_MetaHandler::PSD_MetaHandler ( XMPFiles * _parent ) : iptcMgr(0), exifMgr(0), skipReconcile(false) { this->parent = _parent; this->handlerFlags = kPSD_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; } // PSD_MetaHandler::PSD_MetaHandler // ================================================================================================= // PSD_MetaHandler::~PSD_MetaHandler // ================================= PSD_MetaHandler::~PSD_MetaHandler() { if ( this->iptcMgr != 0 ) delete ( this->iptcMgr ); if ( this->exifMgr != 0 ) delete ( this->exifMgr ); } // PSD_MetaHandler::~PSD_MetaHandler // ================================================================================================= // PSD_MetaHandler::CacheFileData // ============================== // // Find and parse the image resource section, everything we want is in there. Don't simply capture // the whole section, there could be lots of stuff we don't care about. // *** This implementation simply returns when an invalid file is encountered. Should we throw instead? void PSD_MetaHandler::CacheFileData() { LFA_FileRef fileRef = this->parent->fileRef; XMP_PacketInfo & packetInfo = this->packetInfo; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); XMP_Assert ( ! this->containsXMP ); // Set containsXMP to true here only if the XMP image resource is found. if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "PSD_MetaHandler::CacheFileData - User abort", kXMPErr_UserAbort ); } XMP_Uns8 psdHeader[30]; XMP_Int64 filePos; XMP_Uns32 ioLen, cmLen, psirLen; filePos = LFA_Seek ( fileRef, 0, SEEK_SET ); ioLen = LFA_Read ( fileRef, psdHeader, 30 ); if ( ioLen != 30 ) return; // Throw? this->imageHeight = GetUns32BE ( &psdHeader[14] ); this->imageWidth = GetUns32BE ( &psdHeader[18] ); cmLen = GetUns32BE ( &psdHeader[26] ); XMP_Int64 psirOrigin = 26 + 4 + cmLen; filePos = LFA_Seek ( fileRef, psirOrigin, SEEK_SET ); if ( filePos != psirOrigin ) return; // Throw? ioLen = LFA_Read ( fileRef, psdHeader, 4 ); if ( ioLen != 4 ) return; // Throw? psirLen = GetUns32BE ( &psdHeader[0] ); this->psirMgr.ParseFileResources ( fileRef, psirLen ); PSIR_Manager::ImgRsrcInfo xmpInfo; bool found = this->psirMgr.GetImgRsrc ( kPSIR_XMP, &xmpInfo ); if ( found ) { // printf ( "PSD_MetaHandler::CacheFileData - XMP packet offset %d (0x%X), size %d\n", // xmpInfo.origOffset, xmpInfo.origOffset, xmpInfo.dataLen ); this->packetInfo.offset = xmpInfo.origOffset; this->packetInfo.length = xmpInfo.dataLen; this->packetInfo.padSize = 0; // Assume for now, set these properly in ProcessXMP. this->packetInfo.charForm = kXMP_CharUnknown; this->packetInfo.writeable = true; this->xmpPacket.assign ( (XMP_StringPtr)xmpInfo.dataPtr, xmpInfo.dataLen ); this->containsXMP = true; } } // PSD_MetaHandler::CacheFileData // ================================================================================================= // PSD_MetaHandler::ProcessXMP // =========================== // // Process the raw XMP and legacy metadata that was previously cached. void PSD_MetaHandler::ProcessXMP() { this->processedXMP = true; // Make sure we only come through here once. // Set up everything for the legacy import, but don't do it yet. This lets us do a forced legacy // import if the XMP packet gets parsing errors. bool readOnly = ((this->parent->openFlags & kXMPFiles_OpenForUpdate) == 0); if ( readOnly ) { this->iptcMgr = new IPTC_Reader(); this->exifMgr = new TIFF_MemoryReader(); } else { this->iptcMgr = new IPTC_Writer(); // ! Parse it later. this->exifMgr = new TIFF_FileWriter(); } PSIR_Manager & psir = this->psirMgr; // Give the compiler help in recognizing non-aliases. IPTC_Manager & iptc = *this->iptcMgr; TIFF_Manager & exif = *this->exifMgr; PSIR_Manager::ImgRsrcInfo iptcInfo, exifInfo; bool haveIPTC = psir.GetImgRsrc ( kPSIR_IPTC, &iptcInfo ); bool haveExif = psir.GetImgRsrc ( kPSIR_Exif, &exifInfo ); int iptcDigestState = kDigestMatches; if ( haveExif ) exif.ParseMemoryStream ( exifInfo.dataPtr, exifInfo.dataLen ); if ( haveIPTC ) { bool haveDigest = false; PSIR_Manager::ImgRsrcInfo digestInfo; haveDigest = psir.GetImgRsrc ( kPSIR_IPTCDigest, &digestInfo ); if ( digestInfo.dataLen != 16 ) haveDigest = false; if ( ! haveDigest ) { iptcDigestState = kDigestMissing; } else { iptcDigestState = PhotoDataUtils::CheckIPTCDigest ( iptcInfo.dataPtr, iptcInfo.dataLen, digestInfo.dataPtr ); } } XMP_OptionBits options = 0; if ( this->containsXMP ) options |= k2XMP_FileHadXMP; if ( haveIPTC ) options |= k2XMP_FileHadIPTC; if ( haveExif ) options |= k2XMP_FileHadExif; // Process the XMP packet. If it fails to parse, do a forced legacy import but still throw an // exception. This tells the caller that an error happened, but gives them recovered legacy // should they want to proceed with that. bool haveXMP = false; if ( ! this->xmpPacket.empty() ) { XMP_Assert ( this->containsXMP ); // Common code takes care of packetInfo.charForm, .padSize, and .writeable. XMP_StringPtr packetStr = this->xmpPacket.c_str(); XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size(); try { this->xmpObj.ParseFromBuffer ( packetStr, packetLen ); haveXMP = true; } catch ( ... ) { XMP_ClearOption ( options, k2XMP_FileHadXMP ); if ( haveIPTC ) iptc.ParseMemoryDataSets ( iptcInfo.dataPtr, iptcInfo.dataLen ); if ( iptcDigestState == kDigestMatches ) iptcDigestState = kDigestMissing; ImportPhotoData ( exif, iptc, psir, iptcDigestState, &this->xmpObj, options ); throw; // ! Rethrow the exception, don't absorb it. } } // Process the legacy metadata. if ( haveIPTC && (! haveXMP) && (iptcDigestState == kDigestMatches) ) iptcDigestState = kDigestMissing; bool parseIPTC = (iptcDigestState != kDigestMatches) || (! readOnly); if ( parseIPTC ) iptc.ParseMemoryDataSets ( iptcInfo.dataPtr, iptcInfo.dataLen ); ImportPhotoData ( exif, iptc, psir, iptcDigestState, &this->xmpObj, options ); this->containsXMP = true; // Assume we now have something in the XMP. } // PSD_MetaHandler::ProcessXMP // ================================================================================================= // PSD_MetaHandler::UpdateFile // =========================== void PSD_MetaHandler::UpdateFile ( bool doSafeUpdate ) { XMP_Assert ( ! doSafeUpdate ); // This should only be called for "unsafe" updates. XMP_Int64 oldPacketOffset = this->packetInfo.offset; XMP_Int32 oldPacketLength = this->packetInfo.length; if ( oldPacketOffset == kXMPFiles_UnknownOffset ) oldPacketOffset = 0; // ! Simplify checks. if ( oldPacketLength == kXMPFiles_UnknownLength ) oldPacketLength = 0; bool fileHadXMP = ((oldPacketOffset != 0) && (oldPacketLength != 0)); // Update the IPTC-IIM and native TIFF/Exif metadata. ExportPhotoData also trips the tiff: and // exif: copies from the XMP, so reserialize the now final XMP packet. ExportPhotoData ( kXMP_PhotoshopFile, &this->xmpObj, this->exifMgr, this->iptcMgr, &this->psirMgr ); try { XMP_OptionBits options = kXMP_UseCompactFormat; if ( fileHadXMP ) options |= kXMP_ExactPacketLength; this->xmpObj.SerializeToBuffer ( &this->xmpPacket, options, oldPacketLength ); } catch ( ... ) { this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat ); } // Decide whether to do an in-place update. This can only happen if all of the following are true: // - There is an XMP packet in the file. // - The are no changes to the legacy image resources. (The IPTC and EXIF are in the PSIR.) // - The new XMP can fit in the old space. bool doInPlace = (fileHadXMP && (this->xmpPacket.size() <= (size_t)oldPacketLength)); if ( this->psirMgr.IsLegacyChanged() ) doInPlace = false; if ( doInPlace ) { #if GatherPerformanceData sAPIPerf->back().extraInfo += ", PSD in-place update"; #endif if ( this->xmpPacket.size() < (size_t)this->packetInfo.length ) { // They ought to match, cheap to be sure. size_t extraSpace = (size_t)this->packetInfo.length - this->xmpPacket.size(); this->xmpPacket.append ( extraSpace, ' ' ); } LFA_FileRef liveFile = this->parent->fileRef; XMP_Assert ( this->xmpPacket.size() == (size_t)oldPacketLength ); // ! Done by common PutXMP logic. // printf ( "PSD_MetaHandler::UpdateFile - XMP in-place packet offset %lld (0x%llX), size %d\n", // oldPacketOffset, oldPacketOffset, this->xmpPacket.size() ); LFA_Seek ( liveFile, oldPacketOffset, SEEK_SET ); LFA_Write ( liveFile, this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); } else { #if GatherPerformanceData sAPIPerf->back().extraInfo += ", PSD copy update"; #endif std::string origPath = this->parent->filePath; LFA_FileRef origRef = this->parent->fileRef; std::string updatePath; LFA_FileRef updateRef = 0; CreateTempFile ( origPath, &updatePath, kCopyMacRsrc ); updateRef = LFA_Open ( updatePath.c_str(), 'w' ); this->parent->filePath = updatePath; this->parent->fileRef = updateRef; try { XMP_Assert ( ! this->skipReconcile ); this->skipReconcile = true; this->WriteFile ( origRef, origPath ); this->skipReconcile = false; } catch ( ... ) { this->skipReconcile = false; LFA_Close ( updateRef ); LFA_Delete ( updatePath.c_str() ); this->parent->filePath = origPath; this->parent->fileRef = origRef; throw; } LFA_Close ( origRef ); LFA_Delete ( origPath.c_str() ); LFA_Close ( updateRef ); LFA_Rename ( updatePath.c_str(), origPath.c_str() ); this->parent->filePath = origPath; this->parent->fileRef = 0; } this->needsUpdate = false; } // PSD_MetaHandler::UpdateFile // ================================================================================================= // PSD_MetaHandler::WriteFile // ========================== // The metadata parts of a Photoshop file are all in the image resources. The PSIR_Manager's // UpdateFileResources method will take care of the image resource portion of the file, updating // those resources that have changed and preserving those that have not. void PSD_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { LFA_FileRef destRef = this->parent->fileRef; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); XMP_Uns64 sourceLen = LFA_Measure ( sourceRef ); if ( sourceLen == 0 ) return; // Tolerate empty files. // Reconcile the legacy metadata, unless this is called from UpdateFile. Reserialize the XMP to // get standard padding, PutXMP has probably done an in-place serialize. Set the XMP image resource. if ( ! skipReconcile ) { // Update the IPTC-IIM and native TIFF/Exif metadata, and reserialize the now final XMP packet. ExportPhotoData ( kXMP_JPEGFile, &this->xmpObj, this->exifMgr, this->iptcMgr, &this->psirMgr ); this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat ); } this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat ); this->packetInfo.offset = kXMPFiles_UnknownOffset; this->packetInfo.length = (XMP_StringLen)this->xmpPacket.size(); FillPacketInfo ( this->xmpPacket, &this->packetInfo ); this->psirMgr.SetImgRsrc ( kPSIR_XMP, this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); // Copy the file header and color mode section, then write the updated image resource section, // and copy the tail of the source file (layer and mask section to EOF). LFA_Seek ( sourceRef, 0, SEEK_SET ); LFA_Truncate (destRef, 0 ); LFA_Copy ( sourceRef, destRef, 26 ); // Copy the file header. XMP_Uns32 cmLen; LFA_Read ( sourceRef, &cmLen, 4 ); LFA_Write ( destRef, &cmLen, 4 ); // Copy the color mode section length. cmLen = GetUns32BE ( &cmLen ); LFA_Copy ( sourceRef, destRef, cmLen ); // Copy the color mode section contents. XMP_Uns32 irLen; LFA_Read ( sourceRef, &irLen, 4 ); // Get the source image resource section length. irLen = GetUns32BE ( &irLen ); this->psirMgr.UpdateFileResources ( sourceRef, destRef, 0, abortProc, abortArg ); XMP_Uns64 tailOffset = 26 + 4 + cmLen + 4 + irLen; XMP_Uns64 tailLength = sourceLen - tailOffset; LFA_Seek ( sourceRef, tailOffset, SEEK_SET ); LFA_Seek ( destRef, 0, SEEK_END ); LFA_Copy ( sourceRef, destRef, tailLength ); // Copy the tail of the file. this->needsUpdate = false; } // PSD_MetaHandler::WriteFile // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/InDesign_Handler.cpp0000664000175000017500000004075012150230672021062 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "InDesign_Handler.hpp" using namespace std; // ================================================================================================= /// \file InDesign_Handler.cpp /// \brief File format handler for InDesign files. /// /// This header ... /// /// The layout of an InDesign file in terms of the Basic_MetaHandler model is: /// /// \li The front of the file. This is everything up to the XMP contiguous object section. The file /// starts with a pair of master pages, followed by the data pages, followed by contiguous object /// sections, finished with padding to a page boundary. /// /// \li A prefix for the XMP section. This is the contiguous object header. The offset is /// (this->packetInfo.offset - this->xmpPrefixSize). /// /// \li The XMP packet. The offset is this->packetInfo.offset. /// /// \li A suffix for the XMP section. This is the contiguous object header. The offset is /// (this->packetInfo.offset + this->packetInfo.length). /// /// \li Trailing file content. This is the contiguous objects that follow the XMP. The offset is /// (this->packetInfo.offset + this->packetInfo.length + this->xmpSuffixSize). /// /// \li The back of the file. This is the final padding to a page boundary. The offset is /// (this->packetInfo.offset + this->packetInfo.length + this->xmpSuffixSize + this->trailingContentSize). /// // ================================================================================================= // *** Add PutXMP overrides that throw if the file does not contain XMP. #ifndef TraceInDesignHandler #define TraceInDesignHandler 0 #endif enum { kInDesignGUIDSize = 16 }; struct InDesignMasterPage { XMP_Uns8 fGUID [kInDesignGUIDSize]; XMP_Uns8 fMagicBytes [8]; XMP_Uns8 fObjectStreamEndian; XMP_Uns8 fIrrelevant1 [239]; XMP_Uns64 fSequenceNumber; XMP_Uns8 fIrrelevant2 [8]; XMP_Uns32 fFilePages; XMP_Uns8 fIrrelevant3 [3812]; }; enum { kINDD_PageSize = 4096, kINDD_PageMask = (kINDD_PageSize - 1), kINDD_LittleEndian = 1, kINDD_BigEndian = 2 }; struct InDesignContigObjMarker { XMP_Uns8 fGUID [kInDesignGUIDSize]; XMP_Uns32 fObjectUID; XMP_Uns32 fObjectClassID; XMP_Uns32 fStreamLength; XMP_Uns32 fChecksum; }; static const XMP_Uns8 * kINDD_MasterPageGUID = (const XMP_Uns8 *) "\x06\x06\xED\xF5\xD8\x1D\x46\xE5\xBD\x31\xEF\xE7\xFE\x74\xB7\x1D"; static const XMP_Uns8 * kINDDContigObjHeaderGUID = (const XMP_Uns8 *) "\xDE\x39\x39\x79\x51\x88\x4B\x6C\x8E\x63\xEE\xF8\xAE\xE0\xDD\x38"; static const XMP_Uns8 * kINDDContigObjTrailerGUID = (const XMP_Uns8 *) "\xFD\xCE\xDB\x70\xF7\x86\x4B\x4F\xA4\xD3\xC7\x28\xB3\x41\x71\x06"; // ================================================================================================= // InDesign_MetaHandlerCTor // ======================== XMPFileHandler * InDesign_MetaHandlerCTor ( XMPFiles * parent ) { return new InDesign_MetaHandler ( parent ); } // InDesign_MetaHandlerCTor // ================================================================================================= // InDesign_CheckFormat // ==================== // // For InDesign we check that the pair of master pages begin with the 16 byte GUID. bool InDesign_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ) { IgnoreParam(format); IgnoreParam(filePath); IgnoreParam(parent); XMP_Assert ( format == kXMP_InDesignFile ); XMP_Assert ( strlen ( (const char *) kINDD_MasterPageGUID ) == kInDesignGUIDSize ); enum { kBufferSize = 2*kINDD_PageSize }; XMP_Uns8 buffer [kBufferSize]; XMP_Int64 filePos = 0; XMP_Uns8 * bufPtr = buffer; XMP_Uns8 * bufLimit = bufPtr + kBufferSize; LFA_Seek ( fileRef, 0, SEEK_SET ); size_t bufLen = LFA_Read ( fileRef, buffer, kBufferSize ); if ( bufLen != kBufferSize ) return false; if ( ! CheckBytes ( bufPtr, kINDD_MasterPageGUID, kInDesignGUIDSize ) ) return false; if ( ! CheckBytes ( bufPtr+kINDD_PageSize, kINDD_MasterPageGUID, kInDesignGUIDSize ) ) return false; return true; } // InDesign_CheckFormat // ================================================================================================= // InDesign_MetaHandler::InDesign_MetaHandler // ========================================== InDesign_MetaHandler::InDesign_MetaHandler ( XMPFiles * _parent ) : streamBigEndian(0), xmpObjID(0), xmpClassID(0) { this->parent = _parent; this->handlerFlags = kInDesign_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; } // InDesign_MetaHandler::InDesign_MetaHandler // ================================================================================================= // InDesign_MetaHandler::~InDesign_MetaHandler // =========================================== InDesign_MetaHandler::~InDesign_MetaHandler() { // Nothing to do here. } // InDesign_MetaHandler::~InDesign_MetaHandler // ================================================================================================= // InDesign_MetaHandler::CacheFileData // =================================== // // Look for the XMP in an InDesign database file. This is a paged database using 4K byte pages, // followed by redundant "contiguous object streams". Each contiguous object stream is a copy of a // database object stored as a contiguous byte stream. The XMP that we want is one of these. // // The first 2 pages of the database are alternating master pages. A generation number is used to // select the active master page. The master page contains an offset to the start of the contiguous // object streams. Each of the contiguous object streams contains a header and trailer, allowing // fast motion from one stream to the next. // // There is no unique "what am I" tagging to the contiguous object streams, so we simply pick the // first one that looks right. At present this is a 4 byte little endian packet size followed by the // packet. // ! Note that insertion of XMP is not allowed for InDesign, the XMP must be a contiguous copy of an // ! internal database object. So we don't set the packet offset to an insertion point if not found. void InDesign_MetaHandler::CacheFileData() { LFA_FileRef fileRef = this->parent->fileRef; XMP_PacketInfo & packetInfo = this->packetInfo; IOBuffer ioBuf; size_t dbPages; XMP_Uns8 cobjEndian; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); XMP_Assert ( kINDD_PageSize == sizeof(InDesignMasterPage) ); XMP_Assert ( kIOBufferSize >= (2 * kINDD_PageSize) ); this->containsXMP = false; // --------------------------------------------------------------------------------- // Figure out which master page is active and seek to the contiguous object portion. { ioBuf.filePos = 0; ioBuf.ptr = ioBuf.limit; // Make sure RefillBuffer does a simple read. LFA_Seek ( fileRef, ioBuf.filePos, SEEK_SET ); RefillBuffer ( fileRef, &ioBuf ); if ( ioBuf.len < (2 * kINDD_PageSize) ) XMP_Throw ( "GetMainPacket/ScanInDesignFile: Read failure", kXMPErr_ExternalFailure ); InDesignMasterPage * masters = (InDesignMasterPage *) ioBuf.ptr; XMP_Uns64 seq0 = GetUns64LE ( (XMP_Uns8 *) &masters[0].fSequenceNumber ); XMP_Uns64 seq1 = GetUns64LE ( (XMP_Uns8 *) &masters[1].fSequenceNumber ); dbPages = GetUns32LE ( (XMP_Uns8 *) &masters[0].fFilePages ); cobjEndian = masters[0].fObjectStreamEndian; if ( seq1 > seq0 ) { dbPages = GetUns32LE ( (XMP_Uns8 *) &masters[1].fFilePages ); cobjEndian = masters[1].fObjectStreamEndian; } } XMP_Assert ( ! this->streamBigEndian ); if ( cobjEndian == kINDD_BigEndian ) this->streamBigEndian = true; // --------------------------------------------------------------------------------------------- // Look for the XMP contiguous object stream. Most of the time there will be just one stream and // it will be the XMP. So we might as well fill the whole buffer and not worry about reading too // much and seeking back to the start of the following stream. XMP_Int64 cobjPos = (XMP_Int64)dbPages * kINDD_PageSize; // ! Use a 64 bit multiply! cobjPos -= (2 * sizeof(InDesignContigObjMarker)); // ! For the first pass in the loop. XMP_Uns32 streamLength = 0; // ! For the first pass in the loop. while ( true ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "InDesign_MetaHandler::LocateXMP - User abort", kXMPErr_UserAbort ); } // Fetch the start of the next stream and check the contiguous object header. // ! The writeable bit of fObjectClassID is ignored, we use the packet trailer flag. cobjPos += streamLength + (2 * sizeof(InDesignContigObjMarker)); ioBuf.filePos = cobjPos; ioBuf.ptr = ioBuf.limit; // Make sure RefillBuffer does a simple read. LFA_Seek ( fileRef, ioBuf.filePos, SEEK_SET ); RefillBuffer ( fileRef, &ioBuf ); if ( ioBuf.len < (2 * sizeof(InDesignContigObjMarker)) ) break; // Too small, must be end of file. const InDesignContigObjMarker * cobjHeader = (const InDesignContigObjMarker *) ioBuf.ptr; if ( ! CheckBytes ( Uns8Ptr(&cobjHeader->fGUID), kINDDContigObjHeaderGUID, kInDesignGUIDSize ) ) break; // Not a contiguous object header. this->xmpObjID = cobjHeader->fObjectUID; // Save these now while the buffer is good. this->xmpClassID = cobjHeader->fObjectClassID; streamLength = GetUns32LE ( (XMP_Uns8 *) &cobjHeader->fStreamLength ); ioBuf.ptr += sizeof ( InDesignContigObjMarker ); // See if this is the XMP stream. Only check for UTF-8, others get caught in fallback scanning. if ( ! CheckFileSpace ( fileRef, &ioBuf, 4 ) ) continue; // Too small, can't possibly be XMP. XMP_Uns32 innerLength = GetUns32LE ( ioBuf.ptr ); if ( this->streamBigEndian ) innerLength = GetUns32BE ( ioBuf.ptr ); if ( innerLength != (streamLength - 4) ) continue; // Not legit XMP. ioBuf.ptr += 4; if ( ! CheckFileSpace ( fileRef, &ioBuf, kUTF8_PacketHeaderLen ) ) continue; // Too small, can't possibly be XMP. if ( ! CheckBytes ( ioBuf.ptr, kUTF8_PacketStart, strlen((char*)kUTF8_PacketStart) ) ) continue; ioBuf.ptr += strlen((char*)kUTF8_PacketStart); XMP_Uns8 quote = *ioBuf.ptr; if ( (quote != '\'') && (quote != '"') ) continue; ioBuf.ptr += 1; if ( *ioBuf.ptr != quote ) { if ( ! CheckBytes ( ioBuf.ptr, Uns8Ptr("\xEF\xBB\xBF"), 3 ) ) continue; ioBuf.ptr += 3; } if ( *ioBuf.ptr != quote ) continue; ioBuf.ptr += 1; if ( ! CheckBytes ( ioBuf.ptr, Uns8Ptr(" id="), 4 ) ) continue; ioBuf.ptr += 4; quote = *ioBuf.ptr; if ( (quote != '\'') && (quote != '"') ) continue; ioBuf.ptr += 1; if ( ! CheckBytes ( ioBuf.ptr, kUTF8_PacketID, strlen((char*)kUTF8_PacketID) ) ) continue; ioBuf.ptr += strlen((char*)kUTF8_PacketID); if ( *ioBuf.ptr != quote ) continue; ioBuf.ptr += 1; // We've seen enough, it is the XMP. To fit the Basic_Handler model we need to compute the // total size of remaining contiguous objects, the trailingContentSize. this->xmpPrefixSize = sizeof(InDesignContigObjMarker) + 4; this->xmpSuffixSize = sizeof(InDesignContigObjMarker); packetInfo.offset = cobjPos + this->xmpPrefixSize; packetInfo.length = innerLength; XMP_Int64 tcStart = cobjPos + streamLength + (2 * sizeof(InDesignContigObjMarker)); while ( true ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "InDesign_MetaHandler::LocateXMP - User abort", kXMPErr_UserAbort ); } cobjPos += streamLength + (2 * sizeof(InDesignContigObjMarker)); ioBuf.filePos = cobjPos; ioBuf.ptr = ioBuf.limit; // Make sure RefillBuffer does a simple read. LFA_Seek ( fileRef, ioBuf.filePos, SEEK_SET ); RefillBuffer ( fileRef, &ioBuf ); if ( ioBuf.len < sizeof(InDesignContigObjMarker) ) break; // Too small, must be end of file. cobjHeader = (const InDesignContigObjMarker *) ioBuf.ptr; if ( ! CheckBytes ( Uns8Ptr(&cobjHeader->fGUID), kINDDContigObjHeaderGUID, kInDesignGUIDSize ) ) break; // Not a contiguous object header. streamLength = GetUns32LE ( (XMP_Uns8 *) &cobjHeader->fStreamLength ); } this->trailingContentSize = cobjPos - tcStart; #if TraceInDesignHandler XMP_Uns32 pktOffset = (XMP_Uns32)this->packetInfo.offset; printf ( "Found XMP in InDesign file, offsets:\n" ); printf ( " CObj head %X, XMP %X, CObj tail %X, file tail %X, padding %X\n", (pktOffset - this->xmpPrefixSize), pktOffset, (pktOffset + this->packetInfo.length), (pktOffset + this->packetInfo.length + this->xmpSuffixSize), (pktOffset + this->packetInfo.length + this->xmpSuffixSize + (XMP_Uns32)this->trailingContentSize) ); #endif this->containsXMP = true; break; } if ( this->containsXMP ) { this->xmpFileOffset = packetInfo.offset; this->xmpFileSize = packetInfo.length; ReadXMPPacket ( this ); } } // InDesign_MetaHandler::CacheFileData // ================================================================================================= // InDesign_MetaHandler::WriteXMPPrefix // ==================================== void InDesign_MetaHandler::WriteXMPPrefix() { // Write the contiguous object header and the 4 byte length of the XMP packet. LFA_FileRef fileRef = this->parent->fileRef; XMP_Uns32 packetSize = (XMP_Uns32)this->xmpPacket.size(); InDesignContigObjMarker header; memcpy ( header.fGUID, kINDDContigObjHeaderGUID, sizeof(header.fGUID) ); // AUDIT: Use of dest sizeof for length is safe. header.fObjectUID = this->xmpObjID; header.fObjectClassID = this->xmpClassID; header.fStreamLength = MakeUns32LE ( 4 + packetSize ); header.fChecksum = (XMP_Uns32)(-1); LFA_Write ( fileRef, &header, sizeof(header) ); XMP_Uns32 pktLength = MakeUns32LE ( packetSize ); if ( this->streamBigEndian ) pktLength = MakeUns32BE ( packetSize ); LFA_Write ( fileRef, &pktLength, sizeof(pktLength) ); } // InDesign_MetaHandler::WriteXMPPrefix // ================================================================================================= // InDesign_MetaHandler::WriteXMPSuffix // ==================================== void InDesign_MetaHandler::WriteXMPSuffix() { // Write the contiguous object trailer. LFA_FileRef fileRef = this->parent->fileRef; XMP_Uns32 packetSize = (XMP_Uns32)this->xmpPacket.size(); InDesignContigObjMarker trailer; memcpy ( trailer.fGUID, kINDDContigObjTrailerGUID, sizeof(trailer.fGUID) ); // AUDIT: Use of dest sizeof for length is safe. trailer.fObjectUID = this->xmpObjID; trailer.fObjectClassID = this->xmpClassID; trailer.fStreamLength = MakeUns32LE ( 4 + packetSize ); trailer.fChecksum = (XMP_Uns32)(-1); LFA_Write ( fileRef, &trailer, sizeof(trailer) ); } // InDesign_MetaHandler::WriteXMPSuffix // ================================================================================================= // InDesign_MetaHandler::NoteXMPRemoval // ==================================== void InDesign_MetaHandler::NoteXMPRemoval() { // Nothing to do. } // InDesign_MetaHandler::NoteXMPRemoval // ================================================================================================= // InDesign_MetaHandler::NoteXMPInsertion // ====================================== void InDesign_MetaHandler::NoteXMPInsertion() { // Nothing to do. } // InDesign_MetaHandler::NoteXMPInsertion // ================================================================================================= // InDesign_MetaHandler::CaptureFileEnding // ======================================= void InDesign_MetaHandler::CaptureFileEnding() { // Nothing to do. The back of an InDesign file is the final zero padding. } // InDesign_MetaHandler::CaptureFileEnding // ================================================================================================= // InDesign_MetaHandler::RestoreFileEnding // ======================================= void InDesign_MetaHandler::RestoreFileEnding() { // Pad the file with zeros to a page boundary. LFA_FileRef fileRef = this->parent->fileRef; XMP_Int64 dataLength = LFA_Measure ( fileRef ); XMP_Int32 padLength = (kINDD_PageSize - ((XMP_Int32)dataLength & kINDD_PageMask)) & kINDD_PageMask; XMP_Uns8 buffer [kINDD_PageSize]; memset ( buffer, 0, kINDD_PageSize ); LFA_Write ( fileRef, buffer, padLength ); } // InDesign_MetaHandler::RestoreFileEnding // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/P2_Handler.hpp0000664000175000017500000000762412150230672017653 00000000000000#ifndef __P2_Handler_hpp__ #define __P2_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "XMPFiles_Impl.hpp" #include "ExpatAdapter.hpp" #include "MD5.h" // ================================================================================================= /// \file P2_Handler.hpp /// \brief Folder format handler for P2. /// /// This header ... /// // ================================================================================================= // *** Could derive from Basic_Handler - buffer file tail in a temp file. extern XMPFileHandler * P2_MetaHandlerCTor ( XMPFiles * parent ); extern bool P2_CheckFormat ( XMP_FileFormat format, const std::string & rootPath, const std::string & gpName, const std::string & parentName, const std::string & leafName, XMPFiles * parent ); static const XMP_OptionBits kP2_HandlerFlags = (kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_CanRewrite | kXMPFiles_PrefersInPlace | kXMPFiles_CanReconcile | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_HandlerOwnsFile | kXMPFiles_AllowsSafeUpdate | kXMPFiles_UsesSidecarXMP | kXMPFiles_FolderBasedFormat); class P2_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessXMP(); XMP_OptionBits GetSerializeOptions() // *** These should be standard for standalone XMP files. { return (kXMP_UseCompactFormat | kXMP_OmitPacketWrapper); }; void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); P2_MetaHandler ( XMPFiles * _parent ); virtual ~P2_MetaHandler(); private: P2_MetaHandler() : expat(0), clipMetadata(0), clipContent(0) {}; // Hidden on purpose. void MakeClipFilePath ( std::string * path, XMP_StringPtr suffix ); void MakeLegacyDigest ( std::string * digestStr ); void CleanupLegacyXML(); void DigestLegacyItem ( MD5_CTX & md5Context, XML_NodePtr legacyContext, XMP_StringPtr legacyPropName ); void DigestLegacyRelations ( MD5_CTX & md5Context ); void SetXMPPropertyFromLegacyXML ( bool digestFound, XML_NodePtr legacyContext, XMP_StringPtr schemaNS, XMP_StringPtr propName, XMP_StringPtr legacyPropName, bool isLocalized ); void SetRelationsFromLegacyXML ( bool digestFound ); void SetAudioInfoFromLegacyXML ( bool digestFound ); void SetVideoInfoFromLegacyXML ( bool digestFound ); void SetDurationFromLegacyXML ( bool digestFound ); void SetVideoFrameInfoFromLegacyXML ( XML_NodePtr legacyVideoContext, bool digestFound ); void SetStartTimecodeFromLegacyXML ( XML_NodePtr legacyVideoContext, bool digestFound ); void SetGPSPropertyFromLegacyXML ( XML_NodePtr legacyLocationContext, bool digestFound, XMP_StringPtr propName, XMP_StringPtr legacyPropName ); void SetAltitudeFromLegacyXML ( XML_NodePtr legacyLocationContext, bool digestFound ); XML_Node * ForceChildElement ( XML_Node * parent, XMP_StringPtr localName, int indent = 0 ); std::string rootPath, clipName, p2NS; ExpatAdapter * expat; XML_Node * clipMetadata; // ! Don't delete, points into the Expat tree. XML_Node * clipContent; // ! Don't delete, points into the Expat tree. }; // P2_MetaHandler // ================================================================================================= #endif /* __P2_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/PNG_Handler.cpp0000664000175000017500000001714312150230672020006 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "PNG_Handler.hpp" #include "PNG_Support.hpp" using namespace std; // ================================================================================================= /// \file PNG_Handler.hpp /// \brief File format handler for PNG. /// /// This handler ... /// // ================================================================================================= // ================================================================================================= // PNG_MetaHandlerCTor // ==================== XMPFileHandler * PNG_MetaHandlerCTor ( XMPFiles * parent ) { return new PNG_MetaHandler ( parent ); } // PNG_MetaHandlerCTor // ================================================================================================= // PNG_CheckFormat // =============== bool PNG_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ) { IgnoreParam(format); IgnoreParam(fileRef); IgnoreParam(parent); XMP_Assert ( format == kXMP_PNGFile ); IOBuffer ioBuf; LFA_Seek ( fileRef, 0, SEEK_SET ); if ( ! CheckFileSpace ( fileRef, &ioBuf, PNG_SIGNATURE_LEN ) ) return false; // We need at least 8, the buffer is filled anyway. if ( ! CheckBytes ( ioBuf.ptr, PNG_SIGNATURE_DATA, PNG_SIGNATURE_LEN ) ) return false; return true; } // PNG_CheckFormat // ================================================================================================= // PNG_MetaHandler::PNG_MetaHandler // ================================== PNG_MetaHandler::PNG_MetaHandler ( XMPFiles * _parent ) { this->parent = _parent; this->handlerFlags = kPNG_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; } // ================================================================================================= // PNG_MetaHandler::~PNG_MetaHandler // =================================== PNG_MetaHandler::~PNG_MetaHandler() { } // ================================================================================================= // PNG_MetaHandler::CacheFileData // =============================== void PNG_MetaHandler::CacheFileData() { this->containsXMP = false; LFA_FileRef fileRef ( this->parent->fileRef ); if ( fileRef == 0) return; PNG_Support::ChunkState chunkState; long numChunks = PNG_Support::OpenPNG ( fileRef, chunkState ); if ( numChunks == 0 ) return; if (chunkState.xmpLen != 0) { // XMP present this->xmpPacket.reserve(chunkState.xmpLen); this->xmpPacket.assign(chunkState.xmpLen, ' '); if (PNG_Support::ReadBuffer ( fileRef, chunkState.xmpPos, chunkState.xmpLen, const_cast(this->xmpPacket.data()) )) { this->packetInfo.offset = chunkState.xmpPos; this->packetInfo.length = chunkState.xmpLen; this->containsXMP = true; } } else { // no XMP } } // PNG_MetaHandler::CacheFileData // ================================================================================================= // PNG_MetaHandler::ProcessXMP // ============================ // // Process the raw XMP and legacy metadata that was previously cached. void PNG_MetaHandler::ProcessXMP() { this->processedXMP = true; // Make sure we only come through here once. // Process the XMP packet. if ( ! this->xmpPacket.empty() ) { XMP_Assert ( this->containsXMP ); XMP_StringPtr packetStr = this->xmpPacket.c_str(); XMP_StringLen packetLen = (XMP_StringLen)this->xmpPacket.size(); this->xmpObj.ParseFromBuffer ( packetStr, packetLen ); this->containsXMP = true; } } // PNG_MetaHandler::ProcessXMP // ================================================================================================= // PNG_MetaHandler::UpdateFile // ============================ void PNG_MetaHandler::UpdateFile ( bool doSafeUpdate ) { bool updated = false; if ( ! this->needsUpdate ) return; if ( doSafeUpdate ) XMP_Throw ( "PNG_MetaHandler::UpdateFile: Safe update not supported", kXMPErr_Unavailable ); XMP_StringPtr packetStr = xmpPacket.c_str(); XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size(); if ( packetLen == 0 ) return; LFA_FileRef fileRef(this->parent->fileRef); if ( fileRef == 0 ) return; PNG_Support::ChunkState chunkState; long numChunks = PNG_Support::OpenPNG ( fileRef, chunkState ); if ( numChunks == 0 ) return; // write/update chunk if (chunkState.xmpLen == 0) { // no current chunk -> inject updated = SafeWriteFile(); } else if (chunkState.xmpLen >= packetLen ) { // current chunk size is sufficient -> write and update CRC (in place update) updated = PNG_Support::WriteBuffer(fileRef, chunkState.xmpPos, packetLen, packetStr ); PNG_Support::UpdateChunkCRC(fileRef, chunkState.xmpChunk ); } else if (chunkState.xmpLen < packetLen) { // XMP is too large for current chunk -> expand updated = SafeWriteFile(); } if ( ! updated )return; // If there's an error writing the chunk, bail. this->needsUpdate = false; } // PNG_MetaHandler::UpdateFile // ================================================================================================= // PNG_MetaHandler::WriteFile // =========================== void PNG_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { LFA_FileRef destRef = this->parent->fileRef; PNG_Support::ChunkState chunkState; long numChunks = PNG_Support::OpenPNG ( sourceRef, chunkState ); if ( numChunks == 0 ) return; LFA_Truncate(destRef, 0); LFA_Write(destRef, PNG_SIGNATURE_DATA, PNG_SIGNATURE_LEN); PNG_Support::ChunkIterator curPos = chunkState.chunks.begin(); PNG_Support::ChunkIterator endPos = chunkState.chunks.end(); for (; (curPos != endPos); ++curPos) { PNG_Support::ChunkData chunk = *curPos; // discard existing XMP chunk if (chunk.xmp) continue; // copy any other chunk PNG_Support::CopyChunk(sourceRef, destRef, chunk); // place XMP chunk immediately after IHDR-chunk if (PNG_Support::CheckIHDRChunkHeader(chunk)) { XMP_StringPtr packetStr = xmpPacket.c_str(); XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size(); PNG_Support::WriteXMPChunk(destRef, packetLen, packetStr ); } } } // PNG_MetaHandler::WriteFile // ================================================================================================= // PNG_MetaHandler::SafeWriteFile // =========================== bool PNG_MetaHandler::SafeWriteFile () { bool ret = false; std::string origPath = this->parent->filePath; LFA_FileRef origRef = this->parent->fileRef; std::string updatePath; LFA_FileRef updateRef = 0; CreateTempFile ( origPath, &updatePath, kCopyMacRsrc ); updateRef = LFA_Open ( updatePath.c_str(), 'w' ); this->parent->filePath = updatePath; this->parent->fileRef = updateRef; try { this->WriteFile ( origRef, origPath ); ret = true; } catch ( ... ) { LFA_Close ( updateRef ); LFA_Delete ( updatePath.c_str() ); this->parent->filePath = origPath; this->parent->fileRef = origRef; throw; } LFA_Close ( origRef ); LFA_Delete ( origPath.c_str() ); LFA_Close ( updateRef ); LFA_Rename ( updatePath.c_str(), origPath.c_str() ); this->parent->filePath = origPath; this->parent->fileRef = 0; return ret; } // PNG_MetaHandler::SafeWriteFile // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/RIFF_Handler.hpp0000664000175000017500000000473112150230672020114 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2009 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #ifndef __RIFF_Handler_hpp__ #define __RIFF_Handler_hpp__ 1 #include "XMP_Const.h" #include "XMPFiles_Impl.hpp" #include "RIFF_Support.hpp" // ================================================================================================= /// \file RIFF_Handler.hpp /// \brief File format handler for RIFF (AVI, WAV). // ================================================================================================= extern XMPFileHandler * RIFF_MetaHandlerCTor ( XMPFiles * parent ); extern bool RIFF_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); static const XMP_OptionBits kRIFF_HandlerFlags = (kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_PrefersInPlace | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_CanReconcile ); class RIFF_MetaHandler : public XMPFileHandler { public: RIFF_MetaHandler ( XMPFiles* parent ); ~RIFF_MetaHandler(); void CacheFileData(); void ProcessXMP(); void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); //////////////////////////////////////////////////////////////////////////////////// // instance vars // most often just one RIFF:* (except for AVI,[AVIX] >1 GB) std::vector riffChunks; XMP_Int64 oldFileSize, newFileSize, trailingGarbageSize; // state variables, needed during parsing XMP_Uns8 level; RIFF::ContainerChunk *listInfoChunk, *listTdatChunk; RIFF::ValueChunk* dispChunk; RIFF::ValueChunk* bextChunk; RIFF::ValueChunk* cr8rChunk; RIFF::ValueChunk* prmlChunk; RIFF::XMPChunk* xmpChunk; RIFF::ContainerChunk* lastChunk; bool hasListInfoINAM; // needs to be known for the special 3-way merge around dc:title }; // RIFF_MetaHandler // ================================================================================================= #endif /* __RIFF_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/XDCAMEX_Handler.hpp0000664000175000017500000000542212150230672020455 00000000000000#ifndef __XDCAMEX_Handler_hpp__ #define __XDCAMEX_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "XMPFiles_Impl.hpp" #include "ExpatAdapter.hpp" // ================================================================================================= /// \file XDCAMEX_Handler.hpp /// \brief Folder format handler for XDCAMEX. // ================================================================================================= extern XMPFileHandler * XDCAMEX_MetaHandlerCTor ( XMPFiles * parent ); extern bool XDCAMEX_CheckFormat ( XMP_FileFormat format, const std::string & rootPath, const std::string & gpName, const std::string & parentName, const std::string & leafName, XMPFiles * parent ); static const XMP_OptionBits kXDCAMEX_HandlerFlags = (kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_CanRewrite | kXMPFiles_PrefersInPlace | kXMPFiles_CanReconcile | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_HandlerOwnsFile | kXMPFiles_AllowsSafeUpdate | kXMPFiles_FolderBasedFormat); class XDCAMEX_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessXMP(); XMP_OptionBits GetSerializeOptions() // *** These should be standard for standalone XMP files. { return (kXMP_UseCompactFormat | kXMP_OmitPacketWrapper); }; void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); XDCAMEX_MetaHandler ( XMPFiles * _parent ); virtual ~XDCAMEX_MetaHandler(); private: XDCAMEX_MetaHandler() : expat(0) {}; // Hidden on purpose. void MakeClipFilePath ( std::string * path, XMP_StringPtr suffix ); void MakeLegacyDigest ( std::string * digestStr ); void GetTakeUMID( const std::string& clipUMID, std::string& takeUMID, std::string& takeXMLURI ); void GetTakeDuration( const std::string& takeUMID, std::string& duration ); void CleanupLegacyXML(); std::string rootPath, clipName, xdcNS, legacyNS, clipUMID; ExpatAdapter * expat; XML_Node * clipMetadata; }; // XDCAMEX_MetaHandler // ================================================================================================= #endif /* __XDCAMEX_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/FLV_Handler.cpp0000664000175000017500000006112512150230672020010 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "FLV_Handler.hpp" #include "MD5.h" using namespace std; // ================================================================================================= /// \file FLV_Handler.cpp /// \brief File format handler for FLV. /// /// FLV is a fairly simple format, with a strong orientation to streaming use. It consists of a /// small file header then a sequence of tags that can contain audio data, video data, or /// ActionScript data. All integers in FLV are big endian. /// /// For FLV version 1, the file header contains: /// /// UI24 signature - the characters "FLV" /// UI8 version - 1 /// UI8 flags - 0x01 = has video tags, 0x04 = has audio tags /// UI32 length in bytes of file header /// /// For FLV version 1, each tag begins with an 11 byte header: /// /// UI8 tag type - 8 = audio tag, 9 = video tag, 18 = script data tag /// UI24 content length in bytes /// UI24 time - low order 3 bytes /// UI8 time - high order byte /// UI24 stream ID /// /// This is followed by the tag's content, then a UI32 "back pointer" which is the header size plus /// the content size. A UI32 zero is placed between the file header and the first tag as a /// terminator for backward scans. The time in a tag header is the start of playback for that tag. /// The tags must be in ascending time order. For a given time it is preferred that script data tags /// precede audio and video tags. /// /// For metadata purposes only the script data tags are of interest. Script data information becomes /// accessible to ActionScript at the playback moment of the script data tag through a call to a /// registered data handler. The content of a script data tag contains a string and an ActionScript /// data value. The string is the name of the handler to be invoked, the data value is passed as an /// ActionScript Object parameter to the handler. /// /// The XMP is placed in a script data tag with the name "onXMPData". A variety of legacy metadata /// is contained in a script data tag with the name "onMetaData". This contains only "internal" /// information (like duration or width/height), nothing that is user or author editiable (like /// title or description). Some of these legacy items are imported into the XMP, none are updated /// from the XMP. /// /// A script data tag's content is: /// /// UI8 0x02 /// UI16 name length - includes nul terminator if present /// UI8n object name - UTF-8, possibly with nul terminator /// ... object value - serialized ActionScript value (SCRIPTDATAVALUE in FLV spec) /// /// The onXMPData and onMetaData values are both ECMA arrays. These have more in common with XMP /// structs than arrays, the items have arbitrary string names. The serialized form is: /// /// UI8 0x08 /// UI32 array length - need not be exact, an optimization hint /// array items /// UI16 name length - includes nul terminator if present /// UI8n item name - UTF-8, possibly with nul terminator /// ... object value - serialized ActionScript value (SCRIPTDATAVALUE in FLV spec) /// UI24 0x000009 - array terminator /// /// The object names and array item names in sample files do not have a nul terminator. The policy /// here is to treat them as optional when reading, and to omit them when writing. /// /// The onXMPData array typically has one item named "liveXML". The value of this is a short or long /// string as necessary: /// /// UI8 type - 2 for a short string, 12 for a long string /// UIx value length - UI16 for a short string, UI32 for a long string, includes nul terminator /// UI8n value - UTF-8 with nul terminator /// // ================================================================================================= static inline XMP_Uns32 GetUns24BE ( const void * addr ) { return (GetUns32BE(addr) >> 8); } static inline void PutUns24BE ( XMP_Uns32 value, void * addr ) { XMP_Uns8 * bytes = (XMP_Uns8*)addr; bytes[0] = (XMP_Uns8)(value >> 16); bytes[1] = (XMP_Uns8)(value >> 8); bytes[2] = (XMP_Uns8)(value); } // ================================================================================================= // FLV_CheckFormat // =============== // // Check for "FLV" and 1 in the first 4 bytes, that the header length is at least 9, that the file // size is at least as big as the header, and that the leading 0 back pointer is present if the file // is bigger than the header. #define kFLV1 0x464C5601UL bool FLV_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ) { XMP_Uns8 buffer [9]; LFA_Seek ( fileRef, 0, SEEK_SET ); XMP_Uns32 ioCount = LFA_Read ( fileRef, buffer, 9 ); if ( ioCount != 9 ) return false; XMP_Uns32 fileSignature = GetUns32BE ( &buffer[0] ); if ( fileSignature != kFLV1 ) return false; XMP_Uns32 headerSize = GetUns32BE ( &buffer[5] ); XMP_Uns64 fileSize = LFA_Measure ( fileRef ); if ( (fileSize < (headerSize + 4)) && (fileSize != headerSize) ) return false; if ( fileSize >= (headerSize + 4) ) { XMP_Uns32 bpZero; LFA_Seek ( fileRef, headerSize, SEEK_SET ); ioCount = LFA_Read ( fileRef, &bpZero, 4 ); if ( (ioCount != 4) || (bpZero != 0) ) return false; } return true; } // FLV_CheckFormat // ================================================================================================= // FLV_MetaHandlerCTor // =================== XMPFileHandler * FLV_MetaHandlerCTor ( XMPFiles * parent ) { return new FLV_MetaHandler ( parent ); } // FLV_MetaHandlerCTor // ================================================================================================= // FLV_MetaHandler::FLV_MetaHandler // ================================ FLV_MetaHandler::FLV_MetaHandler ( XMPFiles * _parent ) : flvHeaderLen(0), longXMP(false), xmpTagPos(0), omdTagPos(0), xmpTagLen(0), omdTagLen(0) { this->parent = _parent; // Inherited, can't set in the prefix. this->handlerFlags = kFLV_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; } // FLV_MetaHandler::FLV_MetaHandler // ================================================================================================= // FLV_MetaHandler::~FLV_MetaHandler // ================================= FLV_MetaHandler::~FLV_MetaHandler() { // Nothing to do yet. } // FLV_MetaHandler::~FLV_MetaHandler // ================================================================================================= // GetTagInfo // ========== // // Seek to the start of a tag and extract the type, data size, and timestamp. Leave the file // positioned at the first byte of data. struct TagInfo { XMP_Uns8 type; XMP_Uns32 time; XMP_Uns32 dataSize; }; static void GetTagInfo ( LFA_FileRef fileRef, XMP_Uns64 tagPos, TagInfo * info ) { XMP_Uns8 buffer [11]; LFA_Seek ( fileRef, tagPos, SEEK_SET ); LFA_Read ( fileRef, buffer, 11, kLFA_RequireAll ); info->type = buffer[0]; info->time = GetUns24BE ( &buffer[4] ) || (buffer[7] << 24); info->dataSize = GetUns24BE ( &buffer[1] ); } // GetTagInfo // ================================================================================================= // GetASValueLen // ============= // // Return the full length of a serialized ActionScript value, including the type byte, zero if unknown. static XMP_Uns32 GetASValueLen ( const XMP_Uns8 * asValue, const XMP_Uns8 * asLimit ) { XMP_Uns32 valueLen = 0; const XMP_Uns8 * itemPtr; XMP_Uns32 arrayCount; switch ( asValue[0] ) { case 0 : // IEEE double valueLen = 1 + 8; break; case 1 : // UI8 Boolean valueLen = 1 + 1; break; case 2 : // Short string valueLen = 1 + 2 + GetUns16BE ( &asValue[1] ); break; case 3 : // ActionScript object, a name and value. itemPtr = &asValue[1]; itemPtr += 2 + GetUns16BE ( itemPtr ); // Move past the name portion. itemPtr += GetASValueLen ( itemPtr, asLimit ); // And past the data portion. valueLen = (XMP_Uns32) (itemPtr - asValue); break; case 4 : // Short string (movie clip path) valueLen = 1 + 2 + GetUns16BE ( &asValue[1] ); break; case 5 : // Null valueLen = 1; break; case 6 : // Undefined valueLen = 1; break; case 7 : // UI16 reference ID valueLen = 1 + 2; break; case 8 : // ECMA array, ignore the count, look for the 0x000009 terminator. itemPtr = &asValue[5]; while ( itemPtr < asLimit ) { XMP_Uns16 nameLen = GetUns16BE ( itemPtr ); itemPtr += 2 + nameLen; // Move past the name portion. if ( (nameLen == 0) && (*itemPtr == 9) ) { itemPtr += 1; break; // Done, found the 0x000009 terminator. } itemPtr += GetASValueLen ( itemPtr, asLimit ); // And past the data portion. } valueLen = (XMP_Uns32) (itemPtr - asValue); break; case 10 : // Strict array, has an exact count. arrayCount = GetUns32BE ( &asValue[1] ); itemPtr = &asValue[5]; for ( ; (arrayCount > 0) && (itemPtr < asLimit); --arrayCount ) { itemPtr += 2 + GetUns16BE ( itemPtr ); // Move past the name portion. itemPtr += GetASValueLen ( itemPtr, asLimit ); // And past the data portion. } valueLen = (XMP_Uns32) (itemPtr - asValue); break; case 11 : // Date valueLen = 1 + 8 + 2; break; case 12: // Long string valueLen = 1 + 4 + GetUns32BE ( &asValue[1] ); break; } return valueLen; } // GetASValueLen // ================================================================================================= // CheckName // ========= // // Check for the name portion of a script data tag or array item, with optional nul terminator. The // wantedLen must not count the terminator. static inline bool CheckName ( XMP_StringPtr inputName, XMP_Uns16 inputLen, XMP_StringPtr wantedName, XMP_Uns16 wantedLen ) { if ( inputLen == wantedLen+1 ) { if ( inputName[wantedLen] != 0 ) return false; // Extra byte must be terminating nul. --inputLen; } if ( (inputLen == wantedLen) && XMP_LitNMatch ( inputName, wantedName, wantedLen ) ) return true; return false; } // CheckName // ================================================================================================= // FLV_MetaHandler::CacheFileData // ============================== // // Look for the onXMPData and onMetaData script data tags at time 0. Cache all of onMetaData, it // shouldn't be that big and this removes a need to know what is reconciled. It can't be more than // 16MB anyway, the size field is only 24 bits. void FLV_MetaHandler::CacheFileData() { XMP_Assert ( ! this->containsXMP ); XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); LFA_FileRef fileRef = this->parent->fileRef; XMP_Uns64 fileSize = LFA_Measure ( fileRef ); XMP_Uns8 buffer [16]; // Enough for 1+2+"onMetaData"+nul. XMP_Uns32 ioCount; TagInfo info; LFA_Seek ( fileRef, 5, SEEK_SET ); LFA_Read ( fileRef, buffer, 4, kLFA_RequireAll ); this->flvHeaderLen = GetUns32BE ( &buffer[0] ); XMP_Uns32 firstTagPos = this->flvHeaderLen + 4; // Include the initial zero back pointer. if ( firstTagPos >= fileSize ) return; // Quit now if the file is just a header. for ( XMP_Uns64 tagPos = firstTagPos; tagPos < fileSize; tagPos += (11 + info.dataSize + 4) ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "FLV_MetaHandler::LookForMetadata - User abort", kXMPErr_UserAbort ); } GetTagInfo ( fileRef, tagPos, &info ); // ! GetTagInfo seeks to the tag offset. if ( info.time != 0 ) break; if ( info.type != 18 ) continue; XMP_Assert ( sizeof(buffer) >= (1+2+10+1) ); // 02 000B onMetaData 00 ioCount = LFA_Read ( fileRef, buffer, sizeof(buffer) ); if ( (ioCount < 4) || (buffer[0] != 0x02) ) continue; XMP_Uns16 nameLen = GetUns16BE ( &buffer[1] ); XMP_StringPtr namePtr = (XMP_StringPtr)(&buffer[3]); if ( this->onXMP.empty() && CheckName ( namePtr, nameLen, "onXMPData", 9 ) ) { // ! Put the raw data in onXMPData, analyze the value in ProcessXMP. this->xmpTagPos = tagPos; this->xmpTagLen = 11 + info.dataSize + 4; // ! Includes the trailing back pointer. this->packetInfo.offset = tagPos + 11 + 1+2+nameLen; // ! Not the real offset yet, the offset of the onXMPData value. ioCount = info.dataSize - (1+2+nameLen); // Just the onXMPData value portion. this->onXMP.reserve ( ioCount ); this->onXMP.assign ( ioCount, ' ' ); LFA_Seek ( fileRef, this->packetInfo.offset, SEEK_SET ); LFA_Read ( fileRef, (void*)this->onXMP.data(), ioCount, kLFA_RequireAll ); if ( ! this->onMetaData.empty() ) break; // Done if we've found both. } else if ( this->onMetaData.empty() && CheckName ( namePtr, nameLen, "onMetaData", 10 ) ) { this->omdTagPos = tagPos; this->omdTagLen = 11 + info.dataSize + 4; // ! Includes the trailing back pointer. ioCount = info.dataSize - (1+2+nameLen); // Just the onMetaData value portion. this->onMetaData.reserve ( ioCount ); this->onMetaData.assign ( ioCount, ' ' ); LFA_Seek ( fileRef, (tagPos + 11 + 1+2+nameLen), SEEK_SET ); LFA_Read ( fileRef, (void*)this->onMetaData.data(), ioCount, kLFA_RequireAll ); if ( ! this->onXMP.empty() ) break; // Done if we've found both. } } } // FLV_MetaHandler::CacheFileData // ================================================================================================= // FLV_MetaHandler::MakeLegacyDigest // ================================= #define kHexDigits "0123456789ABCDEF" void FLV_MetaHandler::MakeLegacyDigest ( std::string * digestStr ) { MD5_CTX context; unsigned char digestBin [16]; MD5Init ( &context ); MD5Update ( &context, (XMP_Uns8*)this->onMetaData.data(), (unsigned int)this->onMetaData.size() ); MD5Final ( digestBin, &context ); char buffer [40]; for ( int in = 0, out = 0; in < 16; in += 1, out += 2 ) { XMP_Uns8 byte = digestBin[in]; buffer[out] = kHexDigits [ byte >> 4 ]; buffer[out+1] = kHexDigits [ byte & 0xF ]; } buffer[32] = 0; digestStr->erase(); digestStr->append ( buffer, 32 ); } // FLV_MetaHandler::MakeLegacyDigest // ================================================================================================= // FLV_MetaHandler::ExtractLiveXML // =============================== // // Extract the XMP packet from the cached onXMPData ECMA array's "liveXMP" item. void FLV_MetaHandler::ExtractLiveXML() { if ( this->onXMP[0] != 0x08 ) return; // Make sure onXMPData is an ECMA array. const XMP_Uns8 * ecmaArray = (const XMP_Uns8 *) this->onXMP.c_str(); const XMP_Uns8 * ecmaLimit = ecmaArray + this->onXMP.size(); if ( this->onXMP.size() >= 3 ) { // Omit the 0x000009 terminator, simplifies the loop. if ( GetUns24BE ( ecmaLimit-3 ) == 9 ) ecmaLimit -= 3; } for ( const XMP_Uns8 * itemPtr = ecmaArray + 5; itemPtr < ecmaLimit; /* internal increment */ ) { // Find the "liveXML" array item, make sure it is a short or long string. XMP_Uns16 nameLen = GetUns16BE ( itemPtr ); const XMP_Uns8 * namePtr = itemPtr + 2; itemPtr += (2 + nameLen); // Move to the value portion. XMP_Uns32 valueLen = GetASValueLen ( itemPtr, ecmaLimit ); if ( valueLen == 0 ) return; // ! Unknown value type, can't look further. if ( CheckName ( (char*)namePtr, nameLen, "liveXML", 7 ) ) { XMP_Uns32 lenLen = 2; // Assume a short string. if ( *itemPtr == 12 ) { lenLen = 4; this->longXMP = true; } else if ( *itemPtr != 2 ) { return; // Not a short or long string. } valueLen -= (1 + lenLen); itemPtr += (1 + lenLen); this->packetInfo.offset += (itemPtr - ecmaArray); this->packetInfo.length += valueLen; this->xmpPacket.reserve ( valueLen ); this->xmpPacket.assign ( (char*)itemPtr, valueLen ); return; } itemPtr += valueLen; // Move past the value portion. } } // FLV_MetaHandler::ExtractLiveXML // ================================================================================================= // FLV_MetaHandler::ProcessXMP // =========================== void FLV_MetaHandler::ProcessXMP() { if ( this->processedXMP ) return; this->processedXMP = true; // Make sure only called once. if ( ! this->onXMP.empty() ) { // Look for the XMP packet. this->ExtractLiveXML(); if ( ! this->xmpPacket.empty() ) { FillPacketInfo ( this->xmpPacket, &this->packetInfo ); this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); this->containsXMP = true; } } // Now process the legacy, if necessary. if ( this->onMetaData.empty() ) return; // No legacy, we're done. std::string oldDigest; bool oldDigestFound = this->xmpObj.GetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "FLV", &oldDigest, 0 ); if ( oldDigestFound ) { std::string newDigest; this->MakeLegacyDigest ( &newDigest ); if ( oldDigest == newDigest ) return; // No legacy changes. } // *** No spec yet for what legacy to reconcile. } // FLV_MetaHandler::ProcessXMP // ================================================================================================= // FLV_MetaHandler::UpdateFile // =========================== void FLV_MetaHandler::UpdateFile ( bool doSafeUpdate ) { if ( ! this->needsUpdate ) return; XMP_Assert ( ! doSafeUpdate ); // This should only be called for "unsafe" updates. XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); LFA_FileRef fileRef = this->parent->fileRef; XMP_Uns64 fileSize = LFA_Measure ( fileRef ); // Make sure the XMP has a legacy digest if appropriate. if ( ! this->onMetaData.empty() ) { std::string newDigest; this->MakeLegacyDigest ( &newDigest ); this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "FLV", newDigest.c_str(), kXMP_DeleteExisting ); try { XMP_StringLen xmpLen = (XMP_StringLen)this->xmpPacket.size(); this->xmpObj.SerializeToBuffer ( &this->xmpPacket, (kXMP_UseCompactFormat | kXMP_ExactPacketLength), xmpLen ); } catch ( ... ) { this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat ); } } // Rewrite the packet in-place if it fits. Otherwise rewrite the whole file. if ( this->xmpPacket.size() == (size_t)this->packetInfo.length ) { LFA_Seek ( fileRef, this->packetInfo.offset, SEEK_SET ); LFA_Write ( fileRef, this->xmpPacket.data(), (XMP_Int32)this->xmpPacket.size() ); } else { std::string origPath = this->parent->filePath; LFA_FileRef origRef = this->parent->fileRef; std::string updatePath; LFA_FileRef updateRef = 0; CreateTempFile ( origPath, &updatePath ); updateRef = LFA_Open ( updatePath.c_str(), 'w' ); this->parent->filePath = updatePath; this->parent->fileRef = updateRef; try { this->WriteFile ( origRef, origPath ); } catch ( ... ) { LFA_Close ( updateRef ); LFA_Delete ( updatePath.c_str() ); this->parent->filePath = origPath; this->parent->fileRef = origRef; throw; } LFA_Close ( origRef ); LFA_Delete ( origPath.c_str() ); LFA_Close ( updateRef ); LFA_Rename ( updatePath.c_str(), origPath.c_str() ); this->parent->filePath = origPath; this->parent->fileRef = 0; } this->needsUpdate = false; } // FLV_MetaHandler::UpdateFile // ================================================================================================= // WriteOnXMP // ========== // // Write the XMP packet wrapped up in an ECMA array script data tag: // // 0 UI8 tag type : 18 // 1 UI24 content length : 1+2+9+1+4+2+7+1 + <2 or 4> + XMP packet size + 1 + 3 // 4 UI24 time low : 0 // 7 UI8 time high : 0 // 8 UI24 stream ID : 0 // // 11 UI8 0x02 // 12 UI16 name length : 9 // 14 str9 tag name : "onXMPData", no nul terminator // 23 UI8 value type : 8 // 24 UI32 array count : 1 // 28 UI16 name length : 7 // 30 str7 item name : "liveXML", no nul terminator // // 37 UI8 value type : 2 for a short string, 12 for a long string // 38 UIn XMP packet size + 1, UI16 or UI32 as needed // -- str XMP packet, with nul terminator // // -- UI24 array terminator : 0x000009 // -- UI32 back pointer : content length + 11 static void WriteOnXMP ( LFA_FileRef fileRef, const std::string & xmpPacket ) { char buffer [64]; bool longXMP = false; XMP_Uns32 tagLen = 1+2+9+1+4+2+7+1 + 2 + (XMP_Uns32)xmpPacket.size() + 1 + 3; if ( xmpPacket.size() > 0xFFFE ) { longXMP = true; tagLen += 2; } if ( tagLen > 16*1024*1024 ) XMP_Throw ( "FLV tags can't be larger than 16MB", kXMPErr_TBD ); // Fill in the script data tag header. buffer[0] = 18; PutUns24BE ( tagLen, &buffer[1] ); PutUns24BE ( 0, &buffer[4] ); buffer[7] = 0; PutUns24BE ( 0, &buffer[8] ); // Fill in the "onXMPData" name, ECMA array start, and "liveXML" name. buffer[11] = 2; PutUns16BE ( 9, &buffer[12] ); memcpy ( &buffer[14], "onXMPData", 9 ); // AUDIT: Safe, buffer has 64 chars. buffer[23] = 8; PutUns32BE ( 1, &buffer[24] ); PutUns16BE ( 7, &buffer[28] ); memcpy ( &buffer[30], "liveXML", 7 ); // AUDIT: Safe, buffer has 64 chars. // Fill in the XMP packet string type and length, write what we have so far. LFA_Seek ( fileRef, 0, SEEK_END ); if ( ! longXMP ) { buffer[37] = 2; PutUns16BE ( (XMP_Uns16)xmpPacket.size()+1, &buffer[38] ); LFA_Write ( fileRef, buffer, 40 ); } else { buffer[37] = 12; PutUns32BE ( (XMP_Uns32)xmpPacket.size()+1, &buffer[38] ); LFA_Write ( fileRef, buffer, 42 ); } // Write the XMP packet, nul terminator, array terminator, and back pointer. LFA_Write ( fileRef, xmpPacket.c_str(), (XMP_Int32)xmpPacket.size()+1 ); PutUns24BE ( 9, &buffer[0] ); PutUns32BE ( tagLen+11, &buffer[3] ); LFA_Write ( fileRef, buffer, 7 ); } // WriteOnXMP // ================================================================================================= // FLV_MetaHandler::WriteFile // ========================== // // Use a source (old) file and the current XMP to build a destination (new) file. All of the source // file is copied except for previous XMP. The current XMP is inserted after onMetaData, or at least // before the first time 0 audio or video tag. // ! We do not currently update anything in onMetaData. void FLV_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { if ( ! this->needsUpdate ) return; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); LFA_FileRef destRef = this->parent->fileRef; XMP_Uns64 sourceLen = LFA_Measure ( sourceRef ); XMP_Uns64 sourcePos = 0; LFA_Seek ( sourceRef, 0, SEEK_SET ); LFA_Seek ( destRef, 0, SEEK_SET ); LFA_Truncate ( destRef, 0 ); // First do whatever is needed to put the new XMP after any existing onMetaData tag, or as the // first time 0 tag. if ( this->omdTagPos == 0 ) { // There is no onMetaData tag. Copy the file header, then write the new XMP as the first tag. // Allow the degenerate case of a file with just a header, no initial back pointer or tags. LFA_Copy ( sourceRef, destRef, this->flvHeaderLen, abortProc, abortArg ); XMP_Uns32 zero = 0; // Don't require the initial 0 back pointer to be in the source file. LFA_Write ( destRef, &zero, 4 ); sourcePos = this->flvHeaderLen + 4; WriteOnXMP ( destRef, this->xmpPacket ); } else { // There is an onMetaData tag. Copy the front of the file through the onMetaData tag, // skipping any XMP that happens to be in the way. The XMP should not be before onMetaData, // but let's be robust. Write the new XMP immediately after onMetaData, at the same time. XMP_Uns64 omdEnd = this->omdTagPos + this->omdTagLen; if ( (this->xmpTagPos != 0) && (this->xmpTagPos < this->omdTagPos) ) { LFA_Copy ( sourceRef, destRef, this->xmpTagPos, abortProc, abortArg ); sourcePos = this->xmpTagPos + this->xmpTagLen; LFA_Seek ( sourceRef, sourcePos, SEEK_SET ); } LFA_Copy ( sourceRef, destRef, (omdEnd - sourcePos), abortProc, abortArg ); sourcePos = omdEnd; WriteOnXMP ( destRef, this->xmpPacket ); } // Copy the rest of the file, skipping any XMP that is in the way. if ( (this->xmpTagPos != 0) && (this->xmpTagPos >= sourcePos) ) { LFA_Copy ( sourceRef, destRef, (this->xmpTagPos - sourcePos), abortProc, abortArg ); sourcePos = this->xmpTagPos + this->xmpTagLen; LFA_Seek ( sourceRef, sourcePos, SEEK_SET ); } LFA_Copy ( sourceRef, destRef, (sourceLen - sourcePos), abortProc, abortArg ); this->needsUpdate = false; } // FLV_MetaHandler::WriteFile // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/Makefile.am0000664000175000017500000000540212150230672017250 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # noinst_LTLIBRARIES = libxmpfilehandlers.la INCLUDES = -I$(srcdir)/.. -I$(srcdir)/../FormatSupport \ -I$(top_srcdir)/source/common/ \ -I$(top_srcdir)/public/include/ -I$(top_srcdir)/build/ \ -I$(top_srcdir)/third-party/MD5 AM_CPPFLAGS = \ -D@EXEMPI_PLATFORM_DEF@=1 -DXMP_IMPL=1 -DXMP_ClientBuild=0 \ -D_FILE_OFFSET_BITS=64 -DHAVE_EXPAT_CONFIG_H=1 -DXML_STATIC=1 libxmpfilehandlers_la_SOURCES = \ ASF_Handler.cpp ASF_Handler.hpp\ AVCHD_Handler.cpp AVCHD_Handler.hpp\ Basic_Handler.cpp Basic_Handler.hpp\ FLV_Handler.cpp FLV_Handler.hpp\ GIF_Handler.cpp GIF_Handler.hpp\ InDesign_Handler.cpp InDesign_Handler.hpp\ JPEG_Handler.cpp JPEG_Handler.hpp\ MP3_Handler.cpp MP3_Handler.hpp\ MPEG2_Handler.cpp MPEG2_Handler.hpp \ MPEG4_Handler.cpp MPEG4_Handler.hpp \ P2_Handler.cpp P2_Handler.hpp\ PNG_Handler.cpp PNG_Handler.hpp\ PostScript_Handler.cpp PostScript_Handler.hpp\ PSD_Handler.cpp PSD_Handler.hpp\ RIFF_Handler.cpp RIFF_Handler.hpp \ Scanner_Handler.cpp Scanner_Handler.hpp\ SonyHDV_Handler.cpp SonyHDV_Handler.hpp\ SWF_Handler.cpp SWF_Handler.hpp\ TIFF_Handler.cpp TIFF_Handler.hpp\ Trivial_Handler.cpp Trivial_Handler.hpp\ UCF_Handler.cpp UCF_Handler.hpp\ XDCAMEX_Handler.cpp XDCAMEX_Handler.hpp\ XDCAM_Handler.cpp XDCAM_Handler.hpp\ $(NULL) exempi-2.2.1/source/XMPFiles/FileHandlers/FLV_Handler.hpp0000664000175000017500000000462412150230672020016 00000000000000#ifndef __FLV_Handler_hpp__ #define __FLV_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMPFiles_Impl.hpp" // ================================================================================================ /// \file FLV_Handler.hpp /// \brief File format handler for FLV. /// /// This header ... /// // ================================================================================================ extern XMPFileHandler * FLV_MetaHandlerCTor ( XMPFiles * parent ); extern bool FLV_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); static const XMP_OptionBits kFLV_HandlerFlags = ( kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_CanRewrite | kXMPFiles_PrefersInPlace | kXMPFiles_CanReconcile | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_AllowsSafeUpdate ); class FLV_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessXMP(); void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); FLV_MetaHandler ( XMPFiles * _parent ); virtual ~FLV_MetaHandler(); private: FLV_MetaHandler() : flvHeaderLen(0), longXMP(false), xmpTagPos(0), omdTagPos(0), xmpTagLen(0), omdTagLen(0) {}; // Hidden on purpose. void ExtractLiveXML(); void MakeLegacyDigest ( std::string * digestStr ); XMP_Uns32 flvHeaderLen; bool longXMP; // True if the stored XMP is a long string (4 byte length). XMP_Uns64 xmpTagPos, omdTagPos; // The file offset and length of onXMP and onMetaData tags. XMP_Uns32 xmpTagLen, omdTagLen; // Zero if the tag is not present. std::string onXMP, onMetaData; // ! Actually contains structured binary data. }; // FLV_MetaHandler // ================================================================================================= #endif // __FLV_Handler_hpp__ exempi-2.2.1/source/XMPFiles/FileHandlers/SonyHDV_Handler.cpp0000664000175000017500000006217012150230672020654 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include #include "SonyHDV_Handler.hpp" #include "MD5.h" #if XMP_WinBuild #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif using namespace std; // ================================================================================================= /// \file SonyHDV_Handler.cpp /// \brief Folder format handler for Sony HDV. /// /// This handler is for the Sony HDV video format. This is a pseudo-package, visible files but with /// a very well-defined layout and naming rules. /// /// A typical Sony HDV layout looks like: /// /// .../MyMovie/ /// VIDEO/ /// HDV/ /// 00_0001_2007-08-06_165555.IDX /// 00_0001_2007-08-06_165555.M2T /// 00_0001_2007-08-06_171740.M2T /// 00_0001_2007-08-06_171740.M2T.ese /// tracks.dat /// /// The logical clip name can be "00_0001" or "00_0001_" plus anything. We'll find the .IDX file, /// which defines the existence of the clip. Full file names as input will pull out the camera/clip /// parts and match in the same way. The .XMP file will use the date/time suffix from the .IDX file. // ================================================================================================= // ================================================================================================= // SonyHDV_CheckFormat // =================== // // This version does fairly simple checks. The top level folder (.../MyMovie) must contain the // VIDEO/HVR subtree. The HVR folder must contain a .IDX file for the desired clip. The name checks // are case insensitive. // // The state of the string parameters depends on the form of the path passed by the client. If the // client passed a logical clip path, like ".../MyMovie/00_0001", the parameters are: // rootPath - ".../MyMovie" // gpName - empty // parentName - empty // leafName - "00_0001" // // If the client passed a full file path, like ".../MyMovie/VIDEO/HVR/00_0001_2007-08-06_165555.M2T", // they are: // rootPath - ".../MyMovie" // gpName - "VIDEO" // parentName - "HVR" // leafName - "00_0001_2007-08-06_165555.M2T" // // The logical clip name can be short like "00_0001", or long like "00_0001_2007-08-06_165555". We // only key off of the portion before a second underscore. // ! The common code has shifted the gpName, parentName, and leafName strings to upper case. It has // ! also made sure that for a logical clip path the rootPath is an existing folder, and that the // ! file exists for a full file path. bool SonyHDV_CheckFormat ( XMP_FileFormat format, const std::string & rootPath, const std::string & gpName, const std::string & parentName, const std::string & leafName, XMPFiles * parent ) { // Do some basic checks on the root path and component names. if ( gpName.empty() != parentName.empty() ) return false; // Must be both empty or both non-empty. std::string tempPath = rootPath; tempPath += kDirChar; tempPath += "VIDEO"; if ( gpName.empty() ) { // This is the logical clip path case. Look for VIDEO/HVR subtree. if ( GetChildMode ( tempPath, "HVR" ) != kFMode_IsFolder ) return false; } else { // This is the existing file case. Check the parent and grandparent names. if ( (gpName != "VIDEO") || (parentName != "HVR") ) return false; } // Look for the clip's .IDX file. If found use that as the full clip name. tempPath += kDirChar; tempPath += "HVR"; std::string clipName = leafName; int usCount = 0; size_t i, limit = leafName.size(); for ( i = 0; i < limit; ++i ) { if ( clipName[i] == '_' ) { ++usCount; if ( usCount == 2 ) break; } } if ( i < limit ) clipName.erase ( i ); clipName += '_'; // Make sure a final '_' is there for the search comparisons. XMP_FolderInfo folderInfo; std::string childName; bool found = false; folderInfo.Open ( tempPath.c_str() ); while ( (! found) && folderInfo.GetNextChild ( &childName ) ) { size_t childLen = childName.size(); if ( childLen < 4 ) continue; MakeUpperCase ( &childName ); if ( childName.compare ( childLen-4, 4, ".IDX" ) != 0 ) continue; if ( childName.compare ( 0, clipName.size(), clipName ) == 0 ) { found = true; clipName = childName; clipName.erase ( childLen-4 ); } } if ( ! found ) return false; // Disabled until Sony HDV clip spanning is supported. // Since segments of spanned clips are currently considered separate entities, // information such as frame count needs to be considered on a per segment basis. JPM clipName = leafName; // Set tempPath to /, e.g. ".../MyMovie/00_0001_2007-08-06_165555". This is // passed to the handler via the tempPtr hackery. tempPath = rootPath; tempPath += kDirChar; tempPath += clipName; size_t pathLen = tempPath.size() + 1; // Include a terminating nul. parent->tempPtr = malloc ( pathLen ); if ( parent->tempPtr == 0 ) XMP_Throw ( "No memory for SonyHDV clip info", kXMPErr_NoMemory ); memcpy ( parent->tempPtr, tempPath.c_str(), pathLen ); // AUDIT: Safe, allocated above. return true; } // SonyHDV_CheckFormat // ================================================================================================= // ReadIDXFile // =========== #define ExtractTimeCodeByte(ch,mask) ( (((ch & mask) >> 4) * 10) + (ch & 0xF) ) static bool ReadIDXFile ( const std::string& idxPath, const std::string& clipName, SXMPMeta* xmpObj, bool& containsXMP, MD5_CTX* md5Context, bool digestFound ) { bool result = true; containsXMP = false; if ( clipName.size() != 25 ) return false; try { AutoFile idxFile; idxFile.fileRef = LFA_Open ( idxPath.c_str(), 'r' ); if ( idxFile.fileRef == 0 ) return false; // The open failed. struct SHDV_HeaderBlock { char mHeader[8]; unsigned char mValidFlag; unsigned char mReserved; unsigned char mECCTB; unsigned char mSignalMode; unsigned char mFileThousands; unsigned char mFileHundreds; unsigned char mFileTens; unsigned char mFileUnits; }; SHDV_HeaderBlock hdvHeaderBlock; memset ( &hdvHeaderBlock, 0, sizeof(SHDV_HeaderBlock) ); LFA_Read ( idxFile.fileRef, hdvHeaderBlock.mHeader, 8 ); LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mValidFlag, 1 ); LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mReserved, 1 ); LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mECCTB, 1 ); LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mSignalMode, 1 ); LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mFileThousands, 1 ); LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mFileHundreds, 1 ); LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mFileTens, 1 ); LFA_Read ( idxFile.fileRef, &hdvHeaderBlock.mFileUnits, 1 ); const int fileCount = (hdvHeaderBlock.mFileThousands - '0') * 1000 + (hdvHeaderBlock.mFileHundreds - '0') * 100 + (hdvHeaderBlock.mFileTens - '0') * 10 + (hdvHeaderBlock.mFileUnits - '0'); // Read file info block. struct SHDV_FileBlock { char mDT[2]; unsigned char mFileNameYear; unsigned char mFileNameMonth; unsigned char mFileNameDay; unsigned char mFileNameHour; unsigned char mFileNameMinute; unsigned char mFileNameSecond; unsigned char mStartTimeCode[4]; unsigned char mTotalFrame[4]; }; SHDV_FileBlock hdvFileBlock; memset ( &hdvFileBlock, 0, sizeof(SHDV_FileBlock) ); char filenameBuffer[256]; std::string fileDateAndTime = clipName.substr(8); bool foundFileBlock = false; for ( int i=0; ((i < fileCount) && (! foundFileBlock)); ++i ) { LFA_Read ( idxFile.fileRef, hdvFileBlock.mDT, 2 ); LFA_Read ( idxFile.fileRef, &hdvFileBlock.mFileNameYear, 1 ); LFA_Read ( idxFile.fileRef, &hdvFileBlock.mFileNameMonth, 1 ); LFA_Read ( idxFile.fileRef, &hdvFileBlock.mFileNameDay, 1 ); LFA_Read ( idxFile.fileRef, &hdvFileBlock.mFileNameHour, 1 ); LFA_Read ( idxFile.fileRef, &hdvFileBlock.mFileNameMinute, 1 ); LFA_Read ( idxFile.fileRef, &hdvFileBlock.mFileNameSecond, 1 ); LFA_Read ( idxFile.fileRef, &hdvFileBlock.mStartTimeCode, 4 ); LFA_Read ( idxFile.fileRef, &hdvFileBlock.mTotalFrame, 4 ); // Compose file name we expect from file contents and break out on match. sprintf ( filenameBuffer, "%02d-%02d-%02d_%02d%02d%02d", hdvFileBlock.mFileNameYear + 2000, hdvFileBlock.mFileNameMonth, hdvFileBlock.mFileNameDay, hdvFileBlock.mFileNameHour, hdvFileBlock.mFileNameMinute, hdvFileBlock.mFileNameSecond ); foundFileBlock = (fileDateAndTime==filenameBuffer); } LFA_Close ( idxFile.fileRef ); idxFile.fileRef = 0; if ( ! foundFileBlock ) return false; // If digest calculation requested, calculate it and return. if ( md5Context != 0 ) { MD5Update ( md5Context, (XMP_Uns8*)(&hdvHeaderBlock), sizeof(SHDV_HeaderBlock) ); MD5Update ( md5Context, (XMP_Uns8*)(&hdvFileBlock), sizeof(SHDV_FileBlock) ); } // The xmpObj parameter must be provided in order to extract XMP if ( xmpObj == 0 ) return (md5Context != 0); // Standard def? const bool isSD = ((hdvHeaderBlock.mSignalMode == 0x80) || (hdvHeaderBlock.mSignalMode == 0)); // Progressive vs interlaced extracted from high bit of ECCTB byte const bool clipIsProgressive = ((hdvHeaderBlock.mECCTB & 0x80) != 0); // Lowest three bits contain frame rate information const int sfr = (hdvHeaderBlock.mECCTB & 7) + (clipIsProgressive ? 0 : 8); // Sample scale and sample size. int clipSampleScale = 0; int clipSampleSize = 0; std::string frameRate; // Frame rate switch ( sfr ) { case 0 : break; // Not valid in spec, but it's happening in test files. case 1 : clipSampleScale = 24000; clipSampleSize = 1001; frameRate = "23.98p"; break; case 3 : clipSampleScale = 25; clipSampleSize = 1; frameRate = "25p"; break; case 4 : clipSampleScale = 30000; clipSampleSize = 1001; frameRate = "29.97p"; break; case 11 : clipSampleScale = 25; clipSampleSize = 1; frameRate = "50i"; break; case 12 : clipSampleScale = 30000; clipSampleSize = 1001; frameRate = "59.94i"; break; } containsXMP = true; // Frame size and PAR for HD (not clear on SD yet). std::string xmpString; XMP_StringPtr xmpValue = 0; if ( ! isSD ) { if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "videoFrameSize" )) ) { xmpValue = "1440"; xmpObj->GetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_DM, "w", &xmpString, 0 ); if ( xmpString != xmpValue ) { xmpObj->SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "w", xmpValue, 0 ); } xmpValue = "1080"; xmpObj->GetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_DM, "h", &xmpString, 0 ); if ( xmpString != xmpValue ) { xmpObj->SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "h", xmpValue, 0 ); } xmpValue = "pixels"; xmpObj->GetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_DM, "unit", &xmpString, 0 ); if ( xmpString != xmpValue ) { xmpObj->SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "unit", xmpValue, 0 ); } } xmpValue = "4/3"; if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "videoPixelAspectRatio" )) ) { xmpObj->SetProperty ( kXMP_NS_DM, "videoPixelAspectRatio", xmpValue, kXMP_DeleteExisting ); } } // Sample size and scale. if ( clipSampleScale != 0 ) { char buffer[255]; if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "startTimeScale" )) ) { sprintf(buffer, "%d", clipSampleScale); xmpValue = buffer; xmpObj->SetProperty ( kXMP_NS_DM, "startTimeScale", xmpValue, kXMP_DeleteExisting ); } if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "startTimeSampleSize" )) ) { sprintf(buffer, "%d", clipSampleSize); xmpValue = buffer; xmpObj->SetProperty ( kXMP_NS_DM, "startTimeSampleSize", xmpValue, kXMP_DeleteExisting ); } if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "duration" )) ) { const int frameCount = (hdvFileBlock.mTotalFrame[0] << 24) + (hdvFileBlock.mTotalFrame[1] << 16) + (hdvFileBlock.mTotalFrame[2] << 8) + hdvFileBlock.mTotalFrame[3]; sprintf ( buffer, "%d", frameCount ); xmpValue = buffer; xmpObj->SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "value", xmpValue, 0 ); sprintf ( buffer, "%d/%d", clipSampleSize, clipSampleScale ); xmpValue = buffer; xmpObj->SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "scale", xmpValue, 0 ); } } // Time Code. if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "startTimecode" )) ) { if ( (clipSampleScale != 0) && (clipSampleSize != 0) ) { const bool dropFrame = ( (0x40 & hdvFileBlock.mStartTimeCode[0]) != 0 ) && ( sfr == 4 || sfr == 12 ); const char chDF = dropFrame ? ';' : ':'; const int tcFrames = ExtractTimeCodeByte ( hdvFileBlock.mStartTimeCode[0], 0x30 ); const int tcSeconds = ExtractTimeCodeByte ( hdvFileBlock.mStartTimeCode[1], 0x70 ); const int tcMinutes = ExtractTimeCodeByte ( hdvFileBlock.mStartTimeCode[2], 0x70 ); const int tcHours = ExtractTimeCodeByte ( hdvFileBlock.mStartTimeCode[3], 0x30 ); // HH:MM:SS:FF or HH;MM;SS;FF char timecode[256]; sprintf ( timecode, "%02d%c%02d%c%02d%c%02d", tcHours, chDF, tcMinutes, chDF, tcSeconds, chDF, tcFrames ); std::string sonyTimeString = timecode; xmpObj->GetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeValue", &xmpString, 0 ); if ( xmpString != sonyTimeString ) { xmpObj->SetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeValue", sonyTimeString, 0 ); std::string timeFormat; if ( clipSampleSize == 1 ) { // 24, 25, 40, 50, 60 switch ( clipSampleScale ) { case 24 : timeFormat = "24"; break; case 25 : timeFormat = "25"; break; case 50 : timeFormat = "50"; break; default : XMP_Assert ( false ); } timeFormat += "Timecode"; } else { // 23.976, 29.97, 59.94 XMP_Assert ( clipSampleSize == 1001 ); switch ( clipSampleScale ) { case 24000 : timeFormat = "23976"; break; case 30000 : timeFormat = "2997"; break; case 60000 : timeFormat = "5994"; break; default : XMP_Assert( false ); break; } timeFormat += dropFrame ? "DropTimecode" : "NonDropTimecode"; } xmpObj->SetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeFormat", timeFormat, 0 ); } } } if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "CreateDate" )) ) { // Clip has date and time in the case of DT (otherwise date and time haven't been set). bool clipHasDate = ((hdvFileBlock.mDT[0] == 'D') && (hdvFileBlock.mDT[1] == 'T')); // Creation date if ( clipHasDate ) { // YYYY-MM-DDThh:mm:ssZ char date[256]; sprintf ( date, "%4d-%02d-%02dT%02d:%02d:%02dZ", hdvFileBlock.mFileNameYear + 2000, hdvFileBlock.mFileNameMonth, hdvFileBlock.mFileNameDay, hdvFileBlock.mFileNameHour, hdvFileBlock.mFileNameMinute, hdvFileBlock.mFileNameSecond ); XMP_StringPtr xmpDate = date; xmpObj->SetProperty ( kXMP_NS_XMP, "CreateDate", xmpDate, kXMP_DeleteExisting ); } } // Frame rate. if ( digestFound || (! xmpObj->DoesPropertyExist ( kXMP_NS_DM, "videoFrameRate" )) ) { if ( frameRate.size() != 0 ) { xmpString = frameRate; xmpObj->SetProperty ( kXMP_NS_DM, "videoFrameRate", xmpString, kXMP_DeleteExisting ); } } } catch ( ... ) { result = false; } return result; } // ReadIDXFile // ================================================================================================= // SonyHDV_MetaHandlerCTor // ======================= XMPFileHandler * SonyHDV_MetaHandlerCTor ( XMPFiles * parent ) { return new SonyHDV_MetaHandler ( parent ); } // SonyHDV_MetaHandlerCTor // ================================================================================================= // SonyHDV_MetaHandler::SonyHDV_MetaHandler // ======================================== SonyHDV_MetaHandler::SonyHDV_MetaHandler ( XMPFiles * _parent ) { this->parent = _parent; // Inherited, can't set in the prefix. this->handlerFlags = kSonyHDV_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; // Extract the root path and clip name. XMP_Assert ( this->parent->tempPtr != 0 ); this->rootPath.assign ( (char*) this->parent->tempPtr ); free ( this->parent->tempPtr ); this->parent->tempPtr = 0; SplitLeafName ( &this->rootPath, &this->clipName ); } // SonyHDV_MetaHandler::SonyHDV_MetaHandler // ================================================================================================= // SonyHDV_MetaHandler::~SonyHDV_MetaHandler // ========================================= SonyHDV_MetaHandler::~SonyHDV_MetaHandler() { if ( this->parent->tempPtr != 0 ) { free ( this->parent->tempPtr ); this->parent->tempPtr = 0; } } // SonyHDV_MetaHandler::~SonyHDV_MetaHandler // ================================================================================================= // SonyHDV_MetaHandler::MakeClipFilePath // ===================================== void SonyHDV_MetaHandler::MakeClipFilePath ( std::string * path, XMP_StringPtr suffix ) { *path = this->rootPath; *path += kDirChar; *path += "VIDEO"; *path += kDirChar; *path += "HVR"; *path += kDirChar; *path += this->clipName; *path += suffix; } // SonyHDV_MetaHandler::MakeClipFilePath // ================================================================================================= // SonyHDV_MetaHandler::MakeIndexFilePath // ====================================== bool SonyHDV_MetaHandler::MakeIndexFilePath ( std::string& idxPath, const std::string& rootPath, const std::string& leafName ) { std::string tempPath; tempPath = rootPath; tempPath += kDirChar; tempPath += "VIDEO"; tempPath += kDirChar; tempPath += "HVR"; idxPath = tempPath; idxPath += kDirChar; idxPath += leafName; idxPath += ".IDX"; // Default case if ( GetFileMode ( idxPath.c_str() ) == kFMode_IsFile ) return true; // Spanned clip case // Scanning code taken from SonyHDV_CheckFormat // Can be isolated to a separate function. std::string clipName = leafName; int usCount = 0; size_t i, limit = leafName.size(); for ( i = 0; i < limit; ++i ) { if ( clipName[i] == '_' ) { ++usCount; if ( usCount == 2 ) break; } } if ( i < limit ) clipName.erase ( i ); clipName += '_'; // Make sure a final '_' is there for the search comparisons. XMP_FolderInfo folderInfo; std::string childName; bool found = false; folderInfo.Open ( tempPath.c_str() ); while ( (! found) && folderInfo.GetNextChild ( &childName ) ) { size_t childLen = childName.size(); if ( childLen < 4 ) continue; MakeUpperCase ( &childName ); if ( childName.compare ( childLen-4, 4, ".IDX" ) != 0 ) continue; if ( childName.compare ( 0, clipName.size(), clipName ) == 0 ) { found = true; clipName = childName; clipName.erase ( childLen-4 ); } } if ( ! found ) return false; idxPath = tempPath; idxPath += kDirChar; idxPath += clipName; idxPath += ".IDX"; return true; } // ================================================================================================= // SonyHDV_MetaHandler::MakeLegacyDigest // ===================================== #define kHexDigits "0123456789ABCDEF" void SonyHDV_MetaHandler::MakeLegacyDigest ( std::string * digestStr ) { std::string idxPath; if ( ! this->MakeIndexFilePath ( idxPath, this->rootPath, this->clipName ) ) return; MD5_CTX context; unsigned char digestBin [16]; bool dummy = false; MD5Init ( &context ); ReadIDXFile ( idxPath, this->clipName, 0, dummy, &context, false ); MD5Final ( digestBin, &context ); char buffer [40]; for ( int in = 0, out = 0; in < 16; in += 1, out += 2 ) { XMP_Uns8 byte = digestBin[in]; buffer[out] = kHexDigits [ byte >> 4 ]; buffer[out+1] = kHexDigits [ byte & 0xF ]; } buffer[32] = 0; digestStr->erase(); digestStr->append ( buffer, 32 ); } // MakeLegacyDigest // ================================================================================================= // SonyHDV_MetaHandler::CacheFileData // ================================== void SonyHDV_MetaHandler::CacheFileData() { XMP_Assert ( ! this->containsXMP ); // See if the clip's .XMP file exists. std::string xmpPath; this->MakeClipFilePath ( &xmpPath, ".XMP" ); if ( GetFileMode ( xmpPath.c_str() ) != kFMode_IsFile ) return; // No XMP. // Read the entire .XMP file. char openMode = 'r'; if ( this->parent->openFlags & kXMPFiles_OpenForUpdate ) openMode = 'w'; LFA_FileRef xmpFile = LFA_Open ( xmpPath.c_str(), openMode ); if ( xmpFile == 0 ) return; // The open failed. XMP_Int64 xmpLen = LFA_Measure ( xmpFile ); if ( xmpLen > 100*1024*1024 ) { XMP_Throw ( "SonyHDV XMP is outrageously large", kXMPErr_InternalFailure ); // Sanity check. } this->xmpPacket.erase(); this->xmpPacket.reserve ( (size_t)xmpLen ); this->xmpPacket.append ( (size_t)xmpLen, ' ' ); XMP_Int32 ioCount = LFA_Read ( xmpFile, (void*)this->xmpPacket.data(), (XMP_Int32)xmpLen, kLFA_RequireAll ); XMP_Assert ( ioCount == xmpLen ); this->packetInfo.offset = 0; this->packetInfo.length = (XMP_Int32)xmpLen; FillPacketInfo ( this->xmpPacket, &this->packetInfo ); XMP_Assert ( this->parent->fileRef == 0 ); if ( openMode == 'r' ) { LFA_Close ( xmpFile ); } else { this->parent->fileRef = xmpFile; } this->containsXMP = true; } // SonyHDV_MetaHandler::CacheFileData // ================================================================================================= // SonyHDV_MetaHandler::ProcessXMP // =============================== void SonyHDV_MetaHandler::ProcessXMP() { if ( this->processedXMP ) return; this->processedXMP = true; // Make sure only called once. if ( this->containsXMP ) { this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); } // Check the legacy digest. std::string oldDigest, newDigest; bool digestFound; digestFound = this->xmpObj.GetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "SonyHDV", &oldDigest, 0 ); if ( digestFound ) { this->MakeLegacyDigest ( &newDigest ); if ( oldDigest == newDigest ) return; } // Read the IDX legacy. std::string idxPath; if ( ! this->MakeIndexFilePath ( idxPath, this->rootPath, this->clipName ) ) return; ReadIDXFile ( idxPath, this->clipName, &this->xmpObj, this->containsXMP, 0, digestFound ); } // SonyHDV_MetaHandler::ProcessXMP // ================================================================================================= // SonyHDV_MetaHandler::UpdateFile // =============================== // // Note that UpdateFile is only called from XMPFiles::CloseFile, so it is OK to close the file here. void SonyHDV_MetaHandler::UpdateFile ( bool doSafeUpdate ) { if ( ! this->needsUpdate ) return; this->needsUpdate = false; // Make sure only called once. std::string newDigest; this->MakeLegacyDigest ( &newDigest ); this->xmpObj.SetStructField ( kXMP_NS_XMP, "NativeDigests", kXMP_NS_XMP, "SonyHDV", newDigest.c_str(), kXMP_DeleteExisting ); LFA_FileRef oldFile = this->parent->fileRef; this->xmpObj.SerializeToBuffer ( &this->xmpPacket, this->GetSerializeOptions() ); if ( oldFile == 0 ) { // The XMP does not exist yet. std::string xmpPath; this->MakeClipFilePath ( &xmpPath, ".XMP" ); LFA_FileRef xmpFile = LFA_Create ( xmpPath.c_str() ); if ( xmpFile == 0 ) XMP_Throw ( "Failure creating SonyHDV XMP file", kXMPErr_ExternalFailure ); LFA_Write ( xmpFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( xmpFile ); } else if ( ! doSafeUpdate ) { // Over write the existing XMP file. LFA_Seek ( oldFile, 0, SEEK_SET ); LFA_Truncate ( oldFile, 0 ); LFA_Write ( oldFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( oldFile ); } else { // Do a safe update. // *** We really need an LFA_SwapFiles utility. std::string xmpPath, tempPath; this->MakeClipFilePath ( &xmpPath, ".XMP" ); CreateTempFile ( xmpPath, &tempPath ); LFA_FileRef tempFile = LFA_Open ( tempPath.c_str(), 'w' ); LFA_Write ( tempFile, this->xmpPacket.data(), (XMP_StringLen)this->xmpPacket.size() ); LFA_Close ( tempFile ); LFA_Close ( oldFile ); LFA_Delete ( xmpPath.c_str() ); LFA_Rename ( tempPath.c_str(), xmpPath.c_str() ); } this->parent->fileRef = 0; } // SonyHDV_MetaHandler::UpdateFile // ================================================================================================= // SonyHDV_MetaHandler::WriteFile // ============================== void SonyHDV_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { // ! WriteFile is not supposed to be called for handlers that own the file. XMP_Throw ( "SonyHDV_MetaHandler::WriteFile should not be called", kXMPErr_InternalFailure ); } // SonyHDV_MetaHandler::WriteFile // ================================================================================================= exempi-2.2.1/source/XMPFiles/FileHandlers/SonyHDV_Handler.hpp0000664000175000017500000000516512150230672020662 00000000000000#ifndef __SonyHDV_Handler_hpp__ #define __SonyHDV_Handler_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "XMPFiles_Impl.hpp" #include "ExpatAdapter.hpp" // ================================================================================================= /// \file SonyHDV_Handler.hpp /// \brief Folder format handler for SonyHDV. /// /// This header ... /// // ================================================================================================= extern XMPFileHandler * SonyHDV_MetaHandlerCTor ( XMPFiles * parent ); extern bool SonyHDV_CheckFormat ( XMP_FileFormat format, const std::string & rootPath, const std::string & gpName, const std::string & parentName, const std::string & leafName, XMPFiles * parent ); static const XMP_OptionBits kSonyHDV_HandlerFlags = (kXMPFiles_CanInjectXMP | kXMPFiles_CanExpand | kXMPFiles_CanRewrite | kXMPFiles_PrefersInPlace | kXMPFiles_CanReconcile | kXMPFiles_AllowsOnlyXMP | kXMPFiles_ReturnsRawPacket | kXMPFiles_HandlerOwnsFile | kXMPFiles_AllowsSafeUpdate | kXMPFiles_FolderBasedFormat); class SonyHDV_MetaHandler : public XMPFileHandler { public: void CacheFileData(); void ProcessXMP(); XMP_OptionBits GetSerializeOptions() // *** These should be standard for standalone XMP files. { return (kXMP_UseCompactFormat | kXMP_OmitPacketWrapper); }; void UpdateFile ( bool doSafeUpdate ); void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ); SonyHDV_MetaHandler ( XMPFiles * _parent ); virtual ~SonyHDV_MetaHandler(); private: SonyHDV_MetaHandler() {}; // Hidden on purpose. void MakeClipFilePath ( std::string * path, XMP_StringPtr suffix ); bool MakeIndexFilePath ( std::string& idxPath, const std::string& rootPath, const std::string& leafName ); void MakeLegacyDigest ( std::string * digestStr ); std::string rootPath, clipName; }; // SonyHDV_MetaHandler // ================================================================================================= #endif /* __SonyHDV_Handler_hpp__ */ exempi-2.2.1/source/XMPFiles/FileHandlers/RIFF_Handler.cpp0000664000175000017500000003042012150230672020101 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2009 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "RIFF.hpp" #include "RIFF_Handler.hpp" using namespace std; // ================================================================================================= /// \file RIFF_Handler.cpp /// \brief File format handler for RIFF. // ================================================================================================= // ================================================================================================= // RIFF_MetaHandlerCTor // ==================== XMPFileHandler * RIFF_MetaHandlerCTor ( XMPFiles * parent ) { return new RIFF_MetaHandler ( parent ); } // ================================================================================================= // RIFF_CheckFormat // =============== // // An RIFF file must begin with "RIFF", a 4 byte length, then the chunkType (AVI or WAV) // The specified length MUST (in practice: SHOULD) match fileSize-8, but we don't bother checking this here. bool RIFF_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef file, XMPFiles* parent ) { IgnoreParam(format); IgnoreParam(parent); XMP_Assert ( (format == kXMP_AVIFile) || (format == kXMP_WAVFile) ); LFA_Rewind( file ); XMP_Uns8 chunkID[12]; LFA_Read( file, chunkID, 12, true ); if ( ! CheckBytes( &chunkID[0], "RIFF", 4 )) return false; if ( CheckBytes(&chunkID[8],"AVI ",4) && format == kXMP_AVIFile ) return true; if ( CheckBytes(&chunkID[8],"WAVE",4) && format == kXMP_WAVFile ) return true; return false; } // RIFF_CheckFormat // ================================================================================================= // RIFF_MetaHandler::RIFF_MetaHandler // ================================ RIFF_MetaHandler::RIFF_MetaHandler ( XMPFiles * _parent ) { this->parent = _parent; this->handlerFlags = kRIFF_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; this->oldFileSize = this->newFileSize = this->trailingGarbageSize = 0; this->level = 0; this->listInfoChunk = this->listTdatChunk = 0; this->dispChunk = this->bextChunk = this->cr8rChunk = this->prmlChunk = 0; this->xmpChunk = 0; this->lastChunk = 0; this->hasListInfoINAM = false; } // ================================================================================================= // RIFF_MetaHandler::~RIFF_MetaHandler // ================================= RIFF_MetaHandler::~RIFF_MetaHandler() { while ( ! this->riffChunks.empty() ) { delete this->riffChunks.back(); this->riffChunks.pop_back(); } } // ================================================================================================= // RIFF_MetaHandler::CacheFileData // ============================== void RIFF_MetaHandler::CacheFileData() { this->containsXMP = false; //assume for now LFA_FileRef file = this->parent->fileRef; this->oldFileSize = LFA_Measure( file ); if ( (this->parent->format == kXMP_WAVFile) && (this->oldFileSize > 0xFFFFFFFF) ) XMP_Throw ( "RIFF_MetaHandler::CacheFileData: WAV Files larger 4GB not supported", kXMPErr_Unimplemented ); LFA_Rewind( file ); this->level = 0; // parse top-level chunks (most likely just one, except large avi files) XMP_Int64 filePos = 0; while ( filePos < this->oldFileSize ) { this->riffChunks.push_back( (RIFF::ContainerChunk*) RIFF::getChunk( NULL, this ) ); // Tolerate limited forms of trailing garbage in a file. Some apps append private data. filePos = LFA_Tell( file ); XMP_Int64 fileTail = this->oldFileSize - filePos; if ( fileTail != 0 ) { if ( fileTail < 12 ) { this->oldFileSize = filePos; // Pretend the file is smaller. this->trailingGarbageSize = fileTail; } else if ( this->parent->format == kXMP_WAVFile ) { if ( fileTail < 1024*1024 ) { this->oldFileSize = filePos; // Pretend the file is smaller. this->trailingGarbageSize = fileTail; } else { XMP_Throw ( "Excessive garbage at end of file", kXMPErr_BadFileFormat ) } } else { XMP_Int32 chunkInfo [3]; LFA_Read ( file, &chunkInfo, 12, kLFA_RequireAll ); LFA_Seek ( file, -12, SEEK_CUR ); if ( (GetUns32LE ( &chunkInfo[0] ) != RIFF::kChunk_RIFF) || (GetUns32LE ( &chunkInfo[2] ) != RIFF::kType_AVIX) ) { if ( fileTail < 1024*1024 ) { this->oldFileSize = filePos; // Pretend the file is smaller. this->trailingGarbageSize = fileTail; } else { XMP_Throw ( "Excessive garbage at end of file", kXMPErr_BadFileFormat ) } } } } } // covered before => internal error if it occurs XMP_Validate( LFA_Tell( file ) == this->oldFileSize, "RIFF_MetaHandler::CacheFileData: unknown data at end of file", kXMPErr_InternalFailure ); } // RIFF_MetaHandler::CacheFileData // ================================================================================================= // RIFF_MetaHandler::ProcessXMP // ============================ void RIFF_MetaHandler::ProcessXMP() { SXMPUtils::RemoveProperties ( &this->xmpObj, 0, 0, kXMPUtil_DoAllProperties ); // process physical packet first if ( this->containsXMP ) this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); // then import native properties: RIFF::importProperties( this ); this->processedXMP = true; } // ================================================================================================= // RIFF_MetaHandler::UpdateFile // =========================== void RIFF_MetaHandler::UpdateFile ( bool doSafeUpdate ) { XMP_Validate( this->needsUpdate, "nothing to update", kXMPErr_InternalFailure ); //////////////////////////////////////////////////////////////////////////////////////// //////////// PASS 1: basics, exports, packet reserialze LFA_FileRef file = this->parent->fileRef; RIFF::containerVect *rc = &this->riffChunks; //temptemp //printf( "BEFORE:\n%s\n", rc->at(0)->toString().c_str() ); XMP_Enforce( rc->size() >= 1); RIFF::ContainerChunk* mainChunk = rc->at(0); this->lastChunk = rc->at( rc->size() - 1 ); // (may or may not coincide with mainChunk: ) XMP_Enforce( mainChunk != NULL ); RIFF::relocateWronglyPlacedXMPChunk( this ); // [2435625] lifted disablement for AVI RIFF::exportAndRemoveProperties( this ); // always rewrite both LISTs (implicit size changes, e.g. through 0-term corrections may // have very well led to size changes...) // set XMP packet info, re-serialize this->packetInfo.charForm = stdCharForm; this->packetInfo.writeable = true; this->packetInfo.offset = kXMPFiles_UnknownOffset; this->packetInfo.length = kXMPFiles_UnknownLength; // re-serialization ( needed because of above exportAndRemoveProperties() ) try { if ( this->xmpChunk == 0 ) // new chunk? pad with 2K this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_NoOptions , 2048 ); else // otherwise try to match former size this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_ExactPacketLength , (XMP_Uns32) this->xmpChunk->oldSize-8 ); } catch ( ... ) { // if that fails, be happy with whatever. this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_NoOptions ); } if ( (this->xmpPacket.size() & 1) == 1 ) this->xmpPacket += ' '; // Force the XMP to have an even size. // if missing, add xmp packet at end: if( this->xmpChunk == 0 ) this->xmpChunk = new RIFF::XMPChunk( this->lastChunk ); // * parenting happens within this call. // * size computation will happen in XMPChunk::changesAndSize() // * actual data will be set in XMPChunk::write() //////////////////////////////////////////////////////////////////////////////////////// // PASS 2: compute sizes, optimize container structure (no writing yet) { this->newFileSize = 0; // note: going through forward (not vice versa) is an important condition, // so that parking LIST:Tdat,Cr8r, PrmL to last chunk is doable // when encountered en route for ( XMP_Uns32 chunkNo = 0; chunkNo < rc->size(); chunkNo++ ) { RIFF::Chunk* cur = rc->at(chunkNo); cur->changesAndSize( this ); this->newFileSize += cur->newSize; if ( this->newFileSize % 2 == 1 ) this->newFileSize++; // pad byte } this->newFileSize += this->trailingGarbageSize; } // PASS2 //////////////////////////////////////////////////////////////////////////////////////// // PASS 2a: verify no chunk violates 2GB boundaries switch( this->parent->format ) { // NB: <4GB for ALL chunks asserted before in ContainerChunk::changesAndSize() case kXMP_AVIFile: // ensure no chunk (single or multi, no matter) crosses 2 GB ... for ( XMP_Int32 chunkNo = 0; chunkNo < (XMP_Int32)rc->size(); chunkNo++ ) { if ( rc->at(chunkNo)->oldSize <= 0x80000000LL ) // ... if <2GB before XMP_Validate( rc->at(chunkNo)->newSize <= 0x80000000LL, "Chunk grew beyond 2 GB", kXMPErr_Unimplemented ); } // compatibility: if single-chunk AND below <1GB, ensure <1GB if ( ( rc->size() > 1 ) && ( rc->at(0)->oldSize < 0x40000000 ) ) { XMP_Validate( rc->at(0)->newSize < 0x40000000LL, "compatibility: mainChunk must remain < 1GB" , kXMPErr_Unimplemented ); } // [2473381] compatibility: if single-chunk AND >2GB,<4GB, ensure <4GB if ( ( rc->size() > 1 ) && ( rc->at(0)->oldSize > 0x80000000LL ) && // 2GB ( rc->at(0)->oldSize < 0x100000000LL ) ) // 4GB { XMP_Validate( rc->at(0)->newSize < 0x100000000LL, "compatibility: mainChunk must remain < 4GB" , kXMPErr_Unimplemented ); } break; case kXMP_WAVFile: XMP_Validate( 1 == rc->size(), "WAV must be single-chunk", kXMPErr_InternalFailure ); XMP_Validate( rc->at(0)->newSize <= 0xFFFFFFFFLL, "WAV above 4 GB not supported", kXMPErr_Unimplemented ); break; default: XMP_Throw( "unknown format", kXMPErr_InternalFailure ); } //////////////////////////////////////////////////////////////////////////////////////// // PASS 3: write avix chunk(s) if applicable (shrinks or stays) // and main chunk. -- operation order depends on mainHasShrunk. { // if needed, extend file beforehand if ( this->newFileSize > this->oldFileSize ) LFA_Extend( file, newFileSize ); RIFF::Chunk* mainChunk = rc->at(0); XMP_Int64 mainGrowth = mainChunk->newSize - mainChunk->oldSize; XMP_Enforce( mainGrowth >= 0 ); // main always stays or grows //temptemp //printf( "AFTER:\n%s\n", rc->at(0)->toString().c_str() ); if ( rc->size() > 1 ) // [2457482] XMP_Validate( mainGrowth == 0, "mainChunk must not grow, if multiple RIFF chunks", kXMPErr_InternalFailure ); // back to front: XMP_Int64 avixStart = newFileSize; // count from the back if ( this->trailingGarbageSize != 0 ) { XMP_Int64 goodDataEnd = this->newFileSize - this->trailingGarbageSize; LFA_Move ( file, this->oldFileSize, file, goodDataEnd, this->trailingGarbageSize ); avixStart = goodDataEnd; } for ( XMP_Int32 chunkNo = ((XMP_Int32)rc->size()) -1; chunkNo >= 0; chunkNo-- ) { RIFF::Chunk* cur = rc->at(chunkNo); avixStart -= cur->newSize; if ( avixStart % 2 == 1 ) // rewind one more avixStart -= 1; LFA_Seek( file, avixStart , SEEK_SET ); if ( cur->hasChange ) // need explicit write-out ? cur->write( this, file, chunkNo == 0 ); else // or will a simple move do? { XMP_Enforce( cur->oldSize == cur->newSize ); if ( cur->oldPos != avixStart ) // important optimization: only move if there's a need to LFA_Move( file, cur->oldPos, file, avixStart, cur->newSize ); } } // if needed, shrink file afterwards if ( this->newFileSize < this->oldFileSize ) LFA_Truncate( file, this->newFileSize ); } // PASS 3 this->needsUpdate = false; //do last for safety } // RIFF_MetaHandler::UpdateFile // ================================================================================================= // RIFF_MetaHandler::WriteFile // ========================== void RIFF_MetaHandler::WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) { IgnoreParam(sourceRef); IgnoreParam(sourcePath); XMP_Throw ( "RIFF_MetaHandler::WriteFile: Not supported (must go through UpdateFile", kXMPErr_Unavailable ); } exempi-2.2.1/source/XMPFiles/FileHandlers/PostScript_Handler.cpp0000664000175000017500000004546312150230672021502 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include #include "XMPScanner.hpp" #include "Scanner_Handler.hpp" #include "PostScript_Handler.hpp" using namespace std; // ================================================================================================= /// \file PostScript_Handler.cpp /// \brief File format handler for PostScript and EPS files. /// /// This header ... /// // ================================================================================================= static const char * kPSFileTag = "%!PS-Adobe-"; static const size_t kPSFileTagLen = strlen ( kPSFileTag ); // ================================================================================================= // PostScript_MetaHandlerCTor // ========================== XMPFileHandler * PostScript_MetaHandlerCTor ( XMPFiles * parent ) { XMPFileHandler * newHandler = new PostScript_MetaHandler ( parent ); return newHandler; } // PostScript_MetaHandlerCTor // ================================================================================================= // PostScript_CheckFormat // ====================== bool PostScript_CheckFormat ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ) { IgnoreParam(filePath); IgnoreParam(parent); XMP_Assert ( (format == kXMP_EPSFile) || (format == kXMP_PostScriptFile) ); IOBuffer ioBuf; XMP_Int64 psOffset; size_t psLength; XMP_Uns32 temp1, temp2; // Check for the binary EPSF preview header. LFA_Seek ( fileRef, 0, SEEK_SET ); if ( ! CheckFileSpace ( fileRef, &ioBuf, 4 ) ) return false; temp1 = GetUns32BE ( ioBuf.ptr ); if ( temp1 == 0xC5D0D3C6 ) { if ( ! CheckFileSpace ( fileRef, &ioBuf, 30 ) ) return false; psOffset = GetUns32LE ( ioBuf.ptr+4 ); // PostScript offset. psLength = GetUns32LE ( ioBuf.ptr+8 ); // PostScript length. bool ok; LFA_Seek ( fileRef, psOffset, SEEK_SET, &ok ); if ( ! ok ) return false; // Don't throw for a failure. ioBuf.ptr = ioBuf.limit; // Make sure RefillBuffer does a simple read. RefillBuffer ( fileRef, &ioBuf ); if ( (ioBuf.len < kIOBufferSize) && (ioBuf.len < psLength) ) return false; // Not enough PostScript. } // Check the start of the PostScript DSC header comment. if ( ! CheckFileSpace ( fileRef, &ioBuf, (kPSFileTagLen + 3 + 1) ) ) return false; if ( ! CheckBytes ( ioBuf.ptr, Uns8Ptr(kPSFileTag), kPSFileTagLen ) ) return false; ioBuf.ptr += kPSFileTagLen; // Check the PostScript DSC major version number. temp1 = 0; while ( (ioBuf.ptr < ioBuf.limit) && ('0' <= *ioBuf.ptr) && (*ioBuf.ptr <= '9') ) { temp1 = (temp1 * 10) + (*ioBuf.ptr - '0'); if ( temp1 > 1000 ) return false; // Overflow. ioBuf.ptr += 1; } if ( temp1 < 3 ) return false; // The version must be at least 3.0. if ( ! CheckFileSpace ( fileRef, &ioBuf, 3 ) ) return false; if ( *ioBuf.ptr != '.' ) return false; // No minor number. ioBuf.ptr += 1; // Check the PostScript DSC minor version number. temp2 = 0; while ( (ioBuf.ptr < ioBuf.limit) && ('0' <= *ioBuf.ptr) && (*ioBuf.ptr <= '9') ) { temp2 = (temp2 * 10) + (*ioBuf.ptr - '0'); if ( temp2 > 1000 ) return false; // Overflow. ioBuf.ptr += 1; } // We don't care about the actual minor version number. if ( format == kXMP_PostScriptFile ) { // Almost done for plain PostScript, check for whitespace. if ( ! CheckFileSpace ( fileRef, &ioBuf, 1 ) ) return false; if ( (*ioBuf.ptr != ' ') && (*ioBuf.ptr != kLF) && (*ioBuf.ptr != kCR) ) return false; ioBuf.ptr += 1; } else { // Check for the EPSF keyword on the header comment. if ( ! CheckFileSpace ( fileRef, &ioBuf, 6+3+1 ) ) return false; if ( ! CheckBytes ( ioBuf.ptr, Uns8Ptr(" EPSF-"), 6 ) ) return false; ioBuf.ptr += 6; // Check the EPS major version number. temp1 = 0; while ( (ioBuf.ptr < ioBuf.limit) && ('0' <= *ioBuf.ptr) && (*ioBuf.ptr <= '9') ) { temp1 = (temp1 * 10) + (*ioBuf.ptr - '0'); if ( temp1 > 1000 ) return false; // Overflow. ioBuf.ptr += 1; } if ( temp1 < 3 ) return false; // The version must be at least 3.0. if ( ! CheckFileSpace ( fileRef, &ioBuf, 3 ) ) return false; if ( *ioBuf.ptr != '.' ) return false; // No minor number. ioBuf.ptr += 1; // Check the EPS minor version number. temp2 = 0; while ( (ioBuf.ptr < ioBuf.limit) && ('0' <= *ioBuf.ptr) && (*ioBuf.ptr <= '9') ) { temp2 = (temp2 * 10) + (*ioBuf.ptr - '0'); if ( temp2 > 1000 ) return false; // Overflow. ioBuf.ptr += 1; } // We don't care about the actual minor version number. if ( ! CheckFileSpace ( fileRef, &ioBuf, 1 ) ) return false; if ( (*ioBuf.ptr != kLF) && (*ioBuf.ptr != kCR) ) return false; ioBuf.ptr += 1; } return true; } // PostScript_CheckFormat // ================================================================================================= // PostScript_MetaHandler::PostScript_MetaHandler // ============================================== PostScript_MetaHandler::PostScript_MetaHandler ( XMPFiles * _parent ) { this->parent = _parent; this->handlerFlags = kPostScript_HandlerFlags; this->stdCharForm = kXMP_Char8Bit; this->psHint = kPSHint_NoMarker; } // PostScript_MetaHandler::PostScript_MetaHandler // ================================================================================================= // PostScript_MetaHandler::~PostScript_MetaHandler // =============================================== PostScript_MetaHandler::~PostScript_MetaHandler() { // ! Inherit the base cleanup. } // PostScript_MetaHandler::~PostScript_MetaHandler // ================================================================================================= // PostScript_MetaHandler::FindPostScriptHint // ========================================== // // Search for "%ADO_ContainsXMP:" at the beginning of a line, it must be before "%%EndComments". If // the XMP marker is found, look for the MainFirst/MainLast/NoMain options. static const char * kPSContainsXMPString = "%ADO_ContainsXMP:"; static const size_t kPSContainsXMPLength = strlen ( kPSContainsXMPString ); static const char * kPSEndCommentString = "%%EndComments"; // ! Assumed shorter than kPSContainsXMPString. static const size_t kPSEndCommentLength = strlen ( kPSEndCommentString ); int PostScript_MetaHandler::FindPostScriptHint() { bool found = false; IOBuffer ioBuf; XMP_Uns8 ch; LFA_FileRef fileRef = this->parent->fileRef; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); // Check for the binary EPSF preview header. LFA_Seek ( fileRef, 0, SEEK_SET ); if ( ! CheckFileSpace ( fileRef, &ioBuf, 4 ) ) return false; XMP_Uns32 temp1 = GetUns32BE ( ioBuf.ptr ); if ( temp1 == 0xC5D0D3C6 ) { if ( ! CheckFileSpace ( fileRef, &ioBuf, 30 ) ) return false; size_t psOffset = GetUns32LE ( ioBuf.ptr+4 ); // PostScript offset. size_t psLength = GetUns32LE ( ioBuf.ptr+8 ); // PostScript length. bool ok; LFA_Seek ( fileRef, psOffset, SEEK_SET, &ok ); if ( ! ok ) return false; // Don't throw for a failure. ioBuf.ptr = ioBuf.limit; // Force the next check to refill the buffer. } // Look for the ContainsXMP comment. while ( true ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "PostScript_MetaHandler::FindPostScriptHint - User abort", kXMPErr_UserAbort ); } if ( ! CheckFileSpace ( fileRef, &ioBuf, kPSContainsXMPLength ) ) return kPSHint_NoMarker; if ( CheckBytes ( ioBuf.ptr, Uns8Ptr(kPSEndCommentString), kPSEndCommentLength ) ) { // Found "%%EndComments", don't look any further. return kPSHint_NoMarker; } else if ( ! CheckBytes ( ioBuf.ptr, Uns8Ptr(kPSContainsXMPString), kPSContainsXMPLength ) ) { // Not "%%EndComments" or "%ADO_ContainsXMP:", skip past the end of this line. do { if ( ! CheckFileSpace ( fileRef, &ioBuf, 1 ) ) return kPSHint_NoMarker; ch = *ioBuf.ptr; ++ioBuf.ptr; } while ( ! IsNewline ( ch ) ); } else { // Found "%ADO_ContainsXMP:", look for the main packet location option. ioBuf.ptr += kPSContainsXMPLength; int xmpHint = kPSHint_NoMain; // ! From here on, a failure means "no main", not "no marker". if ( ! CheckFileSpace ( fileRef, &ioBuf, 1 ) ) return kPSHint_NoMain; if ( ! IsSpaceOrTab ( *ioBuf.ptr ) ) return kPSHint_NoMain; while ( true ) { while ( true ) { // Skip leading spaces and tabs. if ( ! CheckFileSpace ( fileRef, &ioBuf, 1 ) ) return kPSHint_NoMain; if ( ! IsSpaceOrTab ( *ioBuf.ptr ) ) break; ++ioBuf.ptr; } if ( IsNewline ( *ioBuf.ptr ) ) return kPSHint_NoMain; // Reached the end of the ContainsXMP comment. if ( ! CheckFileSpace ( fileRef, &ioBuf, 6 ) ) return kPSHint_NoMain; if ( CheckBytes ( ioBuf.ptr, Uns8Ptr("NoMain"), 6 ) ) { ioBuf.ptr += 6; xmpHint = kPSHint_NoMain; break; } else if ( CheckBytes ( ioBuf.ptr, Uns8Ptr("MainFi"), 6 ) ) { ioBuf.ptr += 6; if ( ! CheckFileSpace ( fileRef, &ioBuf, 3 ) ) return kPSHint_NoMain; if ( CheckBytes ( ioBuf.ptr, Uns8Ptr("rst"), 3 ) ) { ioBuf.ptr += 3; xmpHint = kPSHint_MainFirst; } break; } else if ( CheckBytes ( ioBuf.ptr, Uns8Ptr("MainLa"), 6 ) ) { ioBuf.ptr += 6; if ( ! CheckFileSpace ( fileRef, &ioBuf, 2 ) ) return kPSHint_NoMain; if ( CheckBytes ( ioBuf.ptr, Uns8Ptr("st"), 2 ) ) { ioBuf.ptr += 2; xmpHint = kPSHint_MainLast; } break; } else { while ( true ) { // Skip until whitespace. if ( ! CheckFileSpace ( fileRef, &ioBuf, 1 ) ) return kPSHint_NoMain; if ( IsWhitespace ( *ioBuf.ptr ) ) break; ++ioBuf.ptr; } } } // Look for the main packet location option. // Make sure we found exactly a known option. if ( ! CheckFileSpace ( fileRef, &ioBuf, 1 ) ) return kPSHint_NoMain; if ( ! IsWhitespace ( *ioBuf.ptr ) ) return kPSHint_NoMain; return xmpHint; } // Found "%ADO_ContainsXMP:". } // Outer marker loop. return kPSHint_NoMarker; // Should never reach here. } // PostScript_MetaHandler::FindPostScriptHint // ================================================================================================= // PostScript_MetaHandler::FindFirstPacket // ======================================= // // Run the packet scanner until we find a valid packet. The first one is the main. For simplicity, // the state of all snips is checked after each buffer is read. In theory only the last of the // previous snips might change from partial to valid, but then we would have to special case the // first pass when there is no previous set of snips. Since we have to get a full report to look at // the last snip anyway, it costs virtually nothing extra to recheck all of the snips. bool PostScript_MetaHandler::FindFirstPacket() { int snipCount; bool found = false; size_t bufPos, bufLen; LFA_FileRef fileRef = this->parent->fileRef; XMP_Int64 fileLen = LFA_Measure ( fileRef ); XMP_PacketInfo & packetInfo = this->packetInfo; XMPScanner scanner ( fileLen ); XMPScanner::SnipInfoVector snips; enum { kBufferSize = 64*1024 }; XMP_Uns8 buffer [kBufferSize]; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); bufPos = 0; bufLen = 0; LFA_Seek ( fileRef, 0, SEEK_SET ); // Seek back to the beginning of the file. while ( true ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "PostScript_MetaHandler::FindFirstPacket - User abort", kXMPErr_UserAbort ); } bufPos += bufLen; bufLen = LFA_Read ( fileRef, buffer, kBufferSize ); if ( bufLen == 0 ) return false; // Must be at EoF, no packets found. scanner.Scan ( buffer, bufPos, bufLen ); snipCount = scanner.GetSnipCount(); scanner.Report ( snips ); for ( int i = 0; i < snipCount; ++i ) { if ( snips[i].fState == XMPScanner::eValidPacketSnip ) { if ( snips[i].fLength > 0x7FFFFFFF ) XMP_Throw ( "PostScript_MetaHandler::FindFirstPacket: Oversize packet", kXMPErr_BadXMP ); packetInfo.offset = snips[i].fOffset; packetInfo.length = (XMP_Int32)snips[i].fLength; packetInfo.charForm = snips[i].fCharForm; packetInfo.writeable = (snips[i].fAccess == 'w'); return true; } } } return false; } // FindFirstPacket // ================================================================================================= // PostScript_MetaHandler::FindLastPacket // ====================================== // // Run the packet scanner backwards until we find the start of a packet, or a valid packet. If we // found a packet start, resume forward scanning to see if it is a valid packet. For simplicity, all // of the snips are checked on each pass, for much the same reasons as in FindFirstPacket. #if 1 // *** Doing this right (as described above) requires out of order scanning support which isn't // *** implemented yet. For now we scan the whole file and pick the last valid packet. bool PostScript_MetaHandler::FindLastPacket() { int pkt; size_t bufPos, bufLen; LFA_FileRef fileRef = this->parent->fileRef; XMP_Int64 fileLen = LFA_Measure ( fileRef ); XMP_PacketInfo & packetInfo = this->packetInfo; // ------------------------------------------------------ // Scan the entire file to find all of the valid packets. XMPScanner scanner ( fileLen ); enum { kBufferSize = 64*1024 }; XMP_Uns8 buffer [kBufferSize]; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); LFA_Seek ( fileRef, 0, SEEK_SET ); // Seek back to the beginning of the file. for ( bufPos = 0; bufPos < (size_t)fileLen; bufPos += bufLen ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "PostScript_MetaHandler::FindLastPacket - User abort", kXMPErr_UserAbort ); } bufLen = LFA_Read ( fileRef, buffer, kBufferSize ); if ( bufLen == 0 ) XMP_Throw ( "PostScript_MetaHandler::FindLastPacket: Read failure", kXMPErr_ExternalFailure ); scanner.Scan ( buffer, bufPos, bufLen ); } // ------------------------------- // Pick the last the valid packet. int snipCount = scanner.GetSnipCount(); XMPScanner::SnipInfoVector snips ( snipCount ); scanner.Report ( snips ); for ( pkt = snipCount-1; pkt >= 0; --pkt ) { if ( snips[pkt].fState == XMPScanner::eValidPacketSnip ) break; } if ( pkt >= 0 ) { if ( snips[pkt].fLength > 0x7FFFFFFF ) XMP_Throw ( "PostScript_MetaHandler::FindLastPacket: Oversize packet", kXMPErr_BadXMP ); packetInfo.offset = snips[pkt].fOffset; packetInfo.length = (XMP_Int32)snips[pkt].fLength; packetInfo.charForm = snips[pkt].fCharForm; packetInfo.writeable = (snips[pkt].fAccess == 'w'); return true; } return false; } // PostScript_MetaHandler::FindLastPacket #else bool PostScript_MetaHandler::FindLastPacket() { int err, snipCount; bool found = false; XMP_Int64 backPos, backLen; size_t ioCount; LFA_FileRef fileRef = this->parent->fileRef; XMP_Int64 fileLen = LFA_Measure ( fileRef ); XMP_PacketInfo & packetInfo = this->packetInfo; XMPScanner scanner ( fileLen ); XMPScanner::SnipInfoVector snips; enum { kBufferSize = 64*1024 }; XMP_Uns8 buffer [kBufferSize]; XMP_AbortProc abortProc = this->parent->abortProc; void * abortArg = this->parent->abortArg; const bool checkAbort = (abortProc != 0); backPos = fileLen; backLen = 0; while ( true ) { if ( checkAbort && abortProc(abortArg) ) { XMP_Throw ( "PostScript_MetaHandler::FindLastPacket - User abort", kXMPErr_UserAbort ); } backLen = kBufferSize; if ( backPos < kBufferSize ) backLen = backPos; if ( backLen == 0 ) return false; // Must be at BoF, no packets found. backPos -= backLen; LFA_Seek ( fileRef, backPos, SEEK_SET ); // Seek back to the start of the next buffer. #error "ioCount is 32 bits, backLen is 64" ioCount = LFA_Read ( fileRef, buffer, backLen ); if ( ioCount != backLen ) XMP_Throw ( "PostScript_MetaHandler::FindLastPacket: Read failure", kXMPErr_ExternalFailure ); scanner.Scan ( buffer, backPos, backLen ); snipCount = scanner.GetSnipCount(); scanner.Report ( snips ); for ( int i = snipCount-1; i >= 0; --i ) { if ( snips[i].fState == XMPScanner::eValidPacketSnip ) { return VerifyMainPacket ( fileRef, snips[i].fOffset, snips[i].fLength, format, beLenient, mainInfo ); } else if ( snips[i].fState == XMPScanner::ePartialPacketSnip ) { // This part is a tad tricky. We have a partial packet, so we need to scan // forward from its ending to see if it is a valid packet. Snips won't recombine, // the partial snip will change state. Be careful with the I/O to not clobber the // backward scan positions, so that it can be resumed if necessary. size_t fwdPos = snips[i].fOffset + snips[i].fLength; LFA_Seek ( fileRef, fwdPos, SEEK_SET ); // Seek to the end of the partial snip. while ( (fwdPos < fileLen) && (snips[i].fState == XMPScanner::ePartialPacketSnip) ) { ioCount = LFA_Read ( fileRef, buffer, kBufferSize ); if ( ioCount == 0 ) XMP_Throw ( "PostScript_MetaHandler::FindLastPacket: Read failure", kXMPErr_ExternalFailure ); scanner.Scan ( buffer, fwdPos, ioCount ); scanner.Report ( snips ); fwdPos += ioCount; } if ( snips[i].fState == XMPScanner::eValidPacketSnip ) { if ( snips[i].fLength > 0x7FFFFFFF ) XMP_Throw ( "PostScript_MetaHandler::FindLastPacket: Oversize packet", kXMPErr_BadXMP ); packetInfo.offset = snips[i].fOffset; packetInfo.length = (XMP_Int32)snips[i].fLength; packetInfo.charForm = snips[i].fCharForm; packetInfo.writeable = (snips[i].fAccess == 'w'); return true; } } } // Backwards snip loop. } // Backwards read loop. return false; // Should never get here. } // PostScript_MetaHandler::FindLastPacket #endif // ================================================================================================= // PostScript_MetaHandler::CacheFileData // ===================================== void PostScript_MetaHandler::CacheFileData() { this->containsXMP = false; this->psHint = FindPostScriptHint(); if ( this->psHint == kPSHint_MainFirst ) { this->containsXMP = FindFirstPacket(); } else if ( this->psHint == kPSHint_MainLast ) { this->containsXMP = FindLastPacket(); } if ( this->containsXMP ) ReadXMPPacket ( this ); } // PostScript_MetaHandler::CacheFileData // ================================================================================================= exempi-2.2.1/source/XMPFiles/XMPFiles.cpp0000664000175000017500000016130112150230673015011 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include #include #include "XMPFiles_Impl.hpp" #include "UnicodeConversions.hpp" // These are the official, fully supported handlers. #include "FileHandlers/JPEG_Handler.hpp" #include "FileHandlers/TIFF_Handler.hpp" #include "FileHandlers/PSD_Handler.hpp" #include "FileHandlers/InDesign_Handler.hpp" #include "FileHandlers/PostScript_Handler.hpp" #include "FileHandlers/Scanner_Handler.hpp" #include "FileHandlers/MPEG2_Handler.hpp" #include "FileHandlers/PNG_Handler.hpp" #include "FileHandlers/RIFF_Handler.hpp" #include "FileHandlers/MP3_Handler.hpp" #include "FileHandlers/SWF_Handler.hpp" #include "FileHandlers/UCF_Handler.hpp" #include "FileHandlers/MPEG4_Handler.hpp" #include "FileHandlers/FLV_Handler.hpp" #include "FileHandlers/P2_Handler.hpp" #include "FileHandlers/SonyHDV_Handler.hpp" #include "FileHandlers/XDCAM_Handler.hpp" #include "FileHandlers/XDCAMEX_Handler.hpp" #include "FileHandlers/AVCHD_Handler.hpp" #include "FileHandlers/ASF_Handler.hpp" #include "FileHandlers/GIF_Handler.hpp" // ================================================================================================= /// \file XMPFiles.cpp /// \brief High level support to access metadata in files of interest to Adobe applications. /// /// This header ... /// // ================================================================================================= // ================================================================================================= XMP_Int32 sXMPFilesInitCount = 0; #if GatherPerformanceData APIPerfCollection* sAPIPerf = 0; #endif // These are embedded version strings. #if XMP_DebugBuild #define kXMPFiles_DebugFlag 1 #else #define kXMPFiles_DebugFlag 0 #endif #define kXMPFiles_VersionNumber ( (kXMPFiles_DebugFlag << 31) | \ (XMP_API_VERSION_MAJOR << 24) | \ (XMP_API_VERSION_MINOR << 16) | \ (XMP_API_VERSION_MICRO << 8) ) #define kXMPFilesName "XMP Files" #define kXMPFiles_VersionMessage kXMPFilesName " " XMP_API_VERSION_STRING const char * kXMPFiles_EmbeddedVersion = kXMPFiles_VersionMessage; const char * kXMPFiles_EmbeddedCopyright = kXMPFilesName " " kXMP_CopyrightStr; // ================================================================================================= struct XMPFileHandlerInfo { XMP_FileFormat format; XMP_OptionBits flags; void * checkProc; XMPFileHandlerCTor handlerCTor; XMPFileHandlerInfo() : format(0), flags(0), checkProc(0), handlerCTor(0) {}; XMPFileHandlerInfo ( XMP_FileFormat _format, XMP_OptionBits _flags, CheckFileFormatProc _checkProc, XMPFileHandlerCTor _handlerCTor ) : format(_format), flags(_flags), checkProc((void*)_checkProc), handlerCTor(_handlerCTor) {}; XMPFileHandlerInfo ( XMP_FileFormat _format, XMP_OptionBits _flags, CheckFolderFormatProc _checkProc, XMPFileHandlerCTor _handlerCTor ) : format(_format), flags(_flags), checkProc((void*)_checkProc), handlerCTor(_handlerCTor) {}; }; // Don't use a map for the handler tables, typedef std::map XMPFileHandlerTable; typedef XMPFileHandlerTable::iterator XMPFileHandlerTablePos; typedef std::pair XMPFileHandlerTablePair; static XMPFileHandlerTable * sFolderHandlers = 0; // The directory-oriented handlers. static XMPFileHandlerTable * sNormalHandlers = 0; // The normal file-oriented handlers. static XMPFileHandlerTable * sOwningHandlers = 0; // The file-oriented handlers that "own" the file. static XMPFileHandlerInfo kScannerHandlerInfo ( kXMP_UnknownFile, kScanner_HandlerFlags, (CheckFileFormatProc)0, Scanner_MetaHandlerCTor ); // ================================================================================================= static void RegisterFolderHandler ( XMP_FileFormat format, XMP_OptionBits flags, CheckFolderFormatProc checkProc, XMPFileHandlerCTor handlerCTor ) { XMP_Assert ( format != kXMP_UnknownFile ); std::string noExt; XMP_Assert ( flags & kXMPFiles_HandlerOwnsFile ); XMP_Assert ( flags & kXMPFiles_FolderBasedFormat ); XMP_Assert ( (flags & kXMPFiles_CanInjectXMP) ? (flags & kXMPFiles_CanExpand) : 1 ); XMP_Assert ( sFolderHandlers->find ( format ) == sFolderHandlers->end() ); XMP_Assert ( sNormalHandlers->find ( format ) == sNormalHandlers->end() ); XMP_Assert ( sOwningHandlers->find ( format ) == sOwningHandlers->end() ); XMPFileHandlerInfo handlerInfo ( format, flags, checkProc, handlerCTor ); sFolderHandlers->insert ( sFolderHandlers->end(), XMPFileHandlerTablePair ( format, handlerInfo ) ); } // RegisterFolderHandler // ================================================================================================= static void RegisterNormalHandler ( XMP_FileFormat format, XMP_OptionBits flags, CheckFileFormatProc checkProc, XMPFileHandlerCTor handlerCTor ) { XMP_Assert ( format != kXMP_UnknownFile ); std::string noExt; XMP_Assert ( ! (flags & kXMPFiles_HandlerOwnsFile) ); XMP_Assert ( ! (flags & kXMPFiles_FolderBasedFormat) ); XMP_Assert ( (flags & kXMPFiles_CanInjectXMP) ? (flags & kXMPFiles_CanExpand) : 1 ); XMP_Assert ( sFolderHandlers->find ( format ) == sFolderHandlers->end() ); XMP_Assert ( sNormalHandlers->find ( format ) == sNormalHandlers->end() ); XMP_Assert ( sOwningHandlers->find ( format ) == sOwningHandlers->end() ); XMPFileHandlerInfo handlerInfo ( format, flags, checkProc, handlerCTor ); sNormalHandlers->insert ( sNormalHandlers->end(), XMPFileHandlerTablePair ( format, handlerInfo ) ); } // RegisterNormalHandler // ================================================================================================= static void RegisterOwningHandler ( XMP_FileFormat format, XMP_OptionBits flags, CheckFileFormatProc checkProc, XMPFileHandlerCTor handlerCTor ) { XMP_Assert ( format != kXMP_UnknownFile ); std::string noExt; XMP_Assert ( flags & kXMPFiles_HandlerOwnsFile ); XMP_Assert ( ! (flags & kXMPFiles_FolderBasedFormat) ); XMP_Assert ( (flags & kXMPFiles_CanInjectXMP) ? (flags & kXMPFiles_CanExpand) : 1 ); XMP_Assert ( sFolderHandlers->find ( format ) == sFolderHandlers->end() ); XMP_Assert ( sNormalHandlers->find ( format ) == sNormalHandlers->end() ); XMP_Assert ( sOwningHandlers->find ( format ) == sOwningHandlers->end() ); XMPFileHandlerInfo handlerInfo ( format, flags, checkProc, handlerCTor ); sOwningHandlers->insert ( sOwningHandlers->end(), XMPFileHandlerTablePair ( format, handlerInfo ) ); } // RegisterOwningHandler // ================================================================================================= static XMPFileHandlerInfo * PickDefaultHandler ( XMP_FileFormat format, const std::string & fileExt ) { if ( (format == kXMP_UnknownFile) && (! fileExt.empty()) ) { for ( int i = 0; kFileExtMap[i].format != 0; ++i ) { if ( fileExt == kFileExtMap[i].ext ) { format = kFileExtMap[i].format; break; } } } if ( format == kXMP_UnknownFile ) return 0; XMPFileHandlerTablePos handlerPos; handlerPos = sNormalHandlers->find ( format ); if ( handlerPos != sNormalHandlers->end() ) return &handlerPos->second; handlerPos = sOwningHandlers->find ( format ); if ( handlerPos != sOwningHandlers->end() ) return &handlerPos->second; handlerPos = sFolderHandlers->find ( format ); if ( handlerPos != sFolderHandlers->end() ) return &handlerPos->second; return 0; } // PickDefaultHandler // ================================================================================================= static const char * kP2ContentChildren[] = { "CLIP", "VIDEO", "AUDIO", "ICON", "VOICE", "PROXY", 0 }; static inline bool CheckP2ContentChild ( const std::string & folderName ) { for ( int i = 0; kP2ContentChildren[i] != 0; ++i ) { if ( folderName == kP2ContentChildren[i] ) return true; } return false; } // ------------------------------------------------------------------------------------------------- static XMP_FileFormat CheckParentFolderNames ( const std::string & rootPath, const std::string & gpName, const std::string & parentName, const std::string & leafName ) { IgnoreParam ( parentName ); // This is called when the input path to XMPFiles::OpenFile names an existing file. We need to // quickly decide if this might be inside a folder-handler's structure. See if the containing // folders might match any of the registered folder handlers. This check does not have to be // precise, the handler will do that. This does have to be fast. // // Since we don't have many folder handlers, this is simple hardwired code. Note that the caller // has already shifted the names to upper case. // P2 .../MyMovie/CONTENTS//. - check CONTENTS and if ( (gpName == "CONTENTS") && CheckP2ContentChild ( parentName ) ) return kXMP_P2File; // XDCAM-EX .../MyMovie/BPAV/CLPR//. - check for BPAV/CLPR // ! This must be checked before XDCAM-SAM because both have a "CLPR" grandparent. if ( gpName == "CLPR" ) { std::string tempPath, greatGP; tempPath = rootPath; SplitLeafName ( &tempPath, &greatGP ); MakeUpperCase ( &greatGP ); if ( greatGP == "BPAV" ) return kXMP_XDCAM_EXFile; } // XDCAM-FAM .../MyMovie//. - check that is CLIP, or EDIT, or SUB // ! The standard says Clip/Edit/Sub, but the caller has already shifted to upper case. if ( (parentName == "CLIP") || (parentName == "EDIT") || (parentName == "SUB") ) return kXMP_XDCAM_FAMFile; // XDCAM-SAM .../MyMovie/PROAV///. - check for PROAV and CLPR or EDTR if ( (gpName == "CLPR") || (gpName == "EDTR") ) { std::string tempPath, greatGP; tempPath = rootPath; SplitLeafName ( &tempPath, &greatGP ); MakeUpperCase ( &greatGP ); if ( greatGP == "PROAV" ) return kXMP_XDCAM_SAMFile; } // Sony HDV .../MyMovie/VIDEO/HVR/. - check for VIDEO and HVR if ( (gpName == "VIDEO") && (parentName == "HVR") ) return kXMP_SonyHDVFile; // AVCHD .../MyMovie/BDMV//. - check for BDMV and CLIPINF or STREAM if ( (gpName == "BDMV") && ((parentName == "CLIPINF") || (parentName == "STREAM")) ) return kXMP_AVCHDFile; return kXMP_UnknownFile; } // CheckParentFolderNames // ================================================================================================= static XMP_FileFormat CheckTopFolderName ( const std::string & rootPath ) { // This is called when the input path to XMPFiles::OpenFile does not name an existing file (or // existing anything). We need to quickly decide if this might be a logical path for a folder // handler. See if the root contains the top content folder for any of the registered folder // handlers. This check does not have to be precise, the handler will do that. This does have to // be fast. // // Since we don't have many folder handlers, this is simple hardwired code. std::string childPath = rootPath; childPath += kDirChar; size_t baseLen = childPath.size(); // P2 .../MyMovie/CONTENTS//... - only check for CONTENTS/CLIP childPath += "CONTENTS"; childPath += kDirChar; childPath += "CLIP"; if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFolder ) return kXMP_P2File; childPath.erase ( baseLen ); // XDCAM-FAM .../MyMovie//... - only check for Clip and MEDIAPRO.XML childPath += "Clip"; // ! Yes, mixed case. if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFolder ) { childPath.erase ( baseLen ); childPath += "MEDIAPRO.XML"; if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFile ) return kXMP_XDCAM_FAMFile; } childPath.erase ( baseLen ); // XDCAM-SAM .../MyMovie/PROAV//... - only check for PROAV/CLPR childPath += "PROAV"; childPath += kDirChar; childPath += "CLPR"; if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFolder ) return kXMP_XDCAM_SAMFile; childPath.erase ( baseLen ); // XDCAM-EX .../MyMovie/BPAV//... - check for BPAV/CLPR childPath += "BPAV"; childPath += kDirChar; childPath += "CLPR"; if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFolder ) return kXMP_XDCAM_EXFile; childPath.erase ( baseLen ); // Sony HDV .../MyMovie/VIDEO/HVR/. - check for VIDEO/HVR childPath += "VIDEO"; childPath += kDirChar; childPath += "HVR"; if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFolder ) return kXMP_SonyHDVFile; childPath.erase ( baseLen ); // AVCHD .../MyMovie/BDMV/CLIPINF/. - check for BDMV/CLIPINF childPath += "BDMV"; childPath += kDirChar; childPath += "CLIPINF"; if ( GetFileMode ( childPath.c_str() ) == kFMode_IsFolder ) return kXMP_AVCHDFile; childPath.erase ( baseLen ); return kXMP_UnknownFile; } // CheckTopFolderName // ================================================================================================= static XMPFileHandlerInfo * TryFolderHandlers ( XMP_FileFormat format, const std::string & rootPath, const std::string & gpName, const std::string & parentName, const std::string & leafName, XMPFiles * parentObj ) { bool foundHandler = false; XMPFileHandlerInfo * handlerInfo = 0; XMPFileHandlerTablePos handlerPos; // We know we're in a possible context for a folder-oriented handler, so try them. if ( format != kXMP_UnknownFile ) { // Have an explicit format, pick that or nothing. handlerPos = sFolderHandlers->find ( format ); if ( handlerPos != sFolderHandlers->end() ) { handlerInfo = &handlerPos->second; CheckFolderFormatProc CheckProc = (CheckFolderFormatProc) (handlerInfo->checkProc); foundHandler = CheckProc ( handlerInfo->format, rootPath, gpName, parentName, leafName, parentObj ); XMP_Assert ( foundHandler || (parentObj->tempPtr == 0) ); } } else { // Try all of the folder handlers. for ( handlerPos = sFolderHandlers->begin(); handlerPos != sFolderHandlers->end(); ++handlerPos ) { handlerInfo = &handlerPos->second; CheckFolderFormatProc CheckProc = (CheckFolderFormatProc) (handlerInfo->checkProc); foundHandler = CheckProc ( handlerInfo->format, rootPath, gpName, parentName, leafName, parentObj ); XMP_Assert ( foundHandler || (parentObj->tempPtr == 0) ); if ( foundHandler ) break; // ! Exit before incrementing handlerPos. } } if ( ! foundHandler ) handlerInfo = 0; return handlerInfo; } // TryFolderHandlers // ================================================================================================= static XMPFileHandlerInfo * SelectSmartHandler ( XMPFiles * thiz, XMP_StringPtr clientPath, XMP_FileFormat format, XMP_OptionBits openFlags ) { // There are 4 stages in finding a handler, ending at the first success: // 1. If the client passes in a format, try that handler. // 2. Try all of the folder-oriented handlers. // 3. Try a file-oriented handler based on the file extension. // 4. Try all of the file-oriented handlers. // // The most common case is almost certainly #3, so we want to get there quickly. Most of the // time the client won't pass in a format, so #1 takes no time. The folder-oriented handler // checks are preceded by minimal folder checks. These checks are meant to be fast in the // failure case. The folder-oriented checks have to go before the general file-oriented checks // because the client path might be to one of the inner files, and we might have a file-oriented // handler for that kind of file, but we want to recognize the clip. More details are below. // // In brief, the folder-oriented formats use shallow trees with specific folder names and // highly stylized file names. The user thinks of the tree as a collection of clips, each clip // is stored as multiple files for video, audio, metadata, etc. The folder-oriented stage has // to be first because there can be files in the structure that are also covered by a // file-oriented handler. // // In the file-oriented case, the CheckProc should do as little as possible to determine the // format, based on the actual file content. If that is not possible, use the format hint. The // initial CheckProc calls (steps 1 and 3) has the presumed format in this->format, the later // calls (step 4) have kXMP_UnknownFile there. // // The folder-oriented checks need to be well optimized since the formats are relatively rare, // but have to go first and could require multiple file system calls to identify. We want to // get to the first file-oriented guess as quickly as possible, that is the real handler most of // the time. // // The folder-oriented handlers are for things like P2 and XDCAM that use files distributed in a // well defined folder structure. Using a portion of P2 as an example: // .../MyMovie // CONTENTS // CLIP // 0001AB.XML // 0002CD.XML // VIDEO // 0001AB.MXF // 0002CD.MXF // VOICE // 0001AB.WAV // 0002CD.WAV // // The user thinks of .../MyMovie as the container of P2 stuff, in this case containing 2 clips // called 0001AB and 0002CD. The exact folder structure and file layout differs, but the basic // concepts carry across all of the folder-oriented handlers. // // The client path can be a conceptual clip path like .../MyMovie/0001AB, or a full path to any // of the contained files. For file paths we have to behave the same as the implied conceptual // path, e.g. we don't want .../MyMovie/CONTENTS/VOICE/0001AB.WAV to invoke the WAV handler. // There might also be a mapping from user friendly names to clip names (e.g. Intro to 0001AB). // If so that is private to the handler and does not affect this code. // // In order to properly handle the file path input we have to look for the folder-oriented case // before any of the file-oriented cases. And since these are relatively rare, hence fail most of // the time, we have to get in and out fast in the not handled case. That is what we do here. // // The folder-oriented processing done here is roughly: // // 1. Get the state of the client path: does-not-exist, is-file, is-folder, is-other. // 2. Reject is-folder and is-other, they can't possibly be a valid case. // 3. For does-not-exist: // 3a. Split the client path into a leaf component and root path. // 3b. Make sure the root path names an existing folder. // 3c. Make sure the root folder has a viable top level child folder (e.g. CONTENTS). // 4. For is-file: // 4a. Split the client path into a root path, grandparent folder, parent folder, and leaf name. // 4b. Make sure the parent or grandparent has a viable name (e.g. CONTENTS). // 5. Try the registered folder handlers. // // For the common case of "regular" files, we should only get as far as 3b. This is just 1 file // system call to get the client path state and some string processing. char openMode = 'r'; if ( openFlags & kXMPFiles_OpenForUpdate ) openMode = 'w'; XMPFileHandlerInfo * handlerInfo = 0; bool foundHandler = false; FileMode clientMode = GetFileMode ( clientPath ); if ( (clientMode == kFMode_IsFolder) || (clientMode == kFMode_IsOther) ) return 0; // Extract some info from the clientPath, needed for various checks. std::string rootPath, leafName, fileExt; rootPath = clientPath; SplitLeafName ( &rootPath, &leafName ); if ( leafName.empty() ) return 0; size_t extPos = leafName.size(); for ( --extPos; extPos > 0; --extPos ) if ( leafName[extPos] == '.' ) break; if ( leafName[extPos] == '.' ) { fileExt.assign ( &leafName[extPos+1] ); MakeLowerCase ( &fileExt ); leafName.erase ( extPos ); } thiz->format = kXMP_UnknownFile; // Make sure it is preset for later checks. thiz->openFlags = openFlags; // If the client passed in a format, try that first. if ( format != kXMP_UnknownFile ) { std::string emptyStr; handlerInfo = PickDefaultHandler ( format, emptyStr ); // Picks based on just the format. if ( handlerInfo != 0 ) { if ( (thiz->fileRef == 0) && (! (handlerInfo->flags & kXMPFiles_HandlerOwnsFile)) ) { thiz->fileRef = LFA_Open ( clientPath, openMode ); XMP_Assert ( thiz->fileRef != 0 ); // LFA_Open must either succeed or throw. } thiz->format = format; // ! Hack to tell the CheckProc thiz is an initial call. if ( ! (handlerInfo->flags & kXMPFiles_FolderBasedFormat) ) { CheckFileFormatProc CheckProc = (CheckFileFormatProc) (handlerInfo->checkProc); foundHandler = CheckProc ( format, clientPath, thiz->fileRef, thiz ); } else { // *** Don't try here yet. These are messy, needing existence checking and path processing. // *** CheckFolderFormatProc CheckProc = (CheckFolderFormatProc) (handlerInfo->checkProc); // *** foundHandler = CheckProc ( handlerInfo->format, rootPath, gpName, parentName, leafName, thiz ); // *** Don't let OpenStrictly cause an early exit: if ( openFlags & kXMPFiles_OpenStrictly ) openFlags ^= kXMPFiles_OpenStrictly; } XMP_Assert ( foundHandler || (thiz->tempPtr == 0) ); if ( foundHandler ) return handlerInfo; handlerInfo = 0; // ! Clear again for later use. } if ( openFlags & kXMPFiles_OpenStrictly ) return 0; } // Try the folder handlers if appropriate. XMP_Assert ( handlerInfo == 0 ); XMP_Assert ( (clientMode == kFMode_IsFile) || (clientMode == kFMode_DoesNotExist) ); std::string gpName, parentName; if ( clientMode == kFMode_DoesNotExist ) { // 3. For does-not-exist: // 3a. Split the client path into a leaf component and root path. // 3b. Make sure the root path names an existing folder. // 3c. Make sure the root folder has a viable top level child folder. // ! This does "return 0" on failure, the file does not exist so a normal file handler can't apply. if ( GetFileMode ( rootPath.c_str() ) != kFMode_IsFolder ) return 0; thiz->format = CheckTopFolderName ( rootPath ); if ( thiz->format == kXMP_UnknownFile ) return 0; handlerInfo = TryFolderHandlers ( thiz->format, rootPath, gpName, parentName, leafName, thiz ); // ! Parent and GP are empty. return handlerInfo; // ! Return found handler or 0. } XMP_Assert ( clientMode == kFMode_IsFile ); // 4. For is-file: // 4a. Split the client path into root, grandparent, parent, and leaf. // 4b. Make sure the parent or grandparent has a viable name. // ! Don't "return 0" on failure, this has to fall through to the normal file handlers. SplitLeafName ( &rootPath, &parentName ); SplitLeafName ( &rootPath, &gpName ); std::string origGPName ( gpName ); // ! Save the original case for XDCAM-FAM. MakeUpperCase ( &parentName ); MakeUpperCase ( &gpName ); thiz->format = CheckParentFolderNames ( rootPath, gpName, parentName, leafName ); if ( thiz->format != kXMP_UnknownFile ) { if ( (thiz->format == kXMP_XDCAM_FAMFile) && ((parentName == "CLIP") || (parentName == "EDIT") || (parentName == "SUB")) ) { // ! The standard says Clip/Edit/Sub, but we just shifted to upper case. gpName = origGPName; // ! XDCAM-FAM has just 1 level of inner folder, preserve the "MyMovie" case. } handlerInfo = TryFolderHandlers ( thiz->format, rootPath, gpName, parentName, leafName, thiz ); if ( handlerInfo != 0 ) return handlerInfo; } // Try an initial file-oriented handler based on the extension. handlerInfo = PickDefaultHandler ( kXMP_UnknownFile, fileExt ); // Picks based on just the extension. if ( handlerInfo != 0 ) { if ( (thiz->fileRef == 0) && (! (handlerInfo->flags & kXMPFiles_HandlerOwnsFile)) ) { thiz->fileRef = LFA_Open ( clientPath, openMode ); XMP_Assert ( thiz->fileRef != 0 ); // LFA_Open must either succeed or throw. } else if ( (thiz->fileRef != 0) && (handlerInfo->flags & kXMPFiles_HandlerOwnsFile) ) { LFA_Close ( thiz->fileRef ); thiz->fileRef = 0; } thiz->format = handlerInfo->format; // ! Hack to tell the CheckProc thiz is an initial call. CheckFileFormatProc CheckProc = (CheckFileFormatProc) (handlerInfo->checkProc); foundHandler = CheckProc ( handlerInfo->format, clientPath, thiz->fileRef, thiz ); XMP_Assert ( foundHandler || (thiz->tempPtr == 0) ); if ( foundHandler ) return handlerInfo; } // Search the handlers that don't want to open the file themselves. if ( thiz->fileRef == 0 ) thiz->fileRef = LFA_Open ( clientPath, openMode ); XMP_Assert ( thiz->fileRef != 0 ); // LFA_Open must either succeed or throw. XMPFileHandlerTablePos handlerPos = sNormalHandlers->begin(); for ( ; handlerPos != sNormalHandlers->end(); ++handlerPos ) { thiz->format = kXMP_UnknownFile; // ! Hack to tell the CheckProc this is not an initial call. handlerInfo = &handlerPos->second; CheckFileFormatProc CheckProc = (CheckFileFormatProc) (handlerInfo->checkProc); foundHandler = CheckProc ( handlerInfo->format, clientPath, thiz->fileRef, thiz ); XMP_Assert ( foundHandler || (thiz->tempPtr == 0) ); if ( foundHandler ) return handlerInfo; } // Search the handlers that do want to open the file themselves. LFA_Close ( thiz->fileRef ); thiz->fileRef = 0; handlerPos = sOwningHandlers->begin(); for ( ; handlerPos != sOwningHandlers->end(); ++handlerPos ) { thiz->format = kXMP_UnknownFile; // ! Hack to tell the CheckProc this is not an initial call. handlerInfo = &handlerPos->second; CheckFileFormatProc CheckProc = (CheckFileFormatProc) (handlerInfo->checkProc); foundHandler = CheckProc ( handlerInfo->format, clientPath, thiz->fileRef, thiz ); XMP_Assert ( foundHandler || (thiz->tempPtr == 0) ); if ( foundHandler ) return handlerInfo; } // Failed to find a smart handler. return 0; } // SelectSmartHandler // ================================================================================================= /* class-static */ void XMPFiles::GetVersionInfo ( XMP_VersionInfo * info ) { memset ( info, 0, sizeof(XMP_VersionInfo) ); info->major = XMP_API_VERSION_MAJOR; info->minor = XMP_API_VERSION_MINOR; info->micro = XMP_API_VERSION_MICRO; info->isDebug = kXMPFiles_DebugFlag; info->flags = 0; // ! None defined yet. info->message = kXMPFiles_VersionMessage; } // XMPFiles::GetVersionInfo // ================================================================================================= #if XMP_TraceFilesCalls FILE * xmpFilesLog = stderr; #endif #if UseGlobalLibraryLock & (! XMP_StaticBuild ) XMP_BasicMutex sLibraryLock; // ! Handled in XMPMeta for static builds. #endif /* class static */ bool XMPFiles::Initialize ( XMP_OptionBits options /* = 0 */ ) { ++sXMPFilesInitCount; if ( sXMPFilesInitCount > 1 ) return true; #if XMP_TraceFilesCallsToFile xmpFilesLog = fopen ( "XMPFilesLog.txt", "w" ); if ( xmpFilesLog == 0 ) xmpFilesLog = stderr; #endif #if UseGlobalLibraryLock & (! XMP_StaticBuild ) InitializeBasicMutex ( sLibraryLock ); // ! Handled in XMPMeta for static builds. #endif SXMPMeta::Initialize(); // Just in case the client does not. if ( ! Initialize_LibUtils() ) return false; #if GatherPerformanceData sAPIPerf = new APIPerfCollection; #endif XMP_Uns16 endianInt = 0x00FF; XMP_Uns8 endianByte = *((XMP_Uns8*)&endianInt); if ( kBigEndianHost ) { if ( endianByte != 0 ) XMP_Throw ( "Big endian flag mismatch", kXMPErr_InternalFailure ); } else { if ( endianByte != 0xFF ) XMP_Throw ( "Little endian flag mismatch", kXMPErr_InternalFailure ); } XMP_Assert ( kUTF8_PacketHeaderLen == strlen ( "size(); ++i ) { SummaryInfo& summaryItem = perfSummary [(*sAPIPerf)[i].whichProc]; ++summaryItem.callCount; summaryItem.totalTime += (*sAPIPerf)[i].elapsedTime; } fprintf ( perfLog, "\nSummary data:\n" ); for ( size_t i = 0; i < kAPIPerfProcCount; ++i ) { long averageTime = 0; if ( perfSummary[i].callCount != 0 ) { averageTime = (long) (((perfSummary[i].totalTime/perfSummary[i].callCount) * 1000.0*1000.0) + 0.5); } fprintf ( perfLog, " %s, %d total calls, %d average microseconds per call\n", kAPIPerfNames[i], perfSummary[i].callCount, averageTime ); } fprintf ( perfLog, "\nPer-call data:\n" ); // Report the info for each call. for ( size_t i = 0; i < sAPIPerf->size(); ++i ) { long time = (long) (((*sAPIPerf)[i].elapsedTime * 1000.0*1000.0) + 0.5); fprintf ( perfLog, " %s, %d microSec, ref %.8X, \"%s\"\n", kAPIPerfNames[(*sAPIPerf)[i].whichProc], time, (*sAPIPerf)[i].xmpFilesRef, (*sAPIPerf)[i].extraInfo.c_str() ); } fclose ( perfLog ); } // ReportAReportPerformanceDataPIPerformance #endif // ================================================================================================= /* class static */ void XMPFiles::Terminate() { --sXMPFilesInitCount; if ( sXMPFilesInitCount != 0 ) return; // Not ready to terminate, or already terminated. #if GatherPerformanceData ReportPerformanceData(); EliminateGlobal ( sAPIPerf ); #endif EliminateGlobal ( sFolderHandlers ); EliminateGlobal ( sNormalHandlers ); EliminateGlobal ( sOwningHandlers ); SXMPMeta::Terminate(); // Just in case the client does not. Terminate_LibUtils(); #if UseGlobalLibraryLock & (! XMP_StaticBuild ) TerminateBasicMutex ( sLibraryLock ); // ! Handled in XMPMeta for static builds. #endif #if XMP_TraceFilesCallsToFile if ( xmpFilesLog != stderr ) fclose ( xmpFilesLog ); xmpFilesLog = stderr; #endif } // XMPFiles::Terminate // ================================================================================================= XMPFiles::XMPFiles() : clientRefs(0), format(kXMP_UnknownFile), fileRef(0), openFlags(0), handler(0), tempPtr(0), tempUI32(0), abortProc(0), abortArg(0) { // Nothing more to do, clientRefs is incremented in wrapper. } // XMPFiles::XMPFiles // ================================================================================================= XMPFiles::~XMPFiles() { XMP_Assert ( this->clientRefs <= 0 ); if ( this->handler != 0 ) { delete this->handler; this->handler = 0; } if ( this->fileRef != 0 ) { LFA_Close ( this->fileRef ); this->fileRef = 0; } if ( this->tempPtr != 0 ) free ( this->tempPtr ); // ! Must have been malloc-ed! } // XMPFiles::~XMPFiles // ================================================================================================= /* class static */ bool XMPFiles::GetFormatInfo ( XMP_FileFormat format, XMP_OptionBits * flags /* = 0 */ ) { if ( flags == 0 ) flags = &voidOptionBits; XMPFileHandlerTablePos handlerPos; handlerPos = sFolderHandlers->find ( format ); if ( handlerPos != sFolderHandlers->end() ) { *flags = handlerPos->second.flags; return true; } handlerPos = sNormalHandlers->find ( format ); if ( handlerPos != sNormalHandlers->end() ) { *flags = handlerPos->second.flags; return true; } handlerPos = sOwningHandlers->find ( format ); if ( handlerPos != sOwningHandlers->end() ) { *flags = handlerPos->second.flags; return true; } return false; } // XMPFiles::GetFormatInfo // ================================================================================================= /* class static */ XMP_FileFormat XMPFiles::CheckFileFormat ( XMP_StringPtr filePath ) { if ( (filePath == 0) || (*filePath == 0) ) return kXMP_UnknownFile; XMPFiles bogus; XMPFileHandlerInfo * handlerInfo = SelectSmartHandler ( &bogus, filePath, kXMP_UnknownFile, kXMPFiles_OpenForRead ); if ( handlerInfo == 0 ) return kXMP_UnknownFile; return handlerInfo->format; } // XMPFiles::CheckFileFormat // ================================================================================================= /* class static */ XMP_FileFormat XMPFiles::CheckPackageFormat ( XMP_StringPtr folderPath ) { // This is called with a path to a folder, and checks to see if that folder is the top level of // a "package" that should be recognized by one of the folder-oriented handlers. The checks here // are not overly extensive, but hopefully enough to weed out false positives. // // Since we don't have many folder handlers, this is simple hardwired code. FileMode folderMode = GetFileMode ( folderPath ); if ( folderMode != kFMode_IsFolder ) return kXMP_UnknownFile; return CheckTopFolderName ( std::string ( folderPath ) ); } // XMPFiles::CheckPackageFormat // ================================================================================================= bool XMPFiles::OpenFile ( XMP_StringPtr clientPath, XMP_FileFormat format /* = kXMP_UnknownFile */, XMP_OptionBits openFlags /* = 0 */ ) { if ( this->handler != 0 ) XMP_Throw ( "File already open", kXMPErr_BadParam ); if ( this->fileRef != 0 ) { // ! Sanity check to prevent open file leaks. LFA_Close ( this->fileRef ); this->fileRef = 0; } this->format = kXMP_UnknownFile; // Make sure it is preset for later check. this->openFlags = openFlags; char openMode = 'r'; if ( openFlags & kXMPFiles_OpenForUpdate ) openMode = 'w'; FileMode clientMode = GetFileMode ( clientPath ); if ( (clientMode == kFMode_IsFolder) || (clientMode == kFMode_IsOther) ) return false; XMP_Assert ( (clientMode == kFMode_IsFile) || (clientMode == kFMode_DoesNotExist) ); std::string fileExt; // Used to check for camera raw files and OK to scan files. if ( clientMode == kFMode_IsFile ) { // Find the file extension. OK to be "wrong" for something like "C:\My.dir\file". Any // filtering looks for matches with real extensions, "dir\file" won't match any of these. XMP_StringPtr extPos = clientPath + strlen ( clientPath ); for ( ; (extPos != clientPath) && (*extPos != '.'); --extPos ) {} if ( *extPos == '.' ) { fileExt.assign ( extPos+1 ); MakeLowerCase ( &fileExt ); } // See if this file is one that XMPFiles should never process. for ( size_t i = 0; kKnownRejectedFiles[i] != 0; ++i ) { if ( fileExt == kKnownRejectedFiles[i] ) return false; } } // Find the handler, fill in the XMPFiles member variables, cache the desired file data. XMPFileHandlerInfo * handlerInfo = 0; XMPFileHandlerCTor handlerCTor = 0; XMP_OptionBits handlerFlags = 0; if ( ! (openFlags & kXMPFiles_OpenUsePacketScanning) ) { handlerInfo = SelectSmartHandler ( this, clientPath, format, openFlags ); } if ( handlerInfo == 0 ) { // No smart handler, packet scan if appropriate. if ( clientMode != kFMode_IsFile ) return false; if ( openFlags & kXMPFiles_OpenUseSmartHandler ) return false; if ( openFlags & kXMPFiles_OpenLimitedScanning ) { bool scanningOK = false; for ( size_t i = 0; kKnownScannedFiles[i] != 0; ++i ) { if ( fileExt == kKnownScannedFiles[i] ) { scanningOK = true; break; } } if ( ! scanningOK ) return false; } handlerInfo = &kScannerHandlerInfo; if ( fileRef == 0 ) fileRef = LFA_Open ( clientPath, openMode ); } XMP_Assert ( handlerInfo != 0 ); handlerCTor = handlerInfo->handlerCTor; handlerFlags = handlerInfo->flags; this->filePath = clientPath; XMPFileHandler* handler = (*handlerCTor) ( this ); XMP_Assert ( handlerFlags == handler->handlerFlags ); this->handler = handler; if ( this->format == kXMP_UnknownFile ) this->format = handlerInfo->format; // ! The CheckProc might have set it. try { handler->CacheFileData(); } catch ( ... ) { delete this->handler; this->handler = 0; if ( ! (handlerFlags & kXMPFiles_HandlerOwnsFile) ) { LFA_Close ( this->fileRef ); this->fileRef = 0; } throw; } if ( handler->containsXMP ) FillPacketInfo ( handler->xmpPacket, &handler->packetInfo ); if ( (! (openFlags & kXMPFiles_OpenForUpdate)) && (! (handlerFlags & kXMPFiles_HandlerOwnsFile)) ) { // Close the disk file now if opened for read-only access. LFA_Close ( this->fileRef ); this->fileRef = 0; } return true; } // XMPFiles::OpenFile // ================================================================================================= void XMPFiles::CloseFile ( XMP_OptionBits closeFlags /* = 0 */ ) { if ( this->handler == 0 ) return; // Return if there is no open file (not an error). bool needsUpdate = this->handler->needsUpdate; XMP_OptionBits handlerFlags = this->handler->handlerFlags; // Decide if we're doing a safe update. If so, make sure the handler supports it. All handlers // that don't own the file tolerate safe update using common code below. bool doSafeUpdate = XMP_OptionIsSet ( closeFlags, kXMPFiles_UpdateSafely ); #if GatherPerformanceData if ( doSafeUpdate ) sAPIPerf->back().extraInfo += ", safe update"; // Client wants safe update. #endif if ( ! (this->openFlags & kXMPFiles_OpenForUpdate) ) doSafeUpdate = false; if ( ! needsUpdate ) doSafeUpdate = false; bool safeUpdateOK = ( (handlerFlags & kXMPFiles_AllowsSafeUpdate) || (! (handlerFlags & kXMPFiles_HandlerOwnsFile)) ); if ( doSafeUpdate && (! safeUpdateOK) ) { XMP_Throw ( "XMPFiles::CloseFile - Safe update not supported", kXMPErr_Unavailable ); } // Try really hard to make sure the file is closed and the handler is deleted. LFA_FileRef origFileRef = this->fileRef; // Used during crash-safe saves. std::string origFilePath ( this->filePath ); LFA_FileRef tempFileRef = 0; std::string tempFilePath; LFA_FileRef copyFileRef = 0; std::string copyFilePath; try { if ( (! doSafeUpdate) || (handlerFlags & kXMPFiles_HandlerOwnsFile) ) { // ! Includes no update case. // Close the file without doing common crash-safe writing. The handler might do it. if ( needsUpdate ) { #if GatherPerformanceData sAPIPerf->back().extraInfo += ", direct update"; #endif this->handler->UpdateFile ( doSafeUpdate ); } delete this->handler; this->handler = 0; if ( this->fileRef != 0 ) LFA_Close ( this->fileRef ); this->fileRef = 0; } else { // Update the file in a crash-safe manner. This somewhat convoluted approach preserves // the ownership, permissions, and Mac resources of the final file - at a slightly // higher risk of confusion in the event of a midstream crash. if ( handlerFlags & kXMPFiles_CanRewrite ) { // The handler can rewrite an entire file based on the original. Do this into a temp // file next to the original, with the same ownership and permissions if possible. #if GatherPerformanceData sAPIPerf->back().extraInfo += ", file rewrite"; #endif CreateTempFile ( origFilePath, &tempFilePath, kCopyMacRsrc ); XMP_Assert ( tempFileRef == 0 ); tempFileRef = LFA_Open ( tempFilePath.c_str(), 'w' ); this->fileRef = tempFileRef; tempFileRef = 0; this->filePath = tempFilePath; this->handler->WriteFile ( origFileRef, origFilePath ); } else { // The handler can only update an existing file. Do a little dance so that the final // file is the updated original, thus preserving ownership, permissions, etc. This // does have the risk that the interim copy under the original name has "current" // ownership and permissions. The dance steps: // - Copy the original file to a temp name, the copyFile. // - Rename the original file to a different temp name, the tempFile. // - Rename the copyFile back to the original name. // - Call the handler's UpdateFile method for the tempFile. // A failure inside the handler's UpdateFile method will leave the copied file under // the original name. // *** A user abort might leave the copy file under the original name! Need better // *** duplicate code that handles all parts of a file, and for CreateTempFile to // *** preserve ownership and permissions. Then the original can stay put until // *** the final delete/rename. #if GatherPerformanceData sAPIPerf->back().extraInfo += ", copy update"; #endif CreateTempFile ( origFilePath, ©FilePath, kCopyMacRsrc ); XMP_Assert ( copyFileRef == 0 ); copyFileRef = LFA_Open ( copyFilePath.c_str(), 'w' ); XMP_Int64 fileSize = LFA_Measure ( origFileRef ); LFA_Seek ( origFileRef, 0, SEEK_SET ); LFA_Copy ( origFileRef, copyFileRef, fileSize, this->abortProc, this->abortArg ); LFA_Close ( origFileRef ); LFA_Close ( copyFileRef ); copyFileRef = origFileRef = this->fileRef = 0; CreateTempFile ( origFilePath, &tempFilePath ); LFA_Delete ( tempFilePath.c_str() ); // ! Slight risk of name being grabbed before rename. LFA_Rename ( origFilePath.c_str(), tempFilePath.c_str() ); LFA_Rename ( copyFilePath.c_str(), origFilePath.c_str() ); copyFilePath.clear(); XMP_Assert ( tempFileRef == 0 ); tempFileRef = LFA_Open ( tempFilePath.c_str(), 'w' ); this->fileRef = tempFileRef; tempFileRef = 0; this->filePath = tempFilePath; try { this->handler->UpdateFile ( false ); // We're doing the safe update, not the handler. } catch ( ... ) { this->fileRef = 0; this->filePath = origFilePath; // This is really the copied file. LFA_Close ( tempFileRef ); LFA_Delete ( tempFilePath.c_str() ); tempFileRef = 0; tempFilePath.clear(); throw; } } delete this->handler; this->handler = 0; if ( this->fileRef != 0 ) LFA_Close ( this->fileRef ); if ( origFileRef != 0 ) LFA_Close ( origFileRef ); this->fileRef = 0; origFileRef = 0; tempFileRef = 0; LFA_Delete ( origFilePath.c_str() ); LFA_Rename ( tempFilePath.c_str(), origFilePath.c_str() ); tempFilePath.clear(); } } catch ( ... ) { // *** Don't delete the temp or copy files, not sure which is best. try { if ( this->fileRef != 0 ) LFA_Close ( this->fileRef ); } catch ( ... ) { /* Do nothing, throw the outer exception later. */ } try { if ( origFileRef != 0 ) LFA_Close ( origFileRef ); } catch ( ... ) { /* Do nothing, throw the outer exception later. */ } try { if ( tempFileRef != 0 ) LFA_Close ( tempFileRef ); } catch ( ... ) { /* Do nothing, throw the outer exception later. */ } try { if ( ! tempFilePath.empty() ) LFA_Delete ( tempFilePath.c_str() ); } catch ( ... ) { /* Do nothing, throw the outer exception later. */ } try { if ( copyFileRef != 0 ) LFA_Close ( copyFileRef ); } catch ( ... ) { /* Do nothing, throw the outer exception later. */ } try { if ( ! copyFilePath.empty() ) LFA_Delete ( copyFilePath.c_str() ); } catch ( ... ) { /* Do nothing, throw the outer exception later. */ } try { if ( this->handler != 0 ) delete this->handler; } catch ( ... ) { /* Do nothing, throw the outer exception later. */ } this->handler = 0; this->format = kXMP_UnknownFile; this->fileRef = 0; this->filePath.clear(); this->openFlags = 0; if ( this->tempPtr != 0 ) free ( this->tempPtr ); // ! Must have been malloc-ed! this->tempPtr = 0; this->tempUI32 = 0; throw; } // Clear the XMPFiles member variables. this->handler = 0; this->format = kXMP_UnknownFile; this->fileRef = 0; this->filePath.clear(); this->openFlags = 0; if ( this->tempPtr != 0 ) free ( this->tempPtr ); // ! Must have been malloc-ed! this->tempPtr = 0; this->tempUI32 = 0; } // XMPFiles::CloseFile // ================================================================================================= bool XMPFiles::GetFileInfo ( XMP_StringPtr * filePath /* = 0 */, XMP_StringLen * pathLen /* = 0 */, XMP_OptionBits * openFlags /* = 0 */, XMP_FileFormat * format /* = 0 */, XMP_OptionBits * handlerFlags /* = 0 */ ) const { if ( this->handler == 0 ) return false; XMPFileHandler * handler = this->handler; if ( filePath == 0 ) filePath = &voidStringPtr; if ( pathLen == 0 ) pathLen = &voidStringLen; if ( openFlags == 0 ) openFlags = &voidOptionBits; if ( format == 0 ) format = &voidFileFormat; if ( handlerFlags == 0 ) handlerFlags = &voidOptionBits; *filePath = this->filePath.c_str(); *pathLen = (XMP_StringLen) this->filePath.size(); *openFlags = this->openFlags; *format = this->format; *handlerFlags = this->handler->handlerFlags; return true; } // XMPFiles::GetFileInfo // ================================================================================================= void XMPFiles::SetAbortProc ( XMP_AbortProc abortProc, void * abortArg ) { this->abortProc = abortProc; this->abortArg = abortArg; XMP_Assert ( (abortProc != (XMP_AbortProc)0) || (abortArg != (void*)(unsigned long long)0xDEADBEEFULL) ); // Hack to test the assert callback. } // XMPFiles::SetAbortProc // ================================================================================================= // SetClientPacketInfo // =================== // // Set the packet info returned to the client. This is the internal packet info at first, which // tells what is in the file. But once the file needs update (PutXMP has been called), we return // info about the latest XMP. The internal packet info is left unchanged since it is needed when // the file is updated to locate the old packet in the file. static void SetClientPacketInfo ( XMP_PacketInfo * clientInfo, const XMP_PacketInfo & handlerInfo, const std::string & xmpPacket, bool needsUpdate ) { if ( clientInfo == 0 ) return; if ( ! needsUpdate ) { *clientInfo = handlerInfo; } else { clientInfo->offset = kXMPFiles_UnknownOffset; clientInfo->length = (XMP_Int32) xmpPacket.size(); FillPacketInfo ( xmpPacket, clientInfo ); } } // SetClientPacketInfo // ================================================================================================= bool XMPFiles::GetXMP ( SXMPMeta * xmpObj /* = 0 */, XMP_StringPtr * xmpPacket /* = 0 */, XMP_StringLen * xmpPacketLen /* = 0 */, XMP_PacketInfo * packetInfo /* = 0 */ ) { if ( this->handler == 0 ) XMP_Throw ( "XMPFiles::GetXMP - No open file", kXMPErr_BadObject ); XMP_OptionBits applyTemplateFlags = kXMPTemplate_AddNewProperties | kXMPTemplate_IncludeInternalProperties; if ( ! this->handler->processedXMP ) { try { this->handler->ProcessXMP(); } catch ( ... ) { // Return the outputs then rethrow the exception. if ( xmpObj != 0 ) { // ! Don't use Clone, that replaces the internal ref in the local xmpObj, leaving the client unchanged! xmpObj->Erase(); SXMPUtils::ApplyTemplate ( xmpObj, this->handler->xmpObj, applyTemplateFlags ); } if ( xmpPacket != 0 ) *xmpPacket = this->handler->xmpPacket.c_str(); if ( xmpPacketLen != 0 ) *xmpPacketLen = (XMP_StringLen) this->handler->xmpPacket.size(); SetClientPacketInfo ( packetInfo, this->handler->packetInfo, this->handler->xmpPacket, this->handler->needsUpdate ); throw; } } if ( ! this->handler->containsXMP ) return false; #if 0 // *** See bug 1131815. A better way might be to pass the ref up from here. if ( xmpObj != 0 ) *xmpObj = this->handler->xmpObj.Clone(); #else if ( xmpObj != 0 ) { // ! Don't use Clone, that replaces the internal ref in the local xmpObj, leaving the client unchanged! xmpObj->Erase(); SXMPUtils::ApplyTemplate ( xmpObj, this->handler->xmpObj, applyTemplateFlags ); } #endif if ( xmpPacket != 0 ) *xmpPacket = this->handler->xmpPacket.c_str(); if ( xmpPacketLen != 0 ) *xmpPacketLen = (XMP_StringLen) this->handler->xmpPacket.size(); SetClientPacketInfo ( packetInfo, this->handler->packetInfo, this->handler->xmpPacket, this->handler->needsUpdate ); return true; } // XMPFiles::GetXMP // ================================================================================================= static bool DoPutXMP ( XMPFiles * thiz, const SXMPMeta & xmpObj, const bool doIt ) { // Check some basic conditions to see if the Put should be attempted. if ( thiz->handler == 0 ) XMP_Throw ( "XMPFiles::PutXMP - No open file", kXMPErr_BadObject ); if ( ! (thiz->openFlags & kXMPFiles_OpenForUpdate) ) { XMP_Throw ( "XMPFiles::PutXMP - Not open for update", kXMPErr_BadObject ); } XMPFileHandler * handler = thiz->handler; XMP_OptionBits handlerFlags = handler->handlerFlags; XMP_PacketInfo & packetInfo = handler->packetInfo; std::string & xmpPacket = handler->xmpPacket; if ( ! handler->processedXMP ) handler->ProcessXMP(); // Might have Open/Put with no GetXMP. size_t oldPacketOffset = (size_t)packetInfo.offset; size_t oldPacketLength = packetInfo.length; if ( oldPacketOffset == (size_t)kXMPFiles_UnknownOffset ) oldPacketOffset = 0; // ! Simplify checks. if ( oldPacketLength == (size_t)kXMPFiles_UnknownLength ) oldPacketLength = 0; bool fileHasPacket = (oldPacketOffset != 0) && (oldPacketLength != 0); if ( ! fileHasPacket ) { if ( ! (handlerFlags & kXMPFiles_CanInjectXMP) ) { XMP_Throw ( "XMPFiles::PutXMP - Can't inject XMP", kXMPErr_Unavailable ); } if ( handler->stdCharForm == kXMP_CharUnknown ) { XMP_Throw ( "XMPFiles::PutXMP - No standard character form", kXMPErr_InternalFailure ); } } // Serialize the XMP and update the handler's info. XMP_Uns8 charForm = handler->stdCharForm; if ( charForm == kXMP_CharUnknown ) charForm = packetInfo.charForm; XMP_OptionBits options = handler->GetSerializeOptions() | XMP_CharToSerializeForm ( charForm ); if ( handlerFlags & kXMPFiles_NeedsReadOnlyPacket ) options |= kXMP_ReadOnlyPacket; if ( fileHasPacket && (thiz->format == kXMP_UnknownFile) && (! packetInfo.writeable) ) options |= kXMP_ReadOnlyPacket; bool preferInPlace = ((handlerFlags & kXMPFiles_PrefersInPlace) != 0); bool tryInPlace = (fileHasPacket & preferInPlace) || (! (handlerFlags & kXMPFiles_CanExpand)); if ( handlerFlags & kXMPFiles_UsesSidecarXMP ) tryInPlace = false; if ( tryInPlace ) { try { xmpObj.SerializeToBuffer ( &xmpPacket, (options | kXMP_ExactPacketLength), (XMP_StringLen) oldPacketLength ); XMP_Assert ( xmpPacket.size() == oldPacketLength ); } catch ( ... ) { if ( preferInPlace ) { tryInPlace = false; // ! Try again, out of place this time. } else { if ( ! doIt ) return false; throw; } } } if ( ! tryInPlace ) { try { xmpObj.SerializeToBuffer ( &xmpPacket, options ); } catch ( ... ) { if ( ! doIt ) return false; throw; } } if ( doIt ) { handler->xmpObj = xmpObj.Clone(); handler->containsXMP = true; handler->processedXMP = true; handler->needsUpdate = true; } return true; } // DoPutXMP // ================================================================================================= void XMPFiles::PutXMP ( const SXMPMeta & xmpObj ) { (void) DoPutXMP ( this, xmpObj, true ); } // XMPFiles::PutXMP // ================================================================================================= void XMPFiles::PutXMP ( XMP_StringPtr xmpPacket, XMP_StringLen xmpPacketLen /* = kXMP_UseNullTermination */ ) { SXMPMeta xmpObj ( xmpPacket, xmpPacketLen ); this->PutXMP ( xmpObj ); } // XMPFiles::PutXMP // ================================================================================================= bool XMPFiles::CanPutXMP ( const SXMPMeta & xmpObj ) { if ( this->handler == 0 ) XMP_Throw ( "XMPFiles::CanPutXMP - No open file", kXMPErr_BadObject ); if ( ! (this->openFlags & kXMPFiles_OpenForUpdate) ) return false; if ( this->handler->handlerFlags & kXMPFiles_CanInjectXMP ) return true; if ( ! this->handler->containsXMP ) return false; if ( this->handler->handlerFlags & kXMPFiles_CanExpand ) return true; return DoPutXMP ( this, xmpObj, false ); } // XMPFiles::CanPutXMP // ================================================================================================= bool XMPFiles::CanPutXMP ( XMP_StringPtr xmpPacket, XMP_StringLen xmpPacketLen /* = kXMP_UseNullTermination */ ) { SXMPMeta xmpObj ( xmpPacket, xmpPacketLen ); return this->CanPutXMP ( xmpObj ); } // XMPFiles::CanPutXMP // ================================================================================================= exempi-2.2.1/source/XMPFiles/XMPFiles_Impl.cpp0000664000175000017500000006510312150230673015775 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMPFiles_Impl.hpp" #include "UnicodeConversions.hpp" using namespace std; // Internal code should be using #if with XMP_MacBuild, XMP_WinBuild, or XMP_UNIXBuild. // This is a sanity check in case of accidental use of *_ENV. Some clients use the poor // practice of defining the *_ENV macro with an empty value. #if defined ( MAC_ENV ) #if ! MAC_ENV #error "MAC_ENV must be defined so that \"#if MAC_ENV\" is true" #endif #elif defined ( WIN_ENV ) #if ! WIN_ENV #error "WIN_ENV must be defined so that \"#if WIN_ENV\" is true" #endif #elif defined ( UNIX_ENV ) #if ! UNIX_ENV #error "UNIX_ENV must be defined so that \"#if UNIX_ENV\" is true" #endif #endif // ================================================================================================= /// \file XMPFiles_Impl.cpp /// \brief ... /// /// This file ... /// // ================================================================================================= #if XMP_WinBuild #pragma warning ( disable : 4290 ) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow) #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #endif bool ignoreLocalText = false; XMP_FileFormat voidFileFormat = 0; // Used as sink for unwanted output parameters. // ================================================================================================= // Add all known mappings, multiple mappings (tif, tiff) are OK. const FileExtMapping kFileExtMap[] = { { "pdf", kXMP_PDFFile }, { "ps", kXMP_PostScriptFile }, { "eps", kXMP_EPSFile }, { "jpg", kXMP_JPEGFile }, { "jpeg", kXMP_JPEGFile }, { "jpx", kXMP_JPEG2KFile }, { "tif", kXMP_TIFFFile }, { "tiff", kXMP_TIFFFile }, { "dng", kXMP_TIFFFile }, // DNG files are well behaved TIFF. { "gif", kXMP_GIFFile }, { "giff", kXMP_GIFFile }, { "png", kXMP_PNGFile }, { "swf", kXMP_SWFFile }, { "flv", kXMP_FLVFile }, { "aif", kXMP_AIFFFile }, { "mov", kXMP_MOVFile }, { "avi", kXMP_AVIFile }, { "cin", kXMP_CINFile }, { "wav", kXMP_WAVFile }, { "mp3", kXMP_MP3File }, { "mp4", kXMP_MPEG4File }, { "m4v", kXMP_MPEG4File }, { "m4a", kXMP_MPEG4File }, { "f4v", kXMP_MPEG4File }, { "ses", kXMP_SESFile }, { "cel", kXMP_CELFile }, { "wma", kXMP_WMAVFile }, { "wmv", kXMP_WMAVFile }, { "mpg", kXMP_MPEGFile }, { "mpeg", kXMP_MPEGFile }, { "mp2", kXMP_MPEGFile }, { "mod", kXMP_MPEGFile }, { "m2v", kXMP_MPEGFile }, { "mpa", kXMP_MPEGFile }, { "mpv", kXMP_MPEGFile }, { "m2p", kXMP_MPEGFile }, { "m2a", kXMP_MPEGFile }, { "m2t", kXMP_MPEGFile }, { "mpe", kXMP_MPEGFile }, { "vob", kXMP_MPEGFile }, { "ms-pvr", kXMP_MPEGFile }, { "dvr-ms", kXMP_MPEGFile }, { "html", kXMP_HTMLFile }, { "xml", kXMP_XMLFile }, { "txt", kXMP_TextFile }, { "text", kXMP_TextFile }, { "psd", kXMP_PhotoshopFile }, { "ai", kXMP_IllustratorFile }, { "indd", kXMP_InDesignFile }, { "indt", kXMP_InDesignFile }, { "aep", kXMP_AEProjectFile }, { "aepx", kXMP_AEProjectFile }, { "aet", kXMP_AEProjTemplateFile }, { "ffx", kXMP_AEFilterPresetFile }, { "ncor", kXMP_EncoreProjectFile }, { "prproj", kXMP_PremiereProjectFile }, { "prtl", kXMP_PremiereTitleFile }, { "ucf", kXMP_UCFFile }, { "xfl", kXMP_UCFFile }, { "pdfxml", kXMP_UCFFile }, { "mars", kXMP_UCFFile }, { "idml", kXMP_UCFFile }, { "idap", kXMP_UCFFile }, { "icap", kXMP_UCFFile }, { "", 0 } }; // ! Must be last as a sentinel. // Files known to contain XMP but have no smart handling, here or elsewhere. const char * kKnownScannedFiles[] = { "ai", // Illustrator, actually a PDF file. "ait", // Illustrator template, actually a PDF file. "svg", // SVG, an XML file. "aet", // After Effects template project file. "ffx", // After Effects filter preset file. "aep", // After Effects project file in proprietary format "aepx", // After Effects project file in XML format "inx", // InDesign interchange, an XML file. "inds", // InDesign snippet, an XML file. "inpk", // InDesign package for GoLive, a text file (not XML). "incd", // InCopy story, an XML file. "inct", // InCopy template, an XML file. "incx", // InCopy interchange, an XML file. "fm", // FrameMaker file, proprietary format. "book", // FrameMaker book, proprietary format. "icml", // an inCopy (inDesign) format "icmt", // an inCopy (inDesign) format "idms", // an inCopy (inDesign) format 0 }; // ! Keep a 0 sentinel at the end. // Extensions that XMPFiles never handles. const char * kKnownRejectedFiles[] = { // RAW files "cr2", "erf", "fff", "dcr", "kdc", "mos", "mfw", "mef", "raw", "nef", "orf", "pef", "arw", "sr2", "srf", "sti", "3fr", "rwl", "crw", "sraw", "mos", "mrw", "nrw", "rw2", "c3f", // UCF subformats "air", // Others "r3d", 0 }; // ! Keep a 0 sentinel at the end. // ================================================================================================= // ================================================================================================= void LFA_Throw ( const char* msg, int id ) { switch ( id ) { case kLFAErr_InternalFailure: XMP_Throw ( msg, kXMPErr_InternalFailure ); case kLFAErr_ExternalFailure: XMP_Throw ( msg, kXMPErr_ExternalFailure ); case kLFAErr_UserAbort: XMP_Throw ( msg, kXMPErr_UserAbort ); default: XMP_Throw ( msg, kXMPErr_UnknownException ); } } // ================================================================================================= #if XMP_MacBuild | XMP_UNIXBuild //copy from LargeFileAccess.cpp static bool FileExists ( const char * filePath ) { struct stat info; int err = stat ( filePath, &info ); return (err == 0); } #endif // ================================================================================================= static bool CreateNewFile ( const char * newPath, const char * origPath, size_t filePos, bool copyMacRsrc ) { // Try to create a new file with the same ownership and permissions as some other file. // *** The ownership and permissions are not handled on all platforms. #if XMP_MacBuild | XMP_UNIXBuild if ( FileExists ( newPath ) ) return false; #elif XMP_WinBuild { std::string wideName; const size_t utf8Len = strlen(newPath); const size_t maxLen = 2 * (utf8Len+1); wideName.reserve ( maxLen ); wideName.assign ( maxLen, ' ' ); int wideLen = MultiByteToWideChar ( CP_UTF8, 0, newPath, -1, (LPWSTR)wideName.data(), (int)maxLen ); if ( wideLen == 0 ) return false; HANDLE temp = CreateFileW ( (LPCWSTR)wideName.data(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS), 0 ); if ( temp != INVALID_HANDLE_VALUE ) { CloseHandle ( temp ); return false; } } #endif try { LFA_FileRef newFile = LFA_Create ( newPath ); LFA_Close ( newFile ); } catch ( ... ) { // *** Unfortunate that LFA_Create throws for an existing file. return false; } #if XMP_WinBuild IgnoreParam(origPath); IgnoreParam(filePos); IgnoreParam(copyMacRsrc); // *** Don't handle Windows specific info yet. #elif 0 // This Mac-specific code is no longer used, but retained to make merges easier IgnoreParam(filePos); OSStatus err; FSRef newFSRef, origFSRef; // Copy the "copyable" catalog info, includes the Finder info. err = FSPathMakeRef ( (XMP_Uns8*)origPath, &origFSRef, 0 ); if ( err != noErr ) XMP_Throw ( "CreateNewFile: FSPathMakeRef failure", kXMPErr_ExternalFailure ); err = FSPathMakeRef ( (XMP_Uns8*)newPath, &newFSRef, 0 ); if ( err != noErr ) XMP_Throw ( "CreateNewFile: FSPathMakeRef failure", kXMPErr_ExternalFailure ); FSCatalogInfo catInfo; // *** What about the GetInfo comment? The Finder label? memset ( &catInfo, 0, sizeof(FSCatalogInfo) ); err = FSGetCatalogInfo ( &origFSRef, kFSCatInfoGettableInfo, &catInfo, 0, 0, 0 ); if ( err != noErr ) XMP_Throw ( "CreateNewFile: FSGetCatalogInfo failure", kXMPErr_ExternalFailure ); err = FSSetCatalogInfo ( &newFSRef, kFSCatInfoSettableInfo, &catInfo ); // *** [1841019] tolerate non mac filesystems, i.e. SMB mounts // this measure helps under 10.5, albeit not reliably under 10.4 if ( err == afpAccessDenied ) copyMacRsrc = false; else if ( err != noErr ) // all other errors are still an error XMP_Throw ( "CreateNewFile: FSSetCatalogInfo failure", kXMPErr_ExternalFailure ); // *** [1841019] tolerate non mac filesystems, i.e. SMB mounts // this measure helps under 10.4 (and besides might be an optimization) if ( catInfo.rsrcLogicalSize == 0 ) copyMacRsrc = false; if ( copyMacRsrc ) { // Copy the resource fork as a byte stream. LFA_FileRef origRsrcRef = 0; LFA_FileRef copyRsrcRef = 0; try { origRsrcRef = LFA_OpenRsrc ( origPath, 'r' ); XMP_Int64 rsrcSize = LFA_Measure ( origRsrcRef ); if ( rsrcSize > 0 ) { copyRsrcRef = LFA_OpenRsrc ( newPath, 'w' ); LFA_Copy ( origRsrcRef, copyRsrcRef, rsrcSize, 0, 0 ); // ! Resource fork small enough to not need abort checking. LFA_Close ( copyRsrcRef ); } LFA_Close ( origRsrcRef ); } catch ( ... ) { if ( origRsrcRef != 0 ) LFA_Close ( origRsrcRef ); if ( copyRsrcRef != 0 ) LFA_Close ( copyRsrcRef ); throw; } } #elif XMP_UNIXBuild | XMP_MacBuild IgnoreParam(filePos); #if XMP_UNIXBuild IgnoreParam(copyMacRsrc); #endif // *** Don't handle UNIX specific info yet. int err, newRef; struct stat origInfo; err = stat ( origPath, &origInfo ); if ( err != 0 ) XMP_Throw ( "CreateNewFile: stat failure", kXMPErr_ExternalFailure ); (void) chmod ( newPath, origInfo.st_mode ); // Ignore errors. #if XMP_MacBuild if ( copyMacRsrc ) { // Copy the resource fork as a byte stream LFA_FileRef origRsrcRef = 0; LFA_FileRef copyRsrcRef = 0; try { origRsrcRef = LFA_OpenRsrc ( origPath, 'r' ); XMP_Int64 rsrcSize = LFA_Measure ( origRsrcRef ); if ( rsrcSize > 0 ) { copyRsrcRef = LFA_OpenRsrc ( newPath, 'w' ); // ! Resource fork small enough to not need abort checking. LFA_Copy ( origRsrcRef, copyRsrcRef, rsrcSize, 0, 0 ); LFA_Close ( copyRsrcRef ); } LFA_Close ( origRsrcRef ); } catch ( ... ) { if ( origRsrcRef != 0 ) LFA_Close ( origRsrcRef ); if ( copyRsrcRef != 0 ) LFA_Close ( copyRsrcRef ); throw; } } #endif #endif return true; } // CreateNewFile // ================================================================================================= void CreateTempFile ( const std::string & origPath, std::string * tempPath, bool copyMacRsrc ) { // Create an empty temp file next to the source file with the same ownership and permissions. // The temp file has "._nn_" added as a prefix to the file name, where "nn" is a unique // sequence number. The "._" start is important for Bridge, telling it to ignore the file. // *** The ownership and permissions are not yet handled. #if XMP_WinBuild #define kUseBS true #else #define kUseBS false #endif // Break the full path into folder path and file name portions. size_t namePos; // The origPath index of the first byte of the file name part. for ( namePos = origPath.size(); namePos > 0; --namePos ) { if ( (origPath[namePos] == '/') || (kUseBS && (origPath[namePos] == '\\')) ) { ++namePos; break; } } if ( (origPath[namePos] == '/') || (kUseBS && (origPath[namePos] == '\\')) ) ++namePos; if ( namePos == origPath.size() ) XMP_Throw ( "CreateTempFile: Empty file name part", kXMPErr_InternalFailure ); std::string folderPath ( origPath, 0, namePos ); std::string origName ( origPath, namePos ); // First try to create a file with "._nn_" added as a file name prefix. char tempPrefix[6] = "._nn_"; tempPath->reserve ( origPath.size() + 5 ); tempPath->assign ( origPath, 0, namePos ); tempPath->append ( tempPrefix, 5 ); tempPath->append ( origName ); for ( char n1 = '0'; n1 <= '9'; ++n1 ) { (*tempPath)[namePos+2] = n1; for ( char n2 = '0'; n2 <= '9'; ++n2 ) { (*tempPath)[namePos+3] = n2; if ( CreateNewFile ( tempPath->c_str(), origPath.c_str(), namePos, copyMacRsrc ) ) return; } } // Now try to create a file with the name "._nn_XMPFilesTemp" tempPath->assign ( origPath, 0, namePos ); tempPath->append ( tempPrefix, 5 ); tempPath->append ( "XMPFilesTemp" ); for ( char n1 = '0'; n1 <= '9'; ++n1 ) { (*tempPath)[namePos+2] = n1; for ( char n2 = '0'; n2 <= '9'; ++n2 ) { (*tempPath)[namePos+3] = n2; if ( CreateNewFile ( tempPath->c_str(), origPath.c_str(), namePos, copyMacRsrc ) ) return; } } XMP_Throw ( "CreateTempFile: Can't find unique name", kXMPErr_InternalFailure ); } // CreateTempFile // ================================================================================================= // File mode and folder info utilities // ----------------------------------- #if XMP_WinBuild // --------------------------------------------------------------------------------------------- static DWORD kOtherAttrs = (FILE_ATTRIBUTE_DEVICE | FILE_ATTRIBUTE_OFFLINE); FileMode GetFileMode ( const char * path ) { std::string utf16; // GetFileAttributes wants native UTF-16. ToUTF16Native ( (UTF8Unit*)path, strlen(path), &utf16 ); utf16.append ( 2, '\0' ); // Make sure there are at least 2 final zero bytes. // ! A shortcut is seen as a file, we would need extra code to recognize it and find the target. DWORD fileAttrs = GetFileAttributesW ( (LPCWSTR) utf16.c_str() ); if ( fileAttrs == INVALID_FILE_ATTRIBUTES ) return kFMode_DoesNotExist; // ! Any failure turns into does-not-exist. if ( fileAttrs & FILE_ATTRIBUTE_DIRECTORY ) return kFMode_IsFolder; if ( fileAttrs & kOtherAttrs ) return kFMode_IsOther; return kFMode_IsFile; } // GetFileMode // --------------------------------------------------------------------------------------------- void XMP_FolderInfo::Open ( const char * folderPath ) { if ( this->dirRef != 0 ) this->Close(); this->folderPath = folderPath; } // XMP_FolderInfo::Open // --------------------------------------------------------------------------------------------- void XMP_FolderInfo::Close() { if ( this->dirRef != 0 ) (void) FindClose ( this->dirRef ); this->dirRef = 0; this->folderPath.erase(); } // XMP_FolderInfo::Close // --------------------------------------------------------------------------------------------- bool XMP_FolderInfo::GetFolderPath ( std::string * folderPath ) { if ( this->folderPath.empty() ) return false; *folderPath = this->folderPath; return true; } // XMP_FolderInfo::GetFolderPath // --------------------------------------------------------------------------------------------- bool XMP_FolderInfo::GetNextChild ( std::string * childName ) { bool found = false; WIN32_FIND_DATAW childInfo; if ( this->dirRef != 0 ) { found = FindNextFile ( this->dirRef, &childInfo ); if ( ! found ) return false; } else { if ( this->folderPath.empty() ) { XMP_Throw ( "XMP_FolderInfo::GetNextChild - not open", kXMPErr_InternalFailure ); } std::string findPath = this->folderPath; findPath += "\\*"; std::string utf16; // FindFirstFile wants native UTF-16. ToUTF16Native ( (UTF8Unit*)findPath.c_str(), findPath.size(), &utf16 ); utf16.append ( 2, '\0' ); // Make sure there are at least 2 final zero bytes. this->dirRef = FindFirstFileW ( (LPCWSTR) utf16.c_str(), &childInfo ); if ( this->dirRef == 0 ) return false; found = true; } // Ignore all children with names starting in '.'. This covers ., .., .DS_Store, etc. while ( found && (childInfo.cFileName[0] == '.') ) { found = FindNextFile ( this->dirRef, &childInfo ); } if ( ! found ) return false; size_t len16 = 0; while ( childInfo.cFileName[len16] != 0 ) ++len16; FromUTF16Native ( (UTF16Unit*)childInfo.cFileName, len16, childName ); // The cFileName field is native UTF-16. return true; } // XMP_FolderInfo::GetNextChild // --------------------------------------------------------------------------------------------- #else // Mac and UNIX both use POSIX functions. // --------------------------------------------------------------------------------------------- FileMode GetFileMode ( const char * path ) { struct stat fileInfo; int err = stat ( path, &fileInfo ); if ( err != 0 ) return kFMode_DoesNotExist; // ! Any failure turns into does-not-exist. // ! The target of a symlink is properly recognized, not the symlink itself. A Mac alias is // ! seen as a file, we would need extra code to recognize it and find the target. if ( S_ISREG ( fileInfo.st_mode ) ) return kFMode_IsFile; if ( S_ISDIR ( fileInfo.st_mode ) ) return kFMode_IsFolder; return kFMode_IsOther; } // GetFileMode // --------------------------------------------------------------------------------------------- void XMP_FolderInfo::Open ( const char * folderPath ) { if ( this->dirRef != 0 ) this->Close(); this->dirRef = opendir ( folderPath ); if ( this->dirRef == 0 ) XMP_Throw ( "XMP_FolderInfo::Open - opendir failed", kXMPErr_ExternalFailure ); this->folderPath = folderPath; } // XMP_FolderInfo::Open // --------------------------------------------------------------------------------------------- void XMP_FolderInfo::Close() { if ( this->dirRef != 0 ) (void) closedir ( this->dirRef ); this->dirRef = 0; this->folderPath.erase(); } // XMP_FolderInfo::Close // --------------------------------------------------------------------------------------------- bool XMP_FolderInfo::GetFolderPath ( std::string * folderPath ) { if ( this->folderPath.empty() ) return false; *folderPath = this->folderPath; return true; } // XMP_FolderInfo::GetFolderPath // --------------------------------------------------------------------------------------------- bool XMP_FolderInfo::GetNextChild ( std::string * childName ) { struct dirent * childInfo = 0; if ( this->dirRef == 0 ) XMP_Throw ( "XMP_FolderInfo::GetNextChild - not open", kXMPErr_InternalFailure ); while ( true ) { // Ignore all children with names starting in '.'. This covers ., .., .DS_Store, etc. childInfo = readdir ( this->dirRef ); // ! Depends on global lock, readdir is not thread safe. if ( childInfo == 0 ) return false; if ( *childInfo->d_name != '.' ) break; } *childName = childInfo->d_name; return true; } // XMP_FolderInfo::GetNextChild // --------------------------------------------------------------------------------------------- #endif // ================================================================================================= // GetPacketCharForm // ================= // // The first character must be U+FEFF or ASCII, typically '<' for an outermost element, initial // processing instruction, or XML declaration. The second character can't be U+0000. // The possible input sequences are: // Cases with U+FEFF // EF BB BF -- - UTF-8 // FE FF -- -- - Big endian UTF-16 // 00 00 FE FF - Big endian UTF 32 // FF FE 00 00 - Little endian UTF-32 // FF FE -- -- - Little endian UTF-16 // Cases with ASCII // nn mm -- -- - UTF-8 - // 00 00 00 nn - Big endian UTF-32 // 00 nn -- -- - Big endian UTF-16 // nn 00 00 00 - Little endian UTF-32 // nn 00 -- -- - Little endian UTF-16 static XMP_Uns8 GetPacketCharForm ( XMP_StringPtr packetStr, XMP_StringLen packetLen ) { XMP_Uns8 charForm = kXMP_CharUnknown; XMP_Uns8 * unsBytes = (XMP_Uns8*)packetStr; // ! Make sure comparisons are unsigned. if ( packetLen < 2 ) return kXMP_Char8Bit; if ( packetLen < 4 ) { // These cases are based on the first 2 bytes: // 00 nn Big endian UTF-16 // nn 00 Little endian UTF-16 // FE FF Big endian UTF-16 // FF FE Little endian UTF-16 // Otherwise UTF-8 if ( packetStr[0] == 0 ) return kXMP_Char16BitBig; if ( packetStr[1] == 0 ) return kXMP_Char16BitLittle; if ( CheckBytes ( packetStr, "\xFE\xFF", 2 ) ) return kXMP_Char16BitBig; if ( CheckBytes ( packetStr, "\xFF\xFE", 2 ) ) return kXMP_Char16BitLittle; return kXMP_Char8Bit; } // If we get here the packet is at least 4 bytes, could be any form. if ( unsBytes[0] == 0 ) { // These cases are: // 00 nn -- -- - Big endian UTF-16 // 00 00 00 nn - Big endian UTF-32 // 00 00 FE FF - Big endian UTF 32 if ( unsBytes[1] != 0 ) { charForm = kXMP_Char16BitBig; // 00 nn } else { if ( (unsBytes[2] == 0) && (unsBytes[3] != 0) ) { charForm = kXMP_Char32BitBig; // 00 00 00 nn } else if ( (unsBytes[2] == 0xFE) && (unsBytes[3] == 0xFF) ) { charForm = kXMP_Char32BitBig; // 00 00 FE FF } } } else { // These cases are: // FE FF -- -- - Big endian UTF-16, FE isn't valid UTF-8 // FF FE 00 00 - Little endian UTF-32, FF isn't valid UTF-8 // FF FE -- -- - Little endian UTF-16 // nn mm -- -- - UTF-8, includes EF BB BF case // nn 00 00 00 - Little endian UTF-32 // nn 00 -- -- - Little endian UTF-16 if ( unsBytes[0] == 0xFE ) { if ( unsBytes[1] == 0xFF ) charForm = kXMP_Char16BitBig; // FE FF } else if ( unsBytes[0] == 0xFF ) { if ( unsBytes[1] == 0xFE ) { if ( (unsBytes[2] == 0) && (unsBytes[3] == 0) ) { charForm = kXMP_Char32BitLittle; // FF FE 00 00 } else { charForm = kXMP_Char16BitLittle; // FF FE } } } else if ( unsBytes[1] != 0 ) { charForm = kXMP_Char8Bit; // nn mm } else { if ( (unsBytes[2] == 0) && (unsBytes[3] == 0) ) { charForm = kXMP_Char32BitLittle; // nn 00 00 00 } else { charForm = kXMP_Char16BitLittle; // nn 00 } } } // XMP_Assert ( charForm != kXMP_CharUnknown ); return charForm; } // GetPacketCharForm // ================================================================================================= // FillPacketInfo // ============== // // If a packet wrapper is present, the the packet string is roughly: // // // ... more XML ... // // ... whitespace padding ... // // The 8-bit form is 14 bytes, the 16-bit form is 28 bytes, the 32-bit form is 56 bytes. #define k8BitTrailer "charForm = GetPacketCharForm ( packetStr, packetLen ); XMP_StringLen charSize = XMP_GetCharSize ( info->charForm ); // Look for a packet wrapper. For our purposes, we can be lazy and just look for the trailer PI. // If that is present we'll assume that a recognizable header is present. First do a bytewise // search for '<', then a char sized comparison for the start of the trailer. We don't really // care about big or little endian here. We're looking for ASCII bytes with zeroes between. // Shorten the range comparisons (n*charSize) by 1 to easily tolerate both big and little endian. XMP_StringLen padStart, padEnd; XMP_StringPtr packetTrailer = kPacketTrailiers [ charSize>>1 ]; padEnd = packetLen - 1; for ( ; padEnd > 0; --padEnd ) if ( packetStr[padEnd] == '<' ) break; if ( (packetStr[padEnd] != '<') || ((packetLen - padEnd) < (18*charSize)) ) return; if ( ! CheckBytes ( &packetStr[padEnd], packetTrailer, (13*charSize) ) ) return; info->hasWrapper = true; char rwFlag = packetStr [padEnd + 15*charSize]; if ( rwFlag == 'w' ) info->writeable = true; // Look for the start of the padding, right after the last XML end tag. padStart = padEnd; // Don't do the -charSize here, might wrap below zero. for ( ; padStart >= charSize; padStart -= charSize ) if ( packetStr[padStart] == '>' ) break; if ( padStart < charSize ) return; padStart += charSize; // The padding starts after the '>'. info->padSize = padEnd - padStart; // We want bytes of padding, not character units. } // FillPacketInfo // ================================================================================================= // ReadXMPPacket // ============= void ReadXMPPacket ( XMPFileHandler * handler ) { LFA_FileRef fileRef = handler->parent->fileRef; std::string & xmpPacket = handler->xmpPacket; XMP_StringLen packetLen = handler->packetInfo.length; if ( packetLen == 0 ) XMP_Throw ( "ReadXMPPacket - No XMP packet", kXMPErr_BadXMP ); xmpPacket.erase(); xmpPacket.reserve ( packetLen ); xmpPacket.append ( packetLen, ' ' ); XMP_StringPtr packetStr = XMP_StringPtr ( xmpPacket.c_str() ); // Don't set until after reserving the space! LFA_Seek ( fileRef, handler->packetInfo.offset, SEEK_SET ); LFA_Read ( fileRef, (char*)packetStr, packetLen, kLFA_RequireAll ); } // ReadXMPPacket // ================================================================================================= // XMPFileHandler::ProcessXMP // ========================== // // This base implementation just parses the XMP. If the derived handler does reconciliation then it // must have its own implementation of ProcessXMP. void XMPFileHandler::ProcessXMP() { if ( (!this->containsXMP) || this->processedXMP ) return; if ( this->handlerFlags & kXMPFiles_CanReconcile ) { XMP_Throw ( "Reconciling file handlers must implement ProcessXMP", kXMPErr_InternalFailure ); } SXMPUtils::RemoveProperties ( &this->xmpObj, 0, 0, kXMPUtil_DoAllProperties ); this->xmpObj.ParseFromBuffer ( this->xmpPacket.c_str(), (XMP_StringLen)this->xmpPacket.size() ); this->processedXMP = true; } // XMPFileHandler::ProcessXMP // ================================================================================================= // XMPFileHandler::GetSerializeOptions // =================================== // // This base implementation just selects compact serialization. The character form and padding/in-place // settings are added in the common code before calling SerializeToBuffer. XMP_OptionBits XMPFileHandler::GetSerializeOptions() { return kXMP_UseCompactFormat; } // XMPFileHandler::GetSerializeOptions // ================================================================================================= exempi-2.2.1/source/XMPFiles/Makefile.in0000664000175000017500000006015212150231002014710 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = source/XMPFiles DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libXMPFiles_la_DEPENDENCIES = ./FileHandlers/libxmpfilehandlers.la \ ./FormatSupport/libformatsupport.la am_libXMPFiles_la_OBJECTS = WXMPFiles.lo XMPFiles.lo XMPFiles_Impl.lo libXMPFiles_la_OBJECTS = $(am_libXMPFiles_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libXMPFiles_la_SOURCES) DIST_SOURCES = $(libXMPFiles_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = FileHandlers FormatSupport noinst_LTLIBRARIES = libXMPFiles.la INCLUDES = -I$(top_srcdir)/public/include \ -I$(top_srcdir)/public/include/client-glue \ -I$(top_srcdir)/build/ \ -I$(srcdir)/FormatSupport \ -I$(srcdir)/../common/ \ -I$(top_srcdir)/third-party/MD5 AM_CXXFLAGS = -Wno-multichar -Wno-ctor-dtor-privacy \ -funsigned-char -fexceptions -fno-strict-aliasing AM_CPPFLAGS = -Wall\ -D@EXEMPI_PLATFORM_DEF@=1 -DXMP_IMPL=1 -DXMP_ClientBuild=0 \ -D_FILE_OFFSET_BITS=64 -DHAVE_EXPAT_CONFIG_H=1 -DXML_STATIC=1 \ -DDISABLE_QUICKTIME noinst_HEADERS = XMPFiles.hpp XMPFiles_Impl.hpp libXMPFiles_la_SOURCES = WXMPFiles.cpp XMPFiles.cpp \ XMPFiles_Impl.cpp libXMPFiles_la_LIBADD = ./FileHandlers/libxmpfilehandlers.la \ ./FormatSupport/libformatsupport.la all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign source/XMPFiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign source/XMPFiles/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libXMPFiles.la: $(libXMPFiles_la_OBJECTS) $(libXMPFiles_la_DEPENDENCIES) $(EXTRA_libXMPFiles_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(libXMPFiles_la_OBJECTS) $(libXMPFiles_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WXMPFiles.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPFiles.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPFiles_Impl.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist cscopelist-recursive ctags \ ctags-recursive distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am #libXMPFiles_la_LDFLAGS = -version-info @LIBXMPCORE_VERSION_INFO@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/source/XMPFiles/XMPFiles.hpp0000664000175000017500000002407512150230673015024 00000000000000#ifndef __XMPFiles_hpp__ #define __XMPFiles_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include #define TXMP_STRING_TYPE std::string #include "XMP.hpp" #if ! (UNIX_ENV | MAC_ENV) typedef void * LFA_FileRef; #else typedef XMP_Int32 LFA_FileRef; #endif class XMPFileHandler; // ================================================================================================= /// \file XMPFiles.hpp /// \brief High level support to access metadata in files of interest to Adobe applications. /// /// This header ... /// // ================================================================================================= // ================================================================================================= // *** Usage Notes (eventually to become Doxygen comments) *** // =========================================================== // // This is the main part of the internal (DLL side) implementation of XMPFiles. Other parts are // the entry point wrappers and the file format handlers. The XMPFiles class distills the client // API from TXMPFiles.hpp, removing convenience overloads and substituting a pointer/length pair // for output strings. // // The wrapper functions provide a stable binary interface and perform minor impedance correction // between the client template API from TDocMeta.hpp and the DLL's XMPFiles class. The details of // the wrappers should be considered private. // // File handlers are registered during DLL initialization with hard coded calls in Init_XMPFiles. // Each file handler provides 2 standalone functions, CheckFormatProc and DocMetaHandlerCTor, plus a // class derived from DocMetaHandler. The format and capability flags are passed when registering. // This allows the same physical handler to be registered for multiple formats. // // ------------------------------------------------------------------------------------------------- // // Basic outlines of the processing by the XMPFiles methods: // // Constructor: // - Minimal work to create an empty XMPFiles object, set the ref count to 1. // // Destructor: // - Decrement the ref count, return if greater than zero. // - Call LFA_Close if necessary. // // UnlockLib & UnlockObj: // - Release the thread lock. Same for now, no per-object lock. // // GetFormatInfo: // - Return the flags for the registered handler. // // OpenFile: // - The physical file is opened via LFA_OpenFile. // - A handler is selected by calling the registered format checkers. // - The handler object is created by calling the registered constructor proc. // // CloseFile: // - Return if there is no open file (not an error). // - If not a crash-safe update (includes read-only or no update), or the handler owns the file: // - Throw an exception if the handler owns the file but does not support safe update. // - If the file needs updating, call the handler's UpdateFile method. // - else: // - If the handler supports file rewrite: // - *** This might not preserve ownership and permissions. // - Create an empty temp file. // - Call the handler's WriteFile method, writing to the temp file. // - else // - *** This preserves ownership, permissions, and Mac resources. // - Copy the original file to a temp name (Mac data fork only). // - Rename the original file to a different temp name. // - Rename the copy file back to the original name. // - Call the handler's UpdateFile method for the "original as temp" file. // - Close both the original and temp files. // - Delete the file with the original name. // - Rename the temp file to the original name. // - Delete the handler object. // - Call LFA_Close if necessary. // // GetFileInfo: // - Return the file info from the XMPFiles member variables. // // GetXMP: // - Throw an exception if there is no open file. // - Call the handler's GetXMP method. // // PutXMP: // - Throw an exception if there is no open file. // - Call the handler's PutXMP method. // // CanPutXMP: // - Implement roughly as shown in TXMPFiles.hpp, there is no handler CanPutXMP method. // // ------------------------------------------------------------------------------------------------- // // The format checker should do nothing but the minimal work to identify the overall file format. // In particular it should not look for XMP or other metadata. Note that the format checker has no // means to carry state forward, it just returns a yes/no answer about a particular file format. // // The format checker and file handler should use the LFA_* functions for all I/O. They should not // open or close the file themselves unless the handler sets the "handler-owns-file" flag. // // The format checker is passed the format being checked, allowing one checker to handle multiple // formats. It is passed the LFA file ref so that it can do additional reads if necessary. The // buffer is from the start of the file, the file will be positioned to the byte following the // buffer. The buffer length will be at least 4K, unless the file is smaller in which case it will // be the length of the file. This buffer may be reused for additional reads. // // Identifying some file formats can require checking variable length strings. Doing seeks and reads // for each is suboptimal. There are utilities to maintain a rolling buffer and ensure that a given // amount of data is available. See the template file handler code for details. // // ------------------------------------------------------------------------------------------------- // // The file handler has no explicit open and close methods. These are implicit in the handler's // constructor and destructor. The file handler should use the XMPFiles member variables for the // active file ref (and path if necessary), unless it owns the file. Note that these might change // between the open and close in the case of crash-safe updates. Don't copy the XMPFiles member // variables in the handler's constructor, save the pointer to the XMPFiles object and access // directly as needed. // // The handler should have an UpdateFile method. This is called from XMPFiles::CloseFile if the // file needs to be updated. The handler's destructor must only close the file, not update it. // The handler can optionally have a WriteFile method, if it can rewrite the entire file. // // The handler is free to use its best judgement about caching parts of the file in memory. Overall // speed of a single open/get/put/close cycle is probably the best goal, assuming a modern processor // with a reasonable (significant but not enormous) amount of RAM. // // The handler methods will be called in a per-object thread safe manner. Concurrent access might // occur for different objects, but not for the same object. The handler's constructor and destructor // will always be globally serialized, so they can safely modify global data structures. // // (Testing issue: What about separate XMPFiles objects accessing the same file?) // // Handler's must not have any global objects that are heap allocated. Use pointers to objects that // are allocated and deleted during the XMPFiles initialization and termination process. Some // client apps are very picky about what they detect as memory leaks. // // static char gSomeBuffer [10*1000]; // OK, not from the heap. // static std::string gSomeString; // Not OK, content from the heap. // static std::vector gSomeVector; // Not OK, content from the heap. // static std::string * gSomeString = 0; // OK, alloc at init, delete at term. // static std::vector * gSomeVector = 0; // OK, alloc at init, delete at term. // // ================================================================================================= class XMPFiles { public: static void GetVersionInfo ( XMP_VersionInfo * info ); static bool Initialize ( XMP_OptionBits options = 0 ); static void Terminate(); XMPFiles(); virtual ~XMPFiles(); static bool GetFormatInfo ( XMP_FileFormat format, XMP_OptionBits * flags = 0 ); static XMP_FileFormat CheckFileFormat ( XMP_StringPtr filePath ); static XMP_FileFormat CheckPackageFormat ( XMP_StringPtr folderPath ); bool OpenFile ( XMP_StringPtr filePath, XMP_FileFormat format = kXMP_UnknownFile, XMP_OptionBits openFlags = 0 ); void CloseFile ( XMP_OptionBits closeFlags = 0 ); bool GetFileInfo ( XMP_StringPtr * filePath = 0, XMP_StringLen * filePathLen = 0, XMP_OptionBits * openFlags = 0, XMP_FileFormat * format = 0, XMP_OptionBits * handlerFlags = 0 ) const; void SetAbortProc ( XMP_AbortProc abortProc, void * abortArg ); bool GetXMP ( SXMPMeta * xmpObj = 0, XMP_StringPtr * xmpPacket = 0, XMP_StringLen * xmpPacketLen = 0, XMP_PacketInfo * packetInfo = 0 ); void PutXMP ( const SXMPMeta & xmpObj ); void PutXMP ( XMP_StringPtr xmpPacket, XMP_StringLen xmpPacketLen = kXMP_UseNullTermination ); bool CanPutXMP ( const SXMPMeta & xmpObj ); bool CanPutXMP ( XMP_StringPtr xmpPacket, XMP_StringLen xmpPacketLen = kXMP_UseNullTermination ); // Leave this data public so file handlers can see it. XMP_Int32 clientRefs; // ! Must be signed to allow decrement from zero. XMP_ReadWriteLock lock; XMP_FileFormat format; LFA_FileRef fileRef; // Non-zero if a file is open. std::string filePath; XMP_OptionBits openFlags; XMPFileHandler * handler; // Non-null if a file is open. void * tempPtr; // For use between the CheckProc and handler creation. XMP_Uns32 tempUI32; XMP_AbortProc abortProc; void * abortArg; }; // XMPFiles #endif /* __XMPFiles_hpp__ */ exempi-2.2.1/source/XMPFiles/XMPFiles_Impl.hpp0000664000175000017500000003423612150230673016005 00000000000000#ifndef __XMPFiles_Impl_hpp__ #define __XMPFiles_Impl_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! Must be the first #include! #include "XMP_Const.h" #include "XMP_BuildInfo.h" #include "XMP_LibUtils.hpp" #include "EndianUtils.hpp" #include #include #define TXMP_STRING_TYPE std::string #define XMP_INCLUDE_XMPFILES 1 #include "XMP.hpp" #include "XMPFiles.hpp" #include "LargeFileAccess.hpp" #include #include #include #include #if XMP_WinBuild #define snprintf _snprintf #else #if 0 // No longer needed, but retained to avoid merge conflicts #include #endif // POSIX headers for both Mac and generic UNIX. #include #include #include #include #include #endif // ================================================================================================= // General global variables and macros extern bool ignoreLocalText; extern XMP_Int32 sXMPFilesInitCount; #ifndef GatherPerformanceData #define GatherPerformanceData 0 #endif #if ! GatherPerformanceData #define StartPerfCheck(proc,info) /* do nothing */ #define EndPerfCheck(proc) /* do nothing */ #else #include "PerfUtils.hpp" enum { kAPIPerf_OpenFile, kAPIPerf_CloseFile, kAPIPerf_GetXMP, kAPIPerf_PutXMP, kAPIPerf_CanPutXMP, kAPIPerfProcCount // Last, count of the procs. }; static const char* kAPIPerfNames[] = { "OpenFile", "CloseFile", "GetXMP", "PutXMP", "CanPutXMP", 0 }; struct APIPerfItem { XMP_Uns8 whichProc; double elapsedTime; XMPFilesRef xmpFilesRef; std::string extraInfo; APIPerfItem ( XMP_Uns8 proc, double time, XMPFilesRef ref, const char * info ) : whichProc(proc), elapsedTime(time), xmpFilesRef(ref), extraInfo(info) {}; }; typedef std::vector APIPerfCollection; extern APIPerfCollection* sAPIPerf; #define StartPerfCheck(proc,info) \ sAPIPerf->push_back ( APIPerfItem ( proc, 0.0, xmpFilesRef, info ) ); \ APIPerfItem & thisPerf = sAPIPerf->back(); \ PerfUtils::MomentValue startTime, endTime; \ try { \ startTime = PerfUtils::NoteThisMoment(); #define EndPerfCheck(proc) \ endTime = PerfUtils::NoteThisMoment(); \ thisPerf.elapsedTime = PerfUtils::GetElapsedSeconds ( startTime, endTime ); \ } catch ( ... ) { \ endTime = PerfUtils::NoteThisMoment(); \ thisPerf.elapsedTime = PerfUtils::GetElapsedSeconds ( startTime, endTime ); \ thisPerf.extraInfo += " ** THROW **"; \ throw; \ } #endif extern XMP_FileFormat voidFileFormat; // Used as sink for unwanted output parameters. extern XMP_PacketInfo voidPacketInfo; extern void * voidVoidPtr; extern XMP_StringPtr voidStringPtr; extern XMP_StringLen voidStringLen; extern XMP_OptionBits voidOptionBits; static const XMP_Uns8 * kUTF8_PacketStart = (const XMP_Uns8 *) ""; static const size_t kUTF8_PacketTrailerLen = 19; // ! strlen ( kUTF8_PacketTrailer ) struct FileExtMapping { XMP_StringPtr ext; XMP_FileFormat format; }; extern const FileExtMapping kFileExtMap[]; extern const char * kKnownScannedFiles[]; extern const char * kKnownRejectedFiles[]; #define Uns8Ptr(p) ((XMP_Uns8 *) (p)) #define IsNewline( ch ) ( ((ch) == kLF) || ((ch) == kCR) ) #define IsSpaceOrTab( ch ) ( ((ch) == ' ') || ((ch) == kTab) ) #define IsWhitespace( ch ) ( IsSpaceOrTab ( ch ) || IsNewline ( ch ) ) static inline void MakeLowerCase ( std::string * str ) { for ( size_t i = 0, limit = str->size(); i < limit; ++i ) { char ch = (*str)[i]; if ( ('A' <= ch) && (ch <= 'Z') ) (*str)[i] += 0x20; } } static inline void MakeUpperCase ( std::string * str ) { for ( size_t i = 0, limit = str->size(); i < limit; ++i ) { char ch = (*str)[i]; if ( ('a' <= ch) && (ch <= 'z') ) (*str)[i] -= 0x20; } } #define XMP_LitMatch(s,l) (std::strcmp((s),(l)) == 0) #define XMP_LitNMatch(s,l,n) (std::strncmp((s),(l),(n)) == 0) // ================================================================================================= // Support for call tracing #ifndef XMP_TraceFilesCalls #define XMP_TraceFilesCalls 0 #define XMP_TraceFilesCallsToFile 0 #endif #if XMP_TraceFilesCalls #undef AnnounceThrow #undef AnnounceCatch #undef AnnounceEntry #undef AnnounceNoLock #undef AnnounceExit extern FILE * xmpFilesLog; #define AnnounceThrow(msg) \ fprintf ( xmpFilesLog, "XMP_Throw: %s\n", msg ); fflush ( xmpFilesLog ) #define AnnounceCatch(msg) \ fprintf ( xmpFilesLog, "Catch in %s: %s\n", procName, msg ); fflush ( xmpFilesLog ) #define AnnounceEntry(proc) \ const char * procName = proc; \ fprintf ( xmpFilesLog, "Entering %s\n", procName ); fflush ( xmpFilesLog ) #define AnnounceNoLock(proc) \ const char * procName = proc; \ fprintf ( xmpFilesLog, "Entering %s (no lock)\n", procName ); fflush ( xmpFilesLog ) #define AnnounceExit() \ fprintf ( xmpFilesLog, "Exiting %s\n", procName ); fflush ( xmpFilesLog ) #endif // ================================================================================================= // Support for memory leak tracking #ifndef TrackMallocAndFree #define TrackMallocAndFree 0 #endif #if TrackMallocAndFree static void* ChattyMalloc ( size_t size ) { void* ptr = malloc ( size ); fprintf ( stderr, "Malloc %d bytes @ %.8X\n", size, ptr ); return ptr; } static void ChattyFree ( void* ptr ) { fprintf ( stderr, "Free @ %.8X\n", ptr ); free ( ptr ); } #define malloc(s) ChattyMalloc ( s ) #define free(p) ChattyFree ( p ) #endif // ================================================================================================= // FileHandler declarations extern void ReadXMPPacket ( XMPFileHandler * handler ); extern void FillPacketInfo ( const XMP_VarString & packet, XMP_PacketInfo * info ); class XMPFileHandler { // See XMPFiles.hpp for usage notes. public: #define DefaultCTorPresets \ handlerFlags(0), stdCharForm(kXMP_CharUnknown), \ containsXMP(false), processedXMP(false), needsUpdate(false) XMPFileHandler() : parent(0), DefaultCTorPresets {}; XMPFileHandler (XMPFiles * _parent) : parent(_parent), DefaultCTorPresets {}; virtual ~XMPFileHandler() {}; // ! The specific handler is responsible for tnailInfo.tnailImage. virtual void CacheFileData() = 0; virtual void ProcessXMP(); // The default implementation just parses the XMP. virtual XMP_OptionBits GetSerializeOptions(); // The default is compact. virtual void UpdateFile ( bool doSafeUpdate ) = 0; virtual void WriteFile ( LFA_FileRef sourceRef, const std::string & sourcePath ) = 0; // ! Leave the data members public so common code can see them. XMPFiles * parent; // Let's the handler see the file info. XMP_OptionBits handlerFlags; // Capabilities of this handler. XMP_Uns8 stdCharForm; // The standard character form for output. bool containsXMP; // True if the file has XMP or PutXMP has been called. bool processedXMP; // True if the XMP is parsed and reconciled. bool needsUpdate; // True if the file needs to be updated. XMP_PacketInfo packetInfo; // ! This is always info about the packet in the file, if any! std::string xmpPacket; // ! This is the current XMP, updated by XMPFiles::PutXMP. SXMPMeta xmpObj; }; // XMPFileHandler typedef XMPFileHandler * (* XMPFileHandlerCTor) ( XMPFiles * parent ); typedef bool (* CheckFileFormatProc ) ( XMP_FileFormat format, XMP_StringPtr filePath, LFA_FileRef fileRef, XMPFiles * parent ); typedef bool (*CheckFolderFormatProc ) ( XMP_FileFormat format, const std::string & rootPath, const std::string & gpName, const std::string & parentName, const std::string & leafName, XMPFiles * parent ); // ================================================================================================= #if XMP_MacBuild extern LFA_FileRef LFA_OpenRsrc ( const char * fileName, char openMode ); // Open the Mac resource fork. #endif extern void CreateTempFile ( const std::string & origPath, std::string * tempPath, bool copyMacRsrc = false ); enum { kCopyMacRsrc = true }; struct AutoFile { // Provides auto close of files on exit or exception. LFA_FileRef fileRef; AutoFile() : fileRef(0) {}; ~AutoFile() { if ( fileRef != 0 ) LFA_Close ( fileRef ); }; }; enum { kFMode_DoesNotExist, kFMode_IsFile, kFMode_IsFolder, kFMode_IsOther }; typedef XMP_Uns8 FileMode; #if XMP_WinBuild #define kDirChar '\\' #else #define kDirChar '/' #endif class XMP_FolderInfo { public: XMP_FolderInfo() : dirRef(0) {}; ~XMP_FolderInfo() { if ( this->dirRef != 0 ) this->Close(); }; void Open ( const char * folderPath ); void Close(); bool GetFolderPath ( XMP_VarString * folderPath ); bool GetNextChild ( XMP_VarString * childName ); private: std::string folderPath; #if XMP_WinBuild HANDLE dirRef; // Windows uses FindFirstFile and FindNextFile. #else DIR * dirRef; // Mac and UNIX use the POSIX opendir/readdir/closedir functions. #endif }; extern FileMode GetFileMode ( const char * path ); static inline FileMode GetChildMode ( std::string & path, XMP_StringPtr childName ) { size_t pathLen = path.size(); path += kDirChar; path += childName; FileMode mode = GetFileMode ( path.c_str() ); path.erase ( pathLen ); return mode; } static inline void SplitLeafName ( std::string * path, std::string * leafName ) { size_t dirPos = path->size(); if ( dirPos == 0 ) { leafName->erase(); return; } for ( --dirPos; dirPos > 0; --dirPos ) { #if XMP_WinBuild if ( (*path)[dirPos] == '/' ) (*path)[dirPos] = kDirChar; // Tolerate both '\' and '/'. #endif if ( (*path)[dirPos] == kDirChar ) break; } if ( (*path)[dirPos] == kDirChar ) { leafName->assign ( &(*path)[dirPos+1] ); path->erase ( dirPos ); } else if ( dirPos == 0 ) { leafName->erase(); leafName->swap ( *path ); } } // ------------------------------------------------------------------------------------------------- static inline bool CheckBytes ( const void * left, const void * right, size_t length ) { return (std::memcmp ( left, right, length ) == 0); } // ------------------------------------------------------------------------------------------------- static inline bool CheckCString ( const void * left, const void * right ) { return (std::strcmp ( (char*)left, (char*)right ) == 0); } // ------------------------------------------------------------------------------------------------- // CheckFileSpace and RefillBuffer // ------------------------------- // // There is always a problem in file scanning of managing what you want to check against what is // available in a buffer, trying to keep the logic understandable and minimize data movement. The // CheckFileSpace and RefillBuffer functions are used here for a standard scanning model. // // The format scanning routines have an outer, "infinite" loop that looks for file markers. There // is a local (on stack) buffer, a pointer to the current position in the buffer, and a pointer for // the end of the buffer. The end pointer is just past the end of the buffer, "bufPtr == bufLimit" // means you are out of data. The outer loop ends when the necessary markers are found or we reach // the end of the file. // // The filePos is the file offset of the start of the current buffer. This is maintained so that // we can tell where the packet is in the file, part of the info returned to the client. // // At each check CheckFileSpace is used to make sure there is enough data in the buffer for the // check to be made. It refills the buffer if necessary, preserving the unprocessed data, setting // bufPtr and bufLimit appropriately. If we are too close to the end of the file to make the check // a failure status is returned. enum { kIOBufferSize = 128*1024 }; struct IOBuffer { XMP_Int64 filePos; XMP_Uns8* ptr; XMP_Uns8* limit; size_t len; XMP_Uns8 data [kIOBufferSize]; IOBuffer() : filePos(0), ptr(&data[0]), limit(ptr), len(0) {}; }; static inline void FillBuffer ( LFA_FileRef fileRef, XMP_Int64 fileOffset, IOBuffer* ioBuf ) { ioBuf->filePos = LFA_Seek ( fileRef, fileOffset, SEEK_SET ); if ( ioBuf->filePos != fileOffset ) XMP_Throw ( "Seek failure in FillBuffer", kXMPErr_ExternalFailure ); ioBuf->len = LFA_Read ( fileRef, &ioBuf->data[0], kIOBufferSize ); ioBuf->ptr = &ioBuf->data[0]; ioBuf->limit = ioBuf->ptr + ioBuf->len; } static inline void MoveToOffset ( LFA_FileRef fileRef, XMP_Int64 fileOffset, IOBuffer* ioBuf ) { if ( (ioBuf->filePos <= fileOffset) && (fileOffset < (XMP_Int64)(ioBuf->filePos + ioBuf->len)) ) { size_t bufOffset = (size_t)(fileOffset - ioBuf->filePos); ioBuf->ptr = &ioBuf->data[bufOffset]; } else { FillBuffer ( fileRef, fileOffset, ioBuf ); } } static inline void RefillBuffer ( LFA_FileRef fileRef, IOBuffer* ioBuf ) { ioBuf->filePos += (ioBuf->ptr - &ioBuf->data[0]); // ! Increment before the read. size_t bufTail = ioBuf->limit - ioBuf->ptr; // We'll re-read the tail portion of the buffer. if ( bufTail > 0 ) ioBuf->filePos = LFA_Seek ( fileRef, -((XMP_Int64)bufTail), SEEK_CUR ); ioBuf->len = LFA_Read ( fileRef, &ioBuf->data[0], kIOBufferSize ); ioBuf->ptr = &ioBuf->data[0]; ioBuf->limit = ioBuf->ptr + ioBuf->len; } static inline bool CheckFileSpace ( LFA_FileRef fileRef, IOBuffer* ioBuf, size_t neededLen ) { if ( size_t(ioBuf->limit - ioBuf->ptr) < size_t(neededLen) ) { // ! Avoid VS.Net compare warnings. RefillBuffer ( fileRef, ioBuf ); } return (size_t(ioBuf->limit - ioBuf->ptr) >= size_t(neededLen)); } #endif /* __XMPFiles_Impl_hpp__ */ exempi-2.2.1/source/XMPFiles/FormatSupport/0000775000175000017500000000000012163706252015566 500000000000000exempi-2.2.1/source/XMPFiles/FormatSupport/SWF_Support.hpp0000664000175000017500000001540712150230673020414 00000000000000#ifndef __SWF_Support_hpp__ #define __SWF_Support_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= //#include "XMP_Environment.h" // ! This must be the first include. #include "XMPFiles_Impl.hpp" #define SWF_SIGNATURE_LEN 3 #define SWF_C_SIGNATURE_DATA "\x43\x57\x53" #define SWF_F_SIGNATURE_DATA "\x46\x57\x53" #define SWF_TAG_ID_FILEATTRIBUTES 69 #define SWF_TAG_ID_METADATA 77 #define SWF_TAG_ID_ENDTAG 0 #define SWF_METADATA_FLAG 0x10 #define SWF_DEFAULT_COMPRESSION_LEVEL Z_DEFAULT_COMPRESSION #define SWF_COMPRESSION_BEGIN 8 #define CHUNK 16384 #include "zlib.h" namespace IO { //------------------------------------------------------------------ //input/output stream declaration typedef enum {FLUSH, FLUSH_NO} EFlush; class InputStream { public: virtual ~InputStream() {}; virtual XMP_Int32 Read(XMP_Uns8 * ioBuf, XMP_Int32 len) = 0; virtual XMP_Int64 Skip(XMP_Int64 len) = 0; virtual void Reset(void) = 0; virtual void Close(void) = 0; virtual bool IsEOF(void) = 0; virtual XMP_Int64 GetCurrentPos(void) = 0; }; class FileInputStream : public InputStream { public: FileInputStream(LFA_FileRef file) : iFile(file), iPos(0), iEndPos(0) { InitStream(); }; virtual ~FileInputStream() {}; virtual XMP_Int32 Read(XMP_Uns8 * ioBuf, XMP_Int32 len); virtual XMP_Int64 Skip(XMP_Int64 len); virtual void Reset(void); virtual void Close(void) {}; virtual bool IsEOF(void); virtual XMP_Int64 GetCurrentPos(void) { return iPos; }; protected: void InitStream(void); LFA_FileRef iFile; XMP_Int64 iPos; XMP_Int64 iEndPos; }; typedef enum { STATUS_WRITE, STATUS_READ, STATUS_EOF, STATUS_BUFFER_OVERFLOW, STATUS_SKIP } EStatus; class IOException { public: IOException(EStatus status) : iStatus(status) {}; ~IOException(void) {}; EStatus GetErrorCode(void) { return iStatus; }; protected: EStatus iStatus; }; namespace ZIP { typedef enum {DEFLATE, DEFLATE_NO} EDeflate; class DeflateInputStream : public FileInputStream { public: DeflateInputStream(LFA_FileRef file, XMP_Int32 bufferLength); virtual ~DeflateInputStream(); virtual XMP_Int32 Read(XMP_Uns8 * ioBuf, XMP_Int32 len); virtual XMP_Int32 Read(XMP_Uns8 * ioBuf); virtual void Close(void); virtual bool IsEOF(void); virtual XMP_Int64 Skip(XMP_Int64 len); virtual XMP_Int64 Skip(XMP_Int64 len, EDeflate deflate); virtual XMP_Int64 GetCurrentPos(void) { return iPos; }; protected: void InitStream(void); z_stream iStream; XMP_Int32 iStatus; XMP_Uns8 * iBuffer; XMP_Int32 iBufferLength; }; class ZIPException { public: ZIPException(XMP_Int32 err) : iErrorCode(err) {}; ~ZIPException(void) {}; XMP_Int32 GetErrorCode(void) { return iErrorCode; }; protected: XMP_Int32 iErrorCode; }; } // namespace zip } // namespace IO namespace SWF_Support { class TagData { public: TagData() : pos(0), len(0), id(0), offset(0), xmp(false) {} virtual ~TagData() {} // Short tag: // | code/length | data | // | 2 | val(length) | // Long tag (data > 63): // | code/length | length | data | // | 2 | 4 | val(length) | XMP_Uns64 pos; // file offset of tag XMP_Uns32 len; // length of tag data long id; // tag ID long offset; // offset of data in tag (short vs. long tag) bool xmp; // tag with XMP ? }; typedef std::vector TagVector; typedef TagVector::iterator TagIterator; class TagState { public: TagState() : xmpPos(0), xmpLen(0), headerSize(0),hasFileAttrTag(false), cachingFile(false), hasXMP(false), xmpPacket(""), fileAttrFlags(0) {} virtual ~TagState() {} XMP_Uns64 xmpPos; XMP_Uns32 xmpLen; TagData xmpTag; TagVector tags; XMP_Uns32 headerSize; TagData fileAttrTag; XMP_Uns32 fileAttrFlags; bool hasFileAttrTag; bool cachingFile; bool hasXMP; std::string xmpPacket; }; //compression related data types typedef enum swf_mode { CWS, FWS } SWF_MODE; typedef int (*CompressionFnc)(LFA_FileRef source, LFA_FileRef dest); class FileInfo { public: FileInfo(LFA_FileRef fileRef, const std::string & origPath); virtual ~FileInfo() {} bool IsCompressed(); LFA_FileRef Decompress(); void Compress(LFA_FileRef sourceRef, LFA_FileRef destRef); void Clean(); inline XMP_Uns32 GetSize() { return iSize; } private: std::string tmpFilePath; std::string origFilePath; LFA_FileRef fileRef; bool compressedFile; XMP_Uns32 iSize; //tmp Data LFA_FileRef tmpFileRef; void CheckFormat(LFA_FileRef fileRef); void CleanTempFiles(); int Encode ( LFA_FileRef fileRef, LFA_FileRef updateRef, SWF_MODE swfMode, CompressionFnc cmpFnc ); static int Inf ( LFA_FileRef source, LFA_FileRef dest ); static int Def ( LFA_FileRef source, LFA_FileRef dest ); }; long OpenSWF ( IO::InputStream *inputStream, TagState & inOutTagState ); bool ReadTag ( IO::InputStream * inputStream, TagState & inOutTagState, long * tagType, XMP_Uns32 * tagLength, XMP_Uns64 & inOutPosition ); unsigned long CheckTag ( IO::InputStream * inputStream, const TagState& inOutTagState, const TagData& inOutTagData ); bool HasMetadata(IO::InputStream * inputStream, TagState& tagState); XMP_Uns32 ReadFileAttrFlags(IO::InputStream * inputStream); bool WriteXMPTag ( LFA_FileRef fileRef, XMP_Uns32 len, const char* inBuffer ); bool CopyHeader ( LFA_FileRef sourceRef, LFA_FileRef destRef, const TagState & tagState ); bool UpdateHeader ( LFA_FileRef fileRef ); bool CopyTag ( LFA_FileRef sourceRef, LFA_FileRef destRef, TagData& tag ); bool UpdateFileAttrTag(LFA_FileRef fileRef, const TagData& fileAttrTag, const TagState& tagState); bool WriteFileAttrFlags(LFA_FileRef fileRef, const TagData& fileAttrTag, XMP_Uns32 flags); bool ReadBuffer ( LFA_FileRef fileRef, XMP_Uns64& pos, XMP_Uns32 len, XMP_Uns8* outBuffer ); bool WriteBuffer ( LFA_FileRef fileRef, XMP_Uns64& pos, XMP_Uns32 len, const char* inBuffer ); typedef struct TailBufferDef { XMP_Uns64 tailStartPosition; XMP_Uns64 writePosition; XMP_Uns64 tailEndPosition; TailBufferDef() : tailStartPosition(0), writePosition(0), tailEndPosition(0) {}; XMP_Uns32 GetTailSize(void) { return static_cast(tailEndPosition - tailStartPosition); } } TailBufferDef; } // namespace SWF_Support #endif // __SWF_Support_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/QuickTime_Support.cpp0000664000175000017500000011405412150230673021641 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2009 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" #if XMP_MacBuild #include #else #include "MacScriptExtracts.h" #endif #include "QuickTime_Support.hpp" #include "UnicodeConversions.hpp" #include "UnicodeInlines.incl_cpp" #include "Reconcile_Impl.hpp" // ================================================================================================= static const char * kMacRomanUTF8 [128] = { // UTF-8 mappings for MacRoman 80..FF. "\xC3\x84", "\xC3\x85", "\xC3\x87", "\xC3\x89", "\xC3\x91", "\xC3\x96", "\xC3\x9C", "\xC3\xA1", "\xC3\xA0", "\xC3\xA2", "\xC3\xA4", "\xC3\xA3", "\xC3\xA5", "\xC3\xA7", "\xC3\xA9", "\xC3\xA8", "\xC3\xAA", "\xC3\xAB", "\xC3\xAD", "\xC3\xAC", "\xC3\xAE", "\xC3\xAF", "\xC3\xB1", "\xC3\xB3", "\xC3\xB2", "\xC3\xB4", "\xC3\xB6", "\xC3\xB5", "\xC3\xBA", "\xC3\xB9", "\xC3\xBB", "\xC3\xBC", "\xE2\x80\xA0", "\xC2\xB0", "\xC2\xA2", "\xC2\xA3", "\xC2\xA7", "\xE2\x80\xA2", "\xC2\xB6", "\xC3\x9F", "\xC2\xAE", "\xC2\xA9", "\xE2\x84\xA2", "\xC2\xB4", "\xC2\xA8", "\xE2\x89\xA0", "\xC3\x86", "\xC3\x98", "\xE2\x88\x9E", "\xC2\xB1", "\xE2\x89\xA4", "\xE2\x89\xA5", "\xC2\xA5", "\xC2\xB5", "\xE2\x88\x82", "\xE2\x88\x91", "\xE2\x88\x8F", "\xCF\x80", "\xE2\x88\xAB", "\xC2\xAA", "\xC2\xBA", "\xCE\xA9", "\xC3\xA6", "\xC3\xB8", "\xC2\xBF", "\xC2\xA1", "\xC2\xAC", "\xE2\x88\x9A", "\xC6\x92", "\xE2\x89\x88", "\xE2\x88\x86", "\xC2\xAB", "\xC2\xBB", "\xE2\x80\xA6", "\xC2\xA0", "\xC3\x80", "\xC3\x83", "\xC3\x95", "\xC5\x92", "\xC5\x93", "\xE2\x80\x93", "\xE2\x80\x94", "\xE2\x80\x9C", "\xE2\x80\x9D", "\xE2\x80\x98", "\xE2\x80\x99", "\xC3\xB7", "\xE2\x97\x8A", "\xC3\xBF", "\xC5\xB8", "\xE2\x81\x84", "\xE2\x82\xAC", "\xE2\x80\xB9", "\xE2\x80\xBA", "\xEF\xAC\x81", "\xEF\xAC\x82", "\xE2\x80\xA1", "\xC2\xB7", "\xE2\x80\x9A", "\xE2\x80\x9E", "\xE2\x80\xB0", "\xC3\x82", "\xC3\x8A", "\xC3\x81", "\xC3\x8B", "\xC3\x88", "\xC3\x8D", "\xC3\x8E", "\xC3\x8F", "\xC3\x8C", "\xC3\x93", "\xC3\x94", "\xEF\xA3\xBF", "\xC3\x92", "\xC3\x9A", "\xC3\x9B", "\xC3\x99", "\xC4\xB1", "\xCB\x86", "\xCB\x9C", "\xC2\xAF", "\xCB\x98", "\xCB\x99", "\xCB\x9A", "\xC2\xB8", "\xCB\x9D", "\xCB\x9B", "\xCB\x87" }; static const XMP_Uns32 kMacRomanCP [128] = { // Unicode codepoints for MacRoman 80..FF. 0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1, 0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8, 0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3, 0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC, 0x2020, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF, 0x00AE, 0x00A9, 0x2122, 0x00B4, 0x00A8, 0x2260, 0x00C6, 0x00D8, 0x221E, 0x00B1, 0x2264, 0x2265, 0x00A5, 0x00B5, 0x2202, 0x2211, 0x220F, 0x03C0, 0x222B, 0x00AA, 0x00BA, 0x03A9, 0x00E6, 0x00F8, 0x00BF, 0x00A1, 0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB, 0x00BB, 0x2026, 0x00A0, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153, 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x25CA, 0x00FF, 0x0178, 0x2044, 0x20AC, 0x2039, 0x203A, 0xFB01, 0xFB02, 0x2021, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1, 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x00D3, 0x00D4, 0xF8FF, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC, // ! U+F8FF is private use solid Apple icon. 0x00AF, 0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7 }; // ------------------------------------------------------------------------------------------------- static const XMP_Uns16 kMacLangToScript_0_94 [95] = { /* langEnglish (0) */ smRoman, /* langFrench (1) */ smRoman, /* langGerman (2) */ smRoman, /* langItalian (3) */ smRoman, /* langDutch (4) */ smRoman, /* langSwedish (5) */ smRoman, /* langSpanish (6) */ smRoman, /* langDanish (7) */ smRoman, /* langPortuguese (8) */ smRoman, /* langNorwegian (9) */ smRoman, /* langHebrew (10) */ smHebrew, /* langJapanese (11) */ smJapanese, /* langArabic (12) */ smArabic, /* langFinnish (13) */ smRoman, /* langGreek (14) */ smRoman, /* langIcelandic (15) */ smRoman, /* langMaltese (16) */ smRoman, /* langTurkish (17) */ smRoman, /* langCroatian (18) */ smRoman, /* langTradChinese (19) */ smTradChinese, /* langUrdu (20) */ smArabic, /* langHindi (21) */ smDevanagari, /* langThai (22) */ smThai, /* langKorean (23) */ smKorean, /* langLithuanian (24) */ smCentralEuroRoman, /* langPolish (25) */ smCentralEuroRoman, /* langHungarian (26) */ smCentralEuroRoman, /* langEstonian (27) */ smCentralEuroRoman, /* langLatvian (28) */ smCentralEuroRoman, /* langSami (29) */ kNoMacScript, // ! Not known, missing from Apple comments. /* langFaroese (30) */ smRoman, /* langFarsi (31) */ smArabic, /* langRussian (32) */ smCyrillic, /* langSimpChinese (33) */ smSimpChinese, /* langFlemish (34) */ smRoman, /* langIrishGaelic (35) */ smRoman, /* langAlbanian (36) */ smRoman, /* langRomanian (37) */ smRoman, /* langCzech (38) */ smCentralEuroRoman, /* langSlovak (39) */ smCentralEuroRoman, /* langSlovenian (40) */ smRoman, /* langYiddish (41) */ smHebrew, /* langSerbian (42) */ smCyrillic, /* langMacedonian (43) */ smCyrillic, /* langBulgarian (44) */ smCyrillic, /* langUkrainian (45) */ smCyrillic, /* langBelorussian (46) */ smCyrillic, /* langUzbek (47) */ smCyrillic, /* langKazakh (48) */ smCyrillic, /* langAzerbaijani (49) */ smCyrillic, /* langAzerbaijanAr (50) */ smArabic, /* langArmenian (51) */ smArmenian, /* langGeorgian (52) */ smGeorgian, /* langMoldavian (53) */ smCyrillic, /* langKirghiz (54) */ smCyrillic, /* langTajiki (55) */ smCyrillic, /* langTurkmen (56) */ smCyrillic, /* langMongolian (57) */ smMongolian, /* langMongolianCyr (58) */ smCyrillic, /* langPashto (59) */ smArabic, /* langKurdish (60) */ smArabic, /* langKashmiri (61) */ smArabic, /* langSindhi (62) */ smArabic, /* langTibetan (63) */ smTibetan, /* langNepali (64) */ smDevanagari, /* langSanskrit (65) */ smDevanagari, /* langMarathi (66) */ smDevanagari, /* langBengali (67) */ smBengali, /* langAssamese (68) */ smBengali, /* langGujarati (69) */ smGujarati, /* langPunjabi (70) */ smGurmukhi, /* langOriya (71) */ smOriya, /* langMalayalam (72) */ smMalayalam, /* langKannada (73) */ smKannada, /* langTamil (74) */ smTamil, /* langTelugu (75) */ smTelugu, /* langSinhalese (76) */ smSinhalese, /* langBurmese (77) */ smBurmese, /* langKhmer (78) */ smKhmer, /* langLao (79) */ smLao, /* langVietnamese (80) */ smVietnamese, /* langIndonesian (81) */ smRoman, /* langTagalog (82) */ smRoman, /* langMalayRoman (83) */ smRoman, /* langMalayArabic (84) */ smArabic, /* langAmharic (85) */ smEthiopic, /* langTigrinya (86) */ smEthiopic, /* langOromo (87) */ smEthiopic, /* langSomali (88) */ smRoman, /* langSwahili (89) */ smRoman, /* langKinyarwanda (90) */ smRoman, /* langRundi (91) */ smRoman, /* langNyanja (92) */ smRoman, /* langMalagasy (93) */ smRoman, /* langEsperanto (94) */ smRoman }; // kMacLangToScript_0_94 static const XMP_Uns16 kMacLangToScript_128_151 [24] = { /* langWelsh (128) */ smRoman, /* langBasque (129) */ smRoman, /* langCatalan (130) */ smRoman, /* langLatin (131) */ smRoman, /* langQuechua (132) */ smRoman, /* langGuarani (133) */ smRoman, /* langAymara (134) */ smRoman, /* langTatar (135) */ smCyrillic, /* langUighur (136) */ smArabic, /* langDzongkha (137) */ smTibetan, /* langJavaneseRom (138) */ smRoman, /* langSundaneseRom (139) */ smRoman, /* langGalician (140) */ smRoman, /* langAfrikaans (141) */ smRoman, /* langBreton (142) */ smRoman, /* langInuktitut (143) */ smEthiopic, /* langScottishGaelic (144) */ smRoman, /* langManxGaelic (145) */ smRoman, /* langIrishGaelicScript (146) */ smRoman, /* langTongan (147) */ smRoman, /* langGreekAncient (148) */ smGreek, /* langGreenlandic (149) */ smRoman, /* langAzerbaijanRoman (150) */ smRoman, /* langNynorsk (151) */ smRoman }; // kMacLangToScript_128_151 // ------------------------------------------------------------------------------------------------- static const char * kMacToXMPLang_0_94 [95] = { /* langEnglish (0) */ "en", /* langFrench (1) */ "fr", /* langGerman (2) */ "de", /* langItalian (3) */ "it", /* langDutch (4) */ "nl", /* langSwedish (5) */ "sv", /* langSpanish (6) */ "es", /* langDanish (7) */ "da", /* langPortuguese (8) */ "pt", /* langNorwegian (9) */ "no", /* langHebrew (10) */ "he", /* langJapanese (11) */ "ja", /* langArabic (12) */ "ar", /* langFinnish (13) */ "fi", /* langGreek (14) */ "el", /* langIcelandic (15) */ "is", /* langMaltese (16) */ "mt", /* langTurkish (17) */ "tr", /* langCroatian (18) */ "hr", /* langTradChinese (19) */ "zh", /* langUrdu (20) */ "ur", /* langHindi (21) */ "hi", /* langThai (22) */ "th", /* langKorean (23) */ "ko", /* langLithuanian (24) */ "lt", /* langPolish (25) */ "pl", /* langHungarian (26) */ "hu", /* langEstonian (27) */ "et", /* langLatvian (28) */ "lv", /* langSami (29) */ "se", /* langFaroese (30) */ "fo", /* langFarsi (31) */ "fa", /* langRussian (32) */ "ru", /* langSimpChinese (33) */ "zh", /* langFlemish (34) */ "nl", /* langIrishGaelic (35) */ "ga", /* langAlbanian (36) */ "sq", /* langRomanian (37) */ "ro", /* langCzech (38) */ "cs", /* langSlovak (39) */ "sk", /* langSlovenian (40) */ "sl", /* langYiddish (41) */ "yi", /* langSerbian (42) */ "sr", /* langMacedonian (43) */ "mk", /* langBulgarian (44) */ "bg", /* langUkrainian (45) */ "uk", /* langBelorussian (46) */ "be", /* langUzbek (47) */ "uz", /* langKazakh (48) */ "kk", /* langAzerbaijani (49) */ "az", /* langAzerbaijanAr (50) */ "az", /* langArmenian (51) */ "hy", /* langGeorgian (52) */ "ka", /* langMoldavian (53) */ "ro", /* langKirghiz (54) */ "ky", /* langTajiki (55) */ "tg", /* langTurkmen (56) */ "tk", /* langMongolian (57) */ "mn", /* langMongolianCyr (58) */ "mn", /* langPashto (59) */ "ps", /* langKurdish (60) */ "ku", /* langKashmiri (61) */ "ks", /* langSindhi (62) */ "sd", /* langTibetan (63) */ "bo", /* langNepali (64) */ "ne", /* langSanskrit (65) */ "sa", /* langMarathi (66) */ "mr", /* langBengali (67) */ "bn", /* langAssamese (68) */ "as", /* langGujarati (69) */ "gu", /* langPunjabi (70) */ "pa", /* langOriya (71) */ "or", /* langMalayalam (72) */ "ml", /* langKannada (73) */ "kn", /* langTamil (74) */ "ta", /* langTelugu (75) */ "te", /* langSinhalese (76) */ "si", /* langBurmese (77) */ "my", /* langKhmer (78) */ "km", /* langLao (79) */ "lo", /* langVietnamese (80) */ "vi", /* langIndonesian (81) */ "id", /* langTagalog (82) */ "tl", /* langMalayRoman (83) */ "ms", /* langMalayArabic (84) */ "ms", /* langAmharic (85) */ "am", /* langTigrinya (86) */ "ti", /* langOromo (87) */ "om", /* langSomali (88) */ "so", /* langSwahili (89) */ "sw", /* langKinyarwanda (90) */ "rw", /* langRundi (91) */ "rn", /* langNyanja (92) */ "ny", /* langMalagasy (93) */ "mg", /* langEsperanto (94) */ "eo" }; // kMacToXMPLang_0_94 static const char * kMacToXMPLang_128_151 [24] = { /* langWelsh (128) */ "cy", /* langBasque (129) */ "eu", /* langCatalan (130) */ "ca", /* langLatin (131) */ "la", /* langQuechua (132) */ "qu", /* langGuarani (133) */ "gn", /* langAymara (134) */ "ay", /* langTatar (135) */ "tt", /* langUighur (136) */ "ug", /* langDzongkha (137) */ "dz", /* langJavaneseRom (138) */ "jv", /* langSundaneseRom (139) */ "su", /* langGalician (140) */ "gl", /* langAfrikaans (141) */ "af", /* langBreton (142) */ "br", /* langInuktitut (143) */ "iu", /* langScottishGaelic (144) */ "gd", /* langManxGaelic (145) */ "gv", /* langIrishGaelicScript (146) */ "ga", /* langTongan (147) */ "to", /* langGreekAncient (148) */ "", // ! Has no ISO 639-1 2 letter code. /* langGreenlandic (149) */ "kl", /* langAzerbaijanRoman (150) */ "az", /* langNynorsk (151) */ "nn" }; // kMacToXMPLang_128_151 // ------------------------------------------------------------------------------------------------- #if XMP_WinBuild static UINT kMacScriptToWinCP[34] = { /* smRoman (0) */ 10000, // There don't seem to be symbolic constants. /* smJapanese (1) */ 10001, // From http://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx /* smTradChinese (2) */ 10002, /* smKorean (3) */ 10003, /* smArabic (4) */ 10004, /* smHebrew (5) */ 10005, /* smGreek (6) */ 10006, /* smCyrillic (7) */ 10007, /* smRSymbol (8) */ 0, /* smDevanagari (9) */ 0, /* smGurmukhi (10) */ 0, /* smGujarati (11) */ 0, /* smOriya (12) */ 0, /* smBengali (13) */ 0, /* smTamil (14) */ 0, /* smTelugu (15) */ 0, /* smKannada (16) */ 0, /* smMalayalam (17) */ 0, /* smSinhalese (18) */ 0, /* smBurmese (19) */ 0, /* smKhmer (20) */ 0, /* smThai (21) */ 10021, /* smLao (22) */ 0, /* smGeorgian (23) */ 0, /* smArmenian (24) */ 0, /* smSimpChinese (25) */ 10008, /* smTibetan (26) */ 0, /* smMongolian (27) */ 0, /* smEthiopic (28) */ 0, /* smGeez (28) */ 0, /* smCentralEuroRoman (29) */ 10029, /* smVietnamese (30) */ 0, /* smExtArabic (31) */ 0, /* smUninterp (32) */ 0 }; // kMacScriptToWinCP static UINT kMacToWinCP_0_94 [95] = { /* langEnglish (0) */ 0, /* langFrench (1) */ 0, /* langGerman (2) */ 0, /* langItalian (3) */ 0, /* langDutch (4) */ 0, /* langSwedish (5) */ 0, /* langSpanish (6) */ 0, /* langDanish (7) */ 0, /* langPortuguese (8) */ 0, /* langNorwegian (9) */ 0, /* langHebrew (10) */ 10005, /* langJapanese (11) */ 10001, /* langArabic (12) */ 10004, /* langFinnish (13) */ 0, /* langGreek (14) */ 10006, /* langIcelandic (15) */ 10079, /* langMaltese (16) */ 0, /* langTurkish (17) */ 10081, /* langCroatian (18) */ 10082, /* langTradChinese (19) */ 10002, /* langUrdu (20) */ 0, /* langHindi (21) */ 0, /* langThai (22) */ 10021, /* langKorean (23) */ 10003, /* langLithuanian (24) */ 0, /* langPolish (25) */ 0, /* langHungarian (26) */ 0, /* langEstonian (27) */ 0, /* langLatvian (28) */ 0, /* langSami (29) */ 0, /* langFaroese (30) */ 0, /* langFarsi (31) */ 0, /* langRussian (32) */ 0, /* langSimpChinese (33) */ 10008, /* langFlemish (34) */ 0, /* langIrishGaelic (35) */ 0, /* langAlbanian (36) */ 0, /* langRomanian (37) */ 10010, /* langCzech (38) */ 0, /* langSlovak (39) */ 0, /* langSlovenian (40) */ 0, /* langYiddish (41) */ 0, /* langSerbian (42) */ 0, /* langMacedonian (43) */ 0, /* langBulgarian (44) */ 0, /* langUkrainian (45) */ 10017, /* langBelorussian (46) */ 0, /* langUzbek (47) */ 0, /* langKazakh (48) */ 0, /* langAzerbaijani (49) */ 0, /* langAzerbaijanAr (50) */ 0, /* langArmenian (51) */ 0, /* langGeorgian (52) */ 0, /* langMoldavian (53) */ 0, /* langKirghiz (54) */ 0, /* langTajiki (55) */ 0, /* langTurkmen (56) */ 0, /* langMongolian (57) */ 0, /* langMongolianCyr (58) */ 0, /* langPashto (59) */ 0, /* langKurdish (60) */ 0, /* langKashmiri (61) */ 0, /* langSindhi (62) */ 0, /* langTibetan (63) */ 0, /* langNepali (64) */ 0, /* langSanskrit (65) */ 0, /* langMarathi (66) */ 0, /* langBengali (67) */ 0, /* langAssamese (68) */ 0, /* langGujarati (69) */ 0, /* langPunjabi (70) */ 0, /* langOriya (71) */ 0, /* langMalayalam (72) */ 0, /* langKannada (73) */ 0, /* langTamil (74) */ 0, /* langTelugu (75) */ 0, /* langSinhalese (76) */ 0, /* langBurmese (77) */ 0, /* langKhmer (78) */ 0, /* langLao (79) */ 0, /* langVietnamese (80) */ 0, /* langIndonesian (81) */ 0, /* langTagalog (82) */ 0, /* langMalayRoman (83) */ 0, /* langMalayArabic (84) */ 0, /* langAmharic (85) */ 0, /* langTigrinya (86) */ 0, /* langOromo (87) */ 0, /* langSomali (88) */ 0, /* langSwahili (89) */ 0, /* langKinyarwanda (90) */ 0, /* langRundi (91) */ 0, /* langNyanja (92) */ 0, /* langMalagasy (93) */ 0, /* langEsperanto (94) */ 0 }; // kMacToWinCP_0_94 #endif // ================================================================================================= // GetMacScript // ============ static XMP_Uns16 GetMacScript ( XMP_Uns16 macLang ) { XMP_Uns16 macScript = kNoMacScript; if ( macLang <= 94 ) { macScript = kMacLangToScript_0_94[macLang]; } else if ( (128 <= macLang) && (macLang <= 151) ) { macScript = kMacLangToScript_0_94[macLang-128]; } return macScript; } // GetMacScript // ================================================================================================= // GetWinCP // ======== #if XMP_WinBuild static UINT GetWinCP ( XMP_Uns16 macLang ) { UINT winCP = 0; if ( macLang <= 94 ) winCP = kMacToWinCP_0_94[macLang]; if ( winCP == 0 ) { XMP_Uns16 macScript = GetMacScript ( macLang ); if ( macScript != kNoMacScript ) winCP = kMacScriptToWinCP[macScript]; } return winCP; } // GetWinCP #endif // ================================================================================================= // GetXMPLang // ========== static XMP_StringPtr GetXMPLang ( XMP_Uns16 macLang ) { XMP_StringPtr xmpLang = ""; if ( macLang <= 94 ) { xmpLang = kMacToXMPLang_0_94[macLang]; } else if ( (128 <= macLang) && (macLang <= 151) ) { xmpLang = kMacToXMPLang_128_151[macLang-128]; } return xmpLang; } // GetXMPLang // ================================================================================================= // GetMacLang // ========== static XMP_Uns16 GetMacLang ( std::string * xmpLang ) { if ( *xmpLang == "" ) return kNoMacLang; size_t hyphenPos = xmpLang->find ( '-' ); // Make sure the XMP language is "generic". if ( hyphenPos != std::string::npos ) xmpLang->erase ( hyphenPos ); for ( XMP_Uns16 i = 0; i <= 94; ++i ) { // Using std::map would be faster. if ( *xmpLang == kMacToXMPLang_0_94[i] ) return i; } for ( XMP_Uns16 i = 128; i <= 151; ++i ) { // Using std::map would be faster. if ( *xmpLang == kMacToXMPLang_128_151[i-128] ) return i; } return kNoMacLang; } // GetMacLang // ================================================================================================= // MacRomanToUTF8 // ============== static void MacRomanToUTF8 ( const std::string & macRoman, std::string * utf8 ) { utf8->erase(); for ( XMP_Uns8* chPtr = (XMP_Uns8*)macRoman.c_str(); *chPtr != 0; ++chPtr ) { // ! Don't trust that char is unsigned. if ( *chPtr < 0x80 ) { (*utf8) += (char)*chPtr; } else { (*utf8) += kMacRomanUTF8[(*chPtr)-0x80]; } } } // MacRomanToUTF8 // ================================================================================================= // UTF8ToMacRoman // ============== static void UTF8ToMacRoman ( const std::string & utf8, std::string * macRoman ) { macRoman->erase(); bool inNonMRSpan = false; for ( const XMP_Uns8 * chPtr = (XMP_Uns8*)utf8.c_str(); *chPtr != 0; ++chPtr ) { // ! Don't trust that char is unsigned. if ( *chPtr < 0x80 ) { (*macRoman) += (char)*chPtr; inNonMRSpan = false; } else { XMP_Uns32 cp = GetCodePoint ( &chPtr ); --chPtr; // Make room for the loop increment. XMP_Uns8 mr; for ( mr = 0; (mr < 0x80) && (cp != kMacRomanCP[mr]); ++mr ) {}; // Using std::map would be faster. if ( mr < 0x80 ) { (*macRoman) += (char)(mr+0x80); inNonMRSpan = false; } else if ( ! inNonMRSpan ) { (*macRoman) += '?'; inNonMRSpan = true; } } } } // UTF8ToMacRoman // ================================================================================================= // IsMacLangKnown // ============== static inline bool IsMacLangKnown ( XMP_Uns16 macLang ) { XMP_Uns16 macScript = GetMacScript ( macLang ); if ( macScript == kNoMacScript ) return false; #if XMP_UNIXBuild if ( macScript != smRoman ) return false; #elif XMP_WinBuild if ( GetWinCP(macLang) == 0 ) return false; #endif return true; } // IsMacLangKnown // ================================================================================================= // ConvertToMacLang // ================ bool ConvertToMacLang ( const std::string & utf8Value, XMP_Uns16 macLang, std::string * macValue ) { macValue->erase(); if ( macLang == kNoMacLang ) macLang = 0; // *** Zero is English, ought to use the "active" OS lang. if ( ! IsMacLangKnown ( macLang ) ) return false; #if XMP_MacBuild XMP_Uns16 macScript = GetMacScript ( macLang ); ReconcileUtils::UTF8ToMacEncoding ( macScript, macLang, (XMP_Uns8*)utf8Value.c_str(), utf8Value.size(), macValue ); #elif XMP_UNIXBuild UTF8ToMacRoman ( utf8Value, macValue ); #elif XMP_WinBuild UINT winCP = GetWinCP ( macLang ); ReconcileUtils::UTF8ToWinEncoding ( winCP, (XMP_Uns8*)utf8Value.c_str(), utf8Value.size(), macValue ); #endif return true; } // ConvertToMacLang // ================================================================================================= // ConvertFromMacLang // ================== bool ConvertFromMacLang ( const std::string & macValue, XMP_Uns16 macLang, std::string * utf8Value ) { utf8Value->erase(); if ( ! IsMacLangKnown ( macLang ) ) return false; #if XMP_MacBuild XMP_Uns16 macScript = GetMacScript ( macLang ); ReconcileUtils::MacEncodingToUTF8 ( macScript, macLang, (XMP_Uns8*)macValue.c_str(), macValue.size(), utf8Value ); #elif XMP_UNIXBuild MacRomanToUTF8 ( macValue, utf8Value ); #elif XMP_WinBuild UINT winCP = GetWinCP ( macLang ); ReconcileUtils::WinEncodingToUTF8 ( winCP, (XMP_Uns8*)macValue.c_str(), macValue.size(), utf8Value ); #endif return true; } // ConvertFromMacLang // ================================================================================================= // ================================================================================================= // TradQT_Manager // ================================================================================================= // ================================================================================================= // ================================================================================================= // TradQT_Manager::ParseCachedBoxes // ================================ // // Parse the cached '©...' children of the 'moov'/'udta' box. The contents of each cached box are // a sequence of "mini boxes" analogous to XMP AltText arrays. Each mini box has a 16-bit size, // 16-bit language code, and text. The size is only the text size. The language codes are Macintosh // Script Manager langXyz codes. The text encoding is implicit in the language, see comments in // Apple's Script.h header. bool TradQT_Manager::ParseCachedBoxes ( const MOOV_Manager & moovMgr ) { MOOV_Manager::BoxInfo udtaInfo; MOOV_Manager::BoxRef udtaRef = moovMgr.GetBox ( "moov/udta", &udtaInfo ); if ( udtaRef == 0 ) return false; for ( XMP_Uns32 i = 0; i < udtaInfo.childCount; ++i ) { MOOV_Manager::BoxInfo currInfo; MOOV_Manager::BoxRef currRef = moovMgr.GetNthChild ( udtaRef, i, &currInfo ); if ( currRef == 0 ) break; // Sanity check, should not happen. if ( (currInfo.boxType >> 24) != 0xA9 ) continue; if ( currInfo.contentSize < 2+2+1 ) continue; // Want enough for a non-empty value. InfoMapPos newInfo = this->parsedBoxes.insert ( this->parsedBoxes.end(), InfoMap::value_type ( currInfo.boxType, ParsedBoxInfo ( currInfo.boxType ) ) ); std::vector * newValues = &newInfo->second.values; XMP_Uns8 * boxPtr = (XMP_Uns8*) currInfo.content; XMP_Uns8 * boxEnd = boxPtr + currInfo.contentSize; XMP_Uns16 miniLen, macLang; for ( ; boxPtr < boxEnd-4; boxPtr += miniLen ) { miniLen = 4 + GetUns16BE ( boxPtr ); // ! Include header in local miniLen. macLang = GetUns16BE ( boxPtr+2); if ( (miniLen <= 4) || (miniLen > (boxEnd - boxPtr)) ) continue; // Ignore bad or empty values. XMP_StringPtr valuePtr = (char*)(boxPtr+4); size_t valueLen = miniLen - 4; newValues->push_back ( ValueInfo() ); ValueInfo * newValue = &newValues->back(); // Only set the XMP language if the Mac script is known, i.e. the value can be converted. newValue->macLang = macLang; if ( IsMacLangKnown ( macLang ) ) newValue->xmpLang = GetXMPLang ( macLang ); newValue->macValue.assign ( valuePtr, valueLen ); } } return (! this->parsedBoxes.empty()); } // TradQT_Manager::ParseCachedBoxes // ================================================================================================= // TradQT_Manager::ImportSimpleXMP // =============================== // // Update a simple XMP property if the QT value looks newer. bool TradQT_Manager::ImportSimpleXMP ( XMP_Uns32 id, SXMPMeta * xmp, XMP_StringPtr ns, XMP_StringPtr prop ) const { try { InfoMapCPos infoPos = this->parsedBoxes.find ( id ); if ( infoPos == this->parsedBoxes.end() ) return false; if ( infoPos->second.values.empty() ) return false; std::string xmpValue, tempValue; XMP_OptionBits flags; bool xmpExists = xmp->GetProperty ( ns, prop, &xmpValue, &flags ); if ( xmpExists && (! XMP_PropIsSimple ( flags )) ) { XMP_Throw ( "TradQT_Manager::ImportSimpleXMP - XMP property must be simple", kXMPErr_BadParam ); } bool convertOK; const ValueInfo & qtItem = infoPos->second.values[0]; // ! Use the first QT entry. if ( xmpExists ) { convertOK = ConvertToMacLang ( xmpValue, qtItem.macLang, &tempValue ); if ( ! convertOK ) return false; // throw? if ( tempValue == qtItem.macValue ) return false; // QT value matches back converted XMP value. } convertOK = ConvertFromMacLang ( qtItem.macValue, qtItem.macLang, &tempValue ); if ( ! convertOK ) return false; // throw? xmp->SetProperty ( ns, prop, tempValue.c_str() ); return true; } catch ( ... ) { return false; // Don't let one failure abort other imports. } } // TradQT_Manager::ImportSimpleXMP // ================================================================================================= // TradQT_Manager::ImportLangItem // ============================== // // Update a specific XMP AltText item if the QuickTime value looks newer. bool TradQT_Manager::ImportLangItem ( const ValueInfo & qtItem, SXMPMeta * xmp, XMP_StringPtr ns, XMP_StringPtr langArray ) const { try { XMP_StringPtr genericLang, specificLang; if ( qtItem.xmpLang[0] != 0 ) { genericLang = qtItem.xmpLang; specificLang = qtItem.xmpLang; } else { genericLang = ""; specificLang = "x-default"; } bool convertOK; std::string xmpValue, tempValue, actualLang; bool xmpExists = xmp->GetLocalizedText ( ns, langArray, genericLang, specificLang, &actualLang, &xmpValue, 0 ); if ( xmpExists ) { convertOK = ConvertToMacLang ( xmpValue, qtItem.macLang, &tempValue ); if ( ! convertOK ) return false; // throw? if ( tempValue == qtItem.macValue ) return true; // QT value matches back converted XMP value. specificLang = actualLang.c_str(); } convertOK = ConvertFromMacLang ( qtItem.macValue, qtItem.macLang, &tempValue ); if ( ! convertOK ) return false; // throw? xmp->SetLocalizedText ( ns, langArray, "", specificLang, tempValue.c_str() ); return true; } catch ( ... ) { return false; // Don't let one failure abort other imports. } } // TradQT_Manager::ImportLangItem // ================================================================================================= // TradQT_Manager::ImportLangAltXMP // ================================ // // Update items in the XMP array if the QT value looks newer. bool TradQT_Manager::ImportLangAltXMP ( XMP_Uns32 id, SXMPMeta * xmp, XMP_StringPtr ns, XMP_StringPtr langArray ) const { try { InfoMapCPos infoPos = this->parsedBoxes.find ( id ); if ( infoPos == this->parsedBoxes.end() ) return false; if ( infoPos->second.values.empty() ) return false; // Quit now if there are no values. XMP_OptionBits flags; bool xmpExists = xmp->GetProperty ( ns, langArray, 0, &flags ); if ( ! xmpExists ) { xmp->SetProperty ( ns, langArray, 0, kXMP_PropArrayIsAltText ); } else if ( ! XMP_ArrayIsAltText ( flags ) ) { XMP_Throw ( "TradQT_Manager::ImportLangAltXMP - XMP array must be AltText", kXMPErr_BadParam ); } // Process all of the QT values, looking up the appropriate XMP language for each. bool haveMappings = false; const ValueVector & qtValues = infoPos->second.values; for ( size_t i = 0, limit = qtValues.size(); i < limit; ++i ) { const ValueInfo & qtItem = qtValues[i]; if ( *qtItem.xmpLang == 0 ) continue; // Only do known mappings in the loop. haveMappings |= this->ImportLangItem ( qtItem, xmp, ns, langArray ); } if ( ! haveMappings ) { // If nothing mapped, process the first QT item to XMP's "x-default". haveMappings = this->ImportLangItem ( qtValues[0], xmp, ns, langArray ); // ! No xmpLang implies "x-default". } return haveMappings; } catch ( ... ) { return false; // Don't let one failure abort other imports. } } // TradQT_Manager::ImportLangAltXMP // ================================================================================================= // TradQT_Manager::ExportSimpleXMP // =============================== // // Export a simple XMP value to the first existing QuickTime item. Delete all of the QT values if the // XMP value is empty or the XMP does not exist. // ! We don't create new QuickTime items since we don't know the language. void TradQT_Manager::ExportSimpleXMP ( XMP_Uns32 id, const SXMPMeta & xmp, XMP_StringPtr ns, XMP_StringPtr prop, bool createWithZeroLang /* = false */ ) { std::string xmpValue, macValue; InfoMapPos infoPos = this->parsedBoxes.find ( id ); bool qtFound = (infoPos != this->parsedBoxes.end()) && (! infoPos->second.values.empty()); bool xmpFound = xmp.GetProperty ( ns, prop, &xmpValue, 0 ); if ( (! xmpFound) || (xmpValue.empty()) ) { if ( qtFound ) { this->parsedBoxes.erase ( infoPos ); this->changed = true; } return; } XMP_Assert ( xmpFound ); if ( ! qtFound ) { if ( ! createWithZeroLang ) return; infoPos = this->parsedBoxes.insert ( this->parsedBoxes.end(), InfoMap::value_type ( id, ParsedBoxInfo ( id ) ) ); ValueVector * newValues = &infoPos->second.values; newValues->push_back ( ValueInfo() ); ValueInfo * newValue = &newValues->back(); newValue->macLang = 0; // Happens to be langEnglish. newValue->xmpLang = kMacToXMPLang_0_94[0]; this->changed = infoPos->second.changed = true; } ValueInfo * qtItem = &infoPos->second.values[0]; // ! Use the first QT entry. if ( ! IsMacLangKnown ( qtItem->macLang ) ) return; bool convertOK = ConvertToMacLang ( xmpValue, qtItem->macLang, &macValue ); if ( convertOK && (macValue != qtItem->macValue) ) { qtItem->macValue = macValue; this->changed = infoPos->second.changed = true; } } // TradQT_Manager::ExportSimpleXMP // ================================================================================================= // TradQT_Manager::ExportLangAltXMP // ================================ // // Export XMP LangAlt array items to QuickTime, where the language and encoding mappings are known. // If there are no known language and encoding mappings, map the XMP default item to the first // existing QuickTime item. void TradQT_Manager::ExportLangAltXMP ( XMP_Uns32 id, const SXMPMeta & xmp, XMP_StringPtr ns, XMP_StringPtr langArray ) { bool haveMappings = false; std::string xmpPath, xmpValue, xmpLang, macValue; InfoMapPos infoPos = this->parsedBoxes.find ( id ); if ( infoPos == this->parsedBoxes.end() ) { infoPos = this->parsedBoxes.insert ( this->parsedBoxes.end(), InfoMap::value_type ( id, ParsedBoxInfo ( id ) ) ); } ValueVector * qtValues = &infoPos->second.values; XMP_Index xmpCount = xmp.CountArrayItems ( ns, langArray ); bool convertOK; if ( xmpCount == 0 ) { // Delete the "mappable" QuickTime items if there are no XMP values. Leave the others alone. for ( int i = (int)qtValues->size()-1; i > 0; --i ) { // ! Need a signed index. if ( (*qtValues)[i].xmpLang[0] != 0 ) { qtValues->erase ( qtValues->begin() + i ); this->changed = infoPos->second.changed = true; } } return; } // Go through the XMP and look for a related macLang QuickTime item to update or create. for ( XMP_Index xmpIndex = 1; xmpIndex <= xmpCount; ++xmpIndex ) { // ! XMP index starts at 1! SXMPUtils::ComposeArrayItemPath ( ns, langArray, xmpIndex, &xmpPath ); xmp.GetProperty ( ns, xmpPath.c_str(), &xmpValue, 0 ); xmp.GetQualifier ( ns, xmpPath.c_str(), kXMP_NS_XML, "lang", &xmpLang, 0 ); if ( xmpLang == "x-default" ) continue; XMP_Uns16 macLang = GetMacLang ( &xmpLang ); if ( macLang == kNoMacLang ) continue; size_t qtIndex, qtLimit; for ( qtIndex = 0, qtLimit = qtValues->size(); qtIndex < qtLimit; ++qtIndex ) { if ( (*qtValues)[qtIndex].macLang == macLang ) break; } if ( qtIndex == qtLimit ) { // No existing QuickTime item, try to create one. if ( ! IsMacLangKnown ( macLang ) ) continue; qtValues->push_back ( ValueInfo() ); qtIndex = qtValues->size() - 1; ValueInfo * newItem = &((*qtValues)[qtIndex]); newItem->macLang = macLang; newItem->xmpLang = GetXMPLang ( macLang ); // ! Use the 2 character root language. } ValueInfo * qtItem = &((*qtValues)[qtIndex]); qtItem->marked = true; // Mark it whether updated or not, don't delete it in the next pass. convertOK = ConvertToMacLang ( xmpValue, qtItem->macLang, &macValue ); if ( convertOK && (macValue != qtItem->macValue) ) { qtItem->macValue.swap ( macValue ); // No need to make a copy. haveMappings = true; } } this->changed |= haveMappings; infoPos->second.changed |= haveMappings; // Go through the QuickTime items that are unmarked and delete those that have an xmpLang // and known macScript. Clear all marks. for ( int i = (int)qtValues->size()-1; i > 0; --i ) { // ! Need a signed index. ValueInfo * qtItem = &((*qtValues)[i]); if ( qtItem->marked ) { qtItem->marked = false; } else if ( (qtItem->xmpLang[0] != 0) && IsMacLangKnown ( qtItem->macLang ) ) { qtValues->erase ( qtValues->begin() + i ); this->changed = infoPos->second.changed = true; } } // If there were no mappings, export the XMP default item to the first QT item. if ( (! haveMappings) && (! qtValues->empty()) ) { bool ok = xmp.GetLocalizedText ( ns, langArray, "", "x-default", 0, &xmpValue, 0 ); if ( ! ok ) return; ValueInfo * qtItem = &((*qtValues)[0]); if ( ! IsMacLangKnown ( qtItem->macLang ) ) return; convertOK = ConvertToMacLang ( xmpValue, qtItem->macLang, &macValue ); if ( convertOK && (macValue != qtItem->macValue) ) { qtItem->macValue.swap ( macValue ); // No need to make a copy. this->changed = infoPos->second.changed = true; } } } // TradQT_Manager::ExportLangAltXMP // ================================================================================================= // TradQT_Manager::UpdateChangedBoxes // ================================== void TradQT_Manager::UpdateChangedBoxes ( MOOV_Manager * moovMgr ) { MOOV_Manager::BoxInfo udtaInfo; MOOV_Manager::BoxRef udtaRef = moovMgr->GetBox ( "moov/udta", &udtaInfo ); XMP_Assert ( (udtaRef != 0) || (udtaInfo.childCount == 0) ); if ( udtaRef != 0 ) { // Might not have been a moov/udta box in the parse. // First go through the moov/udta/©... children and delete those that are not in the map. for ( XMP_Uns32 ordinal = udtaInfo.childCount; ordinal > 0; --ordinal ) { // ! Go backwards because of deletions. MOOV_Manager::BoxInfo currInfo; MOOV_Manager::BoxRef currRef = moovMgr->GetNthChild ( udtaRef, (ordinal-1), &currInfo ); if ( currRef == 0 ) break; // Sanity check, should not happen. if ( (currInfo.boxType >> 24) != 0xA9 ) continue; if ( currInfo.contentSize < 2+2+1 ) continue; // These were skipped by ParseCachedBoxes. InfoMapPos infoPos = this->parsedBoxes.find ( currInfo.boxType ); if ( infoPos == this->parsedBoxes.end() ) moovMgr->DeleteNthChild ( udtaRef, (ordinal-1) ); } } // Now go through the changed items in the map and update them in the moov/udta subtree. InfoMapCPos infoPos = this->parsedBoxes.begin(); InfoMapCPos infoEnd = this->parsedBoxes.end(); for ( ; infoPos != infoEnd; ++infoPos ) { ParsedBoxInfo * qtItem = (ParsedBoxInfo*) &infoPos->second; if ( ! qtItem->changed ) continue; qtItem->changed = false; XMP_Uns32 qtTotalSize = 0; // Total size of the QT values, ignoring empty values. for ( size_t i = 0, limit = qtItem->values.size(); i < limit; ++i ) { if ( ! qtItem->values[i].macValue.empty() ) { if ( qtItem->values[i].macValue.size() > 0xFFFF ) qtItem->values[i].macValue.erase ( 0xFFFF ); qtTotalSize += (XMP_Uns32)(2+2 + qtItem->values[i].macValue.size()); } } if ( udtaRef == 0 ) { // Might not have been a moov/udta box in the parse. moovMgr->SetBox ( "moov/udta", 0, 0 ); udtaRef = moovMgr->GetBox ( "moov/udta", &udtaInfo ); XMP_Assert ( udtaRef != 0 ); } if ( qtTotalSize == 0 ) { moovMgr->DeleteTypeChild ( udtaRef, qtItem->id ); } else { // Compose the complete box content. RawDataBlock fullValue; fullValue.assign ( qtTotalSize, 0 ); XMP_Uns8 * valuePtr = &fullValue[0]; for ( size_t i = 0, limit = qtItem->values.size(); i < limit; ++i ) { XMP_Assert ( qtItem->values[i].macValue.size() <= 0xFFFF ); XMP_Uns16 textSize = (XMP_Uns16)qtItem->values[i].macValue.size(); if ( textSize == 0 ) continue; PutUns16BE ( textSize, valuePtr ); valuePtr += 2; PutUns16BE ( qtItem->values[i].macLang, valuePtr ); valuePtr += 2; memcpy ( valuePtr, qtItem->values[i].macValue.c_str(), textSize ); valuePtr += textSize; } // Look for an existing box to update, else add a new one. MOOV_Manager::BoxInfo itemInfo; MOOV_Manager::BoxRef itemRef = moovMgr->GetTypeChild ( udtaRef, qtItem->id, &itemInfo ); if ( itemRef != 0 ) { moovMgr->SetBox ( itemRef, &fullValue[0], qtTotalSize ); } else { moovMgr->AddChildBox ( udtaRef, qtItem->id, &fullValue[0], qtTotalSize ); } } } } // TradQT_Manager::UpdateChangedBoxes // ================================================================================================= exempi-2.2.1/source/XMPFiles/FormatSupport/ReconcileLegacy.cpp0000664000175000017500000001665512150230673021252 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "ReconcileLegacy.hpp" #include "Reconcile_Impl.hpp" // ================================================================================================= /// \file ReconcileLegacy.cpp /// \brief Top level parts of utilities to reconcile between XMP and legacy metadata forms such as /// TIFF/Exif and IPTC. /// // ================================================================================================= // ================================================================================================= // ImportPhotoData // =============== // // Import legacy metadata for JPEG, TIFF, and Photoshop files into the XMP. The caller must have // already done the file specific processing to select the appropriate sources of the TIFF stream, // the Photoshop image resources, and the IPTC. #define SaveExifTag(ns,prop) \ if ( xmp->DoesPropertyExist ( ns, prop ) ) SXMPUtils::DuplicateSubtree ( *xmp, &savedExif, ns, prop ) #define RestoreExifTag(ns,prop) \ if ( savedExif.DoesPropertyExist ( ns, prop ) ) SXMPUtils::DuplicateSubtree ( savedExif, xmp, ns, prop ) void ImportPhotoData ( const TIFF_Manager & exif, const IPTC_Manager & iptc, const PSIR_Manager & psir, int iptcDigestState, SXMPMeta * xmp, XMP_OptionBits options /* = 0 */ ) { bool haveXMP = XMP_OptionIsSet ( options, k2XMP_FileHadXMP ); bool haveExif = XMP_OptionIsSet ( options, k2XMP_FileHadExif ); bool haveIPTC = XMP_OptionIsSet ( options, k2XMP_FileHadIPTC ); // Save some new Exif writebacks that can be XMP-only from older versions, delete all of the // XMP's tiff: and exif: namespaces (they should only reflect native Exif), then put back the // saved writebacks (which might get replaced by the native Exif values in the Import calls). // The value of exif:ISOSpeedRatings is saved for special case handling of ISO over 65535. SXMPMeta savedExif; SaveExifTag ( kXMP_NS_EXIF, "DateTimeOriginal" ); SaveExifTag ( kXMP_NS_EXIF, "GPSLatitude" ); SaveExifTag ( kXMP_NS_EXIF, "GPSLongitude" ); SaveExifTag ( kXMP_NS_EXIF, "GPSTimeStamp" ); SaveExifTag ( kXMP_NS_EXIF, "GPSAltitude" ); SaveExifTag ( kXMP_NS_EXIF, "GPSAltitudeRef" ); SaveExifTag ( kXMP_NS_EXIF, "ISOSpeedRatings" ); SXMPUtils::RemoveProperties ( xmp, kXMP_NS_TIFF, 0, kXMPUtil_DoAllProperties ); SXMPUtils::RemoveProperties ( xmp, kXMP_NS_EXIF, 0, kXMPUtil_DoAllProperties ); RestoreExifTag ( kXMP_NS_EXIF, "DateTimeOriginal" ); RestoreExifTag ( kXMP_NS_EXIF, "GPSLatitude" ); RestoreExifTag ( kXMP_NS_EXIF, "GPSLongitude" ); RestoreExifTag ( kXMP_NS_EXIF, "GPSTimeStamp" ); RestoreExifTag ( kXMP_NS_EXIF, "GPSAltitude" ); RestoreExifTag ( kXMP_NS_EXIF, "GPSAltitudeRef" ); RestoreExifTag ( kXMP_NS_EXIF, "ISOSpeedRatings" ); // Not obvious here, but the logic in PhotoDataUtils follows the MWG reader guidelines. PhotoDataUtils::ImportPSIR ( psir, xmp, iptcDigestState ); if ( haveIPTC ) PhotoDataUtils::Import2WayIPTC ( iptc, xmp, iptcDigestState ); if ( haveExif ) PhotoDataUtils::Import2WayExif ( exif, xmp, iptcDigestState ); if ( haveExif | haveIPTC ) PhotoDataUtils::Import3WayItems ( exif, iptc, xmp, iptcDigestState ); // If photoshop:DateCreated does not exist try to create it from exif:DateTimeOriginal. if ( ! xmp->DoesPropertyExist ( kXMP_NS_Photoshop, "DateCreated" ) ) { std::string exifValue; bool haveExifDTO = xmp->GetProperty ( kXMP_NS_EXIF, "DateTimeOriginal", &exifValue, 0 ); if ( haveExifDTO ) xmp->SetProperty ( kXMP_NS_Photoshop, "DateCreated", exifValue.c_str() ); } } // ImportPhotoData // ================================================================================================= // ExportPhotoData // =============== void ExportPhotoData ( XMP_FileFormat destFormat, SXMPMeta * xmp, TIFF_Manager * exif, // Pass 0 if not wanted. IPTC_Manager * iptc, // Pass 0 if not wanted. PSIR_Manager * psir, // Pass 0 if not wanted. XMP_OptionBits options /* = 0 */ ) { XMP_Assert ( (destFormat == kXMP_JPEGFile) || (destFormat == kXMP_TIFFFile) || (destFormat == kXMP_PhotoshopFile) ); // Do not write IPTC-IIM or PSIR in DNG files (which are a variant of TIFF). if ( (destFormat == kXMP_TIFFFile) && (exif != 0) && exif->GetTag ( kTIFF_PrimaryIFD, kTIFF_DNGVersion, 0 ) ) { iptc = 0; // These prevent calls to ExportIPTC and ExportPSIR. psir = 0; exif->DeleteTag ( kTIFF_PrimaryIFD, kTIFF_IPTC ); // These remove any existing IPTC and PSIR. exif->DeleteTag ( kTIFF_PrimaryIFD, kTIFF_PSIR ); } // Export the individual metadata items to the non-XMP forms. Set the IPTC digest whether or not // it changed, it might not have been present or correct before. bool iptcChanged = false; // Save explicitly, internal flag is reset by UpdateMemoryDataSets. void * iptcPtr = 0; XMP_Uns32 iptcLen = 0; if ( iptc != 0 ) { PhotoDataUtils::ExportIPTC ( *xmp, iptc ); iptcChanged = iptc->IsChanged(); if ( iptcChanged ) iptc->UpdateMemoryDataSets(); iptcLen = iptc->GetBlockInfo ( &iptcPtr ); if ( psir != 0 ) PhotoDataUtils::SetIPTCDigest ( iptcPtr, iptcLen, psir ); } if ( exif != 0 ) PhotoDataUtils::ExportExif ( xmp, exif ); if ( psir != 0 ) PhotoDataUtils::ExportPSIR ( *xmp, psir ); // Now update the non-XMP collections of metadata according to the file format. Do not update // the XMP here, that is done in the file handlers after deciding if an XMP-only in-place // update should be done. // - JPEG has the IPTC in PSIR 1028, the Exif and PSIR are marker segments. // - TIFF has the IPTC and PSIR in primary IFD tags. // - PSD has everything in PSIRs. if ( destFormat == kXMP_JPEGFile ) { if ( iptcChanged && (psir != 0) ) psir->SetImgRsrc ( kPSIR_IPTC, iptcPtr, iptcLen ); } else if ( destFormat == kXMP_TIFFFile ) { XMP_Assert ( exif != 0 ); if ( iptcChanged ) exif->SetTag ( kTIFF_PrimaryIFD, kTIFF_IPTC, kTIFF_UndefinedType, iptcLen, iptcPtr ); if ( (psir != 0) && psir->IsChanged() ) { void* psirPtr; XMP_Uns32 psirLen = psir->UpdateMemoryResources ( &psirPtr ); exif->SetTag ( kTIFF_PrimaryIFD, kTIFF_PSIR, kTIFF_UndefinedType, psirLen, psirPtr ); } } else if ( destFormat == kXMP_PhotoshopFile ) { XMP_Assert ( psir != 0 ); if ( iptcChanged ) psir->SetImgRsrc ( kPSIR_IPTC, iptcPtr, iptcLen ); if ( (exif != 0) && exif->IsChanged() ) { void* exifPtr; XMP_Uns32 exifLen = exif->UpdateMemoryStream ( &exifPtr ); psir->SetImgRsrc ( kPSIR_Exif, exifPtr, exifLen ); } } // Strip the tiff: and exif: namespaces from the XMP, we're done with them. Save the Exif // ISOSpeedRatings if any of the values are over 0xFFFF, the native tag is SHORT. Lower level // code already kept or stripped the XMP form. SXMPMeta savedExif; SaveExifTag ( kXMP_NS_EXIF, "ISOSpeedRatings" ); SXMPUtils::RemoveProperties ( xmp, kXMP_NS_TIFF, 0, kXMPUtil_DoAllProperties ); SXMPUtils::RemoveProperties ( xmp, kXMP_NS_EXIF, 0, kXMPUtil_DoAllProperties ); RestoreExifTag ( kXMP_NS_EXIF, "ISOSpeedRatings" ); } // ExportPhotoData exempi-2.2.1/source/XMPFiles/FormatSupport/ISOBaseMedia_Support.hpp0000664000175000017500000000755212150230672022143 00000000000000#ifndef __ISOBaseMedia_Support_hpp__ #define __ISOBaseMedia_Support_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "XMP_Const.h" #include "LargeFileAccess.hpp" // ================================================================================================= /// \file ISOBaseMedia_Support.hpp /// \brief XMPFiles support for the ISO Base Media File Format. /// /// \note These classes are for use only when directly compiled and linked. They should not be /// packaged in a DLL by themselves. They do not provide any form of C++ ABI protection. // ================================================================================================= namespace ISOMedia { enum { k_ftyp = 0x66747970UL, // File header Box, no version/flags. k_mp41 = 0x6D703431UL, // Compatible brand codes k_mp42 = 0x6D703432UL, k_f4v = 0x66347620UL, k_qt = 0x71742020UL, k_moov = 0x6D6F6F76UL, // Container Box, no version/flags. k_mvhd = 0x6D766864UL, // Data FullBox, has version/flags. k_hdlr = 0x68646C72UL, k_udta = 0x75647461UL, // Container Box, no version/flags. k_cprt = 0x63707274UL, // Data FullBox, has version/flags. k_uuid = 0x75756964UL, // Data Box, no version/flags. k_free = 0x66726565UL, // Free space Box, no version/flags. k_mdat = 0x6D646174UL, // Media data Box, no version/flags. k_trak = 0x7472616BUL, // Types for the QuickTime timecode track. k_tkhd = 0x746B6864UL, k_mdia = 0x6D646961UL, k_mdhd = 0x6D646864UL, k_tmcd = 0x746D6364UL, k_mhlr = 0x6D686C72UL, k_minf = 0x6D696E66UL, k_stbl = 0x7374626CUL, k_stsd = 0x73747364UL, k_stsc = 0x73747363UL, k_stco = 0x7374636FUL, k_co64 = 0x636F3634UL, k_meta = 0x6D657461UL, // Types for the iTunes metadata boxes. k_ilst = 0x696C7374UL, k_mdir = 0x6D646972UL, k_mean = 0x6D65616EUL, k_name = 0x6E616D65UL, k_data = 0x64617461UL, k_hyphens = 0x2D2D2D2DUL, k_skip = 0x736B6970UL, // Additional classic QuickTime top level boxes. k_wide = 0x77696465UL, k_pnot = 0x706E6F74UL, k_XMP_ = 0x584D505FUL // The QuickTime variant XMP box. }; static XMP_Uns32 k_xmpUUID [4] = { MakeUns32BE ( 0xBE7ACFCBUL ), MakeUns32BE ( 0x97A942E8UL ), MakeUns32BE ( 0x9C719994UL ), MakeUns32BE ( 0x91E3AFACUL ) }; struct BoxInfo { XMP_Uns32 boxType; // In memory as native endian! XMP_Uns32 headerSize; // Normally 8 or 16, less than 8 if available space is too small. XMP_Uns64 contentSize; // Always the real size, never 0 for "to EoF". BoxInfo() : boxType(0), headerSize(0), contentSize(0) {}; }; // Get basic info about a box in memory, returning a pointer to the following box. const XMP_Uns8 * GetBoxInfo ( const XMP_Uns8 * boxPtr, const XMP_Uns8 * boxLimit, BoxInfo * info, bool throwErrors = false ); // Get basic info about a box in a file, returning the offset of the following box. The I/O // pointer is left at the start of the box's content. Returns the offset of the following box. XMP_Uns64 GetBoxInfo ( LFA_FileRef fileRef, const XMP_Uns64 boxOffset, const XMP_Uns64 boxLimit, BoxInfo * info, bool doSeek = true, bool throwErrors = false ); // XMP_Uns32 CountChildBoxes ( LFA_FileRef fileRef, const XMP_Uns64 childOffset, const XMP_Uns64 childLimit ); } // namespace ISO_Media // ================================================================================================= #endif // __ISOBaseMedia_Support_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/Reconcile_Impl.cpp0000664000175000017500000003175712150230673021106 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "Reconcile_Impl.hpp" #include "UnicodeConversions.hpp" #if XMP_WinBuild #elif XMP_MacBuild #include #endif // ================================================================================================= /// \file Reconcile_Impl.cpp /// \brief Implementation utilities for the photo metadata reconciliation support. /// // ================================================================================================= // ================================================================================================= // ReconcileUtils::IsASCII // ======================= // // See if a string is 7 bit ASCII. bool ReconcileUtils::IsASCII ( const void * textPtr, size_t textLen ) { for ( const XMP_Uns8 * textPos = (XMP_Uns8*)textPtr; textLen > 0; --textLen, ++textPos ) { if ( *textPos >= 0x80 ) return false; } return true; } // ReconcileUtils::IsASCII // ================================================================================================= // ReconcileUtils::IsUTF8 // ====================== // // See if a string contains valid UTF-8. Allow nul bytes, they can appear inside of multi-part Exif // strings. We don't use CodePoint_from_UTF8_Multi in UnicodeConversions because it throws an // exception for non-Unicode and we don't need to actually compute the code points. bool ReconcileUtils::IsUTF8 ( const void * textPtr, size_t textLen ) { const XMP_Uns8 * textPos = (XMP_Uns8*)textPtr; const XMP_Uns8 * textEnd = textPos + textLen; while ( textPos < textEnd ) { if ( *textPos < 0x80 ) { ++textPos; // ASCII is UTF-8, tolerate nuls. } else { // ------------------------------------------------------------------------------------- // We've got a multibyte UTF-8 character. The first byte has the number of bytes as the // number of high order 1 bits. The remaining bytes must have 1 and 0 as the top 2 bits. #if 0 // *** This might be a more effcient way to count the bytes. static XMP_Uns8 kByteCounts[16] = { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 3, 4 }; size_t bytesNeeded = kByteCounts [ *textPos >> 4 ]; if ( (bytesNeeded < 2) || ((bytesNeeded == 4) && ((*textPos & 0x08) != 0)) ) return false; if ( (textPos + bytesNeeded) > textEnd ) return false; #endif size_t bytesNeeded = 0; // Count the high order 1 bits in the first byte. for ( XMP_Uns8 temp = *textPos; temp > 0x7F; temp = temp << 1 ) ++bytesNeeded; // *** Consider CPU-specific assembly inline, e.g. cntlzw on PowerPC. if ( (bytesNeeded < 2) || (bytesNeeded > 4) || ((textPos+bytesNeeded) > textEnd) ) return false; for ( --bytesNeeded, ++textPos; bytesNeeded > 0; --bytesNeeded, ++textPos ) { if ( (*textPos >> 6) != 2 ) return false; } } } return true; // ! Returns true for empty strings. } // ReconcileUtils::IsUTF8 // ================================================================================================= // UTF8ToHostEncoding // ================== #if XMP_WinBuild void ReconcileUtils::UTF8ToWinEncoding ( UINT codePage, const XMP_Uns8 * utf8Ptr, size_t utf8Len, std::string * host ) { std::string utf16; // WideCharToMultiByte wants native UTF-16. ToUTF16Native ( (UTF8Unit*)utf8Ptr, utf8Len, &utf16 ); LPCWSTR utf16Ptr = (LPCWSTR) utf16.c_str(); size_t utf16Len = utf16.size() / 2; int hostLen = WideCharToMultiByte ( codePage, 0, utf16Ptr, (int)utf16Len, 0, 0, 0, 0 ); host->assign ( hostLen, ' ' ); // Allocate space for the results. (void) WideCharToMultiByte ( codePage, 0, utf16Ptr, (int)utf16Len, (LPSTR)host->data(), hostLen, 0, 0 ); XMP_Assert ( hostLen == host->size() ); } // UTF8ToWinEncoding #elif XMP_MacBuild void ReconcileUtils::UTF8ToMacEncoding ( XMP_Uns16 macScript, XMP_Uns16 macLang, const XMP_Uns8 * utf8Ptr, size_t utf8Len, std::string * host ) { OSStatus err; TextEncoding destEncoding; if ( macLang == langUnspecified ) macLang = kTextLanguageDontCare; err = UpgradeScriptInfoToTextEncoding ( macScript, macLang, kTextRegionDontCare, 0, &destEncoding ); if ( err != noErr ) XMP_Throw ( "UpgradeScriptInfoToTextEncoding failed", kXMPErr_ExternalFailure ); UnicodeMapping mappingInfo; mappingInfo.mappingVersion = kUnicodeUseLatestMapping; mappingInfo.otherEncoding = GetTextEncodingBase ( destEncoding ); mappingInfo.unicodeEncoding = CreateTextEncoding ( kTextEncodingUnicodeDefault, kUnicodeNoSubset, kUnicodeUTF8Format ); UnicodeToTextInfo converterInfo; err = CreateUnicodeToTextInfo ( &mappingInfo, &converterInfo ); if ( err != noErr ) XMP_Throw ( "CreateUnicodeToTextInfo failed", kXMPErr_ExternalFailure ); try { // ! Need to call DisposeUnicodeToTextInfo before exiting. OptionBits convFlags = kUnicodeUseFallbacksMask | kUnicodeLooseMappingsMask | kUnicodeDefaultDirectionMask; ByteCount bytesRead, bytesWritten; enum { kBufferLen = 1000 }; // Ought to be enough in practice, without using too much stack. char buffer [kBufferLen]; host->reserve ( utf8Len ); // As good a guess as any. while ( utf8Len > 0 ) { // Ignore all errors from ConvertFromUnicodeToText. It returns info like "output // buffer full" or "use substitution" as errors. err = ConvertFromUnicodeToText ( converterInfo, utf8Len, (UniChar*)utf8Ptr, convFlags, 0, 0, 0, 0, kBufferLen, &bytesRead, &bytesWritten, buffer ); if ( bytesRead == 0 ) break; // Make sure forward progress happens. host->append ( &buffer[0], bytesWritten ); utf8Ptr += bytesRead; utf8Len -= bytesRead; } DisposeUnicodeToTextInfo ( &converterInfo ); } catch ( ... ) { DisposeUnicodeToTextInfo ( &converterInfo ); throw; } } // UTF8ToMacEncoding #elif XMP_UNIXBuild // ! Does not exist, must not be called, for Generic UNIX builds. #endif // ================================================================================================= // ReconcileUtils::UTF8ToLocal // =========================== void ReconcileUtils::UTF8ToLocal ( const void * _utf8Ptr, size_t utf8Len, std::string * local ) { const XMP_Uns8* utf8Ptr = (XMP_Uns8*)_utf8Ptr; local->erase(); if ( ReconcileUtils::IsASCII ( utf8Ptr, utf8Len ) ) { local->assign ( (const char *)utf8Ptr, utf8Len ); return; } #if XMP_WinBuild UTF8ToWinEncoding ( CP_ACP, utf8Ptr, utf8Len, local ); #elif XMP_MacBuild UTF8ToMacEncoding ( smSystemScript, kTextLanguageDontCare, utf8Ptr, utf8Len, local ); #elif XMP_UNIXBuild XMP_Throw ( "Generic UNIX does not have conversions between local and Unicode", kXMPErr_Unavailable ); #endif } // ReconcileUtils::UTF8ToLocal // ================================================================================================= // ReconcileUtils::UTF8ToLatin1 // ============================ void ReconcileUtils::UTF8ToLatin1 ( const void * _utf8Ptr, size_t utf8Len, std::string * latin1 ) { const XMP_Uns8* utf8Ptr = (XMP_Uns8*)_utf8Ptr; const XMP_Uns8* utf8End = utf8Ptr + utf8Len; latin1->erase(); latin1->reserve ( utf8Len ); // As good a guess as any, at least enough, exact for ASCII. bool inBadRun = false; while ( utf8Ptr < utf8End ) { if ( *utf8Ptr <= 0x7F ) { (*latin1) += (char)*utf8Ptr; // Have an ASCII character. inBadRun = false; ++utf8Ptr; } else if ( utf8Ptr == (utf8End - 1) ) { inBadRun = false; ++utf8Ptr; // Ignore a bad end to the UTF-8. } else { XMP_Assert ( (utf8End - utf8Ptr) >= 2 ); XMP_Uns16 ch16 = GetUns16BE ( utf8Ptr ); // A Latin-1 80..FF is 2 UTF-8 bytes. if ( (0xC280 <= ch16) && (ch16 <= 0xC2BF) ) { (*latin1) += (char)(ch16 & 0xFF); // UTF-8 C280..C2BF are Latin-1 80..BF. inBadRun = false; utf8Ptr += 2; } else if ( (0xC380 <= ch16) && (ch16 <= 0xC3BF) ) { (*latin1) += (char)((ch16 & 0xFF) + 0x40); // UTF-8 C380..C3BF are Latin-1 C0..FF. inBadRun = false; utf8Ptr += 2; } else { if ( ! inBadRun ) { inBadRun = true; (*latin1) += "(?)"; // Mark the run of out of scope UTF-8. } ++utf8Ptr; // Skip the presumably well-formed UTF-8 character. while ( (utf8Ptr < utf8End) && ((*utf8Ptr & 0xC0) == 0x80) ) ++utf8Ptr; } } } XMP_Assert ( utf8Ptr == utf8End ); } // ReconcileUtils::UTF8ToLatin1 // ================================================================================================= // HostEncodingToUTF8 // ================== #if XMP_WinBuild void ReconcileUtils::WinEncodingToUTF8 ( UINT codePage, const XMP_Uns8 * hostPtr, size_t hostLen, std::string * utf8 ) { int utf16Len = MultiByteToWideChar ( codePage, 0, (LPCSTR)hostPtr, (int)hostLen, 0, 0 ); std::vector utf16 ( utf16Len, 0 ); // MultiByteToWideChar returns native UTF-16. (void) MultiByteToWideChar ( codePage, 0, (LPCSTR)hostPtr, (int)hostLen, (LPWSTR)&utf16[0], utf16Len ); FromUTF16Native ( &utf16[0], (int)utf16Len, utf8 ); } // WinEncodingToUTF8 #elif XMP_MacBuild void ReconcileUtils::MacEncodingToUTF8 ( XMP_Uns16 macScript, XMP_Uns16 macLang, const XMP_Uns8 * hostPtr, size_t hostLen, std::string * utf8 ) { OSStatus err; TextEncoding srcEncoding; if ( macLang == langUnspecified ) macLang = kTextLanguageDontCare; err = UpgradeScriptInfoToTextEncoding ( macScript, macLang, kTextRegionDontCare, 0, &srcEncoding ); if ( err != noErr ) XMP_Throw ( "UpgradeScriptInfoToTextEncoding failed", kXMPErr_ExternalFailure ); UnicodeMapping mappingInfo; mappingInfo.mappingVersion = kUnicodeUseLatestMapping; mappingInfo.otherEncoding = GetTextEncodingBase ( srcEncoding ); mappingInfo.unicodeEncoding = CreateTextEncoding ( kTextEncodingUnicodeDefault, kUnicodeNoSubset, kUnicodeUTF8Format ); TextToUnicodeInfo converterInfo; err = CreateTextToUnicodeInfo ( &mappingInfo, &converterInfo ); if ( err != noErr ) XMP_Throw ( "CreateTextToUnicodeInfo failed", kXMPErr_ExternalFailure ); try { // ! Need to call DisposeTextToUnicodeInfo before exiting. ByteCount bytesRead, bytesWritten; enum { kBufferLen = 1000 }; // Ought to be enough in practice, without using too much stack. char buffer [kBufferLen]; utf8->reserve ( hostLen ); // As good a guess as any. while ( hostLen > 0 ) { // Ignore all errors from ConvertFromTextToUnicode. It returns info like "output // buffer full" or "use substitution" as errors. err = ConvertFromTextToUnicode ( converterInfo, hostLen, hostPtr, kNilOptions, 0, 0, 0, 0, kBufferLen, &bytesRead, &bytesWritten, (UniChar*)buffer ); if ( bytesRead == 0 ) break; // Make sure forward progress happens. utf8->append ( &buffer[0], bytesWritten ); hostPtr += bytesRead; hostLen -= bytesRead; } DisposeTextToUnicodeInfo ( &converterInfo ); } catch ( ... ) { DisposeTextToUnicodeInfo ( &converterInfo ); throw; } } // MacEncodingToUTF8 #elif XMP_UNIXBuild // ! Does not exist, must not be called, for Generic UNIX builds. #endif // ================================================================================================= // ReconcileUtils::LocalToUTF8 // =========================== void ReconcileUtils::LocalToUTF8 ( const void * _localPtr, size_t localLen, std::string * utf8 ) { const XMP_Uns8* localPtr = (XMP_Uns8*)_localPtr; utf8->erase(); if ( ReconcileUtils::IsASCII ( localPtr, localLen ) ) { utf8->assign ( (const char *)localPtr, localLen ); return; } #if XMP_WinBuild WinEncodingToUTF8 ( CP_ACP, localPtr, localLen, utf8 ); #elif XMP_MacBuild MacEncodingToUTF8 ( smSystemScript, kTextLanguageDontCare, localPtr, localLen, utf8 ); #elif XMP_UNIXBuild XMP_Throw ( "Generic UNIX does not have conversions between local and Unicode", kXMPErr_Unavailable ); #endif } // ReconcileUtils::LocalToUTF8 // ================================================================================================= // ReconcileUtils::Latin1ToUTF8 // ============================ void ReconcileUtils::Latin1ToUTF8 ( const void * _latin1Ptr, size_t latin1Len, std::string * utf8 ) { const XMP_Uns8* latin1Ptr = (XMP_Uns8*)_latin1Ptr; const XMP_Uns8* latin1End = latin1Ptr + latin1Len; utf8->erase(); utf8->reserve ( latin1Len ); // As good a guess as any, exact for ASCII. for ( ; latin1Ptr < latin1End; ++latin1Ptr ) { XMP_Uns8 ch8 = *latin1Ptr; if ( ch8 <= 0x7F ) { (*utf8) += (char)ch8; // Have an ASCII character. } else if ( ch8 <= 0xBF ) { (*utf8) += 0xC2; // Latin-1 80..BF are UTF-8 C280..C2BF. (*utf8) += (char)ch8; } else { (*utf8) += 0xC3; // Latin-1 C0..FF are UTF-8 C380..C3BF. (*utf8) += (char)(ch8 - 0x40); } } } // ReconcileUtils::Latin1ToUTF8 exempi-2.2.1/source/XMPFiles/FormatSupport/PSIR_FileWriter.cpp0000664000175000017500000004720212150230672021122 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "PSIR_Support.hpp" #include "EndianUtils.hpp" #include // ================================================================================================= /// \file PSIR_FileWriter.cpp /// \brief Implementation of the file-based or read-write form of PSIR_Manager. // ================================================================================================= // ================================================================================================= // IsMetadataImgRsrc // ================= static inline bool IsMetadataImgRsrc ( XMP_Uns16 id ) { if ( id == 0 ) return false; int i; for ( i = 0; id < kPSIR_MetadataIDs[i]; ++i ) {} if ( id == kPSIR_MetadataIDs[i] ) return true; return false; } // IsMetadataImgRsrc // ================================================================================================= // PSIR_FileWriter::DeleteExistingInfo // =================================== // // Delete all existing info about image resources. void PSIR_FileWriter::DeleteExistingInfo() { XMP_Assert ( ! (this->memParsed && this->fileParsed) ); if ( this->memParsed ) { if ( this->ownedContent ) free ( this->memContent ); } else { InternalRsrcMap::iterator irPos = this->imgRsrcs.begin(); InternalRsrcMap::iterator irEnd = this->imgRsrcs.end(); for ( ; irPos != irEnd; ++irPos ) irPos->second.changed = true; // Fool the InternalRsrcInfo destructor. } this->imgRsrcs.clear(); this->memContent = 0; this->memLength = 0; this->changed = false; this->legacyDeleted = false; this->memParsed = false; this->fileParsed = false; this->ownedContent = false; } // PSIR_FileWriter::DeleteExistingInfo // ================================================================================================= // PSIR_FileWriter::~PSIR_FileWriter // ================================= PSIR_FileWriter::~PSIR_FileWriter() { XMP_Assert ( ! (this->memParsed && this->fileParsed) ); if ( this->ownedContent ) { XMP_Assert ( this->memContent != 0 ); free ( this->memContent ); } } // PSIR_FileWriter::~PSIR_FileWriter // ================================================================================================= // PSIR_FileWriter::GetImgRsrc // =========================== bool PSIR_FileWriter::GetImgRsrc ( XMP_Uns16 id, ImgRsrcInfo* info ) const { InternalRsrcMap::const_iterator rsrcPos = this->imgRsrcs.find ( id ); if ( rsrcPos == this->imgRsrcs.end() ) return false; const InternalRsrcInfo & rsrcInfo = rsrcPos->second; if ( info != 0 ) { info->id = rsrcInfo.id; info->dataLen = rsrcInfo.dataLen; info->dataPtr = rsrcInfo.dataPtr; info->origOffset = rsrcInfo.origOffset; } return true; } // PSIR_FileWriter::GetImgRsrc // ================================================================================================= // PSIR_FileWriter::SetImgRsrc // =========================== void PSIR_FileWriter::SetImgRsrc ( XMP_Uns16 id, const void* clientPtr, XMP_Uns32 length ) { InternalRsrcInfo* rsrcPtr = 0; InternalRsrcMap::iterator rsrcPos = this->imgRsrcs.find ( id ); if ( rsrcPos == this->imgRsrcs.end() ) { // This resource is not yet in the map, create the map entry. InternalRsrcMap::value_type mapValue ( id, InternalRsrcInfo ( id, length, this->fileParsed ) ); rsrcPos = this->imgRsrcs.insert ( rsrcPos, mapValue ); rsrcPtr = &rsrcPos->second; } else { rsrcPtr = &rsrcPos->second; // The resource already exists, make sure the value is actually changing. if ( (length == rsrcPtr->dataLen) && (memcmp ( rsrcPtr->dataPtr, clientPtr, length ) == 0) ) { return; } rsrcPtr->FreeData(); // Release any existing data allocation. rsrcPtr->dataLen = length; // And this might be changing. } rsrcPtr->changed = true; rsrcPtr->dataPtr = malloc ( length ); if ( rsrcPtr->dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); memcpy ( rsrcPtr->dataPtr, clientPtr, length ); // AUDIT: Safe, malloc'ed length bytes above. this->changed = true; } // PSIR_FileWriter::SetImgRsrc // ================================================================================================= // PSIR_FileWriter::DeleteImgRsrc // ============================== void PSIR_FileWriter::DeleteImgRsrc ( XMP_Uns16 id ) { InternalRsrcMap::iterator rsrcPos = this->imgRsrcs.find ( id ); if ( rsrcPos == this->imgRsrcs.end() ) return; // Nothing to delete. this->imgRsrcs.erase ( id ); this->changed = true; if ( id != kPSIR_XMP ) this->legacyDeleted = true; } // PSIR_FileWriter::DeleteImgRsrc // ================================================================================================= // PSIR_FileWriter::IsLegacyChanged // ================================ bool PSIR_FileWriter::IsLegacyChanged() { if ( ! this->changed ) return false; if ( this->legacyDeleted ) return true; InternalRsrcMap::iterator irPos = this->imgRsrcs.begin(); InternalRsrcMap::iterator irEnd = this->imgRsrcs.end(); for ( ; irPos != irEnd; ++irPos ) { const InternalRsrcInfo & rsrcInfo = irPos->second; if ( rsrcInfo.changed && (rsrcInfo.id != kPSIR_XMP) ) return true; } return false; // Can get here if the XMP is the only thing changed. } // PSIR_FileWriter::IsLegacyChanged // ================================================================================================= // PSIR_FileWriter::ParseMemoryResources // ===================================== void PSIR_FileWriter::ParseMemoryResources ( const void* data, XMP_Uns32 length, bool copyData /* = true */ ) { this->DeleteExistingInfo(); this->memParsed = true; if ( length == 0 ) return; // Allocate space for the full in-memory data and copy it. if ( ! copyData ) { this->memContent = (XMP_Uns8*) data; XMP_Assert ( ! this->ownedContent ); } else { if ( length > 100*1024*1024 ) XMP_Throw ( "Outrageous length for memory-based PSIR", kXMPErr_BadPSIR ); this->memContent = (XMP_Uns8*) malloc ( length ); if ( this->memContent == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); memcpy ( this->memContent, data, length ); // AUDIT: Safe, malloc'ed length bytes above. this->ownedContent = true; } this->memLength = length; // Capture the info for all of the resources. XMP_Uns8* psirPtr = this->memContent; XMP_Uns8* psirEnd = psirPtr + length; XMP_Uns8* psirLimit = psirEnd - kMinImgRsrcSize; while ( psirPtr <= psirLimit ) { XMP_Uns8* origin = psirPtr; // The beginning of this resource. XMP_Uns32 type = GetUns32BE(psirPtr); XMP_Uns16 id = GetUns16BE(psirPtr+4); psirPtr += 6; // Advance to the resource name. XMP_Uns8* namePtr = psirPtr; XMP_Uns16 nameLen = namePtr[0]; // ! The length for the Pascal string, w/ room for "+2". psirPtr += ((nameLen + 2) & 0xFFFE); // ! Round up to an even offset. Yes, +2! if ( psirPtr > psirEnd-4 ) break; // Bad image resource. Throw instead? XMP_Uns32 dataLen = GetUns32BE(psirPtr); psirPtr += 4; // Advance to the resource data. XMP_Uns32 dataOffset = (XMP_Uns32) ( psirPtr - this->memContent ); XMP_Uns8* nextRsrc = psirPtr + ((dataLen + 1) & 0xFFFFFFFEUL); // ! Round up to an even offset. if ( (dataLen > length) || (psirPtr > psirEnd-dataLen) ) break; // Bad image resource. Throw instead? if ( type == k8BIM ) { InternalRsrcMap::value_type mapValue ( id, InternalRsrcInfo ( id, dataLen, kIsMemoryBased ) ); InternalRsrcMap::iterator rsrcPos = this->imgRsrcs.insert ( this->imgRsrcs.end(), mapValue ); InternalRsrcInfo* rsrcPtr = &rsrcPos->second; rsrcPtr->dataPtr = psirPtr; rsrcPtr->origOffset = dataOffset; if ( nameLen != 0 ) rsrcPtr->rsrcName = namePtr; } else { XMP_Uns32 rsrcOffset = XMP_Uns32( origin - this->memContent ); XMP_Uns32 rsrcLength = XMP_Uns32( nextRsrc - origin ); // Includes trailing pad. XMP_Assert ( (rsrcLength & 1) == 0 ); this->otherRsrcs.push_back ( OtherRsrcInfo ( rsrcOffset, rsrcLength ) ); } psirPtr = nextRsrc; } } // PSIR_FileWriter::ParseMemoryResources // ================================================================================================= // PSIR_FileWriter::ParseFileResources // =================================== void PSIR_FileWriter::ParseFileResources ( LFA_FileRef fileRef, XMP_Uns32 length ) { bool ok; this->DeleteExistingInfo(); this->fileParsed = true; if ( length == 0 ) return; // Parse the image resource block. IOBuffer ioBuf; ioBuf.filePos = LFA_Seek ( fileRef, 0, SEEK_CUR ); XMP_Int64 psirOrigin = ioBuf.filePos; // Need this to determine the resource data offsets. XMP_Int64 fileEnd = ioBuf.filePos + length; std::string rsrcPName; while ( (ioBuf.filePos + (ioBuf.ptr - ioBuf.data)) < fileEnd ) { ok = CheckFileSpace ( fileRef, &ioBuf, 12 ); // The minimal image resource takes 12 bytes. if ( ! ok ) break; // Bad image resource. Throw instead? XMP_Int64 thisRsrcPos = ioBuf.filePos + (ioBuf.ptr - ioBuf.data); XMP_Uns32 type = GetUns32BE(ioBuf.ptr); XMP_Uns16 id = GetUns16BE(ioBuf.ptr+4); ioBuf.ptr += 6; // Advance to the resource name. XMP_Uns16 nameLen = ioBuf.ptr[0]; // ! The length for the Pascal string. XMP_Uns16 paddedLen = (nameLen + 2) & 0xFFFE; // ! Round up to an even total. Yes, +2! ok = CheckFileSpace ( fileRef, &ioBuf, paddedLen+4 ); // Get the name text and the data length. if ( ! ok ) break; // Bad image resource. Throw instead? if ( nameLen > 0 ) rsrcPName.assign ( (char*)(ioBuf.ptr), paddedLen ); // ! Include the length byte and pad. ioBuf.ptr += paddedLen; // Move to the data length. XMP_Uns32 dataLen = GetUns32BE(ioBuf.ptr); XMP_Uns32 dataTotal = ((dataLen + 1) & 0xFFFFFFFEUL); // Round up to an even total. ioBuf.ptr += 4; // Advance to the resource data. XMP_Int64 thisDataPos = ioBuf.filePos + (ioBuf.ptr - ioBuf.data); XMP_Int64 nextRsrcPos = thisDataPos + dataTotal; if ( type != k8BIM ) { XMP_Uns32 fullRsrcLen = (XMP_Uns32) (nextRsrcPos - thisRsrcPos); this->otherRsrcs.push_back ( OtherRsrcInfo ( (XMP_Uns32)thisRsrcPos, fullRsrcLen ) ); MoveToOffset ( fileRef, nextRsrcPos, &ioBuf ); continue; } InternalRsrcMap::value_type mapValue ( id, InternalRsrcInfo ( id, dataLen, kIsFileBased ) ); InternalRsrcMap::iterator newRsrc = this->imgRsrcs.insert ( this->imgRsrcs.end(), mapValue ); InternalRsrcInfo* rsrcPtr = &newRsrc->second; rsrcPtr->origOffset = (XMP_Uns32)thisDataPos; if ( nameLen > 0 ) { rsrcPtr->rsrcName = (XMP_Uns8*) malloc ( paddedLen ); if ( rsrcPtr->rsrcName == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); memcpy ( (void*)rsrcPtr->rsrcName, rsrcPName.c_str(), paddedLen ); // AUDIT: Safe, allocated enough bytes above. } if ( ! IsMetadataImgRsrc ( id ) ) { MoveToOffset ( fileRef, nextRsrcPos, &ioBuf ); continue; } rsrcPtr->dataPtr = malloc ( dataLen ); // ! Allocate after the IsMetadataImgRsrc check. if ( rsrcPtr->dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); if ( dataTotal <= kIOBufferSize ) { // The image resource data fits within the I/O buffer. ok = CheckFileSpace ( fileRef, &ioBuf, dataTotal ); if ( ! ok ) break; // Bad image resource. Throw instead? memcpy ( (void*)rsrcPtr->dataPtr, ioBuf.ptr, dataLen ); // AUDIT: Safe, malloc'ed dataLen bytes above. ioBuf.ptr += dataTotal; // ! Add the rounded length. } else { // The image resource data is bigger than the I/O buffer. LFA_Seek ( fileRef, (ioBuf.filePos + (ioBuf.ptr - ioBuf.data)), SEEK_SET ); LFA_Read ( fileRef, (void*)rsrcPtr->dataPtr, dataLen ); FillBuffer ( fileRef, nextRsrcPos, &ioBuf ); } } #if 0 { printf ( "\nPSIR_FileWriter::ParseFileResources, count = %d\n", this->imgRsrcs.size() ); InternalRsrcMap::iterator irPos = this->imgRsrcs.begin(); InternalRsrcMap::iterator irEnd = this->imgRsrcs.end(); for ( ; irPos != irEnd; ++irPos ) { InternalRsrcInfo& thisRsrc = irPos->second; printf ( " #%d, dataLen %d, origOffset %d (0x%X)%s\n", thisRsrc.id, thisRsrc.dataLen, thisRsrc.origOffset, thisRsrc.origOffset, (thisRsrc.changed ? ", changed" : "") ); } } #endif } // PSIR_FileWriter::ParseFileResources // ================================================================================================= // PSIR_FileWriter::UpdateMemoryResources // ====================================== XMP_Uns32 PSIR_FileWriter::UpdateMemoryResources ( void** dataPtr ) { if ( this->fileParsed ) XMP_Throw ( "Not memory based", kXMPErr_EnforceFailure ); // Compute the size and allocate the new image resource block. XMP_Uns32 newLength = 0; InternalRsrcMap::iterator irPos = this->imgRsrcs.begin(); InternalRsrcMap::iterator irEnd = this->imgRsrcs.end(); for ( ; irPos != irEnd; ++irPos ) { // Add in the lengths for the 8BIM resources. const InternalRsrcInfo & rsrcInfo = irPos->second; newLength += 10; newLength += ((rsrcInfo.dataLen + 1) & 0xFFFFFFFEUL); if ( rsrcInfo.rsrcName == 0 ) { newLength += 2; } else { XMP_Uns32 nameLen = rsrcInfo.rsrcName[0]; newLength += ((nameLen + 2) & 0xFFFFFFFEUL); // ! Yes, +2. } } for ( size_t i = 0; i < this->otherRsrcs.size(); ++i ) { // Add in the non-8BIM resources. newLength += this->otherRsrcs[i].rsrcLength; } XMP_Uns8* newContent = (XMP_Uns8*) malloc ( newLength ); if ( newContent == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); // Fill in the new image resource block. XMP_Uns8* rsrcPtr = newContent; for ( irPos = this->imgRsrcs.begin(); irPos != irEnd; ++irPos ) { // Do the 8BIM resources. const InternalRsrcInfo & rsrcInfo = irPos->second; PutUns32BE ( k8BIM, rsrcPtr ); rsrcPtr += 4; PutUns16BE ( rsrcInfo.id, rsrcPtr ); rsrcPtr += 2; if ( rsrcInfo.rsrcName == 0 ) { PutUns16BE ( 0, rsrcPtr ); rsrcPtr += 2; } else { XMP_Uns32 nameLen = rsrcInfo.rsrcName[0]; if ( (nameLen+1) > (newLength - (rsrcPtr - newContent)) ) { XMP_Throw ( "Buffer overrun", kXMPErr_InternalFailure ); } memcpy ( rsrcPtr, rsrcInfo.rsrcName, nameLen+1 ); // AUDIT: Protected by the above check. rsrcPtr += nameLen+1; if ( (nameLen & 1) == 0 ) { *rsrcPtr = 0; ++rsrcPtr; } } PutUns32BE ( rsrcInfo.dataLen, rsrcPtr ); rsrcPtr += 4; if ( rsrcInfo.dataLen > (newLength - (rsrcPtr - newContent)) ) { XMP_Throw ( "Buffer overrun", kXMPErr_InternalFailure ); } memcpy ( rsrcPtr, rsrcInfo.dataPtr, rsrcInfo.dataLen ); // AUDIT: Protected by the above check. rsrcPtr += rsrcInfo.dataLen; if ( (rsrcInfo.dataLen & 1) != 0 ) { // Pad to an even length if necessary. *rsrcPtr = 0; ++rsrcPtr; } } for ( size_t i = 0; i < this->otherRsrcs.size(); ++i ) { // Do the non-8BIM resources. XMP_Uns8* srcPtr = this->memContent + this->otherRsrcs[i].rsrcOffset; XMP_Uns32 srcLen = this->otherRsrcs[i].rsrcLength; if ( srcLen > (newLength - (rsrcPtr - newContent)) ) { XMP_Throw ( "Buffer overrun", kXMPErr_InternalFailure ); } memcpy ( rsrcPtr, srcPtr, srcLen ); // AUDIT: Protected by the above check. rsrcPtr += srcLen; // No need to pad, included in the original resource length. } XMP_Assert ( rsrcPtr == (newContent + newLength) ); // Parse the rebuilt image resource block. This is the easiest way to reconstruct the map. this->ParseMemoryResources ( newContent, newLength, false ); this->ownedContent = (newLength > 0); // ! We really do own the new content, if not empty. if ( dataPtr != 0 ) *dataPtr = newContent; return newLength; } // PSIR_FileWriter::UpdateMemoryResources // ================================================================================================= // PSIR_FileWriter::UpdateFileResources // ==================================== XMP_Uns32 PSIR_FileWriter::UpdateFileResources ( LFA_FileRef sourceRef, LFA_FileRef destRef, IOBuffer * ioBuf, XMP_AbortProc abortProc, void * abortArg ) { IgnoreParam(ioBuf); const XMP_Uns32 zero32 = 0; const bool checkAbort = (abortProc != 0); struct RsrcHeader { XMP_Uns32 type; XMP_Uns16 id; }; XMP_Assert ( (offsetof(RsrcHeader,type) == 0) && (offsetof(RsrcHeader,id) == 4) ); if ( this->memParsed ) XMP_Throw ( "Not file based", kXMPErr_EnforceFailure ); XMP_Int64 destLenOffset = LFA_Seek ( destRef, 0, SEEK_CUR ); XMP_Uns32 destLength = 0; LFA_Write ( destRef, &destLength, 4 ); // Write a placeholder for the new PSIR section length. #if 0 { printf ( "\nPSIR_FileWriter::UpdateFileResources, count = %d\n", this->imgRsrcs.size() ); InternalRsrcMap::iterator irPos = this->imgRsrcs.begin(); InternalRsrcMap::iterator irEnd = this->imgRsrcs.end(); for ( ; irPos != irEnd; ++irPos ) { InternalRsrcInfo& thisRsrc = irPos->second; printf ( " #%d, dataLen %d, origOffset %d (0x%X)%s\n", thisRsrc.id, thisRsrc.dataLen, thisRsrc.origOffset, thisRsrc.origOffset, (thisRsrc.changed ? ", changed" : "") ); } } #endif // First write all of the '8BIM' resources from the map. Use the internal data if present, else // copy the data from the file. RsrcHeader outHeader; outHeader.type = MakeUns32BE ( k8BIM ); InternalRsrcMap::iterator rsrcPos = this->imgRsrcs.begin(); InternalRsrcMap::iterator rsrcEnd = this->imgRsrcs.end(); // printf ( "\nPSIR_FileWriter::UpdateFileResources - 8BIM resources\n" ); for ( ; rsrcPos != rsrcEnd; ++rsrcPos ) { InternalRsrcInfo& currRsrc = rsrcPos->second; outHeader.id = MakeUns16BE ( currRsrc.id ); LFA_Write ( destRef, &outHeader, 6 ); destLength += 6; if ( currRsrc.rsrcName == 0 ) { LFA_Write ( destRef, &zero32, 2 ); destLength += 2; } else { XMP_Assert ( currRsrc.rsrcName[0] != 0 ); XMP_Uns16 nameLen = currRsrc.rsrcName[0]; // ! Include room for +1. XMP_Uns16 paddedLen = (nameLen + 2) & 0xFFFE; // ! Round up to an even total. Yes, +2! LFA_Write ( destRef, currRsrc.rsrcName, paddedLen ); destLength += paddedLen; } XMP_Uns32 dataLen = MakeUns32BE ( currRsrc.dataLen ); LFA_Write ( destRef, &dataLen, 4 ); // printf ( " #%d, offset %d (0x%X), dataLen %d\n", currRsrc.id, destLength, destLength, currRsrc.dataLen ); if ( currRsrc.dataPtr != 0 ) { LFA_Write ( destRef, currRsrc.dataPtr, currRsrc.dataLen ); } else { LFA_Seek ( sourceRef, currRsrc.origOffset, SEEK_SET ); LFA_Copy ( sourceRef, destRef, currRsrc.dataLen ); } destLength += 4 + currRsrc.dataLen; if ( (currRsrc.dataLen & 1) != 0 ) { LFA_Write ( destRef, &zero32, 1 ); // ! Pad the data to an even length. ++destLength; } } // Now write all of the non-8BIM resources. Copy the entire resource chunk from the source file. // printf ( "\nPSIR_FileWriter::UpdateFileResources - other resources\n" ); for ( size_t i = 0; i < this->otherRsrcs.size(); ++i ) { // printf ( " offset %d (0x%X), length %d", // this->otherRsrcs[i].rsrcOffset, this->otherRsrcs[i].rsrcOffset, this->otherRsrcs[i].rsrcLength ); LFA_Seek ( sourceRef, this->otherRsrcs[i].rsrcOffset, SEEK_SET ); LFA_Copy ( sourceRef, destRef, this->otherRsrcs[i].rsrcLength ); destLength += this->otherRsrcs[i].rsrcLength; // Alignment padding is already included. } // Write the final PSIR section length, seek back to the end of the file, return the length. // printf ( "\nPSIR_FileWriter::UpdateFileResources - final length %d (0x%X)\n", destLength, destLength ); LFA_Seek ( destRef, destLenOffset, SEEK_SET ); XMP_Uns32 outLen = MakeUns32BE ( destLength ); LFA_Write ( destRef, &outLen, 4 ); LFA_Seek ( destRef, 0, SEEK_END ); // *** Not rebuilding the internal map - turns out we never want it, why pay for the I/O. // *** Should probably add an option for all of these cases, memory and file based. return destLength; } // PSIR_FileWriter::UpdateFileResources exempi-2.2.1/source/XMPFiles/FormatSupport/TIFF_Support.cpp0000664000175000017500000003260012150230673020472 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "TIFF_Support.hpp" #include "EndianUtils.hpp" #include "UnicodeConversions.hpp" // ================================================================================================= /// \file TIFF_Support.cpp /// \brief Manager for parsing and serializing TIFF streams. /// // ================================================================================================= // ================================================================================================= // TIFF_Manager::TIFF_Manager // ========================== static bool sFirstCTor = true; TIFF_Manager::TIFF_Manager() : bigEndian(false), nativeEndian(false), GetUns16(0), GetUns32(0), GetFloat(0), GetDouble(0), PutUns16(0), PutUns32(0), PutFloat(0), PutDouble(0) { if ( sFirstCTor ) { sFirstCTor = false; #if XMP_DebugBuild for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { // Make sure the known tag arrays are sorted. for ( const XMP_Uns16* idPtr = sKnownTags[ifd]; *idPtr != 0xFFFF; ++idPtr ) { XMP_Assert ( *idPtr < *(idPtr+1) ); } } #endif } } // TIFF_Manager::TIFF_Manager // ================================================================================================= // TIFF_Manager::CheckTIFFHeader // ============================= // // Checks the 4 byte TIFF prefix for validity and endianness. Sets the endian flags and the Get // function pointers. Returns the 0th IFD offset. XMP_Uns32 TIFF_Manager::CheckTIFFHeader ( const XMP_Uns8* tiffPtr, XMP_Uns32 length ) { if ( length < kEmptyTIFFLength ) XMP_Throw ( "The TIFF is too small", kXMPErr_BadTIFF ); XMP_Uns32 tiffPrefix = (tiffPtr[0] << 24) | (tiffPtr[1] << 16) | (tiffPtr[2] << 8) | (tiffPtr[3]); if ( tiffPrefix == kBigEndianPrefix ) { this->bigEndian = true; } else if ( tiffPrefix == kLittleEndianPrefix ) { this->bigEndian = false; } else { XMP_Throw ( "Unrecognized TIFF prefix", kXMPErr_BadTIFF ); } this->nativeEndian = (this->bigEndian == kBigEndianHost); if ( this->bigEndian ) { this->GetUns16 = GetUns16BE; this->GetUns32 = GetUns32BE; this->GetFloat = GetFloatBE; this->GetDouble = GetDoubleBE; this->PutUns16 = PutUns16BE; this->PutUns32 = PutUns32BE; this->PutFloat = PutFloatBE; this->PutDouble = PutDoubleBE; } else { this->GetUns16 = GetUns16LE; this->GetUns32 = GetUns32LE; this->GetFloat = GetFloatLE; this->GetDouble = GetDoubleLE; this->PutUns16 = PutUns16LE; this->PutUns32 = PutUns32LE; this->PutFloat = PutFloatLE; this->PutDouble = PutDoubleLE; } XMP_Uns32 mainIFDOffset = this->GetUns32 ( tiffPtr+4 ); // ! Do this after setting the Get/Put procs! if ( mainIFDOffset != 0 ) { // Tolerate empty TIFF even though formally invalid. if ( (length < (kEmptyTIFFLength + kEmptyIFDLength)) || (mainIFDOffset < kEmptyTIFFLength) || (mainIFDOffset > (length - kEmptyIFDLength)) ) { XMP_Throw ( "Invalid primary IFD offset", kXMPErr_BadTIFF ); } } return mainIFDOffset; } // TIFF_Manager::CheckTIFFHeader // ================================================================================================= // TIFF_Manager::SetTag_Integer // ============================ void TIFF_Manager::SetTag_Integer ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32 data32 ) { if ( data32 > 0xFFFF ) { this->SetTag ( ifd, id, kTIFF_LongType, 1, &data32 ); } else { XMP_Uns16 data16 = (XMP_Uns16)data32; this->SetTag ( ifd, id, kTIFF_ShortType, 1, &data16 ); } } // TIFF_Manager::SetTag_Integer // ================================================================================================= // TIFF_Manager::SetTag_Byte // ========================= void TIFF_Manager::SetTag_Byte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns8 data ) { this->SetTag ( ifd, id, kTIFF_ByteType, 1, &data ); } // TIFF_Manager::SetTag_Byte // ================================================================================================= // TIFF_Manager::SetTag_SByte // ========================== void TIFF_Manager::SetTag_SByte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int8 data ) { this->SetTag ( ifd, id, kTIFF_SByteType, 1, &data ); } // TIFF_Manager::SetTag_SByte // ================================================================================================= // TIFF_Manager::SetTag_Short // ========================== void TIFF_Manager::SetTag_Short ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16 clientData ) { XMP_Uns16 streamData; this->PutUns16 ( clientData, &streamData ); this->SetTag ( ifd, id, kTIFF_ShortType, 1, &streamData ); } // TIFF_Manager::SetTag_Short // ================================================================================================= // TIFF_Manager::SetTag_SShort // =========================== void TIFF_Manager::SetTag_SShort ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int16 clientData ) { XMP_Int16 streamData; this->PutUns16 ( (XMP_Uns16)clientData, &streamData ); this->SetTag ( ifd, id, kTIFF_SShortType, 1, &streamData ); } // TIFF_Manager::SetTag_SShort // ================================================================================================= // TIFF_Manager::SetTag_Long // ========================= void TIFF_Manager::SetTag_Long ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32 clientData ) { XMP_Uns32 streamData; this->PutUns32 ( clientData, &streamData ); this->SetTag ( ifd, id, kTIFF_LongType, 1, &streamData ); } // TIFF_Manager::SetTag_Long // ================================================================================================= // TIFF_Manager::SetTag_SLong // ========================== void TIFF_Manager::SetTag_SLong ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int32 clientData ) { XMP_Int32 streamData; this->PutUns32 ( (XMP_Uns32)clientData, &streamData ); this->SetTag ( ifd, id, kTIFF_SLongType, 1, &streamData ); } // TIFF_Manager::SetTag_SLong // ================================================================================================= // TIFF_Manager::SetTag_Rational // ============================= struct StreamRational { XMP_Uns32 num, denom; }; void TIFF_Manager::SetTag_Rational ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32 clientNum, XMP_Uns32 clientDenom ) { StreamRational streamData; this->PutUns32 ( clientNum, &streamData.num ); this->PutUns32 ( clientDenom, &streamData.denom ); this->SetTag ( ifd, id, kTIFF_RationalType, 1, &streamData ); } // TIFF_Manager::SetTag_Rational // ================================================================================================= // TIFF_Manager::SetTag_SRational // ============================== void TIFF_Manager::SetTag_SRational ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int32 clientNum, XMP_Int32 clientDenom ) { StreamRational streamData; this->PutUns32 ( (XMP_Uns32)clientNum, &streamData.num ); this->PutUns32 ( (XMP_Uns32)clientDenom, &streamData.denom ); this->SetTag ( ifd, id, kTIFF_SRationalType, 1, &streamData ); } // TIFF_Manager::SetTag_SRational // ================================================================================================= // TIFF_Manager::SetTag_Float // ========================== void TIFF_Manager::SetTag_Float ( XMP_Uns8 ifd, XMP_Uns16 id, float clientData ) { float streamData; this->PutFloat ( clientData, &streamData ); this->SetTag ( ifd, id, kTIFF_FloatType, 1, &streamData ); } // TIFF_Manager::SetTag_Float // ================================================================================================= // TIFF_Manager::SetTag_Double // =========================== void TIFF_Manager::SetTag_Double ( XMP_Uns8 ifd, XMP_Uns16 id, double clientData ) { double streamData; this->PutDouble ( clientData, &streamData ); this->SetTag ( ifd, id, kTIFF_DoubleType, 1, &streamData ); } // TIFF_Manager::SetTag_Double // ================================================================================================= // TIFF_Manager::SetTag_ASCII // =========================== void TIFF_Manager::SetTag_ASCII ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_StringPtr data ) { this->SetTag ( ifd, id, kTIFF_ASCIIType, (XMP_Uns32)(strlen(data) + 1), data ); // ! Include trailing nul. } // TIFF_Manager::SetTag_ASCII // ================================================================================================= // UTF16_to_UTF8 // ============= static void UTF16_to_UTF8 ( const UTF16Unit * utf16Ptr, size_t utf16Len, bool bigEndian, std::string * outStr ) { UTF16_to_UTF8_Proc ToUTF8 = 0; if ( bigEndian ) { ToUTF8 = UTF16BE_to_UTF8; } else { ToUTF8 = UTF16LE_to_UTF8; } UTF8Unit buffer [1000]; size_t inCount, outCount; outStr->erase(); outStr->reserve ( utf16Len * 2 ); // As good a guess as any. while ( utf16Len > 0 ) { ToUTF8 ( utf16Ptr, utf16Len, buffer, sizeof(buffer), &inCount, &outCount ); outStr->append ( (XMP_StringPtr)buffer, outCount ); utf16Ptr += inCount; utf16Len -= inCount; } } // UTF16_to_UTF8 // ================================================================================================= // TIFF_Manager::DecodeString // ========================== // // Convert an explicitly encoded string to UTF-8. The input must be encoded according to table 6 of // the Exif 2.2 specification. The input pointer is to the start of the 8 byte header, the length is // the full length. In other words, the pointer and length from the IFD entry. Returns true if the // encoding is supported and the conversion succeeds. // *** JIS encoding is not supported yet. Need a static mapping table from JIS X 208-1990 to Unicode. bool TIFF_Manager::DecodeString ( const void * encodedPtr, size_t encodedLen, std::string* utf8Str ) const { XMP_StringPtr typePtr = (XMP_StringPtr)encodedPtr; XMP_StringPtr valuePtr = typePtr + 8; size_t valueLen = encodedLen - 8; utf8Str->erase(); if ( *typePtr == 'A' ) { utf8Str->assign ( valuePtr, valueLen ); return true; } else if ( *typePtr == 'U' ) { try { const UTF16Unit * utf16Ptr = (const UTF16Unit *) valuePtr; size_t utf16Len = valueLen >> 1; // The number of UTF-16 storage units, not bytes. if ( utf16Len == 0 ) return false; bool isBigEndian = this->bigEndian; // Default to stream endian, unless there is a BOM ... if ( (*utf16Ptr == 0xFEFF) || (*utf16Ptr == 0xFFFE) ) { // Check for an explicit BOM isBigEndian = (*((XMP_Uns8*)utf16Ptr) == 0xFE); utf16Ptr += 1; // Don't translate the BOM. utf16Len -= 1; if ( utf16Len == 0 ) return false; } UTF16_to_UTF8 ( utf16Ptr, utf16Len, isBigEndian, utf8Str ); return true; } catch ( ... ) { return false; // Ignore the tag if there are conversion errors. } } else if ( *typePtr == 'J' ) { return false; // ! Ignore JIS for now. } return false; // ! Ignore all other encodings. } // TIFF_Manager::DecodeString // ================================================================================================= // UTF8_to_UTF16 // ============= static void UTF8_to_UTF16 ( const UTF8Unit * utf8Ptr, size_t utf8Len, bool bigEndian, std::string * outStr ) { UTF8_to_UTF16_Proc ToUTF16 = 0; if ( bigEndian ) { ToUTF16 = UTF8_to_UTF16BE; } else { ToUTF16 = UTF8_to_UTF16LE; } enum { kUTF16Len = 1000 }; UTF16Unit buffer [kUTF16Len]; size_t inCount, outCount; outStr->erase(); outStr->reserve ( utf8Len * 2 ); // As good a guess as any. while ( utf8Len > 0 ) { ToUTF16 ( utf8Ptr, utf8Len, buffer, kUTF16Len, &inCount, &outCount ); outStr->append ( (XMP_StringPtr)buffer, outCount*2 ); utf8Ptr += inCount; utf8Len -= inCount; } } // UTF8_to_UTF16 // ================================================================================================= // TIFF_Manager::EncodeString // ========================== // // Convert a UTF-8 string to an explicitly encoded form according to table 6 of the Exif 2.2 // specification. Returns true if the encoding is supported and the conversion succeeds. // *** JIS encoding is not supported yet. Need a static mapping table to JIS X 208-1990 from Unicode. bool TIFF_Manager::EncodeString ( const std::string& utf8Str, XMP_Uns8 encoding, std::string* encodedStr ) { encodedStr -> erase(); if ( encoding == kTIFF_EncodeASCII ) { encodedStr->assign ( "ASCII\0\0\0", 8 ); XMP_Assert (encodedStr->size() == 8 ); encodedStr->append ( utf8Str ); // ! Let the caller filter the value. (?) return true; } else if ( encoding == kTIFF_EncodeUnicode ) { encodedStr->assign ( "UNICODE\0", 8 ); XMP_Assert (encodedStr->size() == 8 ); try { std::string temp; UTF8_to_UTF16 ( (const UTF8Unit*)utf8Str.c_str(), utf8Str.size(), this->bigEndian, &temp ); encodedStr->append ( temp ); return true; } catch ( ... ) { return false; // Ignore the tag if there are conversion errors. } } else if ( encoding == kTIFF_EncodeJIS ) { XMP_Throw ( "Encoding to JIS is not implemented", kXMPErr_Unimplemented ); // encodedStr->assign ( "JIS\0\0\0\0\0", 8 ); // XMP_Assert (encodedStr->size() == 8 ); // ... // return true; } else { XMP_Throw ( "Invalid TIFF string encoding", kXMPErr_BadParam ); } return false; // ! Should never get here. } // TIFF_Manager::EncodeString // ================================================================================================= exempi-2.2.1/source/XMPFiles/FormatSupport/SWF_Support.cpp0000664000175000017500000005170412150230673020407 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "SWF_Support.hpp" #include "zlib.h" namespace SWF_Support { // ============================================================================================= static int CalcHeaderSize ( IO::InputStream* inputStream ) { int size = 0; try { XMP_Uns8 buffer[1]; long bytesRead = inputStream->Read ( buffer, 1 ); if ( bytesRead != 1 ) return 0; // The RECT datatype has a variable size depending on the packed bit-values -> rectDatatypeSize = size in bytes int bits = int(buffer[0] >> 3); int bytes = ((5 + (4 * bits)) / 8) + 1; size = 12 + bytes; } catch ( ... ) { return 0; } inputStream->Skip ( size - inputStream->GetCurrentPos() ); return size; } // CalcHeaderSize // ============================================================================================= static unsigned long CheckTag ( IO::InputStream* inputStream, TagState& inOutTagState, TagData& inOutTagData ) { unsigned long ret = 0; XMP_Uns8 * buffer = 0; try { if ( inOutTagData.id == SWF_TAG_ID_METADATA ) { buffer = new XMP_Uns8[inOutTagData.len]; XMP_Uns32 bytes = inputStream->Read ( buffer, inOutTagData.len ); XMP_Assert ( bytes == inOutTagData.len ); inOutTagState.xmpPos = inOutTagData.pos + inOutTagData.offset; inOutTagState.xmpLen = inOutTagData.len; inOutTagData.xmp = true; inOutTagState.xmpPacket.assign ( (char*)buffer, inOutTagData.len ); delete[] buffer; buffer = 0; ret = inOutTagState.xmpLen; } } catch ( ... ) { if ( buffer != 0 ) { delete[] buffer; buffer = 0; } } if ( buffer != 0 ) { delete[] buffer; buffer = 0; } return ret; } // CheckTag // ============================================================================================= bool HasMetadata ( IO::InputStream* inputStream, TagState& tagState ) { XMP_Uns32 flags = ReadFileAttrFlags ( inputStream ); tagState.fileAttrFlags = flags; return ((flags & SWF_METADATA_FLAG) == SWF_METADATA_FLAG); } // HasMetadata // ============================================================================================= XMP_Uns32 ReadFileAttrFlags ( IO::InputStream* inputStream ) { XMP_Uns8 buffer[4]; XMP_Uns32 bytes = inputStream->Read ( buffer, 4 ); XMP_Assert ( bytes == 4 ); return GetUns32LE ( buffer ); } // ReadFileAttrFlags // ============================================================================================= long OpenSWF ( IO::InputStream *inputStream, TagState & inOutTagState ) { XMP_Uns64 pos = 0; long name; XMP_Uns32 len; inOutTagState.headerSize = CalcHeaderSize ( inputStream ); pos = inOutTagState.headerSize; // read first and following chunks bool running = true; while ( running ) { running = ReadTag ( inputStream, inOutTagState, &name, &len, pos ); if ( inOutTagState.cachingFile ) { if ( (! inOutTagState.hasXMP) || (inOutTagState.xmpLen > 0) ) running = false; } } return (long) inOutTagState.tags.size(); } // OpenSWF // ============================================================================================= bool ReadTag ( IO::InputStream* inputStream, TagState & inOutTagState, long* tagType, XMP_Uns32* tagLength, XMP_Uns64& inOutPosition ) { try { XMP_Uns64 startPosition = inOutPosition; long bytesRead; XMP_Uns8 buffer[4]; bytesRead = inputStream->Read ( buffer, 2 ); if ( bytesRead != 2 ) return false; inOutPosition += 2; XMP_Uns16 code = GetUns16LE ( buffer ); *tagType = code >> 6; *tagLength = code & 0x3f; bool longTag = false; if ( *tagLength == 0x3f ) { longTag = true; bytesRead = inputStream->Read ( buffer, 4 ); if ( bytesRead != 4 ) return false; inOutPosition += 4; *tagLength = GetUns32LE ( buffer ); } inOutPosition += *tagLength; TagData newTag; newTag.pos = startPosition; newTag.len = *tagLength; newTag.id = *tagType; newTag.offset = ( (! longTag) ? 2 : 6 ); // we cannot check valid XMP within the handler // provide validating XMP by invoking XMPCore // check tag for XMP if ( newTag.id == SWF_TAG_ID_METADATA ) { newTag.xmp = true; inOutTagState.xmpTag = newTag; CheckTag ( inputStream, inOutTagState, newTag ); if ( ! inOutTagState.hasFileAttrTag ) inOutTagState.hasXMP = true; } //store FileAttribute Tag if ( newTag.id == SWF_TAG_ID_FILEATTRIBUTES ) { inOutTagState.hasFileAttrTag = true; inOutTagState.fileAttrTag = newTag; inOutTagState.hasXMP = HasMetadata ( inputStream, inOutTagState ); //decreasing since stream moved on within HasMetadata function *tagLength -= 4; } //store tag in vector to process later inOutTagState.tags.push_back ( newTag ); //seek to next tag if ( ! newTag.xmp ) inputStream->Skip ( *tagLength ); if ( inputStream->IsEOF() ) return false; } catch ( ... ) { return false; } return true; } // ReadTag // ============================================================================================= bool WriteXMPTag ( LFA_FileRef fileRef, XMP_Uns32 len, const char* inBuffer ) { bool ret = false; XMP_Uns16 code = MakeUns16LE ( (SWF_TAG_ID_METADATA << 6) | 0x3F ); XMP_Uns32 length = MakeUns32LE ( len ); try { LFA_Write (fileRef, &code, 2 ); LFA_Write (fileRef, &length, 4 ); LFA_Write (fileRef, inBuffer, len ); ret = true; } catch ( ... ) {} return ret; } // WriteXMPTag // ============================================================================================= bool CopyHeader ( LFA_FileRef sourceRef, LFA_FileRef destRef, const TagState& tagState ) { try { int headerSize = tagState.headerSize; LFA_Seek ( sourceRef, 0, SEEK_SET ); LFA_Copy ( sourceRef, destRef, headerSize ); return true; } catch ( ... ) {} return false; } // CopyHeader // ============================================================================================= bool UpdateHeader ( LFA_FileRef fileRef ) { try { XMP_Int64 length64 = LFA_Measure ( fileRef ); if ( (length64 < 8) || (length64 > (XMP_Int64)0xFFFFFFFFULL) ) return false; XMP_Uns32 length32 = MakeUns32LE ( (XMP_Uns32)length64 ); LFA_Seek ( fileRef, 4, SEEK_SET ); LFA_Write ( fileRef, &length32, 4 ); return true; } catch ( ... ) {} return false; } // UpdateHeader // ============================================================================================= bool CopyTag ( LFA_FileRef sourceRef, LFA_FileRef destRef, TagData& tag ) { try { LFA_Seek ( sourceRef, tag.pos, SEEK_SET ); LFA_Copy ( sourceRef, destRef, (tag.len + tag.offset) ); return true; } catch ( ... ) {} return false; } // CopyTag // ============================================================================================= bool ReadBuffer ( LFA_FileRef fileRef, XMP_Uns64& pos, XMP_Uns32 len, XMP_Uns8* outBuffer ) { try { if ( (fileRef == 0) || (outBuffer == 0) ) return false; LFA_Seek ( fileRef, pos, SEEK_SET ); long bytesRead = LFA_Read ( fileRef, outBuffer, len ); return ( (XMP_Uns32)bytesRead == len ); } catch ( ... ) {} return false; } // ReadBuffer // ============================================================================================= bool WriteBuffer ( LFA_FileRef fileRef, XMP_Uns64& pos, XMP_Uns32 len, const char* inBuffer ) { try { if ( (fileRef == 0) || (inBuffer == 0) ) return false; LFA_Seek ( fileRef, pos, SEEK_SET ); LFA_Write ( fileRef, inBuffer, len ); return true; } catch ( ... ) {} return false; } // WriteBuffer // ============================================================================================= bool UpdateFileAttrTag ( LFA_FileRef fileRef, const TagData& fileAttrTag, const TagState& tagState ) { try { XMP_Uns32 flags = tagState.fileAttrFlags; flags |= SWF_METADATA_FLAG; return WriteFileAttrFlags ( fileRef, fileAttrTag, flags ); } catch ( ... ) {} return false; } // UpdateFileAttrTag // ============================================================================================= bool WriteFileAttrFlags ( LFA_FileRef fileRef, const TagData& fileAttrTag, XMP_Uns32 flags ) { try { XMP_Uns32 bitMask = MakeUns32LE ( flags ); LFA_Seek ( fileRef, fileAttrTag.pos + fileAttrTag.offset, SEEK_SET ); LFA_Write ( fileRef, &bitMask, 4 ); return true; } catch ( ... ) {} return false; } // WriteFileAttrFlags // ============================================================================================= // ============================================================================================= FileInfo::FileInfo ( LFA_FileRef fileRef, const std::string& origPath ) { this->compressedFile = false; this->iSize = 0; this->CheckFormat ( fileRef ); this->origFilePath.assign ( origPath ); this->fileRef = fileRef; } // FileInfo::FileInfo // ============================================================================================= void FileInfo::CheckFormat ( LFA_FileRef fileRef ) { IOBuffer ioBuf; LFA_Seek ( fileRef, 0, SEEK_SET ); if ( CheckFileSpace ( fileRef, &ioBuf, SWF_SIGNATURE_LEN ) ) { if ( CheckBytes ( ioBuf.ptr, SWF_F_SIGNATURE_DATA, SWF_SIGNATURE_LEN ) ) { this->compressedFile = false; } else if ( CheckBytes ( ioBuf.ptr, SWF_C_SIGNATURE_DATA, SWF_SIGNATURE_LEN ) ) { this->compressedFile = true; } LFA_Seek ( fileRef, 4, SEEK_SET ); XMP_Uns8 buffer[4]; LFA_Read ( fileRef, buffer, 4 ); iSize = GetUns32LE ( buffer ); } LFA_Seek ( fileRef, 0, SEEK_SET ); } // FileInfo::CheckFormat // ============================================================================================= bool FileInfo::IsCompressed() { return this->compressedFile; } // FileInfo::IsCompressed // ============================================================================================= LFA_FileRef FileInfo::Decompress() { if ( ! this->IsCompressed() ) return this->fileRef; LFA_FileRef updateRef = 0; std::string updatePath; try { CreateTempFile ( this->origFilePath, &updatePath, kCopyMacRsrc ); updateRef = LFA_Open ( updatePath.c_str(), 'w' ); this->tmpFilePath.assign ( updatePath ); int ret = this->Encode ( this->fileRef, updateRef, FWS, Inf ); this->tmpFileRef = updateRef; if ( ret != Z_OK ) XMP_Throw ( "zstream error occured", kXMPErr_ExternalFailure ); return this->tmpFileRef; } catch ( ... ) { LFA_Close ( updateRef ); LFA_Delete ( updatePath.c_str() ); return this->fileRef; } } // FileInfo::Decompress // ============================================================================================= void FileInfo::Compress ( LFA_FileRef sourceRef, LFA_FileRef destRef ) { if ( this->IsCompressed() ) this->Encode ( sourceRef, destRef, CWS, Def ); } // FileInfo::Compress // ============================================================================================= void FileInfo::Clean() { if ( this->tmpFileRef != 0 ) LFA_Close ( this->tmpFileRef ); this->tmpFileRef = 0; this->CleanTempFiles(); } // FileInfo::Clean // ============================================================================================= void FileInfo::CleanTempFiles() { if ( ! this->tmpFilePath.empty() ) { LFA_Delete ( this->tmpFilePath.c_str() ); this->tmpFilePath.erase(); } } // FileInfo::CleanTempFiles // ============================================================================================= int FileInfo::Encode ( LFA_FileRef fileRef, LFA_FileRef updateRef, SWF_MODE swfMode, CompressionFnc cmpFnc ) { LFA_Seek ( updateRef, 0, SEEK_SET ); if ( swfMode == CWS ) { LFA_Write ( updateRef, SWF_C_SIGNATURE_DATA, SWF_SIGNATURE_LEN ); } else { XMP_Assert ( swfMode == FWS ); LFA_Write ( updateRef, SWF_F_SIGNATURE_DATA, SWF_SIGNATURE_LEN ); } LFA_Seek ( fileRef, SWF_SIGNATURE_LEN, SEEK_SET ); LFA_Seek ( updateRef, SWF_SIGNATURE_LEN, SEEK_SET ); LFA_Copy ( fileRef, updateRef, 5 ); int ret = cmpFnc ( fileRef, updateRef ); LFA_Flush ( updateRef ); return ret; } // FileInfo::Encode // ============================================================================================= int FileInfo::Inf ( LFA_FileRef source, LFA_FileRef dest ) { int ret; unsigned have; z_stream strm; unsigned char in[CHUNK]; unsigned char out[CHUNK]; XMP_Uns64 allBytes = 0; // allocate inflate state strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; strm.avail_in = 0; strm.next_in = Z_NULL; ret = inflateInit ( &strm ); if ( ret != Z_OK ) return ret; // decompress until deflate stream ends or end of file LFA_Seek ( source, SWF_COMPRESSION_BEGIN, SEEK_SET ); XMP_Uns64 outPos = SWF_COMPRESSION_BEGIN; try { do { strm.avail_in = LFA_Read ( source, in, CHUNK ); if ( strm.avail_in == 0 ) { ret = Z_STREAM_END; break; } strm.next_in = in; // run inflate() on input until output buffer not full do { strm.avail_out = CHUNK; strm.next_out = out; ret = inflate ( &strm, Z_NO_FLUSH ); XMP_Assert ( ret != Z_STREAM_ERROR ); // state not clobbered switch ( ret ) { case Z_NEED_DICT: ret = Z_DATA_ERROR; // and fall through case Z_DATA_ERROR: case Z_MEM_ERROR: inflateEnd ( &strm ); return ret; } have = CHUNK - strm.avail_out; LFA_Seek ( dest, outPos, SEEK_SET ); LFA_Write ( dest, out, have ); outPos += have; } while ( strm.avail_out == 0 ); // done when inflate() says it's done } while ( ret != Z_STREAM_END ); } catch ( ... ) { inflateEnd ( &strm ); return Z_ERRNO; } // clean up and return inflateEnd ( &strm ); return ( (ret == Z_STREAM_END) ? Z_OK : Z_DATA_ERROR ); } // FileInfo::Inf // ============================================================================================= int FileInfo::Def ( LFA_FileRef source, LFA_FileRef dest ) { int ret, flush; unsigned have; z_stream strm; unsigned char in[CHUNK]; unsigned char out[CHUNK]; // allocate deflate state strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; ret = deflateInit ( &strm, SWF_DEFAULT_COMPRESSION_LEVEL ); if ( ret != Z_OK ) return ret; // compress until end of file LFA_Seek ( source, SWF_COMPRESSION_BEGIN, SEEK_SET ); XMP_Uns64 outPos = SWF_COMPRESSION_BEGIN; try { do { strm.avail_in = LFA_Read ( source, in, CHUNK ); flush = ( (strm.avail_in < CHUNK) ? Z_FINISH : Z_NO_FLUSH ); strm.next_in = in; // run deflate() on input until output buffer not full, finish // compression if all of source has been read in do { strm.avail_out = CHUNK; strm.next_out = out; ret = deflate ( &strm, flush ); // no bad return value XMP_Assert ( ret != Z_STREAM_ERROR ); // state not clobbered have = CHUNK - strm.avail_out; LFA_Seek ( dest, outPos, SEEK_SET ); LFA_Write ( dest, out, have ); outPos += have; } while ( strm.avail_out == 0 ); XMP_Assert ( strm.avail_in == 0 ); // all input will be used // done when last data in file processed } while ( flush != Z_FINISH ); XMP_Assert ( ret == Z_STREAM_END ); // stream will be complete } catch ( ... ) { deflateEnd ( &strm ); return Z_ERRNO; } /* clean up and return */ deflateEnd ( &strm ); return Z_OK; } // FileInfo::Def // ============================================================================================= } // namespace SWF_Support // ================================================================================================= // ================================================================================================= namespace IO { // ============================================================================================= void FileInputStream::InitStream() { iEndPos = LFA_Seek ( iFile, 0, SEEK_END ); iPos = LFA_Seek ( iFile, 0, SEEK_SET ); } // FileInputStream::InitStream // ============================================================================================= XMP_Int32 FileInputStream::Read ( XMP_Uns8* ioBuf, XMP_Int32 len ) { if ( IsEOF() ) throw new IOException ( IO::STATUS_EOF ); XMP_Int32 bytes = LFA_Read ( iFile, ioBuf, len ); iPos += bytes; return bytes; } // FileInputStream::Read // ============================================================================================= XMP_Int64 FileInputStream::Skip ( XMP_Int64 len ) { if ( IsEOF() ) return 0; iPos += len; XMP_Int64 bytes = LFA_Seek ( iFile, iPos, SEEK_SET ); return bytes; } // FileInputStream::Skip // ============================================================================================= void FileInputStream::Reset() { iPos = LFA_Seek ( iFile, 0, SEEK_SET ); } // FileInputStream::Reset // ============================================================================================= bool FileInputStream::IsEOF() { return (iPos >= iEndPos); } // FileInputStream::IsEOF // ============================================================================================= // ============================================================================================= namespace ZIP { // ========================================================================================= DeflateInputStream::DeflateInputStream ( LFA_FileRef file, XMP_Int32 bufferLength ) : FileInputStream(file), iStatus(0), iBufferLength(bufferLength) { InitStream(); iBuffer = new XMP_Uns8[bufferLength]; } // DeflateInputStream::DeflateInputStream // ========================================================================================= DeflateInputStream::~DeflateInputStream() { inflateEnd ( &iStream ); delete[] iBuffer; iBuffer = NULL; } // DeflateInputStream::~DeflateInputStream // ========================================================================================= void DeflateInputStream::InitStream() { iStream.zalloc = Z_NULL; iStream.zfree = Z_NULL; iStream.opaque = Z_NULL; iStream.avail_in = 0; iStream.next_in = Z_NULL; iStream.avail_out = 1; iStatus = inflateInit ( &iStream ); if ( iStatus != Z_OK ) throw new ZIPException ( iStatus ); } // DeflateInputStream::InitStream // ========================================================================================= XMP_Int32 DeflateInputStream::Read ( XMP_Uns8* ioBuf, XMP_Int32 len ) { // *** if ( len > iBufferLength ) throw new IOException ( STATUS_BUFFER_OVERFLOW ); if( iStream.avail_out != 0 ) { XMP_Int64 pos = GetCurrentPos(); iStream.avail_in = FileInputStream::Read ( iBuffer, iBufferLength ); iPos = pos + len; iStream.next_in = iBuffer; } iStream.avail_out = len; iStream.next_out = ioBuf; iStatus = inflate ( &iStream, Z_NO_FLUSH ); if ( iStatus == Z_MEM_ERROR ) { inflateEnd ( &iStream ); throw new ZIPException ( Z_MEM_ERROR ); } return (len - iStream.avail_out); } // DeflateInputStream::Read // ========================================================================================= XMP_Int32 DeflateInputStream::Read ( XMP_Uns8* ioBuf ) { return Read ( ioBuf, iBufferLength ); } // DeflateInputStream::Read // ========================================================================================= void DeflateInputStream::Close() { inflateEnd ( &iStream ); iPos = 0; } // DeflateInputStream::Close // ========================================================================================= bool DeflateInputStream::IsEOF() { return (iStatus == Z_STREAM_END); } // DeflateInputStream::IsEOF // ========================================================================================= XMP_Int64 DeflateInputStream::Skip ( XMP_Int64 len ) { return Skip ( len, DEFLATE ); } // DeflateInputStream::Skip // ========================================================================================= XMP_Int64 DeflateInputStream::Skip ( XMP_Int64 len, EDeflate deflate ) { switch ( deflate ) { case DEFLATE: { XMP_Uns8 * buffer = new XMP_Uns8 [ (XMP_Uns32)len ]; XMP_Int64 bytes = Read ( buffer, (XMP_Uns32)len ); delete[] buffer; return bytes; } break; case DEFLATE_NO: return FileInputStream::Skip ( len ); default: throw new IOException ( STATUS_SKIP ); } } // DeflateInputStream::Skip // ========================================================================================= } // namespace ZIP // ============================================================================================= } // namespace IO exempi-2.2.1/source/XMPFiles/FormatSupport/GIF_Support.cpp0000664000175000017500000002274012150230672020352 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002-2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // Derived from PNG_Support.cpp by Ian Jacobi // ================================================================================================= #include "GIF_Support.hpp" #include typedef std::basic_string filebuffer; // Don't need CRC. namespace GIF_Support { // This only really counts for extension blocks. enum blockType { bGraphicControl = 0xF9, bComment = 0xFE, bPlainText = 0x01, bApplication = 0xFF, // Hacky. Don't like the following, but there's no easy way. bImage = 0x2C, bExtension = 0x21, bTerminator = 0x3B, bHeader = 0x47 }; // ============================================================================================= long OpenGIF ( LFA_FileRef fileRef, BlockState & inOutBlockState ) { XMP_Uns64 pos = 0; unsigned char name; XMP_Uns32 len; BlockData newBlock; pos = LFA_Seek ( fileRef, 0, SEEK_SET ); // header needs to be a block, mostly for our safe write. pos = ReadHeader ( fileRef ); if (pos < 13) return 0; newBlock.pos = 0; newBlock.len = pos; newBlock.type = bHeader; inOutBlockState.blocks.push_back(newBlock); // read first and following blocks while ( ReadBlock ( fileRef, inOutBlockState, &name, &len, pos) ) {} return inOutBlockState.blocks.size(); } // ============================================================================================= long ReadHeader ( LFA_FileRef fileRef ) { long bytesRead; long headerSize; long tableSize = 0; long bytesPerColor = 0; unsigned char buffer[768]; headerSize = 0; bytesRead = LFA_Read ( fileRef, buffer, GIF_SIGNATURE_LEN ); if ( bytesRead != GIF_SIGNATURE_LEN ) return 0; if ( memcmp ( buffer, GIF_SIGNATURE_DATA, GIF_SIGNATURE_LEN) != 0 ) return 0; headerSize += bytesRead; bytesRead = LFA_Read ( fileRef, buffer, 3 ); if ( bytesRead != 3 ) return 0; if ( memcmp ( buffer, "87a", 3 ) != 0 && memcmp ( buffer, "89a", 3 ) != 0 ) return 0; headerSize += bytesRead; bytesRead = LFA_Read ( fileRef, buffer, 4 ); if ( bytesRead != 4 ) return 0; headerSize += bytesRead; bytesRead = LFA_Read ( fileRef, buffer, 3 ); if ( bytesRead != 3 ) return 0; headerSize += bytesRead; if ( buffer[0] & 0x80 ) tableSize = (1 << ((buffer[0] & 0x07) + 1)) * 3; bytesRead = LFA_Read ( fileRef, buffer, tableSize ); if ( bytesRead != tableSize ) return 0; headerSize += bytesRead; return headerSize; } // ============================================================================================= bool ReadBlock ( LFA_FileRef fileRef, BlockState & inOutBlockState, unsigned char * blockType, XMP_Uns32 * blockLength, XMP_Uns64 & inOutPosition ) { try { XMP_Uns64 startPosition = inOutPosition; long bytesRead; long blockSize; unsigned char buffer[768]; bytesRead = LFA_Read ( fileRef, buffer, 1 ); if ( bytesRead != 1 ) return false; inOutPosition += 1; if ( buffer[0] == bImage ) { // Image is a special case. long tableSize = 0; bytesRead = LFA_Read ( fileRef, buffer, 4 ); if ( bytesRead != 4 ) return false; inOutPosition += 4; bytesRead = LFA_Read ( fileRef, buffer, 4 ); if ( bytesRead != 4 ) return false; inOutPosition += 4; bytesRead = LFA_Read ( fileRef, buffer, 1 ); if ( bytesRead != 1 ) return false; inOutPosition += 1; if ( buffer[0] & 0x80 ) tableSize = (1 << ((buffer[0] & 0x07) + 1)) * 3; bytesRead = LFA_Read ( fileRef, buffer, tableSize ); if ( bytesRead != tableSize ) return 0; inOutPosition += tableSize; bytesRead = LFA_Read ( fileRef, buffer, 1 ); if ( bytesRead != 1 ) return false; inOutPosition += 1; bytesRead = LFA_Read ( fileRef, buffer, 1 ); if ( bytesRead != 1 ) return false; inOutPosition += 1; tableSize = buffer[0]; while ( tableSize != 0x00 ) { bytesRead = LFA_Read ( fileRef, buffer, tableSize ); if ( bytesRead != tableSize ) return false; inOutPosition += tableSize; bytesRead = LFA_Read ( fileRef, buffer, 1 ); if ( bytesRead != 1 ) return false; inOutPosition += 1; tableSize = buffer[0]; } BlockData newBlock; newBlock.pos = startPosition; newBlock.len = inOutPosition - startPosition; newBlock.type = bImage; inOutBlockState.blocks.push_back ( newBlock ); } else if ( buffer[0] == bExtension ) { unsigned char type; long tableSize = 0; BlockData newBlock; newBlock.pos = startPosition; bytesRead = LFA_Read ( fileRef, buffer, 1 ); if ( bytesRead != 1 ) return false; inOutPosition += 1; type = buffer[0]; newBlock.type = type; bytesRead = LFA_Read ( fileRef, buffer, 1 ); if ( bytesRead != 1 ) return false; inOutPosition += 1; tableSize = buffer[0]; while ( tableSize != 0x00 ) { bytesRead = LFA_Read ( fileRef, buffer, tableSize ); if ( bytesRead != tableSize ) return false; inOutPosition += tableSize; if ( inOutPosition - startPosition == 14 && type == bApplication ) { // Check for XMP identifier... CheckApplicationBlockHeader ( fileRef, inOutBlockState, newBlock, inOutPosition ); if ( newBlock.xmp == true ) { newBlock.len = inOutPosition - startPosition; inOutBlockState.blocks.push_back ( newBlock ); return true; } } bytesRead = LFA_Read ( fileRef, buffer, 1 ); if ( bytesRead != 1 ) return false; inOutPosition += 1; tableSize = buffer[0]; } newBlock.len = inOutPosition - startPosition; inOutBlockState.blocks.push_back ( newBlock ); } else if ( buffer[0] == bTerminator ) { BlockData newBlock; newBlock.pos = startPosition; newBlock.len = 1; newBlock.type = buffer[0]; inOutBlockState.blocks.push_back ( newBlock ); } } catch ( ... ) { return false; } return true; } // ============================================================================================= bool WriteXMPBlock ( LFA_FileRef fileRef, XMP_Uns32 len, const char* inBuffer ) { bool ret = false; unsigned long datalen = (APPLICATION_HEADER_LEN + len + MAGIC_TRAILER_LEN); unsigned char* buffer = new unsigned char[datalen]; try { size_t pos = 0; memcpy(&buffer[pos], APPLICATION_HEADER_DATA, APPLICATION_HEADER_LEN); pos += APPLICATION_HEADER_LEN; memcpy(&buffer[pos], inBuffer, len); pos += len; memcpy(&buffer[pos], MAGIC_TRAILER_DATA, MAGIC_TRAILER_LEN); LFA_Write(fileRef, buffer, datalen); ret = true; } catch ( ... ) {} delete [] buffer; return ret; } // ============================================================================================= bool CopyBlock ( LFA_FileRef sourceRef, LFA_FileRef destRef, BlockData& block ) { try { LFA_Seek (sourceRef, block.pos, SEEK_SET ); LFA_Copy (sourceRef, destRef, (block.len)); } catch ( ... ) { return false; } return true; } // ============================================================================================= // Don't need CRC. // ============================================================================================= unsigned long CheckApplicationBlockHeader ( LFA_FileRef fileRef, BlockState& inOutBlockState, BlockData& inOutBlockData, XMP_Uns64& inOutPosition ) { try { LFA_Seek(fileRef, (inOutBlockData.pos), SEEK_SET); unsigned char buffer[256]; long bytesRead = LFA_Read ( fileRef, buffer, APPLICATION_HEADER_LEN ); if (bytesRead == APPLICATION_HEADER_LEN) { if (memcmp(buffer, APPLICATION_HEADER_DATA, APPLICATION_HEADER_LEN) == 0) { // We still have to go through all of the data... long tableSize = 0; long xmpSize; inOutPosition = inOutBlockData.pos + APPLICATION_HEADER_LEN; inOutBlockState.xmpPos = inOutPosition; bytesRead = LFA_Read ( fileRef, buffer, 1 ); if ( bytesRead != 1 ) return 0; inOutPosition += 1; tableSize = buffer[0]; while ( tableSize != 0x00 ) { bytesRead = LFA_Read ( fileRef, buffer, tableSize ); if ( bytesRead != tableSize ) return false; inOutPosition += tableSize; bytesRead = LFA_Read ( fileRef, buffer, 1 ); if ( bytesRead != 1 ) return false; inOutPosition += 1; tableSize = buffer[0]; } inOutBlockState.xmpLen = inOutPosition - inOutBlockData.pos - APPLICATION_HEADER_LEN - MAGIC_TRAILER_LEN; inOutBlockState.xmpBlock = inOutBlockData; inOutBlockData.xmp = true; } } } catch ( ... ) {} return 0; } bool ReadBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns32 len, char * outBuffer ) { try { if ( (fileRef == 0) || (outBuffer == 0) ) return false; LFA_Seek (fileRef, pos, SEEK_SET ); long bytesRead = LFA_Read ( fileRef, outBuffer, len ); if ( XMP_Uns32(bytesRead) != len ) return false; return true; } catch ( ... ) {} return false; } bool WriteBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns32 len, const char * inBuffer ) { try { if ( (fileRef == 0) || (inBuffer == 0) ) return false; LFA_Seek (fileRef, pos, SEEK_SET ); LFA_Write( fileRef, inBuffer, len ); return true; } catch ( ... ) {} return false; } } // namespace GIF_Support exempi-2.2.1/source/XMPFiles/FormatSupport/MOOV_Support.cpp0000664000175000017500000004373612150230672020535 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2009 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "MOOV_Support.hpp" #include "ISOBaseMedia_Support.hpp" #include // ================================================================================================= /// \file MOOV_Support.cpp /// \brief XMPFiles support for the 'moov' box in MPEG-4 and QuickTime files. // ================================================================================================= // ================================================================================================= // ================================================================================================= // MOOV_Manager - The parsing and reading routines are all commmon // ================================================================================================= // ================================================================================================= #ifndef TraceParseMoovTree #define TraceParseMoovTree 0 #endif #ifndef TraceUpdateMoovTree #define TraceUpdateMoovTree 0 #endif // ================================================================================================= // MOOV_Manager::PickContentPtr // ============================ XMP_Uns8 * MOOV_Manager::PickContentPtr ( const BoxNode & node ) const { if ( node.contentSize == 0 ) { return 0; } else if ( node.changed ) { return (XMP_Uns8*) &node.changedContent[0]; } else { return (XMP_Uns8*) &this->fullSubtree[0] + node.offset + node.headerSize; } } // MOOV_Manager::PickContentPtr // ================================================================================================= // MOOV_Manager::FillBoxInfo // ========================= void MOOV_Manager::FillBoxInfo ( const BoxNode & node, BoxInfo * info ) const { if ( info == 0 ) return; info->boxType = node.boxType; info->childCount = (XMP_Uns32)node.children.size(); info->contentSize = node.contentSize; info->content = PickContentPtr ( node ); } // MOOV_Manager::FillBoxInfo // ================================================================================================= // MOOV_Manager::GetBox // ==================== // // Find a box given the type path. Pick the first child of each type. MOOV_Manager::BoxRef MOOV_Manager::GetBox ( const char * boxPath, BoxInfo * info ) const { size_t pathLen = strlen(boxPath); XMP_Assert ( (pathLen >= 4) && XMP_LitNMatch ( boxPath, "moov", 4 ) ); if ( info != 0 ) memset ( info, 0, sizeof(BoxInfo) ); const char * pathPtr = boxPath + 5; // Skip the "moov/" portion. const char * pathEnd = boxPath + pathLen; BoxRef currRef = &this->moovNode; while ( pathPtr < pathEnd ) { XMP_Assert ( (pathEnd - pathPtr) >= 4 ); XMP_Uns32 boxType = GetUns32BE ( pathPtr ); pathPtr += 5; // ! Don't care that the last step goes 1 too far. currRef = this->GetTypeChild ( currRef, boxType, 0 ); if ( currRef == 0 ) return 0; } this->FillBoxInfo ( *((BoxNode*)currRef), info ); return currRef; } // MOOV_Manager::GetBox // ================================================================================================= // MOOV_Manager::GetNthChild // ========================= MOOV_Manager::BoxRef MOOV_Manager::GetNthChild ( BoxRef parentRef, size_t childIndex, BoxInfo * info ) const { XMP_Assert ( parentRef != 0 ); const BoxNode & parent = *((BoxNode*)parentRef); if ( info != 0 ) memset ( info, 0, sizeof(BoxInfo) ); if ( childIndex >= parent.children.size() ) return 0; const BoxNode & currNode = parent.children[childIndex]; this->FillBoxInfo ( currNode, info ); return &currNode; } // MOOV_Manager::GetNthChild // ================================================================================================= // MOOV_Manager::GetTypeChild // ========================== MOOV_Manager::BoxRef MOOV_Manager::GetTypeChild ( BoxRef parentRef, XMP_Uns32 childType, BoxInfo * info ) const { XMP_Assert ( parentRef != 0 ); const BoxNode & parent = *((BoxNode*)parentRef); if ( info != 0 ) memset ( info, 0, sizeof(BoxInfo) ); if ( parent.children.empty() ) return 0; size_t i = 0, limit = parent.children.size(); for ( ; i < limit; ++i ) { const BoxNode & currNode = parent.children[i]; if ( currNode.boxType == childType ) { this->FillBoxInfo ( currNode, info ); return &currNode; } } return 0; } // MOOV_Manager::GetTypeChild // ================================================================================================= // MOOV_Manager::GetParsedOffset // ============================= XMP_Uns32 MOOV_Manager::GetParsedOffset ( BoxRef ref ) const { XMP_Assert ( ref != 0 ); const BoxNode & node = *((BoxNode*)ref); if ( node.changed ) return 0; return node.offset; } // MOOV_Manager::GetParsedOffset // ================================================================================================= // MOOV_Manager::GetHeaderSize // =========================== XMP_Uns32 MOOV_Manager::GetHeaderSize ( BoxRef ref ) const { XMP_Assert ( ref != 0 ); const BoxNode & node = *((BoxNode*)ref); if ( node.changed ) return 0; return node.headerSize; } // MOOV_Manager::GetHeaderSize // ================================================================================================= // MOOV_Manager::ParseMemoryTree // ============================= // // Parse the fullSubtree data, building the BoxNode tree for the stuff that we care about. Tolerate // errors like content ending too soon, make a best effoert to parse what we can. void MOOV_Manager::ParseMemoryTree ( XMP_Uns8 fileMode ) { this->fileMode = fileMode; this->moovNode.offset = this->moovNode.boxType = 0; this->moovNode.headerSize = this->moovNode.contentSize = 0; this->moovNode.children.clear(); this->moovNode.changedContent.clear(); this->moovNode.changed = false; if ( this->fullSubtree.empty() ) return; ISOMedia::BoxInfo moovInfo; const XMP_Uns8 * moovOrigin = &this->fullSubtree[0]; const XMP_Uns8 * moovLimit = moovOrigin + this->fullSubtree.size(); (void) ISOMedia::GetBoxInfo ( moovOrigin, moovLimit, &moovInfo ); XMP_Enforce ( moovInfo.boxType == ISOMedia::k_moov ); XMP_Uns64 fullMoovSize = moovInfo.headerSize + moovInfo.contentSize; if ( fullMoovSize > moovBoxSizeLimit ) { // From here on we know 32-bit offsets are safe. XMP_Throw ( "Oversize 'moov' box", kXMPErr_EnforceFailure ); } this->moovNode.boxType = ISOMedia::k_moov; this->moovNode.headerSize = moovInfo.headerSize; this->moovNode.contentSize = (XMP_Uns32)moovInfo.contentSize; bool ignoreMetaBoxes = (fileMode == kFileIsTraditionalQT); // ! Don't want, these don't follow ISO spec. #if TraceParseMoovTree fprintf ( stderr, "Parsing 'moov' subtree, moovNode @ 0x%X, ignoreMetaBoxes = %d\n", &this->moovNode, ignoreMetaBoxes ); #endif this->ParseNestedBoxes ( &this->moovNode, "moov", ignoreMetaBoxes ); } // MOOV_Manager::ParseMemoryTree // ================================================================================================= // MOOV_Manager::ParseNestedBoxes // ============================== // // Add the current level of child boxes to the parent node, recurse as appropriate. void MOOV_Manager::ParseNestedBoxes ( BoxNode * parentNode, const std::string & parentPath, bool ignoreMetaBoxes ) { ISOMedia::BoxInfo isoInfo; const XMP_Uns8 * moovOrigin = &this->fullSubtree[0]; const XMP_Uns8 * childOrigin = moovOrigin + parentNode->offset + parentNode->headerSize; const XMP_Uns8 * childLimit = childOrigin + parentNode->contentSize; const XMP_Uns8 * nextChild; parentNode->contentSize = 0; // Exclude nested box size. if ( parentNode->boxType == ISOMedia::k_meta ) { // ! The 'meta' box is a FullBox. parentNode->contentSize = 4; childOrigin += 4; } for ( const XMP_Uns8 * currChild = childOrigin; currChild < childLimit; currChild = nextChild ) { nextChild = ISOMedia::GetBoxInfo ( currChild, childLimit, &isoInfo ); if ( (isoInfo.boxType == 0) && (isoInfo.headerSize < 8) && (isoInfo.contentSize == 0) ) continue; // Skip trailing padding that QT sometimes writes. XMP_Uns32 childOffset = (XMP_Uns32) (currChild - moovOrigin); parentNode->children.push_back ( BoxNode ( childOffset, isoInfo.boxType, isoInfo.headerSize, (XMP_Uns32)isoInfo.contentSize ) ); BoxNode * newChild = &parentNode->children.back(); #if TraceParseMoovTree size_t depth = (parentPath.size()+1) / 5; for ( size_t i = 0; i < depth; ++i ) fprintf ( stderr, " " ); XMP_Uns32 be32 = MakeUns32BE ( newChild->boxType ); XMP_Uns32 addr32 = (XMP_Uns32) this->PickContentPtr ( *newChild ); fprintf ( stderr, " Parsed %s/%.4s, offset 0x%X, size %d, content @ 0x%X, BoxNode @ 0x%X\n", parentPath.c_str(), &be32, newChild->offset, newChild->contentSize, addr32, newChild ); #endif const char * pathSuffix = 0; // Set to non-zero for boxes of interest. char buffer[6]; buffer[0] = 0; switch ( isoInfo.boxType ) { // Want these boxes regardless of parent. case ISOMedia::k_udta : pathSuffix = "/udta"; break; case ISOMedia::k_meta : pathSuffix = "/meta"; break; case ISOMedia::k_ilst : pathSuffix = "/ilst"; break; case ISOMedia::k_trak : pathSuffix = "/trak"; break; case ISOMedia::k_mdia : pathSuffix = "/mdia"; break; case ISOMedia::k_minf : pathSuffix = "/minf"; break; case ISOMedia::k_stbl : pathSuffix = "/stbl"; break; } if ( pathSuffix != 0 ) { this->ParseNestedBoxes ( newChild, (parentPath + pathSuffix), ignoreMetaBoxes ); } } } // MOOV_Manager::ParseNestedBoxes // ================================================================================================= // MOOV_Manager::NoteChange // ======================== void MOOV_Manager::NoteChange() { this->moovNode.changed = true; } // MOOV_Manager::NoteChange // ================================================================================================= // MOOV_Manager::SetBox // ==================== // // Save the new data, set this box's changed flag, and set the top changed flag. void MOOV_Manager::SetBox ( BoxRef theBox, const void* dataPtr, XMP_Uns32 size ) { XMP_Enforce ( size < moovBoxSizeLimit ); BoxNode * node = (BoxNode*)theBox; if ( node->contentSize == size ) { XMP_Uns8 * oldContent = PickContentPtr ( *node ); if ( memcmp ( oldContent, dataPtr, size ) == 0 ) return; // No change. memcpy ( oldContent, dataPtr, size ); // Update the old content in-place this->moovNode.changed = true; #if TraceUpdateMoovTree XMP_Uns32 be32 = MakeUns32BE ( node->boxType ); fprintf ( stderr, "Updated '%.4s', parse offset 0x%X, same size\n", &be32, node->offset ); #endif } else { node->changedContent.assign ( size, 0 ); // Fill with 0's first to get the storage. memcpy ( &node->changedContent[0], dataPtr, size ); node->contentSize = size; node->changed = true; this->moovNode.changed = true; #if TraceUpdateMoovTree XMP_Uns32 be32 = MakeUns32BE ( node->boxType ); XMP_Uns32 addr32 = (XMP_Uns32) this->PickContentPtr ( *node ); fprintf ( stderr, "Updated '%.4s', parse offset 0x%X, new size %d, new content @ 0x%X\n", &be32, node->offset, node->contentSize, addr32 ); #endif } } // MOOV_Manager::SetBox // ================================================================================================= // MOOV_Manager::SetBox // ==================== // // Like above, but create the path to the box if necessary. void MOOV_Manager::SetBox ( const char * boxPath, const void* dataPtr, XMP_Uns32 size ) { XMP_Enforce ( size < moovBoxSizeLimit ); size_t pathLen = strlen(boxPath); XMP_Assert ( (pathLen >= 4) && XMP_LitNMatch ( boxPath, "moov", 4 ) ); const char * pathPtr = boxPath + 5; // Skip the "moov/" portion. const char * pathEnd = boxPath + pathLen; BoxRef parentRef = 0; BoxRef currRef = &this->moovNode; while ( pathPtr < pathEnd ) { XMP_Assert ( (pathEnd - pathPtr) >= 4 ); XMP_Uns32 boxType = GetUns32BE ( pathPtr ); pathPtr += 5; // ! Don't care that the last step goes 1 too far. parentRef = currRef; currRef = this->GetTypeChild ( parentRef, boxType, 0 ); if ( currRef == 0 ) currRef = this->AddChildBox ( parentRef, boxType, 0, 0 ); } this->SetBox ( currRef, dataPtr, size ); } // MOOV_Manager::SetBox // ================================================================================================= // MOOV_Manager::AddChildBox // ========================= MOOV_Manager::BoxRef MOOV_Manager::AddChildBox ( BoxRef parentRef, XMP_Uns32 childType, const void* dataPtr, XMP_Uns32 size ) { BoxNode * parent = (BoxNode*)parentRef; XMP_Assert ( parent != 0 ); parent->children.push_back ( BoxNode ( 0, childType, 0, 0 ) ); BoxNode * newNode = &parent->children.back(); this->SetBox ( newNode, dataPtr, size ); return newNode; } // MOOV_Manager::AddChildBox // ================================================================================================= // MOOV_Manager::DeleteNthChild // ============================ bool MOOV_Manager::DeleteNthChild ( BoxRef parentRef, size_t childIndex ) { BoxNode * parent = (BoxNode*)parentRef; if ( childIndex >= parent->children.size() ) return false; parent->children.erase ( parent->children.begin() + childIndex ); return true; } // MOOV_Manager::DeleteNthChild // ================================================================================================= // MOOV_Manager::DeleteTypeChild // ============================= bool MOOV_Manager::DeleteTypeChild ( BoxRef parentRef, XMP_Uns32 childType ) { BoxNode * parent = (BoxNode*)parentRef; BoxListPos child = parent->children.begin(); BoxListPos limit = parent->children.end(); for ( ; child != limit; ++child ) { if ( child->boxType == childType ) { parent->children.erase ( child ); this->moovNode.changed = true; return true; } } return false; } // MOOV_Manager::DeleteTypeChild // ================================================================================================= // MOOV_Manager::NewSubtreeSize // ============================ // // Determine the new (changed) size of a subtree. Ignore 'free' and 'wide' boxes. XMP_Uns32 MOOV_Manager::NewSubtreeSize ( const BoxNode & node, const std::string & parentPath ) { XMP_Uns32 subtreeSize = 8 + node.contentSize; // All boxes will have 8 byte headers. if ( (node.boxType == ISOMedia::k_free) || (node.boxType == ISOMedia::k_wide) ) { } for ( size_t i = 0, limit = node.children.size(); i < limit; ++i ) { char suffix[6]; suffix[0] = '/'; PutUns32BE ( node.boxType, &suffix[1] ); suffix[5] = 0; std::string nodePath = parentPath + suffix; subtreeSize += this->NewSubtreeSize ( node.children[i], nodePath ); XMP_Enforce ( subtreeSize < moovBoxSizeLimit ); } return subtreeSize; } // MOOV_Manager::NewSubtreeSize // ================================================================================================= // MOOV_Manager::AppendNewSubtree // ============================== // // Append this node's header, content, and children. Because the 'meta' box is a FullBox with nested // boxes, there can be both content and children. Ignore 'free' and 'wide' boxes. #define IncrNewPtr(count) { newPtr += count; XMP_Enforce ( newPtr <= newEnd ); } #if TraceUpdateMoovTree static XMP_Uns8 * newOrigin; #endif XMP_Uns8 * MOOV_Manager::AppendNewSubtree ( const BoxNode & node, const std::string & parentPath, XMP_Uns8 * newPtr, XMP_Uns8 * newEnd ) { if ( (node.boxType == ISOMedia::k_free) || (node.boxType == ISOMedia::k_wide) ) { } XMP_Assert ( (node.boxType != ISOMedia::k_meta) ? (node.children.empty() || (node.contentSize == 0)) : (node.children.empty() || (node.contentSize == 4)) ); XMP_Enforce ( (XMP_Uns32)(newEnd - newPtr) >= (8 + node.contentSize) ); #if TraceUpdateMoovTree XMP_Uns32 be32 = MakeUns32BE ( node.boxType ); XMP_Uns32 newOffset = (XMP_Uns32) (newPtr - newOrigin); XMP_Uns32 addr32 = (XMP_Uns32) this->PickContentPtr ( node ); fprintf ( stderr, " Appending %s/%.4s @ 0x%X, size %d, content @ 0x%X\n", parentPath.c_str(), &be32, newOffset, node.contentSize, addr32 ); #endif // Leave the size as 0 for now, append the type and content. XMP_Uns8 * boxOrigin = newPtr; // Save origin to fill in the final size. PutUns32BE ( node.boxType, (newPtr + 4) ); IncrNewPtr ( 8 ); if ( node.contentSize != 0 ) { const XMP_Uns8 * content = PickContentPtr( node ); memcpy ( newPtr, content, node.contentSize ); IncrNewPtr ( node.contentSize ); } // Append the nested boxes. if ( ! node.children.empty() ) { char suffix[6]; suffix[0] = '/'; PutUns32BE ( node.boxType, &suffix[1] ); suffix[5] = 0; std::string nodePath = parentPath + suffix; for ( size_t i = 0, limit = node.children.size(); i < limit; ++i ) { newPtr = this->AppendNewSubtree ( node.children[i], nodePath, newPtr, newEnd ); } } // Fill in the final size. PutUns32BE ( (XMP_Uns32)(newPtr - boxOrigin), boxOrigin ); return newPtr; } // MOOV_Manager::AppendNewSubtree // ================================================================================================= // MOOV_Manager::UpdateMemoryTree // ============================== void MOOV_Manager::UpdateMemoryTree() { if ( ! this->IsChanged() ) return; XMP_Uns32 newSize = this->NewSubtreeSize ( this->moovNode, "" ); XMP_Enforce ( newSize < moovBoxSizeLimit ); RawDataBlock newData; newData.assign ( newSize, 0 ); // Prefill with zeroes, can't append multiple items to a vector. XMP_Uns8 * newPtr = &newData[0]; XMP_Uns8 * newEnd = newPtr + newSize; #if TraceUpdateMoovTree fprintf ( stderr, "Starting MOOV_Manager::UpdateMemoryTree\n" ); newOrigin = newPtr; #endif XMP_Uns8 * trueEnd = this->AppendNewSubtree ( this->moovNode, "", newPtr, newEnd ); XMP_Enforce ( trueEnd == newEnd ); this->fullSubtree.swap ( newData ); this->ParseMemoryTree ( this->fileMode ); } // MOOV_Manager::UpdateMemoryTree exempi-2.2.1/source/XMPFiles/FormatSupport/MOOV_Support.hpp0000664000175000017500000002036312150230672020531 00000000000000#ifndef __MOOV_Support_hpp__ #define __MOOV_Support_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2009 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include #include "XMP_Const.h" #include "XMPFiles_Impl.hpp" #include "EndianUtils.hpp" typedef vector RawDataBlock; #define moovBoxSizeLimit 100*1024*1024 // ================================================================================================= // MOOV_Manager // ============ class MOOV_Manager { public: // --------------------------------------------------------------------------------------------- // Types and constants enum { // Values for fileMode. kFileIsNormalISO = 0, // A "normal" MPEG-4 file, no 'qt ' compatible brand. kFileIsModernQT = 1, // Has an 'ftyp' box and 'qt ' compatible brand. kFileIsTraditionalQT = 2 // Old QuickTime, no 'ftyp' box. }; typedef const void * BoxRef; // Valid until a sibling or higher box is added or deleted. struct BoxInfo { XMP_Uns32 boxType; // In memory as native endian, compares work with ISOMedia::k_* constants. XMP_Uns32 childCount; // ! A 'meta' box has both content (version/flags) and children! XMP_Uns32 contentSize; // Does not include the size of nested boxes. const XMP_Uns8 * content; // Null if contentSize is zero. BoxInfo() : boxType(0), childCount(0), contentSize(0), content(0) {}; }; // --------------------------------------------------------------------------------------------- // GetBox - Pick a box given a '/' separated list of box types. Picks the 1st of each type. // GetNthChild - Pick the overall n-th child of the parent, zero based. // GetTypeChild - Pick the first child of the given type. // GetParsedOffset - Get the box's offset in the parsed tree, 0 if changed since parsing. // GetHeaderSize - Get the box's header size in the parsed tree, 0 if changed since parsing. BoxRef GetBox ( const char * boxPath, BoxInfo * info ) const; BoxRef GetNthChild ( BoxRef parentRef, size_t childIndex, BoxInfo * info ) const; BoxRef GetTypeChild ( BoxRef parentRef, XMP_Uns32 childType, BoxInfo * info ) const; XMP_Uns32 GetParsedOffset ( BoxRef ref ) const; XMP_Uns32 GetHeaderSize ( BoxRef ref ) const; // --------------------------------------------------------------------------------------------- // NoteChange - Note overall change, value was directly replaced. // SetBox(ref) - Replace the content with a copy of the given data. // SetBox(path) - Like above, but creating path to the box if necessary. // AddChildBox - Add a child of the given type, using a copy of the given data (may be null) void NoteChange(); void SetBox ( BoxRef theBox, const void* dataPtr, XMP_Uns32 size ); void SetBox ( const char * boxPath, const void* dataPtr, XMP_Uns32 size ); BoxRef AddChildBox ( BoxRef parentRef, XMP_Uns32 childType, const void * dataPtr, XMP_Uns32 size ); // --------------------------------------------------------------------------------------------- // DeleteNthChild - Delete the overall n-th child, return true if there was one. // DeleteTypeChild - Delete the first child of the given type, return true if there was one. bool DeleteNthChild ( BoxRef parentRef, size_t childIndex ); bool DeleteTypeChild ( BoxRef parentRef, XMP_Uns32 childType ); // --------------------------------------------------------------------------------------------- bool IsChanged() const { return this->moovNode.changed; }; // --------------------------------------------------------------------------------------------- // The client is expected to fill in fullSubtree before calling ParseMemoryTree, and directly // use fullSubtree after calling UpdateMemoryTree. // // IMPORTANT: We only support cases where the 'moov' subtree is significantly less than 4 GB, in // particular with a threshold of probably 100 MB. This has 2 big impacts: we can safely use // 32-bit offsets and sizes, and comfortably assume everything will fit in available heap space. RawDataBlock fullSubtree; // The entire 'moov' box, straight from the file or from UpdateMemoryTree. void ParseMemoryTree ( XMP_Uns8 fileMode ); void UpdateMemoryTree(); // --------------------------------------------------------------------------------------------- #pragma pack (1) // ! These must match the file layout! struct Content_mvhd_0 { XMP_Uns32 vFlags; // 0 XMP_Uns32 creationTime; // 4 XMP_Uns32 modificationTime; // 8 XMP_Uns32 timescale; // 12 XMP_Uns32 duration; // 16 XMP_Int32 rate; // 20 XMP_Int16 volume; // 24 XMP_Uns16 pad_1; // 26 XMP_Uns32 pad_2, pad_3; // 28 XMP_Int32 matrix [9]; // 36 XMP_Uns32 preDef [6]; // 72 XMP_Uns32 nextTrackID; // 96 }; // 100 struct Content_mvhd_1 { XMP_Uns32 vFlags; // 0 XMP_Uns64 creationTime; // 4 XMP_Uns64 modificationTime; // 12 XMP_Uns32 timescale; // 20 XMP_Uns64 duration; // 24 XMP_Int32 rate; // 32 XMP_Int16 volume; // 36 XMP_Uns16 pad_1; // 38 XMP_Uns32 pad_2, pad_3; // 40 XMP_Int32 matrix [9]; // 48 XMP_Uns32 preDef [6]; // 84 XMP_Uns32 nextTrackID; // 108 }; // 112 struct Content_hdlr { // An 'hdlr' box as defined by ISO 14496-12. Maps OK to the QuickTime box. XMP_Uns32 versionFlags; // 0 XMP_Uns32 preDef; // 4 XMP_Uns32 handlerType; // 8 XMP_Uns32 reserved [3]; // 12 // Plus optional component name string, null terminated UTF-8. }; // 24 struct Content_stsd_entry { XMP_Uns32 entrySize; // 0 XMP_Uns32 format; // 4 XMP_Uns8 reserved_1 [6]; // 8 XMP_Uns16 dataRefIndex; // 14 XMP_Uns32 reserved_2; // 16 XMP_Uns32 flags; // 20 XMP_Uns32 timeScale; // 24 XMP_Uns32 frameDuration; // 28 XMP_Uns8 frameCount; // 32 XMP_Uns8 reserved_3; // 33 // Plus optional trailing ISO boxes. }; // 34 struct Content_stsc_entry { XMP_Uns32 firstChunkNumber; // 0 XMP_Uns32 samplesPerChunk; // 4 XMP_Uns32 sampleDescrID; // 8 }; // 12 // --------------------------------------------------------------------------------------------- MOOV_Manager() : fileMode(0) { XMP_Assert ( sizeof ( Content_mvhd_0 ) == 100 ); // Make sure the structs really are packed. XMP_Assert ( sizeof ( Content_mvhd_1 ) == 112 ); XMP_Assert ( sizeof ( Content_hdlr ) == 24 ); XMP_Assert ( sizeof ( Content_stsd_entry ) == 34 ); XMP_Assert ( sizeof ( Content_stsc_entry ) == 12 ); }; virtual ~MOOV_Manager() {}; private: struct BoxNode; typedef std::vector BoxList; typedef BoxList::iterator BoxListPos; struct BoxNode { // ! Don't have a parent link, it will get destroyed by vector growth! XMP_Uns32 offset; // The offset in the fullSubtree, 0 if not in the parse. XMP_Uns32 boxType; XMP_Uns32 headerSize; // The actual header size in the fullSubtree, 0 if not in the parse. XMP_Uns32 contentSize; // The current content size, does not include nested boxes. BoxList children; RawDataBlock changedContent; // Might be empty even if changed is true. bool changed; // If true, the content is in changedContent, else in fullSubtree. BoxNode() : offset(0), boxType(0), headerSize(0), contentSize(0), changed(false) {}; BoxNode ( XMP_Uns32 _offset, XMP_Uns32 _boxType, XMP_Uns32 _headerSize, XMP_Uns32 _contentSize ) : offset(_offset), boxType(_boxType), headerSize(_headerSize), contentSize(_contentSize), changed(false) {}; }; XMP_Uns8 fileMode; BoxNode moovNode; void ParseNestedBoxes ( BoxNode * parentNode, const std::string & parentPath, bool ignoreMetaBoxes ); XMP_Uns8 * PickContentPtr ( const BoxNode & node ) const; void FillBoxInfo ( const BoxNode & node, BoxInfo * info ) const; XMP_Uns32 NewSubtreeSize ( const BoxNode & node, const std::string & parentPath ); XMP_Uns8 * AppendNewSubtree ( const BoxNode & node, const std::string & parentPath, XMP_Uns8 * newPtr, XMP_Uns8 * newEnd ); }; // MOOV_Manager #endif // __MOOV_Support_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/ASF_Support.cpp0000664000175000017500000013020412150230672020351 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "ASF_Support.hpp" #include "UnicodeConversions.hpp" #if XMP_WinBuild #define snprintf _snprintf #pragma warning ( disable : 4996 ) // '...' was declared deprecated #pragma warning ( disable : 4267 ) // *** conversion (from size_t), possible loss of date (many 64 bit related) #endif // ============================================================================================= // Platforms other than Win #if ! XMP_WinBuild int IsEqualGUID ( const GUID& guid1, const GUID& guid2 ) { return (memcmp ( &guid1, &guid2, sizeof(GUID) ) == 0); } #endif ASF_Support::ASF_Support() : legacyManager(0), posFileSizeInfo(0) {} ASF_Support::ASF_Support ( ASF_LegacyManager* _legacyManager ) : posFileSizeInfo(0) { legacyManager = _legacyManager; } ASF_Support::~ASF_Support() { legacyManager = 0; } // ============================================================================================= long ASF_Support::OpenASF ( LFA_FileRef fileRef, ObjectState & inOutObjectState ) { XMP_Uns64 pos = 0; XMP_Uns64 len; try { pos = LFA_Seek ( fileRef, 0, SEEK_SET ); } catch ( ... ) {} if ( pos != 0 ) return 0; // read first and following chunks while ( ReadObject ( fileRef, inOutObjectState, &len, pos) ) {} return inOutObjectState.objects.size(); } // ============================================================================================= bool ASF_Support::ReadObject ( LFA_FileRef fileRef, ObjectState & inOutObjectState, XMP_Uns64 * objectLength, XMP_Uns64 & inOutPosition ) { try { XMP_Uns64 startPosition = inOutPosition; long bytesRead; ASF_ObjectBase objectBase; bytesRead = LFA_Read ( fileRef, &objectBase, kASF_ObjectBaseLen, true ); if ( bytesRead != kASF_ObjectBaseLen ) return false; *objectLength = GetUns64LE ( &objectBase.size ); inOutPosition += *objectLength; ObjectData newObject; newObject.pos = startPosition; newObject.len = *objectLength; newObject.guid = objectBase.guid; // xmpIsLastObject indicates, that the XMP-object is the last top-level object // reset here, if any another object is read inOutObjectState.xmpIsLastObject = false; if ( IsEqualGUID ( ASF_Header_Object, newObject.guid ) ) { // header object ? this->ReadHeaderObject ( fileRef, inOutObjectState, newObject ); } else if ( IsEqualGUID ( ASF_XMP_Metadata, newObject.guid ) ) { // check object for XMP GUID inOutObjectState.xmpPos = newObject.pos + kASF_ObjectBaseLen; inOutObjectState.xmpLen = newObject.len - kASF_ObjectBaseLen; inOutObjectState.xmpIsLastObject = true; inOutObjectState.xmpObject = newObject; newObject.xmp = true; } inOutObjectState.objects.push_back ( newObject ); LFA_Seek ( fileRef, inOutPosition, SEEK_SET ); } catch ( ... ) { return false; } return true; } // ============================================================================================= bool ASF_Support::ReadHeaderObject ( LFA_FileRef fileRef, ObjectState& inOutObjectState, const ObjectData& newObject ) { if ( ! IsEqualGUID ( ASF_Header_Object, newObject.guid) || (! legacyManager ) ) return false; std::string buffer; legacyManager->SetPadding(0); try { // read header-object structure XMP_Uns64 pos = newObject.pos; XMP_Uns32 bufferSize = kASF_ObjectBaseLen + 6; buffer.clear(); buffer.reserve ( bufferSize ); buffer.assign ( bufferSize, ' ' ); LFA_Seek ( fileRef, pos, SEEK_SET ); LFA_Read ( fileRef, const_cast(buffer.data()), bufferSize, true ); XMP_Uns64 read = bufferSize; pos += bufferSize; // read contained header objects XMP_Uns32 numberOfHeaders = GetUns32LE ( &buffer[24] ); ASF_ObjectBase objectBase; while ( read < newObject.len ) { LFA_Seek ( fileRef, pos, SEEK_SET ); if ( kASF_ObjectBaseLen != LFA_Read ( fileRef, &objectBase, kASF_ObjectBaseLen, true ) ) break; LFA_Seek ( fileRef, pos, SEEK_SET ); objectBase.size = GetUns64LE ( &objectBase.size ); if ( IsEqualGUID ( ASF_File_Properties_Object, objectBase.guid) && (objectBase.size >= 104 ) ) { buffer.clear(); buffer.reserve ( XMP_Uns32( objectBase.size ) ); buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); LFA_Read ( fileRef, const_cast(buffer.data()), XMP_Int32(objectBase.size), true ); // save position of filesize-information posFileSizeInfo = (pos + 40); // creation date std::string sub ( buffer.substr ( 48, 8 ) ); legacyManager->SetField ( ASF_LegacyManager::fieldCreationDate, sub ); // broadcast flag set ? XMP_Uns32 flags = GetUns32LE ( &buffer[88] ); inOutObjectState.broadcast = (flags & 1); legacyManager->SetBroadcast ( inOutObjectState.broadcast ); legacyManager->SetObjectExists ( ASF_LegacyManager::objectFileProperties ); } else if ( IsEqualGUID ( ASF_Content_Description_Object, objectBase.guid) && (objectBase.size >= 34 ) ) { buffer.clear(); buffer.reserve ( XMP_Uns32( objectBase.size ) ); buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); LFA_Read ( fileRef, const_cast(buffer.data()), XMP_Int32(objectBase.size), true ); XMP_Uns16 titleLen = GetUns16LE ( &buffer[24] ); XMP_Uns16 authorLen = GetUns16LE ( &buffer[26] ); XMP_Uns16 copyrightLen = GetUns16LE ( &buffer[28] ); XMP_Uns16 descriptionLen = GetUns16LE ( &buffer[30] ); XMP_Uns16 ratingLen = GetUns16LE ( &buffer[32] ); XMP_Uns16 fieldPos = 34; std::string titleStr = buffer.substr ( fieldPos, titleLen ); fieldPos += titleLen; legacyManager->SetField ( ASF_LegacyManager::fieldTitle, titleStr ); std::string authorStr = buffer.substr ( fieldPos, authorLen ); fieldPos += authorLen; legacyManager->SetField ( ASF_LegacyManager::fieldAuthor, authorStr ); std::string copyrightStr = buffer.substr ( fieldPos, copyrightLen ); fieldPos += copyrightLen; legacyManager->SetField ( ASF_LegacyManager::fieldCopyright, copyrightStr ); std::string descriptionStr = buffer.substr ( fieldPos, descriptionLen ); fieldPos += descriptionLen; legacyManager->SetField ( ASF_LegacyManager::fieldDescription, descriptionStr ); /* rating is currently not part of reconciliation std::string ratingStr = buffer.substr ( fieldPos, ratingLen ); fieldPos += ratingLen; legacyData.append ( titleStr ); */ legacyManager->SetObjectExists ( ASF_LegacyManager::objectContentDescription ); } else if ( IsEqualGUID ( ASF_Content_Branding_Object, objectBase.guid ) ) { buffer.clear(); buffer.reserve ( XMP_Uns32( objectBase.size ) ); buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); LFA_Read ( fileRef, const_cast(buffer.data()), XMP_Int32(objectBase.size), true ); XMP_Uns32 fieldPos = 28; // copyright URL is 3. element with variable size for ( int i = 1; i <= 3 ; ++i ) { XMP_Uns32 len = GetUns32LE ( &buffer[fieldPos] ); if ( i == 3 ) { std::string copyrightURLStr = buffer.substr ( fieldPos + 4, len ); legacyManager->SetField ( ASF_LegacyManager::fieldCopyrightURL, copyrightURLStr ); } fieldPos += (len + 4); } legacyManager->SetObjectExists ( ASF_LegacyManager::objectContentBranding ); #if ! Exclude_LicenseURL_Recon } else if ( IsEqualGUID ( ASF_Content_Encryption_Object, objectBase.guid ) ) { buffer.clear(); buffer.reserve ( XMP_Uns32( objectBase.size ) ); buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); LFA_Read ( fileRef, const_cast(buffer.data()), XMP_Int32(objectBase.size), true ); XMP_Uns32 fieldPos = 24; // license URL is 4. element with variable size for ( int i = 1; i <= 4 ; ++i ) { XMP_Uns32 len = GetUns32LE ( &buffer[fieldPos] ); if ( i == 4 ) { std::string licenseURLStr = buffer.substr ( fieldPos + 4, len ); legacyManager->SetField ( ASF_LegacyManager::fieldLicenseURL, licenseURLStr ); } fieldPos += (len + 4); } legacyManager->SetObjectExists ( objectContentEncryption ); #endif } else if ( IsEqualGUID ( ASF_Padding_Object, objectBase.guid ) ) { legacyManager->SetPadding ( legacyManager->GetPadding() + (objectBase.size - 24) ); } else if ( IsEqualGUID ( ASF_Header_Extension_Object, objectBase.guid ) ) { this->ReadHeaderExtensionObject ( fileRef, inOutObjectState, pos, objectBase ); } pos += objectBase.size; read += objectBase.size; } } catch ( ... ) { return false; } legacyManager->ComputeDigest(); return true; } // ============================================================================================= bool ASF_Support::WriteHeaderObject ( LFA_FileRef sourceRef, LFA_FileRef destRef, const ObjectData& object, ASF_LegacyManager& _legacyManager, bool usePadding ) { if ( ! IsEqualGUID ( ASF_Header_Object, object.guid ) ) return false; bool ret = false; std::string buffer; XMP_Uns16 valueUns16LE; XMP_Uns32 valueUns32LE; XMP_Uns64 valueUns64LE; try { // read header-object structure XMP_Uns64 pos = object.pos; XMP_Uns32 bufferSize = kASF_ObjectBaseLen + 6; buffer.clear(); buffer.reserve ( bufferSize ); buffer.assign ( bufferSize, ' ' ); LFA_Seek ( sourceRef, pos, SEEK_SET ); LFA_Read ( sourceRef, const_cast(buffer.data()), bufferSize, true ); XMP_Uns64 read = bufferSize; pos += bufferSize; // read contained header objects XMP_Uns32 numberOfHeaders = GetUns32LE ( &buffer[24] ); ASF_ObjectBase objectBase; // prepare new header in memory std::string header; int changedObjects = _legacyManager.changedObjects(); int exportedObjects = 0; int writtenObjects = 0; header.append ( buffer.c_str(), bufferSize ); while ( read < object.len ) { LFA_Seek ( sourceRef, pos, SEEK_SET ); if ( kASF_ObjectBaseLen != LFA_Read ( sourceRef, &objectBase, kASF_ObjectBaseLen, true ) ) break; LFA_Seek ( sourceRef, pos, SEEK_SET ); objectBase.size = GetUns64LE ( &objectBase.size ); int headerStartPos = header.size(); // save position of filesize-information if ( IsEqualGUID ( ASF_File_Properties_Object, objectBase.guid ) ) { posFileSizeInfo = (headerStartPos + 40); } // write objects if ( IsEqualGUID ( ASF_File_Properties_Object, objectBase.guid ) && (objectBase.size >= 104) && (changedObjects & ASF_LegacyManager::objectFileProperties) ) { // copy object and replace creation-date buffer.reserve ( XMP_Uns32 ( objectBase.size ) ); buffer.assign ( XMP_Uns32 ( objectBase.size ), ' ' ); LFA_Read ( sourceRef, const_cast(buffer.data()), XMP_Int32(objectBase.size), true ); header.append ( buffer, 0, XMP_Uns32( objectBase.size ) ); if ( ! _legacyManager.GetBroadcast() ) { buffer = _legacyManager.GetField ( ASF_LegacyManager::fieldCreationDate ); ReplaceString ( header, buffer, (headerStartPos + 48), 8 ); } exportedObjects |= ASF_LegacyManager::objectFileProperties; } else if ( IsEqualGUID ( ASF_Content_Description_Object, objectBase.guid ) && (objectBase.size >= 34) && (changedObjects & ASF_LegacyManager::objectContentDescription) ) { // re-create object with xmp-data buffer.reserve ( XMP_Uns32( objectBase.size ) ); buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); LFA_Read ( sourceRef, const_cast(buffer.data()), XMP_Int32(objectBase.size), true ); // write header only header.append ( buffer, 0, XMP_Uns32( kASF_ObjectBaseLen ) ); // write length fields XMP_Uns16 titleLen = _legacyManager.GetField ( ASF_LegacyManager::fieldTitle).size( ); valueUns16LE = MakeUns16LE ( titleLen ); header.append ( (const char*)&valueUns16LE, 2 ); XMP_Uns16 authorLen = _legacyManager.GetField ( ASF_LegacyManager::fieldAuthor).size( ); valueUns16LE = MakeUns16LE ( authorLen ); header.append ( (const char*)&valueUns16LE, 2 ); XMP_Uns16 copyrightLen = _legacyManager.GetField ( ASF_LegacyManager::fieldCopyright).size( ); valueUns16LE = MakeUns16LE ( copyrightLen ); header.append ( (const char*)&valueUns16LE, 2 ); XMP_Uns16 descriptionLen = _legacyManager.GetField ( ASF_LegacyManager::fieldDescription).size( ); valueUns16LE = MakeUns16LE ( descriptionLen ); header.append ( (const char*)&valueUns16LE, 2 ); // retrieve existing overall length of preceding fields XMP_Uns16 precedingLen = 0; precedingLen += GetUns16LE ( &buffer[24] ); // Title precedingLen += GetUns16LE ( &buffer[26] ); // Author precedingLen += GetUns16LE ( &buffer[28] ); // Copyright precedingLen += GetUns16LE ( &buffer[30] ); // Description // retrieve existing 'Rating' length XMP_Uns16 ratingLen = GetUns16LE ( &buffer[32] ); // Rating valueUns16LE = MakeUns16LE ( ratingLen ); header.append ( (const char*)&valueUns16LE, 2 ); // write field contents header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldTitle ) ); header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldAuthor ) ); header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldCopyright ) ); header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldDescription ) ); header.append ( buffer, (34 + precedingLen), ratingLen ); // update new object size valueUns64LE = MakeUns64LE ( header.size() - headerStartPos ); std::string newSize ( (const char*)&valueUns64LE, 8 ); ReplaceString ( header, newSize, (headerStartPos + 16), 8 ); exportedObjects |= ASF_LegacyManager::objectContentDescription; } else if ( IsEqualGUID ( ASF_Content_Branding_Object, objectBase.guid ) && (changedObjects & ASF_LegacyManager::objectContentBranding) ) { // re-create object with xmp-data buffer.reserve ( XMP_Uns32( objectBase.size ) ); buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); LFA_Read ( sourceRef, const_cast(buffer.data()), XMP_Int32(objectBase.size), true ); // calculate size of fields coming before 'Copyright URL' XMP_Uns32 length = 28; length += (GetUns32LE ( &buffer[length] ) + 4); // Banner Image Data length += (GetUns32LE ( &buffer[length] ) + 4); // Banner Image URL // write first part of header header.append ( buffer, 0, length ); // copyright URL length = _legacyManager.GetField ( ASF_LegacyManager::fieldCopyrightURL).size( ); valueUns32LE = MakeUns32LE ( length ); header.append ( (const char*)&valueUns32LE, 4 ); header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldCopyrightURL ) ); // update new object size valueUns64LE = MakeUns64LE ( header.size() - headerStartPos ); std::string newSize ( (const char*)&valueUns64LE, 8 ); ReplaceString ( header, newSize, (headerStartPos + 16), 8 ); exportedObjects |= ASF_LegacyManager::objectContentBranding; #if ! Exclude_LicenseURL_Recon } else if ( IsEqualGUID ( ASF_Content_Encryption_Object, objectBase.guid ) && (changedObjects & ASF_LegacyManager::objectContentEncryption) ) { // re-create object with xmp-data buffer.reserve ( XMP_Uns32( objectBase.size ) ); buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); LFA_Read ( sourceRef, const_cast(buffer.data()), XMP_Int32(objectBase.size), true ); // calculate size of fields coming before 'License URL' XMP_Uns32 length = 24; length += (GetUns32LE ( &buffer[length] ) + 4); // Secret Data length += (GetUns32LE ( &buffer[length] ) + 4); // Protection Type length += (GetUns32LE ( &buffer[length] ) + 4); // Key ID // write first part of header header.append ( buffer, 0, length ); // License URL length = _legacyManager.GetField ( ASF_LegacyManager::fieldLicenseURL).size( ); valueUns32LE = MakeUns32LE ( length ); header.append ( (const char*)&valueUns32LE, 4 ); header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldLicenseURL ) ); // update new object size valueUns64LE = MakeUns64LE ( header.size() - headerStartPos ); std::string newSize ( (const char*)&valueUns64LE, 8 ); ReplaceString ( header, newSize, (headerStartPos + 16), 8 ); exportedObjects |= ASF_LegacyManager::objectContentEncryption; #endif } else if ( IsEqualGUID ( ASF_Header_Extension_Object, objectBase.guid ) && usePadding ) { // re-create object if padding needs to be used buffer.reserve ( XMP_Uns32( objectBase.size ) ); buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); LFA_Read ( sourceRef, const_cast(buffer.data()), XMP_Int32(objectBase.size), true ); ASF_Support::WriteHeaderExtensionObject ( buffer, &header, objectBase, 0 ); } else if ( IsEqualGUID ( ASF_Padding_Object, objectBase.guid ) && usePadding ) { // eliminate padding (will be created as last object) } else { // simply copy all other objects buffer.reserve ( XMP_Uns32( objectBase.size ) ); buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); LFA_Read ( sourceRef, const_cast(buffer.data()), XMP_Int32(objectBase.size), true ); header.append ( buffer, 0, XMP_Uns32( objectBase.size ) ); } pos += objectBase.size; read += objectBase.size; writtenObjects ++; } // any objects to create ? int newObjects = (changedObjects ^ exportedObjects); if ( newObjects ) { // create new objects with xmp-data int headerStartPos; ASF_ObjectBase newObjectBase; XMP_Uns32 length; if ( newObjects & ASF_LegacyManager::objectContentDescription ) { headerStartPos = header.size(); newObjectBase.guid = ASF_Content_Description_Object; newObjectBase.size = 0; // write object header header.append ( (const char*)&newObjectBase, kASF_ObjectBaseLen ); XMP_Uns16 titleLen = _legacyManager.GetField ( ASF_LegacyManager::fieldTitle).size( ); valueUns16LE = MakeUns16LE ( titleLen ); header.append ( (const char*)&valueUns16LE, 2 ); XMP_Uns16 authorLen = _legacyManager.GetField ( ASF_LegacyManager::fieldAuthor).size( ); valueUns16LE = MakeUns16LE ( authorLen ); header.append ( (const char*)&valueUns16LE, 2 ); XMP_Uns16 copyrightLen = _legacyManager.GetField ( ASF_LegacyManager::fieldCopyright).size( ); valueUns16LE = MakeUns16LE ( copyrightLen ); header.append ( (const char*)&valueUns16LE, 2 ); XMP_Uns16 descriptionLen = _legacyManager.GetField ( ASF_LegacyManager::fieldDescription).size( ); valueUns16LE = MakeUns16LE ( descriptionLen ); header.append ( (const char*)&valueUns16LE, 2 ); XMP_Uns16 ratingLen = 0; valueUns16LE = MakeUns16LE ( ratingLen ); header.append ( (const char*)&valueUns16LE, 2 ); // write field contents header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldTitle ) ); header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldAuthor ) ); header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldCopyright ) ); header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldDescription ) ); // update new object size valueUns64LE = MakeUns64LE ( header.size() - headerStartPos ); std::string newSize ( (const char*)&valueUns64LE, 8 ); ReplaceString ( header, newSize, (headerStartPos + 16), 8 ); newObjects &= ~ASF_LegacyManager::objectContentDescription; writtenObjects ++; } if ( newObjects & ASF_LegacyManager::objectContentBranding ) { headerStartPos = header.size(); newObjectBase.guid = ASF_Content_Branding_Object; newObjectBase.size = 0; // write object header header.append ( (const char*)&newObjectBase, kASF_ObjectBaseLen ); // write 'empty' fields header.append ( 12, '\0' ); // copyright URL length = _legacyManager.GetField ( ASF_LegacyManager::fieldCopyrightURL).size( ); valueUns32LE = MakeUns32LE ( length ); header.append ( (const char*)&valueUns32LE, 4 ); header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldCopyrightURL ) ); // update new object size valueUns64LE = MakeUns64LE ( header.size() - headerStartPos ); std::string newSize ( (const char*)&valueUns64LE, 8 ); ReplaceString ( header, newSize, (headerStartPos + 16), 8 ); newObjects &= ~ASF_LegacyManager::objectContentBranding; writtenObjects ++; } #if ! Exclude_LicenseURL_Recon if ( newObjects & ASF_LegacyManager::objectContentEncryption ) { headerStartPos = header.size(); newObjectBase.guid = ASF_Content_Encryption_Object; newObjectBase.size = 0; // write object header header.append ( (const char*)&newObjectBase, kASF_ObjectBaseLen ); // write 'empty' fields header.append ( 12, '\0' ); // License URL length = _legacyManager.GetField ( ASF_LegacyManager::fieldLicenseURL).size( ); valueUns32LE = MakeUns32LE ( length ); header.append ( (const char*)&valueUns32LE, 4 ); header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldLicenseURL ) ); // update new object size valueUns64LE = MakeUns64LE ( header.size() - headerStartPos ); std::string newSize ( (const char*)&valueUns64LE, 8 ); ReplaceString ( header, newSize, (headerStartPos + 16), 8 ); newObjects &= ~ASF_LegacyManager::objectContentEncryption; writtenObjects ++; } #endif } // create padding object ? if ( usePadding && (header.size ( ) < object.len ) ) { ASF_Support::CreatePaddingObject ( &header, (object.len - header.size()) ); writtenObjects ++; } // update new header-object size valueUns64LE = MakeUns64LE ( header.size() ); std::string newValue ( (const char*)&valueUns64LE, 8 ); ReplaceString ( header, newValue, 16, 8 ); // update new number of Header objects valueUns32LE = MakeUns32LE ( writtenObjects ); newValue = std::string ( (const char*)&valueUns32LE, 4 ); ReplaceString ( header, newValue, 24, 4 ); // if we are operating on the same file (in-place update), place pointer before writing if ( sourceRef == destRef ) LFA_Seek ( destRef, object.pos, SEEK_SET ); // write header LFA_Write ( destRef, header.c_str(), header.size() ); } catch ( ... ) { ret = false; } return ret; } // ============================================================================================= bool ASF_Support::UpdateHeaderObject ( LFA_FileRef fileRef, const ObjectData& object, ASF_LegacyManager& _legacyManager ) { return ASF_Support::WriteHeaderObject ( fileRef, fileRef, object, _legacyManager, true ); } // ============================================================================================= bool ASF_Support::UpdateFileSize ( LFA_FileRef fileRef ) { if ( fileRef == 0 ) return false; XMP_Uns64 posCurrent = LFA_Seek ( fileRef, 0, SEEK_CUR ); XMP_Uns64 newSizeLE = MakeUns64LE ( LFA_Measure ( fileRef ) ); if ( this->posFileSizeInfo != 0 ) { LFA_Seek ( fileRef, this->posFileSizeInfo, SEEK_SET ); } else { // The position of the file size field is not known, find it. ASF_ObjectBase objHeader; // Read the Header object at the start of the file. LFA_Seek ( fileRef, 0, SEEK_SET ); LFA_Read ( fileRef, &objHeader, kASF_ObjectBaseLen, kLFA_RequireAll ); if ( ! IsEqualGUID ( ASF_Header_Object, objHeader.guid ) ) return false; XMP_Uns32 childCount; LFA_Read ( fileRef, &childCount, 4, kLFA_RequireAll ); childCount = GetUns32LE ( &childCount ); LFA_Seek ( fileRef, 2, SEEK_CUR ); // Skip the 2 reserved bytes. // Look for the File Properties object in the Header's children. for ( ; childCount > 0; --childCount ) { LFA_Read ( fileRef, &objHeader, kASF_ObjectBaseLen, kLFA_RequireAll ); if ( IsEqualGUID ( ASF_File_Properties_Object, objHeader.guid ) ) break; XMP_Uns64 dataLen = GetUns64LE ( &objHeader.size ) - 24; LFA_Seek ( fileRef, dataLen, SEEK_CUR ); // Skip this object's data. } if ( childCount == 0 ) return false; // Seek to the file size field. XMP_Uns64 fpoSize = GetUns64LE ( &objHeader.size ); if ( fpoSize < (16+8+16+8) ) return false; LFA_Seek ( fileRef, 16, SEEK_CUR ); // Skip to the file size field. } LFA_Write ( fileRef, &newSizeLE, 8 ); // Write the new file size. LFA_Seek ( fileRef, posCurrent, SEEK_SET ); return true; } // ============================================================================================= bool ASF_Support::ReadHeaderExtensionObject ( LFA_FileRef fileRef, ObjectState& inOutObjectState, const XMP_Uns64& _pos, const ASF_ObjectBase& _objectBase ) { if ( ! IsEqualGUID ( ASF_Header_Extension_Object, _objectBase.guid) || (! legacyManager ) ) return false; try { // read extended header-object structure beginning at the data part (offset = 46) const XMP_Uns64 offset = 46; XMP_Uns64 read = 0; XMP_Uns64 data = (_objectBase.size - offset); XMP_Uns64 pos = (_pos + offset); ASF_ObjectBase objectBase; while ( read < data ) { LFA_Seek ( fileRef, pos, SEEK_SET ); if ( kASF_ObjectBaseLen != LFA_Read ( fileRef, &objectBase, kASF_ObjectBaseLen, true ) ) break; objectBase.size = GetUns64LE ( &objectBase.size ); if ( IsEqualGUID ( ASF_Padding_Object, objectBase.guid ) ) { legacyManager->SetPadding ( legacyManager->GetPadding() + (objectBase.size - 24) ); } pos += objectBase.size; read += objectBase.size; } } catch ( ... ) { return false; } return true; } // ============================================================================================= bool ASF_Support::WriteHeaderExtensionObject ( const std::string& buffer, std::string* header, const ASF_ObjectBase& _objectBase, const int /*reservePadding*/ ) { if ( ! IsEqualGUID ( ASF_Header_Extension_Object, _objectBase.guid ) || (! header) || (buffer.size() < 46) ) return false; const XMP_Uns64 offset = 46; int startPos = header->size(); // copy header base header->append ( buffer, 0, offset ); // read extended header-object structure beginning at the data part (offset = 46) XMP_Uns64 read = 0; XMP_Uns64 data = (_objectBase.size - offset); XMP_Uns64 pos = offset; ASF_ObjectBase objectBase; while ( read < data ) { memcpy ( &objectBase, &buffer[int(pos)], kASF_ObjectBaseLen ); objectBase.size = GetUns64LE ( &objectBase.size ); if ( IsEqualGUID ( ASF_Padding_Object, objectBase.guid ) ) { // eliminate } else { // copy other objects header->append ( buffer, XMP_Uns32(pos), XMP_Uns32(objectBase.size) ); } pos += objectBase.size; read += objectBase.size; } // update header extension data size XMP_Uns32 valueUns32LE = MakeUns32LE ( header->size() - startPos - offset ); std::string newDataSize ( (const char*)&valueUns32LE, 4 ); ReplaceString ( *header, newDataSize, (startPos + 42), 4 ); // update new object size XMP_Uns64 valueUns64LE = MakeUns64LE ( header->size() - startPos ); std::string newObjectSize ( (const char*)&valueUns64LE, 8 ); ReplaceString ( *header, newObjectSize, (startPos + 16), 8 ); return true; } // ============================================================================================= bool ASF_Support::CreatePaddingObject ( std::string* header, const XMP_Uns64 size ) { if ( ( ! header) || (size < 24) ) return false; ASF_ObjectBase newObjectBase; newObjectBase.guid = ASF_Padding_Object; newObjectBase.size = MakeUns64LE ( size ); // write object header header->append ( (const char*)&newObjectBase, kASF_ObjectBaseLen ); // write 'empty' padding header->append ( XMP_Uns32 ( size - 24 ), '\0' ); return true; } // ============================================================================================= bool ASF_Support::WriteXMPObject ( LFA_FileRef fileRef, XMP_Uns32 len, const char* inBuffer ) { bool ret = false; ASF_ObjectBase objectBase = { ASF_XMP_Metadata, 0 }; objectBase.size = MakeUns64LE ( len + kASF_ObjectBaseLen ); try { LFA_Write ( fileRef, &objectBase, kASF_ObjectBaseLen ); LFA_Write ( fileRef, inBuffer, len ); ret = true; } catch ( ... ) {} return ret; } // ============================================================================================= bool ASF_Support::UpdateXMPObject ( LFA_FileRef fileRef, const ObjectData& object, XMP_Uns32 len, const char * inBuffer ) { bool ret = false; ASF_ObjectBase objectBase = { ASF_XMP_Metadata, 0 }; objectBase.size = MakeUns64LE ( len + kASF_ObjectBaseLen ); try { LFA_Seek ( fileRef, object.pos, SEEK_SET ); LFA_Write ( fileRef, &objectBase, kASF_ObjectBaseLen ); LFA_Write ( fileRef, inBuffer, len ); ret = true; } catch ( ... ) {} return ret; } // ============================================================================================= bool ASF_Support::CopyObject ( LFA_FileRef sourceRef, LFA_FileRef destRef, const ObjectData& object ) { try { LFA_Seek ( sourceRef, object.pos, SEEK_SET ); LFA_Copy ( sourceRef, destRef, object.len ); } catch ( ... ) { return false; } return true; } // ============================================================================================= bool ASF_Support::ReadBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns64 len, char * outBuffer ) { try { if ( (fileRef == 0) || (outBuffer == 0) ) return false; LFA_Seek (fileRef, pos, SEEK_SET ); long bytesRead = LFA_Read ( fileRef, outBuffer, XMP_Int32(len), true ); if ( XMP_Uns32 ( bytesRead ) != len ) return false; return true; } catch ( ... ) {} return false; } // ============================================================================================= bool ASF_Support::WriteBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns32 len, const char * inBuffer ) { try { if ( (fileRef == 0) || (inBuffer == 0) ) return false; LFA_Seek (fileRef, pos, SEEK_SET ); LFA_Write( fileRef, inBuffer, len ); return true; } catch ( ... ) {} return false; } // ================================================================================================= std::string ASF_Support::ReplaceString ( std::string& operand, std::string& str, int offset, int count ) { std::basic_string::iterator iterF1, iterL1, iterF2, iterL2; iterF1 = operand.begin() + offset; iterL1 = operand.begin() + offset + count; iterF2 = str.begin(); iterL2 = str.begin() + count; return operand.replace ( iterF1, iterL1, iterF2, iterL2 ); } // ================================================================================================= ASF_LegacyManager::ASF_LegacyManager() : fields(fieldLast), broadcastSet(false), digestComputed(false), imported(false), objectsExisting(0), objectsToExport(0), legacyDiff(0), padding(0) { // Nothing more to do. } // ================================================================================================= ASF_LegacyManager::~ASF_LegacyManager() { // Nothing to do. } // ================================================================================================= bool ASF_LegacyManager::SetField ( fieldType field, const std::string& value ) { if ( field >= fieldLast ) return false; unsigned int maxSize = this->GetFieldMaxSize ( field ); if (value.size ( ) <= maxSize ) { fields[field] = value; } else { fields[field] = value.substr ( 0, maxSize ); } if ( field == fieldCopyrightURL ) NormalizeStringDisplayASCII ( fields[field] ); #if ! Exclude_LicenseURL_Recon if ( field == fieldLicenseURL ) NormalizeStringDisplayASCII ( fields[field] ); #endif return true; } // ================================================================================================= std::string ASF_LegacyManager::GetField ( fieldType field ) { if ( field >= fieldLast ) return std::string(); return fields[field]; } // ================================================================================================= unsigned int ASF_LegacyManager::GetFieldMaxSize ( fieldType field ) { unsigned int maxSize = 0; switch ( field ) { case fieldCreationDate : maxSize = 8; break; case fieldTitle : case fieldAuthor : case fieldCopyright : case fieldDescription : maxSize = 0xFFFF; break; case fieldCopyrightURL : #if ! Exclude_LicenseURL_Recon case fieldLicenseURL : #endif maxSize = 0xFFFFFFFF; break; default: break; } return maxSize; } // ================================================================================================= void ASF_LegacyManager::SetObjectExists ( objectType object ) { objectsExisting |= object; } // ================================================================================================= void ASF_LegacyManager::SetBroadcast ( const bool broadcast ) { broadcastSet = broadcast; } // ================================================================================================= bool ASF_LegacyManager::GetBroadcast() { return broadcastSet; } // ================================================================================================= void ASF_LegacyManager::ComputeDigest() { MD5_CTX context; MD5_Digest digest; char buffer[40]; MD5Init ( &context ); digestStr.clear(); digestStr.reserve ( 160 ); for ( int type=0; type < fieldLast; ++type ) { if (fields[type].size ( ) > 0 ) { snprintf ( buffer, sizeof(buffer), "%d,", type ); digestStr.append ( buffer ); MD5Update ( &context, (XMP_Uns8*)fields[type].data(), fields[type].size() ); } } digestStr[digestStr.size()-1] = ';'; MD5Final ( digest, &context ); size_t in, out; for ( in = 0, out = 0; in < 16; in += 1, out += 2 ) { XMP_Uns8 byte = digest[in]; buffer[out] = ReconcileUtils::kHexDigits [ byte >> 4 ]; buffer[out+1] = ReconcileUtils::kHexDigits [ byte & 0xF ]; } buffer[32] = 0; digestStr.append ( buffer ); digestComputed = true; } // ================================================================================================= bool ASF_LegacyManager::CheckDigest ( const SXMPMeta& xmp ) { bool ret = false; if ( ! digestComputed ) this->ComputeDigest(); std::string oldDigest; if ( xmp.GetProperty ( kXMP_NS_ASF, "NativeDigest", &oldDigest, 0 ) ) { ret = (digestStr == oldDigest); } return ret; } // ================================================================================================= void ASF_LegacyManager::SetDigest ( SXMPMeta* xmp ) { if ( ! digestComputed ) this->ComputeDigest(); xmp->SetProperty ( kXMP_NS_ASF, "NativeDigest", digestStr.c_str() ); } // ================================================================================================= void ASF_LegacyManager::ImportLegacy ( SXMPMeta* xmp ) { std::string utf8; if ( ! broadcastSet ) { ConvertMSDateToISODate ( fields[fieldCreationDate], &utf8 ); if ( ! utf8.empty() ) xmp->SetProperty ( kXMP_NS_XMP, "CreateDate", utf8.c_str(), kXMP_DeleteExisting ); } FromUTF16 ( (UTF16Unit*)fields[fieldTitle].c_str(), (fields[fieldTitle].size() / 2), &utf8, false ); if ( ! utf8.empty() ) xmp->SetLocalizedText ( kXMP_NS_DC, "title", "", "x-default", utf8.c_str(), kXMP_DeleteExisting ); xmp->DeleteProperty ( kXMP_NS_DC, "creator" ); FromUTF16 ( (UTF16Unit*)fields[fieldAuthor].c_str(), (fields[fieldAuthor].size() / 2), &utf8, false ); if ( ! utf8.empty() ) SXMPUtils::SeparateArrayItems ( xmp, kXMP_NS_DC, "creator", (kXMP_PropArrayIsOrdered | kXMPUtil_AllowCommas), utf8.c_str() ); FromUTF16 ( (UTF16Unit*)fields[fieldCopyright].c_str(), (fields[fieldCopyright].size() / 2), &utf8, false ); if ( ! utf8.empty() ) xmp->SetLocalizedText ( kXMP_NS_DC, "rights", "", "x-default", utf8.c_str(), kXMP_DeleteExisting ); FromUTF16 ( (UTF16Unit*)fields[fieldDescription].c_str(), (fields[fieldDescription].size() / 2), &utf8, false ); if ( ! utf8.empty() ) xmp->SetLocalizedText ( kXMP_NS_DC, "description", "", "x-default", utf8.c_str(), kXMP_DeleteExisting ); if ( ! utf8.empty() ) xmp->SetProperty ( kXMP_NS_XMP_Rights, "WebStatement", fields[fieldCopyrightURL].c_str(), kXMP_DeleteExisting ); #if ! Exclude_LicenseURL_Recon if ( ! fields[fieldLicenseURL].empty() ) xmp->SetProperty ( kXMP_NS_XMP_Rights, "Certificate", fields[fieldLicenseURL].c_str(), kXMP_DeleteExisting ); #endif imported = true; } // ================================================================================================= int ASF_LegacyManager::ExportLegacy ( const SXMPMeta& xmp ) { int changed = 0; objectsToExport = 0; legacyDiff = 0; std::string utf8; std::string utf16; XMP_OptionBits flags; if ( ! broadcastSet ) { if ( xmp.GetProperty ( kXMP_NS_XMP, "CreateDate", &utf8, &flags ) ) { std::string date; ConvertISODateToMSDate ( utf8, &date ); if ( fields[fieldCreationDate] != date ) { legacyDiff += date.size(); legacyDiff -= fields[fieldCreationDate].size(); this->SetField ( fieldCreationDate, date ); objectsToExport |= objectFileProperties; changed ++; } } } if ( xmp.GetLocalizedText ( kXMP_NS_DC, "title", "", "x-default", 0, &utf8, &flags ) ) { NormalizeStringTrailingNull ( utf8 ); ToUTF16 ( (const UTF8Unit*)utf8.data(), utf8.size(), &utf16, false ); if ( fields[fieldTitle] != utf16 ) { legacyDiff += utf16.size(); legacyDiff -= fields[fieldTitle].size(); this->SetField ( fieldTitle, utf16 ); objectsToExport |= objectContentDescription; changed ++; } } utf8.clear(); SXMPUtils::CatenateArrayItems ( xmp, kXMP_NS_DC, "creator", 0, 0, kXMPUtil_AllowCommas, &utf8 ); if ( ! utf8.empty() ) { NormalizeStringTrailingNull ( utf8 ); ToUTF16 ( (const UTF8Unit*)utf8.data(), utf8.size(), &utf16, false ); if ( fields[fieldAuthor] != utf16 ) { legacyDiff += utf16.size(); legacyDiff -= fields[fieldAuthor].size(); this->SetField ( fieldAuthor, utf16 ); objectsToExport |= objectContentDescription; changed ++; } } if ( xmp.GetLocalizedText ( kXMP_NS_DC, "rights", "", "x-default", 0, &utf8, &flags ) ) { NormalizeStringTrailingNull ( utf8 ); ToUTF16 ( (const UTF8Unit*)utf8.data(), utf8.size(), &utf16, false ); if ( fields[fieldCopyright] != utf16 ) { legacyDiff += utf16.size(); legacyDiff -= fields[fieldCopyright].size(); this->SetField ( fieldCopyright, utf16 ); objectsToExport |= objectContentDescription; changed ++; } } if ( xmp.GetLocalizedText ( kXMP_NS_DC, "description", "", "x-default", 0, &utf8, &flags ) ) { NormalizeStringTrailingNull ( utf8 ); ToUTF16 ( (const UTF8Unit*)utf8.data(), utf8.size(), &utf16, false ); if ( fields[fieldDescription] != utf16 ) { legacyDiff += utf16.size(); legacyDiff -= fields[fieldDescription].size(); this->SetField ( fieldDescription, utf16 ); objectsToExport |= objectContentDescription; changed ++; } } if ( xmp.GetProperty ( kXMP_NS_XMP_Rights, "WebStatement", &utf8, &flags ) ) { NormalizeStringTrailingNull ( utf8 ); if ( fields[fieldCopyrightURL] != utf8 ) { legacyDiff += utf8.size(); legacyDiff -= fields[fieldCopyrightURL].size(); this->SetField ( fieldCopyrightURL, utf8 ); objectsToExport |= objectContentBranding; changed ++; } } #if ! Exclude_LicenseURL_Recon if ( xmp.GetProperty ( kXMP_NS_XMP_Rights, "Certificate", &utf8, &flags ) ) { NormalizeStringTrailingNull ( utf8 ); if ( fields[fieldLicenseURL] != utf8 ) { legacyDiff += utf8.size(); legacyDiff -= fields[fieldLicenseURL].size(); this->SetField ( fieldLicenseURL, utf8 ); objectsToExport |= objectContentEncryption; changed ++; } } #endif // find objects, that would need to be created on legacy export int newObjects = (objectsToExport & !objectsExisting); // calculate minimum storage for new objects, that might be created on export if ( newObjects & objectContentDescription ) legacyDiff += sizeContentDescription; if ( newObjects & objectContentBranding ) legacyDiff += sizeContentBranding; if ( newObjects & objectContentEncryption ) legacyDiff += sizeContentEncryption; ComputeDigest(); return changed; } // ================================================================================================= bool ASF_LegacyManager::hasLegacyChanged() { return (objectsToExport != 0); } // ================================================================================================= XMP_Int64 ASF_LegacyManager::getLegacyDiff() { return (this->hasLegacyChanged() ? legacyDiff : 0); } // ================================================================================================= int ASF_LegacyManager::changedObjects() { return objectsToExport; } // ================================================================================================= void ASF_LegacyManager::SetPadding ( XMP_Int64 _padding ) { padding = _padding; } // ================================================================================================= XMP_Int64 ASF_LegacyManager::GetPadding() { return padding; } // ================================================================================================= std::string ASF_LegacyManager::NormalizeStringDisplayASCII ( std::string& operand ) { std::basic_string::iterator current = operand.begin(); std::basic_string::iterator end = operand.end();; for ( ; (current != end); ++current ) { char element = *current; if ( ( (element < 0x21) && (element != 0x00)) || (element > 0x7e) ) { *current = '?'; } } return operand; } // ================================================================================================= std::string ASF_LegacyManager::NormalizeStringTrailingNull ( std::string& operand ) { if ( ( operand.size() > 0) && (operand[operand.size() - 1] != '\0') ) { operand.append ( 1, '\0' ); } return operand; } // ================================================================================================= int ASF_LegacyManager::DaysInMonth ( XMP_Int32 year, XMP_Int32 month ) { static short daysInMonth[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec int days = daysInMonth [ month ]; if ( (month == 2) && IsLeapYear ( year ) ) days += 1; return days; } // ================================================================================================= bool ASF_LegacyManager::IsLeapYear ( long year ) { if ( year < 0 ) year = -year + 1; // Fold the negative years, assuming there is a year 0. if ( (year % 4) != 0 ) return false; // Not a multiple of 4. if ( (year % 100) != 0 ) return true; // A multiple of 4 but not a multiple of 100. if ( (year % 400) == 0 ) return true; // A multiple of 400. return false; // A multiple of 100 but not a multiple of 400. } // ================================================================================================= void ASF_LegacyManager::ConvertMSDateToISODate ( std::string& source, std::string* dest ) { XMP_Int64 creationDate = GetUns64LE ( source.c_str() ); XMP_Int64 totalSecs = creationDate / (10*1000*1000); XMP_Int32 nanoSec = ( ( XMP_Int32) (creationDate - (totalSecs * 10*1000*1000)) ) * 100; XMP_Int32 days = (XMP_Int32) (totalSecs / 86400); totalSecs -= ( ( XMP_Int64)days * 86400 ); XMP_Int32 hour = (XMP_Int32) (totalSecs / 3600); totalSecs -= ( ( XMP_Int64)hour * 3600 ); XMP_Int32 minute = (XMP_Int32) (totalSecs / 60); totalSecs -= ( ( XMP_Int64)minute * 60 ); XMP_Int32 second = (XMP_Int32)totalSecs; // A little more simple code converts this to an XMP date string: XMP_DateTime date; memset ( &date, 0, sizeof ( date ) ); date.year = 1601; // The MS date origin. date.month = 1; date.day = 1; date.day += days; // Add in the delta. date.hour = hour; date.minute = minute; date.second = second; date.nanoSecond = nanoSec; date.hasTimeZone = true; // ! Needed for ConvertToUTCTime to do anything. SXMPUtils::ConvertToUTCTime ( &date ); // Normalize the date/time. SXMPUtils::ConvertFromDate ( date, dest ); // Convert to an ISO 8601 string. } // ================================================================================================= void ASF_LegacyManager::ConvertISODateToMSDate ( std::string& source, std::string* dest ) { XMP_DateTime date; SXMPUtils::ConvertToDate ( source, &date ); SXMPUtils::ConvertToUTCTime ( &date ); XMP_Int64 creationDate; creationDate = date.nanoSecond / 100; creationDate += (XMP_Int64 ( date.second) * (10*1000*1000) ); creationDate += (XMP_Int64 ( date.minute) * 60 * (10*1000*1000) ); creationDate += (XMP_Int64 ( date.hour) * 3600 * (10*1000*1000) ); XMP_Int32 days = (date.day - 1); --date.month; while ( date.month >= 1 ) { days += DaysInMonth ( date.year, date.month ); --date.month; } --date.year; while ( date.year >= 1601 ) { days += (IsLeapYear ( date.year) ? 366 : 365 ); --date.year; } creationDate += (XMP_Int64 ( days) * 86400 * (10*1000*1000) ); creationDate = GetUns64LE ( &creationDate ); dest->assign ( (const char*)&creationDate, 8 ); } exempi-2.2.1/source/XMPFiles/FormatSupport/Reconcile_Impl.hpp0000664000175000017500000001022612150230673021077 00000000000000#ifndef __Reconcile_Impl_hpp__ #define __Reconcile_Impl_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "ReconcileLegacy.hpp" #include "MD5.h" // ================================================================================================= /// \file Reconcile_Impl.hpp /// \brief Implementation utilities for the legacy metadata reconciliation support. /// // ================================================================================================= typedef XMP_Uns8 MD5_Digest[16]; // ! Should be in MD5.h. enum { kDigestMissing = -1, // A partial import is done, existing XMP is left alone. kDigestDiffers = 0, // A full import is done, existing XMP is deleted or replaced. kDigestMatches = +1 // No importing is done. }; namespace ReconcileUtils { // *** These ought to be with the Unicode conversions. static const char * kHexDigits = "0123456789ABCDEF"; bool IsASCII ( const void * _textPtr, size_t textLen ); bool IsUTF8 ( const void * _textPtr, size_t textLen ); void UTF8ToLocal ( const void * _utf8Ptr, size_t utf8Len, std::string * local ); void UTF8ToLatin1 ( const void * _utf8Ptr, size_t utf8Len, std::string * latin1 ); void LocalToUTF8 ( const void * _localPtr, size_t localLen, std::string * utf8 ); void Latin1ToUTF8 ( const void * _latin1Ptr, size_t latin1Len, std::string * utf8 ); #if XMP_WinBuild void UTF8ToWinEncoding ( UINT codePage, const XMP_Uns8 * utf8Ptr, size_t utf8Len, std::string * host ); void WinEncodingToUTF8 ( UINT codePage, const XMP_Uns8 * hostPtr, size_t hostLen, std::string * utf8 ); #elif XMP_MacBuild void UTF8ToMacEncoding ( XMP_Uns16 macScript, XMP_Uns16 macLang, const XMP_Uns8 * utf8Ptr, size_t utf8Len, std::string * host ); void MacEncodingToUTF8 ( XMP_Uns16 macScript, XMP_Uns16 macLang, const XMP_Uns8 * hostPtr, size_t hostLen, std::string * utf8 ); #endif }; // ReconcileUtils namespace PhotoDataUtils { int CheckIPTCDigest ( const void * newPtr, const XMP_Uns32 newLen, const void * oldDigest ); void SetIPTCDigest ( void * iptcPtr, XMP_Uns32 iptcLen, PSIR_Manager * psir ); bool GetNativeInfo ( const TIFF_Manager & exif, XMP_Uns8 ifd, XMP_Uns16 id, TIFF_Manager::TagInfo * info ); size_t GetNativeInfo ( const IPTC_Manager & iptc, XMP_Uns8 id, int digestState, bool haveXMP, IPTC_Manager::DataSetInfo * info ); bool IsValueDifferent ( const TIFF_Manager::TagInfo & exifInfo, const std::string & xmpValue, std::string * exifValue ); bool IsValueDifferent ( const IPTC_Manager & newIPTC, const IPTC_Manager & oldIPTC, XMP_Uns8 id ); void ImportPSIR ( const PSIR_Manager & psir, SXMPMeta * xmp, int iptcDigestState ); void Import2WayIPTC ( const IPTC_Manager & iptc, SXMPMeta * xmp, int iptcDigestState ); void Import2WayExif ( const TIFF_Manager & exif, SXMPMeta * xmp, int iptcDigestState ); void Import3WayItems ( const TIFF_Manager & exif, const IPTC_Manager & iptc, SXMPMeta * xmp, int iptcDigestState ); void ExportPSIR ( const SXMPMeta & xmp, PSIR_Manager * psir ); void ExportIPTC ( const SXMPMeta & xmp, IPTC_Manager * iptc ); void ExportExif ( SXMPMeta * xmp, TIFF_Manager * exif ); // These need to be exposed for use in Import3WayItem: void ImportIPTC_Simple ( const IPTC_Manager & iptc, SXMPMeta * xmp, XMP_Uns8 id, const char * xmpNS, const char * xmpProp ); void ImportIPTC_LangAlt ( const IPTC_Manager & iptc, SXMPMeta * xmp, XMP_Uns8 id, const char * xmpNS, const char * xmpProp ); void ImportIPTC_Array ( const IPTC_Manager & iptc, SXMPMeta * xmp, XMP_Uns8 id, const char * xmpNS, const char * xmpProp ); void ImportIPTC_Date ( XMP_Uns8 dateID, const IPTC_Manager & iptc, SXMPMeta * xmp ); }; // PhotoDataUtils #endif // __Reconcile_Impl_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/XMPScanner.cpp0000664000175000017500000014312312150230673020167 00000000000000// ================================================================================================= // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // Adobe patent application tracking #P435, entitled 'Unique markers to simplify embedding data of // one format in a file with a different format', inventors: Sean Parent, Greg Gilley. // ================================================================================================= #if WIN32 #pragma warning ( disable : 4127 ) // conditional expression is constant #pragma warning ( disable : 4510 ) // default constructor could not be generated #pragma warning ( disable : 4610 ) // user defined constructor required #pragma warning ( disable : 4786 ) // debugger can't handle long symbol names #endif #include "XMPScanner.hpp" #include #include #include #include #if DEBUG #include #include #include #endif #ifndef UseStringPushBack // VC++ 6.x does not provide push_back for strings! #define UseStringPushBack 0 #endif using namespace std; // *** Consider Boyer-Moore style search for "fCharForm = eChar8Bit; // We might have just failed from a bogus 16 or 32 bit case. ths->fBytesPerChar = 1; while ( ths->fBufferPtr < ths->fBufferLimit ) { // Don't skip nulls for the header's '<'! if ( *ths->fBufferPtr == '<' ) break; ths->fBufferPtr++; } if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriNo; ths->fBufferPtr++; return eTriYes; } else { // -------------------------------------------------------------------------------- // We're looking for the '<' of the trailer. We're already inside the packet body, // looking for the trailer. So here if we fail we must return eTriMaybe so that we // keep looking for the trailer in the next buffer. const int bytesPerChar = ths->fBytesPerChar; while ( ths->fBufferPtr < ths->fBufferLimit ) { if ( *ths->fBufferPtr == '<' ) break; ths->fBufferPtr += bytesPerChar; } if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe; ths->fBufferPtr += bytesPerChar; return eTriYes; } } // FindLessThan // ================================================================================================= // MatchString // =========== XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::MatchString ( PacketMachine * ths, const char * literal ) { const int bytesPerChar = ths->fBytesPerChar; const char * litPtr = literal + ths->fPosition; const XMP_Int32 charsToGo = (XMP_Int32) strlen ( literal ) - ths->fPosition; int charsDone = 0; while ( (charsDone < charsToGo) && (ths->fBufferPtr < ths->fBufferLimit) ) { if ( *litPtr != *ths->fBufferPtr ) return eTriNo; charsDone++; litPtr++; ths->fBufferPtr += bytesPerChar; } if ( charsDone == charsToGo ) return eTriYes; ths->fPosition += charsDone; return eTriMaybe; } // MatchString // ================================================================================================= // MatchChar // ========= XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::MatchChar ( PacketMachine * ths, const char * literal ) { const int bytesPerChar = ths->fBytesPerChar; if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe; const char currChar = *ths->fBufferPtr; if ( currChar != *literal ) return eTriNo; ths->fBufferPtr += bytesPerChar; return eTriYes; } // MatchChar // ================================================================================================= // MatchOpenQuote // ============== XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::MatchOpenQuote ( PacketMachine * ths, const char * /* unused */ ) { const int bytesPerChar = ths->fBytesPerChar; if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe; const char currChar = *ths->fBufferPtr; if ( (currChar != '\'') && (currChar != '"') ) return eTriNo; ths->fQuoteChar = currChar; ths->fBufferPtr += bytesPerChar; return eTriYes; } // MatchOpenQuote // ================================================================================================= // MatchCloseQuote // =============== XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::MatchCloseQuote ( PacketMachine * ths, const char * /* unused */ ) { return MatchChar ( ths, &ths->fQuoteChar ); } // MatchCloseQuote // ================================================================================================= // CaptureAttrName // =============== XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::CaptureAttrName ( PacketMachine * ths, const char * /* unused */ ) { const int bytesPerChar = ths->fBytesPerChar; char currChar; if ( ths->fPosition == 0 ) { // Get the first character in the name. if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe; currChar = *ths->fBufferPtr; if ( ths->fAttrName.size() == 0 ) { if ( ! ( ( ('a' <= currChar) && (currChar <= 'z') ) || ( ('A' <= currChar) && (currChar <= 'Z') ) || (currChar == '_') || (currChar == ':') ) ) { return eTriNo; } } ths->fAttrName.erase ( ths->fAttrName.begin(), ths->fAttrName.end() ); #if UseStringPushBack ths->fAttrName.push_back ( currChar ); #else ths->fAttrName.insert ( ths->fAttrName.end(), currChar ); #endif ths->fBufferPtr += bytesPerChar; } while ( ths->fBufferPtr < ths->fBufferLimit ) { // Get the remainder of the name. currChar = *ths->fBufferPtr; if ( ! ( ( ('a' <= currChar) && (currChar <= 'z') ) || ( ('A' <= currChar) && (currChar <= 'Z') ) || ( ('0' <= currChar) && (currChar <= '9') ) || (currChar == '-') || (currChar == '.') || (currChar == '_') || (currChar == ':') ) ) { break; } #if UseStringPushBack ths->fAttrName.push_back ( currChar ); #else ths->fAttrName.insert ( ths->fAttrName.end(), currChar ); #endif ths->fBufferPtr += bytesPerChar; } if ( ths->fBufferPtr < ths->fBufferLimit ) return eTriYes; ths->fPosition = (long) ths->fAttrName.size(); // The name might span into the next buffer. return eTriMaybe; } // CaptureAttrName // ================================================================================================= // CaptureAttrValue // ================ // // Recognize the equal sign and the quoted string value, capture the value along the way. XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::CaptureAttrValue ( PacketMachine * ths, const char * /* unused */ ) { const int bytesPerChar = ths->fBytesPerChar; char currChar = 0; TriState result = eTriMaybe; if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe; switch ( ths->fPosition ) { case 0 : // The name should haved ended at the '=', nulls already skipped. if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe; if ( *ths->fBufferPtr != '=' ) return eTriNo; ths->fBufferPtr += bytesPerChar; ths->fPosition = 1; // fall through OK because MatchOpenQuote will check the buffer limit and nulls ... case 1 : // Look for the open quote. result = MatchOpenQuote ( ths, NULL ); if ( result != eTriYes ) return result; ths->fPosition = 2; // fall through OK because the buffer limit and nulls are checked below ... default : // Look for the close quote, capturing the value along the way. assert ( ths->fPosition == 2 ); const char quoteChar = ths->fQuoteChar; while ( ths->fBufferPtr < ths->fBufferLimit ) { currChar = *ths->fBufferPtr; if ( currChar == quoteChar ) break; #if UseStringPushBack ths->fAttrValue.push_back ( currChar ); #else ths->fAttrValue.insert ( ths->fAttrValue.end(), currChar ); #endif ths->fBufferPtr += bytesPerChar; } if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe; assert ( currChar == quoteChar ); ths->fBufferPtr += bytesPerChar; // Advance past the closing quote. return eTriYes; } } // CaptureAttrValue // ================================================================================================= // RecordStart // =========== // // Note that this routine looks at bytes, not logical characters. It has to figure out how many // bytes per character there are so that the other recognizers can skip intervening nulls. XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::RecordStart ( PacketMachine * ths, const char * /* unused */ ) { while ( true ) { if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe; const char currByte = *ths->fBufferPtr; switch ( ths->fPosition ) { case 0 : // Record the length. assert ( ths->fCharForm == eChar8Bit ); assert ( ths->fBytesPerChar == 1 ); ths->fPacketStart = ths->fBufferOffset + ((ths->fBufferPtr - 1) - ths->fBufferOrigin); ths->fPacketLength = 0; ths->fPosition = 1; // ! OK to fall through here, we didn't consume a byte in this step. case 1 : // Look for the first null byte. if ( currByte != 0 ) return eTriYes; // No nulls found. ths->fCharForm = eChar16BitBig; // Assume 16 bit big endian for now. ths->fBytesPerChar = 2; ths->fBufferPtr++; ths->fPosition = 2; break; // ! Don't fall through, have to check for the end of the buffer between each byte. case 2 : // One null was found, look for a second. if ( currByte != 0 ) return eTriYes; // Just one null found. ths->fBufferPtr++; ths->fPosition = 3; break; case 3 : // Two nulls were found, look for a third. if ( currByte != 0 ) return eTriNo; // Just two nulls is not valid. ths->fCharForm = eChar32BitBig; // Assume 32 bit big endian for now. ths->fBytesPerChar = 4; ths->fBufferPtr++; return eTriYes; break; } } } // RecordStart // ================================================================================================= // RecognizeBOM // ============ // // Recognizing the byte order marker is a surprisingly messy thing to do. It can't be done by the // normal string matcher, there are no intervening nulls. There are 4 transitions after the opening // quote, the closing quote or one of the three encodings. For the actual BOM there are then 1 or 2 // following bytes that depend on which of the encodings we're in. Not to mention that the buffer // might end at any point. // // The intervening null count done earlier determined 8, 16, or 32 bits per character, but not the // big or little endian nature for the 16/32 bit cases. The BOM must be present for the 16 and 32 // bit cases in order to determine the endian mode. There are six possible byte sequences for the // quoted BOM string, ignoring the differences for quoting with ''' versus '"'. // // Keep in mind that for the 16 and 32 bit cases there will be nulls for the quote. In the table // below the symbol means just the one byte containing the ''' or '"'. The nulls for the // quote character are explicitly shown. // // - 1: No BOM, this must be an 8 bit case. // \xEF \xBB \xBF - 1.12-13: The 8 bit form. // // \xFE \xFF \x00 - 1.22-23: The 16 bit, big endian form // \x00 \xFF \xFE - 1.32-33: The 16 bit, little endian form. // // \x00 \x00 \xFE \xFF \x00 \x00 \x00 - 1.32.43-45.56-57: The 32 bit, big endian form. // \x00 \x00 \x00 \xFF \xFE \x00 \x00 - 1.32.43.54-57: The 32 bit, little endian form. enum { eBOM_8_1 = 0xEF, eBOM_8_2 = 0xBB, eBOM_8_3 = 0xBF, eBOM_Big_1 = 0xFE, eBOM_Big_2 = 0xFF, eBOM_Little_1 = eBOM_Big_2, eBOM_Little_2 = eBOM_Big_1 }; XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::RecognizeBOM ( PacketMachine * ths, const char * /* unused */ ) { const int bytesPerChar = ths->fBytesPerChar; while ( true ) { // Handle one character at a time, the micro-state (fPosition) changes for each. if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe; const unsigned char currChar = *ths->fBufferPtr; // ! The BOM bytes look like integers bigger than 127. switch ( ths->fPosition ) { case 0 : // Look for the opening quote. if ( (currChar != '\'') && (currChar != '"') ) return eTriNo; ths->fQuoteChar = currChar; ths->fBufferPtr++; ths->fPosition = 1; break; // ! Don't fall through, have to check for the end of the buffer between each byte. case 1 : // Look at the byte immediately following the opening quote. if ( currChar == ths->fQuoteChar ) { // Closing quote, no BOM character, must be 8 bit. if ( ths->fCharForm != eChar8Bit ) return eTriNo; ths->fBufferPtr += bytesPerChar; // Skip the nulls after the closing quote. return eTriYes; } else if ( currChar == eBOM_8_1 ) { // Start of the 8 bit form. if ( ths->fCharForm != eChar8Bit ) return eTriNo; ths->fBufferPtr++; ths->fPosition = 12; } else if ( currChar == eBOM_Big_1 ) { // Start of the 16 bit big endian form. if ( ths->fCharForm != eChar16BitBig ) return eTriNo; ths->fBufferPtr++; ths->fPosition = 22; } else if ( currChar == 0 ) { // Start of the 16 bit little endian or either 32 bit form. if ( ths->fCharForm == eChar8Bit ) return eTriNo; ths->fBufferPtr++; ths->fPosition = 32; } else { return eTriNo; } break; case 12 : // Look for the second byte of the 8 bit form. if ( currChar != eBOM_8_2 ) return eTriNo; ths->fPosition = 13; ths->fBufferPtr++; break; case 13 : // Look for the third byte of the 8 bit form. if ( currChar != eBOM_8_3 ) return eTriNo; ths->fPosition = 99; ths->fBufferPtr++; break; case 22 : // Look for the second byte of the 16 bit big endian form. if ( currChar != eBOM_Big_2 ) return eTriNo; ths->fPosition = 23; ths->fBufferPtr++; break; case 23 : // Look for the null before the closing quote of the 16 bit big endian form. if ( currChar != 0 ) return eTriNo; ths->fBufferPtr++; ths->fPosition = 99; break; case 32 : // Look at the second byte of the 16 bit little endian or either 32 bit form. if ( currChar == eBOM_Little_1 ) { ths->fPosition = 33; } else if ( currChar == 0 ) { ths->fPosition = 43; } else { return eTriNo; } ths->fBufferPtr++; break; case 33 : // Look for the third byte of the 16 bit little endian form. if ( ths->fCharForm != eChar16BitBig ) return eTriNo; // Null count before assumed big endian. if ( currChar != eBOM_Little_2 ) return eTriNo; ths->fCharForm = eChar16BitLittle; ths->fPosition = 99; ths->fBufferPtr++; break; case 43 : // Look at the third byte of either 32 bit form. if ( ths->fCharForm != eChar32BitBig ) return eTriNo; // Null count before assumed big endian. if ( currChar == eBOM_Big_1 ) { ths->fPosition = 44; } else if ( currChar == 0 ) { ths->fPosition = 54; } else { return eTriNo; } ths->fBufferPtr++; break; case 44 : // Look for the fourth byte of the 32 bit big endian form. if ( currChar != eBOM_Big_2 ) return eTriNo; ths->fPosition = 45; ths->fBufferPtr++; break; case 45 : // Look for the first null before the closing quote of the 32 bit big endian form. if ( currChar != 0 ) return eTriNo; ths->fPosition = 56; ths->fBufferPtr++; break; case 54 : // Look for the fourth byte of the 32 bit little endian form. ths->fCharForm = eChar32BitLittle; if ( currChar != eBOM_Little_1 ) return eTriNo; ths->fPosition = 55; ths->fBufferPtr++; break; case 55 : // Look for the fifth byte of the 32 bit little endian form. if ( currChar != eBOM_Little_2 ) return eTriNo; ths->fPosition = 56; ths->fBufferPtr++; break; case 56 : // Look for the next to last null before the closing quote of the 32 bit forms. if ( currChar != 0 ) return eTriNo; ths->fPosition = 57; ths->fBufferPtr++; break; case 57 : // Look for the last null before the closing quote of the 32 bit forms. if ( currChar != 0 ) return eTriNo; ths->fPosition = 99; ths->fBufferPtr++; break; default : // Look for the closing quote. assert ( ths->fPosition == 99 ); if ( currChar != ths->fQuoteChar ) return eTriNo; ths->fBufferPtr += bytesPerChar; // Skip the nulls after the closing quote. return eTriYes; break; } } } // RecognizeBOM // ================================================================================================= // RecordHeadAttr // ============== XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::RecordHeadAttr ( PacketMachine * ths, const char * /* unused */ ) { if ( ths->fAttrName == "encoding" ) { assert ( ths->fEncodingAttr.empty() ); ths->fEncodingAttr = ths->fAttrValue; } else if ( ths->fAttrName == "bytes" ) { long value = 0; int count = (int) ths->fAttrValue.size(); int i; assert ( ths->fBytesAttr == -1 ); if ( count > 0 ) { // Allow bytes='' to be the same as no bytes attribute. for ( i = 0; i < count; i++ ) { const char currChar = ths->fAttrValue[i]; if ( ('0' <= currChar) && (currChar <= '9') ) { value = (value * 10) + (currChar - '0'); } else { ths->fBogusPacket = true; value = -1; break; } } ths->fBytesAttr = value; if ( CharFormIs16Bit ( ths->fCharForm ) ) { if ( (ths->fBytesAttr & 1) != 0 ) ths->fBogusPacket = true; } else if ( CharFormIs32Bit ( ths->fCharForm ) ) { if ( (ths->fBytesAttr & 3) != 0 ) ths->fBogusPacket = true; } } } ths->fAttrName.erase ( ths->fAttrName.begin(), ths->fAttrName.end() ); ths->fAttrValue.erase ( ths->fAttrValue.begin(), ths->fAttrValue.end() ); return eTriYes; } // RecordHeadAttr // ================================================================================================= // CaptureAccess // ============= XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::CaptureAccess ( PacketMachine * ths, const char * /* unused */ ) { const int bytesPerChar = ths->fBytesPerChar; while ( true ) { if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe; const char currChar = *ths->fBufferPtr; switch ( ths->fPosition ) { case 0 : // Look for the opening quote. if ( (currChar != '\'') && (currChar != '"') ) return eTriNo; ths->fQuoteChar = currChar; ths->fBufferPtr += bytesPerChar; ths->fPosition = 1; break; // ! Don't fall through, have to check for the end of the buffer between each byte. case 1 : // Look for the 'r' or 'w'. if ( (currChar != 'r') && (currChar != 'w') ) return eTriNo; ths->fAccess = currChar; ths->fBufferPtr += bytesPerChar; ths->fPosition = 2; break; default : // Look for the closing quote. assert ( ths->fPosition == 2 ); if ( currChar != ths->fQuoteChar ) return eTriNo; ths->fBufferPtr += bytesPerChar; return eTriYes; break; } } } // CaptureAccess // ================================================================================================= // RecordTailAttr // ============== XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::RecordTailAttr ( PacketMachine * ths, const char * /* unused */ ) { // There are no known "general" attributes for the packet trailer. ths->fAttrName.erase ( ths->fAttrName.begin(), ths->fAttrName.end() ); ths->fAttrValue.erase ( ths->fAttrValue.begin(), ths->fAttrValue.end() ); return eTriYes; } // RecordTailAttr // ================================================================================================= // CheckPacketEnd // ============== // // Check for trailing padding and record the packet length. We have trailing padding if the bytes // attribute is present and has a value greater than the current length. XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::CheckPacketEnd ( PacketMachine * ths, const char * /* unused */ ) { const int bytesPerChar = ths->fBytesPerChar; if ( ths->fPosition == 0 ) { // First call, decide if there is trailing padding. const XMP_Int64 currLen64 = (ths->fBufferOffset + (ths->fBufferPtr - ths->fBufferOrigin)) - ths->fPacketStart; if ( currLen64 > 0x7FFFFFFF ) throw std::runtime_error ( "Packet length exceeds 2GB-1" ); const XMP_Int32 currLength = (XMP_Int32)currLen64; if ( (ths->fBytesAttr != -1) && (ths->fBytesAttr != currLength) ) { if ( ths->fBytesAttr < currLength ) { ths->fBogusPacket = true; // The bytes attribute value is too small. } else { ths->fPosition = ths->fBytesAttr - currLength; if ( (ths->fPosition % ths->fBytesPerChar) != 0 ) { ths->fBogusPacket = true; // The padding is not a multiple of the character size. ths->fPosition = (ths->fPosition / ths->fBytesPerChar) * ths->fBytesPerChar; } } } } while ( ths->fPosition > 0 ) { if ( ths->fBufferPtr >= ths->fBufferLimit ) return eTriMaybe; const char currChar = *ths->fBufferPtr; if ( (currChar != ' ') && (currChar != '\t') && (currChar != '\n') && (currChar != '\r') ) { ths->fBogusPacket = true; // The padding is not whitespace. break; // Stop the packet here. } ths->fPosition -= bytesPerChar; ths->fBufferPtr += bytesPerChar; } const XMP_Int64 currLen64 = (ths->fBufferOffset + (ths->fBufferPtr - ths->fBufferOrigin)) - ths->fPacketStart; if ( currLen64 > 0x7FFFFFFF ) throw std::runtime_error ( "Packet length exceeds 2GB-1" ); ths->fPacketLength = (XMP_Int32)currLen64; return eTriYes; } // CheckPacketEnd // ================================================================================================= // CheckFinalNulls // =============== // // Do some special case processing for little endian characters. We have to make sure the presumed // nulls after the last character actually exist, i.e. that the stream does not end too soon. Note // that the prior character scanning has moved the buffer pointer to the address following the last // byte of the last character. I.e. we're already past the presumed nulls, so we can't check their // content. All we can do is verify that the stream does not end too soon. // // Doing this check is simple yet subtle. If we're still in the current buffer then the trailing // bytes obviously exist. If we're exactly at the end of the buffer then the bytes also exist. // The only question is when we're actually past this buffer, partly into the next buffer. This is // when "ths->fBufferPtr > ths->fBufferLimit" on entry. For that case we have to wait until we've // actually seen enough extra bytes of input. // // Since the normal buffer processing is already adjusting for this partial character overrun, all // that needs to be done here is wait until "ths->fBufferPtr <= ths->fBufferLimit" on entry. In // other words, if we're presently too far, ths->fBufferPtr will be adjusted by the amount of the // overflow the next time XMPScanner::Scan is called. This might still be too far, so just keep // waiting for enough data to pass by. // // Note that there is a corresponding special case for big endian characters, we must decrement the // starting offset by the number of leading nulls. But we don't do that here, we leave it to the // outer code. This is because the leading nulls might have been at the exact end of a previous // buffer, in which case we have to also decrement the length of that raw data snip. XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::CheckFinalNulls ( PacketMachine * ths, const char * /* unused */ ) { if ( (ths->fCharForm != eChar8Bit) && CharFormIsLittleEndian ( ths->fCharForm ) ) { if ( ths->fBufferPtr > ths->fBufferLimit ) return eTriMaybe; } return eTriYes; } // CheckFinalNulls // ================================================================================================= // SetNextRecognizer // ================= void XMPScanner::PacketMachine::SetNextRecognizer ( RecognizerKind nextRecognizer ) { fRecognizer = nextRecognizer; fPosition = 0; } // SetNextRecognizer // ================================================================================================= // FindNextPacket // ============== // *** When we start validating intervening nulls for 2 and 4 bytes characters, throw an exception // *** for errors. Don't return eTriNo, that might skip at an optional point. XMPScanner::PacketMachine::TriState XMPScanner::PacketMachine::FindNextPacket () { TriState status; #define kPacketHead "?xpacket begin=" #define kPacketID "W5M0MpCehiHzreSzNTczkc9d" #define kPacketTail "?xpacket end=" static const RecognizerInfo recognizerTable [eRecognizerCount] = { // ! Would be safer to assign these explicitly. // proc successNext failureNext literal { NULL, eFailureRecognizer, eFailureRecognizer, NULL}, // eFailureRecognizer { NULL, eSuccessRecognizer, eSuccessRecognizer, NULL}, // eSuccessRecognizer { FindLessThan, eHeadStartRecorder, eFailureRecognizer, "H" }, // eLeadInRecognizer { RecordStart, eHeadStartRecognizer, eLeadInRecognizer, NULL }, // eHeadStartRecorder { MatchString, eBOMRecognizer, eLeadInRecognizer, kPacketHead }, // eHeadStartRecognizer { RecognizeBOM, eIDTagRecognizer, eLeadInRecognizer, NULL }, // eBOMRecognizer { MatchString, eIDOpenRecognizer, eLeadInRecognizer, " id=" }, // eIDTagRecognizer { MatchOpenQuote, eIDValueRecognizer, eLeadInRecognizer, NULL }, // eIDOpenRecognizer { MatchString, eIDCloseRecognizer, eLeadInRecognizer, kPacketID }, // eIDValueRecognizer { MatchCloseQuote, eAttrSpaceRecognizer_1, eLeadInRecognizer, NULL }, // eIDCloseRecognizer { MatchChar, eAttrNameRecognizer_1, eHeadEndRecognizer, " " }, // eAttrSpaceRecognizer_1 { CaptureAttrName, eAttrValueRecognizer_1, eLeadInRecognizer, NULL }, // eAttrNameRecognizer_1 { CaptureAttrValue, eAttrValueRecorder_1, eLeadInRecognizer, NULL }, // eAttrValueRecognizer_1 { RecordHeadAttr, eAttrSpaceRecognizer_1, eLeadInRecognizer, NULL }, // eAttrValueRecorder_1 { MatchString, eBodyRecognizer, eLeadInRecognizer, "?>" }, // eHeadEndRecognizer { FindLessThan, eTailStartRecognizer, eBodyRecognizer, "T"}, // eBodyRecognizer { MatchString, eAccessValueRecognizer, eBodyRecognizer, kPacketTail }, // eTailStartRecognizer { CaptureAccess, eAttrSpaceRecognizer_2, eBodyRecognizer, NULL }, // eAccessValueRecognizer { MatchChar, eAttrNameRecognizer_2, eTailEndRecognizer, " " }, // eAttrSpaceRecognizer_2 { CaptureAttrName, eAttrValueRecognizer_2, eBodyRecognizer, NULL }, // eAttrNameRecognizer_2 { CaptureAttrValue, eAttrValueRecorder_2, eBodyRecognizer, NULL }, // eAttrValueRecognizer_2 { RecordTailAttr, eAttrSpaceRecognizer_2, eBodyRecognizer, NULL }, // eAttrValueRecorder_2 { MatchString, ePacketEndRecognizer, eBodyRecognizer, "?>" }, // eTailEndRecognizer { CheckPacketEnd, eCloseOutRecognizer, eBodyRecognizer, "" }, // ePacketEndRecognizer { CheckFinalNulls, eSuccessRecognizer, eBodyRecognizer, "" } // eCloseOutRecognizer }; while ( true ) { switch ( fRecognizer ) { case eFailureRecognizer : return eTriNo; case eSuccessRecognizer : return eTriYes; default : // ------------------------------------------------------------------- // For everything else, the normal cases, use the state machine table. const RecognizerInfo * thisState = &recognizerTable [fRecognizer]; status = thisState->proc ( this, thisState->literal ); switch ( status ) { case eTriNo : SetNextRecognizer ( thisState->failureNext ); continue; case eTriYes : SetNextRecognizer ( thisState->successNext ); continue; case eTriMaybe : fBufferOverrun = (unsigned char)(fBufferPtr - fBufferLimit); return eTriMaybe; // Keep this recognizer intact, to be resumed later. } } // switch ( fRecognizer ) { ... } // while ( true ) { ... } // FindNextPacket // ================================================================================================= // ================================================================================================= // class InternalSnip // ================== // ================================================================================================= // InternalSnip // ============ XMPScanner::InternalSnip::InternalSnip ( XMP_Int64 offset, XMP_Int64 length ) { fInfo.fOffset = offset; fInfo.fLength = length; } // InternalSnip // ================================================================================================= // InternalSnip // ============ XMPScanner::InternalSnip::InternalSnip ( const InternalSnip & rhs ) : fInfo ( rhs.fInfo ), fMachine ( NULL ) { assert ( rhs.fMachine.get() == NULL ); // Don't copy a snip with a machine. assert ( (rhs.fInfo.fEncodingAttr == 0) || (*rhs.fInfo.fEncodingAttr == 0) ); // Don't copy a snip with an encoding. } // InternalSnip // ================================================================================================= // ~InternalSnip // ============= XMPScanner::InternalSnip::~InternalSnip () { } // ~InternalSnip // ================================================================================================= // ================================================================================================= // class XMPScanner // ================ // ================================================================================================= // DumpSnipList // ============ #if DEBUG static const char * snipStateName [6] = { "not-seen", "pending", "raw-data", "good-packet", "partial", "bad-packet" }; void XMPScanner::DumpSnipList ( const char * title ) { InternalSnipIterator currPos = fInternalSnips.begin(); InternalSnipIterator endPos = fInternalSnips.end(); cout << endl << title << " snip list: " << fInternalSnips.size() << endl; for ( ; currPos != endPos; ++currPos ) { SnipInfo * currSnip = &currPos->fInfo; cout << '\t' << currSnip << ' ' << snipStateName[currSnip->fState] << ' ' << currSnip->fOffset << ".." << (currSnip->fOffset + currSnip->fLength - 1) << ' ' << currSnip->fLength << ' ' << endl; } } // DumpSnipList #endif // ================================================================================================= // PrevSnip and NextSnip // ===================== XMPScanner::InternalSnipIterator XMPScanner::PrevSnip ( InternalSnipIterator snipPos ) { InternalSnipIterator prev = snipPos; return --prev; } // PrevSnip XMPScanner::InternalSnipIterator XMPScanner::NextSnip ( InternalSnipIterator snipPos ) { InternalSnipIterator next = snipPos; return ++next; } // NextSnip // ================================================================================================= // XMPScanner // ========== // // Initialize the scanner object with one "not seen" snip covering the whole stream. XMPScanner::XMPScanner ( XMP_Int64 streamLength ) : fStreamLength ( streamLength ) { InternalSnip rootSnip ( 0, streamLength ); if ( streamLength > 0 ) fInternalSnips.push_front ( rootSnip ); // Be nice for empty files. // DumpSnipList ( "New XMPScanner" ); } // XMPScanner // ================================================================================================= // ~XMPScanner // =========== XMPScanner::~XMPScanner() { } // ~XMPScanner // ================================================================================================= // GetSnipCount // ============ long XMPScanner::GetSnipCount () { return (long)fInternalSnips.size(); } // GetSnipCount // ================================================================================================= // StreamAllScanned // ================ bool XMPScanner::StreamAllScanned () { InternalSnipIterator currPos = fInternalSnips.begin(); InternalSnipIterator endPos = fInternalSnips.end(); for ( ; currPos != endPos; ++currPos ) { if ( currPos->fInfo.fState == eNotSeenSnip ) return false; } return true; } // StreamAllScanned // ================================================================================================= // SplitInternalSnip // ================= // // Split the given snip into up to 3 pieces. The new pieces are inserted before and after this one // in the snip list. The relOffset is the first byte to be kept, it is relative to this snip. If // the preceeding or following snips have the same state as this one, just shift the boundaries. // I.e. move the contents from one snip to the other, don't create a new snip. // *** To be thread safe we ought to lock the entire list during manipulation. Let data scanning // *** happen in parallel, serialize all mucking with the list. void XMPScanner::SplitInternalSnip ( InternalSnipIterator snipPos, XMP_Int64 relOffset, XMP_Int64 newLength ) { assert ( (relOffset + newLength) > relOffset ); // Check for overflow. assert ( (relOffset + newLength) <= snipPos->fInfo.fLength ); // ----------------------------------- // First deal with the low offset end. if ( relOffset > 0 ) { InternalSnipIterator prevPos; if ( snipPos != fInternalSnips.begin() ) prevPos = PrevSnip ( snipPos ); if ( (snipPos != fInternalSnips.begin()) && (snipPos->fInfo.fState == prevPos->fInfo.fState) ) { prevPos->fInfo.fLength += relOffset; // Adjust the preceeding snip. } else { InternalSnip headExcess ( snipPos->fInfo.fOffset, relOffset ); headExcess.fInfo.fState = snipPos->fInfo.fState; headExcess.fInfo.fOutOfOrder = snipPos->fInfo.fOutOfOrder; fInternalSnips.insert ( snipPos, headExcess ); // Insert the head piece before the middle piece. } snipPos->fInfo.fOffset += relOffset; // Adjust the remainder of this snip. snipPos->fInfo.fLength -= relOffset; } // ---------------------------------- // Now deal with the high offset end. if ( newLength < snipPos->fInfo.fLength ) { InternalSnipIterator nextPos = NextSnip ( snipPos ); const XMP_Int64 tailLength = snipPos->fInfo.fLength - newLength; if ( (nextPos != fInternalSnips.end()) && (snipPos->fInfo.fState == nextPos->fInfo.fState) ) { nextPos->fInfo.fOffset -= tailLength; // Adjust the following snip. nextPos->fInfo.fLength += tailLength; } else { InternalSnip tailExcess ( (snipPos->fInfo.fOffset + newLength), tailLength ); tailExcess.fInfo.fState = snipPos->fInfo.fState; tailExcess.fInfo.fOutOfOrder = snipPos->fInfo.fOutOfOrder; fInternalSnips.insert ( nextPos, tailExcess ); // Insert the tail piece after the middle piece. } snipPos->fInfo.fLength = newLength; } } // SplitInternalSnip // ================================================================================================= // MergeInternalSnips // ================== XMPScanner::InternalSnipIterator XMPScanner::MergeInternalSnips ( InternalSnipIterator firstPos, InternalSnipIterator secondPos ) { firstPos->fInfo.fLength += secondPos->fInfo.fLength; fInternalSnips.erase ( secondPos ); return firstPos; } // MergeInternalSnips // ================================================================================================= // Scan // ==== void XMPScanner::Scan ( const void * bufferOrigin, XMP_Int64 bufferOffset, XMP_Int64 bufferLength ) { XMP_Int64 relOffset; #if 0 cout << "Scan: @ " << bufferOrigin << ", " << bufferOffset << ", " << bufferLength << endl; #endif if ( bufferLength == 0 ) return; // ---------------------------------------------------------------- // These comparisons are carefully done to avoid overflow problems. if ( (bufferOffset >= fStreamLength) || (bufferLength > (fStreamLength - bufferOffset)) || (bufferOrigin == 0) ) { throw ScanError ( "Bad origin, offset, or length" ); } // ---------------------------------------------------------------------------------------------- // This buffer must be within a not-seen snip. Find it and split it. The first snip whose whose // end is beyond the buffer must be the enclosing one. // *** It would be friendly for rescans for out of order problems to accept any buffer postion. const XMP_Int64 endOffset = bufferOffset + bufferLength - 1; InternalSnipIterator snipPos = fInternalSnips.begin(); while ( endOffset > (snipPos->fInfo.fOffset + snipPos->fInfo.fLength - 1) ) ++ snipPos; if ( snipPos->fInfo.fState != eNotSeenSnip ) throw ScanError ( "Already seen" ); relOffset = bufferOffset - snipPos->fInfo.fOffset; if ( (relOffset + bufferLength) > snipPos->fInfo.fLength ) throw ScanError ( "Not within existing snip" ); SplitInternalSnip ( snipPos, relOffset, bufferLength ); // *** If sequential & prev is partial, just tack on, // -------------------------------------------------------- // Merge this snip with the preceeding snip if appropriate. // *** When out of order I/O is supported we have to do something about buffers who's predecessor is not seen. if ( snipPos->fInfo.fOffset > 0 ) { InternalSnipIterator prevPos = PrevSnip ( snipPos ); if ( prevPos->fInfo.fState == ePartialPacketSnip ) snipPos = MergeInternalSnips ( prevPos, snipPos ); } // ---------------------------------- // Look for packets within this snip. snipPos->fInfo.fState = ePendingSnip; PacketMachine* thisMachine = snipPos->fMachine.get(); // DumpSnipList ( "Before scan" ); if ( thisMachine != 0 ) { thisMachine->AssociateBuffer ( bufferOffset, bufferOrigin, bufferLength ); } else { // *** snipPos->fMachine.reset ( new PacketMachine ( bufferOffset, bufferOrigin, bufferLength ) ); VC++ lacks reset #if 0 snipPos->fMachine = auto_ptr ( new PacketMachine ( bufferOffset, bufferOrigin, bufferLength ) ); #else { // Some versions of gcc complain about the assignment operator above. This avoids the gcc bug. PacketMachine * pm = new PacketMachine ( bufferOffset, bufferOrigin, bufferLength ); auto_ptr ap ( pm ); snipPos->fMachine = ap; } #endif thisMachine = snipPos->fMachine.get(); } bool bufferDone = false; while ( ! bufferDone ) { PacketMachine::TriState foundPacket = thisMachine->FindNextPacket(); if ( foundPacket == PacketMachine::eTriNo ) { // ----------------------------------------------------------------------- // No packet, mark the snip as raw data and get rid of the packet machine. // We're done with this buffer. snipPos->fInfo.fState = eRawInputSnip; #if 0 snipPos->fMachine = auto_ptr(); // *** snipPos->fMachine.reset(); VC++ lacks reset #else { // Some versions of gcc complain about the assignment operator above. This avoids the gcc bug. auto_ptr ap ( 0 ); snipPos->fMachine = ap; } #endif bufferDone = true; } else { // --------------------------------------------------------------------------------------------- // Either a full or partial packet. First trim any excess off of the front as a raw input snip. // If this is a partial packet mark the snip and keep the packet machine to be resumed later. // We're done with this buffer, the partial packet by definition extends to the end. If this is // a complete packet first extract the additional information from the packet machine. If there // is leftover data split the snip and transfer the packet machine to the new trailing snip. if ( thisMachine->fPacketStart > snipPos->fInfo.fOffset ) { // There is data at the front of the current snip that must be trimmed. SnipState savedState = snipPos->fInfo.fState; snipPos->fInfo.fState = eRawInputSnip; // ! So it gets propagated to the trimmed front part. relOffset = thisMachine->fPacketStart - snipPos->fInfo.fOffset; SplitInternalSnip ( snipPos, relOffset, (snipPos->fInfo.fLength - relOffset) ); snipPos->fInfo.fState = savedState; } if ( foundPacket == PacketMachine::eTriMaybe ) { // We have only found a partial packet. snipPos->fInfo.fState = ePartialPacketSnip; bufferDone = true; } else { // We have found a complete packet. Extract all the info for it and split any trailing data. InternalSnipIterator packetSnip = snipPos; SnipState packetState = eValidPacketSnip; if ( thisMachine->fBogusPacket ) packetState = eBadPacketSnip; packetSnip->fInfo.fAccess = thisMachine->fAccess; packetSnip->fInfo.fCharForm = thisMachine->fCharForm; packetSnip->fInfo.fBytesAttr = thisMachine->fBytesAttr; packetSnip->fInfo.fEncodingAttr = thisMachine->fEncodingAttr.c_str(); thisMachine->fEncodingAttr.erase ( thisMachine->fEncodingAttr.begin(), thisMachine->fEncodingAttr.end() ); if ( (thisMachine->fCharForm != eChar8Bit) && CharFormIsBigEndian ( thisMachine->fCharForm ) ) { // ------------------------------------------------------------------------------ // Handle a special case for big endian characters. The packet machine works as // though things were little endian. The packet starting offset points to the // byte containing the opening '<', and the length includes presumed nulls that // follow the last "real" byte. If the characters are big endian we now have to // decrement the starting offset of the packet, and also decrement the length of // the previous snip. // // Note that we can't do this before the head trimming above in general. The // nulls might have been exactly at the end of a buffer and already in the // previous snip. We are doing this before trimming the tail from the raw snip // containing the packet. We adjust the raw snip's size because it ends with // the input buffer. We don't adjust the packet's size, it is already correct. // // The raw snip (the one before the packet) might entirely disappear. A simple // example of this is when the packet is at the start of the file. assert ( packetSnip != fInternalSnips.begin() ); // Leading nulls were trimmed! if ( packetSnip != fInternalSnips.begin() ) { // ... but let's program defensibly. InternalSnipIterator prevSnip = PrevSnip ( packetSnip ); const unsigned int nullsToAdd = ( CharFormIs16Bit ( thisMachine->fCharForm ) ? 1 : 3 ); assert ( nullsToAdd <= prevSnip->fInfo.fLength ); prevSnip->fInfo.fLength -= nullsToAdd; if ( prevSnip->fInfo.fLength == 0 ) (void) fInternalSnips.erase ( prevSnip ); packetSnip->fInfo.fOffset -= nullsToAdd; packetSnip->fInfo.fLength += nullsToAdd; thisMachine->fPacketStart -= nullsToAdd; } } if ( thisMachine->fPacketLength == snipPos->fInfo.fLength ) { // This packet ends exactly at the end of the current snip. #if 0 snipPos->fMachine = auto_ptr(); // *** snipPos->fMachine.reset(); VC++ lacks reset #else { // Some versions of gcc complain about the assignment operator above. This avoids the gcc bug. auto_ptr ap ( 0 ); snipPos->fMachine = ap; } #endif bufferDone = true; } else { // There is trailing data to split from the just found packet. SplitInternalSnip ( snipPos, 0, thisMachine->fPacketLength ); InternalSnipIterator tailPos = NextSnip ( snipPos ); tailPos->fMachine = snipPos->fMachine; // auto_ptr assignment - taking ownership thisMachine->ResetMachine (); snipPos = tailPos; } packetSnip->fInfo.fState = packetState; // Do this last to avoid messing up the tail split. // DumpSnipList ( "Found a packet" ); } } } // -------------------------------------------------------- // Merge this snip with the preceeding snip if appropriate. // *** When out of order I/O is supported we have to check the following snip too. if ( (snipPos->fInfo.fOffset > 0) && (snipPos->fInfo.fState == eRawInputSnip) ) { InternalSnipIterator prevPos = PrevSnip ( snipPos ); if ( prevPos->fInfo.fState == eRawInputSnip ) snipPos = MergeInternalSnips ( prevPos, snipPos ); } // DumpSnipList ( "After scan" ); } // Scan // ================================================================================================= // Report // ====== void XMPScanner::Report ( SnipInfoVector& snips ) { const int count = (int)fInternalSnips.size(); InternalSnipIterator snipPos = fInternalSnips.begin(); int s; // DumpSnipList ( "Report" ); snips.erase ( snips.begin(), snips.end() ); // ! Should use snips.clear, but VC++ doesn't have it. snips.reserve ( count ); for ( s = 0; s < count; s += 1 ) { snips.push_back ( SnipInfo ( snipPos->fInfo.fState, snipPos->fInfo.fOffset, snipPos->fInfo.fLength ) ); snips[s] = snipPos->fInfo; // Pick up all of the fields. ++ snipPos; } } // Report exempi-2.2.1/source/XMPFiles/FormatSupport/GIF_Support.hpp0000664000175000017500000000657712150230672020371 00000000000000#ifndef __GIF_Support_hpp__ #define __GIF_Support_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2002-2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it // // Derived from PNG_Support.hpp by Ian Jacobi // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "XMPFiles_Impl.hpp" #define GIF_SIGNATURE_LEN 3 #define GIF_SIGNATURE_DATA "\x47\x49\x46" #define APPLICATION_HEADER_LEN 14 #define APPLICATION_HEADER_DATA "\x21\xFF\x0B\x58\x4D\x50\x20\x44\x61\x74\x61\x58\x4D\x50" #define MAGIC_TRAILER_LEN 258 #define MAGIC_TRAILER_DATA "\x01\xFF\xFE\xFD\xFC\xFB\xFA\xF9\xF8\xF7\xF6\xF5\xF4\xF3\xF2\xF1\xF0\xEF\xEE\xED\xEC\xEB\xEA\xE9\xE8\xE7\xE6\xE5\xE4\xE3\xE2\xE1\xE0\xDF\xDE\xDD\xDC\xDB\xDA\xD9\xD8\xD7\xD6\xD5\xD4\xD3\xD2\xD1\xD0\xCF\xCE\xCD\xCC\xCB\xCA\xC9\xC8\xC7\xC6\xC5\xC4\xC3\xC2\xC1\xC0\xBF\xBE\xBD\xBC\xBB\xBA\xB9\xB8\xB7\xB6\xB5\xB4\xB3\xB2\xB1\xB0\xAF\xAE\xAD\xAC\xAB\xAA\xA9\xA8\xA7\xA6\xA5\xA4\xA3\xA2\xA1\xA0\x9F\x9E\x9D\x9C\x9B\x9A\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90\x8F\x8E\x8D\x8C\x8B\x8A\x89\x88\x87\x86\x85\x84\x83\x82\x81\x80\x7F\x7E\x7D\x7C\x7B\x7A\x79\x78\x77\x76\x75\x74\x73\x72\x71\x70\x6F\x6E\x6D\x6C\x6B\x6A\x69\x68\x67\x66\x65\x64\x63\x62\x61\x60\x5F\x5E\x5D\x5C\x5B\x5A\x59\x58\x57\x56\x55\x54\x53\x52\x51\x50\x4F\x4E\x4D\x4C\x4B\x4A\x49\x48\x47\x46\x45\x44\x43\x42\x41\x40\x3F\x3E\x3D\x3C\x3B\x3A\x39\x38\x37\x36\x35\x34\x33\x32\x31\x30\x2F\x2E\x2D\x2C\x2B\x2A\x29\x28\x27\x26\x25\x24\x23\x22\x21\x20\x1F\x1E\x1D\x1C\x1B\x1A\x19\x18\x17\x16\x15\x14\x13\x12\x11\x10\x0F\x0E\x0D\x0C\x0B\x0A\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00\x00" namespace GIF_Support { class BlockData { public: BlockData() : pos(0), len(0), type(0), xmp(false) {} virtual ~BlockData() {} XMP_Uns64 pos; // file offset of block XMP_Uns32 len; // length of block data, including extension introducer and label char type; // name/type of block bool xmp; // application extension block with XMP ? }; typedef std::vector BlockVector; typedef BlockVector::iterator BlockIterator; class BlockState { public: BlockState() : xmpPos(0), xmpLen(0) {} virtual ~BlockState() {} XMP_Uns64 xmpPos; XMP_Uns32 xmpLen; BlockData xmpBlock; BlockVector blocks; /* vector of blocks */ }; long OpenGIF ( LFA_FileRef fileRef, BlockState& inOutBlockState ); long ReadHeader ( LFA_FileRef fileRef ); bool ReadBlock ( LFA_FileRef fileRef, BlockState& inOutBlockState, unsigned char* blockType, XMP_Uns32* blockLength, XMP_Uns64& inOutPosition ); bool WriteXMPBlock ( LFA_FileRef fileRef, XMP_Uns32 len, const char* inBuffer ); bool CopyBlock ( LFA_FileRef sourceRef, LFA_FileRef destRef, BlockData& block ); unsigned long CheckApplicationBlockHeader ( LFA_FileRef fileRef, BlockState& inOutBlockState, BlockData& inOutBlockData, XMP_Uns64& inOutPosition ); bool ReadBuffer ( LFA_FileRef fileRef, XMP_Uns64& pos, XMP_Uns32 len, char* outBuffer ); bool WriteBuffer ( LFA_FileRef fileRef, XMP_Uns64& pos, XMP_Uns32 len, const char* inBuffer ); } // namespace GIF_Support #endif // __GIF_Support_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/TIFF_FileWriter.cpp0000664000175000017500000022104012150230673021070 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "TIFF_Support.hpp" // ================================================================================================= /// \file TIFF_FileWriter.cpp /// \brief TIFF_FileWriter is used for memory-based read-write access and all file-based access. /// /// \c TIFF_FileWriter is used for memory-based read-write access and all file-based access. The /// main internal data structure is the InternalTagMap, a std::map that uses the tag number as the /// key and InternalTagInfo as the value. There are 5 of these maps, one for each of the recognized /// IFDs. The maps contain an entry for each tag in the IFD, whether we capture the data or not. The /// dataPtr and dataLen fields in the InternalTagInfo are zero if the tag is not captured. // ================================================================================================= // ================================================================================================= // TIFF_FileWriter::TIFF_FileWriter // ================================ // // Set big endian Get/Put routines so that routines are in place for creating TIFF without a parse. // Parsing will reset them to the proper endianness for the stream. Big endian is a good default // since JPEG and PSD files are big endian overall. TIFF_FileWriter::TIFF_FileWriter() : changed(false), legacyDeleted(false), memParsed(false), fileParsed(false), ownedStream(false), memStream(0), tiffLength(0) { XMP_Uns8 bogusTIFF [kEmptyTIFFLength]; bogusTIFF[0] = 0x4D; bogusTIFF[1] = 0x4D; bogusTIFF[2] = 0x00; bogusTIFF[3] = 0x2A; bogusTIFF[4] = bogusTIFF[5] = bogusTIFF[6] = bogusTIFF[7] = 0x00; (void) this->CheckTIFFHeader ( bogusTIFF, sizeof ( bogusTIFF ) ); } // TIFF_FileWriter::TIFF_FileWriter // ================================================================================================= // TIFF_FileWriter::~TIFF_FileWriter // ================================= TIFF_FileWriter::~TIFF_FileWriter() { XMP_Assert ( ! (this->memParsed && this->fileParsed) ); if ( this->ownedStream ) { XMP_Assert ( this->memStream != 0 ); free ( this->memStream ); } } // TIFF_FileWriter::~TIFF_FileWriter // ================================================================================================= // TIFF_FileWriter::DeleteExistingInfo // =================================== void TIFF_FileWriter::DeleteExistingInfo() { XMP_Assert ( ! (this->memParsed && this->fileParsed) ); if ( this->ownedStream ) free ( this->memStream ); // ! Current TIFF might be memory-parsed. this->memStream = 0; this->tiffLength = 0; for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) this->containedIFDs[ifd].clear(); this->changed = false; this->legacyDeleted = false; this->memParsed = false; this->fileParsed = false; this->ownedStream = false; } // TIFF_FileWriter::DeleteExistingInfo // ================================================================================================= // TIFF_FileWriter::PickIFD // ======================== XMP_Uns8 TIFF_FileWriter::PickIFD ( XMP_Uns8 ifd, XMP_Uns16 id ) { if ( ifd > kTIFF_LastRealIFD ) { if ( ifd != kTIFF_KnownIFD ) XMP_Throw ( "Invalid IFD number", kXMPErr_BadParam ); XMP_Throw ( "kTIFF_KnownIFD not yet implemented", kXMPErr_Unimplemented ); // *** Likely to stay unimplemented until there is a client need. } return ifd; } // TIFF_FileWriter::PickIFD // ================================================================================================= // TIFF_FileWriter::FindTagInIFD // ============================= const TIFF_FileWriter::InternalTagInfo* TIFF_FileWriter::FindTagInIFD ( XMP_Uns8 ifd, XMP_Uns16 id ) const { ifd = PickIFD ( ifd, id ); const InternalTagMap& currIFD = this->containedIFDs[ifd].tagMap; InternalTagMap::const_iterator tagPos = currIFD.find ( id ); if ( tagPos == currIFD.end() ) return 0; return &tagPos->second; } // TIFF_FileWriter::FindTagInIFD // ================================================================================================= // TIFF_FileWriter::GetIFD // ======================= bool TIFF_FileWriter::GetIFD ( XMP_Uns8 ifd, TagInfoMap* ifdMap ) const { if ( ifd > kTIFF_LastRealIFD ) XMP_Throw ( "Invalid IFD number", kXMPErr_BadParam ); const InternalTagMap& currIFD = this->containedIFDs[ifd].tagMap; InternalTagMap::const_iterator tagPos = currIFD.begin(); InternalTagMap::const_iterator tagEnd = currIFD.end(); if ( ifdMap != 0 ) ifdMap->clear(); if ( tagPos == tagEnd ) return false; // Empty IFD. if ( ifdMap != 0 ) { for ( ; tagPos != tagEnd; ++tagPos ) { const InternalTagInfo& intInfo = tagPos->second; TagInfo extInfo ( intInfo.id, intInfo.type, intInfo.count, intInfo.dataPtr, intInfo.dataLen ); (*ifdMap)[intInfo.id] = extInfo; } } return true; } // TIFF_FileWriter::GetIFD // ================================================================================================= // TIFF_FileWriter::GetValueOffset // =============================== XMP_Uns32 TIFF_FileWriter::GetValueOffset ( XMP_Uns8 ifd, XMP_Uns16 id ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( (thisTag == 0) || (thisTag->origDataLen == 0) ) return 0; return thisTag->origDataOffset; } // TIFF_FileWriter::GetValueOffset // ================================================================================================= // TIFF_FileWriter::GetTag // ======================= bool TIFF_FileWriter::GetTag ( XMP_Uns8 ifd, XMP_Uns16 id, TagInfo* info ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( info != 0 ) { info->id = thisTag->id; info->type = thisTag->type; info->count = thisTag->dataLen / (XMP_Uns32)kTIFF_TypeSizes[thisTag->type]; info->dataLen = thisTag->dataLen; info->dataPtr = (const void*)(thisTag->dataPtr); } return true; } // TIFF_FileWriter::GetTag // ================================================================================================= // TIFF_FileWriter::SetTag // ======================= void TIFF_FileWriter::SetTag ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16 type, XMP_Uns32 count, const void* clientPtr ) { if ( (type < kTIFF_ByteType) || (type > kTIFF_LastType) ) XMP_Throw ( "Invalid TIFF tag type", kXMPErr_BadParam ); size_t typeSize = kTIFF_TypeSizes[type]; size_t fullSize = count * typeSize; ifd = PickIFD ( ifd, id ); InternalTagMap& currIFD = this->containedIFDs[ifd].tagMap; InternalTagInfo* tagPtr = 0; InternalTagMap::iterator tagPos = currIFD.find ( id ); if ( tagPos == currIFD.end() ) { // The tag does not yet exist, add it. InternalTagMap::value_type mapValue ( id, InternalTagInfo ( id, type, count, this->fileParsed ) ); tagPos = currIFD.insert ( tagPos, mapValue ); tagPtr = &tagPos->second; } else { tagPtr = &tagPos->second; // The tag already exists, make sure the value is actually changing. if ( (type == tagPtr->type) && (count == tagPtr->count) && (memcmp ( clientPtr, tagPtr->dataPtr, tagPtr->dataLen ) == 0) ) { return; // ! The value is unchanged, exit. } tagPtr->FreeData(); // Release any existing data allocation. tagPtr->type = type; // These might be changing also. tagPtr->count = count; } tagPtr->changed = true; tagPtr->dataLen = (XMP_Uns32)fullSize; if ( fullSize <= 4 ) { // The data is less than 4 bytes, store it in the smallValue field using native endianness. tagPtr->dataPtr = (XMP_Uns8*) &tagPtr->smallValue; } else { // The data is more than 4 bytes, make a copy. tagPtr->dataPtr = (XMP_Uns8*) malloc ( fullSize ); if ( tagPtr->dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); } memcpy ( tagPtr->dataPtr, clientPtr, fullSize ); // AUDIT: Safe, space guaranteed to be fullSize. if ( ! this->nativeEndian ) { if ( typeSize == 2 ) { XMP_Uns16* flipPtr = (XMP_Uns16*) tagPtr->dataPtr; for ( XMP_Uns32 i = 0; i < count; ++i ) Flip2 ( flipPtr[i] ); } else if ( typeSize == 4 ) { XMP_Uns32* flipPtr = (XMP_Uns32*) tagPtr->dataPtr; for ( XMP_Uns32 i = 0; i < count; ++i ) Flip4 ( flipPtr[i] ); } else if ( typeSize == 8 ) { XMP_Uns64* flipPtr = (XMP_Uns64*) tagPtr->dataPtr; for ( XMP_Uns32 i = 0; i < count; ++i ) Flip8 ( flipPtr[i] ); } } this->containedIFDs[ifd].changed = true; this->changed = true; } // TIFF_FileWriter::SetTag // ================================================================================================= // TIFF_FileWriter::DeleteTag // ========================== void TIFF_FileWriter::DeleteTag ( XMP_Uns8 ifd, XMP_Uns16 id ) { ifd = PickIFD ( ifd, id ); InternalTagMap& currIFD = this->containedIFDs[ifd].tagMap; InternalTagMap::iterator tagPos = currIFD.find ( id ); if ( tagPos == currIFD.end() ) return; // ! Don't set the changed flags if the tag didn't exist. currIFD.erase ( tagPos ); this->containedIFDs[ifd].changed = true; this->changed = true; if ( (ifd != kTIFF_PrimaryIFD) || (id != kTIFF_XMP) ) this->legacyDeleted = true; } // TIFF_FileWriter::DeleteTag // ================================================================================================= // TIFF_FileWriter::GetTag_Integer // =============================== bool TIFF_FileWriter::GetTag_Integer ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32* data ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( thisTag->count != 1 ) return false; static XMP_Uns32 voidValue; if ( data == 0 ) data = &voidValue; if ( thisTag->type == kTIFF_ShortType ) { *data = this->GetUns16 ( thisTag->dataPtr ); } else if ( thisTag->type == kTIFF_LongType ) { *data = this->GetUns32 ( thisTag->dataPtr ); } else { return false; } return true; } // TIFF_FileWriter::GetTag_Integer // ================================================================================================= // TIFF_FileWriter::GetTag_Byte // ============================ bool TIFF_FileWriter::GetTag_Byte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns8* data ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_ByteType) || (thisTag->dataLen != 1) ) return false; if ( data != 0 ) *data = *thisTag->dataPtr; return true; } // TIFF_FileWriter::GetTag_Byte // ================================================================================================= // TIFF_FileWriter::GetTag_SByte // ============================= bool TIFF_FileWriter::GetTag_SByte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int8* data ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_SByteType) || (thisTag->dataLen != 1) ) return false; if ( data != 0 ) *data = *thisTag->dataPtr; return true; } // TIFF_FileWriter::GetTag_SByte // ================================================================================================= // TIFF_FileWriter::GetTag_Short // ============================= bool TIFF_FileWriter::GetTag_Short ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16* data ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_ShortType) || (thisTag->dataLen != 2) ) return false; if ( data != 0 ) *data = this->GetUns16 ( thisTag->dataPtr ); return true; } // TIFF_FileWriter::GetTag_Short // ================================================================================================= // TIFF_FileWriter::GetTag_SShort // ============================== bool TIFF_FileWriter::GetTag_SShort ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int16* data ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_SShortType) || (thisTag->dataLen != 2) ) return false; if ( data != 0 ) *data = (XMP_Int16) this->GetUns16 ( thisTag->dataPtr ); return true; } // TIFF_FileWriter::GetTag_SShort // ================================================================================================= // TIFF_FileWriter::GetTag_Long // ============================ bool TIFF_FileWriter::GetTag_Long ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32* data ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_LongType) || (thisTag->dataLen != 4) ) return false; if ( data != 0 ) *data = this->GetUns32 ( thisTag->dataPtr ); return true; } // TIFF_FileWriter::GetTag_Long // ================================================================================================= // TIFF_FileWriter::GetTag_SLong // ============================= bool TIFF_FileWriter::GetTag_SLong ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int32* data ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_SLongType) || (thisTag->dataLen != 4) ) return false; if ( data != 0 ) *data = (XMP_Int32) this->GetUns32 ( thisTag->dataPtr ); return true; } // TIFF_FileWriter::GetTag_SLong // ================================================================================================= // TIFF_FileWriter::GetTag_Rational // ================================ bool TIFF_FileWriter::GetTag_Rational ( XMP_Uns8 ifd, XMP_Uns16 id, Rational* data ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( (thisTag == 0) || (thisTag->dataPtr == 0) ) return false; if ( (thisTag->type != kTIFF_RationalType) || (thisTag->dataLen != 8) ) return false; if ( data != 0 ) { XMP_Uns32* dataPtr = (XMP_Uns32*)thisTag->dataPtr; data->num = this->GetUns32 ( dataPtr ); data->denom = this->GetUns32 ( dataPtr+1 ); } return true; } // TIFF_FileWriter::GetTag_Rational // ================================================================================================= // TIFF_FileWriter::GetTag_SRational // ================================= bool TIFF_FileWriter::GetTag_SRational ( XMP_Uns8 ifd, XMP_Uns16 id, SRational* data ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( (thisTag == 0) || (thisTag->dataPtr == 0) ) return false; if ( (thisTag->type != kTIFF_SRationalType) || (thisTag->dataLen != 8) ) return false; if ( data != 0 ) { XMP_Uns32* dataPtr = (XMP_Uns32*)thisTag->dataPtr; data->num = (XMP_Int32) this->GetUns32 ( dataPtr ); data->denom = (XMP_Int32) this->GetUns32 ( dataPtr+1 ); } return true; } // TIFF_FileWriter::GetTag_SRational // ================================================================================================= // TIFF_FileWriter::GetTag_Float // ============================= bool TIFF_FileWriter::GetTag_Float ( XMP_Uns8 ifd, XMP_Uns16 id, float* data ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_FloatType) || (thisTag->dataLen != 4) ) return false; if ( data != 0 ) *data = this->GetFloat ( thisTag->dataPtr ); return true; } // TIFF_FileWriter::GetTag_Float // ================================================================================================= // TIFF_FileWriter::GetTag_Double // ============================== bool TIFF_FileWriter::GetTag_Double ( XMP_Uns8 ifd, XMP_Uns16 id, double* data ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( (thisTag == 0) || (thisTag->dataPtr == 0) ) return false; if ( (thisTag->type != kTIFF_DoubleType) || (thisTag->dataLen != 8) ) return false; if ( data != 0 ) *data = this->GetDouble ( thisTag->dataPtr ); return true; } // TIFF_FileWriter::GetTag_Double // ================================================================================================= // TIFF_FileWriter::GetTag_ASCII // ============================= bool TIFF_FileWriter::GetTag_ASCII ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_StringPtr* dataPtr, XMP_StringLen* dataLen ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->dataLen > 4) && (thisTag->dataPtr == 0) ) return false; if ( thisTag->type != kTIFF_ASCIIType ) return false; if ( dataPtr != 0 ) *dataPtr = (XMP_StringPtr)thisTag->dataPtr; if ( dataLen != 0 ) *dataLen = thisTag->dataLen; return true; } // TIFF_FileWriter::GetTag_ASCII // ================================================================================================= // TIFF_FileWriter::GetTag_EncodedString // ===================================== bool TIFF_FileWriter::GetTag_EncodedString ( XMP_Uns8 ifd, XMP_Uns16 id, std::string* utf8Str ) const { const InternalTagInfo* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( thisTag->type != kTIFF_UndefinedType ) return false; if ( utf8Str == 0 ) return true; // Return true if the converted string is not wanted. bool ok = this->DecodeString ( thisTag->dataPtr, thisTag->dataLen, utf8Str ); return ok; } // TIFF_FileWriter::GetTag_EncodedString // ================================================================================================= // TIFF_FileWriter::SetTag_EncodedString // ===================================== void TIFF_FileWriter::SetTag_EncodedString ( XMP_Uns8 ifd, XMP_Uns16 id, const std::string& utf8Str, XMP_Uns8 encoding ) { std::string encodedStr; this->EncodeString ( utf8Str, encoding, &encodedStr ); this->SetTag ( ifd, id, kTIFF_UndefinedType, (XMP_Uns32)encodedStr.size(), encodedStr.c_str() ); } // TIFF_FileWriter::SetTag_EncodedString // ================================================================================================= // TIFF_FileWriter::IsLegacyChanged // ================================ bool TIFF_FileWriter::IsLegacyChanged() { if ( ! this->changed ) return false; if ( this->legacyDeleted ) return true; for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { InternalIFDInfo & thisIFD = this->containedIFDs[ifd]; if ( ! thisIFD.changed ) continue; InternalTagMap::iterator tagPos; InternalTagMap::iterator tagEnd = thisIFD.tagMap.end(); for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) { InternalTagInfo & thisTag = tagPos->second; if ( thisTag.changed && (thisTag.id != kTIFF_XMP) ) return true; } } return false; // Can get here if the XMP tag is the only one changed. } // TIFF_FileWriter::IsLegacyChanged // ================================================================================================= // TIFF_FileWriter::ParseMemoryStream // ================================== void TIFF_FileWriter::ParseMemoryStream ( const void* data, XMP_Uns32 length, bool copyData /* = true */ ) { this->DeleteExistingInfo(); this->memParsed = true; if ( length == 0 ) return; // Allocate space for the full in-memory stream and copy it. if ( ! copyData ) { XMP_Assert ( ! this->ownedStream ); this->memStream = (XMP_Uns8*) data; } else { if ( length > 100*1024*1024 ) XMP_Throw ( "Outrageous length for memory-based TIFF", kXMPErr_BadTIFF ); this->memStream = (XMP_Uns8*) malloc(length); this->ownedStream = true; if ( this->memStream == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); memcpy ( this->memStream, data, length ); // AUDIT: Safe, malloc'ed length bytes above. this->ownedStream = true; } this->tiffLength = length; // Find and process the primary, Exif, GPS, and Interoperability IFDs. XMP_Uns32 primaryIFDOffset = this->CheckTIFFHeader ( this->memStream, length ); if ( primaryIFDOffset != 0 ) (void) this->ProcessMemoryIFD ( primaryIFDOffset, kTIFF_PrimaryIFD ); const InternalTagInfo* exifIFDTag = this->FindTagInIFD ( kTIFF_PrimaryIFD, kTIFF_ExifIFDPointer ); if ( (exifIFDTag != 0) && (exifIFDTag->type == kTIFF_LongType) && (exifIFDTag->dataLen == 4) ) { XMP_Uns32 exifOffset = this->GetUns32 ( exifIFDTag->dataPtr ); (void) this->ProcessMemoryIFD ( exifOffset, kTIFF_ExifIFD ); } const InternalTagInfo* gpsIFDTag = this->FindTagInIFD ( kTIFF_PrimaryIFD, kTIFF_GPSInfoIFDPointer ); if ( (gpsIFDTag != 0) && (gpsIFDTag->type == kTIFF_LongType) && (gpsIFDTag->dataLen == 4) ) { XMP_Uns32 gpsOffset = this->GetUns32 ( gpsIFDTag->dataPtr ); (void) this->ProcessMemoryIFD ( gpsOffset, kTIFF_GPSInfoIFD ); } const InternalTagInfo* interopIFDTag = this->FindTagInIFD ( kTIFF_ExifIFD, kTIFF_InteroperabilityIFDPointer ); if ( (interopIFDTag != 0) && (interopIFDTag->type == kTIFF_LongType) && (interopIFDTag->dataLen == 4) ) { XMP_Uns32 interopOffset = this->GetUns32 ( interopIFDTag->dataPtr ); (void) this->ProcessMemoryIFD ( interopOffset, kTIFF_InteropIFD ); } #if 0 { printf ( "\nExiting TIFF_FileWriter::ParseMemoryStream\n" ); for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { InternalIFDInfo & thisIFD = this->containedIFDs[ifd]; printf ( "\n IFD %d, count %d, mapped %d, offset %d (0x%X), next IFD %d (0x%X)\n", ifd, thisIFD.origCount, thisIFD.tagMap.size(), thisIFD.origDataOffset, thisIFD.origDataOffset, thisIFD.origNextIFD, thisIFD.origNextIFD ); InternalTagMap::iterator tagPos; InternalTagMap::iterator tagEnd = thisIFD.tagMap.end(); for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) { InternalTagInfo & thisTag = tagPos->second; printf ( " Tag %d, smallValue 0x%X, origDataLen %d, origDataOffset %d (0x%X)\n", thisTag.id, thisTag.smallValue, thisTag.origDataLen, thisTag.origDataOffset, thisTag.origDataOffset ); } } printf ( "\n" ); } #endif } // TIFF_FileWriter::ParseMemoryStream // ================================================================================================= // TIFF_FileWriter::ProcessMemoryIFD // ================================= XMP_Uns32 TIFF_FileWriter::ProcessMemoryIFD ( XMP_Uns32 ifdOffset, XMP_Uns8 ifd ) { InternalIFDInfo& ifdInfo ( this->containedIFDs[ifd] ); if ( (ifdOffset < 8) || (ifdOffset > (this->tiffLength - kEmptyIFDLength)) ) { XMP_Throw ( "Bad IFD offset", kXMPErr_BadTIFF ); } XMP_Uns8* ifdPtr = this->memStream + ifdOffset; XMP_Uns16 tagCount = this->GetUns16 ( ifdPtr ); RawIFDEntry* ifdEntries = (RawIFDEntry*)(ifdPtr+2); if ( tagCount >= 0x8000 ) XMP_Throw ( "Outrageous IFD count", kXMPErr_BadTIFF ); if ( (ifdOffset + 2 + tagCount*12 + 4) > this->tiffLength ) XMP_Throw ( "Out of bounds IFD", kXMPErr_BadTIFF ); ifdInfo.origIFDOffset = ifdOffset; ifdInfo.origCount = tagCount; for ( size_t i = 0; i < tagCount; ++i ) { RawIFDEntry* rawTag = &ifdEntries[i]; XMP_Uns16 tagType = this->GetUns16 ( &rawTag->type ); if ( (tagType < kTIFF_ByteType) || (tagType > kTIFF_LastType) ) continue; // Bad type, skip this tag. XMP_Uns16 tagID = this->GetUns16 ( &rawTag->id ); XMP_Uns32 tagCount = this->GetUns32 ( &rawTag->count ); InternalTagMap::value_type mapValue ( tagID, InternalTagInfo ( tagID, tagType, tagCount, kIsMemoryBased ) ); InternalTagMap::iterator newPos = ifdInfo.tagMap.insert ( ifdInfo.tagMap.end(), mapValue ); InternalTagInfo& mapTag = newPos->second; mapTag.dataLen = mapTag.origDataLen = mapTag.count * (XMP_Uns32)kTIFF_TypeSizes[mapTag.type]; mapTag.smallValue = rawTag->dataOrOffset; // Keep the value or offset in stream byte ordering. if ( mapTag.dataLen <= 4 ) { mapTag.origDataOffset = ifdOffset + 2 + (12 * (XMP_Uns32)i) + 8; // Compute the data offset. } else { mapTag.origDataOffset = this->GetUns32 ( &rawTag->dataOrOffset ); // Extract the data offset. // printf ( "FW_ProcessMemoryIFD tag %d large value @ %.8X\n", mapTag.id, mapTag.dataPtr ); } mapTag.dataPtr = this->memStream + mapTag.origDataOffset; } ifdPtr += (2 + tagCount*12); ifdInfo.origNextIFD = this->GetUns32 ( ifdPtr ); return ifdInfo.origNextIFD; } // TIFF_FileWriter::ProcessMemoryIFD // ================================================================================================= // TIFF_FileWriter::ParseFileStream // ================================ // // The buffered I/O model is worth the logic complexity - as opposed to a simple seek/read for each // part of the TIFF stream. The vast majority of real-world TIFFs have the primary IFD, Exif IFD, // and all of their interesting tag values within the first 64K of the file. Well, at least before // we get around to our edit-by-append approach. void TIFF_FileWriter::ParseFileStream ( LFA_FileRef fileRef ) { bool ok; IOBuffer ioBuf; this->DeleteExistingInfo(); this->fileParsed = true; this->tiffLength = (XMP_Uns32) LFA_Measure ( fileRef ); if ( this->tiffLength == 0 ) return; // Find and process the primary, Exif, GPS, and Interoperability IFDs. ioBuf.filePos = LFA_Seek ( fileRef, 0, SEEK_SET ); ok = CheckFileSpace ( fileRef, &ioBuf, 8 ); if ( ! ok ) XMP_Throw ( "TIFF too small", kXMPErr_BadTIFF ); XMP_Uns32 primaryIFDOffset = this->CheckTIFFHeader ( ioBuf.ptr, this->tiffLength ); if ( primaryIFDOffset != 0 ) (void) this->ProcessFileIFD ( kTIFF_PrimaryIFD, primaryIFDOffset, fileRef, &ioBuf ); const InternalTagInfo* exifIFDTag = this->FindTagInIFD ( kTIFF_PrimaryIFD, kTIFF_ExifIFDPointer ); if ( (exifIFDTag != 0) && (exifIFDTag->type == kTIFF_LongType) && (exifIFDTag->count == 1) ) { XMP_Uns32 exifOffset = this->GetUns32 ( exifIFDTag->dataPtr ); (void) this->ProcessFileIFD ( kTIFF_ExifIFD, exifOffset, fileRef, &ioBuf ); } const InternalTagInfo* gpsIFDTag = this->FindTagInIFD ( kTIFF_PrimaryIFD, kTIFF_GPSInfoIFDPointer ); if ( (gpsIFDTag != 0) && (gpsIFDTag->type == kTIFF_LongType) && (gpsIFDTag->count == 1) ) { XMP_Uns32 gpsOffset = this->GetUns32 ( gpsIFDTag->dataPtr ); (void) this->ProcessFileIFD ( kTIFF_GPSInfoIFD, gpsOffset, fileRef, &ioBuf ); } const InternalTagInfo* interopIFDTag = this->FindTagInIFD ( kTIFF_ExifIFD, kTIFF_InteroperabilityIFDPointer ); if ( (interopIFDTag != 0) && (interopIFDTag->type == kTIFF_LongType) && (interopIFDTag->dataLen == 4) ) { XMP_Uns32 interopOffset = this->GetUns32 ( interopIFDTag->dataPtr ); (void) this->ProcessFileIFD ( kTIFF_InteropIFD, interopOffset, fileRef, &ioBuf ); } #if 0 { printf ( "\nExiting TIFF_FileWriter::ParseFileStream\n" ); for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { InternalIFDInfo & thisIFD = this->containedIFDs[ifd]; printf ( "\n IFD %d, count %d, mapped %d, offset %d (0x%X), next IFD %d (0x%X)\n", ifd, thisIFD.origCount, thisIFD.tagMap.size(), thisIFD.origDataOffset, thisIFD.origDataOffset, thisIFD.origNextIFD, thisIFD.origNextIFD ); InternalTagMap::iterator tagPos; InternalTagMap::iterator tagEnd = thisIFD.tagMap.end(); for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) { InternalTagInfo & thisTag = tagPos->second; printf ( " Tag %d, smallValue 0x%X, origDataLen %d, origDataOffset %d (0x%X)\n", thisTag.id, thisTag.smallValue, thisTag.origDataLen, thisTag.origDataOffset, thisTag.origDataOffset ); } } printf ( "\n" ); } #endif } // TIFF_FileWriter::ParseFileStream // ================================================================================================= // TIFF_FileWriter::ProcessFileIFD // =============================== XMP_Uns32 TIFF_FileWriter::ProcessFileIFD ( XMP_Uns8 ifd, XMP_Uns32 ifdOffset, LFA_FileRef fileRef, IOBuffer* ioBuf ) { InternalIFDInfo& ifdInfo ( this->containedIFDs[ifd] ); MoveToOffset ( fileRef, ifdOffset, ioBuf ); // Move to the start of the IFD. bool ok = CheckFileSpace ( fileRef, ioBuf, 2 ); if ( ! ok ) XMP_Throw ( "IFD count missing", kXMPErr_BadTIFF ); XMP_Uns16 tagCount = this->GetUns16 ( ioBuf->ptr ); if ( tagCount >= 0x8000 ) XMP_Throw ( "Outrageous IFD count", kXMPErr_BadTIFF ); if ( (ifdOffset + 2 + tagCount*12 + 4) > this->tiffLength ) XMP_Throw ( "Out of bounds IFD", kXMPErr_BadTIFF ); ifdInfo.origIFDOffset = ifdOffset; ifdInfo.origCount = tagCount; // --------------------------------------------------------------------------------------------- // First create all of the IFD map entries, capturing short values, and get the next IFD offset. // We're using a std::map for storage, it automatically eliminates duplicates and provides // sorted output. Plus the "map[key] = value" assignment conveniently keeps the last encountered // value, following Photoshop's behavior. ioBuf->ptr += 2; // Move to the first IFD entry. for ( XMP_Uns16 i = 0; i < tagCount; ++i, ioBuf->ptr += 12 ) { if ( ! CheckFileSpace ( fileRef, ioBuf, 12 ) ) XMP_Throw ( "EOF within IFD", kXMPErr_BadTIFF ); RawIFDEntry* rawTag = (RawIFDEntry*)ioBuf->ptr; XMP_Uns16 tagType = this->GetUns16 ( &rawTag->type ); if ( (tagType < kTIFF_ByteType) || (tagType > kTIFF_LastType) ) continue; // Bad type, skip this tag. XMP_Uns16 tagID = this->GetUns16 ( &rawTag->id ); XMP_Uns32 tagCount = this->GetUns32 ( &rawTag->count ); InternalTagMap::value_type mapValue ( tagID, InternalTagInfo ( tagID, tagType, tagCount, kIsFileBased ) ); InternalTagMap::iterator newPos = ifdInfo.tagMap.insert ( ifdInfo.tagMap.end(), mapValue ); InternalTagInfo& mapTag = newPos->second; mapTag.dataLen = mapTag.origDataLen = mapTag.count * (XMP_Uns32)kTIFF_TypeSizes[mapTag.type]; mapTag.smallValue = rawTag->dataOrOffset; // Keep the value or offset in stream byte ordering. if ( mapTag.dataLen <= 4 ) { mapTag.dataPtr = (XMP_Uns8*) &mapTag.smallValue; mapTag.origDataOffset = ifdOffset + 2 + (12 * i) + 8; // Compute the data offset. } else { mapTag.origDataOffset = this->GetUns32 ( &rawTag->dataOrOffset ); // Extract the data offset. } } if ( ! CheckFileSpace ( fileRef, ioBuf, 4 ) ) XMP_Throw ( "EOF at next IFD offset", kXMPErr_BadTIFF ); ifdInfo.origNextIFD = this->GetUns32 ( ioBuf->ptr ); // --------------------------------------------------------------------------------------------- // Go back over the tag map and extract the data for large recognized tags. This is done in 2 // passes, in order to lessen the typical amount of I/O. On the first pass make sure we have at // least 32K of data following the IFD in the buffer, and extract all of the values in that // portion. This should cover an original file, or the appended values with an appended IFD. if ( (ioBuf->limit - ioBuf->ptr) < 32*1024 ) RefillBuffer ( fileRef, ioBuf ); InternalTagMap::iterator tagPos = ifdInfo.tagMap.begin(); InternalTagMap::iterator tagEnd = ifdInfo.tagMap.end(); const XMP_Uns16* knownTagPtr = sKnownTags[ifd]; // Points into the ordered recognized tag list. XMP_Uns32 bufBegin = (XMP_Uns32)ioBuf->filePos; // TIFF stream bounds for the current buffer. XMP_Uns32 bufEnd = bufBegin + (XMP_Uns32)ioBuf->len; for ( ; tagPos != tagEnd; ++tagPos ) { InternalTagInfo* currTag = &tagPos->second; if ( currTag->dataLen <= 4 ) continue; // Short values are already in the smallValue field. while ( *knownTagPtr < currTag->id ) ++knownTagPtr; if ( *knownTagPtr != currTag->id ) continue; // Skip unrecognized tags. if ( currTag->dataLen > 1024*1024 ) XMP_Throw ( "Outrageous data length", kXMPErr_BadTIFF ); if ( (bufBegin <= currTag->origDataOffset) && ((currTag->origDataOffset + currTag->dataLen) <= bufEnd) ) { // This value is already fully within the current I/O buffer, copy it. MoveToOffset ( fileRef, currTag->origDataOffset, ioBuf ); currTag->dataPtr = (XMP_Uns8*) malloc ( currTag->dataLen ); if ( currTag->dataPtr == 0 ) XMP_Throw ( "No data block", kXMPErr_NoMemory ); memcpy ( currTag->dataPtr, ioBuf->ptr, currTag->dataLen ); // AUDIT: Safe, malloc'ed currTag->dataLen bytes above. currTag->changed = true; // Memory leaks otherwise } } // --------------------------------------------------------------------------------------------- // Now the second large value pass. This will reposition the I/O buffer as necessary. Hopefully // just once, to pick up the span of data not covered in the first pass. tagPos = ifdInfo.tagMap.begin(); // Reset both map/array positions. knownTagPtr = sKnownTags[ifd]; for ( ; tagPos != tagEnd; ++tagPos ) { InternalTagInfo* currTag = &tagPos->second; if ( (currTag->dataLen <= 4) || (currTag->dataPtr != 0) ) continue; // Done this tag? while ( *knownTagPtr < currTag->id ) ++knownTagPtr; if ( *knownTagPtr != currTag->id ) continue; // Skip unrecognized tags. if ( currTag->dataLen > 1024*1024 ) XMP_Throw ( "Outrageous data length", kXMPErr_BadTIFF ); currTag->dataPtr = (XMP_Uns8*) malloc ( currTag->dataLen ); if ( currTag->dataPtr == 0 ) XMP_Throw ( "No data block", kXMPErr_NoMemory ); //HUB-merge currTag->changed = true; // Memory leaks otherwise if ( currTag->dataLen > kIOBufferSize ) { // This value is bigger than the I/O buffer, read it directly and restore the file position. LFA_Seek ( fileRef, currTag->origDataOffset, SEEK_SET ); LFA_Read ( fileRef, currTag->dataPtr, currTag->dataLen, kLFA_RequireAll ); LFA_Seek ( fileRef, (ioBuf->filePos + ioBuf->len), SEEK_SET ); } else { // This value can fit in the I/O buffer, so use that. MoveToOffset ( fileRef, currTag->origDataOffset, ioBuf ); ok = CheckFileSpace ( fileRef, ioBuf, currTag->dataLen ); if ( ! ok ) XMP_Throw ( "EOF in data block", kXMPErr_BadTIFF ); memcpy ( currTag->dataPtr, ioBuf->ptr, currTag->dataLen ); // AUDIT: Safe, malloc'ed currTag->dataLen bytes above. } } // Done, return the next IFD offset. return ifdInfo.origNextIFD; } // TIFF_FileWriter::ProcessFileIFD // ================================================================================================= // TIFF_FileWriter::IntegrateFromPShop6 // ==================================== // // See comments for ProcessPShop6IFD. void TIFF_FileWriter::IntegrateFromPShop6 ( const void * buriedPtr, size_t buriedLen ) { TIFF_MemoryReader buriedExif; buriedExif.ParseMemoryStream ( buriedPtr, (XMP_Uns32) buriedLen ); this->ProcessPShop6IFD ( buriedExif, kTIFF_PrimaryIFD ); this->ProcessPShop6IFD ( buriedExif, kTIFF_ExifIFD ); this->ProcessPShop6IFD ( buriedExif, kTIFF_GPSInfoIFD ); } // TIFF_FileWriter::IntegrateFromPShop6 // ================================================================================================= // TIFF_FileWriter::CopyTagToMasterIFD // =================================== // // Create a new master IFD entry from a buried Photoshop 6 IFD entry. Don't try to get clever with // large values, just create a new copy. This preserves a clean separation between the memory-based // and file-based TIFF processing. void* TIFF_FileWriter::CopyTagToMasterIFD ( const TagInfo & ps6Tag, InternalIFDInfo * masterIFD ) { InternalTagMap::value_type mapValue ( ps6Tag.id, InternalTagInfo ( ps6Tag.id, ps6Tag.type, ps6Tag.count, this->fileParsed ) ); InternalTagMap::iterator newPos = masterIFD->tagMap.insert ( masterIFD->tagMap.end(), mapValue ); InternalTagInfo& newTag = newPos->second; newTag.dataLen = ps6Tag.dataLen; if ( newTag.dataLen <= 4 ) { newTag.dataPtr = (XMP_Uns8*) &newTag.smallValue; newTag.smallValue = *((XMP_Uns32*)ps6Tag.dataPtr); } else { newTag.dataPtr = (XMP_Uns8*) malloc ( newTag.dataLen ); if ( newTag.dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); memcpy ( newTag.dataPtr, ps6Tag.dataPtr, newTag.dataLen ); // AUDIT: Safe, malloc'ed dataLen bytes above. } newTag.changed = true; // ! See comments with ProcessPShop6IFD. XMP_Assert ( (newTag.origDataLen == 0) && (newTag.origDataOffset == 0) ); masterIFD->changed = true; return newPos->second.dataPtr; // ! Return the address within the map entry for small values. } // TIFF_FileWriter::CopyTagToMasterIFD // ================================================================================================= // FlipCFATable // ============ // // The CFA pattern table is trivial, a pair of short counts followed by n*m bytes. static bool FlipCFATable ( void* voidPtr, XMP_Uns32 tagLen, GetUns16_Proc GetUns16 ) { if ( tagLen < 4 ) return false; XMP_Uns16* u16Ptr = (XMP_Uns16*)voidPtr; Flip2 ( &u16Ptr[0] ); // Flip the counts to match the master TIFF. Flip2 ( &u16Ptr[1] ); XMP_Uns16 columns = GetUns16 ( &u16Ptr[0] ); // Fetch using the master TIFF's routine. XMP_Uns16 rows = GetUns16 ( &u16Ptr[1] ); if ( tagLen != (XMP_Uns32)(4 + columns*rows) ) return false; return true; } // FlipCFATable // ================================================================================================= // FlipDSDTable // ============ // // The device settings description table is trivial, a pair of short counts followed by UTF-16 // strings. So the whole value should be flipped as a sequence of 16 bit items. // ! The Exif 2.2 description is a bit garbled. It might be wrong. It would be nice to have a real example. static bool FlipDSDTable ( void* voidPtr, XMP_Uns32 tagLen, GetUns16_Proc GetUns16 ) { if ( tagLen < 4 ) return false; XMP_Uns16* u16Ptr = (XMP_Uns16*)voidPtr; for ( size_t i = tagLen/2; i > 0; --i, ++u16Ptr ) Flip2 ( u16Ptr ); return true; } // FlipDSDTable // ================================================================================================= // FlipOECFSFRTable // ================ // // The OECF and SFR tables have the same layout: // 2 short counts, columns and rows // c ASCII strings, null terminated, column names // c*r rationals static bool FlipOECFSFRTable ( void* voidPtr, XMP_Uns32 tagLen, GetUns16_Proc GetUns16 ) { XMP_Uns16* u16Ptr = (XMP_Uns16*)voidPtr; Flip2 ( &u16Ptr[0] ); // Flip the data to match the master TIFF. Flip2 ( &u16Ptr[1] ); XMP_Uns16 columns = GetUns16 ( &u16Ptr[0] ); // Fetch using the master TIFF's routine. XMP_Uns16 rows = GetUns16 ( &u16Ptr[1] ); XMP_Uns32 minLen = 4 + columns + (8 * columns * rows); // Minimum legit tag size. if ( tagLen < minLen ) return false; // Compute the start of the rationals from the end of value. No need to walk through the names. XMP_Uns32* u32Ptr = (XMP_Uns32*) ((XMP_Uns8*)voidPtr + tagLen - (8 * columns * rows)); for ( size_t i = 2*columns*rows; i > 0; --i, ++u32Ptr ) Flip4 ( u32Ptr ); return true; } // FlipOECFSFRTable // ================================================================================================= // TIFF_FileWriter::ProcessPShop6IFD // ================================= // // Photoshop 6 wrote wacky TIFF files that have much of the Exif metadata buried inside of image // resource 1058, which is itself within tag 34377 in the 0th IFD. This routine moves the buried // tags up to the parent file. Existing tags are not replaced. // // While it is tempting to try to directly use the TIFF_MemoryReader's tweaked IFD info, making that // visible would compromise implementation separation. Better to pay the modest runtime cost of // using the official GetIFD method, letting it build the map. // // The tags that get moved are marked as being changed, as is the IFD they are moved into, but the // overall TIFF_FileWriter object is not. We don't want this integration on its own to force a file // update, but a file update should include these changes. // ! Be careful to not move tags that are the nasty Exif explicit offsets, e.g. the Exif or GPS IFD // ! "pointers". These are tags with a LONG type and count of 1, whose value is an offset into the // ! buried TIFF stream. We can't reliably plant that offset into the outer IFD structure. // ! To make things even more fun, the buried Exif might not have the same endianness as the outer! void TIFF_FileWriter::ProcessPShop6IFD ( const TIFF_MemoryReader& buriedExif, XMP_Uns8 ifd ) { bool ok, found; TagInfoMap ps6IFD; found = buriedExif.GetIFD ( ifd, &ps6IFD ); if ( ! found ) return; bool needsFlipping = (this->bigEndian != buriedExif.IsBigEndian()); InternalIFDInfo* masterIFD = &this->containedIFDs[ifd]; TagInfoMap::const_iterator ps6Pos = ps6IFD.begin(); TagInfoMap::const_iterator ps6End = ps6IFD.end(); for ( ; ps6Pos != ps6End; ++ps6Pos ) { // Copy buried tags to the master IFD if they don't already exist there. const TagInfo& ps6Tag = ps6Pos->second; if ( this->FindTagInIFD ( ifd, ps6Tag.id ) != 0 ) continue; // Keep existing master tags. if ( needsFlipping && (ps6Tag.id == 37500) ) continue; // Don't copy an unflipped MakerNote. if ( (ps6Tag.id == kTIFF_ExifIFDPointer) || // Skip the tags that are explicit offsets. (ps6Tag.id == kTIFF_GPSInfoIFDPointer) || (ps6Tag.id == kTIFF_JPEGInterchangeFormat) || (ps6Tag.id == kTIFF_InteroperabilityIFDPointer) ) continue; void* voidPtr = this->CopyTagToMasterIFD ( ps6Tag, masterIFD ); if ( needsFlipping ) { switch ( ps6Tag.type ) { case kTIFF_ByteType: case kTIFF_SByteType: case kTIFF_ASCIIType: // Nothing more to do. break; case kTIFF_ShortType: case kTIFF_SShortType: { XMP_Uns16* u16Ptr = (XMP_Uns16*)voidPtr; for ( size_t i = ps6Tag.count; i > 0; --i, ++u16Ptr ) Flip2 ( u16Ptr ); } break; case kTIFF_LongType: case kTIFF_SLongType: case kTIFF_FloatType: { XMP_Uns32* u32Ptr = (XMP_Uns32*)voidPtr; for ( size_t i = ps6Tag.count; i > 0; --i, ++u32Ptr ) Flip4 ( u32Ptr ); } break; case kTIFF_RationalType: case kTIFF_SRationalType: { XMP_Uns32* ratPtr = (XMP_Uns32*)voidPtr; for ( size_t i = (2 * ps6Tag.count); i > 0; --i, ++ratPtr ) Flip4 ( ratPtr ); } break; case kTIFF_DoubleType: { XMP_Uns64* u64Ptr = (XMP_Uns64*)voidPtr; for ( size_t i = ps6Tag.count; i > 0; --i, ++u64Ptr ) Flip8 ( u64Ptr ); } break; case kTIFF_UndefinedType: // Fix up the few kinds of special tables that Exif 2.2 defines. ok = true; // Keep everything that isn't a special table. if ( ps6Tag.id == kTIFF_CFAPattern ) { ok = FlipCFATable ( voidPtr, ps6Tag.dataLen, this->GetUns16 ); } else if ( ps6Tag.id == kTIFF_DeviceSettingDescription ) { ok = FlipDSDTable ( voidPtr, ps6Tag.dataLen, this->GetUns16 ); } else if ( (ps6Tag.id == kTIFF_OECF) || (ps6Tag.id == kTIFF_SpatialFrequencyResponse) ) { ok = FlipOECFSFRTable ( voidPtr, ps6Tag.dataLen, this->GetUns16 ); } if ( ! ok ) this->DeleteTag ( ifd, ps6Tag.id ); break; default: // ? XMP_Throw ( "Unexpected tag type", kXMPErr_InternalFailure ); this->DeleteTag ( ifd, ps6Tag.id ); break; } } } } // TIFF_FileWriter::ProcessPShop6IFD // ================================================================================================= // TIFF_FileWriter::PreflightIFDLinkage // ==================================== // // Preflight special cases for the linkage between IFDs. Three of the IFDs are found through an // explicit tag, the Exif, GPS, and Interop IFDs. The presence or absence of those IFDs affects the // presence or absence of the linkage tag, which can affect the IFD containing the linkage tag. The // thumbnail IFD is chained from the primary IFD, so if the thumbnail IFD is present we make sure // that the primary IFD isn't empty. void TIFF_FileWriter::PreflightIFDLinkage() { // Do the tag-linked IFDs bottom up, Interop then GPS then Exif. if ( this->containedIFDs[kTIFF_InteropIFD].tagMap.empty() ) { this->DeleteTag ( kTIFF_ExifIFD, kTIFF_InteroperabilityIFDPointer ); } else if ( ! this->GetTag ( kTIFF_ExifIFD, kTIFF_InteroperabilityIFDPointer, 0 ) ) { this->SetTag_Long ( kTIFF_ExifIFD, kTIFF_InteroperabilityIFDPointer, 0xABADABAD ); } if ( this->containedIFDs[kTIFF_GPSInfoIFD].tagMap.empty() ) { this->DeleteTag ( kTIFF_PrimaryIFD, kTIFF_GPSInfoIFDPointer ); } else if ( ! this->GetTag ( kTIFF_PrimaryIFD, kTIFF_GPSInfoIFDPointer, 0 ) ) { this->SetTag_Long ( kTIFF_PrimaryIFD, kTIFF_GPSInfoIFDPointer, 0xABADABAD ); } if ( this->containedIFDs[kTIFF_ExifIFD].tagMap.empty() ) { this->DeleteTag ( kTIFF_PrimaryIFD, kTIFF_ExifIFDPointer ); } else if ( ! this->GetTag ( kTIFF_PrimaryIFD, kTIFF_ExifIFDPointer, 0 ) ) { this->SetTag_Long ( kTIFF_PrimaryIFD, kTIFF_ExifIFDPointer, 0xABADABAD ); } // Make sure that the primary IFD is not empty if the thumbnail IFD is not empty. if ( this->containedIFDs[kTIFF_PrimaryIFD].tagMap.empty() && (! this->containedIFDs[kTIFF_TNailIFD].tagMap.empty()) ) { this->SetTag_Short ( kTIFF_PrimaryIFD, kTIFF_ResolutionUnit, 2 ); // Set Resolution unit to inches. } } // TIFF_FileWriter::PreflightIFDLinkage // ================================================================================================= // TIFF_FileWriter::DetermineVisibleLength // ======================================= XMP_Uns32 TIFF_FileWriter::DetermineVisibleLength() { XMP_Uns32 visibleLength = 8; // Start with the TIFF header size. for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { InternalIFDInfo& ifdInfo ( this->containedIFDs[ifd] ); size_t tagCount = ifdInfo.tagMap.size(); if ( tagCount == 0 ) continue; visibleLength += (XMP_Uns32)( 6 + (12 * tagCount) ); InternalTagMap::iterator tagPos = ifdInfo.tagMap.begin(); InternalTagMap::iterator tagEnd = ifdInfo.tagMap.end(); for ( ; tagPos != tagEnd; ++tagPos ) { InternalTagInfo & currTag ( tagPos->second ); if ( currTag.dataLen > 4 ) visibleLength += ((currTag.dataLen + 1) & 0xFFFFFFFE); // ! Round to even lengths. } } return visibleLength; } // TIFF_FileWriter::DetermineVisibleLength // ================================================================================================= // TIFF_FileWriter::DetermineAppendInfo // ==================================== #ifndef Trace_DetermineAppendInfo #define Trace_DetermineAppendInfo 0 #endif XMP_Uns32 TIFF_FileWriter::DetermineAppendInfo ( XMP_Uns32 appendedOrigin, bool appendedIFDs[kTIFF_KnownIFDCount], XMP_Uns32 newIFDOffsets[kTIFF_KnownIFDCount], bool appendAll /* = false */ ) { XMP_Uns32 appendedLength = 0; XMP_Assert ( (appendedOrigin & 1) == 0 ); // Make sure it is even. #if Trace_DetermineAppendInfo { printf ( "\nEntering TIFF_FileWriter::DetermineAppendInfo%s\n", (appendAll ? ", append all" : "") ); for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { InternalIFDInfo & thisIFD = this->containedIFDs[ifd]; printf ( "\n IFD %d, origCount %d, map.size %d, origIFDOffset %d (0x%X), origNextIFD %d (0x%X)", ifd, thisIFD.origCount, thisIFD.tagMap.size(), thisIFD.origIFDOffset, thisIFD.origIFDOffset, thisIFD.origNextIFD, thisIFD.origNextIFD ); if ( thisIFD.changed ) printf ( ", changed" ); if ( thisIFD.origCount < thisIFD.tagMap.size() ) printf ( ", should get appended" ); printf ( "\n" ); InternalTagMap::iterator tagPos; InternalTagMap::iterator tagEnd = thisIFD.tagMap.end(); for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) { InternalTagInfo & thisTag = tagPos->second; printf ( " Tag %d, smallValue 0x%X, origDataLen %d, origDataOffset %d (0x%X)", thisTag.id, thisTag.smallValue, thisTag.origDataLen, thisTag.origDataOffset, thisTag.origDataOffset ); if ( thisTag.changed ) printf ( ", changed" ); if ( (thisTag.dataLen > thisTag.origDataLen) && (thisTag.dataLen > 4) ) printf ( ", should get appended" ); printf ( "\n" ); } } printf ( "\n" ); } #endif // Determine which of the IFDs will be appended. If the Exif, GPS, or Interoperability IFDs are // appended, set dummy values for their offsets in the "owning" IFD. This must be done first // since this might cause the owning IFD to grow. if ( ! appendAll ) { for ( int i = 0; i < kTIFF_KnownIFDCount ;++i ) appendedIFDs[i] = false; } else { for ( int i = 0; i < kTIFF_KnownIFDCount ;++i ) appendedIFDs[i] = (this->containedIFDs[i].tagMap.size() > 0); } appendedIFDs[kTIFF_InteropIFD] |= (this->containedIFDs[kTIFF_InteropIFD].origCount < this->containedIFDs[kTIFF_InteropIFD].tagMap.size()); if ( appendedIFDs[kTIFF_InteropIFD] ) { this->SetTag_Long ( kTIFF_ExifIFD, kTIFF_InteroperabilityIFDPointer, 0xABADABAD ); } appendedIFDs[kTIFF_GPSInfoIFD] |= (this->containedIFDs[kTIFF_GPSInfoIFD].origCount < this->containedIFDs[kTIFF_GPSInfoIFD].tagMap.size()); if ( appendedIFDs[kTIFF_GPSInfoIFD] ) { this->SetTag_Long ( kTIFF_PrimaryIFD, kTIFF_GPSInfoIFDPointer, 0xABADABAD ); } appendedIFDs[kTIFF_ExifIFD] |= (this->containedIFDs[kTIFF_ExifIFD].origCount < this->containedIFDs[kTIFF_ExifIFD].tagMap.size()); if ( appendedIFDs[kTIFF_ExifIFD] ) { this->SetTag_Long ( kTIFF_PrimaryIFD, kTIFF_ExifIFDPointer, 0xABADABAD ); } appendedIFDs[kTIFF_PrimaryIFD] |= (this->containedIFDs[kTIFF_PrimaryIFD].origCount < this->containedIFDs[kTIFF_PrimaryIFD].tagMap.size()); // The appended data (if any) will be a sequence of an IFD followed by its large values. // Determine the new offsets for the appended IFDs and tag values, and the total amount of // appended stuff. for ( int ifd = 0; ifd < kTIFF_KnownIFDCount ;++ifd ) { InternalIFDInfo& ifdInfo ( this->containedIFDs[ifd] ); size_t tagCount = ifdInfo.tagMap.size(); if ( ! (appendAll | ifdInfo.changed) ) continue; if ( tagCount == 0 ) continue; newIFDOffsets[ifd] = ifdInfo.origIFDOffset; if ( appendedIFDs[ifd] ) { newIFDOffsets[ifd] = appendedOrigin + appendedLength; appendedLength += (XMP_Uns32)( 6 + (12 * tagCount) ); } InternalTagMap::iterator tagPos = ifdInfo.tagMap.begin(); InternalTagMap::iterator tagEnd = ifdInfo.tagMap.end(); for ( ; tagPos != tagEnd; ++tagPos ) { InternalTagInfo & currTag ( tagPos->second ); if ( (! (appendAll | currTag.changed)) || (currTag.dataLen <= 4) ) continue; if ( (currTag.dataLen <= currTag.origDataLen) && (! appendAll) ) { this->PutUns32 ( currTag.origDataOffset, &currTag.smallValue ); // Reuse the old space. } else { this->PutUns32 ( (appendedOrigin + appendedLength), &currTag.smallValue ); // Set the appended offset. appendedLength += ((currTag.dataLen + 1) & 0xFFFFFFFEUL); // Round to an even size. } } } // If the Exif, GPS, or Interoperability IFDs get appended, update the tag values for their new offsets. if ( appendedIFDs[kTIFF_ExifIFD] ) { this->SetTag_Long ( kTIFF_PrimaryIFD, kTIFF_ExifIFDPointer, newIFDOffsets[kTIFF_ExifIFD] ); } if ( appendedIFDs[kTIFF_GPSInfoIFD] ) { this->SetTag_Long ( kTIFF_PrimaryIFD, kTIFF_GPSInfoIFDPointer, newIFDOffsets[kTIFF_GPSInfoIFD] ); } if ( appendedIFDs[kTIFF_InteropIFD] ) { this->SetTag_Long ( kTIFF_ExifIFD, kTIFF_InteroperabilityIFDPointer, newIFDOffsets[kTIFF_InteropIFD] ); } #if Trace_DetermineAppendInfo { printf ( "Exiting TIFF_FileWriter::DetermineAppendInfo\n" ); for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { InternalIFDInfo & thisIFD = this->containedIFDs[ifd]; printf ( "\n IFD %d, origCount %d, map.size %d, origIFDOffset %d (0x%X), origNextIFD %d (0x%X)", ifd, thisIFD.origCount, thisIFD.tagMap.size(), thisIFD.origIFDOffset, thisIFD.origIFDOffset, thisIFD.origNextIFD, thisIFD.origNextIFD ); if ( thisIFD.changed ) printf ( ", changed" ); if ( appendedIFDs[ifd] ) printf ( ", will be appended at %d (0x%X)", newIFDOffsets[ifd], newIFDOffsets[ifd] ); printf ( "\n" ); InternalTagMap::iterator tagPos; InternalTagMap::iterator tagEnd = thisIFD.tagMap.end(); for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) { InternalTagInfo & thisTag = tagPos->second; printf ( " Tag %d, smallValue 0x%X, origDataLen %d, origDataOffset %d (0x%X)", thisTag.id, thisTag.smallValue, thisTag.origDataLen, thisTag.origDataOffset, thisTag.origDataOffset ); if ( thisTag.changed ) printf ( ", changed" ); if ( (thisTag.dataLen > thisTag.origDataLen) && (thisTag.dataLen > 4) ) { XMP_Uns32 newOffset = this->GetUns32 ( &thisTag.smallValue ); printf ( ", will be appended at %d (0x%X)", newOffset, newOffset ); } printf ( "\n" ); } } printf ( "\n" ); } #endif return appendedLength; } // TIFF_FileWriter::DetermineAppendInfo // ================================================================================================= // TIFF_FileWriter::UpdateMemByAppend // ================================== // // Normally we update TIFF in a conservative "by-append" manner. Changes are written in-place where // they fit, anything requiring growth is appended to the end and the old space is abandoned. The // end for memory-based TIFF is the end of the data block, the end for file-based TIFF is the end of // the file. This update-by-append model has the advantage of not perturbing any hidden offsets, a // common feature of proprietary MakerNotes. // // When doing the update-by-append we're only going to be modifying things that have changed. This // means IFDs with changed, added, or deleted tags, and large values for changed or added tags. The // IFDs and tag values are updated in-place if they fit, leaving holes in the stream if the new // value is smaller than the old. // ** Someday we might want to use the FreeOffsets and FreeByteCounts tags to track free space. // ** Probably not a huge win in practice though, and the TIFF spec says they are not recommended // ** for general interchange use. void TIFF_FileWriter::UpdateMemByAppend ( XMP_Uns8** newStream_out, XMP_Uns32* newLength_out, bool appendAll /* = false */, XMP_Uns32 extraSpace /* = 0 */ ) { bool appendedIFDs[kTIFF_KnownIFDCount]; XMP_Uns32 newIFDOffsets[kTIFF_KnownIFDCount]; XMP_Uns32 appendedOrigin = ((this->tiffLength + 1) & 0xFFFFFFFEUL); // Start at an even offset. XMP_Uns32 appendedLength = DetermineAppendInfo ( appendedOrigin, appendedIFDs, newIFDOffsets, appendAll ); // Allocate the new block of memory for the full stream. Copy the original stream. Write the // modified IFDs and values. Finally rebuild the internal IFD info and tag map. XMP_Uns32 newLength = appendedOrigin + appendedLength; XMP_Uns8* newStream = (XMP_Uns8*) malloc ( newLength + extraSpace ); if ( newStream == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); memcpy ( newStream, this->memStream, this->tiffLength ); // AUDIT: Safe, malloc'ed newLength bytes above. if ( this->tiffLength < appendedOrigin ) { XMP_Assert ( appendedOrigin == (this->tiffLength + 1) ); newStream[this->tiffLength] = 0; // Clear the pad byte. } try { // We might get exceptions from the next part and must delete newStream on the way out. // Write the modified IFDs and values. Rewrite the full IFD from scratch to make sure the // tags are now unique and sorted. Copy large changed values to their appropriate location. XMP_Uns32 appendedOffset = appendedOrigin; for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { InternalIFDInfo& ifdInfo ( this->containedIFDs[ifd] ); size_t tagCount = ifdInfo.tagMap.size(); if ( ! (appendAll | ifdInfo.changed) ) continue; if ( tagCount == 0 ) continue; XMP_Uns8* ifdPtr = newStream + newIFDOffsets[ifd]; if ( appendedIFDs[ifd] ) { XMP_Assert ( newIFDOffsets[ifd] == appendedOffset ); appendedOffset += (XMP_Uns32)( 6 + (12 * tagCount) ); } this->PutUns16 ( (XMP_Uns16)tagCount, ifdPtr ); ifdPtr += 2; InternalTagMap::iterator tagPos = ifdInfo.tagMap.begin(); InternalTagMap::iterator tagEnd = ifdInfo.tagMap.end(); for ( ; tagPos != tagEnd; ++tagPos ) { InternalTagInfo & currTag ( tagPos->second ); this->PutUns16 ( currTag.id, ifdPtr ); ifdPtr += 2; this->PutUns16 ( currTag.type, ifdPtr ); ifdPtr += 2; this->PutUns32 ( currTag.count, ifdPtr ); ifdPtr += 4; *((XMP_Uns32*)ifdPtr) = currTag.smallValue; if ( (appendAll | currTag.changed) && (currTag.dataLen > 4) ) { XMP_Uns32 valueOffset = this->GetUns32 ( &currTag.smallValue ); if ( (currTag.dataLen <= currTag.origDataLen) && (! appendAll) ) { XMP_Assert ( valueOffset == currTag.origDataOffset ); } else { XMP_Assert ( valueOffset == appendedOffset ); appendedOffset += ((currTag.dataLen + 1) & 0xFFFFFFFEUL); } if ( currTag.dataLen > (newLength - valueOffset) ) XMP_Throw ( "Buffer overrun", kXMPErr_InternalFailure ); memcpy ( (newStream + valueOffset), currTag.dataPtr, currTag.dataLen ); // AUDIT: Protected by the above check. if ( (currTag.dataLen & 1) != 0 ) newStream[valueOffset+currTag.dataLen] = 0; } ifdPtr += 4; } this->PutUns32 ( ifdInfo.origNextIFD, ifdPtr ); ifdPtr += 4; } XMP_Assert ( appendedOffset == newLength ); // Back fill the offsets for the primary and thumnbail IFDs, if they are now appended. if ( appendedIFDs[kTIFF_PrimaryIFD] ) { this->PutUns32 ( newIFDOffsets[kTIFF_PrimaryIFD], (newStream + 4) ); } } catch ( ... ) { free ( newStream ); throw; } *newStream_out = newStream; *newLength_out = newLength; } // TIFF_FileWriter::UpdateMemByAppend // ================================================================================================= // TIFF_FileWriter::UpdateMemByRewrite // =================================== // // Normally we update TIFF in a conservative "by-append" manner. Changes are written in-place where // they fit, anything requiring growth is appended to the end and the old space is abandoned. The // end for memory-based TIFF is the end of the data block, the end for file-based TIFF is the end of // the file. This update-by-append model has the advantage of not perturbing any hidden offsets, a // common feature of proprietary MakerNotes. // // The condenseStream parameter can be used to rewrite the full stream instead of appending. This // will discard any MakerNote tag and risks breaking offsets that are hidden. This can be necessary // though to try to make the TIFF fit in a JPEG file. // // We don't do most of the actual rewrite here. We set things up so that UpdateMemByAppend can be // called to append onto a bare TIFF header. Additional hidden offsets are then handled here. // // These tags are recognized as being hidden offsets when composing a condensed stream: // 273 - StripOffsets, lengths in tag 279 // 288 - FreeOffsets, lengths in tag 289 // 324 - TileOffsets, lengths in tag 325 // 330 - SubIFDs, lengths within the IFDs (Plus subIFD values and possible chaining!) // 513 - JPEGInterchangeFormat, length in tag 514 // 519 - JPEGQTables, each table is 64 bytes // 520 - JPEGDCTables, lengths ??? // 521 - JPEGACTables, lengths ??? // Some of these will handled and kept, some will be thrown out, some will cause the rewrite to fail. // // The hidden offsets for the Exif, GPS, and Interoperability IFDs (tags 34665, 34853, and 40965) // are handled by the code in DetermineAppendInfo, which is called from UpdateMemByAppend, which is // called from here. // ! So far, a memory-based TIFF rewrite would only be done for the Exif portion of a JPEG file. // ! In which case we're probably OK to handle JPEGInterchangeFormat (used for compressed thumbnails) // ! and complain about any of the other hidden offset tags. // tag count type // 273 n short or long // 279 n short or long // 288 n long // 289 n long // 324 n long // 325 n short or long // 330 n long // 513 1 long // 514 1 long // 519 n long // 520 n long // 521 n long static XMP_Uns16 kNoGoTags[] = { kTIFF_StripOffsets, // 273 *** Should be handled? kTIFF_StripByteCounts, // 279 *** Should be handled? kTIFF_FreeOffsets, // 288 *** Should be handled? kTIFF_FreeByteCounts, // 289 *** Should be handled? kTIFF_TileOffsets, // 324 *** Should be handled? kTIFF_TileByteCounts, // 325 *** Should be handled? kTIFF_SubIFDs, // 330 *** Should be handled? kTIFF_JPEGQTables, // 519 kTIFF_JPEGDCTables, // 520 kTIFF_JPEGACTables, // 521 0xFFFF // Must be last as a sentinel. }; static XMP_Uns16 kBanishedTags[] = { kTIFF_MakerNote, // *** Should someday support MakerNoteSafety. 0xFFFF // Must be last as a sentinel. }; struct SimpleHiddenContentInfo { XMP_Uns8 ifd; XMP_Uns16 offsetTag, lengthTag; }; struct SimpleHiddenContentLocations { XMP_Uns32 length, oldOffset, newOffset; SimpleHiddenContentLocations() : length(0), oldOffset(0), newOffset(0) {}; }; enum { kSimpleHiddenContentCount = 1 }; static const SimpleHiddenContentInfo kSimpleHiddenContentInfo [kSimpleHiddenContentCount] = { { kTIFF_TNailIFD, kTIFF_JPEGInterchangeFormat, kTIFF_JPEGInterchangeFormatLength } }; // ------------------------------------------------------------------------------------------------- void TIFF_FileWriter::UpdateMemByRewrite ( XMP_Uns8** newStream_out, XMP_Uns32* newLength_out ) { const InternalTagInfo* tagInfo; // Check for tags that we don't tolerate because they have data we can't (or refuse to) find. for ( XMP_Uns8 ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { for ( int i = 0; kNoGoTags[i] != 0xFFFF; ++i ) { tagInfo = this->FindTagInIFD ( ifd, kNoGoTags[i] ); if ( tagInfo != 0 ) XMP_Throw ( "Tag not tolerated for TIFF rewrite", kXMPErr_Unimplemented ); } } // Delete unwanted tags. for ( XMP_Uns8 ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { for ( int i = 0; kBanishedTags[i] != 0xFFFF; ++i ) { this->DeleteTag ( ifd, kBanishedTags[i] ); } } // Determine the offsets and additional size for the hidden offset content. Set the offset tags // to the new offset. XMP_Uns32 hiddenContentLength = 0; XMP_Uns32 hiddenContentOrigin = this->DetermineVisibleLength(); SimpleHiddenContentLocations hiddenLocations [kSimpleHiddenContentCount]; for ( int i = 0; i < kSimpleHiddenContentCount; ++i ) { const SimpleHiddenContentInfo & hiddenInfo ( kSimpleHiddenContentInfo[i] ); bool haveLength = this->GetTag_Integer ( hiddenInfo.ifd, hiddenInfo.lengthTag, &hiddenLocations[i].length ); bool haveOffset = this->GetTag_Integer ( hiddenInfo.ifd, hiddenInfo.offsetTag, &hiddenLocations[i].oldOffset ); if ( haveLength != haveOffset ) XMP_Throw ( "Unpaired simple hidden content tag", kXMPErr_BadTIFF ); if ( (! haveLength) || (hiddenLocations[i].length == 0) ) continue; hiddenLocations[i].newOffset = hiddenContentOrigin + hiddenContentLength; this->SetTag_Long ( hiddenInfo.ifd, hiddenInfo.offsetTag, hiddenLocations[i].newOffset ); hiddenContentLength += ((hiddenLocations[i].length + 1) & 0xFFFFFFFE); // ! Round up for even offsets. } // Save any old memory stream for the content behind hidden offsets. Setup a bare TIFF header. XMP_Uns8* oldStream = this->memStream; XMP_Uns8 bareTIFF [8]; if ( this->bigEndian ) { bareTIFF[0] = 0x4D; bareTIFF[1] = 0x4D; bareTIFF[2] = 0x00; bareTIFF[3] = 0x2A; } else { bareTIFF[0] = 0x49; bareTIFF[1] = 0x49; bareTIFF[2] = 0x2A; bareTIFF[3] = 0x00; } *((XMP_Uns32*)&bareTIFF[4]) = 0; this->memStream = &bareTIFF[0]; this->tiffLength = sizeof ( bareTIFF ); this->ownedStream = false; // Call UpdateMemByAppend to write the new stream, telling it to append everything. this->UpdateMemByAppend ( newStream_out, newLength_out, true, hiddenContentLength ); // Copy the hidden content and update the output stream length; XMP_Assert ( *newLength_out == hiddenContentOrigin ); *newLength_out += hiddenContentLength; for ( int i = 0; i < kSimpleHiddenContentCount; ++i ) { if ( hiddenLocations[i].length == 0 ) continue; XMP_Uns8* srcPtr = oldStream + hiddenLocations[i].oldOffset; XMP_Uns8* destPtr = *newStream_out + hiddenLocations[i].newOffset; memcpy ( destPtr, srcPtr, hiddenLocations[i].length ); // AUDIT: Safe copy, not user data, computed length. } } // TIFF_FileWriter::UpdateMemByRewrite // ================================================================================================= // TIFF_FileWriter::UpdateMemoryStream // =================================== // // Normally we update TIFF in a conservative "by-append" manner. Changes are written in-place where // they fit, anything requiring growth is appended to the end and the old space is abandoned. The // end for memory-based TIFF is the end of the data block, the end for file-based TIFF is the end of // the file. This update-by-append model has the advantage of not perturbing any hidden offsets, a // common feature of proprietary MakerNotes. // // The condenseStream parameter can be used to rewrite the full stream instead of appending. This // will discard any MakerNote tags and risks breaking offsets that are hidden. This can be necessary // though to try to make the TIFF fit in a JPEG file. XMP_Uns32 TIFF_FileWriter::UpdateMemoryStream ( void** dataPtr, bool condenseStream /* = false */ ) { if ( this->fileParsed ) XMP_Throw ( "Not memory based", kXMPErr_EnforceFailure ); if ( ! this->changed ) { if ( dataPtr != 0 ) *dataPtr = this->memStream; return this->tiffLength; } this->PreflightIFDLinkage(); bool nowEmpty = true; for ( size_t i = 0; i < kTIFF_KnownIFDCount; ++i ) { if ( ! this->containedIFDs[i].tagMap.empty() ) { nowEmpty = false; break; } } XMP_Uns8* newStream = 0; XMP_Uns32 newLength = 0; if ( nowEmpty ) { this->DeleteExistingInfo(); // Prepare for an empty reparse. } else { if ( this->tiffLength == 0 ) { // ! An empty parse does set this->memParsed. condenseStream = true; // Makes "conjured" TIFF take the full rewrite path. } if ( condenseStream ) this->changed = true; // A prior regular call would have cleared this->changed. if ( condenseStream ) { this->UpdateMemByRewrite ( &newStream, &newLength ); } else { this->UpdateMemByAppend ( &newStream, &newLength ); } } // Parse the revised stream. This is the cleanest way to rebuild the tag map. this->ParseMemoryStream ( newStream, newLength, kDoNotCopyData ); XMP_Assert ( this->tiffLength == newLength ); this->ownedStream = (newLength > 0); // ! We really do own the new stream, if not empty. if ( dataPtr != 0 ) *dataPtr = this->memStream; return newLength; } // TIFF_FileWriter::UpdateMemoryStream // ================================================================================================= // TIFF_FileWriter::UpdateFileStream // ================================= // // Updating a file stream is done in the same general manner as updating a memory stream, the intro // comments for UpdateMemoryStream largely apply. The file update happens in 3 phases: // 1. Determine which IFDs will be appended, and the new offsets for the appended IFDs and tags. // 2. Do the in-place update for the IFDs and tag values that fit. // 3. Append the IFDs and tag values that grow. // // The file being updated must match the file that was previously parsed. Offsets and lengths saved // when parsing are used to decide if something can be updated in-place or must be appended. // *** The general linked structure of TIFF makes it very difficult to process the file in a single // *** sequential pass. This implementation uses a simple seek/write model for the in-place updates. // *** In the future we might want to consider creating a map of what gets updated, allowing use of // *** a possibly more efficient buffered model. // ** Someday we might want to use the FreeOffsets and FreeByteCounts tags to track free space. // ** Probably not a huge win in practice though, and the TIFF spec says they are not recommended // ** for general interchange use. #ifndef Trace_UpdateFileStream #define Trace_UpdateFileStream 0 #endif void TIFF_FileWriter::UpdateFileStream ( LFA_FileRef fileRef ) { if ( this->memParsed ) XMP_Throw ( "Not file based", kXMPErr_EnforceFailure ); if ( ! this->changed ) return; XMP_Int64 origDataLength = LFA_Measure ( fileRef ); if ( (origDataLength >> 32) != 0 ) XMP_Throw ( "TIFF files can't exceed 4GB", kXMPErr_BadTIFF ); bool appendedIFDs[kTIFF_KnownIFDCount]; XMP_Uns32 newIFDOffsets[kTIFF_KnownIFDCount]; #if Trace_UpdateFileStream printf ( "\nStarting update of TIFF file stream\n" ); #endif XMP_Uns32 appendedOrigin = (XMP_Uns32)origDataLength; if ( (appendedOrigin & 1) != 0 ) { ++appendedOrigin; // Start at an even offset. LFA_Seek ( fileRef, 0, SEEK_END ); LFA_Write ( fileRef, "\0", 1 ); } this->PreflightIFDLinkage(); XMP_Uns32 appendedLength = DetermineAppendInfo ( appendedOrigin, appendedIFDs, newIFDOffsets ); if ( appendedLength > (0xFFFFFFFFUL - appendedOrigin) ) XMP_Throw ( "TIFF files can't exceed 4GB", kXMPErr_BadTIFF ); // Do the in-place update for the IFDs and tag values that fit. This part does separate seeks // and writes for the IFDs and values. Things to be updated can be anywhere in the file. // *** This might benefit from a map of the in-place updates. This would allow use of a possibly // *** more efficient sequential I/O model. Could even incorporate the safe update file copying. for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { InternalIFDInfo & thisIFD = this->containedIFDs[ifd]; if ( ! thisIFD.changed ) continue; // In order to get a little bit of locality, write the IFD first then the changed tags that // have large values and fit in-place. if ( ! appendedIFDs[ifd] ) { #if Trace_UpdateFileStream printf ( " Updating IFD %d in-place at offset %d (0x%X)\n", ifd, thisIFD.origIFDOffset, thisIFD.origIFDOffset ); #endif LFA_Seek ( fileRef, thisIFD.origIFDOffset, SEEK_SET ); this->WriteFileIFD ( fileRef, thisIFD ); } InternalTagMap::iterator tagPos; InternalTagMap::iterator tagEnd = thisIFD.tagMap.end(); for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) { InternalTagInfo & thisTag = tagPos->second; if ( (! thisTag.changed) || (thisTag.dataLen <= 4) || (thisTag.dataLen > thisTag.origDataLen) ) continue; #if Trace_UpdateFileStream printf ( " Updating tag %d in IFD %d in-place at offset %d (0x%X)\n", thisTag.id, ifd, thisTag.origDataOffset, thisTag.origDataOffset ); #endif LFA_Seek ( fileRef, thisTag.origDataOffset, SEEK_SET ); LFA_Write ( fileRef, thisTag.dataPtr, thisTag.dataLen ); } } // Append the IFDs and tag values that grow. XMP_Int64 fileEnd = LFA_Seek ( fileRef, 0, SEEK_END ); XMP_Assert ( fileEnd == appendedOrigin ); for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { InternalIFDInfo & thisIFD = this->containedIFDs[ifd]; if ( ! thisIFD.changed ) continue; if ( appendedIFDs[ifd] ) { #if Trace_UpdateFileStream printf ( " Updating IFD %d by append at offset %d (0x%X)\n", ifd, newIFDOffsets[ifd], newIFDOffsets[ifd] ); #endif XMP_Assert ( newIFDOffsets[ifd] == LFA_Measure(fileRef) ); this->WriteFileIFD ( fileRef, thisIFD ); } InternalTagMap::iterator tagPos; InternalTagMap::iterator tagEnd = thisIFD.tagMap.end(); for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) { InternalTagInfo & thisTag = tagPos->second; if ( (! thisTag.changed) || (thisTag.dataLen <= 4) || (thisTag.dataLen <= thisTag.origDataLen) ) continue; #if Trace_UpdateFileStream XMP_Uns32 newOffset = this->GetUns32(&thisTag.origDataOffset); printf ( " Updating tag %d in IFD %d by append at offset %d (0x%X)\n", thisTag.id, ifd, newOffset, newOffset ); #endif XMP_Assert ( this->GetUns32(&thisTag.smallValue) == LFA_Measure(fileRef) ); LFA_Write ( fileRef, thisTag.dataPtr, thisTag.dataLen ); if ( (thisTag.dataLen & 1) != 0 ) LFA_Write ( fileRef, "\0", 1 ); } } // Back-fill the offset for the primary IFD, if it is now appended. XMP_Uns32 newOffset; if ( appendedIFDs[kTIFF_PrimaryIFD] ) { this->PutUns32 ( newIFDOffsets[kTIFF_PrimaryIFD], &newOffset ); #if TraceUpdateFileStream printf ( " Back-filling offset of primary IFD, pointing to %d (0x%X)\n", newOffset, newOffset ); #endif LFA_Seek ( fileRef, 4, SEEK_SET ); LFA_Write ( fileRef, &newOffset, 4 ); } // Reset the changed flags and original length/offset values. This simulates a reparse of the // updated file. for ( int ifd = 0; ifd < kTIFF_KnownIFDCount; ++ifd ) { InternalIFDInfo & thisIFD = this->containedIFDs[ifd]; if ( ! thisIFD.changed ) continue; thisIFD.changed = false; thisIFD.origCount = (XMP_Uns16)( thisIFD.tagMap.size() ); thisIFD.origIFDOffset = newIFDOffsets[ifd]; InternalTagMap::iterator tagPos; InternalTagMap::iterator tagEnd = thisIFD.tagMap.end(); for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) { InternalTagInfo & thisTag = tagPos->second; if ( ! thisTag.changed ) continue; thisTag.changed = false; thisTag.origDataLen = thisTag.dataLen; if ( thisTag.origDataLen > 4 ) thisTag.origDataOffset = this->GetUns32 ( &thisTag.smallValue ); } } this->tiffLength = (XMP_Uns32) LFA_Measure ( fileRef ); LFA_Seek ( fileRef, 0, SEEK_END ); // Can't hurt. #if Trace_UpdateFileStream printf ( "\nFinished update of TIFF file stream\n" ); #endif } // TIFF_FileWriter::UpdateFileStream // ================================================================================================= // TIFF_FileWriter::WriteFileIFD // ============================= void TIFF_FileWriter::WriteFileIFD ( LFA_FileRef fileRef, InternalIFDInfo & thisIFD ) { XMP_Uns16 tagCount; this->PutUns16 ( (XMP_Uns16)thisIFD.tagMap.size(), &tagCount ); LFA_Write ( fileRef, &tagCount, 2 ); InternalTagMap::iterator tagPos; InternalTagMap::iterator tagEnd = thisIFD.tagMap.end(); for ( tagPos = thisIFD.tagMap.begin(); tagPos != tagEnd; ++tagPos ) { InternalTagInfo & thisTag = tagPos->second; RawIFDEntry ifdEntry; this->PutUns16 ( thisTag.id, &ifdEntry.id ); this->PutUns16 ( thisTag.type, &ifdEntry.type ); this->PutUns32 ( thisTag.count, &ifdEntry.count ); ifdEntry.dataOrOffset = thisTag.smallValue; // ! Already in stream endianness. LFA_Write ( fileRef, &ifdEntry, sizeof(ifdEntry) ); XMP_Assert ( sizeof(ifdEntry) == 12 ); } XMP_Uns32 nextIFD; this->PutUns32 ( thisIFD.origNextIFD, &nextIFD ); LFA_Write ( fileRef, &nextIFD, 4 ); } // TIFF_FileWriter::WriteFileIFD exempi-2.2.1/source/XMPFiles/FormatSupport/ReconcileTIFF.cpp0000664000175000017500000034011512150230673020565 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "Reconcile_Impl.hpp" #include "UnicodeConversions.hpp" #include #if XMP_WinBuild #define snprintf _snprintf #endif #if XMP_WinBuild #pragma warning ( disable : 4146 ) // unary minus operator applied to unsigned type #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif // ================================================================================================= /// \file ReconcileTIFF.cpp /// \brief Utilities to reconcile between XMP and legacy TIFF/Exif metadata. /// // ================================================================================================= // ================================================================================================= // ================================================================================================= // Tables of the TIFF/Exif tags that are mapped into XMP. For the most part, the tags have obvious // mappings based on their IFD, tag number, type and count. These tables do not list tags that are // mapped as subsidiary parts of others, e.g. TIFF SubSecTime or GPS Info GPSDateStamp. Tags that // have special mappings are marked by having an empty string for the XMP property name. // ! These tables have the tags listed in the order of tables 3, 4, 5, and 12 of Exif 2.2, with the // ! exception of ImageUniqueID (which is listed at the end of the Exif mappings). This order is // ! very important to consistent checking of the legacy status. The NativeDigest properties list // ! all possible mapped tags in this order. The NativeDigest strings are compared as a whole, so // ! the same tags listed in a different order would compare as different. // ! The sentinel tag value can't be 0, that is a valid GPS Info tag, 0xFFFF is unused so far. enum { kExport_Never = 0, // Never export. kExport_Always = 1, // Add, modify, or delete. kExport_NoDelete = 2, // Add or modify, do not delete if no XMP. kExport_InjectOnly = 3 // Add tag if new, never modify or delete existing values. }; struct TIFF_MappingToXMP { XMP_Uns16 id; XMP_Uns16 type; XMP_Uns32 count; // Zero means any. XMP_Uns8 exportMode; const char * name; // The name of the mapped XMP property. The namespace is implicit. }; enum { kAnyCount = 0 }; static const TIFF_MappingToXMP sPrimaryIFDMappings[] = { // A blank name indicates a special mapping. { /* 256 */ kTIFF_ImageWidth, kTIFF_ShortOrLongType, 1, kExport_Never, "ImageWidth" }, { /* 257 */ kTIFF_ImageLength, kTIFF_ShortOrLongType, 1, kExport_Never, "ImageLength" }, { /* 258 */ kTIFF_BitsPerSample, kTIFF_ShortType, 3, kExport_Never, "BitsPerSample" }, { /* 259 */ kTIFF_Compression, kTIFF_ShortType, 1, kExport_Never, "Compression" }, { /* 262 */ kTIFF_PhotometricInterpretation, kTIFF_ShortType, 1, kExport_Never, "PhotometricInterpretation" }, { /* 274 */ kTIFF_Orientation, kTIFF_ShortType, 1, kExport_NoDelete, "Orientation" }, { /* 277 */ kTIFF_SamplesPerPixel, kTIFF_ShortType, 1, kExport_Never, "SamplesPerPixel" }, { /* 284 */ kTIFF_PlanarConfiguration, kTIFF_ShortType, 1, kExport_Never, "PlanarConfiguration" }, { /* 530 */ kTIFF_YCbCrSubSampling, kTIFF_ShortType, 2, kExport_Never, "YCbCrSubSampling" }, { /* 531 */ kTIFF_YCbCrPositioning, kTIFF_ShortType, 1, kExport_Never, "YCbCrPositioning" }, { /* 282 */ kTIFF_XResolution, kTIFF_RationalType, 1, kExport_NoDelete, "XResolution" }, { /* 283 */ kTIFF_YResolution, kTIFF_RationalType, 1, kExport_NoDelete, "YResolution" }, { /* 296 */ kTIFF_ResolutionUnit, kTIFF_ShortType, 1, kExport_NoDelete, "ResolutionUnit" }, { /* 301 */ kTIFF_TransferFunction, kTIFF_ShortType, 3*256, kExport_Never, "TransferFunction" }, { /* 318 */ kTIFF_WhitePoint, kTIFF_RationalType, 2, kExport_Never, "WhitePoint" }, { /* 319 */ kTIFF_PrimaryChromaticities, kTIFF_RationalType, 6, kExport_Never, "PrimaryChromaticities" }, { /* 529 */ kTIFF_YCbCrCoefficients, kTIFF_RationalType, 3, kExport_Never, "YCbCrCoefficients" }, { /* 532 */ kTIFF_ReferenceBlackWhite, kTIFF_RationalType, 6, kExport_Never, "ReferenceBlackWhite" }, { /* 306 */ kTIFF_DateTime, kTIFF_ASCIIType, 20, kExport_Always, "" }, // ! Has a special mapping. { /* 270 */ kTIFF_ImageDescription, kTIFF_ASCIIType, kAnyCount, kExport_Always, "" }, // ! Has a special mapping. { /* 271 */ kTIFF_Make, kTIFF_ASCIIType, kAnyCount, kExport_InjectOnly, "Make" }, { /* 272 */ kTIFF_Model, kTIFF_ASCIIType, kAnyCount, kExport_InjectOnly, "Model" }, { /* 305 */ kTIFF_Software, kTIFF_ASCIIType, kAnyCount, kExport_Always, "Software" }, // Has alias to xmp:CreatorTool. { /* 315 */ kTIFF_Artist, kTIFF_ASCIIType, kAnyCount, kExport_Always, "" }, // ! Has a special mapping. { /* 33432 */ kTIFF_Copyright, kTIFF_ASCIIType, kAnyCount, kExport_Always, "" }, // ! Has a special mapping. { 0xFFFF, 0, 0, 0 } // ! Must end with sentinel. }; // ! A special need, easier than looking up the entry in sExifIFDMappings: static const TIFF_MappingToXMP kISOSpeedMapping = { kTIFF_ISOSpeedRatings, kTIFF_ShortType, kAnyCount, kExport_InjectOnly, "ISOSpeedRatings" }; static const TIFF_MappingToXMP sExifIFDMappings[] = { { /* 36864 */ kTIFF_ExifVersion, kTIFF_UndefinedType, 4, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 40960 */ kTIFF_FlashpixVersion, kTIFF_UndefinedType, 4, kExport_Never, "" }, // ! Has a special mapping. { /* 40961 */ kTIFF_ColorSpace, kTIFF_ShortType, 1, kExport_InjectOnly, "ColorSpace" }, { /* 37121 */ kTIFF_ComponentsConfiguration, kTIFF_UndefinedType, 4, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 37122 */ kTIFF_CompressedBitsPerPixel, kTIFF_RationalType, 1, kExport_InjectOnly, "CompressedBitsPerPixel" }, { /* 40962 */ kTIFF_PixelXDimension, kTIFF_ShortOrLongType, 1, kExport_InjectOnly, "PixelXDimension" }, { /* 40963 */ kTIFF_PixelYDimension, kTIFF_ShortOrLongType, 1, kExport_InjectOnly, "PixelYDimension" }, { /* 37510 */ kTIFF_UserComment, kTIFF_UndefinedType, kAnyCount, kExport_Always, "" }, // ! Has a special mapping. { /* 40964 */ kTIFF_RelatedSoundFile, kTIFF_ASCIIType, kAnyCount, kExport_Always, "RelatedSoundFile" }, // ! Exif spec says count of 13. { /* 36867 */ kTIFF_DateTimeOriginal, kTIFF_ASCIIType, 20, kExport_Always, "" }, // ! Has a special mapping. { /* 36868 */ kTIFF_DateTimeDigitized, kTIFF_ASCIIType, 20, kExport_Always, "" }, // ! Has a special mapping. { /* 33434 */ kTIFF_ExposureTime, kTIFF_RationalType, 1, kExport_InjectOnly, "ExposureTime" }, { /* 33437 */ kTIFF_FNumber, kTIFF_RationalType, 1, kExport_InjectOnly, "FNumber" }, { /* 34850 */ kTIFF_ExposureProgram, kTIFF_ShortType, 1, kExport_InjectOnly, "ExposureProgram" }, { /* 34852 */ kTIFF_SpectralSensitivity, kTIFF_ASCIIType, kAnyCount, kExport_InjectOnly, "SpectralSensitivity" }, { /* 34855 */ kTIFF_ISOSpeedRatings, kTIFF_ShortType, kAnyCount, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 34856 */ kTIFF_OECF, kTIFF_UndefinedType, kAnyCount, kExport_Never, "" }, // ! Has a special mapping. { /* 37377 */ kTIFF_ShutterSpeedValue, kTIFF_SRationalType, 1, kExport_InjectOnly, "ShutterSpeedValue" }, { /* 37378 */ kTIFF_ApertureValue, kTIFF_RationalType, 1, kExport_InjectOnly, "ApertureValue" }, { /* 37379 */ kTIFF_BrightnessValue, kTIFF_SRationalType, 1, kExport_InjectOnly, "BrightnessValue" }, { /* 37380 */ kTIFF_ExposureBiasValue, kTIFF_SRationalType, 1, kExport_InjectOnly, "ExposureBiasValue" }, { /* 37381 */ kTIFF_MaxApertureValue, kTIFF_RationalType, 1, kExport_InjectOnly, "MaxApertureValue" }, { /* 37382 */ kTIFF_SubjectDistance, kTIFF_RationalType, 1, kExport_InjectOnly, "SubjectDistance" }, { /* 37383 */ kTIFF_MeteringMode, kTIFF_ShortType, 1, kExport_InjectOnly, "MeteringMode" }, { /* 37384 */ kTIFF_LightSource, kTIFF_ShortType, 1, kExport_InjectOnly, "LightSource" }, { /* 37385 */ kTIFF_Flash, kTIFF_ShortType, 1, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 37386 */ kTIFF_FocalLength, kTIFF_RationalType, 1, kExport_InjectOnly, "FocalLength" }, { /* 37396 */ kTIFF_SubjectArea, kTIFF_ShortType, kAnyCount, kExport_Never, "SubjectArea" }, // ! Actually 2..4. { /* 41483 */ kTIFF_FlashEnergy, kTIFF_RationalType, 1, kExport_InjectOnly, "FlashEnergy" }, { /* 41484 */ kTIFF_SpatialFrequencyResponse, kTIFF_UndefinedType, kAnyCount, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 41486 */ kTIFF_FocalPlaneXResolution, kTIFF_RationalType, 1, kExport_InjectOnly, "FocalPlaneXResolution" }, { /* 41487 */ kTIFF_FocalPlaneYResolution, kTIFF_RationalType, 1, kExport_InjectOnly, "FocalPlaneYResolution" }, { /* 41488 */ kTIFF_FocalPlaneResolutionUnit, kTIFF_ShortType, 1, kExport_InjectOnly, "FocalPlaneResolutionUnit" }, { /* 41492 */ kTIFF_SubjectLocation, kTIFF_ShortType, 2, kExport_Never, "SubjectLocation" }, { /* 41493 */ kTIFF_ExposureIndex, kTIFF_RationalType, 1, kExport_InjectOnly, "ExposureIndex" }, { /* 41495 */ kTIFF_SensingMethod, kTIFF_ShortType, 1, kExport_InjectOnly, "SensingMethod" }, { /* 41728 */ kTIFF_FileSource, kTIFF_UndefinedType, 1, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 41729 */ kTIFF_SceneType, kTIFF_UndefinedType, 1, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 41730 */ kTIFF_CFAPattern, kTIFF_UndefinedType, kAnyCount, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 41985 */ kTIFF_CustomRendered, kTIFF_ShortType, 1, kExport_Never, "CustomRendered" }, { /* 41986 */ kTIFF_ExposureMode, kTIFF_ShortType, 1, kExport_InjectOnly, "ExposureMode" }, { /* 41987 */ kTIFF_WhiteBalance, kTIFF_ShortType, 1, kExport_InjectOnly, "WhiteBalance" }, { /* 41988 */ kTIFF_DigitalZoomRatio, kTIFF_RationalType, 1, kExport_InjectOnly, "DigitalZoomRatio" }, { /* 41989 */ kTIFF_FocalLengthIn35mmFilm, kTIFF_ShortType, 1, kExport_InjectOnly, "FocalLengthIn35mmFilm" }, { /* 41990 */ kTIFF_SceneCaptureType, kTIFF_ShortType, 1, kExport_InjectOnly, "SceneCaptureType" }, { /* 41991 */ kTIFF_GainControl, kTIFF_ShortType, 1, kExport_InjectOnly, "GainControl" }, { /* 41992 */ kTIFF_Contrast, kTIFF_ShortType, 1, kExport_InjectOnly, "Contrast" }, { /* 41993 */ kTIFF_Saturation, kTIFF_ShortType, 1, kExport_InjectOnly, "Saturation" }, { /* 41994 */ kTIFF_Sharpness, kTIFF_ShortType, 1, kExport_InjectOnly, "Sharpness" }, { /* 41995 */ kTIFF_DeviceSettingDescription, kTIFF_UndefinedType, kAnyCount, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 41996 */ kTIFF_SubjectDistanceRange, kTIFF_ShortType, 1, kExport_InjectOnly, "SubjectDistanceRange" }, { /* 42016 */ kTIFF_ImageUniqueID, kTIFF_ASCIIType, 33, kExport_InjectOnly, "ImageUniqueID" }, { 0xFFFF, 0, 0, 0 } // ! Must end with sentinel. }; static const TIFF_MappingToXMP sGPSInfoIFDMappings[] = { { /* 0 */ kTIFF_GPSVersionID, kTIFF_ByteType, 4, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 2 */ kTIFF_GPSLatitude, kTIFF_RationalType, 3, kExport_Always, "" }, // ! Has a special mapping. { /* 4 */ kTIFF_GPSLongitude, kTIFF_RationalType, 3, kExport_Always, "" }, // ! Has a special mapping. { /* 5 */ kTIFF_GPSAltitudeRef, kTIFF_ByteType, 1, kExport_Always, "GPSAltitudeRef" }, { /* 6 */ kTIFF_GPSAltitude, kTIFF_RationalType, 1, kExport_Always, "GPSAltitude" }, { /* 7 */ kTIFF_GPSTimeStamp, kTIFF_RationalType, 3, kExport_Always, "" }, // ! Has a special mapping. { /* 8 */ kTIFF_GPSSatellites, kTIFF_ASCIIType, kAnyCount, kExport_InjectOnly, "GPSSatellites" }, { /* 9 */ kTIFF_GPSStatus, kTIFF_ASCIIType, 2, kExport_InjectOnly, "GPSStatus" }, { /* 10 */ kTIFF_GPSMeasureMode, kTIFF_ASCIIType, 2, kExport_InjectOnly, "GPSMeasureMode" }, { /* 11 */ kTIFF_GPSDOP, kTIFF_RationalType, 1, kExport_InjectOnly, "GPSDOP" }, { /* 12 */ kTIFF_GPSSpeedRef, kTIFF_ASCIIType, 2, kExport_InjectOnly, "GPSSpeedRef" }, { /* 13 */ kTIFF_GPSSpeed, kTIFF_RationalType, 1, kExport_InjectOnly, "GPSSpeed" }, { /* 14 */ kTIFF_GPSTrackRef, kTIFF_ASCIIType, 2, kExport_InjectOnly, "GPSTrackRef" }, { /* 15 */ kTIFF_GPSTrack, kTIFF_RationalType, 1, kExport_InjectOnly, "GPSTrack" }, { /* 16 */ kTIFF_GPSImgDirectionRef, kTIFF_ASCIIType, 2, kExport_InjectOnly, "GPSImgDirectionRef" }, { /* 17 */ kTIFF_GPSImgDirection, kTIFF_RationalType, 1, kExport_InjectOnly, "GPSImgDirection" }, { /* 18 */ kTIFF_GPSMapDatum, kTIFF_ASCIIType, kAnyCount, kExport_InjectOnly, "GPSMapDatum" }, { /* 20 */ kTIFF_GPSDestLatitude, kTIFF_RationalType, 3, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 22 */ kTIFF_GPSDestLongitude, kTIFF_RationalType, 3, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 23 */ kTIFF_GPSDestBearingRef, kTIFF_ASCIIType, 2, kExport_InjectOnly, "GPSDestBearingRef" }, { /* 24 */ kTIFF_GPSDestBearing, kTIFF_RationalType, 1, kExport_InjectOnly, "GPSDestBearing" }, { /* 25 */ kTIFF_GPSDestDistanceRef, kTIFF_ASCIIType, 2, kExport_InjectOnly, "GPSDestDistanceRef" }, { /* 26 */ kTIFF_GPSDestDistance, kTIFF_RationalType, 1, kExport_InjectOnly, "GPSDestDistance" }, { /* 27 */ kTIFF_GPSProcessingMethod, kTIFF_UndefinedType, kAnyCount, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 28 */ kTIFF_GPSAreaInformation, kTIFF_UndefinedType, kAnyCount, kExport_InjectOnly, "" }, // ! Has a special mapping. { /* 30 */ kTIFF_GPSDifferential, kTIFF_ShortType, 1, kExport_InjectOnly, "GPSDifferential" }, { 0xFFFF, 0, 0, 0 } // ! Must end with sentinel. }; // ================================================================================================= static void // ! Needed by Import2WayExif ExportTIFF_Date ( const SXMPMeta & xmp, const char * xmpNS, const char * xmpProp, TIFF_Manager * tiff, XMP_Uns16 mainID ); // ================================================================================================= static XMP_Uns32 GatherInt ( const char * strPtr, size_t count ) { XMP_Uns32 value = 0; const char * strEnd = strPtr + count; while ( strPtr < strEnd ) { char ch = *strPtr; if ( (ch < '0') || (ch > '9') ) break; value = value*10 + (ch - '0'); ++strPtr; } return value; } // GatherInt // ================================================================================================= static void TrimTrailingSpaces ( TIFF_Manager::TagInfo * info ) { if ( info->dataLen == 0 ) return; XMP_Assert ( info->dataPtr != 0 ); char * firstChar = (char*)info->dataPtr; char * lastChar = firstChar + info->dataLen - 1; if ( (*lastChar != ' ') && (*lastChar != 0) ) return; // Nothing to do. while ( (firstChar <= lastChar) && ((*lastChar == ' ') || (*lastChar == 0)) ) --lastChar; XMP_Assert ( (lastChar == firstChar-1) || ((lastChar >= firstChar) && (*lastChar != ' ') && (*lastChar != 0)) ); ++lastChar; XMP_Uns32 newLen = (XMP_Uns32)(lastChar - firstChar) + 1; XMP_Assert ( newLen <= info->dataLen ); *lastChar = 0; info->dataLen = newLen; } // TrimTrailingSpaces // ================================================================================================= bool PhotoDataUtils::GetNativeInfo ( const TIFF_Manager & exif, XMP_Uns8 ifd, XMP_Uns16 id, TIFF_Manager::TagInfo * info ) { bool haveExif = exif.GetTag ( ifd, id, info ); if ( haveExif ) { XMP_Uns32 i; char * chPtr; XMP_Assert ( (info->dataPtr != 0) || (info->dataLen == 0) ); // Null pointer requires zero length. bool isDate = ((id == kTIFF_DateTime) || (id == kTIFF_DateTimeOriginal) || (id == kTIFF_DateTimeOriginal)); for ( i = 0, chPtr = (char*)info->dataPtr; i < info->dataLen; ++i, ++chPtr ) { if ( isDate && (*chPtr == ':') ) continue; // Ignore colons, empty dates have spaces and colons. if ( (*chPtr != ' ') && (*chPtr != 0) ) break; // Break if the Exif value is non-empty. } if ( i == info->dataLen ) { haveExif = false; // Ignore empty Exif. } else { TrimTrailingSpaces ( info ); if ( info->dataLen == 0 ) haveExif = false; } } return haveExif; } // PhotoDataUtils::GetNativeInfo // ================================================================================================= size_t PhotoDataUtils::GetNativeInfo ( const IPTC_Manager & iptc, XMP_Uns8 id, int digestState, bool haveXMP, IPTC_Manager::DataSetInfo * info ) { size_t iptcCount = 0; if ( (digestState == kDigestDiffers) || ((digestState == kDigestMissing) && (! haveXMP)) ) { iptcCount = iptc.GetDataSet ( id, info ); } if ( ignoreLocalText && (iptcCount > 0) && (! iptc.UsingUTF8()) ) { // Check to see if the new value(s) should be ignored. size_t i; IPTC_Manager::DataSetInfo tmpInfo; for ( i = 0; i < iptcCount; ++i ) { (void) iptc.GetDataSet ( id, &tmpInfo, i ); if ( ReconcileUtils::IsASCII ( tmpInfo.dataPtr, tmpInfo.dataLen ) ) break; } if ( i == iptcCount ) iptcCount = 0; // Return 0 if value(s) should be ignored. } return iptcCount; } // PhotoDataUtils::GetNativeInfo // ================================================================================================= bool PhotoDataUtils::IsValueDifferent ( const TIFF_Manager::TagInfo & exifInfo, const std::string & xmpValue, std::string * exifValue ) { if ( exifInfo.dataLen == 0 ) return false; // Ignore empty Exif values. if ( ReconcileUtils::IsUTF8 ( exifInfo.dataPtr, exifInfo.dataLen ) ) { // ! Note that ASCII is UTF-8. exifValue->assign ( (char*)exifInfo.dataPtr, exifInfo.dataLen ); } else { if ( ignoreLocalText ) return false; ReconcileUtils::LocalToUTF8 ( exifInfo.dataPtr, exifInfo.dataLen, exifValue ); } return (*exifValue != xmpValue); } // PhotoDataUtils::IsValueDifferent // ================================================================================================= bool PhotoDataUtils::IsValueDifferent ( const IPTC_Manager & newIPTC, const IPTC_Manager & oldIPTC, XMP_Uns8 id ) { IPTC_Manager::DataSetInfo newInfo; size_t newCount = newIPTC.GetDataSet ( id, &newInfo ); if ( newCount == 0 ) return false; // Ignore missing new IPTC values. IPTC_Manager::DataSetInfo oldInfo; size_t oldCount = oldIPTC.GetDataSet ( id, &oldInfo ); if ( oldCount == 0 ) return true; // Missing old IPTC values differ. if ( newCount != oldCount ) return true; std::string oldStr, newStr; for ( newCount = 0; newCount < oldCount; ++newCount ) { if ( ignoreLocalText & (! newIPTC.UsingUTF8()) ) { // Check to see if the new value should be ignored. (void) newIPTC.GetDataSet ( id, &newInfo, newCount ); if ( ! ReconcileUtils::IsASCII ( newInfo.dataPtr, newInfo.dataLen ) ) continue; } (void) newIPTC.GetDataSet_UTF8 ( id, &newStr, newCount ); (void) oldIPTC.GetDataSet_UTF8 ( id, &oldStr, newCount ); if ( newStr.size() == 0 ) continue; // Ignore empty new IPTC. if ( newStr != oldStr ) break; } return ( newCount != oldCount ); // Not different if all values matched. } // PhotoDataUtils::IsValueDifferent // ================================================================================================= // ================================================================================================= // ================================================================================================= // ImportSingleTIFF_Short // ====================== static void ImportSingleTIFF_Short ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Uns16 binValue = *((XMP_Uns16*)tagInfo.dataPtr); if ( ! nativeEndian ) binValue = Flip2 ( binValue ); char strValue[20]; snprintf ( strValue, sizeof(strValue), "%hu", binValue ); // AUDIT: Using sizeof(strValue) is safe. xmp->SetProperty ( xmpNS, xmpProp, strValue ); } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportSingleTIFF_Short // ================================================================================================= // ImportSingleTIFF_Long // ===================== static void ImportSingleTIFF_Long ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Uns32 binValue = *((XMP_Uns32*)tagInfo.dataPtr); if ( ! nativeEndian ) binValue = Flip4 ( binValue ); char strValue[20]; snprintf ( strValue, sizeof(strValue), "%lu", (unsigned long)binValue ); // AUDIT: Using sizeof(strValue) is safe. xmp->SetProperty ( xmpNS, xmpProp, strValue ); } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportSingleTIFF_Long // ================================================================================================= // ImportSingleTIFF_Rational // ========================= static void ImportSingleTIFF_Rational ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Uns32 * binPtr = (XMP_Uns32*)tagInfo.dataPtr; XMP_Uns32 binNum = binPtr[0]; XMP_Uns32 binDenom = binPtr[1]; if ( ! nativeEndian ) { binNum = Flip4 ( binNum ); binDenom = Flip4 ( binDenom ); } char strValue[40]; snprintf ( strValue, sizeof(strValue), "%lu/%lu", (unsigned long)binNum, (unsigned long)binDenom ); // AUDIT: Using sizeof(strValue) is safe. xmp->SetProperty ( xmpNS, xmpProp, strValue ); } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportSingleTIFF_Rational // ================================================================================================= // ImportSingleTIFF_SRational // ========================== static void ImportSingleTIFF_SRational ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Int32 * binPtr = (XMP_Int32*)tagInfo.dataPtr; XMP_Int32 binNum = binPtr[0]; XMP_Int32 binDenom = binPtr[1]; if ( ! nativeEndian ) { Flip4 ( &binNum ); Flip4 ( &binDenom ); } char strValue[40]; snprintf ( strValue, sizeof(strValue), "%ld/%ld", (unsigned long)binNum, (unsigned long)binDenom ); // AUDIT: Using sizeof(strValue) is safe. xmp->SetProperty ( xmpNS, xmpProp, strValue ); } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportSingleTIFF_SRational // ================================================================================================= // ImportSingleTIFF_ASCII // ====================== static void ImportSingleTIFF_ASCII ( const TIFF_Manager::TagInfo & tagInfo, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. TrimTrailingSpaces ( (TIFF_Manager::TagInfo*) &tagInfo ); if ( tagInfo.dataLen == 0 ) return; // Ignore empty tags. const char * chPtr = (const char *)tagInfo.dataPtr; const bool hasNul = !tagInfo.dataLen || !chPtr || (chPtr[tagInfo.dataLen-1] == 0); const bool isUTF8 = ReconcileUtils::IsUTF8 ( chPtr, tagInfo.dataLen ); if ( isUTF8 && hasNul ) { xmp->SetProperty ( xmpNS, xmpProp, chPtr ); } else { std::string strValue; if ( isUTF8 ) { strValue.assign ( chPtr, tagInfo.dataLen ); } else { if ( ignoreLocalText ) return; ReconcileUtils::LocalToUTF8 ( chPtr, tagInfo.dataLen, &strValue ); } xmp->SetProperty ( xmpNS, xmpProp, strValue.c_str() ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportSingleTIFF_ASCII // ================================================================================================= // ImportSingleTIFF_Byte // ===================== static void ImportSingleTIFF_Byte ( const TIFF_Manager::TagInfo & tagInfo, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Uns8 binValue = *((XMP_Uns8*)tagInfo.dataPtr); char strValue[20]; snprintf ( strValue, sizeof(strValue), "%hu", binValue ); // AUDIT: Using sizeof(strValue) is safe. xmp->SetProperty ( xmpNS, xmpProp, strValue ); } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportSingleTIFF_Byte // ================================================================================================= // ImportSingleTIFF_SByte // ====================== static void ImportSingleTIFF_SByte ( const TIFF_Manager::TagInfo & tagInfo, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Int8 binValue = *((XMP_Int8*)tagInfo.dataPtr); char strValue[20]; snprintf ( strValue, sizeof(strValue), "%hd", binValue ); // AUDIT: Using sizeof(strValue) is safe. xmp->SetProperty ( xmpNS, xmpProp, strValue ); } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportSingleTIFF_SByte // ================================================================================================= // ImportSingleTIFF_SShort // ======================= static void ImportSingleTIFF_SShort ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Int16 binValue = *((XMP_Int16*)tagInfo.dataPtr); if ( ! nativeEndian ) Flip2 ( &binValue ); char strValue[20]; snprintf ( strValue, sizeof(strValue), "%hd", binValue ); // AUDIT: Using sizeof(strValue) is safe. xmp->SetProperty ( xmpNS, xmpProp, strValue ); } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportSingleTIFF_SShort // ================================================================================================= // ImportSingleTIFF_SLong // ====================== static void ImportSingleTIFF_SLong ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Int32 binValue = *((XMP_Int32*)tagInfo.dataPtr); if ( ! nativeEndian ) Flip4 ( &binValue ); char strValue[20]; snprintf ( strValue, sizeof(strValue), "%ld", (long)binValue ); // AUDIT: Using sizeof(strValue) is safe. xmp->SetProperty ( xmpNS, xmpProp, strValue ); } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportSingleTIFF_SLong // ================================================================================================= // ImportSingleTIFF_Float // ====================== static void ImportSingleTIFF_Float ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. float binValue = *((float*)tagInfo.dataPtr); if ( ! nativeEndian ) Flip4 ( &binValue ); xmp->SetProperty_Float ( xmpNS, xmpProp, binValue ); } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportSingleTIFF_Float // ================================================================================================= // ImportSingleTIFF_Double // ======================= static void ImportSingleTIFF_Double ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. double binValue = *((double*)tagInfo.dataPtr); if ( ! nativeEndian ) Flip8 ( &binValue ); xmp->SetProperty_Float ( xmpNS, xmpProp, binValue ); // ! Yes, SetProperty_Float. } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportSingleTIFF_Double // ================================================================================================= // ImportSingleTIFF // ================ static void ImportSingleTIFF ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { // We've got a tag to map to XMP, decide how based on actual type and the expected count. Using // the actual type eliminates a ShortOrLong case. Using the expected count is needed to know // whether to create an XMP array. The actual count for an array could be 1. Put the most // common cases first for better iCache utilization. switch ( tagInfo.type ) { case kTIFF_ShortType : ImportSingleTIFF_Short ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_LongType : ImportSingleTIFF_Long ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_RationalType : ImportSingleTIFF_Rational ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_SRationalType : ImportSingleTIFF_SRational ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_ASCIIType : ImportSingleTIFF_ASCII ( tagInfo, xmp, xmpNS, xmpProp ); break; case kTIFF_ByteType : ImportSingleTIFF_Byte ( tagInfo, xmp, xmpNS, xmpProp ); break; case kTIFF_SByteType : ImportSingleTIFF_SByte ( tagInfo, xmp, xmpNS, xmpProp ); break; case kTIFF_SShortType : ImportSingleTIFF_SShort ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_SLongType : ImportSingleTIFF_SLong ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_FloatType : ImportSingleTIFF_Float ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_DoubleType : ImportSingleTIFF_Double ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; } } // ImportSingleTIFF // ================================================================================================= // ================================================================================================= // ================================================================================================= // ImportArrayTIFF_Short // ===================== static void ImportArrayTIFF_Short ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Uns16 * binPtr = (XMP_Uns16*)tagInfo.dataPtr; xmp->DeleteProperty ( xmpNS, xmpProp ); // ! Don't keep appending, create a new array. for ( size_t i = 0; i < tagInfo.count; ++i, ++binPtr ) { XMP_Uns16 binValue = *binPtr; if ( ! nativeEndian ) binValue = Flip2 ( binValue ); char strValue[20]; snprintf ( strValue, sizeof(strValue), "%hu", binValue ); // AUDIT: Using sizeof(strValue) is safe. xmp->AppendArrayItem ( xmpNS, xmpProp, kXMP_PropArrayIsOrdered, strValue ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportArrayTIFF_Short // ================================================================================================= // ImportArrayTIFF_Long // ==================== static void ImportArrayTIFF_Long ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Uns32 * binPtr = (XMP_Uns32*)tagInfo.dataPtr; xmp->DeleteProperty ( xmpNS, xmpProp ); // ! Don't keep appending, create a new array. for ( size_t i = 0; i < tagInfo.count; ++i, ++binPtr ) { XMP_Uns32 binValue = *binPtr; if ( ! nativeEndian ) binValue = Flip4 ( binValue ); char strValue[20]; snprintf ( strValue, sizeof(strValue), "%lu", (unsigned long)binValue ); // AUDIT: Using sizeof(strValue) is safe. xmp->AppendArrayItem ( xmpNS, xmpProp, kXMP_PropArrayIsOrdered, strValue ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportArrayTIFF_Long // ================================================================================================= // ImportArrayTIFF_Rational // ======================== static void ImportArrayTIFF_Rational ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Uns32 * binPtr = (XMP_Uns32*)tagInfo.dataPtr; xmp->DeleteProperty ( xmpNS, xmpProp ); // ! Don't keep appending, create a new array. for ( size_t i = 0; i < tagInfo.count; ++i, binPtr += 2 ) { XMP_Uns32 binNum = binPtr[0]; XMP_Uns32 binDenom = binPtr[1]; if ( ! nativeEndian ) { binNum = Flip4 ( binNum ); binDenom = Flip4 ( binDenom ); } char strValue[40]; snprintf ( strValue, sizeof(strValue), "%lu/%lu", (unsigned long)binNum, (unsigned long)binDenom ); // AUDIT: Using sizeof(strValue) is safe. xmp->AppendArrayItem ( xmpNS, xmpProp, kXMP_PropArrayIsOrdered, strValue ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportArrayTIFF_Rational // ================================================================================================= // ImportArrayTIFF_SRational // ========================= static void ImportArrayTIFF_SRational ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Int32 * binPtr = (XMP_Int32*)tagInfo.dataPtr; xmp->DeleteProperty ( xmpNS, xmpProp ); // ! Don't keep appending, create a new array. for ( size_t i = 0; i < tagInfo.count; ++i, binPtr += 2 ) { XMP_Int32 binNum = binPtr[0]; XMP_Int32 binDenom = binPtr[1]; if ( ! nativeEndian ) { Flip4 ( &binNum ); Flip4 ( &binDenom ); } char strValue[40]; snprintf ( strValue, sizeof(strValue), "%ld/%ld", (long)binNum, (long)binDenom ); // AUDIT: Using sizeof(strValue) is safe. xmp->AppendArrayItem ( xmpNS, xmpProp, kXMP_PropArrayIsOrdered, strValue ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportArrayTIFF_SRational // ================================================================================================= // ImportArrayTIFF_ASCII // ===================== static void ImportArrayTIFF_ASCII ( const TIFF_Manager::TagInfo & tagInfo, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. TrimTrailingSpaces ( (TIFF_Manager::TagInfo*) &tagInfo ); if ( tagInfo.dataLen == 0 ) return; // Ignore empty tags. const char * chPtr = (const char *)tagInfo.dataPtr; const char * chEnd = chPtr + tagInfo.dataLen; const bool hasNul = (chPtr[tagInfo.dataLen-1] == 0); const bool isUTF8 = ReconcileUtils::IsUTF8 ( chPtr, tagInfo.dataLen ); std::string strValue; if ( (! isUTF8) || (! hasNul) ) { if ( isUTF8 ) { strValue.assign ( chPtr, tagInfo.dataLen ); } else { if ( ignoreLocalText ) return; ReconcileUtils::LocalToUTF8 ( chPtr, tagInfo.dataLen, &strValue ); } chPtr = strValue.c_str(); chEnd = chPtr + strValue.size(); } xmp->DeleteProperty ( xmpNS, xmpProp ); // ! Don't keep appending, create a new array. for ( ; chPtr < chEnd; chPtr += (strlen(chPtr) + 1) ) { xmp->AppendArrayItem ( xmpNS, xmpProp, kXMP_PropArrayIsOrdered, chPtr ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportArrayTIFF_ASCII // ================================================================================================= // ImportArrayTIFF_Byte // ==================== static void ImportArrayTIFF_Byte ( const TIFF_Manager::TagInfo & tagInfo, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Uns8 * binPtr = (XMP_Uns8*)tagInfo.dataPtr; xmp->DeleteProperty ( xmpNS, xmpProp ); // ! Don't keep appending, create a new array. for ( size_t i = 0; i < tagInfo.count; ++i, ++binPtr ) { XMP_Uns8 binValue = *binPtr; char strValue[20]; snprintf ( strValue, sizeof(strValue), "%hu", binValue ); // AUDIT: Using sizeof(strValue) is safe. xmp->AppendArrayItem ( xmpNS, xmpProp, kXMP_PropArrayIsOrdered, strValue ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportArrayTIFF_Byte // ================================================================================================= // ImportArrayTIFF_SByte // ===================== static void ImportArrayTIFF_SByte ( const TIFF_Manager::TagInfo & tagInfo, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Int8 * binPtr = (XMP_Int8*)tagInfo.dataPtr; xmp->DeleteProperty ( xmpNS, xmpProp ); // ! Don't keep appending, create a new array. for ( size_t i = 0; i < tagInfo.count; ++i, ++binPtr ) { XMP_Int8 binValue = *binPtr; char strValue[20]; snprintf ( strValue, sizeof(strValue), "%hd", binValue ); // AUDIT: Using sizeof(strValue) is safe. xmp->AppendArrayItem ( xmpNS, xmpProp, kXMP_PropArrayIsOrdered, strValue ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportArrayTIFF_SByte // ================================================================================================= // ImportArrayTIFF_SShort // ====================== static void ImportArrayTIFF_SShort ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Int16 * binPtr = (XMP_Int16*)tagInfo.dataPtr; xmp->DeleteProperty ( xmpNS, xmpProp ); // ! Don't keep appending, create a new array. for ( size_t i = 0; i < tagInfo.count; ++i, ++binPtr ) { XMP_Int16 binValue = *binPtr; if ( ! nativeEndian ) Flip2 ( &binValue ); char strValue[20]; snprintf ( strValue, sizeof(strValue), "%hd", binValue ); // AUDIT: Using sizeof(strValue) is safe. xmp->AppendArrayItem ( xmpNS, xmpProp, kXMP_PropArrayIsOrdered, strValue ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportArrayTIFF_SShort // ================================================================================================= // ImportArrayTIFF_SLong // ===================== static void ImportArrayTIFF_SLong ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Int32 * binPtr = (XMP_Int32*)tagInfo.dataPtr; xmp->DeleteProperty ( xmpNS, xmpProp ); // ! Don't keep appending, create a new array. for ( size_t i = 0; i < tagInfo.count; ++i, ++binPtr ) { XMP_Int32 binValue = *binPtr; if ( ! nativeEndian ) Flip4 ( &binValue ); char strValue[20]; snprintf ( strValue, sizeof(strValue), "%ld", (long)binValue ); // AUDIT: Using sizeof(strValue) is safe. xmp->AppendArrayItem ( xmpNS, xmpProp, kXMP_PropArrayIsOrdered, strValue ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportArrayTIFF_SLong // ================================================================================================= // ImportArrayTIFF_Float // ===================== static void ImportArrayTIFF_Float ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. float * binPtr = (float*)tagInfo.dataPtr; xmp->DeleteProperty ( xmpNS, xmpProp ); // ! Don't keep appending, create a new array. for ( size_t i = 0; i < tagInfo.count; ++i, ++binPtr ) { float binValue = *binPtr; if ( ! nativeEndian ) Flip4 ( &binValue ); std::string strValue; SXMPUtils::ConvertFromFloat ( binValue, "", &strValue ); xmp->AppendArrayItem ( xmpNS, xmpProp, kXMP_PropArrayIsOrdered, strValue.c_str() ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportArrayTIFF_Float // ================================================================================================= // ImportArrayTIFF_Double // ====================== static void ImportArrayTIFF_Double ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. double * binPtr = (double*)tagInfo.dataPtr; xmp->DeleteProperty ( xmpNS, xmpProp ); // ! Don't keep appending, create a new array. for ( size_t i = 0; i < tagInfo.count; ++i, ++binPtr ) { double binValue = *binPtr; if ( ! nativeEndian ) Flip8 ( &binValue ); std::string strValue; SXMPUtils::ConvertFromFloat ( binValue, "", &strValue ); // ! Yes, ConvertFromFloat. xmp->AppendArrayItem ( xmpNS, xmpProp, kXMP_PropArrayIsOrdered, strValue.c_str() ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportArrayTIFF_Double // ================================================================================================= // ImportArrayTIFF // =============== static void ImportArrayTIFF ( const TIFF_Manager::TagInfo & tagInfo, const bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { // We've got a tag to map to XMP, decide how based on actual type and the expected count. Using // the actual type eliminates a ShortOrLong case. Using the expected count is needed to know // whether to create an XMP array. The actual count for an array could be 1. Put the most // common cases first for better iCache utilization. switch ( tagInfo.type ) { case kTIFF_ShortType : ImportArrayTIFF_Short ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_LongType : ImportArrayTIFF_Long ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_RationalType : ImportArrayTIFF_Rational ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_SRationalType : ImportArrayTIFF_SRational ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_ASCIIType : ImportArrayTIFF_ASCII ( tagInfo, xmp, xmpNS, xmpProp ); break; case kTIFF_ByteType : ImportArrayTIFF_Byte ( tagInfo, xmp, xmpNS, xmpProp ); break; case kTIFF_SByteType : ImportArrayTIFF_SByte ( tagInfo, xmp, xmpNS, xmpProp ); break; case kTIFF_SShortType : ImportArrayTIFF_SShort ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_SLongType : ImportArrayTIFF_SLong ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_FloatType : ImportArrayTIFF_Float ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; case kTIFF_DoubleType : ImportArrayTIFF_Double ( tagInfo, nativeEndian, xmp, xmpNS, xmpProp ); break; } } // ImportArrayTIFF // ================================================================================================= // ImportTIFF_CheckStandardMapping // =============================== static bool ImportTIFF_CheckStandardMapping ( const TIFF_Manager::TagInfo & tagInfo, const TIFF_MappingToXMP & mapInfo ) { XMP_Assert ( (kTIFF_ByteType <= tagInfo.type) && (tagInfo.type <= kTIFF_LastType) ); XMP_Assert ( mapInfo.type <= kTIFF_LastType ); if ( (tagInfo.type < kTIFF_ByteType) || (tagInfo.type > kTIFF_LastType) ) return false; if ( tagInfo.type != mapInfo.type ) { if ( mapInfo.type != kTIFF_ShortOrLongType ) return false; if ( (tagInfo.type != kTIFF_ShortType) && (tagInfo.type != kTIFF_LongType) ) return false; } if ( (tagInfo.count != mapInfo.count) && // Maybe there is a problem because the counts don't match. // (mapInfo.count != kAnyCount) && ... don't need this because of the new check below ... (mapInfo.count == 1) ) return false; // Be tolerant of mismatch in expected array size. return true; } // ImportTIFF_CheckStandardMapping // ================================================================================================= // ImportTIFF_StandardMappings // =========================== static void ImportTIFF_StandardMappings ( XMP_Uns8 ifd, const TIFF_Manager & tiff, SXMPMeta * xmp ) { const bool nativeEndian = tiff.IsNativeEndian(); TIFF_Manager::TagInfo tagInfo; const TIFF_MappingToXMP * mappings = 0; const char * xmpNS = 0; if ( ifd == kTIFF_PrimaryIFD ) { mappings = sPrimaryIFDMappings; xmpNS = kXMP_NS_TIFF; } else if ( ifd == kTIFF_ExifIFD ) { mappings = sExifIFDMappings; xmpNS = kXMP_NS_EXIF; } else if ( ifd == kTIFF_GPSInfoIFD ) { mappings = sGPSInfoIFDMappings; xmpNS = kXMP_NS_EXIF; // ! Yes, the GPS Info tags go into the exif: namespace. } else { XMP_Throw ( "Invalid IFD for standard mappings", kXMPErr_InternalFailure ); } for ( size_t i = 0; mappings[i].id != 0xFFFF; ++i ) { try { // Don't let errors with one stop the others. const TIFF_MappingToXMP & mapInfo = mappings[i]; const bool mapSingle = ((mapInfo.count == 1) || (mapInfo.type == kTIFF_ASCIIType)); if ( mapInfo.name[0] == 0 ) continue; // Skip special mappings, handled higher up. bool found = tiff.GetTag ( ifd, mapInfo.id, &tagInfo ); if ( ! found ) continue; XMP_Assert ( tagInfo.type != kTIFF_UndefinedType ); // These must have a special mapping. if ( tagInfo.type == kTIFF_UndefinedType ) continue; if ( ! ImportTIFF_CheckStandardMapping ( tagInfo, mapInfo ) ) continue; if ( mapSingle ) { ImportSingleTIFF ( tagInfo, nativeEndian, xmp, xmpNS, mapInfo.name ); } else { ImportArrayTIFF ( tagInfo, nativeEndian, xmp, xmpNS, mapInfo.name ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } } // ImportTIFF_StandardMappings // ================================================================================================= // ================================================================================================= // ================================================================================================= // ImportTIFF_Date // =============== // // Convert an Exif 2.2 master date/time tag plus associated fractional seconds to an XMP date/time. // The Exif date/time part is a 20 byte ASCII value formatted as "YYYY:MM:DD HH:MM:SS" with a // terminating nul. Any of the numeric portions can be blanks if unknown. The fractional seconds // are a nul terminated ASCII string with possible space padding. They are literally the fractional // part, the digits that would be to the right of the decimal point. static void ImportTIFF_Date ( const TIFF_Manager & tiff, const TIFF_Manager::TagInfo & dateInfo, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { XMP_Uns16 secID; switch ( dateInfo.id ) { case kTIFF_DateTime : secID = kTIFF_SubSecTime; break; case kTIFF_DateTimeOriginal : secID = kTIFF_SubSecTimeOriginal; break; case kTIFF_DateTimeDigitized : secID = kTIFF_SubSecTimeDigitized; break; } try { // Don't let errors with one stop the others. if ( (dateInfo.type != kTIFF_ASCIIType) || (dateInfo.count != 20) ) return; const char * dateStr = (const char *) dateInfo.dataPtr; if ( (dateStr[4] != ':') || (dateStr[7] != ':') || (dateStr[10] != ' ') || (dateStr[13] != ':') || (dateStr[16] != ':') ) return; XMP_DateTime binValue; binValue.year = GatherInt ( &dateStr[0], 4 ); binValue.month = GatherInt ( &dateStr[5], 2 ); binValue.day = GatherInt ( &dateStr[8], 2 ); if ( (binValue.year != 0) | (binValue.month != 0) | (binValue.day != 0) ) binValue.hasDate = true; binValue.hour = GatherInt ( &dateStr[11], 2 ); binValue.minute = GatherInt ( &dateStr[14], 2 ); binValue.second = GatherInt ( &dateStr[17], 2 ); binValue.nanoSecond = 0; // Get the fractional seconds later. if ( (binValue.hour != 0) | (binValue.minute != 0) | (binValue.second != 0) ) binValue.hasTime = true; binValue.tzSign = 0; // ! Separate assignment, avoid VS integer truncation warning. binValue.tzHour = binValue.tzMinute = 0; binValue.hasTimeZone = false; // Exif times have no zone. // *** Consider looking at the TIFF/EP TimeZoneOffset tag? TIFF_Manager::TagInfo secInfo; bool found = tiff.GetTag ( kTIFF_ExifIFD, secID, &secInfo ); // ! Subseconds are all in the Exif IFD. if ( found && (secInfo.type == kTIFF_ASCIIType) ) { const char * fracPtr = (const char *) secInfo.dataPtr; binValue.nanoSecond = GatherInt ( fracPtr, secInfo.dataLen ); size_t digits = 0; for ( ; (('0' <= *fracPtr) && (*fracPtr <= '9')); ++fracPtr ) ++digits; for ( ; digits < 9; ++digits ) binValue.nanoSecond *= 10; if ( binValue.nanoSecond != 0 ) binValue.hasTime = true; } xmp->SetProperty_Date ( xmpNS, xmpProp, binValue ); } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportTIFF_Date // ================================================================================================= // ImportTIFF_LocTextASCII // ======================= static void ImportTIFF_LocTextASCII ( const TIFF_Manager & tiff, XMP_Uns8 ifd, XMP_Uns16 tagID, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. TIFF_Manager::TagInfo tagInfo; bool found = tiff.GetTag ( ifd, tagID, &tagInfo ); if ( (! found) || (tagInfo.type != kTIFF_ASCIIType) ) return; const char * chPtr = (const char *)tagInfo.dataPtr; const bool hasNul = (chPtr[tagInfo.dataLen-1] == 0); const bool isUTF8 = ReconcileUtils::IsUTF8 ( chPtr, tagInfo.dataLen ); if ( isUTF8 && hasNul ) { xmp->SetLocalizedText ( xmpNS, xmpProp, "", "x-default", chPtr ); } else { std::string strValue; if ( isUTF8 ) { strValue.assign ( chPtr, tagInfo.dataLen ); } else { if ( ignoreLocalText ) return; ReconcileUtils::LocalToUTF8 ( chPtr, tagInfo.dataLen, &strValue ); } xmp->SetLocalizedText ( xmpNS, xmpProp, "", "x-default", strValue.c_str() ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportTIFF_LocTextASCII // ================================================================================================= // ImportTIFF_EncodedString // ======================== static void ImportTIFF_EncodedString ( const TIFF_Manager & tiff, const TIFF_Manager::TagInfo & tagInfo, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp, bool isLangAlt = false ) { try { // Don't let errors with one stop the others. std::string strValue; bool ok = tiff.DecodeString ( tagInfo.dataPtr, tagInfo.dataLen, &strValue ); if ( ! ok ) return; if ( ! isLangAlt ) { xmp->SetProperty ( xmpNS, xmpProp, strValue.c_str() ); } else { xmp->SetLocalizedText ( xmpNS, xmpProp, "", "x-default", strValue.c_str() ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportTIFF_EncodedString // ================================================================================================= // ImportTIFF_Flash // ================ static void ImportTIFF_Flash ( const TIFF_Manager::TagInfo & tagInfo, bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. XMP_Uns16 binValue = *((XMP_Uns16*)tagInfo.dataPtr); if ( ! nativeEndian ) binValue = Flip2 ( binValue ); bool fired = (bool)(binValue & 1); // Avoid implicit 0/1 conversion. int rtrn = (binValue >> 1) & 3; int mode = (binValue >> 3) & 3; bool function = (bool)((binValue >> 5) & 1); bool redEye = (bool)((binValue >> 6) & 1); static const char * sTwoBits[] = { "0", "1", "2", "3" }; xmp->SetStructField ( kXMP_NS_EXIF, "Flash", kXMP_NS_EXIF, "Fired", (fired ? kXMP_TrueStr : kXMP_FalseStr) ); xmp->SetStructField ( kXMP_NS_EXIF, "Flash", kXMP_NS_EXIF, "Return", sTwoBits[rtrn] ); xmp->SetStructField ( kXMP_NS_EXIF, "Flash", kXMP_NS_EXIF, "Mode", sTwoBits[mode] ); xmp->SetStructField ( kXMP_NS_EXIF, "Flash", kXMP_NS_EXIF, "Function", (function ? kXMP_TrueStr : kXMP_FalseStr) ); xmp->SetStructField ( kXMP_NS_EXIF, "Flash", kXMP_NS_EXIF, "RedEyeMode", (redEye ? kXMP_TrueStr : kXMP_FalseStr) ); } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportTIFF_Flash // ================================================================================================= // ImportTIFF_OECFTable // ==================== // // Although the XMP for the OECF and SFR tables is the same, the Exif is not. The OECF table has // signed rational values and the SFR table has unsigned. static void ImportTIFF_OECFTable ( const TIFF_Manager::TagInfo & tagInfo, bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. const XMP_Uns8 * bytePtr = (XMP_Uns8*)tagInfo.dataPtr; const XMP_Uns8 * byteEnd = bytePtr + tagInfo.dataLen; XMP_Uns16 columns = *((XMP_Uns16*)bytePtr); XMP_Uns16 rows = *((XMP_Uns16*)(bytePtr+2)); if ( ! nativeEndian ) { columns = Flip2 ( columns ); rows = Flip2 ( rows ); } char buffer[40]; snprintf ( buffer, sizeof(buffer), "%d", columns ); // AUDIT: Use of sizeof(buffer) is safe. xmp->SetStructField ( xmpNS, xmpProp, kXMP_NS_EXIF, "Columns", buffer ); snprintf ( buffer, sizeof(buffer), "%d", rows ); // AUDIT: Use of sizeof(buffer) is safe. xmp->SetStructField ( xmpNS, xmpProp, kXMP_NS_EXIF, "Rows", buffer ); std::string arrayPath; SXMPUtils::ComposeStructFieldPath ( xmpNS, xmpProp, kXMP_NS_EXIF, "Names", &arrayPath ); bytePtr += 4; // Move to the list of names. for ( size_t i = columns; i > 0; --i ) { size_t nameLen = strlen((XMP_StringPtr)bytePtr) + 1; // ! Include the terminating nul. if ( (bytePtr + nameLen) > byteEnd ) { xmp->DeleteProperty ( xmpNS, xmpProp ); return; }; xmp->AppendArrayItem ( xmpNS, arrayPath.c_str(), kXMP_PropArrayIsOrdered, (XMP_StringPtr)bytePtr ); bytePtr += nameLen; } if ( (byteEnd - bytePtr) != (8 * columns * rows) ) { xmp->DeleteProperty ( xmpNS, xmpProp ); return; }; // Make sure the values are present. SXMPUtils::ComposeStructFieldPath ( xmpNS, xmpProp, kXMP_NS_EXIF, "Values", &arrayPath ); XMP_Int32 * binPtr = (XMP_Int32*)bytePtr; for ( size_t i = (columns * rows); i > 0; --i, binPtr += 2 ) { XMP_Int32 binNum = binPtr[0]; XMP_Int32 binDenom = binPtr[1]; if ( ! nativeEndian ) { Flip4 ( &binNum ); Flip4 ( &binDenom ); } snprintf ( buffer, sizeof(buffer), "%ld/%ld", (long)binNum, (long)binDenom ); // AUDIT: Use of sizeof(buffer) is safe. xmp->AppendArrayItem ( xmpNS, arrayPath.c_str(), kXMP_PropArrayIsOrdered, buffer ); } return; } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportTIFF_OECFTable // ================================================================================================= // ImportTIFF_SFRTable // =================== // // Although the XMP for the OECF and SFR tables is the same, the Exif is not. The OECF table has // signed rational values and the SFR table has unsigned. static void ImportTIFF_SFRTable ( const TIFF_Manager::TagInfo & tagInfo, bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. const XMP_Uns8 * bytePtr = (XMP_Uns8*)tagInfo.dataPtr; const XMP_Uns8 * byteEnd = bytePtr + tagInfo.dataLen; XMP_Uns16 columns = *((XMP_Uns16*)bytePtr); XMP_Uns16 rows = *((XMP_Uns16*)(bytePtr+2)); if ( ! nativeEndian ) { columns = Flip2 ( columns ); rows = Flip2 ( rows ); } char buffer[40]; snprintf ( buffer, sizeof(buffer), "%d", columns ); // AUDIT: Use of sizeof(buffer) is safe. xmp->SetStructField ( xmpNS, xmpProp, kXMP_NS_EXIF, "Columns", buffer ); snprintf ( buffer, sizeof(buffer), "%d", rows ); // AUDIT: Use of sizeof(buffer) is safe. xmp->SetStructField ( xmpNS, xmpProp, kXMP_NS_EXIF, "Rows", buffer ); std::string arrayPath; SXMPUtils::ComposeStructFieldPath ( xmpNS, xmpProp, kXMP_NS_EXIF, "Names", &arrayPath ); bytePtr += 4; // Move to the list of names. for ( size_t i = columns; i > 0; --i ) { size_t nameLen = strlen((XMP_StringPtr)bytePtr) + 1; // ! Include the terminating nul. if ( (bytePtr + nameLen) > byteEnd ) { xmp->DeleteProperty ( xmpNS, xmpProp ); return; }; xmp->AppendArrayItem ( xmpNS, arrayPath.c_str(), kXMP_PropArrayIsOrdered, (XMP_StringPtr)bytePtr ); bytePtr += nameLen; } if ( (byteEnd - bytePtr) != (8 * columns * rows) ) { xmp->DeleteProperty ( xmpNS, xmpProp ); return; }; // Make sure the values are present. SXMPUtils::ComposeStructFieldPath ( xmpNS, xmpProp, kXMP_NS_EXIF, "Values", &arrayPath ); XMP_Uns32 * binPtr = (XMP_Uns32*)bytePtr; for ( size_t i = (columns * rows); i > 0; --i, binPtr += 2 ) { XMP_Uns32 binNum = binPtr[0]; XMP_Uns32 binDenom = binPtr[1]; if ( ! nativeEndian ) { binNum = Flip4 ( binNum ); binDenom = Flip4 ( binDenom ); } snprintf ( buffer, sizeof(buffer), "%lu/%lu", (unsigned long)binNum, (unsigned long)binDenom ); // AUDIT: Use of sizeof(buffer) is safe. xmp->AppendArrayItem ( xmpNS, arrayPath.c_str(), kXMP_PropArrayIsOrdered, buffer ); } return; } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportTIFF_SFRTable // ================================================================================================= // ImportTIFF_CFATable // =================== static void ImportTIFF_CFATable ( const TIFF_Manager::TagInfo & tagInfo, bool nativeEndian, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. const XMP_Uns8 * bytePtr = (XMP_Uns8*)tagInfo.dataPtr; const XMP_Uns8 * byteEnd = bytePtr + tagInfo.dataLen; XMP_Uns16 columns = *((XMP_Uns16*)bytePtr); XMP_Uns16 rows = *((XMP_Uns16*)(bytePtr+2)); if ( ! nativeEndian ) { columns = Flip2 ( columns ); rows = Flip2 ( rows ); } char buffer[20]; std::string arrayPath; snprintf ( buffer, sizeof(buffer), "%d", columns ); // AUDIT: Use of sizeof(buffer) is safe. xmp->SetStructField ( xmpNS, xmpProp, kXMP_NS_EXIF, "Columns", buffer ); snprintf ( buffer, sizeof(buffer), "%d", rows ); // AUDIT: Use of sizeof(buffer) is safe. xmp->SetStructField ( xmpNS, xmpProp, kXMP_NS_EXIF, "Rows", buffer ); bytePtr += 4; // Move to the matrix of values. if ( (byteEnd - bytePtr) != (columns * rows) ) goto BadExif; // Make sure the values are present. SXMPUtils::ComposeStructFieldPath ( xmpNS, xmpProp, kXMP_NS_EXIF, "Values", &arrayPath ); for ( size_t i = (columns * rows); i > 0; --i, ++bytePtr ) { snprintf ( buffer, sizeof(buffer), "%hu", *bytePtr ); // AUDIT: Use of sizeof(buffer) is safe. xmp->AppendArrayItem ( xmpNS, arrayPath.c_str(), kXMP_PropArrayIsOrdered, buffer ); } return; BadExif: // Ignore the tag if the table is ill-formed. xmp->DeleteProperty ( xmpNS, xmpProp ); return; } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportTIFF_CFATable // ================================================================================================= // ImportTIFF_DSDTable // =================== static void ImportTIFF_DSDTable ( const TIFF_Manager & tiff, const TIFF_Manager::TagInfo & tagInfo, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. const XMP_Uns8 * bytePtr = (XMP_Uns8*)tagInfo.dataPtr; const XMP_Uns8 * byteEnd = bytePtr + tagInfo.dataLen; XMP_Uns16 columns = *((XMP_Uns16*)bytePtr); XMP_Uns16 rows = *((XMP_Uns16*)(bytePtr+2)); if ( ! tiff.IsNativeEndian() ) { columns = Flip2 ( columns ); rows = Flip2 ( rows ); } char buffer[20]; snprintf ( buffer, sizeof(buffer), "%d", columns ); // AUDIT: Use of sizeof(buffer) is safe. xmp->SetStructField ( xmpNS, xmpProp, kXMP_NS_EXIF, "Columns", buffer ); snprintf ( buffer, sizeof(buffer), "%d", rows ); // AUDIT: Use of sizeof(buffer) is safe. xmp->SetStructField ( xmpNS, xmpProp, kXMP_NS_EXIF, "Rows", buffer ); std::string arrayPath; SXMPUtils::ComposeStructFieldPath ( xmpNS, xmpProp, kXMP_NS_EXIF, "Settings", &arrayPath ); bytePtr += 4; // Move to the list of settings. UTF16Unit * utf16Ptr = (UTF16Unit*)bytePtr; UTF16Unit * utf16End = (UTF16Unit*)byteEnd; std::string utf8; // Figure 17 in the Exif 2.2 spec is unclear. It has counts for rows and columns, but the // settings are listed as 1..n, not as a rectangular matrix. So, ignore the counts and copy // strings until the end of the Exif value. while ( utf16Ptr < utf16End ) { size_t nameLen = 0; while ( utf16Ptr[nameLen] != 0 ) ++nameLen; ++nameLen; // ! Include the terminating nul. if ( (utf16Ptr + nameLen) > utf16End ) goto BadExif; try { FromUTF16 ( utf16Ptr, nameLen, &utf8, tiff.IsBigEndian() ); } catch ( ... ) { goto BadExif; // Ignore the tag if there are conversion errors. } xmp->AppendArrayItem ( xmpNS, arrayPath.c_str(), kXMP_PropArrayIsOrdered, utf8.c_str() ); utf16Ptr += nameLen; } return; BadExif: // Ignore the tag if the table is ill-formed. xmp->DeleteProperty ( xmpNS, xmpProp ); return; } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportTIFF_DSDTable // ================================================================================================= // ImportTIFF_GPSCoordinate // ======================== static void ImportTIFF_GPSCoordinate ( const TIFF_Manager & tiff, const TIFF_Manager::TagInfo & posInfo, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. const bool nativeEndian = tiff.IsNativeEndian(); XMP_Uns16 refID = posInfo.id - 1; // ! The GPS refs and coordinates are all tag n and n+1. TIFF_Manager::TagInfo refInfo; bool found = tiff.GetTag ( kTIFF_GPSInfoIFD, refID, &refInfo ); if ( (! found) || (refInfo.type != kTIFF_ASCIIType) || (refInfo.count != 2) ) return; char ref = *((char*)refInfo.dataPtr); XMP_Uns32 * binPtr = (XMP_Uns32*)posInfo.dataPtr; XMP_Uns32 degNum = binPtr[0]; XMP_Uns32 degDenom = binPtr[1]; XMP_Uns32 minNum = binPtr[2]; XMP_Uns32 minDenom = binPtr[3]; XMP_Uns32 secNum = binPtr[4]; XMP_Uns32 secDenom = binPtr[5]; if ( ! nativeEndian ) { degNum = Flip4 ( degNum ); degDenom = Flip4 ( degDenom ); minNum = Flip4 ( minNum ); minDenom = Flip4 ( minDenom ); secNum = Flip4 ( secNum ); secDenom = Flip4 ( secDenom ); } char buffer[40]; if ( (degDenom == 1) && (minDenom == 1) && (secDenom == 1) ) { snprintf ( buffer, sizeof(buffer), "%lu,%lu,%lu%c", (unsigned long)degNum, (unsigned long)minNum, (unsigned long)secNum, ref ); // AUDIT: Using sizeof(buffer is safe. } else { XMP_Uns32 maxDenom = degDenom; if ( minDenom > degDenom ) maxDenom = minDenom; if ( secDenom > degDenom ) maxDenom = secDenom; int fracDigits = 1; while ( maxDenom > 10 ) { ++fracDigits; maxDenom = maxDenom/10; } double temp = (double)degNum / (double)degDenom; double degrees = (double)((XMP_Uns32)temp); // Just the integral number of degrees. double minutes = ((temp - degrees) * 60.0) + ((double)minNum / (double)minDenom) + (((double)secNum / (double)secDenom) / 60.0); snprintf ( buffer, sizeof(buffer), "%.0f,%.*f%c", degrees, fracDigits, minutes, ref ); // AUDIT: Using sizeof(buffer is safe. } xmp->SetProperty ( xmpNS, xmpProp, buffer ); } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportTIFF_GPSCoordinate // ================================================================================================= // ImportTIFF_GPSTimeStamp // ======================= static void ImportTIFF_GPSTimeStamp ( const TIFF_Manager & tiff, const TIFF_Manager::TagInfo & timeInfo, SXMPMeta * xmp, const char * xmpNS, const char * xmpProp ) { try { // Don't let errors with one stop the others. const bool nativeEndian = tiff.IsNativeEndian(); bool haveDate; TIFF_Manager::TagInfo dateInfo; haveDate = tiff.GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSDateStamp, &dateInfo ); if ( ! haveDate ) haveDate = tiff.GetTag ( kTIFF_ExifIFD, kTIFF_DateTimeOriginal, &dateInfo ); if ( ! haveDate ) haveDate = tiff.GetTag ( kTIFF_ExifIFD, kTIFF_DateTimeDigitized, &dateInfo ); if ( ! haveDate ) return; const char * dateStr = (const char *) dateInfo.dataPtr; if ( (dateStr[4] != ':') || (dateStr[7] != ':') ) return; if ( (dateStr[10] != 0) && (dateStr[10] != ' ') ) return; XMP_Uns32 * binPtr = (XMP_Uns32*)timeInfo.dataPtr; XMP_Uns32 hourNum = binPtr[0]; XMP_Uns32 hourDenom = binPtr[1]; XMP_Uns32 minNum = binPtr[2]; XMP_Uns32 minDenom = binPtr[3]; XMP_Uns32 secNum = binPtr[4]; XMP_Uns32 secDenom = binPtr[5]; if ( ! nativeEndian ) { hourNum = Flip4 ( hourNum ); hourDenom = Flip4 ( hourDenom ); minNum = Flip4 ( minNum ); minDenom = Flip4 ( minDenom ); secNum = Flip4 ( secNum ); secDenom = Flip4 ( secDenom ); } double fHour, fMin, fSec, fNano, temp; fSec = (double)secNum / (double)secDenom; temp = (double)minNum / (double)minDenom; fMin = (double)((XMP_Uns32)temp); fSec += (temp - fMin) * 60.0; temp = (double)hourNum / (double)hourDenom; fHour = (double)((XMP_Uns32)temp); fSec += (temp - fHour) * 3600.0; temp = (double)((XMP_Uns32)fSec); fNano = ((fSec - temp) * (1000.0*1000.0*1000.0)) + 0.5; // Try to avoid n999... problems. fSec = temp; XMP_DateTime binStamp; binStamp.year = GatherInt ( dateStr, 4 ); binStamp.month = GatherInt ( dateStr+5, 2 ); binStamp.day = GatherInt ( dateStr+8, 2 ); binStamp.hour = (XMP_Int32)fHour; binStamp.minute = (XMP_Int32)fMin; binStamp.second = (XMP_Int32)fSec; binStamp.nanoSecond = (XMP_Int32)fNano; binStamp.hasTimeZone = true; // Exif GPS TimeStamp is implicitly UTC. binStamp.tzSign = kXMP_TimeIsUTC; binStamp.tzHour = binStamp.tzMinute = 0; xmp->SetProperty_Date ( xmpNS, xmpProp, binStamp ); } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // ImportTIFF_GPSTimeStamp // ================================================================================================= // ================================================================================================= // ================================================================================================= // PhotoDataUtils::Import2WayExif // ============================== // // Import the TIFF/Exif tags that have 2 way mappings to XMP, i.e. no correspondence to IPTC. // These are always imported for the tiff: and exif: namespaces, but not for others. void PhotoDataUtils::Import2WayExif ( const TIFF_Manager & exif, SXMPMeta * xmp, int iptcDigestState ) { const bool nativeEndian = exif.IsNativeEndian(); bool found, foundFromXMP; TIFF_Manager::TagInfo tagInfo; ImportTIFF_StandardMappings ( kTIFF_PrimaryIFD, exif, xmp ); ImportTIFF_StandardMappings ( kTIFF_ExifIFD, exif, xmp ); ImportTIFF_StandardMappings ( kTIFF_GPSInfoIFD, exif, xmp ); // ----------------------------------------------------------------- // Fixup erroneous files that have a negative value for GPSAltitude. found = exif.GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSAltitude, &tagInfo ); if ( found && (tagInfo.type == kTIFF_RationalType) && (tagInfo.count == 1) ) { XMP_Uns32 num = exif.GetUns32 ( tagInfo.dataPtr ); XMP_Uns32 denom = exif.GetUns32 ( (XMP_Uns8*)tagInfo.dataPtr + 4 ); bool numNeg = num >> 31; bool denomNeg = denom >> 31; if ( (numNeg != denomNeg) || numNeg ) { // Does the GPSAltitude look negative? if ( denomNeg ) { denom = -denom; num = -num; numNeg = num >> 31; } if ( numNeg ) { char buffer [32]; num = -num; snprintf ( buffer, sizeof(buffer), "%lu/%lu", (unsigned long) num, (unsigned long) denom ); // AUDIT: Using sizeof(buffer) is safe. xmp->SetProperty ( kXMP_NS_EXIF, "GPSAltitude", buffer ); xmp->SetProperty ( kXMP_NS_EXIF, "GPSAltitudeRef", "1" ); } } } // --------------------------------------------------------------- // Import DateTimeOriginal and DateTime if the XMP doss not exist. found = exif.GetTag ( kTIFF_ExifIFD, kTIFF_DateTimeOriginal, &tagInfo ); foundFromXMP = xmp->DoesPropertyExist ( kXMP_NS_EXIF, "DateTimeOriginal" ); if ( found && (! foundFromXMP) && (tagInfo.type == kTIFF_ASCIIType) ) { ImportTIFF_Date ( exif, tagInfo, xmp, kXMP_NS_EXIF, "DateTimeOriginal" ); } found = exif.GetTag ( kTIFF_PrimaryIFD, kTIFF_DateTime, &tagInfo ); foundFromXMP = xmp->DoesPropertyExist ( kXMP_NS_XMP, "ModifyDate" ); if ( found && (! foundFromXMP) && (tagInfo.type == kTIFF_ASCIIType) ) { ImportTIFF_Date ( exif, tagInfo, xmp, kXMP_NS_XMP, "ModifyDate" ); } // ---------------------------------------------------- // Import the Exif IFD tags that have special mappings. // 34855 ISOSpeedRatings has special cases for ISO over 65535. The tag is SHORT, some cameras // omit the tag and some write 65535, all put the real ISO in MakerNote - which ACR might // extract and leave in the XMP. There are 3 import cases: // 1. No native tag: Leave existing XMP. // 2. All of the native values are under 65535: Clear any XMP and import. // 3. One or more of the native values are 65535: Leave existing XMP, else import. found = exif.GetTag ( kTIFF_ExifIFD, kTIFF_ISOSpeedRatings, &tagInfo ); if ( found && (tagInfo.type == kTIFF_ShortType) && (tagInfo.count > 0) ) { bool keepXMP = false; XMP_Uns16 * itemPtr = (XMP_Uns16*) tagInfo.dataPtr; for ( XMP_Uns32 i = 0; i < tagInfo.count; ++i, ++itemPtr ) { if ( *itemPtr == 0xFFFF ) { keepXMP = true; break; } // ! Don't care about BE or LF, same either way. } if ( ! keepXMP ) xmp->DeleteProperty ( kXMP_NS_EXIF, "ISOSpeedRatings" ); if ( ! xmp->DoesPropertyExist ( kXMP_NS_EXIF, "ISOSpeedRatings" ) ) { ImportArrayTIFF ( tagInfo, exif.IsNativeEndian(), xmp, kXMP_NS_EXIF, "ISOSpeedRatings" ); } } // 36864 ExifVersion is 4 "undefined" ASCII characters. found = exif.GetTag ( kTIFF_ExifIFD, kTIFF_ExifVersion, &tagInfo ); if ( found && (tagInfo.type == kTIFF_UndefinedType) && (tagInfo.count == 4) ) { char str[5]; *((XMP_Uns32*)str) = *((XMP_Uns32*)tagInfo.dataPtr); str[4] = 0; xmp->SetProperty ( kXMP_NS_EXIF, "ExifVersion", str ); } // 40960 FlashpixVersion is 4 "undefined" ASCII characters. found = exif.GetTag ( kTIFF_ExifIFD, kTIFF_FlashpixVersion, &tagInfo ); if ( found && (tagInfo.type == kTIFF_UndefinedType) && (tagInfo.count == 4) ) { char str[5]; *((XMP_Uns32*)str) = *((XMP_Uns32*)tagInfo.dataPtr); str[4] = 0; xmp->SetProperty ( kXMP_NS_EXIF, "FlashpixVersion", str ); } // 37121 ComponentsConfiguration is an array of 4 "undefined" UInt8 bytes. found = exif.GetTag ( kTIFF_ExifIFD, kTIFF_ComponentsConfiguration, &tagInfo ); if ( found && (tagInfo.type == kTIFF_UndefinedType) && (tagInfo.count == 4) ) { ImportArrayTIFF_Byte ( tagInfo, xmp, kXMP_NS_EXIF, "ComponentsConfiguration" ); } // 37510 UserComment is a string with explicit encoding. found = exif.GetTag ( kTIFF_ExifIFD, kTIFF_UserComment, &tagInfo ); if ( found ) { ImportTIFF_EncodedString ( exif, tagInfo, xmp, kXMP_NS_EXIF, "UserComment", true /* isLangAlt */ ); } // 34856 OECF is an OECF/SFR table. found = exif.GetTag ( kTIFF_ExifIFD, kTIFF_OECF, &tagInfo ); if ( found ) { ImportTIFF_OECFTable ( tagInfo, nativeEndian, xmp, kXMP_NS_EXIF, "OECF" ); } // 37385 Flash is a UInt16 collection of bit fields and is mapped to a struct in XMP. found = exif.GetTag ( kTIFF_ExifIFD, kTIFF_Flash, &tagInfo ); if ( found && (tagInfo.type == kTIFF_ShortType) && (tagInfo.count == 1) ) { ImportTIFF_Flash ( tagInfo, nativeEndian, xmp, kXMP_NS_EXIF, "Flash" ); } // 41484 SpatialFrequencyResponse is an OECF/SFR table. found = exif.GetTag ( kTIFF_ExifIFD, kTIFF_SpatialFrequencyResponse, &tagInfo ); if ( found ) { ImportTIFF_SFRTable ( tagInfo, nativeEndian, xmp, kXMP_NS_EXIF, "SpatialFrequencyResponse" ); } // 41728 FileSource is an "undefined" UInt8. found = exif.GetTag ( kTIFF_ExifIFD, kTIFF_FileSource, &tagInfo ); if ( found && (tagInfo.type == kTIFF_UndefinedType) && (tagInfo.count == 1) ) { ImportSingleTIFF_Byte ( tagInfo, xmp, kXMP_NS_EXIF, "FileSource" ); } // 41729 SceneType is an "undefined" UInt8. found = exif.GetTag ( kTIFF_ExifIFD, kTIFF_SceneType, &tagInfo ); if ( found && (tagInfo.type == kTIFF_UndefinedType) && (tagInfo.count == 1) ) { ImportSingleTIFF_Byte ( tagInfo, xmp, kXMP_NS_EXIF, "SceneType" ); } // 41730 CFAPattern is a custom table. found = exif.GetTag ( kTIFF_ExifIFD, kTIFF_CFAPattern, &tagInfo ); if ( found ) { ImportTIFF_CFATable ( tagInfo, nativeEndian, xmp, kXMP_NS_EXIF, "CFAPattern" ); } // 41995 DeviceSettingDescription is a custom table. found = exif.GetTag ( kTIFF_ExifIFD, kTIFF_DeviceSettingDescription, &tagInfo ); if ( found ) { ImportTIFF_DSDTable ( exif, tagInfo, xmp, kXMP_NS_EXIF, "DeviceSettingDescription" ); } // -------------------------------------------------------- // Import the GPS Info IFD tags that have special mappings. // 0 GPSVersionID is 4 UInt8 bytes and mapped as "n.n.n.n". found = exif.GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSVersionID, &tagInfo ); if ( found && (tagInfo.type == kTIFF_ByteType) && (tagInfo.count == 4) ) { const char * strIn = (const char *) tagInfo.dataPtr; char strOut[8]; strOut[0] = strIn[0]; strOut[2] = strIn[1]; strOut[4] = strIn[2]; strOut[6] = strIn[3]; strOut[1] = strOut[3] = strOut[5] = '.'; strOut[7] = 0; xmp->SetProperty ( kXMP_NS_EXIF, "GPSVersionID", strOut ); } // 2 GPSLatitude is a GPS coordinate master. found = exif.GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSLatitude, &tagInfo ); if ( found ) { ImportTIFF_GPSCoordinate ( exif, tagInfo, xmp, kXMP_NS_EXIF, "GPSLatitude" ); } // 4 GPSLongitude is a GPS coordinate master. found = exif.GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSLongitude, &tagInfo ); if ( found ) { ImportTIFF_GPSCoordinate ( exif, tagInfo, xmp, kXMP_NS_EXIF, "GPSLongitude" ); } // 7 GPSTimeStamp is a UTC time as 3 rationals, mated with the optional GPSDateStamp. found = exif.GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSTimeStamp, &tagInfo ); if ( found && (tagInfo.type == kTIFF_RationalType) && (tagInfo.count == 3) ) { ImportTIFF_GPSTimeStamp ( exif, tagInfo, xmp, kXMP_NS_EXIF, "GPSTimeStamp" ); } // 20 GPSDestLatitude is a GPS coordinate master. found = exif.GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSDestLatitude, &tagInfo ); if ( found ) { ImportTIFF_GPSCoordinate ( exif, tagInfo, xmp, kXMP_NS_EXIF, "GPSDestLatitude" ); } // 22 GPSDestLongitude is a GPS coordinate master. found = exif.GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSDestLongitude, &tagInfo ); if ( found ) { ImportTIFF_GPSCoordinate ( exif, tagInfo, xmp, kXMP_NS_EXIF, "GPSDestLongitude" ); } // 27 GPSProcessingMethod is a string with explicit encoding. found = exif.GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSProcessingMethod, &tagInfo ); if ( found ) { ImportTIFF_EncodedString ( exif, tagInfo, xmp, kXMP_NS_EXIF, "GPSProcessingMethod" ); } // 28 GPSAreaInformation is a string with explicit encoding. found = exif.GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSAreaInformation, &tagInfo ); if ( found ) { ImportTIFF_EncodedString ( exif, tagInfo, xmp, kXMP_NS_EXIF, "GPSAreaInformation" ); } } // PhotoDataUtils::Import2WayExif // ================================================================================================= // Import3WayDateTime // ================== static void Import3WayDateTime ( XMP_Uns16 exifTag, const TIFF_Manager & exif, const IPTC_Manager & iptc, SXMPMeta * xmp, int iptcDigestState, const IPTC_Manager & oldIPTC ) { XMP_Uns8 iptcDS; XMP_StringPtr xmpNS, xmpProp; if ( exifTag == kTIFF_DateTimeOriginal ) { iptcDS = kIPTC_DateCreated; xmpNS = kXMP_NS_Photoshop; xmpProp = "DateCreated"; } else if ( exifTag == kTIFF_DateTimeDigitized ) { iptcDS = kIPTC_DigitalCreateDate; xmpNS = kXMP_NS_XMP; xmpProp = "CreateDate"; } else { XMP_Throw ( "Unrecognized dateID", kXMPErr_BadParam ); } size_t iptcCount; bool haveXMP, haveExif, haveIPTC; // ! These are manipulated to simplify MWG-compliant logic. std::string xmpValue, exifValue, iptcValue; TIFF_Manager::TagInfo exifInfo; IPTC_Manager::DataSetInfo iptcInfo; // Get the basic info about available values. haveXMP = xmp->GetProperty ( xmpNS, xmpProp, &xmpValue, 0 ); iptcCount = PhotoDataUtils::GetNativeInfo ( iptc, iptcDS, iptcDigestState, haveXMP, &iptcInfo ); haveIPTC = (iptcCount > 0); XMP_Assert ( (iptcDigestState == kDigestMatches) ? (! haveIPTC) : true ); haveExif = (! haveXMP) && (! haveIPTC) && PhotoDataUtils::GetNativeInfo ( exif, kTIFF_ExifIFD, exifTag, &exifInfo ); XMP_Assert ( (! (haveExif & haveXMP)) & (! (haveExif & haveIPTC)) ); if ( haveIPTC ) { PhotoDataUtils::ImportIPTC_Date ( iptcDS, iptc, xmp ); } else if ( haveExif && (exifInfo.type == kTIFF_ASCIIType) ) { // Only import the Exif form if the non-TZ information differs from the XMP. TIFF_FileWriter exifFromXMP; TIFF_Manager::TagInfo infoFromXMP; ExportTIFF_Date ( *xmp, xmpNS, xmpProp, &exifFromXMP, exifTag ); bool foundFromXMP = exifFromXMP.GetTag ( kTIFF_ExifIFD, exifTag, &infoFromXMP ); if ( (! foundFromXMP) || (exifInfo.dataLen != infoFromXMP.dataLen) || (! XMP_LitNMatch ( (char*)exifInfo.dataPtr, (char*)infoFromXMP.dataPtr, exifInfo.dataLen )) ) { ImportTIFF_Date ( exif, exifInfo, xmp, xmpNS, xmpProp ); } } } // Import3WayDateTime // ================================================================================================= // PhotoDataUtils::Import3WayItems // =============================== // // Handle the imports that involve all 3 of Exif, IPTC, and XMP. There are only 4 properties with // 3-way mappings, copyright, description, creator, and date/time. Following the MWG guidelines, // this general policy is applied separately to each: // // If the new IPTC digest differs from the stored digest (favor IPTC over Exif and XMP) // If the IPTC value differs from the predicted old IPTC value // Import the IPTC value, including deleting the XMP // Else if the Exif is non-empty and differs from the XMP // Import the Exif value (does not delete existing XMP) // Else if the stored IPTC digest is missing (favor Exif over IPTC, or IPTC over missing XMP) // If the Exif is non-empty and differs from the XMP // Import the Exif value (does not delete existing XMP) // Else if the XMP is missing and the Exif is missing or empty // Import the IPTC value // Else (the new IPTC digest matches the stored digest - ignore the IPTC) // If the Exif is non-empty and differs from the XMP // Import the Exif value (does not delete existing XMP) // // Note that missing or empty Exif will never cause existing XMP to be deleted. This is a pragmatic // choice to improve compatibility with pre-MWG software. There are few Exif-only editors for these // 3-way properties, there are important existing IPTC-only editors. // ------------------------------------------------------------------------------------------------- void PhotoDataUtils::Import3WayItems ( const TIFF_Manager & exif, const IPTC_Manager & iptc, SXMPMeta * xmp, int iptcDigestState ) { size_t iptcCount; bool haveXMP, haveExif, haveIPTC; // ! These are manipulated to simplify MWG-compliant logic. std::string xmpValue, exifValue, iptcValue; TIFF_Manager::TagInfo exifInfo; IPTC_Manager::DataSetInfo iptcInfo; IPTC_Writer oldIPTC; if ( iptcDigestState == kDigestDiffers ) { PhotoDataUtils::ExportIPTC ( *xmp, &oldIPTC ); // Predict old IPTC DataSets based on the existing XMP. } // --------------------------------------------------------------------------------- // Process the copyright. Replace internal nuls in the Exif to "merge" the portions. // Get the basic info about available values. haveXMP = xmp->GetLocalizedText ( kXMP_NS_DC, "rights", "", "x-default", 0, &xmpValue, 0 ); iptcCount = PhotoDataUtils::GetNativeInfo ( iptc, kIPTC_CopyrightNotice, iptcDigestState, haveXMP, &iptcInfo ); haveIPTC = (iptcCount > 0); XMP_Assert ( (iptcDigestState == kDigestMatches) ? (! haveIPTC) : true ); haveExif = (! haveXMP) && (! haveIPTC) && PhotoDataUtils::GetNativeInfo ( exif, kTIFF_PrimaryIFD, kTIFF_Copyright, &exifInfo ); XMP_Assert ( (! (haveExif & haveXMP)) & (! (haveExif & haveIPTC)) ); if ( haveExif && (exifInfo.dataLen > 1) ) { // Replace internal nul characters with linefeed. for ( XMP_Uns32 i = 0; i < exifInfo.dataLen-1; ++i ) { if ( ((char*)exifInfo.dataPtr)[i] == 0 ) ((char*)exifInfo.dataPtr)[i] = 0x0A; } } if ( haveIPTC ) { PhotoDataUtils::ImportIPTC_LangAlt ( iptc, xmp, kIPTC_CopyrightNotice, kXMP_NS_DC, "rights" ); } else if ( haveExif && PhotoDataUtils::IsValueDifferent ( exifInfo, xmpValue, &exifValue ) ) { xmp->SetLocalizedText ( kXMP_NS_DC, "rights", "", "x-default", exifValue.c_str() ); } // ------------------------ // Process the description. // Get the basic info about available values. haveXMP = xmp->GetLocalizedText ( kXMP_NS_DC, "description", "", "x-default", 0, &xmpValue, 0 ); iptcCount = PhotoDataUtils::GetNativeInfo ( iptc, kIPTC_Description, iptcDigestState, haveXMP, &iptcInfo ); haveIPTC = (iptcCount > 0); XMP_Assert ( (iptcDigestState == kDigestMatches) ? (! haveIPTC) : true ); haveExif = (! haveXMP) && (! haveIPTC) && PhotoDataUtils::GetNativeInfo ( exif, kTIFF_PrimaryIFD, kTIFF_ImageDescription, &exifInfo ); XMP_Assert ( (! (haveExif & haveXMP)) & (! (haveExif & haveIPTC)) ); if ( haveIPTC ) { PhotoDataUtils::ImportIPTC_LangAlt ( iptc, xmp, kIPTC_Description, kXMP_NS_DC, "description" ); } else if ( haveExif && PhotoDataUtils::IsValueDifferent ( exifInfo, xmpValue, &exifValue ) ) { xmp->SetLocalizedText ( kXMP_NS_DC, "description", "", "x-default", exifValue.c_str() ); } // ------------------------------------------------------------------------------------------- // Process the creator. The XMP and IPTC are arrays, the Exif is a semicolon separated string. // Get the basic info about available values. haveXMP = xmp->DoesPropertyExist ( kXMP_NS_DC, "creator" ); haveExif = PhotoDataUtils::GetNativeInfo ( exif, kTIFF_PrimaryIFD, kTIFF_Artist, &exifInfo ); iptcCount = PhotoDataUtils::GetNativeInfo ( iptc, kIPTC_Creator, iptcDigestState, haveXMP, &iptcInfo ); haveIPTC = (iptcCount > 0); XMP_Assert ( (iptcDigestState == kDigestMatches) ? (! haveIPTC) : true ); haveExif = (! haveXMP) && (! haveIPTC) && PhotoDataUtils::GetNativeInfo ( exif, kTIFF_PrimaryIFD, kTIFF_Artist, &exifInfo ); XMP_Assert ( (! (haveExif & haveXMP)) & (! (haveExif & haveIPTC)) ); if ( haveIPTC ) { PhotoDataUtils::ImportIPTC_Array ( iptc, xmp, kIPTC_Creator, kXMP_NS_DC, "creator" ); } else if ( haveExif && PhotoDataUtils::IsValueDifferent ( exifInfo, xmpValue, &exifValue ) ) { SXMPUtils::SeparateArrayItems ( xmp, kXMP_NS_DC, "creator", kXMP_PropArrayIsOrdered, exifValue ); } // ------------------------------------------------------------------------------ // Process DateTimeDigitized; DateTimeOriginal and DateTime are 2-way. // *** Exif DateTimeOriginal <-> XMP exif:DateTimeOriginal // *** IPTC DateCreated <-> XMP photoshop:DateCreated // *** Exif DateTimeDigitized <-> IPTC DigitalCreateDate <-> XMP xmp:CreateDate // *** TIFF DateTime <-> XMP xmp:ModifyDate Import3WayDateTime ( kTIFF_DateTimeDigitized, exif, iptc, xmp, iptcDigestState, oldIPTC ); } // PhotoDataUtils::Import3WayItems // ================================================================================================= // ================================================================================================= // ================================================================================================= // ExportSingleTIFF // ================ // // This is only called when the XMP exists and will be exported. And only for standard mappings. // ! Only implemented for the types known to be needed. static void ExportSingleTIFF ( TIFF_Manager * tiff, XMP_Uns8 ifd, const TIFF_MappingToXMP & mapInfo, bool nativeEndian, const std::string & xmpValue ) { XMP_Assert ( (mapInfo.count == 1) || (mapInfo.type == kTIFF_ASCIIType) ); XMP_Assert ( mapInfo.name[0] != 0 ); // Must be a standard mapping. char nextChar; // Used to make sure sscanf consumes all of the string. switch ( mapInfo.type ) { case kTIFF_ByteType : { unsigned short binValue; int items = sscanf ( xmpValue.c_str(), "%hu%c", &binValue, &nextChar ); // AUDIT: Using xmpValue.c_str() is safe. if ( items != 1 ) return; // ? complain? notify client? tiff->SetTag_Byte ( ifd, mapInfo.id, (XMP_Uns8)binValue ); break; } case kTIFF_ShortType : { unsigned long binValue; int items = sscanf ( xmpValue.c_str(), "%lu%c", &binValue, &nextChar ); // AUDIT: Using xmpValue.c_str() is safe. if ( items != 1 ) return; // ? complain? notify client? tiff->SetTag_Short ( ifd, mapInfo.id, (XMP_Uns16)binValue ); break; } case kTIFF_ShortOrLongType : { unsigned long binValue; int items = sscanf ( xmpValue.c_str(), "%lu%c", &binValue, &nextChar ); // AUDIT: Using xmpValue.c_str() is safe. if ( items != 1 ) return; // ? complain? notify client? if ( binValue <= 0xFFFF ) { tiff->SetTag_Short ( ifd, mapInfo.id, (XMP_Uns16)binValue ); } else { tiff->SetTag_Long ( ifd, mapInfo.id, (XMP_Uns32)binValue ); } break; } case kTIFF_RationalType : { // The XMP is formatted as "num/denom". unsigned long num, denom; int items = sscanf ( xmpValue.c_str(), "%lu/%lu%c", &num, &denom, &nextChar ); // AUDIT: Using xmpValue.c_str() is safe. if ( items != 2 ) { if ( items != 1 ) return; // ? complain? notify client? denom = 1; // The XMP was just an integer, assume a denominator of 1. } tiff->SetTag_Rational ( ifd, mapInfo.id, (XMP_Uns32)num, (XMP_Uns32)denom ); break; } case kTIFF_SRationalType : { // The XMP is formatted as "num/denom". signed long num, denom; int items = sscanf ( xmpValue.c_str(), "%ld/%ld%c", &num, &denom, &nextChar ); // AUDIT: Using xmpValue.c_str() is safe. if ( items != 2 ) { if ( items != 1 ) return; // ? complain? notify client? denom = 1; // The XMP was just an integer, assume a denominator of 1. } tiff->SetTag_SRational ( ifd, mapInfo.id, (XMP_Int32)num, (XMP_Int32)denom ); break; } case kTIFF_ASCIIType : tiff->SetTag ( ifd, mapInfo.id, kTIFF_ASCIIType, (XMP_Uns32)(xmpValue.size()+1), xmpValue.c_str() ); break; default: XMP_Assert ( false ); // Force a debug assert for unexpected types. } } // ExportSingleTIFF // ================================================================================================= // ExportArrayTIFF // ================ // // This is only called when the XMP exists and will be exported. And only for standard mappings. // ! Only implemented for the types known to be needed. static void ExportArrayTIFF ( TIFF_Manager * tiff, XMP_Uns8 ifd, const TIFF_MappingToXMP & mapInfo, bool nativeEndian, const SXMPMeta & xmp, const char * xmpNS, const char * xmpArray ) { XMP_Assert ( (mapInfo.count != 1) && (mapInfo.type != kTIFF_ASCIIType) ); XMP_Assert ( mapInfo.name[0] != 0 ); // Must be a standard mapping. XMP_Assert ( mapInfo.type == kTIFF_ShortType ); // ! So far ISOSpeedRatings is the only standard array export. XMP_Assert ( xmp.DoesPropertyExist ( xmpNS, xmpArray ) ); if ( mapInfo.type != kTIFF_ShortType ) return; // ! So far ISOSpeedRatings is the only standard array export. size_t arraySize = xmp.CountArrayItems ( xmpNS, xmpArray ); if ( arraySize == 0 ) { tiff->DeleteTag ( ifd, mapInfo.id ); return; } std::vector vecValue; vecValue.assign ( arraySize, 0 ); XMP_Uns16 * binPtr = (XMP_Uns16*) &vecValue[0]; std::string itemPath; XMP_Int32 int32; XMP_Uns16 uns16; for ( size_t i = 1; i <= arraySize; ++i, ++binPtr ) { SXMPUtils::ComposeArrayItemPath ( xmpNS, xmpArray, (XMP_Index)i, &itemPath ); xmp.GetProperty_Int ( xmpNS, itemPath.c_str(), &int32, 0 ); uns16 = (XMP_Uns16)int32; if ( ! nativeEndian ) uns16 = Flip2 ( uns16 ); *binPtr = uns16; } tiff->SetTag ( ifd, mapInfo.id, kTIFF_ShortType, (XMP_Uns32)arraySize, &vecValue[0] ); } // ExportArrayTIFF // ================================================================================================= // ExportTIFF_StandardMappings // =========================== static void ExportTIFF_StandardMappings ( XMP_Uns8 ifd, TIFF_Manager * tiff, const SXMPMeta & xmp ) { const bool nativeEndian = tiff->IsNativeEndian(); TIFF_Manager::TagInfo tagInfo; std::string xmpValue; XMP_OptionBits xmpForm; const TIFF_MappingToXMP * mappings = 0; const char * xmpNS = 0; if ( ifd == kTIFF_PrimaryIFD ) { mappings = sPrimaryIFDMappings; xmpNS = kXMP_NS_TIFF; } else if ( ifd == kTIFF_ExifIFD ) { mappings = sExifIFDMappings; xmpNS = kXMP_NS_EXIF; } else if ( ifd == kTIFF_GPSInfoIFD ) { mappings = sGPSInfoIFDMappings; xmpNS = kXMP_NS_EXIF; // ! Yes, the GPS Info tags are in the exif: namespace. } else { XMP_Throw ( "Invalid IFD for standard mappings", kXMPErr_InternalFailure ); } for ( size_t i = 0; mappings[i].id != 0xFFFF; ++i ) { try { // Don't let errors with one stop the others. const TIFF_MappingToXMP & mapInfo = mappings[i]; if ( mapInfo.exportMode == kExport_Never ) continue; if ( mapInfo.name[0] == 0 ) continue; // Skip special mappings, handled higher up. bool haveTIFF = tiff->GetTag ( ifd, mapInfo.id, &tagInfo ); if ( haveTIFF && (mapInfo.exportMode == kExport_InjectOnly) ) continue; bool haveXMP = xmp.GetProperty ( xmpNS, mapInfo.name, &xmpValue, &xmpForm ); if ( ! haveXMP ) { if ( haveTIFF && (mapInfo.exportMode == kExport_Always) ) tiff->DeleteTag ( ifd, mapInfo.id ); } else { XMP_Assert ( tagInfo.type != kTIFF_UndefinedType ); // These must have a special mapping. if ( tagInfo.type == kTIFF_UndefinedType ) continue; const bool mapSingle = ((mapInfo.count == 1) || (mapInfo.type == kTIFF_ASCIIType)); if ( mapSingle ) { if ( ! XMP_PropIsSimple ( xmpForm ) ) continue; // ? Notify client? ExportSingleTIFF ( tiff, ifd, mapInfo, nativeEndian, xmpValue ); } else { if ( ! XMP_PropIsArray ( xmpForm ) ) continue; // ? Notify client? ExportArrayTIFF ( tiff, ifd, mapInfo, nativeEndian, xmp, xmpNS, mapInfo.name ); } } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } } // ExportTIFF_StandardMappings // ================================================================================================= // ExportTIFF_Date // =============== // // Convert an XMP date/time to an Exif 2.2 master date/time tag plus associated fractional seconds. // The Exif date/time part is a 20 byte ASCII value formatted as "YYYY:MM:DD HH:MM:SS" with a // terminating nul. The fractional seconds are a nul terminated ASCII string with possible space // padding. They are literally the fractional part, the digits that would be to the right of the // decimal point. static void ExportTIFF_Date ( const SXMPMeta & xmp, const char * xmpNS, const char * xmpProp, TIFF_Manager * tiff, XMP_Uns16 mainID ) { XMP_Uns8 mainIFD = kTIFF_ExifIFD; XMP_Uns16 fracID; switch ( mainID ) { case kTIFF_DateTime : mainIFD = kTIFF_PrimaryIFD; fracID = kTIFF_SubSecTime; break; case kTIFF_DateTimeOriginal : fracID = kTIFF_SubSecTimeOriginal; break; case kTIFF_DateTimeDigitized : fracID = kTIFF_SubSecTimeDigitized; break; } try { // Don't let errors with one stop the others. std::string xmpStr; bool foundXMP = xmp.GetProperty ( xmpNS, xmpProp, &xmpStr, 0 ); if ( ! foundXMP ) { tiff->DeleteTag ( mainIFD, mainID ); tiff->DeleteTag ( kTIFF_ExifIFD, fracID ); // ! The subseconds are always in the Exif IFD. return; } // Format using all of the numbers. Then overwrite blanks for missing fields. The fields // missing from the XMP are detected with length checks: YYYY-MM-DDThh:mm:ss // < 18 - no seconds // < 15 - no minutes // < 12 - no hours // < 9 - no day // < 6 - no month // < 1 - no year XMP_DateTime xmpBin; SXMPUtils::ConvertToDate ( xmpStr.c_str(), &xmpBin ); char buffer[24]; snprintf ( buffer, sizeof(buffer), "%04d:%02d:%02d %02d:%02d:%02d", // AUDIT: Use of sizeof(buffer) is safe. xmpBin.year, xmpBin.month, xmpBin.day, xmpBin.hour, xmpBin.minute, xmpBin.second ); size_t xmpLen = xmpStr.size(); if ( xmpLen < 18 ) { buffer[17] = buffer[18] = ' '; if ( xmpLen < 15 ) { buffer[14] = buffer[15] = ' '; if ( xmpLen < 12 ) { buffer[11] = buffer[12] = ' '; if ( xmpLen < 9 ) { buffer[8] = buffer[9] = ' '; if ( xmpLen < 6 ) { buffer[5] = buffer[6] = ' '; if ( xmpLen < 1 ) { buffer[0] = buffer[1] = buffer[2] = buffer[3] = ' '; } } } } } } tiff->SetTag_ASCII ( mainIFD, mainID, buffer ); if ( xmpBin.nanoSecond == 0 ) { tiff->DeleteTag ( kTIFF_ExifIFD, fracID ); } else { snprintf ( buffer, sizeof(buffer), "%09d", xmpBin.nanoSecond ); // AUDIT: Use of sizeof(buffer) is safe. for ( size_t i = strlen(buffer)-1; i > 0; --i ) { if ( buffer[i] != '0' ) break; buffer[i] = 0; // Strip trailing zero digits. } tiff->SetTag_ASCII ( kTIFF_ExifIFD, fracID, buffer ); // ! The subseconds are always in the Exif IFD. } } catch ( ... ) { // Do nothing, let other exports proceed. // ? Notify client? } } // ExportTIFF_Date // ================================================================================================= // ExportTIFF_ArrayASCII // ===================== // // Catenate all of the XMP array values into a string. Use a "; " separator for Artist, nul for others. static void ExportTIFF_ArrayASCII ( const SXMPMeta & xmp, const char * xmpNS, const char * xmpProp, TIFF_Manager * tiff, XMP_Uns8 ifd, XMP_Uns16 id ) { try { // Don't let errors with one stop the others. std::string itemValue, fullValue; XMP_OptionBits xmpFlags; bool foundXMP = xmp.GetProperty ( xmpNS, xmpProp, 0, &xmpFlags ); if ( ! foundXMP ) { tiff->DeleteTag ( ifd, id ); return; } if ( ! XMP_PropIsArray ( xmpFlags ) ) return; // ? Complain? Delete the tag? if ( id == kTIFF_Artist ) { SXMPUtils::CatenateArrayItems ( xmp, xmpNS, xmpProp, 0, 0, kXMP_PropArrayIsOrdered, &fullValue ); fullValue += '\x0'; // ! Need explicit final nul for SetTag below. } else { size_t count = xmp.CountArrayItems ( xmpNS, xmpProp ); for ( size_t i = 1; i <= count; ++i ) { // ! XMP arrays are indexed from 1. (void) xmp.GetArrayItem ( xmpNS, xmpProp, (XMP_Index)i, &itemValue, &xmpFlags ); if ( ! XMP_PropIsSimple ( xmpFlags ) ) continue; // ? Complain? fullValue.append ( itemValue ); fullValue.append ( 1, '\x0' ); } } tiff->SetTag ( ifd, id, kTIFF_ASCIIType, (XMP_Uns32)fullValue.size(), fullValue.c_str() ); // ! Already have trailing nul. } catch ( ... ) { // Do nothing, let other exports proceed. // ? Notify client? } } // ExportTIFF_ArrayASCII // ================================================================================================= // ExportTIFF_LocTextASCII // ====================== static void ExportTIFF_LocTextASCII ( const SXMPMeta & xmp, const char * xmpNS, const char * xmpProp, TIFF_Manager * tiff, XMP_Uns8 ifd, XMP_Uns16 id ) { try { // Don't let errors with one stop the others. std::string xmpValue; bool foundXMP = xmp.GetLocalizedText ( xmpNS, xmpProp, "", "x-default", 0, &xmpValue, 0 ); if ( ! foundXMP ) { tiff->DeleteTag ( ifd, id ); return; } tiff->SetTag ( ifd, id, kTIFF_ASCIIType, (XMP_Uns32)( xmpValue.size()+1 ), xmpValue.c_str() ); } catch ( ... ) { // Do nothing, let other exports proceed. // ? Notify client? } } // ExportTIFF_LocTextASCII // ================================================================================================= // ExportTIFF_EncodedString // ======================== static void ExportTIFF_EncodedString ( const SXMPMeta & xmp, const char * xmpNS, const char * xmpProp, TIFF_Manager * tiff, XMP_Uns8 ifd, XMP_Uns16 id, bool isLangAlt = false ) { try { // Don't let errors with one stop the others. std::string xmpValue; XMP_OptionBits xmpFlags; bool foundXMP = xmp.GetProperty ( xmpNS, xmpProp, &xmpValue, &xmpFlags ); if ( ! foundXMP ) { tiff->DeleteTag ( ifd, id ); return; } if ( ! isLangAlt ) { if ( ! XMP_PropIsSimple ( xmpFlags ) ) return; // ? Complain? Delete the tag? } else { if ( ! XMP_ArrayIsAltText ( xmpFlags ) ) return; // ? Complain? Delete the tag? bool ok = xmp.GetLocalizedText ( xmpNS, xmpProp, "", "x-default", 0, &xmpValue, 0 ); if ( ! ok ) return; // ? Complain? Delete the tag? } XMP_Uns8 encoding = kTIFF_EncodeASCII; for ( size_t i = 0; i < xmpValue.size(); ++i ) { if ( (XMP_Uns8)xmpValue[i] >= 0x80 ) { encoding = kTIFF_EncodeUnicode; break; } } tiff->SetTag_EncodedString ( ifd, id, xmpValue.c_str(), encoding ); } catch ( ... ) { // Do nothing, let other exports proceed. // ? Notify client? } } // ExportTIFF_EncodedString // ================================================================================================= // ExportTIFF_GPSCoordinate // ======================== // // The XMP format is either "deg,min,secR" or "deg,min.fracR", where 'R' is the reference direction, // 'N', 'S', 'E', or 'W'. The location gets output as ( deg/1, min/1, sec/1 ) for the first form, // and ( deg/1, minFrac/denom, 0/1 ) for the second form. // ! We arbitrarily limit the number of fractional minute digits to 6 to avoid overflow in the // ! combined numerator. But we don't otherwise check for overflow or range errors. static void ExportTIFF_GPSCoordinate ( const SXMPMeta & xmp, const char * xmpNS, const char * xmpProp, TIFF_Manager * tiff, XMP_Uns8 ifd, XMP_Uns16 _id ) { XMP_Uns16 refID = _id-1; // ! The GPS refs and locations are all tag N-1 and N pairs. XMP_Uns16 locID = _id; XMP_Assert ( (locID & 1) == 0 ); try { // Don't let errors with one stop the others. std::string xmpValue; XMP_OptionBits xmpFlags; bool foundXMP = xmp.GetProperty ( xmpNS, xmpProp, &xmpValue, &xmpFlags ); if ( ! foundXMP ) { tiff->DeleteTag ( ifd, refID ); tiff->DeleteTag ( ifd, locID ); return; } if ( ! XMP_PropIsSimple ( xmpFlags ) ) return; const char * chPtr = xmpValue.c_str(); XMP_Uns32 deg=0, minNum=0, minDenom=1, sec=0; for ( ; ('0' <= *chPtr) && (*chPtr <= '9'); ++chPtr ) deg = deg*10 + (*chPtr - '0'); if ( *chPtr != ',' ) return; // Bad XMP string. ++chPtr; // Skip the comma. for ( ; ('0' <= *chPtr) && (*chPtr <= '9'); ++chPtr ) minNum = minNum*10 + (*chPtr - '0'); if ( (*chPtr != ',') && (*chPtr != '.') ) return; // Bad XMP string. if ( *chPtr == ',' ) { ++chPtr; // Skip the comma. for ( ; ('0' <= *chPtr) && (*chPtr <= '9'); ++chPtr ) sec = sec*10 + (*chPtr - '0'); } else { XMP_Assert ( *chPtr == '.' ); ++chPtr; // Skip the period. for ( ; ('0' <= *chPtr) && (*chPtr <= '9'); ++chPtr ) { if ( minDenom > 100*1000 ) continue; // Don't accumulate any more digits. minDenom *= 10; minNum = minNum*10 + (*chPtr - '0'); } } if ( *(chPtr+1) != 0 ) return; // Bad XMP string. char ref[2]; ref[0] = *chPtr; ref[1] = 0; tiff->SetTag ( ifd, refID, kTIFF_ASCIIType, 2, &ref[0] ); XMP_Uns32 loc[6]; tiff->PutUns32 ( deg, &loc[0] ); tiff->PutUns32 ( 1, &loc[1] ); tiff->PutUns32 ( minNum, &loc[2] ); tiff->PutUns32 ( minDenom, &loc[3] ); tiff->PutUns32 ( sec, &loc[4] ); tiff->PutUns32 ( 1, &loc[5] ); tiff->SetTag ( ifd, locID, kTIFF_RationalType, 3, &loc[0] ); } catch ( ... ) { // Do nothing, let other exports proceed. // ? Notify client? } } // ExportTIFF_GPSCoordinate // ================================================================================================= // ExportTIFF_GPSTimeStamp // ======================= // // The Exif is in 2 tags, GPSTimeStamp and GPSDateStamp. The time is 3 rationals for the hour, minute, // and second in UTC. The date is a nul terminated string "YYYY:MM:DD". static const double kBillion = 1000.0*1000.0*1000.0; static const double mMaxSec = 4.0*kBillion - 1.0; static void ExportTIFF_GPSTimeStamp ( const SXMPMeta & xmp, const char * xmpNS, const char * xmpProp, TIFF_Manager * tiff ) { try { // Don't let errors with one stop the others. XMP_DateTime binXMP; bool foundXMP = xmp.GetProperty_Date ( xmpNS, xmpProp, &binXMP, 0 ); if ( ! foundXMP ) { tiff->DeleteTag ( kTIFF_GPSInfoIFD, kTIFF_GPSTimeStamp ); tiff->DeleteTag ( kTIFF_GPSInfoIFD, kTIFF_GPSDateStamp ); return; } SXMPUtils::ConvertToUTCTime ( &binXMP ); XMP_Uns32 exifTime[6]; tiff->PutUns32 ( binXMP.hour, &exifTime[0] ); tiff->PutUns32 ( 1, &exifTime[1] ); tiff->PutUns32 ( binXMP.minute, &exifTime[2] ); tiff->PutUns32 ( 1, &exifTime[3] ); if ( binXMP.nanoSecond == 0 ) { tiff->PutUns32 ( binXMP.second, &exifTime[4] ); tiff->PutUns32 ( 1, &exifTime[5] ); } else { double fSec = (double)binXMP.second + ((double)binXMP.nanoSecond / kBillion ); XMP_Uns32 denom = 1000*1000; // Choose microsecond resolution by default. TIFF_Manager::TagInfo oldInfo; bool hadExif = tiff->GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSTimeStamp, &oldInfo ); if ( hadExif && (oldInfo.type == kTIFF_RationalType) && (oldInfo.count == 3) ) { XMP_Uns32 oldDenom = tiff->GetUns32 ( &(((XMP_Uns32*)oldInfo.dataPtr)[5]) ); if ( oldDenom != 1 ) denom = oldDenom; } fSec *= denom; while ( fSec > mMaxSec ) { fSec /= 10; denom /= 10; } tiff->PutUns32 ( (XMP_Uns32)fSec, &exifTime[4] ); tiff->PutUns32 ( denom, &exifTime[5] ); } tiff->SetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSTimeStamp, kTIFF_RationalType, 3, &exifTime[0] ); char exifDate[16]; // AUDIT: Long enough, only need 11. snprintf ( exifDate, 12, "%04d:%02d:%02d", binXMP.year, binXMP.month, binXMP.day ); if ( exifDate[10] == 0 ) { // Make sure there is no value overflow. tiff->SetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSDateStamp, kTIFF_ASCIIType, 11, exifDate ); } } catch ( ... ) { // Do nothing, let other exports proceed. // ? Notify client? } } // ExportTIFF_GPSTimeStamp // ================================================================================================= // ================================================================================================= // ================================================================================================= // PhotoDataUtils::ExportExif // ========================== void PhotoDataUtils::ExportExif ( SXMPMeta * xmp, TIFF_Manager * exif ) { bool haveXMP, haveExif; std::string xmpValue; XMP_Int32 int32; XMP_Uns8 uns8; // Do all of the table driven standard exports. ExportTIFF_StandardMappings ( kTIFF_PrimaryIFD, exif, *xmp ); ExportTIFF_StandardMappings ( kTIFF_ExifIFD, exif, *xmp ); ExportTIFF_StandardMappings ( kTIFF_GPSInfoIFD, exif, *xmp ); // Export dc:description to TIFF ImageDescription, and exif:UserComment to EXIF UserComment. // *** This is not following the MWG guidelines. The policy here tries to be more backward compatible. ExportTIFF_LocTextASCII ( *xmp, kXMP_NS_DC, "description", exif, kTIFF_PrimaryIFD, kTIFF_ImageDescription ); ExportTIFF_EncodedString ( *xmp, kXMP_NS_EXIF, "UserComment", exif, kTIFF_ExifIFD, kTIFF_UserComment, true /* isLangAlt */ ); // Export all of the date/time tags. // ! Special case: Don't create Exif DateTimeDigitized. This can avoid PSD full rewrite due to // ! new mapping from xmp:CreateDate. if ( exif->GetTag ( kTIFF_ExifIFD, kTIFF_DateTimeDigitized, 0 ) ) { ExportTIFF_Date ( *xmp, kXMP_NS_XMP, "CreateDate", exif, kTIFF_DateTimeDigitized ); } ExportTIFF_Date ( *xmp, kXMP_NS_EXIF, "DateTimeOriginal", exif, kTIFF_DateTimeOriginal ); ExportTIFF_Date ( *xmp, kXMP_NS_XMP, "ModifyDate", exif, kTIFF_DateTime ); // 34855 ISOSpeedRatings has special cases for ISO over 65535. The tag is SHORT, some cameras // omit the tag and some write 65535, all put the real ISO in MakerNote - which ACR might // extract and leave in the XMP. There are 2 export cases: // 1. No XMP property, or one or more of the XMP values are over 65535: // Leave both the XMP and native tag alone. // 1. Have XMP property and all of the XMP values are under 65535: // Leave existing native tag, else export; strip the XMP either way. haveXMP = xmp->DoesPropertyExist ( kXMP_NS_EXIF, "ISOSpeedRatings" ); if ( haveXMP ) { XMP_Index i, count; std::string isoValue; bool haveHighISO = false; for ( i = 1, count = xmp->CountArrayItems ( kXMP_NS_EXIF, "ISOSpeedRatings" ); i <= count; ++i ) { xmp->GetArrayItem ( kXMP_NS_EXIF, "ISOSpeedRatings", i, &isoValue, 0 ); if ( SXMPUtils::ConvertToInt ( isoValue.c_str() ) > 0xFFFF ) { haveHighISO = true; break; } } if ( ! haveHighISO ) { haveExif = exif->GetTag ( kTIFF_ExifIFD, kTIFF_ISOSpeedRatings, 0 ); if ( ! haveExif ) { // ISOSpeedRatings has an inject-only mapping. ExportArrayTIFF ( exif, kTIFF_ExifIFD, kISOSpeedMapping, exif->IsNativeEndian(), *xmp, kXMP_NS_EXIF, "ISOSpeedRatings" ); } xmp->DeleteProperty ( kXMP_NS_EXIF, "ISOSpeedRatings"); } } // Export the remaining TIFF, Exif, and GPS IFD tags. ExportTIFF_ArrayASCII ( *xmp, kXMP_NS_DC, "creator", exif, kTIFF_PrimaryIFD, kTIFF_Artist ); ExportTIFF_LocTextASCII ( *xmp, kXMP_NS_DC, "rights", exif, kTIFF_PrimaryIFD, kTIFF_Copyright ); haveXMP = xmp->GetProperty ( kXMP_NS_EXIF, "ExifVersion", &xmpValue, 0 ); if ( haveXMP && (xmpValue.size() == 4) && (! exif->GetTag ( kTIFF_ExifIFD, kTIFF_ExifVersion, 0 )) ) { // 36864 ExifVersion is 4 "undefined" ASCII characters. exif->SetTag ( kTIFF_ExifIFD, kTIFF_ExifVersion, kTIFF_UndefinedType, 4, xmpValue.data() ); } haveXMP = xmp->DoesPropertyExist ( kXMP_NS_EXIF, "ComponentsConfiguration" ); if ( haveXMP && (xmp->CountArrayItems ( kXMP_NS_EXIF, "ComponentsConfiguration" ) == 4) && (! exif->GetTag ( kTIFF_ExifIFD, kTIFF_ComponentsConfiguration, 0 )) ) { // 37121 ComponentsConfiguration is an array of 4 "undefined" UInt8 bytes. XMP_Uns8 compConfig[4]; xmp->GetProperty_Int ( kXMP_NS_EXIF, "ComponentsConfiguration[1]", &int32, 0 ); compConfig[0] = (XMP_Uns8)int32; xmp->GetProperty_Int ( kXMP_NS_EXIF, "ComponentsConfiguration[2]", &int32, 0 ); compConfig[1] = (XMP_Uns8)int32; xmp->GetProperty_Int ( kXMP_NS_EXIF, "ComponentsConfiguration[3]", &int32, 0 ); compConfig[2] = (XMP_Uns8)int32; xmp->GetProperty_Int ( kXMP_NS_EXIF, "ComponentsConfiguration[4]", &int32, 0 ); compConfig[3] = (XMP_Uns8)int32; exif->SetTag ( kTIFF_ExifIFD, kTIFF_ComponentsConfiguration, kTIFF_UndefinedType, 4, &compConfig[0] ); } haveXMP = xmp->DoesPropertyExist ( kXMP_NS_EXIF, "Flash" ); if ( haveXMP && (! exif->GetTag ( kTIFF_ExifIFD, kTIFF_Flash, 0 )) ) { // 37385 Flash is a UInt16 collection of bit fields and is mapped to a struct in XMP. XMP_Uns16 binFlash = 0; bool field; haveXMP = xmp->GetProperty_Bool ( kXMP_NS_EXIF, "Flash/exif:Fired", &field, 0 ); if ( haveXMP & field ) binFlash |= 0x0001; haveXMP = xmp->GetProperty_Int ( kXMP_NS_EXIF, "Flash/exif:Return", &int32, 0 ); if ( haveXMP ) binFlash |= (int32 & 3) << 1; haveXMP = xmp->GetProperty_Int ( kXMP_NS_EXIF, "Flash/exif:Mode", &int32, 0 ); if ( haveXMP ) binFlash |= (int32 & 3) << 3; haveXMP = xmp->GetProperty_Bool ( kXMP_NS_EXIF, "Flash/exif:Function", &field, 0 ); if ( haveXMP & field ) binFlash |= 0x0020; haveXMP = xmp->GetProperty_Bool ( kXMP_NS_EXIF, "Flash/exif:RedEyeMode", &field, 0 ); if ( haveXMP & field ) binFlash |= 0x0040; exif->SetTag_Short ( kTIFF_ExifIFD, kTIFF_Flash, binFlash ); } haveXMP = xmp->GetProperty_Int ( kXMP_NS_EXIF, "FileSource", &int32, 0 ); if ( haveXMP && (! exif->GetTag ( kTIFF_ExifIFD, kTIFF_FileSource, 0 )) ) { // 41728 FileSource is an "undefined" UInt8. uns8 = (XMP_Uns8)int32; exif->SetTag ( kTIFF_ExifIFD, kTIFF_FileSource, kTIFF_UndefinedType, 1, &uns8 ); } haveXMP = xmp->GetProperty_Int ( kXMP_NS_EXIF, "SceneType", &int32, 0 ); if ( haveXMP && (! exif->GetTag ( kTIFF_ExifIFD, kTIFF_SceneType, 0 )) ) { // 41729 SceneType is an "undefined" UInt8. uns8 = (XMP_Uns8)int32; exif->SetTag ( kTIFF_ExifIFD, kTIFF_SceneType, kTIFF_UndefinedType, 1, &uns8 ); } // *** Deferred inject-only tags: SpatialFrequencyResponse, DeviceSettingDescription, CFAPattern haveXMP = xmp->GetProperty ( kXMP_NS_EXIF, "GPSVersionID", &xmpValue, 0 ); // This is inject-only. if ( haveXMP && (xmpValue.size() == 7) && (! exif->GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSVersionID, 0 )) ) { char gpsID[4]; // 0 GPSVersionID is 4 UInt8 bytes and mapped in XMP as "n.n.n.n". gpsID[0] = xmpValue[0]; gpsID[1] = xmpValue[2]; gpsID[2] = xmpValue[4]; gpsID[3] = xmpValue[6]; exif->SetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSVersionID, kTIFF_ByteType, 4, &gpsID[0] ); } ExportTIFF_GPSCoordinate ( *xmp, kXMP_NS_EXIF, "GPSLatitude", exif, kTIFF_GPSInfoIFD, kTIFF_GPSLatitude ); ExportTIFF_GPSCoordinate ( *xmp, kXMP_NS_EXIF, "GPSLongitude", exif, kTIFF_GPSInfoIFD, kTIFF_GPSLongitude ); ExportTIFF_GPSTimeStamp ( *xmp, kXMP_NS_EXIF, "GPSTimeStamp", exif ); // The following GPS tags are inject-only. haveXMP = xmp->DoesPropertyExist ( kXMP_NS_EXIF, "GPSDestLatitude" ); if ( haveXMP && (! exif->GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSDestLatitude, 0 )) ) { ExportTIFF_GPSCoordinate ( *xmp, kXMP_NS_EXIF, "GPSDestLatitude", exif, kTIFF_GPSInfoIFD, kTIFF_GPSDestLatitude ); } haveXMP = xmp->DoesPropertyExist ( kXMP_NS_EXIF, "GPSDestLongitude" ); if ( haveXMP && (! exif->GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSDestLongitude, 0 )) ) { ExportTIFF_GPSCoordinate ( *xmp, kXMP_NS_EXIF, "GPSDestLongitude", exif, kTIFF_GPSInfoIFD, kTIFF_GPSDestLongitude ); } haveXMP = xmp->GetProperty ( kXMP_NS_EXIF, "GPSProcessingMethod", &xmpValue, 0 ); if ( haveXMP && (! xmpValue.empty()) && (! exif->GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSProcessingMethod, 0 )) ) { // 27 GPSProcessingMethod is a string with explicit encoding. ExportTIFF_EncodedString ( *xmp, kXMP_NS_EXIF, "GPSProcessingMethod", exif, kTIFF_GPSInfoIFD, kTIFF_GPSProcessingMethod ); } haveXMP = xmp->GetProperty ( kXMP_NS_EXIF, "GPSAreaInformation", &xmpValue, 0 ); if ( haveXMP && (! xmpValue.empty()) && (! exif->GetTag ( kTIFF_GPSInfoIFD, kTIFF_GPSAreaInformation, 0 )) ) { // 28 GPSAreaInformation is a string with explicit encoding. ExportTIFF_EncodedString ( *xmp, kXMP_NS_EXIF, "GPSAreaInformation", exif, kTIFF_GPSInfoIFD, kTIFF_GPSAreaInformation ); } } // PhotoDataUtils::ExportExif exempi-2.2.1/source/XMPFiles/FormatSupport/MacScriptExtracts.h0000664000175000017500000003175712150230672021271 00000000000000#ifndef __MacScriptExtracts__ #define __MacScriptExtracts__ // Extracts of script (smXyz) and language (langXyz) enums from Apple's old Script.h. // These are used to support "traditional" QuickTime metadata processing. /* Script codes: These specify a Mac OS encoding that is related to a FOND ID range. Some of the encodings have several variants (e.g. for different localized systems) which all share the same script code. Not all of these script codes are currently supported by Apple software. Notes: - Script code 0 (smRoman) is also used (instead of smGreek) for the Greek encoding in the Greek localized system. - Script code 28 (smEthiopic) is also used for the Inuit encoding in the Inuktitut system. */ enum { smRoman = 0, smJapanese = 1, smTradChinese = 2, /* Traditional Chinese*/ smKorean = 3, smArabic = 4, smHebrew = 5, smGreek = 6, smCyrillic = 7, smRSymbol = 8, /* Right-left symbol*/ smDevanagari = 9, smGurmukhi = 10, smGujarati = 11, smOriya = 12, smBengali = 13, smTamil = 14, smTelugu = 15, smKannada = 16, /* Kannada/Kanarese*/ smMalayalam = 17, smSinhalese = 18, smBurmese = 19, smKhmer = 20, /* Khmer/Cambodian*/ smThai = 21, smLao = 22, smGeorgian = 23, smArmenian = 24, smSimpChinese = 25, /* Simplified Chinese*/ smTibetan = 26, smMongolian = 27, smEthiopic = 28, smGeez = 28, /* Synonym for smEthiopic*/ smCentralEuroRoman = 29, /* For Czech, Slovak, Polish, Hungarian, Baltic langs*/ smVietnamese = 30, smExtArabic = 31, /* extended Arabic*/ smUninterp = 32 /* uninterpreted symbols, e.g. palette symbols*/ }; /* Extended script code for full Unicode input*/ enum { smUnicodeScript = 0x7E }; /* Obsolete script code names (kept for backward compatibility):*/ enum { smChinese = 2, /* (Use smTradChinese or smSimpChinese)*/ smRussian = 7, /* Use smCyrillic*/ /* smMaldivian = 25: deleted, no code for Maldivian*/ smLaotian = 22, /* Use smLao */ smAmharic = 28, /* Use smEthiopic or smGeez*/ smSlavic = 29, /* Use smCentralEuroRoman*/ smEastEurRoman = 29, /* Use smCentralEuroRoman*/ smSindhi = 31, /* Use smExtArabic*/ smKlingon = 32 }; /* Language codes: These specify a language implemented using a particular Mac OS encoding. Not all of these language codes are currently supported by Apple software. */ enum { langEnglish = 0, /* smRoman script*/ langFrench = 1, /* smRoman script*/ langGerman = 2, /* smRoman script*/ langItalian = 3, /* smRoman script*/ langDutch = 4, /* smRoman script*/ langSwedish = 5, /* smRoman script*/ langSpanish = 6, /* smRoman script*/ langDanish = 7, /* smRoman script*/ langPortuguese = 8, /* smRoman script*/ langNorwegian = 9, /* (Bokmal) smRoman script*/ langHebrew = 10, /* smHebrew script*/ langJapanese = 11, /* smJapanese script*/ langArabic = 12, /* smArabic script*/ langFinnish = 13, /* smRoman script*/ langGreek = 14, /* Greek script (monotonic) using smRoman script code*/ langIcelandic = 15, /* modified smRoman/Icelandic script*/ langMaltese = 16, /* Roman script*/ langTurkish = 17, /* modified smRoman/Turkish script*/ langCroatian = 18, /* modified smRoman/Croatian script*/ langTradChinese = 19, /* Chinese (Mandarin) in traditional characters*/ langUrdu = 20, /* smArabic script*/ langHindi = 21, /* smDevanagari script*/ langThai = 22, /* smThai script*/ langKorean = 23 /* smKorean script*/ }; enum { langLithuanian = 24, /* smCentralEuroRoman script*/ langPolish = 25, /* smCentralEuroRoman script*/ langHungarian = 26, /* smCentralEuroRoman script*/ langEstonian = 27, /* smCentralEuroRoman script*/ langLatvian = 28, /* smCentralEuroRoman script*/ langSami = 29, /* language of the Sami people of N. Scandinavia */ langFaroese = 30, /* modified smRoman/Icelandic script */ langFarsi = 31, /* modified smArabic/Farsi script*/ langPersian = 31, /* Synonym for langFarsi*/ langRussian = 32, /* smCyrillic script*/ langSimpChinese = 33, /* Chinese (Mandarin) in simplified characters*/ langFlemish = 34, /* smRoman script*/ langIrishGaelic = 35, /* smRoman or modified smRoman/Celtic script (without dot above) */ langAlbanian = 36, /* smRoman script*/ langRomanian = 37, /* modified smRoman/Romanian script*/ langCzech = 38, /* smCentralEuroRoman script*/ langSlovak = 39, /* smCentralEuroRoman script*/ langSlovenian = 40, /* modified smRoman/Croatian script*/ langYiddish = 41, /* smHebrew script*/ langSerbian = 42, /* smCyrillic script*/ langMacedonian = 43, /* smCyrillic script*/ langBulgarian = 44, /* smCyrillic script*/ langUkrainian = 45, /* modified smCyrillic/Ukrainian script*/ langByelorussian = 46, /* smCyrillic script*/ langBelorussian = 46 /* Synonym for langByelorussian */ }; enum { langUzbek = 47, /* Cyrillic script*/ langKazakh = 48, /* Cyrillic script*/ langAzerbaijani = 49, /* Azerbaijani in Cyrillic script*/ langAzerbaijanAr = 50, /* Azerbaijani in Arabic script*/ langArmenian = 51, /* smArmenian script*/ langGeorgian = 52, /* smGeorgian script*/ langMoldavian = 53, /* smCyrillic script*/ langKirghiz = 54, /* Cyrillic script*/ langTajiki = 55, /* Cyrillic script*/ langTurkmen = 56, /* Cyrillic script*/ langMongolian = 57, /* Mongolian in smMongolian script*/ langMongolianCyr = 58, /* Mongolian in Cyrillic script*/ langPashto = 59, /* Arabic script*/ langKurdish = 60, /* smArabic script*/ langKashmiri = 61, /* Arabic script*/ langSindhi = 62, /* Arabic script*/ langTibetan = 63, /* smTibetan script*/ langNepali = 64, /* smDevanagari script*/ langSanskrit = 65, /* smDevanagari script*/ langMarathi = 66, /* smDevanagari script*/ langBengali = 67, /* smBengali script*/ langAssamese = 68, /* smBengali script*/ langGujarati = 69, /* smGujarati script*/ langPunjabi = 70 /* smGurmukhi script*/ }; enum { langOriya = 71, /* smOriya script*/ langMalayalam = 72, /* smMalayalam script*/ langKannada = 73, /* smKannada script*/ langTamil = 74, /* smTamil script*/ langTelugu = 75, /* smTelugu script*/ langSinhalese = 76, /* smSinhalese script*/ langBurmese = 77, /* smBurmese script*/ langKhmer = 78, /* smKhmer script*/ langLao = 79, /* smLao script*/ langVietnamese = 80, /* smVietnamese script*/ langIndonesian = 81, /* smRoman script*/ langTagalog = 82, /* Roman script*/ langMalayRoman = 83, /* Malay in smRoman script*/ langMalayArabic = 84, /* Malay in Arabic script*/ langAmharic = 85, /* smEthiopic script*/ langTigrinya = 86, /* smEthiopic script*/ langOromo = 87, /* smEthiopic script*/ langSomali = 88, /* smRoman script*/ langSwahili = 89, /* smRoman script*/ langKinyarwanda = 90, /* smRoman script*/ langRuanda = 90, /* synonym for langKinyarwanda*/ langRundi = 91, /* smRoman script*/ langNyanja = 92, /* smRoman script*/ langChewa = 92, /* synonym for langNyanja*/ langMalagasy = 93, /* smRoman script*/ langEsperanto = 94 /* Roman script*/ }; enum { langWelsh = 128, /* modified smRoman/Celtic script*/ langBasque = 129, /* smRoman script*/ langCatalan = 130, /* smRoman script*/ langLatin = 131, /* smRoman script*/ langQuechua = 132, /* smRoman script*/ langGuarani = 133, /* smRoman script*/ langAymara = 134, /* smRoman script*/ langTatar = 135, /* Cyrillic script*/ langUighur = 136, /* Arabic script*/ langDzongkha = 137, /* (lang of Bhutan) smTibetan script*/ langJavaneseRom = 138, /* Javanese in smRoman script*/ langSundaneseRom = 139, /* Sundanese in smRoman script*/ langGalician = 140, /* smRoman script*/ langAfrikaans = 141 /* smRoman script */ }; enum { langBreton = 142, /* smRoman or modified smRoman/Celtic script */ langInuktitut = 143, /* Inuit script using smEthiopic script code */ langScottishGaelic = 144, /* smRoman or modified smRoman/Celtic script */ langManxGaelic = 145, /* smRoman or modified smRoman/Celtic script */ langIrishGaelicScript = 146, /* modified smRoman/Gaelic script (using dot above) */ langTongan = 147, /* smRoman script */ langGreekAncient = 148, /* Classical Greek, polytonic orthography */ langGreenlandic = 149, /* smRoman script */ langAzerbaijanRoman = 150, /* Azerbaijani in Roman script */ langNynorsk = 151 /* Norwegian Nyorsk in smRoman*/ }; enum { langUnspecified = 32767 /* Special code for use in resources (such as 'itlm') */ }; /* Obsolete language code names (kept for backward compatibility): Misspelled, ambiguous, misleading, considered pejorative, archaic, etc. */ enum { langPortugese = 8, /* Use langPortuguese*/ langMalta = 16, /* Use langMaltese*/ langYugoslavian = 18, /* (use langCroatian, langSerbian, etc.)*/ langChinese = 19, /* (use langTradChinese or langSimpChinese)*/ langLettish = 28, /* Use langLatvian */ langLapponian = 29, /* Use langSami*/ langLappish = 29, /* Use langSami*/ langSaamisk = 29, /* Use langSami */ langFaeroese = 30, /* Use langFaroese */ langIrish = 35, /* Use langIrishGaelic */ langGalla = 87, /* Use langOromo */ langAfricaans = 141, /* Use langAfrikaans */ langGreekPoly = 148 /* Use langGreekAncient*/ }; #endif /* __MacScriptExtracts__ */ exempi-2.2.1/source/XMPFiles/FormatSupport/ASF_Support.hpp0000664000175000017500000001732012150230672020361 00000000000000#ifndef __ASF_Support_hpp__ #define __ASF_Support_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "XMPFiles_Impl.hpp" #include "Reconcile_Impl.hpp" // currently exclude LicenseURL from reconciliation #define Exclude_LicenseURL_Recon 1 #define EXCLUDE_LICENSEURL_RECON 1 // Defines for platforms other than Win #if ! XMP_WinBuild typedef struct _GUID { XMP_Uns32 Data1; XMP_Uns16 Data2; XMP_Uns16 Data3; XMP_Uns8 Data4[8]; } GUID; int IsEqualGUID ( const GUID& guid1, const GUID& guid2 ); static const GUID GUID_NULL = { 0x0, 0x0, 0x0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } }; #endif // header object static const GUID ASF_Header_Object = { MakeUns32LE(0x75b22630), MakeUns16LE(0x668e), MakeUns16LE(0x11cf), { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c } }; // contains ... static const GUID ASF_File_Properties_Object = { MakeUns32LE(0x8cabdca1), MakeUns16LE(0xa947), MakeUns16LE(0x11cf), { 0x8e, 0xe4, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65 } }; static const GUID ASF_Content_Description_Object = { MakeUns32LE(0x75b22633), MakeUns16LE(0x668e), MakeUns16LE(0x11cf), { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c } }; static const GUID ASF_Content_Branding_Object = { MakeUns32LE(0x2211b3fa), MakeUns16LE(0xbd23), MakeUns16LE(0x11d2), { 0xb4, 0xb7, 0x00, 0xa0, 0xc9, 0x55, 0xfc, 0x6e } }; static const GUID ASF_Content_Encryption_Object = { MakeUns32LE(0x2211b3fb), MakeUns16LE(0xbd23), MakeUns16LE(0x11d2), { 0xb4, 0xb7, 0x00, 0xa0, 0xc9, 0x55, 0xfc, 0x6e } }; // padding // Remark: regarding to Microsofts spec only the ASF_Header_Object contains a ASF_Padding_Object // Real world files show, that the ASF_Header_Extension_Object contains a ASF_Padding_Object static const GUID ASF_Header_Extension_Object = { MakeUns32LE(0x5fbf03b5), MakeUns16LE(0xa92e), MakeUns16LE(0x11cf), { 0x8e, 0xe3, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65 } }; static const GUID ASF_Padding_Object = { MakeUns32LE(0x1806d474), MakeUns16LE(0xcadf), MakeUns16LE(0x4509), { 0xa4, 0xba, 0x9a, 0xab, 0xcb, 0x96, 0xaa, 0xe8 } }; // data object static const GUID ASF_Data_Object = { MakeUns32LE(0x75b22636), MakeUns16LE(0x668e), MakeUns16LE(0x11cf), { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c } }; // XMP object static const GUID ASF_XMP_Metadata = { MakeUns32LE(0xbe7acfcb), MakeUns16LE(0x97a9), MakeUns16LE(0x42e8), { 0x9c, 0x71, 0x99, 0x94, 0x91, 0xe3, 0xaf, 0xac } }; static const int guidLen = sizeof(GUID); typedef struct _ASF_ObjectBase { GUID guid; XMP_Uns64 size; } ASF_ObjectBase; static const int kASF_ObjectBaseLen = sizeof(ASF_ObjectBase); // ================================================================================================= class ASF_LegacyManager { public: enum objectType { objectFileProperties = 1 << 0, objectContentDescription = 1 << 1, objectContentBranding = 1 << 2, objectContentEncryption = 1 << 3 }; enum minObjectSize { sizeContentDescription = 34, sizeContentBranding = 40, sizeContentEncryption = 40 }; enum fieldType { // File_Properties_Object fieldCreationDate = 0, // Content_Description_Object fieldTitle, fieldAuthor, fieldCopyright, fieldDescription, // Content_Branding_Object fieldCopyrightURL, #if ! Exclude_LicenseURL_Recon // Content_Encryption_Object fieldLicenseURL, #endif // last fieldLast }; ASF_LegacyManager(); virtual ~ASF_LegacyManager(); bool SetField ( fieldType field, const std::string& value ); std::string GetField ( fieldType field ); unsigned int GetFieldMaxSize ( fieldType field ); void SetObjectExists ( objectType object ); void SetBroadcast ( const bool broadcast ); bool GetBroadcast(); void ComputeDigest(); bool CheckDigest ( const SXMPMeta& xmp ); void SetDigest ( SXMPMeta* xmp ); void ImportLegacy ( SXMPMeta* xmp ); int ExportLegacy ( const SXMPMeta& xmp ); bool hasLegacyChanged(); XMP_Int64 getLegacyDiff(); int changedObjects(); void SetPadding ( XMP_Int64 padding ); XMP_Int64 GetPadding(); private: typedef std::vector TFields; TFields fields; bool broadcastSet; std::string digestStr; bool digestComputed; bool imported; int objectsExisting; int objectsToExport; XMP_Int64 legacyDiff; XMP_Int64 padding; static std::string NormalizeStringDisplayASCII ( std::string& operand ); static std::string NormalizeStringTrailingNull ( std::string& operand ); static void ConvertMSDateToISODate ( std::string& source, std::string* dest ); static void ConvertISODateToMSDate ( std::string& source, std::string* dest ); static int DaysInMonth ( XMP_Int32 year, XMP_Int32 month ); static bool IsLeapYear ( long year ); }; // class ASF_LegacyManager // ================================================================================================= class ASF_Support { public: class ObjectData { public: ObjectData() : pos(0), len(0), guid(GUID_NULL), xmp(false) {} virtual ~ObjectData() {} XMP_Uns64 pos; // file offset of object XMP_Uns64 len; // length of object data GUID guid; // object GUID bool xmp; // object with XMP ? }; typedef std::vector ObjectVector; typedef ObjectVector::iterator ObjectIterator; class ObjectState { public: ObjectState() : xmpPos(0), xmpLen(0), xmpIsLastObject(false), broadcast(false) {} virtual ~ObjectState() {} XMP_Uns64 xmpPos; XMP_Uns64 xmpLen; bool xmpIsLastObject; bool broadcast; ObjectData xmpObject; ObjectVector objects; }; ASF_Support(); ASF_Support ( ASF_LegacyManager* legacyManager ); virtual ~ASF_Support(); long OpenASF ( LFA_FileRef fileRef, ObjectState & inOutObjectState ); bool ReadObject ( LFA_FileRef fileRef, ObjectState & inOutObjectState, XMP_Uns64 * objectLength, XMP_Uns64 & inOutPosition ); bool ReadHeaderObject ( LFA_FileRef fileRef, ObjectState& inOutObjectState, const ObjectData& newObject ); bool WriteHeaderObject ( LFA_FileRef sourceRef, LFA_FileRef destRef, const ObjectData& object, ASF_LegacyManager& legacyManager, bool usePadding ); bool UpdateHeaderObject ( LFA_FileRef fileRef, const ObjectData& object, ASF_LegacyManager& legacyManager ); bool UpdateFileSize ( LFA_FileRef fileRef ); bool ReadHeaderExtensionObject ( LFA_FileRef fileRef, ObjectState& inOutObjectState, const XMP_Uns64& pos, const ASF_ObjectBase& objectBase ); static bool WriteHeaderExtensionObject ( const std::string& buffer, std::string* header, const ASF_ObjectBase& objectBase, const int reservePadding ); static bool CreatePaddingObject ( std::string* header, const XMP_Uns64 size ); static bool WriteXMPObject ( LFA_FileRef fileRef, XMP_Uns32 len, const char* inBuffer ); static bool UpdateXMPObject ( LFA_FileRef fileRef, const ObjectData& object, XMP_Uns32 len, const char * inBuffer ); static bool CopyObject ( LFA_FileRef sourceRef, LFA_FileRef destRef, const ObjectData& object ); static bool ReadBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns64 len, char * outBuffer ); static bool WriteBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns32 len, const char * inBuffer ); private: ASF_LegacyManager* legacyManager; XMP_Uns64 posFileSizeInfo; static std::string ReplaceString ( std::string& operand, std::string& str, int offset, int count ); }; // class ASF_Support // ================================================================================================= #endif // __ASF_Support_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/RIFF.cpp0000664000175000017500000007231512150230673016743 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2009 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= // must have access to handler class fields... #include "RIFF.hpp" #include "RIFF_Support.hpp" #include "RIFF_Handler.hpp" using namespace RIFF; namespace RIFF { // GENERAL STATIC FUNCTIONS //////////////////////////////////////// Chunk* getChunk ( ContainerChunk* parent, RIFF_MetaHandler* handler ) { LFA_FileRef file = handler->parent->fileRef; XMP_Uns8 level = handler->level; XMP_Uns32 peek = LFA_PeekUns32_LE( file ); if ( level == 0 ) { XMP_Validate( peek == kChunk_RIFF, "expected RIFF chunk not found", kXMPErr_BadFileFormat ); XMP_Enforce( parent == NULL ); } else { XMP_Validate( peek != kChunk_RIFF, "unexpected RIFF chunk below top-level", kXMPErr_BadFileFormat ); XMP_Enforce( parent != NULL ); } switch( peek ) { case kChunk_RIFF: return new ContainerChunk( parent, handler ); case kChunk_LIST: { if ( level != 1 ) break; // only care on this level // look further (beyond 4+4 = beyond id+size) to check on relevance LFA_Seek( file, 8, SEEK_CUR ); XMP_Uns32 containerType = LFA_PeekUns32_LE( file ); LFA_Seek( file, -8, SEEK_CUR ); bool isRelevantList = ( containerType== kType_INFO || containerType == kType_Tdat ); if ( !isRelevantList ) break; return new ContainerChunk( parent, handler ); } case kChunk_XMP: if ( level != 1 ) break; // ignore on inappropriate levels (might be compound metadata?) return new XMPChunk( parent, handler ); case kChunk_DISP: { if ( level != 1 ) break; // only care on this level // peek even further to see if type is 0x001 and size is reasonable LFA_Seek( file , 4, SEEK_CUR ); // jump DISP XMP_Uns32 dispSize = LFA_ReadUns32_LE( file ); XMP_Uns32 dispType = LFA_ReadUns32_LE( file ); LFA_Seek( file , -12, SEEK_CUR); // rewind, be in front of chunkID again // only take as a relevant disp if both criteria met, // otherwise treat as generic chunk! if ( (dispType == 0x0001) && ( dispSize < 256 * 1024 ) ) { ValueChunk* r = new ValueChunk( parent, handler ); handler->dispChunk = r; return r; } break; // treat as irrelevant (non-0x1) DISP chunks as generic chunk } case kChunk_bext: { if ( level != 1 ) break; // only care on this level // store for now in a value chunk ValueChunk* r = new ValueChunk( parent, handler ); handler->bextChunk = r; return r; } case kChunk_PrmL: { if ( level != 1 ) break; // only care on this level ValueChunk* r = new ValueChunk( parent, handler ); handler->prmlChunk = r; return r; } case kChunk_Cr8r: { if ( level != 1 ) break; // only care on this level ValueChunk* r = new ValueChunk( parent, handler ); handler->cr8rChunk = r; return r; } case kChunk_JUNQ: case kChunk_JUNK: { JunkChunk* r = new JunkChunk( parent, handler ); return r; } } // this "default:" section must be ouside switch bracket, to be // reachable by all those break statements above: // digest 'valuable' container chunks: LIST:INFO, LIST:Tdat bool insideRelevantList = ( level==2 && parent->id == kChunk_LIST && ( parent->containerType== kType_INFO || parent->containerType == kType_Tdat )); if ( insideRelevantList ) { ValueChunk* r = new ValueChunk( parent, handler ); return r; } // general chunk of no interest, treat as unknown blob return new Chunk( parent, handler, true, chunk_GENERAL ); } // BASE CLASS CHUNK /////////////////////////////////////////////// // ad hoc creation Chunk::Chunk( ContainerChunk* parent, ChunkType c, XMP_Uns32 id ) { this->chunkType = c; // base class assumption this->parent = parent; this->id = id; this->oldSize = 0; this->newSize = 8; this->oldPos = 0; // inevitable for ad-hoc this->needSizeFix = false; // good parenting for latter destruction if ( this->parent != NULL ) { this->parent->children.push_back( this ); if( this->chunkType == chunk_VALUE ) this->parent->childmap.insert( make_pair( this->id, (ValueChunk*) this ) ); } } // parsing creation Chunk::Chunk( ContainerChunk* parent, RIFF_MetaHandler* handler, bool skip, ChunkType c ) { chunkType = c; // base class assumption this->parent = parent; this->oldSize = 0; this->hasChange = false; // [2414649] valid assumption at creation time LFA_FileRef file = handler->parent->fileRef; this->oldPos = LFA_Tell( file ); this->id = LFA_ReadUns32_LE( file ); this->oldSize = LFA_ReadUns32_LE( file ) + 8; // Make sure the size is within expected bounds. XMP_Int64 chunkEnd = this->oldPos + this->oldSize; XMP_Int64 chunkLimit = handler->oldFileSize; if ( parent != 0 ) chunkLimit = parent->oldPos + parent->oldSize; if ( chunkEnd > chunkLimit ) { bool isUpdate = XMP_OptionIsSet ( handler->parent->openFlags, kXMPFiles_OpenForUpdate ); bool repairFile = XMP_OptionIsSet ( handler->parent->openFlags, kXMPFiles_OpenRepairFile ); if ( (! isUpdate) || (repairFile && (parent == 0)) ) { this->oldSize = chunkLimit - this->oldPos; } else { XMP_Throw ( "Bad RIFF chunk size", kXMPErr_BadFileFormat ); } } this->newSize = this->oldSize; this->needSizeFix = false; if ( skip ) { bool ok; LFA_Seek( file, this->oldSize - 8 , SEEK_CUR, &ok ); XMP_Validate( ok , "skipped beyond end of file (truncated file?)", kXMPErr_BadFileFormat ); } // "good parenting", essential for latter destruction. if ( this->parent != NULL ) { this->parent->children.push_back( this ); if( this->chunkType == chunk_VALUE ) this->parent->childmap.insert( make_pair( this->id, (ValueChunk*) this ) ); } } void Chunk::changesAndSize( RIFF_MetaHandler* handler ) { // only unknown chunks should reach this method, // all others must reach overloads, hence little to do here: hasChange = false; // unknown chunk ==> no change, naturally this->newSize = this->oldSize; } std::string Chunk::toString(XMP_Uns8 level ) { char buffer[256]; snprintf( buffer, 255, "%.4s -- " "oldSize: 0x%.8llX, " "newSize: 0x%.8llX, " "oldPos: 0x%.8llX\n", (char*)(&this->id), this->oldSize, this->newSize, this->oldPos ); return std::string(buffer); } void Chunk::write( RIFF_MetaHandler* handler, LFA_FileRef file , bool isMainChunk ) { throw new XMP_Error(kXMPErr_InternalFailure, "Chunk::write never to be called for unknown chunks."); } Chunk::~Chunk() { //nothing } // CONTAINER CHUNK ///////////////////////////////////////////////// // a) creation // [2376832] expectedSize - minimum padding "parking size" to use, if not available append to end ContainerChunk::ContainerChunk( ContainerChunk* parent, XMP_Uns32 id, XMP_Uns32 containerType ) : Chunk( NULL /* !! */, chunk_CONTAINER, id ) { // accept no unparented ConatinerChunks XMP_Enforce( parent != NULL ); this->containerType = containerType; this->newSize = 12; this->parent = parent; chunkVect* siblings = &parent->children; // add at end. ( oldSize==0 will flag optimization later in the process) siblings->push_back( this ); } // b) parsing ContainerChunk::ContainerChunk( ContainerChunk* parent, RIFF_MetaHandler* handler ) : Chunk( parent, handler, false, chunk_CONTAINER ) { bool repairMode = ( 0 != ( handler->parent->openFlags & kXMPFiles_OpenRepairFile )); try { LFA_FileRef file = handler->parent->fileRef; XMP_Uns8 level = handler->level; // get type of container chunk this->containerType = LFA_ReadUns32_LE( file ); // ensure legality of top-level chunks if ( level == 0 && handler->riffChunks.size() > 0 ) { XMP_Validate( handler->parent->format == kXMP_AVIFile, "only AVI may have multiple top-level chunks", kXMPErr_BadFileFormat ); XMP_Validate( this->containerType == kType_AVIX, "all chunks beyond main chunk must be type AVIX", kXMPErr_BadFileFormat ); } // has *relevant* subChunks? (there might be e.g. non-INFO LIST chunks we don't care about) bool hasSubChunks = ( ( this->id == kChunk_RIFF ) || ( this->id == kChunk_LIST && this->containerType == kType_INFO ) || ( this->id == kChunk_LIST && this->containerType == kType_Tdat ) ); XMP_Int64 endOfChunk = this->oldPos + this->oldSize; // this statement catches beyond-EoF-offsets on any level // exception: level 0, tolerate if in repairMode if ( (level == 0) && repairMode && (endOfChunk > handler->oldFileSize) ) { endOfChunk = handler->oldFileSize; // assign actual file size this->oldSize = endOfChunk - this->oldPos; //reversely calculate correct oldSize } XMP_Validate( endOfChunk <= handler->oldFileSize, "offset beyond EoF", kXMPErr_BadFileFormat ); Chunk* curChild = 0; if ( hasSubChunks ) { handler->level++; while ( LFA_Tell( file ) < endOfChunk ) { curChild = RIFF::getChunk( this, handler ); // digest pad byte - no value validation (0), since some 3rd party files have non-0-padding. if ( LFA_Tell(file) % 2 == 1 ) { // [1521093] tolerate missing pad byte at very end of file: XMP_Uns8 pad; LFA_Read ( file, &pad, 1 ); // Read the pad, tolerate being at EOF. } // within relevant LISTs, relentlesly delete junk chunks (create a single one // at end as part of updateAndChanges() if ( (containerType== kType_INFO || containerType == kType_Tdat) && ( curChild->chunkType == chunk_JUNK ) ) { this->children.pop_back(); delete curChild; } // for other chunks: join neighouring Junk chunks into one else if ( (curChild->chunkType == chunk_JUNK) && ( this->children.size() >= 2 ) ) { // nb: if there are e.g 2 chunks, then last one is at(1), prev one at(0) ==> '-2' Chunk* prevChunk = this->children.at( this->children.size() - 2 ); if ( prevChunk->chunkType == chunk_JUNK ) { // stack up size to prior chunk prevChunk->oldSize += curChild->oldSize; prevChunk->newSize += curChild->newSize; XMP_Enforce( prevChunk->oldSize == prevChunk->newSize ); // destroy current chunk this->children.pop_back(); delete curChild; } } } handler->level--; XMP_Validate( LFA_Tell( file ) == endOfChunk, "subchunks exceed outer chunk size", kXMPErr_BadFileFormat ); // pointers for later legacy processing if ( level==1 && this->id==kChunk_LIST && this->containerType == kType_INFO ) handler->listInfoChunk = this; if ( level==1 && this->id==kChunk_LIST && this->containerType == kType_Tdat ) handler->listTdatChunk = this; } else // skip non-interest container chunk { bool ok; LFA_Seek( file, this->oldSize - 8 - 4, SEEK_CUR, &ok ); XMP_Validate( ok , "skipped beyond end of file 2 (truncated file?)", kXMPErr_BadFileFormat ); } // if - else } // try catch (XMP_Error& e) { this->release(); // free resources if ( this->parent != 0) this->parent->children.pop_back(); // hereby taken care of, so removing myself... throw e; // re-throw } } void ContainerChunk::changesAndSize( RIFF_MetaHandler* handler ) { // Walk the container subtree adjusting the children that have size changes. The only containers // are RIFF and LIST chunks, they are treated differently. // // LISTs get recomposed as a whole. Existing JUNK children of a LIST are removed, existing real // children are left in order with their new size, new children have already been appended. The // LIST as a whole gets a new size that is the sum of the final children. // // Special rules apply to various children of a RIFF container. FIrst, adjacent JUNK children // are combined, this simplifies maximal reuse. The children are recursively adjusted in order // to get their final size. // // Try to determine the final placement of each RIFF child using general rules: // - if the size is unchanged: leave at current location // - if the chunk is at the end of the last RIFF chunk and grows: leave at current location // - if there is enough following JUNK: add part of the JUNK, adjust remaining JUNK size // - if it shrinks by 9 bytes or more: carve off trailing JUNK // - try to find adequate JUNK in the current parent // // Use child-specific rules as a last resort: // - if it is LIST:INFO: delete it, must be in first RIFF chunk // - for others: move to end of last RIFF chunk, make old space JUNK // ! Don't create any junk chunks of exactly 8 bytes, just a header and no content. That has a // ! size field of zero, which hits a crashing bug in some versions of Windows Media Player. bool isRIFFContainer = (this->id == kChunk_RIFF); bool isLISTContainer = (this->id == kChunk_LIST); XMP_Enforce ( isRIFFContainer | isLISTContainer ); XMP_Index childIndex; // Could be local to the loops, this simplifies debuging. Need a signed type! Chunk * currChild; if ( this->children.empty() ) { if ( isRIFFContainer) { this->newSize = 12; // Keep a minimal size container. } else { this->newSize = 0; // Will get removed from parent in outer call. } this->hasChange = true; return; // Nothing more to do without children. } // Collapse adjacent RIFF junk children, remove all LIST junk children. Work back to front to // simplify the effect of .erase() on the loop. Purposely ignore the first chunk. for ( childIndex = (XMP_Index)this->children.size() - 1; childIndex > 0; --childIndex ) { currChild = this->children[childIndex]; if ( currChild->chunkType != chunk_JUNK ) continue; if ( isRIFFContainer ) { Chunk * prevChild = this->children[childIndex-1]; if ( prevChild->chunkType != chunk_JUNK ) continue; prevChild->oldSize += currChild->oldSize; prevChild->newSize += currChild->newSize; prevChild->hasChange = true; } this->children.erase ( this->children.begin() + childIndex ); delete currChild; this->hasChange = true; } // Process the children of RIFF and LIST containers to get their final size. Remove empty // children. Work back to front to simplify the effect of .erase() on the loop. Do not ignore // the first chunk. for ( childIndex = (XMP_Index)this->children.size() - 1; childIndex >= 0; --childIndex ) { currChild = this->children[childIndex]; ++handler->level; currChild->changesAndSize ( handler ); --handler->level; if ( (currChild->newSize == 8) || (currChild->newSize == 0) ) { // ! The newSIze is supposed to include the header. this->children.erase ( this->children.begin() + childIndex ); delete currChild; this->hasChange = true; } else { this->hasChange |= currChild->hasChange; currChild->needSizeFix = (currChild->newSize != currChild->oldSize); if ( currChild->needSizeFix && (currChild->newSize > currChild->oldSize) && (this == handler->lastChunk) && (childIndex+1 == (XMP_Index)this->children.size()) ) { // Let an existing last-in-file chunk grow in-place. Shrinking is conceptually OK, // but complicates later sanity check that the main AVI chunk is not OK to append // other chunks later. Ignore new chunks, they might reuse junk space. if ( currChild->oldSize != 0 ) currChild->needSizeFix = false; } } } // Go through the children of a RIFF container, adjusting the placement as necessary. In brief, // things can only grow at the end of the last RIFF chunk, and non-junk chunks can't be shifted. if ( isRIFFContainer ) { for ( childIndex = 0; childIndex < (XMP_Index)this->children.size(); ++childIndex ) { currChild = this->children[childIndex]; if ( ! currChild->needSizeFix ) continue; currChild->needSizeFix = false; XMP_Int64 sizeDiff = currChild->newSize - currChild->oldSize; // Positive for growth. XMP_Uns8 padSize = (currChild->newSize & 1); // Need a pad for odd size. // See if the following chunk is junk that can be utilized. Chunk * nextChild = 0; if ( childIndex+1 < (XMP_Index)this->children.size() ) nextChild = this->children[childIndex+1]; if ( (nextChild != 0) && (nextChild->chunkType == chunk_JUNK) ) { if ( nextChild->newSize >= (9 + sizeDiff + padSize) ) { // Incorporate part of the trailing junk, or make the trailing junk grow. nextChild->newSize -= sizeDiff; nextChild->newSize -= padSize; nextChild->hasChange = true; continue; } else if ( nextChild->newSize == (sizeDiff + padSize) ) { // Incorporate all of the trailing junk. this->children.erase ( this->children.begin() + childIndex + 1 ); delete nextChild; continue; } } // See if the chunk shrinks enough to turn the leftover space into junk. if ( (sizeDiff + padSize) <= -9 ) { this->children.insert ( (this->children.begin() + childIndex + 1), new JunkChunk ( NULL, ((-sizeDiff) - padSize) ) ); continue; } // Look through the parent for a usable span of junk. XMP_Index junkIndex; Chunk * junkChunk = 0; for ( junkIndex = 0; junkIndex < (XMP_Index)this->children.size(); ++junkIndex ) { junkChunk = this->children[junkIndex]; if ( junkChunk->chunkType != chunk_JUNK ) continue; if ( (junkChunk->newSize >= (9 + currChild->newSize + padSize)) || (junkChunk->newSize == (currChild->newSize + padSize)) ) break; } if ( junkIndex < (XMP_Index)this->children.size() ) { // Use part or all of the junk for the relocated chunk, replace the old space with junk. if ( junkChunk->newSize == (currChild->newSize + padSize) ) { // The found junk is an exact fit. this->children[junkIndex] = currChild; delete junkChunk; } else { // The found junk has excess space. Insert the moving chunk and shrink the junk. XMP_Assert ( junkChunk->newSize >= (9 + currChild->newSize + padSize) ); junkChunk->newSize -= (currChild->newSize + padSize); junkChunk->hasChange = true; this->children.insert ( (this->children.begin() + junkIndex), currChild ); if ( junkIndex < childIndex ) ++childIndex; // The insertion moved the current child. } if ( currChild->oldSize != 0 ) { this->children[childIndex] = new JunkChunk ( 0, currChild->oldSize ); // Replace the old space with junk. } else { this->children.erase ( this->children.begin() + childIndex ); // Remove the newly created chunk's old location. --childIndex; // Make the next loop iteration not skip a chunk. } continue; } // If this is a LIST:INFO chunk not in the last of multiple RIFF chunks, then give up // and replace it with oldSize junk. Preserve the first RIFF chunk's original size. bool isListInfo = (currChild->id == kChunk_LIST) && (currChild->chunkType == chunk_CONTAINER) && (((ContainerChunk*)currChild)->containerType == kType_INFO); if ( isListInfo && (handler->riffChunks.size() > 1) && (this->id == kChunk_RIFF) && (this != handler->lastChunk) ) { if ( currChild->oldSize != 0 ) { this->children[childIndex] = new JunkChunk ( 0, currChild->oldSize ); } else { this->children.erase ( this->children.begin() + childIndex ); --childIndex; // Make the next loop iteration not skip a chunk. } delete currChild; continue; } // Move the chunk to the end of the last RIFF chunk and make the old space junk. if ( (this == handler->lastChunk) && (childIndex+1 == (XMP_Index)this->children.size()) ) continue; // Already last. handler->lastChunk->children.push_back( currChild ); if ( currChild->oldSize != 0 ) { this->children[childIndex] = new JunkChunk ( 0, currChild->oldSize ); // Replace the old space with junk. } else { this->children.erase ( this->children.begin() + childIndex ); // Remove the newly created chunk's old location. --childIndex; // Make the next loop iteration not skip a chunk. } } } // Compute the finished container's new size (for both RIFF and LIST). this->newSize = 12; // Start with standard container header. for ( childIndex = 0; childIndex < (XMP_Index)this->children.size(); ++childIndex ) { currChild = this->children[childIndex]; this->newSize += currChild->newSize; this->newSize += (this->newSize & 1); // Round up if odd. } XMP_Validate ( (this->newSize <= 0xFFFFFFFFLL), "No single chunk may be above 4 GB", kXMPErr_Unimplemented ); } std::string ContainerChunk::toString(XMP_Uns8 level ) { XMP_Int64 offset= 12; // compute offsets, just for informational purposes // (actually only correct for first chunk) char buffer[256]; snprintf( buffer, 255, "%.4s:%.4s, " "oldSize: 0x%8llX, " "newSize: 0x%.8llX, " "oldPos: 0x%.8llX\n", (char*)(&this->id), (char*)(&this->containerType), this->oldSize, this->newSize, this->oldPos ); std::string r(buffer); chunkVectIter iter; for( iter = this->children.begin(); iter != this->children.end(); iter++ ) { char buffer[256]; snprintf( buffer, 250, "offset 0x%.8llX", offset ); r += std::string ( level*4, ' ' ) + std::string( buffer ) + ":" + (*iter)->toString( level + 1 ); offset += (*iter)->newSize; if ( offset % 2 == 1 ) offset++; } return std::string(r); } void ContainerChunk::write( RIFF_MetaHandler* handler, LFA_FileRef file, bool isMainChunk ) { bool ok; if ( isMainChunk ) LFA_Rewind( file ); // enforce even position XMP_Int64 chunkStart = LFA_Tell(file); XMP_Int64 chunkEnd = chunkStart + this->newSize; XMP_Enforce( chunkStart % 2 == 0 ); chunkVect *rc = &this->children; // [2473303] have to write back-to-front to avoid stomp-on-feet XMP_Int64 childStart = chunkEnd; for ( XMP_Int32 chunkNo = (XMP_Int32)(rc->size() -1); chunkNo >= 0; chunkNo-- ) { Chunk* cur = rc->at(chunkNo); // pad byte first if ( cur->newSize % 2 == 1 ) { childStart--; LFA_Seek( file, childStart, SEEK_SET ); LFA_WriteUns8( file, 0 ); } // then contents childStart-= cur->newSize; LFA_Seek( file, childStart, SEEK_SET ); switch ( cur->chunkType ) { case chunk_GENERAL: //COULDDO enfore no change, since not write-out-able if ( cur->oldPos != childStart ) LFA_Move( file, cur->oldPos, file, childStart, cur->oldSize, 0, 0 ); break; default: cur->write( handler, file, false ); break; } // switch } // for XMP_Enforce ( chunkStart + 12 == childStart); LFA_Seek( file, chunkStart, SEEK_SET, &ok ); LFA_WriteUns32_LE( file, this->id ); LFA_WriteUns32_LE( file, (XMP_Uns32) this->newSize - 8 ); // validated in changesAndSize() above LFA_WriteUns32_LE( file, this->containerType ); } void ContainerChunk::release() { // free subchunks Chunk* curChunk; while( ! this->children.empty() ) { curChunk = this->children.back(); delete curChunk; this->children.pop_back(); } } ContainerChunk::~ContainerChunk() { this->release(); // free resources } // XMP CHUNK /////////////////////////////////////////////// // a) create // a) creation XMPChunk::XMPChunk( ContainerChunk* parent ) : Chunk( parent, chunk_XMP , kChunk_XMP ) { // nothing } // b) parse XMPChunk::XMPChunk( ContainerChunk* parent, RIFF_MetaHandler* handler ) : Chunk( parent, handler, false, chunk_XMP ) { chunkType = chunk_XMP; LFA_FileRef file = handler->parent->fileRef; XMP_Uns8 level = handler->level; handler->packetInfo.offset = this->oldPos + 8; handler->packetInfo.length = (XMP_Int32) this->oldSize - 8; handler->xmpPacket.reserve ( handler->packetInfo.length ); handler->xmpPacket.assign ( handler->packetInfo.length, ' ' ); LFA_Read ( file, (void*)handler->xmpPacket.data(), handler->packetInfo.length, kLFA_RequireAll ); handler->containsXMP = true; // last, after all possible failure // pointer for later processing handler->xmpChunk = this; } void XMPChunk::changesAndSize( RIFF_MetaHandler* handler ) { XMP_Enforce( &handler->xmpPacket != 0 ); XMP_Enforce( handler->xmpPacket.size() > 0 ); this->newSize = 8 + handler->xmpPacket.size(); XMP_Validate( this->newSize <= 0xFFFFFFFFLL, "no single chunk may be above 4 GB", kXMPErr_InternalFailure ); // a complete no-change would have been caught in XMPFiles common code anyway this->hasChange = true; } void XMPChunk::write( RIFF_MetaHandler* handler, LFA_FileRef file, bool isMainChunk ) { LFA_WriteUns32_LE( file, kChunk_XMP ); LFA_WriteUns32_LE( file, (XMP_Uns32) this->newSize - 8 ); // validated in changesAndSize() above LFA_Write( file, handler->xmpPacket.data(), (XMP_Int32)handler->xmpPacket.size() ); } // Value CHUNK /////////////////////////////////////////////// // a) creation ValueChunk::ValueChunk( ContainerChunk* parent, std::string value, XMP_Uns32 id ) : Chunk( parent, chunk_VALUE, id ) { this->oldValue = std::string(); this->SetValue( value ); } // b) parsing ValueChunk::ValueChunk( ContainerChunk* parent, RIFF_MetaHandler* handler ) : Chunk( parent, handler, false, chunk_VALUE ) { // set value: ----------------- LFA_FileRef file = handler->parent->fileRef; XMP_Uns8 level = handler->level; // unless changed through reconciliation, assume for now. // IMPORTANT to stay true to the original (no \0 cleanup or similar) // since unknown value chunks might not be fully understood, // hence must be precisely preserved !!! XMP_Int32 length = (XMP_Int32) this->oldSize - 8; this->oldValue.reserve( length ); this->oldValue.assign( length + 1, '\0' ); LFA_Read ( file, (void*)this->oldValue.data(), length, kLFA_RequireAll ); this->newValue = this->oldValue; this->newSize = this->oldSize; } void ValueChunk::SetValue( std::string value, bool optionalNUL /* = false */ ) { this->newValue.assign( value ); if ( (! optionalNUL) || ((value.size() & 1) == 1) ) { // ! The NUL should be optional in WAV to avoid a parsing bug in Audition 3 - can't handle implicit pad byte. this->newValue.append( 1, '\0' ); // append zero termination as explicit part of string } this->newSize = this->newValue.size() + 8; } void ValueChunk::changesAndSize( RIFF_MetaHandler* handler ) { // Don't simply assign to this->hasChange, it might already be true. if ( this->newValue.size() != this->oldValue.size() ) { this->hasChange = true; } else if ( strncmp ( this->oldValue.c_str(), this->newValue.c_str(), this->newValue.size() ) != 0 ) { this->hasChange = true; } } void ValueChunk::write( RIFF_MetaHandler* handler, LFA_FileRef file, bool isMainChunk ) { LFA_WriteUns32_LE( file, this->id ); LFA_WriteUns32_LE( file, (XMP_Uns32)this->newSize - 8 ); LFA_Write( file, this->newValue.data() , (XMP_Int32)this->newSize - 8 ); } /* remove value chunk if existing. return true if it was existing. */ bool ContainerChunk::removeValue( XMP_Uns32 id ) { valueMap* cm = &this->childmap; valueMapIter iter = cm->find( id ); if( iter == cm->end() ) return false; //not found ValueChunk* propChunk = iter->second; // remove from vector (difficult) chunkVect* cv = &this->children; chunkVectIter cvIter; for (cvIter = cv->begin(); cvIter != cv->end(); ++cvIter ) { if ( (*cvIter)->id == id ) break; // found! } XMP_Validate( cvIter != cv->end(), "property not found in children vector", kXMPErr_InternalFailure ); cv->erase( cvIter ); // remove from map (easy) cm->erase( iter ); delete propChunk; return true; // found and removed } /* returns iterator to (first) occurence of this chunk. iterator to the end of the map if chunk pointer is not found */ chunkVectIter ContainerChunk::getChild( Chunk* needle ) { chunkVectIter iter; for( iter = this->children.begin(); iter != this->children.end(); iter++ ) { Chunk* temp1 = *iter; Chunk* temp2 = needle; if ( (*iter) == needle ) return iter; } return this->children.end(); } /* replaces a chunk by a JUNK chunk. Also frees memory of prior chunk. */ void ContainerChunk::replaceChildWithJunk( Chunk* child, bool deleteChild ) { chunkVectIter iter = getChild( child ); if ( iter == this->children.end() ) { throw new XMP_Error(kXMPErr_InternalFailure, "replaceChildWithJunk: childChunk not found."); } *iter = new JunkChunk ( NULL, child->oldSize ); if ( deleteChild ) delete child; this->hasChange = true; } // JunkChunk /////////////////////////////////////////////////// // a) creation JunkChunk::JunkChunk( ContainerChunk* parent, XMP_Int64 size ) : Chunk( parent, chunk_JUNK, kChunk_JUNK ) { XMP_Assert( size >= 8 ); this->oldSize = size; this->newSize = size; this->hasChange = true; } // b) parsing JunkChunk::JunkChunk( ContainerChunk* parent, RIFF_MetaHandler* handler ) : Chunk( parent, handler, true, chunk_JUNK ) { chunkType = chunk_JUNK; } void JunkChunk::changesAndSize( RIFF_MetaHandler* handler ) { this->newSize = this->oldSize; // optimization at a later stage XMP_Validate( this->newSize <= 0xFFFFFFFFLL, "no single chunk may be above 4 GB", kXMPErr_InternalFailure ); if ( this->id == kChunk_JUNQ ) this->hasChange = true; // Force ID change to JUNK. } // zeroBuffer, etc to write out empty native padding const static XMP_Uns32 kZeroBufferSize64K = 64 * 1024; static XMP_Uns8 kZeroes64K [ kZeroBufferSize64K ]; // C semantics guarantee zero initialization. void JunkChunk::write( RIFF_MetaHandler* handler, LFA_FileRef file, bool isMainChunk ) { LFA_WriteUns32_LE( file, kChunk_JUNK ); // write JUNK, never JUNQ XMP_Enforce( this->newSize < 0xFFFFFFFF ); XMP_Enforce( this->newSize >= 8 ); // minimum size of any chunk XMP_Uns32 innerSize = (XMP_Uns32)this->newSize - 8; LFA_WriteUns32_LE( file, innerSize ); // write out in 64K chunks while ( innerSize > kZeroBufferSize64K ) { LFA_Write( file, kZeroes64K , kZeroBufferSize64K ); innerSize -= kZeroBufferSize64K; } LFA_Write( file, kZeroes64K , innerSize ); } } // namespace RIFF exempi-2.2.1/source/XMPFiles/FormatSupport/XDCAM_Support.hpp0000664000175000017500000000300412150230673020577 00000000000000#ifndef __XDCAM_Support_hpp__ #define __XDCAM_Support_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "XMP_Const.h" #include "XMPFiles_Impl.hpp" #include "ExpatAdapter.hpp" // ================================================================================================= /// \file XDCAM_Support.hpp /// \brief XMPFiles support for XDCAM streams. /// // ================================================================================================= namespace XDCAM_Support { // Read XDCAM legacy XML metadata and translate to appropriate XMP. bool GetLegacyMetaData ( SXMPMeta * xmpObjPtr, XML_NodePtr rootElem, XMP_StringPtr legacyNS, bool digestFound, std::string& umid ); // Write XMP metadata back to legacy XDCAM XML. bool SetLegacyMetaData ( XML_Node * clipMetadata, SXMPMeta * xmpObj, XMP_StringPtr legacyNS ); } // namespace XDCAM_Support // ================================================================================================= #endif // __XDCAM_Support_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/IPTC_Support.hpp0000664000175000017500000002711012150230672020505 00000000000000#ifndef __IPTC_Support_hpp__ #define __IPTC_Support_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include #include #include "XMP_Const.h" #include "XMPFiles_Impl.hpp" #include "EndianUtils.hpp" // ================================================================================================= /// \file IPTC_Support.hpp /// \brief XMPFiles support for IPTC (IIM) DataSets. /// /// This header provides IPTC (IIM) DataSet support specific to the needs of XMPFiles. This is not /// intended for general purpose IPTC processing. There is a small tree of derived classes, 1 /// virtual base class and 2 concrete leaf classes: /// \code /// IPTC_Manager - The root virtual base class. /// IPTC_Reader - A derived concrete leaf class for memory-based read-only access. /// IPTC_Writer - A derived concrete leaf class for memory-based read-write access. /// \endcode /// /// \c IPTC_Manager declares all of the public methods except for specialized constructors in the /// leaf classes. The read-only classes throw an XMP_Error exception for output methods like /// \c SetDataSet. They return appropriate values for "safe" methods, \c IsChanged will return false /// for example. /// /// The IPTC DataSet organization differs from TIFF tags and Photoshop image resources in allowing /// muultiple occurrences for some IDs. The C++ STL multimap is a natural data structure for IPTC. /// /// Support is only provided for DataSet 1:90 to decide if local or UTF-8 text encoding is used, and /// the following text valued DataSets: 2:05, 2:10, 2:15, 2:20, 2:25, 2:40, 2:55, 2:80, 2:85, 2:90, /// 2:95, 2:101, 2:103, 2:105, 2:110, 2:115, 2:116, 2:120, and 2:122. DataSet 2:00 is ignored when /// reading but always written. /// /// \note Unlike the TIFF_Manager and PSIR_Manager class trees, IPTC_Manager only provides in-memory /// implementations. The total size of IPTC data is small enough to make this reasonable. /// /// \note These classes are for use only when directly compiled and linked. They should not be /// packaged in a DLL by themselves. They do not provide any form of C++ ABI protection. // ================================================================================================= // ================================================================================================= // ================================================================================================= enum { // List of recognized 2:* IIM DataSets. The names are from IIMv4 and IPTC4XMP. kIPTC_ObjectType = 3, kIPTC_IntellectualGenre = 4, kIPTC_Title = 5, kIPTC_EditStatus = 7, kIPTC_EditorialUpdate = 8, kIPTC_Urgency = 10, kIPTC_SubjectCode = 12, kIPTC_Category = 15, kIPTC_SuppCategory = 20, kIPTC_FixtureIdentifier = 22, kIPTC_Keyword = 25, kIPTC_ContentLocCode = 26, kIPTC_ContentLocName = 27, kIPTC_ReleaseDate = 30, kIPTC_ReleaseTime = 35, kIPTC_ExpDate = 37, kIPTC_ExpTime = 38, kIPTC_Instructions = 40, kIPTC_ActionAdvised = 42, kIPTC_RefService = 45, kIPTC_RefDate = 47, kIPTC_RefNumber = 50, kIPTC_DateCreated = 55, kIPTC_TimeCreated = 60, kIPTC_DigitalCreateDate = 62, kIPTC_DigitalCreateTime = 63, kIPTC_OriginProgram = 65, kIPTC_ProgramVersion = 70, kIPTC_ObjectCycle = 75, kIPTC_Creator = 80, kIPTC_CreatorJobtitle = 85, kIPTC_City = 90, kIPTC_Location = 92, kIPTC_State = 95, kIPTC_CountryCode = 100, kIPTC_Country = 101, kIPTC_JobID = 103, kIPTC_Headline = 105, kIPTC_Provider = 110, kIPTC_Source = 115, kIPTC_CopyrightNotice = 116, kIPTC_Contact = 118, kIPTC_Description = 120, kIPTC_DescriptionWriter = 122, kIPTC_RasterizedCaption = 125, kIPTC_ImageType = 130, kIPTC_ImageOrientation = 131, kIPTC_LanguageID = 135, kIPTC_AudioType = 150, kIPTC_AudioSampleRate = 151, kIPTC_AudioSampleRes = 152, kIPTC_AudioDuration = 153, kIPTC_AudioOutcue = 154, kIPTC_PreviewFormat = 200, kIPTC_PreviewFormatVers = 201, kIPTC_PreviewData = 202 }; enum { // Forms of mapping legacy IPTC to XMP. Order is significant, see PhotoDataUtils::Import2WayIPTC! kIPTC_MapSimple, // The XMP is simple, the last DataSet occurrence is kept. kIPTC_MapLangAlt, // The XMP is a LangAlt x-default item, the last DataSet occurrence is kept. kIPTC_MapArray, // The XMP is an unordered array, all DataSets are kept. kIPTC_MapSpecial, // The mapping requires DataSet specific code. kIPTC_Map3Way, // Has a 3 way mapping between Exif, IPTC, and XMP. kIPTC_UnmappedText, // A text DataSet that is not mapped to XMP. kIPTC_UnmappedBin // A binary DataSet that is not mapped to XMP. }; struct DataSetCharacteristics { XMP_Uns8 id; XMP_Uns8 mapForm; size_t maxLen; XMP_StringPtr xmpNS; XMP_StringPtr xmpProp; }; extern const DataSetCharacteristics kKnownDataSets[]; struct IntellectualGenreMapping { XMP_StringPtr refNum; // The reference number as a 3 digit string. XMP_StringPtr name; // The intellectual genre name. }; extern const IntellectualGenreMapping kIntellectualGenreMappings[]; // ================================================================================================= // IPTC_Manager // ============ class IPTC_Manager { public: // --------------------------------------------------------------------------------------------- // Types and constants. struct DataSetInfo { XMP_Uns8 id; XMP_Uns32 dataLen; XMP_Uns8 * dataPtr; // ! The data is read-only. Raw data pointer, beware of character encoding. DataSetInfo() : id(0), dataLen(0), dataPtr(0) {}; DataSetInfo ( XMP_Uns8 _id, XMP_Uns32 _dataLen, XMP_Uns8 * _dataPtr ) : id(_id), dataLen(_dataLen), dataPtr(_dataPtr) {}; }; // --------------------------------------------------------------------------------------------- // Parse a binary IPTC (IIM) block. void ParseMemoryDataSets ( const void* data, XMP_Uns32 length, bool copyData = true ); // --------------------------------------------------------------------------------------------- // Get the information about a DataSet. Returns the number of occurrences. The "which" parameter // selects the occurrence, they are numbered from 0 to count-1. Returns 0 if which is too large. size_t GetDataSet ( XMP_Uns8 id, DataSetInfo* info, size_t which = 0 ) const; // --------------------------------------------------------------------------------------------- // Get the value of a text DataSet as UTF-8. The returned pointer must be treated as read-only. // Calls GetDataSet then does a local to UTF-8 conversion if necessary. size_t GetDataSet_UTF8 ( XMP_Uns8 id, std::string * utf8Str, size_t which = 0 ) const; // --------------------------------------------------------------------------------------------- // Set the value of a text DataSet from a UTF-8 string. Does a UTF-8 to local conversion if // necessary. If the encoding mode is currently local and this value has round-trip loss, then // the encoding mode will be changed to UTF-8 and all existing values will be converted. // Modifies an existing occurrence if "which" is within range. Adds an occurrence if which // equals the current count, or which is -1 and repeats are allowed. Throws an exception if // which is too large. The dataPtr provides the raw data, text must be in the right encoding. virtual void SetDataSet_UTF8 ( XMP_Uns8 id, const void* utf8Ptr, XMP_Uns32 utf8Len, long which = -1 ) = 0; // --------------------------------------------------------------------------------------------- // Delete an existing DataSet. Deletes all occurrences if which is -1. virtual void DeleteDataSet ( XMP_Uns8 id, long which = -1 ) = 0; // --------------------------------------------------------------------------------------------- // Determine if any DataSets are changed. virtual bool IsChanged() = 0; // --------------------------------------------------------------------------------------------- // Determine if UTF-8 or local text encoding is being used. bool UsingUTF8() const { return this->utf8Encoding; }; // -------------------------------------------------- // Update the DataSets to reflect the changed values. virtual void UpdateMemoryDataSets() = 0; // --------------------------------------------------------------------------------------------- // Get the location and size of the full IPTC block. The client must call UpdateMemoryDataSets // first if appropriate. The returned dataPtr must be treated as read only. It exists until the // IPTC_Manager destructor is called. XMP_Uns32 GetBlockInfo ( void** dataPtr ) const { if ( dataPtr != 0 ) *dataPtr = this->iptcContent; return this->iptcLength; }; // --------------------------------------------------------------------------------------------- virtual ~IPTC_Manager() { if ( this->ownedContent ) free ( this->iptcContent ); }; protected: enum { kMinDataSetSize = 5 }; // 1+1+1+2 typedef std::multimap DataSetMap; DataSetMap dataSets; XMP_Uns8* iptcContent; XMP_Uns32 iptcLength, offset190, length190, offset2xx, length2xx; bool changed; bool ownedContent; // True if IPTC_Manager destructor needs to release the content block. bool utf8Encoding; // True if text values are encoded as UTF-8. IPTC_Manager() : iptcContent(0), iptcLength(0), offset190(0), length190(0), offset2xx(0), length2xx(0), changed(false), ownedContent(false), utf8Encoding(false) {}; void DisposeLooseValue ( DataSetInfo & dsInfo ); }; // IPTC_Manager // ================================================================================================= // ================================================================================================= // ================================================================================================= // IPTC_Reader // =========== class IPTC_Reader : public IPTC_Manager { public: IPTC_Reader() {}; void SetDataSet_UTF8 ( XMP_Uns8 id, const void* utf8Ptr, XMP_Uns32 utf8Len, long which = -1 ) { NotAppropriate(); }; void DeleteDataSet ( XMP_Uns8 id, long which = -1 ) { NotAppropriate(); }; bool IsChanged() { return false; }; void UpdateMemoryDataSets() { NotAppropriate(); }; virtual ~IPTC_Reader() {}; private: static inline void NotAppropriate() { XMP_Throw ( "Not appropriate for IPTC_Reader", kXMPErr_InternalFailure ); }; }; // IPTC_Reader // ================================================================================================= // IPTC_Writer // =========== class IPTC_Writer : public IPTC_Manager { public: void SetDataSet_UTF8 ( XMP_Uns8 id, const void* utf8Ptr, XMP_Uns32 utf8Len, long which = -1 ); void DeleteDataSet ( XMP_Uns8 id, long which = -1 ); bool IsChanged() { return changed; }; void UpdateMemoryDataSets (); IPTC_Writer() {}; virtual ~IPTC_Writer(); private: void ConvertToUTF8(); void ConvertToLocal(); bool CheckRoundTripLoss(); }; // IPTC_Writer // ================================================================================================= #endif // __IPTC_Support_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/TIFF_Support.hpp0000664000175000017500000010744012150230673020504 00000000000000#ifndef __TIFF_Support_hpp__ #define __TIFF_Support_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include #include #include #include "XMP_Const.h" #include "XMPFiles_Impl.hpp" #include "EndianUtils.hpp" // ================================================================================================= /// \file TIFF_Support.hpp /// \brief XMPFiles support for TIFF streams. /// /// This header provides TIFF stream support specific to the needs of XMPFiles. This is not intended /// for general purpose TIFF processing. TIFF_Manager is an abstract base class with 2 concrete /// derived classes, TIFF_MemoryReader and TIFF_FileWriter. /// /// TIFF_MemoryReader provides read-only support for TIFF streams that are small enough to be kept /// entirely in memory. This allows optimizations to reduce heap usage and processing code. It is /// sufficient for browsing access to the Exif metadata in JPEG and Photoshop files. Think of /// TIFF_MemoryReader as "memory-based AND read-only". Since the entire TIFF stream is available, /// GetTag will return information about any tag in the stream. /// /// TIFF_FileWriter is for cases where updates are needed or the TIFF stream is too large to be kept /// entirely in memory. Think of TIFF_FileWriter as "file-based OR read-write". TIFF_FileWriter only /// maintains information for tags of interest as metadata. /// /// The needs of XMPFiles are well defined metadata access. Only 4 IFDs are processed: /// \li The 0th IFD, for the primary image, the first one in the outer list of IFDs. /// \li The Exif general metadata IFD, from tag 34665 in the primary image IFD. /// \li The Exif GPS Info metadata IFD, from tag 34853 in the primary image IFD. /// \li The Exif Interoperability IFD, from tag 40965 in the Exif general metadata IFD. /// /// \note These classes are for use only when directly compiled and linked. They should not be /// packaged in a DLL by themselves. They do not provide any form of C++ ABI protection. // ================================================================================================= // ================================================================================================= // TIFF IFD and type constants // =========================== // // These aren't inside TIFF_Manager because static data members can't be initialized there. enum { // Constants for the recognized IFDs. kTIFF_PrimaryIFD = 0, // The primary image IFD, also called the 0th IFD. kTIFF_TNailIFD = 1, // The thumbnail image IFD also called the 1st IFD. (not used) kTIFF_ExifIFD = 2, // The Exif general metadata IFD. kTIFF_GPSInfoIFD = 3, // The Exif GPS Info IFD. kTIFF_InteropIFD = 4, // The Exif Interoperability IFD. kTIFF_LastRealIFD = 4, kTIFF_KnownIFDCount = 5, kTIFF_KnownIFD = 9 // The IFD that a tag is known to belong in. }; enum { // Constants for the type field of a tag, as defined by TIFF. kTIFF_ShortOrLongType = 0, // ! Not part of the TIFF spec, never in a tag! kTIFF_ByteType = 1, kTIFF_ASCIIType = 2, kTIFF_ShortType = 3, kTIFF_LongType = 4, kTIFF_RationalType = 5, kTIFF_SByteType = 6, kTIFF_UndefinedType = 7, kTIFF_SShortType = 8, kTIFF_SLongType = 9, kTIFF_SRationalType = 10, kTIFF_FloatType = 11, kTIFF_DoubleType = 12, kTIFF_LastType = 12 }; static const size_t kTIFF_TypeSizes[] = { 0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8 }; static const char * kTIFF_TypeNames[] = { "ShortOrLong", "BYTE", "ASCII", "SHORT", "LONG", "RATIONAL", "SBYTE", "UNDEFINED", "SSHORT", "SLONG", "SRATIONAL", "FLOAT", "DOUBLE" }; enum { // Encodings for SetTag_EncodedString. kTIFF_EncodeUndefined = 0, kTIFF_EncodeASCII = 1, kTIFF_EncodeUnicode = 2, // UTF-16 in the endianness of the TIFF stream. kTIFF_EncodeJIS = 3, // Exif 2.2 uses JIS X 208-1990. kTIFF_EncodeUnknown = 9 }; // ================================================================================================= // Recognized TIFF tags // ==================== // --------------------------------------------------------------------------- // An enum of IDs for all of the tags as potential interest as metadata. enum { // General 0th IFD tags. Some of these can also be in the thumbnail IFD. kTIFF_ImageWidth = 256, kTIFF_ImageLength = 257, kTIFF_BitsPerSample = 258, kTIFF_Compression = 259, kTIFF_PhotometricInterpretation = 262, kTIFF_ImageDescription = 270, kTIFF_Make = 271, kTIFF_Model = 272, kTIFF_Orientation = 274, kTIFF_SamplesPerPixel = 277, kTIFF_XResolution = 282, kTIFF_YResolution = 283, kTIFF_PlanarConfiguration = 284, kTIFF_ResolutionUnit = 296, kTIFF_TransferFunction = 301, kTIFF_Software = 305, kTIFF_DateTime = 306, kTIFF_Artist = 315, kTIFF_WhitePoint = 318, kTIFF_PrimaryChromaticities = 319, kTIFF_YCbCrCoefficients = 529, kTIFF_YCbCrSubSampling = 530, kTIFF_YCbCrPositioning = 531, kTIFF_ReferenceBlackWhite = 532, kTIFF_XMP = 700, kTIFF_Copyright = 33432, kTIFF_IPTC = 33723, kTIFF_PSIR = 34377, kTIFF_ExifIFDPointer = 34665, kTIFF_GPSInfoIFDPointer = 34853, kTIFF_DNGVersion = 50706, kTIFF_DNGBackwardVersion = 50707, // Additional thumbnail IFD tags. We also care about 256, 257, and 259 in thumbnails. kTIFF_JPEGInterchangeFormat = 513, kTIFF_JPEGInterchangeFormatLength = 514, // Additional tags that need special handling when rewriting memory-based TIFF. kTIFF_StripOffsets = 273, kTIFF_StripByteCounts = 279, kTIFF_FreeOffsets = 288, kTIFF_FreeByteCounts = 289, kTIFF_TileOffsets = 324, kTIFF_TileByteCounts = 325, kTIFF_SubIFDs = 330, kTIFF_JPEGQTables = 519, kTIFF_JPEGDCTables = 520, kTIFF_JPEGACTables = 521, // Exif IFD tags. kTIFF_ExposureTime = 33434, kTIFF_FNumber = 33437, kTIFF_ExposureProgram = 34850, kTIFF_SpectralSensitivity = 34852, kTIFF_ISOSpeedRatings = 34855, kTIFF_OECF = 34856, kTIFF_ExifVersion = 36864, kTIFF_DateTimeOriginal = 36867, kTIFF_DateTimeDigitized = 36868, kTIFF_ComponentsConfiguration = 37121, kTIFF_CompressedBitsPerPixel = 37122, kTIFF_ShutterSpeedValue = 37377, kTIFF_ApertureValue = 37378, kTIFF_BrightnessValue = 37379, kTIFF_ExposureBiasValue = 37380, kTIFF_MaxApertureValue = 37381, kTIFF_SubjectDistance = 37382, kTIFF_MeteringMode = 37383, kTIFF_LightSource = 37384, kTIFF_Flash = 37385, kTIFF_FocalLength = 37386, kTIFF_SubjectArea = 37396, kTIFF_UserComment = 37510, kTIFF_SubSecTime = 37520, kTIFF_SubSecTimeOriginal = 37521, kTIFF_SubSecTimeDigitized = 37522, kTIFF_FlashpixVersion = 40960, kTIFF_ColorSpace = 40961, kTIFF_PixelXDimension = 40962, kTIFF_PixelYDimension = 40963, kTIFF_RelatedSoundFile = 40964, kTIFF_InteroperabilityIFDPointer = 40965, kTIFF_FlashEnergy = 41483, kTIFF_SpatialFrequencyResponse = 41484, kTIFF_FocalPlaneXResolution = 41486, kTIFF_FocalPlaneYResolution = 41487, kTIFF_FocalPlaneResolutionUnit = 41488, kTIFF_SubjectLocation = 41492, kTIFF_ExposureIndex = 41493, kTIFF_SensingMethod = 41495, kTIFF_FileSource = 41728, kTIFF_SceneType = 41729, kTIFF_CFAPattern = 41730, kTIFF_CustomRendered = 41985, kTIFF_ExposureMode = 41986, kTIFF_WhiteBalance = 41987, kTIFF_DigitalZoomRatio = 41988, kTIFF_FocalLengthIn35mmFilm = 41989, kTIFF_SceneCaptureType = 41990, kTIFF_GainControl = 41991, kTIFF_Contrast = 41992, kTIFF_Saturation = 41993, kTIFF_Sharpness = 41994, kTIFF_DeviceSettingDescription = 41995, kTIFF_SubjectDistanceRange = 41996, kTIFF_ImageUniqueID = 42016, kTIFF_MakerNote = 37500, // Gets deleted when rewriting memory-based TIFF. // GPS IFD tags. kTIFF_GPSVersionID = 0, kTIFF_GPSLatitudeRef = 1, kTIFF_GPSLatitude = 2, kTIFF_GPSLongitudeRef = 3, kTIFF_GPSLongitude = 4, kTIFF_GPSAltitudeRef = 5, kTIFF_GPSAltitude = 6, kTIFF_GPSTimeStamp = 7, kTIFF_GPSSatellites = 8, kTIFF_GPSStatus = 9, kTIFF_GPSMeasureMode = 10, kTIFF_GPSDOP = 11, kTIFF_GPSSpeedRef = 12, kTIFF_GPSSpeed = 13, kTIFF_GPSTrackRef = 14, kTIFF_GPSTrack = 15, kTIFF_GPSImgDirectionRef = 16, kTIFF_GPSImgDirection = 17, kTIFF_GPSMapDatum = 18, kTIFF_GPSDestLatitudeRef = 19, kTIFF_GPSDestLatitude = 20, kTIFF_GPSDestLongitudeRef = 21, kTIFF_GPSDestLongitude = 22, kTIFF_GPSDestBearingRef = 23, kTIFF_GPSDestBearing = 24, kTIFF_GPSDestDistanceRef = 25, kTIFF_GPSDestDistance = 26, kTIFF_GPSProcessingMethod = 27, kTIFF_GPSAreaInformation = 28, kTIFF_GPSDateStamp = 29, kTIFF_GPSDifferential = 30 }; // ------------------------------------------------------------------ // Sorted arrays of the tags that are recognized in the various IFDs. static const XMP_Uns16 sKnownPrimaryIFDTags[] = { kTIFF_ImageWidth, // 256 kTIFF_ImageLength, // 257 kTIFF_BitsPerSample, // 258 kTIFF_Compression, // 259 kTIFF_PhotometricInterpretation, // 262 kTIFF_ImageDescription, // 270 kTIFF_Make, // 271 kTIFF_Model, // 272 kTIFF_Orientation, // 274 kTIFF_SamplesPerPixel, // 277 kTIFF_XResolution, // 282 kTIFF_YResolution, // 283 kTIFF_PlanarConfiguration, // 284 kTIFF_ResolutionUnit, // 296 kTIFF_TransferFunction, // 301 kTIFF_Software, // 305 kTIFF_DateTime, // 306 kTIFF_Artist, // 315 kTIFF_WhitePoint, // 318 kTIFF_PrimaryChromaticities, // 319 kTIFF_YCbCrCoefficients, // 529 kTIFF_YCbCrSubSampling, // 530 kTIFF_YCbCrPositioning, // 531 kTIFF_ReferenceBlackWhite, // 532 kTIFF_XMP, // 700 kTIFF_Copyright, // 33432 kTIFF_IPTC, // 33723 kTIFF_PSIR, // 34377 kTIFF_ExifIFDPointer, // 34665 kTIFF_GPSInfoIFDPointer, // 34853 kTIFF_DNGVersion, // 50706 kTIFF_DNGBackwardVersion, // 50707 0xFFFF // Must be last as a sentinel. }; static const XMP_Uns16 sKnownThumbnailIFDTags[] = { kTIFF_ImageWidth, // 256 kTIFF_ImageLength, // 257 kTIFF_Compression, // 259 kTIFF_JPEGInterchangeFormat, // 513 kTIFF_JPEGInterchangeFormatLength, // 514 0xFFFF // Must be last as a sentinel. }; static const XMP_Uns16 sKnownExifIFDTags[] = { kTIFF_ExposureTime, // 33434 kTIFF_FNumber, // 33437 kTIFF_ExposureProgram, // 34850 kTIFF_SpectralSensitivity, // 34852 kTIFF_ISOSpeedRatings, // 34855 kTIFF_OECF, // 34856 kTIFF_ExifVersion, // 36864 kTIFF_DateTimeOriginal, // 36867 kTIFF_DateTimeDigitized, // 36868 kTIFF_ComponentsConfiguration, // 37121 kTIFF_CompressedBitsPerPixel, // 37122 kTIFF_ShutterSpeedValue, // 37377 kTIFF_ApertureValue, // 37378 kTIFF_BrightnessValue, // 37379 kTIFF_ExposureBiasValue, // 37380 kTIFF_MaxApertureValue, // 37381 kTIFF_SubjectDistance, // 37382 kTIFF_MeteringMode, // 37383 kTIFF_LightSource, // 37384 kTIFF_Flash, // 37385 kTIFF_FocalLength, // 37386 kTIFF_SubjectArea, // 37396 kTIFF_UserComment, // 37510 kTIFF_SubSecTime, // 37520 kTIFF_SubSecTimeOriginal, // 37521 kTIFF_SubSecTimeDigitized, // 37522 kTIFF_FlashpixVersion, // 40960 kTIFF_ColorSpace, // 40961 kTIFF_PixelXDimension, // 40962 kTIFF_PixelYDimension, // 40963 kTIFF_RelatedSoundFile, // 40964 kTIFF_FlashEnergy, // 41483 kTIFF_SpatialFrequencyResponse, // 41484 kTIFF_FocalPlaneXResolution, // 41486 kTIFF_FocalPlaneYResolution, // 41487 kTIFF_FocalPlaneResolutionUnit, // 41488 kTIFF_SubjectLocation, // 41492 kTIFF_ExposureIndex, // 41493 kTIFF_SensingMethod, // 41495 kTIFF_FileSource, // 41728 kTIFF_SceneType, // 41729 kTIFF_CFAPattern, // 41730 kTIFF_CustomRendered, // 41985 kTIFF_ExposureMode, // 41986 kTIFF_WhiteBalance, // 41987 kTIFF_DigitalZoomRatio, // 41988 kTIFF_FocalLengthIn35mmFilm, // 41989 kTIFF_SceneCaptureType, // 41990 kTIFF_GainControl, // 41991 kTIFF_Contrast, // 41992 kTIFF_Saturation, // 41993 kTIFF_Sharpness, // 41994 kTIFF_DeviceSettingDescription, // 41995 kTIFF_SubjectDistanceRange, // 41996 kTIFF_ImageUniqueID, // 42016 0xFFFF // Must be last as a sentinel. }; static const XMP_Uns16 sKnownGPSInfoIFDTags[] = { kTIFF_GPSVersionID, // 0 kTIFF_GPSLatitudeRef, // 1 kTIFF_GPSLatitude, // 2 kTIFF_GPSLongitudeRef, // 3 kTIFF_GPSLongitude, // 4 kTIFF_GPSAltitudeRef, // 5 kTIFF_GPSAltitude, // 6 kTIFF_GPSTimeStamp, // 7 kTIFF_GPSSatellites, // 8 kTIFF_GPSStatus, // 9 kTIFF_GPSMeasureMode, // 10 kTIFF_GPSDOP, // 11 kTIFF_GPSSpeedRef, // 12 kTIFF_GPSSpeed, // 13 kTIFF_GPSTrackRef, // 14 kTIFF_GPSTrack, // 15 kTIFF_GPSImgDirectionRef, // 16 kTIFF_GPSImgDirection, // 17 kTIFF_GPSMapDatum, // 18 kTIFF_GPSDestLatitudeRef, // 19 kTIFF_GPSDestLatitude, // 20 kTIFF_GPSDestLongitudeRef, // 21 kTIFF_GPSDestLongitude, // 22 kTIFF_GPSDestBearingRef, // 23 kTIFF_GPSDestBearing, // 24 kTIFF_GPSDestDistanceRef, // 25 kTIFF_GPSDestDistance, // 26 kTIFF_GPSProcessingMethod, // 27 kTIFF_GPSAreaInformation, // 28 kTIFF_GPSDateStamp, // 29 kTIFF_GPSDifferential, // 30 0xFFFF // Must be last as a sentinel. }; static const XMP_Uns16 sKnownInteroperabilityIFDTags[] = { // ! Yes, there are none at present. 0xFFFF // Must be last as a sentinel. }; // ! Make sure these are in the same order as the IFD enum! static const XMP_Uns16* sKnownTags[kTIFF_KnownIFDCount] = { sKnownPrimaryIFDTags, sKnownThumbnailIFDTags, sKnownExifIFDTags, sKnownGPSInfoIFDTags, sKnownInteroperabilityIFDTags }; // ================================================================================================= // ================================================================================================= // ================================================================================================= // TIFF_Manager // ============ class TIFF_Manager { // The abstract base class. public: // --------------------------------------------------------------------------------------------- // Types and constants static const XMP_Uns32 kBigEndianPrefix = 0x4D4D002AUL; static const XMP_Uns32 kLittleEndianPrefix = 0x49492A00UL; static const size_t kEmptyTIFFLength = 8; // Just the header. static const size_t kEmptyIFDLength = 2 + 4; // Entry count and next-IFD offset. static const size_t kIFDEntryLength = 12; struct TagInfo { XMP_Uns16 id; XMP_Uns16 type; XMP_Uns32 count; const void* dataPtr; // ! The data must not be changed! Stream endian format! XMP_Uns32 dataLen; // The length in bytes. TagInfo() : id(0), type(0), count(0), dataPtr(0), dataLen(0) {}; TagInfo ( XMP_Uns16 _id, XMP_Uns16 _type, XMP_Uns32 _count, const void* _dataPtr, XMP_Uns32 _dataLen ) : id(_id), type(_type), count(_count), dataPtr(_dataPtr), dataLen(_dataLen) {}; }; typedef std::map TagInfoMap; struct Rational { XMP_Uns32 num, denom; }; struct SRational { XMP_Int32 num, denom; }; // --------------------------------------------------------------------------------------------- // The IsXyzEndian methods return the external endianness of the original parsed TIFF stream. // The \c GetTag methods return native endian values, the \c SetTag methods take native values. // The original endianness is preserved in output. bool IsBigEndian() const { return this->bigEndian; }; bool IsLittleEndian() const { return (! this->bigEndian); }; bool IsNativeEndian() const { return this->nativeEndian; }; // --------------------------------------------------------------------------------------------- // The TIFF_Manager only keeps explicit knowledge of up to 4 IFDs: // - The primary image IFD, also known as the 0th IFD. This must be present. // - A possible Exif general metadata IFD, found from tag 34665 in the primary image IFD. // - A possible Exif GPS metadata IFD, found from tag 34853 in the primary image IFD. // - A possible Exif Interoperability IFD, found from tag 40965 in the Exif general metadata IFD. // // Parsing will silently forget about certain aspects of ill-formed streams. If any tags are // repeated in an IFD, only the last is kept. Any known tags that are in the wrong IFD are // removed. Parsing will sort the tags into ascending order, AppendTIFF and ComposeTIFF will // preserve the sorted order. These fixes do not cause IsChanged to return true, that only // happens if the client makes explicit changes using SetTag or DeleteTag. virtual bool HasExifIFD() const = 0; virtual bool HasGPSInfoIFD() const = 0; // --------------------------------------------------------------------------------------------- // These are the basic methods to get a map of all of the tags in an IFD, to get or set a tag, // or to delete a tag. The dataPtr returned by \c GetTag is consided read-only, the client must // not change it. The ifd parameter to \c GetIFD must be for one of the recognized actual IFDs. // The ifd parameter for the GetTag or SetTag methods can be a specific IFD of kTIFF_KnownIFD. // Using the specific IFD will be slightly faster, saving a lookup in the known tag map. An // exception is thrown if kTIFF_KnownIFD is passed to GetTag or SetTag and the tag is not known. // \c SetTag replaces an existing tag regardless of type or count. \c DeleteTag deletes a tag, // it is a no-op if the tag does not exist. \c GetValueOffset returns the offset within the // parsed stream of the tag's value. It returns 0 if the tag was not in the parsed input. virtual bool GetIFD ( XMP_Uns8 ifd, TagInfoMap* ifdMap ) const = 0; virtual bool GetTag ( XMP_Uns8 ifd, XMP_Uns16 id, TagInfo* info ) const = 0; virtual void SetTag ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16 type, XMP_Uns32 count, const void* dataPtr ) = 0; virtual void DeleteTag ( XMP_Uns8 ifd, XMP_Uns16 id ) = 0; virtual XMP_Uns32 GetValueOffset ( XMP_Uns8 ifd, XMP_Uns16 id ) const = 0; // --------------------------------------------------------------------------------------------- // These methods are for tags whose type can be short or long, depending on the actual value. // \c GetTag_Integer returns false if an existing tag's type is not short, or long, or if the // count is not 1. \c SetTag_Integer replaces an existing tag regardless of type or count, the // new tag will have type short or long. virtual bool GetTag_Integer ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32* data ) const = 0; void SetTag_Integer ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32 data ); // --------------------------------------------------------------------------------------------- // These are customized forms of GetTag that verify the type and return a typed value. False is // returned if the type does not match or if the count is not 1. // *** Should also add support for ASCII multi-strings? virtual bool GetTag_Byte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns8* data ) const = 0; virtual bool GetTag_SByte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int8* data ) const = 0; virtual bool GetTag_Short ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16* data ) const = 0; virtual bool GetTag_SShort ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int16* data ) const = 0; virtual bool GetTag_Long ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32* data ) const = 0; virtual bool GetTag_SLong ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int32* data ) const = 0; virtual bool GetTag_Rational ( XMP_Uns8 ifd, XMP_Uns16 id, Rational* data ) const = 0; virtual bool GetTag_SRational ( XMP_Uns8 ifd, XMP_Uns16 id, SRational* data ) const = 0; virtual bool GetTag_Float ( XMP_Uns8 ifd, XMP_Uns16 id, float* data ) const = 0; virtual bool GetTag_Double ( XMP_Uns8 ifd, XMP_Uns16 id, double* data ) const = 0; virtual bool GetTag_ASCII ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_StringPtr* dataPtr, XMP_StringLen* dataLen ) const = 0; // --------------------------------------------------------------------------------------------- void SetTag_Byte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns8 data ); void SetTag_SByte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int8 data ); void SetTag_Short ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16 data ); void SetTag_SShort ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int16 data ); void SetTag_Long ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32 data ); void SetTag_SLong ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int32 data ); void SetTag_Rational ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32 num, XMP_Uns32 denom ); void SetTag_SRational ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int32 num, XMP_Int32 denom ); void SetTag_Float ( XMP_Uns8 ifd, XMP_Uns16 id, float data ); void SetTag_Double ( XMP_Uns8 ifd, XMP_Uns16 id, double data ); void SetTag_ASCII ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_StringPtr dataPtr ); // --------------------------------------------------------------------------------------------- virtual bool GetTag_EncodedString ( XMP_Uns8 ifd, XMP_Uns16 id, std::string* utf8Str ) const = 0; virtual void SetTag_EncodedString ( XMP_Uns8 ifd, XMP_Uns16 id, const std::string& utf8Str, XMP_Uns8 encoding ) = 0; bool DecodeString ( const void * encodedPtr, size_t encodedLen, std::string* utf8Str ) const; bool EncodeString ( const std::string& utf8Str, XMP_Uns8 encoding, std::string* encodedStr ); // --------------------------------------------------------------------------------------------- // \c IsChanged returns true if a read-write stream has changes that need to be saved. This is // only the case when a \c SetTag method has been called. It is not true for changes related to // parsing normalization such as sorting of tags. \c IsChanged returns false for read-only streams. virtual bool IsChanged() = 0; // --------------------------------------------------------------------------------------------- // \c IsLegacyChanged returns true if a read-write stream has changes that need to be saved to // tags other than the XMP (tag 700). This only the case when a \c SetTag method has been // called. It is not true for changes related to parsing normalization such as sorting of tags. // \c IsLegacyChanged returns false for read-only streams. virtual bool IsLegacyChanged() = 0; // --------------------------------------------------------------------------------------------- // \c UpdateMemoryStream is mainly applicable to memory-based read-write streams. It recomposes // the memory stream to incorporate all changes. The new length and data pointer are returned. // \c UpdateMemoryStream can be used with a read-only memory stream to get the raw stream info. // // \c UpdateFileStream updates file-based TIFF. The client must guarantee that the TIFF portion // of the file matches that from the parse in the file-based constructor. Offsets saved from that // parse must still be valid. The open file reference need not be the same, e.g. the client can // be doing a crash-safe update into a temporary copy. // // Both \c UpdateMemoryStream and \c UpdateFileStream use an update-by-append model. Changes are // written in-place where they fit, anything requiring growth is appended to the end and the old // space is abandoned. The end for memory-based TIFF is the end of the data block, the end for // file-based TIFF is the end of the file. This update-by-append model has the advantage of not // perturbing any hidden offsets, a common feature of proprietary MakerNotes. // // The condenseStream parameter to UpdateMemoryStream can be used to rewrite the full stream // instead of appending. This will discard any MakerNote tags and risks breaking offsets that // are hidden. This can be necessary though to try to make the TIFF fit in a JPEG file. virtual void ParseMemoryStream ( const void* data, XMP_Uns32 length, bool copyData = true ) = 0; virtual void ParseFileStream ( LFA_FileRef fileRef ) = 0; virtual void IntegrateFromPShop6 ( const void * buriedPtr, size_t buriedLen ) = 0; virtual XMP_Uns32 UpdateMemoryStream ( void** dataPtr, bool condenseStream = false ) = 0; virtual void UpdateFileStream ( LFA_FileRef fileRef ) = 0; // --------------------------------------------------------------------------------------------- GetUns16_Proc GetUns16; // Get values from the TIFF stream. GetUns32_Proc GetUns32; // Always native endian on the outside, stream endian in the stream. GetFloat_Proc GetFloat; GetDouble_Proc GetDouble; PutUns16_Proc PutUns16; // Put values into the TIFF stream. PutUns32_Proc PutUns32; // Always native endian on the outside, stream endian in the stream. PutFloat_Proc PutFloat; PutDouble_Proc PutDouble; virtual ~TIFF_Manager() {}; protected: bool bigEndian, nativeEndian; XMP_Uns32 CheckTIFFHeader ( const XMP_Uns8* tiffPtr, XMP_Uns32 length ); TIFF_Manager(); // Force clients to use the reader or writer derived classes. struct RawIFDEntry { XMP_Uns16 id; XMP_Uns16 type; XMP_Uns32 count; XMP_Uns32 dataOrOffset; }; }; // TIFF_Manager // ================================================================================================= // ================================================================================================= // ================================================================================================= // TIFF_MemoryReader // ================= class TIFF_MemoryReader : public TIFF_Manager { // The derived class for memory-based read-only access. public: bool HasExifIFD() const { return (containedIFDs[kTIFF_ExifIFD].count != 0); }; bool HasGPSInfoIFD() const { return (containedIFDs[kTIFF_GPSInfoIFD].count != 0); }; bool GetIFD ( XMP_Uns8 ifd, TagInfoMap* ifdMap ) const; bool GetTag ( XMP_Uns8 ifd, XMP_Uns16 id, TagInfo* info ) const; void SetTag ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16 type, XMP_Uns32 count, const void* dataPtr ) { NotAppropriate(); }; void DeleteTag ( XMP_Uns8 ifd, XMP_Uns16 id ) { NotAppropriate(); }; XMP_Uns32 GetValueOffset ( XMP_Uns8 ifd, XMP_Uns16 id ) const; bool GetTag_Integer ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32* data ) const; bool GetTag_Byte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns8* data ) const; bool GetTag_SByte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int8* data ) const; bool GetTag_Short ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16* data ) const; bool GetTag_SShort ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int16* data ) const; bool GetTag_Long ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32* data ) const; bool GetTag_SLong ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int32* data ) const; bool GetTag_Rational ( XMP_Uns8 ifd, XMP_Uns16 id, Rational* data ) const; bool GetTag_SRational ( XMP_Uns8 ifd, XMP_Uns16 id, SRational* data ) const; bool GetTag_Float ( XMP_Uns8 ifd, XMP_Uns16 id, float* data ) const; bool GetTag_Double ( XMP_Uns8 ifd, XMP_Uns16 id, double* data ) const; bool GetTag_ASCII ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_StringPtr* dataPtr, XMP_StringLen* dataLen ) const; bool GetTag_EncodedString ( XMP_Uns8 ifd, XMP_Uns16 id, std::string* utf8Str ) const; void SetTag_EncodedString ( XMP_Uns8 ifd, XMP_Uns16 id, const std::string& utf8Str, XMP_Uns8 encoding ) { NotAppropriate(); }; bool IsChanged() { return false; }; bool IsLegacyChanged() { return false; }; void ParseMemoryStream ( const void* data, XMP_Uns32 length, bool copyData = true ); void ParseFileStream ( LFA_FileRef fileRef ) { NotAppropriate(); }; void IntegrateFromPShop6 ( const void * buriedPtr, size_t buriedLen ) { NotAppropriate(); }; XMP_Uns32 UpdateMemoryStream ( void** dataPtr, bool condenseStream = false ) { if ( dataPtr != 0 ) *dataPtr = tiffStream; return tiffLength; }; void UpdateFileStream ( LFA_FileRef fileRef ) { NotAppropriate(); }; TIFF_MemoryReader() : ownedStream(false), tiffStream(0), tiffLength(0) {}; virtual ~TIFF_MemoryReader() { if ( this->ownedStream ) free ( this->tiffStream ); }; private: bool ownedStream; XMP_Uns8* tiffStream; XMP_Uns32 tiffLength; // Memory usage notes: TIFF_MemoryReader is for memory-based read-only usage (both apply). There // is no need to ever allocate separate blocks of memory, everything is used directly from the // TIFF stream. Data pointers are computed on the fly, the offset field is 4 bytes and pointers // will be 8 bytes for 64-bit platforms. struct TweakedIFDEntry { // ! Most fields are in native byte order, dataOrPos is for offsets only. XMP_Uns16 id; XMP_Uns16 type; XMP_Uns32 bytes; XMP_Uns32 dataOrPos; TweakedIFDEntry() : id(0), type(0), bytes(0), dataOrPos(0) {}; }; struct TweakedIFDInfo { XMP_Uns16 count; TweakedIFDEntry* entries; TweakedIFDInfo() : count(0), entries(0) {}; }; TweakedIFDInfo containedIFDs[kTIFF_KnownIFDCount]; static void SortIFD ( TweakedIFDInfo* thisIFD ); XMP_Uns32 ProcessOneIFD ( XMP_Uns32 ifdOffset, XMP_Uns8 ifd ); const TweakedIFDEntry* FindTagInIFD ( XMP_Uns8 ifd, XMP_Uns16 id ) const; const inline void* GetDataPtr ( const TweakedIFDEntry* tifdEntry ) const { if ( tifdEntry->bytes <= 4 ) return &tifdEntry->dataOrPos; else return (this->tiffStream + tifdEntry->dataOrPos); }; static inline void NotAppropriate() { XMP_Throw ( "Not appropriate for TIFF_Reader", kXMPErr_InternalFailure ); }; }; // TIFF_MemoryReader // ================================================================================================= // ================================================================================================= // ================================================================================================= // TIFF_FileWriter // =============== class TIFF_FileWriter : public TIFF_Manager { // The derived class for file-based or read-write access. public: bool HasExifIFD() const { return this->containedIFDs[kTIFF_ExifIFD].tagMap.size() != 0; }; bool HasGPSInfoIFD() const { return this->containedIFDs[kTIFF_GPSInfoIFD].tagMap.size() != 0; }; bool GetIFD ( XMP_Uns8 ifd, TagInfoMap* ifdMap ) const; bool GetTag ( XMP_Uns8 ifd, XMP_Uns16 id, TagInfo* info ) const; void SetTag ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16 type, XMP_Uns32 count, const void* dataPtr ); void DeleteTag ( XMP_Uns8 ifd, XMP_Uns16 id ); XMP_Uns32 GetValueOffset ( XMP_Uns8 ifd, XMP_Uns16 id ) const; bool GetTag_Integer ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32* data ) const; bool GetTag_Byte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns8* data ) const; bool GetTag_SByte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int8* data ) const; bool GetTag_Short ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16* data ) const; bool GetTag_SShort ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int16* data ) const; bool GetTag_Long ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32* data ) const; bool GetTag_SLong ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int32* data ) const; bool GetTag_Rational ( XMP_Uns8 ifd, XMP_Uns16 id, Rational* data ) const; bool GetTag_SRational ( XMP_Uns8 ifd, XMP_Uns16 id, SRational* data ) const; bool GetTag_Float ( XMP_Uns8 ifd, XMP_Uns16 id, float* data ) const; bool GetTag_Double ( XMP_Uns8 ifd, XMP_Uns16 id, double* data ) const; bool GetTag_ASCII ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_StringPtr* dataPtr, XMP_StringLen* dataLen ) const; bool GetTag_EncodedString ( XMP_Uns8 ifd, XMP_Uns16 id, std::string* utf8Str ) const; void SetTag_EncodedString ( XMP_Uns8 ifd, XMP_Uns16 id, const std::string& utf8Str, XMP_Uns8 encoding ); bool IsChanged() { return this->changed; }; bool IsLegacyChanged(); enum { kDoNotCopyData = false }; void ParseMemoryStream ( const void* data, XMP_Uns32 length, bool copyData = true ); void ParseFileStream ( LFA_FileRef fileRef ); void IntegrateFromPShop6 ( const void * buriedPtr, size_t buriedLen ); XMP_Uns32 UpdateMemoryStream ( void** dataPtr, bool condenseStream = false ); void UpdateFileStream ( LFA_FileRef fileRef ); TIFF_FileWriter(); virtual ~TIFF_FileWriter(); private: bool changed, legacyDeleted; bool memParsed, fileParsed; bool ownedStream; XMP_Uns8* memStream; XMP_Uns32 tiffLength; // Memory usage notes: TIFF_FileWriter is for file-based OR read/write usage. For memory-based // streams the dataPtr is initially into the stream, regardless of size. For file-based streams // the dataPtr is initially a separate allocation for large values (over 4 bytes), and points to // the smallValue field for small values. This is also the usage when a tag is changed (for both // memory and file cases), the dataPtr is a separate allocation for large values (over 4 bytes), // and points to the smallValue field for small values. // ! The working data values are always stream endian, no matter where stored. They are flipped // ! as necessary by GetTag and SetTag. static const bool kIsFileBased = true; // For use in the InternalTagInfo constructor. static const bool kIsMemoryBased = false; class InternalTagInfo { public: XMP_Uns16 id; XMP_Uns16 type; XMP_Uns32 count; XMP_Uns32 dataLen; XMP_Uns32 smallValue; // Small value in stream endianness, but "left" justified. XMP_Uns8* dataPtr; // Parsing captures all small values, only large ones that we care about. XMP_Uns32 origDataLen; // The original (parse time) data length in bytes. XMP_Uns32 origDataOffset; // The original data offset, regardless of length. bool changed; bool fileBased; inline void FreeData() { if ( this->fileBased || this->changed ) { if ( (this->dataLen > 4) && (this->dataPtr != 0) ) { free ( this->dataPtr ); this->dataPtr = 0; } } } InternalTagInfo ( XMP_Uns16 _id, XMP_Uns16 _type, XMP_Uns32 _count, bool _fileBased ) : id(_id), type(_type), count(_count), dataLen(0), smallValue(0), dataPtr(0), origDataLen(0), origDataOffset(0), changed(false), fileBased(_fileBased) {}; ~InternalTagInfo() { this->FreeData(); }; void operator= ( const InternalTagInfo & in ) { // ! Gag! Transfer ownership of the dataPtr! this->FreeData(); memcpy ( this, &in, sizeof(*this) ); // AUDIT: Use of sizeof(InternalTagInfo) is safe. if ( this->dataLen <= 4 ) { this->dataPtr = (XMP_Uns8*) &this->smallValue; // Don't use the copied pointer. } else { *((XMP_Uns8**)&in.dataPtr) = 0; // The pointer is now owned by "this". } }; private: InternalTagInfo() // Hidden on purpose, fileBased must be properly set. : id(0), type(0), count(0), dataLen(0), smallValue(0), dataPtr(0), origDataLen(0), origDataOffset(0), changed(false), fileBased(false) {}; }; typedef std::map InternalTagMap; struct InternalIFDInfo { bool changed; XMP_Uns16 origCount; // Original number of IFD entries. XMP_Uns32 origIFDOffset; // Original stream offset of the IFD. XMP_Uns32 origNextIFD; // Original stream offset of the following IFD. InternalTagMap tagMap; InternalIFDInfo() : changed(false), origCount(0), origIFDOffset(0), origNextIFD(0) {}; inline void clear() { this->changed = false; this->origCount = 0; this->origIFDOffset = this->origNextIFD = 0; this->tagMap.clear(); }; }; InternalIFDInfo containedIFDs[kTIFF_KnownIFDCount]; static XMP_Uns8 PickIFD ( XMP_Uns8 ifd, XMP_Uns16 id ); const InternalTagInfo* FindTagInIFD ( XMP_Uns8 ifd, XMP_Uns16 id ) const; void DeleteExistingInfo(); XMP_Uns32 ProcessMemoryIFD ( XMP_Uns32 ifdOffset, XMP_Uns8 ifd ); XMP_Uns32 ProcessFileIFD ( XMP_Uns8 ifd, XMP_Uns32 ifdOffset, LFA_FileRef fileRef, IOBuffer* ioBuf ); void ProcessPShop6IFD ( const TIFF_MemoryReader& buriedExif, XMP_Uns8 ifd ); void* CopyTagToMasterIFD ( const TagInfo& ps6Tag, InternalIFDInfo* masterIFD ); void PreflightIFDLinkage(); XMP_Uns32 DetermineVisibleLength(); XMP_Uns32 DetermineAppendInfo ( XMP_Uns32 appendedOrigin, bool appendedIFDs[kTIFF_KnownIFDCount], XMP_Uns32 newIFDOffsets[kTIFF_KnownIFDCount], bool appendAll = false ); void UpdateMemByAppend ( XMP_Uns8** newStream_out, XMP_Uns32* newLength_out, bool appendAll = false, XMP_Uns32 extraSpace = 0 ); void UpdateMemByRewrite ( XMP_Uns8** newStream_out, XMP_Uns32* newLength_out ); void WriteFileIFD ( LFA_FileRef fileRef, InternalIFDInfo & thisIFD ); }; // TIFF_FileWriter // ================================================================================================= #endif // __TIFF_Support_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/PSIR_MemoryReader.cpp0000664000175000017500000000702612150230672021441 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "PSIR_Support.hpp" #include "EndianUtils.hpp" #include // ================================================================================================= /// \file PSIR_MemoryReader.cpp /// \brief Implementation of the memory-based read-only form of PSIR_Manager. // ================================================================================================= // ================================================================================================= // PSIR_MemoryReader::GetImgRsrc // ============================= bool PSIR_MemoryReader::GetImgRsrc ( XMP_Uns16 id, ImgRsrcInfo* info ) const { ImgRsrcMap::const_iterator rsrcPos = this->imgRsrcs.find ( id ); if ( rsrcPos == this->imgRsrcs.end() ) return false; if ( info != 0 ) *info = rsrcPos->second; return true; } // PSIR_MemoryReader::GetImgRsrc // ================================================================================================= // PSIR_MemoryReader::ParseMemoryResources // ======================================= void PSIR_MemoryReader::ParseMemoryResources ( const void* data, XMP_Uns32 length, bool copyData /* = true */ ) { // Get rid of any existing image resources. if ( this->ownedContent ) free ( this->psirContent ); this->ownedContent = false; this->psirContent = 0; this->psirLength = 0; this->imgRsrcs.clear(); if ( length == 0 ) return; // Allocate space for the full in-memory data and copy it. if ( ! copyData ) { this->psirContent = (XMP_Uns8*) data; XMP_Assert ( ! this->ownedContent ); } else { if ( length > 100*1024*1024 ) XMP_Throw ( "Outrageous length for memory-based PSIR", kXMPErr_BadPSIR ); this->psirContent = (XMP_Uns8*) malloc(length); if ( this->psirContent == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); memcpy ( this->psirContent, data, length ); // AUDIT: Safe, malloc'ed length bytes above. this->ownedContent = true; } this->psirLength = length; // Capture the info for all of the resources. XMP_Uns8* psirPtr = this->psirContent; XMP_Uns8* psirEnd = psirPtr + length; XMP_Uns8* psirLimit = psirEnd - kMinImgRsrcSize; while ( psirPtr <= psirLimit ) { XMP_Uns32 type = GetUns32BE(psirPtr); XMP_Uns16 id = GetUns16BE(psirPtr+4); psirPtr += 6; // Advance to the resource name. XMP_Uns16 nameLen = psirPtr[0]; // ! The length for the Pascal string, w/ room for "+2". psirPtr += ((nameLen + 2) & 0xFFFE); // ! Round up to an even offset. Yes, +2! if ( psirPtr > psirEnd-4 ) break; // Bad image resource. Throw instead? XMP_Uns32 dataLen = GetUns32BE(psirPtr); psirPtr += 4; // Advance to the resource data. XMP_Uns32 psirOffset = (XMP_Uns32) (psirPtr - this->psirContent); if ( (dataLen > length) || (psirPtr > psirEnd-dataLen) ) break; // Bad image resource. Throw instead? if ( type == k8BIM ) { // For read-only usage we ignore everything other than '8BIM' resources. ImgRsrcInfo info ( id, dataLen, psirPtr, psirOffset ); this->imgRsrcs[id] = info; } psirPtr += ((dataLen + 1) & 0xFFFFFFFEUL); // ! Round up to an even offset. } } // PSIR_MemoryReader::ParseMemoryResources exempi-2.2.1/source/XMPFiles/FormatSupport/Makefile.in0000664000175000017500000005410412150231002017535 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = source/XMPFiles/FormatSupport DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libformatsupport_la_LIBADD = am_libformatsupport_la_OBJECTS = PSIR_FileWriter.lo Reconcile_Impl.lo \ ReconcileTIFF.lo TIFF_MemoryReader.lo IPTC_Support.lo \ PSIR_MemoryReader.lo ReconcileIPTC.lo RIFF.lo RIFF_Support.lo \ TIFF_Support.lo ISOBaseMedia_Support.lo PNG_Support.lo \ ReconcileLegacy.lo SWF_Support.lo XDCAM_Support.lo \ TIFF_FileWriter.lo XMPScanner.lo GIF_Support.lo \ MOOV_Support.lo QuickTime_Support.lo ASF_Support.lo libformatsupport_la_OBJECTS = $(am_libformatsupport_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libformatsupport_la_SOURCES) DIST_SOURCES = $(libformatsupport_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libformatsupport.la noinst_HEADERS = IPTC_Support.hpp PSIR_Support.hpp\ Reconcile_Impl.hpp RIFF_Support.hpp XMPScanner.hpp\ ID3_Support.hpp PNG_Support.hpp QuickTime_Support.hpp\ ReconcileLegacy.hpp TIFF_Support.hpp GIF_Support.hpp INCLUDES = -I$(srcdir)/.. -I$(srcdir)/../FileHandlers -I$(srcdir)/../../common \ -I$(top_srcdir)/public/include/ -I$(top_srcdir)/build/ \ -I$(top_srcdir)/third-party/MD5 AM_CPPFLAGS = -Wno-multichar\ -D@EXEMPI_PLATFORM_DEF@=1 -DXMP_IMPL=1 -DXMP_ClientBuild=0 \ -D_FILE_OFFSET_BITS=64 -DHAVE_EXPAT_CONFIG_H=1 -DXML_STATIC=1 libformatsupport_la_SOURCES = PSIR_FileWriter.cpp Reconcile_Impl.cpp \ ReconcileTIFF.cpp TIFF_MemoryReader.cpp \ IPTC_Support.cpp PSIR_MemoryReader.cpp ReconcileIPTC.cpp \ RIFF.cpp RIFF.hpp \ RIFF_Support.cpp TIFF_Support.cpp \ ISOBaseMedia_Support.hpp ISOBaseMedia_Support.cpp \ PNG_Support.cpp ReconcileLegacy.cpp \ SWF_Support.hpp SWF_Support.cpp\ XDCAM_Support.hpp XDCAM_Support.cpp\ TIFF_FileWriter.cpp XMPScanner.cpp GIF_Support.cpp \ MOOV_Support.cpp MOOV_Support.hpp \ QuickTime_Support.cpp \ ASF_Support.hpp ASF_Support.cpp \ MacScriptExtracts.h \ $(NULL) all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign source/XMPFiles/FormatSupport/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign source/XMPFiles/FormatSupport/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libformatsupport.la: $(libformatsupport_la_OBJECTS) $(libformatsupport_la_DEPENDENCIES) $(EXTRA_libformatsupport_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(libformatsupport_la_OBJECTS) $(libformatsupport_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ASF_Support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GIF_Support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/IPTC_Support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ISOBaseMedia_Support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MOOV_Support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PNG_Support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSIR_FileWriter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSIR_MemoryReader.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QuickTime_Support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RIFF.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RIFF_Support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ReconcileIPTC.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ReconcileLegacy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ReconcileTIFF.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Reconcile_Impl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SWF_Support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TIFF_FileWriter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TIFF_MemoryReader.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TIFF_Support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XDCAM_Support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMPScanner.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/source/XMPFiles/FormatSupport/QuickTime_Support.hpp0000664000175000017500000000742612150230673021652 00000000000000#ifndef __QuickTime_Support_hpp__ #define __QuickTime_Support_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2009 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include #include #include #include "XMPFiles_Impl.hpp" #include "LargeFileAccess.hpp" #include "ISOBaseMedia_Support.hpp" #include "MOOV_Support.hpp" // ================================================================================================= // ================================================================================================= // ================================================================================================= // TradQT_Manager // ============== // Support for selected traditional QuickTime metadata items. The supported items are the children // of the 'moov'/'udta' box whose type begins with 0xA9, a MacRoman copyright symbol. Each of these // is a box whose contents are a sequence of "mini boxes" analogous to XMP AltText arrays. Each mini // box has a 16-bit size, 16-bit language code, and text. The language code values are the old // Macintosh Script Manager langXyz codes, the text encoding is implicit, see Mac Script.h. enum { // List of recognized items from the QuickTime 'moov'/'udta' box. // These items are defined by Adobe. kQTilst_Reel = 0xA952454CUL, // '©REL' kQTilst_Timecode = 0xA954494DUL, // '©TIM' kQTilst_TimeScale = 0xA9545343UL, // '©TSC' kQTilst_TimeSize = 0xA954535AUL // '©TSZ' }; enum { kNoMacLang = 0xFFFF, kNoMacScript = 0xFFFF }; extern bool ConvertToMacLang ( const std::string & utf8Value, XMP_Uns16 macLang, std::string * macValue ); extern bool ConvertFromMacLang ( const std::string & macValue, XMP_Uns16 macLang, std::string * utf8Value ); class TradQT_Manager { public: TradQT_Manager() : changed(false) {}; bool ParseCachedBoxes ( const MOOV_Manager & moovMgr ); bool ImportSimpleXMP ( XMP_Uns32 id, SXMPMeta * xmp, XMP_StringPtr ns, XMP_StringPtr prop ) const; bool ImportLangAltXMP ( XMP_Uns32 id, SXMPMeta * xmp, XMP_StringPtr ns, XMP_StringPtr langArray ) const; void ExportSimpleXMP ( XMP_Uns32 id, const SXMPMeta & xmp, XMP_StringPtr ns, XMP_StringPtr prop, bool createWithZeroLang = false ); void ExportLangAltXMP ( XMP_Uns32 id, const SXMPMeta & xmp, XMP_StringPtr ns, XMP_StringPtr langArray ); bool IsChanged() const { return this->changed; }; void UpdateChangedBoxes ( MOOV_Manager * moovMgr ); private: struct ValueInfo { bool marked; XMP_Uns16 macLang; XMP_StringPtr xmpLang; // ! Only set if macLang is known, i.e. the value can be converted. std::string macValue; ValueInfo() : marked(false), macLang(kNoMacLang), xmpLang("") {}; }; typedef std::vector ValueVector; typedef ValueVector::iterator ValueInfoPos; typedef ValueVector::const_iterator ValueInfoCPos; struct ParsedBoxInfo { XMP_Uns32 id; ValueVector values; bool changed; ParsedBoxInfo() : id(0), changed(false) {}; ParsedBoxInfo ( XMP_Uns32 _id ) : id(_id), changed(false) {}; }; typedef std::map < XMP_Uns32, ParsedBoxInfo > InfoMap; // Metadata item kind and content info. typedef InfoMap::iterator InfoMapPos; typedef InfoMap::const_iterator InfoMapCPos; InfoMap parsedBoxes; bool changed; bool ImportLangItem ( const ValueInfo & qtItem, SXMPMeta * xmp, XMP_StringPtr ns, XMP_StringPtr langArray ) const; }; // TradQT_Manager #endif // __QuickTime_Support_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/TIFF_MemoryReader.cpp0000664000175000017500000005155512150230673021423 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "TIFF_Support.hpp" // ================================================================================================= /// \file TIFF_MemoryReader.cpp /// \brief Implementation of the memory-based read-only TIFF_Manager. /// /// The read-only forms of TIFF_Manager are derived from TIFF_Reader. The GetTag methods are common /// implementations in TIFF_Reader. The parsing code is different in the TIFF_MemoryReader and /// TIFF_FileReader constructors. There are also separate destructors to release captured info. /// /// The read-only implementations use runtime data that is simple tweaks on the stored form. The /// memory-based reader has one block of data for the whole TIFF stream. The file-based reader has /// one for each IFD, plus one for the collected non-local data for each IFD. Otherwise the logic /// is the same in both cases. /// /// The count for each IFD is extracted and a pointer set to the first entry in each IFD (serving as /// a normal C array pointer). The IFD entries are tweaked as follows: /// /// \li The id and type fields are converted to native values. /// \li The count field is converted to a native byte count. /// \li If the data is not inline the offset is converted to a pointer. /// /// The tag values, whether inline or not, are not converted to native values. The values returned /// from the GetTag methods are converted on the fly. The id, type, and count fields are easier to /// convert because their types are fixed. They are used more, and more valuable to convert. // ================================================================================================= // ================================================================================================= // TIFF_MemoryReader::SortIFD // ========================== // // Does a fairly simple minded insertion-like sort. This sort is not going to be optimal for edge // cases like and IFD with lots of duplicates. // *** Might be better done using read and write pointers and two loops. The first loop moves out // *** of order tags by a modified bubble sort, shifting the middle down one at a time in the loop. // *** The first loop stops when a duplicate is hit. The second loop continues by moving the tail // *** entries up to the appropriate slot. void TIFF_MemoryReader::SortIFD ( TweakedIFDInfo* thisIFD ) { XMP_Uns16 tagCount = thisIFD->count; TweakedIFDEntry* ifdEntries = thisIFD->entries; XMP_Uns16 prevTag = ifdEntries[0].id; for ( size_t i = 1; i < tagCount; ++i ) { XMP_Uns16 thisTag = ifdEntries[i].id; if ( thisTag > prevTag ) { // In proper order. prevTag = thisTag; } else if ( thisTag == prevTag ) { // Duplicate tag, keep the 2nd copy, move the tail of the array up, prevTag is unchanged. memcpy ( &ifdEntries[i-1], &ifdEntries[i], 12*(tagCount-i) ); // AUDIT: Safe, moving tail forward, i >= 1. --tagCount; --i; // ! Don't move forward in the array, we've moved the unseen part up. } else if ( thisTag < prevTag ) { // Out of order, move this tag up, prevTag is unchanged. Might still be a duplicate! XMP_Int32 j; // ! Need a signed value. for ( j = (XMP_Int32)i-1; j >= 0; --j ) { if ( ifdEntries[j].id <= thisTag ) break; } if ( (j >= 0) && (ifdEntries[j].id == thisTag) ) { // Out of order duplicate, move it to position j, move the tail of the array up. ifdEntries[j] = ifdEntries[i]; memcpy ( &ifdEntries[i], &ifdEntries[i+1], 12*(tagCount-(i+1)) ); // AUDIT: Safe, moving tail forward, i >= 1. --tagCount; --i; // ! Don't move forward in the array, we've moved the unseen part up. } else { // Move the out of order entry to position j+1, move the middle of the array down. TweakedIFDEntry temp = ifdEntries[i]; ++j; // ! So the insertion index becomes j. memcpy ( &ifdEntries[j+1], &ifdEntries[j], 12*(i-j) ); // AUDIT: Safe, moving less than i entries to a location before i. ifdEntries[j] = temp; } } } thisIFD->count = tagCount; // Save the final count. } // TIFF_MemoryReader::SortIFD // ================================================================================================= // TIFF_MemoryReader::GetIFD // ========================= bool TIFF_MemoryReader::GetIFD ( XMP_Uns8 ifd, TagInfoMap* ifdMap ) const { if ( ifd > kTIFF_LastRealIFD ) XMP_Throw ( "Invalid IFD requested", kXMPErr_InternalFailure ); const TweakedIFDInfo* thisIFD = &containedIFDs[ifd]; if ( ifdMap != 0 ) ifdMap->clear(); if ( thisIFD->count == 0 ) return false; if ( ifdMap != 0 ) { for ( size_t i = 0; i < thisIFD->count; ++i ) { TweakedIFDEntry* thisTag = &(thisIFD->entries[i]); if ( (thisTag->type < kTIFF_ByteType) || (thisTag->type > kTIFF_LastType) ) continue; // Bad type, skip this tag. TagInfo info ( thisTag->id, thisTag->type, 0, 0, thisTag->bytes ); info.count = info.dataLen / (XMP_Uns32)kTIFF_TypeSizes[info.type]; info.dataPtr = this->GetDataPtr ( thisTag ); (*ifdMap)[info.id] = info; } } return true; } // TIFF_MemoryReader::GetIFD // ================================================================================================= // TIFF_MemoryReader::FindTagInIFD // =============================== const TIFF_MemoryReader::TweakedIFDEntry* TIFF_MemoryReader::FindTagInIFD ( XMP_Uns8 ifd, XMP_Uns16 id ) const { if ( ifd == kTIFF_KnownIFD ) { // ... lookup the tag in the known tag map } if ( ifd > kTIFF_LastRealIFD ) XMP_Throw ( "Invalid IFD requested", kXMPErr_InternalFailure ); const TweakedIFDInfo* thisIFD = &containedIFDs[ifd]; if ( thisIFD->count == 0 ) return 0; XMP_Uns32 spanLength = thisIFD->count; const TweakedIFDEntry* spanBegin = &(thisIFD->entries[0]); while ( spanLength > 1 ) { XMP_Uns32 halfLength = spanLength >> 1; // Since spanLength > 1, halfLength > 0. const TweakedIFDEntry* spanMiddle = spanBegin + halfLength; // There are halfLength entries below spanMiddle, then the spanMiddle entry, then // spanLength-halfLength-1 entries above spanMiddle (which can be none). if ( spanMiddle->id == id ) { spanBegin = spanMiddle; break; } else if ( spanMiddle->id > id ) { spanLength = halfLength; // Discard the middle. } else { spanBegin = spanMiddle; // Keep a valid spanBegin for the return check, don't use spanMiddle+1. spanLength -= halfLength; } } if ( spanBegin->id != id ) spanBegin = 0; return spanBegin; } // TIFF_MemoryReader::FindTagInIFD // ================================================================================================= // TIFF_MemoryReader::GetValueOffset // ================================= XMP_Uns32 TIFF_MemoryReader::GetValueOffset ( XMP_Uns8 ifd, XMP_Uns16 id ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return 0; XMP_Uns8 * valuePtr = (XMP_Uns8*) this->GetDataPtr ( thisTag ); return (XMP_Uns32)(valuePtr - this->tiffStream); // ! TIFF streams can't exceed 4GB. } // TIFF_MemoryReader::GetValueOffset // ================================================================================================= // TIFF_MemoryReader::GetTag // ========================= bool TIFF_MemoryReader::GetTag ( XMP_Uns8 ifd, XMP_Uns16 id, TagInfo* info ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type < kTIFF_ByteType) || (thisTag->type > kTIFF_LastType) ) return false; // Bad type, skip this tag. if ( info != 0 ) { info->id = thisTag->id; info->type = thisTag->type; info->count = thisTag->bytes / (XMP_Uns32)kTIFF_TypeSizes[thisTag->type]; info->dataLen = thisTag->bytes; info->dataPtr = this->GetDataPtr ( thisTag ); } return true; } // TIFF_MemoryReader::GetTag // ================================================================================================= // TIFF_MemoryReader::GetTag_Integer // ================================= bool TIFF_MemoryReader::GetTag_Integer ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32* data ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( data != 0 ) { if ( thisTag->type == kTIFF_ShortType ) { if ( thisTag->bytes != 2 ) return false; // Wrong count. *data = this->GetUns16 ( this->GetDataPtr ( thisTag ) ); } else if ( thisTag->type == kTIFF_LongType ) { if ( thisTag->bytes != 4 ) return false; // Wrong count. *data = this->GetUns32 ( this->GetDataPtr ( thisTag ) ); } else { return false; } } return true; } // TIFF_MemoryReader::GetTag_Integer // ================================================================================================= // TIFF_MemoryReader::GetTag_Byte // ============================== bool TIFF_MemoryReader::GetTag_Byte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns8* data ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_ByteType) || (thisTag->bytes != 1) ) return false; if ( data != 0 ) { *data = * ( (XMP_Uns8*) this->GetDataPtr ( thisTag ) ); } return true; } // TIFF_MemoryReader::GetTag_Byte // ================================================================================================= // TIFF_MemoryReader::GetTag_SByte // =============================== bool TIFF_MemoryReader::GetTag_SByte ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int8* data ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_SByteType) || (thisTag->bytes != 1) ) return false; if ( data != 0 ) { *data = * ( (XMP_Int8*) this->GetDataPtr ( thisTag ) ); } return true; } // TIFF_MemoryReader::GetTag_SByte // ================================================================================================= // TIFF_MemoryReader::GetTag_Short // =============================== bool TIFF_MemoryReader::GetTag_Short ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns16* data ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_ShortType) || (thisTag->bytes != 2) ) return false; if ( data != 0 ) { *data = this->GetUns16 ( this->GetDataPtr ( thisTag ) ); } return true; } // TIFF_MemoryReader::GetTag_Short // ================================================================================================= // TIFF_MemoryReader::GetTag_SShort // ================================ bool TIFF_MemoryReader::GetTag_SShort ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int16* data ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_SShortType) || (thisTag->bytes != 2) ) return false; if ( data != 0 ) { *data = (XMP_Int16) this->GetUns16 ( this->GetDataPtr ( thisTag ) ); } return true; } // TIFF_MemoryReader::GetTag_SShort // ================================================================================================= // TIFF_MemoryReader::GetTag_Long // ============================== bool TIFF_MemoryReader::GetTag_Long ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Uns32* data ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_LongType) || (thisTag->bytes != 4) ) return false; if ( data != 0 ) { *data = this->GetUns32 ( this->GetDataPtr ( thisTag ) ); } return true; } // TIFF_MemoryReader::GetTag_Long // ================================================================================================= // TIFF_MemoryReader::GetTag_SLong // =============================== bool TIFF_MemoryReader::GetTag_SLong ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_Int32* data ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_SLongType) || (thisTag->bytes != 4) ) return false; if ( data != 0 ) { *data = (XMP_Int32) this->GetUns32 ( this->GetDataPtr ( thisTag ) ); } return true; } // TIFF_MemoryReader::GetTag_SLong // ================================================================================================= // TIFF_MemoryReader::GetTag_Rational // ================================== bool TIFF_MemoryReader::GetTag_Rational ( XMP_Uns8 ifd, XMP_Uns16 id, Rational* data ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_RationalType) || (thisTag->bytes != 8) ) return false; if ( data != 0 ) { XMP_Uns32* dataPtr = (XMP_Uns32*) this->GetDataPtr ( thisTag ); data->num = this->GetUns32 ( dataPtr ); data->denom = this->GetUns32 ( dataPtr+1 ); } return true; } // TIFF_MemoryReader::GetTag_Rational // ================================================================================================= // TIFF_MemoryReader::GetTag_SRational // =================================== bool TIFF_MemoryReader::GetTag_SRational ( XMP_Uns8 ifd, XMP_Uns16 id, SRational* data ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_SRationalType) || (thisTag->bytes != 8) ) return false; if ( data != 0 ) { XMP_Uns32* dataPtr = (XMP_Uns32*) this->GetDataPtr ( thisTag ); data->num = (XMP_Int32) this->GetUns32 ( dataPtr ); data->denom = (XMP_Int32) this->GetUns32 ( dataPtr+1 ); } return true; } // TIFF_MemoryReader::GetTag_SRational // ================================================================================================= // TIFF_MemoryReader::GetTag_Float // =============================== bool TIFF_MemoryReader::GetTag_Float ( XMP_Uns8 ifd, XMP_Uns16 id, float* data ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_FloatType) || (thisTag->bytes != 4) ) return false; if ( data != 0 ) { *data = this->GetFloat ( this->GetDataPtr ( thisTag ) ); } return true; } // TIFF_MemoryReader::GetTag_Float // ================================================================================================= // TIFF_MemoryReader::GetTag_Double // ================================ bool TIFF_MemoryReader::GetTag_Double ( XMP_Uns8 ifd, XMP_Uns16 id, double* data ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( (thisTag->type != kTIFF_DoubleType) || (thisTag->bytes != 8) ) return false; if ( data != 0 ) { double* dataPtr = (double*) this->GetDataPtr ( thisTag ); *data = this->GetDouble ( dataPtr ); } return true; } // TIFF_MemoryReader::GetTag_Double // ================================================================================================= // TIFF_MemoryReader::GetTag_ASCII // =============================== bool TIFF_MemoryReader::GetTag_ASCII ( XMP_Uns8 ifd, XMP_Uns16 id, XMP_StringPtr* dataPtr, XMP_StringLen* dataLen ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( thisTag->type != kTIFF_ASCIIType ) return false; if ( dataPtr != 0 ) { *dataPtr = (XMP_StringPtr) this->GetDataPtr ( thisTag ); } if ( dataLen != 0 ) *dataLen = thisTag->bytes; return true; } // TIFF_MemoryReader::GetTag_ASCII // ================================================================================================= // TIFF_MemoryReader::GetTag_EncodedString // ======================================= bool TIFF_MemoryReader::GetTag_EncodedString ( XMP_Uns8 ifd, XMP_Uns16 id, std::string* utf8Str ) const { const TweakedIFDEntry* thisTag = this->FindTagInIFD ( ifd, id ); if ( thisTag == 0 ) return false; if ( thisTag->type != kTIFF_UndefinedType ) return false; if ( utf8Str == 0 ) return true; // Return true if the converted string is not wanted. bool ok = this->DecodeString ( this->GetDataPtr ( thisTag ), thisTag->bytes, utf8Str ); return ok; } // TIFF_MemoryReader::GetTag_EncodedString // ================================================================================================= // TIFF_MemoryReader::ParseMemoryStream // ==================================== // *** Need to tell TIFF/Exif from TIFF/EP, DNG files are the latter. void TIFF_MemoryReader::ParseMemoryStream ( const void* data, XMP_Uns32 length, bool copyData /* = true */ ) { // Get rid of any current TIFF. if ( this->ownedStream ) free ( this->tiffStream ); this->ownedStream = false; this->tiffStream = 0; this->tiffLength = 0; for ( size_t i = 0; i < kTIFF_KnownIFDCount; ++i ) { this->containedIFDs[i].count = 0; this->containedIFDs[i].entries = 0; } if ( length == 0 ) return; // Allocate space for the full in-memory stream and copy it. if ( ! copyData ) { XMP_Assert ( ! this->ownedStream ); this->tiffStream = (XMP_Uns8*) data; } else { if ( length > 100*1024*1024 ) XMP_Throw ( "Outrageous length for memory-based TIFF", kXMPErr_BadTIFF ); this->tiffStream = (XMP_Uns8*) malloc(length); if ( this->tiffStream == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); memcpy ( this->tiffStream, data, length ); // AUDIT: Safe, malloc'ed length bytes above. this->ownedStream = true; } this->tiffLength = length; // Find and process the primary, Exif, GPS, and Interoperability IFDs. XMP_Uns32 primaryIFDOffset = this->CheckTIFFHeader ( this->tiffStream, length ); XMP_Uns32 tnailIFDOffset = 0; if ( primaryIFDOffset != 0 ) tnailIFDOffset = this->ProcessOneIFD ( primaryIFDOffset, kTIFF_PrimaryIFD ); // ! Need the thumbnail IFD for checking full Exif APP1 in some JPEG files! if ( tnailIFDOffset != 0 ) (void) this->ProcessOneIFD ( tnailIFDOffset, kTIFF_TNailIFD ); const TweakedIFDEntry* exifIFDTag = this->FindTagInIFD ( kTIFF_PrimaryIFD, kTIFF_ExifIFDPointer ); if ( (exifIFDTag != 0) && (exifIFDTag->type == kTIFF_LongType) && (exifIFDTag->bytes == 4) ) { XMP_Uns32 exifOffset = this->GetUns32 ( &exifIFDTag->dataOrPos ); (void) this->ProcessOneIFD ( exifOffset, kTIFF_ExifIFD ); } const TweakedIFDEntry* gpsIFDTag = this->FindTagInIFD ( kTIFF_PrimaryIFD, kTIFF_GPSInfoIFDPointer ); if ( (gpsIFDTag != 0) && (gpsIFDTag->type == kTIFF_LongType) && (gpsIFDTag->bytes == 4) ) { XMP_Uns32 gpsOffset = this->GetUns32 ( &gpsIFDTag->dataOrPos ); (void) this->ProcessOneIFD ( gpsOffset, kTIFF_GPSInfoIFD ); } const TweakedIFDEntry* interopIFDTag = this->FindTagInIFD ( kTIFF_ExifIFD, kTIFF_InteroperabilityIFDPointer ); if ( (interopIFDTag != 0) && (interopIFDTag->type == kTIFF_LongType) && (interopIFDTag->bytes == 4) ) { XMP_Uns32 interopOffset = this->GetUns32 ( &interopIFDTag->dataOrPos ); (void) this->ProcessOneIFD ( interopOffset, kTIFF_InteropIFD ); } } // TIFF_MemoryReader::ParseMemoryStream // ================================================================================================= // TIFF_MemoryReader::ProcessOneIFD // ================================ XMP_Uns32 TIFF_MemoryReader::ProcessOneIFD ( XMP_Uns32 ifdOffset, XMP_Uns8 ifd ) { TweakedIFDInfo& ifdInfo = this->containedIFDs[ifd]; if ( (ifdOffset < 8) || (ifdOffset > (this->tiffLength - kEmptyIFDLength)) ) { XMP_Throw ( "Bad IFD offset", kXMPErr_BadTIFF ); } XMP_Uns8* ifdPtr = this->tiffStream + ifdOffset; XMP_Uns16 ifdCount = this->GetUns16 ( ifdPtr ); TweakedIFDEntry* ifdEntries = (TweakedIFDEntry*)(ifdPtr+2); if ( ifdCount >= 0x8000 ) XMP_Throw ( "Outrageous IFD count", kXMPErr_BadTIFF ); if ( (ifdOffset + 2 + ifdCount*12 + 4) > this->tiffLength ) XMP_Throw ( "Out of bounds IFD", kXMPErr_BadTIFF ); ifdInfo.count = ifdCount; ifdInfo.entries = ifdEntries; XMP_Int32 prevTag = -1; // ! The GPS IFD has a tag 0, so we need a signed initial value. bool needsSorting = false; for ( size_t i = 0; i < ifdCount; ++i ) { TweakedIFDEntry* thisEntry = &ifdEntries[i]; // Tweak the IFD entry to be more useful. if ( ! this->nativeEndian ) { Flip2 ( &thisEntry->id ); Flip2 ( &thisEntry->type ); Flip4 ( &thisEntry->bytes ); } if ( thisEntry->id <= prevTag ) needsSorting = true; prevTag = thisEntry->id; if ( (thisEntry->type < kTIFF_ByteType) || (thisEntry->type > kTIFF_LastType) ) continue; // Bad type, skip this tag. thisEntry->bytes *= (XMP_Uns32)kTIFF_TypeSizes[thisEntry->type]; if ( thisEntry->bytes > this->tiffLength ) XMP_Throw ( "Bad TIFF data size", kXMPErr_BadTIFF ); if ( thisEntry->bytes > 4 ) { if ( ! this->nativeEndian ) Flip4 ( &thisEntry->dataOrPos ); } } ifdPtr += (2 + ifdCount*12); XMP_Uns32 nextIFDOffset = this->GetUns32 ( ifdPtr ); if ( needsSorting ) SortIFD ( &ifdInfo ); // ! Don't perturb the ifdCount used to find the next IFD offset. return nextIFDOffset; } // TIFF_MemoryReader::ProcessOneIFD // ================================================================================================= exempi-2.2.1/source/XMPFiles/FormatSupport/PNG_Support.cpp0000664000175000017500000001746312150230672020377 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "PNG_Support.hpp" #include typedef std::basic_string filebuffer; namespace CRC { /* Table of CRCs of all 8-bit messages. */ static unsigned long crc_table[256]; /* Flag: has the table been computed? Initially false. */ static int crc_table_computed = 0; /* Make the table for a fast CRC. */ static void make_crc_table(void) { unsigned long c; int n, k; for (n = 0; n < 256; n++) { c = (unsigned long) n; for (k = 0; k < 8; k++) { if (c & 1) { c = 0xedb88320L ^ (c >> 1); } else { c = c >> 1; } } crc_table[n] = c; } crc_table_computed = 1; } /* Update a running CRC with the bytes buf[0..len-1]--the CRC should be initialized to all 1's, and the transmitted value is the 1's complement of the final running CRC (see the crc() routine below). */ static unsigned long update_crc(unsigned long crc, unsigned char *buf, int len) { unsigned long c = crc; int n; if (!crc_table_computed) { make_crc_table(); } for (n = 0; n < len; n++) { c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); } return c; } /* Return the CRC of the bytes buf[0..len-1]. */ static unsigned long crc(unsigned char *buf, int len) { return update_crc(0xffffffffL, buf, len) ^ 0xffffffffL; } } // namespace CRC namespace PNG_Support { enum chunkType { // Critical chunks - (shall appear in this order, except PLTE is optional) IHDR = 'IHDR', PLTE = 'PLTE', IDAT = 'IDAT', IEND = 'IEND', // Ancillary chunks - (need not appear in this order) cHRM = 'cHRM', gAMA = 'gAMA', iCCP = 'iCCP', sBIT = 'sBIT', sRGB = 'sRGB', bKGD = 'bKGD', hIST = 'hIST', tRNS = 'tRNS', pHYs = 'pHYs', sPLT = 'sPLT', tIME = 'tIME', iTXt = 'iTXt', tEXt = 'tEXt', zTXt = 'zTXt' }; // ============================================================================================= long OpenPNG ( LFA_FileRef fileRef, ChunkState & inOutChunkState ) { XMP_Uns64 pos = 0; long name; XMP_Uns32 len; pos = LFA_Seek ( fileRef, 8, SEEK_SET ); if (pos != 8) return 0; // read first and following chunks while ( ReadChunk ( fileRef, inOutChunkState, &name, &len, pos) ) {} return (long)inOutChunkState.chunks.size(); } // ============================================================================================= bool ReadChunk ( LFA_FileRef fileRef, ChunkState & inOutChunkState, long * chunkType, XMP_Uns32 * chunkLength, XMP_Uns64 & inOutPosition ) { try { XMP_Uns64 startPosition = inOutPosition; long bytesRead; char buffer[4]; bytesRead = LFA_Read ( fileRef, buffer, 4 ); if ( bytesRead != 4 ) return false; inOutPosition += 4; *chunkLength = GetUns32BE(buffer); bytesRead = LFA_Read ( fileRef, buffer, 4 ); if ( bytesRead != 4 ) return false; inOutPosition += 4; *chunkType = GetUns32BE(buffer); inOutPosition += *chunkLength; bytesRead = LFA_Read ( fileRef, buffer, 4 ); if ( bytesRead != 4 ) return false; inOutPosition += 4; long crc = GetUns32BE(buffer); ChunkData newChunk; newChunk.pos = startPosition; newChunk.len = *chunkLength; newChunk.type = *chunkType; // check for XMP in iTXt-chunk if (newChunk.type == iTXt) { CheckiTXtChunkHeader(fileRef, inOutChunkState, newChunk); } inOutChunkState.chunks.push_back ( newChunk ); LFA_Seek ( fileRef, inOutPosition, SEEK_SET ); } catch ( ... ) { return false; } return true; } // ============================================================================================= bool WriteXMPChunk ( LFA_FileRef fileRef, XMP_Uns32 len, const char* inBuffer ) { bool ret = false; unsigned long datalen = (4 + ITXT_HEADER_LEN + len); unsigned char* buffer = new unsigned char[datalen]; try { size_t pos = 0; memcpy(&buffer[pos], ITXT_CHUNK_TYPE, 4); pos += 4; memcpy(&buffer[pos], ITXT_HEADER_DATA, ITXT_HEADER_LEN); pos += ITXT_HEADER_LEN; memcpy(&buffer[pos], inBuffer, len); unsigned long crc_value = MakeUns32BE( CalculateCRC( buffer, datalen )); datalen -= 4; unsigned long len_value = MakeUns32BE( datalen ); datalen += 4; LFA_Write(fileRef, &len_value, 4); LFA_Write(fileRef, buffer, datalen); LFA_Write(fileRef, &crc_value, 4); ret = true; } catch ( ... ) {} delete [] buffer; return ret; } // ============================================================================================= bool CopyChunk ( LFA_FileRef sourceRef, LFA_FileRef destRef, ChunkData& chunk ) { try { LFA_Seek (sourceRef, chunk.pos, SEEK_SET ); LFA_Copy (sourceRef, destRef, (chunk.len + 12)); } catch ( ... ) { return false; } return true; } // ============================================================================================= unsigned long UpdateChunkCRC( LFA_FileRef fileRef, ChunkData& inOutChunkData ) { unsigned long ret = 0; unsigned long datalen = (inOutChunkData.len + 4); unsigned char* buffer = new unsigned char[datalen]; try { LFA_Seek(fileRef, (inOutChunkData.pos + 4), SEEK_SET); size_t pos = 0; long bytesRead = LFA_Read ( fileRef, &buffer[pos], (inOutChunkData.len + 4) ); unsigned long crc = CalculateCRC( buffer, (inOutChunkData.len + 4) ); unsigned long crc_value = MakeUns32BE( crc ); LFA_Seek(fileRef, (inOutChunkData.pos + 4 + 4 + inOutChunkData.len), SEEK_SET); LFA_Write(fileRef, &crc_value, 4); ret = crc; } catch ( ... ) {} delete [] buffer; return ret; } // ============================================================================================= bool CheckIHDRChunkHeader ( ChunkData& inOutChunkData ) { return (inOutChunkData.type == IHDR); } // ============================================================================================= unsigned long CheckiTXtChunkHeader ( LFA_FileRef fileRef, ChunkState& inOutChunkState, ChunkData& inOutChunkData ) { try { LFA_Seek(fileRef, (inOutChunkData.pos + 8), SEEK_SET); char buffer[ITXT_HEADER_LEN]; long bytesRead = LFA_Read ( fileRef, buffer, ITXT_HEADER_LEN ); if (bytesRead == ITXT_HEADER_LEN) { if (memcmp(buffer, ITXT_HEADER_DATA, ITXT_HEADER_LEN) == 0) { // return length of XMP if (inOutChunkData.len > ITXT_HEADER_LEN) { inOutChunkState.xmpPos = inOutChunkData.pos + 8 + ITXT_HEADER_LEN; inOutChunkState.xmpLen = inOutChunkData.len - ITXT_HEADER_LEN; inOutChunkState.xmpChunk = inOutChunkData; inOutChunkData.xmp = true; return inOutChunkState.xmpLen; } } } } catch ( ... ) {} return 0; } bool ReadBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns32 len, char * outBuffer ) { try { if ( (fileRef == 0) || (outBuffer == 0) ) return false; LFA_Seek (fileRef, pos, SEEK_SET ); long bytesRead = LFA_Read ( fileRef, outBuffer, len ); if ( XMP_Uns32(bytesRead) != len ) return false; return true; } catch ( ... ) {} return false; } bool WriteBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns32 len, const char * inBuffer ) { try { if ( (fileRef == 0) || (inBuffer == 0) ) return false; LFA_Seek (fileRef, pos, SEEK_SET ); LFA_Write( fileRef, inBuffer, len ); return true; } catch ( ... ) {} return false; } unsigned long CalculateCRC( unsigned char* inBuffer, XMP_Uns32 len ) { return CRC::update_crc(0xffffffffL, inBuffer, len) ^ 0xffffffffL; } } // namespace PNG_Support exempi-2.2.1/source/XMPFiles/FormatSupport/RIFF_Support.cpp0000664000175000017500000010450512150230673020474 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #define MIN(a, b) ((a) < (b) ? (a) : (b)) // must have access to handler class fields... #include "RIFF.hpp" #include "RIFF_Handler.hpp" #include "RIFF_Support.hpp" #include "Reconcile_Impl.hpp" using namespace RIFF; namespace RIFF { // The minimum BEXT chunk size should be 610 (incl. 8 byte header/size field) XMP_Int32 MIN_BEXT_SIZE = 610; // = > 8 + ( 256+32+32+10+8+4+4+2+64+190+0 ) // An assumed secure max value of 100 MB. XMP_Int32 MAX_BEXT_SIZE = 100 * 1024 * 1024; // CR8R, PrmL have fixed sizes XMP_Int32 CR8R_SIZE = 0x5C; XMP_Int32 PRML_SIZE = 0x122; static const char* sHexChars = "0123456789ABCDEF"; // Encode a string of raw data bytes into a HexString (w/o spaces, i.e. "DEADBEEF"). // No insertation/acceptance of whitespace/linefeeds. No output/tolerance of lowercase. // returns true, if *all* characters returned are zero (or if 0 bytes are returned). static bool EncodeToHexString ( XMP_StringPtr rawStr, XMP_StringLen rawLen, std::string* encodedStr ) { bool allZero = true; // assume for now if ( (rawStr == 0) && (rawLen != 0) ) XMP_Throw ( "EncodeToHexString: null rawStr", kXMPErr_BadParam ); if ( encodedStr == 0 ) XMP_Throw ( "EncodeToHexString: null encodedStr", kXMPErr_BadParam ); encodedStr->erase(); if ( rawLen == 0 ) return allZero; encodedStr->reserve ( rawLen * 2 ); for( XMP_Uns32 i = 0; i < rawLen; i++ ) { // first, second nibble XMP_Uns8 first = rawStr[i] >> 4; XMP_Uns8 second = rawStr[i] & 0xF; if ( allZero && (( first != 0 ) || (second != 0))) allZero = false; encodedStr->append( 1, sHexChars[first] ); encodedStr->append( 1, sHexChars[second] ); } return allZero; } // EncodeToHexString // ------------------------------------------------------------------------------------------------- // DecodeFromHexString // ---------------- // // Decode a hex string to raw data bytes. // * Input must be all uppercase and w/o any whitespace, strictly (0-9A-Z)* (i.e. "DEADBEEF0099AABC") // * No insertation/acceptance of whitespace/linefeeds. // * bNo use/tolerance of lowercase. // * Number of bytes in the encoded String must be even. // * returns true if everything went well, false if illegal (non 0-9A-F) character encountered static bool DecodeFromHexString ( XMP_StringPtr encodedStr, XMP_StringLen encodedLen, std::string* rawStr ) { if ( (encodedLen % 2) != 0 ) return false; rawStr->erase(); if ( encodedLen == 0 ) return true; rawStr->reserve ( encodedLen / 2 ); for( XMP_Uns32 i = 0; i < encodedLen; ) { XMP_Uns8 upperNibble = encodedStr[i]; if ( (upperNibble < 48) || ( (upperNibble > 57 ) && ( upperNibble < 65 ) ) || (upperNibble > 70) ) return false; if ( upperNibble >= 65 ) upperNibble -= 7; // shift A-F area adjacent to 0-9 upperNibble -= 48; // 'shift' to a value [0..15] upperNibble = ( upperNibble << 4 ); i++; XMP_Uns8 lowerNibble = encodedStr[i]; if ( (lowerNibble < 48) || ( (lowerNibble > 57 ) && ( lowerNibble < 65 ) ) || (lowerNibble > 70) ) return false; if ( lowerNibble >= 65 ) lowerNibble -= 7; // shift A-F area adjacent to 0-9 lowerNibble -= 48; // 'shift' to a value [0..15] i++; rawStr->append ( 1, (upperNibble + lowerNibble) ); } return true; } // DecodeFromHexString // Converts input string to an ascii output string // - terminates at first 0 // - replaces all non ascii with 0x3F ('?') // - produces up to maxOut characters (note that several UTF-8 character bytes can 'melt' to one byte '?' in ascii.) static XMP_StringLen convertToASCII( XMP_StringPtr input, XMP_StringLen inputLen, std::string* output, XMP_StringLen maxOutputLen ) { if ( (input == 0) && (inputLen != 0) ) XMP_Throw ( "convertToASCII: null input string", kXMPErr_BadParam ); if ( output == 0) XMP_Throw ( "convertToASCII: null output string", kXMPErr_BadParam ); if ( maxOutputLen == 0) XMP_Throw ( "convertToASCII: zero maxOutputLen chars", kXMPErr_BadParam ); output->reserve(inputLen); output->erase(); bool isUTF8 = ReconcileUtils::IsUTF8( input, inputLen ); XMP_StringLen outputLen = 0; for ( XMP_Uns32 i=0; i < inputLen; i++ ) { XMP_Uns8 c = (XMP_Uns8) input[i]; if ( c == 0 ) // early 0 termination, leave. break; if ( c > 127 ) // uft-8 multi-byte sequence. { if ( isUTF8 ) // skip all high bytes { // how many bytes in this ? if ( c >= 0xC2 && c <= 0xDF ) i+=1; // 2-byte sequence else if ( c >= 0xE0 && c <= 0xEF ) i+=2; // 3-byte sequence else if ( c >= 0xF0 && c <= 0xF4 ) i+=3; // 4-byte sequence else continue; //invalid sequence, look for next 'low' byte .. } // thereafter and 'else': just append a question mark: output->append( 1, '?' ); } else // regular valid ascii. 1 byte. { output->append( 1, input[i] ); } outputLen++; if ( outputLen >= maxOutputLen ) break; // (may be even or even greater due to UFT-8 multi-byte jumps) } return outputLen; } /** * ensures that native property gets returned as UTF-8 (may or mayn not already be UTF-8) * - also takes care of "moot padding" (pre-mature zero termination) * - propertyExists: it is important to know if there as an existing, non zero property * even (in the event of serverMode) it is not actually returned, but an empty string instead. */ static std::string nativePropertyToUTF8 ( XMP_StringPtr cstring, XMP_StringLen maxSize, bool* propertyExists ) { // the value might be properly 0-terminated, prematurely or not // at all, hence scan through to find actual size XMP_StringLen size = 0; for ( size = 0; size < maxSize; size++ ) { if ( cstring[size] == 0 ) break; } (*propertyExists) = ( size > 0 ); std::string utf8(""); if ( ReconcileUtils::IsUTF8( cstring, size ) ) utf8 = std::string( cstring, size ); //use utf8 directly else { if ( ! ignoreLocalText ) { #if ! UNIX_ENV // n/a anyway, since always ignoreLocalText on Unix ReconcileUtils::LocalToUTF8( cstring, size, &utf8 ); #endif } } return utf8; } // reads maxSize bytes from file (not "up to", exactly fullSize) // puts it into a string, sets respective tree property static std::string getBextField ( const char* data, XMP_Uns32 offset, XMP_Uns32 maxSize ) { if (data == 0) XMP_Throw ( "getBextField: null data pointer", kXMPErr_BadParam ); if ( maxSize == 0) XMP_Throw ( "getBextField: maxSize must be greater than 0", kXMPErr_BadParam ); std::string r; convertToASCII( data+offset, maxSize, &r, maxSize ); return r; } static void importBextChunkToXMP( RIFF_MetaHandler* handler, ValueChunk* bextChunk ) { // if there's a bext chunk, there is data... handler->containsXMP = true; // very important for treatment on caller level XMP_Enforce( bextChunk->oldSize >= MIN_BEXT_SIZE ); XMP_Enforce( bextChunk->oldSize < MAX_BEXT_SIZE ); const char* data = bextChunk->oldValue.data(); std::string value; // register bext namespace: SXMPMeta::RegisterNamespace( kXMP_NS_BWF, "bext:", 0 ); // bextDescription ------------------------------------------------ value = getBextField( data, 0, 256 ); if ( value.size() > 0 ) handler->xmpObj.SetProperty( bextDescription.ns, bextDescription.prop, value.c_str() ); // bextOriginator ------------------------------------------------- value = getBextField( data, 256, 32 ); if ( value.size() > 0 ) handler->xmpObj.SetProperty( bextOriginator.ns , bextOriginator.prop, value.c_str() ); // bextOriginatorRef ---------------------------------------------- value = getBextField( data, 256+32, 32 ); if ( value.size() > 0 ) handler->xmpObj.SetProperty( bextOriginatorRef.ns , bextOriginatorRef.prop, value.c_str() ); // bextOriginationDate -------------------------------------------- value = getBextField( data, 256+32+32, 10 ); if ( value.size() > 0 ) handler->xmpObj.SetProperty( bextOriginationDate.ns , bextOriginationDate.prop, value.c_str() ); // bextOriginationTime -------------------------------------------- value = getBextField( data, 256+32+32+10, 8 ); if ( value.size() > 0 ) handler->xmpObj.SetProperty( bextOriginationTime.ns , bextOriginationTime.prop, value.c_str() ); // bextTimeReference ---------------------------------------------- // thanx to nice byte order, all 8 bytes can be read as one: XMP_Uns64 timeReferenceFull = GetUns64LE( &(data[256+32+32+10+8 ] ) ); value.erase(); SXMPUtils::ConvertFromInt64( timeReferenceFull, "%llu", &value ); handler->xmpObj.SetProperty( bextTimeReference.ns, bextTimeReference.prop, value ); // bextVersion ---------------------------------------------------- XMP_Uns16 bwfVersion = GetUns16LE( &(data[256+32+32+10+8+8] ) ); value.erase(); SXMPUtils::ConvertFromInt( bwfVersion, "", &value ); handler->xmpObj.SetProperty( bextVersion.ns, bextVersion.prop, value ); // bextUMID ------------------------------------------------------- // binary string is already in memory, must convert to hex string std::string umidString; bool allZero = EncodeToHexString( &(data[256+32+32+10+8+8+2]), 64, &umidString ); if (! allZero ) handler->xmpObj.SetProperty( bextUMID.ns, bextUMID.prop, umidString ); // bextCodingHistory ---------------------------------------------- bool hasCodingHistory = bextChunk->oldSize > MIN_BEXT_SIZE; if ( hasCodingHistory ) { XMP_StringLen codingHistorySize = (XMP_StringLen) (bextChunk->oldSize - MIN_BEXT_SIZE); std::string codingHistory; convertToASCII( &data[MIN_BEXT_SIZE-8], codingHistorySize, &codingHistory, codingHistorySize ); if (! codingHistory.empty() ) handler->xmpObj.SetProperty( bextCodingHistory.ns, bextCodingHistory.prop, codingHistory ); } } // importBextChunkToXMP static void importPrmLToXMP( RIFF_MetaHandler* handler, ValueChunk* prmlChunk ) { bool haveXMP = false; XMP_Enforce( prmlChunk->oldSize == PRML_SIZE ); PrmLBoxContent rawPrmL; XMP_Assert ( sizeof ( rawPrmL ) == PRML_SIZE - 8 ); // double check tight packing. XMP_Assert ( sizeof ( rawPrmL.filePath ) == 260 ); memcpy ( &rawPrmL, prmlChunk->oldValue.data(), sizeof (rawPrmL) ); if ( rawPrmL.magic != 0xBEEFCAFE ) { Flip4 ( &rawPrmL.exportType ); // The only numeric field that we care about. } rawPrmL.filePath[259] = 0; // Ensure a terminating nul. if ( rawPrmL.filePath[0] != 0 ) { if ( rawPrmL.filePath[0] == '/' ) { haveXMP = true; handler->xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "posixProjectPath", rawPrmL.filePath ); } else if ( XMP_LitNMatch ( rawPrmL.filePath, "\\\\?\\", 4 ) ) { haveXMP = true; handler->xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "uncProjectPath", rawPrmL.filePath ); } } const char * exportStr = 0; switch ( rawPrmL.exportType ) { case kExportTypeMovie : exportStr = "movie"; break; case kExportTypeStill : exportStr = "still"; break; case kExportTypeAudio : exportStr = "audio"; break; case kExportTypeCustom : exportStr = "custom"; break; } if ( exportStr != 0 ) { haveXMP = true; handler->xmpObj.SetStructField ( kXMP_NS_DM, "projectRef", kXMP_NS_DM, "type", exportStr ); } handler->containsXMP |= haveXMP; // mind the '|=' } // importCr8rToXMP static void importCr8rToXMP( RIFF_MetaHandler* handler, ValueChunk* cr8rChunk ) { bool haveXMP = false; XMP_Enforce( cr8rChunk->oldSize == CR8R_SIZE ); Cr8rBoxContent rawCr8r; XMP_Assert ( sizeof ( rawCr8r ) == CR8R_SIZE - 8 ); // double check tight packing. memcpy ( &rawCr8r, cr8rChunk->oldValue.data(), sizeof (rawCr8r) ); if ( rawCr8r.magic != 0xBEEFCAFE ) { Flip4 ( &rawCr8r.creatorCode ); // The only numeric fields that we care about. Flip4 ( &rawCr8r.appleEvent ); } std::string fieldPath; SXMPUtils::ComposeStructFieldPath ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "applicationCode", &fieldPath ); if ( rawCr8r.creatorCode != 0 ) { haveXMP = true; handler->xmpObj.SetProperty_Int64 ( kXMP_NS_CreatorAtom, fieldPath.c_str(), (XMP_Int64)rawCr8r.creatorCode ); // ! Unsigned trickery. } SXMPUtils::ComposeStructFieldPath ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "invocationAppleEvent", &fieldPath ); if ( rawCr8r.appleEvent != 0 ) { haveXMP = true; handler->xmpObj.SetProperty_Int64 ( kXMP_NS_CreatorAtom, fieldPath.c_str(), (XMP_Int64)rawCr8r.appleEvent ); // ! Unsigned trickery. } rawCr8r.fileExt[15] = 0; // Ensure a terminating nul. if ( rawCr8r.fileExt[0] != 0 ) { haveXMP = true; handler->xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "extension", rawCr8r.fileExt ); } rawCr8r.appOptions[15] = 0; // Ensure a terminating nul. if ( rawCr8r.appOptions[0] != 0 ) { haveXMP = true; handler->xmpObj.SetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "invocationFlags", rawCr8r.appOptions ); } rawCr8r.appName[31] = 0; // Ensure a terminating nul. if ( rawCr8r.appName[0] != 0 ) { haveXMP = true; handler->xmpObj.SetProperty ( kXMP_NS_XMP, "CreatorTool", rawCr8r.appName ); } handler->containsXMP |= haveXMP; // mind the '|=' } // importCr8rToXMP static void importListChunkToXMP( RIFF_MetaHandler* handler, ContainerChunk* listChunk, Mapping mapping[], bool xmpHasPriority ) { valueMap* cm = &listChunk->childmap; for (int p=0; mapping[p].chunkID != 0; p++) // go through legacy chunks { valueMapIter result = cm->find(mapping[p].chunkID); if( result != cm->end() ) // if value found { ValueChunk* propChunk = result->second; bool propertyExists = false; std::string utf8 = nativePropertyToUTF8( propChunk->oldValue.c_str(), (XMP_StringLen)propChunk->oldValue.size(), &propertyExists ); if ( utf8.size() > 0 ) // if property is not-empty, set Property { switch ( mapping[p].propType ) { case prop_TIMEVALUE: if ( xmpHasPriority && handler->xmpObj.DoesStructFieldExist( mapping[p].ns, mapping[p].prop, kXMP_NS_DM, "timeValue" )) break; // skip if XMP has precedence and exists handler->xmpObj.SetStructField( mapping[p].ns, mapping[p].prop, kXMP_NS_DM, "timeValue", utf8.c_str() ); break; case prop_LOCALIZED_TEXT: if ( xmpHasPriority && handler->xmpObj.GetLocalizedText( mapping[p].ns , mapping[p].prop, "" , "x-default", 0, 0, 0 )) break; // skip if XMP has precedence and exists handler->xmpObj.SetLocalizedText( mapping[p].ns , mapping[p].prop, "" , "x-default" , utf8.c_str() ); if ( mapping[p].chunkID == kPropChunkINAM ) handler->hasListInfoINAM = true; // needs to be known for special 3-way merge around dc:title break; case prop_ARRAYITEM: if ( xmpHasPriority && handler->xmpObj.DoesArrayItemExist( mapping[p].ns, mapping[p].prop, 1 )) break; // skip if XMP has precedence and exists handler->xmpObj.DeleteProperty( mapping[p].ns, mapping[p].prop ); handler->xmpObj.AppendArrayItem( mapping[p].ns, mapping[p].prop, kXMP_PropValueIsArray, utf8.c_str(), kXMP_NoOptions ); break; case prop_SIMPLE: if ( xmpHasPriority && handler->xmpObj.DoesPropertyExist( mapping[p].ns, mapping[p].prop )) break; // skip if XMP has precedence and exists handler->xmpObj.SetProperty( mapping[p].ns, mapping[p].prop, utf8.c_str() ); break; default: XMP_Throw( "internal error" , kXMPErr_InternalFailure ); } handler->containsXMP = true; // very important for treatment on caller level } else if ( ! propertyExists) // otherwise remove it. { // [2389942] don't, if legacy value is existing but non-retrievable (due to server mode) switch ( mapping[p].propType ) { case prop_TIMEVALUE: if ( (!xmpHasPriority) && // forward deletion only if XMP has no priority handler->xmpObj.DoesPropertyExist( mapping[p].ns, mapping[p].prop )) handler->xmpObj.DeleteProperty( mapping[p].ns, mapping[p].prop ); break; case prop_LOCALIZED_TEXT: if ( (!xmpHasPriority) && // forward deletion only if XMP has no priority handler->xmpObj.DoesPropertyExist( mapping[p].ns, mapping[p].prop )) handler->xmpObj.DeleteLocalizedText( mapping[p].ns, mapping[p].prop, "", "x-default" ); break; case prop_ARRAYITEM: case prop_SIMPLE: if ( (!xmpHasPriority) && // forward deletion only if XMP has no priority handler->xmpObj.DoesPropertyExist( mapping[p].ns, mapping[p].prop )) handler->xmpObj.DeleteProperty( mapping[p].ns, mapping[p].prop ); break; default: XMP_Throw( "internal error" , kXMPErr_InternalFailure ); } } } } // for } void importProperties( RIFF_MetaHandler* handler ) { bool hasDigest = handler->xmpObj.GetProperty( kXMP_NS_WAV, "NativeDigest", NULL , NULL ); if ( hasDigest ) { // remove! since it now becomse a 'new' handler file handler->xmpObj.DeleteProperty( kXMP_NS_WAV, "NativeDigest" ); } // BWF Bext extension chunk ----------------------------------------------- if ( handler->parent->format == kXMP_WAVFile && // applies only to WAV handler->bextChunk != 0 ) //skip if no BEXT chunk found. { importBextChunkToXMP( handler, handler->bextChunk ); } // PrmL chunk -------------------------------------------------------------- if ( handler->prmlChunk != 0 && handler->prmlChunk->oldSize == PRML_SIZE ) { importPrmLToXMP( handler, handler->prmlChunk ); } // Cr8r chunk -------------------------------------------------------------- if ( handler->cr8rChunk != 0 && handler->cr8rChunk->oldSize == CR8R_SIZE ) { importCr8rToXMP( handler, handler->cr8rChunk ); } // LIST:INFO -------------------------------------------------------------- if ( handler->listInfoChunk != 0) //skip if no LIST:INFO chunk found. importListChunkToXMP( handler, handler->listInfoChunk, listInfoProps, hasDigest ); // LIST:Tdat -------------------------------------------------------------- if ( handler->listTdatChunk != 0) importListChunkToXMP( handler, handler->listTdatChunk, listTdatProps, hasDigest ); // DISP (do last, higher priority than INAM ) ----------------------------- bool takeXMP = false; // assume for now if ( hasDigest ) { std::string actualLang, value; bool r = handler->xmpObj.GetLocalizedText( kXMP_NS_DC, "title", "" , "x-default" , &actualLang, &value, NULL ); if ( r && (actualLang == "x-default") ) takeXMP = true; } if ( (!takeXMP) && handler->dispChunk != 0) //skip if no LIST:INFO chunk found. { std::string* value = &handler->dispChunk->oldValue; if ( value->size() >= 4 ) // ignore contents if file too small { XMP_StringPtr cstring = value->c_str(); XMP_StringLen size = (XMP_StringLen) value->size(); size -= 4; // skip first four bytes known to contain constant cstring += 4; bool propertyExists = false; std::string utf8 = nativePropertyToUTF8( cstring, size, &propertyExists ); if ( utf8.size() > 0 ) { handler->xmpObj.SetLocalizedText( kXMP_NS_DC, "title", "" , "x-default" , utf8.c_str() ); handler->containsXMP = true; // very important for treatment on caller level } else { // found as part of [2389942] // forward deletion may only happen if no LIST:INFO/INAM is present: if ( ! handler->hasListInfoINAM && ! propertyExists ) // ..[2389942]part2: and if truly no legacy property { // (not just an unreadable one due to ServerMode). handler->xmpObj.DeleteProperty( kXMP_NS_DC, "title" ); } } } // if size sufficient } // handler->dispChunk } // importProperties //////////////////////////////////////////////////////////////////////////////// // EXPORT //////////////////////////////////////////////////////////////////////////////// void relocateWronglyPlacedXMPChunk( RIFF_MetaHandler* handler ) { LFA_FileRef file = handler->parent->fileRef; RIFF::containerVect *rc = &handler->riffChunks; RIFF::ContainerChunk* lastChunk = rc->at( rc->size()-1 ); // 1) XMPPacket // needChunk exists but is not in lastChunk ? if ( handler->xmpChunk != 0 && // XMP Chunk existing? (XMP_Uns32)rc->size() > 1 && // more than 1 top-level chunk (otherwise pointless) lastChunk->getChild( handler->xmpChunk ) == lastChunk->children.end() // not already in last chunk? ) { RIFF::ContainerChunk* cur; chunkVectIter child; XMP_Int32 chunkNo; // find and relocate to last chunk: for ( chunkNo = (XMP_Int32)rc->size()-2 ; chunkNo >= 0; chunkNo-- ) // ==> start with second-last chunk { cur = rc->at(chunkNo); child = cur->getChild( handler->xmpChunk ); if ( child != cur->children.end() ) // found? break; } // for if ( chunkNo < 0 ) // already in place? nothing left to do. return; lastChunk->children.push_back( *child ); // nb: order matters! cur->replaceChildWithJunk( *child, false ); cur->hasChange = true; // [2414649] initialize early-on i.e: here } // if } // relocateWronglyPlacedXMPChunk // writes to buffer up to max size, // 0 termination only if shorter than maxSize // converts down to ascii static void setBextField ( std::string* value, XMP_Uns8* data, XMP_Uns32 offset, XMP_Uns32 maxSize ) { XMP_Validate( value != 0, "setBextField: null value string pointer", kXMPErr_BadParam ); XMP_Validate( data != 0, "setBextField: null data value", kXMPErr_BadParam ); XMP_Validate( maxSize > 0, "setBextField: maxSize must be greater than 0", kXMPErr_BadParam ); std::string ascii; XMP_StringLen actualSize = convertToASCII( value->data(), (XMP_StringLen) value->size() , &ascii , maxSize ); strncpy( (char*)(data + offset), ascii.data(), actualSize ); } // add bwf-bext related data to bext chunk, create if not existing yet. // * in fact, since bext is fully fixed and known, there can be no unknown subchunks worth keeping: // * prepare bext chunk in buffer // * value changed/created if needed only, otherways remove chunk // * remove bext-mapped properties from xmp (non-redundant storage) // note: ValueChunk**: adress of pointer to allow changing the pointer itself (i.e. chunk creation) static void exportXMPtoBextChunk( RIFF_MetaHandler* handler, ValueChunk** bextChunk ) { // register bext namespace ( if there was no import, this is news, otherwise harmless moot) SXMPMeta::RegisterNamespace( kXMP_NS_BWF, "bext:", 0 ); bool chunkUsed = false; // assume for now SXMPMeta* xmp = &handler->xmpObj; // prepare buffer, need to know CodingHistory size as the only variable XMP_Int32 bextBufferSize = MIN_BEXT_SIZE - 8; // -8 because of header std::string value; if ( xmp->GetProperty( bextCodingHistory.ns, bextCodingHistory.prop, &value, kXMP_NoOptions )) { bextBufferSize += ((XMP_StringLen)value.size()) + 1 ; // add to size (and a trailing zero) } // create and clear buffer XMP_Uns8* buffer = new XMP_Uns8[bextBufferSize]; for (XMP_Int32 i = 0; i < bextBufferSize; i++ ) buffer[i] = 0; // grab props, write into buffer, remove from XMP /////////////////////////// // bextDescription ------------------------------------------------ if ( xmp->GetProperty( bextDescription.ns, bextDescription.prop, &value, kXMP_NoOptions ) ) { setBextField( &value, (XMP_Uns8*) buffer, 0, 256 ); xmp->DeleteProperty( bextDescription.ns, bextDescription.prop) ; chunkUsed = true; } // bextOriginator ------------------------------------------------- if ( xmp->GetProperty( bextOriginator.ns , bextOriginator.prop, &value, kXMP_NoOptions ) ) { setBextField( &value, (XMP_Uns8*) buffer, 256, 32 ); xmp->DeleteProperty( bextOriginator.ns , bextOriginator.prop ); chunkUsed = true; } // bextOriginatorRef ---------------------------------------------- if ( xmp->GetProperty( bextOriginatorRef.ns , bextOriginatorRef.prop, &value, kXMP_NoOptions ) ) { setBextField( &value, (XMP_Uns8*) buffer, 256+32, 32 ); xmp->DeleteProperty( bextOriginatorRef.ns , bextOriginatorRef.prop ); chunkUsed = true; } // bextOriginationDate -------------------------------------------- if ( xmp->GetProperty( bextOriginationDate.ns , bextOriginationDate.prop, &value, kXMP_NoOptions ) ) { setBextField( &value, (XMP_Uns8*) buffer, 256+32+32, 10 ); xmp->DeleteProperty( bextOriginationDate.ns , bextOriginationDate.prop ); chunkUsed = true; } // bextOriginationTime -------------------------------------------- if ( xmp->GetProperty( bextOriginationTime.ns , bextOriginationTime.prop, &value, kXMP_NoOptions ) ) { setBextField( &value, (XMP_Uns8*) buffer, 256+32+32+10, 8 ); xmp->DeleteProperty( bextOriginationTime.ns , bextOriginationTime.prop ); chunkUsed = true; } // bextTimeReference ---------------------------------------------- // thanx to friendly byte order, all 8 bytes can be written in one go: if ( xmp->GetProperty( bextTimeReference.ns, bextTimeReference.prop, &value, kXMP_NoOptions ) ) { try { XMP_Int64 v = SXMPUtils::ConvertToInt64( value.c_str() ); PutUns64LE( v, &(buffer[256+32+32+10+8] )); chunkUsed = true; } catch (XMP_Error& e) { if ( e.GetID() != kXMPErr_BadParam ) throw e; // re-throw on any other error } // 'else' tolerate ( time reference remains 0x00000000 ) // valid or not, do not store redundantly: xmp->DeleteProperty( bextTimeReference.ns, bextTimeReference.prop ); } // bextVersion ---------------------------------------------------- // set version=1, no matter what. PutUns16LE( 1, &(buffer[256+32+32+10+8+8]) ); xmp->DeleteProperty( bextVersion.ns, bextVersion.prop ); // bextUMID ------------------------------------------------------- if ( xmp->GetProperty( bextUMID.ns, bextUMID.prop, &value, kXMP_NoOptions ) ) { std::string rawStr; if ( !DecodeFromHexString( value.data(), (XMP_StringLen) value.size(), &rawStr ) ) { delete [] buffer; // important. XMP_Throw ( "EncodeFromHexString: illegal umid string. Must contain an even number of 0-9 and uppercase A-F chars.", kXMPErr_BadParam ); } // if UMID is smaller/longer than 64 byte for any reason, // truncate/do a partial write (just like for any other bext property) memcpy( (char*) &(buffer[256+32+32+10+8+8+2]), rawStr.data(), MIN( 64, rawStr.size() ) ); xmp->DeleteProperty( bextUMID.ns, bextUMID.prop ); chunkUsed = true; } // bextCodingHistory ---------------------------------------------- if ( xmp->GetProperty( bextCodingHistory.ns, bextCodingHistory.prop, &value, kXMP_NoOptions ) ) { std::string ascii; convertToASCII( value.data(), (XMP_StringLen) value.size() , &ascii, (XMP_StringLen) value.size() ); strncpy( (char*) &(buffer[MIN_BEXT_SIZE-8]), ascii.data(), ascii.size() ); xmp->DeleteProperty( bextCodingHistory.ns, bextCodingHistory.prop ); chunkUsed = true; } // always delete old, recreate if needed if ( *bextChunk != 0 ) { (*bextChunk)->parent->replaceChildWithJunk( *bextChunk ); (*bextChunk) = 0; // clear direct Chunk pointer } if ( chunkUsed) *bextChunk = new ValueChunk( handler->riffChunks.at(0), std::string( (char*)buffer, bextBufferSize ), kChunk_bext ); delete [] buffer; // important. } static inline void SetBufferedString ( char * dest, const std::string source, size_t limit ) { memset ( dest, 0, limit ); size_t count = source.size(); if ( count >= limit ) count = limit - 1; // Ensure a terminating nul. memcpy ( dest, source.c_str(), count ); } static void exportXMPtoCr8rChunk ( RIFF_MetaHandler* handler, ValueChunk** cr8rChunk ) { const SXMPMeta & xmp = handler->xmpObj; // Make sure an existing Cr8r chunk has the proper fixed length. bool haveOldCr8r = (*cr8rChunk != 0); if ( haveOldCr8r && ((*cr8rChunk)->oldSize != sizeof(Cr8rBoxContent)+8) ) { (*cr8rChunk)->parent->replaceChildWithJunk ( *cr8rChunk ); // Wrong length, the existing chunk must be bad. (*cr8rChunk) = 0; haveOldCr8r = false; } bool haveNewCr8r = false; std::string creatorCode, appleEvent, fileExt, appOptions, appName; haveNewCr8r |= xmp.GetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "applicationCode", &creatorCode, 0 ); haveNewCr8r |= xmp.GetStructField ( kXMP_NS_CreatorAtom, "macAtom", kXMP_NS_CreatorAtom, "invocationAppleEvent", &appleEvent, 0 ); haveNewCr8r |= xmp.GetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "extension", &fileExt, 0 ); haveNewCr8r |= xmp.GetStructField ( kXMP_NS_CreatorAtom, "windowsAtom", kXMP_NS_CreatorAtom, "invocationFlags", &appOptions, 0 ); haveNewCr8r |= xmp.GetProperty ( kXMP_NS_XMP, "CreatorTool", &appName, 0 ); if ( ! haveNewCr8r ) { // Get rid of an existing Cr8r chunk if there is no new XMP. if ( haveOldCr8r ) { (*cr8rChunk)->parent->replaceChildWithJunk ( *cr8rChunk ); *cr8rChunk = 0; } return; } if ( ! haveOldCr8r ) { *cr8rChunk = new ValueChunk ( handler->lastChunk, std::string(), kChunk_Cr8r ); } std::string strValue; strValue.assign ( (sizeof(Cr8rBoxContent) - 1), '\0' ); // ! Use size-1 because SetValue appends a trailing 0 byte. (*cr8rChunk)->SetValue ( strValue ); // ! Just get the space available. XMP_Assert ( (*cr8rChunk)->newValue.size() == sizeof(Cr8rBoxContent) ); (*cr8rChunk)->hasChange = true; Cr8rBoxContent * newCr8r = (Cr8rBoxContent*) (*cr8rChunk)->newValue.data(); if ( ! haveOldCr8r ) { newCr8r->magic = MakeUns32LE ( 0xBEEFCAFE ); newCr8r->size = MakeUns32LE ( sizeof(Cr8rBoxContent) ); newCr8r->majorVer = MakeUns16LE ( 1 ); } else { const Cr8rBoxContent * oldCr8r = (Cr8rBoxContent*) (*cr8rChunk)->oldValue.data(); memcpy ( newCr8r, oldCr8r, sizeof(Cr8rBoxContent) ); if ( GetUns32LE ( &newCr8r->magic ) != 0xBEEFCAFE ) { // Make sure we write LE numbers. Flip4 ( &newCr8r->magic ); Flip4 ( &newCr8r->size ); Flip2 ( &newCr8r->majorVer ); Flip2 ( &newCr8r->minorVer ); Flip4 ( &newCr8r->creatorCode ); Flip4 ( &newCr8r->appleEvent ); } } if ( ! creatorCode.empty() ) { newCr8r->creatorCode = MakeUns32LE ( (XMP_Uns32) strtoul ( creatorCode.c_str(), 0, 0 ) ); } if ( ! appleEvent.empty() ) { newCr8r->appleEvent = MakeUns32LE ( (XMP_Uns32) strtoul ( appleEvent.c_str(), 0, 0 ) ); } if ( ! fileExt.empty() ) SetBufferedString ( newCr8r->fileExt, fileExt, sizeof ( newCr8r->fileExt ) ); if ( ! appOptions.empty() ) SetBufferedString ( newCr8r->appOptions, appOptions, sizeof ( newCr8r->appOptions ) ); if ( ! appName.empty() ) SetBufferedString ( newCr8r->appName, appName, sizeof ( newCr8r->appName ) ); } static void exportXMPtoListChunk( XMP_Uns32 id, XMP_Uns32 containerType, RIFF_MetaHandler* handler, ContainerChunk** listChunk, Mapping mapping[]) { // note: ContainerChunk**: adress of pointer to allow changing the pointer itself (i.e. chunk creation) SXMPMeta* xmp = &handler->xmpObj; bool listChunkIsNeeded = false; // assume for now // ! The NUL is optional in WAV to avoid a parsing bug in Audition 3 - can't handle implicit pad byte. bool optionalNUL = (handler->parent->format == kXMP_WAVFile); for ( int p=0; mapping[p].chunkID != 0; ++p ) { // go through all potential property mappings bool propExists = false; std::string value, actualLang; switch ( mapping[p].propType ) { // get property. if existing, remove from XMP (to avoid redundant storage) case prop_TIMEVALUE: propExists = xmp->GetStructField ( mapping[p].ns, mapping[p].prop, kXMP_NS_DM, "timeValue", &value, 0 ); break; case prop_LOCALIZED_TEXT: propExists = xmp->GetLocalizedText ( mapping[p].ns, mapping[p].prop, "", "x-default", &actualLang, &value, 0); if ( actualLang != "x-default" ) propExists = false; // no "x-default" => nothing to reconcile ! break; case prop_ARRAYITEM: propExists = xmp->GetArrayItem ( mapping[p].ns, mapping[p].prop, 1, &value, 0 ); break; case prop_SIMPLE: propExists = xmp->GetProperty ( mapping[p].ns, mapping[p].prop, &value, 0 ); break; default: XMP_Throw ( "internal error", kXMPErr_InternalFailure ); } if ( ! propExists ) { if ( *listChunk != 0 ) (*listChunk)->removeValue ( mapping[p].chunkID ); } else { listChunkIsNeeded = true; if ( *listChunk == 0 ) *listChunk = new ContainerChunk ( handler->riffChunks[0], id, containerType ); valueMap* cm = &(*listChunk)->childmap; valueMapIter result = cm->find( mapping[p].chunkID ); ValueChunk* propChunk = 0; if ( result != cm->end() ) { propChunk = result->second; } else { propChunk = new ValueChunk ( *listChunk, std::string(), mapping[p].chunkID ); } propChunk->SetValue ( value.c_str(), optionalNUL ); } } // for each property if ( (! listChunkIsNeeded) && (*listChunk != 0) && ((*listChunk)->children.size() == 0) ) { (*listChunk)->parent->replaceChildWithJunk ( *listChunk ); (*listChunk) = 0; // reset direct Chunk pointer } } void exportAndRemoveProperties ( RIFF_MetaHandler* handler ) { SXMPMeta xmpObj = handler->xmpObj; exportXMPtoCr8rChunk ( handler, &handler->cr8rChunk ); // 1/4 BWF Bext extension chunk ----------------------------------------------- if ( handler->parent->format == kXMP_WAVFile ) { // applies only to WAV exportXMPtoBextChunk ( handler, &handler->bextChunk ); } // 2/4 DISP chunk if ( handler->parent->format == kXMP_WAVFile ) { // create for WAVE only std::string actualLang, xmpValue; bool r = xmpObj.GetLocalizedText ( kXMP_NS_DC, "title", "" , "x-default" , &actualLang, &xmpValue, 0 ); if ( r && ( actualLang == "x-default" ) ) { // prop exists? // the 'right' DISP is lead by a 32 bit low endian 0x0001 std::string dispValue = std::string( "\x1\0\0\0", 4 ); dispValue.append ( xmpValue ); if ( handler->dispChunk == 0 ) { handler->dispChunk = new RIFF::ValueChunk ( handler->riffChunks.at(0), std::string(), kChunk_DISP ); } // ! The NUL is optional in WAV to avoid a parsing bug in Audition 3 - can't handle implicit pad byte. handler->dispChunk->SetValue ( dispValue, ValueChunk::kNULisOptional ); } else { // remove Disp Chunk.. if ( handler->dispChunk != 0 ) { // ..if existing ContainerChunk* mainChunk = handler->riffChunks.at(0); Chunk* needle = handler->dispChunk; chunkVectIter iter = mainChunk->getChild ( needle ); if ( iter != mainChunk->children.end() ) { mainChunk->replaceChildWithJunk ( *iter ); handler->dispChunk = 0; mainChunk->hasChange = true; } } } } // 3/4 LIST:INFO exportXMPtoListChunk ( kChunk_LIST, kType_INFO, handler, &handler->listInfoChunk, listInfoProps ); // 4/4 LIST:Tdat exportXMPtoListChunk ( kChunk_LIST, kType_Tdat, handler, &handler->listTdatChunk, listTdatProps ); } } // namespace RIFF exempi-2.2.1/source/XMPFiles/FormatSupport/PSIR_Support.hpp0000664000175000017500000003127612150230672020533 00000000000000#ifndef __PSIR_Support_hpp__ #define __PSIR_Support_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include #include #include "XMP_Const.h" #include "XMPFiles_Impl.hpp" #include "EndianUtils.hpp" // ================================================================================================= /// \file PSIR_Support.hpp /// \brief XMPFiles support for Photoshop image resources. /// /// This header provides Photoshop image resource (PSIR) support specific to the needs of XMPFiles. /// This is not intended for general purpose PSIR processing. PSIR_Manager is an abstract base /// class with 2 concrete derived classes, PSIR_MemoryReader and PSIR_FileWriter. /// /// PSIR_MemoryReader provides read-only support for PSIR streams that are small enough to be kept /// entirely in memory. This allows optimizations to reduce heap usage and processing code. It is /// sufficient for browsing access to the image resources (mainly the IPTC) in JPEG files. Think of /// PSIR_MemoryReader as "memory-based AND read-only". /// /// PSIR_FileWriter is for cases where updates are needed or the PSIR stream is too large to be kept /// entirely in memory. Think of PSIR_FileWriter as "file-based OR read-write". /// /// The needs of XMPFiles are well defined metadata access. Only a few image resources are handled. /// This is the case for all of the derived classes, even though the memory based ones happen to /// have all of the image resources in memory. Being "handled" means being in the image resource /// map used by GetImgRsrc. The handled image resources are: /// \li 1028 - IPTC /// \li 1034 - Copyrighted flag /// \li 1035 - Copyright information URL /// \li 1058 - Exif metadata /// \li 1060 - XMP /// \li 1061 - IPTC digest /// /// \note These classes are for use only when directly compiled and linked. They should not be /// packaged in a DLL by themselves. They do not provide any form of C++ ABI protection. // ================================================================================================= // These aren't inside PSIR_Manager because the static array can't be initialized there. enum { k8BIM = 0x3842494DUL, // The 4 ASCII characters '8BIM'. kMinImgRsrcSize = 4+2+2+4 // The minimum size for an image resource. }; enum { kPSIR_IPTC = 1028, kPSIR_CopyrightFlag = 1034, kPSIR_CopyrightURL = 1035, kPSIR_Exif = 1058, kPSIR_XMP = 1060, kPSIR_IPTCDigest = 1061 }; enum { kPSIR_MetadataCount = 6 }; static const XMP_Uns16 kPSIR_MetadataIDs[] = // ! Must be in descending order with 0 sentinel. { kPSIR_IPTCDigest, kPSIR_XMP, kPSIR_Exif, kPSIR_CopyrightURL, kPSIR_CopyrightFlag, kPSIR_IPTC, 0 }; // ================================================================================================= // ================================================================================================= // NOTE: Although Photoshop image resources have a type and ID, for metadatya we only care about // those of type "8BIM". Resources of other types are preserved in files, but can't be individually // accessed through the PSIR_Manager API. // ================================================================================================= // PSIR_Manager // ============ class PSIR_Manager { // The abstract base class. public: // --------------------------------------------------------------------------------------------- // Types and constants struct ImgRsrcInfo { XMP_Uns16 id; XMP_Uns32 dataLen; const void* dataPtr; // ! The data is read-only! XMP_Uns32 origOffset; // The offset (at parse time) of the resource data. ImgRsrcInfo() : id(0), dataLen(0), dataPtr(0), origOffset(0) {}; ImgRsrcInfo ( XMP_Uns16 _id, XMP_Uns32 _dataLen, void* _dataPtr, XMP_Uns32 _origOffset ) : id(_id), dataLen(_dataLen), dataPtr(_dataPtr), origOffset(_origOffset) {}; }; // The origOffset is the absolute file offset for file parses, the memory block offset for // memory parses. It is the offset of the resource data portion, not the overall resource. // --------------------------------------------------------------------------------------------- // Get the information about a "handled" image resource. Returns false if the image resource is // not handled, even if it was present in the parsed input. virtual bool GetImgRsrc ( XMP_Uns16 id, ImgRsrcInfo* info ) const = 0; // --------------------------------------------------------------------------------------------- // Set the value for an image resource. It can be any resource, even one not originally handled. virtual void SetImgRsrc ( XMP_Uns16 id, const void* dataPtr, XMP_Uns32 length ) = 0; // --------------------------------------------------------------------------------------------- // Delete an image resource. Does nothing if the image resource does not exist. virtual void DeleteImgRsrc ( XMP_Uns16 id ) = 0; // --------------------------------------------------------------------------------------------- // Determine if the image resources are changed. virtual bool IsChanged() = 0; virtual bool IsLegacyChanged() = 0; // --------------------------------------------------------------------------------------------- virtual void ParseMemoryResources ( const void* data, XMP_Uns32 length, bool copyData = true ) = 0; virtual void ParseFileResources ( LFA_FileRef fileRef, XMP_Uns32 length ) = 0; // --------------------------------------------------------------------------------------------- // Update the image resources to reflect the changed values. Both \c UpdateMemoryResources and // \c UpdateFileResources return the new size of the image resource block. The dataPtr returned // by \c UpdateMemoryResources must be treated as read only. It exists until the PSIR_Manager // destructor is called. UpdateMemoryResources can be used on a read-only instance to get the // raw data block info. virtual XMP_Uns32 UpdateMemoryResources ( void** dataPtr ) = 0; virtual XMP_Uns32 UpdateFileResources ( LFA_FileRef sourceRef, LFA_FileRef destRef, IOBuffer * ioBuf, XMP_AbortProc abortProc, void * abortArg ) = 0; // --------------------------------------------------------------------------------------------- virtual ~PSIR_Manager() {}; protected: PSIR_Manager() {}; }; // PSIR_Manager // ================================================================================================= // ================================================================================================= // ================================================================================================= // PSIR_MemoryReader // ================= class PSIR_MemoryReader : public PSIR_Manager { // The leaf class for memory-based read-only access. public: bool GetImgRsrc ( XMP_Uns16 id, ImgRsrcInfo* info ) const; void SetImgRsrc ( XMP_Uns16 id, const void* dataPtr, XMP_Uns32 length ) { NotAppropriate(); }; void DeleteImgRsrc ( XMP_Uns16 id ) { NotAppropriate(); }; bool IsChanged() { return false; }; bool IsLegacyChanged() { return false; }; void ParseMemoryResources ( const void* data, XMP_Uns32 length, bool copyData = true ); void ParseFileResources ( LFA_FileRef file, XMP_Uns32 length ) { NotAppropriate(); }; XMP_Uns32 UpdateMemoryResources ( void** dataPtr ) { if ( dataPtr != 0 ) *dataPtr = psirContent; return psirLength; }; XMP_Uns32 UpdateFileResources ( LFA_FileRef sourceRef, LFA_FileRef destRef, IOBuffer * ioBuf, XMP_AbortProc abortProc, void * abortArg ) { NotAppropriate(); return 0; }; PSIR_MemoryReader() : ownedContent(false), psirLength(0), psirContent(0) {}; virtual ~PSIR_MemoryReader() { if ( this->ownedContent ) free ( this->psirContent ); }; private: // Memory usage notes: PSIR_MemoryReader is for memory-based read-only usage (both apply). There // is no need to ever allocate separate blocks of memory, everything is used directly from the // PSIR stream. bool ownedContent; XMP_Uns32 psirLength; XMP_Uns8* psirContent; typedef std::map ImgRsrcMap; ImgRsrcMap imgRsrcs; static inline void NotAppropriate() { XMP_Throw ( "Not appropriate for PSIR_Reader", kXMPErr_InternalFailure ); }; }; // PSIR_MemoryReader // ================================================================================================= // ================================================================================================= // ================================================================================================= // PSIR_FileWriter // =============== class PSIR_FileWriter : public PSIR_Manager { // The leaf class for file-based read-write access. public: bool GetImgRsrc ( XMP_Uns16 id, ImgRsrcInfo* info ) const; void SetImgRsrc ( XMP_Uns16 id, const void* dataPtr, XMP_Uns32 length ); void DeleteImgRsrc ( XMP_Uns16 id ); bool IsChanged() { return this->changed; }; bool IsLegacyChanged(); void ParseMemoryResources ( const void* data, XMP_Uns32 length, bool copyData = true ); void ParseFileResources ( LFA_FileRef file, XMP_Uns32 length ); XMP_Uns32 UpdateMemoryResources ( void** dataPtr ); XMP_Uns32 UpdateFileResources ( LFA_FileRef sourceRef, LFA_FileRef destRef, IOBuffer * ioBuf, XMP_AbortProc abortProc, void * abortArg ); PSIR_FileWriter() : changed(false), legacyDeleted(false), memParsed(false), fileParsed(false), ownedContent(false), memLength(0), memContent(0) {}; virtual ~PSIR_FileWriter(); // Memory usage notes: PSIR_FileWriter is for file-based OR read/write usage. For memory-based // streams the dataPtr and rsrcName are initially into the stream, they become a separate // allocation if changed. For file-based streams they are always a separate allocation. // ! The working data values are always big endian, no matter where stored. It is the client's // ! responsibility to flip them as necessary. static const bool kIsFileBased = true; // For use in the InternalRsrcInfo constructor. static const bool kIsMemoryBased = false; struct InternalRsrcInfo { public: bool changed; bool fileBased; XMP_Uns16 id; XMP_Uns32 dataLen; void* dataPtr; // ! Null if the value is not captured! XMP_Uns32 origOffset; // The offset (at parse time) of the resource data. XMP_Uns8* rsrcName; // ! A Pascal string, leading length byte, no nul terminator! inline void FreeData() { if ( this->fileBased || this->changed ) { if ( this->dataPtr != 0 ) { free ( this->dataPtr ); this->dataPtr = 0; } } } inline void FreeName() { if ( this->fileBased || this->changed ) { if ( this->rsrcName != 0 ) { free ( this->rsrcName ); this->rsrcName = 0; } } } InternalRsrcInfo ( XMP_Uns16 _id, XMP_Uns32 _dataLen, bool _fileBased ) : changed(false), fileBased(_fileBased), id(_id), dataLen(_dataLen), dataPtr(0), origOffset(0), rsrcName(0) {}; ~InternalRsrcInfo() { this->FreeData(); this->FreeName(); }; void operator= ( const InternalRsrcInfo & in ) { // ! Gag! Transfer ownership of the dataPtr and rsrcName! this->FreeData(); memcpy ( this, &in, sizeof(*this) ); // AUDIT: Use of sizeof(InternalRsrcInfo) is safe. *((void**)&in.dataPtr) = 0; // The pointer is now owned by "this". *((void**)&in.rsrcName) = 0; // The pointer is now owned by "this". }; private: InternalRsrcInfo() // Hidden on purpose, fileBased must be properly set. : changed(false), fileBased(false), id(0), dataLen(0), dataPtr(0), origOffset(0), rsrcName(0) {}; }; // The origOffset is the absolute file offset for file parses, the memory block offset for // memory parses. It is the offset of the resource data portion, not the overall resource. private: bool changed, legacyDeleted; bool memParsed, fileParsed; bool ownedContent; XMP_Uns32 memLength; XMP_Uns8* memContent; typedef std::map InternalRsrcMap; InternalRsrcMap imgRsrcs; struct OtherRsrcInfo { // For the resources of types other than "8BIM". XMP_Uns32 rsrcOffset; // The offset of the resource origin, the type field. XMP_Uns32 rsrcLength; // The full length of the resource, offset to the next resource. OtherRsrcInfo() : rsrcOffset(0), rsrcLength(0) {}; OtherRsrcInfo ( XMP_Uns32 _rsrcOffset, XMP_Uns32 _rsrcLength ) : rsrcOffset(_rsrcOffset), rsrcLength(_rsrcLength) {}; }; std::vector otherRsrcs; void DeleteExistingInfo(); }; // PSIR_FileWriter #endif // __PSIR_Support_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/ReconcileIPTC.cpp0000664000175000017500000007550112150230673020600 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "Reconcile_Impl.hpp" #include #if XMP_WinBuild #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning) #pragma warning ( disable : 4996 ) // '...' was declared deprecated #endif // ================================================================================================= /// \file ReconcileIPTC.cpp /// \brief Utilities to reconcile between XMP and legacy IPTC and PSIR metadata. /// // ================================================================================================= // ================================================================================================= // NormalizeToCR // ============= static inline void NormalizeToCR ( std::string * value ) { char * strPtr = (char*) value->data(); char * strEnd = strPtr + value->size(); for ( ; strPtr < strEnd; ++strPtr ) { if ( *strPtr == kLF ) *strPtr = kCR; } } // NormalizeToCR // ================================================================================================= // NormalizeToLF // ============= static inline void NormalizeToLF ( std::string * value ) { char * strPtr = (char*) value->data(); char * strEnd = strPtr + value->size(); for ( ; strPtr < strEnd; ++strPtr ) { if ( *strPtr == kCR ) *strPtr = kLF; } } // NormalizeToLF // ================================================================================================= // ComputeIPTCDigest // ================= // // Compute a 128 bit (16 byte) MD5 digest of the full IPTC block. static inline void ComputeIPTCDigest ( const void * iptcPtr, const XMP_Uns32 iptcLen, MD5_Digest * digest ) { MD5_CTX context; MD5Init ( &context ); MD5Update ( &context, (XMP_Uns8*)iptcPtr, iptcLen ); MD5Final ( *digest, &context ); } // ComputeIPTCDigest; // ================================================================================================= // PhotoDataUtils::CheckIPTCDigest // =============================== int PhotoDataUtils::CheckIPTCDigest ( const void * newPtr, const XMP_Uns32 newLen, const void * oldDigest ) { MD5_Digest newDigest; ComputeIPTCDigest ( newPtr, newLen, &newDigest ); if ( memcmp ( &newDigest, oldDigest, 16 ) == 0 ) return kDigestMatches; return kDigestDiffers; } // PhotoDataUtils::CheckIPTCDigest // ================================================================================================= // PhotoDataUtils::SetIPTCDigest // ============================= void PhotoDataUtils::SetIPTCDigest ( void * iptcPtr, XMP_Uns32 iptcLen, PSIR_Manager * psir ) { MD5_Digest newDigest; ComputeIPTCDigest ( iptcPtr, iptcLen, &newDigest ); psir->SetImgRsrc ( kPSIR_IPTCDigest, &newDigest, sizeof(newDigest) ); } // PhotoDataUtils::SetIPTCDigest // ================================================================================================= // ================================================================================================= // ================================================================================================= // PhotoDataUtils::ImportIPTC_Simple // ================================= void PhotoDataUtils::ImportIPTC_Simple ( const IPTC_Manager & iptc, SXMPMeta * xmp, XMP_Uns8 id, const char * xmpNS, const char * xmpProp ) { std::string utf8Str; size_t count = iptc.GetDataSet_UTF8 ( id, &utf8Str ); if ( count != 0 ) { NormalizeToLF ( &utf8Str ); xmp->SetProperty ( xmpNS, xmpProp, utf8Str.c_str() ); } } // PhotoDataUtils::ImportIPTC_Simple // ================================================================================================= // PhotoDataUtils::ImportIPTC_LangAlt // ================================== void PhotoDataUtils::ImportIPTC_LangAlt ( const IPTC_Manager & iptc, SXMPMeta * xmp, XMP_Uns8 id, const char * xmpNS, const char * xmpProp ) { std::string utf8Str; size_t count = iptc.GetDataSet_UTF8 ( id, &utf8Str ); if ( count != 0 ) { NormalizeToLF ( &utf8Str ); xmp->SetLocalizedText ( xmpNS, xmpProp, "", "x-default", utf8Str.c_str() ); } } // PhotoDataUtils::ImportIPTC_LangAlt // ================================================================================================= // PhotoDataUtils::ImportIPTC_Array // ================================ void PhotoDataUtils::ImportIPTC_Array ( const IPTC_Manager & iptc, SXMPMeta * xmp, XMP_Uns8 id, const char * xmpNS, const char * xmpProp ) { std::string utf8Str; size_t count = iptc.GetDataSet ( id, 0 ); xmp->DeleteProperty ( xmpNS, xmpProp ); XMP_OptionBits arrayForm = kXMP_PropArrayIsUnordered; if ( XMP_LitMatch ( xmpNS, kXMP_NS_DC ) && XMP_LitMatch ( xmpProp, "creator" ) ) arrayForm = kXMP_PropArrayIsOrdered; for ( size_t ds = 0; ds < count; ++ds ) { (void) iptc.GetDataSet_UTF8 ( id, &utf8Str, ds ); NormalizeToLF ( &utf8Str ); xmp->AppendArrayItem ( xmpNS, xmpProp, arrayForm, utf8Str.c_str() ); } } // PhotoDataUtils::ImportIPTC_Array // ================================================================================================= // PhotoDataUtils::ImportIPTC_Date // =============================== // // An IPTC (IIM) date is 8 characters, YYYYMMDD. Include the time portion if it is present. The IPTC // time is HHMMSSxHHMM, where 'x' is '+' or '-'. Be tolerant of some ill-formed dates and times. // Apparently some non-Adobe apps put strings like "YYYY-MM-DD" or "HH:MM:SSxHH:MM" in the IPTC. // Allow a missing time zone portion. // *** The date/time handling differs from the MWG 1.0.1 policy, following a proposed tweak to MWG: // *** Exif DateTimeOriginal <-> XMP exif:DateTimeOriginal // *** IPTC DateCreated <-> XMP photoshop:DateCreated // *** Exif DateTimeDigitized <-> IPTC DigitalCreateDate <-> XMP xmp:CreateDate void PhotoDataUtils::ImportIPTC_Date ( XMP_Uns8 dateID, const IPTC_Manager & iptc, SXMPMeta * xmp ) { XMP_Uns8 timeID; XMP_StringPtr xmpNS, xmpProp; if ( dateID == kIPTC_DateCreated ) { timeID = kIPTC_TimeCreated; xmpNS = kXMP_NS_Photoshop; xmpProp = "DateCreated"; } else if ( dateID == kIPTC_DigitalCreateDate ) { timeID = kIPTC_DigitalCreateTime; xmpNS = kXMP_NS_XMP; xmpProp = "CreateDate"; } else { XMP_Throw ( "Unrecognized dateID", kXMPErr_BadParam ); } // First gather the date portion. IPTC_Manager::DataSetInfo dsInfo; size_t count = iptc.GetDataSet ( dateID, &dsInfo ); if ( count == 0 ) return; size_t chPos, digits; XMP_DateTime xmpDate; memset ( &xmpDate, 0, sizeof(xmpDate) ); chPos = 0; for ( digits = 0; digits < 4; ++digits, ++chPos ) { if ( (chPos >= dsInfo.dataLen) || (dsInfo.dataPtr[chPos] < '0') || (dsInfo.dataPtr[chPos] > '9') ) break; xmpDate.year = (xmpDate.year * 10) + (dsInfo.dataPtr[chPos] - '0'); } if ( dsInfo.dataPtr[chPos] == '-' ) ++chPos; for ( digits = 0; digits < 2; ++digits, ++chPos ) { if ( (chPos >= dsInfo.dataLen) || (dsInfo.dataPtr[chPos] < '0') || (dsInfo.dataPtr[chPos] > '9') ) break; xmpDate.month = (xmpDate.month * 10) + (dsInfo.dataPtr[chPos] - '0'); } if ( xmpDate.month < 1 ) xmpDate.month = 1; if ( xmpDate.month > 12 ) xmpDate.month = 12; if ( dsInfo.dataPtr[chPos] == '-' ) ++chPos; for ( digits = 0; digits < 2; ++digits, ++chPos ) { if ( (chPos >= dsInfo.dataLen) || (dsInfo.dataPtr[chPos] < '0') || (dsInfo.dataPtr[chPos] > '9') ) break; xmpDate.day = (xmpDate.day * 10) + (dsInfo.dataPtr[chPos] - '0'); } if ( xmpDate.day < 1 ) xmpDate.day = 1; if ( xmpDate.day > 31 ) xmpDate.day = 28; // Close enough. if ( chPos != dsInfo.dataLen ) return; // The DataSet is ill-formed. xmpDate.hasDate = true; // Now add the time portion if present. count = iptc.GetDataSet ( timeID, &dsInfo ); if ( count != 0 ) { chPos = 0; for ( digits = 0; digits < 2; ++digits, ++chPos ) { if ( (chPos >= dsInfo.dataLen) || (dsInfo.dataPtr[chPos] < '0') || (dsInfo.dataPtr[chPos] > '9') ) break; xmpDate.hour = (xmpDate.hour * 10) + (dsInfo.dataPtr[chPos] - '0'); } if ( xmpDate.hour < 0 ) xmpDate.hour = 0; if ( xmpDate.hour > 23 ) xmpDate.hour = 23; if ( dsInfo.dataPtr[chPos] == ':' ) ++chPos; for ( digits = 0; digits < 2; ++digits, ++chPos ) { if ( (chPos >= dsInfo.dataLen) || (dsInfo.dataPtr[chPos] < '0') || (dsInfo.dataPtr[chPos] > '9') ) break; xmpDate.minute = (xmpDate.minute * 10) + (dsInfo.dataPtr[chPos] - '0'); } if ( xmpDate.minute < 0 ) xmpDate.minute = 0; if ( xmpDate.minute > 59 ) xmpDate.minute = 59; if ( dsInfo.dataPtr[chPos] == ':' ) ++chPos; for ( digits = 0; digits < 2; ++digits, ++chPos ) { if ( (chPos >= dsInfo.dataLen) || (dsInfo.dataPtr[chPos] < '0') || (dsInfo.dataPtr[chPos] > '9') ) break; xmpDate.second = (xmpDate.second * 10) + (dsInfo.dataPtr[chPos] - '0'); } if ( xmpDate.second < 0 ) xmpDate.second = 0; if ( xmpDate.second > 59 ) xmpDate.second = 59; xmpDate.hasTime = true; if ( (dsInfo.dataPtr[chPos] != ' ') && (dsInfo.dataPtr[chPos] != 0) ) { // Tolerate a missing TZ. if ( dsInfo.dataPtr[chPos] == '+' ) { xmpDate.tzSign = kXMP_TimeEastOfUTC; } else if ( dsInfo.dataPtr[chPos] == '-' ) { xmpDate.tzSign = kXMP_TimeWestOfUTC; } else if ( chPos != dsInfo.dataLen ) { return; // The DataSet is ill-formed. } ++chPos; // Move past the time zone sign. for ( digits = 0; digits < 2; ++digits, ++chPos ) { if ( (chPos >= dsInfo.dataLen) || (dsInfo.dataPtr[chPos] < '0') || (dsInfo.dataPtr[chPos] > '9') ) break; xmpDate.tzHour = (xmpDate.tzHour * 10) + (dsInfo.dataPtr[chPos] - '0'); } if ( xmpDate.tzHour < 0 ) xmpDate.tzHour = 0; if ( xmpDate.tzHour > 23 ) xmpDate.tzHour = 23; if ( dsInfo.dataPtr[chPos] == ':' ) ++chPos; for ( digits = 0; digits < 2; ++digits, ++chPos ) { if ( (chPos >= dsInfo.dataLen) || (dsInfo.dataPtr[chPos] < '0') || (dsInfo.dataPtr[chPos] > '9') ) break; xmpDate.tzMinute = (xmpDate.tzMinute * 10) + (dsInfo.dataPtr[chPos] - '0'); } if ( xmpDate.tzMinute < 0 ) xmpDate.tzMinute = 0; if ( xmpDate.tzMinute > 59 ) xmpDate.tzMinute = 59; if ( chPos != dsInfo.dataLen ) return; // The DataSet is ill-formed. xmpDate.hasTimeZone = true; } } // Finally, set the XMP property. xmp->SetProperty_Date ( xmpNS, xmpProp, xmpDate ); } // PhotoDataUtils::ImportIPTC_Date // ================================================================================================= // ImportIPTC_IntellectualGenre // ============================ // // Import DataSet 2:04. In the IIM this is a 3 digit number, a colon, and an optional text name. // Even though the number is the more formal part, the IPTC4XMP rule is that the name is imported to // XMP and the number is dropped. Also, even though IIMv4.1 says that 2:04 is repeatable, the XMP // property to which it is mapped is simple. static void ImportIPTC_IntellectualGenre ( const IPTC_Manager & iptc, SXMPMeta * xmp ) { std::string utf8Str; size_t count = iptc.GetDataSet_UTF8 ( kIPTC_IntellectualGenre, &utf8Str ); if ( count == 0 ) return; NormalizeToLF ( &utf8Str ); XMP_StringPtr namePtr = utf8Str.c_str() + 4; if ( utf8Str.size() <= 4 ) { // No name in the IIM. Look up the number in our list of known genres. int i; XMP_StringPtr numPtr = utf8Str.c_str(); for ( i = 0; kIntellectualGenreMappings[i].refNum != 0; ++i ) { if ( strncmp ( numPtr, kIntellectualGenreMappings[i].refNum, 3 ) == 0 ) break; } if ( kIntellectualGenreMappings[i].refNum == 0 ) return; namePtr = kIntellectualGenreMappings[i].name; } xmp->SetProperty ( kXMP_NS_IPTCCore, "IntellectualGenre", namePtr ); } // ImportIPTC_IntellectualGenre // ================================================================================================= // ImportIPTC_SubjectCode // ====================== // // Import all 2:12 DataSets into an unordered array. In the IIM each DataSet is composed of 5 colon // separated sections: a provider name, an 8 digit reference number, and 3 optional names for the // levels of the reference number hierarchy. The IPTC4XMP mapping rule is that only the reference // number is imported to XMP. static void ImportIPTC_SubjectCode ( const IPTC_Manager & iptc, SXMPMeta * xmp ) { std::string utf8Str; size_t count = iptc.GetDataSet_UTF8 ( kIPTC_SubjectCode, 0 ); for ( size_t ds = 0; ds < count; ++ds ) { (void) iptc.GetDataSet_UTF8 ( kIPTC_SubjectCode, &utf8Str, ds ); char * refNumPtr = (char*) utf8Str.c_str(); for ( ; (*refNumPtr != ':') && (*refNumPtr != 0); ++refNumPtr ) {} if ( *refNumPtr == 0 ) continue; // This DataSet is ill-formed. char * refNumEnd = refNumPtr + 1; for ( ; (*refNumEnd != ':') && (*refNumEnd != 0); ++refNumEnd ) {} if ( (refNumEnd - refNumPtr) != 8 ) continue; // This DataSet is ill-formed. *refNumEnd = 0; // Ensure a terminating nul for the reference number portion. xmp->AppendArrayItem ( kXMP_NS_IPTCCore, "SubjectCode", kXMP_PropArrayIsUnordered, refNumPtr ); } } // ImportIPTC_SubjectCode // ================================================================================================= // PhotoDataUtils::Import2WayIPTC // ============================== void PhotoDataUtils::Import2WayIPTC ( const IPTC_Manager & iptc, SXMPMeta * xmp, int iptcDigestState ) { if ( iptcDigestState == kDigestMatches ) return; // Ignore the IPTC if the digest matches. std::string oldStr, newStr; IPTC_Writer oldIPTC; if ( iptcDigestState == kDigestDiffers ) { PhotoDataUtils::ExportIPTC ( *xmp, &oldIPTC ); // Predict old IPTC DataSets based on the existing XMP. } size_t newCount; IPTC_Manager::DataSetInfo newInfo, oldInfo; for ( size_t i = 0; kKnownDataSets[i].id != 255; ++i ) { const DataSetCharacteristics & thisDS = kKnownDataSets[i]; if ( thisDS.mapForm >= kIPTC_Map3Way ) continue; // The mapping is handled elsewhere, or not at all. bool haveXMP = xmp->DoesPropertyExist ( thisDS.xmpNS, thisDS.xmpProp ); newCount = PhotoDataUtils::GetNativeInfo ( iptc, thisDS.id, iptcDigestState, haveXMP, &newInfo ); if ( newCount == 0 ) continue; // GetNativeInfo returns 0 for ignored local text. if ( iptcDigestState == kDigestMissing ) { if ( haveXMP ) continue; // Keep the existing XMP. } else if ( ! PhotoDataUtils::IsValueDifferent ( iptc, oldIPTC, thisDS.id ) ) { continue; // Don't import values that match the previous export. } // The IPTC wins. Delete any existing XMP and import the DataSet. xmp->DeleteProperty ( thisDS.xmpNS, thisDS.xmpProp ); try { // Don't let errors with one stop the others. switch ( thisDS.mapForm ) { case kIPTC_MapSimple : ImportIPTC_Simple ( iptc, xmp, thisDS.id, thisDS.xmpNS, thisDS.xmpProp ); break; case kIPTC_MapLangAlt : ImportIPTC_LangAlt ( iptc, xmp, thisDS.id, thisDS.xmpNS, thisDS.xmpProp ); break; case kIPTC_MapArray : ImportIPTC_Array ( iptc, xmp, thisDS.id, thisDS.xmpNS, thisDS.xmpProp ); break; case kIPTC_MapSpecial : if ( thisDS.id == kIPTC_DateCreated ) { PhotoDataUtils::ImportIPTC_Date ( thisDS.id, iptc, xmp ); } else if ( thisDS.id == kIPTC_IntellectualGenre ) { ImportIPTC_IntellectualGenre ( iptc, xmp ); } else if ( thisDS.id == kIPTC_SubjectCode ) { ImportIPTC_SubjectCode ( iptc, xmp ); } else { XMP_Assert ( false ); // Catch mapping errors. } break; } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } } // PhotoDataUtils::Import2WayIPTC // ================================================================================================= // PhotoDataUtils::ImportPSIR // ========================== // // There are only 2 standalone Photoshop image resources for XMP properties: // 1034 - Copyright Flag - 0/1 Boolean mapped to xmpRights:Marked. // 1035 - Copyright URL - Local OS text mapped to xmpRights:WebStatement. // ! Photoshop does not use a true/false/missing model for PSIR 1034. Instead it essentially uses a // ! yes/don't-know model when importing. A missing or 0 value for PSIR 1034 cause xmpRights:Marked // ! to be deleted. void PhotoDataUtils::ImportPSIR ( const PSIR_Manager & psir, SXMPMeta * xmp, int iptcDigestState ) { PSIR_Manager::ImgRsrcInfo rsrcInfo; bool import; if ( iptcDigestState == kDigestMatches ) return; try { // Don't let errors with one stop the others. import = psir.GetImgRsrc ( kPSIR_CopyrightFlag, &rsrcInfo ); if ( import ) import = (! xmp->DoesPropertyExist ( kXMP_NS_XMP_Rights, "Marked" )); if ( import && (rsrcInfo.dataLen == 1) && (*((XMP_Uns8*)rsrcInfo.dataPtr) != 0) ) { xmp->SetProperty_Bool ( kXMP_NS_XMP_Rights, "Marked", true ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } try { // Don't let errors with one stop the others. import = psir.GetImgRsrc ( kPSIR_CopyrightURL, &rsrcInfo ); if ( import ) import = (! xmp->DoesPropertyExist ( kXMP_NS_XMP_Rights, "WebStatement" )); if ( import ) { std::string utf8; if ( ReconcileUtils::IsUTF8 ( rsrcInfo.dataPtr, rsrcInfo.dataLen ) ) { utf8.assign ( (char*)rsrcInfo.dataPtr, rsrcInfo.dataLen ); } else if ( ! ignoreLocalText ) { ReconcileUtils::LocalToUTF8 ( rsrcInfo.dataPtr, rsrcInfo.dataLen, &utf8 ); } else { import = false; // Inhibit the SetProperty call. } if ( import ) xmp->SetProperty ( kXMP_NS_XMP_Rights, "WebStatement", utf8.c_str() ); } } catch ( ... ) { // Do nothing, let other imports proceed. // ? Notify client? } } // PhotoDataUtils::ImportPSIR; // ================================================================================================= // ================================================================================================= // ================================================================================================= // ExportIPTC_Simple // ================= static void ExportIPTC_Simple ( const SXMPMeta & xmp, IPTC_Manager * iptc, const char * xmpNS, const char * xmpProp, XMP_Uns8 id ) { std::string value; XMP_OptionBits xmpFlags; bool found = xmp.GetProperty ( xmpNS, xmpProp, &value, &xmpFlags ); if ( ! found ) { iptc->DeleteDataSet ( id ); return; } if ( ! XMP_PropIsSimple ( xmpFlags ) ) return; // ? Complain? Delete the DataSet? NormalizeToCR ( &value ); size_t iptcCount = iptc->GetDataSet ( id, 0 ); if ( iptcCount > 1 ) iptc->DeleteDataSet ( id ); iptc->SetDataSet_UTF8 ( id, value.c_str(), (XMP_Uns32)value.size(), 0 ); // ! Don't append a 2nd DataSet! } // ExportIPTC_Simple // ================================================================================================= // ExportIPTC_LangAlt // ================== static void ExportIPTC_LangAlt ( const SXMPMeta & xmp, IPTC_Manager * iptc, const char * xmpNS, const char * xmpProp, XMP_Uns8 id ) { std::string value; XMP_OptionBits xmpFlags; bool found = xmp.GetProperty ( xmpNS, xmpProp, 0, &xmpFlags ); if ( ! found ) { iptc->DeleteDataSet ( id ); return; } if ( ! XMP_ArrayIsAltText ( xmpFlags ) ) return; // ? Complain? Delete the DataSet? found = xmp.GetLocalizedText ( xmpNS, xmpProp, "", "x-default", 0, &value, 0 ); if ( ! found ) { iptc->DeleteDataSet ( id ); return; } NormalizeToCR ( &value ); size_t iptcCount = iptc->GetDataSet ( id, 0 ); if ( iptcCount > 1 ) iptc->DeleteDataSet ( id ); iptc->SetDataSet_UTF8 ( id, value.c_str(), (XMP_Uns32)value.size(), 0 ); // ! Don't append a 2nd DataSet! } // ExportIPTC_LangAlt // ================================================================================================= // ExportIPTC_Array // ================ // // Array exporting needs a bit of care to preserve the detection of XMP-only updates. If the current // XMP and IPTC array sizes differ, delete the entire IPTC and append all new values. If they match, // set the individual values in order - which lets SetDataSet apply its no-change optimization. static void ExportIPTC_Array ( const SXMPMeta & xmp, IPTC_Manager * iptc, const char * xmpNS, const char * xmpProp, XMP_Uns8 id ) { std::string value; XMP_OptionBits xmpFlags; bool found = xmp.GetProperty ( xmpNS, xmpProp, 0, &xmpFlags ); if ( ! found ) { iptc->DeleteDataSet ( id ); return; } if ( ! XMP_PropIsArray ( xmpFlags ) ) return; // ? Complain? Delete the DataSet? XMP_Index xmpCount = xmp.CountArrayItems ( xmpNS, xmpProp ); XMP_Index iptcCount = (XMP_Index) iptc->GetDataSet ( id, 0 ); if ( xmpCount != iptcCount ) iptc->DeleteDataSet ( id ); for ( XMP_Index ds = 0; ds < xmpCount; ++ds ) { // ! XMP arrays are indexed from 1, IPTC from 0. (void) xmp.GetArrayItem ( xmpNS, xmpProp, ds+1, &value, &xmpFlags ); if ( ! XMP_PropIsSimple ( xmpFlags ) ) continue; // ? Complain? NormalizeToCR ( &value ); iptc->SetDataSet_UTF8 ( id, value.c_str(), (XMP_Uns32)value.size(), ds ); // ! Appends if necessary. } } // ExportIPTC_Array // ================================================================================================= // ExportIPTC_IntellectualGenre // ============================ // // Export DataSet 2:04. In the IIM this is a 3 digit number, a colon, and a text name. Even though // the number is the more formal part, the IPTC4XMP rule is that the name is imported to XMP and the // number is dropped. Also, even though IIMv4.1 says that 2:04 is repeatable, the XMP property to // which it is mapped is simple. Look up the XMP value in a list of known genres to get the number. static void ExportIPTC_IntellectualGenre ( const SXMPMeta & xmp, IPTC_Manager * iptc ) { std::string xmpValue; XMP_OptionBits xmpFlags; bool found = xmp.GetProperty ( kXMP_NS_IPTCCore, "IntellectualGenre", &xmpValue, &xmpFlags ); if ( ! found ) { iptc->DeleteDataSet ( kIPTC_IntellectualGenre ); return; } if ( ! XMP_PropIsSimple ( xmpFlags ) ) return; // ? Complain? Delete the DataSet? NormalizeToCR ( &xmpValue ); int i; XMP_StringPtr namePtr = xmpValue.c_str(); for ( i = 0; kIntellectualGenreMappings[i].name != 0; ++i ) { if ( strcmp ( namePtr, kIntellectualGenreMappings[i].name ) == 0 ) break; } if ( kIntellectualGenreMappings[i].name == 0 ) return; // Not a known genre, don't export it. std::string iimValue = kIntellectualGenreMappings[i].refNum; iimValue += ':'; iimValue += xmpValue; size_t iptcCount = iptc->GetDataSet ( kIPTC_IntellectualGenre, 0 ); if ( iptcCount > 1 ) iptc->DeleteDataSet ( kIPTC_IntellectualGenre ); iptc->SetDataSet_UTF8 ( kIPTC_IntellectualGenre, iimValue.c_str(), (XMP_Uns32)iimValue.size(), 0 ); // ! Don't append a 2nd DataSet! } // ExportIPTC_IntellectualGenre // ================================================================================================= // ExportIPTC_SubjectCode // ====================== // // Export 2:12 DataSets from an unordered array. In the IIM each DataSet is composed of 5 colon // separated sections: a provider name, an 8 digit reference number, and 3 optional names for the // levels of the reference number hierarchy. The IPTC4XMP mapping rule is that only the reference // number is imported to XMP. We export with a fixed provider of "IPTC" and no optional names. static void ExportIPTC_SubjectCode ( const SXMPMeta & xmp, IPTC_Manager * iptc ) { std::string xmpValue, iimValue; XMP_OptionBits xmpFlags; bool found = xmp.GetProperty ( kXMP_NS_IPTCCore, "SubjectCode", 0, &xmpFlags ); if ( ! found ) { iptc->DeleteDataSet ( kIPTC_SubjectCode ); return; } if ( ! XMP_PropIsArray ( xmpFlags ) ) return; // ? Complain? Delete the DataSet? XMP_Index xmpCount = xmp.CountArrayItems ( kXMP_NS_IPTCCore, "SubjectCode" ); XMP_Index iptcCount = (XMP_Index) iptc->GetDataSet ( kIPTC_SubjectCode, 0 ); if ( xmpCount != iptcCount ) iptc->DeleteDataSet ( kIPTC_SubjectCode ); for ( XMP_Index ds = 0; ds < xmpCount; ++ds ) { // ! XMP arrays are indexed from 1, IPTC from 0. (void) xmp.GetArrayItem ( kXMP_NS_IPTCCore, "SubjectCode", ds+1, &xmpValue, &xmpFlags ); if ( ! XMP_PropIsSimple ( xmpFlags ) ) continue; // ? Complain? if ( xmpValue.size() != 8 ) continue; // ? Complain? iimValue = "IPTC:"; iimValue += xmpValue; iimValue += ":::"; // Add the separating colons for the empty name portions. iptc->SetDataSet_UTF8 ( kIPTC_SubjectCode, iimValue.c_str(), (XMP_Uns32)iimValue.size(), ds ); // ! Appends if necessary. } } // ExportIPTC_SubjectCode // ================================================================================================= // ExportIPTC_Date // =============== // // The IPTC date and time are "YYYYMMDD" and "HHMMSSxHHMM" where 'x' is '+' or '-'. Export the IPTC // time only if already present, or if the XMP has a time portion. // *** The date/time handling differs from the MWG 1.0 policy, following a proposed tweak to MWG: // *** Exif DateTimeOriginal <-> IPTC DateCreated <-> XMP photoshop:DateCreated // *** Exif DateTimeDigitized <-> IPTC DigitalCreateDate <-> XMP xmp:CreateDate static void ExportIPTC_Date ( XMP_Uns8 dateID, const SXMPMeta & xmp, IPTC_Manager * iptc ) { XMP_Uns8 timeID; XMP_StringPtr xmpNS, xmpProp; if ( dateID == kIPTC_DateCreated ) { timeID = kIPTC_TimeCreated; xmpNS = kXMP_NS_Photoshop; xmpProp = "DateCreated"; } else if ( dateID == kIPTC_DigitalCreateDate ) { timeID = kIPTC_DigitalCreateTime; xmpNS = kXMP_NS_XMP; xmpProp = "CreateDate"; } else { XMP_Throw ( "Unrecognized dateID", kXMPErr_BadParam ); } iptc->DeleteDataSet ( dateID ); // ! Either the XMP does not exist and we want to iptc->DeleteDataSet ( timeID ); // ! delete the IPTC, or we're replacing the IPTC. XMP_DateTime xmpValue; bool found = xmp.GetProperty_Date ( xmpNS, xmpProp, &xmpValue, 0 ); if ( ! found ) return; char iimValue[16]; // AUDIT: Big enough for "YYYYMMDD" (8) and "HHMMSS+HHMM" (11). // Set the IIM date portion as YYYYMMDD with zeroes for unknown parts. snprintf ( iimValue, sizeof(iimValue), "%04d%02d%02d", // AUDIT: Use of sizeof(iimValue) is safe. xmpValue.year, xmpValue.month, xmpValue.day ); iptc->SetDataSet_UTF8 ( dateID, iimValue, 8 ); // Set the IIM time portion as HHMMSS+HHMM (or -HHMM). Allow a missing time zone. if ( xmpValue.hasTimeZone ) { snprintf ( iimValue, sizeof(iimValue), "%02d%02d%02d%c%02d%02d", // AUDIT: Use of sizeof(iimValue) is safe. xmpValue.hour, xmpValue.minute, xmpValue.second, ((xmpValue.tzSign == kXMP_TimeWestOfUTC) ? '-' : '+'), xmpValue.tzHour, xmpValue.tzMinute ); iptc->SetDataSet_UTF8 ( timeID, iimValue, 11 ); } else if ( xmpValue.hasTime ) { snprintf ( iimValue, sizeof(iimValue), "%02d%02d%02d", // AUDIT: Use of sizeof(iimValue) is safe. xmpValue.hour, xmpValue.minute, xmpValue.second ); iptc->SetDataSet_UTF8 ( timeID, iimValue, 6 ); } else { iptc->DeleteDataSet ( timeID ); } } // ExportIPTC_Date // ================================================================================================= // PhotoDataUtils::ExportIPTC // ========================== void PhotoDataUtils::ExportIPTC ( const SXMPMeta & xmp, IPTC_Manager * iptc ) { for ( size_t i = 0; kKnownDataSets[i].id != 255; ++i ) { try { // Don't let errors with one stop the others. const DataSetCharacteristics & thisDS = kKnownDataSets[i]; if ( thisDS.mapForm >= kIPTC_UnmappedText ) continue; switch ( thisDS.mapForm ) { case kIPTC_MapSimple : ExportIPTC_Simple ( xmp, iptc, thisDS.xmpNS, thisDS.xmpProp, thisDS.id ); break; case kIPTC_MapLangAlt : ExportIPTC_LangAlt ( xmp, iptc, thisDS.xmpNS, thisDS.xmpProp, thisDS.id ); break; case kIPTC_MapArray : ExportIPTC_Array ( xmp, iptc, thisDS.xmpNS, thisDS.xmpProp, thisDS.id ); break; case kIPTC_MapSpecial : if ( thisDS.id == kIPTC_DateCreated ) { ExportIPTC_Date ( thisDS.id, xmp, iptc ); } else if ( thisDS.id == kIPTC_IntellectualGenre ) { ExportIPTC_IntellectualGenre ( xmp, iptc ); } else if ( thisDS.id == kIPTC_SubjectCode ) { ExportIPTC_SubjectCode ( xmp, iptc ); } else { XMP_Assert ( false ); // Catch mapping errors. } break; case kIPTC_Map3Way : // The 3 way case is special for import, not for export. if ( thisDS.id == kIPTC_DigitalCreateDate ) { // ! Special case: Don't create IIM DigitalCreateDate. This can avoid PSD // ! full rewrite due to new mapping from xmp:CreateDate. if ( iptc->GetDataSet ( thisDS.id, 0 ) > 0 ) ExportIPTC_Date ( thisDS.id, xmp, iptc ); } else if ( thisDS.id == kIPTC_Creator ) { ExportIPTC_Array ( xmp, iptc, kXMP_NS_DC, "creator", kIPTC_Creator ); } else if ( thisDS.id == kIPTC_CopyrightNotice ) { ExportIPTC_LangAlt ( xmp, iptc, kXMP_NS_DC, "rights", kIPTC_CopyrightNotice ); } else if ( thisDS.id == kIPTC_Description ) { ExportIPTC_LangAlt ( xmp, iptc, kXMP_NS_DC, "description", kIPTC_Description ); } else { XMP_Assert ( false ); // Catch mapping errors. } } } catch ( ... ) { // Do nothing, let other exports proceed. // ? Notify client? } } } // PhotoDataUtils::ExportIPTC; // ================================================================================================= // PhotoDataUtils::ExportPSIR // ========================== // // There are only 2 standalone Photoshop image resources for XMP properties: // 1034 - Copyright Flag - 0/1 Boolean mapped to xmpRights:Marked. // 1035 - Copyright URL - Local OS text mapped to xmpRights:WebStatement. // ! Photoshop does not use a true/false/missing model for PSIR 1034. Instead it is always written, // ! a missing xmpRights:Marked results in 0 for PSIR 1034. // ! We don't bother with the CR<->LF normalization for xmpRights:WebStatement. Very little chance // ! of having a raw CR character in a URI. void PhotoDataUtils::ExportPSIR ( const SXMPMeta & xmp, PSIR_Manager * psir ) { bool found; std::string utf8Value; try { // Don't let errors with one stop the others. bool copyrighted = false; found = xmp.GetProperty ( kXMP_NS_XMP_Rights, "Marked", &utf8Value, 0 ); if ( found ) copyrighted = SXMPUtils::ConvertToBool ( utf8Value ); psir->SetImgRsrc ( kPSIR_CopyrightFlag, ©righted, 1 ); } catch ( ... ) { // Do nothing, let other exports proceed. // ? Notify client? } try { // Don't let errors with one stop the others. found = xmp.GetProperty ( kXMP_NS_XMP_Rights, "WebStatement", &utf8Value, 0 ); if ( ! found ) { psir->DeleteImgRsrc ( kPSIR_CopyrightURL ); } else if ( ! ignoreLocalText ) { std::string localValue; ReconcileUtils::UTF8ToLocal ( utf8Value.c_str(), utf8Value.size(), &localValue ); psir->SetImgRsrc ( kPSIR_CopyrightURL, localValue.c_str(), (XMP_Uns32)localValue.size() ); } else if ( ReconcileUtils::IsASCII ( utf8Value.c_str(), utf8Value.size() ) ) { psir->SetImgRsrc ( kPSIR_CopyrightURL, utf8Value.c_str(), (XMP_Uns32)utf8Value.size() ); } else { psir->DeleteImgRsrc ( kPSIR_CopyrightURL ); } } catch ( ... ) { // Do nothing, let other exports proceed. // ? Notify client? } } // PhotoDataUtils::ExportPSIR; exempi-2.2.1/source/XMPFiles/FormatSupport/RIFF_Support.hpp0000664000175000017500000000255612150230673020504 00000000000000#ifndef __RIFF_Support_hpp__ #define __RIFF_Support_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2009 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include #include "XMPFiles_Impl.hpp" // ahead declaration: class RIFF_MetaHandler; namespace RIFF { // declare ahead class Chunk; class ContainerChunk; class ValueChunk; class XMPChunk; /* This rountines imports the properties found into the xmp packet. Use after parsing. */ void importProperties( RIFF_MetaHandler* handler ); /* This rountines exports XMP properties to the respective Chunks, creating those if needed. No writing to file here. */ void exportAndRemoveProperties( RIFF_MetaHandler* handler ); /* will relocated a wrongly placed chunk (one of XMP, LIST:Info, LIST:Tdat= from RIFF::avix back to main chunk. Chunk itself not touched. */ void relocateWronglyPlacedXMPChunk( RIFF_MetaHandler* handler ); } // namespace RIFF #endif // __RIFF_Support_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/PNG_Support.hpp0000664000175000017500000000471212150230672020375 00000000000000#ifndef __PNG_Support_hpp__ #define __PNG_Support_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "XMPFiles_Impl.hpp" #define PNG_SIGNATURE_LEN 8 #define PNG_SIGNATURE_DATA "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A" #define ITXT_CHUNK_TYPE "iTXt" #define ITXT_HEADER_LEN 22 #define ITXT_HEADER_DATA "XML:com.adobe.xmp\0\0\0\0\0" namespace PNG_Support { class ChunkData { public: ChunkData() : pos(0), len(0), type(0), xmp(false) {} virtual ~ChunkData() {} // | length | type | data | crc(type+data) | // | 4 | 4 | val(length) | 4 | // XMP_Uns64 pos; // file offset of chunk XMP_Uns32 len; // length of chunk data long type; // name/type of chunk bool xmp; // iTXt-chunk with XMP ? }; typedef std::vector ChunkVector; typedef ChunkVector::iterator ChunkIterator; class ChunkState { public: ChunkState() : xmpPos(0), xmpLen(0) {} virtual ~ChunkState() {} XMP_Uns64 xmpPos; XMP_Uns32 xmpLen; ChunkData xmpChunk; ChunkVector chunks; /* vector of chunks */ }; long OpenPNG ( LFA_FileRef fileRef, ChunkState& inOutChunkState ); bool ReadChunk ( LFA_FileRef fileRef, ChunkState& inOutChunkState, long* chunkType, XMP_Uns32* chunkLength, XMP_Uns64& inOutPosition ); bool WriteXMPChunk ( LFA_FileRef fileRef, XMP_Uns32 len, const char* inBuffer ); bool CopyChunk ( LFA_FileRef sourceRef, LFA_FileRef destRef, ChunkData& chunk ); unsigned long UpdateChunkCRC( LFA_FileRef fileRef, ChunkData& inOutChunkData ); bool CheckIHDRChunkHeader ( ChunkData& inOutChunkData ); unsigned long CheckiTXtChunkHeader ( LFA_FileRef fileRef, ChunkState& inOutChunkState, ChunkData& inOutChunkData ); bool ReadBuffer ( LFA_FileRef fileRef, XMP_Uns64& pos, XMP_Uns32 len, char* outBuffer ); bool WriteBuffer ( LFA_FileRef fileRef, XMP_Uns64& pos, XMP_Uns32 len, const char* inBuffer ); unsigned long CalculateCRC( unsigned char* inBuffer, XMP_Uns32 len ); } // namespace PNG_Support #endif // __PNG_Support_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/IPTC_Support.cpp0000664000175000017500000007204212150230672020504 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "IPTC_Support.hpp" #include "EndianUtils.hpp" #include "Reconcile_Impl.hpp" // ================================================================================================= /// \file IPTC_Support.cpp /// \brief XMPFiles support for IPTC (IIM) DataSets. /// // ================================================================================================= enum { kUTF8_IncomingMode = 0, kUTF8_LosslessMode = 1, kUTF8_AlwaysMode = 2 }; #ifndef kUTF8_Mode #define kUTF8_Mode kUTF8_AlwaysMode #endif const DataSetCharacteristics kKnownDataSets[] = { { kIPTC_ObjectType, kIPTC_UnmappedText, 67, "", "" }, // Not mapped to XMP. { kIPTC_IntellectualGenre, kIPTC_MapSpecial, 68, kXMP_NS_IPTCCore, "IntellectualGenre" }, // Only the name part is in the XMP. { kIPTC_Title, kIPTC_MapLangAlt, 64, kXMP_NS_DC, "title" }, { kIPTC_EditStatus, kIPTC_UnmappedText, 64, "", "" }, // Not mapped to XMP. { kIPTC_EditorialUpdate, kIPTC_UnmappedText, 2, "", "" }, // Not mapped to XMP. { kIPTC_Urgency, kIPTC_MapSimple, 1, kXMP_NS_Photoshop, "Urgency" }, { kIPTC_SubjectCode, kIPTC_MapSpecial, 236, kXMP_NS_IPTCCore, "SubjectCode" }, // Only the reference number is in the XMP. { kIPTC_Category, kIPTC_MapSimple, 3, kXMP_NS_Photoshop, "Category" }, { kIPTC_SuppCategory, kIPTC_MapArray, 32, kXMP_NS_Photoshop, "SupplementalCategories" }, { kIPTC_FixtureIdentifier, kIPTC_UnmappedText, 32, "", "" }, // Not mapped to XMP. { kIPTC_Keyword, kIPTC_MapArray, 64, kXMP_NS_DC, "subject" }, { kIPTC_ContentLocCode, kIPTC_UnmappedText, 3, "", "" }, // Not mapped to XMP. { kIPTC_ContentLocName, kIPTC_UnmappedText, 64, "", "" }, // Not mapped to XMP. { kIPTC_ReleaseDate, kIPTC_UnmappedText, 8, "", "" }, // Not mapped to XMP. { kIPTC_ReleaseTime, kIPTC_UnmappedText, 11, "", "" }, // Not mapped to XMP. { kIPTC_ExpDate, kIPTC_UnmappedText, 8, "", "" }, // Not mapped to XMP. { kIPTC_ExpTime, kIPTC_UnmappedText, 11, "", "" }, // Not mapped to XMP. { kIPTC_Instructions, kIPTC_MapSimple, 256, kXMP_NS_Photoshop, "Instructions" }, { kIPTC_ActionAdvised, kIPTC_UnmappedText, 2, "", "" }, // Not mapped to XMP. { kIPTC_RefService, kIPTC_UnmappedText, 10, "", "" }, // Not mapped to XMP. ! Interleave 2:45, 2:47, 2:50! { kIPTC_RefDate, kIPTC_UnmappedText, 8, "", "" }, // Not mapped to XMP. ! Interleave 2:45, 2:47, 2:50! { kIPTC_RefNumber, kIPTC_UnmappedText, 8, "", "" }, // Not mapped to XMP. ! Interleave 2:45, 2:47, 2:50! { kIPTC_DateCreated, kIPTC_MapSpecial, 8, kXMP_NS_Photoshop, "DateCreated" }, // ! Reformatted date. Combined with 2:60, TimeCreated. { kIPTC_TimeCreated, kIPTC_UnmappedText, 11, "", "" }, // ! Combined with 2:55, DateCreated. { kIPTC_DigitalCreateDate, kIPTC_Map3Way, 8, "", "" }, // ! 3 way Exif-IPTC-XMP date/time set. Combined with 2:63, DigitalCreateTime. { kIPTC_DigitalCreateTime, kIPTC_UnmappedText, 11, "", "" }, // ! Combined with 2:62, DigitalCreateDate. { kIPTC_OriginProgram, kIPTC_UnmappedText, 32, "", "" }, // Not mapped to XMP. { kIPTC_ProgramVersion, kIPTC_UnmappedText, 10, "", "" }, // Not mapped to XMP. { kIPTC_ObjectCycle, kIPTC_UnmappedText, 1, "", "" }, // Not mapped to XMP. { kIPTC_Creator, kIPTC_Map3Way, 32, "", "" }, // ! In the 3 way Exif-IPTC-XMP set. { kIPTC_CreatorJobtitle, kIPTC_MapSimple, 32, kXMP_NS_Photoshop, "AuthorsPosition" }, { kIPTC_City, kIPTC_MapSimple, 32, kXMP_NS_Photoshop, "City" }, { kIPTC_Location, kIPTC_MapSimple, 32, kXMP_NS_IPTCCore, "Location" }, { kIPTC_State, kIPTC_MapSimple, 32, kXMP_NS_Photoshop, "State" }, { kIPTC_CountryCode, kIPTC_MapSimple, 3, kXMP_NS_IPTCCore, "CountryCode" }, { kIPTC_Country, kIPTC_MapSimple, 64, kXMP_NS_Photoshop, "Country" }, { kIPTC_JobID, kIPTC_MapSimple, 32, kXMP_NS_Photoshop, "TransmissionReference" }, { kIPTC_Headline, kIPTC_MapSimple, 256, kXMP_NS_Photoshop, "Headline" }, { kIPTC_Provider, kIPTC_MapSimple, 32, kXMP_NS_Photoshop, "Credit" }, { kIPTC_Source, kIPTC_MapSimple, 32, kXMP_NS_Photoshop, "Source" }, { kIPTC_CopyrightNotice, kIPTC_Map3Way, 128, "", "" }, // ! In the 3 way Exif-IPTC-XMP set. { kIPTC_Contact, kIPTC_UnmappedText, 128, "", "" }, // Not mapped to XMP. { kIPTC_Description, kIPTC_Map3Way, 2000, "", "" }, // ! In the 3 way Exif-IPTC-XMP set. { kIPTC_DescriptionWriter, kIPTC_MapSimple, 32, kXMP_NS_Photoshop, "CaptionWriter" }, { kIPTC_RasterizedCaption, kIPTC_UnmappedBin, 7360, "", "" }, // Not mapped to XMP. ! Binary data! { kIPTC_ImageType, kIPTC_UnmappedText, 2, "", "" }, // Not mapped to XMP. { kIPTC_ImageOrientation, kIPTC_UnmappedText, 1, "", "" }, // Not mapped to XMP. { kIPTC_LanguageID, kIPTC_UnmappedText, 3, "", "" }, // Not mapped to XMP. { kIPTC_AudioType, kIPTC_UnmappedText, 2, "", "" }, // Not mapped to XMP. { kIPTC_AudioSampleRate, kIPTC_UnmappedText, 6, "", "" }, // Not mapped to XMP. { kIPTC_AudioSampleRes, kIPTC_UnmappedText, 2, "", "" }, // Not mapped to XMP. { kIPTC_AudioDuration, kIPTC_UnmappedText, 6, "", "" }, // Not mapped to XMP. { kIPTC_AudioOutcue, kIPTC_UnmappedText, 64, "", "" }, // Not mapped to XMP. { kIPTC_PreviewFormat, kIPTC_UnmappedBin, 2, "", "" }, // Not mapped to XMP. ! Binary data! { kIPTC_PreviewFormatVers, kIPTC_UnmappedBin, 2, "", "" }, // Not mapped to XMP. ! Binary data! { kIPTC_PreviewData, kIPTC_UnmappedBin, 256000, "", "" }, // Not mapped to XMP. ! Binary data! { 255, kIPTC_MapSpecial, 0, 0, 0 } }; // ! Must be last as a sentinel. // A combination of the IPTC "Subject Reference System Guidelines" and IIMv4.1 Appendix G. const IntellectualGenreMapping kIntellectualGenreMappings[] = { { "001", "Current" }, { "002", "Analysis" }, { "003", "Archive material" }, { "004", "Background" }, { "005", "Feature" }, { "006", "Forecast" }, { "007", "History" }, { "008", "Obituary" }, { "009", "Opinion" }, { "010", "Polls and surveys" }, { "010", "Polls & Surveys" }, { "011", "Profile" }, { "012", "Results listings and statistics" }, { "012", "Results Listings & Tables" }, { "013", "Side bar and supporting information" }, { "013", "Side bar & Supporting information" }, { "014", "Summary" }, { "015", "Transcript and verbatim" }, { "015", "Transcript & Verbatim" }, { "016", "Interview" }, { "017", "From the scene" }, { "017", "From the Scene" }, { "018", "Retrospective" }, { "019", "Synopsis" }, { "019", "Statistics" }, { "020", "Update" }, { "021", "Wrapup" }, { "021", "Wrap-up" }, { "022", "Press release" }, { "022", "Press Release" }, { "023", "Quote" }, { "024", "Press-digest" }, { "025", "Review" }, { "026", "Curtain raiser" }, { "027", "Actuality" }, { "028", "Question and answer" }, { "029", "Music" }, { "030", "Response to a question" }, { "031", "Raw sound" }, { "032", "Scener" }, { "033", "Text only" }, { "034", "Voicer" }, { "035", "Fixture" }, { 0, 0 } }; // ! Must be last as a sentinel. // ================================================================================================= // FindKnownDataSet // ================ static const DataSetCharacteristics* FindKnownDataSet ( XMP_Uns8 id ) { size_t i = 0; while ( kKnownDataSets[i].id < id ) ++i; // The list is short enough for a linear search. if ( kKnownDataSets[i].id != id ) return 0; return &kKnownDataSets[i]; } // FindKnownDataSet // ================================================================================================= // IPTC_Manager::ParseMemoryDataSets // ================================= // // Parse the legacy IIM block. Offsets and lengths are kept for any 1:90 DataSet and all of Record 2. void IPTC_Manager::ParseMemoryDataSets ( const void* data, XMP_Uns32 length, bool copyData /* = true */ ) { // Get rid of any existing data. DataSetMap::iterator dsPos = this->dataSets.begin(); DataSetMap::iterator dsEnd = this->dataSets.end(); for ( ; dsPos != dsEnd; ++dsPos ) this->DisposeLooseValue ( dsPos->second ); this->dataSets.clear(); if ( this->ownedContent ) free ( this->iptcContent ); this->ownedContent = false; // Set to true later if the content is copied. this->iptcContent = 0; this->iptcLength = 0; this->changed = false; if ( length == 0 ) return; if ( *((XMP_Uns8*)data) != 0x1C ) XMP_Throw ( "Not valid IPTC, no leading 0x1C", kXMPErr_BadIPTC ); // Allocate space for the full in-memory data and copy it. if ( length > 10*1024*1024 ) XMP_Throw ( "Outrageous length for memory-based IPTC", kXMPErr_BadIPTC ); this->iptcLength = length; if ( ! copyData ) { this->iptcContent = (XMP_Uns8*)data; } else { this->iptcContent = (XMP_Uns8*) malloc(length); if ( this->iptcContent == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); memcpy ( this->iptcContent, data, length ); // AUDIT: Safe, malloc'ed length bytes above. this->ownedContent = true; } // Build the map of the 2:* DataSets. XMP_Uns8* iptcPtr = this->iptcContent; XMP_Uns8* iptcEnd = iptcPtr + length; XMP_Uns8* iptcLimit = iptcEnd - kMinDataSetSize; XMP_Uns32 dsLen; // ! The large form can have values up to 4GB in length. this->utf8Encoding = false; bool found190 = false; bool found2xx = false; for ( ; iptcPtr <= iptcLimit; iptcPtr += dsLen ) { XMP_Uns8* dsPtr = iptcPtr; XMP_Uns8 oneC = *iptcPtr; XMP_Uns8 recNum = *(iptcPtr+1); XMP_Uns8 dsNum = *(iptcPtr+2); if ( oneC != 0x1C ) break; // No more DataSets. dsLen = GetUns16BE ( iptcPtr+3 ); // ! Compute dsLen before any "continue", needed for loop increment! iptcPtr += 5; // Advance to the data (or extended length). if ( (dsLen & 0x8000) != 0 ) { XMP_Assert ( dsLen <= 0xFFFF ); XMP_Uns32 lenLen = dsLen & 0x7FFF; if ( iptcPtr > iptcEnd-lenLen ) break; // Bad final DataSet. Throw instead? dsLen = 0; for ( XMP_Uns16 i = 0; i < lenLen; ++i, ++iptcPtr ) { dsLen = (dsLen << 8) + *iptcPtr; } } if ( iptcPtr > (iptcEnd - dsLen) ) break; // Bad final DataSet. Throw instead? if ( recNum == 0 ) continue; // Should not be a record 0. Throw instead? if ( recNum == 1 ) { if ( dsNum == 90 ) { found190 = true; this->offset190 = (XMP_Uns32) (dsPtr - this->iptcContent); this->length190 = 5 + dsLen; if ( (dsLen == 3) && (memcmp ( iptcPtr, "\x1B\x25\x47", 3 ) == 0) ) this->utf8Encoding = true; } continue; // Ignore all other record 1 DataSets. } if ( recNum == 2 ) { if ( ! found2xx ) { found2xx = true; this->offset2xx = (XMP_Uns32) (dsPtr - this->iptcContent); this->length2xx = this->iptcLength - this->offset2xx; // ! In case there are no other records. } } else { this->length2xx = (XMP_Uns32) (dsPtr - (this->iptcContent + this->offset2xx)); break; // The records are in ascending order, done with 2:xx DataSets. } XMP_Assert ( recNum == 2 ); if ( dsNum == 0 ) continue; // Ignore 2:00 when reading, it is created explicitly when writing. DataSetInfo dsInfo ( dsNum, dsLen, iptcPtr ); DataSetMap::iterator dsPos = this->dataSets.find ( dsNum ); bool repeatable = false; const DataSetCharacteristics* knownDS = FindKnownDataSet ( dsNum ); if ( (knownDS == 0) || (knownDS->mapForm == kIPTC_MapArray) ) { repeatable = true; // Allow repeats for unknown DataSets. } else if ( (dsNum == kIPTC_Creator) || (dsNum == kIPTC_SubjectCode) ) { repeatable = true; } if ( repeatable || (dsPos == this->dataSets.end()) ) { DataSetMap::value_type mapValue ( dsNum, dsInfo ); (void) this->dataSets.insert ( this->dataSets.upper_bound ( dsNum ), mapValue ); } else { this->DisposeLooseValue ( dsPos->second ); dsPos->second = dsInfo; // Keep the last copy of illegal repeats. } } } // IPTC_Manager::ParseMemoryDataSets // ================================================================================================= // IPTC_Manager::GetDataSet // ======================== size_t IPTC_Manager::GetDataSet ( XMP_Uns8 id, DataSetInfo* info, size_t which /* = 0 */ ) const { DataSetMap::const_iterator dsPos = this->dataSets.lower_bound ( id ); if ( (dsPos == this->dataSets.end()) || (id != dsPos->second.id) ) return 0; size_t dsCount = this->dataSets.count ( id ); if ( which >= dsCount ) return 0; // Valid range for which is 0 .. count-1. if ( info != 0 ) { for ( size_t i = 0; i < which; ++i ) ++dsPos; // Can't do "dsPos += which", no iter+int operator. *info = dsPos->second; } return dsCount; } // IPTC_Manager::GetDataSet // ================================================================================================= // IPTC_Manager::GetDataSet_UTF8 // ============================= size_t IPTC_Manager::GetDataSet_UTF8 ( XMP_Uns8 id, std::string * utf8Str, size_t which /* = 0 */ ) const { if ( utf8Str != 0 ) utf8Str->erase(); DataSetInfo dsInfo; size_t dsCount = GetDataSet ( id, &dsInfo, which ); if ( dsCount == 0 ) return 0; if ( utf8Str != 0 ) { if ( this->utf8Encoding ) { utf8Str->assign ( (char*)dsInfo.dataPtr, dsInfo.dataLen ); } else if ( ! ignoreLocalText ) { ReconcileUtils::LocalToUTF8 ( dsInfo.dataPtr, dsInfo.dataLen, utf8Str ); } else if ( ReconcileUtils::IsASCII ( dsInfo.dataPtr, dsInfo.dataLen ) ) { utf8Str->assign ( (char*)dsInfo.dataPtr, dsInfo.dataLen ); } } return dsCount; } // IPTC_Manager::GetDataSet_UTF8 // ================================================================================================= // IPTC_Manager::DisposeLooseValue // =============================== // // Dispose of loose values from SetDataSet calls after the last UpdateMemoryDataSets. // ! Don't try to make the DataSetInfo struct be self-cleaning. It is a primary public type, returned // ! from GetDataSet. Making it self-cleaning would get into nasty assignment and pointer ownership // ! issues, far worse than doing this explicit cleanup. void IPTC_Manager::DisposeLooseValue ( DataSetInfo & dsInfo ) { if ( dsInfo.dataLen == 0 ) return; XMP_Uns8* dataBegin = this->iptcContent; XMP_Uns8* dataEnd = dataBegin + this->iptcLength; if ( ((XMP_Uns8*)dsInfo.dataPtr < dataBegin) || ((XMP_Uns8*)dsInfo.dataPtr >= dataEnd) ) { free ( (void*) dsInfo.dataPtr ); dsInfo.dataPtr = 0; } } // IPTC_Manager::DisposeLooseValue // ================================================================================================= // ================================================================================================= // ================================================================================================= // IPTC_Writer::~IPTC_Writer // ========================= // // Dispose of loose values from SetDataSet calls after the last UpdateMemoryDataSets. IPTC_Writer::~IPTC_Writer() { DataSetMap::iterator dsPos = this->dataSets.begin(); DataSetMap::iterator dsEnd = this->dataSets.end(); for ( ; dsPos != dsEnd; ++dsPos ) this->DisposeLooseValue ( dsPos->second ); } // IPTC_Writer::~IPTC_Writer // ================================================================================================= // IPTC_Writer::SetDataSet_UTF8 // ============================ void IPTC_Writer::SetDataSet_UTF8 ( XMP_Uns8 id, const void* utf8Ptr, XMP_Uns32 utf8Len, long which /* = -1 */ ) { const DataSetCharacteristics* knownDS = FindKnownDataSet ( id ); if ( knownDS == 0 ) XMP_Throw ( "Can only set known IPTC DataSets", kXMPErr_InternalFailure ); // Decide which character encoding to use and get a temporary pointer to the value. XMP_Uns8 * tempPtr; XMP_Uns32 dataLen; std::string localStr; if ( kUTF8_Mode == kUTF8_AlwaysMode ) { // Always use UTF-8. if ( ! this->utf8Encoding ) this->ConvertToUTF8(); tempPtr = (XMP_Uns8*) utf8Ptr; dataLen = utf8Len; } else if ( kUTF8_Mode == kUTF8_IncomingMode ) { // Only use UTF-8 if that was what the parsed block used. if ( this->utf8Encoding ) { tempPtr = (XMP_Uns8*) utf8Ptr; dataLen = utf8Len; } else if ( ! ignoreLocalText ) { ReconcileUtils::UTF8ToLocal ( utf8Ptr, utf8Len, &localStr ); tempPtr = (XMP_Uns8*) localStr.data(); dataLen = (XMP_Uns32) localStr.size(); } else { if ( ! ReconcileUtils::IsASCII ( utf8Ptr, utf8Len ) ) return; tempPtr = (XMP_Uns8*) utf8Ptr; dataLen = utf8Len; } } else if ( kUTF8_Mode == kUTF8_LosslessMode ) { // Convert to UTF-8 if needed to prevent round trip loss. if ( this->utf8Encoding ) { tempPtr = (XMP_Uns8*) utf8Ptr; dataLen = utf8Len; } else if ( ! ignoreLocalText ) { std::string rtStr; ReconcileUtils::UTF8ToLocal ( utf8Ptr, utf8Len, &localStr ); ReconcileUtils::LocalToUTF8 ( localStr.data(), localStr.size(), &rtStr ); if ( (rtStr.size() == utf8Len) && (memcmp ( rtStr.data(), utf8Ptr, utf8Len ) == 0) ) { tempPtr = (XMP_Uns8*) localStr.data(); // No loss, keep local encoding. dataLen = (XMP_Uns32) localStr.size(); } else { this->ConvertToUTF8(); // Had loss, change everything to UTF-8. XMP_Assert ( this->utf8Encoding ); tempPtr = (XMP_Uns8*) utf8Ptr; dataLen = utf8Len; } } else { if ( ! ReconcileUtils::IsASCII ( utf8Ptr, utf8Len ) ) return; tempPtr = (XMP_Uns8*) utf8Ptr; dataLen = utf8Len; } } // Set the value for this DataSet, making a non-transient copy of the value. Respect UTF-8 character // boundaries when truncating. This is easy to check. If the first truncated byte has 10 in the // high order 2 bits then we are in the middle of a UTF-8 multi-byte character. // Back up to just before a byte with 11 in the high order 2 bits. if ( dataLen > knownDS->maxLen ) { dataLen = (XMP_Uns32)knownDS->maxLen; if ( this->utf8Encoding && ((tempPtr[dataLen] >> 6) == 2) ) { for ( ; (dataLen > 0) && ((tempPtr[dataLen] >> 6) != 3); --dataLen ) {} } } DataSetMap::iterator dsPos = this->dataSets.find ( id ); long currCount = (long) this->dataSets.count ( id ); bool repeatable = false; if ( knownDS->mapForm == kIPTC_MapArray ) { repeatable = true; } else if ( (id == kIPTC_Creator) || (id == kIPTC_SubjectCode) ) { repeatable = true; } if ( ! repeatable ) { if ( which > 0 ) XMP_Throw ( "Non-repeatable IPTC DataSet", kXMPErr_BadParam ); } else { if ( which < 0 ) which = currCount; // The default is to append. if ( which > currCount ) { XMP_Throw ( "Invalid index for IPTC DataSet", kXMPErr_BadParam ); } else if ( which == currCount ) { dsPos = this->dataSets.end(); // To make later checks do the right thing. } else { dsPos = this->dataSets.lower_bound ( id ); for ( ; which > 0; --which ) ++dsPos; } } if ( dsPos != this->dataSets.end() ) { if ( (dsPos->second.dataLen == dataLen) && (memcmp ( dsPos->second.dataPtr, tempPtr, dataLen ) == 0) ) { return; // ! New value matches the old, don't update. } } XMP_Uns8 * dataPtr = (XMP_Uns8*) malloc ( dataLen ); if ( dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); memcpy ( dataPtr, tempPtr, dataLen ); // AUDIT: Safe, malloc'ed dataLen bytes above. DataSetInfo dsInfo ( id, dataLen, dataPtr ); if ( dsPos != this->dataSets.end() ) { this->DisposeLooseValue ( dsPos->second ); dsPos->second = dsInfo; } else { DataSetMap::value_type mapValue ( id, dsInfo ); (void) this->dataSets.insert ( this->dataSets.upper_bound ( id ), mapValue ); } this->changed = true; } // IPTC_Writer::SetDataSet_UTF8 // ================================================================================================= // IPTC_Writer::DeleteDataSet // ========================== void IPTC_Writer::DeleteDataSet ( XMP_Uns8 id, long which /* = -1 */ ) { DataSetMap::iterator dsBegin = this->dataSets.lower_bound ( id ); // Set for which == -1. DataSetMap::iterator dsEnd = this->dataSets.upper_bound ( id ); if ( dsBegin == dsEnd ) return; // Nothing to delete. if ( which >= 0 ) { long currCount = (long) this->dataSets.count ( id ); if ( which >= currCount ) return; // Nothing to delete. for ( ; which > 0; --which ) ++dsBegin; dsEnd = dsBegin; ++dsEnd; // ! Can't do "dsEnd = dsBegin+1"! } for ( DataSetMap::iterator dsPos = dsBegin; dsPos != dsEnd; ++dsPos ) { this->DisposeLooseValue ( dsPos->second ); } this->dataSets.erase ( dsBegin, dsEnd ); this->changed = true; } // IPTC_Writer::DeleteDataSet // ================================================================================================= // IPTC_Writer::UpdateMemoryDataSets // ================================= // // Reconstruct the entire IIM block. This does not include any final alignment padding, that is an // artifact of some specific wrappers such as Photoshop image resources. void IPTC_Writer::UpdateMemoryDataSets() { if ( ! this->changed ) return; DataSetMap::iterator dsPos; DataSetMap::iterator dsEnd = this->dataSets.end(); if ( kUTF8_Mode == kUTF8_LosslessMode ) { if ( this->utf8Encoding ) { if ( ! this->CheckRoundTripLoss() ) this->ConvertToLocal(); } else { if ( this->CheckRoundTripLoss() ) this->ConvertToUTF8(); } } // Compute the length of the new IIM block, including space for records other than 2. All other // records are preserved as-is, except for 1:90. If local text is used then 1:90 is omitted, // if UTF-8 text is used then 1:90 is written. XMP_Uns32 midOffset = this->offset190 + this->length190; XMP_Uns32 midLength = this->offset2xx - midOffset; XMP_Uns32 suffixOffset = this->offset2xx + this->length2xx; XMP_Uns32 suffixLength = this->iptcLength - suffixOffset; XMP_Uns32 newLength = this->offset190 + (5+2); // For things before 1:90 and 2:0. if ( this->utf8Encoding ) newLength += (5+3); // For 1:90, if written. newLength += midLength; // For things between 1:90 and 2:xx. newLength += suffixLength; // For records after 2. for ( dsPos = this->dataSets.begin(); dsPos != dsEnd; ++dsPos ) { // Accumulate the 2:xx sizes. XMP_Uns32 dsLen = dsPos->second.dataLen; newLength += (5 + dsLen); if ( dsLen > 0x7FFF ) newLength += 4; // We always use a 4 byte extended length for big values. } // Allocate the new IIM block. XMP_Uns8* newContent = (XMP_Uns8*) malloc ( newLength ); if ( newContent == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); XMP_Uns8* dsPtr = newContent; // Write the 1:xx DataSets, including whatever is appropriate for 1:90. if ( this->offset190 > 0 ) { // Whatever was before an existing 1:90. memcpy ( dsPtr, this->iptcContent, this->offset190 ); // AUDIT: Within range of allocation. dsPtr += this->offset190; } if ( this->utf8Encoding ) { // Write 1:90 only if text is UTF-8. memcpy ( dsPtr, "\x1C\x01\x5A\x00\x03\x1B\x25\x47", (5+3) ); // AUDIT: Within range of allocation. dsPtr += (5+3); } if ( midLength > 0 ) { // Write the remainder before record 2. memcpy ( dsPtr, (this->iptcContent + midOffset), midLength ); // AUDIT: Within range of allocation. dsPtr += midLength; } // Write the 2:xx DataSets, starting with an explicit 2:00. if ( this->utf8Encoding ) { // Start with 2:00 for version 4. memcpy ( dsPtr, "\x1C\x02\x00\x00\x02\x00\x04", (5+2) ); // AUDIT: Within range of allocation. dsPtr += (5+2); } else { // Start with 2:00 for version 2. // *** We should probably write version 4 all the time. This is a late CS3 change, don't want // *** to risk breaking other apps that might be strict about version checking. memcpy ( dsPtr, "\x1C\x02\x00\x00\x02\x00\x02", (5+2) ); // AUDIT: Within range of allocation. dsPtr += (5+2); } // Fill in the record 2 DataSets that have values. for ( dsPos = this->dataSets.begin(); dsPos != dsEnd; ++dsPos ) { DataSetInfo & dsInfo = dsPos->second; dsPtr[0] = 0x1C; dsPtr[1] = 2; dsPtr[2] = dsInfo.id; dsPtr += 3; XMP_Uns32 dsLen = dsInfo.dataLen; if ( dsLen <= 0x7FFF ) { PutUns16BE ( (XMP_Uns16)dsLen, dsPtr ); dsPtr += 2; } else { PutUns16BE ( 0x8004, dsPtr ); PutUns32BE ( dsLen, dsPtr+2 ); dsPtr += 6; } if ( dsLen > (newLength - (dsPtr - newContent)) ) { XMP_Throw ( "Buffer overrun", kXMPErr_InternalFailure ); } memcpy ( dsPtr, dsInfo.dataPtr, dsLen ); // AUDIT: Protected by above check. dsPtr += dsLen; } if ( suffixLength > 0 ) { // Write the records after 2. memcpy ( dsPtr, (this->iptcContent + suffixOffset), suffixLength ); // AUDIT: Within range of allocation. dsPtr += suffixLength; } XMP_Assert ( dsPtr == (newContent + newLength) ); // Parse the new block, it is the best way to reset internal info and rebuild the map. this->ParseMemoryDataSets ( newContent, newLength, false ); // Don't make another copy of the content. XMP_Assert ( this->iptcLength == newLength ); this->ownedContent = (newLength > 0); // We really do own the new content, if not empty. } // IPTC_Writer::UpdateMemoryDataSets // ================================================================================================= // IPTC_Writer::ConvertToUTF8 // ========================== // // Convert the values of existing text DataSets to UTF-8. For now we only accept text DataSets. void IPTC_Writer::ConvertToUTF8() { XMP_Assert ( ! this->utf8Encoding ); std::string utf8Str; DataSetMap::iterator dsPos = this->dataSets.begin(); DataSetMap::iterator dsEnd = this->dataSets.end(); for ( ; dsPos != dsEnd; ++dsPos ) { DataSetInfo & dsInfo = dsPos->second; ReconcileUtils::LocalToUTF8 ( dsInfo.dataPtr, dsInfo.dataLen, &utf8Str ); this->DisposeLooseValue ( dsInfo ); dsInfo.dataLen = (XMP_Uns32)utf8Str.size(); dsInfo.dataPtr = (XMP_Uns8*) malloc ( dsInfo.dataLen ); if ( dsInfo.dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); memcpy ( dsInfo.dataPtr, utf8Str.data(), dsInfo.dataLen ); // AUDIT: Safe, malloc'ed dataLen bytes above. } this->utf8Encoding = true; } // IPTC_Writer::ConvertToUTF8 // ================================================================================================= // IPTC_Writer::ConvertToLocal // =========================== // // Convert the values of existing text DataSets to local. For now we only accept text DataSets. void IPTC_Writer::ConvertToLocal() { XMP_Assert ( this->utf8Encoding ); std::string localStr; DataSetMap::iterator dsPos = this->dataSets.begin(); DataSetMap::iterator dsEnd = this->dataSets.end(); for ( ; dsPos != dsEnd; ++dsPos ) { DataSetInfo & dsInfo = dsPos->second; ReconcileUtils::UTF8ToLocal ( dsInfo.dataPtr, dsInfo.dataLen, &localStr ); this->DisposeLooseValue ( dsInfo ); dsInfo.dataLen = (XMP_Uns32)localStr.size(); dsInfo.dataPtr = (XMP_Uns8*) malloc ( dsInfo.dataLen ); if ( dsInfo.dataPtr == 0 ) XMP_Throw ( "Out of memory", kXMPErr_NoMemory ); memcpy ( dsInfo.dataPtr, localStr.data(), dsInfo.dataLen ); // AUDIT: Safe, malloc'ed dataLen bytes above. } this->utf8Encoding = false; } // IPTC_Writer::ConvertToLocal // ================================================================================================= // IPTC_Writer::CheckRoundTripLoss // =============================== // // See if we still need UTF-8 because of round-trip loss. Returns true if there is loss. bool IPTC_Writer::CheckRoundTripLoss() { XMP_Assert ( this->utf8Encoding ); std::string localStr, rtStr; DataSetMap::iterator dsPos = this->dataSets.begin(); DataSetMap::iterator dsEnd = this->dataSets.end(); for ( ; dsPos != dsEnd; ++dsPos ) { DataSetInfo & dsInfo = dsPos->second; XMP_StringPtr utf8Ptr = (XMP_StringPtr) dsInfo.dataPtr; XMP_StringLen utf8Len = dsInfo.dataLen; ReconcileUtils::UTF8ToLocal ( utf8Ptr, utf8Len, &localStr ); ReconcileUtils::LocalToUTF8 ( localStr.data(), localStr.size(), &rtStr ); if ( (rtStr.size() != utf8Len) || (memcmp ( rtStr.data(), utf8Ptr, utf8Len ) != 0) ) { return true; // Had round-trip loss, keep UTF-8. } } return false; // No loss. } // IPTC_Writer::CheckRoundTripLoss // ================================================================================================= exempi-2.2.1/source/XMPFiles/FormatSupport/ReconcileLegacy.hpp0000664000175000017500000003523712150230673021254 00000000000000#ifndef __ReconcileLegacy_hpp__ #define __ReconcileLegacy_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2006 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "TIFF_Support.hpp" #include "PSIR_Support.hpp" #include "IPTC_Support.hpp" // ================================================================================================= /// \file ReconcileLegacy.hpp /// \brief Utilities to reconcile between XMP and photo metadata forms such as TIFF/Exif and IPTC. /// // ================================================================================================= // ImportPhotoData imports TIFF/Exif and IPTC metadata from JPEG, TIFF, and Photoshop files into // XMP. The caller must have already done the file specific processing to select the appropriate // sources of the TIFF stream, the Photoshop image resources, and the IPTC. // // The reconciliation logic used here is based on the Metadata Working Group guidelines. This is a // simpler approach than used previously - which was modeled after historical Photoshop behavior. enum { // Bits for the options to ImportJTPtoXMP. k2XMP_FileHadXMP = 0x0001, // Set if the file had an XMP packet. k2XMP_FileHadIPTC = 0x0002, // Set if the file had legacy IPTC. k2XMP_FileHadExif = 0x0004 // Set if the file had legacy Exif. }; extern void ImportPhotoData ( const TIFF_Manager & exif, const IPTC_Manager & iptc, const PSIR_Manager & psir, int iptcDigestState, SXMPMeta * xmp, XMP_OptionBits options = 0 ); // ExportPhotoData exports XMP into TIFF/Exif and IPTC metadata for JPEG, TIFF, and Photoshop files. extern void ExportPhotoData ( XMP_FileFormat destFormat, SXMPMeta * xmp, TIFF_Manager * exif, // Pass 0 if not wanted. IPTC_Manager * iptc, // Pass 0 if not wanted. PSIR_Manager * psir, // Pass 0 if not wanted. XMP_OptionBits options = 0 ); // *** Mapping notes need revision for MWG related changes. // ================================================================================================= // Summary of TIFF/Exif mappings to XMP // ==================================== // // The mapping for each tag is driven mainly by the tag ID, and secondarily by the type. E.g. there // is no blanket rule that all ASCII tags are mapped to simple strings in XMP. Some, such as // SubSecTime or GPSLatitudeRef, are combined with other tags; others, like Flash, are reformated. // However, most tags are in fact mapped in an obvious manner based on their type and count. // // Photoshop practice has been to truncate ASCII tags at the first NUL, not supporting the TIFF // specification's notion of multi-part ASCII values. // // Rational values are mapped to XMP as "num/denom". // // The tags of UNDEFINED type that are mapped to XMP text are either special cases like ExifVersion // or the strings with an explicit encoding like UserComment. // // Latitude and logitude are mapped to XMP as "DDD,MM,SSk" or "DDD,MM.mmk"; k is N, S, E, or W. // // Flash struct in XMP separates the Fired, Return, Mode, Function, and RedEyeMode portions of the // Exif value. Fired, Function, and RedEyeMode are Boolean; Return and Mode are integers. // // The OECF/SFR, CFA, and DeviceSettings tables are described in the XMP spec. // // Instead of iterating through all tags in the various IFDs, it is probably more efficient to have // explicit processing for the tags that get special treatment, and a static table listing those // that get mapped by type and count. The type and count processing will verify that the actual // type and count are as expected, if not the tag is ignored. // // Here are the primary (0th) IFD tags that get special treatment: // // 270, 33432 - ASCII mapped to alt-text['x-default'] // 306 - DateTime master // 315 - ASCII mapped to text seq[1] // // Here are the primary (0th) IFD tags that get mapped by type and count: // // 256, 257, 258, 259, 262, 271, 272, 274, 277, 282, 283, 284, 296, 301, 305, 318, 319, // 529, 530, 531, 532 // // Here are the Exif IFD tags that get special treatment: // // 34856, 41484 - OECF/SFR table // 36864, 40960 - 4 ASCII chars to text // 36867, 36868 - DateTime master // 37121 - 4 UInt8 to integer seq // 37385 - Flash struct // 37510 - explicitly encoded text to alt-text['x-default'] // 41728, 41729 - UInt8 to integer // 41730 - CFA table // 41995 - DeviceSettings table // // Here are the Exif IFD tags that get mapped by type and count: // // 33434, 33437, 34850, 34852, 34855, 37122, 37377, 37378, 37379, 37380, 37381, 37382, 37383, 37384, // 37386, 37396, 40961, 40962, 40963, 40964, 41483, 41486, 41487, 41488, 41492, 41493, 41495, 41985, // 41986, 41987, 41988, 41989, 41990, 41991, 41992, 41993, 41994, 41996, 42016 // // Here are the GPS IFD tags that get special treatment: // // 0 - 4 UInt8 to text "n.n.n.n" // 2, 4, 20, 22 - Latitude or longitude master // 7 - special DateTime master, the time part // 27, 28 - explicitly encoded text // // Here are the GPS IFD tags that get mapped by type and count: // // 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 23, 24, 25, 26, 30 // ================================================================================================= // *** What about the Camera Raw tags that MDKit maps: // *** 0xFDE8, 0xFDE9, 0xFDEA, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, 0xFE50, 0xFE51, 0xFE52, 0xFE53, // *** 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFE58 // ================================================================================================= // Summary of TIFF/Exif mappings from XMP // ====================================== // // Only a small number of properties are written back from XMP to TIFF/Exif. Most of the TIFF/Exif // tags mapped into XMP are information about the image or capture process, not things that users // should be editing. The tags that can be edited and written back to TIFF/Exif are: // // 270, 274, 282, 283, 296, 305, 306, 315, 33432; 36867, 36868, 37510, 40964 // ================================================================================================= // ================================================================================================= // Details of TIFF/Exif mappings // ============================= // // General (primary and thumbnail, 0th and 1st) IFD tags // tag TIFF type count Name XMP mapping // // 256 SHORTorLONG 1 ImageWidth integer // 257 SHORTorLONG 1 ImageLength integer // 258 SHORT 3 BitsPerSample integer seq // 259 SHORT 1 Compression integer // 262 SHORT 1 PhotometricInterpretation integer // 270 ASCII Any ImageDescription text, dc:description['x-default'] // 271 ASCII Any Make text // 272 ASCII Any Model text // 274 SHORT 1 Orientation integer // 277 SHORT 1 SamplesPerPixel integer // 282 RATIONAL 1 XResolution rational // 283 RATIONAL 1 YResolution rational // 284 SHORT 1 PlanarConfiguration integer // 296 SHORT 1 ResolutionUnit integer // 301 SHORT 3*256 TransferFunction integer seq // 305 ASCII Any Software text, xmp:CreatorTool // 306 ASCII 20 DateTime date, master of 37520, xmp:DateTime // 315 ASCII Any Artist text, dc:creator[1] // 318 RATIONAL 2 WhitePoint rational seq // 319 RATIONAL 6 PrimaryChromaticities rational seq // 529 RATIONAL 3 YCbCrCoefficients rational seq // 530 SHORT 2 YCbCrSubSampling integer seq // 531 SHORT 1 YCbCrPositioning integer // 532 RATIONAL 6 ReferenceBlackWhite rational seq // 33432 ASCII Any Copyright text, dc:rights['x-default'] // // Exif IFD tags // tag TIFF type count Name XMP mapping // // 33434 RATIONAL 1 ExposureTime rational // 33437 RATIONAL 1 FNumber rational // 34850 SHORT 1 ExposureProgram integer // 34852 ASCII Any SpectralSensitivity text // 34855 SHORT Any ISOSpeedRatings integer seq // 34856 UNDEFINED Any OECF OECF/SFR table // 36864 UNDEFINED 4 ExifVersion text, Exif has 4 ASCII chars // 36867 ASCII 20 DateTimeOriginal date, master of 37521 // 36868 ASCII 20 DateTimeDigitized date, master of 37522 // 37121 UNDEFINED 4 ComponentsConfiguration integer seq, Exif has 4 UInt8 // 37122 RATIONAL 1 CompressedBitsPerPixel rational // 37377 SRATIONAL 1 ShutterSpeedValue rational // 37378 RATIONAL 1 ApertureValue rational // 37379 SRATIONAL 1 BrightnessValue rational // 37380 SRATIONAL 1 ExposureBiasValue rational // 37381 RATIONAL 1 MaxApertureValue rational // 37382 RATIONAL 1 SubjectDistance rational // 37383 SHORT 1 MeteringMode integer // 37384 SHORT 1 LightSource integer // 37385 SHORT 1 Flash Flash struct // 37386 RATIONAL 1 FocalLength rational // 37396 SHORT 2..4 SubjectArea integer seq // 37510 UNDEFINED Any UserComment text, explicit encoding, exif:UserComment['x-default] // 37520 ASCII Any SubSecTime date, with 306 // 37521 ASCII Any SubSecTimeOriginal date, with 36867 // 37522 ASCII Any SubSecTimeDigitized date, with 36868 // 40960 UNDEFINED 4 FlashpixVersion text, Exif has 4 ASCII chars // 40961 SHORT 1 ColorSpace integer // 40962 SHORTorLONG 1 PixelXDimension integer // 40963 SHORTorLONG 1 PixelYDimension integer // 40964 ASCII 13 RelatedSoundFile text // 41483 RATIONAL 1 FlashEnergy rational // 41484 UNDEFINED Any SpatialFrequencyResponse OECF/SFR table // 41486 RATIONAL 1 FocalPlaneXResolution rational // 41487 RATIONAL 1 FocalPlaneYResolution rational // 41488 SHORT 1 FocalPlaneResolutionUnit integer // 41492 SHORT 2 SubjectLocation integer seq // 41493 RATIONAL 1 ExposureIndex rational // 41495 SHORT 1 SensingMethod integer // 41728 UNDEFINED 1 FileSource integer, Exif has UInt8 // 41729 UNDEFINED 1 SceneType integer, Exif has UInt8 // 41730 UNDEFINED Any CFAPattern CFA table // 41985 SHORT 1 CustomRendered integer // 41986 SHORT 1 ExposureMode integer // 41987 SHORT 1 WhiteBalance integer // 41988 RATIONAL 1 DigitalZoomRatio rational // 41989 SHORT 1 FocalLengthIn35mmFilm integer // 41990 SHORT 1 SceneCaptureType integer // 41991 SHORT 1 GainControl integer // 41992 SHORT 1 Contrast integer // 41993 SHORT 1 Saturation integer // 41994 SHORT 1 Sharpness integer // 41995 UNDEFINED Any DeviceSettingDescription DeviceSettings table // 41996 SHORT 1 SubjectDistanceRange integer // 42016 ASCII 33 ImageUniqueID text // // GPS IFD tags // tag TIFF type count Name XMP mapping // // 0 BYTE 4 GPSVersionID text, "n.n.n.n", Exif has 4 UInt8 // 1 ASCII 2 GPSLatitudeRef latitude, with 2 // 2 RATIONAL 3 GPSLatitude latitude, master of 2 // 3 ASCII 2 GPSLongitudeRef longitude, with 4 // 4 RATIONAL 3 GPSLongitude longitude, master of 3 // 5 BYTE 1 GPSAltitudeRef integer // 6 RATIONAL 1 GPSAltitude rational // 7 RATIONAL 3 GPSTimeStamp date, master of 29 // 8 ASCII Any GPSSatellites text // 9 ASCII 2 GPSStatus text // 10 ASCII 2 GPSMeasureMode text // 11 RATIONAL 1 GPSDOP rational // 12 ASCII 2 GPSSpeedRef text // 13 RATIONAL 1 GPSSpeed rational // 14 ASCII 2 GPSTrackRef text // 15 RATIONAL 1 GPSTrack rational // 16 ASCII 2 GPSImgDirectionRef text // 17 RATIONAL 1 GPSImgDirection rational // 18 ASCII Any GPSMapDatum text // 19 ASCII 2 GPSDestLatitudeRef latitude, with 20 // 20 RATIONAL 3 GPSDestLatitude latitude, master of 19 // 21 ASCII 2 GPSDestLongitudeRef longitude, with 22 // 22 RATIONAL 3 GPSDestLongitude logitude, master of 21 // 23 ASCII 2 GPSDestBearingRef text // 24 RATIONAL 1 GPSDestBearing rational // 25 ASCII 2 GPSDestDistanceRef text // 26 RATIONAL 1 GPSDestDistance rational // 27 UNDEFINED Any GPSProcessingMethod text, explicit encoding // 28 UNDEFINED Any GPSAreaInformation text, explicit encoding // 29 ASCII 11 GPSDateStamp date, with 29 // 30 SHORT 1 GPSDifferential integer // // ================================================================================================= // ================================================================================================= #endif // #ifndef __ReconcileLegacy_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/XMPScanner.hpp0000664000175000017500000003051112150230673020170 00000000000000#ifndef __XMPScanner_hpp__ #define __XMPScanner_hpp__ // ================================================================================================= // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // // Adobe patent application tracking #P435, entitled 'Unique markers to simplify embedding data of // one format in a file with a different format', inventors: Sean Parent, Greg Gilley. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include #include #include #include #include #include "XMP_Const.h" // ================================================================================================= // The XMPScanner class is used to scan a stream of input for XMP packets. A scanner object is // constructed then fed the input through a series of calls to Scan. Report may be called at any // time to get the current knowledge of the input. // // A packet starts when a valid header is found and ends when a valid trailer is found. If the // header contains a "bytes" attribute, additional whitespace must follow. // // *** RESTRICTIONS: The current implementation of the scanner has the the following restrictions: // - The input must be presented in order. // - Not fully thread safe, don't make concurrent calls to the same XMPScanner object. // ================================================================================================= class XMPScanner { public: // ============================================================================================= // The entire input stream is represented as a series of snips. Each snip defines one portion // of the input stream that either has not been seen, has been seen and contains no packets, is // exactly one packet, or contains the start of an unfinished packet. Adjacent snips with the // same state are merged, so the number of snips is always minimal. // // A newly constructed XMPScanner object has one snip covering the whole input with a state // of "not seen". A block of input that contains a full XMP packet is split into 3 parts: a // (possibly empty) raw input snip, the packet, and another (possibly empty) raw input snip. A // block of input that contains the start of an XMP packet is split into two snips, a (possibly // empty) raw input snip and the packet start; the following snip must be a "not seen" snip. // // It is possible to have ill-formed packets. These have a syntactically valid header and // trailer, but some semantic error. For example, if the "bytes" attribute length does not span // to the end of the trailer, or if the following packet begins within trailing padding. enum { eNotSeenSnip, // This snip has not been seen yet. ePendingSnip, // This snip is an input buffer being processed. eRawInputSnip, // This snip is raw input, it doesn't contain any part of an XMP packet. eValidPacketSnip, // This snip is a complete, valid XMP packet. ePartialPacketSnip, // This snip contains the start of a possible XMP packet. eBadPacketSnip // This snip contains a complete, but semantically incorrect XMP packet. }; typedef XMP_Uns8 SnipState; enum { // The values allow easy testing for 16/32 bit and big/little endian. eChar8Bit = 0, eChar16BitBig = 2, eChar16BitLittle = 3, eChar32BitBig = 4, eChar32BitLittle = 5 }; typedef XMP_Uns8 CharacterForm; enum { eChar16BitMask = 2, // These constant shouldn't be used directly, they are mainly eChar32BitMask = 4, // for the CharFormIsXyz macros below. eCharLittleEndianMask = 1 }; #define CharFormIs16Bit(f) ( ((int)(f) & XMPScanner::eChar16BitMask) != 0 ) #define CharFormIs32Bit(f) ( ((int)(f) & XMPScanner::eChar32BitMask) != 0 ) #define CharFormIsBigEndian(f) ( ((int)(f) & XMPScanner::eCharLittleEndianMask) == 0 ) #define CharFormIsLittleEndian(f) ( ((int)(f) & XMPScanner::eCharLittleEndianMask) != 0 ) struct SnipInfo { XMP_Int64 fOffset; // The byte offset of this snip within the input stream. XMP_Int64 fLength; // The length in bytes of this snip. SnipState fState; // The state of this snip. bool fOutOfOrder; // If true, this snip was seen before the one in front of it. char fAccess; // The read-only/read-write access from the end attribute. CharacterForm fCharForm; // How the packet is divided into characters. const char * fEncodingAttr; // The value of the encoding attribute, if any, with nulls removed. XMP_Int64 fBytesAttr; // The value of the bytes attribute, -1 if not present. SnipInfo() : fOffset ( 0 ), fLength ( 0 ), fState ( eNotSeenSnip ), fOutOfOrder ( false ), fAccess ( ' ' ), fCharForm ( eChar8Bit ), fEncodingAttr ( "" ), fBytesAttr( -1 ) { } SnipInfo ( SnipState state, XMP_Int64 offset, XMP_Int64 length ) : fOffset ( offset ), fLength ( length ), fState ( state ), fOutOfOrder ( false ), fAccess ( ' ' ), fCharForm ( eChar8Bit ), fEncodingAttr ( "" ), fBytesAttr( -1 ) { } }; typedef std::vector SnipInfoVector; XMPScanner ( XMP_Int64 streamLength ); // Constructs a new XMPScanner object for a stream with the given length. ~XMPScanner(); long GetSnipCount(); // Returns the number of snips that the stream has been divided into. bool StreamAllScanned(); // Returns true if all of the stream has been seen. void Scan ( const void * bufferOrigin, XMP_Int64 bufferOffset, XMP_Int64 bufferLength ); // Scans the given part of the input, incorporating it in to the known snips. // The bufferOffset is the offset of this block of input relative to the entire stream. // The bufferLength is the length in bytes of this block of input. void Report ( SnipInfoVector & snips ); // Produces a report of what is known about the input stream. class ScanError : public std::logic_error { public: ScanError() throw() : std::logic_error ( "" ) {} explicit ScanError ( const char * message ) throw() : std::logic_error ( message ) {} virtual ~ScanError() throw() {} }; private: // XMPScanner class PacketMachine; class InternalSnip { public: SnipInfo fInfo; // The public info about this snip. std::auto_ptr fMachine; // The state machine for "active" snips. InternalSnip ( XMP_Int64 offset, XMP_Int64 length ); InternalSnip ( const InternalSnip & ); ~InternalSnip (); }; // InternalSnip typedef std::list InternalSnipList; typedef InternalSnipList::iterator InternalSnipIterator; class PacketMachine { public: XMP_Int64 fPacketStart; // Byte offset relative to the entire stream. XMP_Int32 fPacketLength; // Length in bytes to the end of the trailer processing instruction. XMP_Int32 fBytesAttr; // The value of the bytes attribute, -1 if not present. std::string fEncodingAttr; // The value of the encoding attribute, if any, with nulls removed. CharacterForm fCharForm; // How the packet is divided into characters. char fAccess; // The read-only/read-write access from the end attribute. bool fBogusPacket; // True if the packet has an error such as a bad "bytes" attribute value. void ResetMachine(); enum TriState { eTriNo, eTriMaybe, eTriYes }; TriState FindNextPacket(); void AssociateBuffer ( XMP_Int64 bufferOffset, const void * bufferOrigin, XMP_Int64 bufferLength ); PacketMachine ( XMP_Int64 bufferOffset, const void * bufferOrigin, XMP_Int64 bufferLength ); ~PacketMachine(); private: // PacketMachine PacketMachine() {}; // ! Hide the default constructor. enum RecognizerKind { eFailureRecognizer, // Not really recognizers, special states to end one buffer's processing. eSuccessRecognizer, eLeadInRecognizer, // Anything up to the next '<'. eHeadStartRecorder, // Save the starting offset, count intervening nulls. eHeadStartRecognizer, // The literal string "?xpacket begin=". eBOMRecognizer, // Recognize and record the quoted byte order marker. eIDTagRecognizer, // The literal string " id=". eIDOpenRecognizer, // The opening quote for the ID. eIDValueRecognizer, // The literal string "W5M0MpCehiHzreSzNTczkc9d". eIDCloseRecognizer, // The closing quote for the ID. eAttrSpaceRecognizer_1, // The space before an attribute. eAttrNameRecognizer_1, // The name of an attribute. eAttrValueRecognizer_1, // The equal sign and quoted string value for an attribute. eAttrValueRecorder_1, // Record the value of an attribute. eHeadEndRecognizer, // The string literal "?>". eBodyRecognizer, // The packet body, anything up to the next '<'. eTailStartRecognizer, // The string literal "?xpacket end=". eAccessValueRecognizer, // Recognize and record the quoted r/w access mode. eAttrSpaceRecognizer_2, // The space before an attribute. eAttrNameRecognizer_2, // The name of an attribute. eAttrValueRecognizer_2, // The equal sign and quoted string value for an attribute. eAttrValueRecorder_2, // Record the value of an attribute. eTailEndRecognizer, // The string literal "?>". ePacketEndRecognizer, // Look for trailing padding, check and record the packet size. eCloseOutRecognizer, // Look for final nulls for little endian multibyte characters. eRecognizerCount }; XMP_Int64 fBufferOffset; // The offset of the data buffer within the input stream. const char * fBufferOrigin; // The starting address of the data buffer for this snip. const char * fBufferPtr; // The current postion in the data buffer. const char * fBufferLimit; // The address one past the last byte in the data buffer. RecognizerKind fRecognizer; // Which recognizer is currently active. signed long fPosition; // The internal position within a string literal, etc. unsigned char fBytesPerChar; // The number of bytes per logical character, 1, 2, or 4. unsigned char fBufferOverrun; // Non-zero if suspended while skipping intervening nulls. char fQuoteChar; // The kind of quote seen at the start of a quoted value. std::string fAttrName; // The name for an arbitrary attribute (other than "begin" and "id"). std::string fAttrValue; // The value for an arbitrary attribute (other than "begin" and "id"). void SetNextRecognizer ( RecognizerKind nextRecognizer ); typedef TriState (* RecognizerProc) ( PacketMachine *, const char * ); static TriState FindLessThan ( PacketMachine * ths, const char * which ); static TriState MatchString ( PacketMachine * ths, const char * literal ); static TriState MatchChar ( PacketMachine * ths, const char * literal ); static TriState MatchOpenQuote ( PacketMachine * ths, const char * /* unused */ ); static TriState MatchCloseQuote ( PacketMachine * ths, const char * /* unused */ ); static TriState CaptureAttrName ( PacketMachine * ths, const char * /* unused */ ); static TriState CaptureAttrValue ( PacketMachine * ths, const char * /* unused */ ); static TriState RecordStart ( PacketMachine * ths, const char * /* unused */ ); static TriState RecognizeBOM ( PacketMachine * ths, const char * /* unused */ ); static TriState RecordHeadAttr ( PacketMachine * ths, const char * /* unused */ ); static TriState CaptureAccess ( PacketMachine * ths, const char * /* unused */ ); static TriState RecordTailAttr ( PacketMachine * ths, const char * /* unused */ ); static TriState CheckPacketEnd ( PacketMachine * ths, const char * /* unused */ ); static TriState CheckFinalNulls ( PacketMachine * ths, const char * /* unused */ ); struct RecognizerInfo { RecognizerProc proc; RecognizerKind successNext; RecognizerKind failureNext; const char * literal; }; }; // PacketMachine XMP_Int64 fStreamLength; InternalSnipList fInternalSnips; void SplitInternalSnip ( InternalSnipIterator snipPos, XMP_Int64 relOffset, XMP_Int64 newLength ); InternalSnipIterator MergeInternalSnips ( InternalSnipIterator firstPos, InternalSnipIterator secondPos ); InternalSnipIterator PrevSnip ( InternalSnipIterator snipPos ); InternalSnipIterator NextSnip ( InternalSnipIterator snipPos ); #if DEBUG void DumpSnipList ( const char * title ); #endif }; // XMPScanner #endif // __XMPScanner_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/ISOBaseMedia_Support.cpp0000664000175000017500000001340612150230672022131 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2007 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "ISOBaseMedia_Support.hpp" #include "XMPFiles_Impl.hpp" // ================================================================================================= /// \file ISOBaseMedia_Support.cpp /// \brief Manager for parsing and serializing ISO Base Media files ( MPEG-4 and JPEG-2000). /// // ================================================================================================= namespace ISOMedia { static BoxInfo voidInfo; // ================================================================================================= // GetBoxInfo - from memory // ======================== const XMP_Uns8 * GetBoxInfo ( const XMP_Uns8 * boxPtr, const XMP_Uns8 * boxLimit, BoxInfo * info, bool throwErrors /* = false */ ) { XMP_Uns32 u32Size; if ( info == 0 ) info = &voidInfo; info->boxType = info->headerSize = 0; info->contentSize = 0; if ( boxPtr >= boxLimit ) XMP_Throw ( "Bad offset to GetBoxInfo", kXMPErr_InternalFailure ); if ( (boxLimit - boxPtr) < 8 ) { // Is there enough space for a standard box header? if ( throwErrors ) XMP_Throw ( "No space for ISO box header", kXMPErr_BadFileFormat ); info->headerSize = (XMP_Uns32) (boxLimit - boxPtr); return boxLimit; } u32Size = GetUns32BE ( boxPtr ); info->boxType = GetUns32BE ( boxPtr+4 ); if ( u32Size >= 8 ) { info->headerSize = 8; // Normal explicit size case. info->contentSize = u32Size - 8; } else if ( u32Size == 0 ) { info->headerSize = 8; // The box goes to EoF - treat it as "to limit". info->contentSize = (boxLimit - boxPtr) - 8; } else if ( u32Size != 1 ) { if ( throwErrors ) XMP_Throw ( "Bad ISO box size, 2..7", kXMPErr_BadFileFormat ); info->headerSize = 8; // Bad total size in the range of 2..7, treat as 8. info->contentSize = 0; } else { if ( (boxLimit - boxPtr) < 16 ) { // Is there enough space for an extended box header? if ( throwErrors ) XMP_Throw ( "No space for ISO extended header", kXMPErr_BadFileFormat ); info->headerSize = (XMP_Uns32) (boxLimit - boxPtr); return boxLimit; } XMP_Uns64 u64Size = GetUns64BE ( boxPtr+8 ); if ( u64Size < 16 ) { if ( throwErrors ) XMP_Throw ( "Bad ISO extended box size, < 16", kXMPErr_BadFileFormat ); u64Size = 16; // Treat bad total size as 16. } info->headerSize = 16; info->contentSize = u64Size - 16; } XMP_Assert ( (XMP_Uns64)(boxLimit - boxPtr) >= (XMP_Uns64)info->headerSize ); if ( info->contentSize > (XMP_Uns64)((boxLimit - boxPtr) - info->headerSize) ) { if ( throwErrors ) XMP_Throw ( "Bad ISO box content size", kXMPErr_BadFileFormat ); info->contentSize = ((boxLimit - boxPtr) - info->headerSize); // Trim a bad content size to the limit. } return (boxPtr + info->headerSize + info->contentSize); } // GetBoxInfo // ================================================================================================= // GetBoxInfo - from a file // ======================== XMP_Uns64 GetBoxInfo ( LFA_FileRef fileRef, const XMP_Uns64 boxOffset, const XMP_Uns64 boxLimit, BoxInfo * info, bool doSeek /* = true */, bool throwErrors /* = false */ ) { XMP_Uns8 buffer [8]; XMP_Uns32 u32Size; if ( info == 0 ) info = &voidInfo; info->boxType = info->headerSize = 0; info->contentSize = 0; if ( boxOffset >= boxLimit ) XMP_Throw ( "Bad offset to GetBoxInfo", kXMPErr_InternalFailure ); if ( (boxLimit - boxOffset) < 8 ) { // Is there enough space for a standard box header? if ( throwErrors ) XMP_Throw ( "No space for ISO box header", kXMPErr_BadFileFormat ); info->headerSize = (XMP_Uns32) (boxLimit - boxOffset); return boxLimit; } if ( doSeek ) LFA_Seek ( fileRef, boxOffset, SEEK_SET ); (void) LFA_Read ( fileRef, buffer, 8, kLFA_RequireAll ); u32Size = GetUns32BE ( &buffer[0] ); info->boxType = GetUns32BE ( &buffer[4] ); if ( u32Size >= 8 ) { info->headerSize = 8; // Normal explicit size case. info->contentSize = u32Size - 8; } else if ( u32Size == 0 ) { info->headerSize = 8; // The box goes to EoF. info->contentSize = LFA_Measure(fileRef) - (boxOffset + 8); } else if ( u32Size != 1 ) { if ( throwErrors ) XMP_Throw ( "Bad ISO box size, 2..7", kXMPErr_BadFileFormat ); info->headerSize = 8; // Bad total size in the range of 2..7, treat as 8. info->contentSize = 0; } else { if ( (boxLimit - boxOffset) < 16 ) { // Is there enough space for an extended box header? if ( throwErrors ) XMP_Throw ( "No space for ISO extended header", kXMPErr_BadFileFormat ); info->headerSize = (XMP_Uns32) (boxLimit - boxOffset); return boxLimit; } (void) LFA_Read ( fileRef, buffer, 8, kLFA_RequireAll ); XMP_Uns64 u64Size = GetUns64BE ( &buffer[0] ); if ( u64Size < 16 ) { if ( throwErrors ) XMP_Throw ( "Bad ISO extended box size, < 16", kXMPErr_BadFileFormat ); u64Size = 16; // Treat bad total size as 16. } info->headerSize = 16; info->contentSize = u64Size - 16; } XMP_Assert ( (boxLimit - boxOffset) >= info->headerSize ); if ( info->contentSize > (boxLimit - boxOffset - info->headerSize) ) { if ( throwErrors ) XMP_Throw ( "Bad ISO box content size", kXMPErr_BadFileFormat ); info->contentSize = (boxLimit - boxOffset - info->headerSize); // Trim a bad content size to the limit. } return (boxOffset + info->headerSize + info->contentSize); } // GetBoxInfo } // namespace ISO_Media // ================================================================================================= exempi-2.2.1/source/XMPFiles/FormatSupport/Makefile.am0000664000175000017500000000530512150230672017537 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # noinst_LTLIBRARIES = libformatsupport.la noinst_HEADERS = IPTC_Support.hpp PSIR_Support.hpp\ Reconcile_Impl.hpp RIFF_Support.hpp XMPScanner.hpp\ ID3_Support.hpp PNG_Support.hpp QuickTime_Support.hpp\ ReconcileLegacy.hpp TIFF_Support.hpp GIF_Support.hpp INCLUDES = -I$(srcdir)/.. -I$(srcdir)/../FileHandlers -I$(srcdir)/../../common \ -I$(top_srcdir)/public/include/ -I$(top_srcdir)/build/ \ -I$(top_srcdir)/third-party/MD5 AM_CPPFLAGS = -Wno-multichar\ -D@EXEMPI_PLATFORM_DEF@=1 -DXMP_IMPL=1 -DXMP_ClientBuild=0 \ -D_FILE_OFFSET_BITS=64 -DHAVE_EXPAT_CONFIG_H=1 -DXML_STATIC=1 libformatsupport_la_SOURCES = PSIR_FileWriter.cpp Reconcile_Impl.cpp \ ReconcileTIFF.cpp TIFF_MemoryReader.cpp \ IPTC_Support.cpp PSIR_MemoryReader.cpp ReconcileIPTC.cpp \ RIFF.cpp RIFF.hpp \ RIFF_Support.cpp TIFF_Support.cpp \ ISOBaseMedia_Support.hpp ISOBaseMedia_Support.cpp \ PNG_Support.cpp ReconcileLegacy.cpp \ SWF_Support.hpp SWF_Support.cpp\ XDCAM_Support.hpp XDCAM_Support.cpp\ TIFF_FileWriter.cpp XMPScanner.cpp GIF_Support.cpp \ MOOV_Support.cpp MOOV_Support.hpp \ QuickTime_Support.cpp \ ASF_Support.hpp ASF_Support.cpp \ MacScriptExtracts.h \ $(NULL) exempi-2.2.1/source/XMPFiles/FormatSupport/ID3_Support.hpp0000664000175000017500000005527512150230672020342 00000000000000#ifndef __ID3_Support_hpp__ #define __ID3_Support_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include "XMP_Const.h" #include "XMPFiles_Impl.hpp" #include "UnicodeConversions.hpp" #include "Reconcile_Impl.hpp" #include #if XMP_WinBuild #define stricmp _stricmp #else static int stricmp ( const char * left, const char * right ) // Case insensitive ASCII compare. { char chL = *left; // ! Allow for 0 passes in the loop (one string is empty). char chR = *right; // ! Return -1 for stricmp ( "a", "Z" ). for ( ; (*left != 0) && (*right != 0); ++left, ++right ) { chL = *left; chR = *right; if ( chL == chR ) continue; if ( ('A' <= chL) && (chL <= 'Z') ) chL |= 0x20; if ( ('A' <= chR) && (chR <= 'Z') ) chR |= 0x20; if ( chL != chR ) break; } if ( chL == chR ) return 0; if ( chL < chR ) return -1; return 1; } #endif #define MIN(a, b) ((a) < (b) ? (a) : (b)) namespace ID3_Support { // Genres static char Genres[128][32]={ "Blues", // 0 "Classic Rock", // 1 "Country", // 2 "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", // 8 "Metal", "New Age", // 10 "Oldies", "Other", // 12 "Pop", "R&B", "Rap", "Reggae", // 16 "Rock", // 17 "Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", // 24 "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", // 32 "Instrumental", "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "AlternRock", "Bass", "Soul", //42 "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", "New Wave", // 66 "Psychadelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", // 80 "Folk-Rock", "National Folk", "Swing", "Fast Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", // 89 "Avantgarde", "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", // 100 "Speech", "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle", "Duet", "Punk Rock", "Drum Solo", "A capella", "Euro-House", "Dance Hall", "Unknown" // 126 }; ////////////////////////////////////////////////////////// // ID3 specific helper routines inline XMP_Int32 synchToInt32(XMP_Uns32 rawDataBE) // see part 6.2 of spec { XMP_Validate( 0 == (rawDataBE & 0x80808080),"input not synchsafe", kXMPErr_InternalFailure ); XMP_Int32 r = ( rawDataBE & 0x0000007F ) + ( rawDataBE >> 1 & 0x00003F80 ) + ( rawDataBE >> 2 & 0x001FC000 ) + ( rawDataBE >> 3 & 0x0FE00000 ); return r; } inline XMP_Uns32 int32ToSynch(XMP_Int32 value) { XMP_Validate( 0 <= 0x0FFFFFFF, "value too big", kXMPErr_InternalFailure ); XMP_Uns32 r = ( (value & 0x0000007F) << 0 ) + ( (value & 0x00003F80) << 1 ) + ( (value & 0x001FC000) << 2 ) + ( (value & 0x0FE00000) << 3 ); return r; } ////////////////////////////////////////////////////////// // data structures class ID3Header { public: const static XMP_Uns16 o_id = 0; const static XMP_Uns16 o_version_major = 3; const static XMP_Uns16 o_version_minor = 4; const static XMP_Uns16 o_flags = 5; const static XMP_Uns16 o_size = 6; const static int FIXED_SIZE = 10; char fields[FIXED_SIZE]; bool read(LFA_FileRef file) { LFA_Read( file, fields, FIXED_SIZE, true ); if ( !CheckBytes( &fields[ID3Header::o_id], "ID3", 3 ) ) { // chuck in default contents: const static char defaultHeader[FIXED_SIZE] = { 'I', 'D', '3', 3, 0, 0, 0, 0, 0, 0 }; memcpy( this->fields, defaultHeader, FIXED_SIZE); // NBA: implicitly protected by FIXED_SIZE design. return false; // no header found (o.k.) thus stick with new, default header constructed above } XMP_Uns8 major = fields[o_version_major]; XMP_Uns8 minor = fields[o_version_minor]; XMP_Validate( major==3 || major==4, "invalid ID3 major version", kXMPErr_BadFileFormat ); XMP_Validate( minor != 0xFF, "invalid ID3 minor version", kXMPErr_BadFileFormat ); return true; } void write(LFA_FileRef file, XMP_Int64 tagSize) { XMP_Assert( tagSize < 0x10000000 ); // 256 MB limit due to synching. XMP_Assert( tagSize > 0x0 ); // 256 MB limit due to synching. PutUns32BE( ( int32ToSynch ( (XMP_Uns32)tagSize - 10 )), &this->fields[ID3Header::o_size] ); LFA_Write( file, fields, FIXED_SIZE ); } ~ID3Header() { //nothing }; }; // ID3Header class ID3v2Frame { public: // fixed const static XMP_Uns16 o_id = 0; const static XMP_Uns16 o_size = 4; // size after unsync, excludes frame header. const static XMP_Uns16 o_flags = 8; const static int FIXED_SIZE = 10; char fields[FIXED_SIZE]; XMP_Uns32 id; XMP_Uns16 flags; bool active; //default: true. flag is lowered, if another frame with replaces this one as "last meaningful frame of its kind" bool changed; //default: false. flag is raised, if setString() is used // variable-size frame content char* content; XMP_Int32 contentSize; // size of variable content, right as its stored in o_size (total size - 10) /** * a mere empty hull for reading in frames. */ ID3v2Frame():id(0),flags(0),active(true),changed(false),content(0),contentSize(0) { memset(fields, 0, FIXED_SIZE); } /** * frame constructor */ ID3v2Frame( XMP_Uns32 id ):id(0),flags(0),active(true),changed(false),content(0),contentSize(0) { memset(fields, 0, FIXED_SIZE); this->id = id; PutUns32BE( id, &fields[o_id]); this->flags = 0x0000; PutUns16BE( flags, &fields[o_flags]); } /** * copy constructor: */ ID3v2Frame( const ID3v2Frame& orig) { XMP_Throw("not implemented",kXMPErr_InternalFailure); } /** * sets a new Content (aka property) */ void setFrameValue( const std::string& rawvalue, bool needDescriptor = false , bool utf16le = false, bool isXMPPRIVFrame = false, bool needEncodingByte = true ) { // the thing to insert std::string value; value.erase(); if ( isXMPPRIVFrame ) { // this flag must be used exclusive: XMP_Assert( ! needDescriptor ); XMP_Assert( ! utf16le ); value.append( "XMP\0", 4 ); value.append( rawvalue ); value.append( "\0", 1 ); // final zero byte } else // not an XMP Priv frame { if (needEncodingByte) // don't add encoding byte for example for WCOP { if ( utf16le ) value.append( "\x1", 1 ); // 'unicode encoding' (must be UTF-16, be or le) else value.append( "\x0", 1 ); } if ( needDescriptor ) // language descriptor value.append( "eng", 3 ); // language, empty content description if ( utf16le ) { if ( needDescriptor ) value.append( "\xFF\xFE\0\0", 4 ); // BOM, 16-bit zero (empty descriptor) value.append( "\xFF\xFE", 2 ); std::string utf16str; ToUTF16( (XMP_Uns8*) rawvalue.c_str(), rawvalue.size(), &utf16str, false ); value.append( utf16str ); value.append( "\0\0", 2 ); } else // write as plain Latin-1 { std::string convertedValue; // just precaution (mostly used for plain ascii like numbers, etc) convertedValue.erase(); ReconcileUtils::UTF8ToLatin1( rawvalue.c_str(), rawvalue.size(), &convertedValue ); if ( needDescriptor ) value.append( "\0", 1 ); // BOM, 16-bit zero (empty descriptor) value.append( convertedValue ); value.append( "\0", 1 ); // final zero byte } } // of "not an XMP Priv frame" this->changed = true; this->release(); XMP_StringPtr valueCStr = value.c_str(); this->contentSize = (XMP_Int32) value.size(); XMP_Validate( this->contentSize < 0xA00000, "XMP Property exceeds 20MB in size", kXMPErr_InternalFailure ); content = new char[ this->contentSize ]; memcpy( content , valueCStr , this->contentSize ); } void write(LFA_FileRef file, XMP_Uns8 majorVersion) { // write back size field: if ( majorVersion < 4 ) PutUns32BE( contentSize, &fields[o_size] ); else PutUns32BE( int32ToSynch( contentSize ), &fields[o_size] ); // write out fixed fields LFA_Write( file, this->fields, FIXED_SIZE); // write out contents LFA_Write( file, this->content, contentSize ); } /** * majorVersion must be 3 or 4 * @returns total size of frame */ XMP_Int64 read(LFA_FileRef file, XMP_Uns8 majorVersion ) { XMP_Assert( majorVersion == 3 || majorVersion == 4 ); this->release(); // ensures/allows reuse of 'curFrame' XMP_Int64 start = LFA_Tell( file ); LFA_Read( file, fields, FIXED_SIZE, true ); id = GetUns32BE( &fields[o_id] ); //only padding to come? if (id == 0x00000000) { LFA_Seek( file, -10, SEEK_CUR ); //rewind 10 byte return 0; // zero signals, not a valid frame } //verify id to be valid (4x A-Z and 0-9) XMP_Validate( (( fields[0]>0x40 && fields[0]<0x5B) || ( fields[0]>0x2F && fields[0]<0x3A)) && //A-Z,0-9 (( fields[1]>0x40 && fields[1]<0x5B) || ( fields[1]>0x2F && fields[1]<0x3A)) && (( fields[2]>0x40 && fields[2]<0x5B) || ( fields[2]>0x2F && fields[2]<0x3A)) && (( fields[3]>0x40 && fields[3]<0x5B) || ( fields[3]>0x2F && fields[3]<0x3A)) ,"invalid Frame ID", kXMPErr_BadFileFormat); flags = GetUns16BE( &fields[o_flags] ); XMP_Validate( 0==(flags & 0xEE ),"invalid lower bits in frame flags",kXMPErr_BadFileFormat ); //*** flag handling, spec :429ff aka line 431ff (i.e. Frame should be discarded) // compression and all of that..., unsynchronisation contentSize = ( majorVersion < 4) ? GetUns32BE( &fields[o_size] ) : synchToInt32(GetUns32BE( &fields[o_size] )); XMP_Validate( contentSize >= 0, "negative frame size", kXMPErr_BadFileFormat ); // >20MB in a single frame?, assume broken file XMP_Validate( contentSize < 0xA00000, "single frame exceeds 20MB", kXMPErr_BadFileFormat ); content = new char[ contentSize ]; LFA_Read( file, content, contentSize, true ); XMP_Assert( (LFA_Tell( file ) - start) == FIXED_SIZE + contentSize ); //trivial return LFA_Tell( file ) - start; } /** * two types of COMM frames should be preserved but otherwise ignored * * a 6-field long header just having * encoding(1 byte),lang(3 bytes) and 0x00 31 (no descriptor, "1" as content") * perhaps only used to indicate client language * * COMM frames whose description begins with engiTun, these are iTunes flags * * returns true: job done as expted * false: do not use this frame, but preserve (i.e. iTunes marker COMM frame) */ bool advancePastCOMMDescriptor(XMP_Int32& pos) { if ( (contentSize-pos) <= 3 ) return false; // silent error, no room left behing language tag if ( !CheckBytes( &content[pos], "eng", 3 ) ) return false; // not an error, but leave all non-eng tags alone... pos += 3; // skip lang tag if ( pos >= contentSize ) return false; // silent error // skip past descriptor: while ( pos < contentSize ) if ( content[pos++] == 0x00 ) break; // skip yet-another double zero if applicable if ( (pos 4 ) //there's a content descriptor ( 1 + 3 + zeroTerminator) { std::string descriptor = std::string(&content[4],pos-1); if ( 0 == descriptor.substr(0,4).compare( "iTun" )) // begins with engiTun ? return false; // leave alone, then } return true; //o.k., descriptor skipped, time for the real thing. } /* * returns the frame content as a proper UTF8 string * * w/o the initial encoding byte * * dealing with BOM's * * @returns: by value: character string with the value * as return value: false if frame is "not of intereset" despite a generally * "interesting" frame ID, these are * * iTunes-'marker' COMM frame */ bool getFrameValue( XMP_Uns8 majorVersion, XMP_Uns32 frameID, std::string* utf8string ) { XMP_Assert( contentSize >= 0 ); XMP_Assert( contentSize < 0xA00000 ); // more than 20 MB per Propety would be very odd... XMP_Assert( content != 0 ); if ( contentSize == 0) { utf8string->erase(); return true; // ...it is "of interest", even if empty contents. } XMP_Int32 pos = 0; // going through input string XMP_Uns8 encByte = 0; // WCOP does not have an encoding byte // => for all others: use [0] as EncByte, advance pos if ( frameID != 0x57434F50 ) { encByte = content[0]; pos++; } // mode specific forks (so far only COMM) bool commMode = ( ( frameID == 0x434F4D4D ) || // COMM ( frameID == 0x55534C54 ) // USLT ); switch (encByte) { case 0: //ISO-8859-1, 0-terminated { if (commMode) if (! advancePastCOMMDescriptor( pos )) // do and check result return false; // not a frame of interest! char* localPtr = &content[pos]; size_t localLen = contentSize - pos; ReconcileUtils::Latin1ToUTF8 ( localPtr, localLen, utf8string ); } break; case 1: // Unicode, v2.4: UTF-16 (undetermined Endianess), with BOM, terminated 0x00 00 case 2: // UTF-16BE without BOM, terminated 0x00 00 { std::string tmp(this->content, this->contentSize); if (commMode) if (! advancePastCOMMDescriptor( pos )) // do and check result return false; // not a frame of interest! bool bigEndian = true; // assume for now (if no BOM follows) if ( GetUns16BE(&content[pos]) == 0xFEFF ) { pos += 2; bigEndian = true; } else if ( GetUns16BE(&content[pos]) == 0xFFFE ) { pos += 2; bigEndian = false; } FromUTF16( (UTF16Unit*)&content[pos], (contentSize - pos) / 2, utf8string, bigEndian ); } break; case 3: // UTF-8 unicode, terminated \0 // swallow any BOM, just in case if ( (GetUns32BE(&content[pos]) & 0xFFFFFF00 ) == 0xEFBBBF00 ) pos += 3; if (commMode) if (! advancePastCOMMDescriptor( pos )) // do and check result return false; // not a frame of interest! utf8string->assign( &content[pos], contentSize - pos ); break; default: XMP_Throw ( "unknown text encoding", kXMPErr_BadFileFormat); //COULDDO assume latin-1 or utf-8 as best-effort break; } return true; } ~ID3v2Frame() { this->release(); } void release() { if ( content ) delete content; content = 0; contentSize = 0; } }; // ID3Header class ID3v1Tag { public: // fixed const static XMP_Uns16 o_tag = 0; // must be "TAG" const static XMP_Uns16 o_title = 3; const static XMP_Uns16 o_artist = 33; const static XMP_Uns16 o_album = 63; const static XMP_Uns16 o_year = 93; const static XMP_Uns16 o_comment = 97; const static XMP_Uns16 o_genre = 127; // last by: index, or 255 // optional (ID3v1.1) track number) const static XMP_Uns16 o_zero = 125; //must be zero, for trackNo to be valid const static XMP_Uns16 o_trackNo = 126; //trackNo const static int FIXED_SIZE = 128; /** * @returns returns true, if ID3v1 (or v1.1) exists, otherwise false. // sets XMP properties en route */ bool read( LFA_FileRef file, SXMPMeta* meta ) { if ( LFA_Measure( file ) <= 128 ) // ensure sufficient room return false; LFA_Seek( file, -128, SEEK_END); XMP_Uns32 tagID = LFA_ReadInt32_BE( file ); tagID = tagID & 0xFFFFFF00; // wipe 4th byte if ( tagID != 0x54414700 ) return false; // must be "TAG" LFA_Seek( file, -1, SEEK_CUR ); //rewind 1 ///////////////////////////////////////////////////////// XMP_Uns8 buffer[31]; // nothing is bigger here, than 30 bytes (offsets [0]-[29]) buffer[30]=0; // wipe last byte std::string utf8string; // title ////////////////////////////////////////////////////// LFA_Read( file, buffer, 30, true ); std::string title( (char*) buffer ); //security: guaranteed to 0-terminate after 30 bytes if ( ! title.empty() ) { ReconcileUtils::Latin1ToUTF8 ( title.c_str(), title.size(), &utf8string ); meta->SetLocalizedText( kXMP_NS_DC, "title", "" , "x-default" , utf8string.c_str() ); } // artist ////////////////////////////////////////////////////// LFA_Read( file, buffer, 30, true ); std::string artist( (char*) buffer ); if ( ! artist.empty() ) { ReconcileUtils::Latin1ToUTF8 ( artist.c_str(), artist.size(), &utf8string ); meta->SetProperty( kXMP_NS_DM, "artist", utf8string.c_str() ); } // album ////////////////////////////////////////////////////// LFA_Read( file, buffer, 30, true ); std::string album( (char*) buffer ); if ( ! album.empty() ) { ReconcileUtils::Latin1ToUTF8 ( album.c_str(), album.size(), &utf8string ); meta->SetProperty( kXMP_NS_DM, "album", utf8string.c_str() ); } // year ////////////////////////////////////////////////////// LFA_Read( file, buffer, 4, true ); buffer[4]=0; // ensure 0-term std::string year( (char*) buffer ); if ( ! year.empty() ) { // should be moot for a year, but let's be safe: ReconcileUtils::Latin1ToUTF8 ( year.c_str(), year.size(), &utf8string ); meta->SetProperty( kXMP_NS_XMP, "CreateDate", utf8string.c_str() ); } // comment ////////////////////////////////////////////////////// LFA_Read( file, buffer, 30, true ); std::string comment( (char*) buffer ); if ( ! comment.empty() ) { ReconcileUtils::Latin1ToUTF8 ( comment.c_str(), comment.size(), &utf8string ); meta->SetProperty( kXMP_NS_DM, "logComment", utf8string.c_str() ); } // trackNo (ID3v1.1) ///////////////////////////////////////////// if ( buffer[28] == 0 ) { XMP_Uns8 trackNo = buffer[29]; if ( trackNo > 0 ) // 0 := unset { std::string trackStr; SXMPUtils::ConvertFromInt( trackNo, 0, &trackStr ); meta->SetProperty( kXMP_NS_DM, "trackNumber", trackStr.c_str() ); } } // genre ////////////////////////////////////////////////////// XMP_Uns8 genreNo = LFA_ReadUns8( file ); if ( (genreNo > 0) && (genreNo < 127) ) // 0 := unset, 127 := 'unknown' { meta->SetProperty( kXMP_NS_DM, "genre", Genres[genreNo] ); } return true; // ID3Tag found } void write( LFA_FileRef file, SXMPMeta* meta ) { // move in position (extension if applicable happens by caller) std::string zeros( 128, '\0' ); std::string utf8, latin1; LFA_Seek( file, -128, SEEK_END); LFA_Write( file, zeros.data(), 128 ); // TAG ///////////////////////////////////////////// LFA_Seek( file, -128, SEEK_END); LFA_WriteUns8( file, 'T' ); LFA_WriteUns8( file, 'A' ); LFA_WriteUns8( file, 'G' ); // title ////////////////////////////////////////////////////// if ( meta->GetLocalizedText( kXMP_NS_DC, "title", "", "x-default", 0, &utf8, kXMP_NoOptions )) { LFA_Seek( file, -128 + 3, SEEK_END); ReconcileUtils::UTF8ToLatin1( utf8.c_str(), utf8.size(), &latin1 ); LFA_Write( file, latin1.c_str(), MIN( 30, (XMP_Int32)latin1.size() ) ); } // artist ////////////////////////////////////////////////////// if ( meta->GetProperty( kXMP_NS_DM, "artist", &utf8, kXMP_NoOptions )) { LFA_Seek( file, -128 + 33, SEEK_END); ReconcileUtils::UTF8ToLatin1( utf8.c_str(), utf8.size(), &latin1 ); LFA_Write( file, latin1.c_str(), MIN( 30, (XMP_Int32)latin1.size() ) ); } // album ////////////////////////////////////////////////////// if ( meta->GetProperty( kXMP_NS_DM, "album", &utf8, kXMP_NoOptions )) { LFA_Seek( file, -128 + 63, SEEK_END); ReconcileUtils::UTF8ToLatin1( utf8.c_str(), utf8.size(), &latin1 ); LFA_Write( file, latin1.c_str(), MIN( 30, (XMP_Int32)latin1.size() ) ); } // year ////////////////////////////////////////////////////// if ( meta->GetProperty( kXMP_NS_XMP, "CreateDate", &utf8, kXMP_NoOptions )) { XMP_DateTime dateTime; SXMPUtils::ConvertToDate( utf8, &dateTime ); if ( dateTime.hasDate ) { SXMPUtils::ConvertFromInt ( dateTime.year, "", &latin1 ); LFA_Seek ( file, -128 + 93, SEEK_END ); LFA_Write ( file, latin1.c_str(), MIN ( 4, (XMP_Int32)latin1.size() ) ); } } // comment (write 30 bytes first, see truncation later) //////////// if ( meta->GetProperty( kXMP_NS_DM, "logComment", &utf8, kXMP_NoOptions )) { LFA_Seek ( file, -128 + 97, SEEK_END ); ReconcileUtils::UTF8ToLatin1 ( utf8.c_str(), utf8.size(), &latin1 ); LFA_Write ( file, latin1.c_str(), MIN ( 30, (XMP_Int32)latin1.size() ) ); } // genre //////////////////////////////////////////////////////////////// if ( meta->GetProperty( kXMP_NS_DM, "genre", &utf8, kXMP_NoOptions )) { XMP_Uns8 genreNo = 0; // try to find (case insensitive) match: int i; const char* genreCString = utf8.c_str(); for ( i=0; i < 127; ++i ) { if ( (strlen( genreCString ) == strlen(Genres[i])) && //fixing buggy stricmp behaviour on PPC (stricmp( genreCString, Genres[i] ) == 0 )) { genreNo = i; // found break; } // if } // for LFA_Seek( file, -128 + 127, SEEK_END); LFA_WriteUns8( file, genreNo ); } // trackNo //////////////////////////////////////////////////////////// if ( meta->GetProperty( kXMP_NS_DM, "trackNumber", &utf8, kXMP_NoOptions )) { XMP_Uns8 trackNo = 0; try { trackNo = (XMP_Uns8) SXMPUtils::ConvertToInt( utf8.c_str() ); LFA_Seek( file, -128 + 125, SEEK_END); LFA_WriteUns8( file , 0 ); // ID3v1.1 extension LFA_WriteUns8( file, trackNo ); } catch ( XMP_Error& ) { // forgive, just don't set this one. } } } }; // ID3v1Tag } // namespace ID3_Support #endif // __ID3_Support_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/RIFF.hpp0000664000175000017500000002500612150230673016743 00000000000000#ifndef __RIFF_hpp__ #define __RIFF_hpp__ 1 // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2009 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" // ! This must be the first include. #include #include #include "XMPFiles_Impl.hpp" // ahead declaration: class RIFF_MetaHandler; namespace RIFF { enum ChunkType { chunk_GENERAL, //unknown or not relevant chunk_CONTAINER, chunk_XMP, chunk_VALUE, chunk_JUNK, NO_CHUNK // used as precessor to first chunk, etc. }; // ahead declarations class Chunk; class ContainerChunk; class ValueChunk; class XMPChunk; // (scope: only used in RIFF_Support and RIFF_Handler.cpp // ==> no need to overspecify with lengthy names ) typedef std::vector chunkVect; // coulddo: narrow down toValueChunk (could give trouble with JUNK though) typedef chunkVect::iterator chunkVectIter; // or refactor ?? typedef std::vector containerVect; typedef containerVect::iterator containerVectIter; typedef std::map valueMap; typedef valueMap::iterator valueMapIter; // format chunks+types const XMP_Uns32 kChunk_RIFF = 0x46464952; const XMP_Uns32 kType_AVI_ = 0x20495641; const XMP_Uns32 kType_AVIX = 0x58495641; const XMP_Uns32 kType_WAVE = 0x45564157; const XMP_Uns32 kChunk_JUNK = 0x4B4E554A; const XMP_Uns32 kChunk_JUNQ = 0x514E554A; // other container chunks const XMP_Uns32 kChunk_LIST = 0x5453494C; const XMP_Uns32 kType_INFO = 0x4F464E49; const XMP_Uns32 kType_Tdat = 0x74616454; // other relevant chunks const XMP_Uns32 kChunk_XMP = 0x584D505F; // "_PMX" // relevant for Index Correction // LIST: const XMP_Uns32 kType_hdrl = 0x6C726468; const XMP_Uns32 kType_strl = 0x6C727473; const XMP_Uns32 kChunk_indx = 0x78646E69; const XMP_Uns32 kChunk_ixXX = 0x58587869; const XMP_Uns32 kType_movi = 0x69766F6D; //should occur only in AVI const XMP_Uns32 kChunk_Cr8r = 0x72387243; const XMP_Uns32 kChunk_PrmL = 0x4C6D7250; //should occur only in WAV const XMP_Uns32 kChunk_DISP = 0x50534944; const XMP_Uns32 kChunk_bext = 0x74786562; // LIST/INFO constants const XMP_Uns32 kPropChunkIART = 0x54524149; const XMP_Uns32 kPropChunkICMT = 0x544D4349; const XMP_Uns32 kPropChunkICOP = 0x504F4349; const XMP_Uns32 kPropChunkICRD = 0x44524349; const XMP_Uns32 kPropChunkIENG = 0x474E4549; const XMP_Uns32 kPropChunkIGNR = 0x524E4749; const XMP_Uns32 kPropChunkINAM = 0x4D414E49; const XMP_Uns32 kPropChunkISFT = 0x54465349; const XMP_Uns32 kPropChunkIARL = 0x4C524149; const XMP_Uns32 kPropChunkIMED = 0x44454D49; const XMP_Uns32 kPropChunkISRF = 0x46525349; const XMP_Uns32 kPropChunkICMS = 0x4C524149; const XMP_Uns32 kPropChunkIPRD = 0x534D4349; const XMP_Uns32 kPropChunkISRC = 0x44525049; const XMP_Uns32 kPropChunkITCH = 0x43525349; const XMP_Uns32 kPropChunk_tc_O =0x4F5F6374; const XMP_Uns32 kPropChunk_tc_A =0x415F6374; const XMP_Uns32 kPropChunk_rn_O =0x4F5F6E72; const XMP_Uns32 kPropChunk_rn_A =0x415F6E72; /////////////////////////////////////////////////////////////// enum PropType { // from a simplified, opinionated legacy angle prop_SIMPLE, prop_TIMEVALUE, prop_LOCALIZED_TEXT, prop_ARRAYITEM, // ( here: a solitary one) }; struct Mapping { XMP_Uns32 chunkID; const char* ns; const char* prop; PropType propType; }; // bext Mappings, piece-by-piece: static Mapping bextDescription = { 0, kXMP_NS_BWF, "description", prop_SIMPLE }; static Mapping bextOriginator = { 0, kXMP_NS_BWF, "originator", prop_SIMPLE }; static Mapping bextOriginatorRef = { 0, kXMP_NS_BWF, "originatorReference", prop_SIMPLE }; static Mapping bextOriginationDate = { 0, kXMP_NS_BWF, "originationDate", prop_SIMPLE }; static Mapping bextOriginationTime = { 0, kXMP_NS_BWF, "originationTime", prop_SIMPLE }; static Mapping bextTimeReference = { 0, kXMP_NS_BWF, "timeReference", prop_SIMPLE }; static Mapping bextVersion = { 0, kXMP_NS_BWF, "version", prop_SIMPLE }; static Mapping bextUMID = { 0, kXMP_NS_BWF, "umid", prop_SIMPLE }; static Mapping bextCodingHistory = { 0, kXMP_NS_BWF, "codingHistory", prop_SIMPLE }; // LIST:INFO properties static Mapping listInfoProps[] = { // reconciliations CS4 and before: { kPropChunkIART, kXMP_NS_DM, "artist" , prop_SIMPLE }, { kPropChunkICMT, kXMP_NS_DM, "logComment" , prop_SIMPLE }, { kPropChunkICOP, kXMP_NS_DC, "rights" , prop_LOCALIZED_TEXT }, { kPropChunkICRD, kXMP_NS_XMP, "CreateDate" , prop_SIMPLE }, { kPropChunkIENG, kXMP_NS_DM, "engineer" , prop_SIMPLE }, { kPropChunkIGNR, kXMP_NS_DM, "genre" , prop_SIMPLE }, { kPropChunkINAM, kXMP_NS_DC, "title" , prop_LOCALIZED_TEXT }, // ( was wrongly dc:album in pre-CS4) { kPropChunkISFT, kXMP_NS_XMP, "CreatorTool", prop_SIMPLE }, // RIFF/*/LIST/INFO properties, new in CS5, both AVI and WAV { kPropChunkIMED, kXMP_NS_DC, "source" , prop_SIMPLE }, { kPropChunkISRF, kXMP_NS_DC, "type" , prop_ARRAYITEM }, // TO ENABLE { kPropChunkIARL, kXMP_NS_DC, "subject" , prop_SIMPLE }, // array !! (not x-default language alternative) //{ kPropChunkICMS, to be decided, "" , prop_SIMPLE }, //{ kPropChunkIPRD, to be decided, "" , prop_SIMPLE }, //{ kPropChunkISRC, to be decided, "" , prop_SIMPLE }, //{ kPropChunkITCH, to be decided, "" , prop_SIMPLE }, { 0, 0, 0 } // sentinel }; static Mapping listTdatProps[] = { // reconciliations CS4 and before: { kPropChunk_tc_O, kXMP_NS_DM, "startTimecode" , prop_TIMEVALUE }, // special: must end up in dm:timeValue child { kPropChunk_tc_A, kXMP_NS_DM, "altTimecode" , prop_TIMEVALUE }, // special: must end up in dm:timeValue child { kPropChunk_rn_O, kXMP_NS_DM, "tapeName" , prop_SIMPLE }, { kPropChunk_rn_A, kXMP_NS_DM, "altTapeName" , prop_SIMPLE }, { 0, 0, 0 } // sentinel }; // ================================================================================================= // ImportCr8rItems // =============== #pragma pack ( push, 1 ) struct PrmLBoxContent { XMP_Uns32 magic; XMP_Uns32 size; XMP_Uns16 verAPI; XMP_Uns16 verCode; XMP_Uns32 exportType; XMP_Uns16 MacVRefNum; XMP_Uns32 MacParID; char filePath[260]; }; enum { kExportTypeMovie = 0, kExportTypeStill = 1, kExportTypeAudio = 2, kExportTypeCustom = 3 }; struct Cr8rBoxContent { XMP_Uns32 magic; XMP_Uns32 size; XMP_Uns16 majorVer; XMP_Uns16 minorVer; XMP_Uns32 creatorCode; XMP_Uns32 appleEvent; char fileExt[16]; char appOptions[16]; char appName[32]; }; #pragma pack ( pop ) // static getter, determines appropriate chunkType (peeking)and returns // the respective constructor. It's the caller's responsibility to // delete obtained chunk. Chunk* getChunk ( ContainerChunk* parent, RIFF_MetaHandler* handler ); class Chunk { public: ChunkType chunkType; // set by constructor ContainerChunk* parent; // 0 on top-level XMP_Uns32 id; // the first four bytes, first byte of highest value XMP_Int64 oldSize; // actual chunk size INCLUDING the 8/12 header bytes, XMP_Int64 oldPos; // file position of this chunk // both set as part of changesAndSize() XMP_Int64 newSize; bool hasChange; bool needSizeFix; // used in changesAndSize() only // Constructors /////////////////////// // parsing Chunk( ContainerChunk* parent, RIFF_MetaHandler* handler, bool skip, ChunkType c /*= chunk_GENERAL*/ ); // ad-hoc creation Chunk( ContainerChunk* parent, ChunkType c, XMP_Uns32 id ); /* returns true, if something has changed in chunk (which needs specific write-out, this->newSize is expected to be set by this routine */ virtual void changesAndSize( RIFF_MetaHandler* handler ); virtual std::string toString(XMP_Uns8 level = 0); virtual void write( RIFF_MetaHandler* handler, LFA_FileRef file, bool isMainChunk = false ); virtual ~Chunk(); }; // class Chunk class XMPChunk : public Chunk { public: XMPChunk( ContainerChunk* parent ); XMPChunk( ContainerChunk* parent, RIFF_MetaHandler* handler ); void changesAndSize( RIFF_MetaHandler* handler ); void write( RIFF_MetaHandler* handler, LFA_FileRef file, bool isMainChunk = false ); }; // any chunk, whose value should be stored, e.g. LIST:INFO, LIST:Tdat class ValueChunk : public Chunk { public: std::string oldValue, newValue; // for ad-hoc creation (upon write) ValueChunk( ContainerChunk* parent, std::string value, XMP_Uns32 id ); // for parsing ValueChunk( ContainerChunk* parent, RIFF_MetaHandler* handler ); enum { kNULisOptional = true }; void SetValue( std::string value, bool optionalNUL = false ); void changesAndSize( RIFF_MetaHandler* handler ); void write( RIFF_MetaHandler* handler, LFA_FileRef file, bool isMainChunk = false ); // own destructor not needed. }; // relevant (level 1) JUNQ and JUNK chunks... class JunkChunk : public Chunk { public: // construction JunkChunk( ContainerChunk* parent, XMP_Int64 size ); // parsing JunkChunk( ContainerChunk* parent, RIFF_MetaHandler* handler ); // own destructor not needed. void changesAndSize( RIFF_MetaHandler* handler ); void write( RIFF_MetaHandler* handler, LFA_FileRef file, bool isMainChunk = false ); }; class ContainerChunk : public Chunk { public: XMP_Uns32 containerType; // e.g. kType_INFO as in "LIST:INFO" chunkVect children; // used for cleanup/destruction, ordering... valueMap childmap; // only for efficient *value* access (inside LIST), *not* used for other containers // construct ContainerChunk( ContainerChunk* parent, XMP_Uns32 id, XMP_Uns32 containerType ); // parse ContainerChunk( ContainerChunk* parent, RIFF_MetaHandler* handler ); bool removeValue( XMP_Uns32 id ); /* returns iterator to (first) occurence of this chunk. iterator to the end of the map if chunk pointer is not found */ chunkVectIter getChild( Chunk* needle ); void replaceChildWithJunk( Chunk* child, bool deleteChild = true ); void changesAndSize( RIFF_MetaHandler* handler ); std::string toString(XMP_Uns8 level = 0); void write( RIFF_MetaHandler* handler, LFA_FileRef file, bool isMainChunk = false ); // destroy void release(); // used by destructor and on error in constructor ~ContainerChunk(); }; // class ContainerChunk } // namespace RIFF #endif // __RIFF_hpp__ exempi-2.2.1/source/XMPFiles/FormatSupport/XDCAM_Support.cpp0000664000175000017500000002744512150230673020611 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2008 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XDCAM_Support.hpp" // ================================================================================================= /// \file XDCAM_Support.cpp /// // ================================================================================================= namespace XDCAM_Support { // ================================================================================================= // CreateChildElement // ================== namespace { XML_Node * CreateChildElement ( XML_Node * parent, XMP_StringPtr localName, XMP_StringPtr legacyNS, int indent /* = 0 */ ) { XML_Node * wsNode; XML_Node * childNode = parent->GetNamedElement ( legacyNS, localName ); if ( childNode == 0 ) { // The indenting is a hack, assuming existing 2 spaces per level. wsNode = new XML_Node ( parent, "", kCDataNode ); wsNode->value = " "; // Add 2 spaces to the existing WS before the parent's close tag. parent->content.push_back ( wsNode ); childNode = new XML_Node ( parent, localName, kElemNode ); childNode->ns = parent->ns; childNode->nsPrefixLen = parent->nsPrefixLen; childNode->name.insert ( 0, parent->name, 0, parent->nsPrefixLen ); parent->content.push_back ( childNode ); wsNode = new XML_Node ( parent, "", kCDataNode ); wsNode->value = '\n'; for ( ; indent > 1; --indent ) wsNode->value += " "; // Indent less 1, to "outdent" the parent's close. parent->content.push_back ( wsNode ); } return childNode; } } // ================================================================================================= // XDCAM_Support::GetLegacyMetaData // ================================= bool GetLegacyMetaData ( SXMPMeta * xmpObjPtr, XML_NodePtr rootElem, XMP_StringPtr legacyNS, bool digestFound, std::string& umid ) { bool containsXMP = false; XML_NodePtr legacyContext = 0, legacyProp = 0; // UMID if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DC, "identifier" )) ) { legacyProp = rootElem->GetNamedElement ( legacyNS, "TargetMaterial" ); if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) { XMP_StringPtr legacyValue = legacyProp->GetAttrValue ( "umidRef" ); if ( legacyValue != 0 ) { umid = legacyValue; xmpObjPtr->SetProperty ( kXMP_NS_DC, "identifier", legacyValue, kXMP_DeleteExisting ); containsXMP = true; } } } // Creation date if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_XMP, "CreateDate" )) ) { legacyProp = rootElem->GetNamedElement ( legacyNS, "CreationDate" ); if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) { XMP_StringPtr legacyValue = legacyProp->GetAttrValue ( "value" ); if ( legacyValue != 0 ) { xmpObjPtr->SetProperty ( kXMP_NS_XMP, "CreateDate", legacyValue, kXMP_DeleteExisting ); containsXMP = true; } } } // Modify Date if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_XMP, "ModifyDate" )) ) { legacyProp = rootElem->GetNamedElement ( legacyNS, "LastUpdate" ); if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) { XMP_StringPtr legacyValue = legacyProp->GetAttrValue ( "value" ); if ( legacyValue != 0 ) { xmpObjPtr->SetProperty ( kXMP_NS_XMP, "ModifyDate", legacyValue, kXMP_DeleteExisting ); containsXMP = true; } } } // Metadata Modify Date if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_XMP, "MetadataDate" )) ) { legacyProp = rootElem->GetNamedElement ( legacyNS, "lastUpdate" ); if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) { XMP_StringPtr legacyValue = legacyProp->GetAttrValue ( "value" ); if ( legacyValue != 0 ) { xmpObjPtr->SetProperty ( kXMP_NS_XMP, "MetadataDate", legacyValue, kXMP_DeleteExisting ); containsXMP = true; } } } // Description if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DC, "description" )) ) { legacyProp = rootElem->GetNamedElement ( legacyNS, "Description" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { XMP_StringPtr legacyValue = legacyProp->GetLeafContentValue(); if ( legacyValue != 0 ) { xmpObjPtr->SetLocalizedText ( kXMP_NS_DC, "description", "", "x-default", legacyValue, kXMP_DeleteExisting ); containsXMP = true; } } } legacyContext = rootElem->GetNamedElement ( legacyNS, "VideoFormat" ); if ( legacyContext != 0 ) { // frame size if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DM, "videoFrameSize" )) ) { legacyProp = legacyContext->GetNamedElement ( legacyNS, "VideoLayout" ); if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) { XMP_StringPtr widthValue = legacyProp->GetAttrValue ( "pixel" ); XMP_StringPtr heightValue = legacyProp->GetAttrValue ( "numOfVerticalLine" ); if ( (widthValue != 0) && (heightValue != 0) ) { xmpObjPtr->DeleteProperty ( kXMP_NS_DM, "videoFrameSize" ); xmpObjPtr->SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "w", widthValue ); xmpObjPtr->SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "h", heightValue ); xmpObjPtr->SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "unit", "pixels" ); containsXMP = true; } } } // Aspect ratio if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DM, "videoPixelAspectRatio" )) ) { legacyProp = legacyContext->GetNamedElement ( legacyNS, "VideoLayout" ); if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) { XMP_StringPtr aspectRatio = legacyProp->GetAttrValue ( "aspectRatio" ); if ( aspectRatio != 0 ) { xmpObjPtr->SetProperty ( kXMP_NS_DM, "videoPixelAspectRatio", aspectRatio, kXMP_DeleteExisting ); containsXMP = true; } } } // Frame rate if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DM, "videoFrameRate" )) ) { legacyProp = legacyContext->GetNamedElement ( legacyNS, "VideoFrame" ); if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) { XMP_StringPtr prop = legacyProp->GetAttrValue ( "formatFps" ); if ( prop != 0 ) { xmpObjPtr->SetProperty ( kXMP_NS_DM, "videoFrameRate", prop, kXMP_DeleteExisting ); containsXMP = true; } } } // Video codec if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DM, "videoCompressor" )) ) { legacyProp = legacyContext->GetNamedElement ( legacyNS, "VideoFrame" ); if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) { XMP_StringPtr prop = legacyProp->GetAttrValue ( "videoCodec" ); if ( prop != 0 ) { xmpObjPtr->SetProperty ( kXMP_NS_DM, "videoCompressor", prop, kXMP_DeleteExisting ); containsXMP = true; } } } } // VideoFormat legacyContext = rootElem->GetNamedElement ( legacyNS, "AudioFormat" ); if ( legacyContext != 0 ) { // Audio codec if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DM, "audioCompressor" )) ) { legacyProp = legacyContext->GetNamedElement ( legacyNS, "AudioRecPort" ); if ( (legacyProp != 0) && legacyProp->IsEmptyLeafNode() ) { XMP_StringPtr prop = legacyProp->GetAttrValue ( "audioCodec" ); if ( prop != 0 ) { xmpObjPtr->SetProperty ( kXMP_NS_DM, "audioCompressor", prop, kXMP_DeleteExisting ); containsXMP = true; } } } } // AudioFormat // Duration if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DM, "duration" )) ) { std::string durationFrames, timecodeFPS; legacyProp = rootElem->GetNamedElement ( legacyNS, "Duration" ); if ( legacyProp != 0 ) { XMP_StringPtr durationValue = legacyProp->GetAttrValue ( "value" ); if ( durationValue != 0 ) durationFrames = durationValue; } legacyProp = rootElem->GetNamedElement ( legacyNS, "LtcChangeTable" ); if ( legacyProp != 0 ) { // [TODO] Verify that this is the correct framerate to use from the legacy metadata. gemiller XMP_StringPtr fps = legacyProp->GetAttrValue ( "tcFps" ); if ( fps != 0 ) { timecodeFPS = "1/"; timecodeFPS += fps; } } if ( (!timecodeFPS.empty()) && (!durationFrames.empty())) { xmpObjPtr->DeleteProperty ( kXMP_NS_DM, "duration" ); xmpObjPtr->SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "value", durationFrames ); xmpObjPtr->SetStructField ( kXMP_NS_DM, "duration", kXMP_NS_DM, "scale", timecodeFPS ); containsXMP = true; } } legacyContext = rootElem->GetNamedElement ( legacyNS, "Device" ); if ( legacyContext != 0 ) { std::string model; // manufacturer string XMP_StringPtr manufacturer = legacyContext->GetAttrValue ( "manufacturer" ); if ( manufacturer != 0 ) { model += manufacturer; } // model string XMP_StringPtr modelName = legacyContext->GetAttrValue ( "modelName" ); if ( modelName != 0 ) { if ( model.size() > 0 ) { model += " "; } model += modelName; } // For the dm::cameraModel property, concat the make and model. if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_DM, "cameraModel" )) ) { if ( model.size() != 0 ) { xmpObjPtr->SetProperty ( kXMP_NS_DM, "cameraModel", model, kXMP_DeleteExisting ); containsXMP = true; } } // EXIF Model if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_TIFF, "Model" )) ) { xmpObjPtr->SetProperty ( kXMP_NS_TIFF, "Model", modelName, kXMP_DeleteExisting ); } // EXIF Make if ( digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_TIFF, "Make" )) ) { xmpObjPtr->SetProperty ( kXMP_NS_TIFF, "Make", manufacturer, kXMP_DeleteExisting ); } // EXIF-AUX Serial number XMP_StringPtr serialNumber = legacyContext->GetAttrValue ( "serialNo" ); if ( serialNumber != 0 && (digestFound || (! xmpObjPtr->DoesPropertyExist ( kXMP_NS_EXIF_Aux, "SerialNumber" ))) ) { xmpObjPtr->SetProperty ( kXMP_NS_EXIF_Aux, "SerialNumber", serialNumber, kXMP_DeleteExisting ); } } return containsXMP; } // ================================================================================================= // XDCAM_Support::SetLegacyMetaData // ================================ bool SetLegacyMetaData ( XML_Node * clipMetadata, SXMPMeta * xmpObj, XMP_StringPtr legacyNS ) { bool updateLegacyXML = false; bool xmpFound = false; std::string xmpValue; XML_Node * xmlNode = 0; xmpFound = xmpObj->GetProperty ( kXMP_NS_DC, "title", &xmpValue, 0 ); if ( xmpFound ) { xmlNode = CreateChildElement ( clipMetadata, "Title", legacyNS, 3 ); if ( xmpValue != xmlNode->GetLeafContentValue() ) { xmlNode->SetLeafContentValue ( xmpValue.c_str() ); updateLegacyXML = true; } } xmpFound = xmpObj->GetArrayItem ( kXMP_NS_DC, "creator", 1, &xmpValue, 0 ); if ( xmpFound ) { xmlNode = CreateChildElement ( clipMetadata, "Creator", legacyNS, 3 ); XMP_StringPtr creatorName = xmlNode->GetAttrValue ( "name" ); if ( creatorName == 0 ) creatorName = ""; if ( xmpValue != creatorName ) { xmlNode->SetAttrValue ( "name", xmpValue.c_str() ); updateLegacyXML = true; } } xmpFound = xmpObj->GetProperty ( kXMP_NS_DC, "description", &xmpValue, 0 ); if ( xmpFound ) { xmlNode = CreateChildElement ( clipMetadata, "Description", legacyNS, 3 ); if ( xmpValue != xmlNode->GetLeafContentValue() ) { // description in non real time metadata is limited to 2047 bytes if ( xmpValue.size() > 2047 ) xmpValue.resize ( 2047 ); xmlNode->SetLeafContentValue ( xmpValue.c_str() ); updateLegacyXML = true; } } return updateLegacyXML; } // ================================================================================================= } // namespace XDCAM_Support exempi-2.2.1/source/XMPFiles/WXMPFiles.cpp0000664000175000017500000002203412150230673015137 00000000000000// ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2004 Adobe Systems Incorporated // All Rights Reserved // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= #include "XMP_Environment.h" #include "XMP_Const.h" #include "client-glue/WXMPFiles.hpp" #include "XMPFiles_Impl.hpp" #include "XMPFiles.hpp" #if XMP_WinBuild #if XMP_DebugBuild #pragma warning ( disable : 4297 ) // function assumed not to throw an exception but does #endif #endif #if __cplusplus extern "C" { #endif // ================================================================================================= static WXMP_Result voidResult; // Used for functions that don't use the normal result mechanism. // ================================================================================================= void WXMPFiles_GetVersionInfo_1 ( XMP_VersionInfo * versionInfo ) { WXMP_Result * wResult = &voidResult; // ! Needed to "fool" the EnterWrapper macro. XMP_ENTER_NoLock ( "WXMPFiles_GetVersionInfo_1" ) XMPFiles::GetVersionInfo ( versionInfo ); XMP_EXIT_NoThrow } // ------------------------------------------------------------------------------------------------- void WXMPFiles_Initialize_1 ( XMP_OptionBits options, WXMP_Result * wResult ) { XMP_ENTER_NoLock ( "WXMPFiles_Initialize_1" ) wResult->int32Result = XMPFiles::Initialize ( options ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPFiles_Terminate_1() { WXMP_Result * wResult = &voidResult; // ! Needed to "fool" the EnterWrapper macro. XMP_ENTER_NoLock ( "WXMPFiles_Terminate_1" ) XMPFiles::Terminate(); XMP_EXIT_NoThrow } // ================================================================================================= void WXMPFiles_CTor_1 ( WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPFiles_CTor_1" ) // No lib object yet, use the static entry. XMPFiles * newObj = new XMPFiles(); ++newObj->clientRefs; XMP_Assert ( newObj->clientRefs == 1 ); wResult->ptrResult = newObj; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPFiles_IncrementRefCount_1 ( XMPFilesRef xmpObjRef ) { WXMP_Result * wResult = &voidResult; // ! Needed to "fool" the EnterWrapper macro. XMP_ENTER_ObjWrite ( XMPFiles, "WXMPFiles_IncrementRefCount_1" ) ++thiz->clientRefs; XMP_Assert ( thiz->clientRefs > 0 ); XMP_EXIT_NoThrow } // ------------------------------------------------------------------------------------------------- void WXMPFiles_DecrementRefCount_1 ( XMPFilesRef xmpObjRef ) { WXMP_Result * wResult = &voidResult; // ! Needed to "fool" the EnterWrapper macro. XMP_ENTER_ObjWrite ( XMPFiles, "WXMPFiles_DecrementRefCount_1" ) XMP_Assert ( thiz->clientRefs > 0 ); --thiz->clientRefs; if ( thiz->clientRefs <= 0 ) { objLock.Release(); delete ( thiz ); } XMP_EXIT_NoThrow } // ================================================================================================= void WXMPFiles_GetFormatInfo_1 ( XMP_FileFormat format, XMP_OptionBits * flags, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPFiles_GetFormatInfo_1" ) wResult->int32Result = XMPFiles::GetFormatInfo ( format, flags ); XMP_EXIT } // ================================================================================================= void WXMPFiles_CheckFileFormat_1 ( XMP_StringPtr filePath, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPFiles_CheckFileFormat_1" ) wResult->int32Result = XMPFiles::CheckFileFormat ( filePath ); XMP_EXIT } // ================================================================================================= void WXMPFiles_CheckPackageFormat_1 ( XMP_StringPtr folderPath, WXMP_Result * wResult ) { XMP_ENTER_Static ( "WXMPFiles_CheckPackageFormat_1" ) wResult->int32Result = XMPFiles::CheckPackageFormat ( folderPath ); XMP_EXIT } // ================================================================================================= void WXMPFiles_OpenFile_1 ( XMPFilesRef xmpObjRef, XMP_StringPtr filePath, XMP_FileFormat format, XMP_OptionBits openFlags, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPFiles, "WXMPFiles_OpenFile_1" ) StartPerfCheck ( kAPIPerf_OpenFile, filePath ); bool ok = thiz->OpenFile ( filePath, format, openFlags ); wResult->int32Result = ok; EndPerfCheck ( kAPIPerf_OpenFile ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPFiles_CloseFile_1 ( XMPFilesRef xmpObjRef, XMP_OptionBits closeFlags, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPFiles, "WXMPFiles_CloseFile_1" ) StartPerfCheck ( kAPIPerf_CloseFile, "" ); thiz->CloseFile ( closeFlags ); EndPerfCheck ( kAPIPerf_CloseFile ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPFiles_GetFileInfo_1 ( XMPFilesRef xmpObjRef, void * clientPath, XMP_OptionBits * openFlags, XMP_FileFormat * format, XMP_OptionBits * handlerFlags, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_ObjRead ( XMPFiles, "WXMPFiles_GetFileInfo_1" ) XMP_StringPtr pathStr; XMP_StringLen pathLen; bool isOpen = thiz.GetFileInfo ( &pathStr, &pathLen, openFlags, format, handlerFlags ); if ( isOpen && (clientPath != 0) ) (*SetClientString) ( clientPath, pathStr, pathLen ); wResult->int32Result = isOpen; XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPFiles_SetAbortProc_1 ( XMPFilesRef xmpObjRef, XMP_AbortProc abortProc, void * abortArg, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPFiles, "WXMPFiles_SetAbortProc_1" ) thiz->SetAbortProc ( abortProc, abortArg ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPFiles_GetXMP_1 ( XMPFilesRef xmpObjRef, XMPMetaRef xmpRef, void * clientPacket, XMP_PacketInfo * packetInfo, SetClientStringProc SetClientString, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPFiles, "WXMPFiles_GetXMP_1" ) StartPerfCheck ( kAPIPerf_GetXMP, "" ); bool hasXMP = false; XMP_StringPtr packetStr; XMP_StringLen packetLen; if ( xmpRef == 0 ) { hasXMP = thiz->GetXMP ( 0, &packetStr, &packetLen, packetInfo ); } else { SXMPMeta xmpObj ( xmpRef ); hasXMP = thiz->GetXMP ( &xmpObj, &packetStr, &packetLen, packetInfo ); } if ( hasXMP && (clientPacket != 0) ) (*SetClientString) ( clientPacket, packetStr, packetLen ); wResult->int32Result = hasXMP; EndPerfCheck ( kAPIPerf_GetXMP ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPFiles_PutXMP_1 ( XMPFilesRef xmpObjRef, XMPMetaRef xmpRef, // ! Only one of the XMP object or packet are passed. XMP_StringPtr xmpPacket, XMP_StringLen xmpPacketLen, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPFiles, "WXMPFiles_PutXMP_1" ) StartPerfCheck ( kAPIPerf_PutXMP, "" ); if ( xmpRef != 0 ) { thiz->PutXMP ( xmpRef ); } else { thiz->PutXMP ( xmpPacket, xmpPacketLen ); } EndPerfCheck ( kAPIPerf_PutXMP ); XMP_EXIT } // ------------------------------------------------------------------------------------------------- void WXMPFiles_CanPutXMP_1 ( XMPFilesRef xmpObjRef, XMPMetaRef xmpRef, // ! Only one of the XMP object or packet are passed. XMP_StringPtr xmpPacket, XMP_StringLen xmpPacketLen, WXMP_Result * wResult ) { XMP_ENTER_ObjWrite ( XMPFiles, "WXMPFiles_CanPutXMP_1" ) StartPerfCheck ( kAPIPerf_CanPutXMP, "" ); if ( xmpRef != 0 ) { wResult->int32Result = thiz->CanPutXMP ( xmpRef ); } else { wResult->int32Result = thiz->CanPutXMP ( xmpPacket, xmpPacketLen ); } EndPerfCheck ( kAPIPerf_CanPutXMP ); XMP_EXIT } // ================================================================================================= #if __cplusplus } #endif exempi-2.2.1/source/XMPFiles/Makefile.am0000664000175000017500000000455212150230673014716 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # SUBDIRS = FileHandlers FormatSupport noinst_LTLIBRARIES = libXMPFiles.la INCLUDES = -I$(top_srcdir)/public/include \ -I$(top_srcdir)/public/include/client-glue \ -I$(top_srcdir)/build/ \ -I$(srcdir)/FormatSupport \ -I$(srcdir)/../common/ \ -I$(top_srcdir)/third-party/MD5 AM_CXXFLAGS = -Wno-multichar -Wno-ctor-dtor-privacy \ -funsigned-char -fexceptions -fno-strict-aliasing AM_CPPFLAGS = -Wall\ -D@EXEMPI_PLATFORM_DEF@=1 -DXMP_IMPL=1 -DXMP_ClientBuild=0 \ -D_FILE_OFFSET_BITS=64 -DHAVE_EXPAT_CONFIG_H=1 -DXML_STATIC=1 \ -DDISABLE_QUICKTIME noinst_HEADERS = XMPFiles.hpp XMPFiles_Impl.hpp libXMPFiles_la_SOURCES = WXMPFiles.cpp XMPFiles.cpp \ XMPFiles_Impl.cpp libXMPFiles_la_LIBADD = ./FileHandlers/libxmpfilehandlers.la \ ./FormatSupport/libformatsupport.la #libXMPFiles_la_LDFLAGS = -version-info @LIBXMPCORE_VERSION_INFO@ exempi-2.2.1/source/Makefile.am0000664000175000017500000000307412150230672013264 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # SUBDIRS = common XMPCore XMPFilesexempi-2.2.1/COPYING0000664000175000017500000000331112150230672010755 00000000000000This package is based off Adobe XMP SDK 4.1.1, distributed under the BSD license reproduced thereafter for convenience and available in docs/BSD-License.txt This package is licensed under the same license. The BSD License Copyright (c) 1999 - 2007, Adobe Systems Incorporated All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Adobe Systems Incorporated, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. exempi-2.2.1/README0000664000175000017500000000044212144603625010611 00000000000000exempi is a port of Adobe XMP SDK to work on UNIX and to be build with GNU automake. It includes XMPCore and XMPFiles, libexempi, a C-based API and exempi a command line tool. It is maintained by Hubert Figuiere Homepage: http://libopenraw.freedesktop.org/wiki/Exempi exempi-2.2.1/Makefile.am0000664000175000017500000000326612150230672011767 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # ACLOCAL_AMFLAGS = -I m4 SUBDIRS = third-party source samples exempi DIST_SUBDIRS = build third-party source samples exempi public EXTRA_DIST = autogen.sh exempi-2.2.1/build/0000775000175000017500000000000012163706251011110 500000000000000exempi-2.2.1/build/Makefile.in0000664000175000017500000003550012150231001013056 00000000000000# Makefile.in generated by automake 1.12.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = build DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ld_check_flag.m4 \ $(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXEMPI_AGE = @EXEMPI_AGE@ EXEMPI_CURRENT = @EXEMPI_CURRENT@ EXEMPI_CURRENT_MIN = @EXEMPI_CURRENT_MIN@ EXEMPI_INCLUDE_BASE = @EXEMPI_INCLUDE_BASE@ EXEMPI_MAJOR_VERSION = @EXEMPI_MAJOR_VERSION@ EXEMPI_PLATFORM_DEF = @EXEMPI_PLATFORM_DEF@ EXEMPI_REVISION = @EXEMPI_REVISION@ EXEMPI_VERSION_INFO = @EXEMPI_VERSION_INFO@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VALGRIND = @VALGRIND@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_HEADERS = XMP_BuildInfo.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign build/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign build/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool cscopelist ctags distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: exempi-2.2.1/build/Makefile.am0000664000175000017500000000307012144603625013064 00000000000000# # exempi - Makefile.am # # Copyright (C) 2007 Hubert Figuiere # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1 Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2 Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # 3 Neither the name of the Authors, nor the names of its # contributors may be used to endorse or promote products derived # from this software wit hout specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # noinst_HEADERS=XMP_BuildInfo.hexempi-2.2.1/build/XMP_BuildInfo.h0000664000175000017500000000123611745673651013616 00000000000000#ifndef __XMP_BuildInfo_h__ #define __XMP_BuildInfo_h__ 1 /* // ================================================================================================= // Copyright 2002 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms // of the Adobe license agreement accompanying it. // ================================================================================================= */ #define kXMP_Copyright Copyright (c) 2002, Adobe Systems Incorporated #define kXMP_CopyrightStr "Copyright (c) 2002, Adobe Systems Incorporated" #endif /* __XMP_BuildInfo_h__ */