pax_global_header00006660000000000000000000000064141375144750014525gustar00rootroot0000000000000052 comment=5ed431ceb0e594bccabe625e8782381e79b284de netcdf4-python-1.5.8rel/000077500000000000000000000000001413751447500151115ustar00rootroot00000000000000netcdf4-python-1.5.8rel/.github/000077500000000000000000000000001413751447500164515ustar00rootroot00000000000000netcdf4-python-1.5.8rel/.github/workflows/000077500000000000000000000000001413751447500205065ustar00rootroot00000000000000netcdf4-python-1.5.8rel/.github/workflows/build.yml000066400000000000000000000064141413751447500223350ustar00rootroot00000000000000name: Build and Test Linux on: [push, pull_request] jobs: build-linux: name: Python (${{ matrix.python-version }}) runs-on: ubuntu-latest env: PNETCDF_VERSION: 1.12.1 NETCDF_VERSION: 4.8.0 NETCDF_DIR: ${{ github.workspace }}/.. NETCDF_EXTRA_CONFIG: --enable-pnetcdf CC: mpicc.mpich #NO_NET: 1 strategy: matrix: python-version: ["3.9"] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install Ubuntu Dependencies run: | sudo apt-get update sudo apt-get install mpich libmpich-dev libhdf5-mpich-dev libcurl4-openssl-dev echo "Download and build PnetCDF version ${PNETCDF_VERSION}" wget https://parallel-netcdf.github.io/Release/pnetcdf-${PNETCDF_VERSION}.tar.gz tar -xzf pnetcdf-${PNETCDF_VERSION}.tar.gz pushd pnetcdf-${PNETCDF_VERSION} ./configure --prefix $NETCDF_DIR --enable-shared --disable-fortran --disable-cxx make -j 2 make install popd echo "Download and build netCDF version ${NETCDF_VERSION}" wget ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-c-${NETCDF_VERSION}.tar.gz tar -xzf netcdf-c-${NETCDF_VERSION}.tar.gz pushd netcdf-c-${NETCDF_VERSION} export CPPFLAGS="-I/usr/include/hdf5/mpich -I${NETCDF_DIR}/include" export LDFLAGS="-L${NETCDF_DIR}/lib" export LIBS="-lhdf5_mpich_hl -lhdf5_mpich -lm -lz" ./configure --prefix $NETCDF_DIR --enable-netcdf-4 --enable-shared --enable-dap --enable-parallel4 $NETCDF_EXTRA_CONFIG make -j 2 make install popd # - name: The job has failed # if: ${{ failure() }} # run: | # cd netcdf-c-${NETCDF_VERSION} # cat config.log - name: Install python dependencies via pip run: | python -m pip install --upgrade pip pip install numpy cython cftime pytest twine wheel check-manifest mpi4py - name: Install netcdf4-python run: | export PATH=${NETCDF_DIR}/bin:${PATH} python setup.py install - name: Test run: | export PATH=${NETCDF_DIR}/bin:${PATH} python checkversion.py # serial cd test python run_all.py # parallel (hdf5 for netcdf4, pnetcdf for netcdf3) cd ../examples mpirun.mpich -np 4 python mpi_example.py if [ $? -ne 0 ] ; then echo "hdf5 mpi test failed!" exit 1 else echo "hdf5 mpi test passed!" fi mpirun.mpich -np 4 python mpi_example_compressed.py if [ $? -ne 0 ] ; then echo "hdf5 compressed mpi test failed!" exit 1 else echo "hdf5 compressed mpi test passed!" fi mpirun.mpich -np 4 python mpi_example.py NETCDF3_64BIT_DATA if [ $? -ne 0 ] ; then echo "pnetcdf mpi test failed!" exit 1 else echo "pnetcdf mpi test passed!" fi - name: Tarball run: | export PATH=${NETCDF_DIR}/bin:${PATH} python setup.py --version pip wheel . -w dist --no-deps check-manifest --verbose twine check dist/* netcdf4-python-1.5.8rel/.github/workflows/miniconda.yml000066400000000000000000000046221413751447500231760ustar00rootroot00000000000000name: Build and Test on: pull_request: push: branches: [master] jobs: run-serial: runs-on: ${{ matrix.os }} #env: # NO_NET: 1 strategy: matrix: python-version: ["3.6", "3.7", "3.8", "3.9", "3.10" ] os: [windows-latest, ubuntu-latest, macos-latest] platform: [x64, x32] exclude: - os: macos-latest platform: x32 steps: - uses: actions/checkout@v2 - name: Setup Conda uses: s-weigand/setup-conda@v1 with: activate-conda: false conda-channels: conda-forge - name: Python ${{ matrix.python-version }} shell: bash -l {0} run: | conda create --name TEST python=${{ matrix.python-version }} numpy cython pip pytest hdf5 libnetcdf cftime --strict-channel-priority source activate TEST export PATH="${CONDA_PREFIX}/bin:${CONDA_PREFIX}/Library/bin:$PATH" # so setup.py finds nc-config pip install -e . --no-deps --force-reinstall conda info --all conda list - name: Tests shell: bash -l {0} run: | source activate TEST cd test && python run_all.py run-mpi: runs-on: ${{ matrix.os }} strategy: matrix: python-version: [ "3.9" ] os: [ubuntu-latest] platform: [x64] steps: - uses: actions/checkout@v2 - name: Setup Conda uses: s-weigand/setup-conda@v1 with: activate-conda: false conda-channels: conda-forge - name: Python ${{ matrix.python-version }} shell: bash -l {0} run: | conda create --name TEST python=${{ matrix.python-version }} numpy cython pip pytest mpi4py hdf5=*=mpi* libnetcdf=*=mpi* cftime --strict-channel-priority source activate TEST export PATH="${CONDA_PREFIX}/bin:${CONDA_PREFIX}/Library/bin:$PATH" # so setup.py finds nc-config pip install -e . --no-deps --force-reinstall conda info --all conda list - name: Tests shell: bash -l {0} run: | source activate TEST cd test && python run_all.py cd ../examples export PATH="${CONDA_PREFIX}/bin:${CONDA_PREFIX}/Library/bin:$PATH" which mpirun mpirun --version mpirun -np 4 python mpi_example.py if [ $? -ne 0 ] ; then echo "hdf5 mpi test failed!" exit 1 else echo "hdf5 mpi test passed!" fi netcdf4-python-1.5.8rel/Changelog000066400000000000000000002056411413751447500167330ustar00rootroot00000000000000 version 1.5.8 (tag v1.5.8rel) ============================== * Fix Enum bug (issue #1128): the enum_dict member of an EnumType read from a file contains invalid values when the enum is large enough (more than 127 or 255 members). * Binary wheels for aarch64 and python 3.10. version 1.5.7 (tag v1.5.7rel) ============================== * don't try to mask vlens with default _FillValue, since vlens don't have a default _FillValue. This gets rid of numpy DeprecationWarning (issue #1099). * update docs to reflect the fact that a variable must be in collective mode before writing compressed data to it in parallel. Added a test for this (examples/mpi_example_compressed.py). Issue #1108. * Fix OverflowError when dimension sizes become greater than 2**32-1 elements on Windows (Issue #1112). * Don't return masked arrays for vlens (only for primitive and enum types - issue #1115). version 1.5.6 (tag v1.5.6rel) ============================== * move CI/CD tests from travis/appveyor to Github Actions (PR #1061). * move netCDF4 dir under src so module can be imported in source directory (PR #1062). * change numpy.bool to numpy.bool_ and numpy.float to numpy.float_ (float and bool are deprecated in numpy 1.20, issue #1065) * clean up docstrings so that they work with latest pdoc. * update cython numpy API to remove deprecation warnings. * Add "fromcdl" and "tocdl" Dataset methods for import/export of CDL via ncdump/ncgen called externally via the subprocess module (issue #1078). * remove python 2.7 support. * broadcast data (if possible)to conform to variable shape when writing to a slice (issue #1083). version 1.5.5.1 (tag v1.5.5.1rel) ================================== * rebuild binary wheels for linux and OSX to link netcdf-c 4.7.4 and hdf5 1.12.0. version 1.5.5 (tag v1.5.5rel) ============================== * have setup.py always try use nc-config first to find paths to netcdf and hdf5 libraries and headers. Don't use pkg-config to find HDF5 if HDF5 env vars are set (or read from setup.cfg). * Change MIT license text to standard OSI wording (PR #1046). version 1.5.4 (tag v1.5.4rel) ============================== * fix printing of variable objects for variables that end with the letter 'u' (issue #983). * make sure root group has 'name' attribute (issue #988). * add the ability to pack vlen floats to integers using scale_factor/add_offset (issue #1003) * use len instead of deprecated numpy.alen (issue #1008) * check size on valid_range instead of using len (issue #1013). * add `set_chunk_cache/get_chunk_cache` module functions to reset the default chunk cache sizes before opening a Dataset (issue #1018). * replace use of numpy's deprecated tostring() method with tobytes() (issue #1023). * bump minimal numpy version to 1.9 (first version to have tobytes()). version 1.5.3 (tag v1.5.3rel) ============================== * make sure arrays are masked that are not filled when auto_fill is off (issue #972). * python 3.8 binary wheels. version 1.5.2 (tag v1.5.2rel) ============================== * fix for scaling bug when _Unsigned attribute is set and byteorder of data does not match native byteorder (issue #930). * revise documentation for Python 3 (issue #946). * establish support for Python 2.7, 3.5, 3.6 and 3.7 (issue #948). * use dict built-in instead of OrderedDict for Python 3.7+ (pull request #955). * remove underline ANSI in Dataset string representation (pull request #956). * remove newlines from string representation (pull request #960). * fix for issue #957 (size of scalar var is a float since numpy.prod(())=1.0). * make sure Variable.setncattr fails to set _FillValue (issue #959). * fix detection of parallel HDF5 support with netcdf-c 4.6.1 (issue #964). version 1.5.1.2 (tag v1.5.1.2rel) ================================== * fix another slicing bug introduced by the fix to issue #906 (issue #922). version 1.5.1.1 (tag v1.5.1.1rel) ================================== * fixed __version__ attribute (was set incorrectly in 1.5.1 release). * fix for issue #919 (assigning 2d array to 3d variable with singleton first dimension with v[:] = a). * minimum numpy changed from 1.9.0 to 1.10.0. version 1.5.1 (tag v1.5.1rel) ============================== * fix issue #908 by adding workaround for incorrect value returned by nc_inq_var_fill for netcdf-c < 4.5.1. * fix bug writing slice to unlimited dimension that is not the first (leftmost). Issue #906. * make sure data gets converted to type of scale_factor when add_offset=0 and scale_factor=1 (issue #913). * fix for reading empty (NIL) string attributes (issue #915). version 1.5.0.1 (tag v1.5.0.1rel) ================================== * binary wheels for linux and macosx rebuilt against netcdf-c 4.6.3 (instead of 4.4.1.1). * add read-shared mode (mode='rs'). Significantly speeds up reads of NETCDF3 files (pull request #902). version 1.5.0 (tag v1.5.0rel) =============================== * added support for parallel IO in the classic netcdf-3 formats through the pnetcdf library (pull request #897). version 1.4.3.2 (tag v1.4.3.2) =============================== * include missing membuf.pyx file in release source tarball. version 1.4.3.1 (tag v1.4.3.1) =============================== * fix bug in implementation of NETCDF4_CLASSIC support for parallel IO in v1.4.3 release. version 1.4.3 (tag v1.4.3rel) ============================= * make set_always_mask work in MFDataset. * fix saving diskless files to disk with netcdf-c >= 4.6.2. * write to an in-memory Dataset, memoryview buffer returned by Dataset.close() (issue #865, requires netcdf-c >= 4.6.2) * fix performance regression when using large sequences of consecutive integers for indexing with netcdf-c >= 4.6.2 (issue #870). * improved error messages for ncinfo and other utilities (issue #873). * fix for int64 attributes not being created for NETCDF3_64BIT_DATA (CDF5) files (issue #878). * fix for MPI parallel error ("NetCDF: Attempt to use feature that was not turned on when netCDF was built") using netcdf-c 4.6.2 (issue #883). * Added methods `set_ncstring_attrs()` to Dataset, Group and Variable that forces all text attributes to be written as variable length strings (netCDF type NC_STRING - issue #882). * Allow parallel mode with NETCDF4_CLASSIC files (issue #890). version 1.4.2 (tag v1.4.2rel) ============================= * add get_dims Variable method (issue #824) * make sure format keyword not ignored when mode is 'ws' (issue #827) * fix numpy FutureWarning (non-tuple sequence for multidimensional indexing is deprecated), issue #833. * add 'master_file' kwarg to MFDataset.__init__ (issue #835). * always use nc_get_vars for strided access over OpenDAP (issue #838). * raise FutureWarning when trying to set multi-dimensional array attribute while still silently flattening the array (issue #841). Will change to ValueError in next release (1.4.3). * fix parallel writes when both nc4 parallel and pnetcdf parallel options enabled in the netcdf-c library (issue #820). * fix for writing masked scalar character variable (issue #850). version 1.4.1 (tag v1.4.1rel) ============================= * disable workaround for slow nc_get_vars for __netcdflibversion__ >= 4.6.2, since a fix was added to speed up nc_get_vars in the C library. Issue 680. * new Dataset and Variable methods (set_always_mask) to optionally re-enable old behaviour (return masked arrays only if selected slice contains missing values) (issue #809). version 1.4.0 (tag v1.4.0rel) ============================= * fixed bug in detection of CDF5 library support in setup.py (pull request #736, issue #713). * fixed reading of variables with zero-length dimensions in NETCDF3_CLASSIC files (issue #743). * allow integer-like objects in VLEN slices (not just python ints, issue #526, pull request #757). * treating _FillValue as a valid_min/valid_max was too surprising, despite the fact the thet netcdf docs 'attribute best practices' suggests that clients should to this. Revert this change from issue #576 (issue #761). * remove netcdftime, since it is now a separate package. date2num, num2date and date2index still importable from netCDF4. * fix 'Unreachable code' cython warning (issue #767). * Change behavior of string attributes so that nc.stringatt = ['foo','bar'] produces an vlen string array attribute in NETCDF4, instead of concatenating into a single string ('foobar'). In NETCDF3/NETCDF4_CLASSIC, an IOError is now raised, instead of writing 'foobar'. Issue #770. * fix loading of enum type names (issue #775). * make sure missing_value applies only to scaled short integers if auto-scaling is on (issue #777). * automatically create views of compound types with character arrays as numpy strings (issue #773). Can be disabled using 'set_auto_chartostring(False)'. Numpy structured array dtypes with 'SN' string subtypes can now be used to define netcdf compound types (they get converted to ('S1',N) character array types automatically). * always return masked array by default, even if there are no masked values (too surprising to get ndarray or MaskedArray depending on slice, issue #785). * treat valid_min/valid_max/_FillValue/missing_value as unsigned integers if _Unsigned is set (to mimic behaviour of netcdf-java). Conversion to unsigned type now occurs before masking and scale/offset operation. Issue #794. version 1.3.1 (tag v1.3.1rel) ============================= * add parallel IO capabilities. netcdf-c and hdf5 must be compiled with MPI support, and mpi4py must be installed. To open a file for parallel access, use `parallel=True` in `Dataset.__init__` and optionally pass the mpi4py Comm instance using the `comm` kwarg and the mpi4py Info instance using the `info` kwarg. IO can be toggled between collective and independent using `Variable.set_collective`. See `examples/mpi_example.py`. Issue #717, pull request #716. Minimum cython dependency bumped from 0.19 to 0.21. * Add optional `MFTime` calendar overload to use across all files, for example, `'standard'` or `'gregorian'`. If `None` (the default), check that the calendar attribute is present on each variable and values are unique across files raising a `ValueError` otherwise. * Allow _FillValue to be set for vlen string variables (issue #730). version 1.3.0 (tag v1.3.0rel) ============================== * always search for HDF5 headers when building, even when nc-config is used (since nc-config does not always include the path to the HDF5 headers). Also use H5get_libversion to obtain HDF5 version info instead of H5public.h. Fixes issue #677. * encoding kwarg added to Dataset.__init__ and Dataset.filepath (default is to use sys.getfilesystemencoding()) so that oddball encodings (such as cp1252 on windows) can be handled in Dataset filepaths (issue #686). * Calls to nc_get_vars are avoided, since nc_get_vars is very slow (issue #680). Strided slices are now converted to multiple calls to nc_get_vara. This speeds up strided slice reads by a factor of 10-100 (especially for NETCDF4/HDF5 files) in most cases. In some cases, strided reads using nc_get_vars are faster (e.g. strided reads over many dimensions such as var[:,::2,::2,::2])), so a variable method use_nc_get_vars was added. var.use_nc_get_vars(True) will tell the library to use nc_get_vars instead of multiple calls to nc_get_vara, which was the default behaviour previous to this change. * fix utc offset time zone conversion in netcdftime - it was being done exactly backwards (issue #685 - thanks to @pgamez and @mdecker). * Fix error message for illegal ellipsis slicing, add test (issue #701). * Improve timezone format parsing in netcdftime (https://github.com/Unidata/netcdftime/issues/17). * make sure numpy datatypes used to define CompoundTypes have isalignedstruct flag set to True (issue #705), otherwise. segfaults can occur. Fix required raising them minimum numpy requirement from 1.7.0 to 1.9.0. * ignore missing_value, _FillValue, valid_range, valid_min and valid_max when creating masked arrays if attribute cannot be safely cast to variable data type (and issue a warning). When setting these attributes don't cast to variable dtype unless it can be done safely and issue a warning. Issue #707. version 1.2.9 (tag v1.2.9rel) ============================== * Fix for auto scaling and masking when _Unsigned attribute set (create view as unsigned type after scaling and masking). Issue #671. * Always mask values outside valid_min, valid_max (not just when missing_value attribue present). Issue #672. * Fix setup.py so pip install doesn't fail if cython not installed. setuptools >= 18.0 now required for installation (Issue #666). version 1.2.8 (tag v1.2.8rel) ============================== * recognize _Unsigned attribute used by netcdf-java to designate unsigned integer data stored with a signed integer type in netcdf-3 (issue #656). * add Dataset init memory parameter to allow loading a file from memory (pull request #652, issues #406 and #295). * fix for negative times in num2date (issue #659). * fix for failing tests in numpy 1.13 due to changes in numpy.ma (issue #662). * Checking for _Encoding attribute for NC_STRING variables, otherwise use 'utf-8'. 'utf-8' is used everywhere else, 'default_encoding' global module variable is no longer used. getncattr method now takes optional kwarg 'encoding' (default 'utf-8') so encoding of attributes can be specified if desired. If _Encoding is specified for an NC_CHAR ('S1') variable, the chartostring utility function is used to convert the array of characters to an array of strings with one less dimension (the last dimension is interpreted as the length of each string) when reading the data. When writing the data, stringtochar is used to convert a numpy array of fixed length strings to an array of characters with one more dimension. chartostring and stringtochar now also have an 'encoding' kwarg. Automatic conversion to/from character to string arrays can be turned off via a new set_auto_chartostring Dataset and Variable method (default is True). Addresses issue #654. * Cython >= 0.19 now required, _netCDF4.c and _netcdftime.c removed from repository. version 1.2.7 (tag v1.2.7rel) ============================== * fix for issue #624 (error in conversion to masked array when variable slice returns a scalar). This is a regression introduced in 1.2.5 associated with support for vector missing_values. Test (tst_masked5.py) added for vector missing_values. * fix for python 3.6 compatibility (error retrieving character _FillValue attribute, issue #626). Test with python 3.6 using travis CI. version 1.2.6 (tag v1.2.6rel) ============================== * fix some test failures on big endian PPC64 that were due to errors in byte-swapping logic. Also fixed bug in enum code exposed on PPC64 (issue #608). * remove support for python 2.6 (it probably still will work for a while though). * Sometimes checking that data being assigned to a variable has an 'ndim' attribute is not sufficient, instead check to see that the object supports the buffer interface (issue #613). * make get_variables_by_attributes work in MFDataset (issue #610) The hack is also applied for set_auto_maskandscale, set_auto_scale, set_automask, so these don't have to be duplicated in MFDataset (pull request #571). version 1.2.5 (tag v1.2.5rel) ============================== * Add MFDataset.set_auto_maskandscale (plus set_auto_scale, set_auto_mask). Fixes issue #570. * Use valid_min/valid_max/valid_range attributes when defining mask (issue #576). Values outside the valid range are considered to be missing when defining the mask. * Fix for issue #584 (add support for dates before -4712-1-1 in 360_day and 365_day calendars to netcdftime.utime). * Fix for issue #593: add support for datetime.timedelta operations (adding and subtracting timedelta, subtracting two datetime instances to compute time duration between them), implement datetime.replace() and datetime.__str__(). datetime.__repr__() includes the full state of an instance. Add datetime.calendar. datetime comparison operators have full accuracy now. * Fix for issue #585 by increasing the size of the buffer used to store the filepath. * Fix for issue #592: Add support for string array attributes. (When reading, a vlen string array attribute is returned as a list of strings. To write, use var.setncattr_string("name", ["two", "strings"]).) * Fix for issue #596 - julian day calculations wrong for negative years, caused incorrect rountrip num2date(date2num(date)) roundtrip for dates with year < 0. * Make sure negative years work in utime.num2date (issue #596). * raise NotImplementedError when trying to pickle Dataset, Variable, CompoundType, VLType, EnumType and MFDataset (issue #602). * Fix for issue #527: initialize vldata[i].p in Variable._get(...). version 1.2.4 (tag v1.2.4rel) ============================== * Fix for issue #554. It is now ensured that data is in native endian byte order before passing to netcdf-c library. Data read from variable with non-native byte order is also byte-swapped, so that dtype remains consistent with netcdf variable. Behavior now consistent with h5py. * raise warning for HDF5 1.10.x (issue #549), since backwards incompatible files may be created. * raise AttributeError instead of RuntimeError when attribute operation fails. raise IOError instead of RuntimeError when nc_create or nc_open fails (issue #546). * Use NamedTemporaryFile instead of deprecated mktemp in tests (pull request #543). * add AppVeyor automated windows tests (pull request #540). version 1.2.3.1 (tag v1.2.3.1rel) ================================== * fix bug in setup.py (pull request #539, introduced in issue #518). version 1.2.3 (tag v1.2.3rel) ============================== * try to avoid writing NC_STRING attributes if possible, by trying to convert unicode strings to ascii and write as NC_CHAR (issue #529). This preserves compatibility with clients (like Matlab) that can't deal with NC_STRING attributes. A 'setncattr_string' method was added for Dataset and Variable to that users can force attributes to be written as NC_STRING if necessary. * fix failing tests with numpy 1.11 (issues #521 and #522). * fix indentation bug in nc4tonc3 utility (issue #519). * add the capability in setup.py to use pkg-config instead of nc-config (pull request #518). * make sure slices which return scalar masked arrays are consistent with numpy.ma (issue #515). * add test/tst_cdf5.py and test/tst_filepath.py (to test new NETCDF3_64BIT_DATA format and filepath Dataset method). * expose netcdftime.__version__ (issue #504). * fix potential memory leak in Dataset.filepath in attempt to fix mysterious segfaults on CentOS6 (issue #506). Segfaults can apparently still occur on systems like CentOS6 with old versions of glibc. version 1.2.2 (tag v1.2.2rel) ============================= * fix failing tests on python 2.6 (issue #497). Change minimum required python from 2.5 to 2.6. * Potential memory leaks fixed by freeing string pointers internally allocated in netcdf-c using nc_free_string. Also use nc_free_vlens to free space allocated for vlens inside netcdf-c (issue #495). * invoke str on filename argument to Dataset constructor, so pathlib instances can be used (issue #489). * don't use hardwired NC_MAX_DIMS or NC_MAX_VARS internally to allocate space for dimension or variable ids. Instead, find out the number of dims and vars and use malloc. NC_MAX_NAME is still used to allocate space for attribute and variable names, since there is no obvious way to determine the length of these names. * if trying to write a unicode attribute, check to see if it exists first and is NC_CHAR, and if so, delete it and recreate it. Workaround for C lib bug discovered in issue #485. * support for NETCDF3_64BIT_DATA format supported in netcdf-c 4.4.0. Similar to NETCDF3_64BIT (now NETCDF3_64BIT_OFFSET), but includes 64 bit dimensions and sizes, plus unsigned and 64 bit integer data types. * make sure chunksize does not exceed dimension size (for non-unlimited dimensions) on variable creation (issue #480). * add 'size' attribute to Dimension (same as len(d), where d is a Dimension instance, issue #477). * fix bug in nc3tonc4 with --unpackshort=1 (issue #474). * dates do not have to be contiguous, i.e. can be before and after the missing dates in Gregorian calendar (pull request #476). version 1.2.1 (tag v1.2.1rel) ============================= * add the capability to slice variables with unsorted integer sequences, or integer sequences with duplicates (issue #467). This was done by converting boolean array slices to integer array slices internally, instead of the other way around. * raise TypeError if masked array assigned to a VLEN str variable slice (issue #464). * Ellipsis now can be used with scalar VLEN str variables (issue #458). Slicing of scalar VLEN (non-str) variables now works. * Allow non-positive reference years in non-real-world calendars (issue #442). version 1.2.0 (tag v1.2.0rel) ============================= * Fixes to setup.py for building on windows (issue #460). * warnings now issued if file being read contains unsupported variables or data types (they were previously being silently skipped). * added 'get_variables_by_attributes' method (issue #454). * check for 'units' attribute in date2index (issue #453). * added support for enum types (issue #452). * added 'isopen' Dataset method (issue #450). * raise ValueError if year 0 or negative year used in time units string. The year 0 does not exist in the Julian and Gregorian calendars (issue #442). version 1.1.9 (tag v1.1.9rel) ============================= * fix for issue #391 (data is already byte-swapped to native endian format by the HDF4 library). * fix for issue #415 (copy.deepcopy does not work on netcdftime datetime object). * fix for issue #420 - len(v) where v is a scalar variable returned unexpected IndexError, now returns "TypeError: len() on unsized object" (same as numpy does for len() on a scalar array). * translate docstrings from epydoc markup to markdown, so pdoc can be used (epydoc is dead). * add small offset in conversion to Julian date for numerical stability (more accurate round trip calculations). This offset is removed in back conversion only from microseconds. Pull request #433. * add detection of unsigned integers to handling of automatic packing (set_auto_scale and set_auto_maskandscale) when writing. Pull request #435. * use USE_SETUPCFG env var to over-ride use of setup.cfg. If USE_SETUPCFG evaluates to false, setup.cfg will not be used and all configuration variables can be set from environment variables. Useful when using 'pip install' and nc-config is broken (issue #438). * fix for integer overflow in date2index (issue #444). version 1.1.8 (tag v1.1.8rel) ============================= * v[...] now returns a numpy scalar array (not just a scalar) when v is a scalar netcdf variable (issue #413). * unix-like paths can now be used in createVariable and createGroup. v = nc.createVariable('/path/to/var1',('xdim','ydim'),float) will create a Variable named 'var1', while also creating the Groups 'path' and 'path/to' if they do not already exist. Similarly, g = nc.createGroup('/path/to') acts like 'mkdir -p' in unix, creating the Groups 'path' and '/path/to', if they don't already exist. Users who relied on nc.createGroup(groupname) failing when the group already exists will have to modify their code, since nc.createGroup will now return the existing group instance. Dataset.__getitem__ also added. nc['/path/to'] returns a Group instance, and nc['/path/to/var1'] returns a Variable instance. * change minimum required numpy to 1.7.0, fix so all tests pass with 1.7.0. Added travis tests for minimum required cython, numpy (issue #404). * enable abbreviations to time units specification, as allowed in CF (issue #402). Now, instead of just 'seconds' and 'seconds', 'secs', 'sec' and 's' are also allowed (similar to minutes, days and hours). * install utility scripts in utils directory with setuptools entry points (pull request #392 from @mindw). Code for utilities moved to netCDF4_utils.py - makes utilities more windows-friendly. * make sure booleans are treated correctly in setup.cfg. Add use_cython (default True) to setup.cfg. If set to False, then cython will not be used to compile netCDF4.pyx (existing netCDF4.c will be used instead). * use "from Cython.Build import cythonize" instead of "from Cython.Distutils import build_ext" in setup.py (issue #393) to conform to new cython build mechanism (CEP 201, described at https://github.com/cython/cython/wiki/enhancements-distutils_preprocessing). * unicode attributes now written as strings, not bytes (using nc_put_att_string instead of nc_put_att_text, issue #388). * add __orthogonal_indexing__ attribute to Variable, Dataset and Group (issue #385) to denote that Variable objects do not follow numpy indexing semantics for integer and boolean array indices. * make sure application of scale_factor and add_offset works correctly when scale_factor not given (issue #381). * add man pages for nc3tonc4, nc4tonc3, ncinfo in man directory. Not installed by setup.py (contributed by Ross Gammon, issue #383). * replace tabs with spaces by running reindent.py on all *.py and *.pyx files (issue #378). * refactor netCDF4_utils and netCDF4 module into netCDF4 package. Refactoring effectively removes netCDF4 utils private attributes from netCDF4 namespace, so has the potential to break code using private attributes (issue #409). version 1.1.7 (tag v1.1.7rel) ============================= * check to make sure cython >= 0.19 is available before trying to use it (otherwise compilation with fail). Issue 367. * add ipython notebooks from Unidata workshop in examples directory. * fix ellipsis variable slicing regression (issue 371). * release the Global Interpreter Lock (GIL) when calling the C library for read operations. Speeds up multi-threaded reads (issue 369). Caution - the HDF5 library may need to be compiled with the threadsafe option to ensure that global data structures are not corrupted by simultaneous manipulation by different threads. * Make sure USE_NCCONFIG environment variable takes precedence over value of use_ncconfig in setup.cfg. With this change, 'pip install netCDF4' with USE_NCCONFIG=1 will use environment variables to find paths to libraries and include files, instead of relying on nc-config (issue #341). version 1.1.6 (tag v1.1.6rel) ============================= * fix for issue 353 (num2date can no longer handle units like 'hours since 2000-01-01 0'). * fix for issue 354 (num2date no longer supports multi-dimensional arrays). * fix for spurious UserWarning about endian-ness mismatch (issue 364). * make calendar name keyword for num2date/date2num case insensitive (issue 362). * make sure units parser returns time-zone naive datetime instance that includes UTC offset (issue 357). UTC offset was applied incorrectly in netcdftime.date2num and num2date. No longer need to depend on python-dateutil. version 1.1.5 (tag v1.1.5rel) ============================= * add dependency on python-dateutil in setup.py and install docs. * use python datetime in num2date and date2num whenever possible. Remove duplicate num2date and date2num functions from netcdftime. Addresses issue #344. Add microsecond capability to netcdftime.datetime. Roundtrip accuracy of num2date/date2num now down to less than a millisecond. * use nc-config by default to find dependencies. setup.py modified to handle failure to find nc-config more gracefully (issue #340). If you wish to use env vars to point to the libs, you must first move the setup.cfg file out of the way (rename it to setup.cfg.save), or set USE_NCCONFIG to 0. * if endian-ness of variable is specified, adjust datatype to reflect this when opening a file (issue 346). * fix for issue #349 (seconds outside the range 0-59 in netcdftime.num2date). version 1.1.4 (tag v1.1.4rel) ============================= * speedup conversion of array indices to slices (issue #325). * fix for issue #330 (incorrect values for seconds returned by netcdftime). * fix reading of scalar vlen variables (issue #333). * setting fill_value=False in createVariable for vlen and compound variables now does nothing, instead of causing an error when the Dataset is closed (issue #331). * cython will regenerate netCDF4.c when install is run, not just build. Makes 'pip install' do the right thing when cython is installed (issue #263). version 1.1.3 (tag v1.1.3rel) ============================= * checked in _datetime.c to git (resolves issue #315). Note - _datetime.c was *not* included in the 1.1.2 release. * Changed __str__ to __repr__ in MFDataset, to be consistent with Dataset (issue #317). IPython uses __repr__ to make use-friendly human-readable summaries of objects in the terminal. version 1.1.2 (tag v1.1.2rel) ============================= * fix for issue 312 (allow slicing with objects that can be cast to ints). * indexing netCDF variables with integer sequences and boolean arrays now behave the same way (integer sequences are converted to boolean arrays internally). Addresses issue #300. Since indexing using integer sequences does not behave exactly as before, some client code may break. For example, previously when integer index arrays had the same length, and that length was equal to the number of dimensions of the array being indexed, netcdf4-python mirrored the numpy indexing behavior and treated the elements of the index arrays as individual sets of integer indices. This special case has been removed. An IndexError is now raised when the new behavior would produce a different result than the old, i.e. when the indices in an integer sequence are not sorted, or there are duplicate indices in the sequence. * fix for issue #310 (masked arrays not returned correctly when variable has non native endian-ness). * fix for issue #306 (slicing variable with "-1" when there is only one element along that dimension). * Improved speed of num2date and date2num for standard, julian, gregorian and proleptic gregorian calendars by vectorizing the functions. See Issue #296 * Fix for issue #301 ("Datestring parser chokes on years with extra space"). * Add name property for Dimension, Variable and Group instances (to access string name associated with instance). * Allow for null byte attributes (so _FillValue='\x00' can be set manually). Issue 273. * Added __repr__ (matching __str__) for all types (pull request #291). IPython uses __repr__ to make use-friendly human-readable summaries of objects in the terminal. version 1.1.1 (tag v1.1.1rel) ============================== * make sure _FillValue is a byte for character arrays in Python 3 (issue 271). * add numpy to install_requires in setup.py (issue #282, fixes issue #211). 'pip install netcdf4-python' will no longer fail if numpy not installed. * Fix for issue 278 (UnicodeDecodeError reading netcdf.h from setup.py with Python 3.4). * Make netcdftime.datetime immutable and hashable (issue 255). * Fix issue with slicing of scalar VLEN arrays (issue 270). * Add set_auto_mask and set_auto_scale methods to control auto scaling and auto masking separately. (issue 269). Also added set_auto_maskandscale, set_auto_scale, set_auto_mask Dataset/Group methods that recursively walk through all variables in the Dataset/Group. * Make sure file_format attribute propagated to Group instances (issue 265). * Fix for issue #259 ("Cannot use broadcasting to set all elements of a Variable to a given value"). version 1.1.0 (tag v1.1.0rel) ============================= * revert weakref change, so that previous behaviour (Dimensions and Variables keep strong references to parent Dataset) is the default. New keyword argument 'keepweakref' for Dataset.__init__ can be set to true to get weak references. version 1.0.9 (tag v1.0.9rel) ============================= * speed up the creation of new Group instances (issue 239). * fix logic errors in setup.py (issue 236). * it is now possible to create and set variable length string variables with numpy string datatypes (pull request 224). * add .travis.yml (for travis-ci testing on github), silence warnings from test output (issue 225). * modify __unicode__ for Variable and Dimension to return more useful error message when Dataset object has been garbage collected. * use weak references to group instances when creating Dimension and Variable objects. This prevents cyclic references messing up garbage collection (issue 218, pull request 219). * accessing values from a 0-dimensional Variable now returns a 0-dimensional numpy array, not a 1-dimensional array (issue 220). To write code compatible with both the old and new (fixed) behavior, wrap values accessed from a 0-dimensional Variable with numpy.asscalar. * add an __array__ method to Variable to make numpy ufuncs faster (issue 216). * change download_url in setup.py to point to pypi instead of googlecode. * fix for date2index error when time variable has only one entry (issue 215). * silence warnings ("Non-trivial type declarators in shared declaration (e.g. mix of pointers and values). Each pointer declaration should be on its own line") with Cython 0.2. * reduced memory usage for Variable.__getitem__ under Python 2. version 1.0.8 (tag v1.0.8rel) ============================= * change file_format Dataset attribute to data_model (keeping file_format for backward compatibility). Add disk_format attribute (underlying disk format, one of NETCDF3, HDF4, HDF5, DAP2, DAP4, PNETCDF or UNDEFINED). Uses nc_inq_format_extended, added in version 4.3.1 of library. If using earlier version of lib, disk_format will be set to UNDEFINED. * default _FillValue now ignored for byte data types (int8 and uint8) as per http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-c/Fill-Values.html#Fill-Values "If you need a fill value for a byte variable, it is recommended that you explicitly define an appropriate _FillValue attribute, as generic utilities such as ncdump will not assume a default fill value for byte variables". ncinfo now returns fill mode information (issue 209). * check to see if filling was disabled before masking data equal to default fill value (issue 209). * add variable type information to Dataset.__repr__ (output of ncinfo). version 1.0.7 (tag v1.0.7rel) ============================= * add the ability to specify the locations of hdf4,jpeg and curl libs, in case netCDF4 was built statically with HDF4 and/or OpenDAP support (issue 207). * add 'ncinfo' utility (like 'ncdump -h' but less verbose). * more information displayed when Dataset or Group instance is printed. * fix for issue 194 (versions after 1.0.5 fail for netcdf 4.1.1, due to call to nc_inq_path, which was added in netcdf 4.1.2). Fixed by adding compile time API check similar to what was done for nc_rename_grp. If filepath Dataset method is called an exception will be raised at runtime if the module was built with netcdf < 4.1.2, or cython was not installed at build time. * fix for issues 202 and 206 (exception raised by numpy.isnan for character data types). * if dateutils not installed and time unit accuracy < 1 second requested, have netcdftime raise an ImportError. version 1.0.6 (svn revision 1312) ================================ * issue warning of endian-ness of dtype argument does not match endian kwarg in createVariable. * make sure netcdf type NC_CHAR always returned in numpy array dtype 'S1' (sometimes arrays of type 'U1' were being returned). Fixes intermittently failing test tst_compoundatt.py on python 3.3. * fix for issue 201 (if data associated with numpy array not the same endian-ness as dtype, data was written incorrectly). Now bytes are swapped if necessary. Variable.endian() now returns 'native' instead of None for NETCDF3 formatted files. createVariable now enforces endian='native' for NETCDF3 files. Added tst_endian.py test case. * fix for issue 200 (library version detection failed on cygwin). * fix for issue 199 (nc4tonc3 utility not copying global attributes). * fix for issue 198 (setup.py chokes when no arguments given). * fix for issue 197 (slicing of netCDF variables using lists of integers). * create 'path' attribute for group instance using posixpath, instead of os.path (to ensure the unix path is used on all platforms). Issue 196. * fix for issue 196 (test failures on win32 due to files being deleted before they are closed). version 1.0.5 (svn revision 1278) ================================ * change setup.py to compile the Cython sources directly, if cython is available. This allows for "ifdef" like capability to modify source at compile time to account for changes in netcdf API (e.g. the forthcoming addition of the nc_rename_grp in version 4.3.1). * added a "renameGroup" method, which raises an exception if the netcdf lib version linked does not support it. Requires netcdf >= 4.3.1. * support for more than one missing value (missing_value attribute is a vector) when converting to masked array. * add 'renameAttribute' method to Dataset, Group and Variable. * fix so that var[:] = x works if x is a scalar, and var is a netcdf variable with an unlimited dimension that has shape () - i.e. no data has been written to it yet. Before this change, var[:] = x did not write any data. Now the scalar x will be written as the first entry in var along the unlimited dimension. * remove dos line feeds from nc3tonc4 (issue 181). * add datatype property for Variable that returns numpy dtype for primitive datatypes (same as dtype attribute) but returns CompoundType or VLType instance for compound or vlen variables (issue 178). * fix logic for deciding where to look for nc-config in setup.py (issue 177). * issue a warning and don't try to apply scale_factor or add_offset if these attributes are not convertible to floats (issue 176). * add filepath method to Dataset instance to return file path (or opendap URL) used to create Dataset (issue 172). * fix for issue 170 (opening a remote DAP dataset fails after creating a NETCDF4 formatted file). * fix for issue 169 (error in chartostring function on 64-bit windows). * add support for missing_value or _FillValue == NaN (issue 168). * added a Dimension.group() method (issue 165). version 1.0.4 (svn revision 1229) ================================= * fixed alignment bug that could cause memory corruption when reading compound type variables. All users of compound types should upgrade. version 1.0.3 (svn revision 1219) ================================= * don't try to write empty data array to netcdf file (fixed failing test with netcdf 4.3.0rc2). * date2num, num2date and date2index now can handle units of microseconds and milliseconds (for proleptic_gregorian calendar, or gregorian and standard calendars as long as the time origin is after 1582-10-15). Issue 159. * Added a _grp attribute to Dimension (issue 165). * don't bundle ordereddict (issue 164). * support reading of vlen string attributes (issue 156). * add --vars option to nc3tonc4 (issue 154). * Don't try to set fletcher32 checksum on scalar variables (it causes HDF5 to crash). Fixes issue 150. * Add --istart/--istop options to nc3tonc4 (issue 148, courtesy of Rich Signell). * fix for proleptic_gregorian in netcdftime.py (courtesy of Matthias Cuntz). version 1.0.2 (svn revision 1196) ================================= * disable version check for HDF5, which is broken by hdf5 1.8.10. * make sure all files have a calendar attribute in MFTime (issue 144). * more robust fix to issue 90 (array shape modified by assignment to a netCDF variable with one more dimension), including test case. version 1.0.1 (svn revision 1190) ================================= * fix error that occurred when retrieving data from a variable that has a missing_value attribute specified as a string (issue 142). * automatically close netcdf files when there are no references left to Dataset object (using __dealloc__ method). Fixes issue 137. * fix for slicing of scalar vlen string variables (issue 140). * fix to allow writing of unicode data to a NC_CHAR variable. * allow for writing of large variables (> 2**32 elements). Fixes issue 130. version 1.0fix1 =============== * fix python 3 incompatibility in setup.py (issue 125). version 1.0 (svn revision 1164) =============================== * add 'aggdim' keyword to MFDataset, so the name of the dimension to aggregate over can be specified (instead of using the unlimited dimension). aggdim=None by default, which results in the previous behavior. aggdim must be the leftmost dimension of all the variables to be aggregated. * raise IndexError when indexing a netcdf variable out of range so iterating over a variable in a for loop behaves as expected (as described in http://effbot.org/zone/python-for-statement.htm). Fixes issue 121. * added MacPorts portfile (so it can be installed via MacPorts on macosx using a "local Portfile repository"). Installs from svn HEAD using 'port install netcdf4-python'. * added experimental 'diskless' file capability (only added to the C lib after the 4.2 release). Controlled by kwarg 'diskless' to netCDF4.Dataset (default False). diskless=True when creating a file results in a file that exists only in memory, closing the file makes the data disapper, except if persist=True keyword given in which case it is persisted to a disk file on close. diskless=True when opening a file creates an in-memory copy of the file for faster access. * add the ability to specify the location of the required libs (and whether to use nc-config) with setup.cfg, instead of using environment variables. * fix ISO9601 date parser so it recognizes time zone offsets in time unit strings (contributed by David Hassel, issue 114, r1117). * add setncatts Dataset,Group and Variable method to add a bunch of attributes (given in a python dictionary) at once. Speeds things up for NETCDF3 and NETCDF4_CLASSIC files a lot, since nc_redef/nc_enddef not need to be called for each attribute (issue 85, r1113). Adding 1000 attributes is about 35 times faster using setncatts to add them all at once. Makes no difference for NETCDF4 formatted files, since nc_redef/nc_enddef is not called. * only round after apply scale_factor and add_offset if variable type is integer (issue 111, r1109). * Fixed bug with all False Boolean index (r1107). * added support for after, before and nearest selection method to date2index fast "first guess" indexing (r1106). * Remove white space in time units string (netcdftime._parse_date). An extra space in the time units of one CMIP3 model caused an error (r1105). * based on results with examples/bench_compress2.py, change default complevel for zlib compression from 6 to 4. If complevel=0, turn compression off entirely (set zlib=False) (r1102). version 0.9.9 (svn revision 1099) ================================ * changed default unicode encoding from "latin-1" to "utf-8", since this is the python 3 default, and the only encoding that appears to work for dimension and variable names. * added test case for unicode attributes, variable and dimension names. * fixes for unicode variable, dimension and group names. * fix for unicode attributes in python3 (ncdump did not intrepret them as text strings). Issue 107. * add --format option to nc4tonc3 utility (can be either NETCDF3_CLASSIC or NETCDF3_64BIT). Fixes issue 104. version 0.9.8 (svn revision 1080) ================================ * use numpy.ma.isMA to check for masked array (instead of checking for presence of 'mask' attribute). * fixes for AIX with ibm xlc compiler. * make sure unicode attributes don't get converted to ascii strings (issue 98). version 0.9.7 (svn revision 1073) ================================ * Added __str__ methods to Dataset, Variable, Dimension, CompoundType, VLType and MFDataset, so useful human-readable information is provided when these objects are printed in an interactive session. * don't try to apply scale_factor and offset if scale_factor=1 and add_offset=0 (to avoid making copies of large arrays). * changed netCDF4._default_fillvals to netCDF4.default_fillvals (to make part of public API). Added to docs (issue 94). version 0.9.6 (svn revision 1043) ================================= * changed default unicode encoding from "ascii" to "latin-1" (iso-8859-1). * add "unicode_error" module variable to control what happens when characters cannot be decoded by the encoding specified by the "default_encoding" module variable (which is "ascii" by default). unicode_error = "replace" by default which means bad characters are replace by "?". Previously an error was raised, the old behavior can be obtained by setting unicode_error = 'strict'. Fixes issue 92. * add __enter__ and __exit__ methods so you can do "with Dataset(url) as f:" (issue 89). * don't add extra singleton dimensions to rhs numpy arrays when assigning to a netcdf variable. Fixes issue 90. * coerce missing_value attribute to same type as variable (for primitive types). Fixes issue 91. version 0.9.5 (svn revision 1031) ================================ * fix for compound variables on python 3.2. * fix slicing of masked MFDataset variables (issue 83). * round to nearest integer after packing with scale_factor and add_offset (instead of truncation) (issue 84). * if add_offset missing, but scale_factor present, assume add_offset zero. if scale_factor missing, but add_offset present, assume scale_factor one. (this is consistent with unidata recommendations - issue 86). * only try to convert strings to bytes for python 3 so Dataset can be subclassed (issue 87). version 0.9.4 (svn revision 1018) ================================ * tested with python 2.7.1/3.1.3 using netcdf 4.1.2 and hdf5 1.8.6. * Added a 'default_encoding' module variable that controls how unicode strings are encoded into bytes. Default is 'ascii'. * now works on Python 3. * netCDF3 module removed. If you still need it, get it from netCDF4 0.9.3. * regenerated C source with Cython 0.14.1. * Added a MFTime class. Provide a unified interface to MFDataset time variable using different time units. * Fixed bug in netcdftime (issue 75) that occurs when time specified is within one second of the end of the month. * on unix-like systems, the environment variable USE_NCCONFIG can be set to tell setup.py to use the nc-config script installed by netcdf to figure out where all the libs and headers are (without having to specify NETCDF_DIR, HDF5_DIR, etc). Only works with netcdf 4.1.2. version 0.9.3 (svn revision 930) ================================ * fix chunk sizes bug (chunk sizes pointer should be size_t, not int). Fixes issue 66. Added test in tst_compression.py * fixed writing of data with missing values with scale/offset packing. Added test (tst_masked2.py). * fix iso8601 regex in netcdftime date parser so it can parse 'hours since 1-1-1 ...' (year had to be 4 digits previously) version 0.9.2 (svn revision 907) ================================ * fix netcdftime bug with '360_day' calendar. Fixes issue 59. * make sure scalar slice of 1d variable returns array scalar (not array of shape (1,)). Fixes issue 57. * updated date parser in netcdftime. Can now handle units like "seconds since 1970-01-01T00:00:00Z". * added support in setup.py for specifying the locations of the HDF5/netcdf-4 headers and libs separately with environment variables (HDF5_INCDIR, HDF5_LIBDIR).i Patch contributed by Patrice Dumas. * add masked array support to num2date (dates for missing times set to None). * add chunk_cache keyword to createVariable. HDF5 default is 1mb, which can cause problems when creating 1000's of variables. In such cases, chunk_cache can be reduced, or set to zero. * add set_var_chunk_cache and get_var_chunk_cache Variable methods. * raise AttributeError when trying to set _FillValue attribute (it can only be reliably set on variable creation, using the fill_value keyword to createVariable). version 0.9.1 (svn revision 879) ================================ * raise ImportError if netcdf-4 < 4.1.1 or hdf5 <= 1.8.4. * add __netcdf4libversion__ and __hdf5libversion__ module variables. * make sure data is not truncated to integers before scale_factor and add_offset is applied (issue 46). * fix bug in date2num with noleap calendar in netcdftime (issue 45). * fix bug in 360day calendar in netcdftime (issue 44). * python 2.4 compatibility restored (by modifying OrderedDict). Fixes issue 37. * make sure int64 attributes cast to int32 when format=NETCDF4_CLASSIC. This was causing tst_multifile.py to fail on 64-bit platforms. * fix tutorial.py to cast 64 bit integers to 32 bit when writing to 32-bit integer vlen (was causing tutorial.py to fail on 64-bit platforms). * remove nose dependency from tst_netcdftime.py. version 0.9 (svn revision 846) ============================== * fixed bug (issue 30) with date2index occurring with dates outside the support. * make sure that auto masking works with MFDataset. * fix bug (issue 34) when slicing MFDataset variables with dimensions of length 1. * used ordered dictionaries for variables, dimensions, groups etc to preserve creation order (makes it easier to copy files, fixes issue 28). * change auto_maskandscale default to True. This means data will automatically be converted to and from masked arrays. Data scaled as short integers using the scale_factor and add_offset attributes will also be automatically converted to/from float arrays. * add setncattr, getncattr, delncattr methods (for setting/getting/deleting netcdf attributes with names that clash with the reserved python attributes). version 0.8.2 (svn revision 769) ================================ * compound type tests re-enabled. Compound and vlen types now fully supported in netcdf-4.1-beta2. * make sure data retrieved from a netCDF variable is not coerced to a python scalar (it should remain a numpy scalar array). * fix docs to point out that an unlimited dimension can be created by setting size to *either* None or 0 in createDimension. * fix another slicing corner case. * remove auto pickling/unpickling into vlen strings (too cute, sometimes produced surprising results). version 0.8.1 (svn revision 744) ================================ * added 'cmptypes' and 'vltypes' Group/Dataset attributes, which contain dictionaries that map the names of compound and vlen types to CompoundType and VLType instances. * Experimental variable-length (vlen) data type support added. * changes to accomodate compound types in netcdf-4.1-beta snapshots. Compound types now work correctly for snapshots >= 20090603. * Added __len__ method and 'size' property to Variable class. * In date2index, replaced the brute force method by the bisection method and added a 'select' keyword to find the index of the date before, after or nearest the given date. * Fixed bug occurring when indexing with a numpy array of length 1. * Fixed bug that occured when -1 was used as a variable index. * enabled 'shared access' mode for NETCDF3 formatted files (mode='ws', 'r+s' or 'as'). Writes in shared mode are unbuffered, which can improve performance for non-sequential access. * fixed bug in renameVariable that caused failure when new name is longer than old name, and file format is NETCDF3_64BIT or NETCDF3_CLASSIC. version 0.8 (svn revision 685) ============================== * added 'stringtoarr' utility function for converting python strings to numpy character arrays of a specified size. * initial support for compound data types (which are mapped to structured numpy arrays). Compound data types are created with the createCompoundTYpe Dataset or Group method. Both attributes and variables can be compound types. * make sure 64-bit integer attributes converted to 32 bits when writing to a NETCDF3 formatted file. * added nc4tonc3 utility for converted NETCDF4_CLASSIC files to NETCDF3_64BIT files (useful for sharing data with colleagues that don't have netcdf-4 capable clients). version 0.7.7 (svn revision 626) ================================ * David Huard reworked fancy indexing - it is now much more efficient and less of a memory hog. Now works differently than numpy fancy indexing - 1d arrays of boolean or integer indices work independently on each dimension. This enables things like: >>> tempdat = temp[[0,1,3],lats>0,lons>0] (retrieves 1st, 2nd and 4th levels, all Northern Hem. and Eastern Hem. grid points - note that this would raise an IndexError in numpy) * added opendap test (tst_dap.py). * bugfix for nc3tonc4 utility. * fix MFDataset.Variable. __getattr__ to raise AttributeError instead of KeyError when attribute not found. * netcdftime version number upped to 0.7. version 0.7.6 (svn revision 574) ================================ * added date2index function, courtesy of David Huard, which finds the indices in a netCDF time variable corresponding to a sequence of datetime instances. * make _get_att/_set_att raise AttributeError instead of RuntimeError, so that getattr(object, 'nonexistantattribute', None) works. (thanks David Huard) * v[:] = data now works along unlim dim, i.e. you can do this: file = Dataset('test.nc', "w") file.createDimension("time", None) # unlimited dimension var = file.createVariable("var", 'd', ("time",)) # you used to have to do this #var[0:10] = numpy.arange(10) # but now you can simply do this var[:] = numpy.arange(10) version 0.7.5 (svn revision 549) ================================ * return a scalar array, not a python scalar, when a slice returns a single number. This is more consistent with numpy behavior, and fixes a bug in MFDataset slicing. * added 'exclude' parameter to MFDataset.__init__ * added set_auto_maskandscale method to MFDataset variables. version 0.7.4 (svn revision 540) ================================ * ensure all arithmetic is done with float64 in netcdftime (Rob Hetland). * fixes for netcdf-4.0-beta2 ('chunking' keyword to createVariable replaced by 'contiguous'). Now works with netcdf-4.0-beta2 and hdf5-1.8.0 final, but is incompatible with netcdf-4.0-beta1. version 0.7.3.1 (svn revision 507) ================================== * netCDF3 docs were missing from 0.7.3. * make sure quantization function preserves fill_value of masked arrays. version 0.7.3 (svn revision 501) ================================ * MFnetCDF4 module merged into netCDF4 and netCDF3 (now called MFDataset). * added netCDF3 module for those who can't install the netCDF 4 lib. * added set_auto_maskandscale Variable method to enable automatic packing and unpacking of short integers (using scale_factor and add_offset attributes) and automatic conversion to/from masked arrays (using missing_value or _FillValue attribute) on a per-variable basis. var.set_auto_maskandscale(True) turns automatic conversion on (it is off by default). * automatically pack/unpack short integer variables if scale_factor and add_offset variable attributes are set. * added support for masked arrays. If you try to write a masked array to a variable with the missing_value or _FillValue attributes set, the masked array is filled with that value before being written to the file. If you read data from a variable with the missing_value or _FillValue attribute set, a masked array is returned with the appropriate values masked. * added date2num and num2date functions. * added capability to use 'fancy indexing' with variable objects (i.e. using sequences of integers or booleans in slices). WARNING: if a sequence of integers or booleans is used to slice a netCDF4 variable, all of the data in that dimension is read into a numpy array, and then the sequence is used to slice the numpy array, returning just the requested elements to the user. This can potentially gobble a lot of memory and degrade performance (especially if 'fancy indexing' is done on the left-most dimension). * added convenience functions stringtochar and chartostring for converting character arrays to arrays of fixed-length strings and vice-versa. Example usage in examples/test_stringarr.py. 20070826 - version 0.7.1 (svn revision 400) =========================================== * added 'endian()' and 'chunking()' Variable methods (to inquire about endian and chunking variable settings). * 'ndim' attribute was not public (so it couldn't be accessed from python). Fixed. * added 'endian' kwarg to createVariable (to set the endian-ness used in the HDF5 file). * can now manually set HDF5 chunksizes for each dimension at variable creation, using 'chunksizes' kwarg to createVariable. * added "getlibversion()" function to get info about version of netcdf-4 library used to build module. * if a variable has an unsupported datatype (such as 'compound', or 'vlen'), then instead of raising an exception, just skip it. Print a useful error message when an attribute with an unsupported datatype is accessed. * if variable dimension is specified as 'dimname' or ('dimname') in createVariable, it is automatically converted to a tuple ('dimname',). Better error messages when specified dimension can't be found. * createVariable accepts numpy dtype object as datatype. dtype variable attribute is now a numpy dtype object. 20070723 - version 0.7 (svn revision 361) ========================================= * renamed MFnetCDF4_classic --> MFnetCDF4. * eliminated netCDF4_classic module (all file formats handled by netCDF4 module now). * removed all user-defined data type stuff (it was hacky and made the code too complex - wait till there is a real use case to refactor and put back in). * added 'ndim' variable attribute (number of variable dimensions). 20070424 - version 0.6.3 (svn revision 302) =========================================== * passes all tests with netcdf-4.0-beta1/hdf5-1.8.0-beta1. * if slice index is not a slice object, assume it's an integer (and try to convert to one if it is not). This allows numpy scalar arrays to work as slice indices. * (netCDF4_classic only) try to make sure file is not left in 'define mode' when execption is raised. * if slicing a variable results in a array with shape (1,), just return a scalar (except for compound types). * added instructions for using the netCDF4_classic module to serve data over http with the DAP using pydap (http://pydap.org). * added --quiet and --chunk options to nc3tonc4. * Turned off zlib compression by default so as not to violate the 'principle of least surprise'. Shuffle filter still activated by default when zlib compression turned on. * Fixed bug in fletcher32 checksum activation call. Renamed compression() variable method to filters(), include fletcher32 checksum flag in output. * added utility for converting GRIB1 files to compressed NETCDF4_CLASSIC files (requires PyNIO). * added 'compression()' variable method that returns a dict with compression filter parameter settings for that variable. (rev 237) * reimplemented 'shape' and 'dimensions' variable attributes as properties. * fixed bug when 'chunking' keyword in createVariable was set to 'sub' (caused Bus Error on MacOS X). * Setting 'shuffle=0' keyword in createVariable was turning off zlib compression filter instead of shuffle filter. Fixed. 20070213 - version 0.6.2 ======================== * updated for compatibility with netcdf-4.0-alpha18 and hdf5 1.8.0alpha5 (shared dimensions actually work now). * netCDF4.createVariable can now use old single character Numeric typecodes for datatype specification. * Improvements to MFDataset (now called MFnetCDF4_classic) by Rob Hetland. 20061121 - version 0.6.1 ======================== * bugfixes for negative strides. * bugfix for empty string attributes. * support for shared dimensions (variables can use dimensions defined only in a parent group). This doesn't actually work yet, because of a bug in netcdf-4.0-alpha17. * now requires Pyrex (C source files generated on the fly when setup.py is run). 20061003 - version 0.6 ====================== * if fill_value keyword to createVariable is set to the Boolean False (not an integer that evaluates to False), no pre-filling is done for that variable. * updated to be compatible with netcdf-4.0-alpha17. Can now install pure-python netcdftime separately with setup-netcdftime.py. netcdftime will try to use numpy, but fall back to Numeric if numpy not installed. * generated source files with a version of pyrex (from http://codespeak.net/svn/lxml/pyrex/) that produces extensions compatible with python 2.5. * added new module for multi-file access of NETCDF3 and NETCDF4_CLASSIC files (MFDataset). Based on CDFMF from pycdf. * implement negative strides in variable slicing (feature missing from Scientific.IO.NetCDF). Now variables support full python extended slicing syntax. 20060925 - version 0.5.1 ======================== * on 64-bit systems integer attributes in netCDF4_classic failed, since there is no 64-bit integer data type. Fixed by downcasting to 32-bit integer. 20060920 - version 0.5 ====================== * Compound type support! (members must be fixed data primitive types - no user-defined types or NC_STRING variables allowed). Attributes are still restricted to primitive data types (no vlen or compound type attributes). * Assigning single values to a slice now does the Right Thing, i.e. >>> data[:] = 1 fills all the elements with 1 (instead of raising an IndexError). * Tested with numpy 1.0b5, netcdf-4.0-alpha16, HDF5 1.7.52 alpha. * Added renameDimension and renameVariable methods to Dataset and Group classes. * netCDF attributes can be deleted using python del (i.e. 'del dset.foo'). * Moved examples from test and test_classic to examples and examples_classic directories. * Added proper unit tests (in test and test_classic directories). * NULL characters are removed from text attributes. * Variable _FillValue can be set using new keyword argument 'fill_value' to createVariable Dataset and Group method. * docstrings now formatted with epydoc (http://epydoc.sf.net). * improved Scientific.IO.NetCDF compatibility for netCDF4_classic (typecode method, ability to use old Numeric typecodes). * zlib=False or complevel=0 disables shuffle filter in createVariable. * subversion repository hosted on Google projects (http://code.google.com/p/netcdf4-python/). * examples_classic/bench2.py is a performance comparison with Scientific.IO.NetCDF (the numpy version provided by pynetcdf). * __dict__ attribute of Dataset, Group or Variable provides a python dictionary with all netCDF attribute name/value pairs (just like Scientific.IO.NetCDF). 20060710 - version 0.4.5 ======================== * fixed to work with recent svn versions of numpy * Now requires at least numpy 0.9.8. * Raise a AttributeError if user tries to rebind a private attribute (like 'variables', 'dimensions' or 'dtype'). 20060629 - version 0.4.4 ======================== * fixed to work with netcdf-4.0-alpha14. * automatically cast _FillValue attribute to variable type, to avoid surprising error message. 20060320 - version 0.4.3 ======================== updated netcdftime module yet again added 'all_leap'/'366_day' and '360_day' calendars. netCDFTime class renamed utime, fwd and inv methods renamed date2num and num2date. These methods can now handle numpy arrays as well as scalars. a 'real' python datetime instance is returned if calendar is gregorian, otherwise a 'datetime-like' instance is returned (python datetime can't handle funky dates in 'all_leap' and '360_day' calendars). 20060316 - version 0.4.2 ======================== udunits module replaced by pure python version, renamed 'netcdftime' No longer requires udunits library. Includes 4 calendars ('julian','standard'/'gregorian','proleptic_gregorian','noleap'/'365_day'). Calendar names and their interpretations follow the CF metadata convention. 20060310 - version 0.4.1 ======================== udunits module included for doing time conversions. 20060306 - version 0.4 ====================== netCDF4_classic module can now write NETCDF3_CLASSIC, NETCDF4_64BIT as well as NETCDF4_CLASSIC files. The file format is given as an optional keyword to the Dataset constructor ('NETCDF4_CLASSIC' is the default). Preliminary work on compound types done - but awaiting the next alpha of the netCDF 4 library to complete (bugs in alpha12 prevent it from working properly if the compound type has fields which are arrays). 20060217 - version 0.3.1 ======================== refactored user-defined data type support - user-defined data types are now described by an instance of the class UserType. usertype and usertype_name keyword args eliminated from createVariable. 20060214 - version 0.3 ====================== support for variable length strengths (typecode = 'S') and variable-length, or 'ragged' arrays (vlen user-defined datatype). Arrays of python objects can be saved as pickled strings with datatype = 'S'. 20050128 - version 0.2.5 ======================== added support for scalar variables (and assignValue, getValue Variable methods for Scientific.IO.NetCDF compatibility). 20051123 - version 0.2.4 ======================== numpy 0.9.4 compatibility Changed data type codes from ('d', 'f', 'i', 'h', ...) to ('f8', 'f4', 'i4', 'i2', ...). 20050110 - version 0.2.3 ======================== added ellipsis slicing capability 20050106 - version 0.2.2 ======================== changed scipy_core to numpy. 20051228 - version 0.2.1 ======================== bugfixes, added 'nc3tonc4' utility to convert netCDF version 3 files to NETCDF4_CLASSIC files (with compression). The converted files can be read from netCDF 3 clients that have been re-linked to the netCDF 4 library. 'chunking' keyword added to createVariable in netCDF4 module. 20051224 - version 0.2 ====================== Added netCDF4_classic module - which creates files in NETCDF4_CLASSIC format. These files are compatible with netCDF 3 clients which have been linked against the netCDF 4 lib. This module does not use any new features of the netCDF 4 API except zlib compression. Unlike any other netCDF 3 python client, it can transparently compress data with zlib compression and the HDF5 shuffle filter. 20051222 - version 0.1 ====================== First release. Supports groups, multiple unlimited dimensions, zlib compression (plus shuffle filter and fletcher32 checksum) and all new primitive data types. No support for user-defined data types yet. netcdf4-python-1.5.8rel/LICENSE000066400000000000000000000020401413751447500161120ustar00rootroot00000000000000Copyright 2008 Jeffrey Whitaker Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. netcdf4-python-1.5.8rel/MANIFEST.in000066400000000000000000000007151413751447500166520ustar00rootroot00000000000000include docs/index.html recursive-include man * include MANIFEST.in include README.htmldocs include Changelog include setup.cfg include examples/*py include examples/README.md include test/*py include test/*nc include src/netCDF4/__init__.py include src/netCDF4/_netCDF4.pyx include src/netCDF4/utils.py include include/netCDF4.pxi include include/mpi-compat.h include include/membuf.pyx include *.md include *.py include *.release include *.sh include LICENSE netcdf4-python-1.5.8rel/README.htmldocs000066400000000000000000000004521413751447500176060ustar00rootroot00000000000000To update web docs at http://github.unidata.io/netcdf4-python: First install pdoc (https://github.com/mitmproxy/pdoc) Then in netcdf4-python github clone directory (after building and installing github master), * generate docs (sh create_docs.sh) * edit docs/index.html and clean up as needed. netcdf4-python-1.5.8rel/README.md000066400000000000000000000366631413751447500164060ustar00rootroot00000000000000# [netcdf4-python](http://unidata.github.io/netcdf4-python) [Python](http://python.org)/[numpy](http://numpy.org) interface to the netCDF [C library](https://github.com/Unidata/netcdf-c). [![Build status](https://github.com/Unidata/netcdf4-python/workflows/Build%20and%20Test/badge.svg)](https://github.com/Unidata/netcdf4-python/actions) [![PyPI package](https://badge.fury.io/py/netCDF4.svg)](http://python.org/pypi/netCDF4) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/netCDF4/badges/version.svg)](https://anaconda.org/conda-forge/netCDF4) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.2592291.svg)](https://doi.org/10.5281/zenodo.2592290) ## News For details on the latest updates, see the [Changelog](https://github.com/Unidata/netcdf4-python/blob/master/Changelog). 10/31/2021: Version [1.5.8](https://pypi.python.org/pypi/netCDF4/1.5.8) released. Fix Enum bug, add binary wheels for aarch64 and python 3.10. 6/22/2021: Version [1.5.7](https://pypi.python.org/pypi/netCDF4/1.5.7) released. Fixed OverflowError on Windows when reading data with dimension sizes greater than 2**32-1. Masked arrays no longer returned for vlens. 2/15/2021: Version [1.5.6](https://pypi.python.org/pypi/netCDF4/1.5.6) released. Added `Dataset.fromcdl` and `Dataset.tocdl`, which require `ncdump` and `ncgen` utilities to be in `$PATH`. Removed python 2.7 support. 12/20/2020: Version [1.5.5.1](https://pypi.python.org/pypi/netCDF4/1.5.5.1) released. Updated binary wheels for OSX and linux that link latest netcdf-c and hdf5 libs. 12/01/2020: Version [1.5.5](https://pypi.python.org/pypi/netCDF4/1.5.5) released. Update license wording to be consistent with MIT license. 07/23/2020: Version [1.5.4](https://pypi.python.org/pypi/netCDF4/1.5.4) released. Now requires numpy >= 1.9. 10/27/2019: Version [1.5.3](https://pypi.python.org/pypi/netCDF4/1.5.3) released. Fix for [issue #972](https://github.com/Unidata/netcdf4-python/issues/972), plus binary wheels for python 3.8. 09/03/2019: Version [1.5.2](https://pypi.python.org/pypi/netCDF4/1.5.2) released. Bugfixes, no new features. 05/06/2019: Version [1.5.1.2](https://pypi.python.org/pypi/netCDF4/1.5.1.2) released. Fixes another slicing regression ([issue #922)](https://github.com/Unidata/netcdf4-python/issues/922)) introduced in the 1.5.1 release. 05/02/2019: Version [1.5.1.1](https://pypi.python.org/pypi/netCDF4/1.5.1.1) released. Fixes incorrect `__version__` module variable in 1.5.1 release, plus a slicing bug ([issue #919)](https://github.com/Unidata/netcdf4-python/issues/919)). 04/30/2019: Version [1.5.1](https://pypi.python.org/pypi/netCDF4/1.5.1) released. Bugfixes, no new features. 04/02/2019: Version [1.5.0.1](https://pypi.python.org/pypi/netCDF4/1.5.0.1) released. Binary wheels for macos x and linux rebuilt with netcdf-c 4.6.3 (instead of 4.4.1.1). Added read-shared capability for faster reads of NETCDF3 files (mode='rs'). 03/24/2019: Version [1.5.0](https://pypi.python.org/pypi/netCDF4/1.5.0) released. Parallel IO support for classic file formats added using the pnetcdf library (contribution from Lars Pastewka, [pull request #897](https://github.com/Unidata/netcdf4-python/pull/897)). 03/08/2019: Version [1.4.3.2](https://pypi.python.org/pypi/netCDF4/1.4.3.2) released. Include missing membuf.pyx file in source tarball. No need to update if you installed 1.4.3.1 from a binary wheel. 03/07/2019: Version [1.4.3.1](https://pypi.python.org/pypi/netCDF4/1.4.3.1) released. Fixes bug in implementation of NETCDF4_CLASSIC parallel IO support in 1.4.3. 03/05/2019: Version [1.4.3](https://pypi.python.org/pypi/netCDF4/1.4.3) released. Issues with netcdf-c 4.6.2 fixed (including broken parallel IO). `set_ncstring_attrs()` method added, memoryview buffer now returned when an in-memory Dataset is closed. 10/26/2018: Version [1.4.2](https://pypi.python.org/pypi/netCDF4/1.4.2) released. Minor bugfixes, added `Variable.get_dims()` method and `master_file` kwarg for `MFDataset.__init__`. 08/10/2018: Version [1.4.1](https://pypi.python.org/pypi/netCDF4/1.4.1) released. The old slicing behavior (numpy array returned unless missing values are present, otherwise masked array returned) is re-enabled via `set_always_mask(False)`. 05/11/2018: Version [1.4.0](https://pypi.python.org/pypi/netCDF4/1.4.0) released. The netcdftime package is no longer included, it is now a separate [package](https://pypi.python.org/pypi/cftime) dependency. In addition to several bug fixes, there are a few important changes to the default behaviour to note: * Slicing a netCDF variable will now always return masked array by default, even if there are no masked values. The result depended on the slice before, which was too surprising. If auto-masking is turned off (with `set_auto_mask(False)`) a numpy array will always be returned. * `_FillValue` is no longer treated as a valid_min/valid_max. This was too surprising, despite the fact the thet netcdf docs [attribute best practices](https://www.unidata.ucar.edu/software/netcdf/docs/attribute_conventions.html) suggests that clients should to this if `valid_min`, `valid_max` and `valid_range` are not set. * Changed behavior of string attributes so that `nc.stringatt = ['foo','bar']` produces an vlen string array attribute in NETCDF4, instead of concatenating into a single string (`foobar`). In NETCDF3/NETCDF4_CLASSIC, an IOError is now raised, instead of writing `foobar`. * Retrieved compound-type variable data now returned with character array elements converted to numpy strings ([issue #773](https://github.com/Unidata/netcdf4-python/issues/773)). Works for assignment also. Can be disabled using `set_auto_chartostring(False)`. Numpy structured array dtypes with `'SN'` string subtypes can now be used to define netcdf compound types in `createCompoundType` (they get converted to `('S1',N)` character array types automatically). * `valid_min`, `valid_max`, `_FillValue` and `missing_value` are now treated as unsigned integers if `_Unsigned` variable attribute is set (to mimic behaviour of netcdf-java). Conversion to unsigned type now occurs before masking and scale/offset operation ([issue #794](https://github.com/Unidata/netcdf4-python/issues/794)) 11/01/2017: Version [1.3.1](https://pypi.python.org/pypi/netCDF4/1.3.1) released. Parallel IO support with MPI! Requires that netcdf-c and hdf5 be built with MPI support, and [mpi4py](http://mpi4py.readthedocs.io/en/stable). To open a file for parallel access in a program running in an MPI environment using mpi4py, just use `parallel=True` when creating the `Dataset` instance. See [`examples/mpi_example.py`](https://github.com/Unidata/netcdf4-python/blob/master/examples/mpi_example.py) for a demonstration. For more info, see the tutorial [section](http://unidata.github.io/netcdf4-python/#section13). 9/25/2017: Version [1.3.0](https://pypi.python.org/pypi/netCDF4/1.3.0) released. Bug fixes for `netcdftime` and optimizations for reading strided slices. `encoding` kwarg added to `Dataset.__init__` and `Dataset.filepath` to deal with oddball encodings in filename paths (`sys.getfilesystemencoding()` is used by default to determine encoding). Make sure numpy datatypes used to define CompoundTypes have `isalignedstruct` flag set to avoid segfaults - which required bumping the minimum required numpy from 1.7.0 to 1.9.0. In cases where `missing_value/valid_min/valid_max/_FillValue` cannot be safely cast to the variable's dtype, they are no longer be used to automatically mask the data and a warning message is issued. 6/10/2017: Version [1.2.9](https://pypi.python.org/pypi/netCDF4/1.2.9) released. Fixes for auto-scaling and masking when `_Unsigned` and/or `valid_min`, `valid_max` attributes present. setup.py updated so that `pip install` works if cython not installed. Now requires [setuptools](https://pypi.python.org/pypi/setuptools) version 18.0 or greater. 6/1/2017: Version [1.2.8](https://pypi.python.org/pypi/netCDF4/1.2.8) released. From Changelog: * recognize `_Unsigned` attribute used by [netcdf-java](http://www.unidata.ucar.edu/software/thredds/current/netcdf-java/) to designate unsigned integer data stored with a signed integer type in netcdf-3 [issue #656](https://github.com/Unidata/netcdf4-python/issues/656). * add Dataset init memory parameter to allow loading a file from memory [pull request #652](https://github.com/Unidata/netcdf4-python/pull/652), [issue #406](https://github.com/Unidata/netcdf4-python/issues/406) and [issue #295](https://github.com/Unidata/netcdf4-python/issues/295). * fix for negative times in num2date [issue #659](https://github.com/Unidata/netcdf4-python/pull/659). * fix for failing tests in numpy 1.13 due to changes in `numpy.ma` [issue #662](https://github.com/Unidata/netcdf4-python/issues/662). * Checking for `_Encoding` attribute for `NC_STRING` variables, otherwise use 'utf-8'. 'utf-8' is used everywhere else, 'default_encoding' global module variable is no longer used. getncattr method now takes optional kwarg 'encoding' (default 'utf-8') so encoding of attributes can be specified if desired. If `_Encoding` is specified for an `NC_CHAR` (`'S1'`) variable, the chartostring utility function is used to convert the array of characters to an array of strings with one less dimension (the last dimension is interpreted as the length of each string) when reading the data. When writing the data, stringtochar is used to convert a numpy array of fixed length strings to an array of characters with one more dimension. chartostring and stringtochar now also have an 'encoding' kwarg. Automatic conversion to/from character to string arrays can be turned off via a new `set_auto_chartostring` Dataset and Variable method (default is `True`). Addresses [issue #654](https://github.com/Unidata/netcdf4-python/issues/654) * [Cython](http://cython.org) >= 0.19 now required, `_netCDF4.c` and `_netcdftime.c` removed from repository. 1/8/2017: Version [1.2.7](https://pypi.python.org/pypi/netCDF4/1.2.7) released. Python 3.6 compatibility, and fix for vector missing_values. 12/10/2016: Version [1.2.6](https://pypi.python.org/pypi/netCDF4/1.2.6) released. Bug fixes for Enum data type, and _FillValue/missing_value usage when data is stored in non-native endian format. Add get_variables_by_attributes to MFDataset. Support for python 2.6 removed. 12/1/2016: Version [1.2.5](https://pypi.python.org/pypi/netCDF4/1.2.5) released. See the [Changelog](https://github.com/Unidata/netcdf4-python/blob/master/Changelog) for changes. 4/15/2016: Version [1.2.4](https://pypi.python.org/pypi/netCDF4/1.2.4) released. Bugs in handling of variables with specified non-native "endian-ness" (byte-order) fixed ([issue #554] (https://github.com/Unidata/netcdf4-python/issues/554)). Build instructions updated and warning issued to deal with potential backwards incompatibility introduced when using HDF5 1.10.x (see [Unidata/netcdf-c/issue#250](https://github.com/Unidata/netcdf-c/issues/250)). 3/10/2016: Version [1.2.3](https://pypi.python.org/pypi/netCDF4/1.2.3) released. Various bug fixes. All text attributes in ``NETCDF4`` formatted files are now written as type ``NC_CHAR``, unless they contain unicode characters that cannot be encoded in ascii, in which case they are written as ``NC_STRING``. Previously, all unicode strings were written as ``NC_STRING``. This change preserves compatibility with clients, like Matlab, that can't deal with ``NC_STRING`` attributes. A ``setncattr_string`` method was added to force attributes to be written as ``NC_STRING``. 1/1/2016: Version [1.2.2](https://pypi.python.org/pypi/netCDF4/1.2.2) released. Mostly bugfixes, but with two new features. * support for the new ``NETCDF3_64BIT_DATA`` format introduced in netcdf-c 4.4.0. Similar to ``NETCDF3_64BIT`` (now ``NETCDF3_64BIT_OFFSET``), but includes 64 bit dimension sizes (> 2 billion), plus unsigned and 64 bit integer data types. Uses the classic (netcdf-3) data model, and does not use HDF5 as the underlying storage format. * Dimension objects now have a ``size`` attribute, which is the current length of the dimension (same as invoking ``len`` on the Dimension instance). The minimum required python version has now been increased from 2.5 to 2.6. 10/15/2015: Version [1.2.1](https://pypi.python.org/pypi/netCDF4/1.2.1) released. Adds the ability to slice Variables with unsorted integer sequences, and integer sequences with duplicates. 9/23/2015: Version [1.2.0](https://pypi.python.org/pypi/netCDF4/1.2.0) released. New features: * [get_variables_by_attributes](http://unidata.github.io/netcdf4-python/#netCDF4.Dataset.get_variables_by_attributes) ``Dataset`` and ``Group`` method for retrieving variables that have matching attributes. * Support for [Enum](http://unidata.github.io/netcdf4-python/#section12) data types. * [isopen](http://unidata.github.io/netcdf4-python/#netCDF4.Dataset.isopen) `Dataset` method. 7/28/2015: Version [1.1.9](https://pypi.python.org/pypi/netCDF4/1.1.9) bugfix release. 5/14/2015: Version [1.1.8](https://pypi.python.org/pypi/netCDF4/1.1.8) released. Unix-like paths can now be used in `createVariable` and `createGroup`. ```python v = nc.createVariable('/path/to/var1', ('xdim', 'ydim'), float) ``` will create a variable named 'var1', while also creating the groups 'path' and 'path/to' if they do not already exist. Similarly, ```python g = nc.createGroup('/path/to') ``` now acts like `mkdir -p` in unix, creating groups 'path' and '/path/to', if they don't already exist. Users who relied on `nc.createGroup(groupname)` failing when the group already exists will have to modify their code, since `nc.createGroup` will now return the existing group instance. `Dataset.__getitem__` was also added. `nc['/path/to']` now returns a group instance, and `nc['/path/to/var1']` now returns a variable instance. 3/19/2015: Version [1.1.7](https://pypi.python.org/pypi/netCDF4/1.1.7) released. Global Interpreter Lock (GIL) now released when extension module calls C library for read operations. This speeds up concurrent reads when using threads. Users who wish to use netcdf4-python inside threads should read http://www.hdfgroup.org/hdf5-quest.html#gconc regarding thread-safety in the HDF5 C library. Fixes to `setup.py` now ensure that `pip install netCDF4` with `export USE_NCCONFIG=0` will use environment variables to find paths to libraries and include files, instead of relying exclusively on the nc-config utility. ## Installation The easiest way to install is through pip: ```shell pip install netCDF4 ``` or, if you are a user of the Conda package manager, ```shell conda install -c conda-forge netCDF4 ``` ## Development installation * Clone GitHub repository (`git clone https://github.com/Unidata/netcdf4-python.git`) * Make sure [numpy](http://www.numpy.org/) and [Cython](http://cython.org/) are installed and you have [Python](https://www.python.org) 3.6 or newer. * Make sure [HDF5](http://www.h5py.org/) and netcdf-4 are installed, and the `nc-config` utility is in your Unix PATH. * Run `python setup.py build`, then `pip install -e .`. * To run all the tests, execute `cd test && python run_all.py`. ## Documentation See the online [docs](http://unidata.github.io/netcdf4-python) for more details. ## Usage ###### Sample [iPython](http://ipython.org/) notebooks available in the examples directory on [reading](http://nbviewer.ipython.org/github/Unidata/netcdf4-python/blob/master/examples/reading_netCDF.ipynb) and [writing](http://nbviewer.ipython.org/github/Unidata/netcdf4-python/blob/master/examples/writing_netCDF.ipynb) netCDF data with Python. netcdf4-python-1.5.8rel/README.release000066400000000000000000000024701413751447500174130ustar00rootroot00000000000000* create a release branch ('vX.Y.Zrel'). In the release branch... * make sure version number in PKG-INFO, setup.py and netCDF4/_netCDF4.pyx are up to date (in _netCDF4.pyx, change 'Version' in first line of docstring at top of file, and __version__ variable). * update Changelog and README.md as needed. * commit and push all of the above changes. * install the module (python setup.py install), then run 'sh create_docs.sh' to update html docs. Commit and push the update to docs/netCDF4/index.html. * create a pull request for the release branch. * After release branch has been merged, tag a release git tag -a vX.Y.Zrel -m "version X.Y.Z release" git push origin --tags * push an empty commit to the netcdf4-python-wheels repo to trigger new builds. (e.g. git commit --allow-empty -m "Trigger build") You will likely want to edit the .travis.yml file at https://github.com/MacPython/netcdf4-python-wheels to specify the BUILD_COMMIT before triggering a build. * update the pypi entry, upload the wheels from wheels.scipy.org. Lastly, create a source tarball using 'python setup.py sdist' and upload to pypi. * update web docs by copying docs/netCDF4/index.html somewhere, switch to the gh-pages branch, copy the index.html file back, commit and push the updated index.html file (see README.gh-pages). netcdf4-python-1.5.8rel/README.wheels.md000066400000000000000000000073241413751447500176640ustar00rootroot00000000000000# Building and uploading wheels ## For OSX We automate OSX wheel building using a custom github repository that builds on the travis-ci OSX machines. The travis-ci interface for the builds is : https://travis-ci.org/MacPython/netcdf4-python-wheels The driving github repository is : https://github.com/MacPython/netcdf4-python-wheels ### How it works The wheel-building repository: * does a fresh build of the required C / C++ libraries; * builds a netcdf4-python wheel, linking against these fresh builds; * processes the wheel using [delocate](https://pypi.python.org/pypi/delocate). `delocate` copies the required dynamic libraries into the wheel and relinks the extension modules against the copied libraries; * uploads the built wheel to http://wheels.scipy.org (a Rackspace container kindly donated by Rackspace to scikit-learn). The resulting wheel is therefore self-contained and does not need any external dynamic libraries apart from those provided as standard by OSX. ### Triggering a build You will need write permission to the github repository to trigger new builds on the travis-ci interface. Contact us on the mailing list if you need this. You can trigger a build by: * making a commit to the `netcdf4-python-wheels` repository (e.g. with `git commit --allow-empty`); or * clicking on the circular arrow icon towards the top right of the travis-ci page, to rerun the previous build. In general, it is better to trigger a build with a commit, because this makes a new set of build products and logs, keeping the old ones for reference. Keeping the old build logs helps us keep track of previous problems and successful builds. ### Which netcdf4-python commit does the repository build? By default, the `netcd4-python-wheels` repository is usually set up to build the latest git tag. To check whether this is so have a look around line 5 of `.travis.yml` in the `netcdf4-python-wheels` repository. You should see something like: ``` - BUILD_COMMIT='latest-tag' ``` If this is commented out, then the repository is set up to build the current commit in the `netcdf4-python` submodule of the repository. If it is set to another value then it will be specifying a commit to build. You can therefore build any arbitrary commit by specificying the commit hash or branch name or tag name in this line of the `.travis.yml` file. ### Uploading the built wheels to pypi Be careful, http://wheels.scipy.org points to a container on a distributed content delivery network. It can take up to 15 minutes for the new wheel file to get updated into the container at http://wheels.scipy.org. When the wheels are updated, you can of course just download them to your machine manually, and then upload them manually to pypi, or by using [twine][twine]. You can also use a script for doing this, housed at : https://github.com/MacPython/terryfy/blob/master/wheel-uploader You'll need [twine][twine] and [beautiful soup 4][bs4]. You will typically have a directory on your machine where you store wheels, called a `wheelhouse`. The typical call for `wheel-uploader` would then be something like: ``` wheel-uploader -v -w ~/wheelhouse netCDF4 1.1.8 ``` where: * `-v` means give verbose messages; * `-w ~/wheelhouse` means download the wheels from https://wheels.scipy.org to the directory `~/wheelhouse`; * `netCDF4` is the root name of the wheel(s) to download / upload; * `1.1.8` is the version to download / upload. So, in this case, `wheel-uploader` will download all wheels starting with `netCDF4-1.1.8-` from http://wheels.scipy.org to `~/wheelhouse`, then upload them to pypi. Of course, you will need permissions to upload to pypi, for this to work. [twine]: https://pypi.python.org/pypi/twine [bs4]: https://pypi.python.org/pypi/beautifulsoup4 netcdf4-python-1.5.8rel/checkversion.py000066400000000000000000000004071413751447500201470ustar00rootroot00000000000000import netCDF4, numpy print('netcdf4-python version: %s'%netCDF4.__version__) print('HDF5 lib version: %s'%netCDF4.__hdf5libversion__) print('netcdf lib version: %s'%netCDF4.__netcdf4libversion__) print('numpy version %s' % numpy.__version__) netcdf4-python-1.5.8rel/create_docs.sh000066400000000000000000000007251413751447500177240ustar00rootroot00000000000000# Uses pdoc (https://github.com/mitmproxy/pdoc) # to create html docs from docstrings in Cython source. pdoc -o 'docs' netCDF4 # use resulting docs/netCDF4/_netCDF4.html cp docs/netCDF4.html docs/index.html sed -i -e 's!href="../netCDF4.html!href="./index.html!g' docs/index.html sed -i -e 's!/../netCDF4.html!/index.html!g' docs/index.html sed -i -e 's!._netCDF4 API! API!g' docs/index.html sed -i -e 's!netCDF4._netCDF4!netCDF4!g' docs/index.html netcdf4-python-1.5.8rel/docs/000077500000000000000000000000001413751447500160415ustar00rootroot00000000000000netcdf4-python-1.5.8rel/docs/index.html000066400000000000000000013475171413751447500200600ustar00rootroot00000000000000 netCDF4 API documentation

netCDF4

Version 1.5.7

Introduction

netcdf4-python is a Python interface to the netCDF C library.

netCDF version 4 has many features not found in earlier versions of the library and is implemented on top of HDF5. This module can read and write files in both the new netCDF 4 and the old netCDF 3 format, and can create files that are readable by HDF5 clients. The API modelled after Scientific.IO.NetCDF, and should be familiar to users of that module.

Most new features of netCDF 4 are implemented, such as multiple unlimited dimensions, groups and zlib data compression. All the new numeric data types (such as 64 bit and unsigned integer types) are implemented. Compound (struct), variable length (vlen) and enumerated (enum) data types are supported, but not the opaque data type. Mixtures of compound, vlen and enum data types (such as compound types containing enums, or vlens containing compound types) are not supported.

Quick Install

  • the easiest way to get going is to install via pip install netCDF4. (or if you use the conda package manager conda install -c conda-forge netCDF4).

Developer Install

  • Clone the github repository.
  • Make sure the dependencies are satisfied (Python 3.6 or later, numpy, Cython, cftime, setuptools, the HDF5 C library, and the netCDF C library). For MPI parallel IO support, an MPI-enabled versions of the netcdf library is required, as is mpi4py. Parallel IO further depends on the existence of MPI-enabled HDF5 or the PnetCDF library.
  • By default, the utility nc-config (installed with netcdf-c) will be run used to determine where all the dependencies live.
  • If nc-config is not in your default PATH, you can set the NETCDF4_DIR environment variable and setup.py will look in $NETCDF4_DIR/bin. You can also use the file setup.cfg to set the path to nc-config, or enter the paths to the libraries and include files manually. Just edit the setup.cfg file in a text editor and follow the instructions in the comments. To disable the use of nc-config, set the env var USE_NCCONFIG to 0. To disable the use of setup.cfg, set USE_SETUPCFG to 0. As a last resort, the library and include paths can be set via environment variables. If you go this route, set USE_NCCONFIG and USE_SETUPCFG to 0, and specify NETCDF4_LIBDIR, NETCDF4_INCDIR, HDF5_LIBDIR and HDF5_INCDIR. If the dependencies are not found in any of the paths specified by environment variables, then standard locations (such as /usr and /usr/local) are searched.
  • run python setup.py build, then python setup.py install (as root if necessary).
  • run the tests in the 'test' directory by running python run_all.py.

Tutorial

Creating/Opening/Closing a netCDF file

To create a netCDF file from python, you simply call the Dataset constructor. This is also the method used to open an existing netCDF file. If the file is open for write access (mode='w', 'r+' or 'a'), you may write any type of data including new dimensions, groups, variables and attributes. netCDF files come in five flavors (NETCDF3_CLASSIC, NETCDF3_64BIT_OFFSET, NETCDF3_64BIT_DATA, NETCDF4_CLASSIC, and NETCDF4). NETCDF3_CLASSIC was the original netcdf binary format, and was limited to file sizes less than 2 Gb. NETCDF3_64BIT_OFFSET was introduced in version 3.6.0 of the library, and extended the original binary format to allow for file sizes greater than 2 Gb. NETCDF3_64BIT_DATA is a new format that requires version 4.4.0 of the C library - it extends the NETCDF3_64BIT_OFFSET binary format to allow for unsigned/64 bit integer data types and 64-bit dimension sizes. NETCDF3_64BIT is an alias for NETCDF3_64BIT_OFFSET. NETCDF4_CLASSIC files use the version 4 disk format (HDF5), but omits features not found in the version 3 API. They can be read by netCDF 3 clients only if they have been relinked against the netCDF 4 library. They can also be read by HDF5 clients. NETCDF4 files use the version 4 disk format (HDF5) and use the new features of the version 4 API. The netCDF4 module can read and write files in any of these formats. When creating a new file, the format may be specified using the format keyword in the Dataset constructor. The default format is NETCDF4. To see how a given file is formatted, you can examine the data_model attribute. Closing the netCDF file is accomplished via the Dataset.close method of the Dataset instance.

Here's an example:

>>> from netCDF4 import Dataset
>>> rootgrp = Dataset("test.nc", "w", format="NETCDF4")
>>> print(rootgrp.data_model)
NETCDF4
>>> rootgrp.close()

Remote OPeNDAP-hosted datasets can be accessed for reading over http if a URL is provided to the Dataset constructor instead of a filename. However, this requires that the netCDF library be built with OPenDAP support, via the --enable-dap configure option (added in version 4.0.1).

Groups in a netCDF file

netCDF version 4 added support for organizing data in hierarchical groups, which are analogous to directories in a filesystem. Groups serve as containers for variables, dimensions and attributes, as well as other groups. A Dataset creates a special group, called the 'root group', which is similar to the root directory in a unix filesystem. To create Group instances, use the Dataset.createGroup method of a Dataset or Group instance. Dataset.createGroup takes a single argument, a python string containing the name of the new group. The new Group instances contained within the root group can be accessed by name using the groups dictionary attribute of the Dataset instance. Only NETCDF4 formatted files support Groups, if you try to create a Group in a netCDF 3 file you will get an error message.

>>> rootgrp = Dataset("test.nc", "a")
>>> fcstgrp = rootgrp.createGroup("forecasts")
>>> analgrp = rootgrp.createGroup("analyses")
>>> print(rootgrp.groups)
{'forecasts': <class 'netCDF4._netCDF4.Group'>
group /forecasts:
    dimensions(sizes): 
    variables(dimensions): 
    groups: , 'analyses': <class 'netCDF4._netCDF4.Group'>
group /analyses:
    dimensions(sizes): 
    variables(dimensions): 
    groups: }
>>>

Groups can exist within groups in a Dataset, just as directories exist within directories in a unix filesystem. Each Group instance has a groups attribute dictionary containing all of the group instances contained within that group. Each Group instance also has a path attribute that contains a simulated unix directory path to that group. To simplify the creation of nested groups, you can use a unix-like path as an argument to Dataset.createGroup.

>>> fcstgrp1 = rootgrp.createGroup("/forecasts/model1")
>>> fcstgrp2 = rootgrp.createGroup("/forecasts/model2")

If any of the intermediate elements of the path do not exist, they are created, just as with the unix command 'mkdir -p'. If you try to create a group that already exists, no error will be raised, and the existing group will be returned.

Here's an example that shows how to navigate all the groups in a Dataset. The function walktree is a Python generator that is used to walk the directory tree. Note that printing the Dataset or Group object yields summary information about it's contents.

>>> def walktree(top):
...     yield top.groups.values()
...     for value in top.groups.values():
...         yield from walktree(value)
>>> print(rootgrp)
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF4 data model, file format HDF5):
    dimensions(sizes): 
    variables(dimensions): 
    groups: forecasts, analyses
>>> for children in walktree(rootgrp):
...     for child in children:
...         print(child)
<class 'netCDF4._netCDF4.Group'>
group /forecasts:
    dimensions(sizes): 
    variables(dimensions): 
    groups: model1, model2
<class 'netCDF4._netCDF4.Group'>
group /analyses:
    dimensions(sizes): 
    variables(dimensions): 
    groups: 
<class 'netCDF4._netCDF4.Group'>
group /forecasts/model1:
    dimensions(sizes): 
    variables(dimensions): 
    groups: 
<class 'netCDF4._netCDF4.Group'>
group /forecasts/model2:
    dimensions(sizes): 
    variables(dimensions): 
    groups: 

Dimensions in a netCDF file

netCDF defines the sizes of all variables in terms of dimensions, so before any variables can be created the dimensions they use must be created first. A special case, not often used in practice, is that of a scalar variable, which has no dimensions. A dimension is created using the Dataset.createDimension method of a Dataset or Group instance. A Python string is used to set the name of the dimension, and an integer value is used to set the size. To create an unlimited dimension (a dimension that can be appended to), the size value is set to None or 0. In this example, there both the time and level dimensions are unlimited. Having more than one unlimited dimension is a new netCDF 4 feature, in netCDF 3 files there may be only one, and it must be the first (leftmost) dimension of the variable.

>>> level = rootgrp.createDimension("level", None)
>>> time = rootgrp.createDimension("time", None)
>>> lat = rootgrp.createDimension("lat", 73)
>>> lon = rootgrp.createDimension("lon", 144)

All of the Dimension instances are stored in a python dictionary.

>>> print(rootgrp.dimensions)
{'level': <class 'netCDF4._netCDF4.Dimension'> (unlimited): name = 'level', size = 0, 'time': <class 'netCDF4._netCDF4.Dimension'> (unlimited): name = 'time', size = 0, 'lat': <class 'netCDF4._netCDF4.Dimension'>: name = 'lat', size = 73, 'lon': <class 'netCDF4._netCDF4.Dimension'>: name = 'lon', size = 144}

Using the python len function with a Dimension instance returns current size of that dimension. Dimension.isunlimited method of a Dimension instance be used to determine if the dimensions is unlimited, or appendable.

>>> print(len(lon))
144
>>> print(lon.isunlimited())
False
>>> print(time.isunlimited())
True

Printing the Dimension object provides useful summary info, including the name and length of the dimension, and whether it is unlimited.

>>> for dimobj in rootgrp.dimensions.values():
...     print(dimobj)
<class 'netCDF4._netCDF4.Dimension'> (unlimited): name = 'level', size = 0
<class 'netCDF4._netCDF4.Dimension'> (unlimited): name = 'time', size = 0
<class 'netCDF4._netCDF4.Dimension'>: name = 'lat', size = 73
<class 'netCDF4._netCDF4.Dimension'>: name = 'lon', size = 144

Dimension names can be changed using the Datatset.renameDimension method of a Dataset or Group instance.

Variables in a netCDF file

netCDF variables behave much like python multidimensional array objects supplied by the numpy module. However, unlike numpy arrays, netCDF4 variables can be appended to along one or more 'unlimited' dimensions. To create a netCDF variable, use the Dataset.createVariable method of a Dataset or Group instance. The Dataset.createVariablej method has two mandatory arguments, the variable name (a Python string), and the variable datatype. The variable's dimensions are given by a tuple containing the dimension names (defined previously with Dataset.createDimension). To create a scalar variable, simply leave out the dimensions keyword. The variable primitive datatypes correspond to the dtype attribute of a numpy array. You can specify the datatype as a numpy dtype object, or anything that can be converted to a numpy dtype object. Valid datatype specifiers include: 'f4' (32-bit floating point), 'f8' (64-bit floating point), 'i4' (32-bit signed integer), 'i2' (16-bit signed integer), 'i8' (64-bit signed integer), 'i1' (8-bit signed integer), 'u1' (8-bit unsigned integer), 'u2' (16-bit unsigned integer), 'u4' (32-bit unsigned integer), 'u8' (64-bit unsigned integer), or 'S1' (single-character string). The old Numeric single-character typecodes ('f','d','h', 's','b','B','c','i','l'), corresponding to ('f4','f8','i2','i2','i1','i1','S1','i4','i4'), will also work. The unsigned integer types and the 64-bit integer type can only be used if the file format is NETCDF4.

The dimensions themselves are usually also defined as variables, called coordinate variables. The Dataset.createVariable method returns an instance of the Variable class whose methods can be used later to access and set variable data and attributes.

>>> times = rootgrp.createVariable("time","f8",("time",))
>>> levels = rootgrp.createVariable("level","i4",("level",))
>>> latitudes = rootgrp.createVariable("lat","f4",("lat",))
>>> longitudes = rootgrp.createVariable("lon","f4",("lon",))
>>> # two dimensions unlimited
>>> temp = rootgrp.createVariable("temp","f4",("time","level","lat","lon",))
>>> temp.units = "K"

To get summary info on a Variable instance in an interactive session, just print it.

>>> print(temp)
<class 'netCDF4._netCDF4.Variable'>
float32 temp(time, level, lat, lon)
    units: K
unlimited dimensions: time, level
current shape = (0, 0, 73, 144)
filling on, default _FillValue of 9.969209968386869e+36 used

You can use a path to create a Variable inside a hierarchy of groups.

>>> ftemp = rootgrp.createVariable("/forecasts/model1/temp","f4",("time","level","lat","lon",))

If the intermediate groups do not yet exist, they will be created.

You can also query a Dataset or Group instance directly to obtain Group or Variable instances using paths.

>>> print(rootgrp["/forecasts/model1"])  # a Group instance
<class 'netCDF4._netCDF4.Group'>
group /forecasts/model1:
    dimensions(sizes): 
    variables(dimensions): float32 temp(time,level,lat,lon)
    groups: 
>>> print(rootgrp["/forecasts/model1/temp"])  # a Variable instance
<class 'netCDF4._netCDF4.Variable'>
float32 temp(time, level, lat, lon)
path = /forecasts/model1
unlimited dimensions: time, level
current shape = (0, 0, 73, 144)
filling on, default _FillValue of 9.969209968386869e+36 used

All of the variables in the Dataset or Group are stored in a Python dictionary, in the same way as the dimensions:

>>> print(rootgrp.variables)
{'time': <class 'netCDF4._netCDF4.Variable'>
float64 time(time)
unlimited dimensions: time
current shape = (0,)
filling on, default _FillValue of 9.969209968386869e+36 used, 'level': <class 'netCDF4._netCDF4.Variable'>
int32 level(level)
unlimited dimensions: level
current shape = (0,)
filling on, default _FillValue of -2147483647 used, 'lat': <class 'netCDF4._netCDF4.Variable'>
float32 lat(lat)
unlimited dimensions: 
current shape = (73,)
filling on, default _FillValue of 9.969209968386869e+36 used, 'lon': <class 'netCDF4._netCDF4.Variable'>
float32 lon(lon)
unlimited dimensions: 
current shape = (144,)
filling on, default _FillValue of 9.969209968386869e+36 used, 'temp': <class 'netCDF4._netCDF4.Variable'>
float32 temp(time, level, lat, lon)
    units: K
unlimited dimensions: time, level
current shape = (0, 0, 73, 144)
filling on, default _FillValue of 9.969209968386869e+36 used}

Variable names can be changed using the Dataset.renameVariable method of a Dataset instance.

Variables can be sliced similar to numpy arrays, but there are some differences. See Writing data to and retrieving data from a netCDF variable for more details.

Attributes in a netCDF file

There are two types of attributes in a netCDF file, global and variable. Global attributes provide information about a group, or the entire dataset, as a whole. Variable attributes provide information about one of the variables in a group. Global attributes are set by assigning values to Dataset or Group instance variables. Variable attributes are set by assigning values to Variable instances variables. Attributes can be strings, numbers or sequences. Returning to our example,

>>> import time
>>> rootgrp.description = "bogus example script"
>>> rootgrp.history = "Created " + time.ctime(time.time())
>>> rootgrp.source = "netCDF4 python module tutorial"
>>> latitudes.units = "degrees north"
>>> longitudes.units = "degrees east"
>>> levels.units = "hPa"
>>> temp.units = "K"
>>> times.units = "hours since 0001-01-01 00:00:00.0"
>>> times.calendar = "gregorian"

The Dataset.ncattrs method of a Dataset, Group or Variable instance can be used to retrieve the names of all the netCDF attributes. This method is provided as a convenience, since using the built-in dir Python function will return a bunch of private methods and attributes that cannot (or should not) be modified by the user.

>>> for name in rootgrp.ncattrs():
...     print("Global attr {} = {}".format(name, getattr(rootgrp, name)))
Global attr description = bogus example script
Global attr history = Created Mon Jul  8 14:19:41 2019
Global attr source = netCDF4 python module tutorial

The __dict__ attribute of a Dataset, Group or Variable instance provides all the netCDF attribute name/value pairs in a python dictionary:

>>> print(rootgrp.__dict__)
{'description': 'bogus example script', 'history': 'Created Mon Jul  8 14:19:41 2019', 'source': 'netCDF4 python module tutorial'}

Attributes can be deleted from a netCDF Dataset, Group or Variable using the python del statement (i.e. del grp.foo removes the attribute foo the the group grp).

Writing data to and retrieving data from a netCDF variable

Now that you have a netCDF Variable instance, how do you put data into it? You can just treat it like an array and assign data to a slice.

>>> import numpy as np
>>> lats =  np.arange(-90,91,2.5)
>>> lons =  np.arange(-180,180,2.5)
>>> latitudes[:] = lats
>>> longitudes[:] = lons
>>> print("latitudes =\n{}".format(latitudes[:]))
latitudes =
[-90.  -87.5 -85.  -82.5 -80.  -77.5 -75.  -72.5 -70.  -67.5 -65.  -62.5
 -60.  -57.5 -55.  -52.5 -50.  -47.5 -45.  -42.5 -40.  -37.5 -35.  -32.5
 -30.  -27.5 -25.  -22.5 -20.  -17.5 -15.  -12.5 -10.   -7.5  -5.   -2.5
   0.    2.5   5.    7.5  10.   12.5  15.   17.5  20.   22.5  25.   27.5
  30.   32.5  35.   37.5  40.   42.5  45.   47.5  50.   52.5  55.   57.5
  60.   62.5  65.   67.5  70.   72.5  75.   77.5  80.   82.5  85.   87.5
  90. ]

Unlike NumPy's array objects, netCDF Variable objects with unlimited dimensions will grow along those dimensions if you assign data outside the currently defined range of indices.

>>> # append along two unlimited dimensions by assigning to slice.
>>> nlats = len(rootgrp.dimensions["lat"])
>>> nlons = len(rootgrp.dimensions["lon"])
>>> print("temp shape before adding data = {}".format(temp.shape))
temp shape before adding data = (0, 0, 73, 144)
>>>
>>> from numpy.random import uniform
>>> temp[0:5, 0:10, :, :] = uniform(size=(5, 10, nlats, nlons))
>>> print("temp shape after adding data = {}".format(temp.shape))
temp shape after adding data = (5, 10, 73, 144)
>>>
>>> # levels have grown, but no values yet assigned.
>>> print("levels shape after adding pressure data = {}".format(levels.shape))
levels shape after adding pressure data = (10,)

Note that the size of the levels variable grows when data is appended along the level dimension of the variable temp, even though no data has yet been assigned to levels.

>>> # now, assign data to levels dimension variable.
>>> levels[:] =  [1000.,850.,700.,500.,300.,250.,200.,150.,100.,50.]

However, that there are some differences between NumPy and netCDF variable slicing rules. Slices behave as usual, being specified as a start:stop:step triplet. Using a scalar integer index i takes the ith element and reduces the rank of the output array by one. Boolean array and integer sequence indexing behaves differently for netCDF variables than for numpy arrays. Only 1-d boolean arrays and integer sequences are allowed, and these indices work independently along each dimension (similar to the way vector subscripts work in fortran). This means that

>>> temp[0, 0, [0,1,2,3], [0,1,2,3]].shape
(4, 4)

returns an array of shape (4,4) when slicing a netCDF variable, but for a numpy array it returns an array of shape (4,). Similarly, a netCDF variable of shape (2,3,4,5) indexed with [0, array([True, False, True]), array([False, True, True, True]), :] would return a (2, 3, 5) array. In NumPy, this would raise an error since it would be equivalent to [0, [0,1], [1,2,3], :]. When slicing with integer sequences, the indices need not be sorted and may contain duplicates (both of these are new features in version 1.2.1). While this behaviour may cause some confusion for those used to NumPy's 'fancy indexing' rules, it provides a very powerful way to extract data from multidimensional netCDF variables by using logical operations on the dimension arrays to create slices.

For example,

>>> tempdat = temp[::2, [1,3,6], lats>0, lons>0]

will extract time indices 0,2 and 4, pressure levels 850, 500 and 200 hPa, all Northern Hemisphere latitudes and Eastern Hemisphere longitudes, resulting in a numpy array of shape (3, 3, 36, 71).

>>> print("shape of fancy temp slice = {}".format(tempdat.shape))
shape of fancy temp slice = (3, 3, 36, 71)

Special note for scalar variables: To extract data from a scalar variable v with no associated dimensions, use numpy.asarray(v) or v[...]. The result will be a numpy scalar array.

By default, netcdf4-python returns numpy masked arrays with values equal to the missing_value or _FillValue variable attributes masked for primitive and enum data types. The Dataset.set_auto_mask Dataset and Variable methods can be used to disable this feature so that numpy arrays are always returned, with the missing values included. Prior to version 1.4.0 the default behavior was to only return masked arrays when the requested slice contained missing values. This behavior can be recovered using the Dataset.set_always_mask method. If a masked array is written to a netCDF variable, the masked elements are filled with the value specified by the missing_value attribute. If the variable has no missing_value, the _FillValue is used instead.

Dealing with time coordinates

Time coordinate values pose a special challenge to netCDF users. Most metadata standards (such as CF) specify that time should be measure relative to a fixed date using a certain calendar, with units specified like hours since YY-MM-DD hh:mm:ss. These units can be awkward to deal with, without a utility to convert the values to and from calendar dates. The functions num2date and date2num are provided by cftime to do just that. Here's an example of how they can be used:

>>> # fill in times.
>>> from datetime import datetime, timedelta
>>> from cftime import num2date, date2num
>>> dates = [datetime(2001,3,1)+n*timedelta(hours=12) for n in range(temp.shape[0])]
>>> times[:] = date2num(dates,units=times.units,calendar=times.calendar)
>>> print("time values (in units {}):\n{}".format(times.units, times[:]))
time values (in units hours since 0001-01-01 00:00:00.0):
[17533104. 17533116. 17533128. 17533140. 17533152.]
>>> dates = num2date(times[:],units=times.units,calendar=times.calendar)
>>> print("dates corresponding to time values:\n{}".format(dates))
 [cftime.DatetimeGregorian(2001, 3, 1, 0, 0, 0, 0, has_year_zero=False)
  cftime.DatetimeGregorian(2001, 3, 1, 12, 0, 0, 0, has_year_zero=False)
  cftime.DatetimeGregorian(2001, 3, 2, 0, 0, 0, 0, has_year_zero=False)
  cftime.DatetimeGregorian(2001, 3, 2, 12, 0, 0, 0, has_year_zero=False)
  cftime.DatetimeGregorian(2001, 3, 3, 0, 0, 0, 0, has_year_zero=False)]

num2date converts numeric values of time in the specified units and calendar to datetime objects, and date2num does the reverse. All the calendars currently defined in the CF metadata convention are supported. A function called date2index is also provided which returns the indices of a netCDF time variable corresponding to a sequence of datetime instances.

Reading data from a multi-file netCDF dataset

If you want to read data from a variable that spans multiple netCDF files, you can use the MFDataset class to read the data as if it were contained in a single file. Instead of using a single filename to create a Dataset instance, create a MFDataset instance with either a list of filenames, or a string with a wildcard (which is then converted to a sorted list of files using the python glob module). Variables in the list of files that share the same unlimited dimension are aggregated together, and can be sliced across multiple files. To illustrate this, let's first create a bunch of netCDF files with the same variable (with the same unlimited dimension). The files must in be in NETCDF3_64BIT_OFFSET, NETCDF3_64BIT_DATA, NETCDF3_CLASSIC or NETCDF4_CLASSIC format (NETCDF4 formatted multi-file datasets are not supported).

>>> for nf in range(10):
...     with Dataset("mftest%s.nc" % nf, "w", format="NETCDF4_CLASSIC") as f:
...         _ = f.createDimension("x",None)
...         x = f.createVariable("x","i",("x",))
...         x[0:10] = np.arange(nf*10,10*(nf+1))

Now read all the files back in at once with MFDataset

>>> from netCDF4 import MFDataset
>>> f = MFDataset("mftest*nc")
>>> print(f.variables["x"][:])
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
 96 97 98 99]

Note that MFDataset can only be used to read, not write, multi-file datasets.

Efficient compression of netCDF variables

Data stored in netCDF 4 Variable objects can be compressed and decompressed on the fly. The parameters for the compression are determined by the zlib, complevel and shuffle keyword arguments to the Dataset.createVariable method. To turn on compression, set zlib=True. The complevel keyword regulates the speed and efficiency of the compression (1 being fastest, but lowest compression ratio, 9 being slowest but best compression ratio). The default value of complevel is 4. Setting shuffle=False will turn off the HDF5 shuffle filter, which de-interlaces a block of data before compression by reordering the bytes. The shuffle filter can significantly improve compression ratios, and is on by default. Setting fletcher32 keyword argument to Dataset.createVariable to True (it's False by default) enables the Fletcher32 checksum algorithm for error detection. It's also possible to set the HDF5 chunking parameters and endian-ness of the binary data stored in the HDF5 file with the chunksizes and endian keyword arguments to Dataset.createVariable. These keyword arguments only are relevant for NETCDF4 and NETCDF4_CLASSIC files (where the underlying file format is HDF5) and are silently ignored if the file format is NETCDF3_CLASSIC, NETCDF3_64BIT_OFFSET or NETCDF3_64BIT_DATA.

If your data only has a certain number of digits of precision (say for example, it is temperature data that was measured with a precision of 0.1 degrees), you can dramatically improve zlib compression by quantizing (or truncating) the data using the least_significant_digit keyword argument to Dataset.createVariable. The least significant digit is the power of ten of the smallest decimal place in the data that is a reliable value. For example if the data has a precision of 0.1, then setting least_significant_digit=1 will cause data the data to be quantized using numpy.around(scale*data)/scale, where scale = 2**bits, and bits is determined so that a precision of 0.1 is retained (in this case bits=4). Effectively, this makes the compression 'lossy' instead of 'lossless', that is some precision in the data is sacrificed for the sake of disk space.

In our example, try replacing the line

>>> temp = rootgrp.createVariable("temp","f4",("time","level","lat","lon",))

with

>>> temp = rootgrp.createVariable("temp","f4",("time","level","lat","lon",),zlib=True)

and then

>>> temp = rootgrp.createVariable("temp","f4",("time","level","lat","lon",),zlib=True,least_significant_digit=3)

and see how much smaller the resulting files are.

Beyond homogeneous arrays of a fixed type - compound data types

Compound data types map directly to numpy structured (a.k.a 'record') arrays. Structured arrays are akin to C structs, or derived types in Fortran. They allow for the construction of table-like structures composed of combinations of other data types, including other compound types. Compound types might be useful for representing multiple parameter values at each point on a grid, or at each time and space location for scattered (point) data. You can then access all the information for a point by reading one variable, instead of reading different parameters from different variables. Compound data types are created from the corresponding numpy data type using the Dataset.createCompoundType method of a Dataset or Group instance. Since there is no native complex data type in netcdf, compound types are handy for storing numpy complex arrays. Here's an example:

>>> f = Dataset("complex.nc","w")
>>> size = 3 # length of 1-d complex array
>>> # create sample complex data.
>>> datac = np.exp(1j*(1.+np.linspace(0, np.pi, size)))
>>> # create complex128 compound data type.
>>> complex128 = np.dtype([("real",np.float64),("imag",np.float64)])
>>> complex128_t = f.createCompoundType(complex128,"complex128")
>>> # create a variable with this data type, write some data to it.
>>> x_dim = f.createDimension("x_dim",None)
>>> v = f.createVariable("cmplx_var",complex128_t,"x_dim")
>>> data = np.empty(size,complex128) # numpy structured array
>>> data["real"] = datac.real; data["imag"] = datac.imag
>>> v[:] = data # write numpy structured array to netcdf compound var
>>> # close and reopen the file, check the contents.
>>> f.close(); f = Dataset("complex.nc")
>>> v = f.variables["cmplx_var"]
>>> datain = v[:] # read in all the data into a numpy structured array
>>> # create an empty numpy complex array
>>> datac2 = np.empty(datain.shape,np.complex128)
>>> # .. fill it with contents of structured array.
>>> datac2.real = datain["real"]; datac2.imag = datain["imag"]
>>> print('{}: {}'.format(datac.dtype, datac)) # original data
complex128: [ 0.54030231+0.84147098j -0.84147098+0.54030231j -0.54030231-0.84147098j]
>>>
>>> print('{}: {}'.format(datac2.dtype, datac2)) # data from file
complex128: [ 0.54030231+0.84147098j -0.84147098+0.54030231j -0.54030231-0.84147098j]

Compound types can be nested, but you must create the 'inner' ones first. All possible numpy structured arrays cannot be represented as Compound variables - an error message will be raise if you try to create one that is not supported. All of the compound types defined for a Dataset or Group are stored in a Python dictionary, just like variables and dimensions. As always, printing objects gives useful summary information in an interactive session:

>>> print(f)
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF4 data model, file format HDF5):
    dimensions(sizes): x_dim(3)
    variables(dimensions): {'names':['real','imag'], 'formats':['<f8','<f8'], 'offsets':[0,8], 'itemsize':16, 'aligned':True} cmplx_var(x_dim)
    groups: 
>>> print(f.variables["cmplx_var"])
<class 'netCDF4._netCDF4.Variable'>
compound cmplx_var(x_dim)
compound data type: {'names':['real','imag'], 'formats':['<f8','<f8'], 'offsets':[0,8], 'itemsize':16, 'aligned':True}
unlimited dimensions: x_dim
current shape = (3,)
>>> print(f.cmptypes)
{'complex128': <class 'netCDF4._netCDF4.CompoundType'>: name = 'complex128', numpy dtype = {'names':['real','imag'], 'formats':['<f8','<f8'], 'offsets':[0,8], 'itemsize':16, 'aligned':True}}
>>> print(f.cmptypes["complex128"])
<class 'netCDF4._netCDF4.CompoundType'>: name = 'complex128', numpy dtype = {'names':['real','imag'], 'formats':['<f8','<f8'], 'offsets':[0,8], 'itemsize':16, 'aligned':True}

Variable-length (vlen) data types

NetCDF 4 has support for variable-length or "ragged" arrays. These are arrays of variable length sequences having the same type. To create a variable-length data type, use the Dataset.createVLType method method of a Dataset or Group instance.

>>> f = Dataset("tst_vlen.nc","w")
>>> vlen_t = f.createVLType(np.int32, "phony_vlen")

The numpy datatype of the variable-length sequences and the name of the new datatype must be specified. Any of the primitive datatypes can be used (signed and unsigned integers, 32 and 64 bit floats, and characters), but compound data types cannot. A new variable can then be created using this datatype.

>>> x = f.createDimension("x",3)
>>> y = f.createDimension("y",4)
>>> vlvar = f.createVariable("phony_vlen_var", vlen_t, ("y","x"))

Since there is no native vlen datatype in numpy, vlen arrays are represented in python as object arrays (arrays of dtype object). These are arrays whose elements are Python object pointers, and can contain any type of python object. For this application, they must contain 1-D numpy arrays all of the same type but of varying length. In this case, they contain 1-D numpy int32 arrays of random length between 1 and 10.

>>> import random
>>> random.seed(54321)
>>> data = np.empty(len(y)*len(x),object)
>>> for n in range(len(y)*len(x)):
...     data[n] = np.arange(random.randint(1,10),dtype="int32")+1
>>> data = np.reshape(data,(len(y),len(x)))
>>> vlvar[:] = data
>>> print("vlen variable =\n{}".format(vlvar[:]))
vlen variable =
[[array([1, 2, 3, 4, 5, 6, 7, 8], dtype=int32) array([1, 2], dtype=int32)
  array([1, 2, 3, 4], dtype=int32)]
 [array([1, 2, 3], dtype=int32)
  array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)
  array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)]
 [array([1, 2, 3, 4, 5, 6, 7], dtype=int32) array([1, 2, 3], dtype=int32)
  array([1, 2, 3, 4, 5, 6], dtype=int32)]
 [array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)
  array([1, 2, 3, 4, 5], dtype=int32) array([1, 2], dtype=int32)]]
>>> print(f)
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF4 data model, file format HDF5):
    dimensions(sizes): x(3), y(4)
    variables(dimensions): int32 phony_vlen_var(y,x)
    groups: 
>>> print(f.variables["phony_vlen_var"])
<class 'netCDF4._netCDF4.Variable'>
vlen phony_vlen_var(y, x)
vlen data type: int32
unlimited dimensions: 
current shape = (4, 3)
>>> print(f.vltypes["phony_vlen"])
<class 'netCDF4._netCDF4.VLType'>: name = 'phony_vlen', numpy dtype = int32

Numpy object arrays containing python strings can also be written as vlen variables, For vlen strings, you don't need to create a vlen data type. Instead, simply use the python str builtin (or a numpy string datatype with fixed length greater than 1) when calling the Dataset.createVariable method.

>>> z = f.createDimension("z",10)
>>> strvar = f.createVariable("strvar", str, "z")

In this example, an object array is filled with random python strings with random lengths between 2 and 12 characters, and the data in the object array is assigned to the vlen string variable.

>>> chars = "1234567890aabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
>>> data = np.empty(10,"O")
>>> for n in range(10):
...     stringlen = random.randint(2,12)
...     data[n] = "".join([random.choice(chars) for i in range(stringlen)])
>>> strvar[:] = data
>>> print("variable-length string variable:\n{}".format(strvar[:]))
variable-length string variable:
['Lh' '25F8wBbMI' '53rmM' 'vvjnb3t63ao' 'qjRBQk6w' 'aJh' 'QF'
 'jtIJbJACaQk4' '3Z5' 'bftIIq']
>>> print(f)
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF4 data model, file format HDF5):
    dimensions(sizes): x(3), y(4), z(10)
    variables(dimensions): int32 phony_vlen_var(y,x), <class 'str'> strvar(z)
    groups: 
>>> print(f.variables["strvar"])
<class 'netCDF4._netCDF4.Variable'>
vlen strvar(z)
vlen data type: <class 'str'>
unlimited dimensions: 
current shape = (10,)

It is also possible to set contents of vlen string variables with numpy arrays of any string or unicode data type. Note, however, that accessing the contents of such variables will always return numpy arrays with dtype object.

Enum data type

netCDF4 has an enumerated data type, which is an integer datatype that is restricted to certain named values. Since Enums don't map directly to a numpy data type, they are read and written as integer arrays.

Here's an example of using an Enum type to hold cloud type data. The base integer data type and a python dictionary describing the allowed values and their names are used to define an Enum data type using Dataset.createEnumType.

>>> nc = Dataset('clouds.nc','w')
>>> # python dict with allowed values and their names.
>>> enum_dict = {'Altocumulus': 7, 'Missing': 255,
... 'Stratus': 2, 'Clear': 0,
... 'Nimbostratus': 6, 'Cumulus': 4, 'Altostratus': 5,
... 'Cumulonimbus': 1, 'Stratocumulus': 3}
>>> # create the Enum type called 'cloud_t'.
>>> cloud_type = nc.createEnumType(np.uint8,'cloud_t',enum_dict)
>>> print(cloud_type)
<class 'netCDF4._netCDF4.EnumType'>: name = 'cloud_t', numpy dtype = uint8, fields/values ={'Altocumulus': 7, 'Missing': 255, 'Stratus': 2, 'Clear': 0, 'Nimbostratus': 6, 'Cumulus': 4, 'Altostratus': 5, 'Cumulonimbus': 1, 'Stratocumulus': 3}

A new variable can be created in the usual way using this data type. Integer data is written to the variable that represents the named cloud types in enum_dict. A ValueError will be raised if an attempt is made to write an integer value not associated with one of the specified names.

>>> time = nc.createDimension('time',None)
>>> # create a 1d variable of type 'cloud_type'.
>>> # The fill_value is set to the 'Missing' named value.
>>> cloud_var = nc.createVariable('primary_cloud',cloud_type,'time',
...                               fill_value=enum_dict['Missing'])
>>> # write some data to the variable.
>>> cloud_var[:] = [enum_dict[k] for k in ['Clear', 'Stratus', 'Cumulus',
...                                        'Missing', 'Cumulonimbus']]
>>> nc.close()
>>> # reopen the file, read the data.
>>> nc = Dataset('clouds.nc')
>>> cloud_var = nc.variables['primary_cloud']
>>> print(cloud_var)
<class 'netCDF4._netCDF4.Variable'>
enum primary_cloud(time)
    _FillValue: 255
enum data type: uint8
unlimited dimensions: time
current shape = (5,)
>>> print(cloud_var.datatype.enum_dict)
{'Altocumulus': 7, 'Missing': 255, 'Stratus': 2, 'Clear': 0, 'Nimbostratus': 6, 'Cumulus': 4, 'Altostratus': 5, 'Cumulonimbus': 1, 'Stratocumulus': 3}
>>> print(cloud_var[:])
[0 2 4 -- 1]
>>> nc.close()

Parallel IO

If MPI parallel enabled versions of netcdf and hdf5 or pnetcdf are detected, and mpi4py is installed, netcdf4-python will be built with parallel IO capabilities enabled. Parallel IO of NETCDF4 or NETCDF4_CLASSIC formatted files is only available if the MPI parallel HDF5 library is available. Parallel IO of classic netcdf-3 file formats is only available if the PnetCDF library is available. To use parallel IO, your program must be running in an MPI environment using mpi4py.

>>> from mpi4py import MPI
>>> import numpy as np
>>> from netCDF4 import Dataset
>>> rank = MPI.COMM_WORLD.rank  # The process ID (integer 0-3 for 4-process run)

To run an MPI-based parallel program like this, you must use mpiexec to launch several parallel instances of Python (for example, using mpiexec -np 4 python mpi_example.py). The parallel features of netcdf4-python are mostly transparent - when a new dataset is created or an existing dataset is opened, use the parallel keyword to enable parallel access.

>>> nc = Dataset('parallel_test.nc','w',parallel=True)

The optional comm keyword may be used to specify a particular MPI communicator (MPI_COMM_WORLD is used by default). Each process (or rank) can now write to the file indepedently. In this example the process rank is written to a different variable index on each task

>>> d = nc.createDimension('dim',4)
>>> v = nc.createVariable('var', np.int64, 'dim')
>>> v[rank] = rank
>>> nc.close()

% ncdump parallel_test.nc
netcdf parallel_test {
dimensions:
    dim = 4 ;
variables:
    int64 var(dim) ;
data:

    var = 0, 1, 2, 3 ;
}

There are two types of parallel IO, independent (the default) and collective. Independent IO means that each process can do IO independently. It should not depend on or be affected by other processes. Collective IO is a way of doing IO defined in the MPI-IO standard; unlike independent IO, all processes must participate in doing IO. To toggle back and forth between the two types of IO, use the Variable.set_collective Variable method. All metadata operations (such as creation of groups, types, variables, dimensions, or attributes) are collective. There are a couple of important limitations of parallel IO:

  • parallel IO for NETCDF4 or NETCDF4_CLASSIC formatted files is only available if the netcdf library was compiled with MPI enabled HDF5.
  • parallel IO for all classic netcdf-3 file formats is only available if the netcdf library was compiled with PnetCDF.
  • If a variable has an unlimited dimension, appending data must be done in collective mode. If the write is done in independent mode, the operation will fail with a a generic "HDF Error".
  • You can write compressed data in parallel only with netcdf-c >= 4.7.4 and hdf5 >= 1.10.3 (although you can read in parallel with earlier versions). To write compressed data in parallel, the variable must be in 'collective IO mode'. This is done automatically on variable creation if compression is turned on, but if you are appending to a variable in an existing file, you must use Variable.set_collective(True) before attempting to write to it.
  • You cannot use variable-length (VLEN) data types.

Dealing with strings

The most flexible way to store arrays of strings is with the Variable-length (vlen) string data type. However, this requires the use of the NETCDF4 data model, and the vlen type does not map very well numpy arrays (you have to use numpy arrays of dtype=object, which are arrays of arbitrary python objects). numpy does have a fixed-width string array data type, but unfortunately the netCDF data model does not. Instead fixed-width byte strings are typically stored as arrays of 8-bit characters. To perform the conversion to and from character arrays to fixed-width numpy string arrays, the following convention is followed by the python interface. If the _Encoding special attribute is set for a character array (dtype S1) variable, the chartostring utility function is used to convert the array of characters to an array of strings with one less dimension (the last dimension is interpreted as the length of each string) when reading the data. The character set (usually ascii) is specified by the _Encoding attribute. If _Encoding is 'none' or 'bytes', then the character array is converted to a numpy fixed-width byte string array (dtype S#), otherwise a numpy unicode (dtype U#) array is created. When writing the data, stringtochar is used to convert the numpy string array to an array of characters with one more dimension. For example,

>>> from netCDF4 import stringtochar
>>> nc = Dataset('stringtest.nc','w',format='NETCDF4_CLASSIC')
>>> _ = nc.createDimension('nchars',3)
>>> _ = nc.createDimension('nstrings',None)
>>> v = nc.createVariable('strings','S1',('nstrings','nchars'))
>>> datain = np.array(['foo','bar'],dtype='S3')
>>> v[:] = stringtochar(datain) # manual conversion to char array
>>> print(v[:]) # data returned as char array
[[b'f' b'o' b'o']
 [b'b' b'a' b'r']]
>>> v._Encoding = 'ascii' # this enables automatic conversion
>>> v[:] = datain # conversion to char array done internally
>>> print(v[:])  # data returned in numpy string array
['foo' 'bar']
>>> nc.close()

Even if the _Encoding attribute is set, the automatic conversion of char arrays to/from string arrays can be disabled with Variable.set_auto_chartostring.

A similar situation is often encountered with numpy structured arrays with subdtypes containing fixed-wdith byte strings (dtype=S#). Since there is no native fixed-length string netCDF datatype, these numpy structure arrays are mapped onto netCDF compound types with character array elements. In this case the string <-> char array conversion is handled automatically (without the need to set the _Encoding attribute) using numpy views. The structured array dtype (including the string elements) can even be used to define the compound data type - the string dtype will be converted to character array dtype under the hood when creating the netcdf compound type. Here's an example:

>>> nc = Dataset('compoundstring_example.nc','w')
>>> dtype = np.dtype([('observation', 'f4'),
...                      ('station_name','S10')])
>>> station_data_t = nc.createCompoundType(dtype,'station_data')
>>> _ = nc.createDimension('station',None)
>>> statdat = nc.createVariable('station_obs', station_data_t, ('station',))
>>> data = np.empty(2,dtype)
>>> data['observation'][:] = (123.,3.14)
>>> data['station_name'][:] = ('Boulder','New York')
>>> print(statdat.dtype) # strings actually stored as character arrays
{'names':['observation','station_name'], 'formats':['<f4',('S1', (10,))], 'offsets':[0,4], 'itemsize':16, 'aligned':True}
>>> statdat[:] = data # strings converted to character arrays internally
>>> print(statdat[:])  # character arrays converted back to strings
[(123.  , b'Boulder') (  3.14, b'New York')]
>>> print(statdat[:].dtype)
{'names':['observation','station_name'], 'formats':['<f4','S10'], 'offsets':[0,4], 'itemsize':16, 'aligned':True}
>>> statdat.set_auto_chartostring(False) # turn off auto-conversion
>>> statdat[:] = data.view(dtype=[('observation', 'f4'),('station_name','S1',10)])
>>> print(statdat[:])  # now structured array with char array subtype is returned
[(123.  , [b'B', b'o', b'u', b'l', b'd', b'e', b'r', b'', b'', b''])
 (  3.14, [b'N', b'e', b'w', b' ', b'Y', b'o', b'r', b'k', b'', b''])]
>>> nc.close()

Note that there is currently no support for mapping numpy structured arrays with unicode elements (dtype U#) onto netCDF compound types, nor is there support for netCDF compound types with vlen string components.

In-memory (diskless) Datasets

You can create netCDF Datasets whose content is held in memory instead of in a disk file. There are two ways to do this. If you don't need access to the memory buffer containing the Dataset from within python, the best way is to use the diskless=True keyword argument when creating the Dataset. If you want to save the Dataset to disk when you close it, also set persist=True. If you want to create a new read-only Dataset from an existing python memory buffer, use the memory keyword argument to pass the memory buffer when creating the Dataset. If you want to create a new in-memory Dataset, and then access the memory buffer directly from Python, use the memory keyword argument to specify the estimated size of the Dataset in bytes when creating the Dataset with mode='w'. Then, the Dataset.close method will return a python memoryview object representing the Dataset. Below are examples illustrating both approaches.

>>> # create a diskless (in-memory) Dataset,
>>> # and persist the file to disk when it is closed.
>>> nc = Dataset('diskless_example.nc','w',diskless=True,persist=True)
>>> d = nc.createDimension('x',None)
>>> v = nc.createVariable('v',np.int32,'x')
>>> v[0:5] = np.arange(5)
>>> print(nc)
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF4 data model, file format HDF5):
    dimensions(sizes): x(5)
    variables(dimensions): int32 v(x)
    groups: 
>>> print(nc['v'][:])
[0 1 2 3 4]
>>> nc.close() # file saved to disk
>>> # create an in-memory dataset from an existing python
>>> # python memory buffer.
>>> # read the newly created netcdf file into a python
>>> # bytes object.
>>> with open('diskless_example.nc', 'rb') as f:
...     nc_bytes = f.read()
>>> # create a netCDF in-memory dataset from the bytes object.
>>> nc = Dataset('inmemory.nc', memory=nc_bytes)
>>> print(nc)
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF4 data model, file format HDF5):
    dimensions(sizes): x(5)
    variables(dimensions): int32 v(x)
    groups: 
>>> print(nc['v'][:])
[0 1 2 3 4]
>>> nc.close()
>>> # create an in-memory Dataset and retrieve memory buffer
>>> # estimated size is 1028 bytes - this is actually only
>>> # used if format is NETCDF3
>>> # (ignored for NETCDF4/HDF5 files).
>>> nc = Dataset('inmemory.nc', mode='w',memory=1028)
>>> d = nc.createDimension('x',None)
>>> v = nc.createVariable('v',np.int32,'x')
>>> v[0:5] = np.arange(5)
>>> nc_buf = nc.close() # close returns memoryview
>>> print(type(nc_buf))
<class 'memoryview'>
>>> # save nc_buf to disk, read it back in and check.
>>> with open('inmemory.nc', 'wb') as f:
...     f.write(nc_buf)
>>> nc = Dataset('inmemory.nc')
>>> print(nc)
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF4 data model, file format HDF5):
    dimensions(sizes): x(5)
    variables(dimensions): int32 v(x)
    groups:
>>> print(nc['v'][:])
[0 1 2 3 4]
>>> nc.close()

All of the code in this tutorial is available in examples/tutorial.py, except the parallel IO example, which is in examples/mpi_example.py. Unit tests are in the test directory.

contact: Jeffrey Whitaker jeffrey.s.whitaker@noaa.gov

copyright: 2008 by Jeffrey Whitaker.

license: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View Source
# init for netCDF4. package
# Docstring comes from extension module _netCDF4.
from ._netCDF4 import *
# Need explicit imports for names beginning with underscores
from ._netCDF4 import __doc__
from ._netCDF4 import (__version__, __netcdf4libversion__, __hdf5libversion__,
                       __has_rename_grp__, __has_nc_inq_path__,
                       __has_nc_inq_format_extended__, __has_nc_open_mem__,
                       __has_nc_create_mem__, __has_cdf5_format__,
                       __has_parallel4_support__, __has_pnetcdf_support__)
__all__ =\
['Dataset','Variable','Dimension','Group','MFDataset','MFTime','CompoundType','VLType','date2num','num2date','date2index','stringtochar','chartostring','stringtoarr','getlibversion','EnumType','get_chunk_cache','set_chunk_cache']
#   class Dataset:

A netCDF Dataset is a collection of dimensions, groups, variables and attributes. Together they describe the meaning of data and relations among data fields stored in a netCDF file. See Dataset.__init__ for more details.

A list of attribute names corresponding to global netCDF attributes defined for the Dataset can be obtained with the Dataset.ncattrs method. These attributes can be created by assigning to an attribute of the Dataset instance. A dictionary containing all the netCDF attribute name/value pairs is provided by the __dict__ attribute of a Dataset instance.

The following class variables are read-only and should not be modified by the user.

dimensions: The dimensions dictionary maps the names of dimensions defined for the Group or Dataset to instances of the Dimension class.

variables: The variables dictionary maps the names of variables defined for this Dataset or Group to instances of the Variable class.

groups: The groups dictionary maps the names of groups created for this Dataset or Group to instances of the Group class (the Dataset class is simply a special case of the Group class which describes the root group in the netCDF4 file).

cmptypes: The cmptypes dictionary maps the names of compound types defined for the Group or Dataset to instances of the CompoundType class.

vltypes: The vltypes dictionary maps the names of variable-length types defined for the Group or Dataset to instances of the VLType class.

enumtypes: The enumtypes dictionary maps the names of Enum types defined for the Group or Dataset to instances of the EnumType class.

data_model: data_model describes the netCDF data model version, one of NETCDF3_CLASSIC, NETCDF4, NETCDF4_CLASSIC, NETCDF3_64BIT_OFFSET or NETCDF3_64BIT_DATA.

file_format: same as data_model, retained for backwards compatibility.

disk_format: disk_format describes the underlying file format, one of NETCDF3, HDF5, HDF4, PNETCDF, DAP2, DAP4 or UNDEFINED. Only available if using netcdf C library version >= 4.3.1, otherwise will always return UNDEFINED.

parent: parent is a reference to the parent Group instance. None for the root group or Dataset instance.

path: path shows the location of the Group in the Dataset in a unix directory format (the names of groups in the hierarchy separated by backslashes). A Dataset instance is the root group, so the path is simply '/'.

keepweakref: If True, child Dimension and Variables objects only keep weak references to the parent Dataset or Group.

_ncstring_attrs__: If True, all text attributes will be written as variable-length strings.

#   Dataset()

__init__(self, filename, mode="r", clobber=True, diskless=False, persist=False, keepweakref=False, memory=None, encoding=None, parallel=False, comm=None, info=None, format='NETCDF4')

Dataset constructor.

filename: Name of netCDF file to hold dataset. Can also be a python 3 pathlib instance or the URL of an OpenDAP dataset. When memory is set this is just used to set the filepath().

mode: access mode. r means read-only; no data can be modified. w means write; a new file is created, an existing file with the same name is deleted. a and r+ mean append (in analogy with serial files); an existing file is opened for reading and writing. Appending s to modes r, w, r+ or a will enable unbuffered shared access to NETCDF3_CLASSIC, NETCDF3_64BIT_OFFSET or NETCDF3_64BIT_DATA formatted files. Unbuffered access may be useful even if you don't need shared access, since it may be faster for programs that don't access data sequentially. This option is ignored for NETCDF4 and NETCDF4_CLASSIC formatted files.

clobber: if True (default), opening a file with mode='w' will clobber an existing file with the same name. if False, an exception will be raised if a file with the same name already exists.

format: underlying file format (one of 'NETCDF4', 'NETCDF4_CLASSIC', 'NETCDF3_CLASSIC', 'NETCDF3_64BIT_OFFSET' or 'NETCDF3_64BIT_DATA'. Only relevant if mode = 'w' (if mode = 'r','a' or 'r+' the file format is automatically detected). Default 'NETCDF4', which means the data is stored in an HDF5 file, using netCDF 4 API features. Setting format='NETCDF4_CLASSIC' will create an HDF5 file, using only netCDF 3 compatible API features. netCDF 3 clients must be recompiled and linked against the netCDF 4 library to read files in NETCDF4_CLASSIC format. 'NETCDF3_CLASSIC' is the classic netCDF 3 file format that does not handle 2+ Gb files. 'NETCDF3_64BIT_OFFSET' is the 64-bit offset version of the netCDF 3 file format, which fully supports 2+ GB files, but is only compatible with clients linked against netCDF version 3.6.0 or later. 'NETCDF3_64BIT_DATA' is the 64-bit data version of the netCDF 3 file format, which supports 64-bit dimension sizes plus unsigned and 64 bit integer data types, but is only compatible with clients linked against netCDF version 4.4.0 or later.

diskless: If True, create diskless (in-core) file. This is a feature added to the C library after the netcdf-4.2 release. If you need to access the memory buffer directly, use the in-memory feature instead (see memory kwarg).

persist: if diskless=True, persist file to disk when closed (default False).

keepweakref: if True, child Dimension and Variable instances will keep weak references to the parent Dataset or Group object. Default is False, which means strong references will be kept. Having Dimension and Variable instances keep a strong reference to the parent Dataset instance, which in turn keeps a reference to child Dimension and Variable instances, creates circular references. Circular references complicate garbage collection, which may mean increased memory usage for programs that create may Dataset instances with lots of Variables. It also will result in the Dataset object never being deleted, which means it may keep open files alive as well. Setting keepweakref=True allows Dataset instances to be garbage collected as soon as they go out of scope, potentially reducing memory usage and open file handles. However, in many cases this is not desirable, since the associated Variable instances may still be needed, but are rendered unusable when the parent Dataset instance is garbage collected.

memory: if not None, create or open an in-memory Dataset. If mode = 'r', the memory kwarg must contain a memory buffer object (an object that supports the python buffer interface). The Dataset will then be created with contents taken from this block of memory. If mode = 'w', the memory kwarg should contain the anticipated size of the Dataset in bytes (used only for NETCDF3 files). A memory buffer containing a copy of the Dataset is returned by the Dataset.close method. Requires netcdf-c version 4.4.1 for mode='r, netcdf-c 4.6.2 for mode='w'. To persist the file to disk, the raw bytes from the returned buffer can be written into a binary file. The Dataset can also be re-opened using this memory buffer.

encoding: encoding used to encode filename string into bytes. Default is None (sys.getdefaultfileencoding() is used).

parallel: open for parallel access using MPI (requires mpi4py and parallel-enabled netcdf-c and hdf5 libraries). Default is False. If True, comm and info kwargs may also be specified.

comm: MPI_Comm object for parallel access. Default None, which means MPI_COMM_WORLD will be used. Ignored if parallel=False.

info: MPI_Info object for parallel access. Default None, which means MPI_INFO_NULL will be used. Ignored if parallel=False.

#   def filepath(unknown):

filepath(self,encoding=None)

Get the file system path (or the opendap URL) which was used to open/create the Dataset. Requires netcdf >= 4.1.2. The path is decoded into a string using sys.getfilesystemencoding() by default, this can be changed using the encoding kwarg.

#   def close(unknown):

close(self)

Close the Dataset.

#   def isopen(unknown):

close(self)

is the Dataset open or closed?

#   def sync(unknown):

sync(self)

Writes all buffered data in the Dataset to the disk file.

#   def set_fill_on(unknown):

set_fill_on(self)

Sets the fill mode for a Dataset open for writing to on.

This causes data to be pre-filled with fill values. The fill values can be controlled by the variable's _Fill_Value attribute, but is usually sufficient to the use the netCDF default _Fill_Value (defined separately for each variable type). The default behavior of the netCDF library corresponds to set_fill_on. Data which are equal to the _Fill_Value indicate that the variable was created, but never written to.

#   def set_fill_off(unknown):

set_fill_off(self)

Sets the fill mode for a Dataset open for writing to off.

This will prevent the data from being pre-filled with fill values, which may result in some performance improvements. However, you must then make sure the data is actually written before being read.

#   def createDimension(unknown):

createDimension(self, dimname, size=None)

Creates a new dimension with the given dimname and size.

size must be a positive integer or None, which stands for "unlimited" (default is None). Specifying a size of 0 also results in an unlimited dimension. The return value is the Dimension class instance describing the new dimension. To determine the current maximum size of the dimension, use the len function on the Dimension instance. To determine if a dimension is 'unlimited', use the Dimension.isunlimited method of the Dimension instance.

#   def renameDimension(unknown):

renameDimension(self, oldname, newname)

rename a Dimension named oldname to newname.

#   def createCompoundType(unknown):

createCompoundType(self, datatype, datatype_name)

Creates a new compound data type named datatype_name from the numpy dtype object datatype.

Note: If the new compound data type contains other compound data types (i.e. it is a 'nested' compound type, where not all of the elements are homogeneous numeric data types), then the 'inner' compound types must be created first.

The return value is the CompoundType class instance describing the new datatype.

#   def createVLType(unknown):

createVLType(self, datatype, datatype_name)

Creates a new VLEN data type named datatype_name from a numpy dtype object datatype.

The return value is the VLType class instance describing the new datatype.

#   def createEnumType(unknown):

createEnumType(self, datatype, datatype_name, enum_dict)

Creates a new Enum data type named datatype_name from a numpy integer dtype object datatype, and a python dictionary defining the enum fields and values.

The return value is the EnumType class instance describing the new datatype.

#   def createVariable(unknown):

createVariable(self, varname, datatype, dimensions=(), zlib=False, complevel=4, shuffle=True, fletcher32=False, contiguous=False, chunksizes=None, endian='native', least_significant_digit=None, fill_value=None, chunk_cache=None)

Creates a new variable with the given varname, datatype, and dimensions. If dimensions are not given, the variable is assumed to be a scalar.

If varname is specified as a path, using forward slashes as in unix to separate components, then intermediate groups will be created as necessary For example, createVariable('/GroupA/GroupB/VarC', float, ('x','y')) will create groups GroupA and GroupA/GroupB, plus the variable GroupA/GroupB/VarC, if the preceding groups don't already exist.

The datatype can be a numpy datatype object, or a string that describes a numpy dtype object (like the dtype.str attribute of a numpy array). Supported specifiers include: 'S1' or 'c' (NC_CHAR), 'i1' or 'b' or 'B' (NC_BYTE), 'u1' (NC_UBYTE), 'i2' or 'h' or 's' (NC_SHORT), 'u2' (NC_USHORT), 'i4' or 'i' or 'l' (NC_INT), 'u4' (NC_UINT), 'i8' (NC_INT64), 'u8' (NC_UINT64), 'f4' or 'f' (NC_FLOAT), 'f8' or 'd' (NC_DOUBLE). datatype can also be a CompoundType instance (for a structured, or compound array), a VLType instance (for a variable-length array), or the python str builtin (for a variable-length string array). Numpy string and unicode datatypes with length greater than one are aliases for str.

Data from netCDF variables is presented to python as numpy arrays with the corresponding data type.

dimensions must be a tuple containing dimension names (strings) that have been defined previously using Dataset.createDimension. The default value is an empty tuple, which means the variable is a scalar.

If the optional keyword zlib is True, the data will be compressed in the netCDF file using gzip compression (default False).

The optional keyword complevel is an integer between 1 and 9 describing the level of compression desired (default 4). Ignored if zlib=False.

If the optional keyword shuffle is True, the HDF5 shuffle filter will be applied before compressing the data (default True). This significantly improves compression. Default is True. Ignored if zlib=False.

If the optional keyword fletcher32 is True, the Fletcher32 HDF5 checksum algorithm is activated to detect errors. Default False.

If the optional keyword contiguous is True, the variable data is stored contiguously on disk. Default False. Setting to True for a variable with an unlimited dimension will trigger an error.

The optional keyword chunksizes can be used to manually specify the HDF5 chunksizes for each dimension of the variable. A detailed discussion of HDF chunking and I/O performance is available here. Basically, you want the chunk size for each dimension to match as closely as possible the size of the data block that users will read from the file. chunksizes cannot be set if contiguous=True.

The optional keyword endian can be used to control whether the data is stored in little or big endian format on disk. Possible values are little, big or native (default). The library will automatically handle endian conversions when the data is read, but if the data is always going to be read on a computer with the opposite format as the one used to create the file, there may be some performance advantage to be gained by setting the endian-ness.

The zlib, complevel, shuffle, fletcher32, contiguous, chunksizes and endian keywords are silently ignored for netCDF 3 files that do not use HDF5.

The optional keyword fill_value can be used to override the default netCDF _FillValue (the value that the variable gets filled with before any data is written to it, defaults given in the dict netCDF4.default_fillvals). If fill_value is set to False, then the variable is not pre-filled.

If the optional keyword parameter least_significant_digit is specified, variable data will be truncated (quantized). In conjunction with zlib=True this produces 'lossy', but significantly more efficient compression. For example, if least_significant_digit=1, data will be quantized using numpy.around(scale*data)/scale, where scale = 2**bits, and bits is determined so that a precision of 0.1 is retained (in this case bits=4). From the PSL metadata conventions: "least_significant_digit -- power of ten of the smallest decimal place in unpacked data that is a reliable value." Default is None, or no quantization, or 'lossless' compression.

When creating variables in a NETCDF4 or NETCDF4_CLASSIC formatted file, HDF5 creates something called a 'chunk cache' for each variable. The default size of the chunk cache may be large enough to completely fill available memory when creating thousands of variables. The optional keyword chunk_cache allows you to reduce (or increase) the size of the default chunk cache when creating a variable. The setting only persists as long as the Dataset is open - you can use the set_var_chunk_cache method to change it the next time the Dataset is opened. Warning - messing with this parameter can seriously degrade performance.

The return value is the Variable class instance describing the new variable.

A list of names corresponding to netCDF variable attributes can be obtained with the Variable method Variable.ncattrs. A dictionary containing all the netCDF attribute name/value pairs is provided by the __dict__ attribute of a Variable instance.

Variable instances behave much like array objects. Data can be assigned to or retrieved from a variable with indexing and slicing operations on the Variable instance. A Variable instance has six Dataset standard attributes: dimensions, dtype, shape, ndim, name and least_significant_digit. Application programs should never modify these attributes. The dimensions attribute is a tuple containing the names of the dimensions associated with this variable. The dtype attribute is a string describing the variable's data type (i4, f8, S1, etc). The shape attribute is a tuple describing the current sizes of all the variable's dimensions. The name attribute is a string containing the name of the Variable instance. The least_significant_digit attributes describes the power of ten of the smallest decimal place in the data the contains a reliable value. assigned to the Variable instance. If None, the data is not truncated. The ndim attribute is the number of variable dimensions.

#   def renameVariable(unknown):

renameVariable(self, oldname, newname)

rename a Variable named oldname to newname

#   def createGroup(unknown):

createGroup(self, groupname)

Creates a new Group with the given groupname.

If groupname is specified as a path, using forward slashes as in unix to separate components, then intermediate groups will be created as necessary (analogous to mkdir -p in unix). For example, createGroup('/GroupA/GroupB/GroupC') will create GroupA, GroupA/GroupB, and GroupA/GroupB/GroupC, if they don't already exist. If the specified path describes a group that already exists, no error is raised.

The return value is a Group class instance.

#   def ncattrs(unknown):

ncattrs(self)

return netCDF global attribute names for this Dataset or Group in a list.

#   def setncattr(unknown):

setncattr(self,name,value)

set a netCDF dataset or group attribute using name,value pair. Use if you need to set a netCDF attribute with the with the same name as one of the reserved python attributes.

#   def setncattr_string(unknown):

setncattr_string(self,name,value)

set a netCDF dataset or group string attribute using name,value pair. Use if you need to ensure that a netCDF attribute is created with type NC_STRING if the file format is NETCDF4.

#   def setncatts(unknown):

setncatts(self,attdict)

set a bunch of netCDF dataset or group attributes at once using a python dictionary. This may be faster when setting a lot of attributes for a NETCDF3 formatted file, since nc_redef/nc_enddef is not called in between setting each attribute

#   def getncattr(unknown):

getncattr(self,name)

retrieve a netCDF dataset or group attribute. Use if you need to get a netCDF attribute with the same name as one of the reserved python attributes.

option kwarg encoding can be used to specify the character encoding of a string attribute (default is utf-8).

#   def delncattr(unknown):

delncattr(self,name,value)

delete a netCDF dataset or group attribute. Use if you need to delete a netCDF attribute with the same name as one of the reserved python attributes.

#   def renameAttribute(unknown):

renameAttribute(self, oldname, newname)

rename a Dataset or Group attribute named oldname to newname.

#   def renameGroup(unknown):

renameGroup(self, oldname, newname)

rename a Group named oldname to newname (requires netcdf >= 4.3.1).

#   def set_auto_chartostring(unknown):

set_auto_chartostring(self, True_or_False)

Call Variable.set_auto_chartostring for all variables contained in this Dataset or Group, as well as for all variables in all its subgroups.

True_or_False: Boolean determining if automatic conversion of all character arrays <--> string arrays should be performed for character variables (variables of type NC_CHAR or S1) with the _Encoding attribute set.

Note: Calling this function only affects existing variables. Variables created after calling this function will follow the default behaviour.

#   def set_auto_maskandscale(unknown):

set_auto_maskandscale(self, True_or_False)

Call Variable.set_auto_maskandscale for all variables contained in this Dataset or Group, as well as for all variables in all its subgroups.

True_or_False: Boolean determining if automatic conversion to masked arrays and variable scaling shall be applied for all variables.

Note: Calling this function only affects existing variables. Variables created after calling this function will follow the default behaviour.

#   def set_auto_mask(unknown):

set_auto_mask(self, True_or_False)

Call Variable.set_auto_mask for all variables contained in this Dataset or Group, as well as for all variables in all its subgroups. Only affects Variables with primitive or enum types (not compound or vlen Variables).

True_or_False: Boolean determining if automatic conversion to masked arrays shall be applied for all variables.

Note: Calling this function only affects existing variables. Variables created after calling this function will follow the default behaviour.

#   def set_auto_scale(unknown):

set_auto_scale(self, True_or_False)

Call Variable.set_auto_scale for all variables contained in this Dataset or Group, as well as for all variables in all its subgroups.

True_or_False: Boolean determining if automatic variable scaling shall be applied for all variables.

Note: Calling this function only affects existing variables. Variables created after calling this function will follow the default behaviour.

#   def set_always_mask(unknown):

set_always_mask(self, True_or_False)

Call Variable.set_always_mask for all variables contained in this Dataset or Group, as well as for all variables in all its subgroups.

True_or_False: Boolean determining if automatic conversion of masked arrays with no missing values to regular numpy arrays shall be applied for all variables. Default True. Set to False to restore the default behaviour in versions prior to 1.4.1 (numpy array returned unless missing values are present, otherwise masked array returned).

Note: Calling this function only affects existing variables. Variables created after calling this function will follow the default behaviour.

#   def set_ncstring_attrs(unknown):

set_ncstring_attrs(self, True_or_False)

Call Variable.set_ncstring_attrs for all variables contained in this Dataset or Group, as well as for all its subgroups and their variables.

True_or_False: Boolean determining if all string attributes are created as variable-length NC_STRINGs, (if True), or if ascii text attributes are stored as NC_CHARs (if False; default)

Note: Calling this function only affects newly created attributes of existing (sub-) groups and their variables.

#   def get_variables_by_attributes(unknown):

get_variables_by_attribute(self, **kwargs)

Returns a list of variables that match specific conditions.

Can pass in key=value parameters and variables are returned that contain all of the matches. For example,

>>> # Get variables with x-axis attribute.
>>> vs = nc.get_variables_by_attributes(axis='X')
>>> # Get variables with matching "standard_name" attribute
>>> vs = nc.get_variables_by_attributes(standard_name='northward_sea_water_velocity')

Can pass in key=callable parameter and variables are returned if the callable returns True. The callable should accept a single parameter, the attribute value. None is given as the attribute value when the attribute does not exist on the variable. For example,

>>> # Get Axis variables
>>> vs = nc.get_variables_by_attributes(axis=lambda v: v in ['X', 'Y', 'Z', 'T'])
>>> # Get variables that don't have an "axis" attribute
>>> vs = nc.get_variables_by_attributes(axis=lambda v: v is None)
>>> # Get variables that have a "grid_mapping" attribute
>>> vs = nc.get_variables_by_attributes(grid_mapping=lambda v: v is not None)
#   def fromcdl(unknown):

fromcdl(cdlfilename, ncfilename=None, mode='a',format='NETCDF4')

call ncgen via subprocess to create Dataset from CDL text representation. Requires ncgen to be installed and in $PATH.

cdlfilename: CDL file.

ncfilename: netCDF file to create. If not given, CDL filename with suffix replaced by .nc is used..

mode: Access mode to open Dataset (Default 'a').

format: underlying file format to use (one of 'NETCDF4', 'NETCDF4_CLASSIC', 'NETCDF3_CLASSIC', 'NETCDF3_64BIT_OFFSET' or 'NETCDF3_64BIT_DATA'. Default 'NETCDF4'.

Dataset instance for ncfilename is returned.

#   def tocdl(unknown):

tocdl(self, coordvars=False, data=False, outfile=None)

call ncdump via subprocess to create CDL text representation of Dataset. Requires ncdump to be installed and in $PATH.

coordvars: include coordinate variable data (via ncdump -c). Default False

data: if True, write out variable data (Default False).

outfile: If not None, file to output ncdump to. Default is to return a string.

#   name = <attribute 'name' of 'netCDF4._netCDF4.Dataset' objects>

string name of Group instance

#   groups = <attribute 'groups' of 'netCDF4._netCDF4.Dataset' objects>
#   dimensions = <attribute 'dimensions' of 'netCDF4._netCDF4.Dataset' objects>
#   variables = <attribute 'variables' of 'netCDF4._netCDF4.Dataset' objects>
#   disk_format = <attribute 'disk_format' of 'netCDF4._netCDF4.Dataset' objects>
#   path = <attribute 'path' of 'netCDF4._netCDF4.Dataset' objects>
#   parent = <attribute 'parent' of 'netCDF4._netCDF4.Dataset' objects>
#   file_format = <attribute 'file_format' of 'netCDF4._netCDF4.Dataset' objects>
#   data_model = <attribute 'data_model' of 'netCDF4._netCDF4.Dataset' objects>
#   cmptypes = <attribute 'cmptypes' of 'netCDF4._netCDF4.Dataset' objects>
#   vltypes = <attribute 'vltypes' of 'netCDF4._netCDF4.Dataset' objects>
#   enumtypes = <attribute 'enumtypes' of 'netCDF4._netCDF4.Dataset' objects>
#   keepweakref = <attribute 'keepweakref' of 'netCDF4._netCDF4.Dataset' objects>
#   class Variable:

A netCDF Variable is used to read and write netCDF data. They are analogous to numpy array objects. See Variable.__init__ for more details.

A list of attribute names corresponding to netCDF attributes defined for the variable can be obtained with the Variable.ncattrs method. These attributes can be created by assigning to an attribute of the Variable instance. A dictionary containing all the netCDF attribute name/value pairs is provided by the __dict__ attribute of a Variable instance.

The following class variables are read-only:

dimensions: A tuple containing the names of the dimensions associated with this variable.

dtype: A numpy dtype object describing the variable's data type.

ndim: The number of variable dimensions.

shape: A tuple with the current shape (length of all dimensions).

scale: If True, scale_factor and add_offset are applied, and signed integer data is automatically converted to unsigned integer data if the _Unsigned attribute is set. Default is True, can be reset using Variable.set_auto_scale and Variable.set_auto_maskandscale methods.

mask: If True, data is automatically converted to/from masked arrays when missing values or fill values are present. Default is True, can be reset using Variable.set_auto_mask and Variable.set_auto_maskandscale methods. Only relevant for Variables with primitive or enum types (ignored for compound and vlen Variables).

chartostring: If True, data is automatically converted to/from character arrays to string arrays when the _Encoding variable attribute is set. Default is True, can be reset using Variable.set_auto_chartostring method.

least_significant_digit: Describes the power of ten of the smallest decimal place in the data the contains a reliable value. Data is truncated to this decimal place when it is assigned to the Variable instance. If None, the data is not truncated.

__orthogonal_indexing__: Always True. Indicates to client code that the object supports 'orthogonal indexing', which means that slices that are 1d arrays or lists slice along each dimension independently. This behavior is similar to Fortran or Matlab, but different than numpy.

datatype: numpy data type (for primitive data types) or VLType/CompoundType instance (for compound or vlen data types).

name: String name.

size: The number of stored elements.

#   Variable()

__init__(self, group, name, datatype, dimensions=(), zlib=False, complevel=4, shuffle=True, fletcher32=False, contiguous=False, chunksizes=None, endian='native', least_significant_digit=None,fill_value=None,chunk_cache=None)

Variable constructor.

group: Group or Dataset instance to associate with variable.

name: Name of the variable.

datatype: Variable data type. Can be specified by providing a numpy dtype object, or a string that describes a numpy dtype object. Supported values, corresponding to str attribute of numpy dtype objects, include 'f4' (32-bit floating point), 'f8' (64-bit floating point), 'i4' (32-bit signed integer), 'i2' (16-bit signed integer), 'i8' (64-bit signed integer), 'i4' (8-bit signed integer), 'i1' (8-bit signed integer), 'u1' (8-bit unsigned integer), 'u2' (16-bit unsigned integer), 'u4' (32-bit unsigned integer), 'u8' (64-bit unsigned integer), or 'S1' (single-character string). From compatibility with Scientific.IO.NetCDF, the old Numeric single character typecodes can also be used ('f' instead of 'f4', 'd' instead of 'f8', 'h' or 's' instead of 'i2', 'b' or 'B' instead of 'i1', 'c' instead of 'S1', and 'i' or 'l' instead of 'i4'). datatype can also be a CompoundType instance (for a structured, or compound array), a VLType instance (for a variable-length array), or the python str builtin (for a variable-length string array). Numpy string and unicode datatypes with length greater than one are aliases for str.

dimensions: a tuple containing the variable's dimension names (defined previously with createDimension). Default is an empty tuple which means the variable is a scalar (and therefore has no dimensions).

zlib: if True, data assigned to the Variable instance is compressed on disk. Default False.

complevel: the level of zlib compression to use (1 is the fastest, but poorest compression, 9 is the slowest but best compression). Default 4. Ignored if zlib=False.

shuffle: if True, the HDF5 shuffle filter is applied to improve compression. Default True. Ignored if zlib=False.

fletcher32: if True (default False), the Fletcher32 checksum algorithm is used for error detection.

contiguous: if True (default False), the variable data is stored contiguously on disk. Default False. Setting to True for a variable with an unlimited dimension will trigger an error.

chunksizes: Can be used to specify the HDF5 chunksizes for each dimension of the variable. A detailed discussion of HDF chunking and I/O performance is available here. Basically, you want the chunk size for each dimension to match as closely as possible the size of the data block that users will read from the file. chunksizes cannot be set if contiguous=True.

endian: Can be used to control whether the data is stored in little or big endian format on disk. Possible values are little, big or native (default). The library will automatically handle endian conversions when the data is read, but if the data is always going to be read on a computer with the opposite format as the one used to create the file, there may be some performance advantage to be gained by setting the endian-ness. For netCDF 3 files (that don't use HDF5), only endian='native' is allowed.

The zlib, complevel, shuffle, fletcher32, contiguous and chunksizes keywords are silently ignored for netCDF 3 files that do not use HDF5.

least_significant_digit: If specified, variable data will be truncated (quantized). In conjunction with zlib=True this produces 'lossy', but significantly more efficient compression. For example, if least_significant_digit=1, data will be quantized using around(scaledata)/scale, where scale = 2*bits, and bits is determined so that a precision of 0.1 is retained (in this case bits=4). Default is None, or no quantization.

fill_value: If specified, the default netCDF _FillValue (the value that the variable gets filled with before any data is written to it) is replaced with this value. If fill_value is set to False, then the variable is not pre-filled. The default netCDF fill values can be found in the dictionary netCDF4.default_fillvals.

chunk_cache: If specified, sets the chunk cache size for this variable. Persists as long as Dataset is open. Use set_var_chunk_cache to change it when Dataset is re-opened.

Note: Variable instances should be created using the Dataset.createVariable method of a Dataset or Group instance, not using this class directly.

#   def group(unknown):

group(self)

return the group that this Variable is a member of.

#   def ncattrs(unknown):

ncattrs(self)

return netCDF attribute names for this Variable in a list.

#   def setncattr(unknown):

setncattr(self,name,value)

set a netCDF variable attribute using name,value pair. Use if you need to set a netCDF attribute with the same name as one of the reserved python attributes.

#   def setncattr_string(unknown):

setncattr_string(self,name,value)

set a netCDF variable string attribute using name,value pair. Use if you need to ensure that a netCDF attribute is created with type NC_STRING if the file format is NETCDF4. Use if you need to set an attribute to an array of variable-length strings.

#   def setncatts(unknown):

setncatts(self,attdict)

set a bunch of netCDF variable attributes at once using a python dictionary. This may be faster when setting a lot of attributes for a NETCDF3 formatted file, since nc_redef/nc_enddef is not called in between setting each attribute

#   def getncattr(unknown):

getncattr(self,name)

retrieve a netCDF variable attribute. Use if you need to set a netCDF attribute with the same name as one of the reserved python attributes.

option kwarg encoding can be used to specify the character encoding of a string attribute (default is utf-8).

#   def delncattr(unknown):

delncattr(self,name,value)

delete a netCDF variable attribute. Use if you need to delete a netCDF attribute with the same name as one of the reserved python attributes.

#   def filters(unknown):

filters(self)

return dictionary containing HDF5 filter parameters.

#   def endian(unknown):

endian(self)

return endian-ness (little,big,native) of variable (as stored in HDF5 file).

#   def chunking(unknown):

chunking(self)

return variable chunking information. If the dataset is defined to be contiguous (and hence there is no chunking) the word 'contiguous' is returned. Otherwise, a sequence with the chunksize for each dimension is returned.

#   def get_var_chunk_cache(unknown):

get_var_chunk_cache(self)

return variable chunk cache information in a tuple (size,nelems,preemption). See netcdf C library documentation for nc_get_var_chunk_cache for details.

#   def set_var_chunk_cache(unknown):

set_var_chunk_cache(self,size=None,nelems=None,preemption=None)

change variable chunk cache settings. See netcdf C library documentation for nc_set_var_chunk_cache for details.

#   def renameAttribute(unknown):

renameAttribute(self, oldname, newname)

rename a Variable attribute named oldname to newname.

#   def assignValue(unknown):

assignValue(self, val)

assign a value to a scalar variable. Provided for compatibility with Scientific.IO.NetCDF, can also be done by assigning to an Ellipsis slice ([...]).

#   def getValue(unknown):

getValue(self)

get the value of a scalar variable. Provided for compatibility with Scientific.IO.NetCDF, can also be done by slicing with an Ellipsis ([...]).

#   def set_auto_chartostring(unknown):

set_auto_chartostring(self,chartostring)

turn on or off automatic conversion of character variable data to and from numpy fixed length string arrays when the _Encoding variable attribute is set.

If chartostring is set to True, when data is read from a character variable (dtype = S1) that has an _Encoding attribute, it is converted to a numpy fixed length unicode string array (dtype = UN, where N is the length of the the rightmost dimension of the variable). The value of _Encoding is the unicode encoding that is used to decode the bytes into strings.

When numpy string data is written to a variable it is converted back to indiviual bytes, with the number of bytes in each string equalling the rightmost dimension of the variable.

The default value of chartostring is True (automatic conversions are performed).

#   def use_nc_get_vars(unknown):

use_nc_get_vars(self,_use_get_vars)

enable the use of netcdf library routine nc_get_vars to retrieve strided variable slices. By default, nc_get_vars may not used by default (depending on the version of the netcdf-c library being used) since it may be slower than multiple calls to the unstrided read routine nc_get_vara.

#   def set_auto_maskandscale(unknown):

set_auto_maskandscale(self,maskandscale)

turn on or off automatic conversion of variable data to and from masked arrays, automatic packing/unpacking of variable data using scale_factor and add_offset attributes and automatic conversion of signed integer data to unsigned integer data if the _Unsigned attribute exists.

If maskandscale is set to True, when data is read from a variable it is converted to a masked array if any of the values are exactly equal to the either the netCDF _FillValue or the value specified by the missing_value variable attribute. The fill_value of the masked array is set to the missing_value attribute (if it exists), otherwise the netCDF _FillValue attribute (which has a default value for each data type). If the variable has no missing_value attribute, the _FillValue is used instead. If the variable has valid_min/valid_max and missing_value attributes, data outside the specified range will be masked. When data is written to a variable, the masked array is converted back to a regular numpy array by replacing all the masked values by the missing_value attribute of the variable (if it exists). If the variable has no missing_value attribute, the _FillValue is used instead.

If maskandscale is set to True, and the variable has a scale_factor or an add_offset attribute, then data read from that variable is unpacked using::

data = self.scale_factor*data + self.add_offset

When data is written to a variable it is packed using::

data = (data - self.add_offset)/self.scale_factor

If either scale_factor is present, but add_offset is missing, add_offset is assumed zero. If add_offset is present, but scale_factor is missing, scale_factor is assumed to be one. For more information on how scale_factor and add_offset can be used to provide simple compression, see the PSL metadata conventions.

In addition, if maskandscale is set to True, and if the variable has an attribute _Unsigned set, and the variable has a signed integer data type, a view to the data is returned with the corresponding unsigned integer data type. This convention is used by the netcdf-java library to save unsigned integer data in NETCDF3 or NETCDF4_CLASSIC files (since the NETCDF3 data model does not have unsigned integer data types).

The default value of maskandscale is True (automatic conversions are performed).

#   def set_auto_scale(unknown):

set_auto_scale(self,scale)

turn on or off automatic packing/unpacking of variable data using scale_factor and add_offset attributes. Also turns on and off automatic conversion of signed integer data to unsigned integer data if the variable has an _Unsigned attribute.

If scale is set to True, and the variable has a scale_factor or an add_offset attribute, then data read from that variable is unpacked using::

data = self.scale_factor*data + self.add_offset

When data is written to a variable it is packed using::

data = (data - self.add_offset)/self.scale_factor

If either scale_factor is present, but add_offset is missing, add_offset is assumed zero. If add_offset is present, but scale_factor is missing, scale_factor is assumed to be one. For more information on how scale_factor and add_offset can be used to provide simple compression, see the PSL metadata conventions.

In addition, if scale is set to True, and if the variable has an attribute _Unsigned set, and the variable has a signed integer data type, a view to the data is returned with the corresponding unsigned integer datatype. This convention is used by the netcdf-java library to save unsigned integer data in NETCDF3 or NETCDF4_CLASSIC files (since the NETCDF3 data model does not have unsigned integer data types).

The default value of scale is True (automatic conversions are performed).

#   def set_auto_mask(unknown):

set_auto_mask(self,mask)

turn on or off automatic conversion of variable data to and from masked arrays .

If mask is set to True, when data is read from a variable it is converted to a masked array if any of the values are exactly equal to the either the netCDF _FillValue or the value specified by the missing_value variable attribute. The fill_value of the masked array is set to the missing_value attribute (if it exists), otherwise the netCDF _FillValue attribute (which has a default value for each data type). If the variable has no missing_value attribute, the _FillValue is used instead. If the variable has valid_min/valid_max and missing_value attributes, data outside the specified range will be masked. When data is written to a variable, the masked array is converted back to a regular numpy array by replacing all the masked values by the missing_value attribute of the variable (if it exists). If the variable has no missing_value attribute, the _FillValue is used instead.

The default value of mask is True (automatic conversions are performed).

#   def set_always_mask(unknown):

set_always_mask(self,always_mask)

turn on or off conversion of data without missing values to regular numpy arrays.

always_mask is a Boolean determining if automatic conversion of masked arrays with no missing values to regular numpy arrays shall be applied. Default is True. Set to False to restore the default behaviour in versions prior to 1.4.1 (numpy array returned unless missing values are present, otherwise masked array returned).

#   def set_ncstring_attrs(unknown):

set_always_mask(self,ncstring_attrs)

turn on or off creating NC_STRING string attributes.

If ncstring_attrs is set to True then text attributes will be variable-length NC_STRINGs.

The default value of ncstring_attrs is False (writing ascii text attributes as NC_CHAR).

#   def set_collective(unknown):

set_collective(self,True_or_False)

turn on or off collective parallel IO access. Ignored if file is not open for parallel access.

#   def get_dims(unknown):

get_dims(self)

return a tuple of Dimension instances associated with this Variable.

#   name = <attribute 'name' of 'netCDF4._netCDF4.Variable' objects>

string name of Variable instance

#   datatype = <attribute 'datatype' of 'netCDF4._netCDF4.Variable' objects>

numpy data type (for primitive data types) or VLType/CompoundType/EnumType instance (for compound, vlen or enum data types)

#   shape = <attribute 'shape' of 'netCDF4._netCDF4.Variable' objects>

find current sizes of all variable dimensions

#   size = <attribute 'size' of 'netCDF4._netCDF4.Variable' objects>

Return the number of stored elements.

#   dimensions = <attribute 'dimensions' of 'netCDF4._netCDF4.Variable' objects>

get variables's dimension names

#   ndim = <attribute 'ndim' of 'netCDF4._netCDF4.Variable' objects>
#   dtype = <attribute 'dtype' of 'netCDF4._netCDF4.Variable' objects>
#   mask = <attribute 'mask' of 'netCDF4._netCDF4.Variable' objects>
#   scale = <attribute 'scale' of 'netCDF4._netCDF4.Variable' objects>
#   always_mask = <attribute 'always_mask' of 'netCDF4._netCDF4.Variable' objects>
#   chartostring = <attribute 'chartostring' of 'netCDF4._netCDF4.Variable' objects>
#   class Dimension:

A netCDF Dimension is used to describe the coordinates of a Variable. See Dimension.__init__ for more details.

The current maximum size of a Dimension instance can be obtained by calling the python len function on the Dimension instance. The Dimension.isunlimited method of a Dimension instance can be used to determine if the dimension is unlimited.

Read-only class variables:

name: String name, used when creating a Variable with Dataset.createVariable.

size: Current Dimension size (same as len(d), where d is a Dimension instance).

#   Dimension()

__init__(self, group, name, size=None)

Dimension constructor.

group: Group instance to associate with dimension.

name: Name of the dimension.

size: Size of the dimension. None or 0 means unlimited. (Default None).

Note: Dimension instances should be created using the Dataset.createDimension method of a Group or Dataset instance, not using Dimension.__init__ directly.

#   def group(unknown):

group(self)

return the group that this Dimension is a member of.

#   def isunlimited(unknown):

isunlimited(self)

returns True if the Dimension instance is unlimited, False otherwise.

#   name = <attribute 'name' of 'netCDF4._netCDF4.Dimension' objects>

string name of Dimension instance

#   size = <attribute 'size' of 'netCDF4._netCDF4.Dimension' objects>

current size of Dimension (calls len on Dimension instance)

#   class Group(netCDF4.Dataset):

Groups define a hierarchical namespace within a netCDF file. They are analogous to directories in a unix filesystem. Each Group behaves like a Dataset within a Dataset, and can contain it's own variables, dimensions and attributes (and other Groups). See Group.__init__ for more details.

Group inherits from Dataset, so all the Dataset class methods and variables are available to a Group instance (except the close method).

Additional read-only class variables:

name: String describing the group name.

#   Group()

__init__(self, parent, name) Group constructor.

parent: Group instance for the parent group. If being created in the root group, use a Dataset instance.

name: - Name of the group.

Note: Group instances should be created using the Dataset.createGroup method of a Dataset instance, or another Group instance, not using this class directly.

#   def close(unknown):

close(self)

overrides Dataset close method which does not apply to Group instances, raises IOError.

#   class MFDataset(netCDF4.Dataset):

Class for reading multi-file netCDF Datasets, making variables spanning multiple files appear as if they were in one file. Datasets must be in NETCDF4_CLASSIC, NETCDF3_CLASSIC, NETCDF3_64BIT_OFFSET or NETCDF3_64BIT_DATA format (NETCDF4 Datasets won't work).

Adapted from pycdf by Andre Gosselin.

Example usage (See MFDataset.__init__ for more details):

>>> import numpy as np
>>> # create a series of netCDF files with a variable sharing
>>> # the same unlimited dimension.
>>> for nf in range(10):
...     with Dataset("mftest%s.nc" % nf, "w", format='NETCDF4_CLASSIC') as f:
...         f.createDimension("x",None)
...         x = f.createVariable("x","i",("x",))
...         x[0:10] = np.arange(nf*10,10*(nf+1))
>>> # now read all those files in at once, in one Dataset.
>>> f = MFDataset("mftest*nc")
>>> print(f.variables["x"][:])
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
 96 97 98 99]
#   MFDataset(files, check=False, aggdim=None, exclude=[], master_file=None)

__init__(self, files, check=False, aggdim=None, exclude=[], master_file=None)

Open a Dataset spanning multiple files, making it look as if it was a single file. Variables in the list of files that share the same dimension (specified with the keyword aggdim) are aggregated. If aggdim is not specified, the unlimited is aggregated. Currently, aggdim must be the leftmost (slowest varying) dimension of each of the variables to be aggregated.

files: either a sequence of netCDF files or a string with a wildcard (converted to a sorted list of files using glob) If the master_file kwarg is not specified, the first file in the list will become the "master" file, defining all the variables with an aggregation dimension which may span subsequent files. Attribute access returns attributes only from "master" file. The files are always opened in read-only mode.

check: True if you want to do consistency checking to ensure the correct variables structure for all of the netcdf files. Checking makes the initialization of the MFDataset instance much slower. Default is False.

aggdim: The name of the dimension to aggregate over (must be the leftmost dimension of each of the variables to be aggregated). If None (default), aggregate over the unlimited dimension.

exclude: A list of variable names to exclude from aggregation. Default is an empty list.

master_file: file to use as "master file", defining all the variables with an aggregation dimension and all global attributes.

#   def ncattrs(self):

ncattrs(self)

return the netcdf attribute names from the master file.

#   def close(self):

close(self)

close all the open files.

#   class MFTime(netCDF4._netCDF4._Variable):

Class providing an interface to a MFDataset time Variable by imposing a unique common time unit and/or calendar to all files.

Example usage (See MFTime.__init__ for more details):

>>> import numpy as np
>>> f1 = Dataset("mftest_1.nc","w", format="NETCDF4_CLASSIC")
>>> f2 = Dataset("mftest_2.nc","w", format="NETCDF4_CLASSIC")
>>> f1.createDimension("time",None)
>>> f2.createDimension("time",None)
>>> t1 = f1.createVariable("time","i",("time",))
>>> t2 = f2.createVariable("time","i",("time",))
>>> t1.units = "days since 2000-01-01"
>>> t2.units = "days since 2000-02-01"
>>> t1.calendar = "standard"
>>> t2.calendar = "standard"
>>> t1[:] = np.arange(31)
>>> t2[:] = np.arange(30)
>>> f1.close()
>>> f2.close()
>>> # Read the two files in at once, in one Dataset.
>>> f = MFDataset("mftest_*nc")
>>> t = f.variables["time"]
>>> print(t.units)
days since 2000-01-01
>>> print(t[32])  # The value written in the file, inconsistent with the MF time units.
1
>>> T = MFTime(t)
>>> print(T[32])
32
#   MFTime(time, units=None, calendar=None)

__init__(self, time, units=None, calendar=None)

Create a time Variable with units consistent across a multifile dataset.

time: Time variable from a MFDataset.

units: Time units, for example, 'days since 1979-01-01'. If None, use the units from the master variable.

calendar: Calendar overload to use across all files, for example, 'standard' or 'gregorian'. If None, check that the calendar attribute is present on each variable and values are unique across files raising a ValueError otherwise.

Inherited Members
netCDF4._netCDF4._Variable
typecode
ncattrs
set_auto_chartostring
set_auto_maskandscale
set_auto_mask
set_auto_scale
set_always_mask
#   class CompoundType:

A CompoundType instance is used to describe a compound data type, and can be passed to the the Dataset.createVariable method of a Dataset or Group instance. Compound data types map to numpy structured arrays. See CompoundType.__init__ for more details.

The instance variables dtype and name should not be modified by the user.

#   CompoundType()

__init__(group, datatype, datatype_name)

CompoundType constructor.

group: Group instance to associate with the compound datatype.

datatype: A numpy dtype object describing a structured (a.k.a record) array. Can be composed of homogeneous numeric or character data types, or other structured array data types.

datatype_name: a Python string containing a description of the compound data type.

Note 1: When creating nested compound data types, the inner compound data types must already be associated with CompoundType instances (so create CompoundType instances for the innermost structures first).

Note 2: CompoundType instances should be created using the Dataset.createCompoundType method of a Dataset or Group instance, not using this class directly.

#   dtype = <attribute 'dtype' of 'netCDF4._netCDF4.CompoundType' objects>
#   dtype_view = <attribute 'dtype_view' of 'netCDF4._netCDF4.CompoundType' objects>
#   name = <attribute 'name' of 'netCDF4._netCDF4.CompoundType' objects>
#   class VLType:

A VLType instance is used to describe a variable length (VLEN) data type, and can be passed to the the Dataset.createVariable method of a Dataset or Group instance. See VLType.__init__ for more details.

The instance variables dtype and name should not be modified by the user.

#   VLType()

__init__(group, datatype, datatype_name)

VLType constructor.

group: Group instance to associate with the VLEN datatype.

datatype: An numpy dtype object describing the component type for the variable length array.

datatype_name: a Python string containing a description of the VLEN data type.

Note: VLType instances should be created using the Dataset.createVLType method of a Dataset or Group instance, not using this class directly.

#   dtype = <attribute 'dtype' of 'netCDF4._netCDF4.VLType' objects>
#   name = <attribute 'name' of 'netCDF4._netCDF4.VLType' objects>
#   def date2num(unknown):

date2num(dates, units, calendar=None, has_year_zero=None)

Return numeric time values given datetime objects. The units of the numeric time values are described by the units argument and the calendar keyword. The datetime objects must be in UTC with no time-zone offset. If there is a time-zone offset in units, it will be applied to the returned numeric values.

dates: A datetime object or a sequence of datetime objects. The datetime objects should not include a time-zone offset. They can be either native python datetime instances (which use the proleptic gregorian calendar) or cftime.datetime instances.

units: a string of the form describing the time units. can be days, hours, minutes, seconds, milliseconds or microseconds. is the time origin. months_since is allowed only for the 360_day calendar.

calendar: describes the calendar to be used in the time calculations. All the values currently defined in the CF metadata convention <http://cfconventions.org>__ are supported. Valid calendars 'standard', 'gregorian', 'proleptic_gregorian' 'noleap', '365_day', '360_day', 'julian', 'all_leap', '366_day'. Default is None which means the calendar associated with the first input datetime instance will be used.

has_year_zero: If set to True, astronomical year numbering is used and the year zero exists. If set to False for real-world calendars, then historical year numbering is used and the year 1 is preceded by year -1 and no year zero exists. The defaults are False for real-world calendars and True for idealized calendars. The defaults can only be over-ridden for the real-world calendars, for the the idealized calendars the year zero always exists and the has_year_zero kwarg is ignored. This kwarg is not needed to define calendar systems allowed by CF (the calendar-specific defaults do this).

returns a numeric time value, or an array of numeric time values with approximately 1 microsecond accuracy.

#   def num2date(unknown):

num2date(times, units, calendar=u'standard', only_use_cftime_datetimes=True, only_use_python_datetimes=False, has_year_zero=None)

Return datetime objects given numeric time values. The units of the numeric time values are described by the units argument and the calendar keyword. The returned datetime objects represent UTC with no time-zone offset, even if the specified units contain a time-zone offset.

times: numeric time values.

units: a string of the form describing the time units. can be days, hours, minutes, seconds, milliseconds or microseconds. is the time origin. months_since is allowed only for the 360_day calendar.

calendar: describes the calendar used in the time calculations. All the values currently defined in the CF metadata convention <http://cfconventions.org>__ are supported. Valid calendars 'standard', 'gregorian', 'proleptic_gregorian' 'noleap', '365_day', '360_day', 'julian', 'all_leap', '366_day'. Default is 'standard', which is a mixed Julian/Gregorian calendar.

only_use_cftime_datetimes: if False, python datetime.datetime objects are returned from num2date where possible; if True dates which subclass cftime.datetime are returned for all calendars. Default True.

only_use_python_datetimes: always return python datetime.datetime objects and raise an error if this is not possible. Ignored unless only_use_cftime_datetimes=False. Default False.

has_year_zero: if set to True, astronomical year numbering is used and the year zero exists. If set to False for real-world calendars, then historical year numbering is used and the year 1 is preceded by year -1 and no year zero exists. The defaults are False for real-world calendars and True for idealized calendars. The defaults can only be over-ridden for the real-world calendars, for the the idealized calendars the year zero always exists and the has_year_zero kwarg is ignored. This kwarg is not needed to define calendar systems allowed by CF (the calendar-specific defaults do this).

returns a datetime instance, or an array of datetime instances with microsecond accuracy, if possible.

Note: If only_use_cftime_datetimes=False and use_only_python_datetimes=False, the datetime instances returned are 'real' python datetime objects if calendar='proleptic_gregorian', or calendar='standard' or 'gregorian' and the date is after the breakpoint between the Julian and Gregorian calendars (1582-10-15). Otherwise, they are ctime.datetime objects which support some but not all the methods of native python datetime objects. The datetime instances do not contain a time-zone offset, even if the specified units contains one.

#   def date2index(unknown):

date2index(dates, nctime, calendar=None, select=u'exact', has_year_zero=None)

Return indices of a netCDF time variable corresponding to the given dates.

dates: A datetime object or a sequence of datetime objects. The datetime objects should not include a time-zone offset.

nctime: A netCDF time variable object. The nctime object must have a units attribute.

calendar: describes the calendar to be used in the time calculations. All the values currently defined in the CF metadata convention <http://cfconventions.org>__ are supported. Valid calendars 'standard', 'gregorian', 'proleptic_gregorian' 'noleap', '365_day', '360_day', 'julian', 'all_leap', '366_day'. Default is None which means the calendar associated with the first input datetime instance will be used.

select: 'exact', 'before', 'after', 'nearest' The index selection method. exact will return the indices perfectly matching the dates given. before and after will return the indices corresponding to the dates just before or just after the given dates if an exact match cannot be found. nearest will return the indices that correspond to the closest dates.

has_year_zero: if set to True, astronomical year numbering is used and the year zero exists. If set to False for real-world calendars, then historical year numbering is used and the year 1 is preceded by year -1 and no year zero exists. The defaults are False for real-world calendars and True for idealized calendars. The defaults can only be over-ridden for the real-world calendars, for the the idealized calendars the year zero always exists and the has_year_zero kwarg is ignored. This kwarg is not needed to define calendar systems allowed by CF (the calendar-specific defaults do this).

returns an index (indices) of the netCDF time variable corresponding to the given datetime object(s).

#   def stringtochar(unknown):

stringtochar(a,encoding='utf-8')

convert a string array to a character array with one extra dimension

a: Input numpy string array with numpy datatype 'SN' or 'UN', where N is the number of characters in each string. Will be converted to an array of characters (datatype 'S1' or 'U1') of shape a.shape + (N,).

optional kwarg encoding can be used to specify character encoding (default utf-8). If encoding is 'none' or 'bytes', a numpy.string_ the input array is treated a raw byte strings (numpy.string_).

returns a numpy character array with datatype 'S1' or 'U1' and shape a.shape + (N,), where N is the length of each string in a.

#   def chartostring(unknown):

chartostring(b,encoding='utf-8')

convert a character array to a string array with one less dimension.

b: Input character array (numpy datatype 'S1' or 'U1'). Will be converted to a array of strings, where each string has a fixed length of b.shape[-1] characters.

optional kwarg encoding can be used to specify character encoding (default utf-8). If encoding is 'none' or 'bytes', a numpy.string_ btye array is returned.

returns a numpy string array with datatype 'UN' (or 'SN') and shape b.shape[:-1] where where N=b.shape[-1].

#   def stringtoarr(unknown):

stringtoarr(a, NUMCHARS,dtype='S')

convert a string to a character array of length NUMCHARS

a: Input python string.

NUMCHARS: number of characters used to represent string (if len(a) < NUMCHARS, it will be padded on the right with blanks).

dtype: type of numpy array to return. Default is 'S', which means an array of dtype 'S1' will be returned. If dtype='U', a unicode array (dtype = 'U1') will be returned.

returns a rank 1 numpy character array of length NUMCHARS with datatype 'S1' (default) or 'U1' (if dtype='U')

#   def getlibversion(unknown):

getlibversion()

returns a string describing the version of the netcdf library used to build the module, and when it was built.

#   class EnumType:

A EnumType instance is used to describe an Enum data type, and can be passed to the the Dataset.createVariable method of a Dataset or Group instance. See EnumType.__init__ for more details.

The instance variables dtype, name and enum_dict should not be modified by the user.

#   EnumType()

__init__(group, datatype, datatype_name, enum_dict)

EnumType constructor.

group: Group instance to associate with the VLEN datatype.

datatype: An numpy integer dtype object describing the base type for the Enum.

datatype_name: a Python string containing a description of the Enum data type.

enum_dict: a Python dictionary containing the Enum field/value pairs.

Note: EnumType instances should be created using the Dataset.createEnumType method of a Dataset or Group instance, not using this class directly.

#   dtype = <attribute 'dtype' of 'netCDF4._netCDF4.EnumType' objects>
#   name = <attribute 'name' of 'netCDF4._netCDF4.EnumType' objects>
#   enum_dict = <attribute 'enum_dict' of 'netCDF4._netCDF4.EnumType' objects>
#   def get_chunk_cache(unknown):

get_chunk_cache()

return current netCDF chunk cache information in a tuple (size,nelems,preemption). See netcdf C library documentation for nc_get_chunk_cache for details. Values can be reset with set_chunk_cache.

#   def set_chunk_cache(unknown):

set_chunk_cache(self,size=None,nelems=None,preemption=None)

change netCDF4 chunk cache settings. See netcdf C library documentation for nc_set_chunk_cache for details.

netcdf4-python-1.5.8rel/examples/000077500000000000000000000000001413751447500167275ustar00rootroot00000000000000netcdf4-python-1.5.8rel/examples/README.md000066400000000000000000000016551413751447500202150ustar00rootroot00000000000000* `tutorial.py`: code from introduction section of documentation. * `json_att.py`: shows to to use json to serialize python objects, save them as netcdf attributes, and then convert them back to python objects. * `subset.py`: shows how to use 'orthogonal indexing' to select geographic regions. * `reading_netcdf.ipynb`: ipython notebook from Unidata python workshop. * `writing_netcdf.ipynb`: ipython notebook from Unidata python workshop. * `threaded_read.py`: test script for concurrent threaded reads. * `bench.py`: benchmarks for reading/writing using different formats. * `bench_compress*.py``: benchmarks for reading/writing with compression. * `bench_diskless.py`: benchmarks for 'diskless' IO. * `test_stringarr.py`: test utilities for converting arrays of fixed-length strings to arrays of characters (with an extra dimension), and vice-versa. Useful since netcdf does not have a datatype for fixed-length string arrays. netcdf4-python-1.5.8rel/examples/bench.py000066400000000000000000000031071413751447500203610ustar00rootroot00000000000000# benchmark reads and writes, with and without compression. # tests all four supported file formats. from numpy.random.mtrand import uniform import netCDF4 from timeit import Timer import os, sys # create an n1dim by n2dim by n3dim random array. n1dim = 30 n2dim = 15 n3dim = 73 n4dim = 144 ntrials = 10 sys.stdout.write('reading and writing a %s by %s by %s by %s random array ..\n'%(n1dim,n2dim,n3dim,n4dim)) array = uniform(size=(n1dim,n2dim,n3dim,n4dim)) def write_netcdf(filename,zlib=False,least_significant_digit=None,format='NETCDF4'): file = netCDF4.Dataset(filename,'w',format=format) file.createDimension('n1', n1dim) file.createDimension('n2', n2dim) file.createDimension('n3', n3dim) file.createDimension('n4', n4dim) foo = file.createVariable('data', 'f8',('n1','n2','n3','n4'),zlib=zlib,least_significant_digit=least_significant_digit) foo[:] = array file.close() def read_netcdf(filename): file = netCDF4.Dataset(filename) data = file.variables['data'][:] file.close() for format in ['NETCDF3_CLASSIC','NETCDF3_64BIT','NETCDF4_CLASSIC','NETCDF4']: sys.stdout.write('testing file format %s ...\n' % format) # writing, no compression. t = Timer("write_netcdf('test1.nc',format='%s')" % format,"from __main__ import write_netcdf") sys.stdout.write('writing took %s seconds\n' %\ repr(sum(t.repeat(ntrials,1))/ntrials)) # test reading. t = Timer("read_netcdf('test1.nc')","from __main__ import read_netcdf") sys.stdout.write('reading took %s seconds\n' % repr(sum(t.repeat(ntrials,1))/ntrials)) netcdf4-python-1.5.8rel/examples/bench_compress.py000066400000000000000000000035501413751447500222760ustar00rootroot00000000000000# benchmark reads and writes, with and without compression. # tests all four supported file formats. from numpy.random.mtrand import uniform import netCDF4 from timeit import Timer import os, sys # create an n1dim by n2dim by n3dim random array. n1dim = 30 n2dim = 15 n3dim = 73 n4dim = 144 ntrials = 10 sys.stdout.write('reading and writing a %s by %s by %s by %s random array ..\n'%(n1dim,n2dim,n3dim,n4dim)) sys.stdout.write('(average of %s trials)\n' % ntrials) array = netCDF4.utils._quantize(uniform(size=(n1dim,n2dim,n3dim,n4dim)),4) def write_netcdf(filename,zlib=False,shuffle=False,complevel=6): file = netCDF4.Dataset(filename,'w',format='NETCDF4') file.createDimension('n1', n1dim) file.createDimension('n2', n2dim) file.createDimension('n3', n3dim) file.createDimension('n4', n4dim) foo = file.createVariable('data',\ 'f8',('n1','n2','n3','n4'),zlib=zlib,shuffle=shuffle,complevel=complevel) foo[:] = array file.close() def read_netcdf(filename): file = netCDF4.Dataset(filename) data = file.variables['data'][:] file.close() for compress_kwargs in ["zlib=False,shuffle=False","zlib=True,shuffle=False", "zlib=True,shuffle=True","zlib=True,shuffle=True,complevel=2"]: sys.stdout.write('testing compression %s...\n' % repr(compress_kwargs)) # writing. t = Timer("write_netcdf('test.nc',%s)" % compress_kwargs,"from __main__ import write_netcdf") sys.stdout.write('writing took %s seconds\n' %\ repr(sum(t.repeat(ntrials,1))/ntrials)) # test reading. t = Timer("read_netcdf('test.nc')","from __main__ import read_netcdf") sys.stdout.write('reading took %s seconds\n' % repr(sum(t.repeat(ntrials,1))/ntrials)) # print out size of resulting files. sys.stdout.write('size of test.nc = %s\n'%repr(os.stat('test.nc').st_size)) netcdf4-python-1.5.8rel/examples/bench_compress2.py000066400000000000000000000050541413751447500223610ustar00rootroot00000000000000# benchmark reads and writes, with and without compression. # tests all four supported file formats. from numpy.random.mtrand import uniform import netCDF4 from timeit import Timer import os, sys # create an n1dim by n2dim by n3dim random array. n1dim = 30 n2dim = 15 n3dim = 73 n4dim = 144 ntrials = 10 sys.stdout.write('reading and writing a %s by %s by %s by %s random array ..\n'%(n1dim,n2dim,n3dim,n4dim)) sys.stdout.write('(average of %s trials)\n\n' % ntrials) array = uniform(size=(n1dim,n2dim,n3dim,n4dim)) def write_netcdf(filename,complevel,lsd): file = netCDF4.Dataset(filename,'w',format='NETCDF4') file.createDimension('n1', n1dim) file.createDimension('n2', n2dim) file.createDimension('n3', n3dim) file.createDimension('n4', n4dim) foo = file.createVariable('data',\ 'f8',('n1','n2','n3','n4'),\ zlib=True,shuffle=True,complevel=complevel,\ least_significant_digit=lsd) foo[:] = array file.close() def read_netcdf(filename): file = netCDF4.Dataset(filename) data = file.variables['data'][:] file.close() lsd = None sys.stdout.write('using least_significant_digit %s\n\n' % lsd) for complevel in range(0,10,2): sys.stdout.write('testing compression with complevel %s...\n' % complevel) # writing. t = Timer("write_netcdf('test.nc',%s,%s)" % (complevel,lsd),"from __main__ import write_netcdf") sys.stdout.write('writing took %s seconds\n' %\ repr(sum(t.repeat(ntrials,1))/ntrials)) # test reading. t = Timer("read_netcdf('test.nc')","from __main__ import read_netcdf") sys.stdout.write('reading took %s seconds\n' % repr(sum(t.repeat(ntrials,1))/ntrials)) # print out size of resulting files. sys.stdout.write('size of test.nc = %s\n'%repr(os.stat('test.nc').st_size)) complevel = 4 sys.stdout.write('\nusing complevel %s\n\n' % complevel) for lsd in range(1,6): sys.stdout.write('testing compression with least_significant_digit %s...\n' % lsd) # writing. t = Timer("write_netcdf('test.nc',%s,%s)" % (complevel,lsd),"from __main__ import write_netcdf") sys.stdout.write('writing took %s seconds\n' %\ repr(sum(t.repeat(ntrials,1))/ntrials)) # test reading. t = Timer("read_netcdf('test.nc')","from __main__ import read_netcdf") sys.stdout.write('reading took %s seconds\n' % repr(sum(t.repeat(ntrials,1))/ntrials)) # print out size of resulting files. sys.stdout.write('size of test.nc = %s\n'%repr(os.stat('test.nc').st_size)) netcdf4-python-1.5.8rel/examples/bench_compress3.py000066400000000000000000000054121413751447500223600ustar00rootroot00000000000000from __future__ import print_function # benchmark reads and writes, with and without compression. # tests all four supported file formats. from numpy.random.mtrand import uniform import netCDF4 from timeit import Timer import os, sys # use real data. URL="http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis/pressure/hgt.1990.nc" nc = netCDF4.Dataset(URL) # use real 500 hPa geopotential height data. n1dim = 100 n3dim = 73 n4dim = 144 ntrials = 10 sys.stdout.write('reading and writing a %s by %s by %s random array ..\n'%(n1dim,n3dim,n4dim)) sys.stdout.write('(average of %s trials)\n\n' % ntrials) print(nc) print(nc.variables['hgt']) array = nc.variables['hgt'][0:n1dim,5,:,:] print(array.min(), array.max(), array.shape, array.dtype) def write_netcdf(filename,complevel,lsd): file = netCDF4.Dataset(filename,'w',format='NETCDF4') file.createDimension('n1', None) file.createDimension('n3', n3dim) file.createDimension('n4', n4dim) foo = file.createVariable('data',\ 'f4',('n1','n3','n4'),\ zlib=True,shuffle=True,complevel=complevel,\ least_significant_digit=lsd) foo[:] = array file.close() def read_netcdf(filename): file = netCDF4.Dataset(filename) data = file.variables['data'][:] file.close() lsd = None sys.stdout.write('using least_significant_digit %s\n\n' % lsd) for complevel in range(0,10,2): sys.stdout.write('testing compression with complevel %s...\n' % complevel) # writing. t = Timer("write_netcdf('test.nc',%s,%s)" % (complevel,lsd),"from __main__ import write_netcdf") sys.stdout.write('writing took %s seconds\n' %\ repr(sum(t.repeat(ntrials,1))/ntrials)) # test reading. t = Timer("read_netcdf('test.nc')","from __main__ import read_netcdf") sys.stdout.write('reading took %s seconds\n' % repr(sum(t.repeat(ntrials,1))/ntrials)) # print out size of resulting files. sys.stdout.write('size of test.nc = %s\n'%repr(os.stat('test.nc').st_size)) complevel = 4 complevel = 4 sys.stdout.write('\nusing complevel %s\n\n' % complevel) for lsd in range(0,6): sys.stdout.write('testing compression with least_significant_digit %s..\n'\ % lsd) # writing. t = Timer("write_netcdf('test.nc',%s,%s)" % (complevel,lsd),"from __main__ import write_netcdf") sys.stdout.write('writing took %s seconds\n' %\ repr(sum(t.repeat(ntrials,1))/ntrials)) # test reading. t = Timer("read_netcdf('test.nc')","from __main__ import read_netcdf") sys.stdout.write('reading took %s seconds\n' % repr(sum(t.repeat(ntrials,1))/ntrials)) # print out size of resulting files. sys.stdout.write('size of test.nc = %s\n'%repr(os.stat('test.nc').st_size)) netcdf4-python-1.5.8rel/examples/bench_diskless.py000066400000000000000000000052761413751447500222730ustar00rootroot00000000000000# benchmark reads and writes, with and without compression. # tests all four supported file formats. from numpy.random.mtrand import uniform import netCDF4 from timeit import Timer import os, sys # create an n1dim by n2dim by n3dim random array. n1dim = 30 n2dim = 15 n3dim = 73 n4dim = 144 ntrials = 10 sys.stdout.write('reading and writing a %s by %s by %s by %s random array ..\n'%(n1dim,n2dim,n3dim,n4dim)) array = uniform(size=(n1dim,n2dim,n3dim,n4dim)) def write_netcdf(filename,zlib=False,least_significant_digit=None,format='NETCDF4',closeit=False): file = netCDF4.Dataset(filename,'w',format=format,diskless=True,persist=True) file.createDimension('n1', n1dim) file.createDimension('n2', n2dim) file.createDimension('n3', n3dim) file.createDimension('n4', n4dim) foo = file.createVariable('data',\ 'f8',('n1','n2','n3','n4'),zlib=zlib,least_significant_digit=None) foo.testme="hi I am an attribute" foo.testme1="hi I am an attribute" foo.testme2="hi I am an attribute" foo.testme3="hi I am an attribute" foo.testme4="hi I am an attribute" foo.testme5="hi I am an attribute" foo[:] = array if closeit: file.close() return file def read_netcdf(ncfile): data = ncfile.variables['data'][:] for format in ['NETCDF4','NETCDF3_CLASSIC','NETCDF3_64BIT']: sys.stdout.write('testing file format %s ...\n' % format) # writing, no compression. t = Timer("write_netcdf('test1.nc',closeit=True,format='%s')" % format,"from __main__ import write_netcdf") sys.stdout.write('writing took %s seconds\n' %\ repr(sum(t.repeat(ntrials,1))/ntrials)) # test reading. ncfile = write_netcdf('test1.nc',format=format) t = Timer("read_netcdf(ncfile)","from __main__ import read_netcdf,ncfile") sys.stdout.write('reading took %s seconds\n' % repr(sum(t.repeat(ntrials,1))/ntrials)) # test diskless=True in nc_open format='NETCDF3_CLASSIC' trials=50 sys.stdout.write('test caching of file in memory on open for %s\n' % format) sys.stdout.write('testing file format %s ...\n' % format) write_netcdf('test1.nc',format=format,closeit=True) ncfile = netCDF4.Dataset('test1.nc',diskless=False) t = Timer("read_netcdf(ncfile)","from __main__ import read_netcdf,ncfile") sys.stdout.write('reading (from disk) took %s seconds\n' % repr(sum(t.repeat(ntrials,1))/ntrials)) ncfile.close() ncfile = netCDF4.Dataset('test1.nc',diskless=True) # setting diskless=True should cache the file in memory, # resulting in faster reads. t = Timer("read_netcdf(ncfile)","from __main__ import read_netcdf,ncfile") sys.stdout.write('reading (cached in memory) took %s seconds\n' % repr(sum(t.repeat(ntrials,1))/ntrials)) ncfile.close() netcdf4-python-1.5.8rel/examples/json_att.py000066400000000000000000000012601413751447500211210ustar00rootroot00000000000000from netCDF4 import Dataset import json # example showing how python objects (lists, dicts, None, True) # can be serialized as strings, saved as netCDF attributes, # and then converted back to python objects using json. ds = Dataset('json.nc', 'w') ds.pythonatt1 = json.dumps(['foo', {'bar': ['baz', None, 1.0, 2]}]) ds.pythonatt2 = "true" # converted to bool ds.pythonatt3 = "null" # converted to None print(ds) ds.close() ds = Dataset('json.nc') def convert_json(s): try: a = json.loads(s) return a except: return s x = convert_json(ds.pythonatt1) print(type(x)) print(x) print(convert_json(ds.pythonatt2)) print(convert_json(ds.pythonatt3)) ds.close() netcdf4-python-1.5.8rel/examples/mpi_example.py000066400000000000000000000026771413751447500216150ustar00rootroot00000000000000# to run: mpirun -np 4 python mpi_example.py import sys from mpi4py import MPI import numpy as np from netCDF4 import Dataset if len(sys.argv) == 2: format = sys.argv[1] else: format = 'NETCDF4_CLASSIC' rank = MPI.COMM_WORLD.rank # The process ID (integer 0-3 for 4-process run) if rank == 0: print('Creating file with format {}'.format(format)) nc = Dataset('parallel_test.nc', 'w', parallel=True, comm=MPI.COMM_WORLD, info=MPI.Info(),format=format) # below should work also - MPI_COMM_WORLD and MPI_INFO_NULL will be used. #nc = Dataset('parallel_test.nc', 'w', parallel=True) d = nc.createDimension('dim',4) v = nc.createVariable('var', np.int32, 'dim') v[rank] = rank # switch to collective mode, rewrite the data. v.set_collective(True) v[rank] = rank nc.close() # reopen the file read-only, check the data nc = Dataset('parallel_test.nc', parallel=True, comm=MPI.COMM_WORLD, info=MPI.Info()) assert rank==nc['var'][rank] nc.close() # reopen the file in append mode, modify the data on the last rank. nc = Dataset('parallel_test.nc', 'a',parallel=True, comm=MPI.COMM_WORLD, info=MPI.Info()) if rank == 3: v[rank] = 2*rank nc.close() # reopen the file read-only again, check the data. # leave out the comm and info kwargs to check that the defaults # (MPI_COMM_WORLD and MPI_INFO_NULL) work. nc = Dataset('parallel_test.nc', parallel=True) if rank == 3: assert 2*rank==nc['var'][rank] else: assert rank==nc['var'][rank] nc.close() netcdf4-python-1.5.8rel/examples/mpi_example_compressed.py000066400000000000000000000012621413751447500240260ustar00rootroot00000000000000# to run: mpirun -np 4 python mpi_example_compressed.py import sys from mpi4py import MPI import numpy as np from netCDF4 import Dataset rank = MPI.COMM_WORLD.rank # The process ID (integer 0-3 for 4-process run) nc = Dataset('parallel_test_compressed.nc', 'w', parallel=True) d = nc.createDimension('dim',4) v = nc.createVariable('var', np.int32, 'dim', zlib=True) v[:] = np.arange(4) nc.close() # read compressed files in parallel, check the data, try to rewrite some data nc = Dataset('parallel_test_compressed.nc', 'a', parallel=True) v = nc['var'] assert rank==v[rank] v.set_collective(True) # issue #1108 (var must be in collective mode or write will fail) v[rank]=2*rank nc.close() netcdf4-python-1.5.8rel/examples/reading_netCDF.ipynb000066400000000000000000001451251413751447500225760ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": { "internals": { "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "# Reading netCDF data\n", "- requires [numpy](http://numpy.scipy.org) and netCDF/HDF5 C libraries.\n", "- Github site: https://github.com/Unidata/netcdf4-python\n", "- Online docs: http://unidata.github.io/netcdf4-python/\n", "- Based on Konrad Hinsen's old [Scientific.IO.NetCDF](http://dirac.cnrs-orleans.fr/plone/software/scientificpython/) API, with lots of added netcdf version 4 features.\n", "- Developed by Jeff Whitaker at NOAA, with many contributions from users." ] }, { "cell_type": "markdown", "metadata": { "internals": { "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Interactively exploring a netCDF File\n", "\n", "Let's explore a netCDF file from the *Atlantic Real-Time Ocean Forecast System*\n", "\n", "first, import netcdf4-python and numpy" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "internals": { "frag_number": 2, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "import netCDF4\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 2, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Create a netCDF4.Dataset object\n", "- **`f`** is a `Dataset` object, representing an open netCDF file.\n", "- printing the object gives you summary information, similar to *`ncdump -h`*." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 4, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "root group (NETCDF4_CLASSIC data model, file format HDF5):\n", " Conventions: CF-1.0\n", " title: HYCOM ATLb2.00\n", " institution: National Centers for Environmental Prediction\n", " source: HYCOM archive file\n", " experiment: 90.9\n", " history: archv2ncdf3z\n", " dimensions(sizes): MT(1), Y(850), X(712), Depth(10)\n", " variables(dimensions): float64 \u001b[4mMT\u001b[0m(MT), float64 \u001b[4mDate\u001b[0m(MT), float32 \u001b[4mDepth\u001b[0m(Depth), int32 \u001b[4mY\u001b[0m(Y), int32 \u001b[4mX\u001b[0m(X), float32 \u001b[4mLatitude\u001b[0m(Y,X), float32 \u001b[4mLongitude\u001b[0m(Y,X), float32 \u001b[4mu\u001b[0m(MT,Depth,Y,X), float32 \u001b[4mv\u001b[0m(MT,Depth,Y,X), float32 \u001b[4mtemperature\u001b[0m(MT,Depth,Y,X), float32 \u001b[4msalinity\u001b[0m(MT,Depth,Y,X)\n", " groups: \n", "\n" ] } ], "source": [ "f = netCDF4.Dataset('data/rtofs_glo_3dz_f006_6hrly_reg3.nc')\n", "print(f) " ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 4, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Access a netCDF variable\n", "- variable objects stored by name in **`variables`** dict.\n", "- print the variable yields summary info (including all the attributes).\n", "- no actual data read yet (just have a reference to the variable object with metadata)." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[u'MT', u'Date', u'Depth', u'Y', u'X', u'Latitude', u'Longitude', u'u', u'v', u'temperature', u'salinity']\n", "\n", "float32 temperature(MT, Depth, Y, X)\n", " coordinates: Longitude Latitude Date\n", " standard_name: sea_water_potential_temperature\n", " units: degC\n", " _FillValue: 1.26765e+30\n", " valid_range: [ -5.07860279 11.14989948]\n", " long_name: temp [90.9H]\n", "unlimited dimensions: MT\n", "current shape = (1, 10, 850, 712)\n", "filling on\n" ] } ], "source": [ "print(f.variables.keys()) # get all variable names\n", "temp = f.variables['temperature'] # temperature variable\n", "print(temp) " ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 6, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## List the Dimensions\n", "\n", "- All variables in a netCDF file have an associated shape, specified by a list of dimensions.\n", "- Let's list all the dimensions in this netCDF file.\n", "- Note that the **`MT`** dimension is special (*`unlimited`*), which means it can be appended to." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 8 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(u'MT', (unlimited): name = 'MT', size = 1\n", ")\n", "(u'Y', : name = 'Y', size = 850\n", ")\n", "(u'X', : name = 'X', size = 712\n", ")\n", "(u'Depth', : name = 'Depth', size = 10\n", ")\n" ] } ], "source": [ "for d in f.dimensions.items():\n", " print(d)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 9 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "Each variable has a **`dimensions`** and a **`shape`** attribute." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 10 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "(u'MT', u'Depth', u'Y', u'X')" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp.dimensions" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 11, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "(1, 10, 850, 712)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp.shape" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 11, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "### Each dimension typically has a variable associated with it (called a *coordinate* variable).\n", "- *Coordinate variables* are 1D variables that have the same name as dimensions.\n", "- Coordinate variables and *auxiliary coordinate variables* (named by the *coordinates* attribute) locate values in time and space." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 13, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "float64 MT(MT)\n", " long_name: time\n", " units: days since 1900-12-31 00:00:00\n", " calendar: standard\n", " axis: T\n", "unlimited dimensions: MT\n", "current shape = (1,)\n", "filling on, default _FillValue of 9.96920996839e+36 used\n", "\n", "\n", "int32 X(X)\n", " point_spacing: even\n", " axis: X\n", "unlimited dimensions: \n", "current shape = (712,)\n", "filling on, default _FillValue of -2147483647 used\n", "\n" ] } ], "source": [ "mt = f.variables['MT']\n", "depth = f.variables['Depth']\n", "x,y = f.variables['X'], f.variables['Y']\n", "print(mt)\n", "print(x) " ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 13, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Accessing data from a netCDF variable object\n", "\n", "- netCDF variables objects behave much like numpy arrays.\n", "- slicing a netCDF variable object returns a numpy array with the data.\n", "- Boolean array and integer sequence indexing behaves differently for netCDF variables than for numpy arrays. Only 1-d boolean arrays and integer sequences are allowed, and these indices work independently along each dimension (similar to the way vector subscripts work in fortran)." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 15 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 41023.25]\n" ] } ], "source": [ "time = mt[:] # Reads the netCDF variable MT, array of one element\n", "print(time) " ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 16 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0. 100. 200. 400. 700. 1000. 2000. 3000. 4000. 5000.]\n" ] } ], "source": [ "dpth = depth[:] # examine depth array\n", "print(dpth) " ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 17, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "shape of temp variable: (1, 10, 850, 712)\n", "shape of temp slice: (6, 425, 356)\n" ] } ], "source": [ "xx,yy = x[:],y[:]\n", "print('shape of temp variable: %s' % repr(temp.shape))\n", "tempslice = temp[0, dpth > 400, yy > yy.max()/2, xx > xx.max()/2]\n", "print('shape of temp slice: %s' % repr(tempslice.shape))" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 17, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## What is the sea surface temperature and salinity at 50N, 140W?\n", "### Finding the latitude and longitude indices of 50N, 140W\n", "\n", "- The `X` and `Y` dimensions don't look like longitudes and latitudes\n", "- Use the auxilary coordinate variables named in the `coordinates` variable attribute, `Latitude` and `Longitude`" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 19 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "float32 Latitude(Y, X)\n", " standard_name: latitude\n", " units: degrees_north\n", "unlimited dimensions: \n", "current shape = (850, 712)\n", "filling on, default _FillValue of 9.96920996839e+36 used\n", "\n" ] } ], "source": [ "lat, lon = f.variables['Latitude'], f.variables['Longitude']\n", "print(lat)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 20, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "source": [ "Aha! So we need to find array indices `iy` and `ix` such that `Latitude[iy, ix]` is close to 50.0 and `Longitude[iy, ix]` is close to -140.0 ..." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 20, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "# extract lat/lon values (in degrees) to numpy arrays\n", "latvals = lat[:]; lonvals = lon[:] \n", "# a function to find the index of the point closest pt\n", "# (in squared distance) to give lat/lon value.\n", "def getclosest_ij(lats,lons,latpt,lonpt):\n", " # find squared distance of every point on grid\n", " dist_sq = (lats-latpt)**2 + (lons-lonpt)**2 \n", " # 1D index of minimum dist_sq element\n", " minindex_flattened = dist_sq.argmin() \n", " # Get 2D index for latvals and lonvals arrays from 1D index\n", " return np.unravel_index(minindex_flattened, lats.shape)\n", "iy_min, ix_min = getclosest_ij(latvals, lonvals, 50., -140)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 22 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "### Now we have all the information we need to find our answer.\n" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 23 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "```\n", "|----------+--------|\n", "| Variable | Index |\n", "|----------+--------|\n", "| MT | 0 |\n", "| Depth | 0 |\n", "| Y | iy_min |\n", "| X | ix_min |\n", "|----------+--------|\n", "```" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 24 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "### What is the sea surface temperature and salinity at the specified point?" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 6.4631 degC\n", "32.6572 psu\n" ] } ], "source": [ "sal = f.variables['salinity']\n", "# Read values out of the netCDF file for temperature and salinity\n", "print('%7.4f %s' % (temp[0,0,iy_min,ix_min], temp.units))\n", "print('%7.4f %s' % (sal[0,0,iy_min,ix_min], sal.units))" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Remote data access via openDAP\n", "\n", "- Remote data can be accessed seamlessly with the netcdf4-python API\n", "- Access happens via the DAP protocol and DAP servers, such as TDS.\n", "- many formats supported, like GRIB, are supported \"under the hood\"." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 27 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "The following example showcases some nice netCDF features:\n", "\n", "1. We are seamlessly accessing **remote** data, from a TDS server.\n", "2. We are seamlessly accessing **GRIB2** data, as if it were netCDF data.\n", "3. We are generating **metadata** on-the-fly." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 28, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/Global_0p5deg/GFS_Global_0p5deg_20150711_0600.grib2/GC\n" ] } ], "source": [ "import datetime\n", "date = datetime.datetime.now()\n", "# build URL for latest synoptic analysis time\n", "URL = 'http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/Global_0p5deg/GFS_Global_0p5deg_%04i%02i%02i_%02i%02i.grib2/GC' %\\\n", "(date.year,date.month,date.day,6*(date.hour//6),0)\n", "# keep moving back 6 hours until a valid URL found\n", "validURL = False; ncount = 0\n", "while (not validURL and ncount < 10):\n", " print(URL)\n", " try:\n", " gfs = netCDF4.Dataset(URL)\n", " validURL = True\n", " except RuntimeError:\n", " date -= datetime.timedelta(hours=6)\n", " ncount += 1 " ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 28, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "float32 Temperature_surface(time2, lat, lon)\n", " long_name: Temperature @ Ground or water surface\n", " units: K\n", " abbreviation: TMP\n", " missing_value: nan\n", " grid_mapping: LatLon_Projection\n", " coordinates: reftime time2 lat lon \n", " Grib_Variable_Id: VAR_0-0-0_L1\n", " Grib2_Parameter: [0 0 0]\n", " Grib2_Parameter_Discipline: Meteorological products\n", " Grib2_Parameter_Category: Temperature\n", " Grib2_Parameter_Name: Temperature\n", " Grib2_Level_Type: Ground or water surface\n", " Grib2_Generating_Process_Type: Forecast\n", "unlimited dimensions: \n", "current shape = (93, 361, 720)\n", "filling off\n", "\n", "\n", "float64 time2(time2)\n", " units: Hour since 2015-07-11T06:00:00Z\n", " standard_name: time\n", " long_name: GRIB forecast or observation time\n", " calendar: proleptic_gregorian\n", " _CoordinateAxisType: Time\n", "unlimited dimensions: \n", "current shape = (93,)\n", "filling off\n", "\n", "\n", "float32 lat(lat)\n", " units: degrees_north\n", " _CoordinateAxisType: Lat\n", "unlimited dimensions: \n", "current shape = (361,)\n", "filling off\n", "\n", "\n", "float32 lon(lon)\n", " units: degrees_east\n", " _CoordinateAxisType: Lon\n", "unlimited dimensions: \n", "current shape = (720,)\n", "filling off\n", "\n" ] } ], "source": [ "# Look at metadata for a specific variable\n", "# gfs.variables.keys() will show all available variables.\n", "sfctmp = gfs.variables['Temperature_surface']\n", "# get info about sfctmp\n", "print(sfctmp)\n", "# print coord vars associated with this variable\n", "for dname in sfctmp.dimensions: \n", " print(gfs.variables[dname])" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 28, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "##Missing values\n", "- when `data == var.missing_value` somewhere, a masked array is returned.\n", "- illustrate with soil moisture data (only defined over land)\n", "- white areas on plot are masked values over water." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 31 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "shape=(361, 720), type=, missing_value=nan\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAD7CAYAAAB37B+tAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnX+MJkeZ378Ptmf5dbPLgM8/N7dWwCc23NhGwr6EO7Fc\nwNhSgi9ShNlVyAlOEQpZQAQns2sHZ+OLHQb5yEm3AkXHDzmEmeCYHwIFDtvEm3CKzE/bY1gc2zpW\nYn322vHCDhd0s177yR/dNVNvvVXV1d3V3VX9Ph9pNO/bb/+o7q769tNPPfUUMTMEQRCEfHnR0AUQ\nBEEQ2iFCLgiCkDki5IIgCJkjQi4IgpA5IuSCIAiZI0IuCIKQOWcPcVAikphHQRCEBjAz2RY6/wC8\nGMB3ADwI4EcADpXLDwE4DuCB8u9abZuDAB4D8AiAqx37Zd9xU/1T55/jn5Rdyj0LZc+13KFld2mn\n1yJn5r8hojcz86+I6GwAf0FE3wDAAD7OzB/X1yei3QCuB7AbwEUA7iWiS5n5hZAnjSAIglCfSh85\nM/+q/DgH4BwUIg4A0+Y9cB2AVWZ+jpmPAXgcwJURyikIgiA4qBRyInoRET0I4ASAu5n5u+VP7yei\nh4jo00S0o1x2IQqXi+I4Cst8LBwZugAtODJ0AVpwZOgCNOTI0AVowZGhC9CQI0MXoAVHmm4YYpG/\nwMyXA7gYwFVE9HcAfBLAJQAuB/AkgD/27aJp4VKDmY8MXYamSNn7J9dyA/mWPddyA+3KHhy1wsyn\niOg+ANcw86ZwE9GnAHyt/PoEgJ3aZheXy6YgokPa1yM53wBBEIQuIKI9APZUrlf2hLp28ioAZ5j5\nF0T0EgDfBPBRAD9k5qfKdT4E4A3MvK/s7FxB4Re/CMC9AF7NxkGIiNkWQiMIgpAg206ub2rYxsI8\nuZZ1jUs7qyzyCwDcQURnoXDDfIGZv05E/5mILkfhNvkpgPcCADMfJaI7ARwFcAbA+0wRFwRBAADa\nB547vN56PzFEtEqozXX1Yy4tLOPm0oW8fHKpN1HX8VrknR1ULHJBmBlo31Y/WQzhNtGF03UsU1xN\n4XaJtsnSwjJuueE24PYt/VrTBjgudqxrLu0UIR8ZekXmFWuIqCB0gl73gK36p0Ty9P75aEKuhLnN\nQ+KZ7ec6f7v9rBs2P9/w/O0Tvx07+3TlvheZ6WbcxDc8fzvmz9rYbIdt3TEi5DOCaVkM8ZonzB5K\nUE0xNeufWs80MlS9fWb7uZhfKoRyfXkOAHDuqWec+9O3A7C5rULtw0aIIMckhrU+GiE3X2PWLHlb\nun69SRnXK6IIutA1Pp/36f3zU8ts637vldsnvle15ZtxEwPAP6bbwgs6ALE0KVshV0KtLoQp5Eq4\nRKgmMS2k0688Vvywd1FcLkJtaB84pN64LHObkAPAR1ZuAjApxKboTblsLiSs+UauJMjMC7nCaXnf\nUC6/fXatcEGIgcvtUWf7qm1NUX5odXp1m5BPuWxu256FmMf2DoxOyGfZfdIUsxFhdQ3Mi3IdhU6x\nWemq47OOK8UUdHPbFHnDs6eieguaxpEngwh3GKZVNSXelvXnDq9PvfqK+2WchLpIYhwHcNejucPr\neGb7uTimLatq47wC2nZyqz7fxTfihudv773TMpTFD/d3rGws8tQZstO1SqxD2PSla4LeVYPvS0yE\nMFyiW3WffGJt1km9foW4U9pia49D8IZnTwGI14eXvWslZYZw+8QQ7ypEbMcD7QP36Urz1c9Tn9s2\nFSYYu4/rZtzEt9yw1YE6pD89ph6IkHdEn6O6dGILuYj2OKmqJzHvu2tA0JCoqLah/Om7zsxNDAhq\nS/Y+8uS4gVh/yncl4n1Y3nWPozfQtpEOQsesrgF7F50/V90/30jhuiGJLqoGEeWGPr5l+7s2wCvd\nH1Ms8oasP7+Nj519uujQqPlaaLNc9AbVl3h3QR1BDzlPeUA0x3V9m9Yxm5Db9ml70NdBRbNEGQlZ\nduYvLSwD6H7g0K4zc9j+rg3MHV7v5IHk0s7KiSUEO2rYsG8IsA2fiNt+19erX8r+Mcsfcm5CN/AK\nyKw3Vd+b7N8n8E1QogsUrpHQhFYuTu+fxy24lZZPLuEuvhF38Y1tdudkkZmULrgGQHXFaCzyIQRw\n/fltfPtZN+AW3Bp0jK6FzBZGOAuk+pDr0z9dlzZvgCFRKm3EXYUmzp+1semiWPwwQH/FzuOHsjkS\nvIMBReoNokt346g7O32VJKVGbitnDFeKHtplG3RhivsYBT/0PvcR+tjqfpaRJURrXCfCpGlHo2sc\ngY8mQu5b14USdKDIRrh8cgmn9883atP6fe9SzHedmcO5p57pzM8/qs7OOg1lCJGv45uMaaWHpvEc\nm4gD9fztXdWJKPdy72KxH/VfZ3Vtcx2FyxBwlUUXbfNcQwTdZWmb1zZU2H2W++n989iOjYnyNWWy\nfPPgC7t5luvpb/skK4u8S9dEVQVVy2wDZ0LwNZKYVrkqW9Ny9kFObwR1LNvOClEReVIH/dqrOuKy\nHl1vkFXr2HA9RNtY7rU61mmt2NfeRXxk5aZonZ6LHwZuvv3GYPdqW7J3rYRUmBgCoVc4s/KFZnTz\nlc01HL5LIUhZ1HOgSzEf+t70+VC11fNQC99Ev261QiBX1/AQLmtS/E2GTBeSrWslpsBVCaarUrle\n6WzLbbOgmBaQuY8if0R3jUkEvB0hVmTM8FFXveqCPutG3XDT0OtYq99j7yJ2fW6udn6WXWfqRaf1\nTfJCXgeXYKrlVbkhYuYsUcedO7zuFHDz+9gF13WOuZ97mxBLX0d0zPkt28Z2d1GONmxO9Yb653Lu\nqWfwPYSP9FTzHtTtwPQZgk07bZ3HSt210mTQiC3uVG8cthviO05Ig9L3rzdOU9irlgvD4xO9kIiN\ntuhuOGA89aOucMXulDaF1TdsP4b7ZNvJdT69f6tjVUXIqMgWoP4o1iwHBOk30mXZ6uvqVrVvail9\nPdoH74CDkMbks7yrGmGXjbSLGcubklJZXLgG0FSJhj4wJmR9E73u6P9P759PR8RX16b/GmC2vabF\nafMGra5pVwODFBsL8zR3eH0qxFElDIuap9xnkRPRiwH8TwDbULhh7mLmQ0S0AOALAH4DwDEA72Dm\nX5TbHATwHgDPA/gAM99t2a/TInf5Gn1pVpt2Mrlm9TY7Jc1j2ywml+D36e80yd1l0Qf6/YnZsEJn\njq+qO643vSa06awHYBdvFU1jiayJ5TqIaZnrkWdLC8vO6JWYHZoqnUeMBFqNLHJm/hsAb2bmywFc\nDuAaIroKwAEA9zDzpQC+VX4HEe0GcD2A3QCuAfAJIgqy+s0nrHnzXBMftH0q+ypzEyu7dWNx7KcJ\nqYt41VtWH8ePhRpKHjqk3OYH93WS20Q+5Pp1fn1bWOcmLis7pi+5al+LH44flTJ/1gYtMlPMLIgm\nlZ2dzPyr8uMcgHNQdC68HcCbyuV3ADiCQsyvA7DKzM8BOEZEjwO4EsD9vmOEirFrIEMTfBXcF6Wi\nW+uhQlnVeVV1vLHieuPpki4y7RVW3vTyKmvchms8gHmN6u67ahwDENAOTevbI+AxB1Y1cVf52FiY\nJ9fDdn15rsP4se6o7OwsLeofAvjbAA4z80Ei+jkzv6L8nQCcZOZXENGfArifmT9f/vYpAN9g5i8a\n+5x4PWib68HXuamvH2optbViXA0mNFwxdH8x6KvTtYuHktkpGSJIVYNgmuKqg1VuFeVCLKYxW596\nC43xhucrw8bCfJwxDJqoN528ou/cNHpmROViuYv7G9zThMadncz8QulauRjAVUT0OuN3hj8EKHpY\nTN1IljoZ1Lp4FW1jcbYRv7qv3V27OroKp1Pf1X02j6Ove3r//KD5rtWbnBJpvV6qcsXs5Ky65m0z\nC26ydxHYu5jVZN68AtpYmKdbcCtdtpdx2V5OWsR9BMeRM/MpIroPwNsAnCCi85n5KSK6AMDT5WpP\nANipbXZxuWwKIjqkfX0z9vJ9QeWwPJX1hqkqZtGgQ/YYH1fcuC+Spsl+ba4J/bPveC6hSM2VY7Oy\nbXVgShCNZP5dJ8qy1UHbOtsOb8Uj07754i1iZXKdybJPjoFQhHSQtiGHvPgxswymlFxPh4j2ANhT\nuV5F1MqrAJxh5l8Q0UsAfBPAR8sdP8vMy0R0AMAOZj5QdnauoPCLXwTgXgCvZuMgtteDqjzdQPVr\ncV3rwvfq28WgjLq4ImNCtnMxpBvHLEOsPg89EgEYfoYZXz1sMxDEPE+1Px9D3e82cd4h+26a7TEn\nNrM0avW56RD9CwDcQURnoXDDfIGZv05E9wO4k4j+EGX4IQAw81EiuhPAUQBnALzPFHEXthth3rDN\nSmdYW1Wjrlwi2KTHP4YPvQ5NHiipDjbyhZA2IVWL0ayLurC3ncihSOfQjBh1V2+TsTupQ98CXNke\nxyjmQNi5eYWcmR8G8HrL8pMA3uLY5jYArVKL+V6ZXB2dIYN6Qmlj0aaALv5mpE0qjLXRuYj1ljD1\nkDi8Fa9uw1YX1PcYuI5b5QoT/Oh6Vtwrf9tNbmTnUFaW2QmVyvDoJg3O1olZtS/z3Ju8wVQRsxNP\n79RM9eG67eQ60z7UztFRB3PfVR3W5u91r531DTlgm1TfnlKlbp1JTshduGJJ9cpkVixdnH0i4sqB\nYvs+BE3FvOp8becdep2aEjMm2IzpHzoixWRjYT5q/LMNZbn5xiK0iWWPSdeCPuaHRVX/X5JJs1QS\neFsoU9XNcg2oCInpNbcfgjox6G2OYRsY00dDiCVsesWOOVAsZ2ydoaF0Ff1SRdsR2iH7zgkz+mpq\nbMErtyP5iSVi53H2WdopEtM378sj49pfVw03ZFRhXcwKnpIl3id6ZIPKtgf4O+pjDTSKQZdCru8/\nB1x1Ws/bg1WyCnkyrpXYN7JuxfS5aOruw+bSGaKh1HGTdFG+0Nd65UtuepxZFXGgOPfQ8+96dG0K\n+xkb6uFcdd+SsMiJ1jjWnIQumligoVZLnY7Rqrj1utuF7qfPeOKQa21bp64gN0n2P3ZsGUN1unhg\ntx081JVVPnfYPvdAqkxY3nBcV4dFPqiQ225cH765VCJSTJqO/jRdSGbfgG9fXVnivjLq6+h+wCYz\nsIglN4kpBn260JrQdVscQ/2Y0MnUhBx73ce1+fFSqnxdYqvYIZ20IftRy6t88XWvdZP+B3V/2wi5\nYCdUzLtoX6HC3KVBoSfJG1udymry5Sr/bRIWtcr21rFLCKjuuFQ0DSF0hVw2cdOEjh7cfGCsVK4q\n1MTWflydnF0fuyuqLO1oycAyITmL3BSRkERRg6DnYu5BzIHq1+SmbimbZWbLh+KaTLaJO0ihLPKx\nWU4poI+QtoVrAsOmc2hybFtKalvdGWNUE+0DJx+1Akze2CYDGTon0kwoMbFZ0+afa11FiPWuRlJW\nNb6QdYR+sHUi6g/qLowhV7u1DQSrGx48d3h9KiV1iIjnjDkXsXO9VCzytlEZvWIKus0ij+R6qftK\n3LaTK3QAlbk/vZyhDXQMVlLqmHOHVrkp24q7+RDXJ85Qy0NT8vr2raiqQ2Ppf9m8ZjlY5FU3MmTA\njEs4msyObtsHr4CYF0kl0rcJNa+AXL/59u0qq0uUQyxiff0qzAbl26aOD95G7g0rR0JCQOsIeEgn\nvBIg3bI03xLNuqzXYf3NssnDpU6cfcq0yn7YF3Vvkm193YI0f1cXwZfjvOr4XYcxFf6vwoonLHpf\nk0JFtO51DWnoIdtWvUWMoWHliK8+NHVjmvsMsex1S91X50IHk+n7bHAK2cArIFq1u1iSda2YQhwy\nWMBVecxp34Dp4a+uY5vb+8oRul4IbV43Q7YLPX7d/fpe3wG3T1PEvRtc/uJQ11nbDnRfO7a1F1+9\nM+uR2YE7diEvclBdln4cucvPanba1PHjhdxcr5ivrk0k7woR8tg5Y2yEhiTGILTz0vSv28ro65wS\nMY9PlaFi3lvbd58VXyfaJGQWMNf+9bqlt7Oxi7eOL2olKSH3WbT6zYst5EB1ha8l0qtrhX88pFNU\nI1aUTmwxb/t2oJiVMLGUsA3Zd4Ws1nkLcz3cQ+qKWkfPuBly7FkQ7coHW2rZD5WQ+26OLtpmAw8R\n1Lo33vcaau7Le3xXmKIm5K7oEFW5QwfddBnFExIvbltXjz0POY5Y5N2h6pKtztSJSqqD603RjGcP\nmbBa37ZRYTKjUtdyiFox4RWQ6tE2YyltkR2+ikn7wCoG1YxFdVG7Iq+u+a1wi8CbZdZnvnGVp7GI\n14iDt4m4q1y2WPY6DW8skQUpYovmCnXdNcUWUaViwM11q9piEuHGQ1BzzMpgUSuuhm5OKmG6NHS/\nWIjFqCySucOWYxluGn0dMwSvsT/OEU9edzBESEhgbHyRQDEQS3xYTCvdFhYY0j/S1CVYZUzNkiXe\nljQtcldstgc1rZYeH+57TXGFRbnis6dQAt1gtKcZJ2uWRy9HcHksx5iiweAk2/F9I/TEuk4LVz03\nqeNG6wsR8XCSiCOfQHUSrjhGSzrEyBfC5qq4TUXSWq4AbC4IszzW/aprYjl3n5slZlSL6fc2O6Y3\n9ytJsJKi8EsX98fmXtHddXXfEhUhoYx1mNW6pLwRAGobXV6LnIh2EtF9RPRjIvoREX2gXH6IiI4T\n0QPl37XaNgeJ6DEieoSIrq53KuXoSctcnUDhbtEFZGNhnkJcDjYBnVhf+bZX1+xWgMX3zbxIdYfh\nVz04JsqpH8+w/qv6A2JgK2eVheTygwrDYrYRV3toWq+6qItijdfDG7VCROcDOJ+ZHySilwP4AYDf\nB/AOAL9k5o8b6+9G8Rx9A4CLANwL4FJmfsFYzzv5srUsDh+13itvDvyJ+npoxJOrY1dts4kh9iHD\nm13bh4RqBe2/Aa57oB8zxLUi/vF+8WWuDBXi0Le+tsxynZiwygFLsIR9QJDXtcLMTwF4qvz810T0\nExQCDcD6xLwOwCozPwfgGBE9DuBKAPdPFThS+GAxqGB+SuQ3FuaJsCXyXmxuC8sy2/B+575t7haP\na8jsWAQAHN6lLa/XYKoaaNPOSz01qlq2lVq0+M3n5hKLfVhsYYjmwJ++BpoJ0yhjcUrQS0OSyK6b\nwT5yItoF4AoUovxGAO8non8K4PsAPszMvwBwISZF+zi2hL8VPlF3/VYsn7f62rayiRmdluYT0OGX\n9lZsVwiixwUTGtrnI6Z15POZVllMIuLpEyLMrqil2GMYmvrmx8yUe9nWZ6gRNCCodKscAfDvmfkr\nRPTrAJ4pf/4jABcw8x8S0Z8CuJ+ZP19u9ykAX2fmLxn7Y+ChSt9yl36yKSH3UTfaI2DSidAKu7Sw\njOWTS/WOH0DdRhiSLyX0d996QneE5iuqGnDWScemhvjHHffK41qpDD8konMAfBHAf2HmrwAAMz/N\nJQA+hcJ9AgBPANipbX5xuczCJ4HVfw48fAg4cWS6wH1M4hB6DK0z1LptwEhOk9CImToibu6vTeii\nKxzNtT8VdugaraeW29YT0qDJ4KG2A4dMRMQNThwpNPLhQ8DrvuRcraqzkwDcAeBZZv6QtvwCZn6y\n/PwhAG9g5n1aZ+eV2OrsfDUbB9m0yG0YOUpcESxtmLDGldjWfXDYRmzqYYKeiBbXIIy21N2fz9ry\nve7KQI28qcrnYcOXT6VtndORejWdH2cy+KFB9kMi+h0A/wvAGrC58xsB7AVwebnspwDey8wnym1u\nBPAeAGcAfJCZv2nZr1vIHbgEXe8UCBV9Z0WusqxdfnS1zLa9R9Rto+dcVK3X9qFQZ9SeCPk4qCvo\nsUZ2uvYz63VqU8uMCLXT++c1bUktjW1NIcfexenEVWbPLsLEvDMh9+3D3Beqc3cPRZWlJW6RceBq\nB02jVprmcJl1AVcQrbHSB/cAwQbhh6mhz6ITYqF70YW3qjMzxOq2LXOIuqsjKYZlHgvfMWQiiJFh\nGCM2N0qMXDsSwljB3kV3u6swENMXciWISnDLyhYs2KGE+MirQhWrsDQUnRCRHlrEhfGgT+zAvEim\nb1YRo0NT6lQYzjQdFaQr5LqAd0FI1InGZqC+/jpqE/aWybRyYGlhGcCtQxdDiACvgKrmiK0TQ25G\nLW25TSbHc7SdRWtsTOmK543eRprZDwH3yMiU8ZXP5n5pcT5tsyM2pRBxYVSsrgXHmPsw66HP/SZ+\n8S3cMeMGHhdwuha5i5ZiXgxzremW2bsIojWe8su7OkGryhjhgTSU9a7i2m9ZGOTwQodUzaHpMxhE\nmJuhd3Bu4rLGPbqRjkXeIFd2E6yCHEJZPj3fuflbG3JxqwjjZajJjGfezRLBhZxe+GHTATo1aGqV\n2zIgKir3V5GUKychl4iVcaInRDNTKlTlFmpiHPmmbpwFmgVsNByi3zlaJEpfVjkQf8To5v7U+diE\nWxAywXxYe3OVN2y3syjeithRd8MLucKM+OhQ1BtdxLJs5rZEa6zPM6pPN8e8OPE3sb+K80s15nZj\nYX7KWhPGievNyxT1NoJsdVUKtRnWtRI5kqMOzry/LfdXB1t+85RRDVsGBM0Oroe2bmiIENejneak\n6loZmAmXSAt0y7xy3X1gWwePaYWnFOonwj2b+CZv7mPKQSGM4SzyveVxB/Qdx7bKzf36sI2iazoK\nrkt3hwi4YE4TZ45AbltHZmnav/Zak6JFnlIHYCSffKiLxZXv24VtsEWsvN7mPiRnuKDDK6A2MwS5\n3kAVUtfak59rJWIn6MTTcYCHSsxp3No2BH3ihzb7EcaHbpHbEmr53gbrxogr0Z/52PKaDCfkDWbV\nmdguoqDH8pPX6fBUVkjosGd9OH5MsdX3JSIuVNG1T3zsPvc2gxF9pGeR15l+LSKxxLwuSjyrJo1Q\n+CIE6gqxvt9tJ9dZwgoFG7wCqnKj2OpOk/q0sTBPekiiqpdSP/2kJ+R9snfRns2wAW0HGOkNpa9Z\nxZvuWxrV7BESYugT3aYhiq52MTMEZkGcbSHHpJg1tcpjjBKtFNXVtaDGYLPKzcZgWuJqO3GtCD6a\ndIK3DVHkFWweU+LV3aSXa6UPLEKtKslENrIaecrbsO3kOsealLbKUraFONYV8FkKFxPc1Hkrk7qy\nxeZMZ74BkS5jcpUyn7MzBo4Z7fXJhEOFPGauFr1BtJ3T0BTZ0MYW2tBExAUTVSdUO1LflxaWN9Me\nm8xq/WkcjVMx+fJwrhVdVG1JpuruoyWhF9iaN6UlMRPwu159Y01CMasNUHDjcn24RBxo1hE601Ro\n5LA+8hABd/1uy5jo25fxm813R/swmavc2Ca2gJt01ZkT0nkqDUuIhTzs+8cr5ES0k4juI6IfE9GP\niOgD5fIFIrqHiB4loruJaIe2zUEieoyIHiGiq2MUspaAOn1LbjdJVWdMF1Z4k3LExHxo1HmISEMV\nqlBW+kxGmgxA1VRvzwH4EDM/SEQvB/ADIroHwLsB3MPMHyOiJQAHABwgot0ArgewG8BFAO4lokuZ\n+QXnEQKmRZuYHDZ0wJBnXZ9gbnZEoHyArPQbVx6bjYV52nZ4ujN17AMvhDQo3C1F3aN94Fmvd7Z8\nNbY35roPQK+QM/NTAJ4qP/81Ef0EhUC/HcCbytXuAHAEhZhfB2CVmZ8DcIyIHgdwJYD7nQep4+f2\nuVkCp0uyVSTzojlnAdJmUKk8UE1U4it9GHTM42wNsLD3BRTXRawnoR9C3+oaT82YKLYEdy5BryPm\nwT5yItoF4AoA3wFwHjOfKH86AeC88vOFAI5rmx1HIfztadKxGTjAZ8pXbk4eMaLcD64GJO4SoWvq\nGibbTq6zGrQ3phwsrtQc+rK6FnmQkJdulS8C+CAz/1L/jYv4Rd/F7efC61OsuaZbq7EvZ8XpMLlW\nV2Jqy26oVxQRcaFvqhJtmalz9f9q5Cjtw+b/Pso8FCHuqCofOYjoHBQi/jlm/kq5+AQRnc/MTxHR\nBQCeLpc/AWCntvnF5bJpHj609fnX9wDn7aksbFt8FyT0adjXa14st4oabGTuj1dAtG9+kFnThdkl\nJHe+q536ltO+eZ47vJ6NUVJ1HZRr5ex3/necWf4L4OFt3v15BwQREaHwgT/LzB/Sln+sXLZMRAcA\n7GBm1dm5gsIvfhGAewG8mo2DTEwsgTAHf9NOANs+XEzs2zbyquFs4XXQ5/+M4ZPvegCPXhlzaUTC\n8Oj1Uk0d6JtWztV2zd9sRkvKKEPL1Xc3pXuOkZ1VrpU3AvgnAN5MRA+Uf9cA+CiAtxLRowB+r/wO\nZj4K4E4ARwF8A8D7TBE30U/A5Tdqkrc7yjRU+mTQPYg4MBnqGKOHX8RVSBF94FpVHa37Jp2bq6Xu\nG4iNwad6M29ELatZI2S70FSxmxj+8L57z3MYDp9DGYU8iDkoLaf6WOe8T79ye2JD9EvqukraWKk5\nDk6IVeY2qWclba3QBzHFN6f6GuO8B7PI9adKrSdSgNXu2842MMYplppFnnssa1NftnlvcrJ0hPzo\nUoBTr7vmudu0LlmLHJiebqyPnCO+ZWPATPDf5DxzsmoEAfDX89Trs6mDei72qjzwSQg5UG9ig6bi\nW9kBasaI9zztW0z0a9Sk88dW6VO3aIRxsbSwXHubqrf11DtCm07wUhlHPgRFTuNELvjexazCmRT6\nNVTxtbRvvrimK/5tRcSFITDrnS8NblPGmooiGYu8DjFiyq14Zg7KEV18Qy0R1+tn6q+lwjhpYpXP\nIkl0dtrwDQ4wCe38dGUcs5GzgJuYMxDZzs0cEm3DnHXIZqWrwR0Rii3MEH0bCrnWUZd2JulaCRFx\n20CAWCkyxyTiodTNtiYIuZKriPvI0rViI2RAkC7QUUZ+ZkLIDEFVYZ1mj3poFkVxyQhV9F1Hxjgu\nIkmL3EabGW1s27ks0DFa42bnsc39EdrBXCceXa0r7hYhRcY0KjlJi7yJSIdMLKx3+M2aG8E836rc\nzjEmarZtb8a3C8LQjKE+JtvZaU4LtZX9q9lUbiGiNEZrXMfs9AQmz9kUdnUdzU5OfVkVIdN7jcEi\nEtqRipDqOpGiHri0M0mLHCguorIKJ0RcF28jO6GJ2k5EvCAkUkf/c60fW3jHYBEJzaF9mJpTdmiK\nHOeJjGUccxLpAAARaUlEQVQJIFmLHHDEPttm6FFzdqrPLjzrzIKQA2GhiF0f14dY57OFemNrmkMp\nNrZ5M1PShuwscsAirqYQq+nc6k6/1uF0banTViibWimhQ49tgj+WuRoFO6lY467orhzqXtJC3giX\nSFuWq5uV0hO3D1RisiHOOyQpmi7m206uy3R0I0bd26Gs8Sn3rbZcJ3VjIn0h91nPum+8QYKrXGcU\niYFqQOYM5VUVNoao1tmHsuJFzIVQQi38qvVsKa9TJX0hB6bF3JWl0CXmeiepcsf49jej9FVRVedW\njBBHIX/0wIa+aBrinCrJDwhiXiSiNQ4SWyXYtomTAbfQZ5yuti2T4Yfzg76Z6BPwyiCi2SRWp6cr\nbUebFNgFaYp5Hha5z5oGqvOIh0SyCBPhh30eR7fGmmRsFPInZp3T02/k5B5pQ/IW+SZKjH3Ca4sx\nn2Fruw9oH1p1Rtq21S1zQWhKLNE2B8alSB4WuaKJ9RzokiFaE+FoQFfWu5rqqot9C4kS4e3Y5ToJ\n7pPJ9A29UsiJ6DNEdIKIHtaWHSKi40T0QPl3rfbbQSJ6jIgeIaKro5fY5V5pup4gCEmgJjiP2fFZ\naz9G35pu0adsjQNhFvlnAVxjLGMAH2fmK8q/bwAAEe0GcD2A3eU2nyCieFZ/E193JDEXf209iNaY\naK0IZ1T/HddQrdt3GYUE0dpxXUG3peQIdq849ENNkxhciIGoFFlm/jaAn1t+sp3cdQBWmfk5Zj4G\n4HEAV7Yp4EQDV3HjNQb9VFJD6EXMBaFblFVeB9eAHpegh8xFkINfXKeNtfx+InqIiD5NRDvKZRcC\nOK6tcxzARS2OUeATb9e6dbapEPOQDH7CFlbrus79EGYbo574kt/pYYamQKtcKepPj2Q5vX9+OpNq\nxq7YpkL+SQCXALgcwJMA/tiz7rBWbEQBETG3s+lGsblIQq592YjEvSK4aDOAxzlPb8bCbdJIyJn5\naS4B8ClsuU+eALBTW/XictkUZYep+tvTpBxebKM3Q0MXhTjINRUawLxIrrbqiguPPTI0lVGcRLRH\n10rXeo2EnIgu0L7+IwAqouWrAN5JRHNEdAmA1wD4rm0fzHxI+zvSpBxBBIqJGeq22UlHa5ybv6xP\n6lrR5voT/Q4i/EJJEzG3/eZaVkUqk5Ez8xFdK13rVQ4IIqJVAG8C8Coi+hmAfwtgDxFdjsJt8lMA\n7y0PepSI7gRwFMAZAO/jIRKeA/aZhBwVwxmvvCks4lIx2RRkVxphV/4bLWbf1rElQ/MFhaofRGts\n1iPbUH7faM6mYp7qkHyTpCeWKNaN4Dd1WHq+ASe6pSgW+TSVQq5wpVTwTNMn11kwcUWM6eJdJ69K\nqLinNigty4kloiERE91RdV1Dk52VpPA6KySIx81iRrX4IlnU8pDkXKmJuI98cq00pYE1Lvip/ZZk\nm9nJtk65vG3+FmGEBPafhGZPNMMUzW1zMyiSt8ibDBBwUgpKHZGQkMMtWo/A9I2+NRKeyWhPwUbs\n9ujaX27tPnkhb4XD8qsSCP13W3rVWWJi1iAluF1GlyjLPPMBGkJkSiNgaWG5schWhSrmlFvFJAsh\nb2SVRxKB3J7MMfE+8ERkhYxQ7djlN9fJza0CZCLkQqI0EfOanc6S30bQWT65BKBbAyvH/pn8hDxU\nPOrmW/GQ4xO6LZVD7dtc25rhiiLmgs7SwnL0fW4szJP6i77zHshPyOuixzk3dAfk+IRuTdV0eVXT\n70VGxFz4yMpNmyIeS8xzFm+dvIS8iXhYrL8qn/vm8ODVtZm0xoHAh5d+D0TMhS4x6pdysQgFecWR\ne0YEOlEWuQo9DOw4jRr2OAv4JsCWwVhCW1bXgJW4uxyDJa7IxiLfFFZbDhUbutUuoWzdEeIr18MJ\nG96LWY4eEgp0K3zqTXnGjYW8LPJQRLT7QX9DsvVDtOyb0JlVF5cwzR/tuxVAOhkKUyAbixwIdHd4\nREPcJQ2oM8uS7drLQ1VoCdEazz27C0CFVY7ZfXPLSsitiPtkOKqud8P7YcuDIQiA582srGuhFvqY\n/ONAhkJutaoDBGMmQwhbEu0Npqb/0pa8KGTCXGEGiDg+ZExkJ+RCz8R4y4lgmQszTM3645useSxx\n4yZZCnld61qs8bywWePA+F6HhQYEhrXOWifoOKNWNETE+yF0tqUQZq0RChWsrgGHd7XezZgNgSwt\n8lBExPuh6jq3vQ+n98+PuhEKflTEygSO4AZXR/nY68/ohJxXQOpv6LKMFf0ah15ntZ5rffGHC0EE\ndHLWmbtzLCQ/+bIwPMo1EuvhaHO1uPzip/fPy5vVjLPt5PrkRC+e0d1jrzcu7RQhFwZBF3PdgrLN\nuTj212LBjS7igGFdV+RemiUhr3StENFniOgEET2sLVsgonuI6FEiupuIdmi/HSSix4joESK6Ot4p\nCGPCbGRq+i1xsQhebHnxHcxStswQH/lnAVxjLDsA4B5mvhTAt8rvIKLdAK4HsLvc5hNENDo/vBAH\nU7Rtvs0u/ZvbTq6zafEJ6aFyj5/eP18rdfIYLXIXleGHzPxtItplLH47gDeVn+8AcASFmF8HYJWZ\nnwNwjIgeB3AlgPsjlVcYIfoADj0RUtcNUR2HELcPQBD6pmkc+XnMfKL8fALAeeXnCzEp2scBXNTw\nGMLI2ViYp+kc0/PR8067MDtYhUzRsmzO6sO49YAgZmYi8r2eyqurkDRzh9elQzVBtp1c59Ap3WY9\ns2lTIT9BROcz81NEdAGAp8vlTwDYqa13cblsCiI6pH09wsxHGpZFEBqxsTBP4iNPm+WTS51MtpwL\nRLQHwJ7K9ULCD0sf+deY+bfK7x8D8CwzLxPRAQA7mPlA2dm5gsIvfhGAewG8mo2DSPih4EIJa5dx\nwOoYSsjFGk8T10PWNjvQrFjkbcIPVwH8bwC/SUQ/I6J3A/gogLcS0aMAfq/8DmY+CuBOAEcBfAPA\n+0wRF4QhMcVBRDxd1L3xWeS8ApoVEfcRErWy1/HTWxzr3wbgtjaFEmYXFbnShTWui7gIeJ5Ix7Qd\nifEWkiN2Y9XjxWfZ3zoGZMCYndGnsRXyouvwseWTS2KNC6NDcq0Io0dcKnni6+yc1Xjxxp2dgiAI\nfSOusHqIa0UYPWKF54cvxr/wk0unp45Y5IIgJItrQJAM5JpELHJBEJJCF2mXa0XesiYRi1wQhKSo\nEmkR8WlEyAVBEDJHwg8FQUgOlw981q1xCT8UBCEbNhbmaWNhnpYWlmuFIM7S9G46YpELgpAsNst8\nlq1yl3ZK1IogCMmzsTBPN+OmUtRvHbYwCSIWuSAIySK+8knERy4IQnYoX/nQ5UgdscgFQRAyQSxy\nQRCEkSJCLgiCkDki5IIgCJkjQi4IgpA5IuSCIAiZI0IuCIKQOa1GdhLRMQDrAJ4H8BwzX0lECwC+\nAOA3ABwD8A5m/kXLcgqCIAgO2lrkDGAPM1/BzFeWyw4AuIeZLwXwrfK7IAiC0BExXCtmcPrbAdxR\nfr4DwO9HOIYgCILgoNXITiL6SwCnULhW/hMz/xkR/ZyZX1H+TgBOqu/adjKyUxCEqKwRTYjZ4gg1\npqvsh29k5ieJ6FwA9xDRI/qPzMxkXFxBEISYmAIOjFPEfbQScmZ+svz/DBF9GcCVAE4Q0fnM/BQR\nXQDgadu2RHRI+3qEmY+0KYuwhV6xVYVeI+JFZrL9Jgi5MnYRJ6I9APZUrtfUtUJELwVwFjP/kohe\nBuBuAP8OwFsAPMvMy0R0AMAOZj5gbJula8VWaRRdVp66x/Wt79uHa7s6xzAfFlXHFISmjF3Ebbi0\ns42QXwLgy+XXswF8npn/Qxl+eCeAvwVH+GFOQl5XFHWUqLWpXG2Onytjb4xCc6raw9jrTnQh76Iw\nqdCHeIZUuFkUcZOxN0yhPkO9GaeACDm2KkAMd0Rs9DINXZYcGHuDFbYw2+0sW+VZC7lPgEO3tSHi\nOR7G3HhnGbNzfpZFHEhQyB/q/ajCrDD2xjwrNDGuxnDvfed9GYAu4sgFITnqRN8IaTIrb8ixzlOE\nXJgZ2kYQCQXyoIxDzIeVCLkgCMH4xCcFKzrFh3Uf10WEXBg9qTXsronlW7aJYuiAr6FI7V73da1E\nyIXRklqj7oJYQuFKOCUpHeozxINOolaEUZKr6KRs7eZG33Wgj3snUSvCzJCjiIuAx2eW3iZEyAWh\nY2wD2kS4+yV2rvLU7p+4VgTBgiQ6E/SO3VQ6eV2uFRFyQRCETHAJeYw5OwVBEIQBESEXBEHIHBFy\nQRCEzBEhFwRByBwRckEQhMwRIRcEQcgcEXJBEITMESEXBEHIHBFyQRCEzOlEyInoGiJ6hIgeI6Kl\nLo4hCIIgFEQXciI6C8BhANcA2A1gLxG9NvZxhuB7QxegBVL2/sm13EC+Zc+13EC7sndhkV8J4HFm\nPsbMzwH4rwCu6+A4vfP9oQvQAil7/+RabiDfsudabqBd2bsQ8osA/Ez7frxcJgiCIHRAF0I+eKpH\nQRCEWSJ6Glsi+m0Ah5j5mvL7QQAvMPOyto6IvSAIQgN6yUdORGcD+D8A/j6AvwLwXQB7mfknUQ8k\nCIIgAOhgqjdmPkNE+wF8E8BZAD4tIi4IgtAdg8wQJAiCIMSj15GdqQ8UIqLPENEJInpYW7ZARPcQ\n0aNEdDcR7dB+O1ieyyNEdPUwpQaIaCcR3UdEPyaiHxHRBzIq+4uJ6DtE9GBZ9kO5lL0sy1lE9AAR\nfa38nku5jxHRWln275bLki87Ee0goruI6CdEdJSIrsqk3L9ZXmv1d4qIPhCt7Mzcyx8KN8vjAHYB\nOAfAgwBe29fxA8v4uwCuAPCwtuxjAP51+XkJwEfLz7vLczinPKfHAbxooHKfD+Dy8vPLUfRRvDaH\nspfleWn5/2wA9wO4KqOy/0sAnwfw1VzqS1menwJYMJYlX3YAdwB4j1ZftudQbuMcXgTgSQA7Y5W9\nz8L/XQB/rn0/AODA0BfVUs5dmBTyRwCcV34+H8Aj5eeDAJa09f4cwG8PXf6yLF8B8Jbcyg7gpQB+\ngGJQWfJlB3AxgHsBvBnA13KqL6WQv9JYlnTZS9H+S8vypMttKe/VAL4ds+x9ulZyHSh0HjOfKD+f\nAHBe+flCFOegSOJ8iGgXireK7yCTshPRi4joQRRlvJuZv4s8yv4fAfwrAC9oy3IoN1CM97iXiL5P\nRP+sXJZ62S8B8AwRfZaIfkhEf0ZEL0P65TZ5J4DV8nOUsvcp5Nn3qnLxaPSdx6DnSEQvB/BFAB9k\n5l/qv6VcdmZ+gZkvR2HhXkVErzN+T67sRPQPADzNzA8AmIrrBdIst8YbmfkKANcC+BdE9Lv6j4mW\n/WwArwfwCWZ+PYD/h+LNfqtQaZZ7EyKaA/APAfw387c2Ze9TyJ9A4RNS7MTkEydVThDR+QBARBcA\neLpcbp7PxeWyQSCic1CI+OeY+Svl4izKrmDmUwDuA/A2pF/2vwfg7UT0UxTW1e8R0eeQfrkBAMz8\nZPn/GQBfRuHOSr3sxwEcZ2aVX+ouFML+VOLl1rkWwA/K6w5EuuZ9Cvn3AbyGiHaVT6XrAXy1x+M3\n5asA/qD8/Aco/M9q+TuJaI6ILgHwGhSDn3qHiAjApwEcZeY/0X7KoeyvUj31RPQSAG8F8BMkXnZm\nvpGZdzLzJShelf8HM78r9XIDABG9lIh+rfz8MhQ+24eReNmZ+SkAPyOiS8tFbwHwYwBfQ8LlNtiL\nLbcKEOua9+zkvxZFRMXjAA4O3elgKd8qitGop1H4898NYAFFh9ajAO4GsENb/8byXB4B8LYBy/07\nKPy0DwJ4oPy7JpOy/xaAHwJ4CIWY/JtyefJl18rzJmxFrSRfbhS+5gfLvx+ptphJ2S9DkfH1IQBf\nQtEBmny5y7K8DMD/BfBr2rIoZZcBQYIgCJkjU70JgiBkjgi5IAhC5oiQC4IgZI4IuSAIQuaIkAuC\nIGSOCLkgCELmiJALgiBkjgi5IAhC5vx/oWJ9OHx0YTwAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "soilmvar = gfs.variables['Volumetric_Soil_Moisture_Content_depth_below_surface_layer']\n", "# flip the data in latitude so North Hemisphere is up on the plot\n", "soilm = soilmvar[0,0,::-1,:] \n", "print('shape=%s, type=%s, missing_value=%s' % \\\n", " (soilm.shape, type(soilm), soilmvar.missing_value))\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "cs = plt.contourf(soilm)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 32, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "source": [ "##Packed integer data\n", "There is a similar feature for variables with `scale_factor` and `add_offset` attributes.\n", "\n", "- short integer data will automatically be returned as float data, with the scale and offset applied. " ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 32, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Dealing with dates and times\n", "- time variables usually measure relative to a fixed date using a certain calendar, with units specified like ***`hours since YY:MM:DD hh-mm-ss`***.\n", "- **`num2date`** and **`date2num`** convenience functions provided to convert between these numeric time coordinates and handy python datetime instances. \n", "- **`date2index`** finds the time index corresponding to a datetime instance." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 34 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "name of time dimension = time2\n", "units = Hour since 2015-07-11T06:00:00Z, values = [ 0. 3. 6. 9. 12. 15. 18. 21. 24. 27. 30. 33.\n", " 36. 39. 42. 45. 48. 51. 54. 57. 60. 63. 66. 69.\n", " 72. 75. 78. 81. 84. 87. 90. 93. 96. 99. 102. 105.\n", " 108. 111. 114. 117. 120. 123. 126. 129. 132. 135. 138. 141.\n", " 144. 147. 150. 153. 156. 159. 162. 165. 168. 171. 174. 177.\n", " 180. 183. 186. 189. 192. 195. 198. 201. 204. 207. 210. 213.\n", " 216. 219. 222. 225. 228. 231. 234. 237. 240. 252. 264. 276.\n", " 288. 300. 312. 324. 336. 348. 360. 372. 384.]\n" ] } ], "source": [ "from netCDF4 import num2date, date2num, date2index\n", "timedim = sfctmp.dimensions[0] # time dim name\n", "print('name of time dimension = %s' % timedim)\n", "times = gfs.variables[timedim] # time coord var\n", "print('units = %s, values = %s' % (times.units, times[:]))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 35, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['2015-07-11 06:00:00', '2015-07-11 09:00:00', '2015-07-11 12:00:00', '2015-07-11 15:00:00', '2015-07-11 18:00:00', '2015-07-11 21:00:00', '2015-07-12 00:00:00', '2015-07-12 03:00:00', '2015-07-12 06:00:00', '2015-07-12 09:00:00']\n" ] } ], "source": [ "dates = num2date(times[:], times.units)\n", "print([date.strftime('%Y-%m-%d %H:%M:%S') for date in dates[:10]]) # print only first ten..." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 35, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "###Get index associated with a specified date, extract forecast data for that date." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 37 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2015-07-14 07:22:39.579246\n", "index = 24, date = 2015-07-14 06:00:00\n" ] } ], "source": [ "from datetime import datetime, timedelta\n", "date = datetime.now() + timedelta(days=3)\n", "print(date)\n", "ntime = date2index(date,times,select='nearest')\n", "print('index = %s, date = %s' % (ntime, dates[ntime]))" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 38 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "###Get temp forecast for Boulder (near 40N, -105W)\n", "- use function **`getcloses_ij`** we created before..." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 39, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Boulder forecast valid at 2015-07-14 06:00:00 UTC = 296.8 K\n" ] } ], "source": [ "lats, lons = gfs.variables['lat'][:], gfs.variables['lon'][:]\n", "# lats, lons are 1-d. Make them 2-d using numpy.meshgrid.\n", "lons, lats = np.meshgrid(lons,lats)\n", "j, i = getclosest_ij(lats,lons,40,-105)\n", "fcst_temp = sfctmp[ntime,j,i]\n", "print('Boulder forecast valid at %s UTC = %5.1f %s' % \\\n", " (dates[ntime],fcst_temp,sfctmp.units))" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 39, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "##Simple multi-file aggregation\n", "\n", "What if you have a bunch of netcdf files, each with data for a different year, and you want to access all the data as if it were in one file?" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 41 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-rw-r--r-- 1 jwhitaker staff 8985332 Jul 10 06:43 data/prmsl.2000.nc\r\n", "-rw-r--r-- 1 jwhitaker staff 8968789 Jul 10 06:43 data/prmsl.2001.nc\r\n", "-rw-r--r-- 1 jwhitaker staff 8972796 Jul 10 06:43 data/prmsl.2002.nc\r\n", "-rw-r--r-- 1 jwhitaker staff 8974435 Jul 10 06:43 data/prmsl.2003.nc\r\n", "-rw-r--r-- 1 jwhitaker staff 8997438 Jul 10 06:43 data/prmsl.2004.nc\r\n", "-rw-r--r-- 1 jwhitaker staff 8976678 Jul 10 06:43 data/prmsl.2005.nc\r\n", "-rw-r--r-- 1 jwhitaker staff 8969714 Jul 10 06:43 data/prmsl.2006.nc\r\n", "-rw-r--r-- 1 jwhitaker staff 8974360 Jul 10 06:43 data/prmsl.2007.nc\r\n", "-rw-r--r-- 1 jwhitaker staff 8994260 Jul 10 06:43 data/prmsl.2008.nc\r\n", "-rw-r--r-- 1 jwhitaker staff 8974678 Jul 10 06:43 data/prmsl.2009.nc\r\n", "-rw-r--r-- 1 jwhitaker staff 8970732 Jul 10 06:43 data/prmsl.2010.nc\r\n", "-rw-r--r-- 1 jwhitaker staff 8976285 Jul 10 06:43 data/prmsl.2011.nc\r\n" ] } ], "source": [ "!ls -l data/prmsl*nc" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 42 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "**`MFDataset`** uses file globbing to patch together all the files into one big Dataset.\n", "You can also pass it a list of specific files.\n", "\n", "Limitations:\n", "\n", "- It can only aggregate the data along the leftmost dimension of each variable.\n", "- only works with `NETCDF3`, or `NETCDF4_CLASSIC` formatted files.\n", "- kind of slow." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 43, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "starting date = 2000-01-01 00:00:00\n", "ending date = 2011-12-31 00:00:00\n", "times shape = 4383\n", "prmsl dimensions = (u'time', u'lat', u'lon'), prmsl shape = (4383, 91, 180)\n" ] } ], "source": [ "mf = netCDF4.MFDataset('data/prmsl*nc')\n", "times = mf.variables['time']\n", "dates = num2date(times[:],times.units)\n", "print('starting date = %s' % dates[0])\n", "print('ending date = %s'% dates[-1])\n", "prmsl = mf.variables['prmsl']\n", "print('times shape = %s' % times.shape)\n", "print('prmsl dimensions = %s, prmsl shape = %s' %\\\n", " (prmsl.dimensions, prmsl.shape))" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 43, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Closing your netCDF file\n", "\n", "It's good to close netCDF files, but not actually necessary when Dataset is open for read access only.\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 45 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "f.close()\n", "gfs.close()" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 45, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "-" } }, "source": [ "##That's it!\n", "\n", "Now you're ready to start exploring your data interactively.\n", "\n", "To be continued with **Writing netCDF data** ...." ] } ], "metadata": { "celltoolbar": "Raw Cell Format", "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.9" } }, "nbformat": 4, "nbformat_minor": 0 } netcdf4-python-1.5.8rel/examples/subset.py000066400000000000000000000012071413751447500206060ustar00rootroot00000000000000# use 'orthogonal indexing' feature to subselect data over CONUS. import netCDF4 import numpy as np import matplotlib.pyplot as plt # use real data from CFS reanalysis. # note: we're reading GRIB2 data! URL="http://nomads.ncdc.noaa.gov/thredds/dodsC/modeldata/cmd_flxf/2010/201007/20100701/flxf00.gdas.2010070100.grb2" nc = netCDF4.Dataset(URL) lats = nc.variables['lat'][:]; lons = nc.variables['lon'][:] latselect = np.logical_and(lats>25,lats<50) lonselect = np.logical_and(lons>230,lons<305) data = nc.variables['Soil_moisture_content'][0,0,latselect,lonselect] plt.contourf(data[::-1]) # flip latitudes so they go south -> north plt.show() netcdf4-python-1.5.8rel/examples/test_stringarr.py000066400000000000000000000035331413751447500223570ustar00rootroot00000000000000from netCDF4 import Dataset, stringtochar, chartostring import random, numpy # test utilities for converting arrays of fixed-length strings # to arrays of characters (with an extra dimension), and vice-versa. # netCDF does not have a fixed-length string data-type (only characters # and variable length strings). The convenience function chartostring # converts an array of characters to an array of fixed-length strings. # The array of fixed length strings has one less dimension, and the # length of the strings is equal to the rightmost dimension of the # array of characters. The convenience function stringtochar goes # the other way, converting an array of fixed-length strings to an # array of characters with an extra dimension (the number of characters # per string) appended on the right. FILE_NAME = 'tst_stringarr.nc' FILE_FORMAT = 'NETCDF4_CLASSIC' chars = '1234567890aabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' nc = Dataset(FILE_NAME,'w',format=FILE_FORMAT) n2 = 10; nchar = 12; nrecs = 4 nc.createDimension('n1',None) nc.createDimension('n2',n2) nc.createDimension('nchar',nchar) v = nc.createVariable('strings','S1',('n1','n2','nchar')) for nrec in range(nrecs): data = [] data = numpy.empty((n2,),'S'+repr(nchar)) # fill data with random nchar character strings for n in range(n2): data[n] = ''.join([random.choice(chars) for i in range(nchar)]) print(nrec,data) # convert data to array of characters with an extra dimension # (the number of characters per string) added to the right. datac = stringtochar(data) v[nrec] = datac nc.close() nc = Dataset(FILE_NAME) v = nc.variables['strings'] print(v.shape, v.dtype) for nrec in range(nrecs): # read character array back, convert to an array of strings # of length equal to the rightmost dimension. print(nrec, chartostring(v[nrec])) nc.close() netcdf4-python-1.5.8rel/examples/threaded_read.py000066400000000000000000000033001413751447500220500ustar00rootroot00000000000000from __future__ import print_function from netCDF4 import Dataset from numpy.testing import assert_array_equal, assert_array_almost_equal import numpy as np import threading import queue import time # demonstrate reading of different files from different threads. # Releasing the Global Interpreter Lock (GIL) when calling the # netcdf C library for read operations speeds up the reads # when threads are used (issue 369). # Test script contributed by Ryan May of Unidata. # Make some files nfiles = 4 fnames = []; datal = [] for i in range(nfiles): fname = 'test%d.nc' % i fnames.append(fname) nc = Dataset(fname, 'w') data = np.random.randn(500, 500, 500) datal.append(data) nc.createDimension('x', 500) nc.createDimension('y', 500) nc.createDimension('z', 500) var = nc.createVariable('grid', 'f', ('x', 'y', 'z')) var[:] = data nc.close() # Queue them up items = queue.Queue() for data,fname in zip(datal,fnames): items.put(fname) # Function for threads to use def get_data(serial=None): if serial is None: # if not called from a thread fname = items.get() else: fname = fnames[serial] nc = Dataset(fname, 'r') data2 = nc.variables['grid'][:] # make sure the data is correct #assert_array_almost_equal(data2,datal[int(fname[4])]) nc.close() if serial is None: items.task_done() # Time it (no threading). start = time.time() for i in range(nfiles): get_data(serial=i) end = time.time() print('no threads, time = ',end - start) # with threading. start = time.time() for i in range(nfiles): threading.Thread(target=get_data).start() items.join() end = time.time() print('with threading, time = ',end - start) netcdf4-python-1.5.8rel/examples/tutorial.py000066400000000000000000000322441413751447500211510ustar00rootroot00000000000000from netCDF4 import Dataset # code from tutorial. # create a file (Dataset object, also the root group). rootgrp = Dataset('test.nc', 'w', format='NETCDF4') print(rootgrp.file_format) rootgrp.close() # create some groups. rootgrp = Dataset('test.nc', 'a') fcstgrp = rootgrp.createGroup('forecasts') analgrp = rootgrp.createGroup('analyses') fcstgrp1 = rootgrp.createGroup('/forecasts/model1') fcstgrp2 = rootgrp.createGroup('/forecasts/model2') # walk the group tree using a Python generator. def walktree(top): yield top.groups.values() for value in top.groups.values(): yield from walktree(value) print(rootgrp) for children in walktree(rootgrp): for child in children: print(child) # dimensions. level = rootgrp.createDimension('level', None) time = rootgrp.createDimension('time', None) lat = rootgrp.createDimension('lat', 73) lon = rootgrp.createDimension('lon', 144) print(rootgrp.dimensions) print(len(lon)) print(lon.isunlimited()) print(time.isunlimited()) for dimobj in rootgrp.dimensions.values(): print(dimobj) print(time) # variables. times = rootgrp.createVariable('time','f8',('time',)) levels = rootgrp.createVariable('level','i4',('level',)) latitudes = rootgrp.createVariable('lat','f4',('lat',)) longitudes = rootgrp.createVariable('lon','f4',('lon',)) # 2 unlimited dimensions. #temp = rootgrp.createVariable('temp','f4',('time','level','lat','lon',)) # this makes the compression 'lossy' (preserving a precision of 1/1000) # try it and see how much smaller the file gets. temp = rootgrp.createVariable('temp','f4',('time','level','lat','lon',),least_significant_digit=3) print(temp) # create variable in a group using a path. temp = rootgrp.createVariable('/forecasts/model1/temp','f4',('time','level','lat','lon',)) print(rootgrp['/forecasts/model1']) # print the Group instance print(rootgrp['/forecasts/model1/temp']) # print the Variable instance # attributes. import time rootgrp.description = 'bogus example script' rootgrp.history = 'Created ' + time.ctime(time.time()) rootgrp.source = 'netCDF4 python module tutorial' latitudes.units = 'degrees north' longitudes.units = 'degrees east' levels.units = 'hPa' temp.units = 'K' times.units = 'hours since 0001-01-01 00:00:00.0' times.calendar = 'gregorian' for name in rootgrp.ncattrs(): print('Global attr', name, '=', getattr(rootgrp,name)) print(rootgrp) print(rootgrp.__dict__) print(rootgrp.variables) import numpy as np # no unlimited dimension, just assign to slice. lats = np.arange(-90,91,2.5) lons = np.arange(-180,180,2.5) latitudes[:] = lats longitudes[:] = lons print('latitudes =\n',latitudes[:]) print('longitudes =\n',longitudes[:]) # append along two unlimited dimensions by assigning to slice. nlats = len(rootgrp.dimensions['lat']) nlons = len(rootgrp.dimensions['lon']) print('temp shape before adding data = ',temp.shape) from numpy.random.mtrand import uniform # random number generator. temp[0:5,0:10,:,:] = uniform(size=(5,10,nlats,nlons)) print('temp shape after adding data = ',temp.shape) # levels have grown, but no values yet assigned. print('levels shape after adding pressure data = ',levels.shape) # assign values to levels dimension variable. levels[:] = [1000.,850.,700.,500.,300.,250.,200.,150.,100.,50.] # fancy slicing tempdat = temp[::2, [1,3,6], lats>0, lons>0] print('shape of fancy temp slice = ',tempdat.shape) print(temp[0, 0, [0,1,2,3], [0,1,2,3]].shape) # fill in times. from datetime import datetime, timedelta from netCDF4 import num2date, date2num, date2index dates = [datetime(2001,3,1)+n*timedelta(hours=12) for n in range(temp.shape[0])] times[:] = date2num(dates,units=times.units,calendar=times.calendar) print("time values (in units {}):\n{}".format(times.units, times[:])) dates = num2date(times[:],units=times.units,calendar=times.calendar) print("dates corresponding to time values:\n{}".format(dates)) rootgrp.close() # create a series of netCDF files with a variable sharing # the same unlimited dimension. for nfile in range(10): f = Dataset('mftest'+repr(nfile)+'.nc','w',format='NETCDF4_CLASSIC') f.createDimension('x',None) x = f.createVariable('x','i',('x',)) x[0:10] = np.arange(nfile*10,10*(nfile+1)) f.close() # now read all those files in at once, in one Dataset. from netCDF4 import MFDataset f = MFDataset('mftest*nc') print(f.variables['x'][:]) # example showing how to save numpy complex arrays using compound types. f = Dataset('complex.nc','w') size = 3 # length of 1-d complex array # create sample complex data. datac = np.exp(1j*(1.+np.linspace(0, np.pi, size))) print(datac.dtype) # create complex128 compound data type. complex128 = np.dtype([('real',np.float64),('imag',np.float64)]) complex128_t = f.createCompoundType(complex128,'complex128') # create a variable with this data type, write some data to it. f.createDimension('x_dim',None) v = f.createVariable('cmplx_var',complex128_t,'x_dim') data = np.empty(size,complex128) # numpy structured array data['real'] = datac.real; data['imag'] = datac.imag v[:] = data # close and reopen the file, check the contents. f.close() f = Dataset('complex.nc') print(f) print(f.variables['cmplx_var']) print(f.cmptypes) print(f.cmptypes['complex128']) v = f.variables['cmplx_var'] print(v.shape) datain = v[:] # read in all the data into a numpy structured array # create an empty numpy complex array datac2 = np.empty(datain.shape,np.complex128) # .. fill it with contents of structured array. datac2.real = datain['real'] datac2.imag = datain['imag'] print(datac.dtype,datac) print(datac2.dtype,datac2) # more complex compound type example. f = Dataset('compound_example.nc','w') # create a new dataset. # create an unlimited dimension call 'station' f.createDimension('station',None) # define a compound data type (can contain arrays, or nested compound types). winddtype = np.dtype([('speed','f4'),('direction','i4')]) statdtype = np.dtype([('latitude', 'f4'), ('longitude', 'f4'), ('surface_wind',winddtype), ('temp_sounding','f4',10),('press_sounding','i4',10), ('location_name','S12')]) # use this data type definitions to create a compound data types # called using the createCompoundType Dataset method. # create a compound type for vector wind which will be nested inside # the station data type. This must be done first! wind_data_t = f.createCompoundType(winddtype,'wind_data') # now that wind_data_t is defined, create the station data type. station_data_t = f.createCompoundType(statdtype,'station_data') # create nested compound data types to hold the units variable attribute. winddtype_units = np.dtype([('speed','S12'),('direction','S12')]) statdtype_units = np.dtype([('latitude', 'S12'), ('longitude', 'S12'), ('surface_wind',winddtype_units), ('temp_sounding','S12'), ('location_name','S12'), ('press_sounding','S12')]) # create the wind_data_units type first, since it will nested inside # the station_data_units data type. wind_data_units_t = f.createCompoundType(winddtype_units,'wind_data_units') station_data_units_t =\ f.createCompoundType(statdtype_units,'station_data_units') # create a variable of of type 'station_data_t' statdat = f.createVariable('station_obs', station_data_t, ('station',)) # create a numpy structured array, assign data to it. data = np.empty(1,statdtype) data['latitude'] = 40. data['longitude'] = -105. data['surface_wind']['speed'] = 12.5 data['surface_wind']['direction'] = 270 data['temp_sounding'] = (280.3,272.,270.,269.,266.,258.,254.1,250.,245.5,240.) data['press_sounding'] = range(800,300,-50) data['location_name'] = 'Boulder, CO' # assign structured array to variable slice. statdat[0] = data # or just assign a tuple of values to variable slice # (will automatically be converted to a structured array). statdat[1] = np.array((40.78,-73.99,(-12.5,90), (290.2,282.5,279.,277.9,276.,266.,264.1,260.,255.5,243.), range(900,400,-50),'New York, NY'),data.dtype) print(f.cmptypes) windunits = np.empty(1,winddtype_units) stationobs_units = np.empty(1,statdtype_units) windunits['speed'] = 'm/s' windunits['direction'] = 'degrees' stationobs_units['latitude'] = 'degrees N' stationobs_units['longitude'] = 'degrees W' stationobs_units['surface_wind'] = windunits stationobs_units['location_name'] = 'None' stationobs_units['temp_sounding'] = 'Kelvin' stationobs_units['press_sounding'] = 'hPa' print(stationobs_units.dtype) statdat.units = stationobs_units # close and reopen the file. f.close() f = Dataset('compound_example.nc') print(f) statdat = f.variables['station_obs'] print(statdat) # print out data in variable. print('data in a variable of compound type:') print(statdat[:]) f.close() f = Dataset('tst_vlen.nc','w') vlen_t = f.createVLType(np.int32, 'phony_vlen') x = f.createDimension('x',3) y = f.createDimension('y',4) vlvar = f.createVariable('phony_vlen_var', vlen_t, ('y','x')) import random data = np.empty(len(y)*len(x),object) for n in range(len(y)*len(x)): data[n] = np.arange(random.randint(1,10),dtype='int32')+1 data = np.reshape(data,(len(y),len(x))) vlvar[:] = data print(vlvar) print('vlen variable =\n',vlvar[:]) print(f) print(f.variables['phony_vlen_var']) print(f.vltypes['phony_vlen']) z = f.createDimension('z', 10) strvar = f.createVariable('strvar',str,'z') chars = '1234567890aabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' data = np.empty(10,object) for n in range(10): stringlen = random.randint(2,12) data[n] = ''.join([random.choice(chars) for i in range(stringlen)]) strvar[:] = data print('variable-length string variable:\n',strvar[:]) print(f) print(f.variables['strvar']) f.close() # Enum type example. f = Dataset('clouds.nc','w') # python dict describing the allowed values and their names. enum_dict = {'Altocumulus': 7, 'Missing': 255, 'Stratus': 2, 'Clear': 0, 'Nimbostratus': 6, 'Cumulus': 4, 'Altostratus': 5, 'Cumulonimbus': 1, 'Stratocumulus': 3} # create the Enum type called 'cloud_t'. cloud_type = f.createEnumType(np.uint8,'cloud_t',enum_dict) print(cloud_type) time = f.createDimension('time',None) # create a 1d variable of type 'cloud_type' called 'primary_clouds'. # The fill_value is set to the 'Missing' named value. cloud_var = f.createVariable('primary_cloud',cloud_type,'time',\ fill_value=enum_dict['Missing']) # write some data to the variable. cloud_var[:] = [enum_dict['Clear'],enum_dict['Stratus'],enum_dict['Cumulus'],\ enum_dict['Missing'],enum_dict['Cumulonimbus']] # close file, reopen it. f.close() f = Dataset('clouds.nc') cloud_var = f.variables['primary_cloud'] print(cloud_var) print(cloud_var.datatype.enum_dict) print(cloud_var[:]) f.close() # dealing with strings from netCDF4 import stringtochar nc = Dataset('stringtest.nc','w',format='NETCDF4_CLASSIC') nc.createDimension('nchars',3) nc.createDimension('nstrings',None) v = nc.createVariable('strings','S1',('nstrings','nchars')) datain = np.array(['foo','bar'],dtype='S3') v[:] = stringtochar(datain) # manual conversion to char array print(v[:]) # data returned as char array v._Encoding = 'ascii' # this enables automatic conversion v[:] = datain # conversion to char array done internally print(v[:]) # data returned in numpy string array nc.close() # strings in compound types nc = Dataset('compoundstring_example.nc','w') dtype = np.dtype([('observation', 'f4'), ('station_name','S12')]) station_data_t = nc.createCompoundType(dtype,'station_data') nc.createDimension('station',None) statdat = nc.createVariable('station_obs', station_data_t, ('station',)) data = np.empty(2,station_data_t.dtype_view) data['observation'][:] = (123.,3.14) data['station_name'][:] = ('Boulder','New York') print(statdat.dtype) # strings actually stored as character arrays statdat[:] = data # strings converted to character arrays internally print(statdat[:]) # character arrays converted back to strings print(statdat[:].dtype) statdat.set_auto_chartostring(False) # turn off auto-conversion statdat[:] = data.view(station_data_t.dtype) print(statdat[:]) # now structured array with char array subtype is returned nc.close() # create a diskless (in-memory) Dataset, and persist the file # to disk when it is closed. nc = Dataset('diskless_example.nc','w',diskless=True,persist=True) d = nc.createDimension('x',None) v = nc.createVariable('v',np.int32,'x') v[0:5] = np.arange(5) print(nc) print(nc['v'][:]) nc.close() # file saved to disk # create an in-memory dataset from an existing python memory # buffer. # read the newly created netcdf file into a python bytes object. f = open('diskless_example.nc', 'rb') nc_bytes = f.read(); f.close() # create a netCDF in-memory dataset from the bytes object. nc = Dataset('inmemory.nc', memory=nc_bytes) print(nc) print(nc['v'][:]) nc.close() # create an in-memory Dataset and retrieve memory buffer # estimated size is 1028 bytes - this is actually only # used if format is NETCDF3 (ignored for NETCDF4/HDF5 files). nc = Dataset('inmemory.nc', mode='w',memory=1028) d = nc.createDimension('x',None) v = nc.createVariable('v',np.int32,'x') v[0:5] = np.arange(5) nc_buf = nc.close() # close returns memoryview print(type(nc_buf)) # save nc_buf to disk, read it back in and check. f = open('inmemory.nc', 'wb') f.write(nc_buf); f.close() nc = Dataset('inmemory.nc') print(nc) print(nc['v'][:]) nc.close() netcdf4-python-1.5.8rel/examples/writing_netCDF.ipynb000066400000000000000000001074141413751447500226470ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": { "internals": { "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "# Writing netCDF data\n", "\n", "**Important Note**: when running this notebook interactively in a browser, you probably will not be able to execute individual cells out of order without getting an error. Instead, choose \"Run All\" from the Cell menu after you modify a cell." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false, "internals": { "frag_number": 1, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "import netCDF4 # Note: python is case-sensitive!\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 1, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Opening a file, creating a new Dataset\n", "\n", "Let's create a new, empty netCDF file named 'data/new.nc', opened for writing.\n", "\n", "Be careful, opening a file with 'w' will clobber any existing data (unless `clobber=False` is used, in which case an exception is raised if the file already exists).\n", "\n", "- `mode='r'` is the default.\n", "- `mode='a'` opens an existing file and allows for appending (does not clobber existing data)\n", "- `format` can be one of `NETCDF3_CLASSIC`, `NETCDF3_64BIT`, `NETCDF4_CLASSIC` or `NETCDF4` (default). `NETCDF4_CLASSIC` uses HDF5 for the underlying storage layer (as does `NETCDF4`) but enforces the classic netCDF 3 data model so data can be read with older clients. " ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 3, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "root group (NETCDF4_CLASSIC data model, file format HDF5):\n", " dimensions(sizes): \n", " variables(dimensions): \n", " groups: \n", "\n" ] } ], "source": [ "try: ncfile.close() # just to be safe, make sure dataset is not already open.\n", "except: pass\n", "ncfile = netCDF4.Dataset('data/new.nc',mode='w',format='NETCDF4_CLASSIC') \n", "print(ncfile)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 3, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Creating dimensions\n", "\n", "The **ncfile** object we created is a container for _dimensions_, _variables_, and _attributes_. First, let's create some dimensions using the [`createDimension`](http://unidata.github.io/netcdf4-python/netCDF4.Dataset-class.html#createDimension) method. \n", "\n", "- Every dimension has a name and a length. \n", "- The name is a string that is used to specify the dimension to be used when creating a variable, and as a key to access the dimension object in the `ncfile.dimensions` dictionary.\n", "\n", "Setting the dimension length to `0` or `None` makes it unlimited, so it can grow. \n", "\n", "- For `NETCDF4` files, any variable's dimension can be unlimited. \n", "- For `NETCDF4_CLASSIC` and `NETCDF3*` files, only one per variable can be unlimited, and it must be the leftmost (fastest varying) dimension." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 5, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('lat', : name = 'lat', size = 73\n", ")\n", "('lon', : name = 'lon', size = 144\n", ")\n", "('time', (unlimited): name = 'time', size = 0\n", ")\n" ] } ], "source": [ "lat_dim = ncfile.createDimension('lat', 73) # latitude axis\n", "lon_dim = ncfile.createDimension('lon', 144) # longitude axis\n", "time_dim = ncfile.createDimension('time', None) # unlimited axis (can be appended to).\n", "for dim in ncfile.dimensions.items():\n", " print(dim)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 5, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Creating attributes\n", "\n", "netCDF attributes can be created just like you would for any python object. \n", "\n", "- Best to adhere to established conventions (like the [CF](http://cfconventions.org/) conventions)\n", "- We won't try to adhere to any specific convention here though." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 7 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "My model data\n" ] } ], "source": [ "ncfile.title='My model data'\n", "print(ncfile.title)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 8, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "source": [ "Try adding some more attributes..." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 8, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Creating variables\n", "\n", "Now let's add some variables and store some data in them. \n", "\n", "- A variable has a name, a type, a shape, and some data values. \n", "- The shape of a variable is specified by a tuple of dimension names. \n", "- A variable should also have some named attributes, such as 'units', that describe the data.\n", "\n", "The [`createVariable`](http://unidata.github.io/netcdf4-python/netCDF4.Dataset-class.html#createVariable) method takes 3 mandatory args.\n", "\n", "- the 1st argument is the variable name (a string). This is used as the key to access the variable object from the `variables` dictionary.\n", "- the 2nd argument is the datatype (most numpy datatypes supported). \n", "- the third argument is a tuple containing the dimension names (the dimensions must be created first). Unless this is a `NETCDF4` file, any unlimited dimension must be the leftmost one.\n", "- there are lots of optional arguments (many of which are only relevant when `format='NETCDF4'`) to control compression, chunking, fill_value, etc.\n" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 10, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "float64 temp(time, lat, lon)\n", " units: K\n", " standard_name: air_temperature\n", "unlimited dimensions: time\n", "current shape = (0, 73, 144)\n", "filling on, default _FillValue of 9.96920996839e+36 used\n", "\n" ] } ], "source": [ "# Define two variables with the same names as dimensions,\n", "# a conventional way to define \"coordinate variables\".\n", "lat = ncfile.createVariable('lat', np.float32, ('lat',))\n", "lat.units = 'degrees_north'\n", "lat.long_name = 'latitude'\n", "lon = ncfile.createVariable('lon', np.float32, ('lon',))\n", "lon.units = 'degrees_east'\n", "lon.long_name = 'longitude'\n", "time = ncfile.createVariable('time', np.float64, ('time',))\n", "time.units = 'hours since 1800-01-01'\n", "time.long_name = 'time'\n", "# Define a 3D variable to hold the data\n", "temp = ncfile.createVariable('temp',np.float64,('time','lat','lon')) # note: unlimited dimension is leftmost\n", "temp.units = 'K' # degrees Kelvin\n", "temp.standard_name = 'air_temperature' # this is a CF standard name\n", "print(temp)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 10, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Pre-defined variable attributes (read only)\n", "\n", "The netCDF4 module provides some useful pre-defined Python attributes for netCDF variables, such as dimensions, shape, dtype, ndim. \n", "\n", "Note: since no data has been written yet, the length of the 'time' dimension is 0." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 12, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-- Some pre-defined attributes for variable temp:\n", "('temp.dimensions:', (u'time', u'lat', u'lon'))\n", "('temp.shape:', (0, 73, 144))\n", "('temp.dtype:', dtype('float64'))\n", "('temp.ndim:', 3)\n" ] } ], "source": [ "print(\"-- Some pre-defined attributes for variable temp:\")\n", "print(\"temp.dimensions:\", temp.dimensions)\n", "print(\"temp.shape:\", temp.shape)\n", "print(\"temp.dtype:\", temp.dtype)\n", "print(\"temp.ndim:\", temp.ndim)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 12, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Writing data\n", "\n", "To write data to a netCDF variable object, just treat it like a numpy array and assign values to a slice." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 14 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('-- Wrote data, temp.shape is now ', (3, 73, 144))\n", "('-- Min/Max values:', 280.00283562143028, 329.99987991477548)\n" ] } ], "source": [ "nlats = len(lat_dim); nlons = len(lon_dim); ntimes = 3\n", "# Write latitudes, longitudes.\n", "# Note: the \":\" is necessary in these \"write\" statements\n", "lat[:] = -90. + (180./nlats)*np.arange(nlats) # south pole to north pole\n", "lon[:] = (180./nlats)*np.arange(nlons) # Greenwich meridian eastward\n", "# create a 3D array of random numbers\n", "data_arr = np.random.uniform(low=280,high=330,size=(ntimes,nlats,nlons))\n", "# Write the data. This writes the whole 3D netCDF variable all at once.\n", "temp[:,:,:] = data_arr # Appends data along unlimited dimension\n", "print(\"-- Wrote data, temp.shape is now \", temp.shape)\n", "# read data back from variable (by slicing it), print min and max\n", "print(\"-- Min/Max values:\", temp[:,:,:].min(), temp[:,:,:].max())" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 15, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "source": [ "- You can just treat a netCDF Variable object like a numpy array and assign values to it.\n", "- Variables automatically grow along unlimited dimensions (unlike numpy arrays)\n", "- The above writes the whole 3D variable all at once, but you can write it a slice at a time instead.\n", "\n", "Let's add another time slice....\n" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 15, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('-- Wrote more data, temp.shape is now ', (4, 73, 144))\n" ] } ], "source": [ "# create a 2D array of random numbers\n", "data_slice = np.random.uniform(low=280,high=330,size=(nlats,nlons))\n", "temp[3,:,:] = data_slice # Appends the 4th time slice\n", "print(\"-- Wrote more data, temp.shape is now \", temp.shape)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 17 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "Note that we have not yet written any data to the time variable. It automatically grew as we appended data along the time dimension to the variable `temp`, but the data is missing." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 18, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "float64 time(time)\n", " units: hours since 1800-01-01\n", " long_name: time\n", "unlimited dimensions: time\n", "current shape = (4,)\n", "filling on, default _FillValue of 9.96920996839e+36 used\n", "\n", "(, masked_array(data = [-- -- -- --],\n", " mask = [ True True True True],\n", " fill_value = 9.96920996839e+36)\n", ")\n" ] } ], "source": [ "print(time)\n", "times_arr = time[:]\n", "print(type(times_arr),times_arr) # dashes indicate masked values (where data has not yet been written)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 18, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "Let's add write some data into the time variable. \n", "\n", "- Given a set of datetime instances, use date2num to convert to numeric time values and then write that data to the variable." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 20, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[datetime.datetime(2014, 10, 1, 0, 0), datetime.datetime(2014, 10, 2, 0, 0), datetime.datetime(2014, 10, 3, 0, 0), datetime.datetime(2014, 10, 4, 0, 0)]\n", "(array([ 1882440., 1882464., 1882488., 1882512.]), u'hours since 1800-01-01')\n", "[datetime.datetime(2014, 10, 1, 0, 0) datetime.datetime(2014, 10, 2, 0, 0)\n", " datetime.datetime(2014, 10, 3, 0, 0) datetime.datetime(2014, 10, 4, 0, 0)]\n" ] } ], "source": [ "from datetime import datetime\n", "from netCDF4 import date2num,num2date\n", "# 1st 4 days of October.\n", "dates = [datetime(2014,10,1,0),datetime(2014,10,2,0),datetime(2014,10,3,0),datetime(2014,10,4,0)]\n", "print(dates)\n", "times = date2num(dates, time.units)\n", "print(times, time.units) # numeric values\n", "time[:] = times\n", "# read time data back, convert to datetime instances, check values.\n", "print(num2date(time[:],time.units))" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 20, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Closing a netCDF file\n", "\n", "It's **important** to close a netCDF file you opened for writing:\n", "\n", "- flushes buffers to make sure all data gets written\n", "- releases memory resources used by open netCDF files" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 22, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "root group (NETCDF4_CLASSIC data model, file format HDF5):\n", " title: My model data\n", " dimensions(sizes): lat(73), lon(144), time(4)\n", " variables(dimensions): float32 \u001b[4mlat\u001b[0m(lat), float32 \u001b[4mlon\u001b[0m(lon), float64 \u001b[4mtime\u001b[0m(time), float64 \u001b[4mtemp\u001b[0m(time,lat,lon)\n", " groups: \n", "\n", "Dataset is closed!\n" ] } ], "source": [ "# first print the Dataset object to see what we've got\n", "print(ncfile)\n", "# close the Dataset.\n", "ncfile.close(); print('Dataset is closed!')" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 22, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "# Advanced features\n", "\n", "So far we've only exercised features associated with the old netCDF version 3 data model. netCDF version 4 adds a lot of new functionality that comes with the more flexible HDF5 storage layer. \n", "\n", "Let's create a new file with `format='NETCDF4'` so we can try out some of these features." ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "root group (NETCDF4 data model, file format HDF5):\n", " dimensions(sizes): \n", " variables(dimensions): \n", " groups: \n", "\n" ] } ], "source": [ "ncfile = netCDF4.Dataset('data/new2.nc','w',format='NETCDF4')\n", "print(ncfile)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 25, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Creating Groups\n", "\n", "netCDF version 4 added support for organizing data in hierarchical groups.\n", "\n", "- analagous to directories in a filesystem. \n", "- Groups serve as containers for variables, dimensions and attributes, as well as other groups. \n", "- A `netCDF4.Dataset` creates a special group, called the 'root group', which is similar to the root directory in a unix filesystem. \n", "\n", "- groups are created using the [`createGroup`](http://unidata.github.io/netcdf4-python/netCDF4.Dataset-class.html#createGroup) method.\n", "- takes a single argument (a string, which is the name of the Group instance). This string is used as a key to access the group instances in the `groups` dictionary.\n", "\n", "Here we create two groups to hold data for two different model runs." ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 27, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('model_run1', \n", "group /model_run1:\n", " dimensions(sizes): \n", " variables(dimensions): \n", " groups: \n", ")\n", "('model_run2', \n", "group /model_run2:\n", " dimensions(sizes): \n", " variables(dimensions): \n", " groups: \n", ")\n" ] } ], "source": [ "grp1 = ncfile.createGroup('model_run1')\n", "grp2 = ncfile.createGroup('model_run2')\n", "for grp in ncfile.groups.items():\n", " print(grp)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 27, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "Create some dimensions in the root group." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 29 }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "lat_dim = ncfile.createDimension('lat', 73) # latitude axis\n", "lon_dim = ncfile.createDimension('lon', 144) # longitude axis\n", "time_dim = ncfile.createDimension('time', None) # unlimited axis (can be appended to)." ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 30 }, "slideshow": { "slide_type": "fragment" } }, "source": [ "Now create a variable in grp1 and grp2. The library will search recursively upwards in the group tree to find the dimensions (which in this case are defined one level up).\n", "\n", "- These variables are create with **zlib compression**, another nifty feature of netCDF 4. \n", "- The data are automatically compressed when data is written to the file, and uncompressed when the data is read. \n", "- This can really save disk space, especially when used in conjunction with the [**least_significant_digit**](http://unidata.github.io/netcdf4-python/netCDF4.Dataset-class.html#createVariable) keyword argument, which causes the data to be quantized (truncated) before compression. This makes the compression lossy, but more efficient." ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 31, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('model_run1', \n", "group /model_run1:\n", " dimensions(sizes): \n", " variables(dimensions): float64 \u001b[4mtemp\u001b[0m(time,lat,lon)\n", " groups: \n", ")\n", "('model_run2', \n", "group /model_run2:\n", " dimensions(sizes): \n", " variables(dimensions): float64 \u001b[4mtemp\u001b[0m(time,lat,lon)\n", " groups: \n", ")\n" ] } ], "source": [ "temp1 = grp1.createVariable('temp',np.float64,('time','lat','lon'),zlib=True)\n", "temp2 = grp2.createVariable('temp',np.float64,('time','lat','lon'),zlib=True)\n", "for grp in ncfile.groups.items(): # shows that each group now contains 1 variable\n", " print(grp)" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 31, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "##Creating a variable with a compound data type\n", "\n", "- Compound data types map directly to numpy structured (a.k.a 'record' arrays). \n", "- Structured arrays are akin to C structs, or derived types in Fortran. \n", "- They allow for the construction of table-like structures composed of combinations of other data types, including other compound types. \n", "- Might be useful for representing multiple parameter values at each point on a grid, or at each time and space location for scattered (point) data. \n", "\n", "Here we create a variable with a compound data type to represent complex data (there is no native complex data type in netCDF). \n", "\n", "- The compound data type is created with the [`createCompoundType`](http://unidata.github.io/netcdf4-python/netCDF4.Dataset-class.html#createCompoundType) method." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 33, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "compound cmplx_var(time, lat, lon)\n", "compound data type: [('real', '\n", "vlen phony_vlen_var(time, lat, lon)\n", "vlen data type: int64\n", "path = /model_run2\n", "unlimited dimensions: time\n", "current shape = (1, 73, 144)\n", "\n", "('data =\\n', array([[[array([0, 4, 0, 9, 2, 2, 2, 4, 2]), array([7, 5, 4, 4, 9, 8, 0]),\n", " array([3, 6, 6, 8, 2, 7]), ..., array([5, 0, 0, 8, 8, 1, 5, 3]),\n", " array([4, 2, 7]), array([0])],\n", " [array([5, 6, 6, 6, 1, 0, 7]), array([7]),\n", " array([7, 5, 8, 9, 6, 9, 3]), ..., array([0, 6, 5, 4]),\n", " array([7, 1, 9, 7, 7, 2]), array([1, 4, 0])],\n", " [array([4, 3, 1]), array([6, 3, 9, 7, 8]), array([8]), ...,\n", " array([6, 5, 8, 0]), array([0]), array([0, 9, 6, 2, 4])],\n", " ..., \n", " [array([8, 4, 4]), array([4, 1, 6]), array([1, 4, 2, 3, 9]), ...,\n", " array([9, 1]), array([7, 2, 5, 1, 5, 8, 2]),\n", " array([2, 9, 9, 1, 4, 6, 3, 5, 2])],\n", " [array([4, 7, 9, 8, 2, 3, 6, 6]),\n", " array([1, 4, 1, 6, 1, 1, 2, 3, 9]),\n", " array([9, 5, 6, 2, 4, 3, 8, 2, 9]), ..., array([9, 5, 7]),\n", " array([3, 9]), array([4, 2, 6, 9])],\n", " [array([8, 9, 9, 2, 2, 8, 8, 5]), array([3]),\n", " array([8, 8, 0, 2, 9, 2, 3, 0, 9]), ..., array([7]),\n", " array([5, 1, 0, 6, 8, 6]), array([8, 6, 3, 6, 9, 8, 4, 2, 5])]]], dtype=object))\n" ] } ], "source": [ "vlen_data = np.empty((nlats,nlons),object)\n", "for i in range(nlons):\n", " for j in range(nlats):\n", " size = np.random.randint(1,10,size=1) # random length of sequence\n", " vlen_data[j,i] = np.random.randint(0,10,size=size)# generate random sequence\n", "vlvar[0] = vlen_data # append along unlimited dimension (time)\n", "print(vlvar)\n", "print('data =\\n',vlvar[:])" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 39, "slide_type": "subslide" }, "slideshow": { "slide_type": "slide" } }, "source": [ "Close the Dataset and examine the contents with ncdump." ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false, "internals": { "frag_helper": "fragment_end", "frag_number": 41, "slide_helper": "subslide_end" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "netcdf new2 {\r\n", "types:\r\n", " compound complex128 {\r\n", " double real ;\r\n", " double imag ;\r\n", " }; // complex128\r\n", " int64(*) phony_vlen ;\r\n", "dimensions:\r\n", "\tlat = 73 ;\r\n", "\tlon = 144 ;\r\n", "\ttime = UNLIMITED ; // (1 currently)\r\n", "\r\n", "group: model_run1 {\r\n", " variables:\r\n", " \tdouble temp(time, lat, lon) ;\r\n", " \tcomplex128 cmplx_var(time, lat, lon) ;\r\n", " } // group model_run1\r\n", "\r\n", "group: model_run2 {\r\n", " variables:\r\n", " \tdouble temp(time, lat, lon) ;\r\n", " \tphony_vlen phony_vlen_var(time, lat, lon) ;\r\n", " } // group model_run2\r\n", "}\r\n" ] } ], "source": [ "ncfile.close()\n", "!ncdump -h data/new2.nc" ] }, { "cell_type": "markdown", "metadata": { "internals": { "frag_helper": "fragment_end", "frag_number": 41, "slide_helper": "subslide_end", "slide_type": "subslide" }, "slide_helper": "slide_end", "slideshow": { "slide_type": "slide" } }, "source": [ "##Other interesting and useful projects using netcdf4-python\n", "\n", "- [xarray](https://xarray.pydata.org/en/stable/): N-dimensional variant of the core [pandas](https://pandas.pydata.org) data structure that can operate on netcdf variables.\n", "- [Iris](https://scitools.org.uk/iris/docs/latest/): a data model to create a data abstraction layer which isolates analysis and visualisation code from data format specifics. Uses netcdf4-python to access netcdf data (can also handle GRIB).\n", "- [Dask](https://dask.org/): Virtual large arrays (from netcdf variables) with lazy evaluation.\n", "- [cf-python](https://cfpython.bitbucket.io/): Implements the [CF](http://cfconventions.org) data model for the reading, writing and processing of data and metadata. " ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.9" } }, "nbformat": 4, "nbformat_minor": 0 } netcdf4-python-1.5.8rel/include/000077500000000000000000000000001413751447500165345ustar00rootroot00000000000000netcdf4-python-1.5.8rel/include/membuf.pyx000066400000000000000000000016701413751447500205550ustar00rootroot00000000000000# Creates a memoryview from a malloced C pointer, # which will be freed when the python object is garbage collected. # Code found here is derived from # http://stackoverflow.com/a/28166272/428751 from cpython.buffer cimport PyBuffer_FillInfo from libc.stdlib cimport free # create a python memoryview object from a raw pointer. cdef memview_fromptr(void *memory, size_t size): cdef _MemBuf buf = _MemBuf() buf.memory = memory # malloced void pointer buf.size = size # size of pointer in bytes return memoryview(buf) # private extension type that implements buffer protocal. cdef class _MemBuf: cdef const void *memory cdef size_t size def __getbuffer__(self, Py_buffer *buf, int flags): PyBuffer_FillInfo(buf, self, self.memory, self.size, 1, flags) def __releasebuffer__(self, Py_buffer *buf): # why doesn't this do anything?? pass def __dealloc__(self): free(self.memory) netcdf4-python-1.5.8rel/include/mpi-compat.h000066400000000000000000000004401413751447500207510ustar00rootroot00000000000000/* Author: Lisandro Dalcin */ /* Contact: dalcinl@gmail.com */ #ifndef MPI_COMPAT_H #define MPI_COMPAT_H #include #if (MPI_VERSION < 3) && !defined(PyMPI_HAVE_MPI_Message) typedef void *PyMPI_MPI_Message; #define MPI_Message PyMPI_MPI_Message #endif #endif/*MPI_COMPAT_H*/ netcdf4-python-1.5.8rel/include/netCDF4.pxi000066400000000000000000001100241413751447500204430ustar00rootroot00000000000000# size_t, ptrdiff_t are defined in stdlib.h cdef extern from "stdlib.h": ctypedef long size_t ctypedef long ptrdiff_t # hdf5 version info. cdef extern from "H5public.h": ctypedef int herr_t int H5get_libversion( unsigned int *majnum, unsigned int *minnum, unsigned int *relnum ) cdef extern from *: ctypedef char* const_char_ptr "const char*" # netcdf functions. cdef extern from "netcdf.h": ctypedef int nclong ctypedef int nc_type ctypedef struct nc_vlen_t: size_t len # Length of VL data (in base type units) void *p # Pointer to VL data float NC_FILL_FLOAT long NC_FILL_INT double NC_FILL_DOUBLE char NC_FILL_CHAR long long NC_FILL_INT64 unsigned long NC_FILL_UINT unsigned long long NC_FILL_UINT64 cdef enum: NC_NAT # NAT = 'Not A Type' (c.f. NaN) NC_BYTE # signed 1 byte integer NC_CHAR # ISO/ASCII character NC_SHORT # signed 2 byte integer NC_INT # signed 4 byte integer NC_LONG # deprecated, but required for backward compatibility. NC_FLOAT # single precision floating point number NC_DOUBLE # double precision floating point number NC_UBYTE # unsigned 1 byte int NC_USHORT # unsigned 2-byte int NC_UINT # unsigned 4-byte int NC_INT64 # signed 8-byte int NC_UINT64 # unsigned 8-byte int NC_STRING # string NC_VLEN # used internally for vlen types NC_OPAQUE # used internally for opaque types NC_COMPOUND # used internally for compound types NC_ENUM # used internally for enum types. # Use these 'mode' flags for nc_open. NC_NOWRITE # default is read only NC_WRITE # read & write # Use these 'mode' flags for nc_create. NC_CLOBBER NC_NOCLOBBER # Don't destroy existing file on create NC_64BIT_OFFSET # Use large (64-bit) file offsets NC_64BIT_DATA # Use cdf-5 format NC_NETCDF4 # Use netCDF-4/HDF5 format NC_CLASSIC_MODEL # Enforce strict netcdf-3 rules. # Use these 'mode' flags for both nc_create and nc_open. NC_SHARE # Share updates, limit cacheing # The following flag currently is ignored, but use in # nc_open() or nc_create() may someday support use of advisory # locking to prevent multiple writers from clobbering a file NC_LOCK # Use locking if available # Default fill values, used unless _FillValue attribute is set. # These values are stuffed into newly allocated space as appropriate. # The hope is that one might use these to notice that a particular datum # has not been set. NC_FILL_BYTE #NC_FILL_CHAR NC_FILL_SHORT #NC_FILL_INT #NC_FILL_FLOAT #NC_FILL_DOUBLE NC_FILL_UBYTE NC_FILL_USHORT #NC_FILL_UINT #NC_FILL_INT64 #NC_FILL_UINT64 # These represent the max and min values that can be stored in a # netCDF file for their associated types. Recall that a C compiler # may define int to be any length it wants, but a NC_INT is *always* # a 4 byte signed int. On a platform with has 64 bit ints, there will # be many ints which are outside the range supported by NC_INT. But # since NC_INT is an external format, it has to mean the same thing # everywhere. NC_MAX_BYTE NC_MIN_BYTE NC_MAX_CHAR NC_MAX_SHORT NC_MIN_SHORT NC_MAX_INT NC_MIN_INT NC_MAX_FLOAT NC_MIN_FLOAT NC_MAX_DOUBLE8 NC_MIN_DOUBLE NC_MAX_UBYTE NC_MAX_USHORT NC_MAX_UINT NC_MAX_INT64 NC_MIN_INT64 NC_MAX_UINT64 X_INT64_MAX X_INT64_MIN X_UINT64_MAX # The above values are defaults. # If you wish a variable to use a different value than the above # defaults, create an attribute with the same type as the variable # and the following reserved name. The value you give the attribute # will be used as the fill value for that variable. _FillValue NC_FILL NC_NOFILL # Starting with version 3.6, there are different format netCDF # files. 4.0 instroduces the third one. These defines are only for # the nc_set_default_format function. NC_FORMAT_CLASSIC NC_FORMAT_64BIT NC_FORMAT_64BIT_OFFSET NC_FORMAT_64BIT_DATA NC_FORMAT_NETCDF4 NC_FORMAT_NETCDF4_CLASSIC NC_FORMAT_NC3 NC_FORMAT_NC_HDF4 NC_FORMAT_NC_HDF5 NC_FORMAT_DAP2 NC_FORMAT_DAP4 NC_FORMAT_PNETCDF NC_FORMAT_UNDEFINED # Let nc__create() or nc__open() figure out # as suitable chunk size. NC_SIZEHINT_DEFAULT # In nc__enddef(), align to the chunk size. NC_ALIGN_CHUNK # 'size' argument to ncdimdef for an unlimited dimension NC_UNLIMITED # attribute id to put/get a global attribute NC_GLOBAL # These maximums are enforced by the interface, to facilitate writing # applications and utilities. However, nothing is statically allocated to # these sizes internally. NC_MAX_DIMS NC_MAX_ATTRS NC_MAX_VARS NC_MAX_NAME NC_MAX_VAR_DIMS # Algorithms for netcdf-4 chunking. NC_CHUNK_SEQ NC_CHUNK_SUB NC_CHUNK_SIZES NC_CHUNKED NC_CONTIGUOUS # The netcdf version 3 functions all return integer error status. # These are the possible values, in addition to certain # values from the system errno.h. NC_ISSYSERR NC_NOERR NC2_ERR NC_EBADID NC_ENFILE NC_EEXIST NC_EINVAL NC_EPERM NC_ENOTINDEFINE NC_EINDEFINE NC_EINVALCOORDS NC_EMAXDIMS NC_ENAMEINUSE NC_ENOTATT NC_EMAXATTS NC_EBADTYPE NC_EBADDIM NC_EUNLIMPOS NC_EMAXVARS NC_ENOTVAR NC_EGLOBAL NC_ENOTNC NC_ESTS NC_EMAXNAME NC_EUNLIMIT NC_ENORECVARS NC_ECHAR NC_EEDGE NC_ESTRIDE NC_EBADNAME # N.B. following must match value in ncx.h NC_ERANGE # Math result not representable NC_ENOMEM # Memory allocation (malloc) failure NC_EVARSIZE # One or more variable sizes violate format constraints NC_EDIMSIZE # Invalid dimension size NC_ETRUNC # NetCDFFile likely truncated or possibly corrupted # The following was added in support of netcdf-4. Make all netcdf-4 # error codes < -100 so that errors can be added to netcdf-3 if # needed. NC4_FIRST_ERROR NC_EHDFERR NC_ECANTREAD NC_ECANTWRITE NC_ECANTCREATE NC_EFILEMETA NC_EDIMMETA NC_EATTMETA NC_EVARMETA NC_ENOCOMPOUND NC_EATTEXISTS NC_ENOTNC4 NC_ESTRICTNC3 NC_ENOTNC3 NC_ENOPAR NC_EPARINIT NC_EBADGRPID NC_EBADTYPID NC_ETYPDEFINED NC_EBADFIELD NC_EBADCLASS NC4_LAST_ERROR NC_ENDIAN_NATIVE NC_ENDIAN_LITTLE NC_ENDIAN_BIG NC_SZIP_EC_OPTION_MASK # entropy encoding NC_SZIP_NN_OPTION_MASK # nearest neighbor encoding const_char_ptr *nc_inq_libvers() nogil const_char_ptr *nc_strerror(int ncerr) int nc_create(char *path, int cmode, int *ncidp) int nc__create(char *path, int cmode, size_t initialsz, size_t *chunksizehintp, int *ncidp) int nc_open(char *path, int mode, int *ncidp) int nc__open(char *path, int mode, size_t *chunksizehintp, int *ncidp) int nc_inq_path(int ncid, size_t *pathlen, char *path) nogil int nc_inq_format_extended(int ncid, int *formatp, int* modep) nogil int nc_inq_ncid(int ncid, char *name, int *grp_ncid) nogil int nc_inq_grps(int ncid, int *numgrps, int *ncids) nogil int nc_inq_grpname(int ncid, char *name) nogil int nc_inq_grp_parent(int ncid, int *parent_ncid) nogil int nc_inq_varids(int ncid, int *nvars, int *varids) nogil int nc_inq_dimids(int ncid, int *ndims, int *dimids, int include_parents) nogil int nc_def_grp(int parent_ncid, char *name, int *new_ncid) int nc_def_compound(int ncid, size_t size, char *name, nc_type *typeidp) int nc_insert_compound(int ncid, nc_type xtype, char *name, size_t offset, nc_type field_typeid) int nc_insert_array_compound(int ncid, nc_type xtype, char *name, size_t offset, nc_type field_typeid, int ndims, int *dim_sizes) int nc_inq_type(int ncid, nc_type xtype, char *name, size_t *size) nogil int nc_inq_compound(int ncid, nc_type xtype, char *name, size_t *size, size_t *nfieldsp) nogil int nc_inq_compound_name(int ncid, nc_type xtype, char *name) nogil int nc_inq_compound_size(int ncid, nc_type xtype, size_t *size) nogil int nc_inq_compound_nfields(int ncid, nc_type xtype, size_t *nfieldsp) nogil int nc_inq_compound_field(int ncid, nc_type xtype, int fieldid, char *name, size_t *offsetp, nc_type *field_typeidp, int *ndimsp, int *dim_sizesp) nogil int nc_inq_compound_fieldname(int ncid, nc_type xtype, int fieldid, char *name) nogil int nc_inq_compound_fieldindex(int ncid, nc_type xtype, char *name, int *fieldidp) nogil int nc_inq_compound_fieldoffset(int ncid, nc_type xtype, int fieldid, size_t *offsetp) nogil int nc_inq_compound_fieldtype(int ncid, nc_type xtype, int fieldid, nc_type *field_typeidp) nogil int nc_inq_compound_fieldndims(int ncid, nc_type xtype, int fieldid, int *ndimsp) nogil int nc_inq_compound_fielddim_sizes(int ncid, nc_type xtype, int fieldid, int *dim_sizes) nogil int nc_def_vlen(int ncid, char *name, nc_type base_typeid, nc_type *xtypep) int nc_inq_vlen(int ncid, nc_type xtype, char *name, size_t *datum_sizep, nc_type *base_nc_typep) nogil int nc_inq_user_type(int ncid, nc_type xtype, char *name, size_t *size, nc_type *base_nc_typep, size_t *nfieldsp, int *classp) nogil int nc_inq_typeids(int ncid, int *ntypes, int *typeids) nogil int nc_put_att(int ncid, int varid, char *name, nc_type xtype, size_t len, void *op) int nc_get_att(int ncid, int varid, char *name, void *ip) nogil int nc_get_att_string(int ncid, int varid, char *name, char **ip) nogil int nc_put_att_string(int ncid, int varid, char *name, size_t len, char **op) nogil int nc_def_opaque(int ncid, size_t size, char *name, nc_type *xtypep) int nc_inq_opaque(int ncid, nc_type xtype, char *name, size_t *sizep) int nc_put_att_opaque(int ncid, int varid, char *name, size_t len, void *op) int nc_get_att_opaque(int ncid, int varid, char *name, void *ip) int nc_put_cmp_att_opaque(int ncid, nc_type xtype, int fieldid, char *name, size_t len, void *op) int nc_get_cmp_att_opaque(int ncid, nc_type xtype, int fieldid, char *name, void *ip) int nc_put_var1(int ncid, int varid, size_t *indexp, void *op) int nc_get_var1(int ncid, int varid, size_t *indexp, void *ip) int nc_put_vara(int ncid, int varid, size_t *startp, size_t *countp, void *op) int nc_get_vara(int ncid, int varid, size_t *startp, size_t *countp, void *ip) nogil int nc_put_vars(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, void *op) int nc_get_vars(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, void *ip) nogil int nc_put_varm(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, void *op) int nc_get_varm(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, void *ip) int nc_put_var(int ncid, int varid, void *op) int nc_get_var(int ncid, int varid, void *ip) int nc_def_var_deflate(int ncid, int varid, int shuffle, int deflate, int deflate_level) int nc_def_var_fletcher32(int ncid, int varid, int fletcher32) int nc_inq_var_fletcher32(int ncid, int varid, int *fletcher32p) nogil int nc_def_var_chunking(int ncid, int varid, int contiguous, size_t *chunksizesp) int nc_def_var_fill(int ncid, int varid, int no_fill, void *fill_value) int nc_def_var_endian(int ncid, int varid, int endian) int nc_inq_var_chunking(int ncid, int varid, int *contiguousp, size_t *chunksizesp) nogil int nc_inq_var_deflate(int ncid, int varid, int *shufflep, int *deflatep, int *deflate_levelp) nogil int nc_inq_var_fill(int ncid, int varid, int *no_fill, void *fill_value) nogil int nc_inq_var_endian(int ncid, int varid, int *endianp) nogil int nc_set_fill(int ncid, int fillmode, int *old_modep) int nc_set_default_format(int format, int *old_formatp) int nc_redef(int ncid) int nc__enddef(int ncid, size_t h_minfree, size_t v_align, size_t v_minfree, size_t r_align) int nc_enddef(int ncid) int nc_sync(int ncid) int nc_abort(int ncid) int nc_close(int ncid) int nc_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp) nogil int nc_inq_ndims(int ncid, int *ndimsp) nogil int nc_inq_nvars(int ncid, int *nvarsp) nogil int nc_inq_natts(int ncid, int *nattsp) nogil int nc_inq_unlimdim(int ncid, int *unlimdimidp) nogil int nc_inq_unlimdims(int ncid, int *nunlimdimsp, int *unlimdimidsp) nogil int nc_inq_format(int ncid, int *formatp) nogil int nc_def_dim(int ncid, char *name, size_t len, int *idp) int nc_inq_dimid(int ncid, char *name, int *idp) nogil int nc_inq_dim(int ncid, int dimid, char *name, size_t *lenp) nogil int nc_inq_dimname(int ncid, int dimid, char *name) nogil int nc_inq_dimlen(int ncid, int dimid, size_t *lenp) nogil int nc_rename_dim(int ncid, int dimid, char *name) int nc_inq_att(int ncid, int varid, char *name, nc_type *xtypep, size_t *lenp) nogil int nc_inq_attid(int ncid, int varid, char *name, int *idp) nogil int nc_inq_atttype(int ncid, int varid, char *name, nc_type *xtypep) nogil int nc_inq_attlen(int ncid, int varid, char *name, size_t *lenp) nogil int nc_inq_attname(int ncid, int varid, int attnum, char *name) nogil int nc_copy_att(int ncid_in, int varid_in, char *name, int ncid_out, int varid_out) int nc_rename_att(int ncid, int varid, char *name, char *newname) int nc_del_att(int ncid, int varid, char *name) int nc_put_att_text(int ncid, int varid, char *name, size_t len, char *op) int nc_get_att_text(int ncid, int varid, char *name, char *ip) nogil int nc_put_att_uchar(int ncid, int varid, char *name, nc_type xtype, size_t len, unsigned char *op) int nc_get_att_uchar(int ncid, int varid, char *name, unsigned char *ip) int nc_put_att_schar(int ncid, int varid, char *name, nc_type xtype, size_t len, signed char *op) int nc_get_att_schar(int ncid, int varid, char *name, signed char *ip) int nc_put_att_short(int ncid, int varid, char *name, nc_type xtype, size_t len, short *op) int nc_get_att_short(int ncid, int varid, char *name, short *ip) int nc_put_att_int(int ncid, int varid, char *name, nc_type xtype, size_t len, int *op) int nc_get_att_int(int ncid, int varid, char *name, int *ip) int nc_put_att_long(int ncid, int varid, char *name, nc_type xtype, size_t len, long *op) int nc_get_att_long(int ncid, int varid, char *name, long *ip) int nc_put_att_float(int ncid, int varid, char *name, nc_type xtype, size_t len, float *op) int nc_get_att_float(int ncid, int varid, char *name, float *ip) int nc_put_att_double(int ncid, int varid, char *name, nc_type xtype, size_t len, double *op) int nc_get_att_double(int ncid, int varid, char *name, double *ip) int nc_put_att_ushort(int ncid, int varid, char *name, nc_type xtype, size_t len, unsigned short *op) int nc_get_att_ushort(int ncid, int varid, char *name, unsigned short *ip) int nc_put_att_uint(int ncid, int varid, char *name, nc_type xtype, size_t len, unsigned int *op) int nc_get_att_uint(int ncid, int varid, char *name, unsigned int *ip) int nc_put_att_longlong(int ncid, int varid, char *name, nc_type xtype, size_t len, long long *op) int nc_get_att_longlong(int ncid, int varid, char *name, long long *ip) int nc_put_att_ulonglong(int ncid, int varid, char *name, nc_type xtype, size_t len, unsigned long long *op) int nc_get_att_ulonglong(int ncid, int varid, char *name, unsigned long long *ip) int nc_def_var(int ncid, char *name, nc_type xtype, int ndims, int *dimidsp, int *varidp) int nc_inq_var(int ncid, int varid, char *name, nc_type *xtypep, int *ndimsp, int *dimidsp, int *nattsp) nogil int nc_inq_varid(int ncid, char *name, int *varidp) nogil int nc_inq_varname(int ncid, int varid, char *name) nogil int nc_inq_vartype(int ncid, int varid, nc_type *xtypep) nogil int nc_inq_varndims(int ncid, int varid, int *ndimsp) nogil int nc_inq_vardimid(int ncid, int varid, int *dimidsp) nogil int nc_inq_varnatts(int ncid, int varid, int *nattsp) nogil int nc_rename_var(int ncid, int varid, char *name) int nc_copy_var(int ncid_in, int varid, int ncid_out) int nc_put_var1_text(int ncid, int varid, size_t *indexp, char *op) int nc_get_var1_text(int ncid, int varid, size_t *indexp, char *ip) int nc_put_var1_uchar(int ncid, int varid, size_t *indexp, unsigned char *op) int nc_get_var1_uchar(int ncid, int varid, size_t *indexp, unsigned char *ip) int nc_put_var1_schar(int ncid, int varid, size_t *indexp, signed char *op) int nc_get_var1_schar(int ncid, int varid, size_t *indexp, signed char *ip) int nc_put_var1_short(int ncid, int varid, size_t *indexp, short *op) int nc_get_var1_short(int ncid, int varid, size_t *indexp, short *ip) int nc_put_var1_int(int ncid, int varid, size_t *indexp, int *op) int nc_get_var1_int(int ncid, int varid, size_t *indexp, int *ip) int nc_put_var1_long(int ncid, int varid, size_t *indexp, long *op) int nc_get_var1_long(int ncid, int varid, size_t *indexp, long *ip) int nc_put_var1_float(int ncid, int varid, size_t *indexp, float *op) int nc_get_var1_float(int ncid, int varid, size_t *indexp, float *ip) int nc_put_var1_double(int ncid, int varid, size_t *indexp, double *op) int nc_get_var1_double(int ncid, int varid, size_t *indexp, double *ip) int nc_put_var1_ubyte(int ncid, int varid, size_t *indexp, unsigned char *op) int nc_get_var1_ubyte(int ncid, int varid, size_t *indexp, unsigned char *ip) int nc_put_var1_ushort(int ncid, int varid, size_t *indexp, unsigned short *op) int nc_get_var1_ushort(int ncid, int varid, size_t *indexp, unsigned short *ip) int nc_put_var1_uint(int ncid, int varid, size_t *indexp, unsigned int *op) int nc_get_var1_uint(int ncid, int varid, size_t *indexp, unsigned int *ip) int nc_put_var1_longlong(int ncid, int varid, size_t *indexp, long long *op) int nc_get_var1_longlong(int ncid, int varid, size_t *indexp, long long *ip) int nc_put_var1_ulonglong(int ncid, int varid, size_t *indexp, unsigned long long *op) int nc_get_var1_ulonglong(int ncid, int varid, size_t *indexp, unsigned long long *ip) int nc_put_vara_text(int ncid, int varid, size_t *startp, size_t *countp, char *op) int nc_get_vara_text(int ncid, int varid, size_t *startp, size_t *countp, char *ip) int nc_put_vara_uchar(int ncid, int varid, size_t *startp, size_t *countp, unsigned char *op) int nc_get_vara_uchar(int ncid, int varid, size_t *startp, size_t *countp, unsigned char *ip) int nc_put_vara_schar(int ncid, int varid, size_t *startp, size_t *countp, signed char *op) int nc_get_vara_schar(int ncid, int varid, size_t *startp, size_t *countp, signed char *ip) int nc_put_vara_short(int ncid, int varid, size_t *startp, size_t *countp, short *op) int nc_get_vara_short(int ncid, int varid, size_t *startp, size_t *countp, short *ip) int nc_put_vara_int(int ncid, int varid, size_t *startp, size_t *countp, int *op) int nc_get_vara_int(int ncid, int varid, size_t *startp, size_t *countp, int *ip) int nc_put_vara_long(int ncid, int varid, size_t *startp, size_t *countp, long *op) int nc_get_vara_long(int ncid, int varid, size_t *startp, size_t *countp, long *ip) int nc_put_vara_float(int ncid, int varid, size_t *startp, size_t *countp, float *op) int nc_get_vara_float(int ncid, int varid, size_t *startp, size_t *countp, float *ip) int nc_put_vara_double(int ncid, int varid, size_t *startp, size_t *countp, double *op) int nc_get_vara_double(int ncid, int varid, size_t *startp, size_t *countp, double *ip) int nc_put_vara_ubyte(int ncid, int varid, size_t *startp, size_t *countp, unsigned char *op) int nc_get_vara_ubyte(int ncid, int varid, size_t *startp, size_t *countp, unsigned char *ip) int nc_put_vara_ushort(int ncid, int varid, size_t *startp, size_t *countp, unsigned short *op) int nc_get_vara_ushort(int ncid, int varid, size_t *startp, size_t *countp, unsigned short *ip) int nc_put_vara_uint(int ncid, int varid, size_t *startp, size_t *countp, unsigned int *op) int nc_get_vara_uint(int ncid, int varid, size_t *startp, size_t *countp, unsigned int *ip) int nc_put_vara_longlong(int ncid, int varid, size_t *startp, size_t *countp, long long *op) int nc_get_vara_longlong(int ncid, int varid, size_t *startp, size_t *countp, long long *ip) int nc_put_vara_ulonglong(int ncid, int varid, size_t *startp, size_t *countp, unsigned long long *op) int nc_get_vara_ulonglong(int ncid, int varid, size_t *startp, size_t *countp, unsigned long long *ip) int nc_put_vars_text(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, char *op) int nc_get_vars_text(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, char *ip) int nc_put_vars_uchar(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, unsigned char *op) int nc_get_vars_uchar(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, unsigned char *ip) int nc_put_vars_schar(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, signed char *op) int nc_get_vars_schar(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, signed char *ip) int nc_put_vars_short(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, short *op) int nc_get_vars_short(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, short *ip) int nc_put_vars_int(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, int *op) int nc_get_vars_int(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, int *ip) int nc_put_vars_long(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, long *op) int nc_get_vars_long(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, long *ip) int nc_put_vars_float(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, float *op) int nc_get_vars_float(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, float *ip) int nc_put_vars_double(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, double *op) int nc_get_vars_double(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, double *ip) int nc_put_vars_ubyte(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, unsigned char *op) int nc_get_vars_ubyte(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, unsigned char *ip) int nc_put_vars_ushort(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, unsigned short *op) int nc_get_vars_ushort(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, unsigned short *ip) int nc_put_vars_uint(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, unsigned int *op) int nc_get_vars_uint(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, unsigned int *ip) int nc_put_vars_longlong(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, long long *op) int nc_get_vars_longlong(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, long long *ip) int nc_put_vars_ulonglong(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, unsigned long long *op) int nc_get_vars_ulonglong(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, unsigned long long *ip) int nc_put_varm_text(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, char *op) int nc_get_varm_text(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, char *ip) int nc_put_varm_uchar(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, unsigned char *op) int nc_get_varm_uchar(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, unsigned char *ip) int nc_put_varm_schar(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, signed char *op) int nc_get_varm_schar(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, signed char *ip) int nc_put_varm_short(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, short *op) int nc_get_varm_short(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, short *ip) int nc_put_varm_int(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, int *op) int nc_get_varm_int(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, int *ip) int nc_put_varm_long(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, long *op) int nc_get_varm_long(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, long *ip) int nc_put_varm_float(int ncid, int varid,size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, float *op) int nc_get_varm_float(int ncid, int varid,size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, float *ip) int nc_put_varm_double(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t *imapp, double *op) int nc_get_varm_double(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t * imapp, double *ip) int nc_put_varm_ubyte(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t * imapp, unsigned char *op) int nc_get_varm_ubyte(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t * imapp, unsigned char *ip) int nc_put_varm_ushort(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t * imapp, unsigned short *op) int nc_get_varm_ushort(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t * imapp, unsigned short *ip) int nc_put_varm_uint(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t * imapp, unsigned int *op) int nc_get_varm_uint(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t * imapp, unsigned int *ip) int nc_put_varm_longlong(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t * imapp, long long *op) int nc_get_varm_longlong(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t * imapp, long long *ip) int nc_put_varm_ulonglong(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t * imapp, unsigned long long *op) int nc_get_varm_ulonglong(int ncid, int varid, size_t *startp, size_t *countp, ptrdiff_t *stridep, ptrdiff_t * imapp, unsigned long long *ip) int nc_put_var_text(int ncid, int varid, char *op) int nc_get_var_text(int ncid, int varid, char *ip) int nc_put_var_uchar(int ncid, int varid, unsigned char *op) int nc_get_var_uchar(int ncid, int varid, unsigned char *ip) int nc_put_var_schar(int ncid, int varid, signed char *op) int nc_get_var_schar(int ncid, int varid, signed char *ip) int nc_put_var_short(int ncid, int varid, short *op) int nc_get_var_short(int ncid, int varid, short *ip) int nc_put_var_int(int ncid, int varid, int *op) int nc_get_var_int(int ncid, int varid, int *ip) int nc_put_var_long(int ncid, int varid, long *op) int nc_get_var_long(int ncid, int varid, long *ip) int nc_put_var_float(int ncid, int varid, float *op) int nc_get_var_float(int ncid, int varid, float *ip) int nc_put_var_double(int ncid, int varid, double *op) int nc_get_var_double(int ncid, int varid, double *ip) int nc_put_var_ubyte(int ncid, int varid, unsigned char *op) int nc_get_var_ubyte(int ncid, int varid, unsigned char *ip) int nc_put_var_ushort(int ncid, int varid, unsigned short *op) int nc_get_var_ushort(int ncid, int varid, unsigned short *ip) int nc_put_var_uint(int ncid, int varid, unsigned int *op) int nc_get_var_uint(int ncid, int varid, unsigned int *ip) int nc_put_var_longlong(int ncid, int varid, long long *op) int nc_get_var_longlong(int ncid, int varid, long long *ip) int nc_put_var_ulonglong(int ncid, int varid, unsigned long long *op) int nc_get_var_ulonglong(int ncid, int varid, unsigned long long *ip) # set logging verbosity level. void nc_set_log_level(int new_level) int nc_show_metadata(int ncid) int nc_free_vlen(nc_vlen_t *vl) int nc_free_vlens(size_t len, nc_vlen_t *vl) int nc_free_string(size_t len, char **data) int nc_set_chunk_cache(size_t size, size_t nelems, float preemption) int nc_get_chunk_cache(size_t *sizep, size_t *nelemsp, float *preemptionp) int nc_set_var_chunk_cache(int ncid, int varid, size_t size, size_t nelems, float preemption) int nc_get_var_chunk_cache(int ncid, int varid, size_t *sizep, size_t *nelemsp, float *preemptionp) nogil int nc_rename_grp(int grpid, char *name) int nc_def_enum(int ncid, nc_type base_typeid, char *name, nc_type *typeidp) int nc_insert_enum(int ncid, nc_type xtype, char *name, void *value) int nc_inq_enum(int ncid, nc_type xtype, char *name, nc_type *base_nc_typep,\ size_t *base_sizep, size_t *num_membersp) nogil int nc_inq_enum_member(int ncid, nc_type xtype, int idx, char *name, void *value) nogil int nc_inq_enum_ident(int ncid, nc_type xtype, long long value, char *identifier) nogil IF HAS_NC_OPEN_MEM: cdef extern from "netcdf_mem.h": int nc_open_mem(const char *path, int mode, size_t size, void* memory, int *ncidp) IF HAS_NC_CREATE_MEM: cdef extern from "netcdf_mem.h": int nc_create_mem(const char *path, int mode, size_t initialize, int *ncidp); ctypedef struct NC_memio: size_t size void* memory int flags int nc_close_memio(int ncid, NC_memio* info); IF HAS_PARALLEL4_SUPPORT or HAS_PNETCDF_SUPPORT: cdef extern from "mpi-compat.h": pass cdef extern from "netcdf_par.h": ctypedef int MPI_Comm ctypedef int MPI_Info int nc_create_par(char *path, int cmode, MPI_Comm comm, MPI_Info info, int *ncidp); int nc_open_par(char *path, int mode, MPI_Comm comm, MPI_Info info, int *ncidp); int nc_var_par_access(int ncid, int varid, int par_access); cdef enum: NC_COLLECTIVE NC_INDEPENDENT cdef extern from "netcdf.h": cdef enum: NC_MPIIO NC_MPIPOSIX NC_PNETCDF # taken from numpy.pxi in numpy 1.0rc2. cdef extern from "numpy/arrayobject.h": ctypedef int npy_intp ctypedef extern class numpy.ndarray [object PyArrayObject]: pass npy_intp PyArray_SIZE(ndarray arr) npy_intp PyArray_ISCONTIGUOUS(ndarray arr) npy_intp PyArray_ISALIGNED(ndarray arr) void* PyArray_DATA(ndarray) nogil char* PyArray_BYTES(ndarray) nogil npy_intp* PyArray_STRIDES(ndarray) nogil void import_array() netcdf4-python-1.5.8rel/man/000077500000000000000000000000001413751447500156645ustar00rootroot00000000000000netcdf4-python-1.5.8rel/man/nc3tonc4.1000066400000000000000000000061641413751447500174100ustar00rootroot00000000000000.\" (C) Copyright 2015, Ross Gammon , .\" .TH NC3TONC4 1 "22 Mar 2015" .\" .SH NAME nc3tonc4 \- a program to convert netCDF 3 files to netCDF 4 format files .SH SYNOPSIS .B nc3tonc4 .RB [ \-h ] .RB [ \-o ] .RB [ \-\-vars=\fIvar1,var2,..\fR ] .RB [ \-\-zlib=\fI(0|1)\fR ] .RB [ \-\-complevel=\fI(1\-9)\fR ] .RB [ \-\-shuffle=\fI(0|1)\fR ] .RB [ \-\-fletcher32=\fI(0|1)\fR ] .RB [ \-\-unpackshort=\fI(0|1)\fR ] .RB [ \-\-quantize=\fIvar1=n1,var2=n2,..\fR ] .I netcdf3filename .I netcdf4filename .br .SH DESCRIPTION This manual page documents briefly the .B nc3tonc4 command. .PP \fBnc3tonc4\fP is a program that converts a netCDF 3 file into netCDF 4 format, optionally unpacking variables packed as short integers (with scale_factor and add_offset) to floats, and adding zlib compression (with the HDF5 shuffle filter and fletcher32 checksum). Data may also be quantized (truncated) to a specified precision to improve compression. .SH OPTIONS These programs follow the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. .TP .B \-h Shows a summary of the available options. .TP .B \-o Overwrite destination file (default is to raise an error if output file already exists). .TP .B \-\-vars A comma separated list of variable names to copy (default is to copy all variables). .TP .B \-\-classic=(0|1) Use NETCDF4_CLASSIC format instead of NETCDF4 (default = 1). .TP .B \-\-zlib=(0|1) Activate (or disable) zlib compression (the default is to activate). .TP .B \-\-complevel=(1-9) Set the zlib compression level (6 is default). .TP .B \-\-shuffle=(0|1) Activate (or disable) the shuffle filter (it is active by default). .TP .B \-\-fletcher32=(0|1) Activate (or disable) the fletcher32 checksum (it is not active by default). .TP .B \-\-unpackshort=(0|1) Unpack short integer variables to float variables using scale_factor and add_offset netCDF variable attributes (it is active by default). .TP .B \-\-quantize=(comma separated list of "variable name=integer" pairs) Truncate the data in the specified variables to a given decimal precision. For example, 'speed=2, height=-2, temp=0' will cause the variable 'speed' to be truncated to a precision of 0.01, 'height' to a precision of 100 and 'temp' to 1. This can significantly improve compression. The default is not to quantize any of the variables. .TP .B \-\-quiet=(0|1) If set to 1, don't print any diagnostic information. .TP .B \-\-chunk=(integer) The number of records along unlimited dimension to write at once. The default is 10. It is ignored if there is no unlimited dimension. If chunk=0, it means write all the data at once. .TP .B \-\-istart=(integer) The number of the record to start at along unlimited dimension. The default is 0. This option is ignored if there is no unlimited dimension. .TP .B \-\-istop=(integer) The number of the record to stop at along unlimited dimension. The default is 1. This option is ignored if there is no unlimited dimension. .SH SEE ALSO .BR ncinfo (1), .BR nc4tonc3 (1). .br .SH AUTHOR This manual page was written by Ross Gammon based on the options displayed by nc3tonc4 \-h. netcdf4-python-1.5.8rel/man/nc4tonc3.1000066400000000000000000000025361413751447500174070ustar00rootroot00000000000000.\" (C) Copyright 2015, Ross Gammon , .\" .TH NC4TONC3 1 "22 Mar 2015" .\" .SH NAME nc4tonc3 \- a program to convert a classic netCDF 4 file to netCDF 3 format .SH SYNOPSIS .B nc4tonc3 .RB [ \-h ] .RB [ \-o ] .RB [ \-\-chunk ] .I netcdf4filename .I netcdf3filename .br .SH DESCRIPTION This manual page documents briefly the .B nc4tonc3 command. .PP \fBnc4tonc3\fP is a program that converts a netCDF 4 file (in NETCDF4_CLASSIC format) to netCDF 3 format. .SH OPTIONS These programs follow the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. .TP .B \-h Shows a summary of the available options. .TP .B \-o Overwrite destination file (default is to raise an error if output file already exists). .TP .B \-\-quiet=(0|1) If set to 1, don't print any diagnostic information. .TP .B \-\-format Choose the netcdf3 format to use. NETCDF3_64BIT is used by default, or it can be set to NETCDF3_CLASSIC. .TP .B \-\-chunk=(integer) The number of records along unlimited dimension to write at once. The default is 10. It is ignored if there is no unlimited dimension. If chunk=0, this means write all the data at once. .SH SEE ALSO .BR ncinfo (1), .BR nc3tonc4 (1). .br .SH AUTHOR This manual page was written by Ross Gammon based on the options displayed by nc3tonc4 \-h. netcdf4-python-1.5.8rel/man/ncinfo.1000066400000000000000000000024401413751447500172220ustar00rootroot00000000000000.\" (C) Copyright 2015, Ross Gammon , .\" .TH NCINFO 1 "22 Mar 2015" .\" .SH NAME ncinfo \- a program to print summary information about a netCDF file .SH SYNOPSIS .B ncinfo .RB [ \-h ] .RB [ \-g|\-\-group=\fIgrp\fR ] .RB [ \-v|\-\-variable=\fIvar\fR ] .RB [ \-d|\-\-dimension=\fIdim\fR ] .I filename .br .SH DESCRIPTION This manual page documents briefly the .B ncinfo command. .PP \fBncinfo\fP is a program that prints summary information about a netCDF file .SH OPTIONS These programs follow the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. .TP .B \-h Shows a summary of the available options. .TP .B \-g grp, \-\-group=grp Prints information for this group. The default group is the root group. Nested groups are specified using posix paths e.g. group1/group2/group3. .TP .B \-v , \-\-variable= Prints information for this variable. .TP .B \-d , \-\-dimension= Prints information for this dimension. .TP The filename of the netCDF file must be supplied as the last argument. .SH SEE ALSO .BR nc3tonc4 (1), .BR nc4tonc3 (1). .br .SH AUTHOR This manual page was written by Ross Gammon based on the options displayed by ncinfo \-h. netcdf4-python-1.5.8rel/setup.cfg000066400000000000000000000045311413751447500167350ustar00rootroot00000000000000# Rename this file to setup.cfg to set build options. # Follow instructions below for editing. [options] # if true, the nc-config script (installed with netcdf 4.1.2 and higher) # will be used to determine the locations of required libraries. # Usually, nothing else is needed. use_ncconfig=True # path to nc-config script (use if not found in unix PATH). #ncconfig=/usr/local/bin/nc-config [directories] # # If nc-config doesn't do the trick, you can specify the locations # of the libraries and headers manually below # # uncomment and set to netCDF install location. # Include files should be located in netCDF4_dir/include and # the library should be located in netCDF4_dir/lib. # If the libraries and include files are installed in separate locations, # use netCDF4_libdir and netCDF4_incdir to specify the locations # separately. #netCDF4_dir = /usr/local # uncomment and set to HDF5 install location. # Include files should be located in HDF5_dir/include and # the library should be located in HDF5_dir/lib. # If the libraries and include files are installed in separate locations, # use HDF5_libdir and HDF5_incdir to specify the locations # separately. #HDF5_dir = /usr/local # if HDF5 was built with szip support as a static lib, # uncomment and set to szip lib install location. # If the libraries and include files are installed in separate locations, # use szip_libdir and szip_incdir. #szip_dir = /usr/local # if netcdf lib was build statically with HDF4 support, # uncomment and set to hdf4 lib (libmfhdf and libdf) nstall location. # If the libraries and include files are installed in separate locations, # use hdf4_libdir and hdf4_incdir. #hdf4_dir = /usr/local # if netcdf lib was build statically with HDF4 support, # uncomment and set to jpeg lib install location (hdf4 needs jpeg). # If the libraries and include files are installed in separate locations, # use jpeg_libdir and jpeg_incdir. #jpeg_dir = /usr/local # if netcdf lib was build statically with OpenDAP support, # uncomment and set to curl lib install location. # If the libraries and include files are installed in separate locations, # use curl_libdir and curl_incdir. #curl_dir = /usr/local # location of mpi.h (needed for parallel support) #mpi_incdir=/opt/local/include/mpich-mp [check-manifest] ignore = .gitignore README.gh-pages README.release examples/data/*nc examples/*ipynb netcdf4-python-1.5.8rel/setup.py000066400000000000000000000610241413751447500166260ustar00rootroot00000000000000import os, sys, subprocess import os.path as osp import configparser from setuptools import setup, Extension from distutils.dist import Distribution setuptools_extra_kwargs = { "install_requires": ["numpy>=1.9","cftime"], "setup_requires": ['setuptools>=18.0', "cython>=0.19"], "entry_points": { 'console_scripts': [ 'ncinfo = netCDF4.utils:ncinfo', 'nc4tonc3 = netCDF4.utils:nc4tonc3', 'nc3tonc4 = netCDF4.utils:nc3tonc4', ] }, } open_kwargs = {'encoding': 'utf-8'} def check_hdf5version(hdf5_includedir): try: f = open(os.path.join(hdf5_includedir, 'H5public.h'), **open_kwargs) except IOError: return None hdf5_version = None for line in f: if line.startswith('#define H5_VERS_INFO'): hdf5_version = line.split('"')[1] return hdf5_version def get_hdf5_version(direc): # check to see if hdf5 headers in direc, return version number or None hdf5_version = None sys.stdout.write('checking %s ...\n' % direc) hdf5_version = check_hdf5version(direc) if hdf5_version is None: sys.stdout.write('hdf5 headers not found in %s\n' % direc) return None else: sys.stdout.write('%s headers found in %s\n' % (hdf5_version,direc)) return hdf5_version def check_ifnetcdf4(netcdf4_includedir): try: f = open(os.path.join(netcdf4_includedir, 'netcdf.h'), **open_kwargs) except IOError: return False isnetcdf4 = False for line in f: if line.startswith('nc_inq_compound'): isnetcdf4 = True return isnetcdf4 def check_api(inc_dirs,netcdf_lib_version): has_rename_grp = False has_nc_inq_path = False has_nc_inq_format_extended = False has_cdf5_format = False has_nc_open_mem = False has_nc_create_mem = False has_parallel_support = False has_parallel4_support = False has_pnetcdf_support = False for d in inc_dirs: try: f = open(os.path.join(d, 'netcdf.h'), **open_kwargs) except IOError: continue has_nc_open_mem = os.path.exists(os.path.join(d, 'netcdf_mem.h')) for line in f: if line.startswith('nc_rename_grp'): has_rename_grp = True if line.startswith('nc_inq_path'): has_nc_inq_path = True if line.startswith('nc_inq_format_extended'): has_nc_inq_format_extended = True if line.startswith('#define NC_FORMAT_64BIT_DATA'): has_cdf5_format = True if has_nc_open_mem: try: f = open(os.path.join(d, 'netcdf_mem.h'), **open_kwargs) except IOError: continue for line in f: if line.startswith('EXTERNL int nc_create_mem'): has_nc_create_mem = True ncmetapath = os.path.join(d,'netcdf_meta.h') if os.path.exists(ncmetapath): for line in open(ncmetapath): if line.startswith('#define NC_HAS_CDF5'): has_cdf5_format = bool(int(line.split()[2])) if line.startswith('#define NC_HAS_PARALLEL'): has_parallel_support = bool(int(line.split()[2])) if line.startswith('#define NC_HAS_PARALLEL4'): has_parallel4_support = bool(int(line.split()[2])) if line.startswith('#define NC_HAS_PNETCDF'): has_pnetcdf_support = bool(int(line.split()[2])) # NC_HAS_PARALLEL4 missing in 4.6.1 (issue #964) if not has_parallel4_support and has_parallel_support and not has_pnetcdf_support: has_parallel4_support = True # for 4.6.1, if NC_HAS_PARALLEL=NC_HAS_PNETCDF=1, guess that # parallel HDF5 is enabled (must guess since there is no # NC_HAS_PARALLEL4) elif netcdf_lib_version == "4.6.1" and not has_parallel4_support and has_parallel_support: has_parallel4_support = True break return has_rename_grp, has_nc_inq_path, has_nc_inq_format_extended, \ has_cdf5_format, has_nc_open_mem, has_nc_create_mem, \ has_parallel4_support, has_pnetcdf_support def getnetcdfvers(libdirs): """ Get the version string for the first netcdf lib found in libdirs. (major.minor.release). If nothing found, return None. """ import os, re, sys, ctypes if sys.platform.startswith('win'): regexp = re.compile('^netcdf.dll$') elif sys.platform.startswith('cygwin'): bindirs = [] for d in libdirs: bindirs.append(os.path.dirname(d) + '/bin') regexp = re.compile(r'^cygnetcdf-\d.dll') elif sys.platform.startswith('darwin'): regexp = re.compile(r'^libnetcdf.dylib') else: regexp = re.compile(r'^libnetcdf.so') if sys.platform.startswith('cygwin'): dirs = bindirs else: dirs = libdirs for d in dirs: try: candidates = [x for x in os.listdir(d) if regexp.match(x)] if len(candidates) != 0: candidates.sort( key=lambda x: len(x)) # Prefer libfoo.so to libfoo.so.X.Y.Z path = os.path.abspath(os.path.join(d, candidates[0])) lib = ctypes.cdll.LoadLibrary(path) inq_libvers = lib.nc_inq_libvers inq_libvers.restype = ctypes.c_char_p vers = lib.nc_inq_libvers() return vers.split()[0] except Exception: pass # We skip invalid entries, because that's what the C compiler does return None def extract_version(CYTHON_FNAME): version = None with open(CYTHON_FNAME) as fi: for line in fi: if (line.startswith('__version__')): _, version = line.split('=') version = version.strip()[1:-1] # Remove quotation characters. break return version HDF5_dir = os.environ.get('HDF5_DIR') HDF5_incdir = os.environ.get('HDF5_INCDIR') HDF5_libdir = os.environ.get('HDF5_LIBDIR') netCDF4_dir = os.environ.get('NETCDF4_DIR') netCDF4_incdir = os.environ.get('NETCDF4_INCDIR') netCDF4_libdir = os.environ.get('NETCDF4_LIBDIR') szip_dir = os.environ.get('SZIP_DIR') szip_libdir = os.environ.get('SZIP_LIBDIR') szip_incdir = os.environ.get('SZIP_INCDIR') hdf4_dir = os.environ.get('HDF4_DIR') hdf4_libdir = os.environ.get('HDF4_LIBDIR') hdf4_incdir = os.environ.get('HDF4_INCDIR') jpeg_dir = os.environ.get('JPEG_DIR') jpeg_libdir = os.environ.get('JPEG_LIBDIR') jpeg_incdir = os.environ.get('JPEG_INCDIR') curl_dir = os.environ.get('CURL_DIR') curl_libdir = os.environ.get('CURL_LIBDIR') curl_incdir = os.environ.get('CURL_INCDIR') mpi_incdir = os.environ.get('MPI_INCDIR') USE_NCCONFIG = os.environ.get('USE_NCCONFIG') if USE_NCCONFIG is not None: USE_NCCONFIG = bool(int(USE_NCCONFIG)) USE_SETUPCFG = os.environ.get('USE_SETUPCFG') # override use of setup.cfg with env var. if USE_SETUPCFG is not None: USE_SETUPCFG = bool(int(USE_SETUPCFG)) else: USE_SETUPCFG = True setup_cfg = 'setup.cfg' # contents of setup.cfg will override env vars, unless # USE_SETUPCFG evaluates to False. ncconfig = None use_ncconfig = None if USE_SETUPCFG and os.path.exists(setup_cfg): sys.stdout.write('reading from setup.cfg...\n') config = configparser.ConfigParser() config.read(setup_cfg) try: HDF5_dir = config.get("directories", "HDF5_dir") except: pass try: HDF5_libdir = config.get("directories", "HDF5_libdir") except: pass try: HDF5_incdir = config.get("directories", "HDF5_incdir") except: pass try: netCDF4_dir = config.get("directories", "netCDF4_dir") except: pass try: netCDF4_libdir = config.get("directories", "netCDF4_libdir") except: pass try: netCDF4_incdir = config.get("directories", "netCDF4_incdir") except: pass try: szip_dir = config.get("directories", "szip_dir") except: pass try: szip_libdir = config.get("directories", "szip_libdir") except: pass try: szip_incdir = config.get("directories", "szip_incdir") except: pass try: hdf4_dir = config.get("directories", "hdf4_dir") except: pass try: hdf4_libdir = config.get("directories", "hdf4_libdir") except: pass try: hdf4_incdir = config.get("directories", "hdf4_incdir") except: pass try: jpeg_dir = config.get("directories", "jpeg_dir") except: pass try: jpeg_libdir = config.get("directories", "jpeg_libdir") except: pass try: jpeg_incdir = config.get("directories", "jpeg_incdir") except: pass try: curl_dir = config.get("directories", "curl_dir") except: pass try: curl_libdir = config.get("directories", "curl_libdir") except: pass try: curl_incdir = config.get("directories", "curl_incdir") except: pass try: mpi_incdir = config.get("directories","mpi_incdir") except: pass try: use_ncconfig = config.getboolean("options", "use_ncconfig") except: pass try: ncconfig = config.get("options", "ncconfig") except: pass try: if ncconfig is None: if netCDF4_dir is not None: ncconfig = os.path.join(netCDF4_dir, 'bin/nc-config') else: # otherwise, just hope it's in the users PATH. ncconfig = 'nc-config' HAS_NCCONFIG = subprocess.call([ncconfig, '--libs'], stdout=subprocess.PIPE) == 0 except OSError: HAS_NCCONFIG = False # make sure USE_NCCONFIG from environment takes # precendence over use_ncconfig from setup.cfg (issue #341). if USE_NCCONFIG is None and use_ncconfig is not None: USE_NCCONFIG = use_ncconfig elif USE_NCCONFIG is None: # if nc-config exists, and USE_NCCONFIG not set, try to use it. if HAS_NCCONFIG: USE_NCCONFIG=True #elif USE_NCCONFIG is None: # USE_NCCONFIG = False # don't try to use nc-config if USE_NCCONFIG not set try: HAS_PKG_CONFIG = subprocess.call(['pkg-config', '--libs', 'hdf5'], stdout=subprocess.PIPE) == 0 except OSError: HAS_PKG_CONFIG = False def _populate_hdf5_info(dirstosearch, inc_dirs, libs, lib_dirs): global HDF5_incdir, HDF5_dir, HDF5_libdir nohdf5dirs = HDF5_incdir is None and HDF5_libdir is None and HDF5_dir is None if HAS_PKG_CONFIG and nohdf5dirs: # if HDF5 dirs not specified, and pkg-config available, use it dep = subprocess.Popen(['pkg-config', '--cflags', 'hdf5'], stdout=subprocess.PIPE).communicate()[0] inc_dirs.extend([str(i[2:].decode()) for i in dep.split() if i[0:2].decode() == '-I']) dep = subprocess.Popen(['pkg-config', '--libs', 'hdf5'], stdout=subprocess.PIPE).communicate()[0] libs.extend( [str(l[2:].decode()) for l in dep.split() if l[0:2].decode() == '-l']) lib_dirs.extend( [str(l[2:].decode()) for l in dep.split() if l[0:2].decode() == '-L']) dep = subprocess.Popen(['pkg-config', '--cflags', 'hdf5'], stdout=subprocess.PIPE).communicate()[0] inc_dirs.extend( [str(i[2:].decode()) for i in dep.split() if i[0:2].decode() == '-I']) else: if HDF5_incdir is None and HDF5_dir is None: sys.stdout.write(""" HDF5_DIR environment variable not set, checking some standard locations ..\n""") for direc in dirstosearch: hdf5_version = get_hdf5_version(os.path.join(direc, 'include')) if hdf5_version is None: continue else: HDF5_dir = direc HDF5_incdir = os.path.join(direc, 'include') sys.stdout.write('%s found in %s\n' % (hdf5_version,HDF5_dir)) break if HDF5_dir is None: raise ValueError('did not find HDF5 headers') else: if HDF5_incdir is None: HDF5_incdir = os.path.join(HDF5_dir, 'include') hdf5_version = get_hdf5_version(HDF5_incdir) if hdf5_version is None: raise ValueError('did not find HDF5 headers in %s' % HDF5_incdir) else: sys.stdout.write('%s found in %s\n' % (hdf5_version,HDF5_dir)) if HDF5_libdir is None and HDF5_dir is not None: HDF5_libdir = os.path.join(HDF5_dir, 'lib') if HDF5_libdir is not None: lib_dirs.append(HDF5_libdir) if HDF5_incdir is not None: inc_dirs.append(HDF5_incdir) libs.extend(['hdf5_hl', 'hdf5']) dirstosearch = [] if os.environ.get("CONDA_PREFIX"): dirstosearch.append(os.environ["CONDA_PREFIX"]) # linux,macosx dirstosearch.append(os.path.join(os.environ["CONDA_PREFIX"],'Library')) # windows dirstosearch += [os.path.expanduser('~'), '/usr/local', '/sw', '/opt', '/opt/local', '/usr'] # try nc-config first if USE_NCCONFIG and HAS_NCCONFIG: # Try nc-config. sys.stdout.write('using %s...\n' % ncconfig) dep = subprocess.Popen([ncconfig, '--libs'], stdout=subprocess.PIPE).communicate()[0] libs = [str(l[2:].decode()) for l in dep.split() if l[0:2].decode() == '-l'] lib_dirs = [str(l[2:].decode()) for l in dep.split() if l[0:2].decode() == '-L'] dep = subprocess.Popen([ncconfig, '--cflags'], stdout=subprocess.PIPE).communicate()[0] inc_dirs = [str(i[2:].decode()) for i in dep.split() if i[0:2].decode() == '-I'] # check to see if hdf5 found in directories returned by nc-config hdf5_version = None for direc in inc_dirs: hdf5_version = get_hdf5_version(direc) if hdf5_version is not None: break # if hdf5 not found, search other standard locations (including those specified in env vars). if hdf5_version is None: sys.stdout.write('nc-config did provide path to HDF5 headers, search standard locations...') _populate_hdf5_info(dirstosearch, inc_dirs, libs, lib_dirs) # If nc-config doesn't work, fall back on brute force method. else: lib_dirs = [] inc_dirs = [] libs = [] # _populate_hdf5_info will use HDF5_dir, HDF5_libdir and HDF5_incdir if they are set. # otherwise pkg-config will be tried, and if that fails, dirstosearch will be searched. _populate_hdf5_info(dirstosearch, inc_dirs, libs, lib_dirs) if netCDF4_incdir is None and netCDF4_dir is None: sys.stdout.write(""" NETCDF4_DIR environment variable not set, checking standard locations.. \n""") for direc in dirstosearch: sys.stdout.write('checking %s ...\n' % direc) isnetcdf4 = check_ifnetcdf4(os.path.join(direc, 'include')) if not isnetcdf4: continue else: netCDF4_dir = direc netCDF4_incdir = os.path.join(direc, 'include') sys.stdout.write('netCDF4 found in %s\n' % netCDF4_dir) break if netCDF4_dir is None: raise ValueError('did not find netCDF version 4 headers') else: if netCDF4_incdir is None: netCDF4_incdir = os.path.join(netCDF4_dir, 'include') isnetcdf4 = check_ifnetcdf4(netCDF4_incdir) if not isnetcdf4: raise ValueError( 'did not find netCDF version 4 headers %s' % netCDF4_incdir) if netCDF4_libdir is None and netCDF4_dir is not None: netCDF4_libdir = os.path.join(netCDF4_dir, 'lib') if sys.platform == 'win32': libs.extend(['netcdf', 'zlib']) else: libs.extend(['netcdf', 'z']) if netCDF4_libdir is not None: lib_dirs.append(netCDF4_libdir) if netCDF4_incdir is not None: inc_dirs.append(netCDF4_incdir) # add szip to link if desired. if szip_libdir is None and szip_dir is not None: szip_libdir = os.path.join(szip_dir, 'lib') if szip_incdir is None and szip_dir is not None: szip_incdir = os.path.join(szip_dir, 'include') if szip_incdir is not None and szip_libdir is not None: libs.append('sz') lib_dirs.append(szip_libdir) inc_dirs.append(szip_incdir) # add hdf4 to link if desired. if hdf4_libdir is None and hdf4_dir is not None: hdf4_libdir = os.path.join(hdf4_dir, 'lib') if hdf4_incdir is None and hdf4_dir is not None: hdf4_incdir = os.path.join(hdf4_dir, 'include') if hdf4_incdir is not None and hdf4_libdir is not None: libs.append('mfhdf') libs.append('df') lib_dirs.append(hdf4_libdir) inc_dirs.append(hdf4_incdir) # add jpeg to link if desired. if jpeg_libdir is None and jpeg_dir is not None: jpeg_libdir = os.path.join(jpeg_dir, 'lib') if jpeg_incdir is None and jpeg_dir is not None: jpeg_incdir = os.path.join(jpeg_dir, 'include') if jpeg_incdir is not None and jpeg_libdir is not None: libs.append('jpeg') lib_dirs.append(jpeg_libdir) inc_dirs.append(jpeg_incdir) # add curl to link if desired. if curl_libdir is None and curl_dir is not None: curl_libdir = os.path.join(curl_dir, 'lib') if curl_incdir is None and curl_dir is not None: curl_incdir = os.path.join(curl_dir, 'include') if curl_incdir is not None and curl_libdir is not None: libs.append('curl') lib_dirs.append(curl_libdir) inc_dirs.append(curl_incdir) if sys.platform == 'win32': runtime_lib_dirs = [] else: runtime_lib_dirs = lib_dirs # Do not require numpy for just querying the package # Taken from the h5py setup file. if any('--' + opt in sys.argv for opt in Distribution.display_option_names + ['help-commands', 'help']) or sys.argv[1] == 'egg_info': pass else: # append numpy include dir. import numpy inc_dirs.append(numpy.get_include()) # get netcdf library version. netcdf_lib_version = getnetcdfvers(lib_dirs) if netcdf_lib_version is None: sys.stdout.write('unable to detect netcdf library version\n') else: netcdf_lib_version = str(netcdf_lib_version) sys.stdout.write('using netcdf library version %s\n' % netcdf_lib_version) cmdclass = {} DEFINE_MACROS = [("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION")] netcdf4_src_root = osp.join(osp.join('src','netCDF4'), '_netCDF4') netcdf4_src_c = netcdf4_src_root + '.c' netcdf4_src_pyx = netcdf4_src_root + '.pyx' if 'sdist' not in sys.argv[1:] and 'clean' not in sys.argv[1:] and '--version' not in sys.argv[1:]: sys.stdout.write('using Cython to compile netCDF4.pyx...\n') # remove _netCDF4.c file if it exists, so cython will recompile _netCDF4.pyx. # run for build *and* install (issue #263). Otherwise 'pip install' will # not regenerate _netCDF4.c, even if the C lib supports the new features. if len(sys.argv) >= 2: if os.path.exists(netcdf4_src_c): os.remove(netcdf4_src_c) # this determines whether renameGroup and filepath methods will work. has_rename_grp, has_nc_inq_path, has_nc_inq_format_extended, \ has_cdf5_format, has_nc_open_mem, has_nc_create_mem, \ has_parallel4_support, has_pnetcdf_support = \ check_api(inc_dirs,netcdf_lib_version) # for netcdf 4.4.x CDF5 format is always enabled. if netcdf_lib_version is not None and\ (netcdf_lib_version > "4.4" and netcdf_lib_version < "4.5"): has_cdf5_format = True # disable parallel support if mpi4py not available. try: import mpi4py except ImportError: has_parallel4_support = False has_pnetcdf_support = False f = open(osp.join('include', 'constants.pyx'), 'w') if has_rename_grp: sys.stdout.write('netcdf lib has group rename capability\n') f.write('DEF HAS_RENAME_GRP = 1\n') else: sys.stdout.write('netcdf lib does not have group rename capability\n') f.write('DEF HAS_RENAME_GRP = 0\n') if has_nc_inq_path: sys.stdout.write('netcdf lib has nc_inq_path function\n') f.write('DEF HAS_NC_INQ_PATH = 1\n') else: sys.stdout.write('netcdf lib does not have nc_inq_path function\n') f.write('DEF HAS_NC_INQ_PATH = 0\n') if has_nc_inq_format_extended: sys.stdout.write('netcdf lib has nc_inq_format_extended function\n') f.write('DEF HAS_NC_INQ_FORMAT_EXTENDED = 1\n') else: sys.stdout.write( 'netcdf lib does not have nc_inq_format_extended function\n') f.write('DEF HAS_NC_INQ_FORMAT_EXTENDED = 0\n') if has_nc_open_mem: sys.stdout.write('netcdf lib has nc_open_mem function\n') f.write('DEF HAS_NC_OPEN_MEM = 1\n') else: sys.stdout.write('netcdf lib does not have nc_open_mem function\n') f.write('DEF HAS_NC_OPEN_MEM = 0\n') if has_nc_create_mem: sys.stdout.write('netcdf lib has nc_create_mem function\n') f.write('DEF HAS_NC_CREATE_MEM = 1\n') else: sys.stdout.write('netcdf lib does not have nc_create_mem function\n') f.write('DEF HAS_NC_CREATE_MEM = 0\n') if has_cdf5_format: sys.stdout.write('netcdf lib has cdf-5 format capability\n') f.write('DEF HAS_CDF5_FORMAT = 1\n') else: sys.stdout.write('netcdf lib does not have cdf-5 format capability\n') f.write('DEF HAS_CDF5_FORMAT = 0\n') if has_parallel4_support: sys.stdout.write('netcdf lib has netcdf4 parallel functions\n') f.write('DEF HAS_PARALLEL4_SUPPORT = 1\n') else: sys.stdout.write('netcdf lib does not have netcdf4 parallel functions\n') f.write('DEF HAS_PARALLEL4_SUPPORT = 0\n') if has_pnetcdf_support: sys.stdout.write('netcdf lib has pnetcdf parallel functions\n') f.write('DEF HAS_PNETCDF_SUPPORT = 1\n') else: sys.stdout.write('netcdf lib does not have pnetcdf parallel functions\n') f.write('DEF HAS_PNETCDF_SUPPORT = 0\n') f.close() if has_parallel4_support or has_pnetcdf_support: inc_dirs.append(mpi4py.get_include()) # mpi_incdir should not be needed if using nc-config # (should be included in nc-config --cflags) if mpi_incdir is not None: inc_dirs.append(mpi_incdir) ext_modules = [Extension("netCDF4._netCDF4", [netcdf4_src_pyx], define_macros=DEFINE_MACROS, libraries=libs, library_dirs=lib_dirs, include_dirs=inc_dirs + ['include'], runtime_library_dirs=runtime_lib_dirs)] else: ext_modules = None setup(name="netCDF4", cmdclass=cmdclass, version=extract_version(netcdf4_src_pyx), long_description="netCDF version 4 has many features not found in earlier versions of the library, such as hierarchical groups, zlib compression, multiple unlimited dimensions, and new data types. It is implemented on top of HDF5. This module implements most of the new features, and can read and write netCDF files compatible with older versions of the library. The API is modelled after Scientific.IO.NetCDF, and should be familiar to users of that module.\n\nThis project is hosted on a `GitHub repository `_ where you may access the most up-to-date source.", author="Jeff Whitaker", author_email="jeffrey.s.whitaker@noaa.gov", url="http://github.com/Unidata/netcdf4-python", download_url="http://python.org/pypi/netCDF4", platforms=["any"], license='License :: OSI Approved :: MIT License', description="Provides an object-oriented python interface to the netCDF version 4 library.", keywords=['numpy', 'netcdf', 'data', 'science', 'network', 'oceanography', 'meteorology', 'climate'], classifiers=["Development Status :: 3 - Alpha", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Compression", "Operating System :: OS Independent"], packages=['netCDF4'], package_dir={'':'src'}, ext_modules=ext_modules, **setuptools_extra_kwargs) netcdf4-python-1.5.8rel/src/000077500000000000000000000000001413751447500157005ustar00rootroot00000000000000netcdf4-python-1.5.8rel/src/netCDF4/000077500000000000000000000000001413751447500170675ustar00rootroot00000000000000netcdf4-python-1.5.8rel/src/netCDF4/__init__.py000066400000000000000000000014331413751447500212010ustar00rootroot00000000000000# init for netCDF4. package # Docstring comes from extension module _netCDF4. from ._netCDF4 import * # Need explicit imports for names beginning with underscores from ._netCDF4 import __doc__ from ._netCDF4 import (__version__, __netcdf4libversion__, __hdf5libversion__, __has_rename_grp__, __has_nc_inq_path__, __has_nc_inq_format_extended__, __has_nc_open_mem__, __has_nc_create_mem__, __has_cdf5_format__, __has_parallel4_support__, __has_pnetcdf_support__) __all__ =\ ['Dataset','Variable','Dimension','Group','MFDataset','MFTime','CompoundType','VLType','date2num','num2date','date2index','stringtochar','chartostring','stringtoarr','getlibversion','EnumType','get_chunk_cache','set_chunk_cache'] netcdf4-python-1.5.8rel/src/netCDF4/_netCDF4.pyx000066400000000000000000010615151413751447500211700ustar00rootroot00000000000000""" Version 1.5.8 ------------- # Introduction netcdf4-python is a Python interface to the netCDF C library. [netCDF](http://www.unidata.ucar.edu/software/netcdf/) version 4 has many features not found in earlier versions of the library and is implemented on top of [HDF5](http://www.hdfgroup.org/HDF5). This module can read and write files in both the new netCDF 4 and the old netCDF 3 format, and can create files that are readable by HDF5 clients. The API modelled after [Scientific.IO.NetCDF](http://dirac.cnrs-orleans.fr/ScientificPython/), and should be familiar to users of that module. Most new features of netCDF 4 are implemented, such as multiple unlimited dimensions, groups and zlib data compression. All the new numeric data types (such as 64 bit and unsigned integer types) are implemented. Compound (struct), variable length (vlen) and enumerated (enum) data types are supported, but not the opaque data type. Mixtures of compound, vlen and enum data types (such as compound types containing enums, or vlens containing compound types) are not supported. ## Quick Install - the easiest way to get going is to install via `pip install netCDF4`. (or if you use the [conda](http://conda.io) package manager `conda install -c conda-forge netCDF4`). ## Developer Install - Clone the [github repository](http://github.com/Unidata/netcdf4-python). - Make sure the dependencies are satisfied (Python 3.6 or later, [numpy](http://numpy.scipy.org), [Cython](http://cython.org), [cftime](https://github.com/Unidata/cftime), [setuptools](https://pypi.python.org/pypi/setuptools), the [HDF5 C library](https://www.hdfgroup.org/solutions/hdf5/), and the [netCDF C library](https://www.unidata.ucar.edu/software/netcdf/)). For MPI parallel IO support, an MPI-enabled versions of the netcdf library is required, as is [mpi4py](http://mpi4py.scipy.org). Parallel IO further depends on the existence of MPI-enabled HDF5 or the [PnetCDF](https://parallel-netcdf.github.io/) library. - By default, the utility `nc-config` (installed with netcdf-c) will be run used to determine where all the dependencies live. - If `nc-config` is not in your default `PATH`, you can set the `NETCDF4_DIR` environment variable and `setup.py` will look in `$NETCDF4_DIR/bin`. You can also use the file `setup.cfg` to set the path to `nc-config`, or enter the paths to the libraries and include files manually. Just edit the `setup.cfg` file in a text editor and follow the instructions in the comments. To disable the use of `nc-config`, set the env var `USE_NCCONFIG` to 0. To disable the use of `setup.cfg`, set `USE_SETUPCFG` to 0. As a last resort, the library and include paths can be set via environment variables. If you go this route, set `USE_NCCONFIG` and `USE_SETUPCFG` to 0, and specify `NETCDF4_LIBDIR`, `NETCDF4_INCDIR`, `HDF5_LIBDIR` and `HDF5_INCDIR`. If the dependencies are not found in any of the paths specified by environment variables, then standard locations (such as `/usr` and `/usr/local`) are searched. - run `python setup.py build`, then `python setup.py install` (as root if necessary). - run the tests in the 'test' directory by running `python run_all.py`. # Tutorial - [Creating/Opening/Closing a netCDF file](#creatingopeningclosing-a-netcdf-file) - [Groups in a netCDF file](#groups-in-a-netcdf-file) - [Dimensions in a netCDF file](#dimensions-in-a-netcdf-file) - [Variables in a netCDF file](#variables-in-a-netcdf-file) - [Attributes in a netCDF file](#attributes-in-a-netcdf-file) - [Dealing with time coordinates](#dealing-with-time-coordinates) - [Writing data to and retrieving data from a netCDF variable](#writing-data-to-and-retrieving-data-from-a-netcdf-variable) - [Reading data from a multi-file netCDF dataset](#reading-data-from-a-multi-file-netcdf-dataset) - [Efficient compression of netCDF variables](#efficient-compression-of-netcdf-variables) - [Beyond homogeneous arrays of a fixed type - compound data types](#beyond-homogeneous-arrays-of-a-fixed-type-compound-data-types) - [Variable-length (vlen) data types](#variable-length-vlen-data-types) - [Enum data type](#enum-data-type) - [Parallel IO](#parallel-io) - [Dealing with strings](#dealing-with-strings) - [In-memory (diskless) Datasets](#in-memory-diskless-datasets) ## Creating/Opening/Closing a netCDF file To create a netCDF file from python, you simply call the `Dataset` constructor. This is also the method used to open an existing netCDF file. If the file is open for write access (`mode='w', 'r+'` or `'a'`), you may write any type of data including new dimensions, groups, variables and attributes. netCDF files come in five flavors (`NETCDF3_CLASSIC, NETCDF3_64BIT_OFFSET, NETCDF3_64BIT_DATA, NETCDF4_CLASSIC`, and `NETCDF4`). `NETCDF3_CLASSIC` was the original netcdf binary format, and was limited to file sizes less than 2 Gb. `NETCDF3_64BIT_OFFSET` was introduced in version 3.6.0 of the library, and extended the original binary format to allow for file sizes greater than 2 Gb. `NETCDF3_64BIT_DATA` is a new format that requires version 4.4.0 of the C library - it extends the `NETCDF3_64BIT_OFFSET` binary format to allow for unsigned/64 bit integer data types and 64-bit dimension sizes. `NETCDF3_64BIT` is an alias for `NETCDF3_64BIT_OFFSET`. `NETCDF4_CLASSIC` files use the version 4 disk format (HDF5), but omits features not found in the version 3 API. They can be read by netCDF 3 clients only if they have been relinked against the netCDF 4 library. They can also be read by HDF5 clients. `NETCDF4` files use the version 4 disk format (HDF5) and use the new features of the version 4 API. The netCDF4 module can read and write files in any of these formats. When creating a new file, the format may be specified using the `format` keyword in the `Dataset` constructor. The default format is `NETCDF4`. To see how a given file is formatted, you can examine the `data_model` attribute. Closing the netCDF file is accomplished via the `Dataset.close` method of the `Dataset` instance. Here's an example: ```python >>> from netCDF4 import Dataset >>> rootgrp = Dataset("test.nc", "w", format="NETCDF4") >>> print(rootgrp.data_model) NETCDF4 >>> rootgrp.close() ``` Remote [OPeNDAP](http://opendap.org)-hosted datasets can be accessed for reading over http if a URL is provided to the `Dataset` constructor instead of a filename. However, this requires that the netCDF library be built with OPenDAP support, via the `--enable-dap` configure option (added in version 4.0.1). ## Groups in a netCDF file netCDF version 4 added support for organizing data in hierarchical groups, which are analogous to directories in a filesystem. Groups serve as containers for variables, dimensions and attributes, as well as other groups. A `Dataset` creates a special group, called the 'root group', which is similar to the root directory in a unix filesystem. To create `Group` instances, use the `Dataset.createGroup` method of a `Dataset` or `Group` instance. `Dataset.createGroup` takes a single argument, a python string containing the name of the new group. The new `Group` instances contained within the root group can be accessed by name using the `groups` dictionary attribute of the `Dataset` instance. Only `NETCDF4` formatted files support Groups, if you try to create a Group in a netCDF 3 file you will get an error message. ```python >>> rootgrp = Dataset("test.nc", "a") >>> fcstgrp = rootgrp.createGroup("forecasts") >>> analgrp = rootgrp.createGroup("analyses") >>> print(rootgrp.groups) {'forecasts': group /forecasts: dimensions(sizes): variables(dimensions): groups: , 'analyses': group /analyses: dimensions(sizes): variables(dimensions): groups: } >>> ``` Groups can exist within groups in a `Dataset`, just as directories exist within directories in a unix filesystem. Each `Group` instance has a `groups` attribute dictionary containing all of the group instances contained within that group. Each `Group` instance also has a `path` attribute that contains a simulated unix directory path to that group. To simplify the creation of nested groups, you can use a unix-like path as an argument to `Dataset.createGroup`. ```python >>> fcstgrp1 = rootgrp.createGroup("/forecasts/model1") >>> fcstgrp2 = rootgrp.createGroup("/forecasts/model2") ``` If any of the intermediate elements of the path do not exist, they are created, just as with the unix command `'mkdir -p'`. If you try to create a group that already exists, no error will be raised, and the existing group will be returned. Here's an example that shows how to navigate all the groups in a `Dataset`. The function `walktree` is a Python generator that is used to walk the directory tree. Note that printing the `Dataset` or `Group` object yields summary information about it's contents. ```python >>> def walktree(top): ... yield top.groups.values() ... for value in top.groups.values(): ... yield from walktree(value) >>> print(rootgrp) root group (NETCDF4 data model, file format HDF5): dimensions(sizes): variables(dimensions): groups: forecasts, analyses >>> for children in walktree(rootgrp): ... for child in children: ... print(child) group /forecasts: dimensions(sizes): variables(dimensions): groups: model1, model2 group /analyses: dimensions(sizes): variables(dimensions): groups: group /forecasts/model1: dimensions(sizes): variables(dimensions): groups: group /forecasts/model2: dimensions(sizes): variables(dimensions): groups: ``` ## Dimensions in a netCDF file netCDF defines the sizes of all variables in terms of dimensions, so before any variables can be created the dimensions they use must be created first. A special case, not often used in practice, is that of a scalar variable, which has no dimensions. A dimension is created using the `Dataset.createDimension` method of a `Dataset` or `Group` instance. A Python string is used to set the name of the dimension, and an integer value is used to set the size. To create an unlimited dimension (a dimension that can be appended to), the size value is set to `None` or 0. In this example, there both the `time` and `level` dimensions are unlimited. Having more than one unlimited dimension is a new netCDF 4 feature, in netCDF 3 files there may be only one, and it must be the first (leftmost) dimension of the variable. ```python >>> level = rootgrp.createDimension("level", None) >>> time = rootgrp.createDimension("time", None) >>> lat = rootgrp.createDimension("lat", 73) >>> lon = rootgrp.createDimension("lon", 144) ``` All of the `Dimension` instances are stored in a python dictionary. ```python >>> print(rootgrp.dimensions) {'level': (unlimited): name = 'level', size = 0, 'time': (unlimited): name = 'time', size = 0, 'lat': : name = 'lat', size = 73, 'lon': : name = 'lon', size = 144} ``` Using the python `len` function with a `Dimension` instance returns current size of that dimension. `Dimension.isunlimited` method of a `Dimension` instance be used to determine if the dimensions is unlimited, or appendable. ```python >>> print(len(lon)) 144 >>> print(lon.isunlimited()) False >>> print(time.isunlimited()) True ``` Printing the `Dimension` object provides useful summary info, including the name and length of the dimension, and whether it is unlimited. ```python >>> for dimobj in rootgrp.dimensions.values(): ... print(dimobj) (unlimited): name = 'level', size = 0 (unlimited): name = 'time', size = 0 : name = 'lat', size = 73 : name = 'lon', size = 144 ``` `Dimension` names can be changed using the `Datatset.renameDimension` method of a `Dataset` or `Group` instance. ## Variables in a netCDF file netCDF variables behave much like python multidimensional array objects supplied by the [numpy module](http://numpy.scipy.org). However, unlike numpy arrays, netCDF4 variables can be appended to along one or more 'unlimited' dimensions. To create a netCDF variable, use the `Dataset.createVariable` method of a `Dataset` or `Group` instance. The `Dataset.createVariable`j method has two mandatory arguments, the variable name (a Python string), and the variable datatype. The variable's dimensions are given by a tuple containing the dimension names (defined previously with `Dataset.createDimension`). To create a scalar variable, simply leave out the dimensions keyword. The variable primitive datatypes correspond to the dtype attribute of a numpy array. You can specify the datatype as a numpy dtype object, or anything that can be converted to a numpy dtype object. Valid datatype specifiers include: `'f4'` (32-bit floating point), `'f8'` (64-bit floating point), `'i4'` (32-bit signed integer), `'i2'` (16-bit signed integer), `'i8'` (64-bit signed integer), `'i1'` (8-bit signed integer), `'u1'` (8-bit unsigned integer), `'u2'` (16-bit unsigned integer), `'u4'` (32-bit unsigned integer), `'u8'` (64-bit unsigned integer), or `'S1'` (single-character string). The old Numeric single-character typecodes (`'f'`,`'d'`,`'h'`, `'s'`,`'b'`,`'B'`,`'c'`,`'i'`,`'l'`), corresponding to (`'f4'`,`'f8'`,`'i2'`,`'i2'`,`'i1'`,`'i1'`,`'S1'`,`'i4'`,`'i4'`), will also work. The unsigned integer types and the 64-bit integer type can only be used if the file format is `NETCDF4`. The dimensions themselves are usually also defined as variables, called coordinate variables. The `Dataset.createVariable` method returns an instance of the `Variable` class whose methods can be used later to access and set variable data and attributes. ```python >>> times = rootgrp.createVariable("time","f8",("time",)) >>> levels = rootgrp.createVariable("level","i4",("level",)) >>> latitudes = rootgrp.createVariable("lat","f4",("lat",)) >>> longitudes = rootgrp.createVariable("lon","f4",("lon",)) >>> # two dimensions unlimited >>> temp = rootgrp.createVariable("temp","f4",("time","level","lat","lon",)) >>> temp.units = "K" ``` To get summary info on a `Variable` instance in an interactive session, just print it. ```python >>> print(temp) float32 temp(time, level, lat, lon) units: K unlimited dimensions: time, level current shape = (0, 0, 73, 144) filling on, default _FillValue of 9.969209968386869e+36 used ``` You can use a path to create a Variable inside a hierarchy of groups. ```python >>> ftemp = rootgrp.createVariable("/forecasts/model1/temp","f4",("time","level","lat","lon",)) ``` If the intermediate groups do not yet exist, they will be created. You can also query a `Dataset` or `Group` instance directly to obtain `Group` or `Variable` instances using paths. ```python >>> print(rootgrp["/forecasts/model1"]) # a Group instance group /forecasts/model1: dimensions(sizes): variables(dimensions): float32 temp(time,level,lat,lon) groups: >>> print(rootgrp["/forecasts/model1/temp"]) # a Variable instance float32 temp(time, level, lat, lon) path = /forecasts/model1 unlimited dimensions: time, level current shape = (0, 0, 73, 144) filling on, default _FillValue of 9.969209968386869e+36 used ``` All of the variables in the `Dataset` or `Group` are stored in a Python dictionary, in the same way as the dimensions: ```python >>> print(rootgrp.variables) {'time': float64 time(time) unlimited dimensions: time current shape = (0,) filling on, default _FillValue of 9.969209968386869e+36 used, 'level': int32 level(level) unlimited dimensions: level current shape = (0,) filling on, default _FillValue of -2147483647 used, 'lat': float32 lat(lat) unlimited dimensions: current shape = (73,) filling on, default _FillValue of 9.969209968386869e+36 used, 'lon': float32 lon(lon) unlimited dimensions: current shape = (144,) filling on, default _FillValue of 9.969209968386869e+36 used, 'temp': float32 temp(time, level, lat, lon) units: K unlimited dimensions: time, level current shape = (0, 0, 73, 144) filling on, default _FillValue of 9.969209968386869e+36 used} ``` `Variable` names can be changed using the `Dataset.renameVariable` method of a `Dataset` instance. Variables can be sliced similar to numpy arrays, but there are some differences. See [Writing data to and retrieving data from a netCDF variable](#writing-data-to-and-retrieving-data-from-a-netcdf-variable) for more details. ## Attributes in a netCDF file There are two types of attributes in a netCDF file, global and variable. Global attributes provide information about a group, or the entire dataset, as a whole. `Variable` attributes provide information about one of the variables in a group. Global attributes are set by assigning values to `Dataset` or `Group` instance variables. `Variable` attributes are set by assigning values to `Variable` instances variables. Attributes can be strings, numbers or sequences. Returning to our example, ```python >>> import time >>> rootgrp.description = "bogus example script" >>> rootgrp.history = "Created " + time.ctime(time.time()) >>> rootgrp.source = "netCDF4 python module tutorial" >>> latitudes.units = "degrees north" >>> longitudes.units = "degrees east" >>> levels.units = "hPa" >>> temp.units = "K" >>> times.units = "hours since 0001-01-01 00:00:00.0" >>> times.calendar = "gregorian" ``` The `Dataset.ncattrs` method of a `Dataset`, `Group` or `Variable` instance can be used to retrieve the names of all the netCDF attributes. This method is provided as a convenience, since using the built-in `dir` Python function will return a bunch of private methods and attributes that cannot (or should not) be modified by the user. ```python >>> for name in rootgrp.ncattrs(): ... print("Global attr {} = {}".format(name, getattr(rootgrp, name))) Global attr description = bogus example script Global attr history = Created Mon Jul 8 14:19:41 2019 Global attr source = netCDF4 python module tutorial ``` The `__dict__` attribute of a `Dataset`, `Group` or `Variable` instance provides all the netCDF attribute name/value pairs in a python dictionary: ```python >>> print(rootgrp.__dict__) {'description': 'bogus example script', 'history': 'Created Mon Jul 8 14:19:41 2019', 'source': 'netCDF4 python module tutorial'} ``` Attributes can be deleted from a netCDF `Dataset`, `Group` or `Variable` using the python `del` statement (i.e. `del grp.foo` removes the attribute `foo` the the group `grp`). ## Writing data to and retrieving data from a netCDF variable Now that you have a netCDF `Variable` instance, how do you put data into it? You can just treat it like an array and assign data to a slice. ```python >>> import numpy as np >>> lats = np.arange(-90,91,2.5) >>> lons = np.arange(-180,180,2.5) >>> latitudes[:] = lats >>> longitudes[:] = lons >>> print("latitudes =\\n{}".format(latitudes[:])) latitudes = [-90. -87.5 -85. -82.5 -80. -77.5 -75. -72.5 -70. -67.5 -65. -62.5 -60. -57.5 -55. -52.5 -50. -47.5 -45. -42.5 -40. -37.5 -35. -32.5 -30. -27.5 -25. -22.5 -20. -17.5 -15. -12.5 -10. -7.5 -5. -2.5 0. 2.5 5. 7.5 10. 12.5 15. 17.5 20. 22.5 25. 27.5 30. 32.5 35. 37.5 40. 42.5 45. 47.5 50. 52.5 55. 57.5 60. 62.5 65. 67.5 70. 72.5 75. 77.5 80. 82.5 85. 87.5 90. ] ``` Unlike NumPy's array objects, netCDF `Variable` objects with unlimited dimensions will grow along those dimensions if you assign data outside the currently defined range of indices. ```python >>> # append along two unlimited dimensions by assigning to slice. >>> nlats = len(rootgrp.dimensions["lat"]) >>> nlons = len(rootgrp.dimensions["lon"]) >>> print("temp shape before adding data = {}".format(temp.shape)) temp shape before adding data = (0, 0, 73, 144) >>> >>> from numpy.random import uniform >>> temp[0:5, 0:10, :, :] = uniform(size=(5, 10, nlats, nlons)) >>> print("temp shape after adding data = {}".format(temp.shape)) temp shape after adding data = (5, 10, 73, 144) >>> >>> # levels have grown, but no values yet assigned. >>> print("levels shape after adding pressure data = {}".format(levels.shape)) levels shape after adding pressure data = (10,) ``` Note that the size of the levels variable grows when data is appended along the `level` dimension of the variable `temp`, even though no data has yet been assigned to levels. ```python >>> # now, assign data to levels dimension variable. >>> levels[:] = [1000.,850.,700.,500.,300.,250.,200.,150.,100.,50.] ``` However, that there are some differences between NumPy and netCDF variable slicing rules. Slices behave as usual, being specified as a `start:stop:step` triplet. Using a scalar integer index `i` takes the ith element and reduces the rank of the output array by one. Boolean array and integer sequence indexing behaves differently for netCDF variables than for numpy arrays. Only 1-d boolean arrays and integer sequences are allowed, and these indices work independently along each dimension (similar to the way vector subscripts work in fortran). This means that ```python >>> temp[0, 0, [0,1,2,3], [0,1,2,3]].shape (4, 4) ``` returns an array of shape (4,4) when slicing a netCDF variable, but for a numpy array it returns an array of shape (4,). Similarly, a netCDF variable of shape `(2,3,4,5)` indexed with `[0, array([True, False, True]), array([False, True, True, True]), :]` would return a `(2, 3, 5)` array. In NumPy, this would raise an error since it would be equivalent to `[0, [0,1], [1,2,3], :]`. When slicing with integer sequences, the indices ***need not be sorted*** and ***may contain duplicates*** (both of these are new features in version 1.2.1). While this behaviour may cause some confusion for those used to NumPy's 'fancy indexing' rules, it provides a very powerful way to extract data from multidimensional netCDF variables by using logical operations on the dimension arrays to create slices. For example, ```python >>> tempdat = temp[::2, [1,3,6], lats>0, lons>0] ``` will extract time indices 0,2 and 4, pressure levels 850, 500 and 200 hPa, all Northern Hemisphere latitudes and Eastern Hemisphere longitudes, resulting in a numpy array of shape (3, 3, 36, 71). ```python >>> print("shape of fancy temp slice = {}".format(tempdat.shape)) shape of fancy temp slice = (3, 3, 36, 71) ``` ***Special note for scalar variables***: To extract data from a scalar variable `v` with no associated dimensions, use `numpy.asarray(v)` or `v[...]`. The result will be a numpy scalar array. By default, netcdf4-python returns numpy masked arrays with values equal to the `missing_value` or `_FillValue` variable attributes masked for primitive and enum data types. The `Dataset.set_auto_mask` `Dataset` and `Variable` methods can be used to disable this feature so that numpy arrays are always returned, with the missing values included. Prior to version 1.4.0 the default behavior was to only return masked arrays when the requested slice contained missing values. This behavior can be recovered using the `Dataset.set_always_mask` method. If a masked array is written to a netCDF variable, the masked elements are filled with the value specified by the `missing_value` attribute. If the variable has no `missing_value`, the `_FillValue` is used instead. ## Dealing with time coordinates Time coordinate values pose a special challenge to netCDF users. Most metadata standards (such as CF) specify that time should be measure relative to a fixed date using a certain calendar, with units specified like `hours since YY-MM-DD hh:mm:ss`. These units can be awkward to deal with, without a utility to convert the values to and from calendar dates. The functions [num2date](https://unidata.github.io/cftime/api.html) and [date2num](https://unidata.github.io/cftime/api.html) are provided by [cftime](https://unidata.github.io/cftime) to do just that. Here's an example of how they can be used: ```python >>> # fill in times. >>> from datetime import datetime, timedelta >>> from cftime import num2date, date2num >>> dates = [datetime(2001,3,1)+n*timedelta(hours=12) for n in range(temp.shape[0])] >>> times[:] = date2num(dates,units=times.units,calendar=times.calendar) >>> print("time values (in units {}):\\n{}".format(times.units, times[:])) time values (in units hours since 0001-01-01 00:00:00.0): [17533104. 17533116. 17533128. 17533140. 17533152.] >>> dates = num2date(times[:],units=times.units,calendar=times.calendar) >>> print("dates corresponding to time values:\\n{}".format(dates)) [cftime.DatetimeGregorian(2001, 3, 1, 0, 0, 0, 0, has_year_zero=False) cftime.DatetimeGregorian(2001, 3, 1, 12, 0, 0, 0, has_year_zero=False) cftime.DatetimeGregorian(2001, 3, 2, 0, 0, 0, 0, has_year_zero=False) cftime.DatetimeGregorian(2001, 3, 2, 12, 0, 0, 0, has_year_zero=False) cftime.DatetimeGregorian(2001, 3, 3, 0, 0, 0, 0, has_year_zero=False)] ``` `num2date` converts numeric values of time in the specified `units` and `calendar` to datetime objects, and `date2num` does the reverse. All the calendars currently defined in the [CF metadata convention](http://cfconventions.org) are supported. A function called `date2index` is also provided which returns the indices of a netCDF time variable corresponding to a sequence of datetime instances. ## Reading data from a multi-file netCDF dataset If you want to read data from a variable that spans multiple netCDF files, you can use the `MFDataset` class to read the data as if it were contained in a single file. Instead of using a single filename to create a `Dataset` instance, create a `MFDataset` instance with either a list of filenames, or a string with a wildcard (which is then converted to a sorted list of files using the python glob module). Variables in the list of files that share the same unlimited dimension are aggregated together, and can be sliced across multiple files. To illustrate this, let's first create a bunch of netCDF files with the same variable (with the same unlimited dimension). The files must in be in `NETCDF3_64BIT_OFFSET`, `NETCDF3_64BIT_DATA`, `NETCDF3_CLASSIC` or `NETCDF4_CLASSIC` format (`NETCDF4` formatted multi-file datasets are not supported). ```python >>> for nf in range(10): ... with Dataset("mftest%s.nc" % nf, "w", format="NETCDF4_CLASSIC") as f: ... _ = f.createDimension("x",None) ... x = f.createVariable("x","i",("x",)) ... x[0:10] = np.arange(nf*10,10*(nf+1)) ``` Now read all the files back in at once with `MFDataset` ```python >>> from netCDF4 import MFDataset >>> f = MFDataset("mftest*nc") >>> print(f.variables["x"][:]) [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99] ``` Note that `MFDataset` can only be used to read, not write, multi-file datasets. ## Efficient compression of netCDF variables Data stored in netCDF 4 `Variable` objects can be compressed and decompressed on the fly. The parameters for the compression are determined by the `zlib`, `complevel` and `shuffle` keyword arguments to the `Dataset.createVariable` method. To turn on compression, set `zlib=True`. The `complevel` keyword regulates the speed and efficiency of the compression (1 being fastest, but lowest compression ratio, 9 being slowest but best compression ratio). The default value of `complevel` is 4. Setting `shuffle=False` will turn off the HDF5 shuffle filter, which de-interlaces a block of data before compression by reordering the bytes. The shuffle filter can significantly improve compression ratios, and is on by default. Setting `fletcher32` keyword argument to `Dataset.createVariable` to `True` (it's `False` by default) enables the Fletcher32 checksum algorithm for error detection. It's also possible to set the HDF5 chunking parameters and endian-ness of the binary data stored in the HDF5 file with the `chunksizes` and `endian` keyword arguments to `Dataset.createVariable`. These keyword arguments only are relevant for `NETCDF4` and `NETCDF4_CLASSIC` files (where the underlying file format is HDF5) and are silently ignored if the file format is `NETCDF3_CLASSIC`, `NETCDF3_64BIT_OFFSET` or `NETCDF3_64BIT_DATA`. If your data only has a certain number of digits of precision (say for example, it is temperature data that was measured with a precision of 0.1 degrees), you can dramatically improve zlib compression by quantizing (or truncating) the data using the `least_significant_digit` keyword argument to `Dataset.createVariable`. The least significant digit is the power of ten of the smallest decimal place in the data that is a reliable value. For example if the data has a precision of 0.1, then setting `least_significant_digit=1` will cause data the data to be quantized using `numpy.around(scale*data)/scale`, where scale = 2**bits, and bits is determined so that a precision of 0.1 is retained (in this case bits=4). Effectively, this makes the compression 'lossy' instead of 'lossless', that is some precision in the data is sacrificed for the sake of disk space. In our example, try replacing the line ```python >>> temp = rootgrp.createVariable("temp","f4",("time","level","lat","lon",)) ``` with ```python >>> temp = rootgrp.createVariable("temp","f4",("time","level","lat","lon",),zlib=True) ``` and then ```python >>> temp = rootgrp.createVariable("temp","f4",("time","level","lat","lon",),zlib=True,least_significant_digit=3) ``` and see how much smaller the resulting files are. ## Beyond homogeneous arrays of a fixed type - compound data types Compound data types map directly to numpy structured (a.k.a 'record') arrays. Structured arrays are akin to C structs, or derived types in Fortran. They allow for the construction of table-like structures composed of combinations of other data types, including other compound types. Compound types might be useful for representing multiple parameter values at each point on a grid, or at each time and space location for scattered (point) data. You can then access all the information for a point by reading one variable, instead of reading different parameters from different variables. Compound data types are created from the corresponding numpy data type using the `Dataset.createCompoundType` method of a `Dataset` or `Group` instance. Since there is no native complex data type in netcdf, compound types are handy for storing numpy complex arrays. Here's an example: ```python >>> f = Dataset("complex.nc","w") >>> size = 3 # length of 1-d complex array >>> # create sample complex data. >>> datac = np.exp(1j*(1.+np.linspace(0, np.pi, size))) >>> # create complex128 compound data type. >>> complex128 = np.dtype([("real",np.float64),("imag",np.float64)]) >>> complex128_t = f.createCompoundType(complex128,"complex128") >>> # create a variable with this data type, write some data to it. >>> x_dim = f.createDimension("x_dim",None) >>> v = f.createVariable("cmplx_var",complex128_t,"x_dim") >>> data = np.empty(size,complex128) # numpy structured array >>> data["real"] = datac.real; data["imag"] = datac.imag >>> v[:] = data # write numpy structured array to netcdf compound var >>> # close and reopen the file, check the contents. >>> f.close(); f = Dataset("complex.nc") >>> v = f.variables["cmplx_var"] >>> datain = v[:] # read in all the data into a numpy structured array >>> # create an empty numpy complex array >>> datac2 = np.empty(datain.shape,np.complex128) >>> # .. fill it with contents of structured array. >>> datac2.real = datain["real"]; datac2.imag = datain["imag"] >>> print('{}: {}'.format(datac.dtype, datac)) # original data complex128: [ 0.54030231+0.84147098j -0.84147098+0.54030231j -0.54030231-0.84147098j] >>> >>> print('{}: {}'.format(datac2.dtype, datac2)) # data from file complex128: [ 0.54030231+0.84147098j -0.84147098+0.54030231j -0.54030231-0.84147098j] ``` Compound types can be nested, but you must create the 'inner' ones first. All possible numpy structured arrays cannot be represented as Compound variables - an error message will be raise if you try to create one that is not supported. All of the compound types defined for a `Dataset` or `Group` are stored in a Python dictionary, just like variables and dimensions. As always, printing objects gives useful summary information in an interactive session: ```python >>> print(f) root group (NETCDF4 data model, file format HDF5): dimensions(sizes): x_dim(3) variables(dimensions): {'names':['real','imag'], 'formats':['>> print(f.variables["cmplx_var"]) compound cmplx_var(x_dim) compound data type: {'names':['real','imag'], 'formats':['>> print(f.cmptypes) {'complex128': : name = 'complex128', numpy dtype = {'names':['real','imag'], 'formats':['>> print(f.cmptypes["complex128"]) : name = 'complex128', numpy dtype = {'names':['real','imag'], 'formats':['>> f = Dataset("tst_vlen.nc","w") >>> vlen_t = f.createVLType(np.int32, "phony_vlen") ``` The numpy datatype of the variable-length sequences and the name of the new datatype must be specified. Any of the primitive datatypes can be used (signed and unsigned integers, 32 and 64 bit floats, and characters), but compound data types cannot. A new variable can then be created using this datatype. ```python >>> x = f.createDimension("x",3) >>> y = f.createDimension("y",4) >>> vlvar = f.createVariable("phony_vlen_var", vlen_t, ("y","x")) ``` Since there is no native vlen datatype in numpy, vlen arrays are represented in python as object arrays (arrays of dtype `object`). These are arrays whose elements are Python object pointers, and can contain any type of python object. For this application, they must contain 1-D numpy arrays all of the same type but of varying length. In this case, they contain 1-D numpy `int32` arrays of random length between 1 and 10. ```python >>> import random >>> random.seed(54321) >>> data = np.empty(len(y)*len(x),object) >>> for n in range(len(y)*len(x)): ... data[n] = np.arange(random.randint(1,10),dtype="int32")+1 >>> data = np.reshape(data,(len(y),len(x))) >>> vlvar[:] = data >>> print("vlen variable =\\n{}".format(vlvar[:])) vlen variable = [[array([1, 2, 3, 4, 5, 6, 7, 8], dtype=int32) array([1, 2], dtype=int32) array([1, 2, 3, 4], dtype=int32)] [array([1, 2, 3], dtype=int32) array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32) array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)] [array([1, 2, 3, 4, 5, 6, 7], dtype=int32) array([1, 2, 3], dtype=int32) array([1, 2, 3, 4, 5, 6], dtype=int32)] [array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32) array([1, 2, 3, 4, 5], dtype=int32) array([1, 2], dtype=int32)]] >>> print(f) root group (NETCDF4 data model, file format HDF5): dimensions(sizes): x(3), y(4) variables(dimensions): int32 phony_vlen_var(y,x) groups: >>> print(f.variables["phony_vlen_var"]) vlen phony_vlen_var(y, x) vlen data type: int32 unlimited dimensions: current shape = (4, 3) >>> print(f.vltypes["phony_vlen"]) : name = 'phony_vlen', numpy dtype = int32 ``` Numpy object arrays containing python strings can also be written as vlen variables, For vlen strings, you don't need to create a vlen data type. Instead, simply use the python `str` builtin (or a numpy string datatype with fixed length greater than 1) when calling the `Dataset.createVariable` method. ```python >>> z = f.createDimension("z",10) >>> strvar = f.createVariable("strvar", str, "z") ``` In this example, an object array is filled with random python strings with random lengths between 2 and 12 characters, and the data in the object array is assigned to the vlen string variable. ```python >>> chars = "1234567890aabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" >>> data = np.empty(10,"O") >>> for n in range(10): ... stringlen = random.randint(2,12) ... data[n] = "".join([random.choice(chars) for i in range(stringlen)]) >>> strvar[:] = data >>> print("variable-length string variable:\\n{}".format(strvar[:])) variable-length string variable: ['Lh' '25F8wBbMI' '53rmM' 'vvjnb3t63ao' 'qjRBQk6w' 'aJh' 'QF' 'jtIJbJACaQk4' '3Z5' 'bftIIq'] >>> print(f) root group (NETCDF4 data model, file format HDF5): dimensions(sizes): x(3), y(4), z(10) variables(dimensions): int32 phony_vlen_var(y,x), strvar(z) groups: >>> print(f.variables["strvar"]) vlen strvar(z) vlen data type: unlimited dimensions: current shape = (10,) ``` It is also possible to set contents of vlen string variables with numpy arrays of any string or unicode data type. Note, however, that accessing the contents of such variables will always return numpy arrays with dtype `object`. ## Enum data type netCDF4 has an enumerated data type, which is an integer datatype that is restricted to certain named values. Since Enums don't map directly to a numpy data type, they are read and written as integer arrays. Here's an example of using an Enum type to hold cloud type data. The base integer data type and a python dictionary describing the allowed values and their names are used to define an Enum data type using `Dataset.createEnumType`. ```python >>> nc = Dataset('clouds.nc','w') >>> # python dict with allowed values and their names. >>> enum_dict = {'Altocumulus': 7, 'Missing': 255, ... 'Stratus': 2, 'Clear': 0, ... 'Nimbostratus': 6, 'Cumulus': 4, 'Altostratus': 5, ... 'Cumulonimbus': 1, 'Stratocumulus': 3} >>> # create the Enum type called 'cloud_t'. >>> cloud_type = nc.createEnumType(np.uint8,'cloud_t',enum_dict) >>> print(cloud_type) : name = 'cloud_t', numpy dtype = uint8, fields/values ={'Altocumulus': 7, 'Missing': 255, 'Stratus': 2, 'Clear': 0, 'Nimbostratus': 6, 'Cumulus': 4, 'Altostratus': 5, 'Cumulonimbus': 1, 'Stratocumulus': 3} ``` A new variable can be created in the usual way using this data type. Integer data is written to the variable that represents the named cloud types in enum_dict. A `ValueError` will be raised if an attempt is made to write an integer value not associated with one of the specified names. ```python >>> time = nc.createDimension('time',None) >>> # create a 1d variable of type 'cloud_type'. >>> # The fill_value is set to the 'Missing' named value. >>> cloud_var = nc.createVariable('primary_cloud',cloud_type,'time', ... fill_value=enum_dict['Missing']) >>> # write some data to the variable. >>> cloud_var[:] = [enum_dict[k] for k in ['Clear', 'Stratus', 'Cumulus', ... 'Missing', 'Cumulonimbus']] >>> nc.close() >>> # reopen the file, read the data. >>> nc = Dataset('clouds.nc') >>> cloud_var = nc.variables['primary_cloud'] >>> print(cloud_var) enum primary_cloud(time) _FillValue: 255 enum data type: uint8 unlimited dimensions: time current shape = (5,) >>> print(cloud_var.datatype.enum_dict) {'Altocumulus': 7, 'Missing': 255, 'Stratus': 2, 'Clear': 0, 'Nimbostratus': 6, 'Cumulus': 4, 'Altostratus': 5, 'Cumulonimbus': 1, 'Stratocumulus': 3} >>> print(cloud_var[:]) [0 2 4 -- 1] >>> nc.close() ``` ## Parallel IO If MPI parallel enabled versions of netcdf and hdf5 or pnetcdf are detected, and [mpi4py](https://mpi4py.scipy.org) is installed, netcdf4-python will be built with parallel IO capabilities enabled. Parallel IO of NETCDF4 or NETCDF4_CLASSIC formatted files is only available if the MPI parallel HDF5 library is available. Parallel IO of classic netcdf-3 file formats is only available if the [PnetCDF](https://parallel-netcdf.github.io/) library is available. To use parallel IO, your program must be running in an MPI environment using [mpi4py](https://mpi4py.scipy.org). ```python >>> from mpi4py import MPI >>> import numpy as np >>> from netCDF4 import Dataset >>> rank = MPI.COMM_WORLD.rank # The process ID (integer 0-3 for 4-process run) ``` To run an MPI-based parallel program like this, you must use `mpiexec` to launch several parallel instances of Python (for example, using `mpiexec -np 4 python mpi_example.py`). The parallel features of netcdf4-python are mostly transparent - when a new dataset is created or an existing dataset is opened, use the `parallel` keyword to enable parallel access. ```python >>> nc = Dataset('parallel_test.nc','w',parallel=True) ``` The optional `comm` keyword may be used to specify a particular MPI communicator (`MPI_COMM_WORLD` is used by default). Each process (or rank) can now write to the file indepedently. In this example the process rank is written to a different variable index on each task ```python >>> d = nc.createDimension('dim',4) >>> v = nc.createVariable('var', np.int64, 'dim') >>> v[rank] = rank >>> nc.close() % ncdump parallel_test.nc netcdf parallel_test { dimensions: dim = 4 ; variables: int64 var(dim) ; data: var = 0, 1, 2, 3 ; } ``` There are two types of parallel IO, independent (the default) and collective. Independent IO means that each process can do IO independently. It should not depend on or be affected by other processes. Collective IO is a way of doing IO defined in the MPI-IO standard; unlike independent IO, all processes must participate in doing IO. To toggle back and forth between the two types of IO, use the `Variable.set_collective` `Variable` method. All metadata operations (such as creation of groups, types, variables, dimensions, or attributes) are collective. There are a couple of important limitations of parallel IO: - parallel IO for NETCDF4 or NETCDF4_CLASSIC formatted files is only available if the netcdf library was compiled with MPI enabled HDF5. - parallel IO for all classic netcdf-3 file formats is only available if the netcdf library was compiled with [PnetCDF](https://parallel-netcdf.github.io). - If a variable has an unlimited dimension, appending data must be done in collective mode. If the write is done in independent mode, the operation will fail with a a generic "HDF Error". - You can write compressed data in parallel only with netcdf-c >= 4.7.4 and hdf5 >= 1.10.3 (although you can read in parallel with earlier versions). To write compressed data in parallel, the variable must be in 'collective IO mode'. This is done automatically on variable creation if compression is turned on, but if you are appending to a variable in an existing file, you must use `Variable.set_collective(True)` before attempting to write to it. - You cannot use variable-length (VLEN) data types. ## Dealing with strings The most flexible way to store arrays of strings is with the [Variable-length (vlen) string data type](#variable-length-vlen-data-type). However, this requires the use of the NETCDF4 data model, and the vlen type does not map very well numpy arrays (you have to use numpy arrays of dtype=`object`, which are arrays of arbitrary python objects). numpy does have a fixed-width string array data type, but unfortunately the netCDF data model does not. Instead fixed-width byte strings are typically stored as [arrays of 8-bit characters](https://www.unidata.ucar.edu/software/netcdf/docs/BestPractices.html#bp_Strings-and-Variables-of-type-char). To perform the conversion to and from character arrays to fixed-width numpy string arrays, the following convention is followed by the python interface. If the `_Encoding` special attribute is set for a character array (dtype `S1`) variable, the `chartostring` utility function is used to convert the array of characters to an array of strings with one less dimension (the last dimension is interpreted as the length of each string) when reading the data. The character set (usually ascii) is specified by the `_Encoding` attribute. If `_Encoding` is 'none' or 'bytes', then the character array is converted to a numpy fixed-width byte string array (dtype `S#`), otherwise a numpy unicode (dtype `U#`) array is created. When writing the data, `stringtochar` is used to convert the numpy string array to an array of characters with one more dimension. For example, ```python >>> from netCDF4 import stringtochar >>> nc = Dataset('stringtest.nc','w',format='NETCDF4_CLASSIC') >>> _ = nc.createDimension('nchars',3) >>> _ = nc.createDimension('nstrings',None) >>> v = nc.createVariable('strings','S1',('nstrings','nchars')) >>> datain = np.array(['foo','bar'],dtype='S3') >>> v[:] = stringtochar(datain) # manual conversion to char array >>> print(v[:]) # data returned as char array [[b'f' b'o' b'o'] [b'b' b'a' b'r']] >>> v._Encoding = 'ascii' # this enables automatic conversion >>> v[:] = datain # conversion to char array done internally >>> print(v[:]) # data returned in numpy string array ['foo' 'bar'] >>> nc.close() ``` Even if the `_Encoding` attribute is set, the automatic conversion of char arrays to/from string arrays can be disabled with `Variable.set_auto_chartostring`. A similar situation is often encountered with numpy structured arrays with subdtypes containing fixed-wdith byte strings (dtype=`S#`). Since there is no native fixed-length string netCDF datatype, these numpy structure arrays are mapped onto netCDF compound types with character array elements. In this case the string <-> char array conversion is handled automatically (without the need to set the `_Encoding` attribute) using [numpy views](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.view.html). The structured array dtype (including the string elements) can even be used to define the compound data type - the string dtype will be converted to character array dtype under the hood when creating the netcdf compound type. Here's an example: ```python >>> nc = Dataset('compoundstring_example.nc','w') >>> dtype = np.dtype([('observation', 'f4'), ... ('station_name','S10')]) >>> station_data_t = nc.createCompoundType(dtype,'station_data') >>> _ = nc.createDimension('station',None) >>> statdat = nc.createVariable('station_obs', station_data_t, ('station',)) >>> data = np.empty(2,dtype) >>> data['observation'][:] = (123.,3.14) >>> data['station_name'][:] = ('Boulder','New York') >>> print(statdat.dtype) # strings actually stored as character arrays {'names':['observation','station_name'], 'formats':['>> statdat[:] = data # strings converted to character arrays internally >>> print(statdat[:]) # character arrays converted back to strings [(123. , b'Boulder') ( 3.14, b'New York')] >>> print(statdat[:].dtype) {'names':['observation','station_name'], 'formats':['>> statdat.set_auto_chartostring(False) # turn off auto-conversion >>> statdat[:] = data.view(dtype=[('observation', 'f4'),('station_name','S1',10)]) >>> print(statdat[:]) # now structured array with char array subtype is returned [(123. , [b'B', b'o', b'u', b'l', b'd', b'e', b'r', b'', b'', b'']) ( 3.14, [b'N', b'e', b'w', b' ', b'Y', b'o', b'r', b'k', b'', b''])] >>> nc.close() ``` Note that there is currently no support for mapping numpy structured arrays with unicode elements (dtype `U#`) onto netCDF compound types, nor is there support for netCDF compound types with vlen string components. ## In-memory (diskless) Datasets You can create netCDF Datasets whose content is held in memory instead of in a disk file. There are two ways to do this. If you don't need access to the memory buffer containing the Dataset from within python, the best way is to use the `diskless=True` keyword argument when creating the Dataset. If you want to save the Dataset to disk when you close it, also set `persist=True`. If you want to create a new read-only Dataset from an existing python memory buffer, use the `memory` keyword argument to pass the memory buffer when creating the Dataset. If you want to create a new in-memory Dataset, and then access the memory buffer directly from Python, use the `memory` keyword argument to specify the estimated size of the Dataset in bytes when creating the Dataset with `mode='w'`. Then, the `Dataset.close` method will return a python memoryview object representing the Dataset. Below are examples illustrating both approaches. ```python >>> # create a diskless (in-memory) Dataset, >>> # and persist the file to disk when it is closed. >>> nc = Dataset('diskless_example.nc','w',diskless=True,persist=True) >>> d = nc.createDimension('x',None) >>> v = nc.createVariable('v',np.int32,'x') >>> v[0:5] = np.arange(5) >>> print(nc) root group (NETCDF4 data model, file format HDF5): dimensions(sizes): x(5) variables(dimensions): int32 v(x) groups: >>> print(nc['v'][:]) [0 1 2 3 4] >>> nc.close() # file saved to disk >>> # create an in-memory dataset from an existing python >>> # python memory buffer. >>> # read the newly created netcdf file into a python >>> # bytes object. >>> with open('diskless_example.nc', 'rb') as f: ... nc_bytes = f.read() >>> # create a netCDF in-memory dataset from the bytes object. >>> nc = Dataset('inmemory.nc', memory=nc_bytes) >>> print(nc) root group (NETCDF4 data model, file format HDF5): dimensions(sizes): x(5) variables(dimensions): int32 v(x) groups: >>> print(nc['v'][:]) [0 1 2 3 4] >>> nc.close() >>> # create an in-memory Dataset and retrieve memory buffer >>> # estimated size is 1028 bytes - this is actually only >>> # used if format is NETCDF3 >>> # (ignored for NETCDF4/HDF5 files). >>> nc = Dataset('inmemory.nc', mode='w',memory=1028) >>> d = nc.createDimension('x',None) >>> v = nc.createVariable('v',np.int32,'x') >>> v[0:5] = np.arange(5) >>> nc_buf = nc.close() # close returns memoryview >>> print(type(nc_buf)) >>> # save nc_buf to disk, read it back in and check. >>> with open('inmemory.nc', 'wb') as f: ... f.write(nc_buf) >>> nc = Dataset('inmemory.nc') >>> print(nc) root group (NETCDF4 data model, file format HDF5): dimensions(sizes): x(5) variables(dimensions): int32 v(x) groups: >>> print(nc['v'][:]) [0 1 2 3 4] >>> nc.close() ``` All of the code in this tutorial is available in `examples/tutorial.py`, except the parallel IO example, which is in `examples/mpi_example.py`. Unit tests are in the `test` directory. **contact**: Jeffrey Whitaker **copyright**: 2008 by Jeffrey Whitaker. **license**: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ # Make changes to this file, not the c-wrappers that Cython generates. from cpython.mem cimport PyMem_Malloc, PyMem_Free from cpython.buffer cimport PyObject_GetBuffer, PyBuffer_Release, PyBUF_SIMPLE, PyBUF_ANY_CONTIGUOUS from cpython.bytes cimport PyBytes_FromStringAndSize # pure python utilities from .utils import (_StartCountStride, _quantize, _find_dim, _walk_grps, _out_array_shape, _sortbylist, _tostr, _safecast, _is_int) import sys if sys.version_info[0:2] < (3, 7): # Python 3.7+ guarantees order; older versions need OrderedDict from collections import OrderedDict __version__ = "1.5.8" # Initialize numpy import posixpath from cftime import date2num, num2date, date2index import numpy import weakref import warnings import subprocess import pathlib from glob import glob from numpy import ma from libc.string cimport memcpy, memset from libc.stdlib cimport malloc, free import_array() include "constants.pyx" include "membuf.pyx" include "netCDF4.pxi" IF HAS_PARALLEL4_SUPPORT or HAS_PNETCDF_SUPPORT: cimport mpi4py.MPI as MPI from mpi4py.libmpi cimport MPI_Comm, MPI_Info, MPI_Comm_dup, MPI_Info_dup, \ MPI_Comm_free, MPI_Info_free, MPI_INFO_NULL,\ MPI_COMM_WORLD ctypedef MPI.Comm Comm ctypedef MPI.Info Info ELSE: ctypedef object Comm ctypedef object Info # check for required version of netcdf-4 and hdf5. def _gethdf5libversion(): cdef unsigned int majorvers, minorvers, releasevers cdef herr_t ierr ierr = H5get_libversion( &majorvers, &minorvers, &releasevers) if ierr < 0: raise RuntimeError('error getting HDF5 library version info') return '%d.%d.%d' % (majorvers,minorvers,releasevers) def getlibversion(): """ **`getlibversion()`** returns a string describing the version of the netcdf library used to build the module, and when it was built. """ return (nc_inq_libvers()).decode('ascii') def get_chunk_cache(): """ **`get_chunk_cache()`** return current netCDF chunk cache information in a tuple (size,nelems,preemption). See netcdf C library documentation for `nc_get_chunk_cache` for details. Values can be reset with `set_chunk_cache`.""" cdef int ierr cdef size_t sizep, nelemsp cdef float preemptionp ierr = nc_get_chunk_cache(&sizep, &nelemsp, &preemptionp) _ensure_nc_success(ierr) size = sizep; nelems = nelemsp; preemption = preemptionp return (size,nelems,preemption) def set_chunk_cache(size=None,nelems=None,preemption=None): """ **`set_chunk_cache(self,size=None,nelems=None,preemption=None)`** change netCDF4 chunk cache settings. See netcdf C library documentation for `nc_set_chunk_cache` for details.""" cdef int ierr cdef size_t sizep, nelemsp cdef float preemptionp # reset chunk cache size, leave other parameters unchanged. size_orig, nelems_orig, preemption_orig = get_chunk_cache() if size is not None: sizep = size else: sizep = size_orig if nelems is not None: nelemsp = nelems else: nelemsp = nelems_orig if preemption is not None: preemptionp = preemption else: preemptionp = preemption_orig ierr = nc_set_chunk_cache(sizep,nelemsp, preemptionp) _ensure_nc_success(ierr) __netcdf4libversion__ = getlibversion().split()[0] __hdf5libversion__ = _gethdf5libversion() __has_rename_grp__ = HAS_RENAME_GRP __has_nc_inq_path__ = HAS_NC_INQ_PATH __has_nc_inq_format_extended__ = HAS_NC_INQ_FORMAT_EXTENDED __has_cdf5_format__ = HAS_CDF5_FORMAT __has_nc_open_mem__ = HAS_NC_OPEN_MEM __has_nc_create_mem__ = HAS_NC_CREATE_MEM __has_parallel4_support__ = HAS_PARALLEL4_SUPPORT __has_pnetcdf_support__ = HAS_PNETCDF_SUPPORT _needsworkaround_issue485 = __netcdf4libversion__ < "4.4.0" or \ (__netcdf4libversion__.startswith("4.4.0") and \ "-development" in __netcdf4libversion__) # issue warning for hdf5 1.10 (issue #549) if __netcdf4libversion__[0:5] < "4.4.1" and\ __hdf5libversion__.startswith("1.10"): msg = """ WARNING: Backwards incompatible files will be created with HDF5 1.10.x and netCDF < 4.4.1. Upgrading to netCDF4 >= 4.4.1 or downgrading to to HDF5 version 1.8.x is highly recommended (see https://github.com/Unidata/netcdf-c/issues/250).""" warnings.warn(msg) # numpy data type <--> netCDF 4 data type mapping. _nptonctype = {'S1' : NC_CHAR, 'i1' : NC_BYTE, 'u1' : NC_UBYTE, 'i2' : NC_SHORT, 'u2' : NC_USHORT, 'i4' : NC_INT, 'u4' : NC_UINT, 'i8' : NC_INT64, 'u8' : NC_UINT64, 'f4' : NC_FLOAT, 'f8' : NC_DOUBLE} # just integer types. _intnptonctype = {'i1' : NC_BYTE, 'u1' : NC_UBYTE, 'i2' : NC_SHORT, 'u2' : NC_USHORT, 'i4' : NC_INT, 'u4' : NC_UINT, 'i8' : NC_INT64, 'u8' : NC_UINT64} # create dictionary mapping string identifiers to netcdf format codes _format_dict = {'NETCDF3_CLASSIC' : NC_FORMAT_CLASSIC, 'NETCDF4_CLASSIC' : NC_FORMAT_NETCDF4_CLASSIC, 'NETCDF4' : NC_FORMAT_NETCDF4} # create dictionary mapping string identifiers to netcdf create format codes _cmode_dict = {'NETCDF3_CLASSIC' : NC_CLASSIC_MODEL, 'NETCDF4_CLASSIC' : NC_CLASSIC_MODEL | NC_NETCDF4, 'NETCDF4' : NC_NETCDF4} IF HAS_CDF5_FORMAT: # NETCDF3_64BIT deprecated, saved for compatibility. # use NETCDF3_64BIT_OFFSET instead. _format_dict['NETCDF3_64BIT_OFFSET'] = NC_FORMAT_64BIT_OFFSET _format_dict['NETCDF3_64BIT_DATA'] = NC_FORMAT_64BIT_DATA _cmode_dict['NETCDF3_64BIT_OFFSET'] = NC_64BIT_OFFSET _cmode_dict['NETCDF3_64BIT_DATA'] = NC_64BIT_DATA ELSE: _format_dict['NETCDF3_64BIT'] = NC_FORMAT_64BIT _cmode_dict['NETCDF3_64BIT'] = NC_64BIT_OFFSET # invert dictionary mapping _reverse_format_dict = dict((v, k) for k, v in _format_dict.iteritems()) # add duplicate entry (NETCDF3_64BIT == NETCDF3_64BIT_OFFSET) IF HAS_CDF5_FORMAT: _format_dict['NETCDF3_64BIT'] = NC_FORMAT_64BIT_OFFSET _cmode_dict['NETCDF3_64BIT'] = NC_64BIT_OFFSET ELSE: _format_dict['NETCDF3_64BIT_OFFSET'] = NC_FORMAT_64BIT _cmode_dict['NETCDF3_64BIT_OFFSET'] = NC_64BIT_OFFSET # default fill_value to numpy datatype mapping. default_fillvals = {#'S1':NC_FILL_CHAR, 'S1':'\0', 'i1':NC_FILL_BYTE, 'u1':NC_FILL_UBYTE, 'i2':NC_FILL_SHORT, 'u2':NC_FILL_USHORT, 'i4':NC_FILL_INT, 'u4':NC_FILL_UINT, 'i8':NC_FILL_INT64, 'u8':NC_FILL_UINT64, 'f4':NC_FILL_FLOAT, 'f8':NC_FILL_DOUBLE} # logical for native endian type. is_native_little = numpy.dtype('f4').byteorder == '=' # hard code these here, instead of importing from netcdf.h # so it will compile with versions <= 4.2. NC_DISKLESS = 0x0008 # introduced in 4.6.2 if __netcdf4libversion__[0:5] >= "4.6.2": NC_PERSIST = 0x4000 else: # prior to 4.6.2 this flag doesn't work, so make the same as NC_DISKLESS NC_PERSIST = NC_DISKLESS # next two lines do nothing, preserved for backwards compatibility. default_encoding = 'utf-8' unicode_error = 'replace' _nctonptype = {} for _key,_value in _nptonctype.items(): _nctonptype[_value] = _key _supportedtypes = _nptonctype.keys() # make sure NC_CHAR points to S1 _nctonptype[NC_CHAR]='S1' # internal C functions. cdef _get_att_names(int grpid, int varid): # Private function to get all the attribute names in a group cdef int ierr, numatts, n cdef char namstring[NC_MAX_NAME+1] if varid == NC_GLOBAL: with nogil: ierr = nc_inq_natts(grpid, &numatts) else: with nogil: ierr = nc_inq_varnatts(grpid, varid, &numatts) _ensure_nc_success(ierr, err_cls=AttributeError) attslist = [] for n from 0 <= n < numatts: with nogil: ierr = nc_inq_attname(grpid, varid, n, namstring) _ensure_nc_success(ierr, err_cls=AttributeError) # attribute names are assumed to be utf-8 attslist.append(namstring.decode('utf-8')) return attslist cdef _get_att(grp, int varid, name, encoding='utf-8'): # Private function to get an attribute value given its name cdef int ierr, n, _grpid cdef size_t att_len cdef char *attname cdef nc_type att_type cdef ndarray value_arr # attribute names are assumed to be utf-8 bytestr = _strencode(name,encoding='utf-8') attname = bytestr _grpid = grp._grpid with nogil: ierr = nc_inq_att(_grpid, varid, attname, &att_type, &att_len) _ensure_nc_success(ierr, err_cls=AttributeError) # attribute is a character or string ... if att_type == NC_CHAR: value_arr = numpy.empty(att_len,'S1') with nogil: ierr = nc_get_att_text(_grpid, varid, attname, PyArray_BYTES(value_arr)) _ensure_nc_success(ierr, err_cls=AttributeError) if name == '_FillValue': # make sure _FillValue for character arrays is a byte on python 3 # (issue 271). pstring = value_arr.tobytes() else: pstring =\ value_arr.tobytes().decode(encoding,errors='replace').replace('\x00','') return pstring elif att_type == NC_STRING: values = PyMem_Malloc(sizeof(char*) * att_len) if not values: raise MemoryError() try: with nogil: ierr = nc_get_att_string(_grpid, varid, attname, values) _ensure_nc_success(ierr, err_cls=AttributeError) try: result = [values[j].decode(encoding,errors='replace').replace('\x00','') if values[j] else "" for j in range(att_len)] finally: ierr = nc_free_string(att_len, values) # free memory in netcdf C lib finally: PyMem_Free(values) if len(result) == 1: return result[0] else: return result else: # a regular numeric or compound type. if att_type == NC_LONG: att_type = NC_INT try: type_att = _nctonptype[att_type] # see if it is a primitive type value_arr = numpy.empty(att_len,type_att) except KeyError: # check if it's a compound try: type_att = _read_compound(grp, att_type) value_arr = numpy.empty(att_len,type_att.dtype_view) except: # check if it's an enum try: type_att = _read_enum(grp, att_type) value_arr = numpy.empty(att_len,type_att.dtype) except: raise KeyError('attribute %s has unsupported datatype' % attname) with nogil: ierr = nc_get_att(_grpid, varid, attname, PyArray_BYTES(value_arr)) _ensure_nc_success(ierr, err_cls=AttributeError) if value_arr.shape == (): # return a scalar for a scalar array return value_arr.item() elif att_len == 1: # return a scalar for a single element array return value_arr[0] else: return value_arr def _set_default_format(object format='NETCDF4'): # Private function to set the netCDF file format if format not in _format_dict: raise ValueError("unrecognized format requested") nc_set_default_format(_format_dict[format], NULL) cdef _get_format(int grpid): # Private function to get the netCDF file format cdef int ierr, formatp with nogil: ierr = nc_inq_format(grpid, &formatp) _ensure_nc_success(ierr) if formatp not in _reverse_format_dict: raise ValueError('format not supported by python interface') return _reverse_format_dict[formatp] cdef _get_full_format(int grpid): # Private function to get the underlying disk format cdef int ierr, formatp, modep IF HAS_NC_INQ_FORMAT_EXTENDED: with nogil: ierr = nc_inq_format_extended(grpid, &formatp, &modep) _ensure_nc_success(ierr) if formatp == NC_FORMAT_NC3: return 'NETCDF3' elif formatp == NC_FORMAT_NC_HDF5: return 'HDF5' elif formatp == NC_FORMAT_NC_HDF4: return 'HDF4' elif formatp == NC_FORMAT_PNETCDF: return 'PNETCDF' elif formatp == NC_FORMAT_DAP2: return 'DAP2' elif formatp == NC_FORMAT_DAP4: return 'DAP4' elif formatp == NC_FORMAT_UNDEFINED: return 'UNDEFINED' ELSE: return 'UNDEFINED' cdef issue485_workaround(int grpid, int varid, char* attname): # check to see if attribute already exists # and is NC_CHAR, if so delete it and re-create it # (workaround for issue #485). Fixed in C library # with commit 473259b7728120bb281c52359b1af50cca2fcb72, # which was included in 4.4.0-RC5. cdef nc_type att_type cdef size_t att_len if not _needsworkaround_issue485: return ierr = nc_inq_att(grpid, varid, attname, &att_type, &att_len) if ierr == NC_NOERR and att_type == NC_CHAR: ierr = nc_del_att(grpid, varid, attname) _ensure_nc_success(ierr) cdef _set_att(grp, int varid, name, value,\ nc_type xtype=-99, force_ncstring=False): # Private function to set an attribute name/value pair cdef int ierr, lenarr cdef char *attname cdef char *datstring cdef char **string_ptrs cdef ndarray value_arr bytestr = _strencode(name) attname = bytestr # put attribute value into a numpy array. value_arr = numpy.array(value) if value_arr.ndim > 1: # issue #841 if __version__ > "1.4.2": raise ValueError('multi-dimensional array attributes not supported') else: msg = """ Multi-dimensional array attributes are now deprecated. Instead of silently flattening the array, an error will be raised in the next release.""" warnings.warn(msg,FutureWarning) # if array is 64 bit integers or # if 64-bit datatype not supported, cast to 32 bit integers. fmt = _get_format(grp._grpid) is_netcdf3 = fmt.startswith('NETCDF3') or fmt == 'NETCDF4_CLASSIC' if value_arr.dtype.str[1:] == 'i8' and ('i8' not in _supportedtypes or\ (is_netcdf3 and fmt != 'NETCDF3_64BIT_DATA')): value_arr = value_arr.astype('i4') # if array contains ascii strings, write a text attribute (stored as bytes). # if array contains unicode strings, and data model is NETCDF4, # write as a string. if value_arr.dtype.char in ['S','U']: # force array of strings if array has multiple elements (issue #770) N = value_arr.size if N > 1: force_ncstring=True if not is_netcdf3 and force_ncstring and N > 1: string_ptrs = PyMem_Malloc(N * sizeof(char*)) if not string_ptrs: raise MemoryError() try: strings = [_strencode(s) for s in value_arr.flat] for j in range(N): if len(strings[j]) == 0: strings[j] = _strencode('\x00') string_ptrs[j] = strings[j] issue485_workaround(grp._grpid, varid, attname) ierr = nc_put_att_string(grp._grpid, varid, attname, N, string_ptrs) finally: PyMem_Free(string_ptrs) else: # don't allow string array attributes in NETCDF3 files. if is_netcdf3 and N > 1: msg='array string attributes can only be written with NETCDF4' raise IOError(msg) if not value_arr.shape: dats = _strencode(value_arr.item()) else: value_arr1 = value_arr.ravel() dats = _strencode(''.join(value_arr1.tolist())) lenarr = len(dats) datstring = dats if lenarr == 0: # write null byte lenarr=1; datstring = '\x00' if (force_ncstring or value_arr.dtype.char == 'U') and not is_netcdf3: # try to convert to ascii string, write as NC_CHAR # else it's a unicode string, write as NC_STRING (if NETCDF4) try: if force_ncstring: raise UnicodeError dats_ascii = _to_ascii(dats) # try to encode bytes as ascii string ierr = nc_put_att_text(grp._grpid, varid, attname, lenarr, datstring) except UnicodeError: issue485_workaround(grp._grpid, varid, attname) ierr = nc_put_att_string(grp._grpid, varid, attname, 1, &datstring) else: ierr = nc_put_att_text(grp._grpid, varid, attname, lenarr, datstring) _ensure_nc_success(ierr, err_cls=AttributeError) # a 'regular' array type ('f4','i4','f8' etc) else: if value_arr.dtype.kind == 'V': # compound attribute. xtype = _find_cmptype(grp,value_arr.dtype) elif value_arr.dtype.str[1:] not in _supportedtypes: raise TypeError, 'illegal data type for attribute %r, must be one of %s, got %s' % (attname, _supportedtypes, value_arr.dtype.str[1:]) elif xtype == -99: # if xtype is not passed in as kwarg. xtype = _nptonctype[value_arr.dtype.str[1:]] lenarr = PyArray_SIZE(value_arr) ierr = nc_put_att(grp._grpid, varid, attname, xtype, lenarr, PyArray_DATA(value_arr)) _ensure_nc_success(ierr, err_cls=AttributeError) cdef _get_types(group): # Private function to create `CompoundType`, # `VLType` or `EnumType` instances for all the # compound, VLEN or Enum types in a `Group` or `Dataset`. cdef int ierr, ntypes, classp, n, _grpid cdef nc_type xtype cdef nc_type *typeids cdef char namstring[NC_MAX_NAME+1] _grpid = group._grpid # get the number of user defined types in this group. with nogil: ierr = nc_inq_typeids(_grpid, &ntypes, NULL) _ensure_nc_success(ierr) if ntypes > 0: typeids = malloc(sizeof(nc_type) * ntypes) with nogil: ierr = nc_inq_typeids(_grpid, &ntypes, typeids) _ensure_nc_success(ierr) # create empty dictionary for CompoundType instances. if sys.version_info[0:2] < (3, 7): cmptypes = OrderedDict() vltypes = OrderedDict() enumtypes = OrderedDict() else: cmptypes = dict() vltypes = dict() enumtypes = dict() if ntypes > 0: for n from 0 <= n < ntypes: xtype = typeids[n] with nogil: ierr = nc_inq_user_type(_grpid, xtype, namstring, NULL,NULL,NULL,&classp) _ensure_nc_success(ierr) if classp == NC_COMPOUND: # a compound name = namstring.decode('utf-8') # read the compound type info from the file, # create a CompoundType instance from it. try: cmptype = _read_compound(group, xtype) except KeyError: msg='WARNING: unsupported Compound type, skipping...' warnings.warn(msg) continue cmptypes[name] = cmptype elif classp == NC_VLEN: # a vlen name = namstring.decode('utf-8') # read the VLEN type info from the file, # create a VLType instance from it. try: vltype = _read_vlen(group, xtype) except KeyError: msg='WARNING: unsupported VLEN type, skipping...' warnings.warn(msg) continue vltypes[name] = vltype elif classp == NC_ENUM: # an enum type name = namstring.decode('utf-8') # read the Enum type info from the file, # create a EnumType instance from it. try: enumtype = _read_enum(group, xtype) except KeyError: msg='WARNING: unsupported Enum type, skipping...' warnings.warn(msg) continue enumtypes[name] = enumtype free(typeids) return cmptypes, vltypes, enumtypes cdef _get_dims(group): # Private function to create `Dimension` instances for all the # dimensions in a `Group` or Dataset cdef int ierr, numdims, n, _grpid cdef int *dimids cdef char namstring[NC_MAX_NAME+1] # get number of dimensions in this Group. _grpid = group._grpid with nogil: ierr = nc_inq_ndims(_grpid, &numdims) _ensure_nc_success(ierr) # create empty dictionary for dimensions. if sys.version_info[0:2] < (3, 7): dimensions = OrderedDict() else: dimensions = dict() if numdims > 0: dimids = malloc(sizeof(int) * numdims) if group.data_model == 'NETCDF4': with nogil: ierr = nc_inq_dimids(_grpid, &numdims, dimids, 0) _ensure_nc_success(ierr) else: for n from 0 <= n < numdims: dimids[n] = n for n from 0 <= n < numdims: with nogil: ierr = nc_inq_dimname(_grpid, dimids[n], namstring) _ensure_nc_success(ierr) name = namstring.decode('utf-8') dimensions[name] = Dimension(group, name, id=dimids[n]) free(dimids) return dimensions cdef _get_grps(group): # Private function to create `Group` instances for all the # groups in a `Group` or Dataset cdef int ierr, numgrps, n, _grpid cdef int *grpids cdef char namstring[NC_MAX_NAME+1] # get number of groups in this Group. _grpid = group._grpid with nogil: ierr = nc_inq_grps(_grpid, &numgrps, NULL) _ensure_nc_success(ierr) # create dictionary containing `Group` instances for groups in this group if sys.version_info[0:2] < (3, 7): groups = OrderedDict() else: groups = dict() if numgrps > 0: grpids = malloc(sizeof(int) * numgrps) with nogil: ierr = nc_inq_grps(_grpid, NULL, grpids) _ensure_nc_success(ierr) for n from 0 <= n < numgrps: with nogil: ierr = nc_inq_grpname(grpids[n], namstring) _ensure_nc_success(ierr) name = namstring.decode('utf-8') groups[name] = Group(group, name, id=grpids[n]) free(grpids) return groups cdef _get_vars(group): # Private function to create `Variable` instances for all the # variables in a `Group` or Dataset cdef int ierr, numvars, n, nn, numdims, varid, classp, iendian, _grpid cdef int *varids cdef int *dimids cdef nc_type xtype cdef char namstring[NC_MAX_NAME+1] cdef char namstring_cmp[NC_MAX_NAME+1] # get number of variables in this Group. _grpid = group._grpid with nogil: ierr = nc_inq_nvars(_grpid, &numvars) _ensure_nc_success(ierr, err_cls=AttributeError) # create empty dictionary for variables. if sys.version_info[0:2] < (3, 7): variables = OrderedDict() else: variables = dict() if numvars > 0: # get variable ids. varids = malloc(sizeof(int) * numvars) if group.data_model == 'NETCDF4': with nogil: ierr = nc_inq_varids(_grpid, &numvars, varids) _ensure_nc_success(ierr) else: for n from 0 <= n < numvars: varids[n] = n # loop over variables. for n from 0 <= n < numvars: varid = varids[n] # get variable name. with nogil: ierr = nc_inq_varname(_grpid, varid, namstring) _ensure_nc_success(ierr) name = namstring.decode('utf-8') # get variable type. with nogil: ierr = nc_inq_vartype(_grpid, varid, &xtype) _ensure_nc_success(ierr) # get endian-ness of variable. endianness = None with nogil: ierr = nc_inq_var_endian(_grpid, varid, &iendian) if ierr == NC_NOERR and iendian == NC_ENDIAN_LITTLE: endianness = '<' elif iendian == NC_ENDIAN_BIG: endianness = '>' # check to see if it is a supported user-defined type. try: datatype = _nctonptype[xtype] if endianness is not None: datatype = endianness + datatype except KeyError: if xtype == NC_STRING: datatype = str else: with nogil: ierr = nc_inq_user_type(_grpid, xtype, namstring_cmp, NULL, NULL, NULL, &classp) _ensure_nc_success(ierr) if classp == NC_COMPOUND: # a compound type # create CompoundType instance describing this compound type. try: datatype = _read_compound(group, xtype, endian=endianness) except KeyError: msg="WARNING: variable '%s' has unsupported compound datatype, skipping .." % name warnings.warn(msg) continue elif classp == NC_VLEN: # a compound type # create VLType instance describing this compound type. try: datatype = _read_vlen(group, xtype, endian=endianness) except KeyError: msg="WARNING: variable '%s' has unsupported VLEN datatype, skipping .." % name warnings.warn(msg) continue elif classp == NC_ENUM: # create EnumType instance describing this compound type. try: datatype = _read_enum(group, xtype, endian=endianness) except KeyError: msg="WARNING: variable '%s' has unsupported Enum datatype, skipping .." % name warnings.warn(msg) continue else: msg="WARNING: variable '%s' has unsupported datatype, skipping .." % name warnings.warn(msg) continue # get number of dimensions. with nogil: ierr = nc_inq_varndims(_grpid, varid, &numdims) _ensure_nc_success(ierr) dimids = malloc(sizeof(int) * numdims) # get dimension ids. with nogil: ierr = nc_inq_vardimid(_grpid, varid, dimids) _ensure_nc_success(ierr) # loop over dimensions, retrieve names. # if not found in current group, look in parents. # QUESTION: what if grp1 has a dimension named 'foo' # and so does it's parent - can a variable in grp1 # use the 'foo' dimension from the parent? dimensions = [] for nn from 0 <= nn < numdims: grp = group found = False while not found: for key, value in grp.dimensions.items(): if value._dimid == dimids[nn]: dimensions.append(key) found = True break grp = grp.parent free(dimids) # create new variable instance. if endianness == '>': variables[name] = Variable(group, name, datatype, dimensions, id=varid, endian='big') elif endianness == '<': variables[name] = Variable(group, name, datatype, dimensions, id=varid, endian='little') else: variables[name] = Variable(group, name, datatype, dimensions, id=varid) free(varids) # free pointer holding variable ids. return variables cdef _ensure_nc_success(ierr, err_cls=RuntimeError, filename=None): # print netcdf error message, raise error. if ierr != NC_NOERR: err_str = (nc_strerror(ierr)).decode('ascii') if issubclass(err_cls, EnvironmentError): raise err_cls(ierr, err_str, filename) else: raise err_cls(err_str) # these are class attributes that # only exist at the python level (not in the netCDF file). _private_atts = \ ['_grpid','_grp','_varid','groups','dimensions','variables','dtype','data_model','disk_format', '_nunlimdim','path','parent','ndim','mask','scale','cmptypes','vltypes','enumtypes','_isprimitive', 'file_format','_isvlen','_isenum','_iscompound','_cmptype','_vltype','_enumtype','name', '__orthogoral_indexing__','keepweakref','_has_lsd', '_buffer','chartostring','_use_get_vars','_ncstring_attrs__'] cdef class Dataset: """ A netCDF `Dataset` is a collection of dimensions, groups, variables and attributes. Together they describe the meaning of data and relations among data fields stored in a netCDF file. See `Dataset.__init__` for more details. A list of attribute names corresponding to global netCDF attributes defined for the `Dataset` can be obtained with the `Dataset.ncattrs` method. These attributes can be created by assigning to an attribute of the `Dataset` instance. A dictionary containing all the netCDF attribute name/value pairs is provided by the `__dict__` attribute of a `Dataset` instance. The following class variables are read-only and should not be modified by the user. **`dimensions`**: The `dimensions` dictionary maps the names of dimensions defined for the `Group` or `Dataset` to instances of the `Dimension` class. **`variables`**: The `variables` dictionary maps the names of variables defined for this `Dataset` or `Group` to instances of the `Variable` class. **`groups`**: The groups dictionary maps the names of groups created for this `Dataset` or `Group` to instances of the `Group` class (the `Dataset` class is simply a special case of the `Group` class which describes the root group in the netCDF4 file). **`cmptypes`**: The `cmptypes` dictionary maps the names of compound types defined for the `Group` or `Dataset` to instances of the `CompoundType` class. **`vltypes`**: The `vltypes` dictionary maps the names of variable-length types defined for the `Group` or `Dataset` to instances of the `VLType` class. **`enumtypes`**: The `enumtypes` dictionary maps the names of Enum types defined for the `Group` or `Dataset` to instances of the `EnumType` class. **`data_model`**: `data_model` describes the netCDF data model version, one of `NETCDF3_CLASSIC`, `NETCDF4`, `NETCDF4_CLASSIC`, `NETCDF3_64BIT_OFFSET` or `NETCDF3_64BIT_DATA`. **`file_format`**: same as `data_model`, retained for backwards compatibility. **`disk_format`**: `disk_format` describes the underlying file format, one of `NETCDF3`, `HDF5`, `HDF4`, `PNETCDF`, `DAP2`, `DAP4` or `UNDEFINED`. Only available if using netcdf C library version >= 4.3.1, otherwise will always return `UNDEFINED`. **`parent`**: `parent` is a reference to the parent `Group` instance. `None` for the root group or `Dataset` instance. **`path`**: `path` shows the location of the `Group` in the `Dataset` in a unix directory format (the names of groups in the hierarchy separated by backslashes). A `Dataset` instance is the root group, so the path is simply `'/'`. **`keepweakref`**: If `True`, child Dimension and Variables objects only keep weak references to the parent Dataset or Group. **`_ncstring_attrs__`**: If `True`, all text attributes will be written as variable-length strings. """ cdef object __weakref__, _inmemory cdef public int _grpid cdef public int _isopen cdef Py_buffer _buffer cdef public groups, dimensions, variables, disk_format, path, parent,\ file_format, data_model, cmptypes, vltypes, enumtypes, __orthogonal_indexing__, \ keepweakref, _ncstring_attrs__ def __init__(self, filename, mode='r', clobber=True, format='NETCDF4', diskless=False, persist=False, keepweakref=False, memory=None, encoding=None, parallel=False, Comm comm=None, Info info=None, **kwargs): """ **`__init__(self, filename, mode="r", clobber=True, diskless=False, persist=False, keepweakref=False, memory=None, encoding=None, parallel=False, comm=None, info=None, format='NETCDF4')`** `Dataset` constructor. **`filename`**: Name of netCDF file to hold dataset. Can also be a python 3 pathlib instance or the URL of an OpenDAP dataset. When memory is set this is just used to set the `filepath()`. **`mode`**: access mode. `r` means read-only; no data can be modified. `w` means write; a new file is created, an existing file with the same name is deleted. `a` and `r+` mean append (in analogy with serial files); an existing file is opened for reading and writing. Appending `s` to modes `r`, `w`, `r+` or `a` will enable unbuffered shared access to `NETCDF3_CLASSIC`, `NETCDF3_64BIT_OFFSET` or `NETCDF3_64BIT_DATA` formatted files. Unbuffered access may be useful even if you don't need shared access, since it may be faster for programs that don't access data sequentially. This option is ignored for `NETCDF4` and `NETCDF4_CLASSIC` formatted files. **`clobber`**: if `True` (default), opening a file with `mode='w'` will clobber an existing file with the same name. if `False`, an exception will be raised if a file with the same name already exists. **`format`**: underlying file format (one of `'NETCDF4', 'NETCDF4_CLASSIC', 'NETCDF3_CLASSIC'`, `'NETCDF3_64BIT_OFFSET'` or `'NETCDF3_64BIT_DATA'`. Only relevant if `mode = 'w'` (if `mode = 'r','a'` or `'r+'` the file format is automatically detected). Default `'NETCDF4'`, which means the data is stored in an HDF5 file, using netCDF 4 API features. Setting `format='NETCDF4_CLASSIC'` will create an HDF5 file, using only netCDF 3 compatible API features. netCDF 3 clients must be recompiled and linked against the netCDF 4 library to read files in `NETCDF4_CLASSIC` format. `'NETCDF3_CLASSIC'` is the classic netCDF 3 file format that does not handle 2+ Gb files. `'NETCDF3_64BIT_OFFSET'` is the 64-bit offset version of the netCDF 3 file format, which fully supports 2+ GB files, but is only compatible with clients linked against netCDF version 3.6.0 or later. `'NETCDF3_64BIT_DATA'` is the 64-bit data version of the netCDF 3 file format, which supports 64-bit dimension sizes plus unsigned and 64 bit integer data types, but is only compatible with clients linked against netCDF version 4.4.0 or later. **`diskless`**: If `True`, create diskless (in-core) file. This is a feature added to the C library after the netcdf-4.2 release. If you need to access the memory buffer directly, use the in-memory feature instead (see `memory` kwarg). **`persist`**: if `diskless=True`, persist file to disk when closed (default `False`). **`keepweakref`**: if `True`, child Dimension and Variable instances will keep weak references to the parent Dataset or Group object. Default is `False`, which means strong references will be kept. Having Dimension and Variable instances keep a strong reference to the parent Dataset instance, which in turn keeps a reference to child Dimension and Variable instances, creates circular references. Circular references complicate garbage collection, which may mean increased memory usage for programs that create may Dataset instances with lots of Variables. It also will result in the Dataset object never being deleted, which means it may keep open files alive as well. Setting `keepweakref=True` allows Dataset instances to be garbage collected as soon as they go out of scope, potentially reducing memory usage and open file handles. However, in many cases this is not desirable, since the associated Variable instances may still be needed, but are rendered unusable when the parent Dataset instance is garbage collected. **`memory`**: if not `None`, create or open an in-memory Dataset. If mode = 'r', the memory kwarg must contain a memory buffer object (an object that supports the python buffer interface). The Dataset will then be created with contents taken from this block of memory. If mode = 'w', the memory kwarg should contain the anticipated size of the Dataset in bytes (used only for NETCDF3 files). A memory buffer containing a copy of the Dataset is returned by the `Dataset.close` method. Requires netcdf-c version 4.4.1 for mode='r, netcdf-c 4.6.2 for mode='w'. To persist the file to disk, the raw bytes from the returned buffer can be written into a binary file. The Dataset can also be re-opened using this memory buffer. **`encoding`**: encoding used to encode filename string into bytes. Default is None (`sys.getdefaultfileencoding()` is used). **`parallel`**: open for parallel access using MPI (requires mpi4py and parallel-enabled netcdf-c and hdf5 libraries). Default is `False`. If `True`, `comm` and `info` kwargs may also be specified. **`comm`**: MPI_Comm object for parallel access. Default `None`, which means MPI_COMM_WORLD will be used. Ignored if `parallel=False`. **`info`**: MPI_Info object for parallel access. Default `None`, which means MPI_INFO_NULL will be used. Ignored if `parallel=False`. """ cdef int grpid, ierr, numgrps, numdims, numvars cdef size_t initialsize cdef char *path cdef char namstring[NC_MAX_NAME+1] cdef int cmode IF HAS_PARALLEL4_SUPPORT or HAS_PNETCDF_SUPPORT: cdef MPI_Comm mpicomm cdef MPI_Info mpiinfo memset(&self._buffer, 0, sizeof(self._buffer)) # flag to indicate that Variables in this Dataset support orthogonal indexing. self.__orthogonal_indexing__ = True if diskless and __netcdf4libversion__ < '4.2.1': #diskless = False # don't raise error, instead silently ignore raise ValueError('diskless mode requires netcdf lib >= 4.2.1, you have %s' % __netcdf4libversion__) # convert filename into string (from os.path object for example), # encode into bytes. if encoding is None: encoding = sys.getfilesystemencoding() bytestr = _strencode(_tostr(filename), encoding=encoding) path = bytestr if memory is not None and mode not in ['r','w']: msg='if memory kwarg specified, mode must be \'r\' or \'w\'' raise ValueError(msg) if parallel: IF HAS_PARALLEL4_SUPPORT != 1 and HAS_PNETCDF_SUPPORT != 1: msg='parallel mode requires MPI enabled netcdf-c' raise ValueError(msg) ELSE: parallel_formats = [] IF HAS_PARALLEL4_SUPPORT: parallel_formats += ['NETCDF4','NETCDF4_CLASSIC'] IF HAS_PNETCDF_SUPPORT: parallel_formats += ['NETCDF3_CLASSIC', 'NETCDF3_64BIT_OFFSET', 'NETCDF3_64BIT_DATA', 'NETCDF3_64BIT'] if format not in parallel_formats: msg='parallel mode only works with the following formats: ' + ' '.join(parallel_formats) raise ValueError(msg) if comm is not None: mpicomm = comm.ob_mpi else: mpicomm = MPI_COMM_WORLD if info is not None: mpiinfo = info.ob_mpi else: mpiinfo = MPI_INFO_NULL cmode = NC_MPIIO | _cmode_dict[format] self._inmemory = False if mode == 'w': _set_default_format(format=format) if memory is not None: # if memory is not None and mode='w', memory # kwarg is interpreted as advisory size. IF HAS_NC_CREATE_MEM: initialsize = memory ierr = nc_create_mem(path, 0, initialsize, &grpid) self._inmemory = True # checked in close method ELSE: msg = """ nc_create_mem functionality not enabled. To enable, install Cython, make sure you have version 4.6.2 or higher of the netcdf C lib, and rebuild netcdf4-python.""" raise ValueError(msg) else: if clobber: if parallel: IF HAS_PARALLEL4_SUPPORT or HAS_PNETCDF_SUPPORT: ierr = nc_create_par(path, NC_CLOBBER | cmode, \ mpicomm, mpiinfo, &grpid) ELSE: pass elif diskless: if persist: ierr = nc_create(path, NC_WRITE | NC_CLOBBER | NC_DISKLESS | NC_PERSIST, &grpid) else: ierr = nc_create(path, NC_CLOBBER | NC_DISKLESS , &grpid) else: ierr = nc_create(path, NC_CLOBBER, &grpid) else: if parallel: IF HAS_PARALLEL4_SUPPORT or HAS_PNETCDF_SUPPORT: ierr = nc_create_par(path, NC_NOCLOBBER | cmode, \ mpicomm, mpiinfo, &grpid) ELSE: pass elif diskless: if persist: ierr = nc_create(path, NC_WRITE | NC_NOCLOBBER | NC_DISKLESS | NC_PERSIST , &grpid) else: ierr = nc_create(path, NC_NOCLOBBER | NC_DISKLESS , &grpid) else: ierr = nc_create(path, NC_NOCLOBBER, &grpid) # reset default format to netcdf3 - this is a workaround # for issue 170 (nc_open'ing a DAP dataset after switching # format to NETCDF4). This bug should be fixed in version # 4.3.0 of the netcdf library (add a version check here?). # **this causes parallel mode to fail when both hdf5-parallel and # pnetcdf are enabled - issue #820 ** #_set_default_format(format='NETCDF3_64BIT_OFFSET') elif mode in ('r', 'rs'): if memory is not None: IF HAS_NC_OPEN_MEM: # Store reference to memory result = PyObject_GetBuffer(memory, &self._buffer, PyBUF_SIMPLE | PyBUF_ANY_CONTIGUOUS) if result != 0: raise ValueError("Unable to retrieve Buffer from %s" % (memory,)) ierr = nc_open_mem(path, 0, self._buffer.len, self._buffer.buf, &grpid) ELSE: msg = """ nc_open_mem functionality not enabled. To enable, install Cython, make sure you have version 4.4.1 or higher of the netcdf C lib, and rebuild netcdf4-python.""" raise ValueError(msg) elif parallel: IF HAS_PARALLEL4_SUPPORT or HAS_PNETCDF_SUPPORT: ierr = nc_open_par(path, NC_NOWRITE | NC_MPIIO, \ mpicomm, mpiinfo, &grpid) ELSE: pass elif diskless: ierr = nc_open(path, NC_NOWRITE | NC_DISKLESS, &grpid) else: if mode == 'rs': # NC_SHARE is very important for speed reading # large netcdf3 files with a record dimension # (pull request #902). ierr = nc_open(path, NC_NOWRITE | NC_SHARE, &grpid) else: ierr = nc_open(path, NC_NOWRITE, &grpid) elif mode == 'r+' or mode == 'a': if parallel: IF HAS_PARALLEL4_SUPPORT or HAS_PNETCDF_SUPPORT: ierr = nc_open_par(path, NC_WRITE | NC_MPIIO, \ mpicomm, mpiinfo, &grpid) ELSE: pass elif diskless: ierr = nc_open(path, NC_WRITE | NC_DISKLESS, &grpid) else: ierr = nc_open(path, NC_WRITE, &grpid) elif mode == 'as' or mode == 'r+s': if parallel: # NC_SHARE ignored IF HAS_PARALLEL4_SUPPORT or HAS_PNETCDF_SUPPORT: ierr = nc_open_par(path, NC_WRITE | NC_MPIIO, \ mpicomm, mpiinfo, &grpid) ELSE: pass elif diskless: ierr = nc_open(path, NC_SHARE | NC_DISKLESS, &grpid) else: ierr = nc_open(path, NC_SHARE, &grpid) elif mode == 'ws': _set_default_format(format=format) if clobber: if parallel: # NC_SHARE ignored IF HAS_PARALLEL4_SUPPORT or HAS_PNETCDF_SUPPORT: ierr = nc_create_par(path, NC_CLOBBER | cmode, \ mpicomm, mpiinfo, &grpid) ELSE: pass elif diskless: if persist: ierr = nc_create(path, NC_WRITE | NC_SHARE | NC_CLOBBER | NC_DISKLESS , &grpid) else: ierr = nc_create(path, NC_SHARE | NC_CLOBBER | NC_DISKLESS , &grpid) else: ierr = nc_create(path, NC_SHARE | NC_CLOBBER, &grpid) else: if parallel: # NC_SHARE ignored IF HAS_PARALLEL4_SUPPORT or HAS_PNETCDF_SUPPORT: ierr = nc_create_par(path, NC_NOCLOBBER | cmode, \ mpicomm, mpiinfo, &grpid) ELSE: pass elif diskless: if persist: ierr = nc_create(path, NC_WRITE | NC_SHARE | NC_NOCLOBBER | NC_DISKLESS , &grpid) else: ierr = nc_create(path, NC_SHARE | NC_NOCLOBBER | NC_DISKLESS , &grpid) else: ierr = nc_create(path, NC_SHARE | NC_NOCLOBBER, &grpid) else: raise ValueError("mode must be 'w', 'r', 'a' or 'r+', got '%s'" % mode) _ensure_nc_success(ierr, err_cls=IOError, filename=path) # data model and file format attributes self.data_model = _get_format(grpid) # data_model attribute used to be file_format (versions < 1.0.8), retain # file_format for backwards compatibility. self.file_format = self.data_model self.disk_format = _get_full_format(grpid) # diskless read access only works with NETCDF_CLASSIC (for now) #ncopen = mode.startswith('a') or mode.startswith('r') #if diskless and self.data_model != 'NETCDF3_CLASSIC' and ncopen: # raise ValueError("diskless access only supported for NETCDF3_CLASSIC format") self._grpid = grpid self._isopen = 1 self.path = '/' self.parent = None self.keepweakref = keepweakref self._ncstring_attrs__ = False # get compound, vlen and enum types in the root Group. self.cmptypes, self.vltypes, self.enumtypes = _get_types(self) # get dimensions in the root group. self.dimensions = _get_dims(self) # get variables in the root Group. self.variables = _get_vars(self) # get groups in the root Group. if self.data_model == 'NETCDF4': self.groups = _get_grps(self) else: if sys.version_info[0:2] < (3, 7): self.groups = OrderedDict() else: self.groups = dict() # these allow Dataset objects to be used via a "with" statement. def __enter__(self): return self def __exit__(self,atype,value,traceback): self.close() def __getitem__(self, elem): # return variable or group defined in relative path. # split out group names in unix path. elem = posixpath.normpath(elem) # last name in path, could be a variable or group dirname, lastname = posixpath.split(elem) nestedgroups = dirname.split('/') group = self # iterate over groups in path. for g in nestedgroups: if g: group = group.groups[g] # return last one, either a group or a variable. if lastname in group.groups: return group.groups[lastname] elif lastname in group.variables: return group.variables[lastname] else: raise IndexError('%s not found in %s' % (lastname,group.path)) def filepath(self,encoding=None): """ **`filepath(self,encoding=None)`** Get the file system path (or the opendap URL) which was used to open/create the Dataset. Requires netcdf >= 4.1.2. The path is decoded into a string using `sys.getfilesystemencoding()` by default, this can be changed using the `encoding` kwarg.""" cdef int ierr cdef size_t pathlen cdef char *c_path if encoding is None: encoding = sys.getfilesystemencoding() IF HAS_NC_INQ_PATH: with nogil: ierr = nc_inq_path(self._grpid, &pathlen, NULL) _ensure_nc_success(ierr) c_path = malloc(sizeof(char) * (pathlen + 1)) if not c_path: raise MemoryError() try: with nogil: ierr = nc_inq_path(self._grpid, &pathlen, c_path) _ensure_nc_success(ierr) py_path = c_path[:pathlen] # makes a copy of pathlen bytes from c_string finally: free(c_path) return py_path.decode(encoding) ELSE: msg = """ filepath method not enabled. To enable, install Cython, make sure you have version 4.1.2 or higher of the netcdf C lib, and rebuild netcdf4-python.""" raise ValueError(msg) def __repr__(self): return self.__unicode__() def __unicode__(self): ncdump = [repr(type(self))] dimnames = tuple(_tostr(dimname)+'(%s)'%len(self.dimensions[dimname])\ for dimname in self.dimensions.keys()) varnames = tuple(\ [_tostr(self.variables[varname].dtype)+' '+_tostr(varname)+ ((_tostr(self.variables[varname].dimensions)).replace(",)",")")).replace("'","") for varname in self.variables.keys()]) grpnames = tuple(_tostr(grpname) for grpname in self.groups.keys()) if self.path == '/': ncdump.append('root group (%s data model, file format %s):' % (self.data_model, self.disk_format)) else: ncdump.append('group %s:' % self.path) for name in self.ncattrs(): ncdump.append(' %s: %s' % (name, self.getncattr(name))) ncdump.append(' dimensions(sizes): %s' % ', '.join(dimnames)) ncdump.append(' variables(dimensions): %s' % ', '.join(varnames)) ncdump.append(' groups: %s' % ', '.join(grpnames)) return '\n'.join(ncdump) def _close(self, check_err): cdef int ierr = nc_close(self._grpid) if check_err: _ensure_nc_success(ierr) self._isopen = 0 # indicates file already closed, checked by __dealloc__ # Only release buffer if close succeeded # per impl of PyBuffer_Release: https://github.com/python/cpython/blob/master/Objects/abstract.c#L667 # view.obj is checked, ref on obj is decremented and obj will be null'd out PyBuffer_Release(&self._buffer) IF HAS_NC_CREATE_MEM: def _close_mem(self, check_err): cdef int ierr cdef NC_memio memio ierr = nc_close_memio(self._grpid, &memio) if check_err: _ensure_nc_success(ierr) self._isopen = 0 PyBuffer_Release(&self._buffer) # membuf_fromptr from membuf.pyx - creates a python memoryview # from a raw pointer without making a copy. return memview_fromptr(memio.memory, memio.size) def close(self): """ **`close(self)`** Close the Dataset. """ IF HAS_NC_CREATE_MEM: if self._inmemory: return self._close_mem(True) else: self._close(True) ELSE: self._close(True) def isopen(self): """ **`isopen(self)`** Is the Dataset open or closed? """ return bool(self._isopen) def __dealloc__(self): # close file when there are no references to object left if self._isopen: self._close(False) def __reduce__(self): # raise error is user tries to pickle a Dataset object. raise NotImplementedError('Dataset is not picklable') def sync(self): """ **`sync(self)`** Writes all buffered data in the `Dataset` to the disk file.""" _ensure_nc_success(nc_sync(self._grpid)) def _redef(self): cdef int ierr ierr = nc_redef(self._grpid) def _enddef(self): cdef int ierr ierr = nc_enddef(self._grpid) def set_fill_on(self): """ **`set_fill_on(self)`** Sets the fill mode for a `Dataset` open for writing to `on`. This causes data to be pre-filled with fill values. The fill values can be controlled by the variable's `_Fill_Value` attribute, but is usually sufficient to the use the netCDF default `_Fill_Value` (defined separately for each variable type). The default behavior of the netCDF library corresponds to `set_fill_on`. Data which are equal to the `_Fill_Value` indicate that the variable was created, but never written to.""" cdef int oldmode _ensure_nc_success(nc_set_fill(self._grpid, NC_FILL, &oldmode)) def set_fill_off(self): """ **`set_fill_off(self)`** Sets the fill mode for a `Dataset` open for writing to `off`. This will prevent the data from being pre-filled with fill values, which may result in some performance improvements. However, you must then make sure the data is actually written before being read.""" cdef int oldmode _ensure_nc_success(nc_set_fill(self._grpid, NC_NOFILL, &oldmode)) def createDimension(self, dimname, size=None): """ **`createDimension(self, dimname, size=None)`** Creates a new dimension with the given `dimname` and `size`. `size` must be a positive integer or `None`, which stands for "unlimited" (default is `None`). Specifying a size of 0 also results in an unlimited dimension. The return value is the `Dimension` class instance describing the new dimension. To determine the current maximum size of the dimension, use the `len` function on the `Dimension` instance. To determine if a dimension is 'unlimited', use the `Dimension.isunlimited` method of the `Dimension` instance.""" self.dimensions[dimname] = Dimension(self, dimname, size=size) return self.dimensions[dimname] def renameDimension(self, oldname, newname): """ **`renameDimension(self, oldname, newname)`** rename a `Dimension` named `oldname` to `newname`.""" cdef char *namstring bytestr = _strencode(newname) namstring = bytestr if self.data_model != 'NETCDF4': self._redef() try: dim = self.dimensions[oldname] except KeyError: raise KeyError('%s not a valid dimension name' % oldname) ierr = nc_rename_dim(self._grpid, dim._dimid, namstring) if self.data_model != 'NETCDF4': self._enddef() _ensure_nc_success(ierr) # remove old key from dimensions dict. self.dimensions.pop(oldname) # add new key. self.dimensions[newname] = dim # Variable.dimensions is determined by a method that # looks in the file, so no need to manually update. def createCompoundType(self, datatype, datatype_name): """ **`createCompoundType(self, datatype, datatype_name)`** Creates a new compound data type named `datatype_name` from the numpy dtype object `datatype`. ***Note***: If the new compound data type contains other compound data types (i.e. it is a 'nested' compound type, where not all of the elements are homogeneous numeric data types), then the 'inner' compound types **must** be created first. The return value is the `CompoundType` class instance describing the new datatype.""" self.cmptypes[datatype_name] = CompoundType(self, datatype,\ datatype_name) return self.cmptypes[datatype_name] def createVLType(self, datatype, datatype_name): """ **`createVLType(self, datatype, datatype_name)`** Creates a new VLEN data type named `datatype_name` from a numpy dtype object `datatype`. The return value is the `VLType` class instance describing the new datatype.""" self.vltypes[datatype_name] = VLType(self, datatype, datatype_name) return self.vltypes[datatype_name] def createEnumType(self, datatype, datatype_name, enum_dict): """ **`createEnumType(self, datatype, datatype_name, enum_dict)`** Creates a new Enum data type named `datatype_name` from a numpy integer dtype object `datatype`, and a python dictionary defining the enum fields and values. The return value is the `EnumType` class instance describing the new datatype.""" self.enumtypes[datatype_name] = EnumType(self, datatype, datatype_name, enum_dict) return self.enumtypes[datatype_name] def createVariable(self, varname, datatype, dimensions=(), zlib=False, complevel=4, shuffle=True, fletcher32=False, contiguous=False, chunksizes=None, endian='native', least_significant_digit=None, fill_value=None, chunk_cache=None): """ **`createVariable(self, varname, datatype, dimensions=(), zlib=False, complevel=4, shuffle=True, fletcher32=False, contiguous=False, chunksizes=None, endian='native', least_significant_digit=None, fill_value=None, chunk_cache=None)`** Creates a new variable with the given `varname`, `datatype`, and `dimensions`. If dimensions are not given, the variable is assumed to be a scalar. If `varname` is specified as a path, using forward slashes as in unix to separate components, then intermediate groups will be created as necessary For example, `createVariable('/GroupA/GroupB/VarC', float, ('x','y'))` will create groups `GroupA` and `GroupA/GroupB`, plus the variable `GroupA/GroupB/VarC`, if the preceding groups don't already exist. The `datatype` can be a numpy datatype object, or a string that describes a numpy dtype object (like the `dtype.str` attribute of a numpy array). Supported specifiers include: `'S1' or 'c' (NC_CHAR), 'i1' or 'b' or 'B' (NC_BYTE), 'u1' (NC_UBYTE), 'i2' or 'h' or 's' (NC_SHORT), 'u2' (NC_USHORT), 'i4' or 'i' or 'l' (NC_INT), 'u4' (NC_UINT), 'i8' (NC_INT64), 'u8' (NC_UINT64), 'f4' or 'f' (NC_FLOAT), 'f8' or 'd' (NC_DOUBLE)`. `datatype` can also be a `CompoundType` instance (for a structured, or compound array), a `VLType` instance (for a variable-length array), or the python `str` builtin (for a variable-length string array). Numpy string and unicode datatypes with length greater than one are aliases for `str`. Data from netCDF variables is presented to python as numpy arrays with the corresponding data type. `dimensions` must be a tuple containing dimension names (strings) that have been defined previously using `Dataset.createDimension`. The default value is an empty tuple, which means the variable is a scalar. If the optional keyword `zlib` is `True`, the data will be compressed in the netCDF file using gzip compression (default `False`). The optional keyword `complevel` is an integer between 1 and 9 describing the level of compression desired (default 4). Ignored if `zlib=False`. If the optional keyword `shuffle` is `True`, the HDF5 shuffle filter will be applied before compressing the data (default `True`). This significantly improves compression. Default is `True`. Ignored if `zlib=False`. If the optional keyword `fletcher32` is `True`, the Fletcher32 HDF5 checksum algorithm is activated to detect errors. Default `False`. If the optional keyword `contiguous` is `True`, the variable data is stored contiguously on disk. Default `False`. Setting to `True` for a variable with an unlimited dimension will trigger an error. The optional keyword `chunksizes` can be used to manually specify the HDF5 chunksizes for each dimension of the variable. A detailed discussion of HDF chunking and I/O performance is available [here](http://www.hdfgroup.org/HDF5/doc/H5.user/Chunking.html). Basically, you want the chunk size for each dimension to match as closely as possible the size of the data block that users will read from the file. `chunksizes` cannot be set if `contiguous=True`. The optional keyword `endian` can be used to control whether the data is stored in little or big endian format on disk. Possible values are `little, big` or `native` (default). The library will automatically handle endian conversions when the data is read, but if the data is always going to be read on a computer with the opposite format as the one used to create the file, there may be some performance advantage to be gained by setting the endian-ness. The `zlib, complevel, shuffle, fletcher32, contiguous, chunksizes` and `endian` keywords are silently ignored for netCDF 3 files that do not use HDF5. The optional keyword `fill_value` can be used to override the default netCDF `_FillValue` (the value that the variable gets filled with before any data is written to it, defaults given in the dict `netCDF4.default_fillvals`). If fill_value is set to `False`, then the variable is not pre-filled. If the optional keyword parameter `least_significant_digit` is specified, variable data will be truncated (quantized). In conjunction with `zlib=True` this produces 'lossy', but significantly more efficient compression. For example, if `least_significant_digit=1`, data will be quantized using `numpy.around(scale*data)/scale`, where scale = 2**bits, and bits is determined so that a precision of 0.1 is retained (in this case bits=4). From the [PSL metadata conventions](http://www.esrl.noaa.gov/psl/data/gridded/conventions/cdc_netcdf_standard.shtml): "least_significant_digit -- power of ten of the smallest decimal place in unpacked data that is a reliable value." Default is `None`, or no quantization, or 'lossless' compression. When creating variables in a `NETCDF4` or `NETCDF4_CLASSIC` formatted file, HDF5 creates something called a 'chunk cache' for each variable. The default size of the chunk cache may be large enough to completely fill available memory when creating thousands of variables. The optional keyword `chunk_cache` allows you to reduce (or increase) the size of the default chunk cache when creating a variable. The setting only persists as long as the Dataset is open - you can use the set_var_chunk_cache method to change it the next time the Dataset is opened. Warning - messing with this parameter can seriously degrade performance. The return value is the `Variable` class instance describing the new variable. A list of names corresponding to netCDF variable attributes can be obtained with the `Variable` method `Variable.ncattrs`. A dictionary containing all the netCDF attribute name/value pairs is provided by the `__dict__` attribute of a `Variable` instance. `Variable` instances behave much like array objects. Data can be assigned to or retrieved from a variable with indexing and slicing operations on the `Variable` instance. A `Variable` instance has six Dataset standard attributes: `dimensions, dtype, shape, ndim, name` and `least_significant_digit`. Application programs should never modify these attributes. The `dimensions` attribute is a tuple containing the names of the dimensions associated with this variable. The `dtype` attribute is a string describing the variable's data type (`i4, f8, S1,` etc). The `shape` attribute is a tuple describing the current sizes of all the variable's dimensions. The `name` attribute is a string containing the name of the Variable instance. The `least_significant_digit` attributes describes the power of ten of the smallest decimal place in the data the contains a reliable value. assigned to the `Variable` instance. If `None`, the data is not truncated. The `ndim` attribute is the number of variable dimensions.""" # if varname specified as a path, split out group names. varname = posixpath.normpath(varname) dirname, varname = posixpath.split(varname) # varname is last. # create parent groups (like mkdir -p). if not dirname: group = self else: group = self.createGroup(dirname) # create variable. group.variables[varname] = Variable(group, varname, datatype, dimensions=dimensions, zlib=zlib, complevel=complevel, shuffle=shuffle, fletcher32=fletcher32, contiguous=contiguous, chunksizes=chunksizes, endian=endian, least_significant_digit=least_significant_digit, fill_value=fill_value, chunk_cache=chunk_cache) return group.variables[varname] def renameVariable(self, oldname, newname): """ **`renameVariable(self, oldname, newname)`** rename a `Variable` named `oldname` to `newname`""" cdef char *namstring try: var = self.variables[oldname] except KeyError: raise KeyError('%s not a valid variable name' % oldname) bytestr = _strencode(newname) namstring = bytestr if self.data_model != 'NETCDF4': self._redef() ierr = nc_rename_var(self._grpid, var._varid, namstring) if self.data_model != 'NETCDF4': self._enddef() _ensure_nc_success(ierr) # remove old key from dimensions dict. self.variables.pop(oldname) # add new key. self.variables[newname] = var def createGroup(self, groupname): """ **`createGroup(self, groupname)`** Creates a new `Group` with the given `groupname`. If `groupname` is specified as a path, using forward slashes as in unix to separate components, then intermediate groups will be created as necessary (analogous to `mkdir -p` in unix). For example, `createGroup('/GroupA/GroupB/GroupC')` will create `GroupA`, `GroupA/GroupB`, and `GroupA/GroupB/GroupC`, if they don't already exist. If the specified path describes a group that already exists, no error is raised. The return value is a `Group` class instance.""" # if group specified as a path, split out group names groupname = posixpath.normpath(groupname) nestedgroups = groupname.split('/') group = self # loop over group names, create parent groups if they do not already # exist. for g in nestedgroups: if not g: continue if g not in group.groups: group.groups[g] = Group(group, g) group = group.groups[g] # if group already exists, just return the group # (prior to 1.1.8, this would have raised an error) return group def ncattrs(self): """ **`ncattrs(self)`** return netCDF global attribute names for this `Dataset` or `Group` in a list.""" return _get_att_names(self._grpid, NC_GLOBAL) def setncattr(self,name,value): """ **`setncattr(self,name,value)`** set a netCDF dataset or group attribute using name,value pair. Use if you need to set a netCDF attribute with the with the same name as one of the reserved python attributes.""" cdef nc_type xtype xtype=-99 if self.data_model != 'NETCDF4': self._redef() _set_att(self, NC_GLOBAL, name, value, xtype=xtype, force_ncstring=self._ncstring_attrs__) if self.data_model != 'NETCDF4': self._enddef() def setncattr_string(self,name,value): """ **`setncattr_string(self,name,value)`** set a netCDF dataset or group string attribute using name,value pair. Use if you need to ensure that a netCDF attribute is created with type `NC_STRING` if the file format is `NETCDF4`.""" cdef nc_type xtype xtype=-99 if self.data_model != 'NETCDF4': msg='file format does not support NC_STRING attributes' raise IOError(msg) _set_att(self, NC_GLOBAL, name, value, xtype=xtype, force_ncstring=True) def setncatts(self,attdict): """ **`setncatts(self,attdict)`** set a bunch of netCDF dataset or group attributes at once using a python dictionary. This may be faster when setting a lot of attributes for a `NETCDF3` formatted file, since nc_redef/nc_enddef is not called in between setting each attribute""" if self.data_model != 'NETCDF4': self._redef() for name, value in attdict.items(): _set_att(self, NC_GLOBAL, name, value) if self.data_model != 'NETCDF4': self._enddef() def getncattr(self,name,encoding='utf-8'): """ **`getncattr(self,name)`** retrieve a netCDF dataset or group attribute. Use if you need to get a netCDF attribute with the same name as one of the reserved python attributes. option kwarg `encoding` can be used to specify the character encoding of a string attribute (default is `utf-8`).""" return _get_att(self, NC_GLOBAL, name, encoding=encoding) def __delattr__(self,name): # if it's a netCDF attribute, remove it if name not in _private_atts: self.delncattr(name) else: raise AttributeError( "'%s' is one of the reserved attributes %s, cannot delete. Use delncattr instead." % (name, tuple(_private_atts))) def delncattr(self, name): """ **`delncattr(self,name,value)`** delete a netCDF dataset or group attribute. Use if you need to delete a netCDF attribute with the same name as one of the reserved python attributes.""" cdef char *attname cdef int ierr bytestr = _strencode(name) attname = bytestr if self.data_model != 'NETCDF4': self._redef() ierr = nc_del_att(self._grpid, NC_GLOBAL, attname) if self.data_model != 'NETCDF4': self._enddef() _ensure_nc_success(ierr) def __setattr__(self,name,value): # if name in _private_atts, it is stored at the python # level and not in the netCDF file. if name not in _private_atts: self.setncattr(name, value) elif not name.endswith('__'): if hasattr(self,name): raise AttributeError( "'%s' is one of the reserved attributes %s, cannot rebind. Use setncattr instead." % (name, tuple(_private_atts))) else: self.__dict__[name]=value def __getattr__(self,name): # if name in _private_atts, it is stored at the python # level and not in the netCDF file. if name.startswith('__') and name.endswith('__'): # if __dict__ requested, return a dict with netCDF attributes. if name == '__dict__': names = self.ncattrs() values = [] for name in names: values.append(_get_att(self, NC_GLOBAL, name)) gen = zip(names, values) if sys.version_info[0:2] < (3, 7): return OrderedDict(gen) else: return dict(gen) else: raise AttributeError elif name in _private_atts: return self.__dict__[name] else: return self.getncattr(name) def renameAttribute(self, oldname, newname): """ **`renameAttribute(self, oldname, newname)`** rename a `Dataset` or `Group` attribute named `oldname` to `newname`.""" cdef char *oldnamec cdef char *newnamec bytestr = _strencode(oldname) oldnamec = bytestr bytestr = _strencode(newname) newnamec = bytestr _ensure_nc_success(nc_rename_att(self._grpid, NC_GLOBAL, oldnamec, newnamec)) def renameGroup(self, oldname, newname): """ **`renameGroup(self, oldname, newname)`** rename a `Group` named `oldname` to `newname` (requires netcdf >= 4.3.1).""" cdef char *newnamec IF HAS_RENAME_GRP: bytestr = _strencode(newname) newnamec = bytestr try: grp = self.groups[oldname] except KeyError: raise KeyError('%s not a valid group name' % oldname) _ensure_nc_success(nc_rename_grp(grp._grpid, newnamec)) # remove old key from groups dict. self.groups.pop(oldname) # add new key. self.groups[newname] = grp ELSE: msg = """ renameGroup method not enabled. To enable, install Cython, make sure you have version 4.3.1 or higher of the netcdf C lib, and rebuild netcdf4-python.""" raise ValueError(msg) def set_auto_chartostring(self, value): """ **`set_auto_chartostring(self, True_or_False)`** Call `Variable.set_auto_chartostring` for all variables contained in this `Dataset` or `Group`, as well as for all variables in all its subgroups. **`True_or_False`**: Boolean determining if automatic conversion of all character arrays <--> string arrays should be performed for character variables (variables of type `NC_CHAR` or `S1`) with the `_Encoding` attribute set. ***Note***: Calling this function only affects existing variables. Variables created after calling this function will follow the default behaviour. """ # this is a hack to make inheritance work in MFDataset # (which stores variables in _vars) _vars = self.variables if _vars is None: _vars = self._vars for var in _vars.values(): var.set_auto_chartostring(value) for groups in _walk_grps(self): for group in groups: for var in group.variables.values(): var.set_auto_chartostring(value) def set_auto_maskandscale(self, value): """ **`set_auto_maskandscale(self, True_or_False)`** Call `Variable.set_auto_maskandscale` for all variables contained in this `Dataset` or `Group`, as well as for all variables in all its subgroups. **`True_or_False`**: Boolean determining if automatic conversion to masked arrays and variable scaling shall be applied for all variables. ***Note***: Calling this function only affects existing variables. Variables created after calling this function will follow the default behaviour. """ # this is a hack to make inheritance work in MFDataset # (which stores variables in _vars) _vars = self.variables if _vars is None: _vars = self._vars for var in _vars.values(): var.set_auto_maskandscale(value) for groups in _walk_grps(self): for group in groups: for var in group.variables.values(): var.set_auto_maskandscale(value) def set_auto_mask(self, value): """ **`set_auto_mask(self, True_or_False)`** Call `Variable.set_auto_mask` for all variables contained in this `Dataset` or `Group`, as well as for all variables in all its subgroups. Only affects Variables with primitive or enum types (not compound or vlen Variables). **`True_or_False`**: Boolean determining if automatic conversion to masked arrays shall be applied for all variables. ***Note***: Calling this function only affects existing variables. Variables created after calling this function will follow the default behaviour. """ # this is a hack to make inheritance work in MFDataset # (which stores variables in _vars) _vars = self.variables if _vars is None: _vars = self._vars for var in _vars.values(): var.set_auto_mask(value) for groups in _walk_grps(self): for group in groups: for var in group.variables.values(): var.set_auto_mask(value) def set_auto_scale(self, value): """ **`set_auto_scale(self, True_or_False)`** Call `Variable.set_auto_scale` for all variables contained in this `Dataset` or `Group`, as well as for all variables in all its subgroups. **`True_or_False`**: Boolean determining if automatic variable scaling shall be applied for all variables. ***Note***: Calling this function only affects existing variables. Variables created after calling this function will follow the default behaviour. """ # this is a hack to make inheritance work in MFDataset # (which stores variables in _vars) _vars = self.variables if _vars is None: _vars = self._vars for var in _vars.values(): var.set_auto_scale(value) for groups in _walk_grps(self): for group in groups: for var in group.variables.values(): var.set_auto_scale(value) def set_always_mask(self, value): """ **`set_always_mask(self, True_or_False)`** Call `Variable.set_always_mask` for all variables contained in this `Dataset` or `Group`, as well as for all variables in all its subgroups. **`True_or_False`**: Boolean determining if automatic conversion of masked arrays with no missing values to regular numpy arrays shall be applied for all variables. Default True. Set to False to restore the default behaviour in versions prior to 1.4.1 (numpy array returned unless missing values are present, otherwise masked array returned). ***Note***: Calling this function only affects existing variables. Variables created after calling this function will follow the default behaviour. """ # this is a hack to make inheritance work in MFDataset # (which stores variables in _vars) _vars = self.variables if _vars is None: _vars = self._vars for var in _vars.values(): var.set_always_mask(value) for groups in _walk_grps(self): for group in groups: for var in group.variables.values(): var.set_always_mask(value) def set_ncstring_attrs(self, value): """ **`set_ncstring_attrs(self, True_or_False)`** Call `Variable.set_ncstring_attrs` for all variables contained in this `Dataset` or `Group`, as well as for all its subgroups and their variables. **`True_or_False`**: Boolean determining if all string attributes are created as variable-length NC_STRINGs, (if True), or if ascii text attributes are stored as NC_CHARs (if False; default) ***Note***: Calling this function only affects newly created attributes of existing (sub-) groups and their variables. """ self._ncstring_attrs__ = bool(value) # this is a hack to make inheritance work in MFDataset # (which stores variables in _vars) _vars = self.variables if _vars is None: _vars = self._vars for var in _vars.values(): var.set_ncstring_attrs(value) for groups in _walk_grps(self): for group in groups: group.set_ncstring_attrs(value) # recurse into subgroups... def get_variables_by_attributes(self, **kwargs): """ **`get_variables_by_attribute(self, **kwargs)`** Returns a list of variables that match specific conditions. Can pass in key=value parameters and variables are returned that contain all of the matches. For example, ```python >>> # Get variables with x-axis attribute. >>> vs = nc.get_variables_by_attributes(axis='X') >>> # Get variables with matching "standard_name" attribute >>> vs = nc.get_variables_by_attributes(standard_name='northward_sea_water_velocity') ``` Can pass in key=callable parameter and variables are returned if the callable returns True. The callable should accept a single parameter, the attribute value. None is given as the attribute value when the attribute does not exist on the variable. For example, ```python >>> # Get Axis variables >>> vs = nc.get_variables_by_attributes(axis=lambda v: v in ['X', 'Y', 'Z', 'T']) >>> # Get variables that don't have an "axis" attribute >>> vs = nc.get_variables_by_attributes(axis=lambda v: v is None) >>> # Get variables that have a "grid_mapping" attribute >>> vs = nc.get_variables_by_attributes(grid_mapping=lambda v: v is not None) ``` """ vs = [] has_value_flag = False # this is a hack to make inheritance work in MFDataset # (which stores variables in _vars) _vars = self.variables if _vars is None: _vars = self._vars for vname in _vars: var = _vars[vname] for k, v in kwargs.items(): if callable(v): has_value_flag = v(getattr(var, k, None)) if has_value_flag is False: break elif hasattr(var, k) and getattr(var, k) == v: has_value_flag = True else: has_value_flag = False break if has_value_flag is True: vs.append(_vars[vname]) return vs def _getname(self): # private method to get name associated with instance. cdef int ierr cdef char namstring[NC_MAX_NAME+1] with nogil: ierr = nc_inq_grpname(self._grpid, namstring) _ensure_nc_success(ierr) return namstring.decode('utf-8') property name: """string name of Group instance""" def __get__(self): return self._getname() def __set__(self,value): raise AttributeError("name cannot be altered") @staticmethod def fromcdl(cdlfilename,ncfilename=None,mode='a',format='NETCDF4'): """ **`fromcdl(cdlfilename, ncfilename=None, mode='a',format='NETCDF4')`** call [ncgen][ncgen] via subprocess to create Dataset from [CDL][cdl] text representation. Requires [ncgen][ncgen] to be installed and in `$PATH`. **`cdlfilename`**: CDL file. **`ncfilename`**: netCDF file to create. If not given, CDL filename with suffix replaced by `.nc` is used.. **`mode`**: Access mode to open Dataset (Default `'a'`). **`format`**: underlying file format to use (one of `'NETCDF4', 'NETCDF4_CLASSIC', 'NETCDF3_CLASSIC'`, `'NETCDF3_64BIT_OFFSET'` or `'NETCDF3_64BIT_DATA'`. Default `'NETCDF4'`. Dataset instance for `ncfilename` is returned. [ncgen]: https://www.unidata.ucar.edu/software/netcdf/docs/netcdf_utilities_guide.html#ncgen_guide [cdl]: https://www.unidata.ucar.edu/software/netcdf/docs/netcdf_utilities_guide.html#cdl_guide """ if ncfilename is None: filepath = pathlib.Path(cdlfilename) ncfilename = filepath.with_suffix('.nc') formatcodes = {'NETCDF4': 4, 'NETCDF4_CLASSIC': 7, 'NETCDF3_CLASSIC': 3, 'NETCDF3_64BIT': 6, # legacy 'NETCDF3_64BIT_OFFSET': 6, 'NETCDF3_64BIT_DATA': 5} if format not in formatcodes: raise ValueError('illegal format requested') ncgenargs="-knc%s" % formatcodes[format] subprocess.run(["ncgen", ncgenargs, "-o", ncfilename, cdlfilename], check=True) return Dataset(ncfilename, mode=mode) def tocdl(self,coordvars=False,data=False,outfile=None): """ **`tocdl(self, coordvars=False, data=False, outfile=None)`** call [ncdump][ncdump] via subprocess to create [CDL][cdl] text representation of Dataset. Requires [ncdump][ncdump] to be installed and in `$PATH`. **`coordvars`**: include coordinate variable data (via `ncdump -c`). Default False **`data`**: if True, write out variable data (Default False). **`outfile`**: If not None, file to output ncdump to. Default is to return a string. [ncdump]: https://www.unidata.ucar.edu/software/netcdf/docs/netcdf_utilities_guide.html#ncdump_guide [cdl]: https://www.unidata.ucar.edu/software/netcdf/docs/netcdf_utilities_guide.html#cdl_guide """ self.sync() if coordvars: ncdumpargs = "-cs" else: ncdumpargs = "-s" if not data: ncdumpargs += "h" result=subprocess.run(["ncdump", ncdumpargs, self.filepath()], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8') if outfile is None: return result.stdout else: f = open(outfile,'w') f.write(result.stdout) f.close() cdef class Group(Dataset): """ Groups define a hierarchical namespace within a netCDF file. They are analogous to directories in a unix filesystem. Each `Group` behaves like a `Dataset` within a Dataset, and can contain it's own variables, dimensions and attributes (and other Groups). See `Group.__init__` for more details. `Group` inherits from `Dataset`, so all the `Dataset` class methods and variables are available to a `Group` instance (except the `close` method). Additional read-only class variables: **`name`**: String describing the group name. """ def __init__(self, parent, name, **kwargs): """ **`__init__(self, parent, name)`** `Group` constructor. **`parent`**: `Group` instance for the parent group. If being created in the root group, use a `Dataset` instance. **`name`**: - Name of the group. ***Note***: `Group` instances should be created using the `Dataset.createGroup` method of a `Dataset` instance, or another `Group` instance, not using this class directly. """ cdef char *groupname # flag to indicate that Variables in this Group support orthogonal indexing. self.__orthogonal_indexing__ = True # set data_model and file_format attributes. self.data_model = parent.data_model self.file_format = parent.file_format # full path to Group. self.path = posixpath.join(parent.path, name) # parent group. self.parent = parent # propagate weak reference setting from parent. self.keepweakref = parent.keepweakref # propagate _ncstring_attrs__ setting from parent. self._ncstring_attrs__ = parent._ncstring_attrs__ if 'id' in kwargs: self._grpid = kwargs['id'] # get compound, vlen and enum types in this Group. self.cmptypes, self.vltypes, self.enumtypes = _get_types(self) # get dimensions in this Group. self.dimensions = _get_dims(self) # get variables in this Group. self.variables = _get_vars(self) # get groups in this Group. self.groups = _get_grps(self) else: bytestr = _strencode(name) groupname = bytestr _ensure_nc_success(nc_def_grp(parent._grpid, groupname, &self._grpid)) if sys.version_info[0:2] < (3, 7): self.cmptypes = OrderedDict() self.vltypes = OrderedDict() self.enumtypes = OrderedDict() self.dimensions = OrderedDict() self.variables = OrderedDict() self.groups = OrderedDict() else: self.cmptypes = dict() self.vltypes = dict() self.enumtypes = dict() self.dimensions = dict() self.variables = dict() self.groups = dict() def close(self): """ **`close(self)`** overrides `Dataset` close method which does not apply to `Group` instances, raises IOError.""" raise IOError('cannot close a `Group` (only applies to Dataset)') cdef class Dimension: """ A netCDF `Dimension` is used to describe the coordinates of a `Variable`. See `Dimension.__init__` for more details. The current maximum size of a `Dimension` instance can be obtained by calling the python `len` function on the `Dimension` instance. The `Dimension.isunlimited` method of a `Dimension` instance can be used to determine if the dimension is unlimited. Read-only class variables: **`name`**: String name, used when creating a `Variable` with `Dataset.createVariable`. **`size`**: Current `Dimension` size (same as `len(d)`, where `d` is a `Dimension` instance). """ cdef public int _dimid, _grpid cdef public _data_model, _name, _grp def __init__(self, grp, name, size=None, **kwargs): """ **`__init__(self, group, name, size=None)`** `Dimension` constructor. **`group`**: `Group` instance to associate with dimension. **`name`**: Name of the dimension. **`size`**: Size of the dimension. `None` or 0 means unlimited. (Default `None`). ***Note***: `Dimension` instances should be created using the `Dataset.createDimension` method of a `Group` or `Dataset` instance, not using `Dimension.__init__` directly. """ cdef int ierr cdef char *dimname cdef size_t lendim self._grpid = grp._grpid # make a weakref to group to avoid circular ref (issue 218) # keep strong reference the default behaviour (issue 251) if grp.keepweakref: self._grp = weakref.proxy(grp) else: self._grp = grp self._data_model = grp.data_model self._name = name if 'id' in kwargs: self._dimid = kwargs['id'] else: bytestr = _strencode(name) dimname = bytestr if size is not None: lendim = size else: lendim = NC_UNLIMITED if grp.data_model != 'NETCDF4': grp._redef() ierr = nc_def_dim(self._grpid, dimname, lendim, &self._dimid) if grp.data_model != 'NETCDF4': grp._enddef() _ensure_nc_success(ierr) def _getname(self): # private method to get name associated with instance. cdef int err, _grpid cdef char namstring[NC_MAX_NAME+1] _grpid = self._grp._grpid with nogil: ierr = nc_inq_dimname(_grpid, self._dimid, namstring) _ensure_nc_success(ierr) return namstring.decode('utf-8') property name: """string name of Dimension instance""" def __get__(self): return self._getname() def __set__(self,value): raise AttributeError("name cannot be altered") property size: """current size of Dimension (calls `len` on Dimension instance)""" def __get__(self): return len(self) def __set__(self,value): raise AttributeError("size cannot be altered") def __repr__(self): return self.__unicode__() def __unicode__(self): if not dir(self._grp): return 'Dimension object no longer valid' if self.isunlimited(): return "%r (unlimited): name = '%s', size = %s" %\ (type(self), self._name, len(self)) else: return "%r: name = '%s', size = %s" %\ (type(self), self._name, len(self)) def __len__(self): # len(`Dimension` instance) returns current size of dimension cdef int ierr cdef size_t lengthp with nogil: ierr = nc_inq_dimlen(self._grpid, self._dimid, &lengthp) _ensure_nc_success(ierr) return lengthp def group(self): """ **`group(self)`** return the group that this `Dimension` is a member of.""" return self._grp def isunlimited(self): """ **`isunlimited(self)`** returns `True` if the `Dimension` instance is unlimited, `False` otherwise.""" cdef int ierr, n, numunlimdims, ndims, nvars, ngatts, xdimid cdef int *unlimdimids if self._data_model == 'NETCDF4': ierr = nc_inq_unlimdims(self._grpid, &numunlimdims, NULL) _ensure_nc_success(ierr) if numunlimdims == 0: return False else: unlimdimids = malloc(sizeof(int) * numunlimdims) dimid = self._dimid with nogil: ierr = nc_inq_unlimdims(self._grpid, &numunlimdims, unlimdimids) _ensure_nc_success(ierr) unlimdim_ids = [] for n from 0 <= n < numunlimdims: unlimdim_ids.append(unlimdimids[n]) free(unlimdimids) if dimid in unlimdim_ids: return True else: return False else: # if not NETCDF4, there is only one unlimited dimension. # nc_inq_unlimdims only works for NETCDF4. with nogil: ierr = nc_inq(self._grpid, &ndims, &nvars, &ngatts, &xdimid) if self._dimid == xdimid: return True else: return False cdef class Variable: """ A netCDF `Variable` is used to read and write netCDF data. They are analogous to numpy array objects. See `Variable.__init__` for more details. A list of attribute names corresponding to netCDF attributes defined for the variable can be obtained with the `Variable.ncattrs` method. These attributes can be created by assigning to an attribute of the `Variable` instance. A dictionary containing all the netCDF attribute name/value pairs is provided by the `__dict__` attribute of a `Variable` instance. The following class variables are read-only: **`dimensions`**: A tuple containing the names of the dimensions associated with this variable. **`dtype`**: A numpy dtype object describing the variable's data type. **`ndim`**: The number of variable dimensions. **`shape`**: A tuple with the current shape (length of all dimensions). **`scale`**: If True, `scale_factor` and `add_offset` are applied, and signed integer data is automatically converted to unsigned integer data if the `_Unsigned` attribute is set. Default is `True`, can be reset using `Variable.set_auto_scale` and `Variable.set_auto_maskandscale` methods. **`mask`**: If True, data is automatically converted to/from masked arrays when missing values or fill values are present. Default is `True`, can be reset using `Variable.set_auto_mask` and `Variable.set_auto_maskandscale` methods. Only relevant for Variables with primitive or enum types (ignored for compound and vlen Variables). **`chartostring`**: If True, data is automatically converted to/from character arrays to string arrays when the `_Encoding` variable attribute is set. Default is `True`, can be reset using `Variable.set_auto_chartostring` method. **`least_significant_digit`**: Describes the power of ten of the smallest decimal place in the data the contains a reliable value. Data is truncated to this decimal place when it is assigned to the `Variable` instance. If `None`, the data is not truncated. **`__orthogonal_indexing__`**: Always `True`. Indicates to client code that the object supports 'orthogonal indexing', which means that slices that are 1d arrays or lists slice along each dimension independently. This behavior is similar to Fortran or Matlab, but different than numpy. **`datatype`**: numpy data type (for primitive data types) or VLType/CompoundType instance (for compound or vlen data types). **`name`**: String name. **`size`**: The number of stored elements. """ cdef public int _varid, _grpid, _nunlimdim cdef public _name, ndim, dtype, mask, scale, always_mask, chartostring, _isprimitive, \ _iscompound, _isvlen, _isenum, _grp, _cmptype, _vltype, _enumtype,\ __orthogonal_indexing__, _has_lsd, _use_get_vars, _ncstring_attrs__ def __init__(self, grp, name, datatype, dimensions=(), zlib=False, complevel=4, shuffle=True, fletcher32=False, contiguous=False, chunksizes=None, endian='native', least_significant_digit=None, fill_value=None, chunk_cache=None, **kwargs): """ **`__init__(self, group, name, datatype, dimensions=(), zlib=False, complevel=4, shuffle=True, fletcher32=False, contiguous=False, chunksizes=None, endian='native', least_significant_digit=None,fill_value=None,chunk_cache=None)`** `Variable` constructor. **`group`**: `Group` or `Dataset` instance to associate with variable. **`name`**: Name of the variable. **`datatype`**: `Variable` data type. Can be specified by providing a numpy dtype object, or a string that describes a numpy dtype object. Supported values, corresponding to `str` attribute of numpy dtype objects, include `'f4'` (32-bit floating point), `'f8'` (64-bit floating point), `'i4'` (32-bit signed integer), `'i2'` (16-bit signed integer), `'i8'` (64-bit signed integer), `'i4'` (8-bit signed integer), `'i1'` (8-bit signed integer), `'u1'` (8-bit unsigned integer), `'u2'` (16-bit unsigned integer), `'u4'` (32-bit unsigned integer), `'u8'` (64-bit unsigned integer), or `'S1'` (single-character string). From compatibility with Scientific.IO.NetCDF, the old Numeric single character typecodes can also be used (`'f'` instead of `'f4'`, `'d'` instead of `'f8'`, `'h'` or `'s'` instead of `'i2'`, `'b'` or `'B'` instead of `'i1'`, `'c'` instead of `'S1'`, and `'i'` or `'l'` instead of `'i4'`). `datatype` can also be a `CompoundType` instance (for a structured, or compound array), a `VLType` instance (for a variable-length array), or the python `str` builtin (for a variable-length string array). Numpy string and unicode datatypes with length greater than one are aliases for `str`. **`dimensions`**: a tuple containing the variable's dimension names (defined previously with `createDimension`). Default is an empty tuple which means the variable is a scalar (and therefore has no dimensions). **`zlib`**: if `True`, data assigned to the `Variable` instance is compressed on disk. Default `False`. **`complevel`**: the level of zlib compression to use (1 is the fastest, but poorest compression, 9 is the slowest but best compression). Default 4. Ignored if `zlib=False`. **`shuffle`**: if `True`, the HDF5 shuffle filter is applied to improve compression. Default `True`. Ignored if `zlib=False`. **`fletcher32`**: if `True` (default `False`), the Fletcher32 checksum algorithm is used for error detection. **`contiguous`**: if `True` (default `False`), the variable data is stored contiguously on disk. Default `False`. Setting to `True` for a variable with an unlimited dimension will trigger an error. **`chunksizes`**: Can be used to specify the HDF5 chunksizes for each dimension of the variable. A detailed discussion of HDF chunking and I/O performance is available [here](http://www.hdfgroup.org/HDF5/doc/H5.user/Chunking.html). Basically, you want the chunk size for each dimension to match as closely as possible the size of the data block that users will read from the file. `chunksizes` cannot be set if `contiguous=True`. **`endian`**: Can be used to control whether the data is stored in little or big endian format on disk. Possible values are `little, big` or `native` (default). The library will automatically handle endian conversions when the data is read, but if the data is always going to be read on a computer with the opposite format as the one used to create the file, there may be some performance advantage to be gained by setting the endian-ness. For netCDF 3 files (that don't use HDF5), only `endian='native'` is allowed. The `zlib, complevel, shuffle, fletcher32, contiguous` and `chunksizes` keywords are silently ignored for netCDF 3 files that do not use HDF5. **`least_significant_digit`**: If specified, variable data will be truncated (quantized). In conjunction with `zlib=True` this produces 'lossy', but significantly more efficient compression. For example, if `least_significant_digit=1`, data will be quantized using around(scale*data)/scale, where scale = 2**bits, and bits is determined so that a precision of 0.1 is retained (in this case bits=4). Default is `None`, or no quantization. **`fill_value`**: If specified, the default netCDF `_FillValue` (the value that the variable gets filled with before any data is written to it) is replaced with this value. If fill_value is set to `False`, then the variable is not pre-filled. The default netCDF fill values can be found in the dictionary `netCDF4.default_fillvals`. **`chunk_cache`**: If specified, sets the chunk cache size for this variable. Persists as long as Dataset is open. Use `set_var_chunk_cache` to change it when Dataset is re-opened. ***Note***: `Variable` instances should be created using the `Dataset.createVariable` method of a `Dataset` or `Group` instance, not using this class directly. """ cdef int ierr, ndims, icontiguous, ideflate_level, numdims, _grpid cdef char namstring[NC_MAX_NAME+1] cdef char *varname cdef nc_type xtype cdef int *dimids cdef size_t sizep, nelemsp cdef size_t *chunksizesp cdef float preemptionp # flag to indicate that orthogonal indexing is supported self.__orthogonal_indexing__ = True # if complevel is set to zero, set zlib to False. if not complevel: zlib = False # if dimensions is a string, convert to a tuple # this prevents a common error that occurs when # dimensions = 'lat' instead of ('lat',) if type(dimensions) == str or type(dimensions) == bytes or type(dimensions) == unicode: dimensions = dimensions, self._grpid = grp._grpid # make a weakref to group to avoid circular ref (issue 218) # keep strong reference the default behaviour (issue 251) if grp.keepweakref: self._grp = weakref.proxy(grp) else: self._grp = grp user_type = isinstance(datatype, CompoundType) or \ isinstance(datatype, VLType) or \ isinstance(datatype, EnumType) or \ datatype == str # convert to a real numpy datatype object if necessary. if not user_type and type(datatype) != numpy.dtype: datatype = numpy.dtype(datatype) # convert numpy string dtype with length > 1 # or any numpy unicode dtype into str if (isinstance(datatype, numpy.dtype) and ((datatype.kind == 'S' and datatype.itemsize > 1) or datatype.kind == 'U')): datatype = str user_type = True # check if endian keyword consistent with datatype specification. dtype_endian = getattr(datatype,'byteorder',None) if dtype_endian == '=': dtype_endian='native' if dtype_endian == '>': dtype_endian='big' if dtype_endian == '<': dtype_endian='little' if dtype_endian == '|': dtype_endian=None if dtype_endian is not None and dtype_endian != endian: if dtype_endian == 'native' and endian == sys.byteorder: pass else: # endian keyword prevails, issue warning msg = 'endian-ness of dtype and endian kwarg do not match, using endian kwarg' #msg = 'endian-ness of dtype and endian kwarg do not match, dtype over-riding endian kwarg' warnings.warn(msg) #endian = dtype_endian # dtype prevails # check validity of datatype. self._isprimitive = False self._iscompound = False self._isvlen = False self._isenum = False if user_type: if isinstance(datatype, CompoundType): self._iscompound = True self._cmptype = datatype if isinstance(datatype, VLType) or datatype==str: self._isvlen = True self._vltype = datatype if isinstance(datatype, EnumType): self._isenum = True self._enumtype = datatype if datatype==str: if grp.data_model != 'NETCDF4': raise ValueError( 'Variable length strings are only supported for the ' 'NETCDF4 format. For other formats, consider using ' 'netCDF4.stringtochar to convert string arrays into ' 'character arrays with an additional dimension.') datatype = VLType(self._grp, str, None) self._vltype = datatype xtype = datatype._nc_type # make sure this a valid user defined datatype defined in this Group ierr = nc_inq_type(self._grpid, xtype, namstring, NULL) _ensure_nc_success(ierr) # dtype variable attribute is a numpy datatype object. self.dtype = datatype.dtype elif datatype.str[1:] in _supportedtypes: self._isprimitive = True # find netCDF primitive data type corresponding to # specified numpy data type. xtype = _nptonctype[datatype.str[1:]] # dtype variable attribute is a numpy datatype object. self.dtype = datatype else: raise TypeError('illegal primitive data type, must be one of %s, got %s' % (_supportedtypes,datatype)) if 'id' in kwargs: self._varid = kwargs['id'] else: bytestr = _strencode(name) varname = bytestr ndims = len(dimensions) # find dimension ids. if ndims: dims = [] dimids = malloc(sizeof(int) * ndims) for n from 0 <= n < ndims: dimname = dimensions[n] # look for dimension in this group, and if not # found there, look in parent (and it's parent, etc, back to root). dim = _find_dim(grp, dimname) if dim is None: raise KeyError("dimension %s not defined in group %s or any group in it's family tree" % (dimname, grp.path)) dimids[n] = dim._dimid dims.append(dim) # go into define mode if it's a netCDF 3 compatible # file format. Be careful to exit define mode before # any exceptions are raised. if grp.data_model != 'NETCDF4': grp._redef() # define variable. if ndims: ierr = nc_def_var(self._grpid, varname, xtype, ndims, dimids, &self._varid) free(dimids) else: # a scalar variable. ierr = nc_def_var(self._grpid, varname, xtype, ndims, NULL, &self._varid) # set chunk cache size if desired # default is 1mb per var, can cause problems when many (1000's) # of vars are created. This change only lasts as long as file is # open. if grp.data_model.startswith('NETCDF4') and chunk_cache is not None: ierr = nc_get_var_chunk_cache(self._grpid, self._varid, &sizep, &nelemsp, &preemptionp) _ensure_nc_success(ierr) # reset chunk cache size, leave other parameters unchanged. sizep = chunk_cache ierr = nc_set_var_chunk_cache(self._grpid, self._varid, sizep, nelemsp, preemptionp) _ensure_nc_success(ierr) if ierr != NC_NOERR: if grp.data_model != 'NETCDF4': grp._enddef() _ensure_nc_success(ierr) # set zlib, shuffle, chunking, fletcher32 and endian # variable settings. # don't bother for NETCDF3* formats. # for NETCDF3* formats, the zlib,shuffle,chunking, # and fletcher32 are silently ignored. Only # endian='native' allowed for NETCDF3. if grp.data_model in ['NETCDF4','NETCDF4_CLASSIC']: # set zlib and shuffle parameters. if zlib and ndims: # don't bother for scalar variable ideflate_level = complevel if shuffle: ierr = nc_def_var_deflate(self._grpid, self._varid, 1, 1, ideflate_level) else: ierr = nc_def_var_deflate(self._grpid, self._varid, 0, 1, ideflate_level) if ierr != NC_NOERR: if grp.data_model != 'NETCDF4': grp._enddef() _ensure_nc_success(ierr) # set checksum. if fletcher32 and ndims: # don't bother for scalar variable ierr = nc_def_var_fletcher32(self._grpid, self._varid, 1) if ierr != NC_NOERR: if grp.data_model != 'NETCDF4': grp._enddef() _ensure_nc_success(ierr) # set chunking stuff. if ndims: # don't bother for scalar variable. if contiguous: icontiguous = NC_CONTIGUOUS if chunksizes is not None: raise ValueError('cannot specify chunksizes for a contiguous dataset') else: icontiguous = NC_CHUNKED if chunksizes is None: chunksizesp = NULL else: if len(chunksizes) != len(dimensions): if grp.data_model != 'NETCDF4': grp._enddef() raise ValueError('chunksizes must be a sequence with the same length as dimensions') chunksizesp = malloc(sizeof(size_t) * ndims) for n from 0 <= n < ndims: if not dims[n].isunlimited() and \ chunksizes[n] > dims[n].size: msg = 'chunksize cannot exceed dimension size' raise ValueError(msg) chunksizesp[n] = chunksizes[n] if chunksizes is not None or contiguous: ierr = nc_def_var_chunking(self._grpid, self._varid, icontiguous, chunksizesp) free(chunksizesp) if ierr != NC_NOERR: if grp.data_model != 'NETCDF4': grp._enddef() _ensure_nc_success(ierr) # set endian-ness of variable if endian == 'little': ierr = nc_def_var_endian(self._grpid, self._varid, NC_ENDIAN_LITTLE) elif endian == 'big': ierr = nc_def_var_endian(self._grpid, self._varid, NC_ENDIAN_BIG) elif endian == 'native': pass # this is the default format. else: raise ValueError("'endian' keyword argument must be 'little','big' or 'native', got '%s'" % endian) if ierr != NC_NOERR: if grp.data_model != 'NETCDF4': grp._enddef() _ensure_nc_success(ierr) else: if endian != 'native': msg="only endian='native' allowed for NETCDF3 files" raise RuntimeError(msg) # set a fill value for this variable if fill_value keyword # given. This avoids the HDF5 overhead of deleting and # recreating the dataset if it is set later (after the enddef). if fill_value is not None: if not fill_value and isinstance(fill_value,bool): # no filling for this variable if fill_value==False. if not self._isprimitive: # no fill values for VLEN and compound variables # anyway. ierr = 0 else: ierr = nc_def_var_fill(self._grpid, self._varid, 1, NULL) if ierr != NC_NOERR: if grp.data_model != 'NETCDF4': grp._enddef() _ensure_nc_success(ierr) else: if self._isprimitive or self._isenum or \ (self._isvlen and self.dtype == str): if self._isvlen and self.dtype == str: _set_att(self._grp, self._varid, '_FillValue',\ _tostr(fill_value), xtype=xtype, force_ncstring=True) else: fillval = numpy.array(fill_value, self.dtype) if not fillval.dtype.isnative: fillval.byteswap(True) _set_att(self._grp, self._varid, '_FillValue',\ fillval, xtype=xtype) else: raise AttributeError("cannot set _FillValue attribute for VLEN or compound variable") if least_significant_digit is not None: self.least_significant_digit = least_significant_digit # leave define mode if not a NETCDF4 format file. if grp.data_model != 'NETCDF4': grp._enddef() # count how many unlimited dimensions there are. self._nunlimdim = 0 for dimname in dimensions: # look in current group, and parents for dim. dim = _find_dim(self._grp, dimname) if dim.isunlimited(): self._nunlimdim = self._nunlimdim + 1 # set ndim attribute (number of dimensions). with nogil: ierr = nc_inq_varndims(self._grpid, self._varid, &numdims) _ensure_nc_success(ierr) self.ndim = numdims self._name = name # default for automatically applying scale_factor and # add_offset, and converting to/from masked arrays is True. self.scale = True self.mask = True # issue 809: default for converting arrays with no missing values to # regular numpy arrays self.always_mask = True # default is to automatically convert to/from character # to string arrays when _Encoding variable attribute is set. self.chartostring = True # propagate _ncstring_attrs__ setting from parent group. self._ncstring_attrs__ = grp._ncstring_attrs__ if 'least_significant_digit' in self.ncattrs(): self._has_lsd = True # avoid calling nc_get_vars for strided slices by default. # a fix for strided slice access using HDF5 was added # in 4.6.2. # always use nc_get_vars for strided access with OpenDAP (issue #838). if __netcdf4libversion__ >= "4.6.2" or\ self._grp.filepath().startswith('http'): self._use_get_vars = True else: self._use_get_vars = False def __array__(self): # numpy special method that returns a numpy array. # allows numpy ufuncs to work faster on Variable objects # (issue 216). return self[...] def __repr__(self): return self.__unicode__() def __unicode__(self): cdef int ierr, no_fill if not dir(self._grp): return 'Variable object no longer valid' ncdump = [repr(type(self))] show_more_dtype = True if self._iscompound: kind = 'compound' elif self._isvlen: kind = 'vlen' elif self._isenum: kind = 'enum' else: show_more_dtype = False kind = str(self.dtype) dimnames = tuple(_tostr(dimname) for dimname in self.dimensions) ncdump.append('%s %s(%s)' %\ (kind, self._name, ', '.join(dimnames))) for name in self.ncattrs(): ncdump.append(' %s: %s' % (name, self.getncattr(name))) if show_more_dtype: ncdump.append('%s data type: %s' % (kind, self.dtype)) unlimdims = [] for dimname in self.dimensions: dim = _find_dim(self._grp, dimname) if dim.isunlimited(): unlimdims.append(dimname) if (self._grp.path != '/'): ncdump.append('path = %s' % self._grp.path) ncdump.append('unlimited dimensions: %s' % ', '.join(unlimdims)) ncdump.append('current shape = %r' % (self.shape,)) if __netcdf4libversion__ < '4.5.1' and\ self._grp.file_format.startswith('NETCDF3'): # issue #908: no_fill not correct for NETCDF3 files before 4.5.1 # before 4.5.1 there was no way to turn off filling on a # per-variable basis for classic files. no_fill=0 else: with nogil: ierr = nc_inq_var_fill(self._grpid,self._varid,&no_fill,NULL) _ensure_nc_success(ierr) if self._isprimitive: if no_fill != 1: try: fillval = self._FillValue msg = 'filling on' except AttributeError: fillval = default_fillvals[self.dtype.str[1:]] if self.dtype.str[1:] in ['u1','i1']: msg = 'filling on, default _FillValue of %s ignored' % fillval else: msg = 'filling on, default _FillValue of %s used' % fillval ncdump.append(msg) else: ncdump.append('filling off') return '\n'.join(ncdump) def _getdims(self): # Private method to get variables's dimension names cdef int ierr, numdims, n, nn cdef char namstring[NC_MAX_NAME+1] cdef int *dimids # get number of dimensions for this variable. with nogil: ierr = nc_inq_varndims(self._grpid, self._varid, &numdims) _ensure_nc_success(ierr) dimids = malloc(sizeof(int) * numdims) # get dimension ids. with nogil: ierr = nc_inq_vardimid(self._grpid, self._varid, dimids) _ensure_nc_success(ierr) # loop over dimensions, retrieve names. dimensions = () for nn from 0 <= nn < numdims: with nogil: ierr = nc_inq_dimname(self._grpid, dimids[nn], namstring) _ensure_nc_success(ierr) name = namstring.decode('utf-8') dimensions = dimensions + (name,) free(dimids) return dimensions def _getname(self): # Private method to get name associated with instance cdef int err, _grpid cdef char namstring[NC_MAX_NAME+1] _grpid = self._grp._grpid with nogil: ierr = nc_inq_varname(_grpid, self._varid, namstring) _ensure_nc_success(ierr) return namstring.decode('utf-8') property name: """string name of Variable instance""" def __get__(self): return self._getname() def __set__(self,value): raise AttributeError("name cannot be altered") property datatype: """numpy data type (for primitive data types) or VLType/CompoundType/EnumType instance (for compound, vlen or enum data types)""" def __get__(self): if self._iscompound: return self._cmptype elif self._isvlen: return self._vltype elif self._isenum: return self._enumtype elif self._isprimitive: return self.dtype property shape: """find current sizes of all variable dimensions""" def __get__(self): shape = () for dimname in self._getdims(): # look in current group, and parents for dim. dim = _find_dim(self._grp,dimname) shape = shape + (len(dim),) return shape def __set__(self,value): raise AttributeError("shape cannot be altered") property size: """Return the number of stored elements.""" def __get__(self): # issue #957: add int since prod(())=1.0 return int(numpy.prod(self.shape)) property dimensions: """get variables's dimension names""" def __get__(self): return self._getdims() def __set__(self,value): raise AttributeError("dimensions cannot be altered") def group(self): """ **`group(self)`** return the group that this `Variable` is a member of.""" return self._grp def ncattrs(self): """ **`ncattrs(self)`** return netCDF attribute names for this `Variable` in a list.""" return _get_att_names(self._grpid, self._varid) def setncattr(self,name,value): """ **`setncattr(self,name,value)`** set a netCDF variable attribute using name,value pair. Use if you need to set a netCDF attribute with the same name as one of the reserved python attributes.""" cdef nc_type xtype xtype=-99 # issue #959 - trying to set _FillValue results in mysterious # error when close method is called so catch it here. It is # already caught in __setattr__. if name == '_FillValue': msg='_FillValue attribute must be set when variable is '+\ 'created (using fill_value keyword to createVariable)' raise AttributeError(msg) if self._grp.data_model != 'NETCDF4': self._grp._redef() _set_att(self._grp, self._varid, name, value, xtype=xtype, force_ncstring=self._ncstring_attrs__) if self._grp.data_model != 'NETCDF4': self._grp._enddef() def setncattr_string(self,name,value): """ **`setncattr_string(self,name,value)`** set a netCDF variable string attribute using name,value pair. Use if you need to ensure that a netCDF attribute is created with type `NC_STRING` if the file format is `NETCDF4`. Use if you need to set an attribute to an array of variable-length strings.""" cdef nc_type xtype xtype=-99 if self._grp.data_model != 'NETCDF4': msg='file format does not support NC_STRING attributes' raise IOError(msg) _set_att(self._grp, self._varid, name, value, xtype=xtype, force_ncstring=True) def setncatts(self,attdict): """ **`setncatts(self,attdict)`** set a bunch of netCDF variable attributes at once using a python dictionary. This may be faster when setting a lot of attributes for a `NETCDF3` formatted file, since nc_redef/nc_enddef is not called in between setting each attribute""" if self._grp.data_model != 'NETCDF4': self._grp._redef() for name, value in attdict.items(): _set_att(self._grp, self._varid, name, value) if self._grp.data_model != 'NETCDF4': self._grp._enddef() def getncattr(self,name,encoding='utf-8'): """ **`getncattr(self,name)`** retrieve a netCDF variable attribute. Use if you need to set a netCDF attribute with the same name as one of the reserved python attributes. option kwarg `encoding` can be used to specify the character encoding of a string attribute (default is `utf-8`).""" return _get_att(self._grp, self._varid, name, encoding=encoding) def delncattr(self, name): """ **`delncattr(self,name,value)`** delete a netCDF variable attribute. Use if you need to delete a netCDF attribute with the same name as one of the reserved python attributes.""" cdef char *attname bytestr = _strencode(name) attname = bytestr if self._grp.data_model != 'NETCDF4': self._grp._redef() ierr = nc_del_att(self._grpid, self._varid, attname) if self._grp.data_model != 'NETCDF4': self._grp._enddef() _ensure_nc_success(ierr) def filters(self): """ **`filters(self)`** return dictionary containing HDF5 filter parameters.""" cdef int ierr,ideflate,ishuffle,ideflate_level,ifletcher32 filtdict = {'zlib':False,'shuffle':False,'complevel':0,'fletcher32':False} if self._grp.data_model not in ['NETCDF4_CLASSIC','NETCDF4']: return with nogil: ierr = nc_inq_var_deflate(self._grpid, self._varid, &ishuffle, &ideflate, &ideflate_level) _ensure_nc_success(ierr) with nogil: ierr = nc_inq_var_fletcher32(self._grpid, self._varid, &ifletcher32) _ensure_nc_success(ierr) if ideflate: filtdict['zlib']=True filtdict['complevel']=ideflate_level if ishuffle: filtdict['shuffle']=True if ifletcher32: filtdict['fletcher32']=True return filtdict def endian(self): """ **`endian(self)`** return endian-ness (`little,big,native`) of variable (as stored in HDF5 file).""" cdef int ierr, iendian if self._grp.data_model not in ['NETCDF4_CLASSIC','NETCDF4']: return 'native' with nogil: ierr = nc_inq_var_endian(self._grpid, self._varid, &iendian) _ensure_nc_success(ierr) if iendian == NC_ENDIAN_LITTLE: return 'little' elif iendian == NC_ENDIAN_BIG: return 'big' else: return 'native' def chunking(self): """ **`chunking(self)`** return variable chunking information. If the dataset is defined to be contiguous (and hence there is no chunking) the word 'contiguous' is returned. Otherwise, a sequence with the chunksize for each dimension is returned.""" cdef int ierr, icontiguous, ndims cdef size_t *chunksizesp if self._grp.data_model not in ['NETCDF4_CLASSIC','NETCDF4']: return None ndims = self.ndim chunksizesp = malloc(sizeof(size_t) * ndims) with nogil: ierr = nc_inq_var_chunking(self._grpid, self._varid, &icontiguous, chunksizesp) _ensure_nc_success(ierr) chunksizes=[] for n from 0 <= n < ndims: chunksizes.append(chunksizesp[n]) free(chunksizesp) if icontiguous: return 'contiguous' else: return chunksizes def get_var_chunk_cache(self): """ **`get_var_chunk_cache(self)`** return variable chunk cache information in a tuple (size,nelems,preemption). See netcdf C library documentation for `nc_get_var_chunk_cache` for details.""" cdef int ierr cdef size_t sizep, nelemsp cdef float preemptionp with nogil: ierr = nc_get_var_chunk_cache(self._grpid, self._varid, &sizep, &nelemsp, &preemptionp) _ensure_nc_success(ierr) size = sizep; nelems = nelemsp; preemption = preemptionp return (size,nelems,preemption) def set_var_chunk_cache(self,size=None,nelems=None,preemption=None): """ **`set_var_chunk_cache(self,size=None,nelems=None,preemption=None)`** change variable chunk cache settings. See netcdf C library documentation for `nc_set_var_chunk_cache` for details.""" cdef int ierr cdef size_t sizep, nelemsp cdef float preemptionp # reset chunk cache size, leave other parameters unchanged. size_orig, nelems_orig, preemption_orig = self.get_var_chunk_cache() if size is not None: sizep = size else: sizep = size_orig if nelems is not None: nelemsp = nelems else: nelemsp = nelems_orig if preemption is not None: preemptionp = preemption else: preemptionp = preemption_orig ierr = nc_set_var_chunk_cache(self._grpid, self._varid, sizep, nelemsp, preemptionp) _ensure_nc_success(ierr) def __delattr__(self,name): # if it's a netCDF attribute, remove it if name not in _private_atts: self.delncattr(name) else: raise AttributeError( "'%s' is one of the reserved attributes %s, cannot delete. Use delncattr instead." % (name, tuple(_private_atts))) def __setattr__(self,name,value): # if name in _private_atts, it is stored at the python # level and not in the netCDF file. if name not in _private_atts: # if setting _FillValue or missing_value, make sure value # has same type and byte order as variable. if name == '_FillValue': msg='_FillValue attribute must be set when variable is '+\ 'created (using fill_value keyword to createVariable)' raise AttributeError(msg) #if self._isprimitive: # value = numpy.array(value, self.dtype) #else: # msg="cannot set _FillValue attribute for "+\ # "VLEN or compound variable" # raise AttributeError(msg) elif name in ['valid_min','valid_max','valid_range','missing_value'] and self._isprimitive: # make sure these attributes written in same data type as variable. # also make sure it is written in native byte order # (the same as the data) valuea = numpy.array(value, self.dtype) # check to see if array cast is safe if _safecast(numpy.array(value),valuea): value = valuea if not value.dtype.isnative: value.byteswap(True) else: # otherwise don't do it, but issue a warning msg="WARNING: %s cannot be safely cast to variable dtype" \ % name warnings.warn(msg) self.setncattr(name, value) elif not name.endswith('__'): if hasattr(self,name): raise AttributeError( "'%s' is one of the reserved attributes %s, cannot rebind. Use setncattr instead." % (name, tuple(_private_atts))) else: self.__dict__[name]=value def __getattr__(self,name): # if name in _private_atts, it is stored at the python # level and not in the netCDF file. if name.startswith('__') and name.endswith('__'): # if __dict__ requested, return a dict with netCDF attributes. if name == '__dict__': names = self.ncattrs() values = [] for name in names: values.append(_get_att(self._grp, self._varid, name)) gen = zip(names, values) if sys.version_info[0:2] < (3, 7): return OrderedDict(gen) else: return dict(gen) else: raise AttributeError elif name in _private_atts: return self.__dict__[name] else: return self.getncattr(name) def renameAttribute(self, oldname, newname): """ **`renameAttribute(self, oldname, newname)`** rename a `Variable` attribute named `oldname` to `newname`.""" cdef int ierr cdef char *oldnamec cdef char *newnamec bytestr = _strencode(oldname) oldnamec = bytestr bytestr = _strencode(newname) newnamec = bytestr ierr = nc_rename_att(self._grpid, self._varid, oldnamec, newnamec) _ensure_nc_success(ierr) def __getitem__(self, elem): # This special method is used to index the netCDF variable # using the "extended slice syntax". The extended slice syntax # is a perfect match for the "start", "count" and "stride" # arguments to the nc_get_var() function, and is much more easy # to use. start, count, stride, put_ind =\ _StartCountStride(elem,self.shape,dimensions=self.dimensions,grp=self._grp,use_get_vars=self._use_get_vars) datashape = _out_array_shape(count) if self._isvlen: data = numpy.empty(datashape, dtype='O') else: data = numpy.empty(datashape, dtype=self.dtype) # Determine which dimensions need to be # squeezed (those for which elem is an integer scalar). # The convention used is that for those cases, # put_ind for this dimension is set to -1 by _StartCountStride. squeeze = data.ndim * [slice(None),] for i,n in enumerate(put_ind.shape[:-1]): if n == 1 and put_ind[...,i].ravel()[0] == -1: squeeze[i] = 0 # Reshape the arrays so we can iterate over them. start = start.reshape((-1, self.ndim or 1)) count = count.reshape((-1, self.ndim or 1)) stride = stride.reshape((-1, self.ndim or 1)) put_ind = put_ind.reshape((-1, self.ndim or 1)) # Fill output array with data chunks. for (a,b,c,i) in zip(start, count, stride, put_ind): datout = self._get(a,b,c) if not hasattr(datout,'shape') or data.shape == datout.shape: data = datout else: shape = getattr(data[tuple(i)], 'shape', ()) if self._isvlen and not len(self.dimensions): # special case of scalar VLEN data[0] = datout else: data[tuple(i)] = datout.reshape(shape) # Remove extra singleton dimensions. if hasattr(data,'shape'): data = data[tuple(squeeze)] if hasattr(data,'ndim') and self.ndim == 0: # Make sure a numpy scalar array is returned instead of a 1-d array of # length 1. if data.ndim != 0: data = numpy.asarray(data[0]) # if auto_scale mode set to True, (through # a call to set_auto_scale or set_auto_maskandscale), # perform automatic unpacking using scale_factor/add_offset. # if auto_mask mode is set to True (through a call to # set_auto_mask or set_auto_maskandscale), perform # automatic conversion to masked array using # missing_value/_Fill_Value. # applied for primitive and (non-string) vlen, # ignored for compound and enum datatypes. try: # check to see if scale_factor and add_offset is valid (issue 176). if hasattr(self,'scale_factor'): float(self.scale_factor) if hasattr(self,'add_offset'): float(self.add_offset) valid_scaleoffset = True except: valid_scaleoffset = False if self.scale: msg = 'invalid scale_factor or add_offset attribute, no unpacking done...' warnings.warn(msg) if self.mask and (self._isprimitive or self._isenum):\ data = self._toma(data) else: # if attribute _Unsigned is True, and variable has signed integer # dtype, return view with corresponding unsigned dtype (issue #656) if self.scale: # only do this if autoscale option is on. is_unsigned = getattr(self, '_Unsigned', False) if is_unsigned and data.dtype.kind == 'i': data=data.view('%su%s'%(data.dtype.byteorder,data.dtype.itemsize)) if self.scale and\ (self._isprimitive or (self._isvlen and self.dtype != str)) and\ valid_scaleoffset: # if variable has scale_factor and add_offset attributes, apply # them. if hasattr(self, 'scale_factor') and hasattr(self, 'add_offset'): if self.add_offset != 0.0 or self.scale_factor != 1.0: data = data*self.scale_factor + self.add_offset else: data = data.astype(self.scale_factor.dtype) # issue 913 # else if variable has only scale_factor attribute, rescale. elif hasattr(self, 'scale_factor') and self.scale_factor != 1.0: data = data*self.scale_factor # else if variable has only add_offset attribute, add offset. elif hasattr(self, 'add_offset') and self.add_offset != 0.0: data = data + self.add_offset # if _Encoding is specified for a character variable, return # a numpy array of strings with one less dimension. if self.chartostring and getattr(self.dtype,'kind',None) == 'S' and\ getattr(self.dtype,'itemsize',None) == 1: encoding = getattr(self,'_Encoding',None) # should this only be done if self.scale = True? # should there be some other way to disable this? if encoding is not None: # only try to return a string array if rightmost dimension of # sliced data matches rightmost dimension of char variable if len(data.shape) > 0 and data.shape[-1] == self.shape[-1]: # also make sure slice is along last dimension matchdim = True for cnt in count: if cnt[-1] != self.shape[-1]: matchdim = False break if matchdim: data = chartostring(data, encoding=encoding) # if structure array contains char arrays, return view as strings # if _Encoding att set (issue #773) if self._iscompound and \ self._cmptype.dtype != self._cmptype.dtype_view and \ self.chartostring: # self.chartostring and getattr(self,'_Encoding',None) is not None: data = data.view(self._cmptype.dtype_view) return data def _toma(self,data): cdef int ierr, no_fill # if attribute _Unsigned is True, and variable has signed integer # dtype, return view with corresponding unsigned dtype (issues #656, # #794) is_unsigned = getattr(self, '_Unsigned', False) is_unsigned_int = is_unsigned and data.dtype.kind == 'i' if self.scale and is_unsigned_int: # only do this if autoscale option is on. dtype_unsigned_int='%su%s' % (data.dtype.byteorder,data.dtype.itemsize) data = data.view(dtype_unsigned_int) # private function for creating a masked array, masking missing_values # and/or _FillValues. totalmask = numpy.zeros(data.shape, numpy.bool_) fill_value = None safe_missval = self._check_safecast('missing_value') if safe_missval: mval = numpy.array(self.missing_value, self.dtype) if self.scale and is_unsigned_int: mval = mval.view(dtype_unsigned_int) # create mask from missing values. mvalmask = numpy.zeros(data.shape, numpy.bool_) if mval.shape == (): # mval a scalar. mval = [mval] # make into iterable. for m in mval: # is scalar missing value a NaN? try: mvalisnan = numpy.isnan(m) except TypeError: # isnan fails on some dtypes (issue 206) mvalisnan = False if mvalisnan: mvalmask += numpy.isnan(data) else: mvalmask += data==m if mvalmask.any(): # set fill_value for masked array # to missing_value (or 1st element # if missing_value is a vector). fill_value = mval[0] totalmask += mvalmask # set mask=True for data == fill value safe_fillval = self._check_safecast('_FillValue') if safe_fillval: fval = numpy.array(self._FillValue, self.dtype) if self.scale and is_unsigned_int: fval = fval.view(dtype_unsigned_int) # is _FillValue a NaN? try: fvalisnan = numpy.isnan(fval) except: # isnan fails on some dtypes (issue 202) fvalisnan = False if fvalisnan: mask = numpy.isnan(data) elif (data == fval).any(): mask = data==fval else: mask = None if mask is not None: if fill_value is None: fill_value = fval totalmask += mask # issue 209: don't return masked array if variable filling # is disabled. else: if __netcdf4libversion__ < '4.5.1' and\ self._grp.file_format.startswith('NETCDF3'): # issue #908: no_fill not correct for NETCDF3 files before 4.5.1 # before 4.5.1 there was no way to turn off filling on a # per-variable basis for classic files. no_fill=0 else: with nogil: ierr = nc_inq_var_fill(self._grpid,self._varid,&no_fill,NULL) _ensure_nc_success(ierr) # if no_fill is not 1, and not a byte variable, then use default fill value. # from http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-c/Fill-Values.html#Fill-Values # "If you need a fill value for a byte variable, it is recommended # that you explicitly define an appropriate _FillValue attribute, as # generic utilities such as ncdump will not assume a default fill # value for byte variables." # Explained here too: # http://www.unidata.ucar.edu/software/netcdf/docs/known_problems.html#ncdump_ubyte_fill # "There should be no default fill values when reading any byte # type, signed or unsigned, because the byte ranges are too # small to assume one of the values should appear as a missing # value unless a _FillValue attribute is set explicitly." # (do this only for non-vlens, since vlens don't have a default _FillValue) if not self._isvlen and (no_fill != 1 or self.dtype.str[1:] not in ['u1','i1']): fillval = numpy.array(default_fillvals[self.dtype.str[1:]],self.dtype) has_fillval = data == fillval # if data is an array scalar, has_fillval will be a boolean. # in that case convert to an array. if type(has_fillval) == bool: has_fillval=numpy.asarray(has_fillval) if has_fillval.any(): if fill_value is None: fill_value = fillval mask=data==fillval totalmask += mask # set mask=True for data outside valid_min,valid_max. # (issue #576) validmin = None; validmax = None # if valid_range exists use that, otherwise # look for valid_min, valid_max. No special # treatment of byte data as described at # http://www.unidata.ucar.edu/software/netcdf/docs/attribute_conventions.html). safe_validrange = self._check_safecast('valid_range') safe_validmin = self._check_safecast('valid_min') safe_validmax = self._check_safecast('valid_max') if safe_validrange and self.valid_range.size == 2: validmin = numpy.array(self.valid_range[0], self.dtype) validmax = numpy.array(self.valid_range[1], self.dtype) else: if safe_validmin: validmin = numpy.array(self.valid_min, self.dtype) if safe_validmax: validmax = numpy.array(self.valid_max, self.dtype) if validmin is not None and self.scale and is_unsigned_int: validmin = validmin.view(dtype_unsigned_int) if validmax is not None and self.scale and is_unsigned_int: validmax = validmax.view(dtype_unsigned_int) # http://www.unidata.ucar.edu/software/netcdf/docs/attribute_conventions.html). # "If the data type is byte and _FillValue # is not explicitly defined, # then the valid range should include all possible values. # Otherwise, the valid range should exclude the _FillValue # (whether defined explicitly or by default) as follows. # If the _FillValue is positive then it defines a valid maximum, # otherwise it defines a valid minimum." byte_type = self.dtype.str[1:] in ['u1','i1'] if safe_fillval: fval = numpy.array(self._FillValue, self.dtype) else: fval = numpy.array(default_fillvals[self.dtype.str[1:]],self.dtype) if byte_type: fval = None if self.dtype.kind != 'S': # don't set mask for character data # issues #761 and #748: setting valid_min/valid_max to the # _FillVaue is too surprising for many users (despite the # netcdf docs attribute best practices suggesting clients # should do this). #if validmin is None and (fval is not None and fval <= 0): # validmin = fval #if validmax is None and (fval is not None and fval > 0): # validmax = fval if validmin is not None: totalmask += data < validmin if validmax is not None: totalmask += data > validmax if fill_value is None and fval is not None: fill_value = fval # if all else fails, use default _FillValue as fill_value # for masked array. if fill_value is None: fill_value = default_fillvals[self.dtype.str[1:]] # create masked array with computed mask masked_values = bool(totalmask.any()) if masked_values: data = ma.masked_array(data,mask=totalmask,fill_value=fill_value) else: # issue #785: always return masked array, if no values masked data = ma.masked_array(data) # issue 515 scalar array with mask=True should be converted # to numpy.ma.MaskedConstant to be consistent with slicing # behavior of masked arrays. if data.shape == () and data.mask.all(): # return a scalar numpy masked constant not a 0-d masked array, # so that data == numpy.ma.masked. data = data[()] # changed from [...] (issue #662) elif not self.always_mask and not masked_values: # issue #809: return a regular numpy array if requested # and there are no missing values data = numpy.array(data, copy=False) return data def _pack(self,data): # pack non-masked values using scale_factor and add_offset if hasattr(self, 'scale_factor') and hasattr(self, 'add_offset'): data = (data - self.add_offset)/self.scale_factor if self.dtype.kind in 'iu': data = numpy.around(data) elif hasattr(self, 'scale_factor'): data = data/self.scale_factor if self.dtype.kind in 'iu': data = numpy.around(data) elif hasattr(self, 'add_offset'): data = data - self.add_offset if self.dtype.kind in 'iu': data = numpy.around(data) if ma.isMA(data): # if underlying data in masked regions of masked array # corresponds to missing values, don't fill masked array - # just use underlying data instead if hasattr(self, 'missing_value') and \ numpy.all(numpy.in1d(data.data[data.mask],self.missing_value)): data = data.data else: if hasattr(self, 'missing_value'): # if missing value is a scalar, use it as fill_value. # if missing value is a vector, raise an exception # since we then don't know how to fill in masked values. if numpy.array(self.missing_value).shape == (): fillval = self.missing_value else: msg="cannot assign fill_value for masked array when missing_value attribute is not a scalar" raise RuntimeError(msg) if numpy.array(fillval).shape != (): fillval = fillval[0] elif hasattr(self, '_FillValue'): fillval = self._FillValue else: fillval = default_fillvals[self.dtype.str[1:]] # some versions of numpy have trouble handling # MaskedConstants when filling - this is is # a workaround (issue #850) if data.shape == (1,) and data.mask.all(): data = numpy.array([fillval],self.dtype) else: data = data.filled(fill_value=fillval) if self.dtype != data.dtype: data = data.astype(self.dtype) # cast data to var type, if necessary. return data def _assign_vlen(self, elem, data): """private method to assign data to a single item in a VLEN variable""" cdef size_t *startp cdef size_t *countp cdef int ndims, n cdef nc_vlen_t *vldata cdef char **strdata cdef ndarray data2 if not self._isvlen: raise TypeError('_assign_vlen method only for use with VLEN variables') ndims = self.ndim msg="data can only be assigned to VLEN variables using integer indices" # check to see that elem is a tuple of integers. # handle negative integers. if _is_int(elem): if ndims > 1: raise IndexError(msg) if elem < 0: if self.shape[0]+elem >= 0: elem = self.shape[0]+elem else: raise IndexError("Illegal index") elif isinstance(elem, tuple): if len(elem) != ndims: raise IndexError("Illegal index") elemnew = [] for n,e in enumerate(elem): if not _is_int(e): raise IndexError(msg) elif e < 0: enew = self.shape[n]+e if enew < 0: raise IndexError("Illegal index") else: elemnew.append(self.shape[n]+e) else: elemnew.append(e) elem = tuple(elemnew) else: raise IndexError(msg) # set start, count if isinstance(elem, tuple): start = list(elem) else: start = [elem] count = [1]*ndims startp = malloc(sizeof(size_t) * ndims) countp = malloc(sizeof(size_t) * ndims) for n from 0 <= n < ndims: startp[n] = start[n] countp[n] = count[n] if self.dtype == str: # VLEN string strdata = malloc(sizeof(char *)) # use _Encoding attribute to specify string encoding - if # not given, use 'utf-8'. encoding = getattr(self,'_Encoding','utf-8') bytestr = _strencode(data,encoding=encoding) strdata[0] = bytestr ierr = nc_put_vara(self._grpid, self._varid, startp, countp, strdata) _ensure_nc_success(ierr) free(strdata) else: # regular VLEN if data.dtype != self.dtype: raise TypeError("wrong data type: should be %s, got %s" % (self.dtype,data.dtype)) data2 = data vldata = malloc(sizeof(nc_vlen_t)) vldata[0].len = PyArray_SIZE(data2) vldata[0].p = PyArray_DATA(data2) ierr = nc_put_vara(self._grpid, self._varid, startp, countp, vldata) _ensure_nc_success(ierr) free(vldata) free(startp) free(countp) def _check_safecast(self, attname): # check to see that variable attribute exists # can can be safely cast to variable data type. if hasattr(self, attname): att = numpy.array(self.getncattr(attname)) else: return False atta = numpy.array(att, self.dtype) is_safe = _safecast(att,atta) if not is_safe: msg="""WARNING: %s not used since it cannot be safely cast to variable data type""" % attname warnings.warn(msg) return is_safe def __setitem__(self, elem, data): # This special method is used to assign to the netCDF variable # using "extended slice syntax". The extended slice syntax # is a perfect match for the "start", "count" and "stride" # arguments to the nc_put_var() function, and is much more easy # to use. # if _Encoding is specified for a character variable, convert # numpy array of strings to a numpy array of characters with one more # dimension. if self.chartostring and getattr(self.dtype,'kind',None) == 'S' and\ getattr(self.dtype,'itemsize',None) == 1: # NC_CHAR variable encoding = getattr(self,'_Encoding',None) if encoding is not None: # _Encoding attribute is set # if data is a string or a bytes object, convert to a numpy string array # whose length is equal to the rightmost dimension of the # variable. if type(data) in [str,bytes]: data = numpy.asarray(data,dtype='S'+repr(self.shape[-1])) if data.dtype.kind in ['S','U'] and data.dtype.itemsize > 1: # if data is a numpy string array, convert it to an array # of characters with one more dimension. data = stringtochar(data, encoding=encoding) # if structured data has strings (and _Encoding att set), create view as char arrays # (issue #773) if self._iscompound and \ self._cmptype.dtype != self._cmptype.dtype_view and \ _set_viewdtype(data.dtype) == self._cmptype.dtype_view and \ self.chartostring: # self.chartostring and getattr(self,'_Encoding',None) is not None: # may need to cast input data to aligned type data = data.astype(self._cmptype.dtype_view).view(self._cmptype.dtype) if self._isvlen: # if vlen, should be object array (don't try casting) if self.dtype == str: # for string vars, if data is not an array # assume it is a python string and raise an error # if it is an array, but not an object array. if not isinstance(data, numpy.ndarray): # issue 458, allow Ellipsis to be used for scalar var if type(elem) == type(Ellipsis) and not\ len(self.dimensions): elem = 0 self._assign_vlen(elem, data) return elif data.dtype.kind in ['S', 'U']: if ma.isMA(data): msg='masked arrays cannot be assigned by VLEN str slices' raise TypeError(msg) data = data.astype(object) elif data.dtype.kind != 'O': msg = ('only numpy string, unicode or object arrays can ' 'be assigned to VLEN str var slices') raise TypeError(msg) else: # for non-string vlen arrays, if data is not multi-dim, or # not an object array, assume it represents a single element # of the vlen var. if not isinstance(data, numpy.ndarray) or data.dtype.kind != 'O': # issue 458, allow Ellipsis to be used for scalar var if type(elem) == type(Ellipsis) and not\ len(self.dimensions): elem = 0 # pack as integers if desired. if self.scale: data = self._pack(data) self._assign_vlen(elem, data) return # A numpy or masked array (or an object supporting the buffer interface) is needed. # Convert if necessary. if not ma.isMA(data) and not (hasattr(data,'data') and isinstance(data.data,memoryview)): # if auto scaling is to be done, don't cast to an integer yet. if self.scale and self.dtype.kind in 'iu' and \ hasattr(self, 'scale_factor') or hasattr(self, 'add_offset'): data = numpy.array(data,numpy.float64) else: data = numpy.array(data,self.dtype) # for Enum variable, make sure data is valid. if self._isenum: test = numpy.zeros(data.shape,numpy.bool_) if ma.isMA(data): # fix for new behaviour in numpy.ma in 1.13 (issue #662) for val in self.datatype.enum_dict.values(): test += data.filled() == val else: for val in self.datatype.enum_dict.values(): test += data == val if not numpy.all(test): msg="trying to assign illegal value to Enum variable" raise ValueError(msg) start, count, stride, put_ind =\ _StartCountStride(elem,self.shape,self.dimensions,self._grp,datashape=data.shape,put=True) datashape = _out_array_shape(count) # if a numpy scalar, create an array of the right size # and fill with scalar values. if data.shape == (): data = numpy.tile(data,datashape) # reshape data array if needed to conform with start,count,stride. if data.ndim != len(datashape) or\ (data.shape != datashape and data.ndim > 1): # issue #1083 # create a view so shape in caller is not modified (issue 90) try: # if extra singleton dims, just reshape data = data.view() data.shape = tuple(datashape) except ValueError: # otherwise broadcast data = numpy.broadcast_to(data, datashape) # Reshape these arrays so we can iterate over them. start = start.reshape((-1, self.ndim or 1)) count = count.reshape((-1, self.ndim or 1)) stride = stride.reshape((-1, self.ndim or 1)) put_ind = put_ind.reshape((-1, self.ndim or 1)) # quantize data if least_significant_digit attribute # exists (improves compression). if self._has_lsd: data = _quantize(data,self.least_significant_digit) if self.scale and self._isprimitive: # pack non-masked values using scale_factor and add_offset data = self._pack(data) # Fill output array with data chunks. for (a,b,c,i) in zip(start, count, stride, put_ind): dataput = data[tuple(i)] if dataput.size == 0: continue # nothing to write # convert array scalar to regular array with one element. if dataput.shape == (): if self._isvlen: dataput=numpy.array(dataput,'O') else: dataput=numpy.array(dataput,dataput.dtype) self._put(dataput,a,b,c) def __len__(self): if not self.shape: raise TypeError('len() of unsized object') else: return self.shape[0] def assignValue(self,val): """ **`assignValue(self, val)`** assign a value to a scalar variable. Provided for compatibility with Scientific.IO.NetCDF, can also be done by assigning to an Ellipsis slice ([...]).""" if len(self.dimensions): raise IndexError('to assign values to a non-scalar variable, use a slice') self[:]=val def getValue(self): """ **`getValue(self)`** get the value of a scalar variable. Provided for compatibility with Scientific.IO.NetCDF, can also be done by slicing with an Ellipsis ([...]).""" if len(self.dimensions): raise IndexError('to retrieve values from a non-scalar variable, use slicing') return self[slice(None)] def set_auto_chartostring(self,chartostring): """ **`set_auto_chartostring(self,chartostring)`** turn on or off automatic conversion of character variable data to and from numpy fixed length string arrays when the `_Encoding` variable attribute is set. If `chartostring` is set to `True`, when data is read from a character variable (dtype = `S1`) that has an `_Encoding` attribute, it is converted to a numpy fixed length unicode string array (dtype = `UN`, where `N` is the length of the the rightmost dimension of the variable). The value of `_Encoding` is the unicode encoding that is used to decode the bytes into strings. When numpy string data is written to a variable it is converted back to indiviual bytes, with the number of bytes in each string equalling the rightmost dimension of the variable. The default value of `chartostring` is `True` (automatic conversions are performed). """ self.chartostring = bool(chartostring) def use_nc_get_vars(self,use_nc_get_vars): """ **`use_nc_get_vars(self,_use_get_vars)`** enable the use of netcdf library routine `nc_get_vars` to retrieve strided variable slices. By default, `nc_get_vars` may not used by default (depending on the version of the netcdf-c library being used) since it may be slower than multiple calls to the unstrided read routine `nc_get_vara`. """ self._use_get_vars = bool(use_nc_get_vars) def set_auto_maskandscale(self,maskandscale): """ **`set_auto_maskandscale(self,maskandscale)`** turn on or off automatic conversion of variable data to and from masked arrays, automatic packing/unpacking of variable data using `scale_factor` and `add_offset` attributes and automatic conversion of signed integer data to unsigned integer data if the `_Unsigned` attribute exists. If `maskandscale` is set to `True`, when data is read from a variable it is converted to a masked array if any of the values are exactly equal to the either the netCDF _FillValue or the value specified by the missing_value variable attribute. The fill_value of the masked array is set to the missing_value attribute (if it exists), otherwise the netCDF _FillValue attribute (which has a default value for each data type). If the variable has no missing_value attribute, the _FillValue is used instead. If the variable has valid_min/valid_max and missing_value attributes, data outside the specified range will be masked. When data is written to a variable, the masked array is converted back to a regular numpy array by replacing all the masked values by the missing_value attribute of the variable (if it exists). If the variable has no missing_value attribute, the _FillValue is used instead. If `maskandscale` is set to `True`, and the variable has a `scale_factor` or an `add_offset` attribute, then data read from that variable is unpacked using:: data = self.scale_factor*data + self.add_offset When data is written to a variable it is packed using:: data = (data - self.add_offset)/self.scale_factor If either scale_factor is present, but add_offset is missing, add_offset is assumed zero. If add_offset is present, but scale_factor is missing, scale_factor is assumed to be one. For more information on how `scale_factor` and `add_offset` can be used to provide simple compression, see the [PSL metadata conventions](http://www.esrl.noaa.gov/psl/data/gridded/conventions/cdc_netcdf_standard.shtml). In addition, if `maskandscale` is set to `True`, and if the variable has an attribute `_Unsigned` set, and the variable has a signed integer data type, a view to the data is returned with the corresponding unsigned integer data type. This convention is used by the netcdf-java library to save unsigned integer data in `NETCDF3` or `NETCDF4_CLASSIC` files (since the `NETCDF3` data model does not have unsigned integer data types). The default value of `maskandscale` is `True` (automatic conversions are performed). """ self.scale = self.mask = bool(maskandscale) def set_auto_scale(self,scale): """ **`set_auto_scale(self,scale)`** turn on or off automatic packing/unpacking of variable data using `scale_factor` and `add_offset` attributes. Also turns on and off automatic conversion of signed integer data to unsigned integer data if the variable has an `_Unsigned` attribute. If `scale` is set to `True`, and the variable has a `scale_factor` or an `add_offset` attribute, then data read from that variable is unpacked using:: data = self.scale_factor*data + self.add_offset When data is written to a variable it is packed using:: data = (data - self.add_offset)/self.scale_factor If either scale_factor is present, but add_offset is missing, add_offset is assumed zero. If add_offset is present, but scale_factor is missing, scale_factor is assumed to be one. For more information on how `scale_factor` and `add_offset` can be used to provide simple compression, see the [PSL metadata conventions](http://www.esrl.noaa.gov/psl/data/gridded/conventions/cdc_netcdf_standard.shtml). In addition, if `scale` is set to `True`, and if the variable has an attribute `_Unsigned` set, and the variable has a signed integer data type, a view to the data is returned with the corresponding unsigned integer datatype. This convention is used by the netcdf-java library to save unsigned integer data in `NETCDF3` or `NETCDF4_CLASSIC` files (since the `NETCDF3` data model does not have unsigned integer data types). The default value of `scale` is `True` (automatic conversions are performed). """ self.scale = bool(scale) def set_auto_mask(self,mask): """ **`set_auto_mask(self,mask)`** turn on or off automatic conversion of variable data to and from masked arrays . If `mask` is set to `True`, when data is read from a variable it is converted to a masked array if any of the values are exactly equal to the either the netCDF _FillValue or the value specified by the missing_value variable attribute. The fill_value of the masked array is set to the missing_value attribute (if it exists), otherwise the netCDF _FillValue attribute (which has a default value for each data type). If the variable has no missing_value attribute, the _FillValue is used instead. If the variable has valid_min/valid_max and missing_value attributes, data outside the specified range will be masked. When data is written to a variable, the masked array is converted back to a regular numpy array by replacing all the masked values by the missing_value attribute of the variable (if it exists). If the variable has no missing_value attribute, the _FillValue is used instead. The default value of `mask` is `True` (automatic conversions are performed). """ self.mask = bool(mask) def set_always_mask(self,always_mask): """ **`set_always_mask(self,always_mask)`** turn on or off conversion of data without missing values to regular numpy arrays. `always_mask` is a Boolean determining if automatic conversion of masked arrays with no missing values to regular numpy arrays shall be applied. Default is True. Set to False to restore the default behaviour in versions prior to 1.4.1 (numpy array returned unless missing values are present, otherwise masked array returned). """ self.always_mask = bool(always_mask) def set_ncstring_attrs(self,ncstring_attrs): """ **`set_always_mask(self,ncstring_attrs)`** turn on or off creating NC_STRING string attributes. If `ncstring_attrs` is set to `True` then text attributes will be variable-length NC_STRINGs. The default value of `ncstring_attrs` is `False` (writing ascii text attributes as NC_CHAR). """ self._ncstring_attrs__ = bool(ncstring_attrs) def _put(self,ndarray data,start,count,stride): """Private method to put data into a netCDF variable""" cdef int ierr, ndims cdef npy_intp totelem cdef size_t *startp cdef size_t *countp cdef ptrdiff_t *stridep cdef char **strdata cdef void* elptr cdef char* databuff cdef ndarray dataarr cdef nc_vlen_t *vldata # rank of variable. ndims = len(self.dimensions) # make sure data is contiguous. # if not, make a local copy. if not PyArray_ISCONTIGUOUS(data): data = data.copy() # fill up startp,countp,stridep. totelem = 1 negstride = 0 sl = [] startp = malloc(sizeof(size_t) * ndims) countp = malloc(sizeof(size_t) * ndims) stridep = malloc(sizeof(ptrdiff_t) * ndims) for n from 0 <= n < ndims: count[n] = abs(count[n]) # make -1 into +1 countp[n] = count[n] # for neg strides, reverse order (then flip that axis after data read in) if stride[n] < 0: negstride = 1 stridep[n] = -stride[n] startp[n] = start[n]+stride[n]*(count[n]-1) stride[n] = -stride[n] sl.append(slice(None, None, -1)) # this slice will reverse the data else: startp[n] = start[n] stridep[n] = stride[n] sl.append(slice(None,None, 1)) totelem = totelem*countp[n] # check to see that size of data array is what is expected # for slice given. dataelem = PyArray_SIZE(data) if totelem != dataelem: raise IndexError('size of data array does not conform to slice') if negstride: # reverse data along axes with negative strides. data = data[tuple(sl)].copy() # make sure a copy is made. if self._isprimitive or self._iscompound or self._isenum: # primitive, enum or compound data type. # if data type of array doesn't match variable, # try to cast the data. if self.dtype != data.dtype: data = data.astype(self.dtype) # cast data, if necessary. # byte-swap data in numpy array so that is has native # endian byte order (this is what netcdf-c expects - # issue #554, pull request #555) if not data.dtype.isnative: data = data.byteswap() # strides all 1 or scalar variable, use put_vara (faster) if sum(stride) == ndims or ndims == 0: ierr = nc_put_vara(self._grpid, self._varid, startp, countp, PyArray_DATA(data)) else: ierr = nc_put_vars(self._grpid, self._varid, startp, countp, stridep, PyArray_DATA(data)) _ensure_nc_success(ierr) elif self._isvlen: if data.dtype.char !='O': raise TypeError('data to put in string variable must be an object array containing Python strings') # flatten data array. data = data.flatten() if self.dtype == str: # convert all elements from strings to bytes # use _Encoding attribute to specify string encoding - if # not given, use 'utf-8'. encoding = getattr(self,'_Encoding','utf-8') for n in range(data.shape[0]): data[n] = _strencode(data[n],encoding=encoding) # vlen string (NC_STRING) # loop over elements of object array, put data buffer for # each element in struct. # allocate struct array to hold vlen data. strdata = malloc(sizeof(char *)*totelem) for i from 0<=idata) # allocate struct array to hold vlen data. vldata = malloc(totelem*sizeof(nc_vlen_t)) for i from 0<=idatabuff)[0] dataarr = elptr if self.dtype != dataarr.dtype.str[1:]: #dataarr = dataarr.astype(self.dtype) # cast data, if necessary. # casting doesn't work ?? just raise TypeError raise TypeError("wrong data type in object array: should be %s, got %s" % (self.dtype,dataarr.dtype)) vldata[i].len = PyArray_SIZE(dataarr) vldata[i].p = PyArray_DATA(dataarr) databuff = databuff + PyArray_STRIDES(data)[0] # strides all 1 or scalar variable, use put_vara (faster) if sum(stride) == ndims or ndims == 0: ierr = nc_put_vara(self._grpid, self._varid, startp, countp, vldata) else: raise IndexError('strides must all be 1 for vlen variables') #ierr = nc_put_vars(self._grpid, self._varid, # startp, countp, stridep, vldata) _ensure_nc_success(ierr) # free the pointer array. free(vldata) free(startp) free(countp) free(stridep) def _get(self,start,count,stride): """Private method to retrieve data from a netCDF variable""" cdef int ierr, ndims cdef size_t *startp cdef size_t *countp cdef ptrdiff_t *stridep cdef ndarray data, dataarr cdef void *elptr cdef char **strdata cdef nc_vlen_t *vldata # if one of the counts is negative, then it is an index # and not a slice so the resulting array # should be 'squeezed' to remove the singleton dimension. shapeout = () squeeze_out = False for lendim in count: if lendim == -1: shapeout = shapeout + (1,) squeeze_out = True else: shapeout = shapeout + (lendim,) # rank of variable. ndims = len(self.dimensions) # fill up startp,countp,stridep. negstride = 0 sl = [] startp = malloc(sizeof(size_t) * ndims) countp = malloc(sizeof(size_t) * ndims) stridep = malloc(sizeof(ptrdiff_t) * ndims) for n from 0 <= n < ndims: count[n] = abs(count[n]) # make -1 into +1 countp[n] = count[n] # for neg strides, reverse order (then flip that axis after data read in) if stride[n] < 0: negstride = 1 stridep[n] = -stride[n] startp[n] = start[n]+stride[n]*(count[n]-1) stride[n] = -stride[n] sl.append(slice(None, None, -1)) # this slice will reverse the data else: startp[n] = start[n] stridep[n] = stride[n] sl.append(slice(None,None, 1)) if self._isprimitive or self._iscompound or self._isenum: data = numpy.empty(shapeout, self.dtype) # strides all 1 or scalar variable, use get_vara (faster) # if count contains a zero element, no data is being read if 0 not in count: if sum(stride) == ndims or ndims == 0: with nogil: ierr = nc_get_vara(self._grpid, self._varid, startp, countp, PyArray_DATA(data)) else: with nogil: ierr = nc_get_vars(self._grpid, self._varid, startp, countp, stridep, PyArray_DATA(data)) else: ierr = 0 if ierr == NC_EINVALCOORDS: raise IndexError('index exceeds dimension bounds') elif ierr != NC_NOERR: _ensure_nc_success(ierr) elif self._isvlen: # allocate array of correct primitive type. data = numpy.empty(shapeout, 'O') # flatten data array. data = data.flatten() totelem = PyArray_SIZE(data) if self.dtype == str: # vlen string (NC_STRING) # allocate pointer array to hold string data. strdata = malloc(sizeof(char *) * totelem) # strides all 1 or scalar variable, use get_vara (faster) if sum(stride) == ndims or ndims == 0: with nogil: ierr = nc_get_vara(self._grpid, self._varid, startp, countp, strdata) else: # FIXME: is this a bug in netCDF4? raise IndexError('strides must all be 1 for string variables') #ierr = nc_get_vars(self._grpid, self._varid, # startp, countp, stridep, strdata) if ierr == NC_EINVALCOORDS: raise IndexError elif ierr != NC_NOERR: _ensure_nc_success(ierr) # loop over elements of object array, fill array with # contents of strdata. # use _Encoding attribute to decode string to bytes - if # not given, use 'utf-8'. encoding = getattr(self,'_Encoding','utf-8') for i from 0<=imalloc(totelem*sizeof(nc_vlen_t)) for i in range(totelem): vldata[i].len = 0 vldata[i].p = 0 # strides all 1 or scalar variable, use get_vara (faster) if sum(stride) == ndims or ndims == 0: with nogil: ierr = nc_get_vara(self._grpid, self._varid, startp, countp, vldata) else: raise IndexError('strides must all be 1 for vlen variables') #ierr = nc_get_vars(self._grpid, self._varid, # startp, countp, stridep, vldata) if ierr == NC_EINVALCOORDS: raise IndexError elif ierr != NC_NOERR: _ensure_nc_success(ierr) # loop over elements of object array, fill array with # contents of vlarray struct, put array in object array. for i from 0<=ivldata[i].p memcpy(PyArray_DATA(dataarr), vldata[i].p, dataarr.nbytes) data[i] = dataarr # reshape the output array data = numpy.reshape(data, shapeout) # free vlen data internally allocated in netcdf C lib ierr = nc_free_vlens(totelem, vldata) # free the pointer array free(vldata) free(startp) free(countp) free(stridep) if negstride: # reverse data along axes with negative strides. data = data[tuple(sl)].copy() # make a copy so data is contiguous. # netcdf-c always returns data in native byte order, # regardless of variable endian-ness. Here we swap the # bytes if the variable dtype is not native endian, so the # dtype of the returned numpy array matches the variable dtype. # (pull request #555, issue #554). if not data.dtype.isnative: data.byteswap(True) # in-place byteswap if not self.dimensions: return data[0] # a scalar elif squeeze_out: return numpy.squeeze(data) else: return data def set_collective(self, value): """ **`set_collective(self,True_or_False)`** turn on or off collective parallel IO access. Ignored if file is not open for parallel access. """ IF HAS_PARALLEL4_SUPPORT or HAS_PNETCDF_SUPPORT: # set collective MPI IO mode on or off if value: ierr = nc_var_par_access(self._grpid, self._varid, NC_COLLECTIVE) else: ierr = nc_var_par_access(self._grpid, self._varid, NC_INDEPENDENT) _ensure_nc_success(ierr) ELSE: pass # does nothing def get_dims(self): """ **`get_dims(self)`** return a tuple of `Dimension` instances associated with this `Variable`. """ return tuple(_find_dim(self._grp, dim) for dim in self.dimensions) def __reduce__(self): # raise error is user tries to pickle a Variable object. raise NotImplementedError('Variable is not picklable') # Compound datatype support. cdef class CompoundType: """ A `CompoundType` instance is used to describe a compound data type, and can be passed to the the `Dataset.createVariable` method of a `Dataset` or `Group` instance. Compound data types map to numpy structured arrays. See `CompoundType.__init__` for more details. The instance variables `dtype` and `name` should not be modified by the user. """ cdef public nc_type _nc_type cdef public dtype, dtype_view, name def __init__(self, grp, object dt, object dtype_name, **kwargs): """ ***`__init__(group, datatype, datatype_name)`*** CompoundType constructor. **`group`**: `Group` instance to associate with the compound datatype. **`datatype`**: A numpy dtype object describing a structured (a.k.a record) array. Can be composed of homogeneous numeric or character data types, or other structured array data types. **`datatype_name`**: a Python string containing a description of the compound data type. ***Note 1***: When creating nested compound data types, the inner compound data types must already be associated with CompoundType instances (so create CompoundType instances for the innermost structures first). ***Note 2***: `CompoundType` instances should be created using the `Dataset.createCompoundType` method of a `Dataset` or `Group` instance, not using this class directly. """ cdef nc_type xtype # convert dt to a numpy datatype object # and make sure the isalignedstruct flag is set to True # (so padding is added to the fields to match what a # C compiler would output for a similar C-struct). # This is needed because nc_get_vara is # apparently expecting the data buffer to include # padding to match what a C struct would have. # (this may or may not be still true, but empirical # evidence suggests that segfaults occur if this # alignment step is skipped - see issue #705). # numpy string subdtypes (i.e. 'S80') are # automatically converted to character array # subtypes (i.e. ('S1',80)). If '_Encoding' # variable attribute is set, data will be converted # to and from the string array representation with views. dt = _set_alignment(numpy.dtype(dt)) # create a view datatype for converting char arrays to/from strings dtview = _set_viewdtype(numpy.dtype(dt)) if 'typeid' in kwargs: xtype = kwargs['typeid'] else: xtype = _def_compound(grp, dt, dtype_name) self._nc_type = xtype self.dtype = dt self.dtype_view = dtview self.name = dtype_name def __repr__(self): return self.__unicode__() def __unicode__(self): return "%r: name = '%s', numpy dtype = %s" %\ (type(self), self.name, self.dtype) def __reduce__(self): # raise error is user tries to pickle a CompoundType object. raise NotImplementedError('CompoundType is not picklable') def _set_alignment(dt): # recursively set alignment flag in nested structured data type names = dt.names; formats = [] for name in names: fmt = dt.fields[name][0] if fmt.kind == 'V': if fmt.shape == (): dtx = _set_alignment(dt.fields[name][0]) else: if fmt.subdtype[0].kind == 'V': # structured dtype raise TypeError('nested structured dtype arrays not supported') else: dtx = dt.fields[name][0] else: # convert character string elements to char arrays if fmt.kind == 'S' and fmt.itemsize != 1: dtx = numpy.dtype('(%s,)S1' % fmt.itemsize) else: # primitive data type dtx = dt.fields[name][0] formats.append(dtx) # leave out offsets, they will be re-computed to preserve alignment. dtype_dict = {'names':names,'formats':formats} return numpy.dtype(dtype_dict, align=True) def _set_viewdtype(dt): # recursively change character array dtypes to string dtypes names = dt.names; formats = [] for name in names: fmt = dt.fields[name][0] if fmt.kind == 'V': if fmt.shape == (): dtx = _set_viewdtype(dt.fields[name][0]) else: if fmt.subdtype[0].kind == 'V': # structured dtype raise TypeError('nested structured dtype arrays not supported') elif fmt.subdtype[0].kind == 'S' and len(dt.fields[name][0].shape) == 1: lenchar = dt.fields[name][0].shape[0] dtx = numpy.dtype('S%s' % lenchar) else: dtx = dt.fields[name][0] else: # primitive data type dtx = dt.fields[name][0] formats.append(dtx) dtype_dict = {'names':names,'formats':formats} return numpy.dtype(dtype_dict, align=True) cdef _def_compound(grp, object dt, object dtype_name): # private function used to construct a netcdf compound data type # from a numpy dtype object by CompoundType.__init__. cdef nc_type xtype, xtype_tmp cdef int ierr, ndims cdef size_t offset, size cdef char *namstring cdef char *nested_namstring cdef int *dim_sizes bytestr = _strencode(dtype_name) namstring = bytestr size = dt.itemsize ierr = nc_def_compound(grp._grpid, size, namstring, &xtype) _ensure_nc_success(ierr) names = list(dt.fields.keys()) formats = [v[0] for v in dt.fields.values()] offsets = [v[1] for v in dt.fields.values()] # make sure entries in lists sorted by offset. # (don't know why this is necessary, but it is for version 4.0.1) names = _sortbylist(names, offsets) formats = _sortbylist(formats, offsets) offsets.sort() for name, format, offset in zip(names, formats, offsets): bytestr = _strencode(name) namstring = bytestr if format.kind != 'V': # scalar primitive type try: xtype_tmp = _nptonctype[format.str[1:]] except KeyError: raise ValueError('Unsupported compound type element') ierr = nc_insert_compound(grp._grpid, xtype, namstring, offset, xtype_tmp) _ensure_nc_success(ierr) else: if format.shape == (): # nested scalar compound type # find this compound type in this group or it's parents. xtype_tmp = _find_cmptype(grp, format) bytestr = _strencode(name) nested_namstring = bytestr ierr = nc_insert_compound(grp._grpid, xtype,\ nested_namstring,\ offset, xtype_tmp) _ensure_nc_success(ierr) else: # nested array compound element ndims = len(format.shape) dim_sizes = malloc(sizeof(int) * ndims) for n from 0 <= n < ndims: dim_sizes[n] = format.shape[n] if format.subdtype[0].kind != 'V': # primitive type. try: xtype_tmp = _nptonctype[format.subdtype[0].str[1:]] except KeyError: raise ValueError('Unsupported compound type element') ierr = nc_insert_array_compound(grp._grpid,xtype,namstring, offset,xtype_tmp,ndims,dim_sizes) _ensure_nc_success(ierr) else: # nested array compound type. raise TypeError('nested structured dtype arrays not supported') # this code is untested and probably does not work, disable # for now... # # find this compound type in this group or it's parents. # xtype_tmp = _find_cmptype(grp, format.subdtype[0]) # bytestr = _strencode(name) # nested_namstring = bytestr # ierr = nc_insert_array_compound(grp._grpid,xtype,\ # nested_namstring,\ # offset,xtype_tmp,\ # ndims,dim_sizes) # _ensure_nc_success(ierr) free(dim_sizes) return xtype cdef _find_cmptype(grp, dtype): # look for data type in this group and it's parents. # return datatype id when found, if not found, raise exception. cdef nc_type xtype match = False for cmpname, cmpdt in grp.cmptypes.items(): xtype = cmpdt._nc_type names1 = dtype.fields.keys() names2 = cmpdt.dtype.fields.keys() formats1 = [v[0] for v in dtype.fields.values()] formats2 = [v[0] for v in cmpdt.dtype.fields.values()] formats2v = [v[0] for v in cmpdt.dtype_view.fields.values()] # match names, formats, but not offsets (they may be changed # by netcdf lib). if names1==names2 and formats1==formats2 or (formats1 == formats2v): match = True break if not match: try: parent_grp = grp.parent except AttributeError: raise ValueError("cannot find compound type in this group or parent groups") if parent_grp is None: raise ValueError("cannot find compound type in this group or parent groups") else: xtype = _find_cmptype(parent_grp,dtype) return xtype cdef _read_compound(group, nc_type xtype, endian=None): # read a compound data type id from an existing file, # construct a corresponding numpy dtype instance, # then use that to create a CompoundType instance. # called by _get_vars, _get_types and _get_att. # Calls itself recursively for nested compound types. cdef int ierr, nf, numdims, ndim, classp, _grpid cdef size_t nfields, offset cdef nc_type field_typeid cdef int *dim_sizes cdef char field_namstring[NC_MAX_NAME+1] cdef char cmp_namstring[NC_MAX_NAME+1] # get name and number of fields. _grpid = group._grpid with nogil: ierr = nc_inq_compound(_grpid, xtype, cmp_namstring, NULL, &nfields) _ensure_nc_success(ierr) name = cmp_namstring.decode('utf-8') # loop over fields. names = [] formats = [] offsets = [] for nf from 0 <= nf < nfields: with nogil: ierr = nc_inq_compound_field(_grpid, xtype, nf, field_namstring, &offset, &field_typeid, &numdims, NULL) _ensure_nc_success(ierr) dim_sizes = malloc(sizeof(int) * numdims) with nogil: ierr = nc_inq_compound_field(_grpid, xtype, nf, field_namstring, &offset, &field_typeid, &numdims, dim_sizes) _ensure_nc_success(ierr) field_name = field_namstring.decode('utf-8') names.append(field_name) offsets.append(offset) # if numdims=0, not an array. field_shape = () if numdims != 0: for ndim from 0 <= ndim < numdims: field_shape = field_shape + (dim_sizes[ndim],) free(dim_sizes) # check to see if this field is a nested compound type. try: field_type = _nctonptype[field_typeid] if endian is not None: format = endian + format except KeyError: with nogil: ierr = nc_inq_user_type(_grpid, field_typeid,NULL,NULL,NULL,NULL,&classp) if classp == NC_COMPOUND: # a compound type # recursively call this function? field_type = _read_compound(group, field_typeid, endian=endian) else: raise KeyError('compound field of an unsupported data type') if field_shape != (): formats.append((field_type,field_shape)) else: formats.append(field_type) # make sure entries in lists sorted by offset. names = _sortbylist(names, offsets) formats = _sortbylist(formats, offsets) offsets.sort() # create a dict that can be converted into a numpy dtype. dtype_dict = {'names':names,'formats':formats,'offsets':offsets} return CompoundType(group, dtype_dict, name, typeid=xtype) # VLEN datatype support. cdef class VLType: """ A `VLType` instance is used to describe a variable length (VLEN) data type, and can be passed to the the `Dataset.createVariable` method of a `Dataset` or `Group` instance. See `VLType.__init__` for more details. The instance variables `dtype` and `name` should not be modified by the user. """ cdef public nc_type _nc_type cdef public dtype, name def __init__(self, grp, object dt, object dtype_name, **kwargs): """ **`__init__(group, datatype, datatype_name)`** VLType constructor. **`group`**: `Group` instance to associate with the VLEN datatype. **`datatype`**: An numpy dtype object describing the component type for the variable length array. **`datatype_name`**: a Python string containing a description of the VLEN data type. ***`Note`***: `VLType` instances should be created using the `Dataset.createVLType` method of a `Dataset` or `Group` instance, not using this class directly. """ cdef nc_type xtype if 'typeid' in kwargs: xtype = kwargs['typeid'] else: xtype, dt = _def_vlen(grp, dt, dtype_name) self._nc_type = xtype self.dtype = dt if dt == str: self.name = None else: self.name = dtype_name def __repr__(self): return self.__unicode__() def __unicode__(self): if self.dtype == str: return '%r: string type' % (type(self),) else: return "%r: name = '%s', numpy dtype = %s" %\ (type(self), self.name, self.dtype) def __reduce__(self): # raise error is user tries to pickle a VLType object. raise NotImplementedError('VLType is not picklable') cdef _def_vlen(grp, object dt, object dtype_name): # private function used to construct a netcdf VLEN data type # from a numpy dtype object or python str object by VLType.__init__. cdef nc_type xtype, xtype_tmp cdef int ierr, ndims cdef size_t offset, size cdef char *namstring cdef char *nested_namstring if dt == str: # python string, use NC_STRING xtype = NC_STRING # dtype_name ignored else: # numpy datatype bytestr = _strencode(dtype_name) namstring = bytestr dt = numpy.dtype(dt) # convert to numpy datatype. if dt.str[1:] in _supportedtypes: # find netCDF primitive data type corresponding to # specified numpy data type. xtype_tmp = _nptonctype[dt.str[1:]] ierr = nc_def_vlen(grp._grpid, namstring, xtype_tmp, &xtype); _ensure_nc_success(ierr) else: raise KeyError("unsupported datatype specified for VLEN") return xtype, dt cdef _read_vlen(group, nc_type xtype, endian=None): # read a VLEN data type id from an existing file, # construct a corresponding numpy dtype instance, # then use that to create a VLType instance. # called by _get_types, _get_vars. cdef int ierr, _grpid cdef size_t vlsize cdef nc_type base_xtype cdef char vl_namstring[NC_MAX_NAME+1] _grpid = group._grpid if xtype == NC_STRING: dt = str name = None else: with nogil: ierr = nc_inq_vlen(_grpid, xtype, vl_namstring, &vlsize, &base_xtype) _ensure_nc_success(ierr) name = vl_namstring.decode('utf-8') try: datatype = _nctonptype[base_xtype] if endian is not None: datatype = endian + datatype dt = numpy.dtype(datatype) # see if it is a primitive type except KeyError: raise KeyError("unsupported component type for VLEN") return VLType(group, dt, name, typeid=xtype) # Enum datatype support. cdef class EnumType: """ A `EnumType` instance is used to describe an Enum data type, and can be passed to the the `Dataset.createVariable` method of a `Dataset` or `Group` instance. See `EnumType.__init__` for more details. The instance variables `dtype`, `name` and `enum_dict` should not be modified by the user. """ cdef public nc_type _nc_type cdef public dtype, name, enum_dict def __init__(self, grp, object dt, object dtype_name, object enum_dict, **kwargs): """ **`__init__(group, datatype, datatype_name, enum_dict)`** EnumType constructor. **`group`**: `Group` instance to associate with the VLEN datatype. **`datatype`**: An numpy integer dtype object describing the base type for the Enum. **`datatype_name`**: a Python string containing a description of the Enum data type. **`enum_dict`**: a Python dictionary containing the Enum field/value pairs. ***`Note`***: `EnumType` instances should be created using the `Dataset.createEnumType` method of a `Dataset` or `Group` instance, not using this class directly. """ cdef nc_type xtype if 'typeid' in kwargs: xtype = kwargs['typeid'] else: xtype, dt = _def_enum(grp, dt, dtype_name, enum_dict) self._nc_type = xtype self.dtype = dt self.name = dtype_name self.enum_dict = enum_dict def __repr__(self): return self.__unicode__() def __unicode__(self): return "%r: name = '%s', numpy dtype = %s, fields/values =%s" %\ (type(self), self.name, self.dtype, self.enum_dict) def __reduce__(self): # raise error is user tries to pickle a EnumType object. raise NotImplementedError('EnumType is not picklable') cdef _def_enum(grp, object dt, object dtype_name, object enum_dict): # private function used to construct a netCDF Enum data type # from a numpy dtype object or python str object by EnumType.__init__. cdef nc_type xtype, xtype_tmp cdef int ierr cdef char *namstring cdef ndarray value_arr bytestr = _strencode(dtype_name) namstring = bytestr dt = numpy.dtype(dt) # convert to numpy datatype. if dt.str[1:] in _intnptonctype.keys(): # find netCDF primitive data type corresponding to # specified numpy data type. xtype_tmp = _intnptonctype[dt.str[1:]] ierr = nc_def_enum(grp._grpid, xtype_tmp, namstring, &xtype); _ensure_nc_success(ierr) else: msg="unsupported datatype specified for ENUM (must be integer)" raise KeyError(msg) # insert named members into enum type. for field in enum_dict: value_arr = numpy.array(enum_dict[field],dt) bytestr = _strencode(field) namstring = bytestr ierr = nc_insert_enum(grp._grpid, xtype, namstring, PyArray_DATA(value_arr)) _ensure_nc_success(ierr) return xtype, dt cdef _read_enum(group, nc_type xtype, endian=None): # read a Enum data type id from an existing file, # construct a corresponding numpy dtype instance, # then use that to create a EnumType instance. # called by _get_types, _get_vars. cdef int ierr, _grpid, nmem cdef ndarray enum_val cdef nc_type base_xtype cdef char enum_namstring[NC_MAX_NAME+1] cdef size_t nmembers _grpid = group._grpid # get name, datatype, and number of members. with nogil: ierr = nc_inq_enum(_grpid, xtype, enum_namstring, &base_xtype, NULL,\ &nmembers) _ensure_nc_success(ierr) enum_name = enum_namstring.decode('utf-8') try: datatype = _nctonptype[base_xtype] if endian is not None: datatype = endian + datatype dt = numpy.dtype(datatype) # see if it is a primitive type except KeyError: raise KeyError("unsupported component type for ENUM") # loop over members, build dict. enum_dict = {} enum_val = numpy.empty(1,dt) for nmem from 0 <= nmem < nmembers: with nogil: ierr = nc_inq_enum_member(_grpid, xtype, nmem, \ enum_namstring,PyArray_DATA(enum_val)) _ensure_nc_success(ierr) name = enum_namstring.decode('utf-8') enum_dict[name] = enum_val.item() return EnumType(group, dt, enum_name, enum_dict, typeid=xtype) cdef _strencode(pystr,encoding=None): # encode a string into bytes. If already bytes, do nothing. # uses 'utf-8' for default encoding. if encoding is None: encoding = 'utf-8' try: return pystr.encode(encoding) except (AttributeError, UnicodeDecodeError): return pystr # already bytes or unicode? def _to_ascii(bytestr): # encode a byte string to an ascii encoded string. return str(bytestr,encoding='ascii') def stringtoarr(string,NUMCHARS,dtype='S'): """ **`stringtoarr(a, NUMCHARS,dtype='S')`** convert a string to a character array of length `NUMCHARS` **`a`**: Input python string. **`NUMCHARS`**: number of characters used to represent string (if len(a) < `NUMCHARS`, it will be padded on the right with blanks). **`dtype`**: type of numpy array to return. Default is `'S'`, which means an array of dtype `'S1'` will be returned. If dtype=`'U'`, a unicode array (dtype = `'U1'`) will be returned. returns a rank 1 numpy character array of length NUMCHARS with datatype `'S1'` (default) or `'U1'` (if dtype=`'U'`)""" if dtype not in ["S","U"]: raise ValueError("dtype must string or unicode ('S' or 'U')") arr = numpy.zeros(NUMCHARS,dtype+'1') arr[0:len(string)] = tuple(string) return arr def stringtochar(a,encoding='utf-8'): """ **`stringtochar(a,encoding='utf-8')`** convert a string array to a character array with one extra dimension **`a`**: Input numpy string array with numpy datatype `'SN'` or `'UN'`, where N is the number of characters in each string. Will be converted to an array of characters (datatype `'S1'` or `'U1'`) of shape `a.shape + (N,)`. optional kwarg `encoding` can be used to specify character encoding (default `utf-8`). If `encoding` is 'none' or 'bytes', a `numpy.string_` the input array is treated a raw byte strings (`numpy.string_`). returns a numpy character array with datatype `'S1'` or `'U1'` and shape `a.shape + (N,)`, where N is the length of each string in a.""" dtype = a.dtype.kind if dtype not in ["S","U"]: raise ValueError("type must string or unicode ('S' or 'U')") if encoding in ['none','None','bytes']: b = numpy.array(tuple(a.tobytes()),'S1') else: b = numpy.array(tuple(a.tobytes().decode(encoding)),dtype+'1') b.shape = a.shape + (a.itemsize,) return b def chartostring(b,encoding='utf-8'): """ **`chartostring(b,encoding='utf-8')`** convert a character array to a string array with one less dimension. **`b`**: Input character array (numpy datatype `'S1'` or `'U1'`). Will be converted to a array of strings, where each string has a fixed length of `b.shape[-1]` characters. optional kwarg `encoding` can be used to specify character encoding (default `utf-8`). If `encoding` is 'none' or 'bytes', a `numpy.string_` btye array is returned. returns a numpy string array with datatype `'UN'` (or `'SN'`) and shape `b.shape[:-1]` where where `N=b.shape[-1]`.""" dtype = b.dtype.kind if dtype not in ["S","U"]: raise ValueError("type must be string or unicode ('S' or 'U')") if encoding in ['none','None','bytes']: bs = b.tobytes() else: bs = b.tobytes().decode(encoding) slen = int(b.shape[-1]) if encoding in ['none','None','bytes']: a = numpy.array([bs[n1:n1+slen] for n1 in range(0,len(bs),slen)],'S'+repr(slen)) else: a = numpy.array([bs[n1:n1+slen] for n1 in range(0,len(bs),slen)],'U'+repr(slen)) a.shape = b.shape[:-1] return a class MFDataset(Dataset): """ Class for reading multi-file netCDF Datasets, making variables spanning multiple files appear as if they were in one file. Datasets must be in `NETCDF4_CLASSIC, NETCDF3_CLASSIC, NETCDF3_64BIT_OFFSET or NETCDF3_64BIT_DATA` format (`NETCDF4` Datasets won't work). Adapted from [pycdf](http://pysclint.sourceforge.net/pycdf) by Andre Gosselin. Example usage (See `MFDataset.__init__` for more details): ```python >>> import numpy as np >>> # create a series of netCDF files with a variable sharing >>> # the same unlimited dimension. >>> for nf in range(10): ... with Dataset("mftest%s.nc" % nf, "w", format='NETCDF4_CLASSIC') as f: ... f.createDimension("x",None) ... x = f.createVariable("x","i",("x",)) ... x[0:10] = np.arange(nf*10,10*(nf+1)) >>> # now read all those files in at once, in one Dataset. >>> f = MFDataset("mftest*nc") >>> print(f.variables["x"][:]) [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99] ``` """ def __init__(self, files, check=False, aggdim=None, exclude=[], master_file=None): """ **`__init__(self, files, check=False, aggdim=None, exclude=[], master_file=None)`** Open a Dataset spanning multiple files, making it look as if it was a single file. Variables in the list of files that share the same dimension (specified with the keyword `aggdim`) are aggregated. If `aggdim` is not specified, the unlimited is aggregated. Currently, `aggdim` must be the leftmost (slowest varying) dimension of each of the variables to be aggregated. **`files`**: either a sequence of netCDF files or a string with a wildcard (converted to a sorted list of files using glob) If the `master_file` kwarg is not specified, the first file in the list will become the "master" file, defining all the variables with an aggregation dimension which may span subsequent files. Attribute access returns attributes only from "master" file. The files are always opened in read-only mode. **`check`**: True if you want to do consistency checking to ensure the correct variables structure for all of the netcdf files. Checking makes the initialization of the MFDataset instance much slower. Default is False. **`aggdim`**: The name of the dimension to aggregate over (must be the leftmost dimension of each of the variables to be aggregated). If None (default), aggregate over the unlimited dimension. **`exclude`**: A list of variable names to exclude from aggregation. Default is an empty list. **`master_file`**: file to use as "master file", defining all the variables with an aggregation dimension and all global attributes. """ # Open the master file in the base class, so that the CDFMF instance # can be used like a CDF instance. if isinstance(files, str): if files.startswith('http'): msg='cannot using file globbing for remote (OPeNDAP) datasets' raise ValueError(msg) else: files = sorted(glob(files)) if not files: msg='no files specified (file list is empty)' raise IOError(msg) if master_file is not None: if master_file not in files: raise ValueError('master_file not in files list') else: master = master_file else: master = files[0] # Open the master again, this time as a classic CDF instance. This will avoid # calling methods of the CDFMF subclass when querying the master file. cdfm = Dataset(master) # copy attributes from master. for name, value in cdfm.__dict__.items(): self.__dict__[name] = value # Make sure the master defines a dim with name aggdim, # or an unlimited dimension. aggDimId = None for dimname,dim in cdfm.dimensions.items(): if aggdim is None: if dim.isunlimited(): aggDimId = dim aggDimName = dimname else: if dimname == aggdim: aggDimId = dim aggDimName = dimname if aggDimId is None: raise IOError("master dataset %s does not have a aggregation dimension" % master) # Get info on all aggregation variables defined in the master. # Make sure the master defines at least one aggregation variable. masterRecVar = {} for vName,v in cdfm.variables.items(): # skip variables specified in exclude list. if vName in exclude: continue dims = v.dimensions shape = v.shape dtype = v.dtype # Be careful: we may deal with a scalar (dimensionless) variable. # Unlimited dimension always occupies index 0. if (len(dims) > 0 and aggDimName == dims[0]): masterRecVar[vName] = (dims, shape, dtype) if len(masterRecVar) == 0: raise IOError("master dataset %s does not have any variables to aggregate" % master) # Create the following: # cdf list of Dataset instances # cdfVLen list unlimited dimension lengths in each CDF instance # cdfRecVar dictionary indexed by the aggregation var names; each key holds # a list of the corresponding Variable instance, one for each # cdf file of the file set cdf = [] self._cdf = cdf # Store this now, because dim() method needs it cdfVLen = [] cdfRecVar = {} # Open each remaining file in read-only mode. # Make sure each file defines the same aggregation variables as the master # and that the variables are defined in the same way (name, shape and type) for f in files: if f == master: part = cdfm else: part = Dataset(f) if cdfRecVar == {}: empty_cdfRecVar = True else: empty_cdfRecVar = False varInfo = part.variables for v in masterRecVar.keys(): if check: # Make sure master rec var is also defined here. if v not in varInfo.keys(): raise IOError("aggregation variable %s not defined in %s" % (v, f)) #if not vInst.dimensions[0] != aggDimName: masterDims, masterShape, masterType = masterRecVar[v][:3] extDims = varInfo[v].dimensions extShape = varInfo[v].shape extType = varInfo[v].dtype # Check that dimension names are identical. if masterDims != extDims: raise IOError("variable %s : dimensions mismatch between " "master %s (%s) and extension %s (%s)" % (v, master, masterDims, f, extDims)) # Check that the ranks are identical, and the dimension lengths are # identical (except for that of the unlimited dimension, which of # course may vary. if len(masterShape) != len(extShape): raise IOError("variable %s : rank mismatch between " "master %s (%s) and extension %s (%s)" % (v, master, len(masterShape), f, len(extShape))) if masterShape[1:] != extShape[1:]: raise IOError("variable %s : shape mismatch between " "master %s (%s) and extension %s (%s)" % (v, master, masterShape, f, extShape)) # Check that the data types are identical. if masterType != extType: raise IOError("variable %s : data type mismatch between " "master %s (%s) and extension %s (%s)" % (v, master, masterType, f, extType)) # Everything ok. if empty_cdfRecVar: cdfRecVar[v] = [part.variables[v]] else: cdfRecVar[v].append(part.variables[v]) else: # No making sure of anything -- assume this is ok.. if empty_cdfRecVar: cdfRecVar[v] = [part.variables[v]] else: cdfRecVar[v].append(part.variables[v]) cdf.append(part) cdfVLen.append(len(part.dimensions[aggDimName])) # Attach attributes to the MFDataset instance. # A local __setattr__() method is required for them. self._files = files # list of cdf file names in the set self._cdfVLen = cdfVLen # list of unlimited lengths self._cdfTLen = sum(cdfVLen) # total length self._cdfRecVar = cdfRecVar # dictionary of Variable instances for all # the aggregation variables self._dims = cdfm.dimensions self._grps = cdfm.groups for dimname, dim in self._dims.items(): if dimname == aggDimName: self._dims[dimname] = _Dimension(dimname, dim, self._cdfVLen, self._cdfTLen) self._vars = cdfm.variables for varname,var in self._vars.items(): if varname in self._cdfRecVar.keys(): self._vars[varname] = _Variable(self, varname, var, aggDimName) self._file_format = [] self._data_model = [] self._disk_format = [] for dset in self._cdf: if dset.file_format == 'NETCDF4' or dset.data_model == 'NETCDF4': raise ValueError('MFNetCDF4 only works with NETCDF3_* and NETCDF4_CLASSIC formatted files, not NETCDF4') self._file_format.append(dset.file_format) self._data_model.append(dset.data_model) self._disk_format.append(dset.disk_format) self._path = '/' def __setattr__(self, name, value): """override base class attribute creation""" self.__dict__[name] = value def __getattribute__(self, name): if name in ['variables','dimensions','file_format','groups',\ 'data_model','disk_format','path']: if name == 'dimensions': return self._dims if name == 'variables': return self._vars if name == 'file_format': return self._file_format if name == 'data_model': return self._data_model if name == 'disk_format': return self._disk_format if name == 'path': return self._path if name == 'groups': return self._grps else: return Dataset.__getattribute__(self, name) def ncattrs(self): """ **`ncattrs(self)`** return the netcdf attribute names from the master file. """ return self._cdf[0].__dict__.keys() def close(self): """ **`close(self)`** close all the open files. """ for dset in self._cdf: dset.close() def __repr__(self): ncdump = [repr(type(self))] dimnames = tuple(str(dimname) for dimname in self.dimensions.keys()) varnames = tuple(str(varname) for varname in self.variables.keys()) grpnames = () if self.path == '/': ncdump.append('root group (%s data model, file format %s):' % (self.data_model[0], self.disk_format[0])) else: ncdump.append('group %s:' % self.path) for name in self.ncattrs(): ncdump.append(' %s: %s' % (name, self.__dict__[name])) ncdump.append(' dimensions = %s' % str(dimnames)) ncdump.append(' variables = %s' % str(varnames)) ncdump.append(' groups = %s' % str(grpnames)) return '\n'.join(ncdump) def __reduce__(self): # raise error is user tries to pickle a MFDataset object. raise NotImplementedError('MFDataset is not picklable') class _Dimension: def __init__(self, dimname, dim, dimlens, dimtotlen): self.dimlens = dimlens self.dimtotlen = dimtotlen self._name = dimname def __len__(self): return self.dimtotlen def isunlimited(self): return True def __repr__(self): if self.isunlimited(): return "%r (unlimited): name = '%s', size = %s" %\ (type(self), self._name, len(self)) else: return "%r: name = '%s', size = %s" %\ (type(self), self._name, len(self)) class _Variable: def __init__(self, dset, varname, var, recdimname): self.dimensions = var.dimensions self._dset = dset self._grp = dset self._mastervar = var self._recVar = dset._cdfRecVar[varname] self._recdimname = recdimname self._recLen = dset._cdfVLen self.dtype = var.dtype self._name = var._name # copy attributes from master. for name, value in var.__dict__.items(): self.__dict__[name] = value def typecode(self): return self.dtype def ncattrs(self): return self._mastervar.__dict__.keys() def __getattr__(self,name): if name == 'shape': return self._shape() if name == 'ndim': return len(self._shape()) try: return self.__dict__[name] except: raise AttributeError(name) def __repr__(self): ncdump = [repr(type(self))] dimnames = tuple(str(dimname) for dimname in self.dimensions) ncdump.append('%s %s%s' % (self.dtype, self._name, dimnames)) for name in self.ncattrs(): ncdump.append(' %s: %s' % (name, self.__dict__[name])) unlimdims = [] for dimname in self.dimensions: dim = _find_dim(self._grp, dimname) if dim.isunlimited(): unlimdims.append(str(dimname)) ncdump.append('unlimited dimensions = %r' % (tuple(unlimdims),)) ncdump.append('current size = %r' % (self.shape,)) return '\n'.join(ncdump) def __len__(self): if not self._shape: raise TypeError('len() of unsized object') else: return self._shape()[0] def _shape(self): recdimlen = len(self._dset.dimensions[self._recdimname]) return (recdimlen,) + self._mastervar.shape[1:] def set_auto_chartostring(self,val): for v in self._recVar: v.set_auto_chartostring(val) def set_auto_maskandscale(self,val): for v in self._recVar: v.set_auto_maskandscale(val) def set_auto_mask(self,val): for v in self._recVar: v.set_auto_mask(val) def set_auto_scale(self,val): for v in self._recVar: v.set_auto_scale(val) def set_always_mask(self,val): for v in self._recVar: v.set_always_mask(val) def __getitem__(self, elem): """Get records from a concatenated set of variables.""" # This special method is used to index the netCDF variable # using the "extended slice syntax". The extended slice syntax # is a perfect match for the "start", "count" and "stride" # arguments to the nc_get_var() function, and is much more easy # to use. start, count, stride, put_ind =\ _StartCountStride(elem, self.shape) datashape = _out_array_shape(count) data = ma.empty(datashape, dtype=self.dtype) # Determine which dimensions need to be squeezed # (those for which elem is an integer scalar). # The convention used is that for those cases, # put_ind for this dimension is set to -1 by _StartCountStride. squeeze = data.ndim * [slice(None),] for i,n in enumerate(put_ind.shape[:-1]): if n == 1 and put_ind[...,i].ravel()[0] == -1: squeeze[i] = 0 # Reshape the arrays so we can iterate over them. strt = start.reshape((-1, self.ndim or 1)) cnt = count.reshape((-1, self.ndim or 1)) strd = stride.reshape((-1, self.ndim or 1)) put_ind = put_ind.reshape((-1, self.ndim or 1)) # Fill output array with data chunks. # Number of variables making up the MFVariable.Variable. nv = len(self._recLen) for (start,count,stride,ind) in zip(strt, cnt, strd, put_ind): # make sure count=-1 becomes count=1 count = [abs(cnt) for cnt in count] if (numpy.array(stride) < 0).any(): raise IndexError('negative strides not allowed when slicing MFVariable Variable instance') # Start, stop and step along 1st dimension, eg the unlimited # dimension. sta = start[0] step = stride[0] stop = sta + count[0] * step # Build a list representing the concatenated list of all records in # the MFVariable variable set. The list is composed of 2-elem lists # each holding: # the record index inside the variables, from 0 to n # the index of the Variable instance to which each record belongs idx = [] # list of record indices vid = [] # list of Variable indices for n in range(nv): k = self._recLen[n] # number of records in this variable idx.extend(range(k)) vid.extend([n] * k) # Merge the two lists to get a list of 2-elem lists. # Slice this list along the first dimension. lst = list(zip(idx, vid)).__getitem__(slice(sta, stop, step)) # Rebuild the slicing expression for dimensions 1 and ssq. newSlice = [slice(None, None, None)] for n in range(1, len(start)): # skip dimension 0 s = slice(start[n],start[n] + count[n] * stride[n], stride[n]) newSlice.append(s) # Apply the slicing expression to each var in turn, extracting records # in a list of arrays. lstArr = [] ismasked = False for n in range(nv): # Get the list of indices for variable 'n'. idx = [i for i,numv in lst if numv == n] if idx: # Rebuild slicing expression for dimension 0. newSlice[0] = slice(idx[0], idx[-1] + 1, step) # Extract records from the var, and append them to a list # of arrays. dat = Variable.__getitem__(self._recVar[n],tuple(newSlice)) if ma.isMA(dat) and not ismasked: ismasked=True fill_value = dat.fill_value lstArr.append(dat) if ismasked: lstArr = ma.concatenate(lstArr) else: lstArr = numpy.concatenate(lstArr) if lstArr.dtype != data.dtype: data = data.astype(lstArr.dtype) # sometimes there are legitimate singleton dimensions, in which # case the array shapes won't conform. If so, a ValueError will # result, and no squeeze will be done. try: data[tuple(ind)] = lstArr.squeeze() except ValueError: data[tuple(ind)] = lstArr # Remove extra singleton dimensions. data = data[tuple(squeeze)] # if no masked elements, return numpy array. if ma.isMA(data) and not data.mask.any(): data = data.filled() return data class MFTime(_Variable): """ Class providing an interface to a MFDataset time Variable by imposing a unique common time unit and/or calendar to all files. Example usage (See `MFTime.__init__` for more details): ```python >>> import numpy as np >>> f1 = Dataset("mftest_1.nc","w", format="NETCDF4_CLASSIC") >>> f2 = Dataset("mftest_2.nc","w", format="NETCDF4_CLASSIC") >>> f1.createDimension("time",None) >>> f2.createDimension("time",None) >>> t1 = f1.createVariable("time","i",("time",)) >>> t2 = f2.createVariable("time","i",("time",)) >>> t1.units = "days since 2000-01-01" >>> t2.units = "days since 2000-02-01" >>> t1.calendar = "standard" >>> t2.calendar = "standard" >>> t1[:] = np.arange(31) >>> t2[:] = np.arange(30) >>> f1.close() >>> f2.close() >>> # Read the two files in at once, in one Dataset. >>> f = MFDataset("mftest_*nc") >>> t = f.variables["time"] >>> print(t.units) days since 2000-01-01 >>> print(t[32]) # The value written in the file, inconsistent with the MF time units. 1 >>> T = MFTime(t) >>> print(T[32]) 32 ``` """ def __init__(self, time, units=None, calendar=None): """ **`__init__(self, time, units=None, calendar=None)`** Create a time Variable with units consistent across a multifile dataset. **`time`**: Time variable from a `MFDataset`. **`units`**: Time units, for example, `'days since 1979-01-01'`. If `None`, use the units from the master variable. **`calendar`**: Calendar overload to use across all files, for example, `'standard'` or `'gregorian'`. If `None`, check that the calendar attribute is present on each variable and values are unique across files raising a `ValueError` otherwise. """ import datetime self.__time = time # copy attributes from master time variable. for name, value in time.__dict__.items(): self.__dict__[name] = value # Make sure calendar attribute present in all files if no default calendar # is provided. Also assert this value is the same across files. if calendar is None: calendars = [None] * len(self._recVar) for idx, t in enumerate(self._recVar): if not hasattr(t, 'calendar'): msg = 'MFTime requires that the time variable in all files ' \ 'have a calendar attribute if no default calendar is provided.' raise ValueError(msg) else: calendars[idx] = t.calendar calendars = set(calendars) if len(calendars) > 1: msg = 'MFTime requires that the same time calendar is ' \ 'used by all files if no default calendar is provided.' raise ValueError(msg) else: calendar = list(calendars)[0] # Set calendar using the default or the unique calendar value across all files. self.calendar = calendar # Override units if units is specified. self.units = units or time.units # Reference date to compute the difference between different time units. ref_date = datetime.datetime(1900,1,1) ref_num = date2num(ref_date, self.units, self.calendar) # Create delta vector: delta = ref_num(ref_date) - num(ref_date) # So that ref_num(date) = num(date) + delta self.__delta = numpy.empty(len(self), time.dtype) i0 = 0; i1 = 0 for i,v in enumerate(self._recVar): n = self._recLen[i] # Length of time vector. num = date2num(ref_date, v.units, self.calendar) i1 += n self.__delta[i0:i1] = ref_num - num i0 += n def __getitem__(self, elem): return self.__time[elem] + self.__delta[elem] netcdf4-python-1.5.8rel/src/netCDF4/utils.py000066400000000000000000001106041413751447500206030ustar00rootroot00000000000000from __future__ import print_function import sys import numpy as np from numpy import ma from numpy.lib.stride_tricks import as_strided import warnings import getopt import os try: bytes except NameError: # no bytes type in python < 2.6 bytes = str def _safecast(a,b): # check to see if array a can be safely cast # to array b. A little less picky than numpy.can_cast. try: is_safe = ((a == b) | (np.isnan(a) & np.isnan(b))).all() #is_safe = np.allclose(a, b, equal_nan=True) # numpy 1.10.0 except: try: is_safe = (a == b).all() # string arrays. except: is_safe = False return is_safe def _sortbylist(A,B): # sort one list (A) using the values from another list (B) return [A[i] for i in sorted(range(len(A)), key=B.__getitem__)] def _find_dim(grp, dimname): # find Dimension instance given group and name. # look in current group, and parents. group = grp dim = None while 1: try: dim = group.dimensions[dimname] break except: try: group = group.parent except: raise ValueError("cannot find dimension %s in this group or parent groups" % dimname) return dim def _walk_grps(topgrp): """Iterate through all (sub-) groups of topgrp, similar to os.walktree. """ yield topgrp.groups.values() for grp in topgrp.groups.values(): yield from _walk_grps(grp) def _quantize(data,least_significant_digit): """ quantize data to improve compression. data is quantized using around(scale*data)/scale, where scale is 2**bits, and bits is determined from the least_significant_digit. For example, if least_significant_digit=1, bits will be 4. """ precision = pow(10.,-least_significant_digit) exp = np.log10(precision) if exp < 0: exp = int(np.floor(exp)) else: exp = int(np.ceil(exp)) bits = np.ceil(np.log2(pow(10.,-exp))) scale = pow(2.,bits) datout = np.around(scale*data)/scale if ma.isMA(datout): datout.set_fill_value(data.fill_value) return datout else: return datout def _StartCountStride(elem, shape, dimensions=None, grp=None, datashape=None,\ put=False, use_get_vars = False): """Return start, count, stride and indices needed to store/extract data into/from a netCDF variable. This function is used to convert a slicing expression into a form that is compatible with the nc_get_vars function. Specifically, it needs to interpret integers, slices, Ellipses, and 1-d sequences of integers and booleans. Numpy uses "broadcasting indexing" to handle array-valued indices. "Broadcasting indexing" (a.k.a "fancy indexing") treats all multi-valued indices together to allow arbitrary points to be extracted. The index arrays can be multidimensional, and more than one can be specified in a slice, as long as they can be "broadcast" against each other. This style of indexing can be very powerful, but it is very hard to understand, explain, and implement (and can lead to hard to find bugs). Most other python packages and array processing languages (such as netcdf4-python, xray, biggus, matlab and fortran) use "orthogonal indexing" which only allows for 1-d index arrays and treats these arrays of indices independently along each dimension. The implementation of "orthogonal indexing" used here requires that index arrays be 1-d boolean or integer. If integer arrays are used, the index values must be sorted and contain no duplicates. In summary, slicing netcdf4-python variable objects with 1-d integer or boolean arrays is allowed, but may give a different result than slicing a numpy array. Numpy also supports slicing an array with a boolean array of the same shape. For example x[x>0] returns a 1-d array with all the positive values of x. This is also not supported in netcdf4-python, if x.ndim > 1. Orthogonal indexing can be used in to select netcdf variable slices using the dimension variables. For example, you can use v[lat>60,lon<180] to fetch the elements of v obeying conditions on latitude and longitude. Allow for this sort of simple variable subsetting is the reason we decided to deviate from numpy's slicing rules. This function is used both by the __setitem__ and __getitem__ method of the Variable class. Parameters ---------- elem : tuple of integer, slice, ellipsis or 1-d boolean or integer sequences used to slice the netCDF Variable (Variable[elem]). shape : tuple containing the current shape of the netCDF variable. dimensions : sequence The name of the dimensions. __setitem__. grp : netCDF Group The netCDF group to which the variable being set belongs to. datashape : sequence The shape of the data that is being stored. Only needed by __setitem__ put : True|False (default False). If called from __setitem__, put is True. Returns ------- start : ndarray (..., n) A starting indices array of dimension n+1. The first n dimensions identify different independent data chunks. The last dimension can be read as the starting indices. count : ndarray (..., n) An array of dimension (n+1) storing the number of elements to get. stride : ndarray (..., n) An array of dimension (n+1) storing the steps between each datum. indices : ndarray (..., n) An array storing the indices describing the location of the data chunk in the target/source array (__getitem__/__setitem__). Notes: netCDF data is accessed via the function: nc_get_vars(grpid, varid, start, count, stride, data) Assume that the variable has dimension n, then start is a n-tuple that contains the indices at the beginning of data chunk. count is a n-tuple that contains the number of elements to be accessed. stride is a n-tuple that contains the step length between each element. """ # Adapted from pycdf (http://pysclint.sourceforge.net/pycdf) # by Andre Gosselin.. # Modified by David Huard to handle efficiently fancy indexing with # sequences of integers or booleans. nDims = len(shape) if nDims == 0: nDims = 1 shape = (1,) # is there an unlimited dimension? (only defined for __setitem__) if put: hasunlim = False unlimd={} if dimensions: for i in range(nDims): dimname = dimensions[i] # is this dimension unlimited? # look in current group, and parents for dim. dim = _find_dim(grp, dimname) unlimd[dimname]=dim.isunlimited() if unlimd[dimname]: hasunlim = True else: hasunlim = False # When a single array or (non-tuple) sequence of integers is given # as a slice, assume it applies to the first dimension, # and use ellipsis for remaining dimensions. if np.iterable(elem): if type(elem) == np.ndarray or (type(elem) != tuple and \ np.array([_is_int(e) for e in elem]).all()): elem = [elem] for n in range(len(elem)+1,nDims+1): elem.append(slice(None,None,None)) else: # Convert single index to sequence elem = [elem] # ensure there is at most 1 ellipse # we cannot use elem.count(Ellipsis), as with fancy indexing would occur # np.array() == Ellipsis which gives ValueError: The truth value of an # array with more than one element is ambiguous. Use a.any() or a.all() if sum(1 for e in elem if e is Ellipsis) > 1: raise IndexError("At most one ellipsis allowed in a slicing expression") # replace boolean arrays with sequences of integers. newElem = [] IndexErrorMsg=\ "only integers, slices (`:`), ellipsis (`...`), and 1-d integer or boolean arrays are valid indices" i=0 for e in elem: # string-like object try to cast to int # needs to be done first, since strings are iterable and # hard to distinguish from something castable to an iterable numpy array. if type(e) in [str, bytes]: try: e = int(e) except: raise IndexError(IndexErrorMsg) ea = np.asarray(e) # Raise error if multidimensional indexing is used. if ea.ndim > 1: raise IndexError("Index cannot be multidimensional") # set unlim to True if dimension is unlimited and put==True # (called from __setitem__) if hasunlim and put and dimensions: try: dimname = dimensions[i] unlim = unlimd[dimname] except IndexError: # more slices than dimensions (issue 371) unlim = False else: unlim = False # convert boolean index to integer array. if np.iterable(ea) and ea.dtype.kind =='b': # check that boolean array not too long if not unlim and shape[i] != len(ea): msg=""" Boolean array must have the same shape as the data along this dimension.""" raise IndexError(msg) ea = np.flatnonzero(ea) # an iterable (non-scalar) integer array. if np.iterable(ea) and ea.dtype.kind == 'i': # convert negative indices in 1d array to positive ones. ea = np.where(ea < 0, ea + shape[i], ea) if np.any(ea < 0): raise IndexError("integer index out of range") # if unlim, let integer index be longer than current dimension # length. if ea.shape != (0,): elen = shape[i] if unlim: elen = max(ea.max()+1,elen) if ea.max()+1 > elen: msg="integer index exceeds dimension size" raise IndexError(msg) newElem.append(ea) # integer scalar elif ea.dtype.kind == 'i': newElem.append(e) # slice or ellipsis object elif type(e) == slice or type(e) == type(Ellipsis): if not use_get_vars and type(e) == slice and e.step not in [None,-1,1] and\ dimensions is not None and grp is not None: # convert strided slice to integer sequence if possible # (this will avoid nc_get_vars, which is slow - issue #680). start = e.start if e.start is not None else 0 step = e.step if e.stop is None and dimensions is not None and grp is not None: stop = len(_find_dim(grp, dimensions[i])) else: stop = e.stop if stop < 0: stop = len(_find_dim(grp, dimensions[i])) + stop try: ee = np.arange(start,stop,e.step) if len(ee) > 0: e = ee except: pass newElem.append(e) else: # castable to a scalar int, otherwise invalid try: e = int(e) newElem.append(e) except: raise IndexError(IndexErrorMsg) if type(e)==type(Ellipsis): i+=1+nDims-len(elem) else: i+=1 elem = newElem # replace Ellipsis and integer arrays with slice objects, if possible. newElem = [] for e in elem: ea = np.asarray(e) # Replace ellipsis with slices. if type(e) == type(Ellipsis): # The ellipsis stands for the missing dimensions. newElem.extend((slice(None, None, None),) * (nDims - len(elem) + 1)) # Replace sequence of indices with slice object if possible. elif np.iterable(e) and len(e) > 1: start = e[0] stop = e[-1]+1 step = e[1]-e[0] try: ee = range(start,stop,step) except ValueError: # start, stop or step is not valid for a range ee = False if ee and len(e) == len(ee) and (e == np.arange(start,stop,step)).all(): # don't convert to slice unless abs(stride) == 1 # (nc_get_vars is very slow, issue #680) if not use_get_vars and step not in [1,-1]: newElem.append(e) else: newElem.append(slice(start,stop,step)) else: newElem.append(e) elif np.iterable(e) and len(e) == 1: newElem.append(slice(e[0], e[0] + 1, 1)) else: newElem.append(e) elem = newElem # If slice doesn't cover all dims, assume ellipsis for rest of dims. if len(elem) < nDims: for n in range(len(elem)+1,nDims+1): elem.append(slice(None,None,None)) # make sure there are not too many dimensions in slice. if len(elem) > nDims: raise ValueError("slicing expression exceeds the number of dimensions of the variable") # Compute the dimensions of the start, count, stride and indices arrays. # The number of elements in the first n dimensions corresponds to the # number of times the _get method will be called. sdim = [] for i, e in enumerate(elem): # at this stage e is a slice, a scalar integer, or a 1d integer array. # integer array: _get call for each True value if np.iterable(e): sdim.append(len(e)) # Scalar int or slice, just a single _get call else: sdim.append(1) # broadcast data shape when assigned to full variable (issue #919) try: fullslice = elem.count(slice(None,None,None)) == len(elem) except: # fails if elem contains a numpy array. fullslice = False if fullslice and datashape and put and not hasunlim: datashape = broadcasted_shape(shape, datashape) # pad datashape with zeros for dimensions not being sliced (issue #906) # only used when data covers slice over subset of dimensions if datashape and len(datashape) != len(elem) and\ len(datashape) == sum(1 for e in elem if type(e) == slice): datashapenew = (); i=0 for e in elem: if type(e) != slice and not np.iterable(e): # scalar integer slice datashapenew = datashapenew + (0,) else: # slice object datashapenew = datashapenew + (datashape[i],) i+=1 datashape = datashapenew # Create the start, count, stride and indices arrays. sdim.append(max(nDims, 1)) start = np.empty(sdim, dtype=np.intp) count = np.empty(sdim, dtype=np.intp) stride = np.empty(sdim, dtype=np.intp) indices = np.empty(sdim, dtype=object) for i, e in enumerate(elem): ea = np.asarray(e) # set unlim to True if dimension is unlimited and put==True # (called from __setitem__). Note: grp and dimensions must be set. if hasunlim and put and dimensions: dimname = dimensions[i] unlim = unlimd[dimname] else: unlim = False # SLICE # if type(e) == slice: # determine length parameter for slice.indices. # shape[i] can be zero for unlim dim that hasn't been written to # yet. # length of slice may be longer than current shape # if dimension is unlimited (and we are writing, not reading). if unlim and e.stop is not None and e.stop > shape[i]: length = e.stop elif unlim and e.stop is None and datashape != (): try: if e.start is None: length = datashape[i] else: length = e.start+datashape[i] except IndexError: raise IndexError("shape of data does not conform to slice") else: if unlim and datashape == () and len(dim) == 0: # writing scalar along unlimited dimension using slicing # syntax (var[:] = 1, when var.shape = ()) length = 1 else: length = shape[i] beg, end, inc = e.indices(length) n = len(range(beg,end,inc)) start[...,i] = beg count[...,i] = n stride[...,i] = inc indices[...,i] = slice(None) # ITERABLE # elif np.iterable(e) and np.array(e).dtype.kind in 'i': # Sequence of integers start[...,i] = np.apply_along_axis(lambda x: e*x, i, np.ones(sdim[:-1])) indices[...,i] = np.apply_along_axis(lambda x: np.arange(sdim[i])*x, i, np.ones(sdim[:-1], int)) count[...,i] = 1 stride[...,i] = 1 # all that's left is SCALAR INTEGER # else: if e >= 0: start[...,i] = e elif e < 0 and (-e <= shape[i]) : start[...,i] = e+shape[i] else: raise IndexError("Index out of range") count[...,i] = 1 stride[...,i] = 1 indices[...,i] = -1 # Use -1 instead of 0 to indicate that # this dimension shall be squeezed. return start, count, stride, indices#, out_shape def _out_array_shape(count): """Return the output array shape given the count array created by getStartCountStride""" s = list(count.shape[:-1]) out = [] for i, n in enumerate(s): if n == 1: c = count[..., i].ravel()[0] # All elements should be identical. out.append(c) else: out.append(n) return out def _is_container(a): # is object container-like? (can test for # membership with "is in", but not a string) try: 1 in a except: return False if type(a) == type(basestring): return False return True def _is_int(a): try: return int(a) == a except: return False def _tostr(s): try: ss = str(s) except: ss = s return ss def _getgrp(g,p): import posixpath grps = p.split("/") for gname in grps: if gname == "": continue g = g.groups[gname] return g def ncinfo(): from netCDF4 import Dataset usage = """ Print summary information about a netCDF file. usage: %s [-h/--help] [-g grp or --group=grp] [-v var or --variable=var] [-d dim or --dimension=dim] filename -h/--help -- Print usage message. -g or --group= -- Print info for this group (default is root group). Nested groups specified using posix paths ("group1/group2/group3"). -v or --variable= -- Print info for this variable. -d or --dimension= -- Print info for this dimension. netcdf filename must be last argument. \n""" % os.path.basename(sys.argv[0]) try: opts, pargs = getopt.getopt(sys.argv[1:],'hv:g:d:', ['group=', 'variable=', 'dimension=']) except: (type, value, traceback) = sys.exc_info() sys.stdout.write("Error parsing the options. The error was: %s\n" % value) sys.stderr.write(usage) sys.exit(0) # Get the options group = None; var = None; dim=None for option in opts: if option[0] == '-h' or option[0] == '--help': sys.stderr.write(usage) sys.exit(0) elif option[0] == '--group' or option[0] == '-g': group = option[1] elif option[0] == '--variable' or option[0] == '-v': var = option[1] elif option[0] == '--dimension' or option[0] == '-d': dim = option[1] else: sys.stdout.write("%s: Unrecognized option\n" % option[0]) sys.stderr.write(usage) sys.exit(0) # filename passed as last argument try: filename = pargs[-1] except IndexError: sys.stdout.write("You need to pass netcdf filename!\n.") sys.stderr.write(usage) sys.exit(0) f = Dataset(filename) if group is None: if var is None and dim is None: print(f) else: if var is not None: print(f.variables[var]) if dim is not None: print(f.dimensions[dim]) else: if var is None and dim is None: print(_getgrp(f,group)) else: g = _getgrp(f,group) if var is not None: print(g.variables[var]) if dim is not None: print(g.dimensions[var]) f.close() def _nc4tonc3(filename4,filename3,clobber=False,nchunk=10,quiet=False,format='NETCDF3_64BIT'): """convert a netcdf 4 file (filename4) in NETCDF4_CLASSIC format to a netcdf 3 file (filename3) in NETCDF3_64BIT format.""" from netCDF4 import Dataset ncfile4 = Dataset(filename4,'r') if ncfile4.file_format != 'NETCDF4_CLASSIC': raise IOError('input file must be in NETCDF4_CLASSIC format') ncfile3 = Dataset(filename3,'w',clobber=clobber,format=format) # create dimensions. Check for unlimited dim. unlimdimname = False unlimdim = None # create global attributes. if not quiet: sys.stdout.write('copying global attributes ..\n') #for attname in ncfile4.ncattrs(): # setattr(ncfile3,attname,getattr(ncfile4,attname)) ncfile3.setncatts(ncfile4.__dict__) if not quiet: sys.stdout.write('copying dimensions ..\n') for dimname,dim in ncfile4.dimensions.items(): if dim.isunlimited(): unlimdimname = dimname unlimdim = dim ncfile3.createDimension(dimname,None) else: ncfile3.createDimension(dimname,len(dim)) # create variables. for varname,ncvar in ncfile4.variables.items(): if not quiet: sys.stdout.write('copying variable %s\n' % varname) # is there an unlimited dimension? if unlimdimname and unlimdimname in ncvar.dimensions: hasunlimdim = True else: hasunlimdim = False if hasattr(ncvar, '_FillValue'): FillValue = ncvar._FillValue else: FillValue = None var = ncfile3.createVariable(varname,ncvar.dtype,ncvar.dimensions,fill_value=FillValue) # fill variable attributes. attdict = ncvar.__dict__ if '_FillValue' in attdict: del attdict['_FillValue'] var.setncatts(attdict) #for attname in ncvar.ncattrs(): # if attname == '_FillValue': continue # setattr(var,attname,getattr(ncvar,attname)) # fill variables with data. if hasunlimdim: # has an unlim dim, loop over unlim dim index. # range to copy if nchunk: start = 0; stop = len(unlimdim); step = nchunk if step < 1: step = 1 for n in range(start, stop, step): nmax = n+nchunk if nmax > len(unlimdim): nmax=len(unlimdim) var[n:nmax] = ncvar[n:nmax] else: var[0:len(unlimdim)] = ncvar[:] else: # no unlim dim or 1-d variable, just copy all data at once. var[:] = ncvar[:] ncfile3.sync() # flush data to disk # close files. ncfile3.close() ncfile4.close() def nc4tonc3(): usage = """ Convert a netCDF 4 file (in NETCDF4_CLASSIC format) to netCDF 3 format. usage: %s [-h/--help] [-o] [--chunk] netcdf4filename netcdf3filename -h/--help -- Print usage message. -o -- Overwrite destination file (default is to raise an error if output file already exists). --quiet=(0|1) -- if 1, don't print diagnostic information. --format -- netcdf3 format to use (NETCDF3_64BIT by default, can be set to NETCDF3_CLASSIC) --chunk=(integer) -- number of records along unlimited dimension to write at once. Default 10. Ignored if there is no unlimited dimension. chunk=0 means write all the data at once. \n""" % os.path.basename(sys.argv[0]) try: opts, pargs = getopt.getopt(sys.argv[1:], 'ho', ['format=','chunk=','quiet=']) except: (type, value, traceback) = sys.exc_info() sys.stdout.write("Error parsing the options. The error was: %s\n" % value) sys.stderr.write(usage) sys.exit(0) # default options quiet = 0 chunk = 1000 format = 'NETCDF3_64BIT' overwritefile = 0 # Get the options for option in opts: if option[0] == '-h' or option[0] == '--help': sys.stderr.write(usage) sys.exit(0) elif option[0] == '-o': overwritefile = 1 elif option[0] == '--quiet': quiet = int(option[1]) elif option[0] == '--format': format = option[1] elif option[0] == '--chunk': chunk = int(option[1]) else: sys.stdout.write("%s : Unrecognized option\n" % options[0]) sys.stderr.write(usage) sys.exit(0) # if we pass a number of files different from 2, abort if len(pargs) < 2 or len(pargs) > 2: sys.stdout.write("You need to pass both source and destination!\n.") sys.stderr.write(usage) sys.exit(0) # Catch the files passed as the last arguments filename4 = pargs[0] filename3 = pargs[1] # copy the data from filename4 to filename3. _nc4tonc3(filename4,filename3,clobber=overwritefile,quiet=quiet,format=format) def _nc3tonc4(filename3,filename4,unpackshort=True, zlib=True,complevel=6,shuffle=True,fletcher32=False, clobber=False,lsd_dict=None,nchunk=10,quiet=False,classic=0, vars=None,istart=0,istop=-1): """convert a netcdf 3 file (filename3) to a netcdf 4 file The default format is 'NETCDF4', but can be set to NETCDF4_CLASSIC if classic=1. If unpackshort=True, variables stored as short integers with a scale and offset are unpacked to floats. in the netcdf 4 file. If the lsd_dict is not None, variable names corresponding to the keys of the dict will be truncated to the decimal place specified by the values of the dict. This improves compression by making it 'lossy'.. If vars is not None, only variable names in the list will be copied (plus all the dimension variables). The zlib, complevel and shuffle keywords control how the compression is done.""" from netCDF4 import Dataset ncfile3 = Dataset(filename3,'r') if classic: ncfile4 = Dataset(filename4,'w',clobber=clobber,format='NETCDF4_CLASSIC') else: ncfile4 = Dataset(filename4,'w',clobber=clobber,format='NETCDF4') mval = 1.e30 # missing value if unpackshort=True # create dimensions. Check for unlimited dim. unlimdimname = False unlimdim = None # create global attributes. if not quiet: sys.stdout.write('copying global attributes ..\n') #for attname in ncfile3.ncattrs(): # setattr(ncfile4,attname,getattr(ncfile3,attname)) ncfile4.setncatts(ncfile3.__dict__) if not quiet: sys.stdout.write('copying dimensions ..\n') for dimname,dim in ncfile3.dimensions.items(): if dim.isunlimited(): unlimdimname = dimname unlimdim = dim ncfile4.createDimension(dimname,None) if istop == -1: istop=len(unlimdim) else: ncfile4.createDimension(dimname,len(dim)) # create variables. if vars is None: varnames = ncfile3.variables.keys() else: # variables to copy specified varnames = vars # add dimension variables for dimname in ncfile3.dimensions.keys(): if dimname in ncfile3.variables.keys() and\ dimname not in varnames: varnames.append(dimname) for varname in varnames: ncvar = ncfile3.variables[varname] if not quiet: sys.stdout.write('copying variable %s\n' % varname) # quantize data? if lsd_dict is not None and varname in lsd_dict: lsd = lsd_dict[varname] if not quiet: sys.stdout.write('truncating to least_significant_digit = %d\n'%lsd) else: lsd = None # no quantization. # unpack short integers to floats? if unpackshort and hasattr(ncvar,'scale_factor') and hasattr(ncvar,'add_offset'): dounpackshort = True datatype = 'f4' else: dounpackshort = False datatype = ncvar.dtype # is there an unlimited dimension? if unlimdimname and unlimdimname in ncvar.dimensions: hasunlimdim = True else: hasunlimdim = False if dounpackshort: if not quiet: sys.stdout.write('unpacking short integers to floats ...\n') sys.stdout.write('') # is there missing value? if hasattr(ncvar, '_FillValue'): fillvalue3 = ncvar._FillValue elif hasattr(ncvar, 'missing_value'): fillvalue3 = ncvar.missing_value else: fillvalue3 = None if fillvalue3 is not None: fillvalue4 = fillvalue3 if not dounpackshort else mval else: fillvalue4 = None var = ncfile4.createVariable(varname,datatype,ncvar.dimensions, fill_value=fillvalue4, least_significant_digit=lsd,zlib=zlib,complevel=complevel,shuffle=shuffle,fletcher32=fletcher32) # fill variable attributes. attdict = ncvar.__dict__ if '_FillValue' in attdict: del attdict['_FillValue'] if dounpackshort and 'add_offset' in attdict: del attdict['add_offset'] if dounpackshort and 'scale_factor' in attdict: del attdict['scale_factor'] if dounpackshort and 'missing_value' in attdict: attdict['missing_value'] = fillvalue4 var.setncatts(attdict) # fill variables with data. if hasunlimdim: # has an unlim dim, loop over unlim dim index. # range to copy if nchunk: start = istart; stop = istop; step = nchunk if step < 1: step = 1 for n in range(start, stop, step): nmax = n+nchunk if nmax > istop: nmax=istop var[n-istart:nmax-istart] = ncvar[n:nmax] else: var[0:len(unlimdim)] = ncvar[:] else: # no unlim dim or 1-d variable, just copy all data at once. var[:] = ncvar[:] ncfile4.sync() # flush data to disk # close files. ncfile3.close() ncfile4.close() def nc3tonc4(): usage = """ Convert a netCDF 3 file to netCDF 4 format, optionally unpacking variables packed as short integers (with scale_factor and add_offset) to floats, and adding zlib compression (with the HDF5 shuffle filter and fletcher32 checksum). Data may also be quantized (truncated) to a specified precision to improve compression. usage: %s [-h/--help] [-o] [--vars=var1,var2,..] [--zlib=(0|1)] [--complevel=(1-9)] [--shuffle=(0|1)] [--fletcher32=(0|1)] [--unpackshort=(0|1)] [--quantize=var1=n1,var2=n2,..] netcdf3filename netcdf4filename -h/--help -- Print usage message. -o -- Overwrite destination file (default is to raise an error if output file already exists). --vars -- comma separated list of variable names to copy (default is to copy all variables) --classic=(0|1) -- use NETCDF4_CLASSIC format instead of NETCDF4 (default 1) --zlib=(0|1) -- Activate (or disable) zlib compression (default is activate). --complevel=(1-9) -- Set zlib compression level (6 is default). --shuffle=(0|1) -- Activate (or disable) the shuffle filter (active by default). --fletcher32=(0|1) -- Activate (or disable) the fletcher32 checksum (not active by default). --unpackshort=(0|1) -- Unpack short integer variables to float variables using scale_factor and add_offset netCDF variable attributes (active by default). --quantize=(comma separated list of "variable name=integer" pairs) -- Truncate the data in the specified variables to a given decimal precision. For example, 'speed=2, height=-2, temp=0' will cause the variable 'speed' to be truncated to a precision of 0.01, 'height' to a precision of 100 and 'temp' to 1. This can significantly improve compression. The default is not to quantize any of the variables. --quiet=(0|1) -- if 1, don't print diagnostic information. --chunk=(integer) -- number of records along unlimited dimension to write at once. Default 10. Ignored if there is no unlimited dimension. chunk=0 means write all the data at once. --istart=(integer) -- number of record to start at along unlimited dimension. Default 0. Ignored if there is no unlimited dimension. --istop=(integer) -- number of record to stop at along unlimited dimension. Default -1. Ignored if there is no unlimited dimension. \n""" % os.path.basename(sys.argv[0]) try: opts, pargs = getopt.getopt(sys.argv[1:], 'ho', ['classic=', 'vars=', 'zlib=', 'quiet=', 'complevel=', 'shuffle=', 'fletcher32=', 'unpackshort=', 'quantize=', 'chunk=', 'istart=', 'istop=']) except: (type, value, traceback) = sys.exc_info() sys.stdout.write("Error parsing the options. The error was: %s\n" % value) sys.stderr.write(usage) sys.exit(0) # default options overwritefile = 0 complevel = 6 classic = 1 zlib = 1 shuffle = 1 fletcher32 = 0 unpackshort = 1 vars = None quantize = None quiet = 0 chunk = 1000 istart = 0 istop = -1 # Get the options for option in opts: if option[0] == '-h' or option[0] == '--help': sys.stderr.write(usage) sys.exit(0) elif option[0] == '-o': overwritefile = 1 elif option[0] == '--classic': classic = int(option[1]) elif option[0] == '--zlib': zlib = int(option[1]) elif option[0] == '--quiet': quiet = int(option[1]) elif option[0] == '--complevel': complevel = int(option[1]) elif option[0] == '--shuffle': shuffle = int(option[1]) elif option[0] == '--fletcher32': fletcher32 = int(option[1]) elif option[0] == '--unpackshort': unpackshort = int(option[1]) elif option[0] == '--chunk': chunk = int(option[1]) elif option[0] == '--vars': vars = option[1] elif option[0] == '--quantize': quantize = option[1] elif option[0] == '--istart': istart = int(option[1]) elif option[0] == '--istop': istop = int(option[1]) else: sys.stdout.write("%s: Unrecognized option\n" % option[0]) sys.stderr.write(usage) sys.exit(0) # if we pass a number of files different from 2, abort if len(pargs) < 2 or len(pargs) > 2: sys.stdout.write("You need to pass both source and destination!.\n") sys.stderr.write(usage) sys.exit(0) # Catch the files passed as the last arguments filename3 = pargs[0] filename4 = pargs[1] # Parse the quantize option, create a dictionary from key/value pairs. if quantize is not None: lsd_dict = {} for p in quantize.split(','): kv = p.split('=') lsd_dict[kv[0]] = int(kv[1]) else: lsd_dict=None # Parse the vars option, create a list of variable names. if vars is not None: vars = vars.split(',') # copy the data from filename3 to filename4. _nc3tonc4(filename3,filename4,unpackshort=unpackshort, zlib=zlib,complevel=complevel,shuffle=shuffle, fletcher32=fletcher32,clobber=overwritefile,lsd_dict=lsd_dict, nchunk=chunk,quiet=quiet,vars=vars,classic=classic, istart=istart,istop=istop) def broadcasted_shape(shp1, shp2): # determine shape of array of shp1 and shp2 broadcast against one another. x = np.array([1]) # trick to define array with certain shape that doesn't allocate all the # memory. a = as_strided(x, shape=shp1, strides=[0] * len(shp1)) b = as_strided(x, shape=shp2, strides=[0] * len(shp2)) return np.broadcast(a, b).shape netcdf4-python-1.5.8rel/test/000077500000000000000000000000001413751447500160705ustar00rootroot00000000000000netcdf4-python-1.5.8rel/test/20171025_2056.Cloud_Top_Height.nc000066400000000000000000010113261413751447500231520ustar00rootroot00000000000000‰HDF  ÿÿÿÿÿÿÿÿÖ0ý´MOHDR,vúðYæùðYvúðYæùðY´"$ˇ•| ±{v5Ö\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰<ÜOHDR-vúðYvúðYvúðYvúðY,, *€ 6™6¿6ÇtX†0¯OHDR-vúðYvúðYvúðYvúðYôô *€ Çpž5Ä5Ç~è†ËÛrêRGCOLÿÿ"ÿÿ""" ÿ " ÿ " ÿÿÿÿÓ.§0§0†Ø©ÙÈ OCHK LDIMENSION_LISTç + _Netcdf4Dimid uããOCHKÿÿÿÿÿÿÿÿŸŠV`¾s4Ê GBTHD  d(o· ‡\Z‰FHIBV­FÄFÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]ÄA}ŒB4CxFSSEå6Ì4¥>²BTHDd(P "ráµFSSE]ˆì͈ųÂ+BTHD  d(¯„>Q©hFSSEC|cÅ”ÔTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ9L7Háú…N,úTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï"Í/ ú¼R,úOHDR-vúðYvúðYvúðYvúðYQ   *ð|G7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ X long_name9GOES-R fixed grid projection y-coordinate center of image :standard_nameprojection_y_coordinate unitsrad axisYyêJA =»qF NaFRHPÿÿÿÿÿÿÿÿq¯Œ (‘%é%BTHDd( ¨%í4C6*ë—xòOHDR-vúðYvúðYvúðYvúðY!  {’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +CLASSDIMENSION_SCALE?0h + _Netcdf4Dimid kd€îBTHD  d( ŠE ?FSSE¯Œq–¡I{(èE…(™EŒB8“ÙOCHK ZNAME@This is a netCDF dimension but not a netCDF variable. 2êÑ`>OHDR-vúðYvúðYvúðYvúðY!  r’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +CLASSDIMENSION_SCALE2h + _Netcdf4Dimid S³MOCHK»| + _Netcdf4Dimid ‡ØiOCHK ZNAME@This is a netCDF dimension but not a netCDF variable. 2êÑ`>OHDR-vúðYvúðYvúðYvúðYÈ ?@4 4ÿ*žG`4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ “ long_namettime variable (t) is the mid-point between the start and end image scan in seconds since epoch (2000-01-01 12:00:00) 'standard_nametime <units!seconds since 2000-01-01 12:00:00 axisT 'bounds time_boundsm¥‹üûy}ɆÁÀAFSSE©$Üa Z(BTHDd(è­PÓÓFSSE»§-Ó®R‰¶x›BTHDd(oµ —%jdf4Dimid líaOCHK77 <units!seconds since 2000-01-01 12:00:003>ŒBTHDd(¯‚'LOÖBTHDd(«q d½ºBTHD  d(Ç| Ø#³tFSSEYqÌ4òÿçFRHPÿÿÿÿÿÿÿÿÌå6 (Çlƒ°üdBTHDd(Çh 44HBTHD  d(Çj 0/¬åFSHDÌPx(uV`w“/+¢†ÁÀAôÄÏð†ÁÀAË-­=x¤¼e`I»6 $ãwwwq7â…¸ËdÜzZG£$!@pw–ÅÝeqww÷ùØ=»Ïóí‘÷œúÑUÝ]]ÝUWß~w«Õÿ÷@t%ˆÅxâ ®]û²ö÷1ˆr¥>Yw•î 3†oMùºDs_+²ž…Ù¶ªÉæùÆÞñc¬nØÎu5³o÷üÅñ½C²í‹b{{ûLïÈñ›¢¸Ñ QƉ³G3 riS<&&'ª’"3Rˆ)S¢RsRfg8¤O¿›’ŸœSGK©O­MëI¿›º/y$‰¸.9,ýbúºXþx~ôHByrrRbÜîÔYãò§eO­=À O¬D%o¶œÝßF©»[:P¡¨×Ì«|Yð6Kÿ’æ‘”TQìÏ õ‹:gàKNÏÎ[ž•=®×p¼=VÜ…¢ àqà’d”ƒ<Â6IOacdºÊUžÊ@•+‹öÁ6pt¹†Þ@ø'`'`‚ÙèMÈLb*I/Š7 'òåÂr`øx!¤3·²7òFE3€ÍòœÀ)0½„\…;áéà UB ð£è¨øñMaáÏ1€ˆŽöa›°ýH$BDÞÂ¥ÂÂ_ ~/ÏŸçÉ•q6³«™¬¶U”Êÿ+â·pßG˜HGÜ3#þ}´™D?Úc€NÕ•]²`ë!Îtc3½ÉÆùK³*+7ë^»Cfj›­!í!GýÖt‡îèÛ¾.øi€}ðP´k('%p‚*M9“ åCéQ‰ù‰†‰ý‰Ü¤‰©Zi+“¾%¿LÞ’àŸº6A?þdl@²0Õ!e\J|š4íX‹4^ò–ôê 1Ù“&ü’t%q[’v\dä·ôÍ9 ™÷о´¾æ\åIR%GDCÜ4ö8Vf«ªa\«W³¼r^±yvV*3-.Å0FæB²XÅ:š9&—eûV3ÊÖ—Î(‰®ÒúšŸ ê£/‘fð¤¼c®rWµBÉV.WNP½ãdÙ˜…ÌC©¤(µ¤NØIh@ Ä߀ÉVI@¨ÅW„Tñq¶p­ MtXt $îÀ:É%‘’w_” FÀPd}•$ƒ×€S’{¦®‚ÁðkØ S#á dl ‚³‚r‘­èŒÈ¢Á8XžÍ•ÐDI¼CG®=û7æCV6s.³ƒùµ­³m]ÛÌæWSÿŽÒÿ¾-ÆŸÂ&$ø¿Æ˜ƒ×!.¦æëí4^hxQ§ÄÒÃÂJ_טeÚk²ÂäšåE«j_±ÅcG±÷ÑX­ˆÛ1[âv‡=Œò øψßW{(âLØÂ˜G)äT­Ô´¤- EÉCÉ>)FiGÒX©ñ)·“3 2éµ)f©>iË“ RrS¶'Oþ˜ô2õvºAƼ ¹¿dOñNæ&d–f>ÎdTB튎~ÑDqfõ–Š3¸˜·ê»*ÙU·Š—äŸÌÊIåepSžÅ¬ »ïfe‘«D:¯Ì/kšßx¢®¯huáä ŸˆÒ$j° ¦ •ÒPe\÷Í®·ÊqO•K¥»Ñ¯(IfƒM–:É&*S;T× ¨ <-Ž‹@}@$Ö“X!î0…:¥uRKL%""Xi‘Ä#0bÀbÑM±§h)p Zêù‹ù{Ew$wa=Yšœ%=‹¢Ø”Žêb»á£€‰(_°HÀàÐxõÔýáñ ·$L2à §pl<û8ó CÚ¾¥ífÛp3TS^û¼¦ â/Œþw­Ü9Ü.œ>‰ÐOX†ŸJI§þ9Î}B49ƒ¾Uï¬Až Óg´DŽ£‘™Ál#ºÙ;“6‡,ÆX<6¶°°³íwº­ »`»%hqHñxË¨Øø% QåÞ­ãí“ï'%I<”dœr:%/mvš$}Yš:­6ÕIÃÉKÒŸ§&¤z¥¸§Bi‹’½“7Åz¥rÇ·¦NÝ•’œé–•5á|]…¿4”4²Q Æìñ“Yùµz5ÜÊ®’u93æ¤nHÙêyÊy³¥©‹èe’ÝP}¢†ß0¦Ù¦m3û&gTP,LBÁ(Mé¢Ôï\Ý«Ü!sÈk•yr…T‚}’[(|ä"™ #@T°D<]¢…ôC¾h&ü¦ÁOÀsÈvÔ]¾ƒL±T…Ö ˜!I‚¡ÀZI¿ä=°|)dˆò…i’SÀn–àEo:ž2‡8 q‘›É¦Hc·±Ûh26(Õ—þŽ|®¿ˆ8‚g¢eôIÿvŠïŠ^‹S…ýìd«=°Í¡Å¾áXct=³bn…íTþÿŠ·o#ü‰ë÷zXÃÝåøí„â+ÒÚ6µšJžMz¨s„ÐF¾B¯¡. 1èû© d”¾Do¢Á>¡év3-gNË\(^÷ólèμ]€’ÃDuüÅtV2’TgûÇ&%&ÎŽñ ÒÇ?>•¼9I;eIRk*”twb\éŽâí¹sK*Ù(ð,w‰/K®p{·–*8˜×5Ó[}1¥,Ù"é\’<ñc´…ûn½#Øß6¼!GÕ0µ5–Û#"!ÊÖn^ï‹ÞÝ/º½ú´¦½éu¿é<¥*ì:Ú5®Ë[¡R}VÖ*¦©LUÑ7eŠë²¯Ò"Y­ìV!5Çn@° aC&ˆ ÙŠ‡€Ùp®¤‚±ç2¡¬¥"ÎhV$U¢*¬½‚E@I°äÐ*r®fñ6òcð˜ÜCµQéG´k–I±ýh‘ÜME–~ô¹Ù¡`%!/WxT æ¬ecbÁ,K»ãp›AëÝfçú‘º/ Kþ'8ÿÙç õa˜tão2ûÏ3?ëQz³®¶jãäö™~P!ý¯³Ÿ)ô2QvJþ;bì„!ô#‚!/‘[R}´’×Ë&+6++eä/¥aÒa†ŽÃ™“x0^xP Öˆª%>H ⌘Èô¥Á(Þ ÚÀ—°iØ7éäp•oÇ)ç¯|àôu\ë¸Ée-e²RXS˜RæÁÇIóÛ¦+µ~5ýÿt. ]#¿'l'ðî§5¦VÿÐÚÿÂv,iÞb‹…®ÕúÏtÿ:ú½C_A¹C›olgÅ2YlxÙÆÝñŸààÏv}o·5ð³wZXyÈ;ÛíÖmæ;üOûúy 9•Õõ*ä ÷ ?JÀm[—«®D÷“žE¾3üÎø\ð2ô|èQâÕ#q[Ò$^Š[ÝÀéfNj`L Í;¿(þ]†¨È¼ù¥ØDlÄ7eaÌÙí‹Zg5Ï­Ûò$¹8pc°×x$¬ÞoJd~Üž¢Y…nù»K.VõÔs™m7YKÙ7ùîšÜozðÌç3nö7ö-ìÞÒ³±Ûª •á”V]+å ©\ºSËÑcÒ|…µò]—_~×øÎN yˆ¶J!yšv…äL%/"R:HMD-\ÿ‰xÎú"JÝ‹²|@ër©PÛNh»”åp^ï‰e±a¶Á/–K,ôHüµDFJ@êª w“öï·Ž_EóÝ(ÞW}}MÝÏ9.¶zf¾ÚÌ×õ­ë€ïÃ(«Ò™Ì]ì™UZ¶ÕÔÆ1 vI=‘‚µâW6ÙòγƒÚŸÕ÷Tú—E¸oõŒ·öŽ7ÑÖ} “¨sÎ Ëç¹ËQzŠKWéö6ž"Þ§Ë·õI•{ûÄ£ 'Í;JuÖÓsTn‰Uð$t·|“,DÖ+V¥ÎÒØ4Mj†.¹u:vö©JU«•6JSùWY:ŒÖavØL[hô,ÙiÙ+OÛµ´ëªÊ@(ÕáJ8…w€K€±PR†4"ô8:Š ÐÍX)j V"{g‡¶Á·Q-ø”›¢-Òo²E°¼ãy‹¸™1œWMFõ«\j›YÍÇš¶¶=hØYÇo^ÕìÓ^Ç<À íð¨ÛXõß!~iiNIÞë’+S6VÝ«'6U¿Ë9w+Ö.öR¨DÌÍñZã_{›ºFVV“m“lã‚ÆOzTµ¬âZ5½vq%®vJµ¸ø™ÆVsïëS;ÂÌn­»V·¾òtÖk÷Rƒ4ÓGö8“³:u'Ͷ¬5øÍgvI–མ -–žï±mXzhqÚè’™¥óR—†N˜í0œ×ÿ­sKGÚÀp rv“ Up'­»hàF·‘|Ü„UÉ*eá²ù…¢³\t.Q†Ë1Ź«´ÓWdb_±²o ¹‚«XÒ#ì”uqú¬ú껟w+!…\nõBûÁ7 ºă…ðnØ©†Ÿ¡;¥³äû¤Ÿ‘ZÈÔÓ%F’³P4h€°D/†ÏC+ ô.øUr¼TˆNsüba OÜ0¯l(çES`íêÚ®ºøÇêùå 5:5N #Ì=¬9ìÓíºÿóÏôúA™ršº‰òžÒC^MÔ&Ü#20þú)^¤‹{òúœ+îå›®µíKƒzê43ûZ÷{á'<7[';i¹3ó3ŸâÞ—<‰»5êy„_¤E’Ð÷¸&™QÚ”6õhµYcwõÉJþyB¤ßͰùa³£"¹ÁcÎ…—…=ž=ÞtüsBÇ5Ak ~Ÿú±Wu²f¤É¼%¤yW;bi˜,íþD^m_û–²zYzÜtÉ5}­Ÿ¢k¦«m¸Ý숇‘ÏŽhbÑáV{pÍÄêd­ý{çÜ^½lå½çÆì7·bkx~÷iE‚²Jµ\шíÆVc‰ŠFGy¡s]×Ñž²îçŠû˜ù+—/•ž•­_UªU•LÕ^ùù{…‘¼½+wS¾é1N í_?`1ýuߦžß§Míí軼{‚º;¥ßàa0˜ÚC³ ;`x @j¼.\T¬ñº¸Hóe«e·1’©5ýPð8ÔG£ÛÑÉRÅul/â*Å~â@ÈQ’ôj›‡O0ìšÌkÝ*‘Ú–šŽfcF^ý’’¸ª÷Å&u·ê4ÿÚò²å?Ã|±N4=N7…4@ £’ü)l‚ñ") ïƒ[‚ߣ¡ç»¸#¸×øÝÿ¦Ãý­ŒXKнEþB²Ñ r cê›ê-u^ë2ì¨í0bóÚÒÇÞ×eqHlŒmDHÜÁ°¨°ÎØ¢Ø i²èeÉ—XsÛÕ–&$Í›“¸=f’ŸnÐjŸ#a`ÈÝÀ«±+C£üܽƌw‹+‹[—"™àS–ß¾°ý]SfûÁ¦àª¯“™¹E¹k ­«55Õ”døƒÞ n ßüðI¾!Îd›SNùÞ-~Ùññ“^–=,ü½Á·çD—²3¡{K·åàØ…z£ü¹ŒV ×/^¶uÁÁ¡aÕ{¹Tj-¿¢Ú6íÙ´–Á÷ƒ¼AçAýsÓe生0†ô5j(çH÷Kµ¤O¤Áª¼n Ó·Û¢ë}ço*Åô¨4«“Þ4xg:0H™ñtлïLç=¹±¬²›ÕÝ*3P>•·"{!ìAÑtT ³ “²k!*¼6F×a礘ì¼W^¯y·ª Mय़¢ñíLA†‘vd¼Ý(’(Ž@„Š&‹¹¼¼æŒ–ç­éìu­š«Zfו2°¦®ê†ØêÉçÌ*çLü'̵ht\éV:³¨Ÿ©•ÔjYNf“ŠÉzähÜ ÞÉøRœ+!‘ðü˜?ÄâÃOýLrÉzi&NŸW{¼pWYìPsk¡c´#äÊvHõxãwÌ'2,5Ö+‰?èž[°9úNLeâÜ„µÙµ>¦Ùø´çÇ—4åÏ7¹¡¶Æ¯3°-hiÞ¥r‹EË­Ú„Úýeü8°u…g™Qlç–3í9µ²¸4«dk+ß2§‰ÎoÝ }.{®ÎM9Ѧ©”±Oã“Ü,óéœE™Åí_Þ·ºgWØ7sÀfqIÄüqƒgdqðsø¼LGÕÞåÓó¦™6màðaxáuZ¿j¥jƒâšJWY(+÷äZh´RʈÒÁÎë=‹úvöÚõêžÚ%é^Ù}dZm¿nÿïÓÖ ök+Iʇ]†Jn'ª‘öÆÒ5ðd–‚EÑ`#2NGÞKG‘°1€K$Ž/Á¡ÈqXm×IæJÁvHºŸ†“`49§aO°Hi¸x¿`ºÈ¸%ÐæÖÔ´X3ðü'ˆ¹¥ukÓÓ¦—ߪ‚ :ù aº1âþsÚ9Š-.йI÷¢¦®ÃQü(Ï áe)7Š£ã†q«ð¸»¸%8ßãí_ÿðÖüB´%þBò#>Æß"„ýT–Ívœ/»´xe{D{µ:DÚϵ$8ÎöÎu=/zªÆÛD¸òãŽxnv¶÷Õ ¼ý±„›‰_Ëöð=·›gWëdɸëx2 Æõ[ÚäDnž¼žÕt¼àUÞˤ”È¥¡7ªgÖ­Ã5F¥“òÅ)ϼfF#öf6-žÃ­ŒŽúcÕ×ëŠëTïº.öXÕß;»}Ôa4Z¼Z4} îÝ4ø|€Ò=Cž&í†?J¢$kA»ÙÕßï9xg0e(y¤cXkæÎÁȾ]Ç{ßw?ìnêRªB¥ç¤\ì(%Ñ‘ÑzÐN’°oW·Uïêž¹= Ý U¦2²Û£÷Nwt猞o½£=×UO”/Y²ÍJ’ ¯ä`ô ÆÃe‰Ørì&¢ w@Ë¡(ï½R@óÁNoþ1/y*!ƒ÷€ €­x¬°W¤TJ`è ´2„—@Ö¹ Þ戲E¹y¼Þ0ëã×v5˳™Cçeò·p;X,VÏZSß;Öბ¿ý+æ×tKtæS/ê¤ÓGh tÈ:\ª VPH qù±çÔ¾«=÷\;Ec¯õýƒ&÷sD¡¶-n1NWŸÒA [4Ù‡ØLrrcÚ½rï·/³YnDzƒœ’}[C&QÇ ¢+¢¬bÆîŒÛc?’ð8Ö2þlBóä eVŒ}M‰õ·ê±šÈ²Ø¬FónC3Ǹ¬W•åa) ©n ­|}óC+ÃͲ÷dmȾšÃžÐ›_›˜0)éE¨—MbñoÝ+ú^´g[ÿ¥¡“ö¬Yâ9ËfçoŸyµgæÀÀ¬äÙof®äv¶"lÉ0´ ò¡{ҕݯúõ†fŒ¸Íy1»qhxˆ>chZÛ`Ö´ºÞåÝ#Êl•JyH#Ÿ¤TI‡‘Ò f÷ÌNUPW·æ òï î¾¢ÈëÑê+ètŸ”U+ž){ºovv&(ª±ù²^éåME':AaCì˜,OúQº]%õ“îF6"“Ð^þ(â„u£xd ô;tr…ßCø ¼Höƒ† â@¯$Î`†¦O´DÌh‚ùÌ€ÆÅŽŒ¹í:¼³ì™­Ç:Ö±;„c9³9WX;Ì–‚ô'í€ ža~ŸæGÓÕ§»E·–Æ"˜Ó,uHôkähB! ×E¸A2'6ç’”„,ÒmÜ<ÜïÚ¥ÿÀÙŽGÆO .ÑšN‰6”š˜%›eÛqÈ·µ²©´í8”9ë9v8X¸&‡KB^ú/ Zl˜âñ6üm,ëšjV¹ª2¡ù$cB³UUleZ˜{ÙQ­Óy£kàq<Šh·~ê9# /¨0""lSúÃŒÎÝüá\¿ °àôßÄmyçân¹ôø€çF6̘}aV䬶‘äY7Gž ^0d©lê<<¬={嬲™ÓÖȼà%€)rH:Fõ¨éW ?›ól^ÞÉpä °ïTßy£sTïô  P((t~S:u^è´–S¤§”Ÿ•˰qò‡ŠGÊÆÞšžÖî6åR•#øQpž& QÎíµî:ØmÕ)QåÈC€0Ñkp3’¦Áð9TÅ­ÁÙánj›ñ¶x5N¦Á9àùÿÀ|3é)9Áx‘õl‡1öûÍíCulõÇZê)M'Ù²]«FÞÙ¿wÚà~1úux\8ò]×¹Y§Z——…rB«2*&Ç®‹óIuJMòºíøÄ™­›aæd :šǘ%½Ý’jšR‘JM=ú{–GŽGFF|êTqqFfX:7kG‘<÷ñpÉÐËþÒ¡‚™Cf>žõhÎóÑ3³#fωNíÍî< ´•­è <Ö¿kÚ¾áèQîÂ]‹ªç>žn7üpîÈðœkݲžÓó”Mª1 ¼ü <zÛ±¶">Gì=S ,W«W-âe‰_ ¹’w@ŽˆÀcÞa:içs#°*hËø]![¼ë½²CÎ$z&—§Y¥ûÅ;'B±•ɳSlSÜ3ŸØÇY¤í˜Vô¦éNUlÙ¶Ü©q^lÆ g»Á®ÔÁоGCûfœŸ±q˜42wf̰ó쩳 f8ô·*3T¾ƒ“f££³†¶ ‰f}›ûzVꌚÁõ}…ÓjûÐ>nß’^¤wYg%<Ì.r¸ü–ßZšÌVûªÕ ýßæuثեqgÏ×?j3iYÄ‹nä÷EŸÉ€“~®ÅÝ0;©ìNЉàñèÀ…DlC|Bì€ÏÁ7 QÞ2vÓU²)·ððP Öƒñ¤Þ?ƒw ,ˆºKb|PžËÀwâ'âC@pÌ„wit¾’óâ~¡5¿’·ƒk*Œøiœì[œ*ÁF¶g[£¦u9ãWÖ§–ðfEûbÖ,öœÓlÇ5:þzíz‰»Mº#lã–k²›>’ÒH‡ÉžgüïTc:HÞMzˆ $„J(8’6!W§=ˆÿ¬á(x­ÓÚ¿ÏóƒÞ-}µåsëp«YÖ¨õ+óõºJ=ÞL£fT›—õýžóÝʽýÝê|ìí*ÝÚBôh¾:7íºuMèL™¦ó-Uîañ-!ºÒÀ›N¯š<Âü‘€½äxó”oIOÓ¶dÜLWFËbñÎĨ ‰Ûc§& ¦OË…uH³ëÓkócjmÚºZ_#·F¦¿ïOë²€ocqÝQÓ7Î ¬P4+ö±’fà‡˜Óvõ°ú̬Gò†F$c5Ò[Ðu´“­rîvR*ToçV:Ÿ1O©¢ŒÍî,ãO* ¹é¼‰zúÈ…ê­V›¥ -k\ÄÔÏpöÆÜ“ÕªPkÞXÃOÔ}R²ßø øOÁìò x'Œm|°ƒHÄIR ¼aÚ°¿H,@•è„ÝC cpÜ Íƒ¾A`¢d0˜ða¦+MÌA8Ú7À/A[‰@´[Å{ÄÕÈE~!·¬ÃaÌ|Î5ëßæÄ(g®m_ΨošÝdÈ\Í8Qêqß„L¹B¹DÿD}jøÜ#ÕùÄZ"‘êI- @ÄZªi"Åœ¸”MœN9I4"zà>khÚ[Û—Œû¤Ù.úÁÍΧ—hµÄŠ`qÖ|—ù'ÓLÓGZ´z•þqýƧMÉRÿs¾l¯Ç~ Þv¡¡ÏÜhAˆß[o/Ç`ÛÇZÉT_ŽEEИpóÈ×~'¯;,vOÝ“â“T“z7E~ -6õaòòpzÈìÀ|ÿ ^%V¿mLnJО’6É=žï~8t­ï‰öÓõ·ëZë÷ öYÍXÐsBvL÷(gt‡LŸÓ§¯²ÓĸO+}”Á]ƒ£Ót{ö÷\êÚÙËï#›£êTÝíÊUnP†¢G âq\´Â9†¾È35¹¿v-õ­4Ý ;·Â©\§ƒ×p.Ø>/°hýD‡ú¨ ´ïóo¡œ¢lð%þ ¢ñ_‹A:‰5Ú™·p›`®pÚ.sž”°E¿ J…c1’j°Yx­ÉD²Sf¢X$–º í.€A  R‰xŒ8@¢™#[QkÌJzчB4Ñ:?ÉS±è'Iš9ü«BÑ,ÑYÁK–=ei3OÕ}ªúÄë`/j#2m‚Êõꩾn#öKœJq;ûˆí„X’1m!.™ŒÒ,Èoñ÷‰ä#ÔWT`GäÏ’m¨)Á?‚n">I£³gá¯ãM sþñËôa³õF·ôÞè¸Z•Ù]6¼c¦ê,ÔÛiÐjtØx¯%Åí†7ìÙçíç³5dŽÿyï_B ÃÜü‰ž«Ž-']“9N2F ,ëˆÖŠ @"XŒNB¦!ç¥ó‘[È$%#øR > Ï—¬Ÿ!qE“!ÆÎ£žˆ-¼D$áÀfÑl‘ðFxBÄ[ÎÍdóß1UܦKôÿ¬ã ûÏ‘Æ×i>R}'Âй]ïŠV1¼›Càá÷áEÄeÔ&š”J¡¶PÂHŸp¦¤D!eõ{F«i;nœ†«¯Äyâ/áDø„ð?x» A›D¢–’WPiúô×z«ô%†Çõ×éi™l2¹f1Ûî™ËB¯Ho¢ë÷w§‘ëkr÷UÖ ,ÂhéŸñ*Ê:S‡OTY®ð’»~ó™ïåD5§ÚÜsÚ¤Çõ¼fµOÏÕþv(׸ÀôY(£«_•,/¼Ì½•ezÛ|È%%WY¸<Œh–`ܺ¬ºÚ_¹<Á"àª4§»¾oPy;×ðÖõ`¸iîzŒ•![PTš‚jƒ†L|^¶N»N‚†Z!Ú,ª£óáb±è2oLK&cCZ^}ˆÝ„‘ò;E¿×/`æÖ7¶æò¬ØOZSk(úõê sÿˆÿ¢Ñƒ¾—>_œ 'gwJ, yïYwÀ=‰BV"¥cåÒòlMD¾£Éü¤uˆ6´P²ºUAO%P|©Ç6ÉÞÉ>Iƒ¥ ƒÐH _×äÝMæ+Ù³˜Û:ú;pì æé¦emuŒ‡-'[.6µ±k–‚f.ÖÑQ¯o²wŠ’D…Hëqµ„ãÚWµ“!â:¬MÒ#ÖâŸR‰´*ò+ âs4¹YkDûnŽ„/ü7Y~÷;ùåy-Òi7Úg¶Åt±jüÈÔÔ*Ð!Îy‚ëK¼óLJ¯6á6 f.FédòBÒz›M)BoŽ·kvÇÓÚÓ¥+ÆLÖ/3£§þú©äê?ÑþûöKû7°ü Kj2§Š ôÒFÞ€“‘LÙni‡|¼Ò^6 }½‚oƒÃ’=b?I4äªÉ¬ÑmÙmù âƒ&7gÚŠn‡'ÃÇ Ð2ˆ)‰E³I aÛ“mÆ––0–-šÀl4o<Æ_Ê;Á>Ã(nlÊq04 ½ÀÄïÖZ }Z{†v4~±Ž¸…ð‹FfÃäñ4Чf5¬É8—èI¦’¶ýÐÏyãú´þ> µ:oL$“¯’bu>.6ϳ~iñ»EUƒ…Ìú½Õ ‡ëNÇâ‚ñ=iå’îñ:DM†Ä2ýÓ—+­ÓíðVŒÌ-²­ë-¯[­µžë¸Üïš/Ùã¾Ëç"‹ ru •A]CýJ~HL¡âwÏëþÒ½ONF•>–ÂòSšœ›sÒ ØD¬åK å±²•Ø$¹  T ÿoFHðo’6q°]äÁŸËõ`¥4mµe=রíÆmF,R{}«ZíT(É9Ï1f~Ò´Õê;øßqÕ„•ø!í;„£D"á5YŸtj¦ór“˜I¹C\KØJŠÆÛŒÈ§ˆñ·É{5~÷i:¿‘Ÿh8¯R¿DOªŸ§»”œO:ªïhÁ¶¾kcwÄÚÅt‡Á=«p¦ã3ÇÅöEë‹5v™¥yK3'ï'î!Ý$7Rt¨©YÔ=¤2£ :F’j¿ÖVSîë zïè᱘Lq _§%±µ£yz‹ •·¦5Ìlð,‰âdÖ'4vG–{M/êkÛÀIÔPôn‡ÀIøˆ?ƒ—;é³äˆˆ÷p.K– ãÛ&õù þ ä¿#Üj¸Wÿ¯ý‹´9ëѯĎ­-oý5b¹¥žž«æ}µäÛ9éìþ‘áéÏÏ[keË豆þFߞʲbx4ŸÿÛxüÏ­0¸ªÍ]°Ct}Š£OåTÕvEÙ,[§ˆS­íÞÓMëÚ*­Ä,°M>û°rR§›ªT1Cê‰îÆLä'4‘¼]Ò,tº^·@† ±d&pO8—ïÈ#ð$íkÞq0“åÉÁšÊ+û§ˆÛ NÌø­üí ԡߟșðǦýJª&èn¤S¤§x<å"í9Žð„0Ÿ0“C(!’­(ågÚNê"Š™DžCúF|Mµ'Ÿ!·ààRÞ›nµò³þÕú ßf‘™Ì¤ËŒaCpu™æ¼Ïy² àbï gÙnuÕx½Ž¼\@l!‘É+4žªï_>&ÜÃk qC¸ú]œžªL¢ˆƒë¬ëR«#Ö·…1æg9ðÔM¿±È-Pûb Sä¾,-Œìo:VqðWœï#gJ‡ÁÝ‚pà+£¢ú÷siVa‰©£É*»Ÿk¿Ì¾ÂágkŠQ¡è_Pš©ÛgT¯û‘å0®x¿—YÂZØÂŠN/¹WåWÅõÍùCÞo×ùG÷þ±§ö ÞÎf©:"ã,ÿÇt. *ÆLÝ™Ùp˜«‰™Ÿ„=°$ÙUå³Î)xåGUÒÝ×IPxKÇj|ðW0¼^1_i¡Z+}‡Ø óÑ_°nMFû´‘ H(ï\,°^É>Î[ÁÑçú´oÍj”0qWu€måÎi9ïXãDxá8î„Ê_êÅ?bç6¤Ï¸Y¸Ó8-üs¼ G)!ûSR)I·Iq”YĸS$cÊyM®L í*5J¡”’{I׉ãH×(è±Ô­dªmlyÅŠa»Ïþ¼}µÚö¬ã ÇÇ/NWœŒvYûÙdZšè†N§ïÔ¬Le_ª]…‹×þ¨Ñ ìµçi|z ¿Û|TØW7Æ[z­'½_mæò®h¾âÁàQÖ…\ËOoãÔ=d |Ÿ¦S즆@6 ‹l/²dXä Ù)ªF‚`É9q(ß3÷}Ðù˜ëkewÜVßAßvõsM€Ê¹Ä•à<Ûù'òߎ ØT0¶&¶òkMhæMîNöÄ îÌŽ=ìi Ÿ«[Íé?pžá2Ê·²~^yÏü!ú,K—Y˜á²÷t¸?ï©ÑÜyhïSÜL§˜i$Ër‚°î(¢Â<áhH•ËÊàΫ=z]Fò/ªå=Xï"*›.*/‘m•öËŽÈÔ²qò Y¨t¦ƒR1SL™Žñ3 E"¬çÅNâ Ž–øD͘¼½\9áÝç¤NñÒØmo`fó:8”ÆÍ?â+øAÂ4ü%ü/xßCz?J]H³&êsˆ7ðùÄ”Lz}=Í›6žºE“E!Û‘ÌuôOëèê鞦oÑ_o¤oöÈ"ÈÒM“ÅêäøÜî¬Óu×N[œU.ÖnWìŒ>Ú”Z¼4\K›O,×ÄÖ½_)t£k_§qâi˵£q®x%.žèH¸£ƒ6K$¸ŠÞY¥jhòPYŒ&dtyÉ)>I޳úšö2ªø9Œ`.€l*yù<&ÿwAž„¬å¬Ùdmïž²9vxÒ‰€åfÖÄ¿Ù6Zo4ý¹îv[m'8z¸4ØÓq.d§ö§ââø›þ ö‡A&õ™,ûJ‡}»‚Íê Þ zØ̵fº»ÿþ¿Ñs{\?ëT™}½C/ž[Ÿ™²+daZDú¾«ù'Æÿ\OÒØ:»(¿þ1–Z}.¥„å†M@ª¥[á#×°G•ÛSý5¸ ’9ÉœLt"Öhì7iE—º—¶˜nJi+¨Û([ÈSI‡ˆÞÄ—d;f:»èaô@ý±¦™¾¥¿u¼=ê4×±ÝQì|Ìõ¥³–Å~‰óeën}}ó*ë&ëçÆ¦ú"»©Ñ{—¸vHwÎ]d2¾†È$ÚÙœ±ËrËÌÞ§Cí¾0#cÚ|éJÀªã” ”«¥'äÎÌ…œVV(ü;PÏK-àýÖ°µcórKxcWÓGf‘ HÌžœ’óR•Ì(¸`2¬Aù¦ùþ õæ®ø<¢“£]©ƒ£ã÷# l¾Ø6Û´µ9ãú»ëÛð-H92¯ä­ÑÏÞã5tü‚½›É|×ò©Ý’W/¼ÃÉíc…0Cì¦üJ¯iµ?Ú‹è1E¦²òEÜ|‹0m¿ã9•fÎÿÿùD?ëãø?,Ý-øØº®Ô®±É“ë}²…—òwUâ)¶N©|­š¢ÌVÎRõ*ñ E•Œ"݃NGü±3ÍCCá P(’ŠÌAr3˜ ´Š[*‘ˆóU`'N΋š§5¯¬Q«Ïkhm®Omyß[Äýþ͈/çJ]ŽF‰¥t‘ädCJ-¹™ú’ºŠöˆ–LÛF­¦B”íäqdk’Š8™àH¢ël¢Í¦¶Ñu³õåÆ{,^Øø8ît¸´ºlqòt@÷Ù­u‰óçWkã&+ óz"<Ú¿»“æøŒ£¼ ç’-4¹Ì(ë¨^4mÚjõ%ÒG†É­4­MC×çè'tÏé2uýôR LrÍ ¬gÚû:/pÙä²Âù©½…·­Ô.ÇfÀÊßü±™ŽÌ^æ¶ÁçQ¥a{ùù‘ˆáÆtóþãÝÆ93Xñ,8ozn—Zy®gå˜[Ät9Ã,Bšø“±ØÖãöƒ öuè ´XQÅŸ…é >Ö¾°Ö4[ƒ§•gÜÛÚÕc2cl 7[וÔÊ=¥VÎpÈZ­ŽÔàºASÿ½x9tØjïçXàÄrU«ùɧÓx 2"õ ô.é6·Ø1bÆ{Ú?/h.L›Çëäösy ÞŒê4[kC‘î­¿iöjé•W´7wJcÄ„÷û)¾ÿ¥ÿòÃ6ÿëÊï­'£qŠ Ëh>rG'\%Þ)zÉ{ ¯…×9è{¬ZúT,IwIO@Þ CòDl d‚ÀH蜆ag4_Cºj¬•R A<_Ì×´KŠÕêñâ¿î·{âi;[Z­¡ôËÔTÊMêLª!…F¹@RRoQ÷PaêMŒ…FacI‰3uµ ¼õú«õ ô¥ú"ÃC&Cf¾å6ˆÃ"'ÌÙÌÑ×ö“e¶Åc‹k–i¨á{Sk›z÷žWÝäÉdï•kÑUóÀ Þè¼Iòež¡4ÕµžÜ‘V(Þ˜uÍ‚!BV¾4S‘­â)…Ò â#Â\á~¦ÀNJÆtùYàÉÚɇ~ j A²ÄêkÜô€ÝëûœËH›¿æö½µÀ꥕­å÷–~Ö÷íÏ"rôwìtØé4hÆ4 3›=TÙ0µ+4UÿNd&ïºÀBpk¦‰ ;À®kƒ ¯ò¨¼›¼Óü!~ÀM›”d{EÖcëõü°ØþS­®322ÒÏÚК?—úá¿Àü¯+þjÝ$)iYpƒ,;F/[‹§ÅyÀ™É ã ÜÅ“ÀÞ€ùÈSÄAŠ¡ïàð‰ pY|FWJ…ç65!è xh,Jk¢«Ù¢ÂëÂï÷1‹ÿën#ÂþϽ½õ õ-ňò•²‰GM¦Q²É±š¸Š„´Œø™°ŠZ®÷›n­þC©±½ÉC¹áfcºùg ]Û\ÇŽWçÚµå[ꛕ™,1œixјaºßf»Ã*»}.—¦+è™y…|ÊùçîGUû£«K‡AhšuGWJb 4-i|ݰÃïw‡¬¸¿uÃæ£E÷„¿‰‚yÙgxrÆ ÎvVE|¥çAëŦâclì­Žš^°¹hdY4U#‡Çk¢×ÿ\Žþ¡¹mšJ™pÐÊÃÚCó¦s¼`/wt‘•X-žh!}‹<¶åjôybÄáa$)n{áµQÓ¯Ý98ªð¨i‰ö›Ü¬Ë„÷x›™ì¬çúïôÊô£ÐûozUÙŽ>f?¤ÂZ㨆åÌÅÌkNzaÿù™þ»£“[ÞWîïØ|¨áíl{$JÐ|¡š`Žm€‡4ÙTÑà#‰J’'z ´ú©‚tÑ `—d7Ì€_Àì+R ö‹ê4­h·ƒ€¢wå½8êw›è{ázˆ~6Ì(3ȇɕ<…CA)È$K"Jl×ÄTƒ‰ÆÄÝ$¡ÞXƒ× £MF4#[ÃSÌ<¬ÛäÙ[;~±ï·9lãb˰.±›jsÜæšù£z»õd†É&O49|ªé4á¦ä¦¶ÎE‰ï ª Ig3$/Þ·:·AõrNû¿Êþà^VÓí&½ªÉì½?ÍWÅÜÅÁNþ‘ ï 7,1,~ýf{F7#ÝŸ¢áØ—m42šÆûùô?·÷5Çÿ©tZ´ tŸc"bšŸ‡S£ëT';µúµóÙð·Ø"™UÁ=;ßÜ„²ŠIº¨C<Àß‘«É©òëìé^ LæFPQš0…ŸWµ3ó~övËGÖ×W¦v—¤¶°ô"~ÞsYV{VÇ£VvÖ.µ”òŠtPãyøß–ìâÚœ[íÙºyXÂâO÷¡JÙ>ùùMÌj_Ë…جɅ»$V›ÄŸÅw$&ðl¶Ã5 õø,îlÄ~€ãÔ´0µÐàî-"hÞßïϵŸüÝßò %&ýªùN…AØH‹¥ ÒnÑúõêõïë{´é?×ߢóÁ¨ÁòõZ›Gv»ìߨÕZb]V‹‡«l8x“ “PêUÒÕÜíêÜŽ!/…é´¢Qßé^ÃÏJœ«JFZÚÙŒ¯m“ÄûÀÌÇ]О®ñª›2h6Ì—ÎíKéñ•ÌE‰-˜×z‚Þ ½Þ¶h*~šõÍÊÀ&Öæÿu%ßiäaÕ¿3ô†›•Û×§.Õ.¯ûÛj”јo¦G ‹Êù»š€cš¿qœê¸[c³ :§:ÝIW Ïq]yw¹ yJv!ߟ³¡æSzoˆU.%DâòƒËפäU1÷•y$”OŒžh1‰hµèÿ€ø÷ù•¤”E{jâÕVÉ}¥ÚÕ{€½èl¥”‹=C<$šÿXˆSøã…]¢ ’™p/ô;ðLÔ/š©Éžé–L’Lçã${$áàfIP*y$ºÇø>f/Îx¢ï £§5Žo#XDyDÎ&’ÜI1Ä„óøEx”Dý´…jùÿ±wàQooï.~î~!Á‚ÜÝ=—â—ó(ÁÝ] ÅŠ(îZ¤Hq+Å¥xûf÷ööö,¹`¥ÿ¯óý¼[{öjï5žêåõÐ÷ ­c㣳}5³¬°¯¼PqK^^‘#{' _­à°ïzò>,>#ÊpœôÙYiÓÇrµ½Òk–?:$##kSú´!kõu2hI‰½† IKNÝšÔ3kCA—¼ú“à †e­KÙ«=«ó2øÅ¿Ñð¶µ¢Epëï:7éDæ˜ÍqžÊ ý½ê|ðQlµx¬-¡'åë‚~ã³Ù<=¸wø¤ðÞá‚ð¿B…Á?…Œo·³hH!ÝpuP.º>g¡oÄ=).Ü7ðdõZ qè%Ù®jÏSwh„ÉÒÚÁîj¸úbF¿aTÞ–X±¬iâÖÝŸeÓF”éˆb5 >‰€º…®4ÿ¿¡½`FìuðÆÉ¾òóõ{sæ_.)–›”ÛÄÔO#ÕŠ²{fÿ 6hhú,}*¸‘dtvF¶$ý—ì¦Ù>i-3Ûh3Ô1Ù)Ù­³©£÷ÅÛç<ŒŠ™Þù^G¼y½¡¶¦¶öºæE£ïc6b…°Ê°ú²j²)Hh’n—Ñd Äda¢`¿øž¤§ ¬×ê±€ƒž ²¦9 ÌO‡.î»øà€6ÚØÊ´©ÏGF^4jcÒõ7µ›4-À¬‘¹ý‹Â~¯óXÓ3¿JÎŒÑ×zqN G4^W>ReTÍI¾;Äò–ÝÊ"©vÃ4±ª ©ª\Щǡfó%•Põ3ºÆbÍ×Ý“2ÌÚ7y JíâZ _—öaL÷¬=ÿŒŠ.«iÒ©ü E³VòópZ¦·lÙií¶W!é¾|Pb·šƒ¢uoÔoS×ôüEfŠì~¬¸î® ßõI• ÏÈh‘±>ónoQL—h“V)õw4sìou@üeµ2W¶:ì‡4Ž0ÞÎMÏkYðg~ZÁhðöÃàƒ&Iý6S–ÕT§}®««ß¬¯¢{AB­ã?*Y;A¡mU/cwÆýŒkúÈ}˜9¯ÎRçeʺšÑÀ¿—Ïsß$ŸBŸx_†ïñ)#‘‘ɬËé#l"ÑJ¦ ׊+ ;p¦ór½„5$…Ò¾>{(·`0FÍæ9ó"æY {n>A³yO¦Ë}4 J3r_²¢Wäh¨èÀÿ ‘¹½“Þg=È>¬6ô½2ê»ú­8Kè͘û{üRA ZoˆSÀw›ªªÝ*w3®ŽßO~ýð¾”-5 ZËß+Ì*H^½‰8~XC¹|2¡oÈî°@”úÏÐ̲hCļ­*è,jVž¿0ìa¢9qzå"‹¿ÙÜfäC¬®‹zqêM°–º”#8Å«Svx?¿´º uUªû¬æÕ†3uÌi×»íß=~o_3©EfNzõ´&é+2jeEª'Ž®òͧuÀë`M»4Ï甕=eF+$Ncêå‘3uÞcªŽa-)Ÿh¢kFãVVOõÛì5Z‰aaº.0k|¿§•ΆMKŠÖ¬T_Îl™•›ueÄ‚¡Ìîç0Ì7¤¶L{>òUjÕ‘õ¨«)^ý½4˜þ‚v—¶1Ó†»ItB¹=¨²HÄËælfåqv®rÃÙ£é¯$¤$9 ‚Z\{sjùº&3&¥d.ÈÕN_`\™²(ùhÒœÞè)ùÂ8uòÜï/ë_Ðxn[¨jû^HLļ'é)ô(Ætíªà‹¡•tTõ<cc…'€l/;ívNF¤6›é|«»»ª3:ö¿ N éñkÈûPu¸ª"Â÷ö&_8ÇÛl £[k/iºHòU£ºÂý³‚ªòëÖ’es~=n6‡‘¬;ó6ó× ¿õ0VmßNª‘13ã\úÙ´à´ºé©s³`õŠÎ¯:NEgqöy•ÎÕ‹š•—„¡ÎSW8|ì˜c6õ*l›·ÜBö:;$û%à­4õRcEÃmºÆ/31¡vhVí´ é5G ’’WÒ¸oe5çÁê˜äMYK’—{›}¶úqhvl¥/ã(E×D=x$A~?颙üÝüùüü×<'Ê{#5nÏmAatÎ7[ÕnñˆŽ‹HÈÇ›º bÜ!ÂÛFu)Ãs5³ù7Á¼wX©Ö€Þe1«3ú좪w¬ÕòÄ_ëîàõãuÃÖä­fs Ö߬‡µR%õê›™”z#Ýq,e[êՔřpFë®FÎOâs[N[+ÊZŠ©vËáWÆÆ½/$ÓpsM³OežËÈû±m Ý ]õ=4 3×iŸiHàú‘¶…n¾–›ž–y2éfŠ-µóéÂzò~•6*`m­;kŠ`ˆ0s…»—‘ͺÃß)<ÇÃ?Â à›¸±¿€ ä'p5”ÇOq“ùÌ ÒNÐ(¡¬újߑӪf·Ÿ«U¥õH¥}‘Y1믃úì´ÓxN°fÝ©ðLV» s?ó!½+¬iÇ¢Èo/óÑœ.€‹Æ8pÒ.'\:…ÕÀÇ}1Ðå "žF¼ »¢"‰G:!nk›­vJÓ-MŽc´Ù܃;455:S™ñ<Ë+kdÖ=upöô´º™{+®ø¬˜#ù>¤ø%çõ(ª7foޜݺ¿Ò}†?Jk _¥O4uÏy©­¬Ù’y=ãu¾f‘6Kª>‘Ú7åx÷e¶þ†¤r¯·_‚œñ#c« óëï§c#}5c {8ŸÜž§c/`Gqÿ`‡1ÓYGI~ð(â‹R:¯šÚ±é6GÂ)ß¹¶¶é‘yõg¦é4E·’Îî=¢J\íÎHúDSEÙ«°îWlaE-ÑlÞÏbs¦°ã ´Ù|:`!í"½:CÇXïbwƒ˜®{ûelô¶QäGô*«mÍlt;R)ˆÈ¿Á¹ÛFeoKsùó0ìI¡:°þ2š3íu©Ìƒºd×PÊ“šµ6ëõ”.‘5Óx½v\ìSý×FÊü~­Æ,.4‰Í¿3@¿MÍÈ<2´ w­Ö¨Î­”7ÊôƒŽ®Ý W€)~J«›Ò!maFãÌY™ñi »Ü!Œè·¢×ñ¶‹Ò§3!VCÍ cc fŽdJx? S…ÝùGÙ•Ù5ùûyw|Îç“'‘V“¡ˆ[JÛž_K"—?ße2ÓšN«fàä>¼ºsDÄÙ4³9x€…ÆËn×`¾ìOYaùø~+§“p ÎUTÀçå>°h«h‘ôH·­÷!çV‹s¹5ŒÊŒ84ºÉ©ïÒglÙuÀˆØQ›º6Ñcº•Öúì%Ëë–ŒÏÞÏ9^_Ô›Ýý޽²B\Ó× ´¤7¥×Ï–¹PÝ6kH†&›ÒkôKîeúU·¥¶¦\úglH×Ö?h怕Ꜻ°ì1YëºT‰ª5ÀôKÎÌœ-¹3ôÍ[õ"mÝkMŸ¬cÃuÕ/Ç7Œ_£–h ï=ØuYMíTMš½6–™ÇZÅ*`WãÖ⥠ÃEs98‰œ7l*w÷J@+²ŒœF*$ ˆ/ƒC–’.Õ”]•4ô÷ÝYVÀXÔdùà bd®­feXΰùm9âËØÌÌ"ß‘°°€a ékׇðh %ֺĽ¬J«Zë„91íÿ¥¥fiï€ ÔÏêÕµ[DÐ¥•s0ü}Ð=„úO!+™Ù¬ãN®:p¦&}Äʺ²nÃâÖj¸™ÉY‡Sž¨ÉiS·¦(ƶ[Жƒ÷^$þç5?¶—K/ð*<’óÌÐܰ}ØùÎq:NJcAn³¼›9M f]¶®ºv[öM 0[›yºC¿:ÑŸô˜ðhsWƒO¤Ncf1O±"¸9><<»*ógæÖwÌ!¬ökúbò%x8 ɤTÒ:L±”?D°Jê-k-ÞåßO«g8Št7ðÇ| ã±Kt-9Ukm¥1Sò’ŸhäZšš”é5êDF«šs…¿ O–W+gÆì˜Íe¾èŽÜɸeCEq‹U¡ ´ ¦þ­ª5{› í”ÚêK· ·DÓE“œNμ6ªZú¥Ñ’”íËØÈ¨WLIKSJW´U)+ºyåïÊboð5 ÑÝÈäv½žì¯?óknPÁМ2Æz¦‹àu³Ö7ûNvŬ¢áÜŽMk¤ ¡÷ù{`ŸDKŠ#ÁŽxo{ «%'_ó½^=ିÁ¿¯†2î4u!ɇ4‰ü¶z¸ÛYKÊKî⽜Oa½\8EtUèe7.;–ºãGG7™ 1”¬†h«-GÿG`RÒ5G;Æ/»§z¾:?ìhÔ+›&¹" úˆé@Û3›a㵌ç£_×#Kˆ_Û8¼yRN»<{¨:¼ƒ59Ö)”r;«]Ÿ®ÉÝ3¾])³=z a¡4åpM;Ç˵ÿÖ.esýsȦnº"í³ìˆNÍFuO¿ λwÏ»–7ìÜÖÿî}Ÿ©[¡§‰TOÎþ ËÖ\1.1=±\Š)I³*+…§b²¿çOåJ¸çx›|N’—“Åä°ngÀmI§<LNùZ̧ cÜȯ§þ]í$rå¶–zÜav(†z±Ž1ç°«´þÚÜ Nl+±~ÅKDôõÔ„â]E=D/Ä?‰ƒE³EébÇøøy ª%ÕnÐÔË^“=+y»:$trÇ6ýy] eSXMYôÊëâ“Ájßç7¹^‰¸_÷9 k”7­àn®A¬Qiûdïϸ۔BBÊ;—{'硱‹±.xßixCý'ýÆQõÀNZ»ì )ÛÞéå3)%c`bp~a-c°üç’{‘ßÁWáÍ0®'“ú #ø°ææ™™Y¬&|háû¾¨b7än.±hþeTb$`rcxVÃð`+Kˆå¬‡ãJôEì9 dˆh†hƒÈ2‚o–Ä‚ÔËŠ€dw6{+h¸6-LÛGó§nš¶Çh•þIyp‚—QQ›QÀÌ`ZôÑ0FÆGÏ2œóº¦W¯§øº BQ¶ûÁœYyïó+4ÊO6éµruAÖ}ÝݤFåÚdí7LýóÁôÂøì¶ÿ¬ÒÝ×^Ñlî?ŒÙçhüÓ!÷2“w©oë~ÐMcždüÉ`ÜfaܧQ)dù2|ƒyðR[LgsU"‹ß[teÓ}81d:h‘µœ \/ž3j 1ùpŸWŽçæC‚búΡb{ 1ÇJn0_':ç&„û4Ž*¿J¨|T«¡ÃâÊ 6èÄ »ÍkØÉ/b¬Ïk·¿³çF¹X­:oHá¢ÂŸ yy×rþ2\3´Ö$¥ßÝrÄICµœlÓ!C/ÃmC ÃAí­X³;cE–Ù\ž¶¢Õ«®÷û¥m1Œ’UNÒ¿ 8ÕÚ7Ù¯‡ïLêø>¬ƒûÂrØFñŸ ˆoò}é»Ñ-µJ¢(E¯ž´,£€Î»Àâ-éªuö  Fáx¯Áfî(-~|¿˜Öo†é\P&æSË¡œ«xåyï¹?þ6Úã>GLÏýq±+Pà4.ÆéK)Èžh£¸µúÓùÊ‚·àíÔŽ9$}ÃY8ãAï©£ßè˧å–Ïj¸¡o{ÓP %Rõj]¦aºá9·“÷È™ƒ¢ûžÙM_ÕÛ@nEæ“yäµðzøü<î · ½ƒÎ¯ŒZKþŽÙ•Ñ¥˜›Íc\€aC–ó¬ËšªÙ¼M™¬¼ç4¦ÚÂÁí7Ì&LË Ï ì(¡ý{4ͶXº›14¿w‘Ï„È1`]ýÓÌiÇOòɤ6´“ï/GéÊç5Îãåï*<Ÿó¸raöñ>}‡oÊ\£¿™›£Ð?Ö̹?¦§é²!Ú”chghfœcX§}0R4üm¿z©WÕ)äÊä—ðL8Vçákð4¸Üôž€7R.¥ï©u}¿ (b> hí·…uÔ-oÅÿ\:Ì¡Öñ˜ÆÖðÚ6¦Ÿûº«ó1aí  Z6ºN̦¬Nhî5@šõ˜Cp™`6?vÃ×Þ¶¿”|oûkºÂ1̦lFgË;Ëý‘x#碩¿©]Îu¦º’fvÚ᦯*(íìÛV?4û¤®‘>.wC¡É0Tÿxäµ¾ºqªÁ+{[ÇñqW[˜ÍÞä‹p%8®ÿŸ»ÂfÒ|ÒuÄÁ©-ˆV“¾—5Ž£çµãVþ Úò0^Œõ™°dŸâ¶öéÄT0Ï€7b´}©jOƒ~»2{2û1G =§ «"SÒ©‰õ#$õºî¼ÙJòÏØ¤~R'‰YrI6S¦QnPÔ°õ á)C»æ1© Ûô×À[æOÓÓËR+‘A+ÞJï¤Û¥}©9¦n¢dŒÐuÍâéhOißd¿ÑÞÝ1ño0¾û’ï“^’ªÀ©ð ¸<ü;é{ «µ4[½3j2;0öÑ›àí\›e`·Ç]VJäÙp^8Ϫ“ÙBÈ€z³-.!:£=ÛMàT„:W°HÜBø 2¸g»JÛÝœ¡ FcæV ÓÍæ ̧̅œnœÑœ2hîft¶¼l¶CÂeß?o³Ó‰lå,Ù¶‡² Å|)¹}sf¼ÁØ$·¥q—f’n†N®õëQØWÜܱÞP•k:¨ç¥S²ûéy¦£†#Iûwf½¬õ'À}U7ÀÜígÒ’ N‚'Ííi‹ ÄÁ rÿß„ú´šÜ~¼i)u;V Žª}=¼˜b°þs[1ËÀØh*!Hú»¼›5­ñ”r”>”T÷dÖ•a[sºæ3ѾR¿Sß˸›V¤éª©¯KÍ O¸hÈ6¶0¬Õj Ú1ÆCŠzfæ‚Ì]ipÊ%ÍÒ0–÷‡³á7¤å.wUÖJ¼C‚Æ‚(§½/ªé„ø ýTà†<¦œ6CZż£è$·&þóz2ÃX5Mßÿ@Q@¾¢hù¨œÚûgOìˆhÖ±@½*ë–Ù0¯Lè}"ÐIè¿«’»ó«v[HhШ²î¨þi …b>½v3ð>:/·fÁmSÍ´ÔK£ë˜^Ska¤kYÆ.ù©¹Ït —ôû4цY¦Ãz½nG³cÙH $äð$¸!< œvòÄÜ,e…ðHòP‘žÐÒÖ˜«©¸šÍí½\úá6+½ã³gËÊ)¬F „ß©…E9cž©Ó·7;œzÕ@r$ø§j×\Þ= q,LöQ|*‰´•¥B™³Qe¾9ÜçS®S&SÊRæ€õ1ÿ˜ŠqíÕñà‹[Aº×jZª*ÞDÖ’¼X®^ß!/;¯ 1·¯>Bã•ÁÑû™£¼Q´ uH- äipñ¾ÏÝ˭ߌΙ‡²ü\Ì’ÊÙZNø»9¹ÃƒŽq¦Š× ðö_˜ËF tùØÖí_€ÑcƒÊ$ì^Þ†I¹ssÕcÛ÷èY«OÕv¬–¬¦ÄKcvÿe˜¸ÝñþSÕõV*-é hsótñÌ´ ;ƒK†eR"ûcr܈@¨¥¥æž¥ø%¨ú <þŒŒ¼·Æ­Ø)9]Œóõyz•nZæíö›ºßìµ |eµoöÏ9‰ùÝó6—èvfÂôUuʬƒiWFŸÐL6 1õâm6û >ðÌl-;oíï‹­Œ F°6‰h]ˆ¶eRági4»E¬†¬þhK®gCØš £nGÕºøûý£þî½FQ4äJìµà«B!IÉA{C‡†f0wb=eöDÊþù̃`û´B¤ÿ6Í$Êã:ûP̆'&¯Òèûë:hSÒÅŠ,¯öå‡óMëŒô댷súä\0\Ôö1ÐLUIÆyÆeú8Íw ž×ê³»à‚ÎmÀ(ë?Í×Çï ÀÒ½Ù¢ä2õ0:ó1°9¯¶F°—äb³PÉgÅ/7¶ÎçñÒe¿ôwÿºu—KÉÔî˜p®fuV:3¬i;æ7ÅI›p¤ðÔ…Ž Dêß1IŸOàrbø§Û{:ÕÇ“4ïRÊRï B(בgý‚õº ]kõÕÌZ/ú-b²*5¨™’Ø|g{¾³1ÖX^_Ë ßðªa<FzoÃ]}Éy$¡²¡{IŸÀSÉž‚ó©@óYé{“å~7Û›Ñì< ”ó‚ùŒ?—õ:3“£;•?±Ês‘¹^ EßIRkqµ†ÂýyÒæD”†‰öÔHä}¬ÒÁÁòùQ!ü!Ìtf!s‰S]’µÆ´¿6Ø\Àšã9Nu[,.¬þÎOyÊ3«nOÊ>&ŒîαþIŸ”U*ß“4.hö–:03سP¹½“Ô]§S1|8ýQÔÊ 3cWmÃ=à-˃çŸBZÀë=†4—µMX#æÀ`RÙj=~¬½.|,û{ÓÕ«÷v™êmÖ}æ™Üw»”)K§Øç~¿à*ŸÊn:Œ= Õ= +umÜF 2›SË4/³¢ ­ÄfhOðÞJÿÏ<#1 ìs?Ù¾bVSýâä[¨|?D~„òèLT [)áNì¸8Þ ÊÜk4»ÁýÀ·|Ž‚ó°a€ß« ë2VJWÏ\Í¢ `Òq<‚lòÃÓJÇd¼¤3PοpÒ…$['” Ã5Œ¬—Ú»ã5áŒÖÛeöà:X¨KŒ´%vb(Üg" ÞÛ~¼5§Oö+Ã+‡¤’÷Íêêöu¬VwB¶_rcð%.0‡Ê ÊEBGS®ÙqúÝÀûšœJ#©`Md˜—a¼éyN…œA†Aà»=ÞºüflçØlvkæ"L{CRàçЗ>€âk1‹pÞ|NÏE1ï®rÙáf3_øX8P˜ Ü"´{W™'6·8+åD½êó´še?n9{>-ox{©r@ìßÑüØ„tNñN޳ækÿÓÉ;GÞ»®[M^ƃ)»'xÛàð§¡Lð òi0–Ù‘·˜¦Pñm„´‘©8#±{œÀø2ëëÆ|ñUA]»ùÖ"\†'q¹j4&l%àýø‘¶X®l+Y}$MD‘3ÝüP®|w¦øZ> ]è:%ç½_áÓ5ª×l†:WYÇJàìl6G®‰™`|fŠÍïlú ç–ëTX/!ÒB>“( )ƒ}c€LÂù(—4H: !û·{±~ÐC•œÇÆq«oD bKs‹8¸*¶j×V.ç^ XI.ò肦hMßõ³·ô¬]?"R­¶¹æ¡ö%¸²…xjåP_Oã}<ÝŸ1ëãËú§þl dL3êâÌøçn³ŒKLµò†\É?¤ûU·YëLŸêõ½ùÕ§WÇf e¡ž@º×€Ø(Y1·‹¼ib5#™çZâWUä²½9€ã¯ÕñÙgX£iZc„á«1íF+ÍTQÛÀ‘JÄ¥º”BVJç'2«+y­H—&Žö° ÝÈêÎ6´*MñgÆ<Ý€wÿ†äI=^0is”ù/óŽU)¨cúQçç!@ü´÷ ó2^ˆŽåf³ HözÀ.À{V…sl‹3âö”õ\´«ï›9ƒ¿‹-ëòöñ×s¸ìȾ…DuLI3¬/¹ñ™nµ“ñhôs=Óý’n)%†ò¸=%á°—U×äN6­ÔÓZXó£y¿f ö°ÉÊØùä€îRð ¯@ãc“Á>)á¹}ÕµKÐÛ-é@ÇñŽP6úDün¡\|"xBÁš·'Ï¡ì>ìvmwçoûøœd‚}¸§®Cظ¾-üwœLîsORê¡¶èIZ¥¡1GlÇËk–S1¯Ê úΆSÚ^©¯Q +…RH%¦U…üpÇÊdSeÃsð%mC=ãvÃÙÔ®­‰TÎöÃ@¶‡À1(§·‡†à˜#”áÒÊÊ•%NOL6Ÿq+m-tlTïÊn‰"¾èçÁhœ™…ífB¬›Åh –Ü~¾6ÊT~Zt(†{;þVšoõ™t´é²ss q¶ºœ—>»®ö'cMVYõ!ŠºsÉQ.&í0’ Œòœ^9sj"uF:Ó9úTÀd;Ñ_ ÆÙhy-e¶b¼l€ò ªÈ‰_æq-ßðÆâ£Ò¼!¶z7˜}—äV Û³“ ÉÿA<ÎIæÎðHÊÛÒElR·(WÃu û_ÏU¶X->˜Zö6™lªß?’š~:”kz£ÏÖ{'ÉEn0ßNIIŸ;5§®Akô½Œí j}É5ºdÇÝàt›/g‹à(ŠšEïuHH¾º¶€dE‚¯mFf£±Ø¸×>ì Sß²7›”±úTÇ1lzÕÎ-!p +¥ýó˜ÂÞýõ] ìd´}þ3ɵ½"@øû¬J‰¯GöÍ̽Óm2ºònOgq5£hv7碱ÈຬÌáAÛÀw÷¸À|ß$W±ýVI³$>!·'ÚáðÈì….´íF˜Ô?Â;€•7°ö†ÏÂíÓ¾ü›ú†}¨½kJ× 'ìCܹRËLŽþ-JcÇííñÞá.Ö·ä¿;sÀ¤<ô֢Р£öçžÔF÷ÕØa@,íÓˆñ¯»Ð»VŠD¥²z»ÒçM:1Übï¦$úíƒj;ð9º—u“û§8|Õ¾ Ê5;f‚<.B1GVÌÍ^Ì·,§¢Ì¿þ£=ÄÜ9}O}²êÕÊŽ´ÃÞÓ¸ÿ$]²¡y(R?tþ”ÝíNÊß}^ÖEJG™Ûð‚©zÊéз±‡êŽ¡²ª;QàGŠ)`î9 Çü)n»ÅiʇÛ%{@ÿ(qCx ‡²´ßºAÖš ²+þÐ…\°†—ôtg‘-æì¤9BùÞI[°ÅÿVm€V·ž|‡šJEl®ŒØkƒ×éHZg!\÷]ÅN±'¯QÓë8R¶Ec§¶a:¿çE|;y6S$¬+7»ÂF*v©F}*<¬&X¥¡ˆçf3gQ®]©@òúÝ“Ð#~'ØíKb”Ó‹E¡#gÞ'­…Øçö¹\ÊÕÂ>W.öé¨›Ý n¡ëU3!á}KCa7°BuÕ­®0Ç[Œqn¨Öî‰CR:Ç®ÉþKðB2 =9x6ÞPõ.iÇ×û1FöC¿÷P^wúmܾ¾]Wž[mëcË<˜òˆúZ,ê+ú%ê‘<æzm¡xãòš˜«†QÕ¹úç’'(Z“vÁÝ;z:ã½ø°òBè[I+EËPH…øÞó%Hùâw? Xã>Z¦Ç31ÍI‚äþ9E&}οTZ‘;QŸº™©Yó¼Ôô˜q™a¾~DÊ„ž‰å¬¾ŽÏ ÉåºØ1Ò!Œï÷²×жJo£ø¸2íQ½qätÇtìÝ5йa¢ºÓú¼Ùüš ")mdXoNGÞO¶7ƒ<”"ö±¾×!ßO)ÅÊhІü¢X>¯Pi†©›ñ•ñŽþŒ~íp… é~ è€Ñ0©D.j$8/<*ÏPU”µlºåtkéO£¾¾ŽÄóMVJû§È¿^À=—câ^°Ê6—±¤ˆ¬Y rWð¿Ñüá¢Ý‹¯ÇupÓOñîC[‘ÿ}%Ê«gÚiø=ë`ª{JbÈB~'0ûQÿ×,£ªQPåPS4ÐîÁªÇEEÀ÷>.1«À°qr‹€z5‰©#vC‰½ýÁgÖÙ:é€úï7¿R^U÷§V.¶µŒ®œ? à~NørúR Š'Œ×îZ Ž ;¬o±ò¼æ­–ÍQm º:4*=ð!Þ†ÑNø o©‚]t¬?TOÒa»´àt6u$¾Sç.×þ©Ø:5ôúæ„ÕUò³au®dêo—b5†j(sj4/kŽÉ`äƒsvO‘¢±Ú]fÂ÷I—`ÛþJ_œ>žsUÜ\~O•ª+KŒ=ÙŸpÇÿ–¿Ñ_ 0ÿeo"BýÌç¾×MêébË n+6c]ͳù|Œí ¢øX¶“"ÅÓ};¡ÜZ1˜"©?D}Ò8'§wNCc3A[ ZRãë:™ µ…Én£jí3ŸÑŽ·GD“Ƀ7GZý+c¤Ç+Œ»wúoó7›!£>ÇJíþi¹iH£+÷ænð`ÏÌ}ZŽ!Gíú‘cèÿª›Ûûö½É7gE‰­?—»“ (ÖCgQ¾Ñô‡^èØˆQ•DÕä¹u_3*Ço°ë5ù`n1½ )Ÿ¦&¡#ù94µ¦2½–ÿRìjø“bWn¬¹ŸÞ!àÞ¥ÀJ`,²š‰ ‡-ÁÈWKgj:訥‹ýµ©¨fŠÈ)ʉ)Ð,¾³\P®ò÷•¾ ψ€‘t .,é¬%™ýÀûGø¸ îo›Q£"¢«ö™ þióM@Š æ.A·ø|ÉÿòjœÓ‡H^)¾½ ŽÐ¾dÞÎiÛ¿wäþ¹|êÃL›MQÆJ¹®R¦råëì×Ïo%¯zpïÐáÁª Êôãv+pV.'ìQ>ŽšÐ?µ*Ñ>T¹÷`=JCÑàk <‡™¸Ùì|+Õ”ÏÒ/Ö¢ÜÌµÖÆ?Âô,Ìêúß~®Ï>«¿f4|J-ox Uò§ªÊþ¹x9¹׆¹Ù| E¼ƒ¢öÀ1ŒÇ-®’ÿ{|ÌóÙ#¿®pôûßtkP!{QiT™>¥~5ø÷EùÒgmöÙ1M†_ul÷wÿŽ”_ß}Ä¡ô_¿_+ÇÛ ™¦1Æ\cí0éÛŒÊÎæÐåÙ¼-¢SNo÷Rq‰m‹UägýV¬ÍÏ3[°H"”V­Ý’ïµR­à]rÐO=+û·Eµ¢ÁòÄX-ÛÔµÙ.İ{FÐÂlµ@¸y5ï¨x…\àF¯®`§óõòkç× ×ÚÍæñhOºê²?Ùr!K‹ ¥ÑA§·…ÿg+M ô'©Õuõ'µîã·?׋0_Là•Õ>õ@߆ÕÖT§Á—‹µaB/°Æ±=$M¥|õI[,W¶\'ÑÕÿ®ß.]‡éÒgfÖmÉõlëµl^¾éŸ>[0M­w€ÜAá ß }%™°ZWÖNç·”i­8̽;~ÌK®¥"ŠÐ“m¾ÿ^Û©!û…ÑPÌÓ;­ÕŸÑ}|]T‚Õ.¹§zÀ߀{+€0ÒI›+]nà{õè^mébýGMl„¶Û*6¯MFg=󆮥Éö Œk‰~®í=Ñõ4Ø/ ð÷Oþ›QiÝǧ‘÷à†Œ¬¼Ø›™àNVŸÍÅœr߯·,õ:›5íÿžH Ä–}U]Fz¨©k6ÿÈ_ÐdSºo1:\ñmvÓ¥ü ÞÄû¶Ñ§;¸ëÆ9Ïd—¡3%âsL¼R´I¼ã_‰ºÎA³q]ïå;¹unx» ú£,™®Z1ï«Å8´`·”ÓòMŒ¥è8|• w½ }ÖÌ7{ÍòFâV¡lGQäVb8cúk´ÁCiE´mìù68Åw¨Ë׺oeº'CÞuP}n)•LàVä6³™ ‚_7¼wœC¿QÖ ?ÕìÜçl6?Y\èdžmvqÊöøÿ#Ü/V>a*Òí׺k¿é#m5€Ýr:ì°“tÏÇ‹€¥%­M^ Q¹f™¥m@Ç÷'¨í-f[®;Ñ>Aüâu¶ÝI¼Ã¢ÿéq¶æòÐV žj·:b‰6ƒ”Õ÷ˆa¦Ú]"4âyW Uö Ú"Cb¬tLo#úÙì§p¾/~¦nqAÔ‹0¼!œ*Y/^({"S»Yù±ÆûïIlʤƒÐXtvFô÷?5Z6ð]´½ŸÕõ›ËîA@ÃJI|Ö󉎰úv„õð÷ðb0"»™å[)­Ïƒøüo"Xqeâ’¹ùÝs¦ôœö™’¯„Û‚‘ô(|ðýMب^¥^«p]ãÉÒ î†Øî_¼ hLË÷ò;è«À$þMXFž«Àܬ± -ÞUÞ—ùËqÔÍæ:¸}2nCbõF{_ý@뉗 ã+_}ÇU¾%¿¶¤ÀïGÁQ=)•õí.Æ[ìñâsȸÏÌfïXnw94?Øï&¦¹]£v¦ÎƒÏsÜhm·1:[Šö¶PÛæ¼.€ß%üíøH/c|å%!êJö± sÐ$–ˆ.K¦ÈÚ©ú«Â&ƒ³7àWœ!¾K‘q·å½É[âßJ¥'—Ë¿;ÌM†Ö™n=ë2Ÿt•Íq|÷¸Wôöù/³“á[À MO‰ÁýŽá2&ôxúû@Â,¡¿&ÿúkËfËæÊ)ž€ñ{'[;a|žêRµÆýÿû\ mv3V÷Eý-ˆ#ÿÝÐÛn$-œ•ÅlGßàLu¸Í-ŸB²ýêµùÇü½ø ÑÑ1LŸ#îÜ'+ˆ¥ùÏî¾l÷ ¸§q ©ëBÆ×š%òëË FWb!h"@ò¥W}Œ‡¢|^çqKzU©êLjO@¹ÏM¿°Ð!߃X]âI¸Ÿoƒî+Ï®/Ùœ`®s±Wr<{ŠZ³RûÐoÙÕÓ.Mùï„€±Åé@ý`J!ÉPÌm·ŒÏ¶ãñïPùàî¶¥ƒžVz…×ê’­ù¼UT LU– Áe£«ˆÈ÷>—I'Œ=Ÿ'M%>~žôìS±½dïïÊEDÑU¸§~õ=”垤!¦_‘$̸ÂvW)4`Lfl@q—YUCéŠæÓ/ŠÐ“ôð¬ŽD̃ð‘Õu\Ÿ+ä¹kzÏ}Ïâü.e‚~Ó«•p6¾Z“ n¥@R»ë†ßÛ0´ŒýóÉ‚»2Kþ¦4‹Ëéï¹ÇÝök>ÿ=‘h #ïDeí@¯$êUÂ> €Ýs!Œ#Ð/vúe0ÄÎFL4!‹íÿ ¡oyúm%[ì’l:Ò”÷ã© ‚$GNóZM‚Ýê÷m?«phD°L©‘“k)A^ã|¥âò8‚!6IESÁóh§Á?‘­·×µ"ß ?%Ÿ¦„x=D1¿ìÝ`¾Ož< 7#øbù×–×-r7†jâÝ"­ÅvÜ~ãè÷ou·Å1ø\58Në-³Ã ‚Xx.–¯s!y]#½Å´·G0ðø2òÊ=TÛímß³’ÝÁwÎfác¼g1©|ƵXÇ´ÿ¿¸½Iå¡0€º ¢áØ#_òIB1GÞa_È!HúûÞ7FñÊ%ò˜PyÒåüºômLq¹âò'ÐÆïãùqÜÖÖ¿¿Ùopp¿ÒçùOÄáXpÛç*²›ÊœÎ„ÞÀçÁÝs‡røãvQƒs“ù#üõ›b§u½f?t#ý]%lùF£«âü”Æ1à”@qtß~בҕ‚$ÐOvó³ù‚#â@b¨#éhÔ„4CÙ1m ¾ö²ås&vnÒF·Ñæ¶PÄFv¹>cOS¼ë‚›ÝƒFnøø‘ß¿%à…&n‹Ïíߺ"C©Ë³7c_n«kŠk‘_]ð,òdÐ0³Xì$‹¬ôÿ=‘ùyé(ÞêW™‰LSΊ„zCjhU©0wßš»NFZ(™Œ¦ ?tvöþ+A!ó +xSðRºË©-À}›oÑ¿ ﹟©Ýµ‰£,Ú4ˆêÇsjÍQ@¾“ñÒ´ý$é~^xÌ%æHiBæ> ˜áþ[¦¯ÜÎÙ-µ±ÍÏ©þTº¤ßÿw‰îˆò×w‹Ì¢án1·”b¼sêu–“¯»+%ttzé¿ü«êêïp®pW.gÿ¬ˆãœÊ§ø¸Ÿ‰ý†êpÃ@ oãÚ\ñ9Õä#_íZT̪»5þ“nV›í)/Ÿm”îlú߀ï¿æå=˜³º+YIþMA+ÛßÞURŒ S‚7ÓÐ9Xñ§íAi–’B+3!.´ÿâJ`Rf‰ŽÔlFÀÛsÌ×–°ÿî˜þnK ø*'~Ö·îbâÛV[?™Ÿ;pg9¬ÄGsëbµ<–<:HšÚñ¹cÎeViþèþ„q7úÌÿq.GZƒ÷Ƕù÷·\òÌI¶ó™Œa~ž\î£gl³%£Q'~Ó˜‡+û¼Tùÿ0wÕŸîWÎ3ØŸx´¤QÌb®îÞ]!Ò8Ûk\3$ߣˆ’]Ã¥»3%â³Ì¥$b;H[Üè;X6÷6ûFN±Ø‡}9×èÈ}üóÅ\Ù9eirZŒö€9Œ|F5ØÇþå·”Wö‘:¬++M |)Z¹_ÈgÖìˆÜZ-k+SžŠ„×3*8ÂõàÅRT³ów±6ß°òꪾ»YWŸ×¯ãœ“Þ’ºOÍU¿kå{÷3ï>™0äN6 “„#ªšÍÑhÙ\¥à=UrZºnÄûyHgη•tI±<¬\¸µ«ÖjûÃÃ5:+}iž ­»”&—¯MûÖcíûSJvŒ*&ºg7ެS«öŒË¥òèôo$*ƒ£¾ªëdÎÏ8ïÔ3½1Ìa§§è¥ð¸þ?ÀÛ¶êBÐVÐJ£>rl²¥S:[¼À_ü+*Í™Ø)©Ãõ.¡çäÞJfÈÙ1®RŒ}€xžýdËÒÚ»ÑçÓ\¥÷eü>æ^OKr Ÿ%{ÙΕdw¦råü„žòPð ‘ÆºJ{‡"M±tÙÜÝNÏÃæóÈ×{‘÷R,@î¡"h–{+S4Ìuöû²>¾ÈÜÚlþó³`޼ŸVÜÉ:ËWóœ[¨l¹ƒ¼-TjÉ÷’ÿT¢¾SÒ€ÎÞLÒÊNÊÛrÉv˜ÛB,¶$Ð+âñ“<¶ÐóÍ,߀ávÉküŽ F¹œõÙâYl#ÐÚ<ûÈþÜj£‹ÛóøÜ2§ÓŽ_ºT É~á+å ¹VÞØ â®JÐ×Ñi€×™ØÿœÍeßøkòüújlÕ)ZйÁ0·ä{`^𸇜kƒ_Mð³½`6{C¤o® çHüñ“êINk2§%Þð‰ò% Èèí‚Ëü…+\ý5W³y/×âè˜Ý_“³Æ¸îw“óí}^z{£c}ŽxÚO:t1ËœbXcŸp¤ÝÝ…H¤¶Ù«Š€‚íd ûvmOrб”ÎãþFùµø#z@°àº0ÚiµýG%’ëEieT“³–àÆ©v¥›GGöZíMœ nWŠ‘û¾§ó^r›»µOtMÑ'úg¯ Þ÷b€¯Ø‘²¸>%¬ɶây:Žï[cîå×n–½ÒÙ‹¶U$uâg)TúXý4…Ç#»èVcTXmÈsr‹k#Ž·åÖ¨ÜQ×ÿßã£=^©oäBøøË.ô=„òSO»´‡b o|!)~iSni‡°ÉឈͿ’6¾ÚNèÅIï Õ„² ¾žæ„줕—œrârûøäåVwO€üU´/f,hIz$ìƒçZï ñÁÆu¥°½ “ïϿ̞ý™×ç:‘¤ñXÝ«€v°–õË?W÷á-ðu8Œü·îΣ¯'e9D?fÇ)Ä8ù^¢Ekv—2‹Ð~„Æ? (‰Iït%1›ý'‰Ð!{p¿p¶…»³­% KÖqÛrçñË;õwñKçßà ®új¨O!§Õä‰de)ÙúNøfÒ#')ìY=,#ºëqϽ€¶Ò›&}†uç °þvÅ ÚåQ (ú.yY‹é¤ëÙ$¾ëz=Zt¢ÙŒÜ.#´¬âZèZ9i}®ã{îÛÜÆá9õç¡|BÞGþ‘,¤Œ¡”§Ì!O!%p`ir芮o#1J/!<у<š¢ãó|áC‰¯j–TíóÒ”*¿ìlÍ)ÕàÑïâTñø\-ŽÆuZ_´Æ+íYuûgÌ •R|ç²<¥:9`b[7ô¼é“éó§Ë3§JUkÏËóù)c(GÈ2Êò-ò 8É#>$–ÁÂÕ¨€Gÿ¬\œ[܈±-öá¤X%þ4 ¯gÑ—0#Œ¬ö)òM¤gêó «5DŠñ8÷}Ï-%ºûMZðg‹l¾ÃðÑ=„0“³…ÿ›lUÉ×àòYò²ŽœAŽúÔ‘Ûø-¨#õFzŸâÖ/r'õ­-6É¿dªÇ hÿxÉ/€ÏU2žŸ“¦ÈßJ¦¶)‰sƒ¹5'ûçñyD÷d¬_\°HÓ_ƒ<Çù½îÚË÷ª,1Ö¿Çn€Ãþäƒd 9œrŠÌû̽íFj΄þ& °õµòpi[ì·P–)M ‘ÁQÿaÙÔ> —Ä–TK¾£Ä>÷¾è›ncE³{`ü=‘ýœs/À×o¨?9@ŒïÚÇû·¸¼ÈÈ ò8€@)þæ¾~£}N¢zŽí ¾æ`NÚE.KÐÓ~VX¾¢tZ4ÂaÆíXÚ©¸VNÏbr½Â2ÕzúJƼ@! §Ü[};í6Êã/}~ïa>w9ï´¥ñíÚö’[PÌàûWkÉ‚Ró¸«Z›C€AÞ5.θÞ?ßìÔì‰kVwùo%‹%Ë%¿ËòÅY˜$?tvžt„,œÐŠ+Ögá Ù.©9q­ ½¢Õy,¿Æ¼œÕ@¶gü½´÷’Žm±­_3ŸþTç³éðHÎ_ÏL"÷¤Rî‘# ˆ§Â£`è#´Ð78Ò p[ij¢ð»\¢TX€aÎç–TW¨×XšããšDŠúáR]¢Šô-çWèRƒ/Míg<¥‰ùñ´Ãay8y#a9‚Ì!/ƒÃà3%"à:ß HHB¾%ó[)‘oìW£Î)ƒ¶ÿU€K'f#ö`–®R„øMße1½kZÊ5D ‰º nÚ­Î¼ÂÆç½Ø˜¿l±i«Ý+Ľ ¯ÒŠüîùœÀË÷½'£ÍÎ!&ï ·çÿÿ接»Ç‘wÁ/à<8 >_*Ì]kÜ®VU?õdÀY€<—ÎøpgWéÉxÉL¶#µá/àjÂøùZG•RÈy5ÊåikоÕý7›ó²û|ÊÒÓ~ }ÛûTð•aXßÃv\¹˜Û±5KvÿÓ˜7€ßÁÉ"rO¸6\ N— sWõ£[]ùwÂùÅU(ðÃÚÒM(Á»²lt°Œ${© UlG%|·©©3-w+òœÖéQqë{LžÏ¥]¡ÕÄçïKëø¿óÆq¤U~ñ½Ïàøæ0®ó¯0ß?žqŸÆÄÆv_ßPÖM.düè˺[³c¡®yÅJõeŸ]îÞž<Ö©<> ›à=¥Ä)}uju ÓZ̈ •£Ø§ ùµ0(:-e³ErVÅIÝúÈ×+,ù"ÿÝ%y²í’ ÙSü„”-ÌÞFǸyÝŠ½d!±q®•ŠF³¬¹Ì©,-;‘Ñ¥¾DEŸ7—½õGÎ~Îö@û´¦G|"+Ÿ£5ˆiznoÿ o‚GcãúzpŠ¢ aŒ÷<+%r{;òÆûñb÷3¬Ô¥2_±:°¶€Ñ¹¯ÊNÉ·¢\¾ èž²R÷ø¦ÔÊ ý‘tC=”í… ¥¢ý(yzYtÞÆó÷«ãGx–a{s6q&ry˜6öt±z=HR¢W)1ÿzç#ŠkÙpwüÛW•à 8>]J.wNýa ½†J{éæ|™sZÎ>m˜/9kx!’Fâ-‚Fâ#’é „†¼,ør™Ê‹ïô,ßÖ9žkËŽJTÊ6ÚNÚ£ÅM±Õ]â›MB¾HЃ¿›°îk6#·/ xSJ ލÏXö\—éËúÂjx/À¸@éØf+­’JꉅFïUkXBÀŸ.BKJÛ>ˆ•ÀÙ#åF‰7е¢!(7¯âï¸ñSXÛ@³9±ÑøhÕXù`;½ÝÛòìÆ ãã7âC[0pøY0;DàÜ'غŒJ^I|š½›Ènƒ×j÷ 2z‚]ëV‹û˜ó~ö¥ü. éÏâ#`)a–Žä”KÿÉÜþ%Jl6ïa&ŽÛ' V0ÄOeÛùÇï#D3¿› ‡ yž îX¤Ø#])¨‰ÍÞK²†a½I(‚^kÅ=L—k7{Ãx+íšE K€J P¿†Fѽ{í)÷ò€o›ž{ë÷Ö´¾§ù:ëHybá¦üm$Å̧}d*Uü¢üc=jmµ1¬dº´x;î,°£^O4]~ÌÖrä7­¾»¶hið”P„Ò¨@þÿª"é<]›­Ÿ#ú›åTo®¤J4OAÿjIÎn¡êŽ¯ÅšÍÁH\Vˆĉñ¿-{8ˆü«ÒßN ÃQ k{gÏZ²·G‚·Ø>n`NÖ[~\e ¿öØ 2ä§–¹2­ñ<{Þ¤£[i6¿ZE¤_ÃȽŒ¹u´›IbrÞl~@Oö v; =ð q}²õà^_{äþ÷Ïc¨ÂT¶´ƒÁˆ«I9³¹ ú F[˜Ív è÷®Íï­þ{0Iæ ¢q‚ØÞªÙ¼Õw èyьִøX~Ø-âÖÔ¾…çkX‚Œá í[â3µo¡\` Å[Ò]yê1ó±“P’¡X¦ì¦0î>ôKÐUÓ¹+¡ëqùkx‡ÐÙ—-¥~»=ÜâcÛ¹±¸oÒz &'^£uhõÆ¢Ñ[¡¼ì#`ñ8æQ¬bú[ñ«¶ô¿m› `^ô•8|$A¾Yµww­CA1b8R>cwä¾À¸ðj§œ¬8¦+ãAƒÀˆ4 ðp an>wXÐ=´f•úFv’N0 ŒØ/–$ˆÌË›/ c}Ç–ÃCÀÃ/Á[*Šö*ðübØ|€ùæ=t ɚǮΠããŒ-ö6[ $BÕí¤ùR¨¥ÛF îB1/îlèfã$ŠÖUq=$.Ý"ÿ^økí@Ÿ[­´¤µcÀøÙFq9t¾˧Tx%jÕ3.­¢h¿qàBisa””ÊÛÜ΢ÁUF~E»D{H{B£ÓSèršJÌxþ§ÑSéÈÙnâÞY8¿k£;éEbéCKà¢Oû1§oÝîêœ\:¾Vk_ú–ð¬ÝŠ[·ØAÏ(¤•"[È rdÕQw¨ÈlŽ\ $½Pù²uQÌÏsGòZ‹Ë‹5‘B•`Xå’âmiÃ[XòmŽâ-¡{ÓYô™‰@d5çd_dµp’àkqè®\7ðÎssEá{Þw´wnja_'«ëk!n‘¥®ZÝZ’â¹ާº–ò1ð½x)¯•¬±2NèóÀÉ@{¯Z“½ô÷EËÕün м³¥©bB÷{›_…SNô}XWÐîpý¯y“E—FÐô_NâÊ€^E·ÜFp¤Z†ß\@=ç-â]äeñ†9Z‡Êé„ÍÕÂDû$çå‹U§/Ë* ;Ð*{ß¶ãs$O×¹G1Ã=¨…òÓþÿé»O+½»Øí$yÒÚòj`?¥u¹6Ft‹é«®()Bƒð™*l´Žáf‚“S.Ÿ&ŒXyŠ}ˆõ–}Èïr+ƒö¯i4º’~‡Õš_•ßHRKÎþÒ “?„ÿ»’ƒØjéuI7t¥G<6ð¢LMì—LmW*^·–ðË>íùÉÞões..õJ÷o1˜Íï¼7y³½N9´æF’ó[2€Ç…—åû*«Bzì(®(,¹2$QIr`ª8M2-úÐÖãfç 0GVò¬æ{ŽXP¼Ó™˾î”x@oÅŸC‡£·Ç?^~c•Œ–¿É‡‡´Q>“=±M­^„>—žv‘WÔRn”ñEѬ>4¯æÔªCY­9Pà(;ÝåK´Ii~+<ÿ€\Ù®-¬mdÿ\B=€Ì)q3 ³Ÿ~ÑœÑ Œºë%iÁÛƒŒb¶¬™ò/¸N~Ba6×eJæ)³B•ªaòs²å ? FÀû‘ÛI€¼§\AÐåùJÑ8®™Óšã%Øü³E|®„3S°GOiÞ¨­°²˜©"½'¹%˜s"î96#h)#…ò:rIÌbgçt¸5^fKþ¿þCÐ*σ‘í ¥¥ƒ¿É‰´ßœZAÇÃVmV” ú»©[œ²~PCåué_Ê¿•fÅ«@‘øqÀj‹hœpDÓ]Ü×üÙ[p gr“µß])³£š¢QÃz8}xîK^Ea3î.Î4.M˜ÙµÒ¤¥3wS³h‡¬•UÁ`17ÛÞJ¨"p–pl_Xµ†Ù?ß3ï´§$ºÙ­Cþ v÷oZwòuk Ü´Ü~nï¼p¯–â„ò7ÕÔj”­•Ç´W²û5&¯ŒZýVø@­Èö[ÂÑ{~&·r¹‚@÷í¤=‡õ®æê2‰^ÐB´"t|dš¸¿ð‘øWaYîa‡Aó²nòH¼œ•k$rö œ‹5 ýÉ{Ï¿‡­ ~)ä`ª–º2 Õí7â%ü o‘ÓŽÒÜÑ”ež/âúzæØcÎ@óFn«ù4ÃÂSXÙÚ2ú1~b¾çÍã –p`Ázå•HwÄŒ‘V5~‰ÙÜEÄ=–\±]«™â?‚¦(W® )—"è+,8ʪ\1£ÂïòD¡—p“hOðÁ‘1èGe!Oн=ãJ<ô—þâià1sš=kñ·8UrR´QÖD<„*¨Ë>E@¡iëUÖë 9’J%w#ÓMh^r$ôS ‚:bJJ¡ þJ¢G‡À1¥àCW)úA0Ôê_bé\Åuï'&]µK¹ý£:sœ(EúPX?¤C…_ÓÀ=Rò odpñò•õ…da[ÉEÅÑ@¥–wSæÉªFň+‹üZÜúÜŽ¢Dn!÷÷Î_pŸÈåBq ¶G“ƒýTw_dRL' ãR÷„X/žÁÍe=%¬ÉÝò BV•¼x½ÁfqåH¢ÏÀß~ôE‚úB“HBÒ~»v°ô:Kðµ`žD%øºkÛËðs¸Ç'a®ƒz um MÀò«bW÷:¥HÝ`§ÉÙ—¹6“4¹i¼á|ªø;[VS);¢ˆ‘Í‘ SŠƒù!4Õ Ñte®ø±"'ôApùf¹lœÇÁ Ы­Fò>BŸˆ º]‰G|¬¦3Þv«ITPÏ)¸ÛJQš'Ò†³¡ñPè5äCBÚ‚6’v‰g1)àØÒHXŒâz‰m½…<†¼û“J‰Ôh šRž çâH©vù¾ó çÙÚeA{·ùZl2ÎS^ù,å0åÙÞV¿…­QU4™ÍIr…œœÆ =¡œ© PN’oRíW]S.í&JƒƒtÒúÒk’*•ý Íc”Þ}~«ÚU¾RXÀŸÌ‹¯´¶UZ•½)óÀ(a1bÉ.ÙnI;€»õ­‹ÿéQ²pDîÖ8¶§À®Þ6Olô3”M…Ö@5—CPC‚bIõ¡ÙÀ^ žHº@šÚ1kKô ÇT!è{HUvòw¤ëHžûɈ[Ó´ö¾gÐ\4ßãX ¸šwYãxòÜ…ñÖú|îɶ°ÊåAš C“ûŠŠŠ}+‚ÓägUUCîreEAðïÁ«•¬°”À8y©L¾[v8´¹ø©Dj¬ògPcñÝÀ*_I˜x‡`Ÿ%Ȭ/,Óòy–¥w3¢ÚÝ‘&ˆ-_©ŠisàËžÂ<Ù&ñc~uV\±˜{R×4#²I*€³yÔˆ4…´€EÚKjEÚ -ZÂkH¡äK /\€ªâx!=iós ‘çK › ~|‰˜ŸÀSp]–Òù~ðñÅ4[â¿Ví»tiÙ¨ka˜·¡¯g‘[ȨÖJžSÄO$ °»^qSåè­Xª¬2R5/äPpåÀé*EÐJålCÆÞ¯‘m•)e7E¸ F Wº^¶VÄvàå' ³x0ç¬é fÒa¢?À o$Óû 3ùÃ&!÷G dW`½%AvÞ ?%Ýø¾¶¤bý%BƒàP€ð@pGC ‘~'õ"!%’:ÎC¯áÝä"ÒLH]„bH[c‚¯€O €#°jõYµåòÏØÎû=ü?î¾>ŠdÛ{ZÇÝ]âî6™Ì$Á5¸'ÁÝ-8Á!¸%„â2Åu[XœÅÝ=¸ä«™$À²°»÷^ö¾÷½Ê/ÝÕÕ=eÿ:§Nª:$¨*f8˜‰%+š(ƒ½•1ÆHÅq§·jO¥X^O¤ìí~Íõ€k–ÜÕw¨_¦*[á+k){,Y+uUõ‘åJÃ]¸cÃã.ˆå|ª;9‰ü]¶D½¨ÕÇ|.×±'Àü~ap¾1ƒ!Êà‘¤‹Ú=8뛽É!»¹Ãü#ìãÛ±z%qO˜…@¡©Ð8HŸ>òáø´’µ‡²ÑFÈ.¸š…D`Ò Èn¿†¯n&tCÍ€°¥ÃmhËk…Ÿëâïù>Ÿðø÷¾ÿW¾ÑXœþr€ùZÅ0óRó[«zƒR«`ɧ9õsi­ ÿ©Í¶Æ‹´~}6‚¹8›bÉtšØWt[ï+Zœí§•1™Š¼dy»Ë~É@ܾÞ"^\Pø¸pYnç–/…¨p¡2RvJ:Xt Ñìóévʲ»9?€®ZzÀÇ¡kp´ šãH ¼sÑpÀ«««÷ynOŸ…WÃîj , ¸C­ àõ# hB6>[X¤)Ò®)TØ£KM¾þï\ïP†²æná¬ëYîËÊLeMÙ¸IsœF)‚d×åžJ›ü£ëcÉESEy¯%²Ór“£],wغ‰“¤dqÒHéQɰ°¾I“Öœó4¯{­œ^—Nè!Y¾½Yؾ`‰x£t˜û«.‰š%Nãk‚žpE¼ýL ôµ°}î(¾gÕŽÏÿ½Z®¡ÑPC@½2„v†a÷À ˆ Í$trÀGAK¡NP˜=FH8§¸ä‚’õ|ºøZþÂùä¼V+ ÿ½|üoý“æÉ2pïm¢ éUùb¥HeÏëÕ¼¢Ù…mN«4¤·%*é ½]‹Ì©˜›ûX~[ÖObד4‘p›ï6Ð%·:y7ݧ}Çó7÷a»öÜà½ÒÓ5Q Z2S}@6°xB#¡Ÿô¹8N÷±íDeŠR$].lÈïÉÂ8O)~äHÍšotÝwGuR­=æo9ûû¦Å@‡–Ä@jŒ¸!¡Ø,`Ço’Œ6EqtqÞZOH€®Âï*h Í'¤@õ!Þt,óa‡Ð4¸XQ4¶À’‹yõ,|ÿ?Œùï­ }«Ô?젦є*ʦç\ráJÁÒ¼Æù¬ì»Y}»7Z›¿úsÜÿÓ¾Œ6ʹCòÜx®’‹…ü‘Ô,{$®º¨ª§ñœ<~ðñÅxù(ÅAqtb;éévå9.-O¼Á¬Uî¨û£â{Ë|7Šƒ Íý[ÔbN‰§Šê)ËB+g¼°P8µÑ4ñhÅZ™§4Z)÷DÌÙ‚4êxÒ\t/Ð^EqÜŒ¯Â»}‡ÖG}Òßûf#Z~s5‚†A:$N‚̰+ÒŸŽ‹± Ä]DÚ‹:»a!è1xú¾ OCßÁ»1ñ¬²Oâöa‚™êAkû–t‰¯Ô{u(ãŒhWÐÿ4Òué£d‹O}cåYÝû¿_J ¤–±.ÐRÏDÎÒ ]GʺÈaÍEUèp쬦7Ä“TÅqÕÈ&`þ¥Å<…K¿¥N©pèØ¢%¿Õ¢û9½Ùâñâ µ#q:øê¤ØEê/†ù81-$µXº¨ƒ¯(Fæ%fÊZ Óysæ:îlr.öÝŒ6Dßcï‰Kþdã„/tÉBhì ä.»Äm_ûiïÉk®¡óð4È­A¢»P>’…‰‰©h*Z]Ægaq9£ãIH&Ò‹GÌh7ì0š‡7&Éçˆ÷H¤…XžˆõBbç¿Ës>—ù¿ãëOOf¿¨gÿç) kyƉýÝ2‘¯ìº"F1I)•n«”U·}¦ÖÏ0ÀôµSÀûX`kø¿ç‰÷:0‡â‡t9L0ºIw6#cfÊùõ8¯w”M„¿ˆ ýÀ ¿Αn`YÈ6žGˆÛ‰ Éô¯tïui ¿ïð5XM&twлó~`œÕ ºFøˆ^EŠ`ÈæÑØ~t fÄ`\ü)r^„¬ßb§Ñ\´>r)ÄÏâ÷ðKCh”2ò jûþÍÜ×’PœJlAØÐ7H$\ÿ‹VV—‹ÿùû_I6•ÔCÔíŽöÓhSsŸð[*®ÊJo•ý—3U<÷[…UE/3Ê/RÖÄU·ê¥æéÏ®­KÒŽÊ™¢vÉ-Ù)ño™©`E=oœ¢>ÿ„°­ô/–}‚*L£¸¡6Gon ï'v ¶Å÷ã_ZiúœÂx¸c¼e!~#L…Ó!*r PûxÂ*Â~Â:ˆ߆—ª 44H…+¡Qø3ä$´p‘_ÐÞ˜]³eÃÈ[¼vr[æo«‚»rJ‰þØ5ò Ò%â=ä0öÑX%L†‰_´²ÏùøÿßçBšKëÁ˜ÂÎÍf-âµà[D Ï= ÆW«å ªÖò!m‹Ó‡ÎÌû}Iµêß?ýôJì…önp?(y¾ôù#]º,òÈüwTø@ŠÍ\GÞO<%ç-µrd“b^ø¯Ä*l3š÷MúÚkm£îûÍp“Æ…MaÚ øÀ}"‚}¡±p3(ŽDG¢«wðì%¶I€&`:œ‹Kqì=e£Zt5¥5c“p3*Ç\ñ[È;ÔD’P{SvRyhgt êtD®ÿż®³YÇŒÁ½Üs[*Eä‹¥Od U¡¼ŸÀ[’ј²HÃpªûì)þ Ìû)&Ê,¿ä/ÎÛžu?«]’€2u~úŸø%`|Ç^Ä¡‘Yûij{ðÉŸ´^}¾‰8°™ €ïV~úKƒ‡TÀ•ˆzçCá_à‡ð1°{ØŸŒ©Ñ>ÐføFÀÝHB¼ 2—c-Áª± p62 ŸƒÂÛˆÈûEǘ±¤¾ð^”ˆ/"º<ÄaĹøUÂßY‰ö¹Nþó éM@¿Þ ±(_È{.})-PRì x/UB‚Ru…ºYšˆ/0ÿóòm™Õ¡@ ʦu}—W@/87ìµóþn%SÉxÄRÙšJß$¤å"³ý1R`A7º ùÍчÏ#l…6CC¡ P$ôϽ°NX)\€ý‚H1"Á.`<…ªàŸ°«hq)½ » QX=è<á<,‡bá Ð~îÀõ¨‘ìaT)ùWĈg’%¼Dro~[rÍø/åîùý±!ÿi?þ­Ü¬bçŽ3/û8˜tšÌ ˜-Žu­®Î÷*-UŽþDÙ×”ñ ñ¿ïø†Ö oèËŸžæQвæö+äÛÅÑìÕÝè@ëÚÍ,cdY­õ7$ã„{„ET¿NJ@ÚM,GK/K˜O¸½BʰP,™Û%Ï"ÏðX(¾­ ¾Á:#íàèF,àÚ ¦ãj²sI¹Á 1Z tñ‰`î{à)\ «µ„ £Ð1è,¤)HYDlÎÈ£ãÆ|²‰óuNþ¯<¯``‡þÎâ„òøó…ÓÙ IO°¶yŸh¤¸nÝ3XÀ4eË'ôÿ¤äfÿà@*Ìâ•óﳨ'+_€¹×sìwnõXÛè‡éyœ‘ôÃ`–gñ[«šg:f¼þ{*´9‚¹àD_§ ôA²J¤)Ó“Xì*¶mN<@²`Åh>âFÌGÕp{x o‡Î#­ˆÉ¤m”áT%©’<ŽX@~‹ŽÅ½Étü °ÖEVõ»“ØdHþסéŠìûíSž;ö]ý1ÿwBÑÝYá`þàïÀhÉë-ÂëÙ›ª­qûU§ÿ„Ã/ø4b¿%‰“îv™Ì.Â%ù²£¢båsEé=‘+o$g´x {÷Sá/T!ë¿£ƒ©KóóýÆJ‘“¨'èŸCýÐv(Žy¡ Ì +ÇÞÃÁD˜ü F«°û`æÌ 7ý°X¾žm£¬Ç’á%@LÀó)Ñ4GcÑ¢yÕÔ)Ô8 ÐzDgìfQ‰¹ðZ¸,"‡Ð\„ïŒ?çèÏ|Û‡ùßî:ж‚ùìzlîNv$s2£œ0_°…ÿ–ï]«g+èþƒ‚Î3%á<<·K†8…;Ï’ÜS _‘ÕVIÈ*cÙYœÅ¬ŒŽþ²/¶úoÈÇöÞl1t·pR“qòâ=8øƒ_ ¿¡€^=í…çáÔrÒ9Š/ņÃ\Nê‹`þtœË:еōÄHl">„œL¤á_ÃxO£‘ü@[Øå“q^Qbïmè ì)1È~ºÿ@ß©³ÃOþ?@ØaZÙ{Ya܆ô9Œ_Å]D „1b¦Hè÷®Cûöe»m¦Rk¾|®ñYjîK…2m¬H!] ¾¯6¹ºv 6—5hѦÛízm˜­8GÙ½é™5ã4”óæ› "óïã%f³Õ`mS<ewÛf…Ï‚g< œœ¡Cà`=º;¶ã“Ĥ0ü™I†ÑÉGð<8ŒØ®C™Hwd6ˆœŽÌ!+È£A "|©§™b’3àèDÔý…~üÞý ‹Ç†ä|jûÿ ?ïM¿[þ¾Lÿ{žš0§r.²“x‡XS¸ÑÜ ÂK¢J‰Y|Q𦍙EýœÓWr­Úÿ˜+Ö|Ãíä}Ô8Õö€Kn/C¦…lS“WˆæÇ­kIýG '¬ zt»Û×ÙO—¹ø,°xì¸Ú}uŽ@Øþš‘m””+H<“ц8þè, ?FêŠ_$Î"¾Æ›m¬\êP*àß$ñR…ŽA™Ä€æwabø…&RE´ù0 àA§·œ ]©Ý$á_ =†í$WÒ–’¨Ô[T6¥UíÎÚº\ük÷T(çÿ :;M˜ÕLgƨÇìÃÒ‰Ò›%¹2ïoHé=å§TWUß«…Mj°`V”#œêšéK ëâçå;ËU*½¡Ú.|⽸Ouõ~N![o…¼€Î!rx6À{ø+Ò@/?„óè…ê\Íe›]½J¸N:À´‰¬ll$i¾X´ƒô!‡+0~8 &ÑYȧ©(×)m‰Ù¨ö­¢GQÒ¨Æ8ò¼3&$ï'9‘XcLŽí‚ÏpÇ‘ èGVàsæC:ʸÈBY3‚R}¯±µï¢.Gÿ×î'“Y\Æbf;v} ÉÙw¦ö”Š Âõ+Ýò”M\¾J±Vùçeï%}- OwéQ‘ëQ)™'[*ŠLxqÈ, {++`.vPtSÄ =a6²’‰fr÷}ÁU „T°¦1Þ V5Lc²…¡³×á?1:ÑoÁ‘@N“‘rHÇÈ¡¤ÔHú[òaÊJ=<uG"7¢^dÒétý,©»;Û•–D¦Ò$äØ]b7 ‰LÜ ¯@¶â'ÀîþØ¿ŠúM{”iOPoq:|Ñò¾WÖ/ϳýÞ7ÿ»Ã'©¶˜ß0ô`|uõt®·xªä<ÿ7ÁÐZÙÝS±`ÞVV¥¸Ý9Þ±jæ[%Ê“>ï€_4Øí^„Y»Ð3G* | Nwl F@»˜7@J×?$æw}Þ4’ïÄy@O ù$Íï ÄÀ±pod.ò¹Îš&qåWà ðà…«¸}ÞACÚƒïÁãC)|¶–¾”êL6’’h™xÖÈóà_°‡äרpüþ„dB“/‘–_àg‰6ä\^ÙüâG‚hÁðêN¡æçÓÛK=! aïçw¯í{¾UB{ØkØ~‚nuõDGËýÞWÿnø¤õrοË_ÿîÀy%CÇLdÝf†ÞŒËî&î-ùYÐK`_³X]](_£àÌO€Õ0îl’Ç¢&¡©òN×Â{=Ÿää1FêÉ¿+8.œÊÙA»BŸAi/…í'ÕÕ¹„aèhî†YÜÅoÿ§ñátÂCø@„žF©ôŸy)ÉX GWâ øЛÏ"Ÿ|]ALD Ñ, ÏA–!3ðQ¤CØ:Òz¬m®Åpjê…–@®`ÆVBŽ¢­!þŒ'Ë™ãÁj<Áün:ç0¹/ÑÃÍov 2IÝYRÁ.Á¹¿Àü=|¹„T~Q‚º’üç÷%°ì/þÏãù»1¼¤¯amcíc󦼿b«è”ÐC|Œ×žðC» èñ q_,Ùiä÷ãk î¦€EMµs’"DõÜÏ;øDØ„ÀÝ.ćø[™÷y»©}î1šˆ\ûªÆ>rµ4†º¾ï—'ÃEF ,$Œo“+šÉ«Ù£°"xµi< !.Áš“‡û³Ÿ õ`3þ4;š3•ü{ÏÇEèMä6ÚíHÙFn‹Á`Ò5áOð-h[b[l ?>ÉäoÜÙñ”òaÄ!lܨ3Y”MÎáÞí¸p79z·ï—ò9|yüaÞV"rä  }`ë?* îrËqZkÖ;zàÁÞÂw¢_yG$ö}¦v·âô’°D°b Ü»&äÛ×vq_uUÐ7·ÆnG}R‚ÎûÕwC•Dk4›\Q^w~/( %)ß8§…‹nU] Ü xÍOd'Öj¼ÓˆSèBB„î²´úØ ÔDö ŽÁ÷ '²ßÊŠÈsQ5zâêPJ*§;ßSÜß>Þƒ5î⩉äëøˆ„TÁ\`yvéIz- Š’ªGt^³m4}B§~Ç”Óø0V´p _H-ÃÞù~»tu¡m`äÉïú¦º7?â>Ø™më‘ÆÈpHê?ˆz1›ßÑìVþÛðÞò¦ üµ/¯•߆ËÇäÄÙ Öwþ Y¾º:çs/uuÅÜ'{CžŽõZè¹BÕÈyj©bô©l€æn`RPµóEÉc¦¹ì+mWñµ´CÈDI¸õ=)<7íí²ÄùnèO¡ÙN¸tR i FëÛôØB4 ˆ¬ÀÆ"åž·ˆ£áåX †²r¢V¤îH DÆî¢¹XÜ™ _,'gÀ_’­¤w¤b2reM£a÷6Iá!°>¼*#qU7?u7Oü‹z®‚I_q©u]\xØgå (`žc·UÝ›w×21ÞGZ,èÑÇõ°¨7‡g· Î_ Ÿ»ì~÷ô™où–‹W tÈõSå‘ÊÕÊžÊf®\ï}c|¼\OyášUµj½ÚG¹GýÌkQàßô€_„÷jçYÚC¯È¯QöPÓÜûfÈyç]ƒlÞ=UKÕ(K±€KáœbiÙbê3JGÒÌ;nD‰&>†vAË1~½÷ĸðõÈTôþ°“ø†ü +F想3à8|-&¤œÁ7#ÉÄæÄÁ´94Wr ܪï»þ#Ss¦3±äŒÆˆ{ƒÛ‚u‚ÿ3² ëÿ o•ù? Ë €Qè÷â°¯ôg1¬ÿÞÿIøf‹DŸ (Ü~æí}Î`þA+^%çžpŸCb›$Ot?Ó»@ÐJ|þ“.ö÷éÅ«fG²¹ï2‰Z– ^£8ªìå7=(]}Ï9Íe½oªw+ycß7!¶P£ÿXÕfW’mÍÈç7Д Õ©a1ã*C"ö‡n œ²Ë·©K/J_¿‘^2N>¿’Õ›O<F[GI§q*u7z‰uåæ¿ l²4 MƒvRZ  ~˜âÇø™ÖÛ‹Räí$yq>`ðåFKxÃYõh!ñ7—ÎÊŠ Ig)וÂ5¢ÕüIÜ=õ˜Ü_ùMÿRRý²´ÿºÿWhŸƒ“|qp††£5Äm¦=þ¿þ…õmë5c0ã,c #uQ4[ø–CÄŠËùoy­£Y‚T®B¼[^Ë뿎s”‚•šYltp…¦âú6?ë>qWiˆfšæ‚S7Y¢÷5÷k~A²|ï~l— àÆÚ×»#ö…qCa¯6Bðî ¶¾ÇÜÝ#'k}µÇ"Öiã"ã´Â¯…ô¼©9/”;Åk‚›ÅÍh[± âR*ÿ%£;ͼžØÓ W}[€Ú; oD/`a,|Ì·r‰ì”£X˜C}ÆÛÂfÐvŸÎoä’2ý§f@/OÔ‰ÊÚzëYH¾È Ф6ÙCéy?ÃÊu“§½• U_—ðG>/ƒ2 yÚ{”ƒ3@jRlÕéG¦ü9®3´hzWÆp¶/'Œs—­H { ×Âý•{Pp@ðA †Oq7Ka1ï;˜WW[6ÌnFR“wtð÷š¸/KZɘªÀ.`/M¥ûAek?A(Ó•¡›¤{¢ý9×}ÐV„‡†í¡jßi'è‚uuc#ý"—ëT‘°6>Rm¸ç.u uy¥¾®ì¢èEéŠ?Æv0T²¢KxŽó6ÅdÛP»í>’äè_çÁm‘°v® aòXEgbcWDùµRÜ›ìÚI<Ú§™h³øÂÖc½&‡úÑÖ ã¥«dÛ%oB;ÌÍÎIà+ÎxµS®ëó€·AÓþo{zç ]Âõÿó¹ÐÚÑ7Ðí+ç8¿qœµš°>,DT$¾Æê¹¢žPì!‰ýg¯ÉÃ,y™âƒ|õ˜ÛïKëKßHÈ<9Ü«b•!84|ª®yäœÈŸ#Ã#MÚÕ{#òÃ߇¯‹¼¡cDÅG¥GÑ£œ£‚£ë¤z]t°Ëmç¦ÎdÍce¨r¶„Èù™rGråÍÄ´§ßo®Å]æþN–š†99ž‡¡'à´*ÊuZÚ(ÖPj½»½æ)Òf,ö,:C)é c)‰€í寑VöûØMúõßÔ$3oz¼*°ÑÏþÿy½~;†ñPë¿DüÛ¿ü±¡:Z £#KËÁêÁšÍQsלƒuL©|»¾ÝƒsKà"œ$²}Ò•üYê]üØŒ–4uÌ©•í—çʬÒMÀâënéŸ3Á‚Ã"çGzEž‹Ìõ9¤~+4*lkG×:ÊCw# Ò'èGéõ{õõ;\®8]Ò°ÔÝ”1"™(†·Ÿ•"š/ºÄœŽ½ó*fqà;ÿ Ô‡:t§`æÍ¥ß ÝåXé·p6T#¨ySBØÍT`,3¯,îBñæÞ«ðá6_}["䥺½ZUR¿qÛÐgÊá*Ã?ÆÛmŽ^úÏjðŸg·Û“Gæ îì¡Ü#,!À|VÃ{Q¹H/Ê—ùɸn •÷ýdžß×ñt÷µ»´¡BÝ„&…JŸFŒÔºkýµ¯u¢ÚDmÓ­ÒŒêäµZCÔT['¨eí•ɲ4no*ôÅ™.H¯czÿÞ"¬À/âr²†,æO•Lå&;ÂôÀ>”Á?ÃÐ}(kÔò ïý Ôgœ…]›ûW.™½js›÷kZ®«.LNM^8^©ô¼íåþ½’þ·Ã9`Çe,|êó†»ý8SÏnÊšÉÊdú²J9áÂ󬧜c‚Îü;ý¯Ý¸Okb¾~S÷ì'~¯«L¾ZÊ¢å¿ù½®OT3ŽÈg{­× £¦h÷xÆùmÒ$kb‚Ö„D ›þ>Œr L¯ËŽ<ñ>¢aøfïT…E¾]V-د”ª¨Ž*Ï Ï’¡»P9º ~ǤqB¾¡¥ÈqÈ$ø?µ7ñ­2Üeûñ#h÷=g{°Ñ{ûžù‘3‹Çìÿ®Ôö­˜¾ë'WRæQÜsÅçÖnÕˆÏvíò¨~º¼À°€ y;ïÓa "k#jWF t_ëa ëÎtÓ¾uvRžPˆÔDOç`õ%¥‘—ÀÚ¥_…d Yèe W; h·.…Ï÷Þžò7Ïà·~éÏ­9Sª«8jû%<¿&ìAY1úÝôR¥·÷Í.ÓWß^4:gxH´}ë w©/_¢)P%}Žë¿ï‹yM€Ÿ \ÈøÆÀ;¡CàjýÂh|V&{ ÀG-î lY«ÿV¤:Ÿ'ª÷—˜O’/èÿ½zy[+õm7sKΘg{–N–\•y] ˈj% swå©°€×ѯ£Õ†eúze¨wH‰ûâ°‘'Çku7ÃK=ôêGò!*Øù¬ÓÐÏzÉ‹0^扨w¡'¢“ÁŽ´ü?ÔÇæ ÞIï=a¦™üÂwMÉÙÒ%üXÙ¾MÖQöZàßúô8óš@¬z/î ˜£|¥˜à&w3á{%úçÇ£døfß¾9Ÿ…̆o8Jxû‹rÔäã”Kð_û¯åéxó8»c¶¸  xùZ”-üs<ÞQG{ ¿‹}߯$õšÜûJ«qÚœGÀ¿»¬§¦¯Óì€ÝênÜLJéè¹z$z{4d`GÏÖEY}5 Ó{Þ‡ˆÔÁž3ô³ýI~ƒß$ k1P8žIPf渟jÇ‹"/ˆÚé쳩ûÜГm®tjŠ“H{W_ÈŸ5¤(ç¼Ïã€*nØÚ…ùÓÍÊDßù×5xŠ ÀÛãýñ9XC¼#Ú3i%k„-Bû 9‘Õè"X÷u×Å)cÀ¿ƒzÚŠT æ,+þ‘_-=_ä…p®³rû Ï‹î×röº˜ëî³DÅK¾¢óiàñ5ûÕë~dPõ6$wê"ߣ8£9¡˜¢9ê?: ‹>9×0BŸ1@w7Ò Ít6Q‘|-¬ëë¿-´C(ÍÕÛK®®Ö¾ÑeŽS¯>a–M.»Ô2ÁPeoÙ3\LÏ×±]Å-™/U±=gugR\]J˜kq&¬Â5pº»ÂÊ'@“°h’3>÷Çú`>a=–~ì]9òJqfÒ>yºìÉLÜ|ÛÒ½ès®ÿ»¾XøúX÷u´T?t9Ø­Q]­@ǡѥp}0Hƒ ÐI—k_$øi¬ïxøâù{y~ ZK3rÝ^¦0I4 l?œ#Çï̳ s¤Ó¹Éü¥™š–;2ƒZãÅ]­#¼VûNÞá¿(#¾«Ç(r;ëd5N½©¾DuGÆ—ÝtÚ ¾^¯iâ¹;â@d§èÑ•ú‘˜î­¶®¾¶2ª“>EÿР0 ÔK q†úÕ ü^F){ûi‚ •íå/Dé´…X e"±ƒ?3h³a=$Îêä§JVL æ8Å¿Š§ò^º.cC~E‚rúajÒ "ƒ:–Ì!@ŸXô[dæ_Läg7M‹Š:Þp¸ÿ˜žÖgæÙÅ“ÿë˜÷wÐîÂlˆe|1†°`ÖÈ ì¢ï 3rÆÐZ:_E`×Mp¢íuü¯8ºÀCˆó¯±}¸ž@ŽkÌ{.l+ fWrÇñ‡/‰÷|d²°O8›DeŸèœ,NT½PìZ%6G«ø~º‡íh'yOX ÆðíÕmýÚDÍÐßÒ_ÓÑ_ŠJÓ-Ó.‹Š3¼Ð7ÓoÑêý ‹ ] G£nx¹ð#Ö†û–:yËÚrh,ŒEVÄцÉ*äÝèYƒƒ3‡wMÚ¬"öÅ®Þà‡%í%DšÝnìh%4†¸‰¶”~€¸ ÈC§ˆËÈÇÉajZÔ Þ³5;‹|­7Š6XF›Â Ï£Öå–Ÿ,ýŒß/Ã?ñæ´àøœå@ü»&%fÆæ`Ft2 Üt<bBE0€[  ÐàÞðoÐø·ò=Aä%8ÄYËÝÀ\ÉœÊJákE@÷Ó„ù/…;Å%».&DÖ è[^ª!¯\ñI¸œ¡´Ç´ xð+ÎNùfxJ×Y Úв|rÅ‘–ð×m41z¯aŽa¶~—~Ža«ámT¤nz”4Jª[ÙA{7ôLÈÁtËY®ð@B„·$…$ÙŽjÞ˜§^GeÄ\>!¡¶##û‚sj@îà7p6žJžÏÌÇš`‡ñÞ¸Š4œ´µÁaîPÆ8—œy`í§Uc¹P˜R0vó¯IwÆo´œ7Uf|ÊÞÅ‚Ž]”f¤)êV÷VW«Rñ0î„$¢éðK`߲طW B˜M´»¿ŸÝJ+†3'eÿE9muc‡&´Ï–oV|çìç‹\Åo‚«Üë£Ýb[ùŸ—-‘]¬Õ¶5St–ïu ÞO.[úÈ\<½àgJˆ©»J¿Ì…ʼn©z þrF#s±?Å{ÎÔÝÐ0Ì7Ì0<5Ñûb¢WEGê–†'ûoq—ºj½­;|Ú‡h“# Bw Ÿ“^·¸#Øì ‡zø6Ž@žFʤmU«éô©Bé’)}ðÁب°fÑ•|yMAlÄl­ > ?Lª¢ Å«(—õ2Û³Kö¶D•ÞUPMâvZyRû|Îã?í;…XÐyH5ì¯G’æ½ÀZ¾NØu‡„ÞpùFØ~`ì‡#á2ø_‚Œ^@G /°G7“0 JXßt þ÷QBoa17’•̨ÇZÄð:øœ^Â+µZÖë¼U|-¿os"§;w/wÏ:¿V äÝ]}]Î7¬Ï+ÁN^Ic·Ë’sE{ò§ZÚ,e–ÅÙ–•|®³(n°f¤‚(/_WWOQ¬w¶ß+_«Ö;s3EÞ‹>¯?u-ŠåÖ(¸]äÀðq+½òÕã¼ >h`Nè¿ïÅ~”Þ´¤•š˜Ð /Dp2“æ©4-å)±âÂÆc´áüF¬D‡Rv“â`ƒî [é…`üóˆ¥bz|þëLj`ä²{ohfU¬ê@ `ÜÔ4åÛWhN€|Ñ£ÚsøcÝ—+é"…—ƒ–Û Ø¦ô‚„Åh t1ÒÍzuu}d ÆÄ¢•ð¸-ì† €/ =à±Ð ‚W-Î@'hÀs=%°€èó4?žòpÁLJ13IºZØ€C¤/cßò§õªY#Á ãg²;ТeÐG±’8ÇÔsÜjN*ß*f*Òk[Ü6çÜÚ4 ­Ü×Ì2‡˜ÒÆ./q)Z• Zh-ewrkçÙÀ'VuVvÁÑNrœ)®§¨×ÔiŠ\ð*­6°EH¤÷ÇPÝÙ %~—Bûz¼Ü 8è–-šÕé~3§˜ÎD¢x¬î¶×Õ>šø X%w ØŠáX|„âFó ’/ƒw!×àbä!dÅÁnx2yÅHLÆ’Ñ l:¾&|+umgkçñýÔ|ÒÒ(¡·xŸƒÓ ³?ÍüX´Á¼4Œ"•^sÜŠnƒ.6Bý DøÏ@H Í¹a¼n?Ÿ3rk öekƒ¶¢à9ˆ…0†äÀÜŽrw‡¯†½× ^Ïÿ÷r_£÷w&Þ ž$Í¥Žámã¦ò;ñº0¦Ê}µ8ÞÜüë‚ ,'ÆJ Ðoc<ʤL%·Ãw;‘†‘V±~bΗž·#በöjCL§]üΞ‹rCZ‹šÜüèk[t-®%݆úŽ«‹™ç`b<å‹'fñÀªŽ3j?›ægì ¸žÀÈXKä$Ö ÁˆŠœkaGPΟ{ðÚÇO”^—Â÷ïýˆïÉù”K¤4 cfaÐ8^@#“É“Ëü˜=¿»Í艴‡†¸°ï~²1 —÷àΑ‰Õ¤¬K7Ùn–>*iTF®œX6&î<»òiÞ»%[âôêA#~ùÄá»™g‘ëgÉÖȬª Z¼˜«éJ`MÛ°T3Q¹Óû‰g€¢¯óMXЭTÃ'­ð"{n’7—uŽV,³¶š?˜ÏÇž“HfÒ”€#^£,'ªEDõ˜Ý(ËІømô<j v­Ñèf¦tfôd§4§L&ßÑÐhÖŽÆ@ïgHš†èGŸ‚–";z~ÎBËz“=W?ÚÅ"Ó‰M©]‰má^Ð1€Mc½¿AZ_ƒñX€·>úªùg—K‰ÕÕâyt72ààõ#Áy s èö8jøzMž „eï¯®Ï 7ß#5g̤¸Š®sQâ­¢ æ3ÐݤŠ6Ÿ|wèøI­f;oj6êï–)ýV Ìß[þ¨¬WiçRféo%[l±¥M*lÛ$Û‚—}(i–5kS½\¿¼„©«4!Î'U·Ô©¬¬ë]úŽ«7ʼng;”cXtNiO)bàù9÷œ.‡| Nà«®NQvóˆ éêWæîâ4CqIñÊ!éO4~‘ Lü öQÍ~¢†Â¡@{ ñˆ‚Ú—Ò–²‰±ˆØµÀ¯Q*8±±ðB*$ƶ£ZòIJfWÇQoRµ>\²y®ù£ßE”k‘(ŒqPW¨ìŽp$„‚D£ñнþ¿†?â<2°uÐ]¬O×Õð~Ü Æ`.ì…òð$ü%þÐy³y‡yŒc4®"Fã.CéˆÑñd= ¯Vêë~ý­»æí´ñ­w_‡MÃ&‘Ø´…ä ?é PN§v4Þt&¨Ç.죚ˆŸ™P]âYg^\ÝjfÑz±kÉo–tëM[µmIYfùþÒ‹%KE¥l^6må±Ê¼Š]%SJN˜‰Éï[>nÐ.h{¢·úz`‚7sAÚìôv+c»®žâ›eUÝ’u”éÐz£%æ ;U9]qŽÑ\sK <ìM zí;*  °80Ká+Hzù¸[ú²öño§qRºÍèy4 ¬#‘Þ#É|g~á—h4c 3Ï5ÃC'â+ñY”¼ÌG$9e#¥·ÛÜ¡$óÀMsœ›“§‘HФVh °ë=íÒû‘q—yþ?Bç^ðIXß…iÐ$`áì÷u/ƒ¦ö7Š\Fø%¥×,Z‚NíñX otÐù+S+«ý—­@»§Ì‹=Œ@PüHÂ2ëùÎöç¿v)d1ùv ͦt#ÏrfÍâø®ÝR†¦¬*›[î[z»¤ªxÎ|ßå9Æxs#n-±°-#JÏW˜+U¬¨8Rþ¦Ô¹ür¹jKbå–²%ù–æÙU £AˆØK+®Ojïç÷xì‘àq=ÎmZ32½þ+mÛ(Ótüºëtš¼]Sûù® \±E>¨…ožo»Ð¢žŸØ}w¶l‚;Óï ˜;“R“x~GÝõ‹%i¤qX6eÜ5bC{S`˜‡="ìEKh•Ô˜Ý*?°RLÆ:ðw‚õq1Ô‘D.ÁÍ[æ_¼Ûù ñÍȺLÛN¼‰_‚ÏÈ=ÿD#Û¬/Øœÿ×5õ¯Ñ †¸P_h!œ².bô'Z¥;g \ÈJ|4ØG=’<•Ô„T^t® Ûæ1ŒÊtR!ñ4:Y О]ÔÅêîg? û T öí~ÎE[BÂXAh !ð#á>ÍjUYJ–}~ûW>Œbh%íåˆ-¨dbÉÙ’¥%¯*.l/)[mó·z–,s®ÜR™PF.^\eXÒ£båÖõ; +c¶dU0Êåî•Ë·¼.·X+ÜX~«lNöØ^ tÙZö’KºÛn0_7þAºk^š®a£äÀ~ŠŸÁlÛ.÷ÞR‹¤•Äàt\ÓÚã‚·ÜmHÈeíüõã‚Ïò¡Ê;¹ø{ÏF¾=PýÎp-ÑÅËfˆF`ËÈ9€'u^1ŸRöàéH¸!)…MFîúÑð-Ò8Nž@A‚ÉH»Ð^`§jr)KÇ„Hýp?&ÿLŒqœF,cç%¥ä?ûx»½Ö!Ð(Ý&¤‚öÑjåÆNuï¾wwþ$i[^èô×Yó²{• ³*²Ž/i¼õ¥1ÚØ©°Y~¬%Þ„Uøn™j9{Ì2eK¯-q{úîöߦØ>{kLYNé òieOmÖâ%¦®Ã*+ŒÝó€Ngþú&†ô]MVp@?̵-ÁÒÏ‘Ùdõ%÷õ7ñ*ù1MŒz‹s7MK,¨O”»®QØÈÁáO‚ ÁÝ{‰æ¨\¤a€óeIϘeÑÓ¢ÎÿÆY&×»?pßÏ#ç4j+R+@/HdN¢x¬Ïm·mn–ÉÖçÖÓÆìâ„5Ãs[Ë?½¾yÁBkYéé²»–Ʀå‹vYvüTñÓ–}'¶.¨H°5/ÙW¾°òIÉ‹¾d~y£’9æ”ÒrG_;3“˜RÒk`NH† yþ3þ á¯®æˆ>Ä扺*úUéŽêúGitÃt[#:G< wñlàòÔ©QðLË¿ç¶B÷4:ÄðÀ·±¼…Â=<1xœ„@˜Î¡¶'n½ûBZÙ1§q.Ï+E×YYbg n=òQbw0J+!Êð80KÙŒåÂzÂTŒÚ‘·é¿&çAJañm#RèVô2O´ ?ÚÜÁ)™`r œ-ÐRÁáxÄ—Z‡}”6ù ?o¾“él}d9bé8rKÞ(‹Aø+#ˆüœdäÙTi .6̓ì320:‰E›!gáÇp=¸7Ë·¹ò@Ô„°Coš÷*Ë9£¯¹ó§•$V¢%hÈ)]W®›a{oYR8?ürñÕŸÆLeÙ¦º_«j¶¾üάrã¹÷7½«˜±kʾ¬Jfy|ÅÂÒg*F—¿°¯<¹UáH)Ѧ)Š)#͢ùý³Áy4#5ºRXnO=8¼qHM.V×êgù¥{=^J/jÆ„eë^é8º¨¨Þ:‹_ÿ}úE@+Û2¨¯šFê&xæ…i½|w¸ˆÜ7j6z\ôš¤ϽD{Å)§ÂÒ‘Ó¢ïD¿"·’ŸTr>ÏÉ_Ôš”é•ÚØ2w;u 14‡èGL¾p)ÛX³$Ã=Îóßhdõ ¼K…ÄÂù›#òFf¥fýYýü»ïìÒ´a˜™ -¨]€Zƒú9¶8 •¤è …9åÅ%–L3aáò\cáÂBN»R ^AŒöNXá,€@ë ÐB0¼ ‚GÀÏÀ®—aîË'nZ,+€K ýîÑßÊZ?Ê"4=Ûô9…ϾÂðK€g‚yNç'Øý}JcË÷['Yxfl8+eý´+¬yœ–eÜÿ"Ͱ$W8M¹»é@vñ*çÉ‘~=¢9[nŽiÿ5 ßR²õ 9©¶õ+vÏ*˜²Ür9ÀÙ·æ}^Ù#€¼SeYYây\Ü]½=BñÑ¿N¦k&‰\ ß¬{[oKLR½ÖºíÁj¯6®Ø"MŸt÷ë®ݧQý©gÅ\™V*‘y{AÞ×%1Ä‹¾.ÁþZßF¾L÷¢%Ô,´µ“a£Êx CN à{’†)z¾f”ÒÞ¨hšQìíÇjÌu¢5›R¬9º±&—?âZƒ*‘àg‡ÜáÚÊÅK “;°ù: ¯ü„Œ‡ÅOÌó-Û,§L˜y¹iˆ%θ^®"—UÓç€];àd©r8 ö@Š¢ø„ã>ýX£$wÕ=\›p;Iïã»Î"Ý ä<³Ò8”åË–U“^³=’í¾ •ö«ošý ÆÁ¥Â[ñ¶õ…ã ¼œÝÓEÔ žO—öæý7Sn[ßͤ—LLqyï‰\Cë7~Œ›ºÛ×ÈM@Ò2 qÈA73¾¤*sF‹ý¬>¦¾¼›ío=ÒòR§OœGBœCvº÷ïîÿk(!Ü>2xcÄ[CDìÅz½ëåÇÜ«ÿ4fNPbįiâø°(=1|!½U'>H‘ÁÒd{Þ ¨º+d¾ë.öÎÓ^¯9«üÞ»Ÿâú1Ú‹^2Qί#Ëñ"|ey us›“§þ;N8AííÒ¦]ÿñÝÍý6o\ó$[Ó|¥aÕ„å5¹üQ×ö€ÐO4M„žòÿ>(‹Ù¼ô„d3Ë4Þ’nîWЯ ®Ý¤.>J¼I 3½*öµ@" Î„6' ã DØÛÔgcOK+k\Ó“â:„õ¶¢ŒÃE^æv3ëBìi1-ífâ K?ëÔìNÖζ™%­lƒÔ¼»ä¦•3øça‚žc½†»…tÚ>¿š•ÈmÎV0ØŒÖý«æ6!]ÛpyU“ÉÕÕý葤Ÿ2ƒ´Œë=Á(yy¨C«Ó…²] Fú}Zòf´ú”U,¥áÝTˆ¿Ýe4l± Æw¬Ô#‰Q21æºÑ+ÂCî?"r‡61\n8é¯/Ñ] yaF·Ñßö¹ØztÀšp¸a™vyê1c’Gò'0…NS¼ë»‡¸÷`ðÝÅ;¼‡yIÕÇD-é¬kΕü©Äêúb²žõˆý3û|H¢¢™û‚0OîFy–sh½ékFU…ã³g¯N¡&W¿¿žý&]þþ›o?‰¡ˆMDßAúó¯´Eîymæˆ).§mþÓ5sùŒ2Z+P›wüœgv‹ÚÅÈTPšÌ„Ü!-Ážo@^¹@èóÐrÍL±øŒ°ëd½”tßZb]hYıÚÛÚÖR—ܽmY9f'ë;ËzóOÖ«6aÉVÇÛe¶«–™ÖÙ%m³Û/yèEnôŒTŸVŸâEªjs“fX ,\ؾ Lfße™méCɨƒÆ)`I­Âü‰>4óË™YÈŠ§óé¿P®ÒùÌ‘’`Öð•ô¬f¥÷û€ÜÖ¢ÎBæ|à íçš8Øc²ËoÁíÂ>оջFµ_ÎÍ^È‹Ž‹9³6‘:HØ»TóÚ©À?¢ËìÈeÃ$¸[÷Š1’«ÒQªÇ²&Mâìâ£ÜɰbëáVÂZo¬ˆÞU°YÈ©ZÈÛ K+g©”¹Ðæ¼ê“sÝ?ÄïÚ°gýóÍSò¨’ÒöŒ¿¢3àN?ÒþqæwjɲpÍa&Àk­ÎE­­ë¬ËÌÖœzù«‹C ûsîÆìÈ^1­Gáå„_ÞP¦;ÚŸ9êªõùò­ÖùÖVëbK°q§ùŒu‰5ÐgÛPŒ3u,f9›lÀ¯µm§ll}m¸í€Ua0­4†˜Ã¬'MwŒ¬­­ ¬f›Ò¶ÍÚÝú“¹Ôbjv»DTººÄl{O€_2m7÷È„p_“—¹+À—¹+ ¸²o3ëÈ׈ïØ? zP7ÒUÀÕ¯´Þ”ÔúÔ t1ãÕÀø©”]zä#ÅcÔÔít¦g[,jô¸#­î‰Zÿˆ¥­mEz–3Üï2š;3úXÌžzYÍ–.Ý|p±„v^¼dàLÿ^LúL•>•çj(Ï‹ÛRüY‘² ~zjÂB͉-ðPy©ü± \¦å.¦o‘¥r爮»î6ʨ06µµÉØÓð©ñùÂ3&ïR5}ËæéÅÍk{ …;Зà èïëøÕr¥‡en±h‚:Yé ^Nš»™Œ¹›'d­,gž¸º¿±W¼.¸"¬¶ƒ§tÕ‚3ž­K ðÁÖÚø(÷\ÞñbÈèe9eb¢›Xš[ÖX­iÖ)Ö£#g¥¾ÎÛ_À·”ÙôÖúÖ“Öž6²­Ô2ÛÒÑü‹¥UmžcJ1Î5µµ´´*mlGíßXÆZŠMó¶nšj]äo`+¬/[V˜»ÉWTäFºvw?…Äaq¦3~bö¦Ì ‘ÓIë)“)«@‹XE›L{BÒPÏ’ )“i“èTz­­·íHI“^9l+«˜ëÉätÜQÏwyÝ÷îæmhÓ¬m·¦#FÅD_ˆùÅPlVD·‰ÎmÔoH³sû¨9"µ¯ÛpÆcÊÅHåÑu¿÷m•)DtPî­Ü…7¼ð!t Þž4 –QÆóïqÚ h²³¢v‘’«ùàÊñ`¨ I&“ñlႵ‡–«™75§{N±©cá‡ÂÙ5åúãõ!öosø?Æö9¤ÐôÚøk±à¸ÓRdêg¢l5]ÎÛ‘·*Ï9¿ŸÙ°A$mƒ—‘Ga"ä*¥>ÈÁKGûéZè’Už}¯ #—œÛ3kœéi¿p]ñ ó^“ÁÜÔ¬²4˜µßâ_p9ãUæn °&ail)¶,¶6µ|4 Lj«ÙºÑ[·›{™oYÀÃzà-·Œ±<)ìiin-ÔöÑX§SŸ8?)L[â±j¼­d“žI9G¿ ö ÌãìNM8¼ÉœzŒ*ª ­˜²˜ºÑ’~"¤O¤§SSÏ“úPwRÒNÓ&Ð/5X‘vÚtf‡³™£–f¸Î÷½à:Ó}‰ßfí<툴h4ö¢a¸~VÌàè1‹£_* ¯õõ¯ ýcÛ6¸ÛU¢.t}"ã+Cø‘ÎÛU¿ÉÞÈ_)yîb¡ZV%U­“xƒ¶vh0FRö0Ú ÓIïx£øwE¾üy7QcEšs{ÏE-çw쑱²(¤ gvxꤥ`ãÜæMkëe-8–]øÏ>gȺB`ÿ`Ì»ÁÒMó®æ+ZWØ$ÿMñ²<÷ÜÅ‹KL”¼†i›Ö'—šúÄÝÔ=*”CvÌë\¿Mšüœ¬âÜ7ùó̸©¼`WŽ4/¸¸Eñ¾âƒ]f̳I–ç-¬»Í‹{ý­«Ç¾Ïñ*˜hšnék¼ÀzÆb4?´.².XY½¨·‰;áWãbËÁŽë|¬ž”1ƒ­ò8?hž #¿‚żƚκÅÊjœIeÄ1l¬á´#®EV£š±cÈâ©…£,s_{Þí’ø;I=ÖúðÆŒÐèê®E®5¼Œ¡ÄŒ‹î»&ÆhØÕW?\ïý^¿Do2Žè²Ãå>éÞ›Uç >·ÝÂ]åý¤«||”IÒΚMÊ 2o.{Ž!m L¤ø3’Í…“$Ý%wm]y]û¹¦¹o󺸨gñoÅ{sCW[ì4óÙ²iéE׊‹ónl´qVöãoŽÏÇB._Ôv]­ÿ»÷da,vë\„n‹·l(h–[•>iSdñƒüv¹kŒsÖI³w䥘êoˆ˜ÊHiR"v@ŸùÔýÊ~hq}îk³”€BEñ•âÙùÝ6o,t5ž2Ÿ·º[[öÏY×vE‹M›ò·XNšL*³¦HTÜ¿@Ÿ—m^gŒ*zPضx`ñ[µÍðîY N™;Y¼,FKoË`ó>kóü“æÓû›ì]V¶Ab´.¨ôÔTnÕ{ÿ´íÌP¿(Kä)rÎ8 ’Ù»Yã˜}øà”ô9Œãžé®/ÙûÙ¿‰Ó#»SZäˆ'+Ò6 K%ñâqÑ ¹Ê¿—ÛØ ú!ët%ú7Ñw¢3ôà ] dýÉÈy!7B’tí¹`çp4ª]ä”Е>]¼ã¤ùN'×…ŸT]æ8Ÿuû¨œá¼ßu…ÛQ¾§-s+ïåþ ïG~ÍÒÐ÷0½iÇ4•^e¾ñÎ^Ó½ õË‚ó[愬=•\œte•tÍ‚³³6¿Ú4m¹`ÞÆÌã9Ÿkui-Îc eÀBÄ—4öù›oûÖþ¡ÿþò»Æ@³»Šßµ#±Í\Ÿµ-‡ 5Ì,úPø:ýeZd–ÀòÐ<ʼÉó.¯TÍaà ŸP(²íQ[äW—s&ë^î/9?74/1.±žH)_wÏÉÌ»cœbô°¬0ö25,\¬7#ÆÎùRËxËdó‹¢é…ÝŒ3º`ÑÅZ3RXaÊ63Ÿ3'®jlé` -ú°¤ýü+Þy©±ùœ©®^ý Á„Åà¬Ùõ`&HN1s´¼ç²ýB‰´(D¾Y”$9.8,žªÎ‘/R·”¤‚3ö– ‹/™²ò12…B©iâÖÏ7A|GÝ)fŠK`XO]™a±¾X ¹_ç,NŒ‰š¦å„Ç´)‘¿„GމÒE Ý v1vhé" Ÿë#p:B{-HP¹zkî¹M %o~Pœo&PeÔœt^{ÉUa„dÇAÏÑža^™ž~ÞÕMŠŒÂ‚¥9»6mXrD§)åsF¥-š±fû¢ÔUÖÜYq'£¦F3¡çÀû¨3Àe-´šÿ;|>×ú×¾iÍø§˜×ýf3ÜÊòÈüèÓêê·Ö™Æ§)Ùò³ Æçgæ7^×béÕUï ›š—[J2ª“ž¹ãW1÷'d/÷´ÍHýi3'Gžž d¿ =òE¦n€¦i‹kRiO,èiª6>5î63©ŒõólicL!ÖæQÅõ äß[p™œ»¼¿IfŽ1…›&}NÑ~éýÌí#GÍîz§q÷âK—fº6‡¯û•}XTKð&, ‚tw#-Ø`+¶Øˆ¨("ˆ„tnïžÎ]°»¯Ý^»»ëªWåŸó»÷ûþÿΞ˜™sfÞygÞž¶÷ìôž°>Õø­Í³·v7ìï8f¹lvhÓË¡›CƒÓ"û™6ÏA|_›B7‡A¡®ÁlP?w?‰ý˜€xg ;Ÿq%Il"¿)!¡ë†.¦]„qgãÄúÅý•½2V›ÏéÚ=1!ád—'ñ«¢9nsâ¯Dv ùä´Û}‡ëÇ€ïõŽöŠMG»¤úÄ{Þ°53N1¯´«pc<‡¸{º[û„<ó_àíâã'¸ŽÛ)o4*šZ6LiعqAÝ+Ø^5½qA…T=L½[•†ê`lÈÝϽÌ]òMë¥ÛOû;œþ÷¯NØö¿süú4ž'ë7¨æ=¹9 H&5W4·+Æσ+”Žè"—2ukÐyt­? ¾~-ùŸçNeUì¸ÌFu€ü? ×WUÄ'(rU{ÎA„ٟ؈ç“gqŠšK_'+ëŽ).ÐèxqC±3k¾b~T yŠ~D`ü©¼é£T#™ºa2:öxpçíi€ëѡà K c‹X§Ø„‰úÛ¦ÛÍqéáhÖæõ2Á>Îî‘•³ÕEËÂŽ·À¾èN¾ã;kc£.™¡ny‘ý»zð‚ CŽE‡Ç½OÆïŠ;›[cû$âXÒy}Œ~\z|qÂô®!‰Ã=º> éâÑåMðK÷±žO½š<5^#\²:ì4³qží:Àe˜ÓpÛna>¬›Æû Ï6¿qnŽþÃþZz_4½¶Žß!™TŸ"/P?GI| |]\›w­Î@Ϋ»‰ WmòÍÀ–e7òâöîÐý g“ÿ˜gr6s«ùIá¢ÔÛ¤ëË;t î‹”©–ÊŸ)^¨_*ß ÎÄXTL™°š=l©üç{¾uýŸbíM/VÉbÌ;&ÈkÍñõ"•XTÛž¥3³ˆy‡ûà™äsÜ™4 OÒé¬#½•~BÓ¤!ÚU½]Ž@Ô[œ¥^ƒU_A¯$Q'_z>°/›LEÈÓÕF­­Ë¿õÈÝy]Söê§éÊ´ë%ÓÓ7Ž3zädÜù†ÍGÛïŸtÚŠ²Ê¶nQè0°êvñ.³}/v^³,òf¨Èç_nÄ}oÛ€ ¡ŠÐ±]JºTÆvÑF6…Þ^Yv5Ò$&#nTaBFWðiZ–ð$lOÈ™ÈqA~+=oú>v<ëÒÑcª£w‡LÛÉö ΰã{ï,?Ìc†“‡·«ïiïg~ùÁ½‚ëBÖFuw«­õ‡8’ÚʘÚÝ’aâÝJDÞ±©¬²cþxÙ(Fš¼á ·´¬]¯ý½¿þþÝëvÉHûýÿ‹_Ëédfßsæ,<”p9|½M{h8²• Ä&x'%GþZ.Q<„}É|äž‚º2›é'õ½¦kÌ]—úý¶ªëj~Ê2‰sH*šÌøÐäb<æË\m“©ëJ‚ž±zä8|ÐÜØ@ÙÈòQE_§êȪ¥iAƒH¾Ž9NScÑtê8FœcQÄ,‘u#ßÏ®R×ÏÒÕòýû-bÚÏR—MJÀÆc·#ç+`ÓefGŒnéÏ£ãq5€7àå-”_šÏ±íkdÓÍuhçù­=Í:Œ^ÚyP·©I‚Ø›‘"¿Ûp”^dïàë!¬;Çá¼Ï¦¨òÈþ1'VU;»Ë³øSñ'ãûÆ_‰::5àNäì˜Ç1Ÿü³Í:…\ þlÔ{Œð÷ss¶5ót ‰ñÛåfå¸ÐãvоˆæèKñž]Ý“¡‘æ Y芤Eܪ8-ý³1¿¡Uº~ã¼âøÂÀJ©äýÆ?‹?-µøFaé¾ìû\—ë9‚kÊ-ûç?û¢o/ø/Ç@"v¤àH9G¹Ï8›øcy¦@?ú=q8ªéÒ“d„ûª ùJÕXô4f Âé3dzŒl—’êò×kÞšý×tœ>F3#˜õÌ#¦’‚艪­ÔT6äºÓ¬jžÒ’ª±e¦“x özŽQý˜×̺;¥d: =›!'ziN}U¡êXvyÐÆä6ñ}ûÅ´g´ÿ£/Ü †K` Ðe;ý q2CL€ÈÑh¢‰î^Ï6™j^mž ¿ ãÐŽGifT»Ö=±(Ê(HêSºÈûXÏËŵ}îãØÏ;ÂAc…zY{©Ã&D›Å±Q®1w¢=c6ƹt¡c- yèô>˜WgïjîÛÝã/Ÿ΂€ÎÑ—|,Zm³ìŽÛƒÿ æ÷&(7jb°GìŨÙu7¨ÈUOùM‘õV’2¥¼²:yãÃÒÁâ/ùKn-|»¤aŒî{u>*yþ`ç΀_F€r?å^à¦rOþïöü#8Í`W™Øßî[p€ŠüÇDÎ(Îdn/ÎypgØò8?’7ãÇS]-½»xÐoP7|'¼E¥T)ä{”¥öïUp1>3¡{üÀîm€šû=Óø2SIGzå@ò ƒ?ÀZÝ~¸`~ó[­5¾šxHß&VâYèìŽâÉø3Æ’µ§ä#Â}ƒ•“tõuëGú3-Äiä$a¯L›dº…zlXýÂa˜鎛6]ì“åƒë[[/뻋¦‚˜­Ù¢î†›ŒŠãLÊô›í0ϳ–u_»HB!gB-¬P%ìëduÑ/=d”Å6[Ì®Àó˜W¨Kˆ]£­¨#i¿ÀÝ!Jö>¬¶óã(NôŒ¸”Ø S>>Ç»GEÄÔÅôúæÁ䓵Âv'ÐÍ\ {ï=ÆKä“é…Ί óñà»Ä{}èØÉK÷ë“k×£"ñÊáeÚºY•ä… çú„FUIÎø£õGu/Ð_¦ëKa8°’_ú â_¸ãÁ þ#ÿÅÖXWB7oë’îü{[¸µ¥ök+ÎN?n§ÔÒ‘7YÅÛÄô[þíÔ0b6< Ø*ß#·“ùJLe­Ò^ðì¶z\Fÿikêû;Ú-›Ù˘Aº#A‰D$È×—Ãé5q,ž­Ù¦ù¤)ÒÆÓ7i_OfÂPOì@Á’SÈÇ3h%ÑDvcJÉ'ÄXŠ ú‘ä\âL.º‰æËmÇt72Ô;ûŠÏÙÉuŸ¿^Kn4¯{ó!ÍÉoßvD^<d$º” $v€—7 23±è4!Ls“˜Iåcs¨Úf»ÚºNå°Øãs5Ø­•°ûjŸìùÔ½Ò· µ©ñF‚N;¿ô¯J¸xÜïˆãÿŒÈ1±náþ£²£¢ÖEîŒH÷žiñÈ휺vð €.&#Ž{½vœî2²Gøuÿ.!¢Ow65J€NH®5˜ãihJ#¿SÓëÏlÈÙx°âL¥‰db–¶hH©\5B9„§ÏöcŽçqÄ÷óÓù‹yÓÎë¾_—¼ÌVÿ+ÝÝß¡Ý>t~£œßô+ü“‚é|Xµlšsç¶íI£+=C;ºm®†ÕQwDKR”Æ7 U„À°Â zƒùaÛQ=Ò‰=KS€~_ ´!w5¦¹º’Òuoæp2€e² ñ "ÿbÇj.·Í #T{éBÂŒcŸh2´{Œ²‚ËÅkÀhJRn"+©œÁfBI„ÀZF¨É`$ÎÀFƒ)ž„GPƸù¤q]é ìÝ‘½—Õ½H·AíB¥)ÕOrùåÚß žÑ²¨M«Þž«ý8Ýd‘ÉA‹ÛÝ\êzŒã·´4³&»ª?˜û›®Ø´itiv%Ýú}t•Ø]ípÂ÷VÈ¡Èö bÏ… píÓñ’ÓR‰¾û>÷G>ÆZvõ·»m:4¸i„á<Ô.¥žÙq£ƒþò¸¼ÇH'€lY÷a‚'*:×¢ ÔYEõ&Ðûò‡ ™eJñ–Úù5±ŽUÏük—×õž8Ž7“·X¤óù:¿à~|x„¶ï,!æçÝøûŸíÒA¶=.ïï÷¢MÔïcÁƒ—Ì÷k8Áå‚ã<0zZ[oæ÷Ô¬‡ñ·m”¢©¡ôa‰z‚üUã@e¸S-„Î"8”‹=„•¸2‘Rj¦±˜ñšJvºæôŽ¢b©õD1¸g–Ø4›Oõ ½ëtuwg·—¢·³ö {› §6Pñj{8 ߃TÕT45’ä!*±±ÔXJDX’OèÅLµœ €ìÞŒ ¨5ª?•I=K>‘ûäG—zhô€}ckkƒù¶¸¡ë:…fsJBÔYv ö(k®)"‡É×HfW?`no°Á°ú…ˆòÕ'ð|˜êDnÀ§Ð7È…p&qp™aVRçRÞO'õð¾þ1Ú|-¢k[9k†±OÁìdÙ6C}oá¿ÿ®-:zçnYóEÍêèäDãrØô.øÓå·lÙÑb[ç°À 熯ðëb?Ââ°½iØ€˜Çáµ¶o¼×ø¦YGXä™Äؾ´_abÀÕù V9ê"ûÕ¿¤[VÿG![zÎ.í»²Û瘑]úΖf3ïëñê@S4¿¬¾¤,ûÓ”âhuo±ñòÜäIåó–F÷›°øN¢@ï¾(G”"ì ¿ÁະDxƒ·R@¶Ñ.`…<ôcøß[©»Âéf}gÖ2À™÷{4‰™œ%9r"éNØç6IÿJÞцûª>’r±½Ì¯i¨r‡L#y+?ÝPÓd£h’´¶n oAó‘ ÈsÚ èÛ7k\4ÍÌ>`û‡þNFsÕ˜²BV&¾][ ]6Oü–-¬+íNþId’Èäæ[ìê=9‹ fç±ÍØ}z±-CîÀ½32»@|%ˆ ¶0ÛÑ(“¬ÃG¨ bã¤V´7¾{Åô +•KÙëÌ9M0˜ÑSµ£¨zº¬çÿ¯I1êƒöÆ–½ï)Õ•I1õ4ÿdâj¬wÔ‘36ØLwØíó.|\È=gÌv_§¬°'="†‡©-!Ëzk+Ó¹ÙÖ…ñIæVÑÆ+NCÖÐY"™y½æ~ÈÕ¾û$wžÐ :ÑóiÿO}£»Ø„®ùrí%ùtÕðu™ë÷­—”ÏSˤøÒ@ÒAí è.ùTéG˶•7,ƒ;¥Õؼ2p2„€.^_ØGo¸ðPgÅ›$T$IŽþsöúg˧qŽp$wŽ'ˆß÷ëS+:ÎcöbæKî^ ×îæ›B#4²Á±ªµ’ŽU9Kä—Ÿ«ÇÕulœ*é«ÝË6ÁwáqÌvZÉð5 N8Yþœà1*/ÌI]„yB¯U¦d ££¬:hWQ‡Èó´¶Gs”I`×ñݘ¬ãÙä*IS=W¡²`Å3ô6+À?Cäp|³zXßõéô[f%J¹“²%âgÄL\¤iмӼÔNFZ0žô_í ~mqûy\N&ñ‚§éBMn“-ùÇL:H;¼Š­YvÂv¦ÿ>ßɾC}ÂÎv,÷ãFM‰Ø¾8¬Âçe³í'ýsÆÃeØžðÛÐÌd(7¬—mõÜMÚgÐà€¾ê@g¿ûá«ú û=ˆ{í‘Fù7m_eYZ†—CšZ°kе‚m"l¨ËÄb(ÑWz ØâÞ¦w3Sµ íÚ¦s’ $ŸxÑ6Ïÿ[ûÿyOºÊj`žªV÷ýùlŸa¥…Æúže¼Ã+·T®ÝÍÀ Žg‚ÄQt”gäÀÐëAwÝŸ9'¸v1»kšÔ…;ªpÒ]©%ŒÃõÚ±mä"*ŠÜûŒø`èƒ!õ]W¤œM¸s;ʪ³!¡èÅdóå«Ä½*d÷Qõž&™,½f€ê^yìô ]Ñ8Óîãº^ïY1ðX2“Ritì—}Üp®Á1'GجÀ#x7y˜×{ñ¸óßÏ/ÿogmÐý.ÉÅÁU)7O0ñÌÏq‡ñ“„‚Õ‚Á{°†x9mãžbv°Ã€4|6:ZU¥¬¨ŸZNþ¥Á 3O3³Y®XK¬!ËB«²N•vEþi>>¼îóMº¥-jðìœ9´9‰="Ï’® §AÙ“Ý=´sÔ'--1ýQ¯ÏI}«„ðè¨.±MãÞŒy![Jo­sܘZ~µœ_{D²`À®™¥Å·3,Eíâ¤uÑN1]zlíirΈ4Z`là": ìB"y.BxÀm£ßÛ¿øw.¬ýÞïdzŒ‚&?­øÆ½‚ZÚ`½èíÚs~âÞT–Ç9ì Ä‚ñõ\ÌžÓ ¥)˜€ÊáT¥aÓ õRØXr‘(FÔÇ—!=Ñ©D µ”ÈRÙ•ôl;ìEž¥Ê©*ŒÞ†Û'™/L¦¬òÇX½fSÍfíC­@;Œ‰§ãˆýØ <ˆ,U­P¹¡'¥VŠzŸjÔU¶B”z™,˜L$6Ã…Øk¥*$žË÷Á›ñýÈuµE=a'’È-òº¦£v8ú Œ}«ÿ©íûÞOVœ%£n+L³æÝš œõèmöáCÊ îî\înWç?þkúßpO ·‘ ,_ô“)çõå?q/éµëi¬¹÷§Žêd Ú2ZPâ;P;KûH³EÄÎ×ô&!»T,œŒóÑŒÆèi"ëÍÄ`ÛªP†¢Pþ™xlc ™—Ägø½ê9”BÕQnøt2… r÷Ôßø}lƒh€?‹¦ ã£ÙNßÅöŸ€gT q:ŠÞ–ŽPåÑNšì åŽÆ@Xˆû¨•ª y<™ŒlÀÔ›\FÇâ —ÔãÐX'„€7ÊOzÒ*68)šÞÄ ó^kí?çr2ÐcÚ…ÚqÚ2­­vÌò=K>ñ××®­Ík.: 4ò`^²œheiº¾ÓÛU6Ë}·ë·›>E}ÀÖ"î2?ã~Ý¥ ñ[âžåùÎ}Z²žÛÑíõ-0„Üî'4ÕŠ×@³¥Î²’²èÒ”…Ž«æŒXZmP™¯\‚±bÖyïéaÒãèÌY\(LtJ8_`FÌ^ð7¼>ÆùÊ1ãÞ­ÔAÙ„ç$ëºÔ\ý¯t—¹Åôb;}Ãóa|àw7ýÑý¶r|0`þ>Þ‘ËÜÅìvj&Ó••º¸’µT€C•bS´ŒUV*h;jÑ™ÈS…«C›"ª©R‰Ð ÅDü(±K•«nPU!®Ä#dqKEz‘ééÄ r#c6¡µ_[Ê>ÄÿÆ•ô^6†:E?#séh¾R…2/©÷©6ÇòE Tá­Xi”•úø#z#±Î(z“}VÑ ð¹M‰ëDéf÷fJ4KY)[Y kwéì¿õ‡SÌÉÑ.Ñ´h¼4<͆ÍYæ¹>Rí ìÍM‡Œ"MÍtþ…A™Ñ`³!Æt'Öv €x{*½2˜ht¦Ô^客KB,{¾wýdw*¸kïwïcÇG8võC»ïííÕ=ç*b]¬]X{ŒNd>¯,É>:}ATס—õè=·óÖ‘©5‡gOÑÍï¬?›/âTú÷·¾g¦mWÃy4GçA¼t8NÿæŽdFÛÓg£K¦BPÃCþ÷¸óç9OõëÁ—vÕ{‘3qÒç˜U¸-sY³B{Ž€Û•‹ Yå9ÊÅÌæ%Ê!ýñaªÓªAÒEÈaĬÀû°@L"9F"—ð Èndl{û]°wïM?Ñ p²Ó¬!Êì)»–™€Í&{b6ØYJùJö©®Ñ>D_ø%ª©Š”‡¤õª¥*'õK̺ŠÎQ“³_gG©ÊäG^haÈᢠÅ| ;²2 c]¼qÛèö–ý·£/6ñÓ–°Iì^¦}˜IsD³ÿÊ*þE[ó½ì c=@Ç÷3H0˜-újtÔøyÇ7–ߟ¥GY–vfŽÑëÉwØ%Ì_y¨ca”Uß”TÑÀ‡=o÷èYüÕ×{ýš%_3}ŒÀž&´1ËÚPk‘ƒ‹2ªO¢Ó°Ü:jiú©)ë³gx.7űׂ” c,‡'¦&èó„C ‚žÏâµÇtÐp¹B~g^wÏŒkp_ÿéŸò–ï_ØþËá •û© äkt(6š­¾ KÄ/òör•ßVób~[­°Œ73ð@ÐMA„Ù]ƒË|¥&†õ¤^#™YØ^E}㻚ôª8,DSÅ\S]¦_±MJCh2”°Eý˜lÚª‘+Q„0Âjê×Bwá ¨΀ƒ°Ô"bŽ1g´*ítê£n¥4ÔW,Z3–ÚJ{ÓÙX1ý> ù¢Ÿ¡b"ʇ쟔Bñ8© <ÛKÎÆf9ªØh„ÜvFÎÁ øÁŠ‚;€NœJÚe;6hšR¾µä÷–ë®tЮ\ÃíIíRÍ;&‹¦h/:e‡ãò›wf{É à½Öž´Ü|cß°þ~·®ŸF? |ép:?¥êXÿ(!­ßžÁ‡,”5hRŠcÿüÞ{SLª[úÎi/3“÷píå!±É¬»ó×È?â ÔiõÆÒüâÆ±7úsëc;¼aÌø‘ÁC\Ó½ÓýFŒ\9ðý~½ßß,L9{ÿaùZp¼ò_ðœÃ©ÕüÁÖ°™¬>ýï‰qñ.ôz<Ù‡^tÍKD-߸½ÖÖ"¾³åu‘D0T³]ÑŠ›ÞáfiâöäY8¬9—ÉSi›"“«^5Rô/ûJ]GOiŽC£Ð3ÐMJI¨'#(â‰m–bñX@ÃðòAH“z$æ¦rD‚È×ߋϾ ;œå³îtG%“Føq<†ÒG‘ôpÙI-¹·FŽ ,d®oy–L![ÓT³®cß~Ã:±™Ê¿ì]Àß²ìø¿´ÿ{¯Z-3Ñ›ÍÕÞþ®!Ìì*ÚÄXÐ=éÿÀónå öp]ßfAaqÉÓæÐ–>Í0R~¦XƒF£Z]ìÉöa&Ї¨ÈmµJÎv×ë÷eÐ뇗$Îê3#Z=.¦òg¹‚ɳÎå+Œ˜Ù49}}D£uƒ$¿ÄlBöði[‡Wôo:jÌ…1ÚÑõcî¦?Ì ÷„Oø:z«µu7à5 bƒT~Ó‹@;#ÛÚÊi[Õ¾§ý¬xñKö»ÕcÑ,€î'hgZì ª¦ÍkQºœ78“ù%†kx\®ÊX5°¢ƒÜR1ì;m²¦÷—„Hœj d7˜´ÛM™Ø~øLs˜U­ažQ9ÔXÀ­Ão(VÖNm ª¿·±ºæVõ…Hv'O«‘”# S=KÛYCÑO©b±š‡Å>#Jâ \ oEJ™<"‹RÜGdDÝr—eÔ§ª£^¡ŽtÆÌnõ£¡©pU—¤1ä{Ê‘Nœ“>N›”yÀç±²~e{‹ÿÛ‘r˜4§•Ïæ°ûh˜ÁûãuèÿÛ8I{¼¹I»—™£ÝÒüF«ßìÊŒ§m¿­…ºzßÓéhf67<&‡ì…J±ägÔÝVݳûšè˜ÒÇËžøöè>t±âbàR+À¥{;ÏŒ–óz›ÍŒïýv•ç¨eý³“»§•¥>ŒÿØïÎÈ€‘†÷žr|v£h$¿— ´ â[¹Aôüõ|}Ñ|-‡£‹:Š}ûî÷œ>ß ¯{ƒ.FxÙ»LJ_¢z`ƒÔs‘Õ‡‚H[ÚM!º(Üýmþ8ÈEù9¦%úÎÜkîj·ÜÜWšÖÞ¶ÕOX3ÍmÍm/Vƒ%ÔOhxQÁ“nbúnlž£~׸“Žhê^?¿OtG#pv“XÒ4¡>G–XÓ«îk™OåÇÆOM0tã {äg±×øxðZúÀÄ0+Èl²ŒJ 7!H9K:M%ïBGÓû¨t €,Sf)*J“–ª ‘÷ðØF=J>O±7m²cE’ÿí®Ÿç½Áæ%êÆc8v ?ÍT§´·ù¿ïÆ'¬c,{À³îÄ{ã7òË@”£ßaô@ÍkXS¶I{Gk£Õj:Qs~xkëSVg´»Ùš=†oRyÂŽª Ê*EkkbPžÇô~ã=F\*¹f:¡>oX¿§Á•3G‚Ýö‚DÔ»iêèVoµ9r]Úl`&Ø}ø”ïûVõ±R8¢iØ—~V}qÁ.AØ7¸€Øq¼™ÂãüZþ= ¢ƒ´¶ŽänÇLG]—Vq†µý~Wkëö&Ûi¦ù”)Ùj"½Èùt1#¡&‚rÖß²çÆàsx«õ÷é2Ú-ª129ir4áš)wàuxÅØi´9y‹0ªZ^|«j;]@OÛ´¼Ôtãl‰¨rKÑ9q²ÛFAý‰µDrK1P\ù¶ìn呺ðÆ‹_6®lPH¡d褯 Óå«6®Kê×/ƒn1¸òé&þ³æ^I<¥©gsÿi+õ³À Ns5‰ô²¼G]CjPÉúníoX¾²eIs±ÖOë©}Š5“)O¸¡aøÔAÔk~\ó6F xЮt¶°áY.§m¶„pη¨ cÓSÓêsV*Då?Ó—ÕsÔcõÓ ÓEöŒÿÕîï𠉩#»îŒê°”œF÷ü__ ]D¾¼'üÅÂî1ž9/ˆ»Œ7Œwœà{Äœuÿ­­Uœ¡ÿçË*Î1FŒœè…3¨fB¤¢âùžÞˆBVЕì.¶ ëø6®¢§Å`A£þ!ã(;pmÃÚiæ0…캘^À¼„žH£K$^ò*·Ô$4DUö-2X/ذ¥8 ,ªÎ^|K5ÊTÌ‚CÈY¸HnY©êdc‹¤oS€ì z®ü$¦Î"{ƒl?PË) ð ²»´‚Zì—Y(üÕÐ%dʇ]•¯ÄVâg’¯U_j&+·ÈÖ(ÿ€&ÊO7jtèÑc¿ÿ îÒ¾AøçòÒÜKãÞ¤Ã[ñ#óò{ŸpÿÏþýÏëë#ó7>/rSU³x"'½´7SWÜÚÚÂuEû‰5ѨY j– Õ*þ ÀýÙý?(ºïõÔ¾þv9”š8 [UÔeR«©lFçyI¾BgâÉT{ž]Oo£BY} Õ3‚ëQ>*Èù!q°£wU8‹W ·‰Cê¡pf“aѨµó‚ ÖUDÖw¾'wþ'_wÅáX¸ßçºÈŒº! ;úpd ÆQǨ òÒ½J&á)øi27&ïÛ©µ¸ž‹…á[I„<ÄÓè©õí~¬"½Š3¨ýxÝ^‹˜ ³¤‡rÿ^®Íí—{¿T¨XIú¯ß]ç)^Tµl›êo¹¯W¼Tÿ¡Z R6ËÆÕô§(*Å›¡2eµÜ pV Õc"Ž#°Û32˜”£¾€¸S¯q½HZ’ÓpO,žhEGB*;õDå%yjÍŒš?*O*(DõÓª–‰wV‰£±m_W wHC5èËnçœFžöuI/Yø½G~ÿµ{ ¬¿íé¬^•t3v{­”)fI/á§r»®è¶:z ÿéõï†/S‚^§ŠÏ¨s¡Un¿ÝÎ?hö*=SÑ÷zRµaÌDfÞ  çÏÓz)À”+m¸þ=€©ñ¶%~Þ0IƒÙ€5àï'ýføŸõñ*ï«z_Õ3äxÕЮƒ:-Ÿ¤‰KA\há&ƒñ5·÷DÔ×ÕÁçõPíÉmá¶ï|ÊáÄsF´AZÑíý ¦öÎÁgwj"DBñkd5–B8ÓÙÔ~ W=©]Xļˆ·ð©ÉYý=Ýî+€Žáîæž.½ŒI°Ip,9&ŸÖ4¨ºCI‡ò¦ºI•yÒ·*‰£>¤Ü‡B•»8^á‹ô€CÕbÅs_f'VÀ1Ø+y4GU&é'¯VÄÖÿ%î í¦¢ð7 äBü¡Œ¶K‘‰ž$Ãe³ !P“úOI ’=g5=©VAUÀõ®UG§TunJ\û¢Ÿou[¿nä‡Ëlx«\œø\0zù]®=h/ès}k}éÅ.¡FÏßÐUïÕY&µª'~"fTðá‰%]Z£-çÑ×…¬­“œÙ ´6ôlzA}Ð\n£µuuƒø¿ØÕÍÌh ˜^D *…"•˜1µn«Á‚6 ­=·îøjqÔ*ÕÀŸ×¿ž 5˜äý1ð¾_d€6¸×`±òr~²ß¢×Á~Ú…hâ\!à‡ðïòÄÏEë¹rL@ÔE âÍÿÌIƬíµq€u3ÊyÉÉñóý΄‘Àͻ‚bq_öœzKü-OR_ÇæÚ:…žü…ôˆÞÔ%ÆyLgdþi¼Áè²yáQ´^˜OvrÊÂÖ²&¤Zå[{®*O’(ý\—]k3ŽZ³Ô6Ñ#«Ã}€{ˬ¬a rÀø\þ­õ',,ìÍ\T޶¶–~íÝ_ÏÃôÿHaçá9Š×”³jéTbŒÇ©¨ýb&]Ew®>®î57](o“Ï'»iF‚Õyž0yyÎ2“ì_ëa¿˜BDDî§þVéË1Å(Åyô®Á"CÞ/PßÓiüÊм´¥/ÿ×5ææêsÈUëþ$J<Å S^Ð_9×fNPœÐmªAµà/ÁSî=–F—b¸ç½„Q|GÐ^•Þµo­Îç˜s5Ü+\?în׉cÎYÀ­ã”s…~Vh4%¢.AVòkÈ;ä>òŽò|[ ñ'µ„éG>`B4ªöHßPáæƒýóÒøMIÉ+¶j©È©q’jU©µþIÅŸªŸB203 `X¢3u ƒáÅäuŽêæç"ÅÕ|8Záp™²9KLW~UÜï¬Í‡öÃ/±NÀOõUB`‰5^‹¦\°>° . ìÈÆõ‡‡ÔÕ¿^<¤FVç”æœ{´©¤*Ü3`xм×ÀçgOpMðkÿ…î[¬u=0‡›nºôFè¼Þ£ïíöÀk‡G7§9ÖI?fÙýëÁŽmš;_½›çÙœ°‰¼Ž^VÛV\¬™W]_ýwê™dñ}¨¹Ê O"ÐìÆm%Ÿ±}ØzÂÓ½iòèÌLÍ Õ9±îª= æ/ºO<#÷¢eò¹’l©yã‰ÌïÏ~þϹRðýjB‹nW¿Ÿ©¶¥¨ÀÎlRÏm¡†á›;{ÏÊèxÌ۷󳕗ÊÜç]ûÁ÷ ¡»ðÿA÷{ðz ¢õœù«ùa"Á°¶™>€ÛÈùÂ_â­‹xçyo¸œ"Î ŽŠsAðØ[Mßÿ›X€Úž®^ ¤aAd¹Š’0tqšF“ —ë­ÑK1N´ð¶ RG9ÔÖFhT CF­Êô+÷Vå#QxJÁÆø[°?T"1ƒXC\AK±-ØI̹õP•;ø[x wwG¾o®o°'l=èÄ[[g’û ]Oß­tÀã±Ý«ô!ˆ ¶ÆN7Y• Û–w±ÀŸX£ŽƒV)JéÄßèSi„’§²§w#Éļٺ’þBo¢öú ì'ÙÌoÞ¼4ï±ãð"8Ž®eGªgµåÖ•Ð¥•VÛL'Œ2UµbsõmìDfòª¢=G }›\–¹wØ¢ø/Ý á´=ªÆ¾_Þ0Ã2Ö¾‹sׯ"o³ZÃO†ŸE2=`p&g—ž%%øŽ‚§zö Þ¨“3—ƒç!öx Çè½ãôW7pƒgõî哽ˆ‹Ä~âÄ~ŸÆ>çÈnäX< ø{o¦Í1DæU'²ãŸÖ[ÑÖºDáðdí<­µ6‰ÍÐZÿ¢±’ÞÕj/æˆd©¯‹TK(ŠCôæ> ¿Âø¤šPÉžÔ9H¶ËŽB›LòICvCs¤«ê7¥É…D3Y‚Φ*É®Ô4b2n» ÏˆaÈ ø­ºP~Nš¥Z2uGMh z…LV½pe5=¬_è´ïóàËÃB½â°Ç_v­ —OsP£`%¬áu6wzíØýAý*ÕBbˆ´@<­a[n{ÿКãud^C\ÇœIo\É|b*y€C[úãµðùlkmÝ–c×ü'ð¯?GgàëÑñÈIÜ“˜¯ÞQ»pR{]ºcœ5b5¾Ã#ŸÚ„…òÛÊæ¶,nîÙÆÇmóþßGKÕ!6¹KöL%Bë×kµæô&Díw“§Ï˜dŠ˜ô2¼$è$Š4\,Ä«ç×ãñº€vÇòŒç„Z€ç\>Ÿw^pQ/QOö3E€§áEp·DøLÿþ¥ü^4IlÁ6!£¡yð]ˆžAÇI•AÆ­°3Èä²Fh£X¢Æa–°«kš¦œ…)i«¹Í^d׳+Y­f ~? iTn—óYO|3vÓ£_’«ð3èm¤⦿*#jn6½”\•gCBb Àý¾õCkû×?C.QG°côTj'H9ÖÈ#Ù\Ôy _V¾ï€åêsð°~K'+ÿPN‡EKÞ§. BhChAȨ Åv§]ü­NYŒ6 à}ƒåR^ Qž÷ “†ó¦{Äyu XpÆ7зØX ‚¾ ÊØq "»HçGátÍ:É8^¾¹(¯<¯T÷L—Í·‘l3y½¯ÊÆifùÑK³·ZímË÷Œrm´‹ãÔÓò'»ŸU ÍJÔJ…QË qê;hW™ùÒtϦ¹6cüãd'Ìd¼%z“/ÆC~>ß§–Ë&kºV²õ¤’‘ †˜ ;_œ‰lû•o0M2+2‚ô—­2%ê';Öò}ôcÁ*Ñëe(QýԜ鯲WÙ+Xü.vÙN^DŒ0 ê:?B]Y˜Yù²žuQþ!m éð­Eúôßê!²ÉÝé¼ Ô7Þ/Á½ƒw]O$éOŸkŸƒ™«¯É^eN>¢“Fõ †ƒ¿oSÐy­³©ßþ€¹¦AýÃå/¦¶ Ðß¡¿æ¦×ú©n—ánœ>xÙ§bAMD•Þ”iCÛ$l†-r­&Dóœ™ÂŠi£æ&¢þ ñâ.£Üülc sdCõ4ÙâšäçÓa--ûÀ›‡ *r¨0º‰œ‘K7<–(íÕ!DQÈØ cÊp°Þà”Éc“fY¦! ²ò1ÑZýÕB ¡³á5C¾0x´µ¶:œ-‚·ó-vLÈ— cõÓœ?,éŽmZ ÷SWBIJ…j ¼x•fc¥¤9“¨Ã?Ùtœf€¦Vs¾ ê)zw¦ÿÅÖáS†,H®PÉ&Ÿ=véØÇvf{c;Q'`¥x =….À›É&RIn"‚ðju2[ò±Ö¾vOõ@Å>ärN5Jæ §á²EèMx‰RD>ÃGã¥ônܱl‰ºcåÈ]Åqq–rŠ “7«*ð ¢Ïœ÷ù1]:×{r\Z«ÝRCh?Cw»Ž'ŒÒæímº‡£‡h”L½vk¢ÝC 4ÏÉVÀãî&­ wt7¸QþGÎO¨ ˆõ–©púCÓLfy¬ã‚–+ßæÐŽ`…ò`i "©owBY€+ÁÁ²ÃŠõD91†NfÿæYnãx”¼X[Y·?ŒÆ•¸+Ü‚k¡Ð*@)îN H ®@Û©»ûtêîî6u™ºLuÚNÛ©ç •±û¾ÿ{¿õ<œ½Ï¶“³{É^{XâuÍa ‹+èÅå¡÷Ž?iŸçO‡t8”€ÀîO£G<@ü(õzK‰ Ü#¿@\€(AÇÀEÀÌSt3ì ø > [FHภ9÷9‡8VöG¶3È›&˜ ¸å7ÝwÏyÚ{YÈÛØÖ‰>øO¼Óxkx; Ÿ-B†p…`_ÏÃ1ïÒô¤,Ö_†è£(D”í¿Í»[p%üL!ʵ-jvÌÆx¿x¯8×ÄÉIyIAIö„+±ËDåþ– 2 #ˆ'ÆR\i1þÙþ»83ÙoØøî”@‹ïÁ[æRlòûkžâ¤´„wâ»Fwµ¨æ«çõ„ê®ê{µëÔ-†ÁF±éy¶5Í:É,6Lc…~‚n“®\/Õökûu úÓº%†C—®B}¥5¯5´EÛHÙZeíMtõõÚö1í#›_vžUP-T[:K+£ç ;ŠÖS5¦–-[U—2zJ ´UÓÙ=¯ÆÓHÍHh—ðÛ²2gÆP½Ÿb"-.»Z&iΫî4ލ¢5Á7˜.w¹Lážè­Êâ÷º;êj—‘TúZ—ïoäpP])øQ;x×Ë.ç]¹Ïuç uÏ|râù•iP×]¬¯ZOx•ép<­t8bè‡.{.óÅìÄt€<ãÁ¿A@ >CC _Âç¶ÐWRõ À=È4€<Ö9›½ ÷ /ð L(SÀ¹Ê gDZél3›Ï9å-à¹óy>¹œNÚ2æÿCA©>×…>Ýû½÷ÞYÁl!YØ%Ô 7 FòlÌDªÒÆ%ÜöÄ’pýÿ¬/°+dg̸˜Iqº„Q Ó¶%“€IKëâ²£f16 ÆúÞòKàîFzàh>‰A£8”dîbö&î~j¿ý»ünT&Äá˜=„¶ùˆA=ZUawµv·f°æ’.Ëø›nb^Wj¢˜¯X>[§Ù–Y7Z¨fŠq‘>×À7¤êkõ ]›áµþµÁÅÌ4íÑG)Í~ÒS²\Ùñ¯ ¤Fb¶’«žÒæÝ<ºíuëà®BU«r|[ˆ]-Ƭ“/¯¼^}¾êÎPløÑ°••G4™Åm‚îSÆvQX]Éî óD5î ÐÅIñì=EÅÃDC·øÀF·ïŒ­§±˜]ìw~¡éÖÁ ª±F|¯¨¢{g&ZÄrip‰ú‚<lÇÑ5¿þ lî›Ý'¹wu8.x6y|)qP ×çÉ‹¯——•¯z¢ükÙ߯<êS¼Ã­‡«áU¨“( ¸´ <WL\€™½H|DÙEÞâ—2`³Ðñ#à7@“ ®˜g4ó(s#ÝÁü‘™Í\Â:ÅòJ3ý=¼¡ŒŸé<Ö…~/¦°À»;‹s†?_°Z8Þ§Ï·Êw¥Ïa˜àÏÀÏðÓ…@ŸKÞ§Hì5Z6ço’²A¤‰›—˜XšhKÄ%rÃÖÄÈDû¼Õ!;Eû‚º(äÆSî8N0CÌYÃg«ÙÎ;Á î>ïvþp”@›árÌ)ßçÄ7>TíφÉÚ|]½¶HGÔËŒí†(-C?Íô‡yŠe¢å¹í¢=¶ÎzڴѰÆPjPR `ÃnC¦i»i™1Ý\l>ÖC–ÆÖ×ÕÏ’l’„4–-n>¥¸¯œÝj#*¥/;EJÿÖ1ÍEÍCäÃêñ•—&dì/i¬J©N®’øš…7‡Õ¶ rðL¤ÛÌiì ú3°Ë}ñºBr…Þ,û¡pzOëÍüUŒ"&‡]y5iqز&rùäD~OZMš¯j~ÙŠ°îèìp‡#ì ò••¾ñ|¾"yËý’Û×P7ö79,¯-Þ’]Xxµ !ñA"ý/¼xÝá(ƒTÂÒ刱¨ýÄ(Ì&h,t&¤J‘f#îR{Hé„:’›Sd‚’A? RaóÁÅÐHø \égF;UÅØN¾@ÀyÌs<¬ïÎP7žûó ã¢_ÈMøF˜ã›é]ËÉås…S}û6úÚ}gùüBý®ûÖùNô«õýQÈ÷ð!GcÆcæ`ÎÐ~çü°@˜1!~YB\&”‘0<áyly”2²?X.Š [$ @òPzäü{ÊVL,K_͔ӳOr®3³žSE¨å„eDôgèxîܘømÓT8ó=ÝE]¨a£!ÚüÈÐïÖMþ–«Î2ËòÁæcϱ³h ý&=ÜxÛÜbžgŠ·Ü´2í0‡Z:µ¹MRwÉìš uœú× ³ÚÉû;êÚjÛ¯·Üé²Öž+‹ZˆŠDñÉŠ<þè³;ªè’ Å["'p‚ªì^ Q»ê]» þ&£˜ù‡Ì–$—â'™1§ƒŸ¨£Ù•#…±e&¢ÎÑúA‘ÓÕÞþsÇ͆Â]ö ¡Ô†%¨¯ý{¼òîäîz‘)ßdzÌíëÃÑ]’“ˤ a´a]IÃÃIØ?þ”ûßÛ8“˜¶Á»¼."3 ÏA`¸7¨YƒkG.¥ã9Äõ„C&xðØnŽÁ·aHî:a!²†ôyŸ8—žÁ¼Â]ÆšÈJf60b„ì ~íóÎÿ‰ïzÖ5oºï>%¾9¾}Ì>!>£|»üNúvø¬¦ 1ü;Ô*Ò´Æ€YI§ ½­üíõñi ËãÏÆ Š/M‘Ð÷&å5=ü¹È'¤”å†\ŠŸOäbCI+)(Á%¶š¾…–BÍ÷û#í!9ɈTlâ)r†Žý9éZUN[’Îfº©ûC§3›JÍ k L’}£u¦¥Ç¶É¾ÝÞeÛc‚êßëoëæhê Æó9›Íša-µü¨kk%(\÷IÊ7k§Õ=k¾©të§*P•ôÜÓÂ,ýëû2¬QÅv®mÓ¯Pv,m\9_v¥©£ùUËÌ®ª^ÕŽŠÂÜù´+Óu±M.Æ¿aïp¼æ?ŒûbNçLamfz²øÆ7ùÅmélÉh(-8n_¸íuÁ4»0’7×gÒÅ%À9Âìôâ¬ÅòõqçB«DKS]âÕ{¬®Žª[U6±¬-Ïá t ±N«m¿uß¿Ùsaƒ÷ü|Qéâ†x½@#°;qW°/7À\ˆç+ 9€³ 3zØ èyhBƒCWáÖâ§PŽÓ÷ЖÒ{hi2vZ܈ =‚—~|a{8ïš “og-gÍö¾&˜'äúŽö½êƒnç/g5%˜kÐ(7ôn4ƘH"8})î^2Þ3Þ5~³óïcÔ´ÈyQÏ#…'AÝD3ø0ÝBµQé”JæÖ`Z{.ý7Z‘ÏSr,>ÅCj·PéØÍÄŸ}&Œ™Ñò‡êša¥þ¨ö žküÁl0¡&“9Í|Ù¼ÝRl“õ±úP½g¬qærãaRߦۭŸh˜l‰·i­ËÍŸ 7TĶƒ-'åÞÒþ¦°&S;»{m@µCßÕ®ÞçÔÌ<“·v„*£Ã»Zwª¦·ÅS¡¬IO̪ØßÁìx¡ú¤© ¯¿^tÃ+Í•áVâäǯþ}Þ{X(®Ãñ+óª7ÚÑÇ’ÄÝ t8j£ÒŽŒî, N/ÊκqÈbõ ® Ëãâ2x)u`íäøhC»Tn¹çÔÚ‡ñµá{† Œ“³;wtVí0…ï£?­Ù½žižsþ·´ÏsóA! $xñ,¡ƒp—‚›J¼‚»Ûއ4{¬LþúœªkÀ>à·xhäÐU7œÎ'¦ÒdT0ãwá¡Ø+¾ãçø«¸kýœ¡ÌÍ´@R65Ž“#0 ŸøŒñeø®X©X‚sÞkþá2ffÎþ›Ë‹­ós¢~"nRÜóس1’è_£wEuD‡.ô}+œˆžÛŽ™As`5Ä>|<+nd¸o„¹> ÿ̇¸'ØçX(Úá ­@®BH†,okӜӿîiéé×Ú ãͳmgöÛx‹»ùŒ1É|ÊhCÙ$¶Dûz3ÁøÜ@Õíìy§}¤d4XÔæé¡á|Ï-Uwûë&bó‘–8åA•ODY3YsºãPËÒ–‘-¥Xº8ŸPñ³ˆîÛû°Ì[Òª$)KåÍÙÚÖ«í[ÔoÕ?¨WÍÈeÇÌdûÃf»ë/R9-g‚X ¬Y Zª';oïÐgáE) ÀWôŸY'Òiú.ži±q‹Ù¤}Ú¤ èþY)ÊX1˜;xá†áïpêKuÆú?r:õé ¦ìÆÑ¡QWE˽æ:µÿwb9yüŸþüŸ+ Ñ=Àý2ä‚‚ô!&éÄϸ %„­ˆxx=è ûf'æDPh2h˜ ^†@d`W¢Åc£·3p´DÜ)ÆÆSôíà‘c…?1ÓhÛiù¤jÊ+ê}v ÿ³°[¸QÀõ¹ÃÿÀÈÆîÀâ½Ê‘ñ*&;ßO«ç@ƒ§ÆÎ«M¸·EèɔҰäxb< Ž^îÄû¶Õ5t\2<ûvÏý&R7Å0U?ÌÄ´~´½·¢­ç,?[–“©í¸ýµÍhÕš2Œ¾7ÝJ]ª.T_`Ê·J-—Í]†½:šÆ·s|unõ‰ºaÍë›4Moº×xIö®6£.·®y”9¾<ò÷´}©}ÌpŸ#ᆴôèôaÀ ~Éî_U¿©ïôPK»oæ‡V3¤˜F¼id>óOÎ`*|žÅ^Ïù•>0ûj†'U^áVîp,žNç Tg$W5Øžc­ÁÊ*CƒÙdM3_ÕïÕJ•䢽E5Yß±:øR¸<ö´ä±”¤p8F3Á^`x`ÔJþ"õ޽r÷×r§mîÄôG÷¥°&ÜjÌmÌ<ÔQÔE|ä88 î\÷@Yyn[œ;ÁËÀ·Ð|ÜýÌ”35ŒóÌgôýästVÄʤ®¤É¡o;/ŒáCÍ 7sOøMàÍdÎcôPx >É+^‰Jƒu¡†âýî;B/†N‰ÅŠb›âÎÅtÅNQEn ‡GÎÚy.¢/|EØ[Ÿ)„³Èià}ô ÖPÎÏä£N{­ƒy‘õ+ãUÌtåÌç!üküŤKÄlÔm'âÇ'È8ÔE¸ð#ú}mƒ–l¢Z®é×é'è×û,8›ÞúÜ¢´B­43Åd;i™ežnâ›jsõW5‹uwô?™.X“{‰ý‰ÖFS•öaS`yKYHe¯¸L‘Ð2·9[ž\ÿxÌ­üû9§F-Jßš ‹IœM¹Å8õ‹óéT×I)}UËËnªôÊ“Š›Êš âÚöK…töÅwÏÖ â2>°“¾ ½“µ”ù…Yé5É¡´Æâò`‡ã·ÜZùó¶ëÓkúÛÒLÖ™öÉÖ.KŸq¶&²}Mià¨2—)ˆY+™„üMe77ë†6ÍnÜRÕ:Zu86€k×ï´ÞiÉ Ð&§”ÏûÓÆ(™î†¿Ã<Æ—ã/##ðû¼úðï2rØßã‚Û"ÏB·Öyn‰yÎ\ž›‹{™ç-)ŒKÖrß2Dz‚) „vžk⼤1 »ü6òý½ï±fÐŽ06òʘ2.sžíÏIdwÓ HiØ ”Ák¡—çIO YŠ„‹FÒc6ÅÈcÅØc 1g¢Þ„D<\9=âS8Y4/46h?!•øíò50;ÈG)c‰™Ç„4ñAæ}Õo¾Ó&  ГoãôT@¯2Õ™× ;J$j¢v½ÙÍìe¼l¤7A––"ë;ëp§¥¦·Lµn·l³€¬‹È`¬›§£8½t¶C¶í½Cí׌v-³½µT-¬ÞÔàOo’É’Kæ–HF®Êî™]¸´T0=ïòÇñ{é`Ä<è¶•sõðfaC ?†-M+VÏÕ4ÚMwŒbK§9ÆzÌ6ÏvƲ̢°êlïm«íi¶ Ö³Ú¤ÿÉ5÷›g›­ÖÍí¶›M_Ü}§mC}Aåa±AúY ‘M—ÅW&•(Ê5¹MÙë*m~CFÍÑâ…ÈlP>ìk Íá8“à†a˜ÓxªRU}³}DPg âqªíYji¬Ã‘ò'â_ç%ë9ýpÉÍ®§i_ïgÓT=)x2H2hྸsW;VýV«Ö6šv™R ë5‹ ?5^Ï ªÒzªð~Æ×>þ¢·á•¦òA5Ç|~&<ö»Ç.bª4†|­ýO×>·n€"¯g(…×<¤“J»B6cÂq ÂNä$è<ãŽîöyC\`1žbH•g,v$=³åË›éƒNá ¢‡K¼1L)ã&x‚#þ™Oájþ§àsþ$Z ±x“°¼’ôˆþ(À±.úUÔƒhŸØá%ažQ"ë#}#Û" #òEÙ¢¢["YØèP_Ÿ)ȹ¤í5›ÖW¾ªÛ&ÎË9“¨…ÃXÜû/'бÈ)»‚Z>µÍ/œÐ´²bEѤ–EË3)"'ø‹\ÿŽÄ]Jãv5¹5ÐYnŒ”ù :î´î†Yþ 8-u‰½jz³QÇÑ ZÓ$Ë"ËÓjÓNãòÎ3%£³]š?´¦h¾Ž$˺YÑ_Y÷™¿ ¹Ó©Ñ‹+NŠDߟò?Ó<·×nçáä0X¨§+²Ÿ<Ó[‹'ňáhøðCÔÈ%{dÁoÀ°Hâ.ö²ñòÄ´âk‰SÃïö¿ŸýV`g+™³X+Ãx7½‹"j‚a=¶OXè$ÿì¤t² YÅ‹kˆ}3/.7vUŒgTJ(ú}¤(RñTôDt$ìn˜Y´K”f ¹ÃºLL`úÔû¾|+¸G|EÚI_KÏì§dQgq_ £½íB‘ß}¦·­ÿ†¹bý¢ÓP)y].-WT%Öá®hhúÕ4ÒÄ0Ë-Û¬+lÅö¦Þ{Y½™v› oùÅØo¸d:`[`Ç[ªMs }ú½šœÎ¯ngѾ’_¤²“ÒeâAUÓÄa²aò]b£¸ ÑØÜª˜Ø++«k5Ë«cŽSÿšÝuô—$Âdõ'µKÏŒ׊ޜqmšÿâôÄ´Âj|í©°é^Eëå6ýL‡D90ÎÄœu”ú|ëï|µ°ãPçMÓ{çj™ ºÃuÚ’Ÿ‹À©‡Rו!kJû1o}Ʀê¥bE©!rȸ(‹êðÛôÅßú×oú+—èîpÚiyn{ÜG‹ÉO %ÞGÞÄŒG˜á°½Sà—`˜»‚º à³aS é3½#èiu”zWÎé .üÍésMeßbÅ3ŸrÊyýÒÂ~žBç3mó4›D{èÝ´5zmü–˜çq›–Ç튙‹ŠÅ‹E,½…ý$Zâ”í Cϯ£ÿFœLåù¡ýÞ4 zY«Ó˜sé+iwá )'?ìóz´s#áË!õ_l¸¿Þk8ør0§NÒÔ½0ŠLåVWëI Ö¬°„Ø>ÙºíOíAvŽÝÝ>Õ>ÞzË´Òø›a‚©ÛL°µiÌœö5N™Ó‘Þø®nv©_5¤ŠTq¼rfÎøÊ̺†šò:^ª¾I–ÔTÒ¬hœ+ɨ­(Ï-O¹ÚøECg0œçZ®ûÝvs‡Ä^ÖsµÇ £U;uÝ¡Š_ڮŠüÂ8w)r'@p8~Ä‚k5cµ?îv:yÛö绲JS±&WQÒ  Ô¼ê^Ñã­»e¼k¸¢ïÕUfÄŒ›±¨x¨JØR#^Ž{@/6vè¤Â ù.OXåþ–;áOÿÌ@ÉýӒ㺛zÛÈG¶‘—’A°Ïî@#h+¬vb‡DƒÃ€…`r(n)‰Â¢.3S™5øOøHò#tQÏããÍ(8Æ—{Û9lýKÆ8á=˜»ÛÛÕû>ó1yù:ÀÞ"hò†Ò#ÏGGÇ,‰KŠ[ó2*.rEÄ£kdITCä…ðÍáùá–ð•áêp³hRÈE–A®÷›ë·Ù—Í+f¬!Û88CÉ“ho‰>ÄÃôKäjücÆE–?¡j‡ÍÿתîäåâJˆ‰EM°bã›=L 7ÍË3Ç~ͪwÚj³m­¬›¬Ó,…¦IÆ^É„¶”;÷oU¦çÆzãKÍrM»´¥Rr¿¾¿šQÞT9¦î|öò’ •*ö””=­YØÛ¸D¦©W}¿vg5»*Ó&ŒóQD¼ Írjv‡c§%Z³Uü¡uDÍäŠDe¥ÖZõPBîËw8‚R’Rö–6¼fÅŽöë^Ö9£ÃKY^¹™1ÐËêNÍ¥ßsÊúnÉ|ã1ÓeÏXÛƒlÛ¢£óÔ9ýEt‘Fv³¾Az(yRV‰&MWà½~Õ½ÍsUÐîc¡F'7ü_)ÅÉï‡û}x%Þ ¢xz²ÁaýP%d-80 ”}ƒ­DD®DtcoâĹ8!nfŽÄ›æ[Ï}Î"øu J8#Ù@Ž˜Æ¥g1®±ÌwåÇR0{ü=‚Ò‚E!5‘§â1‡£UÑ£j#7EL 'FôD`"7†ïí_.ˆØ OM q°:ȇØ.üË>…>v.ŒÃáþî-fÿÁÔR8)†šILòc•°B;¸xçîô/ÚÈ¿^cÅvªº3»š/Ù>'ëéO˜×Û¼{¯öBmÑvCo¼mŸk=dî7­4ŘQ–Á–#æBóKãGcŒ™eèÕ}6½ïÙÝ~K¾Dz£Ñ‘1Jªóãr–TÍ®>W)olâ7“¸Tò2Î{P¤Í0óÖ¤>ã‡OÓºgz`l ö…Ðm¯{Æ´òÔÉýúáæÛú=Kû¶!Vù)¤ƒè×vvz}ª[ëýýŠèO¾h2ùW{ð`³Ö£ý¦jx÷FåÁŽõ6eÓÏPiL4vi;U¢V¶âS‚I\qo8@2%ø†·/<Ïm¥g˜„ YUw hÎ)÷ÿwz yJƒöÏÁæ’ Ï ë¡däi81¶ ´ ú SG~€Ú‹¼%Ò?øg8 !¡¹÷dÞlÚê+úøÀA m<y8­žVÎŒai ¦o+s'¯ÂŸ@I­ŽÝu%êitj8‘ËŠ´‡¯­ ƒE\áÃÏŠ6ЉÀ¢¡©Á£‹e¼V*K!¼ãí-Ì ö.¢çã4f6~é"¾ « rXD²ÃÁD±¾hñò/Z}#h~v”ï˜ÙC”mÈ®­êYæ÷ý¯ Ç´óôïL-¡w’ý³=·ïlÿ¼þs½‹m“­w­Þ¶6û^ûBë “¯i“a¤Ò4©}4y]ÃåÒ­’é8i_ã3ñÄš˜ÊÅ3«’cFó¯RU³O=²,©TZ5%g"ëc¹A ¤ÜS°ߨ˜6ÍÐfZ—Z^Zâ-xó´ÓØ|¨â³öjÁbY@·,«2èjؽÐÖ”|æi*Ú‰ùÚêBšƒ(|Ö\ÙmvSOí¦T­W§µûkh5ª›=º¶ß”· 2çhû͵7Z7uô:‰%cŽJ·J³ ëœó0o˜–y(K\ù?ü1ÿ\Pˆ7ä3[ˆ<ß籉z »‡pƒ 0™ø`ÄÄddô0n61u:ƊРwáW!O0É¡‚µ<1) ÷Þ[”t(;4ˆ‚Ÿ@΢ýęʜMyE›Ä÷H¸qü_…6áa·orØÞˆ½qgÒö%îÛx>df,ÐCd ¶=l|è=ßja½ÿ,¿þ{ÿ{¼ãô™„êš7žŸÌ 'ÿŽh§ð)i„ÄFÌHªš2‘Äbæpgî9%{ìŸý¶óLèÇxuÓ ]7¶û˜úš)ÑÒan4þª]¦ÝfØfɵYúúúû^ö÷õq{çZ§ZÙZíkíCmé¶çÖƒæýº±Ójº¥MW©ºüãdÛ¥Ë%7d´f™ ]ÿ jliwÝùœ&aó/u#ê6«Ý«ëª×– Âðöþ9°8,-À%˜n57[æë=-Bë0#ASØé*ÏégzÐy^GÖPÃjsYþ îοw ‘8á<_vangÿ~¥c°xë(f¸rØö”œ‘ëG¦ë¯ª·xçé¶è}Õc’1ÌêP[Z;u XC!w.ç‚§ƒB¡=nxÐ~ÀuÈ4¤ ö 4÷?àÞzýÍG;´´$‡C !éàB²‹ÕâÆa6£c!5}Pd„í†gÀº`Mp;ü&:þÙã`â(‹ÊÈB{/ϼ=òÇQ™iú°"v{ óÇÂ\M+ç¯>ãÍô bØÓXÉÞï…¶¸Òx—´¥ÉÓƒšý_ù&/ ñ™åk „†0C¨Üã„Z*›ˆÁ ò–`±¸Ÿa‚ ^sn9}ñ>¿{†ÐJ™D¾Ee‘}ÕÔ&§WãŸt *8Þ@×ÿ 9Ñ}Gs±`¶øšŽjî÷Ì×/³öþ޽߽·¸wCïIÛ S¿å¾ÍÐËë›n/³O·/0í3M3è C WzÖvÆ·þÒ`©+¬ú½æ'éaù¦†º†‡•Rù`IŸ,CQS('™ßðXÞ*=Z7¶~}œeN<\a(NjD¹}2»i¶š=¬¯×ÌBó­÷¦ç"~ø†ìeæ\ýÓ®Óݪ9*\•£eå—a_ݪÎëVÀ1V×ð늒䭌·zDðÁÜ­ØWaakZ3OÎoÊj]¬{jJÕÑLÔupØdè 2zÃÉçà„ ÉÙ5^ Õ~õ-÷}‘„ÿœ%‡C(íj!?ï`Ož8„ ^h,ä,$š cA„à›P(, *¢ÀWÀø>è+¡„1‚ ^ܰôÜaI©wR·EÝãú ·„;¢âD¼uDsØmшxIØ^4›+8Íë 3ŠÖ…<òÙË=ë}ÆweˆÑ¯RØ$øCØ,l÷OhéwIgñÇÐ[›‰ï18òfþB«w#?”°ˆÐIzŽ3!V{ B·‘¹4$5†}€qÈë îŸo³3l®êœân‘Jýª¨[j¥ÚiÖ}–cÆ?4yÚ6CœíÞ¸ý?¼»¸oÿGûË<³Á¶¥wvoUÿ©ÞŽ^]dÛnô}Úõ"Å ú¾¼ŸŠ\ ÷4pZæIIsä÷¥ ©øCV²¸±¯ëJ°µ¹¥ eUcfó‘·Ú¿»ó¬F"¿Ø:údO¨Ól6Ò,w,Om¥¶éÜíÅ?Šf½È{Ø‘Ù^°}³)D»Öé…qqùÉí•s¡ËM÷ÛÎô¤+îO”\\^Ãu´^M™Ÿ ècÅî¶÷bߢ7òY*Oý"Ý Ô"ø P°²ÜžÁ‰˜Õ>ê=îbÆêE‡Ÿÿ ½oûs¼ΕóÙ«s@?h8Ž‚d N ·âž!¶Aƒ ë¡+Á)@OP<8 $…Ìþ¹FÃÀ@j·"8/æs¢8¹3éHìÞÐEä8Mìø˜¼È'ñÇâï&äÅï‹Z´‡ñ¹èÍá%ò N ƒ¿!ˆ01Ü ƒÀÿW>6ð"( tÍm (zt  ë4x <éÐlÏ! 54¢ ™{£<ÐnÏPÏÇè#äƒÞ×ÌáWc‰ß¯ŒÏŒ¯KÐÄ?‹‹MŒ{»/V«‹õŒ“F6µójxs96î[Ö –†™ÇYìíäúß9Û G𫱕„[„ËpìÒ(J²›¤ $ö m®[‚›±#Ž{­DãÑ|ˆ]è‰ß¸üCY ò“2BùK—«â¾lŸ ܱHµ¬{W× ÍN Îìb9ë‘ŸëØªÛyOyHAn~Ò:´}sႎâtë«tûBÝyÓXóLÓn}¨& ù%#–y5wìÀ<»¸»Ðc•UæÜ™˜gé­biE™Tx&n ¤ƒÖþ-zràî;AZ¿æV{ç'âU‹[Z¾Å¿ÿ‚ý$ÐðcØH”ƒ²‹ºŸ‹¢À‹¡¾06äWX:Tõÿ8_w8*<÷‚A  ëžçAçÜá€z¸ ¨‚ÌðÜèY…-ÆT{ý»] ƒ!¦Â_@×àÇ>8O‡¶±§ÀbÖD€& Æ…>ˆDDi#|"–‰®EÞ &¤ûoöí~^gê™&¶ˆ¿Aðš“ΘF'b™0<ÒŽ^F­òÞÂiÀç¡;ðƒÐ±ø[È™À=¨ñ˜&ƒ×àþ@x^Þ’†Ó·w ¸ßN’¢oÚ];€ ¡©^.ÊÊ{tîמí!Vš®Z"ÍÏM‹ÑÖi«5ìèÙѳÂpÞ²¾wÍXQoåS¥9Å´Éb^Ö»«¯Ï®³‰ ríU|ûº&¨Ä%¯¦RsHö±éLóÙÖ®vPS@]¹dkãžf’´S¡hÙÕ*í4v!ÔU\;»}W ¨ë@'¡¹F!W÷ë]ÍšÞ:‹©¯Â ÿÔ³¼½;åŽDØýAqu¡\=/ñšÛi7o7‡cœ°+tÀËø€*a ´ê4oOë©¥´½ÈÛ›ê<7VŒ›ë¶%ƒØ>Pówª„-‡Ì‚"¼äØA˜Ð_¸ I‡º‚ÇýWé~ð‹Œ¸Hf~ Áààz( q< p¸¸ª@‘@èUègz.‡É!t¸‡µÌû)'3˜Ï²—R²Èý ôão„qŽóá¾sÐ@€_cODVP\Ða“ÙÍ:ÄxHxˆ„ëác5â_ã’‘r<•9‰¡Ãü ^Ð ÔÂ) öºµÖC¡Ï`_bž`ì$=Å—ªf¬¥u9#£ÈËh9Ô꡸ØÓxGòR\$]£`+Whîá–†zË«ÕB°t›ø– ^ÑÜÕM3ÑÍÓm]}Sû½ÛMQ¦Nc²á¢9Ò¦±dØDæ@Ý­®[mÏÛüš!b~uSÃþ†4égÙÙ¬ViëüÆ>éU<¡eL›3¼¿#WeVno/ë8ݹQõº«³Û¤´v¼êqï ÓÙͳz]ÆõŒm±>â¬K:bú¶«?ôýÕN©ÊñËH0oä?Aìs(³1\=±z&Œñ½Å2ŠˆºÇ¹{v J¸òx/‰”|¿jU¦?¹ÙÝøE"¤{œýâSûÚãè ´‡fccÐC gì?ØèäŒâoZàû¸_Ó:çJûJt`Âzr< †%Ò×ÁÐK¨÷èj¯iX;tb5ÄvC.F,‡òBãòI5ɽÈÏngN¥CÈDEPθOþ„ºCƒO¶D=µ‡HOû\ä&q^ÒHÔø)ì1¬!¾ ƒ¨©ä£ˆEX Ï5F ~gÃx–‚¨GÌ…s¡x²6ÅK€—£Ç¢Ø¤A´´˜§çz€.4ÍÏiwQÈð¦;’aâ|)C&jß™ãÜŸ¯1—›Z"z¶ë)s…nÍ7®ÓmÕ›_Øfõ®ï[Ðè%ZvZ$ÆiÆ•Îè×¹z½a“ö×î*¨2°­ oÝÖ°QŠ”qe7¤léoaõÊš+(™Q1­ÉC¹Åé+UOUŪíêdÕ¶6™$°1²ì£âdÃ)Õ•>ù¸Î±Cú'[]÷Õoº·µN“ÿ¡¶tÝr¢å… À8exí]½$KæŠsâFÜSÀÿ·R7|A=X¿³µl”Ò¹6Ä®ü${I‘S" Øý ³oÚ)?ú †7LX»áäí© bÈ/P"$õ?bþu„¯W½Ç& ¡G쀇ޅÄxÎ+À<øiøp°ÆG•ÃàE0Ü‚¸  ¢¯1³)£¨;È7鞈ÙÁ)d×3‡2Ü™˜Ç™Jæ4Å“xÖûHðÄè}Ñ{ãyK|ýü}8ÃØóh1ôšƒ™Á¹€Yäµ€tŸ¤Á §Ä±>“‡âØ ~D¢×Jdì º¶ 2ŒÞN€f!  ï sHÇ©1ôßÈAßl“ÑÙÁ­ÛÛ+Ïd¦¦²½ Û$£dÊFB×g$¤Ô°Ç¼ËòÂÒg»i™`^kaY†= ?¯[ɽomkl3{í½Ï-ËmOÌÇLmº3=ŸÔ=?v¯RíTåtlQDÕ}–&É߉/‹gË=äÉ rsÎÒüÖR—¼Í˪âËï«4ݨ¦ðÄ••M2h•]nQli[Ó:±mPÛ{Ãæ>=Òz¨‰W>½ƒW:+Ù2~ô箿Ôiì~¤ùnÝÇ/^D ëïü•ßãÄ<†±´pzá“–åHÔp×½þmÂU>«¾Éëëãs‡cSVò a0Šp`Œ=À (™ýÍAñþÿ|’[?`µûïP*lìl p%`0"ÖÃ|àO`Ç¡¨P¸y‰aŽ TH¶Wj“×*T>þ'f#­˜ `„2±¬ LÆ'Ú´u´Ô#AÀ Bü-öAò)îQ½ŒÝÂ¸Š­'7ð‡“šˆ7I3IBï%üÙ< ÇLÊóš )B~F#‡C‘ˆe E·ˆh?ˆ/ ˜~ƒ¾H9C™ŒØ ðx$·ÜTÚìæãÍWßËÛeÛ› %/Ä>’ë2YëÜΣæ¶pƒÍ†±K¬Om‡,§ôZý+Ý>-ÔðÉøÐâeä¬áÛ^˜ðsw¹:N³©»Ný¡gE·B%V)'ª)ÚuÊ Rœ¤Sþ›ÄQ7JX­©Ù¨Xžß1ªrÈ…¸‹¾—ð7èV?˜œÒÚ/wo­ÁŠW4NoOè\Õõ¡{™ ¦«4zÙWhŠ›·Œ9[œØßÃ#NŽÍê­E/*_ן ¤â«Rc¿"|ý‹îþ í¿çºÈkcl¹äº½EõâOQ{£cRÖ|±ÿþÞæ{þ(õ›mhHëÄ{ô?J¿·H“ܪܗ¹¯@ï éèi^x dª' ÏEfÁ–"È?§oÆŒŠƒÝ‡ñ‘ ¡Ã`Ÿ¼F@R1^3ð I ¨‹¨SôÎvg(ë1ã1c3#™ËNŒ€zÀ2ø(ô}Ò"ºÝ¹¦KSå·Z®4*b[&6/–ß;äyb¾$Y&’Ä(Æwþa¨uFLXm ûÙÛ÷X7[ôµ†·z”á•Ql~fÝ×÷¡Ïß®6‰µ=j·öÉ­9Ê‘]ÀnL±ÍÒÜI1Ñûª2škx"ß&“’kUõC‡OHØ•B‹,Œ\Ò9êÙÈÕbf*Eµ¾ª<ñsÌ‹âé5_Ô2»5Që©o?g½iáö½î}i[lë¨v8¶y¾ÑÌjí7(»#ôéñÙ’Ã¥_%úƒ?õëßñø+?ÄË{~tOåŠÜ‚úGExŸ¿jþÿ£[<v{F{žõýC"|ísÞ㥳´Äí£»Õ=Åí¾[ p&¸ö‘ÿ?†¤a/À¢`«QÅðh¬>þâ…H€“àK±^^ñ+ñ÷± Ïq­”fJ -O¨ã4rŒ4éõc7UBõÅÝG&“””K´”ä5xKŦL&º3÷²v³£ÙpüPÌØ .€µÁ­ðÐà1(^ëµxªáQND¥SŸŒÄúÐ÷×~ÊÊÿÞ°¤ñSËGySóŦ£Íœ¦ô*ŒüXÝ'ÉGI‰¸GòsÞĵÝê­°Ÿím´MµVYBœÜ=Ù~Ýš`R8õ=ß¶ otØ"×á4¶ÂæAm•GT?w—+ ͤ朮mºj~kM“C¾¥ñ€\ Mª¾^úªx~q[Iÿ¨œÑ„2T ¢ål×Ö&›3ªâ„B£Ô©|h)Yòò<ñʆÎÎjÆ64±$:=}/lkÕØÑ”ûÜí©ÉåÑAt@‚è›-úoäþy?ŠE×—&'¦®š0kÐ¥o;·¶r8¢¢–8¿”ø;ó¼ó·5ð÷_@„“oŽ|w#`ˆGˆû&·½ÎpuÂ2àdX| j9²Uëuñ â[=Õ Ö‚,ˆc¸Vâ:ìlÂaªc8!‡Ž¤ÿAxÉÈóþË£ÜAÝA,„7£Æá£‰Ï¼¼¼ÞzMÇy`–ÀNCJˆ28 YJ¥6“ÝX&Ú(ÜhÔRÔxt8D뇯‚…€||<ðEupsäÒ€lEÀ™ÜÕ·Wl$ÿ02Rñ°é¹<­Q×X¨ Ëøò_ÍR¦t§Ô( ­]R8FúDCêÛ6vqoõ¤½®7Åšm=koþ` ¶hŒûŒeÖcö*«ÀQl‡(´gé‹z¨6wu·Z'tìlÝ6©Mß‘Òþ¸Q-½#[SR26__æ(81´*ØŽ*<[W̬!hŸ–d·®WÝÔdæUKJ>7È6uçt=Õ|2¬°32Æ›¬]¹Íå>Žú™‰ ˜VXÇ÷È%„*þ;õwTþ™˨\úñšµu7ÿ‹lìž}–æ¨ügÏÿy·ËÕìÿñºingÝâÜZÜ&91Ÿá1X”Âa8Œ…*þ[ B"^CNÃÆ¢ß#@ð‘¸G¹W?ö2þ >€8ÙùU—Ò@¼$¼ç¸1ö{]ÀW‘]I?Êh?b¯“ÒhðƒèD ¡— &i‹ âZ"±H¶Pî£>B.…ÞuZGx>0PêÙQ6BN •´á(.c({ä‡ÚAiù´z—¶„–é³xEŽü”¤T*jš,>êŒhú½!«tIñÊú™¿¾§ÅVn9jRݬ.–HƒÙpÚŒ7»g]L{MæLµ;¤í\û)ý^“DïÝfhyÔôA,ƒ7?o¹ÕÙÞÂT,—yˆCkVæU0òåpp:qˆvè¾ôÝ#–Œ–ÔÖJRk¦Èv©–õ îÑÞ-v­M‘0:o¦t©•·œ{ˆi†û’¸ªe SiõXçweÎÓ!&MÈžÂaS>ÑnÐÞóÿBnd·/ž¼¤Y$å—hªÿÙkSXY©òÛŠò_wæÿì—ì–ãVï–æDü+¥>€d˜9 D¹^} »½m‡ƒ…b~Ç¥"²Ð¼‘8´XÜ Z2}ã$ÝÈ%ñf 3¹3Ø¥ôÛ?Ú“ÜÃxEdÑ60☨ûP³t¸‡—t5¿‹8†€Ä†#vRÏ3Æb|è*l²óÏ_›ŽŒ¤¢"¾ø…4Æel>4½<ª°œV—\õº5[Ö¸«ñ`“CúRJ¯’­’~hh”\4ì/Þ)+VVØ¥öt›ÌÔkp7¸[4}§{‹Ldc¥ c|¨¿ª›hr52tÆžým=m»ÕçMÇŒ§;Š›óä­õ­”ŽÕÊ|奸EÙtVº¦!¯ü§œŒ‚Ðÿ‘LÎð Èü%3nŒ¢èáèÅãäBe’êIûô¦áÅo%‡ÅæŠ÷•IíØŽSŠ–Ö­CïÞä`g±œ;î8Ú~f<}³[‰gÖÿ¢Å¿£ð=ýŠù÷»ÿœóŸkþ*ey>ú›ÄOrËußæÜñ½÷¨u^§2eàHðN ˜:°lžO‡Añ IàÕÐUðYHWØq¯fÊÆSæ&öŽ™!¤M÷~GÁx×sñ¬j¦Šzƒ<˜~=Ž8‹TÌNK§m&U Ï‚ß`v¢ß£ná~ H3ðgaÁð·ÔZöjZ £Œ\ó'âF·³žJh/h«W#”^@«`ÚYð¯ <Þ; á~Ó~Y´ü¸|UcHÓ!ù;¹‹D]·¬®·þ±Ä_|SÂ*ll=ÑýY/éýhž¯sמ2 Œ F¥udï[ãIÝ%½Ü¸C3H7Á0Q·I“®öíz­‚k©=ÚÊ×Õ1jÌ2YÛ8ågåPÕhåTE³„'Õ×ò6.^Ÿ0èÈÐw#¶|þ0§³ô·‘ÌÒyUOk+d¹£hcîwŠzˆÍ“«‰ê ]W'VæËg¨Ky}ËsJ>@qeŒÄ„Œß<¨¡ñ¿å¾ó:¬ë¿·\^@þ"#ZÈ#[þ†î×>o+mÄ?J“Ü*¿~ãó©N„ó€µ€Jà:à=O<˜ ,ð|àάiÀ© $"Æð á¤ô­NÿZ ­˜æGMê#{1¼qÞ´'´D¼¯&=Ã(éÌb&¡ÿ¶÷ ¡òz„IÊ&í&ÕR3±j¸-•ýD]Ex„²~ñ¬NðÍC>G¨sÉñç »˜çÂn£=à ²2l5Ôø¨ªýŠ5ŠÌ¦ M3ä!òÉò»’8gDêù±3l±¤~TÃà†Y¡]Eº~K‹=Ìô¢§P{ÊÈ2õZ‰}Ç­k wµ¡úvóýcM®¶[›¥[Öíw—tìËêb%ó½Í%-œ¶‰í‚ö;б’ÁÒmU™å…%§Š^”ÍË2øÅY]ƒ?D¿/ü4Â+[–õV} …” [,åCÃÎN‚ c`VÌjÐVžTîI¨ËÖŠü Ól²SÞÁ¦ÿ©Sÿ;‚ÿ®ÙIÚéŒ û¬Ô¶ßìøwÝ÷ûðoÁNon~ÔÔîÿzò÷…ß0èõ<éøeM¬óVNyö§@À]à‡à4È; r"G¬ÅžD¿@Í#vlt)!+Âáçñ(†‘¾A¡RÓØê6¢†Ä $S®‘Ÿ¡f@·¢" õ$2¼™‡H¡µ0˜F’É·þÀ®œpÿ>+ œ¥„³÷pqÀ\ï 'ƒ9]2©§TãFµVÏoL©§6zÉËÅééñú¼†£u ëOH6ÖBë“ê–ín1kÓÆF%š.w¿ìŒ4¬1o4l¶~ìm²—XE–pC¤µÎ)ã=”&¯{fgG}ÛÉÆ-ÒôiãIy”|¡ !» ½Ú]{ªüBiFÝ *{•.·sÌü¬Åé‚!ã†÷þ=±'-~¸~ÌðÌ2Wç×®WŒK£¤ó»O[qÖ^{aÿñÂAÅAµ¿$]Q—u(Å3ÜM€Àª?5èw¬þïéÝæòŽgM­í=¨ÿàY‡#ƒN9$©_¤à_è~}†è_¥\çoiø×ïIL¦ƒ h&è&V;¿^DAèЧP0˜ãÜÁó‘0s‘^ÐÚKzÚáôæÒÂ™× ÷0›p41Cn$ͦ$ÒoSBðh }†;ƒƒã™$ün¯}TkÀèbÄ“FÒ›)k¼¸ ‰ÎXìBÒtf0«™sŒ{ŠÝæm¬áñ)“ñ¸ðêÎ7ð벤gdG%Qš,_ÐtTz 6»&©]¿­Ž")­ÅÖâ{{V›xÜ¿ÄüD³Gça^kì1ÒÇvŒó1Ê ·û ­®ÚN}!Y«<©nÒ”ji—«)ƒûÄ êÞ‹}dDùÉ•†±L–^çYy´ìrYsyÁé|·"ÂGTcTh¢$ÕùF¦†>"¹ÆlknV,lçÊ[o×[7Y¦$ãçfñð÷q£$_r^}ã’!@Ï%V7ç¼ÓþK÷¯˜åK&ÔÞ-¹YÿõîŸ×eî=)oœãÎû†ß[íøÿ—‡äÁpöýeEð€i P( x¤傺Áhð H(èGlìl+$Õk-t4n3™ušòMÄhhV}3%ŠAeE3Ñ&ÐnÒíÿgoÖVÒÅ1ÜÝ H HHB‚C¡(PÜÝã"D¼¶m·¥n[ïÖÛ­l»uwwwå»PÙî¾ïûý¿ç?ÏÃÍͽs/™ù™sæœ3ç¸ º=t qxkcvøÓòˆ«·Ý×…6j§J·ë^2÷2÷@w†s¿mª‰…‹ÄÌòëvÄä•ë³Ög«w¢W˜S×î¼mcnLM5 O?i]ÞŽ§íh’5Z·ýU½ª*º&½¼¹W³º¦¤îf•kÕ±ª õfœLMÖSS/1ÜäP„ámI–<©7C“¬œ¦¸%ß,tþ% òky§Økyµ¼Áþ|îŸLP»AëÛ¦UM‹š[ë©U‹+‹j ×T/,›á[Z +ÓTí+芈ŒÒº¼! îå½ÍUßB÷̆ E¤3;ïó8í·ÐW£Ç+O%6»,²71ûÆB† §þ‹ ÷ÛÿÄã;fŸ_¦çLOÿùÊÏ爰پ?Ÿ8ïø1´ÀÿƒÒHz¤o¿Å$_P¯€xé{¸ïз‚ oôûa7`X°Å4ÔPaàeð«ÁM#œI°}„;Úã‘G˜»ƒ[‚»ÖýŠ»ƒ{²Ö{‹g”'Ôãá7…·º8›Ûe›2µ´Ésëõ¬köñVð§^®>vî§íÝ<[;ƒ|½W®X¨Ý;ø&8ˆôÆ{³·©ʆjaéV‘«ßt§ñm?ÃáGÛÞQF‹lÛÝ]s¯Ü°"®Ì·b{¥MõœjMÙò?«öW5ŠA²6 oDéÀqêÐe)…Ír_ùõÚ¾Ãê_zÚ»Vðõ8 ü“,wú Ærާ€ÝÄ.â.æíf¡]bîfÔµîn\Ùx¤Ò¤ú}í³ê°ª*v¶k¡i©K©¶Ú¢6·D–Ì¡£Î Ç‘}š&WSÁ“Í’ýbaçeaU«¼t£³¯Ïçäg%_‘ØoYAÎOŽ'wðÁÿ‚ý¿1ûÏï/&Ÿ·úæ÷:Ÿ\õžÿß‹Áùîïûˆ“ôÔ?~EpKöP{°à Üï¸oõxé‘m«u w‰õ-ö{çù•éeð0ó<ì²ÄÍÐû£½ Ñü¡c·µÛ.x¼ÅµÄ³Î£Õõ7Û§†`«ÜOÚØå¸´Û³N²W0“;*;:¢;n¶FµÝ¯ÁUªΗYVšUÍ® V¹Ux•l©:^wM´¸>°§¡½Ù•lP|ÄÍ—tþ*}¬¢©ÝU¸îyÂ`ÖÀB6‡nF“Ñ3‹‘ôB°‰?eØL~çF;»ecí‚J‡úÈr½O]AIÌ´–œÀ|MQ@ÍH=;o„B  ¼çxÔý¤U#ØU'‰^Ö]Íäeqç5Úô’²^Pn±S—¥½}ãã& ðÁÉ1= $û†Þß(ü}l5ÿ,ûÿñûÿÉ×ÞûÛï×ôèz¿é퀴M>÷RoD y ݨBÿO3¡Ù£=·"ñ‡öBîC‡ é/0¶7¦¾2±µe{ØzDþéJx#ü%îùŽõD{ó0taØ@\ôà'áîpŒ5Ó®Äó#0Ói»çßå>ið^Ÿ­¨rŸr²cO…Ûj‡­ö§‹ÝižÝ®‰pK»›Èa§e«9×ÕÃj$>Ž&çrw²>u¼¡/`ž ííxÄø«m{㛚¦:z¦zcõ‘Š­ Ñm¿0IÜ ¢cJÍÀò_B{7)Þ‰»„{yŽl^Žìš,DuC](C0òÛ6·ùµœiYѾšõ «‘v¶­¤ãB{hÇrú{¶ˆó–õº רTE­|WëY]Ú^ί.}TÉž'­I®œYy§þß5gÕm*¬l¡h-ç"+‘%eÿÊ)蜦0ê2›3vÑ/¶nhšÞìÝŽä÷Þ>Z k-?ZÜ" ûv-Ýá¼¥_mˆüq +ÝêJ‡‹ïäèædçYž)/©ómxÖdÅÌ’Mô°•íÃúîº! Õ½‰ŠAñF¹Èš½Gµ£ø¤¼J•'º'8]¬‚þ ‘þ«—ÿÆçÿ~&£'²–Ôýßëüû®@œ^½¥0›¸ð|`¢Þ?Òûüã×ÜÒó‚^ƒ¬õNCGÌ k˜¹Ís‹X >äeÓ#Îþާm½­/¼? KÀ™†¡Æ<;¨M¿Þs–Ä{Ä'Çç¬Ç)ãÓà4ý£ÙŽðižáð^·iÞéÞ \GWýÖÃýý>zŸö¼`EÈþ-â9Â7â !3üH@¿Ë>8ÂíÝâätÌl“ÃY§µ¶K¼Å:sG±& Ñšo,ÜÉbf1ï2^µ_o8^Qu¿v¼ÛPYÅ(ÇÔXÐPÂ4¥y_´veïI÷ õmÕ1åFù<ÑVv ›ÀyÍ&uB%¹iE¬»Ülö³vAóÆfKÆuÞ}ž'ëÛ_h/n,‹€(4 $„®—üMtŸ–þzHãôÆÍ ko”§TÔUJZÞU;•©h(·.®Ùˆ­ˆixÌÛ*[Ó³œ—ÜÅ‘‹yÛñógœŒÝëX[à/´àW3õ“-ÁV6HÚÿ¯‘¾‰9Ö>Òê_ûo\þÎû7ËA¬àéI|3gýâ€Ókÿq| Z΀¾€,ƒUék!ŸÁÛŒâLoiMg›Ü6= <èòÀ‰ÎvÔC´`MÍwÞÖÿlpÑâ&òHò|èBÄ#E¾0_ª÷;´~ž¹‘W¯WBæñz_Ÿ‹Š@LEéùEú¥ pÞÞÓýÞ¢ñÞd>ö<ön6±‹¸ wÉAê¡¶ y°8xí¶¸isÕ’b˜dÖc?bó?ìqºÖ†Ä{Å÷gضë2­S+šŽÔŽ×ª/«çTæÕ,kRqí$«ÔÁZ±VÐóª;G£ìîTS”›$÷Dñüì\ö\‘‚;ŸáȼÁìàêuޱ·3*ÚÊZrØÉ¡O‡ý·Iä-Î_àíã"L™PôžeÏíné¨7jð¨õ*üRHiyÌwbÉŠ2§¾IN`<™Ô”a4š&¡qw™t#Í›ý’öŠ!å8sœ[^çªÚJª/h–AÎý«×/èþ¥»K·^·Z1é%÷3‚ÿ7üËÑ;Cà ÉÏç J¼nÌ.bd4&¤e€õÓõºmÑo2ǤÉ0_?Y–Á#3…É"[W´³‹W<¡5Áxò±M™MSê?Tø×—ÖVÕÏ«Û[²^P¶¾Bà D÷Ü®Rhu´¿õ4õTô¯]\«S‡­ÿµèMË•ÎÊîÃÝž½ðþ¤>©FÝ+ë¹Þ}¨{…Ú½{T}KuEöšï̹Ê|Â@3,¹b ÑÀÊb.Ú)w¿å s·ñd‚×LkúAÚ>Ú6VpDØì @0ÊÚ~k·œjZS­¬`Ö²+I¬#ü5üékuc¨y ˆçµ;%¾mg·¤ó/†œCgïl(ªòè¬ëL•ŠŸD¼£Òî”þÝÇ@tP0²ÐέgAl þ˜©wÀ¸X÷“Îq[ÝhݽÃz…?P¼‘óG+#éçwü|Þ›»½püž¸8*ͳšˆí>>~Í÷!ÊÓ U5q>QœÁ9†FËH¿=aay¬vªö|›˜"FÎD5‡€‘¯=h»X;”q„YH¶ÓV›=ž»üþ@Ý 0Fíõ_ÈCó¡Þe^g½€Ø&¾_[à—ÌãÌzá*’Î9æuÔµ@:ü€ÓxŒ/Ý!E“ºbßiÄ üsüpÌãð‚`\€7jÄŸæcéöƾÚòä{[°Ù]»eæfÖSÜ”ã7'ÛË;ô;¶Ô^ª¨¬è®bÖÝ®EÖÎo³kÖ¯«M uˆŽwÓû´Jížù=%=é½GúµÁÚ½‰½w5j¥®ô™°žƒânç¿ä¯túøG€O¼@}!KÎ{,¸ÉŸÁÛÊÆÑíiÇYBþ6¡=½³E]s©neÓú9uoïW*YÖ.bX²’„{er&©.­+{JiVÏYj¡ŠP¾è„4vÚr>qÁ|A+h·Áñ?E…mÐăW+äZ0ütL÷¶Î¶I?¹Tà¨ÔÓêíÑËÅ}CÝ“»°ú~øWÌþ}4 ¸úªÖ…üïëß5p­aoIÁåвÕÅÛ ¾ÖQ]6`ÛÇ¢L¡Aˆ1 -ÀÞ ŸN4HZœhš"L]š°Å´\ …ºHñ¦q¬…N=kÿ~ÿŨM(‹ÝÀh´j·{ r7úXÀMøïfÆÖ›Í‡ zœË±,¢qÂXÜoI[SlCœóÝïz•£Û¢sb-Èc}ɾD"Þ„p‡€Œ|öЂ„#"} \/Þ@oTzÉÈÝbÌæ²QµK€Ãu÷ÏîNmK; i.LWZyÓµb«²¡Ú‚º¾jBåž6»²ã=ã?DÖÖŸ9°c`šödonßú¾Ëý¶ƒ™ý̾ríÙ¾+Ý”°.ÉŸ"µ¸½sž%Þ,© WKóä%¯„ÙüµüA‘¥X.¬æÏ<¡wò0?Ð7µÔ¶–5l^S[Qþ¤&§.¿`qý̶íw:츾"bs 1Z[Ù‘¯fªŽ© ª~™T~°Ò‚~¹t;e_ "d“}ˆÏ~ì›Þätl „ûöý+p€í:hØIìèÒÕ ~Œõ¯uÿóª©kj­W}«¹‚­ë­F4ÿ\ó~^jaŽkÂøø ÃõúûMÍ­w:YÝ£á÷þ€CG̲̀4š¬£"G¬OÑ#­ µ„löÛèx(´7|É OÚâÙoÌŸëØß Aå`žúG¡/"wzŒWÀNÛFÀÕŽb͉ãªúâO’è¾y.BÄadXÔT2?6Ÿ|”l@v&@qúáÃá.ai˜^¿ˆZDŠÞ)Ñ~Ð" °°0i6%æš?4P-´¥[¼Ð× ÙÖº¶‰ùˆ åÝb 5½¯Þ[\»£ŠZ}¦jA‡ ë4kkç¨gwŸW¿z°vÀG;¿7¬o¿6CKêY¯Aô=í£ô`T†²ÎN#I4HúBrEVÐY#¬Þ8ˆc$Û$çÄÞÂ>žM /Ë:×É}e\QzÇÒÖÀæÊ†Ð†Í›´¬ilmˆmšÇèc—Usêí;Õ ®2£îLÕ8k…˜/ÃÉÆÇK¾IMú¨_ tŒ—Ë bhìõ¿ÖOír fohXϘoutÎé`ºËuA[@)?0g÷éÝøñý;¦|½ÔâÜf÷&'ÐWïÇšdíTxrkèß{¾×vM€îë `F1°?õ7¸mÁ2ãæQ-ð«±AK]öšW¿kž­ ;í}òmÊ{꧸¾,xBMbeÌìÀ=˜1²Þÿ"Õä÷ ±!r!»–:·´ûl–lw×…óìLá/üi„¬ØÓq®”„`'Ô}¢ IˆÇÆcMbËIsIkq{CÒкë‚Kö£ P+¼Çœ¹Öó,ÎXØ/3%?3 2­27«²øÄ@¬›ÍxÀ¦ Õ’ƒKÞ_ ´êÞ¢§eK*—TÞ.]×VƼ-Z'«éžÛãÜ÷WV»T ï{×ç©Ý¦ íkÐ,U_U=VËÕ¿+²å÷åÍr{YKç%±'°‡É±3[¼•·P”#– *yO8Ǹ)‚µ"3i‡ÔP¦Ÿè|Ïën%6]m¼Ø|§>·6¬:¶êbiK®c¤m€3[à-OWŽ*H\;÷I“hÅEy–h¯\ü[²›ÁLØ^ˆx-t ä܃þ3"3z¢¹vÎUsÝ7Æù÷þâЮpô0ØÀzí” z3¿ýÏYuÑ…ãüßΆÀKLÀÞžüX Oª!´êb¼Ü­œ‹ñ =˜ûÔ›qK(wR¸É÷£:ÜŠ)³ I.Ø ì"äý€ndŠO–{œYÝ„ƒ³ÞæXäúÙ>Ôn£§o€ ¶$ê>–CèÀO#û°…Q±õTbup9•Ë&}!¾ oFúù§y—y{ú 8èŽîöžë\æköÜmζÉäw@Ú´2}ïø‡Ã³IŽhl>¥¸æÞ ¾ÃLþh¬z°,ªpeÕÆªgÎuÑš˜¦œ[r?uöÍ@÷Íîží½¿õ>è÷¸ÑÚË장ޤ¾¡ P^W†*û»VI_ˆ#óø¯D±²×;¿HB¥v¢lÖíŽr¦÷·@HFаBgÖfS‡uë¥æÃêÛë k¿àêJénñíè˜&­‘/T€æ]Ÿ•ta2.°®ZŒGã´èvŠÁ= SÂ<ê£*—`Ü¿F8@€ß0þ óA}ààG?(%tàèõ SH/Å@òÏØkÜ•6],ùÅ|:°E/ e0÷ëU•žÂbG",þï:ÿ>»–Ê'¹YÁ7ÂÙvnÖMè aÞn,gT ë—W_¬s¢ÿZìéHqÂëøßcGÑ×ÑÓB°SÉž$,ß÷¾»ÈVÏØÏj«›?å­q Qãáî®k·Àö­STâ2¬e¨ Eʱår¯²xÓiu%„U7Mý7Žm o‚'gý¿À×ìŽ8üåá{Íßïg+Ha'Œ‡]R‚KÑ‹P *øUy €Õ¨Í½Òf³±Ï ç¥^±HÒ&ò利¾KÐkÈ/)kɧ".Ûìuîvé°ªô}‡,ö/ôëö/¢Cºe9GoLé%¯úØ@¦ð©¹qõT 5)n{9vuس°tBv̪ðTÌt?k¿ŸuˆƒÈ9¨“ÈxÔÔ5_¸‹«í³2Ë£f €«_5<;¹²TNrÇe†×Ü=*÷3L™Ú×µj*U¥¦EˆB|ÅÚ2H]roµ¼iuǯÜÍ¢JrßBÍãîß{Kúo÷=èA÷üÖ;Ú×ÝÛ§¡w*Cem’˜Î>ñ˜ø‹äªôIç þ8»ô>MÐØ©~B>,_-åÏd³íéЖ¡öpšw{ý/ú²yˉ–g­ }uYÖܧü•4 Ûq-~&q­í(uRŒn…C =n8·4¶7€Å§:ûU~J]~‘ $=è_º‘¯HìäÕ‰2 ê]ĘðP"B4z¡“3CWGSÛ@Ëĵ‰âúž°q­î“Ï;ý¨ÀZá{™]ÝY|«|µ¦¨)Sûà Â0—MÙ;í°nreó'vIZ¹;¬ôZ¤ †¢£¾P4Ô6x¶–u¼kÉoÁ¶ëµ0š|Zª¿T;r8\Éc®–áØ°ºú¶]wÅ„&¸4I# ?tãÀÝààBˆvtr^`q€=®ÀÜ} D­™xF‡½†þòx:ÏÓ{¢÷UG3=¢$]Fž‘o°^K5LX“˜ïr€päÛ;ôOqýÝiÌvjä¢$dò‰„þ¸×&¶è¿ amê‘¸Ë €Ò0~6Á#XŠXEx­´Þã|Ó‡xt2ðæ#Æ6LKŒ±!¤“æÆžŒ%QÚ¨AqíT)E@y@Þ„¿¹.Áà CH\丿µÿø;ÀÃy©ãZš‰QšñIÈ,#IN7p4ùã›æpϫʵ¤3M‘þ6[Ö^©Ì¯xZñÐÎ\®ZX¥iopm4aý)\+kUÝÖ6ô{h 5Ü~æÐXÿ¯ý×ú‡úÎö%õÅiUŸ•Ï•9Šë]ï”Ó”囀ýèóBi­p+ד;‹íÄÖò¦ˆ£Ä+%—¥^ª#ŠÑ5z/cZë®f‡æEõu1€oýNf&§‚­Ï©fgw.¬5ãš51û;ÉšN}9Jõk파·Â$@_:2­‚Ý.åÜèpg—´Å~hƒ 9“£k»‰òÇ$®÷ Žüúäõ6ð0Maâ´—û©X½‚²7î*%Ѧ4زÒ¡Àµ¯e éûÙ×O ˜²3~cìôœ,"&D•Õ–®«ª2-™_•g¬ÏRüÆÇ_¥b2ßQ<)ˆÕ¨i䀰x¼õµEòxJG1eGÂÆ(R䯑w¨ÃSâ¨íÔ<êªxN,/|·g_¸Y Æ~Š[”§y4 S <]N:DÜKXJ̧\ ¢<‰ ÷SîÆrcgwá´8%î.æP=ˆºƒlB ü½½ŒÜ︮q‚Yxš;Ã'ž[eà«Õa*´:𚉒¨·.u+ýíMËÇf‹"î´seü¢êÒ­EGÊRªžVÃÊó˜Ôúý Ûi/9–’õ~í¥‚†×Óß?4ð¦¿|ðrÿí~“þ/½š+݉ÝÛÔd KÓ¡ÖWtõu%v½ßòW²2æ2F¸%Âå‚8‰Zº\µ¼+T¼–L ¢4_­ß]‡¨²©8ÝžÍFð. ¤qïï²Ép•>+@784*vd:u¶úeÙé‚5¹Æ©v‘wˆo(ãã;bøÄ¸¨ø%Þ6Ü2rgÏÓ:tO´ibGê«”ÖT"UIøDjžr%£)e ¥%.1ŽCÖY9‚ãxéÁóQÛ#÷žóOAŸŽ© I–ÄY¤ÊQŠ#ÅüœdDîŠÝH^OìÆ-ˆÜƒY‚F¡GÉÑûÐLÜï¯l¯mî×\/Ù[›xR&©Þ¶Ö ÐØÓjŠÁƒƒDfù÷Ö¸émN¯@¦åÓ©™œ)èÜ~Å&EþEk*í«_ä.lʤyw4ѽØz¢*•Lû—6 ˆ@Öð{öPz¯ ßôËûJzõìéÖ8õ\êïñÔ4ªŠ”ÛTxõveq×q1ŽÅ¢ wÀxÎba’0^¢V¬dð’ØqôÚÙm‹es.íO~> r }„-ÂãáíŒdwS~:WÀçÊî«MúOuNêÃêJ?2-h§…‰ÌGúÝiãã'%”ñq=ý>èFp+¬½!ÚzÈ2Ò®„ƒ?ýÍRÁ^þ`~_Ä?Ä\Xô¶CÊúÈ£³»øê¹ü£öøøl»TÌ)—W¾ŸQCa!1OðºiâÇR9eþ…Ö36æ‹bº\.Aد‹/tMÀ`B¦…Ï÷muZOlJ¨‰“Ç{¦¾O!cbyiª)s“ŸÄÌ%çRKHYäJ neT bâ*X¯ ËѸ ]ø‡1j¢ É–,Œ¡½É=äJSÏVÍ=Í\ÍJU‰J¢²Uéwˆt¸7éd„õPT$KäxE·ø 3´ý÷Ö”Ö‹mgÚœÚÆxŸ^œ"®‹Þ¹SÌfÞb¬TÕ5l¬nà7Ì6iú“Ý%/Ólï›.[¥ÃÑíœòB£§.•Ï–ôgiûÇÇÿü†¹: P8ˆ¼Zhvšf` {yaCVƒ‡~âùÞ Ö+ÚŽ> ‘)ef¦Q:6’¾„ ê¿0'AÈy™IR·óÌš¸ß2ðÉ.‘+pû’b ŠH¹yûI‰Žw„¦W„.‰xŠöÂûNõñòyåKèÄ÷ãW‘r®$ý%߈½5Å4…•Ä¢:SºÈ ÑÑ$¼Á,(4`EÐôaÔM4<ôfEÄVB q>i-)#v&y€€Ÿr_GŒŒ)š‚Ãöú¿B.D x‰|í—å;Nô˜ívÖÑÔ5ÑÝÔÍîÛ:œƒ×º˜:R!Vÿh”CZSýKÂuG쫤ÃÓnV@§/Í/Ë)¬/ߚǛ[“Î8*IÇñÝrét¥FÓСüܳ¡ofŸ¢Û°÷qúÈâ‘‚a†vmß²¾áÞM==l¼Ç³çúI·³¦M-T픕Šì„±ga¿š¤)Sw9uí€X››7•µ2Z÷4—]o¬å/þÆ1äÍè„Kž±˜uP7ŸWžî)Ù´\©T‚”¶·Yè€V”mMe}Ý$a9Yô}Öì)P:€º/D¤ßò3\m°ÒàT;1[ÁM¯Ÿ8ÿjÆìú™YshÚøø¾ÖÍû*¾¾gDïô‘¤çÇ.pÁ{îñ‡¾ÎÏTgj2þ žÄwv”Do˜q<÷—ØóÔß‚E«½"ƒîú…— SM÷9ÎDêb¸Qz¸bT&îϤRŠ=ñ¥<þE»˜b??N]KÆD°ÃC˜0ô'ôªÄœÇãÇc6ÄžŽ-޽LÜŠ É7&\ˆ–‡Gñû—é¡ ‰o"IÈÙ~=£ÝŠœ6›"¢lðVs ÓõÕFh¥á£ë.Fáú[þî!À›œ²±rskn9¶`sþ‹Ø-qsg¬ÍRä/)(0*žYê<¥%?¢ö;MºÈÙpªû•¦X]¢8"¿¦ˆP÷µ¼Ü¦÷fïØÀáÑy#úƒàþ }·{³{õøö,êy¯]¬½ÞÓ¤¶QΔ%+Ò”¿(†ºÚ€\M±@ÎÍÁ®-’#œ4ú>F»°}O;]°_p×,|Ç Ь¥ÔÎpÞƒéàCC/ƒÙÕ£uþÂ"Þ/Òi/«kõÜ@•?LL ¿Ь¤ÃE…Šºìâ¼ûºþ¯PÈMpDêì€n†¾†D²|ýÓXŸè'€¯›1ßÖÛ}ÍèØ)ß{&kó—“Ç_ÀDèz««F‡f„»€º)ìVÐ r×\†%ùM^VqZéÙ«§zÄœ ­À½ ‘„ëSý P;Ð ÇÌ>[£0ŸÃ×EˆIï±¢[âçÄјÄ·1;¨CDp46j,òaLT¤.)znXú8jqÀ–HÀK¿‹A£˜§‘YÄ:ŠI¬%i7³ Ù”¹<`WøöEØ]T&bòNàmô‰€+¨fŸlÀ|b?”=ભ×Fô¿î¯Ö¾Óž°txÒ·¥û‚ÜDùQIPWØÊåÒ ïæAù“N-{ {9£•)nJªÇ qÊ„ÛEž¿Mr@áܽSÅR‚òïÁÀê þËÄ•ò@йªÂwº£g ß@f{»D?ç §¬ }i0Ý  ¸Ö y y`ào\ } iBwÁÞÞà˜É6MêÖ€¬ŒÜ¯èš€óA:Ü ¶ǩκ}ìköu“u}¢÷•{ؾ1;eáêGIð¢“îF÷FŸ ò K-Y_žQN¼å¹&FÛ‘ô.*št/ÜÖÙÌã(³Ûã=5èQÄ0öeBL¼NÜ“„‰O†Hî„Êú¤øKÏaƒ£×^…¼Çqƒ|ÐÝ è;Hº3¤(¼‘Dá–Fœ Ê /Ä„ÏÙ}÷+ ¡Kü1ÈÑ@z WÊ/ÔëO·»6P‹&~éþ–€_°ÃÒTm:Ýò0Ë?M…]DeÛ”0ui|üdǯ…ô­L!Â@µaêîUKJºs«‹Ü Î_š1–5åTÎ󌞲E\´hPtDú¤ ÓÍé‘©d2‚´ˆ(ÜC|?ºl4u8`3¸rH2|`ÈpÈbhÝÀù¾ð~ÏÁóC·†Ï Õ øiBºÈ!Ê©JTW¬ô¨ÜOÔ"Ä ï³:LÖ[ö ÷Y+¾1ØÕ+ã _Šö:÷v…TéÕ=›ë1ùœ·]ŒSE«ùÆŠØVhËˉ_?>ž®ï_xŠQE@C+ ¢u² šÄes5ΆÙAY`]X ,F‡æ}£s*D¯µ^ f[³v5k)n.GÎfr½€³9 0Þ'ÊРoÜ€¿Õ4Ë‚úTŸéVvx j{ðïq‡RFS7¥ù&¾‰Ü¼9™Pú Ôo*&¦6p>U'±8Þ>ÚŒ8?¦=®—ôó&2·$›çO¸ç“gŸô‘”ƒ£á%Ú&pˆfŸƒÚÂEØÁÉ‘Â31G#Pm£(ÝÀö`d¸3ñÉ?‚ž´6¬"ú"I'êN,,:;¢<$ìoŽü8݆:ëÆuÖÚY¶Ç›û›Ÿ\‹Ž—Ã, îÁAØÃ%ÁÖ¹[ðéÄ ÿ ¢^­¼uuK>}˜S-¾-ñXÄ–ˆÊÖ<§ã3¬òORJõ²å$,ƽ+gЪ%š.¼2OÉèZÞuJ­z%?¥T(ëz C­3Ï~?sÏÈéÁÙƒ³‡äCsµEýÕœ!Õ°Þo3¨í™¥ˆ’=‘ÔÉ<¢CüÚl²]ÈôáU ~7Ñ’èLOÚjî áZñQyì`WI7Ñ/€!&«Ìv GEzb¯ ZÚ(b·DL´`|ü]5]ýŠ_XWqd¶ƒ^0ÞlvÕ d: ¼àíîP{ýÍÐï–X4ÀÏŸ2Î1­ÙhÚ‘öPÈ®˜ÌPæÉœ¶ÍO¾úÆuŒT=íØ(Šy¸¶ømùs³.Û2m­Ü[ìÄÎÙ‘Ži·@É«c·ZÈ=8 q~<,ïl–WÔÅ õ>%€ü$êmLVæÞø½Äu‘£¡Ÿ¢5Ñv¸‘Ä×Ô¤ø©±‰1I Ä4‚{4ŒJMÊ&á÷£-ƒ¦bWc¯aÄgá]AhÏQжÀþÀw¡Oñ-Q©/±Ãø}ÁÜ´ØCää¹Q¬pÆõ›Ùä…vEmðÙl¿ÎéˆÅnSˆ©Ê°ÀÜXÿˆ]œñIógÆ:ú÷ŒžÎHüó0 ½3>ž¬çµ¸ñb{,MÄ'uB$*Ñf¾¼ídÞÅ5©åwŠ—òR{s‹ žçª( Û·°ˆ'ñ$LòV¢–-ÓxôÔÌV•Î*ŒrQ·Ïàó9Ñ#­ÃG¬G†]†¥C›‡AÇ¡·CŠ¡ƒÙ}Aj‰üœ$´Ó\’Ì_ËŒo¶l¿Â³à4ñ¤üÙÌÍ|)ßü÷7~¿M€äèä+ܺ¼Dg$qqèR#ËL&û;CQÍ—†)ïòÁµ_Ûp¯@·[GšXЀù£‚@öCÆôƒŒýŒ¯è¯£!Ÿ!4( z\PùN°?Ô„·•dØônããcÎm¾×jÞ¾‹Æ`À™»è¢Ž¢&xÎ(ˆ9êÿªªL© °í.ã®Ñ¾n]¤§)Ǧ,b+!òrŽ‘Åågó3»âÑe¤DòpòÒ¸%)ãf%pKY1ôHSÊMêRêåøK䊤}‰ºñÞ}Êo1ó¢=)¶ØÃèAì`^ÌzŸ¼+2.P¸-¸0Ø-D²°‘ÕX—PNØ“ðúà¥Ñ¦D¢.#,ȼç}it%`¹Õc¡­È+Ûö‘i±Ñhigh5dº¾©¥Ú|‡u’­Q•Á `$´BÖNއ‰ÖN”©¹@–Ómµ”)¬áhª»¦ÿ•óG©¦uYMW*¡°`[åë”»ÓàÕ¬jÓ†HÚz3g¾ØM|Eà,º­pô,êõÑ045j7©—1rnT=b0©=sÓ¬%£ˆQÔÐþlíeí¹þ#ÚO}¿õ”vmfîâ#Ü쉣О7›™Iohwå¦ ^sÄìbÞ žx½ŒÞÕ,Û"í‘G–\¨7Ñbzg´ $$KÆ: OÑb‘ƒ0j•Ð6q¶ª_uRV²‰Vé΄Yò‹ÖˆaúÁjž0QŠ!I.Ôh7êÇ_ü›90ÛE™UlNôw ˜ûÚ¿Ì8–÷)ãx´i’3ýLÇíòœ‹ÝÏ€0C)ç2†Ò=Sý¨wãï§Y%m%.ŠOÍ2#¥tS¥êp­qã‚¶ä¶‚v1=QÄ<ÅMíÌÖd.x߯uó»Ó¤i²úÐÚ¡óC¯‡wÎ|7O»àÑ/º³ž mF¼d”6ëéÌÇÃ6ý£ê壮ÎY¢4ÞQî#® †« Ë˜wi(îm¼ól•’/;(™+ZÎZéýÄr®ÑËZuŒ{GIM–¦ð’0qä1[bÌb/S{c¶ÅU%J LÚ—d”|޼?êús8½]FÇe£œ0WÂcÂÌ‚ÌC÷EÌ=…± µŒFá÷¡›Â®ßÄÂb™1ó÷ðyQA‘·Q%~[ü620¡A‹ý$(´o©ý ÓÏ@;'ʨq‡«§'Îx;ä®Ùsc/`õQ‰úæ=hœõV3Úiº¤7Å{Z>qìxImõu§r;©,wª6gåÔü¼SÞ'»f–e”9TN«™_¹­:½¾¶ÜîÐi¡6¹Ó‡™L¶Pv¢7mð‰vµ&A=¯‡ÐW­¥õFuçjÒ{¡}þƒ¯G+g¿™«3:=8¼hðñ`ÞP`OÏ~eü£|§Ø‚‡`•p¯sgÒlYTÆ€ìÿ„ø…·¬s[×[ÜÔ‡Ú`ǵ4”ΖXKR8 .AvTºS’ÞµR)"f럃®6Xm¡ž²**AøY™ñ³ôk€Xn€7ô¼§Š¡gÝ ±Ê›ˆÓ#ÜþŽøz„'®ùè=Ô{_œÚ°­aEݪ¸y÷~ôÒ*[/÷}.»½¯Úfzl XŠýýžº4ývFCæó Qj5›w/ŽGݓԚr2ýqVô’¸S3²g†§Ì%J"É”!*<¾•jL]›@N´I%¥í‹½J4 ¸z½) ‹$ÚSÂs°+1Ðz˜4lzèÍà|Px3jOp;qÅ-V—x˜`¿‰sÔ‹ ,G[•GCzTú÷;<šÔ¾m2œmëƒÅœ÷ïvýÍê‹Ñ èQ𡪯´ðóÑÍ%…JCÕ¯oâ2%œ»´sÉsÂzãÊ õ2ŠÓ²3û¦ÚçzÍUúU<.ÁWUÔT´0MeÌ¿h h‡Û¼ZÚ1¢Oâiª½'ûŠ{6«u_èyÜwGsQé©0P%õ>íß2ôd„1Êu=8,HëßÞWÕÓ¯—‡ÈÔÒYÒåR;q0[Í|ÅÄó’DZ~ ÇI!õW”w¾"•;÷ Q©Œ“³ »›E5­ºè]Ö2†x†x-¯Ïˈєd8Å †„NƒC—~¡«ô]õ‘Ü$Ð-°‰˜íDȻə "0eÛT|o¿ŸÞu]K½-¾x`<¤…‡Ç/©êŠŽÍßIþ^ØÝЪ 'ùú¹a¼ÿôõºydŠ(!¼!ŸI†O‹Ë*Èè%í¦ú¤ð“…TeÜŠøUñHÊú#Šg|H.º¨=Ó%6 êB >!$õFÊQò0i8þxš*•™ô¤˜yàfEÞ Þ$ŸFf`±¡¡aVa^aO0 Ñ&á•þ¡Z|V¬=ù,! úCTHÔºpeø–Àyy˜éþQˆÍ~"¿!Äy»ç†¿›ß5ÛâB!¡ŽÈÛN¿[[Ú-v˜e¼G7mr^ý6L´,\ìI ¼]ÉnYø ‰¸sˆa#Er SêÉ…Ù{‹N–*hå+¯VQË›¹{y*N°Ž×ÉYÃ0ÝÞ³5ƃLÞ¯ïìÿí‡ñ¿é"½e0ý6ZiK—ðõ¿±ýzfe‚þêq‰(e¢Üúê/ÏFó2·k¨;t>οgº/²>õ´Š,ÇŒð´ëv©nñÚ«”ð4aüoÔ)Ç)„L£,P¢ Ù’F¬"QZ)Û)(\zÊôôÍ)ñI‰¼ ŸèÞ€èµAá˜ã¨ëè°ÀäeXŸÁ0NÈ™PEÐ6ÜÌ„¾ß¬<æ!ñ|ôlÜ\)0rG~ˆX¼åŠnEz¹!Û—üû~ñ}çrVXo„¿ ­D_šëþÜá¢Cm>ÀÕ/ÕL´#v蕯%LrK øR¼·1æÀ¥´cKÂzBWç­-€dÊ¢ŸÃs; qeõUùµ¼²ãuA‚‡‚ãb‰¥l¶ì^çaý}ýXÃ1Æ´ ;§OØoÚ×ÕíxL%)Äò%2Y¤ìa—s÷Þ÷Ô~ÏžãŽö‹v¨7¯ÛM}Eê ~(¾'hì²'ÂÙ†#˜ë,4âß” çÆewªoЦt¬ÔtÓ_5ËU[Õ'ùãŽG;³ÕXÕ:Õ*Åbʼn«|ö{K€õ6økï9ä!Ì&Ò‚¥A¨Ðƒ„oèÕC­'e,ïymõ¿$¹ïïHö\ D¡{:¢{â›Ä3q§ØÇÔîvý%„¶™ H$Æ!Ãç`Õ”MSƒSÉ©“ÅÒR¶eÆgSÆEdãxRVƲÔÐø—ñŠddÂ5"=ò>ù2É=3åNʇÄ]ñù3"ÛYa;"§‡å† |ÑÁžXóðË¡BÕA5àLÄ:|°-á*!¯ÅÝŒŒ‰|¹!|%zÊe‹$º…ûzú5„bä ¾™fo7íðè¶svø`vÛ&Õ®b²å–À8ßç1 ºÿ›L DŠ„Ü7u"Ô5ã° UKfú«\-QO¿\´0ûtâ(¥-µsz~ÙæZIËv'α¥4VÖ*ÿ£ ÔµPZÓy”¯Ç¨o¼¤VÏàq4)ýçúvõ¨—)›È.¼üš4X:,‹ò´mS™wöÅôîÖŒ)óÝŠ"ÙAÀ‡,'(å s¨¬D&“¹.ã– a|VŸ˜ÃÛA_í¥¸Ä$’NÎÞÙ´QÓ¢>.»Î¨Î¦jn©à²\e¦øŒÀLy®;Êå¶. r§9°mM ?\ÀÐÎL¶ÏF‡4Bõôk ÇÇ·MR¹˜±—?â ÀÚú¿K è‹Þ5èï?¡þÅ<ÊËù$¹ˈ’“H—B.„µnd<#>KÁfHw¢nŒožò43&5#ùy¬Œb“y8}Aúé´š¤eÉ%IÔ Â³„÷TÃÔcéøT5àÝ–@„E­ +ÀþŠâE¶£‡ÑçPD ã€{z?$3z"h³ß|ï•þkq ÷£gâF¯q °äÀ%þÔ-?¤Äk‹Ç%oNÀ!´uÕ)ÐJøÖÅ1ªrL)¦÷L¤Æ¶Ps€ß5ëLù1Î'rHõ€Eï/\ßò¢iWC{¨p_8Š( ÌïŒ/kH-Êæ¥T‹˜íâÒp%]épê´î>õ¹®ðΧ\ Ôt°v_•Ößµ[ Ö,ééèÑ{Y¡ª¥Šô®9¸k°ë²Ôˆ¼IvI¾UFèJ•gIÿ’4tj;}ÄÇEá""—ßþk;†½—Åv1¶·ð¥=ÕQÆúúÌëßfÁª ±uÍô“SÏ´éŠì5ÑRU)²‹ê'šJ˜"“Ó—hβSDJ›€= ªoXö æÃ: 8ØsýÙßh'xhÝþÔz`vIHl?ÓÁ÷Ü-×TºøgW?äLôH)"€°„T LÁ-¤MI«’We®I QWÇ•¥ÝJ£$~&#ÉõqK“ž&µ'=×INNs‰¿eŸò9e~:?u_lIÌݨ6\DRAÝ{œp+P/ðj+ZÔ… ‡Ì JÂÑY€·Ó-Oc,¿%:÷kØÐåØë˜FÿG€=ÍÀ÷ˆ+Æi‰Ó˜]\Ž 8æ›:À’ŒVÔû Á;­ryî$·tý` F»"Êê‡Mâk;\ÿpÃÄg§·e²°ì(¦2aîxaêŒK凸Óå¦Ì8TØÜ6]¸RåÛSßCP™*ÜUúšÂ>÷žpŃΗ¬ÑÖ±šÛõv¬ý̉5÷b S–e7¸ç‹Ô]§â)‰Êùê=;»»Õºj‰R£¨*T!òa±§h‹@-n’;åÂÁ/í–Ëhft‰˜ÅM·gsÄ, ±~ŸA˜‘ÆífÐZ{/7#Ô:›j»Ú¾ñ¾ÑžÝÚ©ªŠ<õŸ­òOåù×vì’ï(ûw€Ì6øš_e¶ ж)À¥仼Ìåzÿ´7~}Û? ³»^c«ütBnFo%»/+_$%0ñx É@†uœyle¢`g¦H·ÈèxaJdJ~zuâ‡Ä¡”Kä_ðáéqo•©­©ÛâºãQŸð}I„ÄcøÔØ-1D´Ù@ N¦ãþ abÔ˜]AΈ«Þp?4·7úQÔ_áï±Â¡a~›.#=‚W›D[ŒYôšž·ÛgñJ P6ütØl·ŽU¨¹Öæ©Ï_6J€Âg›ÛNzgN´i&@á™ 'ï “úLß¶ùô?Ùû²öaÁ¹ª¢3YÖSÃÊ?Š”¼]´¹-Ÿ™^Â9J÷^çþþ¾ß{ú{í_Ó¯ÐîÔð»ìDQŒŽvÍõÆ¥-K'8‡;ÔaZãÐþG=K4âîmÝÃQ÷ÍyU‡‚¦JQKÕY]$ù‹NçÎ0ñÉ®LÕ!•¯š.†3·´ ¼y-!´1úœôµÐ$»êœU¯6]A&-¨k`ÙjÂU!½qÚ»ýo»v/TáÔfòU]ú !@Äo¶}ËE¿¿±š ú €µn440põ/CˆX"/ÑD*èfÈè7)Ú'J"(ô‘~°®þgéÒmqÛë:;zuÜq²~GìÙ$‹d9.‚øò áÅ’¬»9”¬LÒ&cšãÎÆ¤“3<Ò´ ­Y ,Ç$«’ï§lN:¿>¦™AI¢2»©û¨4òÂ&:-ÐU"=¾*Ô#ø= ɫўoܹÞËqø¨wÑe‘%‘aÛ<übI~jûÏVKùt›­•]ˆÅ'Ã!HŒjX34B›ÔòŒX¦¿/´ÍCÌ2ëZéorøyru°¡/À?F^ï½Ô(¥]ªºþKBVöÖS$^MÛ$dñ~ òÅÙgñÅÿáî= ¢JÖ}ñ&tšœDrÎ9ç(JÉQ$£‚ (ºiºÎÝ;u¢³Ž3ccÎYÇ1çì8£#欼93sνÿó¿ï¾·Ö»µV÷Þ»önØõýªê«úâ¡5…š¢×¡³Ðvɰè çDŸ¨»g!­ùVó‡ÎýŒYÌî>ßO/^’ä'¸ÊÚ‰î!?ªóEgxB&øE”,öwõÇ2ó{ƒLã{Æ}ÎQf~ëªV']¶kÁt— $ÊŠ?¥T4%1+§ˆ¿;Æúëô­¦²ã$› |OÁ~”p…°PøQ¼MòW¤ÎâöOüS"Ÿ¸ØEÕ£Œ<›÷æÔs]ÿúäïW* š;#¤nÌþsÙmlêõ6ð£žßŠ˜â˜„Ài±gø„$FGKbÊãgÆ DÇÎÚ›4øD0,xÇÞØ»Žw£\¿Ážµ˜? šÏ×å½ãáÞìwæ)¸º¬KjÏ%߸ãY€§«%jÜÈ[©FÔ-1ù0%‡¸|Šp^p/¹âËŠîŸqýW5÷¿®vš¬÷Ð ÚîýÈIdjÜð¹a»¢s#¼Ï„.÷Š‘ÆÌŠž“õ4‚U1urÌÇðyáXúÖ ‡©%A‡ãG²Òäii禙L¹³=®{ʵ؃¡sý_Ÿˆ÷‰zê‡ssõ¾ê™ãµ×ç“WŠ·…×3os?Ÿ&Ç@;+çÚ·°µ!MAK}.ú yÒûæFù«éO˾@ÒGc=þš—Ú×ÝÜ_él ÿTïL¨6»6¹Ê-É¿ÁóRð´°¦â÷©o¦Å>ŒËˆ)‰;]ÿ&޽;"7òÛ¨‚èŽÐ˜¸3 ±Q›¢’ãh±ÂäÇ ÂD‹Äö¤çqïã.ÆqÂÒÃêBÉQÂØ 1XŒ[ˆ¡{Žû]¯ó^µÞ}¾ ß>ß3~7}æ9-±up&9‡^ ¾¤çóÜ­ÛUâ¼Åu™ Í´[ƒA„N0q%éèW5þþËÔ )')õ${ÐÏKµâlßéüøuýú×Ö9X™[¯ÛXjÙØ—½5RÓ??Ð.ðSà¥ä)ße_Í/Îí®­ihµf´0c–q|E« 8Xá":ˆ’ެD”ðyÉ3Ñ/bä°ª]ï‡*à­Ðn‰›ÄAB—軩2h@¢‡¢Í²æ¡Õ1éaD[ÒÁ÷æ”  \XÊ úÁµ~ß¾[ÌàQÓhá®_#Hâ[â’ue1„ãkp xܹì½wxŸÅ‘"óÁY\h’pï%{Ó@êµùm­o›®¶ŠØ@ʘ=6÷(wˆF@Û66ÐÖá 8YI‰ýBù¤µÓNf±ý+Mþ~% ”XN3¹ïtůÜk©ÏéÀ5Açü·‡cI‡ƒ—Ç£i±¦±Í‘»£±¸ï£ž‚ÜåŸÃë‚?úÙ„tÇÞN8Î +˜*›f”Ÿ”–˜4¿,Ù&Z¼ÚåNÄ­ˆHµ½øC¡&î|¯gmî‡Üx¾ô™ã§ô±ñ ðÚéè òr}r5¸î7Û'ÚqËw™ì2j×f³Þ:Ý·ñW¼#þ@ö¨1'®¦“/jù[3MÉäq:Œ™ü©K¦›'xDd×3KŒ"~œr*Ëfúóé}ù5…eY7óLŠ“Km íõ^iýnL³¾îþxï$ºÈGdâ€4Á*x%² i’ΓoQÝ‘ÞZ:=„þ‚¶¡yèdd¤‡øbEª+£c§Ñ‘h$.€‹  WÆ×.Üáü:@xЙÕó¡YT7ÖøÞ¹C¿DZ UWq$=ÌŸé7X4Ö#æ§çñ}Ò{¹ÀÖ>U\Ëmf-`0ë/R•“fé-¦5VLÙ1!oüLX Ž&Z ­ÅÄ‚Ú,0¾}Í6}Ý­]! ÿ°ý;ʽn%X.ÑZ6i½Ç%ÿF¿õAëüÒÝ;ƒ/{U†ªü:¢´§g$ GøFТ;£ŽGeFi†RB‹Ãl]¢ÚbÃa'’V'lIþ6ñuÂH1IãQZîì°#Z+èpÌÞ zØõˆçy×xW¥Sºû ÏA‰ÕžUîKíÚÄÛÛMrqu¼àfï¦ãfí»á÷‚1Á+þ!žxÀ…S ݇vÛ ›Šd«ØXÆ| ,#çKôÅ«ÄY&2ý€´! ÈD ¢Iv#›á$d•'ÿˆ¼ƒ‚¡§c ʆ_Џ¯„™¢_xÞTî|aÑ`dÏþFû9·n÷½¶ÌîM pÝk™Þ¼gÐyÉ·P[O3t[Xȱî®í#ð ØB›AEߪn§£&÷¢å€Âš0‰aoÔ¬÷ -v†¸Ÿõu^è^л·.ó«‡âñîß)ð×ã—¹ðuG[õ@ÛbècìéZäþÖ³%À´”šóÃt“™³r3€ÕzOlMÜý ÝSvMwMðŠ™û*œ0#ð‡ÐÚ§Á§‚fD'Ä{ÄÇE_IèIº7¥/y$ª'¼&pȆî|Üì˜õ.Ãçn —e.\/ºâ¦tÝ‘$A“a}É/"u8BFRΔrÐ $ j‚ß!x´)•H¡Oâ[sˆÄÏANK,Y¤Ž=¢Ïw âaXAe,Ð`ë€ _DQ³dĸèXËw¼’ÎJæ~kºý¬¼Yk=§ù˜>›üqò(Èpd˜¥·Fÿ¡vaæØþùl+èý^:++§ƒ}À$ÈmıÀ‚ïEò–ž . ¤lžuæôÌc•^E1ŸKƒk’tÂcuN%ÂÓhá‡ÃW{ÛûEE…FÂQ¿Å†Ÿˆ{×§ë¶ëÛê~ÉF¥\Õ^77µD§|´x^ôÖÀ×mYÙ;…3îMÐàw„¿¿!ýdüáOpŠéeç7NL›&‡Í®T‡póÝA›î°5išqÙñ)ùq©–Ϋ#Z£VÄ(£¯Ä*ã=RÎÄZ… ¶€¨}¬Ð«áïð¤†ä5I¤„kž­.éA™Vƒ6U“ã'G‹-œ7ØgØ;ÔØÚÙ®³Ýï°Â%Ø>Àöš­ý;ÔÄŽen6O¤ç4e/|kµôiÎúDíf­wÄV¢»Ë³?0Ÿ¯•EžO¼AѤèQà Ÿ‡û^üoÄDg€»³ÆèŸÚT@y>;¾¥±ûRŸ¼ß°?¥?¨—»ðb}Ñô]i“sCr6ÖðCº†º{X÷ˆ§@–hŠD"A%cP6r•bY¨ ¢ìœ·C)Rý!Éð¯ªUŽB)3–}:ÔH;|ÒC¨˜.°Ÿ™¾ôÞˆ±"JÎ@Ÿ#uH;‚Á Sh¤QX $véÂ{’-’×ýÆÜT¬‹›,•4Bœ^%ŸÅ9%Ðç‹zX¥o@fÕƒa9íÆü3ƒ 'ûEÞèmÎHæ¢P;퇺«hvZçõëŽeã1Ò­u_å+4…óÜf™µy>ðÕ-îi÷jæDßý'ܵ-‡Á/ÇËL»¹ú½/J~qÉ·¨™|ÀÜG§Qs³:¤Ùo{#®sZlÙþ’Ç.ŽöWÃßÅ| õˆªŒ|º'&,F-âB€m¨zXW¸QÒû°‚ð¢ÄWShi©Ñ˜]íGG3œþˆAžÀ¼Û"ÇqÀa1ðGq±½j»ÌÖÒ1˜åÓl{m¯Øì³Ùlg?Ùt’¾¥ÎGíÒ=·5^J]Žy¢A!EW«ÔôCð5£“Ô^€ú*€ç‚;©„z…ú˜V‡¯Ð{g6¬c ¤ð+_ОKý᫼ØÔ3Ê-ëï´zô”wÏiÌZõ:ß sñŒàÜ·3JRý¦_©áåºmèyýgYc>—‹-0rÄo! :Šº¡a3$݆º`6Ø©T™?:ì:”®ü,_%». ÄB‘cÐ|ñk!Ìÿ¿ŒÔÕP d­CMÐfÔ E¤OH?ê*Ñt¨]ðzpÏ•ýQp.…3}Ù,QÿIM´œ¿Ëb²ÉH‡üãB«u^çÖòæs® ždüÜÕPòÐ 31"(+h!´mä =;˜l¦µ’òµ½9u’ºÄÆ×¥?Õ¯™46–Z¼¦}ÝŸ´«TÍ'À#ýZ¤ ÜHä«éW|0Ý«;P¹'êšu±Þþø™ºiØWŒ |9«~[º³,³LÓv®Î€ÓÚП£¢çÄN 9|1n]Œç”÷ѱ±ý¡´ˆiIõ3ر—\ÞŽûš´[ŽYäÙE˜}çOûR[u[;ûåö\û>ça—Éît§0‡Mv‡ì4ì×X.Ñ#éX‚¹ùŒÖr£cf9¶'¢Q¬¾§nù¤"ýÕÔÁáQbyµ–!)^;’|¢÷ ß©ÿÊ ‰R8¡gyE0$èkVGþéY¦Ï³“3o§ïœgWï9osÍ뼲̺ÜÝÅže‚™ûg^m ·ìbþÊŸ+R› ‹ùUüPA¤/¾&¶€šƒ½¤:yÁkÑ÷2 E¢â¬jï¢õKV-y¿ôÃ’U½\€ÄIò„wøÜfž…pÒ‚¼…Ÿ îR7ŒˆEŽ¡‰o Ô =Š#@G³‡óš®1ȃR¸jôz&Ä”2‚zµùj˜›àR¿r`Ô-†\4{>£"‚ „·µßa ¢ïZïãž½ŽÖͦ ^ É”¼éëê-Xó¸FÚRó2ðËØ«3²U›Tc;ñçö:7aeáóÖ£µûæáœªûÔäW¿«ßxıBC7g{ÞÚeÚsŸ»GOã[pÍõå{kßTäæÝIÃJ/f;çns-Ž( 'EUGZƆ~ŠãLYKˆ%F£šbGáB_ú숟~Ïí¶^ŽñF=žÉà¼É u[ªÓ °ZÛ`»È.Ä^Ë!ÈIævÑOÓõ˜}¾Ý¨Uø¤T£GÆÒ^m½-f>–ý6Lç-vJtw”Z†`¾/{@[Ö¶%bÄýã}€pš|‹ôAïU]§–2æëš,| ©Sû#Ñ…–ÆþØØâÀßJl h‡¢^{ŸSäÕfÿšs²àN‘qíÝf¸juý§Vç¾kŒý£@K²‡×$Z&Q¯tüH²BB«3DxQðP°Ke§•-ÛT³TW—ý´öؽïŸ.O[¼XfôJHvH¦Ij…õ—=°z»Y`«Ñùè ”ŠÖ£¨ [ŒebÐBQ ó8×¼{.ËD<4`Ýó´~5prú® >ä~¯%+s`'‡;Ìêd's¯ fŠ6BlHí„IR–l,OV'“ÉÃåí2MÅ'y°<^ŽWÐå% ºÂXf/æm˜ÂyË ¥ˆ×Ã(öD:UKÓQ|Ê–7Átá»pÞqS9Wû<»7Ôb¬H*>Ðâ:û@ïRÇQ{Ákz0úŸNps¢zq8®P;¶Ü³«`󴥉'¢VFåG6†©D$¾óaVp#—øT:{ºãðÞàóÄî(í£ýZ§0g¶×kÿ”@µ§—Âç„|Š™ŸÐê—oû“')¤Ñ-dÊé©{AR¤ié…+¦{ÆåZadCʽ¹zÕ:NÔÂ!R—v–U–£Â1ÃÑÍþgû#® ލ#Ëi…ÓwŽẅºÏ¿34µ0˜¥t¸tÙ%i/5N3¶ŸD2©Ö{®ßfp”vBë-Ã0Ý’a"Ò+ˆ‰Ë£’týJu1Q‡òˆ2ŸØO¾IZ¢ýb‚õ±±Købj:-Ÿ£†Ãùãp¸lí…³“ÙiXÆëé§3krG¦GŒF¤%¯e¨õèG9Ê>GÖ>ÖbVyÏà»Á¶¹ßqN ³¡ ‘ [Öì4¬]܆ï"ù˜RúIzV>"?(Û"(¿#{/ý€%£°\¢.nÕñQNçéà%Á/œF±Y˜;ª…<ºÄÏxcÌWíÖ]=§×¾‰VÁLbžêÞÏØíBrài.œÏ·äÁ‚A™X!\ʾ<8™Õz¾óû¶V|6j ®'Ôq6Ø¡½JãSÂW ef›³V³”ì·¬ŒÎŒ.÷QÜ/˜ßÔ|‰ãØ]°Yffd»"ŽÔY©y,24ˆ‹&?˾ÐÜx#È'âa`spS(3p›Edexp¸ øPЯH7²‡$ésÎé¶üÄ„.°æÐ¹>'ÂbcΤ[—犂rür5ãˆ)T–¶ŸÞ°%Nÿ$DrÔj4··»æpÁÁÎÎÑúµ-´-ql±»fµÞt·þ{ûZµf9Ú?”}X‡ „i¸@‡MÔ†õJŒ´ôžèšRéÜÓ²:Vo ˆI :gµ†H+ˆ „ÇTÞŸÚC–Ü^;(¹”lªÅWì8ê8h¨±à=†k±Œ³Ü—3–P7Ý6c #"kc±AÑߥ¡Û;ìÍèÉë×å~äÌà-ã¾ìæå Š„KE¢C‚íÂRñè1öùao±¹Ø~,;´,†¨Û"=#*‚‡†‡_I9ØO˜9æ dòÛ$<ø„p£0KXÅ7ã¬á†?C“A”š0T¯åÁºp‹È”mÊÌéž=°š¿S\ÑÇaŸn¸Xg-,Þ‹‘ƒ'D+°,E0ÆÌì¥F YⷼσïØÞ¥ì®Ðüù™× õShi©”{¸È<óÒ±±Ù.¬Z¦ëQÿv¶ˆñŒîVueó]8}!qfé%Ò_§(}`ý0/Ú:º9&-rKð“ʤ)Ñ7¼z";üó|Í"áäˆ'Qüزí˜j 1]þ*xiЇ„›þ„ÔY©s2›¾CÇË·D2§~Ÿ€™dZSÄ£¥“¯è<1ï3AxÄîG1ø¬ð!÷W~š8 N‡^¡±~D)ÞÆóä¿Ï1¦ÔYaâQ½ ­{“ØZ¨ó(¨Iübî•ÞŒ¢Áƒ°ü_úîòX¬ræKN §Ž×ÌýIôI4\ù*ñ[óŸt»ô"t2§Cp½"‡)bƼ^¾iÌ`†f®¢¿ìù¡; ø£ÿŒÓ튣m°øD;Tu<†ó4¦+îVìòè}‘;Õrˆ‰w¢Ž~2/èFÀÜð›;£|B¹aO¢c,@´—¢è+QïJ4JÞÇi¦"îüD|dp.bsRYœ¯Ãœó D¼ØLò¦Œ’÷h×êlÑõ5è4)1½=‰iú΢Ý섾‚©ûØà¼-@÷¥¶‘Î>ý<Ó Kcc§}]_6lvÉôy1iŒMRjŸ4;§·ƒREBˆYÚ¡ÔÒ‚IoM-Ö‰¡åÒê´#B9E1YÙ=È]ÄtŠ?åg­W†ccÐ˽ˆV„ûø÷š;]#ç-k,-¨Iøœ³j;goÅ–æê⾓ڴùŸº,»ç2“ó`.SÆ:݇ôqs…á¢4‘'´ ù ½*u”F!õðmØ™L…!»0:ŠÅaO±lfÂÉÐ T.~bÎŒ‰‰÷H*Ä/j¶1ñ®Ë%ƒN{¢Õø?ƒß@J#M!ïÖáê=0Ø` g|Óˆ;ÉÑü…ÑY£bÝŸµWìŸØì ï§™ê,Ô¹cüÀz‰ ˆ8K+µ8c줗L9Où…ÚNØŽ_ âb†PŽ‘gH¨Êdà…x”h@ÀQ¾#9]Hk5çkñãßûˆÑäõ$-Ò$k MQIÈ£à']ø¸püœW3—Î\[p>51‡”mX¡Z¨ÖSÜQq®Ù±«žnÎÄ1SÙqÀû4GÄß/0 öò5„¤ÂZäÝ •l¿ÌD–)ý = Ç%ï$Ý@ŸúiFÞ ‡%èuô¬€B‰’Ûâ£B_!*d‰6‹.‰>ð§ Ö Ê%ÏàyÐø:üC@ °ä°äås¡œûyÇz¶3f´: Êäw¤cc2­Ã «¸Æ"Nïà-ùˆá×m*cWòïñ|gn÷ ˆŽ bvU-Ó«¤…M¬Nq8M!þAÉDzÍY½¸¾ÀÞþÖeÆ(½Œ>6¶Dá~2äeH_ØéÈï£&E…,ôðô¿4cÓƒ-|ž% ;[>µ-$<ôXX÷‚¤Ž¨7>÷g±· šrù•XeÐܱ1Ÿ„õŽÊÈÔ¨Gþ¹nŠÀ΀:ë/9™fZHZ~¡#Ô£´ ]D›M&Ò^è:錘&è¿§n6x fu]5ê¨á'‚ÑcÚ ó=“Êj ž‘wj5ÎÜGéG ikU<©K7‹Hñ ð ÔÉ~¤ñh‡Ú´Eäj…¬N\J¼úøÀÄL¾TÓž˜A¦|GYMø sУ <ýJý D%lxVº§Ì7oÑô 3p¿”;/4iIËLÿ4gr{5C£+±ëaOhoýkµ Y Ð¤š²(éZù¯C&ÃÖÕÊe™µÔ+B/#—á¹0.Æfc]`;G¶IšÙbùè)Uî84 2[Š¢fqºèÁa.ã.p„DÈB$MҩÎȨVr@´™O­„7¡Hó^k ©¿P^Rîj-¦m×q×=mèeH1è1ªÔ?¯•@¹KŠ¥uØŸœiéâl­c1ßhØpįg¤c¦»Ž8D•á“4·âÛÉYZþd#Т#¤º¯RówøñOâ(apIüGòSÂ+ÍmxWÐÃÿ\zˆg‰yøf™tWS¥Ù V‹›ܘslRãS²%»ªÈ (?‹XåÐx­vCéÞÙÄŽõ‘tg&Žõë`ûà…¾äÁïœx6¢_%#=dí’—Ë­d0é2©§t]ëÁhˆT,[®à«>/º1²}ÉžáÅLé1ôª‡ü¿?BŸÅ©âM"7‘™8Aø׌ó7jAüÐb HÅ!Ý|o¾p–àÊvCö"3ä*v‹9;=ÔÊʨ„|†ˆ%Ít£ßãóñ;ºõ”Å5÷ko rR%—™ƒoØ:L5v^Ò^ãWºå„^@£Cšaš ç3v÷Üè^Ó}«çr•nÝ–Øz…±€K¡§÷OhÕ#u?›L›2À ¿èÚ|ñŸô3I…>&¤p_èÈÔ0+MI:œhQš”°pll~5þ´ÕÁÈ‘©_1þ3½?ÿL}O £$RWÒÜ´7è"z7ô{´ÓAvÒ7¶ÕýÖ¸Å²Îæ‰ñ£«z•ú*ÊlÊ0å'íÅ^?hOž@8Ìã0AdžhM Ì!Ï!ëMÌ`®¹kâ7À'ôŇøešWñs&îüþ_¿iÜ$eÔTÃ#䩪sQ>S fÌŠ(ê/þ¡xÆÌÍé—2yÇVxVx5á:nötÐç2Žöfõ•2ñÌ_˜F`^´æ¾a•ŠQ¹®|³¼Ba¦d+ÊË䥲(Ù ùE•êÅÐÜ‘è!7IÈÎKO¡gK Ky Å@O¡P`¹WR#nw‰ÂNîÞ3Q=Ôx wÐ( ‹õ–¾ƒûû½xEGÐà™þùÜ0t­´eæZíÒ>xÔüeÆÜ6ø$r{,{ SæÞÑG=xoØe-·ë:¾5u3 £­Ö|¬Y¥±MS¡¹’¼«K§[Ôòb¡ýroi¯ ý]½÷ ý=„~³'­'ÇPôŒæUÃBø¯ÔûýÊXãŒæxèwé7âÁÎ_sɸx8þGå…Hô§šjÛSOê´ÑŒõ´—joÕ¡“s5ŸhŒéXyÎt½Dc/£Hý=ÔãZß —þ¦Ci î HÒØ ž›vj6Xm$d’Ú(gÀJìKáNŒé0ðƳ5îâ—.©—þÓÛv÷'€þ¿B}½æB ‘…ŽN-Š/)¬­HŸW,®šž™—²®”Vwµêx¹ÁœßÎeÔ36Ñ•ôǬͬÁ~'MpY-mR9+÷)O+ÚåäžrgÅry¡ÜU±]^!¿,{( Q.UÙ.™»äÒˆ»*|誼RzÞƒüסó€º3ôQ¸BKnIöI¼%Dxw¸¾‚]ðZÉà™4">dêsÑ&‰ u†£8i}‚öu¬J¶«l«°N6ÞÒׄÌ:–T‚Ì¥Çá ¥—°ëµþÂqüeà8ߤ ;qê2ª2S@LPÎhºPmë×·¦2¼uôJæÖÞ=Ýá\ºcuyëá–wíÔzRÁ(Ç[\²YúOTÿ.êqà‡è¼é߆^öQi8äÿùîø9í+_ù½ž¡½—j¯³’&£­ }§Ó<1¿xruLôµ€¼­ŽèIù@{n|ÒÖ^˃|Œ¸‹r•r„bC)¥® X~Žo™È);6ö†0Yå÷ràÿó]ÇŸg¯Ï®¬<Ø ­5)=Ú n^J‡X‡èhw_ßzvõàJÎK~4¥Ðž¢,RNòSf(+•‰C¿=²š©”aŸ1+Ù†á׋æç ±åW¥Ûd ²T ©`žÈUx.~!dˆã¡’OÈSÌ{ƒ¤‹ó³…Âõ"]x¾è¸ø4¯øQ˜‰ŽüÈeÈK®é@ {)¼QªO8C|£õFKàiäªÈ½’t2õ;üò¥ÚR.,ä`>d˜æ±l”>ÇÏÊ0R×ø«EXñ·îËŒ]ôŽ' ¸×»W­«°3‚‘Öy}ajWYo#]½»½úw:þûÇž3£‰ã»¢§\ײ'?¢j¥j›è¸{I¿3"˜èÔÓ¦¦k9“«©™ZÛÉc¤$69›ò™Jñ¤\"qI!f©Äd²à+Ö³ð‹ÿıgjªýéê_¿G#é¦õõ©|‚SàpçÓ ’,òïW¾]–ëš“^!ÛÜìÝç‘«êËœë 36ÂNf?åžãÛñC8uÜ{âòåY–L$ß.{'Ç+û‡ŒUïUU)*LùQÁ"§,ÖZrÑ3å1ù̱A<á,I˜è‚aú°) ¤õ×ÄÑR¤{,­–t£hBG à1äð—¹Í3X ^÷Áo8z}w…öÂü9ØYù,mE‹V´-ÐŒÒØ†I¦~.’IøhÒnS~ÎMŒÔ¿–µ‡É£ðO³ñÓÆÂ‡»‡~åo|üB:Ö3Ö!ëÌdØ3ç1÷õ˜·&v­né¯:Ôº°½ºÛy¡vò¿¦×O-—2—Ä$-#®šÀm.-&ÔÒ¦“©Z+¿¾áØØb$9\­&§P–׳ÉZÀŽ-’¸•p@!w|Eš˜¹þñVŸÕ9«ùǽßψDSB.i=µý« ÖGœ|1+"Å¢Š_¸%gR.!E”5µ¿`IÝÒúà:I½/]šÄ^¾ÉVôläq|Z*×Ph)æ+Ü”nC¬!úãê¸jŸj­ªq8KEV"JC9IöRJ“5IeRv®d €.æ4xÃxIˆ¢'PTÆal,y‚Ì“vH§#Sѧ˜ vZò„s‘>‰]ËYÚ¹¹®”%æE!.Ø ¬" LÌ‹cëŒM5L·»[{ ÚÕÞfó¸KÖ 6 ŽÍ) {Ï»=«úë(ü¥;šù3à įeösYË »^'º¢“Á*óuŒgs%þN£ÿSGý‰Q6ð½pÒ2F ^÷€w,#|õm$ p$ƒ'¯"ˆ—HÆ v?—äHyø`»pBGøŸ½ó-u¢zf쟞ÛB5Ьˆ§~šñ&͵À²ŒW(_Øß¶²Î¡yMÃöú­»ú³Ö€<g÷sæ wƒùXO#›­|­lWžWÞRš2tiØ8}Øvxå"E5?®^<ô^±DN‘­‘*¤eRÌ ŠÖóöK&CïD»ø¨àDY^fbiÀâ1r‰Ãú¤‘ØXŒâ¥/1žDÈlj@›ÝZÛLú/Á'@ìð¹°¾Ô7{£Dq4qÖ<˜^Æû)÷pò¹ síG8­ýeýç;x¾ÜÂ~OÆO\7hGSÂ¥ÐwôôM¥séGûÎ÷eöëQïž5N+µ×®­÷ÿ‰+ÿgtüÿwïçÿ`þu3•Rßj]&Ÿ&—lÀ›æÖ„øøZ ˆšd1’°ƒDøÿwÞãî7McRáÞÚîÆ¦Aʰ-ù3Ó~HÝXÔ•MžvhabKoóæŽWóÎc·­¡÷š²žõáúCù£>¼QC?AËPšÂIyBi¤8§ W-qX²oñƒE¿©‡#†eÃÃ&‹DÃ)ÊÙ`픇6àÜØÓ»ÝÍPo1tø·mQÙòàúÔ›=·;—æ©ÿIšñïÐòßfi>Òy›žÊ(m}ß6Ò‘ÜéO¯éMî£òn ë$Æ0þÙâ6«Á“ÀNë{øº\Ú, ½S<Š*S,‘.ÂÚdöòF™¥¼@v]ÈIq¸ø¡0D¸Y„~æî.ÆJ¥Þ/Ñ>6Òœ{ÒZ™¿´±H̱¥èYñ;8Vr6°¨¬Qîe˪û‰­ ³G›ôîŸßÀÎ5?³ÜŒ?C¬ ÍB$@6 ,¡H?SïÔeñÝxéƒ6ìü1Þ1Á²A˜W×Å2ë%c¸l÷Ñ‚™t&ýí[^vŒ¢¸»Í9Ьê`o~´؃©ÿ‰óýçÔü¯ßÝýÙ„¢¿`¼›phb?ñ›ÿúøÇ/q8o€ù?®ÇÏ,÷ùîIXš›P”Ò9õ‡CyjÍXûÁžcíPÏuÆ ¦€¥3è(€…pš+]‚ÝÃl¥LÄ HÆÄ¢ù¢Jˆ‹žÅ•¨ö¨^ªª¯¥3¤ó¥÷±'Ø{,“Iw!* Y{+ ã?çN|Ç+ƒÅ•¢oÄ‘Þ-ý(÷U&*ÏȳdY’ Ñq5:ˆÇöBK?嵯 8RÊ{CÂÞw™çÔ=¯ãÖ÷uÒ¸·9¦x‰æ\ÂË…æÐ„œ"»ë4<› ²@½á±X{Ø3ûÞwëçwkòq|ŒSZÍÍ‚/Îí¨Ù\Ðj4.{îŽúqê9€qÚö’Í?¥ý•2ÿ§¯àâÒëþ·Fô¿~ß‚¦æßú1'Ö]휑à1µ;¥=y8xI%Õ½-´Ó¥kf—#³©ì¿Í¯ÕKÆàe¨]†vIÕdEÈ€$^â$.žI÷àuèKL[Ö#ߦôªU¼““å9ŠÀ*j¾¼V¶ èÆ¯ÃÅP«HOhÊßÂß!Á$ëù(ˆ?ÃØ2ù}¥çБ¡ G‰ Ið04øL$KÏJKÛ¤ÛÅÉ5.$-¤fæA›¤Kd] 6z-ÈUU{=+ÜI¾Œÿ )‚_Ê«‡,W|Þ~Ĭê{Ò»‡¾­§š±°×¡a·Íq G`þ…"ÛÌ>™ÚæöàšÀu/nq„{E˜ËƒÜÞ'Í(l{ö¯éö§öoÿW降ÓѰV3Ó¤|éã“üøs8\½¾ŽÝCßæ^±1ä`î–Ùa@>eØó„Na‡ úˆŒ Ð>ØX¦ ±0,ùJ…¼Ä»%RÄHZ®4Qm—‡?.êªWv‘TTs‡â©CùªmCÊaùì(ä ¢ÑXˆ®qÍîpà5{«ž˜ØTy§òùPíÐr¥“ò‚T[þ\|Yä Õ¡ÏQ Àtd?HsàP± ÊMõ«<ˆn–¾œ=åh¸#f!í%È ž;ì6r•èKŽ0_J¿ÑZ_s¦Õ¯k°kQÝÉç{FÏÒkö½lÐÖñOnnSâ4Ó¹à¼çr«s{|Fçg¶ª˜s:ç¸Õ¿¢Ýÿ½ºñ(òÿeå¯HcÝ Ú=ˆÁ½UÑ·w¸èŸßîGˆÔI)ÉËšSÐÄmÍéÙÃÎæª‹~waRo0·ž@Žb±²…ÒèF¸vMuK!U½R,Q_MüÆoÙÕ‘sÊíªãJ ¹“üG……jµr¡8=Ã÷ b<ä òvøC‹…%¼döG<ðæHòåʋ߇êå§ÊÞ¡27HŠ ¤Šc¯á½ðbh>–†=2pµM)ÈdËÎÎŽÖs2¿CøŒŸL*ô 7‡?‘žS×ê­gË*© ûŠe ®™šu¹«g­Ó›e°´ô÷‚×iÄ-À5ƒšZði+XÞñ.©L-ÑM1•RRÕ¢ÙpÍé÷'ÿ'DZÿR5>àÌÕ:ˆçɾߒÀ“¾EáÇ2ÖÎùY…þp<ØÕ“ +Ýš‹â5Ö½äG ã„!аô'ùM”$ý¦»—’@¯²_èzìÇæÁ ª‚X0![wÔ(7“Vho Î4ì±~g½x¨~Á® ·gáñ«Hý?ãù1CIO¯ñKñk¾–û@¯ê?Ñ’ýù—ÿoãpÜ àƒ4§‹ÔtL6;®°ð;pÅ_-p4Çtþõ…ù ·Âtåàuñ%ÄZºEºXÊ¿”ÿ O–É¥Ó¤GЈðb *2•ß =~;<²(Fù­‚ª@w+fµF¶‹@¢¡=Èáz1'lºPrhW¾G÷#‘<ø’Ø^òI°SR ïÁ®Ê2埛†TâáQÙQô”ô;{ƒ%_ù€è™ ò‘-QìT¼H¢mÑ–MbU–Õ¾™:ª1O3DxIʦfMÈ,Ö )¢Ý‚À].“|ND*"ôm~Ǧê•Üï5ãǰŒ=mÛ#¾ÔdO· j2Ö ¾Ö¹ßüÑGÆïmÿËÕ—§ÿ_ù‡úË»ŽŸÐ|ChÃ¥è8[ùƒH£þoÓ kòfŸŸbÁómë 'PBFHMe+ÎÔYùJ1]ñ|¶ s“~žJšŠÕkÕÛE›‡íT-òãrHÑ Ü#/VÐÙ²Ò:é:xX¸ÈYŒ‘ ¨Ê—¯t gK›Û%Uè ×![!ƒB ±!ö‹ü‘òîÛp©2kí¼FžZ7ôZf(½#» Ÿ¢¼Ì^µp’'%Ò`}Ð'Ë.âR¼a-¾€tžpibŸÙxxÎJ­äbO™±5Eâ£tÝúÄ”eœ{—ì¿¡¤–YÈå˽ÿYßÅzü ‡3QK£ ñ·pKÈ·]~uÜäo¸/!¡|x©iú‚޶6æN®!±B}¤Ýòýò 3ÿV‘ô§2#ÙfY±¢Wî®äÙªŠ‡†¿WÝSžQê*ŸÈå ÙTù©· ŒMÔQ²œNøBddok„Ž ‹úJÁ¨à ¬ƒ<@êdéʧ §a-•5ämò1i©¬XV®PÉWËÅíòÐ\Éö>[ù^E³òº, ІêäÃò9}³S´H— ¤ÓÄñ¼Bš·‰…ä¤s#Q³|É8²8eöÒt}s÷‰=p À¹ìoXÿ_ýªÿ[yøˆ:üQ–÷vüóÙï;³/x»4 d„·N÷,ã]ß8~òMö5‰ÎÎþиnþðBÇö<î>A&Î@˱é.y´bD‘-ÿY~ZqNöì½÷(6ÞýTa*ç(²‡DCÏ•xe$ð\™'ó“£R Û˜Nh¿xŠào˜ÿ†·Šw\x]Dƒøž(H$—Ù)VËÈÒ™“rÕP©ò¨J!‘‡D²]`¶Ø ìH²àbùJÅ[å>E•ä&ÈÀýD²Š,ì‘ vû{ƒ¸ì­ÔÚO¨&ÏÓ^Jª˜Çé̯©ä±à`/{ÎJ·Xò(è5ÿ!Þã¡­¸1õŸéõ?«fïM㵆F¥qü³}$®¿ú}ô¤©:ÑðSCx“WóóN7Q$²ÐKðYx›%³Uäʰ" ðêpY§Žù<ÜV °¸Ó>iy×?Ãþš×PÕw]‚ZINõpÓ7Í7[vŠù)-ˆ´¾oEšd°â{åäa½á¼a"°ÈQ®Q–(#YC¥CzC¤á£Ã=CÞʽ 5å;E‹Ü3Eà8r‚(’Õ¢Dþ"ÞRžŸ"0~#¼(Ò‘¤‰/B9Øbé'd9rUþTq\öFqTùb¸mw‘@®¤c;¡t“ì[9&¹!ÜÊoÅÚUÛѵ,ô¤pkN_Lw¼Ü=ãK6©vÃUÿ‹¼¯€n#K³.±dfLìÇ™ÙIfp8qÐ;fËb©˜«Ä¦@:é03w˜±ÃföÿÜ™žžÝv§wNÏìîl#©T*©Jï>üàÞÀg‘s£ß…·Õ¬}ùVÁD>bY3×?jÐ<”üÜ¢¼¼×ˆø¯Ø"ÿPÌÿFèoÞ߯÷ù÷¼V`îQÎ }íïëí¿½é€F³s¿6î8àÒˆJ)šE½—1¹× ¾žb7¨ûÔ)*ЬNZ¨ LC1×1ÒÑÖ™aw‚x¨/ÂEá½pÂÞÎÑɱÐQæ8ë<êŒÎ…W|Cî>àI§G‘ë°|´#2ÁÖÐ:Ñ&«Åô0^¬Ä2ðP%Ƨ†’Ý©¦Ì%&šKbjòfÑéxã¸âè+¶¢ŽáýH+¥ d}ÂdÛ÷[÷0³ ZÓ“™Ï@õßý¦ ™®Ä|ú)bGìU…(‡).%½Æ&X.òíêƒÌ½30Dˆtø‡–è߃Â?î;øVl¿]‚VIîH×ønšŽjoÍ­j·˜Ó|Hâèħ½›«=¥Ö¢U™M –úéw[Œd&PǬG8‰Gädz5·“ïêxéȳŸt¾µ—p6)Çi7Þ 2ÇW_÷UGOq¡p»ÏŒ§·ÑVj'ñ’a[ˆX°BÀ"¢!ØæöÇ´ IFªbz|UŸÎfªÞÀl]& XNó÷¯÷ìáöLKâ.\ÝTÓ2È6µ2 ÛÓ½ç(‚›Ã^£në.;ƒ=™¹_ºÚo‰úKlx sCY®h7 Ù€•ÈTã˜%GbŽUÏ_ž¨Áïiå¿•Ðÿî½ ´ŸW<ýsu,9 M˜v8¸Žo”Ê·I~Ëôfoš÷m÷©Õº['ÖY²¨gNŒni”±žõ þ€ÌÅ£0Z ¼g¯Ùrn?ÿ’oåhîlé¨bo(„òËźŽÛŽy™=N\åìëlà í aD!?ãîÄ;àÃÐá¶@‰úÙêµÝµ¶€‡YËM‡ÍcLÛæcp2à—xЬÜ[Ènd}ò:–)b‚¨³§Ú£‰p ü6ãâëðã¸îöîüz V‡Äg‘ŧÇšR¬)ÕLPW ht ¨>È¿KénU™—¡³_Wö[ Y1• ƒÿ·6 að â¿â¾L2]îº7x¤ÚêÔ¿óôžö–3št¹Ò³}RŸ©%³~N;š?CWli‹GûÛYMt r)&}Á®÷3÷Aø,l°/r,q”Ú5"brÖsh„L!R¬k·85D!™»HMÇ× rl5V•8IŒBwÁ3%ð6ä=rKoÙFš +tuõ‡Í“GýúÆz?B– Í™Wôqz¿Sô»ð©Ü±\h!΋ט0b$,<ä2Å8î3DN6>$ÏŸÕI©ª­™­žè³M]AÜLÑ%SoR$ÕkØDçûÉ5º>ÿ·ÿ­ÿм²*j…ùû¦ø®õËStîûlÕitkg× IBJ‡Ù²ygÓÕÙ͵y¶:ˆ ŠÇ`åH²Ma]K\/ÙÊb¦ø–Åbqa‘øÄnwïqï²/·š‰cìWíJû<1Å®²àÆQ=|8 ¹ŒX‰ÇDk¢²‰CŽã£É™x ¼d³6Î+Ü£g9N˜‰°ÕºÖz]ÏtäŸ1ïÊE¢À }éïÈ|VÁWã–»½†R1óÀü±@hÊwΚ––Bß“žð>HxN5O3`ŽH SÖ-GsÔ°êGÍ©@ü×öýíŽ!h<©ì¡èî{Ö·³ß„ƒºìnÙ¿ýÏckM^8çýâM‹FfMÒÉlÙh <9 C^šgÙ*9¶’_ß:sjf/Ý d±œàVÚ»K=˜óµx]Ѐü´'ö¢ÊsSx5½‚˜±.È{Ûbd0rÄvÙ¦EºÀàRbëj¢,ý,×Ì5Lß!ïÌ*¢Ø]ØbéƒeDZÔŠÆ%d4[•›Æo¾€ÑdŒðÄvuYŒ†iN|Ǽ`¦roI{…îšïhR;©RÆ7Þ?€¹Sâ'­²dþüѨåÞwÙŠúÿ0?ÝT=ð=¯÷±©ÚÆšºìW¯gj ¸ÍÂYS¤ëÒ›eFåß0|/Á+¡_láÈF3iª-~‘*üXNðý@¬ê@.Yp <ˆeßëbÉöwüdáG1?Ítb/v¿t"q3à°T¤!º¶ìœÿ‘ÖBó3kÛέ¶2K¸¦péË>\:J¿¸«Ñ¤ûÑ‘¯y™¨à7×…º\Y,,gB…M Þvðëœ`¡µ†üÝu§Dt‹Îû%‡;_ž'¿PXaþ§XÂþÙu‚šA÷ÿÔÒkíˆd‚ê‘&ÐϦ˜)M £ÚÃ=ïõèØqÆHhf£¬ˆÂ9Í »ClR¬rß §š3-}q/)ÖòêØ.º#B<²–4\¶=È%89:߈›Ä•`$ÀmdæP8žŽ—âMÑÌ‚->´ýäc¢FÃG­r¬;ˆoe¹ná,;­Kl½M)€m®¹u,–Å”ò‡ìVñz4«mÿ¨>ÉXrÚ„¼Áª³0¬ßãDVØŠõ¥’ÈÀßó•øJšÐýùŒˆ6í[΋ë‘ Æîo[É/qRîe7ÏQ2ÿ·¶¦ÑÊjõ•d¨âüƒ‚ì>Ë ³ñšºÉMß4Ù˜ôtB­ó¶äeå'éÏÙžY«¡åÆÖþø$ìøbZ¹VѤ´vcN8‹;…gvÁ x…V|#n¾-<W ÛA.!L]ÁkÀ[,¹ær8È6¹ Ó¨›ƒîD—cÃàiè\k%@¶Ê^x¨Õ Ôu÷À‘©ðf¢ «öˆél>ú"¤¦B>|ÓšÉL‰€ÒÞ×VÁD÷Ïß–ü¹•C¼ÔZ$çÛ¯ ´+k6OÈ®q£QëÆa}ߎÉ\ Í>›gp›:ÝÓÃÆÜ¼ú: ^¥µ’©ÆìÅÖ[CM}¤m1w]üѱŸç錙y `0Î æw•ØNôz¢ð ,€O´ù«ˆ L¬jFã±Wh •ˆ´FÀ«@žâ=Û%[,\hµá¡¤/Žë¨ÝìKÑHÚO^W{†š^‡ØÓM<„L¦Û3/‰Ê³Y\I¥fùMYØltv(~O¬â¸‘ÜÌX3VÙÌ'Œê ••ª“Ê&Ê"¹´öÿ[õUú¢g¯Øk&Y&³hô¾êÏåéØÌúgëëšÌLbç¾^ø&kQž`lã†[º,³˜çÉ”½¶Ðfñ43 õɰªMÛ %H{ÖÍÞfß0›¸–¬?Û–¹M-¡ )°Í‡PK©÷lârí€%À?X½À–Ö¼O>%tD)ñkD¡ô JM£öàv,Ûmw¬Id4·‘NÀ¬ÖHCR5£¹ò­Ú”‘›ÙÞ¨±”ë}l¹äfÖ¹€uEf1A#'ÌM9‘ùÙè\aðIH2XuUsÖÿfKÀhŸöªxUo.;+O“ø¥ŸÿcP7üÙÆñ—¿÷ø¯ýí ïßøü·3ÿˆ½ ŒçÌS‰o®x7úIvUž Ô“Eÿ~¾á ãj6[ø¢¥qü“ÅÉúžy¥ù}Ì6ËÂ…þba§¬ŽY=óƒÍ£,QD@!sÈ…øeÛViº‹Ý¡› Ãù[â .“ãè„…²“• †êL¿"<ä¢9“zƒEÂ-‘Mx_`ÉÛêQm(Žœ…µ9©-É[Tsr*¾šx(–€,ä-€Ã T\+&r7ñ¨ñ2ßEyë*÷Ó™‚úÖ¶éÆÉ¦hûO¼•V³oé1ém‡m4EÍ®jš5{ÄÓÈšœÀþW'^¨ê‰æ®\P,PÕPÏVfþŸZ¯AP1„¤gAƒ*‡T‘4•µóíîû<ÐèWÑ$ö\ ¦{ŸäqÃGÍ4fo×vÍÛ[0ÊøEÇêfêç$çšsnåU×0Åæ’Õèyl{.Ží ¸y“€Ò†š•‹œí „Q|w&‡œLT%½×ªtCfù‘ØL:€­½3°è#â©wdê$®&¶à;ð«ÊPÐtY„ÝEºáùdcâ2ÞMÙqî-¤ØKÅuVI—€Øk±³¢¯„wÏb]—´5j©ú\ªŒïág+_îÑesÕ0í4}¢ˆŽ|èÿ1°µ¦¦ª£ê,J‘å\+ˆìû§è¨?¢ýOÿžÐ€ôg¨è—gRH“d!*XåÀ¨ø¶‰ ¨,Ôë´cÀ¼!ê‘вsKçkëéŽiSugòŽæ09/s…­s'ç±%ÙB¤ã™¸—w±a¬“›%V¶·qŒ·÷šóÕ˜À»> {‰×¥òè€!lÙ„¬G눖dg*‘DÕ&CoU,©‰@ø>|=ÖÓæÁÌÄO`Ü¿‰Œ#17˜éDxQò8s^hÈ­Ïvv{Ò¼ê¬îŸ2]xcó`ÔQ8ŽhÏ5‡Ù[•‡}œÕ”ܱ ÿ—Ñ«ë﮼£Ö¦J탧)’•5€±ç˜ÅËÕ+@àSÿ5š±ßÖîÿÓûîÏGòJ†~†bŸD8x<„fË-ŠŸý'ø'ʉ°äØæ13ê¦ éÕoÔÐ{Ó¶Ío–å_(Xš?¿°zŽ[{E7M—hÚ©;˜}£ 2Ü„xIµwO"ã Ùƒ(…# 7ÝŽÛ$tu+ ƒG7kq¢Ç£ôX>M /Øo´Q.®P¼(, ™zK˜ÆåÕ“”Ïü›Æ¬z§Ja×Pç]D­û„fiê*QÕ¾À“ü®*b¸þ õ¯üÄÑ?ØeÿÔ‘û¯Ü˜±•CZ¨)ÔA ùB ¡,‰¿¤º,/àsÈ>¿ª€¨aÑÑQ¹Ý\³—L+HqN¾1ëí‚+˦çΕdÉI2¿µø [­ot]ò¢óg™7`óHØÑË]ßÑ[x,€Läê rÙŠ®Î•²iÔ`ÊE´ Þ’«I3`€Ì$7°Jø:¢× Ìnæ<•E:°æH7x“Å»B=C/XoÀrby“‡ÝFØRà3h0ó†EM¦ÑèËÜpÑ*Jùe¯&wëaÔ?±mE+ï‰yÔ^ÆÎozoF÷”…ƒh×›>[Âîj†„´ïÝÍÞξ}æ߸à å|ØoƒbŒò<ÈÚÿk%ôGû5SæþÝßû{ã÷RðèÁóOPŠ$Z¶ P–†Í ¦i¢é=9ô§ÇÇ<œ!ù<Î:#mqþ©YÙÕ]f³© ÞÝgšiÚTX­ð`~CÆr…zÞ8ªö¯ õ‰£ùbàq‹¡}ù¶B¯b_¾OŽº ˜€œT õ–L †^ì P°Î#o0=éËøC¼1ö>a{ ¯afâ¥X¤*>€jÁ”‘Çа¿e¯m6v›1KYˆxÍä±2ö,ë°{Òv|ܪÏä^Ôi´=™nÂ~G…3¹t1#¦Ž‹¯>­ôõ»oó?>|‚Ý ²'ª$†«¢5vÿhõeÿj¾­IÀ‚ýàÏl¿·üþwœ÷›­â~!h4ôçý⽡«’ò\UD„¿ ™èã÷Ö·8ºR4û¶YÄÔš#Û’ªZÐ}‚qòÚE[Óëd>3`¶×hžéCa|ád-««iØm¦{-ç.W3GO.µ2ý…\æ6yŸÖñÕøöö\K¾ªð™ó2#èÔúµ’nËÂ?£/áÚ6­;Ñ]…ÍE;!ŸàDëq¬+¨ó_PÕ~Ãìb;ÐÈ(t² /äòì>N7׈îM /pZn«k;nÙ//]ÛCÀª/ŠþzÿWl¡Ñ€Ö“ƒv«¬öÞ#NØ« s¹ª\Å¿¢¨Ö òºÈȨO•tqçªþƒ¢Zÿm™W\ùŸ¹ývõŠ=ø¹³§¼-À¼ôQZC&‹z³=x¶ `CoFñ±ñU k’\Ñ+8°rƒøVÕÊ#)ÿæ±_ký{,dÿ-cïߎÎú÷÷ù·ÞC»â™óµ4¨Ô´ôPg'“Hü>†Ž¢Ãä~ãUAáËýDŒmVóxÒÅQ¡ã=ãGŒžÒ·óø.cçgnµž5¹ ŽtÓ}ίæðy†¶è*à½Ê¥q‡¹Úv³ØˆýÀ&9:ØgØ1Ĥšù‹ÂF!TXÁWbÐADÔzý” -þGê(»ÅöÞòÐÕÔãqh=¸†µ#Ò¬ß!FCï@’± 6?¦ðйHPÄ*ü85©CÜ1‹ûuG²c¾S—ÖhvŠùÆÐ„^XÖè†Í;¬Õ¨Ël[a/¿»Ðû‡p/à·¯ÚD»9EUà›¢|®Ü°-âMŒ=ú`Ô»ÿo<ÿרßÚ8Õ«òþPXGK+"á ©^uÛo±fæ…ÿ™ÀRõÊð·QHÔÓȦñ÷ë™÷iIVæ³lgî>m‡‚7yb^Ÿ<ÿ¬Ìù{Òzf(´#ue¶)Ì.ì!vÉ¢£,ü=fkq,ÙåíæÝåöØëÚã:±‡Ó¹LJßÀ7£ÐÖø$MCh£ü#¬CL¦Ósü —’éT]ÊÎ`œ¿Óyß3ÔÝÞ9ܱ†zí(†RÁÈWLE.á‚«ÄMvœÊãµÎŽ9È…óps¸>ÀúS³ÂOá¥ÌR®ˆíÂHh–xn:<½ZÒ±ÞÿF°È¿Æ²ÐèFqpéå‡t/ˆÜ?âO¼ÚÿHÿú/*À]>¯$ê)±BÈFƒ€žÜsy†âœ2CuÊgFP™zŒÏà˜—Ñ;"¾ ýÔ¾eŸˆœìŒ®y»µa…ºÂÕy¸¶mî–Ì•9íeæm-\fì‚PÀ;¢Å჈Ætg—ÃyÒA»o-úÎóÆäš):D_QÏõaz€<ÕŸ°h>,AÆÂûà–èUÀ(1NN!¶XBmÌoLmñJ$nsb°íz’«Î]eyf¸ó;ÔóÙÝÓ¹Ú›ã&‰y¸}É.`j±1,õ|u}Ͼ¢®»É2êžpD˜Ï_rp«¥%ƒ-çôq.z™…v%ïD'[ÛÆ„ýˆ·¦·Ú?É 5ÑÁó|í~ ‘£B|*ÿZNÿJ¯˜CÐÁ*OÒÀktÚ u{ùP’¼¯Üâ×P­¹¦>.Ÿžû.þyx£fôÛäAS§dO0,7ö2+ì›ç-ˤÍÒ±úºúi¶&hFK×Jy-¹Dv ûÅ#-Rxƹoz³‹R<*—Ù~d+E 9œÖY>L]b<™d›´÷¤Ä-v‚ZÇØìÖæÖrø“¹£å±OÁ¼hø&¹šH¡–QWè±ö¼CŠ˜¢CúbüÀä‡v`>MÙÜ$1Íc+n-*º¦§ž³*£ÿ‘àˉ/º a#Õ€YL\&©Ÿù"¡~‹ä {²R±âeÇY@—¡Ûk¾¯Õ˜Ÿ& ßòo8þUp¯@\ ï´'B¹P (-é ý¨>Pª®"Çdýº‡÷ŽiSÙã_Z³ßâÖùsÓì… ÝùÂE…›³»vÒV7D:ZXä<² E­v´36O¶w¶=ÞZE‰Þ¦ÞSÞ¸¢Kž†®§D¹Öö€ÜSÄÑ´%vÀkmû-ÏM^óS Û±žÆm á‘ÖjfÊTä$,1ÑÖ÷ð'¸ ÁŠ‘‹¶xÌ—ºÉØÅêÎ=ž©ÁÓÍ;Û•çpÙRÐýxµâ ÙâJ7î=<}MÜ>鎆5¹Bw9`Ž™Žû¤µ)Tee°o¸¬ÍVhØfªÍ±®©CÈ‹1ű¤!Ëü¶(|"5Z Pºà_”C‚b!¾ú_¶j`•v²È‡É–ÉJs_Rê«H Ùe¯T%>4"c –³\ÿ8g‘~¢nEa_ý]]‰î‘ž0î5oÚY UÈè“ ÙJL¤Ûا¸ö8zxæÁÞ†Þ—n§ÓêþÑuÕ…:´âþ½ŠxKl¥lÔt·ÍßöȸÎXbí‚n ÎQ½ Œ™ì¦Ó–6ÞZd›|,wÑHô)ü =DCâpu›6ðï¸«Î‡Ž»ö ®Ö…ô aÆŸªÉ®a®PK™#®*Þ£öÝ=rŰzö+Ž#â+±ëÔnñ+ÔA4“ìJu_:}3#4}Ûµ1öà[S;ô ä ˜âÛMcòƒÂì²²ÿ–(¥|ò+Þ4j²WöIú«Ú*g¨Žûì]—tƒ:ûnŠšc¨¼%6±^ê^ç² Ò•jk¾*¨i¨¥?kªcŠ4l4åXo[o›ÐÓ¶ a¼•žNe¹5E*ïOÛ"ÂûÅSî˜+žN:gº¤®r;"Q»áðøH²3™ˆi‘4K‘…1N°VÁ7…=' ™/·˜W[nذ¦xG* G¦Á£lWÑðgÛuçž²u( •e÷µÏr¥p°(´„ê+ü¸&ßR©Ìl~‡cšÝîÊ6¾gq>HÀ½×Î@³w3«¬--ñænÆÁ#«ú«¥ÃäHfúFE.«ñˆ„]£ª2à_؃þ õñÐTh+´R¶M¦÷íª¦:¡à¥Ë¡ùòÄàÝ‘*µÜVýC»´%—m‹ óëê>Ô×·.1#&›!Þh2òFʼÊb°dY7ZÎÀ.b%=Å›_Ô®(ÎëñÂE¢'È™*ââ„ Ñè±×roˆÓ8JÔB3±Dc¬;2+ÂÃL8ºŠû‘¸‚„#Y¶ë°«EL TYŸxI_@VàŸØGÂÏÖVJÍòåέn·{ùëŒÝ%?‘?bJd¶†|ÏOrq¼ Âa,ïriìÛÅÆÎ;öÅŽΑý›,Ôä]Ýà进ʺàa‚ÚÙHÈäFiã÷£ßj×Óø‹~×þûoyÿÌ+üjy… x¨Ôz'O Øâ§Ò«ä±ÒªÒH5ñCXJìíz ;w±#ëŒ5´« é?™ÆXƘoZš¢u¡Æó†åz9Á¼ øCvRuÄY®tOå¢|ïÞsž¸¢EZWqjÎÏço …ì$æupõÎE_Ñ5%˜—ÇÕ¹xÊ릸õx¹-ž`–#{(Œ–PµÙ@ÁI¦'è]Π\/{˜½ö¶²â„ ¿ÀαÇÚÇ‹ ˆMˆíH}O¸3dÝ‚¾JÕÜ º8Æ1É~ÖÞ×Û©ì)æ(7Ãá¦#&âízEq¾ÍAÔ<6WXÄÕ^4ªÚWq+pš*X=ð_óoõ«¢¥÷…ìÐ}Éeÿ Û~ÙòR© DG]R•¬ ;’:µú¬'¬©ÖZúªz—a­ñ'cUÃ)SkŽåsOÝXíCàMÃôõM‚5‘ø™éè]t¨H_tÌã[”ê9â½ïþÉ݈Dz逛ýÈ-»Bm%¿'–ã~Ø!œBÈ,]áêŒÖÝØóƒðŒž†dÚ¦[rM©ðQv?’?Á7ãwX$=žÚ‡’¸0BƒÔ†ûbÈIH[Ç%.ÙÈß5¾ŸoB]ä^c‡ŸÜzr5ÝÎépîŒÌg±žxšÌzرÌG &çÒMx"iH³V óêm¶­wnnæ‘õÈô¼N×||T£}6Ç›}¿ÿÆGñÏl‚ÿÔk}ëßK•Áý>¨ÖJw@ó zÊ·ðàz~"é]u m·³ÎgŠÚ榻`Þ^n8ižl\`je|¤ËÏÎO0/·”ÀJꔹºxŠ’¼Ë]½<ÑžÞ–ž¶Îqâú&åOíª¸9x+|>{@Ä%ÀÖžâ!gá{…%®ªöl>_§Ã´6Ýl?Õä<ôàŽj;f‚?ÚF³±çÖf¶îpe´'ìéBCwoçÔ6×OÄ[UÏ1íoh‰àQgŠ sôs¾q¾tóä VrûÄÙGpM`Ò‹ù£±Ÿl¯õˆŽË¹äô8L¹9 k¢eštÕð¨¨ÈÊšö¿°OüSaøO.VÐèìæÙû†8ÕVå†W’i^HŠ!ƒt§OTq$²F`ûÖqãz[>ä}Ÿk6h­«‘FÒ°Ùðª0ßfbâÍÕÀ~5ý}ÛFô:݈'žuöv&;rÜ\n÷l7äux^;Ø[Sçˆâ%~¿€&#—¬.Û&0/߀ô K±yìYf Õ›ã$ÈId0µU?¹`ºa!ûy>×IxÁ‹ é:Dmêƒm üX蛫è]ùk¹`~ ñZ,dç”îežb5ÎÓ®¸ºÖºLOîòlf–åØk]p3µm\ò l$šë×+Œç£ßÅTÏQà˜;¸3Ì÷ÓÊËs}kG¯Q•(&ýÏÿ ˜õ£oˆTŒ¼>î»Ò£’ÙÙé? óÔ¤Šk¤HeBøž §*Ä Iµ4ã"àp¤KŸ.³¨–Úú–ùÑõX‰5×2Õ€+Š,ÇMs€jü'Ó ½Æò½9'npëÙ4®3÷=ð“öwÙ÷9‡¹Wº1g±Øƒ]O½ÃÀé<Ó6‰…UæBÃp“Ù”m.µœD3iŸ+9'±§–§:w†´tÛâÔf‚G: éüÌ4¾Óû¹wöG˜aˆ¶³n“¾X·#ýa6n_A®´Ý¶Öõ~ZÓJÀ)µUÔ¦y ä^½J‹ÜA~¥ã7Ø1½I]go¸êp»šz+±u•µ}R§—ˆÔ^]ì0¬Ž¹¯SfUF+òä£ÿ3 (ªðƒT î+ËSMQòi£LzÔµŠü¿Õ*äµ!,ݯ¡œ–>l‰¹1Ð3¸ÿÁvqD*ª×k­[ñG(aSÚžZ²Ìuµ ?ØÖ˜ƒlïŒ;ý,U-)x%n9½–çêñ±Ü ~ߎ»Ê7¶ÚŸ: À{Ú˜ZŠÆêÀ=,ÛŒÕL)†HíCí,}/CŽÑ]J„S!ÎéŽã ›Áµ‹–rÖÊ{–•’u±n=“@UâJ*€;%àÎSXsÃimÏÂxmßeÙé Lø~úè<܇oC¼€ûÒã„Y¥JÊË;»ÑU-¨Ç~ú'k&»ž%^á[-öAÍÆQ¶¿(ÚͰb›Øo9ÆBò½ºq–ÆðŒ^K=æ–ô:j’pCèG¦‚œõn\×ßù¥ø+Ù=[)´²_¶o ˜<+fÙiÇ`÷#÷cï}—«Ò_†ê™rB‡©bG¸=n7pgóeUb_ ›šþ'Å¡¿ZdÿÀƒhŒ~Á7Ú!RNQGHûIÂ$µ9öÇ\‚f@5$Wå#ÕoA¦ñŸË> “°é•ü,²®þ(ƒkñ½Xl=ò9 €ó­M¬&ÌqØD¢Ú ‰'.Ó3ø'üC!JüÊ9ÙcÄj6ÈR˜HÞ!Pš#7ÃÈmx.rÌ4ܸܼV÷V÷Þ`±2JòZæ% µuCM?Àãq·ù£e<†òç=µ¼f&<ÇØ&Fíz=¿±IæÅ#dî¦8ÖQ‡©öî ÔA²a¦.£®æ¼Åiëg1ç¸Mü1û-À=ö'vü%b·Üƒ,ê¬ëÄLwUon¤Ûà:Ãöæ*¹n ÐözÏëfŽ­åhöœP›uY/-+m‡ôÛ_£}]õþ˜Òý=¿ò­¯8³ŽÄü“@db@x“ôŒò¬ú«ú“ü´"^Zø¿~ϯýžs på “Ü_] ê¨ŒO8ç.k-Ìàƒx•m’M$Ò°È0t^‡Ø†÷ì<žéá«@ÙA/¡tmáž¶¶vÜÎÄ¢cÈÝè "Ÿr•Ów¤—xvß/…e–ÓæMõtœöÇ‚0ãn WÒ6«@<ò3ä{ø MG‡Øbx§gaIÛƒEÓ{v™¨xÚt)eqÎ) /‚œòe¨Ž’:®Q}‰}¦IúW£}Ft¦\¨+ùìyÃÞ{7¶gQ)¯0Ý<¼G­ÀÔçåGjlÐÝ:°åÀ2{ÚÕÀ]×}’Ú-Ø=í‡i¶X¿,àù{bÉÿˆŠ¶u(O¢b4ë;j_­[õOÙý1çxÁ6 Ä(}•ZddÏ$“%kA¢¼©:©Ú¢Ú§¹.Ý(©ô ÿòzßÞ¹ånptèßàûËïUŒz¨l’rŠâ€|™lVõ6M¤C “PÆï‡ã° ØQ\‚ &ÞIÜCÈBšbÁ–ÝðvÛC¸+ºw°˜íŽÊâW c¯¡‘{ñÉØFL‹=²aV“턹ºe“im&|ؼ×l1÷7Ž5ÜÑŸÔ>ÓI±ï±…–/ȢX‹ÐýH:™êa=‘¥­ ›ôîûV×>aìü­ü ~®Çn¸gÖ…Èz·ž3':÷1¸ò’Å‹^ÅÈ’ ÷ýbÀ $nöVna£È áõüŠ” 7Æ™oòg™w¨{—8ÒùÌaa‚ùeL-Šs¬q[‹™íì{f6…гíó„ï»/WGoñoËéõî[(©#Ù.9+"?'P»|¨Ïä k!±¡é¡I¾ÕÔsFy¼d¨¿Ý-Ñ‹@‚â/Žþöù¼AW¡—ÒçÒŠPŸC¦eØ'ÃlŠÐ€›A—£‹múœlO4ÅΣ‹Ñ«@ý* [¬ ÑPô ²Å: åˆ+d}n$“ÂK…2f'¡Çç‚Üï»H=«|äOÕ÷7ÜÔÝ3¦[+[OÙnèÏëW[êK nê.êiË6üS׺눡ÄÏú!ÆzÌ${u¡Ü‘_4»tk‰µ[¥Tšy×÷¹”ÃܾÅÀ‘h«ÖºYØc‡Ä>Ôuïz×H{ç¹-7+zêÊcø²¢=Î8×>û#Ì\yF³çÇÌŽfȇ*2Ö³ÖyÒ,Vç?;Rì9â:ẘ!Lª^ûm0㟄t¢²í“Éý[©0ñµ§]Ÿÿ¸ÌþžOþ­ß¾_Ѿc¡À£Y i,‘HJŸAÝ${T«”¹~݃&‡E®U/VvTRøÊÒeÝþ¢w‡€åÔ¼@}$ÿ‹•`õåJ¤±âͲ“‰2Ö³%|"ÿ€î…¤î?aC°ÏØúgêFW%Þ‘*¶ _E»Ùº`AL%q´Œ\ Üv¦®E­Ö}æV6ÔÜÞÒÃ8Ë´°°u¡\«.8`Ú„# æ Íq†~yû öÒ†Dcž­‘ ¸|ïâ]˜RtQa 1[Hµ×u¾IçÞ’Ì©벞ƒXÙ*`FQÍS“pNªj[Çi‘Ñæ-ˆÅ8‰2òjÇ;xûüÚLAÉ û±£óµ§–XÊÚ„ÖK“v͔޼Ömå*¥¦_®»UqC§•ŸÁÏáÖ;‚ù ì¼&èÔOŽïi­k&ˆº;ˬ@Y³(¸ØOTêÒßùãö~Eþ××òr?hÔ\z^zH‚ƒh•^’ÏòjŠkþ“‚óê÷êÞy~œß2¯ÏteMÉÀ׻ׇ¬ÒŠéò 5¸ß¿AP¨Tcا¥Ë»PcbÕÅ Ü n~ßšg~Ÿ@ïÁ½Ð'4Ew§^“-ɶd[º*©³Õíß !Ç19`h‰üíïù@ÖDsøï°É2Ñ2ÆtÃô¨P©ë¡­¿#ÿ6P×Ú2¹X(®Xö˜¾Ó¶Ê×jgèÞë¿7ÆXNZÛÃSоÄDñ»A0Vö1|{i‘²øDÉâÒ¼‰ÈBw»¯oLfꨗÖßLl5EYëÖ¦'-<>ꧬãSƒñŸÂ˜Aæyæ•;JyËv[Ù"Ïè€Ôôqi½nGÌŒëQ§$Ç塿pÃé¯vÄtü>r ±mÆÖZºÌávÅ Àß´VG‡ÌJ0TÎ-üCc&*ÚsÎßž¿½VìÏ-¥'å¥í¥Y’‡™|Z¸! __óà>|ù]ö}ìì¿à¯â:_qMiVý/Ú +CG†zœ—øHú5&ü(¬gº « O[O›Î¢1ä\Óf²=†ä©Õ\ ê5*Á“[²m†mCÒÀÊÙjï(Næ®™Åì¦Õ¤ÞoÁMwô%ºýPÝfÃûBSnÕ¼|i~Õ©áµy¤©§!N?´°qþÚ¼]…/µ# Nr5„¶Â·Ð*´ÆëÞ#„Ý]Œò öšK¼%É%os:’3´ƒQÊnž²±Úö¦×;}¿4EûÖØ¨Ð/ãÝŒÃãVa#Vº–ô–—{C.eö––«9á3RWû¤D‡Eu6«¬5N¦z-vÖöØ<._ÆL­ff:6{ìÌëëP¤/ípe;*ÚÊX0ïËWŒ>Zí÷·œ¿ufE>"`Ë­P2ú†|[àß@ •^)Û!é'±IJHû©£}7½ãn¾ U ~œÚ¤ŽöÛíKùº‚ò£¤XÃýÛ+) ’ÆŠ'²±ÿeßÀΪŽFÂe:—¿j_G…’Çn¶þÞ…í²¶£&c ™»ÇT¥Þà]±RXŠžlFô©0Þ,8D;¿™ƒ¿ók…š|ÝØY¸°³¶DÛÑðX¿®ðNNÕÌ7ËÎçÍ\cýβî`ý »¨]—>çx^Z~×B½mÛ‰倘—€QÊã¶zv:·’…ôGçf—®(­8¿´})[²Å½–ÝD©#±M*½õ?;f²n൴¡¤Hê…¤ßV¾ó}W«Oøä«?¦øõTuTORTuÓLR·“Éí`4Vñ?Gr@Ðh3”)ß+Ÿó 'η{ÿ}ÏÓœ¬ÐŸ¿Jm£¯SCзÌà]„FÛ[¾˜Î”ÙºŒ†jG.cZ¾¶QÈ*l ECX»×1VL¶ñ{ŸXGÄRÑdëtý mƒÂÅÚ}…¸Õ`†-³dÎÏ>Ÿ÷IÛJž›h‰EanÓ‡¤`Zn~NzÞW`ói(´íõÓÓ`!Õu™?àP€1üµk½‹p绺8w8GUYžê>a™\sÀ;õ Å€V‹RnŒûnÆ©´Äô¥¦îDÉéSWVüßP€tæÐCÔ†Iååß©—†·Ü" CíSfÍô“_•7WÞ㢆W÷ P«g®?5†M› ­¡îýéù@ÿå€huWBHäÒö üǶ’uR£b´d®ÿ¬ßåê-`¾ººº§;8yû#þ¼°FôbÅdë%Û"`?A £jŬt8“Š|´Õ†GÁË­Hñi;e¹e® OÁz¢åè&x“m‡õ³ù¢q'ˆžifþlÙbjÚdŒ6å™Öè*Ä ïG mí üõÎð~ÛHãC’u—ÎP°1¿T—dó¸JSË–¸²Û¿lu²ÃÁNœ5Úí‹óiêÚ1ëÔå2_Ðõ1¼¯ L诨¯ôQö ™°1¸y•ø¶AgèçBð™ìöºK T#Z¹f;+qqŽ–ü-gºã´ûr\?-ûcØ**ŸÊ‘ÍTšäýeGA¬áUE#eŒò飘©–¨*ZËå[d¾Ê/’zÊAòwR^Q[~è­S¦©bå—ä/dsä×ä 5ï5¡ÊçŠcò…²0Y†ô6ÀðýHÛhF*ibÿêˆ>xP×ouÒRKÞ-^èœãÒ¸®õùEÎÇAÀɲ”h`iƒ-ÆØ¡¾è{7~ Û‹ÔF‡˜Î™\æ$¸µ¥‹e¼¥7Üîm¹af[lêcœoÙkALNÃ~À½»Ï´ÄxÂTf G!#-;Mñ¦ÝÆH«Œèƒ™‘!È8Ë"t³5Ò4K·DwÌ’jj›£o–'jkYêÂˬ>¸Ù w· ®–ž¸boI]G†Ëßݼ(¹hUÉž¼Vïîñ+¾U„—¾ZôlXÄÈš_wjØK>ac¶7»r©ÎÉú%~ƒ±aQŠTi1èùp𸫜§*² ÐnŸðȈÀìF‹° ö*Ž ŽQŽ]ŽCŽî8q*]„o£ÛŠþl’ë‘ã†èb‚Çm“@ßAÐd(dV—{•=UýýåZ¿òŸÕeÊ!>‡Ô—7U×U'e9Š“Bš)m))CeÉòBE¨¦‰zžì¹Lì£Q —&Ço¡_+ÍGUuÅPÅxùÅyGÙYPŸ,пMêI–ÔðW,3-ºZ·ÿc²g’—?°n_ô°·¡Ëëœ!¶×purݳÿHUBâ­q˜ ¿gv›ûZêÊ͵ŒïÑA”I+ÔÞ7>µ¤[V;šòÍÛŒoŒZSCÝÂÂÂ;ºÚÖÚ”‚r­[™Îš¾Zqt9± ëcín!L“myæb›‰èŠëØ ÇE´Ž¡ÀpÔôÕ¨»TXÓ0 f 'X½ä^:’Üëx,”2£¼e`=µÁ“YvÒs]¬gWMr`ÕGíëõÇ<—ÊùÂÓØùSñÉÑ>í=e}wvì9¯|ñz…‰kcÞ÷Ñî—yˆR‘•öT…dú¨UëQŠoRAÓFû û}1OÐ;;“Åí²Çx,^¼Î~¿Deɬs´ú0¯uk‚Œ°2 Ë®ÉYõXå~M¡¦©úRª>¯ˆÓÕXåÇ¡1ò,i+ÉwÒI2D!»,?¨ôUm—ß•ßU½–ú)º*?köøn Œ ö¢©éSU^IÞGvMúX:ðBLV?¨)Ý#«-mñËïtwòTJÞ8{C—òòXÐ×-•öŸ;Ñíòäxâ=÷x—A¼çØîÔ9o:¬`Ô¼„¿BÚš¯Û^X†£ K´‡ §è¢)S`õ3ް¼±FØÖÙ$gSx$];ƒÚð}áçüéyùy“³Ë—]É ×‡×™7™» ‹Ù‘©–é–Ù¦ïÍFó+ãe|¡½‰Ð–újé®ïn˜i²ä7²™Z¹ÃL#Èdq„ð…½à:_’Tº­ôž;ÜÕµøQéÞ¢,ûG‡Ýù³#Î{¡è]Ñž’$ª2ÝÕ¾Ar×tMj¸ªC­–U›í­;!^ˆG»dU½!-í)}òËÿo/‰þÅrõNÞ̯ ‘¢Ñü˜ª­’Fuãó™-ÌhÖÂ}áÖÒ·éþâûã|kz_Ë4fº£¼üó.ÕŸëÍo½ãu£Œ ¹.i'é-]+¯£*TžS-ñ¹ë›æÇøÔVg«‹4W²3’ JÒõ€á¡©ü­¬±bš,^}Y«tÈž,¢)Ê/ ÿМ÷ð¹ð³º@^"±HšHNJ¥QҳʇrÈ(~V];1yö.â‰{Dªè>îÊ‹+îö¸ß€Áê¢ÞÏ˞%žö‹s‘«…ã¼À°1¶xÀÎ:þŒÅ;XM9ò†ŠìxYáMc–©†%ÒÜ [NѦ%º¹zc^Ç‚ï –\Ék\°PëP½!?ÐÖ“À¸ðÃ|¶\1Ï2Ï5w6>2l7kLãŒ_,s—+ÂZ£UÉâsã¨ìNºÖ…µ–[ÒŠÛl'*áíI%mËBJ:{A¾“·siqÉŲÁt›iOØJødAt>qŸs…™³'?ÏÛ]ÃP£_óðÖ]âG5Ý‘ðÕ«Ú°]h†4Mª–Äõð¯í-KI¸ïw4ïÈá_°†”‘ù¬]È$Û«ƒ®)– Çô<\ßçTØeZŠrþ×oÿý¯aÐ&ÉÙQIwÙ=‰KYÇç‘2Ôg‡J§hë÷X³[=ÃǬþ,¿'µH&üVJÈ·(š«˲TɲµòiŠ4ýü®©ª¨ÖÈw»ÌJÕNŸœ@DÓÅg¯ªº4^f—Ì–MmÜ$€mþaò[ï9çT;´®4lޏÝõ½»v>íª/šç)sjí·ìWœÏ\7=µ9’¿Æ=µ7–Gˆ[4âæBÓkÃ\ã÷ú™ìgá97 ®e|U×´L7—Yç`TêgÛng¸PЭð'TZpØ´iÍ3ê¿X÷Áû‘zhÑq£ý­c°%ÈúÂmeynYå’U¥©õsüôe]NÈÈ ì> 3[›qbœ]ÁMv˜¼>¸ Øo‘*˜åÿNÇ_¯óõ±ÐDÉrÙNÙXY}IMÅ¿sÁÕ|7(4|gûLõçU_•Z¥)VÕQŽõ”î”Úc¯Tí_å+”§9òymµT¯š¤òõëä»ÍQ(ã3_=Cá ;éªê~ílé>àÙ¢ÓJœnç·M¨$|çôñœô0^‡w¾ë;Ïs÷q×vÕâ)Æ*h/sm¸îRÚâÐb§ö;«?Qò¥•ÞV"o«Ø§iS'%¨]doq_Ɇ²¤²Þ # lÏcŸÜµÖ7HXÁå¹;b¬§³Æ.Ýîj,¨]g4x”—_s ¿k 0˜×((UÚOuIËï¨zªNiÖùÖð!ügûUÒÜP|R=ñY#O”III/JÊÕ=eýä‹4§•‰Š©êúšçÊõêʪù+ymŸþãý~ð·«Ï·«÷ó\^ºz;j"ãAü**ÙÝòÆ¢ÞôCïe·¬¾Çد‰ A~ÏwÎ b±ýÿqö`mmÝÚh’Áݡԅº·Ô¨ÑRêîN[¨lªX)îq·•,·$@ÝÝÝu×ew×ÝB»å|çœ{ïçó°²²$@Þ9ÆsÈ;^Ú L›°h2˜ÞB¥³.¬ƒõ­4GÊ ãW¤ƒr‡ÉG€žîVJ/¯oˆÓæ¨Èõº&†Cj‘2J*µ— Kî½îW1DšQÑ¡BT1³4:?½äxiUÉ­âoe¥Ò g¿KƒåR\ßH¡j/ ‘oR0ª ¿²ðò3su<Àà7̼Q˜®jÃMmé ή\—äJ¦8ê-ëï׎AäÜòJóZ·ò K_æÆSpýĸ¹Fð¯©?c°Ýú}G˜z¥O@‹`ñNÿ‘"ï5acü¯…jcK $å!½Ù‡lìÿ…x‰z°/ø<þË øœˆ¬†ç›x°dnÉþ‘óRõ¹ÞÝ^ ²xtƒ­”d‰šaãâÿÿˆÿ7ËâçæB|áb¨p«8Í=×ã­pµ¤ƒ/ä7JlÌ¿Oû.‚tA ÿž ^0F¸z#ðK$ûE…2ñp÷\±ÚãTô±„À¸€È~‘HÂŽ5>ªOrgF¯eŠdÿ’ÓIKé^Ëçù`ÿB¥âlÅØŸHœõš "–»ðýHŠÃ+ñp”í9é$U¸ Á_ø=ÛrãLeV‘ªpO™ ¤·¶—iQ)[p¡$K/) Ñ\ס«Ó4µ‡º‡R+3ȤÊxÙûÒ¥%wË6W¬/÷¯X_Pzº rÍâÕWÑé- + ó¤¿).ÊÞ•J·¨q}ž^¤óµ ¬WõãAv\OUf…—4NEéwYK˜MOè!1?A·æj˜Ù\[º<;Æ^ùXgÀ÷GÎ÷8+XZï…#Æáé¨çÄe-V¡`Ç*OŸ2´1óÍ[ìÓ¶åå;ÓÑ"ßt·~-|y¼‡¢%P¿Qh+¸Eï^Ú­É Ëª–×Ô4yâAÁVqž¿oëäv†PMbKëé’«}:EÁ–éx[l#Ùœ ©ócŒú¿æ¨ÕçµóäçkídƒZþ‚Â."Ñá,‘ ôdvA#$þD´R4I0E ‚h¨ô^X  7 “ìн½`a)½U‘:¥õ`¡¾o[ãΊGÞ-„_ÂöZ éÍv¥mqÁ.Gc-ˆYÄn$iÝ?ÆÖ`'Ð<û]kí4ÒnEnq«'p,>ŒêÎ0t0µÕØI©•wS4°Æ¦ä"}¤ôtYCS‘¾‡ÞÛÐEÙH»^³W{Z}]Q¤ýSqJÙI¾¹"Nº®¼¾4¥üNiaIXQpquöÆÌë«;d;rÞæ,.¬_á/ßêšöJ[IÿÔ®ƒ;Ú_š?˜!ÞÖ3ö#&…¡‹Ü^^_vÛPß<Þ:ø<“È«t:ÜîM$ÏN™|6æ›ìOâ‘[Ss^ø4)—V².zõÌ^¦N@ù•÷ˆû˪²õ‰ÚÓFÙ‚d»ßu á·ꯧ;¿ïßsëáÙFâ~¢åÛæ[b4BIâÍ>{ù Æo´=7ÚúÍX6Yh›j–}€Ÿ–M<¤Ûf–£çì3­D“¾u½Zþod½ä_›Þ¼½Ù^H/Ã`ˆÝT"ƒ3eôP"é¢)-‹)“[ÒLù@‘Zú;È›(„ý 5O M̘a¦©¾z˜N«>¤è§º¥ê®hV±¯„+Q1¼<¯ìÏ’”Âf9Â\ÕŠqÙM‹A$EÍÈÇ)ôŠbiï OÀÈ*Rä˜:kHÅHí¬ÙlŽC§hÓ€Mx |¡¦•ÎÝò »Ž ÁŽ1Kœ6r*KD݉Ó$›u'4&MYñ8µ¦-Å GCUs ñ•ÔXvlsúUò9< ÎRdÀg1«¯.O ˆl­˜s>ò:oÔœ:û ÷¿ÖàœЏC“Ö_µ”õ»[Ïê‹ÿ€A GÉ–Ò–h;ûûE4¹lˆ×yS‚’TfÝ6ìnGFí úÿŠ÷ψøOùöÌ©KAÎêoü2Å?Å¿-<Ý=ž‚„—İ{á-7_!ÝÛ$û„¿‹Š> ü ‹èÑ.¨XH‹{OíÕ¶3á›6ÅôJÕQ³S÷y[ðŠ¼‹uµë°Ödg"Þm…Ì<Ã3ÓV‡üµ%Ö Í´W"ðK3PmÖjÃjcO¢™BÚñ~ìò^ƾ'7ÓA¶Ï¶ùÈfíWÅ=“^3O.”¨›–†Ù:ÛÞ™æ˜~7 7G·ê)M‰*O×\ZU­*‚Ë>–ŠÊزu¥ƒJë—](ðÏõÍŒËè³jFviáJÙ']}SC›^Ÿ¬²ª3å £]+6Ê@.œz§‚•ß­XZ±J~ܺÏðÆÐYÑ­¼Ÿú¹^@]ÅR­Iöë ŽÚ)P1œcÍG—o+W.³7ÊÉH˜ð’wqicÓS8’¸FH¨n=¥E=‘M®©‰-zb›™0 f\hwQ®hðÁ,â71‡ížï#c‚š„ÖÔ O~ØvËèã ¡MGÛ/¯Êx*(€|Ý»»ç¯ødÛkÛl)·"6]òÑæ|ʈݶ¡swóú6ÿæ?5ø_gÿ5íŸïä ¯­#`q˜2$|øˆê>¨DŸ¡#ÐXQ„ûjÉ9QŒ˜Í†2…å"­°•p°£(^È¡ÂEâÒÆ :´Z8gôw2¨é›‡7<(;Ì£ã ܹ ±œ6‡'ŽcCìgµ{5K3(,#Ôç,Ùú[Öö¶$d–í¦5ßÏçaÆQXÖŽð±ß ¹ol[ —ÂdÛOêgV‡>Äœ¯Þ[_f)¶Èó /Íë7×bÃWãkÀÑN“¤»¨ûj0)¿Èû(O—7.‹)Ý_¬(ÚP”[Ø»(=#.«gÆ‹Ì Yç •/T4éÕBÝtÃJó*9ÜÔ<\©ÀëU©Úe–•¦Á¦D»—å›% EÇï•x¾Zž[7Ñ¿3SÉ-dgú­s {ÑØƒÿî9z ÎuîU蟖&íÑ¿wSãwë:Kµ%–hípÏ/_ÑÓ"´·Ýä¢%³>Êúµ ¬ß-R^ûÍÇI2ÝöðÕIzíû&¾«„ošã!ò±­úÜQÎ$%ÖžX† Jƒ–Èvd®4ç[(ãuù˜….ôþyŽÏ³í5ÐL5×ÞýßÇ|€¯;X÷Y. òÊþ«»Aí•›iöF¼Þü™|À˜ËO¦‹|D=%<á aw(ÚÅ;!T ÄY¢¦ÂçDpоŠô’µGMFÅb"|Y{uhJ¤£ÞîмM×öóß¶ŽƒÆ|ó:x¨@þÀæ¡–޶‹Rª¸¥¬lò öD ­î€|ƒ#†Ž Ÿd3”%.çÑß Q–Lb°G˜»ìDäOk¶©›Í®Ý`°Ë4¥¦]-]mhf ýißj5ºÝú> Ûµ!HÿRÓ^'P‰rùñе%%%Þ%¦òÜy®$³EfÇ,÷åª}«cJÊ_ËVHùsuÍwÍe®r¶¢ÂM‘S‘$ûª8§e@ïÌHl°e1ñHÅTA0˜@7FÓWëwÙ>®ûÌ.b)ÓÁÑÎQ3>F[à›‰Öœ?i_ؠ׌‘}›¶ò›À+­ñöHƒIóA<¢¦¦Dðú.øÔ+oâQ ³¡, XrÌ}ƒ§)œ÷+Þ0¦NþÎ —yoæ…׸3èó†ø955oÀ;°c€O¾Ä<Ó2$?nÖ‡°ý^55½tglÛmKŒôCÔÿïš^w~ð¨º/Gí˜,Xñ·ßÇVwÄ¿nÛ„WŃZÈCÒY,y.,ö ¸‹Aû„íÝ<$ýEÛ€½¶£éõ‘¶Ìt>!,/Ïè\®/Ni%9ÑK]¯Ô#ß»ë d't·yÙÎb#Œ·U=Ì¥DµåšÁÏÑ]Ê;Rº¤ 1ŽÑÚÌaÚÍö¹ÄZûuÊqf#k=D4Ä>c6ü±å$r‹ÒmÙÛ´ ¾®{§ýb­ÏÖ:TEÆÒ/ö©öû–zÆ«úN ëm“Ê[f¶ ûU\Ñ­|»¼½l§,QþQÑËša½d¯gýD5f¢é5vÌÖ¨¬lkhe¿E&3XÒùOeØa¦ûŽÞµï±“™ÛŽþ®ùâÄL÷Ô©¯׃0µÕÜ2k(ZDÂgõ On"o ð\äz6­w[ Å„¨Î«Ãü†h… …ãz5n?ë’6N,ð÷Œe}˜Žôf&½|mðï×BOrÍ‘Kõ°%Õÿ„y /IÌïÊÐîÊoþ sï8öÏ=<Êß=ˆ„“$íE!—§›{c·EB¨Jpd<v_Uqbî©Æ”¶èëfïÐð‰ —{” ß¶Y1Ü?ìøÂäÒ™*ÆPÒPô,·Ãî–7ðÛFS«ÌÈØ úŒ°jÔn@{[cõ‰ŸàEÄMûl£½?ò¹"“ŸÈÖŒ€B˜ÈÞR\•²”~(Úkwh7èÓà—Ø7a}`~mùjI¶ Ò_1¼6Ö7þP<”R„Ë[I¸\)î“"çGz½’êâÙ3cKÞd&§Ÿ,Ú«ô1ă,ÌÐ]o6Ášá:9|D×Pæ”]©Ø&õÕx¨›áþöÛÖl%yý?êÇ0K,›HîA<#۲߈ÎLFo08}tÕdwZ+±s8ç„4Qô]ÕC¿-_-Hªî›»ÉÙxìÏïö9@¾ÿ”@Ú½±pˆK Hñ5§ç¼€-/ÅÐ)þWž7ð£Þ¾AR$ê/ªñžÙ öNÈëN躆³ý;,;C®&RÏ€oŠW®òÝ›Œu§{â‰òÝŠ½ÿßÏ}¯1ïX$ÿÜŒà?åÿ[Òÿ¹£¦æÐw@σ¨³û IÈ *.…" ®â öÍ%)«ËÈyˆÕž‚/!ÃcÒþˆ9áQàõÜcœß÷NJå$k ]ÔÛ: zy/²ÅžåŽìÀÍ Za>°×˜[¡s½ÖxÏúQ›Kº£ûÐ Ö$iKíCj*uûd_l|e~e[Žp{Ž®‡ƒbJ|Õ³­ëL3tmµ=•fõi«'¢A†Ãs-ýÍcÛ‡Ÿþ¸rò©6[[­œY±[6®¢Wqš9¥åªÒ? ¶ådôϼžÝ6KP±%{mö‘ÂlY™*S·ÓúöMµÂ–¦gúã–QºýŠÅ*V [b¼ggŽÞ%êã‹à?aë`¬-²)¡‡³×™§XzŠ< ØÄ¢ðLÄDï$<Ó~‘* º’ЭØî7 í¹U_ø×„k¡†PiþìþÿdÖç‹»A=×Ýzó맃<¶jÿõÂ6b9ðnü)bù/æ« ,áT±F˜'<Þv¥ä„d“O¸÷C0/¦7wb¨YPOéFµ„kj0j,ÖˆZWzjþ¿üÚ¿Èk,ÇZo¸Ð£À+ð¨ÎLia2t 9|TÐJ¸¿Ÿ_ï;Øjæ¥-ÍG^´PlGçÁ 4óf&ân¿åØ•Ýs0èWÔÑ~ õ´Ž“¾œ33¥BåŽ×ÔŒàÙNèߨÛ>WLjӛüögÙ"¬¥õCÉ4å·|µ.*>÷ã€Q©‡¶™5ÛjcÍ4)̃aoÛLl,gîgÌÑš5çT} ׬1€w×eL7¸™®ëºê¦ë6+ç‚~Ãóä÷”Å‹U9®Õϳûæ–}-}[àYxuõî¬×«ÏH»•däg¯ùV–©¯2¼SMÏaO<ë‚7BÚ 0®„µT×HU¡ †1d,fõÅ -qM"¦Ñ{‘$©Ç½¤÷á?p1—xÂ5t½q^¡Ö¤9`œŠSÉGè ,…–]O\s«jjšóÛ­ª©ø°¬{ïøørADôˆ˜Y (1ºÎ C¡¯<÷§â*¨©°“hŸ0D8IØÂÝÖ‰çûLt“{5òÍôZ2uI„mA2÷™ sv²|5ÚÝLž ÏûÿۨŹö'ƒÿ„·@p‡¿”—)8ɯÏ×0Ì6#o:t\°WðŸü›Æ|…Ÿ¶ÇõRò&w[8ý¨w˽Ö,¨Ôûc¤~yǾW&d«FŒ&¤_µ6ò²M›’Ñ€°¶Pµ,£çSËØd´ ÞÛ¥Cóe G*À°Ü;)…-f“5\7ÂÒ“žlÏDj%òcÊ&²Ý¨~Å~[âñ¶;¡·Í<=­™˜ŽC-õ¬]-½¬ éº=úk “|±®£¶F¹RO·SÉI)IOèÚ•o/oW~¡Â£âcö¸Ò`ù.ÕÅ8ULy¯|²tš|…®VY»à»á=Ø8L‹—S=©„’œÃY(í³~»ÎÛú•`×–ˆ‘\%éÇîÀaC¨©Ø0œe'rsér41ŒÞÉE¹Úr8v³]A ñ§ø(´-ý4áL÷ž"©Íp¾B[=Îõ‚ò7wMÍ3€qžÏŸAå`]V;šóyž/E‹ù!¢"‘?„@Ã%‡¼rÝ; ák¯Î“Ž2ÇÜ}ı^ˆè±ïb°®¥`ádW¢öÞe¶ h–}5öUûî?5û?Û[¼!€s©?pb»óÏð6ñ€Š¤*¾@pœ/o¨ì×|ê£IBÓkƒÓtR?PsÚpÖí`lâÐ8¯$?zÊÄV©­‰Å¶î¹‡úœLiç.z \ßó÷¼>-^öK’^Ðu+ó¡.¡›1“ë'÷2 WJ4âÂ|·’ è¼ÓD!¢­6õeÎ#[-ÛÔ^ϤïM¨öͶãdnÇŽÀþ8•[â´ç4“u;MgMá†Ö†ó&Xß]÷^·Z­¹«ix ¹ôƒ~¾Ú T¤©A‡œ™jHå%›£x-*¿WÔO^-»Q>±Â&[& .—–È´"8N öãlûZ¯˰‰¤Þñ‡ H>˜;´Ù`å¬wá/”‘ó!œödf4;Ñq‘Ëf>¢G@L´˜ØHD.Ñ—ðP|0—ë|Á¢vÃ}|Z WR–K ˆÅ ²å[JƳI.OècåúÄ/L–}ú™n@³×%d öÿô ‡‹ï¸ò~.¼‡N´O&×ãß±r|Y‚À÷ŒÏô— 3Œ±Æf|nþCŸ «Ô‰5F•»:Y{BÖÞ¼Tó@=S;Y«NVª¤dyWé3y¬R/¿QÒ©¤CEÓ™ì}yû|ï¼›eOFj÷Úi5Çp9”(‡[ØÏ×ÇcØIP‡D˜¨i`9LEŽY+‘7è¦#9ËÀ¤Ì G´óæèX,£ ð«*‘éÄ.ýTÃj]³\}ȪfÆx„¡3¸qØu¢š‹´úê^h'¢'…EÐ9»Þé[g¹ƒž¿t|M·(Mð»{_4ÌrA"í‘x{ïlîâûpùꅟŹ-–˜mmÒ2‡êPÚ2@sÛ,Gþ­!5¦–þø—î®}ý©Åku­Ý€Š¯ÚUz_ø§‚#µÏ˜Ë¼›‚Æ<‚wØæË[$fT MìUúÁÔËgÝAÊ‹®¡.8SÐ[ÉaT}ü­‘Po1\Ø}it³Åáê…aC‡µÇ É|ˆqRe¿A\ ·Ð™ l½¯g¢]nÝÝJÂ(Mébz|L££QKRªËsÓIo¤Üö˜˜G6¤ñÈQÜN‚u9±šp§. íq–†¾y—%Õ„Šô­`X[bíuÐÖ :8&YÆ{]¬ðS5­ØTÐ]jÜo#J @g⎊ ƒËÓs&”\T¦«jò/®^tÃ\IˆˆÖÌ@ئ)6FÓUE¥/¾·l½rŸbrÅë4ä„I«È›Ø[z¹ßîoßHÝA¦“éŽj‚ ¶*Í#±RB‹.¤NÒ/IùÆét-rÈ^Ô'Ùº`£A@–jå¢Óãëü$ª?ïKG€ùT@ÿ¾•/‚õrë» ŸòÌŽ  ÷A-…5^ ~óš¥ Öˆ_ L‘qࣛÌ‹¿i’` p x—­Ýá+šfÁʺ™,.ŠŠ©Ã¶ò׎îü¹¼/¼X°"˜ÀË}Ò@]¡/¯ ¨+ãí>À¼ž¼ þvÏ5¢æúÈãéYTcú=µ“†Ìï´÷í&¢)$–ÝÄU4^¢î«{µ(°y¦Û¨°“nKÝž{´YÙˆ.¶0¦ëhYǸ‰Ô]ûÑœ¦SŸx6ôz,ª’d{ýæw˜²zØäó7Ô+W5i¾ü"£2ñ VüLDq;‹vÁkÑøSò°ÍŸ·5ŽÏmðáž×štqÆÝp¾Qlxo¸¨7<×tÒE›^jIky Æ—-*=(ó‘ö“ªÃ4Õó‹Ë/)슙²ìòGÒåòÍÚ6Ê1ù RU{ÌØØP¦Þ¤[¤ô£­èš_æü®{­¥É1ÈUÅx«HÑAÇá§ð?Ñ@\ªïk9jE4!"¹ ×Zí1á¶T§O ¨sÌ "˜Ç "ôù-/OÿN3ÿƒ}gÒMÁ®žÌpf °âjÇh~ {É<÷·‚ˆ¿%} Ètd¼ºùuòçü‡AyXâ/êÙæ.ðu}o;HØ-2=8Ä`tž½G€™í)4Ö˜óE'|ÝÃïºÙ ¿:¥²ÂP"oyÞ?±þù[y¼›¼î‚3ª½ 0È-åsKf–Šd¾ª;JTã¡)SÇ)mŠ6Z¥z’þ©Â!½"Ÿú•>.{kS_4/u}Í!æ"%mîi|ª9f¸i{‰TG¸!Ê`5œ/ÿ¬éÏTšc¹;Ü~"Ùr IvE;Wýp}e¥Ün/ݺ2¡ªs/·ãt}†3;¿Ý;ê'øÀkù»¶Ê0p™Q)±æÛ/r]G*kjzWïÛha tPÔM<óo.·iÂ]!î!# >«=š eàŠe’Í>ÍݼCo]ììº͘Zß>ž»Å±—']Åm*jšÚ©QAÈ*¿¾’)u𽓍‰H™ë|l<ÞÀ£–^'ìž|wàCï/¸ÉÉkü{¡»ÐQ0A+ðxðÛù”9ÐÊÞ` »±ñd/¢›a;ª\!¬ö7TZõ‡¢C3ûyÇA½¯­8»¸cƒìH–XÆ”ž)÷€§ëYN!ûÉÈ•²qËOûŽwØ[öÏä.‘¶ï#§äÆQ(oEäÒ;O*ªŒƒeþ¸7~ }jlŽcoð|ì•uëÐ@ó6 ½qÃ4ë%›Ð–h›7‚?Ú~ ÓP«²?¶·¼40¶1ïÒèwèw輕o+jäÍ ØWE˜ê…}bOe¯ÐìêÄÞäZ9ŸpG±|Úá2i–ò?¦&t0|ÓžzÙ¦ïD¼qÕÊiBeºsøwp?ñ@;ÿ3Ú¸Ÿ \|NÌ·Ž€vAË&tæk&S^YI Þ8âœ-€ýÆ÷Éiœ ¯?ˆƒ9{ÎÚI=××gÕcÏî@c,bÏ‚yÑ¥ÙaÀf?T‹µ…@ípm2°ÜÐuþFÁ.Á*a†† µÐ h0T½ô©·Ç1mJ&¯­•ÀÌD ¡¬É2Å¢‡rö‡ò/KGÏh‰E)2Û…ìÑ7IzÜ’ØKû‡b^ù­«t‚¼¯< ô¢^¯<¬h  4®0ÁT{Ë^‡”9mg°¶ØBÝ¥:èZ¨9ìOô­ª½aZJ*ûuÛ)ÜolK½“¡&>St±–/)ïfX¿6Ñ¡Š¯©™þ«ãŽÇÎŒžÑ2CWà r,â&²oh‰cyÀq»¢øZÔPÛæ&ضª$¨Õ¡{%°YÐya}ÉtßËP_0C’êÇ…»Â˜£C ÀÊ‹šò×µ/|úyÞðýÞà Ò×~„¹AÍvÌÕ ÉÏGÊUΗz"{¿Ñû‘©4-‘T SÙ€ù Ñe`¡Yxwy‚¶¼éüXž ^ìôE ý”Ø,ø þ:†,˜/xÀo =ããi– çNÓ ¹”ÓÑ÷È©¶Ýæ&噜%+ãRæõÍIœ¸Iº×rÜú¡ìhÑYexý½½Ý¹£dÓE÷Ký‹7"Sáìòª^¯…RHás;Ù/Ÿ­¢ÝuOd3¬&{3cÆ©¤šíÚˆÄêç*†ØÚ`6kKócB†}†§`ël„m¹¹¡yˆãÈuB‹8,2[>>Ž”Q÷Цp=¸ƒuŽõ£©BÉè¥ß­”)›)ç)Üs”oTß«Uù þŒ/í,/W~T‰Àê.H÷t.9¦PkÌ ÚZø‹%ƺÄþmh{hë…ÅÀél}l”aŸf¼5ÿ@ø¢Kô_üè-ÍŠNÕ¥_'S>\õ6i\ûšvç‚ :e{Rë’Yς˞O, ¨×îZÃe0zb'Ó›ñØU/ózº D>¢§(™OpFÙÀXb~mš‚œGãÉî¸;ƒeãÇà¤zÿLÅ’·‘aö‘(‡?Ã'ŸŒÚìf ƒNÅß­sôU¦u†J•Ÿá¶:[-·ÄèiFi+”?ÊtÅK-²ÉŠE‚l£ Ò­TAŠXe€Ò 5h·éc bG¶£?Ð{x‡{e½Ê¹f !nƒïî:Ïêí«l_µ5½6nyvÙ§´?j-åµ#"®iÚd%¤‡¨:{ rŒ«îZW•áê*aîR(×i©·ØÛÃØ§ü›¢€S»=Ä Ç CµC]7[¸«î•PŽ ò^[{|.t7JÑ ™G+Q…û8ÉðÔ¯§\¸SÑòcèåð!“ôƃ¹d¬bbtÃ>1'×Ôsˆ€–uÌጌ•zBdœ@¾Lü0á:u€>ÿ›¸J¨ëd›ÇûÊ;Â;Æ#ùÞlÄϬ†FWBËE¹PŸ C|XÐ…ÔUi¹êŒwÆqÊŽ±\4F¥ÝXQú| ³GrQ²Ìs§g§q¶®in²Æ­›gEç'J¾øuéx¿ÿæ).·Î÷oý1ÐÑ«ÉÖÍ@×ÍÄHrëNäOð0’!'Xæë?g‘Dª'>­ÐTú`7±ŽD2cź )ެ&~sêLM$PÝWƒ k_ô-~nf¾m‰²t340ÐÚ[†ñšúºëVÔbµEÁ aR{ZÙX‘'ï+]\á¿Æ½¬¥f¸t¤l•ÌO™Zì—¿¤—n‚Yez¨ï®9¤Ù¦:«qÃq6Ö !_8Œý 7!0Œ™M¶À&dÝ7ßV6Ʊ œçð&çGÎ Þ/áÀ 8.³Z‹¼¬®WŽ˜µÖ °0²šýnRðÓ~®©™äiqËõ׊zˆÊÝ=÷×­Åǹn&'×òùÝ;Ú/-èy£þ²Æ@o‘šš%¿t g'g`½­?h3—4h·`þZÓ"Ǧ­£)·Ìá;ŒL{êÚŒŽ§Y¶=»R“©nö.%WèàOLàKAö úÏäwægƒáù‘‚PÁ¡­Ñ¨øP_¹^Ù_5ëÍn¡meKDv‘-¤fiÕ´Á‚L¿*w™x³ø’G¨ø¡`¤ªø×x·EâªF u6Ù;k—¿mç?¤jõƇòâ¶²£Ž+䯓?üñòc™ýL(ÈëODxÆp¢DÈcÝÑLì a$ëá>d"]<|C)wfs0²ÈÉÈ;4Üæ‰\³þ°v0_Õ×Ò­ǯÁü飹d+²c–æ‘ÖRÓ!MÀuYõEýÄhéqc7iéƒÂ= òTsl¥Öt+aé­çäË´½ðEĪ)C'…;Wõ¥RèWØhÛ2=ÏzÕbN"‚™¼ö bë@©B»¸iBRŠz¦\œk?U.²õ¿ðµ]›J~yÖ#ÿÎJ4 .-RÅùM¹7¹¦f†ü«ØúK€h‡\Axߥүò‡+±ò›3Þ…»Æ9vÞ/)ü”·bM¹üN¡ãëïã(àfsîì\t²ˆJc»³Vv 7­“ÔNI*älЙâå.ÿ åÉÁ*®èdM…Wv¨šéØAãrènzda_ä»=M5Qœñvk0!¼£¤¿ð7Ê 5õ‚vŠŽ vz›ãÖu_Õ‚Ù½ÖÏgä,{:Ñßä°ÒÝ`Ú³Çé?ÑŽ0îOfVÄyp•l5ý‚L¥OŸmg²õĺÁID1CbCÈ×DlVF?¢¿±Œ†‘:V;’ók‰ï!ž#mR[OkKcŒyº%}ïµ´<± ·ë‘Ù¦o†}Ö$$ÒøTŸªoQq¿¬ì q¤YŒî&TÚ)SÆ/?X6°<ÁFT©d·TÚ#åÃÕ“è­Ö@bq%Fˆ÷ÄÔÊ.aåS.—Œ+³æFkpøuAÏ Ü¿úpH tL8Ñ=Ïç«×ƒ¨×a·€|/_«d ÿâ3ê$ÚÆ[(l+¸=`ø¯gÿ?WÆ‹2|ùïû[Òÿ9S%X ð‡ž-ÙîÌsLsÖ¯|ê àZâºdSC[Äl…W!ixUS2«ñ³Tn;˜M¢Èª?3ŠI¢ÑZº¦¦Â¦€†ŸìHG& |Ž$~'‡ ù/_ì©s«0çw'(ÕuY\>®|.˜±¡*ò½õRz[ ï–ïÓÒ;@ìí#÷÷ó+~ÓwÍ×åÏsl³íž4T8.òUÊ“â†öA™šÕMè­Ôwb6Œ-pœb½Ùkt0žÂ=c/2}¨oØ", ¹OpÄ"b+R‚îA¾= §¾‹jH’Ì=º¬3g/©H1ÚÀ>©o;“p‚½Ÿm±µ5¼Ñ¾60m²%ÃñV‘åªvŽzXM›uºÆNºÝýmÃxv€ªBE(ÚÉ£ŒñÖC+ƒ½¤j(wÊògt–óè%ò„sGe=Ƈ¼À´qÌåæR…U«ÖÈ·ÚÛfÍ7õ®üî¸SÈê*»”¸{ºž{ó2=^[ZukU÷\ÿµŸ{½êŽñÿà?äù@Mê{ÄMêj-kÏÇŠ†ûíö[ä>h‹"þ¾ ’»ßq´!¿¢¨±ÎÖ® ¢F>w[»lz‰Hœ·æípo¤ µ3ËÙú¦±+¡ÄB\G$0SËRòÍö z.HáÙ2Á~"}o@,XÍŸ&xÁû}I'Óç\èœåp9†pç%§“FyØ/Ù×ù’õsÁ·è÷î ðï»Ívîü6Háëvê%¬fDØ×ü ðv}¾L ˜üv2¶¬üƒq ÚÖÆ!†f¦qgè3Ô#úÈž~@ßà±öQì,%¤ìÀÃ7™>BM&|ñ6Dê>9€L£åÔjL`ylа’†J¥ÖøÞö¶‚l¯·¶±Ø)ô¢å¦=½i1XZÄÕeîfcé¥û¨ñÒ¬Wô Mž¦\c_íN9WÑY9@eQl–é4» _ 3lJl$ìAW9º:³œcœ_ØýIUýꪪîÄ~l²cªc°kWõ¢èÒá!ÚþÀFª¸Ècõ{LJzhÝq;(©Ç)à_ù ëj·Ÿxóï±ÂWÿ_-+ÎÍ:äs V@¢«Å½jjúð‹€¿­ö¾šš®Ð@Ñ´ºýcüüu‚L Ó[ˆï¹ ;ß~á¸ÎU³\1Ž>•%Ž K:ôÛï^äQê>tärêÅ –i†ä}ü‚Ù'W2é‹LÀxT[lS0Ua %g!\°z*|*Ü çŸä|•p“ÃF/®ìãúîxJ­æ·™xò qŸ 'ØÄòÍE#DêžÍºJNIáiÉKÈ*†¼{øßðànpËóÄEŽÎ‹Ft OZ8GUá·7ñ]ü YÜÊ»ú¹h/2Œ•°»‰~hcê=VIL  5ƒ©&—“ƒ°­@ã ‰2Ëû,º%õ”)ci2‡Ø†-@MöNÄ*‚%·c¿£ýá[ðvÛä6m§t,ð`+ú×D!ÔZ⬠lUf 6½2Ì×gêž©çë¶v– ŽÆ¶¦Xm¼ìYùØÒá¥ÝåÕ€K ÔìZ€­®Ý¨{k\j{AÀ [M ¸·]¶.†Éú¾äYz±¢L﫺+…oÃæú LÂF6¨¡Põ„“{¶Z‡±ÔºA(X?ÿ5.ðKº›…[þóœÿÿü–â)€u§`ø/¿Û ¨ð—v?]÷,PO(‡ÂÊ‚¿¶©©Œ«L夕iεÖݽ¦;#˜ŠžûýO…8G±[è“`vàó©4Üf¢€‚¸á¬•уlBîÿ!a¡JIkè ¤ø6š{L¹aúAËÉ0<ŠÖ}ÙÌn¦ˆ6S6z>¶Ç®MÓ™Ö$½jÿQ´úòÚ÷ƒ¼õçüDzɲFs=°6%¡¡=¨d(9¢Æ] åù2ý ,xÞ…(aö¢Zü5…ŽÃîÓ¨]äKj-³ŽFÉÓD4u’ƒ©Ž 2Ñ…âl¢ã­Ãí¯ãÿõµÃ¯szþéÿ˜µ×)~},²ƒuÂ}—ÉIRŽ ç+çmçç ôK×7½æRVæ–ìC$ø&sû‚uxëztþ#ä ¸G\SGoGW³€êf£ÙøŠ|𞨜Iuª„ýüj‚z?”DxŸÃP¡Žr‘eqÅmc u7ôžôm$ÇÄ»ž²cíi &vÕBáWÁáZ^ÿ $öO„e£K$UB‹8C2Vô)8]‚‰·XÏ+¦¶;ðáä;<žŒ yÄxâ4ÚŠ¸‹ÏÄ_¨±Ôj™âQ¯°F¸“H&Éé¤'ûyNÿ èHÌ{k°%b^H%LÀ¯L,*ËFÛt¬±5SW_3SuC~Œ{š·«Vi¬ÊÚIFãáùƆAÆcºþºÝwÍ$Åü²déùþ²e‡KMÒOÒåùã<óÓ]ŠJbL„+U³‰¦“V ‘aJGpcœ ™‹Ø ú¨i¼UU%®Ú¢öÏ¡¥Aݵõ*ßô8!H†JÜOü]vNü/Ÿ‰øb»ÿ æ]ÿË;Ñ‘ù¦BÍßg?{Ê^÷î–`®ÿ•_ÚÖ΂³ÐÔ0È5Êat>u­éVÒâv« .}€…®œì¸B…v õ^ÜÈÔþ€j »‡™Èîáz±³ðëÚnʯ ããazŸm/=T äc|«d»Çh¿u¾O»·"³ˆÇ´wæ¬/ËÎmg»¯Y“ Õž¹@„™ãàž…îõ˜ç%¸þÞ6ü¥üfPºpUÂcÑG·XÀ5؇ð™îäv†g€®z+|µ¼¥ëd»ißN6@^™~·‘ dOby…}0X{ï ®a+Л _Y3ò ]Œ·ÇÓçÙé\*7Œ|‡àH(vNCú¦r¶·@“,¹ ·Ü{‚e±á¹=ÂØÏÂÇcãì‘æSX0yk…‹¬íÐæ1šýª—ÊßÔ—”û+¬3‰Û†R^:AKlŽh濤ÿ/ßlíµÃøë:Hð~ò7þż ÂÏ+k·ÓëŽUVÒ®t—ÈòÃ8Ívýæ*uñ]55ÓÊ{ža<€·ÿý†+ápïØ ì,²•=thK `JD&úä>©¬_Y@Ÿ'§ÒKˆ‡ö‰Î0™âœÙÙøÀ^?}uDFÐш„ðÌ^>‚ÁnÜ®ƒ®âÃÅ}E¼ ÅŸ=›¸oòÎ÷(ä}â÷Š íõÌk™$ÞõfþÞmü-?bnšVP|º!a"Þj¾Sø<4d‡¦Ñyt*¹š&˜™ÌBê"ȰZ¦›É´!~Çï!Y/ú Z`¿immî`â[»Š{¬Œ›TË¥·V>_Ù 75l>t;ÛLFãã¨>xŠa¶¿j¸êª2A¾A*W7—G«Cä³å“¥.…GÑ‹ÒK%QyZéRk%u21L(c¥­ìkkêU¡CzÊ*ÓÌ\í˜~;Qß6K­¸k?bŸÍdU­Y{±ò"“ÀÔÔrm+›ÎÈPŸùQÐM`ä ÅÐ×u:°>ë!,¸Q'ÉäßèCWþõ¬ñrþO©è+¿ß¿0þï’þóºàºO]5Ä5ÍQåZP¾XF•N§ócDg±7ÙHê8 ²'¨­ Rn[È>`B@;×…ÛÁa Ó©Ó­g^Õ u%có¹'¬™ýèÚÇØÑš* [l-Ä’¿;E ‹p†ÉÃNöŽ÷i¼Ã+Éw¦ÿFÑ~¿7Á»¼=ü˜Ïo÷)¢¤&þ˜äXêDm¨]æ£æRòwî2ùYHï&žc¥È»qOÆÄ^j ½‘nÄ$qn&=‰Æ˜¯ KèèTH5"Û"ÑÓÔjÐ -áx‹ÒòZöÒú™„&Æ©_Ã/Éä{¼1~3âCðBtüÐ’dÖ©úª:ªå2õÍiÝR¥½ð|ñ¬Òù‘¥ûŠ7í)ÑŠÓnšL×ãMÃ>UϪ—Wnao1KÐíê¦ÅxÙm¹§B m#ý]VO?„ºMoAƒÉµŽ GeÝê,<¿ö›Ÿ×+ `Èã=çÁ‚k  AMßsþ³µßÖ]l–+LtëUÇF!øéQý…Õ/<{Ô½6þר=ßCPíLz =þÇñó3þÚꫤ®ïô9Ó¦ÅPÓÕL–u5¹M´*Ýúìº|öššÝŽ+Ü$ò;º¦¹ ®ó^A_g|˜÷ôc¤š´ ¨?::°¼¡r»ÂQŽ¡ ÓÛNù Cÿ®ªY½›w='‘¸µöm”ù=¢Køü€ ð~!hxjÐ~w›GiäÍPOŸ[¦0Èkhë™»V=Ò•Rþ®J'IJÖÍp¹›ÀÌG»2åôSP¿qÅÜW“'ð^ÄH¦w“ás÷ÀbÝÇ 2€µÑ†‹ K©cÄ9<XñQL:ûO;ž ü )Š„Œk˜€16u2”Ú‹‡k™ø4¢q¾ÖVÕöÑæ\Ý|Í3¥ôÏ:¯œª&?_ž'»#{S²£¨I¡¡"©$=÷æêá}‘ÖB§µgËí-S6ttù2~ÖPP¹¸ÏrÚê@Š-ó´§·Uû”×íqÈ8Ⱦ‘ñ¿Æãµ¡@¢y¼~ü·PVÝs÷¯ßæ±zèìu¦ÒrOT]”wu2Y,Ø,:â¨Cs{æW3þ¶Ë!Nx„¿œ/åQ?ÏÕÿñ\¯ý¶W¥TE`{*Jç6_x,NMmÜÖôÛwY¶B©úù7š }¾•Ìb:±ã¹ÉtÕ3ETµŽ>L? Ëñãí1w˜Ž²7F–ÔDìn/Þ*¸.’…ñº ¿ìn ®Ž<Ñ/Â;ü‘Ÿ=´"äªï)ßž!#Žùòù!Ëý"5Éhcû0S ¹†3‡© Õ+¤‚½À ¹ ¯¾6 IÅR—­/àC«br9+ëÅÑ\7ƒ=ÃäpIŽÎ¬'ÝœHà Ñ"i̹Ñ8ùymkm÷¡³˜FÖ²›CÄ’Ïq-1†L#bLŽÙ°S¸ÙŸ²Ü…ßk–«îjVh¯ÉEò›e²ù¥Í âóåõÈßxñbËëåÏÌMY=/=bõúuE=ÌÚ›*pt1xëigÙcí;s"»ŽCjêñj½ú \¢ŸcŠb[°­pÕÚeUéÕå•÷×Þª®µØRøzÀ¦ðŽßŽ__,šây´b{ê*ãssýÚ˜gS¨þ/dk½2ÜÆzü5kº 7ü»îçq£{[¯P±¿h6¨é®©éûK3üuÏ?¯›«R*M•Ýœ³M5DgéÅ”fýgµ_”êP÷Ñnqžeó?„Ó‚ï‘óØWÌú,{™%©Vh/â<ÖA¸)Þw–½ ü¦ª¿ØÖDÇŒY57ü²ozÃè˜ûâ¡ÛCÓ}®Ž …·Š™i§ƒï‡hCo…ŽÈ ;ÒêhóÒÐ_Ð]+¿sgíÇõNól×;NHzPYÔ ê5÷ƒ‹gÃi#¹Ù€|LóèFtǧƒÝE¿gl Â‡ ´ôR滓³g€ý¤Á³°wô VÃÎdÍôBl6Dý Ã™I´'ð)öÙÈ"ó½¦md"‰´?[™~SÝ}zÈŸ—½nÊÌ¥§ gÖϹ•¯j#Û““òyáîE;J%úïÕ£ÊüÖ„—õ<^Ÿ +”3ågä=eç4ѺÝÈF¦'âg<©[râKA¿•%zL}ÛzÉ™PYR5Ãyˆü†o§çV·ù õÒ;“gäk$îîé±.×ÙÉP±»è[ö^¼þ¤²ÅÇŧn¬žòýç ð‘Cõ  ‚X7h‡o‚Í ?ÜÿýDý¬ó¤‹cÕlëJ 3Y?*tâànþ­FµOê¾näDYCà™;é(îŽ-wÒ{•–ƒ,ñ¦Ôd´§m 6–Â%ø|XÜ2¦$ÔÝq’~ìÿ sü'Š÷ùˆÅ}zì —…ŒXQy Ò7òv`jØÐ@WX›È·‘="{õî ¯ËÝ·zQÕ ö!ÝW7ÂÔ^câb~ì2ZK±Lnã5+©«žùF¤ÐoɆÌe¶‰CëŒwˆ¹aŽŽ\,Ó"‰eäuzƒ²b¶;׃éKÄÐÙ‰ô`Õ §…äXf!àI ©§9šf{mµÃnú«æ—ð+,¿jlmmljŠ7—6y«ä!Ò&e=‹#ŠŠò¾ U.P@ò;W¯ŒC /ŠXv%¿…qrqdWpY¹°$2Û?ã@Ö‰5Ý Gçã¹Ê’à Îo{fýÎBG$ú)f ¿`%d­-¨¦³ë3wб“%ýš”VÛæ ÒèÞ“¯¨=„ynwû¤;¶×0añöæ;ë|sÿ {_ Xè¾÷xíøþJA tV0$.r{ 2)¢ ‘PWQºè” úg½þóZ¬zUu[Ç òª+ÚÑ‘JxÒ¼{£UÍ»ÎÔ ˆ{í¤œk¨³{ò…(.†ÚÀ¦3èPâ væ³õȹèEv23+È«Áí¦ “ê­, þî~ÝwEh^tq3U£Yg[¬kÔ+êU¤%"9‚)‰âëãh „G¶‹D£Ö/ê¤ 3GCØ.Ôu\i[Û ª«åš #ÈïìIáV±˜Œ•N=öy¼ó ë‘ó©3š‹rz±O¨ À€: OźIŒ‘°'¸›ÅÊŽQâ£É^ܦ/©¢*i .EvƒÎ(zËgkÛr[ªáŒÚÏÁ¶ÖïÖѹî½4W:Qz½üCÙ¢2]a§œãÙdzñˆòuÅ­Ò­I54Öï-^x,-9}ÄÊ-KŽk×Ú'«[”¬O½ºâxªqé¶e£—KVtO{ K,•Xnx\:’ù]_fï…Iì±\—¬rR^í·Þ´¨3ÓÅ1š„ùüÍT{¼v=½C°YXOPÀ_…B_ë<(µgþç±Ë3&ø§Ç¥öüàý®ÍM â½…;EëÀ~sÉAA éÿ¶æAD¾ê¼ë#ÑÙYÞk~‹7r½aÖí'î®EN¥£¯c“î<'-^B•‘QLôObеÔ:ŠzGGk¨QÔFä¿ÂgIö4ñ+^´µîÝCçGL _p.¤ºãèfs£®†!á]"^üξ*ŠlkWr$ˆŠ³bÄ æ€1 ˆŠ‚’i:çîêœCåê˜uÔ1gsÎ9‡1Ê;23×™{ç¾÷þÿ¬%U]œ*\ýÕÞgŸ¾ù°¥3tRDR«î1­:…\‹øµô>µ!>þ  þôÖ×ÖÃv›üéhˆºy±5ãoñ=ød¦5YŒ×’)ÈN|QŸÝ–P­äÔW›+LûM-û¨K'(ÒŒI­,ëÏðô«U*Ú¥ên/]¨6J—­Ÿ¨+€R%Ï!™ ‘ò%îPˆÂÄLóc3ØiÌ@fÓÅü\ëUůœZÉØÀƒ«»—fsFhœô9J®h4ó^eÛUk`nX©oÉÖÚyëÇÄ®·JQÀ)<²†Mß/Š‘u®ËÒÖÎSÂæƒ‘÷•“òSj_ÍIÇVûj|%"BªìBgöŸÕEßq“¦CϵM6W¸Çr\ ×—×2Rÿ•½ö}Vcc PÏùýx3(,2±é¬±1¬éøÕ=Û=ËÝ×—ôÇšôXŠ Î´õ‘»ÿÐóEv§Í×1™º…ÝGÚE”¯R(X)klt·]¦<ñ™hñ|…Ÿ¹,´?»˜oŒ±4·¶”)ù÷áu ó:†õR—…ôÜï[ÕòDàGßbÿPÀÎû.`Qhß”úÔºD$²EÄüßÈôдá>S,‘±1ñ¡£²m[56Û2 A9°%°–È0AiÍ6Û9JAÔbµp""C=Ñ·x‡k±ô RA؉¤Ø‡GãíÐΈÁ:Ìf’* )Ö;æmÖãV úÐ0>y‚~ź¡QV/mži®‘¦~,ï+vӥȊ”-•_´4Ù|! dØn’žez‚®7‹+R«c~´Óô;Ì£ 3Æ­ò×tÞ#©V¸WÚC¿Ö*QŽã¬Nê(-\›»Áw]DùÛÂ-¥Ñ†ÕÓ Çn˜Rx´üÓÚ¾E³U\ù;ÍòõË„µ6ÖUÞóVÂIŽ´mƒ—› ‰ ®èCí·Ó´º«j7}k)AÚâðŸÑldÊÀL Z> »ˆÎCcàÓ–Bó`«›åªö­)ÍTnÌ5³–XˆgãÝ0Ô –Ëú‡†^ÖÇê£Ò=â%_ÝEñ:iºÒ =€fò‰£$¯k*höªŽU*C«¦V}­i˸N«/›¿ñE¹SÚ¨µã‚uü]î#Ú ü"íÁëÊ·ª˜šËØž5a5—+Ûn¬XÛeÝöõS×”UT³VXï v2Ön4ÖÔÒÞ±ïñcùw¥|ý+‰ú ·L×hÙ×Ér&9_`É2®è“d”e59Ç6ßɵ·°Ï–G9,pÜ„+Èks ‹VlþCž`ùý,.´ox×&+ï¤WˆË‡òÌ÷ xOh¾îùMÖý;A÷Œð¬ñP{ú¯xN¬wl"žáñ–V`" ÌãlG„»Z®'À]Óðt$™¨#^Q¤‘ˆÁ.†ë,7°.p3<· W¬îˆ_{Ì-ÈÓÝÍÇ[͓㑘ï{$âr‚±Ë¶”óÈÐä˜/ƒn Œ_å6ûF·5ë¿òOÚŸØOÚ×Û–ïÉ)¶H2ŽPS­ f1Z3Ñ1ø!<ìÎÂÉÄü9^H€¿<Ôæ,Ff"t¬Ú qGqëUë=ý)# ÖXFš?h×è§O áÖ–Z\Š´³øZÒÌÃÕ¾æDëQÍÀží¯Ë;h‰ ›‰Îk T eðvðºŠbßšðªJúéÚUUW*ÛU“ï9ýù9ò/ºFõá;F¥d•¤Z¶•o4czUm¡óžÈvŸ²o弚hFuõ7nü€¼Ÿ¶ž_‚rŠG”ã<ßx±ê%ëÄ^y³xJé2S.–‚¹«%ê+ ë¤ë@0òá$ {’#p2`ZVRõ†8è©©Oíã³e'ÚÝ÷1°V[£gôñݘײ¡Õ†ðĨ܏¬èþ!k2½.p¯¢Õ“J‘'c®ºo;Gˆ‘¡X°í”mÕœ¤¨×À^hekKpÿ‚‡C©£¶KÔb2`ÈñÅÏ£Çñ«Äf|n%îà™`_6/²î2ç/ªgNZ)2í…t´ÚÐj”C ‰~Ä>ô”e›‘¦¿ Â´-^s~¼pªv” W{)&Èû©/¨‚€»“u†õ¹fliÇÒUePEŸÚ:q¾F§/«’ÐøŠêdÖHÉáGº™=¾öã c)ÿ¼â!`©y&a —-Ä_Ä›D‹["7CâÑŠóMh®úVÜ«ª³,[=YzÃ"Õ*BÆ}h¼juÁ$ÿp%c©¾uœ?绕žh눱ž³b šÑiÊo5}L/v»úÀþÀÖ« çvXBtÁ˜BäÇõ¿ž o¶:`xÞ}Ÿ^yÚèööe{áà\ößkLÿïSÀ•ãvuÔ~Ú–O­¤¤T„í&ÑʪXUÄUd‘a#\*}=adÑvõ#x‡r)²]N³X›†×š#EÛ}º„Ý UÅ܉é>1öVì«(s«èÀ³ ½WºÈmb_ã"‘Kzh§~˜qî‘,ë\Ótsg\NJ¨ä[¥ø ýŠÚA?‘V£¯áoX<õÝÀ¤D;r ñ ±cבW0 ´5´ÖJU<ÕØ´ÝAŒ£>b*ëNØß¢Ÿׄ׎¤åл–ÏÛ¸´ü.%ÈV½’ßU¤Ëk|V*g`µÜ*— v1¾py/TÉêišûºbËH‰Q¢—Í7r¥m8.áÅ(íSk[hgµ0Xm’7°~UN…ò0¥µ‹A©x§‰’#B”MÎeö¨Ur©Åµªþþý_X¹)o†Í(nÖLT>Dé80ï ªxÿÄæûQgHô¨;•(-Økþëo~œç4»Õ¬¸+àéùî_èvk±<¨½ÏÿºòýžŸ=&7ÉýC í·lI(Ÿ¨¥Œàmrù·Km¯pm½€Ùð'õøÊþ©~óüˆ¸˜MqâLq»bŸÇMŠØèý‹Ï¨æÏBÆ´bFU'/NVÕ`Kµœ—IKÔr[Ñ 9…¼"4`-§‘§`Ûƒª¨G:bFîÁÞÖEðL<†Z@n'o¶E䜎)à+–áVÔRcU7Ó0AMgŒæúÅŽÜ€·!ÑŽ€i¡£%ÍtW=^9Õ8Êð@Êí"\ÎCÅ ËSˆÚG¶ú ¸,Þ-|Ç\9£|9í4û2¯÷cu47,Ú©¸¡¢"nÏrÔL¾A¾Xœ% ïN$™ L{Lèƒ(’»\pFA7©ViN«Ÿ*6©Fªø*—>I¾R8ÜaÙUUP” ˜eYÐOÊÈ~ÓC…ºjTíæl!¥{cœ¾ ðòÕy­z˜û/ÆKù¤Þ)wâuÇþ¸þ׳®+’[µ‰;Úå¯Wÿz¾Õí}3û i`OwÔ« <¼=Ï}Ѹú·}Þ÷»äM~EŽéŽŸkïÌBÜ%’“í09|OÓ¯À÷ê÷#ÕûÍÅÈkM`PQZBÑ s˜j¿é›f¹õ-z<¶_„¥1êØø„òð9«Ýzy7´EŠ‹¿Ü†ß­Z݆8cN6 “æÉk­óÈ·ð9ø ,CólÇì5èià;ë3-Çà5¦,él~g™…ø§ÈöçÔ  éƒ¨³XÚÛÚ¬âþ–T8ß Ñe©rŒ ø>$FÑL¸‡e¶¹pS8Í‹e%bºL"=ËulçÇñºa3ÛJ‡ ýjÙ H%\ÊÃ^ËîZ­Þ8´ò$”Ç©egÔó&£&H0]6UòR:]ÒYÔSüH3I6BvM|CøF¦SŪ§@¤«ÄÑÊdåuýS AfÓëùjú`I?µ»š.¶KeòH¨XœaˆÂWà³­2µÖ[xÈe*’ûn©ÇêÝ\L£,ܾ¥c²c7oè°¿âìåjxˆù¤ÛN¨Â_ÿâmýsÞyÏyQP»-ÕõÔ¬éÎñÚ}üé™âI9Îùuß³gÿ}ÜhÂ<Å!q,ƘÄiªÐlÕ¶²©m±¶P['åqS =‡—«`m ¯U ^‹®ÆÎ˜¦ ê"ó M¯Ù)m¦·–ÄÇFÛc,¡€-0íqØýQhÜÞN1ÝMËBê6ášÕà›j«YG|"Æw1²ŠuvͶçÙ)r?V@ ¤C|Æ °Ë!û‘Åä!bŽ}NÛFÙ~A×›æLs³ &QÌ0Ã’ŸÁ/mѰv0à¦Éæ£F­V!Ÿ#-åGr Ùªq¢“ÌgŠYðEC„eº&ñ^Ââb®ªšV4€QP]Y5Så‰ew}¥“žâÐ[Ù#]7C+9O²^¸ð‚¦‹§ñïÚƒ Ç\è˜ÅߺÆÈ7¶´4 Û”óEi¬ƒÜ|‰FÄÎçå$ÔlžÏj±ª[4ºˆyúšÊP–¾»ÉŒÛÈC†¾‹ðõøÝßbéÎãú{tòê´Åk™Û,ßW jzjý1m¬fñŠ;5 wäð?¬ÚÏ}ªÃV;íÿ>ÀZþûxãî¹ÐÅsLòþ÷qì N­>­ ÷áä%TO-"Û!6ô5ÅÃ; K@öÌ PWhíeÜ„_$[àÏØc˜ÐÜ6l×ãÆëZ&7tìñN‡LΛùizc#æ%kÙ>lxÜåhß3} á÷mwu¡µæ1ºÈÖßEH¨ûà®¶u°ÓÉÍT»˜P“ƒÑ3Ʊ–·øô’L>#ßËmÙ…š·F_âÉä`l¯e¤~²áÂ-ýŒ·Ð³èYÐINƒ´Cy¦Sª8å;E½6L°ÌU^5ÍDnIn‰jEc•%ü‚µ»âžðSIç ç*ÍE/¥m µ²NÐAF§·ìŒ~*œ¯ ÝÖ=SŒÔÜ•·`Ê*7°3VÑã™öšš\f¹x²Ð«&³úc4g;ŒæÎ¸(xÇ;ÊÆ„·Ä›Äíå›5bë(ÃÑC~¾°H/$!¬w¬aN±u'µ±*sä‡iï’Ø3æ™ßÖÙu¿=‰Ï:gÅ ‰™PÚbk0áæ÷‡¤²½wúçyNø›­Ýùÿ[Šÿþˆûî&ÍŸ˜ûwïc_ tûod)5“ZkßNpð@[#ð{GSåÔ@5‰ä£$q„ˆ™0núY¸µÕ”ê4æ7Æõ€%•1¸ý°ð5{BNregE·•{ö4àB뢺 ö·”»]ähp4ØÚcjb¼}?Ö›H°ûDwœNíµGÙwØvÙ0,¬æ7)7[(ù’¸F¦€7¬ÈF#&ÃÙH+ä0œƒ/µ’p”a—ù 9Yo´Ôê{Ë«—(ÉK†‰_ ÷j<Ghùôµ= ‘úÖÊ6ðIóUž¤@ÂãÄò¥B¹¤AÞÞlæ¯,Kœ®!Xs$ñò 2ï!¯P|I™m‚n7\—YeNÕuÍ…•§jcå˪§ÕI5™ÌV¬Œ2zk}`íƒÏ:Îp+›T›%à6 $±Ð6É4¡ŸbH®‰@{™–H»ir4`# “bûE²/yÒúU¾¨Ó¨Ôn{Æ$‡´‘„İQ)‘‰IÔÀÒ­½Z;üÚú™[~J®Mþ“Ñí¿aø¿½>Ú£Ðs½¯û„ j†Ã×9Á¶XOm?aˆÔêN AsÐHT¿~KôŸ˜´ê|Ÿ]Ù -ã´Í-áq ¦1j I[·¸DtuÔ”…·znÜ¢gÆ$Û¸aLÊñÀqÁéî4Øôä ì'd ÍLîÂß™Ä%ì„ÃùSév!ù{ ¢"1=y4PZª³m*ÎC{`ó±ÛxOt\#C€7õ=¼xÚC°gß+a•q‚,XýN3QÚBB ü¾Âx9Gv”“Á9"Ú¡³¢kÍ|‹½¢œ&’ðSÄF^¾/ó*ÍãåÕ˜„.Q!¯‘$Ö)?È•Êvª»êšªg’S/±·vÑW!åu§­a˜m™CYlˆ!¥skeÕÛª¨LÊ’æŠåea%ÞesǸo׬2ÄJÑP~+hè¶B燮¶ÎÒ_7ÓžPn·z›‡{‹”L}1‰;vZx»VÏ,\«~IÀŸz­[¿‡òZ®Ý8òcÄëV‹¢ŠãCÓ‡,k÷íÿi³ýoq7MXÛ‡Šûþcxr“Åø³í9)§b©Lp-b\ ç'ùe{-,ˆµ|²öÆwš6(›^‚Aèü´Åz¹)kP¿ö7M¢·™Ãþ­ìš(Ò•ìÔ;Âì«H_*ʆb³ð; /Ø ä •E%9ZÚ߃µd(ðÈ4b›ÈíÔ</ÀÖQ'ÉÂ~fá+°|x˜õ¢u8ȃٌÖáS ‹šáÝ–†!r»|³2@öWâÉÈ—©hNÊDíùÍ_É»h¦5¯ËöæÕ ^Op4œŠN•chXÕ¯ÌÖ‚‘¦âŠº•>ÃØIKSÜŸý$m)ºÃ=Ä%Ü.¬ÒÇÉÇÑk𖱦ÊV]ËjÆqŠpjô6ŠZ£”WfÜ zŸôªL*VO¾ß~U?‘ÌýŒ¿‡”WÊO~ú¶Úœ(x¾úŽ"Ïj2=Q©FÊ8º|Ya~wEœb›q¹‚öǪ»O¾Ïo^}¥9ó¦ì¬éÛ·E72¦2¡!±K‡5Qãÿ—˜§þW;ïû;’ߤákõ•Žm·?¼°“ì§‘2d'nÀ,G\G- šÞ…jÜU—‰ ²-3spË l–qµ O(ÙoL¤-ôøj©¨àöLï!{­+œ]µ¶çvâŒØÂkt'Èòïj㢱ÄlG€ÃbWÛØ ÉÛAb Ș×à/ñÈN¸ŸFÎ%2ɸÂúÉ| m‡¾Â:~h|‰ˆ°ÖMÀÿ7ÐÐW¶Oúº#¿!ìÄ÷äÿõQ¿•†‹hÂ#üã²$|“Ñbì‰þïe oN„ä 'œ¾ŠíA_Á˜Sý˜"ë!›¯)4ìx®œš7òîP¡¨›ÀƒÄm‡¬yZÕ«ÆÀ©V˜uÀ{š¥ëțD:Ÿ‘Çé[:yÀ‹!ŸÚ¯oYØçT°±ûö:$Qro…ñÄ3b„•TM•e[µ¿ÍÚ 8¡L™7XnÂtﵚ-òbá[žœÂ02sË$O ý [r©ê•Ìš&þÀï‚~“ö¿â±¤õÆ\¢ÊÚ“u²öXaèüw"iææ;d¦×B:Vøf†“.cÃüé÷¡ M°æ52Mž;sáˆ+Cl³º®H™Ùs^vFÞµþƒfjr©€³k¥O—ÀŒ#ºœn×}d¯AÚ·úÒr¥ÿwþs|þ_ãsÝǺú¿Ìëô—óï~׿ޟkãQ€6Ÿþ]¶Ü¶åÚš‘2Â@Ð0Ÿ#ö‘7%ßËÈÛø2²Œ4“³É¶H²á¨ óA†š–c£•¾Ò£ÎÝöúfjÇz‘‘ÔuôgÒe•!lyÞ<®u,s¨)5аrøQ ÙÛ¬¶cÔp2˜¤`> >dňZ¼~ 5VëMŒ\Í#ËS7=ª‰‘uSãÆ «y­y¯eRÍQùms”e;|Û¢)ÇóÊxw™B9¯”Â\#H”v‘O’ÈÎKW¨u†ç†åº¹êÅIhÿ.'MÌªŠ«|S“I߯}ª½ ïa‰¶N7 Ó9TZÈ í× –òZ°q·kŸ¢–‹rE÷ &”Ô>(J]=!&‘ùk—*†ù´ um۱ϲ‹;líhl¾bDlÑèñ#vÌèÇoíѪ®uȰÔT[kzt oŽëFÿ6qQ¾¸ßJŸóA]}ºú8}ÞYüáÖÇãJÂñuó¿"ó?=ïSç]'üÒÿô„B`·Ç‡ÿ•1Õn³á¤„üŒ¥døIýXx 6hxP±ˆ¿"&’ãÈ9Dy™èa½oÖœ¶4Ö¼¤Ù•þºbëf§Ì¾Òb³ìl$Ó“ÑGD!¶ÈŒÃ¯ˆ$ÇvÅîíxj;aãèl²M³ùÛ{Û¤Ô1{;{‚­#‘»Èæø 8 · ðV6úÕ4&§ó†—h:A¥‚½B“äª`1.GÎ’°úA¿è+´s)Šg†2Ýk«X›ËÉãq„½ÄÉâ"þN]`: L~Œ0Vž.¯ô°ÚÌûôÊ"éÙTQ #ª¶žGÑ>”V·‘ý¦N4í0gÖæ{˜åº[Š÷ÐCÙBY3Æ a­Õ¬í…Ûøë öF£5 Æàâ Ú,¡Lø¼ÏpIÏ1À&Szƒµ0¹(é[·ƒq{¢Gönhjóý»û<§EÔ1À·*óß;ô@²)íbxðÈt|¡Ït¿Í-ún Œlî£ðòOøç1³ÞûošûŸf p=p•×qëf7áNüô³þXÉ é[É0Lªì*±¶¦yDQ¦ 窘\Av&àcð‡„•é{™Óà*¤%¼Õ4ÜKiq{F¨ñ­D[g7ׄïUàVêiß`[Lµ)–m¤c¡ÝÍænK£P¯ß`‹§løa,KêK…©½n2›Ž–“Qè]Kkø¶WA%`×Ë»¤iñ*þPV.«X™¡k¾æ µ óóƒQ¦ça±x"èxÖ›7ŸçÇ á(wpý¡í’Ý¢çê¹ÈÃXÝo¢_yyÐ+Ñv´HÉ|U>œuZ*ý ~ ²m-*¼¥a蜥PJ;¨¤ŠÝ’<Écí)ÍlU’º»Ò©¥Þ£º¨2Ác¤·òÑú“ÛÜS_íWp.dW_À­æs7ä÷oópÇÝ‘¾é‘O‚¦ûõͰGÒCz‘§µï2sú®±íãiðÇVaÁÞ~‘i¾ÞÓÁÎAë;ÕtùÖÓÿ ŽßçÅÖ«]vg‹ºŽu®¶®aÿ—™ßgþ òWŒŸ ·›"wÕ¶J€v ´ÀX*˜šB†tDEæ‚Ü–HÜÔ‡ÉYø ãqSŽ¥Ø^@Þ±¬Ä³ÐÛÄ]»?ÕÕÅUf¿‚]A®™!»ÛMÄZ¢‚:Î:nÚúØ‘‰‰Ä2›75·b'ˆtr»…ÒLÒ<–]4¼5‘®¨–(B›¾ëVNõZÖ.uIo|d*P”‡ëìÚxõNe£´J|Ep‚s=ŒÀ•ñ‚¥«åYü Ž—@"h®Ì˜ü–6ÕÊegÿ<=aæœÑÒžÊØÁI élÀ¿8ÙüûÒÊz䎜4áPÑ}ÙõÄucÖÉ6ç|Î-¯BÃXi´‹Rú®ì6´½ŸßïÞWÏ¿àÿã»ÿq¶o0b‡‘)ÈGQqXERê[Öç\_ÕYêTuÃ\_\÷êÞÕÕ•Ôy¦ÌÕìÿ óϰ¢ú¹—P{›Vy žFv#ça.‹e´Å ³Â,aÈxP ¸Yw¹|ýÆ ¥©»kzê?šfïÓk’aŠ_F‡Q«ÉTb\‰€ï1ö[¤åGe&PßœŒ­OŒ‡ÕùêgÚ[ZwÁ=­7ÚÖzÁ8T“„½3Ž5‡7L÷u7¡õŠa€Y¹•†­+{ùz€¨çDµX=I$2ªkÌ4Í¥9ô-»"LGŠl"§ÐÀÄy#¾ ú‰“òu‚rf{Z8fgs~âÜåNæúðy³ùg¸QŒW¬£LŒ³YX,û¬ÈÒUÉN(7ªF+‚.³LõaU?ÅÉA_ž'óDõmÐMk—bŽ`Ÿek¿ î¯]QÐÕrFz…íµ|÷|ªººÏ%Oš73ævûïßåÇ–½z(š°Ú{YË©«F¾±ÏY×±øÐòãó{,)ÂR>÷Ûùã{,ÿuÅØœÜsÙû ™+¿KEWóÇc‘:ëÚ×Õ“•N?×D×§{Ý—ÒE:«mû펢ÿê>ÀoF^Ùïÿ›Åñ锃z„>B=0RK˜vI« {1šé‰Y¢ë¸ÒÚÄÕcf4š{ÕE¸~F»ÛÜ@Eû¸·õâ‹â Ó#þp-X£×#$6c‡ÉD$ð &¦¼­¦rå݇Á™ ÷íò“IlÜd=Œï²à3Ö_´³Ý”íÔ<Õu¡¦QuIÜONçRF[øF—ê Ÿ/ž¬Ÿ®Z+«ïîD_UËf{q`Ø=øA µ|œàCU©ì ÆtZ^Í‹*úy®s†µÝÈg‹Ù½…o­¥¤Éž.Á/Þ—r4wý´ÓTmeWÕuµ]­Pt„ŽˆžsLÂkbLHãDÉ–Âù€Ç·„ß}„—&‘ü$“IÂxÝøÇUwà½f¯q‰u>Ÿ»>ã7Š5©+Ò‘ ›õ1iUMÁÁiiy« [Kc4)B #m,æ‘qÔvŠØ#îBª§5x7XŒ Å]÷ÐÊ3¾4¼¯ÿRï·DI¬°Fz¶ ÇZìÔ1m}÷ˆi­Bú|îrÈõÁ9_HÒîfðÄTMè†q_‹ã—·Ì1ô ° /ÿKü@ýgûgj5 p=¬ö¤‹˜„¿"iÔ6j ÀÙ‹xJÄ‚XH#ùéÄX” j¾cPÏyD5 —Ú¿ÙOÙ뉫,°ýŒ7€ê¦÷ˆÔÚÔ 6fÆ à+ßd=a”›§£[ìéÔxÜŽ}²ÐÑ›ˆ=‡Ìsô,ø&>™­[¢[¡¿€ÚïMiÝ]uбc±´A.P¾t÷…ivÈËôÐ*áþaÑq¡ø´p›@Ü#®áÏムý6-”_-:*ò®ÓÓ;«rJæ3’ØQœ%œŸ·ˆ;M²&¨³¥"•]÷ÀT†ƒ{ :ôÞØ\îYïÙà¶×Í'è䪧\?ƶ•[ù­ÑSÜÚ_ì!‡(ÃÞôa«¾˜VÒ²WÝ Á]­^èWÛ†¤†°† ‡æŽÃÜ«ü­~*دõ©ß^¿ÄZ§õÙ•6)åEïÙ&÷:Z?µdUWÝ@áËŽÏÓfÅ{Ä–uÑê‰`ù`gß{«ß3¿Çs¦ÿG¦Ô1û [iËoZTGò%&qÙ•â̧eÄg”žš`r+|¶c¤u&|ÚŽá•F†ê*vÊqÅÁq¬±o#ÜíµDŽõ>›hè ¹²øÏPÇ-½M€Ó9Õ1È6ŲÓdw6rð|b~Ý:Y¹H3 I@/ .s²6ǺÖÂÕ)ä:y˜æÈ5ÔH¢%.éL9Ĺ& É÷ùÐSÐwòWÐç+Ðã ÂDQ•à"ï›è›`$÷gŽ7ãBÍÍÚbvsöPæjž«¯ö/e•&TWÒZqÇJ°ö~Î ÜLÖ³š!L»’ñXâžFnWìµ>§ÂñkF¡é's"à¾lÄ[b"óIý<õTY‡Ç¹Íã*ÛjŒòÁîz•8O#t<3íÂf+Ÿ*ÈÕ÷æ\É‹Hp<àÙ5ºOF×Ý£:Oø2n .Þ•Ô˜^‰Ô8Ç#ç¡#¶!ØeÃ@é4Qž¢œËÝÍ Å¯×w¬ßUï×pû_:þ»„Ù‰–&[Ý¡L°±UmçÚi"«<^\ý͋ãÌaæT›ª»r•Œ¬åÜ~¤!Ò]'ë¤ÎL"•ÜxCÙâAûVýf *y.øÆå 0ažX&½ªj¦?¦1k×+BÌmäûe–Ð=úHC‡&½ç§›úD øÖorÛ€nŒ¤y‰ô뇵6F—F姇ökå·Þ/1xI@‰ÿÌ’¼¦•|í-À÷?‡ŽjGQðÏØ!<™Øf©‡÷c6ëXóBx½}ÕÛîáîÚà¼gßã¸O>ÇÖã¬;ÐO6’ cYxÁ$d8l9f2ÚR©öDt¾R ßÓg+yš‘Æãå ïµ¶Ó…^η #µŸ~§Š¡Ú¡œ.õUŽ^·a Cé ¡î ,Þů—.–tVÒtö,öJÎ'îdñKá%îr]¼êTYZq‹Ö“Ϊ½C»Y½’7²"°tZå^‹öD2J’ÀkÆëÉ2šÓºÖ@ìBÖxÀãz_/™¢ñ³ßÚb~ìË„áþÕ-¬·ƒG kܸRC[~|Æ5êì?b^BERžEµ ºQË‘qðv3…΄×#Bò`?›àœêèoǨçÖ{èÄ×þ{ '!|¨k &CmÃH¹MAõ¶Í°ñà†½âi’­f_Ð=í‚i"܉Öu4¬³ôÀÆaf O[h}dðÑK$vÅ3Ⱥòâ%‹ :”iœ¢ôƒ„…o%ïÅݹ/ÄGTþÒîhf+›3?R¨æÎ“ ‘F‰>ÒÑœJöMú¢š¹Ué•Êò;4¾´Là¯,U y<:Èr®aN§=ᮽýÔš«f+O‰¡"øz}SËmn–ûªæú%úbu¶l•4tUrãùñ·HA½Ô-Öí/\eN@ }rÁ‘>ûÂñ¹§Jûå?)ðσâô+Ù÷Y]1‚w¹Ân±!:ŽéØ®—rèÚî)9eãmIÎ-â>–Û†:ÕWUG]q:×]Ȩí̘/²åÉF¥= a°áM §6ô«Ÿó/ÜAfM÷úóõÓëoÖéæ›A_¿×-^Ç4‹1×I23»w9WÞ7$÷X\RDe§½¾%Õ÷mè?²§$|Ç`Q÷q í£/D/m¸÷燜¬쓜³Ô5lF…z€šø˜‡âKȶd2ÈCfC‰GØ>˜iý‰ó&Föá3­A ÏÂøÏ{aà1äf\ˆÃð;¢¾ ñ´‡À_`“î*Ö-T/T•¡§Íݱ“–µÀBr 0æ´>3ï1§˜^Y´†ûÆd]‚9ÑØ¨è$Á ² B°R–¨Ðé/šwˆ8!^+èÌ'ðÕ†KÅ„ä¥àûÓ3‘>•åÁí/(’8ƒ9aÜ(ž–ÍF+­–V ìB™¨Jä”Aǹ=è L']øPø«ðWåMsíE¥FºUxKî¦LÒ®7.Ó̇†©_«~}å/åmåÌ®i=¥—µc9W÷‰—B±°ù ºúßX‚,žÓ¶7?e.h>õª:SÔwCpÕ9Ú4¦…—Ï»üÖ$ó¸U½b§=Õ?&Õ^n!fÁ©šDã;ÓKÁ[õcµ„ˬ­† ª¶ .ÁvS ª¡ôÎJûóº–õíêxõ•õãÌñ?p÷DZ}ý£º#õïëÊØ!ì-ÕÏ;\h3º‹C•˜x%ru«Á¼S›Vw£—eª»‡wþЋaF·T”ÈŽÊòäÍsöû·° ±7·qXʵfMßÄ:ÇþÂiÁ%ùÅê0ì þÚÚåšóÍ:ÁNÎviÔr˜ŽÉêTQ’Ç’)úY”''„!²7Ê_k.B¥¶bç-GUýùíÿû‘¨Zw²þX}°5ê9äÕ¶ ‡µŽi–¨OÛ?0V€hMe„_ÔÃpþˆìv‘)Û{ƶ¿›¶¬±Qk/ Æ[¹ÛK[Ïê¢î×%¯[ËjUï„ßÿB.Ñ;‡ÉÈÙÔwï+p®eÛ3ñGæ(ÝRx¿áTÈ6Cî¢Öø8COýL<ÖñÄ!ræ9öÞ:†~¼CKµ Ì^Ô¡]nƒg_΂«RÐgæ°¨d¹Ž€ZÄÁÈM“ÃlÒ'˜²Ì;ÍÛtmuŸŒFõUéÍ9uWéBñ5Õá>è7ÕEiOöLaQœð%ÇÊd­äFð~b·g¯ mªêÁ¯’úÒoÐqLö œžLÏZMŸP[ÍŠ>)½ r+^Hº‹:Kb”3@ÒÈ_)—ßÏáÍã½á÷•âòS²Ÿåuò³ -tNrLøê)ë"é 1KMÐDé>ùcÎ@îDÎNV4O(ÿ¬RË^Ò”…¤}îÑ9ĘÝWyÔ>“ܶMëÔóC²'/[Y]1‹}¶jRÍXæröÎ>ƒÿ€g=š¶ÈR5€[l÷Ò´…¼ÅûKn1.In‹Öù–Oúûœ¾Ì*Ñ…'’«Y†ßqÅ» ›ùs0ßÿÜÐeÎlÓï˜D™·4<©gÕ—Õ ¨ï_ÿÛZ†êÁœè‡Ût”ß[Ô]:7tS+E¸Ú7¼@Ósô˜æ,É!]?Esƒ>\ï×ök€Aøé@=cz[yÌ­øÓ±é`GþûÈÆÓÉëäòù ¹”‚»3VÝŽxoN0õÑ~ãfëÕ|šoTb}ì{=ëR\}\ìãl+ñû2j î±±Fl)1ÃÖ p%zà(*Tßæ§ZFãÅèA,…­ -u‰H/Òi¦ÿ ±ëwÞhJ<Ô OI¼²…ü¬l²*\6™kbâ}»‡GŸÀ\ͼÏ7È·‚c2£º² zJÍjš°:ŽŽ°ùl¢v-«ª€S£¨ÚÅÝÍêJ§ä âtÉUÉ&Ù;•Kæ. WÈÖHF‹²D«%y² 2®ä®,T¹F5SY­äJy’Z¨¬P6‚äX(™+¢x}8Ã9t°¶7µymfîüÞó:V…z¹{ûºE=ë•ÙÙØfSÉ¢âƒöÏʨHaÎ`ò…‹dmÄ׸&n™à®°µˆ)¨`êKµƒµi« ºú–(–w¤*YøÐ¼ÁLS>§¯,÷G¨KœˆøÅ˜k˜ÇÄŠæºM–Ñl–­hö òì»=z&5ïš59Ž"öH‰Ïg`²½¢9ä":–íž=>÷—Òg\p˜x¯ø£àµd€Ü¬>¢¾¦5è³t;9žªV–Õé¥ß$£D¿ —«v+eR9j©6z[ÞYO9g ŸÙ¶•5ÜÔ¡õÄVË›OðÛÜyøŸ²øýØÓ™ØäS{Õs|ä?Û—ÍÆøÞmÇêÅ;–àÖé~BÇVh&XãÖµqµÜqý$uàD¿`¿Ýt|pîö»~ZÓÎüû³ÙN¦‡ïgGA¯íËäxBŠuGæÁ^–qð^ËlÒ8í½e™ñhmˆÑÁo;½¨okd6²é¼ã*pÔ‘Y²o O‚Œp#²©"ü 2‰„]øTd†q¿A¦¹+ UnÁŽ o-Çõ „i¾§~ºbùéåòhÇNî(æ…‚˜Ø:ø`§ ™Ì ­ZÐQ²–>›™ÏY/¨QâŸÙÒÝÒò¹ª_´RÉ}æJñFåÝÊù•›éE—åUÇd-!°¿-™9s{X]뇡‹ÂdQõ¡Ù1«cííc£†} žšU_Þj’{hظ®ë_E¾Ž*n¹$fx›«í*»2û®ê9*æA 2+»5Y—|¿öÌê’Ÿ^4Ê,Ø›ïš5ÕU2Qü/Ä_¤}ŸMeÛ PL#%Dž‡|37Ê5wð·˜À<ÇÔÃüt‡»ÆóAÞtÏGÆ(öÆ2¤n¦}¨ó¼}‚}2É"ïÑfx?ËBÝT…ÎÑÁø…!ÞlAšRŒ!Ò ü]•º—á%ü@„^1_4Tû‰†ˆÖ üdhœrÔF΀"é.o'ÿÄ‹äN–ˆk„ƒy°†_eoâåòZð2ø6öfÖIîö [ÅšJ}é§õûª§ðÏ Ö¢d .ù?t}TT[ß·-Š vwba %‚……Šb‹¨`Ñ9}ºçLÏ™3gz»°»ãª×î®kß¾Ï{Ÿ÷{Þo}ſt¸t°øŸ½÷ÿuÏÃÌäefµ…N¦>‘º[èXˆVßGgàát9UÛh*Õ±:Öe–¦KÖ¹@ýͺ øƒ‡é[ê6è¸GðgÍMe¶mÐTÅ»>yb ×­6;/b†NÐØI7Ókqº =ÏúÂTßvšž˜Û(Œ`γ¿eÃU ‘ú¤éŸÑT…/#‹ÔÐÓVX;·pƒ¢­|0J U©±¤2ˆnàìj™Îõfïà,Û^Öp²;HßúÏŽýZnA?š.hnˆ;^kh-eüzò†wB‡BÐ`SƒˆÏ×m1;bù°J±†È‡½×µÞ×Xßïïu[QaõŸðe‚Y­¿s¸7ÿ0pžyÚyæ¸Çº’\G\'“\¹`òºÇQËEH„ÚZš·™|üÛJƒÜÜà¡ ¤n¨ÌÌü¼v²Æ¡Î†oöŽ0osmr7÷ Þ0à“ ’s8û@.%;†K›XÏïÅûiÖªvi.—A~šžýÆOrÝ1¡TŠÓ"XÄáŽõæÇ‚Ã.J}@¶ô)3g>Îéõ SÎòÕ¶MwYoÑ_µ¦ÙH·\´.z^ðU)äà‘SÞò'‡3™sUÍ nRÃàfÖµÕÂNgöª_em^¶*-oŒ-­°Ô¢Ú…?-â‹«Î)Lwo­GžSÞ->Y_jTÅ‘rt8žÊÚ›æ®ÂŠÀr0‘9R¶ÃzÐ?®æÒºÛîéw©c›õõ¯ó2Á½lXÙw?¢nÑ?÷.f\½I˽ň'CvvŸÐ%¿ƒXèø€Z7÷÷óùÿdåIA›ÂzR’kûຠ’fÙú8r¤úŽ]â Ë#ñpä"íͬAŸ]gÎÒGvÏ¡¯X´øTaK˜ÍÿPZ¾a”?Ë»ÞÔWÇ­q\‘FÙp±³'Jzebcn:iýî©ázfqEÂznrÄZÏ<4ç‹r†ÐÚ$;˜XÛóvãPÓüüV³rh®«¯#0 Ñiúü ÿˆ–Ëg@”·•k±gÈå¥FùèÒöÊîöšL¤½czZ÷ªÜä'm™:§—r­¹ 7_Ì?œé ËOl$Ü\uxò÷D¿š‡æÚ7šóti_æ…Ìר÷)gï(Š×呚;~HÍÍM=³ž™©¯çï_V+oüTº²åêÆ€â¹&K›ÖóÖgrÛþÃú¿VòßÊüª0s“·zÓlR›VÍ64˜P¯Z½ž;¾ž}ž®ÉžSÿ]wCÕàZÍjuᮚ®o¹øPønwÙ[Š»Íë3L¯=£³jÒVö¥8ß‘ì(7¥ž:#?73·ò®Á3³î,-n•èÛí:i¯Ð87à—w7}W_Ó–QB©å˜µë¶k¢³‹ÓjjN\Ù86»§­Ÿ!U¿š‘kwˆÓ¬™t(7O¤qn#ÕÓÔfÅ*àñá]©ñø/d®¦L3I¤:¬z…èð;P<]¾^mP»Jç+c RQ˜Ÿ{³0`oUàê9X7ªÚõãÉänò}‘Ëd·ã=©é´œ ˜­Ñ6ðS\²”Ñ ª'7×øÂr×|‹Ê}’ 6œ4†XVš$ó"s°)CUëï×3ûÕñð"䚌e¢‹á8ófv†©¡uáú^+¶(É©”zÉ—ŽÊ£{¬¾ ¢Éͬ_7•ªVzi€¼*ôN¾(6¦vÏo3ÎsÊþÑ}û°%‘§‚ïšÇkïÁïUO¬·qކÙô":ˆÉ³¹¥•e'è{Œë°¢çãá‡ý“zTî¹–éÃÝEàþÿ©Ðÿ‹W³¿:Ȩ·®nFðžºUC€ï„/ÕCø.x;€O o X÷ ×›9cøz°Ë÷ræÊÓG©©ÔÌv϶]ªê„…ú¦Bm;ê'I¢€¡!eK£¥ v]eݰö ‡r 4ÊžGZ'4náýîµÛË 1º$#c{)õw1Ž)ŽJbcm/À³d4üÄõì ¾×|Lì#R`n£37¶’ºJd¶9™9Dk©+D¤:ñI“§dvMedgÑ,ÙqM>ª–Ë.Dk ¶ 2Ë_)ÇÀSÔÇUÁª£ê¹ K.¡ÅÄ/(jŒ¨%ìüÚ™aµ­Ø]©~ƒö%“Êžb6á.¢œèŽãØO¸-’+ù+Ä!Ù 庅äy|©.Q¯ÔN1v6®1¾ˆÁÊ'hƒñƒpªñk¦áÁì/¬bjA{¸;f‡}4Ûn® Ë©Ò?-¾oÌ´¼GÖìüˋθ›vˆï¬7ÑCh˜¦,­‘Çç¯ðåë*pùÔŒ¤SËü¶ÞæÏ‹ÚÉR}]±ºaºè~M¼"ÃrÜkbu+X­.ÄRÕæYX“¢Ç’ {ýMгñ.‡›Fð!eúXös*;pìõÿïëL›5/ü«‹õ­ð¿ö6ôÔõîôÖð}ñ|OÌ÷.w#÷ÍáÕ½aúØsm…Ž\GžsªÄˆÕ€3¤ÙRÁ Fú9ÿ †ñ pYýð²ÛÅÔ »MŒßÒ°zÐ,Gófsm줥¦µ–ù˜‡m#`ën¿kIw¼f42¾xê(mh­  •¤íÆ„YKLÅüVº’æ[Y?_ªZGtRTŠš8,Hý¹´­¼|nQAA”úI C”™ªä7üVŠ„ßÀŸÔyÊ?óƒ•ÓÉŒ¢ƒ°d¬`±Ýf󘱤ŸjÇIZ-ùxv}YñÓ™¥tSºy›£9¥Û˜bú&š@[™OäXú6Y•zD„‘-´ Œ' ß °¡½±²)Ø€Ò)Ìu6—´‘ßÙL-~uŠIá^n⮟m¡±Y¶QQ1¥8¬O§¹E¨«ÈÑÓ’XÁÆ Ó[Í-¦'{ˬi¼×òÉ×~q·¤sC凜UKSkÈ.–¨Ñw¬VQUQ ÏÓÂæ l%¦6÷†ÎÖ§Dã%Kž«6{ÍUè ñ| ô Ø|­ËZ€2 ó`Þþw¥ùsþ?5ÿ÷3ð·/tÿ OšôÕñÉCz_Ąʶ5ÖåÖÆ1¶ÇYSwN¾¬°¸k^]i‹­7“Írt°>³E˜;3O ×SÕßt ÎÖŠ0/‘)gh¢U·ä3ŠJŠÖì–]Wõá! 8ðTvÁƒ4{ѵØS%"¿¯¸"QSô¦—B£‰_ØŠãúrßø×€ynbžëFšëóǘ.tsF×K;„ð¢ËEèa¸*Ü•È!¿â5p=–€]!cP3ú‘]Í `?Ó;ùºüF}]]?Ý8žÒÊè(-¤Ëoå×bi~žSrvB/‡ÕoÑú½æ#B/ô=Ùßî‡Z;8º€õBÛiì+M¿ÃáÖïØÐElÌÿ²N51¶#_®Æ§Ôž²3b!ÜϾ²Ôaãôû àÿÓd݄Ӯ½¶IÚÅÚdSÊ ž±)Ü&óë7Øìà;íkëKô „: üˆ ÔûWÍ Álæ¿*üè©}}ÿ_¢GôÌvŸr¶´;ï’· ÍtÈ1‘ˆ,¹Y4K×Ê ðà–ÝÂnÿi¹m•™¾‰·¥»¶0G1˜¥'· ibeÛ{ý£ÉúÄÚÓ6¶ÝÓ†WšwX> ËEÃõE–Rwð*Xh5[ªØ[f…D÷a7lX¹QC…²Sý´þܶÚèâ*6Îîc3qDsQ¥Q“dw“À^@'B·ÕÕÐ"åŠÃ›^uƱìX$€ Â´Ã+6 ›‡sHÚŒ`Üh/UoÅåø¢eiê¼î‰ö{ÛXÇøEOÏÛóïµ8†8LÏÔm⬬ÈF³àj°€Øp ‚CX’Ã,Ä€>2„ò¨n¿#Í)·]±,ƒßPŒ+W¸bnnkêYç_#S/5<¥°Í f¡™;ÞRÏa ÖÕüígÜsæ7s·‹!»ÎÜFªÒ»ë5T|†ØÉšôç…ÅÎ^þ=%…¨Àÿ}ÿußbŸÌ}tíßÿÅlK $&"ÿÙéÿ½¾ÿós[ÿ ßO´·Ø^ÉÕ]ºà®Û:9ö#ðêV‹ Äý9G‘µeœPݹH'9l›lA·^dí`}#ý¦Ió„|ã>>Ýn ×wЄÞÖ|Óœ±}' û„¯¶î]Éh¤“ù´ôÞÖÇÔÒ䱌4¯¶ÏØ^ÊâdWè±–qö[z>½4$týna4צ‘A V?Çj)Õ­f&«çª‡ª“¡íhOj.u*–7#5L ä¿¨_²·f T#q Ž5c¹Ë[>‹/ìOFé¨åœ úy%˜´ï5=¾º‡ÍÙºæ`ê§âwÞ\õú&h×>=jí¥aÓ)К³½Ô?§®[›NsûuÃy/•A/‚äÂ>½9×k\!Ÿ¯¼óhÕOëL©®>^[M”킇 •Ø®…n-Ô¦(ŒôrÛÌ‘ºûÚ–Úš|yZ„œÑÔÃ4X©£y…Bzdªõ€ÿBh |#áOt ú;sO»Ž}FÞDO#5±hx„º ¼|‰ÕÁ!5$S¬?Gò˜$eA(ú +Cô8‚ÕFé+¨& ͦ~'Ÿ1Mô— é_p‘ÚÅ ˜ù¢söHÒ{‹Ä†2»ð“¸A9B>@s¨ßÞkJ‰£ü$3aÓäÞº?+´“s¸åºÙY …äsíþ¢› ›¬È8ÊyyQ•µô5è8½Ÿ*ÊbroæP†k;i¡/,ãYÆØÉ0š;ÀO¶««ìUôi[ÆRy|‘ö"SÉ8ßкlmÙºÀÿuUÿ»Òÿ÷s®ô5w^‰Ÿ×naW£šmoky"җ͘Žtpö·Ž†öj¶F¢VŸÁÌ1Õ3ýa#sÔp²Ž=6™5Î2ÂVÃÞÂr‰+ÃÆ™†\óPIÒ¡û»Þvr2]=íûñþÂXK+é‘XÏØRߎºË ¡wâw”ë‘­Þbl‹|ý¨³ £²¾Ž*þ”¬äªn‹0HŠª²6HSª‡é¨~ªîY¤©Š$ 5ŒcŒýõjýmœÖnGhBy˜DðÚhUCô#˜˜ž`/á§192{LôA·¡>ä ²ž9Á»tÍ iú`jŽf´bµš‡ó‘<‹B¸ •ršÜ}á†oÇ^ðu/e-…DÍ¢ÈPx!ÛÒt°\ßê6³ ©¥hóÁºUL8qƒPíÂÈç¸ÜO–2£¨Ô=º2ž øµ•KÔzudDbé^úíºŸ”‡”ÃM¡)h{*„³¹ß[ù¢£k–·–qÒJ“mÕÄÁWñÂ[eza…l ÷Š*Ì4lÀ¦d¢Â4>²E%Ÿáè+ÑÎçp)Ö{ÛßÙKAQ1aÖP®©üñ€?øbÏÔ²çOø²3-ÿZíù*àsÏÿ±òÿ]ñŽnÕÙã´{£{òŠç)=øÜ?(;ú…1h~pÇŠÕ¿åO±­cˆ½ÂrBc“·µ™,™æööóâNûÀƒúig6Ù”Â0¡®uªuš™²ªX\±[(¦q—ÙâPÙ&9yvêu™É(ÜÆ ã3/§Ò/T–ÆOˆï£¿1hBë)Ri2yÌà5gqg±îÐ"U#ÙfÖÐÆxpšÜes´pÛØÃ³2ô(ê$`oeŒú1ÿ™Þ…õÝ9`Db£c[ѹdvŽG[Ñ$ô1ƒ+'ãÑz¸ 9MV5P:d±Ü%~4½†¸„«Ê‘x6XU_–•V}ܶç F±ŒXbìmìÃa¿a4{I˜íÆ?äê’貈œGûÈšì"§ò -ý˜ÞN Ìrj!B•`‘_P{Í%Õ"0ÏÏ7ì`L\uÝ*Ä£©€V³éæÆž¶ù[Zä­ãŠ„‡˜°%!cÖ˜6³^h>çÛ•ñ{X;,F·M¹Oüh¶ê󩲿 ¿wëë¶^ÀË#Qš+v±ŸÃɉ&Àï²³Óù5q¡k}`i qÙ5« >fûIÿyÿa–YÀþ«®ß vûÑž1ÑŽIä« ]…G3ýÕ{gº&Ü‘4~ïõ½z×Ùì‘bCÇ<¶½¹ óÕœ£Øæ!b™t¸õ·;ñS­Ä^@ë› ŸÖ-6L6?"î§WT”O«¨r¨nÁÄ5ñ¹ÉE“=¹Ûئ]H¤à<ËšCµ/2©Ñ¸£ýëÆLýmÀƒO'›@òe/[&¿­¸3Sš„~AJ€Sãg¥Ëîcôì>`ùÀ|ÊÔ”=„²‰EkòÇÑ9|VE¤BŸa9H˜?N~Õju_‰oðYx”„¤óȧL°ø¨YŠÆCÓT=±×šS†'Ü]fºXÝD~P}J©ñ`fX&¯%S_,Þ¡ÈTžU´S¥ “ÙËôVäªê+F­´€ÇÌz2ÙŽY§#šQ¿ÈÞÌG6Ÿ b½X8@G`¯ÙÇி‹¨~þDÀãèúÔÀ¢œÍLS….殎ç®÷N¿ÔÕr‹Û+|µkÙB†´×ý=o…%›2…µDä†Z¾åe'´S­M+PRQVÌÑDpÚÏY֙ƻßh¯+»Ó„jB7½õ•zbüß½\eÞo{çnWïÀÿI_§À_ï¬ÿØ?5WÔtø×zOxÿFUä®'B9NYX+ÆÍ¿(tZǨîÉm—k[™Ú!ca-Ç,Ñ+_Ügg·ŠŠõ¥¥Úsìx«ÃRh/EJãMp¿á®.ŒÝ¨œOxs“ÏÞfÝÖꙡ]6&Å• ûky7ayCq´¨;LÉp²)rš)·• 7=—_s›¬{Ï&$9ÇK±Öo½«¡}¹þ9ùKLÖùu íy’ª,K¹®zÞÀÒsè±´ˆ¿Ãæ"IÈSB ËÉV0®¹…ìF¿á-y^›ŠÏżh™f-V„FQ‘Ä%f?zY‘X¯ƒT%¥¬/Þ™mÀ£»@†Ò&¥¤üsI¨æ·šT¿R¾QìÌÝ 8Pú—¬ºL¯ÊTfÁ­ÐêðNª³¾–1Ô¥}ͽ¤ŽaÃèÁH%̇üƬT-ÖO¦ãÑpSÍe (OAÆàó ò º©±¡ýˆHú2U¢½oªœ±Óí7¥¹Rm)Ušì_å‰tÿéõ?u¤ÚHQ†J„gØr€£F}üOK˜ˆ¶ðLÛ¾ûrržùßìÚ'RÞÉ|[ãZçOž{g‡×*vðönsd»G¸î¸¿yøxgsÏBÿìñ{û¿=¨þÞÕ{ÖÒ9óÑž $,çûIâÖ?¹é·PÉÄ+rVŒ÷Çœä/¤üˆ%û0ÕéNÊrùE¤†CŸí/TsŠQPMüY‰K/¤ÿ0Ø’€’µÚ¾»R< W±ë=HŽê-XLź¤O=U=HM÷âc-Û]™ÞQ"ï„‹]¶mÞ@Ž?¸L·íŒYY®¸Îþ\:éºçUyïXfj;Ú;Ø¿ƒÜš á s··Ä8+ý³|qjQd÷­=ÍÚý×9~Õ£l<“¤êQñúˬË\jÕÙp³½­Û8k»r]ƒFÕê•Õ½Y«ŸcC‹ZG¥>j¶sjÙ èŽÁâ]±7ÈCùÃ~X\)ÌÖÒyÚ´âQð}õäy®Z½¡¢BªV½Úøøƒ ¯ÅÑ[s?v6¾'·Øî0é™8à|Þ[¢É>½¥?¾狜ڻž©—Á ÷2¾eû™f¨/7U#ôŠ¡«Ón.BïævÒoØxî·¶>Ä T,›”kã¨ì m3œóð¹Úî,ÁŽ¢¦Ò;éZ௄ÞÇ®‘ÕØyô,<GS*íŸüq²ÁÂ"³Ê„€'ÃûÕ»TM¡]ªêE“dpé ô848?%óׯ½›£K''TÚ,­ÊÐÚü…ȈºãWí t+Ü©Ž^„Ïâ3ª:¦ù¥9¸YÊeÊ»êþšj“fÚ-‡ºBÑDtö™¼IDëñùüróýYn ÿ\8#µt„‰³AJïówj:—ɰyì<¨}p&:÷SÙw¦o˜GK8öø»9¢„ÇþgÞƒ®‹eÿ,O3o…½:Ñi‰ôçyO†¶_ðwõÕ<õ\tŸñVów•”ȇ®Sº„·˜Ó¸I3¦Éô  ê!ÕH¿+ò1Æ×ßWÃuÐÓÃwÝõ÷¸´Ô\Ó;Nõ)¼îºj K5}ºyúËÄþúb‘)’æt³žŒŽli¾ý¼ñ±Q¦=¤;X¬ÊM/Mbn%]˜Ô|À®n[¸VwRB£¾V}Q%t¸b¶f™Ú‹Í·ôæNçtÏn™Å¢Q(’ÿuCŠê71Þbaób«mN ßá%½ ët2ö“V¥]Á¡È|õ5ú{Œ¹Êt¥:“m‰£ØÚÏmÕ ºþzбSØËÔm¦=sšNdîs3µÕtÓY7wT/Ó>#O«©$Š1(”w¡àA3Syw±uY©WvQ+Âe­AÅ"åJÆ«yM@&Û4sUê:sÎyå)À‚;­qàWt¸©—ɦô×µ3 7©ëä%l4‹îCÒYðHø\‘4ûЀƨLR7ANªö+K@~n%Ĩ^‹§Ò5YÏ–á[Ɇì~[f°2ì¯Åo®Ѿ=W3-ªŸá³'ø‚¼ÀçÑóÜ»ÔÝÏC»Wxæ³ø­¶ºÆs_zž%ÎÒŒž7æÃ‰ëÃGu+]{pÒ”Xó&óû,!I²Ô¦ÞiP"$ëí¦vðrÍn,mͱ¸ÚÓjEÛ&Ü«UP»fèþ&Ýz‘CKæ¥Á9S ´&~ŇEÛ§›WÔÖºÄ0§àn䕤¥â$û N®»ª³è 6#l6ïTþ’E kt±|vÍà dCê†axwh,^jÈ1l3¥²®2³(WK·™Wpáüd>ZççíkÃvÓ¾œlGºèBŠ@`C)ÄÐÜ OWí())z˜¯Èê«™P˜RТ‰,–r•9d‹*ÒèU}Ò¤·Q,Ãreë‹ZnEKý+þû–ÛÅ<çk³aÅ4‰bƱãMÉÆl“Ú‰~sbf4ZõD3\KÄÁ?•ËÕGÕ¡ªt+í ó4€ÌœÇçÃ?ÈoüSCKO¡‘˜Ür>;—XÕÆ×ºâqþ%õ‹J1 žÅÒbñ—s§P›{eÕ:/º.{68Ïpï#_®§§«‡c£*E ¦üíIT×£ù¯M»«=œ:ÚE7öqÞ?-Ï@f­dt’&ºf› W»<Œ®ÜyS⢻ú ‹ºØzjŸû¥-Ò×aîwgq·ýà¿\w‡Ù‚ Är錩ƒvÖ2ý˜ƒŸtIï©Ï}}¬ðz€Ë†èŽZ|´PÍü§f Ú‡^E¦–¸I‡¬ƒòÐê¿"w ”ÏÌX1üUãFýï„Ð#NË>/m’ô&¾x¥‡Ê‡>’ù›Ædzë@¿àzî/{®éûXCmXÂ>ÐeªÚ ý€Ÿ@Vöæ2˜¯O4L/aeü@]_¾&–¤9Î.0ãë0-j÷˜/éOéÞ™jY²Ì5M­€઱ÿÔhÓ‘£2ü,6ì g¸7nËÝVyÙ™åié§ðžd-ø/y[u Óˆ-¢s‰¦X:ö”ær÷›„ŸÃà³ð£t<߀LB*C_T«5ꟲ˪ãpÙöÃ_ãÐIp"˧ñÝè.èSÕsä–¯ϼ$<ÐÃP++õpt󄙆|þ:zSªDz­=Ñ·Ä?Ê݈Ìf¦óÛ™c˜k(sñöRõë×>! H¹Öu]¤€|_K€ê¼ÈžC¥xïù—¶{šKvFÎ^\¢x÷'[»ì=s2zeÅSãTQGƾrº±ã§’AƒOµ1vwÕñ0ÎËž×î>Ò c=˜¢£&MÎÚ#.áœs’—÷e ^=uC/I%±ÓÇ÷w.\+æ›  ²Œ[„…c²Cgªæ$Ò¾™ü5÷DÕ^U‘V[ž¨³{ÔÕ”à™GœúÇPbbt@ÊtìÖŽÙL©æn\jlÍ¿Y&7 Oã]ÍE†gæcªÖÈs_¤‘L£|.øéþÔO"ÍÒts.‡²k? %‚ æ~3.î­~¶•’…–:–Zæk†½&¯a™3|2ÜÑÕ¦‚˜l$[ƒ»F?¢Ò¹Dq't0»©sà\Öèöaµ먘Rª*ü£8®x+5 âä±ëhj‚ÜRz;HBOýд?I¡ðryC…„þÄJ™­Ú{lM¶+Ó„>L³Ð_€ó,S¯—Û€·Å3à=¶‰@tÏÔ‹TG4~¸ PtÛ^ÿ\?XŸÃÞCƒé¥ÔL&ÙØÑpŒ¿¡f›01Þ^M÷‹Ïkeº+Ñ›lÀ÷¶ÍâakÛKùŽN£S£× ‹%´ê’ÁC“–Q–¥ì”m7<Ç&v¯œSSeù¾ÅþMWHs¡ø±û Àž@¢OëÛ$•+Ê1sŠôÈåòÌ ‰Õl6|ÏèÖèm}R¾ Lò¥ÃžEÎCRmÏbë~ç×CÀnN4|æ­ž-)6þÔ­_ÙxŒËrÄÔqÙ´þ[úuÓb𙿆#uå&õ]º£:­ÛƯgOXÕÓܰºÐâ*àU÷«¢7.uÚ(xĶaA£nÍùähä,±¢‰¥ßR= 7k¢·ý•©–øÃø¾"ÉØ¬ÛLèwÆR¬%KC®!4‰ïÉUÔ è:RŒ4†·á$˜¢&¿ ]ÆoÖ3Ö¶–ÍVœŸml¥{j¨Ä׿î‚t“©^º}Œ›nÂOÔG%&óT}Œ¶Í´=Ð_0ÞË)ɘ™Q_YZp˜ýHU2 /ÉP|Ñò¿û¨»´xÒ<£CÈéÈ4,«¬QjF q€ESݤGk“¡mX*¯ÔЯ´3Ó•´)F¨ò¸Ô\¯VíCª[¨DÕ[umô0ºK×e»0ÁÜA"“©IÑÖÔÉÙÁ ý‡Áf<"®”Æ;ˤ‰†ÊºÊÂOûs{ià¨ÙÝ¿%YqDç'Ë-Nïÿ!ök»à)gµ]5û”ÕU±)ƒ2ÆüF–‘þ¦¸@ÿ²±eg}…î+®a¾á­ë`¿€< ÎíÞ H$Ì«–×7{v¯F âêu¬hã& Ît!\"!—5Œ2Õ³|ófwœ{—1M»ßØÂþж_EÝË7n)ÔϹ>9êÚ€ÛÆ©ÆRSW~š*J¶¢Hß§ËÂyý*…^­Î•-zÍôeà†VM»á pÒr,•â§%tË?aSÓv¬™'Ÿ¼ªêè»Sú©j.¿”ž"oG5Êý™3¤`|Qº0n€'ñÓAJËØºÏt†ÍâÌÌ ‘ýÉÍå¿ñ_ «4©Ê™Öc@q—jl‚ùAE6:²eÖæäßÉ}AZ‰Yl u•«Â$ƒÛöM¢3¦8 gðpwxz›ô’±ZäIæ·Ìtû¡JjYªJT£€Úüû†pãûÈ[ô>À·v¤Z½ÀO¡# fH;ì0öª¥òÈ¥Œ™H¦ÌVSÀ¢·—Ú¢Äbk Nö•]™Ž£®þùÞ•žYþ ¾ªÒÏî‚lX?lØút§­–Ã+žÒ«ËÚ\ž‡%3‡j§e¬iNÁVeÇü“¤Láç‡ç½«Øï ¬^¼åÎË {8H¸©ã,t$Êdy¡sR'ÿ‹û¶¼cìÂ9Ø–Øà¦TseKrá$HCùûN×Ä}ð‹'¤Ξv§<\½/ú“8dóç‘ífô°þfƒtÃÍ)è—âNEÙÃ.‰\PœŠ´9Þ¢Aý€{s«ÆÛÊ–Zø´Â5Ì[ïmäì#‡Žl»üôš ˜pÓxíÐ?7[eyë·-i:³Ý¸«cT»Õ‡ ¿…Ì8t§:°È1½áa* }J\Äj1xh±_óB_zVc`´Z„ÿx ]Œ{¥†"ƒ`¸`ê`þbžk ~j 85›Ì.fI¶Œ QÏÜž·ØPתÚ¸F¶€ÕgjÍa.Òý4|FOYMà+w…¬†¿ abñ”¨ôʱð^2‰'þB±!ôU|³ˆÅ·ÑO×2Z³b(r}Iß’hE¾c^·Ê‘éD„þÜjlC£õ‚ PÓ“Ÿ`(gÅY KÈäkë«í笌õ¥­‘=Ë:Ë›'—ᥜ-\w„ŸÆÝ†½–]ÎÕv­²KŠŸf%vœø:¼,+¦uƒ>š.W¥¶.ÆÿÂaß9Û¸‚]—¤*R¡T"Õ0 ´¦8žB'æÜÓ:3†/×SDŒµeX™Ö wõ ÔëN)µ?þß~f««É뼞=fÍ2º1ûz¼&7îFL Ƴuhbl‹Øð!S’¼ÑU Ž'~ŒÑ[™ßÑxÐ6ª¢X­]Ã|a†ÙÕ.ÚGÝPmÃa0î'±;òÀ½ë°2¤3‡`u‘îT&6ú`hÂïâú íí¤D{¨c”•bM?èaÅZ€bxSÌ.0bæÞ–=Æ´Ü [›˜x}W¨†¬}¦J}MÕƒ8Gp|'¦”ÙŒ…Ñ=©,8œ!G²›éTúþ C†‘-'÷â<àÓϤkÑw 0b&ëjv‘©ªIÞcñÚm–õúçâvñšÓ ~‹¬ÓL¹¶ÇB„µ‘¡2uá¨|„© P#Ž1N²ûÁM­‡¹ƒ¸A8jÙ`ë!žµù½=ó„¶BñÔÆSèp9âD’Ÿ34qsãE9Ë^mú(T¦‚ÊÚûÎû>ä• M¶ùöIû î8s{Ãza¿oR ´,ÞŸî-ôÎñ~q6µ9ZÎ=\°õ±½Ä^YÇ3ÕtPÕiy#Z·ô-ñ@ÒÅ­#»õ½!µ³~•$×pšwSkfˆ«!Àsò¬´NÚ&öïûqÑYGȧµn*ä»n=g{g 7‡³€’míuªÞß;Ä»jÛªœ­5½ZÜÔ«37‡§ÒS2ç~ö!nôP:F­”E>Ð|`ÛØŸ3GGÔÒ$ºo Ÿ>”ìFåj35ßuˆéªX0×4cíÉèxº’MÆÝŠÐeúꟂº‘-¹¹t´iWKûÛVÝî¶;yÞïGž+6¿ Ñ—ð\:ßÍ%³ˆÁâg[åzïhj¯j®jcN¡ZålÒZé£xãbâõ‘†ÚT‹Æ ñoÌ>†]ƒ…oÐïNÐ[ÜG ƶ]©}ø Ü…µ¹Ù‘À1®!3€Ãä_©ãXK†½Tag{e.°µfØ{,ÉÍ–y6Z,2'j»šÞ²kèoÌaî ȬQ’Ë‘áœ'zlmÌUnë¡¶uœ™0ô2]Žj¾"}ï&×UG”wu‚€ËËå-¢[ ‘õ¸ú– .+À+ôS’ßÚo 5mÕ·0÷Nj—yÏkË{5bWÏlÿ+Çci`±Ãüß¾±õVÖ~6¬šý³k¤§ Øé§zàÛZÉ=Ö9̽nð@øÃÙ6ðÕsQPh‘©š •[…]¢úR³ Jæ`°'¹ÂÅ™Ò>a›^Îá–p5ùqºüuª¾v´ÎE&}°B|96šXI<¤Ô¤¿„Õ‚ºk¶QoˆŽø=4 mH·â&²}Ã$º’ôËzœÍ[íÓÁ»±#ÛùÞ9ȸO{ÀrÈ$|Þ¸‡zo{§ø{{6Ù:­ßÙR~)ÿÜøé{é¿¿‚ ö4kˆ¡«¬×雦Їoœ©Ž oåyݧñPoRŸy4ü@°#„k —vL®¾â6×ÛÌÛ Xœý{u½ø-ícè&ñž×þþ£þÊeýÊRMnçA¿Ç_èïü?U8¨ ®¬ö¦a MÑóÔ¸­WíYb·Û"m™Žê®vn·;ü+˜Ï;/þL3é·˜m?+ΑBí“ 7I¸Ùzä}a¶-ÆrÆ#,°)‚Ž×øg¾[Q1¢zVúò*15rG¤=ª(zPdYÄøˆ¢ÈßñØÈJs;¯—+Šr, Ô?~þ¨C /óO IŠ&Äj‹ú à‡®ÑÞ#΂Id[Ì >,»ªú.zAn$¼-Õt$3èÖhMr¢%Ìl  K¹$ÝqSuàpÇZgê6èõ§¸lºÂ‚f–³ÓŒ‹Lë-ãÁ9ÔÆ®ö8¯­S%õTõõÞÆãÕºlî,„ KàgP<©¢ æÄ|=•pù¹äG¼'Ö'¡NhlÕ˜ØD{IœkKáÔ$S'é¸û¶s±­‡µ‘}‡%ÝØÆ8’Ë2O··J¡ÒWŒCí:äkâIv0?²„€2$öÖÕÑ4]°ŠB‰4[|/앦ŠÁŽdÛËwÃ7k5)Q8±ec?Vßi:¤ ›xkÚë°뫺“í£½¿¥xO—²¿+#ýG=cü-|3|”ÿ²?¸½~÷_õkü€õ_œÈ¿ßý_¯£Þáõ»ÿͤºé‘y$Ï0Oà°·†Zºˆ§J°#¬v5vµµÿ)œ)±£ý†=(\OX¶››å<Ëé48nËQ¡’à7çÚô…í„ÛÕg„†ÿGVÈîq‡ýÎÌÑ-|Uÿ×¾ô™¾!¦0Ö³eȲhvHÙð‰K§Ï½0:'n|Lõ1{2. uTÙªµ÷‰£xÚgÐ;š«šEªe%dÅ.“½É<® AŸ#‰¤™Ï¾r‹¸YôO2VÛÎ6Ù›îIuäY'72YüU®*©Ô±¯P •À/4…/è?™ž3Ažæfûö6[SÙ7ºeôOü‹Ì -U¼TÑ<†þT”ôða¤y0_ïÁð XšÚ£%£L„äh$®Ê?èþd+î¡í­Ôݪ2:Åb¸é—ñ¬@gwõ– ì¹+Ò9H|:²íÖ΀k©›·w—æKŒvã"Ëlë8[ué±-Å* Ÿ€‚ Ê<ÔòRµ/Ûç›èîîŸæŸãOô‡žþƒ§ý,ýŸ ¢µ»—«DºbëgÙi\Þ²¥ý=àhä:ΊçÍjç=)MÌXpvë„{âK^a}a]:á_º•õC[4Ù^g~ãõuþýõ¶]×?A³oâ˜0[¿Å}¦ô,ï“~¡_Ͼ¶A3‡}•?zûð×³Âæû¯gÕöX+ðíîV†»L$¸äsá\Ešf¯FT¢Ê—øâ,ÓŽ ùÈ(¢¶¢j oˆ¼BV1­˜AìWb*ÅÛ¹Á6Y ÝÕÍøÆ¶Óì`zQ“´­¹ ~”n0KÜÐŽ5¹KõAº™Æ?µEú7àw¶ÈÓÐÅIu˜ED¸ú­Ê ÝE®¢ÍÙD´û ~§Á=‘ªèC¨`Å>¨êSd;©¡P34í…Då¸ímtZ/‰7m2]‘pUl(55LÕ~Ñ•šúè/ê=¶bÇ{‡×5Ý¥s&Ù—ZÔ¶h)O"œ‰'ÎG'á'÷ËšHy­l³Äq»Sí]çlë#]ý¤!¾úδ•³r |­½ÁÄå­­S cïîSúŒV¶#0Ê[á,÷w-ÛúO [퉣Æip_:êÉó}ñiýký¹ÀÃù¶ï¢ï«ï°¯ÿ /Î çŽW½:ò¯[Ûß•jà)t?—oj,¼±´ôìÖHÐËÕtF›Ksœ“,&°ËÿýÎWö{‚ÓÔ¦Ù¦!ÆT¡Äv±áµNÁ'-6ÿKéÞ4çâºVó–ua7zí¶¤ç‘1=Rû„EôM‡÷ˆï8ìÙü׫,¹0µ|lèÚ¶N'ßÍ ‰=Uç൥•²—˜°He¨›æƒ¦š¢#nE[óXõ†Ðøâ¶êäê%s0‘ç!Ÿa¦e“Ǹ3b§ ô'ñxÄNî¡;k!C¥ùÜAçË3‘ÇØèšây—Ž„Ò ™*GqMóAL¿Ð?¡?4c(¿q©°HZ#¾µÏt·òNO Gû«;ÅYâªáîëº&Y@*`©û‹4Vhgžf}.=pù ž+€7Ú\êæ¾¯uµiÔ7Ç?©Ìç©í³{6yR¥ebw„m"L a‹ï‚{¸îÖ&·ã¥·±¿¾{vÙ×ʼn“6ÚÞz[û³„Xw™ÏÐ HIk%gçÕÍ©³9¨ÈÿÁÓd™…º¯»Io/Ï`Ïf÷QO°ßç{ê‹ò9º(a¡ó·³£±ï„~Ý®uûÝ=³ý»®ùat¿ð Ü6è£¾ä@Ë~‹;=ã ?ø+äèlŠ‹ÙO7åêªZZê;pÝÙcxWè3ù–ŠÒ¡ ê˜!ÃöÓzÚºÇðÞa ç ¥übú»Ú›€-Iì7|º”9¦Ýnêòî«Ø7À뗇̴hOxŸàï-rœX‰„´ÑWîÊ΢¿ ¸þ ~YŒüÒlS­R¼Á¦`á­àA ¡IøÆüDîʯ—,TgCà§Üi] ±Ü’ÏÖãÏóvî g”³È;Ýuý„Ç–/¦þÆá á5CT:5ž ¥£«¸á^vÆ‚dŠÚŽùn»×ûË÷Õ¿Å_Çëõ×ñôÜðñ]õ~pEùÒ¼ñîéR„ëŠó¤k‰ÿŒ—5’»I? ú³¯ÕÞÙîÚ>zj ½¥4´(JÖ,¼‰Ô„mþ¨nQã*õ†¤Ü—PO˜Å-õ„¹i÷+ïL_oO{ïhC_S_©o›·²?Ë×Õ7ËûÞéA<êMß**–Ú2:µîV¼[ú-ôªƒ½ªk~RyHó‰o£‹¤{öŸ`þ‘gye”YÄÎâsÛ]óDósv³‘°q »›_õþ?;;ÈÚ[yvÝÍô‘FÞØÓG®¹Ð/'ŒéÑgGxbø´—®‹Ò «û{ô»éÛÌÍ¿aKi_U^ñ®ÒÔì½h¼¾žù¨¾>¼²dŠ3åQãµÑÜQ­’’QoùÕ¶–¦:ö/"-¶?þÒó!÷º²yÂKv úëÅdÚÙižm³ñ¤xK<\ØÌ³Z¤-2¾76ß3¤hâQW¹=M¬mYo­c”k¿ªªê©O¨niŽÀáD(Ž‘øŽª©¦»ú,’ªv•Ô+¾[z·t‚Ò´e†r që»ÔÊžïZæ‚E^ï2ÅÛ£<»]åŽ{V¿6.Ôß57M4©í]\í]_¤·¶öæÒB+Nv®rµtÖÊí͉›Ãæsøø5Þ®óÞѾm®t€™£ÞÚž>övîù¾Ýîq`E.ÈÉ.ï¦ø0_‰vŸó¨gèø#ƒÎÜh;¯©§õ‹¶{çÌ ù¾vŠTÏ;Ð\êüb£\Ý\—]õÝë\ß#ï}gGÏbï@ßaŸÝ××W×·×C¹s=J÷2× O5 R®¨Èªé¯ù^È2ÌÔVæŠÀJO­¹ >9··´[kûË$ñ¯ Q¶ K ¡ŠxÄV*ì·.`n“¬v±Xçž*>« ¸=Î=”8+ìø²Fð4gŽvjBåø@ï¡áÔ Eƒö†Ÿé›ù5!ÄR–š) ó‡›ãˆ‰›g©ëqã¡—B®£‘ù5MÞqS]–6]{‹v¢X7ž V˜ÝÂcL]ÇfÎе¥u¦éæCÚ%ÂEÏIpÿÙchl¾lî¬=§Ÿožn1Z6Z:è+›?XvÛr ÌíÏ©2hžé¼m5Ö~²x×é·k„Óz Œ(ã4# Cr‹bŸ*Bs‚8NÃð<€’¸Àü=G}Gm~sE23HS AÑãØ·üËc}}p¸ooâô;«:Ǻjºk¸“<_\g<·]>©ÄÖ^šîôzy68R…uÖ‡ ˆMÄ0ûP鉽§ãµû°ÿ¢¯™o±«PèoÑ9¸n‰»ì67äæ"^öôÛŽvÈ}¸í_3ÖÙ´B@ Ø­¿¾rvû¿kUžVÞ¢ ÑÅR_éÜ §¿0ŒìåêâîãÛå»ã9jëî÷Üwè7d¨;0õ(Ü“½1®ÎÀ7öŸµþ÷ת¨¸£ïD>‚+*ô`î^âìëlf+º F!Ö8Șo¿e»ný`›+l4Í2<>Zçi‡Ãw³û·zöôjÚÊÛ{¾pyîŒô¦n }™ë=êkµnð‹¾ û‰z½æðŸÞ*Ðp°z6C¾Ók çOüûÿTuQQ][X”"*ˆ€¢ €(‚ƒ€ h@ÅJD"1 %¨QŠÒA`˜>0½Ý;s{°÷ËSb‹ 5±Äc¯dÞÑ$ë­w~ÍZs§¬»çì3ûÛûû¾m1°ªù}íŠÂSÐ$­³æžñ0Ô!º!0ý$Ê~@¼ OS6 ! Ý–çP¶‰lÓ¦sºŠNÍ-Ý&‰®A¿¹o‰7„˜‚ôÝÆ—Æý(Ý{C?ÃÙ:{í0)ÃgèçèƒÁIúøõEZGN+¤Ê‹J@$/ZËÁÄüTÑYq'@JÄnÂÁò¦S@ã"VpW˜¢X¬8$vn‰“oTžT|TtÔ=ý'Ù|­¼‹Øa9`ý‹LºÕµôZ¦„é \°Ã¸ål6{öÇv¡ ˆÞúK%:É7áé–|so‡¬ð"ØwY—cçHŸÉ„-žÁG!NŒ‰ "âo¨ÚÐÒ­^A¼ ´?Ta‘èú™®™²Ze›A_®Q¾Kª”‰Ç ÿjŒóåýÄž¢EÍE³úI~“Ë›„MÎMóEEJÉI™¯2Wø¡yQ£¬•D› Ä¿Eè£Às,œÞG·Ò_0Ù4𢾟֛C–Y_!UFx¸D‰j²×&2ÁÚ~—LÂòÞGßg÷pæ9ÐÝcÉ`ʸ¯€ç{ í¶í$Ÿ“11ƒNhi÷¼—6ÜK;t^[¼ó¥zbr‹‰ƒÜ¹ ìy:qçJ¹3¬§b*èBÛKà¬6Žqd~¤ûQá'¨\Ëξv{$“Êl¢"ØAÿäæw â´ h|Š à°“yd%@_ç‚Ó¼rž°@¹æáoeOØÃ*Õ¾útÝ¥>sû¦Ä>tÎïis8Iþ³ õ¢fÑp}âÂAOÂŒ­ ó Þ3öˉ~Y¹øpêÆA¹†êQu.°Ò࢘£j¸o.[wl•./M}S¨lÙW{P.¶öEÔ©âEê·ªûúE ¿Ï$ï‘ÓáodG ‡e¿f”5t+JŒ‡Ò„¦MÍ+ f*JëïÖnµ¯R­ÑXS ÞÊ“0O¼âKÙKPŠUN_×$¢Ðï¨ %Ãtý[¦h}´̨Æ©×i ¢M¼pt”tµ¸]¸§û¨ý´°b£x`#%(©ÿ¶¹a[ð;ölÊjjžoΨ­©¥Fu]k8i<ô¦ÖÓ(E¡£Á$J\ ¶cŽ|¸†G§ñ7tÏSmó’û¨— ÏgÑàq$Ñ®DÖ «‘¾«/zž„ÕX®¡ÃõG¤÷Íû`O¨Û¿yvZéêâšîªX\óÍ/*qëmS²ùùØÖÅ7´³2æÜ•N õûnœ­ ÃŒ»·Ü[ÿŸïïÄi+3ª7hRj›ó ×íZ]”Wañ~}‘´Ú ç¨=D[¥©Fä”Uü)Sƒ™Nø¼fš)ª”g—×È_éöhOë«ÿcÈ5è¡dü„µÓtF×Ói¯@¾¦d8¸æ…Ê©(Ë3øºèÑ¿58Zn·ìmÞ Ý0ªå[`¸. ú¦EâšØÆhÁqñká!Ñ‚úØòÒúY‚«â¡‚¢†öºaMÝS’†õMíÒîÆíR‘«¸Cè,úYÞ¬dTnò}c…þº)_7KO Zl™ôREÖ«Ô¡¢O÷75RÚÛÞw¨ëÐm+HŒü‘ìâÂ@<ü‰‡8Ô[¡'Ù`þwš—ÝÉäŸqÛù¡üs.©m—nËa]ð5À^ùÁg½Ê=ê§çÊôÄåµÀ?þÿìõXj4{Œ)Çú`(P‰âvÒ(ÀãÏrÙÜKÚN>ÇRîäc*~þON·ÛCÇŸ*Œ–W€ìèy%ãÓ¬Óáßpr¢9 ÎüŒÆ•#­Ö4ä!Z…]’˜?ft¶;U;^sì×ËÁ9"ó{l˜4@Ÿ%qói×¶'Õ|HËpǬYÀõT6U æú²Kt7+ŽT ÄWŠW”EåŽ^Q“¿*? ð²iä„M' VB7R£öKEŠŠÞ Š­™FžNCÓé0ÔâÒ’^C«NiŽIß©6h޶Æ(¤ªrxŽÞ_³´untk±ò’%+¶2Ð8«Ÿ&è#›ðñèV {5vÀVQw_b äciàÌî0L¥'»Èß4q‚!5¯+% DxCL}gm ÿ) k¾ßd’mkØ&o˜-Ð!)N‹8.bšûŠ&Éú«¤š,M>@_ßé^›¿Ã(ãløÖ¿BÜSÆ›¿Ç81ÑL¥m)À0]ŽÇO*hÔýJo#‚˜# j `¯Ð&–³*ãf*“ÀHÙ.&œ¹Áôàæ¿èwÄZFÌiùÜ_±Ûß|ÆÔXïÇ>{fLL™ÜUDs+Ùél8Süñ6¢‹WòRc&¨Ìkù§lÊÜ}NÊÅsÜÎ“Û 2È6–ÝÂtþ“Í÷;n 06Ö&¶½NDa¯q#qÏÃg ?»ñnÐ=^] ~Ä„õA|̽ˆóþ»ÜÆ„2¡½]¿qŒèyŽ;MEVËêåO C½‚‚';8GñòŸžõÃ×5Ìk(<„0˜ÏšÖ Ó[þua\^ÇÊW¹k ºBÀj)&ÞEoqE2í¤æ‡5ÃJÛ æýQôW­Yþ^NšN¨6ª˜Êw(| ~2Qcœ$dã§È!­ÒxÆ’ú5.X"–kÄÐÓl¬3X.|È@jd­÷°ì&è"Ø­ý5õµsë²ë •ñÕéÂgõ‘ã uj«Tbhì¯ï€×"t©úiõ^ñ‚¢Þ˦.»¼úðù¶õ ‘ŒNƒoážë.ó[{lkQ¾o~¦“«bÕÞªo[ë"µ^µ…ÅoÎUD(V"`"—êÕ…FÒtÙ¨¿¢IÖ|ܘZhõGK)úSûÖ’­ý^·ÙÉAÜZb¿þ©ÆQ¾R׋äHð¯ð€ôdÓ®†ÎÒÇ͹¢iM°vzëÞæ³ÊÉê ñYÑ`Y]ëv0E-—|s®å5àªüÖìZïØxUÎkÊŒ6C‰.èBkT{4WÕËŒ~ðUìå E«èjë2 †_'¥˜ ±;œÛƒ»FÏ%Hå”"¼ø}˜†XLò˜„ÖbW°‰.²“>ÉäózÛRÀiˆ}“umûÚ Ú¦ý_u+æ0ìúïP5ˆÍ>ÜbK²íæú0ù¾¶7|6?Îvƒ_Ìûñ£y?.†ÛÇ€3œ:J'±9™a Zà5ÿ.%ñ T_ÿ[±·øVl,ŽÌÞËðžè,<Û ?3¤ÞªÝnvlìætt½Ýîì´ÅÙ¢6:>¤§V>_Dë_³EAMÌŠ6L Œùó<({D®Ÿî y[®‘¥+ÚÅ å=6Ÿ­µWü”š±6çk¡§ÎZGדkp“f‹1'xMZ…©æaú½Šƒ²í­Eò0 ¾¥b>¡Wª–×^m⊓¾?VվͨJØlÌ«˜9̘«Û«HR¬T¼”äÈÓð$à¡!Mh“/.çàQ*¹Å¬®XYè—¢—µu’W²Š_€cC±ÔA²CtJZ!2´iOéîµ¼“W+ͺ.ÀŽY%ÿ .m9&Y«ŠU,h ©*– ÐæhÓ5µ“õ»”cÕ[4©ê<Í-ãm¡6Mím5'è6˜o¤½Ë]¤üQÿ¶XÚ_ÑÚ1âÌ¢ ¬;›x‹Ûèc´7±‰±È kö™ \©x&‰coÑ6úP0_"ü3˜rý;:Wmƒl_±kù½`Òô˜›/™Huq$Ç'EZÆ>bCØPÎÈ*ØãÌ!¢ŠØI`pX÷ãúG¬ç;ÿ׿õžÍï?˶ÜÝɹ”hü?ÿËÿ8×øhg稨q³„<úhüwÎÍ”øtÿš±Ãø»{Výƒób̬ºcžÄ?åãßœß~án¼–þþñê¼8ŠO]?úRùG„ÍywÄÿ~ç÷Þ‹ÿ]u¾¸áËþœO¾ËÛ–òßëw~râÝd=Aþ¦ys~TŸ_û?Í:}·ÿ®Q[åïð}ˆóM·&ôŽõÎñû~€éWà‘á÷“Gã1ÿYë<š´3l›S;A°2—'ìÿÐ8î®Pà*0öwþÊÖ Å\ü+¹?VYÔò'†ÛÐ?6ïè©þÁùkGÃøXøcI}}ýâäbõù.W_Õ3ã_úuÇÜ”aSW1ßÞ_/ª&¤EßTAËæßøŸ1~ÿÛ¾#i¯.Ë-Ì÷²Qh­DÏboù¤÷ÙCq¦ˆnÔªg á1FY†÷œUp¾{Ы¾¾ë‚nš8Ð~?Ëð#0ú8Ä÷\óx Ž¹_ù‚ž×ïì¾÷!BØÕ:Ƥ ¤ñì,{*»€¶Ýºhe§;drþ(âÐõIÚŒº WmzìkŒÑóñSZ-÷}4= ¨Â¥Ž6aGÐô®íuд–#0pdJ%Æ{‘á »UÉ?z“ºuòM'íRŸã°NW¹‹-ü=Iü…J–£ƒn×¥oÛž'øÁ[‹L јÊrŽWt)XüUXÙlö@››VI$Óƒh"(¹£uL!îÁ ‡H]Dž$!yžK®m}УµuîáØ“ÈxC(j‘¿l•Öyq[õ$£LÁ&¥%N=_çíiiì.AVÚbÜNj+…Y]™¸¡M{W€zÀ²µ’mëÒ›®v!©¶÷ØNzp.©‰{IÚUu$æ§ýҡЖThh§˜J‹Ê>é´“V›“$O£•³I¢k¶1²`fÇöµÖ¤« V=7³ Á¥ò4´ž³ÝBß@3³»oÕd=›Ø…BgC™/ÏCÒrŽGçÞãìÑýòa{paþøPX¯mX&výÚ…·ÿÓ §Q9¿ÏËü9‘ÌþG4TN£×eÅ¡Ö2béË7*…„¨ùºÿJŒYP6æ Ö}n á•<äBÙÎ žC¿ &ÂëÑü… òB‡ñÉÀ^Õ§¦2ýV½D‘m·ìwIƒ±Ò‚Èxõä’œu÷y|Iƒ!¡ÂLOˆ,ÕÔ@ÝÜV•5& ˜S AYFì¶§ &ãÒ @|¢à¡( uCàÌuÌ÷%ÊÛWz@F´²]9ä­3–U¾P”ÌC•6ɲœi) ®KÒÈm*— q”¬Ö|-PÜ%¤áo7T3^‡ê¤y3LRmÑ2°üA—>¶G<ºÄéòH¯<ÒÈ…†Œ>{I?è\પHd»¤é‰/¥h{¶Npâëø¦©ƒ²:rªH æ½ ñôD݃«5Ù›«¯]€©u’f9§ˆ•\(êyE^&uEUwÎÁ‡xê‘iF“cè÷²™ÍyYf9HÒnÕ´»0zFÙÞQW'½÷bOл¾±B<Îß$µÖ10§$‹ÀŠNÁëcšÂjÂÐêýF³->87Ðg Ú@k¸`¦¾ 1h ª½'4ñ(Q##®lŒÃ2óU¦@I0#W7~Ø ÄiJèCÓ«ÎÃ~Ðeª®¡êc†J6 ƒ66Èclÿ­Å¹d_õ–IîÂL\Ó…öDzA–L$"‹EÎh!Ad¯Ð˜GE¯ÑÒŠò…R Ö!’eÊ;Kánê£DÀƒ¦nÞEÚ ò]™Úìµ™"z¡c¹ y4†¯Õ¸”Œ'E<Dz/MùV¹f—§¿¸Â€<9W÷ù^fV}x èˆ=JeY3 C à=?O«¸®jM3ŠIÍóAÆl[­BV×zžžà@Ù¯­¾ÍiНûlêÙw¢݉ߑ–’× Hêb«säü_4:€ %ïv”ƒJ!RŽùd]çŽê'Ó–¥NË2¥Â2,ÄÊê¡vVž™æ8Ï´FÝltkWëY‹W{ºØŽ×²U40º—ˆ›¤5‘!‚Á°k|h 7:"i[Ô ¥rÊä¢L“… !súŠŠÿ~ƒ 1)oÛåÍŠ­¾Ó T‚³)¬6vÙ´½z¼¦C´àÈuÍüÀ©LG mÛ;,T’o–ÆÄ\Á¯j'jχB“Î%ôÇ¡¶Ê-4$¦û¿ eHT±9Xx ›%lùßI<ž]‚fZÚÜÎ;n#é¤}×È{iÜ-ä#æurGòT¦ºc¬BÅI\¡üø­î|ÚîMžõýW×òÕ¤}ÊÕ:™MhãiY|Œ¯2þwa@¾l"|‚ ö}_é¨éº2â­ ê„ eNþM–î$EÏsO]mi)oÇh*$Ð*W^äâñ_£`Á)¿â~²ß,º«u8ò¤/¢tn ʱE˜¡\j=\!ë¾£°[‰éI^Aé†3ãw²Za4ýU@¬Ay(Û%ä·Š£JêQQn$y»kˆÒÐO+(»Üe›Å8»²ѱ;t>rg’»lZÕ ⇕D¿’¡gD¦W} ø“éê*ˆ& B ŽyQ­¾Æ=оé 6;ùúµ|]“aYŒ·ü³eìWàXZ“w VüWöéêH¾ëÍ^y>2 /éDñ>?9÷‹%›lä1b_å 2܇fÃ^[3žCzíþÁ~wŽ™ensŽAVsw²-h*'ƒÿî×&³‹šˆ`¿ïÞÁ¿}·ž—ž[ü·¸›é‚ª.»?.šG“)‰Ð<—ܼüqãÛ94=9¯Dæœ)‰ý¨׆^ùoÙá;Çu¥ã±Æ¿j@gƒFKËBøßb·è…´‘FJ1Âb žÑâO =…µajá+qŽÿÝä\©c€ö£`½ù:5 5ù,ÆÙÎïÁOPÛ …‘"‹Þí7œ1CÆØ%l /ìkB3ÚQ¿—Y»Šò뜷ÂÈ DI¶Ys6ä¿%(Ò6çn¿¯®7#f˜¢ƒÄ¾æ@¹t$æ/Žª°ûÝ¥¿"4ÌÐ×`\/>)Jo„S[ÿPÇü GÜ6®d¹Ê³s’H›%CJT´ê¤áJÛû|híY¡ß~÷á¼BjŒN ýÏ„·tƺ[»kí×â§C3·tÍX›y ÜÊ£²#à‰t+FÑ“/v>ãEËèj'ÆÐïÒls$–ΖÍBf{d+ø‰¬ßÂÀõl‚è׌©/àÌ¥éÑŒû,C|ƒþ¥›¸¨‰üQ©UWq^‹8©º÷;”´<ü—­gQYQãîSò^*w†!.PŒ‡V9§g¿´swtq½vì3ñå,@”îØ×2ci)•% ²%¿mµs†ÏÙ>ë †÷ªÀ.‡#ZÓ}ÆoífI˜6WxÁO¥ÇïD¿ 5šVàœî3õç"ˆ;žúTP!pÕŽ–8˜ëŠ~ rø%ÐbŒøÕ ´Ú”uŸÃ‹/Ǫ?š`ª4_^(qݸ¶‚ü;Ñr7ni^ôÆô~#ÙþT k„k›b‹ù?虂š¾Ñ®&ë}»j¸AZ“‚×°·xc]óq,¥á­ÀþQ"fÑ¡À¸¤áp¶[ÛÉ"É–w¾Å|³p¢M£ÛǪ…xÙ½¥¼½ö_Ãý¥ OÆG<¸ ׎Õÿ¥P­:&ó‡Èù«ê¡ç'égò`Ö”a‘&öY C+¡F©u[c´\'yó‹k5‡ÞÐ gCøE ù‘BÁc)“•dËŽ`Ó\Ò°x¦‚p¾YˆÊ•ÒÒÅÊhešm¯š?¬qf|MæšqoÎŒD¶9@B·Á(º6ìlj‹ùàÄÉëÎ=Á²½"u¹{ßîkíhq9å½ë÷3퓃= †W©bâøL¥.÷ m Uç«oÚö3ØÜÛ¬”­_ ÒŸr ñWmüÆa[ž2 † lÒ¤—| 6zÝ7ƒmÔCr(Š^»•ØÏ‰G½h¢·‘ gzCÛ»þw»…æiò'¹†yak¢Óöså!}#€Äñ·Q„7 É3“Ñaê~\ ¦oùZ÷¤­ö [–)’ÓÌ’îíöÆSø‰ ˜þš›lzfU‡Ãò[á¾®½¿µOE&¸øÐaŸœ Í"}(5®/l®dè/”ÛˆAr=6â{Ø«ßL»€œ Ú6z]«·N‰êÒdfçR§øËvz;:~:寈²/áé„þ2ãÛ÷úB‰øÂ_”f/ÛQEñPNàUtÕ|U»âœj'V‡Â¸KißºßØ‰OûtC:'¼r®Ê[Åˬ''Æ¥2©©wèÚù:þ`½s­óG­&YZG.ó—úÂ.9EÛ§“â®…?i{euîZûp S=0%{ô%¢éÝ'âÔJ?¬Û 6‘)0Çì|w™Jòs¬Èí„uÇRM´yhíÞÛAGXˆ|ØÀ‰j£ïUy…èøG;%}í ZŸÅ0«¾+½:wÿ­ŸÓTós¬Œ+îÝÞñ=I×$AÚ4À[™!Ñ©¯4x£®Õ3_ÛuÞØQåqH1P€h6‚”k ”†)‰Â®<2© +…gaêØðµTãùv¼½ªágCå.ßWCËV3ÎxYqXKêÕö¦Ü8XHŒA×'íUƒca(/K¹BÛ¢À°–kìøºú”š{» _¯šL„Aew5—·q_/øO·¶…%¶Š| >dóCF‡`×Ù9ÑR½R;Íye0}W˜ÇŠâL騲]G”Òu¨ÎÑz9‚‚ Ð'ó:F›r̪3\ÅZ‹ÑktkånoÎ/ (ã¨e*Ð2©ïæ»Uœ¼ŠàܶùÉ_ ¿dyàœä}BÝÕØG© ³ÂdÕW¿o9Éé0;X9å=M CêÆ9'y(ÊÔ@©)(0Îià 3¼#–|ëÉ P•?+O#΃½±Á«ë5 è–2Â"‡PN³K"-3Õ£4$³û9ÜÛ™ÄåjiQaØò½ÜZA‹¶ñíS©ÜèÎ.>©¸óC¯Ì$¢æù£%XV¸7aï1f•8ÂÖÙƒ²§éËGl ¡ŠvUæ³°Ñ>`éàSÊ%46“‡#÷¥å¡JÚ…;wV€œL;r_•ùÚy²$aÇtÂís>˨ºSLüd 1'æ|mÕ=ÞQ º%`æ“ï«‘:¿§„”Uö%43JŽÐ~glyÕXðûÄ7ºXÐuèùJ cT·¯­ú˜*š3ŠíJ{r¿ e¯ŠÑ7OC¥Þ5Ü'¯ˆÓÞ§à¸å9Á$ꩾ5 f±j—¤ÿ#¹N&ÀQ¶j¿Ö·÷6yCÜ%0EžVÒftj_*ùéð„ ÃÁ©=Ö§‰y³'É-­„9|ZvØÔAPUŸuÏZð²³¶{+ÍiÁÀ±D É»¶³Õy>ZÕ4Þ‡vÜJrÂ&zHm¼Œ³¬hX·é~åšEòjÐuuµí¡ˆó¯fÀÿmíÇyéDO€§Ô ÚazhùÂùÄtÔ2Âø-× à‰Í¤ÈŸ '°Y¹@qnSKBÕGiŒ±›¹ÄSCê@t”¥DtMŒô$Ú 'P ,)/8€•Ò“Jò³#8í|ÆÕ»HLÏ|ùÅWç¹IЃ›WM¶‰Ž/Ú¦ÎSö'ίƣßëv¤ºÀ;Kˀݪ„iC©ÿ0þÕÀg|‰´× &“ôgžÅº–$D.Ø—§mJþ]HΩ5ºnŒ²cp­Ÿ}©Sy[oÃyóÏVã*¾òl4$ñjA™ÈÙüàt∠¿ºûжÎß?Ú³vʾ§Ô%õÓ¼•‘À‡Xìសl¥ê¨¿xu¹¾ªœÙ9äã¡mæ˜Y-˜KV4´ý8ãˆâ¤þ‚SHáŠDJM0Õ ª%OÑ)[1n„Èp‘jAÔJÇ 8ÅwÑ– 5¶,F£°¤Ÿ’cÚÚWÛV ”Ñ)â&Énz>,Ó]€@ÝZ.’¯%Ô±ü‡³÷6;¬OÎl%[ΚS*ÈŠr'ß ðT_ié2Ø™Ÿë_‘ÎPH_‡‡§8ºÝ¼»=;¤<ç«CÐoq—åzöïàk}<—•ð’y oYÑvûDÖ†$sKcsQÚ°$}ÛYÍ6WÜàK×R÷ºŸ§Ik èžNˆ±-ùú¤­q´ ù’ªÕrC^Å—îj¦k(­ÔfÞ©«ðµõy"µºckUâ‰nøÖ¹d’>pdáiÑ:€v?’Q›‘ßüøÄ\¥ÍNJsÜ1T ‰´ˆ [¶$”P6}ѳ*ùäuÊÃ?†ÊKËÜ8+ø¸zÐæ½J¥Œ<6coýS®ÐÙÆ¶M‡ú*^=° ^¾ÙTV ^ÌÕMûTœU-•X°Vbˆþ0å„Q× §mš¶æfŽ@€Š0Q¾³÷š6wj=Æè"ûÒ'³äû@rí¥m§Ø.äzGr(?á™,›=³£Rþì÷®¾=í¨žLÝ gu ô'#Ï,+zˆ‡Hï´KÓ‘ÓPZøb«mNyCò¥2õ…4 |¨»F‡Ásðâq]ÙÊÇçÛcÿƒÂ£óž2ÑC®°ÔIÛÓÀ [–ƒz zÛBžÅ¥ë×¶œ2!§kV-§"€íHÃ]kì-»kš¯U¡@}4ã‹5ÓY?ÊE:º«¨¶‘ÂzXK{ÝVšâuòLA=³KjYJp°=šb¥QEÆÖxJT–ã2øÌ±(¨æô’ïp,`ÙšsÊs^ì­s¦|B×íãã›)ÛÀ©(ÙþÕfŸ#¹ºs h|ÎíÚh>ܨØÛfˆ\¥á7^s“vý*š±Bµ8µM¹BòðëßÉd:-QEˆÜØZÛ%z[²“µa¢ó&HŽ_R îTºš÷j_nmÜ+…!_,Ú÷ÇÞë׎ï@žƒs÷‘~ ¬h@ÈàØÇ+ÿ±Œûu›Äiöª-ÛéX#±þ-¬u¿Ì­Ç7ix˜{NC*ˆR0¹öÀg=!"ÓðÊ5¾9 +±Õ Mü¨61X1QßmvA˜gákäÖë¯W'ûS+D›yûõ^ŒÛalFÆÕpIT@ó­ß”Ǟ뤹6yÀN3õÜŽÖãš:¶ÜsçÒzíã“jÕ“¶Ë$̬ ‹ÃyªP‡Ô@x©=g\ÂÞ»6ë­“è¼IåFø`pXqëj§q­ºÜÄ5ðMµŒ6ÉE,A Ä^sêÛÀ8ƒÏŸ:ïÅ*ÖTÓ&âeøæÈîÚòDo˜W‰e hØ2_NÄíQ§Û}Ö1~ÅîS÷ŠÐâWFÜê<%{ã]Ø^?«sJZYFSYñ:'ü2}Kêbû \x8/»h*åÉShðŒ>}µÊµ¤.¶Z$] kI/]eK^•W€çVOޱ|ô®¸g{g³Uš–ÌåÖg\‚Ö"œÓïþõa2AàÄ}5P$íÔbÿ*ȉŒÞÉ ËÅâÄ®9þ?0ð_i!`4! 1ÿQ²L|Bky¨¼ìoBˆã¦Õ”&g7Äï-e擺šq½¾'­Š™”~ü@fðeÖÏôÄb™ù ”–Žâ~ÉuIJsE]a¥,ǾY…÷á¹Õ™w±(X!Cj…´=Lдd#^X™×.„¯o[Ý÷ƒ&eÓu³Ùß4 åðÁ_v´Ãp//(qÛäBpûìSÏ¥=×ï+öwªÔ™´,¬ÜB:Øn寕€öÛG¡?{cÈC†EOtmýr2(.øÛm>‡FÏ1ØÔ …2䨴Ak¹ï•wi¹ÞÃp‚·5tm¯'1šG&»µ©gPŽ–‡3:œ{ßÔÕ­F¤—.${`Þ>AèN¿jo(êÁüø›‚1Íã¥ÝG~°:S 1•ìÂ+1:B‹¶•òÞÓúÛ䳞­¦ˆÓ0 º2:ÞNtƒÐqøàÃñiÆÁ§E¸¼X©iÄŸf>È'_e´á®ÖGˆ”¼õŠúø 9èƒÈGm­eöëd`îìàAiåLKðÄfÂå?6*(zµHp¶Dï}pnŠ/ÓÎ.Ÿ/dŸ»™Rëã±Éc±ôÒɰ;÷Óõªa™ñt+2õ6(yrfJ´û$Òtg8E`œ½s´X]¶1Gg9ý«•sõ~ɾ8rkýzÝZ‚”Ê«U÷k«•jOoÊZö…scPÏúŽþÊŽ©ÇÞ9û7m†Qvǯý÷ääSzP *{oã£^ù¼˜ÝÉÂÆ\éˆ%“Ñÿ`ÑS¬²®cÕ'ãä4ÙU¨eóØ8ç[s|gÁN½è!㈷]ë×K礂çd ¯HD¡ëDO>’Uƒpã!Ñ#an"ëL%q½?ÝEÆ…[`hoY2’‚ÓH–’}_Veb¡¶kòö§]~™¹e º•MØkÔ¾Õµ³ÀWÏDûáöõ‡Wty¨»¬SÆTX¹h²sÀ8ùÇŸ«°<…o×L‰d´²©Ö‚»\fð"AVG¾,?Šöi­­–OqkÍ(kNz«Ty»¾Ï5†‚ÀÒÄvÂõh’`ˆ”ÇÙR[yK .ê¸Ë‘þ‹›™ˆ†yzJmtÝ íáGzÓv[ž4¹ÆDKèFr[š‰qè^Sv£€ë<…ýz¿k:eŒšR€Fí9ƒ%'/jÿÆfü1†ÁÕèÊö,NMQýÄüc|±% ^\Ÿt>‚•ÑN‹^ŠG$­VÇ×Ü!¦œûº95,@‚Ú˜C€¢¬YÅœí[«5ÒÜk’TÁ·u¾N•=Õ“çb%oì¼£87É6?wiPšêmy!¡èµ]‡)ª˜Û·Aï4w †T ÷Ãäv­Z×y}êÐYÁ<€Ý¢p¼2~=³Ú¹ˆ¡ËË>B Sn€•Tz\½çJÚ»^·ƒ5ÍÕìcÂÀ=ܹiÀ®²•ÚÆŸ¬yžswúB=w—Ñhšül›'=É~Í6¼Ü L‡}ì@¬t‡âU{'øžä!B/IÞÀç1”hÉò·\ËÓˆCåù™4Í9QÊÞÅ®‡’Òè‚õàšTð’9mIºŸà?ÈÛØp·eOÃoúJ#øê³îk­Ä`([ ×}¯þ|‡‰ùè}b?;·yƒ¨äXŠäºÕÉÓo(!2ZöK›~Ù8dê×wµb!c©cñ¦jàÐzš<äZbÚhïzÏ<þ þÓœêt¹*9¤"m¨8{El³‘Žï¤Vïm :ÇU÷TÁj%üyL©àUÑ dhy-‰¢yÙŠ­ë›ÐëniŠ#ÍžÆ&É=OÖaèTÅ –Ç (—žö9J4pA’|:ö1ƒðÃÇfÖÙO¾Â¹Žv£éÜæûWèêžxá\ÉXž6ë€Öºo”l§[‚ºsíÞÆ,Ò»ƒ÷Y†žÌóî0ÅÒEÜ­¢4kw‚”$¬ÿnyŠKžU÷ZÖóOè·¢ƒsÑîñ¾öºa?þë:Þj8á]y·—á%ÅÉ1ÿªc:|U~ŒEwE60â‡ô­³4á%©èh嵎տ³âñÎè ÊÃ:Á“™Û3Yë fwñN §I§>à܆"ªc¤DT Tû\ý&€ª Ö¦¤å·¨!}ÃþBRB‡èºLêÅw«|~è«©u?ËJÕ“î~ê£ë tZüó7&Mœ*8ù×}VJDPeóÄí}©á³m ©Äeè§áqæ´â¬¾gÍiŠaª35GÜ ú¬™çEöfÚ &vçüw¹OæÜ`nÊï¤Bí뎋µna–½@£þU¢Axí˜Ù¢å6 EóÐÿÿÍÍÞ B“‡ãù&îÄB€€:®êüóŸÿáùçŸÿÉÿäW<Õ&´'šò„@k! .¹åÔ`VF¶ y©xÿ1»Â­|gÃVäɶh'n¬gRæj™+ÀœØWU‰‰7¾CïW”v0&G×þP똉\gìfž¥êÒ ’(ó Ö’Ó?eì~èñ ޽]ååówÌb h];qÍÈQóWàìµï5»Ye¿fcö²ÓîVÔÕÄvÇá:˜Ç`¥yìម|̺\ù0›°¤uß´¿ànĆŽuXFÝp=a=¸ ¢I 35dqg™Íc× 0¹ÅŠ’myLwñ¢ù$yMŸCÒ"¯ÚƒéÄÍÒb-ÜEoæ‹æ‰~HÂ’«s‘tãø®ŽvÊÂÕ¶ê¸è¡û2÷Æ,æ X]'+r,E¥Õ ñ_Ë’ÿ9¶ã䨣&«0ÕT©ºÊºZ› Ý¡CŠ[\weZoEÍÍÔõo⥽•"—Ç õhÐOÀ[ ¡S_t¹Ïìü4\œ×“]œ†áq퇠RzE$¿n‰~°|2A!Ó²³Z ú6ÿ-1>Vͦ’Ç×Uä [‘Ê)¥,{Hª³wm:q'ñOŒ–CY`¸¾§Aþ¶óê=Ì)+2_ó¹…=ˆ0WêUn*€GyãY[IpV¨&J7VùW÷ŽL›óùYwq½ìÍß=N[Ky§…ô@¨^e[Máý€ ¨+jTÝØ<ö kô„€)¨¸å›$DÔ-,ÌαzsÔß|}¡òìsŸÔâ9¹P9C›{µi“¢é€é.*òÒ°ÏxJ¶ h÷7ÂÛ¡æâ~¦Ä›wfÀˆ•"Ç`Ô½BA§¯¦0ø/ÆO|j Š¢üÐàJÛ&ì±±^Ä¡#BšÇ‘0[Ï&>ýÛç{å+;•$æ9\³·pkÕüäúêéHiXI2‰/(“ÆED¬Ñ~{=¿+ë70PKõ(^V™àügWúÊQ+Å›Œ’e`Õø ªo–êv)óhå€×p º"…’¾…¼t&ÈŸøõzÖH@Њ/o倷­ü ÿkœ‹êçänAœ:NÚü¥¿väÃH)=¤8òØ%ÔæÞ³Û0 >¼œ¥â¦]…Ęs3äðD:—èo’XgSØ—È ³RÆ^ƒ©ðøª»w½ÇµIáŽÐ®äé”ìÏØA¥¿×ÒOÈ[´²RÙURõ±K~Ú…w½ÇÜS4p.‚'#@Íâgžj–Õ•"í”/Ì'áÚGã¤hf8u+½áP-”"|‘¬Ó;óÒ?мÌ:IÜ^­DVhÇCFäÞšêüKûãéé±þ.•áv‡`¥z„_bÀìyÔWn¼"à«G¥dä!Ÿˆê/Ûh¡‹ûE# øl»šuÙ¡¤_ö;lõúÏñ J•åÍlvÂø‘Õx€sèÑúÕß6`£S?äf~h!™ÕjjÛÒ7·V½{Vœ61©B©l¶%/óâ%ÿVV½æªŠw:GÐä|Ÿ°D‰ß2T^?)m_\]ÍâœÏðlr>GôçD›Gqr¬æ•D^|wsMζ•ÐrÞCån QðsÜ}p÷çb:ÍÇ´öR5$´¬|шT0XJšL>° þ9£‹mQ+ ¨åóÉÙ’Á”S=#¨l)WQúSPŒv wSKd§Á$Úy"W_ SªwõÀÖÓ±x4ê­ÉcºJ'Fst26±#Z£ß»Ž"Ûõ¡@Llø /a­×cík¨z§UM‰<β`›C¤!n}F1EDäUuèÒ™‘.™·‰ 7‰ÛÎþäeäUñdd4S‹w èJµ|ˆ9àrmšT„áTè–ž^0°ª»*º+59µ—\³Ë}Ñ=dîñÉî'ÉÈ£“ûæ’5åªâ±úýÛxç+×ó6ÚT-éÚKÍÂc•ûªÛF/FjxÎC­#iN¯# «ÎÛbj1SCí5X²ëK *ot(®Œ¼ ­üø‰wÄMGº£‡ >«ìXø\|–5nEÙÁ¡8]Sãe™p庖Ó~æ‹T†¦ nº\tQ„íÏLo±˜Ge&Œ”ä†ôx!@ÍŽí>ÛŽÈU$ás$âž³’ÌÜÙu‘‘*\>7Õ#YoÊD8 ) +:k—6‚µ½¸à¥?µRÄ)<$Ù|ƒU9H“¾@n ø\öXk‘ôä“xÄRfó¶gr«„m8¹¤6k¹½Í#{òòÇeFbR¡yY ¥Aˆã*m:âˆd G]‰ y0¥ƒ‚¥@WLÙe%æ^3³é!K¨ì³×y‰•z?`Þ¹u—=ȉأù©iP½Ç¯W£ª ªž*ûúðÉ»kÈ—‹lÛRP“äW`9Ô^kJ혤Úm¿›¬½æVÔþÀ‹'ØÖâQº\t—JF©9´R¶¥“N­I·|ÑL¡ÉOÍ5 &œHgØDp_PQÂf§­ÙÓB¯1`o3n–2Ó*ÈÝÄüý´ð ¤]ŽÉÜ:òmƒˆK±cŸµ%GY·/ÚïÞÖMݱKK~=<‰ÅÀEVó•R›1Ø%)åS’gÖŠÑÉÝiOÉ»„%yV­¼T¹~áü&ÿ°èQbk“ˆuàˆŽ<ÁNrN¢¾éííØžU;jþÕé¨GÒíz"“ç‹Ä®¬?’¸p#ºþÀ¬ë–×ˈ®&Eü[>oz\¬PìŽùðxÂúçÁ8£ß™Nº©ïE$¿VˆÄhÂé©!Û$áâ38½ˆõ€2ö¶¬õCË ð¯å4?Zí %¤lVïsè©–È÷l”‚ì#óÜr,QÓ½Ýo‰qÜgòu=8þàèB¡Ïlµé܊ѤFºþhzwâ>àP3‹Û×8óLa“K>ùÅ8¿§× }\ÿ0ÿ!iáÝû#—: 9~ÝQX‘BuŽ »ð9÷b¢î¤x‹nÏyõÅ!Í${<‹i/4"q›Üª‰Û˜ ¬«¦¥:^mXwaƒ„F=Zȋۅ´«¡µ¸¨ÍíQ]6Lm8CkÕ¼ bs³‡‡_£?ü³¦/ÐB (ÅKó5 … ^ xÐ±Š£Åë¢Zþ+Ù£ŒZ`Qµª‡vVÖ›"Äy㈽ ÌBÿ>¸úÌNz„#븭¬© [˜¶H<•ã„hªlPY¤ ¹jë8k_A‡9­ÌÍ ®y’<šŠo}•HނРn¢¤ó­§Ó¢AwQÖ!³hpûŠEäÅ(–6œÛú.Ü熸¼XkcÄ„MeXô~cá®9“·nÇzÙã`9AÕlwÀš«Û,㜜ÌÇW±ö‰Ò¥/dz$y²›iÝ'üÖm¤ p)´¯Æœó\_޳ouˆÔ~+¹þöYçÄ]!„}äî½ù¸¡wÅ ºo•Y/ùæÚ¶Y·ž¦•×}À%‹f 9ƒrá¶Tr³¤LFŽÖkû/DmBßÈ›?qR…~]í~‚ü߃nìÉ Ý›ÑÌèÜ-û~ÛØóÐ1b Þx”ü\¸i´[©ý&{—ÁìÔ¬Pïþ´Ø0lõ‹#m¿çñDÀµ§æ†Ã¨Ä+u^ɵ«{ Mä &ŠjŸm—È×{ô ö€¼íËÄ­{»_>*ñ*¯Xƒ¼ïÁW*=ÇŒ©Tr·ô 9)A~7nÊwÎ÷GñL*åÑZeͧœ`bI~mÎáä§@ü$Zž«º\–F+ù/%Ÿtæ1r$~ꞣwœ®Vpù S¦¶ÁŸ4ÂÝaôû’ŠºI,–Ý%çn€Þþqcs=kæ¸SÖ {7Í»J³‰66‰<Úî7Å+7®ªåæÍÆROv»rœîd¦máÆ¥Ü¦µ_Ù¶ZÏõº±O”¾-û˜ðÃþñÇ]õõ\¯IÄž¬´U:J^·òžàg-{”8ýÁ²ƒèà°yü¡¿À”n—kïä°6vÉ\ª¹E²ÄeèN~Ïú¸u˜I¼‡:RÞ2âY©"¦·÷zVÓ=úÒÿÛ¸KÊ{W³ÜG¾ZÊåõ­û7‘kkýòýûÈýjý{É7ÿ5ä„y·_ùƒ?h{ˆ‡‘ŸúÂÅ_!äÏìÛv†çƒÐš:¡ŸÁ³#Æã襀U/¸"Þ‚9L%ï“’>ŠúEP`ƒØàIÞ6÷–z§>$÷ˆS¯dpßÖô‹¶lþ—·Ø¦Âö‰ŒPl9|ñæ[êø¼›¼™pß Õ²ZþÏ}xùˆZûüÏi¶ÔÛù Ë56´dößä‡çžRvTë ÿÏ9mÉ<©ÊIöÄ£ûI­:ýi=-gĈ™ŸéÉG ãGZðiV§¢ut¾ÿ2ÌÝ£רj¥Žr^S9Ÿ²«¤ùñ3-¸xK(öª²ÙÆâ,‡´Ãô] ´T×a›r-…‘êÄ<«1ë—¢dÎè>ŸÎrö¾L¶"æs‚ÃìŸ\­Ólª4²Ö¸Ûà§Õ‚9ñ-3ßQLÜ´Á·–;(±Qñs°5œû51dë–;ÖMÉú[ÍO¥– ö)ù)Ê‘CöŸ‡(%N¤ùÑEKD¯M#XŒ¶ßˆü˧¢Â©°|~joÝÔãZóOਫ਼»á`}k?~é8&vèpºNÎ~B=A'÷*ù'÷‰¿Æ¬ï ù¸ÿdÊM]‘¼AœnåÂOß4LO~É0úÌ-Üvôä™?‰·7u„Ědž&ðlæÛ‡¶ÈQó¸#rü_¸8ö!¡*š›JÓdrûÑ‹‡h¿mµv€-ÈuÐê¾rj1ä3FÃtZp'ˆ|‹Ý3ÐSÁkíJ®¯¦ÖT‘Ê po|…–Á‰wª0¬Œ UÆxE+Îå‡Z¼²òÝrª¶T]$/Hª Æ$À ÖþœŸïÖ®ÝÙã fOs’ýBAfJÀ*Ê™…SÇ«¼,Ëgí©M6’ÙM®ÉÇOmÉ‹—‚—ñÅŒu¨J,·¢<Ÿâì‹0`j‹N™ÌfƒzávãP}âK;p(@‚ÊD„B!ÉK{‘²û—d¢^á¾pZÉí÷`ªö–ôÇ߬ rÜÞþi•¾ŽôG6iF¹6<äTg Üwk‚,¡RSqqׯMí„ ’ð× òОZ%»ZQ7K‡lͬáu¢o„ºU€j3 ü %Ël8Ra@Hö ¤ºä,`¶¾KÖ½¦Á£%°58hFýøÞ×Úúªk·:¹¤š˜¸Á€)ãE—Ò‰W¡m(ÆHt¤€+Ò–ßsàÃЄn÷ùÕ[çRráeµÞl\Q6ºf‹³/„/5ñ Ÿ×*VhrF %ˆZÛýèÌs:b×ð©ä⠾ꑩ\öõ9š}™µ^ò`°²Å?úÄjQ Ú£§šLCeãóŠ­ŠÅ`ùÁ.š¡F¶§‚€G¥øÈ GN·øÂUøà çÃlÇ#,ðþ¾³jÄN°I…Sß8AŽhÕ‘¡"¿™èUýKm¨kÅNXäì h@<ð®Ÿv_[_²##‰'* Éð™ajÑÁ삪ý#xX¼1çŠÉ‹ú•ÜÑÉ„ð¼ý¹§©ã'Ý(¨HØuಂ®ì[G -îB¦[FOÇ(æ8­í…{ jYº(*d*öMÙÅ¥1|cë<Šáô6cc£dôX*Ù™Ú6'™^,’õ¡’ £« .Ô¡C )ËIýÑ8yϵNéÑ$kŠë?¾ËgIDçôñòè‡/¡ú¼}M¦ïˆD×_tAw¡²]R|Ï*-µC¡;Ã¥‡£ó'Îï?¡Å‘S‡Ù/ˆEüÈbà…i‰j²âÃÂAKróLw!‹âóæ‡Ì$Ñ*eïœfÒm¡¥ÎáÈ» *_ß µqz@0ÒðMMÚk'‚/,v;"ä‡eˆ‚ RÏž~ÔÅ-Ú!F‚÷vd{V•$¿ù¡!¸:ºŽW|{„–rÝIÒ*^Šê:ûøV×A¬¯©œ2øPSÆ®èÑ:¦7ŽD,xA\ hÌ·»ß` ¸¸‹Ñ¦ I óK)µ®v¶1‚ 4Þu¬—2³,AiÊkàò¶ù €˜´ƒoÕ4!?±õo]vÃÅã È }ÄÖ¶täó¸.ŠT´Ì—5†îäj’âëAG°Ç±ö8" ›3‡*%©6Iÿ ˜FÃê¬Ü¤®À˜(^Ž&z“yé -wáAÚ:µ¨Öyíª-PÜ—mšk¥ôFˆ;Ú©ÿ4Þ°σ((<3rXúd'•yÎÞ]_´–úë¢pã"sp@S×øùÖl³EyÃ2fO³«H†»G½Â×fxäÕJá`åÎÓ ½Žß=ÊŠûBç¶mã­{Äo†GJ)œhÜ”´Žj’,o¥œÔUÈW+o\ ëêÉIîgÕeL9ÂU=tè§'"æ+½ÃQ=¶³:Å`7îvð»äNàÄåÏÖ ÿ‚ãËMZ½,ƒ$JœÒçåx‹å‘@=gžÀýâËÑÅÐ/7òã–µ:“ºå?•µc7Ú×r1Â<®6¡(hH<¡çüÌ;Ö@ØR™íUû×w¿ ]¨´õñûw¿’µsp14ê~° 2†.€M*±ƒ^Þ¸íñ³[’+š0$¬U°ýpXÏ“æOr6ÎÑ=ù÷Þz«©’þ1nűëˆF]«ËˆÿD§Os z—ÿÞÊ/¶¡ §]ç$yGß)Üýk+'«ð:ä4é?9 HƒÂŽø·[cä™~Ü¢?§ÕÛ]O}ùíg*òB‘Ánû#NE^zówH “J8äÖé¯îùK3ÿ«œs.Ž\®ýØc¨*Çç߬r–7Ækß̳µ6›øVwõû#íXžù¸%} ÷Ÿö¿ü׿޵OØšýoöÔ‰Üþ>£Ãª6ýüþw=Æepüå§ïÆÛ5Kžþ‡)œÿwE[m|NiŠn÷Õ]|½þ㊬2®þª‚[çX3Mgëîf™JÞ <ЧL½Hjäðû†À‘w#Eù/#úÈïÕ:RöÛ¯ 7ETNÒ\|äÂæ>_Y…ƒOAHbQRªÜÛ7·Â글s¹…©ÔZ¿º/´EªXDý'ÉÓ=þƒä$ŸlüÔÇ~ú1Û<Ä × š×†«L· œý10ðI `\éøòMš2ðþŠJ‰m=è ÿƒÔ‰¡ÛhÓÙN åNaÓ48ËiU‚ìµS2•u€kw+p–+>,Ží3Pµ.ïÝc”xÖ+¤KòõÛ/'a’7YOs£aVjǧ[žøÈ³¼Õ¾ÅöÆÚ¥R‹1)߸áÄл¿(ÿdÑÜ¥BTLF¿; L¨ F@·&'B^2ð,¤‡½B7+Äç–<ú: Èx/RA_‹Š]+e >“†iž±ˆ|ôí»g7y’BTLF +A]+ˆ|BF@†¤¿; ú: û :÷FHDB6ýþÜÇCLASSDIMENSION_SCALENAMEy _Netcdf4Dimid 0REFERENCE_LIST6datasetdimension Ea scale_factor  ÷Ì’¹ add_offset  ?t>unitsradaxisY long_nameGOES Projection y-Coordinatestandard_nameprojection_y_coordinateFRHPÿÿÿÿÿÿÿÿÌYq (w·t¾FSHDÌPx(ê50ãwúBTLF¿; L¨ F@·&'B^2ð,¤‡½B7+Äç–<ú: Èx/RA_‹Š]+e >“†iž±ˆ|ôí»g7y’OHDR-vúðYvúðYvúðYvúðY ?@4 4ÿ*žG5bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ d long_nameEScan start and end times in seconds since epoch (2000-01-01 12:00:00)ç‹”®ŒŽ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+FHDBÇp²r¤CLASSDIMENSION_SCALENAMEx _Netcdf4Dimid 0REFERENCE_LIST6datasetdimension Ea scale_factor  ÷Ì’9 add_offset  ,e™½unitsradaxisX long_nameGOES Projection x-Coordinatestandard_nameprojection_x_coordinateOCHKÿÿÿÿÿÿÿÿ l0REFERENCE_LIST6datasetdimension «s=qåFRHPÿÿÿÿÿÿÿÿ.C| (Ñÿ•ã"FSHDDPx(aØ%%©ÐCBTHD d(¯ˆ""‰ç_Gò˜>eS.=–&¥»BTLF +A]+ˆ|BF@†¤¿; ú: û :÷  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóBTLF#  M‡< ! ¸@M¥S4 &~?zžT9fRЏ‘<ø}½N’=ÁtF€+ ”}(F=& ù¹(FÒ]íô„TrHŒônZ=Ýìžc5S{Î2Q‚Å„ckÐ<ºX@S°K'ç0-««$ ïºa°ô)–Ý·Ó!Åí/ºPá½Í½Î+˜ã.p…ÁäK5÷ò.êÏK Ø”ó/8«ðûu]ý‘àûg(´ï~ÿf`ÈBTLF 5K'rHºXÁÓ!ô).K5€+ «$ ÏK # =& ckPÎ2fR¸@ø}u]Ò]/8g(?=Î+S4‡<yLì4OHDR-vúðYvúðYvúðYvúðY   *€ .•.ï/ÿÿÿÿÿÿÿÿ”ìÝFRHPÿÿÿÿÿÿÿÿ]ˆ" ³¦¡ö»FSHD²Px ·æ,,ÿÂ1BTLFùîã(~}eõ‘FÁ,lÌ·K%dT O·Q!6[Do"¸+½ÓÒ" 2‰ &]'g**&h(}'=Ò÷3(+,›¹(6' æ *Š1º(U;ë)` ¢G„9ÀUœ%Ž\.!ú _n +-Hiv½4H4‚p,oû‚ÍœEˆ+kA@Š»1d°Y•RÆ3h¥Ûx¶)þõ¹¹*ÎåÔRH»Má@,¥Rsäl!Áöéi!qNÕ÷í3§…¬ú) JKBTLF=Rh()¹) Í ë)  .! Oi!Š1»1+[1Î@,l!+¸+ã( +6']'„9½46K%p,œ% Á,!í3" 2 &(FSHDqPx(0è´²BTLFh'j ?L¨ mLK¨X ÛIà`A[¹WמÁ`XY5â–$I£ñ³U4ú×Ö‰R@ß æâP~ BTLF ?U4‰RÛI$ImL¹WXh'˜CFHDB.=a)µ long_name GOES-R ABI fixed grid projectiongrid_mapping_name geostationaryperspective_point_height ?@4 4ÿ8iAsemi_major_axis ?@4 4ÿ@¦TXAsemi_minor_axis ?@4 4ÿ©ÞÄ?XAinverse_flattening ?@4 4ÿï´ë”¤r@latitude_of_projection_origin ?@4 4ÿlongitude_of_projection_origin ?@4 4ÿ`VÀsweep_angle_axisxFHDBˇŸ÷¿ÈyÿxHTEDQFanumber_of_time_boundsÓ.number_of_image_bounds§0t|2 time_bounds«s goes_imager_projection¯† y_image‡, y_image_bounds› x_imageWœx_image_boundsÄnominal_satellite_subpoint_lat¢Ÿnominal_satellite_subpoint_lon-¡FHDB±{Ü-IÃnaming_authoritygov.nesdis.noaa ConventionsCF-1.7Metadata_ConventionsUnidata Dataset Discovery v1.0standard_name_vocabulary*CF Standard Name Table (v25, 05 July 2013) institution DOC/NOAA/NESDIS > U.S. Department of Commerce, National Oceanic and Atmospheric Administration, National Environmental Satellite, Data, and Information ServicesprojectGOESproduction_siteNSOFproduction_environmentOEspatial_resolution 10km at nadir orbital_slot GOES-Test platform_IDG16instrument_type&GOES R Series Advanced Baseline Imager scene_idCONUSinstrument_IDFM1 dataset_nameIOR_ABI-L2-ACHAC-M3_G16_s20172982052203_e20172982054576_c20172982056226.nctitleABI L2 Cloud Top HeightOHDR-vúðYvúðYvúðYvúðY:   *ð|Ã1Qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ d long_nameEGOES-R fixed grid projection y-coordinate north/south extent of image LDIMENSION_LISTç pÁOHDR-vúðYvúðYvúðYvúðYQ   *ð|Ã|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ X long_name9GOES-R fixed grid projection x-coordinate center of image :standard_nameprojection_x_coordinate unitsrad axisXÁ¼x OHDR-vúðYvúðYvúðYvúðY8   *ð|©Qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ b long_nameCGOES-R fixed grid projection x-coordinate west/east extent of image LDIMENSION_LISTç€ÄýÀOCHK |0REFERENCE_LIST6datasetdimension ›Ä›'SOHDR-vúðYvúðYvúðYvúðYo   *ÀyÄ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ V long_name7nominal satellite subpoint latitude (platform latitude) +standard_namelatitude @ _FillValue  ÀyÄ (units degrees_northÏkLiOHDR-vúðYvúðYvúðYvúðYq   *ÀyÄÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ X long_name9nominal satellite subpoint longitude (platform longitude) ,standard_name longitude @ _FillValue  ÀyÄ 'units degrees_eastºIüUOHDR-vúðYvúðYvúðYvúðY   *ÀyÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ b long_nameCnominal satellite height above GRS 80 ellipsoid (platform altitude)ù£º›.ùFSSE]ˆìÊ6CJú²OCHK Cstandard_name height_above_reference_ellipsoid @ _FillValue  ÀyÄ unitskmðý^ãFHDBˇñkUónominal_satellite_heightº¢geospatial_lat_lon_extentè±outlier_pixelso¹minimum_cloud_top_heightFÌmaximum_cloud_top_heightYÏmean_cloud_top_heightlÒstd_dev_cloud_top_heightyÕnumber_of_LZA_bounds†Ønumber_of_SZA_bounds©Ù&algorithm_dynamic_input_data_containerÌÚ!processing_parm_version_containerHäFHIBˇ•³¤›éÿÿÿÿÿÿÿÿ ¯ø–FRHPÿÿÿÿÿÿÿÿ¸µ (F¼@VÞFSSEµ¸HA’4uBTHD  d(课Ž5FSHDÛPx(©4%%Q§fFRHPÿÿÿÿÿÿÿÿ$©(FȉكBTHDd(V©+7ò—BTHD  d(V«~"²{FSHD$Px(h4´·BTLFÓ7L¨ ë@·&'6ôŠ$°,é,©B^2ð,M#HÛëO CÈx/RG? Èõo ¦ šƒ¨+e >“+ iž±Ò8 Ëâļ†L Ë_}Ép9ì=ÍL\c“‘éªp•BTLF 6L\¨+Ó7 CM#p9©Bë@+ G? †L Ò8 ¦ °,«R ÂFRHPÿÿÿÿÿÿÿÿ¯»§(.q¯?ýBTLF§JL¨ 5ôŠ$«szàC4/ òêB®< èKJ#HÛëO.Èx/R‰b’SÅfDj šƒñ+e >“¤iž±ê> y÷Û´ 8 Ëâļk˜GÒÄÀLË_}Ém7ì=Íu^ŽyÎëg@GæÑ(MààæK\c“‘éEf~@nðG-ˆRBTLF 5K\ñ+§J.J#m7¤ÀL 8 Dj ®< / ê> (Mu^Ef«sk‰bëg6SSOHDR-vúðYvúðYvúðYvúðY   *ð|ÿÿÿÿÿÿÿÿ è¦Î4¥qX¯FSHD¸Px(z§æÅŽ­BTLFKL¨ aTá°5Û7 èo˜)6 {É\/üKlõçBGJ°¹«O]Tx£Wp T•Ó¸x±KíC)á‘JµNMâµTª$ÙñI°×BTLF KaTµT T]T±KüKGJ‘JÛ7 6 ÖlË+OHDR-vúðYvúðYvúðYvúðY»   *ÿÿÿÿô-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ o long_namePnumber of cloud top height pixels whose value is outside valid measurement range 8 _FillValue ÿÿÿÿ unitscount X coordinates7local_zenith_angle solar_zenith_angle t y_image x_image 8 grid_mappinggoes_imager_projection Ú cell_methods¸local_zenith_angle: sum solar_zenith_angle: sum t: sum area: sum (interval: 0.000280 rad comment: good quality pixels whose values are outside valid measurement range only) where cloud¢6éñFHDBè¦T´² long_name,geospatial latitude and longitude referencesgeospatial_westbound_longitude  Ä Ãgeospatial_northbound_latitude  "SBgeospatial_eastbound_longitude  ˜·DÂgeospatial_southbound_latitude  ª`Ageospatial_lat_center  ZêAgeospatial_lon_center  ß϶Âgeospatial_lat_nadir  geospatial_lon_nadir  ³Âgeospatial_lat_units degrees_northgeospatial_lon_units degrees_eastFHDBV­Úvùqflag_meanings good_quality_qf invalid_due_to_not_geolocated_qf invalid_due_to_LZA_threshold_exceeded_qf invalid_due_to_bad_or_missing_brightness_temp_data_qf invalid_due_to_clear_or_probably_clear_sky_qf invalid_due_to_unknown_cloud_type_qf invalid_due_to_nonconvergent_retrieval_qf1percent_invalid_due_to_LZA_threshold_exceeded_qf  Ž\;>percent_invalid_due_to_bad_or_missing_brightness_temp_data_qf  6percent_invalid_due_to_clear_or_probably_clear_sky_qf  ^âÂ>-percent_invalid_due_to_unknown_cloud_type_qf  2percent_invalid_due_to_nonconvergent_retrieval_qf  #_7FHDBV­½Š± _FillValueÿDIMENSION_LISTçç long_name+ABI L2+ Cloud Top Height data quality flags _Netcdf4Dimid standard_name status_flag _Unsignedtrue valid_rangeunits1 coordinates+local_zenith_angle solar_zenith_angle t y x grid_mappinggoes_imager_projection cell_methodsHlocal_zenith_angle: point solar_zenith_angle: point t: point area: point flag_values number_of_qf_valuespercent_good_quality_qf  ”û?)percent_invalid_due_to_not_geolocated_qf  FHDB&¨KßIÉ _FillValueÿÿDIMENSION_LISTçç _Netcdf4Dimid  long_nameABI L2+ Cloud Top Heightstandard_name geopotential_height_at_cloud_top _Unsignedtrue valid_rangeúÿ scale_factor  ©Cœ> add_offset  unitsm resolutiony: 0.000280 rad x: 0.000280 rad coordinates+local_zenith_angle solar_zenith_angle t y x grid_mappinggoes_imager_projection cell_methods„local_zenith_angle: point (good quality pixel produced) solar_zenith_angle: point (good quality pixel produced) t: point area: pointancillary_variablesDQFOHDR-vúðYvúðYvúðYvúðY÷   *ÀyÄø-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 7 long_nameminimum cloud top height Cstandard_name geopotential_height_at_cloud_top @ _FillValue  ÀyÄ E valid_range  @œF unitsm X coordinates7local_zenith_angle solar_zenith_angle t y_image x_image 8 grid_mappinggoes_imager_projection ® cell_methodsŒlocal_zenith_angle: sum solar_zenith_angle: sum t: sum area: minimum (interval: 0.000280 rad comment: good quality pixels only) where cloud3êOHDR-vúðYvúðYvúðYvúðY÷   *ÀyÄü-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 7 long_namemaximum cloud top height Cstandard_name geopotential_height_at_cloud_top @ _FillValue  ÀyÄ E valid_range  @œF unitsm X coordinates7local_zenith_angle solar_zenith_angle t y_image x_image 8 grid_mappinggoes_imager_projection ® cell_methodsŒlocal_zenith_angle: sum solar_zenith_angle: sum t: sum area: maximum (interval: 0.000280 rad comment: good quality pixels only) where cloudõS!ÂOHDR-vúðYvúðYvúðYvúðYñ   *ÀyÄ00ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 4 long_namemean cloud top height Cstandard_name geopotential_height_at_cloud_top @ _FillValue  ÀyÄ E valid_range  @œF unitsm X coordinates7local_zenith_angle solar_zenith_angle t y_image x_image 8 grid_mappinggoes_imager_projection « cell_methods‰local_zenith_angle: sum solar_zenith_angle: sum t: sum area: mean (interval: 0.000280 rad comment: good quality pixels only) where cloudø¼éNOHDR-vúðYvúðYvúðYvúðYÌ   *ÀyÄ40ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ L long_name-standard deviation of cloud top height values Cstandard_name geopotential_height_at_cloud_top @ _FillValue  ÀyÄ unitsm X coordinates7local_zenith_angle solar_zenith_angle t y_image x_image 8 grid_mappinggoes_imager_projection ¹ cell_methods—local_zenith_angle: sum solar_zenith_angle: sum t: sum area: standard_deviation (interval: 0.000280 rad comment: good quality pixels only) where cloudíFSSEC|ù=ê¨OHDR-vúðYvúðYvúðYvúðY!  Qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +CLASSDIMENSION_SCALE ZNAME@This is a netCDF dimension but not a netCDF variable. 2láS4OHDR-vúðYvúðYvúðYvúðY!  XQÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +CLASSDIMENSION_SCALE ZNAME@This is a netCDF dimension but not a netCDF variable. 2m»–&OHDR-vúðYvúðYvúðYvúðY   *€ÿÿÿÿÿÿÿÿéÞ{ߡߕãN ¥FRHPÿÿÿÿÿÿÿÿóÇß (›ón4ŸBTHDd(à8‹€BTHD  d(âVÇÿFSHD Px(ä//Éœâ»BTLF` u«  V».ÕK ÐØmW³ Qúªô l|‰TY VL¨ ° Nc+vh š‡É-ƒSö’cGe KÞàHi N yÂI®m ªH7Nˆm©ª«SÞh 0ÑdFh k ±e!`Lulú‰‘L¯t^i¬n™þ QºÊ«žq‰ ½)¦õi¯æ¸ÊNPÃè‰܋ɷ XÕ–ÊÖKäÚ`óŽùiÁ¸–ü0§ÒOBTLF Vl|è‰q‰ú‰ƒSÖK!``` vh Þh Fh ®m mˆmõi^iiKÊN Qi N· X Ve K° Nþ Q«¥5FSSEÇßá9DZO nJ/ôOHDR-vúðYvúðYvúðYvúðY7   *€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ K long_name,container for processing parameter filenames zL2_processing_parm_versionJOR_ABI-L2-PARM-ACH_G16_v01r00.zip OR_ABI-L2-PARM-SEMISTATIC_G16_v01r00.zipäôœOHDR-vúðYvúðYvúðYvúðY   *€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ [ long_name<container for algorithm package filename and product versionãæ´[ˆŽQFSSE]ˆñìqs2ÞOCHK ualgorithm_versionNOR-ALG-COMMON_v01r00.zip, OR-ALG-CLOUDCOMMON_v01r00.zip, OR-ALG-ACH_v01r00.zip +product_versionv01r00H1ZžOHDR-vúðYvúðYvúðYvúðYè   *ð|80ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Ô long_nameµthreshold angle between the line of sight to the satellite and the local zenith at the observation target for good quality cloud top temperature, pressure and height data production 8standard_nameplatform_zenith_angle !unitsdegree 5boundslocal_zenith_angle_bounds<^UFHDBˇ2n‹„#algorithm_product_version_container›ålocal_zenith_angle—çlocal_zenith_angle_boundsúsolar_zenith_angle  solar_zenith_angle_boundsW! percent_uncorrectable_GRB_errorsh"percent_uncorrectable_L0_errorsÏ # cloud_pixels4 FHDBéÞ¾ñ‚Pinput_ABI_L2_intermediate_product_CRTM_cloudy_sky_radiance_band_16_profile_datanull2input_dynamic_ancillary_NWP_surface_pressure_datanull5input_dynamic_ancillary_NWP_surface_temperature_datanull8input_dynamic_ancillary_NWP_tropopause_temperature_datanull5input_dynamic_ancillary_NWP_temperature_profile_datanull?input_dynamic_ancillary_NWP_temperature_inversion_profile_datanull=input_dynamic_ancillary_NWP_geopotential_height_profile_datanull2input_dynamic_ancillary_NWP_pressure_profile_datanull5input_dynamic_ancillary_NWP_surface_level_index_datanull8input_dynamic_ancillary_NWP_tropopause_level_index_datanullFHDBéÞ^köGinput_ABI_L2_intermediate_product_CRTM_clear_sky_radiance_band_16_datanullOinput_ABI_L2_intermediate_product_CRTM_clear_sky_radiance_band_14_profile_datanullOinput_ABI_L2_intermediate_product_CRTM_clear_sky_radiance_band_15_profile_datanullOinput_ABI_L2_intermediate_product_CRTM_clear_sky_radiance_band_16_profile_datanullTinput_ABI_L2_intermediate_product_CRTM_clear_sky_transmittance_band_14_profile_datanullTinput_ABI_L2_intermediate_product_CRTM_clear_sky_transmittance_band_15_profile_datanullTinput_ABI_L2_intermediate_product_CRTM_clear_sky_transmittance_band_16_profile_datanullPinput_ABI_L2_intermediate_product_CRTM_cloudy_sky_radiance_band_14_profile_datanullPinput_ABI_L2_intermediate_product_CRTM_cloudy_sky_radiance_band_15_profile_datanullFHIBéÞÑó›ï›ëÿÿÿÿÿÿÿÿµ¾KzFHDBéÞJ¯—è long_name7container for filenames of dynamic algorithm input data(input_ABI_L1b_radiance_band_14_2km_data?OR_ABI-L1b-RADC-M3C14_G16_s20172982052203_e20172982054576_c*.nc5input_ABI_L2_brightness_temperature_band_14_2km_data?OR_ABI-L2-CMIPC-M3C14_G16_s20172982052203_e20172982054576_c*.nc5input_ABI_L2_brightness_temperature_band_15_2km_data?OR_ABI-L2-CMIPC-M3C15_G16_s20172982052203_e20172982054576_c*.nc5input_ABI_L2_brightness_temperature_band_16_2km_data?OR_ABI-L2-CMIPC-M3C16_G16_s20172982052203_e20172982054576_c*.nc:input_ABI_L2_intermediate_product_4_level_cloud_mask_datanull2input_ABI_L2_intermediate_product_cloud_type_datanullGinput_ABI_L2_intermediate_product_CRTM_clear_sky_radiance_band_14_datanullGinput_ABI_L2_intermediate_product_CRTM_clear_sky_radiance_band_15_datanullFHDB±{Ž–7time_coverage_end2017-10-25T20:54:57.6Zproduction_data_sourceRealtimeid$b59c6a09-7962-4149-81f7-7002b8d9ee50FHDB±{ 3þBiso_series_metadata_id$4571d650-b00c-11e1-afa6-0800200c9a66summary5The Cloud Top Height product consists of the height at the top of clouds. The product is derived using a physical retrieval composed of a radiative transfer model that calculates clear sky radiances, which is then used to compute the air temperature at cloud top. Product data is generated both day and night. keywords"ATMOSPHERE > CLOUDS > CLOUD HEIGHTkeywords_vocabularyTNASA Global Change Master Directory (GCMD) Earth Science Keywords, Version 7.0.0.0.0license@Unclassified data. Access is restricted to approved users only.processing_level7National Aeronautics and Space Administration (NASA) L2 date_created2017-10-25T20:56:22.6Zcdm_data_typeImagetime_coverage_start2017-10-25T20:52:20.3Z timeline_id ABI Mode 3FHIB±{—ÑûÑ÷ÿÿÿÿÿÿÿÿöùªOCHKy’ + _Netcdf4Dimid 6„FOCHKÖ’ + _Netcdf4Dimid عdOCHK7 + _Netcdf4Dimid ûŒ.¼OHDR-vúðYvúðYvúðYvúðYc   *ð|Qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  long_namenlocal zenith angle degree range where good quality cloud top temperature, pressure and height data is produced LDIMENSION_LISTçr[OOCHKÿÿÿÿÿÿÿÿ l0REFERENCE_LIST6datasetdimension ú#LÕxOHDR-vúðYvúðYvúðYvúðYß   *ð|lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Î long_name¯threshold angle between the line of sight to the sun and the local zenith at the observation target for good quality cloud top temperature, pressure and height data production 5standard_namesolar_zenith_angle !unitsdegree 5boundssolar_zenith_angle_boundsü]‹´OCHKd + _Netcdf4Dimid ¥GSOHDR-vúðYvúðYvúðYvúðYc   *ð|».ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  long_namensolar zenith angle degree range where good quality cloud top temperature, pressure and height data is produced LDIMENSION_LISTçæ}:ñOCHKÿÿÿÿÿÿÿÿ l0REFERENCE_LIST6datasetdimension WK³üˆOHDR-vúðYvúðYvúðYvúðYK   *ÀyÄpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ P long_name1percent data lost due to uncorrectable GRB errors @ _FillValue  ÀyÄ E valid_range  €? "unitspercent 2 coordinatest y_image x_image 8 grid_mappinggoes_imager_projection R cell_methods0t: sum area: sum (uncorrectable GRB errors only) OHDR-vúðYvúðYvúðYvúðYI   *ÀyÄÃ.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ O long_name0percent data lost due to uncorrectable L0 errors @ _FillValue  ÀyÄ E valid_range  €? "unitspercent 2 coordinatest y_image x_image 8 grid_mappinggoes_imager_projection Q cell_methods/t: sum area: sum (uncorrectable L0 errors only)êTþÊOHDR-vúðYvúðYvúðYvúðY   *ÿÿÿÿP†ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ I long_name*number of cloudy or probably cloudy pixels 8 _FillValue ÿÿÿÿ gWŽ·BTIN@,¯ŠP o–h()¹) Í ë)  .! Oi!Š1»1+[1Î@,l!+¸+ã( +6']'„9½46K%p,œ% Á,!í3" 2 &(BTLFl!+¸+ã( +6']'„9½46K%p,œ% Á,!í3" 2#RSÝRšl!+¸+ã( +6']'„9½46K%p,œ% Á,!í3" 2 &(OCHKÇ. unitscount 2 coordinatest y_image x_image 8 grid_mappinggoes_imager_projection Ä cell_methods¢t: sum area: sum (interval: 0.000056 rad comment: based on temporally coincident intermediate 4-level cloud mask produced by clear sky mask algorithm) where cloud¦P…Lnetcdf4-python-1.5.8rel/test/CRM032_test1.nc000066400000000000000000005251041413751447500204070ustar00rootroot00000000000000CDF  longitudeðlatitude=rgrid*gtime  ConventionsCF1.0sourceARPEGE experimentDA9  longitude units degrees_east©œÐlatitude units degrees_north©œ­lrgrid compresslatitude longitude standard_name(atmosphere_cloud_condensed_water_content©œWtime unitsdays since 1961-01-01¤MSLP  standard_name)atmosphere_cloud_condensed_water_content long_name MSLP PressureunitshPa cell_method time: mean grid_mappingrotated_stretched_latitude_longitude rotated_north_pole_latitude: 40. rotated_north_pole_longitude: 12. stretching_coefficient: 3 coordinateslongitude latitude©œ¨|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ð|ðnetcdf4-python-1.5.8rel/test/issue671.nc000066400000000000000000003610301413751447500200030ustar00rootroot00000000000000‰HDF  ÿÿÿÿÿÿÿÿâÿÿÿÿÿÿÿÿ`OHDR ""ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ =†"#>#numRows=TnumCellseU  soil_moistureV[!Ç2ÝFRHPd#“²I <( (±x’h}™BTHDd(J=ˆ;§0BTHD  d(N=½lˆBTHDd(²C¡ÞË_NCProperties version=1|netcdflibversion=4.4.1|hdf5libversion=1.8.17BTLFŠ#( ýèÈ›BTLF¨†aìƒ3°ø,j9¸«1P_V‡QM¥ú L-FÜ(ô D'Í!½$z?è5[%bL5Wc,l3Ý-9JvÁò.s)¯Ý²1~L2+,2ž k#<7…: FèBTLF 4J0z?¹8ñ0!7X.†NÔ_ 3A t" –- Ãm 0W‡Q9Jƒ3¶0æ42L3,«12H+6õC¤FSHDÕPx(T99¬’«BTINL3HÌc<F L.#ý¦²ERLçÿ¨P_V‡QM¥ú L-FÜ(ô D'Í!½$z?è5[%bL5Wc,l3Ý-9JvÁò.s)¯Ý²1~L2+,2ž k#<7…: FèBTLFþ= —öüªX.ç0-«œ1Ê7š¹b L+¡:zº2L1?»Þ T0c·dÃîz}#ÇØ(<ég\ËÃm îqLÒ¬KÁÞ| D)BIãF: ÷ä¶[9Vnyæ¶0 œ¡æ’ L/OVí®L6l>ñîæ4íûð; 2!|¶,ó¨ L&þeÏó!7ý‘àû s$啽üÍ1ÿ-øü3A Ñ·×ý²®;BTIN s)²GPöXàCz?¹8ñ0!7X.†NÔ_ 3A t" –- Ãm 0W‡Q9Jƒ3¶0æ42L3,«12H+6õC¤BTLF œ1Í1þ= ; 2!m 1"ž k# s$| ,%¨ L&ô D'8 D(| D) L*b L+® L,ú L-F L.’ L/Þ T02L1~L2ÊL3L4bL5®L6T7jL8¶[9F:À >;Ø(<}¥‰BTLFt" Џ‘<ñ0tFÊL3 š€F L*à4°KjL8ñMJ0æšR2íô„T†NŒônZT7ˆæ^8 D(Ny±_2Òbgdm 1"+ˆŒdÀ >;mIi–- Ûê³H+´M‚L4’gD‚Ô_ Q‚Å„40ñ7й8Ñ~t® L,΂N™| ,% ÊÚ¡0WÍ/`£IŽûÓA Ñ·×ý²®;FSSE²Iþ ú$Ü©WÏÐv€OHDR \ \ ! õnÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0CLASSDIMENSION_SCALE `NAME@This is a netCDF dimension but not a netCDF variable. 3164ÔšÑxOHDR RR! ÓoÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0CLASSDIMENSION_SCALE `NAME@This is a netCDF dimension but not a netCDF variable. 82ž[ÝÑOHDR (\ R\ R  ÿÿÿÿ deflate‰\ R ªY|­Í€‡ÃYÞç` c“‘éKïñBTLF BXBšBÜ@=Y'€‡/6L‚, ®9 ç` xíOFSSEˆZ¹GD›LèGCOL=T=TeU¨OCHKÿÿÿÿÿÿÿÿp1 ¸tREFERENCE_LISTdatasetdimension VV͇°OCHKÿÿÿÿÿÿÿÿH ¸tREFERENCE_LISTdatasetdimension V³ÿ§FHDBªY®]x _FillValueÿÿ valid_min valid_max'standard_namesoil_moisture_percentage long_nameSurface soil moistureunitspercent quality_flag_soil_moisture_error, soil_moisture_sensitivity, rainfall_flag, correction_flag, processing_flag coordinateslat lon scale_factor   ×#< _UnsignedtruecommentSoil Moisture (0 to 100%)DIMENSION_LISTõ^õ^FHDB†"Gªná qa_percent_degraded_data  qa_percent_missing_data soil_moisture_granularity#Along-track/across-track swath gridsigma0_spatial_filter_methodHamming windowFHIB†"…}y±tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿw¹b0FHDB†" @rD¡ start_orbit_number y  end_orbit_number z  orbit_semi_major_axis ÿÿÿ orbit_eccentricity × orbit_inclination Œ rev_orbit_period Á equator_crossing_longitude ÆÖ¤[equator_crossing_date_time2007-06-01T10:20:28Z subsat_track_start_lat bé subsat_track_start_lon 4êÿÿ subsat_track_end_lat 1 subsat_track_end_lon A£ÿÿ qa_duration_product ´ ZFHDB†"d g¢processing_level02 product_typeSMRprocessing_typeOprocessor_major_version1product_minor_version3instrument_calibration_versionxxxxxformat_major_version10format_minor_version0 granule_nameCASCA_SMR_02_M02_20070601105400Z_20070601123259Z_R_O_20090320155427Zparent_granule_nameCASCA_SZR_1B_M02_20070601105400Z_20070601123259Z_R_O_20081221060941Z contentsnrcs native_product_size ¦}production_date_time2009-03-20T15:56:18Zstart_sensing_data_time2007-06-01T10:54:00Zend_sensing_data_time2007-06-01T12:32:59Zpixel_size_on_horizontal12500mFHDB†"†ÃšXhistoryÎFri Jun 2 17:27:15 2017: ncks -v soil_moisture W_XX-EUMETSAT-Darmstadt,SURFACE+SATELLITE,METOPA+ASCAT_C_EUMP_20070601105400_3193_eps_o_125_ssm_l2.nc issue671.nc 2015-10-27T12:37:03Z - Created by EUMETSAT;reference_url€http://navigator.eumetsat.int/discovery/Start/DirectSearch/Extended.do?freeTextValue(resourceidentifier)=EO:EUM:DAT:METOP:SOMO12 wmo_filenameeW_XX-EUMETSAT-Darmstadt,SURFACE+SATELLITE,METOPA+ASCAT_C_EUMP_20070601105400_3193_eps_o_125_ssm_l2.ncdata_format_typeNetCDF4 Classic Data ModelnetCDF_format_version1.0producer_agencyEUMETSATprocessing_centreERF1platform_type spacecraftplatform_long_nameM02instrument_nameASCAinstrument_model1FHDB†"ν- _nc3_strict  creator_nameEUMETSAT creator_urlhttp://www.eumetsat.intcreator_emailops@eumetsat.int institutionEUMETSATlicenseCopyRight EUMETSAT 2015 ConventionsCF-1.5Metadata_ConventionsUnidata Dataset Discovery v1.0title?ASCAT Level 2 Surface Soil Moisture Index in 12.5 km Swath Gridtitle_short_nameASCAT-L2-SSM-12.5summaryNAsource MetOp-A ASCAT referencesEhttp://www.eumetsat.int/Home/Main/DataAccess/Resources/index.htm?l=encomment7Search for Advanced Scatterometer in the references URL keywords)EUMETSAT, DATA CENTRE, EPS, ASCAT, NetCDFNCO"4.6.4"TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙN?“\ Rx^ìtIÖ¶›™$YÆ03333N˜™™™™™™ÙaædffFÿ-Ûñ:ÞÙÝÉ7#ÇçüyrlK­N×몺·î­ªnGDüâ¿øÅ/~ñ‹_üâ¿øÅ/~ñ‹_üâÿ™?ĸGÂ<)î¡„EvþžxIˆ{4aÊŸ“‰{4!q;¨•y‰NÆ=žpxìMô¬ä‡Ñq?I(¸ä¹F{k»ö™?•À4Vç–rûÙ¼vç@ÐuY[ůfî3C”FMh)æwÓûå«Ö0ûžVPèÄìa»²qÏûYðôYᮀŠÛ¸ËÌYæ2»LL!-çw°ØÌ|ÜsaÜ¡—‰?ǵû ¥˜T É%c³±[¨Í ¤­Û( ”áÚõÅ "&t§C©‹”@m 6ãñ¸gÿ ö©œëŠ.œã 1ƒ×æ‰_y^)f¬W—Æ«çÉÂm·¨ouÎH®çQÒs¾c”ÒZu«þÒ\¬rj]{aÈèÀÑ‚Ìu 9ê 7<ú„x̾ò¸œXÍeüaLÓ›im•ˆSj¨åÓ©õµ3Æ-µ…~ØÜàz£-ÄOˆB"ß¿ îùòÈxmëK|SWò¨Ù´ñj)G[smžvL_ ‡k›ÔöƳ€ë­þVúDT71=|ÃB÷ýÈúŽ/šs礻²G!TUÙèôÃêT-P¦¥×*)CµG®s×­p¡šGá+C]ƒ‚¥°¸Wñ/3ضR^y–\R-×–sÈáò+u®¾KÿCy-6QºY¿yöضôu€y#W–7‹•ÌÞŠaIµ¸×ñ'ƒ¹Ñò}V¥®ãgH§¤MÊFÝrÑ#÷Õ»šÉõ¹Z]i7ZÚfŽSß ïøöqïbé2÷Jþ# !&QŠ(õär)ur[™¬tѸ³Ú7UƼjPÛ)‚z\h#´“`q/߃´zj~´zä|%î‘(R#éÙñÒ9™‘ *Ô®ÚFVshë,Ô¢5Zÿ`ô´N»ñ îP}¤ÒPI!7—ºÉCʼnL?Œ…¿«;ÿƒ¿HŽôãòÊ/ÅIR©ÒH«­ Ò¿¸ÕHu©“-=0ÊãÔs?2‡Y5ômŠ ƒ|¦¯Úz±öì?´NpˆI'‰BᥰQ¬«¼VË/õCz:ْµš®(·Í¶ÊÇ/•R’Èw„Âg?Œ4÷ÔÁbš?mï‘àQ¶¹0‹»Í÷>±ÓDCïx¡•ò13ŸG˜--RY ±vII8‰ùáÂ:±¦ÔDͥƽÎßg˜bÈŒ™Òõ¯#¹¤~‘s6}°”æõÕÕÁæ|ö3“\(-v’m¥Ÿ˜ï*”áOJ •f"+–*qÙ¹êÂ{a¿¼üOß¿G^#»1×ȧŸÑ7GÏÔT‘iÁü:—Ð\jO!Qo÷ – Gp»ÅÌZvõƒ,Üàó 7¤”JGy¢VSë)ÈtN&ÿCÏù;tèéYmoÐöëoÇVIÍÄßøêR!iHð7•‡¤÷Ìîœ|ÖX£ÜR •Ä{òMù…Úßì`eÔÊgé,ÔEæ"»æ?Xàß¡mðqÏ\{ªÙ ¶¿KÇÀ|Kv;…jFˆ´Gîp5§pN訴Õ+)ÝE^¬¬pæ,#Ä8j½ÄÌL¦[‡ÿÀV÷C>#~¶³š“Í™ö!ó_GO2ã9Ž{N]!m2ÊÑ+_ä,N4Y_z©–SçH°|KËi¹¬JÁK¯!^‘(×UÞ ¬ôC=¦r¯·û¤YØþÝÌa7™oÀáoó3¸Ïl~¨´UN.׫ 3µšKªÅ—z)µ+ÂCæUžÈEd¡SJM$Îäy{ºÕ×uÙ:÷oöX J¤!bf!#ƒï/´ òµ„AR1ñPE:¨îÖ,åšÌ*‰ä&ì bq?©Üù·ëü}®Y·íjn·ÕâO|ï*”áØî>)­0‚¿ÏÍgs+ùœÁ½•¿S¼S5½¦› ÉÐÚx&/‘2+¦ÑF{•¿Of—éžå.kôÁâ~ò¶RÝc64ª¹¥ûÂL±1ßÍ­n²(OvwaÇÓ “ïÛC\O=!®œúu9îÿÿûtuçp÷v Ñ›ý{¼,±G{Ëx_ºSéÍå†RG¡Žr™œh{?B«e϶Ëꉕ¤Zqcéÿüýþ¯L2z›§ÝíCjºM½‰úÆøýâ¿ôý°M˜W•éjGÃå·œð²žÂšp#lS@3}Ÿ~%``Ü3þøSÆ\½œ¼E®þá7=ôúæbk“'—7;J(îÿÚ‰ä:ðÙå'~ë‘…Œ·f*3·9®a°²[;ÿCc™*ìQ÷ÈSÄÂò\¹†<ÆOs¸aæÓeÀöj}¶0˜ÍúƒyÝr¥Ÿ:Û8h|ÕŽè}ü0ú¨o_1ç›/ÍNV#}¢ÔA¸Ì­’_ÉãbY÷)-yL„þŸø"x•1Öa«´_l;›ÛpÕvÕs²Ïj¨\Tª¨l4Ǻ*!J°¸›)L£R*ãŽUˆp+“¬b~é“Ã\샮96muFš e½šßXcŒQ3kŠã©¯)§´ zÍ¿h±»Të/žùcTµí÷Öcº6IЪk­Õ=joµ¦›ÍãV#ÔLç9è9înëÙb¯4ïèKÌü›BS„|pAv5«¬¹Á,`¥p%qqµq5xp8^ër¨yÌ*j–°¿Ö è©î.ãzg”4 š•­žîÇnÁ1½æh}­vJÃõ¹ê,õƒ¯vŸ÷? Š{-‘Ó]¹ìOn3ôLØ–À×®b¶×ìl²Ç˜Œefw³†É›e4Zû¨÷Ò(Ç”RF ý–žÛ®èDìåCã^Í?„[5]³DH4%¬§—ÕØ¥xÒÛš>ßLiV1Æ‹¬ö#¥1Ô•10_àÌX3Óþ¦T`½Àíž“Þ!ÁpÈLoï Â!¾9úŠž¢†åIí½©ä[+Ž\n½v5‰G©=ö^óÖ .´3°g@`àuoGoOï=mŸˆê!1+ ?2øJ`à >xkÀ@ï€ AzÐïSëŸÓ¯3a?ƨP0¤tÐà€}®ûîFž ¡‚ÇfvõðKú%Uة޹žc®^ö>wíZÓÜô" f££Ár0ã©îšcŒ2Z¸óz<éý’þB÷yIw»”ÜWÚf4Ó¯$ü 6¯½µ=uÌ ñèI~œ6I\ãqÌø¿p?ð€u=äÐÿm³Œc \£h@¢ä§¹ÍŠw~ØóOS㿬&% qù?ÿàü÷/~ñ‹_üâ¿øÅ/~ñ‹ÿ?@]nvVB}–€gSRzµELN¦©ØKNL·`† …ÜŒÀcw÷&kVMnÍ7å‡Ê%ô©Öí•ò?¦‹s?³Æê;y:K3bí­žÙÚoH@sy7{2ëÉyŠÝÏÈ<)­•X#•ÕSÍËž'¯úaðæ®å­ [° $­ ÓYk£æ×™iµƒÜH®‰ÐGX,úI;ršcíÝö>s&êò%}…z‡ bÞ C%CYi¬ ~r؎Пè–vÏ]00§‡ù }õ«eYµÒR~¾·„»+ÏU¶ •èäÌ~±Ð@¾ì.¬{æØKÌ“FæÀÞÁÙ[y¸wÅó|tekˆQ\u ™ù‰\Iv9w™ÇøÎ4L>d2ˆÁR˜ÖTm©_µHs†™+`’÷¤=ÇLêÐÏ vˆÜcÑJX¤}ü¡½T?ÎL{­9^O£|û •Ø¥L^à³05É0æ…ÜJy¥î—ÊŸ5D{¤©VÏ€½f%ByiÖ+…=LŸªÏ7f»>Ú]ÍI~ÔùÑ3ÝuØZbUЪ£Äc¼GIª\N3¡ô0¾«z^#TͦZŠ!?Ðò›¯ŒOÚA)±ºNÓ ·½Ã>f¾R“×­þž¹î¸WþçèxÚÎÕÀ¬gÑÖ*ŠŒëSôîj åî²-¤öJ¹€®VÒn &_”?¡¿°Ç³lÒ®lé¹Ì2úå²j›¼ãƒH¿YÓ® ^ÞÛî—öií…ºA}¦ŽÑMã¸Îk9¤l"#f”FH‡µ Fjí…Єï,×±ß{· z¹Þjyõ¶fWÓ2ç˜a^"äœßöÔ èî©ݽÔJj}Ò[ë¥ ·ÙÐì¤ßU´Ûò:©‡TWKjÕV³ 'åö¶0,p ÷œwH`s7:i9ÜÜsÌ ³MÀýP3졟ִß{oº€Ñ®òöw„uËèfzlݾapædkƒžWi Úm=¿bˆmÕÛ®-ž`÷ûõÅ•ÊÚ§ÕUl»¸{š‘]áœ9„ ¼`ùãnûaÁǃvzVY‰Ì!®Þ.Öîdwõ,uY½­êö#\]©6Ò6êGÕGJ°ÖÚ ì(¹oh7uÚ\§¶UÆk#ÍOZk­€}Ë3Ý-@ž¬açî"$Zš& Ô>m46_Ú’ë´ýÀcºy;Ø>mÕ2ûkõµZ=}½¾XŸ¡¯´Bƒn… úd…[„»ºn(ùµóÆgm§>ÏÝ- ¹ç¸çˆk„4 {zÉ©Ç7æ ãÕÕUÃ5Åߵ®o°.š;µ¯ZM-£¶PË .0Âí3Cç…`©½ ½ó,Öù¤¤±ÍxnœñÔªôÕCÚ¥ý qsèèÂÊLb5ÇYSí+®£Þ⎥¿°«Z ÍbúLýºÖMߨ¡r3ã£k–«pT&°Ÿg¬û‰»²}@ߪÒÂŒ–®$;ƒv 3Ïû!î’%ÈtÍÑj#µÎ†ËÜi·NR* ·ë”¹Äh£-TI­¥ÑJï¨xõ5æZ«½UÁîéZhe´:y:zlO›7:šé]}Š{óºŸúe$?ÒÜÛØœ¨ÎQî˓՛úc¤;È[Ìóžj.6h½†–KÏcžÔ†h¨fî³6a:jV6Bm·'{À«ÀZ^;©+·7wH/­Ÿû wßü8¯Rºf™_ô£ÚMµ¢ÚPo«íÒËÙìp£¾qSÏm4Ð×èŒœê µƒÞ×êf-7ój) Ô8åZíDð“=k´çÚáŽ×¯RNË{µÃúVùôUª¤¦R¨Eµê†•)ãå " €Ú%á±g[¼.?>?cSN(` XïÝøÉsÆ5Ú½Éîn×5L™ ×TÏËN,ÑE\._uÆîËRMå¬ä–³HC¸iâ(5BUõKÆCó•§f@Ü+ÿsü¦–‘;X”[ÇÜiÜÃÜmÝ)\Û­û­NQ)UµûRNf}Eø]˜ìDæÛ$^Ú&ü¦Œ”Ç‹ƒKÙ«7î}Ìpkžw³„ ÆkšñFËfÝ²Ï¹Š»)W6kŽ–G 2jé·´er'vU;ÅÓNÞ5Q,ÀþÆ*r5%§šR¢å}j9=©¹Ü¸§½÷ãÌè¬Øø îÑÆ­ÊÖ4K0uãuººÖȧ?T;))…Ôt!ÚËáH}¤¹lz¶0_@( ïPú)¿©ÝŒÂf+}¿kÑɹBÚY7•-zKóƒYÏ\ª¥Ð*)•&ò¥±zQUYaDœ=H0ù©²¨J¼(ñÅ®êvm¢žÏ|ï:á*¥{ýº³%³{…zTj®¯°g»û›µÅŽ…<äwsƒÅ"·PŠË¥J|r¦/]•ëÀoà“;6ÞT¾fä´RÝÍ*öyO-w?æ2>NèŸå¾Ò¹—Y۳߼&ä¦×QcÙ¯ìéÜSµu’M)$zƒ®Ã¬§‡ÓoéÞì#ñ­6È ô3æ@»¬· §¦bÆØW«Êˤ…Ò;}•«ƒ¹C¹Àd[ñ§ù'òLí£uÝ3Ô QH㘪ŒÎ–  ’#ɬä¦.7]ê LѦYeƒ{ù}vJõ¥˜Wl//ÓÆš§ó ® UžÈ=¤-ò*=³k–÷£ë¸Á'aG² ›‰IÉ<¢K1° 9HJª<”[›ÁÞ¸Wüçi$Ãä7êqµ•¾N-.N“l¥²rM­©ÝךngL¾®TàR±ËÙÌuvœ˜KØ/Œ•‡*IõZ˜d#~ÊabsRRåÛÚ&s¤±YwÉnv1û‰[%fÒ2š×õìÚ^çg&cüˆ_ÇffjóäòQ%­QÑXkn×ê½í~µè(zó,ÌÃssÆU1/ÿˆ}È^“fªõUšª$R ©¸‘É¢J¸W\gù®¶Ýxe¬6ǘkôÒæ0ë‘_¢±ïiã­äX#ȰÌL¡æ1é…ÕƒæF}¬~X-w•~ûËYŒ9Æ|µ†¼AÐÔ¾ÆV«ŸžÍl³ ·è·x,6ƒCú„ ®Hx"̼v¥ ;^ڽҽШ7PG*UåœÂa•ÚPk,Í»ˆCÔ‚j–ÔÛó­v~wp<ôFßXè *ÑõÉŠÐY½[xÝžÜVS-D(îꯙ£l^¹„t˜ÍÏ®bHv]¡µAfG3…¹ÇÐý:~CHÔÃè™êÎmÌSæ)õ1®#®JÆRñ6w­D½#Ç’©JÜ0¶.S˜éDîäÖIÅÚrsœ™Ô¬kôò[\›?‚Û¸C½¥oã”õr/Òj˜—ôâXî%×…Jí!àg¨4ìæûŽ[Â5ã ò«ÅÒú"­¯a»vÅË=cƒ<¥ƒz»w(}Ä–â2v1SG^ª¿Q&Š­„éÂnUK]e÷²ùpùª‹éÎÝf(Çä^V%Ï5¿äqáÃ5 ¹`d¡/c÷ÉÌHúŸR¥v‘R “¤#â1V#®S˜äìvß„Áä$á‹ÔXÝè:aeôcÔø/„DùCë‡>6ëÐ ÜOU•n‹¹¤"Jy)³4Náäg\a:Œ­Ë%eSS^²4;—»Ï]ã›Im5Ñ5Âî/÷ô ‰¶†® 6í:Üah$°›¨,§WŠ9•âz±ôJèÅ\ wóÏÅ×|~ƒufë‰û¥VÒPåˆVÊàåç¨,Šaƒ‚>Ùƒõ{j}ÁÍäàKJÔûbU5‹¼AlÇã¾0A Èwä'ryÛB¯å Êsä»J•×V™[ý0sòïÔZé>f¬UÝF%c„z_M«C÷¢¨‰Äì&ºšGa&7”1ÆìxP9]õjƒÕ5Úsé¸+ù…ñìIª ³†o"  ¾Ní Yî3ß‘“éšdUê5ØD®¤¾0ÍxY`.«”âZí“ñ^õÈ+ÄœüPö sží$‹j.µ’\”¿HV"31u¸DÜIº>y–Eõ¥j‘ÉZì!»²ÙØèç\ÆÇq–vÎ,éža•ºñËØ«ì®;_Ú'KêYq›?…}&ûÒåé:l:&µ”ÌBN¢ý¨4Ò}Œ^?âÇËü倱Ͻǘ(=ç²¹“ ~¯·Dž»JìÃa9€ªK6cËò•¸šL!º ÞC?´.‡´ˆ—»Ò&3·Ü×l®U’Vò)Ùrl1“ä,a.?œ:‰‡ƒÓ‘CTKfµ‹¾Àì`›±)˜{ô)îwõqˆþ¡'éü_yMœdÊkåyâLvERATKî¥XVI¥ŒêÓíÉMXb²;ŽmÅœ¥^_ÈÓd9j/ûQ¹hŠO=|¼ÄfYÈCt{Þ–N ¨ÄÄD‚¢:ÒùŦÚ¥¼XN(AO¤B©t*Zd~£ŽÈ&x'´,ÑYއl+ –ÎÊŽäiã’+·rˆ #GÐGè0!›8€{Æõ“Ò³5˜ÝdI¢fÑ£¨bä\ò •9ÞïpK¿dŸðw]B¢sA_•t5n$ß^HÉ–&b8ˆÞE&§à£ˆ‰ÔS²‘Šv iâý¾¾[ì36 PßTÞ›Z½Á¤µüSfÁ!½¹Ø4¼–æ h+|7‘…))½ø=UÅ{ì8f¿ZèÄÝqÚy­HÊ€°[MÕÄ6ÕûDáER[¸®RõxרZNÉñ̶™‰€Ï˜rQk¢õ–Ò°Ù™ýÜ^a‹#ÙGK€ÄKð)åüñÕ~Ï¥‰ð‘—øôô2t‚¾ Ÿ© _†~Ï /Èyøyx{ä3ŠPsé¯âiyX¼÷ƈˆ†Z=9HÅdˆ“1ˆýIcl6wU.¤¶@žJ eùù±xog¼žA]¯‡ë‹ÄâS JcµÃê)u¦|\¬)’°Ÿ¢±¢QD¯§™Úb!;÷3‰´åf°½KË"¥U×i~BoŒˆÀ­2Ö%åí‰^ÒÊ}EOĶŽk£â!¢ýw²¹úšÕþbíPæ·ý1ÿ}F«¿¨ð¿øÅ/~ñ‹_üâ¿øÅÿOX?!§ÿQü±ùŸc³òTŠˆðïn¶†®rºîÏIMÒTf(îÑ„ÅSì~èOfz™‘…Ð:\þ)s$•u4³Ëýx¯Óߥ:«€:äW©^‚S9ƒ_B º m„eFŸ|7KšPX‚µEd$ä›óÎñhàŸÎBþ\ž£ï¦pÔÊÁtP%*ÑWÄ}¸±Y„l^Û€zpkâ1“á¿Ì—þî #Û^C ðQ¢/×1Åè0¦êÓHà£6´‚j“Àž·»,$RÒÏš*áhL|Â1†LPO=ËÂ$eûð)¹BœHw@[AÁSHszO‚ªÉvÔ`ju_•Ɔ;õˆ‡€püe‚Š…ÒcÛÉ`òj´÷‰¢r‡Ìž€jf@uˆfxlÍjćdÛ>M_áÃä| $¢·6Ò-Aû±³LM~† d;4» ûÐØ}Gå5„O0 #"ê#‰ý(ÓÎn¸0:™‹ÎòÃßsü¿2š„?& X6ÓɈ¯Âë$ W€ÛN®i¢¸Œ &¦±ìOYþsžBCÁ¯èûèz„ž§&–q­ÆèZ0üV‡m°WØ5¬%YŽÕø. Æ?¦,4$Fc¬.q/Kµb×òÞxÙWýW¨Ì÷¤úbeà]‘/€ÍÐÊxjê+”`Zû=ߌµ©Žä¬&l‰€÷nÄ×טgÂÂR“ëžA  ËREˆ9èZøÜ¶Ðzø&V”n&š,D–"ç‘OèL-‘‰° H~8ˆýl¾xÛ—÷¿¸ˆiHoô™”éÇT¢4¼: «Ž­$6°ËH-FD|ÀK,pYK–¡MjÞŸMö!Ï“K˜Í &òÙKÄZB#ÏÈbQ™øJ\¤†P3©B (¦˜ÎÜbJR]X§” YŒ½"ÓÛ’LKGDˆìîwLéLJÕñPÆÅ'Íc1•èŠß`SEGâ-áªÔ ¶A<ìžÿëL oP,›š+ÈÔA|Kð² f¤Ž¢[žÄŒç† ˜>‘*'$¸™ç¶Ü[z [’/$໑>ƒÜüÞ^b겟9CÈÆwcîDf\qÏùÙ¼äs°éNÌI¦û•©ˆmÖ#qÏùÙ`׳yéÁ¾½ßäpª(>©šàVŠ0‡™>Ì'7<ƒÂø4¢q„èšÀþžÁ v ssèaøxd.r—h‹‘Ø,éÆäwð7¸™t.¬-üó0W˜š LcÊdײ—ŒžMìÆC©>Lý….˜ Z;)nÑ¥hœ*ˆ…àè‰ÌN¡ QCÐ @DÄä5=KÉÃDôñ¯‚å"LVM@QODD-$Škùt>ü,êr|¸dyí}ZõÊŽUÄ˰ø£\U²û\DÚHNè#91IEÌg󯨒‘1Eä7 RZïZŽU„‡ =ˆ*Ü+®ŽC> G‰*&˜ñ&R>Ñh9ê ȆcwáihÑH•(Š%‘{>ÃQ$ÍЇ4ÌÊôM¢?I“{Ñ× µ‚º&•=Ø»DTÛŽGûâ‰ôTV&3³z†f€ó [ñI  Å—Q…¸ÆÑ3¤‡Á&(…§§ê1™³Du<5™—„€Æ¶ø¶2Õ:z]3+H¢ñÍ$Om!^ÛÉÁøVäá_jï~¼£½2©¥tE,J¥€ÄIâ!ª íˆAƒ>ü¥ü¦¼VÔo»™ÞÀƒ =hqº#­`—À`j¬Þ[Šä…tt8ž- Œ.þ%_éö[¾{ …¯C_‘ÛØ ¬ 6½:µ9^„×`…ˆLHA`:ÿ§î HŒ&E»ÂsÁîP¼N‰lñG0‰åA¢8•Ÿ:wA4zýOœÿ)…¨hKôèƃòY@_HÂ@ì$ú^J&Òy¡xWfßÿ˜G«Ë_õÓ¿®ŽœD§GÚu#¨:¹‹x&ü=’I Ûø éŸ ÷;…ø/qe/±¨¿æˆ ?îX¥è1ºò ‚­ÆÊ ANv“}õf.;>¾'8¯C©TVò-õú?´úÙë§;Ò6ƒ·až‚ÉñÈ^(Ì¢ñËØA´5†ŒF§¹™Ž‘sUëÁ“ø2".a•(€ï§ø“v¿#÷“F,½"xj9Ža=ÐDh9,kŽàˆ€,C)b½/²†?®§ñ6è |;œKƬúµéÞƒ-€Êð Ì‹ÝDòÀ‹àbpçÈ™HZ„ ÈИµÎ’Ø=b&QoAgÚ0™©ø\ÛëXËà›XO—dz1­ùdñ–—½!¦›;K_$Ö§ð?Ð1PHe¥ ëÑÖ~E$!1*™{o§'³*S—Ýo3Ét|J65뇷"?bÛáÉP¶È™pÃ¥£W;Ÿã­èEôMržßJ]fzRÕ8Þö)]„+`O‘|Ž–ÌàU¸-TÀ bÑ­}Ó;Ów©‹€F?âG¨d²úñçÿ,pÿ›ŒhJ_£_Ý_Ƭ¯ƒJ‘p .1Ho|.!S‰èâñ¤úE×Õ0)Ø ¬EåØÐi‰V‰©Ç]prb¾^M„\h‚¦P=âÉÿ@&È·v=x ]B×StƒhKùèd3 œ(ü¡ €¤A!uàÄÈPt…ÓsSÓùèVñÔ#}jz8_ E‹Ñ4s6rô+ŒFJcWÑÒdíqò,@p ˜ìD§¨Ôòr<Í®ùô<w@: ‰¡hì¼¹‚L‡†!w°h) &/F×ìe 4²NA*S/ˆ;˜Oùï”YªØ‘¥o¶:ß3 sÈûÈ8d þ] áÐé(‰@;ð\äYÝÁÂdwb5–6ž4&B6à¨vŒû0D¸† dzc_c)¨uä«Üøb|$¾›àã%‡9evÍï4:c 4m‡™˜k•``vç§ @ÐÊØX¢mR›ãÁÿ°@JgDÙDMVÜläj´¿  ")ˆÛDK„†ï"‡Ã‘Ÿ¼#- @M!¨ß=PP” hRà,»‹<ýn"–Ê $coA¹ÀÍP}çH~0­ó}$P’¡9ð ôêdºÔg?«ìK¡ã%Q…þ-ÖÞ³£h?á8·¢ÁÐNçý#PŠñꀃ‘vˆ„¥&{ÑiýñÞ8å%‹QÅÅhð‘šE=qü%¦‚§€¡Àjè}F[x$ú~%ÂU¦_c g ƒ‡B5b)û æS€ÍWw ýhãHMO¡;NÜNÁªa{#ûæï`7h·ó³8rŠÊéWë^‡õDš€ób4–„F:*Àþ€TÆ âecÙvô:žó»Æ›ÁÙDY¿¶5ì:BÁ@8°àÀ 1>h4º•! óC(-æhrÅ6~§ñ°åW±K€»`јþøXÖ† Q¨T‰g¢³} ÓßõÙqÀ.ü"»ÊÙMìÒ  Ð1úU+`6øÌ×Çwrïy/}*VÝùîkø¹ÁÓDSÊÏ[ €±‹uèô_evP.ì ¹žYN爎,|QÜÃXg¦òàéÁ~lm_) @Å*󩣿B >ŒéLµrT–ÒÁí‘‘5Ù0úŒ‡hº¸ŸëñÉ€ëÐQ8":Óú¦qøz÷"`:Ž…J£¯8²åUhzä™Õ‘%ô>?zŸh!€¯/>»"ç‰ÒôÂ+Âó"Õ‘ÇÈ ¬2ø ò(†ìq>÷:±ùºH­óá'Ìv?fÛ¹‘wÑZîw5àkì1]êÙ÷DÏÐf0Utì3ÀE`M`7ðFñ¯‘)¸$èÇ5ÐÁx7t¬@n°ØÓ•Ç¢ÉÏÄDt%H)@Ì ´^¾l;.]’„ï™hŽ}A§™Ü~ÔX†xWÀ—"ÔÀ‰t‡ÁGa/²îUwj--@ƒ×A ²àt4Þþ»Ó„«àx[Çz"€7~;Reñªx¤ZìâÊǼòµx°yˆõ­yú¨àä_Žï¯¢wñ&‘>ܯ‘n*ÅCÐÇNIœÜï­€@pHÌ;'K½L ¡2Ãý¡<Ðh¼(ö‚`û"5ÄZûÑ®k 5°èx"°d¡¹À)'–ˆÒ…}c4·*³Ó¥ªì"ô z­W‚G=œ^°^©qzÏ>|Ô¹ׂ}-Úë»þv¸óþ°¯Á&eWâ#жX+8Ôv!*¢Ã%#Ï™ƒ=¡ëùÍ‹ÀxðpJjFĉ_Ó¡­±T¿„ú VDZ«6° e€o#šžïœañ=t2f—Ÿê2ªü™ÑZ#5áCÑš®U+ßKeMp¬ó}`ÀÁð= ø²¡ËP%h2T?G—¢ýuWâ¿DÑ(îÄ;›"•M‡#9p¯†lü.Ò™¦€¯Ä¼³àŒHM`úIøE¥¯”ÔÐËX$ð²Ý ç}í}a°ÌŒöGz;6Ô'òŒ[`:¤R&æÿAo±Üä,r0¹È/>h ¼íNÅ›GG^Àè-rîE‡Dk¸æd€£aéoEyŪ‘ ˆJˆ/§ð1ª‰ÇÝÔ[2Øyì´‘HŒ‹.­8Z‹iÇþŽÅî2Ô úì|­VE¾|FÊljêø<{äˆÈ D…Ñmü ñ&Z Y(cÝiŒë+7€WàT¨!œžyè,PÀýZ ùвXº4•×isàt^¼CÍõƒÆ‹ÀAø|=ŠÌnÛþàZü†G¶}ø=´ÅõúA%àqP]°§Fž@=Á/Ð*°´—üȦº"¹sØlâ !9ý`5>%aŽ57Ó£.jXdm†ƒYØ"r/!1 ™?ò…¡еÈ߀„K"yá‹P8T\GoSõ™qä ü.–ˆO$®ùÁj|å†@¾èÅÑœ6$ÚëËÕÃLŽèL«'Bï£^¯€^Àh1|z´7 õ‰~øvt£SðJñC[G•ûÞ _ˆÖàc̰½Ùrø›è÷㦠˛ϋ"c‘g‘G.ƒd·¡‘h~ü¡ú©­£8 ­@sÆÒ1 < ö‹y?-V´VH @6¡“ßZÚù: G®ãɉnøN?Ì‘Çì`᨜±fÍŠ€à]ЈÈL•v¾&E¤‡"3Ð}Ø{lb!máVN4ÍBäJ¼¥æŸÿ¥ µi™JíÍ}È0€¢îè^Y<ø²ÁóØ`b^¿ƒ=E#iTð0's¼ïx?ÿ—öÙüÿÒã#”(CÝÀúÄŒrÁgèa´xÌÅh'/­BßaAxZ¬4v­ˆì†›"«#ð(G/`ËüP)¿›_’à)D7ÌÉUcú! —CÊŬmÀà0(AÓ Ûˆc‡Ð©È9dÚKæ‡Ã¡˜?êñàbYÊf´ª"ˆ˜cy~GÍBúÖ=΃a Þ„; y0 ÇÒág°ËhVTFžBäë_Úöc|äç²íI"¦–€:ÃáhS$G,å-á›pŽH•ÅKÀCà&X þ¢O¥XE|?ö=â¼…ZúAc„pXøžGmŠió¨/´YŠLu4&‰Q9<ë¨÷ÍåúØmAJ£Áh8=z+Š­A*"ÅßàÎH·€¿Ï%¦Žð†:D?¼¿ÇÇqƒX¨¼Çy}€cj„ªáµ_ íà*è'ØFÆÀ{Ñüwl/\¼!Ȥˆ4¦ÄÂé-Trº+E{Æå‘ß«!›ÑÎÏDàÁo"vD:ꬒhœ…Ù‘ÜÄnb6þ …ƒÑ+H)?h|MÀ{Ów¨‡l_*öh˜ q3•"õüëÙ9àÄa§çÖj`s‰6°ov^ŽêMa‡ ÷Ð@´(zÊsÑ Ô ¦6û”Ë{À Úr~Vr¼ä·cG»€ÊÀ0¬2)DþM |øW¢QÍ]€oÀwà¸%ü}œÑlïdðgØ ìâÛÚ‹‡hhͳ ໜ :`û‰)Ñ}c’•zJï$öÂÏ 'b‹[Âß'ªœ¥Øê9݇.Œä‚ g"ë­"1(Zc=°”>êe4mQOŽf‰<¯|ŒìÀœ$Ë£q?îX€¡àhvÚ,=º”¼„k‘ãù•¸À\Œ_\Lè@L›—€R£ûNØE†IˆªØ9ô(<Þëb¾ýQ%ï†VóˆctJ¶7•íB×û.«áàwÈÔ/ºZ‰lF:AÁ‚€ïITûÐa„ÕEü¥Æ?†¯¼T1:ÆBWˆŠ,Î.¥_pál~üJ,+òB]ðQDH´Êéàrä0òžùühð42]‹l†?ùÁ®¯"Ë€±ê+TŒøÊUæû³Ø±èE8UŒµ\ûãÏÉàès/BW}ðyx ¸Ñy—ô"ãƒPUð¾ìz-ðñâeœ\ïX¤šõÀTÜ%õVÇËé¨@ ¸3Fãï@¤>óFI ­€rBƒálÐ`çÝ@ø$2ÁùÄå'»Ç£‰ U;d=XM:BJ/ûfm[AUà1Ñ·€WÐ'$¢Æèž­U(ª•uâǨUŸ%ü}ö9WÍ–ÃëP•”ÑÉ@(<½Dt¤wDªhFÕï7žƒ/áÞð·õîäPiä,ü¾÷‡DŸ·„¿O}CW`ý€zAÐ q, Ž1ÄC<‰¶—´Ž´‹Ö䃂\m9 `q;=qœ }¶û¡­K"ù©wtª½…YM¯¢oâ'¡¢@:h-ž»ÏF­¼ï„+~W—‘ZxPÔ ´Þ ‘pPôç«c~ð= °ÔNª0݃©-”Iù©xÞµÅÚàï™ÂªêÛ¢øæÆ¿éóÑÞAž"æF ×vÌ'}!ݹ‚ mBº‰ëäa¢sM¾§gÔG)^q¦à•ú²­ÙM\¿ÈVMõ€Ç(€žXòm¬Qèq¯þÏàŒÑס­Lí°Ö@ê,T–Ÿ(C™Ï`TõU…ÇP]Oˆ>· —ˆtßõ)ü>w=‹Lä§ð‹Ñ3Pg:“&ºžš<¹žûÄ®#‹£Ï þÑ­^z†º¿‹åâ^ùŸÃwõ§hº !Ñ©ø3óMH8î¢C´šÀ3";•ºN„®B­¡G1ªbï@]à[ù†ïúùpY€X„}¤r³P¾U¹Zàtürt-ÕH¬9 #‘•Žç´Ð­ßeäߨì‡qú¾ëíBhNà#žHLËÔ–,¿[€,u‡_ 4V†¸E^Äk£‰¿³r7€;~°çoÌrj嘪ꔴÈÇ â'’sc=}o x¬=§Ã±ÞÔjþm_El$¨©æË¾áÛ]ÖÆÑ)‘6:T‰dgr'2 Jmµ¥ÁÃh06ù„Žr<Ô4ÏŸ´u%àæy¾q-å"wðs€o_^U¬ ^sc­‰ ”ˆåstn^!0ñˈöC#à5q² ZFÝÿãøxº§®™†š^Ø@ÕvbÛ¸WýgÙIùvÁIàm4ˆ¼CU¡ QýÉÜô¶4S‘\õFn¢û€?C×#¯áßl‘V  ”ÏêR¾:sÅÅ2Ô·#êÙ OF]¤Ò2éK”E?¡oÑ h™ '2‘¹¨=$LæÆÇúàݱ‰‘ïB³˜cÜ::u<v_ûfÉNBD3ª"½Ö™4l]º>µ™NÅ5e1…è¡Ô3ò @¾$æ‘…ñ‚ÑÞñ-Ü–ØIþF¹üØ¿Ññå«yÉ´T)²*ý‘ÊÈÜfï0"S‹Í7ã sèäª.Ýz@Ž"Ïa…‘¼Ñö\E/óêֿ³Ž¨¶E–⥈Óxuªs”›Ã5å’rÃ9ˆŸÄ»yóŠ’Ø)\6…Üz‘)Ñv³>@^‹‡–ŽˆˆåŠRU|ñäsv„pŸ?Íáƒùò|! ×™ùÄ æÏ‰˜ô{F†¡ÃàNQh?úÄØp`¢!Šd_ˆ´ìþ%ÿ•߯ãò¿ ¥¹ ì.n«øHŽPrJ+h/Þ …áÝ‘59©àw‹Žâ¸•P¹é<Ï®&'èÒl3®?Ô©IM8ÁcK²kø®R/y ¼W¤XžÎEöà €úðj¶©÷FÅ&%2¼H外aé°Áä@z*=™éÎVàêr ŸŠ[Jï¦q5Åâ!þw…ýÄ&cžÚxÁ~ÚÍóïä@òQdN44™E$¡ÆPÙèÞt7¦»…›É– öQÙ7ü=â²²ƒÙÜ!¶6U Ý Ìµx꾸'‘íe…ž#8!gˆUdª5=)Áå"èIT3ÚŰ¥˜¯´›iÍæf?PëñHW$#ïYA®Œº7Aœ˜±a/‰,TOz}ŸIÄ-aoÑ;©~TWj$•ÞF¯c3Õ™ô3ò)ÎÆ“ÅDDLĪFŽІD}"#!%‰ªÄÂ"ËRËi‘¹Â|¡³R·É±TUú“S»Ì#¶.Û—YL‰‡&Š‘h/Gá:xQ,F”Ä:£ ÖQOÈa¬HýN÷§P©É1dOj!½ˆI¦ᾰØ t™xñß>* ‹Áº° Ÿ@´"ú°UÐxh- MÀbð}¤þš¨OÞ&ñ*xi²+1阒l–ad?ì@ùs4¬2r Ù‰Äi¼YŽø6o[lÏ@®£÷°ùø@b±Ÿ‹MÇz0=‹JÊdc 0vwü9IÑòÈ$%Æc­ðºdgbgdïüº±•Ä[#Ê™É~ä¢9Ÿœ€÷Ç=Ô\j3å¦]ô¡x«Ç¾ð=x rNÅ¢8º¾ }Aæà ÈáT#ê9ž¾Î,g;3ûéWôh*б)ÜD” SùãMcRø0ÚëŽ@A¼5~¹Œ<È,D3"[ŽáD ª'“kÉÕã&p»¹µÌ.¢3>ßCÖ§>'ãɲŸ µðDul„µDç ™H8¼ ÀÆÓáÛhN¢ù†Áj‰=Ùíd!r2‘žDžŽ'ƒÑ.xK< z nˆtƒnk¢Læ;NÔB‘!$$ gr÷™n\7n$ý,ž¼„/Ä× _ -`Y8y÷†}ë-qYý3#Â/à¦2…¸ùÂ:þa¸M©P1‘iH&Eê"nt3Z N äœÃžáF<××¹7\1ãßpتtS<Új Nƒ§b ˆCxqt,Àáp{¸R%±ù(…!„›\ƒßrb‘~ñ¤Ñŗ榳eX‹•©ÄUì74'|ì-GÆã8QË ÿ`”MKÝ¥Ÿk°µx&²,±;„idÞxií=ìC¶3wƒ9Háh~Ø„Ž€+ÀFÐsd^ŸÈG$\Õ"Àªhk:=—‹¦ˆøSü 6 ݆¾&:ÆKMŠÌ¦{€¹K·#pl+B áÌPGø&z‰cDR,ê¾ÛÚpGl5QlN´Â+cCÑèô,y8^üO6ê}œ™Nóô²~k‡6‡Ãß¡h¸3®@XrLެÉBP7ø\ËC &fáuœã­ñ*L?nw<Œ6£È¼ôa¦#5–ì‡oÊvÔ‰½pð,Ò;V@‡¢Ýß[À¤N 7©†ø3¬ú Æq6»xTÌäÇ;†£¨Nö%¦ÐLjÌ8„qX_¼1–îL‹!nd'ˆ”G¦"¡¶`'è78%€´GZ"ù‘.p¸6ž¹ÀOЇ9È0zyÂ7º U0Û ·„!§ÿM¡ù U@p=x®…܃“!Ѷè”E7"ðd'1•ù#Z:"¢+³ŒŽ Çàóáìè#ôpÌàLøUôÜüPð14nŒäħý‰xQ|9öMƒ¦&ÄStÖëD·$Üè9ð*t¹Œî‚FÉÀëàhØ «ŽBÑÉ w‹Áæð\4e°»‰sÄHrr¼øË¥ƒL ,‘S¹@Ùƒ¯ÂסzY„ôC3F¯¼ûÈøž;‘ËdEf&}'Þ"Šˆˆ^Ê+.ê •9ÏP~´!Ö9 Ž€ËÑpbñw;I}4ÀÛ 7¥j~zªçŸcH]X#rŠèqŒ–FÀ}t‰uÑÇßíðèLÜGøñy½Æ~Ù>²ôNp"ô|¼ï‡}>RG¢›±‘Äk¢>~R‘í~ ¿Þæ{Löft{îA“Hž¼FÖ"ûâG p 8ÇQ|»Ju¡¯°Æàd`_¼Í‚ÿ‹”L^|èûû”$Ú‡ÈGP^ê 9ó§Ø:3ÕšºNf'G;‘Zcä*Ö›ª„ßD<Äg$ëP㙺|üÿ ]›NÌþÁëâV1¯°ûMÁF°ÛXƒéE‰Ä¸%z›ØŠÕD›Y¨BT=f'—/žÛÙG^î¢xK\%î_ru™ùl{n>„OÎAt}ª~ ͈wDߢˉä$ò!ƒˆT<ûo¡âGù¹ÜK¾-í`[‘/(•k 5’{ ›–}ˆ²8ÿ…éÁÎæ¼L8y,ʽ‹÷ÞèŒ3b˜òEB¸ 2 ±…Þ(Í“ ™ø<Â1i®øQŒàsJ{µKj*©)· ÷Þ äù¥µl‹ÙrD8Ö€>Á<`ÜÜ[q¾\XøÀ†r/…éj#}¸žOÝ/×ðÛÓ<þ3'ø“r%¹H¶tV(C׌/æŸÉBo©„ØŒ/Ìç‘KW9Nl$þœ¿iè’’Ëù•rò.^Ÿ  7"GïÙP˜¸Dí!·•)Õe6õÛóôÿ n…T>H7Å6be´rK$¸x좣²+SK¯¤Ì‘Óe7û©/K#åR©¦b½õFJVÅ’°k¢Û4f¸#þzü_æ´ØJ¬(/Æ*Œºê®5ƒ¾*ú©õ—Òâk®š,(’Ö[(¦ "\žîŠ{ÖÏå=ÌÝ”f«'ÔÕJ þ VÑÒ[qÏú¹d¡3÷Ä,r¡Ÿ„Fˆò캟Þÿâò€HNðì!f2‘mãe>ñGéBåd 0½,å"~ïßò€ åÁOñÚß3ŠK#ÌþìÝxWß?üñ9㳳ŋKÑ"ÅÝ‹K¡@q×b w—â®EŠkR´¸»ç„$À¶}î>7Ù’çýÿ>{]d3»Éùæœ9gΙ]fÿµ3ÿÆ–‘) ¦þg+"öÉ6ðÿwc”ð-)Ïäÿ«iá[Ržá–ð-)ÏOø–”Çìß’ò\þ?P™]á[RžFöð-)Ïóÿý:«9|KÊsþ%å9þ àÿ-#má[€H™«†oIinÊEìáÛRšKÆžðm)MnË$Wø¶”æ¢%wŠÏÛ6Å·5øGS¹v ~&“È›Ô EOÙ_ <%å’ò9eŒº@;f̬š2Ö5¾ÿ¬‰ã+ íäíZjí¹6Ù4Ǹ+¡ÅËj_¥¶?ÈIÊ¢ERµŸÍ÷÷LÛ-×­»´¸G>•6ËáÏþ8 ê!“]ZÿL}¯¼ÖŠš7Y¸vy6›Ò«S+ã³~l™ä㦠¶®¦{*42´Ð:hk-ß83Ú6Ù6:vYßÿ1l7Œ±6²¯1Œ&Ï)å)âK¥‘F™æØæ;òZ~ô>Nñ•›ÚSã:ÃfS׌Ló„{è‰Qx"4 1ç2/Ãæßv[˜,1ò#‰àƒÙ‹fÅØ-"ë³é™ƒôg\1¹†Vá£×cwù¸ü\ì.ÎF)¿Ø×\ßÔQlÎlGOÑ9æû¹PL%ÔO¸ðŸúwµ‘ç «ÙD5“XÍfj§ºd³º×ÐRY&Lª(SÅöQSfC³¸a(†~Ž;ð?P~¥¿¶Oye¨n>kIeê&ŸÝZ{ódãiþ“ÿžTÎŒN7ðçøEæ¾<ÑxV~¤Ü4·tœ·WûÈ¥^sÀ4H+*„ÿä¿é¨p”ûw¥ETTh(ŽdB--í[̤2EYfšlYejd (á?÷ïyB4æq®±/Ê–B,{'ÈÁÜ4cuSMe®´ÜˆÙŽÛ7X[*}ÄãÍpjޝAaX]²󚫊fÉÍŒóÍ­ «¤FÊ#s ûOŽûŽ5Ž’æðŸü÷tCMŠ؇݉ûˆl¬¼Q­bfYfܮӘDkqûvûP{yÛhã²4»èŠšˆy¥abþÝ“œr«^Ã5Êô¥i¡&YØKØZ[o™3O°\2\úHÇ›Ÿ¸(¹ª¸‚Ø6ô%ú.zªlÒÒjM]í„u§Ùoféc*g"ÌÌ© Y>RÆjœ>û¯sÓP?ô9_Bºjí¥©ª©©©¶cRØÕ©¨ŸèmjJ&˜Vh}•¶rNí{ó0ceºú‰6I~êÐïÿD$\qóvëx÷9·ê~è^àií[8ú5jkôè¨Í¾Í®|Î%¶ª–N¦æÂyâ;ém–U\etŒ¯`xmø4)wâ-¼„§Ú}Îk¾ö¾?<å}©üy‚C¢ß”44º­„›p7v¬°6´Õ7F W¸CñyVD§1oJcå”ú£uOTä36õ®õuó}í‹õ.÷y„K*ýÄ_ÆóÄÓ׽ږ߶מÍÞØØS½¯YÍ7Í•¬e,íÌ%Kµ†ªÅHdœšœíæ/ì»áÍè“”1}(«ÏîþÜ;Ý×ÊUÓ¾ÞMøÊ¸>5‘lrQË&g:ç}Çx[Ço0x2¡æßÜRÃKøp†¨Î?Àw޳˛ß9ði|Û5ˆªXí)älî*ìYã*ë\çží>æÌbLíL„«‘÷{ïv¯Åý³·Š«s´ý ïmÆÓþð>\y¿ÑwÓû‹ïw?(èpðrÔoQõ‚Îà·þ‡®ŠÎ<ö_l§ÝµÌ¾ÔZÌc;doáéáÓü½mÜÃ|W}»í¯,Ü;#ÑÖ7¼_zOx×ù2ùJ×ëuŠ®ÚpûE- ÷µõ(ŽœVÙñ«ã{ë8K;ÛtG&âÛæ½àÊéÎæü7¼5<û’öÈdüÜwÌãñ6ô?ˆúIß³žFó¡þ9qQ/£šK¦{úÛ÷Ùû¹f;[Ù>³¶s|á’¼ù|o~·Ëû‡÷‘_ñ?~o /áÃ]óöpr· Q â÷ÄBQ§ýï¯Þ£ÜSo'Ww×Y_«`0tTO¹74Ù7Ïý¥§µ¿S°Eà¥ÿËÀ<_aO9ïŠè>íÎï}à5ù~ööò¾ð^õöõö÷®rµwîuvpã¾Á–¡ëð>\_7O1÷ûÊ7Í_.êIh–…§“ç߀'ð ð:Ø1˜Þ7Ê·6ꧨÆÞî)žŠžVžß¼ªo¨·§÷„o­7è¹b]ª'ßZ±g‡Oõõ÷Îò|ëúÖ3Ã{4Ø"ê~ðš¿”T`~hupjÈ5'´Ø_Ä7Þß&`öæs=íÜߺ3y[‡ûg„Z/ùJ{÷¸óùj‡æF…—ðáb|‹¼Ý¼ÏX7å;íßd¢«DU ™CåCJÔ/¡oCs¢ªE¿Õ \ð~î|W<Õ¼ßyNxv{û¯†Ž%·û7y¿òí öŠ/áÃÕóNsǺ¾vÍvgñ_>.ŽZ=>úe”MO*Eõ •Ôûl·èì¡þåþúñ(m@óeôíñÞs÷= &fŒ‰v…jøKJE ÏüìæiᶸwxÄÀ®à§¡Øøºé]$ê÷`Û¨vñ£Êµ¨§¡m-ˆ‚|P Õˆþ¢^Í•ÅÝÄ{"6ê²þœ›Ñó£‰èfQdpIúÌúhì»éëë·;ë…Æêõ—«}Ô¤–lÝ?j~prp``²¿Tða ºo•{#µs+w–¾§N Kzõ“¨ÁÏŸÒù¹ ºÊu=¾¼PôïŒÌ#¢Æ  û+ù®ùzsxÓz$g~Ç"'ë®ãçyåã£GË Ï /áÃÅÚŃ]'|¹Ë‚eBÅBí£Î½w܈»-Šú>°Ó?ÖßÁßÕ›Õ=ÖíÝãÚì Ýì‚ó;Ï3ÿÜД¨ ?^‡Sc²E- ð‡ü'RhDpUèôŸæ­Å£¢ÙMƒk‹<³¸n»~vXì׬š­Ž~ü&ô#éøÐÙˆeµ>ÐÊ¿Ðgðð;9‚©ôcZŸ(潄«CO};ýÆÀvïgfÇ(G9ûëekF[^{3G9çnÎ×"Ð&ô]Ô´èHd\ï{åëìkåié±xŸzêøVz•¨+ï´vºOßÿŽzæyZº'9®Ú ÙÖÛþ°ø-,´íÛj«Ó:Îöc‚k“÷ª?kpZÆð|ÞÛ®º®N«³µ»‚ûWw{ÿ×™Is­³Ñƒ9½˜óŒ=£ã©½³­´íºÝaÿʚ˜Î4ÊTÚÔĔƫ•3 1÷°ŒwN÷Ùk"0öÜuuv´²³ýjŸáºêúսؗ!Ð4alU4ø¥w½s¦½¦>/;eigmc/`[cš¯½V³ª=”¾Ête…¡š1½ù's´=«÷±¿æáí—mílyl;mÇ/]ë=µ|b`»žñ”>Ë*hèKë¾ëÜîÜàØg»a=lmdmcíhn§Q2Ë9dF‰VÖ(KŒí¬õ¿²Š½¢û…÷¬7¼„—Ö>Ê~ÐÞRïAç ç×—Þl¾ ÁvQ¥E|û<¹=ÜkÜ­Ýe]}÷ìSlG,-ùÍšÑiø^Y¦îÔ.iK4Å<ÂÖ×ÁÛ[X ; xnGàê¡»œœW]·àÊê.îîî™ç­ì«ão¸ã)å*î<ï<çÌè*çœkí„£‘­‹Õikc½nþÖL™òš šš¢´:ZGsZÛhÛPkjGZ·/¹Kv\KÜÇÜÝÏkOc¯è¹ìfOm9­©¬k¬ç­¤í¶µ¦u£í ÙºÛÆX‡YXSM}¿tÉwÅ܆zÊö ÎÌîîð>Üpw‡ÝqÔñÀasÝutqüäÈeŸj•¬L#·Ô5j ã9ã^ã'æßͬõë6É6Éœ×XÈð«ÒSÙ¥RSÉݤßÕZæ±Öâöv¿sm2ª>ÖýÒ‘ÚnpüìÜ匶Í1?Ò&;q5«ÜY$0ü¨u3´5æ1m7·l³U±¼Ð©’2S"T·ÌÚPCi­˜¹š¥ƒõKFÛÎð>Ü1Ï}××N^_|çYäênlüT›ªÑÆïÔ[R¹³’Ñ0GOI˜‚F‡VÅ´Þ˜–(Vu²šE½¬† óÔ#ò6y«vÄ|ÝVÌžÏ6%W€.æ™áÚéèá¾ìùÑÝÚµÑ\ÓPßÐÆÐS¿eR)AµœÒ^9k˜mœhÌcè¢2NÒ*¨ÍäÃò-9­”^ê+Õopkùãr^-§u’½¿íj>ßñšcã ý†­³k•u”9¿ò\Ì |¯\–_(»ä^Ro¹–ÜXz*Uh&Í£­UO)7ämR?±_UE%ùCÂ!ñŒ\Ik ûË\s.ó0m†²‰ŸÄ݇ÈG¤ë¢—wq¡‹’Î ÅÄ­ÊEu¬aŠÊ©˜šQ/ÍæJ¡Þ¨_U2¨å´2¦‡¦¬#ì÷ì5#°?vÓN™J'ji”UB5ŽBQ¬0G,&îrQ^ÚKŸŠ'„V¢_ê ¬T¯)Í•Öj¬Ì y¹Ì\9>—TS-ª}aniÍåÈâší<«T/zÊ…‡ô;ZG?¥÷rëä‰êL1ð¹´J¼%ÄH•5òjñ¾ð•ØBº!ûTRy)U•&‰GùkÜH®×_د\ÖZ›Zç:Ÿ»'º¦G ãLt€¯)>åçñ»…Òe5‹ñ–f”D¾¸8Q¸&V—›¨ß© ä6"/ý(oSÖ)5•ëRc¡4Gñ? ýÄk§‚IYdkyfå]FÏl}Œ /áà çrˆ;ä9ÊWÞØÒÈ^Hs¹ª,Å5çöñ™\Þ¯¾RªJM„Æb#¹¦’QùTɧEfnžpP!¯’†ªÍLûõŒWŠ{Ž«d2šÄ»òje¨òZi«\S*ÄÊ\ov1Síçó;¹Râ§jY5 åŸsF1•|[:+6v¢h_A,/‘ç«õœ%§-Ö>ÇñãXÆÇüR9µp µå"«'Ø…]l¡ô<'¶‘º “…Üre%(§ÒðÛ“ô£”A>*Íæ yÅ—Â É.½’º©›4“yžåš9—e`ÆÇ âg ¶9U…ÙÂÑYn*ß“ÊÜf³ò½Ä‡Òbq-ßCФLR}1·øR<$Þ‘*í¿ÜVz!V³K„Ô@Ú/ êÕ¯5Ø´Õ¦ð>\uþ&S›nOþAkœÈoãoógØ 4Ï(¨ \OÔQÜÆMæÏ MÅæÒV©«TL.¥ˆêVåy¦ØJ<(Pâ0i˜‚ÔŸ•êµ”z%ï*ÀÎ$óÒˆÔ 4•ï&á;peØ(F`+qmIÎ$Ïã3ñÑü:þ²°\¯É¡ò]%£šJí¤–JK§ùõü qŠrJi/gVnª~Cš¼7»(7îN5¡ ÑcÙ&|5ñ˜€ í¸‰ìI¶wk v”T}oÌ]çòó±üJÁ$÷SœÊsyª|A(.ä¶pgÅÊz½ï³Juåºb‹@Ææ‰Ú³ý˜5Ì&f·I¼"‰Ò8¡ß‘{ˆN B˜ªï‡;Ä&Ây¾˜ éc©]*'6C& ðßó¢´S^«f5dT–ÈŸ+|Úú,_=b2*›•Ý„úû¥c’"vúñ!” ÕÓGꯄÑ#Žåóq¤¢2Â×âÂhþ7þž½ba½POj§Ô2ìRjÉå”cø?K¸ šÎd÷±OP/t+'ž”†Š=„ï…hô#s•øï„"ÂPa"ÿ á\7®²xKì Zôš®%äbf¡– J¬ÒY=ªç¥Qxýº.ª‚~a;±7ØN\4=åw‹œ˜†¿Ä?Aö!ºÀ'n¿Ç N¾/¿H0ë3ŒFÂp¾’0/&|!üÈïä· ý¥Íry©¤”JÎŒ1hÊŒ|l.öª>vh7Cè ä¿2ò? Œß#Þ‘wéë‚,’W¨#lÕg?9Ä,|n7¿–ÏÅó|· µÄbmiŒxC'¸#ð¾æýL/Ôm¤KÐSË>a¯p3ùB}Ÿ¬©Ï½bäžj}u–ºOY –i©¬ä•¾æ›s9ù_ù’|m¾°ÐY¼+ ’†H{ÄmBO®AÞ=“›*¡YT ò}©I‡¨mÌMî¶PAÖä6B*ás9›ú©a¨A2ü&Í%Ñ&Ž!/é…|HŸiäÐgmi•“JfÕ ¤–Eà½× ™tofù^‚´RMˆIX7² ª$•‡¨Ÿ(²|_ö« ô5Î!µ»úÔ3è{Ý:þ _Ü/é3 y­tXL-5’dù²ü‰’[ñéÇÌ1¿€q¯YŽÀŒEŸ‹6}í^‡ 資œ\o®ƒ0Xx)Δ—‰µ„üÞ#d4i¼XFì'æ÷‹?Ëýd‡tN|)•W~Sê³³éÂrNáGó}„%üAnªÌ]œòhëîúì!5*Ìu•úÊvùº2DÉ-q|it†YÇ·—>“[J©¤.B.a²tA¾!— ¥´zÝðÀTOócÐ`Ôˆë$V” Iné–èÑ33#1ƒ4O˜Î]ä³É¬zA^§Å÷Dw—ÎO¥fj }\;nߌ¯Â&ü(æS¾5T4Ì4ÌÕ>7<Ñ׎µÑ|¶ û’ø«bVuÒQÚ'žŽ@[_¿‘ªëmj”>‘ÿ7ŠU‚oÏ^¢fPi©A¤‘Ê@7cÇs‹¸mÜ$þ€ÜN›¤•Õo}ÔϤçü*®zÀ˜èRTg~¶!›— qn2n~—§*M¥Ý|nˆS PÆI ¥¬TÊF¿¦&ÓÅP#ô’+%|ªÔÐÚzª›”&J.ùXE¸Îý–¢‹ç¹†Óª]i&]Ž@Æâ‚M9¬6•iîã⨹¤W(Š9L’Ôê:Á­dJ09PMDñ£…›Rg5VN#e‘bå±rM©­XAœÃícFÒM¹É²¨¤W*(¥aÉ>ƒÜÈ/’Ò+/Ä7 õæQæHy9’F%Ó „N¢›ÂæA͸6üAþ?F!>å£Å.JfÅ.­ÕÇù³B>þ1WRˆ‘¿“Ï(Å —ÔΆ#É|<¬ÌŸoÆÍ¸£¨&C ÄT\–dNékÜq}î5mbWrƒù;ÜWè(ºÆ·BRsŪ4–H9äçâMq©˜J,¦Ï:{H“•<†“Üv1yGòü^¡·8™Çж7\° 7¸¹ìyÊOÌ%ÒÒ]™~Ȇò³×˜ÃHà'p™ôyù:¡Œ. K‰­ôvÿYÍs)ÜãÓq$jÃÏž ™Š» Ï«ó¥FÊiù–¾v9.¥õú*k½¸ƒ+ÇŽ¥ÏÓûY•k"¾w '›aå²uuC² XÍ«Œ=›´×êhù¬¾Ž9ËåËñõÅ©Rwù¤´RÈ"t2‰{d³2TÂ?¦Jwå_¥qr””kÆÔešé« êè$oE±¹è1÷¶Ž±=µÍH¶ë7eaO ã ?™2™Ç˜~ÑžªÙ”\R[¡³àÔW¬íe«ê0ÔçJåÂreÙ*ùøoØš¨@²ÉedAn-,D;P{®2£.Ç/Ó˜Ñcu´5_2ž‡|ÅÐÂ\õ+s%ËWfÙT_Û«ÄÈôÞ½Sì$†äfê]Ãnå¥|@i¨V½ÇoçÖ£žìs®Ž˜Gº)eorÓÑNtA_ûÎcCú(õ ‹aeè|æõÉx^|%ó?Tl¾`žmzn¬§SêHÅ5bzé{éœôH¾c8jè¤ÎP^(WäLR±™x¿Jp·øŠ+°\ÖÁ|Íôc‡¢ (+*Àeã®ÜUÓ8Ó½)ÙÚ:§ÞÖÅ #MÝM1Æ–ÆÑ†ìÊoÂH¾·ÐJ< +*¡>Õö]Z'•SG+ß(‡äï¥Öâ¾)Z„5(†yBm ;“?ÐnÔ‹+Ï•æZ ¸Œµ©uv²â»Ñué¦F˜5mŸ6K¥å Âî¥>/7Êå´2ÆSF·)§±ª6L+ntëj^õ•´P8Çç*ð+Q/f}Š,I\!Ó³¸û\G®¦žqÛM¬w’-ãF~šRØtÐœÆØÀÐ×ð›ÜE¼&Ô[ Ç…;bYC7ÓïÆÆ:ƳÚ9có]sZóͯ¬p¥ÐwÌsº4}Œ®GmÅë‘TXè£Ïßk³8ÎRÛ×)_k¯-e0ô1å·¼4>U_˘>'<)~.—òéÄýŠfš¬3¬ÑÒ½fÒ*Z ˜WªÏ…\¦ Y–Il#d>|)~‰ÉÁ›øhÊgìPcr&ãûÎ6È9µA¦Ûæ]¦Xu£ä‡q˜˜FšÅå~æ—(»n­®aˆq—ùss)ëk-K@Ó¤ |v¹ßˆÏ%‘{q û•E†vr-…#Z©øw…—ôß.;ŒÙͳ͙Í5µ1rvþ ´”ó S¹}ì:W½gˆÑæšî[·Z XºZ¬–L× ßë«°|G–"?ÅÇPã™*T&ry•¬ÏrÂu±¡äpV:ç /é¿—I™mDæ}¦‡F–^QÄâü%n"÷37Û…T.$ÎT£´Þ¦QÖ‹¶•– é…a»ÚOi)üÎR è>Äf}FKu`¾§’È.Ì.ŠÿJ«ëlžŒ¯ÓœT·š¶›_æ©Qò/bkñˆðD̨¦—ŒBU©ŸZKÛ¯,åmµ-í´®Ê‰•b¹IìV„ñ7˜1tê4Y‰ÌA_"‹«ð|¸LUš&Úc’mtŒÍoa0F«fµšÁ¢M3ž4Ñæ¢Ú×jÃu±rUÚªXŒ˜± ºK™¬ü!½àë¡•ts:3s’ÉÅôÅKáC‰kXëø„F±{”ž–-Î!ÉvÄ^¯Å˜g™»™Û™zÏ& ŸÓ™f›NZV™x­²¼R ÔRÊ£Õ—ZVí3}?XŸûÔå®2é~t%j,5˜ àA\& +1Cú-Z˜hîíF¾KÉö.öÄ8×¼Äl4 55Öpí¸ñ’ñ‚i˜¹›±´¶[Ÿ!®–Ë)QŠ¢õ79Œ¿«_ªÇR®À‰ôj­Ûð(½æÖc¥è CÞ ËðVÆñv—·”÷¨7¼¬ÿÖ(­¥1­9y´öƒñ±ÖYidMƒL”i†vE;d¸ –˻ĪIËi¨¥nP*¤ëÜ^j±•ÄãGF [‡/B$ߑ∻ø1Ü­ 7ž·ìtNK¶™Ïmí¦f7ÕŽ« sµŽÚ í ö˜Á4Èøµq‡qv\Y¥¯¦îË[ņBHl 'ÄzŸYG"IÂHhúÚl:ÞŒ=NÑ,™—XL^æ¦H?*³#¼+’iM³Oë¤ 0ÜUÊeˆÕ¾Ò6kýŒõûµKÚhÓS­¤\O|&Žä0ÍÙ¹\S>È-C¥¸ÇHc+“çúIcüùS‚ÙDm¦fs­…åÒs{ï®dÊ8ÏÆPHÕÕò½gœ2ØM­µ-†Bzf6W4}k8ª”/¥Í®Aw‘ÍcŸ2›˜gÌ3¶ÓL‰ÀR™Çlz¶:?^ Qö~Î É4FÕçת²Eé¡lVŽ©‹µkÆiÆKZMm„ÖݸÒTM+«>“;©ä‘Ü·ì^n=_–;‰ŽeûP g³S…R6Å'«°'ÙO…ý|!õ„¹¶åŒµw²ÌÏÎ)/ô•U_åkµ¼áŠ!›ñ¼Þs–k»  3´-ÆI†UJk±¤¸\8ÌÎ¥F2,WœËÊñ¼„:‘­¨h¶zÁŽ¥JÇg̈e'¢©tU67ÛM˜g¸eX`—,×4¨ \Ë&ů®5dÓî¶>1ìT)å€|IŸO,0¼R_EP,“—žBÌ&ú¨ Ì t–Ù…ßÿ¡sè3Û³ì÷d ÌJä B%ëP3èöLE1£©¥¶Dé,¯Ì})w’rÊÏårgõ'µ†R^n%»äo„ãü¹µzÝ`6.VFòyØ—tk:[üÞWƒ˜ÏܧnaŸ ]ŽÞÁö@Ÿ°y)оKW¦‡Q³¨‚L-¶©”ÓØW­-õJ–züI\*̻ɽ¤<.ù¤«Âá’%l`OrOÄÑÊ)Cuƒ(ïäYžä0ßÅ·jâ.Q…ØFIL]ºÛ‰kÇ·B£˜òÌz)%P6¬&½NR !Cù…qg2¼¤&W -G‹ÅR7ã§ %ùþÜ^ñ©0Wá—È/åýRu±±xE_¶g³$ôãÍ„]oÓºì%ÆŽnq_Š6ñNb'Q#‚HC|‹VÊCU—¶K ©-G?¸ßädnÓØ"¡X%7_@À—@ùø™ÜïìbÄnu¶ü‚û„k.Ì–~åHêMÂJX[¢¹„üš–;»Œ›Ì§² 3Pº«~Ü9ªHkåžÊZÕ'¶D÷$áƒÏü\ æPfî¥Ì©D7¿]/ðEXŽœMHôEþ±¸’ ±ÇØü#vü›ˆX6˧×W-\!Ò?°¯éækvÓˆ~I`X]ÔEê,•Ò&þ: WLÒ¾¿+#}•:Ã5Uš(?ñn4UØ ÏrjJç¸ût\šø&î8·›ºDUàê"%iÄÖ×/Ø,ö=^VŸûô ;sˆË¤L.Ã{áQÔ+î¥pXÜ’ôJvKÝ:âlbª1¿rÓ%Lº‰êÐë]š!‡äb)žb0,Öžû !ºSOP?tš±&¤\¥ÏÃâ8±6O¶ Ï9ˆæäIŒÅR&f¾~¤yÄ=M¶ë“ôEÙPQþa´–ËH¤&±øAâî;v„¾÷Y¨ÒBÍŽu%¯°?3kèß2öÅ£ê³%9JG.%+«âç@±ø4€ß+¼L–‘ñ×( ÚÏ©âkqÿk£ª’·éB(Ð;ö3%Ŭ¨6ƒ¨‹ÎеðÎñ9Þ•ŽÂV¢»’Lj_¶LÑç@>Ù÷Á½ù­²h<››!Ž‘ó‹ßðÐ :uŽHLÀrE+7 o†5a›%ä'RÓ© Ôñ¤Ÿ)L/åfÊ[’í ilì4ô-²piżòñ¢`“Úñ5ÙµIµ…ø%Òxn³^~>ª[ˆ~?#†}KüˆŽU‹_¦²%ã¾§´]i#—‘VñMyN-ÏSï‹5øQI);â­©c õ*I‘¹Ï dÞÌm?K|ÂÇṉ4daý™uPçd¾>Òþò­ás¹7]åë©# ‚j”çóæ„\DZýdö„z\Mô Eº:E?NJ÷V<+Á]°ÂÌñdÎX†-->SúHVäb¶£‚ò#¥¹’NÆ¥/™7%¢f1·2.#Ó£bL{znRÛ'úW’öá\r_r7ý[]¸$lCé˜=L^¡Ž4VrI ¤’ÂøøöæÉ¦TÅ„ò¹¸ê•Ô¿&ÞÁîãÏõçŒÔ³bØëdN¨ÃsÒùbm¡šÁô}²©øœßÈÚ YÂF›bä ¶cÒžªðaõW&¬øˆdψa»ðOø/¤šân¤G°g¹A|gv,APs„MÜûFàßKÍ¿ûnÖF„—ðáâ~÷—Œ]È(¼`ד“(·€«_Wfv¹8ŠËñÞ‘¥å»ß$qãwÈ‚tgúõ’À©ð>\\WÈÁì]±ÙèŸéíœSß_Ö‘„jÒÂø×2Þj=%^¾ó}yÂGSô"ª ÓšÍÏ£HÆ„iÁÖgÝl]¦Ý†®‚Ì(š–èkÌv¶WúýïÔú—¤=q ݃Eôj<-õšnÉd§·F £JwEmQ4ˆ­IŸÔ[6 ^œ9Èù„³Ü<¦.»˜îñN¾8ýôñ(wÒL² …˜ËúOå 2 “b"ñÒÆ¤GØ…¨úœ™‘°÷egÒòff~˜þŒ;Èè^ïõàx§?Í_3•˜uÔ·ÈØ‡ZAަVPóéõtºRÙî„6.Nõd–¢þxÚ¤Ç.5ïê¼’þo}¼ÕvÑe#q!}ŒˆÂ^ïûN¹ï¿HM&'DßÓƒ“]‡dï±6¦:±I_- çF`ìB•'¾O*ñ¯)X4•A$‹ïïé±4ôܤ:í™ØSh'[„*Bæ Gù’m…ðÖN#öc>¬Ö0lû»ùΈ­ ÙâÜ:®2ëâðñ ½æ5³Ùl/ú4ù9yœ¬ëÄ Æ ¾øt+0Þûm(]1æÀ;#Ïb|5ûC$ôž'Äáø{ © Ü,®5 1Ûé~ÔOÔ¸Nœ¾HXãŹEtx§6·bç(íõêIæj’T·þˆtà™©MÜH®8õŠð1­é äÞÔcâ.Ö€(_'mˆÆt—w2ÅÙñNæ«äN¶Ã;í]C›©rŒ%¾¶mc8Âý1-ÚÇfG=ÙCØy,F?Ê<$š¼ ñ'þÄéÿ®¥S3ˆ(•°í6~›&(,‡£†ÜLTU§IRÝÈBä}²ùŸæ°qö`Å“êôö >›Ožzoô’:ºEAüH4£3G _ï—îÙ…h;wêOg$ Jÿi¶–•8št?ŠÈF¶#>#kÑ"[:Oñ¹¹/Ù6¤BìÁg®?e‰³9ao¼¨ÏcßÜ#©z´•.?¶ŸCŒ!fP QÃ{°×Ø¡ É.â»ß©·¶&%§ãï¹ñ»ô4º`ÒøÄ_ÐnZ¥;09P0ÿ—´{‰É™¡6«—PS7’zò5¼Ýë~mÄG“&æ,U,áû¡øXâ'ú3ƒéÃF%#±#³™éHFá1x?‚Ö“âË톋´POù Œ^ûÎ>‰HGÝ Û%<šOOýN~NÁæ@'ÑU®j²¾2óFzCÐ/ñåøyÂMØ’’4"j&¤È†Ã}§Û㋨£ —ðèc¢=ŸG§Gy¸Ü ~n2Τ 0‡éhò!^˜˜AüŽ¿}Í¥ ñî kBÊ‚X3b-]-ŠFãÝȵ”Bõ£û¢ ÜV4„¶®Àðô$êÙ‹hO„È»Dwj, ñ6qïE~EìÄñµŽ9Íd×÷Ñ‘˜—øŒ*@w£öХѷhû’ݱ§ۜڃO Êù#qúm@Y_£&š‚Ý 3RÅɳ˜di+5ŒØŽ'^ÈñÔj>mDŸ Ì¬}s) ¹ãdlqQ¯ÇwâýÉøJ*5åןCc³ð»¸‰ØI\!žú¬˜hAéÔl*ÔµB½#PYQ /AfÆÆg¼‰ó^¶IØŒø¯9ñ}TzeÒßqHOŧ‰Ãx/ì^…ZEge‡£èD2†ô}¿-ñ3­ÖÛ±±•þÎܱ dž%¼çžÑ…¿yU¦3y†úšê@2d <#ž†äéL9¶%;;mW^ËC?fËÑˈ†ÄúïÍ;0ŒÂpj?›7é=3o±(¬¾†ìO§.“µƒ‰Ï'†Sãéu ÆL‰À¹æÄ’ó’3蚌+~DÉš”G¦Ž0åу°9O9¼•¾šÞD#k’¿ƒÉÂä`ª0}Ž>ÉÔ¦;DàÀº¤’¯’÷ØïP¶÷f³™É§daÆñÞì·þ-ž›èH,Ä{³Éûd*Š ‡0¥Ù1Ãéâhk7Ù‘è“«“Føä½:«Fd§Î1çßËØ O‡7ƒú=†(B. 6Õ’ÞÁÜaÖR­¨˜dÌBŠú<ëͼÕSjäƚ%åÁ©,l4íNÚ'„ñXl1VˆlG6ÃËb3±ëøj*³Š*KäÅÂKøp+‰3zkºâû2O´á‡1m‰´ çK0ìG:7•Ç}ö§±³#^ŒèBv$˰ÜXQüÑP?›ê-^‡S‰”•eŽãqgI&R#¨/È/©Zô"2î,~c*ó âÂVcq&೉Md 5†Áó?ã4‘ƒÊ@¦@ÆžX j*šŒX¦õ +o!'§©~Ìæ$ »RÛˆ,¤éOµ˜«ˆw ®ÑN*î̯M”ÀãæŸâp2Æ•øy˜]ÊŽe$jy”~EÝ¡4¦SC“sýåJë,5n$¾¥mÌí„ôãðWIãAx îÍï=A ³1_ч¨Fh<C¯£{1 éUôÄ‚±"I÷Ú`u°ÉXcâU€ú-aŽ5Æÿœð>\bÉYˆ&ÔTr/YŸ=Ç®¦›0N6D7¢3'>¬+ŒgI¸Ga³±Ùø}îþæû¦q&>-‚êë–DâSz$[ÍɆX¯>¯ì÷α» 1–LœOæHÚJâ[É#äðøûq‘ /áÃݦ+±™˜\z–ìX:²/9€Þ޶r¥ÐgŒƒžC^'ãÄ j ÿ_“ŒÃº’Õ¨·Ú¿å`êÑÈäà›ñƒ™RøTl$Å6f¿âKŠù¬L{ja$_!°+˜…˜DÄ-”´m29N•°#FãåõÕFí¯·P“˜ Æçc ¨*Üî¿Kš"æ@«©ÛØ9Œxïø§1~WÏòæ~Qúc3sQÖOùñ·ó´8q¯Ð!¾¦W$d,A]!«S%˜lOtƒU˜µd0m]š-Å|K·%á‰-£;z¶Alv´Ý@·õñï"Ö›I陞¬ß§¿ÀÒèsˆÄ÷ØOׯ‹ÑM¶,“›K™ÉÃÄ!ò‡øç]&6 ½äç¸ÆPbBœø™ÈKm§ q‚é†ý é4Û{wJ–8˜wÁ~ ?g<ôPr+óˆ^K"î%<òŠžj¸bÈ—¬WJy#î·—"W°ÍxõbÓñ´™®ê^ÁySÌ¡$ Å'¨‹ÅÍÁ»“‡é¬ählÕŠùƒZC&f\ȯ¶Ü6mˆH=zÉÙh©ø½ÔJQÁh­è+æ+g]Í-¥–½“±JÒ½¼Tqv4ÙPïïèyÔbqÂöÅÂ7ö,5õ8€{É7U2ª¥§´š‰Òh-¿Z*(çð"ø^â"÷jMLÆÞN$_˜Ídvü~…lðÎ_‘UþÌ]͉s{ÙåIòrUÓ*nÈ ¸ý”Ÿ°øÑ¬¬—J±dk"¯G."3‘Ëq1»¾5?3à¹Æƒ°ýò0{skÑÔãHÞ!î–ÊÈ{”2rᇄêZ„w%XB¢{£Ìlz íbŸèc IÖ'ÖY©q̱?­Z’7…õê*esÖ®M™‹|5y³8JhÄ?æwÐ5ãK\‚Ý$WQY˜Nüî*ûœîÏeÓŨä3b"ż=³ïÂËcºŠ\)/ŒˆÀ±ÐÃßUcõš8‘íÈÎg—Óû‰zúÚþ…yEÕG#¸lÖŽ–3݆¬GÖ%êPßÐq3´¸uã rÕúÄ5^ÊÇ•JÂÔ ;HŸ«´a™t-e¦Óר²œ…+ˆ1ƒÑ&6 maç!PY® [œnE¦Ö’c(‘ÎFäÔ×ÛÈ Ô§7P/ÈtEv.÷»-eÉ uo³{ðYΞdòy«¸àƱ¿ÓѬ—›Œ rk9#ªÌ ¢cèfôdzu(LÝ£žRƒ©æT& “ŽîO§R3±Ôýdœ-ûä—ò–øCÊpf7½ŽsÊNù‡¸Vè Û ¼&2âz®#;„™Eï¤Ó²×˜FÔÂOö'ë“ã‰ãÔ"æ:[mfZÒcè¬ôŽìµÂFÆt-þõÌÊäU²s€;*à\cT?Ê?ä¼üTQëqǘñ´—šÍLCNö 9š,Czˆ³x[¼U¹Špwس´•*O’xÒq«Ý:É\UˆË¸ËC¬¢0¿qGQ?–ä Ïø\|vþ)7µg\LzêkÆŽ3f½ÓбÄM‚¥ÎÓ™Sh87 í¤÷’mÉ©‘¨G÷PëpuÛ6~îrûTo»&\>*ÏÎç*óŸr=Ñs¶/Óƒmˆ £('RØ ôiú“Š6Ó§è‚LSf¸^’éƒä&jrÖ í§uå*IÇhªc`óóKøØìn:÷úQ™à3ñEôvÊØÙÂt=ú,=‡¾I—Gœ>¤Ö[û2Ý=Óø iý$éÿ¨¹tc¦7Sð¡l_þÁŸ^·ú…=ÀÜd²³ÙèÏé,ôL:; ]c—±×Ø3Lcú^ÚÚë8ëZé±(R|MvÅ®ãHÄ4d+ð×ço^‹žÊ¤aç²-™ÔLI¦Û EØ5lv“‘±çó+s6˹qüÙúŒX,oG£s¢bªÁDÝè(ˆ–±K°SØ»l#¶3žu rì+:oÚz”å˜6]¸Èù˜±z¯á°øOÄjº õíÿ8†dãs¯Ñö3¦ó%›ýŠ]ˆF —>z¯U¨!;‘)O~oÃû·©Êlóÿ°W…Øzüm^äç1Ùh–)ÏÔd_sþ²~ü¼zÜ$Ôã \_ÆIÛÈß±/ˆ9DK}ôô?ÖbœÔôDîW)E ”Egäs=›½Œ™ùzh‘É@M"‡[È–dªì?Z#¯¡²£åÔh²9„¼AcN°"êÌÀüqoD_”MÝ ¼tu*›> ·ú‡u1]e$zµKïfŒ¨=šÃªÿèïûßq j†.°Ù˜æ4ý==›ªýÛù­|ü]¶½æØúúìÈËeE…#ÑÅŸ`ʃ60]èŸÈMïä[óVO^~:úƒ>ÁÈh š‹Î¡NhU2žeMÌKc¿¡üag‰ŸÊS•Çÿñ:²+Ñ4¦ó)û’È®âx~åߎªÿ½.,Ϥg¬9ªÿëùýL€mOÏ¢Ë1ØŸõ¹fëPûÿ[«ùéÜš苵¨õì0f.ãßÐa«˜+Ï ·?°u.³±\®8?R˜ ö&üÍ1þC´:}à_ž‡#Ü2ˆŒt]œÂmÿ€6ù;Ê&ŒýŽn!¼’jKŸˆÇ„ùˆˆ@¿Nçø€rIž#\á¢Qå´uòè*™”z¢‘…Š§ØŒÍ…”iÒuá_ø{`$VL ®|¡öø£þÇÓQé-ûÔÍZµd¼vFrÛ)çH%Z•‚ëQ‘ËI}dŸ”*¯}$—gÊSù‘\Sê‚35 6ÜR;+·#p®9¹äV¯öh!mn²\-,RZ«¬©¢)_2^·'ù¥W›˜,¦£ÉvÒHh­½4Ñ:ýƒyñÇ3ÛxÏø»º;÷™ØØÆÜ&›ök ÃcchýÍ­ŒÅSt¿ŽmjÎhªÂ3ŽÐ~1>OÑý:ÎPetŠÏ8VY—¢Çð8錡ºú߿ᨱ@ŠÏ{1ÏÃÁ¿/îSÔ˜¦ÉøéÉíMB5¦X2~JDòÂ=‰Ó|à•T#å¥+1áò¨·[sû.ß~÷1mKªA5fí; õ|2~^Äo³ÿm¾ô)¤ÎÞjämx›OYšlŸ<~~§uoáω?RÿžìÏ–x›ÿÞ§¤Õë¸øG'cŒgx²7·?¢Ôû*ù½Ix/j3ü‘”Cõ4ª~ Nû0ë>ŸB‰~p)j>ûWødûLÀÈq$ç4E–/Љ ¦àQñ –;)~o\ã<‘ÂÛºª½7ßG:ÃôOíö:‚Rì¼6Njÿ㨡ýÿës²7¬!ï›cü8?ëôGðerîVcŽfů¢Ù%ÿ[½±sÁ;g2ÞÜzEÔÛâD ªWLæ#~eÛ8·|].À¼s^tɇÂó½»}þ?üüÿÎe_žÀô€S+Ø$é•5ýg&Â3ýùöÚ÷H­ÂŸø_ýYgzrz÷šÍãëî^€ ýâó:IHùkt¿+óüÝ-OÔOö¦ÞðŸÿ³Ùæ;öñî3¾#Þ…¾QjÌýøž›ÆVÂ}Úÿ•o‹§“ïiügr÷ ñçôL°çã·Æ§Üü7-ž$ñŠÿ-_øòoJ›ß}$ü7¼ë¸Vßiðý<bC“ƒDp§ç[/ë_êû"äóX<ãýå‹ýÓ}{|‚SB¯ý†Ð~o)[lüïÿ!é/çáÉoJØ~QÒøÏ2ÆÆ¾vd:½%êuèˆ/·óK3nÙešmŸíOã—|[|³=Í]ì.é=ç¹ï=¥÷ÑS¡ -ýì/Ž7á¹Þ&hôçíÓ$½fþÈû«©7‚í|_{‹:K™Žˆ Ù°Û|ÃÑÏuƽÄÝÔQÛ¾Þ:ÖÆÒÅRËùLÿlt¯À^oGwº¿X·þ9Ù[ò_ž-¨ÿÊÓ³ÿ8â.µ–ò>våwX¬´Åj¢l˜m]m¿kÿÆ9Ê!ÚÙ^ØOÚªé´ôŽ®žÉî•î–aÇ™“ÁÄ<.yì·Pž=®1ÿ{g'µõöýõK&î9’dfqw‡âî¶ÀB±âîNq××âîîîP¤@‘âînûd)lÛ T¸ŸÏ|ó‚Ùì$óÛsΥɥ#?ŒéĶ3«å;âuiµ¼Yî-·—ÏIϘ%‚2ØøA^—`þSªò½8ßÈ÷…ëZ}·bI]å›ò>™•ÈßÈ?*÷…± ƒ ÆÇŒV`Íÿ<#˜ÇRu)¹0@!Å$ôf³b€’êKn1F(­Ö‘“èåâ=Ç¿5j›èD—rN<À¯aŸ*L‚2¼sM&áûÿ‚¼eeB./&s gÔ¶Æz¼sM&6vê6ßoNuR_škÀ~©Âi¶(ÞðÎõß„ïÿ/H&5ƒ› ¯z†ÏÁgU/"M~Uøyh\Ä~-›êöÕŒÌÅú´¯3ÔÏIcl춤R‘ÈãéG]'c¸§Âô÷®ô'|÷Ãsn©~œ˜JÌbÎz 0Á\9ùóÓ(êÑCþˆègO8—ºM¾4ßàkÖ ßý_pŽïgd„C…tZ%®{¸¾ŸØÅ=˼õ ßÿïsƒaÍå¾Üú$:F lˆ º±ˆ>ÇyÞÞA‘ðˆŸ tœŽ6¾irÈøçƒ¬|FÌ}{0áÿ>{¼òë˜2Q "Jº‚‚Æwõlk¼õ@ ø÷©ÏR¯W^.6ÁÔÓ 9ðÎ}P ø÷Ù.<³Çñ†­s–£=×µÞ«úÿiåÿO“Õ1TÍ­ÎõçËò0T_êþþŠ:Z/û;U¿Ë¡˜MŸãôܲÂÞ¿7ۙߩžþ]šátþõðf|ìËn!T&­E î•IxÌ¿MfþVÊTü â³î‹DPPñà/âGõsÑXÂÑÁ]™,ˆÆöø±Ûâ¼ãwD¼â]¯Ç3áQNZöTo»ž9B¯àzµŒŒ¯«—*Šâé™à¸„Ç}8)Õºû#lïåS÷)iA/°ÛÚánFšB¼m_øM1á‘Noqúïöaþ7Ø»ß!‘æúZÙö2U¯¤m“S¿ã·ÝF„Çþ;Ôæg+M”¢Ò~:¸ˆ¶¢n7q‘íˆM05Îú†ô<àÏØO×Q÷âËp¦¤næ)¶ª¨i+ˆÜí.z‰R™Ïßñ<åзò☥Oã´ö&·U$5’AB$Ž •âj—·ÕÁØ×¯ûR†Î Ž{•ðÿsøfZ>ÐïµýÎòÑJ(c¥äbv±ƒ|âí _=Åy¨–vÞíd†¯ï&<Ó?E=a;šj5y=F7Í;øKm»ÒH¾ÈeÑðë,¬³\‡½êœâvÇ=÷úêKãl¡“=R',ÅÈl«¬ïóØ3½Ì쪟{§cRYŽóßì›GŽ½ÕøÃ¿p ‰Tû‚¯âµTöíA§äVºúZÙÜ·]';WÊ¿÷ /p½Ú¬ˆº ð1D¿ã‘7â¸8®öNæuÛV™•oV‚M’ày¤}^ÇšÉ(æ¶÷uÿâ×=ŽïwzÔ¿r÷µ%²ÇE÷q[ãñkÅW}}øÌt¹_ÿ[â×ä ~õ?{mz}§Þ£ÂãOæ«ÉUõ0»‰‚Þ9JSã¤ñaVü×xWÛÍïÛMýÍ7# o#•õí•ß;â.O j>-‡× jM®ç…̯ýhÂOøt*‰ÛRøè÷ºuq›¬Á÷¨dÔ8]7Hù†]ËLMA,a{ÏÈI4ÃLŒöÅsÂOøtj‰Û.ùN¿ãËóâBŠì>€*ILq6¢+##ë9›G~gÛÖ9ï%“| Ÿóe53èia~ëßÒøþ&âall¤Y>è…c¢+”©EN K±ËQß4,zù°÷2Ý„Ÿðé¼:ï/ïu‹_m_¯È æWâWž.ر)twä ¦ ·ß›‰Ëe’v‚¢Ëè/ßëˆ'ü„Oçóú[#ßù–AÜÖ4~tÜŸÚËv¦'ò qß™–¯,Póã©ÚPÉ .ª§•kÜ®ßÝzÿü7éã{‹œñÊ'¿ÚrsY¼M´{Ы¹CÚxÜÉb[ÆvP[,©u’-Xò7ß}KxÖ¿Ÿ _ic NùÚcV”j(¯¼û»[&X@)m¦±çx–1þ½ê•ü›ïxù}öÚ~g‘‘õjK…Jià}Šÿù{k±æï^+ÿ'Èá¹ëŸ ‹“pCFr-Ô?Üwþí\§öíû¨þÇÇÔú¾%øîVÊÿªóCE­ÿÓ; þ ˆ÷õŒýÝ﻽ڞÿÏ»þI$0Èj—»㘠¦<µõ­½çâ»Ro^÷òwýϯÿÊ-ªA¼ ϵó·ó!q¯b|Éþgýñïçû^]QÜÁV«Ášÿ@¶øil}/Ê÷¯xÂ?c¥æ‡sŒF¿¹šAÛc(}ßF-UÃ&Šýª“¿‹bâá;6áÞþKr|æÏâÙÌ U~ÆVG_Ô—þÌ-»Èðt—þNú2k?k…Hmfük9€ @€ @€ @€ @€ @€ @€ @€ @€ÿ÷hó™=m,@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€Ï‘<çzÿdt%ÜóùqÐÖ8ŒJ¸7@€øç¹$%ÜóùAɉՄû @€|~t´øÿ–¶\Â=>Œkj°–pßçFk?•pßçEE%ãîý¼ ,*Êîý¼mÛa½ŸAöŠüÆ—pïçE?·"îý¼ÚŸ»Æ8®æq&ø3ׇü &Üàã8þ`¾Ó~Öþ1Î7RQ%„„û?'Nâ8—=ïî[ÈüO¯—d—ßÿy(lÇÂÂ$áºÚñõ5’^ÄùÎ;+t?ßô?]¯¯æº²5B¾¤GúS½Î®³ÅßÉÖŠRu„Ü®ÿll_iÜàËãjJöQ‡™Ýâ;º,¾—— }Lqö”eÖÖ«ù¢ÌÚ°{ÈGez¶Ô]É>–në ¤%ޏß/VتWR-ùvb³ÿØ×§p„’atª$ÓHn¦Ôçú1ÓÄ•à’ù&':m¿Z¦{ˆ„Çý›ñÜ¥s¿0mé‘Þòžì”Ìäbj¯VÂ+•TÔ8-ÓÐS–Lxì¿EYª<!`'Rìñ¤…óL/Wêz£’ŠÚˆ ½B|úŸÕí8¿´\:Ã!~“˜Ó"ا®ÞžFJÖøÙ¦¢ª›3¸ΙîúêL+á±ÿß‹Y¥ëÂjŽ:( .£Mc®yTw4wHÉcåes©0×Ó2¢NØ(úîß“¢å}ìË’°™‚ÌP&˜ÝÏu—·Š=˜ZÔ÷b3V,¤ÎácÝ·]ØS2¢hDÂ#?œÊj=ÔÁŽ\5½‰…Þôsº*½š®Ã6g}l+ºÑ—˜ÏÞ[òû½Ñ®`WjÏ0¢·wÒ'«ì#O[ ‚3ļ?Å“œ.-Éóø—Ì|¦ó“—BTQ©¬¡>bb©¬T5w^Ga¯[½ûÁsôw±ØÕŸ|&”U ðë¨YÌW¬À®åK^ÖUÿËÞe®p©éžGT7ýêÎÐßÇjGswj.¹ØŸ)ã=Êäq߯{ÇC¨ŒÜ…jGÿ,—V‡òùèqÜ))Ó¿~c¿øWÒ£=M¼²w:]„ŸÅæb“ËÑúÆòdwW¢*éõŸ…äAb²xžãßafˆšÒy‡Xdž±‰rä<2–îì]F`ÏZâ˜÷×MB¯#¾t—!¶x'þ'*ƒlÆ„B×xfŒüœ]ëþÙ³Ös†,Höaî;Ê[Ô;‘¤X†žî¹î‰¤§óµþƒ+;÷Ü_¸·¸o¹Ÿ²e‘Ї*N•`æ²#)’ *sû¨Ìhî±XŠ‹¤S5˜ŠÂÊÊ¿!ïMJ¦ñŽrƽïžM'üí›Lá U,æÑSø LWn67ƒ=É/“W +ù® û%wž.fOq)d§ÜœäŠ c~sÎg®' ݃øÚö¸·CÅ×+§lÏv'2îUÕßd‚3ÕEº¤­ V,*Ä,-9€®{UCúNŒ‘)FhÇP ¯´ÓG íø¦Be6á9>Œ²¶w(ëÙíç}áyZ6dlèÆÐ~ôl=­#<‚ófæÛQW4~ͼbcâ55:Ž£ê)x¤f€©áyí€ÖTÙ'{”þ|_j6qŠQà”t@H÷‰ãæÒõ=3˳žêé©ï9è™Îu…;UXAðLwò[ojŠZat3-üË{÷£Í—7¨¬äÚh=`^äÕ'èEÕ.Je —Œ~îXêL¯$Ñ«K§ùé ùÉw¥SQ?ƒUÎIÎ îÂÞAtEo36ÐQXOwbËð*uÓ»Dî»KµÙªœ†~ÛÛ+F Óòùºš›ô‹Z#å;yÂÞ¢2:ï9zxn³~i½8ëý^Åû1PQ^p‡Èä©Fd'3‘¹Ý[ÈóÞ:ì¶*;—9â½AL%ˆb å«166‡4ÌwÝwdÑÆH²p•ÛÃ.¢ûx»“½UØTIÛ+Tv'<æCÉI¯ãTf+×Rí*>õ\qNð$ñÞe&ðwhÁ›ˆÜMdrÏtß$N“© :Éïæÿ'„%¨"üVé.ÜçÆðy„ñÜ4®»Û+©Áa%#“ðýCez)Ý‚£Ý¸;EÏ-R¤³?{ç’Kɾޙdê13šÝÇ1þ –"ûP5µ??Y8¦^UËËwùBjù{Å”"¹ÅK¬YD(tiâ,LŽp¶s¶rŸv'¢~ S×¼•ªÁùôÍ—KmÙØ%LC|?Â3ʬ”_ò7ÄC*ɇ{!šÐ«âýاrˆìMl±mñš+£§-ñÄÝÚGµeò3)é'^ÿÀ¶•fIÕ#àÿé"Uë©ÉZyœ¸L) ÕèùÄ]±NøÎã™Ï‘#ò‡È Daº'U„lUþ·ŠYÍ”D-L®"Qâ;ýFãL;¼û³Éî”fª”ªâ01L¿¦Že–ªTTgÿ»ïùxz8–‡M ½@Ö®ò.æûWŒ¿ÆçÚH}µŸåŸ¸l\*nÊoüqEéÜ{™|vg=q%*ÓÈ ä…PF-ÅÔâaí®8Ϋ‰gþ†È=;ønø|o¸˜IlÅÖcOÒIÙ¢|Ma‘X[¾)–† Í…oÿB­7JÉékchZUu„VQ«)Ì¡v’Å=Mɵüù?\Íå]\AD]“ÍÂ-f“SÃéïÙ»\ÞÃUdha¹+–üMüþ-yy„g™qˆVS~(]⿣ϒë\YÜȃdPPÂw(Èdžf‘»]S¨GÜV1;™JD¯`¾c³ÒËÈì ñ¹8ñ/Œcllf9¶FÔÝr¥·”…ÿ‘jâè¬Jô£s}rTìânäY#¼ÄH™4Ë)CèT!¦›†#›Ò_ „ ¿¤16öGnŽxUÜ+ÝUÃÕºrb¾=™–ÈBŸa‹Ð•ã»lÏ€Èo½Ó<“O\Åyæ`MaÒQ~ÆÍ3Â|f¿ý©U…RQclì·LŒxYrªºÖIk,` ÑW¹©Ü&–œúI>}bdꎷ‰©ô0%“Ö_Ê cÛ šô…Ø\N¢Ì…¿°_±š<'Ñ]šOÍ®M—ÒqÉ™;¢_„l;63wù“lg QœFV£Æ1ÅÄûê×Rn·MX*k)ªV]~þ—Ç16ö¥” µ×ò)%´ŠÊhþ{ÌÑ—…UJ ©Ì'¬ËŽ®]½<Ñ ”/IûÄ| Žáâgó;Ä#ÊnígeÉô¶0iõùÒ7Ò*µ°ZFhÁ~ {i?H“%C}(Ýøƒ¸ÿç¤ _ähä\}Jͦ*É .ñÕùÒJeƒö£¾EÁ 166‘ŒÁ×”(ëø Ôy>V²ä®ò&éœôò7ñ꯱ȳ”¼æ ¢jÙ¨Žb˜|”@—b“q÷øÕJ­‘.LjóÒ˜ØÓŠ<ÂîçŠ&Lß§Òƒ ÐF]'×{|¤ÆØØYŒÅ­ðn$Ûò}”–JA~85:ɤn)sÔhm¤6B«þß^)ÅT±+Å1Bkî³F8áeÖÐ+䱟d5q4ÆÃvøŽÄgf3Ñ|#å'%“Ò]IÿÁ›ÀZbVî– ‰¿ð-¤óætœ[ÕäKâÈO®2é-q óŠ’‹²Sé–ìi±ªœWþFÉ .ùÀN`4Ø*îâÏI‡”Tâ5îŒ8WJ'v”ÚòÍâëùOãU­ú“6IÌLä;ŠÃ%—B«¹Õ¨ñ&…þŽûBɦîà'sgÙÜ1~ mò‰ÑæB*Š5ÎÓGé©Â]ñÔW™.{ÕÙ4×…ø-Ô·Þ¯˜Ä rcþ߈/',æ‹3CÙ©Ÿœ™¿Ñؽdg²{… ÒQ¥‘~YI#ý »ŽmAíó^¡W sÕòa¡w›¿Ä>§¾fÚ†&|燑ŽúJïolFýA¤ú½¸\ì'R&hYÁ<õ‚ìü@“]ˆ9 –Ö¯Þ‹_FeerÓºÐó/GÔ?âpøLï"±¬ÄKäŸä^r5õ }‚¾V;¨LS÷}àzŒèB7ñ™,wbd"É1›ÕŸ¨±i3tŠcaPYF\!V#” ú%0JV/¨E>°›8–È£>—[(Ýô^Òf¿+‰»3äƒÿÎ÷Éà)DÌsëÞíô·ô"ïXj2Óšm*ôUžª4¬ÎV¶|à\SBR_#­*òù¾ÙäzFÎûH¿3„™nGùi®DÔÚG-`"ùÕ|jzœ7µ—'óRyYª+W—jIÒjŒ](X{SZ~_]%?“×ñ 8á{þ Û¨Ÿ¹ÕÌÏd5:†yF‡{k“-½ì|f2sœÎL²äbnŽtL¼&ÄHÆG­$…è#ö³kìŸì(} (eXÂßÿ9Ýœ©ÙÜE¶#r"·šBŸô"g{K° ¹¹lZf E:(Ý–úK…~S»þR?¿­[õðÝs¼»™$Ì#ª9}ÕÛޛݻŸŠõ&!dî…­â2A”Èg•âÊHîîGvÀíÛ·B>ÇFj,]žžD?"û¸wºÏzj“ÈKT.¯×³‚ØÍ+RR9³tGñhuÔ ¹ÔGW"å¥Áöèå Ú@lcO~D'`Ó˜mEôœŽ¨¾ØFu ¼Ìnjé%›s ÄGR 9£v_¹)I¼óƒGà}üT­åGÝÁÝÄ=yÀÔñvv°b‘±ž1¤BdW²—ØÌâ^±ƒÜS]«–OÒÙ>Qa]?j=¿b†K÷Dx¾s\‹ØåØäILsMù­ü\©ŽtGúQI¯îáÙXéo8ðQÞà·ô(G #Џ±çñ„ºÁŸá%Þ’fÈ›¥ìÊr­¹H~„ÇxE:eŠ™êƒýêï3™œJW`òñO™tu;+,\†H»äû*+ÔŸÝëf'õ\üJ9 Êýn·ú¯’Æ}†ösçÄâ¢ÅåŽJ{ÅfâNq¿²P?‡‚þÒÆ¶ê\Gý¦”RQÌ„¿ûP g“w [YhÆ–bºëÅtR~±¦ü¥6Q¯ ×R«|„ÏxC m´žôë?áoxéóNg-v[Nh,nÛ‰)¥êŠª~¯TÒ²Ji?zžNë aà't'~%(¨)q˜ý–ss»…9âMa¸°Ì®,¥Z]K®\¶~@/åW6‹ßÀMŸàuÞ§qPN’àjp͘Ùü9a'w;À' õ±¶L»©Ž”{|Dî÷ŒÞë;÷‡yg…ÎÔʺUÚÃ&c+²…Zbm>Jx(ΕGké´`m¸þF~D”è/t°TñM7´°ëíl }ñ–Ø”nÈ-âš³g™ÇlIa›p^¸+5Súi ¨êëÁ=½ÎGÜkòý“¯4,_õ—wÑ¡“j'fÍ´¥Ú>hõŒcœÒ±6™bLEÆÃŽgáI7¥ÇJ+}¼©WÓò+>¨v}C\ÙXíÃ$es©µäz^ù®w2ý•:ŽOgûË÷sòDñwÅ´r&i «1~¶9›“)ÏNç¯ Ï…o¤õêW`¥6V¡¥R±ccûI¡Ê>|4A%´ÙŠK˜B”nÀÔúKi¶5á/uÊïsˆáÒDá”#lx¾§ðR((Ž«Ê ´á@ÔŽÈ3Å}Ÿy‹{T¥6h§ ’Œ××ìÙô}ù‰¾S­Á×þI’hK\ñì&+1ÑœÅO'I#ä ¢"ß3‹eÅVòz¥“ÚB7`%PÏÉø/ýÅÄ>ª×nËoz _ ~æªtƒ=$’æ±c©Ì|ué²pŸ_ÅÿÂ…s¨ºôsz 9’ÜôãÎs·™ÚtSƒóJã¥Å2/Vœ2-$b”þPi:ˆ‚³õÌÚ‹ZoÈîÞ¬—U'ªo4f¤Ë0©åùô,i§)Þá7Š™íÏK¬eVïÊ%¤BC±®È }ùêÂtq4š/ì£=Ü%~‚pDÞ­´’S˪´OL¤LÑŠ«}TNoǃÖjÛð=¿RZ|ª¼íŽVvÅ„¯£ú(øÊrE¥»rY^&¯“G¨Óµj¹Œô|^V¤¢ !©®tN Rð͹-Üö"{T,sJß+Ïd$OQŠj¨ › ¼p¥šõ“4qcÞñ†yC¿‰¬Oý¨KÈÅÅrZeŽ2XŠ”vË“•%§ÔZZ*û‹7m+$^áwqÙ„òBjñ–PïÎ×r gx§DI#¤ûÒqÕ‰rã³x ê¯/ý$ﳜDÔfZª‹ùb~ Ð^>¡eQˆŒxR§4’óIUÄÂb¡†”Fº%âÓrkù‹|+±¦ÒE>*>F·ùÕâ/BN‘—:É´ºpÞƒ€_ô„Ÿôñ¬ãê{2ÛSüB5¦–Pä®à"©PÂaƒÜ@‰‘ iª0@X(-"¤–|{ôšñ? ?ÊKå¼Ò1‰øDäärR[ ª=ÔX•…¹p[ìÅ%ü¤ç1?œjΆ¾ÍÖ’sÉá£L&7ÒˆßÈ£”ªÒm!­ðT<-5•«û…iÂhH‚¬É?ŠÅYâN©“˜Gš WÒFè ôLp(ž‰+¡;ÓýW¤t¦cº¿ ë¡´(R$ææÛ s¤¯Å…BIåär´¸S¸)nω $K-µ³WëNéŒP]¨'vTzk õ:ð1jˆ¿DuwÏøé4tMPé ”¦ªM,–ç]BOaØYL,÷•³Ëíº »tU¬$¸m‹çdB&”™ö8×à' ä©ê"½œ|Ø4’}r®ÿ>Eƒëý¦{&'‘Z;©ˆ°›Ÿ)ÞVJŤ5öl¯”OÈ”\DØ#\‘2ɤ¼B^)­ea 8^Öµl`,Œ/à£øç¿u®ãrj6AÞ“Žy¬m¶Wé(Î,±(ÿ£pNôÊå•¾Ê ™’"„i\ñ†˜Z:.&’ŽˆU„*â—r„^^‡'Ð4œ?ÿmæóÜ¡´žê&„²Ùø§b;¹ê…¶)”ØFº«ÞÐçªû¥|1þ%7ÂÎÊÚfŽ”\bÄT⩃Öî,:Ž~ð·kÌûÞÕ¤®D™ÒÛT¨eLN%.^:| ¤´ü~¥.¼¨Í—+ˆaâvq©¼Gêa¯Í’öÜÇH>©‰ÄÚëqá"¸ »ÆJïÔ C·”‡ÏËfg–Ó*u€[ˆÒøËàê¢@OãÖJ+¥UR*ů¤T(KÅ«âriœVn#o“ÊHwä§êí¥V8Q£¿]ã¯4ÑZÃP2=ƒºŽ¯ÏÔòj¤ì]çý‰GÉÞÑÞÖô@fwWì%‘ò/R;±½TS™¬Ô’cì ¨¨|^j,û”^êý'X­þàéÏh­äŸ³É¸ªÃi”3´HA§Ÿ{û’"ÙÁ}ÈuÓ³†¹Çâö2ÝÙ&|N¡†í3¡*¯’;Ëw¥¢jûtZú^j)TûÂv†d6ÿ˹ý_¥†¢qZ;£¸®ÖÓ{ª…¥ÓlAJ¦&R[)uš¸Mº#*©•JûA®#×’8á_\>%+SåÍÏwáu~w›ß)ý¢Ç1Vc«³^ürñßcƒxFɤ¯PrfiÒIi"”`kSÓÈÄÞMä}2Y‹m â¬gÌ¥åÐdu©m/Û”™êõŽÒ\/ÞàÎÐkèÕL.Á£ù°ÇT:«µäÚJ•×§i åƒì]zÛN Ò~†cñH£úÝÃõabåÝ\ðãéE¦fó-øZüx.Rð+u´¥Rmv+™¬ãÉGœð†2­‰&Ž´‘!ŽRÎNä#>ƒÒZ&éôõÚ !Ì |ê$á¿BÜ­N†Ib¦Óç‡ñ×ÖMë´¡~Rmó†ºDKú0;Kè&¸…¼*ŽS’) „tâ±çko8Û”=GösŒ ;¶ßñÜ{U bh5,—àÃøKxC[­VÒOëápó¨?nU¬Ù ˆ†K¬07÷àoè2`ïÚ™ki±TPþ^z*ÕU‘:–Ï@ýLñF±_0ǽ-=¦kª#»#­³²k—'÷Z-1n㟌=F8ÖÑ ä1ÇUŒæÖ«:©)Ø®gѸ“eL‚UÕ6}÷Ʀr«¹há™XDÞ§öT{+½t/謬àÓ²½©¦!#3©è¹^±ËíÉæÌ‘Çs‡; |æcœÑÖÈbÆV#¹µÄZe]±¦ú’ûò3`*¸oá[F¸¹ÀkÜÒ6}¢ÊåÌæ,·Š_-(Êå™RS«¡Q)ù±P€åØo¹IœÈ®¡º´'“ûš£ä×Pº½vï0¿·†›»Í¦f¾ þ¨Ôþù¾}W|µ@b{¶ÓãƒF”1ÃÈnîÅkÕ]Ÿ¤2 SnÁ\f§²øÊveŸIn 7’ K…¤¤Â®Ÿeîå=cÜÏ]œÝω5ô ñ±f­¥ÖFë¸ïM-üj{⟢§Ñ=`T Óð-ÎFCtL[#tühot)ÉÜ  0åèöLîªpIœÆcI¾†xÄ®¿¶p˜CDwIOÒM”%j3SŸK$Í@´i™Çk 4RQÏô5ÚPGÕŒ{fzó Z £Þ¨¸¢\ýH_´‚ÎÆä§Kx9*ƒØH¾´ð³„*Â,*ËÍ%¿P]KE5]_x–x›{‡ãI†nËæ÷àcfMc4^ôÚR~ÝvÃ`8ßHm”3î˜;ð:ØÂëP"ôÔ¼¨¯ú¨n÷^r§{gxŠ'¨±La³¹éªMñQrk)¿ˆ‚äqpïwÕõ< ޹û¹ç•è ÜKm4”P"Û&ÔèÇÐ÷fz«‡Å[—Ñ·0 ä´m¿±AEôõ2Nÿa¿ö¹ëiC$WzÊW½©Aô:uÃÛˆJË\á#… Nóvsw?tåZà\á:é<æ¼é>Nv£p%Ä:Ê)½Ö‹x¿·5µ_-ÃÉquk”µ×ÚgÎÇ!£ -*‹9+ÊרZÏ|°gÏçä ïfo62 ¹–¨ê=Oñ>$‡’ë¨ÛL/6šÝííïì)Fö!0Ñ›Hæiçºèªê¹åYEf ;²ÅëJ¬V-þio¶ôx Êc>3Û[ÛÌBÆ/èh¯;à8?Ç·Q7X6ýÀœã»yœÆìrê 2±“Èï=N&&Ir/•”ÙÌœgÖQs½›¨ýôRú"ó3[ˆ=A/ðvòèîo]7\}‰[ô(~¿´Lkûz$×Ûÿvƒ[`;LX?Xy­ÅF#ÎêÁ#ØdÓMÐ-é>H¥á~A^`îs*›„êC–#ÖyÈtÞNd+ª3•‹:eÏ{;ª3‡}À>áJÓ¤ÊÒú¢çˆ+«‹óT§òñ¤Yê±øžfc/®àÛ u†Û°ß:f&6#dx?*‚ƒ‹à"’`sx}‡F¢Íú–èrïr}ç]Àvæ"ÙtfÛ>îȵäI®ö´óô#c¨oÙöü%¾³€ÄÖRµ X’)…ÙÞ{äX²9]–_$¶—‡éyp\ Ñç£þºˆ‹›k9Æ,³/>ŒÀmè1ê…ûýp!CÅ›@ ¤àpíÙ_þFÊJ¢&ÕŒ›Åòt*5…ZAk4çDÌ'b=…“9*SાO¯ÞV»«U4'\ ˜[ýYr 娲Lf¦,ÛŽ¿,MÔ’¢…¨&ÜjGërè)N‰‡±fZ…ªÁ‚hbž3¥° fi­`vt þ¤–ý‹Ñç+oo=:7݉šæ}éÍISÌf‰í}ZSe(“: L°gñ…ï<FÁh-–VÄÝÑjÐÜÖ)­Å¥l:úýŸ]ÉGážF£HÏâ•Æ6c©YmÄ›>X4ÖYiÍ2Æ"ô^Fkã؇üÅ>`>w÷îYÞLÖË6b ÆË&eó2WèœÌjÖ-Ç­´Š~ÉEÁYµ£– .C‘p°ž ¬Ö/iÔ‰R6†@/«ë+Qzs”µÞ†eDÖuã¹­.·™ÖjŠ3 í˜Ô ϱíZ†£Q”ö4Lœø/]OžáÔÝé(;XÇwäSóéyBèÍOb³r)ŸÌ‚§(=üJO¤m²­ÍÔ‚’ú*­ vTªæÕÚ)»ù/èÇt±…Šâ¦f ð5,ޝá‹ÈÀup´±Ú¨„Ê 6ȉNUAÓqFcº†•ç7½œß£¹·½÷Õ’ùÆŽ€³mŸx‰[ÄÏoJåå­R5¡ž0FÊ™V£Ô加îQvÆpQß­uQ{(‘Ê©‡†5¸§²œG_½Ì$Úà4~ÀaC8æ°ãv_#9>!%|ŽÃ…Q2kšï Šþ –sÃ{”šA¯ó&&o¸;y‘t'v¢˜Zͤ^ qÕ¤—ªªz•eJ9ù‚xRÚ/wÕV‚ŸÁtPD˯(2#¥®³?rHaÀ-¨¡2x ZlÆOQu˜N‡ng,1Ÿ±x$jô3O@]Ä1f:óKËåßn>VïüéõdÒÙÓõ51‚¸åÉàiálç:ìá.Lì ŽqÅ>Â]^–6ʽä¹›¼Z\"¶Êuµ; ¸’è”™rŒ4ŸÏùùÂU9‰¾ ˜I»¤ÏC¥Fá(?îj4Ÿ˜ãÌâæy¼Ý 7x\²1×6c¬¦F Ñ"ÿdUfOì®Gô$[’IKÙ/-¶s/¸JÜ.vo(å@,è¬ÿ¨ß‡ ¡«xŽb2æ#Ôz†Ïᨔþ<À9° 43˜ùŸð}<[û?½ÐlÇÉÈ¡nŽìïíëmFuôlôD¸–:cÜ•= ÌÜfNÐϨ,Ìþž8JŽVæjûÀ˜ V‚‰`_íºòPº*Ž“òÈIå J9eªvŒ…I‘—¶ã‰b7¦µø¤áôAÓ‰üA»’ãe¨^e¶úÙñF2´Clò?2àŒžºnD$ò ÔEò–{ú'ܱއ‘"J:÷oCš§óÐ#è…ì@a°Ü]c` ¢íìë,:Ž®ƒ¦` ºê×õ$0 ª©Uë] `ô7ŸœyʨnÞ3ªQÆ ñ4V­° ¾ûP_œç1+m;·qzXLÿ#6Ž#Ö©ÉÞñÞÇžyÎg®¡îqNÕ±!âxHtHÚȾd(=–ÎÄTcF±¦@*'tÀ‘ÆI\Ïgìõ·ŽƒËôÅ`9Ž!tÃP5³í±³ší `¬Ã-Í»b˜m>ÆYÌfG¼Ù®¿ÚÞ‡6n•ñr£—íÙ£a5õØÏ79×[ÔM=ò.ñlpÞuw wÖqŒŠÜ>)ÌÙÀ݆ìB¥b&±û¸i"R±¾ÔB'0c›~¥õÒj‚– ‡^nFEŒGææ0£)¾b6µ™æÄ4Îlôµ³ÇÅÆRTÖ@Vw³3|Æ:Ðj81²ŒH»ÆÝ€sê=ùçp/Xsz0âý†ºëMáYæìåªè®ïiãvUu}çšæÎí9çië-À,ã ¢Ü@I§ë±à>`ä1—` $׊ӨŸK ™;¬Þþ=þVþLúu8Ë(lÎ7N[ð7h3šŽBŒµx'ež´j[_ÚUήÑht µÄÇŒÆt«·U€$üîX¥oPµ‡*ãmcWV =+Ýõ<ߺ9K»:xÊ©ˆeän:-ËqùøB:i²Fo¡t¸„1‡Áó ( 2jø‚£ÎøÒûÇø÷ûÓúE©ê‚óQxD¢!ð rš•LÉ|€·šÅ¬$Æ#ÜjŒ°C'P;£¢9Úlo„#W‚Ið¹zõwîNNT#g{y=ÞÆä÷xO~O WQ玈S‘U݉LäJæ&»‰þ‚jBg’‹5µºðK´ÝÅÍfÛf»ûsdëœUÈØwηÚ7O¡”ÑJk••0å­ÓÞ7·˜#m úÁØÏ€bè0ÎlG¡Ä¨,Æt3UÚÌjçî{Ð ‹Ë~£r1ùØ“˜ÜG ð`OWSçM—ÃÓÒSÒY±É}Õ;ŽÚÇ¡Sz_xεè m @^½ r[=|I­tÖHc+lƒî{l«èdåóU÷—|R¦”tÒ ±¬’Ç.+È|aL3³™×ñ%RâƒFVü=œŠ.¤5Ê\iøÍiF^cì¬v‘çó÷Þ«rÓðCé‡T%ºÙνÈyÇÑϱϳȻ•\Bô¶cfÑW¨Ù¶ç,ç½OÞ¢÷ –Ö”Ñsk•Á|ÜLkêV2³4 FÍf LÚ+ qKZ&º•rj?¥ˆ\Z© ¯áúø9¬ƒ/›‚o¤Ù ö†ãP*|Κƒ·éGõûè¾±Óèlþb61NùQW­ºL~ÿù‡U„ÇâP±¶Éï&Û¹2»†8;¹÷“=¨ãô¾pþ™ˆ&Ò3uù®+GHôY¨Êmû™Šø%ÁÛÑ2ŒŒžF _>Ÿ _…P!ÝÒ+µ©åÓ2  žRÏ6™ý™¬É0ÌË¡çÆw¸µþDKdrEc¬qܬav1Gá‘Ú5e´ZGûNǺ ,¦W õ¾ü”]NÌó¤ôž¦{cÈ Càw ²~F™¢´«;¾%V%c+¨£O´}d,.Úè‹pF_¼‰f7ë°1¹µ”J 5…ZéÝnA¸Ã[Kà¤m¢OÈÌáF°«¸”LïH†Oƒ™rÞžÌqªZ@;'÷V8ИeÒ¨C€‡âÔv¾UÆŽ;ˬS~èOl50¾Å¬šW]&XáQ¬ße&/U¿2C®­þîYOý‡|cQ28eÁFaÔÍ4ápÍ5X<ôR‹*EÕËêÊwf[ %œéÉåäTb$UU¨,=cWP©¼ÀûŒ™ÇSܺ “ —(%H-ª-ÖšƒÛ(n®>–rj—ÁX§10ªŬlþ'þöÖ œPI-¹:AÍ® §öXgûÕzreºIEô6µ ÍÆÏQœ燵´3ÚDð¾`GyRmg¨:üQKökþ29<¯Sr, ?‘XÉŒ£.º†;»ª’,3‡ÙÇlg3ñ1â1±¢<_+Ý8#î“j7䟔>ýpOÿB_Eéf4Î!–Ör(…¤ãRŒšnÔëËÛ”Úz/]R±òê9l)ýQVc#=ì†oÁ°,p)i¤Õòf=‹IønãjzR-5Øë“oïpé|0TŠ˜!†]yáÉKüâêëïÈìÞFô𶥿âBI’å]rµ%f”7Cä×;k‰µPÐå¶VØuÿk(¾ ²Ci? 4 ¯6KÝ­„É[¸H®’Ì€Çà˜ŽÔ¨×O#üíŒ,°Îm×¹§”«ÜDn XRof&öÅõ €ãðŒU}ÛºÜ5ÔÞ>,eXÿðIîQd}‚u/r,r.w•r#¯1¹b7EQ»*»t„“ã<èÌ‹Ã{zU´ wÁ ÍŸ|,WÑ-Óú*¥PyàÐj)õo¥^ôuê9?R餕Qñ´>Þt[‰}TTzë42E8Fߥ¼`SðI• 0¥±Î˜úÁ|E¢ 8üí8ê!‘!YBó…¶ ÑB.‡´ŒvŸrëîÇŽu‘u“¦›ñÞ¡· ‚Ò^©+Wƒ‘ #\‚àL¡Õ8õ±6 úü>Æê›¿6AÏÀThª`ϰGíª¯‡,øBÌíM§±½RA<Æ?Î?ÖHi,Áµõ)ê"q›RŒ´×ùu; :‚¡,08«×¢_çk+Cû…v¥Câž GtðÉй  O]ÏÜ‹ ŠRÙ­âL)åJ˜^F?­÷†{Ñ;z‘¸°ÙËlƒ_ T¯g‘ŠÊíkÂÑP;Ó^«¤‹ªšÌF¸¸êe+yªeø½°¼½:bŒD8ÎjÙ¹ç;'Ζ£ç8…mÄÀÚM%—¶_oýú—ƒ¡ÎÐΡ5ßjŒ£z𨈴®$„I•år ÷„Ærqu›RE}¤ÓÚë[t°  ºBAlŒVâ‡èG´ôm?7&Åýæck³?îy•0BóÑ<ÐPžJ·¢¦Éƒí¿g‘ÿÞŠë»Ñ&”ÍÎÎX# B#í¨§™œ¯KËÕüPAÙâ=Ðø$!“Cê…0ïh<ô$<ÒÉxZS…–2£$SÒªuÕ/µÁú$½ 8mgß%ôà¢ÖZ»¡-ÝŒiÆs$¿í•.²«ìñæqk°eí¶N í ç{8=ÔCÄ;\Im‰!úöù¢¬]Ö2«Š•Æ*`æ¼×®€Îµ¸µ9EûZ\$µÐÎÀæ°lül§ ~”2xSpžÁ‡_kl¼3â¶kšgµ‚»(Ž”3¨C4I¡g9 7‚I ·ÞE¯ªÍÑžh«@y3Æ7èí(öð 2¢Šÿ±oŽÙÇ\n8Ð~m™¾,AupImŠØLn¢É°þ,>·”4ørp¢!ltØñÐíÁr0 !B£#ÃÉÃt!¾*?‚w‰”!ÚUýpD_ ¾ãÀdÛ{qð´~F‹ÖÊêñÈ· çø– ð8ƒ°+ê¾Æ1pí3~ÑhV°ë™Qh¾hœ¬€ÒÛ³sÎi`ØÎÔ†HñµÃ×ÁE‚Ç÷YV,23±ûkâºw Ý“O­6‰à> b ŠêA2°¸cÏõpF#ûŒG˜GÃ5Nm¢ö[ðKÛjÎûšYãì5ZÀ®š}F^DÁÜð0`@+p\߉Z˜ºC*§¸aYc™Q-îNœÛ¼c6OÛÑz;̯7* Á5ØmMµ ñZœøƒÆ-ÙãÚã©ï½Íæç[ }å0-+¨Œ–ÙqõŒt(%øRßRA?̉֠¥Øi¯<˜]ÿJk'IÍAFu㜙~ (Ü—¶škû¥Á0 F€!šO jë¤>I-)_•3ëið={-æu³¤¯ŠµÐÅ«ô>J&í©¾ rx1®‡óÀSñ¾ç¿T"¼3 Qš>ÀWn õÄtÒe>è„ÝF'£¨]fƒÃÀRX ù¡ ëÀ蚊â=h Ìê¢hÓmVÇyŒQfE[Q 4'6ÆŠm;›ðq<¾ÔÊé‘§lV_hûäºË=‘ê—á8®ÄÆÏ0³zM™ªæÒ¿D·0mÃ9áÕxßóFã©`øÇ8b]›Åy…Á¢.]’‹é}pZã ªN¡U0 ZCÜ´½P МB‚‘+¨=l‹ÙGc‹9Э}£ïAG Åδ¢ŒûøgT·A:š†2ik¤Gê=0@«,­¡æ²ÏÕhØ´Öª‚Ó¢Çz¬ÜFÕ²Úm¸ÀÎÙ £z—·Çu«y‘ͥê-1ÝXBœ%·P»éùÐa$ÀQú}ž¶DßA]ß«¯Ô[êµ_@5c³Q÷µU Ã캤½¥ùòhÛôI¸€¹5µP,¤Ñ6XGÏ«?VR‚Ûx",¥¦VÉÇÐC£. JÀê V-¤pâ !‡|CBmñ<Ïòò•Æ‹Áã"Ö9s¹g»+xº%©kÞœÔvŽ‘s¨Ó´Ì`4hŠ‚Z7m¶®ÂÜèØ-ÛšŽêÑ 1RqÃ2ÎÛó¾ÜhnÞµVùÊè@7<ÃHj ‡Nƒ]©v‡ƒí,!±ÞQ÷¢ŸÌ§Fu˜Mã@4ýê$ª Z+Pb±Œ¼]É&¢é¸7l ¯ëùW{ñá½IÜÝØSŠHï-îµÈyt[A”–ÈÉôŸ 7Ã^à©&ê/´4°,,}膻΃4p!üʘef4ç˜ßYm9ÙÿHEñSS²uïGëñ(#ŠÝS ZØc–4Oà—À¦hß«ëå£Ê`Ø 6ý‘VWë-;”-Š_×A}ÐB—Ä6Ü«Õ8:¸XÄ=G„k´û”§ ¹‚ÔˆûDkú0"&Ö&@ƒà.0Xo¥›k@i½,gÇĶOIÏàzVgß ;þ½ò/´ZeÝGÑø4Ì‹EcÚ#ÐTÌøÂÌbœÂÕp{þïÃê( zÛ¢­¨µ™Òjm|ƒçÃ}J:y–p\þNk§†J{¹ƒü›¹r,Ö`5¹BkMô…¨!‚“âœfc³0ÃSñ üØhl0jã¶k„Ïš{-§[)¬fjë¢yÌ*dõ5îÙ««¹ú‹²RÉ.…±Ï˜=o5­ ®V7\Èëhïêëšì"Üwª‡å‚x (¬W†wQ(ú 1(š‡¡yÜœo®3€YNÏ’B'h£µRê%Í ßSk’™ÕLÀ«`uÛ·ïC)áXÑõy|nÿÿnÿS³škGIxx¬[Jõ¥$°5jv¡àWe‚ F¬wA÷fgWG°Ãã˜ïÜíJKì~‘ð‹øBèÉM~R’hƒaŒB×´ZE°Ô€imÿ~#c³ÙÆ,bì5vÂÖZ_´ñg±çô óôß3¿Åkðó.‡WâX8æÀMÝûúšòsË0&£–h0®úÀÎRæSWZ'Õ³*ÞÑÔ:ä»È|®Î®\Žýšc¾»œ'•§’7 ÁÖàŠruYÀß–®Éµž°^ Nj ‡mïAOÐÆ9£ƒ1ËXn´™¬Š¾™&e‰VŒ=Ç'¬K¾;x©¾ÆP5Ô…þ 1®a=xí vøc­"&€•Ô­1hÓȱ\>n7{9ÈŽgê¿*Œó•ú:ºÆ9vEÜŽlænBqíläì`gkÈë¡“³ß »¤>òQµ’Þ@¿¦—²³™ªúpm zD£6ö|ß6s›Ñ`´±Øhfžôuñifc¶QÅ®I7iP‚kìÊ<Ÿ,*•ÐÉx…•ý¿ø«Z!Öqs+ˆëîUrjÙå¶r+e¸\@Z+Œç¿c3qÍЭáç#ƒË#;b]˜èè.ìŠ(åèà¦="±Á;í%Ž•ó«”5 6iUµZOióµ ðÒ®ÝfA´W3¶šI¬PK07™MÒ(`|;ò( <¡)7DZƒ3ª´›o²df7Ök_ŠåÄ]re¸šJ› öPBäÂæÈ;¾'ŽlA_‡”r|á˜íøÊµÑ=Á…ÕÂKDÜu~áþÊýÒ“†jÃUz*”ûJYwê?jÙôÚ}-î¾£J°•ùV†Gm‹ÍeÝÂÛq+³ºyÆêàKiû½é°8²`!Åþ{ZÁ±¯k´Ð¨¾F)#ÔH¬W—wÊõ” *ÚjIå§BFa"¿‚_­¼¯1((sPxØñÈ{‘×"f9ªx¸G9ö„+1ÀQÚÙÜ}›ðx§0+¸Ã\sÉa×5­Ðj˜ ¼Ðƒd 3@À+"ŒÄ5­MÖYc¾dçÖŒÝþ}fó(îeLÄ_"Öζâg¾½þGñ3È· 71Ê›$"t·6F§×K©é¤|uþÇHú{6GÁ å!ƒÂ‡F oíî=E-&ʸ{:ÇFFFŒ ¿ù‹+{ÙšÎÁÔ{êNô_5¶ãh#šGY 5\ëha=s¤uÎÌiD£®z*ÔÐÚh[zg+½µÎœŽ’¢2°;H/á;ñC¬Æ`;DÑv…di‡ÔYz µ®Ü@Ê-Yâײã› ú&(yÐÄ ¤!—C»&8†x“q_²)è*ÞÚîÞ‘Âz‡eŒøÉIy›3½ÙTB55¸dtÈžßvÖÜeBEQktN.®š“íʹ–YÕÀkµóÕ±VY}¬Ë¸ÌVk§”•¯ŸÂŸÙ:§Úµð*0v´ó•ì -x¤¥Ðúi“ôvz8÷½q\œ-8(èDPï ¡7BS‡G9’ó¼ÙÉlžLκv-ÖÆ™Ç±Ìù5qƒ f—°cE§šXeUŸ6KêL°üÉή*ãô¡ø…ÑÛüÑÌŠ/À­¨=nj+.h-÷ö_5‹áÜx>®…›¿ö<ü€óóŽÃ(«G Œ"Gew%sÿáNïš¿/X-ç©›+¾¥¿”p_ªÚh“õŒú=Á\o\ÓgšWa)8ʯ/WkÃZt ÍLÃ~è"Íe´ªpjåµ£íâü E¬8SùŒ÷õû­U‡ž3G‚Ê}u5Ú@G‘*šªÖAÕØ_øyæþc¢úR" ‡ÃðáëÂ7FŠlU&Úã>70þOÏ&ÿáø•±=8XJü ô×këtÙ4`†™íÍ£¦Û,a¼Õlp_€µvØÞè{ÒSÖ:«Ÿd=cùmÉ.Ðdô1ýö=ÆâÖ–Þ‘ÜR@ËŒO³:Iß Áyù2ÔQb\ #|§N†Õu¯ÿ1ª³Kˆ)sÉ=ܳ4 Î÷tŒ“žµdÙY;úÏ·-t++ŽÚi9œ|–é^Š Á¯L"Ì·™^ú]ÓÿÑ8ÁˆjÑÝ7cÅ´pwûœ¸\Ÿ5æ/wêØdÞÙÁ,ÒUy5øM¡wÖNktbÜ€/qÔ¼ïÄÒ Å­l”® i¤•z¡¤Z“P—ÿÆÿdßÐÌo åEÙ öì½{òÕ¤…Ÿá8{˾eP„k™Sôlêeµ/^û£V#üS”#òD—v‹1­Ý£zG„EÇÆüÓ6v§Ã*«z^ù –r\Öžë§õ=†×¼¡÷0¢Ž¨6TL—zQ*¬œõÔæúò÷ëV Yx~ÝQ2¥ø@;¿}‹s>è}¿G÷d¼½FRâ!h=þ–šì)©u¶3kY³wîž9ÂŒô„¿Ã™+üVd®¨,ÑK£×E…G­ _6'¼eÔ̘·ñÍ=Ã-*Ãã­"ø±9.CÍñ5–kóåŰÉá™ÃcG£NÆ­ówo‰ü#2,²näQ›#Ї½û=ê|LÁ¸ý±~Ï)oý`ñ´\DMgÌqº`?s»fT0ã`}CVÚƒêfR\…aÆ } KнZïkÍ +úÎÌk5&ãÍUêfP“(öxn;ª~ ßÀZ¢gðì1-¢TøŸÿ¸Ó9ZDˆð—ö÷´)æ~é¹û¹Î¹´èéÕ#.D‰þË•2®m<ðžõå NšªGÅ& e0›YÝìå0ŒÁ0%¹G®À4æz­œ¾4i¼¾Çµ‡«¬ÿsO ¿Š¦ëûáŸ<­µ†¢OôŠ)Æ #;^1>2kTö¨)u’v ›çÎéí襞q8–Ƕ‰ÏëyÛ>®Kl!÷ÄèJÑ«¢—»vÄð´ô/ æ—ª«OÀ&­§QU¤{è0´Áñç:ó „öÂÉæ6ýg=9Üù!ƒ­+šKðw]ðS{ÉÑ•Öb;Š×pTÍ/Æ»ø0pií kYÝ•ÙÝ1:]Äê0)lux»˜6žq…]×#›F)®Sî\±¯b†Ç>Œi“.¶쓘c®¥±5½ÛCû嵄µú5£:LºÐ¼x¼ÉônúC3­ƒ•à&mºz6§#Ù‘÷˜†Ø9qâ¼m_̆þǺ1ˆã®¼Jü Ž47ÇN^·Læn“Þõ:<“Ó_.DWvws=<–<"gt÷èo¢EåV£D·Šé;:f¾ûd\cß.¡è¨ß„SÍFsÓŸ9Œ'7kÏÌQx iƒƒx­™_Ï ‹`?îô~t;q%°¶|˜£þÅ5͉»@’·Ë³NÚÐ3V‚6gY3V‹WuòzQu¯p*u©èæeÂGF4‰zÙ-bpx󰜑s\m]k#ÓFíŒü%ò@Ôm×t×I÷7q|…Ëòq°G;`Þ4¢Œ5úPýª9Û¼¬¿vzwŒØ(v%1´5®Š£hüûñîn•â­2V„5“GÚ£øxž˜C/?¬ã%I÷º‘û|§£3»ñ<žÍÆaa·"ú¸V¸ccrºêDÖ _^,blø³°&áí"GõŠ–¢wEFE׋:Y3:…ëpt§Ø¹Þô¡ÊE}ŒÑÖhnô6’ÇZ>ÑX ¥Ö2Âk¸yBW:½d6?Ë2ÑBh½ÉÞ)ƒ|Ö7üÏeá÷tÇ­ãüø;~öauçcãíÛ’¨½Gý4D5†3;¼goÄÄèCî*1«]Fôã!<èdÎê°W¢FDÕ‹|=$6Uü형.ÅÕÌÕ×5Ì}Ã[Tž¤å‚©a*m1öê9{zKm*8 Z˜¥IQš‚e²ÖØ/­Ý´ÉM›ó3¾vEûŽ•Š}Çw±Å|Ÿž„9ßK$u¢×NÖÓ[™íÑz4Þ5›ËÁã°‘k£—ºT÷WC×ÒèˆÈ×Iù]>ìXøÓðáÜs<µ¼âvÅŒ‰)7:~aÌѸÒJc“S·UxÛ˜¨_SëiU´=jKuµÚѨ‚g@õv¼SǪët¶Á<Ìêe…ìÝኅÙ0öŒæqªvФ•5“VžÞÐQŸ¬Ûîa¬€áDèôĮ×%⻨7Që]Ì]ƕ۵#zdT¶ˆøˆKaóÃÖD®wW‹a1 ܲë¸{H|DàL`cüBw©øÜ¢¢3Vš–Ù]¯®RËjÕŒ·æy³©‘ɉÇ_)u0Žâ-ø+koÆOC»Ð4ü¢‡‡éäGT›´;gy߯2¾õÙZº«F uªtYX%— ½ã5ßDT‰.á\?9úªô¬¨­îUq£â+ùûŠ;‚˼|뼦we°›âSºÞÄ.v¥‹{¨«4Ó+éɵºÚ¯úQõ´ž@‡à0£/îM,î²–²-lŠuÓn?µn³ælOiç°²:¼w¡yŸåvR$~›t¸xó«³Þ‰c„HäìòF¯qúžù<|µ{zÀ']È€jjŧeÕ 8¡•‡Ac|?ØÅóØSÑ÷0T ¼Ö&h@3ª N•|aWÌ;´ÛÇÚðNN-ÞÆ6&!ye²t>ÏÊmu´ûXœžf'ßמ¨÷û«Tø/+1rz\M·êÖ¢+F Œ,±$,!2G\£`5ù´’GÖåêm¾îGãÉ*è×Ç*óC?‡^¤Âr6­‚¾A— Ý€ÆX#Üœd`.>‚WsôKk:Ï÷¡ë5±ïÑ…ïqMå멵qâѲ—ü/æ6‡…¡ˆgÑs\ÕÝÈ}1zm´àêç^·5~Pì Ø•ñ>²Ðu‘HÉÄ튣ÐCØÎ4©•Õ;Úf}¢¦éª1ÜØi\3·˜a0—iš3;”°{t6 gÏØ7ÖË÷e“ýÓ‡ªÝ¾DgP;–ͪÃNý/06l³&î§Ø*î:®ˆèŒÑ£SÅLò÷‘r1¡HðJ¨©œC= ŠËÁ`‡‡‰†ß ðžY^†ÉÐ4c‰±Ò0oþÆ+cªî6~57!‚»£†è<.²vÔ¡¹ð†L²’uËQŒûé^iQ:屚;½§wm\?w'×OQräÞ°"½b‡ e4Cwë‹Õ~Ô6êWôœú+ͯ¯ÓD£z†ÚàL˜ã£ø'oü¨Çé…Œ*æ÷fC]ÑjéM „/ÌyÆ÷p †\£åácx¤”œf`=ÙPgü«Û;ñ·¨ úËñÿ0Os—kv\9§ê}ïÚèªá­D’ÈÆ1»ý9•ªK?`´4Šhû´AúÝ£f«(õ<ð{ŒèEC㈈‹›õTÆhøÈQ35ô'jou<Ê3¢Ë¨iÆæXÑÜ…÷ÁÁÚ]%‡²FÏKà_q–¯îPLëf´ûê:¥ká½£/¹“¹‹¸–¹·Æî‹ï7,Nœ Õ—¢à˜¶S/¦µT©wõ6jgñŽØ¬7FÂÇh iOÁ1èoø‹ù'ĸœ£ãs¹µ à.näÄí^ü†ŠNN¶ƒ|+"UŒeÀÒwêÅÍaÿ!ƒgê»l_õdX؆Á5Ñ=Ò½È= ö†§¢'wü~÷Ði4PÔïÔAjõ©©ôEZQ ¨À­·0nšeQOXæC;`nØ ÏÆ%ñvËëáॹZ¨,ÉFÓóÕÖBû¤=Æ®ÃfàÇú5ý˜au¿ÀQ %þ[Yö]_Ì+L<…·‰ô¹bbªÅxcJ¸‹»’¹æF¯Œyå™j#ÿÜJ%é•ÔJ.¨]´-Ú9­™Ðoh¯mÐÄ ñߨ7º†"éMò€¬%/Én8O-©§4ÊÀõhz€KÒ«ÜgåæCéb|Pߨµ7'½ès ÿÓ±(¾fì|OmïdO7ÏÑXi„• /é:ï ŽÖ ?‡–îÒ†.‰e• j}§¶M›`L×£ÍoáFf¡S¨0Jn“8ºŽ, ÃÉ$x^‹3²£Kx6J«‘Y´?ÞFîQ‹¥‡§õoQi²Š#õþO»ªDøsy¨÷¶÷”GñLý3ª~ˆPâ[ áò>yüF| ¼Š‹’¤€+Z˜ÑV+¯ÌòFvó‚ÙmqjL j‚S8ʸ7éJ.Ñnô,¾b˜$/†ᡸJƒÚ¢òl-_hefgñKbÆholщ_Íœ¯¼ã÷ÄLvUÎ=>²Gä€ÈÇ®_+@Vu’©CÍÖîhSuG9é·ô…Z:UÔ²êõùFr¨ãYä4º_£·¨"¡¬"‘i.Ò70³Óïø`º…”'a˜—äànk­=…÷`çÈ.ÔãQaÖÁªÇ“ÿ¯Öuõå ®ö¥Œ+áŠtïq·‹{ï/%”? ¹…Éâe>¸¥ôQú(¨ÜS2©+µÆ xÂQ¿ÏaI³/J1/Î{“¤ ÎŒ«šgñ`ÚŒ äó™ÌòÑd1éBFðnì-Hç°+¬'¯D.À±‹ÿ‹ þömÐDi§4Å@º`AáO¡qè±/—glüÁ83–¸;š1S/¾ƒ“ï%Cµ•(µ+H¼þDNîÞ‚=!5cqY¶™¡&)&afyÒže±blbç³K°#(úå'è zé}ÿNcfq©oöy¾ÈóÏŸ\_¦4”“‹­¤p…K)„¡“¾ãÑÃû¹î¹“ènØ÷áKcFy„Pn¥°VF[ mÑ«'I¦…²¡Æ:½‘q6#©ÙNž›·bùÛ¸õ{ýò§¥Òçp§ÃµWñܬ)÷½ï‡„½öZ—7sšùPYó¿kv½àS!RœŠ IâYq‘4T~-6õ•‹yãÞS.é*PXX§¸–¡ÜÒ[å¬ÖCæÄæ^=™mf¸Ú|iа/,@d¬pk_nfÅEèÞÜnÃç±I,5}…ŸÓÜã]ÂMÛeÞ³ŒÖ>t>e%}½±XÉñäð`D¨P[CeÄBrkÐ ÈJ*q‰_ˆ¿õáŒð.q)…LJw¦Åj ´‹ÚD­·îÕ[é!ã„qÌl ƒ(@R›'c»Y7sŽÃv'âµd¾G Ù†£êåmø)^‡•´ž°ÖdÞ‡«Ñö!VVÖVë'Òúž¯Vð·o_ˆ²ØZ*-÷•RHºœGqFà­ åð$ÿ!l|ìko~ÿÄÐm©˜ÜR©§œT΃òZs½£6Kõk’Ó9,#Ê\7c?mŽ¡Æz ÈI$éˆû£·d¯ÕĺÊ{òü*;K¯ÝþMtâç—>\xÈ–Â}FM3dzŠ¯Ææ%ùW©¦´_þE(¿’Š) ²)»ÔEå ¾Ü±L©º´LL+-—:)Í”‚J1åwõ¶V\_ªPóiíÔºjí¸¾Â¼‚5úùn¨3½CŸ‘Ú¸3Mi­f¿±'4ŒŸcÇÙ|ûžË;ÑŒ|t¥"³N½XìläøJ5©2¥§”^ É«å\R/é°4@IºƒAª©-ÕÎ(÷C „;â9y€ÜÔñu2%\ÍÉÍ”äjE½ª¾EŸ©_ÕÞèí7ú=c1zƒ‹â?Ñrš"¶‹ŒÂËmÕàéé[z,À)X?ö —í<ÒÑ ÿbL´.Ö z4ëj¾ÈŸ+Úõœ’I>-õUÒȑұ8]\&SF!ê=µ$x.å3Èd® ®K»ÀZP´SÆBŽÖúÕQõõ®¦ ¿3‡˜Gà:xNAcè[¶‚v#{°¶¤ð@T™,Ãyé ¼+)©õØšüÙu©¨„稰1]Û¥ÿlMÒ¥½RU™©WF*å£RFqu¨R(L&N}Ê0P,•©tBÊ¢ÜWVK=ųÒiºü@îN¨­ÕšNoΪwv”L³¦9߸¢Ç™}ÍM¸+ʺ³»ô2mÀZâ2Úáætûƒ´LÂø«µÌjôŵ³Uø¢±ßX6|–áÅ}Âiq“œå©§Ä¥õbQñ€0[ü^nê´érk)ZŠ”×+ÝÕîòaQ¨´Q¸(”¹š ¾U×hÃôÕÆ.ëÎfW£ºkäC7™`µäÕXEËŸ°’úc}89Ç ñÂNW¼n•³æñ·ÖÅ$Œe¬° | ¬fñd+¹Œ¼[~ªä+•ÇÒ É¥‚R~©µ$ÈÅâ6QIÁ”ö*‹T·)•ˆ·Eì|–Êjp ¼R–k×ôò&€ á_èTÕ|d¤A-Ø>Ÿ×ãc,l»¹€ “´:{@{ñìÖCa ·6:êñ7«‚=Ä °¿hâÕ–D›k7”ÑR6qÜGQù3¨£–sê]v5$WÈßɃÅ7ÂÏRéW±£P$T%d KBç„Éò8ÐLU~‘÷ȨsA]i·ôR–”ò~5Vk¨ßÓ#ͧЙÙÒÈŒŽ°¬+É–ÒÊt­Ãn0•É4-ÙEwð=ü¹UÅNÆo²)|¾•Ý*E39Ú#m’7§á©æxm‘ü›´L[üáÚE'µ˜Ãe<úL5-x)ï—‘|ZH't*Š»YøEè"¤Ÿ ³¥'Òfù¶TO*m”~êuŒ<ÏÉ 4ÊzPD+¢½Õ“™-ŒÊúD;9ž"6ËIGâ–ø"iD³YOùC6Œ¾&“ l7¯d/²ZZ·¬”¶háÍh^ú’ur0¾µ‡9U l Lyˆ^ÒÞ£©wÓö€=j9µ£ÒBº,Í& ]…Á¡âÂ(!Vh'¼ …‹Ï…–òrCéGé´\YY«×Ô(ð‹ìq¢ôдÚDs š ¯ëÀ3ðµ$€îbKø0vˆW·—2Ÿu›Qv™¬'!2–þÅ3Û¬¾ï£ð{âgUèÙ¥gTR¨\ÿô:‘¹Å¢7úZ%UPF:§I?9±KÜ-´G ³œ>~;d‚tVúNJ#Š••_µ£z!õ®RXY¢,UvƒuªË¸êp57ÊaÒ.‘*Ìχ²«{ÒÙGñFÎXŸ ip#²þλósVa{ƒñ_†ñ±­f0àD_˜ÒJ˜"j[¤9.gþªu™ÁÏJj%(ù¶¸YJÝă¡¡¿B¶°QŒ“S*÷@¹’—€?µ ¹šEM©žM@%µ€Æõ.ÆpXÔ¼¥Õ1*¡x6–+ö…$Œã©EËÒñè%DL³½ö$«†…’cc{Îõ'ñ~ö2\33IGüWÄYŠOI†+é8 Š2â´1Z‡{õ?)٤߄Ãâ)¹8Ch-K‹Ûåúª¬Uª(ý” h æ¨.í/­¨ÚdSKkmµ³ZU£³ÖìÑòã´¼¾ÕÓêÇïX-ìiä€Bh4:êÔÆ.öÏöq>”ÇØe?ç±fÙ‰+A&Xó-ŸÕ8 ñxÞÛzÁ³Ó|úJ2-^sƒÆxàÆ(—¹Óá[çôUú]kýÁXyšÖˆíÄN×Àt)¥ì£•Ê3¥(AYµzÁ©ªCÁ ÐL­­ŸrÔÄxµ5øÎ˜‰k:ã™ÓÊÆ6ÓÑt=JƒO ¤1ÕÙ»‡mÚ·ù:Ф!"›Ì:óÑü~‚yøcÖ,‰ß{ŸÈÚóá™ú3¥¢ÃN6¡ºèWè†)Í'z­½ÖL?©­ShåÕNRi©¿üTÓž©3µìN,Lu˜ÑFPX=ªæKÁðB¯ÖùÁ0ý´4+ê‡ùI~þÀÚÀEâÅ£`:Xï¡7y6kcO´[Ýí¡Lv¼‰½¬& §«è\6™>'…éàOò'ÌN`¿š#@sœ­‚ßÁJëeú ]“´§ê7NŸ^ +¤eRci,Èìhê{úc5¼QÖ€jê·j7µ2 ´yA~uزh­ô 棑ރì¤ûÙ=Z‹<5+7µÊÆØ–å²þ‰½ÜÎÏóöÚÄ©ù­Ù&ЊÔï(¶¶èŠc9>AYÖz€É¼u‚Q°¸yÓô›‘F„þ ÜWºÊ3$&=ŸˆD âô4Z-ŸS黂&*Q¿SÆ9={.X)W—sƒij ë´õúkím“EíÓµ[jWu¼\L~£dPÚ(ý­ŒPG8Õh®¾@Û©Þÿ¾ÿk1z«_7uò¶ ?Ë3sÂÿpä³ç°ÔO/“–TeÝÉÒ‡žd‘<ÜšåXⱬjûÖwåWhr'rbçñ ´È”Œc©ñ@/ª…9lmšÒBî'—ËÕ±ªWm¬ÔUêÈäFÊ,y¶ìWÎ(ÈTž¤ŒÑòVQ‘©°’ñ£xìc•&yñE|†‚¤sεþ䀕³®ñݬ¶Ã/ÎS™•¡SÉ+6€×äØIÇçŠ5Ìžeÿs­À©ï¤/Ül_qtoq>‡5'÷PVøÚŒ7“oœúxÀ BJ:奼N.*WnË¿Ë/å{J*Óäòu)B6ä©r9»Ø)T4X^¸ Ý”þÅH˜n ä}™lµKÂXÓÎGÑß-f7âÕñ´Ÿô£ÙH°·Øå¬J|Oœk/·–¿ï¶Ön´FÒùÖVžŒG:*}:¢s°|nÒ7é´Ö`?è¯d—FŠÃ¤r ¹€TRÞ¶‚-².µŠQòi¹ƒ´H¼z  …ކª†>Æø¯m·WÛO¬ë¼4¿j²Æ³xêF’³E´lž=‹V+û4Kk5´.[‰ý<µµ€ qd+“¬†<œï£+I§«^0GÀg° ìa454}¸l\¶„xqªXYÌ$þ%p£O “ý’,¥“Þˆ‡BåB]C¶x6470ÿçèþµ°„ý|&¿Á˱ô‰»Ì±Ôl&‹å{’||ßNiG$tá¨À£­É,3Y»øqG™`€œ¤±[47}C6íh§ùd¨#,¯?Õ*ª;•íJj ÊÉ·üsƒ¹„Biñ±üVݯ®”¯8¾EhLàš/&P<4L/è!î#žÏ‘}l ðr´y‰GÒKâ·YO²x®Ùág­t|ÛÄ/ZÑÖ+³%ãÒäÖÉ7$­Óý5Üè¤ñÑ@ )ûõðPøÍ;Ñã ¾{9牴@Î ß× Çü™ý]|‘þËþ‰Á¶Âø`{ϰ¸Ïq}j[ù§ÒÅgI;zÀñY“¯°³@Â@›}x¾ˆ=ŒŽÆ[PMœ'Ãi!†Ñw‰¨q;‡ ^Ñ–SÊ©•°ÏÛÕ;0ÐEP„HaW¨»ÐXœ$6J„b¼½¹¼Kâ—ÇÞ‰·â·¸÷¸2þ¯ÚÏ™ÉöÓÕ´î@î±îÖ_Eù±ýˆ1ñ™ÉàXþ ãàÂËÑ\XÙXåTD0Á9Qí÷óvöÏ­ µ 6 Ý q±‘à lò´‰??.îtôíè3‘rXXØÞ¨ÏÏð5›fÏá“Ø*ÆvÑ~tÙWæÒ|l½¿Ñ63zk¸†,ÆãQE(˜ õJš úˆY¥M’$Dû§Å)1»b³øŸ† ¥Âr^¹ª˜+Ô6Ð<Û_ÓW8~\ÔÕÈŸ\£ÏF^ˆÞòI„ý'›`×䋦­puüûwöÔ׬¨rØaà¶4 œ7òóp]¸UÏ®6Q78<ç”<]Î ~zá=âÑ&¬VL>±¹~B¯©¿¯¥bsa‰Üê Ý+ܧbãâÅ#ïfû’õܪj¥çOXúÿznʦéÈ)<›¾äý—W^-­ôáò¡‡œÏ¬m½X,lJ(%µÜ ƒ<>XسÙõøýµR·7·v\ÿAϬ>–ÎIc„Êb?o.פ5Ó•*öQÜ_ñ’7PÁ.àœÑï(—w»þg[n¹¬Åìñ³,ÿÅûÇ´-Új}+ ÁZ~¯µÙJiQòWðÕ¦”މ÷ßÄg/ñ(á‰/Ì#—{CÅW½c>¬æ½6Û5Ñ}ÙõùþgKoå#>ú4?Û߬†Ë›Gµ‚âJï^騴Êïó\õ ßs¿;Ð,þž[ OùEƒð®ÝÑÛb{@¹Àlÿaïš÷WÌÿ=ĈlvçÿÁ{ÿW+,¿Ö¿1šj/ä•Áíþ¡ìb˜g@Tu÷n÷ßÑá®AÑZäãˆæÑ zUļð 1ù¼nÏ®¸œžnÞ¿Ç+®ÂG>þçÂÏñ]ÿ_Q> ¿ë9.=•tò4ùªò¤ žød5vXXDä©è„Ø´ñÅ}­ƒ)ÄR¡=¡ÁŸ…ße\Ÿ¾îÝQ‚ bù­ V~ûü‰±ÿ‹%¾k+_^y²\GmjlƒÏ×ê{>?ïÏáññY„·âi˜]<'œÏx—|öYÞ5¹O±ZÚ£•Zøÿ‹?“Þ6.ƒô@²ÕÞÆcxŠºÈ0ÑÓì³ó¿Ž*7Ñß*TÃósÌxWËØGžc®aïï<||Ì·rYϬdv{“•Úzé lÿ¤.ç?wÂK>…-a‡ÿ'¾k–豞r_9®6Ð2¢†Ø‚·€ªò•‘Üyò£ßn‡;1Y÷³˜e=µÚUíïìòÖK^Ëa«¿ÀÌ®ËëØ·øl2ICæ°ƒÿ¡Ó$*ÈwǸrJ}µšJIyµ4äÕé ÆOÚó@ úÓ³'úYR'2OìÛ¸]>Qz+=Àžf±nsŸµ˜g¶')Ñs{ìãó"ÖL6‡ØTÚ—Ã/#Û‰ç+¾þǚśî_}¯åÚor{1A¼&íôsú!£¢\,æc,È"Iq0%".êFø¬È“îžöþªïc¸`äQ+-Ú÷ùë_Àgñíï½xÑŠ°»[5ØP¶Ôai72§Æ.tRTçg‡ÿÊÌvM1·TOª"Ýž\â#é¬Ô ´4ºÏõùRì›GvìšôÈëj lñÏõn‹ßê½èá[‘„¼oÄ=Þ’of*KÍ3ðRÖÕgîf÷´©Ó¥ ³ÓŽ3Ó[$5žˆV£Éè<º³‘cÌë¼6×Wv 5W”¾ÈèáVÜ7¾ÙžTžHa±ÔDJ(øÙXO ÓcKÆ NÂ2Ü­ûŠ‚02ðÀ·Å×Ñ÷wü÷˜¤ ÚMÒÔfØ7ü_øµ°;ñB¬;½K PÜÇuÈ^<„¤¥«H!¦ð ¶ßþüžH ¡®°:ä÷¼÷ص÷Ñ67ÆðöwŠ]ë<™ë=ÖõQƒ=í= ]›œÇ£]wü„"Ò&q¼ðÔŸ3ElŠhsÖÁÿ ¿À“¿éGç ùâ|éìSV˜•–¡[èÒŠ\ 0$ÇévV–ͤݓö´øÜj(ÍýYüa‰ÓÂãŸ]*6»y†‡øZ»î„_qwŒ«-D¶‰h³À»Ã㋯»Þ•;Æç/ãðñÆrÎÐ/ñ…“¾ ¿3Ó›¹LAߥŽ×*Ì °7ùôšx¢ý$,“kƒ–Ò ±…”Ò‰«íRy%(Ú€RruÙ–‹H½¥â8qh©d”¼ÂR9¤–ºŠÍ”ºÊÏÒ@ñ¡ÒVš®‡g‘€³ÂÙæzè!Oœ}ýŸl‰=ĺÊ[Ðø{T P¦7¨>Áà™ÿÓ;ÿµ-¡qÒà—IçÄÝR¥½¥ŸøX ‡¤üJ!9•2 ¤Ô®ÈÃÀ\ŒT†J½‚yE*üø-ø4öqx¡¨žNÁU¾¡Þa>Ÿ”[î ‹•Z¬¯”„äG¶ƒ$'žƒƒ‘$Ûhgþõn—hm¬¹Lccñ[Xù0ã=Ñžª—Ô±Úr=·ÞÆøF *o¤krYy‚ÜYÞ¬øÀðXn*ƒ +X)W׈¥¥êB&á;_…è*QããǦ¢B¿‹ç… R°HÑ$¢4`i“¼pÐÊCáLä8ªŒ£‡¨5iB +þ0ΰ¯89iÍ${Ña¼öŒ´aêC ©ßk5ôê>Pô~%’EÁv¹'8¯ävòæ'ÌSIûÄrIS˃3=¼¶°[Œ=ÔîêKm¨ñB} ¶æ‰«ÞnÙ³xOÒ¯'×uº!²‚Ô /I~å‹>ò±í`ØŸ¬”÷Ñs¥:ú}-F»¢¾V+€7J6µœ:AJ*å=âù´²ÙéAÕe—Ü^,Ö–Ú+ •¹bP¸ähiºt\ž*UÍ´ýÚ M0ÒèX_amIòUuëwú—¡ˆÖÄóà·¸7ÎJc/=ñIí $<üȳµmÛ‚±+âmj¾6î¿Ðئ]RK²(ÕÁT%­<@Ì%û”pe¸ô›˜]:&&“‚2U²Ký•ù Ø*¯Ë”ar-e9h¥Ô¦j経FÇ÷ïßÑšLváHš€£Í\È3¢Îh=ýÆÍ¶úñMöç*v´yÔ,g>0Úš;õÊú_j-pD©¥ÜWÎ)uåƒ"‘ÊoåÂ@T®KeA"5”9¨îKO¤Ñ Èäu  &ëµ^ZE-ÚhôMY‰–Õ.Ozãòô(ºdæ5mTÿˆS¢2(5Ía³¯|jݬœÖ|Öã+‘Ю‚ÏŒõæD#¤ïÕ iÕ™à;0d/].$©Ò©€6Š[þ]±å±Êu°TW®J}¤UbVé®Pýú~=¹ÄØe,„ѸÚ{/,³CNV/e2¹ /›;Ð:Ü…P{¼Áу©‹]á]“^;Ü.c¥âun³‘ÿù•œzOÀNÆxó€ÖU]¥÷Ö§jW•T ¡ÚœR/)å^Ò1鸲D>'«R„|Bž©–ÆTS-.—’þVv€«êvµ´VÁ¨mŒ37¡ƒØþà‰é¸¾LïáýhÚˆ·âFŽÚ×HG²‚i)ü3™ÃHÒkgXyø 6„ÝúŠ-î2÷™‹ÌkjpS«­·Ö¼êï €:S) ~Rž*m•J{¥½„ä«bzi°²VÙ ¼³”iêh<ÔlcÁô)Ú­ƒÞþˆ«ã5<јL‚ñ4œ wÄ™‡;ãäO+Ó¨&z†/ѬïÈ7°Ó¬ªò+|g­Ìf=‹ÎkýգꭶEË¡>U†È+ä±2p²üØ­œ“s)G¥&r %§2Ué*€»jCm¡“µCz'}™qÔ˜dœ33dþûÞè=ó)*AúÜ8…ë¡8;]J—Ñ­h*@&‘"t=‰"½h¹ÿàÁwv ¾5*6èëô£Úfç¼w´¢šä¨©]Ê4¥£úL]R‚²êðHé f‚žJ%¨©ft^·W›«®V¯i»õ…¢Fhœy]·>Âøo·Àó8­HûâÛø(,†S°ªì$ÛL4rŸ<Ækñ2Ü‘&®zýo¶å†Áå°™ÑÃLevÑi·RZí¼êOjrõ;õ‘òtÒŽª×Á<'r‚ÅJYçg+u¢6ÝéQùŽ«ëÍÌ8ø³ã«ÑæÍýÈn˜e͆°Á–`Uç5i^žÜ>É"xWº0úŸÆ3Iâ]ëÿniî†Wa¸éƒµM±S«¥eÒkkÔÂÚau"hR)YªÕ6©Üo•}Ê~0H=­nц‚× ¢>A? /1#;<ïšsÌRV³¤ÈcÕ‡¹´Ù& ‚ó{aûªU—?å^ëÍò°\,={MãßIÏâ°“•÷+Q™-0„€oNzgcµ>Z¡ÇéoÔµËÜÎ ÿ¬¬RG©ƒÁ5Ö(…€ ÎÓÞèk´ÖÚH½—^Ðäætã’éFm` x•ªŒsÂÒ¡ûÚE³>kÂÝö »‰Õ…ç§ûèh:‰ŽgYùZt ÃðŽ÷ßS´ÉÉžCü2Oñ¯Þ†^çÓWÁÐ#›>Õn”S‡9ž\¢Nrêyc04T¨2Ô•`’£ÛƒA@‹A¸ãd´©OÓhÓÌ æ ³táSð{³5z[:µ“.$q‡RŽ(Íм¤.…‹áïÙïÖZ0à DJê:«PF\‰5扜7ñÙ§Ö]€1¨¿Ã~càh#›QŘáT 7úvuƒ:VM­®Uó«;Ô3úm§Z4RºªÕ4Ã险Œf¬yX?èp¦áf)³°ÙÛ”ñ ÜŽ‚™àMâ³fÛs­ý¼Çdâh<ª‡ö#?ÝCΰæü<¯¥1 d ù{Ù ÿ`õþÛÔ®ÿ• ŸJ–¢d¨,¾E­ÍêÆc}’>ĸ¢rêr ý‘úHSK©çõLF} ðƒYjM}£ÞC«c¾0÷iÌ£úã±9Úœi¶1Ï™à8” ®4 ó(;ÒþÞ’ØELà:c“Þ ½$UiK^’¬Â [F[õ€®ÒDî°ÌÚÂÞÝÉI°Jñ?¿ÒÍS±Æ¨§£izÁu0ÞLe\Õ6h‡´YÚ÷ÚKíO£‡ÑKó€;  þÀègìT¨¹µ¬F‚yB9½/Ò˜jŒÕkkÌ4°=œsÀ³<ªW@ù¬Ÿ-/›@Wãh=š}¸2¯Ìç‘"ä$(zLzšõ¾èS, ­ìÑ{Œ^û+ÅûQlJá¨÷׿M˜`0¨ƒn¢vLSµ±ÚK#½ÙGu„ZLÿËè`ÎØwÖúû¿Ô6ÃWÚU‡ÓµÑ7˜ÏaKX=F‰{‰Ö!uÙ)¬d .ˆ†cÂ*±¶VG»*ή·Ö×+ñ5Ç*¾ M0 ~ÄeÛó¬é$> ã z—,'ñ¨¤¿_¢Cð8œ€ç;ѲÎ5éõõéú­VEËäp¶‚š Rk@Ïm¬2¸–\mª55Òš¥ 7k$›ÁŸ°¼Ñ` sšuþúD-VK§žÑJš©F$hÅôÁú ó©ÑɈ0_âa$ uu¸ˆß| ÕÐΨiô¬æp´ j¨8J…JA—¯××réÅÔ£`8¦N«©=p˜úMyœÜÚ©a56ZûžAóØÔ—šax(‹´&sÛ²ì:<̺ÁgðWï³%ì}¦¼´ÛY9¬"V.ë ¹LvÑ^¤&øœhæ7»™ftÖž:ÊúO}†¹ÃÌ ;°‘_ס?•—Õ\ËÖæPc¶“å- ;BÇÁoœh£)zý–’Yî!5_Éõ´m`¸’AýM¦1TDóôPŒÃ(Šò=|¥ÕÉ.Á®òwë+Í´¨ìAö\»¦öp"3™kc?Êc>6™gœ¾=Ë8ì°´¶º{ÀoÑaóž1É©ìcá%”×wüݵƒ™Íµæm8A4wA¯Ì:0 ºˆêOµ«jgqd0G°‰?E ™ôƒ<_þM}aî`·qwô€d°’Û‡iÏi•u°íåü£Î"Û©¾¨â/é1:‡ºi;\ctÕ\×›;ÍtŽ7§×õïôRfk8Ö4+eôûÆ>8]FÓÑwHÇãò3,†8ÏœÂCPl 7 «øˆP·‚º¡pß´øÍñCãöúçË”GÊ7zSœÕ"–¸·KYÖ€múJo.c·ý¢~G ÑXöœüBT\5gÂ#¦OÁá C1šEÍÓÎh§7OÔ8a^‚£á¯¸>Šo` ÷G‹á4h¡úx>~Œ£:øº„2Ÿ´Zæ`´·CÜOñMãû;I…ä"ÊAm€ñ˜@úÙÏíí¼ ÿÊ\”'S>.0—L¦{Y ‡ï…wœ~“Álmô1S¡Kpœ™Í\ÓÃzæ:Ó„U`S8Ïaøíá]‡+‘¾’帼j¬4ÅÉ6œš<"íPfØÙø¥3¼ñÛbÓÅõ‰/6•Ri ôfZ+C&†Ýц¼4[Ì<_`t´ËÏ8=’Šì’“Scœ.¥8‘¦À?ŒÌæŸp< WÀ5¨0f5p,Ùò#íO^:]q‰yAý 4OÀµ…ºG@jà1.šßg'4ÅìÙI]&Ñæ8œ}½¥9¿­³óVÖVëî'(mr˜§¿ó6¼9+ÁÒ0À˲«4;]DÜ4’fujJ§SöGÏ d®‡KPd£Ôø¾†“91ñ'FãXjkÿ‘W°ü¶Ÿ‹Üƒ–ÏÔÓÒù€ÏÿÖ{)6·§pˆ¹œ´Ô¯̼kN"‰ó}~µÿ½Ã0¾d{v:¸nÛ‡¬\v{Ù'»´¦×É ºŸ5åØNg¬±ÕŽ2ÊNRS?­D ³³Ô$¹ÐOfŒ9ÎA^g”Oá)ÎH·uêøº†bÃBlmI7ñN¾¼‚` Ý Ôp?{_À•Ñó"i ø׉2šñ2;qö·ÇÚb?°ÿ²CvA+Ü®l¯²óîítþ’øÓ°‹[—øxZ’5w|ÅYO>„·§Íéº^&^"Òf4–¶¡~‡®t8Î>s‡S;vÁŒØ º“1˜¬Æ9È9Ç®:h£ømv„ÿÂòÑh‹S§vJ¹|#ÅÃJæPNÙO&9~¹£/ÒM\^Jâÿ[ì´Öw¶+áo« _À†pÙªl÷ú,ߟۭÜe? i*:\|:;ÏwQ“v¢ l2B†q$^„÷Ñó$'ÙzË8©ç× éõ4ø­UúHi³¶î+w•"²[Î ò™}c¡XH)¿’ ÉÝä à¨r”SÏŒS+/äaf]—%¥|E™¡,”£”ЦÅÏ¢ÎÓ¼¦ÏÜÙ(©¯ ˆž({ḧ`ŸÙ‡{U?È(='´kcz†ñcß…žé£ŒªF#=ºRߤ¯ùÀ³üA9¨øLop¬|K-{dFÌ+>¶‹]Å:âf1‹9¾,R, )š¶º£Ì™–§¥\AùE«lVn˰²L©ª^SËkI³†Õõ§ÎîúD²Ø'¾Ê =»ƒå½¿zIèSÚ1u„^냒ªh´7¶‡ ‡öˆù®“éÕ_| ±¾ò»R]AÁ&yšÄKuäþR*©¦ñ„ÂB‘•VÈsä2n¶†ÊÊ ³æT4Jù !µt\*,+AG3(aZG¯9þ•AMy‰ó­;Mk¥Ž0GÀ-Æ]Sk}:·Ì§¹';Ç87Sí[<ó$UèÊ®ðÿ&3µ­±ëܽKUâ^¿¿âJ íݳ-×åÜ ¨ “¾—ù{T@Œî Õ„Â*a¨¸YÊ%·7ÀZR塼Nþ´QÚ+ûdD)£6Uók7̸MÕVj4BÿÚ()¤ã½ÁbÞÌFò,XqÏUO=û¦¹àP_¨´QúâÐ3ÓbÇäþ®ôŽÅ¾›Љu>N#¥¦'£Ë3îÜ*M‘ï‰ëÄÂf‹, Ý;‰¯„ÜbAù˜-A¥£™>•S˜}躲Qq‚ãÊz°Úd-¯¶^3ô2ºÍÈR¤ñR[qf ½7®ß0g/è·J¿ƒ’@Q«ê}Bï¿“ò,4̬ݘWÝCã>²1©¯´M"LOËŒL›lûäòÒ,Á"ž’ÖJ‡DXÜ'V‘ûš-àŠüµÒVž$µ‘55 }å¢ò ¹»RW)¨~«]Õ˜Ù9#A…’Êù%Ô#Êÿüëè¼­ ó ¸Nn-Ê}³G< ½¿Gò.e u2b¼¢naŸð ½òLF@ s<ì.ƒæ ³\P¸ÊSb!q°ØIH.)rcÓO<"¥TåœÜNnúš=å™4T¬)y•VÊ@hc´'±=qc(K¨€ø@Ì$­öt{ªÒ@VØŽ/ ýsÅRr6P8öÜO=£ãCâQ'ÂJ³—¾XmöÐŒjp@Ijú3EJ-l1ã¸RW¡„陾÷JÍv@™ññB©¤2ä•ä—b#9-˜ލ‚éUCf !Ò˜$žòõØŠŽÃ¸û̧ÝyÆ™(CVònÜê.í’>Àø&ôéo±Ç¤ð§‚îë{À3süÈ2™=b(Ȩ¾9”Ýbi~œ°^j ¤ΚQñN©¢’LI¯¤—rH;åZ`08!?•¬à¾z×ì²ÞÚü!s”SL¯¢œÔ“ïÀMòùéuqu]œ*CÝ%3[Ë»Ò[+ûԢƽœ~¤íR)cð©õµæjWÐ ðê³——•û‰Û…ãfåJóÇ„CBRù<()¯—Úˆ#¥œòu¹ºÙ¯óƒ%êL­šé1ÕÔ_©M@k¥ (¬NQ—J)¤Ñâ|n¶;mü7.v ãl>ä–£±/$í‘û©´6RÛ³ÿsr†²Åž•Á¨¥§0ÆêÓ4\;lzãÀ>©‚9"þ&eFˆ5øöbRéŒ|M±KÕÄh¡‹ÔJΣL–=êC­…6ÜüÏpÓk‘Õ ¶ºT«¦Ï×vËÜ]lÁ¿a«ÛÎ[ÚÄ=áëÇkÀùÈ'žîüUá•ØQ>¤~y…'9´ÌŒÞ½»j`–?lƆ@gu‚92®“›+u¤ÚbQ¡‘tÛg×<©‡´ÒŒe^ËKåêù˜ÝX@ðLõjÀ8-fözchž¾KZ&žçÍÆo¡üxÃø²«Øn‡—Í8œ¦,þ¯ߥw~eíÐ|ÓŸì¥I Úƒ–êPAj"œÉçÍ1;£RTN*-—˜H^e2AÛgŒ¢/ÕÛêró:=BQF7Ý&¹¥_…ÂåàBvuíƒgÌ!-è±þË^«o²XU?ø'U6×Åù\¯¤ÿ¨ee¿R ŒÔΫ.9‡Hšö¬¦\Vé¢pJ]éw©&Ø êªóÕ;Úc›þT›¡&USè3ô f¯î¬V]z}ùŒ\I~"M“§3[í 5Z,›Ø(oïWÜr劓>q¯#<õÓ‹óC1qíY­Ÿöæ1½Ü2Ê`ðÔŒcÊÉu¥rPMÞ)ï’3+¹äñ2¦x¾^šå=ÍÒ…âi±?瓨õw«€~:Ó‡Åúè®P­•ÁßP hÏÀM êãÕÂò(éµB©7å‘ÒJ©¶¬ÉÀsVÒô}·4z:M4½‹Éj-—Q)4\_§úÕÂà¬üù?tQ’ˆzp‹ÇK °û¨lk©a/àÁÝ;|Å6òin}àkᦲù3‘ïÓRã¼Ñ?Ô44X[0µ9ª¿©¿š–œÒ~Qº™íï…é“gU K¤d-RnÈ^ÐWK®62ÛlsÍ£¯݀׌ZjëõŸt3‚UÏH×åês5¹Îy{»ßx^º²×Œ×Y)n¿ììæ½$>” ßÚ¿—ºkF¨qèíj´ŸJXÔŽÐ}cšZìUn*QêaõŽŠ™*0Ù/¡¦VRɦ|#Õ «†ÔßÀPN¡”úÊfk¬ZÞ~Ûçc“ÚJ«2:EÔÍJ/¥©éiÜRû©ÛÁó?î-µ‹ÙAO<%Ðb3®¸¨ ¦þ2À:KYÔ—ZZ}‡~_}-5µ)zí®i¦µx1Øš-â$þ{µ­C“þáÜ ¡›˜"8Ý×™[¡4ød]Û]iÖìÆú÷Æ<£™¶ZM§þ¤bzem¯”7ÉVù¨tQ¬+qRN±¶L‚ÌjAPLùìW³+%AYÓ*ŒÐ¶ƒâ,m–±!ÔÌcWI›¤b.½ØGßb³X`l*Õßל?-¶¦s¸}2¦ñísˆ#´€.¡KzV£­Ñ'tÎèfZ¡_Õ|êv­‘VdW‚J=Ð <’ëÊ!`…dB‘•“`µÒSþÍô~È<˜ªõP3Í^À¨?137½4JM£¬ŸòÉøú®p… ¾v„Øs||@xÈàëHÉ>Ù»g&¸ï¹-tK×õmæõÏù´Ûf5Mí£aÚVð³rBI­öí¥çânÓÂ/•÷ˇ¤ÃJ>ÓxlÚëëâ5ù @9ôL¼-¦ÓuuÕ‹h}”7#N >¡ÃZ,×Ñ|ô(w¶‰¿Wð"—KhÆO‘F3ïRÂo¬YCµ¶YoJiLR7k½ˆnÕ+h×Õ‰à¶Ù&‹«¹œSê#!âV~‰ ÉSÁ°\«ÍVpV¾©dVÜR3á¤8]ýQ·×ôêú%u½B½ÏÝ4®q´ÏUÜs›Ýåë'ø’Ò*¾@‰¿ûé4Ïh¨«Ú­ž>JŸ¥6Ѧhßë­ô½Zm¡š´’Oò¤8ÆôýÁ#v•M[ZU‹VnJÙ¼[‹E¹bwùY÷¶74ÅŒ È‚;ý°oêGß²ËFnönè ·Z ªû@ ÁÂWÿH峨r|ûüiƒhìUš~ZCÓ“išú‹–TonÆ£'ÕêŠCÞÊóQì¬Àuá[žà4*)OTXoVJ ¥`žú¤‘Öטú é1hnÔ3\ú½¤¾]NÎ7 .w†kâ\yˆvĸiLí7šýÕVÒ i„és%¼’N²™‘ñ:¥'§6ã‹éTëªÕÌ^ý5°i­ÕërÌÎð­Ajá4»ÌåžÇR`¥Ÿbh]ôZZ0GÌ&´£Ì’®,¢ÒU¹7Ȧý¬U¨yÌ’dÀ!qœh²¶K¥Üew/ûYGÛàÿZwa?XàoÁm:‰)ŸVVwê´«êyßQx.^‹ÉdUš!ŸQ~P¶ËIÄ~âcy’96ûL_±±éÏúA}õ{µžò­rLé'• ôõÌr7 l–zË)À=½¬‘G¿­&•Nòù¥jª</‹å•&jõzP}¢ÖUã”6Œ—J)KÔ‘ 2Sî*föpô§Ž -ùMžúì ßß0 ?0-ÅmÓ“r+3¥dbn>:x‚7„½œ(Ž–&I£…éÂ>¹»4–[¿” å–x›„æôµ1R_i<Ѻ©ŒŠËÛ¤áòÉt¹3ÚwoäæûÜžrÌìØU=oÚ ïð`û`…@AßSÿ×|)þ)W3ø«ï” lDóéß V9·ô@¥^SªŠƒ… ߊï˧äßP\!_=âéW±pœÏ'U2} ÊÓ×NgznCÚ(¥›œM]­ãF ]Ô~2K^P¯©ºéÏ7×vkIcZ´ª˜¾Å Ùgz“#¸†à\A½—Ý\£ïÖÊô¹KøøH/å-àùI\’À oFök–a9vžðÐß ¸Ÿ;Íߕګ«åãü.)Ïñë¹ü]a ”B±HÛÍvZ*+Ï“G)^3 àÀBͬýªuÐÓj×À|å zÅŒ×èùLë_.v¨ ÕÔêÐϬõ¶Z푺Rpa _YØÈHf#8ß8 Æ+ŒŽ®ÉžÔìdO¶Žï‘¿•Ë™cgOf"Ž^!*ÖÿÌ—Ò?B(©v“«ó͹TÜ\n8WUè/7SA=±™/Ÿ?§hSf)ƒ”‘J €¡`–úB]¦žEÀSp2ÇåYÆt½«9‘_+š ´–Ÿ˜¶r¥ÚOk¡•u%Dh؜ȿr°~gÍc?ê¬g¯1:ºƒ³4›ÙôÜvKL6ª•ó´³¾³™s­ã¸8Óû»g £øçËåï…á‚—?ÏZšAOõ È+Ì`wx¯ »åZJ:¥³\Y19³ß÷2­W5e|@9 |ú ½‚ñÀôÚOiäôòe鬸€O+—5PK+ødÁŒ\¾| œä™„-ÁN8ÎÑ FGϢǰ#ØÃî¶q«ãî! Úg‘òQ^|êí®Bû©áî$ÁÒ48RH&d*H9Ì»(òðE¼m}gÅÊ5¥“ÒCz"®’+Ë«¤WÒ5¹¿rIn/Õ‘.|ÚYÕ *€kêma@pÏ¿r‹ÄFRsy¸ÂH)99¸/0ÊßÝïVÇSåmç©f­r]»Ի2ìh2:ú{þ<[ÑÕË‘Üu-èíÙÌÖ ~Å}k^¿¢D\AÙ.,ò÷ñsòRPü æ¥Àª`+a‹˜Y"Kf[ÜoúDªB«û”¦¿¦zŠhxÀç’æã…‘R5iŸTÍ\ö÷ ƒã¾möï(Áý¡šèèl¾ü~æ£Õ𣣠ñuÜV²9YÙ½6`p9½Ùý¹º\“à^Öð%…o¤'B¶@é'×Í”eR-n‹7¥·@àwž¿W^ºK¹, Êz@©QZ[}žžE¤™;<.L’ù Âeñ´¸[¼ÈM L Ô~ÅׂÌ帶*s ë>¹6÷.ñ^#29ö~Å=õbíÊâVÁd‚³‚Ý‚¹›|qnwµ7‹°_n,·–ú ·4°5ø‚o*¥T¼ •ZBu€¼æhTIͺJj*ÌÚñY¹Ã|W¡Ÿ[‰9Å©ÂaEp†Ï°ª›ä»ô2¢/Y ×M„í9ô–²Â/L®ùÌô@.n{Öexs‹OÅWþãì O7ï´ÀƒÀXAaëë D^ž)ÿ,½óI—¥Rmy´«LÓ©¤”Ž(KZ¡äÆ\n#·œïbúc¹¾ü)a‹pAè(–º:x!_n¾½ÿ”ókò¤-\ɳš[åìžX(ï9ïXO ¼àm>Ù•Å1š¾ã}/=WÏ›ˆo±Õ·65µ ³ò g°ÖdZoîìîþ͕ù…ºNe§søwðkøÔïØnþ–|aéºüÜÓ†'ù Âq‚TN<Ê÷ãÿ VóÞa_{ûøžx¬ìÏW p…¨mŽ ¶ªXk¸žOQ‚HÉø¼‡œà2ÖjäY|¢%/6óÙ;ŸZ…Ca:󑸻³gµó¸u'Z‡lI'õ% Xü4k÷ÕŠât¹ˆÚYµÑ|{‘‘Kc„'!¦g½“-Ê lcŸÇÛØý€é>ãæ™ ®žÎ­¶bDj<\ϧ¨uØ=éóØËd¬=q¶Âm©m¾:¬Ý•ÙqÈš@'jÍJmv[UÍ×õ>ù+½Ô3šU=í<½ù‚k…:J%fö —xLúYx¬çÃ=QžyžÔž]žêÞdlQOÏvv÷µ§{5*f§Ø?eÉ-–òDojKt¬F:@6¶XÚ[»1œ;›ÓN¢®Qµ¬!– s:9ÎÅÎÙ$Ŧ9oºö0]™êéž-þÖÜ·ÁG\wî2œç«Äff¢˜§ô|º¤;àY顨Rlg¯Õ·•]ë~NͲ簷ûÀÿ#¢,EñµÎþ.àdñ¹–NðÁX-v8«Ù§cým]¨N f`½H"9Ÿð›=]…³“OìÍí.b>vŽXGE±µØÑLqoá à´ Ç?–­å¹DgsUrÕså¡Qæ°ñ,óÔbs±’§“…Zç(è,I…ëù]ƶªèjàÜl«¬ƒjÅj¹‡O':âÙl«°:ø…åXíwµ¦D&ZYr¢ÙÉü®…S`%í ³‡ùÊÙÊö㦙ÿŠo{Ù-3y\•¨®ËÔÊAÏ`62ÉÜç™ÆÌWt[×MçsçyW¸šOƒCì…©‡ÎºÎEdm+w¥ 1‡ØÕÆ<ø>xb‚;+}¬Y°±-tðëDV³<÷@£‰¥ÔAw:Ÿù߬´de'z {V0éÃÔ³œÐõ]Ã)ÁuȵÎUÊåw5vu¦²RC)ÏŸThúçäIûmÇZçFÇ$²566NÏ\wE¦X*¡é yï%ZúZØOæïPRŒ&ºÄ¶Ëò–1huGZ÷aFˆ·[ÃxÜÝÝ«D?Ò󨟗>ª9Ó·éY®A.„®sý1õ°•D~Ûa‡áÈF¼iÜ,ëf$Êy ßx:žËÐk´Ô yƒ£ä/æÙ) ¼°ý†\oooÛ{?}2]/,RÁÙý Õ…êêò™Qt‘b­ÿ†ÅR=„ýL·ÏÅÛ¡b¼¥YEvýÄš€K9ôG¬§uZgí¿¢™áåøØÚæÇÏ!oýDŽpß Ñܵþ²¾bö›Ý…=±…ȶØD×ÒÞš3>×÷4…oá‹p›…Å3; U°c¶ªŽö\ ÖX Ï!†íž¢îÑî›âoiŒ2[à·È k!¢;q*Ö:¾ãxØ]Ȧ˜}YÁ"WáœØ|Û%ÛAü1¾ÚÙçƒçÂsˆ÷ pop/ú(Zýsdˆ­Ñʰ„ïÃî! H–¸únƒ8?³'@cÑ‹0gùªn½Š•#²âkðŽSäòežÃç“ɬ¥åÐtëCì'$¦ÇæƒÓÄ•ßC¨Ï'[d àaÖ3ÖÁx5[s")ÙŶŸ_Ûá9|>ˆ:=€ÛñªHah°åg¨e|_ø¨ßñÃl¹q?f³½Ä† ÷ gpŠjº÷ø1{ñ.‹ó yæ0¸j\[\jy[–á9|>Ù™Ñ.‚šBfÇ)<)º ¡)ÑÓȤ?(¿w AYľß ?B‡Å×ò! o‰„Ʋd¼6ÊÔ4jý7mï`±Møü.ñ{l}ƒÍïÕ§,•ÿdŒòWXo0{Iê‚°ðí„Bþ$öŒ|dOfŸo–at_Š?FSX®BÏ !Áüñ?…Å2 Ú‚@Èc¤8ÖËš½û§JòŽõ4Å3“¹ãêù†Õ°¯µ7vŒvåþ›vú?a±³… Y“Eìê¹}/Q&Á¸öÇ$!wº2’ëàvÐo–º–¡hg5ú;x\Ÿ˜ãü\v#íáð÷˜ßÙÀ5‡.îxŒE£©ÂÅA D|Ÿ=³3±¾Ø(«Bæs”¦Ï0?0”çQÊ1"ÏcV¢s§3=™Öª@¾ãºu€½'~+i+ÛlmÌ¿(ŠyѶcÔvz2“Ý]Á}›ò‡;Nþ}R8—¹~°×°³f[ïhíñ0ƒe¶öDª}Bç $££$iÇ7ÛÚ‡“ðŽÙÔ*ªÕ”.ô4UV÷Tö̉@9Þtµt'q=rötL!×àfÜŠ,Á¢6Þšù#•%áD7Ópð8k]k ´¸#§ÇÞ£Ð;˜5ŒÓ=Åýƒû…çðùLgš2oœãš°!Z3 s±¼Xzü¶ó¾Ù;.YÆb'œwØôL¾eL&£ç¼Ù2'™f¨ë¥”Õùšø?eíCì²/·‘¦ÿê…èFb«5´ùhÁúXv!)»¯D0c ··‘;¯»ç…;3íìíXô‰™øÏED'Yï˜i’éM,Áy²?6Û¬ã;ðbþ#R Ûð oÜbéöðô\ôcóxz˜eha³{, Oå¶þS³#rè7ð`¼þÚÌy2–Ô2¦Á s±GhÅ?ð/nÃ<íýý½SܨòôôŒòpžªL*×$Gt4æÀ«ÕúC¬–P1Ûê¾k¦ rŽ$úZÓ¡å?ê71œ²L·Y܃<ý–MŸ§÷Ð\.×ç\GGûÑ¿p¿àϲ‘xïl—²ÔÂ8¢]"3˜âm«ÐÕ)l BŸ’¥¨_i;³ÝUƒÚNu¦Æ9Ç;^{Èœ¤“œj‹úS³L¦qÏÛ¼%-^Ò ¨ªöʶiV{˜B,b?µ=èŽt.:³k²3­³=uÀQ‚¼JØ ^»‚½Âbá9|>ݬQ Z §‰U4€¨êjäÌk­õ¡¼XÆ`Ù©+®êt úuÁ±Ã¾Ïns4qL²}ƒ¯Âö£ÃáÌpX€"á?¦¶#Ø/Ø|±-r6Iy†¹|Ò«PñúLÏ·Ìu격ìg|$±Š¸†—µÞCnÁç-ïÃ×ð>Ÿ¤T ç|²£+'™Ç´ÙGì9¼ÃÜ•>a÷Z~%¿fæ0ÏÈ”¶j˜:ЫÈsøÛð# Qrtt &+“m <ªB^¤sRÇ?ÒXÄBàiìw =‰NHÌ òŸ& ”íOÎÃÿÆ’¬½#)Ù[’¬VÑ f›O†5C[jCNø2­Ž­ÆŽâ½±mhä8|!\V<àÔx&{ÖOÜ•þ\Æ“Ñä!{‡jŸG šÀû,ßXhh!|ÌÒ Ùn5l•l0ÙÝÖégÞ’ɉí¶Û68ïbFês©G­$Ö’¸ÃênOyˆr±9&ýy ®€°–G‡"gþƒw±Â2 þÆ:׿´_Åâì¿ý©Ùã¿Æ8l ¹Ÿ*êÒ]Š=ÖŸ+BÔ‡>ÂwD÷`ûlGŒ£QÚ6̹ñOÏ|þyÚ@k|HÞ$¦Xk†Kø/±\AY³â+É5Ž&ä]<7YÀ5">nQ”·öÅ»¼õf¸„?Áb8=ÚM…w!&àcñ^6‚Zÿ1Ÿ´7£Öyÿ¡Íý'†X¶A×áÁÈeô^ʖ¾:í±ƒµ–+„¾Yú뤰,Aó- Üïk«oK9€âPSëeìø'G¿?ÃTK~x9J§³LÅú“m£"à‡[,Ñ xÞ¼°¿B’ØŸõái¶䊈h¼•À„åú÷Ⱥñºðc®Ýø?ŒÀçpñ?uGú¯såÓ–žŸU×1ŒýyÑRÏáó‰¹ò(´Üßî3ïÅ¿ Ïáó‰¹êU¼Öćð>Ÿ˜«ÖÂÎv9¾'<‡ÏçíuÇ·ÇwGþ>á9|>á9|.óþG?}ôÏq9Bý:œ?:þg°þ5~ú“?Ç×ÿ'à°"Ù‡öߨû3Åɸï?øŽUåo ÛnágÑ,¨ò¯jìrÌ@dÆ×Z «òQÇsFø±ÿFxŸjoa;€ÏÁš íÂ3û›}çÃëÿuUv '0| Ú3<³/FãK÷Qj£­^î-òÝ9áÇ?Í»ó^ýŸa•Wsoqî"àOÌÍ¿;'üøÇ$<óÝëŽ}¾%lKw_çD«Oø>oÏ ?Îû«}øîŸ"à{ɾbgº‡P^{rkR¨â'rÿàÐG$¼Z?hq4Vðy|K|Ñуè#vœÈŽ<úDþ ãëE†×þÁ~o æÕ×Î ¶½èõì仳KÈûëD’jÁwc5jLÈþ›uœ0lx^‚ƒñ¼ÿ4²4 ôô¯óǼšÇ^qÖÄïà wëýðÜ|ôY$yè?ámÍFGçð5õž¢]äãìä‡çþñ'‘eg°_Ü÷“ÒºË2å»býKl«|w?ÿo(ŒŽ¶q%âîŠßp® «ÓùbŸ†öî*§¢j¼ë?OÃàö¸ç&[•¨<ôé¸ûIáªñ÷¬@ÃÿÇ%÷!ÉýýâŸí¼ŒÏ¶{ªü jEzDÀü;¬ð°žtŸÌÈýs´g2½™¥Ttî;ÿSÌsMq]tM£:êK#0wøO0ÜYÚYƹÝ1ÝÙÁQ˾ˆÔío¾¸z`¯m_Mö%Ú.ÇÝGÈñ¶ºx*âïSˆ ¶Ö‹83Ù¦~Q*?MÆÿÿÀþ«ã_B¥°žèƒ/Fϧ È«xfl.¦cãÐÒ_ÈØÎâ¶Ûú #q/F£mYx>çs…¯Åöa­ñ6xjì "¡ý¾@™ˆÝxjâ:¡Úâé¬ÐFÖŸ¿¸qf³m°m·­y€ÌoÛ1V ?ãßç•­™g;mëcëN´Æ6~=¼QÔæ¶ÂûâE ÜVóöí¾'ñ›ÖñØ9<q.nÜÎnéçþ.yÐè2d8¼-Œ½°þ[ŠËKñ~1=¼U\4€ŸÀW⢬˜÷]¾À:Žnö¯Æ~‰$’H"‰$’H"ÿº›s͹G±÷¢¾<²²‹ùžJ3Žz¤?’Î|r-º—¾>š÷'X©z#~Æ¿M2®ƒ¬©3¬S=ý ÓXSØ·F#£[j¢íÂÏùw©'ÌŽß©£†’…£¿¸þ‚ñGãVŸz-‡ú%Ð3ØVy»‹H&cœþé—Àfëcרž¢ûÂZà[Z‡)_™ ß„ j¾/² ÝÁÒröX[ÔoñáŸþûTa'ËÓâ¬átÿÂzòu榷]ð”C›ÛW¶„š+÷bŸÂø÷¹Çäò_óSþÙ\Â÷rGí{=Ê’ôYr× oÕÿu’Ó }GùåÂ!JI¦]Ô„¯4Èͯú[k.ýóÌf+gp«ÄVJsµñ0¶Ž‡„zƒÜ\ fú¿&~3Üð+>¯0.v›ÒÄ^d(òuU@ãÚ`PUlúAŸþ)ô"´ÌX«±à˜4,èñfôžËÙ6Î[¶|Dw$w„4c¼Ž‚httžX_l13ˆÅi쨑—Å–i”5з(SÅœ~ÈGúÎøV»£<ýísðVè¼u0\UxŠ2ê*}å«Ü/þyÞÃìS×a×pª_¬¿)ºmB‚­ŸKáWÅpMïÒ #M3Ô“ÈgøqþN¾—ì\ïÊaßOíC DPc=šOà,tRacóû´ÖØm<Õ^j;.¥âçù¯ûwø¦û+0lœkb±¼ûWÃsø|Ú»Þ+´X^x•½KÓ̶ÙÌø]= ¥Ž4PHÇ5Ž÷]ö\c*8 ¸˺¸ýÂÃsø| :¡ÆSÞpm ²i]Õ'Ê6y¶0k¼Áî¥.¹TÇkz«½3ÔÛüû ñ»ÿ“œù “%ˆ >N#B~í* ¦*+ù±Áï|£Ýn×:Çl¢m'1š[Ž "°SØ!2æÊ×­Œ9ZWgÂU…§ìÚfÐEÍ2óç¼Å˜Ü®SdK,/RigÉ`©fª,oË/i 9ŽÆÿ°¿¼MÛC'µ¹Ú u™ò-_;ø•ÿCº3Ò]¨ÜÖM ö®ÏáŸÀl…XRau°ìG¥˜"4ä+4^¨µæje3P' ²h ÷Ì»ÁÞ‰QÇFHcÌU/Ø×7z¹?Tx;„' ¯éEBKôÕê@+kÅ“ÁF¦G‘"0’ï.Ü dbIL•¤ÅGFãN¨<}ÚÛÀu9ÆZFrã‚fÄ–bÍÐcc¹!š¯íÔ“=b*î»À]o ß*î —•ËÌÁަJ?Zbz?ç ,ž†MøÞ{?>ú› åRÞ(cW©>n5é߯ªrS¥ò|Ù`Ù`>_åÀ^ns÷ïõÕñVv×s ÈÈö®ÿçø†hŠÏ£«^ÈïKq¾òŸ$-Ólúl£¬[õ1†%Ê‚´WêuÑ. üä`à«à˜@iMOíÂVr·¦XÛ!Ý#¢qº³þ†0ìßz:Hï46·Ä³ò6õG-§ õÔé)uAëv‚Šj ©†XW\ÏIÍeñ!ž4ôC¦›çGæ sÞÒŠE¤=Ú˜Îx.s¨ÄÙ#ÎöÀêle"(¦]ÖNi›ô,FTˆÑËâr'5=È!æÏ‹ù¦ ÿ¼;ë…3ÝÎ}‰)éXIœÁ“GD#ã®m}iáMžVq^YêP1xHrª»´-*¡ï Ý¥×ÒÊWê%»šÏÂOâ¤@kow;ª€ËÏle1‡mÈ ¶ã°5 ±¯vÜ_ÏtT´R‘³q›„ «mµ›¡ñ¡'ZR-»ZPJyÁÏ žñ'g¿ugv t¥¦¿f®Ñ§Õì­É¼ÖYØÍµ Ùw¿ÿÀROQ· Qü%qX£½ÑÚ£·kÕ,àˆÄKmÄÝܯ~Ÿÿ)K{D÷A×b—ÓÕ×Ýï®IÕµ'.F`WÜ„êÞ&U+¥œ¦ “”E ¼Šë£´jrÕ’ËÝDI¾-âY?çu2 é”t/ú ÉÕÔsÄÛÂ׃9a?O:"°£y¸B:j^KM+?á÷Éc•WÊkp|¥úÕqŠ_¹&—Cäßø‚þ­ì:úkW.º 3ÞõÒ)»Ûx^³Ý˜ÅŽW¶.ØÃ5¡º¯B“õŸ No²É—ø>ŠÖK…”QJip\Qzƒ™`¯2ZB„NþîÞšîZÔWf)Ž hª3Ø}ÙGr'VE¸®'©ß‚}ZUðP¹*ßY“}ÒR¹‡Â«™5^Uª,¿vòÉü‹½Ïݵ]æ}œ²Ñ§™ƒtv:9ì³ñtш‡jÇúyŒ* ÀÕËJ%£œRÊ+boÉ#7_k×´F ±|Bš%Ts¯|«¼œ»¬ëªËÅd` ¸2רrtyçxb+š$ýºš¾[Ù¤$×6†Ê ù˜ÂjóÁj‰^ó…„ýâ-i8¨¡¾Te¥¿8] ˆý„5xåUÜ-\©3ÔeW5¦-Pµ\½í½±YÈøØG:j‹‘Y¯ ²ËÕeU‘•” «²T¬*ú„a¼(–‘’ÉÇä¹²¬Ø¤ù¬|K¡®–ÛïïÈVar1«éü®b®”tz¹³ŽÃIXJ$ãÌÛ–ØRÏR*u”yÊ é…tJ¬,.ã¥}ò ‘JŠ¿ð]øöܦàk~0ß"Çwݳ‰À¤ ³Òíë˨Éä%ÂBä´ÞŠHÌõVcæÐO*&ÉÉ¥Zr pI~-eëKÝ¥œR7a,¿”¯Ì¯â¾> ç¯sÎ@ßW¬ŸMs,tvt¸ëí9°ÛV/¶2ÖÏáóyß«çèË䲂 tR³©Òa’¸U´ˆé„Z\e®"ÿ5ÿ4؆›Çí ¾ñ9½Ý+èVŽG¶œä~›@Ž&ÎX‹Y‡¢¯"ä?¾×Ø'ÔON"&“W+•¶Ra¡7 ™Å•b> ·™ãR˜ÍËÜ÷ŸÙn]‘žD=q¤r\·Á¶x;|…õ²7âé¨ê|¹‡ÙSI'Ä©ÂNáˆè’Eiu¬FLl+ç_¦úÞ0Kéa®Áô]¦sŽjéK”ÁàëѼHÿعÜð>Ìù^c æHíøM|u±ƒüƒ²J)§Ì–.š-ò YÄo ¶ó%cÏ0éòî,‰-fú=Vg›AÔÁ¢U*Òh±\‰ŸQþQ³+ÉY*Þ–‚bj?³Î}âa_‹wŠ®»?¯·œ»³ÍýÔ;Üû³r¯¤68Æ’õlwˆBÖGHX‹ÆYññàU¹˜dUÉ;d]î![•ÃÒq¾47]Ë• Vå ûÛ±63—iÈVd ²“ÝY™ë„£y›xB¼FO#E¡EјÊïßn³¥`˜é‰Õ”SH5ä_Å3Ü´ "nçºjú&»'ÐýéÁ®.Àdq•¦Ñë©›Îö£¶]øB¼(*¢·,‡-7" q&´ÜÿNãQýˆü@q«íÕÞrMᨰ_h%\ã÷òÕ‚ç|!6«¨óˆS§xgY'í,â$¨JÃñ Ù‡¨]´v@X³5–Žˆ —ˆ»ÎEñó<.õ% ?¦¦p¯øç˜âÍènC?¡28[8³QÅËÈöÇd{&{3ÒakBk"™cû iä%ÁoìóãæS‹E\8Ä• òeôMöGûOø zÓ²=éôtˆ‘]í)Ñ•ÎYÈ>˾Š\L¶!½Ä/Š•BÖ@ëcm£5"ó{)‹Åm«±†Q™ÿ>€à@Cßdo_oYOWO…YO³Lfz©«•+?•×q”ÌJ®´$º`©¬yÐ&ËÞ‰–¤3{ÅNc¿´½«í â&ïžíÌ>gz}Êuš:à|A}íêãÚEí¤Ò8nÛNe‰ªxìÚ îiÍk¬‡ª@t(â—Í1 q±a6©’O§78úS©èÝ®]Î¥Ž‰ŽköoOìל5‡åœˆ£ٚ؄çÁŠà›Ñœ°Ã²Û3‹P2 2˜#-h¿ìiÁ¬D× o5áëºe{Er¦½‹St0™„É£d3{{fó½ßžÃÞßžÅ>…ìJ¤ÃKZ}X3d6”ÊÒ×’ÙT¹Ç²ÐÒ,£\º-¦¶ßÕµ—ÿ‘ÉJ†ð7¶ Ý^ÅÞÒö›m€}˜=™Ý°_%sÛ²’ÃÉÁ6Ófc3­ Ñ Ú¾`éoþýÏP[h˜åee4N³¯Ãv"Ùw]|)º°:‰$F^°e²ñ¶Êö#d2r©­<ùȶ‚,J"Òà«­5P9/‡ C£L žÐmK7è|4þ„nbZÄ4ËôÅþgN{ƒLÄtbў؈»ˆãdÛc¢¼Y¢—m¹›˜U³®GÛ"Eátp&8#TËÔ8ê ÐLˆŠ@ÌuÐ^/~œ1ý\¡‚··CË 2>ÿ/Mldžãg‰lx6<@hD=¼ qëmmŽ6D2ÂÃàðY覥åSå(ÔB# ñ‡@‡ø»ýÕÀVß ±F^ ûð*Ä|®c~,-VËŒ¢­Ë°“W´–±>D ä´Þgƒ³Bë-mM Ð èFê:Cà})^ã±Å)­#±8oh»EüˆÿŒÍ6#•IXN¬¾UÁb6ìÒßZÂú 퀰~`¹jÙ`ZÈÃÐs” F¢ï^I}8=‚û‰¹äk²”=}ÑÆÒáv¼'¶ÖÚÚÚÅjµnFÖ )ÑꀓCs ¬P>K³?çgL+ïK±µ˜—…¨ïl‰N¶|ö2ŽývÊá!ã(ÑÇñ$¦5Ìbõ`U­²5Ú9†ÔCž@“¡aP;SÙ: aú¸¥Åˆ¨Æ«ÁÑL9ª‹£«²ËŽ"Î’Žl޼޶óD?¼6ö«iío]cm`-b}ŒB!ë‘¡ð h ”nA- `™l±AtÆÂ÷5>‰û.s™éàLJå¢:9Û:O9íöv¶oˆåØ~¬&V;c€NDO¡;æH3d!|ª } E[jÀ‡à+–ß,,T7‚ûª_ë²[<¼w“»§+]îG­¡R¹f9SØ7ÙRÃñCXl¹ÕŽvFw"¯àöp+¸1 Ã:Ôâ!7tÆÒÙr~d–dxŸÏ̸»ê}¥9¾%lEocÿjö™û†§¸§-Ã2één®¥Žñ¤Ë–—ø»k}ŠžE²¡àZp9ÓÇ9ýýdŽ0Ý¡ÞÐ6K‹ˆ‚´´ÇâÔ[N¹«?à×ý«|ù|Ý}A¿îÂ.taRÒ‡œ'ìÏl剑ØxkÔŽfDg ÇàÕÐ]ËlhtÐ’ÃìÝ£¡¤Paów'([4fŽ»ã!êËÅ|‡àpï¯â¿â}QÞ,Í]ƒnJÁY”x‚iÖThiô²é'‡¿‚fCœzn© Õ7[ål¨Ô¢# ñ¾­S\|½L¯,ºøKy‹zw°< ž&foD—§K™ÑK n?Oøñ¯¬ .H+$2 ñ!uàªÐXƒ@£ œ>Õ0ÇÅsÐÆh¬àI”´Š$d~å;â¹Î¤·»D×\j/õ“Ãi/J\ƶ£_!/àɃö@¢ðOÐh4Õ… šGÀѳPß´Ç÷ /w„5Áj4þÚÞ&žî‘tw×<×.—Aõp<&.`'Ñ_‘üÈäw´<""à.°‚AÓ RpRx1´ÞcZ Ïáóy¯‘ùIÁôÁ6ÜÔÀ/Ë&qG#L€®F¹l~ åÐÈd$ #£ážpSx” ^hö•òp¸5¼.׆sGH㣦¾R™%-ú %ùË|— ð%eºgÐKè¹®yTCÇ4â¾µZ9?Bæ Ç+2ކ’A2<Êì- ¢fùu†O›?ËDHã¡4Ïð•ÄiÒ5a¼™ÏhìÍÅþìV˜Û®L.§ëûFüzÉ‹E¡²5=:a7\ºiZÐ7P(‰©ùW8#’&B»Ë-ùçÁÂB”h: ¸¾þ:Þäìæ:=ÖµŸÂ]ãí0‘×j1½F/úmfÍ‹žBr!¹áï vPSe}èŽ%7ä…À¿ÀÛ#ÔgªªCäá".±ÒB¡6Ÿ?Høóxïxö17é™fß~D©ö¯‰kÖÛh/kWÓ繃>F¶#%ðÏP%(4 ÚoŽ¥¡ pvx1Ü;B k“Zy¨”‡ Wƒ ü˜¸w—§˜»¦{.-¹¦;«’ˆ¥Xk‹5±îCK¢«fÏnŸ4}ŠzP-è'ètºlZ¢fð¨i¬¡õQn€’ g–&úêú úæ²;׳“©àúÆY€lH”»aűÖ{(ƒ:ÑžH}X†3Â…Ì>Ó :föoÆá#Pwxi„Úce²+tÔоz`"7S¼2j…ÿ¯vó©ª ã8 ïó¼ï9÷Ü{î¹çþ<¿îå^À”´‘-®´ ƒJù± -§XcÙڮʚšPXˆf¹éd˜Á†hšº²ÚÔ66‚F­šLðüá–˜ÊÔR:lµâþ×n}žóçù~÷ž÷}Þ÷¼ç} ¾K®.G¶±o±í.À‡€áa¸Bæ’Rs->.A#«IMBYBnB©Ã7i»ÆíýêÅ”Hr“²Ò×¥uèJ¢?¸'°BÿȷƽFΖ–‹õÂA~Û£¤~‚4¼ï@˜´YdCB·—õ°QÚ‰•0sðöà:L"˜Yñ(tAªÙšã³?:ÌVl´Ì¶MØCòaW‹g¾7Û›«Ô)MÊ!5üŸyüÜnu›O~Ꟃ7.î…?w¦þŠe=Žø+I¤©¬‹ã 8¯ÀÏä$Ü„lºŠËµ ©âŽûÎy¾Õõ¸r\«Ö&”=ZN0Zëß±Ã69ù?Î}ÒuGmW‡1%Ï5µŸ²tZ¿L Yܽ¬–°a¶‘µâ×ðÔ€ÕœQ0Ÿåð»…$Q‘FdÙ³K)Ð^ÔÒt·Q¯oÒ¾7XL5äÍ–"鈱oe¹Æ™î «Û4ÙtvÚ9å±tZåÌxpØmå_ÜÄç°Û°âІš9¿dÒ£Ü9ËLÛ#öÅR›s¹·ZIÖjõa?8¸™¸)éRÕy€netcdf4-python-1.5.8rel/test/issue672.nc000066400000000000000000006657431413751447500200260ustar00rootroot00000000000000‰HDF  ÿÿÿÿÿÿÿÿãkÿÿÿÿÿÿÿÿ`OHDR 4""ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ C "2#X#numRowsaTnumCells‰UnumSigma±V!azi_angle_tripÙWsigma00`4!lØ¥ÚFRHP~# ÌI B( (cŠ? ê»BTHDd(JC+ÈmîBTHD  d(NCÝ¿crBTHDd(ÌCùÜ+_NCProperties version=1|netcdflibversion=4.4.1|hdf5libversion=1.8.17BTLF¤#(  bvƒBTLF°ª†aìn?àÑÛiQM¥‚ L.FÜ(œ D(Í!½$F?è5[%É>@„Â5+L6Wc,l3Ý-ºFvÁò.«:ZGS0ª)¯Ý²1L3+,2Z k$<7…:7HÌc<G" Џ‘<ôWPBTLF 0F?…8½0í7$.RN i > G" i- –| W iQš°ªZŠºFä40H4|2®+7Ù$M2+ª)¢åFSHDÉPx(TCC°TLåBTIN½0tFW Í/`£ÌERLÅBÃÜ(œ D(Í!½$F?è5[%É>@„Â5+L6Wc,l3Ý-ºFvÁò.«:ZGS0ª)¯Ý²1L3+,2Z k$<7…:7HÌc<G" Џ‘<ôWPBTLFÎ L/#ý¦6 ;—öüª$.ç0-«Ù$ÆY/°®+í9B¸Ó2Ê7š¹ê L,¡:zºÂL2?»nT1c·dÚz}#ÇE(Bég\Ë´ C!" Ñ–| îqLÒZŠKÁÞZ D*BIã0 œ¡æT0OVíbL7l>ñîH4íûð÷ 2"|¶,ód 8'þeÏóí7ý‘àûÅ s%啽ü 1ÿ-øü > Ñ·×ýc;¤BTIN Ó2ÌGP%Š!ÂL…8½0í7$.RN i > G" i- –| W iQš°ªZŠºFä40H4|2®+7Ù$M2+ª)¢åBTLF  16 ;q C ´ C!÷ 2") 1#Z k$Å s%8 ,&d 8'œ D( D)Z D*ž L+ê L,6 L-‚ L.Î L/T0nT1ÂL2L3ZL4¦L5L6bL7®98ç19«:Ãd;'³<Ú³=³>n?É>@>AE(B4æBTLFZL4 š€Fž L+à4°KÃd;f†/Lç19ñM0æšRM2íô„TRNŒônZä4ù¡ª^®98ˆæ^ D)Ny±_|2Òbgd) 1#+ˆŒd³>·ì^h>AmIi'³<õSËjq C 4 {{Ú³=½!Ç|i- Ûê³+´M‚¦L5’gD‚ iQ‚Å„…8Ñ~t6 L-΂N™8 ,& ÊÚ¡»€9’> Ñ·×ýc;¤FSSEÌIýûò à “m, ÂqOHDR À À ! ¹wÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0CLASSDIMENSION_SCALE `NAME@This is a netCDF dimension but not a netCDF variable. 3264Ö’ªrOHDR RR! —xÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0CLASSDIMENSION_SCALE `NAME@This is a netCDF dimension but not a netCDF variable. 82¿/bSOHDR ! uyîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0CLASSDIMENSION_SCALE `NAME@This is a netCDF dimension but not a netCDF variable. 1@4¾#OHDR 8À RÀ R  €€ 8shuffledeflate¹šR åZw[[ i>GÔFRHPÿÿÿÿÿÿÿÿÃ[ (c~Hm‘BTHDd(\ –áeBTHD  d(^ M¯ÐoFSHDPx(`½ùºäBTLF:L¨ šBQ¦BôŠ$­L^2ð,Ü:Èx/Rù•Í/`£P'iž±w6Ë_}ÉXB>|­ÍŽp c“‘éÿÎBTLF BXBšBÜ::P'w6­Lù•Žp Ž›¸&FSSEÃ[þUмrOHDR 2  €€ù¦ nbc&c¦q`8FRHPÿÿÿÿÿÿÿÿvLc (cz§ZjGBTHDd(žc ׿(BTHD  d(že õ¼QHFSHDvPx(žg™Œ@ªBTLFD.L¨ À)Q¦Ò4 ò;Š$’@:P,.Èx/Rr%iž±4 ¼å@´—)>|­ÍT>Iå<Ð?#™—Õ:P c“‘éé,‚!÷ëlÓ°BTLF .D.r%—)À)é,?T>’@Ò4 4 :P 5h³~FSSELcvŠ{êGCOLaTaT‰UaT‰U±V±VHOCHKÿÿÿÿÿÿÿÿ3 ¸tREFERENCE_LISTdatasetdimension ÙW£`9OCHKÿÿÿÿÿÿÿÿH ¸tREFERENCE_LISTdatasetdimension ÙWM­OCHKÿÿÿÿÿÿÿÿ ÈtREFERENCE_LISTdatasetdimension ÙW0``ž›sFHDBnb×úðstandard_namesigma0 long_nameSigma0unitslevel valid_min0 valid_max2 positivedown definition0: FORE, 1: MID, 2: AFT flag_meaningForward, Middle, After_CoordinateTransformTypeVertical_CoordinateAxisTypeGeoZ_CoordinateZisPositivedownDIMENSION_LIST¹gFHDBåZfÏòD _FillValue€ valid_min°¹ valid_maxPFstandard_namebeam_azimuth_angle long_namebeam azimuth angleunitsdegrees coordinateslat lon sigma0 scale_factor   ×#<commentuIncidence angle for re-sampled sigma0 tripplet. Values range from -180 to +180, where minus is west and plus is east.DIMENSION_LIST¹g¹g¹gFHDB "™‹$instrument_calibration_file_pointersxxxx_OSV_xx_M01_20161231000000Z_20170103120000Z_20161231063935Z_FDFx_FDORBPREDI 20170101003900000 20170101022058125spatial_filter_methodHamming windowpixel_size_on_horizontal12500mNCO"4.6.4"FHDB "§&É0 subsat_track_end_lon #  qa_duration_product pZ]qa_percent_degraded_data0qa_percent_missing_data0orbit_prediction_file_pointersxxxx_LSM_xx_xxx_20060717000000Z_xxxxxxxxxxxxxxZ_20060713000100Z_xxxx_xxxxxxxxxx 20170101003900000 20170101022058125normalisation_file_pointer,NTB_data 20170101003900000 20170101022058125"processing_parameter_file_pointersASCA_PRC_xx_M01_20140520000000Z_xxxxxxxxxxxxxxZ_20140415000800Z_xxxx_FM1xxxxTCE 20170101003900000 20170101022058125"instrument_parameter_file_pointersASCA_INS_xx_M01_20130625000000Z_xxxxxxxxxxxxxxZ_20130325000101Z_xxxx_FM1xxxxTCE 20170101003900000 20170101022058125sigma0_granularity>Averaged and re-sampled to along-track/across-track swath gridFHIB "¹–¹’¹Ž¹Šc†c‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrtjZFHDB " Þˆ¡start_sensing_data_time2017-01-01T00:39:00Zend_sensing_data_time2017-01-01T02:20:58Z start_orbit_number íV end_orbit_number îV orbit_semi_major_axis ÿÿÿ orbit_eccentricity ä orbit_inclination ‹rev_orbit_period  š ¾E equator_crossing_longitude €equator_crossing_date_time2017-01-01T00:09:31Z subsat_track_start_lat µ subsat_track_start_lon ü{ subsat_track_end_lat UFHDB ";û7<platform_long_nameMetOp-Bprocessing_level1B product_typeSZRprocessing_typeNprocessor_major_version10product_minor_version0instrument_calibration_version1.3$processing_parameters_configuration8.0$instrument_parameters_configuration1.1format_major_version12format_minor_version0 granule_nameCASCA_SZR_1B_M01_20170101003900Z_20170101022058Z_N_O_20170101022104Zparent_granule_nameCASCA_xxx_1A_M01_20170101003900Z_20170101022059Z_N_O_20170101022017Z contentsnrcsnative_product_size26618899production_date_time2017-01-01T03:08:45ZFHDB "ʈ9¤historyzFri Jun 2 17:37:15 2017: ncks -v azi_angle_trip -d numSigma,2 issue672.nc issue672b.nc Fri Jun 2 17:28:01 2017: ncks -v azi_angle_trip W_XX-EUMETSAT-Darmstadt,SURFACE+SATELLITE,METOPB+ASCAT_C_EUMP_20170101003900_22253_eps_o_125_l1.nc issue672.nc 2017-05-25T07:51:37Z - Created by EUMETSAT; 2015-05-28T12:14:53Z - processing_type update O replaced by N, add R for reprocessingreference_url‚http://navigator.eumetsat.int/discovery/Start/DirectSearch/Extended.do?freeTextValue(resourceidentifier)=EO:EUM:DAT:METOP:ASCSZR1B wmo_filenamebW_XX-EUMETSAT-Darmstadt,SURFACE+SATELLITE,METOPB+ASCAT_C_EUMP_20170101003900_22253_eps_o_125_l1.ncproduct_xml_version12.0producer_agencyEUMETSATprocessing_centreCGS1platform_type spacecraft platformM01sensorASCAFHDB "Î" creator_nameEUMETSAT creator_urlhttp://www.eumetsat.intcreator_emailops@eumetsat.int institutionEUMETSATlicenseCopyRight EUMETSAT 2017 ConventionsCF-1.5Metadata_ConventionsUnidata Dataset Discovery v1.0titleIASCAT Level 1B normalised radar cross section values in 12.5km swath gridtitle_short_nameASCAT-L1B-12.5summaryNAsource MetOp-B ASCAT referencesThttp://www.eumetsat.int/website/home/Data/DataDelivery/EUMETSATDataCentre/index.htmlcomment7Search for Advanced Scatterometer in the references URL keywords)EUMETSAT, DATA CENTRE, EPS, ASCAT, NetCDFdata_format_typeNetCDF-4 classic modelTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿkû¦HQÖš([c;o<1þêNPlm–d V¼ˆx [RŒRx^„ºw@Î}ô>.RD"*IVÉ)$2KSRY‰"ˆ†QvF²32+Ù#¢„YYEˆ”Œ²2×9¯÷}—çóù|ÿ<½Þx»ZÏÎm ´1¬ù4yÝô!¿r®˜Ô¯iÅ„£5j~|š}6aý‚i® ø<ûôîUs& ïÞ¢Nyþ•¤M ¼íz¶P*{RûUú®yîfZw’VL¶jñ3÷øš©Ö-åžXí3@ïû½¤ežZŸ®ÇÏw­ñþɵ3ñëæûºìÒ\åËógö®žhÛ³e½/ϲŽm]èëdÞº^ÅãK‰8ôÆ™꿽1¦·VÅíƒË'öC}’ðG³Ï·,×[ãCVܼQïgÚ»vþÔQMš×ýúâFrÜšÐIv½[7øþ"ûdìRWKÆߟ_=²ñý̓+¦ n]ëyê¶à‘]”fØLóãÄEãzㄞʮî™;êÑÕ“{ÖÌ›:j¿Þ<6ÙÁ¼mïnÙ½b¦‡uGÍ?¯ožÜ¾èå¥ÝácûèTæžZ`Ó^ùÕÅØP—®j¥™{ç»õhT–…?º«•fìsÉ8±;jîüZxë\üÚ¹>Ž} ÿ~““·zÎø¡]´k–‚B‘’7ÍvîÖèã­C+¼ü}rvÓLûu_§Ç†¸tU}›±+lT7Õ·Wv…ºÛ¹:Ì€º*LIX7Šs¿öš5Jî§î[æeÛ£…òǼ´}k挹™´Êw˜Q¢+{#ÆYh{p|Íô¡mkœß2Ë¡#4©_|ygèÈ«B½GZq„·Sö­_àëÒ¿C“še¹é7Î÷qèݪþç§Içz ¿¼w¡gý?OÏo eªþQF¥3lj¦níØI¥(}GˆóÊoô¡nݯ/oŸOÜîë: S3ůŽY8md_ÃF? ¯ŸØºpª£YrL°kO­/÷O¬ ÑQ¥83náø>Úߪï6 ÏR6#uÜ`çàIÎýú0búhk¥OPŠmKü©±ÿ¼¹¼{y€«e»ÃQ~#:©¾Ë>é3¸M­i±a£{j”ßNBV[þÉOÞhÛ^‰ÚÉy’cÿN xaÿ&V j›k܇ƒLš¡/$¬AvÒŒ[ì5°µâËË{"Æ÷kþóqòæ §.je×—L´lþ#÷ÔZ¿á†µ_\Ø6ÇÉѲ“s.ؼÈßcH·õ@Ê3{VÍž0ÌTOùÓãË7Ì›dÛ½¹âÖP7sŸÏm Áá?ß;ígk\÷MÆÞˆ±;Þ?å;¤m­çç·Îvbé!-‹Y8fh÷–ªß_Ý>ê5¢—Aý/RÛ´ªWèÐU½<çøÚ@ûÎje7®Àá /î˜ëÖK«"çðÊ)ƒZ#[‚;h3àÁ˜%3ÆëÙªÁÏ¢œó‰ëæù8Z€å/ožÞ¹MÙìå¼u0rò@ƒOÏÅ9ðeNÚ¡-Kg޳éզѯâûi6…ûºX¶×øS|7%b6Ĥiâ;sÇömQãÅÅÝúë×(HÛ1ÏÃ\»’{ݤÁ»ëû—zYéÿyrvó,GŠ€ËfN°íݶñŸ’‡—’bû» ìÔ´fÙËÖÏ4¢‡žò‡Ü´™Îݵ¾å%o Ý»Ye^òæ9.=4?ß;¶Öß¶C½·WyZêýzœ¼i–ÃD˜´uYÐ;sC …wyG·-›1fHW]åOùGbú:÷i£úõYæá)Ã;¨~¸stm #Òy÷Òi¢öá IxMÔW÷ç£3@$Àm˃&Úõ1Òªù!?óÄŽAã‡÷€˜=¿~"vY€›U_¯ožŠoÕªvÑÕÄÈ)ÃŒë•f\é;¬½JɵÄåÞÖ(Pú®ùc,tD0röD‡>ÆM?>½vj÷ªà‰v½Û¨A{’Á¡qC»ê(¾»!nÕ(3í_OÓvExh­øêJü’IÖmj#6¨e‚ÔsÝ{7ûž{jÃL‡´¤í‘s¼úuh¦TQ¹óvìcØøÏÛ{ “Fôj©R‘åІ¹#L}~p&&Äͼùïg©;Œë§ÿ÷ùÅ ÆömþûIʶÐѽš|}prý ‡¤í+æLr²ì¤­üùÅÍsО©#Y*ò.Ú>Õ¹o»†•èìí‹§Y·«[zóHô 'S­¯¹@Ý[ûG~ʶ07üùèlÌœQ=¨é¸}Eðd'©¹³]v–:{i€Û€ŽMþbÂî]9ËâE—û–Oµé¨ö1çØ:”^óËÃÓ›Pr­oø3h¤©:i] Ã Ò“æõ¾½ÎI;Þx q“}Z Äæˆ—¬›hcªõ=ÿÂΈ‰ÛÖy{ýàªé#:7ü˜s|ÝL§n+îX?B¼Gè—Rtÿ"H4sìð *_ÝáF´33¨ÿµ ëøÖE¾ÎÆ >Þ;âѧ…Bá•ø¥ÞCÛ×{w3)ÊßÈwŽ­ pèÒèSÈeïíÛ£ú³øÁ¥#Û#g{‚æ~Sßl\€$ªÿz};®Âc`‡VJÅÙ‡£g8÷húóIêÎpÏm”Þdí_á;¼Cý²›‡×øÙuVûxçHt€½‹u·– ~½Í½r|ÇÊàI}Œ4k¼Ë»|xËbÿÑÔ7ï¦%Âؘ6×þýürB¤¯mgõÏ“·„yôÕ±1¬[‚,L³íØàÃmB´65høçݣ̻W‡y;[vh¦øñÉÕ;"g!‰zuÊŸd¢o¦:Y´QUÿ’—²#bâ £zïï_4ÊL‡é9q ˆu*ZªìÖá5ö¦­ý-ËÏ:½7zÞT 0:pgöD…x0kÕà{áÓ;#g¸ĈU)»srs¨‡¥Aí7×­öwè¦õíQÊöùã, j½ÊHXæ#òºÆß¾µ:\Åu¸ øžAÐ[ÈcÊ>šˆ}C|Î'D‡L´éŽ’×|uhÍÌ‘fº^\I‰:5ªáCQ©/.Å-™<ÄH¥ôÆ¡(ûÆ à{ömXèï1´»ÚÏbr¦ ýFìÜLñý£ËIDs‹¶ ¾=ÿñ,=~ù4»®šßóSw-š4ب>N¿a¶«™îï‚‹»y jW§$›k~*¸™²ÓâÀqÃÍÚ¨ÿ-ͽ|â3v¨i š7Њ@œYëoqNùÃs±“†«•?HÞ:oœUkå’¢ö?ž€§žÖm•ÁÓÕþöåÏo_8¸eé,¨™‘fÍ÷ùWOì\9Çs„Ykµ¯oŸ‹‹ öÞ]Oùã£K%·Žo Û¿MÒÛÇ7»õiQëuÖU~Ý4‘ÏØã´V*¾vpµŸý‹;©‡¶.ŸíåÐ׸Yíò‚l8©0o'¶.‚•Sœ,ÚªUfŸ(¼zpÍÌQæ-j¾¾vhÍŒ‘½t8Ÿ¾#LÔ?ç&o›7®«Úo®áö9Sk;÷ÇHü[0Íu@gíÚó3¹µÁJ…’{çãóÓâ–Os0mú«àò¾Óí»iU>¹¸g‰÷°jŸîŸÞ6Ʋe­¢¬ý@L? Ÿâã2°‹^=Þbx 1Õ—f,[Óºåù‡7ßKF‡uTÿúèÂîÅ>Ã;5b~zQ…rNn qï«_óõUB<¶+jîT×A¦-Õ~½}x4ÁÖ¬MÃ_oî^H\_}$Þ8¶)tÜ€võ>ÞOÞ¾DWýxÿÌÖyã´­ûîö± sÜ,Z(¼ÊL\ég¿;zþ4·!=Z7úûîqæÉ]«B&9ôm¯©PÆè7zu⃴ĵ¡ÖÌtíÓ²¶T¡ÖuÞÝ>±9tŒe+¥’GÖ¹š7¯ñ’׆ûnÖŽìøõ3qkÑ8Vt”ÊŸÁ¨`à Ù+ž^=ºuѴԽ˧;ôÐùû*ëÐÚY£-ô‹³¬Ÿ=º¾â›ëIÑ3]zëþ-ÌØÄ…ãlÍšÐÂÀˆûàn-ê{ _±f×¢m£Ÿ¤>«‚ÆžÙ1y¸‰Få³KûVú;÷Ô©ñò*zÈ¥ws…WY¢EñQ3‡ìútÐV† H=³tl@k’³‹hœé®:6­+y`Ã|o‡#ÃÆ[·oð9¾vÝšü|~9q¥¿SOí?…‰«ð—ßϯ$q¢ƒe']•ïE÷IçL´ïC<œq,vùÌqÃL[¨ˆÆ =`Ô¬Ñ}[×y‚ÖIýÓÉÞ´ÉÏ‚Ë +ý»¯Ñɪ —ôq×êPÐR[¹¢ ûÌÞ¨ÐIöæmý*ÊI‰_Cb±g¹ŸS/½šÅ7ož;ÁÚ¨AEnÊ®Å>6]4+Ÿ^Œ‹Зq`·–ÐG±‚øŽ„5öû«œ ‰ç²Â™ßç]NЉðÙÏp[„·Mצ¿ ³’ÖÍñ°l£ò :´“ú×üÔ=˦ÚuÓúñìR|ät‡î3I}Æ ë‰$¾}xéðÖ¥3Æ@,h„Ú¹Kb ¡uPÿöôÒ¾Õ3FYè×.½}rË<ÏAÆjŸóÎïZ2Å–‚M'ĶšµÊŸß: féÌ #Ì 5áT²@Ë`/;Lâù¾us'Û÷n­5ËͲmýO¹ö,ŸîÔSW¡(ûèFPÞ°þ§‡çv,ò¶1Ñøþ„›(}&ëCÆÂ±_Gm¥ÏÏož%àÒg†Ã?²c»Æ2?çÞúJïî&Ç.òÑ­éï—t|w:>šýÙ¹ñ·'èXçÊŒ¥Fêíï¯ï¦ŠÞîÖBEÞÛ=ôU*"¼G˜j+Ý83ßkhgÊ‚+û£ÐDÊïrNo ÷â„¢DÓ+‹s3Nî¡VܽUÃß%¹WŽÆ®˜í9‚§ì½T1eÿz:aH'Ÿ/®&­gmÜðKþÅ„•#{ë×.¹}2f¾çà¾>N£Kg‰_0Ö†ZñÓk§÷¬™ëƒ¡ØTÞïØv˜ÉÁ]t•>>žåne¨ö%ÿR¢,¡ç‘PÇžÍ%> ÂK§ÅEú9>É>—¸iÉLtŽ1Ü]lˆðsDgÆÞI‹,Ê¢Vùò¦ßH ƒº^ØàbaP§ìÞÙ‹§Úu×®ñ% gÝ^íó£T :Ý<>É©çæHâ=¶*ã¡g`QU+¤ûØõh®XšsfÇb_‡žzŠooŸ’úòÚáõ!c‚ó@D¤Ž]ê3 ÎBíwI^ÆqèÙd§~ÆM?bä¿ ù}~ý¤çÐ.Mþ¼Î>¾eÁdÛnÍjˆ 묉ÔZ;gŒ•¡jE#ÛµfÞ4·¡=Û`ÌbnÇ­[àëjÝE6Ùs kçù8õ5Ò {šè1ÀX½òyfÒ†° C:kþ*Ì:¼1lÂàŽ¿?Ë8=Û½»úå¹öqϺpÿ±6¤gHâùý›ŽNòóöAzÒ–Å4W.zõØv—>mêWä§'FÏ3иÑ÷gW® ;°}ïO¤bÕûĈÎϘ`ß·£N]$1ý0ݾOû&µ>>¡Î™C–¼á×w ö½ô•ß?¼·rÆè~mU?;*Ƚ¿aƒÏÓVÏݯM½ÏâÒ /'+ÈOI^¦ü:@»±X¶¡°WŽlY4¬«¶ÂÛ;É;—Nw67Pù˜›¿r†kß6õ>å¥Å¯ Õ·µŠ„ìãb 7Eæ'9a}„ŸÇÐ :«¬Å°î-ë+¼™¼wuðÀš¿^ecמbO×5÷Ïí^î?Ò¢UÝ¡èo@ô9Õmh/V X‹²FZ8óµS{¢B';ö1Ò¨Qú0ýÐæˆiýÚ©}â´qž—M7íšoïœÙ±d𣙾rÙýÂ67 Ä=øÛóöÍ”¿"‰GvÐ}@é>@¬ït&.©Æ›µT)”¾mÈø!›Ðõ ]ùõÐS,½{–2Ñ»e÷R€èbׯ£n½oåÍmjÀƒûèöå<¸!h÷R÷oX0ÅÙT·66¥øU³@£Æ? ¯1MuªG+­ºè«ý)Ë¿ž¼oã¢Àq¶½I!ÑÜ{£ÑÜý;6#¢ÇÌ;´S“¿oî$ïZ0Jœ?iã܉ú4ûûæÖ©í‹|zQnSöDú»˜¶V¯ù±àÖêE/GKìï_^Þ¡ 6+wRè¨vlø©m‹x¯È¿t`_ë÷ë|þžzJïîӽШvZµ?¿¼ ÷³:l zQ¿Ÿ9vÆ¢…¡\>4wi Çà®­ëyšyd3ßÌÑv¼/jöXë?_^?¾%M¯W[BlV÷û›‡'÷Â[x ëÕVCô"¦Ø¨&ºu¾HiíÈDŠËÃn´{ž[5Óݪ½z勬£x͈î‘{„èZÿWéãkÉû6-ž9Áž¬À—Bœ™®Ћà僋‡bù» 2ÑmV³ôþùø¨Ùãw¦+³»ñ°¥aÃoWlšéÊÿ~xF‚9g²óšÜÅ/ÛýqìÍýDëñjšbmjü.º¼‹Ã±pïXê‡VWýò4#iÃ\/SZ%„èZ^˜sñÈŽÕs§Ž†ASW{ÂiÐ\ýú•¯sR¥åS»¶ÚwÚa—øêgذòÅuZíD.ÄÚˆTÔ*¡»Àѯ\9±gmxÀX[óöM•>ÞI…+Ÿ9~„y; …²Ç™Çw¬˜=Á¶\¹J 1Åɼµê—gWÄ„ûØ›µ¬û‰“뉮¯ùöîYBÌË:³oÓ’Ydš×«,~x…æ¢÷H«Î( $R’‹fŠj¿ÏK?°~Þ$»žú0½—mœ7™ïDò.&F‡LÚ¥™!®˜áv#åÀÖÈ`oÈ…–/º­&´‰Ì?¼§Aƒ¯k@vÖ„LnŠu)÷â~ª:ú¨ìaê¾5sÆ1b#¦!‰ó¦¹ëe¨ͽƒMdY'$ey–}&­3’çâcö‘+ƒÆ 6¡ªÎŒunÌð^m+”å_=¹Š†Ý¦ 9ÊòüLèî4¸4õŸ¯oÙÅ (-cg÷¬œ5Æm/=¶DûŒÜ£F­OH^–Èÿ ,P´M‹üÝEwßNákÓ>ŽæmÄ54\ª•± )“ƒÏô@=†C"ë|{3K«ˆÙ•cØá½Èô*”=Ê8Z|÷BÂÚÐI#zðMù¶ÅÓ],Ô¾ºyz×ò@Ð^óÏ›;nxàxû~ôT©éÌP4sC-ÅO7Î&¬ŸîZF?%AÜ(‰[IlL°©Î}èêæÆ©|s%Gœåå<°›º‚¤hs$wQt?ýð¶åAžt›VƒBÜ^pýäŽå3Æ 2ÑQ|ŸwI$ uƒo/®Ÿˆ]êO Ľ+ƒÆú¸éÕNKéË«{—pæy¾´-©×(˿Ʒt“/]kçg•¬¤B郴ýð©âªåÚq´¦kÿö¿ e÷°±q~¼ÍË:°aÑŒñ#à¨H€èލwÛÆKó®`H`~m ‡!7ÒW¡m{ê«|¦õiñôQ–íÿ.bÄqö–&újßW ¿Jr3NìŠ ó¡f¬ûåÅ-ºýbÿìÍ_¼¾}vïjZBÅÕÈ–…Ó\úÁb2âìñM[k(V@Åí„rǨ nœKܸ(ÄlÓèOi.…8ëVòÞ¨à‰(µê·7NïZ1kì®ä+¯»„º ±—QÓ:ßßä^=3K~>úhìÊàÉN–µ•aÌÏ%¬ŸïË‹¢Xšèk«å3<™h+~È»,nì$D„Þ±yýßïžd ½‰²7Äd$½÷sBzQB£;rÆÑm4oàw?ågݶ$@ÜÌ2ï§8õi×èg‘HFËF Ÿ^ܹxgžî1ÌÌ­P\4L¤‹¥ ÞøŽ‚±6ElM‡cMwµê …²_ÄÖèÈHoÜê`OM¥/¯dœŠÃ™=Aõæõ…XC Xõ5~øùSœ-Ûk¶\ßaÑÍjØäœKÇ÷¬[Hg&ÿe‰Y4ÑQÜ °5ŸM7Zôšs?cèù#q¯/m˧±9zŽèÕZº« ›œyfßæes¼G îÙVòT;£æú²àkÄ8²ƒMõUw¯™DæêoéÃK¼E –g`6e€¢çz§Ú¾jî4V ÓGYg6b{°ëË߲ܽxx‡hÜD16R²¨Å÷Å}¢µ‰ö’,4çì 6=%ĵs½î^èéØ¿ šçcÁíÔ¤í¼‚ñô†H"Äéd|üä±Hѯs.ˆœv’rŠÅ̦§ª@œç¿i)Ÿ¹]¥¯äXö®ÃkkoþE|‰!º±v9½ÁËØºùSFö>?óx,W‰ÁÓyS¶® ã3ëÂöåsóHvÕW3³DˆCº@0ÖÍŸŠRëÖ©x.¿QÔâ*m§{ ‘îk£Ã&8Zu5P¯Yþ"‚5ŸU*”ÝLöë@_:Dp€!tÑMX\©ã/Èqê’Ù“ùÌB$Q–YÑ<ª¿Jò®žÚ»vÁtÒ4ÈnÞ ìw|½”y|çJìwæíSÝÃTŠMŠa¼B}Ým,:6WýýþéÍ ‡¶¯ ƒ‘ìI+Ó‹üÀË;°T¶f²©#Õ]ì£KøK…H+$(!h"­ò§ÊÿÝ}E°ÜÄ÷9°?ùïÇçwÒQ;Np°4i=ñIö9’ „Tùæd}–F¸ý÷ùY§èFæ@§ýÓŽ}§Ӡ„¸ÈŸÎü¥èáÕ3,»® ¦Vma‚ÖÌ'3ÝVU‚!ØäïA7ß厫C9bP®g‰—!.h‡3—>¹q!iÊ2vDßNÍU½Ë¿~6qóR„Ø¿³^ýX ŽïZ=mô`Ó–ÒÖ_‰foÊwüñ|û‚¤~§/„7/l®ö÷ã‹»—NìݰxÖ$gkx–Z…¬’ì÷Ûi*ŠËÄ%(u=rçdg{Šû‘§b‡t—xâ+æÆµ¿¼ÉÍ:»ëŠ0_÷áæÆPÉ’GXEˆhÇŸoó2i›§/uêÒ7Ó‡è‹ qWùDf ŵ`Ú! ÖýYúôVê‘]Ñ(‹P ²GvH!j)V¼¸ÍЍøŸÙÜæK¡q6fm¥2EÏ­†ˆ}­Æ§Â{WNÅoZ6‡¼©–ã⼫ghƒ Åh7ýè*D-Üî´Ø¶íÛˆ}bX¯6êß=Æ>±†¹/C\6ë뛼kçn_=Ïo¬]¿Î°’ 䇱z"D!j9iüíJ-Ý„ÅíNŠD߸E…1¢ éoÖ»§·.Û½nÑ,¯‘Ö=Új)}-z˜y:^µ ~¿ƒ#H GDßÚ=†ÆEϧÂHWw«C}èŸx¨ðÍ ¼{áýŒÓûb"C§J¢Vö |û*îÃ&ðçwÓÐ÷-£\àZ„ûÝ…/ ø],¦" ºG×SíXÃBÞ­•5ø•“0j3)DÞîŸå ;Þ!*yÑ£/tè«ÕÒzO«.#òÅÛíôã{7,™íí:Ô¬½v½Ÿ¥ù7ÎSƒOuŠ•¿R÷€š¾£ÛóÀEGb…‰¾0Ã!â߃‘žÙ¾bNƙĭ+çNGYLôÕ,/¼K¾ C„øžÔ„Ç oHx£?´m¹¤Ißè&‹ñû3â}þ¿ó‡wFGÌô9¨fMå[xÉ[W„rˆM•¿Ý¿ Z@ÃŒZ»#_ÆMÿ¨Œ,£.!^:‚ˆOÄm\<Å}¸EG=êÇœt²Alƒb)¹™äyÛep÷Ö°«OI4‹‹di¢G¢ôý }i¶Ûªùþ㬺µÖTúöÖoÿ–È)£9ÄoEt´.Ÿ.1v¥¯4ò¯%'ðòh!Ýjðtsºü€®êÃv­[4yÔ³ö:õ¿vûâQ!“â‡g·.Ú¶"„]‹¹Ü@þcàWéÎ@6/%D^ø7G†úŽÑÏÄ£á5drdr 5çÛ›‡™§âÖ/äñ¨ƒ ©RY,ì%ò Uâ¯8èBB|#ÖéÕ =­{6SdÜLEÂÆÓj×°õcRì*žàm4,xG¥v­¡}?ßL9På6ß<¸B¿\<Û{4ÊÒ¢¡BùËûWN'H’û½X˜Œ™ž$¼ª´ê¿<Û?ÕUԉ׊¥³Py Âc8­™6}¬½U·6ZÊßß>Î>%_à?N„ˆá#»h¡~”»ôí+9±t÷û4û\âæ%³< ‘/‹0‘çÏðrbf¬«úJ~ùdüFò~b%y~^ Ü– ÿvÄG±âOI_fý-{‚é±iÉL9"'yŠ»-—¥JÕÆÙqˆ¼ÛíZ³ÀoŒ {¾K3rö$gº|ùýŽ®VÁNZÖ1—oÇ;ìÑ®™Ê¯²‚;Üá Òà^2Û’‹îbM¶å<ébQã|µÁ&Ûž/ƒ‹s3O½£†™£,5+Àœä[WIÞëgðð€qv˜õ–óMlkîÇ?#Û.-ÑÂ|Ùìúwm­U§²ôÉ­´£»×aº †³ªK~–ÛÇUÚ"Øj< Z(÷oyUk¹üêÕ^Wõï'ï™Ä-+¦í9Ä»¼èT¹Œ¶ì kÃÑ•}:è€ï¹UÀˆYô‚>[6®ý­øqö…Ã;×.$êÙY¤…: ÆíSô°5Þ³52m* ×ýË|c+!·7/ÓAY^>¸zöÀvÒ §ÝÛBÊKòѱ4ÃÙZý.{r#E[¥²D8k±9k*~~yïj܈¾™­×‰Á굿¾Í¿™vtφ%s¦¸Iš›qËØlor˜áHX¨[.Ô?‘“ãºtlw4!öaD±aQYî]9¸uÕ<ÿ ޲oHš!ûbÚaÍÚ|E"Yën­ÓJ•~lWôÿ±I9w`K¤Â碼ëçïZG²6Œ¦Â§—pB ›—#_fpBhȬäÄÆµÊ¥ ÈÐHáÓs¾ÕYàLjªRšWT–>½sédBÌŠ¹~ã¬LÛhqˆ çšð@^uÔiä"_U4¦-%¹Û¹f¾„øû² £,Yçíˆ^8kò¨¡æôÔj@ya\6/»‰:?Å'¥ j„dôëÜ‚=4JŽˆúǶ^œóâñ¸MËC§µëOÊ+…1•GdéCž°çÉ͵Þðì\VÓ1#ú0#ž²ez~/#ùÀö¨pRÞÞÆÍÔøôRòV¾6}:ê‰Ðð ÊpJÜŒ±1BlÔ¼éøâáØÕyÙÀœ¥Áˆ–P!åï–—[ö¯‰òwéþyt ¹kÞÇ9fº‡aDyÌw.ŸsæN9¸—±.B¬¦B};³– ªýµ(÷jr" œÛ°Þ”ßRΛ„ÈY¸ŠJe¥$9sh8ti¥I!ÞL=BBÙ 3—ÏJ-^«›Þi&‡‘ö¿Y DªÔÑ]ÑOÄǬ¹õ2B™)sk–] ÔsŸê²t¶hvú›7Íf’œlƒì DÔž&ÓÚäƒ±Ñ ƒ¼GÛô51ÐPâî^¿8h²+;—_eHŽðçÃóœK˜D‹ƒh††~ûˆ4T#ØÆÃ€Ý»qyØtš_FÚª8ÄýèH¢;Ì%O˜«©À&W´%s¶îÎ%£Jm[)Güøœ]ⶨð™“\‡ -K!îY¿„:Ò¼ï ô)tžv=dXÆÓ6Zää®=@w1=”ƒÝmý®õKC|ÇÚèÞN»þŸ"ù¿ ŽLÛ4a£‘Âõ+yŽ5 زËÃçÛ ¶PcVœˆÛæx¹ 5勞®(…]ó®ub/D¢±i)¼Ì"ÛÄ–¯lÚžù2"ñŒtzãÚų§xØõ7mÛ¬Þï/8ÄÕà ¾ )ìš8ix §#¼`ÖYšè~̂ƵØ&V!*HÛ[ä\Ï‘ƒ{whÑHñkñãiÜ@SÜmúvn©ÎÔ+¨#! ™òlÒ’xõ€ wå…÷I#‚¼Ýl-»¶ÁDüð=N!ÂQêi¤]ï÷{².{Ö3aà´®TÍKì/dœ ! E>ä6ÖkXëË›Ç7RíÙ€æ2Шýµ8ïú¹C”ºqöýß ’ØHƒ§¸ÙH9–KŠô ôŒI®Ãûvi­U—¦CÆ™ S ×ÈÁfä4Ø&0È0ów #Ž"Xz^z¡£ÿ""G¾cöl¯«Vóó›G7RÁ÷e!¾cì CÜãPJlÞ4Æ»—<Á|£nÂzF²‡÷ñð€2Kˆœõý['º íÓÙ@³Îϲçw3Îì—)e‡æj8–Hý\®™]k!!´YÀÂ~À äˆ&úTÇ\°a›‡UwC`²e!ÚCÌ›ÔùÁ‹òž i„Q”w-%iïgƒ{aWAŸC9dˆ(>šÆ:1ïÔRCùÇ»‚»W8Ä™“0oÈR~ˆ¢&`ÚúÕCü_,²<D0d"ä\ÂT—#‚òxé¡X[Ëní´UkT¼f1߸ óÆ~€i[²Wò'Ø»€ŽÉ¶­žàéd-sÅ\| ‘÷uÃÚ¬C‹ÆJ•¥Ïr®œFˆ¤Ô’_‹eÓ* Q³ìVÎóï8 ;Þø³ìÙvKUˆÅ®ŸOÚÙä®÷çÓ«Üë"Fâ8‡= ¡Ä÷Ó‰[ ½ãè¶N£€ !ÆútëMêþÒÓžJôÅr ¹Ð]=õ)~+yzç2‡8k²ëp¹°¥±°ÿ:è5 ÿ†:PVh ×!GwQŽH ñí-ZäÈn“VZ*¿?"ÄóG(ÄéãH{ÿcØØSâǪ³•¬;(_…¨„ Àè=†ºjµ¾¾Eˆ§öo£GïkÒŠ>/<åò_†ÆŠn\T„f ,xÇR9âwj‚c{[jÖùõ¡ðá5)ÄñŽÖè  ¯a{“P&4íd2¿åã&F§åÚR R%uœv…/ÅOn_:•H!b‚á—HRbêâ7ÞÔ¼N%蘴sí" ¹áÕ'#Žè×U~®øÆÊ?Þ¿x•rd÷Æe˜`NÖ½Œ›»e_8²›êâýFµ>ß¿z–Æ&J'c×ãrDK Ö¡êÃæÕ¯Qñ&ÿVº¢›m¿®mš¨b©D‡PÏýù@ÂTÕR„øU!bÍ"Œã¾Ú•ïžß¿zîðî ËBý •fôÕÂû‘#bo•å\Áé¤#,§|Œjˆ?Eªþ”=ºyñä¾­«9DËn üoÌDœQf*;ê5T¨x…íÛ² Mñ¬žb“º„ˆ¾úVZp7ó\Ò.„8}‚3 õÚßP´ôì{É6«‡&¿Å~f®ÿ¤¡=´®n›S=‡!V¤Ù$ˆ_åÝH;‘°uu¸±m³úèɇ×R@š²Ô`D 5¤!2ÌOâi ø$!’ü!û/îAMJžådœ=´k=B;ê7Vú^úŒ= %'ýêAUßsSáG¹×ÀP9bSžÎg¾Ì½žzPÎ6GÎåœ Ù¸Ÿ™™|pQ<þÝlõ—pþo_>}pǺ¥!”EÌM埔߳‡vÒÓ‰º·Ó¯œ9»fa;3 z…€ª#j×ÿ[Ζuþh\̪œEa_ŠóA”„-+ç 2s{@Î/ qòv³mõ¡ðAµDÀÚ©þ-Mº~zìÚ%âsž²ød凋€O6“L`:uAøL’;6 ¨ Uˆ†(?(šz,åÈÞÍ+ÌœŒ,v‡VÖüòV"2¶{cä¼ÀÉ£‘E#݆ŠßJŸÝÍã×.™ã+²C-Db×Ù¤Zµ’ú]·8X˜±æ 1¯PƒÓ[×,šã;Î !b(þùôºqœJ@.P” þe[2Å2mI(ôé{©@\[…( é ËçNâñ£ïï î‘´QS £Jê+öå3ÄÓŽ˜z„øìDûäL’W/œ=u,‡ØDå¯L}£"dÒVú½±sí©ýÛ£¡®Õž®B¤·4’Þ²ln€—+‡ØH ®Ù}YžÑ<ض5ŒZˆ¶æ*)Ï™*DÊD%ñlDÐÔ±Žb½¿Eo]âXfO‘1c­]Nª1ËÇÝΪ‡U9“#:J~¬ŒFV¨ÿDW)Ä2ŒYÐDôEÍÖ*ZH µsÝb™B½E>ä åvI°ï8GTKsºìÅý¬”YSÆ8ê-B|“%’}ÈÚ̘KJ‡?‡nžYš¢ã¨[©èÃÓ±£¾d«ðÁµó~GÙXšŠ Y,I‰&‹ºÈšÝv˜š mm KîQsIˆ½;¶Ô€Ê¼|xý‚‡ƒâçb¼Uè¹ß6ÓšBX,ç$Q/ ýºµÕVUÀ§é@щÔê#uœ§ËpQéÇû‡4rÿ Ê¿®Ô§ c fÂóŸ8j<,‚ÿ\œ/GOˆš™WyÙiöÖ½;!D|ä è‰Á êLtÖu‘yß½›ÐÐ"xOúM›fõk|FÒ/U!JªðúÑ‹#‡õ35D¼™›v±”£æÅªxˆç‹æ #‡Z˜´nZŸË(C¦±ZS—=¾™n7Ь“‡øƒ;i ‡H?%‹LÖI>ô$™Ž±0‘s·Jÿ-$¶à‡Cûv3Ô¥,"Ä‹’ü’p /°ª,¿{YÅ(z™¦àáòÿ "p‰zu4ÐBˆoŸÂþÞC,æ¾PäNãÞ3Å#akIˆÒÉ@úK¤ÂY¤‚jqçJŸ®ítEo\€¨íï„pÜ ±¸*Ú·$˜2ÆÁÚ¬£ëÞ#¸Nyr©\ª )R׳CKñÙÝ«b1«ÂgùxØìeŒ6Mux7Úyïfñ; ¶Q€xó_DmÕš_KžÝÍìÚV§aí^æÝH?u`Ç:¦“˜Û‚¶œX1û=›(!ô¶úÿ úMpIñDͯ¥÷®Rˆ9ÄóGãé`Rª˜¯àÓqêJôÝiÂ¹Û è Dj*DOBl§£Vëä0KâÍôÓv®_>7àAÇŒ‡¦CÞµŠÖ!Ä< ‘hS<pM_SE ñX<ªIü"ã°PK¢<ÔRö:«í[4VþIN–©‘(O˜Í¤‡¯k«)¢Ðy7/>HQÐä@Q4AHŽÅÅ@Ã&a͉]·4Ìß‹´´½žºòÏ@¼xR Ræ¹ñ*ßæfkpˆ÷bÂVLnª›”å0!™ÜoKÑv:Ÿ$}êJ?©–„¸n)4[D%®°šb%‡x楞‹YE4Ѷ5 yDôܽ8„ÏGÑг¹UˆèÚîF9e·îŸŠ·Oïe?ž°-ÔèR]P6t Fº;Nà2Œ2&k F s¥½^cå_ÄûZò7­X0ËGRC©ÒßÎ[P¶iã‘“ní¨È!îÙµíOõªóûSÑãÛ*ŠŸÝͺp|å o³oCžXܨ™qhÌè˜Õ³}Ç9EÛê4TäHˆ^Äcâ}ù›ü;ßËd!® "/`aÒ¦Yî'ìvb¶Œ&qCMç<¤O—¶`†’„¸ŒÁÒà៊7Or*Š‘E/›4z·D] b…¶ä%‚äM8k ½ .—>ÌNcĹÒc-µ@›â§wË brҞͫġúò¡¾ctóÁzÃÊAL@š››´ÑnP ¨†èfQ$Åù"¾y*²ˆß Ç è Ä\$Eg+H‡ÆZ²!rþ o Nóέ›ñ]b BfQϯ%÷ s‘EqŽï1tˆ¿Ü‰Û…Vñ X¿|^ ·;æ!ÖüV‘#éÔª©ªÂ×ÒçžÜ½záxb,~1c2ÍÅÎâ÷ÄZ"®†u·2âu9¢;Téǹ7(‹1«A¶ £†[v—Óêò™ƒ4iáÜlÈ—¨qådÁàÑç¡Ï˜, é-ÌÍAˆûâ<$Éq¥]Ó~&­|úavGƒ® ÉNOŽÈé¥'¹£oPb0<%Vý£r2Ï‘ÍRíÆÊkÐÖ]GXý?*þøðêÑÕóÈ"~LÌBcŒ˜Ôô4:ØË‡†a‰B[{ºÚZñþ¢#hJÚýóãëÇéâ¢`¼ßV:Ñ—’"} héИœ”iÏQ6ý{ð¨ûR…(hjÑ3UéçÇ¢üóÈ"ýí0f ¹:u¹r–V§ªQUç:`Ú ëbI„IˆNt<~öÍ“3‡(Ä?$½1ˆj2¡²„§m¤ø}eølßñ0rÝ‘jB¼_…ˆhú °¤¼øé1qÖ4`?S#= è%Õ%å(&>M>4 ÷ hð Å“!îD+Q»CäŒô“Ø>CˆQ‹Bü½ÜìˆRÚrI§©ƒ¶s§C³¤GòkÑTí[Ð$â5¸@N ºôsp!ÒÛÅy0u îs§GWͲԠÇÂáO DèôTzÇNÛ³YôŸäfomn‚ú+QýQ—ÃÔé8&Z8šš_JÐTétÕƒdñhÕSøúîÅvqüÈá–=Œ[ÒJŸ?” K¢‚CÊ-èM”ífX ñ€@”=^¿æ·²B¢»ý sJ]ºþä.êÏ£sLnÒ—„Nöpܧ+Õ”* 7®"€§MTk~ÿR„ˆŸôì`ê|gCBH¶¥‹C&»; ² Þý‹8Û<µêÙÏתüðJ„HŸï.~vïZê ’·0™6óüÈ—ŽB½¡^ç· q×Fâé„Q6è÷VÍ(þøøZ„(û^ñu9ÂdD‹`xËÕ‹ê×¥-%o–!¢— 2zu÷jÿüT$BL )¸¹.ž:@ÄíÊS…\ÜB´þhÖ¤­n£ÑïÐ3°TùôF¢xÃÇ×ùw2SŽ‘¿©!¸ Œˆ9Ó!f{›´Ñb9e‡7aœ@“ð‹Îô‹_åŲˆŸ_K_@ÓQžŒãiìàÐdgÝ Çáð =¨ôK ž:Ä…xÕè<'X„hÖ z©å Éx‚S®£<ø\_„Ðáø“Õƒ§{!`‘às BtÜ×´½>dôÌ»uùìá¸-B°…¼’©Æjˆ6\F|ʈ» ‘JF$hÞ•(EˆübjéfÚN%; yërµ„â q3©õ$BìŠÚ"qïÅ!"ÄZß߃:çŽ&lÃÜã‘)óäH ãF¢À2"I5Äj¥¨‡sŠÛêP Þ<ȾxúÄÙÆ°’/;ðÀsgü?¥°Ð†üwã–MTkýøêˆA9_(—lJäƒõa3|Æ:³üˆQÔžŽ2”Ê.6¸îÄîça¸.¡Ð7;iª“±ÃZé"¡i"é5#: í×ݸeSjC„(ûkÑ“»Y©TnU’ã–bHÝ¿vá8žƒç±â½e¿Á»Êm˜™´EÙk|y÷"÷Ö•sGã·­…b)ì*;ôŒsGBüq6Š„ÄÓ„¸D=òTPˆòs\¿xšrÍ-L£‘-Í`bî:[: qËš%œaªYkmPð3B3‰G/A‘ÕæŽthèx,¯¢„xQ ÎáC,èÕ ¤®óç ‡ØÇ»³a0öâ#¬­ƒ¡­Ð-pù Ûø9ӽܨ»äˆ8Ñ!||)ñŠ:¹s*ðWÊ¢† ˆùòñØ´ý;…à‘eéÄŠ‰Cߺ C8{úD7{ð¸½>1MBDÑKçΜ¬¦z¨Ôø†›©¡«Þ0u¨.ó(/¨A{>4œSûwÌž6q´ý t†¾!Iˆ[£—Í›9u<4¤w—vzõ¾#‹ôÇûWùLêü¹X7‡¦¥q[¯çh»A„X¿Vå?ˆ³¦N5b yC=Íú5+bC¥ß`÷ÍËhi¶A, hަTéWHŽöÆÌòàjgmÑÕ¨E♤¸­k—ͧ_°6§_!|d±^Íï^?¹+'l h*#É#<̾Ü8“Ác†ÿ"n[‹|=])|J±âOÊâïÏÐî[ N⎠–Bäá0øÐOÉúc;AúÅÑZÐÑ$Äĸ hš'¥4k~‰‹žÈ²Â\pæNã—îÊ9ÌÆ53¨ {KÉbÄtB\·|Š€ªeñsiaÞíŒóDRdùl„©Ã¡o¤Ÿ&Cè3ÎET³^bü¶u‘ ˆX¤ІÊbå‡7OÁn¦ÎrJ³':’TÓà ô;’tJ ~`D<²}]d8ÈO ÚƒÚ°Î_5å?ñÑíÌ  ÎæÕ2!éÎbR=&UÇ´ ð¢zVOC Þâ‘øíëW„ÏÁ±‡ZöìÔZG½n :Á4à¥ä# Û×G†‘i°Š1D‡fc½ornÅ-V Ϭˆ€ˆx8 £ÆÖm¬¢ ôû B¼s5õäÁ=1Õº¾µ4mï÷ìý'3bg‰nEœ¨# ±ŒˆßQüŽC|pãòÙ£ûvlXÁu©štèð’é'â৪!nX¹0$@¼r\¿ÖïÏï Y©§ #ò†êÍ",µq/xR QEB¼tV†èÍUWµT¥ÏKuÑÛœ„ˇ‰d騞”}Ε ÃS¡Ì¬hCý& jAˆ9Yi§“ª±ß‚G/ú‹ð:ØúiÿÿˆÝÐ4jJñáÍ+)Ç÷ïuÂð+P¤i'Yùp„£/þİÔ¡ÖÝHv”Eˆ‚üLU1yªæä¿|©/úõø‘rµ RÑÇ´C+PüM£| ‰ñ([:zBÖ3…#ÀÎytྨB¼,!Î….¹Ú FÅâ5hH¼`*F9Ù1Ôd‡&ùôžŠ î Du QÔ“#á_J¯C3Ο8°;fÍÒy³XçÄ(Qdá—[?/„Äî„X—Cv‘¤” É ëã»±:­¬¤ ôµìå#>4kæ´ SªLŽH¥PP6dÅ9ă{ÀîùAÓªD ƒâ-}ùìže0VH1âÇ/%Db1å‡Ã“ èoÒ®…V„ˆ^bÈxJ*MºÿDæCØ+ù€ \Î*D®h bý=œÐ†] õ›¨!DhÄV°{ÎôI‚Ã:4ÈÉcСi€“wÇëFX3A X2D§ƒäNòp> wW£–M^KOM‰TLª O 1Àqhiuñ&D ScPNB¼IˆÈ‚ñ›‡Þµiõ"±$X¢Uõsoe¦žJŠÝ° \†z:ÃóF-›!DŠšò@rT]OÅì$&s+AWÈb$ÄÓ@ܸjñ\Ô•Ž`Þ…CˆèK?Á®T‘…Æ£ÌoÂBy¢Á1äÞâá„Ø«!gÓ¨pD×V:qKmÙ£“êò©øy®˜=èÎÐ@oÞ- €œ¨jˆW ¼d^Ðt„DMÓ¡µ.B¤¶ëbk-¢‘ñɽë2Ã0ÇlRßî(¦”zøˆiPÖ`3‰Æ¶µîŠ7GˆÐ®”7ÔEØá „…[®Bl(ó‘ÈGiCLhP\Bä®$ê +U*«.Ï9P«^çñ®öC‰pUˆw$D1n”Ý`¢x Ñw¢»(½>×d¼{½Ê%Á …Ëâÿ f]L>š¸+f Ä'ÀGþ{>"F4ê×úYþ˜I ¶UŒ H<ö¸ÿ1zyx0¥¬´!Vk°oò1'îÂ~ã­ÿ+âî-k!>hìÑÌ×öÕRÐVOKµö¯Ï¥ÿál ;µáý‹x-ýì±ý‘Ûp”ĸ5BôrÇŒÀß¡¿T0T…ç#¯< ÆŠ×Êß¾x”È{¶BºBgðA‰m¢È)ªÔDM u!;|há[FЦ¥:p-â' ñø ru©iˆmgJýClo\¯Öò’î@kùЈá3cvTC¼tˆÔuahCPœÙÎß§:-þ~«6’xl²k$·3f$ü/âu „Ô@*¨ Å+ 9ÚÜ>õ©.DƳ4+èÐbâÒ~&B+øøîõK)'îÝ9CcO¦D[öêbD!Ê^Aô+T*N~hÉ`{ü±ˆ—É]½mÆØéoÖµ=BäoÛÔùMu¹O~Fæ¤YÙ¤ÏQšZ4‘#f_N9y(r¶t>ïÝ͘ÿ4#¥TW©ù£œÒâa›!ùB1ù”Uˆ%Œˆa ñY€6dŠ››vàI2´@¯ï‹¤‡éƒ1ì]µ¸ÿÄ{ÙWΟLŠß±iÍ2´á” nŽÃXtïÈ¡"DPçg×öš-$Zl>îND·Nm Qóïݸ‚Ñ•°c3¤"$pª'>1ï”gG --ÓQ(óFÙ¡Ù{íñçåˆå%/âá„›£—SNäL÷ìì0íéÀÔy÷ u!2 § ¹^*ÜÐdÿ"Þ¿‘qáôá};c¢#†RÓ€±è| Q´–B¥ÔZ$Q<ÏÄÈ5Ë!Zü1õô‘}»bÖ®X6s(BšuAˆÐ ] ¦Յƺ4„¥yÆ~½&òÄŽ2ÄÒ—OîßÌH=s$q×–u+Í5}ÒX"dïntr„v£¥‰µÜ«°pÁÂpõaZçïhQIøC f¦ž@B*І~“¡ÉCA¢¦*¨óáMA®|É|Ya}2W`Û?ˆ¯ž<¸•™væèþÝ[ׯ\<M§ô%ÉkÖH¥&Q‡ë2¢UÅ„t­µ~Šwl«W ñjZ2R6ô÷!B‚>½»uhÝ\³Ò_¢N^Ž\–Ãe‡–&äwWB4eDd¨¢ôÕS ^L>9Û@m0ÅÓ ”íÛ!¶l¦®Rëççw¯Ÿ>@®Ù&À¢Ñ¡mÈÊÀé(ÿýJˆæUˆï^=}xûêųÇìÝŽÆ^Lw¶}(D­ÊYç%}b Á‡–Û‚Ïh.«ÿ"f]<{â³1j5ÍDôáëÕúÕyöë"›—ò™« îüø4ʾ ±&_b:$7.vÓj_/ô¡Õ”!ÊÔ¨Ôú“Ây8WYùoþâ³Ü;@"ÄbL_P‡\uè–ÒŠU0r„ ±‘ è+C„Tp.`BRù(D]ábhžƒŒl‚‹­¬d©ìõÓÿ ’KˆÜ4LHÐg B„F¼x|¨A†HÄOt—™! â ¥ˆ›Êé™Ôdnl¢8ô±!·ˆÿ訨e4|…c%•P¯‹qYúâŽ"rv€Ú(B‚>ƒ(Ä·…ù¬ð’z’-+sbMÔ”Ù^=tþ‘SO#©à¦™…}ËC$úSCñ¤ô”ì%©»4#ñYK3 ¶ D.&¸J⃧@qrŠ'è3ä÷Wb¦cvElR«{  œêˆDz „#©@Ó¬\ B2}†"D9û¹ŸhPzÉÍb“†²•í?ˆDÉGnYŠúzA}†I!rø{‰ ‚Yß1øÐÄÍ5…aƒº;Ù’!ÖˆO€qÈB™1mÔg¸,Ä ²å9)YAm™º—ý/"Êùò 8Œì¦6\ Ÿ9m2Ôdžßu‹C¬cvŸÿqñ@ì'GüóícÉKtŵKHVâîm¢–!½'¸9Û¾{«úSŒIžö|hj(æ˜&!ªâ§HÁk$‰{¶â ÃHÏÜGŽ'X®Å¤îX¯Ìº°”û+Fì*k ÄÜ;ÈÖé£û÷n'ŠÏeú¸Ø!Ä^LIÉ_Á¼TJæÅñÄïŸJ_=Ë͹NOØ»9šIôeO!f ÈÅ]ŒfZ‹œ´“V@ ±-ë3âëg”®Ô3Ô† 8IôquàSéEbìòAk¦’Çî­ÌT9b3 þý^Nˆw³I*Ð41ëV‚DŸÑŽ"D&•¤í4-`_Ä¡k’ #7{ÞÑÆúD*)ä,-ù8š!‰>nβÈ÷2uª¦n7>4yb±¯A§äˆJ+ËÁc$¤âÄ¡P„dú¸¼Kâ½l§á^ºñ¡ó ‡ÁI&Ä^ŒØ˜ÑÏÝ»™‰Æ¦‡‰D[žÜMDÙÐ…=ÆrE‡®à) 5v¨ŽXƒßC÷ž£¦Ù¶1j9ÓÅe$Í 1¢ŒÙ`QÃHËÕË âÐz:saM$ÓÅFˆ¨‰&¨#Õ&ÐÄ=]¿¶°´ì¯†¨ªTã!·ÐاŽ`ÒlŠ^±xèƒbËBÜ zua牀ý“‡»c¢>•küÀx}A<¹tžš„„B‚>(6e‘BE5«0t°«1_åÕv+ ö•#*"þà65öÑq; ¹K@*6çA.“…êW)M “Ã>õ_DX€âBÈÙµË(¢1 $èCÅ! Y—¹²‰âÐdêÈÊbbØ(µ5Èw®s@qô¡bŸãQüT"cûVºÒ¡Å"„I^ ±#¾}IâÄã 8Iô¡bŸ©jKž¼ct’ ÃktR|uÄ:5%Äœì 4M’èÃÅ!B0iÞBÇFˆù$w`Â`ý‹øëëÇ’39"ч‹=ájŠêÂd‡¦]6«dxƒÿ R‘IM“H„Åöñ/—x¤ÝXãNíô›É=Û=ØyÿDðgB.¡bO™È!®Z"¤h4×…ÈXe;ÙmÀ¨Ê[jkªÕ­õû$·R!d)ÛK$•ʄ»Ø`2èh ÓÈKóªF‹Õ6 ±]K¹iч‹=I 3Ý¡–¶ì–Úò¼“}ƒ—èÝ[íþ‹HâCMßÉô¡bOug&uöéiÒ¾Ùýêî†@ì(!þˆ¢h"$Á ØÓ½cEÿpG: ~éÔdTU¢QòJlj'È0b7Fl¨¢Hˆo¸±™â”;ÐGõóÙ*Q“”MÈ´1[D>´dÚxòV!j1"ËÙj"$èCZ:ËÊæµR‹cBØ µB]˜Œ°¾âÐðû§Ùý‹ø—$—›(N„Œe ° €©H¨è„(|© M»O²CŸd»a7TBÔbm ’øPÓ€â $ ­˜;;ÐW"&»¡D]hcùUuhöîQ2D Ö"ÉMB2}¸Ø3¦I5‡š“ëÍu!qìÓø¬òXÕÕ«M"©MB2}¨Ø3§s:9D¢pÏ.Tal„ù’o§UˆMÕàù ñAÞ¼ Š;Èô¡bÏòCGËBÜß¼;úE|«Éë…ÌûÂ׬YNˆfÝ:Jˆ3467 ’Ô‡°„`e!ÊT_Ìc:´XªhhÈ›7iTŸ!Ð4—/$'úP±#Âf.¤ò D°Ô11¢º€Œ2ÇyIZwW-ˆ6Eá'Äçu5 (~" ô¡bãÀ3˜æž£hxš9H¬ ú4êdÛÅò2ÄV„¨¬9+}ýüñƒÛׯ!‰>뉈Á3ÑÑÑM ±}k® %¶ªl²¶“ɪBlª®ª üTZôœš&#·sˆ5‘‹ç‡ÌbÙ!ö¦3é²²|eãN6ûq‡Ìïˆÿ ’ø¼È§¦!A.6ˆDŠÆ!‚Ý N‹jŽá~ÕgY ±±jš¿¿‘T ™êE!B#x*ÉŸçÙöãlahµ¨†¨Ñ ®âˆÚðѽ[×.C!‹b£C½'x¸Pˆh@#¢N}jY*ÉwÑ--T³bgFT« DcSÓ€â äÒŠÔ‡a^cE¥" ¾pÄéç$k¹[‰±!¹ ´!Q yêèÁx¥Y8w‚»,Äö”!Ø®__>J–†uœLÑœÀ*Dm ÖþûRAMÄ$õA±QšEóƺ:ÉB”i©˜ ´—²}…å'? Ä~@lDM Öøñ…Ú0Ÿ ÉôA±QšÅ ÜGÚ·Fˆ&íÁn¦ŽÜ-\”-̪ ± ñâŠÒ"¢ø ($èƒbSi–„»:ÙÊC”¤¬À¹N‡–­SÁ3| ±7!ê"‰Ï'jšÜ»¤É\l*ÍÒˆ‘öÃd!"?u©df쯥ئ2bwBÄ0"5ö¦xèCÅ–Jãh;ÄŠB””TAh³d㒤݇¶)hˆôÁ_ßʹi@È+iTlYiìbo"ØMÄsXØa2ØÃ¨É¢±@T&©(+Åï}RN¡ØRil[õé)B” )ê":NZT`¨eˆh,ˆ6|ûJ†xšŠ½#†J#Ïs¢ÚNcïZe«u›¨“œ1b’è#ŠM¥ÔßB„X¥£ÏÙ ËÅ[E(mÿA¬õmX„}dŦҀdRˆä=ª¦p53L}ò¸ÿ'¢¬ØT ±C;‘…¹Œ„™†Ç?Kœ›@ìbLŸ…œ¡±¿0Ås}D±©4}ÿéÂy³sÝ"6qì%ŒØ£K‡ÿ"JôáÒÄRטË>¤*×eª‹Ü¯K äx7 ZšW!R ŠßÅæÒP×ôÂèh]­U_‹ºH6“¼Œ0Z®ÕIÎ$DAH.6•]³º{Y%¡—Ü‘8ôúªË9b+=øKPœéCŦҠk¢ä!*ÑKKyKC•–ï¸î#eˆ†ŒXO´!’éƒb£4èš5Õé šàž0G‡ª/{XL"¨ DŸ_Lq¢M]³eC4>Qâ;bƒ4Óp¥e+®«#|¸„ÈŸç6$B}PlêÃĽÄñömªË]u_ÔåpbõCà ’¤˜S{Q’¸±‰â}Plôáþ8â¸<ÑÈ$P]Ècn‡æ›&;"¥¤‚B!%ú¤ŸGˆ'ŽCœª5•˜mT—qR¥e¸"ćž Š#Ї‹M¥!Žƒ9ÕCÌ"<©jCaî8 ":–¨D Ô4LHЇ;›JC¯:‚lXÒ:qTfÕçó yj9¢8ÚA€¡Y—©“‰ãºh©j!V™ؘÕâÐÌ!2DèJ‰Æ®ñ“ úP±©4‡÷ÇÁÔ­š4eV™·•|hæŽÍ`FìEˆ GŠ¿Ëô¡bŸ?ƒ®!ŽK¯CˆÒиÂu!#ÍÜ–;·GG4mŒÔ3ÅK^}¨³¹4àøV [FVIYácùÐP 4 í ¢)!r1•~ÿüésÿN¶Tp|[#ªZ5Éê"y`ì¢^Ä!V2Dã¶LŠƒù¦ðÙ#*¶( 8¾^ö«*Dt( 4hT¤thpÇf¥Ý°AýûHˆÍ4¨ ÿT~ù(èƒÎF¢4àxlý:µdÄâÓÅ ¤aNû†Á>ÖˆV} ø $Ä8z®øU¥ ã;êRÍ*¨fù¹U†cç6á.ƒªlº@ÄèBßRcS$ $Ñ'÷Þ-*ÍÙ“Äñ²à‘ŽûU“7v‹ðÔ8ôÄ1ÄþævÃ"I®¶–”~¢}ˆÒÇw1Q«…xNª‹Ø$§qÃÀö–#’œ‘)ú½ b‹Òp"¤Š‰†Gˆ'’¸.bë¯Ö„Ø×¬;‰x jlJ* ú Ø()u 'É÷RÖ¿& ==–¦•EOFìMˆô(B"2Î¥áDJïy*²øµÄžÌ‡&î˜wˆ=ºt$ñ¡6Tâã¡Õ 0QNd¥Œ97ÙV3Ô¡èéIãÝFbÀ/Û <@ ’T4&Š£¦P.6—†¹?eAo"¹·EˆU^užìÐÂùKˆ]‘š†IôVH¥Ia±øL´'ã,òø‘zØl¢7VTNd¢ô¹|Ьu ™åO•f£‹Éˆ H*Іõ‰LŸBîÃk"‘û¹ü²Î$Þ+«ËœÓqèÑNXi ®†ˆÆÖ$ŠS·}Ŧ҈DxW\ÕF¢dÙ¨.¾th4Œ9B{FìFˆÔ†‚²b£4R"çIŽª&ÅÖ¢.³ü§xÑ¡Åelo3d !²ThkA¨AHj`„Ä¥‘%eɧ˜3ÒeóÖ…ê"J‹]ˈ-"µ!(N ù…êÀ¥‘'ò•¼öB1Ù°¡.ÕÍû#ÒX DAñš O¹(MµDòÿþyù_Cu¥CêKfÜVB4e©Ð!Š}¾UC”)e•à¥×­¦ºPzއæõ¤bkʼn>Tl D$R¤àŠLbôJÔ…É8Þ}”£-š®Pþ‹H„”Š-+H¤<B.á­¢"eu‘mÑ“|°½ÍPëþHjlÑ4±ZiD"¥º‹–Dˆ£W-C¿P]ª Ûªï`[±RA*¶¬4”È“ÕÊÎ!®Z±ý‚ºàÐ2l¶fì¬ÿâ?Å®Jä)9ÙËB\¾ý‚º šɨ6—#Ц„üóCVy"OWqŒ…¸4:æ?•ÈXuè–ºŒHr&C”›K#Oä™›òç×Rˆa³Q‡†&òR¦¯DqB”R›K#1ò|r6ÿ÷ßCfø‚Œ£ÉGüíØyŒ^Up !jXŒÄ*¢Œ[Á…Î×Z–*"ÕîŶ@ki "¢ˆKbŒ»Qcbb\YD,« [élí´#ÜÖ²>Ïûžs¿s¿{Ï=çÞ¹3ßùzÿ1àð›÷=ïsÎ=w´é}¦Í;æC*šMc†-£‘ŒcýÐîÚëî°ÇîRây_Btd.K曯Kù†RÑllH6GÃŒc!1ã~žå Âe@KDº?sç‚0bOÛ¦÷š7¢>q‡ÍÑ ãXH¬à×ßʱ¸%"ÝŸ>õ¤W._º@¯µïÒ¯²ù倔M#ä°Íht!±„7ýáæµf,?ævA‰H÷é'c.ËÏ?æƒÎ0D¹² H‰†mF# ‰Üܼ–=s,?ùá÷¾u KDºÎï¹½U¾óTäÆfÄm|0lŒ—…”ü äè%þà;I‰ˆæ‚0y¨mz¯=æÏÅ‹†G6 Éø`Ø:dœ )ù¹îš«d,n‰ˆæ‚x¸NZ>ˬˆmˆˆ3:l 2Î…d~n¾–Q”±h‰Ø€§ :2\ÆôâÍO”ù¸à8Ómˆ@">¶ìCh\È‘!æçôŒ±09K‰g³DDsáç¯4-…‚ˆ›G eØØ‡O=ÎŒsk3?·²gŒɹèÂóQâY,q劥œËáÛ¦ñù»€"Ž l÷í@ÊéƒÍÑp!¹µ™Ÿ?^q)¢ˆ±|óâ¯]€w*J<žûaœc¿6ðý²à#þ þlC $âóŠ]d>ñèCÿ’…d~nCÏØ- JÄŽþÌRⱋôõÌ‹“ù²TûÝ3$¯ÛK†ÍÑ0ã²’öü£ï39,QÍe.Ûk7? ÈkáàYÜ4H[ö!G£ )ùù9{þî7‘)«¸†%Îã\ÌG›~b‰È£B">}ž>¯Ú•£á»‡ù¹çŽŸ1Š ’cJ\}ŽÚöý“7Z~;ªxˆŠ ¤[F# ù—-ÌϺ;*=_ü5&GK\¥Ñ‘¹8_/ >Ê#—›g|dØÜ5È8/äçÞ»LÏ’["¢Ãý¢±}ÍWàBŠÜØŒ8OÈi¯ÙÓŒÆ.$ó³þÌùÛß±|áìv‰su.¾ã-¦é^‘ÇÙûqR†}È ‰DnÁùӿ篜ûù³ÎpJ”ûƒÞìô“m!qnlˆ $â#ÃÆh$ãØÚÁ;m³ç‹.äXÎ>ó4d±]¢sçæ‡êÂy<Î妑@ê°1dÜ,$ÏŸÁõßý–ôüås?wÖ§"‹n‰è×ÿ„°Ã "bcKĶŽçÖþ›l›þo³çó¿Â±œv2¶‹–¨äö‚ÌKü¢y8ΰ±q‰†}ˆÑÈBbkÿ]¶Í猞9–SOÂva‰î}doÓô6Š8*°iHÄÃÆ1ÎÑ ãL$ÛÆ¶¼ä"Óó§?uò'°£QâGŽ6%ê‹Ù|.‘ˈ#ˆ‡ÍÑ ã²ÿÑm3ôuÎù‹ç|c9i v´-Q/ûÚïŒçŸYÄ’Ûg|8lŽïIä#ÿÕm3Œý,=s,«±£ËéHÇe¯eˆ8|¸iH6GƒÍ,äCºm6\øUí™cYuܲ%Z¢{c2_©¹±%ˆ‡-£1 )mcÛl¼à<ÎùÌÓO9‰É9vQòÊ;ÀÞ_©W‹q@Ê6”@ʰ¹5ãÏ=­m?xÿè&çôü©O~‚ÉA‰rf1tæ+C.uxá-æáó~nšƒ$>ûñµf iÚF‘XDöŒ Íä,rÞ¡<¥i½CäÆ>T©ÃÖÑp!mÛØÛ_>×ô¼šÉiÔæ¾d/ðO>&¢lÏ›íh¸IÛØÛìùôSÑ3ƲÔì]¾”ßñV{qЦ5¢Dü@;l]È­(mË"žŒž1–Åöí¤°ôÁ9| Úøp4&ãv!¥mYDö̱̓•jßä&¢ßAáÿk"þ^¶ìÃW§RÚ>ëLí»Ew…-Q^ {¶?1¬Èø¼[EŽ&µ2mMÏésŸ‘ÝÛŸA)ñ;³¦m™¶.¢öÜ>®ô¼—ó=ðï% çKÄå„tD·m™¶YDéYw™ójÒ‹±~Wéh uØf4mÛòSdµg9õYÁÛõ/s±ß~1µÚ6CþwYÄs'Éåòµ§\¾ž×/^“ø´GcRÚfÈÿÁ$ڞͮñöö-d'mßKÙˆ‹˜YH¶Í½ýÏ5XDÛózBK‰¼Íífnsò mƶYHÉÛ–H®æ"ºÉxWûMgî°OÊg¾ˆI|ìht!mÛÉUÇsE7çÊ4¹1p.ÚôͯMFiÚ–Hb*XDw…ÌùÌåRü”~å»X1¿WG# Éü˜¶%’+–-Mµs@òžã›Sî›ò½E–F:1¿XFÃ…d~´m‰ä2í&]þj¹·ë-›@fÀdm¤ùÍv!µm„\fÃføƒéœé1%ï$~[ðOfµ¹8Ò 5›áÖ–¶r™ü\G(´D¾7åÚ®_T[‚ÌÚøH3f!ñË¥mìmÎæ±…ü1,¢³ÞÉIj.ròA¾Éëm~Ô,$òcÚælŸÏ©ØåNJ”ÝúrûÀ¦G–ɦ9Z¹Ù5XHÍi›³ÙúQ™Š³6Îaÿ’óõ³A2a⣣х”ü˜¶e68L90}2ëíãqýxÞ4Lqžùõ³u×èB&m3’˜ÍÑGq­“>LÄô<±—Wù.]&×T !ŒFRò£m3’˜ÍQàÂ$mLO•øìSíÈå&g2lYHm{×Ílš.’}eß<–¶ºdâv­CÛÖÙ @/ ˆ©ØòyØíœºcÞ§8N".ÃÖѼ‡[…ȇW"÷ ‹Døgp=4ýú®”+‚ÞƒyÅä îþD‰YHÛ6Nr[¤€ø÷nøÍûÜ^ƒùe×íxk|d4s’y¢m„Ü̆)±JB`x}ÛïÑ{î¸í8R†-£™Ý^´îd6,RÀä÷8ç{»Dþ©àO<~9ã#Ã6— ©ë…#Mf#E ˆ1ëê2Tz¼›‹?yøç°ÛoÅ{ñÁ°1šÃÌF{g»®‹ÜÑ‚&S²•^Ð J”¹ ŒwÜvËñ&>6FsH’c¶¡¾–K&EäBÈ´t'Éán®ÀRâ:4}3DÄ‡ÃÆht!mL0Õ×›¡ÈýS¿"9Ûõ*¨%®gÓ7ž°BâcF£–i[{”¡È7ï÷&Û;s›Þ¥D™ ÿNyà  ›»æp=`´mlŽ7꾑"§«ÏÒ8é íÑö*®_‡oZ{‚ÆÇކ yPf¬Ùe§›÷ïèN‰·Ýrã(ʰ9YHæGCnNä"bμjÈç“”hærÃõ+H3YHæÇ´­Äé‚zó¦Á¯'S¢Ì妵¿_i†-£Ñ…ÔSÆD2ôwS¯Gô,ÉùÛƒ(Q¢#M_'"wö\³’¶­‘LŠTXÇÌ3ýíç¢[â ×ÿn•ÄÇŒ ‰3RÚžaÚ¶EîfA=·qÎìù}p‹–¨s¹îÚU2ŠÉB&ÓÞ¿]äž»ëÜI|šsÆ'Ærßæ‘a¦[æò»ßªÈ…ÌE”ž‘-ÑÁ\®¼|õªœ…œÝJ)ÃÙq»”žYâZ"ærÅe'º£qÛvŠ”áìð’€ÿP‘ÛoÇ‚Íß\yù¥"v´mf“‰á¼áõ/½øÂ¶Ðô|ïÝI‰W_qÙ¯ Ú…LÚ6³IÆáì³÷‹Ïo{±øˆ¢g$Û…%r.—þòD]HÛvR$3)ÃáÛ .¢ö|÷·k‰ˆÎå¿úňf!MÛ: )R†Ã™<¹Õ´œ€ècÁŽ6%^öËŸ¯Y­£Ñ…Ô¶e6N‘2.áÖǰÝóíØÑR"æò‹Ÿ­9ÑìšÅ ¶m€P$v·ô}¿>[Üç¾öóçä™3ç}æ™-Ï,}ZúôÉ3“O,ØgLj>ÐGK‰1àhGÓ…b舳óľ”vŠy%1hZÅX°šXަÁ8Ñ抳bDÌ–XA €£EMçŠ!°´ ž¬è}bþ2:b8šW¢WŒ7—£À\±•/Æ€qâL½`ºÄÍM§Åè﹪XV=`"Î.+‚›Ã%fDÌô\E €åE舡eL‹A°¬qV„˜}b¦Ä1Ì[^1 ÜTYô€Ž˜i:#zÁT‰›ÂËhÅH0^Lþž«Š%fÅÌ2æˆ>0%fJ, Á*b1XALõ‹YpS'è øÌX°´è½¢¯é™q‹XZŒË‰~0#,£Wô€¥D‰XFôƒEbË/F‚#Ñb,8âkz¢Å°šè‹Ä¾1v–8’+ˆàH°é¬è«Š)0[byÑÖ"æ€#žÁxÅ`‰eÅ08âiÚ#F€åÄ4èMûÅ|°”XVÓ ¯Äb$/i1,)º`UÑ_âÆj¢¬(ã :`´Xº¢Ši0RÌ‚^±¬ €ÕÄ4˜-q¬b¶ÄÒb°Ä²bܘ zÅ"°~qc1¦ÄRbØ]1̰-v€aÑSb"Æ‚•Å4X¿è€UE‰ÅpE ŠE`bÜPE,,±ŠX 6B €¹¢ fÄÐ+zK ‰°´,±¬X Ö/n(/F”XNŒÇML^1 ,#v‚õ‹ù` 1²Ä1ˆ0OL‰ë7¤Å'zK¬KlƒUE‰5‰XQ,(±šXŽ“˜Ãb!Ø ±¬_LƒÄ@‰åÅ8 O%±°ÄN1Ö/—C`i1fK«˜-±œ,qìb8œ Ĩˈq`WÅ0X¿8\N ƒõ‹ÃF €~ÑSbâðXE_‰ ½`U1Ö/&àp''”X—ØÃb_ŽXTbCÄB°b1Ø1N€˜;Å,X¿˜K‹Y°~±,+fÁ1Š`·Å°Ëb˜‡Æ(fK,#æ€õ‹9` 1›Ö/MÌ‚“AÊŠYÐ/fÁúÅ¡±‰Y°q¢Œû&HÌë‡Æ$æ€M À¦ˆE`CÄ<°~qh,bØ016VtÀòbX æã-Áîˆ}Ž».æ‚ccÀ.‹Q`wÅ|°~±,!æƒcÁæ‰Y°KbŸW̧¾˜6Ļº˜6IÌ;DXF¬.惱b_ÅÁêb>Ø(Ñ6Fô€õ‹ƒ =`ýâ`eÑ–ûÆWôõ‹ƒUE8ÄÁª¢l»'öÍ €õ‹ƒE/Ø1ì²vWôƒ•ľØKˆ~°1b,Ø+bì±ì ±l ˜{AÌ‚= æ€MóÀ)/æ‚S]Ì%zÀ©-úÀ‰^°9¢œÂbرœ²b!Ø ±¬_(/ƒ`ýâ@i1NM1 v] õ‹eÅØ1äƒ8PR y Cœ»)†¸ÁI!ô¢8Ћâ@/Š“W,"'Zlƒ=$:`ïˆ.Ø3b ì1 6Rì{Cì'¡X@Æ‚½ fÁƉ9àÔóÀ†‰¹àTóÁF‰°Sô““Qô ½`sD?رœºb˜½ä¸Š…`3Äb°bl‚ †¼ }d,Øu1¤ñ)%†0yº+†,}º*†(óL„è!cÁx1%Ïv±§Å|2%Ïv±·Å\2%ÏvqR‰ydJžíâäsÈ”<ÛÅI&fÉ”<ÛÅñ3dJžI öO ØI†$ûÔ.öo‹É¥O/ŠýÅbš aòL±âÅÒøÔ.öwCtÉ70bwÄV ±¿ÅþH±Õ=±¿‹b«[b ‹­îˆØ±]pªˆ­˜»$¶ŠÅ4ØH±Œ[*v‚‘bË+fÀî‰-˜»(¶bÁ¦‰yà˜Ä\°Yb>8Ñ6Iô•E/XUôƒ ÀjbXI,«ˆÅ`1–C`i1ä•C\Y1¤ñ AÉ –C–>!(y"½bJž”à¡ûöîðÛo6nX»zå²% çÏ™5½~Ý: V«R©Bù²¥K/Vä“ |”/Oî\9²}%SÆ÷Ó¥M2E²¤‰ýðý[7¯_»rù¢aàw;¶mÙ¼iƒº8sZýzujÕ¬Q­JåŠ –*Q¬HáB?R'3eHŸ.Mª”É“%I|‡"䘿Ýôõúµ«W‹sg͘ڠ^Ú V­\ц 'óçËó¡u2}ÚÔ7G|åÒÅóh“H1¯[³’]œ3sú”õêÖ®‰D"ìr&lq2—qÒÆ )…çÏú3\\e]œ6¹”‰4aKmØÉìd1Å"bOY M"Ŭ.NÔK#‰”°Q›‚å3™”¸)•WÈÁsgOŸ:qü¨mÌÆÅÙ3¦M™Ø°>'Rôƒ°¥6ê¤;UŠK%bP’(..Y$.NžÐЗÈòeË”*Áµ1NRq(îtiR§$ñ‰c¤CRU|1'o$‰´asmŒ“¹ÙIwjð(âcG< %ÑÆ¬.Ž#"+҄͵ñ;iâN9xäðÁû(I4.Îb¿j¤‰äj›ÚX'¹8ˆHðŽSÄ÷ï ÚC9ܶ…ªâ‹™\œ8nlc›H »…mÌŸ×q#•Ä#÷£SHI´1³‹¾úD“H ÛÔÆ8éÅTïGL¶@J¢ßÅñcÇ4¶‰”°ƒ9Éq£ÞH%ó8bnU Ǭ.Žûrt“H6Õ†¤$qS*3eGLÀÍD9fÏÅQM$‘¾°ÕI.â–êÞ.JáÖoHI”˜‹#›p"5lã$iRãæêd¶­ÈI Û:)Åa¤I%`.YÌîÏN²@ª3•åó>½[IØÖÉZìd•#ÙMÁ‘žƒÁ€(KßÞ½ZÉDŸ“Õ¤muб›‚ƒ{̳Àq¢Ì’D”¥Oïž­­“ “<Õªx©,YB"ŸG8¸žçà8ñÀ!ƒ(f¸ØC‰©NzHIæònÖL럎1@‰¹O¯žÝÛ´žÉàH“ÌYŒƒ{~Þ—> ÄÜ£[›àN†@J2‹p–(1wïÚ68Ä@¤I&Óžq„=œ€ƒH1wë‚hT$'³TÉ©S¦ÎøgT ’H1wíܶM˜q¤‰0¢Îò‚)æ.> p24¤‰œh‚C¼àyR©*vëÒ¹#ƒ;¸‰œ` ±{ D»vîÔñ3ÏI_Ü>¤u“aäá,O(3%±K§ŽÚ:ˆ¤Š[7¿$˜Á!^ðŒƒ&‡=)‰;vhßÎ:©q›Tú‘äæèÑÝžuP€Hb'Û““Áâö¼4õ!æÈ‘ #ïgx~ %1['MÜÁ’Lf5œh‚c;è)‰í?kÛžœôÇ­È:Ò=R *• 5”h‚ÿØA?°]Û6ø?^qB ÅMf2j°ÐÈ=áyvfàgmZwh·H‰œÝD: b–ÐôW^ °mëV“·ÙÀ"-ó ¶†Fù3Û´nÙ±ƒUM¥ H9‡^£¿X?CëÛ‡yä`°U‹Ž5nƒ4¹´‘[æçÖ˜F8摃~`Ë:š¸M*ÅK\B§tö![o¢Žyä ØœþÎK¥zÉHv“B§|öfëÕ‹aǼÎBÐùй“w ’#&ÅÞÓX²îÇ<[\Óxär¤¹2ëv÷¬[7Áu øÃvÜt‰©KÍ•Y¯«ÏºÍû“þÑФqþ<$ë’#—Й (] ‰aŒ3<ß`hÜȦ‚sa&rÐŽ<ëØ‘þpì†×<»ºzHó[Kä>& v°öDk§S£¿ãÑWJs˜Uù>&Ç(Q[·nhLóòÓÄžÎVY)‘û™Ú²e+²Öbü×-}qèx©ÛÝCs³ñÁ@›ãÿµhé·×ÌJWµ´S×@¤ç§âO7ÅmÞܢ寚5 -ÚÜð¶EC2Û´¶TTÙ$®5ú[Q‚i-Ö èzã¦e¨P5‚†7kjþ¿«7ùjÕò‰ßÍí}P¦¶iРaÃFd=kÔÈ4”o:×”I×½›¯@Ê4PÁÖ«_¿~² Jh2IêÖ1L<¿›ÂìØA=lºuñçê Wþ¾ž™ æ0Ö,nªŸ>¨pkׯ,¯ËXCfÏNËãÓ]†|àL ,kÖ¬U«6c‰ëY>4,_ ½{…Êìb‡ `®QãÓO‰JX×1°Ú|Z Ÿö`ó1-´‹ÎV²jÕ«TÂþ'åU­jO8i¡B53»sç*U«VcªÁz†¿ŽyôÍÅǯŸ©ÐnÞ™BV©re,qÅèo€c}ÄÙ3ÝæS¡BUp׊+U”©Œ%rukŒ#^åJ}û0j°¹|… €2–°>«Ê8ùîÛ·¯ªžZ¬E÷èQ¶\9…’¯6V…qÄ«X‘¿ŒB@•ëYé2eË–+ÏPP kÀ#ñ*T°Ÿ[Ú§·ë³’¥J—!¨¥¶£Í_0?úúù>â”j°V¢˜ •±>«À¼råúõ“oLU¹V¬xq0JTÂzFÿþ÷²ýÔüŸœ¡X‘¢ÅŠ©P¢2Öý=þç2¾á`à@ë÷Iá"E‹‚©P¢ WŒÿÿsÿë†á*d˜ *a X`ø^ºôkýŸ`ôÏ ~ÌLž¡†j¸ ƒ•*5àiŒ~w|T@˜ì(C ÕpKó_–*Yò‹à6à …XãFùòóãBŸ°£ 5TÃ-)V"1CF¿¶ Γ—™™éA‰*àÆ†mƒÄø×à!¹óäU¦8ÊP¦°ü•ÿϳÁƒ 6th®ÁÌGL¼@‰ZÌù/‚S,GYCè70~VçÈŒÉPCµ`ú Ÿ3 Ã"Ø0ú­ž-{ 3ªÜ¢EŠ Á±(1mĈ#?¤e~d˜€Õra!RØ•%«aæV¦j°dƒCe)Œq£F=:SæàL P¢ –,XŒ6ÜÀ nô˜12Z¤Ÿ©P¦² ñц{°@Ú˜/¿üòý =7©D¬O0ÊT6 LinìØ¯Ò¥'f–¬Á˜ÊT«:B¡y¸¯¾—&mzÏMSö܆i ‚õô’æáÆŸ*MÚt>fËôA…ª6™>7 3Œ7“xxÞü Fbd,Fr}’Ȇž-Tàt¯ †·hÑ;‘"G‰ñB )ru“€¡88ÓðÂ…‹/yëíd"ÒF.ÌàÀÐ^´xñ’¥o¾e½4*òJn#7)d ©vp\ºtY„7ÕK‹´ýã‹L Ì`@À.[¾<|H29r?0¸ƒ ÔÁå+V¾þ@$ ÓW9’(@¯ç$ƒ®X¹*œ i“*ÐD¬¸úAúËc´  1;H¯ZµzÍK¯¼ê@šdN0UH¡Õàëàšµk_™0$20xÄ+¸nýï„|=üÃFJÉ'ú&…1—d57üöÇS"9‰”Cšx€_ÿúÛ/¾ dB¾‹±rÒ“€6â 6n|ÄÈpŒ|›‘<‰Bæ’ËìSh#þzã¦o~þå1#_{=›ÈHr‘eѬ^£ÀÍüýEFz7ŠEÆDšªp•9dJM  üöGA¾DJç2ºê~$»è.ö‰'À­÷üôèWF¾jú‘‘|œ 2™Œ Mbp…dÞ–­Ûî2© Ô"­“©$f£C²Wdnÿ^‘> …ÖÓ¦kUžÜqç‡{’ÊÐ îiH“htð»[Š|ᥗ¹:ZðØ71›Ö ¸ëÆ­;wîN\¯:þ$†ܾcçw»v_»yûû0ªÓTGœT. .›àž«×ä¸C´c`‡ûKLë… º|õ†/•/†Ê`.† Üwñʵ'§R„ž$©¸Í÷_¸tåº?•/‡5,Ÿ¸Àç.\¦Tš¸CC·ÀCgÎ_¼|ÍŸÊ`3C»1„‹aŸ>{þRù$ IÜ 9Tà‘“§Ï]¸Äº !/nSïÐb^;~ŠâéÆ`q{.ú’(­ç=~섉û–Æâpd'ÉEÙVÅöòî={MÌ&‰V7§NŸ9wþ⥻öî?xäØÉÓgí\ówŽýR…“ꢉÙHÛ–Bà•íßí: ¢”âxC 2NŠ‹¦,&fM" ñÌÙó.]¾ºuÇ®ÅùÙ‡d2i\ ˆÙ&Ñ”™×¶lÛPœ€Îñ9Óº(ÚáØ$jU._¹v}óÖÅ P¯ÜK}.Ú˜½$zÀ››¾Ý¦Å‘Î ÕÉhÑiŠY}1Ûn–ª\½~ãÖÆÍ[¼âÈ ÒIjœeÔ.ì¢hÛÄìO"oo€“^q¤½MF[ÎZdåøc–^±U¹Ê®ÿú›-Û¹8FA2''¥»}.rY4f_¼óÃÚ ›Pœ]{ÔÉ+¾dœä9¹"ÀEֶĬIDU ”»«×ÁIŸ‚DæÁœ¤aNu±.rY‚ÅÌI¼ƒ¬Z»~£UPH'_4NB@+] 3'ñ”wïÇä$´{o(NÚï ªM€‹Ábö’xïÇËV®!'·™s/Úrû[ñ]ª ´HÊ ³—D8²”œT™«“¬É­颉™…c’?{N™^T'j#.nö»èŬI|øÓ£…K–¯Z»!˜“¦qüz‡ë¢.š²øb–$"ù Œ“[¬“¦qðÏDAs¡ÙES[gŠ™“'æ…á¤sÛ7C‡]dåpYb¾/ŸbsýNª&yNz¢°×Q]\DY¼˜¿71ÿöÇì@'¡IA<Ìýz#¢‘ޏÈÊAY‚ÅÌGýÌ9¡9ÉÃÜ' Ì4© ÚE\”² ŸIÛ3}ŽÌð;IsT´g˜„½ÁH'ÀEég‰ù¡)ä´™sæû4I#ˆ†¹Q9ýgMئ..RY¼˜åçË”@'eNŠÊE@6쯥.¢E£.Ë›^Ìôkò4/“2'qâXÙ¾¡°¥.:ÖERÎ%þérÇs¸×&'Mwó‰ƒVIßHØ\HG]$åpYî|ïÿÉöú89×ç$NR¹­•$E:èèC,nRŽ”ånÀÏÊq§’“<‚¾‘c‘dk#’¤ÿ´© †ŽÏÅ«æÇ•¿aÇÂÉYN²Êmm¼°9h–Žd‘]¼fSú†Ê—âä"uRĵᾑjƒ¸ÅH‡µ(â¾ÊcÖÿ“Í5Ú: r©M@ض.ÜÑÖEé–À!5òËq“¦Î˜3ŸœT•›Ú„Íb$ù]”n ¤#F5aòôYsý*·µIrØ r]xt7ý'e æb¤a£ÈI´â"m¨oX’&l8 .²tü.¢[|e0òÐc¾š0eú,£r_mX’6µ : ‹wBÄün”Áprü$mE¯6a¿ø² š]<}Ös1XÌ‘£ $'¥E@¦¹Y’&ìG¶ç"†‹øvþÅàá£ÆŽ—V ¨ IR« ýÑ«K¨.RÌÑbô4täV9 ÈWå›z›ôã :T%æ¨1bõûbÈpR¹Ö†Ï/ìß_ð×%¤‹¶,ÑcÆîÛа‘F@T_ا%lšäH$ε0]´eA̱âôî7p©|ÊtS›aK"%èP]ô•%fœx½ú°2µ ½Íúùà :¸‹F9\–Øqßëѧ? ÈÖFúÆ_mLrN¤?è½nAYâÄKЭ×çWî6‰œôC‰ÜM¿'4huÑ(Ç–%nü„]{ö!imX’6li¢Ÿß8h¯.ÖE·tKŒXqßK¨s÷Þ­‘¤Šœ&9éŠÜc‚6u±YdY9\–ø “têÚ³ï€AT¼"I­ö9ž”ÈÇ´©‹ÏERŽ)KÂÄI;téѧŸ­ K’;Qöúù5ˆ~;úêÌE(‡Ê’(IòvüµaIú«MúÁŸ†"ƒ(h®‹H'„‹\–ÄÉR|Ö±+$}c$Pí‹6‘4×Å»| ­¸cÅAY’&OÙ¦½©Ì4åÕ¾li‚>o/ÄT‹~“$K‘ºu;® ú3Í [ªí%òáÏûMÐV:¶]Œ‹1ÈÅÄI“§JÓ²­© fIÒ„ÍÕH$÷ôïG½ÏE7)'YÊÔéš·–Ú`¦A’¶¹—HXÞgÏëÏåE܉“¦H•6}³V¨MOšiF’6´€Dþ$A_¸äÿDtÊI™&]†&-¤6,I/li>ý ‘&èËú3Bæ¢ç").fllÂ08 li¬K|pÛbfw4»G]ÌÔ°©Ô†%IaSµ×PجMäƒ#ÞM˜Ô…¿¯]LöýŒYhØC¸64i_"í“Ö%ÐEwšô2g­×ÈÔfw¢/lè‡iˆGOȯý<'Çt1[0Âfýø©W\–ÏEÏÅTäâÙk×GmÚwêÞûó/LØs9ln/‘ Ú ¿—Ãñú8ç¡£.¦{?S–l9kÖõ‡-Õ¦INmcÉ¥ñÿ^4Ò¡Ó%ÀÅŒp1×§uPØèm:À6lÚ²]Ñ”æDÀ·¹Q·ÏÅ”äbÖl9sW¯U¯±v¢ˆ˜´ '’5âIßï•úh¿‹yªÖ¬Û°i`ؘäÒ66‘\ÿoŸtB¸˜·JÚ,I ›z›0è‡ç'RJãMýàb|u1G®<ù+!ìFaË´0‰„"Iã( ÿêÖ E:tb.ÚB“‹ù>ªXõS„ÝÒ ›0ÒM¤Õ¸ù…£A[uËÐ1.~˜'Áò•kÔ®ï ›0Ö'­-Q‚6_j/Yéðè6.f'?.W©š »÷çùãbëHŠÄŒ„ÆQýÉ$Ÿå":£ƒ¹øI™ !Ãfý %‘Ð8Jsûœ÷ÅËýÂuº=)‹>.\*dØÐÆ®M$kÅö}žr¿ .¬nœ.4tÔÅ¢%ËjØ<ɹmhþP"·í¤Ã†KsË~BÓ·$ÄHutЀ8]ü.+nÂf‘«~0L"©4§Ï_ºv“´CA[1¢.ÔDæ¢u±D1›DN½m ý°"EãÜ5õSRÄHu‘¤¹è¹X²ˆ6OrI$ôÉÄaC¥Ao˜Ï] b4Ò¡3§‹çbéO|aKÛà›œæ$Ò+~R1R]¸qò\4.–)¤ac¤ùõ³”[ÃBJsÆ 1r]H:ÆÅ\ÆÅrMØ4É;w÷釉箹|µÃA“M]XÝ|º¨‹å ذ›µ¢iá釉ÆJÃÅ–3òf1Úº°t2ð\4.Vȯa·lKm£ú¡D’Æ¥4—®^5ߺ4÷‹H‡]üH\¬”Ï„ŒÛ&0‘¤qŒêÃkÜ06hµR™êbÅ*y .^¦bU:À¤mÉ¥1}ÈŸº&ẖ˜<©³@:y­‹UssØUjÔi@Ó‚ôc¹€›MR*¶hÇMb´u1.*Z¼TÙ •«ç¢°ËUªÎÓ‚õ#‰TsiPlþ@Ó yÔ&àã…Õí¹X#‡ ›Ú†õ#‰ô—}xþkGäMb¤9–P\é*Â.V«™Â.]¾Ê§ø\!ý˜F ( û–ý‚•G­‘N€‹µ>È•ïã¢%ËU®nôcé+ Ú1t¶ýû‹&hÛ/F:êâ§u²æDØ%ÊVä¶¡ùƒFD"Uã( õáÙ‹·ïÞç†1A˨õê鈋u3gÏýÑ'ÅJSÛ~¸‘HOã( Û¤QƒŽ—@¥ãw±výL6µ ôÓê3›HѸ÷R±/íxAwê&dÈš3oÁ"%ÊâK >ÍäH$iÜ”ÆÛhÇ :X]¬‹ÒsØV?Ôˆ¬H£q) Š}ú\XAS]lV‡‹ÓeÊö¡´Ì£HÕø¦-܇§ÎÝ +h•¹X¯QÓ46ôƒùƒF¤D¢µ­ÆM±ÑÙHc`ÐÒakÂÅf©ßÏ’Ãê§~cJ$+ÃÂ+ û,¥Ñ´¿.¢nr±aÓ)MØÐæQ)÷Js⌤QƒöÕE¤C.Ö‹-S¤Íhôƒùã%’5Î¥±DI£­uñ©.6iÑ:‡]°0é‡Ñ$’5ŽÒxÅ~ Ú ´HGÆXÍ:õábÛ$©T?Ôˆ’ÈCIãTîC&>|ÄÚ±•– ¥.$j@¸Ø¼õg‰¶M$‘I‡ i¥¡>”bŸúéÖN@¥¹.,žõ5kÙ¦}Âä>ý ‘hm:lPšÉÒ5\l‘FÖŽ/h­ I È.vH4Uz£J$µv÷Þ¶4(¶Èidíx•f1ò÷¨»~£¦p±Ó{IH?6‘ÔÚéÔæÒ kl±ž´Ú¡ ¹YŒ¦.¢î&Í[}Ö¡s¼DÉÓˆ~h›DBãRô!›äó‹ÑMÈb4ut¸[´iשkœÐOðDBãR.6ËçįÐ5Œ šÄhúE¤Ó qóVm;tî;>ë'0‘Ð8ÆÏ”܇ÔÙ§Ú±ò6b”º°tš¶hÝ®c×1ãA?Ôˆ6‘8lºÙÒP¢³I>Ç{A´c*MAË㺰º[µmß¹[¯èqI?ÒˆÜÚ8µ»ji¸ØÉiDÃy#hˆÑÖ…¥Ó¢õg»ôè-v‚¤ÔˆšH¦4Ô‡+Ö`V|$‘£iÐ"F[R7¹Ø³o”XÐ5¢—HS:´ç-¢bC> ¾ü*kGƒ1šºt î.øpŠ#^"iDM¤) š[äƒ4²v|ACŒ¦.$R7\ì)zœ„ÉЈ¬H$’†EG?ÃÇpòß¹çÀ‘ÃQ£Å”žæ óà9Fu!é°‹ŸñNÔØñ“¦2‰47¥7É›§¥‘µ“ ± šÅèÕ…ÔݳOÿoE‰ù^â”él"Yã¦4Rlš$HJ#iGÍX¨Ï1S¨›nË"¾#n¢äšH- š)6É‚¤4’v4èÜ4Í1SR7]d¾)5"'’S:k¨Øã4}ö¢ñMÚ¡ ÓJÐ$F_] nºlðvÔXhDI$ŸÚRéC[ät0\xÑŽÅMG Ô…ÔM·o¯¿Ù—HÑ8—ßSã&£³Y>ä«D;‰’Ú EŒô!ѧN7¹«õÍw£›DbF²Æ¥4܇Ó1ÆWÑôÙ{€ÒHÚIœÌ4‰‘ë‚©ÓEnÊF‡{ãM$Ò¸) Š=ņ|X”Æè±¨ahz#hê@£­‹Ùy¼þí(’ÈœyeXÔ³¥‘b“|H’Fj˜4é½ IŒT´tws÷ÿÒë#c¢Q"óÀ° ÛÒ ØF>$Ôˆ4’vlÐÔ#æ˜ÔÅÜ¿`ɇM‰²þÒP±Y>ä~I#7Œ4Ähû…¥3? þx%'’fdþBÅËøJCCwäƒÃ ‚”4B;:«„µ.æâö7$ŠDkgÍÉ×ÒPgcŒC>$ˆïP B;tN› !F S{§þøEJ$™>3> q[.¶‘IiD B;é2˜ Ñ#Îê—î|@¿­~1‰ÄaCÇ—®±Å†|Hß!hAhSƒŒ‚16n&ua錟<íçßÃQ"1#3~€aÁ㇚Wì%,ȽH#ZÚ ºn_]øúò'›HœÚ¤q?4иØB\AîÜ+i$íàœFOÛ yŽuÑ=´Y~}é5J$Ö8•͛峂&äI#5 >æ5hckÝuðÅΜHÌȤq) š›å‰ï‘4rÃàÈâ ©Ê/ïòûÞϢȄ4,rT˜ºg-¶!nÞ¾[ÒHÚÁlj š:°/Züœ¼+‰ŒMÃÇø©\g úŠÍò AŒB“,7 Y&èæ¢ÚwQô=ù:6IXã(M¥ê8k¤Ø*H<*M2h‡†™-CBnåæŽId<Ö8•¦b5îC›ä£D“Æ÷iJ|Ä=]…ŽßÊ\˜ÜB"ýI†”†û°KOšV[¿£¦NJÚ¡†‘žæûþÀkjü¸é%2- õ!Š1Îò1ÄØ’Fžtu ÚîòìUÖõï<¦D’ƹ4hÔ‡\l’rËÎq$h|œHÐÒ]/ð®Q"Eã4ÇóÑ@£>äÎ:ŠÉĘ6tI´Ù‰Ò¨57WnÝĉŒG—ÒPR±E>FâšÆMÐÕ¼ }uY¹ö2ù»Õx&îîÃÖã,$½4æ÷‚f1âÕ`ßõÝÅë?<|üR@i¨©³Y>¤HÜ—F4L`ж.üÓôµ;~}‰”ÒÐ@£>¤b÷üœ§ DN#æÎ‡¬r•üAûê²nã¹+·ï?cüP×p¢Ø$L’$¾ÓZÐ*F¹†øæÌå›÷~þýÖ¸”†ûÅùŒŸBGÓPà ÚÖ…៾x㇇иWîC³â‹¡£Ç‰o£4ZíxA{bœfï5N^¸f†…) ú°BÕZèl–Í3HMƒ4úµS½–/h_]6o;qîêm£q) » ŠM³¢? R$¾iôiÇ ÚˆQï°v;{ùÖ=hœÇZ.[lÌ ÈgäXLÈEËÑ4¾4jжYŒóÍÏÒ£§/Ý`siÒgÑb“|ú "AÎY¸|ÍÆ-šF´Ýމµ.Ûw>uáú÷cüpiL±ÑÙ,$IMÃjDvLÐÜ,FS—{8Ï·¥‘b£³Y>iBÎ^°lõ×ß5íø‚b®+ÍUNÐãg1,0Çmi¸Ø4ÆÛ`ú|1Œ$¾`éê ßš4²v¼ ¹IŒ¶.»÷í?ÊÇø¡®Ai¸ØUyVàð"ARÓlØ,idípÃè"ˈ‘û…>¯ƒŽœ‚ÆúK“˜>¸Ø"$fîü%«Öoæ4²vÊš£ÝyŽÉïæ½‡Xã4~PêC.6ÉÓ§¿HœÚÓhµCç´ ZÄHsŒê²ÿÈîƒÐø©4hÔ‡Rl’¯Á$ñy‹W®û&U:¤-HÚ¡)a*-w•³ì­KÐÁc»ö“Æiüð@CJ±Y>$HH|.µaêô’FÓ0AÏÐë‡ý‡ïÜß¼û3u ÎêC)6É‚„ÄÑ4+ÖnJó>§‘´Sóí|·ÈóôwøÑ“;ö>…9.¥ÁgúЛäARÓP¦ÍÀiíðîÅ šÄ¸V~>?½mÏ¡“ç©44Ф¹Ø†ARÓ  %¢:t¿ß¡«\Ùçki[—g·î:pœÆ”&arSl–I3w*µáF¤“ -È ÓŒ®Î{™ ÍÝ×åÔùo¿Ûì —æµˆQb%HfŠ-ò ‡Ž¦¦AcÛ4–óïÙxìL×ßõû?sñ›AG¼Òh±|Hh´áלÆO|»@/è¹|›!u9wyÓö½4~¨4oDŠ îl’Ñ4h쌒FÌ^¼Ø ¿’ IŒ»‚P— W¾Þ Ki"¼C}ÈMòABâ܆2‘©«Õ4;U{ƒì] .—®mØB¥¹‚Ò¼ô:úŠ+?ÉG ‰SÓ€˜9û‡ù¹I;²ÀúÂwÈ¿êQ—Ë7ÖmÞIã‡Úk¦Ø9óA>$H‘øØIÜØY8¥}K6 Ú\…ÑíÕåê­µ¦4h¯šbçÈ+òQ‰£ W®ÏjÒXÕ¿РùG=ÕåúÕ·ÑøAi~LjäbgÏ#òaAâŠuäÊçíhÍŽDƒf1:†ºÜüa•- >"P±SgÈ–»`QL$IMƒÆ^‡4~\´”!6p¨½Äü¦?|âìÅk·ï­XÏ¥¡öRx*vª÷iV”®AŠÄ…¸6GnI£YÚu÷Ýz¢!ƃG©.ßß_ŽÒì“Ò¼ÈÅÆçT.’æ)MƒÆ^›3`±höÌĈ!qæÂÕ[w,]cKƒ>Äyˆ1N³¢dy$IÜM«ëÎe ¹ô\"¿÷9yöÒõ;÷~ZB¥Á@»>|õÍÈTlÌŠOJ° IâÒ†ËÖ˜4úöBÃåŽ@~CŒ§Ï£.?>Z´Ò–†ú‹YQ¨8Í3HœšFˆ8©‹a’‘v¼MÁºE•{ŒÃ'ÎP]þºpÅúo¥4Ô‡\l–OÙÊ$H’8·áÒ5šF^Tz7½æ>ˆÅˆºüüÛüeÔ5ÇÎr¢Øøœ"ù ë7…Ä©ixTäµiäûí^´ÃñÍb¼z뇿ü1Ï”Æ;n¢”$šgõš´î€¦¡61Ÿ¤‘ö”íü½4‹ñÒõÛ÷~züâœÅ«7nçÒH±qf“|Š”‚ ›´’¦áQ‘ߤÑh‡¶k4MFã~y6—Æô!Š3›äÂlܲ}W4 ÚDÙŽÔ4k&{Ïkïnñ¸ûð×ÂÍ\À]#}Èņ|0} H’x×ÞhCjìU²J­]_VaÞ…'_1¢./½6c>ºgÍY-6äƒéC‚lÔ‚›mˆáÃ[îÜ‚æ~âT š:bD]^ ?KC}h‹MòÉûqqLH’x¯þCG£±¯Ô4²vh4jл8èk\—W#L³d5Îô¡-6É'OÁb˜xçžÜ†Þ¶Î^ÀO1÷,ô9S—×Þœ<{Ѫ¯ñ@}HÅŽ‡ä„ĩi†ŒBc/Za×öºÓÜWIÐ"Ƈ¿þ.ü[“f.\±a úŠMc<6ɇIÇI3xÔ8ŒŠºcíPÐö c‰ÑýÆ;¨4ß~‡>D±G³ò IâM[wìñ956†OÑR¾¹ˆ–_Þþ _øîx”fí7;÷I±U>$IMC=eÖÂå²iüFÖ šÅáí(_¡4k6í2Ŷò +TÇïЭ/Î×ɳ,÷oo¤a‚6b|3R´±T‘º(¶Ê‚¬FMƒ6¤Q±`™—F¾+÷ݨð‰ñ­È1Æ 4+7Prgù±$ަéóÅð±“fÎ_˜F½õ³Aß¾+u‰kô„ –£¹Øã,R$Þ‚ÚFÅü¥¥ñ‹¶¾ÿªoõ!g6ÉGY¶ 5 Ú£Ä2þ4Ž2WtAs]bÆþÕÔ¹èC)6fÉG ‰7 6€Q1cÞR/ÁƒÖ¤ºÄŽ?lì”ًчAGÎ`Œ?~òQA~Ц¡ÆCãLÒè׎/h#Õ%n¢!c&Í¢>¤bߺÏòaAb›N=iTLŸ»Ä¿ åÝKÚ YŒ¨Ë{‰žˆIÅ>uñæ=– R$^mˆÆÆð™»„.)ªÀ YŒ¨K‚¤QšùËq¢Ø<+ÞŽF‚4o‚6¤Q)K5£{‰(As’Q—DÉ¿1Žúp3:ûü5šoE… YâLDqÎâʺí˜ËXš;ÄH›æþþš‚>ÄÐ=vî*ÍŠˆQŒ ¹iZ1qÜÔ9‹¶Ò0^ÐÔ$Ƹ “¥é7ôËɳé¤bcVÜ¥é=^Ò4"qjÃ.c'ÏZh. ?ä»ïÛ½_‚–Œ.¯º÷GR±ñ9uî¦ÏkoA˜¹85é’œïMGŒ¥K%¾7Å “ 1vÞŠlžtû|È*6ñ³W1}^A²ÄÑ4ÜØ†a@.¨cÓ8J¯Ò¾ âJËØ‘µuú,9ºô¥>äbaù° iæ¢i¨ ‰ø%ˆ&éJr¦\IâÈ2As’3|ðaçÞm±!L#Èly¸i¨±û3±~sÿ¥ÜRmÀhÄô¦ yìМ72{¡©Ø[v‹|H S¼ÿ7 Ú†ä|›Fï¶ÏýýŒ7Þ‘GYsæëУ?{ÉçäC‚Lœ$^¼\µ:<*˜Ø°9ݚʥ;_×lÛtŒ¸ eÜ®{¿¡¶ØÇÏC>$ÈøÉ ñ‚ÅÊUEcÓð "-(F;6ã<°A¿þí(¼Ø¢ ág]QìI\ì},$Kœš¦v#Óç7á¥A憜&èTš‚Æq`Ìmºô¡bãÌÞ.òaABâÔ4Uj5jIÃÄyÁ®aiJ9IƒŒ‚Žø.?Ë ÝmáÖzIÅ6òyø;MHHMS¦r­†4 §Ïk&i¤Ëg¾™Û4m¬ÓÓê¿hËŽ=¥ØF>$ȨqHâù —®\³a ¹óZ´µi”Î{§# ò~•ž'$´‹²í¹Ø8³¿%ùÜ"AF‰S<µ! Œ3 ¾{]ÒM 4Zðªd³vݸØ4+0}X$qjšR?ŨèÚrÚÜVšFÑFãé ˜ÞÚ¾wÍ[S.6:›äsBÉÏ–·PIjìϺôˆ!>·MM#k‡Fã%–7‚Ž'aò4$ÆÂ%Ê5nÓ™Š=kËG ‰§HÿµazÍÚvé=p޾(FŬ4ÌÉsWnš eïOu)U¡{ÔÌ ’§¦ù]¯iÛν¿¯ÌÏh»‚I6µƒ†9zÊMËÙç/T¼l¥\ìñÓ1+ $I<µay{}1ç%ßÁŽ4w°ÐFã¥ë¦Ò&èܨKùªõ¹Ø8³—¯‡|Œ !ñ´Y¨ 1* q¶¤q¼\¢}K sî²?èôr9_±zÝfèìac§Î]¶ÓÇ Ïœ«56†O¯Ãñ¹ÕQîÛé2ÚAÜÂg(¦7±“AV•?­Ó´-Šýåä9KÖÒôaAF4MSçkcŒ3 ñɳ;›+XºûÁ sçÁõï” e!*wóµj5¦Î¦Y±æ^,È7£ i¸ «ÔÆðÁȱ ÍFs+‡†¦ÄMœÓ/Ù‡ Yè©m$j6jÕ©÷ Q4+6až‘ Iâhšù‹Ð¨À8ß<‹o7åÊÚ¡†¹zûÞÏZiÚìÈÕ| .6fÉGÉGÓäCcÓðéÑ_2³º÷(×SË¡«§/^§u¨o Lb¬V»au*öÌ š>˜g¤H<7v͆gø6š4K®ùøRŽ´sœFãÃÇæA*³Ø©ôiÝÆU©Øø@ƒ|6lÅ<ƒ !qцŸ±E{ñ!l/7i²“æ– :?°Ž*u¨³1+H>,H’85 Ú°$Fˆ4ågšû.¤ÚÁ svÀvõŽŽsÕ_™ŠÝ—ä³ò9têòmHœ›ÆÛÑGÂÄ™Þ-Í4 ‚æe(0t˜GÅšZwî3h4ɇæÙ¥[85M:nìõ›熹-¥4’v(ho—N×É…Kâ7TÃfm+|Ú UÇ^GÑôùf' R$ÎmXœ‰]ù³CÓHÚ‘†yd‚¦ƒh®¼Ë¡ØD>«6î AÞÿSœÚðCõš}FÄ 3ô’gkçû6h] òEÙjõšó¬˜¾`å×,È{˜âhil!ÒW«—FÑN°Þ¤4»[?Èg>æ&äõ»˜â‘cS áÓ´mþ¦ ]¾Æfíœ :‡]µj×µdåÚMÚ’|0}ÖCø£Ñ4hCJœ,¡-û’kª|0ÏCâ?¿>ÚáS²7ýŒÂ Ü‚F;þÕ<‚®XMöNÅ*|ÚfäCóìÐi’85 ›F…Í ñ:ÕÎÏô|À´Y—ô)Z®:fˇIÿãµwb  ÑØ4Î ÑŸFiÞÌ› ÍÚ‰nù S±Y>3Y$qjšøÉßÏFÇF.~OŒ›6B®J7Šv8hÚÅ— ¥y[òIi™#ÆÓ<Û±Ÿ$ަ‰þ^òô4Έˆ£øÖi4Úá £™ ¥å’¿P©Êž| ÈãnÞ.b´xÔØ>4r™H÷q‹¤E;æ9‚tC¹I.X¢R­Æ"̳mAÇÎ߸‡¦‰JQq†cósšÜkn`íHÃðk–dºa¤Ä V xšÏ$K' ;kn !â[‹®h8¬jy(b÷ªÔ8/È_´| ’Ïà1,È=8δa’4Y0|*~Š!ÎÄqtÕµ–Zµã_ôÓ¬­&òý‡ŒÊW³ò1‚$‰SÓD¦Æþ°` Œ¦–òñ?Þ¤-HÚ¡†‰"kÕÜfÓÖJn}ó.cäÂ$‰SÓ¼;Qê̹hœ5h!DœÔKVQ í˜=¿©´,ˆø>>w¡ÒU ^ãI$ñ;8i"¡±3å*P¼| œlôÛqªI#Zð¬}&C·ªì^cèè ¹>Ƭ€|0Ï0!7‘ÄÑ4¯GŠ™£¢@±òÕë7gâ“F´ iç³KNÑÛñåùØI9 ”¨Èò ˆÄÑ4¯QccøÐ€lÎFS¦rwÉÜAüU+YËÈ÷©Ù?*FòéÒ‚´ÿñ·WߎQ‘㣢åª1g¥Iãþ£g¼‰e=„ ÍzSyz¶|EËA>øÐ… Ä|Œ6ŒoŒ³jõøKýË)3(Ûvä· h—󽤾¥˜ÙALž™5o‘²$ŸÞƒ H‘øû¹±ßÇ8ÃÈmöY·ÏAœµ@Òxòü5YòG¡%?WZw9t-='KžOÊT­×¢C¯$KüNšW"F{†O‘2Uë6eâäÙ‹VHéÔo¼RMdƒ®n4ñ2}X¨äÓ¾ ’$NMƒ6Œ/†Oá2Uù›#~îb¤q­¦ùùF4Žö9c®‚$ŸvÝI$qn´aܤé>È[Ž!:4æ™4Ò3¨_tÙíÍ·û´x?ɧIÛný HH\šÆó|b‰c&Kû^_˜­¯·wþ%]ø¦ù´!AN_°j5Í÷?Sc'I›’ŽÊ.}1G8ûŽP þ$ ãMû+¾Š§uAÚòÑôaAN›¿r#5 ÚÃó¸6•ø¬^ŒÙ(/î™Ç^ÐfI1Î[²:MÖ¼…ËVoЪSŸ!_N·âk4 ·¡í‡úÒÕ”Fy " cVÝ|÷æ$±T™sR¦Zý1!Iâh´á4*Rgþðã’˜ðü;oÒ2“Æë²ó奾ȤÒ1.^¹!%äƒÃ«9 ’$ަARc[¢ùä4 x„ «JÞ u‘+iôÕ¦ärB>uH£&Bâ[÷Rþöê;>™r,Áß—ô°’öûÇäy/heÃFòƬíÖ—îëf-ÄB2’O%̳îFN€Ä·ìÁIsÿ1 %ò'‡¤‘ž@A;8VË^±Œ]ãðm/†ÉÖ$é²ç/^ó ’$NMsý;3œkæ#f"§‘Ÿ°@;h˜¤¼MåJ·›}#þ­Ä,ŸO!È~ÃHâh´á¯¯ÐðñGM”=7m¥åÁ@rÚâ|"AÓÎe$]{®\ÿíw !Ÿ"åHŸýjúÂUhš3WÑØ£aœåøˆ?´ø³ˆŸIÐzÖÛœ{»+¾4ÇEjö$€|¬ ÇbŠ£iN_ùáÑËoÒð±| ónÒHoÓ"pÃdÌæ š;pÁòußìzåS&äà/1ÅÑ4hÃG/aøÐ€$¢|ºm’í,Æ7-ÃâËâœåÝ ³Vî£Yñ’gÌõ1æ9hÌ”yËÑ4'/ßùùÅ7¢`œaˆëÇ <å>7LÖy÷À›Þ=`:mÚ¾çPÈGÙŸ»lÃvjß^Œ%.$Ž øDDS›×&vËM{s¾Ž¶³òJ!vLŸâd;H|Òœ¥ë·í;qñöÃ"DÆ8Ã/+¿NFMÐgv·ŸCÖ½|­ÏA/–·±§Í–ó¬ I|âì%ë¶¿pëááß“$Ý V3¿w¶ëûƒˆÒ0¹üAS.[»‰^]Å€|Xøˆ 3Ñ4hÛhø$I‹!®ŸÀþWüŽÃ,®dFA¯XOšÎFO:KžÂ$È®ý†Ÿ¦Ùsýûk‘b'N‹IG_Eí‰H›0ßFZ€­ÌvDÄxèä…¨ñSfÂ<ƒ ;cŠÏX´fóî#8_{íX‰ÓdÅwVUC4iÔEªo'dƒ–·Qâ¥È(‚ìÔgèØé qÒ>{ý> ŸDipôÒg:”l½õq°ÅÃJy|tõݸÉ2ä$AbæùrÚnÃkoÇL˜:KnCÄ\ Ò4l=ƒ¦ÿj¤ØIÓç(A²Ä§ÎG:Qîí SgÖoÁ‘ö³iôíz5hê@î+·ÞŽ•8 ’%>eÚðàiŒŠW0ÎRe¦Ïƒ:üu9iägEtï[(ú‚6Š}+F¢´ä/†#›$>y.ÚðÀ©+?üòJÄè¹"uøó`‚>¹ˆ*{}Ú1yAsò:øÞ›Ñ¦Îš·hùšIâ“æPžÄ¨ q–’ˆ•…8þ¥‘[Ю£mÐÃdì°¯ÜyðF´ø©2çÁ„lÔÇICmx _o‚˜Q¾€ù'™·27;OÙ¢š ¹åGø(ï‘ ËVg‰ã¤Až¸tß)QßKa>Š>#¢¤‘Z0‘·XkeoË}¯[^ó¬P™j Zuù|Nšµhì‹> ò9Y©6ZgÐ)Ýo“vdAéMÈozþöZ¤8,Ȫõ[vî;'Í46FÅ ¢Ä#b "Ò©F›:ÙêÛµ,ï¬8hŒî@~AîÌ3LH’xŸ!8i¨±…WNÞZB¤4ê2Zw6èµúnäåWÞŠI‚,Aï='ÍêÍ»Ò𠙉ÅùSÄóòÞ"*-˜²QÃT¯ÛĽо–!Á¾‘Y¼"$ÞkNšUßШøñ÷×ß“”†1ý6ÁÇåxJ£´ lŽqš §Ò!z¾u‰–˯¿øf´©³æ+Vï9pÌ´! X¡&ÇQ_–õdYOJУô²µ›iI…åõG„¨ñSeÉ[„$Þã‹Ñ“ç­@cÓðÁ€L"Ÿ«øý"•1œYÊú6VzÖ•ö ¦ßE…ËaŠw0jÒÜåwòð!b:>0·!¢ì½ÍŸì9è%ô0êˆìèÃGzüÚ»䇟”­ÑM3râœe_ïÀ¨¸÷øÕwbb#&r©Óše¬nh½$ÏÁhY(¢üú* 2fn4 ÚpÙŒŠ«gâÞ7ÑðqœÆw}KµÆ­;úƒ>É+z”îÑ+oÇNò~΂8šm¸týöý>1ˆœFjA^NVôí0–ÈSZ6Òóç—YJV©‡¦A.Y· Ããìm ¾ï¶xÆWïù‹˜íWz¾ïéõ! 2$NMƒ6\¼në¾g¹‰ø»íSþi2îžÝûA;Ô0´÷ãkmû¬å¦YU?xáè Ò@╨iІ‹Ön :~éΣ—ߊA“Ó| ÷£·í,°f1y®Ü~ ÖI$ñеÐ4ƒqbT¿xçç—#bgñˆyÇ›8´c`´RÓ'Lç¯ÛMõ½ß^‡ 1sË×lÚ®ç œ†«¿Ý{ìâíŸ_ŠÈJÄ¿ÿ¶]$Êj’‚ž4‹ÞÔÉÆß,Xï>~-r¼,q4ÍÀ1S¬ÚLÃç' ñ©ð¹QÖi[evKÅÑ0¼ BÐs)è}GÑ6ˆïI"q4Í£ÑØß`øÜzˆ†§ó‚¾™H;:Z7d#í|*WÐTišþ²_MšöΣWÞ‰/SM3`Ôäy+¿Ùuäü͇/¼ù¢f¢ÙLf¢•ˆ,0ú™ qð£µr·~~ùíXIÒçü˜›¦ÿÈIs1*Ÿ»ùà…QÍ ÄçÅ8^Ñ-9Ý×Áh¤eÕTó\ä,=¡}’Ô™n>|1b H\šm8gùÆïŸ½ñà&~ÈYDäHr³ôÔèÊ÷Å4fí…*׬×¼ðft’87 NÃÙ˾މqöãJ) Ÿmãx”’–§¥iÇb6"‹ÌkZ÷ó¿!ûµûDˆF§¦éôù0"î8x#7¼|¶Ñ)ID³OÓíW¯^ÐÔº¥¾rï·ðQâ§‚ÄÑ4û?k錳k÷=2~G±>ý[Dš:ో‘V¡—ï>~=ò{)³ä-Š“¦{æ’õÛœ¾åËI^Úy±Äk oi#A‘ ïÛ2æÈ‚|ÏS¤B­¦íÑØÛöŸºzï7År}L«Jã|ë44 ß›Êó³ì—²|XðÂGáÞÄÑ45›pc/Z·uÿÉ+wi¸'#bU!zkIÞ ôè{!ƒ|Ù®Û>9wëgÌܤÐ4Ÿ6¦ÆÆðÙºˆ¯Ê׆%š4z[ 1“féS‘‡Þ"´èÙ›_z+&¦x¡25QcOÃð :qùêΤïÛï—aãÆ”ré.¿aÞ› o¡L›¬Ó×°Äs|\ºzC46F†Ïqñý’”‹z-;ˆ4¦–Í©®¼ õm-O]û37QZ4MµhlŒŠU ^úþ&æP¢]TéZÉ÷>Æ·O.^þä•{¿“ij(Yµ>£ãìØÅ; Æ¢o¬RU„ÝÅKÉ€ u//+Æã—ï’ÄS£iªÔCcœ„áCD’±ä«Mˆ1¹’¼Ü5›†yËÖmÙ¥ïdù‹¤»ôfî{hšâ•뢱GLœ»òÂmC¤C²öTÁ‚Öµ<)áÈ…;¿@âhšbë ±‡cølÚuäÂmß±ËDJÿ‰¼7¥·´÷{øüíGá"ÅMž)ÚQ±|#Fî­àÄø¼^‘eHO´}Ô1Š•õzÏBâïÄN–1w‘òµÐØÃÆcø`äâ á¹©Døm°vx•f‚¶o¤n´ú=pæ$ Mƒ6lÚ¡÷Ðq³–b@ž»ù“ïÓ€ˆ‰Sg¦;|ºïF·°³¯– åM‡ˆ‘þƒûXâhš\hC4ö¯fbœ:˳ÝO¤E,­ví.Ä{ÉÂÈbä :yõÇÞŒ‘8=µ!{ðW3–¬ßqðì †Ñ}ÄñÉ¡¶Â¥í&mÂŒ4w ‹uiÜzï –x¢tÙц>ë9hìŒÅë·*YµA›î>‹Ön;pú:Ú=ZBúÄ2DZ{±v:ñãAy´t–6 ¯›gf_¹“$ÎMƒ6¬ßº†Ïµ[÷Ÿ¾öãoð‰f‰ïÓA)¹a&Ñ[y,¡›ä‚´ÌiÞ®ûŽC$qj´a½V]Œžº`ÍÖ}§äŒLMŸBôíVèÕÀR4Æ:0½]vêµíàÙ›xÜ™ó«T¯e—þ£¦,X½eßÉ«÷¿t”˜ùCÙ£™wUæ©Íþµ/ZeÛºÿÌŸ^~;·aÝûœ<õ·ÐÔ½ßÃÓ‡¥?àëvºxįÉ6í0AóB>‹lÙZtè1à[’8š†Ú°Bæiœ­ú6èãQéÇÇ/iµRÕ®VôaƒÙÑÒR£´ùïm&‰SÓ  Ë×nÖéó n†Jïš/Cœ@K¯ü@dø¸ióù9ýbxêÀL¾Ö7{N\¹ÿšmX®V³Ž}‡Oœ»ró^ÄøøM•…¾5˜ø!äÆÏbø ”ïBT³þ¬T“V´Gn„ÄÑ4Ñ¡ iTô6aΊoöàèzì'ŸWö ]h2{ÉÚÍ»r¥iì¤0ÊjÊ[’¯¿;zñ‡ßÂGK˜6ÇÇ4*z?gŦÝ4Úùë%byç՜߰L¥'P¾ SËf‘ë2|ÜzHMƒ6Ì^Fˆ³—3ñ××,±9é"›.`Ñ0¼éÞgƒ–-r)^@ÐÅùºí‡ÎSÓÄO­Š^CÆÍZ¶‘zD=,@ô--äÁ ‚~ˆ c$0K»º´´6vêHüÖ£Wß}/ÕaT|†q6s©!¢“2+QV^ô$ÞIЙW¾ïâD£•/‹¿½Y½õÀ™›?‡‹/eÖüm{ ñëïÌ–B‰‹ò{ÚÏÊë 21*-ã©jµÍ>lÎ*HüÆÃ—цYòaT´é޹dCp"ŽHòBö³è‘– úZ?ä 1Ö—Ç(Óæ¯Øt Móvìä™ó¯Œáƒ¹dÃÎÃHî«‘¨Û‹"o¼ºò.ž×ŠÞž;Kn–jkóŸ[¶iï 4 Ú0SŒŠVgÓ¯ßaÝ™óqÄÄ2ò¦a8M ~sãþcZTÒ­yaYTRŽç-[ºq÷ñ+÷_x3fÒŒ¹1*0Î0r×ï8tNˆ™”(ëóîâ;^JÓ¦É,¥ñéFÂZµäë]8þx#»HÅ:-» = ÇÂ!úR5B”ÇJò\À·ÜO’V÷k}ù®]´þ»#—~ø-Bt4vá µ[tî?jêÂuÛñ8>bå:M̳ ³A– “Sšnâº|½pÝŽÃhšðÑÐØŸ”¯…q6jʵfûˆ“øeÑz¢›ø×Ì2̬…ÌÛ–ùk¨i~}=jÂt9 aøtú|ä”k¶8{󧗈Ȕ>±‘ _²‹ÏÒÞ!4ü¼ÕÛœ»ýËkQ¤ÍþqÙšM;~>bòü5${ìuZt‘3å{ÂoMxÉMÚoÞAýŸ³jËþ³7½J]°Ì§M;ô1iþjsVÄNžQˆýFL¢ë\yNe Ð+ DÞ‹¶E›½‚šæ§pÔØJ×hÒ¡ÏðIóVoÙOô6>Ù qä$Z˜LÉþøÅ7"óFú“ÒUÞÊÌZNMóðej쥪7nß{ØÄy«¶àôÁ'›8™ß Œ™l¯ÜûUÞ È*Ì{s´ëÐŒe›öœ¼†6Œ“"ËG%«5j×{Ø„¹hvjM"æ¶DäžÝЫÙ.ÞS™éK6îæ6Dccø`@0g%ˆ×ì iˆ²]˜©KóížÚ³}wOWSo@ÓÜ!b¬d™ó•¨Š9düœ•Èĵ/å5 ¿¯á _±A{O·ÐL›S®ßyôÒÝ?ÐØ™ò¯Ò mÏ!ãf¯Ø¼÷ä5œ¹JÄ—Fk6–6ܲ¶A’™ô¹¾aº8išæâ¿£±3æ)V¹~›ƒAüf/}¨*‘¾]øÂÑh¤ #D1«µjõd6Ó¨`"5 Ú0Bô$r­T¯u÷A_ÍZŽSü*2A‰Çˆí{~1ŠßGì¡U¯o1+b4uô'Ì]½í Ú0|´Äïcøõ7Ä –8µ“YÂoÃ!h‚æµ>¿û#és]N]¾3Msàìí_^š(}®ÂÝŽ " M"ʈë?zªé©ýÅÄ'!] µ@â.Z0bØHHí¯'†‰tÔBÃBº@j1 ¤ ¤ 1t¤ ¤ö÷CEº@j¡CCº@j1¤ ¤ö·C"] µ¿é©…I ŽtÔþNb0¤ ¤ö·‘.ÚßK @º@j3ÑtÔþýÄ 1èß@ z>‰Aÿ#1»‹÷Wƒþ'bö?›˜ýÏ&f:bÐÿ#1ûŸMÌþÔÄ ÿ/böÿWbÐÓ³ÿÙÄìÿ|böÿ‘ä"zÀ,Ñ|ZbÐßLôÿ¡ÄàSƒþNb ðO þ‰Áÿ@bà?ø#†ü§C>óÄPÿ,bèÀ1 à³M ø"† üçÃ>ÃÄ'Ÿ]â“€ÿâÏ*ñÉÀg”è>›Dð™$ºxÿö´Àg袑¹@jÿ¢ Ææ©=·DKÌR{^‰.”1Hí9%ºHÖ\ µç“詹@j.𠤿©¹@j.𠤿©¹@j.𠤿©¹@j.𠤿©¹@j.𠤿©¹@j.𠤿©íu‘¬¹@jÏ)ñi‘.ÚóJ|J¤ ¤öÜŸé©=¿Ä§Bº@jÿŸh.ÚÞ§Eº@jÏ3ñ).ÚÄ?•èFº@jÿÿ\¢é©ýGü“‰.¤ ¤öñÏ&:.ÚÄñÉHHí?âŸBÌñןˆt‘Œåx‰9þ…Ä'!],¶ÿ|bŽç‘˜#â.\ö¿€˜ãy$æø÷ÃF>-ð¹"æx‰01LäßLôŸ¢øÜ€!‰a!ÿÝÄ@àsB ü—Ã@>-ð¹ †>ÄÀ+1täßD øìC>óÄP1TäßA øŒÃþGü߈aÿ½ÄÐO üø¿Ã>ÃÄ'Ÿ]â“€aCA>÷Ä'ÿ#>-ñÉÀg”èþ›‰!‘ÑüøTDï™$ºp9þ#> ÑE#ûÓ‰9ÿ>bä_CtÑ`9ÿâž:1çÿFtárüÄœÏÑ…à_A ù æü‰.Þ_@Ìù ƒ#]< üKˆO¶ øçsþó‰9ŸG¢ü·Ã@þ/Dðù!úÏ 1øÏ$™:òY"> ùo&>Ä@!>|þ½ÄÀç€ ðÙ'†üCE:‰¡ŸubèÀgœðÙ&†ü눡!ÿfb˜Àg™60çÿ¨Øô¨x^t¼y\ŽÝ÷=^)Q¤HJ(dhBE*4(E…P©Ð A R Ñ( *ÍÍsR©ThP¡Q%)Iß½ÏuWž÷ç÷ûëñðº×}ÎÙk¯½¯k¯s?|žœ_ÝÜ;6‡c•ð%ÍÓ—ìn?OÈ®hüòcrþ2A±]ûµN_²uó qp÷ |Ÿž_Q×òmhœq×J!ñòªZ'M-loz„D'¿.®njïýùàYRÞÛO=£L‹ù7oW÷üü;‡{õ&)%õc†¬n¸û<~—–W^ûéëÀ˜xbNåÇî_Œ‹VnÚ®xÄࢭ»ØË×å Q`1ÔÅ3 $&9»¤æCgÿ(= ÇŠµ"ÛdUŽèŸ½tÍù®?íËÚz†'üB_f¿iú62‹w£´Âa³ënÓˆó–DÃKv€xëÞ£p\G]ó·ÁqFVÜôNyUmƒs–v·¼†½HÉ)­ùˆ_v?$þuEãן l+6l“×8yáš›_hü«ò†ŽÁ¿ÿ ú‡Þ¾ÿäùËÌÂJ\nzÍ&©ÝJº†fÖŽðO/3òßÔ·t 3ùÇe•5|¦_È#´UNãÄ…k·|±ìýoû‡ÝõŽNÂÃïèÿEmZZöÀQ}ãË×]<Ðþ©½od’Ùûé‹ÌÒ÷?è,_¿eŸºþù«·|Câþ‹x½`g©¹epøƒ¿©Hï”?¤}êÜ{78Ø´ÜòÚæ¯¿g±z=‰É(©ïœdå^'%«¦ÎÆõ~H\Vi}; Q… >CîÀÎÞ·vÓ6½e·²†žÑE ÁÓÈZ\àŸ<£Ò‹ëÚþÎ_¶VRöÐqS››÷ƒ âÀ ʨh^¶Fù>L|UT;›Ù´æ s$chLJ6Æåû(ü%wE¦¾kû>1o™ ÄÞCz&Ö7}‚c3)D.Q ñ΃ð!1ÎwŸ¾ ü&‘–Ø©pHçôy+Šùùõ­]?þÌ^¸ìÎÃç)5­ýX– ŠïQÕ5±v¹ô"³¤î;éyð±îsبMÖ;sñ*18*éU1Y=ËâîÏ [úÆ™¹ÄvÔ5¶BÄŒ’ºÏˆ¸f 1àÙ“ç ™…o!œt¸iQé}4OšXعc1dÍTÈøÝüÓr«š{Ïå\#&sàØÙ+ÎÞOc2Šë>ŸAtÄ ¨ä×%5¿ ŒÍbåâ’Ø¥ vì4dàmßižþü;wÑrW¿°„Hì±9KV‹îRÑ9{ʼn Ö~þþ‡†hdîp7àY(p§¼®ÏŠlzòáã.@$¨¸Œ1Ìçä[ó~¤áÇîÑÙ«Dv©hŸ±tòz^\Ûöćpú• Ÿ{G蘓MÙ±´¿uï1퀩ïZ½ÉÅ'ÒðC×/áûµ,±™ÿEîW€…Ì"‘Þ¥¨v 3ɘ˜¬êÀ¸pð®uºûª¼ñÛˆÏæÊZF7<£ÓŠÞµõÏ ÞðxÜÓÿ64µéýGŽŸ½|ý¦gGI%Í¥«6H:zABbÿœÅηi»’¦¡9 F¥þ‹hqÃãÑó¸tH8ýI²éí°iÌ@ŸÀrø/sñ osð ŒÉ€Äf`9¿ìàñ¢Ìœñ AL [ë…Ó'›VÙ±qe‘(!q™…ÿ"¾ÓÞãqt:$öú…+6J+%ˆF@úq Q=GB<ßáÖ˜.[M6­olnKȘ–W Äß¼uÝG‘iEuíCt @ Žœºd‰YðSs1a†i›–SÕÙqpÑ„Å#ñÑÏãà]'¶Cþúí€ç)…µŸA|@ å\²»ûˆ$fß ¢£ç㨌ò¹™MAz`¶O/~éªR»•¯¹?ˆH.x×â ˆí¨To¡!Ð9céèõªfjÓP`@v\ g"&(4µ¹åÿ,)¿ºµb¤œÆI3Û;°j’êTbêœ%ˆ9exXgý—¦üpñÖ®¾a‰yU- >ËÖJíS?af{; "ù¿ˆ˜Fùo aà°–ðÑ6 HÈHåæÄöåÂPZݼšû¶¹wœy© ¤¬ú‰ ×o? gÄÃÉûItQÕ‡NƸé½*GO€ì@F¼¤‰|Õzñ –Î>!ñÙ•Ÿz~ƒœI@Y¸pÝ»‚ÿÈ Æ”¾kþ+‹M_À ŠJzý¿¤²pòŽ{ R16—S@|ï!ýó×þј\E}[ÏmÓzg`Ó^„Œoêg2 ¿êò ¯§±¯@*FçÀç÷¨?wÍÍÿÄÝñÞÓo›:àø,¥mdÇÍç •ISq‘”! çàùäEVyÓ·_³—¬Û­ªwî*ˆpâ´ï>xÌØÊd½æÓס?sØ©M뜾`턜ÈÇT\¤I²›Ù{Æd–6~aâX%ºû žéÕ[~€øv‘*±u­°7¾õÔ¦Av¼°ôͤâB£ÀÛ;% >Œ‹ùEdèšÚÜò ÄOÓˆ&V ¢± íý£³X—®Bz­Å 2–LñRz/ù‡ó×o?ŒL/®ïžµh¥ð®ÇLl€¡ ÿA´ĸ_Çg³- 6 ²ˆd„d'qÁ”F¶1½æð<µ¨®ãûJá*ÇLó¤ôÌ Béˆké•àà]/Ž›>{dçñ³x #(ÆSšè‘‰Í­ íCôl|›wî×1¶¾éšS9ƒhŠˆñpZ óáƒÔ¦¯8@F%e#K‡&HÀ¤:0GckWÿg ŸéØx7íØ¯s³èå"4z¦p¡ñ0LlÜøAÜ´³G@(’ñ=Ô2ˆ 葌’Ö ×3V7}Ã’òkÚ'¬Ø¸]Yû¬• qì_Ä—ß@%ó®£6mnK20«¨út-$.Ûdu@=Œ, !¯ºu€ *i¹ââ·òã4â9ŒþËžúùœüÔ¦Ï]¹qÛ/(:õZ5fø&± ”zx¶p€\Ÿ¿¬<¤‘–éÓˆÇÏCÃúÇr‹aÓ†fW=†!S À)òM'§N]v¼Ÿó¶¹obþr¡mŠšFÿ" ˆï9„ˆECs­X'¾SNËÜî–Oàs$ãT"‰n—?t ¿É#ÀàÒ ï 8ŸÞ?ó¸…¶*hZ8ÁW@›1xþæåOºyœ+7HíQÑ< §uÇ?8&%wJ=V aJë[ØA®Ÿ¸hïù4ħgœeÙú­ G â¿jDŸ%ÎZ°l µé‹WAvÂã3 Q$ .Ük„·í;ˆçt÷Aˆ¾™Gà‹¬Š ËÖm‘?rÚÂñÿS߯ç,Z±VŒ¶iXJ$(#ŠÆe†öÀ½ó¶wÇd–èc^ºV Íáf) ŽHždYB6 ‘¶r¼ë˜u¢âµ N©sÇ/8F÷ÜõÛ¢3ÊšºFçr­•’;|ê?ˆ*O DtõæmûpÓ@‘GÏ^fUü2øg6ÆR©ƒrÌôªûèôÒÆo ¹‚’ûOk0 ’:qâ‚-Öt&vjÓxþ÷ŸF%g—ÕHÐáÒ%!¥O˜u|¡oÕ6¶q xžVÒðõ×lNÉ}ÿêíÃÈTf>!ø$µé¡±éù•„¤¯}˜™I3´ÎZ»>ˆH-®ÿ2´d„¬†Á%‡DA ¨ŽfÐD¦ÍŸÙôMïÇ Ð|‚R6—ÄE‰¶tŒ—&$¶ß³”¢ºÎŸLkÄeÕObøñäEè[¢ÒØ–Ãq‘MÛÃæ¢S@Û(9Ú´R©ãKOË?bhéâž\X×1̸xµø^øQrü…ýÝÇQé‹y©MŸ‡OÀæ Þ6uŒÏfÇ/RP‡2âø<áUÉáÓÎ÷Ã’ jÛÌZ¼JlRjÙ4¢ BG˜Á‰k™Þt"”éfÐ`B)êt!Bb€Rê§Ì|Bóß}bX´J” ÊO#ÂÁBqËà€µLo:•±o*éᥲŠkÔN^ºq/$!¯æó=;¿èîCSIDC”CDèƒ3W¬—ÁµP›F2~¸¬©=¬Ôñ#§ûþЉ‹ÞÁ/s«ÛéÙVŠìVÕ¿@1‰æ.EÊðø7n•=›¾î Ç•ˆdDÅ$q9¨ ¢îâ ©ž ÝÑA}3{Ï øœªÖ:¶•Â2ªÇ/ØÝ¥!2DŠòYkD¶+¨ã¦oC¦¥"A$ØhqÁTGÖƒ·Ѓ5=Ë~Ûò}r!Ÿð®ƒÇ/`¢ÿ‹i …Ý)S‘Ƶ2þeæ ôÍ€F€t$€Šî9Û»±¯+›ûÿ.àÝ ˆÿ?Ò±a ìŽlhœMÈ8—cF—l]}#µ-ÝÊÇL¯ÝyüâÕ›O}¬¼›v˜£ßÌK)yƒ§¨ø×ÂÛåÕõȦC^¤å#ÿ€¾­“Ø¥|ä„é¤ü5ž…’ŽÉÕÛb@ ûþ°®@Äs×ï<ŽžAO£Rrß4t|‘€b+‡{ÎÊé.jI£¿Ì{5N[¸ø>K-iècæ’þÄmŠÐdÜô OÊ—£m:46£°ú#쎅“–F—þ˨Ýj§Ì¿ÿ6 »”V†Ø»O!r¯ß¦¤uÖÊÕ/<¹@éÈ ²éˆ„×¥um½£³rS‚irÅá|î—AÈt™C'/;ù„%Õý5w) âèÌ2‚(´M Z+ìÞ hŸ&›ŽNÉ«l2Î]LâR{Õ…’7Èô_Pßv©ž¸äx/4©°îËÈœ¥ëÁ˜†ØƒˆÒðÿÖ·ü#RŠé¦a1 ;5Í]?é°JHãQ˜Û»S™N#ýŽƒúox‡$ "×Ú­ŠSˆÈ&@TÖÒ…¨è0nÚëQÈNýç¾1&6Z\¬i¤oéþ b´z»Êñ ^Á ùµ?gsD·‡4~.߀çJŠe±núþÓèTÈÀ/@Æ%Ðù¦CJãßRñÿñ—Þ¯{äìeÞ»Ža&NÁ-ŠZg b9…l‚s ˆL/!›~Z[ ‹aX°Lã¢ozjmu× —ÊÇΜÅçÖ´3-Ü¢ðM¯ÞÆlúñs Éûv ã"Þõ’—Óf×nÞ ŒLÊ¿íÿ]‚øEÓëwŸÄåTþÁ¸D@J–•ˆˆy¾_—ð3£Œl:(& 3ðÇä<®U›ÿÍËiŠnÚ*¥ mríN`lvUÛÐ,)ùÄÿ*Ç²éø¬’ÚVàñÂåkAŒŽœ·qñBê”Õ·A‚tˆí”×:{õöc@lœµx¤üÑ3Ö·"M‹@ÝPÓ+L©MçT4t9ø6¸@JûÇ€^~À\²¢%.wôŒû£¯ß¶2¢Ü4"¬qMA‘ͨMV}ú6 d\#BâbEâÙK²pÈ¢Šb²GŒ¬ÝƼªl _´ZBîŸ5†Jæñª†9n>[×d’H`\¦³¨©**²÷°¡Õ­€è¬7Íß "ª[@$"N°®ÀºsÁÎ+›n:9÷M#|ȸi䋱%9[¡X— àÂ…÷hœ¾âú *³¢ù;û*ñ}ÿ"b%ƒêëõ4.§êlúÄô’‘[P ã‚)™LÎv|IôÚ›eÔN@FfT|êŸd£!>ˆ¤vÍ»YFUÿ¢ƒÔój|— ›®ÿÜÿÈ(q9RëîêVó© p)–tãw2°pñ{ž^þ±o’_Lö°‘•+"~ìXÀ+,3ÕsÔÀ¦#“áÀ¾ ýǵZ>‹qñÄD/O} Åù ;UO\vöH+ûÐ÷w!"Î ò ï>4Õݺü"r­bʳNb7Šó¿O’¯‘W?n"âsÉéþ³ÔÒ½®DÄ+3ˆ"»ÕNÂCônµ¸é×eæp¬ÜHÅåÆÝ€ðÃ_c¶NZåøEGŸðÔ’¦ž‰+E÷jL!öM,äÙ£f€‚œTP爛þðÉ( ºS ãróÞ“¨ê$X81-¡G°\»m¿žÙ{a)%=XùþE„%‹îQ70wº–\X›–ôŽÂjÖítΘÛCÕÁ´léý ¸V\f¿æ)³k‚[•u/8x‡&7t¢T2Ë÷ªŸ²pö O)zÿ <áuùûŽ f\ Ä…Ò¢ÿaèYK‡5[”Ž·÷ I*jèŸÏ+²g ñ"Š‘Ré÷,µ¸!02%ÿíÇo?錰2Oó¥‚õ†Þ\-© sÎÎ+8±ð=…¨N!zbèO[ÞôÃr›Q\ÛÚ,‘ØwHÏøŠ£ÇCBŽï +7nÝG•¢U >¦¶žA …õß~Ï[!ü ¯ÜôÇ–t ƒHF‘JG`5®>O u€Ý¬ËEiK¼Ç/.§i|Ý#(¡ þ+"îV‡z™ùO á”}€MW}êA2Jî!q™I"H@·cg-à/ùÄö={íîÓ—ùu_ÇXx6ïV›FÄ4§„#*³üclfq]|˜cå¦mòêHi Î[ŠOk€OÐ Ú¸Ü ä‘=ræê'ñyµ_F)D „ƒ7·‡ÑYŸÈœshr>™}iRSɸLPtd7¯ðéŧÂ{ÙÜŒCDf ¤Ä ŠèqÌ«7Í©°éž_Œì+@$éB\<=Oê »ñhŸ€%‚-ß¼[ÃÐÚýqlî»Î_ÌË7M!¹„"¡i 5ãÅëÊ–Ì’ºÏßÿ0/Y%¼]ñÈÉ ×\QÜŠjZà[ØV¬—Ê]Æ%Æqo’Q?måö(6§¦ã×Ü译RÐ2¦êZkwéX¹×Jì> cdŽC „lŠòø- 'ÈÑF&/Û°KíÔ•[_dWwŒÌå&âFCdX, ¥ˆ•’ÔÞ‚êæžQ¦E|·Ê©ë›Z»Ü{ZP…ú»p9hÄm¨bîØq íT5°t}“]ÝþsÎbTæ›D¤ª9éhÓ¹5";•5Oã¼74©ì†”–µ„¬„%ær®ßqð¤ÅÍ€è×U€¸lãN 1ëMË ‡à%s¶¤‡yÓôõ'.Gr¯ª®±¥#Î.€:•¬•»U´©yo\VÉ’uÒN˜»<ˆzõöóðœeþAœµDp«ô0ž¤Ïªn雽xå&i…Ã$.Á@ÐÚ¶>`7¨%(­©Må9·©è_vöĶáÙ€¨J!VBC°dí6e]”è¿Â¦ÉØtz”–˜ó¦ b…Cn™©±9t‘ÀÖýÇ/9ûEfU¶ý˜½ôÄ!FNO”º¤Â÷ßš¾ýœÅdܧvãò4&½°ÕrûÔôL®8m«lb_³EYïóÌ7­?˜– íøzA"Ç ž]-°Á%èÀÉ>mOæÇ€Êš§.^wÃ%‚<±­–RÒ5sôÈxÓ:DO"â+X1­d Àww NÎ2î9xì,‰ G÷/²lY¢mžÔ¿.X%¡¨sáÆýˆŒŠ–!F.b4œ* ®ß~@ÿ’ãýðÔÒ¦Þ®Fv^ˆÆ‰óW]}©ôÀfNÔ¶£§ +ò ‰…Slëc])® sÞÁçYzyËà‡gÊž¸ääû,­ìcWV‹â€œŒ“r+: yÖOÑ Ó–øc>Ÿ˜¼ö9û{áiå̓ŒÀÎ)Äψ¸óàÉËÎØ|ê¢c]¾N 6ˆq ŠÁ©gÿø\’æf×ȉÈÏã•Ó4µóK+k˜Å¹~ûß)vªž4wñ'9ù‹‰òG`\(ÇÅ×ô¬S'‹ó?²Äa:æ"û4Ml½ÃRË>ÑÍ)DÌ ZNfU¶ þ!ãè©UjAÍÿa|Åø¹<Â{_÷ M)ýøaɺíO˜ÓrtÛ,×<Õ!úsÍ#8¹äÃ;F˜AÕ A;_ .Í[*(±GUÏÄŠ6ÕŸ™ÁÑ‚ÿ—¸€›qé £«wƒ“Š?ôÓOí´­ãÔˆ=FSúŽžt™@\ ¥‘:„Ý –çlnúM/‘—Ð.u#›»A‰ÅMýôk¥©5f×tþbê5ˆªjKhsˆ £ÉuµÈN4p Mu—¸|-çúj†Öwž&5õÑD WPôšÎÑy+DöB¤*ïoîµ’hà€¸„BJ7ßÉz)YÔ›÷hK‡%n¦ãX·ãÐi«ÛOŠÿAÌy÷e¨* µ»è`ø6nÇÉ1ÎyS P,áÓ4Ñ¿K\'9¹xívÕSVîO {é¯ý¥!ŽÍçÝý†gpbômÔXŽŒ¼²J‘:ÀnI´tXi+~‡)„5ìï"AéƒWÜ_6ôNN!Ææ¼û ˆbrZ&¶ž!IŽ×oÁ¡,Oæ¾ýØ=JRH‰fZ¢-ІÔÞ vmNZºÆ ¢ ô“ˆ˜[ûõ7ˆˆ¼6$hhJɇ¾IÊ$€qI/FêÌ£<"ÆV8žL/šZâ¥q¶Õ[UNXÜzŸßÐ3…ø¿/à—×AI-ûø~fö3íYÚ¦p„°) E½K./r뻦ãóë»'ب¢æ•õ¤Mñ(Z-(ÇP‡x NœGŸÖKj‰l8¹`Êo‚î)O -ƒ¼ŸôÒsnÜ}ÄÄþþ" ÑÓ„âßgqmØ¥nhõ¢äC?Ã|+÷ª¢©ëúŸˆ²ù“H‘Sœ*á=tK6¢Ýýç¯j¾ŒO!&"©@PÓBRJ¡’s]%v“šÖïó¹×e#æÊÀÂ5mAxú¢{’CHæ°±Ï "zbÉÇÆ¥P%¡î†¦Bÿ´ ¥hVZ´ U„L$ÉÑl„F4ÉD$uý]¼~—ÆYÛ{YÕÓˆAI%ŸdÓž#ƶÞáé­?æpãP:gÚm¢v4â_óÛÊßñubѺêg®Sˆ â ¤ÒOC³¹7ï=jbwïYFeÛOfžÛÑYÔ1ÔÙ´Ä×ÒÉûé‹©%™ˆÖA¤ò¿üa_»CíÌuïg™Uñ”ÕàäÒæ¡9Ë…e÷Ÿg½mÿ5ç8Xš3=Þ¥ñ—Hä˜^•w޳ n?dt þžF,kù1—“é†oä«êNÐ<|ƒ]Ó60ÉʳaèÚÒЋ9µDb°"|ï[( }ÈðªWø4¢õÝà”òQy ˜L5_@éGg–5üã AÃHåÌ©ŠQÑÔ>º`Í6ÕÓ€˜ñv1$¥¼dNL%HO¶5! ¹UÒó¸×c} R’æ*Û$MùÔG¥Õ~nûźzëÁÓ6žao;âi@L­haáWÔ½RL‰ûó´âúΔ1D×ÄÆ­&Uz.‰½‡hfœÊ]­#óWm=pÊÆ#, JºGhÚ›Ï#óVJ`¹À’Ö;ɱŽÌáS£/ƒKÀÎh¢¸D6‹”#µ}°åç<þ-*Ö¡4DU@ Ä_óù%•õÍAÏQ‡8…’ˆ‹c!qqÕ ^¨ßÌ\hÕ§¼¹h{lfY)¥b`u74½r Ñ3,½²}”Êî ·@’ãK7d”5~ô„¬ÎvG¡=–ÈGØiáäE³áÒúÁÌ'¹ÿ¤ÕÝ´Êv‚hxÕ3Ö;¶Zƒ“WHFbþäTµ|Ÿ²\\q¹‚ÂF["m°Oc燡¹¼Ê'®ÜAÄ1 q&î„›Í?€íÅõhZ%¶ç>ۣȴbôÛP tÆMY¨”³Ø›ç¬WÄ`â!Ãk„›ãlpÖw¤7ŸzÇ‘:3âÿœšëG 3M¸³yÄ•ô-o§¾¡IþTCvB.Á (AÜßµ1°ó‹ÈÔ;wýöCÊD§¸CY{`ÈQh‡ ì6ô3-Sr Õ>D·ªCmÃRay]s·§)Ÿ)D[Ÿç¯k»'—AµpðÊ®U^·£ob>φí8R‚ò0mƒš¦{±j¡h¼ë¦çÚ,§{y q‡ÚY[ŸÈìº:Î{Žž»á“[µHH†Øöªý¯ñ@Ãà"e%¢ªé¢ãܼïØå[SˆêgíîGåÔ÷ÒsmÚ«uÞéÁ‹¼¨À÷ŒQÓCÚ¬2rÚ©E‰¶Ð íS¯þ6¹dÓ>K·ž$O#úFå¾ïcXºyŸ¶™óø‚&è„eéØVŠÈP3ý˜¬ò¦®ß´€™¥ ŒÐ°AOYõõï’²:—\)DÁêÆö¾Ñ€8k™°œÎÅ›^}„ÞHTnPGþ¨‘¥ 1jÑØŒö´)“çw´¢t¾ý2Á±a¯öE@,'ˆÆö~1yHSyÝË® %Í?æ®W¤ËÉ@‰rÚPK‹Å5ÿšÍAœ„¦o:ÿ,Ä›ˆÈ&¸SÃÄÁÿE>¦’˜¢ž¹Û“¤²–Ÿ,+%•9€:hçð MÌ«iƒ%òQK„–‚ÇŠV0Ðr#‹ŠŽñEB{´Ìn&Qˆ‡Mnø¿( Ò]ßiÚökþª-¦&Ñ£2J»Fç ×‚ø‚b©I³î\/oÿ;~·& q!A|[ø$A*a)ꨠñ+!·ºu€œâ*RŠj;¦È ùS [·[ó‚Ëc‚¸v×aSÇ€¸¢ ›R(íP~°ïP##Y·€ÈôÒ†o¸Ä)¿:Éz³L—‹Ò¶Ñ…keŽ""‚¯Ýuã‹> ³ðoòãžUýu™Ã»qTãE̘âd‰×Ü"Ó(«ã”yÒ¿¤õ,ìèùÄsNã‹›Î[µUÕðšwÄ«w]“K6ì9*¥ yÆÊ4¢äý×_s8a‰ BN÷‚_¢û]x>qô~ZÜ2²@pבóÎ ¢ÌÑóÎ^–´Œ°®©¤šVYíÓ3´–ï“ ÈÏ]C7&|ÃO&`Š;*gQó«ÀÎ#çœâo¶u1¡´õׂ5ÛÕ }ìŒÜ"òÇö1¼BÜJᅩ̦–háäŠq¢ê2©?¡/ ?ýœ¿fÇásN4D¤Ä28] »‰ƒPó;Róø~´›<™±›+Ç£h ­D¢Y {ÌüÃóÑ”BdGD5IHƒ„H8¨¹ž\XO-Qþˆ!ü?a;RiÓLBæ5ý`Y½]c qýn ;¤8°ƒa_ a×vSþÊ£wÞöúWšPÖÖJÉM9b*r‡XVIk˜:>¤÷h]t}šò¦rs@i+iÛ!£“—}B“ Ðóµ–xÔhF4zö•XЈk¤<§ay•´º‰ãà Qûâ­§©•Óú0J4î,ÚWÐ3ãXbÚY«øÐ3ÎBÕ\ ôoͯßÌåß6…¸Dã’[PÚ[иM ÃnA°\88Rô$ä×vÀ$AÖз1e*朠ÌÇÐʼªÿ>gåV5ãiDËnÁéUß&¡VèYÜIC¹Ú£yÁꟉ1™ïz@q€¶àÏ|ôhÏxf³êú â qƒì±Ëî!Õ]ôKEŽ[Þ Ë¨ù6ɹ $ÙÞ _Ý·3N-¹ Í›‡"÷ÌÚ¾Ù|[ßH(k_ ˆæ·C3kº¸EOXy„¿ªí¡_& å—L»hcrX¢½ÇÓØìÊæï¬ Eüš;„¥{£Œw}L¼R‡ÎÒ7ÊêZÜ Ëªí™µ\\ÙÀÆ+"»¾q¹˜’þ§ñÄ}ÀA–håê‘ZLËpÂMâÁ…oH¯éeä•R=ë@Cܧkq7ìU]„Ê©k÷"s¾Ïæ•Øo`ƒþšÆîñù<¸D3{ϧ”£l!ß”£lªž¥U÷ÌZ!©z†BäØ(§géþº¾6¯ÔCÛûÑùMƒsWn9hx}ÊÎ@Ì(BÄļtÝVE-ø¿gÉ…µh·æO­êžÅ#yBüñIîøgÙï¿ÏáÛ¢zÆÎ/¶ðãð¼ÕÒjgíÃSŠº~Ï£-„6:†E´®À ¸ jó— ¥¼íbà‘˜A”×·òŒ@ÚóoS3vxjÇ*°ã°‰ã´›—x ¤¼Œø „¶ïסùL(›§Drå7úåŒ$”uüY²Y^ßÚ+’¤æv ¤}iÛ‘8—¤¢÷߯X–oÜyPßÌÁ;8˜ HâNL ŠÍ®¤7_é¸ÅÙ#âÄ’Í '¬½£ò>ü çü8‰ÔJÈÇ[Yh„i{ÄG´pƒJæ#e¬J¬˜B| ˆœÂŠ'mîEçüÉ*¸ëè…›OR ×l’Ó5¿]Pÿu”™,ñ¢ÃL>JM‘½°®s˜‘Mž _&—‰© b9 Š(\õ‰)ü4²pín­‹·‚Òª¾ÑAöi#IjÈ•YA©tBÈ$¬(Ä(“/Ë;ÿ¢!ìþÄ%¢dpíþ‹¢–_lë÷è@>f¾ë™Å\÷®ýò‹™›,ñƽPše ™s–ª¸ßFç.]‹ºø²Ž¿KE÷O!Š*Ÿºî[Ü:¶H³'¹¾Bò€áõûŸú'ÙWÁÏZ»=ŠA‡È$ÛJQ´ 8¢•áÓh\iû×4âRQåÓ¶~q%m¿!{ô®xDdƒØ­Üzè¬ýƒÎ‘¹Ë6WÕ½°¤Bt~¡—Œ8ÑGˆa¢K±%í¸DöÚ!âäR±ý§íüã™K€™ÖÞ‘¹M„G¦Žúpœ K$ƒ]Œ;û*qœÀ»ø†§ÐФ&ø‹âÏ8E”O"ÆHœ:Q*êW}¢ ê;1ê?ç,Cï޽’iÔÜ1mð$–Q4¡šÙyĵs Óé–&öRêD1Fëvƒ®ÿeÃqüYœÏxÐÃa!n7š“,º°õ÷’iDnÈÇõ¸ZØiª0Ƨ^Ô œhÐ.ÕT©@¦ÚKsµ¨DT"ˆ_é¹%žu|œüöÃr‰ƒFëåTfZy>_Èó}›Û¨AhÒÜ‚f7bïœ*¸Ç‰ñ62¿eŒc3A|ó•~¹¤ª±S`JU7ã PaÀ~ƒûŽúÄLúž¡ßä+¯Èn5ôÒ@Mí³6·@äžç7rlVËýô‹†XùmÖŠ­êçngÔ}g^µã¨™[VJ¨æçœSDq‰wžÄå¾ë™³Th»Šèn0„ƒ“xé¬qÏ% á9-BÄ€ÄÊ®Y¼Û`e!Yõ,kvi^ºöºae `ß J—Æ%¢³è#¦£ø”-‚¤#?•ްgˆ{Xö‡‘ENÙ""#ï¶ÃÜB_5 ÍÜ­m~7"·i˜UPFûòí°W²d‰ñyµD1Ð6Iã:3÷†í*º”-­òS_è릟ì1ém7Ÿô3÷ðìÆaÖu{u-=#ó?°­—…?Eä¨àq^J\ Z”7¯ŠÙâŠ4ý!¯ÿA\¹ýèÅÛÏr>ü\(´ï¸•wLQëØbHpá‚#°Äi¯‰ŒÚµ"Òˈ㋸©@‚ó±R¿jfÛ@!öÌæß¡yéNDîÇ_ìåO\½[ŠI¯tê:ÈÑñKN~Ï3*šˆáíA/ók;Ñ**½ÿعë°gªÿ Êj^¸AÞÀ6 ¹ªgÿN­Ë@QX™¢Áu?cLžŠ³Wï>M(¨ÿö›ØŠ ¯Ð|ttì«Ñ`s÷ Ïb¿™¹Ÿf¾ÿˆv€Ø;gÕ.msÏHZªÛ$U"éI½½äì÷<óMËÔ,ßá^(„…p’߸çÚŽa(=O2ê‡âÃäê¾9«et,½¢‹ÚþpAé¹ñ(¥ª‡‰ ”ñ—ˆ>¥±¥tË¥ÔLoeÖÎѶðxžûánPbaC÷ÄB~ y-“ëwŸ¾DfÎåÞ°ãÀq3b¿%fYHžGiµƒ¬ëå(DÁ½zÖ÷ãÊ¿0@:ž¿úºqxÁ:Y= Qa‹då Ù5í !^-ã«wP…[èØùá÷QjíA|”úî;ËZÙãWý^¾ùÆTb"6ÈŸ¸æ õ-Ç ÙWK)¢÷‹r“÷ÀsŽ‹DZiS­|˜únq`ÞÚ}ú×ü*»‘˜—ï>/hùÍúøækÔ«*2$ß­~ú i†3•VÑ»`ï’P€Ì„ú­¤mòîû|‚˜V;0ÜÉëIU½sWïÒ† žà;pÆ10µº'©¸©—n‘ÀVe]³>á©¥°8J`åq§*ý"d¦¡åƒä ñ19PZˆXfB$ ! άûþºº'Ú{Ÿ™šh³,ß$sÈÀ²÷ŒÙ(úqÃ?©ºÞ:9ûÇiu@#…Söx²óð@}_V|};læÚ#x޵Û@0€ê4³Žò±óv ’г†`?ʺ_âbzýO;ŸàdO^H2] 4ÿÓhu'´qüì–¼î? €ŠGÎXCC{bÀvZAßÄ* 1nT2r¤òRK¶O8m:þñoüDÿÆÁ—‘êP'Ð} aÇRv?¡ª… f¼fÛ¼ÿŒSPVãÈ¢ÍÊFŽd±ëdõ¯úÆ—¡ÿ2F¦Ïçì¼ÃR ,t‹Ö Ðñ "L¨Žýùý—o ¢C`fÃOva•³.!¯?Œrˆ¨œuFYbé´ƒèw3 0r ¡íËíqlní—14 jZ¹=„=ƒê’òmBž—}^¾íÄSO2F‰0¹šóé7§˜ª©khö‡_‹…q±iµßY~/à— FÅé-ƒ¨@Tù¦j#åBÄÚXv/¾²—e-"f5þZ,zÐôVx^ËŸ¥’jçÝŸå5sŠ4q Îjø±€iéF #›; ’Zz{àž vÑ Oa½wÜ›f@¼ñ4«i”CìÐy÷ˆ‚¶¿Ü[_¼YR¿à†õrñÂÕ[”_"­Ï?çro’Q#´¬ ¡ ûb\ÿìõ/âqµ ·#‹ÚéVl;jîSÒI¿Búèå»ý‡‹{óž#Æ×=C“K>ôÓ-Ü ª ]ì¹ï/UlIcÙüÝ+¶‚B zõaŒSBýâݨâN¾Ú–÷âÊ¿1ñïÔ¾âý¢´“žG`› ëæâXˆyÔ]“ÿ©d$w<_TtâiÇ ×sIi\òˆ)ýÊȿ똵oÂÛž¹köè¡u3ñãÐËþ^x:e§BeÓ!v*4‘…PÍ´Ç‹r 1øõ§ñe[Ž˜{Å–wÍY³çø5’ñ 4å¤\ñ– 6´cP/°ÁXMª÷´WÿnLy÷ܵò€˜Ýü‡{ëQ‹{ñp°‚ûN€Õ A:B)‚$’Ã)ÚóL ðžÃg¨ê¥‰yÅ5 Š*«îÄ”u!¢SHNËÄòmšWî'¼íŸ·^þÔ èÏÅÂŒoå—‡N[ß J¤ô­~ÿcøšî+…ïD—"¢¡SHnË_žíÚV¾I5 6(9gãG^æA%Ž™9ûãXŽ–Œö÷ÂpÏŒ[)C/Ð(&ãí( Ñ94·urÅÿ”Ú!¶Í*Æ®aÀtàå%èâúÛÎ\ó M-kB¦«ZƒFæC;Àʇ¢‹‡ÈµVÉ} 1,¯Žo—îÕ€´úáE"ϹG¶Óñnײô‰«èbZµ‹f¹˜`_C¬ƒþ4{ãÆ‡@ŽÐ?õÜèYò \Âò?Ó¯”9~ýQFÃ/`ºÙÝè’/Œ«dôlü“@Öî³ó~–Qùù'ÍMFy¿èéÊ@ʺM)šÛó’osÖ*¹„´3ðïÑ· Ìj[*yø2P¿{Ž€ìÉ©˜»¾,jê'£üSH#ˆó8ëJ19M`zölø¬ŒÙ}ëy1A¼ù¬°cÖê½'ž¾þ8νUÓD©oÞzCÇ WM¿8DâüÂÂ/©¨kæä‡Å›d7±½@ûZ÷ëž·s(þ ˆgnF~aZ³ïÔàŒ¹Žµ_Ò»Á…›öSZ&¥A&Ðd¦î4ØóTÙÏø·O%ˆëϸF}- wÚ)”DHïDèçbQÕó¨ôçè ùK\&S P4mì’‹ñ¡ìFôÍgEˆxvj÷.á…í³ø÷œ° Ìlå’Ô¸ä[þm6deZEÛO^1yéÔYŽv4x£Y¢±Ô¢\¸L!F–t1ÃaͰ{YÐ"ÈÊåÛ´®`!‚:]Ѐ³Ò]êFWÑ?7ãñ#ÎÆ³ñ‘ìøÅ ¹Îá…ˆhìUÚÍ"¤lâYJØä:ÅÏÔ:d¼IUÇØ‚URÊúæÀËÜ?‘OxZâb´î£-…¨dì]Ö3oƒŠéíèòžyBJÆ·"Š:Wï=alå”P3û8ˆ~P4ŸˆLä%ð^4£ëô€ø0OžñªÂ ¿¢‰{Ly/ë¦çïÆVö±nR9w;ªl:ßQA,¿M,Z»]å" =ƒœ„—·Å¢×…Gx7ô¥Ðš¿ªl!ˆë•MnÇTô/جjæ_5À&¬jæû¦oþe\kÃJ½kh-¢&ä¹ußþ°­¦üI4ïŒ=ôcŸch"šÞyQù}¡ˆÚ%ï„wC‹ÅÔÍï%T² ¼p'XpŸÁ zÎ »Û¢âóó èWÐ+JŒcXut¡×K)nìþsƒBÖ:„ä™#´ÿ¼G|õÉ£VқƗïе}üêÓÄŠº Ec\RG,|¨¹nXú›Ï#@t¨÷Ñgüc6væSnS|¡U.x¾¬æÜ¢eó0ëÓ¯Œ¾CPN=¤ü·åïŠÇ®H(ŸásÑL5Xº±F`Oé‹OxßÑHoœÿe. z%¼áÚªs-ðu ÿÞSNaLr†”ŒD’pdê•];mÏz—_ß5ÁD×95¢úììqÃ3ïĺ_ˤuížæ~žµFÎÈ5’RÈh Éyæfø´+‚…O\ᘙ“öÑÓM*y#·ehˆï%Õqï8îœß1{¢‰{tEëæƒ<ãÞ~_¸ùàù»1º—p¾Ùôq鯓Îìe›HѨP( ¹° Bă—|’ßÿæÙuÂ1¬è+ó•óz Óý¤ºá%‡Í}ŒíÐø™#(­z MEÄɺnû¿.}ÒõĪ—î§4þáÝmàü¬¤{þfÕK÷kB ¬Ò›~sKë\ H¿r'½%36¿:âTÖE»zí¡Vžè®å}aÞ¨zÙ7µibåÞÓ®‘å} E5,|S~/ß¡gû$»•nåny¶s@\aå%3µ¿ÿ<« XdjGUn"?øèpý) n:dî—þq’ß·èÊEG­2?ýåÛcàˆ!”‡*TD™­ÝqÈÐÆ#$*÷lîM»¡[¹‹òÓƒA'=êÓkQÍÂ?ãýjyã;±Õ?–lÕ¹˜ÝưFîÌ­Hи*çï¾x”\Þ:2o%åU!ž9(‹è™{ŸW÷õ7cñmK`Aܬfù ³…A@ñœÇËÚ‘eÛõ ä´ldÝðIªÍoì‡=Ï8òØÖlÙü²Ët,€\’F¯>ÍûʲYýJÀ«VƵʼëÇxdN:…wÏßJªÞk_}˜ù§¥”IË+äç×<>´Óßðý%¦R±òê@Ö°zøúóìõ*} ä| Š~6±ÃWüÓ?üY9œ÷¹ };RûQ~ Î§—±­èYóÀ,|v:aîì÷nqžÈaëÇ9ís7¨’­–?{ûEÕ%[´¯f·2¬† z^ÚÕÐÏÈ-,§cæ›ÿ¾—n Ú¡m ÿC;ôbts^„GPÜ~ Ñ&0·dù «…APùœgBí/Ì BHúýç€ï_ÿ,Z·Kƒ2Ï}=;p 7æöÂÕPÄΣââ³ A=B–*¬aý(»}¶Ðjó{Nß|^Þ»@DÝü~ÊûQô*0ø‡ÊùAt6ôù¬|âèVöB·2tÖOò¾Í;zíiÁ7Vü/—nÇV qHi]}ôªyǹº—\¿,ú0ÀĽYVóœýýì˜á¡ûÈ´E›•×:5¯u/”в .ìš/zÄúqög¦uû1ò£Ü;õo„tÎY¼N戩ƒ_4±€¬ß¥N:Ôòl…d4¨žDàqYŵlCŠ{Ù¥tìÃJzÙ$´®å¥`©˜H²F· 5ðo9xúª×´sŽ8‹Ñš¿~§ê)K¼Èô®óö*Vy]¬Úva¥ý‹·ê9F”plÕu+éY(~Ôæqv;ÓZåó/ßýäUÐ3w{š\Öú“…mcÄ Ý3‰ž`ê>ÂÔ=&D\ ¡ã^6°d»¾Kdå®'œ#+ø˜}œ,Õ/­ téèy§€X´”p Ó̱ホ/õ¡ùŠizN"âBÉc7žU rí4¸S=²|÷i·Õ?—í<éò¼üû" -`e£ ª!ú~jiLt½íÀÄ‘§n¶à]|vâò•À¼î…RºŽÏ+‡¹eN»Ç×þæÛwönBýo^Ù3î±Õ?—n×w +†¥ê[¢Ý«cŒfrCCÖ0Ú±O+Ç+ ú¯æw³mÑsŽªáÙ{ænbÃÄ*ÅóÞ©&×(žóJj€”4r‹y;È!u ÍÃÌ|ÊúnO‹?0_è5èxK¨Žw¿$AÜzÜ%ºz”wŸ‰WÊzA•K~™­Œë^öËhfT:ïEÔÃî~t؀rF.&À“XcßäôË%@ìaßvâæ‹w¿ùåÏû¤·0 ²|”ÓɲYr½ÄØâAf3ý°Ìšoá•Äê41íù/hèþ˶FJ‰ÊDK@\$}òV\ÝŸÕJý²>3o>|õi!Ð]Û.¤¸‡MB“(èFÕ'IŸG?ÅÊ);},Íï® sÎoZ>.è]¼ÝÀ-þý_ý—r¾ÌÓ² +ûÎ!­ïüüÍ×v}§ˆ²~vI­ØÂCÄâ%,…”0’Ú19ïh× ÉÀF‹Ç}‹wœºÐH·î ,¸‹MJÏ1ò-ÞÐ=®v”w¯‘{\ÍP)»®wÖ2aLmhU> ÍáÞÇÑ/ЏLygn6ô "ÇNÃ;I„Ô¬ƒŠû8¤OºÆÖŽñÉ™z%7M (¿—Úôw•¼ñÛ/‹…vkžs|Q韵tÓÞ£¤ƒ~Ûþ‹žìŽâå‹$¼|añ¸°É.#”OL›4®…– .•1º“Ð8)°ÿ’_VÛì‡,f·ÏR½Ü2B|%èTAš¯ß¥õ!ý °r9%>ÔmŽˆÈ)sÆ+­eŽÈQûˆÊŸ<²&^©ÍŒÔ¬ói9®u}`¯¤ŠµgXå;¤Ù,²øJ€zÏûg¿ùãÂï\»Ïzg´±ˆi;FU­T0ó}ÕÁ"¢iZJâõöÇÒ']è—N™ñˆË‰˜-“(û3íÍõÂOÜ<°h`é^cŸÌŽù’º./ê&T,BªKé9Qit'áý~9Eë÷h^pyô²øÓ¹¼âJDZjS.ò]j´º V(.‡ˆËdM}_}Y¸UÿÖËFúõ‡¬Ÿ_²ã”{üû‰ÕJf÷30̬‘V7¦¬4LÜ"rÇ.º<ŒËo€ ¶žB¬ð%K=˜nX<Ƚïœö7öíw’?1m>bV1¼|¯1ž¦Ð!«Ç È¨ñ’*§®z?]×CϹq¯&¨YLn]÷ßEèîǾ"Ÿ”O¯Ä¡åräõpì2òLkcÓqŒªùͯxÑÿu'°Ý>¼|sû‰›Ñòz–wBÓ«€Cëv6&ž÷©»· Ý­ëGÀŒŠóÀ’< ôqí1öÉêd•:î÷žn­ê•'…½‹¥O¸¾}“3ñLÒ2£ÙæˆéÒûY-WoQ!÷ZrÉÃ1¾i4R2¼BñÒc8Í}çürºØ·Ÿº“Ü|A»m£ ºËhþ¤t˜Wp‡xÌ`¥œ2gïe´Ï?æón|•ÒŰwQ-ÛÐ’ë>Ñy”Sî6•ÙhSÆæ4§ö+XÙúƒ‰ËüIÙO¾ý–Aå?ù”á Jçý³»Ø¥ Ü1/m‚Šû—l?éú¢ÆãÙ«Ú^ÌìË·ž$–‚öòŠá”D*0 [ª¥ÌŸ–ð° y3ºêÀ•àŠŸ|J— ç½3>³ˆé܈¬úÅ»ÏÔ;íSp16îÕ6s!Fr_°€ýfå—Pœd˜?-ÿµê uØÛ߇®†W­9hR>¼Báb@n÷"i·—D“å}E;;v SÑ/ú5Y¡¤â«·íÔ«Só ŠÑÕ‡®FÔL¬;lYûw†mDõøšVA¥ƒÜ{MîÁJEBo†ŠÐF†vbAcí¡îvÔ|!+Ä9u5Ï"¨bL@ízd-ÝÍ/6i9¾xO/tØ6¢jlÕ~óGù=”O4ÌåÛrÐð)±tœö5u¸ùª¦sŒ¬§bóB-å,6"7:ðµ—òëw_H¥Ñ2Å&Ò"¤ê¯–KbËü­FÞ¯»—ì½Pø}¹ÜÅG…ܲçý²»m?u;ñÃ,!ÁhiL,kýźzÍDÞ[VΦñ‘<¦”Z†VOnÔqMþ¼p‡±oÞwn ÓÈ*BP•+A¥?xä.øeY(%­frãA|q3-AË+;HâK(®JÇÌnÜ–VöÉ2´†~³®[Zç"™óÅÃ|*6áÕÖiØGÕÑm8bùnBPÕ&¸lˆ{ïAC;߆æòaq@[>Iìý9äùz³B†ž–aï„ßÎøÆ){)°|L@Ý>ºa–ð±› ŸæŠ¿•ðqŽˆŽSLÝ„àAʆµB|Ê°Š®ñý¹äÎÖVò¬D^›Î¾^;Kô„GVÏ2Ky>.xèZxå(ÿ~ó§©o¿NÒlÚÉåm#ð}íž'ôSù´Êeñ~®”‘oáÏÕêŽqÍó¥ý ‡øØ<{7¹QË)®‰IôØÍø&ÆMšI86Èê\t L*kÀ-*P¹èñ±zöššxZ?o`ÞzöAÉèÚ£7“:í6{R>¶öðØs%OÞMï`Ûaäõ…mÛ黥m4çãÄRêj´ œäEgH2ô¤ ‚Ø“ZG6Γ6}T>¾Açvz—¼eaSjû.Sÿ|àç¥À’¡ò—6ß®ó£„x  ±4¹äq/oc~ò²‹MÔÖç+'…õ=_÷¯P¹Ý8Wê´wv·¢epåouÛçµ×kØE Ï'Ö‡Ø:@|Å픉½Ï³Œ7mÃs¨_h¸õÈ&úã‚]fAÕ â§îçÿ€Ã|Ùºp繇%#kÔ€™Œ¢znI­ó¤NÜNfá—V§U/8Àˆ7êÎ9øFfUa&Œ?tq÷IüÕ˜Ol{.‡ÖÎÞræAÉØ:­[i_¹ä,Bª'7sKiÇÔÌé[*{> oË¡³þqE”õµ°i`ör¹©[E8¾Ó¡M*ºú¢e‘¬Å³÷,ÛMßüÝ|Ü3û;ïÛè&æ-†>9ýË,ƒA‘]{V%yÀÈÎïEáÇx°ðÃàlQùcØãâ Î…äJ'äuzÙÇk±­rV‘Xe.†Ô0JúqIj_´Ç ’RPãÆ‹ÆÙbz·’ZTNÛúÆ|øÁL‡ Ì*NßZ,(­r‚Jö×ã>s*\if—µŒh`‘6 ¬„…z¼êåÙõy=£˜>hæbS¿¼>ƒ«>ÑùMCXôýèØžRíy§ëFûÛøŽ¥Ê¶qŸ—(R'VÇ$eä uNlcÛePôƒÿ€MXõ屮¦AHÝâ9aé 䧦ewkœ¡ÌÝXWÚ½ìäVqHü²LÅ>¡SÁ&ú«ŒYÐ[: Sßr%«gïè6ë¸&¶°x=ÏmD»¦*±%ãE£;äÚ´ø²š&v^a)ÔHIÊ.ñ+ªcJ¯šSjÏA‡„Ž% Àzi“€RÈ#çÄVÖg}sû—Ed7 Àfà÷Öƒ ¹ ‘´—4ð% þÒ¾¹·O0—ô¾UGÜ^õ¯:ìšÞ»âЄvŽ}–áuŒâÞ9}Ë•­Âª&Ö¿®ÿåUµ¤ed>V…©Ç¤ÕØL¹à],¯P¯O;$w¯<ìöjPPÇ#oxÝ1ÜaA-÷¬^^U‡øV6³À7ãë©*Tß?‡d…>àŒ-Þˆù6ÁNäܨw!´{ZÆ×n¤ö®Ö¼“ûsƒ¾Oɸ°oéá“>…#ëtngõò@N1îç}çQ쟀­¿ mÚÞ7*§®›ŽcýNró¿ŸžšÅ:ø8¦õ h{Œ Ÿ~PI/eXÍ´Åôñ[zqC¿âÑõÚni߸䠸ýݨ5›wËËÒÖÑ…´;´+GLðmé›–LÓf§Œµº÷JþJ?©³ãbX#ën‹góv^ yÇ(i|8ìœÐ¶`‡1¯ÔKt©®•9rÎ_EÌæ¦=ǽ®îü5o…蔑Ê9sHH߯‚aÛ…°¦²Ö1mœJ¶ñ휊×^´°ï5}Ç(qÊ'w€÷€”j)4gëчÿ à˜AïùuM°­†êzšÜ|5¼É  jö.‹ÈVŽýy>u׌þ•$èª/?/Þ{9¤šn³ž;ûøŒ†ã[¹'‰d@·Žüdõ#®Ù#ÂFµódmâ¾,WwÍZ«ëU0 q*ÒõÈàW»‘ÐÆ&sáqÙçq, Ä„Þ>õ¶ß!ý˜Ã½y÷Ìo0ßÊ3n`S´Oî]!5|øvÖÓ§5L[L¿™9é7ȯjÿ¢}œcÓ>]ÒJ}!/åÈͬªŽÑùÓsØ2owË—<ö‘ã€KÖÐú“þo¥ÍÂ쵊n^$gõ$)¸†Aì¤w6º[Þ Ë¬éš„î‹ý¢iW¶Uô§tg†· &¶^|Þ¶LÝ=oLÔøi=ë>›ØîƒN©=|7Ózxà,ÛËÂYrnV@Ë3oç):¾7‹êàÕ¼WθóJìÞ£wò‹=ªbÚv>¸v¶ô¹ÀJ:‘‡ åíãxužJà±Üч'$lÂçñâdÊýMU÷«Y÷ßÌû»Í2¾GàÄ£ZVEعA@õÜ]–Q­K”l:—ªØÅ·-Þ‡&UÎÍrºØ™aïH ÒÈÏZL.ZC~Œú¿wlªîųd®§m:Ö¼TýNá„”YÄÜ9ccþKHß;ÿçZ­ªoôÜ¢Jx…!³?hïÚÓð&õ²S¿‚ò¶mpÖƒzuò¹rޝK]zñu•ž5‹ìõ¤>]Ÿ2:)Ó :æ—ÃÞ3ï8×˸BòÀéë>Q9õ}³–m–Õ¾@½Ô$M=‰B’Ñ‚6oÅî£>U ö»1캚2´ñ,Dè{Þ¸¸ih»‚mÂ7žC.i=+Ôç®D+¿\!UZõqŒ†¥u ôO4GIëЬ%[àÖñ¯[¬æõ†EÞ)çÏó¸®ÕÇT±È^KìY¥åYð[øT@˜¡ÿšGÎS÷‰ðu<}AÍhà’XD~Mx·Ú“æÇ7-Óô¯[¤z§lö^ûÌÓg-ËÔoç‹›¿gÝkõ¢m‰Âµ»µ/¹ãñ‡ÐnËEçÔ’žž–Ô•mCŒKÖnUÒ1 jã7jå;þä#·–_-û÷b†6Iýë îr×»ùÞÎý)¤ç¯g‰­}ï,|Ñ~ùV`¾#]FÞFyàÛ¨®©™»Ú¾Æ(¼SÀ0¼cõɧÍ<Ú~µlû]ó'¶^†\×ô,š0 ªŸ'cÑxõiRø¤Èãæà|ÈA]œgÒ~4i¿Þ{Ï ð¯ëL£z6˜¾èÝhÙµöthÛ m¿šùŠN¯~‰‡4²+Ú'õ®<âözÐ? !¹èK{qOý íí–Ø>ò³Q™ÝÍâÅÌ“~JZ$ ‹]ŒëÛp&¬Gë~%³ìõä>½ûeôRç‚êæ&UtNÎþæã„’fèÍDiþj€ÆMÊyÕ'b‘ükëÕ¬‰]v¯'wÙfo»’4¸É8¼uùÏúm—#[¸8¦ö­¬éžµ\ ~7 Ÿ‡R?nH›WIÈkÒ~³u0f@Â:cBæFÁl…[¥,Ên¥s\òéw57 ù¸ä köÏͧ*·â¨Cg¨kmÓï33*±Ç72ÇßgDÃïü¸á­¶9³äÝÞ,P»WËyÔï=çÑûïØÞ.aÚ}=uPèT`Ý|¹k/¿®P[ (ƒÜJ©K–úø£-øk hqBŸÆÔ­ˆ„_; ™x×q lYeÚ¹Æ0¬}•~à®Ã^åL»m{Vëú”NJ™l’ÃgxÛËÖul%`äWá¬ÜˆÁpaÑjqÙäñÝ®ålGšù Ÿwo6{ùCÜ"qXüèlX e)Ãv‹èÏKUTN‘·Rß™–‹ÊëBå§&ðÔŠïéÃi–&¼’öWîn5—nðW!³ÄiÛ×ô{ åœòèv]Oû ÙÓÆ­b)jüÄÔ‰vIÜKûåÝw •ïÿ?pY¡PYÙ”²÷ʈ¤RÙ£’’ŠP2ÊJ‘UÈÊ YYÙ”½÷Ên¡(«¬ß}ŸcœsœãœÆçûéûý]|þúôx?_÷}_çºÏq߯+»vòLÅIðédè“´G*/Ýz­ìÛNo’0!`W€­èQ»]ã1p8ý[)5Ö)ŸÅ.=ï¥TqÎöˆÌ×Un™ÓWœƒ“ï˜Ð^%«wØ”,‡À·$ ¶ª½Ûw9í§„kÙ‰ nÃè¶‹qŸö_ˆbÒ nÙ®ìR0Ãs>¬¼ 'Xy‰>«HÏ/Ú‹§st‘”| ÒùqTF1‘fØ0—Õk\¥‡m´F1Ÿy-_ÍŠØç-ˆÛ¿þ!h•:,i;ŽÜÉù ù‘Kâä%ðmg ð%XµÜC^7¯¼£g}/ô Ùé¨Qû7¤'B÷[dü¼[N¨êÓ°ã¸oãv5¯J<‡¬oœ&!­ÄÀ·uþ#z ûÁ?(jwßGTW>sì!ÍZ{Ç+)ô¾‰¹ÖQéÇ}=ìPJ¨î×A«9Ìz!î#ÛùèzíÀF…ÛÙ“û‰öŠ@ÞÛ,‚¼Ž >•ã ~©]}²Ò˜lw\CeœòCîAÇ^³Œ9¯&jýèÏ<×2çD –%óç…¬SÇ€O¶VRyð¼ûa«rÖ…ÞÍÌ®4Ot ˆÍ_¿Úº›µaÏÅÌ-ªƒÜ6E„ÇŸ²[f.J»U“jøµîÒ Ö ‡5òŽÙ߸ŒÁ5|Uuåù”G+OB–i'ßÕ·#÷ ȵ0Y䜺[»Û á›ÈÝÊí'Ÿö3_H繚2Ákþâ#‹aH+™’Ó×µ_  iF—v@Ÿw}žRÒ¾ÝÅ ¾€ÖÁj]¶]7aVîA×>‹\•ÇÝÌSfDKðÝ«ˆ”î—ãJƒ·¦áÛ²1ìÝŸ¡C;XAžfkž€vš7°pìáºUMu>c˱§:VQêÆ~t|³í˜½AÔð>`Ž3é…´“«Þ+J«€¼ª6FÈ„<¿ý#8ض¶÷Ë2ä>ý+Ž^!üNÍLW Htâfd 1±Uýº÷š&}´Ë_–r*Þ"aŸ;Ã9¶¿eå¾ÑõÉêß2Uô®‚]éÀ×Iè¹!ܽž&äŽÞïb·­¤2}…«6&MÃøI‘Ûo·iøwÐꄽ£×}Ò¹Sëb ð]KTã<üò£(pÕÿILÇ%® ¾xíŸÅ}8·°X—R¾\Tòà´)$Ôêc½”2%hû˜;9?€›O{©ùõ®»ƒßÁ¿ØCþ">¤ >óÈ!ªÙJ"!|åþ«LÀ¨¨wßÝÆ½–Ed:ñ3Ò^mLf©?¤Üj¶Ÿì¤ÑyÚEsÊ·žXò1¸d-S°‰©ϱ5 Oo¥‚¾Õõ>ÎàQN)…~—Øàn#p%kE}v®¦ÐŽüÈ}íÕ¬ð­×?En ÏhãhG+èó„€ hz¯!];v2ø¡½ 5«öUÆoHÀ¹‘Ñü5þñÞx*[vŸ é¡ÓyÒN©áéò$åmÏ7ðÆûôe°…àÊ ^ÞO!/ôCv¡ÑX>•„w&G+iéxôÌ‘ ‚.Í —²°”ýz˜/¾œNø’ÄíüŸ‚Ö)­wr¬þ¨Õ ~ß?¾Zéˆé~ÏvÜW÷©qîösy¤Æ™„:I‹j!£BnMtRʸ×Sž~ÚÇh9@¯ó¤¥fð)3dI ç ¸¤BÛ ¾L ¾<¼_Há$Ø|†È$÷•7{®W3XWÒY–PœËÀ;ñEØ¥žÊ0þë!»|lY—·x²N…ó`ƒ€#à“\ }:SÒŒ| |Ó—CäÈJží—Þ2Ù6qÜíæ»×ÃïÖÉéXÇ`žGt*r\È©r‡VÈÀ¾ ñ£œcG˜À¿E?ûCçŸ xOò|áåËÉ.1Èv=Áæg»¯×qºô =•~2!2!ðAؽs¿U1ÉéÈуvE¸J^u;ŽùÔ‘(Í5O¤LЮ>¾>j ÙCá¨î%H?°¯Øž[‡Ž)F,h&áj§mÕNÁ>ù|FÁo€Ç¶ŒäTè0»EÚ”àÍÌéC–¿à‚Oõ€wÝ+äU~écW ››½CˆYœ¤C~œJ%=_LcYÅh]EoYBy.}‹úÓ÷üv%„êÀ\ÔÖG¯÷òl¤%ø°ýèŠO¬øÐÎIyUNUôœœž£ªñçJm[yï û¼yÐе™Ù²€èdØ^ë<,Ù{Š÷Ê’JÚǰ(ÙÅÀ_ÁÞˆæà;ŠÐ­ À~,`5q•gNgî²n>à=*><ûTâ²æóiùǃ¼ve¤§B‡ö_NùvàZê—æFz`§»Ä•'Ž€/šA^ä÷I£¶° Ã2)Ûç6"‰¥›Miþ–ÞºšÁªœÊ4{ë‰ðÑCÀG¥†Nè;ZðIhs2°Ó"þútΛ!áì€tß7!•‰%¶l:8w6k·u#û ˜ß¨”ÿ'Qï^n»r ½˜/‡í‹ð¸W)2VŸ!FŸ¾Ú6E€ö ‚løvrtñ {¡œºÛq@>ŽøJ-¯÷¨òs,íômFÙ$úi8š‘_Åî5PÆŽnY­!íé’ŠšG ÊBÚa§•4L,“Òq )ž4¾º²Gªækf¯‰S¯é‡cñÏ—ÒÛµð¸öpíà¸UE}.u^λ…Z?¸û[ɽ‰ÁgÖ!Mœ³ÞBððKBBZöé¼å}‚u¡î`ð¼~ñ^牧ÓÇâ°´±4£§dõ²YænQôn ?áß”X þ¡úî•;dg p{¢ý`Ÿ hC.°CéɹF±øí¶GR(íz$"°ôò©¬jY›÷Û×1Xäž|ö‰Ï&KÆå-.ô\à+ ¤¡>ôsqU°‡_8t¿ÌÂL<½ÊÙ{½fô*¸Ïé1Þé þ®³p<ö§ÊÓÏ‚ÎuT1ãüÀ< |ÁbT»nG¦¿V{ü~¶i¥Ð–Áô`h»O§+>#¶PLÙu«_&×°ˆÖ¦žÕ¡‰õf%ÕùôÅ#ÛŒŸä¸Þ-Bß _‹· €î“éë6…EJÃvÒøÜeæ|§|“÷O£Z'[LÞ²ßÿ ûìçñøå±sG‡yíJ‰ŽtÒê…‚“ò„Zd±—Ö{oh—+pŸLf~qhßëG>86ŸÏT ÅìtNûýQõ—ÛÍ«XÛyœÛÙm+v%Í·ªÀmPäG’•—¬À×ëÝ Û¡}žƒtNUXi(›þt»Û‚ù»c…|!DV½ŠIä7:D‚f5“ðõ2´”9¯½Æ’u«$€<ÐñyåîÜõlËõ~ › Ò®P×Ìæ®Ï“pWŒX†R§™‹]GsÙ¶\n Ç>÷†ånÏaŸÑý|ŽÕÀ Á7Á[X’¥Šòšù ·€çЖqÄÔÐN±V`wpg‘þÑ™tžØ½$wgÌ:UröùÎWñø}×L#1-¦¶(Ýyþ¶zÐø-BØvmîÝ^ííØxú<¤ïwJ~E t/bñœÃI¬¡óWzUrY¼g´‹™]†¥BfÔžÿP ¹×Hmÿ…÷Z)#ô]Ç@`®´ŽLaC6Ë„|4®íºÙ¦^­FåTÂ_œëCê¹,ž“'²¨¬¹\{ø]ÛX¯Ÿ Ú)yl‹|rëÞ÷e X©„ -ÝÁnñ•­ýcs¸dx4tzõûzµÛŽUKgq„Þúœð{£ª [ówšl7H^P|ØÅhû™Ú”¾ ÒV lt¥oöí}™WíO·ÿ „d±1Ë)ÛÙÓ–_οÓ,IØíòEë5£ó TȬzÌO la—ºÝºQ#û/@ßè¡€vu³½n~[Ñ öLwR=etùÆ]¯€ˆgÂGä)ý(luünÚ©”Åìõítí­Žƒ^ƒ‚Ýì7K·k,Ë…XÈ:Jº²I¤±0“¿Îƒ]âÁ~L [•½Ì)% d|Á“~8K8“?)ˆØ~ìl)§ïŒVÖΫUL6U´fÙ¸G{™ÏÅ~ßæ›5û„%A7Ò%\iÝÙ¼(,>²¥,C¢ÐÕæ3=ýºÇ«$S÷ú.ž«=øxúD ‘Q6±Î‹y…‡] àq„,S&×!;£V¶­t“{¥¯ì×î˜Ù¾‘¿DcÐlÚÇc›¡Ë’õGí¡Hâk-‡ü¿©FÿT ŸðhÞc÷™û²´†áJ£§vè¶Ó`ã}c‹[nVwŽ[ÙöS¾ãÒ²'U×+‘<ÑìC‰{lTÒvÝì8ôð£¤ßÈ!—zjã¸/|×R!7 }ÛHiÁ¶ÏÖðIÙàN›+Û_“W?3éFŸ$^­5döÅâ‹ù½Å̽ÞÓgòöÜjãuëⲯ¾åLØäÌ÷°íï!k<¤o:dÿè†E@Y¡û8›^³ Š–h4™v!Ù³?Ž%„òþܹFÑpœs¥ 7ëYlÞPÄv,Ä’€tµ"gä´†lþ°º¹5 ·dOZK;g/·}%†3ÞLéògûGŒ{OÕŠ'R9<ú’äb)Í•â/¦$œË UÜgð [óBÚ‘Cv~è‡nÈyXRYS÷¸³XlJö3™AWúìcö~t¬Ï™žR¸NÕ ÙÙÌíòHõç¤=(€•‹å  ´çu¸ ¸© tGp_Vˆ—’SRÝÜ“­÷âÈû;T)2 g‡.~¾0¤Ó •LãôA)_?‹X7 ˜…{ #‡Á6—FäUmƒ_~àm§eg1¸•$dséÔ×e5­ïÞ]n¾ÃÞlµ+Cý³#Y(ÛË©¼ñ{|–Ìš„žÎk¥ê¥, êg¿’2ÁÅ lZÖîìABÝŠ ²Qn@x¸…x{ÿ§ÉŸØÄ´Ì“êKQGFÝÙ ^™sXr˜»Ò¯‘¿Ïë«z"¾n*ŽfĨÀ­Bl§|èNàí#Vv s~Ù3½shlzt¯ ¤"Ù››œ­Ž,oM±ƒ8rjÔêUJÅPØ)ÄàèfžŸ•ºÆÇÍd`+nrppo8[È~¶YEUͽ#_ç°Éi™9ÄäTOh_âÒ&Ì2À¡4h³5€>’%’Ú{ùr«X8–n&‰aÚµ ¾}>²’Ò² H©@·¥ ŽN†n¬ümˆÆ',­¤qÆð¢åÍ;÷|4)}¤¿G(÷ã-?ûÙê§Ã‚Õ'íÊÁ :9fù¤Úñ“BÀÕ(éYIÉ…îZ½ Dcá>$¡ ®¥ÁâÆm·þ¡Ñ/Òm%qÞØñ“r¢M‘­?Ùu¦Ié5»ï<êk´—rpúvМñoÞnžÙÕ Üˆ²M7ûQ¹£'uÏ_±q„`‰é¹%• íW/çÝàîó9Ü~8œû•ÈëC‰ô^Ó:E ·Z8ìk¨Œ9h•1ÉeŸÝ_p‰ÜLYHZYSÇÄÜÚÑÕ; ôyRF^iUSgÿ‡/SóµÏ,Ä— íø†h¼„ý&|o¥ë”N)«ë€°wðXͯi»Š[d0È^ÏG4Î_¶vp{“œ™ÿ¦¶¥{ðÓÄìÞ6 jÆù¶wIjÝÄG}LgïyáßžÐ/ç~øU)bJÞï›yê7~‹øAªEŠ=làgËi£KV®ŸÅ¾Ì*,¯o{72>5M¸}×~A 9²ÑòÇú,ƒ¡j?BEZÎMÜœ·ù¢_wøé¢ö«múÉóò)NùÖHÛ€{ ž20»nïö 0<>5§¸²±sàÓÄÜ2>)%í^vÞÃb²JÇNé]4>ÊOù!ËI'Ëd[¼|»É˜Ågãféx’+Õ,¶Õ4ç^N ÛæÎò›>kÑ30Ÿ ˆ„tp¾õŽŒM-à“S3²ñ‚XºÆ-lìîy‡=r8/µk8Ñ‚µÍ‰!O½çÜGã.•ç!É€ÏbîÍ4†‘ƒLÚþ58‡|‚£ RßÑÿqòÇ‚íT ¬<€¥|LKÏÄÌò†ƒ³»ÿÓˆ˜Ä´wuEÏìÑ„¨-†ˆÔiŸ8].ðZôOYZR÷ÒŸ¼&E•MÝÃãÓKø¤»è÷q –Æiýs—¯ÛÞvóò ‹NxùêuñÛšÆ6fvVFüO%~º´õŽ ùÇûLGMº•2¨íÚ;Š}™?Åí³§¸Œ«~LþÄ!¦¤cá•U>~ÆàÂkû»@¬È¸äŒÜÂ7Õm=ïÇ&gæ¯Þ¹wÿ†¾8y¸ÖÖx¥^³ïVc†õÂÀ'O2¶Fèç•—ã¬FÕK|ú{9ŠÊªhjsí¶«—ß“ð˜¤ôjïü0ömv{ë¶»hËú&~Nô•<¹Ìû!X¬ÛbÁçÖ—3%ÌN]|NõÔQÃ{õƒêñ„LƒÊNè˜\¾~ë®Çà°ç‰iÙªwèÓ—©ŸË¸Dd”ÔôÌû¹ŠIÉ3*Ù\7=γåí6kÂÇ4ÁdNŸ½$6ÎÄUê¡×yÒD$sýy ¯›·HTBjváÛš¦Î¾‘ÑÉÙlrª={é°˜´¼²ú‰Óº†çÍîåö/á,ÕD™ík·Ý/}(ŽÊqH*ø‹¤g nH'…ÊíŒJ)ó@€ªméæÙO,üm;vïÙËf’VP9vò¬ž±éeKk;Gç{ž>?„/û†=óµQßÝèÂRr¼[§ýp^Z8kvj?{Gwʧtv¿–kj7ög`–ámßE·w?ÏA! Ù#jš§uÎ_ºjeëx×ÍÓçqPHxt\bJÆÍ ¼CJ \[ëÝE»­qÝ î|ÑÊÙu¥d‡NÔ6“°¶m’WÂkg•,h™öóˆHÉ«;¥mp9ßóz蓜žõº°´¼ª®©­kë¹—£x;ˆ'k]|r _ò5o0–n±NÜÄA«´1æ3^y£»e.ûew«ižÑ?gvÕÚî¶‹û¿ÀˆçñÉi§º¾¹½ëÝàûOã“SsóËq»ÍÓšûÊ#M髌çn/Z«$mÕMú){¯_Ò&±—TÌÔ/·CõŽ«çCÿ'Ï¢!NQYEmckgïÀÈDZ‰©Ùùel|B’í”»iè™X úd}^•—%º™¬P.=cIp"t€I/¨÷‰oþ{3vO_§eå¿­®oéèÒLÿXÄÂ% &#ßE½‡‘™ƒ›_@PD\JVQ™¿ˆÏ5¹4?òÆáa·Ýô–MŠ¨Í²–d çøŒ|KÆ©$/x%5Lîàùüå;g+1˜e;ïÃÂb’² JªêÇOžÖÖ349ñ²ÅÞQÿ¢ÖÚÄ[»onqþq¡ŽÛ¥}¯YÒØ~ÿŠÙ}ê7Ÿ½ùHÄ¥|Þ%œŠŽy?ïA ‰´Üµã'µ´u L.Æ5ë›vwîºÞóðöñ},úÉìí×åÉ?Ù«iË>¹èEµ'ýLúÁ @ŲûðØ•/{Ľ˜§PVÓ8yFGßè<”¸åxÇÙí¾çƒ‡~AOCÃ#£cã“SÒ_eåÞ.¤–ã^ÈÑûn?u¾šÝ©™Î0ò¥²}BÛ–ýj×ü2š¾’°I¹vßܽúú=€çq I/S32s^ç—½­¨ª©klnmïìîí[Ê—zô"ÖIfÒƒÜgɤhç¹Ä¯ÜçCë94í#JGp™¥´o<ˆ_ßJI{•›_TRV^YS×ÐÔÒþë¡‘ŸFÇ¿N|›š™û9¿¸¼¯Ð~ò è¾¯a"e’)ÛÍò¶ªz—/ñê¹§w-ï•5¼ý$£ndòð ðo?}þÓ…%ðŸn% ÚFB¶ƒœr×nj:z¦½,ûØös4ÚvlùZx4ˆìf§mÁ’ÈÕ¨†–#—½«ß/SóÑ`ÝEEC»‡q/3ø¯8¹yøø :,$"*&.)%-#'¯pDIYõ¨Ú1Á×SÓe6DÞXƹ„ê> Ügœb«ÇˆX¥Á?¦gTt/îá9rÒú×8®yâ”Öé3gµutõô Lο`zÑìÒeó+W-¯]·²Þ¢ G‘}$‹ÎºOæf|ëâ^9§W`hp“3°m²𵧮㖽ƒãí;Nw]\ÝîÝ»ïîááéååýÀçáÃG¾¾~û?yʶ½ôT›Mîûiç˜ò÷[høh[Üyžœ_Õ.ùÛv1²ñ‹ÈQO~ù2%%5---===##ãÕ«ÌÌ̬¬ì윜ÜÜÜׯóòòò ‹Šü‰Œ“†)Ån§¼iÿnÁ-$sô$xkäàâ韒‘SPV90ˆ| ­Œa`ŒŒŒ¼ϱ‡’Œ”˜„„À©##§Ü¹<LÀ)ààäá= pH<ú;))))ÈÉÉwìØ±};)0HÀ± ÄÛˆWG.÷[+åæ—n¨Ið0ì$Þòsrt¤¿»½¹¡¦ªüMIqAAþk ®Ü#Š òr²22ÒR’’ââb¢¢"ÂÂB‚‚‚‡:$ pðàÁÀàçç§fÐ/W 9±k0óáuZ¼‰wu…iσ}\í­.™èž>~TQVJôðA¾[v7oØX]¿fyõŠùåKfM/œ?gbldhh ¯§««£­}öì™Ó§µ´´8º›±ÎVœT%ª{j.˰ð®4Þ×þâ)ùÃlÔ¤[fdž:›*‹_¿JŽKNLˆ‹}þ,ôé“àÀ€Ç~¾}x{z¸ß¿çæêâ|×ÉéÎmGGûž“t;|l ãŽã–º©Ñ«ˆv2’ç"_xßT”êãtýÂÙcòÂ|ûûßõtu´µ45ÔÕTU¼}SZ\X—›“•™‘ž–ò2)éEB|\LÌóè¨H~/®-Ò¦,~ú ŒkѼ¼«ÅG2V›âËXM˜•çÛPËÛÜäpŠ¤Û·âa//ÎÏÍL}›ø2úéÃûáÁþw½Ýím­Í õu5ÕU•åüvxo [ÈõÞHVé.=?EQï§Ë±Ðïj$ͼu¬)?摃ÙEAvZRY)qA¼\ì¬,L t4T;)vm#"ÀÇÅÆZZœÿüw¾ON|ïÙŸ¨§¨|#“ÔöûMÒD ¬¬k¾ñ5!«ˆs¿|LpÁdwef”ï][›ë—MÏéiŸ>y\]UIQNZRLøOðqs²³ícfbØCK½{%¹ú3¦Ú䨷³2ádî”±²£*øe÷5èÆ ý/+²`½M𹡧x€x.1þyDh°ÿ£÷œï8þUs³ &†ú:g´Nh¨U9¢ '#%!&"ä1|™fêý<³I½ÅSÞÚëŒ-žJÄM¡f"¤#ùÁÖ'vÿì/O pºÜ×ÕÖX[ù¦8?çUjrBLÔ³`_/w7À·»i}íªù%Óó&FºØ¾RtD{$lJ=p]É㕾÷u··4ÔT”ççf¦¿LŒ‰ }øÞ÷]ï.ø+ïßÉ*{³pçÑóc»^éæ[ñ}ËtT¢ú”ïg&Ï´ÔWáv鸜¤°/Ç>FºÝ䤄x[æ¦&| ·³­©¾ºâMIa^NfzJÒ‹8ÕŽÛ"tD4‡.ÄÏŸ®”ÈWê½AS|uoW íPÒ-UúïUÑ·µEizKnX^:opöä1i1Á<ì,€MAF¼gy~vjrüÓû¡þžÎ¶æ†º¥§GwÌ.îRpká&ºGz°á:}ÍmáéW¶ÒÄíq¶ê,‹íi-5â£ByºÞ±³²03iUE áCü\ûY÷PïÜAJ„ƒµðcæ{ˆ~kIv͇]'£~Ö)V|‡¡Ü’±ÍGe[C ÏR}´­þ`qDOk]0_‚²¯÷½»7®™_4Ñ×>¥qTI^Z°¹9X÷2ÐR±$¹Ü´òŒë¢6ɦ÷XrÀÌY~q{¾Å¾w!zLŸ2n«1NU†Ûâ'#ݺ<÷mtä]Gcõ›ÂÜŒäø¨° ¿î®wnÙ€´ÎéÇTvÔeY¦½b:ê¨ÍE“8SÄêM Oâe]aÿåÐRMÈe©£ožÝ’âcßKKI²ëÇ÷ñ÷ý]­õ•¥9éÉñÑÏž<òºï|ÛÎæÚ•KŒw|¨ÎÌ-éǼQFe?¤Ùp¢Û'RöS€ÂÏô+Ü_3ì(‡Òïé [^4:{\ENì  >ÖÏ©/‡z;šk+9ãeBLDhÐã‡^÷­Ï(ˆ(œ¸ù¬u—qΗ)ó¯6øOµØ278 }{iq`¦ÈC‹m¶*âÆ±¨§~wí®_2Ñ9©¦(%|‹•š‚dë–…™ÉÑ÷Ým5¥…¹¯R“ 3_Uôàð^Lž?öŠÖו8˜£Ì7QkkÞ5®ÑW-W\"îËl­){–ùÄ×Ãù–•ùyýÓÊrâ‚üœû¨)I‹îû—OÃýÝmM{iéY$NßÍü.âÞ'—DûxgоLµÏ|]÷E¾Æ›° '\ÁkвQÚƒ¿85:ØÕXYœñÄ×ÓÙÞúŠ©áÙjGdÄóqìc ÙIF„‡µ0knyË3±ná UÙ…Zçô¡LIbÍW¶¥ÅÏ¼ÈØtšv öšä¶žä»B<,´ä„X³_ß¿k«{[ù26<Ø×ÓÅᆥ™‰Þi U`íàãde¢K+húL.l?.âóQ-“5‚1š7_s̃§õO€:q…§ew¬•ÅðEý“*ÒB¼¬{(‰q~~û<ØÕT]š÷*pý¼\oÛ^7¿`¨sJCEAjŸYÚ"´m·þK|ÃʃQtaŒ/„ë/àĪÎD (´;4›ë OÚk£¬e·,/èP‘æc£ßE‚·8óå}_{CeÉ댤Øð'~Þ÷ìm®^:Ç~ä²où¼CM³xÍcŠ æT…w¶´Ew–Ýäùi°w$áº8aÛóª¢W/¼îÞ´8¯«©"-Ì¿Ÿ‘j;ÖÉÏCÀt*/.ú؈§þ=´]SßQÜËíÒ/•@å‰ïFÀœ}lÔ‹¯Ã™8Hƒ¨ò¾2YkØÅÃxó#]õorSbB|ÝïØ˜›hk*ˈ`ßKCNŒ»0ýåã@WK-è¾ô*˜d1‰ö‘‹%wž½6uÇ—µàÌP¹/!G±³-¹Ç“® .•ûp1î$Zúþñ]Keá«ÄÈ`7G«ËÆ++z“…n')8—ÆÞ÷u6ç~å:ŸøUìÁˆL4¡õG½nó…GûKMðOa§ŸßÓúH¬Á_gßDžÎ19aî½»‰·ÌŒ vÔ•å¦Æ= ðv¹uýÀªÈŠâfc â.Í3G}9|¯W(xñ\‹R¡x±B“áôöªË;rMwWÞ><™dÎû=û¶ÒN¯Û×/hK73)î¯#ÝM•…™IÑOý<í®™¬ª¼„ 0õé¶©öpÙÕ³ß=žÇ^Žq¥''¼¸ê¬è*nr¼óW'®òP£èŒ¸ôúed€»ãµó€*»f;þ·O}mµe¯Ó"ƒ¹ßµ½vÉ2AØ–“_È¡¸Ú$½ÃeÁfÎ×—é•ÚgOîæ[lm÷Ä&_œgŽ1ãûQ:ú®±,ûEøãûö– *ÊÇJGN°<36ÔÕTY”ôÐÝÉîÚ%“ÓraSÇ3¨' ÚŽÕ¨µêŽÙo—ÿàÎÛîÌ? Š[h/ºT쪺‹†ëûûÎÚâŒøÐGn·®ž;{LAŒ?ýNbìúÀiô*9æYàÃûÖå VM\¾ëT ¿`~¶'‚=]¦Å;Lrð>_‡È×(;ÇwvE\Tãa¢Üús| µ2?5手… ¨dgÜMŠ·05:ÔÝ\]ú:#Ñïó‘£rÞbÇïWÆ.MÚá°åk}÷|çv ÿ‘ÜÔKl#±¦œßrm/é¨I °Q“`M}ìix““äílkqN[CQâ3ÍB¬¹‰ý )ÛÌ«ù/^ìP.Êȯ81r“4Aá#ðéã&0¨Š›owx6ÇA†06ØÃþŠ¡¦‚0#ÅÖù¯CµÅ™/"Itåœöq%IAž}{(·á.LUs>ú®[Ê÷ŒüÞ²í¬Ý¢ù³ouu;q´»þz’¤òžâÖê‡Z­åÙ O½ï\;wZEâÀ>j’-3ŸûZ* 2âŸù{‚ªŽ¦²4xWH5¬”Ní6aÐ|¤H4K(OºæìG‡ñòÃn ¶,-®‚cQ:T-þ§¨º#q§ß·Wä&†=t¶¹¨£.+ÈÁ@±uaò}OãÛ¼´¸°ÇžNà„?©*'ºx¾Y,‰öŽý¬Õ7›g²0ÞÒ3ßò4ZÓ½±dlržŒ3aê7ÞÿåÀ^ í¨ÊKŽðs³578qDŒ…šgn|œB)±¡€j{õ‚>åI½f¹ÜIœ/8S…KŽõ[<n·¡)8GöÚŒ¶ÞEt*ùçhâÕÃǤø™Èq§?tV¤D¸Û_59­*}ˆƒ’piês_kuIöË@½ËLê8c6¬ß«ÛgôÉjÉ›!MyÐ.Ï/I 7Íxw‹Ø\ÆõƒÓ9ŽÞæºj¼Œä¸3»jÁ›¯;V¦: "|ûhÈðæ'?ô6Wg%ÇH¤²‡Rù»yí`HªÔ™tg.Ô_~®ü-TùG‚îŽj‰ù\[Ñ¥²Üø`w[3mqýÔ]Wœ÷ÔÇùæeÃSÊ’‡8ï-³_†Ù®Q!›+”ÆŸ&#U¡9`ÈUn¸ôLú½÷áâ_#µH+\$— d·~h{û깿›Í…Ó梆 ;´§¾43!Ìïž=0ÔåEøXiw,M¿Ói;Õr²SwäÊœëÎçÀŠ€*úîkí æ†;ü#ÁljÊ]d°Kï©Pà|h(Jxä|ýÜ©#"\:û¹·ñMNRd€Çm«‹z'€¨œLT¤Öß®OXMÝ\r%{²ï•BÇü0Ñö4ùÆÛ2¶]cíöS%xã*‡Wá%ÅKO²0Ú]—úà¶¥ñ aNú¸s£}Íå¯_F?p¾yÅøŒº¼(¿¾¡y0Ó Á2!‘K²”sÏ”¾‡«-§ž§mö<‚[æ¢@X{Y[Iˆmþôû¶·YqÁžàü‘P¼¹ñþ–Êü´ØG÷쯙ê ~Æ”À›-[¯;v‹,Z¸é2Ás…^üÎ<=žb_£Ïì¨v“Å.uQ$r³2>.ÍÇ@¶<ÑßX’pßî²¾†œ '=9þ/ƒíÕE¯Âý=lžs¤ —©´OÞ¥ˆn¸°%T¤ÃŽ®ôâŽ<Ó]onpö¨m-½#‰UâªT–úÌÛþÒY%áýÔ„?>w×俌ðs½i¦{L‚Îî¬+ÍNŠ N-Wë9?åLñ\¨Úè§OaÒ±Ù0ÅïáêË©&4î²Ky·D‹Ý¾ôTeǶ½Iôu²4Ô9À²îsw]QZLçíkçϪÉr+ðr·Ù‚'CŠ\§ÅÖgB-–¤ÉÇ&‹xx(ñ5â$QáÍãqØ>Ä]â³Ð9r˜yÇòxO0{îß¼xFY”kÙ–ï#íUù/£<,ÏQ“äbúp“$Là­Îw/–Â3³þ­7i‹.åžÛQt•©ù¾ÄT’éÞ¾P]úþ(Ó`·kúª"l;q¿ 4½|æsûªáqYV*¢…/Íå¹IàšvD¿¹íIQì±"‰•zgGsz>\è{_©‰ðãø¹–lOµ(šü4wv†–¾|zßÚè˜8 á0#3Ÿ¸Ý0=£"Ls<`ò4”f½xæwïÖU“%?®"íIÏ}Å:óÁÂÝöŒo/‘ç#/4§¯w:4y†¢ÎC¿ü¾2IÓXGYj¨çÍsš2| ¤‹c=àäñv‚ÊÞY'»j‹_ë$A¸H£9^„x× ª¬3 ar£„‡}Ä>«,¦œ£mò[γþ‘ë ¿sËxç›´pï[µ˜É±'KÒ¢»Þ0=«*Áϼ‹pab¨½º0=–<ñÈ€#uæ‰ïZnÐ'ËÔ'Î:GYfÃÞë«´%ÇŠw<ÁŒsüåu! ŽØ_ºÊ_E>t„LÈÝ[g>´WdÇ?õr´0f99Þ`BVÐeŸœðá¬2#JP›ðé¿ÏßåÂÿÎ[|<âa¡ ÏÇ(=º®'ÚôÏ/]8š_{*3£},ôŽŠqÑn›ë­+ç΋ÚàÒKCºeæÓ¾R£åpñw·™JL‰SO/Çi.ÄÂI7ÙUåxðs¤6eƒ— A¥×Ñí­O}ìÎgß…=Ñ[ëï|ÍPCŠq;Öä`sYfìOǫƧ”Äx™wñÔY¼TŸ|,Øå´¯ÖzOùuú*Ûýžâßbu)kݤsnÎæÚKáUeEzÛšLœÉw5¹ñnÖ&'äXvâÍ|ì–³p_×fºà'‡`Ç-šB}à¾{2Xòã#‘÷¾c!ª‹)ÆÔu®â3©—öDïûo~ðG_eF¸ç cu1ö]¸ßújó^õÔ§Ç{«O…H}zpøÝ}¾^·ƒý^¢£OT–RLhêïIÎ¥™³D1=¿È=™åxB‚réSkqR°Ûu5QöÝøSCM%ÀºãtÍø„Ü!6j¢Å¯-os“N-ƨ΄*L<‘› Už‹9µ5ëâžÑÉcºv?õmÕÊÛê}µèãoSa!ûù¾©àEë5ý£¢ìT[§GZÊ2¢»XŸ×Ö2z2ì©]µzø)Z8/Nb%já§n/¼º·ÅMäk´6E«Ô|–õÉÔkgónË7GxXé+ 0ÏÕçÅ8[êå Ú:,;™1÷nši•àÛ»¸Á4!Í5"Ë6ÙQ`FS~ƒ­Ý]ôkäi’Ò[Çc軃µv·¥Š3˜/Oyârå¬<ÝÖïýµ¹±ï^ÕSå &˜ûÐÌ`)3×?&sˆfÛ¥]¥æÔo¯3ÖÙsw{I|%^90“{[ލ!Èý[ž›ÆžÏ9î–ge¹v-n)Œ|ç’–,áÌPSaÒS›NÉb¡Äi}›•fÎ6zXEqKÁ¯.Â?^ß[*qU&mÒÛ7šn/OÖe!FÐU’à{Ëä¨ #ÑT_å«ÕE ²0ƺZkÊØKŽó}¸%Ó’ûS´Áž®@ÍõÞG‰«!ÊLô­³ä…Ÿýyuaf’¹¡•EQšøÀn*J†|c<"´¿'üÇ× ;I¼ª‡Z{†¯‰àTûé²~ÍqQ§ùæ Lõ>ã®ãDÑ#Ãkg¤öoŸWç˧€É5Ú.`–zÊ@L,ð›ml€«•±¦ì»è‹¼ßsïÈ“4®ŽŠÛ;#.Z®ô7àúQöP ¸¶/Æo³õ±Ñ“ç¦\„̚뺊üÀÕ»ªWìΟb;o)I ÷¹}Eo Öüà\‘›*ew¤ÿÏ{Þ¿´“#댱'n²”$íM´W¥/|˜äwËH™Ÿ{´%?桉š0x3ÙXp÷ªŽ²à> `M¬yìn;”pUpñ·&íЋ뢸µúßóïkÒʼ«Fû1ÓEsïD1pZpZcªR€OqµÃ [':KâÜ…=Þù6- üjÆü™ˆ~#IÀz\íwvïçt{9ÒŽˆK‡±ª ¹çÞúêsý¬ù•éKÖʾøkâÍa¦XÕAçøÿ9¸¥á™¹8Ioòmu¦ïeAf;N‰³–/¿µå+㙇‘š00·Ç:Ë3"}/ŸdšÈuV£Jº)KÖ\0Dm‘b„íϯK“½Kr8ºçKáCÃø/ï³<-ÉJ:Ýû&9à¶éqÑ}Û×ç>hozBŠ›zë÷º¼ø•ߘ€Åø8ÝÇtGå]ƒÉ¶ }IvGv¥ÞQß3žç¥Ã½Ôq]žêsÁ£sÂÞ×ÏJ³oŸë¯&90i(WVÄ+ÚŠL$óÛJÓžAÊß ÜO2Žg»£.AuºOY.šLÞ:œóÕO/‹“õ§»hq,4DÛ}`­#ÇI1?Tó*ìžåYy^jܯ]oRCÝ­ ÕDÙvß’krâÀy8]ìu†e2ÏýóD¾ä„èqÍW_&ìL¸u”~¢ÔßTŒl(ËË $îá =îKïë³#=­õ•Ò‹luV¤Ï­ à<„ÞC‡yÛÏ–>ÐÙ?]ü@‡}¶ì‘ÏBu°©àÖ¶…]²=tx°šcìŽ2NW>»Þ[šðÈÖàxÓ÷ÜÇÖø¨3鑯¼8§+À½óö¥±®Ê¬ÿ¹7ô9¼–’Åš`ÓÃx-Q×eÈÓîj²L—_ß>”é¡¿;Õm¶·ì…Ÿ‘òÚÕñ¸ø~pA,I~rò}– oj°¡0¹veÔ!õ°Cnˆ¡ÿЏ ø÷EñDÜüû¢øšˆŒüŸ7ÿyQü÷DÔàÿQü÷DÔàßÅÿïŠèÀZG‘ÈD”àÿQü7E”àßÅÿ%ø÷ÅuðŸaÀ_QÿDXð—DTàßá@q#ùQ_„ÿ«"†àÿ""ˆ¹ˆüûâðÿq#øÿˆü×DdàVÜ@þÏ‹HÁKDþQ€ÿ¾(ñû"rðï‹¿/"ÿ¾(ñ/‰¨ÁÿÃâ&à¿"nþӢĈHA¤""ùK¢Ä?%"ÿ¾(ñ"Rðï‹ëà¿ ¢ÿUüeˆ±n&Âÿ}ø÷ExðEdàßÀÿ¶ˆ øŠÀ_‘€ÿÄைHÀ¿/"ADþ}(ù_‘€ÈDÉ?‘€_”ü# ø÷EÉ?‘€_AÉšÿ¬On.¢ÿ‹b¦à¿#¢ÿeQòÏÄàß%ÿLÜb$ÂèÄuð·Äàßa@Lņÿ¨¸9øŸQ~ä¢Ñ€ÿ‚ˆü'Eð—E´ÿ\DUDñÅ †bʈAÄ?7‚Rÿeð¿,bþc"RðWDô¥þPDµˆ6`ñD–ÜDÄ4â"þEQêE”ÿž(õ‡"jðß×Áß7‰ˆ‘Ø€V„OÜ,âßaÁß7ÿ qsðŸÑ€ÿƒ" /¢1~I”þUøÇâFðWEt¥ÿTDñE "þ™ˆ ü5“ˆ$"A±fs±aMÄ(⟈ÈÁ¿(JÿºˆYÄßQ¿ nQ¹¸¢QFD%®ƒ«"¦WDñ/‰0 z±™¸ ø¯ˆ›ÿˆ¸)ø;âæàße~]DñÅ Z±QÜ<¢Ì‹#þ²ˆ6" qãaD."UDþ×E À_áAQ3±ayÄ_1ÿš(ó;"f1D”à/ˆ›E„WDsÓˆ¿)n"7‚ð"<ø{bã&"<ø[⦠ìßeGÜü q3ð/ˆA ÅÆuq³ˆ²ˆb¢Ø€NDþ²¸ ø{"ˆ4â‰HÁ_1‘ŠõˆbãLÄü%#pS±cü³ˆ¿+¢1!"f5ÿ‚ˆ)ø{"ˆ Êý¹ˆþ–¸)¸™Ø€BÜD&"øŸÑ€¿.¢ÿLDþ²ˆ:¢Æb#¬ˆüD*ÖÁ‹ HD À_1¨ùDTà/‰èÅÆ53‰ˆüTÿ'D Ay”"ÂalÄÄXlÂücqˆVlÜ(¢Ž(ÿ{"S± ¹ˆüuøË"Zp£ˆâ06¡UlB+Êÿ¦ˆøk"& Œ¸ù‰iÂü]5ˆF\›PG„Pˆ"6a b.b þ–¸)¸ADvbšàÅÍÁœMÅFd",/BÀ?‘€(ć± S± VD æþ¢ˆÜTlÜ bþ¾ˆ Ä@lZ1IÄ\Ñœ˜&LÁÍD¸ÃØŒò¬ €¿'n¢WŠnÆÄTlnÆü  ˜‹úâiD.¢‘ŠÈc3¦àkÌÄæU=ˆ ¢>ŒÍ˜‚¿/®€p¢×ÀfLAÔbãF øú5*iÑ͘‚¿ b®‰È/žu°SðwÄÍA”"bÑ͘‚ð"òSÝ '¢7›6ŠH@8ïuÞFùalÆD%n(º#0/ïELÀMÅ&#S±¥S½Ø¼*n‘yðâf‡±EaÃç+rp3®èLÁUmÑ-˜•Œ©ØЍÁ<¸±ˆ)˜TDr[07ˆ¨"¶`æçÿ‚ˆóÑ\”Ü„{W#BjFûrˆÚª)zcÍp`fDD(Ø‘¶&BŠÞX3,؉ö«"|ÄUðìï_7×À=Œp‘‚›hoá(®F„;ˆ°àFD\+6"䬬ƒHÅT\+)Ø¿b‚ÁˆÐˆ›ƒi+"X44"2ê­ˆh°rp€"lDTàÐæZùú€ q\©â a‚­ˆó‚"D."Zë"$"P3pÕÆÀ‚W"Â+‡ à0&d¬E„BDtÔÊX‰ÖŒÂy##è òò èXÁƒW+†ñFÀžZð l@8ïý{´¬žp- Œ'"—ÖÄ•ˆ° ïýôÔÊhnWÂxï¡Þ‡è µF„œæUp£÷2ÐAkc5bïZÅk ÷ñãÇÍ™ÊõÑÚ¶®y«ñÖ8¤b%ò©€+ÃyPîã§O›30£½c®zÜ'È@­ŽÎZ0ÔCÔ€ñ´6p5 èÁrkd ƒÖF=H<îóú@AGUU®x™6 ÿ)Šñ®ôÖ88lf &ð  KA:hm¬p­1„ZmBtÆ×:hm|†wÆQtÐÚø‚鍯tLNNLL|…*NO}ÿömrCÆW´6æf¦P¡î¼G­Ÿ?æfg¦§¦uÝ ´6ç¡æ Q×]ºfe «—0¡(Œ çNNÖl6`E,€œ_1t5ê:û v`¯  º–ý†¹ˆ³B®›k(‚ŠZ¸ ¹Æ\7×ÑU`Á¿¦¢Ã {…„ÆÌÕ ðh-ü@-âã°&,:µQDmããAêÉ &ŠR„ ¸Z7 ¹b®…¨è°µA†\!ÁÊ7˜«h]:jel…#!1ͨ¸:Ј„P–\‹ 1WÑ:ÄR\ ¹FÂÆ„17ˆ¨`¨©$×c™³¨Å 0ÑjH¤$Ä„¢õhÈ•±&"HÌzè@'ÖÕ"$$äP"’0f=ÌØ\„†D ¡•¯Æ„˜õˆ•H Wë†%acþ@"¢rAq-äFrÝD!ndq-$´n6&ø˜ÀfêšKL´rn`ëÈ 1V:–x¥ì•(ÉŸ °c3s´ì•HÈU³ql"®†„žT䕺*†„%W+ŸollDŠn`·¯–½ ¹Q£°*(Â…\9”ÈÆµJ]a·­—½–\=˜ °%Ú°*®˜ºaÈEDq3uÛÊ„ ‰œlÚ@¢@·Aäê¹Y¯‘A‚nTIVŵ(È&è@’¬ÈõÈȦµ m„7 ¹N6Á¤h#R1ä*¹Ô„0P¢p"²ºA4››Mèš >º±ÁD†’lrl†ô(¬ˆ,äÙ܌҄GIàË^ ¹‘l†›¢«âzÙ°!±‘‹›¢P¡lddK z³iUD(yÝà³S&rtMD–liAf"AIà$’«dËê@g’ÀH„²áÉ–õ±yP1ä:Ù;6˜0(醉<ä–ÖV8uP8q3|^ Ù 'n,¡îÖVLÌf8q­lø+dk+2 Jº~j6 ‰½&¢5¡âƹ!d+ÌØÔ\Q„\#Û`IDE)ÂÖ ’mmšÈE$!ÛIT&¢¸1ä ÙÖ†Þ„ ¤˜…ÄY10‘‰HC¶µahn‘„„m0cS^„/.d;,¹™ #—H¶·Ã™ð$¬¹QD"bf®ŠðIÈö $ "n8HB¶·£7[Qˆ°Ð:ÙŽ”DbЍÊƃÑ™¤§±ìµ0䦥“"œ”!;:`ÍMb¢ñ×EÔ1aM8¶lÄš¤ˆ§UÈtdF"LÈ$$Rs]D<ð!ñ::04áÅMB®‹›’m›‰ð!;;14QˆCv¢&áM$âÆ²ñ¡",‰:&éú¹yÙ˜Å$ŨlüUuÌvŒD‚"z™_ö ÙÙ‰¡‰(¢*]Ü„lG+Â](È &¬¸iÙ]]¨Lµˆ@v¡&áÍUmÙ]$J#q몈 ‰\D²«kƒ Gv QÈ­ë"Ú˜¤N BÙˆ"j²c3qcÈnLIÌErSsMDyjVE IxqýÔlÙ)‰DD²{Îü5rs‘Q„%Q˜(EÄݘ’ÈD¤!»»‘˜ÈHyÙp"Jjþ?lú£x^|ºy •Ýû=¬’( !©D)ŠФæIsiФY%Q”Í‘ Q¢RH)Q4HeŽD(¢”4E)¥ßºö¾z>ß÷ýëéqÎYçÚûZk]kïûüJö^9¨1Ýo¾xN°­qÇW‘Φ=*ï]¡Û&©Ú·Ç6ã”+“|å~¼záí´Úth‰/…"O¹Z›ÑQÿò2åFðáëçÕU•iøPÜê³F¯uVõˆö…aÛ')½¿¹ÖÏ´ëѲob˜jó<Üen¿Æ¼Ëýe¼zyÒyíŒajR_‹_õßgk>Q·‡díëÌÛ¼]6™OÖG¡uuéŸt¿õmŸÛ2F¶4j÷ÌžÕ÷Ž[ Ï»¸cZê$Ÿ £åËã­6êTž0®¿\}Iò•S»×ÍÞKº®$õF‡Ýò©ê2¿ÊŸÝ‹ðÛo·rÖh©úÆÌ«áR…ò4ëSý­Fu*Þ· ÿŸìPSõº´³vÓÔ~d.äÏÒ”«¾®–sFôéXÿ&3öÜa‡U3úÊÿýTð(ú Vn6aˆºì߬ÀM#eŠ"œL»WÞ9²|p«œPûÉ]?Ý=¶Ê ý«hwóÁâ/¢ÜÌu%_m[2®¿üÏש×üöXÍ­)×Pžá¸Óº¹ÆÚ]Ä«_¥Å÷rµY:ÍH«Uö[c¹Ò«®sÔkž\g(õ2r÷ï©§mÆuùtÏÛrtç÷¼­Æ(9bÏ!Ó¢Ü6š™ôWhüðì.V Æê.õ½,ûN¸ß~ûUsLZço§ð6Æ}毴ӛŒåËn0Ø*÷âΙ½ë3‚·™ª×? qœ­%vá°9 ½I¿~zŸÍÂq:]Z}zžéëf»dòPõŽ yI×°rË…mrCí't©¸å¹d€ØÓûI*ŸïXcØ¡äú~óAâ…Qn‹K_÷´0”½wþÐVó±ýåÊ2b‚öo6Ÿ0¨«ø—®ž>`·ÂtxßÎb•/ScC½\mÅó.8LîöùÎQ =‰üËÎ3ÕkSlÆ*}¼{bݹò„ëG+~NôÛ Ú6SUüSÎísž›Q¥ÂŸòìÛ¡GVÍ0Ôèôë}ÎÝðSn›—MÞ’y•)ù2Òu®æ¯Ì`»IÝ¿$ùZ+|¸{bý(ùŠ»^LºT=:mgªÑ±o™~·ÖžÞ öؼˆ +žÆŸ?æ¸fÖMùÆy®°_9k”v×vuo¥Š£öšõÿóôüÈ#5hˤî56Oìþ5%ÈÞ´÷¯§—\éI½‰÷Þ8M¯«XEvÜÙ¶€Tl¬ÈI¸~ÏÝOQìs!$shǺyc«J7´umßÂby—œg÷ý•u~ÇôÞ?Á¿Y}~ç\rY0P¢8æðZã.Õ©çv®œ2¸Ëßò¬Ø3ûä_ð;Ìk—å|.mª‹RcBŽí²Z4I¿·\‡’èýZAä3±Üp—ùÚ­ž£ƒÚ]÷\9\îÃÿ­¦ò¯zîX>i ÒŸw™7ƒRGIìcî½ËÞ̸*í¾•fÀö@…õ¤Kox,ÕkWtÍ}±nÛ×ÜÍõ$_Ý8haØ©üÎIëñ=êž\ؽH·ÃÛ»¾G·-¯£ðûmFL »Í¢q:JÌýpŸ=MÐíÁTxÙ×}+ü­=¸B¿}IŒçrƒ¥±‡V‡sym£\|fûL­V/¢­­ü5ã$æ o0È]Z}ÎOŒðÝkk>i¨šÌÏòg‰WN{:¬'ý&öðÊa2eqGVɾ»ãeiÒ¥òáé­S{ý|ziÏâ!ÒïîúnžÖçoáø`Û…&Z²ð 6A¶®ÌOºâï¾yéTƒÞ~È}öˆÓ™·qGWÉ’ÞŒ?=𳙨Z—ºs®v›—×Q]—š´PçzÒïŸÆžqßd6ºoÇ¥©Ñ R¹Meáë§÷o…°ûÈÿ­|‘r3ô„KÇ··¯ Ëò±¯RrÆ~zŸß¹næC¥ßÞñ±™ÒëwÞUU£»~Ë*ϼqÚÍzÞH ™ºW)×äÀ®màÑÛVΡ¥Ø¦úUúí‹>ßÅSuŸ“üm'÷¬{rÞižN›—7­©X•|vÇÜí^ÇŸ´ÖG¬¨áMÚ5?WËÙF½:Ô?¾æïf³hüÀ®âÕ/“¯Ÿ9¸^¡­,ñíuÖpôÁ}øò8È„~vyÏb½ö ´õÕÙ—Ý–Ê}N>ë´@Oæƒì’ÇW|v­i¨&õARi[SL³Ðqí\“ݤ¾¿ËI”}×Çz\·¯iÁ³´Ä ®Xa(÷1é´Ý M±×¯ÛýGNÄ~,û{éÚ—Iá^N«§ë÷”¬yù(ÊAv“øú*õæ¹£N–óÇéªJÿªx.[qïÔ¦‰=ê2Ï;Íжøæ‘uÆÊ5i!Îfƒ¤ÊîœÚbªÙº8ÖËfZßÖFê’Õ÷ÃŽïX9»úAnZ4~p·vßJÒcCï²Z8qˆ:ìG®â¾ŸídµúlXöÚ8¡g}N¸Û2CùσÌt¥+’‚Íô:Í0èѶ2ïÎù#Û—OÖëÖöË‹‡WüönZ€aõiÌ:`aÔùóã3;æèH”ÞöÞ4¹wcá£&¨ÿ)ˆ9¾iªæöå(6Â*ÎØ‚!.æ?ˆôÝk³x¢^öL„§ömY1cDùOíцÂë‰Ïé¡»Ÿ¶ÍÒ–x}Ç×n¦¶dÙýÓ;æÁ–5‰°5á&ó‰z=;Ô¿}z—ç ãΟmŸÕ¿MÑÍ£–ãºc– ï\•â¼ph§ÏíZ¤/_™vqŸ…ñ™ý›æ“bJRÀÅM ÆÀ}0]ic>qHOièúþ•íkæb¡gi¡%·NXORkÈ‹ò\mܵ;¸bd—oYáûWw¯Ï‹>j=5ÚŸÓû[Ñ£+¾{¬æ#üý˜w?â ' EúyŸû *ðàŽu+“ƒç ”|“àiü}A[׳áùµCëÇ÷lÈ¿qÌzJßÖ¥wü·ÏG.sZ3Ý@µ]uáƒð“»-çÖêŒp?K&ë«wjøðüáµ³‡ªRÎ9™ nÿÝÌ~â%·N‚|­Šã¼m§iŠ—ÞñÛ6w°ôÇäó{- ÃŽ9XLÑS¯|~ï’—óú9#5åÿ|Ƚ‡*m—LÑïÝéÏÇüG7‚)T¥†:/Ô“©x¸}ÎÉ·wýígëH–Ý Ø>wtÅ£s»—)Õæ\=lýÃõÝ’ »ˆ}xvçâñkgè+÷§âÙ=LBÛ¥S†õ–küT˜ªð%õüîÅ裳;Íte*’΀Ω'æÃjž„X3N­±è¶ïö¿ïŸÜ<³ßfá˜þÙp=ºcÕÌá}dÞä^Û¥S‡iÀÐ^¦Æ)|I»àbn ÿ9%d×b}¹Ê”P—%† Õ™—ÜWwÿùüÆq›éý%Ëžs•û…Xæ¿×jþ(MÙŸo3)¬œNóºœÍkÛeS ûtnõ¥(]±:ý➥† _Ò/ìY6\±&óÒ¾•£U~<»zxÃ$V%wü̆ÈWgEÒ®-zyr׺YF½e~¼N9ëi¿bÚ°^ ò2ES«3Âö.7RªyriŸÅ¨®ßŸ^ñ\7NíÏ‹XïÍ3´¥Þ? qY>ªÛ¯ÂXU‰/ù÷ÂŽ;®25PkÿíUÊõÀ[—MÕW—ùùާŠå¦FšJm¾RUn+F*×fGX3¦Ç¯çׂ0mJYqr_2Ã=ÖMìÓ¦,ñì]åVrâCoƒSt—¨yùøjFÌä¡jÒõïžÞ½ìë¶eÅôý”Ú‘Œ@åû³(PP½ñeœ÷–™:Råƒw/ÑõGÞõ¶3Ê|N7§-½-,;’Sø¹aB0ÐàðSû¶®˜1²¿²â×'†I÷úçÆä>­KîømŸ§Û©2-Ì}õXµ¿Å ;SúžwÃzþ¨>¿CƒÍ Æhs ž‚ùLÔSíðãmöÝpŒk‹™£´¿fa¹cU bNؘö“(K rZ4LñÛÓ¨ÃVS´$Þ= ÙcaÒS¬äî®u8ÈHÖ¼xéã²*Þ½|ÒÕzÑxøÙ2I'BôX‹^¼Œ=¹eæ€C\—ìö3?ÆkËìA+3Â=-§ô“ªH9æ°bŠ®J›ÏÌ '°»ì¯ò§ a^»í³h7ÜÏÝ~ålÅoÙžë'ôú[|Û×~®nÇÏl¹ê‹ãýi¹u¹×½¶ÌÑ“¯É F§£Øøþ)EǕӇõ’©/{rûüñ]–fcv—ä8-(}{yÐ’Q/`‡ÙPùê'øß¾âe‚w/ÝãOQ|€£¹Q·†—Ñ{­çê+ûóMÆÍ³ž,3·¯{rÌiýü1»IÖ¤ÿþm@¼rhÃä¾m^ßÃBÃ׎n2Õiÿ!å¢ûš âeI!{WÓ›áíŒÑªÞ¾–€ûf󉃻·ûö*-æÜ‘ëæš P‘¬{“}7Âÿ ¢ŽXOÕj[öà,ø¢Rÿ<Æ{ë]Ù/O"[›êHJ?hm:@¦*—†ÖŠ) â—¤Hß=Ž¥P”|ãìákæ먴ãd,G7Nëß®]]a¬úûåm_‡Šu¹7¼¶Î"ÿíÙu/»yJ?ÞÁ(l^L™ìSÞ½KÞ»,ç÷Wj]Yø8:ˆe ®µ€ŒTª}võئéÚRÉç÷­«ž:/Ùí׋Û~;©üzà´ttO±ï%ÉWÙ‘PKþ7Ž„”ÂgÔêü÷S~ÒÕÓÛVÍ­Í ïñÚ1›:|L ;°vBj‰«Å5±Òûg]VŒQoõ&)ÄmÍDM)¨úþ%/§53‡“QdÜ &ïÞGî{ÿv+gŽê¯ ȧJuÏ¢ÛÎ$ó9ã2˜§%ù>ù‚ûÚ‰}%Ê_p_7IKòcZø¡3Ëu«xz;äð¶S‡ªJ~-NކQ,Ÿf@Þóì~„Ÿ»$Ø`\ô‰-³wªâ­èð)ýòÁ Ó´;|ÊˆÒ ÙšœëÞÛªÀߤÝÜ¿yñøA]Û0UïÃ!“T £÷%Uè§Ü¶V‘8¼uŽž\uvÔ1›™ƒ:UeEµ™5X¶æi´—Ý|ý.õ…·O;/Ó›î^>Œ<åj5ßcæ²ëF„ð7Y —ÈÎà=]Ú*ÖåÝð¶CS¿æ Ö9øï³ëÞ@Rúžççh>²ÇßÒ¡ûÖMÑž4¸këO¹wÙ€1êÓé×;ØOìÚrÓQ!óvØÉ½¶ËL´ºâI (Ôâ¿öó €ëë°È¨Ûïâ»g\VŽÓ¨H ?l3{È“~ò ïž`l[1M_­}]iF,Ƚvޱ¶²xÍ«ô[ìôa:\ ˆ1>öfÒÂá]A—ÓÎËŒÕÐäóîë§hË|ɾ~rû¢‘kgöê€À}ÚÝÖ|Âàn5E)”nWÍÙO±õ—¢´Øó^.›¥ëžÇøl[0L¹¾ð–?­òÏ«{Á®+Ç÷¡Úmš¥×ù{ÁíÓ»-ÆÃºu»ÁgDø¸Z™™h+µª,xÈÎëÓØy=åfÈñÝ›–LâÍSÛRmMµ­›Ò¿CeÖÕvf†*¿KCÝ-M÷Ñ`Uh¬xšp[9{D_ÿ÷#|Ý6Ó`¥Y|ãܱÝÍ€èë°XØ·c{‹—'_ò´š>HîkîM_Ç%ÆêmÊSÃlžçÝ4oÜf)(óómvÂ¥“®›Ì'!¤üF¢¸|ÔÙˆ±¾;ÌGto,¹¼gÕ„¾’Ò#ØÎªTÿ"!ÈeåÍö•ÙÑ'Ì1²VLÒ£"8F–-2^©ÚÒÌ[çO /OÐë)ƒNG$gtÄÏqÉHÕ¿¯Á’µ“iµ×NØ-0ìö‡­vÚ@¹où·]V±vÂÌ»ù¤‹•ÙØ]ÛV§ÂÍ`c÷è@— ׂ+ÔåÇùï„´*{xa¿å´krbNí0Õ³õÛäK‡6ÍÚå׫ÄÐýV‰áX÷lo³nŸ?†­ÕOA¬Gë Ckç˜ è&õãݳĨ ÔHˆØ®·Ã<­f –¯}à¼|¬F»Q'ìõhõ.%üÈ–l&êiC{JÕ–¤Þ8ã¹ÍE–ùÄéÜzÚÕ•åÜ¿Ò58-3é%^žrl¢øãEÂ×ÕûIyzã”ã²1í>=‰öq,I¡Óàâñ•ÛT>Œòß·y Ÿþ9w#0WIÔ]Ú~ƒ›ñVéV¢"-âèæ¹Ê Å÷Îí[ý«¥ý[=©ǯy·]«ò/{ïZ?gR#æê%oëãpô¨{ý$>Ìgí2:'´ùZš%ÄÓ»VŒíÓîcÆ•ã[͆wk|tÁÃz¦žâÏ¢{!î–Ó+ÔÝ=ðû]Ö­ÃÛ-L Ô¥¼ÉŒ =º“ná˜ãΟÀifʰ>[W—È×Ü Üe1¾¯Ô§'W½¶-©ÚêmòåÛç SùóúaØA›¹Ýþ–%‡m_[œŒ‰e»˜+0ùz'Y5ZU¾LŽ9wÌ™ÝRÈ‹}âíÀÝí|ÌG«·}Ÿvå¸ýÂ=[—§E·_4R½í‡ÌhåÖ/—i¼Ðõɧç"ýömY†³º,ÒòÃkÂõc/Ù¿ ÑekDŒ/5B8¹c‰IïvŸ²¢}v.«Ù¡:÷V`_Ù_e™qX7rho˜ò„7üÜÆÉ#71ŠÝ(ŒÕUë(Ä Ú™êg±þÎ+Ækv¨zãçl1^Kº:7î´ËêÉä¿¿¸J³ è1Mê%“ôzHÖâxùÏððßo¿zΘAª ÑuõdíN_óâNï^…ÖÖ µ.k&ëÈÖÞ Þ·aÆå߯‡ 2—¼wo ;žÖU/øX…%þµôIü%Ä=‹YÆ€fÏš):²[þAI8ëf9]Wñç«ÚÌ®Úæ}F4ÍÀæË[ÌÀмÄH?÷-ËM‡£;_ŠÓâ.xïݼbÆ(Y†¸vê¹:Zo:¸sýKeãl}•Ʋäˆcö‹5¤*ŸÅ-¤Û­m5³‰-H¶=;ü(ËJ#癌î4~.LŽ 9áb³Ì”!î]7m 6ëî9÷ 3ô”J’ÂmžÏJ»vÒqùøþj ïm˜gܯ3»»õ&›صí×Wi7CŽ9oX0^·§L9OðÑ]Í;}+ˆ? DÇÖ³õ»6¾I?f¿ht¯vŸŸÞôwY3u°Â¯ÒG+‘è;|MÓeÇêY#µØ lb ]Q´'›¸tØÉŠ!b±Øµâ´yâ°zÙ‡Ý%ô‘«z™ËŒgæ(îÚ ˆ#ÔÚU>»uÆÝzŽa϶ŸÐbwë¹Fø[nü9Û£ûJwúÉ2¨³åü15ÅX7fË CÔd>ä?¢…îõWn_ý<᜔¦.Y•¼ØøWá˜ÒèðµàþEzz¤-¯Òã*:ÈÓÞ'ùÆ´nO‡5*RßY˜8´sâÉÃúJ}aˆf#{IÑóÔ3J£}Mþ]º¬ƒ? Gk¦ îÂob.û쨟²»·åÓ´”àáYw"ü=Ö™M*ÉqÌFõ&œÐƒ[÷•ùö"1ìØöetä½N½zj÷Ú=(Š•¤ßä’¦‡eXwè‰ÝLÒr+‹Òn]<µÏnÕܱâ‚Ñl…Ù™·¨lR#»b¶š;¢›©ù8 ¹oY6m˜Ÿ©A‡v¬C.c3Ç„zíAwÚUш}¤¿&†Ù¶{ö³49ÊÇyé•ÖŸÞ >`»ÐDsоÁ“Û8 н?£ãØO7 *’?Þ!ê=ºkÓRޏy!ÖZûòÁ%¬uâ…†²´h?×õ3‡©JTåÝ9Ø~é„ì!‡0)Í“•±‡„ˆÞ†šŠâ__gÝ‹ Dw$*s¢IߎuEÃOì°˜<¸Kã»Ì˜ÓnÖXkû¯/\>á¸rªÞŠiÃz³ (ðÐfÉè9¡öðNˆö’û[U”ÙÏÃ#nYd¢‰Ý{áµsÕT½®­*²ãÎì·¡;ÿï¯è|ÝÌaì± ›VçŽÒ“`ºý.{JGômlðK7| wôÙ×–?[„~üx•|å$voh·6ì‘ÖvÍú&íºÿ^«y#·¯œaÔ—ŸTöÛY€4Š­«‹Óo]ôÞCÇ·þ°²ò¼‡×CNˆæØÆô“­/M‰:µ LQe×Ô‡·a÷Ðì'±gØ.ÃÄt—ª£gËôìmâÐæóÕb0[±Í·7Oï_=#þùY<{ØOŽÓúº¬Ÿe¨ÆîÒí°˜¢ÛµõG¼~È~ÙÄâ‘ú8úÌ!&–n’X÷½ÈOò½^²b_^eÞ‰hó‰·òGªiÑþ{6Ì1¢~$…{í\mªßC¢Š®ßv¬œFWÀ–è*OS­;ÌÇÏÀÒ Ÿ^¤ÝjBÔîÜP–~=€˜ô‘©+æý0T§#pÝŠÄBÉX” “èøûcÁãçpz[:mD¿®’?Þç?ný1‡!Ž×æÏ°öm2­ÙéGiÊ5?× sGjÈ|/Ia÷ ›—NÁÜo@„ºsœ=ZGEòûÛœûQ‡-ÂÂÅkËžµúˆ¶¢ŽâŸwOèAÛB“~rô4ëô¾fÆZr¿Ê2nÐã·¸P¤ÅychXá4}ÑÛÕÌæO1ã/ùºo[=o¬žºœXuI«„h·d‚èŠ3X›yó Öøç}ö-¼aYHCCº†tÁ#böz³qz=±n¤2®èÑ{Èüù,Æ>Qé/>ì‰rÁ³tâ åVsï\8¶c%N€Çwm G“¢‘wØDE„:sÄÙÚ~ÛUê'Ý0Äü²ä =‡yʯ ÚV°\AŸ¨t:¨BsàdMŽLÊ;ëL4è£Ôöo¯†Ýs —ªt)˜w÷â1º²í)õµèQ”ïë7°¯ÝÖ,Êóå{ÊðprÒm+ÌQ¯—Ü?ë{–pþÈv‹©CXa—½œ×ÎÞ[ú{iêõÓî¶Ÿ ] òd¹»KÛ¯%™·ÃX’ÉÖ›|ÌÅfùŒÑUßgqDáª;fª¯Ú®æER¤‹åÜQ8t¼ÍŒ=ëi÷%;WÑØ/àò[4Ù€ýÐãÉÝÈÓ‡vZ-žjÔÿO9Gœ4¸+–J·Ó«§Skÿ­èq”ß^k3“þÿ¼þÈA~;èà«‚ó³ík掌~“VÂ|÷o_k6ÑàwyV\0È1I—AÐÍØÚ™ìW"ti¯~Ê¥'ì9Ñ%6£ ûtCsbÏ{á€ÉlçlçFˆ×Þ-+çŒýýØMœOq,×èXÿ:=æÌ-K&VÿRyʧót׸S8ð£9ˆÝ;7@+ˆ;¯³ïG9²kÓ² "=_£«—“»›6/ø ýrvíV„#æ>Õö¨t?Æ*ed¦!›üùü2=þ²¿§ã†Åü£„È/?O¹ˆ®… `õßKÓbÎxj†/SbÎuÚ°`‚žà!Ç]l–šÒºëá7áàÛÖþ,cÅ0ÄꯀyìG'ì9ÿÎ5³Œ4:ý,{r+ä¦>Îûüg7Њr;4ç2™ãú…õû(´ùú&çÁµàã{¶ü,ˈ=‹å /hð¦…MGÀ]ëçŽB½ï)ŽÐ¢»,hEò4ª0õ}öm]5ÛdpÏNUÅ™w";×Óe4G¤³éÕvnQfîX–g÷ýˆŽt{vàÜXê@?ñÈK¢cÔˆþ*R??¤Ä…ùyüx“DºÞf7Ÿì^zÂ`•¶_ ÙSP:ñ›Ž¬Èb~áÆŒ¬MMé“;LÐf´nñÚ·¹o„zÓ­!¢©Rß^¥Dîß²„~ÃR#œ¥'ÒïYŠR¢ƒŽÿ÷l>‚†‘Ý<ï ²uÿýR’uïêYj$GìÙ¾¶„²öV„T%é‘ýjÊPºjD‚‚ëh)Ñctºh´]f:¢Ÿ²D]Y72¶îö¿>¾H‹¯cÔ¢~Ïöu%ôoPŸ£Üna:¬·ÌOº…•.ÇÞç%] :ä(ÜIT¥ß¾äw`;[·bÛºwÏÇÖ–ˆÕ:ÊÙƒÛ€Ò‹]À„à:sD_ÙßïqÞŠ"vjJ2¸ë !w“ªÿüÑ{¶X`Ýj²b5¯s|{EWVv+‘ŽºÁ‡èj£#ÕuÿðDá/ý|‰ÎÑzj¢<'Áuj^gݽx؉֭ݭÃïÏřدüœ¢&ýãufžgõ‘mÀY-Ìk÷†ùcX${tÕ}+{Œ%Þ|20¤ ·}‘J®³\§¯R»ô»$ŽHWMOn…u\3‹žVðëé…ãq~¡_u²dERŒ¿N—¡K¦×ê"Q÷öYRô¹ã®›-fÑU—oý­ŒÝ.qD™ú2ºÄJG +õu³a7—ôÆ—=ï¦Û6ú‰ƒ¿ÇöµóÆé©Ëþ¥d‚ƒº“ÕÓ‘:=d«ª›é™Pý(mý\ãþìÞ7* ÙÉ$;þì ŠÜ"è’ÃÕfÙô‘Ú*íV$#ä¹Óº‡i*Kþüòòqt !ò{Ùø‹'vY²½ûò‚^°_ajØ»=\½tÊ)\xîX¿`¢¾YÄÓÄkgùºõzuç´ãÏ;ßñGa즤¦ˆ~øµ}ÕLvj{þ@H³zô‡)±$ŠOhYcxÀÁX÷¨ªÐÆk±wÇ_åt&¥;ˆAÝè“pÔè§DPÂìAweOïã@ä´añC4ç{ùóG1çObÝ &öëZYøèûYRvKÙ®ü7@u¥ˆ:Îë±thKMÂQÃEQïÔøùej|ÌnÕœ±º8®V—’ž¹l¶˜3vˆÆgáâ]´]á§öØ,ž4Dµý÷7Oâ/ÒÓ@œx%ëJ33n_cGKLGh“ž Ón_ö§uO=¨"ÔÆ.ám…ãi6;–/æ?nȦAÅõ ÊT’žišÎŸ0T>VF>vrß¶u &§ÇTô›C Ùß¹‰§òGC÷Â}éy¼>2ãûÜ¢ô8Q‘O‘<×c'{ɉU½¢ôä¹ÃráäaZ]$!¾”[—ü=wZ/Ó„G‹çìhA?R"zÈfO?/RhUù‚ñ_ “¢Ž 7¤F˜-Ä'× s+éz¨7Ö½U äyREºéFšù=ÛA‡Õ³ÄkŠëÞ>½%ð 9´·|«êuœ¬Ì™é4|.ʼs…­[ÇׯËb×+gŽÔRÄtN¦­›‡œÓ®öõŸÏÄk/*ÎÈÄwóÂÉ}ö«çJf[þ<9ëvÚH×s~Qqø¡(ѱ;1œ œ,ÍÆ îï`E²\r/*ˆå4§ÓßêÒ§°n÷íè¨pwÚGøìA‡5ô3*éætâí{¸o† Evïb˜‚Aë ­®R¿>¾ÌH¸tÌ•be†( tüþаáHÀnUÿ|T¢óîÝñ"ø¸‹àmjßå=Ž ó?(JGìÇ¥@¼~–¶Ž]I¿ÉºÃWÓ(ÝUªJÿbçü®(rô€îì€u›‡§i#tºÃK²£CO–ÑDˆ”ç‚ Ïñ­{Š”ÃžjЯÓh¨ÐýF+R8 %]GhܺjÞx}L„ú/Ò"ϰŸ#¹‰yø‚ýëª6Ezô¢,ñ ±ägE>M>W[®”?Ÿ‹2"NrÞ¸l†ñ 5²,ïqì%ÑNBdqŽß ±©—÷€]éðߦék 3…"'aLa<çqƒœ û©tø]ù*+1úõ“„K>ÂïJÙ9%ÙkÑ$:<Óéþ{€ŠG騈Ƴ«íŠ™ÆƒT;6VAÎWÎÝm»böØ!½$~T¦'”fƇùìéÉ$|OÖï-Ûø©ðñ`PRÕ;þOrþÂäì±cýÂIÃ4»Hü(ÏO޽è{`š3ö-öµ,÷1&é,ûíëv;Â~<®Á}r|·õbÐGî/%Ùv?Þå=¼N³tÅ,žJ³ï_E ݺzÞMåö Ÿ_e½Ê!jb:Ü€ŸJé·:M·/ø¶¹ãtÕ:5Vg n{çj)KÖW¦Þ‚×:m\:ÓXcëûûBQÖbˆ¢äµç{Eü÷íåÓGhuikÎ>7F|&ƒqø¥ s=„yÎ#íîÿÖ¼aÏ,Dd¹Œ[ Ô_¯¡kôˆ„ލíèLÐg‚¢t^ä¢)Ãûá¤úŒ<²ÛÖbθ¡}»Hþú\$úñ¹€(:îõ§ßGòß…°›éöì&P©m-K%'Z¤’܇1|ÐsÓQƒÔäÅë^¦ÆŠ5!²3JSUtˆŒæÌ` ¥’ϯkDˆä„3®LÃGæ^ô¤É¨Ÿòç”cy~¿Å\ #ù4úàÆyŸý;6,™a¬Ûû9—æžÀ¢¡®ZG!1í¡ÇaÚ*'éJuœ^/ùV5¯Ÿ&¢Ý{¶¬š‹ÓäbÇöl]³`²‘Ț)&N|®ÁЋFv9ëã¶u%uY8â?@(RŽVæ,Œ‰Õ¼yöèf˜ßA§M+fÓÏMŠF€±6g÷œ@äÉÐ Ã ¾Pœq›¼«ç‚Ü!^t" á,FEÒNÂj'ôEýT”yï*š³Ýr±éh‰œ­Í§j*‰‹!kÒL¶¤IÂì0¶u-Jîu™YŽ æéçÉ““š\ëooŸ'ߺŒæl^5RNâ5:4-iÊb{:à–²QåÈFÕ5vY_ìÙ ñ.›ŠÜK¬¦Õµ=¬6;ñúyŸŽÖËfá„Ó Cl‹‘Œ¨y˜+ÃúbÞðäiµx²˜f\Ø)š¤ÈÚ]Ú 1ç ÅãÁêÞû‚´øÈ3Ç÷Ú¯[$@ˆüœçÄK–¨}Ëþ1qšQ¿{WšÆ}Gœ)³ïS‘vkÌkU¤ÿ|)Íyxó¢ßAg›•´q‡wnøÛЦ*·kº©@‡&Ê>û5ó'è÷Q’øñ>Ÿ éÍ4Ñí¥ÐöLJ—w¯žóvw°Â!ì4{Ä 6eWºsN}›1VÒØ;ˆÓšéÈ=Øl&é¹Ù¯Ee¾ˆywùô×­OèxãHVÅ©õÇvoZjÊ*ùq~!gŒ4‚^€åCIzåù)q0oçMËá}”À â,4甇SfBDèÂÙ‘,øØnÁ~Ñ ÷EÇ+bµŸ‡(@ˆüE.œ2b€ªl«oïòSÑœn á<ª6!gWjzH³cä%ßty¥O3êì1Wvè­ ^‡1xërÀ!gÒÉоÊR¿+Kž&Ý ó?ŒÃ Â/›–„HS„Ïcø³‡±Azj¿ÃzrÚnÒ4íQ$&ÌúEÓFT“¯«xAÍ9I^çáDŽˆá‰VXÌ]¸P?@…©Ã+éò²Y1k M=œ÷SPäá]0±ñZ]¥ÿT¿É}|+<ˆvç€4éèB§ké¿ ƒ\ÎÔáotSr^8a‘äþ5ŒA&æÁê më?=I¼~!©ò¥JŽ˜GyCÇ­ªióBˆØ°EìËM31Xå‘©HrÚ•ó&öë.#öõ-šs%%VPW3¢7ÝŸŽÒ[¾õW:±¯³LĪ™-z1˜¨Èè“û6,™n¬«¡(ù«²ÊI&zwßyØr³£¸®Á¦Kˆ4¥ “‚”8rë¥ÜqX‘᧸ã ×î!Ûºîý‹Œ{t!÷_DAlЬST3¾aQð ”ǹ-²RG‡bX- š+·ÿóåMn²a¢~_E:×þû Mÿ¿`‚öÛ¼G7Yƒw$[dEuݺzhŽñÿãcQÕÀkêKÚjF`®õ$D爄8 |z™¥Óßx}Me)JbM¶8N_SEú/šƒ}¢UñUrDÖ©æèu‰½ž²˜'9I4ô,ö”E‘ù)·#‚Ží±[»pÚ¨A½Úýú\ò ;Oû$BäÂX8™r¿ ˙އ.s ñ¿§‰Ô,6IýâEžòعiÅœñÃúwïÔºö}âµs'XÚÊYfåRC¨Á:"Ãigj‹Î,Û-šÚlÌ»›‚A]¤~¹Ï⛼ŒG–£Ò]š.­(h» h“òÀ:üÁ–Ï;´e»WÙn\ðõt¶±˜7q¸Žªœøâƒ+ÇxÁõ’éšSȳDo`¤þTaÀh§é¨vyØq·m–æ3Æ éÛUú/Ý]éèÞ„Ól‡UwlüBCÛ‚ÖB+pbÉÀrÄDEÆ`Àì²]e6yÄ@õÎíîТ`z<‘3ÓQƒx;R(¦ƒøÚãšÉHÌ&i÷àE&\9ëµÏaÃR0¨_·Ž EÞ±êeþV#,"ÉÚëÆá {§Vµå…éw¯†úx8Ù¬4›2òfcË ÂÎ;¬"Ø cËj+4 Ñö{Å‹ô;QÁ'ܶ­_Œ"{S‘¥9âÂƒŽ»mƒÆÇ\ôõp´æïæˆü¿¢Ëš™ÖnÆ4Ao:ü®bXhB’7¤¬}_˜q/ú¼ïÁ]›×,œsᔇ£Õ¿ˆÌ›Î¢ÂTÞNs‡‹Öµå©B²Ã¤"ªJŸ=¾qæÄ>0ˆ s$‚ÈÓâ#hÛV UòÛ X¢ÓÆå³Æ Â,l‚`a/2ï_¿àwÈeëÚÅ×éí̧nBD#\·¬ýx.„FΓF˜ðÀ鎢ϟ]·hÚèÁ½¥ª^ç&ߎ<ë½ßq“ìÎÝÁÒÜ´%â1 Žù“Ø!¯úõ³‡Øj4O¢½$hÒßÇÄ:°sãrÁgë*^>I¼q1àÈ{KÚ$J£5‡ßcB=츜˸â¼IGT¤)Ž +u¥a€"•à³oòR⯜;éád{5'ºõ;Égã{ìè¬ÕŠ}-ËKŽcéæeì©ÈLòâßYfÂìw´^>EöèÔ¦îCQÖƒ˜K§íÝuö„›=Úˆq)ߦî}aÌê8È‚q©£ÊDÇ¨Ë Lg'Þ8ïëé{)@°Yöݤ;fT$f‡Æ¯å…™‰7Â.’Óñ÷1Ät±…ç³éé,ì·Y)n‚ƒQ‘ªrmë?—>K‰º@£vå<ž(kÉàèî@SdQ¯’¨G iaýºw$›Í¸w-üÛ¼jÁÔѺÊþ~+ñäÁÍóBÂ0lF¤ÓÝʘ}•Ûÿ®z Ë¦Íæº¥§Ž¤öósI^<&©­*/ñ³òu^êPúâ&ë„¿ß¡!B©-èÚRëcÍ*ž’x'Åwùxoˆ§³íêÓFëöé*-V[Q”ý0„,Dð9ŒµBV#š Áékv•n¬°oSúBbºèÇ÷Üh@Oyœ5H$¤ämT¤¡vÏÎí~U½yžŽ©è(2%Ñ ¤i¾lö8}-„Öç8Qœ=±//ùVDô‰éb¢G™»ºìyê¨ ,[ÚI½¾]eZÕ}(~Š0Àĉ¥iô6ÿI ¹†K§€k¢r%s»9º‡Šœ`¨£¦ ù»úm”„%ÎÇ?ÎCDe÷Ê&ç:ÀΑ‡ÉnX¼<1Šy"vÒX¯¯JÇÖß?–иa©J«› …­íÁFc‰)9²)ƒiaEµdÜ1aB‘è+Jý©yÇ8ºýæ‰}}'„\öƒPÇK.á¿híÊù‘â+Ks“㯟d;9Íxˆf·Nm~|D¯,8T³ÑIÝbîÄáÚÁØ-š ~‡Ø˜¿ȲÈt“!}ñv0:ó>¦ ¹ŒŠì¥Ô¾ñ«(® å+H#ŽE!#žtæ)ÆþcÁ?hžº¶q¾ ¯µËŸ‘7œ<€\hj2T«»lÛŸHi˜äô¥]["Ú¬¤˜ߪÿôŠÂÜé£tœB±Üe‰ÑÊð†w÷¯ÓD‘s& ìÕ¥Ã_ÿÃ.vÿ'"Û¬ÎMjƒsyp`醻ì§W9naN Eê÷ë!/ÁrK’:LÎŽ”ålÓbûÉdÎ#AÝ%opFˆŸ2Ë—Š1HCYÚ÷ [C„ Ó¬húР^Š’¢¸àÅew³9'jaòÿXL£@(rúýþªO‘gÒ¾gþ±y¶{Kýý‹zƒ]¨®(ùû Í«hV¤Õò¹“F îÓ•{GÓ¨hB\̓¿“oz F‹òVµÈÔdˆ¦JGnËܼfÑŒ±Ú=AOÔñ-"ózª›ÿíÎÕÐS%ê©I[a3¢h'øÞ‚õ×Îû2·ÉOåT`nƒ—É_f%ÅR‘Λ×,ž1n˜ŽvÅbþd¶glŠßሼ[ŒQ…´Ö¦F lý’Yã0\ÀræÛ×PäÞíV+æM­wÂ}í󈽥~ ˆ˜pè¿©18Ê¥FAN]®OLBß)&¢ d —÷Td8+ríâ™ã #鮘ۢs ±iïeЗO ÃÓlH÷܇v#Ë‚@ýÀòúϯóR„"­WÌŸj|ÌÍÁj94@]Ÿ‹×.šn2T³[G,µ(+éæåÀ~¢¸„§QÌ0…"·¬5Ÿ5áèÞí`;|CM¡]C3"j˜>f¨V7(cà ¢;3Yˆj3³î_¥¹(ò<Št°¶0›jZrOï D„@B­ ²h#$¤³zLøˆ ÷Y:fŸ™lá“T¤Ç®-ë–Ì>ìJ}㣬¡ªqÝâcõûu'7@œ¹̲MSÛΙѸÂ$À;rÙNusظrÁ!XÏ’™ã†QâW¢ËÖuæ H0ÁäÛWΚwš½ƒ}ŒÆ•PäIÏ][×/Å–ÑKà·èýv¢?‚pئø¨Î%š-n^ <¾HêÓU†ÆÕ³”„kŽºíØ´Ês×lÙXöá_•͈ëYáô5ôÇ„«¡Íi‰*ö¡Ï-bŸÃnU¿¹ÛÎ][³h:QKNÄ®ªÝ¤Ükç'Ô‹;bƽë4[¶3³#bð|õŒv2àØ>G›¦ÑŒ»ðvépJå“«r³iÍÍ&½iaÛ _Þf>ˆö9èb¿§Íª…ÓØÐAJsS€xØÅÞr)Gd1!Œ™Õœ¿R° ¾‡\í‰@4[¤Åê> È„è‹ÇÝwº;nZÉf­€ˆw‘¿»‰n™‰1—˜›tiÏ“l zCŸ4›j<„V÷ëËÛ^ä!WôÌ‚ˆÕÄþÿEd9óò"‘D>¾BܦÞKf§)ÝA¬–м}ñôqw(gÅü)£@U¼™¨Ú„Ȧe³n)ÑqaÑ  Þð¢Lé__Ê 2“â"Ï:´‡\¬WD~ ú‘Ï_‘]Áø™}!‹Õ’}ʼn<ÓQWjÿWTdà Wš8“‰©VŸˆ©Mˆ yp½¹†ÌH«ÅnûÆH僠›¬ø¯ª²Â'(2Äן¥¦<ɹ/Bädƒï#e>º}…û‰º‚5½¹tÂ}§ÍêEÓÇÓVSм{=,$_ÊG7'jrüÕP âÛçN¢U²¿æ<ŽÂì˜2 i›Yô&äÔA;K, Té$þ³ê-y%Ú^B¬ê­,݌ȧïäfÕ&'\ýGZÏÓ ›ÓÇöAÆ LÇh«)´o¤"Sï޸优0\ÄÓ^#!Λ¼uʼnTÅX_3"c±4/õnô¶lQ4&¯a® 6O3ÑïßSAŠŠÌM½wc§-¢À8l¹R‡¿ÿ «8Këi‘w¯3G¼äË@oÎx £ÅhF׎¬È¬‡·Ñ®cÁ)´ë[¶¼")IVüg%)÷n€ôËf ñ[EzâËÞˆù7´/²$7íö™Ê€ÐÈÞEˆà½H?«ÞägÜ\Wr¹ò‰ŠÞ„AÜX#vmø@V$,(ëMÓ1|#¾¾g_-Bœ:þ!Ç–xÓƒ<‹Jð£šwÔ›Èsä^`ù”ÑCú©ò"óÒ¶[ [ÛYò³ ˆÖ„_‘ ‡†¯Ê1·¤Ùb±mã†ìÍ‹|‘-ÚU†øˆWšáÃòðüw°Š8L¸|OK¨;#ñ¦0–ÍŒ/Wí,õ·öcižP4}ôwMyKD|_Äþü"ëá­“è+7†¦-¿êφÕB°e/òÝKö £þA !š¥³?û bç¦òã3鿯¥ ¯4Q„P$þwΤQh*möû!}EˆÔ0¶½¨‡ivo oà…³÷Rs§åEþª~G¹bÒH2$ñÖ¥°B">BÑ™é Ç{xb¿0¨*VdݧÍà< ³ùð?ˆ ¦©± &'„úrGüðgUŸ,§¹nÛM›ŠAIE$uŒ&u†ÈhjÐì|w0Bö92«a•ÿùÊå›×b¡T¤‚”XØÊ7éòIÒ•ØsSe“Q‘õɰޤߺl³²03; EvjÛ°‘ZÏøÙ†½ ‘ „¡9R1âšÐÇ—ÙoG÷?¶R4G7¨ÈöbÖBŸ”e`2|ž5!’t‘nõýSi^Ú}æ°Žäôgr*VúKg¼=wÛoXaf:†Iõަӫ‹LëúÊ7ØìfDú(Œ¸_ßMaÙ-¶Œ¿#n;lÖ Á¼È +æO£Õu‘ÆÎ¼É'ÄsM6€¾‰þž‘Èxêú¯hÁ(ÈËc—á"e-—Ï›j¢OhõýóëüŒ±"Ä…´½ØnPí,0¾@””nÍÞŸÈÞ¿w‡ÍêŬȞŠë—Íb<´¿šb±ïŸØ;"ÎI¬ÊÛÔ³ŽÁÎ i3‘"xoˆ@OŸ€-—³"5TÖ-3y4,X±½XݧÒç͈«‘{Iþ•H@Ë÷8lâEöëɸÉüo(}žÞ‘X¥Ñµs½¬G,'û׳ù`¹zþôñýÎB‘5„õÌ-=ñ&„õ"©æƒÁp™-»É¬$ÿ|«`ÓïòYŸ¦"‡ô[½x愺šx{úýˆ¤%轺ûÕ¬xâþ0; Heçý»;maE\µhÆ£Á}»Ó7rD¾-ñû¨À“jÊ‹ž&?Kæñô1kóöJÂÎ¥3'ºnßHE޲’JÁËríØÒDÍá ìs ^ ‰ø2éÄ#zôTàÍ…¯„úC‘ëQäXC‹h)-Nâ÷W¶+͈3Ç£x|ÕoPùYŠÈèö¶¤àÓä;×¼=QäªÅ³&‚Çäˆø !²}nãBF"dËvbÞ5R¯iïÁÈ¿£ûX‘¦c— â Õ0D¡s„ˆÝmpnZ)[6 ?{Rœ‰6õì/Ì~œMEºÐNΞ´ "4Ðé¥Lî˶ùD]M 6RËÒïô;²wÇ&òT¾Çl«ˆ çPäNVäˆP_[ýÿDmdD}_„eCqÇi®Ð†0¡}'=‚Y‘«Ï6'öWë"Ó†fíÓdâ¦fD&¦Œd’´ìÿX6ê`»Î÷+Òl1‰°¿š¶„!Þ¹pÌù’É ^ä†`^Ë“n_½pÚ˃vÒ|—·blòÛt Ÿù<ÙVf ¦6[ö‰Ð0¶Ÿ6KXÛ¬àST¤åò…T >סÕ ¢m‚þEÄ^ÕÒ´¡IåƒW­W’ê1a€@Ï3’nEŠ\e |ú\%'Âÿ"þÀ+Y4…¨Û¡hª£­`YX[+am(’í¤¥ÙôqÃÁºÎR¨Ÿ{DÔjÈ>ÃÈ/ˆäˆ:všy \â¢øNn"%êÓ][Œµe=Š'²6!6W‘Í31Éþr±M¡Å¡È³§Ž¸9m™7¤ÑMN²McÌjHë"T½}ù•2ëŠ"WعyÝRFd&š÷`ybܾ“s§˜Ðpk×X –ægb` Db*¤(‡‰1—û'Í>Jìu¨º¼øYZb,/rÖ¤ÑT{'‰ßß>Àë@Õ–ˆ‚šH4}1e‰&OÎ[Ö/ãcE…ô‘6 4!NΜˆAÖhçÕÕ ^ÜFDˆ¤øâg,m’¨¸Ïl³^I½½HXij´û¬HÏÐPúXC Hñ âlBTï"l=™<_v$ìF”Do`[]i}Ø1t5švrúx|OOl} ´ºE´!ŽÊ\©¹Ïä Ë&J®—áÉ=:·‡Þ ÅT^¤é8#ˆPÛ_QEjjBlÛ@F¸øÙä%‚è´ ¼ƒšð0žvrÚØáƒÁÓ Hy1± ˆ'<\¶qDF8¾Åˆ%þ±×ͬ7†™<¾W¾ ‚ê æ·ªÿ‚†r ü‹ *eá\'@IØÅÌ *ĺÀм ‚ã[:êÐ/ú–м!N&Dl<£ªz“)ß¹N¦ JRoL H`yeÙ˧)T$>@£›¼ †× ÄMˆ:âëü¦œF£J„K¢7ã…6üj*+ÓéM_B;ñ4åÞMâ*Ž9q‹ »à‰ +Q÷è[eÛ5Ö}.{ÏÇ^Áµ[þˆþÇEˆÆ’SпIáḚ́»9²Þ ³}YgÁ•<y‡d°²ºOe/²“ïÆD„0Dk¢ }Û§7…ä…|Ù˜øØlPÒÞ ºáš@-+é~,ÉÐð©ÿA4`;Âêg¶ŒeÃÒ’å<¸Çz3u omëzI;Iï ŽBH¯ ²à› Û±ý»ìÄl Q°J>§h˜"– 7 fLA2îÈjzñ4õþ\•õõG ÿQCèÚ ¦`¯ò¸²8kÍçLál!F³4ÁY÷¡#ˆý» ŠN³C’-›¦¦úὬ7LÇj´L^¤1vZE|bÂuŒ´ÿ"û_²“…hÙ÷nb»émè 9¬{/r4>DûŠæCâQ÷ÿE,2æŠd®ÁMã½Y:Dö…^P‘£@›@îDçaVåEH™}ºÉSßùPaÂië‹…D âYþêùHœþç¬'/#‰™&íš±r‘b=D~-¨Õc÷ökˆ@†ƒ4UeÄY‘#@𮲒±°âÜô¤Û×D+ŽÈ¨Æ[š%Í#¢ä!êÍr3šžœ$êzÿÊH·Ÿšr§vß+ßÁpñF‘@\Iˆœ¼­HaÄdšël–f'·$Å,QQšŠ,£M%zÖ ÏÒ°ãag|°?-Í’Ëh"qµŒ” ôBol×@P–Ê‹¤PêØ–Tù2'-ñÖÕ‹-Mš+Jf sŒ]˜làoe¢ýŠ6å²=-{‘“šwõbÏaþ¾fD"«(|pM>åp‚¢Óš¥óÀr½~Ô©?—nÓðíã›Bˆ2.êbÐÉÃn͈äT°Ó¥f¦ã„‰D}–c9Ôä;hxM@(m¨øÏ|ýøº 3êÂÿ r‰‚v0>5aÙ\^¬7÷’¹ÓÆ¢ÅêÊ(²~ˆ6¼õÏEvò½›W.ž<ä¶së†&Dˆžl„[‚ÈîÉdØt>¸g´`æÄÑXmw*R¯?ü¨(ÍÏJ¾{óÊù@ïÿñãëÿÚuFgSƒùœ©c‡Q$j¥®Ã.aïÆDž?íM›ÓQœvÙb™/[ðRÞ"±|”>†"k¸Ý_"ûó'xSdèihÁ1&4@]-<¹£dSÏž2f¸.aIÒì‰™Ðø½ªF{ŒÅÞìu$ÄY Q¤W2ž:´4*¿cvoß´vÙüé(R‡ŠØ—h¬«|W ëI¸€ÝnFd/-Ø·RGf[…ÙpIô¦iESƲƒEŠ2mI„E¹øÖp zѲ"Üùs™È[Ù²É0 7Ý–ÏŸ>~$QQŠ">¿-z–žDÿž`D D¦Ñ·›Û(j<¡9Ç  ·/ÄÛ©È® #Ž­/{ ÄÛÑ—ÏÑUôbÝç·d[¢eÓÜ#Ñ’ÄÈœía“óLY‘=@G’yó"'í!ú÷!sDæLÄPѲE èý¶ëWEªkŽ 8$Y'Þºv)X@\! öÇ&)_6Íì¬W EöÑd<¯¯þÑÅg"üx‡ÈÉ¡ñŸ™ŸÂó1;ˆ>€"ûõApˆ° ;å~ÜU4¯ù ‘ÓõQd!É—&T+ÙsÌ÷˜.‰­V«ÌçR‘ ÕÉ”@Öÿ?ˆåð &|ÙâMöÓ?utÿîí6ëàT¤FwБIˆ0³‹xý€Ëv›–ˆíèušÍ|Ùl0çRo™&x‘ÓPdïn #zùŽd}÷&CdßÄI"D0ºÊ„l0›ù€‡ÿ1·B½äs„X.ÙKtÁI„@¤—Ekh‰øå=Ÿá|ÙÐ:¥šL “pW²"Õ»âû@pˆFɾPØ•™!ÐDÁ²É¬ñ7êMäyhŠ\»ŒŠTS}Å÷aSØ«| kÿAD†}l^¸HËÖ€ÎZóAÒ‚ÃB‘=»ÈJ‚àßa=ô}ÿ"r¾VF.-[¦à.ä€Þ‡ E^¤ªR§vbõÌ‹2 ¼(¬`ù‚ QP@űý»·ñA*šöõÕBo®^$ÊAhT¤iÅŽDp, í¨€¯;Ì¿Îì_Dò[Ì(Z6³ÿ&{aÂp‚_ ÈY݈Ž_Þ—`KnG‡‡œ½f6cb"tß4!Ù²›ŒŸqî 8]ð"U:«ÊKò³SoE_]¹9Á–rD-â)ʩ̴hÙäXMþBËéc(²«<ѱ’$“rÿÖ5á%»é³þÌ@ÖѲi4³hC>ÍHC.T$ÈÓºþüIò½8ÁÿÄÁ½0'Ø|ÓªÉí> …/»y‚2ƒÎù E.'òüÁ‹óž<¾ÙÑsïNØ€¨Å¿~„W#Lo\Í–=„Yk¡7 PäyÒ+’ȃ÷—¡úÇwc£ÂÎúâVŽ8š!2 |¤9ê´„¿#Tä0qW…Å¡H"O=<7ãÑÅY¿ãž{qÉüé͈b_ÅB›¦.öýDÞOÓ„ˆLbcEy~ÀÁ_ xìðÅ3¾Ç=ö8nµjFÄ'¡81Êl ªàþC´E3ôÛ¯Xì—+r‘çû—ŠÒBH&=;ã{ÌÈ«þEüö‰¬Xd¬´lÍ&ó܆6O²"‰ D[Ž8ªâM>¡voãËfD(ŸV˜L¦ÀŠì@ä¡oÉxt7öê¥s@ܵˆ‹ÿE¬l`VÒ²G0J2+lâ+²=‘§¢ 1ØßëÐ> ®·âxŽ(Ï…ÁÌ—=ŸºF”¤ÆbHѦñ%ž°š!Žhøü?Ct9½ÁˆzÓ…D“…yëw‘'ïIJ"~ñ,dMöhµz©!mB¬. ùÍ—½æd!˜“–:¢3YVdRBC-#èxûzäˆF âLB þ¨&W…lø²iü%Yo nòVdæãû¿¾U ÿºÅ$sâ Ì cˆ“›Áaæ±,ÆPÀÁÉ ™ Œåð VdýW§0'ãº~>È÷8Œb»-F!DZ¯‘ÅA0iÙlnÌc½éqƒåŒ×TÚFžt"xxhÐ)ÈÚy,|Éüÿ ¾f>Í':¥ô–žÊü-œ4ÔjúïÃ;±Wa§ŽÁ(¶Ù €ù3&1¢·‘”Ë}l_6Yè ¸$Fúà~½ÀrHQ(’ZMäI"‚Ã/zìq²·YOˆ“Æ iFÄ¡Œ2«0C±lì N°œuG­~ /5ApŒ‰{vÚoZoa>ï?ˆÍAæÌ¿þåÛ±"AÖjt¼@²ÞiÄÅó¦O2iˆXGÑán‹Y$ôËåÚ³"±“¬ÕÏ2AG<ØßûÈ~²žu"D¶í„H*kN $U‘ ô‚å 2íÄx‘¬Õ9¤"8DHF±qÝŠÅs§O4Þ„X_SE³äG< ÒèÑE¶}Vä+V(#OtÄ…3~¡ËŽ­×®Xô_Dî€-F0c­À1M5•άHXЗð ‡èH’¬wlµ^»|Ñ\SÚ¢fÄæp.ø2½máìiãA þ½{(ÉÒNbsª*àDžX8x‰p·Ìl9ÖÃûˆk+ã-›(I½á „y‘•åä ÏMFpˆp—ë5Ëb‡Œ [ ÒI¯9y°¼ÅMoê¸Qƒûõî.*òÓ;ÖêÄø˜¨K!˜[žn0 + èˆÚMˆ8ß–½Ì#G–M”ä4¦ýn*Í)€Q‚ÁéHˆxV‚íæˆ=Dfä4@yü€;sb°Mg[¤«ÝWME¡c TM­&ò0‚C2V͈ýz‹e(}æË¾K¶BSÎÍY¬)+’½ûTVy"[v¼mBìÄ [vò}fÏ~ÔG"ÐG]¨[E±ŽVƒ<ŒŽL2þÄor„ÈNËÆ˜#JŠ4+*’Þ®\ôüi:Zw€ŽŒàü-ÿƒØYF‚–ý®DÎÙþ¡Æ0¨[­4Usò™ù—þ‹È“O,;Q4çÐt'`EÒûUIƒïb_@ÐÓâ D"æ'ÎÕlˆ ÓQ^$݈¸AEBÝšê¤Á¤;qÑøJÐ #Éõˆ½º ˆ]奉è´l„ö{ ã>`)|‹ê¯A¤VG\àtľÃ`D%ŽÈbƒ°l!0ü¿vÌ;̪ê\ãF#2ÌŒÄpíŠ!×^î5!AA%"ñÚ‰5XÐk{ jÔ'QS±÷Â#Al±ÄÞˆˆ"^Å‚b—6”itML4rß÷ûÖÚgïsöÞkí3gfÎAÖã s~çý¾÷ý¾µÆ`C‡Dî²gV3<ðE ÓÈ,ˆýzÿÌ.qÙUe¿Ütf"wÝñCÌ ­~ðž;ÆŒºßøûßÒ;Œ*ˆ=wÉí.çÅd^ féK‚Uä^»÷ÜåÌà¤ñ°úžÛÇÜëþø;4iÀð“¸]@ü‘>DðNš7S.O¹êt·pÿ‰È}öèµëû˜ALõ£÷3<×\vÑd‘/î<{X"Ð]«¸-òqüFhëc(¬È}÷êÝó=Ì X}×m£o¼ú²˜àoÙ盢®µoÕm¾Ûíí) PD>pà>}{MÇ ªÕ·ÞÌ8^x‡‹‚Ma¼,1ôj'#i/#ƒ…õëý.fVsóàëðÓO:î(¬ØÍ7Tâöø·®×þFŸÙÓe§£hDöïKchõ½w <ˆãçr:ŒDÎi@Ü‘ÓÃÛsEø"’e`DèGcŒÕ£GøvÚ‰\¿ì¯ëÉõbê¤ÏΙX@S&ª76Åyä`|LŒÁTßÍð\1RþêDþôËVF­B¤I¸EÖ¦Û¼îÞ .'Ù/"¡;`&æ…çÄj„qDÀs¶Éž'ñÛ®äÒG6ù\}ÏÉ%˨t 3áY±šáA{Æ)kMëNÛD}°Ôt·sOYYF$rŒéJcÄj†9ÀØŸÀ±«Häƒn3-/mLâÛºúÍôB$¦›–¾Nc`5:|=ãh¾jÐ:öÛlµÙ(1Ø,›“øŽ¼–d Þ`?‰…pèk4Vã›®»Û‘×s%‡ˆúв9‰çnëépænˆc¬–8rd$X$ng‚ùD´e¾XŸKr+#åF¤4ì5†VcóŒDp !ç w›ׯZÄ>¡²eÉ…Ž= jøYŠ<îhc ­¾—5¥£¿kL(nË­»+ñ«•ìj¤lÝþÏ>!®Âƒyʰ¡Ö(Gx°+Œ Vxˆ¼B:¯ó )¯·w!îevò|¶ìxkŒX=qÄ0”CÈ}ŒgG÷M»)1·yë,mž?+t¡¨H~úÔa1´ºN…ÿúÌ'VOO\®Ý7éU êí-eãù¾¿cˆ7/ÊÓY is6vCEâÀþ î"ʘo£eÿû˜DzÉ{FEÞ`EZcþ¢á9ÏÌ–ˆ[nÒ­Vˆ\øæ’Xw'Q¼Ñ ÀtR??QQ«MoIÜoŸ¾ n÷c%þû«•ö²Éñ &‘Þàéù*%åœEV^cBÀHadHüÉÎ$þP‰|NòaÌ‚æÆ>ž :I#&È«CÄ{ïÑKˆ¢Ü;ZvõºkýëKnÉO <ÃBñ;ÿÜ矡1bµé,Ž!Tb-H\D}µ˜²×F$áˆÌKËïÆ? cdMxrÄŸïºÓ¶B\㸂e½™A‡79m*F¤X1î)ügP­’9âÈ`¬-±Fˆ›‡R>­:­õ5¼A€øž ‰d‚ž{ÒC¾c˜¸ÑJäCÈ”ÝMú°b)ô¾^}A^.þ3ò-ư­žtd0ÖX?ÚÜGï‰UðfQãÜHyN$ì½ì"ä[ŒÕc ñ0}p¶7Æ}Þ4ã76¤\Er!A—<Å…1ð VKxÌÈì&þc…>AtuÓ•¹la7P RKE¥€Ãj„Gâ(D¬ž­·Ú >PЊÃs×#ˆ$¼‘‘œeQöÄ#÷ßsÇØ›¥§˜ðèÈ">݉D}fHÙ[ÚŒ.[ˆq_¢ÈôøÃ÷Ý};ÕªÕÄQÆ:B” îuÞ=â †{®ù¼r yŒù¦12AãÈ€÷•Õ“#òrÇÛ‹‘bså—JÊßyC:Éþ}ã£Ì7Ë—©>ótÄ‘ç’Ø}SKÔgËÞ^½ù‚šù‘©å>Â|«1´áApŽ5‰(PˆxSš²wÔ^м‘Xb¢Ü;nÁÄ`iõi'!ŽÑáêÉíCƒÏ+ÝØH_,‘Ó!rw4mdÖa ­Ææ9îhäÇr™‘¸îZ ‹ÜúÇ_ÿ)§Hdr⸧Ží/b̟ΧÕ'+qÄÈp¬Ñ1K´·xŸè(!åÚÉ)“&<Ë݉0奱£GIi 8­>ˆqäÈlKè•õž_ºæ nm£!ÂX-áaÀ9Ö^%êSPßâ¤Ëˆüæ+ˆlsÞÕ6ª1´š{b€ÄqgŽu@\^§eÛ‹ÍlA‘ÿú»˜ÃºµÖZÍ̓8²OLÌ÷pé-ÇËMB>T7òž&°YE‘_|&æ|ú¡¶1dÌ †‡q܉± {Ä‘¶l³œt•¨H&–"¥îp1žžª€S±.,¿DËÆóò]É»÷̉DÆœ93®·1Gì…8?.¿Ô”ÍI´Û)$r•$ˆu_j£µº?ã(#³©±?}¹–}jnËï&ƒš)æ,¨¿öJÛÆÀ˜\ˆ5†xEP¶Þ–ýmÂ8òC0‡u_s†ZÚ¨ÆD‰ëÜ•ËùN·o™}Tm6"†iÝW_Ž¡fŘÀj‰#¿Þ—/#îÐÁ¼€MhíO­EsP÷U—a¨ÙFæÛ!š®/ÃëM߃ˆäQfô ‰”cÝW^Š¡F™o5Ɔ‡·>¢é×™²õ,Í }1ÍA(Q÷—`7¢Ì7Œ1VG‰ß’ywè†ê×Ljԟƒ9ÿürŲË/ÆnÔ6ÆìÕ'(§›öįÑgptÓ‹HM~Pê–ìH914F¬ÎsD¾õ©÷›.=ùj)æhÝ—0;ÒF|3ŽV›ðDˆú¾0zyˆH .~ýaÝ3;ÒÆ†Òkµ xmV8ˆKofÙ#ì•yLn¸¤ã0G~tÕ×_dvØFä_Œ£Õê¡Íಷs‰H)GZÞU뾈Ù1mc¬ÕšŠqŒlÒ?›çQnH,ð³›nȺ‘ó̇Zò=è@c5K1Ã`ˆ·hÙæí‘Û¤ì¹&ˆ¡ì´Îª:f‡CÍ6Š1°šJu¼¾!qìhóp îÉi™º×FÑç=üt¦‘ùcðµ Ül•Ï—Þ6&úœ±;`Oùi©HëFÑÌÚøë#[«ÑmÆÑŽ/‘Ûåõ‘{+ØSiJBÎ×CÑÌŽ´qÈ c¤‡ø'!#ñα…W;Ej“hŽÖ]…Avl91bßÎÛçb‹ŒøWyjÙa‘kâäÐï®Õ(Ù‘6>X«5ŽÝRKîº=òè:ÙŠÀˆÔ¸­¢‘\Zl#WÑ*𕬯ó¿ò³%ü5¿?æÞHFä@6æhݘo-»QڨƨyÁd}ËKaɽÍ=‡ƒ›sˆ ðn[©{£nZ4v#ÚÈ¿îoÛ‚ðè"5Ý»9ðæ¬`Ÿ01G£X7>³¡ìhÕ˜ ?¨ VóýZöÕ²Pa#R㬻>t†Ùañ}AŸ{0Ž:„X=Ë? e‹7K?p2è7Z©EãŠ1mÔ vÊÕ÷õn_üàßø ˦7zÕQ¤™ Øù߬l«-´h~Ûˆ`Œ ,âØµZnMÖ²é tŽîŠD‚0Þâ7[)NKv‚¿¢1œS»Ÿä>ZôÊ–Hš·RN‘Ø€HÆ[ëF+MÑò7l£&A&`ÆQ7=nöGäÿ.MoôÍ,,S›ø©EãŠA‘o#V3<¼àÖYõÍW$>β7#skšÅLsX· MÑGq¨÷—k´zè •!ä2[ôÄ#0’ðFdEKEËnŒÐö¶è_I™,«%<æ2"ñÉGºïnõFÞ°H1‡£1l¥-Z íü¢ÍnbÀ9„|Î<õ¸üO xsÝUòä„È3d|  È è@º‰ê ÜnJ|æ‰GüÛ]â _ˆFä)&xúaie®hÛF,;¹/¹z>ûäcÝ'Þ0@V$n¼ã‚Ok+sEKûŠafæ7`1„B|îéÇ~à^ñæú«™rŠNAá÷îõ³pÑÚ ‰~Ýž]xsQ,Y8þ™'IxéÈsδ[Æ|žÈHÑ*[’«CbËóÏ>õ"Io‘XA’ IyEkd‡l$ááÈpõ´L÷ôãŒäc‘˜î³˜ €@M{œ4,"Úä^¬fxGŽ5ˆ/Œ†‘¤7X¼É«^w¡"DÔÞ{žx¼Õ<ÐN’l±šqäbõ´¼øüsO©7c%å"’w½M‹¨BÃŽSɹ6Zc4<ŒõâæIÆYoÆ å"’Ϻ`1P í±Zt¸ºÝaµÄ‘Cˆ_"_š8‘äÜÜŽ”‹Èy¶Ù F×À}A?ÒÐsëƒÆl¬á‘‘ÁX7¿üâDs)æ°n ƒ;û†ŠÎiLm 8†pQó+“^Go ¤|”Ø=âObŽÔVª;ú/¦hÛÆËūᑑYº¨iÊKIxƒûƈ¼td]P÷‰Z,H¹–î³W¸›ˆÕ4àXM¯N~‘|‚2"¯Â2ÿÓ…¦nm%P¡ü!Rþ/ö¶m —,lú¿W^za<ç†)¿U3©"¥n´R8ø£5H,Z²6FÂ##âëS^F$ŸÆN ‹¤9R7Z)î ,X‰·d'h£%"<_ qê«“'qncÊEäõ×sX·´òØc€4™¢µÖ [ßxÞ`nÂ"µnúý›Ó‘Êã‡)Íäôp`¢m´D|qK㛯‹7ùÐý!‘¶î3Ï@*‰<òp £ìhCV#ŽB|k*¼ÁÜX‘XA’ ‹ÕﳇÓÌô1!S4²#m4ÆD‰ÓPöË/Êp[‘jêFÎÏ9‹î9äP†QœfvÐFÍwÈj¼¹á·Ô›ˆH1u3Btçddˆ¾ÈòíÛ[³#mTc"Äwß‘ ˆ¼ó6šcêf+Å =„a 6Š1Æê€8}½‰ˆ¤9¨~³•p‡ÈÉ’xÿü§ÈŽi£“ ÏÂæ†÷ÞQoT$¦"iŽøÍVÂ~êɇˆ/2Ó,Ú¤10&ø‚¦O{#"Ò˜ƒºÙJ¦R‘¨adÑd§Gwæ›Æ«•øaD$WÐ0Gêf+á‘ÃÏ8F-ÙÑ6±چ§iÁGïo&Œ‘LÌ‘º!¸ɤDúb‹Fv¶ÜÌLŒXmâ8ÿãèÉsLÝh%ÜáD2:F-zëÚFcŒX-ÄO>|ÏŠ”N"A0‡ußp-Z w`8‘*aÔ¢ÙÆÍ%ß4Vkx@üTE¾:YDb‰9R7[ w`8‘*¾Ø¢9ÔÈ·C«%Žóg~"ÞX‘š Ö=zZ‰TZ$ÒèÀÆ{ÉÓ¨«|Þ¬OáM +H̹“9G+áΥ̨¾`¦µh¶ùc`5ãHâì`E"“’ ­›­„;¹>O­œžjž.rªx:ËYo½õfÍÌ¡óiø|‚³~K¬ ˆ^ÈOˆÕùÄÎ$z"³ýùÄ„²; 1 avÍDôAÆ Ëî<«™PyˆXÐÈr–9£h¢™èB ­Qäl_d±PäläŒlDO¤±Êy•wCì’DLA†‰©eÏÎC&VîE¬²D¤ƒØ%èÌJt#‰ùeÏöEf'&"g&ãÊ® Hoâ_d„˜Vö_¤“h‘s|‘Yˆ^È™™ˆ^È8b¬5ùÄD¤!Æ™EÎñEf$z ³“Z9+ ±K„èDF‰)"çø"‹ :­$Æ }ˆ‚¬÷AÎrÃ"ë}‘ˆžÈxbLÙõ¾Èb‰ÉÈÈRçCô@¶ŽW·±&Dt‹l%1™™è™D,hd±™èBv±&Bt K@ÌCCLY bY1UdqÄ4¤±ÆA #‰ù"£Ä‘%"Î/‚Øà+²TÄùE}‘abªÙmAôD–8?;Ñ…,=q~v¢²=‰yÈ8b,2щ,=q~f¢œº’3it#…TWWrbNdæªÛ€èB†xuEó)£ÈÑ!2B¬+ŽECL!Fab]*1‚ô$¦kl=1Y.Ä4d©ˆ ZKLY2â‚Ö“E¦#H'qAk‰‰HobcÛ“IôEv(ÑYbâ‚VcEf!ú‰l1Nd&¢—ÈVc©Ä0²ˆ>È'z Ë‘˜ÌJt‹,1™™èY b™èYbÙÞÄÚ8¢YÄtd‰‰u¥#æDEL-»dĆÖÓD–ŽØÐ:bŠÈJOlh1YdI‰ ÄÚDb¢ÈÒZELYbbC«ˆ "ÀÌĆ2#Æ#½‰MíBŒEv$ÑYvÄd¢§H±¶Ý‰…È,D?‘­& ;˜è…ìh¢²<‰QdF¢‡È’#ÈŽ'º‘e@tzã$ÖzË‹èB–1±±D‡H'ЛØXVÄtd™S‘eNl,ž˜&²´ÄÆâ‰)"KLl,=±ÑƒXKLYrbc‘åDLBV1 ˜HL@–1YfÄXäêOŒC–1¹škÓˆ…È2$ Û˜ tó‘ÞÄæŠ&æ!ý‰¾"KAŒ";”è‰\݈~Ȳ%6S€mIôB–1±©8¢ÈÒ›:”X›#z Ë›ØTÑ-ÒèMl*¢YöĦbˆ.‘¥&6•Ñl+b:°í‰éÈÕ–˜Š,b²bˆ` 1¹:“‘«51éE¬mbÒ X¹ÄäêNŒG¶ хé«©‹#Æ"ýˆ5m@Œ­º ˆqȲ#Æ Û‚è¢ñ´'±Y†Äd9ó‘m@tÁä´31YžÄ(²L‰¤‹¥gu †‘.–ž 6W±¹ˆÍ•@l®bs%›+Ø\ ÄæJ 6w(±ÅÅ2§ˆÍ.–ž¶!ú"],=CôDºXz*‡è‡t±ô|§‰^HKO%}.–žŠ"z ],=•Et#],=Ft"],=•Ft!],=Gt ],=•GLGºXz*˜Št±ô´=1 ébé©Hb ÒÅÒS™Äd¤‹¥§]ˆ‰HKO¥“.–žv"& ],=íEŒGºXz*˜‹t±ô´1ébÉ©iGb Ò“Ó®ÄB¤ &§}‰HLNÅó‘.˜œö&æ!]09bé‚Éibé‚Éébé‚ÉébK%[JOlÉB¬é bK%[JOl©bKé‰-•@l)=±¥ˆ-.Ïw’X³†è>.\í¢×qáj¿£Äš5Dãâ­!ú¯"ˆ5kˆ>Ç\Cô;¾À5Äô³†˜\CL?•OÌ×ÓOÅC@âÿ“]3ôx^íšwüÏå÷ÿÑÙ‘E2J$É%«E¤”Hi'-R’¢$¥d$™Ùdï½ÊÈ̦2K¡Düs®ëz^¯×ûÍõþ|ŸúTœ?ºå=îï3ç\Ï×ó\ÕªTªP®l™R%¯)võUWÌŸ7WÎK³fºäâ´©RžŸüÔ‰c¿>ôãþ=ßíÚ¾eÓúµ«¿^¾tÑü9³¦O™4aÜè/†ù|à€~}>ú g÷nï¾Óù­ŽÚ¿úJ›ª•+–¿ñ†ëK][¢X‘ÂWÈŸ'WŽìY2e¸8Mª ÏK~òı£‡qçö­ßn\·fåWË/œ7{æ´É_Ž;ê‹aC ìß·Oïz¾ÿžCÂśʖ)}Ý5Å‹^UèŠËóå¾,G¶,3¤KsÑç%;yü·£¿:¸ÄmÛàä7êäÜYÓ§Nš8nÌÈCöiÿO>îýA ËÁÅ’%Š]]˜AçFЙ/IŸ6uÊ R$ûãøoG~ùéÀ¾vïܶcë·¬“sfN›ò儱ˆ{èçŸ èd¯i\¼¶xQtÎì6)NýñûoG~þéÀÞvïØ¶sÛfÏÉS'O?†qk*?ŒÆEÖ¥PA´¦‘…ùý×#?ÿx`ï÷»wlEm|'¥8ˆ{ØàAôõ‘nº‘.².&èl™3¦Gµ0Rê½ßïÚ±nnÞhœ\0wö q>tð OûûHã¢Ô¥@>VZÓ¨…1¥&冓kéä’…TãF½™Jùv¹²ê"ë4jaXj‘ãVF®N®Xºx$qTúÈ.7¥.&hhiÔÂüò“ˆgû–øŸMÆI)ã7zd,²[Wë¢ÔÅ.5Ó¨…¡x“Г(ã†Î9Ð Ñ=ÎÅ+é¢ í@H# ÃRSŽ[ô¿,÷ª¯–/aqXo¤’ªDÁ‰†t.J]4hhjDY–šuÞ9¹r‹Ã¸5• é\ÔºhÐÐŽ¦Q £Äž“PÄ­©4HÉ%2rQë¢AC;L£Æ8‡'×®^)q£ÞLe  é¹È ³2hjGӈ°ÔÏfͧ4Î7«¾^Ι?7ÉŠ£Ç}t&Mí0(Œ”Äo²NbN²8ˆ{þI%ª#HŠh@¿¾×ƸhƒfSSß( \“va‰ÔI)E¹`^äÀý¯)㢠M-…Q*ò³q#Hг"!rØ–¼D±84µ#iÔ Ô[6)œÃœÅ±q3•‚d.G c}ŠMàbjÕŽ¦Ñ9fþŸt‡õ¶È©‰îAäˆÙ¹H¢¸HíPì–šõ8bœdݽ¸GC"rÄl]Œ ZÓxÀ@6µNjqÖºTFȱ£9ccƒælDÙ1?èAøÛË÷âÖêh.¡KÖgË".zu‘ MÙƒâÕ±£Ñ?%n“J‡„ÔQòÑ#³d1ÎÅ’FèÛãwuR ¥qûHˆh2ë3vL!”ÅÏ¢G4 sÓ糉[Sis‰œ ä„ñã®DY\¡3\ìíª+ª¶•ÒâHÜR‹œ5õ™üåÄ ³u1Aж0ø}ùÎI“J‡„ˆf!™tSb6.šºœŸ<"Z6®ù#7«!%™‘Ä åD.úAˆÿ5I¥E.Y´p>êƒÈ§M½<Ÿ*‡Y¤‹QÐ^ùË1™PÇ-åY²x!’9gÖÌÓóçUåM]D¸a]丗J‡\¶„‘ÓÍ™3Ê⹘ h©‚ç9¿Ì?ä!W,C29²™‡1£,Тq1îW-Q²k]ç×#äšU+¿Z¡‘ƒ™›1£,¢EJ'æ7ž™ H¯õßàŸŠ«W¢>âæ‚ù³(Çs1úŨA_S:¯ÕÁ·€¤Ô%rº¹h¡Ä,eÑ,Úº¸ -ÑxL¼Ç·ðÇÔKêr-’©n.Y,1‹¸ÅEJÇþÚA?ßè÷Ä}ó=¹~í7ÆÍeK4e±."4/hGTé3nóM‡Üò-“ÉÈW’y©µ,’ES Úï·T)/<ßûn„ܾU’©n‚É$BŠt1¥ç¢ ÚM.¿lò RG}¾Ý´n 3k­séhë„'í¶µk¬´ì_4HüMô8~†n 3‹ÆÌ²˜_~¶A»Q¨A¤P)Ä!™LÇÌ̘ÓIYœ‹H½ ZÒ¨‡ §»Æ­?bÐ¥$3bš$ò§é€Ÿ&Ófj9½yá¯â‡þ.Ýd6o“ID5æèï; Û4®ÖžºÐþY ÅKt"ÿn—q~ˆ•˜íÏZq|oÇ?© é5îX$’#ÉT7·m”UA8ò“~ŠüΕÅö©f;BJ2PV1Ëþ®Yd]4h{ž¬Ìhû*BâoÿBä¹c»Ú˜£*îµA3 ª&lÂ#¤‰|ïeîÚ™VªbbŽuÑNÀ òøõª”’[7…¹;T%ú™£‘v)omŽú¨·RºÿÈÓ±o€HÆl\1š õ¤úß"ù ÆMÃGõûL"c¶ÂFÇ>Óø5g”m/‹üà é¦0áè>d]õÔE´>…q0Û ¿Dä‰X&¡¢›(+øÎOn°³dæó°ãáTúÈä)LæPõPsò«ku1æDæ‡TÚ³žøÌÃLè!ûuùò‘„.2hy¸É©ç‡‡¼Àüª2»@í’töçItÐ1+xhÆ#›dŠ£ðÔz®ù¥ D£y‹÷ÌÀƒ]ªC ¥³qžç§8úëQ› S°Ÿ<ý ¿Z·ƒ¼Ä ­›d¨£ôÔæÖ(À<{z˜ q¸çQdVAfpHÇGO?þ»+–é¦Ñ 7±½,/Ÿ¹"¤ç&™ˆ]¡œp"µíÉÁô;à4hñäš+¤eŠ£„žÔŒÚªØ‰¼Ëìæ)iù2<]+2[„T75vB…j¥dª²ßœD;¬‹öQnéå™Ýc¦5~Š£€‚*FUÙgÊâ={hÐK àCE¤aŠ£ô”XØ$ÑN÷ÆEó€Ä —âcJ¾X¤ÇG•z¡‰ØO¢{HÐÇ#}0\‚R>RÝ4L…‚J¬?ÝöÛ:{.jÐxz½R’Kë¦a"ŸjêÔvª{'š9Ìå‘Cê _yEA ãÝ&¡B%6­MaÌibäY˽¸ £È Sòi  ‚kRܮϭê¢}d/,H›LqÓ2 *°àÚÆ}ô’EW©‘i³yiväS   ®MaB q‘uág´"@ò’ÉÐ%v:J*±äÚˆ-Ðy­ÖE?N] ¤¹2 ½T<,¹YôH´Ï;º¨ŸR-, äU‚4n “ŽÒSR…›-Û“ÂD€ÎE½°El2Ešy%ŸpT©ÄÒöÛ‡‹D¶.ø¨[È«m2EGù•IO VlŸq0h‰ú‘G?A–ÒF.L‰P¥«fÔg?ƺ¸B\\8ÿ MäS ¤K#šêsŸ< Ê“t P‚ƇÜk€4‘KèW^a  kÈyóZq 0ÖÅó¯½öšê¦0ÅO…’*\5É ‰8 9ÎE¾/(YòZ㦄N& J®µÝäiÄ3]œwÝu%›ôÓ@I%62áiÄ¶Ê Œ'–RÜŒ˜¬‚aø?ËÓ:`ç–.UJÝ$Ó@•ª\kW!^ X#ŽúÄëK“YÒcJ*±ž]­þYMQëâœ2×_¯n& ¤[Ô õÿ,Oô€&æˆxC™2ê&˜5Tåã?-ODÄ>Ðwqö D‚AI%Ö7|…8ò$ƒ\m€³#–-«Lã(¡¤0LÿQ²¤âÈã€ÖEo¼‘ÌÈQR•ëŒ_(UJÜ“Jç!â(1g•+G¦8ªž’*&5|õz©‡ü:¨U¶@ç⬛n"Ó:*Tb#ã®Ç7 n­:(+Ð%Q]œYþ&2Jª` Úü¾ˆï­['õ0<‰X«l€3‰Ê—*62~ß)Wn­Ã)ÏMU³º8³b… ”Ô-¹¬þ?¿|ÓMåË Nܳ<ÏC3ˆ3*ÂJª`}ã×Ê—ÇTïĽˆgTªTÉ@…ª\5ù'a+VªTÙxœð\ÄȘù ¹råÊ• U°±&°Jø™*UHSœø§Šl1Ϙ^¥J•ʆªØÈ*YX•ªU«U#MqÏ]ÌÓ§U­Z¥Š¡Zp%ƒ20Ðn¾¹zõ¯”¦8áiÄ1OŸV­ZUZ•D¬ª¡W£Æ-†¦8ãƒ1@¸8íæjbU¿ji·ÜzkMCs8Ç“ P\œz³ZµX“¯U'Mq5o«¥0‹žu08µº±›=Ó¯šàjÕ®-,¥ñ< cž:¥†1K®nþ}‹¥ ®Nݺ‹[˜ÁIÀÊóSn1æ8b·šâêÔ­WïöE‹,, /8uÊä[±š5 MquëÝ~ûw.\ha‚SžqÐN™\3¡ÝÑ îŽ;ïº{c MqàY-p’GQ«UKhâ£%î®»ë×w(¥gy>pò$ŸcXôÎ)Nx ÜcI–¦8uÐNò@Lœs¸ú î¹§a£9žÍžípÊó€_z$ópÂkذѽgû6Ëà<ž~é¡MpÆ=ðwßý³|›ih†'àD%0ÐÄ;º×@Â^“&3}›aiÄY8Ñc¦Îi´®òxpFŒMŸîᬃœàÁMqâžå5}hÚtߦ©œuÀ ‘kq8 ×ñš5Ÿ:ušoSÕ NàøxpÊ£{¯ùÃüÝ©žMQ38å8ÞÐâp±¼fÍnñuòÏ&«MòyŽ7´xœð ï!á=ÚR~sÒdß&Yšå8n\Îòîã=öø—j“|3_›èxŽ‹p¾{Êk*<>ñ䄉j_Ƙ~mBÄ;ÖÇ%Â3>ñäSãÇËïY°³ G€cýhMú¯yÄ{ú™qãÆ‹MH`úuÃ;&{q<>ý̳­ðÃãÄÆ'4ý†ðÆŒ9 O 9øl«ÖøÙ1üÃ3ùycFŸŽçül«çZ??j4Ìa±1Â=:!ÏÄsðù^9 6ÚbcÐö òÝQ1<`|Àpð…—^þâ‹‘#…ªXÇõ`ÀÁãIÀ¾ôrÛ#F|!TÅ®oúõ‘N~ã|ñå6m_>|¸B…j°ñÆïÄ&Ðé`›WÚ½:tذaªb=´û÷ÖÁ‡T1±ñ+í^k?dèP… U±×ÐhqЉs%Aį¾Ö¾ÃàÁC"¨R 6ÖF4‰«ˆq0*I›¶í^}íõo|þù`µTƒuló¿¾cKì"~µýë:¾9hÐ 5®*5†KîzΕ8®ÆHáëot|³ÓÀÏ>#3‚ Õb=³C!FƒQÄ’Â7:¾ÕéíO‚Uj,ø4šyÞŠ†)|Àw øT ƒ<¨RVí¡Q'H¡;¿ÝåÝþý-3‚zÔˆ;âR¨5à{ýú)31h ×Î-“ÂgZÙ6‰jÒùßÿ¤o_ µL µTÇ£JM,°ë{ïwïóI Óƒ*ÕaOlg‹l€=?þ8†5Tr[œ¶È>°GÏ>ú(†é †š¨‡ðm ìýaï¦ï¨6‘Qce(Àw»vàG|˜UjüpÓµ~øQŸ^|ðao2ûf¿8¦B}žØ0L Ø·gÏ8fßfM¢‡}ûõèѳW/†ÇL=°‹~ÒoÀûÝ=æÇ§aúø§-ŠêÐv{¿{÷º)Q¦:ª.žN6pÐ{Ý”ÙË¥ó4Ìè¡!ÑNée€Ÿ}Þµë{ÝÞ Ý1ûY¦@m̧~ à§Ÿ}>¤Ë»]ß{/&tMgæSqgž?ì `‡aŸé‡ÃtIôÇça7ìKàà¡Ã‘Ø7ãCwÌèÁ&vÀvëÞ£×½?îCà ¿èÜùí„njÕc™.‰Þ@eGÀ…äžÙMú³6‰Z•7c¦Ze€GŒý&‘‰ººÆì£ã…ˆª8éè$n¾ 7»Ö;ý4fMbl™n8þŽÅÍwÞ1‘ŸÎMsîùç¨TÅÓ ’8fÜDöfLäqÚtn¶öb¶IŒ/3€¾logŽL)‹Q¢&ÑU¥ÿ€pòkŠ|3¦æ‰E..JÌ^ã«2~⤩ì§:vŒ¯y‚È_0°§K¢N™ÆÚÙÈ;Ÿ)r-‹Æl”˜H§L›!§E‚d&¢vºs¢Iœ:}Vyšd Ò+‹›¢ÄQÌΜý²‡ô”™°|]Ì:p¼$Θ=W§“"ßH iëÓÆ+‹ó§~ÌÓfÌš3_D!Âmß!±GH㢔ÅĬÂ<.Ú$Ι·À=²Eõ‰)¹C¶µ.ª¶%æ8á ‰s,rOíHºhËb´3“8kîü…KZ% -ÂE- µ­uŽΜy /õ>?œ‰ŠÛ,ÒE–Eµíubž·`ÑÒåÏ$Žì”é»(eé뻨™¿hɲ¯¼O²§ñÒèÒºHåhYì”Õ˜ghÌ+¾~Ò?ØÏ„D»ˆ‹TŽ)Kb1½ê‰ÒJ½g{ÏE9~Y4æ…ˆyåšÇÏ€T©›±ñºhQ²hºÅºèÕyÅ׫¿i™T$;Úºè+GûY´½tùW«¾Y÷h„L¤ZŽ2tÄE÷à!qRDÌkÖmø¶¹"ýÇÍD ŽTJ]<­r\Y–­X¹zíúM[šyHÿcE|uºI]"-ZåxeùeÙ¸yëCÍðŸUøPì`NJãbOm_9~Y¾Ý²ýÁÈD«Óõ½¨.ž‹f*º²lÚ¼mçM‰”Wºé 34ºvru‰²h”ã•eëŽ]M€lâUÙÙwñ3ç¢(‡Ý¢eÙ¶ó»û›¼Dõ6AéÈЉqq‹¸øãÏGî¸ëî^ubRé×»ƒ¦U:2ã\Üý]쥔ãNΉãÚƒ¶0ÒÔ6o¿×Ë|Þʺ¾‰ ß(âA©¥Ma˜Æ»mß|çýí«ó>ñÝLrÕbÃV¢ÈqÏAp–ÚFÆD”Æw»÷¶/\äõßS›˜°M"9x¤Ô¦0¢oiêV/¢»öüxª}Í$oëö™¾ñÃ6‰„À9Ë )µ- õÙÈ4²»õê£/×¾²/×ôlÒØ£w¿‰æE“{íyèˆÙߘ°­~¾ât„E< ºÂ`LàˆÑ4¾×óãÌË‚•2lmdÇdÂ6ú¡Àwñ°Ô®0Ð÷ý=ú$Ôˆ4~ÐçS÷Šdµ«Ûòf’°µmÊŠ)[j†ƒ‡c¦±û‡}?£ï£Ÿ¢ubÆ,.ìÒ7xD-µ)Œè›GŒ¤ñ£~ƒFÓlÞ{Êh剹›[Ú‰\©rñh©µ0Ô7ÒˆÙ¨i*âágâð߉Â$¯*¥&"Iö'6§….ydCˆ?ò´5[æFÖ”£ÏÀa(5{p÷þÃÇÏ«¬[¯¦"I ö¤iœª&rß¡ß0(Ø„ÅDà”£”=¸õ;æ|·'æÚë ›Oi˜v¡wäwŒÇS9ò±e pÈÑŠÇ”zö~üõä…nÉ-:ö†m6QhÄcû~æèÉÌ&, SŽV<(5Æíê;öüô[²”ºÁ7’”¤aã)MÛÆîß0“qPä/\¿D#võŒù2Q˜Te+T­QÛlû¸?|Ó…-ÓÂl‘Èý¿pôdA²e(ðOªxÐÕRêÍ»öÿrü¼Ôº±1‹ÝçMØ9žÒ0- Ÿµº.;BâEéq^…–¡À)G8K½nËwP˜´¥½åóÓ2€$l<®`H¢mD?Lä3 °e p‘#Ń9!¥Fþxôäé¢%§¬Ü5lôöPœ hÝEqAbŠTÒÖ%IT9R<˜,µôào§R¦·«¯†¦MØx\aÛ¨~d}k‰lB´ÌÝEŽæ»¥Þ{èXò‹2ÄìMe™°‡oôƒFD"9q^j´õÒ28åñô,| zð—ßS¤Îh·iö¦æ® Ó‚ú1 ³¢ rñp€£ÔèÁç§Éä¯b[øaAØhY2‘1ÌÒ°­‹IËPࣈg̤Y YjüÈé²ø è‡Ù‰ö‡ ›m#úá6êÀލ-ÃéøÊ"ž±“Yêmß³/ΪkÉ„a÷—i!ú‘Ü~!J[ƒH«{ö¡xæ «·³/ÊÝ­–ü°ß“°¥mæK#2‘iI”&¤ÀEŽœ<ã§Í•R³/¹”{›Ø½»†­Óúá—ûV!j[³e p‘#'æ„–úøyi2åtÛ*{ÅâŶ¯Û°Gñ´Y(¸kˆ2z¤ Ñ2µ9bò`N,XnJ63om7’ôÃî‰i7ÔGÃO™9(´e pʱwŠgáWkYê“\œ%`Þ‚7&lê‡ç—$’#œ£mÍ–¡À)ÇP<‹¤«EfËõŸH2ºY‚IÞå}×6si"qÊa˜aP° ëÖ¿¿ùÏQŽæÄJéj–:o]´ðµ±]½Ga‹~Ê€]‡0p1zØÖhÂ÷Sà#Å3uÎ’URjô`Žüf½¤ ÙFQØ1úa"q(\$DiÂ{špÞvÄ,£x0'6ÙR_Îý©·í4Û|¶ê‡‰Üþ3æJzŒž¢×¡ Ù2O½ÐrñàHøv—”:K®‚ÜXIêraýh"7mƒ|/Ê ƒ¢T¹ª5ïh(‡qlA<+PêGÙƒ¹¯pËÙÓ5²—K:wµa‹~H ©2dσAÁ&lô 9öÇ ijΔ:{ÞBºÇ(n¶ïv+ ;Ò$³/Õ%$–¾‰MØ´å3/µïÔ­÷[Ï6–=˜¯°¾Ò§$Íj[ÃŽÚÆ&ò—ã)R_riÞBů/s-i™—_ïüþGŸâØñì9tLJ]$M†¬9U’º7n°_–°}ý¬ÝtØÙÖµïBËPàãð±SD€ ÇŠ\‹¶f>c:±âÁY*cŽË‹\wÒ_­Éµ‰½úóžèG‰<òF8†›ð‘§1Á»}ˆY¦âÁœÐR—â–)“Ù2ùa·ã“Þ¢iÄÕ<93_†av#Úº!ZœWñpN°«¯(v½®GrÊn­\¶\ƒaÛH#2‘rÇën¬RóŽF8e^j/ñl‚xðý¬¹¯,Qæ7y¯ÏMAñhyÜÒ\Õéõ1ôÃFD"1(·«¯+ǶnÊ–c–áØÚ9¡¥.{ÄíGdãrKm½yÀ]oç®ÐQ)“%WÁ¢wÞûZFÎYö Äóë©‹2 Ô%oüÅ홊DÛãËÙ€¶~ЈLä¯:«@¬V MøøsFàœeÌ tõu7ÙI{Z¦ôƒù£‰Ä¬"±Xéò–ر N9ŠxR¤Î”³@ÑRåå=¼]4•1Õnö¨ÞàØE#J"å ËaVþf´5š-#‡1y ž´™ÑÕ×Wä†äüT鹨—‹›§ ô#mÉort^Yüú hk4¡´ ëI#'çK]I_›ûkJ ۴͇Ÿ %‘8\}¢¶ 9nÚIñ\œ-J]Yß|rÝk—³r!º®ÃFd"õ0.T¢ E6¡‡µÌ2Š'Cö|…¯½±ª¾å6{J¶w¥è£þƒd¢-ˆ!JRà8¬ç-Ã,£x.¹”¥®föi3úas h¯=õe"'Ïœ‡Ã•§È5=õîy@[æã8¬ç/_»“s"'ºº|uÙ5Q’Yåå¾ [oq@?lD s%Oåˆlk¶Œœr¤x0'Pê 5t]B:QÖ³•e=+›øv¼>†F”D*ñªk9z² Ñ2"pÈQŃ9Q¼L¥[¹:"ï¹ù.¾˜[JË5Ž×;ÉÅaL¤Œ¿üBD[³ Ñ28ä¸c/Å“5O¡7T®¹‰ïâu_À°£ý¬Ü‘;@‡ŽD"õ1 }‹Ñƒ¶föê;xÔ¤YãÎ}"ž¼,u­ [vïó796lÿžÒ`&R‰?'-3dôäÙã®ýGDаu¯a÷Ȳ™–K¼o2V²‹•®P£‡mýZ|1¦ã#'/Êñ`NÔk8oÉ×k¿Ý±çÇÃ8£hè‹^½>æ„9à+Ô¨‹Ñƒ¶îÒ“-3{ äxЊ§â-·7š³h…JòØÉó.’õ‚ÜÛ‘©Eñë+Ö¨wσ-Ÿmƒ&ì7xôä9K×@Ž¿©x0'îhÆÑƒ¶ž -sð×ä©)Ç«Ön€oõê3Pï-|´WE­E?2ÑzZb \1(Ø„l < äXîæ:Ïó²Â—ÛH.lÙ sw0Ì=¨Sî1¤aS3¶õ—³Ø2"pÊây艺É~œW}VmØê–Ëh›;¸ÿ}æ&2"bà¶ÆèA[OšÍ–À/Ζ³ìvˆç%Ùò‚“†ý“ŠÜí¨ë›FìüÞ©è´{à ƒm=gé7[~€ÀÓgW96~øé—¹ ··‡6mY\Ú‹"O>ÇD ‘JO`ô`PŒžÛÃ쳑_Î^Šsëg<¢ä,XrÄ,kýÚÛ²—4kòÙQØf \–ú‘K7m“ã ñJ>ÏÕàÑVmßìöñg#'ÍÁI¸çœxÙªµïiúÄ í»D—äÈj Û¬çÑ6z[‰L®‡|ÕÚh d«ÛǃF±­Ñ„h ¼äøä‹Þ•­¶îÉ'Ê% [ö¡\Å襄fH¤9§@¶Þz¿Ï磧Ì]¾Mx*•rÄ,{ã½èv€½Z²Swߺ©6»oü]ÈO±øÀÂÉß®SwŒž)hk4a²Ô8¦cã‡!‚nüófQΰõB.ò¸lä.æÎF˜h­…È3¸Ý? K[nw¨Ÿ;äæ„ËØÄÎ=ú‹¶F¢e ðÒo¥ÛuêmÊùaŸ’i¡úÑû"1§ÓkޏûG´ ŽyK9¾úvÏ{›¶|úÅvöh¹YʰêE‡+D?rKæi Ë€!ñížý†rPlÚýNLð2•kÕð±ç_{烆±÷,L؇y6ÈfYwÕø!!–4#«ý;½úà`[ã”ÉQ Ø Uj7húø ¯wùÐ\9èÔ5æ"‘†ÍUžÙù7\‰7ùÄ™ÒÖ'Ø2x{(Ç®é*Ñ\´ˆ®OEKV³~ #Ë Á_ï‚a†Ñ³'ál™kn¼¹n£fO½üÆ{׳wÞÿ0.l»¬6 õDŒž%kØ„l ӱ͛ï÷Ñ»¶ÇM¶÷§x1!‹êçf¹FÀ±Zø:!>õRŒÇ9(Є©2å.Tò¦w4Æt|«{_³“¥$]Ø›¶ïq[V½<‰fµ<7€ˆa6{)Úúȩԙó¾®<æ­È±u͹L”NtaÇmÔᆵY ñ®=hë£ÉÒdÉ{U)\äØk÷A\ÊÊšWn'Ù°ãn&8"ŸDÞèŠñ8 ƒbÇ~6a¾«KCà`:¾óÁ§UÌr»­t¢†Í;‡ ;»áÔ¸ã‰Äޏf+Öï<ð[ŠtÙò½¾òmõ„ßíý™îPc'ÊÜî1l·¤op¿KÉÓ&Ì{=vüí¼‹³ãL ÀŸ évÛ\¶èðµÚæŠGtÙDx˜0Ï´Á4zÊü¯6îúñØùé/-Pü†ªuâ°†?—{”$:‘s—aËUËCn»,x¯Lw„vÃÀ:Ÿƒâw4!Z¦ZÝFÍ)ÇO†È¬ñCÑm‹ñÓäªÎ÷æn‚ÑÏ 00!äÁc¦-X¹ m&dË@à"Ç¡¥äÇ!ÉäšÀ@ö–Ýû‘¶q÷'”ˆ,xF|å­÷?õ>aFϾ£ÉÓ¢ Ñ2÷<ôÔË»}2do…TÐû­¸>¶aóí®}²×µz•š†xÛÝxz 5>qö²µÛ÷ÿš"š-CCŽrŒ[Ã÷•Þ^ºj#o®ð E. ÃëˈJ¾œ½lÝŽhk4!ZFÞ£ßð‰ºI­a¯3¼c–‹Te3 ýpìy†‚8gùzhB´ ޹瀓 Žâ¥)IvâËív{§h—´Í%úÕ¢¡•@w_`ûoÃÈUª…+Ön–¶IcVõB,cˆïö6D ´5šðîDàŸnwÒ·Ö3×84ìéóp$²mäZÛÀñhÌá?jÊü¯7}wè¶5š°þƒxŸÁãf¦â:LVvw߇Ô¶ƒ {Îb½Ï¨úAª="‡ÿg£¦.À0ûù‹ØÖ•nkÐôÉ— ð¡ãgÉ·¨]ø>cÞ¤—€D»z%Váã»'£AäèIŶ®\‹-›8û<Ù É>Œ[Àç£Û+ö–[*½EÞ0݆Ï~ Ž™¶pÕæ8(ÐÖUj£e ðþ#¾œ«›Jݦ6¶—$Ê…¯Uzá+¥Ï'ò€q5†¾\µN£‡Ÿ¡À¿˜4O.K¸ZÖW²‹—Ë&¼/Àæš—õñDŒðÕ[÷I–6ÚºZ½{[<ÛîmÌÛ) ÌÐ,?uA«·$æsZðÖešŒlÄä˜ÑŒé3xìôÅGùåâeo¾½1Î|ôÔ…æRN1³è6«s„Í+lꇘ<©‚cY‰ãf,ÆxÄè¹´@‰«ßqߣ­1Á‘ÝEæ*RÌé˜+Þ-þÉ‚E“KxU spÆ’o0Ì8(®)‡s«å󯿋\ÌXò“ÛÐz{i [¯¥‰~0È‹xD9èq(`<þ†A¶¾å®&½Ð?sé#L=o ”«sc@o5ì”ZÌtD”GHyéÚŽŸ!'ÚšMøâø„ÙË÷2ËJ]¨>ðèÓ/š°õ ¢Ü"£ÀÑÎêY¸]pÉehk6áK߇Àç¬øî Χøuü»&l¹c‚°D>Þàadˆëwþøû…—äB[£ Ù2ý†Ošûµ^£$Ù‰~Ørõ"ºFfˆ|`ÂãM?´Ûòõ»~<ž2cn´5š-3à‹ÉóWjXÞ®û?l½ÿ$’ˆæ<™³|îŸN¤Ì”çªÒ•Ñ„h™^ø*¹<ÄeÎî^CüÅèƒÜ'òéË9+6`<^”9o‘ë«  Ù2GM[´FîÑ 6"I]$Ç„mîºe¾L‰xLD qîŠ=W—©Z÷Þ­Ð2Ÿž¾øîðÍÕ3vbö§ÃÌ%-sÃÏï}u=9d¾ÚôÝÏ'1zŠ¢­Ñ„¯uéM¯[Í»º ” ¨^çpa[ýdÈžÌ#Ê):ï«Mßÿr2uÖüÅÐÖlÂw?<°’.IÊÕö ½³y·^È1¿ d¬s/Ž­¯¿ýá—Si²]^mÍ&ìÚgÈøÙË7,[c~…’ÔdïJèí ÕOÚÌB,«c«3Ïåù N–6{hk6!ZßÄK%{6’”ݵÚr©Êê'Yšˆˆ“~$”·yÏ ³%ÐÖhB´ Êõõ·ì {³«°¹ˆÐRÂæå4m)]DleFë*!^Zð´5š-3bÒü•[üKNWçV5 ›Cr©èß¶ÄÆÐ ”Gâ–½GS\ŒÑS¾fý¦O¶‘–Y°j«”sÏ!·å¯&[þÖæª´Í¹ùu*–8jêÂÕ[÷ýz^zŒž 5<ôTÛN=?9uášméÎdi=û!©vŽx&à9â™í/%ÆÏÏlIž#žÙ’ <;ˆñÀsÄ3[Rg1!ð, &üˆ{B$kIþĤ"ÿb¢@“ˆüOˆIC&ø'“„L*ðÏ"&™T !&ù§O ´Ä0ò?&‘IFÄòO&žèÈÿ ñÌȤcˆgD&K<òÿH<2©Àxâé‘I& ž™T`BâéÿÄÓ “ LŒ˜82©ÀD‰‰2“ < 1dR§#&d&xzb<3©À3c™Iž™è3C gb œ…xbÿ}"-r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@ÎB g!³ÈYä,r9 œ…@Öö†@ÎB$kÿuâÞ¿?qïߟ¸÷ïOÜû÷'î=‰{ÿþĽâÞ³‘¸÷ïOŒ€gÑþ]‰>ð¬!ÆÏb,ð,!ÆÏb<ð¬ &ž#žÙ’ < ˆ‰ÏÏlIþ Ä4!’µ¿„˜(poš¤"ÿ§Ä$"ÿ bâ@“†ü“„ü ˆ§*1)Èÿ91 Èÿ=1ŒL*ðO$‘b™TàŸJ ÿÄ3#ÿlâé2ñŒÈ¿ ñLÈ¿ ñ Ȥÿ‰ÄÓ#ÿFÄÓ"“ ü+ˆ§Cþˉ§Aþ©Ä3ÿbâÈ¿1Q俟˜2©À01äߘù'À¿˜yvã‘g 1™Tà?‹Ï½êýùþþ*×ë®{öÙk­}žû¬Gú‡Âòú¶ŸÃSl=¿ì[÷(3ï¼¥Jë·š>yÞ'øIBÆÇŠ–¤ŒÜÏ•}£Œ3g‹,–QT×Ù²ÛìðÑÓç½o?ŒJxýîciM ~à‡ÑsqŒ…oþRe­m&Ö§<®ßxùöSU[BÚ»O_ëZ{†&Yy„ŤW¨®ßlhBʾpÿi\JfÞ—ªo]¿Æ™þE¼Ë)(oêc™½`™²¶©£ç{O³ŠªÛã’á=ÕMßûÏà˜')§¬¡k°Ëöºv;$üù«Œœ¢Š†öÞ†©YÑ Þ ˆ?ÇYg‹É¬Öپ׭Ȥìϵ1‰éŠÊá=°ù|s-S\C•í|ÞÛ7øQÔKª„î¡?“ÿ‹ø±¢ùço6~1YX¸íé ¾¡QÉïŠëºžÅ§f”Ö¶tþaá“Z¡²^*ûÒ€°g/R²òKª›¿ü¦#šÛ:{ݸûôå[hBïo6…²ªð¢Ý™‹~÷£S>”4|òzS\ù­ó×ÿ< 9%Pö,Û?„üö3ògŒBÜHoÞCÄÊ–Þ vq9µ;÷Û»\ºý &5§´±ú™öþSY¡$ï\ñe k´·ì"ݾâ{÷QôË7ï ËþY#"f~ªl훘)/êî²p8{Ùÿáó´Ü¯ßz€Æ)™TaÌ\‚ ¤äU4§Ë|@m ðgp’¼™Žø,1óSUë¯?3…ɯٴëÀQWï;âÞä•7÷Þ}LzSÑÐÑ7Æ8k¶¨„¬ÒÚ´nûø‡FÄ¢lªšºúÿ¢½ê@,¬jû59Kxñ u½Ý¹] xü"½ ¢¥/0 —ñ±´) J_ª 6]¶ßßÏëDqjO_¸òìUVau[ÿ$‡°Äе›,»_f|¬lýuwÿm.YÆø T¢üjZÙî—n=ˆŒÙ þ‹ù*ÈÜ?Å1Gr¥†þžC ë ' ™ö[A¤7°ûHcT¢ìªµT·ÏzùÜ™Þæˆ(GG EÄšö)ι’ ëô­Nž¿üôeVaMÇ õ& îþVna0 zÙWýÐ-2r?Qí"È£¦c€sîÅu[ö>åqº…’òö%{EÞê傲w²/ßü[Áû¿ˆQIï>×v 2r‰H)jn5±vô¼ "É|„Þ½BJ²ó‰,’²·‘²/€I>}†¢"d¦!ú"bqmç #7Øãúm¦6N^ð)Éï¿4üõ¸Jõì)É eëCÙÇNã/Ãiûñ¢ï}"áÎ!&0\%-0Š ¾D„Ýãn—°²—oÀY‘’¨DI({”mïä~ùV0ʽä÷4â@Œ†õÔu 3ñÌ[ª¬½ÝìÈé‹~a1© ™Ÿ¿ÇwB±74JòÎŲ7`Ù']i{’ {ˆ éˆh ï¿Ôw Ïàö¸ÃÜö ÈúyZ^Ysï„Ó9Ò›W`à¬ý¿™¹„°l-Rö˜ !Ob“3ó¿T£ÍL#†A…_ê¿0óÍ_¶Zg‡¹ È:îM~yKß$Ù~Ò›OHÉQÆY¤ìuTÙä㢠À ÿAŒ!ƈ dT6î·? ²F¶öO%ÛOÖ”ì&e‹Ë¬R§— nIÜieÿ"¦âQ–ÙbðÚN°u|L™FÛSÓ½)ª@J‚H­P.ÛŸ¶ËtÄývg.!"X!­çj ˆ°°ºc‰¼ë².›P•(*!§üoÙd—ÇYÿ"Bˆ¹ŽÁkrjºh=ׂ"^fÕtÏ8h7ý®¼b/( h™"Uö)×éÆXq=舯)Dñåk6íëñ †Iø¹¶k„e¿ é Ù,¤äË>Žä¢ ø_D´ëq6@T×3ë¹~÷Ù«wÅõ?FYM98ÓzCQrxêoÙð;0É{áÏ¡oc¸g*ÿ‹(¸H^}ó°ž÷"“ß—4t³í± zóˆâHQ"½ìÿünt‡TlZÞצŸ¿Ùá[ò¸•ò¡ô[Ïï™;÷M÷†P’(Q€V¶¹5”MÑõý( {€èÿËq¦Ðb0ܽ‡=o…F§æÀ‡LÌ2Ø{ÐÎ{Nì(I ˆ*{zK€?Óˆö¨‚Ø;1SXb%Ø£µ“—ïý˜×¹eÍ}“œ[v›[co€È„’¨D0 …¤lã¶ŽèÈ„¿ú óaìMÌ–PX·ÕÄÆé‚oØsx©å×mÿa!Hd $*|—”ý÷ÓÞü"h¸¹ïϬ9’ŠšÛL8_ô{û¦ ¢­Ÿ[g+ª öl ˆ .ù”È'²Ë64=*EÙ¼Haæ?øˆr…?s–(®ß¶Ïö4lm\úǪöA&^M½û¬ 7@;ÜÿBP"Œ(ÛÀøÌj“‰s­Ö™FÄÑ<É1wÉ*-3Û3—Á(2>Uw Íࣽ zCh”%‚Á”UÕ‚M¶9n²¡!îøñ×$ç\)%­ífv.Þ`o A„̳UÖ’œ½p#Þ–žþ'6^˜²¤l«£·â‡fðL#Âë×§ˆ”®ýÙ+á ™EµßGXV­ÕÝnbIzƒ»”$J䢕ºÙ<‰…™2¸+A/¬/ä•V†qp½ôäeÖçºcl‚+Tµ·íÇÞ’¼—lía˜.{¿ÍIWÒ¶ÿEüX å]ª¬chqÔíjpDbö!»¬Ô†½ñò ’|(B%þaå‹eëýýLR˜RÑûš>‚»2ÀK«7ì<füôÕû’Fáé•kÉØ¬-\”H/{#HÊÞéü`ëÿ f "¼´L ÷˜»ÏÝgÉ ëŸs%äV¯ß¼Ë zàat"P²¦¥g˜a&ÿ<(›¶#(x;”¨=ˆ‡&F èÆ]Ÿ»~/2d "•¬Ý¸}¯% ØZŠ”üÖ50Áʃe#[sAÙ@‰Ð:"Ì”êöADTÕÝmyâü¨T5ˆpÞìèÖ|êfæç“V Ûå.v”ü\DÊþƒ7Ù"µˆˆWiÄ€pºˆ.Wß †{Áïa\ƧšNáb6>Q‰å*(Ž#§Ü`»’ D0 ({”Ô·¸Ù÷Ä:¢üZý½ÖÎo?zñ¶°¶k”MPbײU0¬ŽÁL»HÌÈ+©mý9ÊÄ)ˆeë‚%ƒ[ø€¢uÑÁ`Eüâòk·˜Ø€=>ŽÏ,ªû>Æ.,9ÅŽÅ©ñ°Cq„>O{Jߥ~£MûM/Ú+šá4b"®ÐØbzäôå;á YŸë»A„RãÌÜsQ=%Å%³P‰¿þ–mnFCåÿ ² ,Z¡±ÕÔöŒwÀ“—ÙÅ =³æJ3ÌX ­°fƒöÆ=áe:(Êfä •M6æ& •õÿ ~Ä•ë`(¸xF$¾ûÒøó§è²þ V^·>öÆÝ)I”ø}V¶Î6ムÎÂÿA¬DÁÅ+5·™Ù½ÖSú­w’kžÌϦ—ráP2 ”H+{ñôgõüìõ;tv±‚¦™ýÙ«ÁÏ’>€QLqÏ—íø’D½‘€]%A‰-=#TÙðY ›žñ™B ë·QˆtÆW@—®×ÀÌrÊZ~1òˆ-u@Üë¨Þ\ºu÷I\jvaùʶ´?ö,¡ Ivޝ(®ß¾ßÁÍçndJnyëßBù&T?ˆ{º7à’¨Äºö>àÁß²ü‹ˆC¥%WiíØÔÝç^Tj^EÛàŒÙâ+êÚÿ»_ç(J~øL/éo¸ïðq¬û°â "ŽŸWiï°8vîzHôë|0 fþE Uà\@ zoÀf’ D0 ?X6mõ¤+×m¥#×wÏ^¢¤mxàØ¹¡1i`,Š_ë; h½š\»F)ñoÙ[Œ,l‘}ÿ?DŽŸ¿yÿù›Õ#l° ØT°ÐÂe¤7 ŽË%Á€º±l¢zh¥u¨Ë±hNYgçÁ·ÂbÓ?Õt² /QþŸêÀ¼’ Ä2Ú/°iÛM¡Š‰æŽÄlDœ5WJyÃ.Ëž¾aq…µßÇ`¶®Îý‚ö:ŽA/J¢KàTÙ`v{tÓ}ŽØˆÒ«ñ¤§ßƒo‹êð#–ª¼Á!PÜÐh*PòP šF• ûaþ<[\ž†>í «7î>tÊËïá‹ÌÏõ="ËÔ2òy 8‰åÐ0EIP"ø.Š”½q»iÇñ×-&´5~i@i•0¸.Ü~ F1OfÍÿ¬œ ìâv(( Ë®.W´ÂT"ˆ§)ÄFD\ª¢kdåxÁÿqBÖ—ÆÞIîùrê¯Þ±ñà 7&‡À.n‡Ç¦¼+¬l¢}”ҺͻÚqùZ}pl"IDqÏa§‹w¿Ì.ùÖ7ų`¹Æ "˜\¤7F`×î<ˆÂ²ÙgƒDÕ7îh`â[®N!†DtCÕM€xéNxâ»Ò¦_ ¼bòëb’OÀøçco ÷YŸ€ Ÿ–S\ÓÚ;FÊVÕÞÖJCÜû?ˆzÆÖΰèWï¿6÷3ò-\¡ù4þM}Ã`(jƒÏ8 %Q‰…M? l¡…2Jš›[úyÀtþâ<5=cx!0"éCYËÓìE Zž'gB1ÌBWÀÞAJ†E&fä㓲añ-¿qÍ?ˆÄ±Õôö9ãô49§¼upÿbEíûÏ^¦ç•€ýfåÅÞl7±:v) ;\\M•-!¯ªÓü‹ aò"5Öl:] z–œ[Ñ6Ä"(±J'øqlê;$Ð#§°¸¬2¸Â;g¤$(?Ì€e+¯§,_ ·í"– "~„‰­Ë•àg)yíìB’Êÿoy†fÖ'’°x`}yzÖÔ;EФ!¾CDøu}SÛ³WïF¦æWvŒ° K­Ö½ CŒ⦺º×ò(PònxÜk VëO([DB^*RmÓ?ˆSHh}S»³×îE½.¨êeŸ#­² ¨ý šã…ÞlÞµß(JÌúXN• Û1M¿iD؆rk·ì³sõ¹ö±ºklæÜ¥ªzЊzm}ã,¼¢’+PÇO¸^ö }𢧕­ØÐó‡ã/¡)D‚hïæóæcÍ÷ñY"ËÖè{üÓFN!Ò›=`^7@‰©Ôv@Ù’+h2&¢#é:-_»ÕÌÁízèó7Ÿjüæ˜'«¾‹É-©ëø5ÁFzŽmsêÜUTbæß²ë)÷Ó5Dj 05ÑýÆýØôºî?œóåÖnuö¼ôèy ¨gt×èX9PÒ7ô„Ÿeó/XZ÷ƒ,XÍ·™EÄŒ¢úžI.0 ƒnQòÑ&gBoÀhv[Øá'=*ª¢•]ûc=ãn+ÇiD4@Ä& Ñ`ÿ±ó·¼È,nìeà]¸rýê­‰H ïCdÇVkm5J^Dü-»¦ °0¨vBƒEÄ_Œ¼ WPˆã³¾|ëcäWÐÚ Nlç|©qƒñ’Þì?â, LÊæ­îeƒñ¼a 5·[÷ðDø¬GQ¦€#¶Øü©¢©{„‰Ö«ã®°Á‘‰oqíXvÎwâm@,F<áé÷(!»¤¹¿Äª »÷Zû[_gÿäL~覾Ñ $µvªl-« ä*]–ùÄaß"þÜ2À, ©´qÏNs[G”Üóäw…ô¶®Xv”„—c’³IÙ,¼•íÃ,ˆ¸Óò¤×ñçÄ÷_[Y—(ëoÛku YN¨kÞBI¿Px™VvEûž“´ÿÑð üžø¡¬mˆUHJeÓ^½]¶÷€@ î߬|ó¤5àe¤$ðê5´ ÊžYÞ6È,Mpߢ‚–áAèÔ“W9åíÃlÂÒª›M° „åÐ"9Òµ ÛM‘’вäìÂÊ–Ÿã,eÄôá„—ÆŠ!ìë'I9#ìs—ªéïCP¾@_ ;é ØP”»AÊþÚ20é…HÕNKÇ‹w"’s+;Gg‚õl1ÃÕ&,G¡¸±7+Õuwš#%ƒƒïâM–6÷3ͦ÷vöõ㥀§ÉyUc³DeÕ·š¦–`  ñ ‰ËÁ˜%»D•]2ÝÛãÿAÜuÈéRàÓ”üê®qŽyròj bb^c@ nª7°ìÏ\¸uïi ñÇðtºF"¬y1A¼ø,5¿úûoÎùË×m?°LiýÿÙ2®9øAf6ÀÔÀG±TÙÅQ~¥: ƳÎ.+çËA‘©5?&¸Èkî8(¹Bè|Äñ<¨T\Óþ‹ôFyýVãCÀÔÛ÷£’²°lð–)ÊkPÇ4ÄU:»­œ½ƒ"_¬íþÃ-¶b½¡%Žb|ïY,‘‰™+šHo–¬\» (‰JŒHHDzÁÿ&¹ÑQi^3xø´wpTÚ§ºžIž…+µvZa_7€åáDŤ7ª:HIP",ýCqmxô®ràÙÿAÜ`tøô•»Ño ëNñŠ+hï>,¸4RD«!}³òÍ—^¥©û J¼ù hÕsd‚ æx68, ¼ÆÈú Alèeà[¤?òˆ.QX«·k¿ÞñˆOÏûÚ@ë Ø.ýÆÝ'øj#̺ Îy²0û` ü]c[ÞyRŠÓä«)ÿÖ=:—ޝ:­B#_e~ª, Ï•Y³eŸƒûÍ0 Qm\®…â·_L’«7íµÃ›ñØ…}Ö§h]øR×1@nÑ«n@J’`›¼¯ùUp Á3Ã>{÷a/2ÿƒû¶~\¢¢gj?ÎB)ÄX~‰¶œfÒ›¥À}ãCÇÝÀ€bRÞç¡Ì]¦¦oŠˆq4DåÆGÎú„ÂÍÌBRªúûŽÒsû`9>H ÜÒ†®!F®¹+Ô’öäNpbæ§\´«9KU7›Ú»Ý¸OC”ÏDø±¤yEXZm‹Ù1j9«À½,Q!H ¢ê¶¾ v…²*:¦Ö§Îãç¼É#–:-ÕÎíú]¯ß‘UÒ2Ä:géš­æÇap /–Ç›¾TŠ^`~Ž·?–Ml_XJEÏÄÎõ_Ľ¶®×Ã^d—¶±Í•Qß¶ÿD xÍì˜ÙKöì!îYmÇÀ$ÙŒ†ûm©²a4 ±IA7"ZñŽèv#,>ûkÛ0»ˆìZƒ§pÏ8çÀžéîÜw}I ¡{ƒi äaPbàão`|2 .Y½‰´‚ŽˆàvóA»²¶‘™"rÛ:Va(½†¼Ùý*èuNI=éäʵzFŽžÅíMÉ*iÆLµâDØV@|_Ö>:Ktùº–N¥ ß©7«Ãø³?CøœUXÕJz#‡”Á½PQgÏW"‘_ÓAz ãS Ðb,xüõGâû ڻдcÒ)D°‡ó~“òª~üá_µÑØÖž â% *c«ãH ¸´\xq”™ìBk›)‰,¥Ù„“ÄL;½ˆBÜŒˆáIyÕ?&y)éîµ;•DÂ$³†°ü"&²©ÞÌ‘@J<æzåÌx˜Ÿ0í€ Þ""îsð¸ý$9¿¦{’o±ò&‡óÈ*”5:”âÆÌ-adn ç˜ñ ä×ròŽ~3x jz¦ø$`WzÜǬE &L¦¹q©ëbâ•Z¥¹u/|Ìõ$h'Pf¼¥Óåà¨7E }tDÿˆ”‚ÚŸ ³%U6›óBOç¼@ŠÀrGZΫ²µßÙñ œ•æÁ9ä ãå (~tDO@üX÷“‘‰ª¾ùñ ~¶ ›†~±£:H Ø×¹xWž™oÁ²Õ˜—p¾BC颜º™ö/âÓÔu½LRª[öŸ¸Hß´ž1ZÐËìˆèUÖ³1çhö"«†u1pQßì˜ç§©Ÿêû˜¥Ô¶Zœ¼TŽÎ ïÖØLöEõFoôcáEö×Öaö¹2k·YœDÄOÿ"¾.lø5CHzͶŽ—¡³O0À‡i4~1*éEOÞcoxæaðÄÔÆ)ŸmÎ2õm'.<{ý©¾—B<î?6þbZªnpÐé q|w'FkHXJôÁ@ÑGì ¡ÖÂÂOľýÒ<È* £dÿÿEL+jìg^¶v»¥óÕ“d‘ͽ¿iá1 { •oø1}¯Þ>&£¸i€EÆùq/عõ½ŒtÄÈ´¢o,sd4v:}ÍóÑÓô“^,·ÆDÆú 7 \"RäµèttAiUZ/ »4Ä ‘o>7 °Î•]ghuÆçŸàbï»à¢å4ú‘ôXæYáh# …,¦H!šŸ¸ˆƒl"rš;»\ßO[$ú×ðß>xa s}ô›Ìædç€Å”î@%„Ó4Äôâæ!vÑåëwYŸ½ } ‹Äø—ôAÏÈ D‹MrÌJnÙ‹u¢ÒV£Ý~‚º£#Ñåµvq»…îwé6I×`^‡,h»™-•)ú'{² ܠ݀ø‹þô“·˜Ÿ¸ñ¥exæ½hÕFpUßð¤üš:bpÌÛ’ÖŽ+7ÛŸ÷_·E J€IÐFbs ´HZ­7{PÝø01§²k‚[\ÿÌ‚¨ºÅüä%DlåSظ×ÁãÎt†¶k,˜]ÒÝ "aAÒιKV­‡sCEço®… öغÝzô gO#–¶qŠ)êšõ  ¥îè»60EMeÒh ²16qyõûñïàÜÀ)¶RÇèˆëÍG°ÝStÄç™_ÛǸ®ÚdzìBà6¥ßzðíÈòƒÇݯ=O©é$ €Ð¸¬¯PÚüÚ»m\oÊÊæ¶Í$$M†Iè‹w]4Dï‚8[JÍÀò´ÏÃéFÐãôØÎzƒ}¶gH¨ ó" <0F)xW å¥5ãÅ»ÊSüRk¶[ž¹ñˆžð"l¹÷ ” +)._£g/¸“?”bÞ(HI†ò)o²uÓˆïQZ}û!—›;éé;zˆäv¨0ÆÙ¿·ü) ©U±w aþ"Vu3,]»Ãêì­ðoHE+¨`Ûõ{‘I˜.cX$¿Vc ·îǼ΃vMRí%[gNdBHý¢àÒµ†‡]}#ÀˆîHP‚Ü¡Çl,Žbf0zócŒl, ”a–Rî #†Æ¨êa\¦±ÓÚÍï)8E`E¤Ý¸mï1°ÊNØ8_N¥Tµ³Ê:~£zÁ‚bþ‹XÝÃ$$³n—ûíg$øÃE¥b€“ÿælTui9’ÜÌ,‡¡yVô[ø{±2ñ'“°¬æî#çü#ß—m§Ì}ÉT O³iû0÷õ8þmQmÌÐŒ’ÖQš¯Ò!â•ÐøœšŸ3ÑÈöü(Z‚êß -7ö7hƒ½iñ ˆL/n™µ½ß3àÛÆq3"& â9­=vÑYù1 íö@s 2‚sHƒ_Ø›†óþOÓ>7 Íœ¿RÇØÞãN$"rýEìež³\k½g`L,ªF‰FÑþC@’b1>ìt#y«Üýž¤~„9¯½Çî¼dú—ÖQ.qbnm/óÜåÚÆ^A±¨Ûºï#”JöX¢1v("É/LUao\o…§|j`Y®ed{îö³7Å-£œâý—¹µ},"ò:{^ŽÃì0˜Œ±w¹ø„:ÁˆÞf½DzsöÆ£¤‚ú_,såÖï>â~ûil*§¸Ò_DÑLŽ^¼û"(âe¼‹$q¢“ž7ïG§æ–a’Q£_–'ΓÔ™ëójû˜¡¥»lÜü"Ò>7p.¤#ÖýbDÓc—îÅSÙʦ^zÖv2¤%¾‘DǶ}v¸ìÄlçkðÆšŸLBËÖ4|Ÿ¼.jæX¨¤gŽˆy€8oåFÓã—CH„ê-óäII¹µYÂÔƒØtp0JlD¾·ž¤5ý‹ØÏ6OAwß ïû/a–D#]zÿ¥ -ŠÀ,×ÂH†DN«¦L -&¥°ih–Ø*‚˜˜WßÏ6_a“ÙÉ+a‰ÿD½¦ƒY·0ZAn/Ë­Ùllí|ÑÿQ<ÌöçÙåhÕk ÐS>}û"û|ÅMæ§®>xu‚fªßþrÚõj¦u090GJIÇðÀñs7B¢Ayà`>’jÛЪ“?}œ¹`Õ&‚˜_?À¾@Qo¿ãµ‡I@´°êö!&¾d‘Ž^¾a±oÀo†fÐïü{<€òÚóH¨l=púú䀨8è›÷;ù±åk·˜Úž5;qQz™ÑµŽ]¼÷âCM/øÍFXoث߆8©l³rõ‹| ö²û Ð\1—ÊXR‹D™dbr‰žf19vñnÜûjâþÆÈÿ™Eñ "s.R5°r»•‰‘ÊI(mŒMHB‘„©®ÿ¦Z·ÍÜøsve7£°ìú=ö^Á±ï«qƒé‰+÷ âbÕí‡Ýý£³ˆQ8†)èŠ Üó©øÀEL¯`䆺³nmS)&«ü;ƒà2ÍÝvžAÏßUö̘+ˆÞ‘k±Úvëswb²ùh™ÈŒd'ݧóYø‚Å.˜ÅQo¿vM ,ÕØe èÙ•=Lsäuhˆ#\j;¬Ï<¤ÆÈåX`¾Lqÿ“q ’$5±N ÏÒK;&fK­Ýyäü謊n¦9ËuLŽÓ×ÚœŒý@ø‚ªðòåaz I­…!2*òÕ9Â*$©¤³ÓàÐÙ[i_ÚÆy—À[Ýý£2Ë0 Ó›F¹%×ñŠËÁ*ii¾ §¨¼¾)®y$Ú1žD¼ñ=E[ž¹žú¹eŒGBmûa·Û‘o˾3ËiÿETßiëô"·¤»TEw÷!ô—ØôOÕ#Ó‹$)2êNøê›Ñp’ ›F¸M\ýže|íš’ÕÞ{ü2…¸½‚_äubà•-1 FËvåá ôØÎ&3°l*ÊíÐYß§é¥]S‚²ZtDž%kwÙ]¸Ÿi'LÐH²­<ŒZ$FÝ`Õ…µÈò¥ª@“Ë¡/ÑdÄÐdÀJ:'e´ŒýE´¿p/¡ b:­t„¶qyÆ;ðiRNYëÀ þE Ú(½øÜº~v0k0Â'i_:þȬÄP@ã•ÒØm1äåÇÏuÿDÿ ôiÁ|ñ¸õ îmQ}÷§¨Œ¦%îC  çëᯋÛ'ø—â%:¢‘Ã¥ÐÄO9eIJh:¡(ø“Šíý' $ ´ŒyÒ]©kîèó(õsÛÿRÍ=G¦yŒWzÑQØ€BÒ]ŘÞÇ ‰BÐyÂÃ÷Á‹LêÞãšHB 5Ho£Ù©kSŠZÏ^ºŽ ~l㓆ÿ^¾ŸT„‡9Zíö£„épÛf“#.Wƒ#SóHˆ¢ÌÛ2BkÓ“W$¶ŒóáÂ舚{Žy‡%§­¤ŒFLÑqh·ü žðô£ÂS¼Ê[,Áó)Ê ­Ã’H©°yCqœo©¦ññ+RŠS.ˆIÆ »-1Ó/4ôÐiërõnÔë‚ê®Ñ™Š0;o„“c;h”O#®ć©_¨Øk?#/eÕPæ³ìIìÍþE–yA5§ý½ñôÜ­ñÄ[.‡%µýÕÙçxýIzYË|åmÖçƒâQý¢Þ×M'ñß—6SY–íT–¥³T$ƒáìIwÍõ÷l-S$ó×næyJ[#bA<ãý¡ bë>p±{Ñ`1$Á¸Zwõ™+Á‘ðó÷q°9zÞ÷*›ðm”—˜Âã×¥?fˆ®Úzø…(·qÿ™Û19 ‚0bh>ˆ±¶)n1*(âû¿±vh*%·a˜[jÝžc`\%]L"Š[¬ÎÆçD @l„“ Àz“‰ó@h‰ÒF€€ŸSóIàAvíVóc~,󔶯Ÿ¨ä”\»ûèe0×NƹŠú‡Ü_ÐýŸç~Ã龎¦½ŒBbT®ãIaü¢'E®2ÍUÐFeW÷Ï5Û_¼Ÿô¹cj®ÂæCn¢î³wbóšèA7GÒŠÖ«tvYa (%¿ŠZä¶ýÇ=' g…}ì⪆¶B_µOÎY¹ÙÒ- î/b~3åÿ@J´Ö×´è¦Út ïYSwÁ)+@séa[½ÝÆó^â§¶?B+ôºÞ‰Ëû6Žˆ®q-Æô-ÏÈ -CKÇ‹OShyªµ'Fy¥5ÁöÓ Ã󔀅Á [&å7Ñ—ët xQÐRq{)`Ìa88|q’ΑVÕ3±%‡bú"€_C?¼¤|éb$¦x½jõ%ˆ€ÿ±µOÿ4sp» î ãžGL^ãxw"àp‘Ñú5s‘ÚN»‹¡IEíS´ÝËkç'ŽÍ¥Ý‚â?µå”ÑÎÄ­1×:ÄB…\¨HÂ/*eó“Ú½»/?µþ’ß„]Èm-»a¿Ëí碥[PBaûßd.‘3Ì=LÍš[œðºý$)9ONcû÷óV‘Zó›ÇQÀæ #|2:æg¦݃Š:â³þ i§…´HÈèŸ(¤²nÔŠ}%+“Ñ1;íý¾~˜w™¶Ùi?P ñeQ'>¥˜®Db»hy9PÊãW9¸ÈuÐWØ3ðÀáYªeêt32»vþgæìK!ê:w7ñsWHLÚ4 É”Š}û¹‘J )­ô¢Æ>F~ åo£³a=ˆS3ÀµDsï©O³àÒë÷9ûFh£!§HHè°¿þá¯>”·SÁC3ôœÄ¸HQ¹º!n)M˜ño«~qHhŸÀÿõsJ­7uºý¡B¼÷ªø;Nçœr8s -QÖÝcƒI¯Òh`Œän:,qÖ»úøMùOöEêð¿ðŒÊ_’ëLoFÑÏßKúòfJL-åL94§´eEHJe³©ý9*s2:k^ùO¶…ª;í/?x]ÚͺPm§ƒ÷£7å½³$4öž¢#ZI*éþG|T<’Š’æK¼A7¿ùK¾3ÏWÞ~äBhò—®óWï°»ô0­ì'ûâµÆ§nD¾¯ã'ˆÉ¥=VN—°î ’UÑûohÓ^*jƒ‹,jg˜«¸õ°ÇÝÄ¢FQ%ƒ#ÂRK{Ø©ï9yýÙûúQDôM.ýIL>fè–¯^{ÞER¢²Ûiwèë{ Z@*›-݃@ºS€míš\òƒU|щëÏÞÑS¾öbøð¢‚ô†æŒ¸Þ‹WÖ>šÛ86[DŒ8!´BßÊË,¦¶û¸ÏÓwuâýÔ²^<3\„ºIø ãdû # Ýô§ßP‡tÖ6sö‹Î!ä³<œø¹sÆÕ]Ç®Ed#âæÃž€Øz¶u!ue0ßmxðÔ¥Àg©k»'yÄuŒlÎúÜÇE¾­ìçbߌ|W7Â'»ñ€[`BaÓ|•G¯Fd׎Pˆ¯Ë‘:³Kà ñ¿‘´¥k¦ïÑCc¡ FǯEdÖ ò,ÕÙ6àÅÇ6†y« ®<ɪ™ˆa¯+ú)’Dm•¨%"z>Sõý7—ØJ­]‡Ï\»ÿ"ûkò—ïÌ T†Ó+A*Zfgüc Z§D”vØ_ Ϭ!ˆ^aiàß›ŒmÀebH$ˆx0nCxÿÞ¤YØÎ ¢d`{ñÁë²ÞY '¿˜¼æ?sWm·óÄa‚ø ­rà¤Â RÑ3µ§Ç³fÍ_®¹ÓêôÕи¬8h±°Â–ÞÀ¹n¶E@ì[Ñ9Mж—¿­¦!¾©$Ùxè&‰ÑÇ0¥KX Æ»ôÊz¦˜àI‰úÐýÜd‰þÒÅ,4©4Ž ­ÜväÒ£Œê!¾å›­qhEPR¦'‰n6üƒ‰ ~‘Uڊɹu;,¯„ÄFd}–mØ60žjñ1Ÿ§Ùõc‚+¶¹ø0£Š ^x˜^=LI $d% AÌzÒ‚E$ª„·é½©øÞµïômÒåT‹ùåõm.#ûúydtyÞÒÇà¨óƒš&uç×ü˜àRî¶v!êëã\°BÛ舭XÒY\šî!PP1×Ò–çC_—ðÈ"bfÝXlÆ¿ƒ ê¦Òsô¬æŸȽyì쨀<, Å˵tÃ÷{É_{9¤7<’ZÞˆgÖ?‚B© gBêÆ$ãLQ9L2zß{žYÒ:LÝ©¿ ¤ä•ÙxðÜ=°ÕYK´ö»¿*陵DÛÂý^JÙ/býïúÙF Ž:)„3˜ÃCnu÷$ŸÄêÍf¸´>N)íý®A‰Å?Økîs |Yüƒ]Rk¿Û]@ä&ˆY ¿¯Üý›ÄÞeE2~ÅMýÌÂÒ˜5º•NÏÙ¸ß}õ¥›}ñ:ÓÓþñ…ÌâkMœý㋺Xkš»'íã–¡'þÍÖ’±ò0ä-çC¥‡]|ÂÞWtMð,RÚäZõíqô}žßƸ@m£_ì§–EëÌÎ%•öqÉl²¾žÝøO"/aïÐÀÕ·îG3L)¨íAAo2=êáÿ4µ°áó Êka]½ëøõ¨œæIQ•Ý'oÅ´ÍX¨aêøª¤—k ‘:ËÂ8àZ@R~Wî='+ÐÊöƒN èl’çP<æóì}ãoáUÛí¯>}×ø{Ž’á±ëQy­Œ ÔMN$–ü䤿MYŸ¾Š‡œT$Œ u“T(¸­ÎÌ´$ç×ö2 .Ï_åc¸ô8³vTPÁÀáÚ³ÍSó×ìu¾óò ñÝ·)=;78Ãg7bŠø?A-Uý¿áVžhÐ<²›¬<ѳfËoµ½ñîÛ¤¨ê'ÿ„⎥±iêßCǼ嚆TÝ%-Cì´$Õƒ—á·p¿›Tú“CZçEh¹Í6—°µsW9ÞŽÿÜͱT÷ðÅ'ïšð(B~=S¼‹0½ãz=âûø*];ÏÒ€Aì¦gî$}²@k_•ör.Óµºððmí¸°ò®“¾/ŠºgIoÄ÷Í 0ôŸ!‡Y8™`ÂÛìÔýúSCx„ú6lI:ºõ¼ IL¶-ás÷L)ƒaéÕ£B«vž¸Wøc¦´.AdÄH-låœÉ#Óò#A™YóÑ#Ü}ñ†kÿŽ£Ðˆ&ÂߨO¬ZçB^W (ì8v3öÓw:"Òp‹9X6¦K1«@As«~ù‘Tæ×}ìqݘ°âŽc×£óÚfˆ¯3s½›R>8{åö£7žìb—BÄ-LàdòëvÐB’õ}$¢F ’Ê:C+—ë_åÕn´ô¸=æ—ßjwõé‡fàá™À¤¯ý¼òÛ|b>v²-ÙHgÐS»g®†Äf–´ ²Í¥˜}/6‹Ê>mÄæD¦YÿW¾¤ÇÀç;‰%}Ür[ì®Eå#¢ ¶Î (“”72»ÓÉÚF6´$¿”Ú¶NWCã?‘ý¡#³¤6Xz>ȨƒŸò‹ÿü“SFßöjd^«äF«K€ÈüµuˆU˜L?ÿ‚-±ZoÔý,­èÛ ›èr­ÝGÜý"^+ï:qóùÇ–ÅëÍÝIGwÇÏZªgãý,·Er…˜C] ¼ipTzÑ7LFªtô¡å'”Iú)vÅ6û«ÏrÈþ¹%•õó­Øæp=:"­k}ùiN3AÌicIÁGi¸i'&*¯5 œl7©;¯ö'“ÆM\n<’Ñ;LìODÅÈÉÿå—^n9}»«Qùdÿ"`m:‡."+ý8 &õQbNÕ÷?0õÁÉ î7Ÿ›‡gÎ_¹ã’ÚÎßS="¸ÊðUí&ï§¹m,:–Âß·Ì #Â1ü–<avœ–ƒ!HR«ÞTˆ£KÐ1}.ÁÉe[¢  ·¬."Ò"­ƒžß53-Ö>t1"§õ&ˆ…öd†ƒc2¾´L‡#1KÐÇ<ã!îsUÀŠ¡·Ð‰§9­3Ò£ìo 5-<e71.Ò¶„5¶³ß©ìÒPcÃt¿¹‰IxÞ!© N±U›öPØ~ µk;tá1 ‰­Û.ìmÃä ós2¿1ˆkQˆ'.à Æn%æa(`ÔÈ‘ž.’RßnÅ-«ä ¬I\Óâ|XFýÄ<õ}®!éµð¯™{ØÛÆ)ñõ/<Éé`Ÿ¾ªbB‡ßÁpí·Ö¹`ŽP÷ãä ý¬¢ò:ÆìK6Xz=Êjœœ¯nêzïuõØ•½g‚áß¹j¦®¡ “ 1·ƒNWC`²ÐNaлÏ3‰þþ“hY½…iá:s÷дš±9«÷8&• *ív L®VÙ{6$½î˜æDœ‰×@×áèk;˜—üz0mŸ¿™<Œ¸‘ȃвu"ªÆ§“Êù OÞN(ù5þõU6$¨¼çÌÝ´Ú? 4x!"NÎ!1€Iìüž¤|¬ÿÅ, ¾c1¼i=_dgxÂ/¾¸—{ù¶£7c‹~r/78æ›PÒÏ¿j·sð뚉ùë±su EIã–„ãÈ1Ì×~ižEQ³A|’ ’-ö>Ñ¿Ï\ªwäjTÁ÷Y2[ìoÄ÷ñ)ìt L©þ=_ â*ÓgEfá¥êœ¦CV«·à]k*½–ºñðå°¨Ì&µéȵ˜Âî;N$WÏÓØï‰ˆó©ùwºCQ{çá³7R’^¦‘ðÔ¢¦Îf¤ÇƒÌÆ)1B鿀ìYðƒs¹Á ÿ¤Š1ѵû=Ãs;9Ð%¨ãç 8~ŽC‹a+ÏÝ ÿ6È>o…Î^Lf”uMÖýU39{/­f\d©Ðe èr1%»õ˜_bù¨ˆº9AÄ‘JNvÔhùÃ'¡¼Ùì8Ìýédín}ùÀª]Žw^•csOC+~C™?´³-Õw¸õ²ldîsDÄ/ ¨¬2´¸ Î#à‰kcrNzí ʼþÜúù'iò‹â>Þ•†§î$UŒµÝd·°HéÙÝŒ/š£fˆ]œÅßÀx¨y@dÚgT‹,¥L±Š€Z<ƒžgW€Jo²¹õñ;‡ìÖ£·âKWŸ }ûIR÷Èõ¸’Aaµ}ççtqâU/ªe\Ü%iâY 0­uÞŸ–„RÚ¼ßñjXb>¸ (×+üC+4ÙçyQ/Ÿâ®ÓwßÔ3,Ú`}-¶x@H•BD/ƒÁ¿|á¡Ó×B_ ñðPƒÃ7]“à;¬\}#Þ@KD×ìs»ŸÙ¾uè24™K~Ç©ÀÔÚ? µ¬®Ä|îT1=ˆ\Ô5*\aÐb¶ôxÐùZØK*ô¥µC/¿(9AK€Ëžá93e¶÷OªŸ¯iy9ª°O`µ A¤=MÃ#Ž„Ë?"@ü;­‘ˆ…MØ ‚ºÄvs-78î—X6,¬jê–ÕÂ"½ÙþÖËòQ#?õÎV6qˆ´+Ê)¾Å0[à …±!$"ߢˆ—¬Ù~ØÕÍTZÏÖ'ösßìUFgî¥70Jl„–@“ט{=-øÉ§´— ¢ãÒ p„YïR8%‹“Dñ½ï«z˜„e±îû hÓ—žåƒJ¶Ÿ H©Á ¼SÜ-ñx’ßÍ»ÊØíaN÷¢é¢¿D`Š£°¸•T.hæE=sÇ€äÊ1u³óÞ·§ú&VŒÎ[wðRda/¿2l`îÅ=®?tq“qM®{çÊ®Û Ç¦‰y$VF—iÅ­ã$KpóÅ—~~¥=.!X®0Ë( ÷¡‹KÁÈõ RÇäXÚÕš6†ùÁûÙDå1Ø“UþƒAHfýžËÏжŸ H©žX°º[ÔÇÝ…ã^¹ûlØûNNøWhí´‚ÃÄ‹ì²v<‰mØkïA¸=ÂÐì$æxH2hÓù‡ïPpö7ã¿Ãâ<#ò¡N£³aïÚ9äwž ÍnçX±Ë‰óœ½–ðº¶ÒÛwü ‰NðJ¨n³ R—©´9ýœGÃÉк>’‘¼÷¾º—EÔújLQßl%c×°ìV6™m'Ó˜–l>æŸZÏ$¥"ðM«ìŽÓ÷ßwq÷n›8œ§e«érI)ü6DhsêJØ«‚ÆaNÊN—ïp zÓÀ(©çà—TýgÑF;ߤê) ½cw^7²ÈlwDò-A’#h9‚îÁ´Z:¦ÕÃVºÜ|’ö¥}ÂÈ%ämó’Í~¯ª~‹i[ûÄ—-в¾žP1!¾ÑÞ/¥aÆR§Ð÷ÜŸêÿ>ƒ#„YMŽzÅdÁ(à‡­¤’7=ÛŽû'WOˆi¾W24wíÁË1Ńs5,¯Ä}[ m{+©ŽIz›SÈ»Nr@”RÃL?ÉðÒx9äÅ E-§²yõl€Ô áýž}êåWÙçñ±OPmÿÅèâaÑõÖ7k¤¶:ÞD|ÐHŒôŒ¶ÊÖN×ÀeIxíQJÑZ‹ O zPh ‡9?x•L=žöÏѰòI¨š’Ürê^v'OPÔêìMÂþ1%€g1—›0U›G¸«l;tÖ÷Yƪ=®aïÚfÊípº÷¶™Mv‡sHV;çÊ=náù½‚k^yQñGBÿäÝìu:füçÈjÂô)ÉŠÒBÏé%³¥5vÚzÅÊœ |]Ï(¹ù¨Jãýã@6ÙgätÏVÙ9¶ì÷"½“ÁY<”O4SßnXÓ#²"˵Iþ7«â£°I-ÚxäFB9tÚ[>¾pƒ­o26Ã1 U2»]:&¾éx þç¤ >áKNNìó1¸ þ˜SÛÇ:_³2s׸UôKhÅ¥hèò:غÊ?‹7ÊhãP0ñŒü2*¦{,0³Ü NŒp…>2®T‘‰O1i‹)Vœ˜Ÿã\¤b`åFë ÷*ãsáù=üªû/Å”Ž.Ø`ïŸÖÄ.¿çÜÓÏà 6 |ÛÎ —FÔwOm£ à„B As/V¡²VÅ­¿ù¤4vÙ±É8g4aOB³;¸÷žZ8 ²ÞúVr=‹ì.·ðÂÁy:€(KAÆf~…síBE]S$wfYçŸÙ0V»ÑVrÚ&(¹[¯ª'ArißXewº<Ìû)¨néó²†qé—GûE´íïd´q‹¤%~ ƒ¬p‰ÃUÁq¸d{WñƒApٺݶÏßUýdUМ³ö ÷ó’áyëmn$V3,Ùz*ä]ïjóËq“K¶9‡å÷ÍYoçˆì"2d\6\Âðßl~Ò;$ž¦㣘ª˜%®ògÕ^ØÁŸj—Ÿ—Ž-Üx4 ½•CÑÄ+ºt|‘þ©ÐœŸÂšGn§·rÃ5@:_ ¥=%§o§«aTvr%¦D`‡GêË2'dµ‚ñ¹ˆOýs5­o¥4°,ßíñyXlÓ‰»ï»5lüÞ´rµ³R´‡CÀs·<íCÅmÅ”ô-0¾ú¥cR°-ævJ=ó2°Á?f«¸šPͰt;ìà€è†£AYßùÕ­}ÓZ¸Èóç2;( VQor¹ñ8µ$HÏ]–wÏ(ì^{ðj\9HãX`F+§¢é…˜¯¿%¶8ÝÏí£ewçmß«[¯[¸Þ~i&Û9_ƒ7õ´y6"­Sêàf$ò®Q80w½õM¬wîñ»ï~`½m<ª‡n¼næŠA ²Àqo‡åi8;åT“‹¢êŒRœ/šFÂù–Z– &ýOe¿7Õßù}si«;tV·Úòzj3'L–9à=‡`¾`¨|ÆÙõÀ›€hZÑôÄ•ÉE±_ÇÄ6: BVì9ÿìóˆ®î»ÀZ²w«ø$7q(ðIiâ¼v'[´³‡ÈȪí›>áQyµMæÎן¼ /è>_K¨b68ý ¯wÎz[ÿô6•ƒ>I3W™_yÕ0s•ŵäoœ'.§,ûÉã@`g_åבò &dsê~±/PÚbyÖ/2øm+‡Â^ÈbXݱ ÌN>5ËëÉ3Ì.'Ô²¬0½”PǦ`~%é~;HžYb&_HdRAC?†æ©,áFŽÎÞxUÃ(mà–ûSHÃúVjÓ,Å}—ã«gÈ{=¯d”ÛãWͲbŸ÷«Fê)Ý×0XÉwÀ›GHE’ª>uÙMË!zE/ØèÑÆ¥lî_Í$käýuRÚÐ=²ôÏÒ]çc*™–›^Nl˜¥LÍê”0Àh_›Ðï˜Ê|œZÜ61{Ùzãã@ën5–>¯êXäŒÎG–ü–4p /]´õLøç1Éín‘e ²{/¾¬ŸE=èžü±f"¼‰©üaq*ý¦¤sJhù3»Û¯›f®Üë]:!±õôÂù›NÞÏ럷éTØÇ!ñ­.%“Ëö\ˆ¯›‰_æáƒ“òñòˆö,™Y‹pfù=CÁˆ€# ¥¶V?ˆ.ø]·Ðz»Àìna­£÷rÍ×sz\ü[z·ç‹Ú™äFõ}Q~-òðY¼ÈjåÆƒ¨û [±-PÞåþiL50³k¶:È­•[õoZ;ßZ›€ìî¹N>([²Ë#®–.fæáW1.xåQó“vÝæû϶ AÃ#±$¶éXPV'Ÿªåu Ÿ¢™7’Åìê«oœ«-}3:µŽ† /6<[Ã3‹M„zzÓƒ”¬á¬Ã' ãótÃÜꇮ¿ªg•7öŠ©˜Z¶ë\TÙÔ2#¯ØjV3ŸÔ> »»¹ƒâÛÝŸW³¥žžÿèÕ= üd•~Oß”tüá_¦¹ÇáÉåÉ{D•þ–ØvæQáðB}çG…#‹ \Ÿ~e5¾”ØÈ¥fðþ—Ø6×è*V¼KÛG.XáÚŸº`åÇU’3‰Çî=îý ùsûb}Çû¹}sµ‚ÞA;‚ß÷Šê:>„Í3ôˆ«aW¶¼õsÞ—¨J¼@ª¥ž3¥nHk·Û8´„åtöºöèu‰Ð:thnË©Í\*‡n½éà×tÎX¸Õ5ªœy¥Å­Œ"›Ï<«`Áïóh_ë›ÿ󴈡µ;F—0Í•×5wº‘>SÁôÒ‹j&P]lÕ y“Ë/9T¬ü2»çê:=ù2%·Ï'­KX×ùi3žêatý&§z|˜,»âûÔl)X%æ«+º™‹g|#'– FFm=Ùá]1c…ùµÔvþõÇÂ>ý^jìÜ.¸ÁñÉ×x9ƒ£µšÖÇàB! .‚aZÚœ.Vþd™§¨oéêÖo˜ýC¶ðC¯è&ÇGŸK]HhäZc{7wXr×ÅÄ–ÙÚ'ÃK™Ô·YœºLNžþ‚'³¬ëßó®è­´Õʽ™Ciÿµ¤F°Õ¯Û€-Á9ý Io•ùgÿßîßÈ£yüQ #õµ?ùBÎàpò±ÃKÖ¯äyZàQe»MÙ¤ôN÷ȯS2F^qµl«ÜLÿ>g£ãã†åæ7Ó»çë»=¯ãÒ8ú ˜®t÷ÚŸ¿ý¯XDä`œƒKrübÔ sûD7œÍÓ?ýäËŸe{.%6ñh؇|“6¾’Ò1G÷LTõ,u»°ÏSx]›zt=C.>¨³hû% ¸Ì‹ª§¶ gÒ:ø×Ùߥ̦|Èÿ}¿¸¡WB3¿¶cD›ê‘ÐÂɶvQ9Mò+ÂéÙúæKûo^ZvcpK¢Ë°àØZ6E‹iB:'OÊí»žþCTß-¦ž[ãø£Rfeë{Ÿþ|ÆC¾-£? —üVè>ÅmtÈøüÆQÞâY>KíözQÏ¡j”;~Õ*°ÁùiåLUûûÅŒ«¬‚?N¤~ħÇ%UÈ ¨8 ý¦®01¥WÖKÔwÙzÝM(h»žÚ³ÆúNöOQ=ç'¥ òæ7Ò»çé»ÅÖsiXʬd}÷ÓäJËÀüß´o©ÛEpÔ:Ƶhõ–§ñ¢!×RÛ÷¨rF9“˯š¸×Úç IìºØ‚»WΪb{¯pj…e@þør‹;¹ãø=})~OOnîøE¼¦üÚ¼ßéÚCÌkóHªï²»’Xx4$·_l‹Ë³2¦æ7Þ|Ñs‰ª™¥fwÿóÔJË;yã2ûý>ŒÈ˜ßÎ=E;GŒ“¯‚a. MÂB8çQIÊWû}RZØ÷`y†žÀæuÇ|a\i;²Ììföà“YƒÒ¦¾ïGÈþÀ?@À$ ½ÆL/„ñ±˜×Þa¯>5‘pæ¥ûn‘åL+Ì®§u otzRƼêP@Éõ·}‹¼ßôŠï¾šÞ'i|3{xÃ×^⣬¼´§WÉw.>A’Ñ£ép h˜; npîyÍ,U›àüÑ¥&>é?Å /&wŠx&uÍÛ~1µg‘‘Oæ ù“;Wh'{1âh??…dµàÌò²àÛIìÉ›]Mi­y<¬è,аgÇËV!=׸o›\_´ é{¼êÛyõí€4þ¯€goÈŵ<]Øx%¬I¥­ÒHl«KdùŒ•|3{Å ÎÇ7ÍÖqެá\w*¢Šk½STßF×ø¶yÛ½ÓÑ¿U¸žTPGS¡ ™/mp³v—ð;@r« Î\´$7[ëÔ“r6U»°/3”mïaQ;ú¸ŠcýéçMs¶^|ÝGþبð´Ïýx˜“üKÔ à²ÿqjQ ´™<À*â”ü#»÷Jr¿Î©ð2f¥ÃA¿å,üsÇäÜÉÿ£`Rª~òYƒàf¯”Ÿ$’VÛJ¿`ç^´ZßÂéÚÚÓJx,‹Í©âìÙt:¢œYéМa©½×Ò{í¾’Þ»ØØ'kHÆ"àÃj‡ð>ÝóIÝÉù´¿¿`–ö4­¨ihæ|ìrHB^ýÀLÌp»cÀu¨fæj뀜AÉÝ—S:EôÝã[„ôÜZçnóJéYl|3g|¥Íƒrn÷ÄøÇ¥¨sÅN8W€¥Ñ¿•¡ò`Ãó¨«ôûºüÑ%Fà BOCC4އWÌZ{òi ŽK\›èï·ƒ²–÷Jf­?›ÐEûƒ/äF”…ãÚwGË4v¡¦ ³¨Âæƒ.~Ñï’Û`0•±*ƒ%üYaXðgåáb–5Ç#êøõÿLª'¢›D }>L*ŸˆjYCÝú _® à“ù¨l8ܳáEá©«“‹Ú&dµ÷9ž{ÑÀ³îø£2V»°U‡Ç•œZgâÚæ^Í_y$¼F`ëåÌqţϚH¤Ìïùà 3òÝÞ¥»qïði59m|Ú†i°z øõcÇÒÏ÷öÐ]äì&àù|J’¾?°ãœw%ùQçÜ5à4¿“CxÄ­|óé€î½WR×{\Ïfž´VñX Z ~hÜ’C…¨(¡ºKÎþ±ùàŠYð‘݃ýÜ“R"É›ÉßyÌ"ú8Œ_÷î6Û¦ì^Ãh5qȹb›QÌœœ§µó³°pÁÝn°âém/h&B¿¡?%}æ¨À£DâÖqýìÚÏ¿nVõ,#Wr¯ R÷mb1Š´Ï'?ØÇg›¿I+|BÒí ´L*ª±ºômT® úö¬-ìeÚ¯Ü*ûå6p®±J˜´N™w(بâÓÌn–¸(÷¸q§E±zà°¨3l1¯ï›”¢ú9rf^)èãíØè]’ˆ’øã5&õžÂ5"–ÑýìÀ~a8ëßÀ õªs×Åø)±{Ÿ©4ÃF„î•ÑÆ-(øôÞeâZ^ÖÎîŸà›ñS&K³›`+—”ÆÅ»>ѹõc$oÚéOz|&’uÈü)~; šuêÏÛw]NþyìiËnˬ§ÃÆ{´òØý„ÕöxF¥ƒÅ7¡o!–?»ÚÀ–±p J.뾟5#x9ªÃ0¸c‡Ah/§ù»©CŽÅÔš!CB¥[ßýTôïq®Ûm µ$à^^ê˜YÑ>N~Ȭ &‚~T9ûÄ8°žVùa!±œc>á‘ÀiÁ·e§Y⼜G»E:‰Fè7I÷Þ[¬W–zp‹)A+ã²—>3W5´YzW «K(mŸ<Îcö¦o—qxß³Øq‘[ùÕ_vï»™·I;rJîY§€CÕN«ÂmCß/­ù—K]ºíݵÌl`^~8.[z`Ǫù¬’\Á¥øˆËçÊOê˜ ßŽ‹9;$vAÁ·ç€SÍN놋Y› Á‚ Yå­# ¹ôMiì“Ï¥·??i÷H^¾;Èy>¼g—ÉÛa>ë´µG=I’¼þ¸ŸsõN«Ot&é›ô“7jŸ·ZZB ®ÒäWÀ=¿^†/³„Jé|#fÚ_O\I‰eœò‰Ž¹•QSËê#©zÀ cÛÕ£dÒsq„§c N»kyÆÀö2qC«®`Ÿ/€ZCèM$ðD—8¶÷BXçƒîÝ­x§€òLȈ¨SËå”:±ëÔÃç”Cf‡Í«ì’UÓ·X^¨ 3—¿_‡Jë7Ñ«Ü?JßÉZ”¼›C$ï^µM/â»ØýªífHN¿™‘1&í3$å="ýbB~©üXêáí‡Ïs—JeF®ÌÅËŽ~±ùBÛ˜5ýµ;w™¿›‘r­f6M&P •|Ü)èÒÌïÜÄÿ CøÉ 4¬Q„Ò9³›®Ðrð°T¹ÄÒkÄÊnðJ+V‘²O´Jœ±Ë"”\Çjš¸FÉ¿ï€síî¥,–Ÿ·[•°ÙÖr»t„Ú¾mbæ>¨Íoh•"¸°úià9p÷ÍS`7éO>þB©ì^IsêEû®KÉk䟵óØo»˜N©—D¦“´Ñ0ƼˆõV½Ô½qtq#ð½ƒ5¸(ii)œ„Š!ø¦ ö„ú—IDï® oGø®g¬WxÚ¼Û2›R;fA9èÇÑ€ñcA3*‘Úi´×*öBu· *$t°¢ÿOÀeH½à·öK?§}j¯aŸÖKÞÉ\#éX°Aŧu—E‘Ú«Q Ï6§^§&þ‡Ýâ~Ê1¤ ØÀ²z°öˆP{$)Xáöw¹`ñQاүŠš¿¿¨ß¢ñ¬–î\`p X§èÓ¹ïv³E­I&Y.£uÅ^çNÉÀy­ôm`O¨½&Xñi¹9Æ­å ΰô…arI»EôÀÞ‹À­’uúzy¯&Ž«™äç¢NO)„̨Fè¦ÑY~áõQyG6¥Õ^nÕ<4·a§èò’Jð“nÀTïÓRe€œïæ’*y5€û8w ?hâu¨ãvjzgÚ(ÿq_¬±Ø,ý ëBYß7IHÌq½+àòE°J6 ðdºù¤_ËîË©„ª¯F¥žöIøŒ)¼!4þÄ dœÃíGx­]5_ð-Ë“ùPE|Xµæ“ú—í¡“T”k¸ô×,hÌÇÉ­§|˜ôÃÇDî•3^L#×M"7Îb¼Y'ú|a©`À›O"1,¾”ް –¤†õå}Õ‚êÍ€=G€'Û”ÏmÛu‚»9/§¬UðíÞïTÇåÐ à>¤±ñRÍÁPŠ}Ÿ„"™½Éœ­ÀfJKÀ’ÍP Öó°Z_ŸÁÕüP½yà <0¬›ýBä¨àíjè…ãA?Ã~j¦Òßh–z³É¶G5W lë£õöãƒFjÚ`Û‹g`ׂò¥ç€úÔ‚m¡Ò)ÐÂH}K“ˆ~®Ë ³Ò¾' Ú i/q8õ‰¢ºÙ©œ¾ç%¥Ãô¥^ƒ¦³uê`£5Mãå>°âÒ`Y;eXAX5 Z`òp›Gò_Ï >ñ¼_إDZé€×؉xš›mò l×Zõk×/:’+“'M±u÷RS¨Ñ@Ô¸šå`‹>¨–ØÊc„Û‰Ê(ÁïzÂZãí>—ë÷ÃJ”šPžó¯gÐ î°+ ;ŸJn˜AýëÁ ²k'òDÞqEìæO•®ÐuÚMÇÂÉwPÖÎÔÖË®rùìqðÔsšè­›U<*iÎöñÛ—0]Îc°¬àñœÐÌã  ¸7c9vyüúÏ´a"ņóOÆç¡žîüeÀþ»Vw\a-¯jÛÁòñ`‹yX1ÖàøÏ$r.Eäª/{øî~a³)ßíÔ%Im×wºH2yÿ;þTÉ"n›M¡RÍ6P§x¨w8ØÕWy©“ج l%²@Ö‘U8mdép;}ö ]‘²oÿ½š=w…|f´?ñP:Ì^ûf1nGø˜åýÑ.;ÆtÍ· éy`Gr¨G5ó.>0V°3Ô#ßP¨­ÆÀ$¬§´ÿ¥¨až«I?=éàw¬ßçÚ{$‚Ò¦K%W(nï[®øƒ}·¶$ªüð»ïáø&.5êJ6c‡:h*ŸZU=[L|í„zqw³j½lf1Š™”òlåsn~6q*c×ÓuVmúݧïo‘ëpd+±d4¸xÕöžÛ“ç`ÓïOåõí‹K=@ŸºÒ¼Kú7öýxZ¾AÁ­œúlÈðA×&>—‰Àu&U’1l~Ô^´þl錄^Þyb"HiZB–‘¹•½³»Ø”=Ø}°–¤`>¨Ì°¡»ô­3B73½»œ ¬#©lΔÉdJæ+~½0ïÅ]jAŸu•½zÛÎ}Â’GNœÒ9oas÷Ø|=ñcá—ÆnXBnXs»Þc{ ƒÛÙÎGOˆ»Öï¹]ÃópH9‰Õó§Õð…Á+³÷·ÅË÷¹ñ·¹IMEM.lØ °|"’GOœÑ3¹ v_nD Ív°Í”ÑójJ%·br5ÿ^û2V›/<îßNçòÓ{Qxm (Ò[” V%/tøR×Ú3<1¿žŒšž`¥Ž©ž5¸58‡W5/5N”µOžØgñ¸5ûÂ|9‡Î¢”ÛsJÿ‹T*œàGùÆkѪs‘z´5ÞQï?d”×6w ~Ÿ]KJµbåÕ4¡ô^`¯N¨ã á0»–_ ­º_ëN‹ŒÚ M ÷z-˜5Ÿ,SªÒ¼EŸtzM´.CµŸ.‡‹ûÓçÁ±IyÅ• íýcÓkH(éXvïÙs`Ëo·gPÇêgÅëÙ$þ±Ï¥8ófæxØZÝ\Χë-‡Î÷˜Í¸0¦ž^Œ8KUáqv׸Éek»{<½_†¾}—š„ÛÒ=üc| ó.^a°‘5ØdÙÝ/DØ<´e«ÆÓZzðqÉÇÝb>?Neìö!¾3wsÇöDõÉÀãë2îÊÒö¥‹ËÈŸÐÐ]û{®}_G'¤åáv ss ãN¨?ö…«ÍTr·SÆ÷]M˜’týÊq£l·sŸRòNoŠd^Ûã xˆ †pO–¾¾C¿}çž}ÄS>yNt]½ü^½‰Mþø©¬¶¥gtj Øî]HêV|7£šGñf“dRídËúñ,¾›Ÿ2¾ÿz“µìžäúÊW·´%'f~’mÚ¸c7÷~QÉ#Jêgõ.\²²stóòŠˆOÉ.úÒÐ181OHÉ|â^ê§ApÛ…Ø9Ÿ©€½"×̾[ƒøò´×GkÑÖ¼¼*˹i¶¼º¾µk`ôÇì¢Ô[™Ù÷ð ’QP9­clniLOÿàÈwi¹%ÕÍG¶«ÝÏœ²Lœw®d½VÄîЭ˜È@çË+Óæ¼¯3@Ÿ‡¤£,#&"6!õcnaYU}KWÿè¹µÄä›éY8¸€€•Ojš]³up¦ýÛ3.)C,Š¥?Si¾™Qz½Þ°ˆ/xëãM~œϬÖgéMõ½n¢wÎñûßÁáQñIéÙŸJ*¿6w.Á4ÛXwó «žÕ3¹rc’MÕ1±ûÙ§Tj¾mܶ¥ì·[Gl}Dè¸ñù¾ËõþF¢Û ×ê\0»bm{ÇÑÕý©o@È›˜÷)s‹ÊkÛ{‡'f×SÐ0Àf¾gz/ÝQÛ¸^M¿Fƒ¨ù€é“IŒ®ó×¾Ù=?ÐòèY]¼ÿý^"â‡å”ÕOké_´°ºyˆù©_@(°1>d!×µt~ŸYCDN»[õVTñko;X´;÷XåИ}âpýaܨÑd:ï'5ööŠóÆŸÄÛøi¶2²°ïææ—>¢¨rò¬Ž¡É¥k6ö.ž1GÆ&¦å!wdöQ2ñý¼ÈgÒʤ2$|¿qÿãqÍ"±$ÑüSãþòŸ_Þ¾zÑÎ'uäûäìâ:"2 ê- ÛÙvqíh M]#S è;În}^†DÄž´ )Þ©æ˜2Lðz½ˆÉ#/§5ÒwùRzÒGîóUÝ6ZU\ØN,XXRQõµ±µ£gfo ÜLÇȲs€°˜”œÂ €6¾xåºý ¥à9ÇØÆ ¢æÁõÔÊî_èôbמI »=¤ÓbøÍ…»é™–=-QPÈëÈ踄ä´9Ÿ>—~©©kjëꛘYXKHFج{xE%dåísú)Eô=Ò‡˜Õäþ”p(¤ÖO"7«dÍ—oLUäa¤¤xÒ>aÎþÎ=g×GžO}ü‚Bß¼}—”š‘D^ âýÃ߀ÀדSÓQîSµöËì¡»àW´ `Ñ¿÷j…^:ÃÝaýöó“Ï}Kt»zíVÔ°Ô©³ZºÆ&f—¯ZÙØÞrprqóðzæ÷âUHøÛ˜wI€Ð‹J+kZ»^e¶üd‘5}œÚµIârp•¢[­^‘^önj/æÍ %NÎO?Q\âß/$"&qX戼â Õ“§5µõ Ï›š[\³¾iÇñ¾›;À¿ {Ç«hò âóÀ&ÁsÎñ-’–Ñ}&q³ ¯æÎˆ&‰–˜ÐU9Üõ, ¹½‘bÓfÚ­Û·ï`ßÅÉÅË'pøRÐPþ€Ž¾ÿ5ëö™ 㛸.ºÇVϲ*^ûJ&u3eV­aŸëˆf™ÂWÓÍ…ž®Fü¸ÒÓ704úmüÇÔÌÜâšõ„ĤK‚ ü{¸yù…’þ‚‚¡O|Ù ç13ϤÒýFÞÅ’wò(ÎÅQ\mQ«ÕYˆ¸pˆOØ,E(+'ïSAQqiù—ªš¯õÍ­íݽýƒ#cß'&§ç~®#ÿÍ–†1"æýJç3šX¤M½2úéïeÌrüÂîÐ¥\p´Á–gºµ‘D­ÊÿÅËÀ àаðˆÈ¨˜Øø÷ I)Ò32³só?~.)«¨¬®­khjiï4¾ñ0(©´{vŸ‚ ¸ZÔÐ+ç÷ùðÁÚǰ½9Øöüªîí¢–V×mnÚÚݺ}Çáž“ó}ׇÜ=?yêíãþ±WÁ!à{ ¾^QÔ¶r úP5LÂ!cì]½¸÷Œ{þ©_¹\G {nìèÍ)Ö?®|BUMý¤Æ©ÓgÎjžÓÒÖÕÓ704:ÞÄô¢™ù¥ËW®\ÿæ›vP¯ð¢Æ!ðc/‡çÉÕã4BÀ,jÞtÄ1Ló=3Á3©µƒsò»9÷ìåâææáÝ·_@`¿à!aaуÅ’”’:,-#++wä(ØÉH䈚þUhÉ{ÓÉv!ÕKnoËÇŽ\êÞežAg?q—¥óóÀºõë  ‰ˆˆ‰IHHIÉÈ6lظ‘œœ‚‚‚’’rÓ&***jjêÍ›ihhž¼|›’SÚv¹ÙÊ!(sòÂM÷ƒÄì2^®½œ»9v²í`afb §Û²™Jöð!Þ=;™¶n"];=ÚU_šý>øñm³“;Öwf=5æýyjâÞ¸œ)3#Ã6àÿÐÒl¦ÚDI¾q)1Áúµ?çg§''¾ õ÷vw¶5—æ¤%D‡ø=v¶½b qTdׂѺÌ0¹í?>=>µµäú–°íN¹]EÓS“?Æ¿èëéîìhkij¨«­®¬(+)*ÈÏÉÊHKI|©©zLbÿn&j‚ɾ¯‰Áî×uŽrSŒ”¼¾¥ÊÚkÎVyÄ“P74#Á¤òKyYIqQá§¼ÜìÌŒ´ÔäÄ÷ñ1Q‘áaÁ¯^>÷}æåùðó½;ö7­»J³Âý\lΫIíݲØ]õÈìëT‘GwÀñ‰'ìol’;Û?¨G½ ~ðÂß×ûécG®.N÷îܲµ±ºzÙÌÄX_çÜ铪Çå夯œ”Ú¹yíp]N¤—͹CL³51;G­ù{¼„¿tŸN]Ç{„g⎳£ÃÝÛv7m¬¯]¹lnzÁH_Gëì)u•ã Ge¤ÄE…x÷îbga¤ÛL¹0Üü99ô±­"ß–™ÆTß«ò,ßs<4èëKyr¥ŠÇÑ^Ë-}mЧ«}îì©“j'Ž+““–?(,ÈÏ»w÷NVæm€²xýϹ©ñ‘î¶FW£bƒïH2þøpé Añ££kÞi.øìŠàpïãÕ³¼*»Èv8Dùxörr°±0m££¡"'#^¿f~úÇ·áþîöæºêòâOÙ)ï£ßl#«Ëzý芪 Í·Òð[j;Ç3ï+l,´ãùjKÆÁdW²a¿„0©î0-õ&!X»8(#ƒ½mMuÕ%…yYiÉïc"B_=æéætÇÖ굇Žìò¡²¨û¢T]‰÷”6×z«'é dI%l·Îœf`ct;Ö6:Ôßm µUå%…ùÙ©‰ñÑa¯^øåf¥§&¾‹‰ 7gû–—/éjj¨(ÈIŠîçÙ½ƒ–²(úñU5ê¡‚ +yÆÁd‡#¤ƒÞ›¬IÜ)œF”_¶PòT•…_c yõÒÏÛËÝíþ½Û¶×¯^21Ò=wJU騴¸°÷îŒ[6‘,N}ëïh:{hûÏ–Ï.aËö<·s0Æ|W‹§DÏ}ö²…G“nä ~Ÿ™®‹>»×._ì+VwàáÆûãïæEI9„˜çsN«ŸP<*#)&$Àù“…a ÕFâµs“cƒ]-õ•%ù™)ñoC^<{ä|ËÚAWœáGY˜"Ó@ò9²¢ûã!ÊSÞ|ŸN6žúrðùCÛ.Ù;[žãåçÙñƒ‰žfÓ¢µóS߇z;šj+>ç}Ly÷6,ÀÇóƒíµ‹†çÔ¥é'+£îá]ûå•™à|Ö]‰é‰g§¨]"à7£±VéE78Ù(ˆ'Gº›«‹sSãÂ_>u½j ’‚{˜©‰f‡Ûª>¥Fxö'Ü:B^ñDmS‰ÓÁ±`•…0…á=ù:÷¨_°¼bñ!·ï;‘@cVHož›mu™IѡϽ\nYš"pL³Ð’-~ïi(ÍzÿÚÏÍî’®·ÞžoI7ͧXîíð>:,?ÆW~‘Ðï¹bÅò£™üdWkù½ú¤žv6‚Óí}d¯‡³½¥©Þ)ÅÃÂÜltäk'Z*?}ˆ~õÄÙÆôÜq‰}2_ 8zÃô™ªÝ$Æä¿¨·¡‰•­3¿±pgÎjP³hÿóyTºË™É±¯`óMWCIZ„‡}%ÁÌHçWà ÷w¿{Íø´¼ÏöMk'3ï+nª|ªF^tç@¿ÿÑ ±vG¶,ÍïÎ[B¸âßó¾Ùæ6cXÈë>¦øÜËÕá†Åm EiÞ TÄóßz+òR£ƒž¹Ø]ÖW?"²—‰bÍ·ŽÊ×—ÌgÝ“^“~»ÈZ²ßƒ¯òò†`áÂSíçG/ 7žÈæõYgTÌuý’±–ºÂa‘}Œ›IN ´V}|þÜvTØÍ@¾8Ú^™û>ä,Û@ìUñxsŽ–'rS2£¾÷X?j Ý¢ðÛ¹7Š3hëÓ:ñ7äjòÀ$á`¢![39ÔQWš“äízëªñY%Iú £m•9ïCŸ:YQ~}©¿³'Ü€¹ÞCvúè`…ïÏ„j¯m 9Pp²íÂÐåQ“γe‡béïñ8åº)—ÿú¹§Ó s½“ÀaͶ…tn¤õKnÂkïû×ÏŸ’ˤ¶µñùÙ­U¥§æ"5Ö„+ ?Ú›¯ýÍ‘úÕž¸ýIq{‚6»L^¨Þ\Dzš«€óþÛWÏ\o[šh©ÊŠp³ÐÏAœË Ó³ò¢œ[íeÈÊ‘F+ ¹°}Pé¹NâÍ%˜.ùéÈga6zŠõÓÃàµ8ûßµ<FAœ—u3ÁdÏׂäpog+C5)^F²Áxk‘¹4úšÇ ëR/±VÞåm¸··Â’6ImÔ…5Y¾Ù|ö>õ‹oy…i7¬™l'ÊkÿGw-/h*Iòï¤#™l*ýànovNAd÷–õcÍÑׄçÒ}UÉóíø»}ä&^É÷os`ùxú»+ó{ÙjÃoöD·îïk®,Hó{ä`uáœòaÁ]Û6.€ó.!왳•‘º4?+åÂ@]þ»Ë‚³Ì-š[¾<šŒv°4Ô;° <´«sâÞ¼pRЇžcøµÐtêu±ýmŽB}¾rß_õm½Ãš­5ûŒû“öÄ}æXéš#bûØ©2ÞÛPšù.ÔÛåæE-àÀ²iÍXkYF”ÿkCñ½[ FG“l%ÖåÞ“ú™fÅÛóR¸9Û’wy[®UÒ™ù—¢õÖ›ÞÊ4]!{)P°sźÉþæŠÜ¤ˆîw®ž”æ¤'›h(J ÷vº¦w\Œs˺‘†OñîÊ‘•¸+Sß?<—p‘µæ¾pŸ·ô¨Ÿt¿§À×›ô©§'<÷柛tcÿ@0=ÔZU°r…’äŽí‰®ê¼÷!^w/k)ˆpЬ®ÏqßI‘ªÖO“±ÁWcSñ½ƒß^ŸÙfº5ß‚!Ç”2áôŒÿÁ:ëͱG:mi£;j?gćúºÙ[¨Ë ïaظ0ÒR–ðȘzBìT?‡êòâ_¸\ÓV¥o 9¿»?â<{›¿úÆ\®VOÉ‘G'^Ê =n°ßþQkÞoÿ—‹Ä¯²Þ¼ðnM% >6Z¢©¾ú¢‘~l.œ’Ý¿cÓÂà×¼¸,uäYz£¯ìŸJ½qàGœÙΖgŠkŒ·ä[í(·aû|ukºîúPÙnGÖ,Í™g¯žÜ¿i®«„Ç^òªò€¹âLåÃ|,äóýµyq/Xé) ±nI´“"(xpŒä“ƒøô;SÖZ×C#Êó‘'×F¨ÎÊö»ñTXPÄ)=¸uÕè´¢8Ûb`*—eƽò¼{E÷„Ó†Ù¾š\À³Ö?.ÂN9Ó™é¬HUãs–¡Þ÷$U‰3p7¥G[`ÃYw_ õÁþ¦{{*®Ñ¥i-Š·ÞÒR‘Yž{…©Àܳç×6Òéžêœ¸—®ÖÊ9¨z+Ó<4˜:ÂM¹‡£Í8{‚ÎÑ–9ŠŽ©&Qg™nɺ°)ùܺpù!Ï}U×À‹ÉÜpken"p•²19sL„s+ñdWUvìK×ë†'Ä8i~ÖdE>ÕãK¼yhMö]©Åtá0­Í…v¼Od¾¿Rœ Sšz%7üD¸ù.[ #庉ކ⌸ ¯{–F'åpl!œè¬ÌŠyájc¤*¾w˺áú¼_3ù%ªo ºê'Êòo „žÙ˜u•½Êa_³ëþÖûêïì*½¶%]w~¤½úSJä ÷ÛzªÒl›×}o¯È„<5InzÂoMï\®hÊ—ûhíè‰4ão!»ÏP¾s` P• ÑhsŽcá5ÆüKàY=^¸N½óy\E•ÁÉ\öÊ?Fž±šÉD[qRð£ëú û™CÍø§ÒïHä;J¯ýxcÿÈkmš¢Û=>Ǧߜ"ˆ×&y§E{jáµRZÌ+/Gë gÄ€«ò"ptgD=<õüLdSåi¯ÛW9¸“b*þ¦IÙ“ÓÛš´˜ýNn*vÐ¥)²åiñ~~lâ•âdü÷2Ï“Yã0[6Ì5•¤¿õwµ9RšyãLOåÇHï»f§¤¸hö}qQ¡o{}qßxâu¡©$K¾á7ú U®‡§¢t6çYïªulw?ØûD¼×KÌÖ\WEZc+éÌ@Ãç‘þlÎkÈð³ÏõÕäÄø;_9w„Ÿ‘h¬>ç­ö®±ä[2¤%ªÔU^*”Ð ÃŒ½ÁSf&J{SöÖrû½õÎüMöƒ'höÕ¥F€¿³iÈ À®,ñ®ÖúJÂläSíÅ /€ç­Ç§™:Cr$ö2Ïp¤ñŽ&ïãÄ­ö´=92÷V‹"ܱ؆£ò— Õú‰žÚ‚”7¾·ÕÏáð÷@Ûójâœ4‹}•é¯=®ëRÖ›òMt#-~¨D^òàÈú6üƒ!šTv|Ý>òóQZäf E×ÙÙü½³:?)ÜÇåúy 9Avêµ£ÍÅ)a^·/ž–æÝF8Öë{×Tõ`ÿ{;Yò*?màjs‘kè-p½Ò¤«p‘šŽ5b¨¸'4ð\i1VwSæ%&èJšæí Þ# ²Ó¬ûÖZšáí`qî¨ ËÆ©Ž’¤ WK-9ž-¹î§Yúb­ÅÖäÝ?¶¡ä¡ø¨4—t‰³Íï8aº{½›ø·uÂ$ã--ÙïBŸ9[Ÿ:r`'-Áx{ÅÇ(¿û–zJ¢Ô‹ýÕ™OìÏŸÙAö=ÀD`>ï¡:}Kˆ1ç`´9÷Päyöö›ŠD¾½¦¤-o§÷±¹hmJðRêde¬!'´ ~úIpm%küÿÂÙâŒ4íbOÙMÙMõÁ&|ÓÀ–®›ÊÝI ͼ3co~¦°.Å 8¿‰ Õ …¦3èѧ‡êÜw¯ÜmM4dö1‘Mv”¥†ºß0P:ÀBú½!'òÔŽá¤ÛG7}}¡Ï1cÁ?þþßhŒéÎŽ§–Ã,º%ÐûByÃ5àôzS½µù Áo›kd£œï«Îzëã`¦!¹‡f¡§<9ÐyÿšâgÚ»F“ì¥IJ<Õh¿úž¦«}¦JQì|x>Ébw›p§q³åÉÑyCÐÛJ2Ý÷µ )ì©ÃEÑÝ´ëF󃫕®ü~f’oyQOí ¨[",Uøh±Ä\šI·_̰?8t…§/T›®âÔLüæ7©IY¡ÝÀ|é¯/Jyããd©¯"Áµx¢½ôÃk/{uñÝÔó=å)A®œ‘KwQc곑 *õÒ`h 2`ï3bïx¥µ­ÆK‰8ÛV`(L‹¶äžè·]ËóÏÏåº10Ÿ·oœí­ÎŽös²æñ·†¼hïÛç•…˜+^˜ì_,ð:ËÚguðgÞ}ù¥”)J#ν#6õΜ£ÍOuCžÀ éì`cIzÔ ·›&§²Qÿj(xÿêÑ £wQÍõ”§†¸YjÉrÓÌÅÚ¥i°#(}z–¥;âpΞN¾.8™«7D‡¾Úýèº4Kîž¡¦Ò àêlo¦)Üy|o-ýþôŽÙi™} Dßóc ù¶á{ƒ§ÖžÉì‡,}q7$‹=Onm ÐÝÑbÈÖñJ›±î™*y¡£ÄÌ{ó]mÀå/ÐóÎeㇸH§º«²¢Ÿ»Xê* ³SÎöT|u¿®{ŒoÛºþ/)W$6Ö…\]_òL›}ðÝu±µy.òäe*›*<Ž“¾/»&ã†àX”1kc|—ÃU}©}ÛÁ{»O Aî¶À½7=ÁhC~œÿ=s ÉÝT3í…±>ª,#i÷U™zãoJ“Uúé숹"8ýÁN|1ó–øbÚMáï.sõ…ê2Ô>u´4T—`£^3ÚRò!¸÷ô»æÿLć\¥ˆ¹Z‰üó"rÕ"Î Å~"zru">y¯RÄ#ïÕŠ¸ILâ&‘D Њ˜‚Ä ¢ ²™Ä)â"CÄB‚bïoˆX6å‘Éß±æý{"¶¼WÄ>âZ|É^LA¢ˆø’ÿªˆ'¹?rU"^dï ‰$ I\"†ÃQă\­ˆ›üg"‰QìÇ.â${1îL"®¼CÄL"‹}øŠØÉß±’½¨iã!"ðâúUˆkð _ˆHb1“ð"Ú ‰x’½¸Ò†±¿+âEâáE|ÈUŠxìðÕŠ˜ID‘Ä*â$щýXE\äoˆ8Èß±“=$ž"¹ q³ˆDÑíì%ñ'¾$þ"¾dOÞ"~䊈y×üIxž\•ˆÙƒeC¢Š˜Ixó†D#âA®VÄMö ÝXDœäêE\dRÚ¨;EÄA"‹¨A¢ŠØÉ<ÓF1’Ë"š´QÅE|IüE|ÉUˆx’p"<‰VÄìA$z/ƒØ^ÄLþ¶ˆÙÄO@#â$»QH\".UDÙ5È"òwDìd7<‰¯ˆ•ìÆº!‰C ø’ø‹ø’ÝK$ú ‰ "’&<ÙuC"Šø‘xˆƒ+"–Ì1‰½HⲈÙfC¢Ý5 ø’ÝhÒÆ*â$щhwÍÂ¯ìÆ˜6f;Ù1m,"ÆÌW%ÎãKv#¥YD$1e¾fMö /âI‰è‚Dç1gGvá‘ö/² 9mì"dÚ´1‹˜M$]D\avaNñðù%â ±ˆý˜DD™ìBOâ±mL¼Å9|I bª8‡Å„'»PIô;{_rU"^&uCþñ ;Iœ"’‰†ìD$Ê®A1‡¹$þ"ñ1‡‰,¢¦IÄšy'ŒDM«ˆ-ÌNLi#ïšÙY<ÉNti£Û³³ØL8²9HLr;9YÄ´!ggq˜ðb'Ú´Ñ‹H&²mÚØD\av ‰œ6ZG˜8ƒD#bQƒD“6²ˆ-L4bZqfO³F¢KYD61ØÓFñ ³.ÈåC³ˆÕD‘ƒDÙÙ33hMÔ0;ƒDÝH"6Ûщ˜6ŠˆÝlÇ$ò†œA˜Év„ QÓ^§±‘ðfû/5í_§ñ4Ñ‹=hEì&œˆL¢lÈ_">&±yC‹¸Í6$·ˆÕD#v!oH4"²‰fæ wÍ4âÀlÂÄv” QÒžF˜Ì6tA¢K{j O³í‰!íO³ 1H„´QD4(*ÙŠ3HD·ÙŠO".³}(iËØÍÖMETˆ>HŒ"F³…DI¶k&'ñ4[ZÑåœ6$NâF!q™Ä$‚ˆE6[0‰IÄi¶ “pA"lÈIø miÏ{%H„ ‰*b3›—HÌA¢Ñ Ëbs êÎA¡ ù•DA‰ˆy#웥´¸Í)PD—÷¯ D¼Ðf.HÄ ¹"¢EĦ%)oø´a»æüÀ†6¡#áƒ\Þ5?F´ žD òWÚÈ":tYlBÝ”KAÂ¥ND6¢!ƒ\'&&ðCáHtA‹ø¡èÈ¥ áöͲˆÚ#á÷ú 'à6´™ü•7“ ‰p$BÞðA¢1¡ èHÔ Ñ‹hÕ äÊÎYN{|“‰„Ö£!Wò^ rIj}}=:r9ï_r|eà@ëad¹’7|Úp"µ-ù+ïå´‘D,l ¹’÷RKi£Ñ«uu‰™„¥QDU¿.‘õhÉå ´¿Çb«_Ñ“HAB"4p³_¿®˜èHX`ÚßáVµ+ ¹”6‚ˆ•­…ȯ+™Cäò1å½”6ŠˆÉ­­­E F.ç½”6•­©…3áI¸¼¡ ±‰lMM 6r%Ⱦoß¾á2Á‰¨æ ¹$ö·åˬ®†7Ñ’° ¿! ,"Ìü&<¹œ7#\UdBa"P˜DT¸ª FÂòîîÁ..%ÑD"ƒ¯ŽÊʪÞ\&[Z`yw—ŽJp šÈä’øk`¿T¢˜paB$,È1LE"Šæ/£7VDÑw9Dâ%B£p(¼ O¶wà‚VFl C!Ì ÛÚqA+£¼¼¼^]F—M0Lˆ…¸Äò_ê oBdë(ޱ"–••¯ DBL q‰+£li ª 30›pA+£´ nÀ³¿PÈlÀ­ŒÒåì.©Ëf.he”" DwIQ\ÐÊ(ù5ÐÉ0DGð%è" ²¸ •QŒ:Ðÿ\ÐÊ@#"ϰ ZŸ±"Ø(,,,(À­ tÂò(,„¬‚OŸòóó0ÃÈ£u.‚H¹Üœl”ÿ‰i 8+ˆZ~èeeâ‚VF!Â((ø…Á´¼\Èû˜ ZÈ µ%.'ÓÓpA+£n|ú¥Á¸e/#=-4´<1˜rPxe±3pã§ÁÂ= @ü + AÚ ·â‚ Ìa\ÐÊ@Ò~q0 ¥¥pA+…[ñ —ÁÃøˆƒÐXÑV¸_<(‰›Zð‚e lÂr ()S‚q(…(¢•VÄ\„ð@JÇ)-„ð–<(À_ LÄA|“¼Ä!z°aàRˆ‡ð°`ŃSeÁœq‰ˆc‰ƒ¼•áAXˆèÅtÑ[„BàT\Ê^Äb£¿¿ÑCÁœÁA»iàÈB Ú„ðàRˆñÁVDäAP¶a!bû‘ÌC ‡ˆ^DÆ ï¡‚+!¢Šhµþþ¾¾%o)@"4¼ˆ¹>PD „BDQLÇG䌗@¸¡¤EñÒ–Ä øŒ!>Ä¥¤Eñã …ˆADÖÀ‘DHUD§õõöö.yˆ bˆhDLZ/$¦¯ìd)iQü8PD "‡xPT‹Çüµ“Á¤!r0qD—órÒ"øq½==‡¢„ˆADázÁÏOVÀT4 6=? €PÎ+!B;ADÕ–9HD ¢„(‚ƒóDEÄÅãˆ)Ä_"\Ow7&>DHÄëE9Ä¥¤ÑŠh=@ü¢q)id™[öº»1‚H¢0~(ƒHâ!¸Í(Œ™C𺻱€¿B„qy]]²ˆ{%D× ~n„¸‘Bü•4 ¢rèñö‰]¿ŠNñ–úñŒçÜTÛÒùÜZxEþ ¥ uAúì=Ñfö°Ò9ȳ‘à3Vàfj";Æ‹ž!ûns€²!ÂJœ´*è$ïÏOe†–s~,Nªjÿ[»¢täD¹HG;+³cy¢ŽÙ·cÁ—Úœ~ÎgÕ%vPÿl/Nxxí´"n Uk‚‹*ÛpÎ=½]>ú;Çrncé}å ½¦*Ð;Ïý$eÞ[ÚÂ÷ó²PNõ×%?ó¾zNë°Ëš±Žò´gwì„X)†ób|/ÝC?=^h&¶¶ Õ9Cw¢³²8@Û“rC›ûWiàa’OÏ‹‘Õ„š £Úä˾©ÆˆÊIœ¤Ü/=:ÀcfFlAC¬âM”¯³™¦êÚìç÷/›(à˜ˆ>¦?ñ0w?¾‹ 2ìâa†ÞTOÍ£y><“…¾»~æzgÿšrMŽ®%ÒJdUÉý'wPËql l,|êeo¢,¶cýªðgXOómZÙ÷!¤Š¥4ý—Ì»F«k#loì~í¢Ì<~]e ÅUqs6ˆ?…žÛ»¢ðÞõ‹&ªx™Öüì©ÎŽ ¼n­w·uÍ8êéÖ¨Âé¦{Þ'¹œQÆéðÕF_VbÉ}p·ºæ™Ôº–{ÚöØK×5FZ‹“U™î™Ìó:§sTxÑ·–Ò´Ÿ«fšÒ¼›I¾7¼ t³ÐÜϵ~²£äÕCgS…½›o|çwFŒªí•«:ÇhþUBÌ÷‘Õ>µØGZ|V•’Ñ.T÷ªö0Sþê«ÍK¾u養8-a?j™WϨ‰qP·Æû9”çßDÀOÒïªÁ5UñÄZš®;ùºÇ\4„Kg–šÄ¿ ¼õ8G²nˆìØH<Ò^ñ湿›•žœ ÕdweF„·ãI´d(FšPË8b-³¢‹i¸0eÿìYFÚÉÐN¾®Îþ=ÛK›ç ÎÑœÛZÛ†2®³PM÷×&…Ý»rVó #Ù¶ÒäÐÛ¶G÷2“~«Ë‰öv0<»qª³˜¢õõ =>’ú˜«*죅gD(¢íez’\UX¾¦{cz㡾u Õd´«2;îÑ [ÔƒWa=„zððž¿{P_f7ÝTGQÜXY¨­<Ë"T—zRoèìšzÿØ\œ²é…½ÌF´x·ô%»(3ö%¹|m*Iôu±Ô=*´mÝt_MvŒ¿‹ùq©] ûª3žy]Ô=´‹öW{QœogÚ]QªÎ”[z|ĵю ÌCÙ÷ ùVU†ZJP6=·—¡ëLp’g@­„íé;hOäc¢ï¬Èˆôq:£&Á‰U$jjiîõ“íh)8TF^Q圪ŠtTdÅzœ¦#ÑMcûx¡ÿ)ÜêaÖû©›cìeé:^^Éxpý¢‘²87ñ÷æ’ä٦栞è(KñD[f'¶eb} ³˜ Èñ;+±¡'í¶>?qm䥣[¾fzéòL½d&J^yá Mk¬c˜·³ù ”1Züuy o\0@kkÍh[qâc´¨%9×ýl-ˆõu0”‰qÕÚCÒ˜p]‡—øÓ 'UŽñâGh¡@Õ·ýÈ÷5ÙKTýÔr?:Ö›ö¦Ç¤ùXÖNôT½}àf©#ÃÏ„¦*qWócÛ©Ç[ °ewZɲŒ–†ÚÉm-~lu¡?óžÑ^’ºhG9Æ,Ðé÷ωQÔG_²6PB“Œ´•§GÞÇzf÷&â!l^;‹JœrlFh$ËKçi DÕám*FÓ“q×XhMK‚›æÎ_å¨Þ7 z×Üñ³(ÀT˜ôS„­¶,ÊM‰¢¤Ð;¦ª;é°žq:ëZt„XEÚ)m_QóÜå8Q]Œ‹ÆÎUöò,ßóüΈ®iŽ¿ªÂ6œëkŒ#þøì‚Ô–µ“½µ¹/ß°5RÝN3Ý[åsù”’Ûš¹=sJbã`þ#ë#,?JB.a.´¢ûœáeÀOTe/Çø5ë®>ßÊʧÖ;Ht|È|àn¥w5áDÚÔ÷L„¶’7æÎì->†Ý¥»IZ’o‹Òôdú˜Š­ŸIKëWy¨õ¡½i·tv¯¨xb¹~åPsijÄ}gs­ÃüÌcíe)a^vFr8²ï ¹/PŽ!º÷b+¸rlתºx7í=«âÝŽó~ŒrTbýQxN’¦3ÉãøÎ_eÁçõ}ÊO|rÇñô±»7“ ·¿¹uQÿè^&Òoõï^ ).'°yeoyÒ#UÏ[‹ÃÌ£¥O/)n›¨xf¯À>^b-³y çþI‘5-/]Õwü, 2ïªÊŽ ú»«‡ ^=ö´Ñ•ág$ªËy~ßÑD~ï¢/R»q¬øôÒS_xÝçLTê ƒ¹-¤7}E/¹¾;ÝK_!ÊÛP7+ˈös³Ö—Ù>s¹G—[lL ~úKÈHÜ_•rýÝ`a¨½ÊÎUõ/=õpk;RPw¥Þ1¢hM¼®µ{åÇHGÖá‚€³Ia>WÑ&ıQÿêýˆÆ„«…ÖÁÝ D_k³£}Ç„nR¡žç‘´¥ù˜I3Ž–…9ªr~ŠuÕâE‡é®Í‹ªÉYóWE˜Ý¦o¨š‚o;žFc‚yÍÏ®ÊÌèÎç4¤xèWԾń 8f’ÁšLt5;.1^ùÜMGõù­ÿy¦Ñ²§öJShz¨ì˜ªŒpPÄŽÔæðæ¯ï|O£ë·Š$výnŸæÎ1Iî„_jÞFaBAfÒ¡OY^6Úvô¾{d«Ä¹²áÕ-ã}ëûrÎb. ¾pt¦>eQ}>:/EߟísÊJ_a×F"lî„ÝuDM3s]ΊòÆ„,dßê²#ïÚêJ朗Oô:}`ó÷W5yI[’½LÄÖ÷eû“šùHR›¾¾ó7“¤ëÍô>‰v5ê¯ …‰On_:‰íj¬i"‘PQh+Ù÷úœçÞö2<´“%áWµ÷R~Î~h#·í×Ç®:üäí)^&¢4Ÿ3íͺz¦îMò³RMõý¯ 9h¦>W½‰ðvÀ„XÓ¼¸ÚëÂ7þVò;^{™J2|+FŸ‹°.Þ]W€¢-ÙËH˜ª xêδ;Æ»)f—¿‡¼0;õd÷‡Œˆ{Ø{‹[…±®œ”Ÿ©ñ¸Æ’›FÊ£®éì¥ìÎBŸ‡e¼ë!¢ú—ºü­I· ×¶§Þ6d ÁÚÛ­ºGpl”]éá³Bô€+ˆó¿jª$È„•ä“Ëü”=9A¶J\«_{Dƒ£0ø¢Â¶©êç×4yV7&xè P´&ß2Xõ­µ,=Ò÷š…ŽŒËÚñÎò´pô"Tf[;ÚRø2ຜm%Bäcq„ƒ°!éÞÙƒLãž»žÀ¡Hý,£Bzæ¨ÊIX‹º´ùõ ý¯ÅÉ37úC|ÌäcíïSð'¦ûÚ±Ö¢„@W3u1ö5èúyÇÝPŒa¤<ÚMOdÃׂ'öªÜÄÍÉwL%7Û*°ÿªŠvÆ"}婇æDèËèÍÊ»m4xÐêBBÊñ¶’Ä w ‰íTcÍy/|.Ù©ó®ýüî±½Ún²Ž7~–Gئ>Æ]G}Þ›`‰Î´<üŠ:7Q}‚‡î»—Á·ìO©¡7&ÉHKiòS¯K&J"ì3ÜÇçc/®ö¢x¿+ÆgeØ “}ÌeÙ§ë^Ý>µóHYÄÕã|äé¨97”ç†8jòSõåÛ«Ïæ~”}ª&ÎÃ@dý—w6rìSÕ1®Ú.–úò¢;hW6$†ÜšNv•§>½}QÝpWõW§?EƒBrûAÖ©¾–òœÄ­é,å¶£b¿{Fšq¬"ÊUhO–¿¥ìÖ‰Êç.Úhý£wÿ@}Á«à›vF3ÂîŠtte6<Š…ƒµY3ÿh„é†?ÄÜ8)Å4Y“pÛTŠégU¬‡‘ØÆ¡’°+¼è4}Í3WD;kiÉàØÖ¡GºOÜ´5Ráøû•i, ŠúwÏ}Ð}½¹v‘÷ä…:i møVé¢'B÷­$ÜYGÝ—÷ØN…›¸%åÞYé-£ï#¯?È¿u¦¯ãƒn\4œV¾™½‘²RÌüöp:¥€c$ú²uEcšŸ2yÏ»`ûc|k{sÑiò’wfX+ #Hô2Ý¿ }~'Í=Ìk'>DuÏ †Ø; ´®¯˜ªˆn£œ)r—³ª¢Ø“†v¸"îÖéCìM©,8‰Û2ü¬8‰šSï›Ë²MÕ¾¼i"Aÿ½äÙM4(ºgzX s¬›ê­ÎŠöE>ñíë&:Ë’Ðu 9åhS.Ùçü0g½}›F«âoŸ>¸uªîõ]³ÃlÓuhlJ£Cñ0ÜG7TvYƒl¬«òmÌÃëÖò"h”õV¿EϳÇ$¹Ð ²"{ÎÜ ‹ã§ÓlÕø¨Š#\õÅ~|ˆñ4ÙÏ8^ë‰fÒ ¬=×>u<ö££»PXëÉ sÐL÷}Ì~áwíœÆn:‚Þ*tǵ՗ÙÀ½Úƒ¾ˆó2;²cuGöc uÅá×tEè¾—E¹ê‹Ò}+pÖ\7êp¬­üM´¿›µžœ0zÎ^š-ŽK£åÕv·ƒ1Z¯Ø6 »Ñ“ÿÌÕP’éW}Н•"7YwN°£¦ua˜“¶ Í@ÑS'­½T_òBìÕËÒ£¸¢wÇì-<'ö¡ëyíC¼h_×½C4SeVòáúœ¨{vé/iâ6 ˆ»uæ0;asºÿ $Fž²//ÄQ}Tj©f¯õ4Ó_jßa·Ð[‘ô{c~\À53uqª±ÖBìÏÙ‡—w-¸)ú Ã] $¶LÔ&Þ3?ºƒ¸íÍC$&ïÎ º¤ÎKÑ“óø’ZøýkXÛ ‘0>pæo3ù–¢WÜÑèÙ¹áWWÙë W3Õ‚p7i6ÂÖÌ ‡ã‚¾WÄÜ0EÙ‚“ku{æÃ‹*Î:GÙ1!ªrý£è¥96ûÒ<&a_eZè +­ý´EÆk“î[+ï^ûe6ÔŸ5¯îšÉr¬lI÷³Vâ&éÌzd«ŠÞ²3BôXB÷zy!6ʟؤ°58Â5öÛÙgR‚·¥òêÁ÷1·ÎÈn'îȾ¬-L7ò!ö& uº!å> •¸=3ð¢ê9-YÜŒ0Û¯3mƒ­C´lŒ±KéHãÌ:D}áqJf;Iw^˜«á~f¬8/ªóS-‰t7ÚÏ4ñé5vªDèT/ªÌNŠ/u3“ÂXiöÚœ}õá¾mTãmů¹š©íc§º¢+Î4Ýô%/L?ú1Ñû¼â.òÞü°k¨Æª¼ÎÊ ä3.¨Æ~ö×åcaìùOKð¥&U¹ÙLÛt—§bƒ†XGUÐ¥ ~PAäÎ PB™ŸR T!Y—KV X$™ºº Jï«ð"†XDv&¦ X+ „!)_l3Ý- X&`32`00Ï:&X;•¨¬;Ä:En<L6Sý=`X]ÜÜ@nX6ãƒKCº X(ÚͧD&`C|ÜGDXMrzOÞXE€V‡TShîaFRHPÿÿÿÿÿÿÿÿ° a,(‚²WBTHDd(³,Ѧ ³BTHD  d(³.R ú×GCOLThis is a data product from the NASA Global-scale Observations of the Limb and Disk (GOLD) mission, an Heliophysics Explorer mission of opportunity launched in December 2017. Responsibility of the mission science falls to the Principal Investigator, Dr. Richard Eastes at University of Colorado. Validation of the L1B data products falls to the instrument lead investigators/scientists. * Dr. Bill McClintock Validation of the L2 data products falls to Computational Physics, Inc. * Dr. Jerry Lumpe Overall validation of the products is overseen by the Project Scientist Dr. Alan Burns. Users of these data should contact and acknowledge the Principal Investigator Dr. Richard Eastes and the party directly responsible for the data product and the NASA Explorers Project Office.NASA Contract > NNG12PQ28C"SPDF ISTP/IACF Modified for NetCDFL1CBAPIDx0F > GOLD Application ID 0x0F: Level 1C Day Disk Science DataDAY_DISKHI_RESS 2019-02-16T09:11:28.000Z 2019-01-01T08:03:53.118Z 2019-01-01T07:52:25.120Z -GOLD L1C spectral radiance image in Rayleighs 3CHA > GOLD L1C spectral radiance image in Rayleighs#Space Physics > Ionospheric Science.GOLD_L1C_CHA_DAY_2019_001_07_52_v01_r01_c01.nc2019-02-16T09:11:28.000ZGOLD SDC > GOLD L1C ProcessorHVersion 1.1.1, Created by GOLD L1C Processor on 2019-02-16T09:11:28.000Zhttp://gold.cs.ucf.eduCHAUV Imaging Spectrograph (Space)2All GOLD information and data can be found at the  GOLD Website+GOLD_L1C_CHA_DAY_2019_001_07_52_v01_r01_c01#GOLD_L1C_CHA_DAY_2019_001_07_52_v017GOLD Channel-A L1C spectral radiance image in Rayleighs,Thermospheric and Ionospheric InvestigationsUniversity of Colorado/LASPRichard Eastes NASA > GOLDPublic Data for Scientific Use VGOLD SDC > heads/release/GOLD-563-sdc-release-10-0-gffa2ac9 2019-02-15 22:37:11 -0500!iGOLD > Global-scale Observations of the Limb and Disk (GOLD) Heliophysics Explorer mission of opportunity"SES > GOLD - 518#CThe GOLD mission of opportunity flies an ultraviolet (UV) imaging spectrograph on a geostationary satellite to measure densities and temperatures in Earth's thermosphere and ionosphere and to understand the global-scale response to forcing in the integrate Sun-Earth system. Visit 'http://gold.cs.ucf.edu' for more details.$8Fixed with integration time at each Scan Mirror Position%2GOLD Level 1C spectral radiance image in Rayleighs&Background Counts'n_ns(n_ew) n_wavelength*Gridded+Background_Counts,F10.1-Background Counts.Background Counts/counts0Data1Corrected_Count2n_ns3n_ew4 n_wavelength5Gridded6Corrected_Count7F10.18Corrected_Count9Corrected_Count:counts;Data<Corrected_Count_Random_Unc=n_ns>n_ew? n_wavelength@GriddedACorrected_Count_Random_UncBF10.1CCorrected_Count_Random_UncDCorrected_Count_Random_UncEcountsFDataG Raw_CountBTLF _uwìXDXœXôXLX¤`BF< ‚B B XB šB Ä:Ü::PB’BÔBJ`X¸L`dTLbL¸D®PþLJ X¢ Xú X R T!¦ X"þ X#%PBTIN‚B ·*bWÆX7Í<´ "mBTLFXB hš´uw@soµX8ss}¸®P2(Þ8ºJ X>VϾ¢ X’}Àþ X,; ÁVX-AÉÃB ÀO¸È® L%¶ã„Êf€Iég\Ën L' uvÓþL%AœÔ D)åúHÖÆX4Kç÷Ùú X ,ÝÚ~X<üUÝìX½Þ.P@3>†ânX3R6¯ãX1ºû¿æB!éþ X#bBñóþX/›Å“úÛd£øBTIN V X$$ %¯Ö¨ BTLF ® L% X&n L'º X( D)V P*¦ X+þ X,VX-®P.þX/VX0X1®P2nX3ÆX4P5nX6ÆX7X8vX9ÎX:&X;~X<h=~X>ÖX?.P@~PAÎXB&`C†XDÞXE6PF†XGPHf€Iîå½BTLFÜ:`ñWvX9 +^YÖX?O ƒ\6PF“(^PH·0”_šB 9ìugLXÀrlÔBÃÞp®P"IÆqV P*fbz¦ X"ããszh=*Õ¤~dTÚ’¤†F< º—:Œ¸DÙŒA®P.=ý±’ÎXBmG½“ôXä/h¡¸LÌùÜ¢:¹•ô¤ÎX:Ž ¥VX0kéT¨¤` /`¨bLVJHªP5ìñ ¯’BádB±œXÛ«Ú³JIWOHDR ! ^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0CLASSDIMENSION_SCALE `NAME@This is a netCDF dimension but not a netCDF variable. 1ì8Û®OHDR ! "^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0CLASSDIMENSION_SCALE `NAME@This is a netCDF dimension but not a netCDF variable. 1ãÍw&OHDR   !  v n ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0CLASSDIMENSION_SCALE `NAME@This is a netCDF dimension but not a netCDF variable. 800 Ò aOHDR ! fÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0CLASSDIMENSION_SCALE `NAME@This is a netCDF dimension but not a netCDF variable. 246ìi0OHDR µ8     ð|ð| deflate žÄÎçn”FSHDÜPx(ä!%%5_XBTLFbP•ÜÌ X8å¨*L Î2™:jP "?FºX¢ôµGþXlÔrqLp¹±ˆ XÙ&°˜ºXu1X fÔZ¬²X6'¢¶bXt”ÌjPƒ ÅÎúpc“‘ébL lªdï®Lc$ó®P S÷VX¡µü¢txnBTLF LbP²X XbXºXXjPºXX jP L bL ®P þXVX®Lúp¿Ù™OHDR µ8     ð|ð| deflateN*t45,5Î~ˆIêFRHPÿÿÿÿÿÿÿÿ° R5(LùtñËBTHDd(¤56‡Ë×BTHD  d(¤7MÅÔFSHDÜPx(Ê%%æ÷qÉBTLFbP•ÜÌ X8å¨*L Î2™:jP "?FºX¢ôµGþXlÔrqLp¹±ˆ XÙ&°˜ºXu1X fÔZ¬²X6'¢¶bXt”ÌjPƒ ÅÎúpc“‘ébL lªdï®Lc$ó®P S÷VX¡µü¢txnBTLF LbP²X XbXºXXjPºXX jP L bL ®P þXVX®Lúp¿Ù™OHDR µ8     ð|ð| deflateŽ6e=÷=>Î…E#FRHPÿÿÿÿÿÿÿÿ° C>(ñØÿ BTHDd(•>mÕzBTHD  d(•@À×Î FSHDÜPx(ï%%n§ˆBTLFbP•ÜÌ X8å¨*L Î2™:jP "?FºX¢ôµGþXlÔrqLp¹±ˆ XÙ&°˜ºXu1X fÔZ¬²X6'¢¶bXt”ÌjPƒ ÅÎúpc“‘ébL lªdï®Lc$ó®P S÷VX¡µü¢txnBTLF LbP²X XbXºXXjPºXX jP L bL ®P þXVX®Lúp¿Ù™OHDR ‰8   ð|ð| deflateÎBxV W0W  ¢²¯ª GCOLCorrected_Count_Systematic_Uncn_nsn_ew n_wavelengthGriddedCorrected_Count_Systematic_UncF10.1Corrected_Count_Systematic_Unc Corrected_Count_Systematic_Unc counts Data YThe planar angle between the pixel ray from center and the normal to the reference point. n_ewn_nsGridded?Planar angle between ray and the normal to the reference point.F8.5=Planar Angle between Ray and Reference Point Normal (Degrees)YThe planar angle between the pixel ray from center and the normal to the reference point.Degrees Support_Data)East-West grid location (center of pixel)n_ewGriddedGrid_EWF10.6EW AngleEast-West AngleDegrees Support_Data(Latitude grid location (center of pixel) n_ns!n_ew"Gridded#Grid_LAT$F10.6%Latitude&Gridded Latitude'Degrees( Support_Data))Longitude grid Location (center of pixel)*n_ns+n_ew,Gridded-Grid_LON.F10.6/ Longitude0Gridded Longitude1Degrees2 Support_Data3+North-South grid Location (center of pixel)4n_ns5Gridded6Grid_NS7F10.68NS Angle9North-South Angle:Degrees; Support_Data<L1B pixels per L1C pixel=n_ns>n_ew?Gridded@L1b_Pixels_Per_GridAI10BL1B pixels per L1C pixelC<The number of L1B pixels that fall into each L1C super-pixelD L1B pixelsE Support_DataFL1B time bins per L1C pixelGn_nsHn_ewIGriddedJL1b_Time_Bins_Per_GridKI10LL1B time bins per L1C pixelMRThe number of L1B time bins (mirror positions) that fall into each L1C super-pixelN time binsO Support_DataP Quality_FlagQn_nsRn_ewSGriddedT Quality_FlagUI10V Quality_FlagW Quality_FlagXsamplesY Support_DataZRadiance[n_ns\n_ew] n_wavelength^Gridded_Radiance`F10.1aRadiancebRadiancec Rayleighs/nmdDataeRadiance Random Uncertaintyfn_nsgn_ewh n_wavelengthiGriddedjRadiance_Random_UnckF10.1lRadiance_Random_UncmRadiance_Random_Uncn Rayleighs/nmoDatapRadiance Systematic Uncertaintyqn_nsrn_ews n_wavelengthtGriddeduRadiance_Systematic_UncvF10.1wRadiance_Systematic_UncxRadiance_Systematic_Uncy Rayleighs/nmzDataOHDR (   ð|ð| deflateO„bcÜjaFSHDÜPx(@%%¶AÌõBTLFbP•ÜÌ X8å¨*L Î2™:jP "?FºX¢ôµGþXlÔrqLp¹±ˆ XÙ&°˜ºXu1X fÔZ¬²X6'¢¶bXt”ÌjPƒ ÅÎúpc“‘ébL lªdï®Lc$ó®P S÷VX¡µü¢txnBTLF LbP²X XbXºXXjPºXX jP L bL ®P þXVX®Lúp¿Ù™BTLFt. ©šm ì"ç‡- §!›TÈ)ÁÊ÷€Ï_² †$Âß#Å'ÔEp'\& œ(â˜O.›‡þm=('pR?)MßDKMwõZ*!Jmð[ù10Û´vÿ¾ì|Ì-¸í‡ÛÜO޵&<9™‚%öÄ¥6&$µÜ¨*éýèȪ"¹UBÒY&ªü£Üb$¯÷Ü>@ªZÞC±BwðeQÂÅóÈ´vÔ÷,¼_ <BTLF,Cb$†$ª"Ì-ù1*! K e € › µ&)Û>Y&*©Å'ì"(6&\&‚%§!Èâ:ÙuôOHDR {   ð|ð| deflateçh/bUbFY¼$‰ÜBTHDd(ËihÛ+éBTHD  d(Ëk; ÇFRHPÿÿÿÿÿÿÿÿ bc(uÞ–:&ÝBTHDd(´cVŒbqBTHD  d(´eÑbAFSHDDPx(e%%M«BTLFbP•ÜÌ ºX8å¨*bL Î2™:P "?FbX¢ôµGfX lÔrqLp¹±ˆ XÙ&°˜bXu1ºXfÔZ¬²X6'¢¶Pƒ ÅÎb`c“‘é®L lªdïLc$óP S÷¾X¡µüé°‰_BTLF LbP²X XbXºXPbXºXP bL ®L P fX ¾XLb`yµ{©m¡ ªZg3BTHDd(…ª~sE¦FRHPÿÿÿÿÿÿÿÿ° M¢(’0v9–BTHD  d(Ÿ¤1"zöFSHDÜPx(²%%ŸÙ¥†BTLFbP•ÜÌ X8å¨*L Î2™:jP "?FºX¢ôµGþXlÔrqLp¹±ˆ XÙ&°˜ºXu1X fÔZ¬²X6'¢¶bXt”ÌjPƒ ÅÎúpc“‘ébL lªdï®Lc$ó®P S÷VX¡µü¢txnBTLF LbP²X XbXºXXjPºXX jP L bL ®P þXVX®Lúp¿Ù™OHDR £8   ð|ð| deflate~Á¹¿N©KÀ  ¼ðQä–BTHDd(ÃÀŠÂdãFRHPÿÿÿÿÿÿÿÿ° 3ª(YŠ¥J¹¢BTHD  d(…¬k.gFSHDÜPx(×%%›€ÀXBTLFbP•ÜÌ X8å¨*L Î2™:jP "?FºX¢ôµGþXlÔrqLp¹±ˆ XÙ&°˜ºXu1X fÔZ¬²X6'¢¶bXt”ÌjPƒ ÅÎúpc“‘ébL lªdï®Lc$ó®P S÷VX¡µü¢txnBTLF LbP²X XbXºXXjPºXX jP L bL ®P þXVX®Lúp¿Ù™GCOLn_nsn_ew n_wavelengthGridded Raw_CountF10.1 Raw_Count Raw_Count counts Data Raw Count Random Uncertainty n_ns n_ew n_wavelengthGriddedRaw_Count_Random_UncF10.1Raw_Count_Random_UncRaw_Count_Random_UnccountsDataLThe planar angle between the pixel ray from center and the spacecraft nadir.n_ewn_nsGridded.Planar angle between ray and spacecraft nadir.F8.57Planar Angle between Ray and Spacecraft Nadir (Degrees)HThe planar angle between the pixel ray from center and Spacecraft Nadir.Degrees Support_Data IThe planar angle between the pixel ray from center and the sun direction.!n_ew"n_ns#Gridded$+Planar angle between ray and sun direction.%F8.5&4Planar Angle between Ray and Sun direction (Degrees)'IThe planar angle between the pixel ray from center and the sun direction.(Degrees) Support_Data*MThis is the reference point Latitude of the ray from pixel center in degrees.+n_ew,n_ns-Gridded.CPixel Center reference point Latitude relative to fixed Earth frame/F8.50/Pixel Center reference point Latitude (Degrees)1OPixel Center reference point Latitude in degrees relative to fixed earth frame.2Degrees3 Support_Data4NThis is the reference point Longitude of the ray from pixel center in degrees.5n_ew6n_ns7Gridded8DPixel Center reference point Longitude relative to fixed Earth frame9F8.5:0Pixel Center reference point Longitude (Degrees);PPixel Center reference point Longitude in degrees relative to fixed earth frame.<Degrees= Support_Data>hThe planar angle between the sun direction to the reference point and the normal to the reference point.?n_ew@n_nsAGriddedBCPlanar angle between the sun and the normal at the reference point.CF8.5DZPlanar Angle the sun direction to the reference point and Reference Point Normal (Degrees)EhThe planar angle between the sun direction to the reference point and the normal to the reference point.FDegreesG Support_DataHBThe tangent height of the pixel center ray from the Earth's crust.In_ewJn_nsKGriddedLAThe tangent height of the pixel center ray from the Earth's crustMF8.5N&Tangent Height from Earth's Crust (km)OBThe tangent height of the pixel center ray from the Earth's crust.PkmQ Support_DataRLTDB seconds from January 1, 2000, 11:58:55.816 UTC at start of L1B time bin.Sn_nsTn_ewUGriddedVTDB TimeWF10.2X TDB SecondsYLTDB seconds from January 1, 2000, 11:58:55.816 UTC at start of L1B time bin.ZIncrease[Linear\2000-01-01T11:58:55.816Z]TDBOHDR 8     ð|ð| deflate¾ÍŸÇ‘¿1ÈŰL|BTHDd(©ÈXº~wFRHPÿÿÿÿÿÿÿÿ° qÀ(#‚*Œ³.BTHD  d(ÃÂ=Ÿè˜FSHDÜPx(p$%%fš®BTLFbP•ÜÌ X8å¨*L Î2™:jP "?FºX¢ôµGþXlÔrqLp¹±ˆ XÙ&°˜ºXu1X fÔZ¬²X6'¢¶bXt”ÌjPƒ ÅÎúpc“‘ébL lªdï®Lc$ó®P S÷VX¡µü¢txnBTLF LbP²X XbXºXXjPºXX jP L bL ®P þXVX®Lúp¿Ù™OHDR ( ð|ð| deflateþÙÝÍ^ÇoÎ  ¼âdBTHDd(çÎP \FRHPÿÿÿÿÿÿÿÿ° WÈ(íy²¹q5BTHD  d(©ÊîÊä¢FSHDÜPx(•$%%E ?BTLFbP•ÜÌ X8å¨*L Î2™:jP "?FºX¢ôµGþXlÔrqLp¹±ˆ XÙ&°˜ºXu1X fÔZ¬²X6'¢¶bXt”ÌjPƒ ÅÎúpc“‘ébL lªdï®Lc$ó®P S÷VX¡µü¢txnBTLF LbP²X XbXºXXjPºXX jP L bL ®P þXVX®Lúp¿Ù™OHDR ( ð|ð| deflate6ä‹ÕÖCÖ  LßLéÒFRHPÿÿÿÿÿÿÿÿ •Î(·qØ!ÂPBTHD  d(çÐþ(tFSHDDPx(º$%%º¶ˆªBTLFbP•ÜÌ ºX8å¨*bL Î2™:P "?FbX¢ôµGfX lÔrqLp¹±ˆ XÙ&°˜bXu1ºXfÔZ¬²X6'¢¶Pƒ ÅÎb`c“‘é®L lªdïLc$óP S÷¾X¡µüé°‰_BTLF LbP²X XbXºXPbXºXP bL ®L P fX ¾XLb`y$?$@(%A$B$C$D(%E$F$G(%H$I$J(%K$L$M(%N$O(%PP&Q$R$S(%T$U(%VP&W$X$Y(%Z$[(%\P&]$^$_(%`$a(%bP&c$d$e(%f$g(%hP&i$j$k(%l$m$n(%o$p$q(%r$s$t(%u$v$w(%x$y$z(%{$|$}(%~$$€(%$‚(%ƒx'„$…$†(%‡$ˆ(%‰P&pOHDR Ÿ8   ð|ð| deflateÆ-š,R  ¸%¡š$FRHPÿÿÿÿÿÿÿÿ;(=8ÁXâBTHDd(fä¯ÇñBTHD  d(fw2ºFSHDgPx(½%%%åJÒ-BTLFÆX MßbP•ÜÌ X8å¨*nTÎ2™:P"?FºX¢ôµGnX »¿Fº–j©åΨFSSEVýúÎ2IX¢>FSSEVWFº–jÙxûïFSSEbcú>ÂËŽÐëFSSEyiòžbƒ ÛáFSSEMqú>ÂÿNFSSE±wú>Â%h¥˜FSSE„òžbcÐHÊFSSEë…$ÜT¬ísFSSEÂ$ÜT¬i©gFSSE)”âN²&PxbFSSEœFº–jï<¨FSSEM¢Fº–ja!’FSSE3ªFº–j}uCOCHKÿÿÿÿÿÿÿÿ 8tREFERENCE_LISTdatasetdimension  (³0¤9•B*T´gËmŸu|Öƒ=Š’{˜a Ÿ¦…¾ÃÄ©ÌçÒ»ÚáóèWï+÷‹ ¶—OCHKÿÿÿÿÿÿÿÿ€ H tREFERENCE_LISTdatasetdimension   (³0¤9•B’{˜a Ÿ¦…¾‹ fM•ŸFSSEa,Fº–jp¦ŽOCHKÿÿÿÿÿÿÿÿ 8tREFERENCE_LISTdatasetdimension  (³0¤9•B*T¨_´gËm|Öƒ=Š’{˜a Ÿ¦…¾ÃÄ©ÌçÒ»ÚáóèWï+÷‹ ãN®xFSSEqÀFº–jfÁYBFSSEWÈFº–jBî·FSSE•Îú>ÂÝP±FSSEiÖú>£O3eFSSEÍÜú>ÂXÉFSSE¡äú>ÂoFSSEëú>ÂñB1FSSEÙòú>ÂüfFSSE9ùFº’n¦¥w­FSSEûbžìë™;FSSExFº–j¶³eFHDBš¸z§: VALIDMAX  ÈC VALIDMIN   VALID_RANGE  ÈC VAR_NOTES VAR_TYPE ‹ý _FILLVALUE  ÀDIMENSION_LIST‹ý‡‹ýˆ‹ý‰FHDBšIŒ~ BIN_LOCATION  €?CATDESC ‹ý DEPEND_0‹ý DEPEND_1‹ý DEPEND_2 ‹ý DISPLAY_TYPE‹ý FIELDNAM ‹ýFORMAT‹ý LABLAXIS ‹ý LONG_NAME ‹ýUNITS‹ýFHIBš*&ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$hѨFHDB6Uóòû% WAVELENGTH‹ FHDB6_ÁÄ SCALETYP‹ý TIME_BASE‹ý TIME_SCALE‹ýUNITS‹ý VALIDMAX2150-01-01T00:00:00Z VALIDMIN1970-01-01T00:00:00Z VALID_RANGE((1970-01-01T00:00:00Z2150-01-01T00:00:00Z VAR_NOTES8‹ý VAR_TYPE ‹ýDIMENSION_LIST‹ý‹ý‚‹ýƒFHDB6ò¨Ð BIN_LOCATION  ?CATDESC8‹ý DEPEND_0‹ý DEPEND_1‹ý DEPEND_2‹ý DISPLAY_TYPE‹ý FIELDNAM‹ý FORMAT‹ý  LABLAXIS‹ý  LONG_NAME8‹ý MONOTON‹ý  _FILLVALUE*FHIB6=4=0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿž]bÊFHDB[øɪëù TIME_BASE…®\ TIME_SCALE…®]UNITS‹ý VALIDMAX ?@4 4ÿ!ö6ÜA VALIDMIN ?@4 4ÿ VALID_RANGE ?@4 4ÿ!ö6ÜA VAR_NOTES½‹ý VAR_TYPE ‹ý _FILLVALUE ?@4 4ÿøDIMENSION_LIST‹ý|‹ý}FHDB[øóiÉw BIN_LOCATION  ?CATDESCL…®R DEPEND_0…®S DEPEND_1…®T DISPLAY_TYPE…®U FIELDNAM…®VFORMAT…®W LABLAXIS …®X LONG_NAMEL…®YMONOTON…®Z SCALETYP…®[FHIB[øs<s8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”°•FHDBûñ½– VALID_RANGE  (knÎ(knN VAR_NOTES VAR_TYPE …®Q _FILLVALUE  ÀDIMENSION_LIST‹ýy‹ýzFHDBûñ\hqA BIN_LOCATION  €?CATDESCB…®H DEPEND_0…®I DEPEND_1…®J DISPLAY_TYPE…®K FIELDNAMA…®LFORMAT…®M LABLAXIS&…®N LONG_NAMEB…®OUNITS…®P VALIDMAX  (knN VALIDMIN  (knÎFHIBûñ©D©@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ЦFHDB'ê! > VALID_RANGE  4C VAR_NOTES VAR_TYPE …®G _FILLVALUE  ÀDIMENSION_LIST‹ýv‹ýwFHDB'ê ßK¿ BIN_LOCATION  €?CATDESCh…®> DEPEND_0…®? DEPEND_1…®@ DISPLAY_TYPE…®A FIELDNAMC…®BFORMAT…®C LABLAXISZ…®D LONG_NAMEh…®EUNITS…®F VALIDMAX  4C VALIDMIN  FHIB'êßLßHÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿv¢FHDBÃãŒ[Šª VALID_RANGE  4Ã4C VAR_NOTES VAR_TYPE …®= _FILLVALUE  ÀDIMENSION_LIST‹ýs‹ýtFHDBÃã‘N BIN_LOCATION  €?CATDESCN…®4 DEPEND_0…®5 DEPEND_1…®6 DISPLAY_TYPE…®7 FIELDNAMD…®8FORMAT…®9 LABLAXIS0…®: LONG_NAMEP…®;UNITS…®< VALIDMAX  4C VALIDMIN  4ÃFHIBÃãUQÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿY=šåFHDBïÛÒÊz€ VALID_RANGE  ´C VAR_NOTES VAR_TYPE …®3 _FILLVALUE  ÀDIMENSION_LIST‹ýp‹ýqFHDBïÛR°' BIN_LOCATION  €?CATDESCM…®* DEPEND_0…®+ DEPEND_1…®, DISPLAY_TYPE…®- FIELDNAMC…®.FORMAT…®/ LABLAXIS/…®0 LONG_NAMEO…®1UNITS…®2 VALIDMAX  ´C VALIDMIN  FHIBïÛK]KYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­äßFHDB‹ÕcJîz VALID_RANGE  ´Ã´C VAR_NOTES VAR_TYPE …®) _FILLVALUE  ÀDIMENSION_LIST‹ým‹ýnFHDB‹Õ¹¾u  BIN_LOCATION  €?CATDESCI…®  DEPEND_0…®! DEPEND_1…®" DISPLAY_TYPE…®# FIELDNAM+…®$FORMAT…®% LABLAXIS4…®& LONG_NAMEI…®'UNITS…®( VALIDMAX  ´C VALIDMIN  ´ÃFHIB‹ÕeaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíA,£FHDBÝͶ^T VALID_RANGE  ´Ã´C VAR_NOTES VAR_TYPE …® _FILLVALUE  ÀDIMENSION_LIST‹ýj‹ýkFHDBÝÍüv  BIN_LOCATION  €?CATDESCL…® DEPEND_0…® DEPEND_1…® DISPLAY_TYPE…® FIELDNAM.…®FORMAT…® LABLAXIS7…® LONG_NAMEH…®UNITS…® VALIDMAX  ´C VALIDMIN  ´ÃFHIBÝÍ·m·iÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿD@²mFHDBŸÇÓuÝ VALIDMAX  (knN VALIDMIN   VALID_RANGE  (knN VAR_NOTES VAR_TYPE…® _FILLVALUE  ÀDIMENSION_LIST‹ýf‹ýg‹ýhFHDBŸÇXõYn BIN_LOCATION  €?CATDESC…®  DEPEND_0…®  DEPEND_1…®  DEPEND_2 …® DISPLAY_TYPE…® FIELDNAM…®FORMAT…® LABLAXIS…® LONG_NAME…®UNITS…®FHIBŸÇíuíqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿР|OFHDB¹¿˜"h. VALIDMAX  (knN VALIDMIN   VALID_RANGE  (knN VAR_NOTES VAR_TYPE…®  _FILLVALUE  ÀDIMENSION_LIST‹ý`‹ýa‹ýbFHDB¹¿{˼à BIN_LOCATION  €?CATDESC G DEPEND_0…® DEPEND_1…® DEPEND_2 …® DISPLAY_TYPE…® FIELDNAM …®FORMAT…® LABLAXIS …® LONG_NAME …®UNITS…® FHIB¹¿#~#zÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏ;à©FHDB{©¬4T‘ VALIDMAX  (knN VALIDMIN   VALID_RANGE  (knN VAR_NOTES VAR_TYPE*Dz _FILLVALUE  ÀDIMENSION_LIST‹ýZ‹ý[‹ý\FHDB{©U%€˜ BIN_LOCATION  €?CATDESC*Dp DEPEND_0*Dq DEPEND_1*Dr DEPEND_2 *Ds DISPLAY_TYPE*Dt FIELDNAM*DuFORMAT*Dv LABLAXIS*Dw LONG_NAME*DxUNITS *DyFHIB{©Y†Y‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿQk¼FHDB•¡ôm VALIDMAX  (knN VALIDMIN   VALID_RANGE  (knN VAR_NOTES VAR_TYPE*Do _FILLVALUE  ÀDIMENSION_LIST‹ýT‹ýU‹ýVFHDB•¡PÌ¡x BIN_LOCATION  €?CATDESC*De DEPEND_0*Df DEPEND_1*Dg DEPEND_2 *Dh DISPLAY_TYPE*Di FIELDNAM*DjFORMAT*Dk LABLAXIS*Dl LONG_NAME*DmUNITS *DnFHIB•¡ŽŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡û÷FHDBW›MAzl VALIDMAX  (knN VALIDMIN   VALID_RANGE  (knN VAR_NOTES VAR_TYPE*Dd _FILLVALUE  ÀDIMENSION_LIST‹ýN‹ýO‹ýPFHDBW›®èf BIN_LOCATION  €?CATDESC*DZ DEPEND_0*D[ DEPEND_1*D\ DEPEND_2 *D] DISPLAY_TYPE*D^ FIELDNAM*D_FORMAT*D` LABLAXIS*Da LONG_NAME*DbUNITS *DcFHIBW›Å–Å’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfi½FHDBK“:Äm2 VALID_RANGE ÿÿÿÿ VAR_NOTES VAR_TYPE *DY _FILLVALUE DIMENSION_LIST‹ýI‹ýJFHDBK“èå.K BIN_LOCATION CATDESC *DP DEPEND_0*DQ DEPEND_1*DR DISPLAY_TYPE*DS FIELDNAM *DTFORMAT*DU LABLAXIS *DV LONG_NAME *DWUNITS*DX VALIDMAX ÿÿÿÿ VALIDMIN FHIBK“ûžûšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤Ÿ«ŠFHDBäŒ ` VALID_RANGEÿÿ VAR_NOTES VAR_TYPE *DO _FILLVALUEDIMENSION_LIST‹ýF‹ýGFHDB䌠ëF BIN_LOCATIONCATDESC*DF DEPEND_0*DG DEPEND_1*DH DISPLAY_TYPE*DI FIELDNAM*DJFORMAT*DK LABLAXIS*DL LONG_NAMER*DMUNITS *DN VALIDMAXÿÿ VALIDMINFHIBäŒ1§1£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿö@ öFHDB6Uèî„VL1B_TIME_BINS_PER_GRIDÖƒRADIANCE’RADIANCE_RANDOM_UNC{˜RADIANCE_SYSTEMATIC_UNCa  RAW_COUNTŸ¦RAW_COUNT_RANDOM_UNC…¾RAY_NADIR_ANGLEÃÄRAY_SOLAR_PHASE_ANGLE©ÌREFERENCE_POINT_LATçÒREFERENCE_POINT_LON»ÚSOLAR_ZENITH_ANGLEáTANGENT_HEIGHTóèTIME_ETWïTIME_UTC+÷FHDB …”Á)q VALID_RANGEÿÿ VAR_NOTES VAR_TYPE *DE _FILLVALUEDIMENSION_LIST‹ýC‹ýDFHDB …+Oi¤ BIN_LOCATIONCATDESC*D< DEPEND_0*D= DEPEND_1*D> DISPLAY_TYPE*D? FIELDNAM*D@FORMAT*DA LABLAXIS*DB LONG_NAME<*DCUNITS *DD VALIDMAXÿÿ VALIDMINFHIB …g±g­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+,ГFHDB¦~&=Sê VAR_NOTES VAR_TYPE *D; _FILLVALUE  ÀDIMENSION_LIST‹ýAFHDB¦~?÷”œ BIN_LOCATION  €?CATDESC+*D3 DEPEND_0*D4 DISPLAY_TYPE*D5 FIELDNAM*D6FORMAT*D7 LABLAXIS*D8 LONG_NAME*D9UNITS*D: VALIDMAX  0A VALIDMIN  0Á VALID_RANGE  0Á0AFHIB¦~¹µÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnöÝ&FHDBÓv'C&  VALID_RANGE  4Ã4C VAR_NOTES VAR_TYPE *D2 _FILLVALUE  ÀDIMENSION_LIST‹ý?‹ý@FHDBÓv>xÚ× BIN_LOCATION  €?CATDESC)*D) DEPEND_0*D* DEPEND_1*D+ DISPLAY_TYPE*D, FIELDNAM*D-FORMAT*D. LABLAXIS *D/ LONG_NAME*D0UNITS*D1 VALIDMAX  4C VALIDMIN  4ÃFHIBÓvÓÁÓ½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>b@ëFHDBopRp6 VALID_RANGE  ´Â´B VAR_NOTES VAR_TYPE *D( _FILLVALUE  ÀDIMENSION_LIST‹ý<‹ý=FHDBopDzˆ BIN_LOCATION  €?CATDESC(*D DEPEND_0*D  DEPEND_1*D! DISPLAY_TYPE*D" FIELDNAM*D#FORMAT*D$ LABLAXIS*D% LONG_NAME*D&UNITS*D' VALIDMAX  ´B VALIDMIN  ´ÂFHIBop Ê ÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿQ«öFHDBçh†ðÕ VAR_NOTES VAR_TYPE *D _FILLVALUE  ÀDIMENSION_LIST‹ý:FHDBçh½òeª BIN_LOCATION  €?CATDESC)*D DEPEND_0*D DISPLAY_TYPE*D FIELDNAM*DFORMAT*D LABLAXIS*D LONG_NAME*DUNITS*D VALIDMAX   A VALIDMIN   Á VALID_RANGE   Á AFHIBçh?Ò?ÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûìU*FHDB„b W(Ä VALID_RANGE  4C VAR_NOTES VAR_TYPE *D _FILLVALUE  ÀDIMENSION_LIST‹ý8‹ý9FHDB„bæx¹X BIN_LOCATION  €?CATDESCY*D  DEPEND_0*D  DEPEND_1*D DISPLAY_TYPE*D FIELDNAM?*DFORMAT*D LABLAXIS=*D LONG_NAMEY*DUNITS*D VALIDMAX  4C VALIDMIN  FHIB„buÚuÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆV‰BFHDB6Uytjn_ns$n_ew(% n_wavelengthP&UTC_String_Lengthx'BACKGROUND_COUNTS (CORRECTED_COUNT³0CORRECTED_COUNT_RANDOM_UNC¤9CORRECTED_COUNT_SYSTEMATIC_UNC•BEMISSION_ANGLE*T GRID_EW¨_ GRID_LAT´g GRID_LONËm GRID_NSŸu L1B_PIXELS_PER_GRID| QUALITY_FLAG=ŠFHIB6U«Þg«=.ÿÿÿÿÿÿÿÿÁ¨ÈóFHDBxV;ÌÓS VALIDMAX  (knN VALIDMIN   VALID_RANGE  (knN VAR_NOTES VAR_TYPE*D  _FILLVALUE  ÀDIMENSION_LIST‹ý4‹ý5‹ý6FHDBxVa-ÇÕ BIN_LOCATION  €?CATDESC*D DEPEND_0*D DEPEND_1*D DEPEND_2 *D DISPLAY_TYPE*D FIELDNAM*DFORMAT*D LABLAXIS*D LONG_NAME*D UNITS*D FHIBxVàäààÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼®àFHDBe=]žu. VALIDMAX  (knN VALIDMIN   VALID_RANGE  (knN VAR_NOTES VAR_TYPEF _FILLVALUE  ÀDIMENSION_LIST‹ý.‹ý/‹ý0FHDBe=åJ‡l BIN_LOCATION  €?CATDESC< DEPEND_0= DEPEND_1> DEPEND_2 ? DISPLAY_TYPE@ FIELDNAMAFORMATB LABLAXISC LONG_NAMEDUNITSEFHIBe=íéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿV϶ªFHDBt4 5>U VALIDMAX  (knN VALIDMIN   VALID_RANGE  (knN VAR_NOTES VAR_TYPE; _FILLVALUE  ÀDIMENSION_LIST‹ý(‹ý)‹ý*FHDBt4±Hh) BIN_LOCATION  €?CATDESC1 DEPEND_02 DEPEND_13 DEPEND_2 4 DISPLAY_TYPE5 FIELDNAM6FORMAT7 LABLAXIS8 LONG_NAME9UNITS:FHIBt4LõLñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽÁFHDB ‚Ä  VALIDMAX  (knN VALIDMIN   VALID_RANGE  (knN VAR_NOTES VAR_TYPE0 _FILLVALUE  ÀDIMENSION_LIST‹ý"‹ý#‹ý$FHDB ôÒc BIN_LOCATION  €?CATDESC& DEPEND_0' DEPEND_1( DEPEND_2 ) DISPLAY_TYPE* FIELDNAM+FORMAT, LABLAXIS- LONG_NAME.UNITS/FHIB ‚ý‚ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'P~^FHDBÜÈMeCTITLE2%NCO`netCDF Operators version 4.7.7 (Homepage = http://nco.sf.net, Code = http://github.com/nco/nco)FHDBܯÝLOGICAL_SOURCE_DESCRIPTION7MISSION_GROUP,PI_AFFILIATIONPI_NAMEPROJECT  RULES_OF_USESOFTWARE_VERSIONV  SOURCE_NAMEi!SPACECRAFT_ID"TEXTC#TIME_RESOLUTION8$FHDBÜ_÷ÍÛ DISCIPLINE# FILE_DATE GENERATED_BYHISTORYH HTTP_LINK INSTRUMENTINSTRUMENT_TYPE LINK_TEXT2 LINK_TITLE LOGICAL_FILE_ID+LOGICAL_SOURCE#FHDBÜ "±ßçSC_NADIR_LAT_MIN_MAX  G»ž»‘.Þ; SC_NADIR_LON  cß=ÂSC_NADIR_LON_MIN_MAX  Øä=ÂÚ=ÂSC_YAW  Ü-×:SC_YAW_MIN_MAX  ÅÐa:¶É:;DATE_PROCESSED  DATE_END  DATE_START DATE_START_ET ?@4 4ÿyé&˜ÞÁA DESCRIPTION-  DESCRIPTOR3 FILE.FHDBÜXEªSC_REF_ALTITUDE  æÉ G SC_REF_LON  >ÂSC_ALT_MIN_MAX  òÈ G4É GSC_POS  +C#Ǫ£¬Eù­§BSC_POS_X_MIN_MAX  ÙÄ#Çú¯"ÇSC_POS_Y_MIN_MAX  Ø‹EØ\ÍESC_POS_Z_MIN_MAX  m8§BЍB SC_Z_DIR  »Â}?åN¾}Y»SC_Z_DIR_X_MIN_MAX  “Ý|?½Œ~?SC_Z_DIR_Y_MIN_MAX  ͼ¾u¥Ù½SC_Z_DIR_Z_MIN_MAX  }»,×» SC_NADIR_LAT  ß:FHDBÜ5q- DATA_VERSION DATA_REVISION DATA_CYCLE GC_VER OC_VER MINIMUM_PHD MAXIMUM_PHDþ SPATIAL_BINNING SPECTRAL_BINNING SLIT_NAME GYM_POSITION  4CMIRROR_HEMISPHEREREFERENCE_ALTITUDE  CSC_ALT  É GFHDBÜ\Ž5_NCProperties7version=1|netcdflibversion=4.6.1|hdf5libversion=1.10.4 _NCPROPERTIES77version=1|netcdflibversion=4.6.1|hdf5libversion=1.10.4ACKNOWLEDGEMENT ADID_REF CONVENTIONS" DATA_LEVEL DATA_TYPEBOBSERVATION_TYPE OBS_TYPE OBS_ID º CHANNEL_ID TC_VERFHIBܸ¸¸¸ ¸ ¸¸ÿÿÿÿÿÿÿÿó˜ÛLTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ::TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙ6:Ë;TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ;‰g<TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜð<ÏÌ=TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ›>TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ §>TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ³>TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ¿>TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Ë>TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ×>TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ á>TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ë>TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ÷>±·DTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿hJ§'LTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµÎMăSTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|GY{ÃYTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>Z‰ËZTREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ T[TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ `[TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ l[TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ x[TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ „[TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ [TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœ[TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬[TREEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'Ê[*ñ`xœsÒm³sÅ£xâQ<ŠIÄÔßÀxœsÒm³sÅ£xâQ<ŠIÄÔßÀxœ­TK Â@;‘xQº²Å½gq/‚géoQÁ…ÞÃfÏÌÌSºß{/ÍËL·8]»ÃjíÖ€ýö{/âÕ×Ï”r°îe×®áxbŽX¯ñu{ˆÅºãâtÎÓÓ®k,4á\ë:­X‡_žÏÄÅØ9¡9Õ ªU<“é'ãþåN-Àc×WÕ«”¿å[¢ÿôÛå"ÿxóžÈ äÙÇq¹qÞŠ·Ì½›ï¯±ë\ûÔòPÍ3Qìæt¼‡»Î·ýÎøÇñŒdtcÖŒúd½\Côð¾‘ÍxœsÒmÛç„ÿô´µÇ&îGf#ãJ/„<Ì  “Æwû`ÊaáΫ÷°ŠÃÔãÒ‡Ï~R06ƒð¯F}Bz=q¸›Ûð…/º!¿¯¾†jïö+÷PâÝ^\aŒÏíÔ _bÃWXâ2›9ÈábÃÔà gb0®8 %,±aäx‚¹ Ù}ÈzÑó¥áÇÔŠgJ [˜ » ÄF[Bzˆä0Àçla [t}¸ÌÁ¥žP¼ïèiVf£Ç?¾<ït•Qxœc` 4Øcƒarô#'Ælê°¹ŸYÄø“°YŸY¶ð²¹Ä˜‰®Ž}¤†!)€p…=1é·£Û/Lñ™Oœ½øÆo¸Ó1»;®o¾K¤ùŸÚ€³q¥)lräº[9AŒ»0ÕaÆ+Dî4AŒ;Iñ'º:\y†òøF÷+¶IÙxœc`À챋ÁÄ‘ÙØô¡«Åe&!û0Ág–­8Ì!d>ûIØÍ¹¾ù.Aó »X1t9ü~G·ÂÇmnwbÄÄ/%€Ôt€Ë BaLjšÅg¹€Ø<‚Í}„ä)q¡|O †9øüO(lˆq1å ©z±É*³ˆUO¬<6³aþ"Þ. YD xœc` œ‘¶Ä&ÂÆŸÅ1ä0À)¼jp™³wÖO9Âv`q'ˆÒ‹¬Ÿ{±Éô‚ı¹[¸€Àlµh¬â(þ† Œb/–°‚Ù£aê‰Ñ‡®—šÙLä´€Vèj`âøÌ…é#Ûíа»ÈÆçHá…Ó|é¡n–%6µ0‚Ìÿ±3–ìðÇ•f5ÖvÂÅq…)X‹ÛˆÊ·dJÌFÖ b#ó‘ã‰P›fЃè2 [{a<¾‰H?ØÜ‰݆lÔNŒð!6-ãèi&€¯xœc`À&HYb3þ,n‰ÁFgc¤áòp3 4\ ˜õSC›ÌV‹Æ*SK>ûIØü w#[›?aÑnþèr„üþcg,Šøû€H”¸D·Wãs;µÂà ïYS£ˆ¶d6sà Ć©ÁÎÄ\q@ À†Hñs²ûPô¢å=R¾t¢©Ï”„ ùÙ] 6zÜÒƒ `“G¼~Àö°°EׇË\ê Æ+ñŽ‘Æ¡e6züãË©^tŠxœ—ÜâU'xœKKã;«œxœc`8P@xœc`8P@xœ›9Sñ 6xœSaJ%xœca xœc```xœ ˆyXÓuÇ;l0ŽÁ€m0.9Œhú™e>¢)‰!‡f*&¤i >ÞŠI”™(*ãèû&)O<0Í1DyDÅ£dÈ0þx=¯×ó*Ý×Çv_èc'^÷±?|,ìÆd ë^ja–=&?kan¯,ÌO×ÏBŠÒØÜ~6©¼Ÿ}ðG?Këíg ½ªI5ºšNά¦åÛß°‚æ7¬°g×¶jì+œ?ÀVn`_5 °Îôc´Xie FYÙÜ +K.³²D³•™:­Ì`?È|“:mñ%ƒìUÍ »ß>ÈÎÊÞ²í¢ô}Ê[vwì ʬ~ËÞ¿5ô„Ö¸qXÊáSâðaÓa«8(2jHò3‡gMn´qPÝ®!ó›ŠUÿJËH%À¢…¿R@†¶<-àâ~Žž ´U€}ñµ4µO½B™¯]1B8µÕR\O-ÕÚÖÑ”uB4&ÔwBˆk§‡úû:ZõBˆy‚=DŒáârü“M¹9"Ðjwˆp÷°‡šE˜#0Ó¤”1ª’ÌT“g¦ÅcÄ6“0[Œó+ÄØ!­§™?Š¡kãþ%1* ½õæ þj=•`·]Ò$šÔ@Ç‹%XR!Á®Šz~F‚£w%XðR‚)Ò¢iob#¥L”·¸‘.æH±nµ´C ëa)ꚥȹ.E`í-*S‚yHÆð0Ïà±$‹Gð íyl«äñn=îÚN ,<îöþFûÚ Ähƒ¢FeóZjƒÀ Fn{lpï6£ ¯ïØàÉs, JÖÊU:3^†ÂY2?—áY‘ ¶Éò‹ îA‘×LeÍd¨j&ÎEŽšGÍ”7Zލér¼Ìãh ËäУ礇[åÈùGŽ¡-~‹²EBå)ŠÙj‹ÊðêÎk¡{æÚû±”ëíPÒdÇ^;T¨ÿ¤‘3¸½Zøž?iü#8=ÎM¶ÇÞö(8b©ÏPгfLp@Ê2ät@ñ-T+qŒ#¼r‘¶ßë™6ì:O_Æ;¡c¡R+œÐ}Å åÂVRÆ*Á—¶RûÊŦÀKJ<:£ÅàŒ½YÎøn—3ŠZ±Và‚âhÈtÁ¹.øï‚ ¢*|­Bk¦ yvm´µU{¡+Ê ®ðÌvE}¹+ZLJ±®ÝðsÅ_”¿Ç émnøˆwǬxw¤ç¸c÷Ìëd¿ç:ݰUÃ}¬ó—¨qæ'5tö7¨ÒIƒÐ‰œÌ×`Î œr×¢lŠ™EZ$Öj1¾G‹‰>˜•äeÅØÏ<Ðõ¯¢B<±.Õ¯·xâ‹sžøÓ¡,FÃg:¼sºŽ_×a­Â ¹ã¼±Ü ÙG¼PôÀ µÞ¸5Íþßz£°É¯¼1;Ä]s}P´Ýùã:é‘ÄæQ¾Èy@¿|@ë;|±ÏݻӻH°Ö M~˜;í!¹é‡aKú0èˇáJÛ0¬·õÇœqþˆ/ðGèïÝ÷ØÓü°âã4o €çù|-„ÿÓÇ´yi ŒUèë „8ô ›9‡6GÝÙáèA=:YyA¸z$‰ÝAh÷’{R/MÞ ïKÁp’‡@5>+37˜æÕ…à—!PêCÃK (~I^Å¥¦á¯(uºIëõøä´E¢0´¼u~Êj z…Ïk*Ì ÇGûÃ1é^8f{D ¨¥NoŽ@ðå:e¡¸÷FàÙšhú}ª¸H‰kù‘ÐÔEbñ¿‘x…d+QUú®XI¿¤•C³Ÿ;ÞÒ” ¼Û pÖÅ@“ƒÉå1øáV äZ#*’HÞiDèM#ü4±ˆOŽEÁÎXܼ‹Tm$³ã°Ég§©þN.ëFB–:ÿÔúÀxœ Òk\†ÀñÍDXùœZ¥Çð13¥OþÝuÑ}E5±ŠEº)ZÝuUI.©”.EÓ²(¢Ûœ£¹dº°vÖ31Ã(Ë5gN/¾ï/~•KQÿº”ìÙJ¼C”ب”ÝWR|z¬¼7gG£9ÃæšYÐY«!“º4¤ü-K쓞uã$§Ã’”ÉVTzZñÇ^+Žz— ,êy¼Ü¿;^ž>^F‘ƒ¦ü¿£zMq'ø8 y»„‡½BšÂ§k|5'Šß°5uJ¦Ú ¾dCþØIòë*[VÙRùÀO;,íhÒ®‘}“íÑó³çÊ!{N<´§ÇÔã-iép õ¦–Ä9rü¨#:/9c½‚Òü$ëN–qsØãD N|¦íLÙjg¦q¦û™3Wm\Ð(r!^퇋\1ÚîŠßWÚ§¯dÛ¦•D·­¤^Ë ^L•7î½qc¾»;M‡ÜÉvG‘1Áúå>ÑV -=9Sè‰ÕO4ÿéÅÔt«}øöª®èåŠÉÝO)²ðţد1ïK«­Ñå~$<÷ã¦Û*t,õ¥`ìjöœÖUËjNNógN„?Õí¢17€›b(Aêr-ù°4W„ù~Føw-òÑßÖP»e q]kHzû´è)$èyÅ*…h]K·á:⶯cøÌ ‰Ék“ûG>ÇL;˜gQÁ|ÔÌ9‹.U…à>1”D†RÖJâ²õüa8[²¦làÝÆÙòåÀT®_àÓò±³Ã0,cÉë0ºÖoäU×FŠ­7q¢qŸÏ';?Ó7áÄlÞÌÂþÍluÀëB ‹#©REbdż‚(T>–ÁmÑœ~"$† ?ÇPèµ…;ú?H„m,—ÎÆrqI«šâØ¿p+¡u[y8g:ÕÛèý »Šxþša,_K•"ŽŠJf&¢¨IäcÇOÄéè¿x´h;÷‚LÄõŒ‰JbJâb)ù=‰A¥©èD'z*™™%³Ô&…–ìj:Sx¢—ŠjM*ªTVZšFKj;ý•Ò§›NæÚtšŽ¥ãù2 Û ú 3¸õß \æïÀ4~ÿÞA¢n&¿„dòus&Ú㳘y~¹,?’Åì‘,ò\²‰­ÈfàÏQö9d ÛHÌPSís™`'ùÔyØ‹qU_äáÓá  ;©Ö̧Ûa…<=›O‡““tÄ0««€9ŸÒYXÈô¡B¦ºï‚Æ]èë1mK—{Š0SîÆíànbÍ<äâ†b¦\+fºÙî—ïáê{Þr=b/úJêô‘=û˜h´Ÿàœý¿ÜOÆú‚{KÐs<À±Ö.(%ª¢”Æie\Ï*Cý¦Œ±å <*§-ô µêƒôX¬¯Þ ̼+1ø± C<ë<Äs*¦uUaé[Mz_5‚jØr¯ˆZ†^Ôò*å0ïk«È*Q¡].¯›0˾•F¤˜‡Õ>UÏH\´$­Œ‘%ŽQîß@Oo¬´}…¯ñqJ#¶ÉÂÈF,t¾&A‘ ÿ&†ÆœÀ¹þ6Þßðø­f54³ à$#?&KXû)²bZØ8¯•oÔ­œ÷J­Þ4y÷½6\o§KnÎYv9ÃH«ŵvØ ÏW§®:Kô^`ÖÉo¹‘ú†ßãµ%Wþy‘s•y²¯ô?Œ¾D´sƒc $õËô«/>p³ê«xf^£ãT‘¬ó¹ÎÿÆKÉü4ëwñΤnzjöŠÆ“Žßë¥^}“Û}·p¸õSoõaÒ÷3óMË$é·_èì§êµšî‰·9f0€îßï`h{—ú€ßPŽT‰ÁÞßéÜY# ?= qÁa‰ysXÎvªäFÆ 3Z†xô„¥¦G%jíSì*Ÿa~û9¥s_âùŠÕm#üº§Uþxœc` ,?ôÎ]L³û½£ëæ÷ŽQ·ßcÈ¡ƒoÎñª1mù„U^§ä3X\åÈg‚v€@oðWu:Ÿ¿:rKs|ëô .ÞµëN³²/~Ç+ñÃÑþÀGÎ?ÀrÓÍÂÕÜ_÷«YÃL’Û~±€ÕÛF°:¹·³:%ocÅП½ˆ .ViÀŽÕüI¾DÙë’îìt5š Cí,n°˜ùZn§½g\É‘|XõºVÂÅõ‹°ªY5GÐ)ûœ †ÜóãBTO0P"N¶Ù®1Rp½2?¥œÚt¥á|õÓvj¦ ^;r„äpÊËwɣȕ&)tïu_%§Û-JêÞĤ£ˆí+WqZ¸^Åé¡i¦Ó2yU‚æɨc¨ñµÒ€‹‰=× *,ëjƒÕí[ ¡¥tPô pèRߥ™U(fé‹]xœc`Àþ7;¡‹)4q2g4‹Ÿm4u ?dŠ¡&ŠÝ,VÔeîä|Â°Ó W-0ÔÀñj+ 9O¬ê父awp³‹¯½bUžµÕ§ý¤€ÞcnXÍ™µc-Aó]êǪ滿/†øó~bÓf€Å6º¢È=Xæ Æj~ë‹i(â³^MwºbózŽ"÷)%Òiåï™D‡ÕÇO±`µÎ»ã¨¾èàö•t¬æšž[J´}úóns`¨×,-‚‹]úPì´· ’†ŠJÁôôò2Òý”XKv8D±6ãÔ+­ß —SRäõSˆ¼~¼Î^s²Ì>YÑI²[¸4ú0ô,ž »;Á)Ìy"Uâyí¯›³6n!Ü Õß‹àìÕ‹–8!ÒGãËepöÉ5+àìó5«ðºáΔõò¥ß79±®Ü ÷ØŠS¿Œú. ¹´ï{Áb.ûQä¤ÂjŽû©ã`ñ'm'QäωŸÅënÙyW†mÜÑ»`5Û^ÞÓ÷$9õ›|YÍ·ÿTsRÔô¬R31JÍG‡ÔĦ«)qZ)×ÛÔŒ¾¯æ½Â]5${i¨ö×зEÃðYŸËû ¥[4”õi¸ñ-kž™óµô¬m›´$Åi9eÐr©HË@£–±½ZæÓñ¯I:6ÍÕQœ³JÌ_è8ý»ZG€§RüC”R²W)3†tx9ë©»­”`o=_ëÙ»CÏ‘D=æ,=Ù5zÞ½¹Zjêic mº› ÷’×ÈÔ¢5r»}+ *¡€EÔ<ÉÚå'ñx?V kNãPˆ·âúM!ãÊ y§"R1~~ó¢‹ðœµKŽþYĵwŠñØZŒ1§§¾bæºï–˜ Ýb?vЏžS|äV‚Û† =÷Èã›% s9Sði™N}í4%¯”26°”¯ ¥ v”?¹Œi«ËhÖ•q¸½Œ Iåx+ËY¨+ö…rVOª`¿²‚*]c;*ˆš|†G‹÷É¿ gx©ë e¯T²sm%>¦JÜoT2Ç¥ŠëªN­BÛ]E‡[5^aÕädTãq§šO¾“ØÍ?±äÄOìÜu@çÇíg™qê,¡^EïYýØbêÊm‡Zv-©Åã»Z××Ò9úmŸœãæÑsô+ÉâIu$Ö1d®#®»Ž×¦ŸçBÄyúÿ ß>8Ïöw&᫟I_qX^|¾ž°eõtªçK{=SÇ7Эl ÁÔÀ¹în8$HþÜQþBÕà/xsž½Ðÿw†"Ú±‘+Ÿ™52þ÷#â;-QŽÈ[ ¿¸D‰ºÈ¼šu° {¯N°ãd'Ûfgâv½“$4¶÷Úf^Ý‚§ .¨¤â×æÌ¾ÄÖN•ÄT^Â÷ÅËø|z™MºËXo]fجVâ£[q­j¥ÿ¥6¸¥–^c>ùzάÅQ×]aÓU> ¼JÒ~­$<¸ÊƒEíÄlçÕÖvþréà¯ÍŒ*í`Õ 4ûv²ÑÔÉŒ¾NÆ-èbÖ¾."[ºhŸvÈ-ט20_1nÄuf\g›í:ÿ|ðxœ Æ}\ vðëQ×Ã]¥®'Õ‘$W®¾Ÿ_]¥¡8_5!WMóÛÕ´NÜNФv:ð=îØuÐéØº\×A}¼§Ô´ù$‚ŠN¢Ž£¡ÓS8+;¦ÕÐ~Ï(«ð¥v=#Õ¶Ó0ÎzN׆£ Ó_PHf ´n”Ï9ƒð–NÚîÒEçv‘°©‹šD/©~ÿKR”œ…—èÝÛÿŠN¥Ë÷FiûgÇhÓ¤³,÷ê8Ýœ>AË'HÐ1A+ýßR›ò-]æ¿£¸wd¤D­ç 2¯^ôpð•Ûü%×}¦ŽÖéÀcHwÜ]øåê¢â¶.ÖLè"ĺNÑz¼T»­zˆ5ÕG¯>$/jP\¡„Ôkhq0@M˜4ÙXÖh€G:†èŽd•{ 1qÑžÂ{Gëë¯CLþ$8Þ@6ׇdF(K2ÂÝŽzäîý€Õ{rÑËEÔ.¦vra*2†ÿcüö½1Ò#GhÍdõݺ6¬:Õ€§rS/0Å7­¦P Ìðžä…fHR™a|õ›xh.æa‰š‡nG>z¶òážÎn>:ÄæðŒ7ÇÕæ¸óÖ–2 T¶·ò>F–8n‰‹%–0xe‰ZÏɘÚÇ|™ŒÉ¦VÉ­ðà„~î´‚ñ|n~.€êŽk¬¦À5j L²Z0w´îþÖ¸”gìvk<™7¥Îm¸}*Âm§áH¼ ú*4ò¦#¤ñOôTLGTÙ#hÞB â— !žÛ ᜠòÆlàl ±Â7'lñ0Ä1í°Oß­jH¯Ø£ïãøí–x3ðèÀ x©fÀu¡#¹Ž¨ïwÄkœp¶Ì »yÎxëŒâ”N${ˆÐ'‚òµ³6΄_ÝLX8ÍÂå°né…årìáö¢Ùy6xâ>̆×fWðµý(‘ÌÁ›’9ø»võ‰nøN;„cás‘}o.6/uÇX™;ä3æá`þ<$‰±þs14ƒb„G{ TíÛaž(öǵóqà×ùpòY€Êºh¹ô5 ¡9Ìa[5vH*Á¹Z Ôð´/,òÆg¼q5t1tÕ‹!–âúÒ¤%h4YЏ¢¥Xå² ²Ÿ–!(ÿ¡¶n;®Ç_Ä!öÁÃ;>ظÅ.¾XQ$CÅ"?Ä´úá‹x M @yuz#–#O/iÊ@˜¬‚Ò϶”®@¤|% ‹ÍY{Õ*Äm]f+Kæüµ%{œºÒ`Ô ­˜¬bvÆ®G)`’Þ”—Ëáàoͤ¡ÈÐ CÖý0¤m@úöˆ‘lÂNn8ݲª" : á¶÷aêÑ=;VmÏøê-ˆV:°xŇè8¶N{·Aµ•;0ì ®›ˆ­~„Þ.×ãx Zº°”ÝžÍlú>hàÓÿ¿‘ܘD/Ìø p±Ù‡ø9ŸA¼t?ný¬FÙãS7ÉÁyßTÿãP=®þÙLëü”ý%5÷7øÁ“Õ¯zãäàìÁj,²©åú»vĽêòµ&ù 8xxœc` 4Øcƒarô#'Ælê°¹ŸYÄø“°YŸY¶ð²¹Ä˜‰®Ž}¤†!)€p…=1é·£Û/Lñ™Oœ½øÆo¸Ó1»;®o¾K¤ùŸÚ€³q¥)lräº[9AŒ»0ÕaÆ+Dî4AŒ;Iñ'º:\y†òøF÷+¶IÙxœc`À챋ÁÄ‘ÙØô¡«Åe&!û0Ág–­8Ì!d>ûIØÍ¹¾ù.Aó »X1t9ü~G·ÂÇmnwbÄÄ/%€Ôt€Ë BaLjšÅg¹€Ø<‚Í}„ä)q¡|O †9øüO(lˆq1å ©z±É*³ˆUO¬<6³aþ"Þ. YD xœ{°+Ô1xœ jŸã[¸xœó8ds¤ xœSŠy}8,xœ;—~Û iSxœ;º'È5xœû°|YîÌ{ß$xœ320´Ô50¢ +c+c=CC‹(<¢xœÁ `[e€Ñ5÷ýþoÔ¡MQ™MAÁ¦¨C’¡£a Ð DX ê u¨,Phx(4s4U¦.AIx¨k¦Cmª0%AIС6S™.EAHPÔ¡åœ@&H|&È5³A˜ rxWu¥ W.Y\ Ò{(ÈX#ÈeËAö òÂsAŽë¹t5ÈnE¢ãIŒ Jl–¸wTâé“$Ž—Ø2!q×f‰öÅC‰ f$nŸ•xrNbMAâ¼’Ä®‰åE ¿&qvCâÖe‰ý‡$ìŽÄ™=‰[V%ŠŒ&d6Êì–ydT&“9e\æ† ™Úf™´ÌúŒÌµ32ÎÊž“9± sUI¦º Ó_”9¡&syCfï²Ì‹‡dŽïÈlëÉ,¬Êt…c„ÂÖA…û†žUXS¸h\¡4¡°²Ya(­paFᎅƒ³ GæÎ/(J ­…PU᜚ÂΆÂË N[ᬎÂ\O¡¹ª «*…ʃ*«HQ• 1•Ùq•ú„Ê@Jåä´Êu•}3*/Ϫ¼'¯2SP©–T^ZPygU劚Êý •,«¼£­²­£Ré©ümUåXUã¡ñÍA¿k¬j\Ó(k<5¡qTJãÃi¯g4Îh¼!§±9¯Q,h(i¼¶¢ñÁªÆÎšÆ¯nKc¢­‘ïh<ÞÓ0:§«:_:?Ô‘":§Fur1ŸŽë‘ÔyoJç³i}ÿÍ蜔ÓÉæu– :ÿ.鼫¢sEUç{56tF[:™¶ÎžŽÎß{:Ç >®|K<;hðÖˆA:jpwÌà©qƒ7% >’2¸3mðÇŒÁ³©œA1oð»‚ÁëÊçV ¾\5øMÍÀkL´ æÛ¿ì˜}ƒ3&7©&¿&rØd—2ùqÚäÿ“XÖ$›3ùaÞä?“w—M>]1ù~Õä_5“ѦÉtËä;m“ç;&oë›|"`ñmÕâYa1¶˜ŠXܵøsÌâÍ ‹&-îLYü)m18m1™µ¸-gñû¼Åë‹ç–-¾R±ømÕBÔ-’M‹/¶,~Õ¶0»ïï[ܰyLµQ|›DØæó›‡£6¯ŽÛ°¹>ió“”ÍjÚ&>msuÖæG9›ÿæmÖm>S¶ùAŦWµ‰Öm>Õ´ùnËæù¶ÍÛ»6ŸìÛì8<§:D|‡…î‰8ü%êð–¸Ã–„Ã7’‡Rá)‡Éi‡¯eþsX3ïð¡¢ÃWË˱䰩îð¥¦Ãþ–ƒµâð®Ã-}‡Ç.ªæršï²#ìò³ˆËkÆ\N‰»\Ÿpy(é˜tY?årÍ´ËY—Ã9—uó.W]Ë.ýŠËØ’Ëeu—½M—Z.Ç­¸\ÚuÙÝwéßç™°ÏÚŸ‹Æ|JqŸ•„ÏÐ&Ÿ '}î˜ò98ísäÕ>ço÷)Ìû´Š>¡»}ÎÙã³sÉ牺ó¸ÏY|æV|š]ý%ŸÓBܨ…xÔ! …Ø0bv,D=âˆÓBœ¼)Äu“!öM…xó UxœÁ `›e€a›z —‚‚ûïëûL›NÖ"r$ðʰa£ ÐX:<¶V¦B‚€Ò ×Tæ±T%™ ÐÌáÑTJ¢‚˜  6S¦.UIDP”ÏóÒv‰S2WÍH,ÎJt÷HŒ%®\Ø¿(ñÜÇ×%¶-KÜ{X¢ýŒÄPWbkŸÌ]«ež\#³Ö‘¹lPæÎõ2­ÓeĨÌÅc2·Ë<±EƘ’¹0#³gFfyVF.ÈœW”¹uAæ±E™c«2›ê2»–eê‡eÚ2çtenêSxpµÂ*Iaƒ£pàBu½B(¦pƨµc ÆŽlQ8uJáêŒÂâŒBoVᤂŽ¢Â} Ï/*œPUØVWXXVèVX×V¸¢«pwŸÊS«UÖJ*—;*ÅA••õ*nLå’Q•ÛÇT«˜i•‹¦T •挊’W9¿ ²»¨òø‚Êq•MU•ÙºJcYåè–ÊÆ¶ÊÍ]•‡ú4V…5Ζ4fÚ Fÿ°Æ™1ëF5Œi¼<®qZZ#3¥QÉh¼8£ñŽ¼ÆŽ‚Æ÷Šÿ^Ð8±¢±½ªQ®küsYc]Kã#mow5žîÓysXg‹¤SrtVu¼aÅtîÕùÓ˜Ž•ÒOë¦tftÔœÎy/t~[ÔySYçÜŠN¾ªóH]瘦Î{Z:Ÿoëüª«sTÈàÝaƒœdPs ^5`Øàú˜Áý£¯Œœž2Ȥ –¦ þ›189gðɼÁ÷ ÿ)œX6˜ªì«<[7xkÓà£-ƒï´ žî¼%d’›ì•Lþê˜øQ“›Ü3ùó¨‰4I¥LæÓ&˜2Ѳ&äL¾œ7ù]ÁdMÉd¬l2W1ùMÕ䘆É{›&·´Ln›¼¾g2²Ø¶ø¹dñañ®¨ÅõÃ?Y¼*aKZdS?J[üoÊâä¬Å§r?È[¼P°X_²˜.[|·bñlÕâm ‹5-îiYü£m1س˜ Ùì ÛüM² „Í¥Q›o Ûü%fã$lRI›¯¥lþ˜¶Ñ§m>µùJÎæ÷y›5ó6É’ÍË6VlÞP³y_Ãæ M›‡[6«;6‰žÍ!‡_„^+;œ%>uøÙ°C_Ü!žp¸&éðã”ÃKi‡wN;|:ëðÜà y‡áy‡O”ö—þUqx{Íáã ‡{šÏ´¢‡­=‡o… "²àR!øfTpxX ₉„àëIÁ)>)øà´à«YÁrN Í 6Ï n- - Þ¸$xM°«!øuS^œÓÜØü2äòº— ²Ëç„ËQ—ЈK<îò™„ËO’.GR.§Lº\5í²˜uéæ\Fæ\®œwÙ_ry®ìrü’˶šË½ —vÓehÅekÇ实˓!µ—Éw VÔCŒx\÷¸-áq(éaLx\8é±gÚc9ë!ïô8oÎc÷¼Çc%c÷ylZòØUó¨7<zl\ñ¸©ãñ`ÏcU¿Ï†ŸdŸªðéò9cÄçڸτϑ¤Ï©>WOúT¦}zYŸ“vúì˜ó¹oÞçù’Ï û|¶/ù,Ô|: Ÿu}®Xñ¹»ãóTÏgmÀåE9`E¸C—ŒÜ8”07\4P˜ hN(ל¿3`÷\ÀãóÇí 8w_ÀìR@£pô#ܼðP'à¨Îî03¡&Gèw#œ9ẑ÷Ç#¼œˆpÚæ™‰•Éÿ]Ü"Inetcdf4-python-1.5.8rel/test/tst_Unsigned.py000066400000000000000000000031221413751447500211060ustar00rootroot00000000000000import unittest import netCDF4 from numpy.testing import assert_array_equal import numpy as np class Test_Unsigned(unittest.TestCase): """ Test autoconversion to unsigned ints when _Unsigned attribute is True. This attribute is is set by netcdf-java to designate unsigned integer data stored with a signed integer type in netcdf-3. If _Unsigned=True, a view to the data as unsigned integers is returned. set_autoscale can be used to turn this off (default is on) See issue #656 (pull request #658). """ def test_unsigned(self): f = netCDF4.Dataset("ubyte.nc") data = f['ub'][:] assert data.dtype.str[1:] == 'u1' assert_array_equal(data,np.array([0,255],np.uint8)) f.set_auto_scale(False) data2 = f['ub'][:] assert data2.dtype.str[1:] == 'i1' assert_array_equal(data2,np.array([0,-1],np.int8)) f.close() # issue 671 f = netCDF4.Dataset('issue671.nc') data1 = f['soil_moisture'][:] assert(np.ma.isMA(data1)) f.set_auto_scale(False) data2 = f['soil_moisture'][:] assert(data1.mask.sum() == data2.mask.sum()) f.close() # issue 794 # test that valid_min/valid_max/_FillValue are # treated as unsigned integers. f=netCDF4.Dataset('20171025_2056.Cloud_Top_Height.nc') data = f['HT'][:] assert(data.mask.sum() == 57432) assert(int(data.max()) == 15430) assert(int(data.min()) == 0) assert(data.dtype == np.float32) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_atts.py000066400000000000000000000217721413751447500203200ustar00rootroot00000000000000import math import subprocess import sys import unittest import os import tempfile import warnings import numpy as np from collections import OrderedDict from numpy.random.mtrand import uniform import netCDF4 # test attribute creation. #FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name FILE_NAME = 'tst_atts.nc' VAR_NAME="dummy_var" GROUP_NAME = "dummy_group" DIM1_NAME="x" DIM1_LEN=2 DIM2_NAME="y" DIM2_LEN=3 DIM3_NAME="z" DIM3_LEN=25 STRATT = 'string attribute' EMPTYSTRATT = '' INTATT = 1 FLOATATT = math.pi SEQATT = np.arange(10) STRINGSEQATT = ['mary ','','had ','a ','little ','lamb',] #ATTDICT = {'stratt':STRATT,'floatatt':FLOATATT,'seqatt':SEQATT, # 'stringseqatt':''.join(STRINGSEQATT), # changed in issue #770 # 'emptystratt':EMPTYSTRATT,'intatt':INTATT} ATTDICT = {'stratt':STRATT,'floatatt':FLOATATT,'seqatt':SEQATT, 'stringseqatt':STRINGSEQATT, 'emptystratt':EMPTYSTRATT,'intatt':INTATT} class VariablesTestCase(unittest.TestCase): def setUp(self): self.file = FILE_NAME f = netCDF4.Dataset(self.file,'w') # try to set a dataset attribute with one of the reserved names. f.setncattr('file_format','netcdf4_format') # test attribute renaming f.stratt_tmp = STRATT f.renameAttribute('stratt_tmp','stratt') f.emptystratt = EMPTYSTRATT f.intatt = INTATT f.floatatt = FLOATATT f.seqatt = SEQATT # sequences of strings converted to a single string. f.stringseqatt = STRINGSEQATT f.setncattr_string('stringseqatt_array',STRINGSEQATT) # array of NC_STRING g = f.createGroup(GROUP_NAME) f.createDimension(DIM1_NAME, DIM1_LEN) f.createDimension(DIM2_NAME, DIM2_LEN) f.createDimension(DIM3_NAME, DIM3_LEN) g.createDimension(DIM1_NAME, DIM1_LEN) g.createDimension(DIM2_NAME, DIM2_LEN) g.createDimension(DIM3_NAME, DIM3_LEN) g.stratt_tmp = STRATT g.renameAttribute('stratt_tmp','stratt') g.emptystratt = EMPTYSTRATT g.intatt = INTATT g.floatatt = FLOATATT g.seqatt = SEQATT g.stringseqatt = STRINGSEQATT if netCDF4.__version__ > "1.4.2": with self.assertRaises(ValueError): g.arrayatt = [[1, 2], [3, 4]] # issue #841 g.setncattr_string('stringseqatt_array',STRINGSEQATT) # array of NC_STRING v = f.createVariable(VAR_NAME, 'f8',(DIM1_NAME,DIM2_NAME,DIM3_NAME)) # try to set a variable attribute with one of the reserved names. v.setncattr('ndim','three') v.setncatts({'foo': 1}) v.setncatts(OrderedDict(bar=2)) v.stratt_tmp = STRATT v.renameAttribute('stratt_tmp','stratt') v.emptystratt = EMPTYSTRATT v.intatt = INTATT v.floatatt = FLOATATT v.seqatt = SEQATT v.stringseqatt = STRINGSEQATT v.setncattr_string('stringseqatt_array',STRINGSEQATT) # array of NC_STRING v1 = g.createVariable(VAR_NAME, 'f8',(DIM1_NAME,DIM2_NAME,DIM3_NAME)) v1.stratt = STRATT v1.emptystratt = EMPTYSTRATT v1.intatt = INTATT v1.floatatt = FLOATATT v1.seqatt = SEQATT v1.stringseqatt = STRINGSEQATT v1.setncattr_string('stringseqatt_array',STRINGSEQATT) # array of NC_STRING # issue #959: should not be able to set _FillValue after var creation try: v1._FillValue(-999.) except AttributeError: pass else: raise ValueError('This test should have failed.') try: v1.setncattr('_FillValue',-999.) except AttributeError: pass else: raise ValueError('This test should have failed.') # issue #485 (triggers segfault in C lib # with version 1.2.1 without pull request #486) f.foo = np.array('bar','S') f.foo = np.array('bar','U') # issue #529 write string attribute as NC_CHAR unless # it can't be decoded to ascii. Add setncattr_string # method to force NC_STRING. f.charatt = 'foo' # will be written as NC_CHAR f.setncattr_string('stringatt','bar') # NC_STRING f.cafe = 'caf\xe9' # NC_STRING f.batt = 'caf\xe9'.encode('utf-8') #NC_CHAR v.setncattr_string('stringatt','bar') # NC_STRING # issue #882 - provide an option to always string attribute # as NC_STRINGs. Testing various approaches to setting text attributes... f.set_ncstring_attrs(True) f.stringatt_ncstr = 'foo' # will now be written as NC_STRING f.setncattr_string('stringatt_ncstr','bar') # NC_STRING anyway f.caf_ncstr = 'caf\xe9' # NC_STRING anyway f.bat_ncstr = 'caf\xe9'.encode('utf-8') # now NC_STRING g.stratt_ncstr = STRATT # now NC_STRING #g.renameAttribute('stratt_tmp','stratt_ncstr') v.setncattr_string('stringatt_ncstr','bar') # NC_STRING anyway v.stratt_ncstr = STRATT v1.emptystratt_ncstr = EMPTYSTRATT f.close() def tearDown(self): # Remove the temporary files #pass os.remove(self.file) def runTest(self): """testing attributes""" f = netCDF4.Dataset(self.file, 'r') v = f.variables[VAR_NAME] g = f.groups[GROUP_NAME] v1 = g.variables[VAR_NAME] # check attributes in root group. # global attributes. # check __dict__ method for accessing all netCDF attributes. for key,val in ATTDICT.items(): if type(val) == np.ndarray: assert f.__dict__[key].tolist() == val.tolist() else: assert f.__dict__[key] == val # check accessing individual attributes. assert f.intatt == INTATT assert f.floatatt == FLOATATT assert f.stratt == STRATT assert f.emptystratt == EMPTYSTRATT assert f.seqatt.tolist() == SEQATT.tolist() #assert f.stringseqatt == ''.join(STRINGSEQATT) # issue 770 assert f.stringseqatt == STRINGSEQATT assert f.stringseqatt_array == STRINGSEQATT assert f.getncattr('file_format') == 'netcdf4_format' # variable attributes. # check __dict__ method for accessing all netCDF attributes. for key,val in ATTDICT.items(): if type(val) == np.ndarray: assert v.__dict__[key].tolist() == val.tolist() else: assert v.__dict__[key] == val # check accessing individual attributes. assert v.intatt == INTATT assert v.floatatt == FLOATATT assert v.stratt == STRATT assert v.seqatt.tolist() == SEQATT.tolist() #assert v.stringseqatt == ''.join(STRINGSEQATT) # issue 770 assert v.stringseqatt == STRINGSEQATT assert v.stringseqatt_array == STRINGSEQATT assert v.getncattr('ndim') == 'three' assert v.getncattr('foo') == 1 assert v.getncattr('bar') == 2 # check type of attributes using ncdump (issue #529) if not os.getenv('NO_CDL'): ncdump_output = f.tocdl() for line in ncdump_output: line = line.strip('\t\n\r') line = line.strip()# Must be done another time for group variables if "stringatt" in line: assert line.startswith('string') if "charatt" in line: assert line.startswith(':') if "cafe" in line: assert line.startswith('string') if "batt" in line: assert line.startswith(':') if "_ncstr" in line: assert line.startswith('string') # check attributes in subgroup. # global attributes. for key,val in ATTDICT.items(): if type(val) == np.ndarray: assert g.__dict__[key].tolist() == val.tolist() else: assert g.__dict__[key] == val assert g.intatt == INTATT assert g.floatatt == FLOATATT assert g.stratt == STRATT assert g.emptystratt == EMPTYSTRATT assert g.seqatt.tolist() == SEQATT.tolist() #assert g.stringseqatt == ''.join(STRINGSEQATT) # issue 770 assert g.stringseqatt == STRINGSEQATT assert g.stringseqatt_array == STRINGSEQATT for key,val in ATTDICT.items(): if type(val) == np.ndarray: assert v1.__dict__[key].tolist() == val.tolist() else: assert v1.__dict__[key] == val assert v1.intatt == INTATT assert v1.floatatt == FLOATATT assert v1.stratt == STRATT assert v1.emptystratt == EMPTYSTRATT assert v1.seqatt.tolist() == SEQATT.tolist() #assert v1.stringseqatt == ''.join(STRINGSEQATT) # issue 770 assert v1.stringseqatt == STRINGSEQATT assert v1.stringseqatt_array == STRINGSEQATT assert getattr(v1,'nonexistantatt',None) == None f.close() # issue 915 empty string attribute (ncdump reports 'NIL') f = netCDF4.Dataset('test_gold.nc') assert f['RADIANCE'].VAR_NOTES == "" f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_cdf5.py000066400000000000000000000025031413751447500201550ustar00rootroot00000000000000from netCDF4 import Dataset import numpy as np import sys, os, unittest, tempfile from numpy.testing import assert_array_equal FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name dimsize = np.iinfo(np.int32).max*2 # only allowed in CDF5 ndim = 100 arrdata = np.random.randint(np.iinfo(np.uint8).min,np.iinfo(np.uint8).max,size=ndim) class test_cdf5(unittest.TestCase): def setUp(self): self.netcdf_file = FILE_NAME nc = Dataset(self.netcdf_file,'w',format='NETCDF3_64BIT_DATA') # create a 64-bit dimension d = nc.createDimension('dim',dimsize) # 64-bit dimension # create an 8-bit unsigned integer variable v = nc.createVariable('var',np.uint8,'dim') v[:ndim] = arrdata # create a 64-bit integer attribute (issue #878) nc.setncattr('int64_attr', np.int64(-9223372036854775806)) nc.close() def tearDown(self): # Remove the temporary files os.remove(self.netcdf_file) def runTest(self): """testing NETCDF3_64BIT_DATA format (CDF-5)""" f = Dataset(self.netcdf_file, 'r') assert f.dimensions['dim'].size == dimsize assert_array_equal(arrdata, f.variables['var'][:ndim]) assert (type(f.int64_attr) == np.int64) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_cdl.py000066400000000000000000000027551413751447500201070ustar00rootroot00000000000000import unittest import netCDF4 import os test_ncdump="""netcdf ubyte { dimensions: d = 2 ; variables: byte ub(d) ; ub:_Unsigned = "true" ; byte sb(d) ; // global attributes: :_Format = "classic" ; } """ test_ncdump2="""netcdf ubyte { dimensions: d = 2 ; variables: byte ub(d) ; ub:_Unsigned = "true" ; byte sb(d) ; // global attributes: :_Format = "classic" ; data: ub = 0, -1 ; sb = -128, 127 ; } """ class Test_CDL(unittest.TestCase): """ Test import/export of CDL """ def setUp(self): f=netCDF4.Dataset('ubyte.nc') f.tocdl(outfile='ubyte.cdl',data=True) f.close() def test_tocdl(self): # treated as unsigned integers. f=netCDF4.Dataset('ubyte.nc') assert(f.tocdl() == test_ncdump) assert(f.tocdl(data=True) == test_ncdump2) f.close() def test_fromcdl(self): f1=netCDF4.Dataset.fromcdl('ubyte.cdl',ncfilename='ubyte2.nc') f2=netCDF4.Dataset('ubyte.nc') assert(f1.variables.keys() == f2.variables.keys()) assert(f1.filepath() == 'ubyte2.nc') assert(f1.dimensions.keys() == f2.dimensions.keys()) assert(len(f1.dimensions['d']) == len(f2.dimensions['d'])) assert((f1['ub'][:] == f2['ub'][:]).all()) assert((f1['sb'][:] == f2['sb'][:]).all()) f1.close(); f2.close() os.remove('ubyte2.nc') def tearDown(self): # Remove the temporary files os.remove('ubyte.cdl') if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_chunk_cache.py000066400000000000000000000030421413751447500215660ustar00rootroot00000000000000import unittest, netCDF4, tempfile, os file_name = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name cache_size = 10000 cache_nelems = 100 cache_preempt = 0.5 cache_size2 = 20000 cache_nelems2 = 200 cache_preempt2 = 1.0 class RefCountTestCase(unittest.TestCase): def setUp(self): nc = netCDF4.Dataset(file_name, mode='w', format='NETCDF4') d = nc.createDimension('fred', 2000) # can only change cache size in createVariable (not nelems or preemption) # this change lasts only as long as file is open. v = nc.createVariable('frank','f',('fred',),chunk_cache=15000) size, nelems, preempt = v.get_var_chunk_cache() assert(size==15000) self.file=file_name nc.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing methods for accessing and changing chunk cache""" # change cache parameters before opening fil. netCDF4.set_chunk_cache(cache_size, cache_nelems, cache_preempt) nc = netCDF4.Dataset(self.file, mode='r') # check to see that chunk cache parameters were changed. assert(netCDF4.get_chunk_cache() == (cache_size, cache_nelems, cache_preempt)) # change cache parameters for variable, check nc['frank'].set_var_chunk_cache(cache_size2, cache_nelems2, cache_preempt2) assert(nc['frank'].get_var_chunk_cache() == (cache_size2, cache_nelems2, cache_preempt2)) nc.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_compound_alignment.py000066400000000000000000001122011413751447500232130ustar00rootroot00000000000000""" This illustrates a bug when a structured array is extracted from a netCDF4.Variable using the slicing operation. Bug is observed with EPD 7.3-1 and 7.3-2 (64-bit) """ import netCDF4, numpy, tempfile, sys, os, unittest from numpy.testing import assert_array_equal, assert_array_almost_equal def string_to_bytes(xstring, size=-1, pad="\0"): nbytes = len(xstring) if (size >= 0): xsize = size else: xsize = nbytes xbytes = numpy.empty(xsize, dtype=numpy.uint8) xbytes[:] = ord(pad) if (nbytes > xsize): nbytes = xsize for i in range(nbytes): xbytes[i] = ord(xstring[i]) return xbytes cells = numpy.array([ (387, 289, 65.64321899414062, -167.90093994140625, 3555, -10158, 8934, -16608, 19, 34199, 2, 0, 218, 619, 534, 314, 234, 65528, 39, 1524, 2429, 3137, 2795, 3092, 6431, 12949, 6780, 18099, 8248, 9331, 972, 553, 721, 2874, 2488, 3087, 3072, 2537, 3295, 334, 334, 9888, 10552, 7175, 6981, 7250, 8133, 14349, 16565, 17097, 20945, 13, 5, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 5, 3, 7, 0, 0, 10, 11, 15, 7, 14, 4, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 0, 6, 0, 12210, 16433, 45, 241, 243, 71, 131, [87, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (387, 290, 65.64067077636719, -167.93258666992188, 3546, -10161, 8934, -16611, 13, 34165, 1, 0, 215, 582, 534, 317, 204, 65528, 34, 1533, 2428, 3161, 2803, 3107, 6336, 12721, 6670, 17775, 7973, 8770, 933, 554, 714, 2904, 2480, 3102, 3087, 2560, 3323, 359, 359, 9934, 10585, 7235, 7007, 7315, 8209, 14421, 16538, 17046, 20924, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 5, 3, 7, 0, 0, 11, 11, 15, 6, 15, 3, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 0, 6, 0, 12235, 16433, 45, 241, 243, 71, 131, [-43, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (388, 287, 65.65902709960938, -167.84213256835938, 3574, -10167, 8936, -16602, 15, 34269, 1, 0, 213, 626, 521, 313, 230, 64, 35, 1519, 2391, 3091, 2719, 3011, 6313, 12685, 6657, 17785, 8169, 9420, 960, 541, 705, 2881, 2488, 3084, 3065, 2500, 3328, 357, 357, 10023, 10578, 7250, 6986, 7285, 8149, 14469, 16671, 17188, 20849, 13, 4, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 5, 3, 7, 0, 0, 11, 12, 15, 6, 15, 4, 4, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 12241, 16432, 25, 241, 243, 71, 131, [-41, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (388, 288, 65.65646362304688, -167.8740692138672, 3565, -10171, 8936, -16605, 17, 34234, 1, 0, 214, 618, 523, 310, 226, 70, 36, 1528, 2408, 3107, 2751, 3026, 6320, 12708, 6673, 17824, 8138, 9309, 960, 541, 712, 2881, 2496, 3084, 3079, 2477, 3259, 349, 349, 10023, 10528, 7281, 7011, 7285, 8149, 14416, 16503, 17057, 20928, 13, 5, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 5, 3, 7, 0, 0, 11, 12, 15, 6, 13, 4, 4, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 12239, 16433, 45, 241, 243, 71, 131, [-43, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (388, 289, 65.65390014648438, -167.9058380126953, 3555, -10174, 8935, -16608, 15, 34200, 2, 0, 212, 582, 526, 307, 208, 60, 40, 1519, 2408, 3107, 2751, 3042, 6226, 12504, 6548, 17477, 7880, 8732, 929, 541, 689, 2911, 2496, 3129, 3094, 2500, 3300, 342, 342, 10001, 10595, 7413, 7086, 7396, 8292, 14486, 16601, 16949, 21066, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 5, 3, 7, 0, 0, 11, 12, 15, 5, 13, 3, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 12272, 16433, 45, 241, 243, 71, 131, [83, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (388, 290, 65.6513442993164, -167.9374542236328, 3546, -10177, 8935, -16611, 6, 34166, 2, 0, 213, 568, 531, 315, 198, 64, 34, 1537, 2424, 3147, 2782, 3081, 6242, 12534, 6571, 17524, 7833, 8550, 921, 541, 689, 2926, 2496, 3144, 3102, 2546, 3341, 358, 358, 10045, 10629, 7421, 7078, 7448, 8326, 14485, 16572, 16984, 21085, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 5, 3, 7, 0, 0, 11, 12, 15, 5, 13, 3, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 12307, 16433, 45, 241, 243, 71, 131, [83, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (388, 291, 65.6487808227539, -167.96910095214844, 3536, -10180, 8934, -16614, 5, 34131, 1, 0, 218, 586, 538, 321, 211, 74, 40, 1546, 2424, 3171, 2806, 3113, 6368, 12821, 6704, 17895, 8029, 8835, 937, 549, 705, 2926, 2496, 3152, 3117, 2476, 3286, 350, 350, 9978, 10612, 7468, 7128, 7474, 8360, 14547, 16572, 17019, 20766, 13, 5, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 5, 3, 7, 0, 0, 11, 12, 15, 5, 13, 3, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (389, 287, 65.66973876953125, -167.84698486328125, 3574, -10183, 8937, -16603, 8, 34270, 2, 0, 211, 598, 526, 304, 206, 65528, 35, 1516, 2378, 3069, 2697, 2984, 6168, 12394, 6515, 17382, 7931, 9011, 935, 530, 694, 2923, 2495, 3147, 3106, 2530, 3413, 334, 334, 9999, 10723, 7479, 7160, 7494, 8378, 14631, 16670, 17111, 21141, 12, 6, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 6, 3, 7, 0, 0, 11, 13, 15, 6, 11, 3, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 3, 0, 6, 0, 12325, 16433, 45, 241, 243, 71, 131, [83, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (389, 288, 65.66716003417969, -167.87890625, 3565, -10186, 8937, -16606, 9, 34235, 2, 0, 212, 602, 528, 309, 218, 65528, 38, 1525, 2387, 3101, 2736, 3016, 6240, 12542, 6585, 17587, 7994, 9050, 943, 530, 701, 2938, 2503, 3170, 3128, 2552, 3371, 333, 333, 9930, 10706, 7533, 7176, 7546, 8412, 14595, 16697, 17010, 20876, 12, 6, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 6, 3, 7, 0, 0, 11, 13, 15, 6, 10, 3, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 3, 0, 6, 0, 12360, 16433, 45, 241, 243, 71, 131, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (389, 289, 65.66458892822266, -167.91065979003906, 3555, -10190, 8936, -16609, 5, 34201, 2, 0, 212, 561, 527, 311, 202, 65528, 34, 1524, 2412, 3117, 2744, 3032, 6137, 12342, 6461, 17241, 7721, 8408, 897, 530, 678, 2967, 2495, 3185, 3158, 2552, 3344, 335, 335, 9953, 10757, 7586, 7219, 7598, 8474, 14622, 16711, 17085, 20855, 12, 7, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 6, 3, 7, 0, 0, 12, 13, 15, 6, 11, 3, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 3, 0, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (389, 290, 65.6620101928711, -167.94241333007812, 3546, -10193, 8936, -16611, 5, 34166, 2, 0, 213, 558, 533, 315, 190, 65528, 35, 1533, 2420, 3141, 2767, 3071, 6168, 12424, 6500, 17312, 7721, 8360, 905, 530, 678, 2952, 2495, 3177, 3128, 2507, 3371, 334, 334, 9975, 10689, 7517, 7176, 7546, 8426, 14577, 16559, 17109, 21037, 12, 7, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 6, 3, 7, 0, 0, 12, 13, 15, 6, 11, 3, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 3, 0, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (389, 291, 65.65943145751953, -167.97409057617188, 3536, -10196, 8935, -16614, 5, 34132, 0, 0, 217, 578, 536, 324, 206, 65528, 36, 1542, 2420, 3165, 2799, 3095, 6303, 12683, 6640, 17713, 7924, 8654, 920, 546, 694, 2938, 2495, 3170, 3143, 2530, 3358, 327, 327, 9952, 10672, 7517, 7184, 7539, 8419, 14550, 16627, 17046, 20934, 12, 7, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 6, 3, 7, 0, 0, 11, 12, 15, 6, 11, 3, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 3, 0, 6, 0, 0, 3, 0, 0, 0, 255, 255, [23, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (389, 292, 65.65685272216797, -168.0056915283203, 3527, -10199, 8934, -16617, 5, 34097, 1, 0, 226, 625, 545, 329, 232, 65528, 56, 1542, 2428, 3189, 2845, 3165, 6580, 13244, 6943, 18555, 8375, 9328, 973, 569, 732, 2952, 2503, 3155, 3106, 2507, 3289, 341, 341, 9861, 10552, 7494, 7176, 7513, 8405, 14460, 16489, 16983, 20873, 11, 5, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 6, 3, 7, 0, 0, 10, 11, 15, 6, 10, 3, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 3, 0, 6, 0, 0, 2, 0, 0, 0, 255, 255, [81, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (390, 287, 65.66167449951172, -167.85145568847656, 3573, -10045, 8937, -16603, 14, 34267, 1, 0, 213, 624, 529, 315, 216, 68, 44, 1533, 2414, 3105, 2719, 3022, 6294, 12637, 6630, 17704, 8134, 9315, 969, 542, 712, 2888, 2500, 3097, 3042, 2456, 3268, 334, 334, 10122, 10624, 7274, 7110, 7307, 8181, 14498, 16617, 17137, 21090, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 11, 13, 15, 5, 9, 3, 3, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 12243, 16433, 45, 241, 243, 71, 131, [-41, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (390, 288, 65.65919494628906, -167.88340759277344, 3564, -10048, 8936, -16606, 15, 34233, 2, 0, 215, 610, 526, 316, 213, 72, 38, 1533, 2414, 3105, 2735, 3038, 6278, 12621, 6607, 17641, 8055, 9125, 954, 542, 704, 2910, 2506, 3113, 3071, 2501, 3254, 342, 342, 10032, 10624, 7358, 7181, 7353, 8243, 14453, 16522, 17075, 20905, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 11, 13, 15, 5, 8, 3, 3, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 12255, 16433, 45, 241, 243, 71, 131, [83, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (390, 289, 65.65672302246094, -167.91519165039062, 3554, -10050, 8935, -16608, 10, 34198, 2, 0, 211, 570, 533, 318, 196, 64, 34, 1524, 2414, 3128, 2751, 3038, 6177, 12399, 6491, 17304, 7774, 8523, 914, 542, 688, 2940, 2500, 3143, 3086, 2523, 3310, 335, 335, 10054, 10691, 7456, 7199, 7470, 8347, 14560, 16656, 17000, 20986, 13, 7, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 13, 15, 5, 9, 3, 3, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 12318, 16433, 45, 241, 243, 71, 131, [83, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (390, 290, 65.65425109863281, -167.9468994140625, 3545, -10053, 8935, -16611, 5, 34164, 2, 0, 213, 572, 538, 319, 196, 64, 41, 1533, 2438, 3160, 2789, 3077, 6231, 12534, 6561, 17477, 7829, 8538, 922, 542, 696, 2933, 2500, 3151, 3086, 2456, 3324, 343, 343, 10054, 10674, 7441, 7199, 7470, 8340, 14533, 16562, 16987, 20985, 13, 7, 6, 15, 15, 15, 15, 0, 9, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 13, 15, 5, 9, 3, 3, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (390, 291, 65.65176391601562, -167.97862243652344, 3535, -10056, 8934, -16614, 5, 34129, 2, 0, 220, 600, 544, 324, 209, 78, 52, 1532, 2446, 3175, 2821, 3124, 6426, 12898, 6754, 18017, 8110, 8951, 961, 557, 712, 2948, 2500, 3143, 3094, 2456, 3268, 342, 342, 10054, 10624, 7433, 7181, 7490, 8361, 14524, 16615, 17011, 21005, 13, 6, 6, 15, 15, 15, 15, 0, 9, 5, 8, 8, 4, 5, 4, 7, 0, 0, 11, 12, 15, 5, 9, 3, 3, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (391, 286, 65.67485809326172, -167.82440185546875, 3583, -10058, 8938, -16600, 13, 34302, 2, 0, 209, 603, 516, 306, 206, 69, 42, 1500, 2373, 3048, 2663, 2961, 6145, 12346, 6479, 17279, 7924, 9049, 930, 526, 697, 2902, 2500, 3127, 3090, 2513, 3361, 338, 338, 10063, 10809, 7433, 7131, 7427, 8311, 14635, 16809, 17275, 20874, 13, 5, 7, 15, 15, 15, 15, 0, 10, 6, 8, 8, 4, 5, 4, 7, 0, 0, 11, 13, 15, 6, 12, 3, 2, 5, 3, 15, 15, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 12294, 16433, 45, 241, 243, 72, 131, [85, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (391, 287, 65.67237854003906, -167.8563232421875, 3573, -10061, 8938, -16603, 7, 34268, 2, 0, 212, 608, 525, 309, 220, 66, 42, 1517, 2389, 3080, 2701, 2985, 6200, 12440, 6557, 17474, 7995, 9121, 946, 534, 697, 2932, 2500, 3165, 3113, 2490, 3320, 329, 329, 10085, 10776, 7527, 7186, 7538, 8414, 14652, 16698, 17108, 20833, 13, 5, 7, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 11, 13, 15, 6, 12, 3, 2, 5, 3, 15, 15, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 12350, 16433, 45, 241, 243, 71, 131, [83, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (391, 288, 65.66989135742188, -167.8882598876953, 3564, -10064, 8937, -16606, 6, 34233, 2, 0, 213, 598, 528, 311, 225, 77, 39, 1534, 2405, 3111, 2724, 3016, 6239, 12527, 6572, 17545, 7971, 8954, 946, 542, 704, 2955, 2507, 3172, 3128, 2467, 3320, 353, 353, 9952, 10725, 7534, 7241, 7571, 8441, 14617, 16615, 17081, 20772, 13, 5, 7, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 11, 13, 15, 6, 11, 3, 2, 5, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 12369, 16433, 45, 241, 243, 71, 131, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (391, 289, 65.66740417480469, -167.9201202392578, 3554, -10066, 8936, -16609, 5, 34198, 2, 0, 209, 552, 534, 314, 188, 62, 40, 1525, 2413, 3119, 2740, 3032, 6114, 12267, 6409, 17084, 7635, 8240, 891, 534, 681, 2940, 2500, 3180, 3135, 2536, 3333, 330, 330, 10018, 10775, 7597, 7214, 7610, 8476, 14660, 16683, 17158, 20892, 13, 7, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 13, 15, 6, 12, 3, 2, 5, 3, 15, 15, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (391, 290, 65.66490936279297, -167.951904296875, 3545, -10069, 8936, -16612, 5, 34164, 2, 0, 212, 560, 530, 319, 192, 61, 38, 1525, 2421, 3143, 2763, 3055, 6184, 12425, 6502, 17326, 7729, 8391, 907, 542, 697, 2962, 2500, 3157, 3135, 2490, 3306, 330, 330, 9952, 10758, 7542, 7214, 7564, 8441, 14582, 16669, 17132, 20831, 13, 7, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 13, 15, 5, 12, 3, 2, 5, 3, 15, 15, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (391, 291, 65.66241455078125, -167.98362731933594, 3535, -10072, 8935, -16615, 5, 34129, 0, 0, 219, 586, 545, 320, 207, 70, 47, 1543, 2438, 3166, 2802, 3110, 6357, 12780, 6697, 17880, 8011, 8788, 938, 557, 704, 2962, 2500, 3172, 3128, 2490, 3319, 353, 353, 10018, 10691, 7542, 7186, 7557, 8441, 14590, 16614, 17131, 20971, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 11, 12, 15, 5, 12, 3, 2, 5, 3, 15, 15, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 0, 3, 0, 0, 0, 255, 255, [23, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (391, 292, 65.65991973876953, -168.01527404785156, 3526, -10075, 8935, -16618, 5, 34095, 0, 0, 228, 635, 548, 330, 234, 91, 63, 1542, 2446, 3198, 2848, 3165, 6639, 13364, 6985, 18685, 8480, 9494, 993, 573, 744, 2947, 2500, 3165, 3113, 2467, 3250, 353, 353, 9929, 10606, 7518, 7204, 7531, 8407, 14461, 16475, 16938, 20849, 13, 4, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 10, 11, 15, 6, 12, 3, 2, 5, 4, 15, 15, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 0, 3, 0, 0, 0, 255, 255, [23, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (392, 286, 65.68557739257812, -167.8292694091797, 3583, -10074, 8939, -16601, 6, 34303, 2, 0, 205, 586, 519, 302, 195, 65528, 36, 1511, 2365, 3033, 2638, 2931, 6076, 12187, 6396, 17037, 7800, 8827, 916, 521, 675, 2950, 2505, 3202, 3155, 2456, 3417, 343, 343, 9789, 10958, 7655, 7207, 7655, 8550, 14842, 16863, 17290, 20901, 13, 5, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 13, 15, 5, 11, 2, 2, 6, 3, 15, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 0, 6, 0, 12393, 16433, 45, 241, 243, 72, 131, [83, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (392, 287, 65.6830825805664, -167.8612823486328, 3573, -10077, 8939, -16604, 5, 34268, 2, 0, 211, 609, 527, 308, 217, 65528, 38, 1519, 2399, 3073, 2700, 2994, 6226, 12518, 6568, 17499, 8037, 9190, 948, 529, 699, 2957, 2497, 3195, 3140, 2525, 3362, 342, 342, 9765, 10857, 7609, 7207, 7635, 8508, 14686, 16766, 17165, 20820, 13, 5, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 11, 13, 15, 5, 12, 2, 3, 6, 3, 15, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 0, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (392, 288, 65.68058013916016, -167.8932342529297, 3564, -10079, 8938, -16606, 5, 34233, 2, 0, 209, 575, 527, 312, 206, 65528, 29, 1528, 2407, 3105, 2716, 3002, 6163, 12369, 6474, 17264, 7808, 8653, 908, 537, 691, 2950, 2497, 3187, 3132, 2502, 3361, 351, 351, 9601, 10724, 7571, 7188, 7596, 8460, 14572, 16655, 17127, 20820, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 13, 15, 5, 12, 2, 3, 6, 3, 15, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 0, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (392, 289, 65.6780776977539, -167.92510986328125, 3554, -10082, 8937, -16609, 5, 34198, 2, 0, 208, 538, 531, 314, 182, 65528, 37, 1519, 2415, 3105, 2732, 3017, 6061, 12148, 6357, 16927, 7539, 8101, 885, 529, 675, 2957, 2505, 3195, 3147, 2502, 3334, 352, 352, 9624, 10740, 7609, 7151, 7609, 8487, 14624, 16737, 17089, 20859, 13, 7, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 13, 15, 5, 11, 2, 3, 6, 3, 15, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 0, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (392, 290, 65.67557525634766, -167.9569091796875, 3545, -10085, 8937, -16612, 5, 34163, 0, 0, 212, 550, 530, 320, 185, 65528, 43, 1528, 2423, 3136, 2755, 3056, 6147, 12345, 6459, 17225, 7673, 8283, 885, 529, 683, 2965, 2497, 3195, 3147, 2479, 3334, 344, 344, 9600, 10774, 7608, 7179, 7628, 8508, 14659, 16737, 17113, 20818, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 13, 15, 5, 12, 2, 3, 6, 3, 15, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 0, 6, 0, 0, 3, 0, 0, 0, 255, 255, [23, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (392, 291, 65.67306518554688, -167.9886474609375, 3535, -10088, 8936, -16615, 5, 34129, 0, 0, 214, 574, 533, 322, 199, 65528, 49, 1527, 2423, 3160, 2786, 3088, 6297, 12668, 6623, 17664, 7910, 8630, 924, 545, 699, 2972, 2505, 3187, 3139, 2525, 3334, 351, 351, 9647, 10757, 7601, 7169, 7622, 8494, 14633, 16709, 17113, 21018, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 8, 7, 4, 5, 4, 7, 0, 0, 11, 12, 15, 5, 11, 2, 3, 6, 3, 15, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 0, 6, 0, 0, 3, 0, 0, 0, 255, 255, [23, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (392, 292, 65.67056274414062, -168.02029418945312, 3526, -10091, 8936, -16618, 5, 34095, 2, 0, 225, 627, 539, 327, 220, 65528, 56, 1527, 2431, 3176, 2833, 3150, 6604, 13291, 6951, 18566, 8416, 9411, 979, 568, 738, 2965, 2497, 3187, 3139, 2479, 3292, 350, 350, 9624, 10723, 7585, 7197, 7615, 8487, 14606, 16571, 17037, 20836, 13, 4, 6, 15, 15, 15, 15, 0, 10, 5, 7, 7, 4, 5, 4, 7, 0, 0, 10, 11, 15, 5, 12, 2, 3, 6, 3, 15, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 0, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (393, 286, 65.6962890625, -167.834228515625, 3583, -10089, 8940, -16601, 5, 34303, 1, 0, 203, 586, 515, 301, 208, 62, 39, 1504, 2362, 3033, 2647, 2933, 6076, 12190, 6396, 17048, 7825, 8887, 931, 518, 673, 2985, 2506, 3242, 3177, 2499, 3353, 341, 341, 10146, 11031, 7764, 7255, 7766, 8653, 14901, 16912, 17203, 21074, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 11, 14, 15, 5, 9, 2, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (393, 287, 65.69377899169922, -167.8662567138672, 3573, -10092, 8939, -16604, 5, 34268, 0, 0, 205, 592, 521, 303, 211, 61, 38, 1503, 2387, 3057, 2671, 2956, 6139, 12323, 6467, 17236, 7873, 8958, 931, 525, 681, 3000, 2499, 3235, 3185, 2476, 3339, 333, 333, 10101, 11014, 7749, 7264, 7779, 8674, 14910, 16840, 17229, 20975, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 11, 14, 15, 5, 10, 2, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 0, 3, 0, 0, 0, 255, 255, [23, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (393, 288, 65.6912612915039, -167.89822387695312, 3564, -10095, 8939, -16607, 5, 34233, 0, 0, 204, 542, 529, 304, 189, 59, 35, 1512, 2403, 3081, 2702, 2987, 6013, 12080, 6318, 16828, 7540, 8173, 892, 518, 666, 2978, 2499, 3227, 3163, 2476, 3353, 350, 350, 9966, 10849, 7679, 7236, 7707, 8585, 14724, 16670, 17097, 21013, 13, 7, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 14, 15, 5, 10, 2, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 0, 3, 0, 0, 0, 255, 255, [23, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (393, 289, 65.68875122070312, -167.93011474609375, 3554, -10098, 8938, -16610, 5, 34198, 2, 0, 203, 531, 529, 305, 169, 58, 35, 1521, 2403, 3097, 2726, 3003, 6013, 12064, 6310, 16812, 7460, 7990, 876, 525, 658, 2985, 2499, 3227, 3155, 2499, 3339, 343, 343, 9988, 10799, 7664, 7199, 7680, 8564, 14671, 16726, 17136, 21032, 13, 8, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 14, 15, 5, 10, 2, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (393, 290, 65.68623352050781, -167.9619140625, 3545, -10101, 8938, -16613, 5, 34163, 2, 0, 206, 546, 529, 311, 188, 64, 43, 1520, 2411, 3120, 2741, 3050, 6115, 12300, 6436, 17158, 7643, 8228, 900, 533, 673, 2985, 2506, 3227, 3148, 2453, 3339, 342, 342, 10011, 10832, 7679, 7255, 7680, 8585, 14724, 16698, 17162, 20953, 13, 7, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 13, 15, 5, 9, 2, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (393, 291, 65.6837158203125, -167.99365234375, 3535, -10104, 8937, -16616, 5, 34129, 2, 0, 211, 567, 536, 318, 199, 70, 45, 1520, 2420, 3128, 2773, 3074, 6265, 12590, 6585, 17559, 7850, 8530, 923, 549, 689, 3000, 2499, 3242, 3140, 2499, 3325, 342, 342, 9988, 10782, 7664, 7217, 7674, 8557, 14635, 16655, 17083, 20893, 13, 7, 6, 15, 15, 15, 15, 0, 10, 5, 7, 7, 4, 5, 4, 7, 0, 0, 11, 13, 15, 5, 10, 2, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 0, 2, 0, 0, 0, 255, 255, [81, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (393, 292, 65.68119812011719, -168.0253143310547, 3526, -10107, 8937, -16619, 5, 34095, 2, 0, 221, 628, 535, 324, 219, 78, 51, 1529, 2419, 3152, 2804, 3128, 6573, 13234, 6930, 18526, 8430, 9490, 986, 557, 728, 3007, 2491, 3242, 3170, 2453, 3339, 357, 357, 9988, 10832, 7702, 7245, 7713, 8605, 14688, 16711, 17161, 20951, 13, 5, 6, 15, 15, 15, 15, 0, 10, 5, 7, 7, 4, 5, 4, 7, 0, 0, 10, 13, 15, 5, 12, 2, 3, 6, 3, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 6, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (394, 286, 65.70700073242188, -167.83920288085938, 3583, -10105, 8941, -16601, 5, 34303, 0, 0, 200, 581, 516, 295, 202, 55, 28, 1489, 2346, 3018, 2636, 2906, 6020, 12097, 6352, 16932, 7760, 8872, 929, 517, 685, 3003, 2495, 3255, 3202, 2549, 3444, 330, 330, 10008, 11099, 7876, 7303, 7860, 8761, 14994, 16898, 17317, 20986, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 11, 14, 15, 5, 11, 3, 2, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 15, 28, 28, 6, 6, 6, 3, 6, 0, 0, 3, 0, 0, 0, 255, 255, [23, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (394, 287, 65.70447540283203, -167.87124633789062, 3573, -10108, 8940, -16604, 5, 34268, 2, 0, 200, 568, 515, 297, 200, 59, 31, 1497, 2354, 3042, 2651, 2929, 6012, 12065, 6336, 16885, 7681, 8659, 921, 525, 677, 3010, 2503, 3277, 3217, 2548, 3444, 330, 330, 10054, 11082, 7883, 7321, 7873, 8774, 14967, 16911, 17264, 20995, 14, 6, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 11, 13, 15, 5, 9, 3, 2, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 15, 28, 28, 6, 6, 6, 3, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (394, 288, 65.70195007324219, -167.90321350097656, 3564, -10111, 8940, -16607, 5, 34233, 2, 0, 197, 514, 520, 297, 172, 49, 32, 1506, 2370, 3058, 2667, 2937, 5869, 11783, 6161, 16411, 7286, 7798, 866, 517, 646, 3003, 2503, 3247, 3188, 2525, 3389, 339, 339, 9985, 10951, 7791, 7257, 7801, 8692, 14845, 16843, 17250, 20935, 14, 8, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 14, 15, 5, 9, 3, 2, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 15, 28, 28, 6, 6, 6, 3, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (394, 289, 65.69942474365234, -167.9351043701172, 3554, -10114, 8939, -16610, 5, 34198, 2, 0, 197, 513, 527, 301, 166, 51, 31, 1506, 2387, 3090, 2683, 2969, 5909, 11854, 6201, 16514, 7310, 7790, 866, 517, 654, 2980, 2495, 3232, 3180, 2525, 3389, 339, 339, 9962, 10918, 7738, 7239, 7748, 8623, 14792, 16720, 17093, 20954, 14, 8, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 14, 15, 5, 11, 3, 2, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 15, 28, 28, 6, 6, 6, 3, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (394, 290, 65.6968994140625, -167.96693420410156, 3545, -10117, 8939, -16613, 5, 34164, 2, 0, 204, 538, 529, 306, 185, 61, 37, 1514, 2395, 3105, 2730, 3008, 6067, 12183, 6376, 16988, 7563, 8146, 889, 525, 670, 3003, 2503, 3255, 3202, 2502, 3389, 339, 339, 9939, 10934, 7791, 7266, 7761, 8664, 14792, 16760, 17171, 21051, 13, 7, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 13, 15, 5, 9, 3, 2, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 15, 28, 28, 6, 6, 6, 3, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (394, 291, 65.69436645507812, -167.99867248535156, 3535, -10120, 8938, -16616, 5, 34129, 2, 0, 209, 569, 526, 314, 201, 67, 48, 1514, 2395, 3129, 2761, 3055, 6266, 12591, 6582, 17565, 7879, 8635, 921, 540, 693, 3003, 2488, 3255, 3180, 2502, 3375, 338, 338, 9962, 10835, 7745, 7248, 7748, 8643, 14739, 16637, 17145, 20923, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 8, 7, 4, 5, 4, 7, 0, 0, 11, 13, 15, 5, 14, 3, 2, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 15, 28, 28, 6, 6, 6, 3, 6, 0, 0, 2, 0, 0, 0, 255, 255, [81, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (394, 292, 65.69184112548828, -168.0303497314453, 3526, -10123, 8938, -16619, 6, 34095, 2, 0, 220, 651, 526, 318, 234, 85, 48, 1505, 2386, 3121, 2785, 3094, 6590, 13265, 6963, 18615, 8567, 9875, 1015, 564, 740, 3010, 2503, 3255, 3188, 2456, 3361, 345, 345, 9870, 10868, 7783, 7302, 7761, 8650, 14739, 16678, 17144, 20990, 13, 4, 6, 15, 15, 15, 15, 0, 10, 5, 8, 7, 4, 5, 4, 7, 0, 0, 10, 12, 15, 5, 9, 3, 2, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 15, 28, 28, 6, 6, 6, 3, 6, 0, 12383, 49, 43, 250, 248, 71, 131, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (395, 287, 65.71517181396484, -167.87623596191406, 3573, -10124, 8941, -16605, 5, 34268, 0, 0, 198, 542, 513, 300, 183, 60, 29, 1496, 2343, 3027, 2635, 2904, 5886, 11824, 6182, 16478, 7447, 8243, 888, 511, 654, 3031, 2498, 3290, 3230, 2519, 3464, 340, 340, 10093, 11046, 7932, 7323, 7919, 8816, 14994, 16941, 17302, 21015, 13, 7, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 13, 15, 5, 10, 3, 2, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 0, 3, 0, 0, 0, 255, 255, [23, -97, -114, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (395, 288, 65.71263885498047, -167.908203125, 3564, -10127, 8941, -16608, 5, 34233, 2, 0, 194, 500, 516, 295, 158, 47, 25, 1496, 2360, 3035, 2643, 2912, 5775, 11590, 6048, 16115, 7146, 7586, 841, 511, 638, 3001, 2498, 3260, 3186, 2519, 3409, 342, 342, 9957, 10878, 7800, 7279, 7815, 8713, 14916, 16818, 17263, 20857, 13, 8, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 13, 13, 15, 5, 10, 3, 3, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (395, 289, 65.71009826660156, -167.94012451171875, 3554, -10130, 8940, -16611, 6, 34198, 1, 0, 198, 505, 516, 299, 159, 57, 29, 1505, 2368, 3051, 2659, 2936, 5847, 11746, 6127, 16305, 7226, 7673, 849, 511, 646, 2994, 2490, 3229, 3186, 2519, 3422, 349, 349, 9957, 10861, 7762, 7252, 7743, 8645, 14838, 16831, 17237, 20876, 13, 8, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 13, 13, 15, 5, 12, 3, 3, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (395, 290, 65.70755767822266, -167.97195434570312, 3545, -10133, 8940, -16614, 6, 34164, 2, 0, 202, 530, 516, 305, 170, 59, 33, 1487, 2359, 3051, 2690, 2967, 5974, 12003, 6285, 16740, 7471, 8037, 888, 534, 661, 3024, 2498, 3275, 3223, 2474, 3422, 356, 356, 9957, 10928, 7893, 7332, 7847, 8740, 14855, 16776, 17249, 21150, 13, 7, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 12, 15, 5, 10, 3, 2, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 12421, 49, 43, 250, 248, 71, 131, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (395, 291, 65.70501708984375, -168.0037078857422, 3535, -10136, 8939, -16617, 6, 34129, 1, 0, 211, 587, 521, 310, 202, 76, 50, 1495, 2367, 3067, 2738, 3014, 6259, 12580, 6585, 17570, 7971, 8892, 935, 550, 701, 3061, 2505, 3297, 3223, 2541, 3409, 340, 340, 9979, 10894, 7916, 7332, 7873, 8761, 14838, 16775, 17160, 20953, 13, 6, 6, 15, 15, 15, 15, 0, 10, 5, 7, 8, 4, 5, 4, 7, 0, 0, 11, 12, 15, 4, 8, 3, 2, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 3, 6, 0, 0, 2, 0, 0, 0, 255, 255, [-47, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (396, 288, 65.72332000732422, -167.9132080078125, 3564, -10143, 8942, -16608, 5, 34233, 2, 0, 193, 492, 506, 293, 149, 65528, 23, 1499, 2334, 3021, 2614, 2881, 5710, 11442, 5980, 15879, 7044, 7474, 823, 504, 637, 3017, 2504, 3268, 3212, 2535, 3451, 347, 347, 10063, 11038, 7836, 7335, 7844, 8742, 14915, 16850, 17220, 20894, 13, 8, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 13, 14, 15, 5, 12, 2, 2, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 0, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (396, 289, 65.72077178955078, -167.94512939453125, 3554, -10146, 8941, -16611, 6, 34198, 2, 0, 195, 501, 510, 300, 157, 65528, 28, 1481, 2334, 3013, 2621, 2904, 5781, 11557, 6051, 16093, 7147, 7624, 847, 504, 637, 3017, 2504, 3253, 3205, 2490, 3410, 332, 332, 10017, 10938, 7821, 7291, 7805, 8707, 14853, 16850, 17207, 21072, 13, 8, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 13, 14, 15, 5, 12, 2, 2, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 0, 6, 0, 12431, 49, 44, 245, 245, 71, 131, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0]), (396, 290, 65.71821594238281, -167.9770050048828, 3545, -10149, 8941, -16614, 9, 34164, 1, 0, 200, 526, 511, 301, 170, 65528, 35, 1480, 2350, 3029, 2645, 2928, 5907, 11842, 6208, 16528, 7384, 7988, 870, 527, 661, 3054, 2504, 3291, 3235, 2490, 3424, 354, 354, 10039, 10988, 7958, 7395, 7902, 8811, 14853, 16836, 17231, 20852, 13, 7, 6, 15, 15, 15, 15, 0, 10, 5, 8, 8, 4, 5, 4, 7, 0, 0, 12, 13, 15, 5, 12, 2, 2, 6, 3, 15, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 6, 6, 6, 0, 6, 0, 0, 2, 0, 0, 0, 255, 255, [83, -97, 14, -111, 0, 0], [13, -128, -114, 4, 0, 0, 11, 3, 20, 1], [0, 0, 0, 0, 0])], dtype=[('mxd03_granule_row', ' size_save) # check chunksizes f.close() f = Dataset(self.files[6]) checkarray2 = _quantize(array2,lsd) assert_almost_equal(checkarray2,f.variables['data2'][:]) assert f.variables['data2'].filters() == {'zlib':True,'shuffle':True,'complevel':6,'fletcher32':True} assert f.variables['data2'].chunking() == [chunk1,chunk2] f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_create_mem.py000066400000000000000000000016341413751447500214410ustar00rootroot00000000000000import unittest import netCDF4 import numpy as np from numpy.testing import assert_array_equal class TestCreateMem(unittest.TestCase): def test_mem_create(self): def check_inmemory(format): # memory is 'advisory size' - not needed for NETCDF4/HDF5 # but is used for NETCDF3. nc = netCDF4.Dataset('test.nc','w',memory=1028,format=format) d = nc.createDimension('x',None) v = nc.createVariable('v',np.int32,'x') data = np.arange(5) v[0:5] = data # retrieve memory buffer b = nc.close() # open a new file using this memory buffer nc2 = netCDF4.Dataset('test2.nc','r',memory=b) assert_array_equal(nc2['v'][:],data) nc2.close() check_inmemory('NETCDF3_CLASSIC') check_inmemory('NETCDF4_CLASSIC') if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_dap.py000066400000000000000000000022701413751447500201010ustar00rootroot00000000000000import unittest import netCDF4 from numpy.testing import assert_array_almost_equal # test accessing data over http with opendap. URL = "http://remotetest.unidata.ucar.edu/thredds/dodsC/testdods/testData.nc" URL_https = 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/modis/L3/aqua/11um/v2019.0/4km/daily/2017/365/AQUA_MODIS.20171231.L3m.DAY.NSST.sst.4km.nc' varname = 'Z_sfc' varmin = 0 varmax = 3292 varshape = (1,95,135) class DapTestCase(unittest.TestCase): def setUp(self): pass def tearDown(self): pass def runTest(self): """testing access of data over http using opendap""" ncfile = netCDF4.Dataset(URL) assert varname in ncfile.variables.keys() var = ncfile.variables[varname] assert var.shape == varshape data = var[:] assert_array_almost_equal(data.min(),varmin) assert_array_almost_equal(data.max(),varmax) ncfile.close() # test https support (linked curl lib must built with openssl support) ncfile = netCDF4.Dataset(URL_https) assert(ncfile['sst'].long_name=='Sea Surface Temperature') ncfile.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_dims.py000066400000000000000000000114011413751447500202650ustar00rootroot00000000000000import sys import unittest import os import tempfile from numpy.random.mtrand import uniform import netCDF4 FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name LAT_NAME="lat" LAT_LEN = 25 LAT_LENG = 50 LON_NAME="lon" LON_LEN = 50 LON_LENG = 100 LEVEL_NAME="level" LEVEL_LEN = None LEVEL_LENG = None TIME_NAME="time" TIME_LEN = None TIME_LENG = None GROUP_NAME='forecasts' VAR_NAME='temp' VAR_TYPE='f8' class DimensionsTestCase(unittest.TestCase): def setUp(self): self.file = FILE_NAME f = netCDF4.Dataset(self.file, 'w') f.createDimension(LAT_NAME,LAT_LEN) f.createDimension(LON_NAME,LON_LEN) f.createDimension(LEVEL_NAME,LEVEL_LEN) f.createDimension(TIME_NAME,TIME_LEN) f.createVariable(VAR_NAME,VAR_TYPE,(LEVEL_NAME, LAT_NAME, LON_NAME, TIME_NAME)) g = f.createGroup(GROUP_NAME) g.createDimension(LAT_NAME,LAT_LENG) g.createDimension(LON_NAME,LON_LENG) # should get dimensions from parent group. # (did not work prior to alpha 18) #g.createDimension(LEVEL_NAME,LEVEL_LENG) #g.createDimension(TIME_NAME,TIME_LENG) g.createVariable(VAR_NAME,VAR_TYPE,(LEVEL_NAME, LAT_NAME, LON_NAME, TIME_NAME)) f.close() def tearDown(self): # Remove the temporary file os.remove(self.file) def runTest(self): """testing dimensions""" # check dimensions in root group. f = netCDF4.Dataset(self.file, 'r+') v = f.variables[VAR_NAME] isunlim = [dim.isunlimited() for dim in f.dimensions.values()] dimlens = [len(dim) for dim in f.dimensions.values()] names_check = [LAT_NAME, LON_NAME, LEVEL_NAME, TIME_NAME] lens_check = [LAT_LEN, LON_LEN, LEVEL_LEN, TIME_LEN] isunlim = [dimlen == None for dimlen in lens_check] for n,dimlen in enumerate(lens_check): if dimlen is None: lens_check[n] = 0 lensdict = dict(zip(names_check,lens_check)) unlimdict = dict(zip(names_check,isunlim)) # check that dimension names are correct. for name in f.dimensions.keys(): self.assertTrue(name in names_check) # check that dimension lengths are correct. for name,dim in f.dimensions.items(): self.assertTrue(len(dim) == lensdict[name]) # check that isunlimited() method works. for name,dim in f.dimensions.items(): self.assertTrue(dim.isunlimited() == unlimdict[name]) # add some data to variable along unlimited dims, # make sure length of dimensions change correctly. nadd1 = 2 nadd2 = 4 v[0:nadd1,:,:,0:nadd2] = uniform(size=(nadd1,LAT_LEN,LON_LEN,nadd2)) lensdict[LEVEL_NAME]=nadd1 lensdict[TIME_NAME]=nadd2 # check that dimension lengths are correct. for name,dim in f.dimensions.items(): self.assertTrue(len(dim) == lensdict[name]) # check dimensions in subgroup. g = f.groups[GROUP_NAME] vg = g.variables[VAR_NAME] isunlim = [dim.isunlimited() for dim in g.dimensions.values()] dimlens = [len(dim) for dim in g.dimensions.values()] names_check = [LAT_NAME, LON_NAME, LEVEL_NAME, TIME_NAME] lens_check = [LAT_LENG, LON_LENG, LEVEL_LENG, TIME_LENG] isunlim = [dimlen == None for dimlen in lens_check] for n,dimlen in enumerate(lens_check): if dimlen is None: lens_check[n] = 0 lensdict = dict(zip(names_check,lens_check)) unlimdict = dict(zip(names_check,isunlim)) # check that dimension names are correct. for name in g.dimensions.keys(): self.assertTrue(name in names_check) # check that dimension lengths are correct. for name,dim in g.dimensions.items(): self.assertTrue(len(dim) == lensdict[name]) # check get_dims variable method dim_tuple = vg.get_dims() # some dimensions from parent group dim_tup1 = (f.dimensions['level'],g.dimensions['lat'],\ g.dimensions['lon'],f.dimensions['time']) dim_tup2 = vg.get_dims() assert(dim_tup1 == dim_tup2) # check that isunlimited() method works. for name,dim in g.dimensions.items(): self.assertTrue(dim.isunlimited() == unlimdict[name]) # add some data to variable along unlimited dims, # make sure length of dimensions change correctly. nadd1 = 8 nadd2 = 4 vg[0:nadd1,:,:,0:nadd2] = uniform(size=(nadd1,LAT_LENG,LON_LENG,nadd2)) lensdict[LEVEL_NAME]=nadd1 lensdict[TIME_NAME]=nadd2 for name,dim in g.dimensions.items(): self.assertTrue(len(dim) == lensdict[name]) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_diskless.py000066400000000000000000000057011413751447500211600ustar00rootroot00000000000000import unittest, os, tempfile import numpy as np from numpy.random.mtrand import uniform from numpy.testing import assert_array_equal, assert_array_almost_equal import netCDF4 # rudimentary test of diskless file capability. # create an n1dim by n2dim by n3dim random array n1dim = 10 n2dim = 73 n3dim = 144 ranarr = 100.*uniform(size=(n1dim,n2dim,n3dim)) ranarr2 = 100.*uniform(size=(n1dim,n2dim,n3dim)) FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=True).name FILE_NAME2 = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name class DisklessTestCase(unittest.TestCase): def setUp(self): # in memory file, does not exist on disk (closing it # makes data disappear from memory) self.file = FILE_NAME f = netCDF4.Dataset(self.file,'w',diskless=True, persist=False) self.f = f # foo has a single unlimited dimension f.createDimension('n1', n1dim) f.createDimension('n2', n2dim) f.createDimension('n3', n3dim) foo = f.createVariable('data1', ranarr.dtype.str[1:], ('n1','n2','n3')) # write some data to it. foo[0:n1dim-1] = ranarr[:-1,:,:] foo[n1dim-1] = ranarr[-1,:,:] # bar has 2 unlimited dimensions f.createDimension('n4', None) # write some data to it. bar = f.createVariable('data2', ranarr.dtype.str[1:], ('n1','n2','n4')) bar[0:n1dim,:, 0:n3dim] = ranarr2 # in memory file, that is persisted to disk when close method called. self.file2 = FILE_NAME2 f2 = netCDF4.Dataset(self.file2,'w',diskless=True, persist=True) f2.createDimension('n1', n1dim) f2.createDimension('n2', n2dim) f2.createDimension('n3', n3dim) foo = f2.createVariable('data1', ranarr.dtype.str[1:], ('n1','n2','n3')) # write some data to it. foo[0:n1dim-1] = ranarr[:-1,:,:] foo[n1dim-1] = ranarr[-1,:,:] f2.close() def tearDown(self): # Remove the temporary files os.remove(self.file2) self.f.close() def runTest(self): """testing diskless file capability""" foo = self.f.variables['data1'] bar = self.f.variables['data2'] # check shape. self.assertTrue(foo.shape == (n1dim,n2dim,n3dim)) self.assertTrue(bar.shape == (n1dim,n2dim,n3dim)) # check data. assert_array_almost_equal(foo[:], ranarr) assert_array_almost_equal(bar[:], ranarr2) # file does not actually exist on disk assert(os.path.isfile(self.file)==False) # open persisted file. # first, check that file does actually exist on disk assert(os.path.isfile(self.file2)==True) f = netCDF4.Dataset(self.file2) foo = f.variables['data1'] # check shape. self.assertTrue(foo.shape == (n1dim,n2dim,n3dim)) # check data. assert_array_almost_equal(foo[:], ranarr) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_endian.py000066400000000000000000000136361413751447500206030ustar00rootroot00000000000000import netCDF4 import numpy as np import unittest, os, tempfile from numpy.testing import assert_array_equal, assert_array_almost_equal data = np.arange(12,dtype='f4').reshape(3,4) FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name FILE_NAME2 = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name FILE_NAME3 = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name def create_file(file,format,data): import warnings dataset = netCDF4.Dataset(file,'w',format=format) dataset.createDimension('time', None) dataset.createDimension('space', 4) dims = ('time', 'space') little = data.astype('f4') warnings.simplefilter('ignore') # ignore UserWarnings generated below ll = dataset.createVariable('little-little', 'f4', dims) bb = dataset.createVariable('big-big', '>f4', dims) ll[:] = little lb[:] = big bl[:] = little bb[:] = big dataset.close() def check_byteswap(file, data): # byteswapping is done internally to native endian format # when numpy array has non-native byte order. The byteswap was # initially done in place, which caused the numpy array to # be modified in the calling program. Pull request #555 # changed the byteswap to a copy, and this test checks # to make sure the input numpy array is not modified. dataset = netCDF4.Dataset(file,'w') dataset.createDimension('time', None) dataset.createDimension('space', 4) dims = ('time', 'space') bl = dataset.createVariable('big-little', np.float32, dims, endian='big') data2 = data.copy() bl[:] = data dataset.close() f = netCDF4.Dataset(file) bl = f.variables['big-little'][:] # check data. assert_array_almost_equal(data, data2) assert_array_almost_equal(bl, data) f.close() def check_data(file, data): f = netCDF4.Dataset(file) ll = f.variables['little-little'][:] lb = f.variables['little-big'][:] bb = f.variables['big-big'][:] bl = f.variables['big-little'][:] # check data. assert_array_almost_equal(ll, data) assert_array_almost_equal(lb, data) assert_array_almost_equal(bl, data) assert_array_almost_equal(bb, data) f.close() def issue310(file): mval = 999.; fval = -999 nc = netCDF4.Dataset(file, "w") nc.createDimension('obs', 10) if netCDF4.is_native_little: endian='big' elif netCDF4.is_native_big: endian='little' else: raise ValueError('cannot determine native endianness') var_big_endian = nc.createVariable(\ 'obs_big_endian', '>f8', ('obs', ),\ endian=endian,fill_value=fval) # use default _FillValue var_big_endian2 = nc.createVariable(\ 'obs_big_endian2', '>f8', ('obs', ),\ endian=endian) # NOTE: missing_value be written in same byte order # as variable, or masked array won't be masked correctly # when data is read in. var_big_endian.missing_value = mval var_big_endian[0]=np.pi var_big_endian[1]=mval var_big_endian2.missing_value = mval var_big_endian2[0]=np.pi var_big_endian2[1]=mval var_native_endian = nc.createVariable(\ 'obs_native_endian', ' '1.9.0': # fails for old numpy versions assert_equal(d1[m], ()) # Check that no assignment is made d1[m] = 0 assert_equal(d1[:], self.data1) # boolean slices, only single items returned. iby = np.array([True, False, False, False, False, False, False, False,\ False, False]) ibz = np.array([False, True, False, False, False, False, False, False,\ False,False,False]) assert_array_equal(v[:,iby,ibz],self.data[:,0:1,1:2]) # check slicing with unsorted integer sequences # and integer sequences with duplicate elements. v1 = v[:,[1],:]; v2 = v[:,[3],:]; v3 = v[:,[2],:] vcheck = np.concatenate((v1,v2,v3),axis=1) assert_array_equal(vcheck,v[:,[1,3,2],:]) vcheck = np.concatenate((v1,v3,v3),axis=1) assert_array_equal(vcheck,v[:,[1,2,2],:]) # Ellipse assert_array_equal(v[...,::2],self.data[..., ::2]) assert_array_equal(v[...,::-2],self.data[..., ::-2]) assert_array_equal(v[[1,2],...],self.data[[1,2],...]) assert_array_equal(v[0], self.data[0]) f.close() def test_set(self): f = Dataset(self.file, 'a') data = np.arange(xdim*ydim*zdim).reshape((xdim,ydim,zdim)).astype('i4') vu = f.variables['data'] vu[0,:,:] = data[0,:,:] assert_array_equal(vu[0,:,:], data[0,:,:]) vu[1:,:,:] = data[:] assert_array_equal(vu[1:, :, :], data) f.close() def test2unlim(self): """Test with a variable that has two unlimited dimensions.""" f = Dataset(self.file, 'a') f.createDimension('time',None) v = f.createVariable('u2data', 'i2', ('time', 'x', 'y')) xdim = len(f.dimensions['x']) data = np.arange(3*xdim*ydim).reshape((3, xdim, ydim)) v[:] = data assert_equal(v.shape, data.shape) v[3:6, 0:xdim, 0:ydim] = data try: assert_equal(v.shape, (6, xdim, ydim)) except AssertionError: import warnings warnings.warn(""" There seems to be a bug in the netCDF4 or HDF5 library that is installed on your computer. Please upgrade to the latest version to avoid being affected. This only matters if you use more than 1 unlimited dimension.""") raise AssertionError f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_filepath.py000066400000000000000000000020531413751447500211300ustar00rootroot00000000000000import os, sys, shutil import tempfile import unittest import netCDF4 class test_filepath(unittest.TestCase): def setUp(self): self.netcdf_file = os.path.join(os.getcwd(), "netcdf_dummy_file.nc") self.nc = netCDF4.Dataset(self.netcdf_file) def test_filepath(self): assert self.nc.filepath() == str(self.netcdf_file) def test_filepath_with_non_ascii_characters(self): # create nc-file in a filepath using a cp1252 string tmpdir = tempfile.mkdtemp() filepath = os.path.join(tmpdir,b'Pl\xc3\xb6n.nc'.decode('cp1252')) nc = netCDF4.Dataset(filepath,'w',encoding='cp1252') filepatho = nc.filepath(encoding='cp1252') assert filepath == filepatho assert filepath.encode('cp1252') == filepatho.encode('cp1252') nc.close() shutil.rmtree(tmpdir) def test_no_such_file_raises(self): fname = 'not_a_nc_file.nc' with self.assertRaisesRegex(IOError, fname): netCDF4.Dataset(fname, 'r') if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_get_variables_by_attributes.py000066400000000000000000000033531413751447500251070ustar00rootroot00000000000000import os import unittest import netCDF4 class VariablesByAttributesTests(unittest.TestCase): def setUp(self): netcdf_file = os.path.join(os.path.dirname(__file__), "netcdf_dummy_file.nc") self.nc = netCDF4.Dataset(netcdf_file) def test_find_variables_by_single_attribute(self): vs = self.nc.get_variables_by_attributes(axis='Z') self.assertEqual(len(vs), 1) vs = self.nc.get_variables_by_attributes(units='m/s') self.assertEqual(len(vs), 4) def test_find_variables_by_multiple_attribute(self): vs = self.nc.get_variables_by_attributes(axis='Z', units='m') self.assertEqual(len(vs), 1) def test_find_variables_by_single_lambda(self): vs = self.nc.get_variables_by_attributes(axis=lambda v: v in ['X', 'Y', 'Z', 'T']) self.assertEqual(len(vs), 1) vs = self.nc.get_variables_by_attributes(grid_mapping=lambda v: v is not None) self.assertEqual(len(vs), 12) def test_find_variables_by_multiple_lambdas(self): vs = self.nc.get_variables_by_attributes(grid_mapping=lambda v: v is not None, long_name=lambda v: v is not None and 'Upward (w) velocity' in v) self.assertEqual(len(vs), 1) def test_find_variables_by_attribute_and_lambda(self): vs = self.nc.get_variables_by_attributes(units='m/s', grid_mapping=lambda v: v is not None) self.assertEqual(len(vs), 4) vs = self.nc.get_variables_by_attributes(grid_mapping=lambda v: v is not None, long_name='Upward (w) velocity') self.assertEqual(len(vs), 1) if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_grps.py000066400000000000000000000047271413751447500203210ustar00rootroot00000000000000import sys import unittest import os import tempfile import netCDF4 # test group creation. FILE_NAME1 = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name FILE_NAME2 = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name DYNASTY = "Tudor" HENRY_VII = "Henry_VII" MARGARET = "Margaret" JAMES_V_OF_SCOTLAND = "James_V_of_Scotland" MARY_I_OF_SCOTLAND = "Mary_I_of_Scotland" JAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND = "James_VI_of_Scotland_and_I_of_England" names = [HENRY_VII,MARGARET,JAMES_V_OF_SCOTLAND,MARY_I_OF_SCOTLAND,JAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND] root = '/' TREE1 = [root] for n in range(1,len(names)+1): path = [] for name in names[0:n]: path.append(root+name) TREE1.append(''.join(path)) TREE2 = [root,root+DYNASTY] for name in names: TREE2.append(root+DYNASTY+root+name) TREE2.sort() # python generator to walk the Group tree. def walktree(top): yield top.groups.values() for value in top.groups.values(): yield from walktree(value) class GroupsTestCase(unittest.TestCase): def setUp(self): self.file1 = FILE_NAME1 f = netCDF4.Dataset(self.file1, 'w') g1 = f.createGroup(HENRY_VII) g2 = g1.createGroup(MARGARET) g3 = g2.createGroup(JAMES_V_OF_SCOTLAND) g4 = g3.createGroup(MARY_I_OF_SCOTLAND) g5 = g4.createGroup(JAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND) f.close() self.file2 = FILE_NAME2 f = netCDF4.Dataset(self.file2, 'w') g1 = netCDF4.Group(f,DYNASTY) g2 = g1.createGroup(HENRY_VII) g3 = g1.createGroup(MARGARET) g4 = g1.createGroup(JAMES_V_OF_SCOTLAND) g5 = g1.createGroup(MARY_I_OF_SCOTLAND) g6 = g1.createGroup(JAMES_VI_OF_SCOTLAND_AND_I_OF_ENGLAND) f.close() def tearDown(self): # Remove the temporary files os.remove(self.file1) os.remove(self.file2) def runTest(self): """testing groups""" f = netCDF4.Dataset(self.file1, 'r') # issue 988 f.name tree = [f.path] for children in walktree(f): for child in children: tree.append(child.path) f.close() assert tree == TREE1 f = netCDF4.Dataset(self.file2, 'r') tree = [f.path] for children in walktree(f): for child in children: tree.append(child.path) tree.sort() f.close() assert tree == TREE2 if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_grps2.py000066400000000000000000000024661413751447500204010ustar00rootroot00000000000000import sys import unittest import os import tempfile import netCDF4 # test implicit group creation by using unix-like paths # in createVariable and createGroups (added in 1.1.8). # also test Dataset.__getitem__, also added in 1.1.8. FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name class Groups2TestCase(unittest.TestCase): def setUp(self): self.file = FILE_NAME f = netCDF4.Dataset(self.file,'w') x = f.createDimension('x',10) # create groups in path if they don't already exist v = f.createVariable('/grouped/data/v',float,('x',)) g = f.groups['grouped'] # create groups underneath 'grouped' v2 = g.createVariable('./data/data2/v2',float,('x',)) f.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing implicit group and creation and Dataset.__getitem__""" f = netCDF4.Dataset(self.file, 'r') v1 = f['/grouped/data/v'] v2 = ((f.groups['grouped']).groups['data']).variables['v'] g = f['/grouped/data'] v3 = g['data2/v2'] assert(v1 == v2) assert(g == f.groups['grouped'].groups['data']) assert(v3.name == 'v2') f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_issue908.py000066400000000000000000000005721413751447500207310ustar00rootroot00000000000000import netCDF4, unittest import numpy as np class Issue908TestCase(unittest.TestCase): def setUp(self): nc = netCDF4.Dataset('CRM032_test1.nc') self.nc = nc def tearDown(self): self.nc.close() def runTest(self): data = self.nc['rgrid'][:] assert(data.all() is np.ma.masked) if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_masked.py000066400000000000000000000132561413751447500206070ustar00rootroot00000000000000import sys import unittest import os import tempfile import numpy as np from numpy import ma from numpy.testing import assert_array_equal, assert_array_almost_equal from numpy.random.mtrand import uniform import netCDF4 from numpy.ma import masked_all # test automatic conversion of masked arrays, and # packing/unpacking of short ints. # create an n1dim by n2dim random ranarr. FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name FILE_NAME2 = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name ndim = 10 ranarr = 100.*uniform(size=(ndim)) ranarr2 = 100.*uniform(size=(ndim)) # used for checking vector missing_values arr3 = np.linspace(0,9,ndim) mask = np.zeros(ndim,np.bool_); mask[-1]=True; mask[-2]=True marr3 = np.ma.array(arr3, mask=mask, dtype=np.int32) packeddata = 10.*uniform(size=(ndim)) missing_value = -9999. missing_value2 = np.nan missing_value3 = [8,9] ranarr[::2] = missing_value ranarr2[::2] = missing_value2 np.seterr(invalid='ignore') # silence warnings from ma.masked_values maskedarr = ma.masked_values(ranarr,missing_value) #maskedarr2 = ma.masked_values(ranarr2,missing_value2) maskedarr2 = ma.masked_invalid(ranarr2) scale_factor = (packeddata.max()-packeddata.min())/(2.*32766.) add_offset = 0.5*(packeddata.max()+packeddata.min()) packeddata2 = np.around((packeddata-add_offset)/scale_factor).astype('i2') class PrimitiveTypesTestCase(unittest.TestCase): def setUp(self): self.file = FILE_NAME self.file2 = FILE_NAME2 file = netCDF4.Dataset(self.file,'w') file.createDimension('n', ndim) foo = file.createVariable('maskeddata', 'f8', ('n',)) foo2 = file.createVariable('maskeddata2', 'f8', ('n',)) foo3 = file.createVariable('maskeddata3', 'i4', ('n',)) foo.missing_value = missing_value foo.set_auto_maskandscale(True) foo2.missing_value = missing_value2 foo2.set_auto_maskandscale(True) foo3.missing_value = missing_value3 foo3.set_auto_maskandscale(True) bar = file.createVariable('packeddata', 'i2', ('n',)) bar.set_auto_maskandscale(True) bar.scale_factor = scale_factor bar.add_offset = add_offset foo[:] = maskedarr foo2[:] = maskedarr2 foo3[:] = arr3 bar[:] = packeddata # added to test fix to issue 46 doh = file.createVariable('packeddata2','i2','n') doh.scale_factor = 0.1 doh.add_offset = 0. doh[0] = 1.1 # added to test fix to issue 381 doh2 = file.createVariable('packeddata3','i2','n') doh2.add_offset = 1. doh2[0] = 1. # added test for issue 515 file.createDimension('x',1) v = file.createVariable('v',np.float64,'x',fill_value=-9999) file.close() # issue #972: when auto_fill off byte arrays (u1,i1) should # not be masked, but other datatypes should. dataset = netCDF4.Dataset(self.file2, "w") dataset.set_fill_off() dim = dataset.createDimension("dim", 10) var1 = dataset.createVariable("var1", "f8", (dim.name,)) var1[:] = masked_all((10,), "f8") var2 = dataset.createVariable("var2", "u1", (dim.name,)) var2[:] = masked_all((10,), "u1") dataset.close() def tearDown(self): # Remove the temporary files os.remove(self.file) os.remove(self.file2) def runTest(self): """testing auto-conversion of masked arrays and packed integers""" file = netCDF4.Dataset(self.file) datamasked = file.variables['maskeddata'] datamasked2 = file.variables['maskeddata2'] datamasked3 = file.variables['maskeddata3'] datapacked = file.variables['packeddata'] datapacked2 = file.variables['packeddata2'] datapacked3 = file.variables['packeddata3'] # check missing_value, scale_factor and add_offset attributes. assert datamasked.missing_value == missing_value assert datapacked.scale_factor == scale_factor assert datapacked.add_offset == add_offset # no auto-conversion. datamasked.set_auto_maskandscale(False) datamasked2.set_auto_maskandscale(False) datapacked.set_auto_maskandscale(False) assert_array_equal(datapacked[:],packeddata2) assert_array_equal(datamasked3[:],marr3) assert_array_almost_equal(datamasked[:],ranarr) assert_array_almost_equal(datamasked2[:],ranarr2) # auto-conversion datamasked.set_auto_maskandscale(True) datamasked2.set_auto_maskandscale(True) datapacked.set_auto_maskandscale(True) datapacked2.set_auto_maskandscale(False) assert_array_almost_equal(datamasked[:].filled(),ranarr) assert_array_almost_equal(datamasked2[:].filled(),ranarr2) assert_array_almost_equal(datapacked[:],packeddata,decimal=4) assert(datapacked3[:].dtype == np.float64) # added to test fix to issue 46 (result before r865 was 10) assert_array_equal(datapacked2[0],11) # added test for issue 515 assert(file['v'][0] is np.ma.masked) file.close() # issue 766 np.seterr(invalid='raise') f = netCDF4.Dataset(self.file, 'w') f.createDimension('dimension', 2) f.createVariable('variable', np.float32, dimensions=('dimension',)) f['variable'][:] = np.nan data = f['variable'][:] # should not raise an error f.close() # issue #972 dataset = netCDF4.Dataset(self.file2, "r") var1 = dataset.variables["var1"] var2 = dataset.variables["var2"] assert var1[:].mask.all() assert var2[:].mask.any() == False dataset.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_masked2.py000077500000000000000000000101631413751447500206660ustar00rootroot00000000000000import sys import unittest import os import tempfile import numpy as np from numpy import ma, seterr from numpy.testing import assert_array_equal, assert_array_almost_equal from netCDF4 import Dataset, default_fillvals seterr(over='ignore') # don't print warning for overflow errors # test automatic conversion of masked arrays, and # packing/unpacking of short ints. FILE_NAME1 = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name FILE_NAME2 = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name FILE_NAME3 = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name datacheck1 =\ ma.array([0,5000.0,4000.0,0],dtype=np.float64,mask=[True,False,False,True]) datacheck2 =\ ma.array([3000.0,5000.0,4000.0,0],dtype=np.float64,mask=[False,False,False,True]) datacheck3 =\ ma.array([3000.0,5000.0,0,2000.0],dtype=np.float64,mask=[False,False,True,False]) mask = [False,True,False,False] datacheck4 = ma.array([1.5625,0,3.75,4.125],mask=mask,dtype=np.float32) fillval = default_fillvals[datacheck4.dtype.str[1:]] datacheck5 = np.array([1.5625,fillval,3.75,4.125],dtype=np.float32) class PrimitiveTypesTestCase(unittest.TestCase): def setUp(self): self.files = [FILE_NAME1] f = Dataset(FILE_NAME1,'w') x = f.createDimension('x',None) v = f.createVariable('v',np.int16,'x') v.scale_factor = np.array(1,np.float32) v.add_offset = np.array(32066,np.float32) v.missing_value = np.array(-9999,v.dtype) #v[0] not set, will be equal to _FillValue v[1]=5000 v[2]=4000 v[3]=v.missing_value f.close() self.files.append(FILE_NAME2) f = Dataset(FILE_NAME1,'r') # create a new file, copy data, but change missing value and # scale factor offset. f2 = Dataset(FILE_NAME2,'w') a = f2.createDimension('a',None) b = f2.createVariable('b',np.int16,'a') b.scale_factor = np.array(10.,np.float32) b.add_offset = np.array(0,np.float32) b.missing_value = np.array(9999,v.dtype) b[:] = f.variables['v'][:] f.close() f2.close() self.files.append(FILE_NAME3) f = Dataset(FILE_NAME3,'w') x = f.createDimension('x',None) # create variable with lossy compression v = f.createVariable('v',np.float32,'x',zlib=True,least_significant_digit=1) # assign masked array to that variable with one missing value. data =\ ma.array([1.5678,99.99,3.75145,4.127654],mask=np.array([False,True,False,False],np.bool_)) data.mask[1]=True v[:] = data f.close() def tearDown(self): # Remove the temporary files for f in self.files: os.remove(f) def runTest(self): """testing auto-conversion of masked arrays and packed integers""" f = Dataset(self.files[0]) data = f.variables['v'][:] assert_array_almost_equal(data,datacheck1) f.close() f = Dataset(self.files[1]) data = f.variables['b'][:] assert_array_almost_equal(data,datacheck1) f.close() f = Dataset(self.files[0],'a') # change first element from _FillValue to actual data. v = f.variables['v'] v[0]=3000 f.close() f = Dataset(self.files[0],'r') # read data back in, check. data = f.variables['v'][:] assert_array_almost_equal(data,datacheck2) f.close() f = Dataset(self.files[0],'a') # change 3rd element to missing, 4 element to valid data. v = f.variables['v'] data = v[:] v[2]=-9999 v[3]=2000 f.close() f = Dataset(self.files[0],'r') # read data back in, check. data = f.variables['v'][:] assert_array_almost_equal(data,datacheck3) f.close() # check that masked arrays are handled correctly when lossy compression # is used. f = Dataset(self.files[2],'r') data = f.variables['v'][:] assert_array_almost_equal(data,datacheck4) assert_array_almost_equal(data.filled(),datacheck5) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_masked3.py000077500000000000000000000127001413751447500206660ustar00rootroot00000000000000import unittest import os import tempfile import numpy as np from numpy import ma from numpy.testing import assert_array_almost_equal from netCDF4 import Dataset, default_fillvals # Test automatic conversion of masked arrays (set_auto_mask()) class SetAutoMaskTestBase(unittest.TestCase): """Base object for tests checking the functionality of set_auto_mask()""" def setUp(self): self.testfile = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name self.fillval = default_fillvals["i2"] self.v = np.array([self.fillval, 5, 4, -9999], dtype = "i2") self.v_ma = ma.array([self.fillval, 5, 4, -9999], dtype = "i2", mask = [True, False, False, True]) self.scale_factor = 10. self.add_offset = 5. self.v_scaled = self.v * self.scale_factor + self.add_offset self.v_ma_scaled = self.v_ma * self.scale_factor + self.add_offset f = Dataset(self.testfile, 'w') _ = f.createDimension('x', None) v = f.createVariable('v', "i2", 'x') v.missing_value = np.array(-9999, v.dtype) # v[0] not set, will be equal to _FillValue v[1] = self.v[1] v[2] = self.v[2] v[3] = v.missing_value f.close() def tearDown(self): os.remove(self.testfile) class SetAutoMaskFalse(SetAutoMaskTestBase): def test_unscaled(self): """Testing auto-conversion of masked arrays for set_auto_mask(False)""" f = Dataset(self.testfile, "r") f.variables["v"].set_auto_mask(False) v = f.variables["v"][:] self.assertEqual(v.dtype, "i2") self.assertTrue(isinstance(v, np.ndarray)) self.assertTrue(not isinstance(v, ma.core.MaskedArray)) assert_array_almost_equal(v, self.v) f.close() def test_scaled(self): """Testing auto-conversion of masked arrays for set_auto_mask(False) with scaling""" # Update test data file f = Dataset(self.testfile, "a") f.variables["v"].scale_factor = self.scale_factor f.variables["v"].add_offset = self.add_offset f.close() # Note: Scaling variables is default if scale_factor and/or add_offset are present f = Dataset(self.testfile, "r") f.variables["v"].set_auto_mask(False) v = f.variables["v"][:] self.assertEqual(v.dtype, "f8") self.assertTrue(isinstance(v, np.ndarray)) self.assertTrue(not isinstance(v, ma.core.MaskedArray)) assert_array_almost_equal(v, self.v_scaled) f.close() class SetAutoMaskTrue(SetAutoMaskTestBase): def test_unscaled(self): """Testing auto-conversion of masked arrays for set_auto_mask(True)""" f = Dataset(self.testfile) f.variables["v"].set_auto_mask(True) # The default anyway... v_ma = f.variables['v'][:] self.assertEqual(v_ma.dtype, "i2") self.assertTrue(isinstance(v_ma, np.ndarray)) self.assertTrue(isinstance(v_ma, ma.core.MaskedArray)) assert_array_almost_equal(v_ma, self.v_ma) f.close() def test_scaled(self): """Testing auto-conversion of masked arrays for set_auto_mask(True)""" # Update test data file f = Dataset(self.testfile, "a") f.variables["v"].scale_factor = self.scale_factor f.variables["v"].add_offset = self.add_offset f.close() # Note: Scaling variables is default if scale_factor and/or add_offset are present f = Dataset(self.testfile) f.variables["v"].set_auto_mask(True) # The default anyway... v_ma = f.variables['v'][:] self.assertEqual(v_ma.dtype, "f8") self.assertTrue(isinstance(v_ma, np.ndarray)) self.assertTrue(isinstance(v_ma, ma.core.MaskedArray)) assert_array_almost_equal(v_ma, self.v_ma_scaled) f.close() class GlobalSetAutoMaskTest(unittest.TestCase): def setUp(self): self.testfile = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name f = Dataset(self.testfile, 'w') grp1 = f.createGroup('Group1') grp2 = f.createGroup('Group2') f.createGroup('Group3') # empty group f.createVariable('var0', "i2", ()) grp1.createVariable('var1', 'f8', ()) grp2.createVariable('var2', 'f4', ()) f.close() def tearDown(self): os.remove(self.testfile) def runTest(self): # Note: The default behaviour is to to have both auto-masking and auto-scaling activated. # This is already tested in tst_scaled.py, so no need to repeat here. Instead, # disable auto-masking and auto-scaling altogether. f = Dataset(self.testfile, "r") # Neither scaling and masking enabled f.set_auto_maskandscale(False) v0 = f.variables['var0'] v1 = f.groups['Group1'].variables['var1'] v2 = f.groups['Group2'].variables['var2'] self.assertFalse(v0.scale) self.assertFalse(v0.mask) self.assertFalse(v1.scale) self.assertFalse(v1.mask) self.assertFalse(v2.scale) self.assertFalse(v2.mask) # No auto-masking, but auto-scaling f.set_auto_maskandscale(True) f.set_auto_mask(False) self.assertTrue(v0.scale) self.assertFalse(v0.mask) self.assertTrue(v1.scale) self.assertFalse(v1.mask) self.assertTrue(v2.scale) self.assertFalse(v2.mask) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_masked4.py000077500000000000000000000100501413751447500206630ustar00rootroot00000000000000import unittest import os import tempfile import numpy as np from numpy import ma from numpy.testing import assert_array_almost_equal from netCDF4 import Dataset, default_fillvals # Test use of valid_min/valid_max/valid_range in generation of masked arrays class SetValidMinMax(unittest.TestCase): def setUp(self): self.testfile = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name self.valid_min = -32765 self.valid_max = 32765 self.valid_range = [self.valid_min,self.valid_max] self.v = np.array([self.valid_min-1, 5, 4, self.valid_max+1], dtype = "i2") self.v_ma = ma.array([self.valid_min-1, 5, 4, self.valid_max+1], dtype = "i2", mask = [True, False, False, True]) self.scale_factor = 10. self.add_offset = 5. self.v_scaled = self.v * self.scale_factor + self.add_offset self.v_ma_scaled = self.v_ma * self.scale_factor + self.add_offset f = Dataset(self.testfile, 'w') _ = f.createDimension('x', None) v = f.createVariable('v', "i2", 'x') v2 = f.createVariable('v2', "i2", 'x') v3 = f.createVariable('v3', "i2", 'x', fill_value=self.valid_min) v.missing_value = np.array(32767, v.dtype) v.valid_min = np.array(self.valid_min, v.dtype) v.valid_max = np.array(self.valid_max, v.dtype) v.valid_range = np.array(0, v.dtype) # issue 1013, this is wrong but should not raise an exception v[0] = self.valid_min-1 v[1] = self.v[1] v[2] = self.v[2] v[3] = self.valid_max+1 v2.missing_value = np.array(32767, v.dtype) v2.valid_range = np.array(self.valid_range, v.dtype) v2[0] = self.valid_range[0]-1 v2[1] = self.v[1] v2[2] = self.v[2] v2[3] = self.valid_range[1]+1 v3.missing_value = np.array(32767, v.dtype) v3.valid_max = np.array(self.valid_max, v.dtype) # _FillValue should act as valid_min v3[0] = v3._FillValue-1 v3[1] = self.v[1] v3[2] = self.v[2] v3[3] = self.valid_max+1 f.close() def tearDown(self): os.remove(self.testfile) def test_scaled(self): """Testing auto-conversion of masked arrays""" # Update test data file f = Dataset(self.testfile, "a") f.variables["v"].scale_factor = self.scale_factor f.variables["v"].add_offset = self.add_offset f.variables["v2"].scale_factor = self.scale_factor f.variables["v2"].add_offset = self.add_offset f.close() f = Dataset(self.testfile, "r") v = f.variables["v"][:] v2 = f.variables["v2"][:] v3 = f.variables["v3"][:] self.assertEqual(v.dtype, "f8") self.assertTrue(isinstance(v, np.ndarray)) self.assertTrue(isinstance(v, ma.core.MaskedArray)) assert_array_almost_equal(v, self.v_scaled) self.assertEqual(v2.dtype, "f8") self.assertTrue(isinstance(v2, np.ndarray)) self.assertTrue(isinstance(v2, ma.core.MaskedArray)) assert_array_almost_equal(v2, self.v_scaled) self.assertTrue(np.all(self.v_ma.mask == v.mask)) self.assertTrue(np.all(self.v_ma.mask == v2.mask)) # treating _FillValue as valid_min/valid_max was # too surprising, revert to old behaviour (issue #761) #self.assertTrue(np.all(self.v_ma.mask == v3.mask)) # check that underlying data is same as in netcdf file v = f.variables['v'] v.set_auto_scale(False) v = v[:] self.assertTrue(np.all(self.v == v.data)) f.close() # issue 672 f = Dataset('issue672.nc') field = 'azi_angle_trip' v = f.variables[field] data1 = v[:] v.set_auto_scale(False) data2 = v[:] v.set_auto_maskandscale(False) data3 = v[:] assert(data1[(data3 < v.valid_min)].mask.sum() == 12) assert(data2[(data3 < v.valid_min)].mask.sum() == data1[(data3 < v.valid_min)].mask.sum()) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_masked5.py000077500000000000000000000033731413751447500206760ustar00rootroot00000000000000import unittest import os import tempfile import numpy as np from numpy import ma from numpy.testing import assert_array_equal from netCDF4 import Dataset, __netcdf4libversion__ # Test use of vector of missing values. class VectorMissingValues(unittest.TestCase): def setUp(self): self.testfile = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name self.missing_values = [-999,999,0] self.v = np.array([-999,0,1,2,3,999], dtype = "i2") self.v_ma = ma.array([-1,0,1,2,3,4], dtype = "i2", \ mask = [True, True, False, False, False, True]) f = Dataset(self.testfile, 'w') d = f.createDimension('x',6) v = f.createVariable('v', "i2", 'x') # issue 730: set fill_value for vlen str vars v2 = f.createVariable('v2', str, 'x', fill_value='') v.missing_value = self.missing_values v[:] = self.v v2[0]='first' f.close() def tearDown(self): os.remove(self.testfile) def test_scaled(self): """Testing auto-conversion of masked arrays""" f = Dataset(self.testfile) v = f.variables["v"] v2 = f.variables["v2"] self.assertTrue(isinstance(v[:], ma.core.MaskedArray)) assert_array_equal(v[:], self.v_ma) assert_array_equal(v[2],self.v[2]) # issue #624. v.set_auto_mask(False) self.assertTrue(isinstance(v[:], np.ndarray)) assert_array_equal(v[:], self.v) # issue 730 # this part fails with netcdf 4.1.3 # a bug in vlen strings? if __netcdf4libversion__ >= '4.4.0': assert v2[0] == 'first' assert v2[1] == '' f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_masked6.py000066400000000000000000000070711413751447500206730ustar00rootroot00000000000000import unittest import os import tempfile import numpy as np from numpy import ma from numpy.testing import assert_array_almost_equal from netCDF4 import Dataset # Test automatic conversion of masked arrays (set_always_mask()) class SetAlwaysMaskTestBase(unittest.TestCase): """Base object for tests checking the functionality of set_always_mask()""" def setUp(self): self.testfile = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name self.v = np.array([4, 3, 2, 1], dtype="i2") self.w = np.ma.array([-1, -2, -3, -4], mask=[False, True, False, False], dtype="i2") f = Dataset(self.testfile, 'w') _ = f.createDimension('x', None) v = f.createVariable('v', "i2", 'x') w = f.createVariable('w', "i2", 'x') v[...] = self.v w[...] = self.w f.close() def tearDown(self): os.remove(self.testfile) class SetAlwaysMaskTrue(SetAlwaysMaskTestBase): def test_always_mask(self): """Testing auto-conversion of masked arrays with no missing values to regular arrays.""" f = Dataset(self.testfile) f.variables["v"].set_always_mask(True) # The default anyway... v = f.variables['v'][:] self.assertTrue(isinstance(v, np.ndarray)) self.assertTrue(isinstance(v, ma.core.MaskedArray)) assert_array_almost_equal(v, self.v) w = f.variables['w'][:] self.assertTrue(isinstance(w, np.ndarray)) self.assertTrue(isinstance(w, ma.core.MaskedArray)) assert_array_almost_equal(w, self.w) f.close() class SetAlwyasMaskFalse(SetAlwaysMaskTestBase): def test_always_mask(self): """Testing auto-conversion of masked arrays with no missing values to regular arrays.""" f = Dataset(self.testfile) f.variables["v"].set_always_mask(False) v = f.variables['v'][:] self.assertTrue(isinstance(v, np.ndarray)) self.assertFalse(isinstance(v, ma.core.MaskedArray)) assert_array_almost_equal(v, self.v) w = f.variables['w'][:] self.assertTrue(isinstance(w, np.ndarray)) self.assertTrue(isinstance(w, ma.core.MaskedArray)) assert_array_almost_equal(w, self.w) f.close() class GlobalSetAlwaysMaskTest(unittest.TestCase): def setUp(self): self.testfile = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name f = Dataset(self.testfile, 'w') grp1 = f.createGroup('Group1') grp2 = f.createGroup('Group2') f.createGroup('Group3') # empty group f.createVariable('var0', "i2", ()) grp1.createVariable('var1', 'f8', ()) grp2.createVariable('var2', 'f4', ()) f.close() def tearDown(self): os.remove(self.testfile) def runTest(self): # Note: The default behaviour is to always return masked # arrays, which is already tested elsewhere. f = Dataset(self.testfile, "r") # Without regular numpy arrays f.set_always_mask(True) v0 = f.variables['var0'] v1 = f.groups['Group1'].variables['var1'] v2 = f.groups['Group2'].variables['var2'] self.assertTrue(v0.always_mask) self.assertTrue(v1.always_mask) self.assertTrue(v2.always_mask) # With regular numpy arrays f.set_always_mask(False) self.assertFalse(v0.always_mask) self.assertFalse(v1.always_mask) self.assertFalse(v2.always_mask) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_multifile.py000066400000000000000000000141371413751447500213340ustar00rootroot00000000000000from netCDF4 import Dataset, MFDataset, MFTime import numpy as np from numpy.random import seed, randint from numpy.testing import assert_array_equal, assert_equal from numpy import ma import tempfile, unittest, os, datetime import cftime from pkg_resources import parse_version nx=100; ydim=5; zdim=10 nfiles = 10 ninc = nx/nfiles files = [tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name for nfile in range(nfiles)] data = randint(0,10,size=(nx,ydim,zdim)) missval = 99 data[::10] = missval data = ma.masked_values(data,missval) class VariablesTestCase(unittest.TestCase): def setUp(self): self.files = files for nfile,file in enumerate(self.files): f = Dataset(file,'w',format='NETCDF4_CLASSIC') f.createDimension('x',None) f.createDimension('y',ydim) f.createDimension('z',zdim) f.history = 'created today' x = f.createVariable('x','i',('x',)) x.units = 'zlotys' dat = f.createVariable('data','i',('x','y','z',)) dat.long_name = 'phony data' dat.missing_value = missval nx1 = int(nfile*ninc); nx2 = int(ninc*(nfile+1)) #x[0:ninc] = np.arange(nfile*ninc,ninc*(nfile+1)) x[:] = np.arange(nfile*ninc,ninc*(nfile+1)) #dat[0:ninc] = data[nx1:nx2] dat[:] = data[nx1:nx2] f.close() def tearDown(self): # Remove the temporary files for file in self.files: os.remove(file) def runTest(self): """testing multi-file dataset access""" f = MFDataset(self.files,check=True) f.set_auto_maskandscale(True) # issue570 f.set_always_mask(False) assert f.history == 'created today' assert_array_equal(np.arange(0,nx),f.variables['x'][:]) varin = f.variables['data'] datin = varin[:] assert_array_equal(datin.mask,data.mask) varin.set_auto_maskandscale(False) data2 = data.filled() assert varin.long_name == 'phony data' assert len(varin) == nx assert varin.shape == (nx,ydim,zdim) assert varin.dimensions == ('x','y','z') assert_array_equal(varin[4:-4:4,3:5,2:8],data2[4:-4:4,3:5,2:8]) assert varin[0,0,0] == data2[0,0,0] assert_array_equal(varin[:],data2) assert getattr(varin,'nonexistantatt',None) == None f.close() # test master_file kwarg (issue #835). f = MFDataset(self.files,master_file=self.files[-1],check=True) assert_array_equal(np.arange(0,nx),f.variables['x'][:]) varin = f.variables['data'] assert_array_equal(varin[4:-4:4,3:5,2:8],data2[4:-4:4,3:5,2:8]) f.close() # testing multi-file get_variables_by_attributes f = MFDataset(self.files,check=True) assert f.get_variables_by_attributes(axis='T') == [] f.get_variables_by_attributes(units='zlotys')[0] == f['x'] f.close() class NonuniformTimeTestCase(unittest.TestCase): ninc = 365 def setUp(self): self.files = [tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name for nfile in range(2)] for nfile,file in enumerate(self.files): f = Dataset(file,'w',format='NETCDF4_CLASSIC') f.createDimension('time',None) f.createDimension('y',ydim) f.createDimension('z',zdim) f.history = 'created today' time = f.createVariable('time', 'f', ('time', )) #time.units = 'days since {0}-01-01'.format(1979+nfile) yr = 1979+nfile time.units = 'days since %s-01-01' % yr # Do not set the calendar attribute on the created files to test calendar # overload. # time.calendar = 'standard' x = f.createVariable('x','f',('time', 'y', 'z')) x.units = 'potatoes per square mile' nx1 = self.ninc*nfile; nx2 = self.ninc*(nfile+1) time[:] = np.arange(self.ninc) x[:] = np.arange(nx1, nx2).reshape(self.ninc,1,1) * np.ones((1, ydim, zdim)) f.close() def tearDown(self): # Remove the temporary files for file in self.files: os.remove(file) def runTest(self): # The test files have no calendar attribute on the time variable. calendar = 'standard' # Get the real dates dates = [] for file in self.files: f = Dataset(file) t = f.variables['time'] dates.extend(cftime.num2date(t[:], t.units, calendar)) f.close() # Compare with the MF dates f = MFDataset(self.files,check=True) t = f.variables['time'] T = MFTime(t, calendar=calendar) assert_equal(T.calendar, calendar) assert_equal(len(T), len(t)) assert_equal(T.shape, t.shape) assert_equal(T.dimensions, t.dimensions) assert_equal(T.typecode(), t.typecode()) # skip this until cftime pull request #55 is in a released # version (1.0.1?). Otherwise, fix for issue #808 breaks this if parse_version(cftime.__version__) >= parse_version('1.0.1'): assert_array_equal(cftime.num2date(T[:], T.units, T.calendar), dates) assert_equal(cftime.date2index(datetime.datetime(1980, 1, 2), T), 366) f.close() # Test exception is raised when no calendar attribute is available on the # time variable. with MFDataset(self.files, check=True) as ds: with self.assertRaises(ValueError): MFTime(ds.variables['time']) # Test exception is raised when the calendar attribute is different on the # variables. First, add calendar attributes to file. Note this will modify # the files inplace. calendars = ['standard', 'gregorian'] for idx, f in enumerate(self.files): with Dataset(f, 'a') as ds: ds.variables['time'].calendar = calendars[idx] with MFDataset(self.files, check=True) as ds: with self.assertRaises(ValueError): MFTime(ds.variables['time']) if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_multifile2.py000066400000000000000000000115211413751447500214100ustar00rootroot00000000000000from netCDF4 import Dataset, MFDataset, MFTime import numpy as np from numpy.random import seed, randint from numpy.testing import assert_array_equal, assert_equal from numpy import ma import tempfile, unittest, os, datetime import cftime from pkg_resources import parse_version nx=100; ydim=5; zdim=10 nfiles = 10 ninc = nx/nfiles files = [tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name for nfile in range(nfiles)] data = randint(0,10,size=(nx,ydim,zdim)) missval = 99 data[::10] = missval data = ma.masked_values(data,missval) class VariablesTestCase(unittest.TestCase): def setUp(self): self.files = files for nfile,file in enumerate(self.files): f = Dataset(file,'w',format='NETCDF4_CLASSIC') #f.createDimension('x',None) f.createDimension('x',ninc) f.createDimension('y',ydim) f.createDimension('z',zdim) f.history = 'created today' x = f.createVariable('x','i',('x',)) x.units = 'zlotys' dat = f.createVariable('data','i',('x','y','z',)) dat.long_name = 'phony data' dat.missing_value = missval nx1 = int(nfile*ninc); nx2 = int(ninc*(nfile+1)) #x[0:ninc] = np.arange(nfile*ninc,ninc*(nfile+1)) x[:] = np.arange(nfile*ninc,ninc*(nfile+1)) #dat[0:ninc] = data[nx1:nx2] dat[:] = data[nx1:nx2] f.close() def tearDown(self): # Remove the temporary files for file in self.files: os.remove(file) def runTest(self): """testing multi-file dataset access""" # specify the aggregation dim (not necessarily unlimited) f = MFDataset(self.files,aggdim='x',check=True) assert f.history == 'created today' assert_array_equal(np.arange(0,nx),f.variables['x'][:]) varin = f.variables['data'] datin = varin[:] assert_array_equal(datin.mask,data.mask) varin.set_auto_maskandscale(False) data2 = data.filled() assert varin.long_name == 'phony data' assert len(varin) == nx assert varin.shape == (nx,ydim,zdim) assert varin.dimensions == ('x','y','z') assert_array_equal(varin[4:-4:4,3:5,2:8],data2[4:-4:4,3:5,2:8]) assert varin[0,0,0] == data2[0,0,0] assert_array_equal(varin[:],data2) assert getattr(varin,'nonexistantatt',None) == None f.close() class NonuniformTimeTestCase(unittest.TestCase): ninc = 365 def setUp(self): self.files = [tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name for nfile in range(2)] for nfile,file in enumerate(self.files): f = Dataset(file,'w',format='NETCDF4_CLASSIC') f.createDimension('time',None) f.createDimension('y',ydim) f.createDimension('z',zdim) f.history = 'created today' time = f.createVariable('time', 'f', ('time', )) #time.units = 'days since {0}-01-01'.format(1979+nfile) yr = 1979+nfile time.units = 'days since %s-01-01' % yr time.calendar = 'standard' x = f.createVariable('x','f',('time', 'y', 'z')) x.units = 'potatoes per square mile' nx1 = self.ninc*nfile; nx2 = self.ninc*(nfile+1) time[:] = np.arange(self.ninc) x[:] = np.arange(nx1, nx2).reshape(self.ninc,1,1) * np.ones((1, ydim, zdim)) f.close() def tearDown(self): # Remove the temporary files for file in self.files: os.remove(file) def runTest(self): # Get the real dates # skip this until cftime pull request #55 is in a released # version (1.0.1?). Otherwise, fix for issue #808 breaks this if parse_version(cftime.__version__) >= parse_version('1.0.1'): dates = [] for file in self.files: f = Dataset(file) t = f.variables['time'] dates.extend(cftime.num2date(t[:], t.units, t.calendar)) f.close() # Compare with the MF dates f = MFDataset(self.files,check=True) t = f.variables['time'] mfdates = cftime.num2date(t[:], t.units, t.calendar) T = MFTime(t) assert_equal(len(T), len(t)) assert_equal(T.shape, t.shape) assert_equal(T.dimensions, t.dimensions) assert_equal(T.typecode(), t.typecode()) # skip this until cftime pull request #55 is in a released # version (1.0.1?). Otherwise, fix for issue #808 breaks this if parse_version(cftime.__version__) >= parse_version('1.0.1'): assert_array_equal(cftime.num2date(T[:], T.units, T.calendar), dates) assert_equal(cftime.date2index(datetime.datetime(1980, 1, 2), T), 366) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_open_mem.py000066400000000000000000000017321413751447500211360ustar00rootroot00000000000000import os import unittest import netCDF4 CURRENT_DIR = os.path.dirname(os.path.realpath(__file__)) class TestOpenMem(unittest.TestCase): def test_mem_open(self): fpath = os.path.join(CURRENT_DIR, "netcdf_dummy_file.nc") with open(fpath, 'rb') as f: nc_bytes = f.read() if not netCDF4.__has_nc_open_mem__: with self.assertRaises(ValueError): netCDF4.Dataset('foo_bar', memory=nc_bytes) return # Needs: https://github.com/Unidata/netcdf-c/pull/400 if netCDF4.__netcdf4libversion__ < '4.4.1.2': with self.assertRaises(IOError): netCDF4.Dataset('foo_bar', memory=nc_bytes) return with netCDF4.Dataset('foo_bar', memory=nc_bytes) as nc: assert nc.filepath() == 'foo_bar' assert nc.project_summary == 'Dummy netCDF file' if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_refcount.py000066400000000000000000000017221413751447500211630ustar00rootroot00000000000000import unittest, netCDF4, tempfile, os file_name = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name class RefCountTestCase(unittest.TestCase): def setUp(self): nc = netCDF4.Dataset(file_name, mode='w', keepweakref=True, format='NETCDF4') d = nc.createDimension('fred', 2000) v = nc.createVariable('frank','f',('fred',)) self.file = file_name self.nc = nc def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing garbage collection (issue 218)""" # this should trigger garbage collection (__dealloc__ method) del self.nc # if __dealloc__ not called to close file, then this # will fail with "Permission denied" error (since you can't # open a file 'w' that is already open for writing). nc = netCDF4.Dataset(self.file, mode='w', format='NETCDF4') if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_rename.py000066400000000000000000000120571413751447500206100ustar00rootroot00000000000000import sys import unittest import os import tempfile import netCDF4 from netCDF4 import __has_rename_grp__ # test changing dimension, variable names # and deleting attributes. FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name LAT_NAME="lat" LON_NAME="lon" LON_NAME2 = "longitude" LEVEL_NAME="level" TIME_NAME="time" VAR_NAME='temp' VAR_NAME2='wind' GROUP_NAME='subgroup' GROUP_NAME2='subgroup2' class VariablesTestCase(unittest.TestCase): def setUp(self): self.file = FILE_NAME f = netCDF4.Dataset(self.file, 'w') f.createDimension(LAT_NAME,73) f.createDimension(LON_NAME,145) f.createDimension(LEVEL_NAME,10) f.createDimension(TIME_NAME,None) if __has_rename_grp__: g = f.createGroup(GROUP_NAME) else: g = f.createGroup(GROUP_NAME2) g.createDimension(LAT_NAME,145) g.createDimension(LON_NAME,289) g.createDimension(LEVEL_NAME,20) g.createDimension(TIME_NAME,None) f.foo = 'bar' f.goober = 2 g.foo = 'bar' g.goober = 2 f.createVariable(VAR_NAME,'f4',(LAT_NAME, LON_NAME, TIME_NAME)) v = f.variables[VAR_NAME] v.bar = 'foo' v.slobber = 3 g.createVariable(VAR_NAME,'f4',(LAT_NAME, LON_NAME, TIME_NAME)) v2 = g.variables[VAR_NAME] v2.bar = 'foo' v2.slobber = 3 f.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing renaming of dimensions, variables and attribute deletion""" f = netCDF4.Dataset(self.file, 'r+') v = f.variables[VAR_NAME] names_check = [LAT_NAME, LON_NAME, LEVEL_NAME, TIME_NAME] # check that dimension names are correct. for name in f.dimensions.keys(): self.assertTrue(name in names_check) names_check = [VAR_NAME] # check that variable names are correct. for name in f.variables.keys(): self.assertTrue(name in names_check) # rename dimension. f.renameDimension(LON_NAME,LON_NAME2) # rename variable. f.renameVariable(VAR_NAME,VAR_NAME2) # rename group. if __has_rename_grp__: f.renameGroup(GROUP_NAME,GROUP_NAME2) # check that new dimension names are correct. names_check = [LAT_NAME, LON_NAME2, LEVEL_NAME, TIME_NAME] for name in f.dimensions.keys(): self.assertTrue(name in names_check) names_check = [VAR_NAME2] # check that new variable names are correct. for name in f.variables.keys(): self.assertTrue(name in names_check) g = f.groups[GROUP_NAME2] vg = g.variables[VAR_NAME] names_check = [LAT_NAME, LON_NAME, LEVEL_NAME, TIME_NAME] # check that dimension names are correct. for name in g.dimensions.keys(): self.assertTrue(name in names_check) names_check = [VAR_NAME] # check that variable names are correct. for name in g.variables.keys(): self.assertTrue(name in names_check) # check that group name is correct. self.assertTrue(GROUP_NAME not in f.groups and GROUP_NAME2 in f.groups) # rename dimension. g.renameDimension(LON_NAME,LON_NAME2) # rename variable. g.renameVariable(VAR_NAME,VAR_NAME2) # check that new dimension names are correct. names_check = [LAT_NAME, LON_NAME2, LEVEL_NAME, TIME_NAME] for name in g.dimensions.keys(): self.assertTrue(name in names_check) names_check = [VAR_NAME2] # check that new variable names are correct. for name in g.variables.keys(): self.assertTrue(name in names_check) # delete a global attribute. atts = f.ncattrs() del f.goober atts.remove('goober') self.assertTrue(atts == f.ncattrs()) atts = g.ncattrs() del g.goober atts.remove('goober') self.assertTrue(atts == g.ncattrs()) # delete a variable attribute. atts = v.ncattrs() del v.slobber atts.remove('slobber') self.assertTrue(atts == v.ncattrs()) atts = vg.ncattrs() del vg.slobber atts.remove('slobber') self.assertTrue(atts == vg.ncattrs()) f.close() # make sure attributes cannot be deleted, or vars/dims renamed # when file is open read-only. f = netCDF4.Dataset(self.file) v = f.variables[VAR_NAME2] self.assertRaises(RuntimeError, delattr, v, 'bar') self.assertRaises(RuntimeError, f.renameVariable, VAR_NAME2, VAR_NAME) self.assertRaises(RuntimeError, f.renameDimension, LON_NAME2, LON_NAME) g = f.groups[GROUP_NAME2] vg = g.variables[VAR_NAME2] self.assertRaises(RuntimeError, delattr, vg, 'bar') self.assertRaises(RuntimeError, g.renameVariable, VAR_NAME2, VAR_NAME) self.assertRaises(RuntimeError, g.renameDimension, LON_NAME2, LON_NAME) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_scalarvar.py000066400000000000000000000034351413751447500213170ustar00rootroot00000000000000import sys import unittest import os import tempfile from numpy.testing import assert_almost_equal import netCDF4 import math VAR_NAME='temp' VAR_TYPE='f4' VAR_VAL=math.pi FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name GROUP_NAME = 'subgroup' # test scalar variable creation and retrieval. class ScalarVariableTestCase(unittest.TestCase): def setUp(self): self.file = FILE_NAME rootgrp = netCDF4.Dataset(self.file, 'w') # scalar variable. temp = rootgrp.createVariable(VAR_NAME,VAR_TYPE) #temp[:] = VAR_VAL temp.assignValue(VAR_VAL) subgroup = rootgrp.createGroup(GROUP_NAME) tempg = subgroup.createVariable(VAR_NAME,VAR_TYPE) tempg[:] = VAR_VAL #tempg.assignValue(VAR_VAL) rootgrp.close() def tearDown(self): # Remove the temporary file os.remove(self.file) def runTest(self): """testing scalar variables""" # check dimensions in root group. f = netCDF4.Dataset(self.file, 'r+') v = f.variables[VAR_NAME] # dimensions and shape should be empty tuples self.assertTrue(v.dimensions == ()) self.assertTrue(v.shape == ()) # check result of getValue and slice assert_almost_equal(v.getValue(), VAR_VAL, decimal=6) assert_almost_equal(v[:], VAR_VAL, decimal=6) g = f.groups[GROUP_NAME] vg = g.variables[VAR_NAME] # dimensions and shape should be empty tuples self.assertTrue(vg.dimensions == ()) self.assertTrue(vg.shape == ()) # check result of getValue and slice assert_almost_equal(vg.getValue(), VAR_VAL, decimal=6) assert_almost_equal(vg[:], VAR_VAL, decimal=6) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_scaled.py000077500000000000000000000162361413751447500206020ustar00rootroot00000000000000import unittest import os import tempfile import numpy as np from numpy import ma from numpy.testing import assert_array_almost_equal from netCDF4 import Dataset, default_fillvals # Test automatic scaling of variables (set_auto_scale()) class SetAutoScaleTestBase(unittest.TestCase): """Base object for tests checking the functionality of set_auto_scale()""" def setUp(self): self.testfile = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name self.fillval = default_fillvals["i2"] self.missing_value = -9999 self.v = np.array([0, 5, 4, self.missing_value], dtype = "i2") self.v_ma = ma.array([0, 5, 4, self.missing_value], dtype = "i2", mask = [True, False, False, True], fill_value = self.fillval) self.scale_factor = 10. self.add_offset = 5. self.v_scaled = self.v * self.scale_factor + self.add_offset self.v_ma_scaled = self.v_ma * self.scale_factor + self.add_offset f = Dataset(self.testfile, 'w') x = f.createDimension('x', None) xx = f.createDimension('xx', 10) v = f.createVariable('v', "i2", 'x') vv = f.createVariable('vv', "i2", 'xx') vv.add_offset=0; vv.scale_factor=np.float32(1.0) v[:] = self.v vv[:] = np.ones(10) # Note: Scale factors are only added after writing, so that no auto-scaling takes place! v.scale_factor = self.scale_factor v.add_offset = self.add_offset f.close() def tearDown(self): os.remove(self.testfile) class SetAutoScaleFalse(SetAutoScaleTestBase): def test_unmasked(self): """Testing (not) auto-scaling of variables for set_auto_scale(False)""" f = Dataset(self.testfile, "r") f.variables["v"].set_auto_scale(False) v = f.variables["v"][:] self.assertEqual(v.dtype, "i2") self.assertTrue(isinstance(v, np.ndarray)) # issue 785: always return masked array by default self.assertTrue(isinstance(v, ma.core.MaskedArray)) assert_array_almost_equal(v, self.v) f.close() def test_masked(self): """Testing auto-conversion of masked arrays for set_auto_mask(False) with masking""" # Update test data file f = Dataset(self.testfile, "a") f.variables["v"].missing_value = self.missing_value f.close() # Note: Converting arrays to masked arrays is default if missing_value is present f = Dataset(self.testfile, "r") f.variables["v"].set_auto_scale(False) v_ma = f.variables["v"][:] self.assertEqual(v_ma.dtype, "i2") self.assertTrue(isinstance(v_ma, np.ndarray)) self.assertTrue(isinstance(v_ma, ma.core.MaskedArray)) assert_array_almost_equal(v_ma, self.v_ma) f.close() class SetAutoScaleTrue(SetAutoScaleTestBase): def test_unmasked(self): """Testing auto-scaling of variables for set_auto_scale(True)""" f = Dataset(self.testfile) f.variables["v"].set_auto_scale(True) # The default anyway... v_scaled = f.variables['v'][:] # issue 913 vv_scaled = f.variables['vv'][:] self.assertEqual(vv_scaled.dtype,f.variables['vv'].scale_factor.dtype) assert_array_almost_equal(vv_scaled, np.ones(10)) self.assertEqual(v_scaled.dtype, "f8") self.assertTrue(isinstance(v_scaled, np.ndarray)) # issue 785: always return masked array by default self.assertTrue(isinstance(v_scaled, ma.core.MaskedArray)) assert_array_almost_equal(v_scaled, self.v_scaled) f.close() def test_masked(self): """Testing auto-scaling of variables for set_auto_scale(True) with masking""" # Update test data file f = Dataset(self.testfile, "a") f.variables["v"].missing_value = self.missing_value f.close() # Note: Converting arrays to masked arrays is default if missing_value is present f = Dataset(self.testfile) f.variables["v"].set_auto_scale(True) # The default anyway... v_ma_scaled = f.variables['v'][:] self.assertEqual(v_ma_scaled.dtype, "f8") self.assertTrue(isinstance(v_ma_scaled, np.ndarray)) self.assertTrue(isinstance(v_ma_scaled, ma.core.MaskedArray)) assert_array_almost_equal(v_ma_scaled, self.v_ma_scaled) f.close() class WriteAutoScaleTest(SetAutoScaleTestBase): def test_auto_scale_write(self): """Testing automatic packing to all kinds of integer types""" def packparams(dmax, dmin, dtyp): kind = dtyp[0] n = int(dtyp[1]) * 8 scale_factor = (dmax - dmin) / (2**n - 1) if kind == 'i': add_offset = dmin + 2**(n-1) * scale_factor elif kind == 'u': add_offset = dmin else: raise Exception return((add_offset, scale_factor)) for dtyp in ['i1', 'i2', 'i4', 'u1', 'u2', 'u4']: np.random.seed(456) data = np.random.uniform(size=100) f = Dataset(self.testfile, 'w') f.createDimension('x') # # save auto_scaled v = f.createVariable('v', dtyp, ('x',)) v.set_auto_scale(True) # redundant v.add_offset, v.scale_factor = packparams( np.max(data), np.min(data), dtyp) v[:] = data f.close() # # read back f = Dataset(self.testfile, 'r') v = f.variables['v'] v.set_auto_mask(False) v.set_auto_scale(True) # redundant vdata = v[:] # error normalized by scale factor maxerrnorm = np.max(np.abs((vdata - data) / v.scale_factor)) # 1e-5 accounts for floating point errors assert(maxerrnorm < 0.5 + 1e-5) f.close() class GlobalSetAutoScaleTest(unittest.TestCase): def setUp(self): self.testfile = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name f = Dataset(self.testfile, 'w') grp1 = f.createGroup('Group1') grp2 = f.createGroup('Group2') f.createGroup('Group3') # empty group f.createVariable('var0', "i2", ()) grp1.createVariable('var1', 'f8', ()) grp2.createVariable('var2', 'f4', ()) f.close() def tearDown(self): os.remove(self.testfile) def runTest(self): f = Dataset(self.testfile, "r") # Default is both scaling and masking enabled v0 = f.variables['var0'] v1 = f.groups['Group1'].variables['var1'] v2 = f.groups['Group2'].variables['var2'] self.assertTrue(v0.scale) self.assertTrue(v0.mask) self.assertTrue(v1.scale) self.assertTrue(v1.mask) self.assertTrue(v2.scale) self.assertTrue(v2.mask) # No auto-scaling f.set_auto_scale(False) self.assertFalse(v0.scale) self.assertTrue(v0.mask) self.assertFalse(v1.scale) self.assertTrue(v1.mask) self.assertFalse(v2.scale) self.assertTrue(v2.mask) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_shape.py000066400000000000000000000021461413751447500204370ustar00rootroot00000000000000from netCDF4 import Dataset import tempfile, unittest, os import numpy as np file_name = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name xdim=None; ydim=121; zdim=169 datashape = (ydim,zdim) data = np.ones(datashape,dtype=np.float64) class ShapeTestCase(unittest.TestCase): def setUp(self): self.file = file_name f = Dataset(file_name,'w') f.createDimension('x',xdim) f.createDimension('y',ydim) f.createDimension('z',zdim) v = f.createVariable('data',np.float64,('x','y','z')) f.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """test for issue 90 (array shape should not be modified by assignment to netCDF variable)""" f = Dataset(self.file, 'a') v = f.variables['data'] v[0] = data # make sure shape of data array # is not changed by assigning it # to a netcdf var with one more dimension (issue 90) assert(data.shape == datashape) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_slicing.py000066400000000000000000000236271413751447500207760ustar00rootroot00000000000000from netCDF4 import Dataset from numpy.random import seed, randint from numpy.testing import assert_array_equal, assert_equal,\ assert_array_almost_equal import tempfile, unittest, os, random, sys import numpy as np file_name = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name xdim=9; ydim=10; zdim=11 #seed(9) # fix seed data = randint(0,10,size=(xdim,ydim,zdim)).astype('u1') datarev = data[:,::-1,:] class VariablesTestCase(unittest.TestCase): def setUp(self): self.file = file_name f = Dataset(file_name,'w') f.createDimension('x',xdim) f.createDimension('xu',None) f.createDimension('xu2',None) f.createDimension('y',ydim) f.createDimension('z',zdim) f.createDimension('zu',None) v = f.createVariable('data','u1',('x','y','z')) vu = f.createVariable('datau','u1',('xu','y','zu')) v1 = f.createVariable('data1d', 'u1', ('x',)) v2 = f.createVariable('data1dx', 'u1', ('xu2',)) # variable with no unlimited dim. # write slice in reverse order v[:,::-1,:] = data # variable with an unlimited dimension. # write slice in reverse order #vu[0:xdim,::-1,0:zdim] = data vu[:,::-1,:] = data v1[:] = data[:, 0, 0] if sys.maxsize > 2**32: v2[2**31] = 1 # issue 1112 (overflow on windows) f.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def test_3d(self): """testing variable slicing""" f = Dataset(self.file, 'r') v = f.variables['data'] vu = f.variables['datau'] # test return of array scalar. assert_equal(v[0,0,0].shape,()) assert_array_equal(v[:], datarev) # test reading of slices. # negative value means count back from end. assert_array_equal(v[:-1,:-2,:-3],datarev[:-1,:-2,:-3]) # every other element (positive step) assert_array_equal(v[2:-1:2,2:-2:2,2:-3:2],datarev[2:-1:2,2:-2:2,2:-3:2]) # every other element (negative step) assert_array_equal(v[-1:2:-2,-2:2:-2,-3:2:-2],datarev[-1:2:-2,-2:2:-2,-3:2:-2]) # read elements in reverse order assert_array_equal(v[:,::-1,:],data) assert_array_equal(v[::-1,:,::-1],datarev[::-1,:,::-1]) assert_array_equal(v[xdim-1::-3,:,zdim-1::-3],datarev[xdim-1::-3,:,zdim-1::-3]) # ellipsis slice. assert_array_equal(v[...,2:],datarev[...,2:]) # variable with an unlimited dimension. assert_array_equal(vu[:], data[:,::-1,:]) # read data in reverse order assert_array_equal(vu[:,::-1,:],data) # index using an integer array scalar i = np.ones(1,'i4')[0] assert_array_equal(v[i],datarev[1]) f.close() def test_1d(self): f = Dataset(self.file, 'r') v1 = f.variables['data1d'] v2 = f.variables['data1dx'] d = data[:,0,0] assert_equal(v1[:], d) if sys.maxsize > 2**32: assert_equal(v2[2**31], 1) assert_equal(v1[4:], d[4:]) # test return of array scalar. assert_equal(v1[0].shape, ()) i1 = np.array([2,3,4]) assert_equal(v1[i1], d[i1]) i2 = np.array([2,3,5]) assert_equal(v1[i2], d[i2]) assert_equal(v1[d<5], d[d<5]) assert_equal(v1[5], d[5]) f.close() def test_0d(self): f = Dataset(self.file, 'w') v = f.createVariable('data', float) v[...] = 10 assert_array_equal(v[...], 10) assert_equal(v.shape, v[...].shape) # issue #785: always return masked array #assert(type(v[...]) == np.ndarray) assert(type(v[...]) == np.ma.core.MaskedArray) f.set_auto_mask(False) assert(type(v[...]) == np.ndarray) f.close() def test_issue259(self): dset = Dataset(self.file, 'w', format='NETCDF4_CLASSIC') dset.createDimension('dim', None) a = dset.createVariable('a', 'i', ('dim',)) b = dset.createVariable('b', 'i', ('dim',)) c = dset.createVariable('c', 'i', ('dim',)) c[:] = 1 # c initially is empty, new entry created assert_array_equal(c[...], np.array([1])) b[:] = np.array([1,1]) a[:] = 1 # a should be same as b assert_array_equal(a[...], b[...]) dset.close() def test_issue371(self): dataset = Dataset(self.file, 'w') dataset.createDimension('dim', 5) var = dataset.createVariable('bar', 'i8', ('dim', )) data = [1, 2, 3, 4, 5] var[..., :] = data assert_array_equal(var[..., :], np.array(data)) dataset.close() def test_issue306(self): f = Dataset(self.file,'w') nlats = 7; lat = f.createDimension('lat',nlats) nlons = 12; lon = f.createDimension('lon',nlons) nlevs = 1; lev = f.createDimension('lev',nlevs) time = f.createDimension('time',None) var = f.createVariable('var',np.float64,('time','lev','lat','lon')) a = np.random.uniform(size=(10,nlevs,nlats,nlons)) var[0:10] = a f.close() f = Dataset(self.file) aa = f.variables['var'][4,-1,:,:] assert_array_almost_equal(a[4,-1,:,:],aa) v = f.variables['var'] try: aa = v[4,-2,:,:] # -2 when dimension is length 1 except IndexError: pass else: raise IndexError('This test should have failed.') try: aa = v[4,...,...,:] # more than one Ellipsis except IndexError: pass else: raise IndexError('This test should have failed.') try: aa = v[:,[True,True],:,:] # boolean array too long. except IndexError: pass else: raise IndexError('This test should have failed.') try: aa = v[:,[0,1],:,:] # integer index too large except IndexError: pass else: raise IndexError('This test should have failed.') f.close() def test_issue300(self): f = Dataset(self.file,'w') nlats = 11; lat = f.createDimension('lat',nlats) nlons = 20; lon = f.createDimension('lon',nlons) time = f.createDimension('time',None) var = f.createVariable('var',np.float64,('time','lat','lon')) a = np.random.uniform(size=(3,nlats,nlons)) var[[True,True,False,False,False,True]] = a var[0,2.0,"-1"] = 0 # issue 312 a[0,2,-1]=0 f.close() f = Dataset(self.file) var = f.variables['var'] aa = var[[0,1,5]] bb = var[[True,True,False,False,False,True]] lats = np.arange(nlats); lons = np.arange(nlons) cc = var[-1,lats > 2,lons < 6] assert_array_almost_equal(a,aa) assert_array_almost_equal(bb,aa) assert_array_almost_equal(cc,a[-1,3:,:6]) f.close() def test_retain_single_dims(self): f = Dataset(self.file, 'r') v = f.variables['data'] keys = ((0, 1, 2, 3, 4, 5, 6, 7, 8), (5,), (4,)) shape = (9, 1, 1) data = v[keys] assert_equal(data.shape, shape) keys = ((0, 1, 2, 3, 4, 5, 6, 7, 8), 5, 4,) shape = (9,) data = v[keys] assert_equal(data.shape, shape) f.close() def test_issue743(self): nc = Dataset(self.file,'w',format='NETCDF3_CLASSIC') td = nc.createDimension('t',None) xd = nc.createDimension('x',33) yd = nc.createDimension('y',4) v = nc.createVariable('v',np.float64,('t','x','y')) nc.close() nc = Dataset(self.file) data = np.empty(nc['v'].shape, nc['v'].dtype) data2 = nc['v'][...] assert_array_equal(data,data2) nc.close() def test_issue906(self): f = Dataset(self.file,'w') f.createDimension('d1',3) f.createDimension('d2',None) f.createDimension('d3',5) f.createVariable('v2',np.float64,('d1','d2','d3')) f['v2'][:] = np.zeros((3,4,5)) f['v2'][0,:,0] = np.arange(4) f['v2'][0,:,:] = np.ones((4,5)) f.close() def test_issue919(self): with Dataset(self.file,'w') as f: f.createDimension('time',2) f.createDimension('lat',10) f.createDimension('lon',9) f.createVariable('v1',np.int64,('time', 'lon','lat',)) arr = np.arange(9*10).reshape((9, 10)) f['v1'][:] = arr assert_array_equal(f['v1'][:],np.broadcast_to(arr,f['v1'].shape)) arr = np.arange(10) f['v1'][:] = arr assert_array_equal(f['v1'][:],np.broadcast_to(arr,f['v1'].shape)) def test_issue922(self): with Dataset(self.file,'w') as f: f.createDimension('d1',3) f.createDimension('d2',None) f.createVariable('v1',np.int64,('d2','d1',)) f['v1'][0] = np.arange(3,dtype=np.int64) f['v1'][1:3] = np.arange(3,dtype=np.int64) assert_array_equal(f['v1'][:], np.broadcast_to(np.arange(3),(3,3))) f.createVariable('v2',np.int64,('d1','d2',)) f['v2'][:,0] = np.arange(3,dtype=np.int64) f['v2'][:,1:3] = np.arange(6,dtype=np.int64).reshape(3,2) assert_array_equal(f['v2'][:,1:3],np.arange(6,dtype=np.int64).reshape(3,2)) assert_array_equal(f['v2'][:,0],np.arange(3,dtype=np.int64)) def test_issue1083(self): with Dataset(self.file, "w") as nc: nc.createDimension("test", 5) v = nc.createVariable("var", "f8", ("test", "test", "test")) v[:] = 1 # works v[:] = np.ones(()) # works v[:] = np.ones((1,)) # works v[:] = np.ones((5,)) # works v[:] = np.ones((5,5,5)) # works v[:] = np.ones((5,1,1)) # fails (before PR #1084) v[:] = np.ones((5,1,5)) # fails (before PR #1084) v[:] = np.ones((5,5,1)) # fails (before PR #1084) if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_stringarr.py000066400000000000000000000065211413751447500213530ustar00rootroot00000000000000from netCDF4 import Dataset, stringtochar, chartostring import random, numpy, string import unittest import os from numpy.testing import assert_array_equal, assert_array_almost_equal def generateString(length, alphabet=string.ascii_letters + string.digits + string.punctuation): return(''.join([random.choice(alphabet) for i in range(length)])) # test conversion of arrays of fixed-length strings # to arrays of characters (with an extra dimension), and vice-versa. FILE_NAME = 'tst_stringarr.nc' FILE_FORMAT = 'NETCDF4_CLASSIC' n2 = 20; nchar = 12; nrecs = 4 data = numpy.empty((nrecs,n2),'S'+repr(nchar)) for nrec in range(nrecs): for n in range(n2): data[nrec,n] = generateString(nchar) datau = data.astype('U') datac = stringtochar(data, encoding='ascii') class StringArrayTestCase(unittest.TestCase): def setUp(self): self.file = FILE_NAME nc = Dataset(FILE_NAME,'w',format=FILE_FORMAT) nc.createDimension('n1',None) nc.createDimension('n2',n2) nc.createDimension('nchar',nchar) v = nc.createVariable('strings','S1',('n1','n2','nchar')) v2 = nc.createVariable('strings2','S1',('n1','n2','nchar')) # if _Encoding set, string array should automatically be converted # to a char array and vice-versan v2._Encoding = 'ascii' v3 = nc.createVariable('strings3','S1',('n1','n2','nchar')) v3._Encoding = 'ascii' for nrec in range(nrecs): datac = stringtochar(data,encoding='ascii') v[nrec] = datac[nrec] v2[:-1] = data[:-1] v2[-1] = data[-1] v2[-1,-1] = data[-1,-1] # write single element v2[-1,-1] = data[-1,-1].tostring() # write single python string # _Encoding should be ignored if an array of characters is specified v3[:] = stringtochar(data, encoding='ascii') nc.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing functions for converting arrays of chars to fixed-len strings""" nc = Dataset(FILE_NAME) assert nc.dimensions['n1'].isunlimited() == True v = nc.variables['strings'] v2 = nc.variables['strings2'] v3 = nc.variables['strings3'] assert v.dtype.str[1:] in ['S1','U1'] assert v.shape == (nrecs,n2,nchar) for nrec in range(nrecs): data2 = chartostring(v[nrec],encoding='ascii') assert_array_equal(data2,datau[nrec]) data2 = v2[:] data2[0] = v2[0] data2[0,1] = v2[0,1] assert_array_equal(data2,datau) data3 = v3[:] assert_array_equal(data3,datau) # these slices should return a char array, not a string array data4 = v2[:,:,0] assert(data4.dtype.itemsize == 1) assert_array_equal(data4, datac[:,:,0]) data5 = v2[0,0:nchar,0] assert(data5.dtype.itemsize == 1) assert_array_equal(data5, datac[0,0:nchar,0]) # test turning auto-conversion off. v2.set_auto_chartostring(False) data6 = v2[:] assert(data6.dtype.itemsize == 1) assert_array_equal(data6, datac) nc.set_auto_chartostring(False) data7 = v3[:] assert(data7.dtype.itemsize == 1) assert_array_equal(data7, datac) nc.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_types.py000066400000000000000000000074561413751447500205140ustar00rootroot00000000000000import sys import unittest import os import tempfile import numpy as np from numpy.testing import assert_array_equal, assert_array_almost_equal from numpy.random.mtrand import uniform import netCDF4 # test primitive data types. # create an n1dim by n2dim random ranarr. FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name n1dim = 5 n2dim = 10 ranarr = 100.*uniform(size=(n1dim,n2dim)) zlib=False;complevel=0;shuffle=0;least_significant_digit=None datatypes = ['f8','f4','i1','i2','i4','i8','u1','u2','u4','u8','S1'] FillValue = 1.0 issue273_data = np.ma.array(['z']*10,dtype='S1',\ mask=[False,False,False,False,False,True,False,False,False,False]) class PrimitiveTypesTestCase(unittest.TestCase): def setUp(self): self.file = FILE_NAME f = netCDF4.Dataset(self.file,'w') f.createDimension('n1', None) f.createDimension('n2', n2dim) for typ in datatypes: foo = f.createVariable('data_'+typ, typ, ('n1','n2',),zlib=zlib,complevel=complevel,shuffle=shuffle,least_significant_digit=least_significant_digit,fill_value=FillValue) #foo._FillValue = FillValue # test writing of _FillValue attribute for diff types # (should be cast to type of variable silently) foo[1:n1dim] = ranarr[1:n1dim] v = f.createVariable('issue271', np.dtype('S1'), [], fill_value=b'Z') v2 = f.createVariable('issue273', np.dtype('S1'), 'n2',\ fill_value='\x00') v2[:] = issue273_data v3 = f.createVariable('issue707',np.int8,'n2') v3.setncattr('missing_value',255) v3[:]=-1 f.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing primitive data type """ f = netCDF4.Dataset(self.file) for typ in datatypes: data = f.variables['data_'+typ] data.set_auto_maskandscale(False) datarr = data[1:n1dim] # fill missing data with _FillValue # ('S1' array will have some missing values) if hasattr(datarr, 'mask'): datarr = datarr.filled() datfilled = data[0] # check to see that data type is correct if typ == 'S1': self.assertTrue(data.dtype.str[1:] in ['S1','U1']) else: self.assertTrue(data.dtype.str[1:] == typ) # check data in variable. if data.dtype.str[1:] != 'S1': #assert np.allclose(datarr, ranarr[1:n1dim].astype(data.dtype)) assert_array_almost_equal(datarr,ranarr[1:n1dim].astype(data.dtype)) else: assert datarr.tostring() == ranarr[1:n1dim].astype(data.dtype).tostring() # check that variable elements not yet written are filled # with the specified _FillValue. assert_array_equal(datfilled,np.asarray(data._FillValue,datfilled.dtype)) # issue 271 (_FillValue should be a byte for character arrays on # Python 3) v = f.variables['issue271'] assert type(v._FillValue) == bytes assert v._FillValue == b'Z' # issue 273 (setting _FillValue to null byte manually) v2 = f.variables['issue273'] assert type(v2._FillValue) == bytes assert v2._FillValue == b'\x00' assert(str(issue273_data) == str(v2[:])) # issue 707 (don't apply missing_value if cast to variable type is # unsafe) v3 = f.variables['issue707'] assert_array_equal(v3[:],-1*np.ones(n2dim,v3.dtype)) f.close() # issue #850 (masked scalar char variable) f = netCDF4.Dataset(self.file,'a') a = f.createVariable('a', 'c', ()) a[:] = np.ma.masked f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_unicode.py000066400000000000000000000022341413751447500207630ustar00rootroot00000000000000import netCDF4 import numpy as np import sys, unittest, os, tempfile FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name ATT1 = '\u03a0\u03a3\u03a9' ATT2 = 'x\xb0' ATT3 = ['\u03a0', '\u03a3', '\u03a9'] DIM_NAME = 'x\xb0' VAR_NAME = 'Andr\xe9' class UnicodeTestCase(unittest.TestCase): def setUp(self): self.file = FILE_NAME f = netCDF4.Dataset(self.file,'w') f.attribute1 = ATT1 f.attribute2 = ATT2 f.attribute3 = ATT3 d = f.createDimension(DIM_NAME, None) v = f.createVariable(VAR_NAME, np.float64, (DIM_NAME,)) f.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing unicode""" f = netCDF4.Dataset(self.file, 'r') d = f.dimensions[DIM_NAME] v = f.variables[VAR_NAME] # check accessing individual attributes. assert f.attribute1 == ATT1 assert f.attribute2 == ATT2 #assert f.attribute3 == ''.join(ATT3) # behavior changed issue 770 assert f.attribute3 == ATT3 f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_unicodeatt.py000066400000000000000000000025001413751447500214700ustar00rootroot00000000000000from netCDF4 import Dataset import sys, unittest, os, tempfile FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name class UnicodeAttTestCase(unittest.TestCase): def setUp(self): self.file = FILE_NAME nc = Dataset(self.file,'w') # write as a utf-8 string nc.stratt = b'\xe6\xb7\xb1\xe5\x85\xa5 Python'.decode('utf-8') # write as raw bytes (decoded string is same as above with 'big5' encoding) nc.stratt2 = b'\xb2`\xa4J Python' # same as above, but attribute forced to be of type NC_STRING nc.setncattr_string('stratt3',b'\xb2`\xa4J Python') nc.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing unicode attributes""" nc = Dataset(self.file, 'r') assert(nc.stratt.encode('utf-8') == b'\xe6\xb7\xb1\xe5\x85\xa5 Python') stratt2 = nc.getncattr('stratt2',encoding='big5') # decodes using big5 stratt3 = nc.getncattr('stratt3',encoding='big5') # same as above assert(stratt2.encode('big5') == b'\xb2`\xa4J Python') assert(nc.stratt == stratt2) # decoded strings are the same assert(nc.stratt == stratt3) # decoded strings are the same nc.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_unlimdim.py000066400000000000000000000042421413751447500211540ustar00rootroot00000000000000import sys import unittest import os import tempfile import numpy as np from numpy.random.mtrand import uniform from numpy.testing import assert_array_equal, assert_array_almost_equal import netCDF4 # test creating variables with unlimited dimensions, # writing to and retrieving data from such variables. # create an n1dim by n2dim by n3dim random array n1dim = 4 n2dim = 10 n3dim = 8 ranarr = 100.*uniform(size=(n1dim,n2dim,n3dim)) FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name class UnlimdimTestCase(unittest.TestCase): def setUp(self): self.file = FILE_NAME f = netCDF4.Dataset(self.file, 'w') # foo has a single unlimited dimension f.createDimension('n1', n1dim) f.createDimension('n2', None) f.createDimension('n3', n3dim) foo = f.createVariable('data1', ranarr.dtype.str[1:], ('n1','n2','n3')) # write some data to it. #foo[:,0:n2dim,:] = ranarr foo[:] = ranarr foo[:,n2dim:,:] = 2.*ranarr # bar has 2 unlimited dimensions f.createDimension('n4', None) f.createDimension('n5', n2dim) f.createDimension('n6', None) # write some data to it. bar = f.createVariable('data2', ranarr.dtype.str[1:], ('n4','n5','n6')) # bar[0:n1dim,:, 0:n3dim] = ranarr bar[0:n1dim,:, 0:n3dim] = 2.0 f.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing unlimited dimensions""" f = netCDF4.Dataset(self.file, 'r') foo = f.variables['data1'] # check shape. self.assertTrue(foo.shape == (n1dim,2*n2dim,n3dim)) # check data. assert_array_almost_equal(foo[:,0:n2dim,:], ranarr) assert_array_almost_equal(foo[:,n2dim:2*n2dim,:], 2.*ranarr) bar = f.variables['data2'] # check shape. self.assertTrue(bar.shape == (n1dim,n2dim,n3dim)) # check data. #assert_array_almost_equal(bar[:,:,:], ranarr) assert_array_almost_equal(bar[:,:,:], 2.*np.ones((n1dim,n2dim,n3dim),ranarr.dtype)) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_utils.py000066400000000000000000000330621413751447500205000ustar00rootroot00000000000000from numpy.testing import assert_equal from netCDF4.utils import _StartCountStride, _out_array_shape import unittest import numpy as np class TestgetStartCountStride(unittest.TestCase): def test_basic(self): # Basic usage elem = [0, slice(None), slice(None)] start, count, stride, put_ind = _StartCountStride(elem, (50, 4, 10)) assert_equal(start, 0) assert_equal(count[..., 0], 1) assert_equal(count[..., 1], 4) assert_equal(count[..., 2], 10) assert_equal(stride, 1) assert_equal(put_ind[...,0], -1) assert_equal(put_ind[...,1], slice(None)) assert_equal(put_ind[...,2], slice(None)) assert_equal(_out_array_shape(count), (1, 4,10)) def test_slice(self): # start and stop slice elem = [5, slice(None), slice(5, 8, 2)] start, count, stride, put_ind = _StartCountStride(elem, (50, 4, 10)) assert_equal(start[..., 0], 5) assert_equal(start[..., 1], 0) assert_equal(start[..., 2], 5) assert_equal(count[..., 0], 1) assert_equal(count[..., 1], 4) assert_equal(count[..., 2], 2) assert_equal(stride[..., 2], 2) assert_equal(_out_array_shape(count), (1, 4,2)) def test_fancy(self): # Fancy indexing elem = [slice(None), [1,2,3], 8] start, count, stride, put_ind = _StartCountStride(elem, (50, 4, 10)) assert_equal(start[..., 0], 0) assert_equal(start[..., 1].squeeze(), 1) assert_equal(start[..., 2], 8) assert_equal(count[...,0], 50) assert_equal(count[...,1], 3) assert_equal(count[...,2], 1) assert_equal(put_ind[...,1].squeeze(), slice(None, None, None)) assert_equal(_out_array_shape(count), (50, 3, 1)) i = np.array([2,5,7],'i4') elem = [slice(None, -1,2),i,slice(None)] start, count, stride, put_ind = _StartCountStride(elem, (9,10,11)) try: elem = ( np.arange(6).reshape((3,2)), slice(None), slice(None) ) start, count, stride, put_ind = _StartCountStride(elem, (3,4,5)) except IndexError: pass # this one should be converted to a slice elem = [slice(None), [1,3,5], 8] start, count, stride, put_ind = _StartCountStride(elem, (50, 6, 10)) # pull request #683 now does not convert integer sequences to strided # slices. #assert_equal(put_ind[...,1].squeeze(), slice(None,None,None)) assert_equal(put_ind[...,1].squeeze(), [0,1,2]) def test_multiple_sequences(self): elem = [[4,6,7], [1,2,3], slice(None)] start, count, stride, put_ind = _StartCountStride(elem, (50, 4, 10)) assert_equal(_out_array_shape(count), (3, 3, 10)) assert_equal(start[..., 0].squeeze(), [4,6,7]) assert_equal(start[..., 1].squeeze(), [1,1,1]) assert_equal(start[..., 2], 0) assert_equal(count[...,0], 1) assert_equal(count[...,1], 3) assert_equal(count[...,2], 10) i = [1,3,4] elem = (i, i, i) start, count, stride, put_ind = _StartCountStride(elem, (50, 5, 10)) assert_equal(_out_array_shape(count), (3,3,3)) def test_put_indices(self): elem = (1, slice(None), slice(None)) start, count, stride, put_ind = _StartCountStride(elem, (3,4,5)) orig = np.arange(60).reshape((3,4,5)) dest = np.empty(_out_array_shape(count)) dest[tuple(put_ind[0,0,0])] = orig[tuple(elem)] def test_boolean(self): elem = (1, slice(None), np.array([True, True, False, False, True])) start, count, stride, put_ind = _StartCountStride(elem, (50, 4,5)) assert_equal(start[..., 2].squeeze(), [0,1,4]) assert_equal(count[...,2], 1) assert_equal(_out_array_shape(count), (1, 4, 3)) # Multiple booleans --- The behavior is different from NumPy in this case. elem = (np.array([True, True, False]), np.array([True, True, False, True]), slice(None)) start, count, stride, put_ind = _StartCountStride(elem, (3,4,5)) assert_equal(_out_array_shape(count), (2,3,5)) try: elem = (np.array([True, True, False]), np.array([True, True, True, False]), slice(None)) except IndexError: pass def test_1d(self): # Scalar elem = (0) start, count, stride, put_ind = _StartCountStride(elem, (10,)) assert_equal(start, 0) assert_equal(count, 1) assert_equal(stride, 1) assert_equal(put_ind, -1) elem = (-1) start, count, stride, put_ind = _StartCountStride(elem, (10,)) assert_equal(start, 9) assert_equal(count, 1) assert_equal(stride, 1) assert_equal(put_ind, -1) # test conversion of a integer index array to a slice elem = (np.array([0,1])) start, count, stride, put_ind = _StartCountStride(elem, (10,)) assert_equal(start, 0) assert_equal(count, 2) assert_equal(stride, 1) assert_equal(put_ind[:,0], slice(None,None,None)) # Slice elem = (slice(2,5,2)) start, count, stride, put_ind = _StartCountStride(elem, (10,)) assert_equal(start, 2) assert_equal(count, 2) assert_equal(stride, 2) assert_equal(put_ind, slice(None)) # Integer sequence elem = ([2,4,7]) start, count, stride, put_ind = _StartCountStride(elem, (10,)) assert_equal(start.squeeze(), [2,4,7]) assert_equal(count, 1) assert_equal(stride, 1) assert_equal(put_ind[:,0], [0,1,2]) # Boolean slicing elem = (np.array([True, True, False, True, False]),) start, count, stride, put_ind = _StartCountStride(elem, (5,)) assert_equal(start.squeeze(), [0,1,3]) assert_equal(count, 1) assert_equal(stride, 1) assert_equal(put_ind[:,0], [0,1,2]) # Integer sequence simplification elem = ([2,3,4]) start, count, stride, put_ind = _StartCountStride(elem, (10,)) assert_equal(start, 2) assert_equal(count, 3) assert_equal(stride, 1) assert_equal(put_ind, slice(None)) # Boolean indices simplification elem = (np.array([False, True, True, True, False])) start, count, stride, put_ind = _StartCountStride(elem, (5,)) assert_equal(start, 1) assert_equal(count, 3) assert_equal(stride, 1) assert_equal(put_ind, slice(None)) # All False elem = (np.array([False, False, False, False])) start, count, stride, put_ind = _StartCountStride(elem, (4,)) assert_equal(count, 0) assert_equal(_out_array_shape(count), (0,)) def test_ellipsis(self): elem=(Ellipsis, slice(1, 4)) start, count, stride, put_ind = _StartCountStride(elem, (22,25,4)) assert_equal(start[0,0,0], [0, 0, 1]) assert_equal(count[0,0,0], (22, 25, 3)) assert_equal(put_ind[0,0,0], (slice(None), slice(None), slice(None))) elem=(Ellipsis, [15,16,17,18,19], slice(None), slice(None)) start, count, stride, put_ind = _StartCountStride(elem, (2,10,20,10,10)) assert_equal(start[0,0,0,0,0], [0, 0, 15, 0, 0]) assert_equal(count[0,0,0,0,0], (2, 10, 5, 10, 10)) assert_equal(put_ind[0,0,0,0,0], (slice(None), slice(None), slice(None), slice(None), slice(None))) try: elem=(Ellipsis, [15,16,17,18,19], slice(None)) start, count, stride, put_ind = _StartCountStride(elem, (2,10,20,10,10)) assert_equal(None, 'Should throw an exception') except IndexError as e: assert_equal(str(e), "integer index exceeds dimension size") try: elem=(Ellipsis, [15,16,17,18,19], Ellipsis) start, count, stride, put_ind = _StartCountStride(elem, (2,10, 20,10,10)) assert_equal(None, 'Should throw an exception') except IndexError as e: assert_equal(str(e), "At most one ellipsis allowed in a slicing expression") class TestsetStartCountStride(unittest.TestCase): def test_basic(self): grp = FakeGroup({'x':False, 'y':False, 'time':True}) elem=(slice(None), slice(None), 1) start, count, stride, take_ind = _StartCountStride(elem, (22, 25, 1), ['x', 'y', 'time'], grp, (22,25), put=True) assert_equal(start[0][0][0], [0, 0, 1]) assert_equal(count[0][0][0], (22, 25, 1)) assert_equal(take_ind[0][0][0], (slice(None), slice(None), -1)) elem=(slice(None), slice(None), slice(1, 4)) start, count, stride, take_ind = _StartCountStride(elem, (22,25,1),\ ['x', 'y', 'time'], grp, (22,25,3), put=True) assert_equal(start[0][0][0], [0, 0, 1]) assert_equal(count[0][0][0], (22, 25, 3)) assert_equal(take_ind[0][0][0], (slice(None), slice(None), slice(None))) def test_integer(self): grp = FakeGroup({'x':False, 'y':False}) elem=([0,4,5], slice(20, None)) start, count, stride, take_ind = _StartCountStride(elem, (22, 25), ['x', 'y'], grp, (3,5), put=True) assert_equal(start[0][0], (0, 20)) assert_equal(start[1][0], (4, 20)) assert_equal(start[2][0], (5, 20)) assert_equal(count[0], np.array([[1,5],])) assert_equal(stride[0][0], (1, 1)) assert_equal(take_ind[0][0], (0, slice(None))) assert_equal(take_ind[1][0], (1, slice(None))) assert_equal(take_ind[2][0], (2, slice(None))) def test_booleans(self): grp = FakeGroup({'x':False, 'y':False, 'z':False}) elem=([0,4,5], np.array([False, True, False, True, True]), slice(None)) start, count, stride, take_ind = _StartCountStride(elem, (10, 5, 12), ['x', 'y', 'z'], grp, (3, 3, 12), put=True) assert_equal(start[0][0][0], (0, 1, 0)) assert_equal(start[1][0][0], (4, 1, 0)) assert_equal(start[2][0][0], (5, 1, 0)) assert_equal(start[0][1][0], (0, 3, 0)) assert_equal(count[0][0][0], (1, 1, 12)) assert_equal(stride[0][0][0], (1, 1, 1)) assert_equal(take_ind[0][0][0], (0, 0, slice(None))) assert_equal(take_ind[1][0][0], (1, 0, slice(None))) assert_equal(take_ind[0][1][0], (0, 1, slice(None))) def test_unlim(self): grp = FakeGroup({'time':True,'x':False, 'y':False}) elem = ([0,2,5], slice(None), slice(None)) start, count, stride, take_ind = _StartCountStride(elem, (0, 6, 7),\ ['time', 'x', 'y'], grp, (3, 6, 7), put=True) assert_equal(start[0][0][0], (0, 0, 0)) assert_equal(start[2][0][0], (5, 0, 0)) assert_equal(count[2][0][0], (1, 6, 7)) assert_equal(take_ind[0][0][0], (0, slice(None), slice(None))) assert_equal(take_ind[2][0][0], (2, slice(None), slice(None))) # pull request #683 broke this, since _StartCountStride now uses # Dimension.__len__. #elem = (slice(None, None, 2), slice(None), slice(None)) #start, count, stride, take_ind = _StartCountStride(elem, (0, 6, 7),\ # ['time', 'x', 'y'], grp, (10, 6, 7),put=True) #assert_equal(start[0][0][0], (0,0,0)) #assert_equal(count[0][0][0], (5, 6, 7)) #assert_equal(stride[0][0][0], (2, 1, 1)) #assert_equal(take_ind[0][0][0], 3*(slice(None),)) def test_ellipsis(self): grp = FakeGroup({'x':False, 'y':False, 'time':True}) elem=(Ellipsis, slice(1, 4)) start, count, stride, take_ind = _StartCountStride(elem, (22,25,1),\ ['x', 'y', 'time'], grp, (22,25,3), put=True) assert_equal(start[0,0,0], [0, 0, 1]) assert_equal(count[0,0,0], (22, 25, 3)) assert_equal(take_ind[0,0,0], (slice(None), slice(None), slice(None))) grp = FakeGroup({'time':True, 'h':False, 'z':False, 'y':False, 'x':False}) elem=(Ellipsis, [15,16,17,18,19], slice(None), slice(None)) start, count, stride, take_ind = _StartCountStride(elem, (2,10,20,10,10),\ ['time', 'h', 'z', 'y', 'x'], grp, (2,10,5,10,10), put=True) assert_equal(start[0,0,0,0,0], [0, 0, 15, 0, 0]) assert_equal(count[0,0,0,0,0], [2, 10, 5, 10, 10]) assert_equal(stride[0,0,0,0,0], [1, 1, 1, 1, 1]) assert_equal(take_ind[0,0,0,0,0], (slice(None), slice(None), slice(None), slice(None), slice(None))) try: elem=(Ellipsis, [15,16,17,18,19], slice(None)) start, count, stride, take_ind = _StartCountStride(elem, (2,10,20,10,10),\ ['time', 'z', 'y', 'x'], grp, (2,10,5,10,10), put=True) assert_equal(None, 'Should throw an exception') except IndexError as e: #assert_equal(str(e), "integer index exceeds dimension size") assert_equal(str(e), "list index out of range") try: elem=(Ellipsis, [15,16,17,18,19], Ellipsis) start, count, stride, take_ind = _StartCountStride(elem, (2,10, 20,10,10),\ ['time', 'z', 'y', 'x'], grp, (2,10,5,10,10), put=True) assert_equal(None, 'Should throw an exception') except IndexError as e: #assert_equal(str(e), "At most one ellipsis allowed in a slicing expression") assert_equal(str(e), "list index out of range") class FakeGroup: """Create a fake group instance by passing a dictionary of booleans keyed by dimension name.""" def __init__(self, dimensions): self.dimensions = {} for k,v in dimensions.items(): self.dimensions[k] = FakeDimension(v) class FakeDimension: def __init__(self, unlimited=False): self.unlimited = unlimited def isunlimited(self): return self.unlimited if __name__=='__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_vars.py000066400000000000000000000064621413751447500203170ustar00rootroot00000000000000import sys import unittest import os import tempfile import numpy as np from numpy.random.mtrand import uniform from numpy.testing import assert_array_equal, assert_array_almost_equal import netCDF4 # test variable creation. FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name VAR_DOUBLE_NAME="dummy_var" VAR_SHORT_NAME='dummy_var_short' VARNAMES = sorted([VAR_DOUBLE_NAME,VAR_SHORT_NAME]) GROUP_NAME = "dummy_group" DIM1_NAME="x" DIM1_LEN=2 DIM2_NAME="y" DIM2_LEN=3 DIM3_NAME="z" DIM3_LEN=25 randomdata = uniform(size=(DIM1_LEN,DIM2_LEN,DIM3_LEN)) class VariablesTestCase(unittest.TestCase): def setUp(self): self.file = FILE_NAME f = netCDF4.Dataset(self.file, 'w') f.createDimension(DIM1_NAME, DIM1_LEN) f.createDimension(DIM2_NAME, DIM2_LEN) f.createDimension(DIM3_NAME, DIM3_LEN) v1 = f.createVariable(VAR_DOUBLE_NAME, 'f8',(DIM1_NAME,DIM2_NAME,DIM3_NAME)) v2 = f.createVariable(VAR_SHORT_NAME, 'i2',(DIM2_NAME,DIM3_NAME)) v1.long_name = 'dummy data root' g = f.createGroup(GROUP_NAME) g.createDimension(DIM1_NAME, DIM1_LEN) g.createDimension(DIM2_NAME, DIM2_LEN) g.createDimension(DIM3_NAME, DIM3_LEN) v1g = g.createVariable(VAR_DOUBLE_NAME, 'f8',(DIM1_NAME,DIM2_NAME,DIM3_NAME)) v2g = g.createVariable(VAR_SHORT_NAME, 'i2',(DIM2_NAME,DIM3_NAME)) v1g.long_name = 'dummy data subgroup' v1[:] = randomdata v1g[:] = randomdata f.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing primitive variables""" f = netCDF4.Dataset(self.file, 'r') # check variables in root group. varnames = sorted(f.variables.keys()) v1 = f.variables[VAR_DOUBLE_NAME] v2 = f.variables[VAR_SHORT_NAME] assert varnames == VARNAMES assert v1.dtype.str[1:] == 'f8' assert v2.dtype.str[1:] == 'i2' assert v1.long_name == 'dummy data root' assert v1.dimensions == (DIM1_NAME,DIM2_NAME,DIM3_NAME) assert v2.dimensions == (DIM2_NAME,DIM3_NAME) assert v1.shape == (DIM1_LEN,DIM2_LEN,DIM3_LEN) assert v2.shape == (DIM2_LEN,DIM3_LEN) assert v1.size == DIM1_LEN * DIM2_LEN * DIM3_LEN assert len(v1) == DIM1_LEN #assert np.allclose(v1[:],randomdata) assert_array_almost_equal(v1[:],randomdata) # check variables in sub group. g = f.groups[GROUP_NAME] varnames = sorted(g.variables.keys()) v1 = g.variables[VAR_DOUBLE_NAME] # test iterating over variable (should stop when # it gets to the end and raises IndexError, issue 121) for v in v1: pass v2 = g.variables[VAR_SHORT_NAME] assert varnames == VARNAMES assert v1.dtype.str[1:] == 'f8' assert v2.dtype.str[1:] == 'i2' assert v1.long_name == 'dummy data subgroup' assert v1.dimensions == (DIM1_NAME,DIM2_NAME,DIM3_NAME) assert v2.dimensions == (DIM2_NAME,DIM3_NAME) assert v1.shape == (DIM1_LEN,DIM2_LEN,DIM3_LEN) assert v2.shape == (DIM2_LEN,DIM3_LEN) #assert np.allclose(v1[:],randomdata) assert_array_almost_equal(v1[:],randomdata) f.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/tst_vlen.py000066400000000000000000000167731413751447500203160ustar00rootroot00000000000000import sys import unittest import os import tempfile from netCDF4 import Dataset import numpy as np from numpy.testing import assert_array_equal FILE_NAME = tempfile.NamedTemporaryFile(suffix='.nc', delete=False).name VL_NAME = 'vlen_type' VL_BASETYPE = np.int16 DIM1_NAME = 'lon' DIM2_NAME = 'lat' nlons = 5; nlats = 5 VAR1_NAME = 'ragged' VAR2_NAME = 'strings' VAR3_NAME = 'strings_alt' VAR4_NAME = 'string_scalar' VAR5_NAME = 'vlen_scalar' data = np.empty(nlats*nlons,object) datas = np.empty(nlats*nlons,object) nn = 0 for n in range(nlats*nlons): nn = nn + 1 data[n] = np.arange(nn,dtype=VL_BASETYPE) datas[n] = ''.join([chr(i) for i in range(97,97+nn+1)]) data = np.reshape(data,(nlats,nlons)) datas = np.reshape(datas,(nlats,nlons)) class VariablesTestCase(unittest.TestCase): def setUp(self): self.file = FILE_NAME f = Dataset(self.file,'w') vlen_t = f.createVLType(VL_BASETYPE, VL_NAME) f.createDimension(DIM1_NAME,nlons) f.createDimension(DIM2_NAME,nlats) ragged = f.createVariable(VAR1_NAME, vlen_t,\ (DIM2_NAME,DIM1_NAME)) strings = f.createVariable(VAR2_NAME, str, (DIM2_NAME,DIM1_NAME)) strings_alt = f.createVariable(VAR3_NAME, datas.astype(str).dtype, (DIM2_NAME, DIM1_NAME)) string_scalar = f.createVariable(VAR4_NAME,str,()) vlen_scalar = f.createVariable(VAR5_NAME,vlen_t,()) ragged[:] = data ragged[-1,-1] = data[-1,-1] strings[:] = datas strings[-2,-2] = datas[-2,-2] strings_alt[:] = datas.astype(str) string_scalar[...] = 'foo' #issue458 vlen_scalar[...] = np.array([1,2,3],np.int16) f.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing vlen variables""" f = Dataset(self.file, 'r') v = f.variables[VAR1_NAME] vs = f.variables[VAR2_NAME] vs_alt = f.variables[VAR3_NAME] assert list(f.vltypes.keys()) == [VL_NAME] assert f.vltypes[VL_NAME].dtype == VL_BASETYPE assert f.variables['string_scalar'][...] == 'foo' assert_array_equal(f.variables['vlen_scalar'][...],np.array([1,2,3],np.int16)) data2 = v[:] data2s = vs[:] for i in range(nlons): for j in range(nlats): assert_array_equal(data2[j,i], data[j,i]) assert datas[j,i] == data2s[j,i] assert_array_equal(datas, vs_alt[:]) f.close() class TestInvalidDataType(unittest.TestCase): def runTest(self): f = Dataset(FILE_NAME, 'w', format='NETCDF3_CLASSIC') f.createDimension('x', 1) # using assertRaisesRegext as a context manager # only works with python >= 2.7 (issue #497) #with self.assertRaisesRegexp(ValueError, 'strings are only supported'): # f.createVariable('foo', str, ('x',)) try: f.createVariable('foo', str, ('x',)) except ValueError: pass f.close() os.remove(FILE_NAME) class TestScalarVlenString(unittest.TestCase): # issue 333 def runTest(self): f = Dataset(FILE_NAME, 'w', format='NETCDF4') teststring = f.createVariable('teststring', str) stringout = "yyyymmdd_hhmmss" teststring[()] = stringout f.close() f = Dataset(FILE_NAME) assert f.variables['teststring'][:] == stringout f.close() os.remove(FILE_NAME) class TestIntegerIndex(unittest.TestCase): # issue 526 def runTest(self): strtest = Dataset(FILE_NAME, 'w', format='NETCDF4') strtest.createDimension('tenstrings', 10) strtest.createVariable('tenstrings', str, ['tenstrings']) strtest['tenstrings'][np.int32(5)] = 'asdf' strtest['tenstrings'][6.0] = 'asdf' strtest.close() f = Dataset(FILE_NAME) assert f.variables['tenstrings'][np.int32(5)] == 'asdf' assert f.variables['tenstrings'][6.0] == 'asdf' f.close() os.remove(FILE_NAME) class TestObjectArrayIndexing(unittest.TestCase): def setUp(self): self.file = FILE_NAME f = Dataset(self.file,'w') vlen_t = f.createVLType(VL_BASETYPE, VL_NAME) f.createDimension(DIM1_NAME,nlons) f.createDimension(DIM2_NAME,nlats) strings_alt = f.createVariable(VAR3_NAME, datas.astype(str).dtype, (DIM2_NAME, DIM1_NAME)) strings_alt[:] = datas.astype(str) f.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing vlen variables""" f = Dataset(self.file, 'r') vs_alt = f.variables[VAR3_NAME] unicode_strings = vs_alt[:] fancy_indexed = unicode_strings[0][[1,2,4]] assert fancy_indexed[0] == 'abc' assert fancy_indexed[1] == 'abcd' assert fancy_indexed[2] == 'abcdef' f.close() class VlenAppendTestCase(unittest.TestCase): def setUp(self): import netCDF4 if netCDF4.__netcdf4libversion__ < "4.4.1": self.skip = True try: self.skipTest("This test requires NetCDF 4.4.1 or later.") except AttributeError: # workaround for Python 2.6 (skipTest(reason) is new # in Python 2.7) pass else: self.skip = False self.file = FILE_NAME f = Dataset(self.file, 'w') vlen_type = f.createVLType(np.float64, 'vltest') f.createDimension('x', None) v = f.createVariable('vl', vlen_type, 'x') w = f.createVariable('vl2', np.float64, 'x') f.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing appending to vlen variables (issue #527).""" # workaround for Python 2.6 if self.skip: return f = Dataset(self.file, 'a') w = f.variables["vl2"] v = f.variables["vl"] w[0:3] = np.arange(3, dtype=np.float64) v[0] # sometimes crashes v[0].tolist() # sometimes crashes v[0].size # BOOM! f.close() class Vlen_ScaledInts(unittest.TestCase): def setUp(self): self.file = FILE_NAME nc = Dataset(self.file, 'w') vlen_type = nc.createVLType(np.uint8, 'vltest') nc.createDimension('x', None) v = nc.createVariable('vl', vlen_type, 'x') v.scale_factor = 1./254. v.missing_value=np.array(255,np.uint8) # random lengths between 1 and 1000 ilen = np.random.randint(1,1000,size=100) n = 0 for nlen in ilen: data = np.random.uniform(low=0.0, high=1.0, size=nlen) v[n] = data if n==99: self.data = data n += 1 nc.close() def tearDown(self): # Remove the temporary files os.remove(self.file) def runTest(self): """testing packing float vlens as scaled integers (issue #1003).""" nc = Dataset(self.file) data = nc['vl'][-1] # check max error of compression err = np.abs(data - self.data) assert(err.max() < nc['vl'].scale_factor) # turn off auto-scaling nc.set_auto_maskandscale(False) data = nc['vl'][-1] assert(data[-1] == np.around(self.data[-1]/nc['vl'].scale_factor)) nc.close() if __name__ == '__main__': unittest.main() netcdf4-python-1.5.8rel/test/ubyte.nc000066400000000000000000000002301413751447500175350ustar00rootroot00000000000000CDF d ub  _Unsignedtruesb”ÿ€