././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1705116002.0274935 sunpy-5.1.1/0000755000175100001770000000000014550400542012300 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/CHANGELOG.rst0000644000175100001770000076444114550400520014335 0ustar00runnerdocker5.1.1 (2024-01-12) ================== New Features ------------ - Add an example of plotting a rectangle on a map with a rotation angle relative to the axes (:ref:`sphx_glr_generated_gallery_plotting_plot_rotated_rectangle.py`). (`#7348 `__) - Added testing and explicit support for Python 3.12. (`#7351 `__) Bug Fixes --------- - When calling :meth:`sunpy.map.GenericMap.rotate` on an integer data array, with ``missing`` set to NaN (the default value), the method will now itself raise an informative error message instead deferring to NumPy to raise the error. (`#7344 `__) Documentation ------------- - Fixed the usage of :meth:`~sunpy.map.GenericMap.superpixel` in :ref:`sphx_glr_generated_gallery_map_map_resampling_and_superpixels.py`. (`#7316 `__) - Added Clarification on setting JSOC Email. (`#7329 `__) - Added explanation text to :ref:`sphx_glr_generated_gallery_plotting_plotting_blank_map.py` about the offset between "(0, 0)" in helioprojective coordinates and the heliographic equator. (`#7352 `__) Internal Changes ---------------- - The ``delim_whitespace`` keyword in `pandas.read_csv` is deprecated and was updated with ``sep='\s+'``. This should have no affect on the output of the code. (`#7350 `__) - Fixed an environment-specific failure of a unit test for :meth:`sunpy.coordinates.Helioprojective.is_visible`. (`#7356 `__) 5.1.0 (2023-11-20) ================== New Features ------------ - Added the ability to skip over errors raised for invalid fits files when passing a list of files to map using the existing keyword argument ``silence_errors``. (`#7018 `__) - Added a :meth:`sunpy.coordinates.Helioprojective.is_visible` method to return whether the coordinate is visible (i.e., not obscured from the observer assuming that the Sun is an opaque sphere). (`#7118 `__) - Added a keyword option (``quiet``) for :func:`~sunpy.coordinates.get_body_heliographic_stonyhurst` to silence the normal reporting of the light-travel-time correction when ``observer`` is specified. (`#7142 `__) - Added the function :func:`sunpy.coordinates.sun.eclipse_amount` to calculate the solar-eclipse amount for an observer. (`#7142 `__) - Add a keyword (``map_center_longitude``) to :func:`~sunpy.map.header_helper.make_heliographic_header` for centering the heliographic map at a longitude other than zero longitude. (`#7143 `__) - The minimum required version of ``Glymur`` (an optional dependency for reading JPEG2000 files) has been increase to 0.9.1. (`#7164 `__) - Added new default colormap scalings for WISPR Maps. Plots are now clipped at zero, and `~astropy.visualization.AsinhStretch` is used for the scaling to ensure coronal details are visible despite the much-brighter stars. Parsing of the ``detector`` and ``level`` fields of the FITS headers is also improved. (`#7180 `__) - When creating a coordinate or coordinate frame without specifying ``obstime``, the ``obstime`` value from the ``observer`` frame attribute will be used if present. (`#7186 `__) - Added a GONG synoptic map class which fixes non-compliant FITS metadata (`#7220 `__) - Added the module `sunpy.coordinates.spice` to enable the use of the `~astropy.coordinates.SkyCoord` API to perform computations using `SPICE `__ kernels. (`#7237 `__) - Added three coordinate frames that depend on the orientation of Earth's magnetic dipole: `~sunpy.coordinates.Geomagnetic` (MAG), `~sunpy.coordinates.SolarMagnetic` (SM), and `~sunpy.coordinates.GeocentricSolarMagnetospheric` (GSM). (`#7239 `__) Bug Fixes --------- - Fix RHESSI (`~sunpy.net.dataretriever.RHESSIClient`) fallback server detection. (`#7092 `__) - Fix bug in :func:`~sunpy.coordinates.get_horizons_coord` when specifying a time range via a dictionary that could cause the returned times to be slightly different from the supplied times. (`#7106 `__) - Updated the url of the `~sunpy.net.dataretriever.GBMClient` to match on files other than those that end with version 0 (i.e., V0.pha). (`#7148 `__) - When directly instantiating a `~astropy.wcs.WCS` from a FITS header that contains both Stonyhurst and Carrington heliographic coordinates for the observer location, the Stonyhurst coordinates will now be prioritized. This behavior is now consistent with the `~sunpy.map.Map` class, which has always prioritized Stonyhurst coordinates over Carrington coordinates. (`#7188 `__) - Fixed a bug with :func:`~sunpy.map.sample_at_coords()` where sampling outside the bounds of the map would sometimes not error and instead return strange pixel values. (`#7206 `__) - Improved code when loading CDF files to improve performance and avoid raising of pandas performance warnings. (`#7247 `__) - Fixed a bug with :meth:`sunpy.map.GenericMap.plot` where setting ``norm`` to ``None`` would result in an error. (`#7261 `__) Documentation ------------- - Removed the specification of a non-identity rotation matrix in two reprojection examples. (`#7114 `__) - Added an example (:ref:`sphx_glr_generated_gallery_showcase_stereoscopic_3d.py`) for how to make an anaglyph 3D (i.e., red-cyan) image from a stereoscopic observation. (`#7123 `__) - Added an example (:ref:`sphx_glr_generated_gallery_showcase_eclipse_amount.py`) to show how to obtain information about a solar eclipse using :func:`sunpy.coordinates.sun.eclipse_amount`. (`#7142 `__) - Changed the :ref:`sphx_glr_generated_gallery_map_masking_hmi.py` to reproject AIA to HMI instead of the other way around. This is to avoid interpolating the HMI LOS magnetic field data. (`#7160 `__) - Fixed the timeseries peak finding example. Previously there was a bug when plotting the data with pandas. (`#7199 `__) - Added an example (:ref:`sphx_glr_generated_gallery_units_and_coordinates_spice.py`) for how to perform `SPICE `__ computations using the `~astropy.coordinates.SkyCoord` API. (`#7237 `__) Deprecations ------------ - Deprecated ``silence_errors`` in Map and Timeseries. This has been replaced with ``allow_errors`` keyword. (`#7021 `__) - The ``sunpy.coordinates.transformations`` module is now slated for removal from the public API as it consists of internal functions used by coordinate transformations. The context managers :func:`sunpy.coordinates.transform_with_sun_center` and :func:`sunpy.coordinates.propagate_with_solar_surface` should be accessed under `sunpy.coordinates`. (`#7113 `__) Removals -------- - ``sunpy.map.extract_along_coord()`` has been removed. Instead, use :func:`~sunpy.map.pixelate_coord_path`, and then pass its output to :func:`~sunpy.map.sample_at_coords`. ``pixelate_coord_path`` uses a different line algorithm by default, but you can specify ``bresenham=True`` as an argument to use the same line algorithm as ``extract_along_coord``. (`#7200 `__) - ``sunpy.visualisation.limb.draw_limb()`` has been removed. Use :func:`sunpy.visualization.drawing.limb` instead. (`#7202 `__) - Removed ``GenericTimeSeries.index``. Use ``GenericTimeseries.time`` instead as a direct replacement. (`#7203 `__) - Removed the deprecated ``sunpy.io.cdf`` submodule, which is not intended to be user facing. (`#7240 `__) - Removed the deprecated ``sunpy.io.jp2``, which is not intended to be user facing. (`#7241 `__) - Removed the deprecated ``sunpy.io.file_tools``, which is not intended to be user facing. (`#7242 `__) - The deprecated ``sunpy.data.download_sample_data()`` has been removed Use :func:`sunpy.data.sample.download_all` instead. (`#7250 `__) Internal Changes ---------------- - Removed the Binder configuration and link in README. This is because the configuration was untested, and does not currently work. (`#7062 `__) - Add a Dependabot config file to auto-update GitHub action versions. (`#7068 `__) - Add tests to check whether various `~sunpy.map.Map` methods preserve laziness when operating on Maps backed by a `dask.array.Array`. (`#7100 `__) - Added missing support to find GOES-18 XRS data in `~sunpy.net.dataretriever.XRSClient`. (`#7108 `__) - Raise an error with a helpful message when :meth:`sunpy.map.GenericMap.plot` is called with a non-boolean value for the ``annotate`` keyword, because the user is probably trying to specify the axes. (`#7163 `__) - Fixed our ASDF manifest having the incorrect ID. (`#7282 `__) - Fix example formatting in a few asdf schemas. (`#7292 `__) - Pinned the ``drms`` requirement to ``< 0.7`` to avoid breaking changes in ``drms`` version 0.7. (`#7308 `__) 5.0.0 (2023-06-14) ================== Breaking Changes ---------------- - `~sunpy.net.dataretriever.XRSClient` now provides the re-processed GOES-XRS 8-15 data from NOAA. These files are now all NetCDF and not FITS files. (`#6737 `__) - Changed the output of :func:`sunpy.map.sample_at_coords` to return the sampled values as `~astropy.units.Quantity` with the appropriate units instead of merely numbers. (`#6882 `__) Deprecations ------------ - Using `sunpy.map.header_helper.meta_keywords` is deprecated. Please see :ref:`Meta Keywords Table` for the list of metadata keywords used by `~sunpy.map.Map`. (`#6743 `__) - The utility function ``sunpy.map.extract_along_coord`` is deprecated. Use :func:`sunpy.map.pixelate_coord_path`, and then pass its output to :func:`sunpy.map.sample_at_coords`. (`#6840 `__) - Parsing SDO/EVE level 0CS average files is deprecated, and will be removed in sunpy 6.0. Parsing this data is untested, and we cannot find a file to test it with. If you know where level 0CS 'averages' files can be found, please get in touch at https://community.openastronomy.org/c/sunpy/5. (`#6857 `__) - Fully deprecated `sunpy.database`, with an expected removal version of sunpy 6.0. (`#6869 `__) - ``sunpy.io.cdf``, ``sunpy.io.file_tools`` and ``sunpy.io.jp2`` sub-modules have been deprecated, and will be removed in version 5.1. This because they are designed for internal use only, and removing it from the public API gives the developers more flexibility to modify it without impacting users. (`#6895 `__) New Features ------------ - A pure Python ``sunpy`` wheel is now published on PyPI with each release. ``pip`` will now default to installing the pure Python wheel instead of the source distribution on platforms other than Linux (x86-64) and macOS (x86-64 and ARM64). This should mean simpler and faster installs on such platforms, which includes the Raspberry Pi as well as some cloud computing services. This wheel does not contain the ``sunpy.io.ana`` compiled extension. If you need this extension (not available on Windows) you can install the ``sunpy`` source distribution with ``pip install --no-binary sunpy "sunpy[all]"``. (`#6175 `__) - Added three tutorials which replicate `~sunpy.map.CompositeMap` functionality (:ref:`sphx_glr_generated_gallery_plotting_AIA_HMI_composite.py`, :ref:`sphx_glr_generated_gallery_plotting_masked_composite_plot.py`, :ref:`sphx_glr_generated_gallery_plotting_three_map_composite.py`). (`#6459 `__) - `~sunpy.map.GenericMap.exposure_time` now looks for the exposure time in the ``XPOSURE`` key first and then the ``EXPTIME`` key. (`#6557 `__) - `~sunpy.map.header_helper.make_fitswcs_header` now includes the keyword argument ``detector`` for setting the ``DETECTOR`` FITS keyword in the resulting header. (`#6558 `__) - Adds two tutorials that demonstrate how to use LASCO data in overlaying maps (:ref:`sphx_glr_generated_gallery_plotting_lasco_overlay.py`) and how to create a custom mask for a LASCO C2 image (:ref:`sphx_glr_generated_gallery_map_lasco_mask.py`). (`#6576 `__) - Able to run the ``sunpy`` tests doing ``python -m sunpy.tests.self_test``. (`#6600 `__) - Able to detect gzip-compressed FITS files even if they don't have the ``.gz`` extension in the filename. `~sunpy.io.detect_filetype` now looks for the right file signature while checking for gzipped FITS files. (`#6693 `__) - Added ``AttrAnd`` and ``AttrOr`` to the namespace in ``sunpy.net.attrs``. This allows users to to avoid ``|`` or ``&`` when creating a query a larger query. (`#6708 `__) - `~sunpy.net.dataretriever.SUVIClient` now provides GOES-18 SUVI data. (`#6737 `__) - The minimum required versions of several core dependencies have been updated: - Python 3.9 - astropy 5.0.1 - numpy 1.21.0 The minimum required versions of these optional dependencies has also been updated: - Matplotlib 3.5.0 - dask 2021.4.0 - pandas 1.2.0 - scikit-image 0.18.0 - scipy 1.7.0 (`#6742 `__) - Added the utility function :func:`sunpy.map.pixelate_coord_path` to fully pixelate a coordinate path according to the pixels of a given map. (`#6840 `__) - The minimum version of h5netcdf required by sunpy has been bumped to version 0.11.0. (`#6859 `__) - Able to download files from REST/TAP Data Providers from the VSO. (`#6887 `__) - Adding data unit into html repr for `sunpy.map.Map` (`#6902 `__) - Joined ``HISTORY`` keys with newline characters when parsing ``HISTORY`` cards from FITS header. (`#6911 `__) - Added the ability to query for the GOES-XRS 1 minute average data with the `.XRSClient`. (`#6925 `__) - Increased minimum version of `parfive` to 2.0.0. We are aware the change in the ``parfive`` minimum version is a release earlier than our dependency policy allows for. However, due to significant issues that ``parfive`` v2.0.0 solves and changes to remote servers, we have decided to increase it to improve the user experience when downloading files. (`#6942 `__) Bug Fixes --------- - Fixed the incorrect calculation in :func:`~sunpy.map.header_helper.make_fitswcs_header` of the rotation matrix from a rotation angle when the pixels are non-square. (`#6597 `__) - Return code from ``self_test`` is now non-zero if it stops due to missing dependencies. (`#6600 `__) - Fixed an issue with loading old EIT fits files with `sunpy.map.Map` where the date could not be parsed. (`#6605 `__) - Fixed a bug where the `~sunpy.map.GenericMap.exposure_time` returned ``None`` when the exposure time key was set to zero. (`#6637 `__) - Fixed a bug that prevented specifying a `~astropy.coordinates.BaseCoordinateFrame` (as opposed to a `~astropy.coordinates.SkyCoord`) to :meth:`sunpy.map.GenericMap.draw_quadrangle`. (`#6648 `__) - HMI JPEG2000 files from Helioviewer could not be loaded due to a bug in setting the plotting normalization. This has been fixed. (`#6710 `__) - The ``data_manager`` was not raising failed downloads correctly and would continue as if the file existed locally. Now it will raise any errors from ``parfive``. (`#6711 `__) - `~sunpy.map.sources.XRTMap` will now set the unit for XRT files if the ``BUNIT`` key is missing. (`#6725 `__) - `~sunpy.net.dataretriever.XRSClient` update use the new url for which the GOES-XRS 8-15 data is provided by NOAA. (`#6737 `__) - Updated `~sunpy.database` to be compatible with ``SQLAlchemy`` versions >=2.0 (`#6749 `__) - When using ``autoalign=True`` when plotting maps, the result was misaligned by half a pixel. (`#6796 `__) - :meth:`sunpy.map.GenericMap.submap` can now handle a `~astropy.coordinates.BaseCoordinateFrame` as input. (`#6820 `__) - Multi-line ``HISTORY`` and ``COMMENT`` keys metadata dictionaries are now correctly split into multiple history and comment cards when writing a FITS file. (`#6911 `__) - Pass in "max_splits" to Parfive to prevent multi connections to JSOC for JSOC only queries. (`#6921 `__) - When converting an `astropy.wcs.WCS` object to a solar coordinate frame the ``DATE-AVG`` key will be used before the ``DATE-OBS`` key, previously only ``DATE-OBS`` was checked. (`#6995 `__) - `sunpy.map.GenericMap.rotation_matrix` now applies the default values if any FITS rotation matrix keywords are missing from the header. (`#7004 `__) - Modified :func:`sunpy.io.special.srs.read_srs` to correctly handle uppercase SRS files and supplementary sections occurring after the main data sections (I, IA, II). (`#7035 `__) Documentation ------------- - Added an example of how to search for multiple wavelengths attributes for AIA data using `sunpy.net.attrs.AttrOr`. (`#6501 `__) - Added `sunpy.map.PixelPair` to the reference documentation. (`#6620 `__) - Split the installation docs into a new Installation tutorial, and an installation guide. (`#6639 `__) - Added an example (:ref:`sphx_glr_generated_gallery_time_series_goes_xrs_nrt_data.py`) to download GOES NRT data and load it into `~sunpy.timeseries.TimeSeries`. (`#6744 `__) - Added an example gallery (:ref:`sphx_glr_generated_gallery_acquiring_data_querying_and_loading_SHARP_data.py`) for querying SHARP data and loading it into a `~sunpy.map.Map`. (`#6757 `__) - Added an example (:ref:`sphx_glr_generated_gallery_units_and_coordinates_ParkerSolarProbe_trajectory.py`) to plot the trajectory of Parker Solar Probe. (`#6771 `__) - Created a "Showcase" section of the gallery, which includes a new example (:ref:`sphx_glr_generated_gallery_showcase_where_is_stereo.py`) and a relocated example (:ref:`sphx_glr_generated_gallery_showcase_hmi_cutout.py`). (`#6781 `__) - Updated examples in the gallery to always explicitly create an Axes and use that for plotting, instead of using the Matplotlib pyplot API. (`#6822 `__) - Added an example (:ref:`sphx_glr_generated_gallery_map_masking_hmi.py`) of how to mask a HMI map based on the intensity of AIA. (`#6825 `__) - Added an example (:ref:`sphx_glr_generated_gallery_plotting_mplcairo_plotting.py`) to blend two maps using ``mplcairo``. (`#6835 `__) - Changed the reprojecting images to different observers example (:ref:`sphx_glr_generated_gallery_map_transformations_reprojection_different_observers.py`) to avoid using custom wcs headers where possible. (`#6853 `__) - Added a note in examples :ref:`sphx_glr_generated_gallery_map_transformations_autoalign_aia_hmi.py` and :ref:`sphx_glr_generated_gallery_map_transformations_reprojection_align_aia_hmi.py` suggesting to use :meth:`~sunpy.coordinates.Helioprojective.assume_spherical_screen` to retain off-disk HMI data. (`#6855 `__) - Moved the Helioviewer migration guide from the tutorial to guide section of the docs. (`#6868 `__) - Moved the plotting section of the tutorial into the map section of the tutorial. (`#6870 `__) - Reorganized "Units" section of the Tutorial into smaller sections and added a section about unit equivalencies. (`#6879 `__) - Added clarifying detail (in the `~sunpy.time.TimeUTime` docstring) for how the ``utime`` time format handles seconds on a day with a leap second. (`#6894 `__) - Fixed a series of broken URLS and typos in examples and documentation strings. (`#6903 `__) - Improved the time tutorial. (`#6920 `__) - Add a "how-to" guide section to the documentation. (`#6926 `__) - Redesigned the landing page to highlight the different sections of the documentation. (`#6938 `__) - Significantly revised and improved the :ref:`sunpy-tutorial-maps` part of the tutorial. This included moving the section on custom maps to the :ref:`sunpy-how-to-index` section (see :ref:`sunpy-how-to-create-a-map`). (`#6944 `__) - Migrated example gallery entries for searching the VSO, using ``parse_time``, using the data manager, and using solar constants to the how-to guide. (`#6948 `__) - Reorganized some parts of the coordinates topic guide into multiple how-to guides. (`#6954 `__) - Move examples of how to create a Map from reference pages to a how-to guide. (`#6977 `__) - Cleaned up and simplified the :ref:`sunpy-tutorial-timeseries` section of the tutorial. (`#6990 `__) - Added a topic-guide to aid understanding the role, "rsun" plays in sunpy coordinate transformations and :meth:`sunpy.map.GenericMap.reproject_to`. (`#7000 `__) - Updated all of the sphinx anchors to be more consistent. This means that any use of the old anchors (intersphinx links to sunpy doc pages) will need to be updated. (`#7032 `__) Internal Changes ---------------- - When determining which VSO servers to use for queries, `.VSOClient` will now attempt to check if the cgi endpoint referenced by the WDSL file is accessible, and try the next endpoint if it can't be reached. This should mean that a small category of connection issues with the VSO are now automatically bypassed. (`#6362 `__) 4.1.0 (2022-11-11) ================== Breaking Changes ---------------- - Updated the sample data file, ``AIA_171_ROLL_IMAGE`` to be rice compressed instead of gzip compressed. This means that the data is now stored in the second HDU. (`#6221 `__) Deprecations ------------ - Passing positional arguments to all ``timeseries`` ``peek()`` methods is now deprecated, and will raise an error in sunpy 5.1. Pass the arguments with keywords (e.g. ``title='my plot title'``) instead. (`#6310 `__) - Using ``sunpy.timeseries.GenericTimeSeries.index``` is deprecated. Use `~sunpy.timeseries.GenericTimeSeries.time` to get an astropy Time object, or ``ts.to_dataframe().index`` to get the times as a pandas ``DataTimeIndex``. (`#6327 `__) - Deprecated the ``sunpy.visualization.limb`` module. The ``sunpy.visualization.limb.draw_limb`` function has been moved into `~sunpy.visualization.drawing` as :func:`~sunpy.visualization.drawing.limb`. (`#6332 `__) - The ``sunpy.net.helioviewer`` module is deprecated and will be removed in version 5.1. The Helioviewer Project now maintains a replacement Python library called `hvpy `__. As such, in consultation with the Helioviewer Project, we have decided to deprecate the ``HelioviewerClient`` class. (`#6404 `__) - Passing the ``algorithm``, ``return_footprint`` arguments as positional arguments is deprecated. Pass them as keyword arguments (e.g. ``..., return_footprint=True, ...``) instead. (`#6406 `__) - ``sunpy.data.download_sample_data()`` is now deprecated. Use :func:`sunpy.data.sample.download_all` instead. (`#6426 `__) - The sunpy.database module is no longer actively maintained and has a number of outstanding issues. It is anticiapted that sunpy.database will be formally deprecated in sunpy 5.0 and removed in sunpy 6.0. If you are using sunpy.database and would like to see a replacement, please join the discussion thread at https://community.openastronomy.org/t/deprecating-sunpy-database/495. (`#6498 `__) Removals -------- - The ``sunpy.io.fits`` sub-module has been removed, as it was designed for internal use. Use the `astropy.io.fits` module instead for more generic functionality to read FITS files. (`#6432 `__) - The ``sunpy.physics.solar_rotation`` sub-module has been removed, having been moved to `sunkit_image.coalignment`. (`#6433 `__) - Most of the `sunpy.visualization.animator` subpackage has been removed, with the exception of `~sunpy.visualization.animator.MapSequenceAnimator` It has been moved into the standalone `mpl-animators `_ package Please update your imports to replace ``sunpy.visualization.animator`` with ``mpl_animators``. (`#6434 `__) - Remove ``GenericMap.shift`` method and the ``GenericMap.shifted_value``. Use `~sunpy.map.GenericMap.shift_reference_coord` instead. (`#6437 `__) - ``sunpy.util.scraper`` has been removed. Use `sunpy.net.scraper` instead. (`#6438 `__) - ``sunpy.image.coalignment`` has been removed. Use `sunkit_image.coalignment` instead, which contains all the same functionality. (`#6440 `__) - :meth:`sunpy.map.GenericMap.draw_limb` can no longer be used to draw the limb on a non-WCS Axes plot. (`#6533 `__) - :meth:`sunpy.image.resample` no longer accepts "neighbour" as an interpolation method. Use "nearest" instead. (`#6537 `__) - :meth:`sunpy.image.transform.affine_transform` and :func:`sunpy.map.GenericMap.rotate` no longer accepts the ``use_scipy`` keyword. (`#6538 `__) New Features ------------ - Updated and expanded the HTML representation for `~sunpy.timeseries.TimeSeries`. (`#5951 `__) - When reading CDF files, any columns with a floating point data type now have their masked values converted to NaN. (`#5956 `__) - Add support for saving `~sunpy.map.GenericMap` as JPEG 2000 files. (`#6153 `__) - Add a function ``sunpy.map.extract_along_coord`` that, for a given set of coordinates, finds each array index that crosses the line traced by those coordinates and returns the value of the data array of a given map at those array indices. (`#6189 `__) - Three new maps have been added to the sample data from STEREO A and STEREO B at 195 Angstrom, and AIA at 193 Angstrom. These images are from a time when the three spacecraft were equally spaced around the Sun, and therefore form near complete instantaneous coverage of the solar surface. Users upgrading to this version will find this three files download when they use the sample data for the first time. (`#6197 `__) - Added a SDO/AIA 1600 file of the Venus transit to the sunpy sample data. (`#6242 `__) - Created the `sunpy.visualization.drawing` module which includes new :func:`~sunpy.visualization.drawing.equator` and :func:`~sunpy.visualization.drawing.prime_meridian` functions. (`#6251 `__) - Expose GOES quality flags in order to allow filtering corrupt values when using the `~sunpy.timeseries.sources.goes.XRSTimeSeries`. (`#6260 `__) - All TimeSeries plotting methods now consistently set the same formatter and locator for the x-axis. (`#6264 `__) - :meth:`sunpy.timeseries.GenericTimeSeries.peek` now takes a ``title`` argument to set the title of the plot. (`#6304 `__) - Added the `sunpy.timeseries.GenericTimeSeries.time` property to get the times of a timeseries as a `~astropy.time.Time` object. (`#6327 `__) - Added the :ref:`sphx_glr_generated_gallery_plotting_plot_equator_prime_meridian.py` example to the Example Gallery. (`#6332 `__) - Added a new function :func:`sunpy.map.header_helper.make_heliographic_header` to help with generating FITS-WCS headers in Carrington or Stonyhurst coordinate systems that span the entire solar surface. (`#6415 `__) - Sample data files provided through `sunpy.data.sample` are now downloaded individually on demand rather than being all downloaded upon import of that module. To download all sample data files, call :func:`sunpy.data.sample.download_all`. (`#6426 `__) - `~.XRSTimeSeries` is now able to parse the primary detector information from the GOES-R XRS data if available. (`#6454 `__) - `sunpy.net.Scraper` now includes treats files as spanning a full interval equal to the smallest increment specified in the file pattern. For example, a pattern like ``"%Y.txt"`` that only contains a year specifier will be considered to span that full year. This means searches that fall entirely within the whole interval spanned by a pattern will return that file, where previously they did not. As an example, matching ``"%Y.txt"`` with ``TimeRange('2022-02-01', '2022-04-01')`` will now return ``["2022.txt"]`` where previously no files were returned. (`#6472 `__) - Implemented site configuration for sunpyrc, and modified documentation for sunpy customization. (`#6478 `__) - :func:`~sunpy.map.header_helper.make_fitswcs_header` now includes the keyword argument ``unit`` for setting the ``BUNIT`` FITS keyword in the resulting header. This will take precedence over any unit information attached to ``data``. (`#6499 `__) - If the ``data`` argument to :func:`~sunpy.map.header_helper.make_fitswcs_header` is an `~astropy.units.Quantity`, the associated unit will be used to set the ``BUNIT`` FITS keyword in the resulting header. (`#6499 `__) - Added a 304 sample data file called ``AIA_304_IMAGE``. (`#6546 `__) Bug Fixes --------- - Fix a bug that prevented EUI maps with missing wavelength metadata loading. (`#6199 `__) - The `sunpy.net.dataretriever.sources.noaa.SRSClient` was not correctly setting the passive mode for FTP connection resulting in a permission error. This has been fixed. (`#6256 `__) - Fixed `~sunpy.timeseries.sources.XRSTimeSeries` inability to read leap-second files for GOES. It floors the leap-second timestamp to be ``59.999``, so that Python datetime does not raise an exception. (`#6262 `__) - Changed the default scaling for `~sunpy.map.sources.EUIMap` from a linear stretch to a asinh stretch. To revert to the previous linear stretch do the following:: from astropy.visualization import ImageNormalize, LinearStretch euimap.plot_settings["norm"] = ImageNormalize(stretch=LinearStretch()) (`#6285 `__) - Fixed bugs when working with a coordinate frame where the observer is specified in `~sunpy.coordinates.frames.HeliographicStonyhurst` with a Cartesian representation, which is equivalent to Heliocentric Earth Equatorial (HEEQ). Now, the observer will always be converted to spherical representation when the coordinate frame is created. (`#6311 `__) - Fixed an error when Fido returns zero results from the VSO and some results from at least one other data source. This (now fixed) error is only present when using numpy version >= 1.23. (`#6318 `__) - If a level 1 XRT file does not specify the heliographic longitude of the spacecraft, a silent assumption is made that the spacecraft is at zero Stonyhurst heliographic longitude (i.e., the same longitude as Earth). (`#6333 `__) - The sample data retry was failing under parfive 2.0.0. (`#6334 `__) - Fixed bug that prevented `~sunpy.coordinates.metaframes.RotatedSunFrame` instances from being pickled. (`#6342 `__) - Fix a bug in loading `.XRSTimeSeries` due to unsupported quality flag column names. (`#6410 `__) - Adds units (dimensionless units) to the quality columns in `.XRSTimeSeries`. (`#6423 `__) - Refactored `~sunpy.map.sources.SXTMap` to use ITRS observer coordinate information in header rather than incorrect HGS keywords. The `~sunpy.map.sources.SXTMap` also now uses the default ``dsun`` property as this information can be derived from the (now corrected) observer coordinate. (`#6436 `__) - In `sunpy.map.GenericMap.coordinate_system` and `sunpy.map.GenericMap.date`, the default values will now be used if the expected key(s) used to derive those properties are empty. Previously, empty values of these keys were not treated as missing and thus the default values were not correctly filled in. (`#6436 `__) - Fixed a bug where the observer coordinate was incorrectly determined for `~sunpy.map.sources.KCorMap`. (`#6447 `__) - Trying to download an empty search response from the JSOC now results in an empty results object. Previously the results object contained the path to the sunpy download directory. (`#6449 `__) - Removed an error when searching CDAWEB using `sunpy.net.Fido` and no results are returned. An empty response table is now returned. (`#6450 `__) - Fix a bug to parse the GOES "observatory" number in `~.XRSTimeSeries` for GOES 13, 14, 15 and for the 1 minute GOES-R data. (`#6451 `__) - Changed the default scaling for `~sunpy.map.sources.XRTMap` from a linear stretch to `~astropy.visualization.LogStretch`. To revert to the previous linear stretch do the following:: from astropy.visualization import ImageNormalize, LinearStretch xrtmap.plot_settings["norm"] = ImageNormalize(stretch=LinearStretch()) (`#6480 `__) - Fix the ``detector`` property of `~sunpy.map.sources.SOTMap` to return "SOT". (`#6480 `__) - The right-hand y-axis of the GOES-XRS timeseries plots with labelled flare classes now automatically scales with the left-hand y-axis. (`#6486 `__) - Add support for Python 3.11. The deprecated `cgi.parse_header` is now available as `sunpy.util.net.parse_header`. (`#6512 `__) - Fixed the metadata handling of :meth:`~sunpy.map.GenericMap.resample` and :meth:`~sunpy.map.GenericMap.superpixel` so that the CDELTi values are scaled and the PCi_j matrix (if used) is modified in the correct manner for asymmetric scaling. The previous approach of having the PCi_j matrix store all of the scaling resulted in non-intuitive behaviors when accessing the `~sunpy.map.GenericMap.scale` and `~sunpy.map.GenericMap.rotation_matrix` properties, and when de-rotating a map via :meth:`~sunpy.map.GenericMap.rotate`. (`#6571 `__) - Fixd a bug with the `sunpy.map.GenericMap.scale` property for maps containing only the CDij matrix where the scale was not being determined from the CDij matrix. (`#6573 `__) - Fixed a bug with the `sunpy.map.GenericMap.rotation_matrix` property for maps using the CDij matrix formulism where the rotation matrix would be calculated incorrectly for non-square pixels. (`#6573 `__) - Fixed a bug where :func:`~sunpy.time.parse_time` would always disregard the remainder of a time string starting with the final period if it was followed by only zeros, which could affect the parsing of the time string. (`#6581 `__) Documentation ------------- - Improved annotations in the SRS active regions plotting example. (`#6196 `__) - Updated gallery examples that use STEREO data to use sample data instead of searching for and downloading data via Fido. (`#6197 `__) - Added the current bugfix release policy to the docs. (`#6336 `__) - The :ref:`sunpy-tutorial-maps` and :ref:`sunpy-tutorial-timeseries` have been reviewed and updated. (`#6345 `__) - Adds a pull request check list to the Developer's Guide. (`#6346 `__) - Improved the plotting guide. (`#6430 `__) - Slight improvements to the downloading data with Fido part of the guide. (`#6444 `__) - Split the units and coordinate guides on to separate pages, and made minor improvements to them. (`#6462 `__) - Added a how-to guide ``conda_for_dependencies`` for using ``conda`` to set up an environment with the complete set of dependencies to use all optional features, build the documentation, and/or run the full test suite. The guide also describes how best to have an editable installation of ``sunpy`` in this environment. (`#6524 `__) Internal Changes ---------------- - Added a ``columns`` keyword to each plot method for all `sunpy.timeseries.GenericTimeSeries` sources. (`#6056 `__) - Added a script in the ``sunpy/tools`` that will update all the Python libraries in ``sunpy/extern``. (`#6127 `__) - Added automatic conversion of unit strings in CDF files to astropy unit objects for the following instruments: PSP/ISOIS, SOHO/CELIAS, SOHO/COSTEP-EPHIN, and SOHO/ERNE. (`#6159 `__) - Add an environment variable ``SUNPY_NO_BUILD_ANA_EXTENSION`` which when present will cause sunpy to not compile the ANA C extension when building from source. (`#6166 `__) - ``sunpy`` now uses the `Limited Python API `__. Therefore, one binary distribution (wheel) per platform is now published and it is compatible with all Python versions ``sunpy`` supports. (`#6171 `__) - Add support for upcoming parfive 2.0 release. (`#6243 `__) - The primary sample-data URL will be changing from ``https://github.com/sunpy/sample-data/raw/master/sunpy/v1/`` to ``https://github.com/sunpy/data/raw/main/sunpy/v1/``. We expect GitHub to redirect from the old URL for sometime but will eventually expire it. The ``data.sunpy.org`` mirror will continue to be available. (`#6289 `__) - Add support for downloading sample data from more than two mirror locations. (`#6295 `__) - Timeseries data sources can now set the ``_peek_title`` class attribute to set the default plot title produced when ``.peek()`` is called and the user does not provide a custom title. (`#6304 `__) - All internal code for limb drawing now uses :func:`~sunpy.visualization.drawing.limb`. (`#6332 `__) - Add maintainer documentation on the backport bot (`#6355 `__) - Switched to using the standard matrix-multiplication operator (available in Python 3.5+) instead of a custom function. (`#6376 `__) - Fixed a colormap deprecation warning when importing the sunpy colormaps with Matplotlib 3.6. (`#6379 `__) - Removed custom tick label rotation from Lyra, EVE, and Norh timeseries sources, and grid drawing from NOAA and RHESSI sources. (`#6385 `__) - Added tests and test data for `~sunpy.map.sources.SXTMap` (`#6436 `__) - Fixed a bug where the private attribute ``_default_observer_coordinate`` for `~sunpy.map.GenericMap` was being used even when there was sufficient observer metadata in the header. (`#6447 `__) - Tidy the GOES XRSTimesSeries tests and add two new XRS files to test. (`#6460 `__) - Added a pre-commit hook for `codespell `__, and applied spelling fixes throughout the package. (`#6574 `__) v4.0.0 (2022-05-06) =================== Breaking Changes ---------------- - When rotating images using the SciPy rotation method, the default behavior is now to clip the output range to the input range, which matches the default behavior of the scikit-image rotation method. (`#5867 `__) - Any NaNs are now preserved by :func:`sunpy.image.transform.affine_transform` and :meth:`sunpy.map.GenericMap.rotate`. (`#5867 `__) - :func:`sunpy.image.transform.affine_transform` and :meth:`sunpy.map.GenericMap.rotate` now default to using SciPy for rotation instead of scikit-image, so rotation results may be slightly different. (`#5867 `__) - The math convenience methods of `sunpy.map.GenericMap` - :meth:`~sunpy.map.GenericMap.max`, :meth:`~sunpy.map.GenericMap.mean`, :meth:`~sunpy.map.GenericMap.min`, and , :meth:`~sunpy.map.GenericMap.std` - now ignore NaNs in the image data. (`#5867 `__) - :func:`sunpy.image.transform.affine_transform` and :meth:`sunpy.map.GenericMap.rotate` now default to using NaN instead of zero for the ``missing`` value, the value used for pixels in the output array that have no corresponding pixel in the input array. To obtain the previous behavior, ``missing`` should be explicitly specified as zero. (`#5867 `__) - The `.JSOCClient` and every `sunpy.net.dataretriever.GenericClient` was passing all ``**kwargs`` to `parfive.Downloader.enqueue_file`, this was unintended and has been removed. (`#6052 `__) - Changed the default interpolation order for :meth:`sunpy.map.GenericMap.rotate` from 4 to 3, with the precise meaning of these interpolation orders depending on the selected rotation method. For the default rotation method, which uses :func:`scipy.ndimage.affine_transform`, this changes the default interpolation from biquartic to bicubic, which reduces the computation time without reducing the quality of the output below what a typical user needs. (`#6089 `__) Deprecations ------------ - Deprecate ``sunpy.image.coalignment`` as the code has now been moved to `sunkit_image.coalignment` with an identical API. This module will be removed in sunpy 4.1. (`#5957 `__) - The ``sunpy.map.GenericMap.shift`` method has been renamed to `sunpy.map.GenericMap.shift_reference_coord` and ``shift`` has been deprecated. (`#5977 `__) - The ``sunpy.map.GenericMap.shifted_value`` property has been deprecated. Modifications to the reference coordinate can be found in the ``CRVAL1`` and ``CRVAL2`` keys of ``sunpy.map.GenericMap.meta.modified_items``. (`#5977 `__) - The ``sunpy.io.fits`` module is deprecated, as it was designed for internal use only. Use the `astropy.io.fits` module instead for more generic functionality to read FITS files. (`#5983 `__) - ``sunpy.physics.solar_rotation.mapsequence_solar_derotate`` is deprecated and will be removed in version 4.1. This function has been moved to ``sunkit_image.coalignment.mapsequence_coalign_by_rotation`` and has an identical API and functionality. (`#6031 `__) - ``sunpy.physics.solar_rotation.calculate_solar_rotate_shift`` is deprecated and will be removed in version 4.1. This function has been moved to ``sunkit_image.coalignment.calculate_solar_rotate_shift`` and has an identical API and functionality. (`#6031 `__) - Deprecated using `sunpy.map.GenericMap.draw_limb` on an Axes that is not a WCSAxes. (`#6079 `__) New Features ------------ - Added support for Python 3.10 (`#5568 `__) - Added support for ``"%Y.%m.%d_%H:%M:%S_UTC"`` and ``"%Y.%m.%d_%H:%M:%S"`` time formats in `sunpy.time.parse_time`. (`#5647 `__) - The ``rsun`` argument to :func:`~sunpy.map.header_helper.get_observer_meta` is now optional. (`#5655 `__) - Added the :meth:`~sunpy.net.base_client.QueryResponseTable.total_size`, which estimates the total size of the results from a Fido query. If this is supported by a client, the total size is printed alongside the results. To add support for this in external clients, make sure one column contains the individual filesizes as `~astropy.units.Quantity`, and set the ``size_column`` class attribute to the name of this column. (`#5659 `__) - Added the ability to specify the use of Carrington coordinates with :meth:`sunpy.map.GenericMap.draw_grid`. (`#5703 `__) - Printing a `.MetaDict` will now show each entry on a new line. (`#5765 `__) - Removed support for Python 3.7. (`#5773 `__) - The 'event_endtime', 'event_starttime' and 'event_peaktime' columns in a HEK query are now returned as `~astropy.time.Time` objects. Previously they were timestamp strings. (`#5806 `__) - Added a helpful warning message when converting a 2D Helioprojective coordinate will return all NaNs. (`#5817 `__) - The colorbar limits on HMI magnetic field maps are now automatically set to be symmetric about zero. (`#5825 `__) - Added a ``clip`` keyword to :func:`sunpy.image.transform.affine_transform` and :meth:`sunpy.map.GenericMap.rotate` to enable or disable whether the range of the output image is clipped to the range of the input range. (`#5867 `__) - Created the decorator :func:`sunpy.image.transform.add_rotation_function` for registering new rotation functions for use by :func:`sunpy.image.transform.affine_transform` and :meth:`sunpy.map.GenericMap.rotate`. (`#5867 `__) - `sunpy.image.transform.affine_transform` and :meth:`sunpy.map.GenericMap.rotate` have both had their ``use_scipy`` arguments deprecated. Instead use the new ``method`` argument to select from the available rotation methods. (`#5916 `__) - Added a Maxwell unit and any places where a conversion to Gauss occurs has been removed. (`#5998 `__) - Add a basic HTML representation for `~sunpy.timeseries.TimeSeries`. (`#6032 `__) - The minimum supported asdf version has been increased to 2.8.0 to allow future compatibility with the breaking changes planned for asdf 3.0. In addition to this the `asdf-astropy `__ package is now required to serialise and deserialise the sunpy coordinate frame classes to ASDF. (`#6057 `__) - Added the option to rotate using `OpenCV `__ when using :func:`sunpy.image.transform.affine_transform` or :meth:`sunpy.map.GenericMap.rotate` by specifying ``method='cv2'``. The OpenCV Python package must be installed on the system. (`#6089 `__) Bug Fixes --------- - Fixed reading CDF files when a column has no entries. If this is the case the column will be ignored, and a message logged at DEBUG level. (`#5664 `__) - Fixed the units of `sunpy.map.sources.HMISynopticMap.scale` and `sunpy.map.sources.MDISynopticMap.scale`. (`#5682 `__) - Fixed a bug where custom values in the ``plot_settings`` dictionary were not being propagated to new map instances created when calling map methods (e.g. ``.submap``). (`#5687 `__) - Added automatic conversion of some common but non-standard unit strings in CDF files to astropy unit objects. If sunpy does not recognise the unit string for a particular column, units of ``u.dimensionless_unscaled`` are applied to that column and a warning raised. If you think a given unit should not be dimensionless and support should be added for it in sunpy, please raise an issue at https://github.com/sunpy/sunpy/issues. (`#5692 `__) - The default ``id_type`` in :func:`sunpy.coordinates.get_horizons_coord` is now `None` to match the default ``id_type`` in astroquery 0.4.4, which will search major bodies first, and if no major bodies are found, then search small bodies. For older versions of astroquery the default ``id_type`` used by :func:`~sunpy.coordinates.get_horizons_coord` is still ``'majorbody'``. (`#5707 `__) - In consultation with JSOC, we now limit all JSOC downloads to one connection. This will override all connection user settings passed to the downloader. (`#5714 `__) - Updated the ``plot`` methods on some timeseries classes to correctly label and format the time axis. (`#5720 `__) - Fixed a long-standing bug where our logger could intercept Astropy warnings in addition to SunPy warnings, and thus could conflict with Astropy's logger. (`#5722 `__) - Update asdf schemas so that references use URIs not tags as this is not supported by the new asdf extensions API. (`#5723 `__) - Increased the default maximum amount of records returned from HEC to 500 from 10. If the maximum number of records are returned, a message is shown. (`#5738 `__) - Reading a series of CDF files where at least one of them is empty no longer raises an error. A message for each empty file is logged at the DEBUG level. (`#5751 `__) - :func:`sunpy.map.header_helper.make_fitswcs_header` now includes a PC_ij matrix in the returned header if no rotation is specified. (`#5763 `__) - In the case where a map header has no PC_ij values, CROTA2 != 0, and CDELT1 != CDELT2, the calculation of the map rotation matrix has been fixed. This bug only affected maps with non-zero rotation, no PC matrix in the header, and un-equal scales along the two image axes. (`#5766 `__) - Maps created from :meth:`~sunpy.map.GenericMap.resample` and :meth:`~sunpy.map.GenericMap.superpixel` have been fixed in the case where the resampling was not square, and the PCi_j matrix (often a rotation matrix) was not a multiple of the identity matrix. When the PCi_j or CDi_j formalisms are used in the metadata these are now correctly modified, and the CDELT values are left unchanged. (`#5786 `__) - The ``__repr__`` of several `sunpy.database` classes have been updated to remove angular brackets and add equals signs. As an example, ``''`` has changed to ``'DatabaseEntry(id=3)'`` (`#5790 `__) - Fixed a bug when rotating a map by a matrix that is not purely a rotation. The likely way to inadvertently encounter this bug was when de-rotating a map with rectangular pixels that were not aligned with the coordinate axes. (`#5803 `__) - Fixed a bug where rotating a map while simultaneously scaling it could result in some of the map data being cropped out. (`#5803 `__) - Symmetric colorbar limits are no longer set on intensity images from MDI. (`#5825 `__) - Fixed plotting and peeking NORH timeseries data with ``pandas`` 1.4.0. (`#5830 `__) - In the case where `sunpy.database.Database.fetch()` successfully downloads only some of the search results, a `~sunpy.database.PartialFetchError` is raised. This fixes a bug where the successful downloads would have been added to the database, but sometimes with incorrect metadata. (`#5835 `__) - When getting IRIS files from the VSO, Fido was incorrectly labelling them as XML files. (`#5868 `__) - `~sunpy.map.sources.HMIMap` now looks for ``'INSTRUME'`` instead of ``'TELESCOP'`` in order to support Helioviewer JPEG2000 versions of HMI data which do not preserve the ``'TELESCOP'`` keyword as expected in the JSOC standard. (`#5886 `__) - Fixes a bug where the ``cmap`` and ``norm`` keyword arguments were ignored when calling `~sunpy.map.MapSequence.plot`. (`#5889 `__) - Fix parsing of the GOES/XRS netcdf files to ignore leap seconds. (`#5915 `__) - Fixed compatibility with ``h5netcdf>0.14`` when loading GOES netcdf files. (`#5920 `__) - Fixed bugs with the rebinning and per-keV calculation for Fermi/GBM summary lightcurves (`~sunpy.timeseries.sources.GBMSummaryTimeSeries`). (`#5943 `__) - Fixed the unintentionally slow parsing of Fermi/GBM files (`~sunpy.timeseries.sources.GBMSummaryTimeSeries`). (`#5943 `__) - Fixes a bug in `~sunpy.map.sources.SJIMap` where undefined variable was used when parsing the wavelength. Also fixes the unit parsing by removing the "corrected" string from the ``BUNIT`` keyword as "corrected DN" cannot be parsed as a valid FITS unit. (`#5968 `__) - Fixed unit handling issue with `.GenericMap` and lowercasing the unit before it submits it to `astropy.units`. (`#5970 `__) - Fixed reading CDF files when a variable has more than 2 dimensions. If this is the case the variable will be ignored, and a user warning is provided. (`#5975 `__) - Fixed `sunpy.system_info` so it returns the extra group when an optional dependency is missing. (`#6011 `__) - Relax condition check for a HMI Synoptic map source. (`#6018 `__) - `.VSOClient` was not passing ``**kwargs`` through each download method. (`#6052 `__) - Fixed the inability to rotate images and maps with byte ordering that is different from the native byte order of the system (e.g., big-endian values on a little-endian system) for certain interpolation orders when internally using ``scikit-image``. (`#6064 `__) - Fixed a crash for dask arrays when displaying the `~sunpy.map.GenericMap` html representation. (`#6088 `__) - Constructing the color map name for a `~sunpy.map.sources.KCorMap` no longer requires the "detector" key in the metadata. This allows for reading files that are missing this keyword, as in the KCor JPEG2000 files. (`#6112 `__) - We now correctly pass keyword arguments in our internal FITS reader to `astropy.io.fits.open`. (`#6123 `__) Documentation ------------- - Fixed various plotting issues with the gallery example :ref:`sphx_glr_generated_gallery_units_and_coordinates_AIA_limb_STEREO.py`. (`#5534 `__) - Improved the gallery example :ref:`sphx_glr_generated_gallery_units_and_coordinates_SDO_to_STEREO_Coordinate_Conversion.py` to better illustrate how coordinate transformations interact with submaps and coordinate plotting. (`#5534 `__) - Tidy the API Reference section of the documentation and improve the landing page for the docs. (`#5623 `__) - Add info about loading CDF files to the API documentation. (`#5735 `__) - Added a known issues entry about ``scikit-image`` package version pinning. (`#5865 `__) - Edited entries in the example gallery to have a consistent plotting style. Added said style guidelines to the example gallery page in the dev guide. (`#5870 `__) - Added the gallery example :ref:`sphx_glr_generated_gallery_map_transformations_projection_custom_origin.py`, which specifically showcases the azimuthal equidistant projection (also known as the Postel projection). (`#5961 `__) - Remove the part of the `~sunpy.map.sources.SJIMap` docstring that says it only works on L1 as the data work for L2 and the level checking was not being enforced. (`#5968 `__) - Updated the timeseries documentation to make it clear that you can pass in a numpy array. (`#6024 `__) Internal Changes ---------------- - Sped up the parsing of results from the VSO. For large queries this significantly reduces the time needed to perform a query to the VSO. (`#5681 `__) - `sunpy.map.GenericMap.wcs` now checks that the scale property has the correct units whilst constructing the WCS. (`#5682 `__) - Added `packaging `__ as a core dependency as distutils is now deprecated. (`#5713 `__) - `~sunpy.util.exceptions.SunpyWarning` is no longer a subclass of `~astropy.utils.exceptions.AstropyWarning`. (`#5722 `__) - Running the tests now requires the ``pytest-xdist`` package. By default tests are *not* run in parallel, but can be configured to do so using ``pytest-xdist`` command line options. (`#5827 `__) - Migrate the asdf infrastructure to the new style converters etc added in asdf 2.8.0. This makes sure sunpy will be compatible with the upcoming asdf 3.0 release. (`#6057 `__) - Declare in our dependencies that we are not compatible with asdf 3.0.0 until we are. (`#6077 `__) - Improved performance of the code that parses dates in clients that use the `~sunpy.net.scraper.Scraper` to get available files. (`#6101 `__) 3.1.0 (2021-10-29) ================== Breaking Changes ---------------- - :meth:`sunpy.timeseries.sources.NOAAIndicesTimeSeries.peek` accepts ``plot_type`` as an argument instead of ``type``. (`#5200 `__) - Fill values are now set to `numpy.nan` in ``sunpy.timeseries.sources.noaa`` file parsers. They were previously set to a fill value of ``-1``. (`#5363 `__) - `sunpy.map.GenericMap.date` now looks for more metadata than just DATE-OBS, using new FITS keywords defined in version 4 of the standard. `sunpy.map.GenericMap.date` now returns, in order of preference: 1. The DATE-OBS FITS keyword 2. `~sunpy.map.GenericMap.date_average` 3. `~sunpy.map.GenericMap.date_start` 4. `~sunpy.map.GenericMap.date_end` 5. The current time. If DATE-OBS is present alongside DATE-AVG or DATE-BEG and DATE-END, this results in a behaviour change to favour the new (more precisely defined) keywords. It is recommended to use `~sunpy.map.GenericMap.date_average`, `~sunpy.map.GenericMap.date_start`, or `~sunpy.map.GenericMap.date_end` instead if you need one of these specific times. (`#5449 `__) - ``sunpy.io.fits.get_header`` no longer automatically tries to add the WAVEUNIT keyword if it isn't present in the header. To replicate the original behaviour do:: header = sunpy.io.fits.get_header(...) waveunit = sunpy.io.fits.extract_waveunit(header) if waveunit is not None: header['WAVEUNIT'] = waveunit The `sunpy.map.GenericMap.waveunit` property still uses ``sunpy.io.fits.extract_waveunit``` to try and get the waveunit if the WAVEUNIT key isn't present. (`#5501 `__) - `sunpy.map.GenericMap.wcs` no longer passes the whole ``.meta`` dictionary to `astropy.wcs.WCS` when constructing ``.wcs``. Instead each metadata value is manually taken from various map properties, which allows fixes to be made to the WCS without modifying the original map header. We think that `~sunpy.map.GenericMap.wcs` correctly sets all the keys needed for a full WCS header, but if you find anything missing please open an issue on the sunpy issue tracker. (`#5501 `__) Deprecations ------------ - ``sunpy.util.scraper.Scraper`` has been moved into `sunpy.net`, please update your imports to be ``from sunpy.net import Scraper``. (`#5364 `__) - Using "neighbour" as a resampling method in :func:`sunpy.image.resample.resample` is deprecated. Use "nearest" instead, which has the same effect. (`#5480 `__) - The `sunpy.visualization.animator` subpackage has been spun out into the standalone `mpl-animators `_ package, with the exception of `~sunpy.visualization.animator.MapSequenceAnimator`. Please update your imports to replace ``sunpy.visualization.animator`` with ``mpl_animators``. This is primarily because the ``ndcube`` package now relies on the animator classes as well as `sunpy`. (`#5619 `__) Removals -------- - The deprecated ``sunpy.roi.chaincode.Chaincode`` has been removed in favour of `sunpy.net.helio.Chaincode`. (`#5304 `__) - The deprecated ``sunpy.roi.roi`` was removed, there is no direct replacement but `astropy-regions `__ is something to consider. (`#5304 `__) - The deprecated ``sunpy.instr`` has been removed, please use `sunkit_instruments `__. (`#5304 `__) - The deprecated ``sunpy.map.GenericMap.size`` has been removed, please use ``sunpy.map.GenericMap.data.size``. (`#5304 `__) - The deprecated ability to read txt files from `sunpy.timeseries.sources.noaa.NOAAIndicesTimeSeries` and `sunpy.timeseries.sources.noaa.NOAAPredictIndicesTimeSeries` has been removed as the data provided by NOAA is now provided as JSON files. (`#5304 `__) - Removed various deprecated methods on our Fido clients and responses: 1. ``UnifiedResponse.build_table``, ``UnifiedResponse.tables``, ``UnifiedResponse.responses``, ``UnifiedResponse.get_response`` and ``UnifiedResponse.blocks`` as ``UnifiedResponse`` is now an `astropy.table.Table` that is sliceable. 2. ``UnifiedResponse.response_block_properties`` as ``UnifiedResponse.path_format_keys`` was added as a better replacement. 3. ``HECClient.time_query`` as you can now use ``Fido.search`` directly. 4. ``sunpy.net.jsoc.attrs.Keys`` was not used for querying JSOC. 5. ``sunpy.net.jsoc.JSOCClient.search_metadata`` as the functionality this provided was merged into `sunpy.net.jsoc.JSOCClient.search`. 6. ``sunpy.net.vso.VSOClient.link`` as better search support in the client replaces this method. (`#5304 `__) - The deprecated ``sunpy.map.GenericMap.draw_rectangle()`` has been removed, the replacement is :meth:`sunpy.map.GenericMap.draw_quadrangle` (`#5304 `__) - sunpy now errors if the unused ``.rsun`` or ``.heliographic_observer`` attributes are set on a `~astropy.wcs.WCS`. (`#5348 `__) - Support for passing non-unit levels to :meth:`sunpy.map.GenericMap.draw_contours` when map data has units set has been removed, and with now raise an error. (`#5352 `__) - The ``origin`` argument to :meth:`sunpy.map.GenericMap.world_to_pixel` and :meth:`sunpy.map.GenericMap.pixel_to_world` has been removed. (`#5353 `__) - Support for plotting or contouring `~sunpy.map.GenericMap` on axes that are not `~astropy.visualization.wcsaxes.WCSAxes` has been removed. To create a ``WCSAxes``, use the ``projection`` argument when the axes is created, e.g. ``fig.add_subplot(111, projection=my_map)``. (`#5354 `__) - The following search attributes in `sunpy.net.vso.attrs` have been removed: ``['Time', 'Instrument', 'Wavelength', 'Source', 'Provider', 'Level', 'Sample', 'Detector', 'Resolution', 'Physobs']``. Use the equivalent attribute from `sunpy.net.attrs` instead. (`#5355 `__) - The default response format from the VSO client is now a table. (`#5355 `__) - ``sunpy.net.hek.attrs.Time`` has been removed, use `sunpy.net.attrs.Time` instead. (`#5355 `__) New Features ------------ - Ensured that ``plot`` and ``peek`` will output the same figures for all `sunpy.timeseries.TimeSeries` sources. (`#5200 `__) - Added hook file and tests for using PyInstaller with sunpy. (`#5224 `__) - Allows :meth:`sunpy.map.GenericMap.draw_quadrangle` to accept pixel units as input to enable plotting boxes in the pixel space of the map, which can be different from the plot axes. (`#5275 `__) - Added the :func:`~sunpy.coordinates.propagate_with_solar_surface` context manager for transformations, which will automatically apply solar differential rotation when transforming a coordinate between frames with a change in time (``obstime``). (`#5281 `__) - Add support for parsing the observer location from a `~astropy.wcs.WCS` object when using the 'OBSGEO' formulation. This is the recommended way to define the observer location of a ground based observer. (`#5315 `__) - Added a new function, ``sunpy.visualization.draw_limb``, that draws the solar limb as seen from an arbitrary observer coordinate on a world coordinate system aware Axes. (`#5414 `__) - `sunpy.map.GenericMap.rsun_meters` now uses `sunpy.map.GenericMap.rsun_obs` as a fallback to calculate the assumed radius of emission if RSUN_REF metadata isn't present but metadata for `~sunpy.map.GenericMap.rsun_obs` is. (`#5416 `__) - Added :func:`sunpy.coordinates.utils.get_limb_coordinates` to get the solar limb coordinates as seen from a given observer. (`#5417 `__) - Printing the response from a `~sunpy.net.Fido` query now includes the URL where the data files are sourced from. If you develop a third-party `~sunpy.net.Fido` client, support for this can be automatically enabled by adding a ``info_url`` property to your `~sunpy.net.base_client.BaseClient` that returns a URL as a string. (`#5431 `__) - `~sunpy.timeseries.TimeSeries` can now read CDF files that conform to the ISTP/IACG guidelines (https://spdf.gsfc.nasa.gov/sp_use_of_cdf.html). (`#5435 `__) - The properties `~sunpy.map.GenericMap.date_start`, `~sunpy.map.GenericMap.date_end`, and `~sunpy.map.GenericMap.date_average` have been added to be drawn from the relevant FITS metadata, if present in the map header. (`#5449 `__) - Add default color map and normalization for `~sunpy.map.sources.HMISynopticMap` The default color map is 'hmimag' and the default normalization is linear between -1.5e-3 and +1.5e3, the expected normalization for this particular color map. (`#5464 `__) - The headers produced by :func:`~sunpy.map.header_helper.make_fitswcs_header` now include ``NAXIS``, ``NAXIS1``, and ``NAXIS2`` keywords. (`#5470 `__) - The `~astropy.wcs.WCS` instance returned by the `sunpy.map.GenericMap.wcs` property now includes the shape of the data array. (`#5470 `__) - Added the method :meth:`sunpy.map.GenericMap.reproject_to` for reprojecting a `~sunpy.map.Map` to a different WCS. This method requires the optional package `reproject` to be installed. (`#5470 `__) - Registered the time format ``tai_seconds`` for `astropy.time.Time` (via `~sunpy.time.TimeTaiSeconds`) to support parsing the numerical time format of TAI seconds since 1958-01-01 00:00:00. This format includes UTC leap seconds, and enables equivalent functionality to the ``anytim2tai`` routine in SSW. (`#5489 `__) - Added `sunpy.map.sources.WISPRMap` as a map source for WISPR on Parker Solar Probe. This improves the `~sunpy.map.GenericMap.name` of the map and adds correct information for the `~sunpy.map.GenericMap.processing_level` and `~sunpy.map.GenericMap.exposure_time`. (`#5502 `__) - ``sunpy.io.fits.write`` can now update the ``data`` and ``header`` of an existing HDU instance, as an alternative to creating a new instance of a specified HDU type. This adds support for writing a HDU (such as :class:`~astropy.io.fits.CompImageHDU`) initialised with non-default keyword arguments. (`#5503 `__) - Added `~sunpy.timeseries.GenericTimeSeries.observatory` to provide observatory information for the timeseries e.g. specific goes satellite number. (`#5556 `__) - :meth:`sunpy.timeseries.GenericTimeSeries.plot` and :meth:`sunpy.timeseries.GenericTimeSeries.peek` will now automatically label the y-axis if all the columns being plotted have the same units. (`#5557 `__) - :meth:`sunpy.timeseries.GenericTimeSeries.plot` and :meth:`sunpy.timeseries.GenericTimeSeries.peek` now have an option ``columns`` that allows plotting a subset of the columns present. (`#5557 `__) - Added a new CDAWeb client, along with helper utilities to `sunpy.net.cdaweb`. (`#5558 `__) - Support for filtering searches with JSOC keywords has been added to ``Fido.search``. (`#5566 `__) - Added support for arithmetic operations between`~sunpy.map.GenericMap` and array-like objects. (`#5614 `__) - Added ``quantity`` attribute to `~sunpy.map.GenericMap` to expose the ``data`` attribute as a `~astropy.units.Quantity` using the ``unit`` attribute. (`#5614 `__) Bug Fixes --------- - :meth:`sunpy.map.GenericMap.superpixel` now keeps the reference coordinate of the WCS projection the same as the input map, and updates the reference pixel accordingly. This fixes inconsistencies in the input and output world coordinate systems when a non-linear projection is used. (`#5295 `__) - Inputs to the ``dimensions`` and ``offset`` arguments to :meth:`sunpy.map.GenericMap.superpixel` in units other than ``u.pix`` (e.g. ```u.kpix``) are now handled correctly. (`#5301 `__) - Fractional inputs to the ``dimensions`` and ``offset`` arguments to :meth:`sunpy.map.GenericMap.superpixel` were previously rounded using `int` in the superpixel algorithm, but not assigned integer values in the new metadata. This has now been changed so the rounding is correctly reflected in the metadata. (`#5301 `__) - Remove runtime use of ``astropy.tests.helper.assert_quantity_allclose`` which introduces a runtime dependency on ``pytest``. (`#5305 `__) - :meth:`sunpy.map.GenericMap.resample` now keeps the reference coordinate of the WCS projection the same as the input map, and updates the reference pixel accordingly. This fixes inconsistencies in the input and output world coordinate systems when a non-linear projection is used. (`#5309 `__) - Fix saving `.GenericMap` to an asdf file with version 2.8.0 of the asdf package. (`#5342 `__) - When the limb is entirely visible, :meth:`sunpy.map.GenericMap.draw_limb` no longer plots an invisible patch for the hidden part of the limb and now returns `None` instead of the invisible patch. Similarly, when the limb is entirely invisible, no patch is drawn for the visible part and `None` is returned instead of the visible patch. (`#5414 `__) - :meth:`sunpy.map.GenericMap.plot` now correctly sets axis labels based on the coordinate system of the axes, and not the coordinate system of the map being plotted. This was previously only an issue if using ``autoalign=True`` when the Map coordinate system was different to the axes coordinate system. (`#5432 `__) - :meth:`sunpy.map.GenericMap.plot` no longer adds a unit string to the axis labels if the axes being plotted on is a WCSAxes. For a WCSAxes, angular units are indicated in the tick labels, and automatically change when the zoom level changes from e.g. degrees to arc-minutes. This could previously lead to situations where the axis label units were incorrect. (`#5432 `__) - Implement automatic fallback to helioviewer mirrors if API is non-functional. (`#5440 `__) - Fixed the incorrect value for the FITS WCS ``LONPOLE`` keyword when using :func:`~sunpy.map.header_helper.make_fitswcs_header` for certain combinations of WCS projection and reference coordinate. (`#5448 `__) - The date returned by `~sunpy.map.GenericMap.date` for Solar Orbiter/EUI maps has been adjusted to be taken from the DATE-AVG keyword (the middle of the image acquisition period), instead of the DATE-OBS keyword (the beginning of the image acquisition period). This means the observer coordinate now has the correct date. (`#5462 `__) - The ``.unit`` attribute for HMI synoptic maps has been fixed. (`#5467 `__) - When "TAI" is in the date string, `sunpy.map.GenericMap.date` now only raises a warning if the TIMESYS keyword is present and different to "TAI". Previously a warning was raised all the time when "TAI" was in the date string. (`#5468 `__) - Fixed a bug where the property `sunpy.map.GenericMap.rsun_meters` would always internally determine the observer location, even when it is not needed, particularly for Stonyhurst heliographic maps, which have no notion of an observer. Thus, when working with a Stonyhurst heliographic map, a user could get an irrelevant warning message about having to assume an observer location (Earth center). (`#5478 `__) - Fixed the unintended insertion of (assumed) observer location information when accessing the property `sunpy.map.GenericMap.wcs` for Stonyhurst heliographic maps. (`#5478 `__) - Fixed an incorrect value for the FITS WCS ``LONPOLE`` keyword when using :func:`~sunpy.map.header_helper.make_fitswcs_header` for `~sunpy.coordinates.frames.Helioprojective` maps with certain values of latitude for the reference coordinate. (`#5490 `__) - A non-standard ``CROTA`` keyword included in a `sunpy.map.sources.EUIMap` FITS header is now renamed to the recommended ``CROTA2`` so a warning is no longer raised. (`#5493 `__) - The plotting x-limits of :meth:`sunpy.timeseries.sources.NOAAIndicesTimeSeries.plot` are now adjusted to only include finite points in the timeseries data. (`#5496 `__) - The Hinode/XRT map source now corrects the TIMESYS keyword, fixing the ``.wcs`` property that was previously broken for Hinode/XRT maps. (`#5508 `__) - Updated `sunpy.map.CompositeMap.plot` to support the ``linestyles`` and ``colors`` arguments, in addition to the existing ``linewidths`` argument. (`#5521 `__) - Fixed a bug where rotating a `~sunpy.map.Map` could result in an extremely small shift (at the numerical-precision level) in the mapping from world coordinates to pixels. (`#5553 `__) - Fixed a bug where rotating a `~sunpy.map.Map` that is missing observation-time metadata could result in an incorrect reference coordinate. (`#5553 `__) - Fix a bug where saving a helioprojective or heliocentric coordinate to an asdf file didn't work due to a schema version mismatch if the observer location was a fully specified Stonyhurst heliographic coordinate. (`#5584 `__) - `~sunpy.map.sources.XRTMap` uppercases the ``TIMESYS`` key before checking if the key needs to be fixed. (`#5592 `__) - Fixed passing a URL to :func:`sunpy.io.read_file` on windows. (`#5601 `__) - Fixed a bug where the ``date`` property on `~sunpy.map.sources.HMISynopticMap` returned ``None`` if the ``DATE-OBS`` key was present. (`#5648 `__) Documentation ------------- - Added the gallery example :ref:`sphx_glr_generated_gallery_differential_rotation_comparing_rotation_models.py` to visualize the differences between models of solar differential rotation. (`#5527 `__) - Added an example to how to save out maps as FITS files and load them back in, :ref:`sphx_glr_generated_gallery_saving_and_loading_data_genericmap_in_fits.py`. (`#5544 `__) Internal Changes ---------------- - The `~sunpy.coordinates.frames.Helioprojective` frame now has the convenience property ``angular_radius`` to return the angular radius of the Sun as seen by the observer. (`#5191 `__) - Online tests can now report back status of remote urls and will XFAIL if the remote server is unreachable. (`#5233 `__) - Re-enabled the unit test to check for coordinates consistency with JPL HORIZONS when the matching ephemeris can be specified. (`#5314 `__) - The `~sunpy.timeseries.TimeSeries` factory has been refactored to improve readability and maintainability of the internal code. (`#5411 `__) - `sunpy.map.GenericMap.rsun_obs` no longer emits a warning if the metadata it looks for is not present. Instead the standard photospheric radius is assumed and a log message emitted at the 'info' level. (`#5416 `__) - Nearest-neighbour and linear (the default for :meth:`sunpy.map.GenericMap.resample`) resampling have been significantly sped up. (`#5476 `__) - `sunpy.map.Map` now raises a clear error when the map is constructed if units of either two axes are not angular units. (`#5602 `__) 3.0.1 (2021-07-03) ================== Bug Fixes --------- - Fixed a bug where `~sunpy.map.GenericMap` used to break with keyword arguments. (`#5392 `__) - Fixed a bug where calling :meth:`sunpy.map.GenericMap.draw_contours` on a different WCS could result in an unnecessary expansion of the plot limits. (`#5398 `__) - Fixed incorrect return values from :func:`~sunpy.map.all_corner_coords_from_map` if a rectangular map was provided. (`#5419 `__) - Do not trigger a pytest import in the asdf plugin for saving sunpy coordinate frames. (`#5429 `__) - Constructing a 2D coordinate in the `~sunpy.coordinates.frames.HeliographicCarrington` frame with ``observer='self'`` now raises an error upon creation. When specifying ``observer='self'``, the ``radius`` coordinate component serves as the Sun-observer distance that is necessary to fully define the Carrington heliographic coordinates. (`#5358 `__) - Fixed two bugs with handling the motion of the Sun when transforming between coordinate frames with a change in ``obstime``. These bugs did not affect any results if the context manager :func:`~sunpy.coordinates.transform_with_sun_center` had been used. (`#5381 `__) - Fixed a bug where the ``rsun`` frame attribute could be unintentionally reset to the default value during transformation. This bug primarily affected the transformation of a `~sunpy.coordinates.frames.Helioprojective` coordinate to a `~sunpy.coordinates.frames.HeliographicStonyhurst` frame. (`#5395 `__) - Fixed a bug where creating a `~sunpy.coordinates.frames.HeliographicStonyhurst` frame or a `~sunpy.coordinates.frames.HeliographicCarrington` frame from WCS information failed to make use of any specified ``rsun_ref`` value. (`#5395 `__) - `~sunpy.map.sources.SXTMap` now always returns `None` for the ``wavelength`` attribute. Previously this raised an error. (`#5401 `__) Added/Improved Documentation ---------------------------- - Simplified the "Downloading LASCO C2" gallery example by removing redundant modifications to the metadata before it is loaded by `~sunpy.map.Map`. (`#5402 `__) - Tided up the HMI synoptic map example by removing redundant code and correcting some of the comments. (`#5413 `__) 3.0.0 (2021-05-14) ================== Backwards Incompatible Changes ------------------------------ - ``sunpy.instr`` has been deprecated and will be removed in sunpy 3.1 in favour of `sunkit_instruments`. The code that is under ``sunpy.instr`` is imported via `sunkit_instruments` to ensure backwards comparability. (`#4526 `__) - Several `sunpy.map.GenericMap` attributes have been updated to return `None` when the relevant piece of FITS metadata is missing. These are: - `~sunpy.map.GenericMap.exposure_time`, previously defaulted to zero seconds. - `~sunpy.map.GenericMap.measurement`, previously defaulted to zero. - `~sunpy.map.GenericMap.waveunit`, previously defaulted to ``u.one``. - `~sunpy.map.GenericMap.wavelength`, previously defaulted to zero. (`#5126 `__) - `~sunpy.coordinates.frames.HeliographicStonyhurst` and `~sunpy.coordinates.frames.HeliographicCarrington` no longer automatically convert 2D input to a 3D coordinate during instantiation. Instead, the 2D-to-3D conversion is deferred until the coordinate is transformed to a different frame, or with a call to the method :meth:`~sunpy.coordinates.frames.BaseHeliographic.make_3d`. (`#5211 `__) - Changed URL for the `sunpy.net.dataretriever.sources.noaa.SRSClient` from "ftp://ftp.swpc.noaa.gov/pub/warehouse/" to "ftp://ftp.ngdc.noaa.gov/STP/swpc_products/daily_reports/". The old URL is unsupported and we expect the files will be the same but we can not say with 100% certainty. (`#5173 `__) - Changed `sunpy.net.attrs.Source` to `sunpy.net.attrs.Provider` for the `sunpy.net.dataretriever.sources.gong.GONGClient`. (`#5174 `__) - The ``rsun`` frame attribute of `~sunpy.coordinates.frames.Helioprojective` now converts any input to kilometers. (`#5211 `__) - :meth:`sunpy.map.CompositeMap.plot` now internally calls :meth:`sunpy.map.GenericMap.plot` and :meth:`sunpy.map.GenericMap.draw_contours`, which may affect the plot output of existing user code. (`#5255 `__) - Removed the ``basic_plot`` keyword argument from :meth:`sunpy.map.CompositeMap.peek` due to its unreliability. (`#5255 `__) - ``sunpy.util.sphinx.changelog`` and ``sunpy.util.towncrier`` have been removed and are now in a standalone package `sphinx-changelog `__. (`#5049 `__) Deprecations and Removals ------------------------- - Deprecated ``sunpy.map.GenericMap.draw_rectangle`` in favor of :meth:`~sunpy.map.GenericMap.draw_quadrangle`. (`#5236 `__) - Using `~sunpy.map.GenericMap` plotting methods on an `~matplotlib.axes.Axes` that is not a `~astropy.visualization.wcsaxes.WCSAxes` is deprecated. This previously raised a warning, but is now formally deprecated, and will raise an error in sunpy 3.1. (`#5244 `__) - Deprecated ``sunpy.roi.chaincode.Chaincode`` and created a replacement at `sunpy.net.helio.Chaincode`. This replacement has the following changes: 1. Added support for numpy array as an input (it was broken before). 2. Renamed ``BoundingBox`` to ``boundingbox`` 3. Renamed ``subBoundingBox`` to ``sub_boundingbox`` 4. Now area and length raise `NotImplementedError` (`#5249 `__) - Deprecated ``sunpy.roi.roi``, as it currently has no obvious use and has never seen any real development work. (`#5249 `__) Features -------- - :func:`sunpy.coordinates.get_horizons_coord` can now be given a start time, end time, and number of intervals (or interval length) to query a evenly spaced set of times. See the documentation string for more information and an example. (`#4698 `__) - Added :meth:`sunpy.map.GenericMap.draw_quadrangle` for drawing a quadrangle on a map. A quadrangle has edges that are aligned with lines of constant latitude and longitude, but these can be in a different coordinate system than that of the map. (`#4809 `__) - Added a ``longitude`` keyword argument to :func:`~sunpy.coordinates.sun.carrington_rotation_time` as an alternate way to specify a fractional Carrington rotation. (`#4879 `__) - Colorbar in `sunpy.map.GenericMap.peek` now has a unit label. (`#4930 `__) - The default axes used by ``BaseFuncAnimator.get_animation()`` is now ``BaseFuncAnimator.axes``, instead of the currently active axes (accessed via. :func:`matplotlib.pyplot.gca`). The allows animations to be created on figures created directly using `matplotlib.figure.Figure`. To revert to the previous behaviour of using the current axes, give ``axes=plt.gca()`` to ``get_animation()``. (`#4968 `__) - Added colormaps for Solar Orbiter EUI images. These are used automatically when an EUI image is loaded. (`#5023 `__) - Added the ability to dynamically scale `sunpy.visualization.animator` instances. By specifying the ``clip_interval`` keyword, it will now clip the minimum and maximum at each slider step to the specified interval. (`#5025 `__) - Added a ``sunpy.time.timerange.TimeRange.__contains__`` method to `sunpy.time.TimeRange` that tests if two time ranges overlap. (`#5093 `__) - Added the ability to namespace files downloaded using `sunpy.data.data_manager.manager.DataManager` by prepending the file name with module name. (`#5111 `__) - Added a rigid rotation model to :func:`~sunpy.physics.differential_rotation.diff_rot` via ``rot_type=rigid``, where the rotation rate does not vary with latitude. (`#5132 `__) - Added a :meth:`~sunpy.map.MapSequence.save` method to `sunpy.map.MapSequence` that saves each map of the sequence. (`#5145 `__) - The allowable ``level`` inputs to :meth:`sunpy.map.GenericMap.contour` and :meth:`sunpy.map.GenericMap.draw_contours` have been consolidated. Both methods now accept - Scalars, if the map has no units - Quantities, if the map has units - Percentages (`#5154 `__) - Added support for corrected NOAA SWPC solar region summary data files. (`#5173 `__) - Updated ``sunpy.util.sysinfo.system_info`` to return all optional dependencies of sunpy. (`#5175 `__) - `sunpy.map.Map` now supports the EUI instrument on Solar Orbiter. (`#5210 `__) - `~sunpy.coordinates.frames.HeliographicStonyhurst` and `~sunpy.coordinates.frames.HeliographicCarrington` now have an ``rsun`` frame attribute to specify the radius of the Sun, which defaults to the photospheric radius defined in `sunpy.sun.constants`. This frame attribute is used when converting a 2D coordinate (longitude and latitude, with no specified radial distance) to a 3D coordinate by setting the radial distance to ``rsun`` (i.e., the assumption is that the coordinate is on the surface of the Sun). (`#5211 `__) - Enhanced :meth:`sunpy.map.GenericMap.draw_limb` so that the solar limb can be plotted on axes that correspond to a different map (e.g., with a different observer). The part of the limb that is not visible to the axes's observer because it is on the far side of the Sun is shown as dotted rather than solid. (`#5237 `__) - `~sunpy.util.MetaDict` now saves a copy of the metadata on creation, which can be accessed using the `~sunpy.util.MetaDict.original_meta` property. Three new properties have also been added to query any changes that have been made to metadata: - `~sunpy.util.MetaDict.added_items` - `~sunpy.util.MetaDict.removed_items` - `~sunpy.util.MetaDict.modified_items` As an example, ``my_map.meta.modified_items`` will return a dictionary mapping keys to their original value and current value. (`#5241 `__) - Added :func:`sunpy.map.contains_coordinate` which provides a quick way to see if a world coordinate is contained within the array bounds of a map. (`#5252 `__) - Added an optional keyword argument ``autoalign`` to :meth:`sunpy.map.GenericMap.plot` for plotting a map to axes that correspond to a different WCS. See :ref:`sphx_glr_generated_gallery_map_transformations_autoalign_aia_hmi.py`. (`#5255 `__) - :meth:`sunpy.map.CompositeMap.plot` now properly makes use of WCS information to position and orient maps when overlaying them. (`#5255 `__) Bug Fixes --------- - Fixed the drawing methods of `sunpy.map.GenericMap` (e.g., ``~sunpy.map.GenericMap.draw_rectangle``) so that any text labels will appear in the legend. (`#5019 `__) - Fixed bug in ``sunpy.until.scraper.Scraper`` which caused URL patterns containing backslashes to be incorrectly parsed on Windows. (`#5022 `__) - Constructing a `~sunpy.util.MetaDict` is now more lenient, and accepts any class that inherits from `collections.abc.Mapping`. This fixes a regression where headers read with `astropy.io.fits` raised an error when passed to individual `~sunpy.map` sources. (`#5047 `__) - Added warning to :meth:`sunpy.map.GenericMap.rotate` when specified ``missing`` value is not compatible with the number type of the data array. (`#5051 `__) - Prevented some colormaps being accidentally modified depending on the order and method through which they were accessed. (`#5054 `__) - Reverted change for `sunpy.map.GenericMap.draw_limb` that made it use "add_artist" as it was changing the FOV of the plotted image. (`#5069 `__) - Fixed a bug where some `~sunpy.coordinates.metaframes.RotatedSunFrame` transformations could fail with an ``observer=None`` error. (`#5084 `__) - Fixed bug where `sunpy.data.data_manager.DataManager` would fail to recover upon deleting the sqlite database file. (`#5089 `__) - Fixed a bug where coordinate frames were considered different due to an unintended time difference during time handling at the level of numerical precision (i.e., tens of picoseconds). This resulted in the unexpected use of transformation machinery when transforming a coordinate to its own coordinate frame. (`#5127 `__) - Fixed a bug with failing downloads in 2010 with the `~sunpy.net.dataretriever.sources.noaa.SRSClient`. (`#5159 `__) - If the property `sunpy.map.GenericMap.rsun_obs` needs to calculate the solar angular radius from header information, it now properly uses the ``rsun_ref`` keyword if it is present and does not emit any warning. (`#5172 `__) - Added a "rsun_obs" keyword to the output of :func:`sunpy.map.header_helper.make_fitswcs_header` if the coordinate argument has a "rsun" frame attribute. (`#5177 `__) - Fixed small inaccuracies in the grid plotted by :meth:`~sunpy.map.GenericMap.draw_grid` for maps that specify a radius of the Sun that is different from the constant in `sunpy.sun.constants`. (`#5211 `__) - Fixed :meth:`sunpy.map.GenericMap.draw_contours` so that the contours from a map can be plotted on axes with a different coordinate system. (`#5239 `__) - When using the cylindrical representation of ``Heliocentric`` to work in the Heliocentric Radial coordinate frame, the ``psi`` component now goes from 0 to 360 degrees instead of -180 to 180 degrees. (`#5242 `__) - Changed ``MDIMap`` to use the "CONTENT" keyword to identify the measurement, similar to ``HMIMap``, and removed the special-case nickname. This fixes the broken title on plots. (`#5257 `__) - :func:`sunpy.coordinates.solar_frame_to_wcs_mapping` now sets the observer auxiliary information when a `~sunpy.coordinates.HeliographicCarrington` frame with ``observer='self'`` is passed. (`#5264 `__) - Calling :func:`sunpy.map.header_helper.make_fitswcs_header` with a `~sunpy.coordinates.HeliographicCarrington` coordinate that with ``observer='self'`` set now correctly sets the observer information in the header. (`#5264 `__) - :meth:`sunpy.map.GenericMap.superpixel` now keeps the reference coordinate of the WCS projection the same as the input map, and updates the reference pixel accordingly. This fixes inconsistencies in the input and output world coordinate systems when a non-linear projection is used. (`#5295 `__) - Inputs to the ``dimensions`` and ``offset`` arguments to :meth:`sunpy.map.GenericMap.superpixel` in units other than ``u.pix`` (e.g. ```u.kpix``) are now handled correctly. (`#5301 `__) - Fractional inputs to the ``dimensions`` and ``offset`` arguments to :meth:`sunpy.map.GenericMap.superpixel` were previously rounded using `int` in the superpixel algorithm, but not assigned integer values in the new metadata. This has now been changed so the rounding is correctly reflected in the metadata. (`#5301 `__) - Remove runtime use of ``astropy.tests.helper.assert_quantity_allclose`` which introduces a runtime dependency on ``pytest``. (`#5305 `__) - :meth:`sunpy.map.GenericMap.resample` now keeps the reference coordinate of the WCS projection the same as the input map, and updates the reference pixel accordingly. This fixes inconsistencies in the input and output world coordinate systems when a non-linear projection is used. (`#5309 `__) - Fix saving `.GenericMap` to an asdf file with version 2.8.0 of the asdf package. (`#5342 `__) Added/Improved Documentation ---------------------------- - Added a gallery example (:ref:`sphx_glr_generated_gallery_plotting_plot_rectangle.py`) for drawing rectangles on maps. (`#4528 `__) - Added an example (:ref:`sphx_glr_generated_gallery_plotting_wcsaxes_plotting_example.py`) of how pixel and SkyCoords work when plotted with `~astropy.visualization.wcsaxes`. (`#4867 `__) - Added a gallery example (:ref:`sphx_glr_generated_gallery_plotting_plotting_blank_map.py`) on how to create a blank map and mark locations. (`#5077 `__) - Added a gallery example (:ref:`sphx_glr_generated_gallery_showcase_hmi_cutout.py`) demonstrating how to add a HMI zoomed-in region next to a full disk HMI image. (`#5090 `__) - Updated the :ref:`sphx_glr_generated_gallery_computer_vision_techniques_mask_disk.py` example to generate the mask using :func:`sunpy.map.coordinate_is_on_solar_disk`. (`#5114 `__) - Added a gallery example (:ref:`sphx_glr_generated_gallery_map_map_segment.py`) demonstrating how to create a segment of a particular map from transformed coordinates. (`#5121 `__) - For the various subclasses of `~sunpy.map.GenericMap` (e.g., `~sunpy.map.sources.AIAMap`), the online documentation now shows all of the inherited attributes and methods. (`#5142 `__) - Added a documentation string to `~sunpy.map.sources.sdo.HMISynopticMap`. (`#5186 `__) - Added a new gallery example showcasing how to overlay HMI contours on an AIA image. (`#5229 `__) Trivial/Internal Changes ------------------------ - Replaced the old test runner with a new version that adds a dependency check before the test suite is run. (`#4596 `__) - The testing suite now raises a warning if the `~matplotlib.pyplot` figure stack is not empty prior to running a test, and it closes all open figures after finishing each test. (`#4969 `__) - Improved performance when moving the slider in ``sunpy.visualisation.animator.ArrayAnimatorWCS``. (`#4971 `__) - Added some basic logging to HEK searches, at the 'debug' logging level. (`#5020 `__) - Refactored `~sunpy.coordinates.metaframes.RotatedSunFrame` transformations for improved performance. (`#5084 `__) - Re-ordered keyword-only arguments of ``sunpy.map.GenericMap.draw_rectangle`` to match :meth:`sunpy.map.GenericMap.submap`. (`#5091 `__) - Significantly sped up calls to :func:`~sunpy.time.parse_time` for string arguments. This will have knock on effects, including improved performance of querying the VSO. (`#5108 `__) - Added tests for ``sunpy.visualization.animator.mapsequenceanimator`` and :meth:`sunpy.map.MapSequence.plot`. (`#5125 `__) - The ``CROTA`` keywords are no longer set on `sunpy.map.GenericMap.wcs`, as the ``PC_ij`` keywords are always set and the FITS standard says that these keywords must not co-exist. (`#5166 `__) - Temporarily disabled the unit test to check for coordinates consistency with JPL HORIZONS due to the inability to choose a matching ephemeris. (`#5203 `__) - :func:`~sunpy.visualization.wcsaxes_compat.wcsaxes_heliographic_overlay` now accepts ``obstime`` and ``rsun`` optional arguments. This function is not typically called directly by users. (`#5211 `__) - `~sunpy.map.GenericMap` plotting methods now have consistent argument checking for the ``axes`` argument, and will raise the same warnings or errors for similar ``axes`` input. (`#5223 `__) - Calling :meth:`sunpy.map.GenericMap.plot` on a `~astropy.visualization.wcsaxes.WCSAxes` with a different World Coordinate System (WCS) to the map now raises a warning, as the map data axes may not correctly align with the coordinate axes. This happens if an `~matplotlib.axes.Axes` is created with a projection that is a different map to the one being plotted. (`#5244 `__) - Re-enabled the unit test to check for coordinates consistency with JPL HORIZONS when the matching ephemeris can be specified. (`#5314 `__) 2.1.0 (2020-02-21) ================== Backwards Incompatible Changes ------------------------------ - Support for Python 3.6 and Numpy 1.15 has been dropped in line with `NEP 29 `_. The minimum supported version of Astropy is now 4.0, and the minimum version of scipy is now 1.2. (`#4284 `__) - Changed :func:`sunpy.coordinates.sun.B0` return type from `~astropy.coordinates.Angle` to `~astropy.coordinates.Latitude`. (`#4323 `__) - An error is now raised if ``vmin`` or ``vmax`` are passed to to `sunpy.map.GenericMap.plot` and they are already set on the map ``norm``. This is consistent with upcoming Matplotlib changes. (`#4328 `__) - Previously slicing the result of ``Fido.search()`` (a `~sunpy.net.fido_factory.UnifiedResponse` object) so that it had a length of one returned another `~sunpy.net.fido_factory.UnifiedResponse` object. Now it will return a `~sunpy.net.base_client.QueryResponseTable` object, which is a subclass of `astropy.table.Table`. (`#4358 `__) - The ``.size`` property of a coordinate frame with no associated data will now raise an error instead of returning 0. (`#4577 `__) - The following `~sunpy.map.Map` methods have had support for specific positional arguments removed. They must now be passed as keyword arguments (i.e. ``m.method(keyword_arg=value)``). - :meth:`~sunpy.map.GenericMap.submap`: ``width``, ``height``. - ``sunpy.map.GenericMap.draw_rectangle``: ``width``, ``height``, ``axes``, ``top_right``. (`#4616 `__) - The sunpy specific attributes ``.heliographic_observer`` and ``.rsun`` are no longer set on the `~astropy.wcs.WCS` returned by `sunpy.map.GenericMap.wcs`. (`#4620 `__) - Due to upstream changes, the parsing logic for the `~sunpy.net.helio.HECClient` now returns strings and not bytes for :meth:`~sunpy.net.helio.HECClient.get_table_names`. (`#4643 `__) - Reduced the selection of dependent packages installed by default via ``pip``, which means that some of our sub-packages will not fully import when sunpy is installed with ``pip install "sunpy"``. You can install all dependencies by specifying ``pip install "sunpy[all]"``, or you can install sub-package-specific dependencies by specifying, e.g., ``[map]`` or ``[timeseries]``. (`#4662 `__) - The class inheritance for `~sunpy.coordinates.metaframes.RotatedSunFrame` and the frames it creates has been changed in order to stop depending on unsupported behavior in the underlying machinery. The return values for some :func:`isinstance`/:func:`issubclass` calls will be different, but the API for `~sunpy.coordinates.metaframes.RotatedSunFrame` is otherwise unchanged. (`#4691 `__) - Fix a bug in `~sunpy.map.GenericMap.submap` where only the top right and bottom left coordinates of the input rectangle in world coordinates were considered when calculating the pixel bounding box. All four corners are once again taken into account now, meaning that `~sunpy.map.GenericMap.submap` correctly returns the smallest pixel box which contains all four corners of the input rectangle. To revert to the previous 2.0.0 behaviour, first convert the top right and bottom left coordinates to pixel space before calling submap with:: top_right = smap.wcs.world_to_pixel(top_right) * u.pix bottom_left = smap.wcs.world_to_pixel(bottom_left) * u.pix smap.submap(bottom_left=bottom_left, top_right=top_right) This will define the rectangle in pixel space. (`#4727 `__) - VSO results where the size was ``-1`` (missing data) now return ``None`` rather than ``-1`` to be consistent with other missing data in the VSO results. (`#4798 `__) - All result objects contained within the results of a ``Fido.search()`` (a `~sunpy.net.fido_factory.UnifiedResponse` object) are now `~sunpy.net.base_client.QueryResponseTable` objects (or subclasses thereof). These objects are subclasses of `astropy.table.Table` and can therefore be filtered and inspected as tabular objects, and the modified tables can be passed to ``Fido.fetch``. This, while a breaking change for anyone accessing these response objects directly, will hopefully make working with ``Fido`` search results much easier. (`#4798 `__) - Results from the `~sunpy.net.dataretriever.NOAAIndicesClient` and the `~sunpy.net.dataretriever.NOAAPredictClient` no longer has ``Start Time`` or ``End Time`` in their results table as the results returned from the client are not dependent upon the time parameter of a search. (`#4798 `__) - The ``sunpy.net.vso.QueryResponse.search`` method has been removed as it has not worked since the 1.0 release of sunpy. (`#4798 `__) - The ``sunpy.net.hek.hek.HEKColumn`` class has been removed, the ``HEKTable`` class now uses the standard `astropy.table.Column` class. (`#4798 `__) - The keys used to format file paths in ``Fido.fetch`` have changed. They are now more standardised across all the clients, as they are all extracted from the names of the columns in the results table. For results from the VSO the keys are no longer separated with ``.``, and are based on the displayed column names. For results from the ``dataretriever`` clients the only main change is that the keys are now lower case, where they were capitilized before. You can use the ``.sunpy.net.fido_factory.UnifiedResponse.path_format_keys`` method to see all the possible keys for a particular search. (`#4798 `__) - The time returned from :func:`~sunpy.coordinates.sun.carrington_rotation_number` has been changed from the TT scale to the more common UTC scale. To undo this change, use ``time_out = time_out.tt`` on the outputted time. (`#4819 `__) - `~.BaseQueryResponse.response_block_properties` has been renamed to ``.BaseQueryResponse.path_format_keys``, on the return objects from all ``search()`` methods on all clients and from ``Fido.search()``. (`#4798 `__) Removals -------- - Removed deprecated functions: - ``sunpy.coordinates.frames.Helioprojective.calculate_distance``, alternative is `sunpy.coordinates.frames.Helioprojective.make_3d`. - ``sunpy.image.coalignment.repair_image_nonfinite`` - if you wish to repair the image, this has to be done manually before calling the various ``sunpy.image.coalignment`` functions. - The ``repair_nonfinite`` keyword argument to ``calculate_shift`` and ``calculate_match_template_shift`` has been removed. - ``sunpy.instr.lyra.download_lytaf_database`` - this just downloaded the file at ``http://proba2.oma.be/lyra/data/lytaf/annotation_ppt.db``, which can be done manually. - ``sunpy.util.net.check_download_file``, no alternative. - ``sunpy.visualization.animator.ImageAnimatorWCS``, alternative is ``sunpy.visualization.animator.ArrayAnimatorWCS``. (`#4350 `__) - Removed deprecated function ``sunpy.instr.aia.aiaprep``. Alternative is `~aiapy.calibrate.register` for converting AIA images from level 1 to level 1.5. (`#4485 `__) - ``sunpy.cm`` has been removed. All of the functionality in this module can now be found in `sunpy.visualization.colormaps`. (`#4488 `__) - ``sunpy.test.hash`` has been removed, the functionality has been moved into the `pytest-mpl `__ package. (`#4605 `__) - ``sunpy.util.multimethod`` has been removed. (`#4614 `__) - The ``lytaf_path`` argument (which previously did nothing) has been removed from - ``sunpy.instr.lyra.remove_lytaf_events_from_timeseries`` - ``sunpy.instr.lyra.get_lytaf_events`` - ``sunpy.instr.lyra.get_lytaf_event_types`` (`#4615 `__) Deprecations ------------ - Deprecated ``sunpy.net.vso.attrs.Source`` and ``sunpy.net.vso.attrs.Provider``. They are now `sunpy.net.attrs.Source` and `sunpy.net.attrs.Provider` respectively. (`#4321 `__) - Deprecated the use of the ``sunpy.map.GenericMap.size`` property, use ``sunpy.map.Map.data.size`` instead. (`#4338 `__) - ``sunpy.net.helio.HECClient.time_query`` is deprecated, `~sunpy.net.helio.HECClient.search` is the replacement. (`#4358 `__) - ``sunpy.net.jsoc.attrs.Keys`` is deprecated; all fields are returned by default and can be filtered post search. (`#4358 `__) - ``sunpy.net.hek.attrs.Time`` is deprecated; `~sunpy.net.attrs.Time` should be used instead. (`#4358 `__) - Support for :func:`sunpy.coordinates.wcs_utils.solar_wcs_frame_mapping` to use the ``.heliographic_observer`` and ``.rsun`` attributes on a `~astropy.wcs.WCS` is deprecated. (`#4620 `__) - The ``origin`` argument to `sunpy.map.GenericMap.pixel_to_world` and `sunpy.map.GenericMap.world_to_pixel` is deprecated. - If passing ``0``, not using the ``origin`` argument will have the same effect. - If passing ``1``, manually subtract 1 pixel from the input to ``pixel_to_world``, or manually add 1 pixel to the output of ``world_to_pixel``, and do not use the ``origin`` argument. (`#4700 `__) - The ``.VSOClient.link`` method is deprecated as it is no longer used. (`#4789 `__) - The ``.UnifiedResponse.get_response``, ``.UnifiedResponse.tables`` and ``.UnifiedResponse.responses`` attributes of ``.UnifiedResponse`` have been deprecated as they are no longer needed now the object returns the table objects it contains when sliced. (`#4798 `__) - :meth:`sunpy.net.vso.VSOClient.search` has a new keyword argument ``response_type=`` which controls the return type from the ``search()`` method. In sunpy 2.1 and 3.0 it will default to the ``"legacy"`` response format, in 3.1 it will default to the new ``"table"`` response format, and the ``"legacy"`` format may be deprecated and removed at a later date. Searches made with ``Fido`` will use the new ``"table"`` response format, so this only affects users interacting with the ``VSOClient`` object directly. (`#4798 `__) Features -------- - For :meth:`sunpy.map.GenericMap.quicklook` and :meth:`sunpy.map.MapSequence.quicklook` (also used for the HTML representation shown in Jupyter notebooks), the histogram is now shaded corresponding to the colormap of the plotted image. Clicking on the histogram will toggle an alternate version of the histogram. (`#4931 `__) - Add an ``SRS_TABLE`` file to the sample data, and use it in the magnetogram plotting example. (`#4993 `__) - Added a `sunpy.map.GenericMap.contour()` method to find the contours on a map. (`#3909 `__) - Added a context manager (:meth:`~sunpy.coordinates.frames.Helioprojective.assume_spherical_screen`) to interpret `~sunpy.coordinates.frames.Helioprojective` coordinates as being on the inside of a spherical screen instead of on the surface of the Sun. (`#4003 `__) - Added `sunpy.map.sources.HMISynopticMap` for handling the Synoptic maps from HMI. (`#4053 `__) - Added a `~sunpy.map.sources.MDISynopticMap` map source class. (`#4054 `__) - Created `~sunpy.net.dataretriever.GONGClient` for accessing magnetogram synoptic map archives of NSO-GONG. (`#4055 `__) - All coordinate frames will now show the velocity if it exists in the underlying data. (`#4102 `__) - The ephemeris functions :func:`~sunpy.coordinates.ephemeris.get_body_heliographic_stonyhurst()`, :func:`~sunpy.coordinates.ephemeris.get_earth()`, and :func:`~sunpy.coordinates.ephemeris.get_horizons_coord()` can now optionally return the body's velocity as part of the output coordinate. (`#4102 `__) - `~sunpy.util.metadata.MetaDict` now maintains coherence between its keys and their corresponding keycomments. Calling ``del`` on a ``MetaDict`` object key is now case-insensitive. (`#4129 `__) - Allow ``sunpy.visualization.animator.ArrayAnimatorWCS`` to disable ticks for a coordinate, by setting ``ticks: False`` in the ``coord_params`` dictionary. (`#4270 `__) - Added a ``show()`` method for `~sunpy.net.base_client.BaseQueryResponse` which returns `~astropy.table.Table` with specified columns for the Query Response. (`#4309 `__) - Added ``_extract_files_meta`` method in ``sunpy.util.scraper.Scraper`` which allows scraper to extract metadata from the file URLs retrieved for a given time range. (`#4313 `__) - Refactoring of `~sunpy.net.dataretriever` which adds these capabilities to `~sunpy.net.dataretriever.QueryResponse`: - Any ``attr`` shall not be defaulted to a hard-coded value in all subclasses of `~sunpy.net.dataretriever.GenericClient`; thus records for all possible ``attrs`` shall be returned if it is not specified in the query. - `~sunpy.net.dataretriever.QueryResponse` can now show more columns; thus all metadata extractable from matching file URLs shall be shown and for a client, non-spported ``attrs`` shall not be shown in the response tables. (`#4321 `__) - New class attributes added to `~sunpy.net.dataretriever.GenericClient`: - ``baseurl`` and ``pattern`` which are required to define a new simple client. - ``optional`` and ``required`` which are a ``set`` of optional and required `~sunpy.net.attrs` respectively; which generalizes :meth:`~sunpy.net.dataretriever.GenericClient._can_handle_query`. (`#4321 `__) - Additions in ``sunpy.util.scraper`` to support the refactoring of `~sunpy.net.dataretriever.GenericClient`: - ``sunpy.util.scraper.Scraper.findDatewith_extractor`` that parses the url using extractor to return its start time. - A ``matcher`` in ``sunpy.util.scraper.Scraper._extract_files_meta`` which validates the extracted metadata by using the dictionary returned from :meth:`~sunpy.net.dataretriever.GenericClient._get_match_dict`. (`#4321 `__) - Added methods :meth:`~sunpy.net.dataretriever.GenericClient.pre_search_hook` and :meth:`~sunpy.net.dataretriever.GenericClient.post_search_hook` which helps to translate the attrs for scraper before and after the search respectively. (`#4321 `__) - ``sunpy.timeseries.sources.RHESSISummaryTimeSeries.peek`` has had the following minor changes: - Colors from the default matplotlib color cycle are now used (but the colors remain qualitatively the same) - The default matplotlib linewidth is now used - It is now possible to pass in a user specified linewidth - Seconds have been added to the x-axis labels (previously it was just hours and minutes) (`#4326 `__) - `~sunpy.net.helio.hec.HECClient` and `~sunpy.net.hek.hek.HEKClient` now inherit `~sunpy.net.base_client.BaseClient` which makes them compatible with the `~sunpy.net.fido_factory.UnifiedDownloaderFactory` (``Fido``). (`#4358 `__) - `~sunpy.net.helio.attrs.MaxRecords` and `~sunpy.net.helio.attrs.TableName` added as "attrs" for HELIO searches. (`#4358 `__) - Add the ability to download new GOES 16 & 17 data alongside the reprocessed GOES 13, 14 and 15 data via the GOES-XRS Fido client. (`#4394 `__) - `sunpy.net.jsoc.JSOCClient.request_data` now support additional parameter "method" which allows user to download staged data as single .tar file. (`#4405 `__) - Added ``sunpy.util.get_timerange_from_exdict`` which finds time range for a URL using its metadata. Added ``sunpy.util.scraper.Scraper.isvalid_time`` that checks whether the file corresponds to a desired time range. (`#4419 `__) - Colormap data has been moved to individual .csv files in the :file:`sunpy/visualization/colormaps/data` directory. (`#4433 `__) - Added `~sunpy.coordinates.utils.solar_angle_equivalency` to convert between a physical distance on the Sun (e.g., km) to an angular separation as seen by an observer (e.g., arcsec). (`#4443 `__) - `sunpy.map.Map` instances now have their ``.unit`` attribute set from the ``'BUNIT'`` FITS keyword. If the keyword cannot be parsed, or is not present the unit is set to `None`. (`#4451 `__) - The `sunpy.map.GenericMap.wcs` property is now cached, and will be recomputed only if changes are made to the map metadata. This improves performance of a number of places in the code base, and only one warning will now be raised about WCS fixes for a given set of metadata (as opposed to a warning each time ``.wcs`` is accessed) (`#4467 `__) - Extended :meth:`~sunpy.timeseries.GenericTimeSeries.concatenate` and :meth:`~sunpy.timeseries.TimeSeriesMetaData.concatenate` to allow iterables. (`#4499 `__) - Enable `~sunpy.coordinates.metaframes.RotatedSunFrame` to work with non-SunPy frames (e.g., `~astropy.coordinates.HeliocentricMeanEcliptic`). (`#4577 `__) - Add support for `pathlib.Path` objects to be passed to `sunpy.timeseries.TimeSeries`. (`#4589 `__) - Add support for GOES XRS netcdf files to be read as a `sunpy.timeseries.sources.XRSTimeSeries`. (`#4592 `__) - Add `~sunpy.net.jsoc.attrs.Cutout` attr for requesting cutouts from JSOC via `~sunpy.net.jsoc.JSOCClient` and ``Fido``. (`#4595 `__) - sunpy now sets auxiliary parameters on `sunpy.map.GenericMap.wcs` using the `astropy.wcs.Wcsprm.aux` attribute. This stores observer information, along with the reference solar radius if present. (`#4620 `__) - The `~sunpy.coordinates.frames.HeliographicCarrington` frame now accepts the specification of ``observer='self'`` to indicate that the coordinate itself is also the observer for the coordinate frame. This functionality greatly simplifies working with locations of observatories that are provided in Carrington coordinates. (`#4659 `__) - Add two new colormaps (``rhessi`` and ``std_gamma_2``) that are used for plotting RHESSI maps. (`#4665 `__) - If either 'CTYPE1' or 'CTYPE2' are not present in map metadata, sunpy now assumes they are 'HPLN-TAN' and 'HPLT-TAN' (previously it assumed 'HPLN- ' and 'HPLT- '). In addition, a warning is also now raised when this assumption is made. (`#4702 `__) - Added a new `~sunpy.map.all_corner_coords_from_map` function to get the coordinates of all the pixel corners in a `~sunpy.map.GenericMap`. (`#4776 `__) - Added support for "%Y/%m/%dT%H:%M" to :func:`sunpy.time.parse_time`. (`#4791 `__) - Added the STEREO EUVI instrument specific colormaps called" 'euvi171', 'euvi195', 'euvi284', 'euvi304'. (`#4822 `__) Bug Fixes --------- - `sunpy.map.GenericMap.date` now has its time scale set from the 'TIMESYS' FITS keyword, if it is present. If it isn't present the time scale defaults to 'UTC', which is unchanged default behaviour, so this change will only affect maps with a 'TIMESYS' keyword that is not set to 'UTC'. (`#4881 `__) - Fixed the `sunpy.net.dataretriever.sources.noaa.SRSClient` which silently failed to download the SRS files when the tarball for the previous years did not exist. Client now actually searches for the tarballs and srs files on the ftp archive before returning them as results. (`#4904 `__) - No longer is the WAVEUNIT keyword injected into a data source if it is missing from the file's metadata. (`#4926 `__) - Map sources no longer overwrite FITS metadata keywords if they are present in the original metadata. The particular map sources that have been fixed are `~sunpy.map.sources.SJIMap`, `~sunpy.map.sources.KCorMap`, `~sunpy.map.sources.RHESSIMap`, `~sunpy.map.sources.EITMap`, `~sunpy.map.sources.EUVIMap`, `~sunpy.map.sources.SXTMap`. (`#4926 `__) - Fixed a handling bug in ``sunpy.map.GenericMap.draw_rectangle`` when the rectangle is specified in a different coordinate frame than that of the map. A couple of other minor bugs in ``sunpy.map.GenericMap.draw_rectangle`` were also fixed. (`#4929 `__) - Improved error message from ``sunpy.net.Fido.fetch()`` when no email has been supplied for JSOC data. (`#4950 `__) - Fixed a bug when transforming from `~sunpy.coordinates.metaframes.RotatedSunFrame` to another frame at a different observation time that resulted in small inaccuracies. The translational motion of the Sun was not being handled correctly. (`#4979 `__) - Fixed two bugs with :func:`~sunpy.physics.differential_rotation.differential_rotate` and :func:`~sunpy.physics.differential_rotation.solar_rotate_coordinate` that resulted in significant inaccuracies. Both functions now ignore the translational motion of the Sun. (`#4979 `__) - The ability to to filter search results from the `~sunpy.net.vso.VSOClient` was broken. This has now been restored. (`#4011 `__) - Fixed a bug where transformation errors were not getting raised in some situations when a coordinate frame had ``obstime`` set to the default value of ``None`` and `~astropy.coordinates.SkyCoord` was not being used. Users are recommended to use `~astropy.coordinates.SkyCoord` to manage coordinate transformations unless they have a specific reason not to. (`#4267 `__) - Fixed a bug in `~sunpy.net.dataretriever.sources.goes.XRSClient._get_url_for_timerange` which returned incorrect URLs because of not using ``**kwargs`` in the client's ``_get_overlap_urls()`` method. (`#4288 `__) - Data products from `~sunpy.net.dataretriever.NOAAIndicesClient` and `~sunpy.net.dataretriever.NOAAPredictClient` have been updated to download new JSON files. The old text files which the data used to come in no longer exist. The new JSON files for `~sunpy.net.dataretriever.NOAAIndicesClient` now do not have the following columns: - Geomagnetic Observed and Smoothed - Sunspot Numbers Ratio (RI/SW) Both `sunpy.timeseries.sources.noaa.NOAAIndicesTimeSeries` and `sunpy.timeseries.sources.noaa.NOAAPredictIndicesTimeSeries` have been updated to support the new JSON files. Loading the old text files is still supported, but support for this will be removed in a future version of sunpy. (`#4340 `__) - Fixed a bug due to which ``sunpy.net.helio.parser.wsdl_retriever`` ignored previously discovered Taverna links. (`#4358 `__) - The flare class labels in GOES ``peek()`` plots are now drawn at the center of the flare classes. Previously they were (ambiguously) drawn on the boundaries. (`#4364 `__) - `sunpy.map.GenericMap.rsun_obs` no longer assumes the observer is at Earth if ``rsun_obs`` was not present in the map metadata. The sun-observer distance is now taken directly from the observer coordinate. If the observer coordinate is not present, this defaults to the Earth, retaining previous behaviour. (`#4375 `__) - Nanosecond precision is now retained when using `~sunpy.time.parse_time` with a `~pandas.Timestamp`. (`#4409 `__) - Fixed a bug where SunPy could not be successfully imported if the default text encoding of the running environment was unable to handle non-ASCII characters. (`#4422 `__) - `sunpy.net.dataretriever.sources.noaa.SRSClient` now correctly returns zero results for queries in the future or before 1996, which is when data is first available. (`#4432 `__) - Fixes issue where NAXISn is not updated after invoking :meth:`.GenericMap.resample` (`#4445 `__) - The floating point precision of input to `sunpy.image.transform.affine_transform` is now preserved. Previously all input was cast to `numpy.float64`, which could cause large increases in memory use for 32 bit data. (`#4452 `__) - Fixed :func:`~sunpy.image.transform.affine_transform` to scale images to [0, 1] before passing them to :func:`skimage.transform.warp` and later rescale them back. (`#4477 `__) - Several ``warnings.simplefilter('always', Warning)`` warning filters in `sunpy.timeseries` have been removed. (`#4511 `__) - All calculations of the angular radius of the Sun now use the same underlying code with the accurate calculation. The previous inaccuracy was a relative error of ~0.001% (0.01 arcseconds) for an observer at 1 AU, but could be as large as ~0.5% for Parker Solar Probe perihelia. (`#4524 `__) - Fixed an issue in :meth:`sunpy.time.TimeRange.get_dates` where the function would return the wrong number of days if less than 24 hours had passed (`#4529 `__) - Several functions in `sunpy.map` now properly check if the provided coordinate is in the expected `~sunpy.coordinates.frames.Helioprojective` frame. (`#4552 `__) - Fixes a bug which occurs in setting the ``ylims`` by ``sunpy.visualization.animator.line.LineAnimator`` when there are non-finite values in the data array to be animated. (`#4554 `__) - Clear rotation metadata for SOHO/LASCO Helioviewer JPEG2000 images, as they are already rotated correctly. (`#4561 `__) - The ``max_conn`` argument to ``Fido.fetch()`` is now correctly respected by the JSOC client. Previously the JSOC client would default to 4 connections no matter what the value passed to ``Fido.fetch()`` was. (`#4567 `__) - :func:`sunpy.time.parse_time` now correctly parses lists of time strings that have one of the built in sunpy time formats. (`#4590 `__) - Fixes the SRSClient to search for files of correct queried time and now allows a path keyword to be downloaded in fetch. (`#4600 `__) - Fixed ``sunpy.net.helio.parser.wsdl_retriever``, which previously ignored discovered Taverna links. (`#4601 `__) - The transformations between `~astropy.coordinates.HCRS` and `~sunpy.coordinates.frames.HeliographicStonyhurst` have been re-implemented to enable the proper transformations of velocities. All ephemeris functions (e.g., :func:`~sunpy.coordinates.ephemeris.get_body_heliographic_stonyhurst`) now return properly calculated velocities when ``include_velocity=True`` is specified. (`#4613 `__) - The maximum number of connections opened by the JSOC downloader has been reduced from 4 to 2. This should prevent downloads of large numbers of files crashing. (`#4624 `__) - Fixed a significant performance bug that affected all coordinate transformations. Transformations have been sped up by a factor a few. (`#4663 `__) - Fixed a bug with the mapping of a WCS header to a coordinate frame if the observer location is provided in Carrington coordinates. (`#4669 `__) - ``sunpy.io.fits.header_to_fits`` now excludes any keys that have associated NaN values, as these are not valid in a FITS header, and throws a warning if this happens. (`#4676 `__) - Fixed an assumption in `sunpy.map.GenericMap.pixel_to_world` that the first data axis is longitude, and the second is latitude. This will affect you if you are using data where the x/y axes are latitude/longitude, and now returns correct values in methods and properties that call ``pixel_to_world``, such as ``bottom_left_coord``, ``top_right_coord``, ``center``. (`#4700 `__) - Added a warning when a 2D `~sunpy.coordinates.frames.Helioprojective` coordinate is upgraded to a 3D coordinate and the number type is lower precision than the native Python float. This 2D->3D upgrade is performed internally when transforming a 2D `~sunpy.coordinates.frames.Helioprojective` coordinate to any other coordinate frame. (`#4724 `__) - All columns from a :meth:`sunpy.net.vso.vso.VSOClient.search` will now be shown. (`#4788 `__) - The search results object returned from ``Fido.search`` (`~sunpy.net.fido_factory.UnifiedResponse`) now correctly counts all results in it's `~sunpy.net.fido_factory.UnifiedResponse.file_num` property. Note that because some ``Fido`` clients now return metadata only results, this is really the number of records and does not always correspond to the number of files that would be downloaded. (`#4798 `__) - Improved the file processing logic for EVE L0CS files, which may have fixed a bug where the first line of data was parsed incorrectly. (`#4805 `__) - Fixing the ``CROTA`` meta keyword in EUVI FITS to ``CROTAn`` standard. (`#4846 `__) Added/Improved Documentation ---------------------------- - Added a developer guide for writing a new ``Fido`` client. (`#4387 `__) - Added an example of how to use Matplotlib's axes range functionality when plotting a Map with WCSAxes. (`#4792 `__) - Add links to Thompson 2006 paper on solar coordinates to synoptic map example. (`#3549 `__) - Clarified the meaning of ``.bottom_left_coord`` and ``.top_right_coord`` in `sunpy.map.GenericMap`. (`#3706 `__) - Added a list of possible signatures to `sunpy.timeseries.metadata.TimeSeriesMetaData`. (`#3709 `__) - Added `sunpy.data.manager`, `sunpy.data.cache`, `sunpy.net.Fido`, `sunpy.map.Map`, and `sunpy.timeseries.TimeSeries` to the docs. (`#4098 `__) - Clarified spline option for `sunpy.map.GenericMap.resample`. (`#4136 `__) - Updated the gallery example :ref:`sphx_glr_generated_gallery_plotting_solar_cycle_example.py` to retrieve data using `~sunpy.net.Fido`. (`#4169 `__) - Fixed example usage of ``sunpy.io.fits.read`` to account for the fact that it returns a list of data-header pairs rather than the data-header pairs directly. (`#4183 `__) - Added example of how to create a `sunpy.map.GenericMap` from observations in RA-DEC coordinates. (`#4236 `__) - Added `sunpy.coordinates.SunPyBaseCoordinateFrame` and `sunpy.coordinates.BaseHeliographic` to the documentation. (`#4274 `__) - `sunpy.time.TimeRange` had a ``.__contains__`` method and this is now documented. (`#4372 `__) - Revamped sunpy pull request review developer documentation. (`#4378 `__) - Revamped sunpy installation documentation. (`#4378 `__) - Fixed broken documentation links in the guide. (`#4414 `__) - Fixed miscellaneous links in the API documentation. (`#4415 `__) - Added `sunpy.data.data_manager.downloader`, `sunpy.data.data_manager.storage`, and `sunpy.net.hek.HEKTable` to the docs. (`#4418 `__) - Added documentation for copying Map objects using the copy module's deepcopy method. (`#4470 `__) - Added information about the :meth:`~sunpy.map.MapSequence.plot` return type. (`#4472 `__) - Added a gallery example for saving and loading sunpy Maps using asdf. (`#4494 `__) - Added description for a counter-intuitive section in the :ref:`sphx_glr_generated_gallery_differential_rotation_reprojected_map.py` example. (`#4548 `__) - Added :ref:`sunpy-topic-guide-coordinates-velocities` to explain how to use velocity information in the coordinates framework. (`#4610 `__) - New gallery example of searching and downloading GOES XRS data (with GOES 15, 16 and 17). (`#4686 `__) - Created the new gallery example :ref:`sphx_glr_generated_gallery_units_and_coordinates_north_offset_frame.py` for `~sunpy.coordinates.NorthOffsetFrame`. (`#4709 `__) - Added more information on which FITS keywords are used for various `sunpy.map.GenericMap` properties. (`#4717 `__) - Improved documentation for :func:`sunpy.physics.differential_rotation.diff_rot`. (`#4876 `__) Documentation Fixes ------------------- - The keyword ``clip_interval`` is now used more extensively in gallery examples when plotting the sample AIA image (e.g., :ref:`sphx_glr_generated_gallery_plotting_aia_example.py`). (`#4573 `__) - Modified :ref:`sphx_glr_generated_gallery_plotting_magnetogram_active_regions.py` to use HMI file from sample data instead of downloading it with Fido. (`#4598 `__) - Removed unnecessary transformations of coordinates prior to plotting them using `~astropy.visualization.wcsaxes.WCSAxes.plot_coord`. (`#4609 `__) - Ensure that all attrs are documented and clean the `sunpy.net.hek.attrs` namespace of non-attr objects. (`#4834 `__) - Fixed miscellaneous issues with the gallery example :ref:`sphx_glr_generated_gallery_map_transformations_reprojection_align_aia_hmi.py`. (`#4843 `__) - Fixed the display of arguments in the documentation for `~sunpy.net.Fido` attributes (`sunpy.net.attrs`). (`#4916 `__) Trivial/Internal Changes ------------------------ - ``Fido.fetch`` now always specifies a ``path=`` argument of type `pathlib.Path` to the ``fetch`` method of the client. This path will default to the configured sunpy download dir, will have the user directory expanded, will have the ``{file}`` placeholder and will be tested to ensure that it is writeable. (`#4949 `__) - Added information on what went wrong when `sunpy.map.GenericMap.wcs` fails to parse a FITS header into a WCS. (`#4335 `__) - Fixed the `~sunpy.coordinates.frames.Helioprojective` docstring to be clear about the names of the coordinate components. (`#4351 `__) - Raise a better error message if trying to load a FITS file that contains only one dimensional data. (`#4426 `__) - The following functions in `sunpy.map` have had their performance greatly increased, with runtimes typically improving by a factor of 20x. This has been achieved by improving many of the checks so that they only require checking the edge pixels of a map as opposed to all of the pixels. - :func:`~sunpy.map.contains_full_disk` - :func:`~sunpy.map.is_all_off_disk` - :func:`~sunpy.map.is_all_on_disk` - :func:`~sunpy.map.contains_limb` (`#4463 `__) - Improved the output when you print a sunpy Map. (`#4464 `__) - Creating a `~sunpy.util.MetaDict` with dictionary keys that are not strings now raises as user-friendly `ValueError` which prints all the non-compliant keys. (`#4476 `__) - Maps created directly via. `sunpy.map.GenericMap` now have their metadata automatically converted to a `~sunpy.util.MetaDict`, which is the same current behaviour of the `sunpy.map.Map` factory. (`#4476 `__) - If the ``top_right`` corner given to :meth:`sunpy.map.GenericMap.submap` is below or to the right of the ``bottom_left`` corner, a warning is no longer raised (as the rectangle is still well defined), but a message is still logged at the debug level to the sunpy logger. (`#4491 `__) - Added test support for Python 3.9 (no wheels yet). (`#4569 `__) - ``sunpy.sun`` functions now make use of the `~astropy.coordinates.GeocentricTrueEcliptic` frame to simplify internal calculations, but the returned values are unchanged. (`#4584 `__) - Change the format of the time returned from :func:`~sunpy.coordinates.sun.carrington_rotation_number` from ``'jd'`` to ``'iso'``, so printing the `~astropy.time.Time` returned will now print an ISO timestamp instead of the Julian days. (`#4819 `__) - The listings for the sample data (`sunpy.data.sample`) are now sorted. (`#4838 `__) - Changed the implementation of a ``hypothesis``-based test so that it does not raise an error with ``hypothesis`` 6.0.0. (`#4852 `__) 2.0.0 (2020-06-12) ================== Backwards Incompatible Changes ------------------------------ - The frames `~sunpy.coordinates.frames.HeliographicStonyhurst` and `~sunpy.coordinates.frames.HeliographicCarrington` now inherit from the new base class `~sunpy.coordinates.frames.BaseHeliographic`. This changes means that ``isinstance(frame, HeliographicStonyhurst)`` is no longer ``True`` when ``frame`` is `~sunpy.coordinates.frames.HeliographicCarrington`. (`#3595 `__) - `~sunpy.visualization.colormaps.color_tables.aia_color_table`, `~sunpy.visualization.colormaps.color_tables.eit_color_table` and `~sunpy.visualization.colormaps.color_tables.suvi_color_table` now only take `astropy.units` quantities instead of strings. (`#3640 `__) - `sunpy.map.Map` is now more strict when the metadata of a map cannot be validated, and an error is now thrown instead of a warning if metadata cannot be validated. In order to load maps that previously loaded without error you may need to pass ``silence_errors=True`` to `sunpy.map.Map`. (`#3646 `__) - ``Fido.search`` will now return results from all clients which match a query, you no longer have to make the query specific to a single client. This means that searches involving the 'eve' and 'rhessi' instruments will now potentially also return results from the VSO. For `~sunpy.net.dataretriever.RHESSIClient` you can now specify ``a.Physobs("summary_lightcurve")`` to only include the summary lightcurve data products not provided by the VSO. (`#3770 `__) - The objects returned by the ``search`` methods on ``VSOClient``, ``JSOCClient`` and ``GenericClient`` have been changed to be based on `sunpy.net.base_client.BaseQueryResponse`. This introduces a few subtle breaking changes for people using the client search methods directly (not ``Fido.search``), or people using ``sunpy.net.fido_factory.UnifiedResponse.get_response``. When slicing an instance of ``QueryResponse`` it will now return an instance of itself, ``QueryResponse.blocks`` can be used to access the underlying records. Also, the ``.client`` attribute of the response no longer has to be the instance of the class the search was made with, however, it often is. (`#3770 `__) - `~sunpy.coordinates.frames.HeliographicCarrington` is now an observer-based frame, where the observer location (specifically, the distance from the Sun) is used to account for light travel time when determining apparent Carrington longitudes. Coordinate transformations using this frame now require an observer to be specified. (`#3782 `__) - To enable the precise co-alignment of solar images from different observatories, the calculation of Carrington coordinates now ignores the stellar-aberration correction due to observer motion. For an Earth observer, this change results in an increase in Carrington longitude of ~20 arcseconds. See :ref:`sunpy-topic-guide-coordinates-carrington` for more information. (`#3782 `__) - Fixed a bug where some of the coordinate transformations could raise `ValueError` instead of `~astropy.coordinates.ConvertError` when the transformation could not be performed. (`#3894 `__) - Astropy 3.2 is now the minimum required version of that dependency. (`#3936 `__) Deprecations and Removals ------------------------- - Fido search attrs available as `sunpy.net.attrs` i.e, ``a.Time``, ``a.Instrument`` etc are now deprecated as VSO attrs (`sunpy.net.vso.attrs`). (`#3714 `__) - ``sunpy.util.multimethod.MultiMethod`` is deprecated, `functools.singledispatch` provides equivalent functionality in the standard library. (`#3714 `__) - ``sunpy.net.vso.attrs.Physobs`` has been moved to `sunpy.net.attrs.Physobs` and the original deprecated. (`#3877 `__) - Deprecate ``sunpy.instr.aia.aiaprep`` in favor of the `aiapy.calibrate.register` function in the [aiapy](https://gitlab.com/LMSAL_HUB/aia_hub/aiapy) package. ``sunpy.instr.aia.aiaprep`` will be removed in version 2.1 (`#3960 `__) - Removed the module ``sunpy.sun.sun``, which was deprecated in version 1.0. Use the module `sunpy.coordinates.sun` instead. (`#4014 `__) - Removed Sun-associated functions in `sunpy.coordinates.ephemeris`, which were deprecated in 1.0. Use the corresponding functions in `sunpy.coordinates.sun`. (`#4014 `__) - Remove the deprecated ``sunpy.net.vso.vso.VSOClient`` ``.query_legacy`` and ``.latest`` methods. (`#4109 `__) - Removed the sample datasets NOAAINDICES_TIMESERIES and NOAAPREDICT_TIMESERIES because they will invariably be out of date. Up-to-date versions of these NOAA indices can be downloaded using `~sunpy.net.Fido` (see :ref:`sphx_glr_generated_gallery_plotting_solar_cycle_example.py`). (`#4169 `__) Features -------- - Added `~sunpy.coordinates.metaframes.RotatedSunFrame` for defining coordinate frames that account for solar rotation. (`#3537 `__) - Added a context manager (`~sunpy.coordinates.transform_with_sun_center`) to ignore the motion of the center of the Sun for coordinate transformations. (`#3540 `__) - Updated the gallery example titled 'Downloading and plotting an HMI magnetogram' to rotate the HMI magnetogram such that solar North is pointed up. (`#3573 `__) - Creates a function named ``sunpy.map.sample_at_coords`` that samples the data from the map at the given set of coordinates. (`#3592 `__) - Enabled the discovery of search attributes for each of our clients. (`#3637 `__) - Printing `sunpy.net.attrs.Instrument` or other "attrs" will show all attributes that exist under the corresponding "attr". (`#3637 `__) - Printing `sunpy.net.Fido` will print out all the clients that Fido can use. (`#3637 `__) - Updates `~sunpy.map.GenericMap.draw_grid` to allow disabling the axes labels and the ticks on the top and right axes. (`#3673 `__) - Creates a ``tables`` property for `~sunpy.net.fido_factory.UnifiedResponse`, which allows to access the `~sunpy.net.base_client.BaseQueryResponse` as an `~astropy.table.Table`, which then can be used for indexing of results. (`#3675 `__) - Change the APIs for ``sunpy.map.GenericMap.draw_rectangle`` and :meth:`sunpy.map.GenericMap.submap` to be consistent with each other and to use keyword-only arguments for specifying the bounding box. (`#3677 `__) - Updates the `~sunpy.map.GenericMap.observer_coordinate` property to warn the user of specific missing metadata for each frame. Omits warning about frames where all metadata is missing or all meta is present. (`#3692 `__) - Added `sunpy.util.config.copy_default_config` that copies the default config file to the user's config directory. (`#3722 `__) - ``sunpy.database`` now supports adding database entries and downloading data from ``HEK`` query (`#3731 `__) - Added a helper function (`~sunpy.coordinates.utils.get_rectangle_coordinates`) for defining a rectangle in longitude and latitude coordinates. (`#3737 `__) - Add a ``.data`` property in `~sunpy.timeseries.GenericTimeSeries`, so that users are encouraged to use :meth:`~sunpy.timeseries.GenericTimeSeries.to_dataframe` to get the data of the timeseries. (`#3746 `__) - It is now possible to turn on or off various corrections in :func:`~sunpy.coordinates.sun.L0` (the apparent Carrington longitude of Sun-disk center as seen from Earth). (`#3782 `__) - Made skimage.transform import lazy to reduce import time of `sunpy.image.transform` by ~50% (`#3818 `__) - Add support for parfive 1.1. This sets a limit on the number of open connections to JSOC when downloading files to 10. (`#3822 `__) - Fido clients (subclasses of `sunpy.net.base_client.BaseClient`) can now register their own attrs modules with `sunpy.net.attrs`. This allows clients which require attr classes specific to that client to register modules that can be used by the user i.e. ``a.vso``. It also allows clients implemented externally to sunpy to register attrs. (`#3869 `__) - Added the methods :meth:`sunpy.map.GenericMap.quicklook` and :meth:`sunpy.map.MapSequence.quicklook` to display an HTML summary of the instance, including interactive controls. When using Jupyter notebooks, this HTML summary is automatically shown instead of a text-only representation. (`#3951 `__) - Added `_localfilelist` method in ``sunpy.util.scraper.Scraper`` to scrap local data archives. (`#3994 `__) - Added extra constants to `sunpy.sun.constants`: - Longitude of the prime meridian (epoch J2000.0) : ``sunpy.sun.constants.get('W_0')`` - Sidereal rotation rate : `sunpy.sun.constants.sidereal_rotation_rate` - First Carrington rotation (JD TT) : `sunpy.sun.constants.first_carrington_rotation` - Mean synodic period : `sunpy.sun.constants.mean_synodic_period` - Right ascension (RA) of the north pole (epoch J2000.0) : ``sunpy.sun.constants.get('alpha_0')`` - Declination of the north pole (epoch J2000.0) : ``sunpy.sun.constants.get('delta_0')`` (`#4013 `__) - Adds to ``sunpy.util.scraper.Scraper`` the ability to include regular expressions in the URL passed. (`#4107 `__) Bug Fixes --------- - Added support for passing ``TimeSeriesMetaData`` object to ``timeseries_factory`` and associated validation tests. (`#3639 `__) - Now when `~sunpy.map.GenericMap` fails to load a file, the filename that failed to load will now be part of the error message. (`#3727 `__) - Work around incorrect Content-Disposition headers in some VSO downloads, which were leading to mangled filenames. (`#3740 `__) - ``Fido.search`` can now service queries without ``a.Time`` being specified. This is currently only used by the `sunpy.net.jsoc.JSOCClient`. (`#3770 `__) - Fixed a bug with the calculation of Carrington longitude as seen from Earth where it was using an old approach instead of the current approach (for example, the varying Sun-Earth distance is now taken into account). The old approach resulted in errors no greater than 7 arcseconds in Carrington longitude when using `~sunpy.coordinates.sun.L0` and `~sunpy.coordinates.frames.HeliographicCarrington`. (`#3772 `__) - Updated `sunpy.map.CompositeMap.plot` to support a linewidths argument. (`#3792 `__) - Fix a bug in `sunpy.net.jsoc.JSOCClient` where requesting data for export would not work if a non-time primekey was used. (`#3825 `__) - Add support for passing paths of type `pathlib.Path` in `sunpy.net.jsoc.JSOCClient.fetch`. (`#3838 `__) - Add explicit support for dealing with download urls for files, under 'as-is' protocol in `sunpy.net.jsoc.JSOCClient.get_request`. (`#3838 `__) - Updated the method used to filter time in the VSO post-search filtering function. (`#3840 `__) - Fix failing of fetching of the indexed JSOCResponses using `sunpy.net.fido_factory.UnifiedDownloaderFactory.fetch`. (`#3852 `__) - Prevented `sunpy.map.GenericMap.plot` modifying in-place any items passed as ``imshow_kwargs``. (`#3867 `__) - Changed the format of DATE-OBS in `sunpy.map.GenericMap.wcs` from iso to isot (ie. with a "T" between the date and time) to conform with the FITS standard. (`#3872 `__) - Fixed a minor error (up to ~10 arcseconds) in the calculation of the Sun's position angle (:func:`sunpy.coordinates.sun.P`). (`#3886 `__) - `~sunpy.net.hek.HEKClient` was returning HTML and not JSON. (`#3899 `__) - Updated to HTTPS for HEK. (`#3917 `__) - The accuracy of the output of :func:`sunpy.coordinates.ephemeris.get_horizons_coord` is significantly improved. (`#3919 `__) - Fixed a bug where the longitude value for the reference coordinate in the Map repr would be displayed with the unintended longitude wrapping. (`#3959 `__) - It is now possible to specify a local file path to `sunpy.data.data_manager.DataManager.override_file` without having to prefix it with ``file://``. (`#3970 `__) - Closed the session in the destructor of VSOClient thus solving the problem of socket being left open (`#3973 `__) - Fixed a bug of where results of VSO searches would have inconsistent ordering in ``sunpy.net.vso.vso.QueryResponse`` by always sorting the results by start time. (`#3974 `__) - Fixes two bugs in `sunpy.util.deprecated`: correctly calculates the removal version and does not override the default and/or alternative functionality message. Providing a custom deprecation message now suppresses any mention of the removal version. Additionally, a ``pending`` keyword argument is provided to denote functions/classes that are pending deprecation. (`#3982 `__) - Correctly generate labels for sliders in ``~sunpy.visualization.animator.ArrayAnimatorWCS`` when the number of pixel dimensions and the number of world dimensions are not the same in the WCS. (`#3990 `__) - Updated VSOClient.response_block_properties to check if "None" is in the return. (`#3993 `__) - Fix a bug with ``sunpy.visualization.animator.ArrayAnimatorWCS`` where animating a line with a masked array with the whole of the initial line masked out the axes limits for the x axis were not correctly set. (`#4001 `__) - Fixed passing in a list of URLs into `sunpy.map.GenericMap`, before it caused an error due to the wrong type being returned. (`#4007 `__) - Fixed a bug with :func:`~sunpy.coordinates.transform_with_sun_center` where the global variable was sometimes restored incorrectly. This bug was most likely encountered if there was a nested use of this context manager. (`#4015 `__) - Fixes a bug in fido_factory to allow path="./" in fido.fetch(). (`#4058 `__) - Prevented ``sunpy.io.fits.header_to_fits`` modifying the passed header in-place. (`#4067 `__) - Strip out any unknown unicode from the HEK response to prevent it failing to load some results. (`#4088 `__) - Fixed a bug in :func:`~sunpy.coordinates.ephemeris.get_body_heliographic_stonyhurst` that resulted in a error when requesting an array of locations in conjunction with enabling the light-travel-time correction. (`#4112 `__) - `sunpy.map.GenericMap.top_right_coord` and `~sunpy.map.GenericMap.center` have had their definitions clarified, and both have had off-by-one indexing errors fixed. (`#4121 `__) - Fixed `sunpy.map.GenericMap.submap()` when scaled pixel units (e.g. ``u.mpix``) are used. (`#4127 `__) - Fixed bugs in ``sunpy.util.scraper.Scraper.filelist`` that resulted in error when the HTML page of URL opened by the scraper contains some "a" tags without "href" attribute and resulted in incorrect file urls when any href stores filepath relative to the URL's domain instead of just a filename. (`#4132 `__) - Fixed inconsistencies in how `~sunpy.map.GenericMap.submap` behaves when passed corners in pixel and world coordinates. The behavior for submaps specified in pixel coordinates is now well-defined for pixels on the boundary of the rectangle and is consistent for all boundaries. Previously pixels on the lower left boundary were included, but excluded on the upper and right boundary. This means the shape of a submap may now be 1 pixel larger in each dimension. Added several more tests for `~sunpy.map.GenericMap.submap` for a range of cutout sizes in both pixel and world coordinates. (`#4134 `__) - `sunpy.map.on_disk_bounding_coordinates` now fully propagates the coordinate frame of the input map to the output coordinates. Previously only the observer coordinate, and no other frame attributes, were propagated. (`#4141 `__) - Fix an off-by-one error in the reference pixel returned by :func:`sunpy.map.header_helper.make_fitswcs_header`. (`#4152 `__) - `sunpy.map.GenericMap.reference_pixel` now uses zero-based indexing, in order to be consistent with the rest of the `sunpy.map` API. (`#4154 `__) - Previously `sunpy.map.GenericMap.resample` with ``method='linear'`` was using an incorrect and constant value to fill edges when upsampling a map. Values near the edges are now correctly extrapolated using the ``fill_value=extrapolate`` option to `scipy.interpolate.interp1d`. (`#4164 `__) - Fixed a bug where passing an `int` or `list` via the ``hdus`` keyword argument to ``sunpy.io.fits.read`` threw an exception because the list of HDU objects was no longer of type `~astropy.io.fits.HDUList`. (`#4183 `__) - Fix attr printing when the attr registry is empty for that attr (`#4199 `__) - Improved the accuracy of :func:`~sunpy.coordinates.sun.angular_radius` by removing the use of the small-angle approximation. The inaccuracy had been less than 5 milliarcseconds. (`#4239 `__) - Fixed a bug with the ``observer`` frame attribute for coordinate frames where an input that was not supplied as a `~astropy.coordinates.SkyCoord` would sometimes result in a transformation error. (`#4266 `__) Improved Documentation ---------------------- - Fixed an issue with the scaling of class-inheritance diagrams in the online documentation by blocking the versions of graphviz containing a bug. (`#3548 `__) - A new example gallery example "Plotting a difference image" has been added, which can be used for base difference or running difference images. (`#3627 `__) - Removed obsolete Astropy Helpers submodule section in :file:`CONTRIBUTING.rst`; Also removed mentions of astropy_helpers in all files of the project. (`#3676 `__) - Corrected misleading `~sunpy.timeseries.metadata.TimeSeriesMetaData` documentation about optional parameters. (`#3680 `__) - Added an example for `~sunpy.map.GenericMap.world_to_pixel` function in the Units & Coordinates guide. (`#3776 `__) - Added a :ref:`page ` describing how SunPy calculates Carrington longitudes. (`#3782 `__) - Changed padding value of an example in the example gallery to fix the overlap of titles and x-label axes. (`#3835 `__) - More information and links about how to create changelogs. (`#3856 `__) - Clarified some inputs to `sunpy.map.GenericMap.plot`. (`#3866 `__) - Changed quoted sentence (that we suggest authors add to their research papers) in CITATION.rst (`#3896 `__) - Add example of how to use SunPy's HEK client to search for the GOES flare event list. (`#3953 `__) - Improved the doc layout of `sunpy.data.sample`. (`#4034 `__) - Made improvements to STEREO starfield gallery example. (`#4039 `__) - Improved the documentation of `sunpy.map.GenericMap.resample`. (`#4043 `__) - Updated the STEREO starfield example to use all of the information in the star catalog. (`#4116 `__) - Mini-galleries are now easier to create in the documentation thanks to a custom Sphinx directive (``minigallery``). The page :ref:`sunpy-topic-guide-coordinates-rotatedsunframe` has an example of a mini-gallery at the bottom. (`#4124 `__) - Added `sunpy.visualization.colormaps.color_tables` to the docs. (`#4182 `__) - Made minor improvements to the map histogramming example. (`#4205 `__) - Add a warning to `sunpy.io` docs to recommend not using it for FITS (`#4208 `__) Trivial/Internal Changes ------------------------ - Removed un-used and un-tested code paths in the private ``_remove_lytaf_events`` function in ``sunpy.instr.lyra``. (`#3570 `__) - Removed ``astropy_helpers`` and this means that ``python setup.py `` no longer works. So if you want to: * Run the tests: Use ``tox -e `` or call ``pytest`` directly * Build the docs: Use ``tox -e docs`` or cd into the docs folder and run ``make html`` or ``sphinx-build docs docs/_build/html -W -b html -d docs/_build/.doctrees`` (`#3598 `__) - Cleaned up test warnings in sunpy.coordinates. (`#3652 `__) - Fix Python version for requiring importlib_resources (`#3683 `__) - `sunpy.net.attr.AttrWalker` no longer uses ``sunpy.util.multimethod.MultiMethod`` it uses a derivative of `functools.singledispatch` `sunpy.util.functools.seconddispatch` which dispatches on the second argument. (`#3714 `__) - Errors from a VSO search will now be raised to the user. (`#3719 `__) - Fixed the transformation test for `~sunpy.coordinates.metaframes.NorthOffsetFrame`, which would intermittently fail. (`#3775 `__) - :func:`~sunpy.coordinates.sun.earth_distance` is now computed without using coordinate transformations for better performance. (`#3782 `__) - Created a helper function for testing the equality/closeness of longitude angles (i.e., angles with wrapping). (`#3804 `__) - Bump the astropy version figure tests are run with from 3.1.2 to 3.2.3 (`#3925 `__) - Used `urllib.parse.urlsplit` in ``sunpy.util.scraper`` for file scraping functionalities. (`#3956 `__) - Added `sunpy.net.base_client.BaseClient.check_attr_types_in_query` as a helper method to check if a query contains a set of required attributes, and is a subset of optional attributes. (`#3979 `__) - Removes appending login details for ftp urls from scraper. (`#4020 `__) - Re-factored the `sunpy.map.Map` factory to dispatch argument parsing based on type. (`#4037 `__) - Improved the error message raised by the Map factory when a map matches multiple source map types. (`#4052 `__) - Added log messages when the sample data fails to download. (`#4137 `__) - Remove an Astropy 3.1 compatibility wrapper for ``Quantity.to_string``. (`#4172 `__) - Refactor the sphinx config to no longer depend on astropy-sphinx and more closely match the new sunpy package template (`#4188 `__) 1.1.0 (2020-01-10) ================== Backwards Incompatible Changes ------------------------------ - The ``sunpy.net.vso.vso.get_online_vso_url`` function has been broken into two components, the new ``sunpy.net.vso.vso.get_online_vso_url`` function takes no arguments (it used to take three) and now only returns an online VSO mirror or None. The construction of a ``zeep.Client`` object is now handled by ``sunpy.net.vso.vso.build_client`` which has a more flexible API for customising the ``zeep.Client`` interface. (`#3330 `__) - Importing ``sunpy.timeseries.timeseriesbase`` no longer automatically imports Matplotlib. (`#3376 `__) - :meth:`sunpy.timeseries.sources.NOAAIndicesTimeSeries.peek()` now checks that the `type` argument is a valid string, and raises a `ValueError` if it isn't. (`#3378 `__) - Observer-based coordinate frames (`~sunpy.coordinates.frames.Heliocentric` and `~sunpy.coordinates.frames.Helioprojective`) no longer assume a default observer (Earth) if no observer is specified. These frames can now be used with no observer specified, but most transformations cannot be performed for such frames. This removal of a default observer only affects `sunpy.coordinates`, and has no impact on the default observer in `sunpy.map`. (`#3388 `__) - The callback functions provided to ``BaseFuncAnimator`` ``button_func`` keyword argument now take two positional arguments rather than one. The function signature is now ``(animator, event)`` where the first arg is the animator object, and the second is the matplotlib mouse event. (`#3407 `__) - The colormap stored in SunPy's Map subclasses (ie. ``map.plot_settings['cmap']``) can now be colormap string instead of the full `matplotlib.colors.Colormap` object. To get the full `~matplotlib.colors.Colormap` object use the new attribute ``map.cmap``. (`#3412 `__) - Fix a warning in `sunpy.map.GenericMap.rotate` where the truth value of an array was being calculated. This changes the behaviour of `~sunpy.map.GenericMap.rotate` when the ``angle=`` parameter is not an `~astropy.units.Quantity` object to raise `TypeError` rather than `ValueError`. (`#3456 `__) Deprecations and Removals ------------------------- - Removed the step of reparing images (replacing non-finite entries with local mean) before coaligning them. The user is expected to do this themselves before coaligning images. If NaNs/non-finite entries are present, a warning is thrown. The function ``sunpy.image.coalignment.repair_image_nonfinite`` is deprecated. (`#3287 `__) - The method to convert a `~sunpy.coordinates.frames.Helioprojective` frame from 2D to 3D has been renamed from ``calculate_distance`` to `~sunpy.coordinates.frames.Helioprojective.make_3d`. This method is not typically directly called by users. (`#3389 `__) - ``sunpy.visualization.animator.ImageAnimatorWCS`` is now deprecated in favour of ``ArrayAnimatorWCS``. (`#3407 `__) - ``sunpy.cm`` has been moved to `sunpy.visualization.colormaps` and will be removed in a future version. (`#3410 `__) Features -------- - Add a new `sunpy.data.manager` and `sunpy.data.cache` for dealing with versioned remote data within functions. Please see the `Remote Data Manager `__ guide. (`#3124 `__) - Added the coordinate frames `~sunpy.coordinates.frames.HeliocentricEarthEcliptic` (HEE), `~sunpy.coordinates.frames.GeocentricSolarEcliptic` (GSE), `~sunpy.coordinates.frames.HeliocentricInertial` (HCI), and `~sunpy.coordinates.frames.GeocentricEarthEquatorial` (GEI). (`#3212 `__) - Added SunPy Map support for GOES SUVI images. (`#3269 `__) - - Support APE14 for ``ImageAnimatorWCS`` in SunPy's visualization module (`#3275 `__) - Add ability to disable progressbars when downloading files using `sunpy.net.helioviewer` and edited docstrings to mention this feature. (`#3280 `__) - Adds support for searching and downloading SUVI data. (`#3301 `__) - Log all VSO XML requests and responses to the SunPy logger at the ``DEBUG`` level. (`#3330 `__) - Transformations between frames in `sunpy.coordinates` can now provide detailed debugging output. Set the `logging` level to ``DEBUG`` to enable this output. (`#3339 `__) - Added the `sunpy.coordinates.sun.carrington_rotation_time` function to compute the time of a given Carrington rotation number. (`#3360 `__) - A new method has been added to remove columns from a `sunpy.timeseries.GenericTimeSeries`. (`#3361 `__) - Add ``shape`` property to TimeSeries. (`#3380 `__) - Added ASDF schemas for the new coordinate frames (`~sunpy.coordinates.frames.GeocentricEarthEquatorial`, `~sunpy.coordinates.frames.GeocentricSolarEcliptic`, `~sunpy.coordinates.frames.HeliocentricEarthEcliptic`, `~sunpy.coordinates.frames.HeliocentricInertial`). See the gallery for an example of using ``asdf`` to save and load a coordinate frame. (`#3398 `__) - ``sunpy.visualization.animator.ArrayAnimatorWCS`` was added which uses the WCS object to get the coordinates of all axes, including the slider labels. It also provides the ability to customise the plot by specifying arguments to `~astropy.visualization.wcsaxes.WCSAxes` methods and supports animation of WCS aware line plots with Astroy 4.0. (`#3407 `__) - The returned list of `~sunpy.map.Map` objects is now sorted by filename when passing a directory or glob pattern to `~sunpy.map.map_factory.MapFactory`. (`#3408 `__) - Single character wildcards and character ranges can now be passed as glob patterns to `~sunpy.map.Map`. (`#3408 `__) - `~sunpy.map.Map` now accepts filenames and directories as `pathlib.Path` objects. (`#3408 `__) - `~sunpy.map.GenericMap` objects now have a ``.cmap`` attribute, which returns the full `~matplotlib.colors.Colormap`. object. (`#3412 `__) - `sunpy.io.write_file()` now accepts `~pathlib.Path` objects as filename inputs. (`#3469 `__) - :func:`sunpy.map.header_helper.make_fitswcs_header` now accepts a `tuple` representing the shape of an array as well as the actual array as the ``data`` argument. (`#3483 `__) - Made a couple of module imports lazy to reduce the import time of sunpy.map by ~40%. (`#3495 `__) - `sunpy.map.GenericMap.wcs` now uses the full FITS header to construct the WCS. This adds support for instruments with more complex projections, such as WISPR, however does mean that Map will be more sensitive to incorrect or invalid FITS headers. If you are using custom headers with SunPy Map you might encounter issues relating to this change. (`#3501 `__) - ``sunpy.visualization.animator.BaseFuncAnimator`` now takes an optional ``slider_labels`` keyword argument which draws text labels in the center of the sliders. (`#3504 `__) - Added a more helpful error message when trying to load a file or directory that doesn't exist with `sunpy.map.Map`. (`#3568 `__) - Add ``__repr__`` for `~sunpy.map.MapSequence` objects so that users can view the critical information of all the ``Map`` objects, in a concise manner. (`#3636 `__) Bug Fixes --------- - Fixed accuracy issues with the calculations of Carrington longitude (`~sunpy.coordinates.sun.L0`) and Carrington rotation number (`~sunpy.coordinates.sun.carrington_rotation_number`). (`#3178 `__) - Updated :func:`sunpy.map.header_helper.make_fitswcs_header` to be more strict on the inputs it accepts. (`#3183 `__) - Fix the calculation of ``rsun_ref`` in :func:`~sunpy.map.header_helper.make_fitswcs_header` and and ensure that the default reference pixel is indexed from 1. (`#3184 `__) - Fixed the missing transformation between two `~sunpy.coordinates.HeliographicCarrington` frames with different observation times. (`#3186 `__) - `sunpy.map.sources.AIAMap` and `sunpy.map.sources.HMIMap` will no longer assume the existence of certain header keys. (`#3217 `__) - :func:`sunpy.map.header_helper.make_fitswcs_header` now supports specifying the map projection rather than defaulting to ``TAN``. (`#3218 `__) - Fix the behaviour of ``sunpy.coordinates.frames.Helioprojective.calculate_distance`` if the representation isn't Spherical. (`#3219 `__) - Fixed a bug where the longitude of a coordinate would not wrap at the expected angle following a frame transformation. (`#3223 `__) - Fixed a bug where passing a time or time interval to the differential rotation function threw an error because the new observer was not in HGS. (`#3225 `__) - Fixed bug where `~sunpy.coordinates.ephemeris.get_horizons_coord` was unable to accept `~astropy.time.Time` arrays as input. (`#3227 `__) - Fix the ticks on the default heliographic grid overlay so they are not white (and normally invisible) by default. (`#3235 `__) - Fixed a bug with `sunpy.net.hek.HEKClient` when the results returned were a mixed dataset. (`#3240 `__) - Fix `sunpy.physics.differential_rotation.differential_rotate` to rotate in the correct direction and to account for the rotation of the heliographic coordinate frame with time. (`#3245 `__) - Fixed a bug with the handling of changing observation times for transformations between `~astropy.coordinates.HCRS` and `~sunpy.coordinates.frames.HeliographicStonyhurst`, which also indirectly affected other transformations when changing observation times. (`#3246 `__) - Fixed all coordinate transformations to properly handle a change in observation time. (`#3247 `__) - Fixed the handling of coordinates with velocity information when transforming between Astropy frames and SunPy frames. (`#3247 `__) - Fixed ``sunpy.physics.solar_rotation.calculate_solar_rotate_shift`` so that it does not calculate a shift between the reference layer and itself, which would sometimes incorrectly result in a shift of a pixel due to numerical precision. (`#3255 `__) - Stop crash when ``LineAnimator`` ``axes_ranges`` entry given as ``1D`` array when data is ``>1D``, i.e. as an independent axis. (`#3283 `__) - Fixed a `sunpy.coordinates` bug where a frame using the default observer of Earth could have its observer overwritten during a transformation. (`#3291 `__) - Fixed a bug where the transformation from `~sunpy.coordinates.frames.Helioprojective` to `~sunpy.coordinates.frames.Heliocentric` used the Sun-observer distance from the wrong frame when shifting the origin, and thus might not give the correct answer if the observer was not the same for the two frames. (`#3291 `__) - Fixed a bug with the transformations between `~sunpy.coordinates.frames.Heliocentric` and `~sunpy.coordinates.frames.HeliographicStonyhurst` when the frame observation time was not the same as the observer observation time. The most common way to encounter this bug was when transforming from `~sunpy.coordinates.frames.Helioprojective` to any non-observer-based frame while also changing the observation time. (`#3291 `__) - VSO client ``fetch`` should not download when ``wait`` keyword argument is specified. (`#3298 `__) - Fixed a bug with `~sunpy.coordinates.wcs_utils.solar_frame_to_wcs_mapping` that assumed that the supplied frame was a SunPy frame. (`#3305 `__) - Fixed bugs with `~sunpy.coordinates.wcs_utils.solar_frame_to_wcs_mapping` if the input frame does not include an observation time or an observer. (`#3305 `__) - `~sunpy.coordinates.utils.GreatArc` now accounts for the start and end points of the arc having different observers. (`#3334 `__) - Fixed situations where 2D coordinates provided to `~sunpy.coordinates.frames.HeliographicStonyhurst` and `~sunpy.coordinates.frames.HeliographicCarrington` were not converted to 3D as intended. Furthermore, the stored data will always be the post-conversion, 3D version. (`#3351 `__) - Fix off by one error in :func:`sunpy.map.header_helper.make_fitswcs_header` where when using the default ``reference_pixel=None`` keyword argument the pixel coordinate of the reference pixel was off by +1. (`#3356 `__) - Updated both GOES XRS and LYRA dataretriever clients to use ``sunpy.util.scraper.Scraper``, to make sure that files are actually on the servers being queried. (`#3367 `__) - Fixing the ordering of lon and lat inputs into make_fitswcs_header (`#3371 `__) - Updated the URL for Fermi spacecraft-pointing files to use an HTTPS connection to HEASARC. (`#3381 `__) - Fixed a bug where permission denied errors when downloading files are very verbose by adding an error message in `~sunpy.net.fido_factory.UnifiedDownloaderFactory.fetch`. (`#3417 `__) - Fixed a malformed call to `astropy.time.Time` in a test, which resulted in an incorrect time scale (UTC instead of TT). (`#3418 `__) - Fix incorrect files being included in the tarball, and docs missing from the tarball (`#3423 `__) - Fixed a bug where clipping behavior had been enabled by default in the plotting normalizers for ``Map`` objects. Clipping needs to be disabled to make use of the over/under/masked colors in the colormap. (`#3427 `__) - Fix a bug with observer based frames that prevented a coordinate with an array of obstimes being transformed to other frames. (`#3455 `__) - `sunpy.map.GenericMap` will no longer raise a warning if the position of the observer is not known for frames that don't need an observer, i.e. heliographic frames. (`#3462 `__) - Apply `os.path.expanduser` to `sunpy.map.map_factory.MapFactory` input before passing to `glob.glob` (`#3477 `__) - Fix multiple instances of `sunpy.map` sources assuming the type of FITS Header values. (`#3497 `__) - Fixed a bug with `~sunpy.coordinates.NorthOffsetFrame` where non-spherical representations for the north pole produced an error. (`#3517 `__) - Fixed ``map.__repr__`` when the coordinate system information contained in the ``CUNIT1/2`` metadata is not set to a known value. (`#3569 `__) - Fixed bugs with some coordinate transformations when ``obstime`` is ``None`` on the destination frame but can be assumed to be the same as the ``obstime`` of the source frame. (`#3576 `__) - Updated `sunpy.map.mapsequence.MapSequence` so that calling ``_derotate()`` raises ``NotImplementedError``. Added associated tests. (`#3613 `__) - Fixed pandas plotting registration in `sunpy.timeseries`. (`#3633 `__) - Correctly catch and emit a warning when converting a map metadata to a FITS header and it contains a keyword with non-ascii characters. (`#3645 `__) Improved Documentation ---------------------- - Clean up the docstring for `sunpy.physics.differential_rotation.solar_rotate_coordinate` to make the example clearer. (`#2708 `__) - Added new gallery examples and cleaned up various gallery examples. (`#3181 `__) - Cleaned and expanded upon the docstrings for each Fido Client. (`#3220 `__) - Added clarifying hyperlinks to the gallery example ``getting_lasco_observer_location`` to link to `astroquery `__ docs page. (`#3228 `__) - Added more details to docstrings in `sunpy.coordinates.frames`. (`#3262 `__) - Added a link to package maintainer list in the API Stability page. (`#3281 `__) - Improved the contributing guide by updating commands and highlighting text. (`#3394 `__) - Removing ``.fits`` from the end of path kwargs in `sunpy.net.fido_factory.UnifiedDownloaderFactory.fetch` docs to change output file extension from ``{file}.fits.fits`` to ``{file}.fits``. (`#3399 `__) - A new example gallery section "Using SunPy with Other Packages" has been added, which contains a set of new examples using the `reproject `__ with solar data. (`#3405 `__) - Added a table of supported coordinate systems and other miscellaneous improvements to the :ref:`coordinates documentation `. (`#3414 `__) - Clarified the meaning of :attr:`sunpy.map.GenericMap.dsun`. (`#3430 `__) - Fixed the plots with multiple subplots in the ``Map`` user guide to properly use `~astropy.visualization.wcsaxes` and to be appropriately sized. (`#3454 `__) - Fixed various issues with the gallery example of saving/loading coordinates using ``asdf``. (`#3473 `__) - Added ``sunpy.__citation__`` with a BibTex entry for citing sunpy. (`#3478 `__) - Added an example showing how to display two maps and fade between them. (`#3488 `__) - Clarified the meaning of some `~sunpy.map.GenericMap` observer properties. (`#3585 `__) - Added inherited members of `sunpy.map` classes to the docs. (`#3587 `__) - Fixed documentation of `sunpy.database.Database.search` by adding ``Returns`` docstring. (`#3593 `__) - Updated the docstring for the parameter ``sortby`` in `~sunpy.map.MapSequence` with the default value, valid value and how to disable sorting. (`#3601 `__) - Updated the tour guide to reflect that the time series is not random data. (`#3603 `__) - Fixes bold type and extra line breaks of remote data manager example. (`#3615 `__) Trivial/Internal Changes ------------------------ - Allow running our sphinx-gallery examples as Jupyter notebooks via Binder (`#3256 `__) - Improve error messages and type checking in ``sunpy.visualization.animator.image.ImageAnimatorWCS``. (`#3346 `__) - Copy the library ``distro`` into :file:`sunpy/extern`: replaces the deprecated ``platform/linux_distribution`` (`#3396 `__) - The version of Matplotlib used to generate figure tests has been bumped from 3.0.3 to 3.1.1. (`#3406 `__) - Corrected spelling of 'plotting' in timeseries method (changed 'ploting' to 'plotting'). (`#3429 `__) - Switched to "importlib_metadata" to get package version to speed up import of SunPy. (`#3449 `__) - Fix tests for `sunpy.data.data_manager` and ensure they are correctly executed with pytest. (`#3550 `__) 1.0.0 (2019-06-01) ================== Backwards Incompatible Changes ------------------------------ - Move the matplotlib animators from ``sunpy.visualisation.imageanimator`` and ``sunpy.visualization.mapcubeanimator`` to `sunpy.visualization.animator`. (`#2515 `__) - Make `sunpy.time.parse_time` return `astropy.time.Time` instead of `datetime.datetime`. (`#2611 `__) - The properties and methods of `sunpy.time.TimeRange` returns `astropy.time.Time` and `astropy.time.TimeDelta` instead of `datetime.datetime` and `datetime.timedelta` respectively. (`#2638 `__) - The ``sunpy.instr.goes`` module now accepts and returns `sunpy.timeseries.sources.XRSTimeSeries` objects only. (`#2666 `__) - ``obstime`` keyword param of ``sunpy.instr.goes._goes_lx`` takes a non-scalar `astropy.time.Time` object instead of `numpy.ndarray`. The precision of times contained in `sunpy.timeseries` has been increased to 9 from 6. (`#2676 `__) - Removed ``sunpy.net.jsoc.attrs.Time`` because it served the same purpose as `sunpy.net.attrs.Time` after the switch to `astropy.time.Time`. (`#2694 `__) - Remove unused ``**kwargs`` within TimeSeries functions. (`#2717 `__) - Rotation matrices inside map objects were previously stored as numpy matrices, but are now stored as numpy arrays, as numpy will eventually remove their matrix datatype. See https://docs.scipy.org/doc/numpy/user/numpy-for-matlab-users.html for more information. (`#2719 `__) - The ``sunpy.cm.show_colormaps`` function now accepts the keyword 'search' instead of 'filter'. (`#2731 `__) - The keyword arguments to all client ``.fetch`` methods have been changed to support the new parfive downloader and to ensure consistency across all Fido clients. (`#2797 `__) - The Helioviewer client has been switched to using the newer Helioviewer API. This has meant that we have changed some of the keywords that were passed into client's methods. We have enforced that several keywords (observatory,instrument,detector,measurement) need to be defined otherwise the functions cannot return any data. (`#2801 `__) - Maps no longer assume that the pixel units are arcseconds if the units aren't explicitly set. In addition to this if critical metadata is missing from when creating a map, the map will fail to initialize and will raise an error. (`#2847 `__) - axis_ranges kwarg of ``sunpy.visualization.animator.base.ArrayAnimator``, ``sunpy.visualization.animator.image.ImageAnimator`` and ``sunpy.visualization.animator.line.LineAnimator`` now must be entered as None, [min, max] or pixel edges of each array element. Previously, pixel centers were expected. This change removes ambiguity in interpretation and ensures the extent of the plot can always be accurately derived. (`#2867 `__) - All keywords have been added (with defaults) to each `~sunpy.net.helioviewer.HelioviewerClient` function. This means that there will be some changes to the style of the PNG screenshot that is returned. Returns for the JPEG 2000 and the other functions should be the same but not guaranteed. (`#2883 `__) - Changed `sunpy.sun.models.interior` and `sunpy.sun.models.evolution` from `pandas.DataFrame` to `astropy.table.QTable` (`#2936 `__) - Minimum numpy version is now >=1.14.5 (`#2954 `__) - Removed ``sunpy.time.julian_day``, ``sunpy.time.julian_centuries``, ``sunpy.time.day_of_year``, ``sunpy.time.break_time``, ``sunpy.time.get_day``. (`#2999 `__) - Updated the solar values in `sunpy.sun.constants` to IAU 2015 values. (`#3001 `__) - Renamed ``eccentricity_sunearth_orbit`` to ``eccentricity_sun_earth_orbit``. (`#3001 `__) - Renamed ``sunpy.image.rescale`` to `sunpy.image.resample`. (`#3044 `__) - Remove the ``basic_plot`` keyword argument from `~sunpy.map.GenericMap.peek`. An example has been added to the gallery showing how to make a plot like this. (`#3109 `__) - `sunpy.map.GenericMap` will no longer use the key ``solar_b0`` as a value for heliographic latitude. (`#3115 `__) - `sunpy.map.GenericMap` now checks for a complete observer location rather than individually defaulting coordinates (lat, lon, distance) to Earth position. If any one of the three coordinates is missing from the header the observer will be defaulted to Earth and a warning raised. (`#3115 `__) - ``sunpy.sun.sun`` functions have been re-implemented using Astropy for significantly improved accuracy. Some functions have been removed. (`#3137 `__) - All of the functions in ``sunpy.sun.sun`` and all of the Sun-specific functions in `sunpy.coordinates.ephemeris` have been moved to the new module `sunpy.coordinates.sun`. (`#3163 `__) Deprecations and Removals ------------------------- - The deprecated ``sunpy.lightcurve``, ``sunpy.wcs`` and ``sunpy.spectra`` modules have now been removed. (`#2666 `__) - ``sunpy.instr.rhessi.get_obssumm_dbase_file`` ``sunpy.instr.rhessi.get_obssum_filename``, ``sunpy.instr.rhessi.get_obssumm_file`` have been removed. `~sunpy.net.Fido` should be used to download these files. (`#2808 `__) - Removed ``heliographic_solar_center`` in favour of ``sunpy.coordinates.get_sun_L0`` and ``sunpy.coordinates.get_sun_B0`` (`#2830 `__) - Removed ``GenericClient.query`` in favour of `sunpy.net.dataretriever.GenericClient.search` (`#2830 `__) - Removed ``sunearth_distance`` in favour of ``get_sunearth_distance`` (`#2830 `__) - Removed ``remove_lytaf_events_from_lightcurve`` in favour of ``sunpy.instr.lyra.remove_lytaf_events_from_timeseries`` (`#2830 `__) - Removed ``sunpy.cm.get_cmap`` in favour of ``plt.get_cmap`` (`#2830 `__) - Removed ``database.query`` in favour of `sunpy.database.Database.search` (`#2830 `__) - Removed ``sunpy.net.vso.InteractiveVSOClient`` (`#2830 `__) - Removed ``MapCube`` in favour of `~sunpy.map.MapSequence` (`#2830 `__) - Removed ``solar_north`` in favour of ``get_sun_P`` (`#2830 `__) - Removed ``database.download`` in favour of `sunpy.database.Database.fetch` (`#2830 `__) - Removed ``sunpy.map.GenericMap.pixel_to_data`` in favour of `sunpy.map.GenericMap.pixel_to_world` (`#2830 `__) - Removed ``GenericClient.get`` in favour of `sunpy.net.dataretriever.GenericClient.fetch`. This changes applies to the other clients as well. (`#2830 `__) - Removed ``Map.xrange`` and ``Map.yrange`` (`#2830 `__) - Removed ``sunpy.net.attrs.Wave`` in favour of ``sunpy.net.vso.attrs.Wavelength`` (`#2830 `__) - Removed ``JSOCClient.check_request`` in favour of `drms.client.ExportRequest.status` (`#2830 `__) - ``sunpy.net.vso.VSOClient.query_legacy`` and ``sunpy.net.vso.VSOClient.latest`` have been deprecated as we strongly recommend people use `sunpy.net.Fido` for all queries. (`#2866 `__) - The deprecated ``sunpy.physics.transforms`` module has been removed, it is replaced by ``sunpy.physics.solar_rotation`` and `sunpy.physics.differential_rotation`. (`#2994 `__) - Removed ``sunpy.sun.sun.solar_cycle_number`` because it was fundamentally flawed (`#3150 `__) Features -------- - Change arguments to ``sunpy.test`` from ``offline=`` and ``online=`` to ``online`` and ``online_only``. This matches the behavior of the figure keyword arguments and comes as a part of a move to using a modified version of the Astropy test runner. (`#1983 `__) - asdf schemas and tags were added for the SunPy coordinate frames and `~sunpy.map.GenericMap` allowing these objects to be saved to and restored from `asdf `__ files. (`#2366 `__) - The images from image tests are now saved in a local folder for easy access. (`#2507 `__) - ``sunpy.map.MapCube`` has been renamed to `sunpy.map.MapSequence` to better reflect its use as a collection of map objects. (`#2603 `__) - Net search attributes now support tab completion of values and display a table of possible values when printed, to allow easier discoverability of possible search values. (`#2663 `__) - Running the figure tests now creates a page showing the differences between the expected figures and the figures produced from running the tests. (`#2681 `__) - Add support for Dask arrays in `sunpy.map.Map`. The map factory now checks a whitelist of array types rather than strictly checking if the array is of type `numpy.ndarray`. (`#2689 `__) - Persist the name of a coordinate, i.e. "earth" even though a concrete coordinate object has been calculated and use this string representation to change the way the sunpy frames are printed. This is primarily to facilitate displaying the name of the body rather than the concrete coordinate when printing a `~astropy.coordinates.SkyCoord`. (`#2723 `__) - `~sunpy.net.hek.HEKClient.search` now returns an `astropy.table.Table` instead of list of a `dict`. (`#2759 `__) - Add a downscaled HMI image to the sample data. (`#2782 `__) - Now able to create a `sunpy.map.Map` using an array and a `astropy.wcs.WCS` object. (`#2793 `__) - The download manager for `~sunpy.net.Fido` has been replaced with `parfive `__. This provides advanced progress bars, proper handling of overwriting and the ability to retry failed downloads. (`#2797 `__) - `sunpy.map.GenericMap` can now save out rice compressed FITS files. (`#2826 `__) - Now any SunPyDeprecationWarnings will cause an error when using pytest. (`#2830 `__) - Added full Tox support for SunPy tests, documentation build and figure tests. (`#2839 `__) - Transition the `sunpy.net.vso.VSOClient` from using suds to `zeep `__ as the SOAP library. This is a more actively maintained library, and should provide better support for the VSOs https endpoints. This change should have no effect on the public API of the `sunpy.net.vso.VSOClient`. (`#2866 `__) - Provided access to the Helioviewer header information using `~sunpy.net.helioviewer.HelioviewerClient.get_jp2_header` function. (`#2904 `__) - Add a new WSDL URL and port to support SunPy use of VSO instance at SDAC. (`#2912 `__) - Add support for COSMO K-Coronograph (KCOR) FITS data. (`#2916 `__) - Add logger messaging system based on `~astropy.logger.AstropyLogger`, cleaned up all warnings, removed all print statements. (`#2980 `__) - The function ``sunpy.image.coalignment.get_correlation_shifts`` now issues an error when the number of dimensions are not correct instead of a warning and returning None. (`#2980 `__) - The default location of the sunpy sample data has changed to be in the platform specific data directory as provided by `appdirs `__. (`#2993 `__) - Add timeseries support for EVE/ESP level 1 data in `sunpy.timeseries.sources` (`#3032 `__) - The default style for Map plots have changed to reflect the changes in Astropy 3.2. (`#3054 `__) - `sunpy.coordinates.ephemeris.get_body_heliographic_stonyhurst` can now account for light travel time when computing the (apparent) body position, as long as the observer location is provided. (`#3055 `__) - Added a helper function (:func:`sunpy.map.header_helper.make_fitswcs_header`) that allows users to create a meta header for custom created `sunpy.map.GenericMap`. (`#3083 `__) - Map plotting now accepts the optional keyword ``clip_interval`` for specifying a percentile interval for clipping. For example, if the interval (5%, 99%) is specified, the bounds of the z axis are chosen such that the lowest 5% of pixels and the highest 1% of pixels are excluded. (`#3100 `__) - The new function `~sunpy.coordinates.get_horizons_coord` enables querying JPL HORIZONS for the locations of a wide range of solar-system bodies, including spacecraft. (`#3113 `__) Bug Fixes --------- - Fix the bug that prevented VSO queries for HMI data from downloading file without specifying ``a.Physobs``. (`#2621 `__) - Fix ``sunpy.map.mapcube.MapCube.plot``. The code had not been updated to support the changes to the wcsaxes helper functions. (`#2627 `__) - Replace all use of the deprecated ``sunpy.cm.get_cmap`` with `matplotlib.cm.get_cmap` to prevent deprecation warnings being raised. (`#2635 `__) - Fix generation of the coordinate transformation graph with Astropy 3.1.dev (`#2636 `__) - Prevent helioviewer from erroring when downloading file to a directory that does not exist. It will now create the directory when required. (`#2642 `__) - Fix transformations into/out of Heliographic Stonyhurst frame when the coordinate representation is Cartesian. (`#2646 `__) - Running the figure tests with ``setup.py test`` now saves the figures and the hashes to the same directory as setup.py. (`#2658 `__) - ``sunpy.instr.fermi.met_to_utc`` now returns the correct utc time which takes into account the leap seconds that have passed. (`#2679 `__) - Support passing Python file objects to ``sunpy.io.fits.write``. (`#2688 `__) - Added DRMS to setup.py so sunpy[all] installs it as a dependency. (`#2693 `__) - Fix eve 0cs timeseries separator regex to support Python 3.7 (`#2697 `__) - Fix the bug which crashes `~sunpy.map.sources.LASCOMap` for when 'date-obs' is reformatted again from a self applied function. (`#2700 `__) - Change all instances of quantity_allclose to `astropy.units.allclose` this prevents pytest being needed to import `sunpy.coordinates` on Astropy 3 (`#2701 `__) - Fix RHESSI obssum file downloading to include the final day in the time range. (`#2714 `__) - Raise an error when transforming between HPC and HCC frames if the observer is not the same. (`#2725 `__) - Replaces the existing LASCO C2 and C3 color maps with new ones that perform better with JP2 and Level 0.5, 1 data. (`#2731 `__) - Do not attempt to save a FITS header comment for a keyword which is not in the header. This prevents an error on saving some maps after the metadata had been modified but not the comments. (`#2748 `__) - Add support for `~sunpy.map.sources.HMIMap` objects as input to ``sunpy.instr.aia.aiaprep``. (`#2749 `__) - User can convert between HPC and HCC coordinates with different observers. This is implemented by automatically transforming the coordinate into HGS and then changing observer, and then transforming back to HCC. (`#2754 `__) - Changed default file type for Helioviewer to prevent decode errors. (`#2771 `__) - Increase figure size to avoid cutting off longer colormap names in ``sunpy.cm.show_colormaps``. (`#2824 `__) - The sample data directory will no longer be created until files are downloaded to it. (`#2836 `__) - Timeseries and lightcurve will now respect updated config values for download directory. (`#2844 `__) - Always use _default_wrap_angle rather than hard coding a wrap angle in the init of a sunpy coordinate frame (`#2853 `__) - Ensure imageanimators only slice arrays with integers (`#2856 `__) - Fixed ``sunpy.io.fits.write`` to handle the keyword ``COMMENT`` correctly. (`#2880 `__) - If Carrington longitude ("crln_obs") is found in the FITS header, `~sunpy.map.Map` converts this to the correct Heliographic longitude. (`#2946 `__) - ``sunpy.net.helio.hec.HECClient.time_query`` now resolves the correct input time format. (`#2969 `__) - Fixes the calculation of the solar rotation of coordinates and the differential rotation of `sunpy.map.GenericMap`. (`#2972 `__) - Added back the FERMI GBM client to `sunpy.net.dataretriever`. (`#2983 `__) - Fix bug in `sunpy.net.hek` which raised and error if a search returned zero results, now returns an empty `sunpy.net.hek.HEKTable`. (`#3046 `__) - `~sunpy.map.sources.AIAMap` now uses the provided HAE coordinates instead of the provided HGS coordinates to determine the observer location. (`#3056 `__) - Correctly zero pad milliseconds in the ``sunpy.util.scraper.Scraper`` formatting to prevent errors when the millisecond value was less than 100. (`#3063 `__) - Fix ``sunpy.util.scraper.Scraper`` failing if a directory is not found on a remote server. (`#3063 `__) - Correctly extract observer location from MDI and EIT data (`#3067 `__) - Fix HGS <> HCRS test due to Ecliptic frame changes in astropy 3.2 (`#3075 `__) - Fixes bug when creating a timeseries from a URL and bug when creating a TimeSeries from older GOES/XRS fits files. (`#3081 `__) - Added `~sunpy.map.sources.EUVIMap.rsun_obs`. It returns a quantity in arcsec consistent with other `sunpy.map.GenericMap` and overwrites mapbase's assumption of a photospheric limb as seen from Earth. (`#3099 `__) - Fixed bugs related to using `~sunpy.map.GenericMap.plot` and `~sunpy.map.GenericMap.peek` with the ``inline`` Matplotlib backend in Jupyter notebook. (`#3103 `__) - Make a correction to `sunpy.coordinates.wcs_utils.solar_wcs_frame_mapping` so that `astropy.wcs.WCS` objects are correctly converted to `sunpy.coordinates.frames` objects irrespective of the ordering of the axes. (`#3116 `__) - The `~sunpy.physics.differential_rotation.solar_rotate_coordinate` function returns a coordinate that accounts for the location of the new observer. (`#3123 `__) - Add support for rotation parameters to :func:`sunpy.map.header_helper.make_fitswcs_header`. (`#3139 `__) - Improve the implementation of `~sunpy.physics.differential_rotation.differential_rotate` the image warping when transforming Maps for differential rotation and change in observer position. (`#3149 `__) - Fix a bug where new helioviewer sources potentially cause `~sunpy.net.helioviewer.HelioviewerClient.data_sources` to error. (`#3162 `__) Improved Documentation ---------------------- - Organise the gallery into sections based on example type and tidy up a little. (`#2624 `__) - Added gallery example showing the conversion of Helioprojective Coordinates to Altitude/Azimuth Coordinates to and back. (`#2656 `__) - Add contribution guidelines for the sunpy example gallery. (`#2682 `__) - Added a gallery example for "Downloading and plotting a HMI image" and "Creating a Composite map". (`#2746 `__) - Added an example for ``sunpy.visualization.animator.ImageAnimatorWCS``. (`#2752 `__) - Minor changes to the developer guide regarding sprint labels. (`#2765 `__) - Copyedited and corrected the solar cycles example. (`#2770 `__) - Changed "online" mark to "remote_data" and made formatting of marks consistent. (`#2799 `__) - Add a missing plot to the end of the units and coordinates guide. (`#2813 `__) - Added gallery example showing how to access the SunPy colormaps (`#2865 `__) - Added gallery example showing how to access the SunPy solar physics constants. (`#2882 `__) - Major clean up of the developer documentation. (`#2951 `__) - Overhaul of the install instructions for the guide section of our documentation. (`#3147 `__) Trivial/Internal Changes ------------------------ - `~sunpy.time.parse_time` now uses `~functools.singledispatch` underneath. (`#2408 `__) - Revert the handling of ``quantity_allclose`` now that `astropy/astropy#7252 `__ is merged. This also bumps the minimum astropy version to 3.0.2. (`#2598 `__) - Replace the subclasses of matplotlib Slider and Button in `sunpy.visualization` with partial functions. (`#2613 `__) - Sort the ana C source files before building to enable reproducible builds. (`#2637 `__) - We are now using `towncrier `__ to generate our changelogs. (`#2644 `__) - Moved figure tests to Python 3.6. (`#2655 `__) - Removed old metaclass used for Map and TimeSeries as we have now moved to Python 3.6. (`#2655 `__) - Updated astropy_helpers to v3.0.2. (`#2655 `__) - When running image tests, a comparison HTML page is now generated to show the generated images and expected images. (`#2660 `__) - Change to using pytest-cov for coverage report generation to enable support for parallel builds (`#2667 `__) - Use of `textwrap` to keep source code indented when multiline texts is used (`#2671 `__) - Fix misspelling of private attribute ``_default_heliographic_latitude`` in map. (`#2730 `__) - Miscellaneous fixes to developer docs about building sunpy's documentation. (`#2825 `__) - Changed ``sunpy.instr.aia.aiaprep`` to update BITPIX keyword to reflect the float64 dtype. (`#2831 `__) - Remove warning from ``GenericMap.submap`` when using pixel ``Quantities`` as input. (`#2833 `__) - Remove the usage of six and all ``__future__`` imports (`#2837 `__) - Fix SunPy Coordinate tests with Astropy 3.1 (`#2838 `__) - Stores entries from directories into database sorted by name. It adds mocks to the database user guide examples. (`#2873 `__) - Fix all DeprecationWarning: invalid escape sequence. (`#2885 `__) - Used `unittest.mock` for creating offline tests for simulating online tests for :file:`test_noaa.py` (`#2900 `__) - Fix support for pip 19 and isolated builds (`#2915 `__) - Moved to using `AppDirs `__ as the place to host our configuration file. (`#2922 `__) - Users can now use fewer keywords in our `~sunpy.net.helioviewer.HelioviewerClient` to access the available sources. Either by ``observatory`` and ``measurement`` or ``instrument`` and ``measurement`` as this much information is enough to get the source ID for most of the cases. (`#2926 `__) - Remove the pytest dependency on the ``GenericMap`` asdf tag. (`#2943 `__) - Fix initialization of `~sunpy.net.vso.VSOClient` when no WSDL link is found. (`#2981 `__) 0.9.0 ===== New Features ------------ - Added TimeUTime class to support utime. [#2409] - Example for fine-grained use of ticks and grids [#2435] - Maintiners Workflow Guide [#2411] - Decorator to append and/or prepend doc strings [#2386] - Adding ``python setup.py test --figure-only`` [#2557] - Fido.fetch now accepts pathlib.Path objects for path attribute.[#2559] - The `~sunpy.coordinates.HeliographicStonyhurst` coordinate system can now be specified using a cartesian system, which is sometimes known as the "Heliocentric Earth equatorial" (HEEQ) coordinate system. [#2437] API Changes ----------- - ``sunpy.coordinates.representation`` has been removed. Longitude wrapping is now done in the constructor of the frames. [#2431] - Propagation of ``obstime`` in the coordinate frame transformation has changed, this means in general when transforming directly between frames (not `~astropy.coordinates.SkyCoord`) you will have to specify ``obstime`` in more places. [#2461] - Transforming between Heliographic Stonyhurst and Carrington now requires that ``obstime`` be defined and the same on both the input and output frames. [#2461] - Removed the figure return from .peek() [#2487] Bug Fixes --------- - Improve TimeSeriesBase docstring [#2399] - Validate that pytest-doctestplus is installed [#2388] - Fix use of self.wcs in plot in mapbase [#2398] - Updated docstring with pointer to access EVE data for other levels [#2402] - Fix broken links and redirections in documentation [#2403] - Fixes Documentation changes due to NumPy 1.14 [#2404] - Added docstrings to functions in download.py [#2415] - Clean up database doc [#2414] - rhessi.py now uses sunpy.io instead of astropy.io [#2416] - Remove Gamma usage in Map [#2424] - Changed requirements to python-dateutil [#2426] - Clarify coordinate system definitions [#2429] - Improve Map Peek when using draw_grid [#2442] - Add HCC --> HGS test [#2443] - Testing the transformation linking SunPy and Astropy against published values [#2454] - Fixed title bug in sunpy.timeseries.rhessi [#2477] - Allow LineAnimator to accept a varying x-axis [#2491] - Indexing Bug Fix to LineAnimator [#2560] - Output sphinx warnings to stdout [#2553] - Docstring improvement for LineAnimator [#2514] - move the egg_info builds to circleci [#2512] - Added tests for TraceMap [#2504] - Fix HGS frame constructor and HPC ``calculate_distance`` with SkyCoord constructor. [#2463] - removed ``wavelnth`` keyword in meta desc of Maps to avoid using non standard FITS keyword like ``nan`` [#2456] - The documentation build now uses the Sphinx configuration from sphinx-astropy rather than from astropy-helpers.[#2494] - Migrate to hypothesis.strategies.datetimes [#2368] - Prevent a deprecation warning due to truth values of Quantity [#2358] - Print a warning when heliographic longitude is set to it's default value of 0 [#2480] - parse_time now parses numpy.datetime64 correctly. [#2572] 0.8.5 ===== Bug Fixes --------- - Removed AstropyDeprecationWarning from sunpy.coordinates.representation [#2476] - Fix for NorthOffsetFrame under Astropy 3.0 [#2486] - Fix lightcurve tests under numpy dev [#2505] - Updated depecration link of radiospectra [#2481] - Fixed Padding values in some of the documentation pages [#2497] - Move documentation build to circleci [#2509] - Fix Issue #2470 hgs_to_hcc(heliogcoord, heliocframe) [#2502] - Fixing CompositeMap object so that it respects masked maps [#2492] 0.8.4 ===== Bug Fixes --------- - Improve detection of ``SkyCoord`` frame instantiation when distance is ``1*u.one``. This fixes a plotting bug with ``WCSAxes`` in Astropy 3.0 [#2465] - removed ``wavelnth`` keyword in meta desc of Maps to avoid using non standard FITS keyword like ``nan`` [#2427] - Change the default units for HPC distance from ``u.km`` to `None`. [#2465] 0.8.3 ===== Bug Fixes --------- - `~sunpy.net.dataretriever.XRSClient` now reports time ranges of files correctly. [#2364] - Make parse_time work with datetime64s and pandas series [#2370] - CompositeMap axes scaling now uses map spatial units [#2310] - Moved license file to root of repository and updated README file [#2326] - Fix docstring formatting for net.vso.attrs [#2309]] - Fix coloring of ticks under matplotlib 2.0 default style [#2320] - Always index arrays with tuples in ``ImageAnimator`` [#2320] - Added links to possible attrs for FIDO in guide [#2317] [#2289] - Updated GitHub Readme [#2281] [#2283] - Fix matplotlib / pandas 0.21 bug in examples [#2336] - Fixes the off limb enhancement example [#2329] - Changes to masking hot pixels and picking bright pixels examples [#2325] [#2319] - Travis CI fix for numpy-dev build [#2340] - Updated masking brightest pixel example [#2338] - Changed TRAVIS cronjobs [#2338] - Support array values for ``obstime`` for coordinates and transformations [#2342] [#2346] - Updated Gallery off limb enhance example [#2337] - Documentation fixes for VSO [#2354] [#2353] - All tests within the documentation have been fixed [#2343] - Change to using pytest-remotedata for our online tests [#2345] - Fixed upstream astropy/numpy documentation issues [#2359] - Documentation for Map improved [#2361] - Fix the output units of pixel_to_world [#2362] - Documentation for Database improved [#2355] - Added test for mapsave [#2365] - Documentation for Sun improved [#2369] 0.8.2 ===== Bug Fixes --------- - Shows a warning if observation time is missing [#2293] - Updates MapCube to access the correct properties of the namedtuple SpatialPair [#2297] 0.8.1 ====== Bug fixes --------- - Fixed TimeSeries test failures due to missing test files [#2273] - Refactored a GOES test to avoid a Py3.6 issue [#2276] 0.8.0 ====== New Features ------------ - Solar differential rotation for maps and submaps included. - Solar rotation calculation and mapcube derotation now use sunpy coordinates. - Sample data now downloads automatically on import if not available and is now pluggable so can be used by affiliated packages. Shortcut names have been normalized and all LIGHTCURVE shortcuts have changed to TIMESERIES. - Calculation of points on an arc of a great circle connecting two points on the Sun. - Removed ``extract_time`` function from ``sunpy.time`` and also tests related to the function from ``sunpy.time.tests`` - User can now pass a custom time format as an argument inside ``sunpy.database.add_from_dir()`` in case the ``date-obs`` metadata cannot be read automatically from the files. - Add time format used by some SDO HMI FITS keywords - Now the ``sunpy.database.tables.display_entries()`` prints an astropy table. - Additional methods added inside the ``sunpy.database`` class to make it easier to display the database contents. - Remove unused ``sunpy.visualization.plotting`` module - Port the pyana wrapper to Python 3 - ``Map.peek(basic_plot-True)`` no longer issues warnings - Remove the ``sunpy.map.nddata_compat`` module, this makes ``Map.data`` and ``Map.meta`` read only. - Add a ``NorthOffsetFrame`` class for generating HGS-like coordinate systems with a shifted north pole. - Remove deprecated ``VSOClient.show`` method. - Deprecate ``sunpy.wcs``: ``sunpy.coordinates`` and ``sunpy.map`` now provide all that functionality in a more robust manner. - Added hdu index in ``sunpy.database.tables.DatabaseEntry`` as a column in the table. - Removed ``HelioviewerClient`` from the ``sunpy.net`` namespace. It should now be imported with ``from sunpy.net.helioviewer import HelioviewerClient``. - Removed compatibility with standalone ``wcsaxes`` and instead depend on the version in astropy 1.3. SunPy now therefore depends on astropy>-1.3. - Update to ``TimeRange.__repr__``; now includes the qualified name and ``id`` of the object. - A new ``sunpy.visualization.imageanimator.LineAnimator`` class has been added to animate 1D data. This has resulted in API change for the ``sunpy.visualization.imageanimator.ImageAnimator`` class. The updateimage method has been renamed to update\_plot. - Drop support for Python 3.4. - SunPy now requires WCSAxes and Map.draw\_grid only works with WCSAxes. - ``Helioprojective`` and ``HelioCentric`` frames now have an ``observer`` attribute which itself is a coordinate object (``SkyCoord``) instead of ``B0``, ``L0`` and ``D0`` to describe the position of the observer. - ``GenericMap.draw_grid`` now uses ``WCSAxes``, it will only work on a ``WCSAxes`` plot, this may be less performant than the previous implementation. - ``GenericMap.world_to_pixel`` and ``GenericMap.pixel_to_world`` now accept and return ``SkyCoord`` objects only. - ``GenericMap`` has a new property ``observer_coordinate`` which returns a ``SkyCoord`` describing the position of the observer. - ``GenericMap.submap`` now takes arguments of the form ``bottom_left`` and ``top_right`` rather than ``range_a`` and ``range_b``. This change enables submap to properly handle rotated maps and take input in the form of ``SkyCoord`` objects. - When referring to physical coordinates ``Pair.x`` has been replaced with ``SpatialPair.axis1``. This means values returned by ``GenericMap`` now differentiate between physical and pixel coordinates. - The physical radius of the Sun (length units) is now passed from Map into the coordinate frame so a consistent value is used when calculating distance to the solar surface in the ``HelioprojectiveFrame`` coordinate frame. - A new ``sunpy.visualization.imageanimator.ImageAnimatorWCS`` class has been added to animate N-Dimensional data with the associated WCS object. - Moved Docs to docs/ to follow the astropy style - Added SunPy specific warnings under util. - SunPy coordinate frames can now be transformed to and from Astropy coordinate frames - The time attribute for SunPy coordinate frames has been renamed from ``dateobs`` to ``obstime`` - Ephemeris calculations with higher accuracy are now available under ``sunpy.coordinates.ephemeris`` - Add support for SunPy coordinates to specify observer as a string of a major solar-system body, with the default being Earth. To make transformations using an observer specified as a string, ``obstime`` must be set. - Added VSO query result block level caching in the database module. This prevents re-downloading of files which have already been downloaded. Especially helpful in case of overlapping queries. - Change the default representation for the Heliographic Carrington frame so Longitude follows the convention of going from 0-360 degrees. - All Clients that are able to search and download data now have a uniform API that is ``search`` and ``fetch``. The older functions are still there but are deprecated for 0.8. Bug fixes --------- - Add tests for RHESSI instrument - Maps from Helioviewer JPEG2000 files now have correct image scaling. - Get and set methods for composite maps now use Map plot\_settings. - Simplified map names when plotting. - Fix bug in ``wcs.convert_data_to_pixel`` where crpix[1] was used for both axes. - Fix some leftover instances of ``GenericMap.units`` - Fixed bugs in ``sun`` equations - ``sunpy.io.fits.read`` will now return any parse-able HDUs even if some raise an error. - ``VSOClient`` no longer prints a lot of XML junk if the query fails. - Fix Map parsing of some header values to allow valid float strings like 'nan' and 'inf'. - Fix Map parsing of some header values to allow valid float strings like 'nan' and 'inf'. 0.7.8 ===== - The SunPy data directory "~/sunpy" is no longer created until it is used (issue #2018) - Change the default representation for the Heliographic Carrington frame so Longitude follows the convention of going from 0-360 degrees. - Fix for surface gravity unit. - Support for Pandas 0.20.1 0.7.7 ===== - Fix errors with Numpy 1.12 0.7.6 ===== - Add Astropy 1.3 Support 0.7.5 ===== - Fix test failure (mapbase) with 1.7.4 - Restrict supported Astropy version to 1.0-1.3. - Update to ``TimeRange.__repr__``; now includes the qualified name and ``id`` of the object. - Change the default representation for the Heliographic Carrington frame so Longitude follows the convention of going from 0-360 degrees. - Fix Map parsing of some header values to allow valid float strings like 'nan' and 'inf'. 0.7.0 ===== - Fixed test failures with numpy developer version.[#1808] - Added ``timeout`` parameter in ``sunpy.data.download_sample_data()`` - Fixed ``aiaprep`` to return properly sized map. - Deprecation warnings fixed when using image coalignment. - Sunpy is now Python 3.x compatible (3.4 and 3.5). - Added a unit check and warnings for map metadata. - Added IRIS SJI color maps. - Updated ``show_colormaps()`` with new string filter to show a subset of color maps. - Fixed MapCube animations by working around a bug in Astropy's ImageNormalize - Remove ``vso.QueryResponse.num_records()`` in favour of ``len(qr)`` - Add a ``draw_rectangle`` helper to ``GenericMap`` which can plot rectangles in the native coordinate system of the map. - Added the ability to shift maps to correct for incorrect map location, for example. - Bug fix for RHESSI summary light curve values. - Mapcube solar derotation and coalignment now pass keywords to the routine used to shift the images, scipy.ndimage.interpolation.shift. - Add automatic registration of ``GenericMap`` subclasses with the factory as long as they define an ``is_datasource_for`` method. - Added functions ``flareclass_to_flux`` and ``flux_to_flareclass`` which convert between GOES flux to GOES class numbers (e.g. X12, M3.4). - Removed old ``sunpy.util.goes_flare_class()`` - Bug fix for RHESSI summary light curve values. - The ``MapCube.as_array`` function now returns a masked numpy array if at least one of the input maps in the MapCube has a mask. - Map superpixel method now respects maps that have masks. - Map superpixel method now accepts numpy functions as an argument, or any user-defined function. - Map superpixel method no longer has the restriction that the number of original pixels in the x (or y) side of the superpixel exactly divides the number of original pixels in the x (or y) side of the original map data. - ``sunpy.physics.transforms`` has been deprecated and the code moved into ``sunpy.physics``. - Add the ``sunpy.coordinates`` module, this adds the core physical solar coordinates frame within the astropy coordinates framework. - Added ability of maps to draw contours on top of themselves (``draw_contours``) - Added concatenate functionality to lightcurve base class. - Fix Map to allow astropy.io.fits Header objects as valid input for meta arguments. - Added an examples gallery using ``sphinx-gallery``. - API clean up to constants. Removed constant() function which is now replaced by get(). - Prevent helioviewer tests from checking access to the API endpoint when running tests offline. - ``GenericMap.units`` is renamed to ``GenericMap.spatial_units`` to avoid confusion with ``NDData.unit``. - ``GenericMap`` now has a ``coordinate_frame`` property which returns an ``astropy.coordinates`` frame with all the meta data from the map populated. - ``GenericMap`` now has a ``_mpl_axes`` method which allows it to be specified as a projection to ``matplotlib`` methods and will return a ``WCSAxes`` object with ``WCS`` projection. 0.6.5 ===== - The draw\_grid keyword of the peek method of Map now accepts booleans or astropy quantities. - Fix bug in ``wcs.convert_data_to_pixel`` where crpix[1] was used for both axes. - Fixed bugs in ``sun`` equations 0.6.4 ===== - Bug fix for rhessi summary lightcurve values. - Fix docstring for ``pixel_to_data`` and ``data_to_pixel``. - Fix the URL for the Helioviewer API. (This fixes Helioviewer.) - Fix the way ``reshape_image_to_4d_superpixel`` checks the dimension of the new image. - Fix Map to allow astropy.io.fits Header objects as valid input for meta arguments. - Prevent helioviewer tests from checking access to API when running tests in offline mode. 0.6.3 ===== - Change setup.py extras to install suds-jurko not suds. 0.6.2 ===== - Changed start of GOES 2 operational time range back to 1980-01-04 so data from 1980 can be read into GOESLightCurve object - Fix bug with numpy 1.10 - update astropy\_helpers - Added new sample data 0.6.1 ===== - Fixed MapCube animations by working around a bug in Astropy's ImageNormalize - Small fix to RTD builds for Affiliated packages - SunPy can now be installed without having to install Astropy first. - MapCubes processed with ``coalignment.apply_shifts`` now have correct metadata. - Multiple fixes for WCS transformations, especially with solar-x, solar-y CTYPE headers. 0.6.0 ===== - Enforced the use of Astropy Quantities through out most of SunPy. - Dropped Support for Python 2.6. - Remove old style string formatting and other 2.6 compatibility lines. - Added vso like querying feature to JSOC Client. - Refactor the JSOC client so that it follows the .query() .get() interface of VSOClient and UnifedDownloader. - Provide ``__str__`` and ``__repr__`` methods on vso ``QueryResponse`` deprecate ``.show()``. - Downloaded files now keep file extensions rather than replacing all periods with underscores. - Update to TimeRange API, removed t1 and t0, start and end are now read-only attributes. - Added ability to download level3 data for lyra Light Curve along with corresponding tests. - Added support for gzipped FITS files. - Add STEREO HI Map subclass and color maps. - Map.rotate() no longer crops any image data. - For accuracy, default Map.rotate() transformation is set to bi-quartic. - ``sunpy.image.transform.affine_transform`` now casts integer data to float64 and sets NaN values to 0 for all transformations except scikit-image rotation with order <- 3. - CD matrix now updated, if present, when Map pixel size is changed. - Removed now-redundant method for rotating IRIS maps since the functionality exists in Map.rotate() - Provide ``__str__`` and ``__repr__`` methods on vso ``QueryResponse`` deprecate ``.show()`` - SunPy colormaps are now registered with matplotlib on import of ``sunpy.cm`` - ``sunpy.cm.get_cmap`` no longer defaults to 'sdoaia94' - Added database url config setting to be setup by default as a sqlite database in the sunpy working directory - Added a few tests for the sunpy.roi module - Added capability for figure-based tests - Removed now-redundant method for rotating IRIS maps since the functionality exists in Map.rotate(). - SunPy colormaps are now registered with matplotlib on import of ``sunpy.cm``. - ``sunpy.cm.get_cmap`` no longer defaults to 'sdoaia94'. - Added database url config setting to be setup by default as a sqlite database in the sunpy working directory. - Added a few tests for the sunpy.roi module. - Refactored mapcube co-alignment functionality. - Removed sample data from distribution and added ability to download sample files - Changed start of GOES 2 operational time range back to 1980-01-04 so data from 1980 can be read into GOESLightCurve object - Require JSOC request data calls have an email address attached. - Calculation of the solar rotation of a point on the Sun as seen from Earth, and its application to the de-rotation of mapcubes. - Downloaded files now keep file extensions rather than replacing all periods with underscores - Fixed the downloading of files with duplicate names in sunpy.database - Removed sample data from distribution and added ability to download sample files. - Added the calculation of the solar rotation of a point on the Sun as seen from Earth, and its application to the de-rotation of mapcubes. - Changed default for GOESLightCurve.create() so that it gets the data from the most recent existing GOES fits file. - Map plot functionality now uses the mask property if it is present, allowing the plotting of masked map data - Map Expects Quantities and returns quantities for most parameters. - Map now used Astropy.wcs for world <-> pixel conversions. - map.world\_to\_pixel now has a similar API to map.pixel\_to\_world. - map.shape has been replaced with map.dimensions, which is ordered x first. - map.rsun\_arcseconds is now map.rsun\_obs as it returns a quantity. - Map properties are now named tuples rather than dictionaries. - Improvement for Map plots, standardization and improved color tables, better access to plot variables through new plot\_settings variable. - Huge improvements in Instrument Map doc strings. Now contain instrument descriptions as well as reference links for more info. - net.jsoc can query data series with time sampling by a Sample attribute implemented in vso. - MapCube.plot and MapCube.peek now support a user defined plot\_function argument for customising the animation. - Added new sample data file, an AIA cutout file. - Moved documentation build directory to doc/build 0.5.5 ===== - Changed default for GOESLightCurve.create() so that it gets the data from the most recent existing GOES fits file. - Improvements to the Map documentation. - Typo fixes in sunpy.wcs documentation. 0.5.4 ===== - ``sunpy.image.transform.affine_transform`` now casts integer data to float64 and sets NaN values to 0 for all transformations except scikit-image rotation with order <- 3. - Updated SWPC/NOAA links due to their new website. - Exposed the raw AIA color tables in ``sunpy.cm.color_tables``. - Fixes ``map`` compatibility with Astropy 1.0.x. 0.5.3 ===== - Goes peek() plot now works with matplotlib 1.4.x - The ANA file reading C extensions will no longer compile under windows. Windows was not a supported platform for these C extensions previously. 0.5.2 ===== - If no CROTA keyword is specified in Map meta data, it will now default to 0 as specified by the FITS WCS standard. - Map now correctly parses and converts the CD matrix, as long as CDELT is specified as well. (Fixes SWAP files) - Fix of HELIO webservice URLs - MapCube.plot() is now fixed and returns a matplotlib.animation.FuncAnimation object. 0.5.1 ===== - MAJOR FIX: map.rotate() now works correctly for all submaps and off center rotations. - HELIO URL updated, queries should now work as expected. - All tabs removed from the code base. - All tests now use tempfile rather than creating files in the current directory. - Documentation builds under newer sphinx versions. - ANA and JP2 tests are skipped if dependencies are missing. - ANA tests are skipped on windows. 0.5.0 ===== - Added additional functionality to the GOES module i.e. the ability to calculate GOES temperature and emission measure from GOES fluxes. - changed \_maps attribute in MapCube to a non-hidden type - Added Nobeyama Radioheliograph data support to Lightcurve object. - Fixed some tests on map method to support Windows - Added a window/split method to time range - Updates to spectrogram documentation - Added method Database.add\_from\_hek\_query\_result to HEK database - Added method Database.download\_from\_vso\_query\_result - GOES Lightcurve now makes use of a new source of GOES data, provides metadata, and data back to 1981. - Removed sqlalchemy as a requirement for SunPy - Added support for NOAA solar cycle prediction in lightcurves - Some basic tests for GenericLightCurve on types of expected input. - Fix algorithm in sunpy.sun.equation\_of\_center - Added Docstrings to LightCurve methods. - Added tests for classes in sunpy.map.sources. Note that some classes (TRACE, RHESSI) were left out because SunPy is not able to read their FITS files. - Added functions that implement image coalignment with support for MapCubes. - Cleaned up the sunpy namespace, removed .units, /ssw and .sphinx. Also moved .coords .physics.transforms. - Added contains functionality to TimeRange module - Added t-'now' to parse\_time to provide utcnow datetime. - Fixed time dependent functions (.sun) to default to t-'now' - Fixed solar\_semidiameter\_angular\_size - Improved line quality and performances issues with map.draw\_grid() - Remove deprecated make\_map command. 0.4.2 ===== - Fixes to the operational range of GOES satellites - Fix the URL for HELIO queries. 0.4.1 ===== - Fix map.rotate() functionality - Change of source for GOES data. - Fix EIT test data and sunpy FITS saving - Some documentation fixes - fix file paths to use os.path.join for platform independence. 0.4.0 ===== - **Major** documentation refactor. A far reaching re-write and restructure. - Add a SunPy Database to store and search local data. - Add beta support for querying the HELIO HEC - Add beta HEK to VSO query translation. - Add the ability to download the GOES event list. - Add support for downloading and querying the LYTAF database. - Add support for ANA data. - Updated sun.constants to use astropy.constants objects which include units, source, and error instide. For more info check out https://docs.astropy.org/en/latest/constants/index.html - Add some beta support for IRIS data products - Add a new MapCubeAnimator class with interactive widgets which is returned by mapcube.peek(). - The Glymur library is now used to read JPEG2000 files. - GOESLightCurve now supports all satellites. - Add support for VSO queries through proxies. - Fix apparent Right Ascension calculations. - LightCurve meta data member now an OrderedDict Instance 0.3.2 ===== - Pass draw\_limb arguments to patches.Circle - Pass graw\_grid arguments to pyplot.plot() - Fix README code example - Fix Documentation links in potting guide - Update to new EVE data URL - Update LogicalLightcurve example in docs - Improved InteractiveVSOClient documentation - GOESLightCurve now fails politely if no data is available. Known Bugs: - sunpy.util.unit\_conversion.to\_angstrom does not work if 'nm' is passed in. 0.3.1 ===== - Bug Fix: Fix a regression in CompositeMap that made contor plots fail. - Bug Fix: Allow Map() to accept dict as metadata. - Bug Fix: Pass arguments from Map() to io.read\_file. 0.3.0 ===== - Removal of Optional PIL dependency - Parse\_time now looks through nested lists/tuples - Draw\_limb and draw\_grid are now implemented on MapCube and CompositeMap - Calculations for differential rotation added - mapcube.plot() now runs a mpl animation with optional controls - A basic Region of Interest framework now exists under sunpy.roi - STEREO COR colour maps have been ported from solarsoft. - sunpy.time.timerange has a split() method that divides up a time range into n equal parts. - Added download progress bar - pyfits is deprecated in favor of Astropy spectra: - Plotting has been refactorted to use a consistent interface - spectra now no-longer inherits from numpy.ndarray instead has a .data attribute. Map: \* map now no-longer inherits from numpy.ndarray instead has a .data attribute. \* make\_map is deprecated in favor of Map which is a new factory class \* sunpy.map.Map is now sunpy.map.GenericMap \* mymap.header is now mymap.meta \* attributes of the map class are now read only, changes have to be made through map.meta \* new MapMeta class to replace MapHeader, MapMeta is not returned by sunpy.io \* The groundwork for GenericMap inheriting from astropy.NDData has been done, there is now a NDDataStandin class to provide basic functionality. io: \* top level file\_tools improved to be more flexible and support multiple HDUs \* all functions in sunpy.io now assume multiple HDUs, even JP2 ones. \* there is now a way to override the automatic filetype detection \* Automatic fits file detection improved \* extract\_waveunit added to io.fits for detection of common ways of storing wavelength unit in fits files. - A major re-work of all internal imports has resulted in a much cleaner namespace, i.e. sunpy.util.util is no longer used to import util. - Some SOHO and STEREO files were not reading properly due to a date\_obs parameter. - Sunpy will now read JP2 files without a comment parameter. - Memory leak in Crotate patched - Callisto: Max gap between files removed 0.2.0 ===== - Completely re-written plotting routines for most of the core datatypes. - JPEG 2000 support as an input file type. - Improved documentation for much of the code base, including re-written installation instructions. - New lightcurve object - LYRA support - GOES/XRS support - SDO/EVE support - New Spectrum and Spectrogram object (in development) - Spectrogram plotting routines - Callisto spectrum type and support - STEREO/SWAVES support - Map Object - Added support for LASCO, Yohkoh/XRT maps - A new CompositeMap object for overlaying maps - Resample method - Superpixel method - The addition of the rotate() method for 2D maps. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/CITATION.rst0000644000175100001770000001272214550400520014244 0ustar00runnerdocker.. _citing_sunpy: Acknowledging or Citing SunPy ============================= If you use SunPy in your scientific work, we would appreciate citing it in your publications. The continued growth and development of SunPy is dependent on the community being aware of SunPy. Citing SunPy in Publications ---------------------------- Please add the following line within your methods, conclusion or acknowledgements sections: *This research used version X.Y.Z (software citation) of the SunPy open source software package (project citation).* The project citation should be to the `SunPy paper`_, and the software citation should be the specific `Zenodo DOI`_ for the version used in your work. .. code:: bibtex @ARTICLE{sunpy_community2020, doi = {10.3847/1538-4357/ab4f7a}, url = {https://iopscience.iop.org/article/10.3847/1538-4357/ab4f7a}, author = {{The SunPy Community} and Barnes, Will T. and Bobra, Monica G. and Christe, Steven D. and Freij, Nabil and Hayes, Laura A. and Ireland, Jack and Mumford, Stuart and Perez-Suarez, David and Ryan, Daniel F. and Shih, Albert Y. and Chanda, Prateek and Glogowski, Kolja and Hewett, Russell and Hughitt, V. Keith and Hill, Andrew and Hiware, Kaustubh and Inglis, Andrew and Kirk, Michael S. F. and Konge, Sudarshan and Mason, James Paul and Maloney, Shane Anthony and Murray, Sophie A. and Panda, Asish and Park, Jongyeob and Pereira, Tiago M. D. and Reardon, Kevin and Savage, Sabrina and Sipőcz, Brigitta M. and Stansby, David and Jain, Yash and Taylor, Garrison and Yadav, Tannmay and Rajul and Dang, Trung Kien}, title = {The SunPy Project: Open Source Development and Status of the Version 1.0 Core Package}, journal = {The Astrophysical Journal}, volume = {890}, issue = {1}, pages = {68-}, publisher = {American Astronomical Society}, year = {2020} } You can also get this information with ``sunpy.__citation__``. Other SunPy publications ######################## The SunPy v1.0.8 code was reviewed by `The Journal of Open Source Software (JOSS) `__. .. code:: bibtex @ARTICLE{Mumford2020, doi = {10.21105/joss.01832}, url = {https://doi.org/10.21105/joss.01832}, year = {2020}, publisher = {The Open Journal}, volume = {5}, number = {46}, pages = {1832}, author = {Stuart Mumford and Nabil Freij and Steven Christe and Jack Ireland and Florian Mayer and V. Hughitt and Albert Shih and Daniel Ryan and Simon Liedtke and David Pérez-Suárez and Pritish Chakraborty and Vishnunarayan K and Andrew Inglis and Punyaslok Pattnaik and Brigitta Sipőcz and Rishabh Sharma and Andrew Leonard and David Stansby and Russell Hewett and Alex Hamilton and Laura Hayes and Asish Panda and Matt Earnshaw and Nitin Choudhary and Ankit Kumar and Prateek Chanda and Md Haque and Michael Kirk and Michael Mueller and Sudarshan Konge and Rajul Srivastava and Yash Jain and Samuel Bennett and Ankit Baruah and Will Barnes and Michael Charlton and Shane Maloney and Nicky Chorley and Himanshu and Sanskar Modi and James Mason and Naman9639 and Jose Rozo and Larry Manley and Agneet Chatterjee and John Evans and Michael Malocha and Monica Bobra and Sourav Ghosh and Airmansmith97 and Dominik Stańczak and Ruben De Visscher and Shresth Verma and Ankit Agrawal and Dumindu Buddhika and Swapnil Sharma and Jongyeob Park and Matt Bates and Dhruv Goel and Garrison Taylor and Goran Cetusic and Jacob and Mateo Inchaurrandieta and Sally Dacie and Sanjeev Dubey and Deepankar Sharma and Erik Bray and Jai Rideout and Serge Zahniy and Tomas Meszaros and Abhigyan Bose and André Chicrala and Ankit and Chloé Guennou and Daniel D'Avella and Daniel Williams and Jordan Ballew and Nick Murphy and Priyank Lodha and Thomas Robitaille and Yash Krishan and Andrew Hill and Arthur Eigenbrot and Benjamin Mampaey and Bernhard Wiedemann and Carlos Molina and Duygu Keşkek and Ishtyaq Habib and Joseph Letts and Juanjo Bazán and Quinn Arbolante and Reid Gomillion and Yash Kothari and Yash Sharma and Abigail Stevens and Adrian Price-Whelan and Ambar Mehrotra and Arseniy Kustov and Brandon Stone and Trung Dang and Emmanuel Arias and Fionnlagh Dover and Freek Verstringe and Gulshan Kumar and Harsh Mathur and Igor Babuschkin and Jaylen Wimbish and Juan Buitrago-Casas and Kalpesh Krishna and Kaustubh Hiware and Manas Mangaonkar and Matthew Mendero and Mickaël Schoentgen and Norbert Gyenge and Ole Streicher and Rajasekhar Mekala and Rishabh Mishra and Shashank Srikanth and Sarthak Jain and Tannmay Yadav and Tessa Wilkinson and Tiago Pereira and Yudhik Agrawal and Jamescalixto and Yasintoda and Sophie Murray}, title = {SunPy: A Python package for Solar Physics}, journal = {Journal of Open Source Software} } A paper about version v0.5 of SunPy was published in `Computational Science & Discovery `__. Acknowledging SunPy in Posters and Talks ---------------------------------------- Please include the `Sunpy logo`_ on the title, conclusion slide, or about page. For websites please link the image to `sunpy.org`_. Other versions of the logo are available in the `sunpy-logo repository`_. .. _SunPy paper: https://doi.org/10.3847/1538-4357/ab4f7a .. _Sunpy logo: https://github.com/sunpy/sunpy-logo/blob/master/sunpy_logo.svg .. _sunpy.org: https://sunpy.org/ .. _sunpy-logo repository: https://github.com/sunpy/sunpy-logo/ .. _Zenodo DOI: https://doi.org/10.5281/zenodo.591887 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/LICENSE.rst0000644000175100001770000000243414550400520014113 0ustar00runnerdockerCopyright (c) 2013-2023 The SunPy developers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/MANIFEST.in0000644000175100001770000000066214550400520014036 0ustar00runnerdockerexclude .codecov.yaml exclude .editorconfig exclude .gitattributes exclude .gitignore exclude .mailmap exclude .pre-commit-config.yaml exclude .readthedocs.yaml exclude .rtd-environment.yml exclude .test_package_pins.txt exclude .zenodo.json exclude asv.conf.json exclude CITATION.cff exclude sunpy-dev-env.yml exclude tox.ini prune .circleci prune .github prune benchmarks prune binder prune changelog prune tools prune sunpy/_dev ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1705116002.0274935 sunpy-5.1.1/PKG-INFO0000644000175100001770000004570414550400542013407 0ustar00runnerdockerMetadata-Version: 2.1 Name: sunpy Version: 5.1.1 Summary: SunPy core package: Python for Solar Physics Home-page: https://sunpy.org Download-URL: https://pypi.org/project/sunpy/ Author: The SunPy Community Author-email: sunpy@googlegroups.com License: BSD 2-Clause Project-URL: Source Code, https://github.com/sunpy/sunpy/ Project-URL: Documentation, https://docs.sunpy.org/ Project-URL: Changelog, https://docs.sunpy.org/en/stable/whatsnew/changelog.html Project-URL: Issue Tracker, https://github.com/sunpy/sunpy/issues Keywords: solar physics,solar,science,sun,wcs,coordinates Platform: any Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Science/Research Classifier: License :: OSI Approved :: BSD License Classifier: Natural Language :: English Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Topic :: Scientific/Engineering :: Physics Provides: sunpy Requires-Python: >=3.9 Description-Content-Type: text/x-rst License-File: LICENSE.rst Requires-Dist: astropy!=5.1.0,>=5.0.6 Requires-Dist: numpy>=1.21.0 Requires-Dist: packaging>=19.0 Requires-Dist: parfive[ftp]>=2.0.0 Provides-Extra: asdf Requires-Dist: asdf-astropy>=0.1.1; extra == "asdf" Requires-Dist: asdf>=2.8.0; extra == "asdf" Provides-Extra: dask Requires-Dist: dask[array]>=2021.4.0; extra == "dask" Provides-Extra: database Requires-Dist: sqlalchemy>=1.3.4; extra == "database" Provides-Extra: image Requires-Dist: scikit-image>=0.18.0; extra == "image" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "image" Provides-Extra: jpeg2000 Requires-Dist: glymur!=0.9.5,>=0.9.1; extra == "jpeg2000" Requires-Dist: lxml!=5.0.0,>=4.8.0; extra == "jpeg2000" Provides-Extra: map Requires-Dist: matplotlib>=3.5.0; extra == "map" Requires-Dist: mpl-animators>=1.0.0; extra == "map" Requires-Dist: reproject; extra == "map" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "map" Provides-Extra: net Requires-Dist: beautifulsoup4>=4.8.0; extra == "net" Requires-Dist: drms<0.7.0,>=0.6.1; extra == "net" Requires-Dist: python-dateutil>=2.8.0; extra == "net" Requires-Dist: tqdm>=4.32.1; extra == "net" Requires-Dist: zeep>=3.4.0; extra == "net" Provides-Extra: spice Requires-Dist: spiceypy; extra == "spice" Provides-Extra: timeseries Requires-Dist: cdflib!=0.4.0,!=1.0.0,>=0.3.20; extra == "timeseries" Requires-Dist: h5netcdf>=0.11; extra == "timeseries" Requires-Dist: h5py>=3.1.0; extra == "timeseries" Requires-Dist: matplotlib>=3.5.0; extra == "timeseries" Requires-Dist: pandas>=1.2.0; extra == "timeseries" Provides-Extra: visualization Requires-Dist: matplotlib>=3.5.0; extra == "visualization" Requires-Dist: mpl-animators>=1.0.0; extra == "visualization" Provides-Extra: all Requires-Dist: asdf-astropy>=0.1.1; extra == "all" Requires-Dist: asdf>=2.8.0; extra == "all" Requires-Dist: dask[array]>=2021.4.0; extra == "all" Requires-Dist: sqlalchemy>=1.3.4; extra == "all" Requires-Dist: scikit-image>=0.18.0; extra == "all" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "all" Requires-Dist: glymur!=0.9.5,>=0.9.1; extra == "all" Requires-Dist: lxml!=5.0.0,>=4.8.0; extra == "all" Requires-Dist: matplotlib>=3.5.0; extra == "all" Requires-Dist: mpl-animators>=1.0.0; extra == "all" Requires-Dist: reproject; extra == "all" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "all" Requires-Dist: beautifulsoup4>=4.8.0; extra == "all" Requires-Dist: drms<0.7.0,>=0.6.1; extra == "all" Requires-Dist: python-dateutil>=2.8.0; extra == "all" Requires-Dist: tqdm>=4.32.1; extra == "all" Requires-Dist: zeep>=3.4.0; extra == "all" Requires-Dist: cdflib!=0.4.0,!=1.0.0,>=0.3.20; extra == "all" Requires-Dist: h5netcdf>=0.11; extra == "all" Requires-Dist: h5py>=3.1.0; extra == "all" Requires-Dist: matplotlib>=3.5.0; extra == "all" Requires-Dist: pandas>=1.2.0; extra == "all" Requires-Dist: matplotlib>=3.5.0; extra == "all" Requires-Dist: mpl-animators>=1.0.0; extra == "all" Provides-Extra: tests Requires-Dist: asdf-astropy>=0.1.1; extra == "tests" Requires-Dist: asdf>=2.8.0; extra == "tests" Requires-Dist: dask[array]>=2021.4.0; extra == "tests" Requires-Dist: sqlalchemy>=1.3.4; extra == "tests" Requires-Dist: scikit-image>=0.18.0; extra == "tests" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "tests" Requires-Dist: glymur!=0.9.5,>=0.9.1; extra == "tests" Requires-Dist: lxml!=5.0.0,>=4.8.0; extra == "tests" Requires-Dist: matplotlib>=3.5.0; extra == "tests" Requires-Dist: mpl-animators>=1.0.0; extra == "tests" Requires-Dist: reproject; extra == "tests" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "tests" Requires-Dist: beautifulsoup4>=4.8.0; extra == "tests" Requires-Dist: drms<0.7.0,>=0.6.1; extra == "tests" Requires-Dist: python-dateutil>=2.8.0; extra == "tests" Requires-Dist: tqdm>=4.32.1; extra == "tests" Requires-Dist: zeep>=3.4.0; extra == "tests" Requires-Dist: cdflib!=0.4.0,!=1.0.0,>=0.3.20; extra == "tests" Requires-Dist: h5netcdf>=0.11; extra == "tests" Requires-Dist: h5py>=3.1.0; extra == "tests" Requires-Dist: matplotlib>=3.5.0; extra == "tests" Requires-Dist: pandas>=1.2.0; extra == "tests" Requires-Dist: matplotlib>=3.5.0; extra == "tests" Requires-Dist: mpl-animators>=1.0.0; extra == "tests" Requires-Dist: hvpy>=1.0.1; extra == "tests" Requires-Dist: hypothesis>=6.0.0; extra == "tests" Requires-Dist: jplephem; extra == "tests" Requires-Dist: opencv-python; extra == "tests" Requires-Dist: pytest-astropy>=0.8; extra == "tests" Requires-Dist: pytest-doctestplus>=0.5; extra == "tests" Requires-Dist: pytest-mock; extra == "tests" Requires-Dist: pytest-mpl>=0.12; extra == "tests" Requires-Dist: pytest-xdist>=2.0; extra == "tests" Requires-Dist: pytest>=6.0; extra == "tests" Requires-Dist: spiceypy; extra == "tests" Provides-Extra: docs Requires-Dist: asdf-astropy>=0.1.1; extra == "docs" Requires-Dist: asdf>=2.8.0; extra == "docs" Requires-Dist: dask[array]>=2021.4.0; extra == "docs" Requires-Dist: sqlalchemy>=1.3.4; extra == "docs" Requires-Dist: scikit-image>=0.18.0; extra == "docs" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "docs" Requires-Dist: glymur!=0.9.5,>=0.9.1; extra == "docs" Requires-Dist: lxml!=5.0.0,>=4.8.0; extra == "docs" Requires-Dist: matplotlib>=3.5.0; extra == "docs" Requires-Dist: mpl-animators>=1.0.0; extra == "docs" Requires-Dist: reproject; extra == "docs" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "docs" Requires-Dist: beautifulsoup4>=4.8.0; extra == "docs" Requires-Dist: drms<0.7.0,>=0.6.1; extra == "docs" Requires-Dist: python-dateutil>=2.8.0; extra == "docs" Requires-Dist: tqdm>=4.32.1; extra == "docs" Requires-Dist: zeep>=3.4.0; extra == "docs" Requires-Dist: cdflib!=0.4.0,!=1.0.0,>=0.3.20; extra == "docs" Requires-Dist: h5netcdf>=0.11; extra == "docs" Requires-Dist: h5py>=3.1.0; extra == "docs" Requires-Dist: matplotlib>=3.5.0; extra == "docs" Requires-Dist: pandas>=1.2.0; extra == "docs" Requires-Dist: matplotlib>=3.5.0; extra == "docs" Requires-Dist: mpl-animators>=1.0.0; extra == "docs" Requires-Dist: hvpy>=1.0.1; extra == "docs" Requires-Dist: packaging; extra == "docs" Requires-Dist: ruamel.yaml; extra == "docs" Requires-Dist: sphinx; extra == "docs" Requires-Dist: sphinx-automodapi; extra == "docs" Requires-Dist: importlib-resources<6; extra == "docs" Requires-Dist: sphinx-changelog; extra == "docs" Requires-Dist: sphinx-copybutton; extra == "docs" Requires-Dist: sphinx-design; extra == "docs" Requires-Dist: sphinx-gallery>=0.13.0; extra == "docs" Requires-Dist: sphinxext-opengraph; extra == "docs" Requires-Dist: spiceypy; extra == "docs" Requires-Dist: sunpy-sphinx-theme>=2.0.0rc1; extra == "docs" Requires-Dist: sphinx-hoverxref; extra == "docs" Provides-Extra: docs-gallery Requires-Dist: astroquery; extra == "docs-gallery" Requires-Dist: jplephem; extra == "docs-gallery" Requires-Dist: mplcairo; extra == "docs-gallery" Requires-Dist: opencv-python; extra == "docs-gallery" Requires-Dist: reproject; extra == "docs-gallery" Provides-Extra: dev Requires-Dist: asdf-astropy>=0.1.1; extra == "dev" Requires-Dist: asdf>=2.8.0; extra == "dev" Requires-Dist: dask[array]>=2021.4.0; extra == "dev" Requires-Dist: sqlalchemy>=1.3.4; extra == "dev" Requires-Dist: scikit-image>=0.18.0; extra == "dev" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "dev" Requires-Dist: glymur!=0.9.5,>=0.9.1; extra == "dev" Requires-Dist: lxml!=5.0.0,>=4.8.0; extra == "dev" Requires-Dist: matplotlib>=3.5.0; extra == "dev" Requires-Dist: mpl-animators>=1.0.0; extra == "dev" Requires-Dist: reproject; extra == "dev" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "dev" Requires-Dist: beautifulsoup4>=4.8.0; extra == "dev" Requires-Dist: drms<0.7.0,>=0.6.1; extra == "dev" Requires-Dist: python-dateutil>=2.8.0; extra == "dev" Requires-Dist: tqdm>=4.32.1; extra == "dev" Requires-Dist: zeep>=3.4.0; extra == "dev" Requires-Dist: cdflib!=0.4.0,!=1.0.0,>=0.3.20; extra == "dev" Requires-Dist: h5netcdf>=0.11; extra == "dev" Requires-Dist: h5py>=3.1.0; extra == "dev" Requires-Dist: matplotlib>=3.5.0; extra == "dev" Requires-Dist: pandas>=1.2.0; extra == "dev" Requires-Dist: matplotlib>=3.5.0; extra == "dev" Requires-Dist: mpl-animators>=1.0.0; extra == "dev" Requires-Dist: asdf-astropy>=0.1.1; extra == "dev" Requires-Dist: asdf>=2.8.0; extra == "dev" Requires-Dist: dask[array]>=2021.4.0; extra == "dev" Requires-Dist: sqlalchemy>=1.3.4; extra == "dev" Requires-Dist: scikit-image>=0.18.0; extra == "dev" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "dev" Requires-Dist: glymur!=0.9.5,>=0.9.1; extra == "dev" Requires-Dist: lxml!=5.0.0,>=4.8.0; extra == "dev" Requires-Dist: matplotlib>=3.5.0; extra == "dev" Requires-Dist: mpl-animators>=1.0.0; extra == "dev" Requires-Dist: reproject; extra == "dev" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "dev" Requires-Dist: beautifulsoup4>=4.8.0; extra == "dev" Requires-Dist: drms<0.7.0,>=0.6.1; extra == "dev" Requires-Dist: python-dateutil>=2.8.0; extra == "dev" Requires-Dist: tqdm>=4.32.1; extra == "dev" Requires-Dist: zeep>=3.4.0; extra == "dev" Requires-Dist: cdflib!=0.4.0,!=1.0.0,>=0.3.20; extra == "dev" Requires-Dist: h5netcdf>=0.11; extra == "dev" Requires-Dist: h5py>=3.1.0; extra == "dev" Requires-Dist: matplotlib>=3.5.0; extra == "dev" Requires-Dist: pandas>=1.2.0; extra == "dev" Requires-Dist: matplotlib>=3.5.0; extra == "dev" Requires-Dist: mpl-animators>=1.0.0; extra == "dev" Requires-Dist: hvpy>=1.0.1; extra == "dev" Requires-Dist: hypothesis>=6.0.0; extra == "dev" Requires-Dist: jplephem; extra == "dev" Requires-Dist: opencv-python; extra == "dev" Requires-Dist: pytest-astropy>=0.8; extra == "dev" Requires-Dist: pytest-doctestplus>=0.5; extra == "dev" Requires-Dist: pytest-mock; extra == "dev" Requires-Dist: pytest-mpl>=0.12; extra == "dev" Requires-Dist: pytest-xdist>=2.0; extra == "dev" Requires-Dist: pytest>=6.0; extra == "dev" Requires-Dist: spiceypy; extra == "dev" Requires-Dist: asdf-astropy>=0.1.1; extra == "dev" Requires-Dist: asdf>=2.8.0; extra == "dev" Requires-Dist: dask[array]>=2021.4.0; extra == "dev" Requires-Dist: sqlalchemy>=1.3.4; extra == "dev" Requires-Dist: scikit-image>=0.18.0; extra == "dev" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "dev" Requires-Dist: glymur!=0.9.5,>=0.9.1; extra == "dev" Requires-Dist: lxml!=5.0.0,>=4.8.0; extra == "dev" Requires-Dist: matplotlib>=3.5.0; extra == "dev" Requires-Dist: mpl-animators>=1.0.0; extra == "dev" Requires-Dist: reproject; extra == "dev" Requires-Dist: scipy!=1.10.0,>=1.7.0; extra == "dev" Requires-Dist: beautifulsoup4>=4.8.0; extra == "dev" Requires-Dist: drms<0.7.0,>=0.6.1; extra == "dev" Requires-Dist: python-dateutil>=2.8.0; extra == "dev" Requires-Dist: tqdm>=4.32.1; extra == "dev" Requires-Dist: zeep>=3.4.0; extra == "dev" Requires-Dist: cdflib!=0.4.0,!=1.0.0,>=0.3.20; extra == "dev" Requires-Dist: h5netcdf>=0.11; extra == "dev" Requires-Dist: h5py>=3.1.0; extra == "dev" Requires-Dist: matplotlib>=3.5.0; extra == "dev" Requires-Dist: pandas>=1.2.0; extra == "dev" Requires-Dist: matplotlib>=3.5.0; extra == "dev" Requires-Dist: mpl-animators>=1.0.0; extra == "dev" Requires-Dist: hvpy>=1.0.1; extra == "dev" Requires-Dist: packaging; extra == "dev" Requires-Dist: ruamel.yaml; extra == "dev" Requires-Dist: sphinx; extra == "dev" Requires-Dist: sphinx-automodapi; extra == "dev" Requires-Dist: importlib-resources<6; extra == "dev" Requires-Dist: sphinx-changelog; extra == "dev" Requires-Dist: sphinx-copybutton; extra == "dev" Requires-Dist: sphinx-design; extra == "dev" Requires-Dist: sphinx-gallery>=0.13.0; extra == "dev" Requires-Dist: sphinxext-opengraph; extra == "dev" Requires-Dist: spiceypy; extra == "dev" Requires-Dist: sunpy-sphinx-theme>=2.0.0rc1; extra == "dev" Requires-Dist: sphinx-hoverxref; extra == "dev" ********* ``sunpy`` ********* |SunPy Logo| +----------------------+----------------------+----------------------+ | Release | Development | Community | +======================+======================+======================+ | |Latest PyPi | |Python Versions| | |Matrix Chat Room| | | Version| | | | +----------------------+----------------------+----------------------+ | |Latest Conda | |Project Status: | |OpenAstronomy | | Version| | Active - The project | Discourse community| | | | has reached a | | | | stable, usable state | | | | and is being | | | | actively developed.| | | +----------------------+----------------------+----------------------+ | |Zenodo - Latest | |Continuous | |Google Groups | | DOI| | Integration Status| | Mailing List| | +----------------------+----------------------+----------------------+ | |sunpy Stable | |CodeCov Code | |Powered by | | Documentation| | Coverage| | NumFOCUS| | +----------------------+----------------------+----------------------+ .. |SunPy Logo| image:: https://raw.githubusercontent.com/sunpy/sunpy-logo/master/sunpy_logo_landscape.svg :width: 200px .. |Latest PyPi Version| image:: https://img.shields.io/pypi/v/sunpy.svg :target: https://pypi.python.org/pypi/sunpy/ .. |Python Versions| image:: https://img.shields.io/pypi/pyversions/sunpy :target: https://pypi.python.org/pypi/sunpy/ .. |Matrix Chat Room| image:: https://img.shields.io/matrix/sunpy:openastronomy.org.svg?colorB=%23FE7900&label=Chat&logo=matrix&server_fqdn=matrix.org :target: https://app.element.io/#/room/#sunpy:openastronomy.org .. |Latest Conda Version| image:: https://anaconda.org/conda-forge/sunpy/badges/version.svg :target: https://anaconda.org/conda-forge/sunpy .. |Project Status: Active - The project has reached a stable, usable state and is being actively developed.| image:: https://www.repostatus.org/badges/latest/active.svg :target: https://www.repostatus.org/#active .. |OpenAstronomy Discourse community| image:: https://cdck-file-uploads-global.s3.dualstack.us-west-2.amazonaws.com/try2/original/1X/5e1e3b3cada2d7fbae4734d4bc53999933d71c95.svg :height: 20px :target: https://community.openastronomy.org/ .. |Zenodo - Latest DOI| image:: https://zenodo.org/badge/2165383.svg :target: https://zenodo.org/badge/latestdoi/2165383 .. |Continuous Integration Status| image:: https://github.com/sunpy/sunpy/actions/workflows/ci.yml/badge.svg?branch=main :target: https://github.com/sunpy/sunpy/actions/workflows/ci.yml .. |Google Groups Mailing List| image:: https://fonts.gstatic.com/s/i/productlogos/groups/v9/web-48dp/logo_groups_color_1x_web_48dp.png :height: 20px :target: https://groups.google.com/g/sunpy .. |sunpy Stable Documentation| image:: https://readthedocs.org/projects/sunpy/badge/?version=stable :target: https://docs.sunpy.org/ .. |CodeCov Code Coverage| image:: https://codecov.io/gh/sunpy/sunpy/branch/main/graph/badge.svg :target: https://codecov.io/gh/sunpy/sunpy .. |Powered by NumFOCUS| image:: https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A :target: https://numfocus.org ``sunpy`` is a Python software package that provides fundamental tools for accessing, loading and interacting with solar physics data in Python. It includes an interface for searching and downloading data from multiple data providers, data containers for image and time series data, commonly used solar coordinate frames and associated transformations, as well as other functionality needed for solar data analysis. Installation ============ We recommended following the `installation guide `__ in the ``sunpy`` documentation. This will walk you through installing ``sunpy`` and all of its dependencies. Usage ===== If you are new to ``sunpy``, the best place to start is the `tutorial `__. the `example gallery `__ also includes a collection of shorter and more specific examples of using ``sunpy``. Changes ======= See our `changelog `__. for the latest changes in ``sunpy``. Getting Help ============ For more information or to ask questions about ``sunpy`` or any other SunPy Project package, please check out: - `sunpy documentation `__ - `SunPy Affiliated Packages `__ - `SunPy Chat`_ - `SunPy mailing list `__ - `SunPy Community forum `__ Acknowledging or Citing ``sunpy`` ================================= If you use ``sunpy`` in your scientific work, we would appreciate your `citing it in your publications `__. The continued growth and development of ``sunpy`` is dependent on the community being aware of ``sunpy``. Contributing ============ The SunPy Project is a community-driven open-source project that welcomes any and all contributions. Whether you are a developer, student, or user, you can help by contributing code, documentation, or community support. If you would like to get involved, the `Newcomers Guide`_ guide explains the many different ways to contribute to the SunPy Project and also shows how to get set up with a development workflow. Help is always welcome, so come and say hello by joining the `SunPy Chat`_ and look over the `Good First Issues list`_ for the ideal places to start. .. _Newcomers Guide: https://docs.sunpy.org/en/latest/dev_guide/contents/newcomers.html .. _Good First Issues list: https://github.com/sunpy/sunpy/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22Good+First+Issue%22 Code of Conduct =============== When you are interacting with the SunPy Community you are asked to follow our `Code of Conduct `__. .. _SunPy Chat: https://app.element.io/#/room/#sunpy:openastronomy.org ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/README.rst0000644000175100001770000001452214550400520013767 0ustar00runnerdocker********* ``sunpy`` ********* |SunPy Logo| +----------------------+----------------------+----------------------+ | Release | Development | Community | +======================+======================+======================+ | |Latest PyPi | |Python Versions| | |Matrix Chat Room| | | Version| | | | +----------------------+----------------------+----------------------+ | |Latest Conda | |Project Status: | |OpenAstronomy | | Version| | Active - The project | Discourse community| | | | has reached a | | | | stable, usable state | | | | and is being | | | | actively developed.| | | +----------------------+----------------------+----------------------+ | |Zenodo - Latest | |Continuous | |Google Groups | | DOI| | Integration Status| | Mailing List| | +----------------------+----------------------+----------------------+ | |sunpy Stable | |CodeCov Code | |Powered by | | Documentation| | Coverage| | NumFOCUS| | +----------------------+----------------------+----------------------+ .. |SunPy Logo| image:: https://raw.githubusercontent.com/sunpy/sunpy-logo/master/sunpy_logo_landscape.svg :width: 200px .. |Latest PyPi Version| image:: https://img.shields.io/pypi/v/sunpy.svg :target: https://pypi.python.org/pypi/sunpy/ .. |Python Versions| image:: https://img.shields.io/pypi/pyversions/sunpy :target: https://pypi.python.org/pypi/sunpy/ .. |Matrix Chat Room| image:: https://img.shields.io/matrix/sunpy:openastronomy.org.svg?colorB=%23FE7900&label=Chat&logo=matrix&server_fqdn=matrix.org :target: https://app.element.io/#/room/#sunpy:openastronomy.org .. |Latest Conda Version| image:: https://anaconda.org/conda-forge/sunpy/badges/version.svg :target: https://anaconda.org/conda-forge/sunpy .. |Project Status: Active - The project has reached a stable, usable state and is being actively developed.| image:: https://www.repostatus.org/badges/latest/active.svg :target: https://www.repostatus.org/#active .. |OpenAstronomy Discourse community| image:: https://cdck-file-uploads-global.s3.dualstack.us-west-2.amazonaws.com/try2/original/1X/5e1e3b3cada2d7fbae4734d4bc53999933d71c95.svg :height: 20px :target: https://community.openastronomy.org/ .. |Zenodo - Latest DOI| image:: https://zenodo.org/badge/2165383.svg :target: https://zenodo.org/badge/latestdoi/2165383 .. |Continuous Integration Status| image:: https://github.com/sunpy/sunpy/actions/workflows/ci.yml/badge.svg?branch=main :target: https://github.com/sunpy/sunpy/actions/workflows/ci.yml .. |Google Groups Mailing List| image:: https://fonts.gstatic.com/s/i/productlogos/groups/v9/web-48dp/logo_groups_color_1x_web_48dp.png :height: 20px :target: https://groups.google.com/g/sunpy .. |sunpy Stable Documentation| image:: https://readthedocs.org/projects/sunpy/badge/?version=stable :target: https://docs.sunpy.org/ .. |CodeCov Code Coverage| image:: https://codecov.io/gh/sunpy/sunpy/branch/main/graph/badge.svg :target: https://codecov.io/gh/sunpy/sunpy .. |Powered by NumFOCUS| image:: https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A :target: https://numfocus.org ``sunpy`` is a Python software package that provides fundamental tools for accessing, loading and interacting with solar physics data in Python. It includes an interface for searching and downloading data from multiple data providers, data containers for image and time series data, commonly used solar coordinate frames and associated transformations, as well as other functionality needed for solar data analysis. Installation ============ We recommended following the `installation guide `__ in the ``sunpy`` documentation. This will walk you through installing ``sunpy`` and all of its dependencies. Usage ===== If you are new to ``sunpy``, the best place to start is the `tutorial `__. the `example gallery `__ also includes a collection of shorter and more specific examples of using ``sunpy``. Changes ======= See our `changelog `__. for the latest changes in ``sunpy``. Getting Help ============ For more information or to ask questions about ``sunpy`` or any other SunPy Project package, please check out: - `sunpy documentation `__ - `SunPy Affiliated Packages `__ - `SunPy Chat`_ - `SunPy mailing list `__ - `SunPy Community forum `__ Acknowledging or Citing ``sunpy`` ================================= If you use ``sunpy`` in your scientific work, we would appreciate your `citing it in your publications `__. The continued growth and development of ``sunpy`` is dependent on the community being aware of ``sunpy``. Contributing ============ The SunPy Project is a community-driven open-source project that welcomes any and all contributions. Whether you are a developer, student, or user, you can help by contributing code, documentation, or community support. If you would like to get involved, the `Newcomers Guide`_ guide explains the many different ways to contribute to the SunPy Project and also shows how to get set up with a development workflow. Help is always welcome, so come and say hello by joining the `SunPy Chat`_ and look over the `Good First Issues list`_ for the ideal places to start. .. _Newcomers Guide: https://docs.sunpy.org/en/latest/dev_guide/contents/newcomers.html .. _Good First Issues list: https://github.com/sunpy/sunpy/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22Good+First+Issue%22 Code of Conduct =============== When you are interacting with the SunPy Community you are asked to follow our `Code of Conduct `__. .. _SunPy Chat: https://app.element.io/#/room/#sunpy:openastronomy.org ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1705116001.8754933 sunpy-5.1.1/docs/0000755000175100001770000000000014550400542013230 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/Makefile0000644000175100001770000000144514550400520014670 0ustar00runnerdocker# Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile html-noplot: @$(SPHINXBUILD) -D plot_gallery=0 -b html $(ALLSPHINXOPTS) $(SOURCEDIR) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." clean: rm -rf $(BUILDDIR) rm -rf ./generated # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/citation.rst0000644000175100001770000000004314550400520015565 0ustar00runnerdocker.. include:: ../sunpy/CITATION.rst ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/conf.py0000644000175100001770000003316714550400520014535 0ustar00runnerdocker""" Configuration file for the Sphinx documentation builder. """ # -- stdlib imports ------------------------------------------------------------ import os import sys import datetime import warnings from packaging.version import Version # -- Read the Docs Specific Configuration -------------------------------------- # This needs to be done before sunpy is imported on_rtd = os.environ.get('READTHEDOCS', None) == 'True' if on_rtd: os.environ['SUNPY_CONFIGDIR'] = '/home/docs/' os.environ['HOME'] = '/home/docs/' os.environ['LANG'] = 'C' os.environ['LC_ALL'] = 'C' os.environ['PARFIVE_HIDE_PROGRESS'] = 'True' # -- Check for dependencies ---------------------------------------------------- from sunpy.util import missing_dependencies_by_extra # NOQA: E402 missing_requirements = missing_dependencies_by_extra("sunpy")["docs"] if missing_requirements: print( f"The {' '.join(missing_requirements.keys())} package(s) could not be found and " "is needed to build the documentation, please install the 'docs' requirements." ) sys.exit(1) from matplotlib import MatplotlibDeprecationWarning # NOQA: E402 from ruamel.yaml import YAML # NOQA: E402 from sphinx_gallery.sorting import ExampleTitleSortKey, ExplicitOrder # NOQA: E402 from sunpy_sphinx_theme import PNG_ICON # NOQA: E402 from astropy.utils.exceptions import AstropyDeprecationWarning # NOQA: E402 import sunpy # NOQA: E402 from sunpy import __version__ # NOQA: E402 from sunpy.util.exceptions import SunpyDeprecationWarning, SunpyPendingDeprecationWarning # NOQA: E402 # -- Project information ------------------------------------------------------- project = 'sunpy' author = 'The SunPy Community' copyright = f'{datetime.datetime.now().year}, {author}' # Register remote data option with doctest import doctest # NOQA: E402 REMOTE_DATA = doctest.register_optionflag('REMOTE_DATA') # The full version, including alpha/beta/rc tags release = __version__ sunpy_version = Version(__version__) is_release = not(sunpy_version.is_prerelease or sunpy_version.is_devrelease) # We want to make sure all the following warnings fail the build warnings.filterwarnings("error", category=SunpyDeprecationWarning) warnings.filterwarnings("ignore", message='The sunpy.database module is no longer actively maintained', category=SunpyDeprecationWarning) warnings.filterwarnings("error", category=SunpyPendingDeprecationWarning) warnings.filterwarnings("error", category=MatplotlibDeprecationWarning) warnings.filterwarnings("error", category=AstropyDeprecationWarning) # -- SunPy Sample Data and Config ---------------------------------------------- # We set the logger to debug so that we can see any sample data download errors # in the CI, especially RTD. ori_level = sunpy.log.level sunpy.log.setLevel("DEBUG") import sunpy.data.sample # NOQA: E402 sunpy.data.sample.download_all() sunpy.log.setLevel(ori_level) # For the linkcheck linkcheck_ignore = [r"https://doi.org/\d+", r"https://element.io/\d+", r"https://github.com/\d+", r"https://docs.sunpy.org/\d+"] linkcheck_anchors = False # -- General configuration ----------------------------------------------------- # sphinxext-opengraph ogp_image = "https://raw.githubusercontent.com/sunpy/sunpy-logo/master/generated/sunpy_logo_word.png" ogp_use_first_image = True ogp_description_length = 160 ogp_custom_meta_tags = [ '', ] # Suppress warnings about overriding directives as we overload some of the # doctest extensions. suppress_warnings = ['app.add_directive', ] # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'matplotlib.sphinxext.plot_directive', 'sphinx_automodapi.automodapi', 'sphinx_automodapi.smart_resolver', 'sphinx_changelog', 'sphinx_gallery.gen_gallery', 'sphinx.ext.autodoc', 'sphinx.ext.coverage', 'sphinx.ext.doctest', 'sphinx.ext.inheritance_diagram', 'sphinx.ext.intersphinx', 'sphinx.ext.mathjax', 'sphinx.ext.napoleon', 'sphinx.ext.todo', 'sphinx.ext.viewcode', 'sunpy.util.sphinx.doctest', 'sunpy.util.sphinx.generate', "sphinxext.opengraph", 'sphinx_design', 'sphinx_copybutton', 'hoverxref.extension', ] # Set automodapi to generate files inside the generated directory automodapi_toctreedirnm = "generated/api" # Add any paths that contain templates here, relative to this directory. # templates_path = ['_templates'] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. html_extra_path = ['robots.txt'] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] if is_release: exclude_patterns.append('dev_guide/contents/*') # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: source_suffix = '.rst' # The master toctree document. master_doc = 'index' # The reST default role (used for this markup: `text`) to use for all # documents. Set to the "smart" one. default_role = 'obj' # Disable having a separate return type row napoleon_use_rtype = False # Disable google style docstrings napoleon_google_docstring = False # Disable the use of param, which prevents a distinct "Other Parameters" section napoleon_use_param = False # Enable nitpicky mode, which forces links to be non-broken nitpicky = True # This is not used. See docs/nitpick-exceptions file for the actual listing. nitpick_ignore = [] for line in open('nitpick-exceptions'): if line.strip() == "" or line.startswith("#"): continue dtype, target = line.split(None, 1) target = target.strip() nitpick_ignore.append((dtype, target)) # -- Options for intersphinx extension ----------------------------------------- # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { "python": ( "https://docs.python.org/3/", (None, "http://www.astropy.org/astropy-data/intersphinx/python3.inv"), ), "numpy": ( "https://numpy.org/doc/stable/", (None, "http://www.astropy.org/astropy-data/intersphinx/numpy.inv"), ), "scipy": ( "https://docs.scipy.org/doc/scipy/reference/", (None, "http://www.astropy.org/astropy-data/intersphinx/scipy.inv"), ), "aiapy": ("https://aiapy.readthedocs.io/en/stable/", None), "asdf": ("https://asdf.readthedocs.io/en/stable/", None), "astropy": ("https://docs.astropy.org/en/stable/", None), "astroquery": ("https://astroquery.readthedocs.io/en/latest/", None), "dask": ("https://docs.dask.org/en/stable/", None), "drms": ("https://docs.sunpy.org/projects/drms/en/v0.6.4.post1/", None), "hvpy": ("https://hvpy.readthedocs.io/en/latest/", None), "matplotlib": ("https://matplotlib.org/stable", None), "mpl_animators": ("https://docs.sunpy.org/projects/mpl-animators/en/stable/", None), "pandas": ("https://pandas.pydata.org/pandas-docs/stable/", None), "parfive": ("https://parfive.readthedocs.io/en/stable/", None), "reproject": ("https://reproject.readthedocs.io/en/stable/", None), "skimage": ("https://scikit-image.org/docs/stable/", None), "spiceypy": ("https://spiceypy.readthedocs.io/en/stable/", None), "sqlalchemy": ("https://docs.sqlalchemy.org/en/latest/", None), "sunkit_image": ("https://docs.sunpy.org/projects/sunkit-image/en/stable/", None), "sunkit_instruments": ("https://docs.sunpy.org/projects/sunkit-instruments/en/stable/", None), "zeep": ("https://docs.python-zeep.org/en/stable/", None), } # -- Options for hoverxref ----------------------------------------------------- if os.environ.get("READTHEDOCS"): hoverxref_api_host = "https://readthedocs.org" if os.environ.get("PROXIED_API_ENDPOINT"): # Use the proxied API endpoint # A RTD thing to avoid a CSRF block when docs are using a custom domain hoverxref_api_host = "/_" hoverxref_auto_ref = False hoverxref_domains = ["py"] hoverxref_mathjax = True hoverxref_modal_hover_delay = 500 hoverxref_tooltip_maxwidth = 600 # RTD main window is 696px hoverxref_intersphinx = list(intersphinx_mapping.keys()) hoverxref_role_types = { # Roles within the py domain "attr": "tooltip", "class": "tooltip", "const": "tooltip", "data": "tooltip", "exc": "tooltip", "func": "tooltip", "meth": "tooltip", "mod": "tooltip", "obj": "tooltip", # Roles within the std domain "confval": "tooltip", "hoverxref": "tooltip", "ref": "tooltip", # Would be used by hoverxref_auto_ref if we set it to True "term": "tooltip", } # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = "sunpy" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] # Render inheritance diagrams in SVG graphviz_output_format = "svg" graphviz_dot_args = [ '-Nfontsize=10', '-Nfontname=Helvetica Neue, Helvetica, Arial, sans-serif', '-Efontsize=10', '-Efontname=Helvetica Neue, Helvetica, Arial, sans-serif', '-Gfontsize=10', '-Gfontname=Helvetica Neue, Helvetica, Arial, sans-serif' ] # -- Sphinx Gallery ------------------------------------------------------------ # JSOC email os env # see https://github.com/sunpy/sunpy/wiki/Home:-JSOC os.environ["JSOC_EMAIL"] = "jsoc@sunpy.org" sphinx_gallery_conf = { 'backreferences_dir': os.path.join('generated', 'modules'), 'filename_pattern': '^((?!skip_).)*$', 'examples_dirs': os.path.join('..', 'examples'), 'subsection_order': ExplicitOrder([ '../examples/acquiring_data', '../examples/map', '../examples/map_transformations', '../examples/time_series', '../examples/units_and_coordinates', '../examples/plotting', '../examples/differential_rotation', '../examples/saving_and_loading_data', '../examples/computer_vision_techniques', '../examples/showcase', ]), 'within_subsection_order': ExampleTitleSortKey, 'gallery_dirs': os.path.join('generated', 'gallery'), 'matplotlib_animations': True, # Comes from the theme. "default_thumb_file": PNG_ICON, 'abort_on_example_error': False, 'plot_gallery': 'True', 'remove_config_comments': True, 'doc_module': ('sunpy'), 'only_warn_on_example_error': True, } # -- Linking to OpenCV docs by using rst_epilog -------------------------------- try: import requests from bs4 import BeautifulSoup base_url = "https://docs.opencv.org" # The stable-version docs are the first item in the second list on the main page all_docs = BeautifulSoup(requests.get(base_url).text, 'html.parser') version = all_docs.find_all('ul')[1].li.a.attrs['href'][2:] # strip leading "./" # Find the relative URL to the page for the `cv` namespace stable_docs = BeautifulSoup(requests.get(f"{base_url}/{version}/namespaces.html").text, 'html.parser') cv_namespace = stable_docs.find("a", string="cv").attrs['href'] # Find the relative URL for warpAffine/filter2D in the `cv` namespace all_cv = BeautifulSoup(requests.get(f"{base_url}/{version}/{cv_namespace}").text, 'html.parser') warpAffine = all_cv.find("a", string="warpAffine").attrs['href'][6:] # strip leading "../../" filter2D = all_cv.find("a", string="filter2D").attrs['href'][6:] # strip leading "../../" # Construct the full URL for warpAffine/filter2D warpAffine_full = f"{base_url}/{version}/{warpAffine}" filter2D_full = f"{base_url}/{version}/{filter2D}" except Exception: # In the event of any failure (e.g., no network connectivity) warpAffine_full = "" filter2D_full = "" rst_epilog = f""" .. |cv2_warpAffine| replace:: **cv2.warpAffine()** .. _cv2_warpAffine: {warpAffine_full} .. |cv2_filter2D| replace:: **cv2.filter2D()** .. _cv2_filter2D: {filter2D_full} """ # -- Options for sphinx-copybutton --------------------------------------------- # Python Repl + continuation, Bash, ipython and qtconsole + continuation, jupyter-console + continuation copybutton_prompt_text = r">>> |\.\.\. |\$ |In \[\d*\]: | {2,5}\.\.\.: | {5,8}: " copybutton_prompt_is_regexp = True # -- Stability Page ------------------------------------------------------------ with open('./reference/sunpy_stability.yaml') as estability: yaml = YAML(typ='rt') sunpy_modules = yaml.load(estability.read()) html_context = { 'sunpy_modules': sunpy_modules, 'is_development': not is_release, } def rstjinja(app, docname, source): """ Render our pages as a jinja template for fancy templating goodness. """ # Make sure we're outputting HTML if app.builder.format != 'html': return files_to_render = ["reference/stability", "dev_guide/index"] if docname in files_to_render: print(f"Jinja rendering {docname}") rendered = app.builder.templates.render_string( source[0], app.config.html_context ) source[0] = rendered # -- Sphinx setup -------------------------------------------------------------- def setup(app): # Generate the stability page app.connect("source-read", rstjinja) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1705116001.8754933 sunpy-5.1.1/docs/dev_guide/0000755000175100001770000000000014550400542015163 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1705116001.8794935 sunpy-5.1.1/docs/dev_guide/contents/0000755000175100001770000000000014550400542017020 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/backports.rst0000644000175100001770000000342414550400520021541 0ustar00runnerdocker.. _backports: *********************************** Making Changes to Released Versions *********************************** When changes need to be made in a bugfix release of an already released version of sunpy this is done by a process called "backporting". The process is as follows: * Open a Pull Request (PR) as normal targeting the ``main`` branch. * Apply a label to that PR (or get a maintainer to do it) of the format ``Backport X.Y``. * Once the PR has been merged a bot will open a new PR with the same changes targeting the ``X.Y`` branch. Managing backports is done by the sunpy maintainers, as a contributor you generally shouldn't have to worry about it. The following documentation is for maintainers on how to interact with the backport bot. Controlling the Backport Bot ============================ The backport bot in use on the sunpy repo is `MeeseeksDev `__. Upon merging a PR the bot will look for the existence of a label with the following template in the label description field ``on-merge: backport to X.Y``. If the decision to backport a PR is taken after the merge of the PR, then a command needs to be added to a comment on the PR: ``@MeeseeksDev backport [to] {branch}`` Manual Backports ================ If a backport fails, meeseeks will add a comment to the PR and add a label named "Still Needs Manual Backport". If you then manually backport the PR, please remove this label when the backport PR is open so that the label is an accurate list of PRs in need of manual backporting. When doing a manual backport please do not forget to put the PR number you are backporting **in the description** of the PR so that GitHub links the two PRs together. (This automatic linking does not happen if the number is in the title). ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/ci_jobs.rst0000644000175100001770000000631514550400520021163 0ustar00runnerdocker.. _ci_jobs: *************************************** What runs on our Continuous Integration *************************************** Overall the aim of the Continuous Integration is to provide a way for contributors to test their code on multiple platforms and help in the development process. While we can run many jobs, we aim to limit the selection depending in the context to ensure that the time taken is not wasted or ends up delaying a pull request or release. The goal is that, the builds we do not run on a pull request should primarily be ones which are unlikely to be the fault of the change in the pull request if they fail. Currently we have several stages of CI jobs, some run on a pull request and some will only run on a schedule. 1. "core" - Pull Request, Scheduled and Release This runs a basic offline test suite on Linux for the latest version of Python we support. It ensures that basic functionality works and that we don't have any regressions. 2. "test" - Pull Request, Scheduled and Release This runs a basic test suite on Windows and Mac OS for older versions of Python we support. It ensures that basic functionality works and that we don't have any regressions. This stage needs to wait for the "core" stage to complete. Furthermore, we run: * "oldestdeps" - Check the offline test suite with the oldest dependencies installed. 3. "docs" - Pull Request, Scheduled and Release This runs a documentation build (without executing gallery examples) to test that the HTML documentation can be generated without any errors or warnings. The build is cached and the gallery examples are then tested during the "online" stage. 4. "online" - Pull Request, Scheduled This runs a full test suite on Linux for a version of Python. This build can fail (due to a range of reasons) and can take up to 45 minutes to run. We want to ensure that the offline tests are passing before we consider running this. Therefore this stage needs to wait for the "core" stage to complete. In addition, we run the documentation build to execute the gallery examples which can fail due to the same reasons as the online build. The documentation build from the "docs" stage is cached and restored for this documentation build. Therefore this stage also needs to wait for the "docs" stage to complete. As these are not tested when we build the distribution or wheels, we skip these on a release. These should be checked based on the last commit for that release branch instead before a tag. 5. "cron" - Scheduled Here we put builds that are useful to run on a schedule but not so useful on a pull request. This allows us to run more "exotic" or focused builds that day to day, should not affect a pull request. These are: * "base_deps" - Check that sunpy does not error if you only have the base dependencies installed. * "devdeps" - Check the offline test suite with the development dependencies installed. Likely to break due to upstream changes we can't fix and have to wait to be resolved. * "conda" - Check the offline test suite when using conda instead of pip/pypi. Likely to break due to packaging upstream we can't fix and have to wait to be resolved. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/code_standards.rst0000644000175100001770000002654214550400520022534 0ustar00runnerdocker.. _coding-standards: **************** Coding Standards **************** The purpose of the page is to describe the standards that are expected of all the code in the SunPy project. All potential developers should read and abide by the following standards. Code which does not follow these standards closely will not be accepted. We try to closely follow the coding style and conventions proposed by `Astropy `_. Language Standard ================= * All code must be compatible with Python 3.7 and later. Usage of ``six``, ``__future__``, and ``2to3`` is no longer acceptable. * The new Python 3 formatting style should be used (i.e. ``"{0:s}".format("spam")`` instead of ``"%s" % "spam"``). * The core package and affiliated packages should be importable with no dependencies other than components already in the sunpy core package, the `Python Standard Library `_, and packages already required by the sunpy core package. Adding dependencies to sunpy core will be considered but are highly discouraged. Such optional dependencies should be recorded in the ``setup.cfg`` file in the ``extras_require`` entry. Coding Style/Conventions ======================== * The code will follow the standard `PEP8 Style Guide for Python Code `_. In particular, this includes using only 4 spaces for indentation, and never tabs. * **Follow the existing coding style** within a file and avoid making changes that are purely stylistic. Please try to maintain the style when adding or modifying code. * Following PEP8's recommendation, absolute imports are to be used in general. We allow relative imports within a module to avoid circular import chains. * The ``import numpy as np``, ``import matplotlib as mpl``, and ``import matplotlib.pyplot as plt`` naming conventions should be used wherever relevant. ``from packagename import *`` should never be used (except in ``__init__.py``) * Classes should either use direct variable access, or Python's property mechanism for setting object instance variables. * Classes should use the builtin `super` function when making calls to methods in their super-class(es) unless there are specific reasons not to. `super` should be used consistently in all subclasses since it does not work otherwise. * Multiple inheritance should be avoided in general without good reason. * ``__init__.py`` files for modules should not contain any significant implementation code. ``__init__.py`` can contain docstrings and code for organizing the module layout. Private code ============ It is often useful to designate code as private, which means it is not part of the user facing API, only used internally by sunpy, and can be modified without a deprecation period. Any classes, functions, or variables that are private should either: - Have an underscore as the first character of their name, e.g., ``_my_private_function``. - If you want to do that to entire set of functions in a file, name the file with a underscore as the first character, e.g., ``_my_private_file.py``. If these might be useful for other packages within the sunpy ecosphere, they should be made public. Utilities in sunpy ================== Within ``sunpy``, it might be useful to have a set of utility classes or functions that are used by internally to help with certain tasks or to provide a certain level of abstraction. These should be placed either: - ``sunpy.{subpackage}.utils.py``, if it is only used within that sub-package. - ``sunpy.util`` if it is used across multiple sub-packages. These can be private (see section above) or public. The decision is up to the developer, but if these might be useful for other packages within the sunpy ecosphere, they should be made public. Formatting ========== We enforce a minimum level of code style with our continuous integration (the name is ``sunpy.sunpy (python_codestyle [linux]``). This runs a tool called `pre-commit `__. The settings and tools we use for the pre-commit can be found in the file :file:`.pre-commit-config.yaml` at the root of the sunpy git repository. Some of the checks are: * Checks (but doesn't fix) various PEP8 issues with flake8. * Sort all imports in any Python files with isort. * Remove any unused variables or imports with autoflake. We suggest you use "tox" (which is used to run the sunpy test suite) to run these tools without having to setup anything within your own Python virtual environment:: $ tox -e codestyle What you will see is this output (heavily condensed): .. code-block:: bash codestyle create: /home//GitHub/sunpy/.tox/codestyle codestyle run-test: commands[0] | pre-commit install-hooks codestyle run-test: commands[1] | pre-commit run --verbose --all-files --show-diff-on-failure flake8...................................................................Passed - hook id: flake8 - duration: 1.35s 0 Check for case conflicts.................................................Passed - hook id: check-case-conflict - duration: 0.08s Trim Trailing Whitespace.................................................Failed - hook id: trailing-whitespace - duration: 0.08s - exit code: 1 - files were modified by this hook Fixing docs/dev_guide/code_standards.rst pre-commit hook(s) made changes. If you are seeing this message in CI, reproduce locally with: `pre-commit run --all-files`. To run `pre-commit` as part of git workflow, use `pre-commit install`. All changes made by hooks: diff --git a/docs/dev_guide/code_standards.rst b/docs/dev_guide/code_standards.rst index bed700d90..c6b5df977 100644 --- a/docs/dev_guide/code_standards.rst +++ b/docs/dev_guide/code_standards.rst @@ -59,6 +59,8 @@ Instead of installing this, you can use "tox" (which is used to run the sunpy te $ tox -e codestyle +What you will see + If you want to setup the pre-commit locally, you can do the following:: $ pip install pre-commit diff --git a/docs/dev_guide/documentation.rst b/docs/dev_guide/documentation.rst index 5cd914047..b1017f77a 100644 --- a/docs/dev_guide/documentation.rst +++ b/docs/dev_guide/documentation.rst @@ -39,9 +39,9 @@ If there are multiple code elements with the same name (e.g. ``peek()`` is a met .. code-block:: rst - `GenericMap.peek` or `CompositeMap.peek` + `.GenericMap.peek` or `.CompositeMap.peek` -These will show up as `GenericMap.peek` or `CompositeMap.peek`. +These will show up as `.GenericMap.peek` or `.CompositeMap.peek`. To still show only the last segment you can add a tilde as prefix: ERROR: InvocationError for command /home/nabil/GitHub/sunpy/.tox/codestyle/bin/pre-commit run --verbose --all-files --show-diff-on-failure (exited with code 1) ___________________________________________________________________________________________ summary ___________________________________________________________________________________________ ERROR: codestyle: commands failed This will inform you of what checks failed and why, and what changes (if any) the command has made to your code. If you want to setup the pre-commit locally, you can do the following:: $ pip install pre-commit Now you can do:: $ pre-commit run --all-files which will run the tools on all files in the sunpy git repository. The pre-commit tools can change some of the files, but in other cases it will report problems that require manual correction. If the pre-commit tool changes any files, they will show up as new changes that will need to be committed. Automate -------- Instead of running the pre-commit command each time you can install the git hook:: $ pre-commit install which installs a command to :file:`.git/hooks/pre-commit` which will run these tools at the time you do ``git commit`` and means you don't have to run the first command each time. We only suggest doing the install step if you are comfortable with git and the pre-commit tool. Documentation and Testing ========================= * American English is the default language for all documentation strings and inline commands. Variables names should also be based on English words. * Documentation strings must be present for all public classes/methods/functions, and must follow the form outlined in the :ref:`docs_guidelines` page. Additionally, examples or tutorials in the package documentation are strongly recommended. * Write usage examples in the docstrings of all classes and functions whenever possible. These examples should be short and simple to reproduce–users should be able to copy them verbatim and run them. These examples should, whenever possible, be in the :ref:`doctests` format and will be executed as part of the test suite. * Unit tests should be provided for as many public methods and functions as possible, and should adhere to the standards set in the :ref:`testing` document. Data and Configuration ====================== * We store test data in ``sunpy/data/test`` as long as it is less than about 100 kB. These data should always be accessed via the :func:`sunpy.data.test.get_test_filepath` and :func:`sunpy.data.test.get_test_data_filenames` functions. * We store data used for examples in the `sample-data repository `_. This data should not be used for unit tests but can be within our documentation. * All persistent configuration should use the :ref:`customizing-sunpy` mechanism. Such configuration items should be placed at the top of the module or package that makes use of them, and supply a description sufficient for users to understand what the setting changes. Standard output, warnings, and errors ===================================== The built-in ``print(...)`` function should only be used for output that is explicitly requested by the user, for example ``print_header(...)`` or ``list_catalogs(...)``. Any other standard output, warnings, and errors should follow these rules: * For errors/exceptions, one should always use ``raise`` with one of the built-in exception classes, or a custom exception class. The nondescript ``Exception`` class should be avoided as much as possible, in favor of more specific exceptions (`IOError`, `ValueError`, etc.). * For warnings, one should always use the functions in ``sunpy.util.exceptions`` and *not* `warnings.warn`. This ensures we are always raising a sunpy specific warning type. Including C Code ================ * C extensions are only allowed when they provide a significant performance enhancement over pure Python, or a robust C library already exists to provided the needed functionality. * The use of `Cython`_ is strongly recommended for C extensions. * If a C extension has a dependency on an external C library, the source code for the library should be bundled with sunpy, provided the license for the C library is compatible with the sunpy license. Additionally, the package must be compatible with using a system-installed library in place of the library included in sunpy. * In cases where C extensions are needed but `Cython`_ cannot be used, the `PEP 7 Style Guide for C Code `_ is recommended. * C extensions (`Cython`_ or otherwise) should provide the necessary information for building the extension. .. _Cython: https://cython.org/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/conda_for_dependencies.rst0000644000175100001770000001161614550400520024213 0ustar00runnerdocker.. _conda_for_dependencies: ******************************************** Using ``conda`` for Development Dependencies ******************************************** The ``conda`` package for ``sunpy`` specifies only those dependencies that are relevant for the typical user. A power user or a developer will instead need the complete set of dependencies to use all optional features, build the documentation, and/or run the full test suite. We provide a ``conda`` environment file (``sunpy-dev-env.yml``) in the base directory of the GitHub repository. You can create a ``conda`` environment (here named ``sunpy-dev``) from this file: .. code-block:: bash $ conda env create -n sunpy-dev -f sunpy-dev-env.yml $ conda activate sunpy-dev Alternatively, if you want to add the complete set of dependencies to an existing ``conda`` environment, you can use this file to update that environment (here named ``existing-env``): .. code-block:: bash $ conda env update -n existing-env -f sunpy-dev-env.yml The above calls assume that you have already downloaded ``sunpy-dev-env.yml``, either by itself or along with the whole repository. You can alternatively supply the URL for the file, as hosted on GitHub, to either of the above calls, e.g.: .. code-block:: bash $ conda env create -n sunpy-dev -f https://raw.githubusercontent.com/sunpy/sunpy/main/sunpy-dev-env.yml .. note:: This ``conda`` environment file intentionally does not specify restrictions on release versions for any dependency. This ``conda`` environment file specifies only the *dependencies* for ``sunpy``, and not ``sunpy`` itself. Depending on your needs, continue with one of the following two ways to install ``sunpy`` in this ``conda`` environment. Normal Installation of ``sunpy`` ================================ If you do not plan to modify the code of ``sunpy`` itself, you can simply install ``sunpy`` via ``conda``: .. code-block:: bash $ conda install sunpy Since the ``conda`` environment already has the complete set of dependencies for ``sunpy``, this call should install only ``sunpy`` and no additional packages. Editable Installation of ``sunpy`` ================================== If you plan to modify the code of ``sunpy`` itself, you will want to perform an "editable install" of your local repository, via ``pip``, so that Python will link to your local repository. Normally it is discouraged to have an environment that mixes package installations via ``conda`` with package installations via ``pip`` because it can lead to environment states that confuse the ``conda`` solver. That is the reason why our instructions for new developers recommends that dependencies be installed exclusively via ``pip``. However, some of the dependencies in the complete set are difficult or even impossible to install via ``pip`` alone, yet are straightforward to install via ``conda``. Using the above ``conda`` environment, combined with a little care, it is possible to minimize that chance for any ``conda``/``pip`` conflicts. From the base directory of your local repository, install ``sunpy`` with some additional ``pip`` options: .. code:: bash $ pip install --no-deps --no-build-isolation -e . The ``--no-deps`` and ``--no-build-isolation`` options ensure that ``pip`` does not itself install any dependencies. Since the ``conda`` environment is designed to already have the complete set of dependencies, the ``pip`` installation should succeed. You now have a ``conda`` environment with an editable installation of ``sunpy`` and with (nearly) all dependencies managed by ``conda``. As you install other packages in this environment, a package that depends on ``sunpy`` will trigger ``conda`` to install ``sunpy``. **That is fine!** This ``conda`` installation of ``sunpy`` will simply mask the ``pip`` installation of ``sunpy``. All you need to do is to remove the ``conda`` installation with the ``--force`` option so that dependencies are left undisturbed: .. code-block:: bash $ conda remove --force sunpy Once the ``conda`` installation of ``sunpy`` is removed, the ``pip`` installation of ``sunpy`` will automatically be accessible again. .. note:: For those who use ``mamba`` instead of ``conda``, most ``conda`` commands can be translated by simply substituting "mamba" for "conda". However, ``mamba remove`` does not support the ``--force`` option, so you do in fact have to call ``conda remove``. As a tip, you can follow a similar procedure to incorporate editable installations of other packages (e.g., ``astropy``) in a ``conda`` environment. You first install the package via ``conda`` to ensure its dependencies are present, then you remove the package alone without disturbing the dependencies, and finally you perform the editable install of the package from the base directory of your local repository: .. code-block:: bash $ conda install astropy $ conda remove --force astropy $ pip install --no-deps --no-build-isolation -e . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/dependencies.rst0000644000175100001770000000160214550400520022173 0ustar00runnerdocker.. _dependency_versions: ************************* Dependency Support Policy ************************* .. note:: This policy is based on `NEP-0029`_. sunpy has a short list of core dependencies (Python, numpy, astropy, parfive) and a long list of optional dependencies. The minimum version of these packages that we enforce follows this policy. * Python: Released in the prior 42 months from the anticipated release date. * astropy: Released in the prior 12 months from the anticipated release date. * Everything else: Released in the prior 24 months from the anticipated release date. Sponsored affiliated packages will support *at least* the sunpy LTS version at the time of their release. For dependencies only needed to run our tests we will support versions released in the prior 12 months to the current date. .. _NEP-0029: https://numpy.org/neps/nep-0029-deprecation_policy.html ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/documentation.rst0000644000175100001770000002345114550400520022424 0ustar00runnerdocker.. _docs_guidelines: ************* Documentation ************* Overview ======== All code must be documented and we follow these style conventions described here: * `numpydoc `_ We recommend familiarizing yourself with this style. Referring to other code ----------------------- To link to other methods, classes, or modules in sunpy you have to use backticks, for example: .. code-block:: rst `sunpy.map.GenericMap` generates a link like this: `sunpy.map.GenericMap`. We use the sphinx setting ``default_role = 'obj'`` so that you do not nor **SHOULD NOT** use the ``:class:`` qualifier, but ``:func:``, ``:meth:`` are different (more on this below). Often, you don't want to show the full package and module name. As long as the target is unambiguous you can simply leave them out: .. code-block:: rst `.GenericMap` and the link still works: `.GenericMap`. If there are multiple code elements with the same name (e.g. ``peek()`` is a method in multiple classes), you'll have to extend the definition: .. code-block:: rst `.GenericMap.peek` or `.CompositeMap.peek` These will show up as `.GenericMap.peek` or `.CompositeMap.peek`. To still show only the last segment you can add a tilde as prefix: .. code-block:: rst `~.GenericMap.peek` or `~.CompositeMap.peek` will render as `~.GenericMap.peek` or `~.CompositeMap.peek`. Other packages can also be linked via `intersphinx `_: .. code-block:: rst `numpy.mean` will return this link: `numpy.mean`. This works for Python, Numpy and Astropy (full list is in :file:`docs/conf.py`). With Sphinx, if you use ``:func:`` or ``:meth:``, it will add closing brackets to the link. If you get the wrong pre-qualifier, it will break the link, so we suggest that you double check if what you are linking is a method or a function. .. code-block:: rst :class:`numpy.mean()` :meth:`numpy.mean()` :func:`numpy.mean()` will return two broken links ("class" and "meth") but "func" will work. sunpy-Specific Rules -------------------- * For **all** RST files, we enforce a one sentence per line rule and ignore the line length. * Standards on docstring length and style are enforced using `docformatter `__: .. code-block:: bash docformatter -r -i --pre-summary-newline --make-summary-multi-line * Heading style is the following for all RST files: .. code-block:: rst * with overline, for titles = for sections - for subsections ^ for subsubsections " for paragraphs * Anchors for each page should follow this format: ``sunpy-
--``., e.g., ``sunpy-tutorial-acquiring-data-index``. * Use of ``.. code-block:`` is required for all code examples. .. _Docs Guidelines for Data Sources: Documenting Data Sources ------------------------ Subclasses of `~sunpy.map.GenericMap` or `~sunpy.timeseries.TimeSeries` must provide a detailed docstring providing an overview of the data source that the object represents. In order to maintain consistency and completeness, the following information must be provided by a data source docstring, if available, and preferably in the following order: * the name of the mission and instrument and the institution that built it * short description of the instrument (e.g. Cassegrain reflector, Wolter-1 grazing incidence x-ray, coronagraph) including the type of detector * description of the platform (e.g. satellite in 28 deg inclined orbit, a telescope on the summit of Mauna Kea in Hawaii) * description of the primary purpose or science goals of the instrument. * list of all wavelength(s) or passbands in appropriate units * description of the emission processes which dominate in those passbands * appropriate measurement properties such as field of view, angular resolution, time resolution * description of the operational concept (e.g. operates 24/7, observes from 7 am to 5 pm UT) including mention of unusual operations scenarios (e.g. calibration seasons, eclipse seasons) * the start and end of the data set In addition, a reference section must be provided with links to the following resources, if available, * the mission web page * the instrument web page * relevant wikipedia page(s) * relevant user guide(s) * the mission paper and instrument paper * information to interpret metadata keywords such as FITS header reference * the data archive Examples can be found in any class defined in any Python file in ``sunpy/map/sources/`` such as `~sunpy.map.sources.AIAMap`. Sphinx ====== All of the sunpy documentation (like this page) is built by `Sphinx `_, which is a tool especially well-suited for documenting Python projects. Sphinx works by parsing files written using a `a Mediawiki-like syntax `_ called `reStructuredText `_. In addition to parsing static files of reStructuredText, Sphinx can also be told to parse code comments. In fact, in addition to what you are reading right now, the `Python documentation `_ was also created using Sphinx. Usage ----- All of the sunpy documentation is contained in the "docs" folder and code documentation strings. The examples from the example gallery can be found in the "examples" folder. In the root directory run:: tox -e build_docs-gallery This will generate HTML documentation for sunpy in the "docs/_build/html" directory. You can open the "index.html" file to browse the final product. The gallery examples are located under "docs/_build/html/generated/gallery". Sphinx builds documentation iteratively, only adding things that have changed. If you want to build the documentation without executing the gallery examples, i.e. to reduce build times while working on other sections of the documentation you can run:: tox -e build_docs If you'd like to start from scratch (i.e., remove the tox cache) then change to the :file:`docs/` directory and run:: make clean cd .. tox -r -e build_docs-gallery To build the documentation in your current python environment you must have all the dependencies specified in ``setup.cfg`` installed (``pip install -e .[docs,docs-gallery]``). Then change to the :file:`docs/` directory and run:: make html For more information on how to use Sphinx, consult the `Sphinx documentation `_. Special Sphinx directives ------------------------- ``minigallery`` directive ^^^^^^^^^^^^^^^^^^^^^^^^^ Sphinx will automatically record which functions, classes, etc. are used in each gallery example. In the documentation, you can insert a mini-gallery of the subset of the gallery examples that uses a particular function, class, etc. For example, the following RST block:: .. minigallery:: sunpy.coordinates.RotatedSunFrame produces this mini-gallery: .. minigallery:: sunpy.coordinates.RotatedSunFrame If you want to specify more than one object, separate them by spaces. This is particularly useful if you need to cover multiple namespaces in which an object may be accessed, e.g.:: .. minigallery:: sunpy.coordinates.RotatedSunFrame sunpy.coordinates.metaframes.RotatedSunFrame ``generate`` directive ^^^^^^^^^^^^^^^^^^^^^^ In rare circumstances, one may want to insert "raw" HTML directly into the pages written by Sphinx. For HTML that is statically available (i.e., already written in some form), one can use the `"raw" directive `__. For HTML that is generated by Python code, sunpy provides the custom directive ``generate``. Here's an example RST block:: .. generate:: html :html_border: import os from sunpy.data.sample import file_dict print("") for key, value in file_dict.items(): print(f"") print("
{key}{os.path.basename(value)}
") to insert the following HTML table: .. generate:: html :html_border: import os from sunpy.data.sample import file_dict print("") for key, value in file_dict.items(): print(f"") print("
{key}{os.path.basename(value)}
") Troubleshooting ---------------- Sphinx can be very particular about formatting, and the warnings and errors aren't always obvious. Below are some commonly-encountered warning/error messages along with a human-readable translation: **WARNING: Duplicate explicit target name: "xxx".** If you reference the same URL, etc more than once in the same document sphinx will complain. To avoid, use double-underscores instead of single ones after the URL. **ERROR: Malformed table. Column span alignment problem at line offset n** Make sure there is a space before and after each colon in your class and function docs (e.g. attribute : type, instead of attribute: type). Also, for some sections (e.g. Attributes) numpydoc seems to complain when a description spans more than one line, particularly if it is the first attribute listed. **WARNING: Block quote ends without a blank line; unexpected unindent.** Lists should be indented one level from their parents. **ERROR: Unknown target name: "xxx"** In addition to legitimate errors of this type, this error will also occur when variables have a trailing underscore, e.g., ``xxx_``. **WARNING: Explicit markup ends without a blank line; unexpected unindent.** This usually occurs when the text following a directive is wrapped to the next line without properly indenting a multi-line text block. **WARNING: toctree references unknown document '...'** / **WARNING: toctree contains reference to nonexisting document** This pair of errors is due to the way numpydoc scrapes class members. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/example_gallery.rst0000644000175100001770000000576014550400520022730 0ustar00runnerdocker.. _example_gallery: *************** Example Gallery *************** The purpose of the page is to describe the contribution guidelines for the `sunpy Example Gallery `__. All potential contributors to the ``sunpy`` example gallery should read and abide by the following guidelines. Contribution Guidelines ======================= * The title of the example should be short yet descriptive and emphasize the goal of the example. Try to make the title appeal to a broad audience and avoid referencing a specific instrument, catalog, or anything wavelength dependent. * Each example should begin with a paragraph that gives a brief overview of the entire example, including relevant astronomy concepts, and motivates the described functionality. * The examples must be compatible with the versions supported by the last major release of the ``sunpy`` core package. * All the examples must be fully PEP8 compliant, the ``pre-commit`` hook should be used to ensure this. * Wherever possible, the examples should include linked references with links pointing to the appropriate `DOI `__ or `ADS `__ entry. * The example should include links (URL or `sphinx intersphinx `__) to relevant documentation pages. * Each example should, where possible, include at least one image, map, or plot to use as the icon in the example gallery. * The examples should avoid using acronyms without defining them first (e.g. Virtual Solar Observatory, or VSO). Similarly complex jargon should be avoided unless clearly explained. * There should be a good variety of examples for each section (simple and more complex to cater for different levels). * When creating a plot, particularly of a map, the example should follow these rules of thumb to minimize verbosity and maintain consistency with the other gallery examples: * Do not use `~sunpy.map.GenericMap.peek` in examples. Instead, use `~sunpy.map.GenericMap.plot`. * Always create a figure instance using ``plt.figure()`` prior to creating a plot. * Always create an Axes instance, and where possible use this to modify the plot instead of using the ``pyplot`` interface (for example use ``ax.set_xlabel()``` instead of ``plt.xlabel()``). * If an axes instance is created, it should be explicitly passed as a keyword argument wherever possible (e.g. in `~sunpy.map.GenericMap.plot` or `~sunpy.map.GenericMap.draw_grid`). * At the end of the example, call ``plt.show()``. While not explicitly needed for the gallery to render, this ensures that when run as a script, the plots will appear. * If you need to use ``astropy.visualization.{quantity_support, time_support}``, import these functions at the top of the example, and call them directly before the first plot that needs them. We recommend checking the other examples in the gallery to see how they are structured and what they contain. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/funding.rst0000644000175100001770000000132314550400520021177 0ustar00runnerdocker.. _funding: .. warning:: HEAVY WIP ********************* Submodule and funding ********************* Here we list whatever parts of the SunPy project have been funded by external sources such as grants or Google Summer of Code (GSoC) and the like. Database ======== Google Summer of Code (2013) ---------------------------- database/attrs.py database/test_tables.py database/test_database.py database/test_commands.py database/test_caching.py database/test_attrs.py Net --- Google Summer of Code (2014) ---------------------------- fido_factory.py, vso.py, most of the dataretriever submodule ESA Summer of Code in Space (2011) ---------------------------------- attr.py tools/hektemplate.py tools/hek_mkcls.py ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1705116001.8794935 sunpy-5.1.1/docs/dev_guide/contents/images/0000755000175100001770000000000014550400542020265 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/images/actions_check_pr.png0000644000175100001770000013475414550400520024303 0ustar00runnerdocker‰PNG  IHDR`”@¦BýPLTEÿÿÿàáã¼ÀÄœ¡§€‡nw„Š’{‚Šx‡t{„qxúüýñóõéìïßãèÔÙàÐ×ÞÛÞય´äæèÅÈËðòôùúúíïñâåçÞàâòõõýýý”š ÈÌÏÄÆÉ‘—žÿþÿ®±µÓÖØÖØÚõõöŠ˜‡•ý÷÷úæçõÑÓî´·ü‘“üwzû[^8¨WG®cj¼€xÃŒˆÉš¢Ñ¯ÓëÙöøø ¥ªñ¿ÂúFI-¤O·ÛÁïðòöÚÛ×ÙÝÕרøàáëîï¼¾Âíîîèêì”›¤©®üðñöøú}«éT‘ãÆÙôõ÷ú„¯ê‰²ì»Ññ°µºÊÍÑn¡çw§è¯Êðéðü§Åï iÚ3~àåíù¶ìóÌÏ顦厔àzㆌ盟Ï".ÜckÞovÑ/;*yÞ=„àÚçøC‡àÓ7BÐ+6Ýip›½íòÇɒΡØPYÏ&2攚ûëìÕ@KâˆÐàõµÏññõúíòùàé÷ÀÖóØåöàñäÙZboÜlÛ jÚfæ tÝGŠâ[–äs¤çÓª±ÇåÏ ÁÁ±ºÂZ¶sÖIRë©­–ºìOŽâ¸¹ºbšåÏÑÔàâåµ¹¼ÎÐÓéëíÙÜà¿ÂÆæç鵽ŬŻ…¸“˜Á¥ÑÓ×ÂÄÅÝßàâãåãå稭±»½À\eoYblnu~W`j]eoÌÏÑÙÚÜcjtjq{±³¶ËÍÏfnw™ž¤`gq´·¹¸¼À}„Œçèêõ÷øïïñÙÛÞÇÊ͹»½ÍÏј›žƒ…‡UUU))) ­¯±jjj‘‘’jmp›ž ž £oqs247wz}`dg+/2©«®Œ’¤§ª&+0’”—Y\`6:?$*.}€‚ptx>BF-27:>B27;AEIosv„‡ŠdgjKPS[`d‹ŽEHJTX[z}twz_bfо™9ŽP}„losˆ‹y°‰7PTWôõ÷€ƒ†gjn–™œfjmEIN†‰Œ¡£¦~‚…ILP•—š’•èïøÐpc¶ªIDATxìÝvÛ@@Ño³­o3î‡enM­8÷Òž†àE´ÚnÙG¯Û Gå³n§ÝŠ=Œ'ÓY•ð‚ªÙt2Žíæ‹~ùGýÅ|ç$.³°ÜšÅU¯Ô ·ŠU™ëc µû6M™YÅFíQ©Å¨;˜fÎŽ£p<˜ƫQ©Éh[M2O¢!p’9‰µæ½R›Þ<¶W9 hÌ4«q¬³(5ZÄËœ4h–ËX£Õ/5ê·b£ãÌã€&loQ»Ôª½mÌzШӵ+yR«Nlt–ç:ϳø³n©U76ªò" QYÅŸ•šÅF™ ËEEEEEEEþ7Q¼¼Z/¯.ËžF¢x`Dq´úËÇ¢x`Dñ:¾º.{é‹âaśۈå]÷nq{SöÑÅà Š÷壇ˆû²ž(Q|Œx*=E<Ú}ú–ˆbDüò%еÀHqêá·ÀšbÑDì>ýBpNñ MÀ6_ljâm¯¸û4"®.˾Œ €(~ËÛsÙ›&&Q¼+{ÛØÄÛ^)Åå{öî!Ab0 ƒð»iîÇjÛqƺÿ‘ÆfGߪž¢ò»”XãÄþ`8'ÓÙ|±\9®'s¢(¿”TîMì“Iø,z±ˆ·d @+I_þ­‰ ½h(‰“ñC ¿FñÁÒ•)QÔi=áY\ljÃçN¿EñÁ‚,,£ØÎªÉNõÿÒÄÆÃ—Ôùsß«}¶¼VQ¼”tå'ºÿí§&6”Æ(|3ù1ŠÑ,FQ|^4ojëÞþûäi²ÑâÞ8ü=Šo–›À&Š¥ÛŽ¾øçM©œ–û“ð»è»UXE±T¹gï<˜I²üΞÑF\©³¬·¬!‚ ‡ZŒ¤Û¡D»VƒšÃË6IÝ;êY˜¾>÷o7ó%•JxE¡!Ôhb"¿Ý™)²òe櫎¨/²²²ú¯ž‹BáQãsNüÖ")+ úÙ|¶•O¶·ñ÷r¬í]HloÀznysk”"çÿò_~ù§Ö 3E2W\Á‰DŠ„ï[ðÑ0 Ãó­OÁeok+ °ÏX 4;„`L4¶ÃX¼¡ç–7·^)JV\S¤V´Wyvúm*EÅ`V:“Íå >:¡"' _š+ƒáK`å+ENþ1ÿ ƒUöB7ÖÀc/W{û”nß_Ž|džZñgÞü|± µ¢¤žµŒ¿.XÇEÄHÑ`X¿¯žÁ=öƒ¥h?®í'–â ûÉÁmXJÄÉ™p#æüÅ~þ¯ßû.µâÀ‡x³xO)n¤¸"Á&ç+ä™hiµ †µK13žh³Âº¢Ý!JüVÈÛ¶,àüèûóRü®OÛV³¨Óí)®„j|uÆ.rzQŒ †õK1™Üä“þIÿT“âYâ$A•–LìžÛ¾R<åí4)n&.ÎÀźÜݽ´ÀÅ>ºØ=˜“âY2‰á›ý“ËÀGúK†7`?qºú·OWû‹÷ÉK6ÁùùåëïÍ¿l ƒB8SÆ£ž‘âj)>1=ñ<Ü0R4Ö/Å$c; 8¼bŒ ·¦R<}>â¿G×§ sReœ›Û[Š7q·—Ó.Î߈ߩþ4>Å8ÕP?±9K“âÉ]‰qmaÿo7]ŠtBøP@²ú\ñ¿ÂõCE<øùwf­ø,bPädPª ?¬[_)š™"äÄÓp0R4žRŠwLr+¥Øb’­€"¹ö–¢wµ+Ͻ`ÈÍp#†Œ.@p1b’7›ª¹Ý!»é\Þ0I*ðØR¤K‡«Iq…¹â_½û¼p¯ÅoGÁ3èG³VüõBÕ‰—lÆ )h·ÊPoЭ5'ñé©^¯×°Ùf­Ôv ’G!pIçµÚ × ƒ‰gŽÇ•fnÕîÆN$?î–3QNÃæ¥éqÂà„³¥Z·ÜŽÌôÖ㳑çG2:ËÒ²ÑÒ¸2.ô¤6"ùæ8ï“D”×Ê[ñp®Û-e;€ Tèãšl¯W˜µO&7® z“ =u>ÍÛ4Uï2r={R€ƒëuùpj¼“íÕHÑ`XC6z–èqäßr=îí½dì-(’Wløªß?¼ÁH/)Ú×\ƒw—'ü?7)Ñ÷» nÚçptÅF;ýþÎç‚пbŒ÷yXeì•lN9žñ_É€Ü{d)Ò—L øZqùþo¼ãü[Öub ýúášU¤¸‚7>7E,-FÀ‡>h[†ô[¯aieÖ@¯VDÒ”©¨ìv¥J6(ìÈT2-× !צ¾á$Ì•b¬6u¸Õ•v>®¸SC-Ÿ1`§G¡Órb7Àˆbz&©Áâ$¬ðìóžhPkÉ’Ú`nŽYÉõš˜ŒE¥è‘*-!#'ÙÓ‚p­&©ÕÂ]Šƒ‘âÕs—”&ŤzLº‡R|Æÿ½/ ±™8ÙõÌ[ŠR©³k— à§pƸ#ƆÑçóÙ-7WŒ«†Foî.íÇ—"ùÄéÃYmŠÿx§øÏÂ7Á—ï=ä»6 wTj£ÕÔªv ZGc×Ý´<.NO:,r«c¦T„ÂÆ°r âáŠlHJq²œÂÂp¦¤ØéºÏlcè'ÀKå>ö8/—N‰Lß%Ê`ëgj¹’b9Æ|’ËZQ+ÞÃ:^ÈûíÓœ¸®A˜È¡P=ÑTi 9ÉžÈÎQÐO$EƒÁ¬)^ಞ ¼e÷\ƒâ|kÈo)Џ+ÛkŸâ¶âÅì$Uö©¸åÈ'ï™ º“\ÏLq R´ÿêÆ’iåk}Yñ»‹Zœµ|e5ûrÆÓ»'ÚHœÝ¨¹+tvOú«WbÀAiå@!–:ÀÉ`C²dW½x†Ó0)E§éö i¥ X&“™€eØP²ÏXu,‰ÊŸ}œJ1k€OÒD¥ (ú¯ÛžÈöâ@y)Ì¥zòH•–Б“ìi‘¢ÁðôRL0öÅœo%ìv¦ØâÍvóâýû…R|φÖB)&˜Û*»¹=?g¾hƒ¤N±.®oP‹ç«Kñ÷׸¦¸\ŠÏ5'þ,á?Óx ˜´fW¾ô—o¤[ Òe–£¦P1)¨ûo ù¸O`É—AC²=5§ Ñp6•âqIºH½<ÓXÞ›7Ú¸ WoâD+Š–†é€ ŽíȤjèD¿$ÂîŒÜ6èòž)öÐfAPP=‘Ti 9Éž<½ #Å3õ(sß}|šÂ[®Á3À*EW~G ¥xŠŠÓ»ž›)&¹nßXÊ“—Û܋׫Kñw—¿}ºF)þ÷;†%¼¦ïŸzÑi7‹Šÿ­f&êý‘Õí”b²J±Œà¡5k4BJÒ"i¯p%m|HUŽ iìnVÄ%œ¥·Q&YÇn$šéË€ÐQÌ΃÷~ìx^ 2SÄêH³î,’"I•–Б“ìiÁÓKÑ`0R„ª»!ðÚ}ÑæÄ+új8'‹¤hŸ¸D“ÛÏúsRÄÞm¸'Ū›RÄÛ‡„—“UŽ"9dÕÕ¥øË÷)®QŠÿ£9ñ·a)¿~ègÁ;‘ö UD:ÒVmcyº{AÝ¢› aÆdu¸ËÛ±÷®ñ˜”" 'aºÛ iÔÝ’n¶3ßCÅrx61À0Ú!#g¸:==)¿$Â÷Žl,¾@^3EG$‚´Jao=ÑTi 9Éž<½ #Åø¦ Úpº%£zœ»áp_³ØHž½\8S&FB–²¹þû778œîåXUЏü‹6k”â/5)’ªþ/ ~–oã5"ï˜amFvì)E[JQV× ÎÜàÇK¤HÃI˜.EåFSucpU=4Ä¿6ê cÙ㱟}’°”ÕæzèLqzja1ë-E’*-¡#'ÙÓ‚§—¢Á`¤xyÅØ‡ý½O¯PŠøü´zx±Ë½u5ónéí~ÿ.ňõF«Ûw܉)‹Hñ\< Ý¿¸«b<ðÿ¾ÙßÝæ¥{ª¹}Þã%ø©·¸ëÿ‹Õ¥øGÔkô§k“âÿjRü?XÊgËw*’Ç}y¹¾­½·’ó)¢ÜJ$ÓæÿÚ˜Y×jYþR¤á4L—b­S¢Ywv;žŸXM²¸ZxÌOÅEŒ…cáåÑMHOÊ/ *EzÈLÑÅ —kEIxFOÔM•–БÓìi· FŠÃ¥'Lr-¥h}`’á.¸¨o¯½_,Eû9“Ü$€H¿aƒlm‚4±äyÀmÍ›:…ý!“Üž­.Åå3ÁuJñÿ}Þ=¥X¯—¾~šÎq\8ENNþ§¬=VlûÎ¥BVÖ@:Á`ÐCŠ4œ†¹RLP]–æœF¹5;9•ûzM4UFØd*­¬zAH¡I‘ŽÂg¦H/ï·Oƒ…®¼°8†º­LW¡©Ò:rš=) RT½) Nн—CÜx6B 쥄ÊîäÜÌl Ž>\‚Æù{îªávrĶCö ›éÞ ìˆ¸› ŸÛa£Sà$p§EõU@´¿%úxq šƒÀ->Éí¿¿â§R;GÚ’ñôR|§aÁR~ü3 ðb¢? lÈ<>p¬Çîg)ß™"VÈÑÄ£ÑhgnÓ`OÊ£… ¤R¤á4LJq ÁŠû®Óétâ (È*pW“YEÕ!6ªêÅx?–ž”_TŠ^H-4jt8èTäE˨ìꉦJKèÈIö´@—"íÕHÑ`XvòèÀ¾ÿƒ£s¢¤ÀùÑ2MYGIXÈéåÑéÌOÒ‡‹}~´ È×NŠŸÃX&E;ª}Ð3Ô² ¶Ê¡*ŽïL ê6î ð¤Â©»Îµš²!*ENÃÜÍûÒ­ôtÊUÎJƒÆX­ Ú5u(Å$C"­yÓÓQøÍér¥xlÏÙYnx´ºò Ø4ÖqœÆy¤JKèÈIö´@—"íÕHÑ`øºcÃ*)‚=˜~Í4Ó>n¡ 7:<ÊååÉ,øÏeõAa"fàžì´õÚ)R¤á4LIò8²¸œÔv3¡hF8¤¼¾°¦!+“ÊLÊx0cz¿$¨½.8xØíi‘x6‰6ÓZq9œ|oºƒ‚¦JK‹Ü½£Zq° Mù¼÷˜ÜÜXC[½¹¹1˵Jé0oµ[é/7QL² ’_9 øà<{²Å8 *þ•SGµn¥e ŠQ‘TD¶(j£I†§#€(êVÐ-gÞ}°8|×éBÍééDñfž“ß4FQ÷–í§ñÑ%û 'ç© €@—)í®Ý‘5Šzõm-ñíû¯©›u®¡ržVv¢¨8P¯Å²GñþÁgo?¸oêYç˜kç€(êNžßQ€(¾xzpøn¼úìÚ=>ÑÄFAˆ¢nÞ*2£âÖMÃÓðìÄóõuÚT9V¢è‹â$]6ƒ^)ÒÍÖÓ$ެOcѸãšY'Ì'¯Ò {ÿ¼§1»“ÚAž¡u'T;à_Œ¢zwJÝõ{óøh˜^6µ;eÒ¿ @Ý:º¾NþQQÔx´I›ë𯈢mPÅ£OìœÁSâÚ—Ç` A3e5h`ù~ӿ߃ųªKAÖü%óÌþ-Þ®U 6ª¨áKC4 Øøºç›á&´9^’†ž¦{ªç~6Ö)Ì9çÞSu?•)’B¡øuQ(”õù­ø×úUQ( …’¢@{;ç³Ó"ýÚ( …BI‘ôÍãÄ·ýÒ( …BIQðû?¾¦Äßþ Å1tú˜µô½æ2rE߯u$â[H+¡og#²K ÐÚ½©­Ǹ-5§ëÝ,=ÉÐra“á»<7 ŽV.£P(”%Þüó+·‰G4ëÕhiª¦tòÎJDWèGSn¨Òk:¸¡ >D£Ñ qhô…8Ð¥o¦ŠÍb¥vbÇ£"1îÀ$Î{ æ­Çëf)˜À-1¢Ñ}Zb%|—û™´áÃT(JŠüùWÈ_§ùxg¬ô ¸‹Ðfpú;‹œœå€‹Ÿ)ňA¢N>¬FµÿR,öœ))þÊ(JŠL‹og?8};¯õ`*ÅzÈG.K°I?½ƒ˜¾ØÉ™ÇRÌ”ô½¥øô¢ÃôpŠôB xGÆqéÉ[ïf©RÜNAIñWG¡PRä¼ùãߥ›Ä?þæ¤ÚqOŠY &ÎÒ’ýHšÀp±“s8™WŠ‚ï-EÝF²2ùÎé…,zúü&XªÏ,`OIQ¡ø…’¢N¤ýçŸüÇÛ¿~ûí½ýç¿~/’NóR²ûèxfJºWž9Î/Òª[²˜iù ãíuÿ‡­k3(ÏÖJ‘\ZÀÃB'çV£g.Ež?ð5ê+fpl”·|‹Ñš--@ŠûÀM(%zaIšòqåðkëyj²r×qX§-=øÚñöøµ†,8eà,d^rÖâÊzø0e)òãÝ– ´Siï¥Ú¬ ›³B¡PRüÞÔ›Dž‡ÀÍâ`t "¢k•y+FVò:£Mè5@»¿N/"v%ç!­$~shÝZ`YÇ´mYû4aòºaRÌÂÊlp)òüÞ9jD-«J”¶&Z«Z¶~Ö°ºA$Å¢{€“ÓI`F-ÀÊ–gJqûñQ£ E¿{–X‰3Ivß`ï™bµ–5ôÖãëFë;“[žèû€½òåÌulÜÅÅ>Ë×~H°wßp)I’"›˺nY‹‘Ø;áÃäRdÜ /-lÇî€DDÞ{^›“Íùû¢P(”»ú"Åôˆ´Ó÷câ[ &ÊÌcD‚„›=¸TIX‚KûÚÿa¯)å'à’6ÜÒÕÔsÏÀAˆ/€q)òüÞ9jD¨AtƒŽhΉúb±¯{Orz ;‹³üMSL62—ÔÑDŠÀ™·_7{¤Ö„7Gaå6-¸<ÒŒk÷-ªLC—IRäóbYþ‚K &—"ß8ÞM`éöòÞóÚl˜lÎ …BIq xRLad–,É^ÐhwõrˆÉRÛ@õàô1å>ÿ¬‰Fó¡$‰h=ëþêêÞB{ýužPÝZëÆ€*VÎÛJ¥8¯µ6’k\Š<¿wŽ% jø4¤Ž›Q iΈ‡ÀêßO;«À'q;Ä/Ÿö€)Ä‹4å¨R@ªR9"ºòõÉÕÕ )Ùwåý¤[ÎÈ«›•ÏÙ™å4ãëÓš ˜òµ•¬›î飮!’¤ÈçųpÍfÚ‚£…“K‘oœÜ\Z$@gت;@QJÁkóaò9+Šå ¤HÔC6 —¬Îþ›àA܈Šš$Å’÷nN³ƒÑ°·ÜŒèŠ7Å {'.N;ÚÊÇ"¾¿)Î)Åà™¸y~ï-A\ïÓP¯> £À£o‰"™IXkDu ýfb«| «ùÕP0iÆßK±ìĺƒD ³ÆD[w8!¢k¯:õg•ÛŽÅÄâ†À¹|mß3ß³*Ei^<ë!ÐÙö¶c%|˜\Š|ãänäÒ"Þ{/ñv¥¼6&Ÿ³B¡XJŠd€½[/o¶(“Mš<$)Æ7Dxž«‰_}/"ó>÷<ù°@‚8ò¯óÄáŒÉcQ)f,ÑŸ,Å4a± Ü—â®5{r|Õ¡”‚׿ÃäsV(JŠK”¢]ç”;\„°i³¤¨Y¨Ò 9Àÿª)ߨp^ç¹z¥ýß$ÅS–"ÏD…¸Ÿ¦«HÉñ=p.Ú½Dé/‹IYª‘K÷Û@b<[ŠZëùý¦èR¼smú_°Eh­‘ P®¼ýîAܧñkýS8•¢4/žõpª p>L.E¾q¼›ÀÒô§‰s¯SðÚ|˜|Î …BIq‰O!A„½‡zqN5#Kñ ¸¤ò°é…Sø8|•G+€ÛÔ–â&°K²yþ3²;ú4†)Å'x¡ä_L= Dò³¤x»ƒ PŠ ¢¢P )r)Í*g–l¸ä¤k·¿L¡*Ei^<ë!™^s>L.E¾qr7riÿhEíÀ½'>L>g…B±T©mÐ$A ¸§ÏâÂ`KR\ô lb'0F´G‡¯òñ®ïÀÈ\PŠE©zùx•r@Ÿgì/ Å<0rÁ¨*EÎ °.K1à./Ì+Å(î¼fòËÕSœÄêÉÿNŠ|^<+—bø0¹ùÆñnXé`)ò¼6&Ÿ³B¡XJŠDYàš×@šæç„HòH >‘¢~‡ÿ.ì-ö¬.G9ÀÈä Ê¥xNÞK± ?v@þ3 ҵЫ<>mËq–FS¾úø´ü4&—!Е¤X´`?BŽóI±œŠPw —KUsò¡$Å…Ÿòyñ¬\ŠáÃäRäÇ»a¥ƒ¥ÈSðÚ|˜|Î …bI()Šcù–·@C>—…°²Þq¬&R¤†ˆ»Ç ¢ àƒˆ´ãÛQy¢€<æ Ÿ›Ósùlq)òü⸾ÚÜ/ÚœW4å«/ÚÄ2HP®$)¾ŸnflN)n£5/\.GÛ,Kq¡mø¼xV.Åða2)ò“»‘KKRä)xm>L>g…B±$”‰ôqçT±2M¹ÅÄ=Ñ®ðÔ™÷’ä1„Kî!MO‘[ðÞ)Šß›"ñI²ð*Oe4Ò„6b>)ÄYhKQ_ñhÕLpŸQØcR약öjr\'á~2yNTÚfð¿d4¼ÅQÙFç£$Ås·=[sJQ/ùó7Ýf•K W;9SŠ}àÓ|ÿ’Áçųr)†“I‘oœÜ\Z’"OÁkóaò9+Šå ¤8á°wLóÁªì½–Ѧ}pÄmÅ>оØÊä,WЇm Úm6’À¹{H&•ýÄýß‘ +÷|´¿ ä^å1RÀ§ŠQïÇ>)Ò*P}_$à—â8•Š’ ÿîSžß;Gµ8ðè—"’‘æ~H™3â40Ú¬·jô¼G»•ó==¹ ³TŸÍ§M¸!IŠ-8—å̰ƒ9¥Hf‚Þ är7@¶»uQÀL)Vz°ÒÏ×g6B¥(Í‹gåR &“"ß8¹¹´$Ež‚׿ÃäsV(ËAIQ…GÉ /h#€Îßî¯ìÿš7ï’\ì•It:€K^gç΋b¦_ŠÛÞ'~)vÚ×¥Èó{Çõ‘ìû4”…`Ф±Ñ‡Kç@úš7¹‹ iC–"U½Ì'óJ‘êyˆµn —k:de)ú¿X-üñ©4/ž•K1|˜\Š|ãän¤Ò’y ^›“ÍY¡P().(äòÁ€AÎ z­  WȸQÔPhñi€•Øõ³³w艣íˆ.çÉÄR5CÀg¼Y@oø t‰h€´û¤r›d6€ýÀ>?¹ç(Xè­SW%kµ€Ñ3ÑŒ˜ô´ÀÊfHðÆû†î*z³ºgmƒU~6ï!A‚¡ `´Q›JñÓ—õL»±§Ûß&—­î!QiV¹£ØÐI{ï»H×>¤Ø»&p,IqHl^rÖu á. Ø ¦X‰·Ë|ã‚»á¥E¨ÍR°ÚÒ0ùœ …’â2Ñ›;»ûEzÍÇëºÏ“õ–É>leÖ|Ê+czÁlµÌ€»œB¡P()*4`üó¥(ºX&Å\Gå …BIQafKô]øPÍÉñï"˜Zvõ$÷YûAåþ›½:& &¯þU÷ ‰‰HR)€@Š E"H¤R)€@Š E"H¤R)6@Š E"H¤R)€@Š E"H¤R)€@ŠP“â5HñÅ@Š E"H¤R)€@Š E"H¤RÜôÙ»£§(®uñûƒ¦ÀXpªÉ8³Õf'ÿÀ[‡‹3¥!ÖÅhŒ•1¹7ÉEnѪhLR•«˜@©:?£¸b½ˆ2(*¢Š0ÂRÑœ­ž-šÅXïzºWcÏšf°1ÇàóÙUÎôtOÏê™ßÓ=ÝsrÝõ庢¼¢Þ˜ÏB!E·GŸÇ Ï B!Eo¡®×>Ò´i9zLüÛ|äp­®zá™@!„¢è/Ö[ŸNàÄñV½Ø3!„Š"6ñdK0Š–“TEBy&P½ÉúácÁ¨ŽÖ“½0ÓB¡(Vè'íMli;µûàÁÝí§ÏØ«xR¯€ŽBEÑ­·¶-GO/u+?{âq*[u7Ìl„B(ŠýxÐr®Þæ§¥ãºf4B!E¿^kížøÒ¡¬ÙšY«ûa&#„BQ,ÑMÍß¹^ÿ³þðŸŠ9û°^2QWSabç;;Ë 6OtmË:;«àÏÐÕºO…´ÎÎYð‡üéÖÍŸ.½³ó˜ /áÕÓýÍG6÷· ^üj±‚(V ` ¿,oÊèÇ;šCop~¦ ®í¯Eô4Dq„ó+ðôGnqÞ燉iØžù ¤.d¬ž”Ù~-JcÁXéBQ\kDnÕ{"‹«&E‰¢¨ýï¿þõÏ£xO«y!¡Ï»)› Šg9çÃ~ o‹»»¢8Ìy;ØÄí^V«k`Ù•uþüÎ$™XŸ¯´‚ÖÅrÁ®´\P]ÛÄQÔVuÕ–>žôduÍ*|<¹¯ªQb¦ÇÛêóy•Á¤ú|>ó™âNHê°ŒƒÞZUŠ$û|0|ç󥈵ÏôŠ$BvcU½2B9Ç]ÖUVo›Nj<ß„k+l\ÖäÉÛÖµ»ÂáEñUEôF|¾]€²çw5êØUpÎÏ?^ÑüÖ)€ÜbZ³Ý‰Ee;”g×δ†LãMóxpëÞQÇo¥2úÎyLlc¯!u?KG©Ï(ŒÓ²õ$ÛTÉ’ Æ–/М&^cÏCLQ,”/©ªß¡ˆ~#‘LOÑ;â€èúãE¯$µí5b è8mì¡5á®(>+K!Î9ø[¾ä}MN/zµ&þ†·}r뫌- ]rG¾(ôsd¾žnŽŒ¦Ù·±¬õŸêÿv âëÕŠ{`݉ÅðíP>íNt5ˆ Æ8h˜óêøí£TF¯õàò+fãYZ²¨^®| ¯TÆ›K¼ÂÛóýN9¬´j1y`¡ÙÅQcªú°Ò„=ŒÕ¼²@Ø_)–ª¬¬Ð++ ù*+KÕ(~SY•¼‡Äj+_L‚H³+€ÄÙÄ*÷~­!ÓEÈ__¢µëÂzœñEÀô9fó«­xõ½\> òG1»1kÍÆg)в‰ÿ«ÅÅë.ôjsPqb— ý„}ŒˆânÎù-n´µýÅ,Î;RÁ’9Â¥ë‰ú3—®iæŸûaã0¬˜s…›:Ê`µ)QÌ qÓ@)¹ÔQ By7 ßvŽ¢2˜eâö0@¢(éU7HʰpÀ·¯ÊÕŽB—u$ï”Ú£xŽ YêqÎMnª Ÿ>÷›|™Åa6äU_4,+;z¸Ô Ý­P^ïᔢ(·Cýp:­ÏÔ)ŠÊø•QÚ£ˆ[Ö¯Á„F¿e{‹Àæk1žuôìg¦ešŒ’á@²}j6 ºJf¨)U&j˜a¿/cû¥3Åel±Îê™a¯T)•ÆŽböfz™–(b×€°Jm]Åümòþ¶js­Yëòž¥(ÆØDÅ,:ŒpÄ…JŽ–ˆ(žâ—[¨Qüón°xñ¯ê½Á³æßÝÑ6.’3x­_¶õWŽÆ†®ƒö#þ m¿Õ+ûá¸6%Šóû8ïøõ÷+!Îû‹ŠÄdïà©_;DCÀ›‹ÙC8×Ŧ[X‰Ó·n•¨ƒÁS6CK¡]L•¤ Kx솱ßT)!Y#Œ;Ø¢( \iPGhÌé»{ wätÏõ61—»vû ûúÄòƒíw1;/ o‰÷Þº•pM¬î‡ÅÃâÆ1Ø»2k¨÷G\o(+ö(ZÛ¡¾ µ\¸|Úì›EuüÊ(m£¸ –(‰½"âS—4a³0–QZœ¶—±ùæ 3s² 2ãpè׌}¿¸pñ÷Œ­€Ä¶·t´¤Ž±ç”‰’ñlï‚%“Œ"c/ÔÊ…›ÅáÓ•›7ox=ؾaóÚOÕ(¾%nòó6}¼ý E1Ö&Ê(z]Â?Ž#y\Âߎ:}§x ÿ FâÏöÝ–.:¡¸{92öûx· [LòdóÏý°Çú <Éö#jêÚ”(Žà^Œ,õY€Æ±±ÛK`P ^LbIŠŒ5:Ÿh£Fïc,ù¾’2,Ù§³@•RC·èðáQl×"Fˆs°*²×Iætoœ¹¶P#@ýe1dóUztø Û¥¾¨íT­Ç|w<Ý##;a\‡ù¨É ŒÒ_™RÛ5õ]›u@ëtŒ¢:~u”Öèå8|0±ì¹xh3!cѨS1QF[ ÷àd6cŠŒ8aŽŠD!ýàžUz™Ý„ºøøÔð ë;ÅÉFñE RöDîš;Š0Ç\]ÑËñu@È´DñÑÖÀzø*øPî8~f?ÑfÍò¯ÀÆÄRJ×¶å@þ§Ë¿xv¢ke›]ÂK_Ü7~àæŒEë<wÔ(zEZÁÒÎy¨„Æsç†Fñé!£;9ç§Ì?÷q€ºä4|Æm絩Q,—ûU u‹ÖxÁ²C<¾àk\»£¨ F¦Käª7,ê°pÀ!¿I›™©róÊâxÑq„8çwùžaLšä k¢Ä# Ü«7[—òñFõE•(v—€"I®Õ\ÿÏš<¢: M!ŠÞ…Ñ>yF°vÅ)ŠêøÕQÚ¢Xf|TQd¿¸‡¡êŒL5ŠF~4@‹æ¥Ý[È=o^:¼)¯+ćuÀÉoÀ¤LÄÅ%€žcsA±ÐÜQ„V „Lc±m[Œ?Ã:¼#£h³&x¤Dq]à£ÏÚÙ§17QFñŒ µüäBcNQ¼ƒ;UQ£ˆIJËuÎÇÂ/ޏ È2rñ«9[Ööp;¯M‰"¶, P§ÕÖ̲Öû‡Ì¿´?Z¯•rŽ¢:á( ó°~µ’}ÎØóu‹…=jwí÷ð¼JkA›&çµ)QÄÞ(Í|Ž~.ĥůÛÀ0ìEu0BzˆÛ_ bX¶ß5ï\Ç­×H£=ŠG(çÈÓBå’òeîX;Ö˜,›_Õµg¥ð7ôÜ©WcfÝÛ V…wO!ŠÞ…Zã_”åEuüê(mQÄ|.ƒ?T>¯†±x5бY`Á™öN½Ì$yªÍ›{˜P½ÌêDlQ¬áˆ(¾È*J|… •ñ;é‰bn ðFÐ&×Åœw×$5Š?  õ+ógtÿ‰œb•=Ų ƒVºªFÑ:yóü™™©Q¼dîuI·ñ¯âc÷Æ#؋ɲEQ,ÈÇP¿¸)p^›Å*³,rTÐp† }½!3ŠÃãë¾çEu0ÂA. {9Kížë.À/1•(:Žp’QlÄ€Œ!Þ;v-Z¡¾}˜†SÀ¢[;rrÏ•a§Eå]Øm½ƒÐèEuüê(•=ÅÕ0 )Õ¸‹¦D±÷í¬K$K0±„4ŠVÏ1bµX˜ž(&3vLZÁÂj&|ïB¦%Šb×ðS3ŠŸÛ>yßůČ-ë>XîEÈYõñ6#‹›grÿ[†0Ö&*ß)¢ÔcÁH.ÔáÅ8üÚ-U6±Ÿó›j10çÃ~¦»bMâ÷^ìQ¼¨þHKäÚÔ(–qkæ-ãoü5¨®d€¥fÏZ¯å9GQ ¤sôó°Ô>yûEv~‘;šjÕN6Š…âáù`‰ETñåµ>y˜Ôé;Å_¬=n¾ëñ.^WlQTÞ—{Æðp<Š¿ÂqÔñ«£´~qôïýÙE }ÃØ,Ý0ÌÁ(z÷°Ùá‡O“@Â'TzAá_/Z•©NØ¢¸ЛSˆâkrGѤy¾]ÌB¦#ŠyÛ“Gß‘³XQ|?ض)ŒªQD9¹+E?žÉQ”)´Ý‰5Š-"x~ë ©ªÇ…^PÎ>µñyçñå_ªQôØÏ'´ö„Öá± ­ã‰iøwÕE±à€oJJ½óÚÔ(âm cÖ¯èÓYëû³Å ¯­P¢Ø‚:¼ü£¯M”Õ>~eXjŸp%GdSÔ(ª#œl¡ßjYRJJªsoƒ y½^<¸…ÎgŸûqôbˆ=i™Ëë±EQy´ó´]p›ïÎûpÚÇ1ŠêøÕQÊÑ£ZåÌeÅlV™2~—y^”M­Á(B›£*­ËØÇX Äº¯ËaV4Ò2 Ÿ2aE±Ðú-¹Õ±GQ7ví2kDÁ§¡(æˆ=Á-ŒmÞË âr?ò @룈ò·ÖÏÈ(*UœZ1мF:x,¨ÚíBMAÇ(Îâ©T€ÔŸðâ;¯Å*ã4ÇqxE^=@ù€ñ±ANúÄd(ÅÅRüúÉ zV¬ ÑqmòôËL àœ¼2àŽ¸4fk¾ËE³ý;@ËêQ´ý­¿î…ÈÁ”†Ä–¥ˆ‰n $uX‘}:(ñ>·cÕN6Š7åEüMgŒˆ©/Šðt¹'*V™}öý[y4X¾ ¿TE7¸ñÌzÜÏOH ÅEå]Àò;IPò#7£8h°MÁÇo¨ãWGi=Œ~¢O”F´«šÕ$µò`^aò÷· F&1yÚç!Æ  ^^’;æÎ]$š–oÌ›…½³OØ¢¨Õ°x#ªbâˬrþ#!a5 ½8¨¡(>Zõq\i<²nËz3ŠŸÊ%?“qT£˜»mÛò> ¼7££(«8µ&b±„§]†vµŠ']†ÃÎQ„³\èé¾âÂ}P£8(%Z‹¹¡s#!¹ÛöNv“çÁEcNÿõ‹WÅMç„kÃÞY²Aï7½C=¸?”mªåWo´áfµ6c¤87,ŠÙ\èŽSã½ÍùX"´ËÍrVdŸ4œÃ¯ƒs•N6Šz?ìÁÝhŠú¢rPüöÐ.‹ån¶?¼¾C=$†,³†B—q ûv˜¹ä=Wîq[Õwa_‡\­Œb«1žnã¿¡Ž_¥5z¹AýLl®([Cajr]y,²€±½ûŠ<ßTšQ,Ú‹ïÇÕ={|F2ŸÏZ°#C<É<àúýÎ]ž´VãØÉXBibjC5«ÖÂ&lQ„ïÅê ³÷Ía1GÑgûFQ jõ-åßþ sBQüêÝwß}ýÓ"~9 lÞ&{{Çë×qRì@¾µöÈ·+7m1ŒˆbžxÆšUï¯ú xwFGQV1Ö&*¿}ú‚Ëå{Õå*ë Úœit^j™ Љg¹¥o5DDQ”å°Ñ.qSè 'å³q){cìsÚ¼ÊÚœ£XP:ÀMW+ ½Ÿä%9Æ WFd%sDKÕÁü`^áÅ^ñR‡åE¸À…,ç(ª#œl¡ÀzZßb§-í?”ÖˆB¡ßA’Nj㬗éä¦VûϯÅvø4òÃ9/§n˜QL=Ç #÷0ŠêøÕQZ£úñ<ª( Eî¤Ù£8Ž™á~§ˆó÷[sÃæMÇeÊ©=àÁc¢¥ìÛÅÊ„-ŠKj˜á嘣/ô¢ù{äÚãÝðï EËÖ•9`XDÛ7@ÎògÞÖ [>ˆˆ"|¾%`úä™E¬â”›ˆQD÷]®‘æ‡b K/t GN–º¤Ú cQÚGC鿤}7%3¤ž9áíÄVõ4‚aô‚‘®±.@m¶“S½æœ{­£0áÚ®òÇŠ éW±︞ H¿Ò'†uj‰užGò͘9˜tEîÊI™§Æx(äSSÑÁy›uvÌiçaÉÛîøpçË;žÛŸÍCÆM€”Ê9òÎ>Û´ña{aß|šó‹6\ï ÛT~óÓ×½X=ªu]~½;±ÄÙföæÎ’ã8Tµ)4Î>µ~¼rÎ,û‚W¿Vhôœª|Ñ#çSûã=ð"›cmrB¥xxµ<û´&<Š5G±8ìEO| 9MB¦,g­,Ýúíïæ?¸i{@XÿE ÷ßÚ¶£˜ó^’ñÞ¦•­"ŠoáEŒxiã[ ä~"BºuÝÊ<˜éQÄ*ÆÚD%Š-ÿézézËn—Ð4t»,;£FÑóUK4pPf¿ô^ò–7¥{aܨ§©©ÐñÉ£åM™Ñ×!)}‘Ï ¯Ï£M¦O÷‚¯4ú`"‡;u„±)J?(·ÅYªL»öéêr·9²íëÕØ61{_²æ¼Âp‰Ñß-® @F§—$E¿2J9úN.¿¦þÍYé~x,¥Ü>~ÇkVIqvØÔ‚QÛ¢É)š:¡JLÞ5 -Ó$§Â“@È£ÜÜG0.ÈÏ}g‚¸BÎæÜÏÆ/Úäü×i0%Åzs]ç˜v\]ìrýýDÐpì—t!ˆšõbˆÍCÎG ª'¿6r^þ¸žŒâ¤$sE*ü1Å)ÒzqÇòÉ#„<Qœ:~Äl`™ËuÿhËÕëcö+QÓÑ :¢{ 6CœÿQ=ùµü©ÕŸbŒb1WøŸxWsÞ“ ÿÇ!ÅýpÐpb©ËuØ~öiœË×4ÖK &Ú@ôß²üsÖF B¼cÉÓEw/ç­ðBQôëµ'd›\®W¿l- âwÍrn­î‡˜d>xð b4ýk#]4ĉ7Г£•‡›ÔóÊŠ•>xЩÁÿ5BE<úñ éè}—ð÷°(Va1ÑqÝ3!„Š¢[om JÃå.×Ú¾S¬èJ-­ºf6B!E¨ÐO JÇºËæ¥Ú†¡ÇŸÔ+`¦#„BQô&ëx‚M4ÇëÉ^˜é!„PÁ_¬Ÿl FÑrR/öÃÌG!„¢ˆUl=~"8Ç[©‰Ï B¡(‚·P×kiÆ#¥G[‚6ÍG×êz¡ž„B(ŠÈíÑ'äqóƒBErÝõɺ¢¼¢Þ˜3!„Š"!„BQ$„B(Š„BE‘B¡(B!EB!„¢H!„P !„Š"!„BQ$„B(Š„BE‘B¡(B!EB!„¢H!„<(Š„BˆD‡O !„úN‘B¡(B!EB!„¢H!„P !„Š"!„BQ$„B(Š„BE‘B¡(B!EB!„¢H!„P !„Šâ—“讯(×åõîÄx†B¡(º=ú„!„¢èMÖ Fuì°žì…™ŽBE±B?iobKÛ©Ýîn?}Æ^Å“zÌp„B(Šn½µ%h9zz©k\ùÙSÙª»af#„BQôèǃ–sõ®0ÿ8},(×=0£B¡(úõZkðÄ—®eÍÖÌZÝ3!„Šb‰~8hjþÎõ’øŸõ€ÿTtÈÙ‡õ’‰ºš ;ßÙY±y’kKõ‚ƒ]‘3vwv¶Ãô˜þµ¶wvî€i³àùÅæ¦[7ºôÎÎ`2¼ð¤•ÏZ–æÕ¬º%0Î3»þ²Yµý­<€œ•¯o (N–G?"›çr”Ý4q<~š™ÑÝÃyO[­hßÅ‹SÀFsÓ`:ľ¶îö÷ýT–Æ_B#w< ºÎù%ˆp˜ó{0=¦­§8ö‚biˆ‡&‘¹Îy•uó§ËìŸÄË~óJ5›ûbÝ ã<&¸Aµ‡-ƒqs+…èg:”O!›¶–¯ycÄ"g} ° /øŒ¢8YÅzs;(ðªß&ñUñÏwGÍhêÅ¡l€K—ü ´Š{KÁFÃ4ˆ}m]!nº5 †N9=P¥nç}qÓ¯®ÁÁ®¢ësQòàà õÄ1ÎOA8í çƒðÔEQÝÂVÎû3!ª7÷3SB=<1¥býÏÍöFbcé]Žž BÞŒ[· œä~üñ&ˆ´.Ø@QŒ® ?¹„«Áþ*׸ÝWuàm{Р렪 ñq#j­?€0 b_Û.„Œ^A|ü@+ØyE_.Â4DñgÎÏÅÅXŸ‹æsÎÌÆˆ’B˜4±}qO_Õ-Ôúÿ¨Ý;Efâ¿©ËØËXµž”4Æ @%£ÃáÓtFQüP×-_¾ü½m¢Š[¿«Ï!BNî[æP´ÿùçÿ‹1Š/¸Ü'¼zº¿ùèÑæþ¶#AÁ‹_-öOÅŠŒá—åMýxGsˆâ ÎoÂ4ˆym©bl½;ýþbh‰°šsÞóufýù1Ã6YbÎâ¿\ëEÞB˜ίÀÓE¸%ziØžù ¤.d¬ž”Ù~-J'É;—H (>qŵFäV½'²¸j²Q”(ŠÚÿþë_ÿŒ1Šçñ´š‚Jð¼›² ¢x–s>ì¡ð¶¸»Û!ŠÃœ·ƒMÜîeµº–]YçÏïL’‰õù*@+h],ìJk :®Íëóù¡h~ëÎ<>Ÿ ïy¾æœ4Š;epŽó¾Rv‹~›¢’øJn±F ¬;V¾’wW-òDÌ—½µªÔx4Ù'¢4âóí2†€ƒ’w&Š¢æÉêšUÊsoCZ×î °dÏïj4ß³L¾Á­>¨M<ì*ļóo:ðèQ”ÏÎn¬ªwøvíLkÈ„T±ˆWÝÌ(CW¶°€sž[ÀØk`HÝ?QnR=žQ§eëIð˜¿<ÙÝÑòšÓÄkìyˆ)Š©ø"ªo{óû(G“³%&×Ãt"EôŽ8 º>ÏÚܰ!׸Ÿ—ÿy ðF~¾9#/wíŠ`ؘŸÅ+Öâ3ž±(bÿõß±E±ùo.t"¨8ú‚ uà—ŽQô÷‰ÎøïÁ܉Œb¶˜>ãê0 ›”ù£1Ù78 ¯œ•õ˜é“ns.7L´¶&1±è”ïÔ†8Yçδ¶µ Z"ÿ÷ˆÕƒá*çc É'œ¡V,Ya»ƒùÚõ#zw;ÍÇû.sáJ2ôsÓcœ?°*~c¢(fõrÔ??ì¹B•1#tÉ ÈÓýø‹ÐóÉ÷8CÜ‚EÎ-|kÔG¢|v¾ÿYŸƒv'ºÄ¿êfFº²…Z.?±b6ž¥%‹ àåÊçÀðJe¼¹Ä+Œ±=ßï”ÃJ«“Êdé8“Å/CiÂÆj^Y Nì¯ UVVè••€|••¥j¿©¬€¤Êʬ} âæC8O%[V3*¤¾XÃØÜtHy ‡4¦¡(Bþzüš­]ÖãŒ/¦Ï1›_mѬïå‚ðY ÷8ŠùÛYk6>KQ”Mü_-¶(^w¡W›ƒŠ»\è'ì£Ec—ëH7ÚÚ~ŠŒbç©`ÉáÒõDHý™K×43ŠÃÆaX1ç 7u”º6ûßî›ÜôÐ|å*Êý% ÛJð>,háèš Š—»¹¡/Ý9Š·¯rÃðhÌQ|È¥ŽÚðdd…äÄvôp©S‰â>q» lîrÞùÖL)Šç¸ñ9tZŸc£ ]ɾxçú5˜Ðè·loØXÑxfÔѳŸ™–k™-§$ƒP(gî¡®’jJ•‰¹”/cû¬o#¢¸Œí€"ÆÊ'Ì;í{V$LJ©~¡=¥˜á dz£ˆ\Â*8´uUXó·ÉûÛV¨Q̵f­Ë{–¢ce³\èx0Â*÷Z"¢xŠG\ ¡FñwλÁâ=ÇEϘŒGÛÄíÕÁký2W¿r46t4Ü=j¿ÕËù@éDkkâ¨÷ÇËØ¸,Èìãüº\(” ’VÞâü7ù‡ûg0pÁ>æ&ç( ¡‘»}8Îl§( c7n†Ìíyx«_ŒçÖ­´IE±¨O,Ê…›ÅáÓ•›7ox=ؾaóÚOÕ(¾%nòó6}¼ý E1Ö&Ê(z]Â?Ž#y\Âߎ:}§x ÿ4Fâϸ—`iÀ€»—ó!óü–n/@¶˜äÉfc†=ÖŸåAH¶fS×ÖÄ… @;®àç£p›ó6«Ú}س¾N „Aˆ`ƒ\Þv÷DQį!ý#¸óéų@•¬ºu*ɤ¢Ø86v{‰V½í¹¸Ö~3^Dë1·ÙÓ=2²Óv¢|•K`Óa.ª¾5SŠb»æð9àûp@ëtŽb´¡Û¶PŽÃËž‹‡62:EÛc´µpNf3v „CFÓ20SÂ,Ææ,2» uññ©áÖwŠ“â·KdöŠá±¢ý,¢˜!£þ¢f^™ „Lom ¬€¯åŽãgömÖ,ÿêlüH,¥Dq}`[äºü‹g'б6QF±Ù%¼ôeÐÁ}ãnÎ8Eñ,Ö$j½"J`iç@œ¸Y ¦‡]ß çwü²¨ì7ŽªÂÚÞEñ<q}§(†ü \ÆG‹bRœ¤Eœ}ºCÚz.¦$ø3€[‹“Ý%`R¢x‹÷X¾ŽoMìQ¼èô9ŒöÉ“µ+ŽQŒ>t{ËäFO(ûÅ= Ugd:DqKÐ-š—fto ÷¼yé F¦Œ¥^xÓ~Ó>s_T*»*-d{„G±„Õr¸4!ÓElÛãßÀ°ïÈ(Ú¬ )Q\øhųvöiÌM”Q<ãBíA?¹Ð˜Sïà^Ô(â_ü°\?Á¥›ó«€ü!ί{\Û[hXdÇ=ÁÚš¸u*ê2ãph¢¹c‚—ïYOiíé0²¨Ü1\1Δµ«wÂ(¦Ø®upúNÐ9·¢Fñ,—âìQÌ,k½ÿpH‰b²˜¹…Äßðxihè—2odo†¿Ÿ:6Üñ­‰=еNŸƒoü ÏSNQŒ2t5Š¥ò%¢pg½\Í„ç‹"¢è­dá¿Kã†q^Ææ°j·ˆësuq ûDÌQœè?ì_*b"Ó ,Š5 ÷RK@ð0¶™Þ(æm lx¿A4[ò£¸yÃÛ¾P£hLl]þanÎ âÿ÷ÏÿÑÔ&ÆÅ~ê :¸àBÃNQ|ˆq‰ÅûV¬Tܓܿºk¿‡'sZ Ú4)k³ÿíÞ ¨ÁÇ£wåW‹’?«ÍÚÒ¹áf£ý$VãÃE± ×8p>ûÔZCìQÔÏ…8R¢XËm~(¼Ç =wê•(âZûÕ˜9¾5±Gñ ÓçPkü‹²£eèJ“Õs„œ•Ï«a,>"ŠKìa™ÂÎ\µ)xsª—y”‰£X¨ÄþÚÞ¹l®7<ŠÕEò¤£˜¼‡´ÉµE1çÝõIâÆOhýÊüÅb•&NqO±,è Õ…®ªQ´¾œû$ffjD/»€–Ûø§ò±{ãìå¼ÍjŒ\¡~qS0ÁÚš¸u0µÌl ØÝ§^—úø ŒŠª‹?^(ƒ.Ü}šÜžâ€=?ÓÅÂñ(6œáB_oH‰b#Vd ñÞ1ÜÜúöanNùã=ÅV§·fªQT?‡Ýã¯ÝèÅèCW÷WÃ$¤T³=^%ŠØ=ûGü²,X…c v ¡{¶z*ƒ}bZ¢¸Z<š‚¾gÏ/XJQ$JÅ®á§f?1¶}ò¾-Š_‰[Ö}°Ü!гêãmF7Ïä(þ· ¡ÚÄ¿SD©Ç‚‘*\¨Ã)ŠøõÝíTÙÄ~Ü T£ØvuÄ Yé NZ_†=°Gñ"þùT©kk¿ÿ¾¸· @»ÌùýÝœ÷xAh=>}¼¥!/H2&—a‚ï›@è"³ê0¤ÎE™y†Š×/EÜùìèJXªD±Ðøj4\Å—×Dëy{,ß)ÚßûÀcˆ¢ú9x¬kWà¡Eu3£ÝÅÅÑ¿SôgÙ._‚Qœ†9Eï6;üðiŒK¬dó@á_/J˜©NØ¢¸Л1FñEf7‹¢HþŒ(æm7N}GvÎbEñý@`Û¦0r¨Fåä®]üx&GQ¦Ðv'Ö(¶ˆàù­ƒ¤ªzÁáìSy6âǧp~©FÑ~’áyëlÕÖá± Åäù“¼ËjŒ\pÀ ‚7%¥~¢µ5Y?§ã!”cœ»a趘¿VÛ×ÝÝæµþ"ßQ®,ñƒPfUåúã(>¡ Äy§:ß9Š·­\õákùø„gŸZ¿° û`n¿´¤””Tм^cОÎ/É(6>þ}ŸÎ>UÞeà1DQù´ótapã'©nfô¡Û¶ŒJ/… Íf•)ãw™GÔGÆf´£ lލ´. `c €ë¾.Çn¾‘–aø” +Š…VñV?õQ$ű'¸å‘q¢Í{9áQüBîG¾hcQþ–Àú™EµŠSk"Fƒ×èBU»]¨)èÅY\8• ú“ÈF¿Wb•qîã¸.zPP>`ü•l“>1J±G±¿“ò¤ž+Hœ`mM\¸TE7¸|¢¬S]ùï£Þ;ÜÈ#>zRÆÄËùà±V«Õõ¸ç›zÅP•|—Íz¨óÕ(â<ì}+@Ê•‰£(Ö9¬¹îÅöçÞä¼h:ƒ%ÞÝ0.Ã|(·úºPjGäuŠmo2ð¢¨~¸9w’ äG.Dnfô¡Ë-D£_§ècìhW5«I4jåÁ¼Â2äi/…F#“«Î–—dÿî4úÚÜxÑ´„øl™©Ò° [µoDõ@ŒQ,Ñ¥9l®®»)ŠäÉGñÑš€¬ŸˆãJã‘u[Ö›QüT.ù™Œ£ÅÜmÛÖ€÷Qà½EYÅ©5£ˆ%<í2´«U<é2vŒ¢ü®¬§ûvˆ ÷Aâ <•Æ$+sn—.“§ƒ†ºÉó`¢1§ÿúÅ«â¦s¢µ5qºŒOïÛ!÷…^ PE®ch¨ÂWŵ]»> ì(Ú~§·æÊ=έ(¢~.\ñªóÕ(ÊaóÛZ;ÝgøÄQÄ^]½Ñf,²Øþ\½ß•øƒx)Æ1áÐÍö‡—ånr¶1¤î8y2nØ ‰ vxk”ÇEõsØ×!W‹ "73úÐåÊ7¬_ƒ‰ÍelNCajr]yá_c{÷y¾©4£X´/Þ«{ÞØãÃd>Ÿµ`G†x–ꫜ—^²ã9£œ;K(MLm¨fÕZØ„-Šð½X]aö¾9,¦(ÚÄÓ‰6ä‰Gñ«wß}÷õO? ˆøå€°y›xìí ®^ÇI±ùÖÚw _ܮܴAÄ0"ŠyâkV½¿êƒ@àÝEYEµ‰1þöé .—ïU—«¬'hs¦Ñex©e‚(&žå–¾Õ F#õØh—¸)ô‹†“òÙ¸”=Šö9m^umö¿ÝÜÔ †vn«è¾^.õì´ã2—òÛ§×Àþ+eŸÞ»É ½)ê|§(–vÈ2K=Ç #÷&Œbz?7—dØŸ Ö[Š7brPèwëRù+ç ™ÄE¾5êÀcˆ¢ú9œ—SXôu3£ݾ… ßñ ŠÜI³Gq/2ÃüNçï·æ†ÿÌ›Bqœ|Ù àÁc¢¥ìÛÅÊ„-ŠKjäžÞ(Š¢eëÊ0¬À@¢í çù3ok†-DD>ß0}òÎÌŽ"VqÊMÄ(¢û.×HóC1†¥ºƒ†#'K]RmÐ1Š(m„£¡tsÒþ½_fH=ÂÛ‰)èiÃè£ c]€Úl'§zÍ9÷ZGÁymòo÷Îa,V˜*¸P RÊ%cýmÉ`Êþ±Ãhä/^s‘óË ªa< \õµyæÎ šÿ÷>1!·N™/l»Óp½/įã`ob.íVöJÁ\+ú±æSKŒ³SìÏ…}CذŽëÉ€Êïâªúºå¶gžã!ãðïiÎoGœøÔêôÖ¨¯7µÖÊ8ÊÝ4ÁçÐÕ‹Sµ Eu3£ݾ…éò‹Ñ‰%Î6³7WÈ{¨ZLÅgŸZ?^9g–ýÁ«_+ƒ/ž {ë¼æ¼bb¼'b^ds¬MN¨¯–gŸÖ„GÑøApë„×ìÈ(:_’‘mÄ{Z.Þ'$g­,Ýúíïæ?¸i{@XÿE ÷ßÚ¶£˜ó^’ñÞ¦•­"ŠoáEŒxiã[ ä~"BºuÝÊ<˜éQÄ*ªMŒ1Š-ÿézézËn—Ð4t»,;£FÑóUK4pPf¿ô^ò–7¥Ûš4êij*t|òhySA¦ÃÚÔšúù|ùç|lRvĂói ê䥦ì}ÉÊp´b_ u¾³T¿|ÚÒ‚$ˆÎëóhŽÏ…¢ôƒöY»öéšýyþQ\FþØÉ“d#ßš¨O —ýsÐâ JdÕÍœhèêvÊXˆªþÍYé~ûgYnŸ¿Çãµ «¤8Û>³¼Üm›JNÑÔ Ubò. ù‹y”›ûÆå=’ù¹ïLWÈÙœ»ñÙøE›œÿú/ ¦¤Xo¢‹âÓŽ«‹]®¿Ÿ޽à’.Q³^ ±yˆ‰š6rmjm<#Æ¥ê1K½‡;:5çEYÊ# UD¾5Q%sE*ü1Å)ÒzŸê÷›2¢8uýˆÙÀ2—ëþÑ–«×ÇìW(¢¦£AtD÷@l†8ÿ ¦ ®-ZÓz¹0¢Aì²8Ø-£Ãœÿ¢Ö¦›óŸbŒb1WøŸxWsÞ“ „§E±D?4œXêr¶Ÿ}ç2Ä5 ‡õˆ ^ÖV ÓCY›SïMôÀTÜÄ‹ÿZð7ïRAQâKžö(º{9oBÈS‰¢è×kOÈ*6¹\¯~ÙZÅïšåÜZÝ1É|ðàA Ä ¶µÅ‰ì L9ÛžSwçÁ/ü¥<|ð "t=xШ¾5Ñiåá&õ¼rñ…0E¥tj@y*QÁ£šŽÞw ‹b×=@!df£(ºõÖ– 4\îrý§í;ÅŠî ÔÒª»BÈÌFQ„ ýä± t¬»l~PªmzüøI½!„ÌtEo²Ž'ØDsì°žìB!3EüÅúÉ–`-'õb?B™ù(ŠXÅÖã'‚8q¼õYi"!„Š"x u½öð‘fq9‰îúŠr]Q^QïNÌg!„Š¢Û£OÈã†g!„Š¢·P×kiÚ´=&þm>r¸V× ½ðL „BQôë­ÇO'pâx«^ìB!3E›x²%EËÉg¢Š„B(ŠÞdýð±`TÇëÉ^ „òW@QL*­›_]?»®4 bT¡Ÿ´7±¥íÔîƒw·Ÿ>c¯âI½!„<ý(Š%‡˜Í¡ˆ…[om ZŽž^êW~öÄãT¶ên „ò”£(&ÎÛÃÂì™—“çÑ-çê]aþqúXP:®{€BÈÓ¢Xø<¼–öfvö›i¯`Âó…0Y~½ÖÚ<ñ¥+BY³5³V÷!„§E±x¿ˆ`B)Œ+Mì/†I*ÑMÍß¹^ÿ³þðŸŠ9û°^2QWSabç;;Ë`úìêììôþqéÅRéÖÍŸ¯½³sL‚,ÉuuŒóÌ®ƒ©óÕÍBVm+ gåëž™(f`¬¦N­®†±Ù“>zzD61Îå(»%h8âxü43£»‡óž¶Z о‹/¦€&æ¦Áô¹Îù%øC)œó*ëæÏwŠóa/DWøÍ+Õlî‹u^@«K…qs+…)Ë`û2“lÚnX¾æ‹œõÀZ€¼@à³g%ŠÚsŒí×A¡ïgì9 &¥Xo¢cÅ^õ»Â$¾*þùî¨M½"” pé’„Vqo)Øèâb˜6eœ÷Å=­QLô€8Æù)ˆêÍýÌ”PÅÆÒ)ŠBÈÛqëV“Ü?Þ‘Öž­(®f¬²"”V2¶&E׃†Ÿ\ÂÕ`•kÜî«Ç:ð¶=hÐuPÕ†ø¸‘ 5в’ý0m¼¢6áiâ|Îy .ÑîBˆb§Èaü7u{«v«QTŸR ¡(®[¾|ù{ÛD·~VŸC„œÜ·>Ìy¦¢X_ƒñsŽeM},QìxÁ%à>áÕÓýÍG6÷· ^üj±‚(V ` ¿,oÊèÇ;šCop~¦Mç|ñ_ Šõ!ÎÂÄ´lÏ|R2V§FQEQ$„¢¸ÖˆÜª÷DWE¢ê™ŠâlÆ4°Ó¾™[‡7 ŒÍŽ%Šçñ´š‚Jð¼›² ¢x–s>ì¡ð¶¸»Û!ŠÃœ·ƒMÜîeµºÈëóù!»±Ê¨÷®¬óçw&mŽ»¬«L ûÎ{µñŠæ·îLƒÇçK±Ý‰Eå…½ i]»+À²kgZC&¤ŠE¼nq£Øî¨‹gÏïj4·'Ó‡ßj<Ú8‰-`ì50¤îg Q£è/þQxLK)δÏ-OöøDO¹—¢HÈL"zG]ŸgínØkÜÏËÿ<x#?ßœ‘—»vÅF0lÌÏ‹âÆkñ36Š™{Ô32´CŒí¡”±=™“bóß\èDPqôêÀ/#¢èïã¼Ï÷x/éNd³ÅôAW7Ä…_@h«›â,€Ì}ƒ£Öœƒ¿uà÷íÍ×ú9?k-°è”xyÞ1h,0Æù+Â7¢FQya¨êåBè’v'„ãëjÿÔŠ  uG]ÜÓÍѾÈyŽäögˆÛB˜P1cËÀ´dQÁã(j‡*+3¾©¬€¤ÊʬäxÆXͲQ2*Œ®Þ/¦¿÷I… ñKÀy¨’±ÊS(Š„ÌÜ(Bþzüš­]ÖãŒ/¦Ï1›_mѬïå‚ðY ÷8ŠùÛYk6ÎØ(f1–ÑD¶Ì:Y#kòQ¼îB¯6'v¹ÐOØÇˆ(îæœßéF[ÛO‘QÌÙJKæ—®'šm:Ç…,Hý™K×4Y­›ÜT«Ô¬ ”N)Šò…!+ÄMC^:­ñ9FQ]|G—:•(î·Ë`B£ß²½E`cFQ›ÍØl `ÛEb¢†f›‡ª1CM! Âý̰?ÎXg<3x‘¢HÈÌ"p «DàÐÖUaQÌß&ïo[¡F1ךµ.o¦Fñ5ƾŽhâ! Ð׌½6ù(f¹Ðñ`„#.T*îµDDñ¸ÜBâïœwƒÅ‹%º7xvÀlUGWFFÛÄ«ƒ×úÊÊ9}wï\Å啵7ɬ ½?^ƽ¶¬Ø£h½0ìëã¼°ý.vP¶_>ãpŠ¢ºø51Êg ‹›"hº…™>}ëV ¤ŠxÂÄÄ.ÞÞº$%ŠØÄ lQ9Üáùz/c¸b.›[çyó¸ñ@Ò^V9oÉ’y•l/®)ƒ±„Y… ¯a%2S£¸)ø ÷Q`ëÊ+Vn |” 7‹Ã§+7oÞðz °}ÃæµŸ«Q|KÜäçmú x{¦Fq/cÅNM”GèöN>Š^—ðcÁH—ð·£Nß)ÞÂrDâϸeÁc’W4w/çC²Míš<¦Û -fðdsÎ@)€¿©L ¯°{ÚX_ÊÇÏì'Ú¬YþÕ#Øø‘XJ‰âúÀ¶Èÿtù35Š•Œ¥NÐDHe¬rÒQlv /}tpßø›3NQ<‹ŠEoç aÁBFbÏ5ÚtÑZQÈÂNñÐ)³Z¿[«+«pßxÖ~Ö@¸+ò©ÅEù˜µ ãÎt´Ož+«]qŠ¢º8Nv—€I‰âŒuÙ/îa¨:#ÓŠbÆ-<Š{G­½~ÅY€¼ÕÆA€o]ëÿ²xqÆörï¡(2s£ˆmÛbüûÖáE›5À#%Šë­˜ÙgŸjŒ1ç&"15é(žq¡ö ƒŸ\hÌ)Šwp¿.jwˆÉû¯ÑŒ)mªÔÍùU@þç×Ì9Ö¾å"°¯ wü©íf?Ä=OìQ”/œ,îÜBF†}âßV@§œ¢¨.x¼44ôK™W¢1k ¢rg½\Í„ç‹Ì(Šo5(Q| >Ü'Ä(Z_÷x›S`8Àª¾aÌ-IQ$dG1oK`À;ø ¢!Ø’ÅÍÞþð€Ecbëòssf~Õ&ÆÅ~ê :¸àBÃNQ|ˆ—aDâ}ûw‚X®›J›ºÌù]°ÝŸÓÅ»œ?u'XÙÜ{å ×r›_É&@YNQT‡Â{ÜÐs§^âÙIýhAù¼Æâ(¢ˆ(¦ÁÏØ2ŒâÍšÏüPÌlŠD(€i!E‘ÅÜ@à=Œ M®-Š9ï®Hj7~@ëWæÃÌ?|ª61¶Ã§rO±,è Õ…®:EÏ·ü$ffjD/;~–ÛX§6‰¶ ¡—ó65Šì)6*Ãì×mzÛtÅš‘Ä1nj¿SüÅÚå»0в·=1E±PÜ›ã<Ö%ððq›@èÂ(ª‹*¾¼Ö‡scúNÑŸ]Ò7Œ-1¢XWZÉö/p<|ºÄéðib%›–gäð)!żíÆÉ£ïÈÎY¬(¾lÛ”FÕ(¢œÜ•¢‹ÏðK2Ô&ÆxIF‹žß:Hªêq¡Ï>5NÖ¼óøÄÐ/Õ(bd|á{– ´h¶6 Š{;@HÃ*ME|¿õø0ÞóŠ!ô˜ êó€ÇEè·âš”’’ Ú€y,¸‡Í¡–'þ×(ª‹{½^<œ_’Ql“XÁÑ~‰¨2eü.óȳOÅGö|êäO´™Ã^ hCȳű'¸å‘q¢Í{9áQüBîG¾hcQþ–Àúñ~†ÒĘ.ÞÇà5ºÐÁcAÕnj :FqN¥¤þâ¼ß«F±Ê<5ÔR€—Ö”`Dlmj3|bF(eÂ(Ê“QåãüR=Ý·C2«­)WbŒâMÎ;ãCgŒúáÓï$AÉÜ|¥zÜNH aÕÅ1™÷ ³ó‡r½×½€R;¢^§èÿ¸vU³šDEX(÷ ­(ÊK4 kØyIFŠí’ q³„Ñ׿Æ, 5.Éx™Q ™©Q|´& ë'â¸ÒxdÝ–õf?•K~&ã¨F1wÛ¶5 ä}xoÆÿÌÛ·Jcú™7,ái—¡]­âI—á°sá,zºo‡¸Ñ%Š˜ª»`s˜‹èÁ¥ËÂÚôÎè6fœ‡‰£xPΣÐe|Bßùºüv÷cõ~|áwC"ß)û:¬ÕÊüöâö]¹ÇQ…º¸vYLÝlxYîgsa ;NžvÛ›ËØœ†ÂÔ亼ъbâÆV+ïÄÕ‰…ëÆ/Þ/ÜqHܸ ä«œ—^²ã9ÆæYïÿÇ"ºxF"ůÞ}÷Ý×?ý( â—Âæmâ±·7|¸>x'Åä[kß|q»rÓÈ(æ‰g¬Yõþªwgü‚¯þv™½‰±ÿ xó .—ïU—«¬'hs¦Ñex©e‚(&žå–¾ÕÅÛÖ‰8’v‰›B¿hamÒäzpù(QÔD“®YwrS+©ç¸aä^lQ„‚kü‹­#¼è†Œ¢õ³nòð©²xãk{~dnÞRù¤&Vø<³Ì"”T3¶ÃÅCß2Ã!ù3o ™¡Æ¨¸†™^öÒϼÍp„¢hÙº2 +0hûFÈù@þÌÛš€aËQ„Ï·LŸ¼3óÿ_Giÿîÿë¨û.×HóC1†¥ºƒ†#'K]RmÐ1Š(m„£¡tsÒþ-b¦(Êb°óvöcPF­£©M`½€3øXØçwöÁc9¿¬YYÛ9,þíí’¯usui—xìŽyسֺQÉÕKû†°{דÁÐ…û†÷jd¡jXÌî¯úZLïŠ\¼ü.¾j_÷b9ˆSc<Âí?Íùmˆ&qö~†æÎ²>¯Dðd›$Å3ŠuÅÏa—ye½iØÁ„t0ùŒî­óÊ\X)¦^£'d¦ÉY+K·~û»ùãnÚÖ‘èý·¶mÅ(æ¼—d¼·ie`«ˆâ[x#^Úø¹Ÿˆn]·2þý?nùO×K×[v»„¶ ¡ÛeùÛ5Švße¯Z¢ƒ2ÎCnç-oJ÷‚ƒQOSS¡ÑY×LÈ}½úÛ3´¥Iàd45œú"Eé=¶ÕÄ”È(¢ì}ÉÚċî}º}¶×?ŠËtp~þ@ý›³Òý01Œ"€?¹Ð £ -(.‚Çüåån—êñ$³‚ò(7÷ŒË{$'òsß™ ®³9w# EMìIì×A¡ïgì9 &¥Xo¢‹âÓŽ«‹]®¿Ÿ޽à’.Q³^ ±yÈùL«Ô{¸#hEq’Îòp¿Ã“Qœªóœ÷•Ô¨Q”d§!„ÌÜ(BöÆjê4°ÑðìÙ09ýˆÙÀ2—ëþÑ–«×ÇìW(¢¦£AtD÷@l†8ÿ ¦Wç»þÍ(v>ñ(Žã¥Å?!„¢ÅøÝTB)Œ+MÀó‹a’JôÃAÉ¥.×aûÙ§q.C\sÐpX/˜àUµ0Ínr~ö©"þº]*EñÏG¡(ʼ–öfvö›i¯`Âó…0Y~½ö„¬b“Ëõê—­eáQü®YέÕý“̤À4‹»óàŽâĪ=0IÙåá2á•‹(„©zøàAüÛR32|a¡Î˜„BQü‰óö°0{æ%ÂäyôãAÓÑû.áïaQ¬Âb¢ãº!„<Õ(Ѝä³9T±pë­-Ai¸ÜåúOÛwŠÝA©¥Uw!„§E%•ÖÍŽ¯®ŽŸ]Wš1ªÐO JÇºËæ¥Ú†¡ÇŸÔ+€BÈÓ…¢8ý¼É:ž`ͱÃz²!„ÌtEðë'[‚Q´œÔ‹ý@!dæ£(b[ŸNàÄñVjⳂB(Šà-ÔõÚÃGšñHéÑ– Mó‘õº^è…g!„Š"r{ô yÜðì „BQ„œDw}E²®(¯¨w'æ!„ˆ¢H!„P !„Š"!„BQ$„B(Š„BE‘B¡(B!EB!„¢H!„P !„Š"!„BQ$„B(Š„BE‘B¡(B!OŠ¢D!„ÐáSB!„¾S$„B(Š„BE‘B¡(B!EB!„¢H!„P !„Š"!„BQ$„B(Š„BE‘B¡(B!EB!„¢øÄå$ºë+ÊuEyE½;1ž!„B(Šn>!ž„B(ŠÞB]¯=|¤9hÓrô˜ø·ùÈáZ]/ôÂ3BEÑ_¬·?œÀ‰ã­z±!„Ì|ElâÉ–`-'©ŠÏB¡(z“õÃÇ‚Q;¬'{BÈLGQ¬ÐOÚ›ØÒvj÷Áƒ»ÛOŸ±Wñ¤^„Bf8Š¢[om ZŽž^êW~öÄãT¶ên „2³Q=úñ å\½+Ì?N JÇuB™Ñ(Š~½ÖÚ<ñ¥+BY³5³V÷!„™Œ¢X¢šš¿s½$þgý#à?röa½d¢®¦ÂÄÎwv–Aì¦5Ë:;«àÏÐÕºO…]^ø#~±TºuóçkïìÜ“0ªÁæÞ—¶¬T³ê–À8íëÙ…ð×AȪíoåä¬|}Eq²<úÙÄ8—£ì– áˆãñÓÌŒîÎ{Új5@û.^¼˜6š˜›S弚΋ÏC̺9¿†^ÎûRáip}R›œÂ9¯²nþ|§8öBtÚÎCs*kž[¦Ã”²—1–ª=lŒ{“±ç ºÄÙ‡¥Á´"dÓvÃò5o¬€Xä¬ÖäŸQ'«Xo¢cÅ^õ»Â$¾*þùî¨M½"” pé’„Vqo)Øèâñç%zàu vL¸šËœÿ8å(ª¯1ý†8Öà ‰e ÊDãž¾(*ÿ-$Žq~ ¢ò¿ÆL•uðä<ÇXõÂùÅxˆ.CŒ3¦!oÆ­[Nr?þxDZl (ÆF׃†Ÿ\ÂÕ`•kÜî«Ç:ð¶=hÐuPÕ†ø¸‘ 5в’ý`™/æ6Àû™ós€ÔÕL[åk<úµëð¤Ä°^Q›‹ðFQùo¡K´»¢ð>/ruèë4Lc<)£{Øs@ô(ju…U:£(>ÅuË—/o›¨âÖ/ÀÁª@àsˆ“ûÖ‡9EíþùÿbŒbÇ .÷ ¯žîo>z´¹¿íHPðâW‹ýD±bcøeySF?ÞÑ¢xƒó›ÓE\Í_%Šèiˆbç|ñ_ Šõ!ÎFÝÆâ“@(ÝϪ5xB û¢Gq¼sÙŠâ@Q\kDnÕ{"‹«&E‰¢¨ýï¿þõÏ£xO«y!¡Ï»)› Šg9çÃ~ o‹»»¢8Ìy;˜2}8·ÕçóŠÛݕ֠¤}W{~Q d߈(¬Ï·KYÍÄQÔVuÕ–Â8÷ŽÖÖ‚T´}UºÅñ×PŸ_èóùŒgÖ[w$oCZ×î 0Tø|âžÞZUªáv‰%Ý€²Å= vù|qÖBZA«Ù¥]YçÏïLrz:xų!©ñ|N6.kò:¼¨\Ì]ÖUV¹Ùó»u¥8ïÕÆŸX4¿ug <>_ŠíNÔ(Êgg7VÕ+B»v¦5dBªÏøLÝÆÖƒíŽº¸üÕÿÚĆ@ KCcûÀ‰–­'M4þòd?ÏÚܰ!׸Ÿ—ÿy ðF~¾9#/wíŠ`ؘŸÅ+Öâ3ž±(bÿõß±E±ùo.t"¨8ú‚ uà—ŽQô÷qÞç{üøß‰Œb¶˜>¦ó\Â’n†¸p¹ ÷û8º[ýÜô£²š £øõeކ¡è,G¡³©æÈîqa¨ÜEå5ìÏ¿%î\MTþL!Œ«ê5Öyɨ߯b}>ãIW’¯îø}@×8ïH‚Óâa¹PYù÷>óGckûG#ŸMâ΢!œ,Lü oûÕ•‹ü­gß×·ÀÓÍÑ@XÓ4±ÄY°Ö ßàŽA „1ÎæüFÔ(Êg7à‡•¥´;!|Õ®ño@­¸ÁÊ;öÅ•Yùo!CÜÂÄ^f, þE‹êôÊÊ@¾ÊÊR´´jÆØ…I L!ý&Ä/±Nƒ9 ¦ö~­)_W2¡²²NY»ÅÄÊÊÕI••YûÄ3̇pžJ¶G±4ac5¯,€éB(Š¿¿&Dkׄõ8ã‹€ésÌæW[ñ ë{¹ |ä=ŽbþvcÖšÏReÿW‹-Š×]èÕæ âÄ.ú ûÅÝœó[ Ýhkû)2ŠYœw¤:D1õ 7u”pKý5Šêj"£˜â¦Rvõr©Û å=Ü0|Û9ŠÊóýWͳSpCº^cÈkVíöU¹ÚQ+;geè&Ø¢8ÜÏ(¦þÌ¥kšút3;7¹áÜoò]Y¬¾¨m1¡6l vôp©S©Y(O|8¥(žãB–: è”S×¢¨Œ_ùâ¸OÜ.ƒ‰¥1¶l–Xû‹éŒ•‚0›™$GNîg†ýq dÏa¦—•‰ÕÌôµ²v%Š©ÆPŠ[Xà ³ÀNûžU'=Žb]%3Ô”Ât!E àVaà„­«Â¢˜¿MÞß¶Bb®5k]Þ3ÅØ›(£˜åBǃޏP©¸×ÅS\½Ü""Š¿‹4Ôt ÿ4Ÿ¾u«´ñOeû­^³Dq¸—Ô¸{Ðü³þðV?ç½·n¥9¯Fâü>‘_¿⼿Ø\–ßýaP,Äü·±1C8×EÛk(Ï_l,—)f_ÑÀ²¯OÌl¿‹0ª&ŒÝ¸2;"ÆÊ”ý¨µE ]‡Ñ6qçêà5ìØ-õéø4¡çzNŠ‘\»ŒñT_T.Öw÷æô^Ø\ÿ°8cXÜ…M2kBï¸ÞPVìQDWFÔÕráòi1 §(*ãW>dÛ ©bËab>Ñ•CéÚDQÄhÎÉ*lXÈØóSI{Yå¼%KæU²½IæÌeEÞôçŒ'Ú'ü ‰".XàŸdYuVaá7•¬:lêÛ ãQL¬a{KGKăÏÁ´!ÅMÀX¸[W®X±rkà£\ظY>]¹yóF€×í6¯ý4øXâ[â&?oÓÀÛÏLco¢Œ¢×%üãX0’Ç%üí¨ÓwŠ·ðaô(þld.âäŠ&nþLî1þ,gȪ\9­œB¹5Š#¸#}ÎayRÌ¿´ØŸ"ó•œO´QŸÙ)S ÌXn=îÈU˜U;«TaåÌ­ù‡/âá‹â°Ç:ã¥Û û°ÉŽOï3'Cõ—Å#_´ÉÚ—ÅÌ'Ù¶@ë1ßO÷ÈÈNÌíqgí‚ÐŽYšRÛ5‡waĽ‰2Šg\¨=èà'sŠâÜñ‰Åb2E¢Ìé-4ÌyÈ ¥\¸|£Õ£FQ]Eš4@V…4_m×)œºð#çW%†œ£ùüFŽF4—ŒÓ·¦_1åèçCðÐh|…˜YÅ10t[cð‡0ÀêÓ›¬K'¬ë OaÕ5k¡Oœ±¿Kx$24ôK™Wý9›^+k²ðËÄ=Ï¢Xëô.øÄ¿­€N9FQYÜþ!«Q¼‰oUtK2æT2¡.2[ósƒ¤Ny›S`8Àªñ`lÆ?ÊDŒQœè?ì_*b"ÓÀE÷‘ñº8 ¦¡(æm lx¿A4[ò£¸yÃÛ¾P£hLl]þanÎ âÿ÷ÏÿÑÔ&ÆÅ~ê :¸àBÃQÄðÝQ£x¿þrˆâ·iø›®|©DQYEùŠ;¥™ëÒNõséŠñJm`vŽbÄó1¤‚«å6¿š§ºkÞÑ“cÏ‹4ކEqh|¼wí÷”§7á³å»rGî>‡Ôµ-Ö¤F±ð7ôÜ©É\ùðxÖv‚•ÓÝSˆâA§w'›e9FQYÜþ!«Q<Ëy?ü!ÿüçDÓ•laƒ€E*f6E‰¯0¡2~g"(1F±P‰=ŠÞ¹l®×Exsª—y`úŠbn ðFÐ&×Åœw×$5Š?  õ+ógtÿ‰T›8µ=Ų ƒVºêE¬ÿ$ffjD/q~Í)ŠøµØê7°øz7ÜW£¨®Fb•L„9œÜíB=÷Ì(§éžsÕç9SúЈÅC¼wìZda÷…Ú8ÿ œ¢xoü^/&zrQT_4J¡¾}˜†S&ØSlT†yœjÕí¯Z£c•Å•9Ö=Åñ}»yÙz™UƒE™ÂEY‚H(­`a5¾w+ÿ~W‹GSÐ÷ìù RA(Z=Çèîb˜6„¢(v ?5£ø‰!°í“÷mQüJÌØ²îƒåQ„œUo3²¸y&Gñ¿e•&Æú"J=ŒTáBNQÄó o§Ê&âåj1ç¢xQ©žØdüeÐÔ(*«Q£XÆ­™·Œ¿ÅÜ/)KøÑhÓY+ îsÕçã#ꯇq…bz>X¢x߈>Λ£xÅCÇM.Šê‹F‰"ªøò§}‚ï9L¾Ëx_õÄEu@žñ‹VZQ”o@¾‘ÊâʇËwŠZvv"˜¼•ì#[‹½i>MIJ¬UhžoD 3” Eeí±DñEfg=î_/¦2ašŠbÞvãäÑwdç,Vß¶mÊÌ¡ECNîJÑÅgre mwbb‹žß:Hªêq¡”³Om'~Þy|®ã—j=bʧD±Qî” ¸Að¦¤Ô‹½^ „;rùŸå—nN«Q£˜’HS‡ñ›=\5/— ^1ÃËä_j5Š·ž)="ïæe–~++I))©QÜ%V² ww£8h¡MÃŽL.Šê‹ªQ´m&Þ><ö-4>¿µü0ÞóŽpÞc6¨Ÿáã±DQ6`žS îa3Šeò„!¸ŽQTW?dë¿4lÿ@U˜ C`Êfì5€B«I«lí“5ƒÄº¯Ë•)˜ƒYÃæ¨2ŠöµOCÑ2Ììô ű'¸å‘q¢Í{9áQüBîG¾hcQþ–Àú™EµŠSk"Fƒ×èBU»]¨)èÅY\8• ú^åçU£X…;ÊØë^0OºøUÜI=+–H„nÎïe›×4ôùåñËtp^ÕjX¼‘½F¶’˜<‹ôcÊþ»„Ñ׿ŠçüGBÂj@{ÙsáV•µÇÅ]šÃæêº[Ä0!ÞÉ,\Ñ´ ÅGk²~"Ž+GÖmYoFñS¹äg2Žjs·m[BÞG÷fte§ÖDŒ"–ð´ËЮVñ¤ËpØ9Šp– =Ý·Cò›"%ŠƒÖ&R6ºãÌk×ú¯_¼j^®{wc¿Ý¿nu çòÛ”ÕØ£8.ô~qÓ;ÔƒûCÙÆÅú7†¹E­Í¢˜«DÑz õù_Åp÷ŠÇ2Á‚Ë„ºÜ ‰áGT ¥q¤;F_ Ÿ>’Gj'EõEÕ(Ú¶@»,–»ÙþðrøõA|5¹¼ºŒ/ß·C~Hüv÷[Õíë°V+óÛ‹ïô•{U¨‹«²õß‚<¹¸ &¶˜±=ßø2³w¼ÂØ·˜™ïË(ÌÞ7‡amŒ]ºç³ìÈ`lNÄTÉV9/½dÇsfN÷Ѝ-ÐRbÕì¶(*kŸTÕˆ'ÚÉXBibjCõ4üŒ9¡(~õî»ï¾þéG¿6o½½áÃõÀë8)v ßZûä‹Û•›6ˆFD1O}Áåò½êr•õmÎ4º /µLÅijÜÒ·"¢xOÄQΘ1ÐÆŸØæðqix ¥\øÑi5jëÅÒÜtµB~_‰zFÌ6eŽqÕ[m¯¡ß0}òÎ "VqªMÄ(¢û.×HóC1†¥ºƒ†#'K]RmÐ1Š(m„£¡tsÒ¾·’Rÿežã¡.à½ÐÏ…{­£ hc!1uyІ†ë}!~}¢Õ\å@Ó¯øäŽëÉ`ø£9”~Vž‡’|3$f&]áÖÕ×°?P¤¥I^‘J‡qû†l¯Ñ&ÏT‘w†àþxù¶æI£æÖŽuÃÓ ¬T†±Ã2Šê‹ÊŬ;û¶ ü.槯{1Ø]o¨femç0îw!ó&.i×°Qázq¿ÖºQØ^Vêê۶AFª†Åìþ*ÜÙÞ¥.®~ȶÿNã—£Q•>_É„š—‹ä ÄôþÕéŒÙ~¼ú5œ«N/ž {ë¼€<ñ˜¼¹iZäc‹œÖ^cb¢Å$Ʋe;F/É#9ÀÄšâ=@È¿%g­,Ýúíïæ?¸i{@XÿE ÷ßÚ¶£˜ó^’ñÞ¦•­"ŠoáEŒxiã[ ä~"BºuÝÊ<˜áQÄ**MŒ9Š-ÿézézËn—Ð4t»,;£FÑóUK4pPf\™¯ðúGe(Ê› 2a\jºœ²¦ýÑV£HJ_ä³-²Ë¶ªLŸî•| åùQ¥ôh0U£ž¦¦Â˜ž®¾hô-صOW—³®™ûzõ¶××–$935œu@Z\A €Œ"ÊÞ—¬E,®~ÈÊ Eœ_€?¨ïœÿšm:y—m ´’â쉦À_^î¶Í\œê<¡¬}Zø“S4xBy”›ûÆå=’ù¹ïLWÈÙœ»ñÙøE›œÿú/ ¦¤Xo¢‹âÓŽ«‹]®¿Ÿ޽à’.Q³^ ±y((ªþ”ÕÔ{¸#hEq’Îòp¿Ã“Qœªóœ÷•߈2ó£8uýˆÙÀ2—ëþÑ–«×ÇìW(¢¦£AtD÷@l†äÕìª?g5$‹ó]ÿf;ŸxG‡ñÒ BÈÓ¢X¢N,u¹ÛÏ>s⚃†Ãz Ä/d«…èžäjÈMÎÏ>õQÄßðKBÈÓ¢è×kOÈ*6¹\¯~ÙZÅïšåÜZÝ1É|ðàA D÷$WCâî<¸ã…8ñz`’²ËÃeÂ+/PSõðÁƒ „<%(ŠàÑMGﻄ¿‡E± ‹‰Žë „2³QÝzkKP.w¹þÓöbEwPjiÕÝ@!df£(B…~òXP:Ö]6?(Õ6 =~ü¤^„Bf:Š¢7YÇl¢9vXOö!„™Ž¢þbýdK0Š–“z±!„Ì|E¬bëñÁ œ8ÞJM|VBE¼…º^{øH3)=Ú´i>r¸V× ½ð, „BQDn>!ž„B(Š“è®¯HÖåõîÄ „2Q !„Š"!„BQ$„B(Š„BE‘B¡(B!EB!„¢H!„P !„Š"!„BQ$„B(Š„BE‘B¡(B!EB!ä)@Q”!„:|J!„ÐwŠ„BE‘B¡(B!EB!„¢H!„P !„Š"!„BQ$„B(Š„BE‘B¡(B!EB!„¢H!„PŸ¸œDw}E¹®(¯¨w'æÀ3„BEÑíÑ'äqó‚BEÑ[¨ëµ‡4mZŽÿ69\«ë…^x&B¡(ú‹õÖã'‚8q¼U/ö!„™¢ˆM<ÙŒ¢å$Uñ™@!Eo²~øX0ªc‡õd/B™é(ŠúI{[ÚNí>xpwûé3ö*žÔ+€BÈ GQtë­-AËÑÓK]ãÊÏžxœÊVÝ „Bf6Š¢G?´œ«w…ùÇécAé¸îB!3Eѯ×Zûƒ'¾tE(k¶fÖê~ „2“QKôÃASów®—Äÿ¬ü§¢CÎ>¬—LÔÕT˜ØùÎÎ2˜2e5Ó/­³sÿWQT7S¥¾k‰cœŸEç}qOiåªCwöæ~fJ¨‡'¦T¬ÿ¹ÙÞèQL`,&PÍ›BÞŒ[· œä~üñ&ˆ´.Ø@QŒ® ?¹„«Áþ*׸ÝWuàm{Р렪 ñq#je%ûÁ2_Ìm€?ö3ççÔÕLº‰ý\0FÖ·„Nãîe.ô—ƒ]šX.îObôÍT¨ïZ—ØŒBãµ¹OgåªCw¶ST&þ›ºŒ½ŒU»áIIc¬J£>}ñiEñÏEQ\·|ùò÷¶‰*ný¬ >‡9¹o}˜CQÐþçŸÿ/Æ(v¼àpŸðêéþæ£G›ûÛŽ/~µØ?A+0†_–7eôãÍ!Š78¿9 QÄÕÄp¨Žz´¸kÜÜ;©}<ó¥õmâ`7ÂùøëD±^lÉC“%f.þ DQºJ;ÀöÌ!u!cuð¤¼ÈökQ¢ƒ ÆâàÏC(ŠkÈ­zOdqÕd£(Qµÿý׿þcÏãi5/#”ày7eDñ,ç|ØBámqw·C‡9oS¦ç¶ú|^@q»»Ò4´ïjÏ/J”ì…õùv9¯¼>Ÿ/Šæ·îLÁ-&Í'úÅ=·±ìu@bLݰ›Ë'Štß‹º˜sÞ¸ãóU€–~~7®Ñ{ðü× iž¬®Y…`m¨êjÈ‹v°ª«¶ÔpŠ¢²:u3½ i]»+Ô5©ïZ›x„yÀy¯¦¾)ò]Ñlw¢FQ>;»±ª^ùdЮib“S}Æ<>¾€íŽ:ôìù]º¦n¡:tÕÆ^Cê~–ŽR=žQ§eëö·Ú_žì‡q£å lñ+*¶f½Æž‡˜¢˜*_DU¿‡-i49Pbr=Îû|wgîDF1[LÓy.áI7C\¸Ü†û}Ý-€~núÑy5Ð$&Â't j âÎ-ëŸþ¶¶6sÙëæßáFñp +¢á Y#*áW·Òñuûº`ÑÎùeõrÔ? ­Ædh$ __æhx‘ºQTV§lf•¹âKneMÊ»–!n ÁFk9ëð¦@­¸WÖ¨Q”ÏnÀO$+â“Ñîàä@¾Ícœ?4,÷º•¡{º9¨R·Pº¢˜giÉ¢x¹ò90¼Ro.ñ clÏ÷;å°ÒªÅä…2Y:ÎdñKÀP𰇱šWJœ}@ÌÚûµ°¿RÜ«¬¬Ð++ ù*+KÕ(~SYI••YûÄ3̇H³+Ä­ª<úb csÓ!å5Ða¨R*ÙBsÕ¯1´§ô3|O¡(b×€° 'l]Åümòþ¶js­Yëòž™(ÆÞDÅ,:ŒpÄ…JŽ–ˆ(žâêuQü`JM·ð¯öé[·J@ûÿжßê5ƒ'¦®4î4ÿ–>¼Õ/êvëVšój ‰£Þq7-”eÌä8´Ì[£ÁÝ0"¢¢ƒp ÷b}W+žÐW6âåïÊ( ÝïqtõÚ¯!qã(ê¯3xê×ó°ëÎXÁÝÎ.§Ìs;~ýýŠx´¿X݈È(*«³oæ>1£°ý.¶”5ÙÞ5€Tì»ú~7E¾)±G \iP>ãéüòiì›SÕ¡_ã¼ï‡ÅÃâ¦È¾…êÐUA¶·.iÂ(f‹æd”§íel¾yÂÌœ¬Â†…Ì8š´—UÎ[²d^%Û+ÖXÃö–Ž–Ô1|".¹¬È›þƯdA<Û»`AÉd£Èª³ ¿©dÕ‰ 8Ä* ­6g'‰^è+9þvž(BQÜ|€…û(°uåŠ+·>Ê…›ÅáÓ•›7ox=ؾaóÚOÕ(¾%nòó6}¼ýÌD1ö&Ê(z]Â?Ž#y\Âߎªß)Z±)ˆÅŸe!”SFš¸ù2¹ÇøÓšÁy(.ŒŒœVÏ@QV#ŸÌ/híŸüΰññp´>ìÚít04b*Еðávàj­(þà¾ËøÍÜ׊çÝ^"O¡z€sâf'ÜÇC•Ç,0>¹jÕÕÉÍ”/ߣÀoFÀÔ5ÙOOS.JÄ×vG¾)SŠb»ùÉy@ëtŒ¢:t­Ç|G=Ý##;•Rº"{.ÚLÈX4êE¬ÑÖÂ=8™ÍØ"3NØ´ Æv‚0Ë8#t‘ÙM¨‹O˜cdŠ^ޝ³}§8¹(~»D†¯Â⎢œ—!“þ¢f^™ O¡(>ÚX_ÊÇÏì'Ú¬YþÕ#Øø‘XJ‰âúÀ¶ÈÿtùÏJco¢Œb³KxéË ƒûÆÜœ±¢¨žgãŽEoçQìâ¼_¡]”˨OÓÔ“ÕÕØÿ‚ÿ¬ÉßâÎmsñkò0ª qÔs* YCÜú¡l’ðôT«J}£8Ù9lÇ0n‡˜\,J‹_› £?ž;—å\ŒÕºÅ0¼êF$ÅIšŒ¢²:ÛfbJ2Ì–ãvªk²GñŠrºì-1pÇ7%ö(^‡Of´Ožö«]qŠ¢:tœì.Q?Huèβ_ÜÃPuF¦Cç° ТyiF÷rÏ›—ÀâÁ0’¾i;†‰óª³AŠ5Н*•‘µY(w­¯aµ\_.û$Š"¶m‹ñï`X‡wdmÖ”(® |´â;û4ö&Ê(žq¡ö ƒŸ\hÌ)Šw8çÉQ£ˆþSÔ(ÊœÞBâTn(åÂå­ç(*«i2ö Ñ2ó(g»XI’qÎÉÃñ‹ò»/?>Aæw£Ã!| YùE€óV¯X)A´à@™e­÷[bî>ZvbºÆ¿v‹S7â,—âlQ”«S¢˜,¦Gn!c‡Õ¾&5Š7Eø•Ÿ³éu|Sbb-8|2>1Ù è”SÕ¡ãøxhè—2¯òA*CwæÎz¹š ÏEDÑ[É2Â—Æ ã¼ŒÍ)0`Õn×çêâ4«plÆÿ”¢8ÐD|©èal!È(Ö€ÜG-‘sÃE(Šy[ÛÞÁo À–¼ð(nÞðö‡oÔ([—˜›3ãøÿýó4µ‰1G±ß…º‚.¸Ð°E뼑ÝQ£x_Ö@â·iø›®|éEe5ø|' €y!b­ñ°}„KîŸÌ6Ç4–àÿ%$Ö“ª¦À:ûÔ*È.[õs!.-†*ñoiø¦î”¦n„cm«S¢XËm~ûš”(âZû•S…†ߔأx>™Zã_”åEuè…÷¸¡çN½úAªCwV>¯†±øˆ(.±‡ g;sÕ¦àÍ=L¨^æ!ñ&TÆïLŒ=Šu€J"¢ø"«\`E±š¢ø'£(æïamrmQÌyw}@R£¸ñ“Z¿2FGñŸ˜Aµ‰SÛS, :hu¡«NQ9¾Zã¤ÔŽúñ]ºùá{Š­Ñ¢Øp† }½!¬˜q²í>°\4þ:ÊFØ¢X(£h[ÅF¬Èâ½c×@YÓäöÕ7eŠQT?™Ýã¯ÝèÅȡ׷‹h8%Ö=E)¥šíñ*QÄîeÁc/ËU8–``аg«ç%4ú¤,¬fÂ÷îéŠb2c‡€¢ø…¢(v ?5£ø‰!°í“÷mQüJÌØ²îƒåQ„œUo3²¸y&Gñ¿e•&Æú"J=ŒTáBNQŒÃsYReû9¿Å^ÎÏ;Eñ¢R=!±Éøs: ©QŒXMÇb¡û²aâU{FoËã‡KÏŸoƒ/O0¾ëÃb|¦úb”(^9íJ«4*V1ÞP+>rT·°;êFxýÈ(ÚV§D±0¼ÕÊš&÷¢ú¦ŒïâuÅEõ“ñX—|ÀÃñ(þ OÄqzÅ—×0éí1}§èÏ.鯖`ç€aFÑ»‡Í?|šã+Ù•§&Þy|ä—j=bʧD±Qî[ ¸Að¦¤Ô‹½^ „;rùŸ“<&ZM“õ;:ÞyafçUœ‡*¬]šùã‡5ÛA3{4°ñƒzöi”(ZWÆ/Ê“m ø¯ µBJHN¦ãÉ)ÊFØÈ(*«³of¿´¤””TP×d½krÿìGõìS¿Ó›RfÿzLQT?<¦Û îaŒ¢‘¶>œöqŒ¢:tM Oç—¬-T‡®’u©L¿Ë</ÊÜŒÖ`!ÍÑ•Öeìc¬PbÝ×åØÍW Ò2+|(³†Í±E±Ð*ÞêØ£¨ãŽ"EñÿE1Gì nydœhó^Nx¿û‘oZçE”¿%°~&FQ­âÔšˆQÄà5ºÐÁcAÕnj :FqN¥¤þ„ëyÕ(Vᮎò·÷ºÌSI~wRÏŠ%¡[D#€öùÍFñtPWc_ ¿TE7¸l\âè Äó+DØÑkîbucºñU ðá{ mÑ¢xY„Fð]6+Ö&/OøÍŒÕ99‰í„ˆP£¨¬Î¾™79ïÀšÎ`ÉÔ5Éw ¥v8\§Xàô¦Ôã^|@Z(¦(ªŸ FßI‚’¹ùJƒæîr >~Cº‘âûòÿJyhßÂÈ¡+|¢4 ]Õ¬&Ѩ•y¹a†<í¥Ðhd“ç”b¬Àøw§Ð×æÆ‹¦%ÄgËP•Â$$¬´×XE­†Åƒx ö(¾Ì*wQÿP­ Èú‰8®4Y·e½ÅOå’ŸÉ8ªQÌݶm yÞ›ÑQ”UœZ1ŠXÂÓ.C»ZÅ“.ÃaÇ(Ê/Îzºo‡ä÷_J­‹ã¥l. tÇ`Wú¯_¼*n:Í/åÆ~»û8W¸}a‚Õ4qºŒ/Ú·ÐnŽÎËÅqîíÓÆ ®Èkîù؃ζ>ù«åã†Ä ¢EsõFÛnVì;‘[Þ;„ÿv€Þ?>9œ¹j•ÕÙ7×ê~pW t E]“í]3NÃ훃¸ÙŽoJ/~2WîqSÕOöuÈÕÊ(¶cî6¶á¨C×.‹©›í1û>ûF]5—±9 …©Éu5æÎÆöî+ò|SiF±h/^¼W÷<îþÉ|>kÁŽ ñ$ÌÖV9/½dÇsF9w2–Pš˜ÚPͪ5ÐÄóV/ÐRäÏŒ[Q„ïÅê ³÷Ía1Gó Å?Eñ«wß}÷õO? ˆøå€°y›xìí ®^ÇI±ùÖÚw _ܮܴAÄ0"ŠyâkV½¿êƒ@àÝEYÅ›¨þöé .—ïU—«¬'hs¦Ñex©e‚(&žå–¾ÕÅÛáG+å. ?±Í àâÒðJ;¸ð£}5Ê_ðNnjƒËÔQ$'îp‹ùƒœ;û¹åf6HÖáÔ¸(QL—O´®¡h곆Yl s@N^­€ÈP£¨®Î¾™Öšú+k²½krÀõ·O¯9¾)ÖϯÅvøTýd°Ð¦fSÏqÃÈ=#Šêб–(ô»òAªCWŠÜI³Gq/2ÃüNçï·æ†ÿÌ›Bqœ|Ù àÁc¢¥ì[Ñü=r*Þmâ’ù„˜£Ï*S(Š>Š¢eëÊ0¬À@¢í çù3ok†-DD>ß0}òÎ "VqªMÄ(¢û.×HóC1†¥ºƒ†#'K]RmÐ1Š(m„£¡tsÒþ…ZfÿøÛežã¡.à½`â^ë(ZÆXHL]ôƒ¡áz_ˆ_·¯Fý ¾swÓº@ºÁKëH‡±·Ø®¡âR/úF–A˜8« mòô‘¯­ "Í㘠_8µÄúš²á\_öZ¦ɯ8Ùq=”P Ê/•ÕÙ6sßóš”wí´ýËVÃE±˜æø¦T ã!íª¯ÍÎ׋›ÚñUuZŽòÉ ®^œª•?™7±‚—v ˯“•¡—ßÅÙ}Ý‹Õ2rèŠÄÙföæÊyUcÊ ³O­¯œ3ËþƒàÕ¯ÁÏ„½u^sÞ1±?ÞÈ_ƒkMÓÌ‹)æX›œP)–Y-Ï>­ ¢ñƒàÖ ¯ÙaQ,¶vÕ(f馋÷Ÿ’³V–nýöwóÇÜ´= ¬ÿ"ÐûomÛŠQÌy/ÉxoÓÊÀVÅ·ð"F¼´ñ-r?!ݺneÌð(b•&ÆÅ–ÿt½t½e·Kh º]–¿Q£h÷]Öùª%8(3®ÿVxý£`-o*È„q©érÊšö+«Qwkê 5°j<Ëþ*¥©`“=·oT·q1*¯Ï£…­§ô`=<–”¾ÈçV6"†ÕÙ6³(ý GSÖ¤¾kE¢õÀN^3áü¦dïKÖÀIj¸D£~2Z\A €Œ"N/-Huè»ö隺…êÐÕ¿9+Ý¥”Û§ÀïñxmÃ*)ζÏ,/wÛ¦’S4°h ’S*œ¼Kƒ¿2Båæ>‚qyäD~î;Är6çn|6~Ñ&ç¿þKƒ))Ö›ƒè¢8Ç´ãêb—ëï'‚†c/¸¤ AÔ¬Clr>S§¬F¢Mêyùma¬ÎËSVÿ"Î+¿h.¤ÞÃ=6õM‰.™+RáÈ(NÃÐ !O™Å©óèGÌ–¹\÷¶\½>f¿B5 ¢#ºb3Äùo0eÊj¢Dñv² vø³¥?Á_Åè0~Ó©Èâ|`WlQ,æ ÿ¢:!äiGQ,Ñ '–º\‡ígŸÆ¹ qÍAÃa½b‚׸Õ”)«‰E±݇©(ñŽ%ðqßø•:ÕMÎÏ>õQ”C'„<í(Š~½ö„¬b“Ëõê—­eáQü®YέÕý“̤@S\MœxÀ6#ÿÞj‚©ézð þ">xÐâî<¸ãUß”¨´òp“z^¹xÂi:!ä©CQ~~|+“ÓÏ_ÿþ‡¨3s'ŠÕ:Æ›Wº&ÖU`îD1o1´å…vˆÃ60¢8V±¿ÝË÷[¯‰K йÚGœšËuœ”¾·åÁõÒœ"öU^Dq”6ñÔ&åå@ón•Îõ:>9Öç´ÚefH@@@@@@@@@@@@@@à Å Ÿ€"ˆ"ˆ"ˆ"ˆ"ˆ"ˆ"ˆ"ˆ"ˆ"ˆ"ˆ"ˆ"ˆâ·[¥s}ŒOŽõ9­vyAÅ´‰§6)/¢Xí#NÍåZ´ïÝß÷ziNû*/¢¸=D»—'î·>Û Àü‰âØÄ¡-/´ƒ*.€(VëhºòR×ĺʋØ;à(Žôá/˜µàª7¸{öß«Þzùp[Zb=QŒž±²&ßMò!_ѪhLR•OÑ€"TÝ ‚ŠsªŠ@˜ÿ IŒIU€e @.Á;Pccý»û™Yg{\–.ùsó³ ¶·{zŸî©ÚŸOOÏð‡-ÅJÿ·f'^j¹rìܹc­W¯™­ø­¿866666¶SýÍO×N/_]ëqäú7OUÙìO›…-E—ÿëún48Âø¯«¡òk¿ 466666¶½þ:#üæ€#‚Š‹Feß [Šeþ/¾".žrü‰ý3~8èGe›^ý…¿l&¯:afÚ;:*`þÈÝÌ·¥ß«:::Ü`Iö öÃÌ$³C`¾ëèh…ùÓÚÑq"Èèèˆ:/O&üÛÉìèø¢Á ¿6Gâ×eD~J|ýáZT66¿o6í­ oã+;l)F¿zú¥îÄ8‡%¹—¨þKËõÓ쬮nÄî–:8'oݺ•&TV›±S7Îöǃ×[sC‡·³¸2hè˜Ö°çöZE¼=““ñ!ÌL"z`¾|øæÏÄA7H¬ÕPËŒ:„D< ÿv²ƒQ|lñÑÕ5ʲUõ¿ª—+ŒT9®¬ƒK¥f!)ëü" ã-9óârĄͮý‚õ[^Ýs!o»Ï· ÀçûÈ–b´ö_¤ý¥çX/ya$¾Ä~œºLÒô¶A/êÜö£ÃlãGÄÐqÉýýý.x6ýý‘ÝDIå0wËAPõ2©P¤‡¬uFŠ-Ö\@ĺßJŠ4ÑÏZâ4âGBì‡ßŸ¥Ð›ƒÙ0+9­ ð«QÎún‘{v)&(J&ÌLÑEùrb3ØØÄÂë¾Û6ùï¿¿ "Ùæóí°¥87üþ¯wŒ»_Ï:B»û÷6þ»•Zøý S§aˆáÊH)Ò·¬@Ä ðl¾G¼ wµƒÈ‘Ö£±ŸJ1™´6Œ°œ{ñÌDçÀ÷o%EšŽ9ÌZ'b ÂÈ@Ôâ~‡R”BWƒÏrw)SËâ£õY'¥&~-2¥dHŠQ.Ÿº×) ’b6ÓãgGž¯ÝŠ6¶·­_¿þ­}ÌŠ{? 6ù|Cyù¯½›gK@ýÇÿŽRl{ÞÁà9áÝ«Á‹—/_ ¶ˆeU7¿´œAŠ•½\†Ž4eù ÕBŠ?"ŽÍ_ŠÔMô«‡ØïRãFP$Lê-$HŠ£ˆ8•:Ѭ!öxÁD"¦Cüþ¥Ø !>†0†‡à÷/E¸‡ðĄ̂g”ã+€á|AQêá×b•rZIŠQ±r‰¢œHÐ¥X¯(¼»Ã§•%`c›· Émz‹iqSÔR$l)ªÿü׿~˜£Ûù¶šç¿Š Œï»©˜AŠ×qÐ ŒâqD:µ¢³¢t*ã3.d›¥X•ÓÞ^JÅy<•BRO²ªjìÌRL=ÔÜ\ä´˜÷…ŒÎc¼S"wEg£_hÖÂ^‚™JDl/xHªç`Ý!Ì!Ñ‹gI‘Ž.jN·:ƒM›¬(æMôY M_ô¡!bÎl²Q”—Aà<­$€%N—kB¨¹þ$S©lM™IwGVªV…—•¥0')»&äTóïy]ŠŸ)Ë@p^QrA§DFTÃa7ØØD%EÎlAt{‘îØ‘/^~ìó½ZXHù[7ìÁÎÂBCŠTÞ°•ŽXøR”œø¯¿ÎMŠÿèàD<üòóN¿è!Eo1àyšÞ”b."ž¢Ô iLCF_#&ÈyPA$¾³îš1í ? ­_¥Ë}÷ŒUC\Þ––j;*ÔàFíNâCŠ“ˆ¸•Ä@ w×à"–òojÔ³­Þ}&¥‘M<ŽŸÛ10©Ã=‡ÑÛ’böw´nÛ?Á ÜÊôŸ‡6'Í€–6Xk)–\GŽvÝ)OÇÙQq;•„Ó…œÞ³r³,D,–7 ÆOˆž!d 6£+C/f—"]ÑMÆ•Îà…id ¸n ¶°"+Mÿù¢]í¦ö3qX iiMZ¼XýWW/¦«E9þY)ÔŒV<óyqB”jŽê+O8®(µ«WÊ…ÓÕ¬Uuu €¿ºº8žêêrYŠG«kù\WŸqŸgÝV¯J2K±–`Hqsuë„“ª«sV,eGd%ªñgx°Å`c¥¡p;¿LÈÙÊüÈ É+>ñsm~º—/²¾•Œ|¾‚§R,Ü/ª¶ìü’"9ñŸêܤ8êà¼tQ–â7U¢â÷c„‘Žˆ[ZîDJ1‡t!Eçmº¾ˆ K–¢Ü ™i ¤-µq8”ë8…ÎÀÝÃlFR¤J£6nѤgŽî^’a3Ò‚cO]HŠá]ŒŸ‘¸­KÑù=ꌨb!·-‘¼Ê†[ˆÃÒ`­¤XÕƒ:]©áÓ‘£!1À#?Ô:Ò¬DÄu`@ƒí6´6Þ‡‚žªX¤8(VÊ#Î`œþùÓÃVRŒ6túˆ  32ñ7åD ˜Xmä‹‹aG×i…X'zY¤g’Í¥EÀ©¯¦Rm¹T¨¥—§™xå$p2E’"WÜqÑgÍ*Ep !Êÿ$E3êR‘2–°,ò¸Âya³] ØØD%Eà`lâ‚ãŽÛ&ÅÂ}>bßYŠùFÕ¶‚/ÅØ¨K1ÇÁùú«¾åìÕ¥)^Áˆû$d)þB¹iç÷ÉÕ{÷Ê@ýZïõ ö–“x†õÓwäã{AÄž{÷2,»!3±ßõ!¢–#*‘‡–ÝFŽ&R/ #ùûn0Iqñ.î“Ì‘7ƒù“îé6¯E[ªYŠxpÿ.’;Î"ƒ]„E$)N´ðrÿHE(åˆx’¶ÎâMúð_¤ÁFJ‘ôàóþ>ŠÙ4'ˆÁþÖH Ä#ˆÏÓ³Ù¯’ðYsjÒ~•Ö£®5†6t£+׃ӣòôŽóéÒ-¥}è7± ff5“O}ÒŒRÌe™WVùáŒв‚V1—ä_xAË¡å³ôâôÏh¿Kb­r¢|¢¬^Qž“ e++'V®,‹RŠŠ²ª¨¡h)õjB–b‹=¤¨œXQ•&²ÖÒªÌç%l¢Å–â.Ÿïn¸÷|{7nذq¯ï½|ع›-Ÿnܽ{'À+>ßþ»·~èó½/Kñ5ö«°`×;>ßë ^б;Q—¢[<ÔÍêoe¸xÍ/[]S¼‡ˆE³Kñ{úæ—7Ú4!}i'ÓbY¢–Í¿‡‡¯J;K"»!3ÝTZ)™ó ]pl|ŽÚÐq<“Š&)¿ªôP=SõEØ^UO_*Ä ‡À,Å’Æ)½TÖ¥˜£«&—çzÉbIv’Rd.õw"6RŠ7¦§¹ÜS ³Ñt“ºýz~Z j7ÍŠ«kx¸Tšµié–Ë6jJZ 4p¯§Ç"ÅAWĤ?Êp­¥}èu4“3’»Œ/m&d¥MXJq‘.˜â㼘˒°Ò“RÎe´ÄË Þ¥Jµ ¼ õ‹;à Æ5Åh¥¸JåSv\yÂÈ3IqÍêÕ,ðšx )žæ‰¤‡ $™ÇS«¼ 6ÑbKñÉ^ßvøÔç{WO?2o´Ù²þÓ'°ó=ÖJ’âvß¾<(üpý' ^б;‘¤xQ<¿æÀWLŠÜ\³’âuòÈ,RtÈE²;iLxm\H3Ty3¢ÜYŠß‹ÖÈ_ãÔ|q9ÝWr#¤¨Q¦B7)àŠ0ÃB·Dzàb—øâf??“â/Æ8‹Àݦ»Ç=,â3¢ g”ÒÎ×QQ?ŠÚ0!{3( VÓI I‘ á ™§ƒ«$‹œÏGË]eÖ³6D‡$Q8$'Úc{¹°cbXœÁÏÿa”ZK1úÐ+(À™É]EK5YÙR\¢$Ðܦ-ÏÞKNêòå™ðº¯P¼í^< „T˜«×ç9eÙÌ™b-Û&ëR\ µVý9ú4›h°¥ÈݶGü|‡ŠÛø ’¢™->ß³EË÷6,üݧóu"IñšƒîG´àލšŽ”"-@&Ï"EúæM‰"éôgQK…rdôýØì²’¢Ô ™©•¾•Ñ%¾—µ$‘–=BêêCFp…,Å^}‘LÜö8›°#›¡±ôƒ³·2K±Ñè/M¼›œÇ$Å.cqÖ«!Žˆéèã ]AŒç€4ØÃ¨sË,EÕS×y¥%)&#âð=¹y µ‡nyÖDÕ´ôìƒvCkôœy$)R·ò¼mÌž°bô¡ÓôÔÁ¬¤æ¼X£0––DHÑ]­d…?—&5¬”VĉW”Ö “ësõq4F!)§Q¼ œ™9SüÃòåY««•êƒ$ŃÀ9£œÎ*Ò©MTØR,ØãÛð¿‚(ðùö„Kq÷Ž×ß}Õ'KQö®7?oKñÿþðuN$)œN+)ÞUƒ‘R$›UŠ“ô!Åi4ÑD‰gè@¤¥nÈL¥¤:  RC¬o›#\3y 1˜+Iñâ î„+ýA¨b q ncÀÙ‚ZöIÄn5LŠçB;`álhÁö I±/¤\zUÉMãA|X„x‡+e¤ÁZIQ½DŽ,Å:4ñ@ñ#tßo07Ó„ð)«3´6 ‚ˆã±ì>°8ƒƒ" ŽÕF›èC'}®ƒgrdy­¢,–¥È%OYæ©•§,âÙ¡H9kÖ¹@.ÌMŠ5F^xfÆL‘(^ƳJ.Åz[Š1cK1ßç{‹KÐD¾IŠyon÷RÜù³}cá‚–â¤Á˜œ(eŠVRlUw­¤ØŽbi‘ðfg;#¤xqÄJŠãˆ8Í ²_\+é£LFJQî†Ò5N…®Çˆ×á&âpd|u’‡{CbvD¦H‚W»q€»øØ$-ZKñ Q„³$ÅG!iô;Y#µ›õÙËÛHƒM¶â2´îG²¹E¦9Ø3Í'¤¡uƒ)ÏΛC»OAÐ…Ø»¥3H+ØT)ÅèC§Lq3DAJ OÑ$)æ9 Yƒ5aŠT%!%›—(Œêt¹0)J™"ÁÃ[dKqžØRd©á‡$ž}¼m’⧬b϶wÖËR¤{ÿßß'´¸{!Kñ¯$ÂXh\Sä8­6ÚTŠª6+)Æ!â¸SwbqL–"WC»•o™­G$6‰¯É^U–¢Ô é¡‘Abå§Ýãú¢êÚööfxñ±$ÅÔÍä¾Kzˆ¸¦¹j¬}+?þçÛôÑÖR<ŒTêvˆÌJñ¦¨×Ž1ì€Û¢ÏžÈÁzuÜ!)ºx2UáøN’bqØUP¢òÀ7lë®)¶¹‹{÷É…MÀ蜛¥38bd¦n-$EJi#Nô¡§Ï~MÑ›[:GEÚµZYBÅ%bùô¸²(|ù4 t@µ;¢¿´ÅÌ„ÙRÁ,Å4ºæ8L1±¸xˆZ¤-Åù`K±`¿Ø<úy.„!Å·}¾}»ò€ëP’"‘—¿‘yñý…,E]…19‘¤x‰ Ïk,’Êt‹ŠçåݧÄ0ݱolÞ< KÑÅU!I±QÏázSáNIi`?Ýn÷}½ý÷ä+ËnHHƒ^}{K70²ˆgµJ#ŸZÚJÓ*I±‚4²Cº¿ÄÖÄr.ãñD׌RTˆC<€Gb?"¢¦»ã»ºqŒïsäÁš!#…n´WƒÜlæé`o<$É¥¤8Ae=‰éáÛ}¤Y¤QZï>mÓDVº“å3Øj<ˆ¦IŠCú] äRŒ:t²ôZ˜‘EJuJè¥ââB!'Mß@‚²D¥Œ³žÅsRQ.'±þàHãdŸT0¤Xløkó<2ÅrE)A¶¢¬¶¥8/l)æ±LpÏ±Ñæ­¼p)~¢ç‘¯g›…‰Â=¾í YІ cq"I‘ ¯ÑÁ9™*MÖy‹GÆ'€óކtËRØR|²Å§ÛÉq£xgÛží$Åõ–‘#¤˜¿oß`¼ç{kAKQ·b,N$)r^¥Ze+~Kïa-E¸ŽŒî®q®ÉRìG|&r‘ÑÛG·«GoÝ¥tçFÓ?OŽ¢È¨ÇoZwCRD­hàpŽ!§=Ôµñ«"¨!¤¼vt$h$¹çŒ(¡ÅQ²1â³Hñ\› I‘"׺†µPg7±†vø ¦€î£Ï6ÏÚ!abˆA]kœînd|§’.±{ˆG7)ÊgP uKRlÁt]C’bô¡?˜ý‰6°Œ™íB±3¹¾VM‹åÄÉ×Ñj’bÉ ~ó~\ýRÊø˜2—æ¬<”Å¢×ÏJ«\µJ­Wü½„òDç…¥F /Ÿ±îŠsO.QbÎ)ý<‘þ‡ÔL¦æÓ¹¶cÖâ§o¾ùæ+¾çcòËÆî}ì½×w¼Ë¶Õ¼Â‹,|mëPÈ~oܵƒÉ0BŠìˆ-›ÞÞÄnÞsaK‘¬£gŸ²gœz^b{mºÍJ¼ÖHqýéÒ RL¼ŽÍ!ÅqÓF#££jèÀ7€wu¹? ¼ ßYvCBê@¢în.’½p n§JR¤ ¸áéÙ§#z×ôž«›AŠd8Žv¾ÝMãúüéªl±Z: ÖBŠp É\Ã$EÓtõ"Hç~¿†„ö‹4kt¯ a¼§kíû.ýãSÍ_›Ûò©|!{‘ºPYDÛRèÅI`dñÎKÓñ0&h\Ó512Ô+ѯï}È3¨ÌëLÜÒtœиþG“sä7M +]žµ«\ÀfâH󤵒þ6Díªnͳƒ|éûìAD¬ …Ð`}·`KèÎ ù Bò˜†¨¤Ü )BöívÕ eäцžIÿ ™…ÄE¤½eñTOãV/&)ÒÁ«—Ä›^ór p&ŽòRõ*—^w†•N/vÉ®©%@%T³·7g’kÃ¥Xû,)ÖŸpœ+ñ|6€XÔÍ‘¤¸fÁÆ&o«nºíûß, ½¹k¿ØIúIpÞ~mß^.żWù-oíÚèÛˤø¿‰‘ßÚø0ò?`"Ý»mc,p)’ɉ±JñÒÿsüiô’¸‚ØBRìrüñšµ‰S9íg×X~v…¸¯[Âí0þPOSQ6„pfR)TöZwJ׊ŠU0h!é…p—79aœiÍÍ qŒ®@Î5.3¼« WSE&# v6ªC)-2',1}…Ž+05ÙÚÛ6:?¯±³øøøðÞ¦ïÙ–íÐxZ^b=AGx{~»ÁÇ¡§®³¹¿ux{רÙÐÒÓ?CIAFJruxôôôUY\ejn049-27’”–8=A`cgEIL;@CknqINT‚…‡\ads{„®³¹Ÿ¥¬gkp_bfÄÅÆ–LQUÀÁö»Ânw¾ÅËêê눑œ…Ž˜‹”žÆÌÓýŒsÿÿÿÿþþýýý䕚ßv}Ûem×NXÑ2=Ï".í²¶áƒŠûüüÝÞÞëìì硦ðññúúúüïð17>28?SYaU\f?DKŒ•Ÿ¯¸ÁRW]Y_ew|ƒLRYOV\CJQÌàѫͳ€µŽ]¡o,‡Eéòë7:ÏÕÝ•ÀŸâíåI–]ØçÜ;RZ msy~žÆ¨ÊÑØÉÏׯϸn«~£È­ÇÎÕ8(.K'.o'.Œ%.£#.À".笱5«ÂµXTIDATxìÝ1@¸Ô¿æúxvUdn $¥‹€Ë+0èå”Xté"à—ë @0HÒAÀåºHí@&p >è’.€LàŸà{^: Èø B€Š ¤‹€äúm€Š àäõÛÛ€€ü:HºxIé ÀŠ ðâ‚ÀŸ½û@r‚*¥&ƒˆîÍ_›3¦VþãwƒîjGÒÿæ9IqYžçišEä —vUÉIŽë•=vô x€-Ò³¥ù*I%–p¶‚<©Îï%«Õ#üVš°·AÆ*¥öâ›ò_‹Tà+•®•ÖÊ/-b/õ ½°xÎ݇RŠ3 ãÖ™C Ì÷N-w@Î?FÊ÷´{?+E­”–…õx'´†ÕèþÌ^Òúu/Šó+îia¬'*%ItÎÈã: ²ßâbÿHâK‹ßà½ÔoÑñ5ë³”‚`ˆÈÊBD&,?Òþ¥Q¥í°—º~]ñ5G"CV)µŸ…¾ÞÈ02/!’€ÒÚ ÁЕG?ì¥Ö½|Ä/Lo$^Ùã8Í‘¦qúÒªãjв2‘éÐÈŽ¤¥ zý1ºâkÖ«d[úi¾ ©_¬:&_À‘•Š /)’–¦ÑâkÖs$sýÃ÷pÓ–ÎFre{3<|¡èUGÄhÈÊE øº"¹Û6põ-æÐ–§?TÚiñ!T0ßùå´-zõ%z-y/%Ý1W„ðPÒ@üÂôŸÁÂ4ÏÃýé‚+½æy VPo%óH®)ÒÒrµŽÛå”ö»Pn^¢Ü5-ƒÚ™«önÑefæ÷£?å6,…Ö‰¾ÁÖ™$>^uŠqYè(Çhvô(†Ô`ÌC2(1”€á´€ù…ÿ©Ùâp²´¼¼ì#nUÊšCæ×¤¬ºÀŽ•Íyf^®M ©=*Ñ…‡–eÿ9À8Úb4ø¼d#/½@h ”ƒO‹MÀ µ…ÀÈ*ÑZŒÔ¤ `)k.ðgoÿR€´ÉõÑŸÀw§<´$, A¨ôb)†!%#ÿUÈåXüMÀ:µŒ("ÚFª²ÂH„uY,[Xò”èŸò¦:4/¦bO÷èQýq77ÝY ÉüÆâÿlmGЄW Hæ‰hø¨tP,[Âÿ„…S*aNy#*»›{{›Ór/î Á>Q x—Ø!¢y`×RÁÈ()}H[¼ƒÃ£ã£“SÿcôOOãágKÀD÷oÊÞ8CóóÅó3ld¡ÝÌKÀÅåÞÞå˜ãóCÙp/D¤€ wðwuu•ïºgp!-l HœÓãëOÐpð5ŸÚ0\®ºT2¾Ðp‹Þlaó8±L<’àmî5l‚9^!%ܯÜÙ(áÑ*§Ë€Z¿ÏnŠ >´S$ºmW›×/¿%5{!¦MÀÁõCÏ;ü5ð9@Ñè÷ÇÍÜ­,,..¬Üe8S_èóÇWîéÃCó8 ¡T¨õy‰¢¾F«®!q/s³Q‰h¸À¦u=Ò‡µ§°ÏðÖjκ^7 Xé(ÉóÛ;ÿɳzxüÖ߯ÃSÿùäm|fs€¬ÉïOq‹¾maÒ0ú[ x!zÍ¿½4#€e¡M#™\Ö¬¸›{{|VˆA•‘w ˜Ìu@ò½3qjãHÃ~5r¢’†ÝUUP"ËeK{³¹¼7¹\˜A Üá†ÀGâÇpXÀ`Û°€sáÝ5>‚¯øÌMv÷¯ûæíéM¤ׄ…¯xrhÞ™aÔz«gÞß¼}•œ(-+¯¨¬ª6íšÊÊÊ&u°(–ŸU,ZU//«ÇÅ^V]YQ[/­1¯Wi¨š%UÇMU¯Å)fªªKËß&ÕÇëÜŒ«´ÌP)Š“u‚.FÌ_Ù@§—Wˆ ‹Ý¬&Nû*xIJÊ6]#—¦ž(`:ýÊ¿ÅLÀ;‡ž²ô*Ø3©€}p½ôç?¿ô‹º£,K$^d,jè9:âbVy›š[bþ]‡7é°–@ÎmmÍ›ÖVsHmííï²”zºöÝÂKŸ ñ^VGu3¥Z“Ê€W­íí[Îs‡Š‹‹ ŒÏœâ ½ åuvu÷[rÝÎC%¶ž pöVèmoï³qRO÷@¿—oZôÞàÐ@ÕI»»OÛyˆúão ÕŸ0ï±Yɤ(8— ŸÁ¸<µ2ʘÜ뮬»ËèÌj²ê˜T ¨aªþ¯QJ?Uº…ÊÍsù7Å™ÿ‚J^8C Ñd™d™i;Xñ¶Ti”E«Í3¢ÌT 7+Rôȶ@ÀðððŸÞ7^ï?ØØ*{¿WÀ^€¬ß)ïû®“Ä']¦}+eƒ€» \§Fvôx·ýüñ:r¸1‘h<|„¶û˜ª.`TlŽãlÛJÄbfÑiÀ»å÷ºLè¶þ»Säô7ñêÿ7«iUIMf€ c«¾ˆ´˜26z±¡i:2r†ÚÛ ì<£Õ—íC€HØ¥ô[A«O§f 8£“†g̯ ¤pRh¤3k¾dWÏð?È”P”—ªðg†€ åÔ  ?j ^¡†oVI© ‰ûH9EQ}-(ßH…Kµ»"*®!D|K•µóþO˜/0Ò{F“@1—KúQ¿0'— ÓÇ„9ÁTs²}í‰L€÷_aRg&€—Ï2©W "`šžƒPûØ®î3n»ðó^&ä}Þ0‹bŽB@pÞl^~ÏC}ÝVup§š^—4Ó °÷ÅY¤€Æ9\ÌÕ<ãtŸ‘°Oè·‚¬ŽB€æ¤Ð%ó0ÔcuÒ°<¸Ð¢WŸ½=DÐy¨nàq·¬¢Ì|f,+5Ð_ˆØªì-¯7#x5cUæ§P-¿œª£4ï«y€·7«<š4Å誓¥ ÑZ^N·ž É©z+0ã1ùc‡„ù×pØgF}Þ²úBD€¿‡ÃÙdzÿzÜ ‡#±69ä±}í xYmøw½Hjw—™¦iàÂy¯¿µXôìb>jÄüMó/þßA€+? ké–‰t¶ÇµCàÃüVÓª ½’šŠØC€½/ÍÀœ !qÝË˵Ì—ÓÆÑq­ÁÛå|tö¿øø“O»¡?þñ“ñ‹³|¯Ý ŽC€î¤Ï€‰¾DÎ0÷Œî¤Ä 0É ].dtÒ~& ’‡É ¥(HÖû3dèx±]]A›e Äk‹VÕŠ ›0¡Nm ¨fªÞ1JóÅŽ‹kTW•š€Qe „-q±Y£B@yE]ÃÄ=ß%pGA¦—t þÿkäð¨ÿËCa®ò^Pßôtþö)ÏžßK*ˆùp[ʃ‹Ú€`Âbk îØ<ô¬z'¨›é ຶ'–ËHÒg¾Ö`\´'£/úæ19dB€Ô(pÑø˜.¬ŸÀ Ý3Î@À[ŸŠ €Uü4ÉÈo­:¸Ÿ åk¾Ø\Ç=±k eKÌ£C€î$rÃÜm\t'õ³>ÃJÜzu'íæ>;?D0‹"i…’¨ÊõUŒ÷‘ª mwÊ‚fï‚2“K•ø]©l Q2O±ø5¢FiDR Ôâô|= NÈÝ¢Wƒß4èô Ñ`@ªÄ ë§? ¦ƒ€Âá7¬`èƒ?M¿i¼Wåio4þýOǨ3OðS¶¯½Ÿ³4ú<Ü|Œäëé¡7À5´ç÷.‹Ý~FÊéžænu2&¶ÝÉtß]p¯7õ™y_ÌãªCà£&¸Ó0*l‘/èåý  +ŒÝÌÐ$惌 ÞpûCêù7StÁÕŽûÀüÌ´€_÷2ð Ën|à4ð0˜°Øš²w´'§nÚCÀùsw€G½´= œ¿<+!À3 eôEb Ž› 1 P wÐLö GóŒ#E€´ú” e¾Ôêðîà î7mö…RÇ—nµxb\ý³ÖBèNêÆøFA,æÓ4tq;œÑ«Ïž];ÀyГõ'JKKK2@€özŸÜÛP-‡Ô›Z£´Ôò0­ÊU$¢¬PT}E¯+5d› ¨õóªJq]Ý-Š©³aB–:.z êúÙÏXX=J«é Ú2ü_†Ã¯i ‡¿¤’}mý–}í½æM©š¾†TxŸÚÀu…Ì‚ë05.>×1À0µLu&u •:!r_9ò•Ü6RWÇ Ó@€V^:Üo¾æ¡@;¾¥—?SV7A€w¦Lø\›)À’/¸¹Uôu[Ós; GUóè–!`¦fÉÕýÀg Ø€€Â ãÃÉ&`(°:‹"?ò]€tÑGN8’ ø8|Ì„2ß Ju¸6SCª/”:ž'êþ2/ÓðìQxI M#ôRŠvp¬ûTÀ£žÑŽF=ëÀ“–šçÑ>-Þœî¡7~?cÅÀdÈYúSž¹Þ58â |oÔZ/ãÊ3ÜÌb‘¼†õ}:ÐÊ[lFñëæƒ=B`N ·LÍŒD:€Ç‘ˆŸyf'ýï«pîrÓ$°P˜š¦úº­)ç €æÈO–XN`ƒÀ®Èà°–Í毎ç›àÿ¸âÎè‹¥9œ)Ø ‰G@„6&e  hÒ=ãLŸ€OÒ3À' òf¸”ê@5 ­¿±kíÕÉ:^8 ´|×M/íŒå­“c—9_§wR¢+±‹0ô¨3 9I0‰¾îÚ^‚÷C€H’—׉èn3D°I•Q$ÖÑ@\-JŸ2€WZGåýÛ(ÌŸ4!ÕVV Z°…€µ!¡Ba¡¸8‹ö ©ÒZ2C€Ð/³­ ×?:࣒zÑÏ®TDà ™%šW(PÏ’ªLPl¨ÕF剧W±³8IH(±ƒõË6C@ ÓGÖÈ(?£œm¾üÚϬ ŸŸ4iˆK…:3ìÚ‡€½ Ñ·ÒÏ ˜ò+xWä2/…Ä“m”ïŸE{>kFé>ƒü ?©ø'L'Z™õÌ>Ç^jßW†ã…¹Š¬Ç¬ •÷!ýì™p;d>Ù–é&0Ìž^ÙE>Æ$ë.ÎùæÜ¸r™§'­gúw(å=O¿è4†:qʼƒ«<¨µt?|2‰ÍðP°iˆ 7-t4}àë¤×Zôu[Ë@-ήº”Ýø}QX¨èûÆl– î™ò²F Cý‡<ðu1i“‚,#ä®ãB«ãÀ9sëæså®fç!@èc;°»ÈŸjn;· IõE²Ž?Ö' ­ñ,Ø„¼ne„/€I¯±‘wh²8)ç‘à‘6 ;N²§€×÷ÂŒ)•ŽE& Î’ŠÖ›)÷,¹¿ÒÚŸG”¢7J1Uù´•Ũ’­Ýkdª`;C%„sÅÒ‡jŸ€˜µOÀ?EÒÕ=|,gÜÏd½j¼ï¿šêˆzÀ¢üÁS@·údë¥zínù¢?ÍrsÀ|Ù M‚tg€±tgnýøœh¸¬C€ZÞ`,8‡þàZˆ§»ýÝàÒ àÜÖy:3B@Á îyEзڶIï^zñuýÑoÓ'``$oê'S…€ó™!`L zS €úÎ}gn®­qø¼æç €}lÃ6·‚— Ô¤ú"YÇï!©KJíyœ±9 °,GŒ§-N ,uÌwÚ–¾ú€€ x}¬"˜F,­ü'*dŽ·Ÿ  »>j Xo¶Ô [Ñ?h¨-Ó­¢"HÕÙCÀÖš¨D¤sOK¡”“i“ÿCLq$FüUŒøJƒ€Æpø?ÙbtÀþdA{u!záù9fÑs/k)MãÀ#óɶÊHm–L€TI­cß,‚®v¦ƒ°õŽ=@ïÆïNf)ï < a¾­cl8ÀeùêàÔwÐo±…­Ÿ×(p{ÝÐ#`þÆ™guÛ¶gW‹d€]ÉLÀ{ÀCV(Í2”˜f× -÷nôÊÑçÄÑ«rPÀM yšgœƒö±ØÜ ²:Ð>10:ò8|L¦FµL@'­£|#Lt'‘VC‰@à8Ò1ðup¨9À!x3¶­U©;~I]\N l ÀŸIUI3ZÊO(£Tý•S«¢%I‰K[M†=T©Å½kÍ¿,“p¡+švÚ`!z¿/ú뱯Š$zþß_15ôy~iøþOÃ4¬ `Úའb®à—>gš>‰Ï ¬+¶¶&g°NO6ñ:í¾Ïûˆhï-ý/˜~¦³PøŸ­ ìÖ—›Þ¨¬Ðå|Ke½ØÆì,Úsˆˆ/l†€^Ùª;ÒÛ:¨ZÕmû!‚-‚väË>—Xp#uÈ9dÀ®ÒgÎàÕ‡:bA!ûõô[Aí'zU@fjh®±¤SÜ¡2¼)çj!iNj½|yXü6àÌè€×uØÍóŸj)áªz3w_*«¿öP³©q¿>ÙE0Îm=ò£"w:©{[æõãj´¯²‡u`°œ›ÕÉ µÕ;lÒ! ïÙ#ôˆ6càјeÆÀ„6càþB{åýOjuÔ}2uc€ÿæ[e2½WŒÈ£'žð¨Pöù׃joG54=CÇô3ƒ€­Ot`¸Ëï‰n`®Ð SÀ Æ‹`qÍŒq'ß ï:DoïÙ|1:@ƒ€´s¿ß4ušº—ßôZlûÙ^Zˆv $GÜ"t0ÿ$pË­ûBQïMS4Ôò&Ïø÷(ï¸@;E¸n`FŸÇA°Žü„éÊx+ÈêÐcV«üõt0 |¤;¡­­‰7¥œñp”Ìú_ªc‘@ì0¦Ÿé4ØOLðÍx¤é"¨HVð,€·Uøï€Ç6v8éëZ@¹vMeóß218Ò¼䤇€` •¼À„fouÚà–ö#A€ïM#ÇçÛ´wzûÏÏÐ<:˜]B{ì}HN\ph HÝf§BóÀ´î'!àS›¹ínYú€SçcÓ“Hžuàátlp…“S®ñ±>6x:­“Lß}']f;‡§g€G¹ŽMüÎ;ìG†·#“ý’‡¥ãa®ã6PE!Õ/ 1Û¯ˆûâÚÔ4{2X¿R„^=ò[†ÚVÊOŠ‹L€ëeÕ‚N¶õ%¢¤RyE©ºt=÷µT€U~_ÂÅTôʺ²}¾ u%a°¯=¤è+DJÒù9b€WX*å~¡ö—2c H¸SãÖ úì%˜šÌÓÏtì"¹z!5ÆR@›€90ð°H7ÍÔHgî™{Ê Ç\‡© }\ù[‡€]@H×±£<õwlÀz`j6À¬@ñqá;Í™ `¸¥´u˪ҭ'º]NBÀ-ë°ŒÒoY‚3àZKr¶L1t2´ÒÜ9›„ZgaêÒ°ÕIÃò’÷èàX@ÈÉŽ±0 i 19$¶R©D¬ºKâƒKžx5cb© ;/ìÂH‘ů"ÎRu8LKó)r׈_•ßW¶1y@Ce]%…z{ય¨¬Œ«k Ë"ª Z—øûI”ýˆŠþdo%ö!€e¼üjrÀÀË èrß½C ë?È'[~×Z; Ûü¦îGÀÜ7ÉÜ"BŒPZìê)ׇüéÏt ¢¶K “Ægæ,N\f©ÊËÚP¬YÞoùÖ1g’Æ“;€"ÌÃ`~rJô|W4Ÿ×W†µêÝv|¦Û;¼”°®B9¬²0#´ãÆæµnëCü§ÿ Ckîyì|ÃÛòÄòRïÝâQr aõŒcðÑÙßZt– Ùß ju(¼:,OãÂz_úf`r0ÈH#L„z¾Œ¦ ƒþê·¡@ 'ùø%q‹êNúÿ}í6ý·)à—[A–JeæÐü’’ªöµfô=Q'õ³ƒ:b$ôËRÍÚW¯í‘0Mȯ*Z+£tƒØ¨Óüj²M" .¤–ÞÚ+àÇ Òÿg×õØ×3v7ëïþLqß\æÇ ­-@S^d4”Í”×›`Î’_9¼äNÿ§1ÓÎ|ʧ×î'ùxzðÈáÆD¢ñðž(ô1‹üã!?ÛºþòËÓCclÐÝãÉíNˆH%ƒ­º'!€ñm}4ÿ>Ñ ìì\yAÛ:m³þF?}ÞÂ$:ØŠrÀ~¿¯ìEÉ"›þjãØ`ÑÖƒ½ ÁØKŒ$x<HÊÔRÎ àØÉ0@<, ?È¿žéKßÞ¾zãÆÕÛß.é(^Åž](~N€–=/ ¹‡€G÷ G3ø‹È@½"©?'€»þrXyyÓ`­ R0! F¯² a„ÿÍxbÀ¸(DŸ!Ęíäfý|ïÝë’øWÜ †l,  ƒv›‚†¤±A´ƒûÄb¢ÁÙô!&$0 ©éPN¸f#jÌà·ÃC”£ûö¬|¶ð€Ã“Õ‡ç»×í ßÐ|<ŠÚñ“÷Þ£ÇMÈ'¹H oL'অë&¦’¸º2LE„$#Âð´Íú­»£™IÈœ¦%ß¶ÛK9$Z9«Ôñt”Ô ŒéŸ4>û„©qü5ª1fM®Q@ÑØÒw/_~·Td-ÒùF¾!@Ó€ˆ=xÀ_•Fñ".A1"$ÐnâMÑ“L^Ë  Vtv¹R¸uB<_Ïó.Ç#¤î¢¤d4”!@ºiϧ¸hÔ—pyK ¨\$ (Ñ P?°VÐéEÓ“»/»¸Њ P¤1ª„ºwű Ìɰœ+^R5PR<  çæÖÎ7.tÑ ÇÎÊ1 @P H Ì P"„g®Ì?žœlöLVë$Gõ*E©HeP€^1íé˜ý‚Y®…ie8ôu(Ê23‰S`ŸåC€F€b=~Œ ˜¦dU½Zmî(P¯Õ¼ª…Ò9^"H¡2ºü¿äA \ä¯Oç/Ú¹?¨“á çÐ,‡¾N¡(êdˆ>•~ eÎN¿Õˆ…ƒ‰NÀ^o€„¥»wïþ%-ôÎèôú-0”J±?—¨ÌYö0ÁSøÒ/}¦Cs(ÚŸ œÔqíY¸Ív¾¬ûPÿ„É^$!@œaÙñN€ú¶ZFcôX²¹´ƒ!ÅÄ·R*m,_†Ê./o\¬C2þ︦}*ÓtKƒŠ¦ÓŠ;U0ÍÍ Õ³úú”Å‹´išS—I~àe–ÿ!e0†…b#§½ö´U-¥’«öx]^v1áöî¶ °O‹#¯C/Лûo"Ìœ¬áÆš¯ƒÿiÆ›ðm’Ê´·h/€ú…QüDPD,!5¼’í5IGãO?îÞ¦ PfŠ/Šˆ‹±a±ŒîcÒò›$‰ÈÑñì`{ÉÝ›t6°°J‹fDÄz`j8M@oüI:Ú¾Ó»îuºõg®´Ð;»!âÂŒÖð±ƒãOÒÑöŸÞ½J þÌ$?ú ¤öʸ~QŸ€ÜFÄu´Árä?¤—N{yÔ/L°!¦B)öuäåû£T ßK'OêVog? C×_*wrΘ¼ãìû¤Œ_*÷ò=ð«:ZÁ^nupéÜÛÄ™yž "ÎFæfœ¤£)] Ó?Špf«0ð+3÷C’›$aeÞñì@{á?s…Å {w€YW…øœ™{!ÜF\0— ²Ž'd$ÝC²¤fu…‚VšæUõ½;ß·„ÃÀñŸù§‘#jD#ŠFT¢&0 5Á@`%Ñ%w  t%JŽˆÜ!Àu Ø%"›€ýdÿ5rH@”Ü @àD %÷ p"ØQsßÝ€€˜r@@Dލ9" r€A FM@0E‰F4EÉ]Ý@‰’Àˆ"wpÈ6@‰Èýl™À?@†%wP 8B@DIÀ‰ `À©©m¹Z·?²^-­&7í¾n¿ê}o£å¶-sß~èóÒn†5ÏmîÛ§ô¹å‘hój´ƒhKß~Ò—–§t0ÍÛæ)@›·Ì-÷€i>õ·~ déÛQú’ŸÆ²n[—šg¥{; .¦|ýòípwwx»\Oq ð–Lóí—ǧç—××—ç§Ç¯yÎ.7ßÞqs¸È“Qçí7æšcj‡ëëÃCKFaßÙ;³ž6²uïïçõ@byhìtÊ’}.HGm©Ó×´ÔÚÍÙ©¿B˜ÃlbDŽþ†íDœ`Ç¡o 4 „ 4PQwÎW{SUË.ó¸\!‡Š‹¤ý»ˆ½Ê…Rõ «þµÆRø¿• øÖñ5@9U€ÿÉתì2íÐqƒ¾Xb²)± ì늂öÅ~hU~ˆùè«§‚£„ ¨ ==OqðT²³¦²_øê~¿ú$&Œàÿ^þ:5@µMËןÅ)²ý>úBùC6å‹Ü`}[@]ƒ,øþÉ?üjò¼{ò½,h¨£ „«îõU¹€«¯ë\T¡²bà_’àŸò\9ùW(ô¯“+”ÒŸA[ò2|N,ÊbI«Ú‘„Énì·¶ë;²ˆÀ¬Œ÷ƒÇ=ã+0 /Y–ýùo¼‰²WYrG’ 9xìp<> ‘è‚਻u ÔÊ«@à•Ð)·êô—£²‹`¢ÞPžÀïŠj÷PÙñ…ϬàDÖ8@¦¯Ÿ ¦Uh¬§<õIó­t>Ç›=öˆöýxü¡²úÚg‰5 yõŠø”›wS1¯EšègYåϧ‡Rvxžþ)«üì"ëá÷UÁ.öˆ™òÍq¢ÿîp5}”޹ÅÏrýá²|õƒt¾s¼»*ËÂÆ#Œ#ô¹"ás‘Ⱦ—å‚?Èò÷šPxpËä)ås# N*AãÜÜ”þq!BáO#$‘W€„ãTŠ$6€•`©1ín·>Ê7Y`÷‹óPa´¤7ãå̬ˆd¡5‚'¢£ä“ª’ÖpéµI5ûúkvs²(c¤ $dWä¼ÿ)(ŠâŠß+G¯1ÎËS=S^q_¾öŽë×Þ‘àñÁu“À¹Ü‘…½}„qÀIÖãü‘¿õçZ~tR1O¹š,½S½½SÞÂ#5uuu­¹BôÖ~oKðstH²|@DÊ¿Oå<ש ‘z6 #â@§ø¸°±ººœ5=?6VYkZó90#Flxë4Ì¥UëôQâ6]˜‡ c/kÇË"kžÈxmf# (®0 ±àËbˆhxV”1‡¢yíÄMEø•l'#¤ý”æ¶.' q_ìê(—øVy‡Èò·*Ac 9’A{DÀO²| ÎwYþÉøqw©<¯¦~Q]þwXçß’âçŽ ,N}†÷Uçh ¸&Z­f"@ŠÚ/œ3w–>jmf·ªµšx…ÌþßÙ9Ÿ& ÝGEô¥&2` —©=CCCª¤ðÍݾ%ÀUûl£EãÞÀ¼ËZ¯í‡àrÜ¿MçAÜ—HÑ eÆ) *‡_‘à¿äÒ* šæ{/Ovm‹;D€Ûða/Ä»Œ"€¿®ߨÌèçH@¯¹ÖÄÏÙøgx_Íue>ÕÇx–åMDÀ~SSSÿÒ¼¨Úíðò_ëg±;6Ó’5–›¶ê0JŒ÷ª¨˜}(ô›<(1H ߌMI_˜† ÃÙØwÆÇJãÙ}ÍRÉZ³þ £Ÿ˜Z# J3€%¡ë€‘C»y–1Á)?Y-ÂW®„ù çmôögÏ÷"/îK¤èWIe` Ðâ±Ï‹ iXw“ÂòpßðáêÞ;Éçû—]NàˆðZêű»¦À²8Â|®æš²nOp‡½¯F,ð²ôZVøÑW0;à¶ÒGÀáVq·{_€àÖîO#/€C÷ßG†€ËM»¬ÇÛ:°OEHóP˜1Œ‹,X¨Xæ¾f©d­ƒÙ Ÿ(2ÚÌ¡ ŽòØÖcð²Ä±v)OÅU²Xú®z´Šz™*«RÔ*{”_˜©€à…›4j²@ŒT"­Ãõ—HÇ×:«.¡Øpô6YBä@–dH@–"&"@j=öjÄJ¾Pˆ4"!ñKÖÏ6oŸ^Åç˜8Ôtæj®$0  ØŸ¡ÑÚñN–åŸôuJÖÜ*‘U ÆlPJH¡“Ëñ€¡W«êkk”Ã!Iý×§ÿ¸ÄKµ%›:C~  çùCí ²£»BÜ¢Êg'°kµiÝ›@iôx¨>`ÓMœaÏN÷G[£µ·µ¯mÆo“£¾±ñ!iÄ[[‰Ü_x%º=Ùu·ÞIÒòHWÓa,@’?‚d*< ôä¿§¼§¾öR©õq-J„·M}ÍR‰!•WÐÚýj°í¢”îáŽ~ó"cÔrµ’MÕvˆ€~ _ÿÚTœ€Âu1Qdù*jÐa­¤ÐSÔ ¹twKô¹©´ü?4€‰ ˜-|$ì‹fRw÷&`t@ºÙþî,€öq/YÀ?dù=•à½,ÿ£äãÎ3» `sÉME¥@hå9,»dvvéYL+é9õ³ Ø×ŽLã~Qsù³Hy•/·€nëg:±ÚÀÿäl"@Üý³A)0ôõÌÝ^]ž€éÁÐEäÏ÷w'€CR˜œ€Å1*²é$42êÿ± ;ñÌÃ^]XˆwY·rl˜¶Ú´-À: °Ùã£Öâ,÷<`€±#¨$ûî@ÐImš2˜†ÊQcÎ!ðv@aA³níT–BtnªäPe*…QÀ“¿¨5ÊŠ«w¸Ò]-^¡zŒ½Í}ÍS‰á+³èÔ‹íºDºµ#Ã㟚‰V0m‡èÕó6ÔØè1J@w÷=Ù¤â±â|Má¹'™‚Ú}é)ZLèá§ Ÿ™¿Ù LT@( øõÒà R9¸ *` Ï4à{ ÛÖL•yL%x,¦ËÕaõóÐX¹\TjHeIâ—ÌÎÖ©Ò \Q¿T­"ÈÕ\1àYXaxÉþÂÒwÁÙE@p—ÙÀDt@w±W¿Y…Jf,':D¥" Ãh4·é$4Ú‰¤5ºè4¬…x?Ή€p˜R>ÿ»X_E蜴c$03L§ÌÑFŒÈ&°Fo9‰TÛ,FEÀd‚LgN<‚Æ‘¤x¨‚¿-"Tô(àÉŸŽÉ åãhLx E€±·Yf±TâT—Y ÍšÖˆæðVTx“šˆëãž¶‰€Ià%ÓG,ó>Ê4‘A¾¦°> /LÑ @ ÎE¤|TÁöÙÖk“Ã1`‘Î]`¯§oª#ô¡ˆµÌ£©ú­U@Ž%`¢i0ñXðY2!ÞC9¤º÷ïë$ÊásŒê°u`ÿáíø,ÐÍKüÈ.™ÍKœåÒ±œh çj®W¹”;9þ¤²Uì“gÈT³`óÍlZ'00¾`a|¼//<)ÙÙ7›ÊÇC!€g‹€j}iÈ Œlíh²cL = xò Àƒ#ª£‘ú®`¨5úhŠFƒÜÛÆ¾f©Ä‰”YH)õ©îœÇ,u !¢7ȸ¹pO ac“¶ÉZ‰tX:Û€™þ¾Î¶,ph(€£­É)Ÿv_)ÚôäºÃºÉ~*c¬×&?³ÄV¾_R>%;DŒx‡4Ð ì)9"=·¤ ;e]J\?=Þ§„ãu˜GŒ‘Lo,:Y‰?Ù%³³uÂFÕ¾…hÉp¾æêúÃ*wû#;E€xxv Vƒá^Õ0h6ÎU ¡ÆP)'·©>ê¨Ct¦·¤6Ød³piìBe *Ì¡s’ªI½O Hô˜eCTàQÎИˆ…D æD@7€½b kBdâD®]¨Vl„–R· ;E€= xò À‚CzlÑB+@«hâmæk–Jœ2‹G&Dô0FS@œÈ™B’˜p¯ýd¡p˜‰“h°½t·UüÈð.0W%ZwÆEÀl„ôûÒS4”Q8ôÑ×ôk2ù«d^ø¢[bìQÏT@ŒNÑ ô# 沓D—;HaRÏs­Gþ Ö¬Mj?Ð`𴢋ã$à%þd—ÌÎ6î7À‘6Oí-2uz͵Ÿ.8 D/ŽðÜ’tv ª îÕ¥\… % E@_~>U3ðÛT¯až­TŒ¹p÷/Be/aõ3 ´SfryÑðe3À®ÖбáRtiJ¼ÞS,ôˆiH«÷ì½lFWˆ<» Õ,#¹²S’$E€= xò Àƒãx®‰çÃ……N!L½fè©d»÷8 xÉÁQ Øb" ´Œ’e"@¼üHLèË„‘HAåEoQq.ä|à\Zxî45d(h ¸¬õì8èëg ¶Ì ŸUüíB‰€_f.“Ú1¤K„f¢)@ˆz_p’”Á ÒØÃŽm"À—–¢âNY‰?Ù%³³ÍEÀ°P¿uûa½æÍ/"´ˆöª‹ Æ{{{»ïo‹ÞOS¤PäÕ½|ŒŠ€~ A*SÀˆnS.z€-îOÝÀfw¢i©³YŒA3Ø(4S-HŠ s¹$ðÀt^Y!ª‰€aRØŽˆ¼ð<Ñê´kŠ = Xò‹$Ž-`¬hŠ ©·Ã:,•ì^5¾_b†ˆÞbF'yZ4%Å[$D7hÐh€ Þʨùw€Xî’% ÔŽ”ƒt DÀ •ÇZÃÔ ÐOæ`Τ`CK€ÝµÅÝUúìѨª5»ô9ÀG€“‚æ4¸íéµ2¶Çn"^â@vÉìlÓÇR70S¿U­`®¦ æš…þžÁjØ~¨ØÏ,êI›¨:“ƒaCÐ ~3÷€^ÃTÍÈL7G?AÔóuJùUi½Ýë¢^¯÷Z‹@#„!\hg<Ò—Š‹Ùâ ‚#í5[!µ4,Ù!X¨èQÀ“_ˆÝ@c‘0õvX‡¥’ý"€v¤P:ÄGJ:-œ‹€ŸeùÉ€ÿ•埩¡Æþ ©Vž€Âu¦"ày) ½PûšE”VD€ clÈoy9_ƒQxF´¦‡ÆÀIË(¤Õ¶Ô9…ì¾ÄKüÈ/™m2TmØÌÏiÚ8úÀ^½ã /oà 1`öB ĽÌ­÷éÓE7ÑC= – E@ hã(¨aª:îAa¯Î:0p+?)`˜²u` ¤ýªýÐe*âÈw²õÑDÀ¥B ug¡±î·C°PÑ£€%¿<8Úo‘àÞ6ñ5K%Û º‘ŽÄCÍ ÇRcÀe&v)ÜkµTÐú–)×dùš¾aÊTŒ4Ú3R0lk®(il:I‡å«¹  LP3²!úüT`-¶/ü+°};'á_ ý2ÑÛÜ›¿c&ò/ùÓN¢—ùöÔय़sÙàïÌ– ®ö»¹Ýâ¬DMÊ¿ @’ø%ó³K-nzÀË^•QýhM®#³hïOë–.}*~Ëó#gÌæ" Ø«ro{¾ U8R˜ÈŸYKÔ˜¯d|—.EŠl*åžv~¿K´«óÊS2BW­Ü­oM;~;— þ ÀBðh«M‰Hô ÐE€r¢8ãÀ g±蛜œtŠé‡ˆ] À“_ˆƒÀ´_.Li"`ÒÔÛÂ׌»— $ñ"÷D±JħR7°ã¶R8êd¹¡š‹€êY®3:{é iÔëÅ 8 LæfÌ:y¾‹€£‚¬`*ü7r®GZpUÍãÚ›ÒvÐûÛ>"Ç Ñ¶|O `Uý“Ø&flÛ@¨7×y3‹ö*V¢z1à±zH¿d~v©mNŽçŽQ͵형› |?Š „LŽ˜ÖìÜæ"€›H)Ï{D“¶êÿ·â}wJkâ–Q­ÎFŠlêØÔYÜi¼¨ÍËÝ&›Ê°Å‚V ˜hµu¡æ‚å|º Þñ€Ô±$õ-í1"2uè" _=Ã'5nh&.t“wø/’àÉ/D ÇŒpæ7Ú:4* ǽÍ}ͨ±{!A?[c»:  Û@ø’À¬ÓÊ–éšR½±îeóp‰ èÆ5Z•š‹pHÄ™k<_‹E€ž¢b"ì3¡ú+|ÉS¹ ø¯³l%|sØè­Mn ‰~<Ç#`¥y21Þ®”Å>뻉©ý¹‚ïôÆãÍY Å¶­„h>ö4î ¼Dnå’ã}‰Iâ—ÌÏ.µáéòÌÔ\íX_›T“¼Zºªà©¬ñÔäˆiÍÎl`.нê|¦†ÁØ}ˆ'V/04Öïn•Jl¿ÛØ2 Ü‘Šm:L4M­‰ÖÖ»CÀáG·—Õ/^µÇ¼}fàïa;·v¾à…¨Ö¹)@,‡BûH^TÏÀæ&,º DÀMXYj0NIðä"€ÇÃ!àþØpï ðF4ŠlvŒL¼Í}ÍSÉÒ­„¿œ®ËòõÀÉ/úQ*fú¢MÏLˆªšz­“sá$x¬OãfÔ¤ížÉX¼ºÁP·sñD[øçk±ÐSTeb]ì _ôB\à@hC¢ÛÈ1ÓJ Ò,42qR¹ 7»bï€ç4Ó¹û`â€Õa]í¹Ë¾YT¢)QlÛF’ø%ó³u¤Pø“¨:ny s,Ù‰ëš,ÿTÞ LŽ˜ÖìÜæ" Ø«îhli" ²•lP+V*Óx0°é˜X˜üá4Ú{Í7mäxkkŠZaÚ& ÝG Mì6 ÁÒ«|ÇŠÖÃs‚ûn±7Û;`y‚ÅßÈ@P‚]ÿE<ù…(޾ü솪Ün„@‰·ÏšY!©œ;)¤”>&ü.q‹SVŠz­HúÂn[Eç¿&c¢«È±w™ й ô]âùj(DŠªL ×Vø68®<ÎË˃ë*IÍÀ»#¤é€…a$VlôøÚQS;Ô< =yL–àüQ–<Äð4ÈòN*¦C¼œ5®o¸Ó¢âuNg€lWDL{á—¬ŸÍ_N-ÀeÍ‚bâ_ƒ#&VÑa68~Í}ôuQŒ¼zi-àhø¡èò·m˜îkÉ«} ©®ÛF6uv&µ&²¿àžQ°¸ì1­ó90#Flxëä=…ÍbÀ7C2G]’hKíÙA;FÈÕž›¦åîÝ€¡`î…sîˆWÎèË€ôĘƒÊ,X¨°(àÉ/D@qpÔßWŠ3Í>!Ø“ô˜yÛU.×5È&4Ô‘ãÀ >'t]0u\˜1w{5´*~·ßï²,ÿì&ûçÅß}T÷Ò¶s[Oò¬ÞÚVŠÏ…/Y¾áþéûÒST,„y“*”Cˆ–€ràà_KI©Éku“ŽÓó›×yú„ß–}dá²|õãônúWeùA˜Lq^Ž…J•( H&—ÌÎH‘ð¹‰Hdß‹÷þïMŽ˜Àl`‚‰WC­Q?‘ Þ›~*ÄÝ RI›†ü.qZì2Wsüõ°<ï‰‚à °‘8o‰ `%xVCyû¢Õ§ãF*:£Ïë3KÏ}­’=+šÀ“¿ 8.7#¤#¹ý3oK‘òåŽÀ{rUþÀÕ'1]H|·”Ë{,©z¬\ì-Ó+½O W•H@á#¯ðÏWOQ$¨`ÃÁ žE(O@ÑÈ Ò2|n|­%¢qbr¤,è"À~kûÈZç$ë)O}À|+ÙÍ"€ñˆ•Ó×>²–`ƒ,7éÂâ|ú?²,_«s8ê®}øò?Odû@'U°±% BðOù®œü+ú×É•JéO[’×ewg€@s¤â#6‰û­íúŽ,"0+ã=ÇÁàqÏø Lè‹þRO|ÿyD@çxéê2úÚEVãyÿÞCïÊŠ P$€üŸ^²…`t+ƒ‰ÊB…S+HOäS<•ìÑæçT.§U‰½nx“ÌŽ|ù"ÀYmƒi|ýYœ"Ûï£/”?dSþ ÿ+›°Òõ×Gì ¿Ò;1ˆ¡áDöp@:N‚ víPÁÿ­\À·~² §Ë~ p¡¸´½=j¿µ-7íÐqƒ¾Xb²)1ú¿’ÚœHHåñµpð_׉Òiqâ"»¸ÌQ=ÙOeÅÀ ‘À»þÒÐðË?ßBdNWE”ÓÚ¶™Öß—¸?7w Ñw›¾d<ÿ¼*—àê?ÿ?;v€Á0DaxÇf ÃÚiñ,óliiqhÆ]*|aº±w¹mãP€)F üì °U4+ß¡KÚ÷s¥žg6¥Ü$NO5Æl2H«Ú€Á#}ß(€«¿ÈG¯Óv3£8äTsT§\Þ&-û†nΚ`:²&4€3€9À$ݤ ˜%MÀt€„WI0yàŠ   .Eðvð}r*ÀÄ@@øÒã¾OÎãTŸÓçÇË„€ë¤ÌRê s±`¦R„`6ö©~B0A]*€&·M B Þ ®OÚÀ™@L 4ÀDtšÐ®šÀÄ@ÀïÀœÀï@ÀÚ `N S·Oe–gÀï@L 4€¸h!à˶YÆÔ-ÿµ:ZÝÅVëí—òGív½Š–«ÅÛzíµ„hÿ¾~,ÚÒ«}X\f½ñ߀Í2¢¹ÛÔiªrt†›Í]±Ü Û¼·¯Õ}ë?,¶÷ÑÔ©u±íÙ¼ˆ¦¶^¿´/6ŸRιú=rÎéSÄfÀæ^oü3Ðþw)WBNw±lË/ÚåÛæ [oüÑÈ'åÔÄÃàÍë_oü‰ÐÞG«SÈu,ÚòN»ˆ:_d½ñ›ØÆ:W§‘×±°yýëõë>² €uÜVœã6šòN·ƒÖ¯ ø¶ûñôür8¼¿þÖó×€ÀÕ6û2ÔÏÃkÃÏ€Àµ†€® ÓýÃÞ=Eq¥ý¯.v%!h–dbC|yM)¯’X©u*¿”û/„–¤¾¨% ˆqF.”ÝŸƒ€PQ“(Mqõ •$ÄHþ¢÷<=g ›9Ç™NqÓŸ ¡ÝO:Ç–óîÓÝOVžáIŒ^c ÕíeäŠÇãñx¼à]Ðeé ½hñ¹~áÕg´û#î,Ó.Tørürd “^J±¾ÕÖÆ¡µسñµ×_)ŠÓ¶ðx<^ðÎüº’Ư”ÖƒÚY` ÖR©1¾Ù¾©"Ð]D¿Ë˜ÿís`U´ûd/ÀÒF/!_Å8,³ óäžúÈp#ïÛ“¥&;òáSÚ0|âĉIJU$ÚGˆ½}âD9¬`~²óx<^ðBÀ{+i½GéDàp«}]Ùé÷mOè+¡]'o/mÈ«†ÍUrM}dd,ï-sÓ±ÿ'ék±¸F©ZM³ÔZ©P¬%»Ø?Lö6y<žm¹%Gß-.¾úiwôÏr]tžëz Ë,üöóJZ?ÿæêW=ë©Q·OÇ·#4@ˆäÑ®Sé ¹32~CðSzÛU2Ú‡éVrO}ddf¨Øtxg2M8dš;+V( »s»C€Çã…€ƒe•47\õýùBÀ+Ï9¼²½Ï øa%?¸þUEêvœÞް¶D:h·‘é$\Y!w&ÁB”Þ6•̾‚-¦¢ä–þÈH¯µÔd_ÿý£Oÿ'ñíÇÏÿHŽòߘæI²+:¶í!ÀãñB@éGâGL‡#9Æ “ÓÞøBÀkÏ9¤bà6_ `ïeô«~Vˆ@ê_N¶Ž ·Â·!Ј¾†v¡.ˆ½d!à&,ãÕgNMÜ…åé¹<2ôœãöÕ*bë‹V øì™! &¶X$ö™i~@v|]ᘶ—Ç ¦ù‘ÑzŒÿµ9úþ¾=‡?ù€JK µ7%c»ì™BŠöá`ðÖÑœ€å?b?­dä§X¿êÛIˆ×\¸‹ßÞÎ?¨ˆ€=ÞŽ°[…!Ô½„! &!8'!ƒùHÍý‘‘Þg¦ðé2IÙ_›ÂÙg…€%ÑœCì iv“_ü¤Øï…€íæñB€ùÈë¥GÿjHoâð7C¥ ÒµGgÛ! VÑ^Üð&ZbŽ?þèXz¢? ÿUÏÊÝt´3?,5Ê])ŒSª¸s°×·«Œ”© êé·#Çî¹}êZúpâéÊkK/#•a8þêš‹.úO}d¤7f 'b¶ý,æ ºà˜øt˼ÀBÞ´µÊ ÛÍã…ö}®­ésNšæ±Ú †Œm°hú3„úýìÃþD¿l.ýâ|~À.B-µA˜r¶³êë¯]jèœBäÊ—K´)»¢s6xq®cÄ9Ø+Û}£B= óüÝ)Š->š.Îâ´!ÿtç,Æç#´^;*d“”f»XãͅˈŒYwœXá(«ql—PÁ c$­Š°Ç⛀º–ºjFG'Àn‹-+‰ê¸î0Iõ¼Ôºùß.lïšB›O_^UR>b©« ˜í©¢­fÀ²IZ¾¡šôû¢è?ý‘±4Ê.PÒi^ l=Pá„Ø¢ñ,À|ñ5FNXWv"x<^(Þc8ä4Í«YšpkaaáV@dØØùÍ>à Ïò›ã£?ÙRÀ/[ç þæ"P-ØÓ”öE°frHžkfSËÉÖŠî–ÛC€º½ Ú!tÑ ¤ždÿÅ[66ô:Onë·cC Hj&aä29N@!ÖÖJR l®«k©;À›jy}~”¤‹.mìóù»`åšòLQRXíÁ†;çU3QDIgë„VÒï‹¢ÿôGÆätbui)eÊèŸCüìÖ‹ES¹:5U¾“»Î—(ߨ™àñxg>2þ7Zjš%špØÞ<î;G†ï‰<æÛý²Ùò‹â‡.B@l(¥= ç2Ë{»z²¬O`à̯nW†€alhë#V6çÜÐôÛÑâl*–“&ª%¶2Í/²´!€Í— rCuþ#Õ¾h´Fü¸®n¿‘æ–×£Ñ7Ä—¡ht¯Qà»Ô]õÆÛåô„‚Æ ݾ,{È+inÊ5’ ª†›[÷ÿéÎü°¢Lò‡Ü„€MX»@6Ë×á4OìlîùÕíªŒ`S±zØÌªC€j»hDt B/±!XÎlœs¤êZêp’ÊÕåÕ!@±3ydwAF’!@Ѻ#c¬’>ßìPéߦiþƒÔ!à˜©ÒJì—Šm{ðx¼pÒ´”¾e8ì-6ÍÃÏ ¹<0BN?ؽf#Å ð0: Ê˜Ø˜ï¶.úïPÞ1áa®aάãXoh#¼Q†0·/*ÁæÎÿÉBÀO+Ê ¿8üä&4€õiæøÈæXÛDGSà.X? ùÓ°,ÔŽÞ…äW·+B›îoy‹,ñ`åqEK˜s?´ÛÅ»Àz+B~«ÄàkD«`}$ó€ðX¿¥šúúz°~ñMº–ºòêë[6¶ ezoøÔ奔’e `ƒ •Í7#@Ê«žÂ2u³©(}ÐôŸþȈÏÚî,»¼¤¤LÓ eöäåå ‹Ö¼}B._IÈÖI8À“•÷‘<žöØà£¦ùí3CÀ>¾§ï>¤ ªÐuÚЄe|¯"\‚^”!àÞM$ü³€g>„tïõÿúøãèvðWT)@f§Ÿ]„€¾+.§´ûƒV{!Ù<°š¢$¬wBˆÄ‰è4X„‡xüêvuå€S£\¡첄î :¨¶»Ã­TÖ@»±qÊâsX“¼GVS;¦‰˜º–ªSùÓ¼÷ŸêÊ;8JV‚ X9Á›'»ÓØpñfsMú ê?ý‘Qað8±y°Õ­ç÷[3òÿU"9ÚO’{G,u“<ž?$÷„€ÿgšï<3̉Áü!0XÝqº—+B\;  ÷ŸiОøwþµ›ís—iŸØBËWƒ*dCí|ŸhØpÈévðLÀJŠ_T“,™‡€øØ„³}2*§ôUÝ¥QaÑ~Ê:ŸˆzíW¤[`ñ«Û•! ?N,”<é¿fÛÕ!@±õCè}jÛÖe¤8C¢n°1-oUî„:¨k);À]¯Ñ—ׇ€Çö…X-ÙÅ®7P¨ßmÿéŒ1°ÅͿȲû‚ïòsÞ5Ío‰}bš_PÒ‡bÝÿ‰{!àòx!à¼i|VØ×„ó ãŒ<°¸•¥7ª ¦ AÞ0gèO {+¢¼qx¸˜%CÀ°hÈ¿ ×0æ€ CƒÛŠM¡X¿ðâBûÅ™܇€§% ö‡±)i0Ÿt–À¢D5`bdYï‘õÔíªÐH–å69ë|ÌñÉ8Öï úíŠ"º£h¹äúy`p펜Î7 ¡VÔµTà.„(³òŽ’KA{ÉØCÎÌ0òm!ý¾èúOdÄz!< 6ž:‘ÿ)d» ü¼Àrbß™æßIê­ækä…€Èã…€¬ÿœ|_ê+++;Z®É‡úô&?ˆhU„Ÿ¡ 7 ÖÜM Ãæ Ö‘¨Q‡ä¨1h‚èª ÊÛ•†Ž° ÌBº³,ÛÂ!ÒX.Œ&ÇÀy°açíW·+C@!%ôÈ‘&ÖDR‡3è·k+_“Âòî„©xâ#ôÿq;y½»[”µà6,Qfå%=y,›œ¢صë÷EÝú#CNñ¼KN® æ‘¿€$×UXJÆÞ6dŸ[ðoòBÀNðx!àý“ÿÉ22V›;{ #@GžÀ%Ã讕*!`6KxuÖ ¤„€ Í°äèà°‘'z+;àŸÝy™¤}ð.8Ý[S¶_™§ë¾ö¹žñ¶ ¢É©ég7øÕíªÐKÒœŒ.9UØê úíBHu&9È =PyJ´aMtµà>\$җ׆€n°1rl죭 Ï=èŠ )è×ÿôGålü¿“æ+ùc®B@«is¾GX>"à`™v„Ç "€Ÿÿ]! R™ål€56W@º'ï0ô!`Þ`ݪð9p]6´õV¾i0þÙ#È^ëmñ¥K•»pb ¿;`7L tZXU¶uœ¶Š¦á•Ã&IÊó+ÛÕÏ Ø:‘3î¤"ePl×'ÙLõê(> {™ŸEz”Ô!@[ËÑîC@‘¾¼6À I‚ÜO…ã¾3·‘ЯßUÿé Ö™<¹ðBeê›J2 ñ7„¦ùE!óó]¢a’hý{9¿Ð ;Àã…Þ» õÍÍÍ·È7øaWá.”ëCÀc`B6t¬pM6´]¼/‘йï™) r×>,èÅß"èpe¦ÌÖþhX˜¡-ú怔1°Ý9f÷ùµíéC@¬¤W3 íHÕ@DþÄ7c.&ÆÅŠD[½>¨k©;À}ЕW‡¹vœ¤°nÒ9{,Øç2è yvæ6Q¯é#‡·ùÍ™†€FSå{"¾kð-òBÀÎðx!à[¾PO31°À\²a¦ÛÒÜÝ]e¾f©[þÉ$T· KÖe`Æ ØcX¾JÎx%0w °">TîÒç,ï’‡¡šM´Jâ©c=`´…Ì_áûçjG“c`%Øk$ùÀüÚöô!àX#IÝ™†y«]ÒãQñ¢#ƒîóF¼Ö0oš¨àׇe-E¤ ãÊW]^†wåÍËžÔ*ë‹ê÷EÑú#ƒ­ñ‚kÔ aŽœšxvL,ÃpÈTy‹&KÅ—£Jœ+>njjz•<žmᅀæYüWÃ!ï3ÓrRŒ9òi 5G¸ÉçðÙdZ€é¿,@s"4–À)C*õxUŸ*wÿÂ^ücƒõíó`× Éa ¬Ç'¡/9МsžnókÛÓ‡€rg©È4”€­QŠ~Oû{“¡è€Á2}pÖÒw€.ÌQB<¬xÕåu!`^5Sr•6ÄWY|ë[ýé÷EÚIå„áDÁnr*2…!rh'”¨BÀ[š‡ï7U¾%ÇãÖ+™ŒcY_(ŸlyFˆF€Î¬ÄÉúϳ æ_\Ü£ üí-kToÎ(4¨3Øi¯'BÀWV à5öú|¾½É] igVþ·¿@臭/úñ÷¾@HÝþl†: ´Ù?F‰ÎÂqj}̯oO îœ'Kôr¦!`HñÍý>7ÈgÈåã BmúIÔµœ  £ö«bàU–ׇ¹ö)Ç{}‚¶€[´ï'‹ê÷Å}è†Pç~›ž$JøNÌ‘ JES«*eggóošœlç6ñ7“^ðxv0°Ó,ÍU¥}`£rì ¨ç0!oåÓ…€|&PëlF!`ï,0=&·»|XÐiq΢ñ2ßµndG€†d&ðj••Æ® ±çó*á'ÎW §¼gø†ØôÙU$Ÿ«ÏZÀ¢Égð„ÇìO†_ßž6ÐW`·GH(G¦! 6îxÿ½ÿ‚P¸1ˆ>ä’Éçô!@]KÕ¶Pië¥ðy¹ xÕåídIÛÚÙd o ?ÐI®ƒê÷Å}˜œ0UîØm狃ËÉæSùN!õ݇Df vXüð81/x<;²®šæo{ŠÓ†€œ0Ð[ .ñW¸5ú  @¿¡9=7;#È(¾ËªÇy˜È‘! ˆÁÎxl¯†(>Ó1îü©Þ@ï­ØÍ™Ö’¸ߨ{RÏ~]`ÍHhÉäî¡$Œ„¶hòB3`ò ÀÐ}H]C/ã«„cô{Åb?­dä§ØsQ°È*Ù ƒu†úâÑSÁÍÔ˽ös‹3mHðëÛÓ†™@$! f¬Â<ž]†°ÛÀ’ãla–Ùe}P×Òu€œw¼Z]#òÁòeèlS xÕåì%k¦Áî4ö-ö€]yšúƒk§š†²ç½HÆý¾¸åÚÖ)E•)”6Åe 9a ÇöëB?/°$9Aàï¤rØ»;`[y¼ÀþÆÿn¿ÝoH=Z*–¿S†€(€*Ã’7ÌòEúý× ÜêØklu¸c$‚Àô©½ÓÖ(_üÉ mŠ`Ìßù<:†yNAÝ m3‰ý¬ì­Øû'z‹ âT€Þ{ôBU#e"xÑ ,ÁA$E7Vuò+Ú3y±©=ã@Hˆ$wðœý Žë„e”´!@]KßôÈöÞßø89^}yGIº„$åÚñ.¤¸;Bú}ql¥HáS“üäpöЇo4Ù‡¤ ûDSMòÃ!/¼/°’RÎëŸþ+ºßûGã…Vž`d¨ ×7¶ÇHoOëPAÚu,&¿¯jî7²çÚJì?|øMÃ¥—ÿAç]‚z?Ðs «‘ÔÁ7€M_nŽy·°é˜_Ñžy ¥H‘Óe™‡€åjõKú—`é·?vô!@]KßtÎ>b_À¦;·4!@UÞÁQry§Éé|/¶¸‘ML¿/nCU ¡•bGÍ-B¤ ­¦YOÞV0ä…ç9ËÉx;pÄt8r€g–/@¼à°£ƒök»ùLýöóJZ?ÿö|BÕ‚]'»Ê¤ëçmc`^/’jËÀüŠv!€â¡Î0€kŸ¿J.B-ŸÂ¦¶æ-ÍöI8¯šZú ZÛˆM-Hº‘§x@¾¼¤(kbÃà0mµô×Óï‹ûP%ËÄI©©Ô´9ØJúpÈ4?&6Æó½ð‚x¼À|WÍ ˳ –c츦û¦ vAxe÷>1½çîb€Ú„@Úöì0XÙÍÏ%.]ˆFlw«OvÜëòÓzXŽÙÚöawI8fµO8ß]Ï«é#!ßùäü4ÛELÁråL!m8m°ãÖ÷5PBL]Kß±Pÿ´±… ò,Æ$݇PçØg}yIU’^­h“kÏd“ByRäNˆ˜z_ôý§;2¤q°Ó¤QøM±)}ñÍ%},–‹Èáƒäß$V%¥¨|—;Çý‡Ùh÷§W‹‹ß=ZÂçÛ_”S:Œ]rwñåöëJ¿Ò6‹Õø}k”"žß8?V¨mwe¤Lˆ;Ï‹Ÿ§L•­–‡BUOɵ´@ñµ¼ì¥ä^¯–„BCenËëK²‘U¨»1'N“‹3--3M΂ê}qo¤M&)­xnc÷¡R’O»‰ÇãÍ ØýN:CÆö{™Ÿ =Yy¦'ô_àK=É©æ .ÿ{wàY×p<úÞI²6MÁ“6´P ( ý;:ˆ”MËŠªÊb«±‡Sl à ”âs^“¦ÝmäýGK+amnÒÇîÛ½»ïóAÈ×ï¼sî(ÖŠ£§Žƪ"à‹‹YõÚõ¡céÌ ø+Åx¿÷Û»xhõi~<­¦F_~µ}üÝ" ñß …“€co÷Þœbïml…á÷G·Ü~zt/í§¥H}¶žßüµˆ€¨‘ˆ·wߔڽ[âñü#?¾ˆÔh˜ùá—4]YC‰€Ñ\ŠX{]òNàZl—ßäÿðíFlðü^ü`«±¶³÷ÑAÀÎZŠ)¶Çʃ‡GgOþünë'žüñõ0Ö" ¥4X{µ³ûzoïõîΫµAL±u†÷ÿ|wu+Öñ‹»ïÆñX½ŒIôB÷äÕŠ^5ë•ÍŪ¤”>ù?tÂÅl\ J7¯d½’N Ãr6 –ð¢Í+Y¯Ü\œ8Xœt¤í4`%~b¥z¬'j@±:ÙçÑ KEe›W²^ù‹Óé`>œË>‡sa~+ÅO¤­É7¯l½Z'Pì‡p)ãl—BØ/â ã‰7¯d½qµ †‹a¹—ŽÞrÃA*ݼ0éæ•¬çv@½(úû !tÎ_ezWÎwB˜ßï§lÞüd›W²^ý“TÀÁÒb8Ý¥­~qÚæm-u+XOÔ€bÐ?vÂduß[xo>´]·3<èг7¯{¼9Ý…É×Ô/}ÎR¤j7¯HQ4©(ƃþI ÆE‘ªÛ¼òõÊDÀ,s£8‹€¹ˆ …¼˜É$ À$pE0 ¼8¼8LŒDx'@ÛDÀü0pˆÀ‹€I ·“@"€o æFð›@^ L€–H& &€+‚€IàÅ@ÀqàÀq`ˆ`$À;€Ún$&~8€ìÐú£í¼9Ø~´žÓ&^næMÀæË,óbàt‘m<Ë›€g&SFo3o"6{"`ºXÏ› €u·¦‹Í¼™Ø4 ˜.¶óf๘.îäÍÀ0]äM€@ˆß@ˆ!Œ"ˆ¿  @´ R`0;n˜ L@¸""À$D€A8àDŽâÊêêJœ9"“€›×¯^½~3΀߿úÁýql8D€U—oÀ­[‡ÿܸg9Þ ¸píÃàÃ8àÚEÀßìÝAOÛhÆñãjv/ÑŒö‰AšÃ^¢¹öÄ×`($JF=½À>+NPYàŸxCQˆˆ´œ" º€­#V-çaΑàÏê’ç" îþùžGtå±Qš""¢;Þ4˜08Yz`”dØž#Cоö–#Ù4<"€{v-J³ #ˆÛ¹‹²¯‹€í«úŸ/M.rÛšCGhõÃK–hKÅPõ6Ø·ÆLT,zDÀ˜SmF°½g3<qà9HÛ+øoÝêüí­ÂÏ×LߺÑ*6íIÐDî&ÖZµ_öåµoÃ1šÎ}ÇɰW9;ÂÈ•;ŒäŒŽøv@ ŽcÇyØŒ™"Ó›yÀ|wïI>v÷â à#+æñÒgœ‘ÊŸ£á=l_™æXYÖØnÒ¶ l…Iö!€u’kW‡/§í¹÷ôAÚÒø‚%’E4‘»‰5Ž-’{ð2A²Mç¾c”±H>Ã`^”¥ã\˜¸! øÎ+¾sxŠLO¯­ð³{kq‹ÁE—þuNOs&fض‡´ãöÌ’#·ÜG=¡müNG€³‰ƒ|m€û$C9ÜÛeéHÛúŠàMüÐý‰®Ør `šmK`ΑìÁí­Ò–¹å>j˜¶ô]Žwk¼&i¥3!ÛA ¾žšé;Iþ„Ö3ËÒ¡L ¸õîÏ,Òêþl­u20žGÆbÛRàíÙÊ£™€;Ë.Ü2&g =ÄŽgk,üå¼hƒ#à7ÚE@ðõÔNO’<ÿ€V3.ÊÒ¡. Ý1ðâüxõçÝüñ³ÅæE¶1E`"ˆ)’ÅÛ­6c¸Ûàlb}ÚÞ~pLÛc´Z®,+§Ómmù㥙Tõb±/ïTòþ®.’ÃANY76ò_ÞþX€7«Æɰ٠È7$b¾‹y¾ªÇô5’ߢŌ²t0C÷ hg]¡Js!ˆ÷?­u•¢ñž·*~›ššJ™™w½Ñ•¥Ô‡ÚJÖ^öÀ}ûß7ù7CñÒÉ£Ñ<.e²K^ú{ç×ÓÆ•ðÇhà â•¥¤M^šEyLžhUu¿B°IÆ$Fy8pDmc›<ÔZÅpÌ_º›°îƒÛH7¼ŽQÐ’,¤í~–{fæÎõ\źIAîýI‘&ù×3‡‡óãþ³¿¢Dg×Q£”{W.¬úöî*@YÔ{ô’×/Gà}\EIS;õ6#wkK@´;‹-¼¨+W|o.¥=[`Q|šŽ‘X×XLzCemõaÏŽ "b#îmrótƒ 謅ôš/Ö/óL–»¾½t'·0!½OGÒD§Œ9SUC‚ž}Zk›¿Og?F>[4­yà³–'Øþ…Ç"b¸±"(Wž’59 ‘|d PÆØøÓÅ"X9dc™ß©(*%z´$›Býb°´íèèg*¸G{JVÖ¨üCbÐ6 :=Tí¹gÍXÏð%ma–t.Ö¯FÕ[ЉÉþ˜ÕO,BÆ£M^"&·@@lÄQ¢è„±¡—÷- èë Èá¢[˜Þ±ˆ‰©ª!ê}˜ ƒ£€‚˜´ … “Ã~1|÷BÈÙ‰œ#’Æ‘€0±YXp@L´¨›Ü"£@%6aàÁ²µä¨Q1b‘VO)ñ vQr—€!bqkÞ’€ìªóá”=bs'A?nŸ0Z—ADl$J€‘…`- hÕ˜¬¸„ é­W‰ÍÅ gU´:~õ¹&bóT€¤F_Ζ?õ²@É¿¥H$Wî™5À¨Lå$JbÖÄ‹ šY€çxy8k¯çÀSÖï5Š£÷” <.°Í×{S’eãiÍݯùÞÆ[z¦Ð+f{:ñÆ@DhTMîÐú=SK8âÕÄô¦[lmý$ €­:.jækWö£Îâu³¡VQÖqð'4êC…ŠóálQÀ*œ-G’?5 .û°H¤ÌàèzVIõiX, èŸÙыǮ0ß—PïÆÌáo¥„µs Tl8†i)¹ë”Í3>1ÔL¯b3§’€ø!½hê˼zZC<„â•ékb0„Ÿ×—R²ôª4*¾Á^¶‡:Œ;ãæ·hAª™ÞP@Dl$J@ ;)È]Ò‹Û“£xÕ_=LL/¿BïôÐMt¼*Äñ—¾3¿¥ Àr“é]TŠÖìÿÎ>™¬I 8;$òœ‰ä£JÀ$Öù€ùg`›)w¦@õQ5MºIÀ Ið˜Õ" ”€ó,]lžpJÀ:èdçéåî©$`…è´FAç©»”ÙF¶­·–´Yã °®2 y4•8èܧ—/ŒÉüEЉ¬¯¯{ADlTE¨„jK@)ÖHý@õ01½õI@~ll¬íÑlvHÀ#k¶bTnŒÝ>  é9ÈráÜ)É[R$R¤HD¬Ü€R¦%Ê€>VcHÔEš¢îÅßc„RXÉ5Àn|ÎÕÀÔãÁ©$Ào?˜Úä&)¢ãS²hJ@ŽŽ°• <ǪjXD(ksáp8“ØI+b#QrLAÜ%`Òˆ¤…÷Pꦷ¶Àò:ã%“çøÈj¥ä4æ+0G‡ÿpègpÜuGáê”É'CN?‰”€Ñ™à–F¡ßÞ¶SKF€‚·BfG—\Væ8L?씀1î@áîSIÀ ÷w蜛‰ýa ¦¸{Q‚Ï‹}-OŒP´t÷óTEl$Jv?VS´$ DgC «šÞZ€ºÃ¸R)¹—÷ýá+mD”€(¡,!x/A.]Y À êIƒ, ”H %RhuèP¸ÁÞW† e±–øña•ÂBφz '˜ðü+}ðTÐÆ-KóºIÀ4? ñÖ¬dë€(tþáöÕ ¬hÄäV(U‰0Ž3ý5% ‰„)Šabzë—€…=öR‚àOrmÄb¶_%àŽÅH H Ó’‘€%cû‚Õ²> ÀŽx‘Å¡§äQi•9•,Ù!Ðç&“\M…džà=/´âTë‹ã‰X´î‚ˆØH”€"ÎnÔ”€4ŒaZ>©LÇq•€Iâ  ÍÛ§ ðíMJ€DJ€”IƒHÀD'H7V¥:%;ê5ðèÿ¦+7Ö½UœÐ˪&vÙcÛHÀE®pÏp“4?e@ ˆp÷6JÇ{IžgþY 1ÄF¢`÷S˜zäx X­˜\ÂN!bª"# /'i¬ýsžõK¢`Vfí_Yÿ褆ö,sðráœzmJ H h%Rº¹}q,x£N èÁ íºî KX¼û#ÆŒöo’F­u‘€9ca?2à&nÑá.1$ëì7ÉÝ ÝFŸH0›µ{ÊÝíÜwé[l$J€B%bÔ–lK&¹HßXÂN!Bª\v$¨-ÅAgT”€„©F"…±Ìœ ½8`p^% óîÆ?ÿ|µýýŽ$R>Sí¿}ûŸíSr$@Ò8ÐGtö€òŠÖ¯¨S°£@6_¾|©£™Ž 5JCõˆûÌí ÷Y…O¬ºH€—褱ú=yãV¨•Kl¿ƒúÐ*eÍìó”.ÜÏ¿÷ cµÛB$‰Åc„ˆD €¢Î3ñTHÀžÂVÚ—…0w `YRå&ÏY*”&¬ÌŠ/g¨“þ+DtðFŠ>T n?`ê|J@æòëc“×—¥H øÌÜAšG:ñãÎ¥¼ûé˜ã§wG‰DÕÛ‰£³GJ€:qí‡×_|}óûö|>œ˜|h˜Ý)ÐC(-{X”nmÕ+FGó]þûKXp†ßW¦å5 )•öÙaþ¼:Ù‹7 €.ãG¥ƒZÇ?{côTÒ“€h>\gW ¡tÀœõÞóÆàc’·•¼Ÿ6Ô@Dl$JÀÑÙæ¢ÛBXåy Z³ù–Q!ÌM„rk/ ¤Ê]rø&îÊ„IëÇÊŠ¯ÇÓ½jÎÉ`Ü€w²ï"¦‰g»([Î¥\;Ö¹zãC&óáÆUzýþ¨©Âg—/VHý.Þ_«vÿË㟎Î) (¿üõ„ñ·ðøõääUýæääW9Ð8H ȵŽ!¨O„Žv€áÇ?*E `¬n³¿›W (Šß 2*~w Ž ÔH†›Ž,€Z"OADlTE¼öVú»¼ÓóÀða®æGǪ¤J€ÛTɱ Ž~¼„£<ìHÓ­eG8lÑ«žó(¿éS_þÆþ÷¥>%P8rç³×lÀàSHÀõ3•)'ßÀÂÍ“ þ•ßÍçúŽ|Þ8 ‘vIÑú¡~ €­Y»£^°I±Âî­r;ÞB³U«Ânù«@=p—€©.b2j•p¿F,Ò@‰–‰E) :Aîù×U‘€eî ¤ubâç% sß„'†¹¤7Ϫ±*W ˜h²GPý@¯•¦û›‡‘Ù¢¾H¯òçP×õa€÷ÿ«º$\‡.3ÚP¤èðî+½ðuó»ñÔÑ/_ÿZÿÏíkP/3ÅoÛ'”ëz'I€äí““ëÊDû·Å™‰”XëõÊahœ-;̱/Ç×2æÌpÐ\ÑþÔüûÐc×ø9£ú®_ ”ùPlrš°·Üè®ØµO»GÁ ÐÕŠsÒ…u,XFÍÑ6اS"#Øfpb’®Ç–"jÿc¬Ò}ÊVPd‡ß²µ9ýbbF<½'Õ˜ÊF‚9¾ypz3µ‰G"Á$˜¨S"hîËãÙ±e~ss 8”èæôt8’ÁÍÉmóáDT±‘ÈXÅEjz²¨‚Àrd7£â&’œvI•;[‘HνÌJ6Û“›‘dµðáyû4ãÿ±wޤyÇǽ†e31“bU– h3Jî-äîœXw`x\wœh̪tµu2ç¦W¸+²½ìpTçÿ$¿Ò•¼•ËóT’M§«6=½Õ³™¾ÿm*yò˜ ¦¿©§òÔAE@)]“Q@ùb JZ¯ %>*ß©ýظì¨-“×ÌÏu' ^»êêãî¯5äÞF¨ÃóûÍÍpʧ?éïú³*ÅÛœ©ÿ­náÝ¿ÌvAÐoÍ?ïFÀ1P£5À¢\}Á¦ŒÅȇ´1™[ãea‡(´,3Ò›?²Ro+z¡5šE€=ZÐFgd¦„ëÇ&#k>¡òI<©®ñž0?m©;|Íìê„j%óóºËüõ@6 {ürsJ¾|ú\ù®/T)þ3õÏÔmè•ýO.ÔÃós×…Œ7ç¬þp)×Hz” Ó”´… Íž¯ö¡Ei€ŸÆDäDÐÜÉ:,ó@}‘«Ñ~H†×†V븫 Iãìù‰# ÿCzØd¶Ô¸ÌG-Õò.Ô– oùг[úr€^âE@K¯^ÿúÿ)^~bVôœ/ôµï1" O; *^pvב‰& ’k× QŒ,¬Äi>2õÉÍØÝ!m¸lÁÖ—¤$JŒ€ü h0_¶Ôû;b«L÷í§Ÿþéۮʜ3É5Å„DÀf+Ü¿ÜãgÓ]R¥ø[ÎÔ?¿ýoËÿžªæÕLÛ`èåjhÏé{žØNj¹@]ׄ ¸Â´$A6ìêh4 €ál^­õ,€Ê4<Ž€ÆÍx =N°õ<±y5d5ÒXôG.P£òH¼æL´sôæT½?›ùqOiƒl¼(­÷˜Ù–?ìÍòž6¿ëªûñê¯7©R´r¦~©nçWË÷|¢˜`ù¦þxñQE@ŸrMl,ÅCçtëËÁ*ªD‹(ò½U-L³™\o}bÅü!FYX«µ7Ìèª>ìÇæe}¬Î@tâ,ÂÕ«;Š=*‰D@±6sM½¿7MæK}íl÷ˆWŽºúŸKææÙ1PHñÓ.$ùËIòM|düìb?Iëîõ«ÿ¿É"`AÚ ð³9G®k™çm2b$ƒÝx´™,b¢éæÿ<‹€¹™îƒ‘HõÙû;7™?Ó 37ýÓSyøvyøÙòðD¾"($„8Ì }*Vb®gz^&BDkAÇÉ>Ê1À¡ë‘ÐØü &;°=::äƒÄD€ÀŸôH ˜Ÿ¨»8a~ÖRêsEV˜_(ÕzÆ|Rþ­„ßïL€B"ÀÉÿŠ`•~ÈbÖŽ`Jam ÝU?‚¡çØäÄíDÀñæ™ÝØí¡>N)ã› *4»Ò‡ Ðr^Ô4™»æg¶asS©®ùùŸ B"@HLr7 J:´GÐСÛRÆnÔ€pw³ â0£7OÏ©­dì,Ȳa¸‰ò"à¤é´T±€â¯ ! å¨ämüwÚ«çcZ˜fFÓ©Gc®3¥ÎN´Ùí# ­çÎø@HÎfyÀ:µ€M¢¼x­ۛÕûpžšOIîDÀˆûÙqlí‹€ÑæôÄ ¨yÉêìDšd0 ÃÁz™aF¢´¨íÿ*àE°x9@‰!(×1–jδߟ:5Ê$€Ó£¥A%»rÀ¢põÑ>&š2ÐïD@/\ýÊÓ÷EÀ ^ÕF˜NV°+U7A•ÕóX(-Ræç_©k¼OÙx}ø›;@‰!(ß(–¨öÐ`Wͪ6€Æêwx4tL=Y@2´ôÑNPõŠ3Œwïr¥‰]Õ£k&:ªÈ¸îz³ Ô¬¹eË5åF@ë2wÏ`ãp· Þ¿ „D€T _I°’T&T)®€AÕ;Á†i‚`}ÔÞš'Èøý@£Íh 'U½°ÞGب‡$Ê‹e17;ùpø7*> „D€T(˜;Ãz\«X}TTÚ̆–Øc2¾ *–ü‘9ò1{”f§ñø´6w±T¯xú`´}Ú°“15££J@k“°³Þ'@?ï'z¶F@¢Ìh=e¾¼P×¼|ÎÚáÞJx! ÝÆ¾ /Ã}¯×Y,<Úè,úE¯<Õãn+8]tzd æóùjŠuZY,%G€ ž1?~£¶t.ÙPwÐ൫3}ܽⵆ*9þ) $„(#LTé`xë[Ú@…Ä=F€š1s³öR­|Õn2sýŽpþ”—žè)®ôñ•žü /==—}ÄCˆ€îàÕî#]¼gçg*Ÿ~®{ûùÏ[ê¾ zJHܨ€ˆG€_±ª1¤$î3”Õdæ¯ýãðÕà¤ýí3f~6R fugïÕNkPgnž+uÞd®ZjãÝ™l$@ Ü‘º¦åÃUJ50TE,Ä7z9 à uS+ÁHݳU‘³þ¸R¿T+ïœÆ£Nqÿ«³`êŒçJ~ÕÈ¢ÃáÕ°ÍIÜo¨þ·|ÍÓÀœØW?Æcæ©RSæÇj£ôå€ña#༠®®ùHÎuÔÞ'ªæy€û€o€ãÂwXƒ–Ì•‘&Ðj_ª|ÅïjàC‹B%~:ô›¹øÝ/‰mú Þø|ÖÊÒ@ýWÌn·ëêUw»ºóÿ`wg'sú? _i2=Kפ;Æ‘ËÄÇF@Í_Ï›áÛ–!ÙsW„D@Ÿ&r¶¼€wˆsLw&ß(jÉë˜&ì¥ÇðH-l´VÔT†¸à —EŠiHª‚ä%:GÓLóW ­JjªŒkò ‘=jî7·ºŒ¥b@È@±Ñ/Ø(æïî*N˜öÔB"@HHˆóŠ€iêS¥iŒšÌoÓ:'¯"`Kzu”%T×À8 ºXÍž_GÀyƒ£Ó¥OzYTç]?xTÛÑl­èu'`ZÒjÒM‡óDÿŸv4Í=™×Ëúª](êQ}TÛ’Å;èN⛀j„#UA÷d ${×ˬ éF÷¤ÿ殆Óè&¤º=µ8‘§JÈgéOöL¥Ï¢—~ `BúGÐc’˜éöZ_ÿ]¾>Ã:8Ž€€ÁÀ²×F€™u·×Ÿ&wj²úd `å_FhXÓíq¨Ú“‘};}È ^‹=rÝ‘!Õ ÀWÒ…ÞëÕ›» I2¬{jq"Qõ‰‰H®ñS"ÀH辎€%¹FÃa¸,Íq%®X.Ž#`A>£±3+˜¯F@O¿€Ë`¨ƒÂ]Àf¦Y™eoôB}óÊ9s;v0²žGH06ƒª=«‡ÝgÐ;ßÜU÷y0ÌÔâä–Õ'&–Bü¤Ø<;y˜ð8j²ð$c„ô  XFF®q5yƤ;%/öPG€¯o(ÙP•¤ò.oѲ¦Ù‘s“kÀc­ÏbhEÀ¦V¸¤“Ò¼ù¶ÿ½é^Âaøæ®F«y6 “ØžZœH\}b"–â§D@: fEÀš3”t õYˆ{ ‡V¬É ´=™f;#`FîPwçìIÎF2GÚfßÖ^”8ŒðL.¬˜}3|2ŸÂT5Þ‰{Wƹ¶§ò~€w$ĹF€K&ý‡z^ØWøµîLá}ëJ@F–Þ…dºèÔdýâJ@EëìÎ'GÝ+¸ Ѫ¶NAchGÓL^<àëÓ4Ò¤€´ C¥öݯ01Ñ`Mãƒ/ÉC½Ð®á¼üPdŠáòÕc{¼ö®6/¢foO-äÞ@!wþý·þý/!NÝSü‹Ù…²#à™ ³ñ¤O:@þ|ÒWâØ‚Üãà+>Œ2¯=w×d¾YÖ!Û€Cò Ý¿üf9Y¡aM“†ÔÚšX&Í«uÁrò‘¸.È}¦Í€é#y•iõ›`ïªGö¿Ä«¯Š*²§'”>UâÓyJñ³È=B"`G­,¬@Ÿ­ÞÀ¼`C…ïGÀСæ‘k N¨]Ô$ÐøR,HºÐ¬i0$ó™â@PS×øH„ì(^â‹€yÀVQÛS‹“Š£J|2Q ‰!~F‡Ïðæ!]9s>çYô#4ê„d/óàXDîðBì*R¹Q{îNÍ*~F.ôª%ËÚèª U²‡fMÓ˜Þe3ÄæCÜY:56æ³*½¶âÖŽÒnhPM¯}¹nÀ¥÷Æ®"' Y^Mì©Å©ÅËè©ú}<=é?ÏØ¸õô?ªÞô-c¼O~c ø¢I„ïˆW#ÀOÆø x5‹c8[Ma, º€Q­âïO³[ghÔäZ£~‰Åí °§B¹ ~=œ ‡j†ëÑ®Çr !„ø}Ÿ+â3DÀr>èV‘ª§H>C!äJ€gÉ|‰ºMØ(3!„<"(ÄyG@ºß͇ø¸á,ÛfÄØ»κ0ŽÃ@£½m Häæ5=ZY9€VhTÉWØP ´ÆÖ ¢0¨‚±i60Ã{/ÀU û@;¹·ÑŠ)´ÖÞ³ç=ý¿¼ï9ïLþkˆ\ D`€ÀDÖˆLˆDõa€p'D€€þG€u@}"·—–.ÖYç“¶½àÅÀdTg D@/ˆë€"àbàÙ8^~uÿý8¬Ö©ÛÏ¿]«þ˜Œï¶é\»«»Iš;ÇuâùA:íÓq!èYü”¹v0€f+3wª³Óäô @¿¾ø:É֣ͤ½\5HgôøÎ(ÉvUÝK†+ço&¹Rˆz5 ØH†ãªý6¹;€Õª7ɪ7Iþ¬ªgGG+… O°–äuu^$Í#`½:“v\Ó&y²<®Þˆ€õ¤­ÎìãY\ªÎ¹$ûU·Ò ·W«_D"àYr­N,'Y­AÒÔ‰i’ûUÇ»MN4O @O~;à÷Y¼š :ßÏIÖª³º&xóèÖF:ë…`±;88¸TU“{óWÿö«³™ ç°Soæq03¾>J®Öç…°˜ÔÇ™6É‹ªÃQr4ÿ:`kRµ4ÿßA’Ñ•ª×£d«êúp¸{\U$G…`Áß &ÞjÞþÍ¿äÚæãQ2z=€´Ãa›äaÕZ“|µóòn“¼¬‡ÚÌíN«ó"s탷gƒ‡™¹Y›yëɤ,úÅÀåé´W'5óóF:ß­Tg%io5I»9­ë¿5I¶ @>_\ßYš¼{¼²üà°Þ3½°?}÷pyé¸|þ¯Æ"À$D€OA˜@#ÀÅ@Ö Ü `"À$D€€=4&"àNˆý뀂ñ7_¨_¼ˆøw" À:À; \ `"@€p6D€I"€@ ˆüv"Ç‚|ÖuÀ¤@x'D€àb ˆ“8ã‡=õë€q0 €ÿ[øDD€IˆAX€p'D€uüº€I"€àK€‰@¸"@@ÿ#À: @x1D€uˆðã."0 @ ŸØ?ìÝ]PgÞ÷ñª=Im<ñÉsò¯ÂBD õXD+g&e©+žŸ©‰ŽÆÄw"õ£ÅQ˜qDDbD‰€Ä "·¢Ö§£¥U»ð…«8›Ý¬Á{×ã§»¯hè™ ꈿOÝ{Ë0=Ý=sëK¿\SVz»ýÇË—l¿]Z""zWî F€7ÛpÈö‚ˆˆÞ…#ÄätÃtå@DD>ˆдßpÙß""zÓpão¿<üû£GøËßn(bŒ¿ªËF—«ð¦tÜ+…[¸µÕ"z‡0º?ì·™Y€ýybÙÑ‹¹|ù,‹¿ÂÒ˜uÅú/^v(-<~ÔŸÔ£Çê•øø|Ü#8«^•î¯3Õk ßE:GÀËW@~ÂÀφ–d‚"3pº? Z´a¬'1ù " wðÙ™Q‰)ÑK ]6>†)¸Ø0ºö›ð×Wqw@·úƒö§ðP½_×Ò?Ü/_¹ àÁCËER‹D¤ó^U͹8+ç^§H^ ü½Y濽½%H¦3÷r .ZKº"ÀwUd~AQÖ Y`G€©sÖÙY"’ "¢—Qd}0Ý1Œöù†Ñ”†G2žô»<ùýׇ±Ÿ2TB“3Nöð\M½Ò"=ªûÚôUÊR_snã5R9šºSEÀ§Îe~ †Ôo\xI ¹”¹pr·3¬­îŠ32ê]{t(#㦲ͱö,Ƶsõs̵¬°V¬_Ô=øÄ§úMŪ_¸02lî—Ç_°j™~¼'óëúQ7ë~{ÖËHûk\IÚú!’*/–ê%-áÁÛæÞà­™á¾00qœ ¨½*2Û?‰<ó!¶ÜÕ~þj󽄾+ÆÿÀrß0ª„srn¥á-‚¿$h€ÿUêq¿ö‹JàÂn˜jOÏQ¶­öÃÐêëʲÈÜÞ l¶F±Ó!ž•«Ô07ÃX©’GÀÓe0uìTÚVLͧccùµ½0•,ë¡]{´(ŽØéàGx²Šqíœå;Ô-SJ–Åj(VjpN/4ùp¸î܆ûå±Oáó:'®©É+w¯u³ÃßžR˜N]H÷ÐÐ:ÚBFL{å´+®0!¹Òy¢=[r@è™H,÷EªÇW›t™ÇuF@x >ePà¨ÈT}:À¿(1Z†FDÔtÙøÈ«kÀ0~¬MÛ»þ“°Ôûµÿ(·éAh»'Û#nüá‰úØðw°#àæYh§ö(§cÀ¾ä0§ 1»”å4bÊ3”iJlží‰"ÀãÚ£HqlkÇM*εs~Þ í‚Rë€/•mŸýêmÀt{¡âÝ0]¶ ×ËõËÖè%*®ÕÂVûÁ¨›u¼‹È÷ˆ99±"à–5ö»À@*½Ÿ<Ûü>À'"½­–ñ-fÊŠ4ˆ€VñÂV 2ÓŽ€jhÍMáEùs®*Ø‚û­SžY÷Ci9cào àã' ~S.Ë€ïwežômJ©Ì‚«wfn/öFôðgþâ‹é5ªû°ûÛc_”m‡”Ãr &iDvÛ3w~@`¡µ9 ¼}áµ>à[ëé³@ëöÌmÇgdlÌJ6n\áÞ£÷Ãhœ¬ÔtóQ·ŠsíœÀÞ]¦§"ª§•e9ŒàG¶î¼9|®—ëO¡jߊ]§€Îî¬ÙVlu³Žw± ¨›¾çÀ¾0‚“'Ô速Ák7NÀiƒ¯ÜõÞu6@êiƒ DæÅ¶~&ržù"ûa f=ÍÒõÃá¼H~í`DïÂ2Õ\FD€ç¢È'°Ü¹j­ßŠÉâEM3ŒÜ>[)L9†‘} MY†q? #à7絿: É…ÇUþ§´ÍÀ Çðw N×Ô hŒ$€kC®Ûçã3V". Ô¤¡§kÜp,¥ÀfåàÚ9=¾;Fã|i¿™îpoC?3Z$߬;Ô¥Õ°´fªWª.Ý¿@¨.*2£ ¦ª3"ÒL}b?T(ò, TˆH;òE®Þp7o0äj€vY22PôˬهšuäíŽÍ$¸/„ˆÈàÿÈüÁú3èÃÀ¸G@ÏŽ€ÿ8¯t5@‚[7ˆ?\§´à½G¦kë§OŸ£â"^ìUI#à:Ц´cö @ÓæM;—m¬³"àPpðéîH¸G¦ƒTœ{çÜ£±:nhƒO¹#À½1F@âͺ#@«ß¹¹@ÙÆ´€×óU‹Däù쩳Ÿ‹ÈwBV T/Xr16­¯g@D––!®ÕžS`êL‘¡èÒ™ÕÖë¼®ýED.Î\”§ç!Æ=±tÎìÔíðBˆˆ®qW<0Ýʲ~Óõq8ç ø%Ù}É& Ú,O|‰@3Pïþ"AT%™îw{’Яò+í `ª Q¢»­P%ðǺgƒ;ì‡/ˆÝçÞ9wL^ò`»;ÜÛk$߬;´¯Û€Íi¹îHᮑÔ]¤Ð8C- Áä'1?䥃f‰V=3EðÁðwJÌ=@_8 ¶è]üQDDÁÊÚ[hé;mð“ßÿ>ø(é´ÁÇ€Ý7õ¸u¶m§Ê~ˆÄŸ8áþÔYàÏÊvýƒÉÃîÌLê`¡²t·çÔBà´²\‚«ãO*qE@‡²¸ö¨§ÁšµÀçÞ9wD*pz<“ÝàÞÆ˜# õfïbÏž9ʲ 8‘¶p;·Èƒ1 ~h$ña)Ý«K´ú)´ª%bš·C¿0|¯Sœ€Yó¢"Ñ%µyrQG@VñQ1éE‚@Å'öú:³âgfµ.²Q"¢7gôÓêuP·/6,Oi&©HpÒ~Xì_¥×•©& Ÿó*‚Сp¨ø&vÈ¡â¦Z´+Óœ  WÚd?½Ã# ; X[K¸GkU}-‚+TŒ{çÜ Ö¢©{•;ÜÛ{¤Ü¬ã]dÐ|)§Ó*^ž>1–ÀGþÑ_z{GVo†„Jû:œ½eeÆÛç C³#ðî.©Ä0uVh¡º¾ûMpjlõUx@D4~ÒèÂÀ—ÿ*áI•ÀÞMçÖøô<:5~ eÓÖ5§€ã=Ã" ûpjÍô kCÀA×݄Ԉè8—¡ºWukױңφŸZfîÛ ‘vûé}{1"T‰5ßV÷M £®^© @‡Ž„;玀˜v%Œ×6Æ)7ë|ß%Ÿ_»ö¹X7Q"U—.WáÓà¶XdˆˆÞâPØïýIý®É A+¾¤LëÐÎRÃ"@Ý,GÌGC_ˆ‡UJE §+ÓúØÖÚÊP¦ lM#V´ &k"Å€½¢•ÀZãÞ9w¨ ñÓDàÚÆØ# åfïb’šgMdÂDšö.û›ðf" »ZDfàFDŒ€ž÷'ñï•Pæ^žÖµ‡bãa9LÞµ7\§ü3ÖTZK^6ü8ü:åôé‹ùë×4ÁÔv.¶µA °6£a½ü÷AëÙšk#.0Œl; x\{´ 8®bß"èù³ÒÜ;W?òÿ5ðÅà|«•¶ 8ç\ȹ ÷ËŸÂf@/±•£nÖù.ê7×hÔ˽B¥x9]Æ0]9¼¡8/"ÑV¤%"¢×0c öø·þ„~{¬’É8PSï|øçš"*‘Èäšk‡”Óæ(׫ÜPƒæ˜tS9Ô8¡©ß3gÔ=ríÜKK¾—Ú¬û]dÔ¬êQjÂD€æÍ6²½x fÍ[—‚¼¹3Kðî"" Ðþ•ð²€GÿR¯B«ôA¥xÝÊJo·ÿxùòí·KËð&""F€úõŸý.ÿüU½ ï'ÕÄÇ "¢´¿;@ëþÓ?FNð?©Wb°L#€ˆˆÒáH€öøa¿ÃÃÇê9YQQ¯ˆ@DDé=êÆß~yø÷Gþþð—¿ÝPÝjB F#€ˆ@DÄ bñ»ˆNaâ#"âdADŒ"¢ u: G1ˆˆxM#€ˆˆ@Ä "âŒDŒ"" ˜0ˆ@DÄ»ºÕ‹"bñH‘DDÄ[‰@DD<@Œ""âŒÄ ""ž FqžbO#€ˆˆx$€DDÄ F½Úèa#€ˆˆó1ˆˆDŒ"¢‰:@DÄ "â…DŒ""ž b1ˆDDœ1¨DDÄ#Ä ""F1ˆˆˆw#€ˆˆÞ–#DŒ""F#€ˆˆ@Ä "b1ˆˆøÝD ""NDŒ""z«Nô("F¯ b1ˆDDœ1ˆ@DÄ#1ˆˆxw@·"bñH#€ˆˆ·1ˆˆx$€(" ¬ôvû—/ÿØ~»´ DDÄé]‰o¶áí½ §ˆÈé2†éÊ `Â#"â<ÄhÚo¸ìo½éÓ7þöËÿ?zô÷‡¿ü톢wE ^ŸªËF—«ð†µÞóá¥4·¶1B]kRs/NDôft?~Øoyò¤ßòð±"FÀ8ód$ô‘©”4hm^¼­"Ñ:¼ŒE"½á¹HÉýÁÅÝÊêîûü©—¸»梂œd #àOÿxÒ?Ì“üI# µûy0fÁ$> "…¥W}>ŒqTWZË=ÉÇK HÔž¥ÕÿàâþÒRçâ­…ÕbX”åG%WÅ6¿ # g|"à×ö»üóWEŒ€”.F¶cu×Hêîè ñcÜԉ̇Å•h^‘£x½°ÅÙ+ܨ xêA"w$æY1^"ª¸b½5óüëQþ¥ˆÊÇÆ T€·ËHªË›:¶¬^½zÖ’‹"²ã¦4¨+ªÂËX,2õ F@I§•ESwÜßÝpþªˆÌ,ƒ[ežÈü–*ßâ¨H'^"Ê2ºÊÞ–xü[B¿=V¯ÊöŠŠ)êÌ9¶ó@D é>vpù6ë7.+š+(—uëÕ+Ð^qBýqŸÖUl{+#À“ým¤:îÂ^""Uã/o¶HÑ›‹€*ó¥s‹ žˆ|„Ëjs¡R˜²D¤ ¯5]1>~=§ÔÖóïþ$þÝ£^‘64«±Ûº; T¼BÅdú`i^æ~3ÅhQnÓW2Ìž@­Д‘Ö0PÖe¸\™VÙnØºÊÆ]É:Âzóå ‡­ŠŠQÖVPøôFðeæ—„h˜u~NLU ‹E¢ A ¨!¾†Y…SŸú$^meÛ¬ó÷îz¡ŸKÔ;bµzTÏ*Ì*EœïéÔÂÕ·1¨Ô|œßeæ®4¹öaÄ[mkèÙÒÐà‹%Èw•Ž•^ɵ/£¬€-l^K ,)Ôk¸*²Dô&øûî—–¥ë…¿÷'õ»z5æð½«îíh¡Êöu#b>S#lCðýq‰€}§N­xÙˆøNy¡m|ÚŒÏÒ:Æ¡z4Àà–¡õŽ%¬í`¦H1,"WTŠÌo‹Še†M߉mn l9sE/fIL-B"Ï`)Š=?³ W{O?ºÚ[‡HçˆÕêQ½ä¹X…` ý$¶£Mˆ=Ž­æ°#ÊΈäõºöaÄ[ж@‹È¼€ª¬ͨkmBÇ€ lR¦ÝÀñˆ2íòÀwS9ív½pX›Î0›°\1´Ü±D@Ù|‘{‰#@Ž>ím¯‰ú0h–ùpjQÉSóU3”^™;µè©ùr)€¿7ËúÛ»·ñð™ÏÏ/(Êš¡GY×jËòD~ê¨j?*RŒ² #V«Gu©¾w»È\LJˆ¹ù …QóO,%fæÎðÇ" ¼HäY¯k\oµµw©Haooc/ÐØ)1³íkgŸ'Ò SÙ€Þ~\®È@^"ºeø9»–;†Ñ@ ß0šÒpÆÀŒ'ý.O~ÿõaì§ •ÐäÌ…S†=ݯ|häÀrß0ª„srn¥á‘€_4Àÿ*õ¸_ûE%pa7Lµ§çįۃ)´úº²ì2·7›­ït€gå*5ÌÍ0Vªý‚c'`ú¡F)u¸ lS‚Ø­ÔäM›®)Û$€#J›>âOîˆ?Äëà’²5£-×`*YhÄÀéÁ“ c;±³€çË Ç„úÛ]K&Ž€=Gvg*¥ÖC ªŸÀ¾R˜N]¶ ÓZ`Ò[ºZG[Ȉi¯œvÅÕ¦”°èüùóK=×ãgÂЙ°D$nWE*ˆŸe3Ïœñº" ÆÖ°Æ [¨FGÀ—Êöù`œ ÄÞFÄ1@»–L5ÍÐBë‡"À£\Ÿ@ä{Äœ»€åïFܲÆ~w¤Ž€A3½‰# ê»S1LYUkq¹ˆT¡UD*1ÈÖó^Ø Ì ¹W['ÖqÿÞbžŠ|÷jŸ‰tÄ/Ìû΋g¶ÚfØkùI¤pÄâ¹êàÞ‡°Tæ<}p§#à‰zœ+Ò ” 8g@ª¬yîÃkBÄ~G÷[§<³î‡Òòî€ß6ÀÿÆOü¦\6–ßïÊ<éƒýGvfÁÕ;3·—{#z85ñÅôÕ}Øýí±/ʶCÊa9PãŒSËÁcËK€‡TO-üzé½ð|£†ì áÔ= ¯TÚVß _ñÎd´í;¶ï,P;%qÀ¿=sãöpP©kWû6n¼>¶hön;pl3਌™@ÉÆ+”ëXÔMßs`_ÁÉŽmÄŽr¼§~ðÀÝWÆ @â˜ÛÓáPw~žÄTá®^*Y8ŸoéL°Ú%bÉ›¹# Ë ‘¸WûLD?ßfGÀqø‹ýnò‡/nY‹{’GÀ<9T‰œÑÏÚ0[æÁ>EP´ë•jGEòãµ "} `0Îê2L]ÒñHÀ“¤  ª‘"ÍÀeʨ¨HEìoØ>ýÃ> <]Y¶Ö+Êo•C;¼‘á°Ú^¡Ïþ³xCì|Àž ö*íÀš5GN¾÷bþWÞP¶#~…áZý0qü`m3rX8B_+}œa¥ó¢½±DÀ7þƶ9Ê´¨q\èú¾VØñ6î‹oCë á‡ô€ñ¸0Ðÿ+ 0† ïuttä‹HÖ E@ùsT…"‘Îà|þ®Hu‚ÕzW‹M»Ÿo­Õ½Zë$¿#:Å¡Ó~ÜàŽ=²»÷!Õ‘€NûH@5L¥:ªe€û•3—G„þ"-ÂëAD†±ÿCS—qyñ‡XB­çÆ•;é=ý1ýý‰«Lj¤…@yþ©­m›õ°½;~…{‰Nc£f9𾊠çß;3¢-jX´Î‰­Ázbp$v6`—ÒvÁ²ò=e; gè9vLÇÔ#ÀždP9EY®{Ñš8Vë+CÉ‹E€Ã2`“#\Ÿ@ p ÉuèHÿ‡[u¸`,·þEdþð›ç+SF@à™ÈÀ’Õ;ŠzíèÉ ¦ˆ€ÛæÒžÁÕ,M¸ZOoˆ<÷Û/¿èÕ¦ˆ€E"³‹´ö¢ûñ¬‹_½j®ãàÚ÷[u^`=>*ÑVvÇ. ìi ȳ0´àw"Ѽ&Dd8„ã¹m9ií±ßÙZ¢ûÚö ¸Iiµ@½=œîT–HÍÊäºö}°|x|¦´S¨RJëó{Ñø©Òε¶6lˆ(Ó¤ àÔÚÛ¼ÃGÕ½ðD’E@ËÐ2Ÿ&Œ€ÏãûZ‘*æìŠ›ìŠ€î…ÀrG¸>í@óÁ #`7*Ó?Æg² ÷¹€±Mô@Drõø'Ù°”¤Œ€b‰ß,µ"àŽˆø` •…ÜP'"±L?/òSÒÕVM‘" _ßÄçZíðÐS8,™[°¬Ìc/^[uU_sèÞç[uÝà³—ªîm|5Ÿ x—Jtwlþ‚Ü‘%Ð<æ&£Yx]ˆ¨XûÈø±ø¶¸û?Ù†ñqŸø¯5ú»À}:à4ðuâ‡-À*}½²\Ь¸1ì¿Ã#à ÒvSìÑö‚ýÇójå0gW°AY®5A[½zø5»áUÉ"àäÐ)ƒc # ö6£)U¬BÜNG\:xäÄ©Ê †E€û¸ä<±v£;t¿¼¯Úà+w½w 0Öiƒ¨Ðãc,)#à^üë†ôWTLJ߾y®ïˆú‡"ÀsQäXî\¹ç^mGKlBÞy"‹íá8 p¯vDä›ki‚¥ãéÓV`‡HÞýø=±ÅGE–Üûàz«Ø‡Eöó%îj^|Ù¦¨Ì›!R ÍŠ–§ ¢×m±‘KŽadßBS–aÜOÃïøÍy-À¯ŽHvaàq`Õð‡ï)m3°Â×àtM ÚÆÈðX§´Ïì<ØÀ¥ê_;¬ò#x]¯úxv¬W'€9cŒ€/†6·3ad¾|L÷BîOàÒêFXZ3Ó?Òï „J£úÏÛ|‘«wÜÍKm"s«?×+"‹=@ø¨þà iŠÄNÍ—uŠä5»Wû“Hg€Ú«ö{Q¤p­vxèIŽ6h/²ð?¹Ø¤o"½¸,ò‰{\oŸˆt`j|.W+ûÏÄ´Èg>¯;Â2[L=°Í+'ˆÞF€ÿ#ë/óÒp² ÿ8¯t5@‚[7ˆ?\§´à½G¦kë§OŸ£â"^ìUû†è}Nÿ¸u>`/j{Ü!⛞3©Æ\cw#|*õ逦Á[‡Bcň€Èûqs#à€½_mÛšù¹3õ;7·(Ûè:Ð¤ÞˆŠ·á«„ï"¶êéž-™:S$e„óDòf.ŠŠŽ€ õ‚ù[fˆ>Æî±~XZX¦#@_>'g.2_mH°ÚrëéOî>3D­~Ö½Ú€¢¨ÈÀ¢ÂÙQs+•Š£"Ñ¿,¨‘yžÁÅgX£¿k\o‹­féšBw§‡àÛ?{A~Z»˜ `Û!¦Î˜BÑkŒ€»°Ý²¿; ëãð«¸; gÜ& r H÷j“¨¼ßWö¸Ô —Äûàz«!¿W¯«Ø>¥0«a·owËÔO@Dïbt¿ö¯žT ìÝtnOßvWãZ6m]s 8ÞãNõ|y§ÖL¿°VÏÂÓÝ„ÔÈ@Ûò­ö„e©i“Òöþ VìZ `yüÙï~¹ðœS×´Á`Ç…Ì/|Š”l¿°}7à³Bb àÝ—ya³'Ylʾܹʽd‚Ø4Ÿ\·õ³`|K¬‰·º?ï’ϯ]ûÜ ¬slôøvÂGª. \®ÂÛ§Yd.Þ´PATâ.‚ˆx$àeüÞŸÔï*‘Ì´âKöÈ€vöЧÚÍrĬq4ðÕÈX[cí¥u=Jûô{ľP¶MÄ|®†‰xã±ÓÛñÁ»¶7Ãæ¿f¯´¶Ð—I"àÓ:˜¶»—Lõ?À<‹€M0yÜŸÀ$4ÏšˆcúDÆû?дßpÙß„·P¶È ¼y¾Üó¢Q«΃ˆÞ½èþãGTÏ¿û“øwJ(s/OëÚCʶ®&ïÚ®Sþk*­%/SC¾pÞú¯†{aÚ1Éq\¥c‰Ãa-_«˜c>XvŸS×W [¶¡“ŸVᬾ‚p×äïƒÎS¶=f»3õˆŽ½>‹feYõ™ØîZr¸b”Úµ³ÙZ¤daM,"ÛžŸ@ýæZú¡cª>õD9]Æ0]9¼Î§Ï½÷ªºæ0ˆˆG^Òãßúúí±J&ã@M½óáŸk>ˆ¨D"“k®RNG˜ãŠ¥êkj2Ô 5#®ø‹\[÷rš²ìóõ5îÚ ìR1ŸÖ¬±OsÔìQCVéGIEnìév/™Ääš)Ê©~Ϝğ@Fͪ×6þ ¬™ð y³ ‡l/ÞN æÎmÑËK‡[µ=JxAÀ¿Ô«P…ÃÊÃMÃQ/¡¾íê-´Ákï@he¥·Û¼|ùÇöÛ¥e "¢7w$@ûõŸý.ÿüU½ ï'SG@äýÅÀ6õR¶!¸J½u>­ÂgjâG¥×ŒZ÷Ÿþ1r‚€üI½Û€e©# ¦Ã‘—|'Åhy4Ý`Ñë? =~Øïðð±zENVTÔ«aVTl•_R/icsÅõ–ù´¶â b½vœ' ¦GÝøÛ/ÿþèÑßþò·ª[½1‘¦(bާˆDD<@Ä "b1ˆˆ&vô0ˆ@DÄyˆDDŒ"FÑÄ? ˆDD¼0ˆ@DÄÓDŒ""F#€ˆˆ31ˆˆx$€ˆ@DÄ Fñîb#€ˆˆÄ ""F1ˆˆˆ@Œ""âw#€ˆˆ8Y1ˆˆè5èQDŒ""^@Ä "b1ˆˆ8c #€ˆˆGˆñî€nEÄ "â‘"Fo$bñH#€ˆˆ31ˆˆx:€ˆ@DÄyˆ@DD<@ïš&#€ˆˆéŽDDŒ€F1ˆˆ8O#€ˆˆ@Ä "šø§#€ˆˆ1ˆˆx:€ˆ@DÄ bqÆ@"F1ˆˆÄxÊJo·ÿxùòí·KË@DD¼;€Þ•ðfÙ^лœ.c˜®œˆˆˆ@>šö.û›@Do12\ø© ;»à§ 2Ôø#F@Õe#ËUx…êZûÿ¸Z[+1^^~…áÙ!ÑÃø¿[¦9lù¿jœ#Àÿ‘‘ÐG~¤RÒÐÆK{.üÇ­Ad ÆË˯ð'‘ ¢7„ßpó`δarÞTÄHíþGEŒYðC#‰ƒHa©È]Œª®´‰<Ó£ÿ³4޽{óADEðδ¬Ÿ+6^ ¼]FR]Þ?¥owîÞ ‚ˆ&†;]füxYWÀ[pMÀÿ1ÿòÿøB·rè¾ð±ydàÿ(b¤àÉ~ È6RÈ~Ç#€ˆ&Œ+­€'Ç0ò߆èÉ5ÿê_ð¾yt ·G#`|* ¬Ëp¹2­²Ý°u•ž¢†b”µ>}€˜Ê¶YçïÝõ¨jX,mhhÂä?|¯0·¨*uTäO-|Úê³CíûÏdyaÒ í??«<¸ŸGiCC%úòÏïo÷Žq…®½GéÓ©…ùXî44TÀæ3»ú6\ïñmADM†Ñ K¶qÙ›¿ï~iYºÎ¸Ó¼ ð€r9`^*¸S#`|* 7A<nZïhP)2¿-*–~XîéGW€YS `ÇU±- ¦ˆ€YybŠ.سËçŠeà 7Ö[-–êR¸ŸG¡ÈÓEb™[4¦ºö>ôSl÷ÃT rOÿVlG›0â=¾-ˆè¶q¥ ŸaTÀÔ˜uÅú/^v(-L1üïR ì2OLQÄ— ÈOØøÙÐòÇ2 Ú=Çå;#ÀþY›íIíÙ÷ãëŽ6@oìªhóÝÏëkyu£¯Ð½÷Áƒ/ÈŠÏào—†G¾Ç·å]Xj £@p±atí7;௯âî€nõ͘6mVÏð•.úë<¥TϬiÓf(bŒKä&l€W -w, GŸö¶W‹D}@YžÈOUíGEªƒþÞ,‘¼ÞÞ ñªHçÓÝÅÖpêK"ó Šôó[T͹8+ç^§¹š’ØÆžŸoȲÖòÇõ¼=:G§FEfŒºB×ÞëÌÌ/*4ðëÐ- 3v4ØkõŒxx;Q«aÔúœJw £=€@¾a4¥á‘€zó¨ÿåÔmfA¾20ÏÔ«„&g.œ_AÆ¥ê.ŒÄž8WM$#£G©)Ëj>U4a#`¬p%iè‡c‰€N?€Ê‘@ƒÈE˜ªª®V:. ¼=0PÝÓL‘§É"`‹È€@p¶5fë_̽À[-2Co,z¦©"Râz…æóYÐÃvõè+tí½OôzPg>¾€R™ ÓSés½Ç·•]1‡4]Ö‡îF€pNέ4¼Epºy ÀÕÓf+‹y(`ºJàÂn˜jOÏQ&/Ê'וR[í'B«¯+Ë> sg+Ï—Š&jè hm!#¦½rÚW˜ÆwaY"’ ´ˆÌ¯HuwÀ=‘O’EÀ<‘,Xüóí1;d>Ë}‘j½±XGEò]Ï[p–*‘h`Ôºö>W¤: KÖ™3ƒ0Kdi–Ù"-®÷øv ¢,ÃØÿs_ÎG±}†ñcmÚÞp~Ú´õ®˜Ñ­,ë§M;¯Ü¦¡íž¬”ò£x7`GÀÖ ´õ±8ˆý"¢ˆ`¹eýîKDý°Ì™ Ô‰ÈÜ©½¡Dlê+¹ûÈ’$ŽŠx lј÷¶Z:DÄoÙ%°åŠœw=Bk,Á<ëñh+tíýO"…pÐ0Cdf«m†ë=¾5ˆÈ“ohW*` î·NyfÝ¥åŒÿ3mÚª$  VM›ö?Êecðý®Ì“> ÍŽ cÃÖ7UfÁÕ;3·—{#:àßž¹q{8¨ˆ§,?xàj€1˜ÛS=/KÞÌááàÉŸýL´dð`pa,¶ÇìÃâTlÙáÁK—ºžGáà¥zsEü£®Ðµ÷K­×»"àŒ8üÅõßDlýxÿâ¿΀Îê2L]ÒqÆ@ó’€CîЙ¨‘"ÍÀeʨØÐð©ýD°\™nøôû€Ð×ÊtX©ˆ^ P©À!÷…#À³¸Zls;œÐø“h)" H¤Z–=f‰S‘µ±hÅ"]Ï[刀ÑVèÚûN‘wtŠC§ë=¾Eˆ(°ßèò#&Ôúq®a\¹“~ót›ƒ¾»âô“Ã-Ê{ôOmmÛìø&þD»~é DGÀjÝ eöcâ-‚± p5€‘ÿÂxzsEEä¹ß‹EähA~ÃÝÂäÐ'2à}·Ø#½iíEEÖÆ¤)¶ß"3G>ÑVèÚûE"³\`ývöà«J\ïñ-BDí†qžÛ†‘“~§t¸ y|ìS~øŸØ¤´Z ÞŽ€Ï•­Š8YPÂû´Þ—ˆKÕTk¸uDÀ"‘°$€à€Hl³í1»Tú1ÎëøP(R0òyWŒ¶B×Þ/ˆï%‚eežxl9·Ø{|‹Qëдwÿ'Û Ñ0>N¿#út€»’Ÿ8 |=<Ê]O´«ìˆýâ0šT qÚà+w½wG4@WÙ‹F@GKCEüJÿÅ@iüÊ»g"m0;“G–êç€ÝznÏ|‘ý°³žféX„©êªHûˆçÝ0Ú ]{¿C$ï~ün‚xä›K5ÁÒñôi«ë=¾5ˆÈÙø¨ ZŽadßBS–aÜO¿Ðº ù…ÇUîÐO¼§´ÍÀ }‹à¸Dñ „\ÃèO"ej¯Š"Ò[º@h†¤ˆ€©±9ø*æ‹È–Ø/vŠ< £RLSƒ@ø¨H´Öõ¼+FY¡kïýÏE.6Åf,Ò '8Ú Õj×{|[‘çGãJbüYé˜ÿû00îУ#`1–ÀG~¼œ€¯´C¼ee°xúúª<·£¯N¡Ò¾Ž2çÅüÁ¾âÒ€ëù—ZaB•÷K½‰~ÛWt¿G"šHÒàÂ@×W wñ«„'U{7[ãZ”Ž­Æ´lÚºæp¼‡Àp©ºl$p¹ iFG@ú#"F€úÃvšGý(—æy‚*‘Ì´âKñÐÖ =¤Œ·¦ý†Ëþ&0ˆèMaôäN›–ý¾áýìiÓr{TB™{xZ×ÚC}%öª¸uå0y×ÞP–MƒpÍŠ@ §Ë¦+'FÑ›˜1Pû?Yæÿ ÝÃÖ{Áœ¬ˆ@D4ñîíæÁœiÃ伩ˆ@DDûH€ö·LsØò1ˆˆhâG€–qàÂOÙÙ?]8¡ˆ@DD:ˆ*ADDŒbÑÄüî"F' "bM€Ó=Šˆ@DÄkˆDDŒ"Fg $bñH#` "ÞЭˆDD<@Ä "â-‚DŒ"" bqÆ@"FO1ˆˆ8O1ˆˆˆ§ˆ@DD<@Œ""b¤b1zÄ "â<DŒ""F#€ˆhâŸPDŒ""^HÄ "âé"F#€ˆ@DĉDD<@Ä "b#€ˆˆxw1ˆˆˆGˆ@DDŒb#€DDÄ Fñ»ˆ@DDœ,ˆDDôšNô("F¯ b1ˆDDœ1ˆ@DÄ#DŒ€ ƒˆxw@·J'Ä "" FñAb# ¬ôvû—/ÿØ~»´ DDÄé]‰o¶áíñt½ Èé2†éÊ €ˆˆ8OMøhÚo¸ìo½iÄÓ7þöËÿ?zô÷‡¿üí†Ä¨ºl$p¹ i¬®µDDüH@÷ã‡ý–'Oú-«qFŒÿGFBù1о–©‹MÍ®Ã8)kXRÐ`**Åhž‹„ðr»ï-9ŸßpµPQÁ–ý9MHDÄøÓ?žôóäRÄHíþGEŒYðC#‰ƒH%p^b /XWZÒ&qógô¥^å³—Ž€¢gb»Ø'ÿlÑ„@DS /'kZ©çÕG@ÏøDÀ¯ÿìwù篊)]6ŒlÆê®‘Ô]¤PyF-òíNdþËD€6×—r•/³¢3P„!}Õ·´D4…–üà[2OÀ¿õ'ðè_Šöd0’ûØx ðvIuy‘Ü9šu¿$Ë>íô¥"`õêÕ‹ÏwZP—|•/>©Î/)ž•gþ‹!KEdKQkÃl™"š€û #7ÿ#ÃøëÛëOè·Çj¼ÕWU¬zPQ/ãËŠªnõzì …·2’òd¿@d)d#©²¨È‚LáïDæWœÅ“9ÿ*" @d©¦b)E\_›°\1´\$µHD:ïU`PÕ|‘‹³rîuŠä•Àß›eþÛÛ[‚„ ÏÏ7dÍ‘ï< # Ç|±Þ<‘˜BÏEŠ«´"@ªïÝ.:*z‰óÖªòs .Š<ëˆE@tjQqa4á…~Þ,sÍŸ Fï™L}Ðt{‰ˆÜMȸܹl˜*Ü1Œöù†Ñ”†3f<éwyòû¯c?e¸F«Œ=@qFF½²Õל۸Çñìµs«ô='c p!##¢2M©"àÓç2?PCê7.¼älˆçjæ8#À½É™çjêõÂ7ã‹dÄ—wït}†¹ÆÈŠ…“»c/ê|âSó ýR{¡ú… ##¶_`ʲšOW-Ó«Û“ùuýh›u¨úSLëx‰ ¸’´ôC$U:_,ÕKZƒ· ̽À[-2Ãy_¢ˆž=–’D<*rÀŒØù€"}H`Ø…«„.Ú«l‘%0Õ]™©# š»°Ãx–vV‹iKC‚OŸ‰–WMÈá~—qù®aôéë«„srn¥á‘€_4Àÿ*õ¸_ûE°ZÐäN‡xV®R¶É aeGn(¥: mWÛÉ#àÆé2˜:v*m«¦æÓ7•¶¼ @`m†3†ogën˜B«¯[KÅeºäGx²ÒÜ;íEyÆŽFuË”R§e±÷+µ 8§š|8\¶ Ë> sg+Ï—ñÇŸ×8qMM^ ¸{Õè›u|¨ŽOñ-‰]­£-dÄ´WN»âj’+'Ú³%w„ž‰äÀr_¤z´(€%pT$ßžŽEb/©}6 #"@¿p–=úçŠÌ ÁÒ õ…ñž¨2àÛ™8õm‘D41# Xd¹MMú?}†ñcmÚÞ"øŸ„  þÛ¯ý'Yx”R7ÏB;µG™2› Õ®J{QÙ“4æ´!f—²œFLy†nhm-É"`kÚ‰z¥"ÅÀ>e:î<üàÚi?ï…vÁ¾{áKeÛg¿z0Ý^¨x7LׇoC/v2ûED?^£—¨¸V [í£nÖù¡:?ʼn·¬±ßÝRéý乨æ÷é;ð{[-"â%J?~XHggç¼1ÍÎ5ÕgêFF@,í"ß?‰ÂŽŠ<°#`*,ÁêV1îöØ»ëÀôbàTDõÔ¢2¢,‡œâˆ cÃÖ7‡oCúðoÏܸ=Œ=®Ú·b×) €³;k¶UFÛ¬óCu~ŠòtÀϸà R ¶æÏΑ¹a§âÔ #>„/M`ý°øF%ÜÆ¾ø›ˆ”Ŧ,{­X*Ð4úfãªþ'ò-‚º\ `äc ÂEf¡Øúµö¢¢Æáp¶ÂxHÓàQø™îkœ:EJÏ%ÏŸ2‰,Æà ß6jèþÈ "fþàâÈY "šx®]ñIƒ0ÈsÛ0rÒ8[c¿«RE@$ˆf¥uÀ§ÔÍpdcwŠh?’,"T*m°ÆñÄ ôµ›”íf q|e-¡ÕõJ©K^xƒÎ1Õ½ÓÊŠÁ‹>×Éaíc*9#ÀZ4Ñ6öÙ¯Ò««ˆÇƒå40YYÎÂ?Úfû'òdAîs)' Z|æL;bf‹LE©=´;8# :¾`<îVAAê¸g®;GdRFÀ‘°5‰HkÒ(éì<í¾ˆ”9®,‚öToƒˆ&š,ã²@Õ=êßýŸl€FÃø8Oü×ýÝ âtÀ%Í€±+÷šV~‘‘$"~´«„ ×öƒÒVG”RÝë6”wT•vlZ[Gâ8=´D °J™v¨Ø£\;íov¡?*õ›•3ʕŽ}ƒ¿8Œ¦ØÝñ%õ†Ëáe³Îp}ŠqÚà+w½w zÚà‘y±-„Ÿ‰Üƒg¾È~X‚YO³ôˆõÇ&áËÓ?<Œ€EA˜ª®Š´§Ž€¦¨\\ R8V銀|‘g}ñ3WƒI"@¯ "V1æ‚0cGÎÍRÑÄSgû›<µW¼0åFö-4eÆý4üî€ßœ×üªÀá·äp N׬!s7,¡Í‘„P,O׆]·O‹g¬„¦#à{à=¥µ$Ž€ãCKlV(K)°Y9¸vZïŽÑøF_ÚcùFw¸·¡ýÑ# Ùf]àúùBuÖ,À }1ýš&˜ÚÎ)[扠ý¥-+Ûu·:Ž sÇÛYW“wí =ªW±oôüYiî¼Pákà eûvè<Å.àœs¡áÛÐ[‰EÀY4;oô{Q9–ÍêÕý)N¬@ÀºfÖ©+'€tˆ€,1U{ADôŽ PëOè·Ç*™ú=sbA0¹æÚ!G¬ªÉpæÂ=ƒ‘² Ø RÑk;pC šs`ÒMåÐ3¹æ½ˆrpo'ãÏ5DÔ(ôN¿´dÛxéͺ>Tý)N´мنC¶¯Pãü¹K16YÑèÀw^¼DDis‹ ö¯G /ø—O…*íP%^·²ÒÛí?^¾ücûíÒ2¤‹pU“DDïØ‘í×ö»üóW5®V#X¯ˆ@DDé2c Öý§Œœ àRã«Å*ýDôî"žÐ?ìwxøX³=_)bQÍÓ£nüí—‡ôèïùÛ Õ­Ò1ˆˆx:€ˆ@DÄ#DŒ""F#€ˆhG@#€DDœ'€ˆ@DÄ bMüÓŠˆ@DÄ ‰DD<@Ä "b1ˆˆ8c #€ˆˆGˆDDŒbï FñH1ˆˆˆ@Œ""b#€ˆˆÄ ""~w1ˆˆˆ“½&Ä "âé€EÄ "â5DŒ""F#€ˆˆ31ˆˆx$€ˆ@D4aîèVDŒ"" bñA"F1ˆˆ8c #€ˆˆ§ˆDDœ'€DDÄÓÄ "" F1Ò 1ˆˆ=Œbqž"F#€ˆ@D4ñO¨×‰DDÄ ‰@DD<@Œ""b#€ˆˆ8c 1ˆˆˆGˆ@DDŒbnUõÝÿùçû}U· "¢wåîb„Z§9´†@DD<@ïBïLáNDDÄ  e·§™nß¿S UÞ¹¯•áM#"bÜøÛ/ÿþèÑßþò·jü# ñgsÐp ƒn=0ñs#ÞU­>M´è~ü°ßòäI¿åác5ΈºmŽøU¦Êì‚Û!Œ¢¯eê¢ES³ëðÆuŠÔˆhb}wÀŸþñ¤˜'ÿø“OÄðÜ×õ»<ð •Ày‰)"‘ºÒŠô‰"¢@_NÖ´RÏ[3YЯÿìwùç¯j#Àº&ð\nYW"…Ê32h‘nu"óÓ&ˆˆÂ‹ K~ð5œèQÜ¿õ'ðè_jÜ# ô³{°ÇÁÏ!$·EDŽfÝ/ɪ‘Åp+M£ " ì7ŒÜü ã¯oÇ5ëOè·Çj¼ÕWU¬Q/`α"Êé› ç®«V4WP¯ÁºŠŠõê[^±ûÐ;}®ÃþžÒÛUÖ?æÕ}Hª,*² Sø;‘yiDD÷ #þhµoCôü»?‰÷Œû |¡Ælëî €Pñ sãHLµ›¹ÞD1ZÔë0ئþ¸=^l·" ðóÈ“3 nÇNü@2­"R [i4>‡Ú÷Ÿ/ÈòÂTÕ°X$ÚÐÐD¨¡¡¶º††&ÀSÔPŒ@Ñþó³Êƒ®ýi˜u~NbB ³ §>õÁ¢_WÖVPøôb*ýÛ:gyÈlœˆˆ £À­ý†a„›5°ß쀿¾Š»ºÕô°?…‡ã‡B8®Æª¡cö{< lÒ<ãl½2]ïÖ+§]À®·+ÔJo¼K`ÎИ¤Ð¨Ï $±HD:ïU`PÕ|‘‹³rîuŠä•Àß›eþÛÛ[‚„ ÏÏ7dÍ‘ï<TzUdîÔ¢§3E¤ð™çÙ‹-@ìuGŸö¶W‹D}±kgç^æOw[/ðÁ‰ˆÈ0nw.¦ w £=€@¾a4¥á‘€Œ'ý.O~ÿõaì§ ×0–±(ÎȨW¶úšs÷8ž½vnU²ÌÉX\ÈȈ(‡L`“cM梗Ö}=Y÷LFÆœ¡g"jð½²­€>ßÿ¥úu|¥œ¾G¨~h«–M¶ÛhOæ×õjPýÆ…—ÔOœ«qîÜäÌs5zimϺc©#@¯Ðýf»?øzᤈûCþÙ­v¾K`ŽùÁ$ € ùI•ÎKõ’–ðàísïðV‹Ìp\˜0¢gc¥ƒfˆäuÀtÞ\U?‰<óÁT("ôë:ý*Dv¥±8@oTGÀíê&˜fZÛq""2Œîw—ïFŸ¾N° @8'çVÞ"øK‚ø_¥÷k¿¨ÖC ÚåéÏÊUÊ6¹!  ìÈ ¥T´íÊa;p@Åí2€é‡ë²`·Ò>.¨É›6]S¶I±8 d*Û®ëøñÃà:?¯pâšš¼@pwlß¶ú`j>}SÙnln´¯9\8x "L¡Õ×ã;W Ó© #ÀµÂaovk Lµû”ëCöÙݾ‡"À£ÇyWhÎ'ÝJç‰ölÉ¡g"9°Ü©- ` ÉG\x þ¨læ™3^ëáŽÁŦê×Ý…e‰H.Ð.R†e±Ž€A÷D>‘a‹ #·©É0ZôƵi{wÀ6€úo¿öŸdàQJÝ< íÔeÊl‚V»*IìEe3¶`«°®‘kô€ÝSï!5ä[àseúX«lÇs#n:X_çš ^åµZØj?ÐSž¡L‡ÎB ~«Gô ´ú€Â÷ˆ9™(\+t¾ÙsAhzÍŽÅñÙYNÁy'#ÀÕ®péý乨æ÷>émµtˆˆ”(-Wäü°*1ì¡¶‘™öë¢~Xf‰Lµ[[éP›úJî~'²NDD†ñ¡ùeÖy€;‚ÖŹY÷Ci9cào àã' ~S#dlÌJ6n\anü°ûÛc_”mÖ ] lž´gz;pZ©kWû6n¼®†DʰC9#h9xly pÂ|ýÁx1dÚ+´+„SS”iN)pÒ\°þKàDrXì\gÕ¾»NœÝY³­Ø ”Ú„·/¼¶Ó§Çæžã€ï«ÌmÇCÀ:k‹!WïÌÜ^ìµæe@Ýô=ö…œœ \+t¼ÙšF7_XxÒÏ5üCq|v–ïkïæéW¸O¸[ógç‰ÈÜ0‹SqꈆakYЏ»±¸¶ˆt•ƒ¿xjGÀÌÁÃÁžüÙÏD['""Ô|†Q SYV—aêzŽ3>IÚúaŠ‹Û¶Ö/Êí‘prìÔ}ýîÆªHÂkå6ÚË9#`µÝ>{øÏawül@¦²X³æÈ)À÷ž²í9:ZƒÀÞo”ÓZàZ|^ë§K@Û}=Á^¥ÔæFÿzešB‹>¦Ð|)va¥R‘ `¹2Ýðé¾ìú ·q_¢p­pðÍFJc3!, Âq}(ú³,—ÌwòÂ@W¸/ L¬y¦=è‰SQê€V,rqEöPïz¨{ ÚG­Íhóõ…?I#€ˆÜp¦Ÿ #[¨õã\ør'ýæ èéyøëïO\ `JåÀûzpâ{{¼]™ú‚ùå@Ͱh£Çz=R~¬Òg|±wµ –•縉J`+Þ£†9쉯ó3eÙ¿ˆ°MÊ¡•ú̃޵ž#måµhïŽïI‰Rª80¦»ô o682&“\Š3¶ëßÁ[] àºE0¹ðE‘Y(¶†~­½¨¨qxœ­0Ò[¾ÈLÄõŠä}"2àô—º#`ÆàtÅa=]Ñb9Zßp·@D#]1ºâ“aç¶aä¤ÏéW<¶Æ~W¤Š€HÍJë€O©›!àÈÆîÐDÅé[;…*}Þ:plèÒÿs­­Íô˶47TN{á‰ÄשÖÓÀde9 ¿sßO  TÄo÷ð\Ù¤´Z ÞÜÐ|ð†Š9¶+fº+ô ov;ðÅàÅ»œŠ+.›ÞÅÉ‚Ü z² Ågδ#f¶ÈT”ÚC»ƒ3ªã Æ#àî` îÎÐ}¡²êD$èçE~rGÀb‘ˆoAê€E"3`)`ÑHYÆe/€ª+zÔ¿û?Ù†ñqÎðÿkþîHq:à€f À ¥–ÃÔ´ò‹Œ$ñ£] ‹€ƒJÛL1ŸoÆný'ô{jÈœ]uÀ†ØqÀ¦ëJMþʃàBå°ÞÁufÆ#`²”ëè^·¡¼£ª @ÀÞó³ÊáôО¶«Ì|‚'ÖnŒgÐ|±p­P¿Ùت0ø™¬UŽÅ™ÀWïâ´Á?» õ´Á"óbˇŸ‰Üƒg¾È~X‚YO³tèëø*EòôÏ#`Q¦ª«"íTÄûä¹×s1~ÿs±{î¸+2àƒÉóŽ€g"m0;D4RaìoòÔ~d\ñ”cٷДe÷Ó0~s^ ð«n‡ß’GÀ58]³pï†%´9’0j€åÃ#`ÝÐ=Öx»X¥ºk­Õ;­ò#x]©ˆÁcʶèx¡ÈX‰¸€½çG”Ãñ¡ìج¯¸´º–ÖÌ$à\¡ó͇Ãq5üCy'#ÀõBµ?;`ô/ª‹ŠÌh‚©êŒˆtè›þwŠ< áç‹LõßÉ`ÈÔ žñ/Z‹A¹"²Ø£Ôî ÉPfM?Ô쎀[y"óü€g¿èXª+„f#€ˆ\>6´Ÿañdþh]øa`Ü# çGÀœWêpúOê#ÓµõÓ§ÏÑãür{B—• #`pløÃ/”Ö¢‡ì?ÛÕ1à î4°Ì>_¿WÅø€=îÓÉ# hÚ¼iç²u(u(V›‡r¤!Þõ;7·(Û¨Ô”÷c&Ç#À¹Bב€ ƒJþ¡¸N|þN~•°ç¿Jx‘ˆ<Ÿ=µ`ösù@ÈŠêK.Š‹="²´° øIDÎL]2_ sÍÌ‘{œ)"ó·Ì´^˜ „þ""g.ÊÓ»";D$oÑ¢ùb©ÓQ}~ËEa‘›'Çó/߆vËþÃé8OÀ/îûœ~IyM@•rÛ³<\O+QQ ¯ ¨C­²ìÆnµ¡ eÚµæ¤^:~¢}§½¼¶Èt_˜4êhÔwÛ×{¢÷tŸÒšz÷u°9Á…®ÆÞ¬þ÷`òå¾0PöÓnÁåÖ4I5ÎAKB0yçIÌOA}ÂßR T\íb<®.mœÊŽJLA€¿Sbî!Q`ªhíhŽïÀÑ@D¬m­ð8VÖÞÒÓyÚà'¿?þ}D<ÉHÊrø³²]ÿ`²RsöÜèŽÉÓõx¸^9ôTbêã·îˆÿêýZ=‘žóå{í¹¾|J»éw^7 ¯ÄO ã3\Î{"GÚzT&ðƒŽ‚cÀ kÌÞ3GYV釮p­ppo¿Ž+Û¡>¨w}(ú³{çnÔ<÷Í?ù]C¼y€à¾)Ý«K´ú)´ª%bš·#Kø^§ H-€Ò™Ï­hÈÉÒƒ¹jžˆ£¿AY๤¹ÍÊá°}D`e·5äÖÆ/˜D p.>wè~W7”Êðk"Ê4çPqO”4Víö [ô˜½ ð¯ÒǬäˆÔ'ííWÙÇ2h¾k‚Ó‰"ÀµÂÁ7‰¿—ž#ÀNׇ¢?;í{`Ò;Ý6+  ÃT™ p;„ÑøoïÈê-s®«´¯ÃùØ[{ôõU@‹ýEì+. À%P×ç :VX×w¿ NîÅkñôõUy@DôòÒàÂÀ—ø*aUbM¸UÏxjÍô kCö1ðIÖžûàë -võ^Ù—;W©¸ÏÌ‘€¶å[Oú€¶ÈàÅhŽý¼ðo¸°b×jÄÆÕo­å¿]¸ly Üéž68y¨S@ËÁÌ}»³7ÍŸMÿâxPÏ\PãZ6m]s 8Þ£Çç’ϯ]ûÜ ¬K®:ÞlM#°òóuw§"î%öÙY|ïÄ´Á®¿ú§=¸…A·LÓG^ DD7Ôö{R¿«D6 ~w@94=Ÿô@óÕ(Ó§u0mw~Óßœ°<[íÇ7¬UÚ§ß#&ð…²í,CLåBåñ⇔°>¶¡¶r=fGv@ |®+"íì!ešäƒæYI®:Þì² ´æU®ÅñÙ©ÀõŽEÊnO3ݾ§2ª¼s_?*#àM!"F@Ï¿û“øwJ$²ípl ËXS Àsx™²­+8uº^ÙV}æuF@3Î*'kÀ>°¦“TÌ!?P3´Äak}-_«˜ÇKx|G&+‹û«„7Å#`3p#þEÊ”y"Öf´ ¬,s64ð—g*m]9LÞµúEª~s-€ÆØs:ìr¯Ðùf—µWurûCq~v[ß±¯Ö‚w¦p'FÑ›˜1P{ü[B¿=VÉÔÇ®œS‘É5×9ú`UM†3nìéV1«€ ®0×Tã|ÅžJ”CäÚºÔ0{23ë•ËN=4§2çÀ¤›*Nïù{ÝjHÆŸk>ˆ8׬êÛ ]oöÆšëjø‡âþìŽ#xãÝŠ-Ô:Í¡5„W¨qþÜ¥ "â‘€”þõ(áÿRãé °Ð#l¶©—PߌvõV©áˆJ~¼n[U}÷þù~_Õ­Þ0""F€úõŸý.ÿüU«ÕÖ§Ž€K+6የ—± ÁUêm²eߤsÑÄ¿;@ëþÓ?FNð?©ñU‹b•:ö\xÉwPŒõÙãÅvõ†1ˆˆx$@{ü°ßááãqõ**¾Rì¨Ø8"‚™ê%ml®8 ÞË+J1Ò# GÝøÛ/ÿþèÑßþò·ª[½~S&¿ü¸HŒ""F#€ˆˆ@Ä "âw1ˆˆ8Y#€ˆhbœèQDŒ""^@Ä "b1ˆˆ8c #€ˆˆGˆDDæî€nEÄ "â‘"Fo$bñH#€ˆˆ31ˆˆx:€ˆ@DÄyˆ@DD<@Œ""â‘b# Ý#€ˆˆÐà Fç b1ˆDDÿt€Jˆ@DÄ ‰DD<@Ä "b#€ˆˆ8c 1ˆˆˆGˆ@DDŒbï FñHýöî-&ªsÿÿxÒ³ë ñêIÆ õPc%½³Mcý©Ñû»zÐz5¬l™qD/­"ˆ€AÚ"¢»žò…«2L<¬x¢ZEjk•îîîãÅ­õ¬†Y3ˆH-ÒÏ+;×°fÍ3\ôyÏ: #€ˆˆÄ ""F1ˆˆˆ@Œ""âw#€ˆˆx³ aCŒ""è"FÏ b1ˆDD¼c #€ˆˆ{F bñê€v!bqO#€ˆˆ—1ˆˆ¸'€FF€ÿZ¨ëîw»B×ü ""Þ1ðÏ‚lz'FSDDÄÃŒ€ÀÍwâÜ €ˆˆxŸõPzýÓõ»7˃Áò›wõR)ˆèF<ÐùÝýß?|øýƒûßu 1†_í sÒ¿w Q×î™ܨÅëV×ÔT‚¡ð75•¨jê‚ËÐ6U—;)8œ&"î ‚öGº-Û?<’aFŒ€àusÆ¡ŸÙ׃x®Æ sçN˜T…arG© Š¥>ð›RA ‰kSß(õñ<ŒˆˆðÖ»ûyüÃ[2œˆà½ëþÔ¯÷Üób þÓʱ!€Dª Ë^oü2L 75{”Eù»¦M|§ÐûûG@ÇðDÀ“»]~|"ÈÖ9×àrÍ:;(ÿZEÍ-[•R³ßؘ¢ÔÂÑDT7ß°,¼!÷ øéaw’ѨØ#F@ðFt²wÅÁ ’ûL)uhâÝ‚‰•RóáVø&G€ÿöíÀ¨Š"òï6Œ Þ3Œ¿¾ðèiwBOÉp«•­”—vdÛž°Ä訮¾*ŽpêÒœmé’ÀѲ’Äö`Ýfȧe¡vyu-eÇäÕ-.+Ú7Z" ËµÛß[x=dý0ÏìBR¥=J}ì‡©î ¥>] ª ¢»†1 |e•¿ÿáye?w'ñs‡ ³5À ´ÍEÁüe‘r ÈmNLÞW$^+%I4-2åÀp¼íc¨”WWœœQþñ¼f\wÜð#™&¥T!l…=JUÁlÙ}zÃÄl˜B5ó•ê©©© XSS[UMM=àͫɇ?o÷éé»î95”»iúþRh}[ÔJößÙ4#/„ˆ²6=krG€ïÙ„M×á4Mœ°¡±)áR’Mݬ©)ƒ¥¼yúé;·õ kjÊÑõlÓ„g¡˜Ç« ¦ælæû>…‘‚ˆÞ5fxÔ7&A+éº[X:RO |ÞÔsI ìk8 ƒ°³¡a™ÄÉÆÊ µçx¡·‰¶6€óâ­~hé朗L&°øµGÀÐÿv[Qûù舀¹#ÀÕÎsW@É´)¥ê¡åçòk–²ôÞ0]9*Q ÔÿÁ6A©g@¹R³oT–ƒ…ñ°PYzòàÚ¢)÷’²- À6}ž½òǹý# ø²Ò R¶o®¹—4÷¦6(uÇR²\ªi“R 6õØëmˆ8~\s•šà ^©ß!ˆÈ0ò` ÆyXj'^4 ãâ¤àˆ<ðèawR‰[8%ƒ° Ø(q¾DÙ «eàÏ\óö䣯‰éÃOhœ«¤W/òË¥¿Å@Vò´Ø˜*¯?†ü·óq`tD€y·àJwxa©4ïŒd½JMñ#ÖÝ^¥õÔ¼(Ô%¥}TÛ/¢æå»¶¨·©ÍôÂÔ¢=ý"À;E9>©ÐuI9¾ Æ/i®ME#`“ŠX —æÅ.ëˆ×sË^X>6«##  ÀµÝ†aÔÌ7k`·Ù‘ð {†7öqT+Á#bj? ¬‘t½8Kœœ+*¤]#=d9£"Ì{Ô&iÔêãIÌUJ½S†¨Ðl¥¾>íÎY¥æ äÖDóç­[Hê·Ó5­Éú o\,¬¹5cžRS][Dí%óŸå[OóhëUjö†¼gÖHb#`ƒ¹8%·fSùÃk/^šº7Ã\Ì_ÒÜ›r" ÔÈ7m¡–CJ 8Iðõi¾µÞšñãÊ6ŸSSð7¥ò1r1®7/¦27 £Åÿèw ô<îvyüüÉç_‰öùOµØª+Z³Šc~{¹5½C,iž•À',1Ru1[ò˜«ž[³1E¿'­ï7aI‹mÐ("Ûæ”qÎÜÿa¥zl+ô#}.™z{WÅrÕ~ë9ž#¯*ÕÖ‹…—ÍIiï+”=­iý" %µµ¢ZÿN¿_ý¼è-ÅkŽxŽ€ê¬9ç†þ·[ l`Îù$ €€¹€¤ g+ËÁ…uÑËfÝ}P©)1'&Œ€žSβ*è3`Z`nʽÅë½½ëašjnFÿº× 0³_*g‡ü3¥T`&ÄD˜f\êÝ¿¤¹7åD@!0…ö^*×ðu@å%¥f:à×çåóô.ƒˆÄÝóƅۆѥÏ ¨›6íÚÜp?Aü]äQ·v_⬅SñÉ ïòt±¥ÔÔ(=Ð)"mÐr$F°G"v©GŽÁôe…ˆ|‰¶8#)ëÖ]ÛXÛ™a‰DÀœè ‚ÖâDüÑ€"Öš'ŲX$–Ö lZE$»<¹µªEžVÀ¿Ú€ÍE03®ˆH`OäW€üHzœ±ÞC!L g’GÀfL'N^âß®8<"À«çyWhF ?RÚ/ oþ¢Ô4Xîšið¢Ø‹ÿR úE€~†¿W©{‹1ë}à#g>GÉìØ˜®Ô'Xf*ÕÔe¡é%צt4š*ƒÃŽ€Kõp&øÙN¸Æ™ü?Ö¯DD#&y†1£¾Þ0štÆW•#öÁ_6€üÃYø5YxEäê)h ÅbJ­‡V™ž$v ¼#6rü°•}®ÏÛ×bGÙû¤ÏV`©ˆT¤ŠD# ÓzLË×Ï‹j‹€)JMm²éÏä+¥æN A‹.ÅroJG@•RjÖ„[Á¾˜ [Ð|B½ñã ÌRª@ ¨ x×ü_©uà&€€urÀŒ‰wƒ#òꀧ à不Ç“• de-i?m=²bмOÏÆëÇOn±?‚_ÎÊvfe]‘>áRäJl{,.Ž™Ïß)†T{QÛƒh/Z4­¢I ?|‘=WôܯØ Ì‰‰`Çö=“ó†°ˆ´ÈØ–šYèH Úä;ÂrXL®ö‹,ª&ïÙY‡@JâÈêræ\Þæ¶ñow¸<º¸À}8À%д`æ–Ùy‘]»3q¬¯-Y+¦” ‡ø·[ ¤ŽªÝ øÄ@·Sí):OÅÊ8z¡å+õm²pm±öµÖ¯ÏB›gU”^Ã÷M²}p-iîM9àPÙfµé¸íÿ”Êu?.´ÙÇ>VjˆhDEÀm˜n†¶`Óû3 ãâ͑ݎOž?v5€i€Ø¼-–â€5ï.–|uÀb ¢_4¥é¹^O‡t}4À×.¶í°,#®ÈªE[ ¬“>éÀ±TûíOïÈȶïPT‰‰€q‘1m¶Ÿ´C¿æfs€–öÈà DŽãí·¸'Úí½ YÖ¦±gWä£|ˆ»-ÀÚQu‰ »ô%‚ƒP÷­RÓ‘oMÔZK^^mÿø¶MÑÃõ°-Pjj²pmq¾¹|hšۛìɶK©^/lb#`®R3£O+€¥|âÂo•i†kIsmJG€Å{kÆ\«~+±‡Úl¥î9Ž—!þßÔ¼ŒDtÑ8¹i¢¼× cÚŽ€GöÜïj€" À ÑÚà¹dµ( ÷‹€%¢5 $"‹ô§ñ#À*ÑZ›šNðg†D€G´uÀR‰Šyú—hÙWŠÍ‡­v °36ÊĶÖ~öÚhH\õÛ°ª¯,*jÙhOÅ9(¸lOü([‹8±·SiÛ#R\>ÿÿvg€u£êfAîøfAó¿þºŽ™JM@¡žÚ£úEÀÁèŠNÜŽVÁ†dàÚâ\¥¦D&ê…úNUÎvc#à3kªv ä}¤Ô¡„KîME#@ MÐû66Ek&[Ѱì—ýð„iúÁƒˆ&²„.êYÿöß&yÔÆû#øpÀ?ìÙßÕ8à„ Ó9·®~ù O’— EúEÀ^ÑríÏÙaûô}Y ŒMÏ­U@f|èáîñ“æb XÖÀ_½ÅŠ-ÀØØøRlsìÈìk›'ûhÒåj­U,Í8.UX,Rer8ç8¶:K,éˆØÖík2wµ…Jø‡ø·KVªÛßp5ÀÀ· Þ ÔGÎúu¿X3¦w¶R»a L|6QG@O `Oúóô?~‹FÀÜL¡KJµ$‹×Í—i¶—ÎêÉöý(êw³ f|èvh{ö¬ ÆÆüÈùóâ–4צ¢ÐÖXS9`¾=·#Ç5>rìê{Ô·+µ #UÆîzoå{ÆÅl˜¦Ƥk¨ŸhwGàw<=à‰n€O“GÀeĺlM°E°ׇF@°¸¬m ¥§óti¯Ô›ï“^‚À÷‰“E; ÌIÀfY‰/å *¨’ØØ‡ûÂC_p´ïõÀ2«S Ä@ª¹¸ËÅ{.Ϩ…¥)5Ix–#Â?¤¿Ž€QõB•7bàÅ_ TeÝŠ§¦u&^›¾è?@p“R¿Ôe*2ÃÏVj‚¨ýBE#@Mu‡”ê©Lî-~¢œ=Ov/›­b# ¼W©CµšìˆhRúò?¯¹úܸ%͵©h|£ÔÙRç¾ùv¨KUº ÔÂÈ€]ãf*Ó,?F"zßÐnÀRòžùOëÔÀwý#ðfA¿Æž¨ Ö¯ï ˜¬­<9M,‹ë,O;#ýWôM¼Å"ò GŽ{¥¿“À¢¸ˆÙ] “ðp@G–H[«dJ!N&€Ì¾h²#`}_¡ÔØÛ_ oñZ”„¥þêíÀ9±Uo[ß 4K$üvDZ4j€úõë¶-ʪ‚ˆ»3ÀÒÑõUÂÞ—ü*á¹Öò™6ÌüMé+û‚V üØ:ޮϙïUJ}²©ÔžKÕ×ÎV1 fÍ:OÙSm’pmq†µtú3sIO¶¥g­Óü§~ÝwÇÀ<óÞ¹›fš?~)¬Ò˜º{ºµ­ñKš{SNì²ýàÎ&só#w ìùdêAk ÙzÀîq9‘ 6ˆFï4kοpÚ5û»ο_÷{\Ð!¯æ¾ûº€X÷<' $nÅ‹ýÀ•D°¥aIxN@*ÅR„"Y GLÛW¬¬ˆ‹€ú§©º•â:1Ж¢söçìL¥›“GÀf`§Øöô9ÑäPmŸRpæ$ŽÚ÷*œü) ¤ÏÆf`}«ý¨-vÞ™ð»Ñxb žìß¹—kïè8HªvŠŠZ„)û#åø&€è÷+²o•öm$.}¢´‘4\[<Y:äL¶7/)í‹~€gÊÑ{@þ,åø¬.~Isoʉ€@ô=κ­ßÐÔÈ–}ѻDž:+ŒÚ@D#L ²©Ì³X^yÍ;2oäys·àGÏõRÔcOÂhË)à/b»2.E$­¸³]bv՝Л½:ʱ#nÇ@CuäÒÁÜÈCoWâ°Hÿ§ïZã" ­ÁâÈyŸŠëAÛ6x£RïXŒ€'yŒNéäØ;R/õG€cbòau¥½¢ë°RLÅÅi‘î8–0æDîxpðáo7š.¼wÍüµˆSkî ¸ëÅ€îT–žƒÏ …ö*ÓG¹XêîœU½V pêoVÔÌPj¢þÁ’ ó¬= ‚ˆ±@©é‘Ý =]î-–L±7“›ù˜}w®ýÛæf} ÁÙª×KîYeš·PWLý”YÖÒ¡‰î%‡{SÓg{”9Ü)eNÕLÌ?¤L_ߊ°k\0ãá,F-"_ Ô^\qn[hÿ£¢>‘•‘ó÷jà=§g¯õq÷ôω‹,o·æÒÊÈÉãhŒLøé@Û=/PÛ²ÒÙqž’ ï_$V>ÑÆ{‘mÏÂázdã”$€öÀq{µ:ÂUÎãCÎ>%ÈÎÙãÎÖŸÓ=~œ8çtÂÉ„´ØÉÒø‡ø·; Œ€àu³Bè'd6Àõ ^¤äzîÄ[¥±Û*ìj‹]Î.u–¾®2hv®üB?æÚ¢·«+äEŒì¶®r$P~·+@T}¡ÏŸhi›òû õÃ:€ì¢‚ØõÜãÒ§ÎÇŸ# ýµ•°E[7ë»Þ5¬œ|fuÐ>Œ?ÀêÖqfçŠûÒO·¥KÄR 5>мxóqÐŽž€áèçÿ’Ì3˶g@7BÿŸ äV\Ù\©ˆq ^Ot&ÎDîô—3@Hªh\ºm}tHE иnóÊਵ,­Šœ:AíUg~.XzùòÒl`M qoêÎ"þ!þí|£ã¶ÁÑOýïÜ»†¨k÷ÞÑ{†_4ÞD:aR¿dƒˆ¸'`èžw'õ\Y½ÿý.8VŠé¸š¯BLVõÿî€Ã¦ÅEÀâ l•ãc¾™`µh†Ã¿B\ ©Á˜{ûk®ý癀ßþí6E€,…Ö˜«#@Öø¡Ú§‡Œ|Z÷bëƒæ]Nkƒ°5ï‚h»Ný†GG ôú;¦ëwo–ƒå7ïê¥R # þÎ7ó”Ú€Q‡ˆu@»¼ªŽŸ»“ø¹C oÙ¯'2ñ¬,àÝ¿Hlkòë4œ¬[ú’ìØ8S©{vÀ”;VûJ€Š¾5ö×(kÜ(Q)@†húë;¥¿±@¦h©ÀŽÈ}ùÊô›Ù®7DÏOØèÄXQ 6gßQôškvÁ”½:²ý‘¸X=_¿z}¥õ$óý»ä£ÐÁ±€ýÝ„¨Úßnóhù*a-pó87FÀD¥/ "î xžv'ôô‘$S]œ&¶pJÅå}N¯ðHÌbgq{ÌYû™®0·TûŒâ $FøòšqÉ ¨bÛŠÖsââCÃb(¥bLXbyþR1.,óT¤wÈ@ÒöŒ½ú ;³I:GQÁ¦wb4ñ;ª=뼉¦Ïš•7ˆèééý"£½†KµŸžðð'N{9Ø"¯j+%£DudTEà¿êº{ã†yBÝ5?†ŽêBõ^÷¼²'?v»üøD†UÕGÀ¹e™øÂòªÂ>dÈ(±¥ŸŠ "¢‘wÇ@­ý­âoðÃ[2¼*‘/GÀþ3òêZá]&£Bq6rd81ˆˆx8ÀíуîÉ0+.+[%ýì-+ËŠ‹€@[ª ‡ÃedTX\V°0¬ˆˆxŸ·éüîþƒï>üþÁýï:¥]^¿ñ)û„@DÄÃDŒ""î b1F7b1:Ä "â}ˆDDŒ"FÑè? DŒ""žHÄ "âá"F#€ˆ@DÄ;1ˆˆ¸'€ˆ@DÄ Fñêb÷#€ˆˆÄ ""F1ˆˆˆ@Œ""âw#€ˆˆx³ bÑk:Ð!DŒ""ž@Ä "b1ˆˆxÇ@"F÷ŒÄ "âÕíBô jADDÜ@Œ""â%‚Ä ""î FñŽÄ "" Fñ>Ä "" FqO1ˆˆˆ@Œ""ú" ƒ@Œ""Þ'€ˆ@DÄ bþÃBÄ "â‰DŒ"" b1ˆDD¼c #€ˆˆ{ˆDDŒb¼N¥…×[¾ºpá«–ë…¥ø³ "âÕÄÈždĘ”?""î F€Úy£ŸóÓüõˆˆÄ¨ßm¸ì®ýÑÐùÝýß?|øýƒûßuÊð#F@è‚‘À…~GUM]ÑDDŒ€„Ú=è¶<~lÿxðH†1JÞ3z¯)¨©©Ãý¦T°ï‡¿;à­w÷óø‡·„»û^žƒx×HâÝð‰R·ñBU…eH䥂ÑQ%……z‘ˆˆ7 zòc·ËO„º`“¼¬ÛFR·_9ª”šýð™R @Dô{¸nDø~ÿÃòê~zØÀß„yßx‰ È>o$u>ûU# @D#Ä4ãây­ë8'àÑÓ>’áV*[)/!íȶ=a‰õù™Ö+2kÊÊÖJ¬±ee[e(>- µË+9Zv ñßððNz‰ ˜d `Òh‰"¢IÆÄ7éÄÀŽŸ»“ø¹C†Ù`… Úæ¢€`þ2qt(ƒ©rý>y¡ÉÀ‰µX%C±èWÑ d%àˆ€á¯€Òó†ËÅwÊ[ ÛùÒE€7¯&¥Í6=»GyóôÓwngÕÌWª§¦¦&SÉþ;›fä…’G@sÍY¥>«©ñÁÒõlÃéé-u0Ý­©¹[^MM6†€ˆhñ>ú+éº[X:Rïø¼;©ç’@Ø×p@agCÃ2‰“ Œ•AjÏñB nÛeÇ>Æpz˜#àª2º"`p+AܮڭE@¹R³›{”eJ ,wôÒ¥`ºrTȽ¤l É" Gi¨ûBéÍ´X¨Ô¼B˜r•ê)½wžSíÄ‹Öñ&G䞀G»“zøHÜÂÀ)„UÀF‰ó%Ê]-+æš·'0NLÙ@Ûö=+*†ððG@tÔˬу¯€ 7 mÁ "@õ*m!L›TĂذÿ­Íô¾8ß(GÏm d¶Rÿç²g)µ CAD4øìºÞT-0ß0Îï6;௿ÇÕíòŠtàÁðFÀ¾ ŽÊ`å#xÄ~'ubÚ œªÓ•6`í›>4´Ö|ÌHØ÷.ÚŒÁD€:ôìVËA¥z|@é<¥¾i µRê` äÖD¥æÝºUÔ^Rêì³¢ü)J)_’hºensÓ­[eÀi¥Ô ¦møV©_Ú€Û=VS`¡¹Ñ: Ñyc’ug´‹_•ÂrÓ0Züð/0Œú¸'Àó¸Ûåñó'œy\ à)ò=žj±UW´fÇüörkz‡XÒ<+3OXb¤ëb¶ä1W=·fcŠî'­ï7aI‹mÐ(¦O£SÿÖ$óù‡{ZSǹçØs©sRÚu¼Ô¨÷íi­H‹€öqçŒ »‡U¼æˆë/vÈÓUOud˜ž´èǧÎIos#`ðp1ièÅÁDÀÙå½Jå5J} Sè`ï¥ò˜¯÷ö¬‡iªRÏ^xb`Sd¿B•ÙSõþ…ßêó•ê)À¦‹3.Æü Lw # nÚ´k#ðÁû àï"ºµûg-´€˜ŠOx—§‹-¥¦@éNiƒ–#1r€=±H=r ¦/+Däs H´%ÀIY·î²ØÆ:9pHÛvk».'KajÛÖ?.`ŽŽ€—õâzþÕžhl.€©r§{øÚÎB˜θŽltÞÕ9±@³3ÀË5zlorè hÂÀ¼†£¥ü‹®0 "¬úÀý  Q©Ùe]pG©^3”úH?^£TO P÷‘R3Ú¯0$DDÖáüNr.|ê2Œ¯*GìÕ¿&lù‡³ðk²ðŠÈÕSЊŔZ­2=Iì@yGläøa+û\Dš=-w„½Oúl–Ši)°ZlGV‰—Ö ÇöØ_›7GGÀ G½Zs£­h[ _‡á8.±šŸ‹­ ûõWfìøóDÀ5{îw5À`" §–éJMª”R³&Ü &Š€@}WÁí/”ZøÂø&zì¿®G)kPw{”éCCD4qbLÞwÝ0v[‡<'Þ ŽÈ;>MØì,=•8ž¬T  +k™Hû hë‘»€fkÒÎÖ-žÜœ¹œ•ìÌʺ"}¥ȕØ÷Y\3Ÿ¿7R ©ö¢¶Ñ0^Li…ÀqsÅêOc'œ ´å¤nûÔÿœ¾ŸšrR·t vÔ­2¶¥fV:*jXfÎñxÏ$¾,ª&ïÙY‡@ŠÄðÃ'I"hÞydç) rüŸæpÀ ÷Ü 0˜Ã³a{fG*˼©¹uý#À»`æ/Ê6ˆøÚú©T*¦ÝÖV}xEDDw £¦Ò‰ç Óù{#ñŽ“6€^àÄÀ-@›Çz`—ýá8Å9t_]T '<Å.Ë^/62ì®ðÙÓ¿'ˆ¢Èl™*¶=+Wh|cÄV|ð·5€ŸK¼uz*µÿ‘½OG€^ w¶ŠUƒuG¹Ó$c²u„ {, ;ì¾| ,ÓÞìÚ±ÕN_†NÉøÓœhÏÿåºbÌxéðÎ?¨l³Úb# ö¥ *Î:3¿~™F˜BÊÜT¯ˆˆ¨Ð0*a 6½?Ã0.Þy÷ èèv ¤ë£¾v±m‡eùqŒ+€-¿X\öG¢góoŽFÀHQ„«?êt`‡Åf©À±­Æ&~#°GÜÒ%É" |¼X®d£éÏr‰ ®W ^:ï­s­÷¿•ÄDÀ|kgþ†5·7 &æ*5Ú,¥šõ …¦é "¢÷Þ«ƒåžqÑïuØ6òD#à‘=÷»`€pB´6øD®YíD@#JÂý"`‰h éýé9"r¤ï,þÖ¦¦ü™úi9'êÔíkÍíŽÉ"a/ÊEÛ¬ŒF@²ûƳjð£^½áªßŽ€½#@ÿj»køö 'övJ<ývG@£h;àýðÏr³ ×9Ú­—Ž-4A)•‰=­Oeà #@ÿü¶z¥T€ÊÒÓ"¢¡1ŒÛιóaºý·I^µ†ñþ¼c`dÂÿ‡=û»`€ÃçœÐt:gÒÕ/_áIá´H¿Ø+Z.0^$|Eúƒöé“¶½ Ètö ø×]IYåE`Žþ”¯ùìÑ|)Ú2à@$Òz°zî^5øQgö¾ÍŽ€“Ñ'X`øç|ÇVgI?g€uÉ"à¸h«#¢Û_¼};®Η¾l´5Ö”Áò‘ýa¾0rÞà/ÎúÀÙDÀè)ÿ—.X̘¸ªz•ª™©ÔY?ˆˆ†d·q1¯$Pö•a¼Ó4Øt õ ã§±ç<Ñ ãiò¸ŒX—EdK,Áõá„P,îkD[¢ï©·H—öJ½ù>é%\ g#pDl›¶¸¸Üw\ý Љ€±}W«?êÃ})¢¯8ŠG ÿ\F-,M©ƒ€}Šmü¡—‹€o”:[  ò’Rù@™RªÅY{€à5P|àLó×z•ú¨Dß'Xm_+5¡^½"¢!¨´oýÏcÉ{æ?­Aïú‡=:^9~=#P7@¬_Þ0Y[;yršX*7ÖXž0vGú/®è›f‹Eä/@ŽöJ'Eö¡÷âðÙOÿ¶#Åžù›ûvÀgD"`_ úð6`ÕàG Ì­)²' 3úÄ ÷ð-ÕÛÖ7(Íøp@}ôÁ¾ŠXƯ~¹Ø¥”úöƒ;›~ѧñy{ÍåO6•b†ùóàéϾUD€>sàÒ”< ¯G©ys§´ž]d(Õî ýnADD×¾:oï<Íë,Úßpþýº‘xŸ€ûîëbÝ𜀸/öWEÀr”†%á9U¨KŠd5‚1m_y\¯9¿M¯oËRãF@‰h+bÏ (@‰ÓI™ÀªÁz3°Slû@‡ý‹½2àðµÍÀú$'þE,iˆD@‹h»H{#`†n€Aºm$u/)Ê1Ë~ö&e©Ä‰”vh õF¾@hr,|󔺣% ý¾ÁDDÊ®ÚØÅòÊk^#û¶ÁŸ?z®—¢{F@›XNEf5¹2.E$­¸³],€Éz:]+1:ʱ#nm¨Ž\:˜yèíJéÿô@«ÈFÀ'ÚÕ`Œô÷eä£{{ ЀŒÈÃû €UƒõàT8z‰B‡ýòG*7®:Áð‹‹Ó"³þ1÷%‚öÎèLˆF@IŠXÆÕ¢MÞĸ>#Ï‹A ¼k$ñn˜«Ô- ¤G„-×¹Ÿ_ãÙe–Á”2XêîœU½ª(™ò›µ“ 7Oßh¶êõ÷ýˆ*øxÞ¼žaštH™æ- é{ Ø¿67= DD¯ÕÈkÿ¡ö:àŠó‰»ÐþGE|öýL±ÔÀ{N_¸>îú9q€åíÖìY9Y`|@kd.mÓýöj;E<%Àʰ˜Ò…aéooäÎ}9@ÙUzõöÃV ~Ôí'€ãö°ku„#£ì8lsßãljsÎþÿ“#è´K*Ðb>?ÈßgEÅ1ûÅÇ3*DäÜéVjí\~fäFÀèc ½W‚¡ñû ËÑ'»´oWWÈ‹ –d`+¿ÛUÑÈ1ø_ûW KP´u³¾÷^ÃÊÉgVí=åc¬n·±hvv¨—~º-]"–©ñ€æÅ›û€æpôè:N„£ŸÿK2Ï,ÛžgöÝj­¿u΢Å@`›«M2€ªÕkW,÷¢4+æŽ-öÃ;w@GÀ Gê—n[_sÇ@,_ºfoÐN0üÃ@ÁÒË——fk$Æ)x="v% ÷Lê ú"9grŠ_§ÈjÀ×a¿Ëì4‘µ@àÜ(‹„. \ˆˆ^ûáíywRÏ%‘uÑïØÇJ1÷BóUˆéêþßpÁ´¸X„-z×ܵV‹öáa8ü+Ķ­Žò9⮘ûÝlþu:=ê¥ÐsçVÚ‰ôDÃëƒæ]–‹#ñ³Í ÛÑèÕ9'`+¹¬ïqT—fŸ:àM±Ÿ…¬Ñ¨ßm¸ì®Ç…ˆˆÐñsw?wH"á-ûuˆge9ïþEb[“_ ádµØÒ—dÇFÀ œ’¸Hݳ¦Ü±âØWTô­±¿@YãFqì9ZÀë;" T¯¬‡©¹U,­Àv±Œ;°­Ð‡#^bÔ+ªÔæì;Š@‡X‚)ûxqâáW¯¯´ž ·Ûg,)¶-Ç@ðø‡!œr˜bíÔ1¥†‚ÖË^n¬‘+X.£.àŸvÞèçü4?ˆˆè¸c öèiwBOI2ÕÅib §T\Þ'Qáô Ä,v·Çœ%ŸéŠsK±Ï(¢@b„/¯'ý§¦V‹[t4{:Å¥zÏžØQ zÔ)c«sOÅ•†/žŠtw8ùÐ Ž+ÒÃÒOÚžŠbÑÂiúU«QË(Œ {’cR6þ DDÜ ýô0á ?ÉpÚ ÌqG@œõÀéÜÃØV KF¬Z¼n¥…×[¾ºpá«–ë…¥øƒ1äÉÝ.?>‘a•@õÀ³è¹e™øÂ£.Â>d0ˆˆhÄ] µ¿õCü ~xK†W%ò_0‹îà?#£.¤ÞeŒ""{´Gºc4b1ˆDDŒ"F¿;€ˆ@DÄ›JÄ "âá€!bñœ"F#€ˆ@DÄ;1ˆˆ¸'€ˆ@D4j®h"F÷1ˆˆx‰ #€ˆˆ{ˆDDŠ;1ˆˆx8€ˆ@DÄû1ˆˆx8€ˆ@DÄ=D¥ ""F1ˆˆè Š€F1ˆˆxŸ"F#`ô#F#€ˆˆ'1ˆˆx8€ˆ@DÄ bñŽDŒ""î b1ˆ@DD¼:€DDÄ=Ä ""F1ˆˆˆ@Œ""b#€ˆˆøÝÄ ""Þ,ˆDDôšt#€ˆˆç1ˆˆDŒ""Þ1ˆ@DÄ=DŒ"¢Qsu@»1ˆˆ¸'€ˆ@DÄK‰DDÜ@4’"àŸÿú÷þû¿ÿý÷?ÿþ×?ADD–;#àŸÿù1þóçÈ"" F€_'@ŒÿøADD£ý>ÄðþóÿÏåÿˆˆ‡:¿»ÿàû‡¿pÿ»N~Äø—nVÑÈÚÐþèA·åñcûǃG2̈ ÷¸ýïŸHAÖœß#à­w÷óø‡·d`ĸû^žƒæýïÿKâ¿nåqðt^FIaaƒCDìš6ñFeŽú[“ÞoÊÒSÅß?:†'žüØíòã1.Æ$/Éûïÿ—Ô¿¶¯Kð>Sj…ˆ¨ò‚a™_ K`¢a¹xïeŸêZù÷ øéaw’#à}ã%*àŸÿoÿ8>ËÈȘ¾ð[¥Ô'¿KUž7.þuânÃØà5`ÆÄ¿^4Œ[/ùT×∀GO»zúH†[u¨l¥¼„´#Ûö„¥Oû‘½‹·èG†Ï§e¡vÐѲâÖRvL†ŸÞî›ÞI/Qÿ‰îüÿoô_ÑÇþ3p܆¥n¡R*ô{DÑã|%xß0š”ÆD?PÁØýROu-þÞ‡ä•uüÜÄÏ2ÌÖ+dÐ6ó—‰#ÕˉE2œ–¿ÑV KÜŽ¡R†ŸÞî€!TÀ?£3?ðïèA€hüs€à·JMÚjjêôËïªÙoýÈ«ÉGió†MÏî!FsÍY¥>«©ñÁÒõlÃéé-öóîÖÔÜ‚-¯¦&DD€÷‚1Íþùž1 @¾q!ÓuèüÙu(ëòåMå?Õµh+éº[X:RO |ÞÔsI ìk8 ƒ°³¡a™ÄÉÆÊ µçx¡·‰mc-K^g\õ!c&ký—0„ øwLè…øï@g¸"+õ0U©|Xj•º \©ÙÍ=Ê2¥Q=Jû@ÝÊv©ÀB¥æ”«TOˆˆ€Ú nÂ2ßø+€÷/ü –.ènï.0Œ ×Ìÿ»x}৺Ú‰ 󉓂#òpÀ£‡ÝI=|$naà” Â*`£Äùeƒ®–€?sÍÛ“'¦ÔR fí•Ôã`íkŒ€Å@ÖðDpj”EÀà+à¿ýÎüwô‡ã¿ƒŠ€Ï”:0T¯Ò&Œ€À7ÊÑs(™­ÔÿyìYJmB "¢àã}ô™fuÀuÃ6Ã0]ðüT×b`¾aœßmvÀ_Gd<èÀƒá€}A•ÁÊGðˆ˜ÚOëÄT ‹i»¾«¯/|hhg¼jè{ôU€n€¨ÿ &Jg+u'q¨CÏnµTªÇ‡ˆ¦[æ37ݺUœVJ}±`Ú†o•ú¥ ¸Ý£Ô{ÀÁ:Ä "Ê3Œ.D•^0Þ…ÓJÆßJÌ_×üT×âMÃhñÿ@?s¤Ý1Ðó¸Ûåñó'œy$NØS ä{<Õb«®hÍ*ŽùíåÖô±¤yVg<ž°ÄHÖÅlÉc®znÍÆýV<ž´¾ß„%8,¶e@£ˆ\Êœ­-vJîi­ˆ}Á”ÔÖŠjѪ­Í‡—ÍIiïksõ´Øè³¨ÂU—Lg WcF®'kë/«q¯àzÉè_νæ›ƒ­×º¢ÙSô$Ÿ(ΖXÿèU*7Á‰M‘]U—”š `“R¿Õç›[+@ "¢®‹ÆßøÊ¸²#à¢MÖ¤žmU?Õµx×0Bê¦M»6÷ÜOÐyÔ­Ý—8k¡ÄT|2À»<]l)öùZ¥:E¤ ZŽÄÈöHÄN õÈ1˜¾¬‘Ï"‰Îñg$eݺËb«sà p@´É ?Rw®¯µÏ#œ=¯ÖrƱdc—'×Z¡j‘h‹ëøW{"P|Àúµ¿(Õu4`£ýkàdô@Å=Y‡w–®Os¯àzÉè_νæºš00¯ë¾º¢¼EÀÜÓ§O/œû›uЉ#@gÂB¥f$ˆ€J}„¥F©ž î#¥fì·2‘}5À{ÙˆšdÓ`GÀ| Ü0‚Ày£p৺» ã«Ê{‰à¯ @þá,üš,¼"rõ´†b1¥ÖC«LO;PÞ9~ØÊ>‘f@ÇDGÙû¤ÏV`©ˆìíÛØ .,qö‚ت íXµ˜J°´3Îä®57ê¨8-¸Vb5gŽÿTlK£°Úáv× ®—Œù˹Ö8QS³G@O ,ӕ𠾉û¯ëQꀻ=ÊtÈ"¢>%3Œó!D½c½:Þµ#À\0 ~ªk1°Û°î9p78"¯xš°þþØYz*q³ ÐÐìØ²çÈz $,1üðI’²—´¶.Ér\+¸^2ú—{Ùàဨ‰¯€íYâøÚú©T*¦ÝJ©y>õ î6.6!êža¼ëÇà" .úT÷bÝÄó†éü½‘¸'àqÒЋœÞ¶hóXì¶Š¤bª.ª …ž˜e¯vWøìIÔDQäh@ªØö¬\y ðq>þ—wŠí€ËÒßRàÄ91mµc!\,S§Oÿ£h´†n°It”;Í1&[GÀç%µÍibZTÄVp8i¬Ÿ²È ï× ®—Œþå^6xbà¶¶¶J©‰C‹€³zæw6ÖSH™O €ˆ(Êÿ•a\ïwPw)^®§ºlz†a\¼9ò" £ÛñàÉóÇ®0 »€·õœ°æÉeÀò¯X Tô‹€¦4=×ë|8 ¤ë£¾v±m‡eù±ò=bÊ„éˆô×y¹ŽÍ»Â2hil½@ÏÈã"£Ø,’ìп߬# jQìÙ‹öŠK’F@¦ØVÛ\+¸^òÕ"€—þŸR³KûE@ù #`®Ró¡ÍRªYoÃ4‘¾Sð´Ø{ëƒúG€û©®EÍ{]?6R#à‘=÷»`€pB´6øD®YíD@#JÂý"`‰h éÙ7GDŽ«Dkmj:ÀŸi?mlаz[Η@6°Ç\s»c²HØ‹ìöþ ²N´J Z¤eѳ–Ьþþª¿_´ÏK”N²¨ˆ®sܵ‚ë%“G@ÚöˆÞ,(iÜSΙ|3•šKÁ`"@ÿü¶z¥T€ÊÒÓ"¢¾oCiéwbß…z¼8\Ou-ÞþÛ$/€ZÃxø‡=û»`€ÃçœÐt:gÚÕ/_áIá´H¿Ø+Z.0^$|Â>°#}Ò¶WE>q_®‡–‘aŸpŸ=šSãdß«7Ú{Jð¥ØæØ3rfßïÛœ8·÷À±†òúGÀ`]²¤EÔ¸Vp½dòHGĶÑÛàÿ ù¶Áß(Õ[ûªÿ °lxqL€žòé‚e‚ùŒPÕ«TÙgý "Šœ8£ËV¨Oì3¦éÅì#ÀõT×â4Øt õ ãîü±ç<Ñ ãiò¸ŒX—EdK,Áõá„P,îkD[dé½êéÒ^©7ß'½+ºŽ€@ÛZ9¤õ€ËÀ‰q´/%ÖËDJ°+vF>Ü÷{çê€ÉÙÐ'ÄQ_ÂØ5z#`è_ ôŸ¡~PaR õœ~é&€Ûó^8Óüµ^¥>*Ñ÷ V›€À×JÍD¨7DDuFŸð¾5m p=Õµˆ’÷¬³ }–ሻYЯ±gêˆõëÀ{&kk'ONKÅâÆ:ËFÀNàHÿÅ}Óp±ˆüÈ‘#À^éï$°H´´±Öí}Úkí3öÇ¿íH¹äKŒõ}‰QŒqÍÈ™}ã›ì8`Ǫ-›S—þp€·Z"¿j|•¿‘–(øU·a;­÷à7)¥~Y8aªR/ˆ€ùÖ Sò€¼¥æÍzÐ\þ¤ÈPª7܉Ü-ˆˆ¨î¢qÑ÷¬¸f\ XpsÀ§ºk­Gο_÷{\Ð!¯æ¾ûº€X÷<' $nÅ‹ýÀ•D°¥aIxN@•3í¡HV#èÓö•Ç#kçè\èÓ œŒ•¿ÿÖW;E;T»fäÍÑßï v|ô_œäÄÀ£b;‰d‰-Èt¯4Ük¾¡'Îp5À Î pû7õ½JÍ0]i_¡ÞÈ-PŽƒå€ož}÷aξŽûÊ+¯yGæÍ‚Ð\Ó!©À—zí#À1÷Œ<p¶¶vì®Dö!,Nt‰`{ ŠÄöe4VGg¬u¯(ÚÜ›zƒ#àúŒ×/ªÕ£‰ °èsý£€ÍÎ× ®—ŒþåÜkº# øxF…ˆ|˜s8ÕʇËÏŒ°‚ê{¸üïŸxiÙ]¾: B°$;[ùݮ F"b´¿ö¯– hëf}ÇÀ†•“ϬÚ‡ñÇXÝ:nc#Ðì\_úé¶ôØ»ù¤ÆGšo>îšÃÑ“p"ýh_’yfÙö 8³r€ÃsÆ¥fÞVqYœX2yÅÑPa­]4®Û¼²8Ú‘`FNõK·­/ƒŽ€íÀ‰ãk6/ .NÁë‰Ü {gê™õÞ˜(=°}ûR`k÷KFÿrî5ݰðuˆl²Ótfœ{ã#ÿú_ÂøþDDÜ Ï»“z.‰¬‹~wÀ.8VŠé¸š¯BLVõÿî€Ã¦ÅEÀâ l•ãc¾™`µh†Ã¿Âya?KÅ-œ ͯ»ÆíÔ>I4#/…Ö˜kG@õ—°ŽÇEÀâH¼|˜[ðÓèwdBûÔ½‚û%£9÷šîXÔ¥Ù¼)öõæG€®6Ñp]Ð.¯ªãçî$~îDÂ[öë©L<+Ëx÷/Ûšü: '«Å–¹©¾v§$.R÷ì€)w¬8ö•}kì¯PÖ¸QG|°µJ"i™õJv¥Š¶Æn”ìÕb‰ž‘°ÐQ±¢ @mξ£tXIcï(˜Sc£7,>j­Q”ºW_yÂöí!Ù™WÝ+¸^2ú—s­KoW$5´þt—ëEäJ–Ë(ˆxÿŸÿñãCDÄ=òèiwBOI2ÕÅib §T\Þ'Qáô Ä,v·ÇœeŸéŠsK±Ï(¢@b„/¯'±Æ/Zº¶¢]\¢£ûKÏ_*Æ…Èsõ~¿N©/n>4HDzE±ôwnYzì6Ü+¸ÿrƒZ3¬×ë¨vž'£"€öË€ÿüDDô]"¨ýô0á ?ÉpÚ ÌqG€û¸þi¶Y2j•âuûç¿þýŸÿþïÿýÏ¿ÿõG&÷hO~ìvùñ‰ « ªŽ€sË2ð…e¤ ûÁNÞèO""ú卑¿õCü ~xK†W%òeàØÀFFžVx—1F!""Ð=èŽñà‘ ³â²²UÒÏÞ²²¬¸´¥ÊHt¸ì#€ˆˆFß}ÒùÝýß?|øýƒûßuJ»¼~ãSöÉ #€ˆˆ‡ˆDDÜ@Ä "bŒnÄ "bt0ˆ@DÄû1ˆˆ£1ˆˆx8@ˆDD<1ˆ@DÄÃDŒ""F#€ˆˆw $bqO#€ˆˆ@Œ""ÅW1ˆˆ¸'€ˆ@DÄ ª1ˆ@DDŒb¿;€DDÄ›#€ˆˆFÒá€!bñœ"F#€ˆ@DÄ;1ˆˆ¸'€ˆ@D4j®h"F÷1ˆˆx‰ #€ˆˆ{ˆDD¼c #€ˆˆ‡ˆDD¼O1ˆˆˆ‡ˆ@DDÜ@Œ""b#€ˆˆFZt0ˆ@DÄû1ˆˆ£1ˆˆx8@ˆDD<1ˆ@DÄÃDŒ""F#€ˆˆw $bqO#€ˆˆ@Œ€×É-Ôu÷Æ»]¡k~ÑŸåêb›Þ‰ÑÄŸ÷# pó87õˆˆÄ(½þŽéúÝ›åÁ`ùÍ»z©4""F@çw÷|ÿðá÷î×)õ7ÌIÿÞ5D]»g>p£¯®ª© /#ÔäÃðsoˆèMˆ€öGº-Û?<’aFŒ€àusÆ¡ŸÙ׃HAMM" kjÊÀoJñÎ*U…—T7ñôÌOf~PS7ô­Äïxë‡ÇÝý<þá-NÄðÞÕŸúÝ{îy1€CJå#â¥î _^-J _øôù—”6û#` Däïš6ñBïs³ '?v»üøD†1¬s¯ÁåšuvàŸ)µò¬¢æ-`Qruó Ë‚Àk8Ð!¯î§‡Ý <üI^EûåŠ=Œ€—¼ì]qp#8â#`ƒRªwB~Ó¤Ó=Ê=FEùwÆŒïÆ_ߌs=íNèé#Š–²c".Àþ— ”œ²²ñQ]–¡ø´,Ô.¯Çö`ÝfFÀàu¹vû{ ¯‡¬æÙ]#=|=J}«Ÿ‘?[©_êD”Ä]ؾ2ŒÊ7!:~îNâç‚c¨‘9²äe4ã„DŒ2d(–òz4-Œ€Aó߈?à5³àºs@à†ÿ¥"À›W“ÞîÓÓwâ" X3}Ó„g>D”쿳iF^oóôÓ3jêúOÓÍ5æâg55úY]Ï6œžÞR‡~>Vj^ä ·”RÏh]÷Ö}Ï&lʸŽÍôÓ»§Õp=¿ zÊc]MM3ˆèõ®1à  î¼1 ZI×ÝÂÒ‘zÇÀçÝI=zxjQž&/!ÍÃÃ;–Éï$XÌ´¹#ÀÕÎsW@è¥" \©Ù·*ËÁÂ~7KÙ¦––{IÙô(Î*Ë·§úE@Ò>P÷…²]jAŒ€¹™ ˆ˜ªÔ¸×uo=ø²ª‡mš3º)up=nôZÌG¼ ¢7•aäÁ4Œó°ÔN¼hÆÅIÁ¹'àÑÃî¤>rÈ•µÅò26K‡=VåwÒ¾1UƒfÞ-¸ÒÝ^X*Íû¿l¨KJû¨6&nÍSŽ©~˜¦«ˆ™v˜RZ¯Jo”£ç6ú\WJ ¢þÖ-Ü뺶ÔÙ±Ó«‡Ê]Ï_` læÃ§ADopT¸¶Û0Œ:ùf ì6;௿ÇÕíòŠtàÁ#`V—G~ #À¼G@m’@­>.ðr ~;]3Ñše¿ðF#Àg–Áì yöÃ[6—Ï>+Ê·–}úпš¹ oÓ%Õ/šn}¢Ô¦[·Ê€ÓÖLÛð­R¿´!*W©žRôçZ×µõ Ö‡þÜšM=æ/PhþbÖ„¼gS•R\Ï/1û¥ ¦Ò^DôÆFÀ5àæÃTà¦a´øá_`õ#pO€çq·ËãçO8ÿòHB)©­Õ¢U{ÒDÂËæ¤´÷‹€­‡%ìñtˆŒ_Tñ¡DUW´fK¼]¨o(>ÜÓš:NúTgÍ9'}öíi­H‹‹€4ÏJàŒÇŽô>窳Š=>q ÎõÎì'µGñ¡~k‘•ªçÌ Ç½†û½ëåôEzsÅ©«Ý/;z#ÀœóIsá¥# çLôGt'¾QêL›”R÷€ë½½ëøÏ€B§ p«G%>1°É:rSÕ%¥¦"*CLr¯ëÚº~`LÏ”R]€™"óÚœz˜t=ŠN´(õˆèMŽ€ îž7.Ü6Œ.}ž`@Ý´i×Fà%‚÷4ÀßEuk÷%ÍE03®ˆ%»<¹µªÅF@މÈN u[ï§±Ÿ Z‹ËÓ¥Ÿ«uX.É# ód)LmÛ"CðÁtâäUÑ×ð¯öô‹€6h9ñƒ^ ä‡Åt®u)bq ÎõÎN‹œšòE¶­z¥”ýàJÿ×p½w½¼´ À±Ë’²@ (Ýý²£4¼zžw5€6”Ø‹ßüí‚HÔõ*•}xúÜQê{z=XËü$0C©‚°Ô(ÕS{àLÄr¯ëÞút¥> À2S©F{t `)úõ×Ù®ççéаb`:ˆèMŽ€@žą¯7Œ&]†ñU刽:àׄ ÿp~·ÍhǪÅT‚ý; ‰‰€ÊH÷;k‡íÉþ´†b‰uØ™<ÒšáØ.–“pìòè€Öܘ8âÎw^í(°N4÷àâÞÙàS±í´Ÿ½˜l¯”_Ó•¸×p½wky¥^£ìr%l•ãÜ/;ê#ÀÝCŠ€‚èT|ZG€þlµ§Â¨ï*¸ý…R í7ÁV˜$¾‰®QףԽؘ‹XîuÝ[ŸbŽ¡Éfþk‚=ºòž˜¥T“}4 '"z“#à]ó¥Öq€›ÖÉ3&Þ ŽÈ;>MØì,=—Ô ÛRs €a{vlß39h'ˆ”ä¤få½Ö€E[¬Ø4ï“‹Š¤ÎÚrR·}ꇎˆdu9s.oó[ÅÔ°‡”YÄFÀå¬ `gVÖ× ß®CmŠÈds©]4÷àâÞYG%ÊÃbÙÀø˜Ú27o»Úÿ5\ï]/‡v.ÛÞøqj[Å–2 Óõ²£ùp€»†~8 §.z*ý'‘¸­ÔlhJà]0ó¥-¦FïèM_G×ÀA¥òñL©Yˆå^×½õ¯UŒÿÓ£àù˜`ïÞhѽADo,Ã4)ø £¦Ò‰ç Óù{#ñŽ“6€^”xá2çÒ¸NŸþG ж~ÑìIÁbÚ ,{ælóX+ïÒówT ²ÃI#`P9ÞùGö>‘õµ%kÅ”D£ˆt”9öÓ²á>1Ð=h½¡F©®DvŠ8\ƒs½³LçxÀçÖsc# æC÷k¸Þ»½œ}YDÎÕÍi"² Øá~ÙQ|b »yb`3">ŽD@/´|¥¾D@ž5ók·í}ëµß¨¨…ö–ò ÍNgûÖøD©FØtj¨zÄr¯ëÚúYã¬ÝÏG›=æ)J傈Þì¸ Ó ÃðÃlz†a\¼9òîÐÑíxðäùcW˜$Þ E¿è @Ï‚ã"æ7»#À™ÍÃ¥öÊ»€·ÅRÀáØ´¨E£$€ýÀ±-ׯ‘rI~ ßœ8܃nßl[l—×à\ïl¬s<`'°¶_|.î×p½w{y‰XvØ0•¡Þõ²£üAw¸/tâÞˆƒö~å}sò¥¦F"àºR½ÞèG÷OôÁùCÔÜÞdGÀ¥æGwÀ'Œ€¹Ñ50+¶=º”R·QwâD©k]×Ö­fæi-y¸¥Ô¼"\Ï×YÐT׫~©½Á.ç#7 B”÷ºaLy‡¢ðÈžû] àŽ€U}‡Ñ+j‘”‰m-°Ôú1S›µZ8€YöIŸeÀâ¤ö¢¼ïÃúʘ_ƒ_¿°3¤«~w$´œËFvË%Ê58÷;Ë×ÇšQ¾/6| ÿ0®÷®ãÁrHË)”¸_v´ß,ÈÝ/¸YДèþq=ûïÒ?nöI© ‘¨RJÝŒ^¾÷=ÏN‰Ó_h7Áǰ¨ÄðYtz¥Tbãc&"¾°6ëZ×µõÏú_ïS_§h –]Ï×§/Ψ±GJDo°‰Æ…l¡‹zÖ¿ý·I^µ†ñþ¼c`dÂÿ‡=û»à±Ä; l­H)Á—b›“8œµ÷£^䀀N‰Ú d%€sÀ—}±pÀŠŸ5™»ÚB¥€™}CjsG@¢A›¶(+–(×àÜïl)0Gäs/ÖKlìJø‡q½wk95²¦~á](q¿ìh¿mð W¼à¶Áóõå€ïæ¿C:æ` ]Rª%Þo•ú–›æÃwìG›a œµ§ÖÛJõúìí|ᎀ Î~…_ºà\{x)ÐïR•ÛwB5»ÖumÝZav=,mÏž5#IÒÕ«~ËNðZõ=ê#3yòADo²*ÃØ]ï­|ϸ˜ Ó4Øt õ ã§±ç<‰i€d'ƈ¶X¦gÁ" 5f"¼ŒX—%*µá¤p¹oéŠ}<Þ³šŽ€Ã}CjtG@¢A[ õÃ58×;ëôãSû-e¹"Àý®÷ž8Ü/;Ú¿@¨òF\ øBzjTóò` ,Tzç¹2Mè›ôõTF"”þD_zÖ|Ê à½› 8EŸpmžR•ÞÝ*.̸8ëp­W¯\¥Ô&ô©m¾Ð³ï³^se÷ºî­—›+ªÐd>y·‰ù^=èC _k¦2}ë½ÑÞ7´°”¼gþÓ:5ð]ÿ°G@Ç+GÀ¯±gº Á%‚ë5¢Õc^.Θ¬­<9M"ÂÙØ!I#à Ð,Úû5@ýúuÛeUEö̭ɉmÚ À¿G¢\ƒs¿39Šò°4Ã'îp¿Æ #Àý²£ý«„½/ùU˜oOS&ÌýE9¶Ë•eÖÜ©óô×úF" øÖšSçš÷Ô@O»Oö­2-t¦ÛysçÎV–ª¸—¸4%Èë±Ö˜zPßê7JÿBÜ4ã³”Þ¸k]×Öízçnšiþø¥LUJÍþlj¯ùc½V‹2m½Ù¼Ó¬9ÿÂuh×ìï8ÿ~ÝH¼OÀ}÷u±î':'`§h'€ê—‹€p!I`“,ìg•ˆ¶X)Õ~ÔêY´ÈŽ€ÍÑ!í ¸# á %¥¾ŠÂåœ;&sÎy‘ãŽ÷k 6Ü/;*#@Oöï\ƒËµwt$ç=­¢~ÉƒŽ€KŸ(ícôEJÎ*M§Á‰”vHG&(íì·ý# ÔÙÔå8XŽ~òzUĬýÜ뺷þL9z¯ÃTzH96=Áßt>Ñ.PÙTæY,¯¼¦Gòmƒ?ô<º”ô¶Á©À—áȧòcòr §€¿ˆíʸ”~צ&ù2òQ¿½hµ^èdä³»_¯}Ji;\°6á ;v!P±È”(×àÜ.ÃÉuð¦¸#Àýƒ÷ËŽÖðÞ5?ò×"N­¹ƒà®ËsfüyS*áDÀì’ Ön€ß6a™­zý0•}ÐkOÃa+™bM«ßææ9;Ü»/™Ë=›²?‰»#OÁÇóæõØ=1éýJ Cˆãû¸GY.M©‡Íµ®{ë¹gõ NåÔŸ¶F×ûIûùÑó¿Ñ Èëþ¡pp\LãCÀΗ€@á1UÔÁ'QGÜ7@ìÊ>SPvUÒ1¥5êh?á érm\,Ö»­ÇµZª+X&÷àÜ «QŸâŽ÷k 2Ü/[|<£BD>Ì9l­Þ¹üÌ(‰¯›B?!³®ñBUy r'Þ®¢ºò ýîW©êº[(oWWÈ‹>þª.Ÿ K²ÎÖïv‘@yþÄܼ4÷ºî­ëBþ+ÜÏ'"ú‰¯÷«„+J€Æu›W6G;^6Ú +'ŸY­ï¢çh¯Ç—mÇ#<ÒžT­^»b¹¥Y"Ò4îMÝY’ê—n[_†¸Ø ”~º-Ý5è±u¨ª9´EãÃ=8wTÀ´=a¸^cpà~ÙÕ€Ï|úV ;Md-87:"@êçÞ5D]»÷ŽÞ;ðrt1ä•=ïNê¹$²ÆíÔ>yÙ«»àX)QcUq#]$\-0YLkƒ°5ï‚_,K¡5æö€«`ʉt8°7´X-÷àÜ @í‡îpÿaî—]Ô¥‰,}Üa1€¬Ñ(½þŽéúÝ›åÁ`ùÍ»z©T1:~îNâçIhÍ.˜²WwŠ¥;ĶX!"ù(S!òûì?…bñ¬,àÝ¿¨ÿ~ø5k¢ôÉüÕ+ëajn[ê±€ý¥¨s¶P 6gßQú :}I6?èuÀQ±œ+÷/¢¹çzg¦­}Ç)¶­±+ކû½G—×z(w¿lj(h ørC`½ˆ\)Àr5€ÀÍwâÜ €@DôGÜ1P{ô´;¡§$Ï_*Æ…eˆÂ)—÷I¬ð§ âY{:%*mÏØ«£#¥bL8áó:‹Û_bÐzpC–ü5ÿ²á4ýŽªÅV-£(€`Ó;1š‚ŠÚÙ³>¸'`ü”𴀇?ÉëÂ~¡Q~‰`”ÿZ¨ëîæ s×üøƒ1äÉÝ.?>‘×e p\hDEþ«´ö·~ˆ¿AÀoÉk³X$¯1ˆˆ¸'@{ô ;ƃGò/+«–?1ˆˆÒùÝýß?|øýƒûßuJ»üöîu ŽãèÎåßx¿õv¢ìR¦]°¬µØv[Áã¤L‚+Á¬ýÍ{w>|gœEð"@€ðí à8 ô Ü  à£#€3^ „h ,ˆ0X–€ª D@éAX@Ôp' ÑwLjàD€p€É€@ DÀ¤"µ.=ˆ€ˆ"` "@”˜€à0ëb ˆÇelrz|/ý_äf,"` €(MNÁÑ”PÀæ%/Ž9ÅG#E›W,cª£@Ä0ôQrª¹ˆ€_,MªM¥  ”:#@¸À%螊§4" Šnö·r¢&YDÑÍ~,(QPÏq@ˆwDÀÓDÀ·€÷´ˆ€i"`ˆ€ˆ,ˆ0i° ± Øû‹ " K"`½ºžŽ—Ëñt]­[Ú{10°üºýækÙðÀröq@N¼ °]œo8/¶-ðƒàc" ÛÝîì:¿s€I?Ù;£ ¦®µï«Û:ÒªLgžÌ7G¡¼8Ô™^Ißa°‚âýbmjU‹¼2ªJ8(¤m"‰‘Þ˜Rõ€5¤´B©ååuTfÎé±:^ôFO3€z›;&^xçÌ»Ö^;;°Ø„„¢¢®ß8&IÖ~ò<û‚ç·÷^{¥é^ø|Ó;7oݺyçɆÏÙâ£Ñºµáz/:“,ˆK(ô \Ý;]$ˆWz1­cdP9‚´Ðh4þ‡%…is=} ø×¢HÀoùíö,~ÛÂ4ZRÂÏî¯q!]&¢s21¿H1?‡”ލ œB"êƒF£™—ûÆß´ÀOÑh÷Ó–€-‚8nÞžƒ›¶j\al?€Þ,– oøR “‚vµRÎd(}@;[dlK> øßœk'½¸¹ølNÜøKçy*À7¿È®UÁé†áuC˜t®žœhg0¼¿°R½Ob ã÷ÛsòûŸ‘€œN`ˈ#J•0©¿(°|éH€]Éõ{ÙË'™[À¸<îF%ãóK€l[ "ßÁØ &còe@Œ$í$ ‡ˆ:€b¢zùF:‰*å†E^L£Ïü¢òV””“Ö‘I7‚D p›Ÿû †UŒ*aeWo}L‚ª ÁŸÉàlÌ×f˜3Ó$Àw™¨z\ÍA-uúÞé'ªð6_BÏ@Fâô¨Urs†ø&.l­è*ÁÙ´¦?j4šhÔ Nß@Ð[xCüÅ[\’—äÅ€E¼ `õ·•ÇN8YFüô:Óo“Yk®`KGìJ¾`ÅK,é[@­à?QIMZpÈ8* üL&1ãƒFJP“†ôÙJÅI²I¼åd7Æ?ˆ“ÉÙN; ¯&“b¿VMT0ÉËQÂÊ®>F’õ®"2Ù'`½ŽÕXÙ$“TrH!‘rã£Ð(q ÑzÃk¦PCÔƒŸ‰†‘$ø˜h& èpW,ŽØÌmà÷€¿-I ¸cü¿i=³Þ»³p X­ÀÉÌÃ,! PÉõÙË,i[@™­<¸•”Í/òé:`˜ˆ¾©)i¸JôhðUý<:KÔÀÀ8Ô8>Þa'“| ØKê"Šy`±Ž¿,p·NUh#*/pOñÍ©ÞñBqì=ÞŠ„xøç• îÂ"ÓA”°J¢²Ë†•°²«S×ä=7F­ˆ¨¨9Üã.S%ŠkÜ<«¸×”€HOaÜ&¥Ôi{§ÄÐ;J&ë9€Åðò,ÀñÅï·(#Šû ÑhÒ€»À×£œðgÑè~~$Ô‡Lñ>õ?¿•èüŒ=‘Ïž$ÍàÖçö½íxíÞ£'–1ƒÛ·ow²ÃÇwù¡czËúpûöÓŒ9øÃ›Ìñ÷Ú'Þa –8ºû؇6PÚä²Ïjk÷ç0Á*þE2Ärþ,[>äÌ€eÇk]ÉN%ù}räíPZÿÝwõùÓ‡Ôwtíafâ<dwí•ÕÌYÊ®N&0KNrÀ1Æ9¿}û>f°OQ«{a% ] ¸aïÖËt$ÀMD'18°î#*ÂòB?B]ñ±Î”Ýq¢¢9$`Ô+žðͰ(ŽÇ7ƒ3NT ˆ¨z0,¤˜„òE.˜xÞb6D‚=ÎÙàl|; Pª{…$à®èý–¤)4::ZI$Oyÿl­‰=@‰ÓéãÁ´ Ã^bÞDß-À |¡–“D2Î@tÂB•ãó&4Ï«&:EôÔ°FWILÌûÆèÅÅüY,_¾‰—á@É!•l£rÀ_-ONx¤|@1åD€/>}¤Î.¢Çh4š´$à]þÏ'®ü &”Þ.Å»¿ÝžiÒ,~›£ïýpÎN]â5~‡ÀÙe+@äû3=óŠ}dho‹ è[Á¦áZ™E- FúÀé9<¿œö‚Óý¶°{€”€åb“àCñ ÎÒ¿Óm$÷…€‡1g'8xä»ófD•àxÎõ˜‚£JÀ ƒÌV”ê^Ëÿð@u€ù.H¤àr²Éw¹­$¨.nŽÌ']Ì!•V_.@’žá 2 aÂe/Ó>ï'µ «$ZDÔon¦tõH"ñoŒr“l2vG2œSšC* ¨ Ë@ȼTÒ+%`=U( j†dPIïYž÷h4štˆrÖO4Ú Ž¯ðZ”sí2¦÷©Ÿ ¸m!-Àt ¦òº @½y?NK ìg,»@½ ®bìC?€¿2¶:Dþ.o¡G3Kâô?*Ðòs\‰80¿œÐÁß>Ý6‡¼ ÎÞ<¶ê)Ò ry®í.0ƾКÇXîùl»ù•‡CI?Qš<¾'|¡J€Ìø ½¨Õ½2þß©8À|)Î-hg”Èü¨pmî"ƒò‘9$ k„s–?ú3’€“É"7Ñh Ÿ[½¸Ë&¬’h¥ˆª„µ¦û[0JÓ5^‡gK€,YÍ!õ™€QãL@—YÊzCªŠŒ[M›ÜDsC£Ñ¤+w?ùax¿ŒÿùûcéI€ã¶jÒ,vÓÚ/XÇÕ¤ìMôØA[ ð/K\ ßÎØ1kE “@0—Y| àÈÌ/êxqvhž_F€À‡ŒS´•Ùª‰;÷Úå¾§ÑÎ}@$åxÍ3¬4 ª:’¨Íát:Ù,ŽJíá4e³$`¿•±*ju¯Î-‚ÒTHïAIUr‚Z9Ñ ‘ÅxYUŒˆ{SL l!¢É™ЙRüˆâ[ëšÝã†ðÿ«)$àí²Âl›VITl~Pê Ê]ï– ¹[×ë”ácc<Æ`VJ©Êœñú¬œ%Ñ`H@ Qƒ©Y‘8=Š@ø&ƒ_]Ðh47¢×‹ÁÂu/-y$à‚Õ`÷’ ߈#¶pÑêêÇ¥ ìÊ| ”Y|9óžúZë0:Ë ´Í+9kÆÿv 7Ûo¢ó±§amò½qä@ 3ÈÉÎvÊCýïëw:˜-¬™ŒÎììl«d‹ÔÛK€ZÝ+´Xz- ýÅ‚$‡¬Eúˆh&¡"r§ÑÇšdÿ£5´¦”€–Dx_LHÀDäAÐT%@^ò7=˜èçYaÕDkdJXUD9ØÆF¢"|>—1¼;4&çª9(¥ªwxŒQ]ã½S1þ©¿iÅÚÍ;)ËÂÉ%\ü+c…Ðh4iR½Þ tCvý‰ÿ5þHöF£ï¿ —­V½R¶ÐƒÖÝsIÀ×L°KJÀ?`1³WŸ:”SõÌà €Üù$ Ôú"¶×^ú¼Á¹2õíÉM~4a»uhoÒ ï¹ÏœLEî‹wXU>pÂ^Ôê^¥eƒoL4MXɲÁ’¢G!(  `¤ß\ç¶‚h³ls¶03?6xÑR&‰¶A&!èJ´ß‡qz,ïˆy“àºJôŒMÎ «$*ò,Ô°ªˆr+û ™šš‰ªï'î9h0‡Ÿ‰ñ\ý69¨¥&÷ŽÛxÒQI ƪcûbTQDÔ‰–)h4šté‰FOõ¹ºß‹Þh§„ÿ™¼‹¾Âhô~æðÔ; ㉭V1#ü %à $ Ó9Á,zŒñµÉNþ1€·ç“€Ïìž±©J;€k}¡vyº~o²_aû­&Î=AH.¾Ål÷EN 8šJ”êæAÿ€ÅÝ8Q…F;¤Fcºü¨@÷˜ì[ð×~; €8¢í‘1ö€‰êT 6,hy,% Œˆ6»€ÈYù ÀD4””4˜—æ}£DÕ—f…U½JÔ¨a ‹ œí0PIt ðòl®öÉ›È>I²û«9¨¥&÷Nïcëî?"N•‡.=B°ž8W]Ö’I4 F“>ï[¡Þ÷øSqô®™â{ê‹ÝL}‹àM¦ò€L°@KæàP¿KPÏ’Ò¯+3ðk“¯[Ë·fÐíµ“€7“øG{ 8g¥¾†üOr“:k7.°,ûèB7ƒÌv_œ·—«â/- p$†4ÛU§J8] €;FT]UÜe.¤{R4¬&Å*ùû¼4Vä¶‘€X²Ï¼‘îÑÖ‚b¢”áë×7VÅHJ@@lPy¨8Nò»+.2hô%$ ¸IdR\U-oETª‰vËOÕ°ªÈrãUëùãN-üIlÓFQ~…Ë^$»¿’ƒZªµw¤ €àDACKžSë7Öø!"N š‰3jÒF3?®ñ÷îú=Hî¿píýS$ÿï_R¬~ÿoùBZ@ŠÅ‚ꬣÛ_4g*2@)³Ÿ¶—¯H€Ü0Ç´Ê ù{ä±³8|€‡´ØKÀQkæáZíRc˜ÁEC–C–À)ÍÏ_ÍLÎt\Û}qœ Væç—Ζ€Ï¬sCŒpç- Pª{% ,&¢s2L$5dÒÕ9c-ýrc\(>ço\þ~]bû”€º˜9ì±!ð%“†8ÊoxGÉd³Âª‰ †U%@n-‰ßƒ ß*ß“%е«9¨¥Nß;®MD[ƒ°#È ¦knA’ËÐh4éèèpÁ"ÐÙ}×…à{ê+ZËßIsÙà#ÚÅ«ó €/3•à ¹`o}½ˆ$ÙŠø÷1ÎAb€‘,Ñq½J ­ÿ˜LÑ^Öøa™X€¸UJóH£‘BsÉÁØò ©$ؾãÇ;Çü¥)öE;àËKq‹àÁDÜÝúmªYí_ÉyÖãá%.÷ÊÜ.¤MàÝè¼@ ªfÿnÍ£mVo Á TtëÊ¢´n¬®Ž%%`œ¨’¦Çæ%óuâpzk·\+Ç£.ë°· I†Œa‡.R¬œ¾á¸èÅÛÂ0ˆLŽRœºá›Ý¾ãƒ8qF YaÕD·Zó•°•÷'?$7•åþIØ(ÿêF¯5ÜœpYÉA)UÙ;mÕ|ØØ1pš®f’•›D‘ÝNrÐ Àßz,‹ÙrÜ(¥ó‹RÆ%+KeŸxôÍÛV÷fšÄî9݃Na0çùãZ–)¯-i €¿D¹GàZ‰¯$ÃKçÞ{¨çRÍ+Š>À¶ÜÊàb€ä­ÒK³…"œÏaÓ˜ yçwæ1 giþJ–‚e;•°*Î7JW+ï¬Ø·oEÎÌ7òW1‹¬¿îÛédss¸ôÃål²#Ò‹ Vï;íLUcgŽíãË$@Óšè4Ö4áecyù4ÍóGKÀkl-àÖö ÉjêØb²Â§²ïÙÜ#ÏY,œ—N_Û½¡Ÿ®_ÿiè^›æù¢ÑÀ^ÛòÛíYü¶…=KNØÅ“·¡råÙ|«Ø£%@£Ñh4 ø”W ”d9þÿ¯ÊÉ€[¿~Ëž)8ýòI«Ÿj Ðh4MæŸú™IÛrçö4îlaϘ‘H(‹-&¹µ*¯?‡€ŽÁHäc-KF£Ñ ×ÜðäÎÍ[·nÞy²ásöíÝ·™C!€AØWèõsªŠoSŠR"ï½c&¢„Ï—{lœ7MÓÞðí¬¼"€@ ˆD"€À;~@ ˆD"€@ ˆ€÷QGBˆ€%PêH("àWÌ^GBK" £„"À~€Ý0 @X Rˆ§œ"@hð…þ­Gå÷Eo"@ìÊ•W²‰p@vðv±§>H”ž­‰"@€øV"ðóD"€ 18¹~S^"IIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/images/checks.png0000644000175100001770000006522514550400520022241 0ustar00runnerdocker‰PNG  IHDRô°Ø@ýPLTEÿÿÿìíîØÚÜÇÉÌÂÃÄÏÑÓèèêøøùåæçÒÔ×®°±«­®»¼¼ÎÏÏßàáôõö†‰‹ortcfi$*.IMQ‚…‡Ÿ ³¶ºûûüsux±³µËÌÍÅÆÆóóô•˜šWZ^ilo+/4',1^ae£¥§ãåæÔÖÙŽ”›¸»¿Ÿ¤ªelvW`jZcmƒŠ‘¼¾Âèéë9=A“•38<üýýëëëQTW>BFÐÒÕáâ䧬±’˜žÄÆÊÌÏÒy€ˆ¤©®CGKúúúרÚöøùŒŽ‡•öööbis/48ïððqx§¨ª~€ƒñòòîïð`gq‹‘™˜ž£ÛÜÞçç耆Žv}…¯³¸—› ÜÞágox{~€jq{½ÀÄêìî ¢¤þþþmt}\eoÕÖÖXakÈËÏwz|}ƒ‹ááâµ¹¼àßÞáãæÁÄÇ«¯´œ ¦¿ÃÆÝïâ¹ß×ЦvŠcºzL°g6¨U-¤O÷üøÂãËÍŸ¡Ô¯î÷ðU´o­Ù¸çôêÆ”þÿþ÷üÿðûÿéøÿáõÿÝôÿÑê׎½ð iÚp©ëQ”å*{ß±Õöx®ìYšç;†âEŒã~±í…¶ï jÚÁàú–Âñ Éô@¬^·Ùø uÞªÏõ3€àÅâûÔîý½ÝùÉæüÏêüÙñÿmÛd èpÝÔÚáÐ×ÞäçêÙÝàïñóøúûõöøòôõðòõ÷áÆúóëøµ]ú¬Dÿ“ü›÷Ñ¡ù¡)þ˜÷¿xòæØÏÕÜÐÆ¼ý•à¥YÛ¶†ÙÀ ùíÝõ×±óÇßÚÖàÖÊÙÒÌ×ÍÁÖÇ·ë ;Ò±Ͻ­ÊÁ·Þ°uöøú˹ªÇ¼¯Ä·«Èµ¤Å±¢Ì¹¤Ä®œ¿­žÁ©–Ì©y¿²¥¼´¬º§™½¥‘¸¢’ºŸ‹´ŸŽµ›†°•¯˜†­‘}ªŽy¨Šu¤†r¡ƒnž€kœ|g Šy§’–wc®šƒr•|k¹¬ ±£—tb¨˜‹yj ‚™ˆ{Ÿ”‹s°¨¡©ž•“…z™Œƒµ­¦¢š’¬¤ž§Ÿš†„…kpåMgSIDATxìÐ7€@°¿BoþÝ22³'2ø ²º¦yðYÖ­÷ã¼îǼìÙ…nëÌÀñqSH9é¸aN ·SffffÆ÷ƒk{ÝogåZ=±ä³?á´£´%¶¡p"ªáÿtF¢­±?–,â¡H"ÐA{<¬ ýh)–lJ¥Á÷”ŒŠ†,H&¥)—GS¡Xêò숸ÕÝÓÓÓk;2m=•Áªí}Äôô*ÀýàÑ{D†@òa´1<Ò&\bF;[Çà·£nø'KõÚ09>FŒ>7.`¹b'GĽ"šµ™9ªdʈaúÓÀ9~´é_’ÑgâiñS z}È¡ni|m¥€eÑ—V3yüCa-íÁqoˆ¢¶#uýY²Úœ«¨Œ¾$èùR·x‰ÙJxý³†+àg± ,‹¾´=¶TŃ#âZMÙŽÌ¢³èOï(X,ÊèK¢žçS‚%n×ëè+ÈÀÏhžP÷àWì«Ku\ðþ‰ÓY¬`âÀƒ#âÒiøëUÌ‘›%¢Ã#;]À m’¡ÿx¾mÿàdn˜E`œ?ZïQ¤[ÿÑŸd† È Ë—ò“ßF‘+´z}þNÁÏBhû£ÆqpÁó'Žñ›Š47EB*~ËÆªD\š"¢>>Ö™#wFDg Ëç,ùû` ^’aìÍ…+Ò\7€oÈè§ÀÔÐV[š@SvÙnIwP—£iXñ8ú%ÔÝ€¯eQWFF?ŠL~-¦éÎ2ÍÕ?".E‰hæÈí°;»b¬ð·'ÀÁ]?i6ïíÍ…uÒô‚ä»è3±¦adì—˜À2£ÿجN.4€¯M¢.)£ÏÄT4L¸“%4 oTýˆ¸4KD3|ì1GîˆA¬†tOû–¿Õx?šC'¤¹^ɇÑgö;Р> – –CÃdÌÛèÿ ó¨Sdô™4Ll[Yå)®îq…}õðñ‰Ü†“/س¤yn‹^Òu M~Ñ—ÑçNGÑ-2Œ†Aý¿-†º<02ú!4¼€E]u¹ªw6^‰(ßÚ‰\=iÞ@h»Ÿ46‡ðˆ4GâGs¦Æÿ_ôeô¡ ï‚%þ}k­:Ñ—Ñß’Ñ7uTjû;ꆫ~DÜ9Ñ¿¢Çx[Ùh­m EIÓgSäiÒ¼‰Í‘à‹¾Œþãê&ÄÑÛB]XFß=}7–*ÝMDC°ÚGÄA"úàc¯9ro¤¡ÒÌ€öñ£9°âó/ú2úÌ«Œx ²¨Ë‚@}"ŠçnFJØú|èÌí•Rõ‚ž —bŠ®˜vcÝFËC(¾ùb£Õim)~H™§à@Ñìƒç ±º¯ÈÞÿÙ;ó¿´•®W¼.lƒbí¯‹hw°ÔBQÚB[ïµ^q©ÕÞ¥ÿÿ¯o3I†œdÂI.¼[Í÷]žÇ:ž™L>ùr˜-Ùãµé±}0ML#gŒè4ÀNCÿ§8¨þøÇI¦£Žp^RÕÑýŸþæ.ãÜå1» s(€ê×Qœ]q=Ï&æ~ÚBV,hoý¸'‰Ú­oÐÕkÈ!ãìù»úÖÒˆÙr7Ý.<2ÐONxþHðÑöc£7.OØV¢ý N4ü)"FóáV$ú¡ôï0Nº¿ôˆ”;r'ÃŃ p1—eå9äsºúžG_üç¢ñ"³Èî“‹%Åa:;€ cbÒw*½Ë-Lʼn{4âÂ(d7q‰W[€Yc¨êèþ/3c¶5B#²úOqWÖŒîÛðÙ¢bNdÙÖÚÌb„\ÌT7-á_úrè[ëïi2µR^­üª‘¼gñ<ô±©W‹x®¹Ù–—G£¹{;ýPú«ŒÓî/ýZ鯦B­Å1¹Îì\Mº¥Oša:ó``^å:³³ÖÅjHb6pL SÐ]À¿W"`ðˆéÔí†_`–n£L§ ÌÁ1UÝÿ)æ`Õv£·eõ/ ®H[òÞðÛ–¾sfò ‘_¦¶-ì"¢/‡¾µ~‘6ãàöŠvÿ¥r®‘¼÷š¦}$&ƒ5O•·4<ˆ/Fòõv$ú¡ôW|I?Ñwxg¹H¡46Za˜bT¸—*DH?ÎÌ£)®Ãä§hé1¡zÅœ¬·ë.PL×°tS%¤OUG÷ÿ€Ò_M2$}²-´ô•y梦€KŒ³0€ôé[ëÿÉH畘NÞ}j4OÅRÉw=¿WÁÍ!ߘ2Mç äÑhvyUøÙ ¥?Ã8þÒOõ[ÀpÊ$d^‚à—¼[JQÓ½D!JúKÌÅ öÜ1Ëׄô‰˜bå6&5e_bxj+­šýá2Ù-}ª:ºÿ”þ1CÒ'ÚBI…@$ÓĆܿÀÒ§o-ùˆˆñC@”½Fw¢¿h:ÏšÎï&ÐÑGùð ¨OG_þøí×'7ŽZºúŠÍK$ü¡é¼Hô·à§'”~ÜÏDnCEÙ*f‚Yä3™žeã`Ûa;™rÝ”v/QH.}A½¼Þûó²"RœJ¯i"æ:!}"&@‚™äRë<¨¶:ã(«LÐ~7ÌFDœªŽîÿ2s0ç[ú˜ ²-ŠaIÞÚcó²È ²í¤OÜZÿH+'ßùFžþú˜KÂðÄ=^ÿ à·{—š`óhÔµÁKûÃsÕvŽÖ‰Ÿ=Ñ¥=—¢Ö/pû™²^ã9KºY4–«1ƒüBJsI&ÈYˆ–~r\€ÃqKñ3Θŵ>O•PqL “3kÉ‚O@*[ITb?瘶ƒ7Ž!àõ>K6™BWG÷¿|ådPé×çÇ®·Û« ÝŒ¼â†ZÛ)Yÿ…Þ-YLúÄ­¥ñ±—•|X—‰}®áµ—øYªjz‰È;ÍÁŹˆþ$ü­éü$š‹îó[’è‡Òcœ%?…Ši0Ç8©I0i¬‹qXôVdLˆ,‡ÜK"¤¯6Á$}Ì8;Ž˜ë‡¢­EBúdL8Ì;gOjêF$Y_Å–Ë¢ëX ¥OWG÷ÿ@ÒLJÞÐm!¥¿mÞ€L LZÆÉ·ˆS6uʵ٩¤OÜZòßär‡î/5§Äº›kœ¡ÃôÅQË_>h.žÿ‚šÇülõ¡†~EG“ðì–$ú¡ôc¦“Æûš«à¹Hé,VSuÃßè…W,ÁÓºp/]ˆþ¢ût®Š™ A~BúDL¨¹“ÛEû~åS<eù.ÞLú -}º:ºÿ”~%º-¤ôãâ£]°ŸE1ÜAv"Ÿ8m—>}ký="JG·XÝî˜þ¦‚ah¹4~«é¼yñ×ÄîÉßÏ5ƒ‡#`Ñö:ê~Kãœùæ¦ûñv$ú¡ô»è(5i¡É+fPoéúÈ=³›N:gTMá^²!ý%É6Í]{Ì|lÌÒ'bBÉPPB²¶©Â­ÞÆ¿o2Áºy…–>]ÝÿJ t[é e⬾aüãN äŒ$™“ÊüX7¸ô‰[ë:a<hg裺}Ýi6çɘDßkœ¯ šŸÕÎÒààÏ·çu°h˜/<ÑWà''”þE†¬¡BÓ3µDJe& 媢³íñQ»f—±ÛʽT!BúÀNÊ–‡ÝH'"’žÒ§cŠK«c¿tÔÞBÍî_›’x²xŠ2Ã+ ¥OWG÷ÿ`ÒO€n -ý§Œ3-]3”êÌEy¹TúÄ­õ÷ˆÜe:¹´stç†84ç=Þ/ûʵ¥Vç÷6ú$xmŒÄ;J½*"}f¥ñ¾¢ÝâD?”þöœxE* ÉI”À/-ÆÙ· fTJ€x*ÜK"¤ŸDÂö€&¤Gâîö‘>jØØè“¤`›ôN„ëj‹§‡I´±x™–>]ÝÿƒIÕA·…”þ¾Íø+D<9<åE0©½@Ò'n-ýˆ Ç/:FwêûÄ‘È÷AðÞ}„Î'cP~ÿù¬éü&‘Æ„m é~×ÿß›`ÑcüK„?¡ôÕ„I¦Î¹= ¥õü£Ú¤“—>ÑJÑr/Qˆþ j¶9Ó¢t¨¸»ã%}:¦˜—LÓ6ˆ>kø^áž^åݳÀmÓÒ§«£û@éOƒ€n -}»ÏKw(#ª«ñsk‘>qkéG%£;Ôaú£€FiÆñz;Š`ô¯¿ï¼5RøgÂαO›šî¡8|‡Ž&¡ôF¬ ù  }>MBk‚J?â±EýØr/Qˆþ´SAâ)Þ÷xú<)}W––îÃOÙö4,ÙÄ“4þq›ùÊ@IŸ®î¿]ú¢Ét[飫€KbºÐŸëéù²Êì4ýKŸ¸µä#"ØVyc™ÿ u˜~ ,ªº¦7Üß.£§)ŸÇÐÈ»Îç¿Û#J¤³{t®é¼(éU¼  ñ4Lôo•ôë³d¡zm H”öÊÖró¨6¿”ÍØ†:ŒãJ;-÷…éb¹÷O1N¬oLFçÀA–铱­Õ)›ƒù‰^†»Át ¤ôéêˆþXúØed[héo£Ûì ÝšôX!Ź]ßÒ'n-ýˆ²h ?jŽX‡éŸ ŠÓçþ8nsÜT_;†Ú·65—/~DÃQh%Lôo•ôË×t¡i è¶›‰"ØҹðxÔ˜p/Qˆ8{Çó)Þõˆ¹JJß;&ì±~Dlk(£=˵ͦ§láVhéÓÕÑý?Dé“m¡¥¿ç‘Ñ+ªÙOþxÔ;ç³ì[úÄ­¥Á,ßY _½…7àþ¥/˜Ÿ¼pŽÈDÏ4oÚS<ß 5)Lôo‹ô“³Uw¡fÔbšq*‘þÊ_FÓlX:ã'ÚÝK .ýqâ½A¤¿ÊúѱMψ?­ˆ¯Ädf½JKŸ®Žîÿ!JŸl -}|›]Í¿DÄzž_†%}úÁ'CäböÑ(¸ÀöŸð«À'Q´ÕV'öà-Nó«Ö°Ï'ÿÑ0ÊÙÏœè‡Òß”ñ;¨%>ïŸYg,1ß)»{éBÁ¥?ëóÛ Ò¿aýذM?_‰9Û¸pÃŒ˜Í-}º:ºÿ‡(}¢-´ôñmFT¿‚9jZ?> éÓbÞ6£ísüì‹×F>.0ÖÔü 1Ýëg€Ø?y~ieù/¢½þ/ð ñ=LôoÏ:}ºÐã[àI«ÌúIgÕÝá„›.\úxh37`¦O›ïʺ˜ïÏqa „˜¾hÒÒ÷[ÑÿÃËô—þS¯®/ºêSÌ2NfèÒ_Š9ÛøÎBŸÃ‡žk$¯€BÿÈØtˆýgïéɳÑ?Й“0Jô¿CH(}N‚Qk¨“̤¸>¿Ð\ŸÛ›jXÒÞV»}‡ÖéBÁ¥ßÆ;”[CÓ¿²‡þàÚœªÈí QÔ«Ö<ò5-}º:ºÿ‡)}¢-¤ôÅhZUF‘`Äuçÿ¤ßMñ›ßàr ±©‘<ŠÏøÙZú-×mF·? $.§« }9Ö>‰ñ(^´ÑhV€€¯ÅüöÐmÀhÕÏa¢¡ô%§*'ˆWР£-Ó¬zœœ»dw/](¸ôU¾ò(9ˆôRO"ý;6Ã5mc>s眖>]Õÿ´ôÛî«÷–>ÙZú%ïïÂcýupIft6@Â2ã4è˺ô7˜Î’Ý9)“Ž~Âñ׎@? ùcǤ œÖ—4À:0ó<齂+x´­0ÑDŽҟ¬÷?%Åt²%¼aǵ#w0Õ:r/]( ôEË€9T‘¾ÙÐIhÒ¼ª Ûö€²éÁqZúTuDÿÓÒw7£ØWúd[héCIVpå5ÁQS=†Ì›L§Þ¥/g¸ÒÁêûæÇ{¾ ýx…aø Ygs£¡2ø4±Þ³ÛúALæòKôz2¢ú;š ¥/Þb‘éÊ%•“$oÓvé C -Ær/]( ôEÃë#.W "ý‘äõa…éLØUÖR¹ÿøü££¥OTGô?%ý2šNFÅ<¥O¶…–~É$)zîW+»yÀÍ)Ó—3L飿›…kb‹ó‡ÜÕ\Næ®kR½8åoÛ‰ÉKïPùè?â¾3Ñ ¥Xd}R¼†äUqݲ]:ãLòD*)ì^ºPpéï2É©(­â`Ò_e:¹kG‘¼N CYæÃ÷5´úuq½4‹’>]¼ÿIé'%߬j„ôɶÐÒßEUX, k@Ì3¯oFœø"G_ΰ¥Ÿ®Ÿ b¯@ÿÃôµ4XüGÿq0/õT}s[r•šÎ†Yê\ž“Ç¢é:šˆ+Ñ ¥wúíÐR$ôËhÉà~éx6»—.TúâðFu燃I¿Z”¼¶•wìfHôT^Aj»J!éÒ'«#ú»7ê:Ô(7=¾©„ôɶ`dw+L§ÞA*ªãÑÉ¥ä§\ý”`œ#úr‚KŸæÊß)[ 'ÓÿŒOÎ('ù;p¢|@»©îI_nÕ}Å_ŠÕõ qãNôCBéG*øñÁ¿LtA0—ÃÒYbœõfUì^ºP0飩âXtãl0é‹OB×­Ðj)Þz»Ç{¾¥OWG÷¿ìœ³¦ëuä‘$#¤O·#«xqÊ# heP½ñºüüœ#òãäF|^Î¥?fÄF5x°ˆü yWÄÓt¶¤Ç&h_ðqk‹ÒäîŠ&xùÐ臄҇Å~;´²ŽG¶;SgX:QSB™m0(ͨ.÷Ò…‚K¿bŠw&œÎXú“EÆIÄÀd*ëRÎ#f‘‹n¿8‘–>]Ñÿx²·Σ"™Z¨‚Áh™‘Ò'Û‚Áãw¦¢¢«Ræ¿ìƒŒif ^µAÐM1ƒ¸¯Ë¾ô•f¡vè•5ã—¢¿½•Üíé’y.¾"jå¥.?•ÐçŸÅý,>xóˆPú¥2zÂ0³Ì 9Á=»¸Îû8½c¹ø7 1[fn÷Ò…‚KÆ™ÉÎÑÖÄÜÍAŽ $}¬¡bMohkîÈ”¬zmg0eŠ’>]ÑÿèƒY]•l©+wºÐXYË1Zúd[0ÒŠWTK⻀êÝcëç ¢”…\3…ñ½ÎöÆÅ,7C:Äå _úP`I¢äœ]Ÿ‰Å•ˆ½KMçI ­_5ד ˆ¥>Œô =1 ]Š&ب¡ö„„ÒÇ;ðÕhßœ§^^Oå˜NK'’bj®È ½D¡¤KÌM|@éw“½†VòL06ŒJðìé3¹ñ+}º:¢ÿñœ&Ë̯Ì̢ͩ.¢RÒ§Ú‚‘Wï…(Ö{¨Sæ‰z@\ΰ¥Op¯@#Óïà—¢o€çËÍß>Ø+ñ®¾ûdSÓ¹œÀC9œ×‹ýõìR3ؼû/£Å^‡‰¾¡ô/˜Á H¸Ã0¹pH&S ³3¹-ÜK@úPŠ3L2¶=˜ôåÞRË1Κä£3A¤OWG÷wÁ-ýH’aêí)}²-iÅpªºBÜ>lg™”ʨ˾ôg˜ÁQn ¸oy¦ÿ70æì7pð‰›qþÌ´0ѧ ¥ÆIÊ%°•g6à’>4–TÖC­¥»—.Pú‚Ù²Ý'§/hæ"1êñÝhÜv^ &}º:ºÿ#Y·{•³“-}º-iÅ0žbˆåÙ• sQ?€€¼œáK¿•c"Mæ‡é?À?þrO4Ìåû¸øóƒ†Ø|Ðð-Lôo•>‡)Ð…®Õ~‹ […Þ«ŒžŠðuôTFçs–Í“£b‡jt¡E4ú›•mŒ™uÏ8wW³yÃøÙ;ÅQqÀ˜P½Yg¹êt¬›‚®ŽÑ÷@©ó®S€®.PÿW\î…‰«œø³1qŽXSÞD[0DÅݱ„ÊLÔÄJ(J«ñ 2þÒr 0Äåз–~D0I±‰œ\¼s‚Ü/¢/>k‚7‹-Ñ}öämÏäÿŒüûh_ø/Jò/(ML/ÔÖf&ÒàÍáîÍÂZaq/Á Hltu7Ö]$aP:s‹?Z:36¥À  ^ÝÿJôd!^¨-tP68>³ö£·9î¥ÓCkwö´P8hO¢Ë§…ãÄÕU|azÅ]/}9Ã&…ÏŽÝö_Ÿüsôâþ—kð¦:qÿñûwÿÜ<›ª!ZȱsVr@Q@_lþ±Q@lÆ…ý±¶½ƒ{{øxd²ž,-g€C¸‘tŸÞŸóîâVy—”‹C€»i^;F°º¼±]ˆ5:ÍÕ1ʃ‚siÁõ@6-¨wbYáóô åiÞ»BŒàæò–€;W»…ˆWJOÒ¢Ö³€ƒx|îåÚÝÖêlõ讥U¦U¿äAZu7F p;m)pèKÿ]7F p­•6iÕ ‡½ôïß `ätŠ­´^ýlÀ¡/ý/EOZiÙÓÛ7ØÕ'O3ïêw>_`d}«ä?׆¿ó¯:ØŸ?³ìØÕ•Ý0€á =o¯[Æ-Á$™¡î03¬Ç:Gÿ×`0Š“4s¹È]–&qtÀ вÊÔ\V•…lEu¦'ÉêHì¢Äé‰\b•öMÝêÉÚº€2U¤¥ péœzÁu9 ©ÔU#ôƒzdèà}Î÷?ëšA=34rÀ˜¨w’QŽèÔC tÓ¼¬Û÷Ö6kë2O¶§ýÁÉ Žo{öP:õ+A›–ÕË„5pZËk´‡«T½”^ 6ûš×9€Ó^£=Ôê©Z®9¨t5o"ëŸ%jÕSm$ çûh>î´dý'®}åúÁ¹IHô¹X%‚@Mëæ³u å´ö×xïÑÜ“›ƒÈéOåÃ^Äi®ï¸^Ô˜‹aZ6¿-AÖô_>ú—“~þ>çîù‡œ/lõñš½s{jbÙþx//É£©ÚÅ#HXÀ~À*®R@IJªPÀP@%©Pj©(‚A<çü4„{I¸äúþzM¯fl†äP·äû2Ý=ÝÓ½:“ÏtV÷tÊ}£^‘µå¡~ ‚YTbe]šç {W–‰ù?ú󋬬ßUÕ®ârý>nÕíî.{ô/É«6I—£²–.@®àüìÊ,cŸ$óQmöÜŸ[]zûuöòÿiq‰§²ü½½n#R1}§©¶›]©:‚ÅåúÃüªcÂ?ö,wËÞ»ñ×C¿<»ð™-ŠÃ"k¶øY–m¶GûŒ'ßÎÿ’©Ü²*FžR¸ÏÓB*v•>¸¤\ª~Çÿ±3ͨfþQÖ^}7–¡ÿót¤•‘>Ê?wÁ† Ÿ›×.׿Ã~Õ>f¯æþ@;ûUšö‚}w#Þ°+Ôk€…ÍÆ\?Й_~½ÂœG.:Ï =œq¼d?¬/×Xeèÿt½½p÷Õ§?ÿ•±¯çζ~}K‘ËÔ[ö»ùÕÃìåa¿F7‡EÐïŸvUt… ädW'Oea³1—mgþÞŒr+ŽVÿ$è¯olnmmÿêÂ¥÷ ³êê÷Œ-Zs­43æÿ´‚Á9œwý„Ù/M³eèÔ~ïú‚|IíbW£ÒÍÆÎüSFúuŽ? ú»qŽŠ‘uoÿ  ý?éͬ˜ÅºN_¤¨s­‹+äÜgBÐ-óîÝÚ¿¾}˜]Zý€Å5}{7ûuiuƒ”a3¬ýNý›=== U!BÝ’<5U¯ëj2]®é;muµÍ2ò·ÈæfSoîT2R·«¼ß.*ïr¹ñèÿ»å9(ÍÏØ@‹ó¦¬ÖÕЉùd…-7ü玫à™ËÕKlm©¼ÇH– Þh™Ò VWöP#P}N‡o€Â½Ø¨¾ÚÛn­©/±Ôb”ÿ^Ïí'nëd©àîÔBŸpúZÖ¸Á¬šª¼=`‰¶´öÙ7¯púwfW×>v©FèLjÆo‡Á½ÃB´"[ÆZÐi¥ÿ–ã‰r¨ø{C?ÆÉõ¤ÚªvøÑ%@ŸÞí¯*CÿªõùbâZÿ~ö<è/,ŠËÌ™=B_å“à#m˜Ö·BföÙ/8P†µÏ…^£ÇˆE>Óñ­¸=šžÒW©-¨@-CyDð ú¹=Œ4 ð°jR ˆ±ê§ƒÐp¿R¿UVõ@h ©;ø´y€Ÿš÷H…0âšÑ0ZÅHÆ›ø¢I ›º‹yï“«=AŒÞ•Q/4N„â²z<ÑÕ'²ûªSkÇDú¡×nf@`Ši0šdfuÞ× {$yéZÁᇶͻ(ý€Ãjvæ‚@'#¹ì;SmÆ?n"w¤<ÒÊ;"îQî»NüM­=æqn6Ûݤ6úv©4ãj1¸·>9‹bøô؈§Ò•MZOŸý Zî›N¼|k÷7ÖÍÑÌé^Ælý^±×9äóÚ=9Îü/Ð?9Ÿ@ñ3QüÉ€CäŸaº\¾JSŸÏÉXó]€þ±Êéáh¨µ@‡è¾Ž@ŒT9_ÕKGŒÿ©(Y÷øM#ÀH·}Ý9íFb6ÌLWŽ¡eô[…¥·ÛÄ¡“Y¥CÿÆÙ+ë·Í2ä ´wô´õK/|eBÃU•w€¸m›gŸŽ87›ÝpT¿¬—­P¡oÓ™J3HfØF²œóÄ.&&!Äã§âåÉð‘8»-™çû»1‘7—Fâ%xN÷UD‰êy‘Ux8Ƴáu‘=ªìt[œÌG$œÖ¹¦} [«QGú­>@“ÏW!­ =t8•{À¦kõ:7ù¦b<š½™±MùœŠp¡ãm<|ÑSâIrÊó­TTX”=§è†Ö Gñˆ`pœ+ùH6‹•f…rÖ¢š2;Gqß’ÅŽ²YÁ¬yõãIsT&œçúôÈîµüˆPÞýjè—µP2ô—Ñ‹ox#¦¯é|õ¯ú* ø¨‘>‰#°¼ C¿‡&{ÌÇ!þáëОb&B?Ò¶B0,A9Æ*‘¹Z~§üž{0þ/cš{¬  ÒÞûƒãÍêŒ&œ €·›‘d´9ƒ"'zXœ‚s’‹ý.ZjY'¡ÿO3w ‰%&$ô›ä°i áƒI>uO»îmÍL’{œ8ãšÀnÃè-À€Mó.n¶Ãlö €Oë.ï` }»ÎTš¡@?'H–@lX©Â5FæâËHèosM['8ó"8Ñ{Ï¥´`‚£ò1.„ü:ÈRÉŒ }k5êó#+çÞvhý¨jü—ã˜ˆŠ–¥ Îq9âgÐGkrÆø{‹k +EÃ<¡y[Ò+Ð熢j­™m:w Ÿº²êǓ֞aÎu6D ®7‰¤p½ ý«Ö¿J†þ¬ÕIôNÂ~Éÿ/k ßüºhNB3Ìa|¾ÀŽþ…¡ß¡{šÝn7cM"ÚÄP¢Á>rïø™YmÚÏã~L>f¨E–¯fÄÞQ3§|Ä-’ýì.@§Õ½ÃP¦É3P/›ù„¡ªC¯½ú˜Çiðû±„~¥‘Ðpë|è·P-¨zíú¤Z€F¿ Œt°Û‚:2Ú 0jß<›túCøa(¢\v©4CÁàzœ‹ûñÏžœ}~´~²%Ž ™’éÃmɘS„籨LÁËHèÇ’û‚úÉ<ß@z‰`z}S‡nF(Oa¥š‹ ?Ãιì:±ô­ÆS#3™ý<žÔ´Íc<±s¤áo§÷óxkQ$}úKRtEæË>6+J‰ŽJ¦„Òj­âTî4µŸ„Èá±J>JÔã›ûÉýuYt3õ%åñõ2ôÿÑÐ_%z“–Ï ?oøgV5´ZC‘;3|Ó‡ò«%Aÿojœ¬!®·£Õ‡z BN ýifQÀ_8Ñ9zK»Â°yÜì¯5F¾4 Úõ§hþÔç·ƒ¾;Þ3âuY ?­‰+ ^-ÿ8Ó+ hЧñù¤1)à÷jÐ3Þ·š¦S*ôoÛ@›_Ç,Ñ& NôÙ5Ï&]…>6nüËú6©4CÅà¾t/ïE"ÇçA?‘FLåyDB?ÑÌ?2ùwbò€)›qÝÝ‘àä÷‰âét.—Ä eñB$‚¾RͅЯbçÜ6XúŠñ):»‹¸&èó-¤-)™çG)ú;4¸N_4“åIâüôKëQuˆçPj­á\íºfÐÛ@ßô Ìñ#,z’à;eèÿÓÝ;þwFŒh‡ÏtíEã¯!¹˜®%¹zGžoFè—âÞÁÁÊÛîp˳I„¾²tÑ=üÞµ±> ÐÞ<½¨AŸ°„ùLœ"¿Ôß•„S ÿ ñ¬©O­«wô/þýñjùa\J„\}*?£™G9Á/-1rvÙºwîRRŸÅ½3CÍW£CØ?vͳIW¡ÿ¨_[”ÒåS oß™j3Ô‘>ç›ÇvTáDámÉ®8EÃ<~"‡øíÈs©LG%01Šô‰ ô¥0eS¾Rô©«Ô{À¦ @_1þ€Ç3„áCúÖ™ÛôYGÅOè ‡JÑmÆYQW”I ôÕZ麧EAßÔeGû¦•¡ÿŸÈ=‹¢Ë~Ecºû,å-æBÙC¿„‰\æž ‚Ôýêï·ãž–¨¼Ç¬‚Qæ A8Ùˆ¼|…‹[¼ ‹ _©rJSÇ( ‚÷9Я9#ýC€¡BÐÇü&ÕX¡ï´@¿Lj/8‘[c™ÈmG¦Z¢SÐà+úìÑð  ú+èÛt¦Ú ƒ8lçñíH2£PEedœ‡uÔœJt Ô²¬E ¤¥†¼ ýÌA.º½•W¡¯VSúê=ðCÐW盚(Ò{K±LůRŸs±lR<Êb<‰Ýv¦¨}kQì¨Íí­XÑÐ?0>Iœ FQ.úå­•ÿK6¥ãfÁÌèE[2( Ÿòsˆú5MÖÖæèÿÐ’Í6 ú(×›ö @5j^S˜ì@MŠCÅùÐo‚Põ_àu34ôvhËöcñ±W=“ j}1”óÄ ôÊ#êq±#}‡Ô´Ãq“ O“ž¯Ìî´äµ‘õùùÐïn0hÒBŽtƒ©-Ì­¥ào©ÐGõN{p¸ô }µêêM J±d1Ðß·0ëyl+ ýp‚K•}õø!è«ÆopCaú›E@_)zÀ·Ó|û$¾}¢ýïž)i…¾Zkúˆ"ÅBÿÔ}] {è_ùŸ¨”µV2ôq$oP{á-ûyZš¨§L$úÅ¿œå4VÜ·ô¥j}¢v[Aèë>}’ úNã©ÒŸ¾"‚>]”FôØàWÌКe‰Ö­4ï-ú¤žO‘ÐW›¡`•ÚÏ $gÍ>ýSû‘¾á{ÀÜù † C?•çG;ë{©è¥@_½~úªñùCRZ‡~¤è+Ey‡ùGÙuu½új­žÍœ'/„þ© úiúq9$ÙCÿÿ]by†…w˜eÁ>µlzxÌ2‚ý½”…LYè׆þßVWWß}¬Ï*.c÷ãMô&ÃúJÑtV9P¡¯|<ú'¦½vì_l€ßáÑË®}¥7híSâ8Ô_\„_™%‡=2³Í-Ìc Y@~•6Û_Á+¬ýY¦(€Tïõ·> ýZ²ùOT³>¼c^t ¶ TÖÛAß^¹CzáäRn´þ y•^“?"„W ùƒôÔx#ª­ üÖ» C  |„~‚¾Ô4îÍÐÔá }÷6Þ窲þ@œè²úýýýÔþq\ïÙÀ^£×ê~úºÙ®Dðž) }êL¥ w6#/Äá>Í\nÛ@?a¬Þ!(æbXŽtœç|ë\èçä¢È½øå@_¹Š…>®'¢ùOÕøurëçr§çB?‡ËçUè«E£<ÏS¢3ó2ÕúJÑ- Í9ÂFÈúñ¨Ðò˜ÙÍíØ@¿¬_¾µò2eZ¶OAÍÑrG<Ðx^B_×}Äï_ÄÄçOª{§ø­•i:3$XCÐoÅãD{»—œì•x*ø,f}ú i` ƒn¹'Ãx[m§'6ÐïÄ bªž°[øÐi™êúα1 0ú¢SX9 èúkòn½Û… ÇüŽÎ.|[Õ }D†ÔÚ{Ç9(Llª}s_”pÛ@JÞWn‰Z^2“žxëøFî|»†š:»íþ‡¾av»8NÖÔ4‰Zj CŸ:SiÉòªP$%^ •kpµó§Qn}¾%ÏF ñxÊ´q¦PJ…¾v&·w’LOŸÖé‡ñð#ÐWîb¡/š¾“ÂÕõ<ªŸÙâyѤõ#žWÜ;d”0C…¾Zt—ãéSN¼¶‡¾Z4Á'{9Y”ònï§ÒØ­ÖGþöNsŠV“’~>ôËš/îïmSP󴼚vO#軾Z~M|e=Їþúòi¼N d}´Ö3Ôfý›Ú.¦M¿~«ur˜öÞq?©ƒ‚¾õ_Oº˜ú´‡™wì¦ ªŸ^Å•Âì ïÒ«¯b&ÑÓõìFk(:ÒÍJ€¾nö­èØ\úÔ™J3 #Éò)HTDål ¿uöF.ê$kì»@’‹Íè§•=’Ð_ç†"J5¤‹ ¯ÜÅBÿ&:£X“büzV¾Ñßժ1MhýŽ }µh’£™<Ïg @_)ºC=L9ŒWtç|<[YŒÐ t“b颠_5ZÅ~²ÊNýfýïmSHïWio5ÍÝOL_XÆÔ¾åÊ4«er-ÃØÙ“£±åâ]ú¨AdDÍ7Ü7¢m9ZGCÅÛECÏnÓÛ«Ê0éu­¤ÓôzÛƒ®óÑÛNù¡ÉÄ©q9Töx‰SϰO3«ùÕ--ëm«×(Ö ™/èpY¾ø®./¶—òô¥üœ~\bòKÓF@Èۆ䰨âl©N·Üe´_™üªlÄjú»ˆ®µo—ëÂæÙ¥w´XÌîõà ªA‹Õ”˶3Õf(>ýãÍ8’oCr<±X$-©’U&rõ½wH´Î”ÉeóM`ùM„þŽ68>Ý⸡LŽoumX«±ÙOßgéBå°íDÅÚœµÝ>Œð¨b<"<šÅf&iàL xŽÅ·Éô]ôÕ¢'rî`›žˆŠNu¤«E3;"’ØÜ;Ë‘‰q|ñWýx¶¬‹uhT"‡Ö†¾ÜìòUÖRé#}Ô¼X‹9·òý✕••S¦••ùo—òÇèîç>+õü•/ݦxµ³òV7ûŸ5åÄËÚËíªöKÀßxîbªúª»)c…³UÍ`/÷”Smoó“'SdÞÄÙ$§«ÕùÐÀí7>7SåzÙÚk‰:§Ü¬df»ž[ÿe `gÚ5Ã:‹»w˜2Åh_LE´z'µg™é¤-Hè­±Qzs/VHEÞÊZ¥ÃŒ­ñ=ÅÓvRL(¾¨*µ(EŽ•ó™L¡‡”6¬!•ÿ:åçkq¾dŸ¾*‚~éš_d×Xî ÝA4†¾¨k 7Fè[´ÏùÆUï§_šÊŒþó¡_Öri«wl4{9Ð_f×ZuƒO›“#€ r®“þ{ÐÇ8Ϧ¯ˆVÿ½|k¯£þËÊïáþdøßª…¹¥Ks ö)W<Ò_yË®µpþVª¾’]+ýç2 å<¿~U´úÏå[{EÝX~÷×Oå–¬ÕÅÅ·¥_å»îš©Ç?pœ¹Ç®—þýCõõŒ9z>H_™[âß—oíõvcù=Üÿgߎq·¢8Ÿ*-m6”.oÈ= x<ÇÀ#Kñ50Ùdš‘¢H)¹øŒü};ð¿øéèJÁò½ËÈ¡ÿÓŸ¿ýÓó™ÿYÂûÎSfã?\ö]2^ô9_ó_¨Nýú3RÇë.¥õ,&‹Kþ§h¯úõg¤’mÛ%Ôn##TÿzùÅ¿Vó9v cÒ¸\'Ðü„_›`Æúø¾êÒY}iãüyÍØªÏó¾6ÁŒuq8uÉœì_F(áõ§ÿOÕåœðk¸þÇ_ÿª2#Oð‘¬ú§ –æã¤ùÓqØuiì@UͱíRhMPÛvÝ%°ÞÆ pØ¿w#{ßâ5X®ÚnDíj¯Àr¿éF²Ù/ãµø¶ÝÐýÍnû-A³ü²ZoÚ¯Ý |m7ëÕ—e0=0›/úò$ô‹ù,²˜ }y*úa)¼ÝÊm¸?šx šÇ}¸•Û[äÐ,ž–òcèË"Òx+ý<žŽy_Þ"€¿oµš¯ú·Yä0”!¦Á´³jç(?n}®mæõ®Q†2Lå•p/‹È /¨„Gé#€Rš¨„¦”È@–¬ ÈÖd 버uYº€,Y@–¬ KÖ%ëÈ’udɺ²d]@–ˆø‡½3þKÛøÿø EµkIÛkG6k­ö£Š/T-³ ˆ«Z:‘* Lm`8ç£jÿ­•GíùMòNàõ\T“á·Íë‡-wÁ\óäò$\.1M]Vξ6ÛóõLYV5Ÿ®#¨«Ãú±È|qŸŒµç‹ ›÷¨ÌÏ•´äG]>kÊs¶¬útå ä°:ŸŒÛ'ìKÿ*Q¿|m^œ¯_TŸ®Ê–{IF× d-šüÿG&î5—ØBVc?@âûÚ„}éûé9kþ{Îz|º"(gXn%iBì%s)2﹜þÖ'Ø®ö¥xð’ yù ûýž64ó%îKß”˽¤!MšÝšh!“Æh}Ø_®µû¾ôïpiîüÐ*û¿$]ßùn[¿t1!]@ãG&#碞~çÖ'Øîö¥?Ç¥™c·9o7¼?}ý®¤? \Tg¬À¡²³Ñ:DF‚@»ŠõµéïÃù.ö¥?Ìù6²Íù°CúóÞ‡‘-Ö™D†Ö§Øur…“´ÎJ_ #‘Ôs)©X}ÑP«£Òa­TÓì ­Vn=³õÕåVT½X¡漳Π¼ÈiµªÉa{BØ—>çü‚Ê£™—L–øÝÇÜÌ\ˆu"/8ή‘žæåÓÓAékŸr0SÚb®¤¬xŠ`uLúXiì^ñ é1»t2Í«%ã —lÖÑúïÑÊŽnlçuåEÆÍ¶Ç„)¾ô{.Ûïù…ÛºËþ»¼{ýúOfäçØÕ£ž5/Ÿ3Õé+[{{[Š£X`'¶ÇÜÈ pd|Xçj ®ƒ"X“¾Ë}éwžŒˆ èk³¾´ìœ—¾²‰‰Ìí—¾Û{ÂBü3ý Æöêõî„û~z¡/¼aÿMÈõýÔÕûï3Š÷c.J¿ë´=Ó.Çc+‹Û•©"€%æB´l€éQâµ@}Îf»š”üñüi9ëõ0FpV&‚Ty9X^K_$ãœ/H¿ ”YËú¹ ¤¿±2.ƒ °Û-}gØ‹åÓòâ´w}Ï—þ…cû÷ôÚ_™õÙ0ç÷ÿ{é_/ªxÇñ+ÎÑâôïœóT³=_U—¥ß· +›}ì_r4è芗@€¹’þÕAí¿ åP zcûM–›rË -ª¼,¤ïLfvÊO¥ÏTHÿ7&ä6Kßöç4Œ¬¥šõ=_ú®Œ¿n\yÀùCFé½ÿ4«0Š:0g¬ëivÕ(iËŒ’PͪÞþTXeÅX­SfYÝzšŒ· ˆ$‚Vß]˜åüŽù÷´y±UÚŽúgp[c²,7Ï¥ëÍ0·¥ßÿ˜“ôÛ³ì®ôÃu ‘ŽFÓ  fFÛ"v! e?H®Ú|Ec¬;±oîé@€8;ÔÇ•àPQ–­º‘D÷¥@æ[m£›ê&ó¬œéËa‘ôµ‘>…µ²U6…`öm.3 õ\ŸLI"}"ã­ôÙ%¥ß£ôØ;+E"Ýi (eôc¼k¥/®On$Â&DJ>ЧwEMQTy£™ÆËIúN°?WÄDÀDØãøÒOpþ8cº‡øºÊôLÍ™CütÑè;ç÷ ‘?Ð_Äù £<áü)clÏ|õ«wTù’?ê}¡Xï¤ÛÏ×õëYcÊ”ñÌ“LÛÜÒŸûU·?Z¥í <4þþõS™Îΰ´=Cúù!.‘þ™æ¦ô39 `z5 Ge©5Õ.äcØ4 ‹¦Têïß2#ã@`ª =ÂöÇ4ÒÝÿV „X?( £¦k¥ ¾£8‚:‰¡¥¶409Ò¯"ýÒöΊHä;-•M7€µ1ÅZƒžjTµû^ШhœZ«““ГË~ÊÒ÷!2 ¶¤ÒaSŠÀa 96§%„½Œ/ýYδJ[‰„jØw˜SKú³ÃV…jζéeFÔ>£—ïØ¯þŸ%ëAÓÀ¿±û3œòúoúˆ è2—J_hõ%ñèâ{ËÔæ¹ü¡ÿÕI‹ó¡Ÿ’ôÛ£º)ý)`­‹»Ö€)vQæh«4²µ¥‡W”ôªu€-QÍÄÈ.Ììî_\OÒ?h“~ÖVÇn·( V.Xj;ê Ý5V¤/EÒoíi?íP”K„l˜¥ý–•4Õ®M¦C´)êqàë ÒßmI_D"ßi(ûñ?ŦçV&ê{ó1*§ãf7¯R©ʲ÷!J±hN°€µca8‘ö2¾ôu;ÞeBBC|ø£ÐÏsºEU’>_ß¹ß÷óùâ»¶ÞƒæFv?¸“šÕÿw‡dÍùܳ©{6¨¯çï<çü‰1®oäçàÖÑcóÏ·º§ß%]¶ô…Vi;";úV^«NßÿžÍ‡lé?5%Ò_vSú“À¸½<L²‹R>1!:ïƒH XQiد¤j@ Å`øx8¹¸ž¤¯T@©R ë‡@t{#´œ:B.Û´Õ6,™cÙU`D€ÕéË`¥¤÷þ-1C‹ÚPßú4 r¥,¤²ó9½lyœ?Ï®OæAE™NŸé Ò‘HwZ ù¾ðÔI¼ÔË£#Ápdõ½Ír¶RŽÑ{²ZJ‘­Ôô”%&hì³'5èÑœ`¿"t¥RéöÇwþ[ébNUêŒq®gã1-èÒê7*îšcþC|ÐÝÉ2õµõ±ñt˜¿´dý|•.Óü{ený•¾âÁ:݃Õ;Ķ_È%é‹­ÒvTÆÌLŒÒ<—]ñ–ô“Oö›2é+7¤+¤ÈÛuy´¸BŠÈ·j\+5Z7N{Œ mZg]a`åÂz’~û…Ü.ëRÁrz³wuªÃ±Õ¶ô=`Q„åò˜>Á¥ï ‹¥íïC“´òÈ)ÆÞëåq‚ybîç.$šÎ/ß„Ìg`ª™=Nä›ßDéÔ˜~r•’¥/"‘í´T#e”³Ô©¢››æá¸_Gú^=k”?côÌ­2Z@ùÛFµ ªfÓk‚ô¥°kÀt3œ:iÊ{_úºQEÈAݶô®8Ÿ#éÿNgÝ,ÿE·ýª3Fé>ç13o8“¬é[埜ì.f¿üFú’V_Ú£H?s>ÅÄœ5Åô)2韹 ý ZÑìJ ­015`U¨êVè“@ÉÆ1Ë+À3RÅÄEõéW踤8‚j©­dŸàÏG,/fïd±9Ã"éÚ3{¦ÈýÛ4¤ÜÀc£À$Á-SäAåˆÜˆÌ"IØ,üÓrÖ)éÛ©‰Ò‘ÈvZ ªHkr˜8ÿÉ»F}ï=óu³ì6´ üm£Ý°;õ"Í vÕ0]#8nz@˜â?†ábé|;—ò]ûZCú?Qù1Ÿ1Îéi|'hÎûÙ¡}šüydÊú±eÈ!ÎÿêÓ˜uI¤/´jlgÆÞ®Ñ¼¯W–þ׎œéK]C›û¤°oÓ¼PmÝ@•*‚À˜—Ò—U:ÃÃ0mZ* J Ø0ÅÕÇÙMÈ4#@lésx¯ ¬x.}º#×Qúóã””(}‰t§e >YÛ&ék£'“¥j°¤o¿¼hH¿«õía (ÛèIkó¥KIH§>¬±Ï®ö­¬êÎÂ[¹s• ¹¿pžlùÿOš²Ù’>MùÙ6FwžÓ«[ùÅ–>åWš£3ô@Õ 9E.}±UÚŽÇÒ÷~öΰ'T-Ó­¹è¤ÏR%©GÕ«¨m 1´6Æ‘:/}‚å ý´gÄ€Ù-‘þ<»™òÄ„Ù}>¯¡žÉxöìk^È‘HwZê¸]úÊìÄÚûI?ߺÃ$”¥ïƒÝ© —“~ɘª™ŸŽ|é»ò#*ä|ñGTDé[ê}ðí™~°uΔH‹ów†‹ïÑ«ŸÝ¡Ü»“mIŸ’ý`NÕHÛšyðîÞÓÄk©ôÅV]—þ׎ÌÓ?¢BUe”`ú¦Ò§$ ucWÄ8’fÅ0õJ¿ˆâ¥aÉÎôC”ƒP¨Ç€™¥7!ÓÊUx*}Êõ¥/"‘ï´J”þ 0öUj2é³*vÏ ïˆž´:uîÒŸ°oÊJc7”¾/}r;9ÿIÜùË£œ¿î± =/ææzØNktýçŠDúlŽ¿Ð-ýrÙp·øU¡%}ÊÛæZÊ_ÏÓK¥/¶*Jß“ ¹Þß‘j»)–ÒVn Ue¤OˆÄ€·W¸\¹„šö4/äŠQ‚ cÚünÄ– ýö±dJˆ.+°=`óã È´2L dnôE$ÂNËA‰Ò_Žas€Fg¤Ò/I³ŸÆô)‹°;u¦q‰ ¹‡Ÿ Ôtƒ°/ývçÓfä?¦¢½æü™]øç˜óq^¨Ô1èæ[AúTÓ;ß0=ý4¨£§§·Wi—þjþ-½ùVrz=û­5¼s¯%}±U'é+W–¾Ò‘gïh5 Ü6ú¿ÃX˜ŒÛãivé—ü€B  ‹ËAÉ1€…¦žÞM`Ú»)›ÒÄßUgX¢ô ÁòùÛߺ¡jOJ9°]v Ô”YÈ•þ±+"™Û6O_D"Ýi”(ý>{RRéGì›°–”¿mt(R§N9NÙl¿'ëpÚtƒ°/ý6ç¿[ŸÕT{l_zà#û®s ‰ñ³F¹ë•±J&ýü0nUª¯¬ùõqÝíGí²žµ?Nžóán–´fí¯>´¤ÿ–Húb«ŽÒ_¾²ô—]Êf zbOÙ ö9PjHê jÖ˜óÆ.­º¦ôµºu&7œX£E¼”Tm£@ÃPÚ)ay,}uÀ’#,‰ô÷€š¹×בÓ!䀨 ³ ôÚ.S•øõÉœX9ú61!’¹uwäŠH¤;-‚¥ßmýFCOA.ýž4P[:8š„ž²ä}¨Zzdó27gõ5°k -N—€ã›ö¥¯«›œO%Z¼øÒuWóÁÈŸ÷zn ¾³ìº¾ðÓÔ¬®á_â2éÓó˜_k¬õêþ»szÚ.ë°1çio¿þÚ4óù¯÷ßÍÙr§8_ÿý(LÒ[u”¾ê,}Ã@Y­|úTYeYp˜ª¦VìAÖä&P˜Z\ª Úõ¥ÏJ@éh‘±^C ‰ýl(:‚jÄXrŸOb@P„å­ôUJTs„%‘¾¶cØ'´¸dÝ*º½Lއæs@¡åÁ<9èºd `aq´¼¼Éܺ3}‰|§EPâ˜~ (ÆÓKŸåwa¦Acúb£, {Ñ*ôhް€Úxv¯Ltßœ°/ý7¶ó©DÎ9“GýÛ~FÀƒCœò¢‡I¤OÆæ;Œòt˜S^…ÏéÏÚ+gõÒ½!k›Hú«¯…gï´·ê(}íÌAú.QÌRhpXoäÍÆs¾n–Ã^šÒpþTlµ};ýt©ØñËyâ¼ôƒ.ªÌ¾h—Ô_ÊÒ÷aÏ@¶YÎ, ¡9ÃÞßPŸ¬¸Ñ÷|é !ë Ò~z7’UY[6¶F{í çl²¿1YÔ¿³­Òr œ9·vã­Æ®Ùªúµé~DÅ­l'>¥’*k‹ò1¼¯²guÀïþ[¹¨JjoqZË¥4Îɪœj,³àä*°Ä¨ûáÞÌ9˜I™*nFæŸà§Š´u@úG$;íŠe’|ÛÛÖ_~BòFµ®ðtüòÇë~b/‘÷„°/}{Êþ:û¾âýÏ%þ –[IÃJ#ºJ3?¢Ë“Ê?8×¥ïuö€¢©ã·»ˆ-» Û}¾ômë¿a·?ÿaôï0üaôì eýðw@ä'C߀$éì6&3¤çæ×€‚Û°Ý'ìKŸÅï=š™ýîhö4/ŸWèþ –{IF×Zgúd}`üÖ¨¬yµd\ý$OšÝÊ„&`e'ã lg¾ôý|qó[¹H× s?dýÆ”O&„ b·3§¹°[Øó ¶3a_ú~â_.{°Ælº"(gXžE+Ùí‰Ö2ô H’µh’ÝÞ¨ÝÞvÃÿc§N† Šú¦£¯Û‡0*Dõ‰]™crˆÍ€7Á ÿKx0“$Ìéóú^U]^ÿ¿»Cì|aNŸÉzE÷ ŠÝõ§È€í!N_¨Ä¸. ºo(kIæØè§Øsújæsœ7ÝР¬µeêF)UŸw…9}²ã{Ñ ]JÆB†°ï súÔ­í1Çg3öfÝk(k]Ï—!+/vîGm.ŠðtTÏ>\ü­¶áÝMɯרà„aiA£<‘‰¥©’û¾o §8²à¼û©„ýHx§ñ•¾tÔ’tµ„tµ„tµ„tµ„tµ$]µ$]þ ]÷j éV¢í{­ZBº•è†ãØúØG-UAºtmÓɉ„*¨%¤Ë~8FÌCSE룖®ý%b9·Jµ„tók†s<Ì?ð –øC¯ü3Öõó×/ÿ¯¯ ÀoJ¥Ïúß×x7}[s¶>J¿ºýmŒw×ñû¿\ºÝ[üPÃlÀ^³SÏ6hÚþÅrÏ<Û`?œãi¾åý€n™âéê…VbÍpŸM½OýÄ{Í9>8îš—”h§øhzó©Ÿ@s£H?۰׌_-wŸú)´Ã1 ³Í éo8¬Ÿà~a¶YÀ^³XÌ6òé†Sf›µÒ³Íjéo-ë§8¤¿5Z “îyHßl³N€½f1_|ê§8¤o¶YÀ!}/´êy˜µ5Ì6“ÒßšÌ6³ÒßZf/´rh6{Í­ån¶ õaÖÖä°~^€Cúf›>Ì*³Mj²ß}gç~ÒèÖ8Ž¿Si‚̲$¯,mºº.$‘¤›ÊÊ…³(—4¹›#þ_¥AàFáÚ*Ú¦EïP@ñz­Šhmïý7Þ燓 ígúû0ðšwÝ|óä9'£/šÏú}š± ‡þðþ}M§·kã¿ÅY.@H×ü쿦#üà±éãÚ&@(ìc$iš;%kW°¬ÒŽ™dÄþÕî‡r‰å×)€!Ú,îåû³>±¹™p™Áš¬Eyðw¬Ýòn™ÛŸòÁ~Ù*ñðGµ_É~èM `È6g?äû³õö߈>¸Ï@ÉgŒ9‹ß£X2ƒŒý|öÓ4ã/úÊŠ 04úÆj¾_ëzÌp—þ¯4Qò­ÝÞàWö+ÂgúƒºŸdQãçn²%(ù+!†*¦ûšýÚzFô½ ÑóäË!¿ûU~‘ýðƒË¥RÆ ’C–‰¼Ë÷¯ðOoŽú€è¿ˆ3Æ“ßSüZ¥v«N_ú»Já¯KŒÅ_ ¼ÏJ„l€áŠe7 ùþm­.dlïEÆüÇ”X9 ]fcínàÕÿ)ìmooÿ‡Ð¿÷“ÿ.--F'ÙŒ ‚èϨ9¿“|Õ{å”?²ü4ïŸÔ«Õ¢ÉâýßÝ|BóÜ×”#ü¼(ü¶Šþe~)< þÆý}tdlq:ç¥è¢ÿŠšou7¿ÖUü/Ü™ø=%ǧ²û5Qý¾÷ú)D†/3Ÿ´ŠÀÒ“'O– ü³£|[!0:99ù|ddäO2111öøÑ²–ÃRßKýˆj¾L¾cÈÿrëì쌾üGvŸ¢/ÖûTýˆ‹¢ §ýsŽòžˆÀ?Ÿœü¼¥¢_{ütnîÑ£—/ƒÁ ‹NÅi“¾‡ úÆÝÝNWñÏ¿œ+gç*ü rR¯Qõ¾£oÃð!ú¾ÅŒñ~lvöñÓ§sd¶¸®¢ÿ!8åû¦§§ M3H:Ó1è{¢¯3¶sgÎ?æxð.ÄW„ÿTdŸèV‹I¦»&ú™œ_#|tyyÊïÇ}þ µ——Þ¾÷éÉf³ú­L&ææ¢ŠòæïŠ9¿wÌ?oùM邞 ?-zä°OÕ·X4ä–èÄô\ÚÐ 2?Ÿ&ÔwÃgvNrßEh°§Î ¶ç¢gfWóˆL~Wð/›­&=uÿŒœQý‹»%ú±XFW2BV3ß«è¯E²n= ú ŽC\Õ|"›/ƒß&Òß’ÙçþØë˜lÁ5Ѹ3ÂëFðƒŠþz÷3]îYî1è«æ;“étÅdö©úrÔ¯ñ¢®¥§§vóm3íÝ袑ˊ~…¢_ïmþeSÆþJºäZ­V³3ë×Oj%AôÁµ2¹¸UPÑÿ˜ÖmDœ©SÜÃÞæ7‰³÷Ѝ~³%V<ò0·˜dãˆ>¸7úÓ¥ÎõO†gß´ˆ¾™–Œ~E]ÜQÍ3>wM¾ŠçúêZe_nxø¨_/1¢nË&×wV5DÜ®A_.wœs¾L>µ^|¾Þþ÷º·úbÔ? QÑ·ÒµdçúÎú´W¯ï¢¯uúr¹ãlþõŸðQ~‘}U}>êŸðk›¢n¥¬¬Ö;…¤G¯ï¢?í úÇ /×ù|Êïÿ†>ôö°ï\ðÔ‹ÁèLÑ_±äõßà$ý0K:}ÇBŸ'ßÙü›››o7m"û·£~Kú'5“…ñÂ5pïõu’»µåú“\€ã)ú• ?ÅUÍWs¾,>%ÿד}µà/c¸÷(7‘ÊÙ@,;íý“\@ôCŒYýroôï4ÿ›Ó Q³>þ©õkIº§ùiÛŽÙóúŽã$×çò“\€mwƒ~ƒš¦ÎpEóÛÅÿ.8ª/<T}ù“…ïk¾·€fxèúN°œo+ìxò$ýßîwUôbп8o¶º›ÿ'ÿ·¬þ×ÿóê«­¾¸¿ó{çáœF¶åáš <[âíÊóœ^´Kâ€4 \´)ùéU< –pÁ‚‘Jÿ[‚BlŽ/‡ÉsG“sÎ à<©òÞsï¹âª«EÞð0î϶H}:UÕç£ß½Ý<¹üˆ}¶c°;‘3¾ÓWJÞ•¨Ç¦ méõùñ‡KþLwK·ÍHî;r$×Á‘~ÿòŸE§ÿì—¾lôß¾©Ïç®ÿ’ÿÅÔîSÀ³õac(—›Êr¿“ç[3 `0õ¹p2EMA›R(ð‡<@¬¥‚öÉU¡¾3’ëЉÒ?ÌÓ'õ+9aS4úoópçý°ÑÇy;ä|®y¥|DY_¤úºô_ÜÀPÿìó+ét¨5é—@ÄÊ·³ôÇféÜöÒÇ‘Üçwgêÿ['Þ]ÙÁ‘¾¥ÏýçžÝÀtç5!ý÷ßÿࣨÑ'ç“í‰/8(}Êw¡þK<Ô÷܉}~`¦5é’¹Tÿp x;KßºÕ ¸ý¥Ï¯Éýê;t¶ôÁ#ý_a§¿ñ‹Øè¿Æÿ.6úšóQñ_š­þ§›Ÿ|²õ±õåþbÿ1\Ѿ" 0•bwÒ·³ô‘N‘>óÄW;'ÔwpØw—ã>÷ FúæF_NÕÜUþ6ÿ‹ÿ¨×7å;ÔéãH®Í¼[“•Ãáð(C–ù3YwOøüƒGÝU¦8öËr`•„×zœUÃsç«{VSÊ•<¬A;W*«Ïâ|Ñj0Zõ½‘Q£éûˆÑŒôzôúŠëî5C,ïÈÇãåÝ GQèDµ”sUÍŸXa‚qq°M ŒÕHi]~«•”is•ùȪÁÌP‰¾Ê2–—'ÇÝÏì192⎬ÊáÜ#íØ´3žrO‡‡úŽôÏ.ÿ;}žîl¼ˆÒûíw¹ôÑù[¼ÑÿlSf;È67>ý×|gëC½ÓÿÕòÙ&ÙŽ½ð‘H__ßOò †éAüBŸàKL0ð¨xyü‚ðÚ=üé9ïiþSÓX¼˜€L>Â$ÝIÀ×s# ™„@*àð*Æ’&Çš¾¯êW˜Z.>À7pýad§«˜Á§Ó«Jï¸ÿPÜ$ý©©y&8d„eA*”À7’n¹pŽ RYHò‡µn-Š3…©1 “¸KUvÁ*˜ºÈì19›'y79| §û‚6¿»òß=¯}{Vç…úŽô{–ŸøÕS˜îðHÿÍ×PúF“Â¥|‚?¥Vÿ3ný½>J¿ÇÚùS´.ýžƒ}ÄñóŒ3ú˜z}Á éŸx¨oô×g”‡IeA2.ºÑäiÂ,HÆš½Ïrªþ£å ÉéÒ×6œNQK/ÉÇH¸føò#Œ°*(-€Äf,b¯@uû@²8ÊS 2’Ze5Ä%f‹éÈS‹t¬+éÛ´ÿåYz¨ÿ‡Î õé.‹Fÿ9Þ迸+ý>ÚâþæægŸÕ”ô÷BùŽÞé¿+î©ÿâsË£–ÙŽÁ˜qËÒ?Ïþò¾ Çy¯_å9ˆ¯ï¿ðøIŸsüä鳌0Ò÷Ò _öÑÈÎ]($!m€PÄ]Èfýw$ÄŸT›¼_J@¶˜‹Lð‡£åK¥Ü8@ÚÃâQ7@2u1fðŠä¡á€üº4`6tÑ=†æ³”¾KÏô­ bbKE€D…‹¨Ò@pvMdCÅÞTŽ/s†æáeÿ™°»¦UV¦¦ îðœüw3LGKƒšôµ`[Ðæ¡þh#Ôÿ÷ÿpBýÅ‘þSÏm<»ñâ›/kÎçÒÿt“+_'å›[ýæ;{¥Ïçl¢ô-³2Ú¿UéŸèë; úéeì~þp„¯äìIü˜¤ÿÐR™5ð,ˆþùÀ4cöÅœxZ>I%‡ ÷*0°ÿû^æ»–…ÉŠ\.æAIðJÚ8&:p*N®;Äë'Ét«“ÖÒ¯&ņ‹‚µD"/4_p‰’9JwüCš$_N&*Œ0—¬g†E´¾(W¹°˜bL<™¬šŽu¦c>r,YµCšôµ`_Ðö¡~ãö;ÿÔy·ßqp¤¿,;}Ñ迉Ò[HÿC.ýÍMÑç׿¬o[X¿N¾ˆwvT¦Ò_n}®¦ôOr§‹äÆãñÌÃ;üÇÄ*süãIún¦“WA¹ÊÏTX f¨)$I)í.ƘRÿKx÷ßM©ŠPW¯\®_…1ݺójX¶+ ƒŒ䆻-¥o ’¶‰&1ôÛK{2,¢™(À43c.qQ‰8*0ÄÉ`‚iÜ{JqÒëbæ#¸¥Ç-¥o_Ðî¡~ô·|çïP¿3q¤ÿ —þJÿòÛo_yG¦;›(ý6úõmÁÕ«ø—¬_Ç|§¦:}%ý—_ÜWú†Á£ué_À1Ü,Qôíâ¯NFnþìgRú™Ž‡w™úvÆÐ~’E€8—69ý•‹q‰}ß/P¯,âûKb9ßîk¯æ¼J˜d ÒâcÚðºßJúC”ýM Œ»åï(ã2ß @¢,›øPÔ´Zs‰`©ñk„!N ±‡˜F81¦a>ò©ÝÚ‚•ôí ̬úAÿú—õ»zŸúµ6i³Â:'Þ¡H¥å]”þ–”>:¿ÎÃ:)ÿï×y¾Sçþ&—þÖÇ&éÚÝf­ué;Ý'xt®eÒ§óS)ý LçR¡Ï‰‰V<3jÁ"5¨$}Ë÷‹° Ô$-‡DöJ„”KÆÙXcÃSÒŸðõ2 «‚‘áÐxz2 Rú^€œHwæh¾éá8Ó0•œÁJÀUŽ4NN”ÚrŸ¯–𘼚ݭ [Jß¾ÀL4 í0SÿΘ´éàH_kô¯qésç^«ÕêÜúuÒ=²ÍŸ!u‘é×6¹ôE§O_£ò" äZöú·.}Ö­¦ï¿±¿îÓ9HS6™N¯Ifƒ« ‹E[–þ h 6‘þ<è̳Pców†.¦cQ›I¿Ë!Q”½zÌwð1—˜¥?ß89#¦¾>Lâ ó‘ë'Öe-}›‚æÖ/´Åíwžoä;ÿéä;7eÓ,ý+JúœÚµ/ê¢ÏWÊÿD¼C™>Jÿ#”>uúûNÙ,ßR§j7¬œúéÏû°Hò; 8àÀ°Yú$³qFéƒ ¯­ÞJ§?–“„s%›NwÁ\÷»÷íô»³q³½˜ D(,u»½4=ˆùNÕÊJ³± èÙ¾¹dØïŒäÕ’¤d NN˜Ž÷¼M§oSÐÌú…¶˜´ù¸v{å?vÞ¤Mçâ¬'¸ó¥ô/ót;}r~SG¶¯_UP®_ÇNŸÌÓMÞè“ôq÷…'—Ïþ¿<ån.ñûr„¤/(À~ÿë•I¾ÂJú?d*ºV™þ@¹eéSPM4‘¾GeúD·š­Žö3I?Èw2Èfc É‘ôùc.•¥7%]³~}²¿©¤0M[\e% &Æ%u–ùBÅ2Ó'’0h+ÖÒ·)°¤Ð6ÎgNÚü·ÆüÎËwœÛ0¹ÊõÛ„ò¦˜| BsMÍÒŸú>M¬_h›I›‹r;1ßqpn¸&:}’¾pþµkÒùÔé_¿Š¾n}lôë¼Ó—éI_|]"J¿É ×$³ã1ìèã÷Oû„ô—ñ¢,œùCy5ÖOð?®Ö®süÉÍÒWÆLŒ’NB\I‹ÔÒ¦Pâ-JëÉ›Fࢅô ‰Ö OJHó÷hÃó “ô{}ÝÌŒ¹@è<*6” ]`C˜¡ôj`L]ªuS˜KÂÙiï¥âÈUøÖèäøÖYSÌGîUµs KŸN€}ÁþÖ/´Í¤MWã¢ÜïÀ|ÇÁ¹µ²ŒôßÒ¤/ý›ä|=Ý¡|ßç㸛é|’>Ÿ¼cwkeÃÞù˜êpŽc†/¤Ïþ†?üüĹŸâ»ü¥_÷üéi ÷S–ÒÇ&w¡˜ófè2Qˆy»'ÒƒFëÒǶ¦½Áá$@Úc!}–Ä q»¥êÒ¹Ü_Æn?n8\ô‘pk‹0Aèò7\X˜veAI߯°†¡H0†1=aQRI`P¬Ò˜X {§³‰2LG^‰‰Ú•hÒ×O€m5‡µÏí•{Ÿ|º“óçKTHúÜù—¯Héuã†pþ×µ¯¹ôÍþuù ókzºó®Lwl¿DåûÑs’î¯vNfú®GûˆÓGERpB½~ ʬ¥_™‰ß«tÉÌ:kUút}©da”YIe÷Þ; †µþ‚ØÞ®9FX”g@PÒgSþL¨ÝJ—aU²²‰B5$÷ÁZ"Çl1y|ŠÎëŠ.}ul ÚO¹óçú¬ÎÅùºÄ'ÒÿæÊηØéßàÖçÒÎGë+(ÓçÚ¯óO?'éïˆtç²þÿÒ×%>þ·ØÅŸˆb3€–?uò8*þg”—w÷W{èÔ˜¤%c>Ý –#AaÂÉ¡¸ºK&¥ÊÍRîÖï#Y?‘Rõ´Z·¬,åÉyñ¡IÔ_>¢$N„¬¦Ð8ë‚uÑô'#®]éÏjsu‚ãT~±Ì–%ƈ ï£}(Oà·s¾Å‘³þÁ,–ºæw¥ÑO€MAûƒùγ¿Öî¿Sa…ƒóÅèO ôßBé#:}lôoܼy³ö—þuékڿΩsôF_Eú/ªqÜÿ¹õ™'9ËtÊÁc=º×J9|݌ʚkÏæãó®~»uâ¥ÒHÓÏ»èè<=®^í@ ¾-ˆÃ¢ Ç•b{F*£¥83C%´Àh­x’“Ce­y¹„¥Ö'À¦ ý1ç;ÿöHgå;Žô¼ü'=Þù;}eý¯9×å}üy}»®IŸ³#ÒË*Òÿñ_µbýÖqèÉ@ºÒJ뺨bœ‚÷u°Ÿ¿CüË¿vV¾ãàHC}­ÓÎß’ÎçÒ¯sé“õé•ϑø×ôtgãWéÿZßÁ3zq`‰µÂ!€Dh%çð»þ»½;Qmãúâ8~ebÙùÇ’ø³„Ûa« ( 2lBCÄ*[!†Â­òyC²H‘SË mMBEMÁlb+e/l\{´Ë¡çÌÜ™¹†‚í”%>ù}k‰æ>ν3j£ã÷;«/6¥å" ¯Òú)ߨŒÖ;}Bßß’úƒ©ÿ·õ÷iãÓý}ƒþ.£nwÒÊꘟS9}èã`º-Õwñ«>9ßF'Øïègq”‹¤¢ÏûB?žôûñvg¯wbö¹hÐ?`ó }cþúÇmw¸µµïÛè¿ íæíSvå«k4åqs©}¢°ßñ¬«úŠ8ÊÐÏ»º¬wF;½¡?Ôò¤?è&[ýÿüyÐÓeóÃAŸÐßýfÖÍ~ûÝÕG¹¥[íwêÖí\øý;ÍF-ªñö;¢ú*¥=žôG„þd·oÖ;úùÝdÔçhÍßå9ÿà¯ýý}2ÿOôwyз;)uôz¿÷;¥Û™Wx*Wl@FW›Á¤? ÐýW?1¿Ëæúñ ¿cýªžúHÀQnzêE½%ìÖ&ú|”Kèw̤ßçIŸÑPÝ#ìÓÿQolþ™ïæÛƒ~Z}tæãßϲrÅQ®¬€>úŒþ¨×›úcŸUŸ?ü¢@ËxÐßI} DånoÖ¢ðéÂúª =ƒþîa¸ßÙÑgö¿fï#ñGÌï“ùÑ ¿¥ è#)G¹Ï“­>ÐÐwÜì¼™ôiÔß —úÔ€ëiÌù¼ÜáSÜž1ÿ™v ¤åzOjÉZ×Eúè«¢Þjú#Fßå²ùÃý·‰ø›?$ó}6¿ÏƒþNˆ~sKÐâ·®5Ÿ‹}úü«‰N€>ïwâ­~ ¾‘Dâ“ù”1?ô=]V@_Nx*7#xÔG@Ÿ<Œ~ þØŒúÜÀÊŒùÑœ¿˜Ìù¾¹ã:@_N8Ê-O5bG}ôù´Fá¨Ïêû›ÏŸ8žòÙ|?6Ÿçü™ÿû³ªÎ) /)ÜÚäQ?ªQøê‹ è«’^i™Qÿpl<Ìþ[þ³2äò';ÉB¿¤€¾¨0ê¯X£þú#a£>úª Wæ úúÜðê0l0Œò¹ñ^ŸÚí…s~‡Í/( /-Œú¯jrßÀƒ€~¥¬=[}þ?LòÃöÆùÛürèK h­´r_¶‰€¾Ê—yÃc«ÿYÈþU¦ßOÈOÌÅæçжúõ»ÂF}ô•3«WÎÅês~è¾ùæÆ!ù“Ibþü–žuÐÐçQ¿ùܾ¶)ì,}å”uu¡gÔ7ìýK>GßôÐüÃÈüõ´ªËŽú"追)ø½kè«JAg3Vß°Ïù扒oÌo=ÍêBE}yýàÏcû,WÖ¨€>Wtµw.Rÿ"¹qL]â¯Ãñ!7 ÌQd>­vÜ¢R@_fõõôöz-î~è#qè«å2 ûs!û¦‹¬½‰Ågòã1¿¼¬Ä¢0êOÙ£~ý!Îr‘4ô¹EW¯ÎwX}ã¾%¾m~+SÕî¢R@‰U¿äžÝÀ‚ G_åKÌ~0íDî›ÿbñ9žò‰üR^º5„ÎJ—¿ùô$g¹ë/o¬!tVR'ÏIi>×á›<½ÉÉ„>=nNùs ^V딣”`ôÚØøüÊ·=kÁ³þdê#‰è3û®Ö«Ó s£u#ø\.°øó^Uk÷ÝÈgôBg¤ürqÖ{Y·ú£þõ%oÛZðÔq >B@‰UÿËB5ódóYë#ô<ÖÛ¸?C}„€>’»à)¹Þ‹F-éþ= Pôº,x¶7?”Ã\„€>‚gªùÊVÿ!ÔGè#¹ žâ’gîmâ BòÑG¸Á“ÊN¿l@}„€>ú0ÔÏV3|[ߺ¸ õŠ>Bùeº·9ŸÜÖÇu}„Ä£ð`.æ&5p]! ä®õKÚ3ÏhA}„€>’¯~!;ݲ¯ð¬c¯ÐG²s_³ú8ÍEH:úUø0w5ó[ÞõëP!¹è#<£EWx¶-õù¾>žÍEH$úÝá+<¤~ýˆúx#zoûŽÞp£ÃŽ IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/images/checks_pr.png0000644000175100001770000016360314550400520022741 0ustar00runnerdocker‰PNG  IHDRÆ,M `ýPLTEÿÿÿßàã¼ÀÅž¢¨…nw†Œ”‡|‚Šx‡u|„ry‚úûüòôõéëîáãåÔÚáÐ×ÞÜÞ૯³æèéÆÉÌïñóÞáäëíïíïðâåçýüü”š ÈËÏåæèùùùÄÆÉÂÅÈ‘—žþýþ­±¶ÒÕØÖØÚƒŠ‘öööŠ—ôõöÿþÿùåçð¾Á眠à|‚Ú]eÖFPÑ-8Ï%1Ÿ¤«öר頥ÞmtÒ5@Ï".ðñòï¹»àx×ÚÝÔ×ÙõÑÓ »¾Â먬×MVèê씚ûêë䓤©®âìøìòûÆÚõ®êˆ²ìºÑòÀÖôS‘ã°´ºÊÍÐýööㄊÔ?IþùùöøúoÜ iÚ*yßašå±Ëðèïúx¨èüññí±´øáâóËÎ?…à4àØS[ tÝr¤ç›½í’¸íÐàö Áî‹´ëHŠâñõú¨ÅïÞéøØæøÜelkÛjŸç•ºî·íÙXa÷ÜÞòÄÇæ“™Žµë疛癞ßryÝàá½ÁÄâäæ ¤ªbis\eoW`j¨¬±ñòô ¦¡§­×Ùܺ¼Àµ¹¼ÎÑÔgnx·»¿iqzÐÓÖXakov_gqõ÷øšž£ö÷ùàáäîðòYblelvZcm¿ÃÆkr{ls}°³¶ÍÏѳ·º§«®ÙÛÞÚÛÝ–ºì’KOR$*.ADG¥¨ª+05',1ƒ†‰~„—™›ÂÄÅ159PTWdgjkr|qtw{~€vy|`cfGKOfjm\`c6:>ˆ‹ŽUX[npsY\`&+0:?BiloÙÝàÏê׬ٸ†½•q¿†_·uB«_-¤OúRUûgiÿu|ý…ˆú˜œúFI»Ûš̭’Ë¢ñƒy°‰¦¥£µµ³.*+¯¯­!9ŽP722*86.ÿñÓüßÿÓnÿÊOÿë¿ÒÎuÒÏ»¯Ð‘^ÝÒ}ÊÀˆæÞý´]ÿŽnî”îáÜβŠÐ°„Ò¯}û°@ù¯?”g2`C,ªw6iI-à=Ö–;yU/!KbäAIDATxìÜrãH€Ñ?Ð!CÜafÞÁð0Ãý/4Ì YŽjÊ©}¯H'øÔÿ0084œªŸh¤Ï†‡¢‚f«=ÙÉÀÿ^g²ÝjF¦¦ÇÒMOu±™ ðÍL !›I5™®Ìurž¯!À×ÐlµçsîÌÅ 6R-ƒÑ……œ'›ðEs2ç…¸’ÙFªIc6Jµr^ €,æÜŠ+˜Iµ™*Ínç×ê,äN3z7j4%–ò|üb>/EÏÆRÆ¢P3çfÔÙ†ÁT«Á(ÔþSq–r;z5”j5T6plÀoZWXpNµŽB¼¿YÎèUªYÊ9j¨ƒŒ2&c€ŒÈXU€ŒÉ c2V±•ÕµõµÕ•TQ£/2ÈXc#>Ûh¤JÆû"c€ŒmÆW›2\ÃŒmmG¬í ï¬Elo¥*†û!c€ŒíFì¥ö"vSûý1@Æ"ÓG‡v*ë—±ˆøíKÆ£±hç£èëµ±t½+Ø©L¥û/úøÜXºÞœâOf”@ßÜ©ŒˆÕ•TUAÅþ‹¨}8ÈXaFRe%3Ê1@ÆvRef”@?el-UVR±žFc7nÞº}çîñÉÉñÝ;·oݼ@—d,NSUë­agç—÷~ryq~@WdìþxÕ÷ëQ.?xxyï.>X œŒÅ£FÅ“©XoËû.îýÕŃÊÈØvÄã‰jçbÿzÒ¢ú´òÉÓ“{Nž>  ˜Œ=‹ˆÅÓJ·” ÎîW-?q¯Ä‹çË‘±Ïƒ¯—«;¯ÝÞÿÛ”òKö£K¯ßÜë›×‘±ôö ~ñýŸª“Ê*#²³‡÷ºòð,€"2–Æ6›ïÙ;æ´•$w{óØ[{ @aPÙU¸  7»œÍal.'8Â`‘gœØùíË´¤LÆŠpÊÅÂêËÁ zºg÷½÷ÕÌh„¥¨å~‹_…ˆD5—D=yìj:ÛÙ\Þ?Ž’Ï^—­XÊùv_cŒ_ýößÿù½ÿÕ³1q]©º·Ø=V®„ª Ø€í Y¢ÂNãQÏ—ˆÍVyÄü8>ÄËWeS›ˆí½Ðgó½1Ñc®-–:Ó6à,ø»œ2lÀ»z Ûcóô´%Øe<Ò}\qé۲ƈbaÿ4¶ùÊWã÷_hqᇗ9±âBÃø„¦ƒ Ø›@%]Ãã‘!ŽnÞ½o!âÍÿ‚ÆÆ—·Ê~ilósc‚ÇÜ.*Ú†$ÜhŒ]íùll§5æñQ'Óؘl_cÄjlóSü–Ç\Z,žÔ6$w¥1Â¥ÇÊç±ê l ù¼ÙØþSBÌß»[‰§ž-f`MfÜ.N©5阗3æ+ÏñÍ ãºƒÆ:ø²í4k+³Ba¦˜I(„§­[o³ílƱ.“×Ç…™ok_›øø=:ùúg*E©à†smcο£±ûh4z£Ðp ÜáWa›l>€½Ð˜§±4“B¡Câ™¶ DŒW—çìö³<"ó °A–бi³Ý*pö’Ʀˆs Ä[( Xl³Í’ò˜zû—ˆ>«®ÑšÈëÚ#„ä]¿©ïÏ—X»ÙiXÛ˜ð©³ÆºffÙ!ìÞll!ÑÜ(_¿ï#12}TB“ƘV ìb‹Ì;ÎÓ¡Éhü²Æšˆdš¬„Q¸C|Œ6âO\cVÝ’OZWˆ°%Ÿñ |ûó#E¾?ª½‚¨ß…Æà”ff@ôŽb±‡³ëueIˆk÷`Á^VI»'÷ÁXðþ²tÙÖª±VÔŸY¾»P®Ñj2"–2‰W—=¨Xàqùr¸úhÙüÀ &³† ô”l÷5æQDDýnb×– é¬nîø+-Äþݬ0Gl¦aL‚[DÌ@Ö~6"ÇúMÛËøùËC#Wg`Ö@#?@lÌ`b Œbz­±D½=kÓ0du…+9KpÙñeu Ú£ðæWÍæœºÑ°éXduÌ;>¤¬qdm­kpju» ñ9_‚õ\ßSˆ³Öeã#°¥XP¯žPŠ(G×϶S$À…9.>Þ€L KvÏÖ»¯1Ï4+ê_f•õl¬ZáÁ ±I"š3ƒ(#œ›¾ÁÐ$)œ›Rkb® ›/kÌÈra1-Á;ŠšSëYScTwÀÒe¬†¤®aKÞĦ VéöÿéÇíži¯â̕ƂËvU«g50\¾Æü냡šMcOš›&%¹òžÙ•!k°Vêk©CO,µÄO^#ŽÝiŒ'CÉ4ÎÃhÌãv€Dó£Ê7úMÕ>€;>§ñ°Ä.ŽTð5ð’Ì£“én'/j¬Du ¬Q4¥Ö¦Ê¤1ª[ä+Í¢¬®a%`c¼­;•ÿë»~Ècj$¦½ŠXÄ…ÆÊa¦ÕœÁ“ôr¯šA´*¬…ÈR–ÆzaÖ =„h Ô³)瘮°˜OËFìãôÄRâyWãÉÄÁP¸Å>hÌC_ö :ÿªxf|‘˜!©¤Í 6¸cŸfÑÈŒðŽmQåÁδо}NûL "ÞÈ\©ŒP'o6&\cìï÷Á ©+FðäôQº)ÛЈ-·üà@OÜlèkN\h¬ÂÚ•Õì)x ²Ö#¤Â|vóH¾°iŒüsX?ùäaÑ%'2VB»5;ì]Çkß”?‰:y•Š<…]jŒ'Ó O»‘Oá½Ñ˜Ç„í1a›‹g­1êÚSè Þ-Ct˜c ²ˆY› ?6‘pÒØG¾g1£R¶¦œÃZc:ZÌARWˆ°’CÝü¤ù¡³7³1•mð?¥NÂ6‰Ô.$AQ'-R©Ôõã=F¾01\Ã’TÕ\²’ÜtU¿e‘ÅÊ|| }1õÌÑTü!vEÐXuÁš’RqÒ-/ÝjŒ’ÉÓ£d)PžöHc Û—iLâ†æe}œ/ÿ¼‡66|Ÿ—€CWÆ@/¹ÐXuGzš6Ân¡Mr²iL7AýHꊖÆ@)ÎG$²é[jìço¸7¶ù@âš’ÿÇ^[ì  &FÜMnHl% –¹æÂf‘kÛ«»:={ÌÌJ+ÉP’äaÃ* KPSRêÙº ºÝ£d²Á»€¡ =í:¾ñ˜{&ƒ¨ £¿§@,•CW›Ä1 Ζ°kÒˆ£¬Bú®Æ2ô¡>êЦbi,gï(­Ë#Ää„2Ëço©±_¼áÊÍz ÖÈô·˜üi¥W;/¤LŸ”ÓÝY‡æ;›E*jÅ>›s¨{€‡åߟH+ º hlAMI©Šå"xr©1J&Ì9EqMzÛq¬q˜QSÐí»32 Ì"æéN Ž¹ûˆsÇ÷¦Î#šØWÁÆ;ÄióÀ5Fu À‘ÕUy„˜œÓ1°ù–ûåÛŸs=PR„©‹<&4EÝhŒ\ÑRæâïÞŒ‚Í"â"·bvùÙÚò¤G«3mÙ5æy)ª“S—£d²ÁDmÉ®<í<:·A½…˜4FvhL@)!²Å¯ˆ7üœFÖ´É[Lg.46GÓY“Ñ$G¨Ó.™ýÀE“²ßƤ®a%F7`öè¿¥Æ~õ†§ø7è‘æè1Þqä ±‹ççç?zqM `NCeZ0>Û5v/„ž¯¶Õì¯Zˆ] Ò N¢1Y)2OL7јl0÷VG8ØuyvZíñ˜»0Ò¢Æè¥™/Ü–ì­ÚBÓ{c:ÃeÑA4òÙÂ%ºÑØ”­øîŠ·MfN˪ƒ¥1zi~.²c· i]!ÂJîk"Þéüîû·ÔدI>î|{kNs²˜vìt§’7†thŸÂ&Ÿ–j5榃n˜›€[䌽ÚBã«mû«¥yb*ÓH°«-›ŠDcòRG¶´„¥1®¶g}3º®q¸óóPòÈeá[)sdð©Ü"v}D ²¸AÂè»ÐŒhRª£€ˆ·vÑã„Q×"¬äwšè™·ÔØ&³­·×XPsò˜“Å´àw4V®ò½õ2kØ+‰c ÏÙ¶íµm=Õú·<ß _4gn·išô‹þeòµD°;TVQ}[åÁÝ×»Ê`y‹úÂQ²ºLòáD-ð¬4ÂhŒ‰'ÜÁp'âVÕx-DßPGƒDiZm’Ë8ÐQQY—@÷õîØ£¾pœ‘|8‘@ <+­0cÂþà·øÃôW¶n;¾Ù_êŠiì5»êºiÌhìA¾Æ^ñæjlcii×hL·B·Â‘@ð ‘ðÖ¿NCLðÍ(¦Ä4ö1ÀVãò5¶[-Kˆ¨¾…;J¶—I6œˆ7‡[èqV‹ÀŠÑ˜†…z}þ& ø}^ú‡0'Ic™qài\@cai€€Æ£1½ µXmv‡Óåv»œ»Íj¡ÿqYÇ3ûfГÈÒ½ñã• ÷DœÒÐ6аž LÜêR„G”À†QlPPg¾çÿíÓKοìñÞY¸xy6÷ÖPç©:§Nÿ:íÅG¿Ã˜›;ÍZô*·Þx3²u×lp äÜJŒ‰p¢»q=jlmµ‰•Íß¶¸³Ò~3°¿˜r§{"-£ä”hÉbˆ nµ•{ŠVt°c¹•EJ€î½?,€6‘æíñÝ¿ÄXÖ–EŒNDbLîZ6žšÃ½¢›Å¶ŒiËTÄ/1öù=6oÑãú|?EcÖqÀ¤¤ŽµQÓ„j™ÝX Åë&ƒãQ‘H`l!¼íû2€fÆ2¯üÇje„Y°‰ùÀ4,´íBk]bŒÎj•}ªás0:ðÀh×`Щ“À˜¯W#hs9>Ç$ðe|‰PÃ{¢Pà«ø­0öVÅnŸ¥c`Íòh’ÏÚöÒ2:ŠÌû@Ðò{ÓðG¸;Á7Râù¢J:YÇ}¬9pÐ bű¦?|$1vÖ´CDë*2¢™6`³ VÓæÉêÜʘXäײV3Ìø8$"ú¯&L´y-‰°R2Æ«…tç\jÍT5:R¯ÅµÚB¨‚ص¹ñˆVÕhÆOT쉾¸2m‘Š<ã%Æ>£›@Ÿ¬ òÁ WaV¯ç$ÆúÀZa³°ô: Ð:ø2~À«9# ;Vî/e“ ŒÉð÷ÊŽ}0ÎHŒU;•Ï66ˆJ@bkófHþ §‰mv»Â´­1L673>z‘›ÖŠõ§< 0†Væf£¶–ÉQfn'Dô„ð ÿtÆŠ¡¤Su¬Oà_t¾\±èàñsc\é¼x˜d‰ž~r0Ū¡í!¦óÓùÃ6O¶ùsG¤è"VÝMMþzŠ$ m~ ¼´Ó2 .wc¼ZHw§ïæ6Ö€ ŠŒÔkq­œzè×ëŽØµ¹ñ‚ý%6OnÁι¼£Ýñó8‘i/¦b<ã%Æ>w£%x9¢ohUß6Öö¼#¢½¦i¢•xü„ïˆ|wÄãŽÁ@bL†×€ðÁœ=BË’c¾Œ·-uñ y߸íWÑ –s{8$1´NÕ}vLÔ’¯/16úI$Ò2:Ê)¸b÷wð¦wc¢,‚p»Ußw6¦Ñ‹ þ9•›r ŽK¢œ‡L0*²LlùÍA Ä“Kê1ÃXÑE®º´‰îáµÐᯣi¢ÍHñ¾+ñ3R2ÅóBâÙØZšˆî&(ST¤^KÕJ=»~¿ñmÕ®ó1ßÖ[( ‘Š<ã%Æ>£î{å'ðð>Æn€°[ºÀŠþ¬ Ìùà )}c"œédñ¸ØrÌíÕPkcG=»Bžw\ž¼ÅX…§ìò‡[P×nº)0pJ¦er”S.‘$¢!®1uˆ¶Q&1.†NA¸¥#V)cÑÁc¥ð`“ìÇØz(  HWÿƒ O櫵ÌÿaºÈUsÀSÅÄv§ t„É‚y/GB†xÆNTÛ4£#ÕZcr׿ÆëÝp8/ý v›pÃÒ±0©È3^bìó7Ú ùåΰö>Ææ@w?Ðp¦ºjeÿ$¼ýV§ÀÚ™í~c2¼†JºåøÍкT‰Ô5ÉüÝæï“ô[ŒÍyFØ B§iµ)±>É´LŽrÊ ¼*m¢åÌÐ%w‚k1Q %•‚ts|k'c¿ îJŒ1ì9{‹è+°ÂÛš `‰}Ö#zÄ“mþ&ÒŘ<úT°ló­`¯hZÂD™+¾N®v~–)Þˆ±¬:qX‘‘j-‰1¹ksã©~RJOqDJÒ@¤"Ïx‰±Ïßè%ptü_¨¿‹±Chy>‹ïü7-è½Ø˜ ¯Ïĺ^þÿø=/ T|†pŽ‘Cî€7¤16mŽ1VÆPE\ Œñ,™–ÁQN©úx¢ï¨Ð*®È¾Œ‰b(©¤Ûi°IÖ}$Æ~\—Ëëhðƒœ Q^ÖP€1´PãÉ%¢3ø÷¯“5zA2à÷i^›¶q(M´99qðã_R2Å1FVd¤ZKbLîÚÜx<’–®§¡Ø"qÆKŒ}úF^Uzc  ‰c¢ú@/¹v¨bjý„ÀÿúŒÉð€±ÇŒe=œÐ/`ã]Œ]¢e©X#ÆDZ&G9%†#ªà€ºÒ®À˜(†À˜pÓWN-cÑÁÿ‘»×ãÚƒØ2 p (OÌ5žœ V¯Ð+]döáUO1q)‰¯ÔÙ4Qæ,wÿv±*)™â?Š11±ksãb@Zcà”¤HEœñcŸ¿Ñ¯Ê,`辇±’~Pª0r§ÅíÀÚ{Š^5c2üƒ?*{$~Tb>ÂÙ¦+µšcü¨:51bL¤er”SŽ‘L·P'gŠz·$0&Š!0&Ü ?*“ÄJHŒEGÿ¨¤]`¥:Å– cÎ%ÒâÉvÛGAcL ÝBw$žAÞ²ÒD›³\»4Ž¢â?Š1…1¹kSãͶþÌjé—g¤HEœñcŸ¿Ñ8F±žÎë#a±.°AZ õ²l(-4IWŒÃõ#ýï€-Çú2–ø‰¶0ºàù}Œ­1nÆ+1&Ò29Ê)§ð Xç4z(ŒÉbŒI· øó˜¨w¤ÆÌÁ1µTÔ#~~ê™)¢µg$MÒâÉó341Yªà%$þ½3¬ka®U!¯16ŒÀ˜)Ò„±¢¡VÆÆ»žB˜4‚“.ñ§Â@¤"Îx‰±OßhÎCžBÕKîÔƘ I~¾¹“Ju‰’˜Ü‘~9¿H”9¢ìJÆDx üÛ‘_¢lYrüæ2¾_|á‚èG WðrïcÌŠ•îßs˜1&Ò29Ê)îë|GîcÞßc²cÒM¾pq­®HŒ™ƒûQ/\<—êjV'#i.Õeo¦â ¨©¸ŠcºˆUysCß«YªÂD›× Þ Q&-¯R…1iÀØ pn¨•±ñÚzüû{•ÏêJñs„5a RYu£öÛ#¨ùüÚÔIyB£ðU?+30ÍÛÄtˆ·€V&>ܵŽgšqþL(þŒHI†s+ŽËF/ܳr|…)Y¥€éö&©ñàõÉ^†Wh c(«½Ñ©&RÒ³dZ&G9E¿qy%žž¨ù¢$Rn'ëÁä窺­Ë€øfeåøÛàÁVuáÛNžóаþ¤ïO|+2€6â0<³Ôø ˜ËñÐ7Õ賋‡¸4Y4·Ë#À[?vÕØ¯ÒÃ)¨Çµž©×Ò§•;šîeãé? ïm×ôŸ†cšÜ’Å©ˆ3þ«ÅZbìÓuWMþÕÊŽë–Ù›*gc#G¬˜êûè´þÕ)YŒh777κêû+ÛØ£œ3®äfß~0ž{Fõ iâÖεÞ?—U­šw-OõSîíÉÙvÚ¶HEœqÚ\š%Æþ§ÄØ2ÿTÕþ]»èr £8~Çqw×lg5뱂Ò«æ"­’" jU»q·O0þ9x£S«>¡ýþÊó>Åêã—gÑøÞdâze2v¥|ð¹i¸Ü€”1e 5Oýß}ü«{›WÝ¢ûñÔýæ={¹!)cÊØËïÿöeç¾gp‹f¬}÷ç+\I¢:(c/úéc'÷ûòØ©îüè?^ÆuíùO?ýWÆGwßñn¢Œ‰ˆ2¦ ÕAeLDDeL*"ªƒ2&"ʘˆˆ2&"×eLDD‘ë’2&"ʘ.t2>Qnà x"¢:(c"¢Œ)c"½PÆ”±×K×-_ÇŠUºÙitŠØb×[nžwð:¶Å±+s…cþ.gznVüoJËv"džH”1eÌMØ"tìºbãb‰FͪLH¿Û²óÊœØXG‡>Éql +’©ƒNÔÍôÏX»SPtÓ«°@_D”1e̩ة<4â”FšubÂeƘ³“Ú;KØÉkvü¬+cE£ìL±Æ4Æú!¢Œ)c¥Ïj”e—H¿0$Çî" ÉÚˆù,ËÌVèÅ^Bw2Æ ZD)Ét¾prs6óÉ¡SNr¸3eBæQåäýQÆ”±œ¡1%Ït÷”u/øNû L€Æ`¶Â×”ó팙øy$3¶9’ÇËD²ØšR’I;ÝNH½QÆ”±€9:Érجä ³ÞºÈt'c!VÅdy60ÿàu´ŽHgkíœôÐŠÌÆþD”1eÌ&9ï•eÚäF³CšŒ™c&cZ!ýŒ£å›œaÌ ›9AÇ!§[S·óV»>ˆ(cʘÇ-%08 ¸d2c¹u2cG'3æ‘Óu$ë­µ97jôADSÆ’y‡i~„$«$ï“1gu19ÙÍXn0¿QÆzzQydê¼àÌ+Èœm­’1z$¢Œ)cfg€µ9yŒV²GÆ0±Ð‘Ùfí "]ôKDSÆjr„F‘T‘gLÎöÉX½œâT¬¬­µ% 1«ª90p‡DD»|ÓÃ%‹”¬çÞÌܪ“ÕÈqÏpŸŒu3Ãy4Lɶ§œ!ƒcÏ­IßÒ? QÆ.[ÀµÈ|ã6)vª‹ûdl3s´³¯‡4*À”d QÆ.[²“18c6‚©…Æà0 yѱ*€ÉºYë­š)ÖÈ)Z)ëeä`3óßÁz­a S’UØÕËNª"¢Œõ (Ëkqi÷33~'Yå‚1ÐKÊÿØ©c@ B%ìfÿ&øÙûBöрƀžÆ44 1  1õh¬h @c=@cJÐPҀƀ’Æ4”4 1 ¤1%h (i @c@IcJÐPÒ€Æ€ŽÆ44 1  1€™Æ€?4vJÐPҀƀ’Æ4”4 1 ¤1%h (i @c@IcöÓØyìÚQOZÙúÇñ4ôâ?AÑFšblRiÊuoÿ“4 7¿—SÛtfÔqlº¡mÇ3¢mä·Qà(¢ ‚ó¾ÎÚ{± ºŽ&D&bÏó¹éÚž¤É7Âæ×Ÿ¾~ýé×iÜGBÉXüÕŸÊ÷ç«8î!„d,ôRõ½ á¾BHÆÒ^¾–‰%/giÜ3BÉØ7¥Ô"|‹úø ÷‹B2–QêzÝ¿?Ç„’±?”Z@Ï‚RàîLíîîN‘<ÝIŒZ¡XJâ$„dì±R*…ž”¾xŒ¡½Ù+—÷q{$cÀÉ}ŒšKVR€Mɘd,\!Y]Æ¢$·1j52ŸÅGÉþuùCå¿1¤Ä!9ÚŒ¡PËÄ1jßêkø !{uù+þWNÎåÈ3&„Œ ãÉûÁ\¼‚á$ÉÒþñ¥Œ…b±XóáÍ9â3áÂÊ$|oc1}úÞÚpÐóv9‹ë×§‚1‘ƒÂÁt×åðÌ,ëâðô§9áyx¬žGý±ý¬< }rð$ûdíò {Û{ÊTð"çÒœ`ÄúÖ4Æ’’1,þüuCJ²‘CíRÆr$£™ Éâ^¾-—ZéÐïÊ YûÍ¥v:eºrT"Ù,ô2¶@rÞŒYjIúcBþÓ*…e’ßa˜iMò ÀD»DÍ]ü&¦á9"‹h“§Ö.5òZ,¦ìÄ¥9f™v‡|»$D¡‘t0ÀIºɘ‘Mª¾dv茕#°3Æ6}x^—hÔB&<Õ}ù8´C+cÁ˜mheí«Ëwég,uJ£ø ˆwÉchN—lÃϘµK†,z+¹æ-qdÍ1{“w1!dÙAŸS&»’1câ©ê{:!… [#ݶK²ó@®Hv÷Ò$ë&‡'ielÚ É(æƒKd¬ïÆà«“lyªôš„¤Ÿ£I’AƬ]¤‹l—§rûä‰5Ç|(bœ:6P1ÉØôG¥^¤Ð—z¡ÔÇédlA€V°Í'æÞ"€à°EržUûNe0/Šó ¶bÝ©„/Ï9à»?`‡ìƃŒY»L’|#÷×È–7ë¡5Çì!Äul°b’±§JýÁ€È_J=AÆVà9 ¹‰u’͆‡nãÈÊØj?[7eìYÿ^aúšŒUI6<]ýÆ32‰ ²… cÖ.È“ërÉi²êTȘ5gì2&¤c“ŒMQpÉÂõeúöÛïç &IÎ `eìo’;ðìÞ”±{=ÂÅ5+“Çô¬¦Šd®Ÿ1k´ÈÝ6+q²%]kÎøeLHÇ*&[Tê%®x©Ôâí3–ÿ tF6tƒ¬MÌÍ¥¬Œ9ò4`¶qSÆÐ K~œ®ÉØY‰@‹ÏÍù%~R" dAÆì]°Lž7Ùö_}BYsÆ1cB:Ö¯˜dì…R3¸bF©·Ï§1Q&Y3)Î{TÈŒ•1œ“Ü›Å\›7f,M²t¼WåuÛ yRu²‚V#›d²Ÿ1{DŠÔ Àz¶¬9ã—1!¨˜dìw¥¸"¡Ôï#È;n‰d1à{—,—/JdeÎÎØR‘dÉíðæŒ¡L㺕h‘ìÖ\’»ð<ï'ÏdÌÚÅìNþ?€µ9kθeLgs³_1ÉXö‹R!\á|PïoŸ±]axÖ*4Šó°3†ú:­›3/I6ß\—±l=q øSë ýŒÙ»’.´=’UkÎXgLÉæÿï,áa ©Fž]ùN|3OÒ-ÀÈÕ:$‹õ)hä .Þ¹$ó›ó$b&ck$sÀÀ‰™Õ\+$ÿFÀ 1âÉ.µF8ãdº<¶w1Ó ­“ܵço/ĸ‘ŒÝ ‹[1k“ú&–Þ8¸Žóé—p³Õ­­hÿ†ægüwñ©ÜÚ,npÃ.öœ{JÉF“±Qk“¥íÏøž.‘çBHÆî]Æ¢ÔJ]j•!$c÷.cØîÒÈÇ „Œýƒ>•Ëå7ø$ÒåóüEr5‚ÿyÿa§ €ˆéŸZo[ˆÆ€³i @c@c+ÐÒ€Æz€Æ4Ö4 ± 1h h @c@@ckJа‡Æ@¿ƒÆh èi @c@OcRÐPҀƀ’Æ4”4 1 ¤1%h (i @c@IcJÐPҀƀ’Æ4”4 1  ±Énݰ´ Äqÿ¿€È£À À€òœé†£²CÀ±bÓÄ‚ÝêicS6·Ø›/¯mÚ뚦óýìÒzMh…A¬¿Žû÷ åKSÓÍ–×îˆîïžß?\ß!xD±…¦×#A¤wX#x±FKŒc~ž²±F[¨U!Ë:dì™'&“ü Ê0@ÆÄt—(³û#‚„~Ž2 1­%’‚$_§ dì¹'Òe,ð?TJæÄlMJ%gm"2‹–FS(gi×2¦ybjÆð à¼t@£Z*9Dß8?!Å甊Æy¸ÌâÜ¡)”³´ë1Ýé3øÆ?÷­n¾,//íзΤº·kyí–îôò “6g| ók«q‰ªœg)cÈØHŸ1éͤ/¿a#+›ú¼d ôkƱqÆ´ÏEËPÆ"¡ãÝ  µüZ¿× Žh†Ú{6v]CÆèÅ©”¡2ܰ¡×?IBÆ"ÈXV2¶(â¼$åý ¦»ASé§Lõa{˜<“Ž(3™TÎ4‚Œ9N…†*—ÕË+%c³j(Î1í-cfÆ r¦d¬bn×ä\Ûvsʸm;±ŒG½Çvµ§–1½Ø"M0èSâû~8Ÿ\F÷O¸´W%u<³rJÆì:ß ßUî9¯<­Œ5Ť&%üeçL”G’>^àø>âVÜÜ(8"D´í±‰ -7‡mº·^sŒÝO±çí}_ﳪL)]8 y&îiøïÎ ¥2«*kº~]U”ˆÇ“/––+±M‹’¯`neù—¹Øc߯åjØcì;ywã¡ncMÕT'DŸ½@÷ZŒ©qç§øìoG€µã9ÞÍÏÀùlVò‹CŠ|æMGêê`—0vðçÍM±ßi½âùMŽým+œ$º²õ¤üá®T3-«>«õ‚G®ë®â«Æµ•Y;y‡uköX¡b†é…e-‡|Ú×+ÌêV=]Ë+ãÇ)»ÙÖ×ÚRÎÃTŒ%]_}ÿÂé7fV¶ø¸Ú¨M>MÈ«¶¼Âè†U ÍZÙYJMª½jÔ³nDyß«aôúéVkÖ°ÁÄ;(åÎ`oÑuS›Á¿£ÕZîV.=¯ø—kmªÜÂ[®fÏ PzËoŽ]ÀkÝ]Œ`NŽÇŸFb샴î´ëC탲\<÷æÇàt§ÇXüÞÏÍ´ëŒà™×<}s3õã¿?{0ßãs¿¿ÎŽç}Äâˆbâ½wq »;„1ãߌbz½àXYè3å’2(»Wóë;S ”ëÃ39(Ö)4µ–í"^™P¬ê¾°Å¦ fø¨a„ã'¸ç†<\¦`leÊ@JËlèQì=w “KfC^M¶´Ÿ "ÌÚsRUXTG$Ën;¨ÍJ‚u<µÔÞ]C×xþ;£ Cµ©r o9Ï~ÓP+‘j¼ÖÀ˜wj¤b¬¬-ÏcSŸF_$¸®<›M€ÊƒçMtƒ¸ܽ“üÙØ[äß%oäÃ)oOäíxî]XÜ™O±)6´—;qïš7»4ÛÜ#ŠqU6§cq¡×µ+¼Ž†~‰VéYëpÄ×Íp˜»ðA‘ª{+!TU•‚ŠN0~ê„€¼>œ…Æò9Y«¿UN ê ’,;MSËk˜¿‡„xÔ%…ug"’èCÊÔäï m‹e¯‚cÅ:wÇùx÷¾©ü¿ Šý;ʵ¼Á±|ÄNpɬ®bŠÍÈ £¬h#þ¥€i€–ø .³H§™ Ì$úZf8’+atT8 #Œ ,›ô ÑBžs4ýÅiÌB¦âkIN!†PZnæfR™ˆ$ú”0ÈÕvPÆ2Ñb-^Dæ](ÓŠqŒñT5Ör–=7”- ±¬òŽbìü>Ô•‚± Z>›ÄAcúÝ|vcÆïTŒý¿xE c•­nöº^"=Á˜‡4]·èí<—qCĘ qEÌ€b›ãØa–VêA+ÎÃcÔ>P î¬ÙÓÐJáy©…ÿï5 ÿ\¬Ô¢SQIÆÏ«m[ÛA c ªWûö6ŒñT¹…·œgÏ {Œi0‚Z÷€±®çjwÖà4jw+ƺáBñâädücP»ºä¼ò:o'°ÅÿAu 9¤‹¹×ÙŒñŸ|ý³xUû¡/ˆÛÉõÂ,l5å\Y18› Ç¸«‚1K«ÓÖ¶s—÷<œÂƨêWs-:ÌEtÌÅäÚ² X†ñ\À¶¨rÕ¤¢’ŰÒí¤ÃX›ZmÎÊz ðT¹…·œgÏ {Œé1ö.ØoïÒ‹l¶ßÌç…;sI¥£Ë­{ãá7ŒFÓç ÃØ}À¨/Wó§ZÇžÄ7žCàx4‚æÀI]ÁØ¢×”Q«Ê¼æÜ{Ìáò©‚¨–ƒ‘wU‰ ød_ÁWÃÆèpȰN­â³d +ù¯¶ŸPUdiwmCU5)m cñc¼ƒ8Æ@íjŽ lè€ÂRÕZxËËžöãÓ©Þ»I÷ý9` ¾)ì|vê“æüHýòv2¾¹â[üj¡“³ŸbWÃØ\#NÎn:/.üÏæäôÄ·v©¸ œ=ð}8ƒs³ŸvcŠ:mÁµŠÚãç*ãßõ ùñˆ¦¶ ç°¢08ÊÔPkÿŸöÆþŒ‹ÆWÃøP¶lšw5`© {Ú¼ë7`×ËÊödŒm))ÕTÔ¤¢’à³1ÞAct¶¾h•PeJK€ž(UÃïnç¾íähƒ‹ éೌ½»ô x6ÿ"+9n·h,oç—7B`qð‰o.o%ã®>ƒçŽ`ì/Š~!^•£Å;nÑWÏ\­ñœRn@îKÉHŒûÙÒËçóö‹Ó¯Uî&ŒrŽ1ÎÃÂ¥V wùÛ¶ƒ·¡…*5àì(dµ”—A‚IÅoà×c¨IE%Ágcº¢ 3E¶/t,ì´eï´(Bd' c±¥æÜ…›BŒ@ÆzN3šp´®ÄdL+͘+6{18m×øðmS‰EȘ –—¼åßb2–Zh»Ið3ù»OöΨ'‘, ïÝÀ¦è ¤°J-…†ë¹â¢L¸Å?°?¥ExAì°@dвÑi÷¯ÌìôÜìÅþ  §PË™eØYw'9Ï]õÉ÷~ß9I=)+TºpXMdñ»tš°÷ê#óõ þ`â¯vñAm/QAP{ub@ ÖVÃ??Fk H‹?,ßþñW¬ÀéÙ=;¬à)2 Á&€yŽ?– 닳G:xQnH²ÁgÒ‚D®­‚~ÖØüûKùöV!F)­0Ùíà)/©± 9ÀK’%ðëØ hL£Ñ~’¯Èä÷IIŠ ç}®ñˆÑ`΀Ä.µ“·¡yz‚ÿ¦Æ2ù9Qò/Éä/¢1Fk øËÏ¿,8ìç·+ÿo_É"I’Ÿ^ê6”“´é˜xI2œ/¥1FkLqùÓ?ÿþË·_ýõÛìÓÊd ¿ƒ]‹ÔÈã‡øqñß݆ÖF+pa~gA ckj±%K{Ìà ­ñ–a§cU®i?¦Œ%9F­lÃgŸ[ËU%{×R¦-š‰IÄù‰A4šµì Ýc ”\’tÝ`ÜLIö÷ `ynïá6L¸u-×½¾ˆxä—(Z#töÓM·‹{DÌBMáÌ#ÝLêY½¦“ Šéû)é z6€ ×ý€q×=Wmª}’ÓQ ŠqÞ!›ï±Krr`ˆœÙÍ9 •L\µ÷.p䆡Ȼ!¡1ÑK­5§dýèÑLLÐØxâN¶ƒƒh4ZckQe†™- H>Ÿ`Eèó&À"??܆M6ÉÑŠ=ˆmR1Í”$bd¢¢¯j)#‘ù‹íã}²²Tcœ\'“ —] °3dx·|›!J1¢2²—<>R5’3ºÉ'Úå×Vìߟ׈uˆfbu~f—ƒ”ØF£5¶oæ/sÒzÖ³³Ì»Î».i,ÓØ f”É=à”^ ŠP@I"FÔ$ÈQJ™GÒ$'íÃËg5v0ò‰y¬à‘²óaÆy"r >1í•5&z©µÔý¿¢™œ æ»dZlH£Ñ[s£Å;2ûŒÆ:9Šå;ÁŒ´RRŽø´J1¢&Ï>x”ce±B$é†ÞY‹Ëó ù¨Â8â#§" ’ì~5WÔ˜èX«’†h&'jæµ7¤ÑhýG¤É›El "¡U5vƆE> $#5Æ/Ë4V“c€ýa4!ÉÍ‚ƎØÇ#còäɈ#U‘{‡¤ûnE‰^Bc¢™šDjŒ9caCÖØå²E‘l.hìÊãôÎVZMc'äØž”$bDÍoüQyD¯Œló`BV”Æ:˜ÑQ»![O¾§úA“z±e9Š÷·!Ò)<ÑXŠˆÔ˜è%4&šÉIÐ ßæUc1ˆF£5¶iòŠc²´ ±Îý?æVÔØ¹©nà6J1¢æ˜<|þÿy†g) ’ä«{‹d ò3¬R©Dµ1ã¼t­fˆ/˹'AvËpâk¨.5&z ‰fr4XAa@îÊA4­±uØœÿn ¥S~NcU¸óVÔ˜"ó·ç§ hLÄÈš29(<ûƒ‹<½m<¡‰ô0cÀ`R*™*µv€×ê²=WtrȰ꽀í­ŽÈiFrEØ%³}žË¨D©1ÑKhL4““øçW²±!6¤Ñh­Ã 9½¸´#ä »ô8ÙK›½WÔ [TLŽJ1²¦MFvË} ÅÆì^ÙNÈ’’0+Éâa”dÖMôº|ئÿó´ʹy²Ev$ÈÍÝm³:dý½ÈÙ%7³–uÛe×hì9¸h™¥Æd/¡1ÑLNâŸß9m‰A4­±50Ú$—dÆXÔ*T VÕRy‡dÎl”$bd‘“0ù„è¥ ØiôHæ >©8ò5†6}úœÐçÔ`èÓÈÊœØ&I×!;hÌÎP1JÉ^Bc¢™œÄ??4Éœ!6¤Ñh­C©O’ƒ¦&y‹½)ÉHüG:39ì2 Á!€y}¯¤](Zñó"Ðæ>2f±æ­ÿ9yªò¤fL¾ÆfnH:oª6f|ˆxd½wG> ïîd{Ñ=(ŒÄ„¤—1EŽª›’¬‡ü¥}Fçg}’¡dˆ9=:|D¯ÀšÚ¡h&'ñÏFˆ<ƒh4Zcë‘>>Nc)Åq +cÅãó¨M†~GŒešVÄ.׬@åwÛFP.éqp/—¦ ,¦ÆecIÎe-ec‘Tí=$²—D6““,ßF£5ö¿§0d?=ÿü34ÖØŸ¯d=ŸhFÈî64ÖØŸë{‡Šh FkìOI¼šÙ<:¸ý;w`Á0P´ "p cÝ8‘]2h(G@¿òÞðß/@Æd ¨È€Œõ± c2„d @Æ€€ŒÈ1+2 c%@Æd¬È€Œ•± c2Öd @Æz€ŒÈX1J2 c@IÆd øC2d `Aƀ߱Yç½tŽ ´dì‰m×~Ù¯clxNÆd èÉ€Œ11 c2Vd @ÆJ€ŒÈX 1ë2° cÀý@Æ€ŒÈX1 2 c%@Æd¬È€Œ•± c{ïU–.ê‚ j’I‚™© X4s¿úT'ä„; Ž·ò¶Oô_émíØVÕRÔËŠzH)$ÊM.É”[)8-H@@¤QEvÔÛZ+z­ÓVWw×euu¯½»×ÚgŸ÷‡3þ1G&“‘™&RVA—ÿ×ÑΜã2ÇÓ˜_ñÏ‘¦Íí¬r Ž*§Û±ñ!‘ÆÜ~#.~7ll‚4F³Ý4Œ·¶‹÷aWÎýsÓ£ã_ú÷$á©æÎ1Œ›6ØÀiŒ4ÖÉ%@‡½åùíW†¾ü…0Y€‹¬‚ mXe†kJ,wâ+…9-‰³ÃeY@ilƒjLsnlÝ5ûU4¿ýò-Ìs ‚ mLÙ 6^/—“*÷Çv ‚4¶!5æ6rpE9ðU<&¸®Ì1Ü@il#jÌo‹©üÎÆ  ?AÛ€ë4rø;Êßõ2žìÂô¶’ HcRcNŒïû¿z9 "Êï„—2zç¼§}¾Ê}¾÷Hc¯ÃØ•ôÂã{^‘·ü-©¡]I» ^Êd(4¨2 ÍÄÉýaËæfé‡Wfø^ÈdN“:‘ OíÅúè8DsÑç;K{ýKÚc™yîJŠPZNÿ}RR"ÝžiŒÌ¼†ãçþÁðd‡¯JiˆóL¨lü8!&]‹PpÅM:ÔÆ~,vö°[@lm¬k ^‘bÆòVUhckL+d¬µèdÿî&Æ>]B½7ï³ox]䓱 —¸Ç*?ƒóù>€(ô²óï뤱ÕüâëyݶÚʲ-/6CoÅטŠë¡V‹¢±×O`‚¯q{;³z¹»lØ¿{üCCœÏyGÇ@¡@¬(2j«$Ÿ±kð†j¬Ÿ±öëÀq—2–’®±³¦­.p‘[µÆ@„4–ào¾ùæëWÐØ²¬Æ“$Òco/ÏÓ¼±5v³~¸ßÐñx½7éç–ÆÉ­òzílÉÈUó-K®ÎÏÆjBóz½P±ñT¤çfôæÇÍOÓéäŸÜÐÀ½t8Íü†Çêù±N\Ž‹í¬ Ý{×’xÁ寂}'®ó~y½qùëØ9ùA¶^Ò|Û©ö=!rÖcÇûSÃ>ÏD/1ì6ˆOÉþΘ†Òû––5¿GW ÉÔh²Œ*Íz–n½%FVôUeA¿£Ó2”~›¢1u<òò.X«}¹‡[óÇoV²_S5&z°¾ÓÏñeâéòð\ëìÙ2ñ¹¼âŸïWfFyÙÙ#‡Ap¸âÔ˜_ù²Æ*N`Vå{‡Ic1,ö›àê5æ¨ên’`Ïñá*Ù¥Åp^(†ÆÜó!Ɍ͢1ž:'56¸B)ùa¸Z#yÑMH³ l&ÒWhl!$À†õ¡°'¹Q‚á“PèÖJæ®bóŒ`´ÌŠCc×QœÁÁ¸{ˆùÔ¾¯’ÝŒåbL»Ôô(3¹U‚M3ÖHc-é¼P[ÖØ&f‚­mféƒf^¬•qå´X YS%âš›Û-UiÌd;Î.K¶1³J€Zß^ÍÕ;exKpc¯EcÊx°±Ý²±M°L)c„YÚϯ`ìäŠñî”±kºÔ˜ÚƒõÓ*ë#àC%q*­ÐXÅ%ùùÒUceᬋ失µ[ 5¶#ð¶‰&#ûb%9eÎÌ®F÷‹(ÙðéÁÇüö²ÆÜÜ÷ã䢯0yrJÍ— Náħn÷g´¨‰˜å?fX4† - a$ÿÀ€\EºGä´ Ñ÷§s˾Þ(!þ̹)”âÜ\U¸±tœ‹=™šä‹£1dâñ|¶Ò÷Õ’^Ín¤ßbíNàd0–ºÉÞ×ÁXZV,±šÚSÅaƒOf)† Ø¥Û ¶bóJ}_ g\ߟÑÃÚ\"$†Çz©ãÁƺØíµ]¬;¶³Vy&³Ž·äsÖz­e)Ÿw2SjLíÁ:jì8Ÿi¡“ÞõU=rä¨Ï÷n¾Â•ï\¹ÂõÄN»òá ”¢±óüp¨üøeÜ„A[»Å06¶·üŠøœ8³E4v3Jc™!®¦ €{W‘åòI+^.jl09º¶Ð˜TΔO¸iÔBñ£w¥ÆJu1IÃF¼2ö…‹ÇFtL …Ft4£ñÇ Ò(V¢iì6îËx†^¢±º`tßWÍÆ>e¬8%ŒÝr9¹:KcíÅ1£÷é­l×tnc=6±_A ¡¹°0)¤¤Z4†Â‚í¬Fã:*Ü‹™Z7K€4¶]**¬Wꣷzå”0À#;®Y4¦Ž«Ùœ:ëü ªYÄÖŽW–Ï޽†m•S{°Ž;Ç’pÆç{_L΄¢ôHˆÿ½gÎaì]^JÑØiß%¼i'N|F[›Åâhl:2ý§BjH_”Æê¸¯ª€Sÿðá¤ÑØ8ÆÍã墯nƨ-5†á¬Å Ì~ ŠhÌ37™¹¬•žóy.&k`Z\RPB¦zÁäêdHpoÜ œàMIz ÍñbàdÇ×JKíûêÑSciAiS¬Ú ¶7æ¢bj¬±b0ÄŸµj!%Õ¢±6 KpѪ¤²¦@Ôú˜U‚4\qf†{ê®±hLOº\B .¤Ã15ŽÆJÃmÈ-uÙùRcjÖOch£Jñç\ÄÑo*?òùÎY5&J¾{„ÞT®Ýbñ5ö‡åw“È“ðéý(ÍHMHPTÒ%£qs16«¶Ô¦†æ®¢{n¥4‹ Ф#Ó÷›òK‡àâò.üŒ§ó#BdÁȾ±'ƒ÷ÂûÆ–B’é{vRp"®Æú¢û.i.ŠA1Xñ÷°V#¼“‹X[,õGkLÖËnD6‰¥¡»‡±”úºµ%UÑØ^\—ÅÀæ/>•×͘p±ê}YQõ5nÞFÁ ÖPéxšEcêxÒÃó¦ªÁ±–Gcr¼¶¶OÝp¡ö`5V^‰“ªC ðèXùJ]9öáû¿ò©'•'Þ/#ýó×_U‹ýDãA£…hQŸ`+^.¾©Tk[56²Ð§Н±«‘en=€ýš“ïB„Ϋϥî20ÞV5ÎËÍhl‘Ëâjì@tß%,Ê RضðÃ~Lî ¢5V[cEL"#õ}5ŒÓtÍo)¤¤.k,Yæê2{kC„Æl[§«°×¦Ö_bÒ-ßmј:žÈœ+4ƃzlÉâû±¸ª1¥먱2Œ¡¶–)³jìãÓ>‰ª±Ã—}Èéw*Þp}-Å¥ZlÍ›úJb“V‹·¨ÄÇúQ´¨¼8#RsUÉ|Uc˜ÊÈ"?´¨…âk¬ûüS/ˆÔ .$çÁJ€KqÐ|9RÈ€©,GH2Cc× N$ИÒwɦÝ1دj,í‡iŒÛ&Õ„¥ +¥÷§µ¢€ò"…ÔÔ8ËÀ°z[êSc 7îîfœ·R? 7Én¥þ@¥0æy©Æ ƨS{°ŽãÓ¯3¦Æ. |—._±hì Ϩ¼xáD´Æ0‚væ’Ù•7[c_Hu©[³Ær¤¶fÄ™öU¿ª1 ´E‹êŽHUsUÉ|Uc˜úPibUÇÛBs¾õD{ 7¹fܹS‚)¾ØÓ@á1{äÊš-fl ¥'›‘nV5&ú¾&Pcq•Ù€œJ ±ZŒì+tfsµºd!55梲²zØçÅ:^Qh Ñ“k»¹á”ú¶K\}µ‹Ê8˰œéêOEiL«a›U©=X?•›/ÏI3©»ø+øN‹ã: ÀIÊŽ^B¾Ñ“òZ«ÅPc{$;’¹"ªÿx—yÑØÛQ»~˜188”¢ÂÀúTt®ª15_j S'ÜÀÑrrœj!‹ÆlŠÆ;1qžë 8.nªÛ¡Ð³*9IzYÇNyæ“ „M4¾Š7•5€’YScyáHÜ”ª1¥ïkИ·3Ö ÈÉø» œlÆ®C4w„±š'Ähd+j̲Í>M­ŸÆ¶@„U†øãhÌÁXµLòˈÒ¤²m: ͤÆdÖ_c8Ûªÿe¤ø£‰IZk5Ucˆ½›™ÔéRcQ=¸%&Lìœ+å^ü‘5¡òÐ9‚JCNÎùe¤d± Qƒ*eˇhßzlC áj’•=Cáôßþa—ª1Ä6€B™o– ¹‡âåßãø¹8z³¶Ô.„df3´èB^i–ú‰Ð¼ L¤HzÑ5Cà CE$gJ\rñ¹Lª¦†B⪲¼ºTÎ^n Ñ‹ë{ýrÃçöà3~±Û æû„F9ýTû¾FɯR—Ú¥Tñ‹ÔÕýÅŒˆiÕXIɵn¡1Ðj»±ÞÞd@‚ù·pZT˜l)¤¤"Ò,z®ýšHÿ§ü$õz>k €¿‹´µ-_¾*x …ŸêÍz®Ý=¼diÎ5Ö e<–”(á:pnÂîIkÄÖÊúWŽwiK+ÏÞfʯ݉îAsÍ @K{a[ºÛó~ Už¾üqHtþ­"ÎéÏÊÅYÅùK•¨1øn¸¸pü¨¡÷U¢Æ*ÅŒ Ê.£ú.-ÒzlCýcú’ñ]IìËé/âü³‰š£¯X qA'7~m5µÑõòBnk_ä|¨¤Ñ\vZùœÞ^;X)É­¿¾*Ùܽ}ûv:pÒG"C+ésȦâ÷}ÍÆÎD°-y‚ð4·;RÏ£A„,‡G*$St.Ùm¦dÉ:ÝãĹ*túýnˆðûñÇ“wq^¯aƒødùýJ¶Ò›f–D³Ázp®¬ìD(?'O*Êâ̶t€+e‡!Að׿®ý±·þ R¦YÉ´8—“±â±NL`õñ“"5f%P«F½ÖÎÎú¡óêCñ>àç†ÐØë‚Ð×\…4†è?ä'EdtL:ëáøï_Œ}û••zù“" 9 …JÖ[c¸K_ŸM'ETM\ò9Æú· úoÅ_½œÇòÞS‡å×[cøN²^9‘· ¥AÒAÛ°?·‹ËÊøünϪn÷öØØø‰¹966æ óƒæúàõÑ;°08?6Ü?Cûö]b£CK€ßð¦gâ) cn^ `ø ÒØFÔ˜ÛÈáßBzk:þ\ÌÅ»¶#ÇpAëi,v=%wE3«a®Ë°A¤±©1Ía¸±õä'±,Ö± ó܆C‚ Ö ÒX² õƒ7¿ëË*±!¸.ÃÈ‚ ÖÒX: #'° E–ùÔëÛÈ1ŒN b!%Âv“‹Ì­¡Éö8êçONwäºßB‡in.±›6 b=!%Æí7ÂÜ cHün b}!­›ÛYå0UN· ‚X=¤1‚ ÒA¤1ÒA¤1ÒA¤1‚ ÒAëiŒ ‚4FiŒ4FiŒ4FiŒ ‚4FÄ:@#‚ ±Æâ@A#‚4F‹J‚ hQI#‚4FÄÆ‡4FA#‚4F#‚4F#‚4FA#bÝ AÆ‚ ‘Æ‚ ‘Æ‚ AÆVƒÍí¬r Ž*§ÛAÆ6¾ÆÜ~#.~7AÛØ³Ý4Œ·¶‹÷aWÎýsÓ£ã_ú÷$á©æÎ1Œ›6 ‚4¶5ÖÉ%@‡½åùíW†¾ü…0Y€‹¬‚ mXe†kJ,wâ+…9-‰³ÃeY@ilƒjLsnlÝ5ûU4¿ýò-Ìs ‚ mLÙ 6^/—“*÷Çv ‚4¶!5æ6rpE9ðU<&¸®Ì1Ü@il#jÌoT‹)üÎÆ  ?AÛ€ë4rø;Êßõ2žìÂô¶’ HcRcNŒïû¿z9 "Êï„—20ù‡I™IIš‘ /e(š˜Ê …†âäÆe4š…DÜ …Bãðêô•>_\œœ»aš=y62?kDÁÑgPéñkã>¿¸w …_/ÍK ñwtôÃß))‘ÆîNÏ4Ff^Ãqr˜Æ`x²CƒW¥4Äy&T6 ]Ì·î= q2b–î(=þ¹i v3V/µÍX)¼*[XÛª ý¬5v‘OÆ.\â«ü bpÌçû¢ÐËο¯“ÆVCð‹¯ÿå4vÛj+ ÿɶ¼Ø ½_c*öP(T«EÑØë'0Á׸½Y½‹|úe€“¼OÜ%wFxF'(,ˆ¥äg«1W5«vÇÝͪKHckÑØYÓV¸ÈŽ­Zc BKHð7ß|óõ+hlYVãIé±·—çiÞØ»Y?Üoè€x¼Þ›€ôs]ãäVy½v¶dä*ùV%×çgc5¡y½Þ¨Øxª Òs3zs€ãæ§é€tòOnhà.¸ œfþÃcù¢±8õÑ¡¶»ÞÇ¡Ðc¯·JöX๚‘é‚,~5M\þz@~PF¤öÝJÕÕŒl·4“RÖáõúApÝëÍIPX6©{úû"-•ä7AX=›Û œÍŒ5ƒ k§‘®C\´¥± •åwtÂ2éF–ZH¦F£{ —õ̯YÚó{tˆ]_wîwZÆZb”¬£Æôs|™xº<<×:{¶L|.¯øÀçûUE…™Q^vöÈa®8$5&ÏȤ±(‹}óÅê5æZŽí¿•¤p?’7Kc%ÄÊlb\Nc2 MÆË}Äóî? …æÕüˆÆÒÄòo¨9Fü“ÐE߈ÐÇS³;&0¤5ª›´¹ð«†P&d<> È~~zž`ÿ³QSÀ‘Éóåñئ±CÃW…QÒ¡*iëÝ2"¥ï š¸Ê“aÓLJÙ§ †eœkÙe½êÀ)ÙÆCY YS#Ô±îYÕœÞkš»Ìí-U33©¤±‹ ®­ŸÆPYçWRyl…Æ*.ÉÏ—Ž¨+ g],'­Ýb¨±·M4Ù+É)sfv5â¸_DiÌö0Ä…1:ƒó Û˽û®Ý”\‹Æ0yrJÍ— â“;Y7‡»ZÔ‹D4öƒó!C CÉ?0 W‘îé+DwtÜ“§ƒ¡ÐC©1ެ `ËCss²Ç(?΃>q‹§19"¥ï+¹mv}‡fRÊæÜ“B'&*,›¼÷ø!:÷© `šûm<÷“A~H‡USËX=c×€ã¼Áºø›Ûë¥1ƶÖ_¿§'…}êñ8\m¬'ãúþŒÖ†«Ã|~¹t[ÁVÆZ,…¬©ðšÛ›wöuðC'€­‰Õ4/-åß`­n~ÖÎÚ 4gs+Û jýÆRòì¹)¼÷¸Þ¯ÆŽ/lb먱ã|¦…Nz×WyôÈ‘£>ß»epø _T¾så ×O8qìʇ'PvŠÆÎóáòã—qilíÃØØJÜò+âsâÌÑØÍ(e†øƒpá*-¢±\þˆ¹Ô\«Æ“£k I%áÐÁ'cJ!©19Aò®ÔX©Ž“4ш—êd,¬øÈ èrýzïªÜ††×[És)¹pg¹ë`<¾ÆÄˆÔ¾[âÎI3)eQ_R¼ã ‹&yÓÎ!Ñÿ OKËùù^X5¶6Ö^Í>Í’RéNU5k×ci¬T‹½ß'´'"mƶ'½¨°>RHIµh¬Úœ13 3Á”T6À)ÆÄYsaa@©ŸÞʶa—;·±›xãz8Å=먱s|! g|¾÷ÅäL(J„øß;qæÁÞå¥ö]^´âĉÏHcñ-¶MG¦_âTH é‹ÒX×Apê>œÔ"ç“—¨\«Ænƨ-5†«ªÅ Ì~ ŠhÌ37™+4ö0(4¡  ‰¦Å%¥!dª@êmd<;OX'yé7%z´Æ\R! OÆ×˜‘Ú÷àMI:€m„·m^˜I-‹ó/@=Æ&eˆP[ç{ê„W¦‘q²¥iR@ÐÌØÎXs@L¥²B(§M%J!%Õª±M€Øš¬>\èCÔX-H”ú}"¤¢Œ°-ÜÓƒë§1´Q¥øó.â‡è7•ù|ç¬%ß=Bo*ã[líûÃò»IäIøô~”Æf¤&$RTèѸ¹rÚ•/5†©¡9„«èž[-$5&±j¬#Ó÷›òK‡àâò{ÈŒ§ó#BdÁHœ ÁS=6*¹­±\QéˆDíûRH2 PÌù¡zÕ²b6,f™OÆ&å«àEqõ\cNŽçÙ`WQ 6à ö†ÃM¶v c½±bczLiŒ¥5 n°&Ó%ÕûÕ7•25Jcö•ÅÀi4fns÷0–R¿S‡èúܼ/yl]l²×Qcå•8©:„‘0Ž•¯ÔØ•c¾ÿ+Ÿª1qRyâý2ÒØ?ýEPµØO£1\n-D‹ —8·ãæâK6µ¶Ucƒ! }j¡ø» H¦éû3Üìß'´¡óêsÔÜÿ*XÀÙÏ©—kìŽ0 RÿM% jß­»-B÷Hƒ¸žZ»0)^N '.ŒM΃ࡘžÙgC‚'£%ÆÉb°=j:––×&ZÙ¾놘[bpÒ¹…qº {m–BJjDc5A\c¬À]÷9C„Æ ¯†qš®ù£ê±eê`¤ãžuÔXÆÆP[Ë”Y5öñiŸDÕØáË>äô;o¸Æ¾–âR,¶vM}%±I«Å[TâÚíQ´¨¼8#RsUÉ|Uc˜ÊÈ"?´¨…âk¬>²]´×|ºg v+ÙÈÄ©êöØTiž˜½%[4fÖXžØ¥Ô%ИÚwGH2fúèT$ÖïUËŠ¯@¸[ø¤Ê¹ŠÂP^‚§bú%Òtƒ9 qïŽÁÁ„³½ŠÆÐ",UÀn¥¦€Þ¸»›qRÜ‘Bjj”Æ¢ÆÕ´ˆO«¹ªÆÔ|©1LpGËÉqª…,³)ìÄÄy®/à¸øÍg2Ϫä$éad;¡±§OŸ‹ú¹bª”øMå½û°Y¾©Ì /M§©}·œàÓ°g³h&¥¬Ôøô<ïõj ? ï7i¯4u›M '_ ¬Icjˆ¯ô–VWc·d½-«¥ÉBjªUcW-!þ4Ö$Ä\€‹p‡wP©Ïuu"¬{ˆ_ζ*Ï™!~EcŸÉ¹Ú;€\ŒÖ˜¤¢Òwú ՘ⱵY 5战ʞ$°Ý™(–]š çýaW”ÆZp­Sà˜ÀÇÇòØoŽÎU5¦æK‰ÔG@`¿©Šh¬o~dL·jŒç:!},$¯.#u$Bó€6ŠIr©6Êr¹¡¼‰4†3¼{G„¤Æœüð _噢1µï+xŠmº g!ÄñÆ({ŠŸñ…åj £ÆFîõlÜN—-–ÒŸàsÎOÇצ±:)¹áâ$cÅRj±5VÄX‰Ü-Ñ+|Wº½×NMíäÛ)¤¤Z4Ö³¼á"UgáuÌEåÁÔÂùµõ¥¾“±´,Ñùí۳ņ‹~ˆ‹@o£ŽM@Ûë§2m?¾ÆÎq/¡¯„ÎŽŠ”‹•§M‘%ß“:S5Vvé’È* øFkLzlmC•D46˜¤ÒÉ›~+Jc0*žðy|žï‡û¹æRsU©ùRcâ-ââÌôºG-ÑØs<*Û_Ÿ Ýç»O†ã‘Z@ì#xÉÉÉ'x)Œµh³(Çé© u2¦hLÙÅ/•€]{ò¯¡hLí»•S#ØúгâQVœYEalyòDè[‡à/½Ð1ŽÙÞµiÌyƒõÜ)Ø)·¿bF[_º¿¶'žÆ63VÚè1ëe8SÄ> ½µö{twKs¤šjÝþZooìàM¹Ådjo«¯ õ2–Úd6±¦ Z¿–÷©×ãÏogÕè]ÞñbG¿ÜþºWÌñ\=¬:ÐÏØæScg>þøãógÞõI]éWpmøÁ±÷y@ÿ<\á“´ógÁ!~’<×”BRcrºÒ°Bc²XlOPié2($yÒ«$<$Ö˜66‚U?¹/5v•ë™Q4¦ô]áŽÆœtRVnm»ºšÂØäç2¦ïÆIÓDø&•ÂÚ4¦|IßËŸÇ‹„¿Œ´®W„ËÅŒÜ}¬Ð)¤¤Jðš»-ßc²71Á^¡1[ †÷[«É‹ºª.«±šë—‘ÌEå-Æêĸ˜PÊXÚ¨±•ï€ÈTrâ0p.È/#}$‹]ˆÒ|P)k\>DûÆÐck´jlø«W“¬ì §ÿö»Pc*¶EÔÅ|³\È=QéÇñsQbÖ–Ãõ Oå'Zt!¯ÔXýDhÞ¶Bc§zñ]ÝÐ0 r µ’œ)qÉÅç0)YV·A –…éCY<³¡Ï-fxKÀ¹=øŒ_ìv?÷XF¤ö]á“!´N/Æã®Ç*{;¤­ª0š3}t„kkÁˆã¹ÐöÓÜWþÇOd¿øjø­f9ÔJ¡½mÓª&PÈÜ*·ox Ö«×ñ¶3ÖÚ–¯[ )©ÙòÑ©€8 ¹¬jjåKƒ`þ-\arŒ«jµÝ¨µ½É²'âç&·˜«5×Ü0x‰V„ÃënÏû±5VyúòÇ Ñù·Š8§?+gç/U¢ÆàW¸áâÂñ£"„vÞW‰«36(»Œê»x´Hcè1´Ø5ö ŒéKÆw%E°O,§¿ˆóÏ&j޾b ,<ÆuOÜܸµ•ÔF×Ë ¹ €•(i´­sªÐX&§·×¾BÀwð_ÂY ·ogG^vJ¯õ9‚ ¢ö]%x³¸due–@íz±ež>#?ˆ,ÿR‰n¹ ¿óåÅÝ6túý–~èG@-¤¦JaòR:„Ñ’íšõúçªA§áÑ–óœ†3RÒ¦™•ÑlðSs®¬ìD(?'O*Êâ̶t€+e‡!Að׿®ý±·þ R¦YÉ´8—“±â±NL`õñ“"5f%PË“æux àìì^'Ü­»'öh­?Rcã Æ~†èk®BCôò“"2:&õpü÷/ƾýÊJ½üI‘„œâþ(Yo=à.}m6Íqî‰5ÝD&¬¤1"‘ÆèÞŠ¿z9å¼%¦7ʯ·Æ&P/mpÃaxlìø's_¤±×…ßð¦gâ) cn^ `øa#B¤1Ò˜ÛÈáßBzk:þ\ÌÅ»¶#ÇpCb‚ ­v=%wE3«a®Ë°ÃÆ„ Hc¤1Ía¸±õä'±,Ö± ó܆C‚ ÖÒXb² õƒ7¿ëË*±!¸.ÃÈ‚ Ö ÒXb: #'° E–ùÔëÛÈ1ŒN bÝ %Æv“‹Ì­¡Éö8êçONwäºßB‡in.±›6 b=!%Æí7ÂÜ cHün b}!­›ÛYå0UN· ‚X=¤1‚ ÒA¤1ÒA¤1ÒA¤1‚ ÒAëiŒ ‚4FiŒ4FiŒ4FiŒ ‚4FÄ:@#‚ ±Æâ@A#‚4F‹J‚ hQI#‚4¶ñ!‚4FA#‚4F#‚4F#‚4FA#bÝ AÆ‚ ‘Æ‚ ‘Æ‚ AÆVƒÍí¬r Ž*§Û‚ ‘ÆÜ~#.~7ll‚4F³Ý4Œc“CßZx°øÿshrì…aÜ´Á† Hc¤±N.±é°h†¸È:aÃB¤1ÒX–aÌ ~ûíìÌø‹áãcU‘ ÎFlP‚4FÓÆØwßN¶ìáìØ³ç—{öÜýýèÃÙ'ß}÷ÝâìÓ…¹ßûݘáÐ`cB¤1ҘݘãQ°/÷„i¨Ú³’/¿ýö»9 ‘ÆÜÆ‹ÁoQc¿¸?>½0UµçÉ·C§^|ÙPßðå‹ñÑÔØ·ƒ/ 7lD‚4Fó ߢÆîáá»>®1ÔZ„ï¸Æ8 †6 A#u/†„Ƽó™9oóðØwc{œõãÓÏŸÎ?žœúnÏï1èņ|[I¤1Ò˜ÓûVh ƒû;öp¾zÑò‹=aFQcȘá„x  ܆WçÎÀ@¼2Žç ó„PXm7 oó&ˆÁ¦æýð°%½a³=ºVß쇿IŽ8_ =zŒ4öúH6&ÃËix1þâ{¾Ã•äàó±¹Ñ©Çß…56i$C<ž†BSðÊèOB¡ xeî‡B!/XÈá ñõ¤vóç‹£Ã$£Ï ¯À>V 1¨a!!ù‚ƒ -:¬‰Ä-blkt!7c °ž?aòÑ;Gà•8íó}Pîó½G{}Æ©±œ‡âèEY klÈ0^³îrý,­]cŽÑÑQ?il™l¦µvÍsÖÖúW¯±4æVƒþ£i¬pjìC_„‹Ç e}t¢¹èó}ý#}+øòÔwÏ_Üï»Ë•SoߟšâûƆål yíË…aíËåÇÌ#¥ÞbŒÕékÔX1cy¯¢±ö”¶ÆXQÖ¢1½yŸ}cjì"ŸŒ]¸Ä=VùÄà˜Ï÷D¡—_'­†à_ÿË+klO˜ïÜì‰0÷ãil,Zx­#5Òrƒ±âŸHc)€¸ò¹È:^¿Æ$ScgM[]à";¶ji,!Áß|óÍ×kј?÷À}®1¾œŸáǾürx|tñ¥ öÝn¾kõƒçÀÚÞtˆp³~¸ßÐAR’;ÜlA2 u€ÍëõÚ ¤ù¶8ZfÆp½¸û22¦êjF¶[jÌåÍàÇ ¯W“³eŸZ.š\?œŸŒÛÍà©ÛÃý-ñº¼Þ';T¬c«òzílÉÈ5/²á:oÓëõ€$j¼n¯÷z0òA^ŒŒÛ-˜*ÏuoC_Ð,ä5[êäŸÜ¯¨1hd,ºs¿3hýÞ™uX¶~ÛË5f[êKm¿£3–ÆÞVÆúÀD/1ì6ˆS,“®|±M¶äØi[ÆJŒ’¤1ý_&ž.ϵΞ-ŸË+>ðù~UQaf”—=r‡+IÉó#²i,Êbß|ñÊ{{nWãÅÆ¾‹¡±ÜÙgÒöƒkê&ŒŒj (yô Ï'ÆMµðbxv[fòϧ çT ¼Ø¸=âÜ›r’>§3@´i¼ø“aScwB’bSc#Øð8ÒD?†šcw†Bȃlµ›‚OFBÈ#'XPÆöˆ_ïþ“Ph~ùòÉó¡ÐŒ(Y›=Þ~þ©*üÁn^àºèÆc€<Œçƒ}ÜHü8È0ÞŸWÕ˜ÞÎ £åw3ƺk5@´ \n6í•Nquô0Öµ7Ǫ±Þ.ÆéêÊÞ0¶Ö°ÖmÍ`blaœÂýªÆ$'+’Í41ÆzöV ˜§·v›­6ÊX«5&Zò”¶ò*nÑNWW£iÔ®®[OW¿Ec™Ûc76¹6ˆÆŠÓáéØYn4î4ÌøÌ'²sg*ñã…2à¼çó•/k¬âfU¾w˜4Ãb¿ ¾²Æî;46þâ÷ÚžïŸêX”2{ÑØb´ÆOB‚Á¦C’i8îùdÆÐ'J#€\åNa5ÔØ2É‹ƒg($yêΜ<›Š¥±ç\DÈ0p¨d$/F7-íL´DwfB’E?HÔ± ë .†„Æ®OÈËšËâÍ•‚2ÞX{0++j`žËy@çg™äçÁWÕT›zÙÌLêÄÒ˜Évsâ[È7öZ4¶‰™ä¡7J›˜ {5TïT5&¹ÁzÜÀé`&·J© Ÿ.@É6Æ-ÆÐxVí–-mÁ‘^Oë k0vrYc]Lpmi •õpŽq%!•ÇVh¬â’ü|鈪±²pÖÅrÒØÚ,¦.*½{öìÚ±±‡%{8%w½wsl{¦Ã{¥±ÎhŠÉÇ(ôƒöŸÁÑéE9•°á“?;:3aÆ®¦q¶”ûÉ ?¤g€û  ÏôÉãùlèáê­Ã« JqF4>ŠÏv=ÎÔľ€GõÍ-ðãÂÜœr„±Žbwžà-@ÑMÖÍ ¡§¢» ™#üüÑ&,.Eu3'Hõõ£R?elh¬59鳨ìÔäHHö»K‚:Þhaý±…g¢Uy~ïñÃÔ¶ oNè.*vÛ{UùÛ=a,%Ïž›ÂX¿y¶¥Ï“YÊ`†ÄXê&;žZ4ðäñÂO½Ájüž>!ÃE «õd\ߟÑÃÚ\±5VÄØuÈ×íã2KÃzùŒm;`ÏÜÍæÙµt[ÁV”D´ÄöfÛpÍL 1O5ë:X°t²‰m$ç3-tÒ»¾Ê£GŽõùÞ-ƒÃWø¢ò+W¸žx‰cW><²S4vž•¿Œ›0Hck·˜âß!bc¦Ç¿<å½ëí»úûÁø±±z|ÓÅlGøá>@ šÇÁuB¸ùù$y©±ÔšŸïÎCq.4V”ëª'†œvÙyþà >À9Ü6£ðÀœk17:ÄïªTM²yÉQ9 ‹î&Ì›s?è@ï¨Ý„OB¡gn´èüüH¢Ç†ÖL©×§œß9«ÆDÉwЛÊf1EcÒb{¾|13¸-àâ ±™ó§áG®ó™ÅŒ8·Ý›ϳ"×óÐêe~ ¯çôëýÃ!¡±b~Ȥ4–Æê€“Œí†æ¼AwT7{E)/¬v³E,^Ç2’ÁŠ:6Œà¡p¥´ïLìñƉ…ëO‚8Ÿ²(@¹¦CŸŒCWQ 6ÇÚþZç6—wÙÈ& bóŸÊëfL¨eÌ-UOc»Ñ«¦5 n°¦Ø; jfD®[ÄÚ,§ûTïkÌR5&Ý”ÎXþK5fëbûäX7’ÆÊ+qRu#a+_©±+Ç>|ÿW>Ucâ¤òÄûe¤±þú‹àZ-¦ÎÆ~iÎÆ¦øâ2à½Ï7\\ís<ÿnÏpÍâäô;o¸Æ¾Fq©ûa³±o‡f^Ü¿û6—™–Óø8¾ÆÈ'QkJü9iyè1ÿ,£—tHÁ æÀN:¬kÆG~ Íò¬ô~2kj¬!Rîv"amY䇵›¢~6 wPJ7ñÂ3#!Áf¨c³jì1úG©ã]•ÆD&~OM›Í@iDnˆ{w ª±1OûTX‚+#Õ„¥æ‹‰«iKݲ¡@äÅØ­Ô(ÉÏÌ£jŒŸ6½qw7㤸FãÓ¯3¦Æ. |—._±hì Ϩ¼xáD´Æ0‚væ’Ù•7[c_u­ÙbJlì—–ØØw߉Oñ56^­¹Ÿ ?<Ÿ§›ñ®1ynÁÞ0Ѝ3upg…ÆìRK?ÎÉîÐw¨±¥–Gh Û}ø’næñRµ€Ì¡ZbuÓÖW‡’«¹á¢?zÃE ·Q€ªNЩLÛO©±sÜKè+¡³£"åbåiScgdÉ÷¤ÎT•]º$²ÊßE¾Ñ“[›ÅPcßE4&ccªÆ^ÄÑXð¹ˆ`? !Sr‘vïéü³ðúoÏŠóûâ' ãCh!‘÷Vjìî"V{~Û'ìbÓêØ`HjìÔ^mˆ_Lj¬D´þ4YјìÇâÌ4¶4 vS¶šÄ„Áµ›P‹ÂšÛ<# cå\ulVÅ#Âq¦ÆúD‡ÕñŸ<æeâj,ÒË)]îáÔ®Ac&Ö•l.Sz=þüvV݉‹ÊîMN—Óäö׫UÙÖí¯ˆ‹±î†¥¬(9o°žŒgcвo¬-//oS~i¿ŠˆØþZÕXÇÌMk'ùñ€§‘·– ·±Ö~îá6jV¶¿žªÚ$·¿oâš½¤o‹ÖXU5ë¹Sìè_¹ýu¯˜AºzXu Ÿ±Í?ÆÎ|üñÇçϼ듺үàÚðƒcïó€þy¸Â'içÏ‚CüxôøY´ª±òKüpìÊ1¾*ýø טôØš,¦lÝ!þÿíj5&ÖwÈãyó‘×gB’q¹^ðl\hžŸ•šïÆA£YBNÊÆB‚'ó¦Æàެ='½ §+ŪƬýx®Åè&´„ÛªŠîfçdH2¸_NÔ±IùHr…j9xÑ9I}êxá*·32WcŸÊvÝ€ØPi#ékÐÔ›ßöÑw3“®¸ÆíEBc‘/#}¾WjL²•qò¢4KÕ̤H³j,Bšê—‘63“Þ*TW+\âß}Ãòe$Øß.zÉ—‘V,*o‰d#ÛãJQ˜?…Æ"T¾: GPiȉÃÀ¹ ¿Œô‘,v!JcðA¥¬qùíC©[û›ÊÕk ø]š‘ÑôÇÒZ题— ƒ‰mÏGæ›ÍÒÏŃùåº'w{6Ê “ oò–˜q"&2“Å3á•Õ'x>Ø‹1±ë¢³¡g÷® {õƒœŸ´ö#C‹ÙMè{$Ú™rÄê¦þÉ,gh´Sa"4o‹ÛsëëM½¸¾×Ùp|š¸­Œ¹=È]¼¯\=– ài³ôÑ.½?„Ç`ÕÈ8¢µ™a1­¶µ±7þOùIêõ|ÖŽk7÷IkiÎ5Ö J®u µ³; ÷½…BNõDi¬;m·XÖY¿^j·~5¼©Ôô±¿°7Ú–¯ClÉS$¿.hLÅÉ]±ØÁakeý°ÜÌ6¼Ú&·u>×\ƒŽÔR„»[ºÛó~:Už¾üqHtþ­"ÎéÏÊÅYÅùK•¨1øn¸¸pü¨¡÷U¢Æ*ÅŒ Ê.£ú.-Òzl-SßT"«Ÿ Ü×ïj`Aó÷õÙu˹£¯ØRÀÓgÉ;S£I/8å.÷ºÀBðfq ¬@ëÔ Ùn£+n7±l¯;n7˕݆26…»·oßN—Á5,âp)ã•”ô9‚9)Ó®Ë^Éõìøa†G[îÀ’ ,üþD£¹Ý“N¿ß½ÊFwVœ–@ÝãˆäÅí‹mÉ„ØèNéÃJl Y€h6X?Ε•ƒåçäIEYœÙ–p¥ì0 ¤1þú×Áµÿ#Ö«š ¡Æ^ã¸!êgA ÆáýÐyßôÂZ³À ݼKúš«Æý‡þ¤ˆœÅÕþ¤Èëc¿ýó`RDðFD(^›Æˆ ‚xѼÉéXá¼½6pX?ü<È™Š„òƒ¯Ocøf´b•£ŸÛM0{ý?·ëËŸ ½ ƒócÃ-ðû,Ì>šë‚ ­¿±°šØØ‚á‚ 6¢ÆHcnãÅ ©1IÉïg†¢46øÂpCb‚ ­vcî;®±_ô ̼¨Ïá*Kþr|frþÁüÙñÔØws†‚ؘ#icì»o'¿ 38zõí=Ëh£ß~7f84X‚ %&Ë0濵"~¨²ãÅð‹Ó¿ûvpÎ0²` ‚4–˜NÃx±0ôm†^«}KIil}°Ýä"›D“}·ø`…Ã&ǸÄnÚ`=!‚4–·ß¸{÷®ÁF¸Ëñ»a}!‚4¶lng•ÃPpT9Ý6 bõÆ‚ HcAÆHcAÆHcAÆ‚ HcëA¤1‚ ÒA¤1ÒA¤1ÒA¤1‚ ÒØ:@iŒ ‚4¶^A‹AiŒ Ò-* ‚ E%iŒ ÒAÒAiŒ ÒiŒ ÒiŒ ÒAil!‚4FA#‚4F#‚4F#‚4FA[ 6·³Êa(8ªœn±ñ5Fsû¸øÝ@ÄÆÖiÌvÓ0rÜÚ.Þ‡·lÙ¿/QŸ“„ìÒÜ9†qÓAl`‘Æ:¹Äè°¤œñø­äÛ©"mW€‹¬‚ذ#e†k¶ï}޳0Q·Ów¸ # ‚Ø #ií¦Í“ûIˆÛph@ÄÆÔiÌn¸°ñÆ'¿É˜˜¨¹ ;±!5Fs9(ªz¹žŒf>€ëÊà AlD‘Æüjª-‡A.9 ?±5Fë4røûÈL´X\žò»rèm%AlH‘Æœß/ùö·/eNDù1jߘš.÷`hÈh:üȸûòï´€Š£¹>aô†Í‰n–®Áz°©yô`Ôä5Ü ]=˜ÇNœ/Ð=F{}$ZRÒCåõäìÐïV¦ô%%iF2¨´ …8 p‡ÿ9½·#­§zë5~Drn1ÆöÊIÆæc[á%¸k·×ô¤uüà~6vtH].utô ³£ã*Ä¥†ŒŒš¼†»‘ÆXü¼8~Âä£wŽÀ+qÚçû Üç{4öú0Œ]I¬ÆzÜHâܰÎÐfßJÚe 2â<¹ ÙüЯ Çèè¨3<:: «'«”™ô4ÃG cÝ»sj¬âcT¿¦~62Ö‚ƒŒ ±†ÄS#“×~7R_—Æœµµ~Ø|è‹pñĢ죎C4}¾³¤±×¯±¤¤Ùe_-f&…ÑÆ,û2))Zc‘PhÒ!”2Ù¡Ák"—;1ó0z«Æ¶±¦Ž†üÒVÆòáÇB«a[ƒ  jLoÞg‡¸xºÛÒ¼©®‡±<øAj¤¼p6Ô®……æO¬1e02yíwÿ¹^ ÅŒåm]䓱 —¸Ç*?ƒóù>€(ô²óï뤱ÕüâëyÝ_¶Õƒ·“,|¹øŒ¥±±¢TØ ;ÀåàîfMAø‘°«“Uc‰Ù+5k´³í:ü Yµ¸Bz+ O‡RÙ X­Æp0jòÚïÆÏOcgM[]à";¶ji,!Áß|óÍׯ ±çY ’VðûeÁy£4–î=‰kI¯×š×ë ⹚‘é‚,~®¸½ÞëÂòC•×k‡`KF. ÉõÃùÙQBqy3øU3DýèB%¹Ã͆8uxùŠvÞëõ(éñØÍØòëƒXè%† –ÉJök–Lç~§¥të·³4¿G ÇÏXæ«i̾S[yÞʶifîîë‘æ6@œK6X='å˜ó§8¶;ðù~UQaf”—=r‡+IÉó#²i,Êbß|±zí‰Ì¹þp7Ia*¢±(u„$}bZ†n²MßãŸ&†¯ò?ïôóC€ùÁðˆ¯Aï?áöÁs‹††ÔФ8ºPòÓ2qe±)%=E‘tfg;Œ®®F@Š»º €ÌobŒÝÚ-Mfµ2V“’-¿›gv×j€6ÊXë­–ÔÆÚ·xº§««™7ו‚-]…ªÆl=]³Ú×uÃÖÁÛìÙk•gc-+´ÞÕu w/µ/ oºÁ)vX-KŒ5› ¿UÄRÓhj@ËhbØpU¸…MÛ»ñÕRwW·Ç2™ Ɯֵ‰k–vmdk× }ù<«`Y,– ÔvU’Ç›a7zÝ=˜¨Ü#¼®¢vvK4Ä8…êûÑ^yÅLõodý4†TœOÇÎr£q§aÆg>˜;S‰/”ç=Ÿ¯|Yc'0«ò½Ã¤±ûMpõóGT5–$puÌŒÝO8#Š{ jL¡±1™²Wcƒ\?¨±ÀcYt$/®ÆÔB}OB’‹Æ”ôxäc¼ÛÂõðœ¬@z£Ž™ÜZÎÎjfrMÎffRœnÖÊdؼ¹ËÎË,c-bm¢…þˆÆŠšä²PÕÞ“k 0Äl)ÃlvVø”Â(ÜIPP5–™\Ç‹éB®Œ¥5 n°&¬\$±I©#ë®±òJœTÂH˜€GÇÊWjìʱßÿ•OÕ˜8©<ñ~i쟿þ"¨Zì5jlÇê5&¢ó^@êã¿©Á`ÈB_)…À><-±hLIO@VæV±‡JÕØvÃê;Æ6­|Ë¡À¶…qº {…7ûj§éšÿÕ5Ö ‚kÛÕŒÕKG‰Ž¥ãyTiï M¶€ˆ¡ô¸bj̈ܓ@+JÞÝŲ¡_°Žm†dÆ–i¬@(qÅÑX·|¿j!'g’,©1õodÝ5V†±1ÔÖ2eV}|Ú'Q5vø²9ýNÅ®±¯Q\ªÅÖgQ™Çÿ<H]"=ÀP?²È-àIÆ,S ”tH³ æX5¦[Ós±Œ(±&XÆXùßx®­T–š 6îîfœ7pÒûÓZQky¯EcmbÅ&%‘@c›vÇ`?D@…U]«?(e[´vÖŸXcl«örÙ„Æ …]ãÃl†lÖõ¬IO¤1gäåÄþ¸“¹LÞí[©é»%šÔ˜ú7²îãÓ¯3¦Æ. |—._±hì Ϩ¼xáD´Æ0‚væ’Ù•7[c_Hu©[³Æ¼qBü7j¬€<_Ö˜pŰª±1e~§D³jL-„ئGx~EcjºŠT]I`yŸEh,SáE¥kÅ·h6Ã2µÑqd=¹–›ìZ¸ûÙ[®±¬KAÚ+jl¯Œ‰Œwh,!¶i;—ç*«iÁ…¥º¨T4æâ#Ù·šE%ä³4[ ó@V«ÚËvC"AS8ÔÕ€³Þ#«Æ°¡ŒD»øÕ¿‘uÕX¹ù¢ñœ4“º‹¿‚ï´8Ž’OÕ˜¤ìè%ôà­1)¯µZ 5Örß$Wn¸{jS6\ìYÕ›Ê{÷`³|S‰Ó³àL)Ãõç„[#'ÇãMesŒBºÍfN2÷Õ”©±jzÒ[…’V iÛåÖP8)4Ö~âÍ ~\ÈlÓ)h>ÍØuˆÂÕÎÒ Â¡Åȃ»W>“Zõ+jìc ‘‡½þ‡j Y!crØ…8åTBüŠÆ®[l¨Hâ‡ý¬5—µ‰6š›X^b±ÖlàTuã­÷Ȫ1lhËK4v@þlál«òœâW4ö™œ«½ÈÅhI**}§ßL©[›ÅPcU¿ 3š$(Ÿš®K|t-oÝ•Xc¸–¼÷pôAHjÌÉÒn?S5ÖÂi®*¬ çÍØ¢ Ýç§Ÿ >&Ìè‘ÜꯤÇa «ñ¢›‹J½Ý|XŸ ¹ZåëÇqºËpìb?§Sl°â4nßž U©©ý€Üb[¦ŠzWE=ñàJ9ËGþÕ4¦µ±&;p<7X«ó‡j fÕš|ÈÄœIl¸p[7\Ȥ¯üí¬Æˆ½á¢Á²áÃúmìšðmNE}z|µô°öþdç¦6†WRî‘õ~Hj¥Û a%†…©#ÞF»vÀ‰;•iûé4vŽ{Iø uvT¤\¬æ]ŸÔ•~׆{ŸôÏÀ>I;öâÇ£ÇÏ¢íT•_â‡cWŽñUéÇo¸Æ¤ÇÖh1\T.D\5«%­àKõ«á 4¦ ‚>¹/5võ^H0¥1“Ï5P˜ !ÅQ…š'äÙ³Rà´`[¡)%=z~+“ÜØœýíLPdj 6‡sÅ0íÝ̤NLGœŽi޾FÄÉëÔbòôÖË:£Óãc3ò2«tËù’ÇZ)è4J`™,¿ß¶"Ó£AÝãXJ:<:DãñwšîÌëmÌ‚Îμ2Yþ¥ý¥ >öëûõðŠ» Á=êôûÝÍíŽñ7bÓ,Ík6X/Ε•ƒåçäIEYœÙ–p¥ì0 ¤1þú×Áµÿ#Öõ¿µð°^¬,ýãß.§}5»+iWb-ð U'Ü­ãkɧ°‚¨•kÏôíøÖá牾æ*¤1D}?)ò‡ÅÁYå'ENÅþI…ìçžXNd "½†±m»Ûå†; ñz4F?ðæT¬¥2*à-ý¨0dÐ ¡Pp‹ Zûxý£ŸÛ½ÿš~n·¤nìéàóÒ7DYön­«÷A{½ø€üõxÌâëˀႠ6¢ÆHcn#gÇK=ö-¶#ÇpCb‚ ­vÃ…÷MĶØôÌuv bcjŒ4¦9 7¶þöL ‰=©OB܆Cƒu ÒXb² õÛ/x¨HìÛñ_`ú—adÁ:Ai,1†‘ؕĹ90qØïž7¹í äF'¬AÆc»ÉEæÖ„ÉÞn¼3>0ÐÑàÝõ:Lss‰Ý´ÁzBi,1n¿æ®ÄãwÃúBil5ØÜÎ*‡¡à¨rºm@Äê!AÆ‚ ‘Æ‚ ‘Æ‚ AÆÖ‚ HcA¤1‚ Hc¤1‚ Hc¤1‚ HcA¤±u€ ÒAil½ ‚4‚ ÒA¤1ZTA‹JÒA¤1‚ 6:¤1‚ ÒA¤1ÒA¤1ÒA¤1‚ ÒØ:BiŒ ‚4FiŒ4FiŒ4FiŒ ‚4¶lng•ÃPpT9Ý6 bãkŒ4æöqñ» ˆ­1Ò˜í¦a丵]¼¿ü×?~ÿýŸþôý÷þ×_òÓ]š;Ç0nÚ€ ˆ ¬1ÒX'—X`JëÏÜ`Ë|ÿg‘à"ë‚ 6¬ÆHcY†áÚíÿùOQüÓw¸ # ‚Ø #iíÿ˜‰©|ÿw˜ç6±15F³®è©˜:!sv bCjŒ4æ6rpEùÇØû7þÿ?âº2ÇpAQc¤1¿ˆXìßþÇÿøÇÿÉÅ…|ÿoüóÿËŸ¤Ç†‚Ø€#u9»Â+ÊûïII‡þò×?á J›ûœK*ÿË_þM®+wåÐÛJ‚Ø#91¾ÿw¦Å®$%]ùË_þjZ,ýHRÒ¿ÿå/ÿSdýFù1jߘš.÷`hÈ?t "ljÞþºzPYññ6oZ}ƒ ›ñÎ9šëƒð³úVý›æÛ”;±6ˆc'ΗèG#½>’ -)I¼£üCIIÿç_ÿòWoRÒùon÷ñIwÿÂ¥f¾¯LJÒŒdPi qàÿsþæÙ¿»­§'ms¯TY ;iŒ€ fÅg«†Õrб­p’±ü´¬¾Õ Æq[ïqü„ÉGïWâ´Ï÷!@¹Ï÷iìõa»Ì%åÿú¯ÿ÷ÿõþú—ÿ÷ïÿþïÿñŸÜw%ýÝ?þõ/ÿþïáו» TæCœ'W!›úaƒáõÃê±íf’”t‹«R_—Æzkbk¬0P°âkÅY[ëµ0ÖšRg“wbí¬~0¢ƒ›}.ƒX”}ôÑqˆæ¢Ïw–4öú5–´ëOBcÿ€üõ¯âðO9ÿù¿ýÓ?þË?^†Á1ή¤hFB¡Ip†';4Ø`är·f廄 k-:Ù¿»‰±O—–]åß\¯Ec[XD£7ï³' V|­3–÷ Ëg¬äXk vpãkì"ŸŒ]¸Ä=VùÄà˜Ï÷D¡—_'­†à_ÿË+hìÏ14ößÄáÿù÷Šÿ9‹¡±±¢TùÕX?cí×ã.e,EuÕ¦1dƒkl/ëB¤±³¦­.p‘[µÆ@„4–ào¾ùæëWÐØ÷14Vò‚_Áàò}”ÆÒ½'q-éõÚ@óz½@7‡¹…¥‚ ¡ÏêX5Þ†[jÛê`”ì’mÌE‘µƒõî«÷aÝ5†Êú8Ǹ’Êc+4VqI~¾tDÕXY8ëb9ilíCý1¦Æþ·ã ÇAæÜJen®*¬±OBœ3³xˆ­1dvr ‚Xu²nnˆÏÝZ@ÅR°o$Z­{ÎOg„¦¡œ¡=; aÆÐè4:o.’?ñx>»onÁìVÅvÖ ŠÆJ>g­×Z–òÛË gù»YSòŠKÝdÏäB45ÖÀXJž=7…±~§'…}êñ8lM¬¦yi)ÿku+³µ³¶ÍÙÜʶ‚ÄRÑyƒu,ð7ó>ô‚D­ãjc=×÷gô°6—ÚIÀ“ÇO=ž€h•m9å,æù•Ê–ö Y¶/—_³·*›bkŒ±­õׯ«m«ƒQ²ó¹¡Òm[k±vQï¾zÖ_cÇùL ô®¯òè‘#G}¾wËàð¾¨|çÊ®'žpâØ•O ìç‡CåÇ/ã& ÒØÚ-ÆÒ÷15æþGó<²ªü^ѧ1D—›ån©€ñ—hl0¤nFq>ÃWŽc " ÊOO°Ý9¼‚ÔT©n®hà‡§@ zÍ!óë‚kñWã!¾Æêäúí5h ÌB‹}j‡e<ŒÝ§_/2ŸïôV¶ ƒ=ÛXÍ2 3¥å²2% Í……èpRBU5k×A¢Ôá*í•S® µ 1cc)˜žÕÍ A­¬ÆÆäp0óš°;žÆJ5ˆ¾:%;m©E…õjlL½ûê}Xã I8ãó½/&gBQz$ÄÿÞ‰3ç0ö./¥hì´ïð¢'N|FûÈ­1»Ã5öo«Ô˜Kº ôÉø» È0Ÿc‰^Öñé(X ê\sŸˆñxX³\4ŠŠ|6¡Ã4§Ð]/ÏèÀ|¡ÅW×X±¢—i,¥ê€dgä›Y;›Ø-XÈd¬wx¾û+‹ÆˆñŽÎ%d¡j¬6þ˽4ôÒÌØN(uR…Dá"¥ ±5– ¦’ªÕÊq4†Ž»ˆ­:ŽÆ€¨m+ƒQ²SYS‰ÚA‰z÷Õû°îCUŠ?/€à"~ˆ~Sù‘ÏwΪ1QòÝ#ô¦ò[ 5ö§Øû{58–Pcèz@:âÇÆ@0ƒ‹@äÞ»A%RÐ2Q05ÕaÈOùÒNÖŸ6óûck¬¹(Åg¥¾Dc¶¶oeVQcN°R˘;üÔU›{ß³‘MŒP4æ43yr­¢1wc)õ;õXÃ>\±¼šRêhŒ¥5 n°&¥ ±5æ ÷]S+ÇÑX]drU'6&º¢¶­jLÉ>ÈXõ¾Æ˜o*Õ»¯Þ‡õ×Xy%Nªa$LÀ£cå+5v娇ïÿʧjLœTžx¿Œ4öÏ_T-ö:4f Žýu•èºúøo*A0²Ð*² V´ðÈÔÔU@2…3ùZò9†"ù§bk¬ƒÅ ÂÜbíz|íglÓÊ,N ¬±‘¹ ž/SgÕ˜»îs†Dk úÄ…›®ùcḧô!Ðy¬•:KÌBºÚ…øûÆòQcJå8Û±ñ¾ØëDm[Õ˜’mÛÂ8]…½¶(©w_½믱2Œ¡¶–)³jìãÓ>‰ª±Ã—}Èéw*Þp}âZ»ÅÀ¸{QÙÙ©Ç/*óð ! u‰4ö#øÈ"?´Ä×X3/÷D ÍÊÙV= ÷ù§^˜ B{©Æ6íŽÁ~“˜'¾Æ œ2¨c[µ—il c©&,5ßò{ÚÐ:ÛRŠbh ÒûÓZñyÎ{™Æl˯Rg? 7Ên¥¦+]H 1µru°MöëeSÛV5¦fë»»'Å­jL½ûê}Xñé×Sc—¾K—¯X4v†gT^¼p"ZcA;sIˆìÊ›­±/¤ºT‹ýàØ˜û?‹O/08¶:•ˆ×…ÈóeõgXÕØqA|"í+U$451¥‡BC€¤cP,¾Æ“‡D?Pj¥Æ´¶Yјk cû^¶¨¬ÅÕ—b#YîÔ¢5&èÌæWnu­nQ©Ôáe2@¢v!‘ÆÔÊq4VÏØ Án©±49j«ÆÔ¶ÕÁÄÊÖ“k¹É®©“wã.*ËÍ礙Ô]ü|§ÅqP`ŠÆ$eG/¡ßhIy­Ñb¨±?ÇÖØÛÿyepì«zSyï>l–o*ó‘¬)Ec¸þœpGËÉqÆÓ²ÖVzNNÀÔÔ`'Øæù4 `4,Jܲ?­±fX-ƪ=`’ÇX†âOeÛt@ šˆ¬kàV^ø«!þlÆ®¯|€oÉǽIWŠ­1äcÙjÅD¡m¬ƒe¶€Dv!¶Æ®FkLTN¨1tGªÍ\SŠaî•ÞÒª­SÛV'ÛÕÎÒ¬DÔ»¿ÑBü8Ûª’Å.Di >¨”5.¢}cè1Õb?ðêq»;¿ÿññÿæ‹óõàÒ08^¡1¤$³¡Ï-6\,çö Ÿ'-ÞnÀx¼ˆü?‰VºâÌfh ²²`ßä3”ØŒ#¢©^Ü®14¼ò:ñöÄÕ1zvï:¬çævÆéIkA;»#bNí€,miåyÛ6Y² ¸U„X¿3s-.ªíÆëíMAæVƶc;…5ŒÕÔšu[«Ø’ÞÏZmxÁü[8—+”5`eEØ}`·šÁ‚ZÇ+dz«^S»`¡äZ·°„l5ÖªEW–ì“wBî-HØlÚZë@/Ú ÙVÀÄ&@Ô¶ÕÁ¨ÙþÂvÆZÛòukêÝWïCsÍ @K[v[ºÛó~JUž¾üqHtþ­"ÎéÏÊÅYÅùK•¨1øn¸¸pü¨¡›ÊÊ+ÅŒ Ê.£ú.-Òz -öÿÙD·ÛõýŸþA`¾©| 5–€†Û·³Á S'Júq:¦9ú]âC`%jùô‚S~™&g[%öåBš¿¯Ï®Çi£SƒWÀ]œ×kØ Y~¿š§ðû`!è4<šå n Z²]‹ÛŠÃ£ƒD­ˆ}X*ÑÔéôûÝjT4·”Êñ\¿îT¾1'¨Äo[FÍÖ=Ž@œ*w_¹6ÍL2ëÙ`=9WVv"”Ÿ“'eqf[:À•²Ã€Æ øë_Ø?b­jÌù}8éà¿(ÿˆu<0¯¿îÖñµäSX53¡• @<¤ÆÖÂÝÎn”ÈTò}ÍUHcˆþCRDjìšûßËIÿ_üŸQÈqî‰EÞD&iìgÊ5ƪ·Ô^Kc¬ÛýÀÛFú7é¬3bÿëOˆùù?âÿÀ›J?* ôiìgJÖæV&ØæbciŒ~n÷!ÿ!2A¡ýÇ«üÜnIÝØÓÁç¥ nxJ+qA\nŽùa}!¼ù{SŠ2²‚4ö“â7¼é?þ)ÿÁÆù#/06¦>‚4Fs9;âz,b±9†Cil°.lüÏñ,ögÌuv bcjŒ4¦9 7¶þwßÇ’Ø÷‡ynáÁº@i,1Y†áÚa©S±.ÃÈ‚u‚ ÒXb: #'°‹w`ןWÌȾÿ³H äF'¬AÆc»ÉEæÖPZ¿ü×?Ï]öý÷ü×_¢Ã47—ØM¬'AÆãö&wùÿ¥%ññ»a}!‚4¶lng•ÃPpT9Ý6 bõÆ‚ HcAÆHcAÆHcAÆ‚ Hckƒ ÒiŒ ÒAiŒ ÒiŒ ÒiŒ ÒAiŒ ÒiŒ þvìÀ‚ ƒèü“eœÈ.´”HA?xoˆÃý¸1à?dlxcy€ŒÈ'c2äÉ€Œ!2 c@žŒÈ#c2ÈX@«±ûùÒ÷¨64{«u®VÍ,@Æ^ڇݺƒÂ8Þ5Ì,X掕Îf>CG‘™²ÌPfûD†|ÓefŽÔí~¯~‘XÙÿ}¢iK:Bˆ'³°±µµ± ®8Òš&êd‘1Úõðs7–„€%cîóp½mbÆ8c]¢é§Ž¸álïìîîl-Ü?&ê"cº4^EA¡è«g̸ŒÕˆñ bW¶q+Ó ª!cZÔ>¤’ϧšv-ð_ÙÍ©çI€Ô‡g̬ŒÉYâaÅv÷þüÙ»Úcw,*IÔ€±÷ oY¢2rÙH¼7*cœ±<5z+¶ÿï`ïßáîÃ=&”GåË>˜÷Q1àIÖœŒqÆ,šÎôUìhgçèßaÏËL“…Š1–u!5×FõæRàfÉģ§»pÜ·Çž’j1Öö ZG-êQðÚ†dŒ3Ö¥igHÅö˜3M]dL©·´Q; o9c†d¬BÖЊ ì1‹*øÿùñó×#œÌúúí{Õ ¿mñì €ÿ²ü6ŒQ:½ŽÚ¬§ÓÄ3#c!’C+6°Ç$…ÎÙ;£˜(’u_•QÄ33ÉÌ Ã<ažyÕ„UEä¥_0hØ•…à› Å€0´Qi@D`PA’Mîã¹ÉyÙìn|;¯çÄÝ»»º¹õõW3vÑÕ8Ìš{ÝëüèþН¾®¢{~~U]5’OOª: Ô}UUgÈÿžèÉ(|?…‰Ê¥õäÿNÖì•Ùœ·£Ê³­1Œý)066vTB1I>vtlŒ|zšWÕq²²ééIb®†±ÑƶËÕØèÿ„1Öj) éQ¦&ÙµæÔÇ{"ÈÙ76–õv°ÀÒJ>¶ ‹®T¢œ=[ø11Ø”b’|ì“ÄØƒÅ¥68.«êòŽƒÏù^o cÛu‚ÒôOcî‹Co{U®•¥] O©j^Üþ9, n"×ù"ÔÍsgÈ®Tâó}EH¥Ïw-†±üö‡ÿÜ Æнýõö'1Œ}²BŒ}Šaìãé‚%—H0šÈ"»RÓæº5 Œ‘\Ë"×W¾°®Ê󪊛7Ï£®ú|—c‹@Áüøã»À˜˜‹½ûë»·b>fÀ˜5++ËJliΡTßqÏ–7Ñ9Ùb'RÝm™SÂí-¾79Úɺ¬,;Q2ï·@LkñýÖ:ýµ:G‚̲·LŽàcéÉʺKˆ#kMUײ²<âcŸro2ѧ¬z€H%ï ¶#ØéL#ëð¿W ëV KqwM}Ù$;¿”ü1·þRGÆlŠPÇa% ×–UØfVg¼Êa¿£OÀ˜´Ö#~«c^¿G‰à XBøHâp—x‹;ÆVkkk;f6Uu3H¢Wäó[⽦»Ê’±²rƱš‡ÒÑ£Ï÷1H©¸r]‰a,2Šýømäû«@1Äê­06¢ªjJï,û95­p;q}ó÷{*Óã…$bPþ³ •ivÍVÍSK! gª:Ÿ¹ 1'Iʸʴܺ֓Çìçs»õ§:À}þ ¢“S‹»±“Lv&’¼/ØŽ§« Žÿ!sº(mˆKAcì@íJàSÔÞŒJé@£Wî ‡­þ†áÀ¾¿QÚ5ܪ·4£UNvóêûYuÚ±Ýýýyi ”攽wØ1ÎÎKÙÌ«þ¤Ww¨K™²áµåP?œö÷'èîd¿9–º cñ ”öì÷ÀyNîïÏ;%±ÄðBSeZrÈvŒM‡Ý—L,r½çv_Öqv`P!ðA§Àò_mezU“N<ðJ0Fr,™¦»Œ´*c +ŒcÃXdûGpSüÅc¯ß½{÷+ÃØ ócRŒ­«¨n/ƒÁ0–¤Í’ù¤5•kÉJtž³sXà\å!Äk-¿ÀãTÚŽ»·¡¢V#˜ØhÇ8„cGê)ªYÑ QÐŽf í£¨&©/Æ1@¶â(@Jø7QÔðXþPõ °l”&7PPò,¾“ª•îëá×ÔcÌÎëÖ!d/E¥èÍæ‘Ž ëèǶõt½h<–fÓ8c§DK /Æ1U†¥Ãc„=_ñwîï£ >W‹S졘qo¨/™µÉ}ŸhÄ{®ªI„Ô²{;É®±íUÝ‹YÕ‚T#Æ:,À˜Rʆ‰%•¡\ëòå í¼²ê Ÿï˪*f€UqùÌit9]uJÀØé3X#†±è)û‹@1ÀØÏpüå÷ß¿ÞWJ0šXêlä…ìÙçk)d„=Q›ÓM¯€UD”H·2½™Ï=BáÙ{öèùcVaKÃÓËÅŒ½¨%n~{uésÿE¸æbc3/6™ó‹ºG®ÌW™+J$û퀪ó $"åC»š;·2º)MÔ AZýžV–†„“Ò¸t{Z¥£_Œ€¶ïÏ.¥Í6kæJ; òì‰ÉìÀ,×Ú2ÓßÁª!Æhwš'…a³k ÝU3°”6µù[™WÞ{Œ¹»é óöqç ív“€'5Èã lo É¥4~¯=±€R=Ƭ=´;Óëê袌;%Zbx1޹ŽYn›alFU ´jZ#È:Kª†±Uª!Œå©*&d¥—jà´¬|®ù|•ï1VU¿ª¹v:†±è)†ƒÊÅDŒýÆ1Æó±™`¬@!¤ÆzÜn ò\fÜ!q²A‰àÌœ’&´< 8“G0ÆÇÇ#öÛ9p;Œå£{b!÷`¤ÚAˆ‹Õç“MñCÁÆ$20ZŒcb_°ã{"ŸC湑½Aûl2|ƒyÒLÆ”.š4ëK ƒV‰ïI ØßìPv‚ƒ-'»å=")½cÓ’-ZgM]=íQ4`Õ×ÁŽÒ~LIÕÓÄX³–$õÐoc¹ˆ>HÄœá¹1C=”» 9ÆŠ‘I¤#;;`À˜Ø)ÑËqÌoq›` ¨äÔž…Õ¯G‡™öxñÞ ³vÀóYúzŸÛ¬ªcnKü1Ⱥ ÇB@P©PÀXU9?/?³c¡_]­Œa,zŠÆþùæÍÏH1c?³Iþðú1VòO)Æ–µk±¬kVÑì'¤¬ò¬?Èr.Û].EãÊã:ÂÔ²¼<ïuð¬Š(/Y «†Y/ÇZ-;¦â(b÷b@çM³0¦C¿i8ñ.,/;·a,x—ËfÖÄØ]±Òx…€Rœ ¤¡•§ôDcß“GÚé°?»´=Ÿˆ‚ZÅ8lr:O@õ8>à¡ôˆ¬c`)õœ+qôVÚí%3!?DŽϵ7'Œ1C)Á 6lÃX#á2`Lì”h‰áÅ8æ²X‚RŒy‡–X¢í"d\J~Ϫ+0ŠD$Õm) ¸¤*<­w7 Z,ÆØy–i“.újΞ9sÖç»XANW³Aå¹êj†'VPTXýUÂNÀØv8Uyþ,ˆa,jŠÆþýæÍw S:Œ}ÿúõëïØÜØ»PÙϯ߼ù—c½4©üÀ% €ÓÚ æVK*×]í|…„5„CK¦Gìlà¹4Êã¦8Æ8‡V•ˆ¹0v\\ï*blKåZ4ë Î “$9 \ÖAš+.oH& ¯ö‰uRšÒÚKižÄ7§R')­ÏmÞTBõ¤°Õ›ù­ÓR+t‡bŽÆ8Ü0KKçƒælÓt‡¶ë0&64†/xP±¤AJãZŽ(2Œ‰-1¼g'YÆÔÍÍMí=Œ“÷†ú Šá‰Ê‡îæðb;blž€ÄªžPÕI#ÆÈ¡0VÊ’ìpÉ绎É J Oñ_+ºT “`ÁKÄX‰¯œ0ת¢¢‡Ÿ7Æþë‡oƒrŠE1.LÑvÆXmx Ø¢ÙŤÓ3cÀ¡uÝÎ Gôgð†0Â#b¬8bŒáà³sWû‚íЩ—JyœÒ½ÒUZ]€±]•&‰/Ó ›`?XýÙCV}ÞsGÃÂÕ]4WV‹c|¢ð0ìa‹¶¨N¶0ÆÄ‚º`²0Å?¢5µ½ÙoĘØ)ÑËqv‹1ÔÜÚ4>‚Øñ)yº›™;bì!†ªC¡ª#Ña hT£ý, - +“½©¼éó• Ï‹gbo*™~pI)ý !ö+/ãƒÊ)Æðô” é0Öóñ+ ubeQ‡1;!s67)ám c-E9Æ*×Ó¾0¶7Y¢ã:¶ä™cŒ¡)Eã3$¾ ^´”¶ä°ã’th—b̺[Œ^xKèp¼cbM1Fl£»€²éŒ‰-1¼g·ƒÊÙ™™†¤ž;…uŸÌwÄX1T «º¢TVÖ@Ru fÂ4±Ù±JcÕ…_]ÿÒgÀ5E×+bûÑ-Å`Šÿßo~úõû·:Œ½{ûöío?é¶V¾3âÇûßÌÑaÌ+ÈtžÖ>.|>AÂJgž¡—èjÝGôÀi†1ÒÇå5í ¶#byè>sŒ5ÒAëN¾Ô½ŸêFaÊžÆdÊÉvT¶|`P9Ä[u²UübåƒJ®¾ÖÖ.7°é`È'Nì”h q¢˜â¿ýXUÛðÑ™«µæÕÚÁÚ–mâ°Q†1±j8‘‰rŠ¿‚ͶtªÐcìV 1vú†Tr®ê3LJW´ƒUüȱí .¶Q쯑blÈd]cÉW5 Íl©©ã—M´Á‰s||-˜ÊžÉW`Æqivô›#(/oÆí{>>.Nñ‹’÷e·#ñ4A! ÌŽ<ÆR(½½“o3IÂÕa¹{8$ø|":Zý’)~ ÆäSüPwÿ6ŒÁHZl lŠ_Ð}JSà2ä­§q†N‰–^ŒÅ‚‹E¤ î0 3©qýÜØÌ´2½”aL¬š*Ìí~Áaé×%ÄØ M¾òÕ:Œ]‚——WËŠ$#Já¥r dÕŸ-ÆŽñCT[Ãò|LĘH±ÿ8*Řºà"¶'ì8/`l¯N™…™sA°+ŸÇ,« üÑÞ0!Æ4‰cPM=YÝì\"¾pT÷±¸äeE‚1±/»ÅX.Å<ÇÞCã sQzð0Xm‡¥È}ý=´aŒºøøQÖ­©rwñ×—½”vj‹ZÅrŒaÒf¯×/¸èå´ôÊÆ|® L¡¦ .NÆgkͨ՚qÒ¦q†?€h‰áÅ8¡6:“ç‚ 'Z?¼üußè½¢Nixï]_¿«q úbço*ç1oÛ0bÌP•UÙqW£YþÊ„/KL’UüU>_ùyèã5 Æ@g˃Ÿ7Æ8Ç¢£bLÈÇcFŠ19ÆÔ mkЈ€±ìÉxüò ¬VM%¢¦aõÎòÚL¯¢§:1¿ ÙP~ôZ©sè%·WÃq_’H0&öe·³ Ó®ÜÌ#-‡0Ã1£´¸!?£‡Ö÷™ø¦Qú›(Ý´kÔ£x’)Õ}†/ÀòWO[.£.¼Ÿy—¿î„1º¯ ¼ ^ë:3]mqˆ7¥­[‡Åò寵u)Û–¿±ÒÎ@ ±¶ (í±ùcb§DK /Æ9¦%„îAZ d”µ9‚ÍHìfµ¼~µ·8m‰3«9 øº1xñ=»ØÒ;«J1&V Ub3f[5¥|Š_ÄØCž«Ã™9Æ€t5¾’ÏcÈ1¤Xtò1À˜„b&›‘©('0FÚfUÝ–!AÁµ1£@vòœ¨#Ñc¬sŠoFz 8#˜¢Æ·"˜ؗÝbŒØ(ªI1bLI¦¨†NSß“Ú4Lø32Ðl>;%ìeº3&ÝŒ$ÇXozõ ;7Cus¼`€Ót¡úÍHß›‘¬q0-ßŜҡOǸrÅN‰–^Œ3Ì\4&RÖ·µtk¸€1×,N¨¨¨Ù¸¬æcŽM|üÖ¤“W]ØÝÖpÄXé5ð qvV+¹ZS‚»Ä=¯!Î «(/×~UyÑW[7CŠE‡1!ûí—_~“QLޱâ¡q Ф†.ýÛÁ‘ù xŠ–Ä ë£MíëàžÏ4Ïô|Å_d¶²2-ƒa©.ö8_ÖÚ„Ë_ÃO^ÊÂÔl.«³÷°dâN,Âð(KŽ1y_„vD¬-د=˜°—€zè},åsêÞÆÀÓ±=æ¾ÁýçÏî¡´«;C²5¼½À†æq¨N‡ùÖðÐ[Áá0Ænc©žf¯Ð¢,PÃ-Xšß<34ÐÌPÚUÚL„f C~–NÞ^hT¶=›;%±„ðBœŽ`³7ŽBêÕ9Г¾Ãõlè6#AEz'´uùt{*_¸c¤seÖ+C¸§r9¼§’€äU \»û¢žK·nݺré¢ãJ©†±á…×Ù„þfW³$íÊåSä;ž=ùšdŠ¿²œ « Ù¨ôV cÀ1 XôçǤ3Á!ùmvé¥m™Å~“6y#'¼zÏ”¬$ò‡è# ‡›påw»HDú­ûýVó[äóx#òU<Ž€¬z¾p©­|…˜‹çh}[vãUúü~ÝÛ›”$m`ÀïÈúèðè®ëñ÷™þDK/ız±[c•m¢™‚w;Þ÷Ao?ð’` ;šiW"®úÀ7>¯MŒ…TsŽàuÎÒ@E§Á,㛑nr·2ã ò‹^ãÆ)à þýïÁè¿ÄZÌÇL(vÔ cNýí‹€±?¹ðK¬w)ÄXôŠðK¬9ÆjJnܪ"\ÊùPVò°R³ª®”×ÆÈ—°à¢ìüYm 튯0V£el¤â ïêÙJÃHùãÿ¥ˆ˜ ÃÿR$†±Æ>ùÿR$zŒ}ŒÿR¤´¢¢”„UYʪŠS¦ÛêŠÓ±å¯ÿÃÞ«¨Da’#&$IFc@ ‹Ü6­/q›ó8Ór±-•cí;ÙÝÖ&í",»fvaXX'ƒžß¤ùsÂ߯ ¼i÷˜V1mà3ÆsuàM˘ý7õ¸„3fžÛÕï1½bßÍíîÎç³Ä'ð ߢ©«êßkÎíª¿óÏí¾ZÆPRíi÷˜^±›š$2f—ªÀO±©•BWpÆ ‘÷åÓ+$1ËâÂ…BëÔ"„X2]Ï› <&èΘÁž¨¨?ß+¯ÝŠÍê‚hŒõ%Ûú`‘¿ÍÐ=œ1“xGTˆò½dþ_¯/šÝB6+EA´‹‘±©tÐäÃ,æÍ Uè"Θ™to}:Ñ)1fgì§â7vꪠ‚0 Ãàw©pÜ}·y¶ A¹Å^d&Â'ÏùQsp}ÏAst¾}õ!€ŒÈ$c2$É€ŒI2 c@’ŒÈ#c2È€Œ2ð8¾‡Œ€GÈ!c2–È€ŒI2 c@’ŒÈ$c2$É€ŒI2 c@’ŒÈ$c2$É€ŒI2 c@’ŒÈ$c2È€Œ2 c¿ c­v§Ûë†ÃA¿×í´[ådl<™Îæw̦“qù»\®fóGÌVËËòã2¶œÎŸ4]–Ÿ ±ªΟ1¬+›»aïvTE¾8ŽŸ÷`ÙKQ• Â/šH ÁÙ¢&¾Õt÷³ÿ‹BJ¬®Á«÷obçžO2§8M[‹þÆQÑ7¾£NœàŽ$vèM1Æ8cé `•Ò[bŒqÆüþÈÂ'ÆØâŒùþPð~cŒqÆTÅÞ²c§½¶ô¨,÷Ö1õp|éƒn¸r)¥~O ëñ×aŒ3–.ð€EÚ[ˆRʨcPÖèÎÀ‚µ úê·„t¤€oê÷İ2QÛxÆ8cÎ Y9ôßfÖtµCí©ŽùBzT)æŒý;g,ƃâ{É®¨¥ühŒ±WáŒ-<(YÞËØ7i¥÷|Æè´÷žyn, ×3âŒý3g,Ââ{¥ùX/¥çô g@œ±ãŒÍ&æw2†µ{Æ^3öÏ`œ1'ÀçNƺðq“±rVMÃi5*IùÊóüTœVÉ4'i7>¬'ù’Ü\Êê³ÕÇÛ9Ú}NÂýB'Ô׎¹äPÍŸ-’ðÅ®-c»è0DËŸeZF“u˜TqI­Aý»Âê<,áa.mÌ­5ÊQ•$ß³Œ3öRŒ36ÇSæw2†%5¢›Œm<4DLµ5€³™•Ñ©ý‰)€U;£ñÝË7öT×Ä9 4ÂáŒùßíùŠÛ2¥\xj¸{\¬7Ã'Q-Í­)ÃËÊzÉ{%Æ[à)‹{“’yÝŒ}âêÜfl&cÅ­½-c‰èþ¨mÜ̘3ÁÕÌÌØ­jÐ-“»6ï%ChÞ©3ì{Äζ5 \„ë—eŒ1ÎØÀñ”ÐïÉX^¦ßû°h+³ªíÿµ:ãÊ’1E4%I‰ŒqkÆ6jx‘'BÇÈXǼS¦¦}"„²#"gß] =¼­WÄкµlm†Ÿ±WàŒÑ ÷ XÌzNøØPíP— ­ŒÊɨ Gõå ólŽÇm& U§b;öŒyóÒ9©[C"cÜš±ºŸ¡{‰)†fÆÄ—Ÿn¦¦ŒÍ›_•Ñ1€”P›Ãaö±üV'j‡Óiór‡uk3Hâì—óý+3Æg,ÀOŸéL@³b…Ÿ‚¾Œùö$$Ù¥2GH9Õ¾ ¹—<­º=IFRl͘8‘4T 5Ç훨¢Ô6³Ùìhf,&iëA:^3´‡ÙTj³œ­›­«ál¯×-[›@:Ó`@iøºŒ1ÆsC˜T6ºcbCTà§ÐíÉíøDT0n36»Ö¦Thò¨–w^¨lK¨6ðT0Œq{Æ"I—LMÆ*"ÁXg̺}t‚4j–&—¥(ŠFÍpPéZ¶Vˆ:åÕ†¯Ëcœ±!,bRÓ£þŒÅMkŠe›1Už é‹h­¦•o¢ åÓ–±1ÕÔRd·<7¦$Ñ&µdlFÊÒYg,Õ«ôíTÕº*\|‘dÛšÛ9OùºŒ1ÆÁ ÓµÆMÓ¨/c¥„…êɂڌ¸•7y:_ß":½vÈ̘žÛ«ŒÙÇŒº6¢šÿÈØ‰GˆtÆü&ä@Ð,mì;“dÙÚíyÖœ±—aœ±1z:Ö[1Œû2¦N<§ ÀNg¬Â­¨›'u4¤F|?cÖq#cTDZ+3cKjÔ#c1uh~ͨô’-cBÅвµ›J8c/Ã8côu¬¯b˜ôflWO¸˜tÆâÆYþ³ÔyÒEuI‰îgÌ:ndLÊ6AˆÆÜÈØ†”T5NgÌ…ôIJ!TáÔÒ—=cS"ÛÖ¶ó8‚3ö2Œ36E_Çú*†ioÆÓËÆF¤3¶ÒOgi<Í o»áýŒ™ãöŒ)îh ild,ïcœ±e‚%KzŒ1ÎÅxPLï„1ÆsVxÈÊ¡wÂ㌑»À)½ÆgŒü,ðéÝ0Æ8c?øµcŒqÆ?²xÏŠ1Æ8cä®ðV)½'ÆgŒœ8ÁIìÐKý3ñIdÛÖø²5ÊiÀRX(…¹ó|97¾C‰™£ÿ|2´ M#T;µý¾W»V,ÖmO8—/“»Ùû[k/–¿®ÚZÅÓý@m¼;¢WÕÉFü J¯$ãøIR¿z¹¹d'åo-sþøíß^3Œ±þç—¿~é—ç<õz0¨›äé°>¸£g«lÓTgôšº€<½’òÀzK–[”ìȼÀøéåµýzƒ~¬Â@ó-ß^3ŒIýpÒÿÏŸé9Z潑ÕÃ÷ãrº0¶t磿ÆRñ¸Iß/¹øòGaŒ9NÀò½PaìU5Ã?ÿç_¾%ñ??ô,E€þGbÑ&¾ cV±‘˜"ŒÝ{ÄzcŒÅ€U VðbQîׯsœ'—g]üxŒ™§ÇoïøöšaLèïÿø§F²ýóÏÿ|2౨ |/9¦ciŒiÆëõ1Æ Æ•Â@/üÊ›i†1Öï~ÿ‡?þéÏùë_ÿòç?ýñ¿ÿ±ž‹±%b¥ºûtr²#nmŽÔÐ*Ì¥ÈO ÓeDÀ$+5W#O‡šT†_•¿“™3:iq”4|œ“Ã<)äžÅ’ËÖ,òd MâŸV®Ü+©'Ãæ®Æä†ÁUHJN¢n–èð ÀXÆt«ÍŽ¥ãõ1–4-yŒ ¤?$ÆDp®ý°4æBs‚%;"c®x ¤cPkÞ3Œýö <ð ‡Q—16· ¡#u®;}ÞXÖ‰hm@g=oÞeìÑ5F×ÑA°Óªéä$OÆAÀÍ æŽnot²yâ—a¸^Ó0VÊv{>OlÑ0ÎÄr£ç 1¢€ÜÇ#£QÛÑÐ+äwû¸Q?e²`¹II'n'çönÀõúOcbCs£Ñž‹†Ñ¨Ië#¨Ø‡jZN©JÄÙ­E»‘±6:€½Ð½¼Ån¹ ô« ̶“í>`‡WuŒ™£Qœˆ”Åè’\ G#Uâ­ÿ‹Ìc6öâ¨åg7@¥|5‰±þ:‘Ę®vs²  7ô±(´¬BvÔwñdtFÛDñQů#jèfSg£6±¤£÷ù;ʾ(–ÈÑöèÚrÇ‘¦cƒÒÄo:Òc‰ ”*&€ì cw](©_á pND§g¡Ô‹i“<ÍÃÕÍ eÂpµœt# úPÚK·¡´ë䮿ÉÓ)ÚuN6A¹³¿ÓÑ&ÏÀ=¹é‡Ü¨ŸÊpTmÞ@)îvo¥}±=¹¡à‚ã+°EpµFDœ+zW¼ï* î¡ÔIê^Þb.7™c¸úbѪímF`Œ–Ñ#¥]T¢äʨàoDDg@™ˆèºeìÅQËyËKyzT³DczðÐè{•cQhY…5`Í   z†ªOGD¸yÒ¨Ës”ï‘¿£ì‹  FD;6à´£5Æß¦™3ŒÕs°käèxp1VëÁ¾ÝÚèÕTK¡¿Œh®Šjîaåâc@z/µ·\ÉIâž$ò9q8pob?»—ï³À>¹ÆŸ‰øíÌ$Æ€ì]âs.\/€ÅµÄÚ¢Š£ÄÑ—‹æeXÞ È=Y ¡W*%‰R×5Íâ2°ÎÛDZ˜ûÓþpeèbKmTo–ÆÎêá}[nOnHb,SZ.J¥ Qo$.çÈG7»ÞÚû»Ðm¯¾ÿº Üë^Þb.wêÝý­á}8$ŠvP-® ï;èæ5ŒÝsêÏžà>ßYG€Š³·2"¤Œ½8j9B­TlQ?)Õ1&ƒF6Íb8&m, -ª© Kްk ½#¬4°¸^ºKcì(ß#GÙ¦*ÝÁ­é Кj:Ì0–áœm#B.Æî/8m9ÕRýrTæ_ékK[D”´Qþv«t-@“¨J;¼2ƈ¸/VøŠm(0VvŒk ETë"ò‰ˆv–`G'[yüžÜÿáïr÷뮾Ĵ ú–2Èl…†ºzá 倕oÂà–ëÁ“’óŽ @Ï¡ ý 8WÃJÉ}ytBD+(ë^Þb¯ÜÎ0QÅ6Ñ\(tÈmiKuÝ«Éu F,ÚjDWèVÑTW!q6–gc‹N?±ˆ1¼—ádöÿå˜ íS…yTíZm”‰¡£wÄ ɨøcì(ß#GÙt†rï«-ašj:Ì0FYô,"2cÆX!R cWµT™”nœ!7ºÀØspéÛI¬øÿ»ümîÕ@×r"ðš-`mcü0ÈZ| <°æ¼Væö¤hÙ€Ü=Œ…±@JïSœÞÀ«ìÒÎȪ Lޱô—ޱ0–›Oî@|nz«aŒBè¹TîÑ£RÀC¶pÖ˜ 4}1vÈЪbLWt2ˆ hб(´^…÷MoºQc²#6À$ŽVÆØQ¾Gþ޲/¨Žõp;C”Åö”Óa†±-÷wn•Œ‹1ï)]£­Zꂯ¨#¥‰1ÛíÖ4®¿ÄÊyýÓ¶‡Öj0Ôš[rT‡cU01 êäh©¬6Ü›ÁþuõÏ]`,jcŸ”æ€UÇ b±*|Å‚$¹`_ÓÃfFàÕ-1±!ŒyUàd½ì®Qç .ë^cœ¾Tjnï/2ÆV9uOyKž–œåiÜn8ä,¢bøb,Iœ®ˆ1œ¡ÌNb, ­WÁê!« =Žz“qúxýcG½5|µ¾ Ctó”@5sƒYcœO9f³–QV r16Ä„ TS£ îsúIb¬MJu\;‰µ‹k¸µmÕA^„”†±yr5F–¨ O§­\5/vüs›{Œ‘ébßKßûiHy“aW—x{Ú†1¶‹¹Šy/;‰1é%1æ%ÀÊŸÞÀ‘Æ2}ĉÖÑM’§/ˆ5ÆQ ÝeQfcßçÆ1¦/÷¤ô ø¢¹¼>U [ô3dupJÆdGl£G®c쨷†£Ö”áŽ>`—æÑ X™r:Ì0FœFßLÆØ€°nÂÑR¤tô4ÆôI¬2·.+ Ú ‡ž±2Ñ.v…ðÁS“¹¿ÆdX"ïy{ú†‚1vý ŒI/ cCà3y*õ´#‹eŒÑ='¦¸aÚC7„±E¬RÇ/Á˜ þ|ŒÉ*P²‹C§R±'1VGÕàµ~Ó[ÃÇQë ¢ìÓ.ŠÔBŽÑ±¦3Œå«ˆSÛÄËØÈ‘'m”I©ø4ÆôI¬[ FúdãæOу0æÝTÞ:sí(Ié7•¹ûÜTÕÿc2¬~Sé¿¡ÐâIOÜT–Ñ#Œé^ÆŒªx6 ì;–†ƶ€¹¼-¯Þ¢U´n1pV¦M ùŒÉàA7•¢ÐZˆ¶‘¥–éIŒC54ƾÓ[Cw”}Á{‹D«(9/”ÒL=f£:Ú1`cÁ®/ vѽ#õÐAÆ´I¬KàÎå@±xB- È툱þljÏZ@ŒtÉ#þ€ÜŽøƒ1&ÃzGüñÉíiJ1¬ûñû`LzñbqıÈQ³øÙµ 5ðØuƒø:ª;4©]|Ypöõ€ö1–=cŽó|ŒéÁ½#ý€)Ǣв ªàýOÜ?±9`Aqª_Œé­¡;ʾP:BwMm?„bkÓO‡ƆÀ :Æ#ÆêÜÐFy)4‰‚-ý 3¹ÑCÆ´I¬Zí+þ}‹Z|çù`c YµöH©# k›KK-ñÀE’rxà"czد–\h²ú)@ܸ›ãÓ¼+ù¨?Ƥ—·˜ËÝpE‰>‰"R»õÃÅÑÛEš„Šèºyua³Œ}Ϙã<czð€/ü iÕÐÇ\^Ÿ*}¬¢nêiŒ!`·õSóþÓ[ÃÇQö‘ÅÛ§ ,£ûצ™3ŒÑŸ3Æ’ع¯ÉÍE 'Pð®ê““uD>—6@„è£ñFʼ¨"c@ºUÚg|ý³°þÞ<裲3‰1,'6çå|@îÆR×°ãÞã¯ÁÓÂ*øÙñ‡“‹Ž ´Ü*è~¢°‹±0þ0äÇ_×K›üø«?Ƥ—·˜Ë]è¡»ß4—€–J.ݬm†à‹±l’PÀ‚ ¸œÀÇy6ÆDpÆþ¶§ [$m, -«À©„èiŒQ~ Jã²/ÆôÖðq”}Á3ö¸a÷ÝîYÓL‡ÆÖQÊà +pµkHÛ*ç;A“<5àª3GDûPê—ƒ1–î@)d8ckWÕ-ñ…”´÷-“€Üc>_F Ƙvsä÷]+¹!:êC© ¨EÛú—‘n®Ècº—·˜ËM‰1\ZD‰6”Ò~S8í$Õ㫽U šñ0æ%ùlŒÉà`¾ ¥:‘‹B‹*(mX Â%w»¶Í3Œé­¡9ê}Á=ßr=rîWSI‡Y¢a÷ÃÀè˜Ïåo'G±ôŽùjà3Ë0÷Ì(Õ€¢ú¤ïBñ©CJó¸Ñ'é_ G;[P£‹áØ=ºGà¦]§Gõ/•»€]ϳE| ÀN›$Z9z_q̾æžE„\…¼¯†»é‹ŸÖc àÐ'ìá2€ÎF^lOnˆh/l•‹ ©6¶?v1fäÚìl‚&³»ÁÿXÞQ€ØK,é›QïE3aüÝî VPœ`Éà|µ³’ˆúŽ¥‚« +‹qç, ô}gOK}šÑá¿"ÑŸ+–Q1^0éõÄó×L… Bô6bléã×Q¾NŠ?ó<§iÖ c¿¾jU RÏ úÀþ &Í0ö6j,Ó1Ö ²? í÷3Œ½L³D›=(u/^0i†±7RÀý&0–ù[J‘$½P3ŒÍÍ7BÛóÇ'/˜ôʺÛÏ‘¯f*‡æïÞ²7ö÷cã*v^(çî2³¿Åÿ¿íØ…‰1EÁûgký÷yØ¹à ™ ¢oÅ@3Pà2 c€Œ( 2È€ŒÝ1dÌ@u1@Ædì~€ŒÈ c ¨ƒŒ2 c÷d @Æ3P@d 1» 3WùàÊ,kØÒÊ-[YCÏY~8ÓËjR ÀÂm8¾8l }©Õ™½|°gÖ•þãå(ŸI[«ºïÙ¨#«}¥½Ìdë­Ú< ¶¾%óe¹q?àÝS]3ÀcÚ;`ŸfpW´¨ÑçíãNIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/logger.rst0000644000175100001770000000732614550400520021035 0ustar00runnerdocker.. _dev_logger: ********************************* Logging, Warnings, and Exceptions ********************************* Overview ======== sunpy makes use of a logging system to deal with messages (see :ref:`logger`). This provides the users and developers the ability to decide which messages to show, to capture them, and to optionally also send them to a file. The logger will log all messages issued directly to it but also warnings issued through `warnings.warn` as well as exceptions. The logger is configured as soon as sunpy is imported. You can access it by importing it explicitly:: from sunpy import log Messages can be issued directly to it with the following levels and in the following way:: log.debug("Detailed information, typically of interest only when diagnosing problems.") log.info("A message conveying information about the current task, and confirming that things are working as expected.") log.warning("An indication that something unexpected happened, or indicative of some problem in the near future (e.g. disk space low). The software is still working as expected.") log.error("Due to a more serious problem, the software has not been able to perform some function but the task is still continuing.") log.critical("A serious error, indicating that the program itself may be unable to continue running. A real error may soon by issued and the task will fail.") The difference between logging a warning/error/critical compared to issuing a Python warning or raising an exception are subtle but important. Use Python `warnings.warn` in library code if the issue is avoidable and the user code should be modified to eliminate the warning. Use ``log.warning()`` if there is likely nothing the user can do about the situation, but the event should still be noted. An example of this might be if the input data are all zeros. This may be unavoidable or even by design but you may want to let the user know. True exceptions (not ``log.error()``) should be raised only when there is no way for the function to proceed. Regardless of the type (log message or warning or exception) messages should be one or two complete sentences that fully describe the issue and end with a period. Issuing Warnings ================ sunpy warnings are provided by the `sunpy.util` module. The primary warning which should be used is `sunpy.util.exceptions.SunpyUserWarning`. For deprecation use `sunpy.util.exceptions.SunpyDeprecationWarning` or `sunpy.util.exceptions.SunpyPendingDeprecationWarning`. These three warning types have corresponding functions to raise them:: >>> from sunpy.util.exceptions import warn_user >>> from sunpy.util.exceptions import warn_deprecated >>> from sunpy.util.exceptions import warn_metadata These warning functions must be used to interact correctly with the logging system. A warning can be issued in the following way:: >>> from sunpy.util.exceptions import warn_user >>> warn_user("You have been warned about something you did not do correctly.") # doctest: +IGNORE_WARNINGS See the section above for a discussion about the distinction between ``log.warn()`` and raising a warning. Raising Exceptions ================== Raising errors causes the program to halt. Likely the primary error that a sunpy developer will want to use is * ValueError: should be raised if the input is not what was expected and could not be used. Functions should not return anything (like None) in that case or issue a warning. Exceptions are raised simply with:: >>> raise ValueError("The following error occurred.") # doctest: +SKIP For more information on exceptions see the :ref:`python:bltin-exceptions` documentation. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/maintainer_workflow.rst0000644000175100001770000002327414550400520023637 0ustar00runnerdocker.. _maintainer-workflow: ************************ Workflow for Maintainers ************************ This page is for maintainers who can merge our own or other peoples' changes into the upstream repository. Seeing as how you're a maintainer, you should be completely on top of the basic git workflow in :ref:`newcomers` and Astropy's `git workflow`_. .. _git workflow: https://docs.astropy.org/en/stable/development/workflow/development_workflow.html#development-workflow Integrating changes via the web interface (recommended) ======================================================= Whenever possible, merge pull requests automatically via the pull request manager on GitHub. Merging should only be done manually if there is a really good reason to do this! Make sure that pull requests do not contain a messy history with merges, etc. If this is the case, then follow the manual instructions, and make sure the fork is rebased to tidy the history before committing. Integrating changes manually ============================ First, check out the "sunpy" repository. Being a maintainer, you've got read-write access. It's good to have your upstream remote have a scary name, to remind you that it's a read-write remote:: $ git remote add upstream-rw git@github.com:sunpy/sunpy.git $ git fetch upstream-rw Let's say you have some changes that need to go into trunk (``upstream-rw/main``). The changes are in some branch that you are currently on. For example, you are looking at someone's changes like this:: $ git remote add someone git://github.com/someone/sunpy.git $ git fetch someone $ git branch cool-feature --track someone/cool-feature $ git checkout cool-feature So now you are on the branch with the changes to be incorporated upstream. The rest of this section assumes you are on this branch. If you prefer not to add remotes, you can make git fetch all pull requests opened to Sunpy. Locate the section for your git remote in the ``.git/config`` file. It looks like this:: [remote "upstream"] url = git@github.com:sunpy/sunpy.git fetch = +refs/heads/*:refs/remotes/upstream/* Now add the line ``fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*`` to this section. It ends up looking like this:: [remote "upstream"] url = git@github.com:sunpy/sunpy.git fetch = +refs/heads/*:refs/remotes/upstream/* fetch = +refs/pull/*/head:refs/remotes/upstream/pr/* Now fetch all the pull requests:: $ git fetch upstream From github.com:sunpy/sunpy * [new ref] refs/pull/1000/head -> upstream/pr/1000 * [new ref] refs/pull/1002/head -> upstream/pr/1002 * [new ref] refs/pull/1004/head -> upstream/pr/1004 * [new ref] refs/pull/1009/head -> upstream/pr/1009 To check out a particular pull request:: $ git checkout pr/999 Branch pr/999 set up to track remote branch pr/999 from upstream. Switched to a new branch 'pr/999' When to remove or combine/squash commits ---------------------------------------- In all cases, be mindful of maintaining a welcoming environment and be helpful with advice, especially for new contributors. It is expected that a maintainer would offer to help a contributor who is a novice git user do any squashing that that maintainer asks for, or do the squash themselves by directly pushing to the PR branch. Pull requests **must** be rebased and at least partially squashed (but not necessarily squashed to a single commit) if large (approximately >10KB) non-source code files (e.g. images, data files, etc.) are added and then removed or modified in the PR commit history (The squashing should remove all but the last addition of the file to not use extra space in the repository). Combining/squashing commits is **encouraged** when the number of commits is excessive for the changes made. The definition of "excessive" is subjective, but in general one should attempt to have individual commits be units of change, and not include reversions. As a concrete example, for a change affecting < 50 lines of source code and including a changelog entry, more than a two commits would be excessive. For a larger pull request adding significant functionality, however, more commits may well be appropriate. As another guideline, squashing should remove extraneous information but should not be used to remove useful information for how a PR was developed. For example, 4 commits that are testing changes and have a commit message of just "debug" should be squashed. But a series of commit messages that are "Implemented feature X", "added test for feature X", "fixed bugs revealed by tests for feature X" are useful information and should not be squashed away without reason. When squashing, extra care should be taken to keep authorship credit to all individuals who provided substantial contribution to the given PR, e.g. only squash commits made by the same author. When to rebase -------------- Pull requests **must** be rebased (but not necessarily squashed to a single commit) if: * There are commit messages include offensive language or violate the code of conduct (in this case the rebase must also edit the commit messages) Pull requests **may** be rebased (either manually or with the rebase and merge button) if: * There are conflicts with main * There are merge commits from upstream/main in the PR commit history (merge commits from PRs to the user's fork are fine) Asking contributors who are new to the project or inexperienced with using git is **discouraged**, as is maintainers rebasing these PRs before merge time, as this requires resetting of local git checkouts. A few commits ------------- If there are only a few commits, consider rebasing to upstream:: # Fetch upstream changes $ git fetch upstream-rw # Rebase $ git rebase upstream-rw/main A long series of commits ------------------------ If there are a longer series of related commits, consider a merge instead:: $ git fetch upstream-rw $ git merge --no-ff upstream-rw/main Note the ``--no-ff`` above. This forces git to make a merge commit, rather than doing a fast-forward, so that these set of commits branch off trunk then rejoin the main history with a merge, rather than appearing to have been made directly on top of trunk. Check the history ----------------- Now, in either case, you should check that the history is sensible and you have the right commits:: $ git log --oneline --graph $ git log -p upstream-rw/main.. The first line above just shows the history in a compact way, with a text representation of the history graph. The second line shows the log of commits excluding those that can be reached from trunk (``upstream-rw/main``), and including those that can be reached from current HEAD (implied with the ``..`` at the end). So, it shows the commits unique to this branch compared to trunk. The ``-p`` option shows the diff for these commits in patch form. Push to open pull request ------------------------- Now you need to push the changes you have made to the code to the open pull request:: $ git push git@github.com:/sunpy.git HEAD: You might have to add ``--force`` if you rebased instead of adding new commits. Using Milestones and Labels =========================== Current milestone guidelines: * Only confirmed issues or pull requests that are release critical or for some other reason should be addressed before a release, should have a milestone. When in doubt about which milestone to use for an issue, do not use a milestone and ask other the maintainers. Current labelling guidelines: * Issues that require fixing in main, but that also are confirmed to apply to supported stable version lines should be marked with a "Affects Release" label. * All open issues should have a "Priority ", "Effort " and "Package ", if you are unsure at what level, pick higher ones just to be safe. If an issue is more of a question or discussion, you can omit these labels. * If an issue looks to be straightforward, you should add the "Good first issue" and "Hacktoberfest" label. * For other labels, you should add them if they fit, like if an issue affects the net submodule, add the "net" label or if it is a feature request etc. Using Projects ============== Projects allow us to layout current pull requests and issues in a manner that enables a more "meta" view regarding major releases. We categorize pull requests and issues into several levels of priorities and whether these can be classed as blockers before a release can be attempted. Further we can add general notes that someone deems important for a release. Updating and Maintaining the Changelog ====================================== The changelog will be read by users, so this description should be aimed at sunpy users instead of describing internal changes which are only relevant to the developers. The current changelog is kept in the file "CHANGELOG.rst" at the root of the repository. You do not need to update this file as we use `towncrier`_ to update our changelog. This is built and embedded into our documentation. Towncrier will automatically reflow your text, so it will work best if you stick to a single paragraph, but multiple sentences and links are OK and encouraged. You can install towncrier and then run ``towncrier --draft`` if you want to get a preview of how your change will look in the final release notes. `Instructions on how to write a changelog. `__. .. _towncrier: https://pypi.org/project/towncrier/ Releasing sunpy =============== We have a `step by step checklist`_ on the SunPy Wiki on how to release the sunpy core package. .. _step by step checklist: https://github.com/sunpy/sunpy/wiki/Home%3A-Release-Checklist ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/newcomers.rst0000644000175100001770000003536214550400520021561 0ustar00runnerdocker.. _newcomers: **************** Newcomers' Guide **************** If you have come across this page, you just might be new to the SunPy project - thanks for your interest in contributing to SunPy! SunPy is an open project that encourages anyone to contribute in any way possible. The people who help develop or contribute to SunPy are varied in ability and experience, with the vast majority being volunteers. If you have any questions, comments, or just want to say hello, we have an active `chat room`_, a `mailing list`_ and a `community forum`_. .. _chat room: https://app.element.io/#/room/#sunpy:openastronomy.org .. _mailing list: https://groups.google.com/forum/#!forum/sunpy .. _community forum: https://community.openastronomy.org/c/sunpy/5 How to Contribute to sunpy ========================== Not Code -------- A common misconception (which applies to any package) is that all we really want is some Python code, in fact, we do not require only code contributions! If you do not have the time or the desire to code, we have severals of areas where we can use help. Reporting Issues ^^^^^^^^^^^^^^^^ If you use sunpy and stumble upon a problem, the best way to report it is by opening an `issue`_ on our GitHub issue tracker. This way we can help you work around the problem and hopefully fix the problem! You will need to sign into `GitHub`_ to report an issue and if you are not already a member of Github, you will have to join. Joining GitHub will make it easier to report and track issues in the future. If you do not want to join Github, then another way to report your issue is email the SunPy developers list `sunpy-dev@googlegroups.com`_. When reporting an issue, please try to provide a short description of the issue with a small code sample, this way we can attempt to reproduce the error. Also provide any error output generated when you encountered the issue, we can use this information to debug the issue. For a good example of how to do this see issue `#2879`_. If there is functionality that is not currently available in sunpy you can make a feature request. Please write as much information as possible regarding the feature you would like to see in sunpy. When you go to open either an issue or a feature request, there is a GitHub template that will guide you on the type of information we are seeking. Please be sure to read over the comments in the GitHub text box. .. _issue: https://github.com/sunpy/sunpy/issues .. _sunpy-dev@googlegroups.com: https://groups.google.com/forum/#!forum/sunpy-dev .. _#2879: https://github.com/sunpy/sunpy/issues/2879 Documentation ^^^^^^^^^^^^^ sunpy has `online documentation`_ and we try to make sure its as comprehensive as possible. This documentation contains the API of sunpy but also a user guide, an example gallery and developer documents. However, documentation for any project is a living document. It is never complete and there are always areas that could be expanded upon or could do with proof reading to check if the text is easy to follow and understandable. If parts are confusing or difficult to follow, we would love suggestions or improvements! .. _online documentation: https://docs.sunpy.org/en/latest/index.html Reviewing a Pull Request ^^^^^^^^^^^^^^^^^^^^^^^^ We at any one time have a variety of `pull requests`_ open and getting reviews is important. Generally the more people that can look over a pull request the better it will turn out and we encourage everyone to do so. .. _pull requests: https://github.com/sunpy/sunpy/pulls Code ---- If you would prefer to code instead, the best way to start is to work on an existing and known `issues`_. We have several repositories you can investigate. The main one is the sunpy repository with where all the known `issues`_ with sunpy are detailed. Each issue should have a series of labels that provide information about the nature of the issue. If you find an issue you'd like to work on, please make sure to add a comment to let people know that you are working on it! This will make it less likely that effort is duplicated. .. note:: sunpy is Free and open-source software (FOSS), under the BSD-2 license. By contributing you are stating that you have the right to and agree to have your work distributed under the terms of this license. This applies to everyone who wants to contribute during work time no matter who their employer is. You should start by checking if there is a Open Source Software Policy (e.g., `Standford's policy `__) for your work place. If not, `OSS-Watch `__ summaries what you will need to check and who to ask, however this resource is aimed at a UK readers. As an example, `Standford's guidance `__ allows someone to contribute and open source their code. If you are unsure if your university or institution allows you to contribute under the BSD-2 license, you should contact the relevant department or administrator that deals with copyright at your institution. If you are unsure where to start we suggest the `Good First Issue label`_. These are issues that have been deemed a good way to be eased into sunpy and are achievable with little understanding of the sunpy codebase. Please be aware that this does not mean the issue is "easy", just that you do not need to be aware of the underlying structure of sunpy. We also tag issues for specific events such as `Hacktoberfest`_ under the `Hacktoberfest label`_. The scope of the issues should be appropriate for that specific event. We do particpate in several other events but right now we do not have dedicated labels. So please use the above labels for starting issues! In addition, we have several other repositories that have open issues and you might find these more interesting than the main repository. Python: * `ndcube `_ * `drms `_ * `radiospectra `_ * `ablog `_ * `irispy `_ * `sunkit-image `_ CSS/HTML: * `sunpy-sphinx-theme `_ * `sunpy.org `_ .. _issues: https://github.com/sunpy/sunpy/issues .. _Good First Issue label: https://github.com/sunpy/sunpy/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+label%3A%22Good+First+Issue%22 .. _Hacktoberfest: https://hacktoberfest.digitalocean.com/ .. _Hacktoberfest label: https://github.com/sunpy/sunpy/issues?q=is%3Aissue+is%3Aopen+label%3AHacktoberfest If you already have code that you've developed or already have your own idea of code you'd like to work on please first have a look at the issue list to see if any existing issues are related to your idea. If you find nothing then create your own issue to stimulate the addition of your code and make sure to let people know about it chat room or by email. Creating an issue creates a permanent record. It may be possible your idea may be outside of the scope of the repository you are trying to contribute to and the issue comments are a great place to have that discussion where potential future contributors can also see. Setting up a development environment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The instructions in this following section are based upon three resources: * `Astropy Dev Workflow `_ * `Astropy Dev environment `_ * `Astropy Pull Request Example `_ **We strongly recommend that you read these links.** These links are more in-depth than this guide but you will need to replace ``astropy`` with ``sunpy``. In order to start coding you will need a local Python environment and we would recommend using `Anaconda`_ or `miniconda`_ (shortened to conda from here on). This method will bypass your operating system Python packages and makes the entire process easier. The first step is to install the version of conda that corresponds to your operating system and `instructions are here`_. Next we will want to setup the conda environment and we will need to add the `conda-forge`_ channel as a prerequisite: .. code:: bash $ conda config --add channels conda-forge # Note you might need to add python= if a new release of Python has come out very recently. # Typically it will take around 3 months before we can support the latest version of Python. $ conda create -n sunpy-dev pip $ conda activate sunpy-dev This will create a new conda environment called "sunpy-dev" and install the latest version of pip from the conda-forge channel. The next step is get a development version of sunpy. This will require that `git`_ be installed. If you have a `GitHub`_ account, we suggest that you `fork`_ the `sunpy repository`_ (the fork button is to the top right) and **use that url for the clone step**. This will make submitting changes easier in the long term for you: .. warning:: Do not clone the sunpy repository into ``$HOME/sunpy``. Depending on the operating system this location is used to store downloaded data files. This will cause conflicts later on, so the last argument (``sunpy-git``) on the ``git clone`` line will become the local folder name of the cloned repository. Otherwise you are free to clone to any other location. .. code:: bash $ git clone https://github.com//sunpy.git sunpy-git $ cd sunpy-git $ pip install -e ".[dev]" .. note:: If this does not work, it could be due to a missing C compiler (e.g., ``gcc`` or ``clang``) that is required to build sunpy at install. Getting the compiler either from your system package manager, XCode or Anaconda should address this. Now you have the latest version of sunpy installed and are ready to work on it using your favorite editor! Ideally, when you start making changes you want to create a git branch: .. code:: bash $ git checkout -b my_fix You can change ``my_fix`` to anything you prefer. If you get stuck or want help, just `ask here`_! .. _Anaconda: https://www.anaconda.com/distribution/ .. _miniconda: https://conda.io/en/latest/miniconda.html .. _instructions are here: https://conda.io/projects/conda/en/latest/user-guide/install/index.html#installation .. _conda-forge: https://conda-forge.org/ .. _git: https://git-scm.com/book/en/v2/Getting-Started-Installing-Git .. _GitHub: https://github.com/ .. _fork: https://guides.github.com/activities/forking/ .. _sunpy repository: https://github.com/sunpy/sunpy .. _ask here: https://app.element.io/#/room/#sunpy:openastronomy.org Checking the code you have written ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Now that you have written some code to address an issue. You will need to check two things: 1. The changes you have made are correct, i.e., it fixes a bug or the feature works. This requires you to run the code either manually or by writing/running a test function. `pytest`_ is the framework we use for this. 2. The changes you have made follow the correct coding style. We follow the `PEP8`_ style for all Python code and depending on your setup, you can use a `linter program `_ to check your code. For documentation, we follow the `numpydoc style `_. We provide more more detail about our :ref:`test suite and how to write tests `, and how to :ref:`create and style documentation `. .. _pytest: https://docs.pytest.org/en/latest/ Send it back to us ^^^^^^^^^^^^^^^^^^ Once you have some changes you would like to submit, you will need to commit the changes. This is a three stage process: 1. Use ``git status`` to see that the only changes locally are the right ones. 2. Use ``git add `` to add the changes to ``git``. 3. Use ``git commit -m `` to label those changes. 4. Use ``git push`` to update your fork (copy) of sunpy on GitHub. Here you replace ```` with some text of the work you have done. We strongly recommend having a good commit message and this `commit guide`_ is worth reading. Next step is to open a pull request on GitHub. If you are new to pull requests, here is the `GitHub guide`_ that is a detailed walkthrough. Go to the "pull requests" tab on **your fork** and pressing the large green "New pull request" button. Now on the right side from the box marked "compare" you can select your branch. Do one final check to make sure the code changes look correct and then press the green "Create pull request" button. When you open your pull request, we have a GitHub template that will guide you on what to write in the message box. Please fill this in and title the pull request. Now the final step is to press the green "Create pull request" button. As soon as you do this, you will be greeted by a message from the "sunpy bot" as well as several continuous integration checks. These are explained on our :ref:`Pull Request Review ` page. But what is important to know is that these run a series of tests to make sure that the changes do not cause any new errors. We strongly recommend that any code changes you have had, follow the `PEP8`_ style and that you have ran the code locally to make sure any changes do not break any existing code. We provide an overview on how to run the test suite :ref:`here `. Now we (the sunpy community) can review the code and offer suggestions and once we are happy, we can merge in the pull request. If you do not have time to finish what you started on or ran out of time during a sprint and do not want to submit a pull request, you can create a git patch instead: .. code:: bash $ git format-patch main --stdout > my_fix.patch You can rename ``my_fix`` to something more relevant. This way, you still get acknowledged for the work you have achieved. Now you can email this patch to the `Google Group`_ . Just remember, if you have any problems get in touch! .. _commit guide: https://chris.beams.io/posts/git-commit/ .. _GitHub guide: https://guides.github.com/activities/hello-world/ .. _PEP8: https://realpython.com/python-pep8/ .. _Google Group: https://groups.google.com/forum/#!forum/sunpy Summer of Code(s) ^^^^^^^^^^^^^^^^^ If you are interested in a "Summer of Code" project with sunpy, we have information on our `wiki`_ which has guidelines, advice, application templates and more! Our projects are located on our umbrella's organization website, `OpenAstronomy`_. .. _wiki: https://github.com/sunpy/sunpy/wiki#summer-of-codes .. _OpenAstronomy: https://openastronomy.org/gsoc/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/pr_checklist.rst0000644000175100001770000000745314550400520022231 0ustar00runnerdocker.. _pr_checklist: *********************** Pull Request Check List *********************** The pull request (commonly referred to as a PR) check list below is an outline of the steps that should be taken when making a contribution to a SunPy repository on Github. New to Git and Github? Check out the :ref:`newcomers` and `Git Cheat Sheets `__. If you would prefer a visual Git interface, you can try `Github Desktop `__ or `GitKraken `__. #. Review and test changes locally on your machine (see :ref:`testing`). #. Double check that a pull request does not exist for the changes you are making. Ideally, check that there is an issue that details what you want to change and why. #. If you are contributing code, review the :ref:`coding-standards` page. #. See the :ref:`dev_guide` for guidelines regarding code tests, documentation, and other types of contributions. #. Have you tested your changes with the latest version of ``sunpy``? If not, update your local copy from your `remote repository `__ on Github. #. Push your changes to Github. #. `Create a new branch `__ in your fork of ``sunpy``. #. Give this branch a name that reflects the changes you are making. #. Create commits that describe the changes. #. `Push your changes `__ to the new branch on your remote fork. #. `Compare your branch `__ with ``sunpy/main``. #. Resolve any conflicts that occur ideally with a `git rebase `__. #. Create a pull request. #. `Create a pull request `__ from the branch you have created/updated. #. Add a description to the pull request that describes the changes you have made. Remember to delete the preamble within the message box. #. `Link `__ to any relevant issues, pull requests, or comments in your description. #. Add a changelog to your pull request. #. A `changelog `__ is a short record of the type of changes made in your pull request. Other users are the intended audience, and you can have multiple logs per pull request. #. Maintainers will review your pull request :ref:`pr_review`. #. Tweak anything that others highlight and push the changes to your branch. You can also commit suggestions either in bulk or single commits via the Github user interface. #. Discuss possible changes or improvements in the comments with the reviewers. #. Review the Continuous Integration (CI) :ref:`ci_jobs` tests and fix any errors or warnings that are found. #. If you are confused by an error that the continuous integration is giving you, submit a comment in your pull request. #. Ask questions if you get stuck or confused at any point! #. Open-source projects are about communication and collaboration. #. `Join the SunPy Matrix Chat channel `__. This guide is partially based on Astropy's `Development Workflow `__. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/pr_review_procedure.rst0000644000175100001770000002444114550400520023625 0ustar00runnerdocker.. _pr_review: ****************************** Pull Requests and GitHub Teams ****************************** This document describes the standards required for a pull request to sunpy and an explanation of our automated tests. Each pull request **must** meet the following criteria before it is considered for merge: * The code must be PEP 8 compliant and meet the ill-defined sunpy quality standards. We have these in the :ref:`coding-standards` page. * The PR must contain a changelog entry if it changes the behavior of any code. * The test coverage should not decrease, and for new features should be at or very close to 100%. * All code must be properly documented. Each function and each class must have an associated documentation string in the correct format. Review Process ============== Before the "merge" button is clicked the following criteria must be met: * All the continuous integration must pass unless there is a known issue. * At least two members (excluding the PR author) of the "sunpy-developers" group must have approved the PR. Exceptions can be made for minor changes, see below. * All comments posted on the thread must be resolved. It is important that approval for merging the PR is always done by explicitly approving the PR through the GitHub UI before merging, so a record of approval is left in the PR thread. Minor changes ------------- If a PR only makes minor changes, it can be merged by the first reviewer, if they are confident they fully understand the changes. If this happens, the ``minor-change`` label should be added to the PR to indicate that it has been considered minor enough to need only one reviewer. The PR author can add this label as a suggestion, but the first reviewer can remove the label as part of their evaluation. Exactly what constitutes a minor-change is left up to the the reviewer but some examples might include: - Improvements to existing documentation - Small bugfixes - Changes in code style rather than substance As a guideline, minor-changes don't include: - New features - New documentation pages - Changes to the public facing API Continuous Integration ====================== Currently we have a variety of services that respond or activate on an opened pull request. Comments from bots: * `pep8speaks `_: Performs a PEP8 check on any submitted code. This is updated as the code changes. Checks that appear at the bottom of a pull request: .. image:: images/checks_pr.png :width: 600 :alt: PR checks or at the top under the "Checks" tab: .. image:: images/checks.png :width: 600 :alt: PR checks tab * `figure-tests (CircleCi) `_: Runs two figure tests environments ("ci/circleci: py3\_-figure", "ci/circleci: py3\_-figure-devdeps"). * figure_report (Giles): Show the final results and download updated hashes of the figure tests. * figure_report_devdeps (Giles): Show the final results and download updated hashes of the figure tests using development packages. * changelog: absent | found (Giles): If a changelog is needed, this will check and will pass if a changelog with the correct number is found. * `docs/readthedocs.org:sunpy (Read the Docs) `_: This builds our documentation. This primary check is to ensure the documentation has rendered correctly. Warnings are not checked on this build but under GitHub Actions (see below). * `CI (GitHub Actions) `_: Runs our test suite on multiple operating systems. If the minimal "CI / core" tests are successful, the indepth "CI / test", documentation "CI / docs" test and remote data "CI / online" tests will be run. You will see multiple jobs within each group. Each job corresponds to a tox environment being run on a particular operating system. * `codecov/patch (CodeCov) `_: Checks how many lines of the code lack test coverage for the submitted code in the pull request. * `codecov/project (CodeCov) `_: Checks how many lines of the code lack test coverage in sunpy overall. * `pre-commit.ci - pr `__: Checks the code style checks have passed. This CI will automatically fix style issues by commenting ``pre-commit.ci autofix`` on its own line in a comment on the PR. It is common to see some of these checks fail. This can be happen due to a change that has broken a test (should be fixed) or a remote server has failed (might have to wait for it to come back). Therefore it is important to check why a task failed and if has a pre-existing issue, it can be safe to ignore a failing check on that pull request. However, you should try to ensure that as many checks pass before merging. Understanding GitHub Actions ---------------------------- The vast majority of our tests are run on GitHub Actions and this means you might have to navigate to the results if you want to check why the tests failed. The tests for GitHub Actions are split into multiple phases to reduce the number of builds running at one time. If your PR fails the minimal initial stage, the subsequent stages tests will not run. The Azure checks on GitHub manifest: .. image:: images/actions_check_pr.png :width: 600 :alt: PR checks tab This is the main form. There will be one check per GitHub Actions job ran. The publish and notify jobs are skipped in PRs, and each stage has an additional "Load tox environments" job to configure set up the stage. The "Details" link will show you the log output of the particular check: .. image:: images/actions_summary_check.png :width: 600 :alt: Summary of Azure outputs on Checks tab On the left you should see the entire list of GitHub Actions checks. You can navigate between the jobs here. You can also see a flow diagram for the jobs by clicking on "Summary". For each of the jobs you can see each step that is undertaken. Normally the "Run tox" step will be red if the tests have failed. You will need to click on this so it will load the output from the test suite. Our test suite is very verbose, so there will be a lot of text outputted. The important bits of information should be at the bottom as "pytest" prints out a test summary at the end. For example: .. code:: bash ============================================================================= short test summary info ============================================================================= SKIPPED [1] d:\a\1\s\.tox\py37\lib\site-packages\pytest_doctestplus\plugin.py:178: unable to import module local('d:\\a\\1\\s\\.tox\\py37\\lib\\site-packages\\sunpy\\io\\setup_package.py') SKIPPED [213] d:\a\1\s\.tox\py37\lib\site-packages\pytest_remotedata\plugin.py:87: need --remote-data option to run SKIPPED [18] d:\a\1\s\.tox\py37\lib\site-packages\_pytest\doctest.py:387: all tests skipped by +SKIP option SKIPPED [1] .tox\py37\lib\site-packages\sunpy\map\sources\tests\test_source_type.py:21: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\map\sources\tests\test_source_type.py:30: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_ana.py:22: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_ana.py:31: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_ana.py:40: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_ana.py:49: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_ana.py:58: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_ana.py:67: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_filetools.py:54: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_filetools.py:73: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_filetools.py:106: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_filetools.py:115: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_filetools.py:122: ANA is not available. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_jp2.py:11: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_jp2.py:21: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\io\tests\test_jp2.py:31: Glymur can not be imported. SKIPPED [1] .tox\py37\lib\site-packages\sunpy\net\tests\test_fido.py:298: Windows. FAILED ..\..\.tox\py37\lib\site-packages\sunpy\timeseries\sources\noaa.py::sunpy.timeseries.sources.noaa.NOAAGoesSXRTimeSeries If you want to find the full test output, you can search the tab for the name of the test out of the ~3 results, one will be that output. SunPy GitHub Groups =================== This document has already referred to two SunPy groups, namely "developers" and "maintainers" there is also a third primary SunPy group "owners". SunPy owners ------------ The SunPy owners group is the group of people who have total control over the SunPy GitHub organization. The SunPy board have control over who is in this group, it has been decided that generally it will be the Lead Developer and the SunPy board chair and vice-chair. sunpy Maintainers ----------------- This is the group of people who have push access to the main sunpy repository. The membership of this group is at the discretion of the Lead Developer, but shall generally be made up of people who have demonstrated themselves to be trust worthy and active contributors to the project. This group has `subgroups `__ for each section of the repository that has `maintainers `__. The members of these groups will automatically be requested to review all PRs which change files in that subpackage. sunpy Developers ---------------- The members of this group have "read" access to the sunpy repository. As all these repository are open anyway, what this effectively means is that these people can be assigned to issues. The members of this group are people who are involved in the development of sunpy at a good frequency, they are people who's opinions have been demonstrated to be constructive and informative. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/public_api.rst0000644000175100001770000000610614550400520021660 0ustar00runnerdocker.. _public_api: ****************** sunpy's Public API ****************** Convention in the Python ecosystem is to add an underscore to the start of a function to denote if a function or method is "private" e.g., `~sunpy.coordinates.sun._angular_radius`. If it is considered to be private, there is no guarantee that the API or behavior will change with a warning, so external use of these functions or methods are strongly discouraged. sunpy follows this convention but with one extra caveat. Within each python file, we have a ``__all__`` that defines what is imported into the namespace if you do e.g., ``from sunpy.coordinates.sun import *``. This is the "public" API of that module. These functions are the ones listed within our API documentation: :ref:`reference`. If you do ``import sunpy.coordinates.sun``, you can still access the "private" functions. This means that all of the public API will follow the deprecation policy detailed below with the exception of `sunpy.util` which is considered to be for internal sunpy use only. Deprecation Policy and Breaking Changes ======================================= All public API within the SunPy project (the sunpy core package and stable affiliated packages) will enforce strict standards when it comes to either changing, updating or breaking the API. .. _deprecation: Deprecations ------------ If you want to deprecate anything within in sunpy, you should do the following: .. code-block:: python from sunpy.util.decorators import deprecated @deprecated(since="3.1", message="We will be moving this", alternative="sunpy.net.Scraper") class Scraper: The deprecation warning has to be in one LTS release before the deprecated code can be removed. So in the above example, the warning will be in sunpy 3.1 but it can not be removed until sunpy 4.1 after the 4.0 LTS release. There should be a "deprecation" changelog entry to accompany the deprecation warning. When the code is actually removed, a "removal" changelog should be added. The same applies if you want to change the default value of a keyword argument for a function or method, e.g.: .. code-block:: python from sunpy.util.exceptions import warn_deprecated if response_format is None: response_format = "legacy" warn_deprecated("The default response format from the VSO client will " "be changing to 'table' in version 3.1. " "To remove this warning set response_format='legacy' " "to maintain the old behaviour or response_format='table'" " to use the new behaviour.") .. note:: This is a summary of `SEP-0009`_ which is the formal SunPy project deprecation policy. .. _SEP-0009: https://github.com/sunpy/sunpy-SEP/blob/master/SEP-0009.md#deprecations-and-documentation .. _breaking: Breaking Changes ---------------- Every attempt is made to avoid breaking any public API in sunpy but in the case it does happen. There should be a "breaking" changelog entry to accompany the change with as much detail on how to update a user's code due to this breaking change. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/remote_data_manager.rst0000644000175100001770000000223714550400520023530 0ustar00runnerdocker.. _dev_guide_remote_data_manager_tests: Tests using the Remote Data Manager =================================== A pytest fixture (``sunpy_cache``) is provided for ease of mocking network requests when using cache. The following example demonstrates the usage of the fixture: .. code-block:: python @manager.require('test_file', ['http://data.sunpy.org/sample-data/predicted-sunspot-radio-flux.txt'], '4c85b04a5528aa97eb84a087450eda0421c71833820576330bba148564089b11') def test_function(): return manager.get('test_file') @pytest.fixture() def local_cache(sunpy_cache): sunpy_cache = sunpy_cache('sunpy.test_module.cache') sunpy_cache.add('http://example.com/test_file', 'test_data_path') The above snippet creates a pytest fixture called ``local_cache``. This fixture can be used in wherever the files have to be mocked. An example is given below: .. code-block:: python def test_test_function(local_cache): # inside this function the mocked cache is used # test_function uses 'http://example.com/test_file' assert test_function() == True ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/tests.rst0000644000175100001770000003156314550400520020720 0ustar00runnerdocker.. _testing: ****************** Testing Guidelines ****************** This section describes the testing framework and format standards for tests in sunpy. Here we have heavily adapted the `Astropy version `_, and **it is worth reading that link.** The testing framework used by sunpy is the `pytest`_ framework, accessed through the ``pytest`` command. .. _pytest: https://pytest.org/en/latest/ .. note:: The ``pytest`` project was formerly called ``py.test``, and you may see the two spellings used interchangeably. Dependencies for testing ------------------------ Since the testing dependencies are not actually required to install or use sunpy, they are not included in "install_requires" in "setup.cfg". Developers who want to run the test suite will need to install the testing packages using pip:: $ pip install -e ".[tests]" If you want to see the current test dependencies, you check "extras_require" in "setup.cfg". Running Tests ============= There are currently two different ways to invoke the sunpy tests. However, we strongly suggest using ``tox`` as the default one. Each method uses the widely-used ``pytest`` framework and are detailed below. ``tox`` ------- The primary method is to use `tox`_, which is a generic virtualenv management and test command line tool. We have several environments within our "tox.ini" file and you can list them:: $ tox -v -l Then you can run any of them doing:: $ tox -e This will create a test environment in ".tox" and build, install sunpy and runs the entire test suite. This is the method that our continuous integration uses. .. _tox: https://tox.readthedocs.io/en/latest/ ``pytest`` ---------- The test suite can be run directly from the native ``pytest`` command. In this case, it is important for developers to be aware that they must manually rebuild any extensions by running ``python setup.py build_ext`` before testing. To run the entire suite with ``pytest``:: $ pytest will use the settings in ``setup.cfg``. If you want to run one specific test file:: $ pytest sunpy/map/tests/test_mapbase.py or one specific test in a test file:: $ pytest sunpy/map/tests/test_mapbase.py:: (This does not work with ``tox`` and is a known issue.) If a test errors, you can use ``pdb`` to create a debugging session at the moment the test fails:: $ pytest --pdb If you see mention of:: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown You will have to either export ``MPLBACKEND = agg`` as an environmental variable or pass it as a command line pre-argument to ``pytest``. This comes from the figure tests (see below). ``self_test`` ============= Another method is to use :func:`sunpy.self_test`:: import sunpy sunpy.self_test() You will see something like the following in your terminal:: Starting sunpy self test... Checking for packages needed to run sunpy: All required and optional sunpy dependencies are installed. Starting the sunpy test suite: ... The tests will run and will report any fails. You can report these through the `sunpy issue tracker `__ and we will strive to help. It is possible to run this command in a situation where not all packages are installed. If this is the case, you will see the following when you run the test suite:: Starting sunpy self test... Checking for packages needed to run sunpy: The following packages are not installed for the sunpy[database] requirement: * sqlalchemy ... You do not have all the required dependencies installed to run the sunpy test suite. If you want to run the sunpy tests install the 'tests' extra with `pip install "sunpy[tests]"` This does not mean sunpy is broken, but you will need to install the extra packages to ensure a "complete" installation of sunpy and run the entire test suite. It is quite likely that you will run into not having the tests dependencies installed. Remote data ----------- By default, no online tests are selected and so to run the online tests you have to:: $ tox -e py311-online or:: $ pytest --remote-data=any Figure tests ------------ In order to avoid changes in figures due to different package versions, we recommend using tox to run the figure tests:: $ tox -e py311-figure This will ensure that any figures created are checked using the package versions that were used to create the original figure hashes. Running this will create a folder, "figure_test_images", within your work folder ("/figure_test_images"), which is ignored by git. Inside this folder will be all the images created, as well as a json file with the hashes of the figures created by the test run. The current hashes are located within "sunpy/tests/figure_hashes_mpl__ft__astropy_.json" and this will be where you will need to update old hashes or create new figure entries if anything changes. The filenames are the versions of Matplotlib, freetype and astropy used. If these versions differ to your local setup, the figure tests will not run. In theory, the Python version does not change the results as we have pinned the packages that cause the hash to vary. Running tests in parallel ------------------------- It is possible to speed up sunpy's tests using the `pytest-xdist`_ plugin. This plugin can be installed using `pip`_:: pip install pytest-xdist Once installed, tests can be run in parallel using the ``--parallel`` commandline option. For example, to use 4 processes:: $ tox -e -- -n=4 or:: $ pytest -n 4 ./sunpy .. _pytest-xdist: https://pypi.python.org/pypi/pytest-xdist .. _pip: https://pypi.org/project/pip/ Coverage reports ---------------- sunpy can use `pytest-cov`_ generate test coverage reports and settings are stored in ``setup.cfg``. This plugin can be installed using `pip`_:: $ pip install pytest-cov To generate a test coverage report, use:: $ pytest --cov ./sunpy This will print to the terminal a report of line coverage of our test suite. If you want to create a report in html, you can run:: $ pytest --cov-report xml:cov.xml --cov ./sunpy $ coverage html .. _pytest-cov: https://pypi.org/project/pytest-cov/ Writing tests ============= ``pytest`` has the following `test discovery rules `_:: * ``test_*.py`` or ``*_test.py`` files * ``Test`` prefixed classes (without an ``__init__`` method) * ``test_`` prefixed functions and methods We use the first one for our test files, ``test_*.py`` and we suggest that developers follow this. A rule of thumb for unit testing is to have at least one unit test per public function. Simple example -------------- The following example shows a simple function and a test to test this function:: def func(x): """Add one to the argument.""" return x + 1 def test_answer(): """Check the return value of func() for an example argument.""" assert func(3) == 5 If we place this in a ``test.py`` file and then run:: $ pytest test.py The result is:: ============================= test session starts ============================== python: platform darwin -- Python 3.8.3 -- pytest-3.2.0 test object 1: /Users/username/tmp/test.py test.py F =================================== FAILURES =================================== _________________________________ test_answer __________________________________ def test_answer(): > assert func(3) == 5 E assert 4 == 5 E + where 4 = func(3) test.py:5: AssertionError =========================== 1 failed in 0.07 seconds =========================== Sometimes the output from the test suite will have ``xfail`` meaning a test has passed although it has been marked as ``@pytest.mark.xfail``), or ``skipped`` meaning a test that has been skipped due to not meeting some condition (online and figure tests are the most common). You need to use the option ``-rs`` for skipped tests and ``-rx`` for xfailed tests, respectively. Or use ``-rxs`` for detailed information on both skipped and xfailed tests. Where to put tests ------------------ Each package should include a suite of unit tests, covering as many of the public methods/functions as possible. These tests should be included inside each package, e.g:: sunpy/map/tests/ "tests" directories should contain an ``__init__.py`` file so that the tests can be imported. Online Tests ------------ There are some tests for functions and methods in sunpy that require a working connection to the internet. ``pytest`` is configured in a way that it iterates over all tests that have been marked as ``pytest.mark.remote_data`` and checks if there is an established connection to the internet. If there is none, the test is skipped, otherwise it is run. Marking tests is pretty straightforward, use the decorator ``@pytest.mark.remote_data`` to mark a test function as needing an internet connection:: @pytest.mark.remote_data def func(x): """Add one to the argument.""" return x + 1 Tests that create files ----------------------- Tests may often be run from directories where users do not have write permissions so tests which create files should always do so in temporary directories. This can be done with the `pytest tmpdir function argument `_ or with Python's built-in `tempfile module `_. Tests that use test data ------------------------ We store test data in "sunpy/data/test" as long as it is less than about 100 kB. These data should always be accessed via the :func:`sunpy.data.test.get_test_filepath` and :func:`sunpy.data.test.get_test_data_filenames` functions. This way you can use them when you create a test. You can also use our sample data but this will have to be marked as an online test (see above):: import sunpy.data.sample @pytest.mark.remote_data def func(): """Returns the file path for the sample data.""" return sunpy.data.sample.AIA_131_IMAGE Generally we do not run the tests on our sample data, so only do this if you have a valid reason. Figure unit tests ----------------- .. note:: The figure tests and the hashes they use are only checked on Linux and might be different on other platforms. We should suggest if you do not use a Linux, to add a fake hash to the json files and then CircleCi (ran on a PR) will tell you the real hash to use. You can write sunpy unit tests that test the generation of Matplotlib figures by adding the decorator ``sunpy.tests.helpers.figure_test``. Here is a simple example:: import matplotlib.pyplot as plt from sunpy.tests.helpers import figure_test @figure_test def test_simple_plot(): plt.plot([0,1]) The current figure at the end of the unit test, or an explicitly returned figure, has its hash (currently ``SHA256``) compared against an established hash collection (more on this below). If the hashes do not match, the figure has changed, and thus the test is considered to have failed. If you are adding a new figure test you will need to generate a new hash library:: $ tox -e py311-figure -- --mpl-generate-hash-library=sunpy/tests/figure_hashes_mpl_332_ft_261_astropy_42.json The filename changes if the version of astropy or Matplotlib or freetype gets updated. So you might need to adjust this command. For the development figure tests:: $ tox -e py311-figure-devdeps -- --mpl-generate-hash-library=sunpy/tests/figure_hashes_mpl_dev_ft_261_astropy_dev.json This will run the figure test suite and update the hashes stored. If you want to check what the images look like, you can do:: $ tox -e py311-figure -- --mpl-generate-path=baseline The images output from the tests will be stored in a folder called ``.tmp/py311-figure/baseline`` or ``baseline`` in the sunpy folder, so you can double check the test works as you expected. .. _doctests: doctests -------- Code examples in the documentation will also be run as tests and this helps to validate that the documentation is accurate and up to date. sunpy uses the same system as Astropy, so for information on writing doctests see the astropy `documentation `_. You do not have to do anything extra in order to run any documentation tests. Within our ``setup.cfg`` file we have set default options for ``pytest``, such that you only need to run:: $ pytest to run any documentation test. Bugs discovered --------------- In addition to writing unit tests new functionality, it is also a good practice to write a unit test each time a bug is found, and submit the unit test along with the fix for the problem. This way we can ensure that the bug does not re-emerge at a later time. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/contents/units_quantities.rst0000644000175100001770000000767614550400520023176 0ustar00runnerdocker.. doctest-skip-all .. _units_in_code: *************************** Use of quantities and units *************************** Much code perform calculations using physical quantities. SunPy uses astropy's `quantities and units `_ implementation to store, express and convert physical quantities. New classes and functions should adhere to the SunPy project's `quantity and unit usage guidelines `_. This document sets out SunPy's reasons and requirements for the usage of quantities and units. Briefly, SunPy's `policy `_ is that *all user-facing function/object arguments which accept physical quantities as input **MUST** accept astropy quantities, and **ONLY** astropy quantities*. Developers should consult the `Astropy Quantities and Units page `_ for the latest updates on using quantities and units. The `astropy tutorial on quantities and units `_ also provides useful examples on their capabilities. Astropy provides the decorator `~astropy.units.quantity_input` that checks the units of the input arguments to a function against the expected units of the argument. We recommend using this decorator to perform function argument unit checks. The decorator ensures that the units of the input to the function are convertible to that specified by the decorator, for example :: >>> import astropy.units as u >>> @u.quantity_input ... def myfunction(myangle: u.arcsec): ... return myangle**2 This function only accepts arguments that are convertible to arcseconds. Therefore:: >>> myfunction(20 * u.degree) returns the expected answer but:: >>> myfunction(20 * u.km) Traceback (most recent call last): ... astropy.units.core.UnitsError: Argument 'myangle' to function 'myfunction' must be in units convertible to 'arcsec'. raises an error. The following is an example of a use-facing function that returns the area of a square, in units that are the square of the input length unit:: >>> @u.quantity_input ... def get_area_of_square(side_length: u.m): ... """ ... Compute the area of a square. ... ... Parameters ... ---------- ... side_length : `~astropy.units.quantity.Quantity` ... Side length of the square ... ... Returns ... ------- ... area : `~astropy.units.quantity.Quantity` ... Area of the square. ... """ ... ... return (side_length ** 2) This more advanced example shows how a private function that does not accept quantities can be wrapped by a function that does:: >>> @u.quantity_input ... def some_function(length: u.m): ... """ ... Does something useful. ... ... Parameters ... ---------- ... length : `~astropy.units.quantity.Quantity` ... A length. ... ... Returns ... ------- ... length : `~astropy.units.quantity.Quantity` ... Another length ... """ ... ... # the following function either ... # a] does not accept Quantities ... # b] is slow if using Quantities ... result = _private_wrapper_function(length.convert('meters').value) ... ... # now convert back to a quantity ... result = Quantity(result_meters, units_of_the_private_wrapper_function) ... ... return result In this example, the non-user facing function ``_private_wrapper_function`` requires a numerical input in units of meters, and returns a numerical output. The developer knows that the result of ``_private_wrapper_function`` is in the units ``units_of_the_private_wrapper_function``, and sets the result of ``some_function`` to return the answer in those units. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/dev_guide/index.rst0000644000175100001770000000307514550400520017025 0ustar00runnerdocker.. _dev_guide: {% if not is_development %} .. _newcomers: .. _remote_data: {% endif %} ***************** Developer's Guide ***************** {% if is_development %} This section contains the various guidelines to be followed by anyone working on sunpy. .. grid:: 1 2 2 2 :gutter: 3 .. grid-item-card:: :class-card: card Getting started ^^^^^^^^^^^^^^^ .. toctree:: :maxdepth: 3 contents/newcomers contents/pr_checklist contents/conda_for_dependencies .. grid-item-card:: :class-card: card Conventions ^^^^^^^^^^^ .. toctree:: :maxdepth: 1 contents/code_standards contents/tests contents/documentation contents/example_gallery contents/pr_review_procedure contents/units_quantities .. grid-item-card:: :class-card: card Repo management ^^^^^^^^^^^^^^^ .. toctree:: :maxdepth: 1 contents/maintainer_workflow contents/dependencies contents/ci_jobs contents/backports contents/funding .. grid-item-card:: :class-card: card Extending sunpy ^^^^^^^^^^^^^^^ .. toctree:: :maxdepth: 1 contents/public_api contents/logger contents/remote_data_manager {%else%} Please go `here `__ for our up to date developer's guide. {%endif%} ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1705116001.8794935 sunpy-5.1.1/docs/how_to/0000755000175100001770000000000014550400542014527 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/how_to/coord_components.rst0000644000175100001770000000433114550400520020631 0ustar00runnerdocker.. _sunpy-how-to-access-coordinate-components: **************************** Access coordinate components **************************** Individual coordinates can be accessed via attributes on the `~astropy.coordinates.SkyCoord` object, but the names of the components of the coordinates can depend on the the frame and the chosen representation (e.g., Cartesian versus spherical). `~sunpy.coordinates.Helioprojective` ==================================== For the helioprojective frame, the theta_x and theta_y components are accessed ``Tx`` and ``Ty``, respectively: .. code-block:: python >>> from astropy.coordinates import SkyCoord >>> import astropy.units as u >>> from sunpy.coordinates import frames >>> c = SkyCoord(-500*u.arcsec, 100*u.arcsec, frame=frames.Helioprojective) >>> c.Tx >>> c.Ty `~sunpy.coordinates.Heliocentric` ================================= Heliocentric is typically used with Cartesian components: .. code-block:: python >>> c = SkyCoord(-72241.0*u.km, 361206.1*u.km, 589951.4*u.km, frame=frames.Heliocentric) >>> c.x >>> c.y >>> c.z `~sunpy.coordinates.HeliographicStonyhurst` and `~sunpy.coordinates.HeliographicCarrington` =========================================================================================== Both of the heliographic frames have the components of latitude, longitude and radius: .. code-block:: python >>> c = SkyCoord(70*u.deg, -30*u.deg, 1*u.AU, frame=frames.HeliographicStonyhurst) >>> c.lat >>> c.lon >>> c.radius Heliographic Stonyhurst, when used with Cartesian components, is known as Heliocentric Earth Equatorial (HEEQ). Here's an example of how to use `~sunpy.coordinates.frames.HeliographicStonyhurst` for HEEQ coordinates: .. code-block:: python >>> c = SkyCoord(-72241.0*u.km, 361206.1*u.km, 589951.4*u.km, ... representation_type='cartesian', frame=frames.HeliographicStonyhurst) >>> c.x >>> c.y >>> c.z ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/how_to/create_a_map.rst0000644000175100001770000000657714550400520017674 0ustar00runnerdocker.. _sunpy-how-to-create-a-map: ************************* How to create a sunpy Map ************************* One of the primary goals of the Map interface is to make it as easy as possible to create a Map. As such, you can pass many different kinds of inputs to Map. These are listed below. File name ========= If you have a FITS file, this is the easiest and recommended way to create a Map. This can be either a string or a `~pathlib.Path`. .. code-block:: python >>> import pathlib >>> import sunpy.map >>> import sunpy.data.sample >>> my_map = sunpy.map.Map(sunpy.data.sample.AIA_171_IMAGE) # doctest: +REMOTE_DATA >>> my_map = sunpy.map.Map('file.fits') # doctest: +SKIP >>> my_map = sunpy.map.Map(pathlib.Path('file.fits')) # doctest: +SKIP >>> sub_dir = pathlib.Path('local_dir/sub_dir') >>> my_map = sunpy.map.Map(sub_dir / 'another_file.fits') # doctest: +SKIP Directory containing FITS files =============================== If there is more than one FITS file in the directory, this will return a list of Map objects. .. code-block:: python >>> my_maps = sunpy.map.Map('local_dir/sub_dir') # doctest: +SKIP >>> my_maps = sunpy.map.Map(sub_dir) # doctest: +SKIP Array and `astropy.io.fits.Header` ================================== If needed, this way can be used to modify the header before passing it to `~sunpy.map.Map`. .. code-block:: python >>> import astropy.io.fits >>> with astropy.io.fits.open(sunpy.data.sample.AIA_171_IMAGE) as hdul: ... data = hdul[1].data ... header = hdul[1].header # doctest: +REMOTE_DATA >>> my_map = sunpy.map.Map(data, header) # doctest: +REMOTE_DATA These data header pairs can also be passed as a `tuple`, .. code-block:: python >>> my_map = sunpy.map.Map((data, header)) # doctest: +REMOTE_DATA Data array and a `~sunpy.util.metadata.MetaDict` object ======================================================= This includes any base class of `~sunpy.util.metadata.MetaDict`, including `dict` or `collections.OrderedDict`. .. code-block:: python >>> import sunpy.util.metadata >>> meta = sunpy.util.metadata.MetaDict(header) # doctest: +REMOTE_DATA >>> my_map = sunpy.map.Map(data, meta) # doctest: +REMOTE_DATA Data array and an `astropy.wcs.WCS` object ========================================== .. code-block:: python >>> import astropy.wcs >>> wcs = astropy.wcs.WCS(header=header) # doctest: +REMOTE_DATA +IGNORE_WARNINGS >>> my_map = sunpy.map.Map(data, wcs) # doctest: +REMOTE_DATA Glob patterns ============= If the glob pattern matches more than one FITS file, this will return a list of Map objects. .. code-block:: python >>> my_map = sunpy.map.Map('eit_*.fits') # doctest: +SKIP URL === .. code-block:: python >>> sample_data_url = 'http://data.sunpy.org/sunpy/v1/AIA20110607_063302_0171_lowres.fits' >>> my_map = sunpy.map.Map(sample_data_url) # doctest: +REMOTE_DATA Combinations of any of the above ================================ These can either be in a list or as separate arguments. As with the case of a directory or glob pattern, this will return multiple Map objects. .. code-block:: python >>> my_map = sunpy.map.Map(['file1.fits', 'file2.fits', 'file3.fits', 'directory1/']) # doctest: +SKIP >>> my_map = sunpy.map.Map((data, header), data, meta, 'file1.fits', sample_data_url, 'eit_*.fits') # doctest: +SKIP ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/how_to/create_coords.rst0000644000175100001770000000413114550400520020070 0ustar00runnerdocker.. _sunpy-how-to-create-coordinate-objects: ************************* Create Coordinate Objects ************************* The easiest interface to work with coordinates is through the `~astropy.coordinates.SkyCoord` class: .. code-block:: python >>> import astropy.units as u >>> from astropy.coordinates import SkyCoord >>> from sunpy.coordinates import frames >>> coord = SkyCoord(-100*u.arcsec, 500*u.arcsec, frame=frames.Helioprojective) >>> coord = SkyCoord(x=-72241.0*u.km, y=361206.1*u.km, z=589951.4*u.km, frame=frames.Heliocentric) >>> coord = SkyCoord(70*u.deg, -30*u.deg, frame=frames.HeliographicStonyhurst) >>> coord It is also possible to use strings to specify the frame but in that case make sure to explicitly import `sunpy.coordinates` as it registers sunpy's coordinate frames the Astropy coordinates framework: .. code-block:: python >>> import sunpy.coordinates >>> coord = SkyCoord(-100*u.arcsec, 500*u.arcsec, frame='helioprojective', observer='earth') >>> coord `~astropy.coordinates.SkyCoord` and all coordinate frames support array coordinates. These work the same as single-value coordinates, but they store multiple coordinates in a single object. When you're going to apply the same operation to many different coordinates, this is a better choice than a list of `~astropy.coordinates.SkyCoord` objects, because it will be *much* faster than applying the operation to each `~astropy.coordinates.SkyCoord` in a ``for`` loop: .. code-block:: python >>> coord = SkyCoord([-500, 400]*u.arcsec, [100, 200]*u.arcsec, frame=frames.Helioprojective) >>> coord >>> coord[0] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/how_to/create_custom_map.rst0000644000175100001770000002445114550400520020755 0ustar00runnerdocker.. _sunpy-how-to-custom-maps: ************************** Create Custom Maps by Hand ************************** It is possible to create Maps using custom data, e.g., from a simulation or an observation from a data source that is not explicitly supported by ``sunpy``. To do this, you need to provide `sunpy.map.Map` with both the data array as well as appropriate metadata. The metadata informs `sunpy.map.Map` of the correct coordinate information associated with the data array and should be provided to `sunpy.map.Map` in the form of a header as a `dict` or `~sunpy.util.MetaDict`. See this :ref:`sphx_glr_generated_gallery_map_map_from_numpy_array.py` for a brief demonstration of generating a Map from a data array. The keys required for the header information follow the `FITS standard `__. sunpy provides a Map header helper function to assist the user in creating a header that contains the correct meta information needed to create a Map. The utility function :func:`~sunpy.map.header_helper.make_fitswcs_header` will return a header with the appropriate FITS keywords once the Map data array and an `astropy.coordinates.SkyCoord` or `sunpy.coordinates.frames` is provided. All the metadata keywords that a Map will parse along with their description are listed in the :ref:`Meta Keywords Table` at the end of this page. :func:`~sunpy.map.header_helper.make_fitswcs_header` also takes optional keyword arguments including ``reference_pixel`` and ``scale`` that describe the pixel coordinate at the reference coordinate (defined by the `~astropy.coordinates.SkyCoord`) and the spatial scale of the pixels, respectively. Here's an example of creating a header from some generic data and an `astropy.coordinates.SkyCoord`: .. code-block:: python >>> import numpy as np >>> from astropy.coordinates import SkyCoord >>> import astropy.units as u >>> from sunpy.coordinates import frames >>> from sunpy.map.header_helper import make_fitswcs_header >>> data = np.arange(0, 100).reshape(10, 10) >>> reference_coord = SkyCoord(0*u.arcsec, 0*u.arcsec, obstime = '2013-10-28', observer = 'earth', frame = frames.Helioprojective) >>> header = make_fitswcs_header(data, reference_coord) >>> for key, value in header.items(): ... print(f"{key}: {value}") wcsaxes: 2 crpix1: 5.5 crpix2: 5.5 cdelt1: 1.0 cdelt2: 1.0 cunit1: arcsec cunit2: arcsec ctype1: HPLN-TAN ctype2: HPLT-TAN crval1: 0.0 crval2: 0.0 lonpole: 180.0 latpole: 0.0 mjdref: 0.0 date-obs: 2013-10-28T00:00:00.000 rsun_ref: 695700000.0 dsun_obs: 148644585949.49 hgln_obs: 0.0 hglt_obs: 4.7711570596394 naxis: 2 naxis1: 10 naxis2: 10 pc1_1: 1.0 pc1_2: -0.0 pc2_1: 0.0 pc2_2: 1.0 rsun_obs: 965.3829548285768 From this we can see now that the function returned a `sunpy.util.MetaDict` that populated the standard FITS keywords with information provided by the passed `astropy.coordinates.SkyCoord`, and the data array. Since the ``reference_pixel`` and ``scale`` keywords were not passed in the example above, the values of the "CRPIXn" and "CDELTn" keys were set to the center of the data array and 1, respectively, by default. These keywords can be passed to the function in the form of an `astropy.units.Quantity` with associated units. Here's another example of passing ``reference_pixel`` and ``scale`` to the function: .. code-block:: python >>> reference_pixel = u.Quantity([5, 5], u.pixel) >>> scale = u.Quantity([2, 2], u.arcsec/u.pixel) >>> header = make_fitswcs_header(data, reference_coord, reference_pixel=reference_pixel, scale=scale) >>> for key, value in header.items(): ... print(f"{key}: {value}") wcsaxes: 2 crpix1: 6.0 crpix2: 6.0 cdelt1: 2.0 cdelt2: 2.0 cunit1: arcsec cunit2: arcsec ctype1: HPLN-TAN ctype2: HPLT-TAN crval1: 0.0 crval2: 0.0 lonpole: 180.0 latpole: 0.0 mjdref: 0.0 date-obs: 2013-10-28T00:00:00.000 rsun_ref: 695700000.0 dsun_obs: 148644585949.49 hgln_obs: 0.0 hglt_obs: 4.7711570596394 naxis: 2 naxis1: 10 naxis2: 10 pc1_1: 1.0 pc1_2: -0.0 pc2_1: 0.0 pc2_2: 1.0 rsun_obs: 965.3829548285768 As we can see, a list of WCS and observer meta information is contained within the generated headers, however we may want to include other meta information including the observatory name, the wavelength and wavelength unit of the observation. Any of the keywords in the dictionary returned by :func:`~sunpy.map.header_helper.meta_keywords` can be passed to the :func:`~sunpy.map.header_helper.make_fitswcs_header` and will then populate the returned MetaDict header. Furthermore, the following observation keywords can be passed to the `~sunpy.map.header_helper.make_fitswcs_header` function: ``observatory``, ``instrument``, ``telescope``, ``wavelength``, ``exposure``. An example of creating a header with these additional keywords: .. code-block:: python >>> header = make_fitswcs_header(data, reference_coord, reference_pixel=reference_pixel, scale=scale, ... telescope='Test case', ... instrument='UV detector', ... wavelength=1000*u.angstrom) >>> for key, value in header.items(): ... print(f"{key}: {value}") wcsaxes: 2 crpix1: 6.0 crpix2: 6.0 cdelt1: 2.0 cdelt2: 2.0 cunit1: arcsec cunit2: arcsec ctype1: HPLN-TAN ctype2: HPLT-TAN crval1: 0.0 crval2: 0.0 lonpole: 180.0 latpole: 0.0 mjdref: 0.0 date-obs: 2013-10-28T00:00:00.000 rsun_ref: 695700000.0 dsun_obs: 148644585949.49 hgln_obs: 0.0 hglt_obs: 4.7711570596394 instrume: UV detector telescop: Test case wavelnth: 1000.0 waveunit: Angstrom naxis: 2 naxis1: 10 naxis2: 10 pc1_1: 1.0 pc1_2: -0.0 pc2_1: 0.0 pc2_2: 1.0 rsun_obs: 965.3829548285768 From these header MetaDict's that are generated, we can now create a custom map: .. code-block:: python >>> import sunpy.map >>> my_map = sunpy.map.Map(data, header) >>> my_map SunPy Map --------- Observatory: Test case Instrument: UV detector Detector: Measurement: 1000.0 Angstrom Wavelength: 1000.0 Angstrom Observation Date: 2013-10-28 00:00:00 Exposure Time: Unknown Dimension: [10. 10.] pix Coordinate System: helioprojective Scale: [2. 2.] arcsec / pix Reference Pixel: [5. 5.] pix Reference Coord: [0. 0.] arcsec array([[ 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]]) .. _Meta Keywords Table: .. list-table:: Meta Keywords :widths: 7 30 :header-rows: 1 * - Keyword - Description * - cunit1 - Units of the coordinate increments along naxis1 e.g. arcsec (required) * - cunit2 - Units of the coordinate increments along naxis2 e.g. arcsec (required) * - crval1 - Coordinate value at reference point on naxis1 (required) * - crval2 - Coordinate value at reference point on naxis2 (required) * - cdelt1 - Spatial scale of pixels for naxis1, i.e. coordinate increment at reference point * - cdelt2 - Spatial scale of pixels for naxis2, i.e. coordinate increment at reference point * - crpix1 - Pixel coordinate at reference point naxis1 * - crpix2 - Pixel coordinate at reference point naxis2 * - ctype1 - Coordinate type projection along naxis1 of data e.g. HPLT-TAN * - ctype2 - Coordinate type projection along naxis2 of data e.g. HPLN-TAN * - hgln_obs - Heliographic longitude of observation * - hglt_obs - Heliographic latitude of observation * - dsun_obs - distance to Sun from observation in metres * - rsun_obs - radius of Sun in meters from observation * - dateobs - date of observation e.g. 2013-10-28 00:00 * - date_obs - date of observation e.g. 2013-10-28 00:00 * - rsun_ref - reference radius of Sun in meters * - solar_r - radius of Sun in meters from observation * - radius - radius of Sun in meters from observation * - crln_obs - Carrington longitude of observation * - crlt_obs - Heliographic latitude of observation * - solar_b0 - Solar B0 angle * - detector - name of detector e.g. AIA * - exptime - exposure time of observation, in seconds e.g 2 * - instrume - name of instrument * - wavelnth - wavelength of observation * - waveunit - unit for which observation is taken e.g. angstom * - obsrvtry - name of observatory of observation * - telescop - name of telescope of observation * - lvl_num - FITS processing level * - crota2 - Rotation of the horizontal and vertical axes in degrees * - PC1_1 - Matrix element PCi_j describing the rotation required to align solar North with the top of the image. * - PC1_2 - Matrix element PCi_j describing the rotation required to align solar North with the top of the image. * - PC2_1 - Matrix element PCi_j describing the rotation required to align solar North with the top of the image. * - PC2_2 - Matrix element PCi_j describing the rotation required to align solar North with the top of the image. * - CD1_1 - Matrix element CDi_j describing the rotation required to align solar North with the top of the image. * - CD1_2 - Matrix element CDi_j describing the rotation required to align solar North with the top of the image. * - CD2_1 - Matrix element CDi_j describing the rotation required to align solar North with the top of the image. * - CD2_2 - Matrix element CDi_j describing the rotation required to align solar North with the top of the image. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/how_to/create_custom_timeseries.rst0000644000175100001770000000741514550400520022352 0ustar00runnerdocker.. _sunpy-how-to-custom-timeseries: ************************ Create Custom TimeSeries ************************ Sometimes you will have data that you want to transform into a TimeSeries. You can use the factory to create a `~sunpy.timeseries.GenericTimeSeries` from a variety of data sources currently including `pandas.DataFrame` and `astropy.table.Table`. Creating a TimeSeries from a Pandas DataFrame ============================================= A TimeSeries object must be supplied with some data when it is created. The data can either be in your current Python session, in a local file, or in a remote file. Let's create some data and pass it into a TimeSeries object: .. code-block:: python >>> import numpy as np >>> intensity = np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24*60)))) This creates a basic numpy array of values representing a sine wave. We can use this array along with a suitable time storing object (such as Astropy `~astropy.time` or a list of `datetime` objects) to make a Pandas `~pandas.DataFrame`. A suitable list of times must contain the same number of values as the data, this can be created using: .. code-block:: python >>> import datetime >>> base = datetime.datetime.today() >>> times = [base - datetime.timedelta(minutes=x) for x in range(24*60, 0, -1)] The Pandas `~pandas.DataFrame` will use the dates list as the index: .. code-block:: python >>> from pandas import DataFrame >>> data = DataFrame(intensity, index=times, columns=['intensity']) This `~pandas.DataFrame` can then be used to construct a TimeSeries: .. code-block:: python >>> import astropy.units as u >>> import sunpy.timeseries as ts >>> header = {'key': 'value'} >>> units = {'intensity': u.W/u.m**2} >>> ts_custom = ts.TimeSeries(data, header, units) Creating Custom TimeSeries from an Astropy Table ================================================ A Pandas `~pandas.DataFrame` is the underlying object used to store the data within a TimeSeries, so the above example is the most lightweight to create a custom TimeSeries, but being scientific data it will often be more convenient to use an Astropy `~astropy.table.Table` to create a TimeSeries. An advantage of this method is it allows you to include metadata and Astropy `~astropy.units.quantity.Quantity` values, which are both supported in tables, without additional arguments. For example: .. code-block:: python >>> from astropy.time import Time >>> from astropy.table import Table >>> base = datetime.datetime.today() >>> times = [base - datetime.timedelta(minutes=x) for x in range(24*60, 0, -1)] >>> intensity = u.Quantity(np.sin(np.arange(0, 12 * np.pi, ((12 * np.pi) / (24*60)))), u.W/u.m**2) >>> tbl_meta = {'t_key':'t_value'} >>> table = Table([times, intensity], names=['time', 'intensity'], meta=tbl_meta) >>> table.add_index('time') >>> ts_table = ts.TimeSeries(table) Note that due to the properties of the `~astropy.time.Time` object, this will be a mixin column which since it is a single object, limits the versatility of the `~astropy.table.Table` a little. For more on mixin columns see the `Astropy docs `__. The units will be taken from the table quantities for each column, the metadata will simply be the ``table.meta`` dictionary. You can also explicitly add metadata and units, these will be added to the relevant dictionaries using the dictionary update method, with the explicit user-given values taking precedence: .. code-block:: python >>> from collections import OrderedDict >>> from sunpy.util.metadata import MetaDict >>> meta = MetaDict({'key':'value'}) >>> units = OrderedDict([('intensity', u.W/u.m**2)]) >>> ts_table = ts.TimeSeries(table, meta, units) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/how_to/index.rst0000644000175100001770000000573414550400520016375 0ustar00runnerdocker.. _sunpy-how-to-index: ************* How-To Guides ************* These how-to guides provide examples of how to perform specific tasks with sunpy. They are recipes that do not provide much in-depth explanation and assume you have some knowledge of what sunpy is and how it works. If you're starting fresh you might want to check out the :ref:`sunpy-tutorial-index` first. .. toctree:: :maxdepth: 1 coord_components create_a_map create_coords create_custom_map create_custom_timeseries parse_time remote_data_manager search_multiple_wavelengths search_vso transform_coords **Quick Reference** The following table is meant as a quick reference. For more complete code examples, see the how-to guides above. .. list-table:: :widths: auto :header-rows: 1 * - How do I... - Solution * - create a map from a FITS file - `my_map = Map('file.fits') ` * - save a map to a FITS file - `my_map.save('another_file.fits') ` * - get a quicklook summary of a map - `my_map.quicklook() `, `my_map.peek() ` * - plot a map - `my_map.plot() ` * - access the underlying data array of a map - `my_map.data ` * - access the map metadata - `my_map.meta ` * - make a copy of the map data array - `my_map.data.copy() ` * - make a copy of the whole map - `copy.deepcopy(my_map) ` * - access the observer location - `my_map.observer_coordinate ` * - remove the roll angle - `my_map.rotate() ` * - plot the solar limb - `my_map.draw_limb() ` * - overlay a heliographic grid - `my_map.draw_grid() ` * - create a time series - `my_timeseries = TimeSeries('file.nc') ` * - plot a time series - `my_timeseries.plot() ` * - concatenate two time series together - `my_timeseries.concatenate(another_timeseries) ` * - convert a time series to a `pandas.DataFrame` - `my_timeseries.to_dataframe() ` * - convert a time series to an `astropy.table.Table` - `my_timeseries.to_table() ` * - parse the string representation of a timestamp - :func:`~sunpy.time.parse_time` * - calculate the Carrington rotation number at a given time - :func:`~sunpy.coordinates.sun.carrington_rotation_number` * - calculate the time corresponding to a given Carrington rotation - :func:`~sunpy.coordinates.sun.carrington_rotation_time` * - see all of the available solar constants - :func:`sunpy.sun.constants.print_all` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1705115984.0 sunpy-5.1.1/docs/how_to/parse_time.rst0000644000175100001770000001107314550400520017407 0ustar00runnerdocker.. _sunpy-how-to-parse-times-with-parse-time: ***************************************** Parse times with `~sunpy.time.parse_time` ***************************************** .. code-block:: python >>> import time >>> from datetime import date, datetime >>> import numpy as np >>> import pandas >>> from sunpy.time import parse_time The following examples show how to use `sunpy.time.parse_time` to parse various time formats, including both strings and objects, into an `astropy.time.Time` object. Strings ======= .. code-block:: python >>> parse_time('1995-12-31 23:59:60')