build+ci: Add project skeleton
Change-Id: I0fc7c71b23a99899f70d683b45cc27967db15beb
diff --git a/.jenkins b/.jenkins
new file mode 100755
index 0000000..674d751
--- /dev/null
+++ b/.jenkins
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+set -e
+
+DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+
+for file in "$DIR"/.jenkins.d/*; do
+ [[ -f $file && -x $file ]] || continue
+ echo "Run: $file"
+ "$file"
+done
diff --git a/.jenkins.d/00-deps.sh b/.jenkins.d/00-deps.sh
new file mode 100755
index 0000000..41b93f0
--- /dev/null
+++ b/.jenkins.d/00-deps.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+set -e
+
+JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+source "$JDIR"/util.sh
+
+set -x
+
+if has OSX $NODE_LABELS; then
+ brew update
+ brew upgrade
+ brew install boost pkg-config cryptopp openssl
+ brew cleanup
+fi
+
+if has Ubuntu $NODE_LABELS; then
+ sudo apt-get -qq update
+ sudo apt-get -qq install build-essential pkg-config libboost-all-dev \
+ libcrypto++-dev libsqlite3-dev libssl-dev
+fi
diff --git a/.jenkins.d/01-ndn-cxx.sh b/.jenkins.d/01-ndn-cxx.sh
new file mode 100755
index 0000000..482c155
--- /dev/null
+++ b/.jenkins.d/01-ndn-cxx.sh
@@ -0,0 +1,44 @@
+#!/usr/bin/env bash
+set -e
+
+JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+source "$JDIR"/util.sh
+
+set -x
+
+pushd "${CACHE_DIR:-/tmp}" >/dev/null
+
+INSTALLED_VERSION=$((cd ndn-cxx && git rev-parse HEAD) 2>/dev/null || echo NONE)
+
+sudo rm -Rf ndn-cxx-latest
+
+git clone --depth 1 git://github.com/named-data/ndn-cxx ndn-cxx-latest
+
+LATEST_VERSION=$((cd ndn-cxx-latest && git rev-parse HEAD) 2>/dev/null || echo UNKNOWN)
+
+if [[ $INSTALLED_VERSION != $LATEST_VERSION ]]; then
+ sudo rm -Rf ndn-cxx
+ mv ndn-cxx-latest ndn-cxx
+ sudo rm -Rf NFD NFD-latest
+else
+ sudo rm -Rf ndn-cxx-latest
+fi
+
+sudo rm -Rf /usr/local/include/ndn-cxx
+sudo rm -f /usr/local/lib/libndn-cxx*
+sudo rm -f /usr/local/lib/pkgconfig/libndn-cxx*
+
+pushd ndn-cxx >/dev/null
+
+./waf -j1 --color=yes configure --enable-shared --disable-static --without-osx-keychain
+./waf -j1 --color=yes build
+sudo ./waf -j1 --color=yes install
+
+popd >/dev/null
+popd >/dev/null
+
+if has Linux $NODE_LABELS; then
+ sudo ldconfig
+elif has FreeBSD $NODE_LABELS; then
+ sudo ldconfig -a
+fi
diff --git a/.jenkins.d/10-build.sh b/.jenkins.d/10-build.sh
new file mode 100755
index 0000000..db41533
--- /dev/null
+++ b/.jenkins.d/10-build.sh
@@ -0,0 +1,44 @@
+#!/usr/bin/env bash
+set -e
+
+JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+source "$JDIR"/util.sh
+
+set -x
+
+git submodule init
+git submodule sync
+git submodule update
+
+# Cleanup
+sudo ./waf -j1 --color=yes distclean
+
+if [[ $JOB_NAME != *"code-coverage" && $JOB_NAME != *"limited-build" ]]; then
+ # Configure/build in optimized mode with tests
+ ./waf -j1 --color=yes configure --with-tests
+ ./waf -j1 --color=yes build
+
+ # Cleanup
+ sudo ./waf -j1 --color=yes distclean
+
+ # Configure/build in optimized mode without tests
+ ./waf -j1 --color=yes configure
+ ./waf -j1 --color=yes build
+
+ # Cleanup
+ sudo ./waf -j1 --color=yes distclean
+fi
+
+# Configure/build in debug mode with tests
+if [[ $JOB_NAME == *"code-coverage" ]]; then
+ COVERAGE="--with-coverage"
+elif ! has OSX-10.9 $NODE_LABELS && ! has OSX-10.11 $NODE_LABELS; then
+ ASAN="--with-sanitizer=address"
+fi
+./waf -j1 --color=yes configure --debug --with-tests $COVERAGE $ASAN
+./waf -j1 --color=yes build
+
+# (tests will be run against debug version)
+
+# Install
+sudo ./waf -j1 --color=yes install
diff --git a/.jenkins.d/20-tests.sh b/.jenkins.d/20-tests.sh
new file mode 100755
index 0000000..18d1c91
--- /dev/null
+++ b/.jenkins.d/20-tests.sh
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+set -e
+
+JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+source "$JDIR"/util.sh
+
+set -x
+
+BOOST_VERSION=$(python -c "import sys; sys.path.append('build/c4che'); import _cache; print(_cache.BOOST_VERSION_NUMBER);")
+
+ut_log_args() {
+ if (( BOOST_VERSION >= 106200 )); then
+ echo --logger=HRF,test_suite,stdout:XML,all,build/xunit-${1:-report}.xml
+ else
+ if [[ -n $XUNIT ]]; then
+ echo --log_level=all $( (( BOOST_VERSION >= 106000 )) && echo -- ) \
+ --log_format2=XML --log_sink2=build/xunit-${1:-report}.xml
+ else
+ echo --log_level=test_suite
+ fi
+ fi
+}
+
+ASAN_OPTIONS="color=always"
+ASAN_OPTIONS+=":detect_leaks=false"
+ASAN_OPTIONS+=":detect_stack_use_after_return=true"
+ASAN_OPTIONS+=":check_initialization_order=true"
+ASAN_OPTIONS+=":strict_init_order=true"
+ASAN_OPTIONS+=":detect_invalid_pointer_pairs=1"
+ASAN_OPTIONS+=":detect_container_overflow=false"
+ASAN_OPTIONS+=":strict_string_checks=true"
+ASAN_OPTIONS+=":strip_path_prefix=${PWD}/"
+export ASAN_OPTIONS
+
+# First run all tests as unprivileged user
+./build/unit-tests $(ut_log_args)
diff --git a/.jenkins.d/30-coverage.sh b/.jenkins.d/30-coverage.sh
new file mode 100755
index 0000000..e629e83
--- /dev/null
+++ b/.jenkins.d/30-coverage.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+set -e
+
+JDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+source "$JDIR"/util.sh
+
+set -x
+
+if [[ $JOB_NAME == *"code-coverage" ]]; then
+ gcovr --object-directory=build \
+ --output=build/coverage.xml \
+ --exclude="$PWD/(tests)" \
+ --root=. \
+ --xml
+
+ # # Generate also a detailed HTML output, but using lcov (slower, but better results)
+ lcov -q -c -d . --no-external -o build/coverage-with-tests.info --rc lcov_branch_coverage=1
+ lcov -q -r build/coverage-with-tests.info "$PWD/tests/*" -o build/coverage.info --rc lcov_branch_coverage=1
+ genhtml build/coverage.info --output-directory build/coverage --legend --rc genhtml_branch_coverage=1
+fi
diff --git a/.jenkins.d/README.md b/.jenkins.d/README.md
new file mode 100644
index 0000000..085e383
--- /dev/null
+++ b/.jenkins.d/README.md
@@ -0,0 +1,34 @@
+CONTINUOUS INTEGRATION SCRIPTS
+==============================
+
+Environment Variables Used in Build Scripts
+-------------------------------------------
+
+- `NODE_LABELS`: the variable defines a list of OS properties. The set values are used by the
+ build scripts to select proper behavior for different OS.
+
+ The list should include at least `[OS_TYPE]`, `[DISTRO_TYPE]`, and `[DISTRO_VERSION]`.
+
+ Possible values for Linux:
+
+ * `[OS_TYPE]`: `Linux`
+ * `[DISTRO_TYPE]`: `Ubuntu`
+ * `[DISTRO_VERSION]`: `Ubuntu-14.04`, `Ubuntu-16.04`
+
+ Possible values for OS X / macOS:
+
+ * `[OS_TYPE]`: `OSX`
+ * `[DISTRO_TYPE]`: `OSX` (can be absent)
+ * `[DISTRO_VERSION]`: `OSX-10.10`, `OSX-10.11`, `OSX-10.12`
+
+- `JOB_NAME`: optional variable to define type of the job. Depending on the defined job type,
+ the build scripts can perform different tasks.
+
+ Possible values:
+
+ * empty: default build process
+ * `code-coverage` (Linux OS is assumed): debug build with tests and code coverage analysis
+ * `limited-build`: only a single debug build with tests
+
+- `CACHE_DIR`: the variable defines a path to folder containing cached files from previous builds,
+ e.g., a compiled version of ndn-cxx library. If not set, `/tmp` is used.
diff --git a/.jenkins.d/util.sh b/.jenkins.d/util.sh
new file mode 100644
index 0000000..a89bc27
--- /dev/null
+++ b/.jenkins.d/util.sh
@@ -0,0 +1,18 @@
+has() {
+ local saved_xtrace
+ [[ $- == *x* ]] && saved_xtrace=-x || saved_xtrace=+x
+ set +x
+
+ local p=$1
+ shift
+ local i ret=1
+ for i in "$@"; do
+ if [[ "${i}" == "${p}" ]]; then
+ ret=0
+ break
+ fi
+ done
+
+ set ${saved_xtrace}
+ return ${ret}
+}
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..76e3ded
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,29 @@
+sudo: required
+language: generic
+env:
+ global:
+ - JOB_NAME=limited-build
+ - BOOST_TEST_COLOR_OUTPUT=true
+matrix:
+ include:
+ - os: linux
+ dist: trusty
+ env:
+ - CXX=g++
+ - NODE_LABELS="Linux Ubuntu Ubuntu-14.04"
+ - os: linux
+ dist: trusty
+ env:
+ - CXX=clang++
+ - NODE_LABELS="Linux Ubuntu Ubuntu-14.04"
+ - os: osx
+ osx_image: xcode8.2
+ env:
+ - CXX=clang++
+ - NODE_LABELS="OSX OSX-10.12"
+notifications:
+ email:
+ on_success: always
+ on_failure: always
+script:
+ - ./.jenkins
diff --git a/.waf-tools/boost.py b/.waf-tools/boost.py
new file mode 100644
index 0000000..9b9395e
--- /dev/null
+++ b/.waf-tools/boost.py
@@ -0,0 +1,518 @@
+#!/usr/bin/env python
+# encoding: utf-8
+#
+# partially based on boost.py written by Gernot Vormayr
+# written by Ruediger Sonderfeld <ruediger@c-plusplus.de>, 2008
+# modified by Bjoern Michaelsen, 2008
+# modified by Luca Fossati, 2008
+# rewritten for waf 1.5.1, Thomas Nagy, 2008
+# rewritten for waf 1.6.2, Sylvain Rouquette, 2011
+
+'''
+
+This is an extra tool, not bundled with the default waf binary.
+To add the boost tool to the waf file:
+$ ./waf-light --tools=compat15,boost
+ or, if you have waf >= 1.6.2
+$ ./waf update --files=boost
+
+When using this tool, the wscript will look like:
+
+ def options(opt):
+ opt.load('compiler_cxx boost')
+
+ def configure(conf):
+ conf.load('compiler_cxx boost')
+ conf.check_boost(lib='system filesystem')
+
+ def build(bld):
+ bld(source='main.cpp', target='app', use='BOOST')
+
+Options are generated, in order to specify the location of boost includes/libraries.
+The `check_boost` configuration function allows to specify the used boost libraries.
+It can also provide default arguments to the --boost-mt command-line arguments.
+Everything will be packaged together in a BOOST component that you can use.
+
+When using MSVC, a lot of compilation flags need to match your BOOST build configuration:
+ - you may have to add /EHsc to your CXXFLAGS or define boost::throw_exception if BOOST_NO_EXCEPTIONS is defined.
+ Errors: C4530
+ - boost libraries will try to be smart and use the (pretty but often not useful) auto-linking feature of MSVC
+ So before calling `conf.check_boost` you might want to disabling by adding
+ conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB']
+ Errors:
+ - boost might also be compiled with /MT, which links the runtime statically.
+ If you have problems with redefined symbols,
+ self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
+ self.env['CXXFLAGS_%s' % var] += ['/MD', '/EHsc']
+Passing `--boost-linkage_autodetect` might help ensuring having a correct linkage in some basic cases.
+
+'''
+
+import sys
+import re
+from waflib import Utils, Logs, Errors
+from waflib.Configure import conf
+from waflib.TaskGen import feature, after_method
+
+BOOST_LIBS = ['/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu',
+ '/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib']
+BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include']
+BOOST_VERSION_FILE = 'boost/version.hpp'
+BOOST_VERSION_CODE = '''
+#include <iostream>
+#include <boost/version.hpp>
+int main() { std::cout << BOOST_LIB_VERSION << ":" << BOOST_VERSION << std::endl; }
+'''
+
+BOOST_ERROR_CODE = '''
+#include <boost/system/error_code.hpp>
+int main() { boost::system::error_code c; }
+'''
+
+PTHREAD_CODE = '''
+#include <pthread.h>
+static void* f(void*) { return 0; }
+int main() {
+ pthread_t th;
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_create(&th, &attr, &f, 0);
+ pthread_join(th, 0);
+ pthread_cleanup_push(0, 0);
+ pthread_cleanup_pop(0);
+ pthread_attr_destroy(&attr);
+}
+'''
+
+BOOST_THREAD_CODE = '''
+#include <boost/thread.hpp>
+int main() { boost::thread t; }
+'''
+
+BOOST_LOG_CODE = '''
+#include <boost/log/trivial.hpp>
+#include <boost/log/utility/setup/console.hpp>
+#include <boost/log/utility/setup/common_attributes.hpp>
+int main() {
+ using namespace boost::log;
+ add_common_attributes();
+ add_console_log(std::clog, keywords::format = "%Message%");
+ BOOST_LOG_TRIVIAL(debug) << "log is working" << std::endl;
+}
+'''
+
+# toolsets from {boost_dir}/tools/build/v2/tools/common.jam
+PLATFORM = Utils.unversioned_sys_platform()
+detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il'
+detect_clang = lambda env: (PLATFORM == 'darwin') and 'clang-darwin' or 'clang'
+detect_mingw = lambda env: (re.search('MinGW', env.CXX[0])) and 'mgw' or 'gcc'
+BOOST_TOOLSETS = {
+ 'borland': 'bcb',
+ 'clang': detect_clang,
+ 'como': 'como',
+ 'cw': 'cw',
+ 'darwin': 'xgcc',
+ 'edg': 'edg',
+ 'g++': detect_mingw,
+ 'gcc': detect_mingw,
+ 'icpc': detect_intel,
+ 'intel': detect_intel,
+ 'kcc': 'kcc',
+ 'kylix': 'bck',
+ 'mipspro': 'mp',
+ 'mingw': 'mgw',
+ 'msvc': 'vc',
+ 'qcc': 'qcc',
+ 'sun': 'sw',
+ 'sunc++': 'sw',
+ 'tru64cxx': 'tru',
+ 'vacpp': 'xlc'
+}
+
+
+def options(opt):
+ opt = opt.add_option_group('Boost Options')
+ opt.add_option('--boost-includes', type='string',
+ default='', dest='boost_includes',
+ help='''path to the directory where the boost includes are,
+ e.g., /path/to/boost_1_55_0/stage/include''')
+ opt.add_option('--boost-libs', type='string',
+ default='', dest='boost_libs',
+ help='''path to the directory where the boost libs are,
+ e.g., path/to/boost_1_55_0/stage/lib''')
+ opt.add_option('--boost-mt', action='store_true',
+ default=False, dest='boost_mt',
+ help='select multi-threaded libraries')
+ opt.add_option('--boost-abi', type='string', default='', dest='boost_abi',
+ help='''select libraries with tags (gd for debug, static is automatically added),
+ see doc Boost, Getting Started, chapter 6.1''')
+ opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect',
+ help="auto-detect boost linkage options (don't get used to it / might break other stuff)")
+ opt.add_option('--boost-toolset', type='string',
+ default='', dest='boost_toolset',
+ help='force a toolset e.g. msvc, vc90, \
+ gcc, mingw, mgw45 (default: auto)')
+ py_version = '%d%d' % (sys.version_info[0], sys.version_info[1])
+ opt.add_option('--boost-python', type='string',
+ default=py_version, dest='boost_python',
+ help='select the lib python with this version \
+ (default: %s)' % py_version)
+
+
+@conf
+def __boost_get_version_file(self, d):
+ if not d:
+ return None
+ dnode = self.root.find_dir(d)
+ if dnode:
+ return dnode.find_node(BOOST_VERSION_FILE)
+ return None
+
+@conf
+def boost_get_version(self, d):
+ """silently retrieve the boost version number"""
+ node = self.__boost_get_version_file(d)
+ if node:
+ try:
+ txt = node.read()
+ except EnvironmentError:
+ Logs.error("Could not read the file %r" % node.abspath())
+ else:
+ re_but1 = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.+)"', re.M)
+ m1 = re_but1.search(txt)
+ re_but2 = re.compile('^#define\\s+BOOST_VERSION\\s+(\\d+)', re.M)
+ m2 = re_but2.search(txt)
+ if m1 and m2:
+ return (m1.group(1), m2.group(1))
+ return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True).split(":")
+
+@conf
+def boost_get_includes(self, *k, **kw):
+ includes = k and k[0] or kw.get('includes', None)
+ if includes and self.__boost_get_version_file(includes):
+ return includes
+ for d in self.environ.get('INCLUDE', '').split(';') + BOOST_INCLUDES:
+ if self.__boost_get_version_file(d):
+ return d
+ if includes:
+ self.end_msg('headers not found in %s' % includes)
+ self.fatal('The configuration failed')
+ else:
+ self.end_msg('headers not found, please provide a --boost-includes argument (see help)')
+ self.fatal('The configuration failed')
+
+
+@conf
+def boost_get_toolset(self, cc):
+ toolset = cc
+ if not cc:
+ build_platform = Utils.unversioned_sys_platform()
+ if build_platform in BOOST_TOOLSETS:
+ cc = build_platform
+ else:
+ cc = self.env.CXX_NAME
+ if cc in BOOST_TOOLSETS:
+ toolset = BOOST_TOOLSETS[cc]
+ return isinstance(toolset, str) and toolset or toolset(self.env)
+
+
+@conf
+def __boost_get_libs_path(self, *k, **kw):
+ ''' return the lib path and all the files in it '''
+ if 'files' in kw:
+ return self.root.find_dir('.'), Utils.to_list(kw['files'])
+ libs = k and k[0] or kw.get('libs', None)
+ if libs:
+ path = self.root.find_dir(libs)
+ files = path.ant_glob('*boost_*')
+ if not libs or not files:
+ for d in self.environ.get('LIB', '').split(';') + BOOST_LIBS:
+ if not d:
+ continue
+ path = self.root.find_dir(d)
+ if path:
+ files = path.ant_glob('*boost_*')
+ if files:
+ break
+ path = self.root.find_dir(d + '64')
+ if path:
+ files = path.ant_glob('*boost_*')
+ if files:
+ break
+ if not path:
+ if libs:
+ self.end_msg('libs not found in %s' % libs)
+ self.fatal('The configuration failed')
+ else:
+ self.end_msg('libs not found, please provide a --boost-libs argument (see help)')
+ self.fatal('The configuration failed')
+
+ self.to_log('Found the boost path in %r with the libraries:' % path)
+ for x in files:
+ self.to_log(' %r' % x)
+ return path, files
+
+@conf
+def boost_get_libs(self, *k, **kw):
+ '''
+ return the lib path and the required libs
+ according to the parameters
+ '''
+ path, files = self.__boost_get_libs_path(**kw)
+ files = sorted(files, key=lambda f: (len(f.name), f.name), reverse=True)
+ toolset = self.boost_get_toolset(kw.get('toolset', ''))
+ toolset_pat = '(-%s[0-9]{0,3})' % toolset
+ version = '-%s' % self.env.BOOST_VERSION
+
+ def find_lib(re_lib, files):
+ for file in files:
+ if re_lib.search(file.name):
+ self.to_log('Found boost lib %s' % file)
+ return file
+ return None
+
+ def format_lib_name(name):
+ if name.startswith('lib') and self.env.CC_NAME != 'msvc':
+ name = name[3:]
+ return name[:name.rfind('.')]
+
+ def match_libs(lib_names, is_static):
+ libs = []
+ lib_names = Utils.to_list(lib_names)
+ if not lib_names:
+ return libs
+ t = []
+ if kw.get('mt', False):
+ t.append('-mt')
+ if kw.get('abi', None):
+ t.append('%s%s' % (is_static and '-s' or '-', kw['abi']))
+ elif is_static:
+ t.append('-s')
+ tags_pat = t and ''.join(t) or ''
+ ext = is_static and self.env.cxxstlib_PATTERN or self.env.cxxshlib_PATTERN
+ ext = ext.partition('%s')[2] # remove '%s' or 'lib%s' from PATTERN
+
+ for lib in lib_names:
+ if lib == 'python':
+ # for instance, with python='27',
+ # accepts '-py27', '-py2', '27' and '2'
+ # but will reject '-py3', '-py26', '26' and '3'
+ tags = '({0})?((-py{2})|(-py{1}(?=[^0-9]))|({2})|({1}(?=[^0-9]))|(?=[^0-9])(?!-py))'.format(tags_pat, kw['python'][0], kw['python'])
+ else:
+ tags = tags_pat
+ # Trying libraries, from most strict match to least one
+ for pattern in ['boost_%s%s%s%s%s$' % (lib, toolset_pat, tags, version, ext),
+ 'boost_%s%s%s%s$' % (lib, tags, version, ext),
+ # Give up trying to find the right version
+ 'boost_%s%s%s%s$' % (lib, toolset_pat, tags, ext),
+ 'boost_%s%s%s$' % (lib, tags, ext),
+ 'boost_%s%s$' % (lib, ext),
+ 'boost_%s' % lib]:
+ self.to_log('Trying pattern %s' % pattern)
+ file = find_lib(re.compile(pattern), files)
+ if file:
+ libs.append(format_lib_name(file.name))
+ break
+ else:
+ self.end_msg('lib %s not found in %s' % (lib, path.abspath()))
+ self.fatal('The configuration failed')
+ return libs
+
+ return path.abspath(), match_libs(kw.get('lib', None), False), match_libs(kw.get('stlib', None), True)
+
+@conf
+def _check_pthread_flag(self, *k, **kw):
+ '''
+ Computes which flags should be added to CXXFLAGS and LINKFLAGS to compile in multi-threading mode
+
+ 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)"
+
+ Based on _BOOST_PTHREAD_FLAG(): https://github.com/tsuna/boost.m4/blob/master/build-aux/boost.m4
+ '''
+
+ var = kw.get('uselib_store', 'BOOST')
+
+ self.start_msg('Checking the flags needed to use pthreads')
+
+ # 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++
+ if Utils.unversioned_sys_platform() == "sunos":
+ # 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"]
+ else:
+ boost_pthread_flags = ["", "-lpthreads", "-Kthread", "-kthread", "-llthread", "-pthread",
+ "-pthreads", "-mthreads", "-lpthread", "--thread-safe", "-mt"]
+
+ for boost_pthread_flag in boost_pthread_flags:
+ try:
+ self.env.stash()
+ self.env['CXXFLAGS_%s' % var] += [boost_pthread_flag]
+ self.env['LINKFLAGS_%s' % var] += [boost_pthread_flag]
+ self.check_cxx(code=PTHREAD_CODE, msg=None, use=var, execute=False)
+
+ self.end_msg(boost_pthread_flag)
+ return
+ except self.errors.ConfigurationError:
+ self.env.revert()
+ self.end_msg('None')
+
+@conf
+def check_boost(self, *k, **kw):
+ """
+ Initialize boost libraries to be used.
+
+ Keywords: you can pass the same parameters as with the command line (without "--boost-").
+ Note that the command line has the priority, and should preferably be used.
+ """
+ if not self.env['CXX']:
+ self.fatal('load a c++ compiler first, conf.load("compiler_cxx")')
+
+ params = {
+ 'lib': k and k[0] or kw.get('lib', None),
+ 'stlib': kw.get('stlib', None)
+ }
+ for key, value in self.options.__dict__.items():
+ if not key.startswith('boost_'):
+ continue
+ key = key[len('boost_'):]
+ params[key] = value and value or kw.get(key, '')
+
+ var = kw.get('uselib_store', 'BOOST')
+
+ self.start_msg('Checking boost includes')
+ self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params)
+ versions = self.boost_get_version(inc)
+ self.env.BOOST_VERSION = versions[0]
+ self.env.BOOST_VERSION_NUMBER = int(versions[1])
+ self.end_msg("%d.%d.%d" % (int(versions[1]) / 100000,
+ int(versions[1]) / 100 % 1000,
+ int(versions[1]) % 100))
+ if Logs.verbose:
+ Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var])
+
+ if not params['lib'] and not params['stlib']:
+ return
+ if 'static' in kw or 'static' in params:
+ Logs.warn('boost: static parameter is deprecated, use stlib instead.')
+ self.start_msg('Checking boost libs')
+ path, libs, stlibs = self.boost_get_libs(**params)
+ self.env['LIBPATH_%s' % var] = [path]
+ self.env['STLIBPATH_%s' % var] = [path]
+ self.env['LIB_%s' % var] = libs
+ self.env['STLIB_%s' % var] = stlibs
+ self.end_msg('ok')
+ if Logs.verbose:
+ Logs.pprint('CYAN', ' path : %s' % path)
+ Logs.pprint('CYAN', ' shared libs : %s' % libs)
+ Logs.pprint('CYAN', ' static libs : %s' % stlibs)
+
+ def has_shlib(lib):
+ return params['lib'] and lib in params['lib']
+ def has_stlib(lib):
+ return params['stlib'] and lib in params['stlib']
+ def has_lib(lib):
+ return has_shlib(lib) or has_stlib(lib)
+ if has_lib('thread'):
+ # not inside try_link to make check visible in the output
+ self._check_pthread_flag(k, kw)
+
+ def try_link():
+ if has_lib('system'):
+ self.check_cxx(fragment=BOOST_ERROR_CODE, use=var, execute=False)
+ if has_lib('thread'):
+ self.check_cxx(fragment=BOOST_THREAD_CODE, use=var, execute=False)
+ if has_lib('log'):
+ if not has_lib('thread'):
+ self.env['DEFINES_%s' % var] += ['BOOST_LOG_NO_THREADS']
+ if has_shlib('log'):
+ self.env['DEFINES_%s' % var] += ['BOOST_LOG_DYN_LINK']
+ self.check_cxx(fragment=BOOST_LOG_CODE, use=var, execute=False)
+
+ if params.get('linkage_autodetect', False):
+ self.start_msg("Attempting to detect boost linkage flags")
+ toolset = self.boost_get_toolset(kw.get('toolset', ''))
+ if toolset in ('vc',):
+ # disable auto-linking feature, causing error LNK1181
+ # because the code wants to be linked against
+ self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
+
+ # if no dlls are present, we guess the .lib files are not stubs
+ has_dlls = False
+ for x in Utils.listdir(path):
+ if x.endswith(self.env.cxxshlib_PATTERN % ''):
+ has_dlls = True
+ break
+ if not has_dlls:
+ self.env['STLIBPATH_%s' % var] = [path]
+ self.env['STLIB_%s' % var] = libs
+ del self.env['LIB_%s' % var]
+ del self.env['LIBPATH_%s' % var]
+
+ # we attempt to play with some known-to-work CXXFLAGS combinations
+ for cxxflags in (['/MD', '/EHsc'], []):
+ self.env.stash()
+ self.env["CXXFLAGS_%s" % var] += cxxflags
+ try:
+ try_link()
+ self.end_msg("ok: winning cxxflags combination: %s" % (self.env["CXXFLAGS_%s" % var]))
+ exc = None
+ break
+ except Errors.ConfigurationError as e:
+ self.env.revert()
+ exc = e
+
+ if exc is not None:
+ self.end_msg("Could not auto-detect boost linking flags combination, you may report it to boost.py author", ex=exc)
+ self.fatal('The configuration failed')
+ else:
+ self.end_msg("Boost linkage flags auto-detection not implemented (needed ?) for this toolchain")
+ self.fatal('The configuration failed')
+ else:
+ self.start_msg('Checking for boost linkage')
+ try:
+ try_link()
+ except Errors.ConfigurationError as e:
+ self.end_msg("Could not link against boost libraries using supplied options")
+ self.fatal('The configuration failed')
+ self.end_msg('ok')
+
+
+@feature('cxx')
+@after_method('apply_link')
+def install_boost(self):
+ if install_boost.done or not Utils.is_win32 or not self.bld.cmd.startswith('install'):
+ return
+ install_boost.done = True
+ inst_to = getattr(self, 'install_path', '${BINDIR}')
+ for lib in self.env.LIB_BOOST:
+ try:
+ file = self.bld.find_file(self.env.cxxshlib_PATTERN % lib, self.env.LIBPATH_BOOST)
+ self.bld.install_files(inst_to, self.bld.root.find_node(file))
+ except:
+ continue
+install_boost.done = False
diff --git a/.waf-tools/coverage.py b/.waf-tools/coverage.py
new file mode 100644
index 0000000..ce92883
--- /dev/null
+++ b/.waf-tools/coverage.py
@@ -0,0 +1,22 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+from waflib import TaskGen, Logs
+
+def options(opt):
+ opt.add_option('--with-coverage', action='store_true', default=False, dest='with_coverage',
+ help='''Set compiler flags for gcc to enable code coverage information''')
+
+def configure(conf):
+ if conf.options.with_coverage:
+ if not conf.options.debug:
+ conf.fatal("Code coverage flags require debug mode compilation (add --debug)")
+ conf.check_cxx(cxxflags=['-fprofile-arcs', '-ftest-coverage', '-fPIC'],
+ linkflags=['-fprofile-arcs'], uselib_store='GCOV', mandatory=True)
+
+@TaskGen.feature('cxx','cc')
+@TaskGen.after('process_source')
+def add_coverage(self):
+ if getattr(self, 'use', ''):
+ self.use += ' GCOV'
+ else:
+ self.use = 'GCOV'
diff --git a/.waf-tools/default-compiler-flags.py b/.waf-tools/default-compiler-flags.py
new file mode 100644
index 0000000..629b8cf
--- /dev/null
+++ b/.waf-tools/default-compiler-flags.py
@@ -0,0 +1,182 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+from waflib import Logs, Configure, Utils
+
+def options(opt):
+ opt.add_option('--debug', '--with-debug', action='store_true', default=False, dest='debug',
+ help='''Compile in debugging mode without optimizations (-O0 or -Og)''')
+
+def configure(conf):
+ cxx = conf.env['CXX_NAME'] # CXX_NAME represents generic name of the compiler
+ if cxx == 'gcc':
+ flags = GccFlags()
+ elif cxx == 'clang':
+ flags = ClangFlags()
+ else:
+ flags = CompilerFlags()
+ Logs.warn('The code has not yet been tested with %s compiler' % cxx)
+
+ areCustomCxxflagsPresent = (len(conf.env.CXXFLAGS) > 0)
+
+ # General flags are always applied (e.g., selecting C++11 mode)
+ generalFlags = flags.getGeneralFlags(conf)
+ conf.add_supported_cxxflags(generalFlags['CXXFLAGS'])
+ conf.add_supported_linkflags(generalFlags['LINKFLAGS'])
+ conf.env.DEFINES += generalFlags['DEFINES']
+
+ # Debug or optimized CXXFLAGS and LINKFLAGS are applied only if the
+ # corresponding environment variables are not set.
+ # DEFINES are always applied.
+ if conf.options.debug:
+ extraFlags = flags.getDebugFlags(conf)
+ if areCustomCxxflagsPresent:
+ missingFlags = [x for x in extraFlags['CXXFLAGS'] if x not in conf.env.CXXFLAGS]
+ if len(missingFlags) > 0:
+ Logs.warn("Selected debug mode, but CXXFLAGS is set to a custom value '%s'"
+ % " ".join(conf.env.CXXFLAGS))
+ Logs.warn("Default flags '%s' are not activated" % " ".join(missingFlags))
+ else:
+ extraFlags = flags.getOptimizedFlags(conf)
+
+ if not areCustomCxxflagsPresent:
+ conf.add_supported_cxxflags(extraFlags['CXXFLAGS'])
+ conf.add_supported_linkflags(extraFlags['LINKFLAGS'])
+
+ conf.env.DEFINES += extraFlags['DEFINES']
+
+@Configure.conf
+def add_supported_cxxflags(self, cxxflags):
+ """
+ Check which cxxflags are supported by compiler and add them to env.CXXFLAGS variable
+ """
+ if len(cxxflags) == 0:
+ return
+
+ self.start_msg('Checking supported CXXFLAGS')
+
+ supportedFlags = []
+ for flag in cxxflags:
+ if self.check_cxx(cxxflags=['-Werror', flag], mandatory=False):
+ supportedFlags += [flag]
+
+ self.end_msg(' '.join(supportedFlags))
+ self.env.prepend_value('CXXFLAGS', supportedFlags)
+
+@Configure.conf
+def add_supported_linkflags(self, linkflags):
+ """
+ Check which linkflags are supported by compiler and add them to env.LINKFLAGS variable
+ """
+ if len(linkflags) == 0:
+ return
+
+ self.start_msg('Checking supported LINKFLAGS')
+
+ supportedFlags = []
+ for flag in linkflags:
+ if self.check_cxx(linkflags=['-Werror', flag], mandatory=False):
+ supportedFlags += [flag]
+
+ self.end_msg(' '.join(supportedFlags))
+ self.env.prepend_value('LINKFLAGS', supportedFlags)
+
+
+class CompilerFlags(object):
+ def getGeneralFlags(self, conf):
+ """Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are always needed"""
+ return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': []}
+
+ def getDebugFlags(self, conf):
+ """Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are needed only in debug mode"""
+ return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': ['_DEBUG']}
+
+ def getOptimizedFlags(self, conf):
+ """Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are needed only in optimized mode"""
+ return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': ['NDEBUG']}
+
+class GccBasicFlags(CompilerFlags):
+ """
+ This class defines basic flags that work for both gcc and clang compilers
+ """
+ def getDebugFlags(self, conf):
+ flags = super(GccBasicFlags, self).getDebugFlags(conf)
+ flags['CXXFLAGS'] += ['-O0',
+ '-g3',
+ '-pedantic',
+ '-Wall',
+ '-Wextra',
+ '-Werror',
+ '-Wno-unused-parameter',
+ '-Wno-error=maybe-uninitialized', # Bug #1615
+ '-Wno-error=deprecated-declarations', # Bug #3795
+ '-Wno-error=unused-local-typedefs',
+ ]
+ return flags
+
+ def getOptimizedFlags(self, conf):
+ flags = super(GccBasicFlags, self).getOptimizedFlags(conf)
+ flags['CXXFLAGS'] += ['-O2',
+ '-g',
+ '-pedantic',
+ '-Wall',
+ '-Wextra',
+ '-Wno-unused-parameter',
+ ]
+ return flags
+
+class GccFlags(GccBasicFlags):
+ def getGeneralFlags(self, conf):
+ flags = super(GccFlags, self).getGeneralFlags(conf)
+ version = tuple(int(i) for i in conf.env['CC_VERSION'])
+ if version < (4, 8, 2):
+ conf.fatal('The version of gcc you are using (%s) is too old.\n' %
+ '.'.join(conf.env['CC_VERSION']) +
+ 'The minimum supported gcc version is 4.8.2.')
+ else:
+ flags['CXXFLAGS'] += ['-std=c++11']
+ return flags
+
+ def getDebugFlags(self, conf):
+ flags = super(GccFlags, self).getDebugFlags(conf)
+ version = tuple(int(i) for i in conf.env['CC_VERSION'])
+ if version < (5, 1, 0):
+ flags['CXXFLAGS'] += ['-Wno-missing-field-initializers']
+ flags['CXXFLAGS'] += ['-Og', # gcc >= 4.8
+ '-fdiagnostics-color', # gcc >= 4.9
+ ]
+ return flags
+
+ def getOptimizedFlags(self, conf):
+ flags = super(GccFlags, self).getOptimizedFlags(conf)
+ version = tuple(int(i) for i in conf.env['CC_VERSION'])
+ if version < (5, 1, 0):
+ flags['CXXFLAGS'] += ['-Wno-missing-field-initializers']
+ flags['CXXFLAGS'] += ['-fdiagnostics-color'] # gcc >= 4.9
+ return flags
+
+class ClangFlags(GccBasicFlags):
+ def getGeneralFlags(self, conf):
+ flags = super(ClangFlags, self).getGeneralFlags(conf)
+ flags['CXXFLAGS'] += ['-std=c++11']
+ if Utils.unversioned_sys_platform() == 'darwin':
+ flags['CXXFLAGS'] += ['-stdlib=libc++']
+ flags['LINKFLAGS'] += ['-stdlib=libc++']
+ return flags
+
+ def getDebugFlags(self, conf):
+ flags = super(ClangFlags, self).getDebugFlags(conf)
+ flags['CXXFLAGS'] += ['-fcolor-diagnostics',
+ '-Wno-unused-local-typedef', # Bugs #2657 and #3209
+ '-Wno-error=unneeded-internal-declaration', # Bug #1588
+ '-Wno-error=deprecated-register',
+ '-Wno-error=keyword-macro', # Bug #3235
+ '-Wno-error=infinite-recursion', # Bug #3358
+ ]
+ return flags
+
+ def getOptimizedFlags(self, conf):
+ flags = super(ClangFlags, self).getOptimizedFlags(conf)
+ flags['CXXFLAGS'] += ['-fcolor-diagnostics',
+ '-Wno-unused-local-typedef', # Bugs #2657 and #3209
+ ]
+ return flags
diff --git a/.waf-tools/doxygen.py b/.waf-tools/doxygen.py
new file mode 100644
index 0000000..6d8066b
--- /dev/null
+++ b/.waf-tools/doxygen.py
@@ -0,0 +1,214 @@
+#! /usr/bin/env python
+# encoding: UTF-8
+# Thomas Nagy 2008-2010 (ita)
+
+"""
+
+Doxygen support
+
+Variables passed to bld():
+* doxyfile -- the Doxyfile to use
+
+When using this tool, the wscript will look like:
+
+ def options(opt):
+ opt.load('doxygen')
+
+ def configure(conf):
+ conf.load('doxygen')
+ # check conf.env.DOXYGEN, if it is mandatory
+
+ def build(bld):
+ if bld.env.DOXYGEN:
+ bld(features="doxygen", doxyfile='Doxyfile', ...)
+
+ def doxygen(bld):
+ if bld.env.DOXYGEN:
+ bld(features="doxygen", doxyfile='Doxyfile', ...)
+"""
+
+from fnmatch import fnmatchcase
+import os, os.path, re, stat
+from waflib import Task, Utils, Node, Logs, Errors, Build
+from waflib.TaskGen import feature
+
+DOXY_STR = '"${DOXYGEN}" - '
+DOXY_FMTS = 'html latex man rft xml'.split()
+DOXY_FILE_PATTERNS = '*.' + ' *.'.join('''
+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 f90c cc cxx cpp c++ java ii ixx ipp i++ inl h hh hxx
+'''.split())
+
+re_rl = re.compile('\\\\\r*\n', re.MULTILINE)
+re_nl = re.compile('\r*\n', re.M)
+def parse_doxy(txt):
+ tbl = {}
+ txt = re_rl.sub('', txt)
+ lines = re_nl.split(txt)
+ for x in lines:
+ x = x.strip()
+ if not x or x.startswith('#') or x.find('=') < 0:
+ continue
+ if x.find('+=') >= 0:
+ tmp = x.split('+=')
+ key = tmp[0].strip()
+ if key in tbl:
+ tbl[key] += ' ' + '+='.join(tmp[1:]).strip()
+ else:
+ tbl[key] = '+='.join(tmp[1:]).strip()
+ else:
+ tmp = x.split('=')
+ tbl[tmp[0].strip()] = '='.join(tmp[1:]).strip()
+ return tbl
+
+class doxygen(Task.Task):
+ vars = ['DOXYGEN', 'DOXYFLAGS']
+ color = 'BLUE'
+
+ def runnable_status(self):
+ '''
+ self.pars are populated in runnable_status - because this function is being
+ run *before* both self.pars "consumers" - scan() and run()
+
+ set output_dir (node) for the output
+ '''
+
+ for x in self.run_after:
+ if not x.hasrun:
+ return Task.ASK_LATER
+
+ if not getattr(self, 'pars', None):
+ txt = self.inputs[0].read()
+ self.pars = parse_doxy(txt)
+ if not self.pars.get('OUTPUT_DIRECTORY'):
+ self.pars['OUTPUT_DIRECTORY'] = self.inputs[0].parent.get_bld().abspath()
+
+ # Override with any parameters passed to the task generator
+ if getattr(self.generator, 'pars', None):
+ for k, v in self.generator.pars.items():
+ self.pars[k] = v
+
+ self.doxy_inputs = getattr(self, 'doxy_inputs', [])
+ if not self.pars.get('INPUT'):
+ self.doxy_inputs.append(self.inputs[0].parent)
+ else:
+ for i in self.pars.get('INPUT').split():
+ if os.path.isabs(i):
+ node = self.generator.bld.root.find_node(i)
+ else:
+ node = self.generator.path.find_node(i)
+ if not node:
+ self.generator.bld.fatal('Could not find the doxygen input %r' % i)
+ self.doxy_inputs.append(node)
+
+ if not getattr(self, 'output_dir', None):
+ bld = self.generator.bld
+ # First try to find an absolute path, then find or declare a relative path
+ self.output_dir = bld.root.find_dir(self.pars['OUTPUT_DIRECTORY'])
+ if not self.output_dir:
+ self.output_dir = bld.path.find_or_declare(self.pars['OUTPUT_DIRECTORY'])
+
+ self.signature()
+ return Task.Task.runnable_status(self)
+
+ def scan(self):
+ exclude_patterns = self.pars.get('EXCLUDE_PATTERNS','').split()
+ file_patterns = self.pars.get('FILE_PATTERNS','').split()
+ if not file_patterns:
+ file_patterns = DOXY_FILE_PATTERNS
+ if self.pars.get('RECURSIVE') == 'YES':
+ file_patterns = ["**/%s" % pattern for pattern in file_patterns]
+ nodes = []
+ names = []
+ for node in self.doxy_inputs:
+ if os.path.isdir(node.abspath()):
+ for m in node.ant_glob(incl=file_patterns, excl=exclude_patterns):
+ nodes.append(m)
+ else:
+ nodes.append(node)
+ return (nodes, names)
+
+ def run(self):
+ dct = self.pars.copy()
+ dct['INPUT'] = ' '.join(['"%s"' % x.abspath() for x in self.doxy_inputs])
+ code = '\n'.join(['%s = %s' % (x, dct[x]) for x in self.pars])
+ code = code.encode() # for python 3
+ #fmt = DOXY_STR % (self.inputs[0].parent.abspath())
+ cmd = Utils.subst_vars(DOXY_STR, self.env)
+ env = self.env.env or None
+ proc = Utils.subprocess.Popen(cmd, shell=True, stdin=Utils.subprocess.PIPE, env=env, cwd=self.generator.bld.path.get_bld().abspath())
+ proc.communicate(code)
+ return proc.returncode
+
+ def post_run(self):
+ nodes = self.output_dir.ant_glob('**/*', quiet=True)
+ for x in nodes:
+ x.sig = Utils.h_file(x.abspath())
+ self.outputs += nodes
+ return Task.Task.post_run(self)
+
+class tar(Task.Task):
+ "quick tar creation"
+ run_str = '${TAR} ${TAROPTS} ${TGT} ${SRC}'
+ color = 'RED'
+ after = ['doxygen']
+ def runnable_status(self):
+ for x in getattr(self, 'input_tasks', []):
+ if not x.hasrun:
+ return Task.ASK_LATER
+
+ if not getattr(self, 'tar_done_adding', None):
+ # execute this only once
+ self.tar_done_adding = True
+ for x in getattr(self, 'input_tasks', []):
+ self.set_inputs(x.outputs)
+ if not self.inputs:
+ return Task.SKIP_ME
+ return Task.Task.runnable_status(self)
+
+ def __str__(self):
+ tgt_str = ' '.join([a.nice_path(self.env) for a in self.outputs])
+ return '%s: %s\n' % (self.__class__.__name__, tgt_str)
+
+@feature('doxygen')
+def process_doxy(self):
+ if not getattr(self, 'doxyfile', None):
+ self.generator.bld.fatal('no doxyfile??')
+
+ node = self.doxyfile
+ if not isinstance(node, Node.Node):
+ node = self.path.find_resource(node)
+ if not node:
+ raise ValueError('doxygen file not found')
+
+ # the task instance
+ dsk = self.create_task('doxygen', node)
+
+ if getattr(self, 'doxy_tar', None):
+ tsk = self.create_task('tar')
+ tsk.input_tasks = [dsk]
+ tsk.set_outputs(self.path.find_or_declare(self.doxy_tar))
+ if self.doxy_tar.endswith('bz2'):
+ tsk.env['TAROPTS'] = ['cjf']
+ elif self.doxy_tar.endswith('gz'):
+ tsk.env['TAROPTS'] = ['czf']
+ else:
+ tsk.env['TAROPTS'] = ['cf']
+
+def configure(conf):
+ '''
+ Check if doxygen and tar commands are present in the system
+
+ If the commands are present, then conf.env.DOXYGEN and conf.env.TAR
+ variables will be set. Detection can be controlled by setting DOXYGEN and
+ TAR environmental variables.
+ '''
+
+ conf.find_program('doxygen', var='DOXYGEN', mandatory=False)
+ conf.find_program('tar', var='TAR', mandatory=False)
+
+# doxygen docs
+from waflib.Build import BuildContext
+class doxy(BuildContext):
+ cmd = "doxygen"
+ fun = "doxygen"
diff --git a/.waf-tools/sanitizers.py b/.waf-tools/sanitizers.py
new file mode 100644
index 0000000..a8fe55d
--- /dev/null
+++ b/.waf-tools/sanitizers.py
@@ -0,0 +1,22 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+def options(opt):
+ opt.add_option('--with-sanitizer', action='store', default='', dest='sanitizers',
+ help='Comma-separated list of compiler sanitizers to enable [default=none]')
+
+def configure(conf):
+ for san in conf.options.sanitizers.split(','):
+ if not san:
+ continue
+
+ sanflag = '-fsanitize=%s' % san
+ conf.start_msg('Checking if compiler supports %s' % sanflag)
+
+ if conf.check_cxx(cxxflags=['-Werror', sanflag, '-fno-omit-frame-pointer'],
+ linkflags=[sanflag], mandatory=False):
+ conf.end_msg('yes')
+ conf.env.append_unique('CXXFLAGS', [sanflag, '-fno-omit-frame-pointer'])
+ conf.env.append_unique('LINKFLAGS', [sanflag])
+ else:
+ conf.end_msg('no', color='RED')
+ conf.fatal('%s sanitizer is not supported by the current compiler' % san)
diff --git a/.waf-tools/sphinx_build.py b/.waf-tools/sphinx_build.py
new file mode 100644
index 0000000..e61da6e
--- /dev/null
+++ b/.waf-tools/sphinx_build.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+# encoding: utf-8
+
+# inspired by code by Hans-Martin von Gaudecker, 2012
+
+import os
+from waflib import Node, Task, TaskGen, Errors, Logs, Build, Utils
+
+class sphinx_build(Task.Task):
+ color = 'BLUE'
+ run_str = '${SPHINX_BUILD} -D ${VERSION} -D ${RELEASE} -q -b ${BUILDERNAME} -d ${DOCTREEDIR} ${SRCDIR} ${OUTDIR}'
+
+ def __str__(self):
+ env = self.env
+ src_str = ' '.join([a.path_from(a.ctx.launch_node()) for a in self.inputs])
+ tgt_str = ' '.join([a.path_from(a.ctx.launch_node()) for a in self.outputs])
+ if self.outputs: sep = ' -> '
+ else: sep = ''
+ return'%s [%s]: %s%s%s\n'%(self.__class__.__name__.replace('_task',''),
+ self.env['BUILDERNAME'], src_str, sep, tgt_str)
+
+@TaskGen.extension('.py', '.rst')
+def sig_hook(self, node):
+ node.sig=Utils.h_file(node.abspath())
+
+@TaskGen.feature("sphinx")
+@TaskGen.before_method("process_source")
+def apply_sphinx(self):
+ """Set up the task generator with a Sphinx instance and create a task."""
+
+ inputs = []
+ for i in Utils.to_list(self.source):
+ if not isinstance(i, Node.Node):
+ node = self.path.find_node(node)
+ else:
+ node = i
+ if not node:
+ raise ValueError('[%s] file not found' % i)
+ inputs.append(node)
+
+ task = self.create_task('sphinx_build', inputs)
+
+ conf = self.path.find_node(self.config)
+ task.inputs.append(conf)
+
+ confdir = conf.parent.abspath()
+ buildername = getattr(self, "builder", "html")
+ srcdir = getattr(self, "srcdir", confdir)
+ outdir = self.path.find_or_declare(getattr(self, "outdir", buildername)).get_bld()
+ doctreedir = getattr(self, "doctreedir", os.path.join(outdir.abspath(), ".doctrees"))
+
+ task.env['BUILDERNAME'] = buildername
+ task.env['SRCDIR'] = srcdir
+ task.env['DOCTREEDIR'] = doctreedir
+ task.env['OUTDIR'] = outdir.abspath()
+ task.env['VERSION'] = "version=%s" % self.VERSION
+ task.env['RELEASE'] = "release=%s" % self.VERSION
+
+ import imp
+ confData = imp.load_source('sphinx_conf', conf.abspath())
+
+ if buildername == "man":
+ for i in confData.man_pages:
+ target = outdir.find_or_declare('%s.%d' % (i[1], i[4]))
+ task.outputs.append(target)
+
+ if self.install_path:
+ self.bld.install_files("%s/man%d/" % (self.install_path, i[4]), target)
+ else:
+ task.outputs.append(outdir)
+
+def configure(conf):
+ conf.find_program('sphinx-build', var='SPHINX_BUILD', mandatory=False)
+
+# sphinx docs
+from waflib.Build import BuildContext
+class sphinx(BuildContext):
+ cmd = "sphinx"
+ fun = "sphinx"
diff --git a/.waf-tools/sqlite3.py b/.waf-tools/sqlite3.py
new file mode 100644
index 0000000..3d4e46e
--- /dev/null
+++ b/.waf-tools/sqlite3.py
@@ -0,0 +1,38 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+from waflib import Options, Logs
+from waflib.Configure import conf
+
+def options(opt):
+ opt.add_option('--with-sqlite3', type='string', default=None,
+ dest='with_sqlite3', help='''Path to SQLite3, e.g., /usr/local''')
+
+@conf
+def check_sqlite3(self, *k, **kw):
+ root = k and k[0] or kw.get('path', None) or Options.options.with_sqlite3
+ mandatory = kw.get('mandatory', True)
+ var = kw.get('uselib_store', 'SQLITE3')
+
+ if root:
+ self.check_cxx(lib='sqlite3',
+ msg='Checking for SQLite3 library',
+ define_name='HAVE_%s' % var,
+ uselib_store=var,
+ mandatory=mandatory,
+ includes="%s/include" % root,
+ libpath="%s/lib" % root)
+ else:
+ try:
+ self.check_cfg(package='sqlite3',
+ args=['--cflags', '--libs'],
+ global_define=True,
+ define_name='HAVE_%s' % var,
+ uselib_store='SQLITE3',
+ mandatory=True)
+ except:
+ self.check_cxx(lib='sqlite3',
+ msg='Checking for SQLite3 library',
+ define_name='HAVE_%s' % var,
+ uselib_store=var,
+ mandatory=mandatory)
diff --git a/AUTHORS.md b/AUTHORS.md
new file mode 100644
index 0000000..42052b0
--- /dev/null
+++ b/AUTHORS.md
@@ -0,0 +1,14 @@
+ndncert authors
+===============
+
+## The primary authors are (and/or have been):
+
+* Zhiyi Zhang <http://irl.cs.ucla.edu/~zhiyi/>
+* Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+* Lixia Zhang <http://web.cs.ucla.edu/~lixia/>
+
+## All project authors and contributors
+
+The following is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS,
+people who have reported bugs, submitted patches, and implemented new features
+in the library:
diff --git a/COPYING.md b/COPYING.md
new file mode 100644
index 0000000..ff81c83
--- /dev/null
+++ b/COPYING.md
@@ -0,0 +1,701 @@
+ndncert is licensed under conditions of GNU General Public License version 3 or later.
+
+ndncert relies on third-party software and libraries, licensed under the following licenses:
+
+- ndn-cxx library is licensed under conditions of
+ [GNU Lesser General Public License version 3](https://github.com/named-data/ndn-cxx/blob/master/COPYING.md).
+
+- Boost libraries licensed under conditions of
+ [Boost Software License 1.0](http://www.boost.org/users/license.html)
+
+- CryptoPP library is licensed under conditions of
+ [Boost Software License 1.0](http://www.boost.org/users/license.html)
+
+- SQLite is in [public domain](http://www.sqlite.org/copyright.html)
+
+- waf build system is licensed under conditions of
+ [BSD license](https://github.com/named-data/ndn-cxx/blob/master/waf)
+
+The GPL license is provided below in this file. For more information about these licenses, see
+http://www.gnu.org/licenses/
+
+
+----------------------------------------------------------------------------------
+
+GNU GENERAL PUBLIC LICENSE
+==========================
+Version 3, 29 June 2007
+=======================
+
+> Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+# Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+# TERMS AND CONDITIONS
+
+## 0. Definitions.
+
+ _"This License"_ refers to version 3 of the GNU General Public License.
+
+ _"Copyright"_ also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ _"The Program"_ refers to any copyrightable work licensed under this
+License. Each licensee is addressed as _"you"_. _"Licensees"_ and
+"recipients" may be individuals or organizations.
+
+ To _"modify"_ a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a _"modified version"_ of the
+earlier work or a work _"based on"_ the earlier work.
+
+ A _"covered work"_ means either the unmodified Program or a work based
+on the Program.
+
+ To _"propagate"_ a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To _"convey"_ a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+## 1. Source Code.
+
+ The _"source code"_ for a work means the preferred form of the work
+for making modifications to it. _"Object code"_ means any non-source
+form of a work.
+
+ A _"Standard Interface"_ means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The _"System Libraries"_ of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The _"Corresponding Source"_ for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+## 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+## 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+## 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+## 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+## 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A _"User Product"_ is either (1) a _"consumer product"_, which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ _"Installation Information"_ for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+## 7. Additional Terms.
+
+ _"Additional permissions"_ are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+## 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+## 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+## 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An _"entity transaction"_ is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+## 11. Patents.
+
+ A _"contributor"_ is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's _"essential patent claims"_ are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+## 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+## 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+## 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+## 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+## 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+## 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+# END OF TERMS AND CONDITIONS
+--------------------------------------------------------------------------
+
+
+# How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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 <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type 'show c' for details.
+
+ The hypothetical commands _'show w'_ and _'show c'_ should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/src/logging.hpp b/src/logging.hpp
new file mode 100644
index 0000000..24b8c3f
--- /dev/null
+++ b/src/logging.hpp
@@ -0,0 +1,40 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2017, Regents of the University of California.
+ *
+ * This file is part of ndncert, a certificate management system based on NDN.
+ *
+ * ndncert 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.
+ *
+ * ndncert 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 copies of the GNU General Public License along with
+ * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndncert authors and contributors.
+ */
+
+#ifndef NDNCERT_LOGGING_HPP
+#define NDNCERT_LOGGING_HPP
+
+#include <ndn-cxx/util/logger.hpp>
+
+namespace ndn {
+namespace ndncert {
+
+#define _LOG_INIT(name) NDN_LOG_INIT(ndncert.name)
+
+#define _LOG_DEBUG(x) NDN_LOG_DEBUG(__FILE__ << ":" << __LINE__ << ":" << " " << x)
+
+#define _LOG_TRACE(x) NDN_LOG_TRACE(__FILE__ << ":" << __LINE__ << ":" << " " << x)
+
+#define _LOG_ERROR(x) NDN_LOG_ERROR(x)
+
+} // ndncert
+} // ndn
+
+#endif // NDNCERT_LOGGING_HPP
diff --git a/src/ndncert-common.hpp b/src/ndncert-common.hpp
new file mode 100644
index 0000000..6e93164
--- /dev/null
+++ b/src/ndncert-common.hpp
@@ -0,0 +1,97 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2017, Regents of the University of California.
+ *
+ * This file is part of ndncert, a certificate management system based on NDN.
+ *
+ * ndncert 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.
+ *
+ * ndncert 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 copies of the GNU General Public License along with
+ * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndncert authors and contributors.
+ */
+
+#ifndef NDNCERT_COMMON_HPP
+#define NDNCERT_COMMON_HPP
+
+#include "ndncert-config.hpp"
+
+#ifdef WITH_TESTS
+#define VIRTUAL_WITH_TESTS virtual
+#define PUBLIC_WITH_TESTS_ELSE_PROTECTED public
+#define PUBLIC_WITH_TESTS_ELSE_PRIVATE public
+#define PROTECTED_WITH_TESTS_ELSE_PRIVATE protected
+#else
+#define VIRTUAL_WITH_TESTS
+#define PUBLIC_WITH_TESTS_ELSE_PROTECTED protected
+#define PUBLIC_WITH_TESTS_ELSE_PRIVATE private
+#define PROTECTED_WITH_TESTS_ELSE_PRIVATE private
+#endif
+
+#include <cstddef>
+#include <cstdint>
+#include <functional>
+#include <list>
+#include <map>
+#include <memory>
+#include <set>
+#include <string>
+#include <unordered_map>
+#include <utility>
+
+#include <ndn-cxx/interest.hpp>
+#include <ndn-cxx/data.hpp>
+#include <ndn-cxx/name.hpp>
+#include <ndn-cxx/encoding/block.hpp>
+#include <ndn-cxx/lp/nack.hpp>
+#include <ndn-cxx/util/backports.hpp>
+#include <ndn-cxx/util/face-uri.hpp>
+#include <ndn-cxx/util/signal.hpp>
+#include <ndn-cxx/security/v2/key-chain.hpp>
+#include <ndn-cxx/security/validator.hpp>
+#include <ndn-cxx/security/v2/certificate.hpp>
+
+#include <boost/algorithm/string.hpp>
+#include <boost/assert.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/property_tree/info_parser.hpp>
+#include <boost/throw_exception.hpp>
+
+namespace ndn {
+namespace ndncert {
+
+using std::size_t;
+
+using boost::noncopyable;
+
+using std::shared_ptr;
+using std::unique_ptr;
+using std::weak_ptr;
+using std::make_shared;
+using ndn::make_unique;
+using std::enable_shared_from_this;
+
+using std::function;
+using std::bind;
+
+using ndn::Interest;
+using ndn::Data;
+using ndn::Name;
+using ndn::PartialName;
+using ndn::Block;
+using ndn::time::system_clock;
+using ndn::time::toUnixTimestamp;
+
+} // namespace ndncert
+} // namespace ndn
+
+#endif // NDNCERT_COMMON_HPP
diff --git a/tests/boost-multi-log-formatter.hpp b/tests/boost-multi-log-formatter.hpp
new file mode 100644
index 0000000..ae37416
--- /dev/null
+++ b/tests/boost-multi-log-formatter.hpp
@@ -0,0 +1,214 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2015 Regents of the University of California.
+ *
+ * Based on work by Martin Ba (http://stackoverflow.com/a/26718189)
+ *
+ * This file is distributed under the Boost Software License, Version 1.0.
+ * (See http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef NDN_TESTS_BOOST_MULTI_LOG_FORMATTER_HPP
+#define NDN_TESTS_BOOST_MULTI_LOG_FORMATTER_HPP
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 105900
+#include <boost/test/unit_test_parameters.hpp>
+#else
+#include <boost/test/detail/unit_test_parameters.hpp>
+#endif // BOOST_VERSION >= 105900
+
+#include <boost/test/unit_test_log_formatter.hpp>
+#include <boost/test/output/compiler_log_formatter.hpp>
+#include <boost/test/output/xml_log_formatter.hpp>
+
+namespace boost {
+namespace unit_test {
+namespace output {
+
+/**
+ * @brief Log formatter for Boost.Test that outputs the logging to multiple formatters
+ *
+ * The log formatter is designed to output to one or multiple formatters at the same time. For
+ * example, one HRF formatter can output to the standard output, while XML formatter output to
+ * the file.
+ *
+ * Usage:
+ *
+ * // Call in init_unit_test_suite: (this will override the --log_format parameter)
+ * auto formatter = new boost::unit_test::output::multi_log_formatter; // same as already configured logger
+ *
+ * // Prepare and add additional logger(s)
+ * formatter.add(std::make_shared<boost::unit_test::output::xml_log_formatter>(),
+ * std::make_shared<std::ofstream>("out.xml"));
+ *
+ * boost::unit_test::unit_test_log.set_formatter(formatter);
+ *
+ * @note Calling `boost::unit_test::unit_test_log.set_stream(...)` will change the stream for
+ * the original logger.
+ */
+class multi_log_formatter : public unit_test_log_formatter
+{
+public:
+ /**
+ * @brief Create instance of the logger, based on the configured logger instance
+ */
+ multi_log_formatter()
+ {
+ auto format =
+#if BOOST_VERSION > 105900
+ runtime_config::get<output_format>(runtime_config::LOG_FORMAT);
+#else
+ runtime_config::log_format();
+#endif // BOOST_VERSION > 105900
+
+ switch (format) {
+ default:
+#if BOOST_VERSION >= 105900
+ case OF_CLF:
+#else
+ case CLF:
+#endif // BOOST_VERSION >= 105900
+ m_loggers.push_back({std::make_shared<compiler_log_formatter>(), nullptr});
+ break;
+#if BOOST_VERSION >= 105900
+ case OF_XML:
+#else
+ case XML:
+#endif // BOOST_VERSION >= 105900
+ m_loggers.push_back({std::make_shared<xml_log_formatter>(), nullptr});
+ break;
+ }
+ }
+
+ void
+ add(std::shared_ptr<unit_test_log_formatter> formatter, std::shared_ptr<std::ostream> os)
+ {
+ m_loggers.push_back({formatter, os});
+ }
+
+ // Formatter interface
+ void
+ log_start(std::ostream& os, counter_t test_cases_amount)
+ {
+ for (auto& l : m_loggers)
+ l.logger->log_start(l.os == nullptr ? os : *l.os, test_cases_amount);
+ }
+
+ void
+ log_finish(std::ostream& os)
+ {
+ for (auto& l : m_loggers)
+ l.logger->log_finish(l.os == nullptr ? os : *l.os);
+ }
+
+ void
+ log_build_info(std::ostream& os)
+ {
+ for (auto& l : m_loggers)
+ l.logger->log_build_info(l.os == nullptr ? os : *l.os);
+ }
+
+ void
+ test_unit_start(std::ostream& os, const test_unit& tu)
+ {
+ for (auto& l : m_loggers)
+ l.logger->test_unit_start(l.os == nullptr ? os : *l.os, tu);
+ }
+
+ void
+ test_unit_finish(std::ostream& os, const test_unit& tu, unsigned long elapsed)
+ {
+ for (auto& l : m_loggers)
+ l.logger->test_unit_finish(l.os == nullptr ? os : *l.os, tu, elapsed);
+ }
+
+ void
+ test_unit_skipped(std::ostream& os, const test_unit& tu)
+ {
+ for (auto& l : m_loggers)
+ l.logger->test_unit_skipped(l.os == nullptr ? os : *l.os, tu);
+ }
+
+#if BOOST_VERSION >= 105900
+ void
+ log_exception_start(std::ostream& os, const log_checkpoint_data& lcd, const execution_exception& ex)
+ {
+ for (auto& l : m_loggers)
+ l.logger->log_exception_start(l.os == nullptr ? os : *l.os, lcd, ex);
+ }
+
+ void
+ log_exception_finish(std::ostream& os)
+ {
+ for (auto& l : m_loggers)
+ l.logger->log_exception_finish(l.os == nullptr ? os : *l.os);
+ }
+#else
+ void
+ log_exception(std::ostream& os, const log_checkpoint_data& lcd, const execution_exception& ex)
+ {
+ for (auto& l : m_loggers)
+ l.logger->log_exception(l.os == nullptr ? os : *l.os, lcd, ex);
+ }
+#endif // BOOST_VERSION >= 105900
+
+ void
+ log_entry_start(std::ostream& os, const log_entry_data& entry_data, log_entry_types let)
+ {
+ for (auto& l : m_loggers)
+ l.logger->log_entry_start(l.os == nullptr ? os : *l.os, entry_data, let);
+ }
+
+ void
+ log_entry_value(std::ostream& os, const_string value)
+ {
+ for (auto& l : m_loggers)
+ l.logger->log_entry_value(l.os == nullptr ? os : *l.os, value);
+ }
+
+ void
+ log_entry_finish(std::ostream& os)
+ {
+ for (auto& l : m_loggers)
+ l.logger->log_entry_finish(l.os == nullptr ? os : *l.os);
+ }
+
+#if BOOST_VERSION >= 105900
+ void
+ entry_context_start(std::ostream& os, log_level level)
+ {
+ for (auto& l : m_loggers)
+ l.logger->entry_context_start(l.os == nullptr ? os : *l.os, level);
+ }
+
+ void
+ log_entry_context(std::ostream& os, const_string value)
+ {
+ for (auto& l : m_loggers)
+ l.logger->log_entry_context(l.os == nullptr ? os : *l.os, value);
+ }
+
+ void
+ entry_context_finish(std::ostream& os)
+ {
+ for (auto& l : m_loggers)
+ l.logger->entry_context_finish(l.os == nullptr ? os : *l.os);
+ }
+#endif // BOOST_VERSION >= 105900
+
+private:
+ struct LoggerInfo
+ {
+ std::shared_ptr<unit_test_log_formatter> logger;
+ std::shared_ptr<std::ostream> os;
+ };
+ std::vector<LoggerInfo> m_loggers;
+};
+
+} // namespace output
+} // namespace unit_test
+} // namespace boost
+
+#endif // NDN_TESTS_BOOST_MULTI_LOG_FORMATTER_HPP
diff --git a/tests/boost-test.hpp b/tests/boost-test.hpp
new file mode 100644
index 0000000..220a481
--- /dev/null
+++ b/tests/boost-test.hpp
@@ -0,0 +1,39 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2017, Regents of the University of California,
+ * Arizona Board of Regents,
+ * Colorado State University,
+ * University Pierre & Marie Curie, Sorbonne University,
+ * Washington University in St. Louis,
+ * Beijing Institute of Technology,
+ * The University of Memphis.
+ *
+ * This file, originally written as part of NFD (Named Data Networking Forwarding Daemon),
+ * is a part of ndncert, a certificate management system based on NDN.
+ *
+ * ndncert 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.
+ *
+ * ndncert 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 copies of the GNU General Public License along with
+ * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndncert authors and contributors.
+ */
+
+#ifndef CERT_TESTS_BOOST_TEST_HPP
+#define CERT_TESTS_BOOST_TEST_HPP
+
+// suppress warnings from Boost.Test
+#pragma GCC system_header
+#pragma clang system_header
+
+#include <boost/test/unit_test.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/test/output_test_stream.hpp>
+
+#endif // CERT_TESTS_BOOST_TEST_HPP
diff --git a/tests/global-configuration-fixture.cpp b/tests/global-configuration-fixture.cpp
new file mode 100644
index 0000000..bf4d864
--- /dev/null
+++ b/tests/global-configuration-fixture.cpp
@@ -0,0 +1,86 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2017, Regents of the University of California.
+ *
+ * This file is part of ndncert, a certificate management system based on NDN.
+ *
+ * ndncert 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.
+ *
+ * ndncert 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 copies of the GNU General Public License along with
+ * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndncert authors and contributors.
+ */
+
+#include "ndncert-config.hpp"
+
+#include <boost/version.hpp>
+#include <boost/filesystem.hpp>
+
+#include "test-common.hpp"
+
+namespace ndn {
+namespace chronoshare {
+namespace tests {
+
+class GlobalConfigurationFixture : boost::noncopyable
+{
+public:
+ GlobalConfigurationFixture()
+ {
+ if (getenv("HOME") != nullptr) {
+ m_home = getenv("HOME");
+ }
+ if (getenv("NDN_CLIENT_PIB") != nullptr) {
+ m_pib = getenv("NDN_CLIENT_PIB");
+ }
+ if (getenv("NDN_CLIENT_TPM") != nullptr) {
+ m_tpm = getenv("NDN_CLIENT_TPM");
+ }
+
+ boost::filesystem::path dir(TMP_TESTS_PATH);
+ dir /= "test-home";
+ setenv("HOME", dir.generic_string().c_str(), 1);
+
+ if (exists(dir)) {
+ remove_all(dir);
+ }
+
+ setenv("NDN_CLIENT_PIB", ("pib-sqlite3:" + dir.string()).c_str(), 1);
+ setenv("NDN_CLIENT_TPM", ("tpm-file:" + dir.string()).c_str(), 1);
+ create_directories(dir);
+ }
+
+ ~GlobalConfigurationFixture()
+ {
+ if (!m_home.empty()) {
+ setenv("HOME", m_home.c_str(), 1);
+ }
+ if (!m_pib.empty()) {
+ setenv("NDN_CLIENT_PIB", m_pib.c_str(), 1);
+ }
+ if (!m_tpm.empty()) {
+ setenv("NDN_CLIENT_TPM", m_tpm.c_str(), 1);
+ }
+ }
+
+private:
+ std::string m_home;
+ std::string m_pib;
+ std::string m_tpm;
+};
+
+BOOST_GLOBAL_FIXTURE(GlobalConfigurationFixture)
+#if (BOOST_VERSION >= 105900)
+;
+#endif // BOOST_VERSION >= 105900
+
+} // namespace tests
+} // namespace chronoshare
+} // namespace ndn
diff --git a/tests/identity-management-fixture.cpp b/tests/identity-management-fixture.cpp
new file mode 100644
index 0000000..b9d6d41
--- /dev/null
+++ b/tests/identity-management-fixture.cpp
@@ -0,0 +1,95 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2017, Regents of the University of California,
+ * Arizona Board of Regents,
+ * Colorado State University,
+ * University Pierre & Marie Curie, Sorbonne University,
+ * Washington University in St. Louis,
+ * Beijing Institute of Technology,
+ * The University of Memphis.
+ *
+ * This file, originally written as part of NFD (Named Data Networking Forwarding Daemon),
+ * is a part of ndncert, a certificate management system based on NDN.
+ *
+ * ndncert 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.
+ *
+ * ndncert 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 copies of the GNU General Public License along with
+ * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndncert authors and contributors.
+ */
+
+#include "identity-management-fixture.hpp"
+
+#include <ndn-cxx/util/io.hpp>
+#include <boost/filesystem.hpp>
+
+namespace ndn {
+namespace ndncert {
+namespace tests {
+
+IdentityManagementFixture::IdentityManagementFixture()
+ : m_keyChain("sqlite3", "file")
+{
+ m_keyChain.getDefaultCertificate(); // side effect: create a default cert if it doesn't exist
+}
+
+IdentityManagementFixture::~IdentityManagementFixture()
+{
+ for (const auto& id : m_identities) {
+ m_keyChain.deleteIdentity(id);
+ }
+
+ boost::system::error_code ec;
+ for (const auto& certFile : m_certFiles) {
+ boost::filesystem::remove(certFile, ec); // ignore error
+ }
+}
+
+bool
+IdentityManagementFixture::addIdentity(const Name& identity, const ndn::KeyParams& params)
+{
+ try {
+ m_keyChain.createIdentity(identity, params);
+ m_identities.push_back(identity);
+ return true;
+ }
+ catch (std::runtime_error&) {
+ return false;
+ }
+}
+
+bool
+IdentityManagementFixture::saveIdentityCertificate(const Name& identity,
+ const std::string& filename, bool wantAdd)
+{
+ shared_ptr<ndn::IdentityCertificate> cert;
+ try {
+ cert = m_keyChain.getCertificate(m_keyChain.getDefaultCertificateNameForIdentity(identity));
+ }
+ catch (const ndn::SecPublicInfo::Error&) {
+ if (wantAdd && this->addIdentity(identity)) {
+ return this->saveIdentityCertificate(identity, filename, false);
+ }
+ return false;
+ }
+
+ m_certFiles.push_back(filename);
+ try {
+ ndn::io::save(*cert, filename);
+ return true;
+ }
+ catch (const ndn::io::Error&) {
+ return false;
+ }
+}
+
+} // namespace tests
+} // namespace ndncert
+} // namespace ndn
diff --git a/tests/identity-management-fixture.hpp b/tests/identity-management-fixture.hpp
new file mode 100644
index 0000000..29eeede
--- /dev/null
+++ b/tests/identity-management-fixture.hpp
@@ -0,0 +1,86 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2017, Regents of the University of California,
+ * Arizona Board of Regents,
+ * Colorado State University,
+ * University Pierre & Marie Curie, Sorbonne University,
+ * Washington University in St. Louis,
+ * Beijing Institute of Technology,
+ * The University of Memphis.
+ *
+ * This file, originally written as part of NFD (Named Data Networking Forwarding Daemon),
+ * is a part of ndncert, a certificate management system based on NDN.
+ *
+ * ndncert 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.
+ *
+ * ndncert 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 copies of the GNU General Public License along with
+ * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndncert authors and contributors.
+ */
+
+#ifndef NDNCERT_TESTS_IDENTITY_MANAGEMENT_FIXTURE_HPP
+#define NDNCERT_TESTS_IDENTITY_MANAGEMENT_FIXTURE_HPP
+
+#include "test-common.hpp"
+
+#include <ndn-cxx/security/key-chain.hpp>
+
+namespace ndn {
+namespace ndncert {
+namespace tests {
+
+/** \brief a fixture that cleans up KeyChain identities and certificate files upon destruction
+ */
+class IdentityManagementFixture : public virtual BaseFixture
+{
+public:
+ IdentityManagementFixture();
+
+ /** \brief deletes created identities and saved certificate files
+ */
+ ~IdentityManagementFixture();
+
+ /** \brief add identity
+ * \return whether successful
+ */
+ bool
+ addIdentity(const Name& identity,
+ const ndn::KeyParams& params = ndn::KeyChain::DEFAULT_KEY_PARAMS);
+
+ /** \brief save identity certificate to a file
+ * \param identity identity name
+ * \param filename file name, should be writable
+ * \param wantAdd if true, add new identity when necessary
+ * \return whether successful
+ */
+ bool
+ saveIdentityCertificate(const Name& identity, const std::string& filename, bool wantAdd = false);
+
+protected:
+ ndn::KeyChain m_keyChain;
+
+private:
+ std::vector<ndn::Name> m_identities;
+ std::vector<std::string> m_certFiles;
+};
+
+/** \brief convenience base class for inheriting from both UnitTestTimeFixture
+ * and IdentityManagementFixture
+ */
+class IdentityManagementTimeFixture : public UnitTestTimeFixture
+ , public IdentityManagementFixture
+{
+};
+
+} // namespace tests
+} // namespace ndncert
+} // namespace ndn
+
+#endif // NDNCERT_TESTS_IDENTITY_MANAGEMENT_FIXTURE_HPP
diff --git a/tests/main.cpp b/tests/main.cpp
new file mode 100644
index 0000000..d6380c6
--- /dev/null
+++ b/tests/main.cpp
@@ -0,0 +1,117 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2017, Regents of the University of California,
+ * Arizona Board of Regents,
+ * Colorado State University,
+ * University Pierre & Marie Curie, Sorbonne University,
+ * Washington University in St. Louis,
+ * Beijing Institute of Technology,
+ * The University of Memphis.
+ *
+ * This file, originally written as part of NFD (Named Data Networking Forwarding Daemon),
+ * is a part of ndncert, a certificate management system based on NDN.
+ *
+ * ndncert 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.
+ *
+ * ndncert 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 copies of the GNU General Public License along with
+ * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndncert authors and contributors.
+ */
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_ALTERNATIVE_INIT_API
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 106200
+// Boost.Test v3.3 (Boost 1.62) natively supports multi-logger output
+#include "boost-test.hpp"
+#else
+#define BOOST_TEST_NO_MAIN
+#include "boost-test.hpp"
+
+#include "boost-multi-log-formatter.hpp"
+
+#include <boost/program_options/options_description.hpp>
+#include <boost/program_options/variables_map.hpp>
+#include <boost/program_options/parsers.hpp>
+
+#include <fstream>
+#include <iostream>
+
+static bool
+init_tests()
+{
+ init_unit_test();
+
+ namespace po = boost::program_options;
+ namespace ut = boost::unit_test;
+
+ po::options_description extraOptions;
+ std::string logger;
+ std::string outputFile = "-";
+ extraOptions.add_options()
+ ("log_format2", po::value<std::string>(&logger), "Type of second log formatter: HRF or XML")
+ ("log_sink2", po::value<std::string>(&outputFile)->default_value(outputFile), "Second log sink, - for stdout")
+ ;
+ po::variables_map vm;
+ try {
+ po::store(po::command_line_parser(ut::framework::master_test_suite().argc,
+ ut::framework::master_test_suite().argv)
+ .options(extraOptions)
+ .run(),
+ vm);
+ po::notify(vm);
+ }
+ catch (const std::exception& e) {
+ std::cerr << "ERROR: " << e.what() << "\n"
+ << extraOptions << std::endl;
+ return false;
+ }
+
+ if (vm.count("log_format2") == 0) {
+ // second logger is not configured
+ return true;
+ }
+
+ std::shared_ptr<ut::unit_test_log_formatter> formatter;
+ if (logger == "XML") {
+ formatter = std::make_shared<ut::output::xml_log_formatter>();
+ }
+ else if (logger == "HRF") {
+ formatter = std::make_shared<ut::output::compiler_log_formatter>();
+ }
+ else {
+ std::cerr << "ERROR: only HRF or XML log formatter can be specified" << std::endl;
+ return false;
+ }
+
+ std::shared_ptr<std::ostream> output;
+ if (outputFile == "-") {
+ output = std::shared_ptr<std::ostream>(&std::cout, std::bind([]{}));
+ }
+ else {
+ output = std::make_shared<std::ofstream>(outputFile.c_str());
+ }
+
+ auto multiFormatter = new ut::output::multi_log_formatter;
+ multiFormatter->add(formatter, output);
+ ut::unit_test_log.set_formatter(multiFormatter);
+
+ return true;
+}
+
+int
+main(int argc, char* argv[])
+{
+ return ::boost::unit_test::unit_test_main(&init_tests, argc, argv);
+}
+
+#endif // BOOST_VERSION >= 106200
diff --git a/tests/test-common.cpp b/tests/test-common.cpp
new file mode 100644
index 0000000..8214cf5
--- /dev/null
+++ b/tests/test-common.cpp
@@ -0,0 +1,136 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2017, Regents of the University of California,
+ * Arizona Board of Regents,
+ * Colorado State University,
+ * University Pierre & Marie Curie, Sorbonne University,
+ * Washington University in St. Louis,
+ * Beijing Institute of Technology,
+ * The University of Memphis.
+ *
+ * This file, originally written as part of NFD (Named Data Networking Forwarding Daemon),
+ * is a part of ndncert, a certificate management system based on NDN.
+ *
+ * ndncert 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.
+ *
+ * ndncert 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 copies of the GNU General Public License along with
+ * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndncert authors and contributors.
+ */
+
+#include "test-common.hpp"
+
+#include <ndn-cxx/util/digest.hpp>
+#include <ndn-cxx/security/signature-sha256-with-rsa.hpp>
+
+namespace ndn {
+namespace ndncert {
+namespace tests {
+
+UnitTestTimeFixture::UnitTestTimeFixture()
+ : steadyClock(make_shared<time::UnitTestSteadyClock>())
+ , systemClock(make_shared<time::UnitTestSystemClock>())
+{
+ time::setCustomClocks(steadyClock, systemClock);
+}
+
+UnitTestTimeFixture::~UnitTestTimeFixture()
+{
+ time::setCustomClocks(nullptr, nullptr);
+}
+
+void
+UnitTestTimeFixture::advanceClocks(const time::nanoseconds& tick, size_t nTicks)
+{
+ this->advanceClocks(tick, tick * nTicks);
+}
+
+void
+UnitTestTimeFixture::advanceClocks(const time::nanoseconds& tick, const time::nanoseconds& total)
+{
+ BOOST_ASSERT(tick > time::nanoseconds::zero());
+ BOOST_ASSERT(total >= time::nanoseconds::zero());
+
+ time::nanoseconds remaining = total;
+ while (remaining > time::nanoseconds::zero()) {
+ if (remaining >= tick) {
+ steadyClock->advance(tick);
+ systemClock->advance(tick);
+ remaining -= tick;
+ }
+ else {
+ steadyClock->advance(remaining);
+ systemClock->advance(remaining);
+ remaining = time::nanoseconds::zero();
+ }
+
+ if (m_io.stopped())
+ m_io.reset();
+ m_io.poll();
+ }
+}
+
+shared_ptr<Interest>
+makeInterest(const Name& name, uint32_t nonce)
+{
+ auto interest = make_shared<Interest>(name);
+ if (nonce != 0) {
+ interest->setNonce(nonce);
+ }
+ return interest;
+}
+
+shared_ptr<Data>
+makeData(const Name& name)
+{
+ auto data = make_shared<Data>(name);
+ return signData(data);
+}
+
+Data&
+signData(Data& data)
+{
+ ndn::SignatureSha256WithRsa fakeSignature;
+ fakeSignature.setValue(ndn::encoding::makeEmptyBlock(tlv::SignatureValue));
+ data.setSignature(fakeSignature);
+ data.wireEncode();
+
+ return data;
+}
+
+shared_ptr<Link>
+makeLink(const Name& name, std::initializer_list<std::pair<uint32_t, Name>> delegations)
+{
+ auto link = make_shared<Link>(name, delegations);
+ signData(link);
+ return link;
+}
+
+lp::Nack
+makeNack(const Name& name, uint32_t nonce, lp::NackReason reason)
+{
+ Interest interest(name);
+ interest.setNonce(nonce);
+ lp::Nack nack(std::move(interest));
+ nack.setReason(reason);
+ return nack;
+}
+
+ConstBufferPtr
+digestFromFile(const boost::filesystem::path& filename)
+{
+ boost::filesystem::ifstream iff(filename, std::ios::in | std::ios::binary);
+ util::Sha256 digest(iff);
+ return digest.computeDigest();
+}
+
+} // namespace tests
+} // namespace ndncert
+} // namespace ndn
diff --git a/tests/test-common.hpp b/tests/test-common.hpp
new file mode 100644
index 0000000..2d2ab6a
--- /dev/null
+++ b/tests/test-common.hpp
@@ -0,0 +1,180 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014-2017, Regents of the University of California,
+ * Arizona Board of Regents,
+ * Colorado State University,
+ * University Pierre & Marie Curie, Sorbonne University,
+ * Washington University in St. Louis,
+ * Beijing Institute of Technology,
+ * The University of Memphis.
+ *
+ * This file, originally written as part of NFD (Named Data Networking Forwarding Daemon),
+ * is a part of ndncert, a certificate management system based on NDN.
+ *
+ * ndncert 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.
+ *
+ * ndncert 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 copies of the GNU General Public License along with
+ * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndncert authors and contributors.
+ */
+
+#ifndef NDNCERT_TESTS_TEST_COMMON_HPP
+#define NDNCERT_TESTS_TEST_COMMON_HPP
+
+#include "logging.hpp"
+
+#include "boost-test.hpp"
+
+#include <boost/asio/io_service.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/filesystem/fstream.hpp>
+
+#include <ndn-cxx/name.hpp>
+#include <ndn-cxx/data.hpp>
+#include <ndn-cxx/lp/nack.hpp>
+#include <ndn-cxx/util/time-unit-test-clock.hpp>
+#include <ndn-cxx/util/string-helper.hpp>
+
+namespace ndn {
+namespace ndncert {
+namespace tests {
+
+/** \brief base test fixture
+ *
+ * Every test case should be based on this fixture,
+ * to have per test case io_service initialization.
+ */
+class BaseFixture
+{
+protected:
+ /** \brief reference to global io_service
+ */
+ boost::asio::io_service m_io;
+};
+
+/** \brief a base test fixture that overrides steady clock and system clock
+ */
+class UnitTestTimeFixture : public virtual BaseFixture
+{
+protected:
+ UnitTestTimeFixture();
+
+ ~UnitTestTimeFixture();
+
+ /** \brief advance steady and system clocks
+ *
+ * Clocks are advanced in increments of \p tick for \p nTicks ticks.
+ * After each tick, global io_service is polled to process pending I/O events.
+ *
+ * Exceptions thrown during I/O events are propagated to the caller.
+ * Clock advancing would stop in case of an exception.
+ */
+ void
+ advanceClocks(const time::nanoseconds& tick, size_t nTicks = 1);
+
+ /** \brief advance steady and system clocks
+ *
+ * Clocks are advanced in increments of \p tick for \p total time.
+ * The last increment might be shorter than \p tick.
+ * After each tick, global io_service is polled to process pending I/O events.
+ *
+ * Exceptions thrown during I/O events are propagated to the caller.
+ * Clock advancing would stop in case of an exception.
+ */
+ void
+ advanceClocks(const time::nanoseconds& tick, const time::nanoseconds& total);
+
+protected:
+ shared_ptr<time::UnitTestSteadyClock> steadyClock;
+ shared_ptr<time::UnitTestSystemClock> systemClock;
+
+ friend class LimitedIo;
+};
+
+/** \brief create an Interest
+ * \param name Interest name
+ * \param nonce if non-zero, set Nonce to this value
+ * (useful for creating Nack with same Nonce)
+ */
+shared_ptr<Interest>
+makeInterest(const Name& name, uint32_t nonce = 0);
+
+/** \brief create a Data with fake signature
+ * \note Data may be modified afterwards without losing the fake signature.
+ * If a real signature is desired, sign again with KeyChain.
+ */
+shared_ptr<Data>
+makeData(const Name& name);
+
+/** \brief add a fake signature to Data
+ */
+Data&
+signData(Data& data);
+
+/** \brief add a fake signature to Data
+ */
+inline shared_ptr<Data>
+signData(shared_ptr<Data> data)
+{
+ signData(*data);
+ return data;
+}
+
+/** \brief create a Link object with fake signature
+ * \note Link may be modified afterwards without losing the fake signature.
+ * If a real signature is desired, sign again with KeyChain.
+ */
+shared_ptr<Link>
+makeLink(const Name& name, std::initializer_list<std::pair<uint32_t, Name>> delegations);
+
+/** \brief create a Nack
+ * \param name Interest name
+ * \param nonce Interest nonce
+ * \param reason Nack reason
+ */
+lp::Nack
+makeNack(const Name& name, uint32_t nonce, lp::NackReason reason);
+
+/** \brief replace a name component
+ * \param[inout] name name
+ * \param index name component index
+ * \param a arguments to name::Component constructor
+ */
+template<typename...A>
+void
+setNameComponent(Name& name, ssize_t index, const A& ...a)
+{
+ Name name2 = name.getPrefix(index);
+ name2.append(name::Component(a...));
+ name2.append(name.getSubName(name2.size()));
+ name = name2;
+}
+
+template<typename Packet, typename...A>
+void
+setNameComponent(Packet& packet, ssize_t index, const A& ...a)
+{
+ Name name = packet.getName();
+ setNameComponent(name, index, a...);
+ packet.setName(name);
+}
+
+/** \brief convert file to digest
+ */
+ndn::ConstBufferPtr
+digestFromFile(const boost::filesystem::path& filename);
+
+} // namespace tests
+} // namespace ndncert
+} // namespace ndn
+
+#include "identity-management-fixture.hpp"
+
+#endif // NDNCERT_TESTS_TEST_COMMON_HPP
diff --git a/tests/unit-tests/dummy-test.t.cpp b/tests/unit-tests/dummy-test.t.cpp
new file mode 100644
index 0000000..d6ccd1f
--- /dev/null
+++ b/tests/unit-tests/dummy-test.t.cpp
@@ -0,0 +1,52 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2017, Regents of the University of California.
+ *
+ * This file is part of ndncert, a certificate management system based on NDN.
+ *
+ * ndncert 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.
+ *
+ * ndncert 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 copies of the GNU General Public License along with
+ * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndncert authors and contributors.
+ */
+
+#include "test-common.hpp"
+
+namespace ndn {
+namespace ndncert {
+namespace tests {
+
+// See http://redmine.named-data.net/projects/nfd/wiki/UnitTesting on how to name a test suite.
+BOOST_AUTO_TEST_SUITE(TestSkeleton)
+
+BOOST_AUTO_TEST_CASE(Test1)
+{
+ int i = 0;
+
+ // For reference of available Boost.Test macros, see
+ // http://www.boost.org/doc/libs/1_54_0/libs/test/doc/html/utf/testing-tools/reference.html
+
+ BOOST_REQUIRE_NO_THROW(i = 1);
+ BOOST_REQUIRE_EQUAL(i, 1);
+}
+
+// Use UnitTestTimeFixture to mock clocks.
+BOOST_FIXTURE_TEST_CASE(Test2, UnitTestTimeFixture)
+{
+ // this->advanceClocks increments mock clocks.
+ advanceClocks(time::milliseconds(500), 2);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace tests
+} // namespace ndncert
+} // namespace ndn
diff --git a/tests/wscript b/tests/wscript
new file mode 100644
index 0000000..23518b4
--- /dev/null
+++ b/tests/wscript
@@ -0,0 +1,28 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+from waflib import Utils
+
+top = '..'
+
+def build(bld):
+ if not bld.env["WITH_TESTS"]:
+ return
+
+ tests_main = bld(
+ target='tests-main',
+ name='tests-main',
+ features='cxx',
+ source="main.cpp",
+ use='objects BOOST',
+ defines=['BOOST_TEST_MODULE=\"NDNCERT Tests\"']
+ )
+
+ unit_test = bld.program(
+ target="../unit-tests",
+ source=bld.path.ant_glob(['*.cpp', 'unit-tests/**/*.cpp'],
+ excl=['main.cpp']),
+ features=['cxx', 'cxxprogram'],
+ use='objects tests-main',
+ includes=['.'],
+ install_path=None,
+ defines='TMP_TESTS_PATH=\"%s/tmp-tests\"' % bld.bldnode,
+ )
diff --git a/waf b/waf
new file mode 100755
index 0000000..fa68e1a
--- /dev/null
+++ b/waf
@@ -0,0 +1,169 @@
+#!/usr/bin/env python
+# encoding: ISO8859-1
+# Thomas Nagy, 2005-2016
+#
+"""
+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. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 AUTHOR 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.
+"""
+
+import os, sys, inspect
+
+VERSION="1.9.7"
+REVISION="c00f221443fc5d8f60edfcad309d0601"
+GIT="4095f1403a11e4138d720e650b435411e757ed70"
+INSTALL=''
+C1='#.'
+C2='#)'
+C3='#%'
+cwd = os.getcwd()
+join = os.path.join
+
+
+WAF='waf'
+def b(x):
+ return x
+if sys.hexversion>0x300000f:
+ WAF='waf3'
+ def b(x):
+ return x.encode()
+
+def err(m):
+ print(('\033[91mError: %s\033[0m' % m))
+ sys.exit(1)
+
+def unpack_wafdir(dir, src):
+ f = open(src,'rb')
+ c = 'corrupt archive (%d)'
+ while 1:
+ line = f.readline()
+ if not line: err('run waf-light from a folder containing waflib')
+ if line == b('#==>\n'):
+ txt = f.readline()
+ if not txt: err(c % 1)
+ if f.readline() != b('#<==\n'): err(c % 2)
+ break
+ if not txt: err(c % 3)
+ txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00'))
+
+ import shutil, tarfile
+ try: shutil.rmtree(dir)
+ except OSError: pass
+ try:
+ for x in ('Tools', 'extras'):
+ os.makedirs(join(dir, 'waflib', x))
+ except OSError:
+ err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir)
+
+ os.chdir(dir)
+ tmp = 't.bz2'
+ t = open(tmp,'wb')
+ try: t.write(txt)
+ finally: t.close()
+
+ try:
+ t = tarfile.open(tmp)
+ except:
+ try:
+ os.system('bunzip2 t.bz2')
+ t = tarfile.open('t')
+ tmp = 't'
+ except:
+ os.chdir(cwd)
+ try: shutil.rmtree(dir)
+ except OSError: pass
+ err("Waf cannot be unpacked, check that bzip2 support is present")
+
+ try:
+ for x in t: t.extract(x)
+ finally:
+ t.close()
+
+ for x in ('Tools', 'extras'):
+ os.chmod(join('waflib',x), 493)
+
+ if sys.hexversion<0x300000f:
+ sys.path = [join(dir, 'waflib')] + sys.path
+ import fixpy2
+ fixpy2.fixdir(dir)
+
+ os.remove(tmp)
+ os.chdir(cwd)
+
+ try: dir = unicode(dir, 'mbcs')
+ except: pass
+ try:
+ from ctypes import windll
+ windll.kernel32.SetFileAttributesW(dir, 2)
+ except:
+ pass
+
+def test(dir):
+ try:
+ os.stat(join(dir, 'waflib'))
+ return os.path.abspath(dir)
+ except OSError:
+ pass
+
+def find_lib():
+ src = os.path.abspath(inspect.getfile(inspect.getmodule(err)))
+ base, name = os.path.split(src)
+
+ #devs use $WAFDIR
+ w=test(os.environ.get('WAFDIR', ''))
+ if w: return w
+
+ #waf-light
+ if name.endswith('waf-light'):
+ w = test(base)
+ if w: return w
+ err('waf-light requires waflib -> export WAFDIR=/folder')
+
+ dirname = '%s-%s-%s' % (WAF, VERSION, REVISION)
+ for i in (INSTALL,'/usr','/usr/local','/opt'):
+ w = test(i + '/lib/' + dirname)
+ if w: return w
+
+ #waf-local
+ dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname)
+ w = test(dir)
+ if w: return w
+
+ #unpack
+ unpack_wafdir(dir, src)
+ return dir
+
+wafdir = find_lib()
+sys.path.insert(0, wafdir)
+
+if __name__ == '__main__':
+
+ from waflib import Scripting
+ Scripting.waf_entry_point(cwd, VERSION, wafdir)
+
+#==>
+#BZh91AY&SY¹÷{4Æÿÿÿ°@Êÿÿÿÿÿÿÿÿÿÿÿ$#)á ð#%E(aþ\÷>ûw#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%«ßGtC-±ªëT®¥#)}°w'mfݺ{tê©ybZØ·§vǵÛíä÷º:wo§,÷˾¦³ÞݳÝâ©:$»Íî÷[Ûµ´ôö=#)ìEoSt#)¾Þ6³Y7Þø}뺣=¼O¹$û7Þ÷ß}ß|:½íñínÍ·¶÷Ø0;ÌÖ.iÕ#%#%;Ø#%l#%é@ÀOACÀÙ0èÛܬ6ª5ÝMS ÓA s;ì¯hôÍ#%ÐkÙ
+¶h%`#%ª¥D¡w¸ôkYI(#%¤=`$P¢ïpöðrûÌ÷¾îãoqÛo[7®N÷º÷]sJlè8¨í½µZßO¥í§¶í ÷>ñÕæibvñïyèÛÜ;n^¹½ÍÝÞ½W{|ÙÜ÷òiæz>ªðãw·¥í{±Õ#.éov#%Uz×°¬kZéíîöÚîïsvçtÂ{b
eï=7nID$öõÚ`#%#%H*i¡ÏBìAÉJ[˨;Û&ö5*>Þò¼ûÚï>¼ÞûÞk .ƯO EÖÖ½usîC å¾°vØØ#)öîñÀtéíîÐ çw"q÷;ìzrî÷±é÷Ǧ½ÙÁëötS}qŽ¯»ÎÛx¨;¼/8ùÙ{éÛ9ß]ïim×m¸Ë«»wÛ{Z´ÞÜmÎèîk¶W¸÷¤ô9¾ßW+ÕA=ÃW^÷¼ô衶â>Ù[Sʾîí¾9vkÃÁI²UáÝÝfú÷$yµõÝ®³HäsöO{/¾îú'ܶZ÷gÎK{°ÚîÏ=#%ö®yæôé÷}÷JÀu(¥#%¨#ì=Ì-¼»´ ¶j±½àÎCNÜg'w»¹é¯îÕE;×{)×»wÖ{39ð#%îãª#%#.7¸½÷¾ù*úóÝÞìõí©½_yÈvÇlïvûÞ{º#)Ê#k³ºw½ËÛåè:$}Fݺ®!Í}ÝoÙž¼çÛÞo%ðVîXvÕ³JàõÞ´¢¯2ð4ódd3í¹æùÇsNÎé6o:ϸ|v[Ýu}uצÉݬ½»Þû¼ù[VÛ#.Ø6¬Ð>Ýeºõ°vçh7L&.ÑâÇyµ»²Åw®«.êwbðM©Å]crmï{Þ÷»ØõÝÑÃbÇõîÞûÛÕ½ôw§«î»uï3m×®V:îúÝ1éÖß:T#%äСÛs.æo^thÆl^ëeÜسè h>SÚ¶#%£käïµ>úo·8B¨]{{oi»9¨w±syâìÝݹ#.ûwÛÅUÉÚss£vàgjUIås»jDS¥Äm³Þ{ifß.¤gp£s¯w¾|xì>}Ùw'E)à^Ì2[g±ÄNê°hÛn^T·Ý¾õXÖ¼»ïs·Ûwwk´x«zñ¯àÓD#%#%&b2 ¦L&F)òOTÐÊ4y@Ú ÐÐz=OÑPJh &dÓ"4ÓMñM¦ cD1ê#%#%#%#%#%$"DÑÐSaFL%GíSôQ<SôD4Põ¡&@#%#%#%#%z¥H)í4i¨Ôõ6 6¦Põ#%44Ð#)¤=M©µ#%#%#%#%#%#%$ #%#%ÀAOhF4Sj4#)#%P#%#%#%j"a2#%M&©úiÆJ?ЦõOQ¶¨dÈh#%#)#%#%#%ý}ùõVH©j5lFtýZwaMUV»Y£H"±!1j*Þ1OqïöþJ4ãÌ~qDIRMQù_æbeÞ)eØøNb-é®Õ¼Æ1XµX¬Ð#äÄa{xì0Ào#%2¢@ðR¥+#.`5S¸ÛM¡;#%®ö!øj»ríÞ÷E©²RM^½Í]¼Q¢RÅƱÇùhÌ'Û²¾F¶ÄR R1"²uuVµcm´ZØÕ&¶FÖÕíVU¹bÁÆ¸Ø DQ3)#Â0Qoè#%nD\VaH#.¢DdELE5ª ÉÂ&364ÌÒÈÍ&¨¡ÆDYJ4¢i6©&QTÔU#4#.i¢lÆÆ2&¥( F¥#%i*mH¤Ù-¢))e¥)µe¤(&£61¨%¢)M2 ©(h¦"(FSchØMi´ªÔ
2Ô3bMDAJÓkFih¤¤ÔÉS[ÙªdÔµ2ÒY12J64²J()F*$M¢Ö) Ñ°ÁCLÆiQT¦4DÊ0KC"2I°Ù+HHE,DÌ¡1!"JiY£&&"-IQbP¤T1d,jRIDÐÆLLTiѤÚAI4,YÔÆ)6+%lBE,3*ILBÉ EIQ%ÑFJE,PHL%d,Y5Q´&ÉRLÔ HDd¬Y6m$bh#`bHQ BLÛ,ÆARÁc$i(Ôؤ²FŤ&SI2ÉFD©f@±&1*Ie&PcQ¤Í"¢Fi¢&ª Be¤²1%&DÐM23#.5LTC)¤Ê#.F4BC2P #)eLÍimÚdH
Íe-0ѲE¡$(,Y6l¦hÖ!RfHÉK"lÚ`Û"ÌS$)f,ÊhIER4RFLIJɢɦÊA@,VRI$Êj6M"FÆY¤Ãh4lf!,FH±¦d1$Í¢!-!5MФ¤Q¶A2Ù2ØÂAe$TX%D£iIF±d)(¦RÆÈL1K,iQ¤J2¤4MZZѱ$M2S#E2 Öd¶%,Ѧ)22¥,ÐZ£alXRÆR04
4µúí®ÊÒ¥Äj6±´Tb£dÉTCd44´FÂ6I¨ÚÈ-2b1J`%IÈbfiÉ«SY)F#.PbTiBÁdÉKJdÉ& ز4i²VÊTªVaM¥"5²i*K3k%Yl¥)¦Y)£6$´Êm¶#)l%j$¨(ÛhLjJ6¨Ú,lh2B¨ ¨,UbÃ6l&Ù0±l
(%h£jQ4ÚÛ+´
ÚI-µ³m´ÈlT$&S*jɦlHKH¢6Õ-¥Qe¦Si¬Ò©¦#R¡eM´³T²*!m -2Hk,hfdÖ¥µb !HÈc0&C!¨4&02ÔZ RTaª+$ÓFÉIFE,ÑT²ÈÈ2"P¤£e3@ÅA"Jh4Z*dE-5&)bÌÓB&¨É4ÂFKE²l&Å$±3AK2BÔÊÌE&4ÂeI¤¨Ø¤!(̪¦,Í$fd)YDE3hØƢŠ²lÐ
-4
FC"4hÓ)¢JJYKBd¬aY$±h¦TlÖÐj*Yd٤ͥhª4 ÆAdÂT¤T¦²AF[$¦Æ Û0©¤ÒXÍ%iFa¥6µf34ÓS4¨" 4ÁƳBŬÒlÄ11II FѪQ¨Ôh£lEFe°Òa¤
$E(6(°&ÐVYdÙ) Ø´d,³If´l$[¨E ZE©5FÁF
1T¥#)´Z#))fY#.ES#PDZ4EÛY(¬V2`,"-Ld)ID,J"JµÚ#.,Y*5S3E²RV6µ)J6Sl²X´4K6d#)LRQ#²a#)FIA0b%)³6&"EQY5)4QA2¤¶-EÑERejPQiM©KQ&£Uc)I#%ÚcRQbJfÈÌ*DPlÍb©4[F¤´Óm¡1TjB´S5m¢Ñ¨±«-©22HYYXQÅcj-*XSl£,jbRA²£bJ%±¶,ÍIRZÅ&ÙLÍQ£hÃH¨¤¢¶Û6ÛM,0I°Ä"F*Iµ!%XØ´Í[F5¬ÚMe²[SSl
µm¢QP26cÃYS5²È¨ CQ&$)&DÈ[&´Y©é?ÞÿAü.¯ó[ùèÿ1ojjÿ©*«èCT®9KË2ÏÜL"
Ê4ï·4^Þù¯áz¯\ßÑþ^¤Â
RÓøë.)þÏD4a×%qÿnq(1:7"T°\0RHUD&bo÷êhÍø³þAýÿmôJ±Ñ7;)a#ù¹æūDZ°õ]èà« ÈüìÂC±6ÝakF.Xz<(Óð½À$j1¨ÉÄD
M5ã¼n÷ÕÃ˺hë²wÐCFfÒ²Ó 0ÊHÑP©^#)»¶¸7ÇÏk«å_/E÷>ïß#)¸\ܨ±F·ÓÏw½nIkÏ×yÛyÝ°ËèÜÙ½niU"ÅuG#)F¶¹qÊÿÉeçBRE-÷L`UlÁe-Õ§KK( ,_WüxC±æÛ1<ÂÚNÞ+ï9)+½Y%°v;Aþ;Þ`´5äÎGÙí
h Ña»}IîàÚ',ÂåGåçÆÿ4ZGg{¨i¥Ø(Xç#)¢
4Ð]ÆÍÌ
[$$X#.w Ä`Z#%¼ª¤õUÏjO0¬Ý¤SJ"%%4ѯ{,¼QËÄÒjºpÅà)5Lº%µQ±F,h4Ê뱪44d{lË ÔÁ71V±n-TR°;¨é\¹&2N»¥æB¢¨ÿ²If)%",,B´Z5jÅ¿EyÔ×ô8Ó4ÿÑz`ÿqY4ã@_좺NzàµX*8Æ#) ûqN-ºÅ?Ð$Á¯YùbºÑ8çÂhiVR|ªºos°ÁÃê©ÑýÞªÛÙ_ÂËöÙdzcGmħWrtdØI[øÞã¥m¥CXÌu @ØB#)Pè³²5á1ÉeEäT*#.8@¦ÈXFDèLhÑ¡ýpÔ<º@Ë1&Âl£ë¢×¦Úç
iuL%4¬´;¬¥béÒñò}ø©ØºÖMùóÂH#)vZCf8¯¹o[Ù®-´.ª+Z7þâ×FX²,S«@¬DbÄDcÛAc:Y]v1Ñ£´4UÿÞq¿iðs¤¹ÄíX¬cå½X1\t£+±)qM±F5ãsI±¼XÛÇü_*ÀÅàÔF(W±â{¿uLöÊÊü_ôÞUëE,D¦¢éÝs_>umtéËrîºÄÑ9Ýe)"á)X«)%0±yß{ïyÑ£cY6|ÝË¿^k¯còvìV0ÛÜú»nßôóÈy&¾Çáo¨,ô5ÕAhí½Fxùæýºð³#%ÉþƦ*`pÖçÃ6?uC¦J"1Ò¶³d<AIsnzЬEFCP»ÝI+§/#)FIZÔ-ÌYKJZHR ÛPZÒËÄôÑàä¢Jê¥]»êÅ##)yä2ïáVîòBÎþë°bÂ*0<®ÔÙ¨Ze¤0§Xôq«°·ÊÃÅ¢4¶ÒÓ±Ìe.ª¶ÏHCû8p¹lU©Ï¶¤óCâÊ=×â£ÙÁÅÕÇöÆðxŽ«)¶åßðÍX¸ïñÑìoªwb«¬éÃ%pî©dêÀÕÃ<l°""ÑT{#.òÒV Ê()#)h¨pkþ4Þü/,=½ÔD4o
taýþºàÍM¡ø´#.riGëÞÏËúnܼû=Øm#)$m l'$çq4ÛÏt¤"XÜÝÕDuûYl4RDÆÍêRøÃw|f4¸¿M̦#.<Ü4ÿN·OY$á'y?F.Ï"A**( y{Î& P£æu'åI|±Ç%s2cï¶1'ËÖ«l&;©éÅÈZ²#.¤!³y¦«Þ{ôRD7©0Ãê;ª»dnß2©n§T° yrH|Î:η¨]S:q=iÙ{â#.óúúfø
0NSº)$ÀéUܨ¶åTýj¡ý3ï®ð rÖ¬1VF½Òc)9ð«m¡8¥w*2Xæ÷þWÿS·&6(tÞ}je º¢4rÿ9ø"%Ùñèôª+4&ö³®D1òÉDØ{&bÛ }mxñ½Ã´GàÑ]Æ$rëå0Jd#.P#.íâ{¢Q?$8ïËõÚçhã&ýY62/¢)Ä#m§³á/oòbì×®·îÐ!Ñ8£í8yTî!kYò#)XEÓF×j!}>ÜéÌʵmÍ4sܼ3ªÝoH)³`ÊyíAÓ5~¶{ÎõéíÎ^?§ÊøävBI$súBùÐØá¦Iýh»Jà§4ô ð¾B¼#)ú!d á~ÄQµvMäEÁ`§TkÎ 0:£wµÌ´yü"=:DiËáªó¥¦¢Z±Ò·?6hå|,-¸U#)kAáE:¸ÐÇ-èû¡÷?«^®ðÜ:ÙÌÕ÷Óq®ÿ,>¬Èj©ºO¶O¯Óã,×7Ò¤îÕy6/Àõ¯/DQKîq½ªQ:Ñ@È#.£<8ö\¿6
ªRUBêU@H$Rkùúÿ±¹¤9}³ÞzÍêk[pTôU¢!uP.¨_{=}vm~Js¨ïw3U~ fÏÇn<1@ùnI÷Ŷ¯¤êÝÂ]â8eiX5ØéT,Ô@À÷|¬1áSKù\¶çº3²c òË[½a¦gãIOì|Ù¸h¤lëR}IÑÄ0Ð.ÄøÖ%ÆVÞ'.Òþãú*àf~¢GÄA±_iXÞ,¿ªª8Î{ò`rd£ë¢Àí×6¢.Æ*ÀE¤YRp«¾ô»Ï)÷îhÆ}½Så¿npq Gب2ñÛy$A)Ñ.âI¸vt/aeß7çvÊcϬÓÓÀo¨ã£!´¡#K0í¦Nö³2&øü¢<sN/G}tvhv^÷Ï0Êe=ûLäÈø²_uR<½»\ǾÛE¬4¤fb")
³ïÛÙUHx&Ù HêÚV!Ñ'º®Î6-Í;Ä'=eÉó¶Û3ßULÉOs ×G«#ã9Ò1¤2|ôìñqÛyâô¢i\XT9Ô,IÜק6ÅP}gß=9zµÄópç¯gH²ã"Å
.YJ+èÎ
õ×·ÇqïáÁ/~¦Z]Ã#.Ù?ïÛßDjõÐÆ1¬üþUK1xm`MýþðÂÎ_9]_ôhg;ºg>Õ5Û'¿/¶Ðf-KÍ׺#ÏS8t2I2-)pàÖ"ÑcÐOÿYÚôî½·y×<sAV.%bà¨{uÇÇ]Gã!õo7Km|#.§0ÄqTÄ#y~ÓCÚ}°P)ª¾«»WÔØÓ¿5½W¤2Ū</Ê0#)§)ì©àµyùDg¹ï[áÇt²éÒ!$aÃ7×/.Ò*=¹Ò3ãÃéâËz?wlHÁó|=ä^þáº?¢¥Â.Í£[«|ëù&_Z¥bürä¥ç]*ªÜuè³´ÃiL7<ûdzÂbÑZâÝýZ})·|ÿOhc?9åÁÐþ<ùªqaÿ>Ù©
2!eÞÇæ\ÃÕw*ü9.Í8 ¨ÁxÈ\AðM*£Ní¶yzyYíÖ¶0 TÑTe¹ÛS-¿JA·mpyOÕ ;û9Btz#)ÀÄSåsðchÖå¶,9Ô÷X·Ä±ÃÞMî-â'MwîÉàQy5©K*¨ãß'¼u]*¸!Èôkêßè=V)"g_
¶1ªWÓHå±×r"UcRÅgÒCTn³#jI)ÈH®v|;ìcꪨrcéþ¦Xæf¯á¿JL¯3©²:ny,øHüÞÒç#â(ùÉ>0U¦'ç=ö=ñ_#È2F¹ÛáUÀl¤Ã¢;[KTYâÈf\^A齸¼·ô°qµâéòáfkk84
³,ô³óg¥Î7£v°Ý#Õö;¤%W.7¹-JvN&zTjôÓÕsx±¶vñ¯ ÝÖ¬ÝãtJ×{U0¯ñWÙÈÒÖdX¬ÿLÛØUWE`ÙJâìåG¿!ÍÈ9ù:j^ójD¨ÄäÏÙÛ[3SÇZ-ú»ÖÿTãË|ºòøD~oi©/èùåKJ©xù<iÕmäM#ùTý¾^vrúí'àòã¢%Êååìý5#.Ï@øí£¬² [òMïÇ`¿v%û·Ó¥ë }¹¹cø4ë)¼WÞ£9.~ÜâvT¨blÎ3{)ð¥)ûµ¤Ú°1ï3#YðÝ1ã¬#)Ëìñ¡ÛcEôêÏ5=ø¢Ü}/|]ýèÍ73ÄP?¦§åë©1ãGs³÷gZë.ÁHÅ÷
J-ÞEøQA0Tjº.blÉïO ]³ö@lXøo3®)w¸ONμ;·d#.j-ÚÕ ìK¾Ôs¯Ï»m´&àɺcμ{/UÔf<¼øç¥Æ,[ arQêÍÒ¼âDË#.ûç<p_ÎXÁfÕUtêŪEâOf8Fpã3|úh¬`úù˾ÜzóÜnF;QqU?\KzÂ×:Yì˧lL³~Dƽu¬ÂØÅ»ñeyá)4 ö_ûê5HÃ.®Êö×
Ã@ÖlckÅÅg²ò£øç?kJ&!Æctéw:ª<M`¨¨ýÉò¤Pj'5":¸Û<Íec±=02
*Bż|n&b«ªR²¦®xównoµÈ¥ÇUÜu~Ŭ%odYIoì5ðÍÛ¿: uÍKÞ$Ò¤É<r¾Ü°¯i1vúù]=fïÝËS!F¬0Ò~ãö#%&êÇ#)§Y»gÈî?'Ç^"Þ«O¿ý$¿£;Td{rQå_%×1¾æKÜ3ð^ë#)Y!íIª«>hnñueéZQ®p_~uDvò©Ll7¾JÝ5 Ý÷PÎ;S"VC7]éÝ%1ªÍÜúUÝLÓIKP8<&ýÔkpÒ!°;¾n)t¬Ç.æ¿{>Êëh2n±û¡¶M·uü!ÜÏg9·RLH)]kô´ø[UàúÁb>è>ó\72ßÝ»ñF
0/#.ªíõXüø¯Âðq«u@>ÚþX×µ9¼Ð|UÀ½ùwù#¾¿ªËþ]Ñ/q.!Uëk11¶þ¶«N±¸¾±ÇÏƧyåyw* ÈY\*"ç±^3ÊïyÃSÿ°¶Tq(ÇíUq¾P3s:Êêø½}Y 4ígIízV«#Ýú¦v±ÙÝ Ô8rîÛØá÷ü]µwÆ3H,Dgyïçdñ²ÄÎéÁòï/\¡·.«`=¨²+xåÉ[Z$cª§&öªÒ¹#)CdWZßüwÐ32Î4¸soÛTöä>µ´üó#)µ¸m¡ú¯nZ]dûw+çü(AiÈÉÛ½)ÛÙãáXÕ¤4SÕðq¢e;ìa½·¾3d#.V &·!:ÿ%F}þXÝiióæéx®)»»Ëº!Òã6Õ5©nûD8ÏÇÇñM@\Ôvàª>Y]YÞݯÌsqP»ãYgÛżèÔCYpNöJ>üg°l¶TÂMR½ðAK¹M¶¸Û( X1ºÉë½ÎÌø%¶dñ>#)¹ö:._/qÛi;ã¨à×#.TSÂg¥#)GÛ³#.úi£=#)]Ö/íivجõ£.÷l± â¼ÏXõi.bD±ÔÝÂ9æ:FÜtÂÕ]Ùí·nË,âJNy`·ih½f ÇuqßÍ9ö6¬ë`²°{hRPåDú@]:ãÓÔh©°q¾#.Î$vmVÐe~ÚR)sa:ßì9ØæQâú¦ÙBBµR¬Xª#)ëÖç
Ä@K$RFº/þÊ:<r°8æCú ^e q fraÅ!¿ûwï×NN\ W»/èFRu(ø1æï~ìáaÒçcÎwÇÇ$¼c7OX*ç^æ#*9i_b Dê-å¥,ÎçL5Óö+jÀ¥yQÆw
ùOn£¯71ÕÛ~céYÏÊò~íéâÇYàJ½6á·aìgÌùoÏ$«"éBÐD]7Þ£@¶Ö°tÙÚ8RC{õ½kÔs\Qö}KÔ#.³â-v71Äy¤@úòsÈu5k1zSç½:¦êìtR°áÞÛr]ÇßDÚ/#)T&Ûã(ciZ£L8ÕÌ:ñ'#)#uX¡¶(:y""ȵ\jîÖ»ÝaÔ$(Ë?êrÚêM¬Ù¡Fg=ÎwÀF÷+öÂõJëȵ³ð)vpºtÖçì¶w;§M^ë¼XÌ j¸ù2¤>ù#)^Ëó}s÷©#%â'{ãÐGþCz-£wüÍÝÃÎN p<êö(d1çwQÑ®(ÏkÐ|3i¦U|Hmõ3åÛñ߯¼4íü@ «Ö#·ÛüøHàÿÃ^Ï4$Ú§4`»¼TÑ:$9k,"SIK{õ9qt"<à #)2òr#)W4ªNݹß>å¬róÚ5 @øíòªö}{±>øý³§ªþS#q}¤&Ê¢F#.uv¹í?^G ʳPÕ +d>¸}¶Ki±ouCôÁÑì;+$5#)nÄ8m!#%Î#)ÜÚe#%7öøÏúòpFä§U<l[äÌèCÿËáéß©«v"0ÔÅÎú¡2*)â|j@ý{ÕÒb·2á%;v/góüÍÃéhW¿×o£oM/øâÕÜBUk8#)ê'<ï±ý·Þý¿~`¶À QxéLQÔ¦cZûpdpתhn#©(0¢Fà7hlmõå$Ò#%òÓ§9 ñ#%;ã_=ж=1öú¥Te:?ùþ0úâw5B0®'³`XäåU·è,mDÓyb㧠+óCZþñOÝó¦?©kûK`Û³\ÿ°~DhD[#ûæHÞ"³çtÏøhpÀÛc/ÃPû=W¶Õfú¯ßä´Ö¦böeº»Ýq|ù㮯Ê÷m,`?&¸c¡´ÏW0ãîËMZë wÆ?»HÎúyv?©Õùx9ÂÙ õ(m¼¹ê`ès®¤Å}ÿg×}Þ÷%¤vpt ©öÙk
ö3hG£ç·÷:+2¢aR¯)¬) Ð=ëÚÃ;ìE. Ëé¬XB·<Rê#.Á'ýøöaÕ9»ò;õÿ+ËÏQïd£Ó$jáâ*ÈÝï'p<~-YÄ+¯çZÄ©s¬&Ò÷¢ä¬H *HoëÑyé#)oTUc"Yæëéôþ/ÓÛf#)Êëϵ6Ø<à¿lûá¼J°D¦³>QZêy®h&Ô-M¡³zâÈPjÏ¢U´ð¼UBGéôü;Ä[uÚFÕâÜò<¦ÍðÈÅ=˱ý¶å¡D9¹NLÓ߶«]®_7I#%tú~VfEáT(¢uþþiCzüIòAÁ`akÚ;VÚÑ&¦ÃgÚ*ÏÝ<bÂÙ×OÚEÿ¦¯F¬0Pã<(çóiÿe¦Ã¨úBbb/Úؤϵé·ó¼äi6,##)=¹û0nµéHå[=ú¸@c#.ÚÂÉmo"õ(ò¶§GöSwk9ÇØÄaúó&õ¨úqu£à¢&:Á
¡Ð¨#.TÇRi¡ùê¥ú(E%õôßõ0^|ZÚáàûx5§®TC0Ñ`IÄÑÖ`+£Ù0 sGegàO/·néñÚVÒñ#%1ñstdtå±hh¦Hòä";ßçqwNí0ØdB/Yú~Wcñw3nqMïCýË-Z¦v]ñ,4]n¯úºÖõõHØå«¡ÙE;D,H±¨Ö2©é£ÃzS¿JtmËâ;Fÿ[RÏ8>ze<aÆòæ«!qñÝ¿u#)ÆzNëiÆé¨rP¢ýW¹¸_b¸¦¬°âvlfoqã´v?mìy߬I'·Ã¿VGDxªE°ïݸé®RTü'm¹z#%å 4e;U¨f¢»% äÀØéßV!ÕQ¿8ú4ݽ/ÇÛÉÍí » 3í×Õ/äáXéûßnµô6´ÒßS,vrD4 l;{®=kçuç~0æ²Ã#.ÕNn;ãKÓ»$ÍS´zF×÷}¥×F(£ SÚ0¦£8FÐäÈ]Êc!·RÆ®§ók «eQqPF,0Å8[WK0ß~ÎgÝuOµ¥ütÁ)Ûì¹ÍIi&MQ`«)6gÈßãzÇa®vNþgSWwÙüà §M$ô$ӯ⿫$ãëXæÈ+̼æõpÎ axÀ(ò(®a$çJ&`Qº#%¾!êûrà|¦º;u)¿pyÎÆÔìî
óØÅðÁ
¯ul£8t¹¦CaÏ
UÓ9#)ØuYæ\'£³ävÖîö~cg>îëà<t2lyÕv yÝôVâ¹z±ÛFq~¸6sõZéÌ7+8å÷e¦F¤xEãÇy+н;¿
Ø2Ûõ@ï¦Â(_5EÎKÚØw2gÍ`VÂJ(@V£÷)8¹`¬Ùí
iyFÂV©k*I¾ÀÝpýl^p9ëóP¨]ÛÉû#ÐÌêlnnÙOÞ<#.Mn¯hg
iËÏùÂaÌ#C¹ËÔ%0ü£u°¬J«.5O¯¥Â§å|"A²þ:ì{>s±Ö½o£³ÍÈHâ1Ë°èýMìdéܽ8Û[#tóøäó÷?¶ém×io%îè:áTjzb¬¹·Õ\¯'¿w1÷{Èe·R0,ÜzXÙ3ù~ïy(¶gÎÉjº¿Õ¼
çú}Ï¢^g59÷<èKøÒÒU#%á¹ó37*½4¨å-®Kc¨üØNð(68âÂØÂø¢ÉêVnÙ-¡½î×w.×9±ÉB)LYÑÚü±§¡¡ÓQ½~õ¼npøéÌãïy!BIL,ª#.Ee0Y¨Ú0CÕÌ8tBâR ÒR(;*Vå£-7Ô>ú纼ùÈÕlthl2:A¼o#)J=%~ù;Úª(ûåØ7*ÙiÙ¡A?P¸ ÅlaÌ«d1W¶<£ n±¹»l¼¦èýv9¥>îu*8P)"
VìÎã&B¬Vcx4±4 #)Þî¼{ímÀ¶ã¡ÜkT£«ÃËó:®°ÒÒâg\èjød|:Ã4ßç&ö©Å×oä;úúN#.Yvgò¿¢ÉÜç[W;ßM°ÆdÍyöû-YÞy^>Ûgo·`¡;~"8¥¬oSü'LTá¡12s¾4!ÉsucåÜ£,åfjº^FS`bª7&fÒ(T¨*TÊ8^c#.Å0ùíââÀ4V
R®HLÑBó6ÙeÅ ÂòãsþÿôGåµñë¿1¾p¦E#)JV,IâºjõWܯ>zÛÅ2(ÅJ¾ ¶æ4#)³dÉ@Æ% Ü¡"^H%U\µVwÙYt½>¬fw #ÃÇ·_¿Ö`+d㮹öløÇ0DN£¤òÊYT#[Åìþc(RÒAZÈýܬÔM$-ÊôD¨Qhâ1A·HªL¸]Ñ?Iê>¤×® 4¸B>¡k¡ zc´\»n9ÇðÛÖÑ*e©WSÌÒ|Ôòó]y®Á®eÝ¡?[Ú[1N¨
¦À¦À&v>w{Èp\p¢ZKn2ØTº¥RZ#)É%Ƶ©_FÃÆççáµnª%.éTÍîR0¸Ð³ÞÛU2pÒø¾Dµª>í3ò¨?*×رÍ1Ãî[ÔHGâ`$øíiWÂcÅfúå(ªµEEá^ï{ÕSØNy'fÈç}®¤cRxhd#.%<°Y-}K:8z +¤CÉzµÐ¡HÕªJ¹hý÷ñ#%cWíÐÖgÄÊI%]-¢àwfJW1@§#.NÁÇOt·à9C$.®ì'PÖ&$h@çÔväƺCó(åüÛ®Y¹Ï+^4S\¤Añ²¢Öö6¨Ùúiý'óuÓ½¿6?°¶ØKVZî*âå#)PªkY§Gûĺ-#_)²k{`ÜûkËázQÌÝý?ÄÀlLdC@kÇ3»²"²:¹^nbE4¦ÚÉ(dY$êÒà:Â6#)Y)c¤PxÚµMѬØkïs E`R5Ë(!.$Óç5Ö/«®Ø¯#)ù«åå/a¡äh#FMXTiã0Ñ ÄØ!bÓK³#)ý{ΣôÜçBJµôõ´YéTÁCÍXè¹E#);s×^z«¾lô#0
1i%Ù£ÉøM»tÍfGîîïå#b®rß^±+9©I§òr¤]Qçå§RÏȾ½4ãø}ó^=ÃBn¶K-ÕÍr³`°Sb».¬ÖfÏfoìíí¨:£ÌZiÞ7®SxéÊ~FäÔâs `vÇ[¦e#¬ázÑØÁ*ÕܶìÆñù_êrðuÂÉI?UUJr#.)±ûuâc|¡DA-M¿¡ÜÁFËÝ.>L2ÆÏ´^Þº³\~Þñ ?}Snù*¿çiYx¹ÛXïÕóù¶YÄCíÔäÜb¨ÒòîãéÛt1Ød0ÐgYÆ¡Õ=î#)Ù°ÿnäÏPýKáÖÌ_9Ïìöa®µ$ÚaTe!:)Úéu(©WÔvùÞRôÙöoÅcmÓÇ'LiceJHZÚæ1/üGÔ»½Ë?ÙØ)àÎ.,±F043ú.ÛräÊ´66R#!òòõáU¿´\ìÃCâöË#)ªN¸'=1þtàÓá±ó*xÁò0¾©îÅr'ã~Saÿ0mp¸c{Í9Û»ÿa¯#Ì@uÅV1?¦×ÙI%KViÞ°ß qMZ@U:ɬ 7¶¯ÂÇD]ïiy÷S&HõºX¢*%¹VºlkrÔiF Ð!ôÁdÎ%Øb#)½¥$ÁJ,ýÙ©:ð.w±#.#)5aÆÞnözøk´4á]]#µP2C¨)=g¬ôñÎ#%'Ø#%öúùùÖAØøòÞ«Àyn¨7Ѽ!|8¯ÄõÕñ9Õûa.^3ù5)lÊ3§5qPh4#.ùûu~ï»wþýÜÝ(3íP+(?E"àñC×Aé;6ÑÈ%ä¿ïÝÉ°gݹý»ýÆ>HdôObbÀ«` ¢ÏÐM
¥w;#.¡÷¼bdöf¸þÊ´KÏÀÿ
^jþ[\e¯©*Wf)YU+CëôT(RwB'|¶õ>ÈxìVßÝóÏÔ°)øõXõÁ{~rtü6à "Þ.°jÝût;®ª¤fß_W7%³¨ü*ÛÍÌÿ§eçíÇç<,Ê
l<~½ÚößÙöëôW^ËÅk¼a1fAÒ{D8ì\æI#Êx·V-óò.y<Q-´~¶Èìô|ø ¨ÖCÃƼf,ªaNb7eÂÝ|Où5;Ní!ýÏ¿5ûº®xQV.WR¨Ê®Å¹Z4´Ü}Uµ±¶í
±³ûºÿ#%ÑÑÿÂø?
«Ô~Óøû3ï#%M4ÐPòvsYl*¿¡#%}£ÚTwßìNÍ[zñ$Hg#ÊSòû·»ùûñ|y±#.-ÏÚÐE3jK'æ«1*X_¦ã14i±WõKàíªÂ$ªh©CZ³·ë_#.þÀ{ÅM» YSõ!pH"IYQêãF**½¦ÛÚìAþ,L ³ì¾¶hÅlw]Ô·-úçãï^ó!ß|6þ¹îjå(m A®jýtÔ_O»÷õ/3¶°Q(ã³ §âþvI%0ï{¿ÂÑ&HÓ"¼#.gÜڿ󺾴^͸ÛÔÈè(nUUS!;¡ðÁ?oÓ÷&'[¶ª¶-")f 4`SC±H=ÓsÄÒÓþ~= ó«çsË}ʽ-þ7vc$¶?Ö^Õãeþ£÷SõµbÅòÀõâÒè&ùÌà i&.EÎk/ï<«/ùê[öö#)nAÜÜz+xñCÀðTr
@JE¯Øû ¯~¯ã}¡¸È(;£Ð&nw9A³brdÂúÉø¥®*Gÿ:äñ~(ø ~r¡B 0?¦äÓzÃ"MD°íâ%SÖ¯4/¼3oZÁòaîúRb¡aÐzmDû~M¤7vtªÂBýµ&b$ýiL%¡·Òôÿ6îZ#.Ù¹Ð|Hï;üÿMŧÝñu_àïÂ1ôO°|'¼Fó;Ž9 ,6yóðFÏÚ?\Çø[!W¬=<ßZåáâ>XÔ~££Þ°DÐ}ºÅÍfK.ã}nýRWã_W0¤[c?WãÄäA¶dîo2åh·ÛJ«ª5r,Ç'-ùæ=ÿ¶#.9#«ÃbX
ÊÏÇîÏgë]¬¿vÕÐõ®ÿ7º;cìmT¶Nüs ÿÏ:U*ÉmìÝ^'¥ToΩèøê¹!úh#.ÜÆ&¼ _ÏæFoZRþ¼J´°ùi¿6´#%פüY5
¬ºGÇÉ£M!v#.ß'gsÇ;½öMjaÐs]Êà\£Nù2]nGu목ïWÂÌH¥Æ.ÚDK#.|äþýUåØ{¤ýp±÷aÛðo(¢¯ûü¶rFóü;ñÖ&3Ñ"RõÐGü6Dô9ÒùçO_ZÁ±yµF"²57`Þam;¿±sZÜÛãû(@c
iêZzt1î¯<ë£ô8ÚùnÑÜ yhª¦ÌÃ"qR¸çìëQîªaØ þ²ú>G0ð,ÓÛ[õÔrâVéYhTÐéÌ£5~©#.ÿb¹0!0ì! k\ ÎP=äF!2¹äªÔÛú?Óû³¤OÌaÛa×â öãÔÂÅþóÙò²ÆÁ1XLûíF¦PU#)«.~tW®¨áYÐNt{_½õ>[lر~Ì#.åàÈ%zlb,H#)E3ØþÜz?oj¯§Jù#%ÜAJ¤@7AHK`ÑDQT}þÏ`ÿ÷ðå©?µX6vüÒàÝ?zÿ&þ: He\áp±
%°(d¦r
ûÓÈGÅ Êû2¬±Å:t_î¸ÄÐÙ¿L>Ì̺¿<µjì~:ÏÑ×Û/7èú&|ÆÍ|Ü°==Tþ8ùªùõõUU8p¯Âﲿ|-«Ï8X.º¼#.[Uuß:Ôȳðí_GWá³Në´ÜÖÇ5Ùú?d;36jù)¿e¢y^XyoÝ2Q;k{~Ïe¬·ùuõòKúußõÐëxbpÙ&Ç_ºMà:?]Ôÿ~ÝòøïýZüíÈjØýòfËu¿3ÎoplöÞñ`wWÇÕÍ<¸ø³[A×Çp÷bñåæÉ'ûSÓü§ñwÈ/±<Éèù]¯C¹ù°Ë)Oa®î#èznÃÝÔñȦ¹¢9EÉáÎäñÕl¯oçVé6:^×þ·Þäê¦+¨Ú2¶ËÃñѾçú¾5»w6 oå*Ëß|3Èó¾|4iÏë}QÔòÝ®à¶çCVî¹UQv«¹¸çè2 EMánË;k«Lì³F»#)}oéaVËVwY]³îQò¡·)çÈ\,sÄòØ!0×
¼4d\çs+_¡ÉÕ^l¦»¼¼7]ª®ï7%¾-{<§V¢mþGùH«Ó¶}º®¿¶æälwlÉ¡âPð>ço'BÆC%,Ïá\¹ú45D 'HO¡û÷ª±Õì÷äÏÈ|óð+õǧãíºøçW}Ïþp/z¾ã?o|NÅ»UÔGÆa¼ìÒ3@_×®ûa¬*¾ï¾¬~þ-VÝÅSðuWV¾A×ôײ]8#ò\lÿ8Öd+ý2´@Ìð)wÑ'`¹jÂèôÃLåÅ~'z(5ÙßUþ=aEE"º'×äø6[où?õ~9b=WÇa¿åO'ò÷gª¿#)òÆé:0?Ì+¹ó6»%ålÞ°ï6ü§WÄá1¢û!aÃÛÇûµøãZs!p¥,/5Þ/×ãkòírúkgvÖ÷;·ZÎ2ªr½_ÛÍìg|WɯN@W¼¯úÒ_õônû³gJÅÜY#.;ïÃÙÒåÙM³×éþt«çÒ9xapøà}ÿ/Ëõ7î~]¹õWw,#%Ä8QØú|óßá}ß!±_[y¦òów°çêüT~÷rm6³ß þóòôÕÂÿoÔEÂçóqGÜb%<µ
8¯¾#.÷ÿsùâÖOóQiêGÜ$#.+1ÓK6.më÷å´ßG'åÒ7Ó³¨_îÓú½\.áü~o£/0ÔÌÚ~ÞÕn)èªÄúº_¹¤ùiùr·Òj!tfÔ½h:ÈÝ0ý7rÞ¿Dú?·¾~¯@ô¼nãÉÉâí¸([õm?@<4j@~ÝãzIýc¸{?j_È>×÷Ç3|%{a¯[l³Û1LeâJCGñ¹Â·WyVÁégÉì>/ÏVtöÃ!AÙú<zIJP>ý^ýõ·è> Ztöo`ÁYáG¼¯KØSòÉ ÖÒïB¡3ýîzéé ¨4Ñ(Ã4ä÷qxÏkêêýýýp»_' åüäxî°±_ØÜÄ|W.W~ÙïªdÉ}ç¶vSÅ4QïwþõÄPvL)ë\2¿Ë1u¿. nþDíÎ4°IòJú
=9¤cad#%£¥Br5IºT©×\§F"ô3J¡ ªq6`Qæ5.ðæ¨.ÑXdÁ'# ¬fc×].´FFÁëÓ¦Í=|×Õ¾á¼GZ"#¡¡õkâR:7þ½òK+¢cÂ5m]®¼D½3$°upÃ`3|_Û»-~9åþk_é×ö¾.¼¡#%:Iìr£S¶WÇQCS)õ½ï
(Û'9¥L9#.Â<v3Gxã#)×FM8åÕl={ã_ÚËÌ#8|ÝÙ2¶Ã^Hº¨ÃrñýsÛ8»ñÖ9~gªÇZ:CoçMûOÖEîisÂ<"á®ù;iKÉãQâîõJÑ(I:k¯Úë«Ñ1m*ò¨ç½'
,Ä6è1Ϥ]´Ua²4p¾ùw<«-õv<eíxøáã²ëc_´I!äT¤Ê$4kÙ;N¤ÙÃBÆlrÉâpvñGkÄе #%ýdzñÛ#%AYãï«¡¾q¿C«â®£8¢z³¼wjʸOSvWJ§Rq>æ{>n<Häz"#)|qæK¡ðË×Ìa(éÑ #.¯Ó¯E]6ÓU?«®ê¿cáõ´©zÝÃnzÆõÓ:Dòæ&LÏì,l¶³lÃ¥ñl½6ðãìºä¿·ÀjnL%À^Ǹh?Sjaä<æýû'<¯áÃÐÏ÷ßðÄk·í¾{¼#:ClS$ju ÿf}Îì%`ëÆ/uUºÉm ¿ÜêUè¾évþYLcçíF 1A²Jîh¸q$î´¿Ï1Põ/Þä*ãf#»ÍºüCª{$§Ç/Î5;2!ý«ÆílÃY|µøâîü¾|³ÿoØó2|éù¹Î@÷½åmVܬg¦*XâõH¿Cƶ]ÔcÛ[£#)mb#)6,##ÐT¢MÛ¢2,$U¥EDXé®qd0+5wr³,ÍTthPÁQWdÇ`a¬sZM&BÈ¡#.Hìh4ÔF2¸äcè¯NhÓ}dµAa¼C"oú34Ó3)Á¤¸¢6ú"ÐÌV6hoë½ÖôwÈ^-g(PP|ÿü¤Çe¥ÄûÿÍ-#)j9-EëÔåN¤,;#),"m&HFaÇøü9é/ßü/Éòrììû÷ hÒ¶2Å#£¥3Y®
¤Þ ÆA±aR4!¬öâÒm7#°RÈÊ£ú#%-&iú³}8'º[-øf÷ßd»Å:³ÛÐ%ö]Ó&ÛYùñ¾æE\,çÌk¯,¡d§5+Ç~ªoï¦RÛ6o˯Ëhñ*Õõþ¾ü`ñÊ?+÷îÓô¦±¦ôçü4oË3¤ÖR¯Ã¹Þ~µUÔsë¥ÞháìúHf`÷Ô+(à ò¥éH7ïwÌ]mÉXúÇw/öýËïZ<åÄ ÊWè·¸#%á(Ô«gÕ¹²Ã£áÄSªîÛËÑ×®ãÉNÊ·#æ{ÓsXZwsuÝáÓÝøý~?Ë)Ð"ëþ1lGÚí¤s¼þ^O_ìî7§øÙÍÙË.ÂlúÑ:n¯÷Ïöeç²K &<¿| Ãça´ ä_j°(ëüPy]Ù4¯ü¾PËV2biºÈRmZ$VÒ9[§lò°TkD42TVb¶Æi´I6L¥I²)+·}^kÓ^î½×FÕ*zr(0ll"R±BÀdQØZáaW¬fÎÞÊ(ãµs1µ-RµD-FÓ8Û È7No7sÁR1®Ü¢nEL£@2-&0pí«Îªé²S@ØÆ:D6cIfDÃ3#.ÎE¤> ;)ms8$
¡Ã|Î(Z*c)#.oZXUÖ]WC9©LH$Ê#.DV>õºM&AÞÐJ´±"®B(ÅÒ¢0«µ2£ë¬c'PÎ]ÒÀæØëaÆi¶M,ÜÓvòè½CZ/\ÛÈXB/µTýHa/ö|V?c-&1.#ÖÅèuþjO·|ßu¡ÑBñʾl=®ií÷ý#)~l¼½÷b ±Sçú¨~äÃàÿ_OØ8y´òêpú1¢×<SÄ3$ãPzô²n:#.)R"ÉÐÞi;aAÏg6h4#%¼ö/Î_IgÍûêçñ«KDù^|wÖhþãôà&²ÃCH¹ï|ó>@ÿÈÕtÁEqqrÀ/1IFgí)ØAvs¾ ~}\f¤K¬ÕPsÈÞPg__as.uTK2ª«YÔ£êGX¼%iëG#)½!Â=çyÁÓýó÷ÐÁx HBðï%þ#|'#)Ê$[ɸspòëDG%¤HhÃüÐ^äöÛd&áð%ßógÍü°×ÇÞtí×uÓ°èÉþÎwØ7£³¡c;jH ©u´0UØçMbá.ÁU@si÷oÞûª^wV<ÚD×V{½Ê9%£ 1U \¿×ëmªFÆHG"Ä5þÆ+`ý\ºo6Ñ/ÅÆ;²´©{wòGÑüþ<=¾.|\ãõö4ÂøcÓÓîtÔ²`X#.R,FÆzsaéÉ(W:&`Ç®Ô+¸ÐLjá`dhiXjgK³9,mÖµ¨!ÐYXÑ æ¥fõk«Ö°Ì#.Ô.8Á¬!pfa
Q(EUó½Gzð"10±TÖcÈãBM'Ö*dÛã$ 7ùh,±;ÚBVïÈh5`£yTîeLzDl»Ì¼"*Á3«à,°@9¦Æª+ÛÕ§XCZ¸ÆÛ
2SS¦¡ÕÃcRbfÊÅÑ`lfm@Þ§jU´hî]¦vb'Hn ±:ÚvËÁïMÕ¹p\ÃJFÙøþßóèhh#Ã0ÖÒ^V¨UX¬0ïeÂëºßuïEÞ¶êòÙòºzZ¶ünw#%n¦\x0#.TBÂUúüÒ(T¥#%! At[³ñpÏ7håøӶؾ*xë8,:"50°{±f+m4Ów#.l«2
³ó6(ApÎÝøû÷´};éÈqµBÝzQ<Ü6£ß¨<=$ùÈú¿NÉÙ£6¯§ø;ùò°CìÁ\.ó@{LÌ8qP¤ºº6ÅbÂÒ§üÐÅQiwxc۬ϯ@ÐÑCr<"æãË%N§k©Á§ HÈ#u0³~«é"sΡ¬1ÿ7XhÑ'¦ï3µ[P6p(wÛÀ¡Í;B-¸ðBÑn0ÇFäbÛw079µtªBʶóþ?Ç'fÛ]´+)½HyJ#.%e[ !0?·ÿ~?}ºcêöóþ[ù%!Ë羧ssçËÁÜüoø÷ήºÁ8 bª¯Þ`¾Ì>æ,¼q&EËJ#qn¨ÆÆì øîp\ÂÁ6AiÑ
1`°d"þR#L1ÎxºÓ 0d`ûII{ªªvGUÄ(Ù¤Üq6æ£ò1E#Pm§lpr4àRð4«uì¢ËBqµfæw²dÅ1eLáâݨÀò
L9RAQfD Öo½+#%hfÚ¢FR¥ÓPCª !¤YJ(KðLÄÂæVøÁVDu*èóh±w¤È±²qÆ·&9$8`f#%p.® Æ3m>vh.AðÜH/VCN5XÅàrÀeɤJSð1A´ji¥BÑ-ÀÔ `éTydh DªöcÁ^÷}m"ÝIíåi1´N"sUùX~8g@Òá SÒ¦6è;Uç16é¾CÂÛ,-Ã<iV ixìòiÅê¨&PL^¾* QÕÖ~¨"(!EÿyjBßÕaTèY!;ê{bPþTëcA·ÖjÛÓQ¹&SÁ0HǼíÆÃsgp#îÁ¶ÛAñ±7d#K'²TîÞJ$F"f(U¹Kq !6W,ÔmÈÞÕ*æãõcj´I
«pS¡Üª¡%
ÝY^ئfÍ{Ýô^<êñ`ì8ïM´±Æ63QmÌR()ï¬(;æªöÕÞÜ1ÿµBñ/cúͬÕ
(#)§Ón» È0ûÑÅTp¡ÚÀîlìn#mrl;SBG AÄN`CÅÕ»¹:ËÁ°_ð"%aûØqƼùq°dÎÏ#®®\í;lÎÌ1nz¸ 4Û+Â~<âÁ ÔyNÙ$q°L®®ç>c"NM$$1âÛ¾,¡|ñªÆÍÒ3µy¶ÐZï¯#)K£i^ÆÜ>QÒc¾ò+U]äʨ;D¥ÐÐkíæé "w]rÍãrË~Kl@AÍ #·eFÒ[žqlÖºW*#ïÐkq°Ü#.#Ê#.:27#)Ì.÷ùÚw¡×qFÛQÔuÙ<EdÞbY+z}Î69¼¶wM¾WK¨ÀU´ÈbCL8fV±Rã¢ýY±ÚOcÝ5uFæ:.c#^ li²ZÈã\ÜçnÌá,¶X-9ÁyȨÃfú9&øD!.15º]Ûµ`ÑËl`äy&Ôeå6^f/³Ür¯}º1Yý6ø#l.8øÈXçðv ìIã§èÉôÁx|ïbh
ðªL?ý;ÛcÝÇVvé^³xÃ8Lhº4±J¯Íÿã"NeàÎ"ê±ô2¦õÓ~3/ïürW»m$§é3¨wð©CæårýDZÎ"7VósðPZ¹ì`.#)C¾*íï/ÚȾv©|h]¤)\@ÙÄ¡eó-¢KEp:^Ù£&x9S»K¿#.ÚØ£Qߢ?ÕÍ®ÒW¾|êM2a2d¯xà%2êuÿFÑë¼DÛw¾âÑpGJ:·h¼'z¶/¡¿UÖriò<Áz:s¦+¶úÕÍW÷}·!fw¥)ix5ÆgG-³ ¤aöÚöÆB!âÙÜ£ÂäßX4k¦+(ê¥LãpÜÆI¹×q½1ȽÏ29¢tg#)]éõt¯!I&ãðº}·B]È×xÃã4]¿µJcm4| ÐÈ<áÄHL¦tΡÚú{XMy@Y9Fpt§\c69ºD±VÞºîë]þTiv{9î&CÝ8U¿¢È¼on-å&¤mµ¬5[¦0¡³¯'ÿ0É;Ç`ÉÒÔëxx®ü±Ú;+7ÙÜIM!*§Ã)Ññ¨wÿ£nK¾r#P÷N6
»¶Õ¼¼¦ÆE¬v¹ðLKqF}Uxþóýçéýp?§#ÒY80] ÛàôKì4õ "¥O@ ¯Áèi+¨·ëJ²\;¾Ã©T,W8<±ïGd§âsæísµ¨@,®Ð=ÞzÐïtT0¨ÙêWGáèí-+vâã§Æú+s6Æ|[¿;3àõ·Ék Ó»Kü7¥U×Fn@-ÉÄ9Á6ËB@ïçEÛ<4¢¾å4<ÆuÃM9ùy;ØJì¿÷/xö©@0!Fb%pA>éÝu½/ç®Ko#.*i»[à3
#%Ùi0QnzãAÚ7"´
pßÂ#)ëXZ8ãýxÕÒR¦¹<ù"#\9_â#)ZjBtk'^9DÞõK#%¹GÚ#7{_Ç{ð®óÁônŸ¥; k8ÍMâ^ð°ÙÉý;}.HÊus]èÖ9AÖÕßùÛ¢&óÙº
x`3OÆëêÊòÏdRÙ,¸#/r £iUð1K²¯ £LÂ*ôk¦£ÁÜ%Ç»'ÒÏ®ï9&"_½ '6ÕÅg}'ò%Úë3PîÕ}&
I#.JÄzÅÂy¶6öëQ=Î×°AAüäÕOµØØAä,7tuÝöQþ3º¤ñÚE%·wÓûø*=n[±^OOBêÞzNíË9>GßHøqÒt>#Kº>½BöÆQ72I8ïxLjo<3Z˲ã¢(q=îèû§y5êLÓUèÍ;6èpt$Ì60dǧéÆ5»ö³ræOÞKÇ¡fó»=×æ-§Ýeü éú"M<¸3CTÆ8l¯U¦²OôOL³ªÃttëAN¼øi¾ºÓñG×V<(ÞàÔ×ß=«ëæðÛ=#.ìËeºê[UA\ûëºæGþç_¹7¢ÝeÐÜ;Á#AùDãiá@'ø.s>ø2d=§XnY5ÆL!vͨ)JkC9%ßi¸yë}X¤´ZaÐéÃóÔÖÁÄqã~[Ý·^:+Ð!mÞ¹¾#)a°©¶æÑMð¬/,Fe¡vG´Õò ñìuþ_!ïS<g"(Íbílòô?/}ØkG¢Àµ¦°ÂÑ%´ÏÇååêo~óç¢ÿ qtN%Pèî".½¨ãÙzìSÓ§c _uævË£C7ÙÄ4ÆçOå_Å1ø`ñ\3tGNûÐØá IÅ)D-Ó¾"¸
¹08ä
S#~)þN>ÅÙ99~£·×ùvðË#.ªut¼w?16|èöf£ð+ûMöõî=uKª`Þ0ÄËÔÁ£Õê DT}Æ,íúÜpßg¤inkõNµ¨{ÿÅ¡ßM¦¢ðÿ/GÕyT:¼zuÛ@f´ÑìáK¨Û¬9;$Ú`ÄEk#M~Þsáþ¢çÓF|£qíeuè`¾ÇÊU¼(®
ú+Q#¸öÌÛ×»ÇÖ05¤lÕÅSþ Aôþ*Ï/âp¼|6=}½ÍÙ8Æh'ÄJxx¾¶øZã$Ðùa#.%áZv»{WÞ>ØÄy»ôÎ:sÍɤûÃFÍÛÍ4}*Óûñ¢ÚuV¸68ÏÕ·?Ã5;¹G
Åé0²+JÂÈÊê9}ÊTÍ6²áFmõGµÞ¶ósßÒ&×J/O¼ÓXó{Q®c'ON¬K:öï"®²¡ßÔ·Ó¥î#)E;vÃ#ëÂ!çÈÒx¥]^vg
t :<B,R$«92v£´¥ìL
\ê îK¦1-jeÊ«$TÌ3¶ýº'I°³G½6¶écÏZ E¹¸ñ¼ö]LWíÚ>îcYó÷Ç¥ZäNwÏC^!üÞuqÕúãų¸.HmåÓV3ú/8Îå³Ñùãaz½Þb4¶oÔï}¢ÐMT°ª:sñ8P¬,µõÑ4#T8æ#)m}¢¾ð<m
Ì6#.s! ;Êà&$8§ÙT#%ÎÊ%ÈvÖ.Ò\ô±ò@ÂJ-P¼ùÛ5¼Æ÷lEI4ÕxÀE`c6©Ê¼ên«$ëêtó¶½ùg=¶Ãl$qdïÄ<ä7¤y¢Ã¿;Ì ¾âóפÇFC3fÎèP»W§!#)¥P@[²LÒJbFýܤ¹ßÝXw¡½j1ôsª=hq?òÃ¥±µ }Æm1¶Û66Þ¦ÛÚïiâ]w¶Þlº¤ÜË»««¥{CѬö/wÔI%èî}{íÜK©yÚ`´nu¼¥®Ó¬Ì´Cº!f«ÈfÂ^z}}jínK'I<"íçM!Ñ÷QoTy6ýúÎKHß$J#ÈS]ºdem¹µ¾6/,Bö¡×_Ìÿ¡µÑÈâQƸmÙ¬QwÂ"`:yP˲ãïä±üEíA;÷6÷_®Bé-O
<÷1ÖPm+ÈÖ8Âù8gQïy|#)ø|zËÍk:M3ÀÑhwçtÇ/+ÍìF!ðùÎÜgÃò.¼`ÆÊ£<gW¦Ä®ÛL\ÅÊ °ÂôzK°$»þIØÂòb}CܪEtQäs5¢ª* GßÑGF5¨ª8[:?«¼Ù+#)xU:{§#.\^«kÖÂÅÔ"¤¼ù¨ïfp6Utë¬%l]-õ¸EQÛ#mWeßeg²ê˱eSRýÁ±®½³qªME/ÏW±e¢YAãÀB©Í˶±KÚçpýZCªòV w=zr]sNÿßRj«-AÙªßÈþõ¡qUÖ9ð±Ø)zívg#.J*MyD»~|báfeõî®c¬x®ô³Nvñ׬M̪ܤ¸¹çx\>ï«^\íýýäðn{wËñÇÏ·;Þ5ácÓ,LcµÍW.gÎÈVù#Xº¬ÇrßsÅ©ÕT0½Ô¬0êG^"YzylWx~ë
è¤
õ¿4âÛmo-^¯yéRÊ+²NtîñÈY% ÈÄò3#)\×dØd3¿4*ðtm¬sçĸ®¦aöKF1Ó}n²NØç©îÛ9a*Y,f÷<w¡pÚª,»5*&UF϶ñ!£©Ô¶Ue²ä"¸,ñË D>ÅJèàÝTðxßÃ*b£K5k°ÖFmÕDM×Ï`ëCf|%hx`Îç}7÷ëNN<çbQÓÝÓ±h~\p«ä÷$Ýðïíí,Ð9ê×>oEO#QýG½É¬;Nkù6ê½÷̨Å]&+{úÇ»5ö%×_qwߨº}Ñ)8(×8á;fÑ@¥Û ü°®EtÝ@ÒE] ¥¼ý7G¦|¿VO5)uzìÇmwÁ¦ÉaWùô¯UªÎ£³Ï>o£Kñ{ÈkêÙæ
ÆJ¯?6gsOÊZæeáyä¸à©¼WR|o9ÙÛ?us9pL9+'×=:ïþüDE²sÞ<¨PVø°l¨ìæØRÖPxÚi.¡6î.·SqC¬îsÞå8jÔ¤èáaÄÎø¬&Â\bm0´ëÏ3»nå]|©ú æí<´}Fü<jÂd^˶Ö{¹,`à*à¦.aH)ædØ#%¸Q^åì66®vét,#©Ñò`ÁÃù¨8ÕÞ¾^wsVH´³é:¯ÚÇmà6HÂú0¨ÞRè׺4t»â+/p¦mÕ6ÚãõIêqÛ\ï0¹Ó&§cÉCêòÞü¢1¤ûG¢ÙxV¹ÕsëÚÌðí9ëí¼óøIÓ¶Åìç0ÖÎóJXßÆ&½Sd´9õSÿÇ®:[{þ[,3w;3É»ÎT!ÛlÓF|õ¦$±Ñ¢:°ÝU*í¸{.ȲØL$IÆp0ÓfÐp:[Õ]åÞùQ¥*076öiø[r||zÙþμcaÖ·'Åd+ßç]Ô|/F£bNÓe¹R~ÈFµjônÜ',kªâÈ´UpPö17T#Ø-®R±#.HLé#}BÊúélé¥À`ùHTçm+n"ùTÂúÖ³¾Õ¤¹À×ø,í÷ÑÔ#%Ï[9gWs¡:8ÇeضÁn[ãf*ÎãÆ#.ë×Ã=çÑ#ïÖ©Õãî_-ïu(Ä¿ l÷Y¥bYöG7.dd[ÆV JDÁÁÌ÷·Xåß©òtzmíqáÚÍfb£y~m°»Teôp
ÐÁX4(¡,5ºÊâ+Üýps²¶,2ÆƤêâÁÏPgjjMܱk«aª©èÉxghªÃqZJÛêÊ:e6¡µÒÝkÁº×;0°hg×ã`²buÂ]àoIê¯]«bu8ó¬Ãfj¹\÷8+i{íß ÂÖ0¦Uå˶ ÆOäR±PéÚ¶Z´#)1x²Ë#.8lÖ¸ÑTæ|þj*ül`Ä/F* z¯ë®ös}wûtþ |-rô¿½ªö;ªðæ©n®ë¡oÑÌxéN|Õ_óCëðÒ®Kl:(NÙsõ=RGÞ.ŵêëÚ):ð·ÍÿZB$HRzóç½MpcoÕµcá{üdÂ).>Ò'»W½ó,ïr¥Ý«gm]sª_Äô° Ñ\'PÙÁ¿RçvôÎ0·¥O|]µî¢Ä>+e×Æ^¼G<.o»kêíäXÖDõqöû"³ÝQ÷zÇ÷Êp§jÏ0DÈ꺹ôÞøÂëQ6¡T÷ý³~ø[ͽíîìO½ùÓDºØÌnùòl¬9§ß:<£>øÛkÛ¤+¤pïaJ¡JçNÒ«ZL .¯®©S1$BÁ¢Ä1Gɽãà:ZLrìX×Mòý`´½DJUoë²RÞ÷Å.~vgòyó4Táe/ÉüÊöã<:Ô-±Ò«b88èX8]Iø«gN+/w,]fn1BBæ&W¸8hMJ4UÐÌéü¸GEÊG¡Îé ½}òÝP7ë·¶ØÆ#.½ÞoÙªLí¨iKQ³m²±Õ¤ràfÓG,&±díYsáIã-mUk 47rm«cøEI©G%°WñÓÒÓ0Ãó¯ÚDD¤1íW£{÷Îqü¨zRÞ;ù¿XÚÇ£IO·yÇ þ#.ö¶µ]1èóÊD_./_#.@A«<GL/Õ51Rá\T0þâ2>R,¢åR¢à*k #.E;J\x¥W+° 8@ @N?_VI7öÉFÇï½ÍZy¶9´s»V#';Ù[n6"ðsWÚ/¨¶¨ý$fõ¯`ôÏ<À©T6eÙmJ¨;ÈIë+]H¶ëØß^³aóg¦c"%Pʲ.{¢FSâ(fbÈ7|$¹reæ5H]
|çóù u÷º?ÿ6º·Nm6TÑýOô-4«Qnnk`!yU
úª [¶ï¹pÜqнb°)É[
To¾aX=y¥Êöøk©#.æi#Ìù·3l2qtÅiBîqQ)Éì°Ì±4~¹ÕKuÈÙVuQ°
3ÐU®ÂÈ#.¯x¨hìÎùí7»EU%Í~ïæ=³ÒPAÈBØöµÐ´Y«dg1Ù6qí*âÖTsÙEs^õõI¹^Q k÷+NL°¾Þ;põBbT`w^ÒáÆ»Ó4/S£´vz}çú+å·<ùEgµm'ûªé·åÊ=õòñt^µ<ÍÏdFßÊãéWeõ»íu][EWT»W|ýeï7¿¼¬ç#¡ÃÒ{©Ïçç3¢^ã¬Äº¡ÐË9)açÆKö*URóm6~b7Rt#%8+6C¿¡ÊPH(EÏVó´î^y<]#%f¢È©_s=¦²ôXà0éQ°KæïP%e#%âµâ¦,¨J´NcE9eÕ#.¹Ý £¤ZÕPÚ×^3ieÌë»b*Ç--Q¸vØÖt:§x¬»¨öG8ÈBB`PÒMuO>Òõ1®" ñmJfù7²hB#.¶sk
áÓtÑ%É-.ËuÆ2«Éí©ÙqdÕd½×ò|#cf#)m¢9ÒFóÓð»¨|âÈ#.¹÷+IUdeÀDìª=/eÊ_"
}òñnå.{Á¶×.}¾1M\93×WÑwÜÆʾ÷ëÏ<îº>&5ÃÏ{õEM¿º¯í½y>²í^p¦:.Q
ÑwzeóÝêMÓxqѶ/iEty/¤¼ðiÖ¯ãöóÔ×ÙåûÍ)'LÈpÿÜåw°Á;é]·Ô`LëøPûÝëÅÁÚqÞ~;ê$¿Óo<±gÇÙ¿Ì佡Ñâ¹ÉÝ6¹Ï¸QÚÏtí4æEÊ«s@K÷QìM®½Z(©ØÁëVeN;&ÐÃ$µbqu´Rä<Ì8µî"3Jçúàê¦ÇX6(åê7gHÎ'§ÅOWBXæ°hb@®ÝoAþE0lΤsèïßwùY×W7pðXíü}&ëßÛ1[Dr&·<Q ªØf³CÏv"Bg7ÂV|½_µÚ÷ùSëμé¬Ôõ}´úæÚW ÔãF«EN_$j2aÙá¦è©?¤-z'ò¿³¾ìCϧ\tþysÙÈ/^"=qj|jý<ªÈ´:-m¾ ¯×Óñ8ÕìãqpKÉÐdÑQ#Z¿wWSÆqb#.Eñv}Ð¥í¬Ì"ºAåÖý'5ðÞjRRÞ3ÏÔwtàètp?Äú{ãÈÜÇ:ù[ïâÜè KõE )Iú¿ÂÚx¶=è6¨Of#ËÈÕѺh%UÞü^A[wi®ÚIº¤e%ÀÖ1Í6m«ÎvÛÃgr{l+Múö¶ð%ÓZâÏj`FpB»¸NÁÄ`ð¦v¨~Pä¯GÉ:g}ÒÊÆÙ9®÷$ÄÕ¯·ÕxþòÝ-Îñû\sÔèjiÜ)á¥w¶¶#.Zd8^=ÍW#)êÙÎ)ü*Ünà¦dÔ³Iè¸ðü7¬7,î&
·wKºé|ïÙxÀmÃý<ÖÑP Üô½{:bÆgo#)*x|+Ï
ãE,¶ °12yÔeõXK|软bQmþZì«O3#% {>ëÏZ«¥ufæP"Pt0ÄR0.`,]a{{-Ð6uhH+ê®v?DÞñ#%ºyNÕNh®Þí^[b4gOpl]ïA÷ûpÚÊÂé.B#.Nß}¨>/JîZãúÜý+UK`èÒØÔcζôAJ]ìÒñXÞvuþ£[Úk_#) )º÷Ñû}l|ÊñZP5'rGä½Tþiû±33~~Ï|¼DºÚÞàjHQ8ÏÈ:ÜϸÞ\زVVQ¦ö%={iºò0 B¢ÂÖ͹qJ±iQ$Ó£«_ªôÔöD!mÚX`Qåf¨âÔ2s!eéó7*ùFLnW/l ðãòx]WÝÝâNøWÂ|%,«@
>RÒGïO¿7ÐB3àÃPä¦Îí¡µòál,ff·ðîâé¸,ô
æ(»§ËúqÌ°|¼ïel./î; rÝþùP⩶$´oZWîè¨RlÂ,"© ¡Eg«0ï`p1"Z@ù³ Ç OßßFøÜRÛpË
̹iõ!Ñà}§Óªd¨$P!7Û6uó(ên}yØ¥Lk³íù*v«âÙêÕ£ö§2?µ0Ù°}ÒVäÁUï *:ndF>p>¿#)½Á!`Q1bøýýñäÆ6¶sþîCë#ìõ:ó¬læZKïü×ñÔCB£IQ¹\ÏìÏìâr=J(xþã9óç¯ôå½ßþø/=tú×JÔÍh(öoSIoó#%i¡?'XàË \B£Â¢ðÚº6-¸j%]6T>#%Û¹ËÀk?>ï#'×ó»S¡ZuÜL3æá=#%5$»9\¨88¥ª #.×ÈÂ0øà®MøÌ{¼ýY0¨Ul(;WÃhýX¦2`q$OÚýªhuD1Aú¥ÒMz¸Ùoñ¸CGâ wDã*}z<ö.ÉÛZk#.ªÌ·"hÚvß~>¿´s<7MiYeS#º69PúÑã².<K`p_á#)lèØ*Ôh+x¹¬Yp 9² ÌÛÁúÐï¢G¥×JXkaÕ©Öþ·Ú3 KÂÔSQdS/m; wÀÊ!öÏlGª
D5[ÝdtGgÏü-¦5ft<b*y꡶uÄ1`á#.ÉÔ[(´ÇÆ*`/LÔRçadIAPØ8a~ÃÌaÀ/éÏxQ¦,¨º¼(GÕƪ7ôrÓ۬Ŷ·;ÜOëRy°:»úsfýÓ¤39¬³äùÙVçåE=¡eÄÇÁí#ª6M¼ýJÃÄ@,|1í4·»PÏZ8DƸ±>¹#.Ú\°èç4Ø'¶ÎpÓG»h³ü·âN¨Uè ëEeW`ÞÕE@¤^i@ýý|lÃ7¸%í<ô¦ì¡Cëm»ö÷ÇÎÿ¦AgEë÷\k£~>4¡à¤ü÷éñÞÃú³÷;£ñnhAÂüç¡#%;ª[^¢XjãÉÐ×N7«Þ®{ÉâX})Íùü#§ÞS¸8éþ[¡eÇmaÛ@êÞ;UROQR#.ØénjïfQF¥±<ÛÚ¦9÷Á[:ÍU0.;xÛ¢Ä8«GU³'3¿dÊÍb^á´Ò)@kZ!ùe@Û;TÆ[RÄÚ`ùmsGÈ%Ã56Pá</§Ð~óVwÛ0˦¼®»ÎL(#. :Wk¾¼
:án¸¿,¶jÓDÙa#)]Ë~7Ì¡^ .:øü1Æô{yØ<p¢ª²¢³Ãßñ¼¤»wE÷sQÂͽsYÏo¸E:3¿ð ˲¹Z'cï
±Ó£<LI!Iǵ1-ñÑOªÛç´x!lÒ§_OLð6Ûxû¦02,Ê4ͨëAõí¾<äfû?Ú\úîÓn²E¨ÄdRrL¥SغaÑÙþcù@óÙf«y²JeʪTTyºQÎ yâH Pä}UÕP#.á£'mÑú¬pÅ=hØ-º² î&0y<¥NÉÇ£}.0|¼ßçaå#?ñ²Ò媽¢Ap´'V¸Õ¾*d,Wµogñ ']á)¾mÈ®Vã#)°²0äÁ
±Ù`à6fo'5!ªK¥·<N_á×Òzdë åbé´G÷ô÷ø#%ò2äFP×[±Âã=!ÞÍò&Êù$r0©.ðµö«±dÚ½ÉS -ÙLµ6yû¬M&X¤Óí0:J(õc[sƤ>§p#cXúPgwÂ#)!Æ ÌÁ£"DmóS¤pygF¨al.&访àÍXã¶lºCÇ¢ùÂÛIiÃçs-çÆqߦÆJÁÙ)é¾²½¦Ñ¸oôn¡÷ð7($ïñå ìrÏ³í»¾lC¯Ë¤WáÒ_Ý~¸÷uÜ£UìARw*5_BeØË{AÉ-·0{Oàng³¶½ó}Û®33¬¬ #%Ê|~¥íÙÛ#.ßo¿¼É~2Ã)ç Tôà1®rk[aôá¹\¡UûOà0( 2Fj\[[,~5Zfïr (DêäK-À¶g(º(þþ1<6ÕbX¡¬e°Pq½ÕWxxÎrQ{ÀÎwV}+mû+P8Øyxr(̸FmUÌÛ-ÇØuþX°^éóqZö»Fî/Z|´Ybn))´D´¿ÝËÅ<Cû)^Î`¸ý!ÍqãÁÛFW/ó'³±1~ë)¥Ý~726ªÂ8%°@-²J¡éÓ¦ jy±"ìî·ÆFuÕ e§àümR«.!ö#)ö¬í_!#)1ÂѺ¾îÎÖ3P½[ãédyí»¸NºEô
/Á^Â63=!Szã¹Óº(âE1PóWPQqN`åj®õoÙZ¯"gmÂûüQ¯|ÉnEø#.>Ç#.Ó|²2#.Ê oÅm54¯nÁªºç#)c2×ìºÈ¨víb;!/Áï=té_}vØ!ÓÛÑòÖFÅ}ïxL¶7Ƽç¨ápàøTóú8z¤ðã×ïí»'ÇTxê4m#[OµtKß ú7;તj62î*k3<L^-~Dm(ðÒ¦§^¡M(üêÞk!ÆÒB ¨X5=æ»q<=²s¦>YO55Õz&D¦|õòÏõW!^¦BÐõ¾j©7ìâúe&i Ù/7%ùìïoéPq«&½Ì@bö[¼0³!gNT)¹IQ%2#.jçvñ<&®®æy%àøE¥J#)fGJ<#C¦»¥¶vÆø-»Tú0À<¦»]¢T{ÍØr?Æ·¹2ó;5#%Þc-0ÁÀ Ø(l¤^żì×DÔà¤0«¾aóÀpIfsIØAòÚ>eX»8úfø#)NaÐã©«J-$ZlaM§>í~=ã§9L5[¯¹7=6g·gô_ÆIÂjcw;¹òì#)3#N¾mYÀ¤§¸Ö¬Ä@Ö#.^âgä¡âXÆ=Oî®$Î¥¡îëÛòµÍëÕÒÛóïÏ*®³õýì)gwÆ'·¦ºDMP0ÿs<1sZ:ÎÆÒ]/b5*Ý
Æ(ÒJ¬ìÿ/õûSÀ;jg·ïñyåÛìöaÿþ¾¢ ²÷ù÷UðúG·H²/¡~$éñÞ{tz÷£åìöPþôµO«O^DX¨ª°¤ýèv!iüf-&¨ýÿ¾{zß°ÍügÕlþ[S¸=çá=|éVÄ.å°8yzup(MXÔç/#.[kRfU$@r#.ðÚÏx/²xU õîùÃl}û½Lt;ór¾6'¼Ⱥ÷zº%Ë÷UPé{<1°ã´ÒËéé°ãu0p`¤
ì§yFúTÑÃor¢#)Æ:¶j¡Àôgfß²/ÖßþîoÙa½¨!»Å_ ðè»öäÂm|xÚG -g¶CN#)%ûº`UwçDÒcØ%@(þ£Ù!!ÉݹÎ"k(¿á9Yòª((J#)%!ëü#)ºé2Ö0íв{Ãȳ_Ð|0{ýêßøÜüÏù¿/F r>ò¢Q}C3ûíÔ¬ûùýÐ;]¢æ-0ÿÐ0;;}°Ú/±nÜt
.Cͱ(º Ý1pEJ$¢aêb¢c:"8
õ6(qȲ"äZSLl¤pn}#%\À0[)`?\sòpÉ4KRE¸:.R:nPY#LÊêU ç²Âü\°)@@Q±vÃ!\ØpH*a`ÂäZnAPC8«ü¡mÃÂ?ìªÕìóü;;?T{±Ï0z!wHJb byûåçÍíß:k6?#%,Ç>Àßý¤ä¼+ô0Ís«
É:]ÓäÀ!Õ^DÚëÆ¿<ór
Ëô´ÆFd6ZHqûÕq`ϱÑúâ±>yñ4ï1O½Õ=<_ðlçYiÓ\ûøg mÒï^ë'$]¦">$0eíçÕ]ÑIbæÝnï%ó¢y6Î.y§®®MR#.I
·mhëS½îïɯ÷÷ð«qi-¤¹üÕN³ÂËýí0±ð<jÓd®©gKµá8ÕÊè4ÃNÏ1¨ÈÔOOØÕ^Öhê¨ÕeKþ7hø´ÅÙ¼.ôynÍkrí
±ny;<jnÇâø#.ÈÇêNéòÊ=òôu¥¸¾ÓøMJjvXË}´X~ðÒ}rh^Þ ï5%txHb~X<}Z.vLO"Èz=DhQHHÁHH,"FF1Þßaé;2*z$0PôãáÂÐvX|ìgüW(ôÎ9s4°Rr@ßc$Á'4ICÕ$)$H¯¨#.NiTT DüÇb¾è¸m¿èùóú¶wHfí:mcI)ÚAR¢k5(®&\©sÐ'l+vÅ] KBjCau0i*Hh§AÇY|ÅËO'@ô ͱAÂ`Þ#.Ú0dÛ«M¼9ê¶IÒF6thݨ£H¥¢¦¾'O´ã\2¯'×ÌÁM*5Má¶\ËÚF;ÍÐ2ÜàÒ'¡ß x]ÈõÄ2X7ÓØÇußÛÂÇ©H!C×K"jS#% Å;Í÷K"q@ïbc(¥(Ú*ĨÈm%[µdÖÞ*ºZ¯lλñ<î÷Ývªû>î%%¤ZjP^5ÄÈõ}+îën_T>·Òd¡ðtH4´xÝ$ Ã\!¸àw¾ÒÇ)È!¡>Ü;:Þ$,Z}ɹ> QÒ¾wCÞ´tðĵ=ó73Néññ²=dÒÁTEAsÖÉÎjæ[;ä¦jáóñÐ2lx7O#Ó°BçÌT«]M´¼2ç!´¼¶©)e&I$e¼ñTÂסIsÈãcJ÷g}N£\;ìPDP±K¦+aÍ05'#%ÐcTÄj ÐED!E¨¶óùwȱh-_2éFvÛvÞàîdæ?.4Ný=u@ÉÜ#.´
QZí×Å
j*2,aÞÌ7Á\3*gczètÛ¾ýó×1<Te²CP,C)7ì÷òåÑ8mßʽ ôú'ÈW~󨮺ø±f5
ë):Ia("ç @Wá¯~jõxÀ×NlcHî=$j(^ »Åq#.sV*u×+Ã5°ãD(H¦4ïçGJ³§°×SJE,rÎâ çÇ|Ë#%Dz³¦û|}¯w²ðÂ-0l`ïЧnª5 O§^l23¿*<%·_¡àîqõ|¬ Ê"¦ê¯xûPQ)u9øï}ó:«·+©p÷s¦j»ºQ-йñÕ_?µÎ@Ò'8N@å·=³!¬#)èõh¾HdÝùÅǪ7ÔûÖÅàðq¬OêíhÈ$õ
9¶ð|4JøÔ#%jÈeCÀ"í PZü#¥ÀÐr7éFª©Dï
ùå©Û´ð¹ÜÏXY1Mù>~SKÂZ=ÍY$a8GÕ?64Ä&Ȭ¦õó}Sa]{-WÿKv<K3|>^9=̧T¦·[7'¼£óòîÆO6#%ÁD´&ÕH¨LʾóUNñÃ}ߨz>=G}zH|;Ufå¬yÙïÝåê>÷NFîÉ<Óè¶:3]=.w±CA"HÃFMpnñåFú*#)òÈÌÄ°`ñ] û4»®UÆ^í.vlcM-U#.àzlQÅM4£Brü>vb¼êåòªX|®#.!zÑä{¸qÇNôë¾YU»ðð)Hþɽ¡
°ßóñ¶YÒåWTèæô¶¨#)Ñ{g·»7Û@U%±ÁU+È*}H)Ø,ßØp@iáAFÎL`Ýí×iKÎM:~#ñÃ#)÷ç%cÃÜçîÁÕ"Ý:Üo^¢ØFûTò4+éE'0ܹ±ç/fpZPÑ)PGºY0M2¾Ø´êµãfzÑÓ©fç²»#.=ñØ_'UvØ;=/¤ !kÙ¨¹î{Ù÷>o}ÅvJ.»ó¡ö=Ö;<ÏHcð!¬ñ¹%Äî{fü0Ô÷ ØTVU;@éÛìÐ_f=k<ØgmÓ`w`K"ÞOýwÂòÍî×)ËJ¡È¾¶^Içl8æùeÊZ]Ïså~ºqÖÝq±°g¸#.5dR#+Äât¥lÛEP-ú´Põk¨¤X°¸cQÓZ$oÀÃq²4Ñêö{¿¦Îá 4ÍBµDNoÞT#.#DH@ï
¬&pñÏ{®1¹^4'2g:j¤¬AÆ!¬ï(p'!0Àx=:£_ Ð.ÅMצÔ67Ðdw}ö7Js®v)YáÄË©]¥ÅbÃÔ)T¶Tàûþª#.ªÆn836ëZHtN«
ó^hk³6uáïºsåÂàaÓ·¨r"#s°ÒOä®å¤5¨1wßdÎÀgëËiª &[룤¤9Fc¨vÏÀõnºë#.7ÀÊTáâA1ª&ÉÐðFã-dñ´2®Ö1&̺ãTã©saoºïµ·HÌMÖº©413Eïm}-zÕøØëå¶ÅJZ¡q\XwÔÜöËRðq*\ªÚÑ)Ü×#)×Ë8¬+5ÍaXÛ~ÛÔ÷i*5]\í{³µ:w!Ñ ÑJ;"Æ#.)¨ñ(¤ð©à²`Òl÷Õ}ÃMØSgFÒ@àb½(IÉ^§ß\ði~½@1ïòÜ6ñö°hÄsà´¥ý_,!k¡ÇæÏÝõW è±ÑþUôÓ{êO}Ãô@ë 8Íd Ýëϧ®Xf.4!ä;baÇù<9ïýºO²Âç`>ØV%ã|²cÎDù¦T_Õåý¿àÜçIóíÓõÔï#%Lq#%MoMºE.;è·ð|Ù!äà}5ý`<g}dü@qr¢yyñOÆ¡ÌÃ'Ë~ß*;úÎÑ\óøHuÞ2 ¿é~8-¬Óñ×oÛí`³¨ëL´¤Ã_lÓã4 $Á!}?Ù«ñλmÌE·ê%±_ûæÄAWô~ÁÓÀ¨0È#%<¼©}äýZÖ¦& åNg1VY-%Àß±*Ôʪuüor¡ßjÝg~çÏ7N#%è^;Þ>ð~Òº¯y9¶¯z!V@UþÕþ·èÿ7ú?ðü/ýÙB¿íÿ¤éNUËIbû¨åZ¤çÂ**ìwÝIÒAZ²R¤=gÁºXÄQÿ ¢ãÙY|³9"@ñtf:2¦deï
ÊÏE^^@_¦pJ%\BH¢?®þwºf¼ûýDôJ$*JÚ{Aý¿êÏöä åvçñ¼cûøpRÌBfçåÛÝåßãå}Q½*³ñ?ÈÃ#.BOìJHái/ºêlFåIKçê¯gòþÏkÁù°8ڨ带?_í+¯¿o¦_kx #Þ bÊ$X±F]ÙímÂw¸ç.uBsºëC<PBÊç LÜ¢ ö¬.@$©åF8òiãÏZ¯«KúùÂÐÜõÔórÌFéA|ìVTíÝùÙV#¿¯Mf{ò°»toÒh&9G×#)qÉ¥úkÛ{)aPÞ#%íhgE-÷ÙÏúÌïÇòBð^Q¶©õLñº14ôM">_¸ßí(!!²d$műÑãêÕëµ=tGàU)n1ïå÷IÙÑOLsJY0!#)(rõvl_êðåãßW
³`µX[¯wxó«üç;!i"¿GÅãaìÝ¿q°×¯Oõ'ùYíaÁ4Iý ÒÆ"$X²ÖrªÎXxÚÒª¹ËWb¨I8bqË3#.¤þÑ98YáÓê6þ«oÏݯßýæ{\;ÅçÄð~Ò dD¹Ã9yç¹2tñy:zv(zª,±DlTþÊ#)µc®µ0e][ý]°jøÞ·Û§ûf·/@`ÕsÉÜÂBMFN»Æ¨ïküÕF<âPü¸6mà@Ü{l)cÔ
sæ#.;(³îúÿPr&=$õö `H$ÉFïÜÝÃñâ¹#%|èS$FwW+tQ̬ªØfãâÓËQäb{¹JkrãxòSé«®Qýa§<»]̵Mu½\s>8ðû2ËÚãû+ô$rÑÿ»èïÓ`©ÍéݾJ¬á#Ò¸>)Ý+ìOÐ[TÊáQ²É7u¯ÚwþLùhácÑÜ:ôz`æåztr:ä#·0b÷H'ª0;ç#)>ëðÖ4¾ y:4yEÃÆQ<¾$¬ÑCçËd³ÛÅÎÒ¡#%pX8DE³àù6jÈ2#ó9õ þâðÉá§ViT>E^Ö·EµO6ëd#)ê!çÑ+gd+k·Z¼L'£ï¹nj21º/F (UP"dQÄ{Uäø¥ñðëÖ*ßÃ8 ÖÉ2%éÑÃ^ÎoìyÊÒ®h×\ÒüRüNð»=ùÊBÌ"©Ä ~>8[w>z_ZÂ3V"rDUdÕ¹ïåXÊ ')I3Û,"êùcËIØ¡m`ßl]ëì]K§bY'£Ü¹p\i mðPû¦ÏW«ªù *"È-Rhz¦êEýÞOÎIÖïÈ¢c¸xÜ<D=Pñy,T#%,#)ÕëÁu¾rÜåyqÉq×çÉ>òC±û§ï<qÄû®èÍç°|øþ1ð¸Ôû°Á1¸6ív'KÑ·l Èzè&å!Vú%#.ël-<i1/5aMv4Èj¨åÈçE"¦F¿*©ñÀÃ4w#)Á+¡&dF÷Má%Cºìùx_À#%@û9î=ïµOQ¼Û¿fú#)Wjµ#.#%ø{FÔ#%~ýíç¶ëó.Yå³K¢ã«|6*rVûû¼¢lÒGGfXc¶ìÐ#%¿ÒQþ
ºöþýaK# z3z¤>2?² qû$§MlBç}µý-å;UÞ(À<Õ<¥è6«ìýJúÐV°C("*©Üõu>¡ÝÔ3¼û²Ï U_ê~ ²®bÝ׬¾ÿ"±R?3ÒJëﶲz_Æ#.í¼ÁÊuNúÓÿT¿:Á§EíðwÖ¡w#ûóεüó¢<òæXJøÛÊ3â%ùìð)#ÉV¯>Ê»]íé~Rê÷15Ì´±a1©tìÌ8ë=ÑiªÝÇçüîHzÃtò[ÆØDÅUSWwô·G¨EáèN÷n¿¿J¤¸ÿ G[mkÚgDr¿êú`¤QÌDcãØúÌguÛé1Y¯3Ä:ðîȺáÿçâb¦³çZ®èê^ÔNú£mIþ×½gý;ÁñÖøqÏ4}¡e¶ÖPé{<|o°D{6xW],°,µ@ëeÞ«åX÷ÀbÞb£GjÛ{Ö~÷|°#.+QÏ CÜîÞ¤fÞzÌGØh)<K#+Ú¥ýrüù Ät=2Wa{ñºë¸eN!þ#.`JÕKé3w©ÓU_¹tª4_© uñ ÷b¬w©ïÑåÎÐv·
¾Mç^»Íà¶bµdÁa"?8í#)m(½e±T£ÄC#.æÁõ¾iS°ºmÅÔãÏ{ª·N9û¢e¿b¯uuÕÒª'¦ÄcÅTÉ÷¿$æ±´âè»Åó¬ôμV§TÐcÚÛ§&"çðwpÓv3âû_[ã¿ç´4#)éÎîR`¥èyå~øtØ6UÝê£n &KÄ»BÔ;{ü@zU{#Ñæjä$hxe>ëÕp²²¹+@)ÉEÃ"½ø3%¯×ökMOé®þ¯`îÂ>îÂǤr>uQPÚöÒ´òg2Å5ÎsC.ü÷˹ï¿C¶Ñð[pLK¡öNÊ(ÿ¥ï£1$:]ËÃ@Üõ°ÀNo*¹ç#WJÄ¡+èÌA©FýEPº'Ô#ü¯Êç9l»¼S¾ü>¼>ݨÿM|hìÙ¿>86wêâQ3(w^k?LuYÄ1¸bmëi·\o½mvÈãt§\¸Ep¦§'ñ¶Peßàî)Î ¹ÉúwK»ºXîÑàÖúÍ»àÂr|¶?©g+¿×"Ý1ºaVµ®zÿ£kÉ{ÝßúzþÎmÇ2øV[X³"à©~?²cÈ ÜÅ9QúGcóRG¯-4Aô%zâÐ#.ü3¿¡:#%æû#%ugCìà©L+hò^Â@i8QÏËpVºÌQIÙâu5j4AâMõ åAe'ìºj_ïâÅ6@ÇOHøm¶vZCû*ÝäH2_æPa2R.È© QÏJäpÌë¾ÅY(îMgoÙpÜÇ}ÉÚh¼Î¡¥<Ç2·áêÓÓÃFÉèþ¶>Á;x"-?[
#õ¹_<àèÅ44Yòr°PãFËQôÑàBùìrUÉÍAÖ%϶_Ö߶+¼äâ¬Öèàò¶»qþVó!ü¯¥Ç^½öúü×A¿R/úW\Qiw)ãfôGÙåéåJ¾y$[ySÛ1%såç[¶ª#)1P][fݺEõV×ñ¼?¯É¹?7FÝ4ágV,ÃoãÒ!Þ£2yY!ikoÈq.üýgë>¬u2#.Ô±
Y_X×ÓSÉÎõ}ÂjÊI}ȬY.ñM¼2ù&?eÐ. dÇÓÒ¶ú#.H6Ô´#þ¦âe^ÉÃÔ,mìóµCdGÛº3lO:Ï
ì%%06r|«9¦M{Øýu(ô|x½Ü! Ûé3éüÍxùEÒ(O"ÌÆú|#N!6 ÛuI\:ãð#.±´Àív7«UÓ¤ÎüÌ2#.µø
í¥{ÎTXzTÊÐvöC»¼±,f>?GÏpÛ2ϳ('O(þ*¤ÇÀgA´vwßéÒùÁt{:aë´0ÔÂPäõºOn-mS´© ãW5¬
üaJÏ1
õàp¯=m; Úb±§ÔKF4);8ëL³îBzËJ^ç¾ßÏ&SàÃG¿Wm ¯z§Ûc!²Á¹ú\ ,8§{'D_â¯ù·xøJbûqµUÊUlê9Õ"jgUWùv¸çLe \÷Öø{§=ªRpO¡V^B,æ* r
:2"zRÙàk[¢zP¼¢¶ÁH¡ª5í¯B#%ZHâ/¡ jÕΣ
#.øIàEª|½eÕ´z㤻(¹ÞÙ$$%|(#%/%*ÁI+@#.a×¼c%QaKÀFñ¹¶\ê°}2#%ÎÔ×fí{=RY:¾ËÛFÌg§Å(^þ¼k_\åì*,*¶E½ÝV+ÕW#*ôëÛOÖgSõ[<_̪ÙëfLÅ#.¿SèqåQÕÇCÐF±ë{PïAú
¡
À#%Ýù²ý¿Xóøï«J¸B]³a`=,-B#%oPÇt¹Ò#%a^½çè05}¾¯ÚBLM^;Ð×µØh ýÚ#¸þ+ù£znîȲ,7ÛÉtýK@¹¿¾ÄÙRéøüa린½¢°êª´ïúìb~³õÁ#)ónèã7KÞø:.AÖ$4pÓo|q[(4(õñ½ÕI#%cZ¿·þaîÿÍLÂÕ|«îôoê÷ßòª®ðZXHz²IÞ¿Erìo¼¹-s°]Â;a°§»EÃÃÐVáÃï,ø± 5æ©Ä@2WAâ¾ñ"hãü$ÑûÎavÑèÚäÕãGßm~çm^ãÃésÒ$~ç³s}êçÙú¿g>n\㤤Ãåæ`¸eñEì:*tß#.fJ~}è«úrª.ï¡=!ý>²ØM´tZ®Á©eH@£jTßèÏIبc¢Óï ö!ôô|Rá«»A@fû×°@AÿìGÄfÚçúæ\ ÃHýb/¡½d9ËaBHì.µþßcÕõ/P>¢C·îvê,ÊÆA"êO!5,H¶µìzÌønSwIN&W8Bmú.,>ëtÞ¼Ê1,s,I¹Óuô#%}8V¹Èzq÷Ó"=aÑ?_Û®úá·qvYq°ìÃZw/ r .à¡ ¤gÑâåâ ç%sÌ3ÁmÊç"B¥AUVcë¨4|5þïe[QºHÍÎ G0#%°µ-PPíîùÞ)¨¢¢s·NÏl;µî8XÇD/°¯miUD5yhÙ³=çâ´§Líð:øÝ5ÄÛHfE :8Ä`ÁxÙ*é¶AØ-ÎÛÙwÀ¶?]çHrÊVFBJa8ß=ä×êÑ@¥6Ôǥ㥽ÜÜÛúÖ´µïÝéû°;¿ç?lV]Äú<îÛpã.#.0Ð#..׺;©j¥Ç¡Q¤hEKÍŲ¹ßÓÚÛ#.dɾṺ3ôü¸²Hûs{Ú¡ßá¸fÙeq5ÝIÃ3(Ðá¾³¯Þçl¤Þw}ªQöv³·3³(ñ#)'Õt1æ5`2z»ðjé=<¸ã\_ALÅ:Ïl¢©:sèvó×çfÚí»Â#) C¿@A Cݵ lt¾òöÀ~E5
É¡w3ÅEL×+ÑƧÔ=,ÜnñرØEßðߤ4®!ö½ðƧçæ4ÊuJU6
ÒÊXgM3Ý`ÊàH%üëçTPáH^ë/'÷ÔR ÕDæWųÌs½réµWT¬ñ±òÏK$ßÉèa#.¶ÌmÚ0Ú²DA1o¯¶8L¦Îu´ý_bØb;Ú×%Ïþÿ7âmZ{Hç]ÆÌ×îþUäFT=Ýs<ô/ÕòéXûÏ(Á³#)çàUkOÙßKbËû:¬ãGêª"W©"2=²µÉÌ©æ.%*sé¨8>%ÀÎv8xÝ <#F68\¹jäRöÍMemÓ÷£ä7äιGUfî+×U*¤3ºTïÛHÙµñNql½JtÎ?ÃY©r6Ö=ï}¨0ðÏR[ß8¬áo´yÄ0Ï,ë fG!tås8º6½¾ÙöfpÀÒçä0ÄÈD<ª±â>?eDzÙd·<v£¼Ûîü'_¼ù÷}#)Á³È&¤³:ÄÄ÷N'z&%À.í^b-z¢Òè´3;#)Ú"'ÉûccýCføbí>¸fç5EªÐ
Ë[;CÙÕ-,ue&Db4ÊyQè´·K9Wc#)#)èâ æM'Â\õ×3iÊÃtF_±¶yiïìÁG\mpýÕyÊêï$Æu¤zÖ3¼FusO7§¢§d#.Êæü½Òg¿U'7%Añ÷öéz]½Sûqɹ$ÌfzóÛÊc7<å½Ý8Î|®ß¶ðëÒ÷èu´ªº/1euµU!X²ôàh ©-ñ(3à÷cpr.ñZ©#)>(Ó!æ/Ú6b¤NÇ#)]g!çô°º'9L·õ%)*]ÓÃn±t HðÌ~üïbÏhä~:!#)Ö|<±``¤ÆÀbA±==/dw¡¥PöYë7JÖ µÇ5L æ¾rèq¥,üda÷£>ù_EÝ%Õz2!}\¼îy¢
*(!ê9°Tu#.ø¨×ζ´Ö°I¢å÷Îðt¿Y¤
amõq²t{'>dv<à»'í!Õºzvê¢ým§åÝ¡a$|S|tFrç¬ûÊ#.¶tÆÄ6¼®Ù/CÊ0|4\©cÑRÅ°¦Á\&ÒµOë÷èpë³/AÖòÚ-Ì2Y.ÉX<úämy¬cªøoÇæÍË
´§¨9@±ÄµÍz~OSJõEáÂBç¦Zô$eèX%J£#%Jn¼A É<·$ý5u§Ë¦í2JØ_T#.ºØoMNõi)#. Èfòvújâ+A0`ááÄ A8¤ã¢©F#.$PIäÂË ÕZ:æ-|¢ã*³j¨MÃÎëÏÐ48cAé#%@ Òë¡×Ô0f®"²U¨LDxï%!uÁ&(è½MuÅ#%rjÞ,Åg®a:;l`Dõ k\LSÕ¶N#%Wp#)Ûâ"Æ@×æ
zù»Úú¾Ø×Ö±*ÑÔÎ|^ôªtǺ4 4ÑRëán¼6æïiº¡Þë¿sAC ½= ©à§A<Ý
E F)=ov*Aº9=Õw-mÍ˹°IrÌÖãpk6Þ:*g1IöYfc·`ê8à#0u/ ¥OìQª;æ@AV¹ 8á<E£T®R+¸eôÑdXë¸#)+ó?Yose;³e±Lù°uy¬i>yRåÌ$#psº Ã]KÞÑ`©" ^EO£>X.eðigtº`åøjUÂùê#.ÙQMO\Å#.#)JUwĦ&øõ¬X]3jÚh¶øÜ$×>A®î¾3GÞL)Ð0FãÎöEÚc5·ÉUÀT.µ%#%( 8Nü³5q×GÖ 3^úÞRÒÍr¸Jj¼Q´õ-]ÛpA'¨kûx«c"÷?Ï`ýå¯eækØw:]M¼ÔÝýñ#)~¡+È/1ûŶAç°BÇÅñ̨7åæçA0z`§5{öUXª(\Ð÷åµò9M͸CÏÐCÂÓf#% bàÊ&Ú3#.#.nèxƳÑj!ÒçUz¸hôî¿@.ÏÖì¹ëÔvÝc GàÑè
¾iXn²¶u,d8V»Ùá{#ÒÎW4uÈk}¼Â«ò:çA=½#¾¸jN,P20gÂÙùðx«Ô/u8+ «?]$NÎ+tèdBEZ7#år°Õ ¹ê|«h)xç{L
°\L\2|yú¹£6zòÐѶ*ÍÈ$ǯ®l#)i«Mââ/ÂÄz £r.¹s»0yÙXm¹z#%zuÑÒúѵ]Ê"³TQO.#fµj9,¢#)X=e¼·\{¸Ö^ú¯®^EIvh5µíf¾uÅ´^¤[z¬q!Ñ7¼#²ªL⸢H'_³¶4dìíâ<7j!`ò´©¼Xý!]×Ù¢ò9¬T')@ãÄت8êªþ\Ûp¾¼Ep^n5Ïû0Iíï6ü·ÆÜk.vó·rbv~ß8°ç´cmÒ{Øýi_[Bòd#%´#%-{üNÖÄF@ï"QÄqÄhSÞjtÖñm×ʺ·G\2b5, ×r+űdó³C6¢ÒÓ+JXMõY
V&ôÑf·õ§uN§Q4Ê.צÝt)§D3¦@(¬IZddè(+}!hW´5½,#)Ò·ÆÑ¿Õç,þõïN!#.Ml\q°`!rIÛ#)ÁáJi<Ú¥¿Xá@ïßÉuâd`zЪ+BÖH(#)ÇEÐ#)õÜ,5
hGÞ©#.n¥ÚëÎSǧ¢¡§Ô»ék* ¦
ËÍü®Ho©t5߯£|ÖºÉóz)t»ÀÿÝ£WÝî÷Ê>/£8¸d[ærüáÓùAh£èÎ $OöYg}Ð]\§ÈÂUj¦ã½FX÷¸t;¡îD6ÆÑNvìcå±ÃlàÏÓG?Gõ}â>~.°YP±õ£x¿äªÄïs¬ÞF#%>øO«rñÒ`gvÖ°>iN¬Uù¿%åí³§ßxöÏïï-+É,8ÃôÝó,¨/bÔèak=Ú*Düd?uׯL#.ªOÄaÒÎÃ>oÌ#)ê±o¢¸ ¿ßeѪTé*p)~ã©þÖz«íÿHì?Ç~ϸ?_·ôMDÁì#.È`#%¹|ú¡¨²±þÍ 9¢QTÿ®pBÄ:ô+áþ¶:EÚÒ#)E¸f
H#%?¥þËAÇVlÿs?¨·~/_UÇÊnuæXmþٶɡlï¨~`ä8<:
õòë6#.$5-À;O8¹^fÔú¼o6ñH§%#.¦|=P³:ÅòHgc´ªc¸#%/ýüÂ)ÒÍré°uH06¼}aÐo³ýïò_©Ís4CÒ.¨®Q_ö@RÀ½Ûîq:Í,´l/rçí»þ|I#)³!cõ>x(¤ÒRd'3äÔä'¥â8 þÌTúÔý ìÿG_f#.mLÑO¶Ô9æ¬P+7¼º¸jr¤H@Æ} fö6(O ç<ç3rL¹$o4ÉUêöK]'ö`"9Òp #%R¨pD®# #Z?_üøý;þe¶Å¶l²ZêG¯Ë°n[íÂý*ê=¬\ÇñMÝ¡ ÊLRªº`T±wܲáóDO¤ÐÜRùRÔO2´_þ\ùs=
¶îL ø°Ó¼ |Ù_nèý
ÁÙËTÝ©ªFib#).37àU#}àWñ¶´ÖÃXTà{N"D8ølM9
(Åbî¼È0ýóĨðeH~=«G bÿKóñ¦«
@ò.I»£á @îOBt@Ü»=-º5-ÚI¤Ó©ToäðЯ´á{OîDÔ°PP²Ãpãàר¸.§pÒ`!dèôÈ`E9+Åxr$s©V5GQl¤CDj«¶#ahpø$þïÖ¦ÈâôO®»ïW#)TìúB÷'ôéï×ãÞ²G̨K·È¨`óRnËx]B¢Q@ÃAc0cÉ_ç/}?éÀþ#%°#.Æýs¼Êñú#b9Þ/ã]_ÁßeFHeZr,3XáÝ`w%6÷QÛ"AÙ;¢ùºia[@RHõpi2¦tµ¯ø¸ê·ßvÝ£rÂ+!) 4^*÷û÷êr#%$#."Jé>^W¡ÐxÒR°À÷ü}t¾U|mòñÂüÃ¥ýµ¯RôpøR,E
&V°h*ß@0tßÄMÁ¹A¦8Øóüýx]Ó6AúæsS·ñæ}«û;gߤ2¶2_êÙ÷È@F4ëÍ£y0ðÀ¶ )bjo%¤'Èi=þî.?ÃùªCp~ô)L0ï§iPITÂ%@K¯³[{ôN J"h §GlómK'ùG1cÓZ²]¯S¸09içßùáÈ5ÒHÁ1vI,
X»·tI!b]í_³Û¿,Øa¼¸»íØ>ó°;b:}ëùÏQçá³^ÀÒa]n.¢2#.tËzPu²ÑÉära(nÓe-³ÑMeö§ý§Ãëç^ù÷cúÿI©ÿÿJ/ÍÂ#%Ëýsx?ÒzÍævWú#DK^ÞàJM}í£ü-øZ`´d¿sÔ¬ßÈü^¯Ióáqµã;YÇGe#%ý>mkÈ~@ä(:-®,XúÛßêýßÌêåC¾{«2$ÙNÓ"ئBËKdè»í½ÎS£=Vå3èv©Bioûå#)ùjÔE"F$Î.r¶w°H¡âÒ#%]Á©ì,Àºöó"@ÀÜí!îð#.L"!eÐÐÃà_OÓþî(jùÃèçØD"U$%2+Ç¡MfÄúñTìÐèôÛ½nqVJ "O^È4h*ûZÅÐϵ,÷#)K!©ÛnV)'©)S[âÃçUä^Ù2[%ÜYHSM&Æ°¨$Ë ³MÊk!"L#%´ÙÞFu¾Â½Áª!öÙ0©MD)®·?³¯¤5¯.ð¹`cÖó2$Fæo!äbé2y
®â]L2$#
Ç"[îý=úß«¨v»oGÙÚ
Ãû>þYÉAkZS?>k¸Ü~ÇkÁoÝáƺ{ïY7LF2(¢(]ñuUtfÿÑòº¸q̪5þ ´AztBM4UUÐeC®¹ÄD.èìÛÆdÊå¦ÖN$LÝ#)µLTÍk.d`óRêÈ
wUoD¡íÊP4$V©©MJQ«û°¹Ä8Âo÷¼ue5i´3nF?º-ÊeÿoÈÊH! ©Ê#%} @ï&8PÖÒi0ÚNÇQëýþÏ,çúDêOÌï>^µçÎÔwÈÐ"éJÀV¢#.ð.M"nʸ"{Cé)KBEgw±>Ä}¿jéݸ6Ð%¡÷îõZ7¡Ç>Ë&¡$æ"B_©ä>Zâ³÷ºüy³{\àO©<·ÐµôZFk"Ù¡UÞ®Í`Á$A¥²M£ê&IÓÿ6ÜkÉ¡dî.I$b°¢IÕÜ:ÊJk;tL¯Ì¼B
°¡Hiï:v6ÏU7å±Ë)ì;|ObpÔyE$Sõ_«BöÕϦ\<^ÌDÔdþ µ66ß#%r&ýtÎi±I"0´Àý«øÓ¡»R(4ÂEeQ!^Û³¯Ü÷§S_ÂtÖxïB|^ÑѲT7hÐ#%cÞ**Or?[²T\bûD
Óç·#þ-MùO@-¥¸ºPÂÞÓ«^¨¦¤*Õ LÙ°¡è#)7VÙØ*Ù»«RÝÂ(8ÊP=égE&'ßïøsæ×Üл4¡/·xúbo1ùã¾p="BÐQCFã{dÅBÓúvCzI ÈÜ$Öww²XÜ2×#%ä=çé,Í6#%æGúÉ
>rágã«v#.¾zLH®A#%'À~¯,Ü~çzâ[ÅníÃø§
×@B#.U#)õB{kçµIóåx5¤%½H#.Yò¡Q¢}zÁ<KO§Æ/Ø/©þ}GÈËã'¹ 8â»Û>°q÷f®H¡E`ýç ÎÐ+»SÚl>¨=ûaÊcq³§ù_é>A#)UNQu1ýÓðÔêÕÚq´CpñÕcØ©ÔEJHÁÀl{ºa2Z5Úö¤Ëw>ßÜí<{±£lx"XVY#%1ØuÞ?¼$ ±Ã¸ò#.#.B)bõA5ø9ûKuaت³M]ú.qC±8=ßnk»©cà¼ùR21 :(rxC^ðOkUóPùú9þü~ÜýeúíòÕGÜmþcêÀ'Bt*úÚXPÀø äÝ ~#ôy¯¢ÛÀÄ.¦=Jd YHz0I=O1õ¾#)³BX¬Dsl#)#%Y"'§ÃòøÒ)'Òt¢1ÀÔÐhëä~0Ï:z~ÇwÉA=TϬj-Ã[[jxû2¶CØ73£^u!rvæ'h
wý^¨êK)ÿû]' Ðxýaè¾ßB M»EaUùc;ddkè²46¡hs¸¬âNp)»¼4E¨râ:ûMÿqÁÈÄ£Àh]¸¨^-)¯%Y³V¢"R>RQÀɹ³öA.&ÕTÒpᱬ*è¡)úéQ8ììkP¥LJO_¯Ý!æª#TJ³¯^{&y¦
®±nFÙ¼Qlma;f<cÃÑ¿ÐïÁÈdWpÿ!Ý¢e ²*¡öxXl¿dõ§è:K±,j¢êàr.ÃÒÂUi µbªH´êvqWÊ·IèDïwË' :UÀêÛºr#)$ïAë5Zvþ4¶o#%É]ÄjªQ{ÞϽýO®¿6Çõx
»OnRVfØÄ#1JüÖþAý*}ø-J¦$ÿ¨§úõYB¿öXÒ9CXåå¥AÁEH³²÷/P¦.Ú»cUJJÀ4ø|ý]}ÓÐwIÛ<l¼øQÔ¦#.p@Ú"þxKç>àDô¨þ_<ò[a©Å2ö;i¡î"½²
Oh8}G¨¸~ÿÈã wb±B Q§ÄNÔÜ}@cõâE#)w¤é¥9ù#)åÄ.¹¹©Ý¥Éx"ýO5Qô.ôµ{²§¿A³|ÛÏà{ÂÇ°¹`±bÁFð¡AháôiõJÐ5¢ÚZdãѳ_à%±?¡ÑÄ6ú¨wG¢ÅàØñQý3x#.j\¯4Öóĸü\q#.º¨-Á#)CºOÕ) ` ûã``Ø©n2)¶mî,{^䮳޶Wå[o¤#Jj"9ÈðCðÅQ#)ÈÓHÐÔµøx Úzòö!ÜfFÆ'ovg~F î$dR+#)j´©
#%s¾´5iO ûâS¯i¡L!GÆ%tAh0"üÿüÛÉ·7ؼ-kÕq²/§:ª±Êøö~í_E>ÆÃd#cD¦eo¯¼ÕõÍkÖñÐÚ·#4¨A#)ËnëÏ2ëSË®xKHwù©À<~?£+ûÀÜGt.ú¼gz=¥#.#.#)«ßpÏØÌEù#%½'´X2O¸i5qÀë0é5¿^
*È~`iPÒëBÄST1@ #.ÒAVQ³bÒC={ £@g0Þ¥
¬îo𪦻8:¶$ðÇo,k§*â.áÁ~Z[Ö4fäèØ}4RMõº6uI*0#%ÔmJ:ñúµkêVÁàÐqâ§,ç¢u[¾j2pD¸À5á¦ì-ÆÑë¸26ipÓU3ä+X{ Dø~ÛÊ®-Ý5RQE¿
`©þ?_¨úR´ª¥<¼ø`SÙ½ó¸| ~¡¦ið#)¯ckU*
üÛ?&ϬZiia¦L0Ô
áa9õ(õ,¬HúÜûX?^#)áÛ«ZÀÐ0ÒÖ©2¥¡ãd täBA·yïßE!ñ`CYtqÅ# ¢9cËîQ!®J@pPäÑ|¡î=#%uz=ýÜòa!7VÝhò:Ô1B#AO=|âPÇí¢À ü(ù?,ÅéáñìWÕËûá!¾\iNöÀF5Ì}ÛB0Ì;â PRQÜ`ÁÀdaèÙ¡¸Ãgc¸
ùÂ}GÛÿM}Ú±þ$¯Ï¿*½!Ñö_êÇ7HñSû~gÇS8:ÃÑ×"ùÔÓ%ÊAó)Uhª='?ñ^ñ6I¬
ÍÍ?ÑÓêøWéC¹A=¾f(¬`¸E&ûQÌ·Lk8z1×»e A þA @\©Ã¦¬éùî×ï;cóÆP9ñU¤R
ÅÀ`áAøÁØlwflHG%rO1ü>À±ÕpÓ>¨\8lë5mi#%³h½Aâàà*D#%tùýVK£SË`º~*r_F½ÍNAÈ9×®ù7ìBÊ-ÃóÙM @Òèw^x9Ù9`1S§#%0óâ%r¢¬;Ç¡@@`ÀO¥³Ú¨Ã_"|½~¾HV|UB³éáÉ9r TÈÅÕÂ^Öíý½÷ÈÀh¶w}
)¯F¹áN¬ýü®'øtu©}lGß㤤#.%ë|~[^ERDÒv¤1"m0þò$&B'9íD(wblNv_Þñq8F¬Á~zwj£ë:&TÉúI¤x¢¹Oʨ´µ±´±2ía]\7Ëìį̂¨kFÁßØ>¦nìÿðí9oîëÀë4½^ÄWiƹ¯Å³.ARa$Õ*XÎD#IÐH^⬸óÇ÷R'8,:ÀrÊ< ÙmªÑOðëƤa³ZªVGhl6.MíºÓ$tj¼ÉPÎäEM"fu¯kq¤`Bd#)ļmRÃmèǺÍçÍïóª#.½øì*Ñ¡±l¶[¯£q»q8½ZB0¬¦P#òi«#%pr£êt!FÉÐùÛ³r¦PÚuÄ{èÁDÐIÓä5?B5²E\½®!'mÛº#)yâ~4û>yÕåáÛÖazågüQJé¥öüúý_ì3ﶶÒwìËx_T=ê¾Èlotð÷9ñîAv/Ñ´§O)_(#.%EAǦ,cMX,9¢ÿBO«müþû>³çÎg3»Á<ÿÛþ+4ìëfñ`9ÈnúªgÓ¿N¯pÍÇ~÷Sz°#)Ù¦¥éÊ#%5 º-/BÒÌÝ
#)ÀàQt`|CeÔßëG,ÃjÐg$H|°@ÐÇsæ,
èJ>Þïpuòfø¾´51úâ29n!"Æ"?»Ø#%]QzÃXð^O´Ç°¡È/@h*<fç_òh*þ_Sqôf6O1ÐSÀq¯pò¾-&¹Vp'Å`ÿ¯3}àôwQZ¤<Ë jbظM®ÈìÁ³©¸ßxQzÒK!42jÓÓ`¯ÃÝð$có¿ç¼û ["#.Ó¢¨²i¨©tS`Û¬+$BCkñÂfgÔó{#)2MBXé{o»Ó|és¨®à
»±òTg-Çs95¬^¢-/¯ù~ _³´Çîh%@û#DsOZÚè5kÓõUXl$o»fð°UÄ#)ØSÝE%$j A»,QHÁCîE¹²Ñëðó8yJêµÑz,ý¦Ðî×Í.@]UùÁÃÚÔ|î{ÍàÊ#%5Æi_wO²âî;á:þ MÃöyQÇ·QPQyD*#.WѤà8?O){-øë:îue¶ø"#ÖµTQlllbn¸I"kËôIDÅ®wÖâþùþr#)%ûúZnò~;WÚõ`XD4n³ò8îVÚ£Iº+׫Ì']Ò¾;¤Ì¥¾Î·µCQ$Fæiñ/ËûIþØÜv+ËuBSAÖ ]O/Í
?%¸üìí'¶zÍ4J¥ò£M[#.kδsärYÈù½¯aÓðìq?AP#%P|¥»> ôîë?#%ðTµê!=U\øµ0:>ÞzW'ÛD0ûÐ[æ<G·»OyƯû4}e5HgPÊ8ï;¿wÖlþ¾èAY©TÛC±öCðGO1¡óôÓ2l?*¥ã³5Ö4¡L¡í,Ríð),H"D°AÔYÚ°éÆ Õû«û¡Ðlj#%Ý
þÞ¾)EÔùþÓößë×ÏöâVHµyív÷ÉZù*[F$Áó>`r¹ïC`ZH2ÂíwÙØ©ûïr0ù©3"`<Þ`ÁÇ8ÞÔ£úut/`þjà%Â/ó:+ø¡ñüy!§?Åú¨Nçõh84C÷4d×53yκf['ÎóÊÝ°K-°dÊ°xÉ#%
FiºÂjjù æ+¥B-P¢°NZJYVTóOö µ?Æ|¡
úÆgï#)IS[1×0µ?#%ú1F÷hp¾ÉHÚUXf°ÎZÔ)ÝÎ8ÁpjÕÁ½1WÜ0àíÄc-A¾èS"Î%zÿ#)¤«Ár±OÌïaÉbS þaØü¹ þÄ×Ø?ÅÑ`$fWÄVk^6|©÷ì¯Þj:Qz±bP_{_Ñ/Ld¡Éýg*ù¬ÏØÎ]6~A¤Ýëé½õß@ûnÁÄ"P÷BÑd´fZ{:ÙóîQÕþ[æÔÉ9?y D@©^¬À9vog#%Ï{N#)á :,ÏÜð#)Á͹qÀ*Âë´µ¹ÚLd M/'¢¢ð9ÍiüØüÂ'¡Ø:éòéÞÁ6,,ØÀ^;ÅãÄP¤uGz;aXn»·â{lýTª^#%As¾
F ¿!÷qâ)²I% ¬üø9Æ YWcÑ<þ(µè{ÜIxrºb2BP·^ýj &|1ëeÕCú¹Ìy¢¹,²°Ù+Á)^5B®Iþ_åv`ù#.uõÉchsmãÅj),.\»íæM2>¤ànCÀ¤ppÑãìü êmí:¸q´pÔÔeùÜÍÖr 7´~«(Ã=³üxÏ#)Ncl¿Rv¤ÅôrXCÉhÚÇì]ØÇçS¶ °W@éXoe.Ö&¢¿Q=¥ÅÊu¬GîëfáeÈ(t]ÍAzÙ0»'[ïJåw¦ËÜöñóYe&k$îúßÉ'°Ïö À®5ÛPV¶É;7ê!x<9ÑïDAH è#uÝãt_Ìï9É®ØMßôW^á$c̨v#%yaKø¤ýE¹üý#)Ïûûj/ÛsxÁª>#m?áÞùß7ÙÞòà#)èðüz[1$q ø#%xA}ZFóJý"Ö×»#.³ ÷dâEm¥Ê¡U5ùº$>ËÆÃGG×xw¬Oí¶Næ#.¿÷ðâÃð^ØààëUpß ßllãháì~³ôaËhsçÄ#%GÅà(7Rº"#)lïÆ8òà?k¨=]]^Õ±G¼G[ÄOaz<ÊÃ#.@Ìéü%µÑ?$ýíüd(èáÂæ¹DÝú:ß½|=ÜÒåÍpjÅáâ22ZðÐuÙY="åÂAd¡ïPp¨ä®¬Ö"øNZpihþ«¦>VÃ&ºRÔؽ4#. Ã#%Q®Q¢k¯ZìçHwæ´Js/º^
M&D#)p£ Ã:¦6,$*WIñ0#%li¸U
:¤§}xDÂnpP¥VF´ë·\93¯XÓSÎ åÕÓ4¦4²{9ØÄ^#)ÿdcà¼2m
Â| i³#%<¾mظ¾Ï"@Ø×:-0ÐÖTxß</g|^·
«UêJöÎE²âìÿ;×}<²÷5~0Þ.ÜqMäà9;¹nBèîní²ÄöAå:îBéã¦C;[j_O[§¶8ÕCÕÅ*f¥&Ù©*-öñâtå¬ÑzÖÉ®$¦Go^&G
«ôÕs#.¤[ïÚ¨2ÖC#)y´¸ï¢Â`ad²ÿ<À#% £ö÷üCÞ~¯®^ë7# ÈÄT+ÕÕ^À¾£R¨//1Юêv¦hs¿^"#é¥p5¡))?#.Ïi6ï}Oå6ÇÞ¼ñÙµó$eáÝ÷g#.J·ÿ=õÏ]Ôúsyô»×NdÏY¬¨U]ÏZvÿï~î§årÎ=¢14ñ)O© 6Ü @Ío #-k̶Û@mg×H¯Dìè
!ø2pBrz¾Ý;Íøz{«¦ì©)ÅME´J9èó±}øÿgXÏù¸P~õþçÕíÇgehïÓÆÝ1z¹m¸½öp®±ç"óöëòѵqÚ¼¬£öÇóVl3,øÖf³+åkß#%5øf>â=Ý,Dz<KñîO{0cGT´lþﺻ3g·`ݾ½öh©!L<,èMJ!TìÛù<'í߾ݱD^Ó¦æ6빩nÿJè-Ñc±_ª[¡#ÊfZVÎïlÌÄå)Ëyzn¥ÂP9À2Eô ~¶ZC~½`wR²wþúô37u]ÃÏv¨ã^6ÁɶoåkÖ%wü³VÃMÓ<éåØVM©aJC¶LÂ4)×0«Qä5e
kZ²JݼxÔR#"oU"hmì6ÙG$·r HtúùhÍ12Ö`f̦8Bî%èÈGÀEBC/¿!õáØÂ,ðð"2Æôyª=ÏúþÝÙ;öÍ¥zV ÃüýHãþcZ2^ÜQX~('+¿ìóè7hÌÌöÄì/:áR¾¿mºs"&L ÜZ¤ü¿WeÏáûÄþÿëþgÀn!üNäÒ9ù%àã|#.ñªª°ÿqäÀºíÿ
K®Û¥Õ®¼IÓÈÐù̽ÄÍÔìÉüáEÛ]å¦##%Dÿ;aý['@ìÝå7<Jj-9#.·Éú6:nPÂ`Ø`³Yê±$!è¼ÃÙ£Û$°dÚÈMËy3ßau$F¾iTUu)¯¨º[|ëÒnpÅ{'-£À5+Ë÷uÞëL© GP©s®!DO0£Ìþ£c¼áþ`/H«=*ª¥Qª)°³°S!µNóm¸J¬umäÃFp&óÓúóý5ÓúЧ0¹cA(e¢=Çlâ<¢¬Cñ=&eݺÑo|¢mcoCÈ1ÉGÑ[*«AIÝhÖ´ãUè¦NOºj¨DÕN,Öu~\Ã`ÃÃA¨kA±4#ªÍQ¨3#) o°£8è7aHg0¬ Fe
qW
ßÅ/sRõív°43ÇÏ3#)ª p᮳V p·8fç#7#)¡;ÍJ v(P òìñ¿~¬ÿi!Ný\\ë\ßo¯çKb~P<ÙhÐ7ûãô;¯ÍP¯6zû6È°<{Z
yܤt*ªM*dX£¬Ä,T£r "P0:îbð¯¤$K#.×ò*¶î[+Wøqå}ýàø·Ä¥e,/Üß7MæØÖÊë7tP~ TK#ßþgR{óSxI!*îÛ³å ;ÎàÈÞþÇø`Í2hyóßÑ4#%Ái¡3_ÕÔÒßâ°çîéÐÕV+åÀÕáÀ±é#)íäÙ#)ëKc1úHip145$cm"`ÃÂÅëÛV#%xÄAÐÿCoê%7q;fáÜCTðmú#µQ÷Â<H^ÊÎ0ìú¯6p(6«ì&yóÑöHÈ"AOá*|Í!¬!êÄöøñî¶#!çòÐÆuÛ7 "j^ 'Û»mØ.}ÇãmÁövh×oºÙ¶ð<´Õ(Ï25ókÈ»]f8#)edÒ¿^è½,*{ªj9Â#.aei}»¦-#%Íô¹ÉØLä¤ Ú½>ºN×Ï·lÍ]ÙU#.hÔb-vÃÌDÅ K(JÌ«±èQzÛÞø4©ãxªiÂlÉ\Ü89á»E)-Y©
M³ÊÇ·®7Pr·Çη38 È6ÔÁñ7pÈ
Ù¢Siz7N4-Èë(ÞÂjz÷mÜò#)ji-ó¨
6È7?¿#3ܽܡ²pN¡ÐÕÎv^#S N%Ü
wõU4jëôúôsÖ2Ò3±rïÀ%'!£o=Ü2÷ü:wëàHC]¨XDD2D;O¡±èãsצ®-K¾0dzz)E§xO¤37:W#-ÀÂêc9
áf Do2 \g9;#) K]ÍÐ&)eéß!ÝÚ¹@1ØèsèÓX,÷¹Â×x_#)l8á×V9»Ô;Wa¹.o²
º=$8«Öx¼üÄÒjyJ#.u@Ù è
£s/Á×ræfE¦¦ÛCcÄ4e´,%²H³Í¼Ã|yÓ§A³IéÌÞ½ÏÆæÌ sïos®CÈÀï÷¬LPæ½C¤øè#.©<1CAó¸\GÉÎ@0q(*W Ò;·!¹ZkQuM#%oÑúj¢ºn@©ÍépSY51&¢Ç«·$´X[Â)¹%«±á¹)¨X8(Cµ=e]%ÌÜàÎUÓôq,LîhÑßá°Êa&çÇFf6´n÷tÞ(ÓÐÖ,æd¤!Íi®u½o5Ç&U·)[¤O#4²/nÑ Ò.²kTÈ@B@a «,<ÑÚ3() °5c#)¶K³.çä±±¦ª5"·QÆòcbw×y¾çÙlnUÎäL¬dÍ('j¤hZNefzvÃÁÐåÎm¼zóS0J"¡LÌJyÌÌËfdUfdÌUÙIxK÷j¶Ùìé qa¾¬¹ËCPPY °`0ô±´®7,ŧîòߤÕæÎìn9/Q1ÊèËwç·Ã¡lruTF·å¬`ÓCò)#.Ýãh >«ÒËuÑq´Nkt4#Í3¤º'Æa¬ÄÙ3=êFC¾hYCS8G+}9ÇÏ5®ÍGAÏSA¦NÝ÷ë·n`h%Q;>=Âî1bȵI.©jIØÁ¦úñÚÇëæ|»]°×ȳdQçµjF¥j\BÅ$¶%ôæÇN««ã§>7KM¾g¹uTØKeÕÜ!ÍM6áØf#ÑJ#. ÛÁ¾zNÂÄ¿î#%
ç:N:¢¢:æ&¼ÑMUBî`øì¹WúoÖiH ©;^ÂÄ*záåM6zZD|hktKL O±IzKgÀz·npkÂkËlNzýxDôÙ¶läb6¯QÃñÊ6l8,ìÐæÖSdB!÷Q«6MÓ´è#)8CMä$dØo;ÚÐZO#³@ÚM¡£¯[ÛYrä2ÅÏ\¢ôMXáîOi¹HMN#.4¢½2N&fNw«¤M!§±Ú2gÎ cBM«$¶rHF³ò³p3¾JJ,PF¡Ðr¹0Br0Áxb°¾ÂNERd]çs3 :;88øËp ³,ÈH(òDy³làqëºÓ3CRC/gPJ=£pÇDÚÚêÏgd ðyÅ®5¢wxÖWþÂ"ûõ¤`ÇD ¦R¢PÎ$d#à<Ò;¦º×x;ã ò§xy`#.E!SNÃ6ê|þ®{äL6²Úàs6>9¬à5ÀYR&#.vEKµ#.Û¾ É/²ñY$±N ©«Ü§g±, FKȹIMVɬFx»3ß#%ÏnMw¦mÚܤ¸``§Ìçìl þJÐèÂqÚ{ãzNïSû. ´>å#%%NÐn_~L#%X$D ¦5LÄæßKé&¯wá¼ÕàräÍÎ&HîàÄö«M|þ-nÎ m#ÐRKÖcGFÌÊâXT.2s#)´,mt¡¸¡Wå4º#ÄnF/·æ/Çs~T)Ol`MèÈëñëC¥Ý¹+ãîâ.DÑEP®Ò=¾ÍÕÄ5qËÊ´6¤¼Jþ~mdO|¹s3¡¤41ÛÜ c¡Ü׺è#)¤*É&À%·mĨ G±@PIúúQ»#í0LÿnOê#%Åw®Z#.)óâW«ÒQÙ@´Èb«ÚAÝ7 ºúϼ´ÌFÄj?aå¼ô9ñ¨>»lJã/"èAn}Q_ó)_g~4O¥ëwÿqí Ѹ¬;1·Åq^§«Ó¹?ë>Ô--/Õy\ÊLrÕ[û½³»xZJíA¢óÎîÂO-1ì¹xÑ°ÄoRÄ`fÈvÒ¹#.!F¿èz#.¨¡¨SÙÀPX©T#% 5¦z¿Õ¹ÛÌôþÄz?åCþëeaÿOý2©Êi4å[<>$( ©I$"½þ*?NÍ®Ó4Y$£;VþjÙtôøvXò¥$5}¾%;}vnEôiÏ~Zý«ózº¥´ÉT¤LLUÀ1ì!S¦ù9ÍC#%#.¬K°¶P`¢~?Ëß¼ªÅ±Y÷ér<]©~«(%¾/»û{¹sí`=Q©1pÎôwXCôbÛ$K°(j#%#)(nªT#%Éâ;è¶Çr׺Í^¸Wí$&Ôçp*;Y#.¤È;úø+13,l`[%²M #) }ù$$îl¹MòF*X3WJT#)íF ¡é¤9ì#.Åñáv²(@¤Ñ2ÏJ5%Å.ëðûµÆNíbè>·*víñkëº,FC8qdÊÐÕ"f@ÿ{dQºzzÍÐïØûì}!¦*N\º(¾=§1Xv7dèÉ_J*¼½ -9 ÀÌÈè eë§Ñ 2cSÜ%&d ysMÀ7VÍ5Þäbö
ZFUÚUÎÌyá¿~AÖ:àtd8 tbÏeÎ4bï`EWdE#.H¤(úa^#%îÈÈ "#-Iþh*4DÞcÁø@=ÝÐ_
öß[
Æ`¨Ñþ'(÷ÕAÛKT,ûBÒÕ8WueÁRALH(#) Øf#%Ép2$¾O¸\ìßäM{"ñ^E½îÞ=kr½{7.fîí$w.W5ÇíÞy·¤s£º¹¹¤¬®ë}s¬_8
¥ u)Sþø&#)H+úBdY!¯/-_³¿ß«|YÉæé·ô´K#%£ü$OAþt±ï¼KüøýåkEEsÇKHtBZ{,¸x給,e´ð0øæàjPÉd@)`ëÌ]°ÍãUt³Ü-#.{±CàÓF+íýdM1úúsþ§nͶCUQ¶¾¦µ¿·{SLÅZ3ù±1ýãÏÙ~[¨<¥YTÈìjÍeyã_9o<Þ^\{\À°êHS#.cÊ¹Æ 6d2k¬±)&HÈ#.Ì!(aCKhg²6¹ÒÂã`,._\Ç¢¡Öw·RïZø<#)èçö$PPíoì²?ë9íÒ~&ÆlâBlñð4Û¡=gÙßòÝÀeZ¬nÛÛ$ºöúIÓ¶nCäº\ÕøE{^ݧ^|;pdqOù·lÑ|r©T^UakZì}¿âs³pøãSå^[o¬Î Ïßít§MZÛNÛ@(©®'%Ð}ÐWãèùQJ©U(¤éëå±9«(æiO*Lé{Û<¢H(43}rA>#%ÂÌÈYHÞXEòÞó9Q7ÆUH°<K`Mº#.1°ÃÖ§íª¸R¤P/}ùÜ4B)´46 ¤07?oà=ùü¿¤¯ðUJ$jdEÛlÞ ÜÚþ±½¯k~³1³jÅ[F-c$©DÅbÓiZ³mR¶*U $Æ H§¹$Ý>}¾R¤á#)Ú
{Û#%dDH"22"HñöëÙÇ#.AÈ h;>í60è1¯b×}n¦¬aÎÕc¿Ës
X#)´Ù3ºÂõÈZ`7¹óÁ:ÁV]Pö**ÁÉ)ÓhË+¯ðøâWpIàC%hâ1aµé,744dZÐÖ |L̳Å)W9Ó±nª;D]zÁ(è:Á]ñÙ¯*þé¸j¨V´ÝqR<£LD¡@WïÌcKîø¦øÀsQ#.ªSX.{)¡(" ¯ :3á§!Ñ"Å ÈÀl¶ûùsTi)͹²W-vie¤ÁQQE ¡))Ed'Ï3í-cEaãsLÈ#%ßXAd±Ð!mckjó>¯fÝM4kÄÁÂáW¹ãÇAa<Þ$C}xt×v) §å¬Ð÷Â#)À÷Hz¾ÎÏø}¿Gíü~_êÿ-Z¢yAò/Dø³»Ì¿^(ÀÁªbªA/á")ÙÁÄÐB`TB!#. ¾Ng¯ßaÔråÂÆ*æäÒ% ©þ¸ º ?!5}9YE>f\`@ðb&IûïzæÛx9«¸taªçtÿm<¨ú%§^ãüÊIùhÚÀÑ6V ¨eÃÖiùPJ§=Ûs<NäéhøvÈXq(JPÕNËæÈ#ïÔ5=Ö$©÷-RrYÔgéáh,pbQELB]±käðNG¿Ç²#«`ànl®£°¿÷¸ðµØ~Ëpµp;0´v:~×µû o;BKém8\ªÖz§#ìz\3
pPTè.9Qf6veÈUQx< ÷K#%R0ù;äCØ}4¯Í¨yåD¡¢=ÜRã÷Ó#)cÒCcËLÀßn¯ôa?ßsXÃH#%Ë]]=#%2C'#p>WÌ Ä2!fï:¡j UD¨C¦þd8¸°ÌÂ{©3â^®ÆNàÖº<i#)¡æVF¤põNh¥*køæ÷³xÞ´±6)ÈÈÅÃy ODÂÇøÚTNþ¢äHÁ6!`õ@÷} Öû\òCÛJx@CW>Èßéþâv¤¹W_éêf¾!ZHDKJÁØ)d?üÅ"0_8UQ*°F$yy~VáEC ¢±;ò@ ÝÓãÇaN9PXí°·û
B0ë¾Ø8xÈú<jκv#.¬ÚÌÃ>@ÑB+È&P@#%ÀE&ÜWQeê_xÙ¢}´DIuÏÚz:¸<3(bEHvÀ:õÙa)]RR¾°ËÓ7VÅ,7åx¼l1Ü̦Ô,pW çg±ÖjÕ¤DVmÚÍTl ¤â±«ÉØ®ø´×J4O~;Ö°:<=v¶ã§jìºxã¬v×<®}ä¾ÙäÇBËÝöiu¶JØ@(íÃíçtãyéµ¥G^=ݦ,ì»(É»Yé}E׿<{c*[#)Ï8æH9xÁÅôÜëg^M³µ\9æ>;ú»ý1ljß>öu|o}HYJE¹c£#)*v¢Ô3Ì)ü£v9s~ów·VÍMÒê<ÊÄ0(ô4|>Øué¼úî1T&CqÔóY1 CSV¥¨W=X¸GLP5¢¤MyÔ(
ôj 9ÖAæ£i#.¢û
#%!.¥Hu^kE¶óåÅìª(Äð¸JÃváÚäõßߣÀ TÃ#ÌýDvëÕcâÈÉ`öº³ÂàaÃÀ+¯8`»lüìçNä9Ýýâ5èuîîZ8êÔ¢åóo¶¾=&øB,Ùã¼0AÚ0G#ÊÔ5[Î:Owd_]îÆMÛ¯Fè3`=/hàÛÄÈÕ&H]«HMÙ:Ì»7Ù#)Ú·Wä]Mðz´\tI¦<ú÷,Ü ÝνlsÜä#¡êP¨vÊëÈURÆ#C³³Äå¶ Ä³4Rünü!RK*O]b{}-OAéEhõpÞÉ"!u0Á+Ðéd9ÓÙ]k0c¡v)1Æ0RiMá¢DW}ïsdÑ Òb§(]ØQÝ:|4oà6(¡_ðõì7ºõzsôúAõ÷4C9På+CªI©£ßYÆpO»¿Î'·RÅ¡´éÇM9*õ+§,_K½ëý9²«ÂÈFö@ý¾ZÔ 2)£ã»OFÅåDøD :=xµ§b¡8ÙÛ@òc8Ê`ÎÁbÕ@"[]k¥l®vNêêY¢h«M+]¿·suÝA#.å¬mBÅZvÊ!BÒSII»¥»Áq+4½Xát¸¢¥ÂE`dsna$F¥±LÂUEµ¢ßu~-o¼¶ð7ÞT*2G:ÁbÉPn«iÏo"ª$Úú{ÏÉõÛøÿ+ÂWâë¥"ÌiÔ
Fz(=HQU^wMN-)#.2B°9 dÛ>ó²ßctÉÔ®ä>Ù"¼ãÉQTê °¤vÖ Ó%y¤ÑíJ·vÃÑHÇÎ!EkÀ»BÍ%¸ü+EÊÕ®ûV½h#)4ºôAl¯Ñ
\èë<B¢ZbõU~nË.Z7ë;õØÁ8!>8Óɯ*É"6µIuµl4D9¢¬e#"Ó¸Ô!Q4"ÔD#%Àä*,K>&í%s¡JLÀ59¼õÐÇCq-¤¢áÀâF"H5E@%0#.BÃù I6ÍRé1#.DÄ#ñ¢þ[ë®åÝÇq¶kß"ËÞÍ\Çà·.vñ:ë.Kòd½¸ E1¼òM .*¯ÝÅúr4Nëre¥¦;MQÑ£ZÜ)"F"½YîÛ³§øVeÒó»Pím¡óTLFB<"<6HȾW©434Ë[,¶T$74*ß ÌJc÷¿ðÜÈ[ì«îÒBçÓÙïòî:zçã#.e¸¡®¨ô.¾§<¯h<G)(É×o9$&Ö,EREç1Õ^vµ|®]U3Yú¾©¥¬µ-QFÈoQ8L{ÞèÇÚne9p¹$ uªB»:n=ö{Sg¥mÄàp-Ý#.H5AGÁjRçÂöàéí%#³×ÊÀؼ¡#îÉZFÂü[#%jsáÙñÄ
Ãg:¦°É3þ|vÃ,1gR9ø812I!¾aôÛÂf&·¨Á.#%Gèì[iv#)^<I3@Cau1@b_«Ø4ÈVÙ3°ÙXX)rAänw%¨È=#.è:ç/#.¢Ã Á K dN/òs{²û3ãCgB%ÂL0Êåx&E$^R¢ TEj#).ed¦w0[F¶µÀe6Äs`2B5¬¸hi"a<Í-hÊ%Ý
ã2BúK°0Å*Àibn¤i5Êl5o®êëmw
0 u)a¦ËvAéç8yâûg¯tGÜÉû"Fümw2n'ÃX@X¦ý#.\|Ê/(ÚëçAhìÃ:Zo´÷&öd9H}!Eð@îN¹ðâ&(3ê<dÔ))ÎÊoär>dï%¬î#)uÖMÏÉ#%I½PÎ&Öê$±U´©«îÇ°`X¿zû»½=húÁ{x=MúÂÃϬ\zëÂþ^0ErêlJã¹cöôó:IÙÄ8PÒlQPUJ ¡×<ûïH$+ `èS©ÍJÔ{xx¨º° ,ñrÀ©aÎqNÈ9mbT FÛ^È»¿åÜãÞ/0"ú `¢`LQïL©x)`úµîwø~1>Qñ,`¤st̸TlD3ö2¤cm"31a ö.²Ë²#)B$À£#%¢lRó¢·Tºíí³ÐÈBRV #%Â!Z`×qÉËÓÀ!´^C¨(Feéä@y`³¡'¶ÜѦÌ0ánÐÿã4ĸɤnªP8ô±°]0b30}à6ñ¤%ñ$#%Nÿ±ª©°¢d×U#%`GÇ[ªÕ¦Õ,ÈÏ¡×d×Ù`S7!>q´àα޾qÈÚØm¬£^2YdfÄÊr$¨/YÜÀ¹#%{ó´}öO%}'®0YéqYDµ$<õ©wD2ï½ÞçÕf®m j¢ÈÎBUMi?ÌF=¨¤TqÙÅ×½Î0aÔ÷Mi¹US8&¼úFUìD HÉÒ`±ªÛù+wjzyæ½j6ÆÖT@!Öczõǵ,A£)àÀ¬R ±è§V64Áb;¸µÑË^m¾°¨+\sýNëÃzí[ìéêÅp¦ªë»pK#.ܪ#./[¡)DYùg-¶ím¶¹ 3~ò¥@«¾Ä$/ouÎØ8¥ÖÆ©ÞÏ16¨Çù6BpãºvÓí¥«VnãÚòÛïKWÙkynÍæ¦BdLL`º·|m.*å YG!#.(4Ø#)ð-æ÷(lt̲l2j7 ÂØ#)¡T¡³ Âdd,MD,TaÍE4³ôl¤lÞØ+Âé®GC"d!c+#))±Y5C-ïRB£·QÊË!_áÉ7ÕÿÎ#)ñ3e¥¬¦zß1#[e¥^Úg#. ÃÊ>ƵÐq§}g=Qy]+Ø
SÄ)!â`Jë'9D«f%1!²fæP àpm¾»¦cfÃLÆQUoZã>TæXc#ÄyÁ4 u÷P«´¥8
Ýc0Ì wøQ!Ø
ð8Mn&ò73ëÄ|ÐB êãùÇüÌø§¼K¥oS-Ê"¥»ÀsdîG
û']ÕÓ 2I,l9¼ bP-6XîKÝ(OݲÖ{µ|~0ܦ|¼sáÇc`]ó'5£}füvÕ,9µnIwC#)2Û#òg´Æù'¥j r,>$°4!{nð:½½z#./Bëùpq1^øøØÀ)?Y«ÝåÌhøê4[NÇKEHXºQvÂÐE@LgÛí¥#){Ö#%80è³#),"@ª1&¢H\léHæV0*¶#%"60wh¸ØÄ[}+`Òå#%h¼ðætÚ*°kiJ oaCI #)ôðn8ÌE ¼Ò%Ç$iVú6#.¢3 ÷ûÙf3~7v_º¨ #.m©àc HþÚmyYæßɺg¹=©Mä°<7²s7=co«ùT8Múxëkú̸¬¬[Ö|Oõúâ$(&Cåd(}<àCîdUÍoÒ\ñmÄÚ-Tk^*6ܵըâÛo[ƶR@Z ¡ uÕáÖ`'""gÒ1ÑôOôï@jYBH}l{ºÁÎÃSè>£²Àâ,b °VH%2e,ÚfILblZL¨?êLÍZC-4©C%6%#.Mi×ÛÛ2kI$¢S6³B123 £B*bRgull"d²Õ¢¥FS£15¦)¶,Ê&&a JÄPP©*h¤oÞ¼ 1®ÎÝà*D|AÀbm@¹øÌF:Ù=~¿Ó¶Â~â¢zD;8BѪF ì¨_ÃÊb«"Ã3Ò£§,d0u8[@gãÆpmLX¡£ÒXPÀEa¾§féÚ
ÞMBB£>Úí Ãy³c6ap£e»#)÷¹,á¡MkÓsVvb`bÒ¶\y;0^zY´i/à/*7®§×÷¡¸çÞÒ«t@ÛaVÖ1Ò$+çõõ«Ý·á¯Ä±1¨mF+%bÉF)6f$a¯#.-ÝT½QLf©M>ÖsêWðñUb¸F))W˶©"Z.ÝXù«v¶ùKØæ(¼?"7zÈuÒ2Âu¤óÔysO±~ätïÏIÄ0MàHÖBÏPÎ6 ræÿãV<S.Ì¡¹jKquâ|éG§3MV@ÓTRh$dHl`ÊÐ3ùSÚªõ¸*ÕTvAåÖä®x¹Î!Ä,ãmpow~8"&#Þ7-¾Þo;aߣ¼8ó-,°sã¡ëçý´LS\AàÌfòUwwzí´lçîC<úôªnÄgÃþnÏoó~³?QìGKÍq{}4÷ÓoN8E.¼Ë¬1¿&ûLzXfdÃ#ÆûÑÎmÈ'é{ÌÒ]&P¾3tý5ß
ï|Ý?xO¼;>u/¶h<©i7ËNa¸¢¼Á·] &ÜM¬/ºe5rü¨Jz-ó\÷¾N
oN8Baå~´ã_D&³¡¾dâ"!UEÚOhÓ)=-PZeµÞÇEØM}*tènK
Ëkȵ¡î×IZ<£V8#%Ñ6Ø@üÜtèùv7ggx©"=äé*ß6@óì6GM·ÌD°øÝô÷Öûßò'4
I°Ü6£H}~9tZ>_¦Z~ª~nT¼2ÊÓÚ¢XBP5ã']w¦`£¼¥ùøúïÞÒªGëÍ
±A©[ƽÜ;UµàUÙ¡RWÃQc°
Ø ¨æéÀâc g-úS"òRs#ØvàöÏ"wT3&æn»IËÛ§DWNÏØ0#T°Â UBrºËgdúîª$OuWºÖ±õ:ìpâÓ"O©¢:21GjFC${3Ù¡PæXåy$czÔiüÙjÞ«ùY¶]Æðæf9/:¸ÈE\Ü2ÃlämÚðY!ÄÑ£QEMKÃ¥¬Ö°Æ©T°ÌlÂØ[rLÂZ¦h4ö]æôÕ
XqùL͹uämánòoLuóýW]¸#%aÇݦù Á31£òu¾!Zäb˽k1t&¶fcZ6c¬Ö5¦©lõÔ«îðÆÉÿiÓÑõ:¦ÊÝ8½8âáÇqÜ~^¥àÎÑ
ÆÆcW´mFg*2#%åM 9VNPüµk¯CïuNû0p \±%¼Áb¥úZÝ´üidÞToc ëÌ=¶³p³¢jõ)É·RSéäÝ®ÈÒ"à*ÇVd+ðµ#)10i«o0;Wm¨ÄÉÖúâ̾AxÉ3¶7Æ<åîÛ2Pqj7ç 8{OÎb:ËK+îäï°1§ã¾ÝxÝôCµÊ°vvôëQ¥«Rð°Xe£u)ÔáSEdÉ6QXÄ9çþsµszßPwÚxÎtâ¼âqe9Û^È¥¬^uQ¬ÅãÕóS¾«aH $ÏnÍ#.Ûm=U¹¾Ù½ñzk8Î [îA;¶Ä-È1#=n$éêð%%¬iÈ£Qo¤²XÚð8$³×˱ÅTU#.*ÛðòuvÞ±0îò;otûpi¶34Åû¸ÛgvÄh¡öÄWðõ»<ª'/JR©gÈÙ#dÇ
+Fª(iÝ?C3B6ÖI7;-sâvÀnØÅ´
3:I=!Ú^²t°kJ&qdÖ¸2L/_H!µÑ¥øªCHTrÔ9¦ì~:jÕÊ<ús¬;:ÌÎrÐ2<½âK×Ä\Ec`åöÙ1i°æPÉ 1f5W3ÔoÆ ÂãPîá-Ü}Ë.ëThq¾ðëKÌÒ·á#)ç+'4²õë!T&Gæ{¬è¦K¹µ±³ÁÆ(ørS¹Å?³NK!ÉMyêmTs@S³Z!°Ï0û;B#"Ir;`ß 8 3)×X 5Asq#%ï d*mêÕÜÙTìZèð3bòBôgEã9¡#Q`Ãìå1iç¢lÔí`YiÍ>\^¹hç/YÊm¤Ó(*.$w«¦ ¸#.óS\m©Õ}ÈvcãlÃ4uÓs0°nXTÈ´;oµ[ºd'{UDÎl±!º½QíϱQs¸*p`ÃY8¾(wCtÄQ4é$JBUgê·\;^7)ïpNUº´JI=Î2ÃUm·ÂsVßæ0eºo§MèÓ XÙ«âNuXqfÆ]å`·ÕóV2½[ÈÁy-2D=tÕ{5·2aUÍZ¦7ÓA7dt1oyRBUIMÄ<©C¢O:Ù=º¨ñðÎ:æç#.2¸ä¨%Ë&eLE½QÞ5³è3E,$jÊÔRwÚ 'Ä^íxb£#.ü¢ææ<]sÏ8¼vù^0Uí7»ë©8f¬ÔÀe¦Ün[æZÑè¤á#)q«·ÃÓÇ)&TÙXÙ]k¡¬{ÓÍ]åtÔÖ<±äª±by&ÈPn5£Zë½²ÅfARKM¶VXnÁC.|®®løUÉiÙ4%tçF,r²S|X®ØlZ,¥)ÙÇ/"ÖnLÆJ3S£9Þå#¦Ô[ä0§mñÑò3 źRö09*lQÃpPI©¬#) í#)µZK©Îj²s©EÔ¯µ©c6tR½ãW(¹T©`ÃáØÈ|bvÙÍ%kiv«®;0Þ´!I©8bw SAhÁF{cëÓ¬3©Êå#%;RDn¤%+Íßßh¶®hs48K²ô4ÆY¥8èVk£#.ÙÓSËáãe":ѱÄáP5ÁaÉ·ßEct6í#{& Åq$òaÛ¶È_*IR1VtaX¨ÌâÏfbZaçJ#)P4y°§ÁãL`¹6 ¶H°ÜihT
²RU,,ÏJÑ00¡eµ¥[6aO&#³[½Õû7IlWG))"Å#)qSdñr&rPNi{ÔÝ0Ñ¥JCt¦kCB9\&ÊfRèêí¾{ï\Ó³ò8652¹¬]eáq®/"Ó@Jôp#. .¦PgÃÔgeÊM¶XàâÊd@<½=<NÒ,îóÃî/´:òÝw:Kq+7:Ý¥c3¬V2û=óÍl68yËH:Ä´cC!ô4R@ÛÁ#)£#é4Úw§ÄêÉP!ã}¨Ùñŵíz2Òçål<;¸)4C#)5F°gh9ºhÌ6uLãÜjqÐ#VÌHbkn1A¥mmC§¥U¾cÕrSÈ]¢g¬`)"`)°téààxaµÆBFjY¦#.l S*¡tQHgtãP:¤¶rÈWænIÄäd#)5#)#%[U#.È4.½®ÿ-qeʱÖ4µÿB0}`DÜdGa!Ó·¡°bCFrç[` ÚhÏa³ËÁ´8¨¡â¨Ykp¦ÚTäS#$³}i&j#.!ÀÔb³KÖ#±¼j£ô±våRêå0Èåt,ÒjAvð"<CÄã4^ìhìG!T'i©P c#%&³i©ÒõãÔFÒo8ÃIè3+Ü5(æÁ¼xl0A#%â[ÐÄ3б8B¢;0`ªg$Ô#)Á¤o"»%NÙ-vlp a²Ó1M¤¦Ó"L;#)¬¬Kïibzö3#)³RP3s±ÈpLÄ»-¤g8P©,î#%ßfo5|ÝÙSk&hɳTÖA)þMe/óD#)ÌM´DÔ ¤¥0y¥A¿Ï£ûÀÞ¯ÑܾÇPÒjö$$@H AØ|ÃûN
PgD#%qS6ÉjR¿0aRA ELâ8&Æ4Öó@XP`#%¤Ùiaøû¾cK¡"dòáðfzê,ªaJ;Äå²GôàÇì#4r¶)ðݺ\¦R-ã7¬Ë`´ê@ã8xj(©b®ÇFÿþØÂÝÇë6JÚdß6¡Í§"Æ+-#.Øq#)\Ní°[,rCÃp"Áo¯pí VYmíéµ/l& .P¤Iv©¼ÿ-T(*Üi¢T%%ADí""B6 B#.!ÆH!C`]ÞQ`±t |¬=Ó.;^¼9¨-#.£LÐ4M(î÷w¡LPì|8#)ÐßðÄ:~AD×ökQûbj
¢ÂÒUUIKºî̹ºéqb5º_Ú/5>ða p*?a¤òÖ¢xt|® ÒríÉ%3Z*n6 nçæÁT^ @0c\NÈ}¤]ûú,2o"Õ© ÀG/´õÒ?¡]eyÇû
K<ØäýmõâkþóßïaÁçc=di³5f<,%LKªåÚÀSúdÒêÊñÊ7¥¯îÙ°k8©4)¶ £MNá°Qá#½£XNÄ%ÉÄîüÃÏ:Ú@J!¤hì?9#%~â)¤>jù|BÅKVµ²7\ÈÒyº>x_ÚÔ´$µ±£Q¶¨ÖÆ2&ÆiRT6H@Ñ " ?aßxÛë1<4V
O°PKt©í×Óܸ¦!ï.²*ÞGPCæ>peÆè±n6,"11³XÞZ V£´@v´BÜæÚ;#Û¶@@ǼêyÑi;ækú-aè.@9A°vBõbC'íº-(©÷èU#.ü!Ý®ñ³¿'*ÈVa`AôÕE3Pk&Yn<êP[ýG`1hErÏÖ9zÖ®UÒ·Ö·²õoDÚI¦#.´dÆ-JY±L¸Â´¸fhbÆ#Úq®%¢#.kkå§ã[·b;Õ1#8hÕF$6Ò`À'×½ma¬pÉ»¹Ú£{Ä´¡&A7»T[Í/!3Mè#nÜq8M:t@6UÌjèn I3@R'qpÔ^&²VÆ/íg[k5#%á&q¸ÖTt ¼R@[Ç.LEtè¿9ßï{ÞÑ:ÎÎò\-#%«°,](¸7Âß0Ñ&u§îk
Aa/#%_}pEÈD37¤°Çb#%È}Øù»Ã¼AÓ¬LÍf¤øìfl¨'0îÂY_}XX¨3)_}@ÚjÔ#)7©°
ÌÍppVÑF¸ùBðúÞsî)FÖ%Ëb2û½°êXÖÔ
ªótò¢BLXãM®.L4ÎirÑ°[Wk(°!Å¡ý;´Öf
CÎϳJ+|<ëÁKNl°Ns×0ÇB½ºl{tnj)Äà
nîÃó#.Ý>欴XLaåÊpÅ0~®¶g)Ç;!ÝÙÇѳØá¬09E$aäDÎ^#)çe`Ô8\[F(DÊÑÊÈs6ª{+µ,¹.³<4IX`Ä(3ż\CµdMN¶ErÎÕ½ OÙ c#.!KC,±QF1»uu0Ä2¥Ì²PY0¢UDÐ@J&ÅPl`& `1Ò!b AK·7Bæf£Fûh÷oÐ?@A»Eõl.^êò±äU oÕ{ÕþÕrqH¢ÄöP0zïVéAÞ@ûåáõü\AR~p÷ª á-]vO;Ø.?£»@zdCîV«ÎzSBQªo¾ªi¨ªª¨UA§bü #%ZѵªÆµ¤Õªý;eI$HBo`9!ódxäxiÆJ¬°¬p£ºe1.GÜøOª*PõöÍõKéÅñ;âY,,Õ¯ëÞhuNñÕhÞ×2ÃbW"ɽ4á¬ï3²i2®jdteJtòËYë#.±MØDÙ¶.Æ¥«:ÁÒDÐÈm`§ ¡EÓ/g͸=5ÃÂAr[©S2bI%:S C*#PôòíOoÒék4N)¤Ê(Îòá©6DMÌCèR#E÷áæ¨D]Ê4c:Úo¡Æ:´ku^T¥sùÞi¶?r"#.ÞM©Öâ¼¹x²Ón¤RSæ)#)ô3¡é:âLJ¸:jÌηªo|6Þ¦Ó\$×3¾fL¥9¯´½Ù16\d%aÌÇ9\î4(ÚwMÈo£ÖNO3IâàQ¡yûXX=æ(X.ÁFXnNf/Þ¶n¨EXQ #% Ô±+£bÊ=YzÍÌñäØ9r¾ý¥qîñ\¯2X2ÐÁ E,ÑHbD"·4èR¥*8ÅóL²fêK7¸§õÕG8ô4õ»©mj¾ùKºíÚ:Çfé¶;º½Iιºwuק#.^Q5ºSMÛ]¤Ö#)Êî»wqI¢×Ò§»®ó-x©#.ÜfÛ»D$RDYÿñR$ppRm<WÅ»Eµ¼le5¦[$¤È+bÔÔfº]+K)iZS*3j£O²úüðYµ¬I±"H# ´·«ÄÉà.j<¡mZ=C¡oLK°$Ä:¬4NØ#%´ÜÚ0S%(#%éªH<3tÂ)´yªÁçÌaÖôèüÌ)aÙÃH#)ëÐ#)^³gÏlã¬Ü0PNg«²U#.(/®+ð@¶a§EµH%uÖRIkp#%
SGágh2TÔ±U¦ÚqÍ1Tï>]FVvFÁ¤qoRj0 Mãô¿u¥àËÒ$×ßJ¢]H
Û^Êã%ØfPJ+#%I#)£¯S¼;^ÏS½ù!«2QüûsÞËýÍ,åSî@á»#%dBÓZGfbK
H>5ÂÖ¦S"¾q¤0#£D4íôþçWݦdw³f´ÏW¨ÑráQßÃQ¬ûØÎCüÍýzZÎúKʨd"å#%@¬\q¼'T?_
<EÖP+i÷°pÚØ%Àw?[d6B]«{ìP¹¨àÀÈ.¸+!ÉÀͲAË@Kû LÂcGA¥Çï%?*ªwX×KLäÑ·±_è#%H @/wÈ
q=gÑÈÒÞ"lS²ÖQùE#%~ëáFOç1/õı"hYPUüòHBÑ1AC$YD_Ðî¢Ú,ͤøíÕDI$ÞµµÍj%dæêµÉ¦Óh¶f*L²i¦JV3³ZÆ_ºÃ6¬¦Cf¡¦$´Q¶©mSEïqFÒÛ+»¥¨O½[¶»WÇnÅ1&e«LjiZV ÔÑoä-·Uö¹$ÙXÙ5¶I"mÛ_+µ-3TRÖ<ó¼3I-6(Ì©«#)«-¾m¶[c¢<[£i²ÞuuçrJmS+Õ¤Þ¬·uFLKm xLTÅD?Ê6|Òõf¶Æ°CÛ7Ë ~¢³°.P#%á³#åî:exèç§h¶û$ÐLct'\NÙ&Û§_«t[ÖÄ£Ýñðá-ódj¡=I-rä¸|1jß嶵¾m´ùî©iifim©Jj¥}]~äë_m¾VÈDmf²o«DAdM²¤HY¤¨#.¦ª×ªéQU¹cXյߩ[ 55DÎ èÖP¢b¤E>»MnjÛJ´¶j6b32Z¿6Òº0jRZÛVe2ÖM¬4¦T¦ßZÜ¡#KQ¬ÛÐLR)D(ÐÚm¦5&h²fb0£+e±²dK#B¬R¢¥6TJ¤ÚM²²FÙDÕ³i¥HP#.IIÓ$Ó%³U6Æ5DdHÚX[&ekRÍdÆJ0@°bB(!U"³kM¤³i#)%¾Z®6kT¥[Imª-_-^lÕÞf«¶¥-øU\ª(YAZ6=¡Ònpc£oQ0J"}Õ~8Û#)ÆËí¶ÕðÐ#%þV0S«HÿLߢh;r6d5;¶
øÒJÈî#)kJpr7ßÕRÕB;ïÚ"³`£ìáõaxÃluGÑ Á¸#)ÈÅ~>;±®uÝf͵ËîÈÏ5ÑTßÉJ7iC»È"¥+´9µúEQ¿8Ú÷PßsȨ$öE@Y xEF£$P,Ûêç4,¾0)Mó{tí#%àN#%Ë+ó°Oq °>ÀÄÒjÓ²WA® Ï<àÉ u([òw@
>͸Àȩ̂Þq²ÊÓó}äüsbÅLIÉR*¬v-ç¥XJ¡¾;L¼C,ÎA¯-Øí¾¨wx9û׸¬C|«ãw#%Sù>ÔÐÞ¼}vD.&;¤Ì0(¾ÍRÀ`ûèÑ-iûá`'£ý38m²@¬3¦õRiP:Ù¨¢UãrC«F÷~UG6з)¤Ñ¾k5>²CfºÂ>:b_%âA#.rdò~t&îf ÒªB¤]À#%±¶Æªßj®ëªä=0ÁD+i#)l!æA¬ ÑÆHo:ÚOY=)*`1>÷ó¼ðñ>H*LdØñ)G¯ ±ÙEIT4ô-nì®øZtìÆÑ·®A¯ÌÉÑ#)¡oÓÆü~9òé·½ìê]î'Rú#.èí¸I¦>AÀ7¼@#%ÓP?>Û°ï|]þïòLÕ`#.¬IÏ¡E#.e"]þÇÜ׫¥#Jó¢®<êÑ¡iª0IJQnYÌh@¡¶Ò¯CAPÌfª(ðn£d/¼Tn³·|ßËëÓN¸«jÇ!aÎEZ9dd6í´æÄÃ"1VWJdq´Û¸) I·<l`°Â*+Æß«~V#º#%m*#.9¸\áz4J;BGܨ¶Å¡ÖÚY±ïÔyM=P:tª#)
(3Ntâ£TùðüØ#»ÃÎ-g×Qêôê1ÈÂmóÛÃ#)dbäc7ÓáÜ»\:|óRÒÊ`V È+à }¡Ñ̾Í!ýzÕ´!¥ÄH{ùþMÁ8ºÅÏ3n½¼:,nL3ã÷þäÕ®¥R0ûñäãè+T5ÓWÀ¡óH¹ ±í,÷ÈãEe>¦×L&³£4ÞP7´PÐÝ0C «ÛDÙ²*²¦TF#.Þ¬_{¬Åja©% #e¼¥ä*%r¼ÀsµqèzäʼþS«?êÒvÓúı¢´OÓ&ïQq=ç½4¸ØI Õéirò'À¹Ýú&Õ°5¦FRn,1FêAb £îÑîÔEd47 ¨9F@éúÓ§ÍÏO|êàOº0]ZX#)¡T2`×tðäY®ÙGUÁ´àáw§bETø¡æ%I#.'Ê¡ Ъ"l×GæúVrû ª£cÛg1QIñjÙAßx SÆmËÎg¹LúÈB`0B"ðl«¨[ÙB¬SIDÐã¤Åõ 2&¨1Ú¶·ióaxÍÕsÞFòYDZZàEÅÂÌäb Ù ðÈRÀ à,³"¨É# #Ö#.äõâ¬MbÓöøÜ/:[OZ÷æ³Q5{©D1¾´GHCgÑ1ªpÜ8Û¿èíÑÃÃÌbGâQ3´Òèöå¥a¤5VÀ #%ÀtÿræªÅ}4R¯#%¨½EyÿÕ¥Ó>S{$:òos¤ìrtRìbèÖæf¥ÚÔí]v©®^åÚh|Ð4ÒÔ<#%Ø#%õ¹c2#E(!°±o,±¸Ù¬C;@uq5 rIMã#%(NK)"ÉëTÅÄ%Ü&.k¨Ýw}låÇŧ1½î>bF4ƬZmYwR?NÎ侫®»¹¾¦:è÷Ò^5|®X_=ϧÒßS{#(Sv}çÍw½É(DÍݧ\$(ãμ]\Òçu ñ<xÏâ·¹O+«¹J§;£ß;å¼ö5UJ1
Tú*KaºCthk_¥"+WÄÂÇvóy#âô®³= -FzâEHviWMÌ2ؽOX¶¸lDzp7wùÖÜdߤG·~ú©8ÎLÛ)B¯-Âò#)´½J¬ÂÕnëÇêøt¦Ó¹4úÁ7kðóË J¨7/zï8û19$ìyjÖÕ7s£M§§£³0#%Ä̦¼Ê)¡Tª`«##.£«ÉÇÛæP²0ñí¹a/©7d¼Ss\î "µw]I·á]3(çÐ iE$ T¼$¶Õç³Á㼧§uu2UÂ4Ø3Li0#.¡E+¥)#%#%´ðEÜ!½=E×ÓÓ¹ß2§^ñÌÞ#.T1êÐh±'g7fèñkî¬v5Ù@ÄJ¦"Ð>¯l³ ³Gê:úºé}<תñ_©:4jȸoù°æÔ¨Ý~koU¾b±Q¶ªäfÙfM×EÊw]4¨¶ÆÛô[nDXÑZökoW«Ùµ¯¥7ûÞñk%kM²«izè}·ø{H¹¢L'k÷âг)÷cK ]¬Î$2i¸ÊDZq16×HûÚázæJ/aµ¶Æ`ô¾ÕZà@.Ä8Rb a¤f(Zݦ#)»#+¶7,#éÚË`í6Mãêb'÷0éÀ¤.ɯJ)ªl5T~J£-U=oal Ì1*±aPí2Aå¥Àsìñ£þMuTÔ¢"W]±i¨ÒV6ŧm[u8?§^ÂldÊê²ä6ÊÓ&qdÆ\³r=#)Æí`¼b (aKxÛÙ6õl RA÷%$DäX±¬§d~½ÂÄË.ì>ù°ÀEÖç®P`[C'W¸×#.¥Q@J?Ï@7ývÅ\M½6}vì3g"j°h$QuI#%¹ '·U@@LP4Ù½tÏlfüÜ ¤{Bu3¤D¬0K1nzæß{ByîQÒ9ÆkÇ"°#U§äÿãAM&ËïØ^-EöëåSìå?ªìô(ëc^:1Êó}a×·Pò,D#ð Äns5)ØSTSbîð9>Õ~MaKüæq!$È#.u%R5P¢#.¬, TT¨ª¤2Gj6,À¼¢ ÁdE¦¡çp;/ȦX-k½_Ó{LU¶!.¥C(#¨HQwæ:&'YÉ9EKÒâû5#)Jn©lÌ<RM䤣CÌ'ÞiG
JÇûÝÈ8É$ $Þ ¡ÂÎÒÙã}©-R,¶á¥y ! îùvÙä|]IÍ*GM=>{ñBXKÐå,°õ#.ûÄ»AûÒÚ»'»Xzíß(÷%Ói_~tHõqǯÝç ~å"T¬XANJýõhì#^B%?HoR)ýÐÆ4oo÷éâ,c¥H±QT* gý«·ÑPÊ ^J¦%,%èVd`GéKåôïñ[ûvõò5¾×<¹®hSd®a%q#.ÛWF÷DEX±ÍñÁ6`ZE%à¢Ra·ïEÖ
S$¶@à
¢Â<*Ó9qY¤ÇH60-ª²ÄhÈ`êKßX·ÝϨÞ4m;¸!"+&6ʼ[E(ã#CwÃ|2ëcm¤*d©e²"ljM3R*±B2ÎiÃôÍFZZÁl ´êQºe\Öirãl°¬1,+E½T7¬L°woñ}ÞªømäÆòs[+E7vÅÍsQX×1&5çÏz½2=ºí¾¥
º[ÏyI$ÃV`«Fð)uEÛüºÌ4Ë oáÍ@¦²£¬z}ÄÄNÐ[|1±Vl°²6&èÔR"
#)¬Uv*=SÆÖÆÙÄ£I2XpÆ÷Ùö]gL:~óU5-µIãR`éM>§ºC¹·LþKv©³I²k1¯U©¤±C41¦%Ñð¿ö~D¡ÏÈÉXVÃ×ÇÞðNHâ4PO@jHüÓìD,B)º"ó#>¿ßoÙ;Ï+dÔÙ*»m¨&ñ®Kc#).VÛ©Xµm·7kd´Ò¦¾wMe¬»Uâµ#%Fê*À$XGδ1 Lਥ!
þ³êz8ÉHt³WÏÙÓëíÆÓÍ4´XÀØãôzL×3<4"#.
$hªQº *¢
"NtX%Á¦Î¦Æ¬<ùóû~Þ6Js=)ËÙîØ9ÀABy±#.¬ âyh¢¶ýï·kzÕÂåõ<ÓdQQA°bµ¢¶n%뵤Ø5¬6Cm껶*õ«âï|
ï[³VúÖ×imy»¨¢ÌL)&µ&µIlÇÏo¶¾EWÃ;J¨½¬¢ÈóR±úrê4SEħ[J.7ÔY3²,ø$eQRfÞê#%aP3 bL²,0â¬-#%/}EA¦½2ÉÁf#%!´ÇðÊt#.X¸
±Cð#)8Íó½ÖÅ$ ë_dPÒ"\yvý´ê/ºÚã_AôïbÊÂjÕRpF±§¿èèmëÚ|¨Q8#)¨V;UL\.ÜöÐUH.#)üø¨ù1{X ¡ïÑ, ª÷Àú8DÚà5sè#%J¡³=ºê;ÕzÃÆ¢»×uvÝÅ%SiJÖÑj½v¾]£Mk4ÖSâWQ´+)"[sÞ«ºvàï«mÃ5X@ëí³7ØÈ« ÌõØ}¿S}CÙéÛ:DáÅÿ³ÎÃô=¨ÎmÄĹ³ij#)#æÀÆøêP®15ÖàÖÛÓ3Ùúe^/<ñ¢ë|¢ ÀÖõd7ß;é:mW¼"0J((.ËEÑ#%ÅÀ¡dÑ.Bµð¹`ÉÄ(MâJ¡°b8jíõ'w×Ò"Àè$$Æ#%£ùãsÓáÝfáf7ÓÁ#%u(h÷¥1¼$¹Ä$ 9Ñ¡»#.QD$)?Õȶ8I6ttoS<0gQÒUɳb?e6Ù6%k¥®BHý¦#©NlÃBFk91o£mw6Â#)#.1ÄþÖTbl\EaB9Ý54h±R' N:¿Nùíâhy¡Â¸®¢bô7ØôK5F¨Õÿ°uùõÑ3®£þäØʺÍN7RrFSìvð×cæQÒþ)Â/OÂ#%|g±4f¼kv#DܨVÁà£E¶"ÙA©))6i5©µ¦©65£#¦¿$®DÊK?e¶¹ªMÚ5Í2²MYµ1,VʶVYJjɵb-bÒ¶mL¥ÔÑ%R±«lm$b $R,ÌüO%0þOÌÒoÙjÃ4LÑqU9À7~Ä¢ !«k©ÊÕFÔmQk©m«»7o0¨ÁoåjZõ~Þób 7¤y³Ü ºèÕ¨
J5·(ÆK©~¦ø¿=a6ýÑ#%â~ã#.s$ør EM#.¢1%IDc)òPaøÓêX?ÏCàÒí¯)ÎGNÂí¢#.Ϩ¸#.x÷~>)#%#)ñY#%(ÔUõE{3FÁ=)Á?äzê$ H@(Îh#.%A¨d½©n®úÒ¼/g+Ķ2q=ÙcýÙë6kÓrö#%J7LLBuõS#Ójm#)RZR/¤[#.p9{ÜÑ£GÄ×õøLÒù#%Æö÷zUO"'PñpdÞ/# h
nueU6¢fãQwhîyô´°%d.¢L(¾Ñs+û6@SìüV³úÞì'EkCPUGÚÄáý«P4ur
0I
?ó?¯ð=å_SAûObwà\p"trÑYóÓX·0Pm,¿(§ç'Ë¡tPû¶£a4÷ áît¾<a°4ßI{`»Ó]!®¿#££ Kß÷kÃxÝ¿ð^m<è!ì#%å59צ_%vW¿Q¼Éñ}O©jÀªi0]¸Æ*#)QB}*)%ÿLuÚµ¾óñùËñF)dd$Ôd·µMçÝÆf#)/ÛáKÅïVô$ä÷ÿ`Àº5VÖU5e DPA3Ê@lG[¶ÈâaS°$HFo³ÙAE.1ãf 8jCT)"ãJÍõï® ¼z«Õâªi©-oKÃ:$4±é¨Á=Z{®Ðöu.¹Ëo«fb.=UEm!â0ÒOÔÈPÝ2ÂåvlDT4dñ#%£È7(¢ÈQø:ÿsü>ý®ô%rÈÕÂöθwÆ
¸B,ÀÊhe&#)ËÆ$ðQjEæ¼'/î#)Ó#T}ú/»y·,Tü^SQ×µ Ì 0±BÆ¢RPî) hY,L Roh,àPÐÞ(Dóñî¥ápM*C¤íï2P1ÕÑÈ7gWy²ªGbUD)ÝVÔ¡ýîÇÜÇó±÷#%ÞÍq°oL8Zfx6pW¬#%¸dÇV½ ºX$<Âd¶EP2²ToÉ6¹Ø¦¾ÏÐoåßá!ÍsB#.#.¡æÊ.T$, áaqÌÐM´#,¦$¤.óÏ0Ûó${ÝñBÑP>®6T=Íq"!ÌU#.El[´*TMÄoK´«¾e`È1êÎfÖ¶66Ä]ÉjqIûH`öDqM,\`ÉbÝNö»,69`3ëòöÚÛÞ×ÓÈÛ¶©0EGÙH¾Ü#.ªÇ#)#)µ@bi\¹QG" ØmëK ÌÞCS#%>)A4?ãÝþ==ÆÆtEøo;kþ®{ë9/¾½øáuÌEP+S"BLDeÖ2ÔÊ@j¬®n·¢HbËh{ªÐ±l9§ÛéÁ¶ j
ûÉÑ 7#%ce#3Ä6Ãô Ë&Ù'0ÌÙNÙ4²³ì$½%,J~éÙF0ÛêðN¼ÖÊu8Ã{Ãr'ÄBÓÆ«÷Õ¦®äL{3É`ÊÎÏìX©Ú få÷ÿ/¥ÜçÇÏUÈ·Ílj#¨ ¡ ´*fÆâãqZª EVì(#.[A±hnKm í0À*ÜE2#.{©¡Õ·Ñ:~ExM{({;?~X+P «Vy;'Ö69°PÄÛÑè.à*HÈB(&çv%Äß3æí¢rQÐåeºI!ÚQ²åËýe¯YÑDÔ¬>Ìbi B/ëðwéb}*ÄÒ ,ÄÕvëÞ«Ò²%´¼íÍr¼ó¦ëÏ(·xí®Ðóµ®µmT12:0n4T
H£*F2
PY!ñù¹ÍeÀÄÆײ´¤°\DkI²6¦QEUDú¾ÖÏô½«¶1`¢6}di¤±ªÄB&Ñ=¥¯ÝÖÛ»Ûzë+î
¦\.,j¶Ð!ô#0©5TdÛ^\îlú"Ço_#)óçïw˹gÏltÒùµÅÌ2´tæ¡i¦&YJZ¦,#.Í@a#)+«\cy wã¢o £6ÈÚÔHÙÀ#)bøv46hK|=âÁ¨á.èJæ!e³#%À@QÏZùÀù#)ÈuǼÍ!%RHn#%T4Ú8)ÝÃÁc*·ñ¡È%Õç®êy¼ÃÝËÂôàMýMîÇi'Dõ]Ç:SÑÐ%sa$Dø¨SMj¶e£d´¶5Jj¿"¿+oÒkI×m³»·Aj@¨B!ôt§Ph Ûø¶~L9BÇ}Ë!EÍTÀïø#)¢ÃǪÖjÈT=@E7t÷l:L½xã¸È§º5èâ
ÏÈaÔK»:Úô§7º,âygþ×mk| ¶Ñ©Â«û_ȶËÍî#)Iൾ¦kq´ÂI²lª ߣÊeCCùÿ_^86ö]°ÕéC|¢iÒªØYÃÃ0븾%=$F*1᮸ñéÌ(×]h7·GC¹kQ'dÌ3°8ÍZaØÜÉV¹¦ý:h¦Z$fÔ£Èðu[=9ò6ñùc¹·Ý7;QÀç¯Z®Ã'H»y[U1¡3Ïê¾þÿ<<k|ÿ\s#.£G_w¨íÑä øÊ úð(ÎZÏG_ÓpõEߨÈ*jD1«µcƱ/j´©¶_U \6<b18gÈIDåfølSQ¹utp©YÈ:?áB³»sôÂwÕDÚg'çÕÆüç_VÎOr»RýBPëï5djج§&I?r½¨MÎsýÞz8C¼:æ>Kãôb<%¸8¾.a#%ö4Â*"ÀXXÌ2KdRÄÉdÍT-URT¿iRP!Ø®>íO2ÀÀKð7f_`!ü¿ÌÈc´ÛêÝm#WR´U`H0n¶Ñ;Tª¸#%HÀFð¢('¸0C2 Çhw4© g¹öâ»L>|x÷iÀyÝUÕùÿ}Âó®J(%UakµjVÅÔ= /¯b{²H'Ãf®0ÞlÏnÇ¢»<¢ýCæÐÓ£MÝ6Ô*,²H×)ú´ËXÉÖº¶Dég
Xy4ḸBKU±é¯Eß#%CF<1D:¿±óB2Ç_£ß$eü¬44u #3Wm=|E"²@¢¥&íܤ N×d¶#%#.ÉݵuËrì[«¬µ[M+iÛ]IK3VVµWU±£\¦^.I¥»jßd²M`ÅȨ²('+¹2ïãó}#)5ðE1êm8-Ëö"lcÕ|2ÉÃ¥j ã}~ÛV[
Çî Ìü´wpèpârÚ¡oÍ©¨S 7ØþJ
1Þ"#Fm&ãV!ÛªÕH¥²Æ!®;h=¿Õà¾ÁqTpÔîßm¤×¬£^bc~ ØRÎÏa±LYXz³Jî=o®ºMzGµb¦¼#)@ù·ñô!céçF¥·_}#. ;/Ýæð=è®5ÖÛù|¹Uÿ&»UÁT®R·Ú¡Iùg]$×&q½Zê$ÁÂDR5hrÊ#%3$X8 CL}ÿåþêþæý+Äþd]Zî¾È¯_|ìg§Ñq¸ÚÎÄ~_<EGqôÅÉA°-m
ã ©ÌÖ^ÐQÕGäÔ»©ªe!^HÛz#)5 Î1ص#%âRLS¶,_:9mrA¥-ÏÁºÔr;²wBA²páÙÇgwqsù¬#:oM[·"ªì¢ðúþAg÷l¤r9·Ú÷k÷~qÇC9U^ù7#)$u;5Ào#Çß[å~TF·Ín¨4Àë¾L"Ìz1¾¬í ¡UíÌ«?3íMó6/mqûØ"0ïø3¹zt¶ÛìéB&à(yIõÀ²RaF|¾«.L3iRÁ<Öþ@ú¹ÅßDI©ð5Pùd×0¡ÌòOâpzG(HËWT´Âþ9/Ê!pÓøÖÅhóÞ¥t,eîÆع&Xnc}ÇÚGwΧÐ
³«GÏ D`¶¢½+Ñ£ê?µÅ(²gCÑÀàÄ;,+{ºM¥#WÃeæ'xtÅË°»ô¾1ò?"$ð@JG dõô! #%Ëo¤ÔT¾, êVÑTm¶Æ¨Úl2(
¥E#%R éc.µÔèqô~©éìÂzF¢0h¤`@iAù0W²;#)H¨ã$öÛ®ßÏ1Ü1Ìf>Ãίé5¢CJ³Ë@· ß³¾5ê× ¦§æ¾ï,aÑL|@:é«¡ä#)ü¶£ ¶É !¢¶4Æ2¨ÌýIÄ¢¨=BsQ×ÿó USF£É_-ºÈ#%6(*¡AÌÀxRWßO,ÓÀº?fºÃ¯â6æq°A¹Í÷¹ÌNdñ3]ûi¾db1¨zh{+qQ@ïa4¬bóg(Èöæï"ûSTÛv[þ-ïm´Á(Mó©"'°÷¢@,ô"r¹6gÝ#%ó ͹#p>!¶¾G·²¯]Ìßw"ôÊ Fjq0hÈàÝ`Á eH`àáAAèr$lEýbUØê8Öþ^«^²õä M·ÃxbFH!²(`)kE3Õww9nP±Û+§¯IúPÂåÒ7c·WYÕÝÛuÅÝÛ}TÆM
ÃðgÑ>:Ì/|µ<ªôCöFÍo1]§ZöâøùuNiX¥Øµ´ýÓ$Igì¦z43µ\Ywù&¯=¬ Bø?UÔ¸àX0¦ªx)2˧]#%éæÓк¨7øt9Õ Ö#%q~&»±!Cñ>dÁ8ý<LHw|¶Ç\)UæÛ#.ETk¦ÔÛU"4HFÐÀùj##8e'ÎÖµÜ$&7²ºOÂâíäÝynºÙÖékººÍ+Jfm`©@÷#%ÝÍá
AK{ño+ÄÈÒºö¾'[Âg46S¦ M-nì9¨£àèÖ©©¨ E
ZÎÊ?#.¡|s© ìú*ØAüoH¤Æ4ÒÑ7Û+¢ÍV®tó»;wH,+Ø%ÖM ¬M¡âmÒ(RkQÛ2MÎV²ÏRW»ÊºÓeL¦4Q©[)X¦-3lFÌÚlRÙ&F¶RÒ÷»yu\wsF0¡0#&V¬ÍC"å¾Ï{â|3a0³#.].4."*æn6¬Ý0Lj´ðsf²#%1"@ÝtÓÕÆ6ë!·I¤L5¨¥±Ü¨´ph5õÔW$YWlh{Ú$ùqàÄÃ=Ô[É°l n)¹i®(dÚéÓ)7dü1y{o+ªÆØ1µ{k¤XÕF$5Br8iÍKxóãß9<·:L¹#)¯Uð ¬ØdF;\4d2RP5ËBM0m¦Ú6pQb#Q±4oqm,d3-%¥hCÑV#.ÃNklÆIJ fc¶¦0ÍúåÎ8DF±¼CVä+n³lÉÄ3jîÇ\pe&&h01\õÌmµ"úYöØd#.¢%´7f¥27ûPóW ¡Ð§Jªz 8|©Q(:uyBÏ(±v\*
3&§chÁÆKgZ.KYb.k¶öõT!K#%ÀtñÈð5Îô 87lA~ÓMÍåY`dbF}àÀî?gÌx-:MêÐ3LHh[zG2äÊc9ª$(=þ ¡]Ä 2Û#.ÀÆò"21FrÅô³F<g`¢É¶ d*oYÖõ½BhQíåߺí MiVB-TÅV\"¤rØ©Bø-Mè1mávÞ=\ë8`cÕ6PÝ#.²é½*Ü%"»CLê4´Ä=D©[
̪·lc~Bnn'l{Ä,\¢(-( ĪÒ#)iR*#%0DÄ ØÊ#)
°DFI(ÄÖWQÜÀ7[wsè<¢>¤Ôk#%vôáéù´Lîº]Wè¤EþÛuĸ+·©¡Ì1õËKÕæuS)¸>|Ó&M{kc¸z×ÎéU ³úÒaI>JR-!lMHÙÓË˱\õÑpnÛXÓo=»º)doowIÙ+<õG«8¬ºÖjcfgV¢UjâÌáâ^ß.Ò²yõ×S5üoº³w[*#/6äê6o:+®xó6á&2Øq£4a!öÒËÖ0$´°*°!ãÚH½.¹EÕsnVt8||7mÌïßÞ`r#)ùê.#)k¶Ö$Ýþo ËdÂñNÝD2cô8ÔrQçOsóêÎνq¾äB¼¸`¸vj]sVÑÀ;ã8)èLÓvTU2ÐmU ý²ueWí²ÖqEiÎp°ô{>=;iqcg0#)ßEµ}iÃ+A4¼ñÀîÉO <"y}&\|Þ>@hÞV"±¶©mõ×ëmFÕ³âhQKq6@ù£"hl}*¨¤¼å¨ñJ9$R6ôóÍãͯ,o]·mͶJ®ñѱV5y×.º¶å]Û¹xÚu46¢6ç#.ÛhÕ%eSzª¼ZñkIºk]·^yãBKd¦¦T-V*ù¬Tcué2)3Ýæ|ØMd[I"´, Á*,)ªÁ-ayI.¥À
!B¶6Xf'U×Χ%ÍÊÓ_^LÑ°D-'ߦ5Âm¨ÀÛMÖ¾TF[ÎíJSTøTSe±YÍ)±¨Ö4TÈÔmÑX2°XÑÊcL¤ªh#jfK#%Ñ"#%D.´DúJ@Ø{9û±>ÃìóÒ"UÊ!°DI0Ù}Ç=wú§ÕÝ~ÏÁoWñõ\¹þXÙ;rh4C#)u1¦ÑÆzµJ 1Zß©¦ÖZ/ƹy)³bªü[ôÃV¼mt¿Ý@ÔS<ÝtjݺZîÒSm®FÆÛhɬVî®Ò¤A
b0 F@Mÿ×z~r0&|4wÔÉ(1MbÕ0 @c:q' 9fª¤#)eÔ'3Ë¿¨^ð¨4õf¦Ä(Dd#)LGM</#)+hLáæ ö]©íúòú°FÌ?FüçÍ©ÀÅY¶
¡ ùæ@ûñ$#)ÜÕGñg#)k4èS3ÏÑe$ÆWs$ÓP Æ&`í2Ún 4Ã2LáÌ}¦SKk¼`Ý¥yúwzúg#ÚéÌ t2c¶N`2ýÙ0NëP ÖÈs'ÜWIv6_'{Æñ£ÂhSÁQXÉX28Ùß%µ$çÁåá#%»9ÌÕ_2×G¶V6Áê.3Øa\&¡PÃLK»Ùîx&_ã'm#.ÄAaó'Fà `ììÇnåd>§aºò¸TÙ8Ùlý8Ú~ßÙXô`¨|zÍ&#.vJÞªHH¨ns'kàÌ.ôa¦ø¾²VJjM·×KóZµÒ¤4üé¿zmóïU·ËVÞO¢Õ¼I ° °¢ù{o#%Õi2ûGplË·ñhBD#%0`^;.cë):Ö¼8À¡#.¶ë³ãm)¶Ý6×y2@¼Z 5PhPhÆkpÒÐKjÀ,1Ä#.[µqA×$ÛVÌ¢W6Åõ{¯;µØ¼mvl¹¯/.¨¼%ï#.±²¬b¬$p
ñÌ+i;XÛ#2Ðf#)°&Z6ÍZ©6F!°Ö$c0lmA#.H±B¡BÖÅÓ°wI#%"ÂàÚ=-%ªèÀ¤¸( 91xÐ|õ^1=Ä#)êãM1Daê%òo_)P¼æð)Å®Èû$V ÂÁTçÖ|Ãx«ÛÆFN,¸.'ØfÁ&cð£-½{rÙ§D8YC¨³EE& `C+ !÷yOV¸üǸ ËçX}õQPÄû¿Ùù¾±¼8Bj?ת3t~íAFq9Lö04Ú¤CºcÜï#%±#)Ûë¾çá/9|(ô~þ[-]g>nAG%Æßr6½ÒGúSD1 ¡¢jI¨³m÷³£è#.¢h8Is·|ã{¢uºD}SLpP#)íÄ«#)4ØÏyÅ7#%HgÚÐ8âôÙi¼ÎÉsÕ@Mp1¤1#)j¦Øó#.bêRÁ¸±h-"ÓT¤"¶\ZÿµQ/ì«¢9ã§êzýþ(ýoÝÄñøÍ6½O¶¦É¸|¡Ío å/RBµÀæ9mª¹¬¹¬Ø7§¼ý¼æ@ ÕÍ.s"HUT¢¢PDªF#)CPÄûãk¡v÷;)(B¢ÔáÉìLsáü{î;#)q¹Rj¥¢*1ÔB"üå:»?UFÒ½ùÎíx»¼î²2åW#.Q×wÈlJrÜËÍÆÓe)&¡4¦¨ñªíM²V))60xÝ#)6æÔgé¼Þ]¸ë®Ùt.Wwn\¼[Ǩå4·Énܻ̱¡ÛͶòã[\ÜÕÒ«h©KN·)³4%gwItæÝÙ+)S»t«¬¹Ölm9j$ÔdD!ühv6Kª¯©=0£Ô «_£h>vC°·Y 6r£õøÐ9#%v©ÙØ
¢ÁvÂ! A:Ø`wý@½â"oNx¨÷þÂ{S¨p#)<ÊA¸!ÛÅ]ù>ô÷BzJó¾£W²×ÂgYïõyeØ)>º(?¶Ûðê9ÎÖ
GbUcY#)Z¼îÊfi}Vò¬i@¨ZªT-Awý¥Ëæ£g9û7ØL B°2 ¨$ÀÐaï>,Ç {À4Öú¹uE%¦çjuÝÔ²±cwZïnÕÊòJüÿ7Zh~à»#//¸ 9¶F.ó¶ßI1ïtÉMÌfÚBÐPA¼XºÆ#)©(ñzª¯$VÚëµ»i³ìmåOuÕ·jÝ£#%ÃAÎzöí\ÄÈ(Oz¢Vuá#.ã¼ô7ábÃHÅ``{O×ú¦ÓXÄ#)<Ã@;Q]ÑF©fÍ«4Ú¥Q[J²ËGhëÕñ0A¹Ð@AM9èUÉRÔ-2f¨ÖÚÚ ßí=¤#%g3íßH#.#.Àe¦E V¿ÄeµZ3#.Ä!ráÄôÁÇ9¦ÔΪß4ÅÔDå#%tÜ¡LÕþá÷èI¬4ÏG³ô£©æl9ùö{uìü·Dø/ØHÄ8!Oìc7÷_nؽlÆ.pSù' ÕL"@ÎE°Wù9¢ë¨o"+VlÆE!öã}Ú0þÀt/¸Þyx¦©æi*OaüÍ4ø!vK1¡5$Kd!¥Dã r l)li ½<ÀÅæ%Oí9åxÚæ®Uʽu¡6j#%&cÌZ%0QÆ#.°°!´Í¹R[ÅxÕ¶ñOaÙGªÂ$Z"¦gF £à'¸Õâʦí\a#%¸eI®£Âï#%ÕCZýB hÓTZ5¨6È]H°FØ¥0«(½LÆ#%K]¶ª5lV«{m®êë ËhvØÊ`l7¶1`ÇpaØÙ³bjÑ¿í°à;nÔÊjNúÃ0é>Ù÷f#)ÁU@D@só¸ÁD5¡H@ÄZtøýqÖÃP?Æ>ÈÉÂH#%£d**
`U"A¢#. 9{`¢B(|3HH3$¥uí§lrÕyó[ÝÑ6iÒÄQi #%r:ç¨C$õ'79O¤§ý±DM¯~ß®^ê;UÐÕÝha´A=+týÔÐké}mmq63êî½kÝRî©®"<]rK&8(BIjº5GLÆìÒÝÅþÆ¡¶ihQVäîv¾UY86pÔ*ËÊ«mµ^í1_Úw={à@fxA> Üxéo#)fgXxçPOäÌO¢:¸|¨®~J Î ;ADØ##øAY#%$)"¢ÓCLV>©R"¤;*ÔP9*>`
´ijSõ Lßé:.Þ)íßýþ¨:ºx Áb¬RI "Oj'º"0ÛDÉ#%M¼Moä#)¾r¶ß4ä[ÒWÙê«ÖTckñ%A¦ÇõõW¡×útSn@î`ÀÏ¡BQ7ìgsI9vIxl¼Ø;ë4`sû%±Äf¡)}'2eó©£#)T#pÜ&tǧB¨ÜuÎnÓôKÝwhä!ðCF¶HÍ(?.4ja)/ Ë©AÀÛJ\2&´bD´÷Ñ|ü]Ø#.ì6ìlQ/ÂÕõ»#)Þb C$/ÂiÎγ-õ)Öø>ê. sèþ¼Søó|õÇ}ØâÓæ£ÎIaøvG*ªsc¶I{"¡ÞiÈHýϲ´Öÿ¾ãæ¦>ÑQÚ¶)jp?#BzÅ{oÇ´´7£LÁA( É]õÞùÕã9qν\¹xK\@Y&#ºbdÁs8ÓÂÉLFSZ>¶w$îàÕÈhd0¹}ïd}®ñÒm:Ö<¢2Ø)êãß6£M/ò<é<áÞi/¨ìWÁî'to°k³Z Yú;r-^ÝøδäFÐ4Ï»¦ñ¿Y]Hx6²MÖ_ÃìþÚ«Ç¢&`!3&l·x®IâHër¾ô³QºèÐâí#)+Î46ÏصÖá:§óþARï^¼»Qª$à2¸D1#Ðñ*Sù(ÐKz`=DPýö6 w#É¿ê%HUn0,ªËØGÍG{ËÚLZ\dDP*#.ª)·F^<¶ÔÖ\îFIÂøóл:õÔG¼ÐÐÕç%#)DÚiT¨6æç¡náì>D?ûÝ0@¤#)AÕ}EáøU;¨ÜB T$vQ))#)bÀÙfàòóä;73l´dzÞ³;úM˶Öëö7ìÎ]«ªò@þqî#)I#.I&«÷ü.ÃP6(ÄFàëMúÖ®ZÞMÛ%Í\ïuÓ/d3fjíèÕ)c^æ?Yó¶æ³#.--kJù~¼zôÖÞÖ[ÿ/W§Ù¢?B{xñòjÍ5Ý£o± 'j©z8שÙÛ¬q£#"Ål!ÄJ|mìÆÂTg!Uò´Q¼A 'If ¨ÐÌFQOÏ_¯3¬7GÍÜ´Ï\Õd¸@£>$Ý4·t>÷Á>¨:w6 t}\9tú.Z!Õ Êüöîª2p;sÖðàÁ)~ÆØ5ß#)1P´ÔòX¨&_£z«¼ôsöuÆðN½ybÏæ=ÝfEPÌÝ'Û0ãO'ÛÕñHyгë5Ï] ¥¢¬"*u$=Èñû!ïýâ°nõBA DB^²õp]@>ë$z+æ>Úð<ʹC_FéÇ{Q£¬ö'T¸+ñò60ÐÜÑ116#% äzÎ[ÅÇz;>IõǶn0ë´ßÞá¶ÂÞ_;I)SìÕµmóh;´¶ÓkïbÚb¼:@ä¡í ø$ï;Ó^ÝÐüxðupQÓÆ#)g pkÙIÄa& ëPë`#.H#."uÄX¤b9nóPηx[c=uj:F7WüN#)N´+ÒáqZúøÿ#ú¾fee/XALh½"@JFÀ þLWÍÀ}õw*U 9È#%, w¶4Þ{)p'8½ò4
Êtâæü#Ú#.#.±CLìK9=ùaL7 ×ÐEûKàäd]P4Ærcè¬dZK
õoCu¾
Õ[fY+T{!;{7â|%¼b?ÓÁ§Vbæ oç& µ:eÛ¥ÎTjmEVVMÅÂ#)]L·è`#A
¢MFçzpUB Â$É|-ý?>ºÖË4{3#._ųðhÿW§?äÌýXªcrG2%öeÖ%1ÜÝúé½c*©Ç#)Í»tÀdvιm=
ì[vës>j3_Ñï^ $NÎF}¤ßâ1>¥òAÃb:Ñ»O^¯J4HC`"u²¤íH:aújB1éÖ²x¹»£1¤R#äq=çѾùÍ##.Ú4éÇurµÜý˵RQ¬bÊilÙ±bmjPE;5Y#)#.ÐÉ0ØÉbcÙ¿ätÅ<î~Ów-FÅ_µý?Û½ö?kôï<ÈBdÌÙ"*`4ÑA)hKIFbF Ò#&ÄФ$Ù²l¡#1ù×nݤøÅÎ/ "q}1ÓÊ?]×öÅ)$Ù·lÎøÆ#)̲AtDgÅÍãPT4ÁmzÖαZ²:¾â´)@Pªµ¯¨RËA6ÍÊ(B~Éø÷gn{¹:ö^ÔçÂr~ß\½´m4È'æݶg#%`HjÛo,ÜÌoK
ùa°×Mªì#.»Õ´ô¨qÈÀíØ9¨hti¢²ô3&¥ÇVÐÒ^;Æñ?>/2¥þBqïä É q Fr3Æ«kú$ýÿéÞûëS©ÃæJRi¾m#%Fö¢"@Ñk-©Ö64ãJ8Á£I¶*ØÐ6!gn7µ¯~:ÊåÔUrÎêênjÝNc#P2F7vRQ¶4ÒJ+52TJVÙA6Ñ 0Eâ«xÞ ¥lB.Ñr)#.{è¢A¼¥M¤¸jþ©!6Ú7´jó®ÖW*àUË¥Ë; ´Ê=÷À ®²^¥tË*VJ$dÕ#%©#)AfZîÄÆ0¥Òâî<ÙQ0#UlÂ\ÿ6O<&¡¤Îù#wbâi¬©ã*AÈÌ<êKøµ#)êP+½M¥aV#) âSCH ã%K£\*-m¤m"´ FÌBÌÕRªX*+m\JFá`½y$D{U°i
¨B1²(˨§4U!Ón9Qdj&Ô4âiãBÍj¶65¸IjÁA´=#)É#*Ê«N;;1F9X#%#.m+ë#.
\ª'bB²Z1¶ë)VèÌ%(ÃRèÜQ(1Q°bTK.z:7#ÍÂãÞ=ìs.îö««¬ÍbÈ´î4è6ða4îñÖ´³Z3æ1³Fùh¯¶Æ<sq79JV#.µGZXØXVI+ ËV5êàÇÓ3b²Avãïk:5>ëY"[D¦¨cFøQh44h¦x¬R0q¨µ<nÓ³tÆ6wÖ¬Àn(áHq·1- `iÂ>+ÅF#.Gp¨â¬h@;Tdf#)ò°%«IƨÀÐÈè\ÑfPj!Bd&¤h"hêáÆ&©( ®<ÿ=Mt,ÔÄe¡7PÁÚ,ÊÀé!¬¤9^¸44±¤6è|ü|y¢Úzªæ¹©²îÙzíãk²§vÝ.¸+ÉU÷v}0Û1÷wÈÆð̾R9xbmã¢8&ÅSAÁR´4°µÍʳQ§DMèö0Î2M×hlÕ"èDÜÅn,f½iÒn°a£B%F±h±AÕÆìäeÁÒt0&@ryÈöÀÕä*%|ÏC#)¬å.ù¾N±½Ä°¡]b"UM}Ú3#)J]#%cfѨ© èChôÁª[!ïö$×C¦¹5P"ÝrÍ*#ÉQvÆx5`ÜMn#*"#%$lM3©
4DA#Ii Q%É´BÐT bJ£"¤Â#%E14D½¤²H M¦ÁTõô:÷$j¦)(m¥e3ú%D±Èýq5Û±»´îKrÜï®û+ó%Úm¦Í¦l²&ö\ݶû0!÷¯K)ü£îÄâ`èw~.g«¢£Tâª4@;D±Ó+¨ú£]1QL óÍHgz¢8~U©2sU#%E$T"F#(ÍP**l¡rús½×$OUJJp;+À"M Í×OªÎ00Ò,PL
Sì ;ÅëlhaXv$@öÚÉÞOå6óÞãg;b(ØÛuut«ouÒwGÖ¥øwuà¯Ç¬J3s0lG](°7ª7bÊY¦ýJYâ@:õ #)Íwe¸`Ó9w:(ÁÒsÇþ¥l-è>é3mAK³¼5Â\S>Û5Ôù\KKîÌ1gE&oÊælE$H³FFïDañ7pÚÚÉ{ëÏç=ͶWòE ¤:¾×R@s$IÉ÷å¼ÉPêeÁx(aª)!à&ak_æ#%mBa8}üõ¹Qzík'}Ê^^Íè 4Úki¯#
OF?YïK e§£ñ£óu¢í´~kæéb«VrIÙ§´Y{ØÉ&,´Ï^ûoÑ¡rhHïM#.ã°ð4È@i3Âã#)ä$ v|S¹fûw´Ö²¢W¨`oMðéjê¦À3¢ÅM=eDT*(;+Fí×Å#%«Ãï,'«-Tã©|2N¡lvÎóX
³TeEE#%ETúÙ$Ài-;iJ¥öULíéJª4sþCõî÷n.U Lì0ãX̲¹ª)$%ç-Ù9àߤNGPMq4~X`!dÔUÁL#)2¸4ÑL%7"Q±³Iêå½smâ×Mh·«[±5ÉçU^6r×+<nmuç[X£ÉVCXÔky6ñ«Æ²kÆÛFÎïähÖM·ªáE´WÖÛÕ\Öé·UçÇVlZÖ#)ª+ã=¡u6ÚnHx¡{#F4¡e$B+TA¢vª-^ô¿·Äi#oV½[þܸÑA¹Û)G姮 J>ôC/±ýP3#)Àúë¨6}Îh)ª¨xþyöó\·f»·]Ü.ͧUT'_ap®Ú-.©;Pl&
#%ÁªH+"*$"J(Y$rÔ-äK·#.v× ìâEd@a AýÝÆÿ¢Ã@itÿX<WÝðè¤é·2-P¬ñ%âyQKÊ<okJÂàx¨)½³°ì@³ÄÔÒq8âW¤N4<OFÉ×^ñOØ0 3dPÃÔ²FZ44J¤ÆÑbÊRRLÉh¡ÔV±¶ØÕ©´Û2©¨ÔË5Y´bÁ6JýcÏhä+Y+dAÁFÊäHN¸#)mµPÊB26FÁÀÇ;bTë#)0Y<¢@V8#.dXÇHLJ¸TKm#)±"H1T:¡TTl-3I"\Ô¬nÒ5W-j¤¶ÛAºÅ$QC òü¹Zà)])i#%
Æ*Lj¨©%!9À¤¼Õ0BÐQ¥XÂY´O :à¼h$9Çç¤üÉ·°ó§èðùz3é.yh¢E+ؤ$";;Í?Vfquã¦yðÂ:ìø6XXû#¤´´´²ÞÑIoe±S"¼ùxùï-{¥¹R÷*kVàäÅݽIn![!T#) QC
Kî±FÑU
ÊQ,zSrt¡Ö:üÝO4qÞ<ò릺¼²ì©³2
û½µ\Ô[X¬(!TPº"î cÖ²nþiýÂXâ3Ò¸£WÁÓ(X t9ô_¿}®HҤݥôé#%ö·ãhþÂOÆå¡E¸×/Ójþ7¯¥Î¿¦*sxl&ê¦?§/_<k:F%#úø"×50tÆoNé¼*~/jKtý·²z®¤.8ésǺl8-eÛ%<<?Gi{ÆÍÊ\ã~Ër/¢ø%aäüµÂ)NJ4/ËüÓtç$snÍ(ÓJlç}.ÙÎÎÇØD'b#%|³ZÖ7r_'õ¦½Þè¯,óÝÌÒì¶ìÏ(Í'¤RÒ¤e÷¦ý¨çÓõlb|u«0bªYºRÁÑÇîüí¿õF{k¹ZÌ!òW^ÉW\0ÏâaaÀVS1$'m"{éí'wÛn_áî7êçݳHÙ(Hrâ|Úk¥¶õwPpAÞí»Üµ®¡ 1ãΤÜ?L¿ ç}ÝÅ(T³Ï¾e4·ð>2Ð`F'åíâùý1Ñw±FAÂÅ#.§
¨©PÚ@]1AÓKì¥6Åb$ZîñîϤ±+qMVä®ç¶'ï±:X£Ø\L(«RÔuÂÏõõØZkpí^½ºLVvT¯/XFsq/î7Ȧ¦ ¯d
p±p//Ã?{ê}9wÐi÷Úýþ= lªvuhq#.êCâz©nCª²Î<A0ð¶m²ÅV$n<¹ÐM«ð SbÚûGJòçá]ysÝ$"Ó=ï~tÀá#)qQ½s%1Ь>ÖpÁ¬ÚàÐÊa¨ÙvßÖ#)åÍg_*ø~bU¦Ö×LÎ tLÌFÛqVûµáéôÉðñÓ°Zdgf«tR¡Ó¶è¨$LI$îè³|Ï5¹UY·'Æö¢Ã EÚ7Ó,K1â96¦b1í¶æúFq/+6ÌkíSb0+GÆK@ùFÍlÁ!ZqÄ?1¶;xâÈ3ÜXSë+:ñLh¼b9´§Ç;§Ö·Cí}ë®çhO2òI<¼fj7(m<)+¶*<k".¾,¶´âKÛv«Ã·¬ÐSÅï¥SÍ{#.=ç5Þ4có£G¸Â'Õ¹nÆË·Øß/×>Yͯc·Í¹µ¹â êøó|;ýÒöT¨ÎåpU©¶«×-µ×+ÁÆríÉ!Äãt,YyQ·<V{¼83ÆõÓ[uØäôË>ÙÓǤ.ïÚ7¤J6ÒÛnÔ«lçâÂãJ]l[NÝWÎ6C¿'JFê¡ßoñ3©GDÐeð=¦úWàò¿WPÅocé7^ïéÛfýÃÂ%vØÉè±x¨ï9ºéÀï<CÆwMç}7\yïBkBgky ¶QKÒs:2c~
7 ²¹Óx'¹#ɪÐòõ§ÀfµºdÌ kyJSÍc~0£
&ñ×x|_=ÉøÃá¨)¨#%ÛEÙ#.
ñ<^Z¢Ã!ÙíÙf<Pºs»lÆp~Æ5ÜX1 Þ¤¢ß×95¡V4Ø»´!×usJа¸k¿Cäó8ôÁyé@vRìä\0È.qÅLãF£W«H
Á,#)Ûdã7'GÒxvÜ=x
²Æ^ÎÅ®]*lVÀjÙ'æ1´Jä7õp$v®h¹P§%î#%kC(ÂDxj6ÃB86纺uôãYÙ(y¥Ø%XVoG=ÆlNY#)tÈÓ#)gBç|±ì×XÅVDÎêVmV&NèiÝEeU¯2 ¦¡Pƺ¥éõõizI_OÅ.þÛ8Cû´Ú}Òpó-ËTãcÓBs$b Ü ¨k÷Ä!v×[68Ì©ßQ©t¸}Ðíâ}f£OÕ¶êýç@mÌ¢Gh´®ª&PâÜ©oi0%ßnú0âÙt[Ox>º7VµÛ¦6)0Û{özl(#%Ä?Co«'Eµ¥z')Èú9WÏ=$%CÖÌC[ G¸qÝm³ï]#%ïÇ÷ds-ÅMVòªw®í¢Þ0×CZ3oQ$Õ©`ãËK`VZè§À¡ç~%@½wÙiVkQ-29¾ysæâtÍÅh«R±ËJuqÌd§:hèöMöé±]qËn<ïðÃÆýýñ(nÍe×L%Õ¶m,Áv-ê_ö¯môê8/ö`Þñï<¯³u,ÀynýíÏ)}×kï¹4ë\Wº[ÆTµ#.1ã¼fLÛÉ@ïU>nKÊG}¼`½´øîÅ3}ã7Ô37Rã°d¸´ðD3ÐbJ=~#)ãX)bRÁØÒÕi Pû1¾OAusJ#.¢E'%n8*eÒ¹Y%%â0¨»Á'MNL@^ Ö#.¿2<Ìd4^²î:2x;÷2y¹ÉúØßÅÐ×´(î.0Bµ£}²ûâi#)!IÕËQB:ôà>#%>t Î|(E#.U¤¯àQ6¶z]6GfyÀÌ£AÑ´ô,Ï òööHÕ]B¡¡¯E´ú¸Ò2,öÒ&Á¹å+¸jF¥(R3aA X°*AÈεÖoc &ݲi»È7MÆÒ#%0Á$xC6ªÉ{þêEu×}F§~ÐÃj+Dõ§Äþ:z#)ØÌÃædRâÅ´AådzÄÛÛ¾'i¿Lr·/xUå¶,>Ú1Õ°RbHÎj#)Yy±dFô÷Phùß<I¢<ðäo¨=KÔ[Ä´`IÑ»"°1ÄÝFÍ~5ô&ÔOCY¨uí5zUgfBAYgËbÎìF¯ÕÍú¥{V°#.Va5u¡1¯Ë±èz[¶4Fhr®ò<WƼ]rkUݳºÝïWßoUPl[åÉw[Q뮲ó,józª×]6Ûò+WA©UE«xµÜÚ£$
0
#.oÂÀ ÆÂ3#.#."¢ ª(ÈT ÷$\^f1_è
«È#%ê`6:£uí¶_éi:Îj(¢y(a6ñ·"ä²[MUkøh«hªå¶ÅjÛÖæ·gÇO<~Wsy¿²îVð}°Í|®±ãËGAKwx«Æ6#)¢¥D2;ç
X>¶zpÇHpÿ¯ó6il^#.1¦@û¦\v#/Y§`f 9][j)g>9&X ÈHR#)Ðe!dQb8|¸ÓÔðe«WdDbv åHyJbÒfêo@õ%qA5M¦ÒI°*¬lLc!%Zã¦3Ǫhêå×Z¦8¥QÎÆÖûMJåZ3x#»uAH&a#%µYwn1MY[¬5p#.1ØÆW±ÞÖ:ñÎÖY½ÈÍMi¢µMkZà ÜÌwG/'¸Í[+|2b#)±!"#.í7"*9 UbÇKÁ¬¡ZPÉ3kòÞõ®z1Û!Ó9Nó+:² ¡#ÁÍ
@e C*Dci÷fÃL"2ê#%²#%`Ñ2D6YTÞ®e|3Jɬ$»ÖÇ8LºUÁ:@Óv{¤Kz}¢µÍDnKÝ8axm·³6±&ijl¤NCð
hc]õx]g-[ª&¡¦rtC%cÔ!´nJ ©B¬2#)n%48LLayÕ£o[o&K,®Þ¼ìYµ°OZ65#.×G´¸:¸C[5F¢¼Øîº#.cñw#)²L°8DwÿaÌÑxñJÖ^ûߥaQi¢:0þ6»Ó?)/EFôð¯u²ªÒ7y6D«Ù!%y`Õ`ÈÁÆÜré¸2Â+M
uØiëF3BÒÑàSÁí¬Õ*¥cåå9éæK®¶AõUVÒ5§ó4Xâ²eÆÒÊ>*ÄXУÔ]ôZñ»)¡Eß¼#)4ã#)Áè9e84ïs[u¡ðÖÞÌ¥05Ä.ɦ±àhÑpf«X#Lðw Ït®ÖC!]N#)ÄiãKlM)®¬å¶¥¦ÓéÁkB"0]C1OtÎR4Õ#ÀÀHãÂâ[ÔË&Ú`¹¡ß.@ä7u3Wf_p*ô½N>ßT¹ñMD"6CÌ¥°90ÅÏnÆkç¿WãOª(M9&¥tþ%·ô»)-rüÍu»\ ä¹üM0¡Ú+Ó;¥BôqB/6Û={%x0È£MWiûÎÄdUFG^B{}%ía]M6àÙ?'«*ö-S+à®àI'°é#.ö#.sU#)OXlÑ@[d27øyúÂ~;¨#)ý}+ 3°yú|½Yéàùé ĬWiÉż¸Çèòýô¿ª±A²ÕJàòå3>~3{{p1¼$FºNîäÂ#t¸îÝUNyglò{¸Î½IÚÔGÜSÆ r')4UföÑMQ¼ø£(AËod24i'1éç¾wPz T-á#)¯$@0/$j2Ó!KuS)ªÒòîkFÖ®ÆÛjÅERÄ#);DÅ;yÉ«ª{:êÆàýÈQb#j4ÚÂÈb(( ©¤ªelÓ&±¬Õ%bM¤ÆÍ4ÓfT,I(¥(CÔH4S4l#)*°Ãf!µÖSõè<ñ#.'Q¼è5¡¾¨ßAìã:ÃaöMèUÌÄöl~!½ÐiûÍ,$&Þá#)Ä4m]´êàlôX¤ùumð
AñÈ$Ûh9Ä^$uÔ!ãrøa1-¸nfJAHl2ú>¼^3ì
_¤äHÅ$"°uìn6È篥3KQ1%>[Ã]äBêMoÝçá û´ôC\`^ªÔ®ÒÌ>|"FùhÕZìsS¨`MÊÌ<Y5ÈF©6ÑGàZµÍ¤[)54²3HT`¬#%
AJ¤})p.@´2CÑÔ)#.DD#.$
w¯0¸5e±öÙx0éë/d¾ZÃsù2èÕc|\]5pe¢Rb"ÛÁÉÄÆÂØôÅ5Z°ÓÒcÁ̵)BÙ'Å¡l`ª#Q¡Òû^eÊS·kæW6S(ïÕf £tff0XâÒ¡cc#.8ddVKÑt<hã¦OßA¨ÏEÉCx¤3
ãÒ©¶âQrÓÔQkÔH·mv3¹k7½µô¾/|wó<9VÙúfÄs¯¼ÜR©dXzÀqÀ@Ý8LBÄ¡±ºª#.ÜÍU,õ2ê
ID¹¤(A @ÐBýª³ B#.éÛÇd#%Ï4Ä#JU#.Iâ°U¯>¦Ây?fé!Ù`ö}p~©¸öönç8ÏÐÊPÙ÷¡ê"B2ûp¿©úq&.Yíé¶MÏ`Ëà ;DΪ¤×ªm²Ø¬%- sg@-j&~äå_Û·IYȬ6lè´\µçó"®¦E(B³9áü¹òsÉ [4Z!åU©¶®ø7IAOIñ,#)9Ó"BY iaÞqµm©a´|p4·ñ9$ý´q(üªÈ$ù(u0'I©ÜF ÞL¨lh,RhJiF>¦}Mw+ÂÓc¢Ðéô«ûÃw]Hj¯8'\hð=´UÇë$$@2/iËIaÓÍÄì·©3<þ2l]C©8|ÆZüTÁaê
1¡Sé5êOôLاb_¨scÔí/¥Å%&lóä¤=r«8;R
¯×ñîÁ¶ªÙ¯çFáè)N¾·ÖrÀbDDAU/?8ô/mRâb_cõku44á qí¤^°0°¦f{õö~npú3B¢\Þþ238ègZB«¦c&0án®'$êuNmgà°Ö0þgÒ!èªOg ¿0¿RÆÒ]üîß^à {AWImo£È«1¢:97ýVu8ãy3°liÍstÑr6cö.R¡$lºüóÇ#.kÃȸ»
|YÀJxN¢ªÞÜ~1ÎwÔÏ ÁQ³C#L06#)âF( #)WKÞ#.¦5öÙ´ä)_ê¥-)Nr$ÁóÃ9QMvѽ08HzÒQ4e0äÅeÈ2XÃv®Ò5çrØL ®Lë5Hµ0à.q#%Ù5MøÔ°ÍK7 ÚfHf·©1Ä.áÓCs2uÀ,ëaiɽt²¹<!âØ'¢H´TF¹SSÌþ%213T# ÃHØf¢Ò+ÊG¼XoFlIP\oF1.ËJf£HÄKÅ"ASA'G»¸ÁDz"DR$[#.áëµäÄVÐÁ(Còù@à«i§H! 36¢#%bõ£U~_ÓqºØnroÀã"¡Ý HTç(BdSuÆÐÓR㻣r@ Î*WÎÙ¿ÓþQ9[q5W;_LL!¤]:L°àóÖÝã½7îrS°ö¡Áv%³[¥Ðô3¡ªûe25ìÌ[ÀÃ<éD¡#.Qî3KÖÐdék¬X#`ÓAÇh´Å³¯5s#.{Ñj(¹&åOÂqac>.I©¸£¾!MàLcÐÆ;:Þ ïWnR*F¤:\L±ZÙ©2Ö!( ÙJ¢ÅX±Î<I"ÊÆùQXe2¡&¸s£KL#%ñ!äg¬$eèÊ3èЫå¨$ Àõ\SchË1Ðdh7mµ©`Ò)rxt7xÃ|Î/TÓÌ#ãÇk65¥>QÉ.Ú-Ø®P¸q ÀËJºrFÈ'VTmÈ¥¡È½Ç0¢$¸(vC©mEÖø
Z-嬺´ññK¼WL.Ó7é'ì]
]^º³~ÑZ·ÛL*¢0@êI&zuÜxnѼ0¤ÉÛÔÌźð$MH³N4#^£Â¹mE©¢!nû0³mMÕNwá^.gdÒ;¦ÝÊÃöAbÈ+CV±¼ñÜYÆuÃ4L°G=yÔ$3%J,Aô¦¾<ÝÛ©à>âK5ì´;)qç=zãHàUÉÁ®I@±XeÙdÍâ·1Ϧ¥¾]04©qs:ÙÁ`qc*úÛ7\^¤éÆ,$ßanI\D)ß7[íL6´V×}EÔ[@D$MÉ5)b`(¨Ëp0ÇÕ\í5H+aB"0oRêV¬½õ44lh»1#%üb¬É7Q!'7ÁGSYVK'xØ0Õ18¥ÐQ²×ºÔL+¼ííú<6îi÷Ù¨}ú]¥ØNÐÀ&ÍDu±¬RöP¸Ãlâ]-YÁ¸xÈ.îÌ?-þÏ\e\îG¡å2¾#)f½¸iççB! £#%(nÈÂòþUè<ôPbmÇG÷f«#.±\Ó^æF^d«Õðä#5$è¯Ì38:ÓH-`EìómÍùe
ÕZ°bZ6t¾-Î9¥ç\<¥C´:lSCðÌ¿wF¢b#A¶.`«°s%xeõ]ê+r·@»§sÞ'É.÷.ݺ«VðRwæS±½¸ãF;fµVLo#%àÉD 38(ÑX½Íl×ÕåÃPðê"WK7¥M7G4¶¾få2CÉo"/9%âëà-MK©Ï8G )Ù#%ð@@¯ÇIÂ#.1´#))0ù¼4÷ÙÆ´ìÓ}ÃFûeÐìº@ÂKOL]k·à²Nô]ZǨb¡4&µ!Û0N;UMá#.££p3Ç©7Õ$m13pܤHùfHàÆû@:H"¸ªPÙ5SºOníçÐSÞÍW)hÄ#.4¡mº-ÝÒÌ@ȹÝDÌ" #µ)Â3-æ#%KCAÂ.K¤Å5ATV16#)S$¢ÍJgpÑFÌ̱QRL#.XU75åJ!d
¥A&¼nËà'@KµF
ÕìgjGÈÍ£4¤35 v2`P$#)u£VÖ¡L2B.É MÈ»"0]@©£gSBî¡#Ðu]hìäÒLS°¨]qFÄðHeç+
m¯.4Ó©#)¤£ÍÐ2¡Ø"oh¡SÆ2±1¬æO/>àcÖرÊ* KE0Fuã4ìEÐòñç' laìà@HhDXD@D* Ä~¸Tæ#%CU{oP¸#)¤ÊåÇï+LÔßi©Júg/ÐZby$réÌÜ@_éÊbÚ9ÝtÃÂn#<o]Ä f¼»ÈÄf#)´ðfжkù%øõr]9i«ÊªE¨øMÊ]z¨EGq#)´újéÎ%J(¦A5UBuaÐÆqëµ ýûw¦8qR¹¨åÊ"påreDÉÒ[¨~t¢Wص÷ ¾r&2wëË»cîbæÀé»®9§èkJêF8åhç4 Bè 0b±Hs_fnZXKÝikÃêzÔëgk¼ÍÁT7«wt'\1¹ í_ED|Õ"£ê£ç¸ø©ÄÝÉàp¾QêCÙRÂOª)®Êl1qâ{³Åx>¢@Ù7Fª{ÒÂê#R
Á$=§t¨d'~&ó;IdW²×{kµïË»kÍ$2%òMNóºo7u¥sǾu,! d
Èð !D4ªM«4$b£C@£3í¤ÈVÞnÚêÛåFOÜrï´69ÖSFF
ÌÑÌ#%2Ѷxt=O«¯¸'®cÚvhÓ°ZCä#.tDxpNÈÂã²p4þÐÓF'L#!w3323TVèh¦áóÖD,d×Äf¹ïiByr ¨N'#)ÌXÃsW¯\v©µT×6oLhÝ$ãò©'¼ÒEüýÓAûHr#)=|=¤Ð¨> °ò¬YÊXmêNzkÒDårFuËÖñѨÕrd.0)2åf[íMO½3&Ü£&îXn XÀ<DâuH#.{#ÅQ/ÇUÎåÒ"¨ôl$Òn£¤õø:ËÑmȱqãüÐÒÐÛMR1Xé ¤~ól3|¼#)(É+!ègxsQ_¥!JÂ4¢@PE²Ú´£5Q%ù²[T"8½Æ.D´¨¤ 7¶U¨#.Y"#)Ò##P+Õ` =8éÆ H\1ìÀ#%Bºò}Æès½÷·ÚÖ-,ÒhÆ5k_]ïÛÙí{æ¦
V#)é°pÈó# " H"õûí죾ÁYç¹âi6#6üjø {mçΧ¸Åè½ðÀPd®¡#%É%CH
bÃR$± ¬%¤"Tv¢DÈÛ±9i¡´¡Ô%!a1#.Í#.£ $à§A·EÑÇH#.¡«°ÂÒ«`9Û+×Ô G¢=O#Ï{É,0!&ò¹9ýçÞâÃ[a¥#)Na$0îøQ6|ªbV64¨XÙÒ<ÛPèQK$@#)¼Xn"/¸çæ ú$VM¯²~çZبN×6ÝLI|-3}¢-íËHh; ºÖºçv¸EBÀ(x ÅÈLHÊòþÝ]}în8í§·~kT1 Ø$9J%oUi£6zXdJªPÄXÆ»¨Ü4ÜAÈb-#.HÔ[ukÝlÉÄzòÞÄÈ.VýtCT>,^èèÊçõë ª09M4AjUm4é%ïè!rKíl|rèO ñ:×Û±#È#)ü]«[çò{zVmhÓ+,Ô¦jA[[0ØJQ³ZQV¤·òV#.XÒ*@`2Ns¡Ñ'Ù)ÇË&hëЮÄÚvqûfn<aïÜù#..+¡Ù«~#)`!¦ "ȯ6¾$ny)ÙéÒ¦ÎéíSÖû. §#%
æqÒI!ÄååÛ·|Îú-Ùyáÿ Â=$4j xãßMõÇ®²^öÐõT w1g"ãÎøjfAOqL£qAqÝä°|è²WS*4&M5¢Øpu¾0neËw×#.k`ù¸ãf8Ci1°eÆ
¤Î¥±$6Á1cµæ®JI2YÒÔ¢eòð4FäHËK]@l¹ÌË-K¯Æ"m;|¡ #È^ôìÙ|#.Î5GFÌ[ý#.k#%åìÞÖëXrp/À°>û¾hvEÕÓ¢üî©0!">O ,{#.íYÙÍRuüTâ?`á!:2êçñïë|ü½#)ØÀi/JÕÕbÀzA¨0"0!Ó#%*;ôpÁ7{ûiOwB]<þ bH ÀI¬èD£ÖThkÔoê 8ò¸°HHZ´Ë#)wÜú¶ßêô±[²»1u:gHèPá6WT¢Ö½îYöj#)íöüzý;«20ø¬±·y}ç¾o«¸$«[á·ýpÚýÒQç¯Ûïhô8ãÿ7}sØÓ¯ºåãoiühhæìcøû#.¨÷q¡OMdALP)Gj¿áç`»aÓ¿J5òû¨£LÌuÔTVIwk¢,4ÊûÝæATWíN{åç½Åg#)Rl
£bWu+ÈÙ1¨ÚÂÄn[©6¦m¦EüR0¨õ"*³þl×ó{NîùE|óßfzC¸´h§å})èTçÒ=!"ȬÅÈ1F#.K øG¨1:@!$±S+EË2[6m_£úQ¿«ö÷Üih6Tm%FÒÒÚ¿CUþ>ï4&X
â|äU#.ýPµ¯Ö32èBêx%Ò¨üX,E#+®llcQ6²Ú(ÚƱfbÙ¤Óß<òÚVEDé¥Ñ´B÷Äp¿PÓÿK¸Ðóì'¹òù¿Q§IÞ¯xA4é#)Íæxüúªjú2*h¹ ýZ®³â·±Ò v,urS©SD{!¤>§5EWªÿ°±#.¤æÒ|¡õQàgHb&7 (ÛhÁ²}ð6'#)EvD-Y`~L}6DÄPä°*"H/P( !ûî)ABÁÈS(DMµRjөί¦íå1eKkØL#%?²H+¤ B°yÀÌÊ´Ô}°@O¦¡Rz¸yú^5@{<±¬ËFyݾópbܵF#Ⱦ
³«8çòP$råCͤHÈ9ÚÀJÕm£qqÌÅ÷`vLnö;vÞ°ßm&_ #)ó±i],{AÜ>¸ó%wT0"²F¨ÍF)(*#m¨Sh߶øÖ¼D¨Qµm%2°©g¯²E YR@ª$!<ĹEÑøÜ#)0U#@#xÑM=ýF°RëÒä÷O¢;W^©h;.æ)#%_Þ©Z¼Öj1ZR
Q¡6¦ËV-jik øQâo~ÿwom*²ÉIN~¼~¶}HR)¯ñN4×ÉÔ¢hiY§J)92MýÔdø§Ý
¢À´p§qÖ¬m%I#C£CÚDÏ÷°`6Q$ÞZY¨2Ú·ë-ÚlM©¯sa®RÑ»k»²¼kÍåkªmMoUrT[ÍÝfnÌÊ®¹»ksª¬-^]ØÍk»«»µ¤ÙRTÈØÖóº·kή¯8%N#.U)Q£ma¦b-¥4¶MIUÊ×VòêëÏ;[xÔ[(ÌʲÙK^Mº»·Yc5eÓ]&æ&Ø28Hb¨µH¤- f3ø{¤2IÃC6¬KøÓþ!¢ñ°)|ê4Ïh-RÚ»ñh\>ª3º)Püa1T.^üLȸ P"ÁÕº*?˨ÒsË<%ÈÇWôòý#%'ªIvN$zû´§Ã0ô³z+¤+¦÷co'¶Ûg#%[Q¬ly7â\H[»^9ýèDèfB§xÁYcS{é[§#.`SS9¹c}^FfÌ
:³ëÛÎ QGÊ)ȼ.#)õêLoÑ_²öjt##..2³/ff6«".ïÈ°÷e$¿ÆGFd ¼öZÇC§ÒJÒtÍ[ñÖëCHbyq-
-Q4ÅHÇÌ5¬vÕfõ9ïzÀHZ[!KPÓM;¯Fø!Äë]Îñ©ðm.2Pk¦EðùéZy²MÑ@nu»Ò'Öp`Àí@~¶.JgÊMæ2´©Ai°¸èÍÉT5s#%[LÌmG/¹2u
ówö>DâP½ÔÙ.H°½#¨cÌ-%¢jèf·~³}8#%þèÆÁf.PÁ°Ø#%N+ÆÔû¾RAÊ/ÑâP;nh|x2Ùv÷a&tQÜq _ë¥jIb8iÕëñ2È©I1ï¯IÑÁüdf,?{U¶å{hæv+åV¶ómA¸(¡üt,ÅqwÒkÄ#t[#)B®©Ã£¿M¤Z Ѭ
m)x{ËloaÊ!"0CTö /m 622\ BCÜiüu¼Ìåj ¯Ô#%ÝÜy£ÀÃÄì=föü7Í£Èb\\,äuþ¼ÌH\¨úS>Uü>Kü+×Ôk¹º! ùåÑ#%»/v+qAÎxÐ"¸@±HlèÅ7ëúJÆS¼øxD%sî=Ìøo> õã^9øhÑ{æ\ÉÇóYU´÷øýý?ð§ÝþßÿßgþÝßíÿíÿûÛþ/ý~oþ_ãþ?åÿéÙ³æù>þ¿ïø¿þÿü)þÏTnÿwû¿ýø¿Æñÿñÿûþïø×þ~_¿áþ_ñÿü?çÿ7ùvþ>ÿõÿ/×ö}qúÕ{ÜááîA#%úBÀq\¸ñ$D5¦²àû?L`
Q#)!=¬ìUs0)»ÏÞ¿?±îwv$$ÌÏ¿õÛ$6 J#! 6»B³M¢e´Ì¢Ìi¬ 6Çû,íÿMì¦È Ò?ëÛ·Zc²æ-ÉÞ-¼£øÙý U$æqäWbAµ|îÌ3ñ?0<ü¬#%j=?êЦwk|Ï?Ê?ñ²Ob±ãú±xRëܲ¥Ï<#)4ÉÓÏû¬Úd ±`ºh<&XA×·ÿ¹ÉªrI@í{öö?ýúìùg>2Öæ;XÊÈÎålÌÿ?``Ú5$CS#^Ý1±êh$qÆËH®aÏý4jU;Ú7¼{òÒÁ§ì3ÇZqHúvq7u¦Ôm+J¢>·#)îvSfÝZM3Z2Ài©BED »k¤ 3/~ÉfÂÉw$`°¸m믱XÞ);¹<èZPîÙÖF³Û&ôU7Σ³eTæsãÍåì´°?ºè#)+ 1µËÎؼ¶@Ë´¡û_$q3Õú+Tþ ál!ºÌÓ§"×¥Ð6+R§Ë./KþÕP/ï §± ²äñç³æ
óo5SÜSàÆÓbcãI<HgÕ»
#äirFð¥eÁý¼ÞýÏÜ0Ƽ*¨´7 WN>%v]W©Æs3PEATiqÑ<í×n6, ¬Ù 2BiÖì#)NJÁJX©Ø,1ÔxwÜ°d#%Pc$A4ò$¤7»J¹.2Ê$®õ=^wµÒ÷¾I·ÿ¶ýA_¢ÁËi;Mb1@'4 änÈÒ[¯hC!#%¨ÔHJ¶$jÅĨ5QjÊS+lZÔ¦E##f¾Û¶®môúv~sA@S³3í Ä?ÈÂ+~uRÔU¦Ê)^1·ß¿%Õ|=ÜíSlÚÁëåî#%Oº<Ê?çq»ê¬ÉÑ ¿ÄÐÿµzÆGâÖkÏhÄ`!ï¯GJNöØuàÛ7¾ZÈ/¬2GMµ,g/ÿeþzkë 6KuFªi½Û#.áwÉmò´ù×XÃqzoOJzØ?OÁôøØx23heM*<37ËÑ&Ǹà'Æ#)D'ÂoYv¢÷÷Ý+fã7±44~ç°àð³eÃ,øÇW@QbV·ØÝ6üƽZ@Öæ¹´GѶ橥F7mê_#.Ö÷1ªMe ¶ß9ªæÛ|$,ÖìÍZ#.^ðª%ØqCFLâ©ë¥?Iz6n°;¤$àÃ@Q¡Òë±s¬lØP¦On½dß>Cª<*¸,XûêJ9
¤aîÿ¸~òa&Ân Ñ$Y#%G¸R¿ê½GÍÙGOu£éÞ/vòÿÒÀ+pûô¨?ú¢#%·Z;Ñ%(TX¢0$a*ÐÁ#)$"Ä!æñ 2@ uú}~Üÿÿ_:Ôwsñã;{¥ßTÇ#)µÚÐ>ýÎ¥º%¢ô:§O|±QIÝôý¡÷þ#%"?èÓöÁÖ;Üø A@X"ÿ(E¯ûÆÜ-?û#.R?ÆÿöÀ#.§ÄÆÛÿá°ÿ¸-Ãü5]ÀÙ¯¸%«Aþî÷õÛö¶*üOàëòß9*çÇy9S¢<xì¿¢xüÐ>2ØxË|<þNq;b3mÿÍcÅÀhÿ¸@ìùʧ1@û¿ðÒíøKÀ¢Ñøqd}ý8ºâ²½ÂÎö.P®¢lÑÿ÷Ò#¯ãªßäf'þ]#%èJH?¨FÊ?¥ú¨µÛÄâ¨gMW³50ïÄ>>½§NÚ gAäç,Má/-±¿Ñ8¨¼§0aw<}9æ@Lë(wª¿{Öë³%^²k+Ãçë¢Æ#)úöfgÒpÜÏ}_ñ¬ ¤©±¨ÈûKö¶HÆyFѧþ&:¸ü¦F?èý(¢ÿrE8P¹÷{
+#<==
diff --git a/wscript b/wscript
new file mode 100644
index 0000000..2219b6e
--- /dev/null
+++ b/wscript
@@ -0,0 +1,63 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+VERSION = "0.1.0"
+APPNAME = "ndncert"
+BUGREPORT = "http://redmine.named-data.net/projects/ndncert"
+GIT_TAG_PREFIX = "ndncert"
+
+from waflib import Logs, Utils, Context
+import os
+
+def options(opt):
+ opt.load(['compiler_cxx', 'gnu_dirs'])
+ opt.load(['boost', 'default-compiler-flags', 'sqlite3',
+ 'coverage', 'sanitizers',
+ 'doxygen', 'sphinx_build'], tooldir=['.waf-tools'])
+
+ syncopt = opt.add_option_group ("ndncert options")
+ syncopt.add_option('--with-tests', action='store_true', default=False, dest='with_tests',
+ help='''build unit tests''')
+
+def configure(conf):
+ conf.load(['compiler_cxx', 'gnu_dirs',
+ 'boost', 'default-compiler-flags', 'sqlite3',
+ 'doxygen', 'sphinx_build'])
+
+ if 'PKG_CONFIG_PATH' not in os.environ:
+ os.environ['PKG_CONFIG_PATH'] = Utils.subst_vars('${LIBDIR}/pkgconfig', conf.env)
+
+ conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
+ uselib_store='NDN_CXX', mandatory=True)
+
+ USED_BOOST_LIBS = ['system', 'filesystem', 'iostreams',
+ 'program_options', 'thread', 'log', 'log_setup']
+
+ conf.env['WITH_TESTS'] = conf.options.with_tests
+ if conf.env['WITH_TESTS']:
+ USED_BOOST_LIBS += ['unit_test_framework']
+ conf.define('HAVE_TESTS', 1)
+
+ conf.check_boost(lib=USED_BOOST_LIBS, mt=True)
+ if conf.env.BOOST_VERSION_NUMBER < 105400:
+ Logs.error("Minimum required boost version is 1.54.0")
+ Logs.error("Please upgrade your distribution or install custom boost libraries" +
+ " (https://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
+ return
+
+ # Loading "late" to prevent tests to be compiled with profiling flags
+ conf.load('coverage')
+
+ conf.load('sanitizers')
+
+ conf.write_config_header('src/ndncert-config.hpp')
+
+def build(bld):
+ core = bld(
+ target = "objects",
+ features=['cxx'],
+ source = bld.path.ant_glob(['src/**/*.cpp']),
+ use = 'NDN_CXX BOOST',
+ includes = ['src'],
+ export_includes=['src'],
+ )
+
+ bld.recurse('tests')